From b03b6c8197648e7d3368971b5a0624c410cf05f1 Mon Sep 17 00:00:00 2001 From: nawrhehe Date: Thu, 15 Oct 2026 18:07:10 +0200 Subject: [PATCH] premier push --- QualcommWireless.xcodeproj/project.pbxproj | 348 + .../contents.xcworkspacedata | 7 + QualcommWireless/Firmware_WCN7850.h | 21653 ++++++++++++++++ QualcommWireless/Firmware_WCN7850_Wifi.h | 36 + QualcommWireless/Firmware_WCN7850_Wifi.s | 18 + QualcommWireless/Info.plist | 84 + QualcommWireless/QualcommWifi.cpp | 918 + QualcommWireless/QualcommWifi.hpp | 255 + QualcommWireless/QualcommWireless.cpp | 375 + QualcommWireless/QualcommWireless.hpp | 51 + .../include/IOKit/80211/Apple80211.h | 23 + .../include/IOKit/80211/IO80211Controller.h | 358 + .../include/IOKit/80211/IO80211Interface.h | 144 + .../include/IOKit/80211/IO80211P2PInterface.h | 87 + .../IOKit/80211/IO80211SkywalkInterface.h | 27 + .../IOKit/80211/IO80211VirtualInterface.h | 101 + .../80211/IO80211VirtualInterfaceNamer.h | 64 + .../include/IOKit/80211/IO80211WorkLoop.h | 37 + .../IOKit/80211/IOSkywalkEthernetInterface.h | 13 + .../include/IOKit/80211/apple80211_ioctl.h | 850 + .../include/IOKit/80211/apple80211_var.h | 645 + .../include/IOKit/80211/apple80211_wps.h | 537 + .../include/IOKit/80211/apple_private_spi.h | 74 + QualcommWireless/include/IOKit/80211/debug.h | 283 + QualcommWireless/include/IOKit/IOBSD.h | 44 + .../include/IOKit/IOBufferMemoryDescriptor.h | 314 + QualcommWireless/include/IOKit/IOCatalogue.h | 236 + QualcommWireless/include/IOKit/IOCommand.h | 83 + .../include/IOKit/IOCommandGate.h | 254 + .../include/IOKit/IOCommandPool.h | 230 + .../include/IOKit/IOConditionLock.h | 71 + QualcommWireless/include/IOKit/IODMACommand.h | 649 + .../include/IOKit/IODMAController.h | 72 + .../include/IOKit/IODMAEventSource.h | 93 + QualcommWireless/include/IOKit/IODataQueue.h | 158 + .../include/IOKit/IODataQueueShared.h | 91 + .../include/IOKit/IODeviceMemory.h | 98 + .../include/IOKit/IODeviceTreeSupport.h | 134 + .../include/IOKit/IOEventSource.h | 285 + .../IOKit/IOFilterInterruptEventSource.h | 189 + .../IOKit/IOInterleavedMemoryDescriptor.h | 122 + .../include/IOKit/IOInterruptController.h | 165 + .../include/IOKit/IOInterruptEventSource.h | 260 + QualcommWireless/include/IOKit/IOInterrupts.h | 60 + .../include/IOKit/IOKernelReportStructs.h | 90 + QualcommWireless/include/IOKit/IOKitDebug.h | 227 + .../IOKit/IOKitDiagnosticsUserClient.h | 17 + QualcommWireless/include/IOKit/IOKitKeys.h | 220 + QualcommWireless/include/IOKit/IOKitServer.h | 118 + QualcommWireless/include/IOKit/IOLib.h | 450 + QualcommWireless/include/IOKit/IOLocks.h | 440 + QualcommWireless/include/IOKit/IOMapper.h | 148 + .../include/IOKit/IOMemoryCursor.h | 383 + .../include/IOKit/IOMemoryDescriptor.h | 1036 + QualcommWireless/include/IOKit/IOMessage.h | 220 + .../include/IOKit/IOMultiMemoryDescriptor.h | 135 + QualcommWireless/include/IOKit/IONVRAM.h | 188 + QualcommWireless/include/IOKit/IONotifier.h | 71 + .../include/IOKit/IOPlatformExpert.h | 428 + QualcommWireless/include/IOKit/IORPC.h | 148 + .../include/IOKit/IORangeAllocator.h | 170 + .../include/IOKit/IORegistryEntry.h | 955 + QualcommWireless/include/IOKit/IOReportHub.h | 54 + .../include/IOKit/IOReportMacros.h | 705 + .../include/IOKit/IOReportTypes.h | 411 + .../include/IOKit/IOReportUserClient.h | 79 + QualcommWireless/include/IOKit/IOReturn.h | 158 + .../include/IOKit/IOSMBusController.h | 211 + QualcommWireless/include/IOKit/IOService.h | 1907 ++ QualcommWireless/include/IOKit/IOServicePM.h | 42 + .../include/IOKit/IOSharedDataQueue.h | 160 + QualcommWireless/include/IOKit/IOSharedLock.h | 35 + .../include/IOKit/IOSubMemoryDescriptor.h | 123 + QualcommWireless/include/IOKit/IOTimeStamp.h | 210 + .../include/IOKit/IOTimerEventSource.h | 325 + QualcommWireless/include/IOKit/IOTypes.h | 250 + QualcommWireless/include/IOKit/IOUserClient.h | 440 + QualcommWireless/include/IOKit/IOUserServer.h | 99 + QualcommWireless/include/IOKit/IOWorkLoop.h | 361 + .../include/IOKit/OSMessageNotification.h | 162 + .../include/IOKit/acpi/IOACPIPlatformDevice.h | 254 + .../include/IOKit/acpi/IOACPIPlatformExpert.h | 178 + .../include/IOKit/acpi/IOACPITypes.h | 137 + QualcommWireless/include/IOKit/assert.h | 53 + .../include/IOKit/ata/ATADeviceNub.h | 164 + .../include/IOKit/ata/ATATimerEventSource.h | 127 + .../include/IOKit/ata/IOATABusCommand.h | 250 + .../include/IOKit/ata/IOATABusInfo.h | 219 + .../include/IOKit/ata/IOATACommand.h | 478 + .../include/IOKit/ata/IOATAController.h | 314 + .../include/IOKit/ata/IOATADevConfig.h | 239 + .../include/IOKit/ata/IOATADevice.h | 179 + .../include/IOKit/ata/IOATARegI386.h | 76 + .../include/IOKit/ata/IOATATypes.h | 393 + QualcommWireless/include/IOKit/ata/IOPCIATA.h | 200 + .../include/IOKit/audio/BigNum128.h | 154 + .../IOKit/audio/IOAudioBlitterLibDispatch.h | 235 + .../include/IOKit/audio/IOAudioControl.h | 600 + .../IOKit/audio/IOAudioControlUserClient.h | 91 + .../include/IOKit/audio/IOAudioDebug.h | 85 + .../include/IOKit/audio/IOAudioDefines.h | 478 + .../include/IOKit/audio/IOAudioDevice.h | 771 + .../include/IOKit/audio/IOAudioEngine.h | 878 + .../IOKit/audio/IOAudioEngineUserClient.h | 287 + .../include/IOKit/audio/IOAudioLevelControl.h | 207 + .../include/IOKit/audio/IOAudioPort.h | 185 + .../IOKit/audio/IOAudioSelectorControl.h | 127 + .../include/IOKit/audio/IOAudioStream.h | 307 + .../IOKit/audio/IOAudioTimeIntervalFilter.h | 245 + .../IOKit/audio/IOAudioToggleControl.h | 123 + .../include/IOKit/audio/IOAudioTypes.h | 675 + .../include/IOKit/avc/IOFireWireAVCCommand.h | 94 + .../include/IOKit/avc/IOFireWireAVCConsts.h | 259 + .../IOKit/avc/IOFireWireAVCRequestSpace.h | 31 + .../IOKit/avc/IOFireWireAVCTargetSpace.h | 297 + .../include/IOKit/avc/IOFireWireAVCUnit.h | 408 + .../IOKit/avc/IOFireWireAVCUserClientCommon.h | 124 + .../include/IOKit/avc/IOFireWirePCRSpace.h | 202 + .../IOKit/battery/AppleSmartBatteryCommands.h | 149 + .../AppleCSRBluetoothHostController.h | 86 + .../include/IOKit/bluetooth/Bluetooth.h | 2955 +++ .../bluetooth/BluetoothAssignedNumbers.h | 897 + .../bluetooth/CSRBluetoothHostController.h | 88 + .../IOKit/bluetooth/IOBluetoothACPIMethods.h | 125 + .../IOKit/bluetooth/IOBluetoothDataQueue.h | 82 + .../bluetooth/IOBluetoothHCIController.h | 500 + .../IOKit/bluetooth/IOBluetoothHCIRequest.h | 176 + .../IOKit/bluetooth/IOBluetoothHIDDriver.h | 296 + .../bluetooth/IOBluetoothHIDDriverTypes.h | 95 + .../bluetooth/IOBluetoothHostController.h | 1089 + .../IOBluetoothInactivityTimerEventSource.h | 88 + .../IOKit/bluetooth/IOBluetoothInternal.h | 144 + .../IOKit/bluetooth/IOBluetoothMemoryBlock.h | 294 + .../bluetooth/IOBluetoothMemoryBlockQueue.h | 106 + .../IOKit/bluetooth/IOBluetoothObject.h | 156 + .../bluetooth/IOBluetoothTimerEventSource.h | 77 + .../IOKit/bluetooth/IOBluetoothTypes.h | 47 + .../IOKit/bluetooth/IOBluetoothWorkLoop.h | 124 + .../include/IOKit/bluetooth/IOWorkQueue.h | 159 + .../serial/IOBluetoothSerialClient.h | 263 + .../serial/IOBluetoothSerialManager.h | 138 + .../CSRBluetoothHostControllerUSBTransport.h | 72 + .../IOBluetoothHostControllerTransport.h | 341 + .../IOBluetoothHostControllerUARTTransport.h | 143 + .../IOBluetoothHostControllerUSBTransport.h | 287 + .../IOKit/firewire/IOConfigDirectory.h | 182 + .../include/IOKit/firewire/IOFWAddressSpace.h | 331 + .../IOKit/firewire/IOFWAsyncStreamListener.h | 132 + .../include/IOKit/firewire/IOFWCommand.h | 977 + .../include/IOKit/firewire/IOFWDCL.h | 343 + .../include/IOKit/firewire/IOFWDCLPool.h | 157 + .../include/IOKit/firewire/IOFWDCLProgram.h | 134 + .../IOKit/firewire/IOFWDCLTranslator.h | 114 + .../include/IOKit/firewire/IOFWIsochChannel.h | 132 + .../include/IOKit/firewire/IOFWIsochPort.h | 66 + .../IOKit/firewire/IOFWLocalIsochPort.h | 132 + .../IOKit/firewire/IOFWPHYPacketListener.h | 77 + .../IOKit/firewire/IOFWPhysicalAddressSpace.h | 263 + .../IOKit/firewire/IOFWPseudoAddressSpace.h | 370 + .../include/IOKit/firewire/IOFWRegs.h | 73 + ...IOFWSimpleContiguousPhysicalAddressSpace.h | 66 + .../firewire/IOFWSimplePhysicalAddressSpace.h | 70 + .../include/IOKit/firewire/IOFWSyncer.h | 54 + .../IOKit/firewire/IOFWUserObjectExporter.h | 95 + .../include/IOKit/firewire/IOFWUtils.h | 32 + .../include/IOKit/firewire/IOFireWireBus.h | 373 + .../IOKit/firewire/IOFireWireController.h | 1098 + .../include/IOKit/firewire/IOFireWireDevice.h | 289 + .../IOKit/firewire/IOFireWireFamilyCommon.h | 1232 + .../IOKit/firewire/IOFireWireIRMAllocation.h | 116 + .../IOKit/firewire/IOFireWireLocalNode.h | 140 + .../firewire/IOFireWireMultiIsochReceive.h | 137 + .../include/IOKit/firewire/IOFireWireNub.h | 293 + .../IOKit/firewire/IOFireWirePowerManager.h | 78 + .../include/IOKit/firewire/IOFireWireUnit.h | 167 + .../IOKit/firewire/IOLocalConfigDirectory.h | 110 + .../IOKit/firewire/IORemoteConfigDirectory.h | 92 + .../include/IOKit/graphics/GTrace.hpp | 392 + .../IOKit/graphics/IOAccelClientConnect.h | 47 + .../IOKit/graphics/IOAccelSurfaceConnect.h | 185 + .../include/IOKit/graphics/IOAccelTypes.h | 100 + .../include/IOKit/graphics/IOAccelerator.h | 43 + .../include/IOKit/graphics/IODisplay.h | 323 + .../include/IOKit/graphics/IOFramebuffer.h | 1024 + .../IOKit/graphics/IOFramebufferShared.h | 261 + .../include/IOKit/graphics/IOGraphicsDevice.h | 48 + .../include/IOKit/graphics/IOGraphicsEngine.h | 51 + .../IOKit/graphics/IOGraphicsInterfaceTypes.h | 301 + .../include/IOKit/graphics/IOGraphicsTypes.h | 1722 ++ .../include/IOKit/graphics/tl/_config | 38 + .../include/IOKit/graphics/tl/iolocks | 123 + .../include/IOKit/graphics/tl/osmemory | 538 + .../include/IOKit/graphics/tl/osutility | 74 + .../include/IOKit/hid/AppleHIDUsageTables.h | 268 + .../include/IOKit/hid/IOHIDDevice.h | 799 + .../include/IOKit/hid/IOHIDDeviceKeys.h | 228 + .../include/IOKit/hid/IOHIDDeviceTypes.h | 294 + .../include/IOKit/hid/IOHIDElement.h | 121 + .../include/IOKit/hid/IOHIDEvent.h | 464 + .../include/IOKit/hid/IOHIDEventDriver.h | 385 + .../include/IOKit/hid/IOHIDEventFieldDefs.h | 316 + .../include/IOKit/hid/IOHIDEventService.h | 980 + .../include/IOKit/hid/IOHIDEventServiceKeys.h | 132 + .../IOKit/hid/IOHIDEventServiceKeys_Private.h | 60 + .../IOKit/hid/IOHIDEventServiceTypes.h | 74 + .../include/IOKit/hid/IOHIDEventTypes.h | 723 + .../include/IOKit/hid/IOHIDInterface.h | 288 + .../include/IOKit/hid/IOHIDKeys.h | 375 + .../include/IOKit/hid/IOHIDPrivateKeys.h | 242 + .../include/IOKit/hid/IOHIDProperties.h | 98 + .../include/IOKit/hid/IOHIDUsageTables.h | 2591 ++ .../include/IOKit/hid/IOHIDUtility.h | 81 + .../IOKit/hidsystem/IOHIDDescriptorParser.h | 996 + .../include/IOKit/hidsystem/IOHIDParameter.h | 349 + .../include/IOKit/hidsystem/IOHIDShared.h | 291 + .../include/IOKit/hidsystem/IOHIDSystem.h | 615 + .../include/IOKit/hidsystem/IOHIDTypes.h | 182 + .../IOKit/hidsystem/IOHIDUsageTables.h | 2591 ++ .../include/IOKit/hidsystem/IOHIDWorkLoop.h | 22 + .../include/IOKit/hidsystem/IOHIDevice.h | 71 + .../include/IOKit/hidsystem/IOHIKeyboard.h | 273 + .../IOKit/hidsystem/IOHIKeyboardMapper.h | 247 + .../include/IOKit/hidsystem/IOHIPointing.h | 256 + .../include/IOKit/hidsystem/IOLLEvent.h | 586 + .../include/IOKit/hidsystem/ev_keymap.h | 171 + .../include/IOKit/i2c/IOI2CInterface.h | 262 + .../include/IOKit/ndrvsupport/IOMacOSTypes.h | 419 + .../include/IOKit/ndrvsupport/IOMacOSVideo.h | 1391 + .../IOKit/ndrvsupport/IONDRVFramebuffer.h | 360 + .../IOKit/ndrvsupport/IONDRVLibraries.h | 376 + .../include/IOKit/ndrvsupport/IONDRVSupport.h | 47 + .../IOKit/network/IOBasicOutputQueue.h | 354 + .../IOKit/network/IOEthernetController.h | 1226 + .../IOKit/network/IOEthernetInterface.h | 312 + .../include/IOKit/network/IOEthernetStats.h | 161 + .../IOKit/network/IOGatedOutputQueue.h | 178 + .../include/IOKit/network/IOKernelDebugger.h | 402 + .../IOKit/network/IOMbufMemoryCursor.h | 381 + .../IOKit/network/IONetworkController.h | 1716 ++ .../include/IOKit/network/IONetworkData.h | 477 + .../IOKit/network/IONetworkInterface.h | 1541 ++ .../include/IOKit/network/IONetworkMedium.h | 425 + .../include/IOKit/network/IONetworkStats.h | 89 + .../include/IOKit/network/IOOutputQueue.h | 280 + .../include/IOKit/network/IOPacketQueue.h | 290 + .../network/IOSkywalkEthernetInterface.h | 21 + .../include/IOKit/nvram/IONVRAMController.h | 49 + .../include/IOKit/pci/IOAGPDevice.h | 222 + .../include/IOKit/pci/IOPCIBridge.h | 526 + .../include/IOKit/pci/IOPCIDevice.h | 813 + .../IOKit/pci/IOPCIFamilyDefinitions.h | 243 + .../include/IOKit/platform/AppleMacIO.h | 79 + .../include/IOKit/platform/AppleMacIODevice.h | 60 + .../include/IOKit/platform/AppleNMI.h | 75 + .../IOKit/platform/ApplePlatformExpert.h | 91 + .../include/IOKit/power/IOPwrController.h | 39 + QualcommWireless/include/IOKit/pwr_mgt/IOPM.h | 963 + .../include/IOKit/pwr_mgt/IOPMLibDefs.h | 47 + .../include/IOKit/pwr_mgt/IOPMPowerSource.h | 303 + .../IOKit/pwr_mgt/IOPMPowerSourceList.h | 53 + .../include/IOKit/pwr_mgt/IOPMpowerState.h | 78 + .../include/IOKit/pwr_mgt/IOPowerConnection.h | 167 + .../include/IOKit/pwr_mgt/RootDomain.h | 353 + .../include/IOKit/rtc/IORTCController.h | 85 + .../IOFireWireSBP2LSIWorkaroundDescriptor.h | 292 + .../include/IOKit/sbp2/IOFireWireSBP2LUN.h | 270 + .../include/IOKit/sbp2/IOFireWireSBP2Login.h | 1078 + .../IOKit/sbp2/IOFireWireSBP2ManagementORB.h | 345 + .../include/IOKit/sbp2/IOFireWireSBP2ORB.h | 547 + .../include/IOKit/sbp2/IOFireWireSBP2Target.h | 224 + .../IOKit/sbp2/IOFireWireSBP2UserClient.h | 188 + .../sbp2/IOFireWireSBP2UserClientCommon.h | 79 + .../IOFireWireSerialBusProtocolTransport.h | 449 + .../include/IOKit/scsi/IOBDServices.h | 240 + .../IOKit/scsi/IOBlockStorageServices.h | 164 + .../IOKit/scsi/IOCompactDiscServices.h | 222 + .../include/IOKit/scsi/IODVDServices.h | 250 + .../IOKit/scsi/IOReducedBlockServices.h | 141 + .../IOKit/scsi/IOSCSIBlockCommandsDevice.h | 1594 ++ .../scsi/IOSCSIMultimediaCommandsDevice.h | 831 + .../IOKit/scsi/IOSCSIPeripheralDeviceNub.h | 228 + .../IOKit/scsi/IOSCSIPeripheralDeviceType00.h | 104 + .../IOKit/scsi/IOSCSIPeripheralDeviceType05.h | 75 + .../IOKit/scsi/IOSCSIPeripheralDeviceType07.h | 75 + .../IOKit/scsi/IOSCSIPeripheralDeviceType0E.h | 77 + .../IOKit/scsi/IOSCSIPrimaryCommandsDevice.h | 731 + .../IOKit/scsi/IOSCSIProtocolInterface.h | 922 + .../IOKit/scsi/IOSCSIProtocolServices.h | 784 + .../scsi/IOSCSIReducedBlockCommandsDevice.h | 1010 + .../IOKit/scsi/SCSICmds_INQUIRY_Definitions.h | 1232 + .../IOKit/scsi/SCSICmds_MODE_Definitions.h | 559 + .../scsi/SCSICmds_READ_CAPACITY_Definitions.h | 141 + .../scsi/SCSICmds_REPORT_LUNS_Definitions.h | 147 + .../IOKit/scsi/SCSICmds_REQUEST_SENSE_Defs.h | 234 + .../IOKit/scsi/SCSICommandDefinitions.h | 479 + .../IOKit/scsi/SCSICommandOperationCodes.h | 920 + .../include/IOKit/scsi/SCSIPort.h | 77 + .../include/IOKit/scsi/SCSITask.h | 465 + .../spi/IOSCSIParallelInterfaceController.h | 1617 ++ .../IOKit/serial/IOModemSerialStreamSync.h | 42 + .../IOKit/serial/IORS232SerialStreamSync.h | 172 + .../include/IOKit/serial/IOSerialDriverSync.h | 91 + .../include/IOKit/serial/IOSerialKeys.h | 80 + .../include/IOKit/serial/IOSerialStreamSync.h | 275 + .../skywalk/IOSkywalkCloneableNetworkPacket.h | 76 + .../IOKit/skywalk/IOSkywalkController.h | 59 + .../skywalk/IOSkywalkEthernetInterface.h | 95 + .../include/IOKit/skywalk/IOSkywalkFamily.h | 54 + .../IOKit/skywalk/IOSkywalkInterface.h | 81 + .../IOKit/skywalk/IOSkywalkMemorySegment.h | 88 + .../skywalk/IOSkywalkNetworkController.h | 44 + .../IOKit/skywalk/IOSkywalkNetworkInterface.h | 144 + .../IOKit/skywalk/IOSkywalkNetworkPacket.h | 83 + .../include/IOKit/skywalk/IOSkywalkPacket.h | 115 + .../IOKit/skywalk/IOSkywalkPacketBuffer.h | 116 + .../IOKit/skywalk/IOSkywalkPacketBufferPool.h | 172 + .../IOKit/skywalk/IOSkywalkPacketQueue.h | 117 + .../skywalk/IOSkywalkRxCompletionQueue.h | 93 + .../skywalk/IOSkywalkRxSubmissionQueue.h | 103 + .../include/IOKit/skywalk/IOSkywalkSupport.h | 402 + .../skywalk/IOSkywalkTxCompletionQueue.h | 151 + .../skywalk/IOSkywalkTxSubmissionQueue.h | 125 + .../include/IOKit/skywalk/IOSkywalkTypes.h | 122 + .../skywalk/IOUserNetworkEthernetNicProxy.h | 209 + .../IOKit/storage/IOAppleLabelScheme.h | 191 + .../IOKit/storage/IOApplePartitionScheme.h | 251 + .../IOKit/storage/IOBDBlockStorageDevice.h | 157 + .../IOKit/storage/IOBDBlockStorageDriver.h | 152 + .../include/IOKit/storage/IOBDMedia.h | 317 + .../IOKit/storage/IOBDMediaBSDClient.h | 183 + .../include/IOKit/storage/IOBDTypes.h | 133 + .../IOKit/storage/IOBlockStorageDevice.h | 549 + .../IOKit/storage/IOBlockStorageDriver.h | 1528 ++ .../IOKit/storage/IOCDBlockStorageDevice.h | 142 + .../IOKit/storage/IOCDBlockStorageDriver.h | 218 + .../include/IOKit/storage/IOCDMedia.h | 507 + .../IOKit/storage/IOCDMediaBSDClient.h | 199 + .../IOKit/storage/IOCDPartitionScheme.h | 226 + .../include/IOKit/storage/IOCDTypes.h | 492 + .../IOKit/storage/IODVDBlockStorageDevice.h | 140 + .../IOKit/storage/IODVDBlockStorageDriver.h | 239 + .../include/IOKit/storage/IODVDMedia.h | 366 + .../IOKit/storage/IODVDMediaBSDClient.h | 198 + .../include/IOKit/storage/IODVDTypes.h | 437 + .../IOKit/storage/IOFDiskPartitionScheme.h | 245 + .../include/IOKit/storage/IOFilterScheme.h | 396 + .../IOFireWireStorageCharacteristics.h | 63 + .../IOKit/storage/IOGUIDPartitionScheme.h | 252 + .../include/IOKit/storage/IOMedia.h | 797 + .../include/IOKit/storage/IOMediaBSDClient.h | 142 + .../include/IOKit/storage/IOPartitionScheme.h | 481 + .../include/IOKit/storage/IOStorage.h | 788 + .../storage/IOStorageCardCharacteristics.h | 490 + .../IOStorageControllerCharacteristics.h | 1346 + .../storage/IOStorageDeviceCharacteristics.h | 687 + .../IOStorageProtocolCharacteristics.h | 645 + .../storage/ata/IOATAPIProtocolTransport.h | 365 + .../IOKit/storage/ata/IOATAStorageDefines.h | 321 + .../include/IOKit/stream/IOStream.h | 609 + .../include/IOKit/stream/IOStreamFamily.h | 13 + .../include/IOKit/stream/IOStreamShared.h | 180 + .../include/IOKit/stream/IOStreamUserClient.h | 76 + QualcommWireless/include/IOKit/system.h | 67 + .../IOKit/system_management/IOWatchDogTimer.h | 57 + .../include/IOKit/usb/AppleUSBDefinitions.h | 1214 + QualcommWireless/include/IOKit/usb/IOUSBBus.h | 35 + .../include/IOKit/usb/IOUSBCommand.h | 280 + .../include/IOKit/usb/IOUSBController.h | 1186 + .../IOKit/usb/IOUSBControllerListElement.h | 125 + .../include/IOKit/usb/IOUSBControllerV2.h | 453 + .../include/IOKit/usb/IOUSBDevice.h | 611 + .../include/IOKit/usb/IOUSBHostDevice.h | 840 + .../include/IOKit/usb/IOUSBHostFamily.h | 502 + .../IOKit/usb/IOUSBHostFamilyDefinitions.h | 302 + .../include/IOKit/usb/IOUSBHostHIDDevice.h | 260 + .../include/IOKit/usb/IOUSBHostIOSource.h | 406 + .../include/IOKit/usb/IOUSBHostInterface.h | 551 + .../include/IOKit/usb/IOUSBHostPipe.h | 641 + .../include/IOKit/usb/IOUSBHostStream.h | 135 + .../include/IOKit/usb/IOUSBInterface.h | 366 + QualcommWireless/include/IOKit/usb/IOUSBNub.h | 85 + .../include/IOKit/usb/IOUSBPipe.h | 397 + .../include/IOKit/usb/IOUSBPipeV2.h | 196 + .../include/IOKit/usb/IOUSBWorkLoop.h | 67 + .../include/IOKit/usb/StandardUSB.h | 1380 + QualcommWireless/include/IOKit/usb/USB.h | 1286 + QualcommWireless/include/IOKit/usb/USBHub.h | 387 + QualcommWireless/include/IOKit/usb/USBSpec.h | 685 + .../IOKit/video/IOVideoControlDictionary.h | 74 + .../include/IOKit/video/IOVideoDevice.h | 154 + .../IOKit/video/IOVideoDeviceClientInit.h | 26 + .../include/IOKit/video/IOVideoDeviceLib.h | 213 + .../include/IOKit/video/IOVideoDeviceShared.h | 39 + .../IOKit/video/IOVideoDeviceUserClient.h | 109 + .../include/IOKit/video/IOVideoStream.h | 140 + .../IOKit/video/IOVideoStreamDictionary.h | 47 + .../video/IOVideoStreamFormatDictionary.h | 44 + .../include/IOKit/video/IOVideoTypes.h | 321 + docs/ARCHITECTURE.md | 105 + docs/BLUETOOTH.md | 106 + docs/BUILD.md | 134 + docs/NATIVE_WIFI.md | 116 + firmware/amss.bin | Bin 0 -> 6090816 bytes firmware/board-2.bin | Bin 0 -> 2431968 bytes firmware/m3.bin | Bin 0 -> 299660 bytes 405 files changed, 152754 insertions(+) create mode 100644 QualcommWireless.xcodeproj/project.pbxproj create mode 100644 QualcommWireless.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 QualcommWireless/Firmware_WCN7850.h create mode 100644 QualcommWireless/Firmware_WCN7850_Wifi.h create mode 100644 QualcommWireless/Firmware_WCN7850_Wifi.s create mode 100644 QualcommWireless/Info.plist create mode 100644 QualcommWireless/QualcommWifi.cpp create mode 100644 QualcommWireless/QualcommWifi.hpp create mode 100644 QualcommWireless/QualcommWireless.cpp create mode 100644 QualcommWireless/QualcommWireless.hpp create mode 100644 QualcommWireless/include/IOKit/80211/Apple80211.h create mode 100644 QualcommWireless/include/IOKit/80211/IO80211Controller.h create mode 100644 QualcommWireless/include/IOKit/80211/IO80211Interface.h create mode 100644 QualcommWireless/include/IOKit/80211/IO80211P2PInterface.h create mode 100644 QualcommWireless/include/IOKit/80211/IO80211SkywalkInterface.h create mode 100644 QualcommWireless/include/IOKit/80211/IO80211VirtualInterface.h create mode 100644 QualcommWireless/include/IOKit/80211/IO80211VirtualInterfaceNamer.h create mode 100644 QualcommWireless/include/IOKit/80211/IO80211WorkLoop.h create mode 100644 QualcommWireless/include/IOKit/80211/IOSkywalkEthernetInterface.h create mode 100644 QualcommWireless/include/IOKit/80211/apple80211_ioctl.h create mode 100644 QualcommWireless/include/IOKit/80211/apple80211_var.h create mode 100644 QualcommWireless/include/IOKit/80211/apple80211_wps.h create mode 100644 QualcommWireless/include/IOKit/80211/apple_private_spi.h create mode 100644 QualcommWireless/include/IOKit/80211/debug.h create mode 100644 QualcommWireless/include/IOKit/IOBSD.h create mode 100644 QualcommWireless/include/IOKit/IOBufferMemoryDescriptor.h create mode 100644 QualcommWireless/include/IOKit/IOCatalogue.h create mode 100644 QualcommWireless/include/IOKit/IOCommand.h create mode 100644 QualcommWireless/include/IOKit/IOCommandGate.h create mode 100644 QualcommWireless/include/IOKit/IOCommandPool.h create mode 100644 QualcommWireless/include/IOKit/IOConditionLock.h create mode 100644 QualcommWireless/include/IOKit/IODMACommand.h create mode 100644 QualcommWireless/include/IOKit/IODMAController.h create mode 100644 QualcommWireless/include/IOKit/IODMAEventSource.h create mode 100644 QualcommWireless/include/IOKit/IODataQueue.h create mode 100644 QualcommWireless/include/IOKit/IODataQueueShared.h create mode 100644 QualcommWireless/include/IOKit/IODeviceMemory.h create mode 100644 QualcommWireless/include/IOKit/IODeviceTreeSupport.h create mode 100644 QualcommWireless/include/IOKit/IOEventSource.h create mode 100644 QualcommWireless/include/IOKit/IOFilterInterruptEventSource.h create mode 100644 QualcommWireless/include/IOKit/IOInterleavedMemoryDescriptor.h create mode 100644 QualcommWireless/include/IOKit/IOInterruptController.h create mode 100644 QualcommWireless/include/IOKit/IOInterruptEventSource.h create mode 100644 QualcommWireless/include/IOKit/IOInterrupts.h create mode 100644 QualcommWireless/include/IOKit/IOKernelReportStructs.h create mode 100644 QualcommWireless/include/IOKit/IOKitDebug.h create mode 100644 QualcommWireless/include/IOKit/IOKitDiagnosticsUserClient.h create mode 100644 QualcommWireless/include/IOKit/IOKitKeys.h create mode 100644 QualcommWireless/include/IOKit/IOKitServer.h create mode 100644 QualcommWireless/include/IOKit/IOLib.h create mode 100644 QualcommWireless/include/IOKit/IOLocks.h create mode 100644 QualcommWireless/include/IOKit/IOMapper.h create mode 100644 QualcommWireless/include/IOKit/IOMemoryCursor.h create mode 100644 QualcommWireless/include/IOKit/IOMemoryDescriptor.h create mode 100644 QualcommWireless/include/IOKit/IOMessage.h create mode 100644 QualcommWireless/include/IOKit/IOMultiMemoryDescriptor.h create mode 100644 QualcommWireless/include/IOKit/IONVRAM.h create mode 100644 QualcommWireless/include/IOKit/IONotifier.h create mode 100644 QualcommWireless/include/IOKit/IOPlatformExpert.h create mode 100644 QualcommWireless/include/IOKit/IORPC.h create mode 100644 QualcommWireless/include/IOKit/IORangeAllocator.h create mode 100644 QualcommWireless/include/IOKit/IORegistryEntry.h create mode 100644 QualcommWireless/include/IOKit/IOReportHub.h create mode 100644 QualcommWireless/include/IOKit/IOReportMacros.h create mode 100644 QualcommWireless/include/IOKit/IOReportTypes.h create mode 100644 QualcommWireless/include/IOKit/IOReportUserClient.h create mode 100644 QualcommWireless/include/IOKit/IOReturn.h create mode 100644 QualcommWireless/include/IOKit/IOSMBusController.h create mode 100644 QualcommWireless/include/IOKit/IOService.h create mode 100644 QualcommWireless/include/IOKit/IOServicePM.h create mode 100644 QualcommWireless/include/IOKit/IOSharedDataQueue.h create mode 100644 QualcommWireless/include/IOKit/IOSharedLock.h create mode 100644 QualcommWireless/include/IOKit/IOSubMemoryDescriptor.h create mode 100644 QualcommWireless/include/IOKit/IOTimeStamp.h create mode 100644 QualcommWireless/include/IOKit/IOTimerEventSource.h create mode 100644 QualcommWireless/include/IOKit/IOTypes.h create mode 100644 QualcommWireless/include/IOKit/IOUserClient.h create mode 100644 QualcommWireless/include/IOKit/IOUserServer.h create mode 100644 QualcommWireless/include/IOKit/IOWorkLoop.h create mode 100644 QualcommWireless/include/IOKit/OSMessageNotification.h create mode 100644 QualcommWireless/include/IOKit/acpi/IOACPIPlatformDevice.h create mode 100644 QualcommWireless/include/IOKit/acpi/IOACPIPlatformExpert.h create mode 100644 QualcommWireless/include/IOKit/acpi/IOACPITypes.h create mode 100644 QualcommWireless/include/IOKit/assert.h create mode 100644 QualcommWireless/include/IOKit/ata/ATADeviceNub.h create mode 100644 QualcommWireless/include/IOKit/ata/ATATimerEventSource.h create mode 100644 QualcommWireless/include/IOKit/ata/IOATABusCommand.h create mode 100644 QualcommWireless/include/IOKit/ata/IOATABusInfo.h create mode 100644 QualcommWireless/include/IOKit/ata/IOATACommand.h create mode 100644 QualcommWireless/include/IOKit/ata/IOATAController.h create mode 100644 QualcommWireless/include/IOKit/ata/IOATADevConfig.h create mode 100644 QualcommWireless/include/IOKit/ata/IOATADevice.h create mode 100644 QualcommWireless/include/IOKit/ata/IOATARegI386.h create mode 100644 QualcommWireless/include/IOKit/ata/IOATATypes.h create mode 100644 QualcommWireless/include/IOKit/ata/IOPCIATA.h create mode 100644 QualcommWireless/include/IOKit/audio/BigNum128.h create mode 100644 QualcommWireless/include/IOKit/audio/IOAudioBlitterLibDispatch.h create mode 100644 QualcommWireless/include/IOKit/audio/IOAudioControl.h create mode 100644 QualcommWireless/include/IOKit/audio/IOAudioControlUserClient.h create mode 100644 QualcommWireless/include/IOKit/audio/IOAudioDebug.h create mode 100644 QualcommWireless/include/IOKit/audio/IOAudioDefines.h create mode 100644 QualcommWireless/include/IOKit/audio/IOAudioDevice.h create mode 100644 QualcommWireless/include/IOKit/audio/IOAudioEngine.h create mode 100644 QualcommWireless/include/IOKit/audio/IOAudioEngineUserClient.h create mode 100644 QualcommWireless/include/IOKit/audio/IOAudioLevelControl.h create mode 100644 QualcommWireless/include/IOKit/audio/IOAudioPort.h create mode 100644 QualcommWireless/include/IOKit/audio/IOAudioSelectorControl.h create mode 100644 QualcommWireless/include/IOKit/audio/IOAudioStream.h create mode 100644 QualcommWireless/include/IOKit/audio/IOAudioTimeIntervalFilter.h create mode 100644 QualcommWireless/include/IOKit/audio/IOAudioToggleControl.h create mode 100644 QualcommWireless/include/IOKit/audio/IOAudioTypes.h create mode 100644 QualcommWireless/include/IOKit/avc/IOFireWireAVCCommand.h create mode 100644 QualcommWireless/include/IOKit/avc/IOFireWireAVCConsts.h create mode 100644 QualcommWireless/include/IOKit/avc/IOFireWireAVCRequestSpace.h create mode 100644 QualcommWireless/include/IOKit/avc/IOFireWireAVCTargetSpace.h create mode 100644 QualcommWireless/include/IOKit/avc/IOFireWireAVCUnit.h create mode 100644 QualcommWireless/include/IOKit/avc/IOFireWireAVCUserClientCommon.h create mode 100644 QualcommWireless/include/IOKit/avc/IOFireWirePCRSpace.h create mode 100644 QualcommWireless/include/IOKit/battery/AppleSmartBatteryCommands.h create mode 100644 QualcommWireless/include/IOKit/bluetooth/AppleCSRBluetoothHostController.h create mode 100644 QualcommWireless/include/IOKit/bluetooth/Bluetooth.h create mode 100644 QualcommWireless/include/IOKit/bluetooth/BluetoothAssignedNumbers.h create mode 100644 QualcommWireless/include/IOKit/bluetooth/CSRBluetoothHostController.h create mode 100644 QualcommWireless/include/IOKit/bluetooth/IOBluetoothACPIMethods.h create mode 100644 QualcommWireless/include/IOKit/bluetooth/IOBluetoothDataQueue.h create mode 100644 QualcommWireless/include/IOKit/bluetooth/IOBluetoothHCIController.h create mode 100644 QualcommWireless/include/IOKit/bluetooth/IOBluetoothHCIRequest.h create mode 100644 QualcommWireless/include/IOKit/bluetooth/IOBluetoothHIDDriver.h create mode 100644 QualcommWireless/include/IOKit/bluetooth/IOBluetoothHIDDriverTypes.h create mode 100644 QualcommWireless/include/IOKit/bluetooth/IOBluetoothHostController.h create mode 100644 QualcommWireless/include/IOKit/bluetooth/IOBluetoothInactivityTimerEventSource.h create mode 100644 QualcommWireless/include/IOKit/bluetooth/IOBluetoothInternal.h create mode 100644 QualcommWireless/include/IOKit/bluetooth/IOBluetoothMemoryBlock.h create mode 100644 QualcommWireless/include/IOKit/bluetooth/IOBluetoothMemoryBlockQueue.h create mode 100644 QualcommWireless/include/IOKit/bluetooth/IOBluetoothObject.h create mode 100644 QualcommWireless/include/IOKit/bluetooth/IOBluetoothTimerEventSource.h create mode 100644 QualcommWireless/include/IOKit/bluetooth/IOBluetoothTypes.h create mode 100644 QualcommWireless/include/IOKit/bluetooth/IOBluetoothWorkLoop.h create mode 100644 QualcommWireless/include/IOKit/bluetooth/IOWorkQueue.h create mode 100644 QualcommWireless/include/IOKit/bluetooth/serial/IOBluetoothSerialClient.h create mode 100644 QualcommWireless/include/IOKit/bluetooth/serial/IOBluetoothSerialManager.h create mode 100644 QualcommWireless/include/IOKit/bluetooth/transport/CSRBluetoothHostControllerUSBTransport.h create mode 100644 QualcommWireless/include/IOKit/bluetooth/transport/IOBluetoothHostControllerTransport.h create mode 100644 QualcommWireless/include/IOKit/bluetooth/transport/IOBluetoothHostControllerUARTTransport.h create mode 100644 QualcommWireless/include/IOKit/bluetooth/transport/IOBluetoothHostControllerUSBTransport.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOConfigDirectory.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFWAddressSpace.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFWAsyncStreamListener.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFWCommand.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFWDCL.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFWDCLPool.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFWDCLProgram.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFWDCLTranslator.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFWIsochChannel.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFWIsochPort.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFWLocalIsochPort.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFWPHYPacketListener.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFWPhysicalAddressSpace.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFWPseudoAddressSpace.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFWRegs.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFWSimpleContiguousPhysicalAddressSpace.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFWSimplePhysicalAddressSpace.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFWSyncer.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFWUserObjectExporter.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFWUtils.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFireWireBus.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFireWireController.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFireWireDevice.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFireWireFamilyCommon.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFireWireIRMAllocation.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFireWireLocalNode.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFireWireMultiIsochReceive.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFireWireNub.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFireWirePowerManager.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOFireWireUnit.h create mode 100644 QualcommWireless/include/IOKit/firewire/IOLocalConfigDirectory.h create mode 100644 QualcommWireless/include/IOKit/firewire/IORemoteConfigDirectory.h create mode 100644 QualcommWireless/include/IOKit/graphics/GTrace.hpp create mode 100644 QualcommWireless/include/IOKit/graphics/IOAccelClientConnect.h create mode 100644 QualcommWireless/include/IOKit/graphics/IOAccelSurfaceConnect.h create mode 100644 QualcommWireless/include/IOKit/graphics/IOAccelTypes.h create mode 100644 QualcommWireless/include/IOKit/graphics/IOAccelerator.h create mode 100644 QualcommWireless/include/IOKit/graphics/IODisplay.h create mode 100644 QualcommWireless/include/IOKit/graphics/IOFramebuffer.h create mode 100644 QualcommWireless/include/IOKit/graphics/IOFramebufferShared.h create mode 100644 QualcommWireless/include/IOKit/graphics/IOGraphicsDevice.h create mode 100644 QualcommWireless/include/IOKit/graphics/IOGraphicsEngine.h create mode 100644 QualcommWireless/include/IOKit/graphics/IOGraphicsInterfaceTypes.h create mode 100644 QualcommWireless/include/IOKit/graphics/IOGraphicsTypes.h create mode 100644 QualcommWireless/include/IOKit/graphics/tl/_config create mode 100644 QualcommWireless/include/IOKit/graphics/tl/iolocks create mode 100644 QualcommWireless/include/IOKit/graphics/tl/osmemory create mode 100644 QualcommWireless/include/IOKit/graphics/tl/osutility create mode 100644 QualcommWireless/include/IOKit/hid/AppleHIDUsageTables.h create mode 100644 QualcommWireless/include/IOKit/hid/IOHIDDevice.h create mode 100644 QualcommWireless/include/IOKit/hid/IOHIDDeviceKeys.h create mode 100644 QualcommWireless/include/IOKit/hid/IOHIDDeviceTypes.h create mode 100644 QualcommWireless/include/IOKit/hid/IOHIDElement.h create mode 100644 QualcommWireless/include/IOKit/hid/IOHIDEvent.h create mode 100644 QualcommWireless/include/IOKit/hid/IOHIDEventDriver.h create mode 100644 QualcommWireless/include/IOKit/hid/IOHIDEventFieldDefs.h create mode 100644 QualcommWireless/include/IOKit/hid/IOHIDEventService.h create mode 100644 QualcommWireless/include/IOKit/hid/IOHIDEventServiceKeys.h create mode 100644 QualcommWireless/include/IOKit/hid/IOHIDEventServiceKeys_Private.h create mode 100644 QualcommWireless/include/IOKit/hid/IOHIDEventServiceTypes.h create mode 100644 QualcommWireless/include/IOKit/hid/IOHIDEventTypes.h create mode 100644 QualcommWireless/include/IOKit/hid/IOHIDInterface.h create mode 100644 QualcommWireless/include/IOKit/hid/IOHIDKeys.h create mode 100644 QualcommWireless/include/IOKit/hid/IOHIDPrivateKeys.h create mode 100644 QualcommWireless/include/IOKit/hid/IOHIDProperties.h create mode 100644 QualcommWireless/include/IOKit/hid/IOHIDUsageTables.h create mode 100644 QualcommWireless/include/IOKit/hid/IOHIDUtility.h create mode 100644 QualcommWireless/include/IOKit/hidsystem/IOHIDDescriptorParser.h create mode 100644 QualcommWireless/include/IOKit/hidsystem/IOHIDParameter.h create mode 100644 QualcommWireless/include/IOKit/hidsystem/IOHIDShared.h create mode 100644 QualcommWireless/include/IOKit/hidsystem/IOHIDSystem.h create mode 100644 QualcommWireless/include/IOKit/hidsystem/IOHIDTypes.h create mode 100644 QualcommWireless/include/IOKit/hidsystem/IOHIDUsageTables.h create mode 100644 QualcommWireless/include/IOKit/hidsystem/IOHIDWorkLoop.h create mode 100644 QualcommWireless/include/IOKit/hidsystem/IOHIDevice.h create mode 100644 QualcommWireless/include/IOKit/hidsystem/IOHIKeyboard.h create mode 100644 QualcommWireless/include/IOKit/hidsystem/IOHIKeyboardMapper.h create mode 100644 QualcommWireless/include/IOKit/hidsystem/IOHIPointing.h create mode 100644 QualcommWireless/include/IOKit/hidsystem/IOLLEvent.h create mode 100644 QualcommWireless/include/IOKit/hidsystem/ev_keymap.h create mode 100644 QualcommWireless/include/IOKit/i2c/IOI2CInterface.h create mode 100644 QualcommWireless/include/IOKit/ndrvsupport/IOMacOSTypes.h create mode 100644 QualcommWireless/include/IOKit/ndrvsupport/IOMacOSVideo.h create mode 100644 QualcommWireless/include/IOKit/ndrvsupport/IONDRVFramebuffer.h create mode 100644 QualcommWireless/include/IOKit/ndrvsupport/IONDRVLibraries.h create mode 100644 QualcommWireless/include/IOKit/ndrvsupport/IONDRVSupport.h create mode 100644 QualcommWireless/include/IOKit/network/IOBasicOutputQueue.h create mode 100644 QualcommWireless/include/IOKit/network/IOEthernetController.h create mode 100644 QualcommWireless/include/IOKit/network/IOEthernetInterface.h create mode 100644 QualcommWireless/include/IOKit/network/IOEthernetStats.h create mode 100644 QualcommWireless/include/IOKit/network/IOGatedOutputQueue.h create mode 100644 QualcommWireless/include/IOKit/network/IOKernelDebugger.h create mode 100644 QualcommWireless/include/IOKit/network/IOMbufMemoryCursor.h create mode 100644 QualcommWireless/include/IOKit/network/IONetworkController.h create mode 100644 QualcommWireless/include/IOKit/network/IONetworkData.h create mode 100644 QualcommWireless/include/IOKit/network/IONetworkInterface.h create mode 100644 QualcommWireless/include/IOKit/network/IONetworkMedium.h create mode 100644 QualcommWireless/include/IOKit/network/IONetworkStats.h create mode 100644 QualcommWireless/include/IOKit/network/IOOutputQueue.h create mode 100644 QualcommWireless/include/IOKit/network/IOPacketQueue.h create mode 100644 QualcommWireless/include/IOKit/network/IOSkywalkEthernetInterface.h create mode 100644 QualcommWireless/include/IOKit/nvram/IONVRAMController.h create mode 100644 QualcommWireless/include/IOKit/pci/IOAGPDevice.h create mode 100644 QualcommWireless/include/IOKit/pci/IOPCIBridge.h create mode 100644 QualcommWireless/include/IOKit/pci/IOPCIDevice.h create mode 100644 QualcommWireless/include/IOKit/pci/IOPCIFamilyDefinitions.h create mode 100644 QualcommWireless/include/IOKit/platform/AppleMacIO.h create mode 100644 QualcommWireless/include/IOKit/platform/AppleMacIODevice.h create mode 100644 QualcommWireless/include/IOKit/platform/AppleNMI.h create mode 100644 QualcommWireless/include/IOKit/platform/ApplePlatformExpert.h create mode 100644 QualcommWireless/include/IOKit/power/IOPwrController.h create mode 100644 QualcommWireless/include/IOKit/pwr_mgt/IOPM.h create mode 100644 QualcommWireless/include/IOKit/pwr_mgt/IOPMLibDefs.h create mode 100644 QualcommWireless/include/IOKit/pwr_mgt/IOPMPowerSource.h create mode 100644 QualcommWireless/include/IOKit/pwr_mgt/IOPMPowerSourceList.h create mode 100644 QualcommWireless/include/IOKit/pwr_mgt/IOPMpowerState.h create mode 100644 QualcommWireless/include/IOKit/pwr_mgt/IOPowerConnection.h create mode 100644 QualcommWireless/include/IOKit/pwr_mgt/RootDomain.h create mode 100644 QualcommWireless/include/IOKit/rtc/IORTCController.h create mode 100644 QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2LSIWorkaroundDescriptor.h create mode 100644 QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2LUN.h create mode 100644 QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2Login.h create mode 100644 QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2ManagementORB.h create mode 100644 QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2ORB.h create mode 100644 QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2Target.h create mode 100644 QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2UserClient.h create mode 100644 QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2UserClientCommon.h create mode 100644 QualcommWireless/include/IOKit/sbp2/IOFireWireSerialBusProtocolTransport.h create mode 100644 QualcommWireless/include/IOKit/scsi/IOBDServices.h create mode 100644 QualcommWireless/include/IOKit/scsi/IOBlockStorageServices.h create mode 100644 QualcommWireless/include/IOKit/scsi/IOCompactDiscServices.h create mode 100644 QualcommWireless/include/IOKit/scsi/IODVDServices.h create mode 100644 QualcommWireless/include/IOKit/scsi/IOReducedBlockServices.h create mode 100644 QualcommWireless/include/IOKit/scsi/IOSCSIBlockCommandsDevice.h create mode 100644 QualcommWireless/include/IOKit/scsi/IOSCSIMultimediaCommandsDevice.h create mode 100644 QualcommWireless/include/IOKit/scsi/IOSCSIPeripheralDeviceNub.h create mode 100644 QualcommWireless/include/IOKit/scsi/IOSCSIPeripheralDeviceType00.h create mode 100644 QualcommWireless/include/IOKit/scsi/IOSCSIPeripheralDeviceType05.h create mode 100644 QualcommWireless/include/IOKit/scsi/IOSCSIPeripheralDeviceType07.h create mode 100644 QualcommWireless/include/IOKit/scsi/IOSCSIPeripheralDeviceType0E.h create mode 100644 QualcommWireless/include/IOKit/scsi/IOSCSIPrimaryCommandsDevice.h create mode 100644 QualcommWireless/include/IOKit/scsi/IOSCSIProtocolInterface.h create mode 100644 QualcommWireless/include/IOKit/scsi/IOSCSIProtocolServices.h create mode 100644 QualcommWireless/include/IOKit/scsi/IOSCSIReducedBlockCommandsDevice.h create mode 100644 QualcommWireless/include/IOKit/scsi/SCSICmds_INQUIRY_Definitions.h create mode 100644 QualcommWireless/include/IOKit/scsi/SCSICmds_MODE_Definitions.h create mode 100644 QualcommWireless/include/IOKit/scsi/SCSICmds_READ_CAPACITY_Definitions.h create mode 100644 QualcommWireless/include/IOKit/scsi/SCSICmds_REPORT_LUNS_Definitions.h create mode 100644 QualcommWireless/include/IOKit/scsi/SCSICmds_REQUEST_SENSE_Defs.h create mode 100644 QualcommWireless/include/IOKit/scsi/SCSICommandDefinitions.h create mode 100644 QualcommWireless/include/IOKit/scsi/SCSICommandOperationCodes.h create mode 100644 QualcommWireless/include/IOKit/scsi/SCSIPort.h create mode 100644 QualcommWireless/include/IOKit/scsi/SCSITask.h create mode 100644 QualcommWireless/include/IOKit/scsi/spi/IOSCSIParallelInterfaceController.h create mode 100644 QualcommWireless/include/IOKit/serial/IOModemSerialStreamSync.h create mode 100644 QualcommWireless/include/IOKit/serial/IORS232SerialStreamSync.h create mode 100644 QualcommWireless/include/IOKit/serial/IOSerialDriverSync.h create mode 100644 QualcommWireless/include/IOKit/serial/IOSerialKeys.h create mode 100644 QualcommWireless/include/IOKit/serial/IOSerialStreamSync.h create mode 100644 QualcommWireless/include/IOKit/skywalk/IOSkywalkCloneableNetworkPacket.h create mode 100644 QualcommWireless/include/IOKit/skywalk/IOSkywalkController.h create mode 100644 QualcommWireless/include/IOKit/skywalk/IOSkywalkEthernetInterface.h create mode 100644 QualcommWireless/include/IOKit/skywalk/IOSkywalkFamily.h create mode 100644 QualcommWireless/include/IOKit/skywalk/IOSkywalkInterface.h create mode 100644 QualcommWireless/include/IOKit/skywalk/IOSkywalkMemorySegment.h create mode 100644 QualcommWireless/include/IOKit/skywalk/IOSkywalkNetworkController.h create mode 100644 QualcommWireless/include/IOKit/skywalk/IOSkywalkNetworkInterface.h create mode 100644 QualcommWireless/include/IOKit/skywalk/IOSkywalkNetworkPacket.h create mode 100644 QualcommWireless/include/IOKit/skywalk/IOSkywalkPacket.h create mode 100644 QualcommWireless/include/IOKit/skywalk/IOSkywalkPacketBuffer.h create mode 100644 QualcommWireless/include/IOKit/skywalk/IOSkywalkPacketBufferPool.h create mode 100644 QualcommWireless/include/IOKit/skywalk/IOSkywalkPacketQueue.h create mode 100644 QualcommWireless/include/IOKit/skywalk/IOSkywalkRxCompletionQueue.h create mode 100644 QualcommWireless/include/IOKit/skywalk/IOSkywalkRxSubmissionQueue.h create mode 100644 QualcommWireless/include/IOKit/skywalk/IOSkywalkSupport.h create mode 100644 QualcommWireless/include/IOKit/skywalk/IOSkywalkTxCompletionQueue.h create mode 100644 QualcommWireless/include/IOKit/skywalk/IOSkywalkTxSubmissionQueue.h create mode 100644 QualcommWireless/include/IOKit/skywalk/IOSkywalkTypes.h create mode 100644 QualcommWireless/include/IOKit/skywalk/IOUserNetworkEthernetNicProxy.h create mode 100644 QualcommWireless/include/IOKit/storage/IOAppleLabelScheme.h create mode 100644 QualcommWireless/include/IOKit/storage/IOApplePartitionScheme.h create mode 100644 QualcommWireless/include/IOKit/storage/IOBDBlockStorageDevice.h create mode 100644 QualcommWireless/include/IOKit/storage/IOBDBlockStorageDriver.h create mode 100644 QualcommWireless/include/IOKit/storage/IOBDMedia.h create mode 100644 QualcommWireless/include/IOKit/storage/IOBDMediaBSDClient.h create mode 100644 QualcommWireless/include/IOKit/storage/IOBDTypes.h create mode 100644 QualcommWireless/include/IOKit/storage/IOBlockStorageDevice.h create mode 100644 QualcommWireless/include/IOKit/storage/IOBlockStorageDriver.h create mode 100644 QualcommWireless/include/IOKit/storage/IOCDBlockStorageDevice.h create mode 100644 QualcommWireless/include/IOKit/storage/IOCDBlockStorageDriver.h create mode 100644 QualcommWireless/include/IOKit/storage/IOCDMedia.h create mode 100644 QualcommWireless/include/IOKit/storage/IOCDMediaBSDClient.h create mode 100644 QualcommWireless/include/IOKit/storage/IOCDPartitionScheme.h create mode 100644 QualcommWireless/include/IOKit/storage/IOCDTypes.h create mode 100644 QualcommWireless/include/IOKit/storage/IODVDBlockStorageDevice.h create mode 100644 QualcommWireless/include/IOKit/storage/IODVDBlockStorageDriver.h create mode 100644 QualcommWireless/include/IOKit/storage/IODVDMedia.h create mode 100644 QualcommWireless/include/IOKit/storage/IODVDMediaBSDClient.h create mode 100644 QualcommWireless/include/IOKit/storage/IODVDTypes.h create mode 100644 QualcommWireless/include/IOKit/storage/IOFDiskPartitionScheme.h create mode 100644 QualcommWireless/include/IOKit/storage/IOFilterScheme.h create mode 100644 QualcommWireless/include/IOKit/storage/IOFireWireStorageCharacteristics.h create mode 100644 QualcommWireless/include/IOKit/storage/IOGUIDPartitionScheme.h create mode 100644 QualcommWireless/include/IOKit/storage/IOMedia.h create mode 100644 QualcommWireless/include/IOKit/storage/IOMediaBSDClient.h create mode 100644 QualcommWireless/include/IOKit/storage/IOPartitionScheme.h create mode 100644 QualcommWireless/include/IOKit/storage/IOStorage.h create mode 100644 QualcommWireless/include/IOKit/storage/IOStorageCardCharacteristics.h create mode 100644 QualcommWireless/include/IOKit/storage/IOStorageControllerCharacteristics.h create mode 100644 QualcommWireless/include/IOKit/storage/IOStorageDeviceCharacteristics.h create mode 100644 QualcommWireless/include/IOKit/storage/IOStorageProtocolCharacteristics.h create mode 100644 QualcommWireless/include/IOKit/storage/ata/IOATAPIProtocolTransport.h create mode 100644 QualcommWireless/include/IOKit/storage/ata/IOATAStorageDefines.h create mode 100644 QualcommWireless/include/IOKit/stream/IOStream.h create mode 100644 QualcommWireless/include/IOKit/stream/IOStreamFamily.h create mode 100644 QualcommWireless/include/IOKit/stream/IOStreamShared.h create mode 100644 QualcommWireless/include/IOKit/stream/IOStreamUserClient.h create mode 100644 QualcommWireless/include/IOKit/system.h create mode 100644 QualcommWireless/include/IOKit/system_management/IOWatchDogTimer.h create mode 100644 QualcommWireless/include/IOKit/usb/AppleUSBDefinitions.h create mode 100644 QualcommWireless/include/IOKit/usb/IOUSBBus.h create mode 100644 QualcommWireless/include/IOKit/usb/IOUSBCommand.h create mode 100644 QualcommWireless/include/IOKit/usb/IOUSBController.h create mode 100644 QualcommWireless/include/IOKit/usb/IOUSBControllerListElement.h create mode 100644 QualcommWireless/include/IOKit/usb/IOUSBControllerV2.h create mode 100644 QualcommWireless/include/IOKit/usb/IOUSBDevice.h create mode 100644 QualcommWireless/include/IOKit/usb/IOUSBHostDevice.h create mode 100644 QualcommWireless/include/IOKit/usb/IOUSBHostFamily.h create mode 100644 QualcommWireless/include/IOKit/usb/IOUSBHostFamilyDefinitions.h create mode 100644 QualcommWireless/include/IOKit/usb/IOUSBHostHIDDevice.h create mode 100644 QualcommWireless/include/IOKit/usb/IOUSBHostIOSource.h create mode 100644 QualcommWireless/include/IOKit/usb/IOUSBHostInterface.h create mode 100644 QualcommWireless/include/IOKit/usb/IOUSBHostPipe.h create mode 100644 QualcommWireless/include/IOKit/usb/IOUSBHostStream.h create mode 100644 QualcommWireless/include/IOKit/usb/IOUSBInterface.h create mode 100644 QualcommWireless/include/IOKit/usb/IOUSBNub.h create mode 100644 QualcommWireless/include/IOKit/usb/IOUSBPipe.h create mode 100644 QualcommWireless/include/IOKit/usb/IOUSBPipeV2.h create mode 100644 QualcommWireless/include/IOKit/usb/IOUSBWorkLoop.h create mode 100644 QualcommWireless/include/IOKit/usb/StandardUSB.h create mode 100644 QualcommWireless/include/IOKit/usb/USB.h create mode 100644 QualcommWireless/include/IOKit/usb/USBHub.h create mode 100644 QualcommWireless/include/IOKit/usb/USBSpec.h create mode 100644 QualcommWireless/include/IOKit/video/IOVideoControlDictionary.h create mode 100644 QualcommWireless/include/IOKit/video/IOVideoDevice.h create mode 100644 QualcommWireless/include/IOKit/video/IOVideoDeviceClientInit.h create mode 100644 QualcommWireless/include/IOKit/video/IOVideoDeviceLib.h create mode 100644 QualcommWireless/include/IOKit/video/IOVideoDeviceShared.h create mode 100644 QualcommWireless/include/IOKit/video/IOVideoDeviceUserClient.h create mode 100644 QualcommWireless/include/IOKit/video/IOVideoStream.h create mode 100644 QualcommWireless/include/IOKit/video/IOVideoStreamDictionary.h create mode 100644 QualcommWireless/include/IOKit/video/IOVideoStreamFormatDictionary.h create mode 100644 QualcommWireless/include/IOKit/video/IOVideoTypes.h create mode 100644 docs/ARCHITECTURE.md create mode 100644 docs/BLUETOOTH.md create mode 100644 docs/BUILD.md create mode 100644 docs/NATIVE_WIFI.md create mode 100644 firmware/amss.bin create mode 100644 firmware/board-2.bin create mode 100644 firmware/m3.bin diff --git a/QualcommWireless.xcodeproj/project.pbxproj b/QualcommWireless.xcodeproj/project.pbxproj new file mode 100644 index 0000000..581e55e --- /dev/null +++ b/QualcommWireless.xcodeproj/project.pbxproj @@ -0,0 +1,348 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXFileReference section */ + AE7E20C7307F7D1E000AD02F /* QualcommWireless.kext */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = QualcommWireless.kext; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + AE7E20CF307F7D1E000AD02F /* Exceptions for "QualcommWireless" folder in "QualcommWireless" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Info.plist, + ); + target = AE7E20C6307F7D1E000AD02F /* QualcommWireless */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + AE7E20C9307F7D1E000AD02F /* QualcommWireless */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + AE7E20CF307F7D1E000AD02F /* Exceptions for "QualcommWireless" folder in "QualcommWireless" target */, + ); + path = QualcommWireless; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + AE7E20C4307F7D1E000AD02F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + AE7E20BD307F7D1E000AD02F = { + isa = PBXGroup; + children = ( + AE7E20C9307F7D1E000AD02F /* QualcommWireless */, + AE7E20C8307F7D1E000AD02F /* Products */, + ); + sourceTree = ""; + }; + AE7E20C8307F7D1E000AD02F /* Products */ = { + isa = PBXGroup; + children = ( + AE7E20C7307F7D1E000AD02F /* QualcommWireless.kext */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + AE7E20C2307F7D1E000AD02F /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + AE7E20C6307F7D1E000AD02F /* QualcommWireless */ = { + isa = PBXNativeTarget; + buildConfigurationList = AE7E20D0307F7D1E000AD02F /* Build configuration list for PBXNativeTarget "QualcommWireless" */; + buildPhases = ( + AE7E20C2307F7D1E000AD02F /* Headers */, + AE7E20C3307F7D1E000AD02F /* Sources */, + AE7E20C4307F7D1E000AD02F /* Frameworks */, + AE7E20C5307F7D1E000AD02F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + AE7E20C9307F7D1E000AD02F /* QualcommWireless */, + ); + name = QualcommWireless; + packageProductDependencies = ( + ); + productName = QualcommWireless; + productReference = AE7E20C7307F7D1E000AD02F /* QualcommWireless.kext */; + productType = "com.apple.product-type.kernel-extension"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + AE7E20BE307F7D1E000AD02F /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastUpgradeCheck = 1640; + TargetAttributes = { + AE7E20C6307F7D1E000AD02F = { + CreatedOnToolsVersion = 16.4; + }; + }; + }; + buildConfigurationList = AE7E20C1307F7D1E000AD02F /* Build configuration list for PBXProject "QualcommWireless" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = AE7E20BD307F7D1E000AD02F; + minimizedProjectReferenceProxies = 1; + preferredProjectObjectVersion = 77; + productRefGroup = AE7E20C8307F7D1E000AD02F /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + AE7E20C6307F7D1E000AD02F /* QualcommWireless */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + AE7E20C5307F7D1E000AD02F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + AE7E20C3307F7D1E000AD02F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + AE7E20D1307F7D1E000AD02F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1.0.2; + GCC_PREPROCESSOR_DEFINITIONS = ( + "__IO80211_TARGET=150000", + "$(inherited)", + ); + GENERATE_INFOPLIST_FILE = YES; + HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/QualcommWireless/include", + ); + INFOPLIST_FILE = QualcommWireless/Info.plist; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + MACOSX_DEPLOYMENT_TARGET = 15.5; + MARKETING_VERSION = 1.0.2; + MODULE_NAME = com.nawrhehe.QualcommWireless; + MODULE_VERSION = 1.0.1; + PRODUCT_BUNDLE_IDENTIFIER = com.nawrhehe.QualcommWireless; + PRODUCT_NAME = "$(TARGET_NAME)"; + RUN_CLANG_STATIC_ANALYZER = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + WRAPPER_EXTENSION = kext; + }; + name = Debug; + }; + AE7E20D2307F7D1E000AD02F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1.0.2; + GCC_PREPROCESSOR_DEFINITIONS = ( + "__IO80211_TARGET=150000", + "$(inherited)", + ); + GENERATE_INFOPLIST_FILE = YES; + HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/QualcommWireless/include", + ); + INFOPLIST_FILE = QualcommWireless/Info.plist; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + MACOSX_DEPLOYMENT_TARGET = 15.5; + MARKETING_VERSION = 1.0.2; + MODULE_NAME = com.nawrhehe.QualcommWireless; + MODULE_VERSION = 1.0.1; + PRODUCT_BUNDLE_IDENTIFIER = com.nawrhehe.QualcommWireless; + PRODUCT_NAME = "$(TARGET_NAME)"; + RUN_CLANG_STATIC_ANALYZER = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + WRAPPER_EXTENSION = kext; + }; + name = Release; + }; + AE7E20D3307F7D1E000AD02F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 15.5; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + AE7E20D4307F7D1E000AD02F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 15.5; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = macosx; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + AE7E20C1307F7D1E000AD02F /* Build configuration list for PBXProject "QualcommWireless" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AE7E20D3307F7D1E000AD02F /* Debug */, + AE7E20D4307F7D1E000AD02F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + AE7E20D0307F7D1E000AD02F /* Build configuration list for PBXNativeTarget "QualcommWireless" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AE7E20D1307F7D1E000AD02F /* Debug */, + AE7E20D2307F7D1E000AD02F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = AE7E20BE307F7D1E000AD02F /* Project object */; +} diff --git a/QualcommWireless.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/QualcommWireless.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/QualcommWireless.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/QualcommWireless/Firmware_WCN7850.h b/QualcommWireless/Firmware_WCN7850.h new file mode 100644 index 0000000..ce94bff --- /dev/null +++ b/QualcommWireless/Firmware_WCN7850.h @@ -0,0 +1,21653 @@ +unsigned char rampatch_usb_00190200_bin[] = { + 0x01, 0xa0, 0xd1, 0x03, 0x80, 0xd1, 0x03, 0x00, 0x5c, 0xd1, 0x03, 0x00, + 0x01, 0x00, 0x03, 0x00, 0x19, 0x00, 0x00, 0x02, 0x67, 0x85, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x02, 0x00, 0xf8, 0xb5, 0xca, 0x4d, 0xc8, 0x4c, 0x00, 0x20, + 0xad, 0xf8, 0x02, 0x00, 0x20, 0x46, 0x29, 0x46, 0x00, 0xf0, 0xac, 0xf9, + 0xc8, 0x49, 0xc6, 0x48, 0xc6, 0x4a, 0x0b, 0x46, 0x00, 0xf0, 0xac, 0xf9, + 0x3c, 0xf0, 0x0a, 0xfd, 0xc5, 0x48, 0xc6, 0x49, 0xc6, 0x4f, 0xc8, 0x4e, + 0x41, 0x61, 0xc6, 0x48, 0x3b, 0x68, 0x00, 0xf1, 0x0e, 0x01, 0x00, 0xf1, + 0x10, 0x02, 0x30, 0x46, 0x98, 0x47, 0xc4, 0x48, 0x3b, 0x68, 0x0d, 0xf1, + 0x02, 0x01, 0x82, 0x1c, 0x30, 0x46, 0x98, 0x47, 0xc2, 0x49, 0xc3, 0x4a, + 0x60, 0x19, 0xc0, 0x4c, 0x03, 0x30, 0x11, 0x44, 0xc1, 0x4a, 0x20, 0xf0, + 0x03, 0x00, 0x11, 0x44, 0xc4, 0xe9, 0x01, 0x10, 0x31, 0xf0, 0x52, 0xfd, + 0x01, 0xf0, 0x9c, 0xfc, 0x00, 0xf0, 0x8c, 0xff, 0x01, 0xf0, 0x02, 0xfc, + 0x03, 0xf0, 0x7e, 0xf8, 0x03, 0xf0, 0x3c, 0xfb, 0x03, 0xf0, 0xf2, 0xfd, + 0x05, 0xf0, 0x08, 0xf9, 0x03, 0xf0, 0x40, 0xfd, 0x04, 0xf0, 0xb8, 0xfa, + 0x04, 0xf0, 0x00, 0xfb, 0x04, 0xf0, 0x5c, 0xfb, 0x04, 0xf0, 0xc0, 0xf9, + 0x03, 0xf0, 0xd6, 0xfc, 0x05, 0xf0, 0xa6, 0xf8, 0x33, 0xf0, 0xd0, 0xf8, + 0x32, 0xf0, 0x9e, 0xfc, 0x07, 0xf0, 0x62, 0xfa, 0x07, 0xf0, 0xbe, 0xfb, + 0x3a, 0xf0, 0x98, 0xfc, 0x3c, 0xf0, 0x3e, 0xfe, 0x3b, 0xf0, 0x4a, 0xfa, + 0x24, 0xf0, 0xf4, 0xfe, 0x13, 0xf0, 0x52, 0xfd, 0x08, 0xf0, 0x50, 0xfb, + 0x08, 0xf0, 0xb4, 0xfc, 0x08, 0xf0, 0xde, 0xfc, 0x33, 0xf0, 0x40, 0xfb, + 0x06, 0xf0, 0x56, 0xff, 0x06, 0xf0, 0xa8, 0xfd, 0x07, 0xf0, 0x18, 0xf8, + 0x07, 0xf0, 0x7c, 0xf9, 0x08, 0xf0, 0xb0, 0xf8, 0x07, 0xf0, 0x4a, 0xfd, + 0x08, 0xf0, 0x30, 0xf8, 0x3c, 0xf0, 0x34, 0xfc, 0x39, 0xf0, 0xd2, 0xfe, + 0x33, 0xf0, 0xb4, 0xfb, 0x3c, 0xf0, 0x54, 0xfa, 0x3c, 0xf0, 0xf8, 0xf8, + 0x3c, 0xf0, 0x4a, 0xfb, 0x32, 0xf0, 0x66, 0xf9, 0x32, 0xf0, 0x38, 0xff, + 0x0b, 0xf0, 0x82, 0xfd, 0x0c, 0xf0, 0xfa, 0xf8, 0x0f, 0xf0, 0xfe, 0xfe, + 0x10, 0xf0, 0xa2, 0xfa, 0x10, 0xf0, 0x34, 0xfb, 0x10, 0xf0, 0x54, 0xfb, + 0x10, 0xf0, 0x88, 0xfb, 0x32, 0xf0, 0x8e, 0xfc, 0x08, 0xf0, 0xc0, 0xfc, + 0x08, 0xf0, 0xde, 0xfc, 0x23, 0xf0, 0x50, 0xfc, 0x23, 0xf0, 0xa0, 0xfd, + 0x23, 0xf0, 0x4e, 0xfe, 0x11, 0xf0, 0x06, 0xf9, 0x24, 0xf0, 0x6e, 0xfc, + 0x25, 0xf0, 0xe2, 0xf8, 0x25, 0xf0, 0x4e, 0xfa, 0x25, 0xf0, 0x36, 0xfb, + 0x25, 0xf0, 0x88, 0xfb, 0x25, 0xf0, 0x14, 0xff, 0x26, 0xf0, 0x56, 0xf8, + 0x26, 0xf0, 0x1c, 0xfa, 0x26, 0xf0, 0xa6, 0xfb, 0x26, 0xf0, 0xf2, 0xfc, + 0x26, 0xf0, 0x9e, 0xfd, 0x26, 0xf0, 0xc2, 0xfd, 0x26, 0xf0, 0xe4, 0xff, + 0x27, 0xf0, 0xec, 0xf8, 0x27, 0xf0, 0x9a, 0xf9, 0x27, 0xf0, 0x5c, 0xfa, + 0x27, 0xf0, 0xa8, 0xfa, 0x27, 0xf0, 0x54, 0xff, 0x1c, 0xf0, 0x48, 0xfa, + 0x28, 0xf0, 0x18, 0xfe, 0x28, 0xf0, 0x20, 0xff, 0x28, 0xf0, 0xc0, 0xff, + 0x2a, 0xf0, 0xec, 0xfa, 0x29, 0xf0, 0xb2, 0xfd, 0x29, 0xf0, 0x4a, 0xff, + 0x2a, 0xf0, 0x7c, 0xfc, 0x2a, 0xf0, 0x40, 0xf8, 0x2a, 0xf0, 0x50, 0xf9, + 0x29, 0xf0, 0x4e, 0xfa, 0x14, 0xf0, 0xd0, 0xff, 0x2f, 0xf0, 0x4e, 0xfb, + 0x2a, 0xf0, 0x70, 0xfc, 0x2a, 0xf0, 0x16, 0xfd, 0x2a, 0xf0, 0xee, 0xfd, + 0x2a, 0xf0, 0x06, 0xfe, 0x2a, 0xf0, 0x98, 0xfe, 0x2b, 0xf0, 0xe6, 0xff, + 0x0c, 0xf0, 0x1e, 0xfa, 0x0d, 0xf0, 0xc8, 0xf8, 0x0e, 0xf0, 0x5e, 0xfb, + 0x0d, 0xf0, 0x96, 0xfa, 0x0e, 0xf0, 0x3e, 0xfd, 0x0e, 0xf0, 0x88, 0xfe, + 0x10, 0xf0, 0x22, 0xfd, 0x11, 0xf0, 0x46, 0xf9, 0x15, 0xf0, 0x54, 0xfa, + 0x16, 0xf0, 0xd2, 0xfc, 0x17, 0xf0, 0x8c, 0xfc, 0x17, 0xf0, 0x9e, 0xff, + 0x19, 0xf0, 0xe2, 0xfd, 0x1a, 0xf0, 0x32, 0xfc, 0x1a, 0xf0, 0x20, 0xfe, + 0x1b, 0xf0, 0x16, 0xf8, 0x1b, 0xf0, 0xba, 0xfb, 0x1b, 0xf0, 0xd8, 0xfb, + 0x1c, 0xf0, 0x18, 0xf9, 0x1b, 0xf0, 0x0e, 0xfa, 0x1c, 0xf0, 0x6a, 0xf9, + 0x12, 0xf0, 0xea, 0xfb, 0x13, 0xf0, 0xaa, 0xf8, 0x11, 0xf0, 0x52, 0xff, + 0x13, 0xf0, 0x36, 0xfb, 0x1c, 0xf0, 0x22, 0xfd, 0x1c, 0xf0, 0xba, 0xfa, + 0x1e, 0xf0, 0xf2, 0xfd, 0x1f, 0xf0, 0x9a, 0xfb, 0x20, 0xf0, 0x28, 0xfb, + 0x2f, 0xf0, 0x0c, 0xfe, 0x21, 0xf0, 0xfa, 0xfa, 0x21, 0xf0, 0x2e, 0xff, + 0x22, 0xf0, 0x70, 0xf8, 0x22, 0xf0, 0x94, 0xf9, 0x22, 0xf0, 0x78, 0xfa, + 0x22, 0xf0, 0x5a, 0xff, 0x23, 0xf0, 0x38, 0xf9, 0x14, 0xf0, 0x38, 0xfe, + 0x14, 0xf0, 0xde, 0xfe, 0x2d, 0xf0, 0xda, 0xfb, 0x2d, 0xf0, 0x78, 0xfc, + 0x2d, 0xf0, 0x3c, 0xfa, 0x2f, 0xf0, 0xfe, 0xf8, 0x2f, 0xf0, 0x4a, 0xfa, + 0x2f, 0xf0, 0x62, 0xfb, 0x2f, 0xf0, 0xee, 0xfb, 0x2f, 0xf0, 0x28, 0xfc, + 0x3c, 0xf0, 0x98, 0xfd, 0x30, 0xf0, 0x96, 0xfe, 0x30, 0xf0, 0x1e, 0xff, + 0x2c, 0xf0, 0x6c, 0xf8, 0x30, 0xf0, 0xf4, 0xff, 0x31, 0xf0, 0x66, 0xf8, + 0x2f, 0xf0, 0x5e, 0xff, 0x31, 0xf0, 0x36, 0xfa, 0x2e, 0xf0, 0x78, 0xf9, + 0x2e, 0xf0, 0x7c, 0xf8, 0x2d, 0xf0, 0x10, 0xff, 0x2e, 0xf0, 0x50, 0xff, + 0x2d, 0xf0, 0x96, 0xfc, 0x2e, 0xf0, 0xb6, 0xf8, 0x2e, 0xf0, 0xd8, 0xf9, + 0x2e, 0xf0, 0x10, 0xff, 0x2e, 0xf0, 0xfa, 0xff, 0x2f, 0xf0, 0x28, 0xf8, + 0x2f, 0xf0, 0x6a, 0xf8, 0x31, 0xf0, 0xb4, 0xfc, 0x31, 0xf0, 0xc4, 0xfe, + 0x0e, 0xf0, 0xf2, 0xfe, 0x33, 0xf0, 0xb0, 0xf9, 0x1a, 0x48, 0x90, 0xf8, + 0x2e, 0x01, 0x80, 0x07, 0x10, 0xd4, 0x21, 0x68, 0x18, 0x48, 0x09, 0xb9, + 0x62, 0x68, 0x3a, 0xb1, 0x81, 0x65, 0x61, 0x68, 0x41, 0x66, 0x01, 0x68, + 0x41, 0xf0, 0x02, 0x01, 0x01, 0x60, 0xf8, 0xbd, 0x01, 0x68, 0x21, 0xf0, + 0x02, 0x01, 0x01, 0x60, 0xf8, 0xbd, 0x00, 0xbf, 0x60, 0xd4, 0x05, 0x00, + 0x1f, 0x58, 0x00, 0x00, 0x6c, 0xd1, 0x05, 0x00, 0x74, 0xce, 0x05, 0x00, + 0xf2, 0x02, 0x00, 0x00, 0xe0, 0xfe, 0x00, 0x00, 0xb4, 0x03, 0x02, 0x00, + 0xb4, 0xec, 0x08, 0x00, 0xe0, 0xf1, 0x01, 0x00, 0x8c, 0xca, 0x05, 0x00, + 0x48, 0x8d, 0x01, 0x00, 0xec, 0xf5, 0x01, 0x00, 0x84, 0x03, 0x00, 0x00, + 0x10, 0x00, 0x02, 0x00, 0xe0, 0xca, 0x03, 0x00, 0x8c, 0x7e, 0x08, 0x00, + 0xc8, 0x11, 0x00, 0x40, 0x4b, 0xf2, 0xc7, 0x4c, 0xc1, 0xf2, 0x12, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4c, 0xf6, 0x4d, 0x5c, 0xc1, 0xf2, 0x11, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4d, 0x61, 0x79, 0x20, 0x32, 0x37, 0x20, 0x32, + 0x30, 0x32, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x30, 0x3a, 0x31, + 0x36, 0x3a, 0x31, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x42, 0x54, 0x46, 0x57, 0x2e, 0x48, 0x41, 0x4d, 0x49, 0x4c, 0x54, 0x4f, + 0x4e, 0x2e, 0x32, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x30, 0x30, 0x37, 0x39, + 0x39, 0x2d, 0x55, 0x53, 0x42, 0x5f, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5a, + 0x2d, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb0, 0xb5, 0x16, 0x4c, 0x64, 0x7f, 0x2b, 0x2c, + 0x01, 0xd1, 0x2b, 0x21, 0x0a, 0xe0, 0xa1, 0xf1, 0x2b, 0x04, 0x0b, 0x2c, + 0x1a, 0xd8, 0x01, 0x25, 0x05, 0xfa, 0x04, 0xf4, 0x40, 0xf6, 0x01, 0x65, + 0x2c, 0x42, 0x13, 0xd0, 0x0e, 0x4a, 0x12, 0x68, 0xa2, 0xb1, 0xfb, 0x4d, + 0x00, 0xeb, 0x40, 0x04, 0x55, 0xf8, 0x24, 0x40, 0xb4, 0xf8, 0x74, 0x51, + 0x94, 0xf8, 0x1d, 0x41, 0xc4, 0xeb, 0x04, 0x14, 0x02, 0xeb, 0x44, 0x12, + 0x92, 0xf8, 0xc1, 0x20, 0x45, 0xea, 0x02, 0x42, 0xbd, 0xe8, 0xb0, 0x40, + 0x00, 0xf0, 0xd4, 0xbd, 0x00, 0x20, 0x69, 0x21, 0x00, 0xf0, 0xd6, 0xfd, + 0xfc, 0x20, 0x01, 0x00, 0xe0, 0x35, 0x01, 0x00, 0x03, 0x28, 0x3c, 0xbf, + 0x01, 0x20, 0x70, 0x47, 0x04, 0x28, 0x04, 0xbf, 0x03, 0x20, 0x70, 0x47, + 0x03, 0x28, 0x14, 0xbf, 0x00, 0x20, 0x02, 0x20, 0x70, 0x47, 0x00, 0xbf, + 0x2d, 0xe9, 0xf8, 0x4f, 0x05, 0x46, 0xdc, 0x48, 0x93, 0x46, 0x8a, 0x46, + 0x00, 0x68, 0x80, 0x47, 0xa0, 0xb3, 0xda, 0x4c, 0x20, 0x7c, 0x60, 0xb3, + 0xda, 0x49, 0x91, 0xf8, 0x2c, 0x22, 0x02, 0xb9, 0x70, 0xb3, 0x4f, 0xf0, + 0x00, 0x09, 0xa8, 0x46, 0x80, 0x2d, 0x1b, 0xd1, 0x9a, 0xf8, 0x05, 0x00, + 0x4e, 0x28, 0x47, 0xd0, 0x0b, 0x28, 0x00, 0xf0, 0x9b, 0x80, 0x3a, 0x28, + 0x00, 0xf0, 0xa0, 0x80, 0x43, 0x28, 0x00, 0xf0, 0xab, 0x80, 0x4d, 0x28, + 0x00, 0xf0, 0xd0, 0x80, 0x01, 0x28, 0x40, 0xf0, 0x0c, 0x81, 0xd9, 0x48, + 0xd9, 0x49, 0x00, 0x78, 0x09, 0x78, 0x08, 0x44, 0xd8, 0x49, 0x09, 0x78, + 0x08, 0x44, 0x98, 0xe0, 0x40, 0x46, 0x51, 0x46, 0x5a, 0x46, 0x00, 0xf0, + 0x93, 0xfd, 0x07, 0x46, 0x1d, 0xe1, 0xc3, 0x49, 0x09, 0x68, 0xb1, 0xf1, + 0xff, 0x3f, 0xcd, 0xdd, 0x01, 0x27, 0x71, 0xe1, 0x01, 0xf5, 0x0b, 0x76, + 0xc1, 0x49, 0x05, 0x20, 0x4f, 0x1c, 0xc1, 0x49, 0x88, 0x46, 0x81, 0x46, + 0xbd, 0x48, 0x00, 0x88, 0x00, 0xeb, 0x80, 0x00, 0x02, 0x38, 0xb8, 0x47, + 0xb9, 0xf1, 0x1e, 0x0f, 0x24, 0xbf, 0x01, 0x20, 0x30, 0x70, 0x40, 0x46, + 0xd8, 0xf8, 0x00, 0x00, 0x40, 0x04, 0x00, 0xf1, 0xa8, 0x80, 0x30, 0x78, + 0x00, 0x28, 0xb6, 0xd1, 0x21, 0x7c, 0x09, 0xf1, 0x05, 0x00, 0x00, 0x29, + 0xe5, 0xd0, 0xb0, 0xe7, 0x9a, 0xf8, 0x07, 0x30, 0x16, 0x2b, 0x00, 0xf2, + 0xce, 0x80, 0xb2, 0x4a, 0x03, 0xeb, 0x43, 0x01, 0x52, 0xf8, 0x21, 0x00, + 0x00, 0x28, 0x00, 0xf0, 0xc6, 0x80, 0x03, 0xeb, 0x43, 0x03, 0x02, 0xeb, + 0x83, 0x03, 0x1b, 0x79, 0x5c, 0x1f, 0x01, 0x2c, 0x00, 0xf2, 0xbd, 0x80, + 0xaa, 0x4e, 0xb0, 0xf8, 0x28, 0x41, 0xb6, 0xf8, 0xb8, 0x61, 0x34, 0x44, + 0x90, 0xf8, 0x1d, 0x61, 0xaa, 0xf8, 0x0e, 0x40, 0xa6, 0x4c, 0xc6, 0xeb, + 0x06, 0x16, 0x24, 0x68, 0x04, 0xeb, 0x46, 0x14, 0xe6, 0x78, 0x81, 0x2e, + 0x11, 0xd3, 0x90, 0xf8, 0x46, 0x71, 0x90, 0xf8, 0x50, 0x61, 0x90, 0xf8, + 0x20, 0xc1, 0xb7, 0x42, 0x38, 0xbf, 0x37, 0x46, 0x94, 0xf8, 0xc0, 0x60, + 0xac, 0xeb, 0x07, 0x0c, 0x9c, 0xfb, 0xf6, 0xf6, 0x3e, 0x44, 0x8a, 0xf8, + 0x0b, 0x60, 0x9a, 0xf8, 0x0c, 0x60, 0x15, 0x2e, 0x40, 0xf0, 0x93, 0x80, + 0x97, 0x4f, 0x66, 0x78, 0x7f, 0x68, 0xc6, 0xeb, 0xc6, 0x06, 0x07, 0xeb, + 0x86, 0x06, 0x36, 0x7e, 0x00, 0x2e, 0x00, 0xf0, 0x88, 0x80, 0x02, 0xeb, + 0x81, 0x01, 0x09, 0x68, 0x00, 0x29, 0x00, 0xf0, 0x04, 0x81, 0x99, 0x1f, + 0xb1, 0xfa, 0x81, 0xf1, 0x49, 0x09, 0xff, 0xe0, 0x00, 0x20, 0xaa, 0xf8, + 0x0a, 0x00, 0x00, 0xf0, 0x13, 0xfd, 0xca, 0xf8, 0x0c, 0x00, 0x74, 0xe0, + 0x9a, 0xf8, 0x06, 0x00, 0x84, 0x49, 0x00, 0xeb, 0x40, 0x00, 0x51, 0xf8, + 0x20, 0x00, 0x00, 0x28, 0x6b, 0xd0, 0x90, 0xf8, 0x3a, 0x00, 0x8a, 0xf8, + 0x09, 0x00, 0x66, 0xe0, 0x84, 0x48, 0x00, 0x23, 0x01, 0x88, 0xaa, 0xf8, + 0x06, 0x10, 0x41, 0x88, 0x80, 0x88, 0xaa, 0xf8, 0x0a, 0x00, 0x81, 0x48, + 0xaa, 0xf8, 0x08, 0x10, 0x02, 0x88, 0x41, 0x88, 0x86, 0x88, 0xc4, 0x88, + 0x03, 0x60, 0x43, 0x60, 0xff, 0x20, 0xff, 0x2a, 0x28, 0xbf, 0x02, 0x46, + 0x8a, 0xf8, 0x0c, 0x20, 0xff, 0x29, 0x28, 0xbf, 0x01, 0x46, 0x8a, 0xf8, + 0x0d, 0x10, 0xff, 0x2e, 0x28, 0xbf, 0x06, 0x46, 0x8a, 0xf8, 0x0e, 0x60, + 0xff, 0x2c, 0x38, 0xbf, 0x20, 0x46, 0x8a, 0xf8, 0x0f, 0x00, 0x3e, 0xe0, + 0x9a, 0xf8, 0x07, 0x00, 0x10, 0xf0, 0x06, 0x0f, 0x0c, 0xd0, 0x6c, 0x49, + 0x9a, 0xf8, 0x06, 0x00, 0x09, 0x68, 0x88, 0x47, 0x0c, 0xe0, 0x01, 0x20, + 0x4f, 0xf4, 0x80, 0x41, 0x30, 0x70, 0x62, 0x48, 0x01, 0x60, 0x0a, 0xe7, + 0x66, 0x49, 0x9a, 0xf8, 0x06, 0x00, 0x0a, 0x68, 0x00, 0x21, 0x90, 0x47, + 0x06, 0x46, 0x00, 0x28, 0x00, 0xf0, 0xa3, 0x80, 0x5f, 0x48, 0x71, 0x78, + 0x40, 0x68, 0xc1, 0xeb, 0xc1, 0x01, 0x00, 0xeb, 0x81, 0x04, 0x60, 0x7b, + 0xff, 0xf7, 0xd6, 0xfe, 0x8a, 0xf8, 0x0d, 0x00, 0x20, 0x7e, 0x08, 0xb9, + 0x96, 0xf8, 0xc0, 0x00, 0x8a, 0xf8, 0x0c, 0x00, 0xf0, 0x78, 0x81, 0x28, + 0x0d, 0xd3, 0x9a, 0xf8, 0x07, 0x00, 0x40, 0xf0, 0x01, 0x00, 0x8a, 0xf8, + 0x07, 0x00, 0x00, 0xf0, 0xcf, 0x00, 0xf1, 0x78, 0x61, 0xf3, 0x05, 0x10, + 0x8a, 0xf8, 0x07, 0x00, 0xff, 0xe7, 0x56, 0x4c, 0x01, 0x21, 0x4f, 0xf4, + 0x8c, 0x62, 0x72, 0xb6, 0x20, 0x68, 0x40, 0x00, 0x01, 0x30, 0x20, 0x60, + 0x52, 0x48, 0x01, 0x60, 0x52, 0x48, 0x01, 0x68, 0x62, 0xf3, 0x0d, 0x01, + 0x01, 0x60, 0x3f, 0x48, 0x3f, 0x49, 0x00, 0x88, 0x01, 0x31, 0x02, 0x38, + 0x88, 0x47, 0x80, 0x20, 0x51, 0x46, 0x5a, 0x46, 0x00, 0xf0, 0x7a, 0xfc, + 0x07, 0x46, 0x20, 0x68, 0x40, 0x08, 0x20, 0x60, 0x20, 0x68, 0x80, 0xf3, + 0x10, 0x88, 0x48, 0x4c, 0xbb, 0xf1, 0x00, 0x0f, 0xd4, 0xf8, 0x38, 0x06, + 0x04, 0xf5, 0xc7, 0x66, 0x00, 0xeb, 0x80, 0x00, 0x04, 0xeb, 0x80, 0x00, + 0x80, 0xf8, 0xa8, 0x84, 0x07, 0xd0, 0x00, 0xf2, 0xac, 0x40, 0x10, 0x21, + 0x52, 0x46, 0x5b, 0x46, 0x00, 0xf0, 0x6a, 0xfc, 0x12, 0xe0, 0x3e, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x32, 0x68, 0x04, 0xf5, 0x95, 0x61, 0x02, 0xeb, + 0x82, 0x02, 0x01, 0xeb, 0x82, 0x02, 0x50, 0x60, 0x30, 0x68, 0x00, 0xeb, + 0x80, 0x00, 0x01, 0xeb, 0x80, 0x00, 0x94, 0xf8, 0x63, 0x11, 0x81, 0x60, + 0x30, 0x68, 0x01, 0x30, 0x13, 0x28, 0x88, 0xbf, 0x00, 0x20, 0x30, 0x60, + 0x04, 0xf2, 0x94, 0x46, 0xb9, 0xf1, 0x1e, 0x0f, 0x14, 0xd3, 0x30, 0x68, + 0x90, 0xb1, 0x2f, 0x48, 0x00, 0x22, 0x33, 0x46, 0x31, 0x58, 0x01, 0x31, + 0x31, 0x50, 0x2d, 0x48, 0x00, 0x21, 0x05, 0x68, 0x10, 0x20, 0x00, 0x90, + 0x40, 0xf2, 0x11, 0x40, 0xa8, 0x47, 0x2a, 0x48, 0x12, 0x21, 0x00, 0x78, + 0x00, 0xf0, 0x3c, 0xfc, 0x24, 0x48, 0x00, 0x68, 0x80, 0x47, 0x30, 0x60, + 0x86, 0xf8, 0x0c, 0x80, 0x84, 0xf8, 0xa1, 0xb4, 0xda, 0xf8, 0x00, 0x00, + 0x70, 0x60, 0x20, 0x48, 0x30, 0x58, 0xb0, 0x60, 0xda, 0xf8, 0x04, 0x00, + 0xa4, 0xf8, 0xa2, 0x04, 0x38, 0x46, 0xbd, 0xe8, 0xf8, 0x8f, 0x00, 0x27, + 0xfa, 0xe7, 0x00, 0x21, 0x22, 0x89, 0x00, 0xf0, 0x27, 0xfc, 0x78, 0xe7, + 0x48, 0xe5, 0x08, 0x00, 0x4c, 0x01, 0x01, 0x00, 0x30, 0x60, 0x00, 0x40, + 0x38, 0x21, 0x01, 0x00, 0x34, 0xec, 0x01, 0x00, 0x40, 0xec, 0x01, 0x00, + 0x1c, 0x50, 0x00, 0x40, 0x10, 0x50, 0x00, 0x40, 0xe8, 0x72, 0x01, 0x00, + 0xe8, 0x65, 0x08, 0x00, 0xe0, 0x35, 0x01, 0x00, 0xec, 0xe5, 0x05, 0x00, + 0x10, 0xb6, 0x08, 0x00, 0xfc, 0x9b, 0x08, 0x00, 0x7a, 0x2e, 0x01, 0x00, + 0xf8, 0xda, 0x05, 0x00, 0x5c, 0x34, 0x01, 0x00, 0x53, 0x34, 0x01, 0x00, + 0xd4, 0x58, 0x01, 0x00, 0x24, 0x36, 0x01, 0x00, 0x58, 0x60, 0x00, 0x40, + 0x50, 0x60, 0x00, 0x40, 0x64, 0xd4, 0x05, 0x00, 0xa4, 0xe5, 0x08, 0x00, + 0xb8, 0xfe, 0xff, 0xff, 0xa0, 0xa0, 0x08, 0x00, 0x66, 0x34, 0x01, 0x00, + 0x2d, 0xe9, 0xf0, 0x4f, 0x93, 0xb0, 0xdf, 0xf8, 0x60, 0x86, 0x00, 0x20, + 0xad, 0xf8, 0x48, 0x00, 0x31, 0x20, 0xd8, 0xf8, 0x00, 0x10, 0x88, 0x47, + 0xdf, 0xf8, 0x50, 0x06, 0x00, 0x68, 0x80, 0x47, 0x00, 0x28, 0x00, 0xf0, + 0x81, 0x80, 0xe3, 0x4e, 0xe3, 0x4c, 0x71, 0x68, 0x60, 0x68, 0x11, 0xb9, + 0x00, 0x28, 0x00, 0xf0, 0x95, 0x80, 0xdf, 0xf8, 0x3c, 0x06, 0xe5, 0x68, + 0x03, 0x21, 0x04, 0x22, 0x07, 0x68, 0xd6, 0xf8, 0x0c, 0xa0, 0x4f, 0xf4, + 0x80, 0x60, 0x53, 0x46, 0xb8, 0x47, 0xba, 0xf1, 0x00, 0x0f, 0x7e, 0xd0, + 0x2a, 0xf4, 0x80, 0x40, 0x25, 0x60, 0x30, 0x60, 0x5f, 0xea, 0xca, 0x70, + 0x05, 0xd0, 0xdf, 0xf8, 0x14, 0x06, 0x08, 0x21, 0x00, 0x78, 0x00, 0xf0, + 0xb3, 0xfb, 0xdf, 0xf8, 0x0c, 0x06, 0x40, 0x30, 0x0c, 0x90, 0x5f, 0xea, + 0x4a, 0x40, 0x0a, 0xd5, 0x4f, 0xf4, 0x80, 0x40, 0x30, 0x60, 0x01, 0x20, + 0x0c, 0x99, 0x81, 0xf8, 0xec, 0x01, 0xdf, 0xf8, 0xf4, 0x05, 0x00, 0x68, + 0x80, 0x47, 0x5f, 0xea, 0xca, 0x50, 0x0e, 0xd5, 0x0c, 0x98, 0xd0, 0xf8, + 0x70, 0x05, 0x50, 0xb9, 0x0c, 0x99, 0xd1, 0xf8, 0xbc, 0x01, 0x01, 0x30, + 0xc1, 0xf8, 0xbc, 0x01, 0xdf, 0xf8, 0xd4, 0x05, 0x01, 0x68, 0x01, 0x20, + 0x88, 0x47, 0x5f, 0xea, 0x0a, 0x70, 0x4a, 0xd5, 0x60, 0x68, 0x05, 0x40, + 0x00, 0xf0, 0x3f, 0x82, 0xdf, 0xf8, 0xb4, 0x05, 0x00, 0xf2, 0xb6, 0x54, + 0xe8, 0x03, 0x52, 0xd5, 0xff, 0x20, 0x0d, 0xaa, 0x01, 0x21, 0x00, 0x23, + 0x00, 0x27, 0x8d, 0xf8, 0x34, 0x00, 0xdf, 0xf8, 0xa8, 0x05, 0x06, 0x68, + 0x01, 0x20, 0xb0, 0x47, 0x0c, 0x98, 0xd0, 0xf8, 0x70, 0x05, 0x01, 0x28, + 0x11, 0xd1, 0xdf, 0xf8, 0x98, 0x05, 0x02, 0x21, 0x04, 0x22, 0x09, 0x23, + 0x06, 0x68, 0x40, 0xf2, 0x1a, 0x20, 0xcd, 0xe9, 0x00, 0x70, 0x40, 0xf2, + 0xe2, 0x40, 0xb0, 0x47, 0xdf, 0xf8, 0x74, 0x05, 0x01, 0x68, 0x03, 0x20, + 0x88, 0x47, 0xdf, 0xf8, 0x78, 0x05, 0x25, 0xf4, 0x80, 0x35, 0x01, 0x68, + 0x60, 0x78, 0x30, 0xb3, 0x00, 0x20, 0x25, 0xe0, 0xa4, 0x48, 0xa5, 0x49, + 0xa1, 0x4a, 0x07, 0x23, 0x00, 0x68, 0x09, 0x68, 0x11, 0x60, 0xa0, 0x4a, + 0x10, 0x60, 0xdf, 0xf8, 0x50, 0x05, 0x08, 0x22, 0x04, 0x68, 0x40, 0xf2, + 0xbb, 0x10, 0xcd, 0xe9, 0x00, 0x10, 0x40, 0xf2, 0xe2, 0x40, 0x02, 0x21, + 0xa0, 0x47, 0xd8, 0xf8, 0x00, 0x10, 0x32, 0x20, 0x88, 0x47, 0x13, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0xdf, 0xf8, 0x28, 0x05, 0x00, 0x21, 0x04, 0x22, + 0x08, 0x23, 0x04, 0x68, 0x40, 0xf2, 0xc5, 0x10, 0xe9, 0xe7, 0x01, 0x20, + 0x88, 0x47, 0x68, 0x07, 0x10, 0xd5, 0x20, 0x20, 0x8d, 0xf8, 0x34, 0x00, + 0xdf, 0xf8, 0x10, 0x05, 0x00, 0x68, 0x80, 0x47, 0xdf, 0xf8, 0xfc, 0x04, + 0x0d, 0xaa, 0x01, 0x21, 0x00, 0x23, 0x06, 0x68, 0x02, 0x20, 0xb0, 0x47, + 0x25, 0xf0, 0x04, 0x05, 0xa8, 0x06, 0x01, 0xd5, 0x85, 0x48, 0x00, 0x6d, + 0x68, 0x06, 0x11, 0xd5, 0x60, 0x20, 0x0d, 0xaa, 0x01, 0x21, 0x00, 0x23, + 0x8d, 0xf8, 0x34, 0x00, 0xdf, 0xf8, 0xd0, 0x04, 0x06, 0x68, 0x01, 0x20, + 0xb0, 0x47, 0x7e, 0x49, 0x25, 0xf0, 0x40, 0x05, 0xc8, 0x69, 0x4f, 0xf0, + 0xff, 0x30, 0x08, 0x61, 0xdf, 0xf8, 0xc8, 0x04, 0x00, 0xf1, 0x02, 0x09, + 0xdf, 0xf8, 0xc4, 0x04, 0xcd, 0xf8, 0x2c, 0x90, 0x00, 0xf2, 0x63, 0x1b, + 0x05, 0xf4, 0x02, 0x50, 0xb0, 0xf5, 0x02, 0x5f, 0x6f, 0xd1, 0xdf, 0xf8, + 0xb4, 0x04, 0x00, 0x68, 0x80, 0x47, 0x07, 0x46, 0xdf, 0xf8, 0xac, 0x04, + 0x00, 0x68, 0x80, 0x47, 0x0c, 0x98, 0x99, 0xf8, 0x00, 0x10, 0x90, 0xf8, + 0xf4, 0x01, 0x0f, 0x91, 0x0e, 0x90, 0x60, 0xb3, 0x01, 0x28, 0x50, 0xd1, + 0x70, 0x20, 0x00, 0x21, 0x00, 0x22, 0x8d, 0xf8, 0x34, 0x00, 0xf8, 0x1e, + 0x01, 0x28, 0x9c, 0xbf, 0x02, 0x20, 0x84, 0xf8, 0xfe, 0x00, 0xdf, 0xf8, + 0x84, 0x04, 0x03, 0x68, 0x70, 0x20, 0x98, 0x47, 0xdf, 0xf8, 0x74, 0x04, + 0x00, 0x68, 0x80, 0x47, 0x9b, 0xf8, 0x00, 0x10, 0x4a, 0x1c, 0x8b, 0xf8, + 0x00, 0x20, 0x14, 0x22, 0xb1, 0xfb, 0xf2, 0xf2, 0x02, 0xeb, 0x82, 0x02, + 0xa1, 0xeb, 0x82, 0x01, 0xdf, 0xf8, 0x48, 0x24, 0x02, 0xeb, 0x81, 0x01, + 0xc1, 0xf8, 0x6c, 0x01, 0xdf, 0xf8, 0x50, 0x04, 0x00, 0x68, 0x80, 0x47, + 0x25, 0xe0, 0xa0, 0x20, 0x8d, 0xf8, 0x34, 0x00, 0x07, 0xf0, 0xfe, 0x00, + 0x02, 0x28, 0x04, 0xbf, 0x04, 0x20, 0x84, 0xf8, 0xfe, 0x00, 0xdf, 0xf8, + 0x2c, 0x04, 0x00, 0x68, 0x80, 0x47, 0x9b, 0xf8, 0x01, 0x10, 0x4a, 0x1c, + 0x8b, 0xf8, 0x01, 0x20, 0x14, 0x22, 0xb1, 0xfb, 0xf2, 0xf2, 0x02, 0xeb, + 0x82, 0x02, 0xa1, 0xeb, 0x82, 0x01, 0xdf, 0xf8, 0x00, 0x24, 0x02, 0xeb, + 0x81, 0x01, 0xc1, 0xf8, 0xbc, 0x01, 0x0b, 0x98, 0x00, 0x78, 0x02, 0x28, + 0x08, 0xbf, 0x06, 0xf0, 0xa7, 0xfc, 0xdf, 0xf8, 0xd4, 0x03, 0x0d, 0xaa, + 0x01, 0x21, 0x00, 0x23, 0x06, 0x68, 0x01, 0x20, 0xb0, 0x47, 0xdd, 0xf8, + 0x2c, 0x90, 0x25, 0xf4, 0x02, 0x55, 0x68, 0xb2, 0xb0, 0xf1, 0xff, 0x3f, + 0x3d, 0xdc, 0x0c, 0x9f, 0x70, 0x20, 0x0d, 0xaa, 0x01, 0x21, 0x00, 0x23, + 0x8d, 0xf8, 0x34, 0x00, 0x97, 0xf8, 0xf4, 0x01, 0x0e, 0x90, 0x99, 0xf8, + 0x00, 0x00, 0x4f, 0xf0, 0x01, 0x09, 0x0f, 0x90, 0xe5, 0x48, 0x06, 0x68, + 0x01, 0x20, 0xb0, 0x47, 0xe9, 0x48, 0x87, 0xf8, 0xf4, 0x91, 0x00, 0x68, + 0x80, 0x47, 0x04, 0x28, 0x04, 0xbf, 0x02, 0x20, 0x84, 0xf8, 0xfe, 0x00, + 0x00, 0x21, 0x00, 0x22, 0xe6, 0x48, 0x03, 0x68, 0x70, 0x20, 0x98, 0x47, + 0xe3, 0x48, 0x00, 0x68, 0x80, 0x47, 0x9b, 0xf8, 0x00, 0x10, 0x4a, 0x1c, + 0x8b, 0xf8, 0x00, 0x20, 0x14, 0x22, 0xb1, 0xfb, 0xf2, 0xf2, 0x02, 0xeb, + 0x82, 0x02, 0xa1, 0xeb, 0x82, 0x01, 0xd9, 0x4a, 0x02, 0xeb, 0x81, 0x01, + 0xc1, 0xf8, 0x6c, 0x01, 0xdb, 0x48, 0x00, 0x68, 0x80, 0x47, 0xdd, 0xf8, + 0x2c, 0x90, 0x25, 0xf0, 0x80, 0x05, 0xe8, 0x05, 0x0a, 0x94, 0x40, 0xf1, + 0x92, 0x80, 0xc6, 0x49, 0xc8, 0x4a, 0x20, 0x78, 0x89, 0x6e, 0xd2, 0xf8, + 0x9c, 0x26, 0xff, 0x28, 0x08, 0x92, 0x12, 0x79, 0x4f, 0xea, 0x11, 0x47, + 0xcd, 0xe9, 0x02, 0xb5, 0x07, 0x97, 0x09, 0x92, 0x40, 0xf0, 0xf2, 0x80, + 0xd0, 0x1e, 0x00, 0x26, 0x04, 0x25, 0x4f, 0xf0, 0x00, 0x08, 0x06, 0x90, + 0xec, 0x48, 0x00, 0xf2, 0xa4, 0x40, 0x05, 0x90, 0x0c, 0x98, 0x99, 0xf8, + 0x08, 0x10, 0xd0, 0xf8, 0x00, 0xb0, 0xc9, 0x07, 0x0b, 0xeb, 0x05, 0x00, + 0xa0, 0xf1, 0x04, 0x00, 0x10, 0xd1, 0xb6, 0x49, 0xc1, 0xf8, 0x9c, 0x06, + 0xc2, 0x49, 0x09, 0x68, 0x88, 0x47, 0xc4, 0xf8, 0xe6, 0x60, 0x53, 0xe0, + 0x10, 0x50, 0x00, 0x40, 0x10, 0x60, 0x00, 0x40, 0x1c, 0x60, 0x00, 0x40, + 0x1c, 0x50, 0x00, 0x40, 0x1b, 0xf8, 0x05, 0x10, 0xfe, 0x29, 0x3e, 0xd1, + 0x0c, 0x99, 0xd1, 0xf8, 0xc4, 0x01, 0x01, 0x30, 0xc1, 0xf8, 0xc4, 0x01, + 0x06, 0x98, 0x02, 0x28, 0x3b, 0xd8, 0xb2, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x05, 0x9e, 0x08, 0x9b, 0x0c, 0x9a, 0xdf, 0xf8, 0xb0, 0xc2, 0xbd, 0xf8, + 0x48, 0x40, 0x09, 0x9f, 0xdd, 0xf8, 0x2c, 0x90, 0x31, 0x68, 0x93, 0xf8, + 0x05, 0xe0, 0x1b, 0x68, 0xd2, 0xf8, 0xc4, 0x21, 0x0c, 0xeb, 0x01, 0x11, + 0xc1, 0xe9, 0xd5, 0x03, 0xc1, 0xf8, 0x5c, 0x23, 0xa1, 0xf8, 0x60, 0x43, + 0x81, 0xf8, 0x62, 0x73, 0x81, 0xf8, 0x63, 0xe3, 0x31, 0x68, 0x0c, 0xeb, + 0x01, 0x11, 0xc1, 0xe9, 0xfd, 0x03, 0xa1, 0xf8, 0x00, 0x44, 0x81, 0xf8, + 0x02, 0x74, 0x0a, 0x9c, 0x07, 0x9f, 0xc1, 0xf8, 0xfc, 0x23, 0x81, 0xf8, + 0x03, 0xe4, 0x30, 0x68, 0x01, 0x30, 0x09, 0x28, 0x88, 0xbf, 0x00, 0x20, + 0x30, 0x60, 0x00, 0x26, 0x05, 0xe0, 0x8c, 0x49, 0xc1, 0xf8, 0x9c, 0x06, + 0x98, 0x49, 0x09, 0x68, 0x88, 0x47, 0xfe, 0x20, 0x0b, 0xf8, 0x05, 0x00, + 0x08, 0xf1, 0x01, 0x00, 0xb8, 0x45, 0x05, 0xf1, 0x10, 0x05, 0x80, 0x46, + 0x90, 0xd1, 0x03, 0x9d, 0xdf, 0xf8, 0xf8, 0x81, 0xdd, 0xf8, 0x08, 0xb0, + 0x27, 0x70, 0x25, 0xf4, 0x80, 0x75, 0xa8, 0x04, 0x61, 0xd5, 0x0c, 0x9e, + 0xa0, 0x20, 0x0d, 0xaa, 0x01, 0x21, 0x00, 0x23, 0x00, 0x25, 0x8d, 0xf8, + 0x34, 0x00, 0x96, 0xf8, 0xf4, 0x01, 0x0e, 0x90, 0x99, 0xf8, 0x00, 0x00, + 0x0f, 0x90, 0x7b, 0x48, 0x04, 0x68, 0x01, 0x20, 0xa0, 0x47, 0x86, 0xf8, + 0xf4, 0x51, 0x7e, 0x4d, 0x28, 0x68, 0x80, 0x47, 0x02, 0x28, 0x03, 0xd0, + 0x28, 0x68, 0x80, 0x47, 0x03, 0x28, 0x03, 0xd1, 0x0a, 0x99, 0x04, 0x20, + 0x81, 0xf8, 0xfe, 0x00, 0x79, 0x48, 0x00, 0x68, 0x80, 0x47, 0x9b, 0xf8, + 0x01, 0x10, 0x14, 0x22, 0x9a, 0x4b, 0xb1, 0xfb, 0xf2, 0xf2, 0x02, 0xeb, + 0x82, 0x02, 0xa1, 0xeb, 0x82, 0x02, 0x01, 0x31, 0x03, 0xeb, 0x82, 0x02, + 0xc2, 0xf8, 0xbc, 0x01, 0x74, 0x48, 0x02, 0x68, 0x22, 0xf0, 0x70, 0x42, + 0x02, 0x60, 0x42, 0x68, 0x22, 0xf0, 0x40, 0x42, 0x42, 0x60, 0x71, 0x48, + 0xc2, 0x69, 0x22, 0xf4, 0xc0, 0x62, 0xc2, 0x61, 0x02, 0x68, 0x22, 0xf4, + 0x40, 0x72, 0x02, 0x60, 0x6d, 0x4a, 0x13, 0x68, 0x23, 0xf0, 0x70, 0x43, + 0x13, 0x60, 0x53, 0x68, 0x23, 0xf0, 0x40, 0x43, 0x53, 0x60, 0xc2, 0x69, + 0x22, 0xf4, 0xc0, 0x72, 0xc2, 0x61, 0x8b, 0xf8, 0x01, 0x10, 0x41, 0x6a, + 0x21, 0xf4, 0x40, 0x71, 0x41, 0x62, 0x00, 0x20, 0xff, 0x21, 0x02, 0xf0, + 0x5d, 0xfd, 0x99, 0xf8, 0x00, 0x00, 0x02, 0x28, 0x08, 0xbf, 0x06, 0xf0, + 0x5f, 0xfb, 0x1a, 0xf4, 0x70, 0x5f, 0x3f, 0xf4, 0x04, 0xae, 0x0c, 0x98, + 0x14, 0x21, 0xc0, 0xf8, 0xd8, 0xa1, 0x49, 0x48, 0x00, 0x78, 0x00, 0xf0, + 0x3d, 0xf9, 0xfa, 0xe5, 0x39, 0x1a, 0x11, 0xf0, 0x0f, 0x01, 0x08, 0xd1, + 0x0c, 0x99, 0x09, 0x68, 0x01, 0xeb, 0x00, 0x11, 0x09, 0x79, 0xfe, 0x29, + 0x3f, 0xf4, 0x7b, 0xaf, 0x10, 0x21, 0x01, 0xf1, 0x01, 0x08, 0x09, 0x99, + 0x4f, 0xf0, 0x01, 0x0b, 0xcd, 0xf8, 0x10, 0xa0, 0xcd, 0x1e, 0x6c, 0x49, + 0x01, 0xf2, 0xa4, 0x41, 0x06, 0x91, 0x0c, 0x99, 0x58, 0x44, 0x00, 0xf0, + 0x0f, 0x00, 0x09, 0x68, 0x01, 0xeb, 0x00, 0x10, 0x99, 0xf8, 0x08, 0x10, + 0xc9, 0x07, 0x09, 0xd1, 0x35, 0x49, 0xc1, 0xf8, 0x9c, 0x06, 0x42, 0x49, + 0x09, 0x68, 0x88, 0x47, 0x00, 0x20, 0xc4, 0xf8, 0xe6, 0x00, 0x50, 0xe0, + 0x06, 0x46, 0x16, 0xf8, 0x04, 0x1f, 0xfe, 0x29, 0x41, 0xd1, 0x0c, 0x99, + 0x02, 0x2d, 0xd1, 0xf8, 0xc4, 0x01, 0x00, 0xf1, 0x01, 0x00, 0xc1, 0xf8, + 0xc4, 0x01, 0x3e, 0xd8, 0x34, 0x48, 0x00, 0x68, 0x80, 0x47, 0x08, 0x9a, + 0xdd, 0xf8, 0x18, 0xa0, 0xdf, 0xf8, 0xb8, 0xc0, 0xbd, 0xf8, 0x48, 0x40, + 0x09, 0x9f, 0x0c, 0x9b, 0xae, 0x46, 0xda, 0xf8, 0x00, 0x10, 0x52, 0x68, + 0xd3, 0xf8, 0xc4, 0x31, 0x0c, 0xeb, 0x01, 0x11, 0x15, 0x0a, 0xa1, 0xf8, + 0x60, 0x43, 0x81, 0xf8, 0x63, 0x53, 0x81, 0xf8, 0x62, 0x73, 0x01, 0xf5, + 0x55, 0x71, 0x0d, 0xc1, 0xda, 0xf8, 0x00, 0x10, 0x0c, 0xeb, 0x01, 0x11, + 0xa1, 0xf8, 0x00, 0x44, 0x81, 0xf8, 0x03, 0x54, 0x81, 0xf8, 0x02, 0x74, + 0x01, 0xf5, 0x7d, 0x71, 0x0a, 0x9c, 0x07, 0x9f, 0x75, 0x46, 0x0d, 0xc1, + 0xda, 0xf8, 0x00, 0x00, 0x01, 0x30, 0x09, 0x28, 0x88, 0xbf, 0x00, 0x20, + 0xca, 0xf8, 0x00, 0x00, 0xdd, 0xf8, 0x10, 0xa0, 0x05, 0xe0, 0x0d, 0x49, + 0xc1, 0xf8, 0x9c, 0x06, 0x19, 0x49, 0x09, 0x68, 0x88, 0x47, 0xfe, 0x20, + 0xdd, 0xf8, 0x2c, 0x90, 0x30, 0x70, 0x0b, 0xf1, 0x01, 0x0b, 0xc3, 0x45, + 0x3f, 0xf4, 0x03, 0xaf, 0x20, 0x78, 0x92, 0xe7, 0x00, 0x9d, 0x08, 0x00, + 0x48, 0xe5, 0x08, 0x00, 0x10, 0x60, 0x00, 0x40, 0xac, 0x9a, 0x08, 0x00, + 0xa5, 0x58, 0x01, 0x00, 0x38, 0x21, 0x01, 0x00, 0xb0, 0x9a, 0x08, 0x00, + 0x9c, 0xe5, 0x08, 0x00, 0x80, 0xe5, 0x08, 0x00, 0xec, 0x9a, 0x08, 0x00, + 0x44, 0xe5, 0x08, 0x00, 0xa0, 0xe5, 0x08, 0x00, 0x74, 0x2a, 0x01, 0x00, + 0x64, 0xd4, 0x05, 0x00, 0x3c, 0xe5, 0x08, 0x00, 0x90, 0xe5, 0x08, 0x00, + 0xa4, 0xe5, 0x08, 0x00, 0x8c, 0xe5, 0x08, 0x00, 0x78, 0xe5, 0x08, 0x00, + 0xa8, 0x9a, 0x08, 0x00, 0x28, 0xd8, 0x05, 0x30, 0x5c, 0xc0, 0x05, 0x30, + 0x28, 0xf0, 0x05, 0x30, 0x10, 0xb5, 0x0d, 0x49, 0x44, 0xb2, 0x0d, 0x4b, + 0x00, 0x2c, 0x0a, 0x68, 0x02, 0xf0, 0x7f, 0x72, 0x48, 0xbf, 0x1a, 0x43, + 0x0a, 0x4b, 0x93, 0xf8, 0x73, 0x32, 0x1b, 0xb9, 0xc3, 0x06, 0x48, 0xbf, + 0x42, 0xf4, 0x10, 0x72, 0xc3, 0x02, 0x00, 0xf4, 0x00, 0x10, 0x48, 0xbf, + 0x42, 0xf0, 0x03, 0x02, 0x42, 0xea, 0x80, 0x20, 0x08, 0x60, 0x10, 0xbd, + 0x30, 0x60, 0x00, 0x40, 0x18, 0x01, 0x03, 0x04, 0x8c, 0x7e, 0x08, 0x00, + 0x80, 0xb5, 0x00, 0xf0, 0x6f, 0xf8, 0x03, 0x48, 0x01, 0x68, 0x21, 0xf0, + 0x01, 0x01, 0x01, 0x60, 0x80, 0xbd, 0x00, 0xbf, 0x08, 0x00, 0x00, 0x40, + 0x05, 0x4a, 0x92, 0xf8, 0x3e, 0x26, 0x01, 0x2a, 0x04, 0xd1, 0x04, 0x4a, + 0x52, 0x79, 0x01, 0x3a, 0x08, 0xbf, 0x11, 0x46, 0x00, 0xf0, 0x60, 0xb8, + 0x64, 0xd4, 0x05, 0x00, 0x48, 0xdc, 0x05, 0x00, 0x09, 0x48, 0x0a, 0x49, + 0x01, 0x60, 0x0a, 0x48, 0x0a, 0x49, 0x01, 0x60, 0x0a, 0x48, 0x0b, 0x49, + 0x01, 0x60, 0x0b, 0x48, 0x0b, 0x49, 0x01, 0x60, 0x0b, 0x48, 0x0c, 0x49, + 0x01, 0x60, 0x0c, 0x48, 0x0c, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0x8c, 0xe5, 0x08, 0x00, 0x75, 0x04, 0x02, 0x00, 0x44, 0x97, 0x08, 0x00, + 0xf5, 0x03, 0x02, 0x00, 0x14, 0x9b, 0x08, 0x00, 0x59, 0x08, 0x02, 0x00, + 0x84, 0xe5, 0x08, 0x00, 0x1d, 0x0f, 0x02, 0x00, 0xcc, 0x96, 0x08, 0x00, + 0x61, 0x0f, 0x02, 0x00, 0x68, 0xbb, 0x08, 0x00, 0x79, 0x0f, 0x02, 0x00, + 0x4a, 0xf2, 0x89, 0x0c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4c, 0xf2, 0x91, 0x0c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x49, 0xf2, 0x91, 0x2c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4b, 0xf6, 0xe5, 0x7c, 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4c, 0xf6, 0x4d, 0x5c, 0xc1, 0xf2, 0x11, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4a, 0xf6, 0x5d, 0x6c, 0xc1, 0xf2, 0x11, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x45, 0xf2, 0xdd, 0x5c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x48, 0xf6, 0x5d, 0x7c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x49, 0xf2, 0xfd, 0x1c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0xa0, 0xf1, 0x35, 0x01, 0x36, 0x28, 0xb1, 0xfa, 0x81, 0xf1, 0x4f, 0xea, + 0x51, 0x11, 0x08, 0xbf, 0x02, 0x21, 0x08, 0x46, 0x70, 0x47, 0x00, 0xbf, + 0xf8, 0xb5, 0x0c, 0x46, 0x34, 0x49, 0x0e, 0x68, 0x26, 0xb1, 0xc0, 0xeb, + 0x00, 0x10, 0x06, 0xeb, 0x40, 0x12, 0x00, 0xe0, 0x00, 0x22, 0xd2, 0xf8, + 0xb0, 0x70, 0xd7, 0xe9, 0x7c, 0x01, 0x50, 0xea, 0x01, 0x03, 0x52, 0xd0, + 0xd3, 0x78, 0x55, 0x78, 0xc1, 0x32, 0x81, 0x2b, 0x08, 0xbf, 0x07, 0xf5, + 0x07, 0x72, 0x12, 0x78, 0x52, 0x00, 0x00, 0xf0, 0x11, 0xfc, 0x28, 0x49, + 0xa4, 0xf1, 0x35, 0x03, 0xc5, 0xeb, 0xc5, 0x02, 0x36, 0x2c, 0x00, 0xf0, + 0x03, 0x00, 0xb3, 0xfa, 0x83, 0xf3, 0x49, 0x68, 0x4f, 0xea, 0x53, 0x13, + 0x08, 0xbf, 0x02, 0x23, 0x01, 0xeb, 0x82, 0x02, 0x02, 0xeb, 0x83, 0x02, + 0x15, 0x5c, 0x97, 0xf8, 0x42, 0x20, 0xd2, 0x06, 0x2e, 0xd4, 0x01, 0x28, + 0x2c, 0xd8, 0x97, 0xf8, 0x1d, 0x01, 0xc0, 0xeb, 0x00, 0x10, 0x06, 0xeb, + 0x40, 0x10, 0x40, 0x78, 0xc0, 0xeb, 0xc0, 0x00, 0x01, 0xeb, 0x80, 0x00, + 0xd0, 0xe9, 0x04, 0x10, 0x81, 0x42, 0x38, 0xbf, 0x01, 0x46, 0x1f, 0x29, + 0x1a, 0xd3, 0xb7, 0xf8, 0x74, 0x61, 0x07, 0xf5, 0xa3, 0x70, 0x31, 0x46, + 0x1f, 0xf0, 0x02, 0xfd, 0x28, 0xb9, 0x07, 0xf5, 0xa8, 0x70, 0x31, 0x46, + 0x1f, 0xf0, 0xfc, 0xfc, 0x60, 0xb1, 0x0c, 0x48, 0x43, 0x21, 0xa7, 0xf8, + 0x36, 0x62, 0x41, 0x77, 0xb7, 0xf8, 0x34, 0x02, 0x01, 0x30, 0xa7, 0xf8, + 0x34, 0x02, 0x08, 0x48, 0x90, 0xf8, 0xee, 0x50, 0x1d, 0xb9, 0x07, 0x48, + 0x20, 0x44, 0x90, 0xf8, 0x14, 0x52, 0x28, 0x46, 0xf8, 0xbd, 0x00, 0xbf, + 0xe0, 0x35, 0x01, 0x00, 0xec, 0xe5, 0x05, 0x00, 0xfc, 0x20, 0x01, 0x00, + 0x04, 0x31, 0x06, 0x00, 0x8c, 0x7e, 0x08, 0x00, 0x80, 0xb5, 0x0b, 0x48, + 0x01, 0x68, 0x91, 0xf8, 0x8c, 0x00, 0x03, 0x28, 0x05, 0xd8, 0x01, 0x28, + 0x03, 0xd0, 0xb1, 0xf8, 0x68, 0x20, 0x07, 0x4b, 0x02, 0xe0, 0xb1, 0xf8, + 0x68, 0x20, 0x06, 0x4b, 0x91, 0xf8, 0x7c, 0x10, 0x1b, 0x68, 0x01, 0xf0, + 0x0f, 0x01, 0x98, 0x47, 0x80, 0xb2, 0x80, 0xbd, 0xf8, 0x35, 0x01, 0x00, + 0x04, 0x97, 0x08, 0x00, 0xd0, 0x98, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, + 0x87, 0xb0, 0x0c, 0x46, 0xdf, 0xf8, 0x5c, 0x14, 0x91, 0x46, 0x2b, 0x2a, + 0x03, 0x92, 0x06, 0x46, 0x08, 0xbf, 0x4f, 0xf0, 0x34, 0x09, 0x00, 0x28, + 0x01, 0x93, 0x01, 0xf2, 0xac, 0x58, 0x00, 0xf0, 0x8d, 0x80, 0x96, 0xf8, + 0x3a, 0x00, 0x9a, 0x46, 0x06, 0x90, 0x96, 0xf8, 0x74, 0x00, 0x02, 0x90, + 0x96, 0xf8, 0x35, 0x01, 0x05, 0x90, 0xd6, 0xf8, 0xd4, 0x00, 0x00, 0xf0, + 0x7f, 0xfb, 0x04, 0x90, 0x96, 0xf8, 0x35, 0x01, 0x96, 0xf8, 0xb0, 0x35, + 0x16, 0x28, 0x1d, 0x46, 0x1f, 0xd8, 0xdf, 0xf8, 0x1c, 0x14, 0x00, 0xeb, + 0x40, 0x02, 0x51, 0xf8, 0x22, 0x20, 0xc2, 0xb1, 0x00, 0xeb, 0x40, 0x00, + 0x01, 0xeb, 0x80, 0x00, 0x00, 0x79, 0x01, 0x28, 0x40, 0xf0, 0xd0, 0x80, + 0xdf, 0xf8, 0x00, 0x04, 0xdf, 0xf8, 0x00, 0x14, 0x00, 0x78, 0x00, 0xeb, + 0x00, 0x10, 0x01, 0xeb, 0xc0, 0x01, 0xdf, 0xf8, 0xf8, 0x03, 0x02, 0x68, + 0x30, 0x46, 0x90, 0x47, 0x2b, 0x46, 0x83, 0x46, 0x01, 0xe0, 0x4f, 0xf0, + 0x00, 0x0b, 0xa9, 0xf1, 0x04, 0x00, 0x3e, 0x28, 0x00, 0xf2, 0x32, 0x81, + 0xdf, 0xe8, 0x10, 0xf0, 0x2c, 0x01, 0xf0, 0x00, 0xb2, 0x00, 0xb2, 0x00, + 0x2c, 0x01, 0x30, 0x01, 0x1e, 0x01, 0x30, 0x01, 0x30, 0x01, 0x30, 0x01, + 0x30, 0x01, 0x26, 0x01, 0xd5, 0x00, 0x30, 0x01, 0x30, 0x01, 0x30, 0x01, + 0x30, 0x01, 0x30, 0x01, 0x30, 0x01, 0x2c, 0x01, 0x30, 0x01, 0x29, 0x01, + 0x30, 0x01, 0x30, 0x01, 0xbd, 0x00, 0xbd, 0x00, 0x30, 0x01, 0x30, 0x01, + 0x30, 0x01, 0xd5, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, + 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0xd5, 0x00, 0x30, 0x01, 0x30, 0x01, + 0x30, 0x01, 0xf0, 0x00, 0xb2, 0x00, 0xb2, 0x00, 0x30, 0x01, 0x30, 0x01, + 0x30, 0x01, 0x30, 0x01, 0xe5, 0x00, 0xe5, 0x00, 0xe5, 0x00, 0x30, 0x01, + 0x30, 0x01, 0xbd, 0x00, 0xbd, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, + 0x3f, 0x00, 0x30, 0x01, 0x30, 0x01, 0xb2, 0x00, 0xb2, 0x00, 0x00, 0x2c, + 0x00, 0xf0, 0xee, 0x80, 0xdf, 0xf8, 0x64, 0x03, 0xb4, 0xf8, 0x98, 0x20, + 0x94, 0xf8, 0x9c, 0x10, 0x03, 0x68, 0x20, 0x78, 0x98, 0x47, 0x2b, 0x46, + 0x83, 0x46, 0xe1, 0xe0, 0xdf, 0xf8, 0x50, 0x03, 0x01, 0xf2, 0xab, 0x34, + 0x00, 0x68, 0x80, 0x47, 0x82, 0x46, 0xa9, 0xf1, 0x29, 0x00, 0x81, 0x21, + 0x00, 0x27, 0x0d, 0x28, 0x06, 0x91, 0x20, 0xd9, 0xa9, 0xf1, 0x02, 0x00, + 0x0e, 0x28, 0x40, 0xd9, 0xa9, 0xf1, 0x41, 0x00, 0x02, 0x28, 0xc0, 0xf0, + 0x91, 0x80, 0xb9, 0xf1, 0x21, 0x0f, 0x00, 0xf0, 0x5e, 0x80, 0xb9, 0xf1, + 0x16, 0x0f, 0x00, 0xf0, 0xd1, 0x80, 0xb9, 0xf1, 0x1a, 0x0f, 0x00, 0xf0, + 0xd1, 0x80, 0xb9, 0xf1, 0x14, 0x0f, 0x4f, 0xf0, 0x00, 0x02, 0x40, 0xf0, + 0xd6, 0x80, 0xdf, 0xf8, 0x10, 0x03, 0x17, 0x27, 0x90, 0xf8, 0x50, 0x20, + 0xcd, 0xe0, 0x19, 0x21, 0x00, 0x22, 0x05, 0x91, 0xdf, 0xe8, 0x00, 0xf0, + 0x45, 0xcb, 0xcb, 0xcb, 0x69, 0x76, 0x76, 0xcb, 0xcb, 0xcb, 0xcb, 0x07, + 0x07, 0x07, 0xaf, 0x48, 0x00, 0x78, 0x00, 0x28, 0x5a, 0xd1, 0xae, 0x48, + 0xc0, 0x68, 0x00, 0x28, 0x56, 0xd0, 0x90, 0xf8, 0x44, 0x20, 0xe8, 0x49, + 0xb0, 0xf8, 0x74, 0xa1, 0x05, 0x92, 0x90, 0xf8, 0x1d, 0x21, 0x09, 0x68, + 0xc2, 0xeb, 0x02, 0x12, 0x01, 0xeb, 0x42, 0x11, 0x01, 0xf1, 0xe4, 0x04, + 0x56, 0xe0, 0x19, 0x21, 0x00, 0x22, 0x05, 0x91, 0xdf, 0xe8, 0x00, 0xf0, + 0x08, 0xa7, 0xa7, 0x45, 0x52, 0x52, 0xa7, 0x67, 0xa7, 0xa7, 0xa7, 0xa7, + 0xa7, 0xa7, 0x21, 0x00, 0x9f, 0x48, 0x18, 0x27, 0x02, 0x78, 0x98, 0xe0, + 0x97, 0x48, 0x90, 0xf8, 0xab, 0x03, 0x3c, 0xe0, 0x4f, 0xf0, 0x00, 0x0b, + 0x03, 0x28, 0x08, 0xbf, 0x4f, 0xf0, 0xc8, 0x0b, 0x3b, 0xe7, 0x05, 0x98, + 0x93, 0x49, 0x00, 0xeb, 0x40, 0x00, 0x51, 0xf8, 0x20, 0x00, 0xb0, 0xf8, + 0x14, 0x03, 0x04, 0x90, 0x68, 0xe0, 0x94, 0x48, 0x94, 0x4c, 0x01, 0x78, + 0x20, 0x79, 0x47, 0x18, 0x93, 0x49, 0x09, 0x68, 0x88, 0x47, 0x02, 0x46, + 0x20, 0x79, 0x20, 0x44, 0x90, 0xf8, 0xad, 0x00, 0x76, 0xe0, 0x8d, 0x48, + 0x8d, 0x4c, 0x01, 0x78, 0x20, 0x79, 0x01, 0x44, 0x05, 0x91, 0x8c, 0x49, + 0x09, 0x68, 0x88, 0x47, 0x02, 0x90, 0x20, 0x79, 0x2b, 0x46, 0x20, 0x44, + 0x90, 0xf8, 0xad, 0x00, 0x49, 0xe0, 0x81, 0x48, 0x00, 0x78, 0x40, 0xb3, + 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x7b, 0x48, 0x00, 0xf2, 0xaa, 0x34, + 0x1a, 0x20, 0x06, 0xe0, 0x78, 0x48, 0x90, 0xf8, 0xaa, 0x03, 0x02, 0x90, + 0x81, 0x20, 0x38, 0xe0, 0x19, 0x20, 0x05, 0x90, 0x75, 0x48, 0xcd, 0xf8, + 0x10, 0xa0, 0x81, 0x27, 0x25, 0x78, 0x08, 0xf1, 0x0a, 0x02, 0x08, 0xf1, + 0x08, 0x03, 0x08, 0xf1, 0x06, 0x04, 0x01, 0x21, 0x4f, 0xf0, 0x00, 0x0b, + 0x00, 0x68, 0x06, 0x97, 0xdd, 0xf8, 0x04, 0xa0, 0x00, 0xf0, 0x7f, 0x40, + 0x52, 0xe0, 0x81, 0x20, 0x00, 0x22, 0x1b, 0x27, 0x3a, 0xe0, 0x6c, 0x48, + 0xc0, 0x68, 0x00, 0x28, 0xd2, 0xd0, 0xb0, 0xf8, 0x74, 0x11, 0x90, 0xf8, + 0x44, 0x00, 0x04, 0x91, 0x05, 0x90, 0xdd, 0xf8, 0x04, 0xa0, 0x11, 0xe0, + 0x67, 0x48, 0x00, 0x78, 0x02, 0x90, 0x81, 0x20, 0x06, 0x90, 0x1e, 0x20, + 0x05, 0x90, 0x09, 0xe0, 0xff, 0xf7, 0x68, 0xfe, 0x21, 0xe7, 0x62, 0x48, + 0x00, 0x78, 0x02, 0x90, 0x81, 0x20, 0x4f, 0xf0, 0x00, 0x0b, 0x06, 0x90, + 0x59, 0x48, 0x01, 0x2b, 0x00, 0x68, 0x00, 0xf0, 0x7f, 0x40, 0x22, 0xd1, + 0x08, 0xf1, 0x0a, 0x02, 0x08, 0xf1, 0x08, 0x03, 0x08, 0xf1, 0x06, 0x04, + 0x01, 0x21, 0x20, 0xe0, 0x5f, 0x48, 0x1d, 0x27, 0xc2, 0x7c, 0x08, 0xe0, + 0x5b, 0x48, 0x1c, 0x27, 0x00, 0x7e, 0x02, 0x28, 0x5a, 0x48, 0x08, 0xbf, + 0x1f, 0x27, 0x90, 0xf8, 0x4a, 0x20, 0x81, 0x20, 0x06, 0x90, 0x4b, 0x48, + 0x02, 0x92, 0xcd, 0xf8, 0x10, 0xa0, 0x4f, 0xf0, 0x00, 0x0b, 0x00, 0x68, + 0x05, 0x97, 0xdd, 0xf8, 0x04, 0xa0, 0x00, 0xf0, 0x7f, 0x40, 0x08, 0xf1, + 0x04, 0x02, 0x08, 0xf1, 0x02, 0x03, 0x00, 0x21, 0x44, 0x46, 0x02, 0x9d, + 0x1b, 0x88, 0x12, 0x78, 0x03, 0x9f, 0x00, 0x29, 0x40, 0xea, 0x03, 0x20, + 0x4f, 0xf0, 0x02, 0x03, 0x40, 0xea, 0x02, 0x40, 0x22, 0x88, 0x3c, 0x4c, + 0x40, 0xea, 0x02, 0x00, 0x20, 0x60, 0x4f, 0xf0, 0x04, 0x00, 0x18, 0xbf, + 0x0a, 0x20, 0x62, 0x68, 0x18, 0xf8, 0x00, 0x00, 0x18, 0xbf, 0x08, 0x23, + 0x00, 0x29, 0x38, 0xf8, 0x03, 0x30, 0x02, 0xf0, 0x7f, 0x42, 0x18, 0xbf, + 0x08, 0xf1, 0x06, 0x08, 0xb8, 0xf8, 0x00, 0x10, 0x42, 0xea, 0x03, 0x22, + 0x42, 0xea, 0x00, 0x40, 0x40, 0xea, 0x01, 0x00, 0x60, 0x60, 0x2c, 0x4c, + 0x3e, 0xb1, 0x94, 0xf8, 0xa2, 0x02, 0x20, 0xb1, 0x96, 0xf8, 0xb8, 0x75, + 0x00, 0x20, 0x86, 0xf8, 0xb8, 0x05, 0xd8, 0x48, 0x51, 0x46, 0x02, 0x68, + 0x48, 0x46, 0x90, 0x47, 0x94, 0xf8, 0xec, 0x02, 0x98, 0xb1, 0xc3, 0x48, + 0x90, 0xf8, 0xfe, 0x06, 0x78, 0xb1, 0x31, 0x48, 0x40, 0x78, 0x03, 0x28, + 0x0b, 0xd1, 0x56, 0xb1, 0x5c, 0x48, 0x40, 0x7f, 0x40, 0x28, 0x06, 0xd1, + 0x96, 0xf8, 0xbc, 0x06, 0x01, 0x28, 0x04, 0xbf, 0x00, 0x20, 0x86, 0xf8, + 0xbc, 0x06, 0x2a, 0x48, 0x04, 0x9a, 0x1f, 0xfa, 0x8b, 0xf3, 0x39, 0x46, + 0x04, 0x68, 0x05, 0x98, 0xc0, 0xb2, 0xa0, 0x47, 0x26, 0x48, 0x29, 0x46, + 0x00, 0x68, 0xc0, 0x07, 0x14, 0xbf, 0x25, 0x48, 0x25, 0x48, 0x06, 0x9c, + 0x03, 0x68, 0x50, 0x46, 0x62, 0xb2, 0x98, 0x47, 0x23, 0x48, 0x90, 0xf8, + 0xd4, 0x0d, 0x88, 0xb1, 0xa8, 0x06, 0x0f, 0xd4, 0x75, 0xb1, 0x1f, 0x48, + 0x64, 0xb2, 0x22, 0x46, 0x03, 0x68, 0x68, 0x1e, 0xc5, 0xb2, 0x50, 0x46, + 0x29, 0x46, 0x98, 0x47, 0x19, 0x48, 0x29, 0x46, 0x22, 0x46, 0x03, 0x68, + 0x50, 0x46, 0x98, 0x47, 0x19, 0x48, 0x1a, 0x49, 0x80, 0x68, 0x09, 0x68, + 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, 0x08, 0x47, 0x8c, 0x7e, 0x08, 0x00, + 0x20, 0x50, 0x00, 0x40, 0xe8, 0x72, 0x01, 0x00, 0x74, 0x87, 0x08, 0x00, + 0xfc, 0x6d, 0x01, 0x00, 0xe0, 0x96, 0x08, 0x00, 0x69, 0x34, 0x01, 0x00, + 0x14, 0x01, 0x01, 0x00, 0x30, 0x72, 0x01, 0x00, 0x50, 0x97, 0x08, 0x00, + 0x04, 0x97, 0x08, 0x00, 0xe0, 0xa0, 0x08, 0x00, 0x80, 0x4b, 0x01, 0x00, + 0x04, 0x5b, 0x01, 0x00, 0x50, 0x5b, 0x01, 0x00, 0x24, 0x5c, 0x01, 0x00, + 0x50, 0x2e, 0x01, 0x00, 0x44, 0x97, 0x08, 0x00, 0x04, 0x10, 0x00, 0x40, + 0x4c, 0x97, 0x08, 0x00, 0x48, 0x97, 0x08, 0x00, 0x00, 0x69, 0x08, 0x00, + 0x74, 0x2a, 0x01, 0x00, 0x84, 0xe5, 0x08, 0x00, 0xb0, 0xb5, 0x00, 0xf0, + 0x3f, 0xf9, 0x6e, 0x49, 0x23, 0x4c, 0x91, 0xf8, 0x20, 0x20, 0x14, 0xf8, + 0x1d, 0x0f, 0x01, 0x2a, 0x15, 0xd1, 0x00, 0xf0, 0xfe, 0x02, 0x06, 0x2a, + 0x11, 0xd1, 0x94, 0xf9, 0x01, 0x20, 0x00, 0x2a, 0x0d, 0xd4, 0x89, 0x7f, + 0x01, 0x29, 0x05, 0xd1, 0x6a, 0x21, 0x06, 0x28, 0x08, 0xbf, 0x69, 0x21, + 0x61, 0x70, 0x04, 0xe0, 0x06, 0x28, 0x02, 0xd1, 0x01, 0x20, 0x60, 0x70, + 0xb0, 0xbd, 0x2d, 0x28, 0x0c, 0xd0, 0x05, 0x28, 0x19, 0xd1, 0x14, 0x48, + 0x05, 0x68, 0x68, 0x1c, 0x06, 0xd0, 0xff, 0xf7, 0xad, 0xfc, 0x28, 0x1a, + 0x00, 0xf5, 0xa0, 0x70, 0x00, 0x01, 0x0e, 0xd5, 0x0f, 0x48, 0x90, 0xf8, + 0xc3, 0x01, 0x50, 0xb1, 0x0e, 0x49, 0x00, 0x22, 0x09, 0x68, 0x0b, 0x78, + 0x02, 0x2b, 0x05, 0xd0, 0x01, 0x32, 0x01, 0xf5, 0xf0, 0x71, 0x82, 0x42, + 0xf7, 0xd3, 0xb0, 0xbd, 0x61, 0x78, 0x20, 0x78, 0x41, 0xf0, 0x80, 0x01, + 0x05, 0x28, 0x61, 0x70, 0xf7, 0xd1, 0xff, 0xf7, 0x8f, 0xfc, 0x02, 0x49, + 0x08, 0x60, 0xb0, 0xbd, 0xfc, 0x20, 0x01, 0x00, 0x6c, 0xd1, 0x05, 0x00, + 0xe8, 0x65, 0x08, 0x00, 0xe0, 0x35, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x46, + 0x00, 0xf0, 0xf0, 0xf8, 0x10, 0x49, 0x91, 0xf8, 0x4d, 0x10, 0x02, 0x29, + 0x1b, 0xd1, 0x0f, 0x49, 0xb1, 0xf8, 0x48, 0x26, 0xa2, 0x42, 0x03, 0xd0, + 0xb1, 0xf8, 0x4a, 0x36, 0xa3, 0x42, 0x12, 0xd1, 0x02, 0xeb, 0xc2, 0x03, + 0x0a, 0x4a, 0x02, 0xeb, 0x43, 0x03, 0x5b, 0x78, 0x01, 0x2b, 0x08, 0xd0, + 0xb1, 0xf8, 0x4a, 0x16, 0x01, 0xeb, 0xc1, 0x01, 0x02, 0xeb, 0x41, 0x01, + 0x49, 0x78, 0x01, 0x29, 0x01, 0xd1, 0x40, 0xf0, 0x80, 0x00, 0x10, 0xbd, + 0x18, 0x74, 0x01, 0x00, 0x64, 0xd4, 0x05, 0x00, 0x44, 0x28, 0x01, 0x00, + 0xf8, 0xb5, 0x0c, 0x46, 0x07, 0x28, 0x02, 0xd0, 0x05, 0x46, 0x42, 0x28, + 0x18, 0xd1, 0x2f, 0x49, 0x44, 0xf0, 0x80, 0x00, 0x0a, 0x68, 0x22, 0xf4, + 0x7f, 0x42, 0x42, 0xea, 0x00, 0x22, 0x0a, 0x60, 0x0a, 0x69, 0x22, 0xf4, + 0x7f, 0x42, 0x42, 0xea, 0x00, 0x20, 0x08, 0x61, 0x28, 0x48, 0x4f, 0xf6, + 0x0f, 0x72, 0x01, 0x68, 0x91, 0x43, 0x41, 0xf2, 0x01, 0x12, 0x11, 0x43, + 0x01, 0x60, 0xf8, 0xbd, 0x06, 0x2d, 0x18, 0xbf, 0x41, 0x2d, 0x2e, 0xd1, + 0x1d, 0x48, 0x90, 0xf8, 0x21, 0x10, 0x01, 0x29, 0x03, 0xd1, 0x90, 0xf8, + 0x20, 0x00, 0x01, 0x28, 0xd9, 0xd0, 0x06, 0x2d, 0x18, 0xbf, 0x41, 0x2d, + 0x21, 0xd1, 0x18, 0x4e, 0x96, 0xf8, 0xec, 0x00, 0xe8, 0xb1, 0x17, 0x49, + 0x0f, 0x68, 0x79, 0x1c, 0x0a, 0xd0, 0xff, 0xf7, 0x1d, 0xfc, 0x38, 0x1a, + 0x20, 0x30, 0x20, 0xf0, 0x70, 0x40, 0xb0, 0xf1, 0x00, 0x6f, 0x10, 0xd9, + 0x96, 0xf8, 0xec, 0x00, 0x10, 0x49, 0x0a, 0x68, 0x22, 0xf4, 0x7f, 0x42, + 0x42, 0xea, 0x00, 0x20, 0x08, 0x60, 0x08, 0x69, 0x96, 0xf8, 0xec, 0x20, + 0x20, 0xf4, 0x7f, 0x40, 0x40, 0xea, 0x02, 0x20, 0xc1, 0xe7, 0x0a, 0x48, + 0x4f, 0xf6, 0x0f, 0x72, 0x01, 0x68, 0x91, 0x43, 0x01, 0x60, 0x28, 0x46, + 0x21, 0x46, 0xbd, 0xe8, 0xf8, 0x40, 0x00, 0xf0, 0x6f, 0xb8, 0x00, 0xbf, + 0x8c, 0xe6, 0x05, 0x00, 0x04, 0x31, 0x06, 0x00, 0x78, 0xd3, 0x05, 0x00, + 0x30, 0x50, 0x00, 0x40, 0x0c, 0x18, 0x21, 0x40, 0xb0, 0xb5, 0x1c, 0x46, + 0x0d, 0x46, 0x25, 0x28, 0x0c, 0xd1, 0x5d, 0xb1, 0x0e, 0x48, 0x01, 0x68, + 0x28, 0x46, 0x88, 0x47, 0x0d, 0x49, 0x91, 0xf8, 0xf8, 0x16, 0x49, 0xb1, + 0x00, 0x20, 0x20, 0x70, 0x3e, 0x20, 0xb0, 0xbd, 0x29, 0x46, 0x23, 0x46, + 0xbd, 0xe8, 0xb0, 0x40, 0x00, 0xf0, 0x52, 0xb8, 0xd5, 0xf8, 0xd4, 0x10, + 0x49, 0x7f, 0x21, 0xb1, 0x18, 0xb1, 0x90, 0xf8, 0xa1, 0x00, 0x02, 0x28, + 0xec, 0xd2, 0x28, 0x20, 0xb0, 0xbd, 0x00, 0xbf, 0xec, 0xbf, 0x08, 0x00, + 0x38, 0x21, 0x01, 0x00, 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, + 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, 0x09, 0x49, 0x01, 0x60, 0x09, 0x48, + 0x09, 0x49, 0x01, 0x60, 0x09, 0x48, 0x0a, 0x49, 0x01, 0x60, 0x70, 0x47, + 0x04, 0x99, 0x08, 0x00, 0x9d, 0x11, 0x02, 0x00, 0x34, 0x97, 0x08, 0x00, + 0x39, 0x18, 0x02, 0x00, 0xf4, 0xa0, 0x08, 0x00, 0x65, 0x16, 0x02, 0x00, + 0x38, 0x97, 0x08, 0x00, 0x0d, 0x17, 0x02, 0x00, 0x3c, 0x97, 0x08, 0x00, + 0x65, 0x17, 0x02, 0x00, 0x4b, 0xf6, 0xd5, 0x6c, 0xc1, 0xf2, 0x12, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4b, 0xf6, 0xf9, 0x7c, 0xc1, 0xf2, 0x0f, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x43, 0xf6, 0x3d, 0x3c, 0xc1, 0xf2, 0x02, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x43, 0xf6, 0x09, 0x2c, 0xc1, 0xf2, 0x02, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x43, 0xf6, 0x21, 0x4c, 0xc1, 0xf2, 0x02, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x43, 0xf2, 0x45, 0x7c, 0xc1, 0xf2, 0x02, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x10, 0xb5, 0x02, 0x46, 0x22, 0x48, 0x92, 0xf8, + 0x1d, 0x31, 0x00, 0x68, 0xc3, 0xeb, 0x03, 0x13, 0x00, 0xeb, 0x43, 0x10, + 0xd0, 0xf8, 0xa0, 0x00, 0x40, 0x7f, 0x40, 0xb1, 0xd2, 0xf8, 0x00, 0x01, + 0xd0, 0xf8, 0x88, 0x00, 0x43, 0x03, 0x02, 0xd4, 0xc0, 0xf3, 0x40, 0x43, + 0x00, 0xe0, 0x01, 0x23, 0x61, 0xb1, 0x01, 0x29, 0x23, 0xd1, 0x92, 0xf8, + 0x4a, 0x11, 0x16, 0x48, 0x92, 0xf8, 0x46, 0x41, 0x30, 0xf8, 0x11, 0x00, + 0x14, 0xb3, 0xb2, 0xf8, 0x48, 0x21, 0x09, 0xe0, 0x92, 0xf8, 0x54, 0x11, + 0x10, 0x48, 0x92, 0xf8, 0x50, 0x41, 0x30, 0xf8, 0x11, 0x00, 0xbc, 0xb1, + 0xb2, 0xf8, 0x52, 0x21, 0x00, 0x2b, 0x18, 0xbf, 0x04, 0x32, 0x05, 0x29, + 0x0b, 0xd3, 0x09, 0x29, 0x09, 0xd8, 0x92, 0xb2, 0x03, 0x39, 0xd2, 0x00, + 0x01, 0x32, 0x92, 0xfb, 0xf1, 0xf1, 0x08, 0x44, 0x10, 0xbd, 0x00, 0x20, + 0x10, 0xbd, 0x05, 0x4b, 0x92, 0xb2, 0x59, 0x5c, 0x01, 0xfb, 0x02, 0x00, + 0x10, 0xbd, 0x00, 0xbf, 0xe0, 0x35, 0x01, 0x00, 0xb0, 0x31, 0x0a, 0x10, + 0xc4, 0x31, 0x0a, 0x10, 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, + 0xb8, 0x96, 0x08, 0x00, 0x19, 0x19, 0x02, 0x00, 0x4a, 0x48, 0x00, 0x68, + 0x00, 0x47, 0x00, 0xbf, 0x70, 0xb5, 0x81, 0x79, 0xa8, 0x4d, 0x06, 0x7b, + 0x02, 0x7a, 0x43, 0x7a, 0x84, 0x7a, 0x01, 0xeb, 0x41, 0x01, 0x42, 0xea, + 0x03, 0x22, 0x55, 0xf8, 0x21, 0x10, 0x45, 0x7b, 0x42, 0xea, 0x04, 0x42, + 0x46, 0xea, 0x05, 0x25, 0x86, 0x7b, 0x45, 0xea, 0x06, 0x45, 0xc6, 0x7b, + 0xc0, 0x7a, 0x45, 0xea, 0x06, 0x65, 0x42, 0xea, 0x00, 0x60, 0xc1, 0xe9, + 0x7c, 0x05, 0x70, 0xbd, 0x10, 0xb5, 0x97, 0x49, 0x91, 0xf8, 0xb7, 0x16, + 0x49, 0x07, 0x20, 0xd5, 0x6d, 0x49, 0x91, 0xf8, 0xa5, 0x12, 0x49, 0x07, + 0x1b, 0xd5, 0x81, 0x79, 0x51, 0x48, 0x69, 0x4c, 0x90, 0xf8, 0xcd, 0x01, + 0x01, 0x29, 0x84, 0xf8, 0x3e, 0x16, 0x0a, 0xd1, 0x18, 0xb9, 0x01, 0x20, + 0x00, 0x21, 0x37, 0xf0, 0x1d, 0xf9, 0x2f, 0x48, 0x00, 0x68, 0x80, 0x47, + 0xc4, 0xf8, 0x44, 0x06, 0x04, 0xe0, 0x18, 0xb9, 0x00, 0x20, 0x00, 0x21, + 0x37, 0xf0, 0x12, 0xf9, 0x2a, 0x48, 0x80, 0x79, 0x00, 0xb1, 0x10, 0xbd, + 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, 0x00, 0xb8, 0xb0, 0xb5, 0x86, 0xb0, + 0x58, 0x4c, 0x94, 0xf8, 0x3e, 0x06, 0x00, 0xf0, 0x49, 0xf8, 0xb8, 0x48, + 0x00, 0x68, 0x80, 0x47, 0xc8, 0xb3, 0x1e, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x03, 0x28, 0x34, 0xd1, 0x04, 0xf2, 0x3e, 0x64, 0x20, 0x78, 0xe0, 0xb1, + 0xb2, 0x48, 0x00, 0x25, 0xcd, 0xe9, 0x04, 0x55, 0x00, 0x68, 0x80, 0x47, + 0x02, 0x90, 0x19, 0x48, 0x45, 0xf2, 0x0c, 0x51, 0x10, 0x22, 0xad, 0xf8, + 0x0c, 0x10, 0x41, 0x79, 0x00, 0x7a, 0x8d, 0xf8, 0x0f, 0x00, 0x20, 0x78, + 0x01, 0x29, 0x02, 0xa9, 0x18, 0xbf, 0x28, 0x46, 0x8d, 0xf8, 0x0e, 0x00, + 0xde, 0x48, 0x03, 0x68, 0x80, 0x20, 0x98, 0x47, 0x13, 0xe0, 0xe0, 0x78, + 0x00, 0x28, 0xdf, 0xd0, 0x0a, 0x48, 0x05, 0x68, 0x0a, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x40, 0xf2, 0x64, 0x71, 0x08, 0x22, 0x24, 0x23, 0xcd, 0xe9, + 0x00, 0x01, 0x40, 0xf2, 0xe2, 0x40, 0x01, 0x21, 0xa8, 0x47, 0x00, 0x20, + 0xe0, 0x70, 0x06, 0xb0, 0xb0, 0xbd, 0x00, 0xbf, 0x3c, 0xe5, 0x08, 0x00, + 0xec, 0x9a, 0x08, 0x00, 0xe0, 0xa0, 0x08, 0x00, 0x48, 0xdc, 0x05, 0x00, + 0x10, 0xb5, 0x17, 0x49, 0x0a, 0x68, 0x60, 0xf3, 0x82, 0x02, 0x0a, 0x60, + 0x15, 0x49, 0x0a, 0x68, 0x60, 0xf3, 0x41, 0x02, 0x0a, 0x60, 0x0a, 0x68, + 0x60, 0xf3, 0x00, 0x02, 0x0a, 0x60, 0x12, 0x4a, 0x12, 0x49, 0x53, 0x78, + 0x68, 0xb1, 0x12, 0x4c, 0x12, 0x78, 0x01, 0x28, 0x64, 0x7a, 0x23, 0x44, + 0x22, 0x44, 0x0b, 0x70, 0x4a, 0x70, 0xab, 0x49, 0x89, 0x68, 0x07, 0xd1, + 0x21, 0xf0, 0x10, 0x00, 0x06, 0xe0, 0x10, 0x78, 0x0b, 0x70, 0x48, 0x70, + 0xa6, 0x48, 0x81, 0x68, 0x41, 0xf0, 0x10, 0x00, 0xa4, 0x49, 0x88, 0x60, + 0x07, 0x49, 0x09, 0x68, 0xbd, 0xe8, 0x10, 0x40, 0x08, 0x47, 0x00, 0xbf, + 0x00, 0xf4, 0x23, 0x40, 0xa8, 0x51, 0x00, 0x30, 0x00, 0x69, 0x08, 0x00, + 0x8a, 0x76, 0x01, 0x00, 0xad, 0x2f, 0x06, 0x00, 0x84, 0xe5, 0x08, 0x00, + 0x10, 0xb5, 0x13, 0x4a, 0x01, 0x21, 0x82, 0xf8, 0x4e, 0x16, 0x83, 0x79, + 0x82, 0xf8, 0x4f, 0x36, 0x01, 0x2b, 0xc1, 0x79, 0x82, 0xf8, 0x50, 0x16, + 0x04, 0x7a, 0x82, 0xf8, 0x52, 0x46, 0x40, 0x7a, 0x82, 0xf8, 0x53, 0x06, + 0x0a, 0xd1, 0x02, 0xf2, 0x4e, 0x60, 0x0a, 0x4a, 0x80, 0x88, 0x00, 0x28, + 0x08, 0xbf, 0x12, 0x20, 0x82, 0xf8, 0x7a, 0x02, 0x29, 0xb9, 0x03, 0xe0, + 0x05, 0x48, 0x12, 0x21, 0x80, 0xf8, 0x7a, 0x12, 0x28, 0x21, 0x03, 0x48, + 0x80, 0xf8, 0xfd, 0x12, 0x10, 0xbd, 0x00, 0xbf, 0x64, 0xd4, 0x05, 0x00, + 0x8c, 0x7e, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x47, 0x05, 0x46, 0x24, 0x48, + 0x1e, 0x46, 0x17, 0x46, 0x88, 0x46, 0x90, 0xf8, 0x33, 0x92, 0x00, 0xf2, + 0x32, 0x2a, 0x21, 0x48, 0x00, 0x78, 0x01, 0x28, 0x02, 0xd1, 0x9a, 0xf8, + 0x00, 0x00, 0x58, 0xb3, 0x00, 0x24, 0x48, 0x2e, 0x03, 0xd1, 0xff, 0xf7, + 0x0b, 0xfa, 0x1c, 0x49, 0x48, 0x60, 0x28, 0x46, 0x41, 0x46, 0x3a, 0x46, + 0x33, 0x46, 0x01, 0xf0, 0x85, 0xfb, 0x14, 0xb1, 0x00, 0x20, 0x8a, 0xf8, + 0x00, 0x00, 0x16, 0x2d, 0x16, 0xd8, 0x16, 0x49, 0x05, 0xeb, 0x45, 0x00, + 0x51, 0xf8, 0x20, 0x00, 0x80, 0xb1, 0x05, 0xeb, 0x45, 0x02, 0x01, 0xeb, + 0x82, 0x01, 0x09, 0x79, 0x01, 0x29, 0x09, 0xd1, 0x90, 0xf8, 0x88, 0x04, + 0x80, 0x07, 0x05, 0xd5, 0xb9, 0xf1, 0x01, 0x0f, 0x08, 0xbf, 0xb8, 0xf1, + 0x01, 0x0f, 0x05, 0xd0, 0xbd, 0xe8, 0xf0, 0x87, 0x01, 0x24, 0x8a, 0xf8, + 0x00, 0x40, 0xd0, 0xe7, 0x9a, 0xf8, 0x01, 0x00, 0x00, 0x28, 0xf5, 0xd1, + 0x06, 0x48, 0x01, 0x68, 0x01, 0x20, 0xbd, 0xe8, 0xf0, 0x47, 0x08, 0x47, + 0x38, 0x21, 0x01, 0x00, 0x60, 0xd4, 0x05, 0x00, 0x14, 0xf0, 0x05, 0x00, + 0xe8, 0x72, 0x01, 0x00, 0x88, 0xe5, 0x08, 0x00, 0x70, 0x47, 0x00, 0xbf, + 0xf0, 0xb5, 0x85, 0xb0, 0x04, 0x46, 0x32, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x00, 0x28, 0x5c, 0xd0, 0xce, 0x48, 0x00, 0x68, 0x80, 0x47, 0x03, 0x28, + 0x57, 0xd1, 0x2e, 0x48, 0x00, 0x68, 0x80, 0x47, 0x00, 0x21, 0x2d, 0x4a, + 0x01, 0x90, 0x8d, 0xf8, 0x0d, 0x10, 0x04, 0xeb, 0x44, 0x01, 0x02, 0xeb, + 0x81, 0x03, 0x12, 0xf8, 0x21, 0x10, 0xdd, 0x7a, 0x58, 0x88, 0xdf, 0x79, + 0x5a, 0x78, 0x93, 0xf8, 0x06, 0xc0, 0x01, 0xf0, 0x0f, 0x01, 0x05, 0xf0, + 0x0f, 0x05, 0xad, 0xf8, 0x0e, 0x00, 0x98, 0x88, 0x8d, 0xf8, 0x0a, 0x70, + 0x41, 0xea, 0x05, 0x15, 0x99, 0x7a, 0x8d, 0xf8, 0x0b, 0x50, 0xad, 0xf8, + 0x10, 0x00, 0x00, 0x28, 0x53, 0x48, 0x01, 0xf0, 0x0f, 0x06, 0x59, 0x7a, + 0xc4, 0xeb, 0xc4, 0x03, 0x1a, 0x4c, 0x01, 0xf0, 0x0f, 0x01, 0x64, 0x68, + 0x4f, 0xea, 0x01, 0x21, 0x41, 0xea, 0x06, 0x31, 0x44, 0xf6, 0x0c, 0x36, + 0x04, 0xeb, 0x83, 0x03, 0x4f, 0xea, 0x11, 0x21, 0xad, 0xf8, 0x08, 0x60, + 0x8d, 0xf8, 0x0c, 0x10, 0x5b, 0x7b, 0x8d, 0xf8, 0x0c, 0x10, 0x8d, 0xf8, + 0x0b, 0x50, 0xa3, 0xf1, 0x02, 0x01, 0xb1, 0xfa, 0x81, 0xf1, 0x4f, 0xea, + 0x51, 0x11, 0x4f, 0xea, 0xc1, 0x11, 0x8d, 0xf8, 0x0d, 0x10, 0x08, 0xbf, + 0x02, 0xf0, 0x0f, 0x02, 0x03, 0x68, 0x8d, 0xf8, 0x12, 0x20, 0x01, 0xa9, + 0x80, 0x20, 0x8d, 0xf8, 0x13, 0xc0, 0x10, 0x22, 0x98, 0x47, 0x05, 0xb0, + 0xf0, 0xbd, 0x00, 0xbf, 0x48, 0xe5, 0x08, 0x00, 0xa4, 0xe5, 0x08, 0x00, + 0xbc, 0xda, 0x05, 0x00, 0xec, 0xe5, 0x05, 0x00, 0xfe, 0xb5, 0x04, 0x46, + 0x00, 0x7a, 0x03, 0x28, 0x25, 0xd0, 0x0c, 0x28, 0x35, 0xd1, 0x65, 0x7a, + 0x50, 0x2d, 0x32, 0xd3, 0x97, 0x48, 0x01, 0x21, 0x08, 0x22, 0x20, 0x23, + 0x06, 0x68, 0x40, 0xf2, 0x59, 0x10, 0xcd, 0xe9, 0x00, 0x50, 0x40, 0xf2, + 0xe7, 0x40, 0xb0, 0x47, 0x5a, 0x2d, 0x24, 0xd8, 0x15, 0x4e, 0x50, 0x3d, + 0x56, 0xf8, 0x25, 0x00, 0xf8, 0xb1, 0x14, 0x48, 0x14, 0x21, 0x22, 0x46, + 0x00, 0x23, 0x07, 0x68, 0x01, 0x20, 0xb8, 0x47, 0x56, 0xf8, 0x25, 0x10, + 0x20, 0x1d, 0x03, 0xb0, 0xbd, 0xe8, 0xf0, 0x40, 0x08, 0x47, 0x0b, 0x48, + 0x80, 0x78, 0x01, 0x28, 0x0d, 0xd1, 0x85, 0x48, 0x00, 0x21, 0x04, 0x22, + 0x15, 0x23, 0x04, 0x68, 0x40, 0xf2, 0x6b, 0x10, 0xcd, 0xe9, 0x00, 0x10, + 0x40, 0xf2, 0xe1, 0x40, 0x01, 0x21, 0xa0, 0x47, 0xfe, 0xbd, 0x20, 0x46, + 0xbd, 0xe8, 0xfe, 0x40, 0x01, 0xf0, 0xa0, 0xba, 0x74, 0x2a, 0x01, 0x00, + 0x70, 0xd1, 0x05, 0x00, 0x80, 0xe5, 0x08, 0x00, 0xbf, 0xb5, 0x04, 0x46, + 0x75, 0x48, 0x0d, 0x46, 0x00, 0x68, 0x80, 0x47, 0x03, 0x28, 0x18, 0xd1, + 0x00, 0x20, 0x02, 0x90, 0xcd, 0xe9, 0x00, 0x00, 0xa6, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x00, 0x90, 0x08, 0x48, 0x01, 0x21, 0x0c, 0x22, 0x8d, 0xf8, + 0x08, 0x50, 0x8d, 0xf8, 0x07, 0x40, 0x8d, 0xf8, 0x06, 0x10, 0x45, 0xf2, + 0x0c, 0x61, 0x03, 0x68, 0xad, 0xf8, 0x04, 0x10, 0x69, 0x46, 0x80, 0x20, + 0x98, 0x47, 0xbf, 0xbd, 0x8c, 0xe5, 0x08, 0x00, 0xfe, 0xb5, 0x04, 0x46, + 0x63, 0x48, 0x9a, 0x49, 0x00, 0x68, 0x01, 0xf2, 0x3c, 0x66, 0x80, 0x47, + 0x03, 0x28, 0x26, 0xd1, 0x60, 0x4d, 0x95, 0xf8, 0xa4, 0x02, 0xc0, 0x06, + 0x16, 0xd5, 0xa0, 0x79, 0x40, 0x07, 0x05, 0xd0, 0x20, 0x7a, 0x10, 0xf0, + 0x07, 0x00, 0x18, 0xbf, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x5a, 0x49, + 0x30, 0x70, 0x08, 0x22, 0x1f, 0x23, 0x0f, 0x68, 0x40, 0xf2, 0xa9, 0x11, + 0xcd, 0xe9, 0x00, 0x01, 0x40, 0xf2, 0xe7, 0x40, 0x01, 0x21, 0xb8, 0x47, + 0x54, 0x48, 0x90, 0xf8, 0xb7, 0x06, 0x40, 0x07, 0x44, 0xbf, 0x95, 0xf8, + 0xa5, 0x02, 0x5f, 0xea, 0x40, 0x70, 0x00, 0xf1, 0x87, 0x80, 0x20, 0x46, + 0x01, 0xf0, 0x48, 0xfa, 0x4d, 0x4f, 0x30, 0x79, 0x97, 0xf8, 0x00, 0x17, + 0x51, 0xb1, 0x68, 0xb9, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, + 0xcd, 0xe9, 0x00, 0x00, 0x01, 0x20, 0x32, 0xf0, 0x3b, 0xfa, 0x03, 0xe0, + 0x10, 0xb9, 0x01, 0x20, 0x32, 0xf0, 0xda, 0xf9, 0xe0, 0x7b, 0x10, 0x28, + 0x03, 0xd3, 0x44, 0x48, 0x90, 0xf8, 0xcd, 0x01, 0x60, 0xb3, 0x00, 0x22, + 0x70, 0x7c, 0x32, 0x74, 0x10, 0xb1, 0x00, 0x25, 0x02, 0x24, 0x48, 0xe0, + 0x3f, 0x4b, 0x40, 0x48, 0x40, 0x49, 0x1c, 0x68, 0x12, 0xb3, 0x44, 0xf0, + 0x70, 0x42, 0x01, 0x24, 0x01, 0x25, 0x1a, 0x60, 0x5a, 0x68, 0x42, 0xf0, + 0x40, 0x42, 0x5a, 0x60, 0xc2, 0x69, 0x42, 0xf4, 0xc0, 0x62, 0xc2, 0x61, + 0x02, 0x68, 0x42, 0xf4, 0x40, 0x72, 0x02, 0x60, 0x0a, 0x68, 0x42, 0xf0, + 0x70, 0x42, 0x0a, 0x60, 0x4a, 0x68, 0x42, 0xf0, 0x40, 0x42, 0x4a, 0x60, + 0xc1, 0x69, 0x41, 0xf4, 0xc0, 0x71, 0xc1, 0x61, 0x41, 0x6a, 0x41, 0xf4, + 0x40, 0x71, 0x21, 0xe0, 0x01, 0x22, 0xd1, 0xe7, 0x24, 0xf0, 0x70, 0x42, + 0x00, 0x25, 0x01, 0x24, 0x1a, 0x60, 0x5a, 0x68, 0x22, 0xf0, 0x40, 0x42, + 0x5a, 0x60, 0xc2, 0x69, 0x22, 0xf4, 0xc0, 0x62, 0xc2, 0x61, 0x02, 0x68, + 0x22, 0xf4, 0x40, 0x72, 0x02, 0x60, 0x0a, 0x68, 0x22, 0xf0, 0x70, 0x42, + 0x0a, 0x60, 0x4a, 0x68, 0x22, 0xf0, 0x40, 0x42, 0x4a, 0x60, 0xc1, 0x69, + 0x21, 0xf4, 0xc0, 0x71, 0xc1, 0x61, 0x41, 0x6a, 0x21, 0xf4, 0x40, 0x71, + 0x41, 0x62, 0x28, 0x46, 0x21, 0x46, 0x01, 0xf0, 0x65, 0xfc, 0x28, 0x46, + 0x21, 0x46, 0xff, 0xf7, 0x35, 0xff, 0x30, 0x78, 0x10, 0xb9, 0x97, 0xf8, + 0x00, 0x07, 0x38, 0xb1, 0x17, 0x49, 0x70, 0x78, 0x09, 0x7d, 0x88, 0x42, + 0x38, 0xbf, 0x01, 0x46, 0x31, 0x76, 0xfe, 0xbd, 0x30, 0x79, 0x78, 0xb1, + 0x70, 0x78, 0x0e, 0xe0, 0xe0, 0x7b, 0x10, 0xf0, 0x01, 0x00, 0x30, 0x71, + 0x03, 0xd0, 0x0a, 0x48, 0x00, 0x68, 0x80, 0x47, 0xb0, 0x60, 0xe0, 0x7b, + 0x00, 0xf0, 0x02, 0x00, 0xf0, 0x70, 0x6a, 0xe7, 0x7f, 0x20, 0x30, 0x76, + 0xfe, 0xbd, 0x00, 0xbf, 0x3c, 0xe5, 0x08, 0x00, 0x8c, 0x7e, 0x08, 0x00, + 0xec, 0x9a, 0x08, 0x00, 0x38, 0x21, 0x01, 0x00, 0xe0, 0xa0, 0x08, 0x00, + 0x00, 0x69, 0x08, 0x00, 0x28, 0xd8, 0x05, 0x30, 0x5c, 0xc0, 0x05, 0x30, + 0x28, 0xf0, 0x05, 0x30, 0xb2, 0xd0, 0x01, 0x00, 0xf8, 0xb5, 0xe3, 0x4d, + 0x04, 0x46, 0x95, 0xf8, 0x7b, 0x62, 0xff, 0xf7, 0x09, 0xf8, 0x13, 0x4f, + 0x39, 0x68, 0x4a, 0x1c, 0x02, 0x2a, 0x07, 0xd3, 0x08, 0x1a, 0x00, 0xf5, + 0x48, 0x60, 0x20, 0xf0, 0x70, 0x40, 0xb0, 0xf1, 0x00, 0x6f, 0x15, 0xd9, + 0xfe, 0xf7, 0xfa, 0xff, 0x38, 0x60, 0x20, 0x46, 0x01, 0xf0, 0x8a, 0xf9, + 0x1f, 0x48, 0x40, 0x78, 0x04, 0x28, 0x03, 0xd1, 0x08, 0x48, 0x00, 0x78, + 0x00, 0xf0, 0x12, 0xf8, 0x07, 0x48, 0x07, 0x21, 0x00, 0x78, 0xfe, 0xf7, + 0xf5, 0xff, 0x85, 0xf8, 0x7b, 0x62, 0xf8, 0xbd, 0x00, 0x20, 0x85, 0xf8, + 0x7b, 0x02, 0xe8, 0xe7, 0xec, 0xda, 0x05, 0x00, 0x9c, 0xe9, 0x01, 0x00, + 0xa5, 0x58, 0x01, 0x00, 0x1f, 0xb5, 0x04, 0x46, 0xc1, 0x48, 0x00, 0x68, + 0x80, 0x47, 0xe0, 0xb1, 0xc7, 0x48, 0x00, 0x68, 0x80, 0x47, 0x03, 0x28, + 0x17, 0xd1, 0x0c, 0x48, 0x00, 0x68, 0x80, 0x47, 0x00, 0x90, 0x0b, 0x48, + 0x45, 0xf2, 0x0c, 0x11, 0x8d, 0xf8, 0x06, 0x40, 0x10, 0x22, 0xad, 0xf8, + 0x04, 0x10, 0x01, 0x78, 0x8d, 0xf8, 0x07, 0x10, 0xd0, 0xe9, 0x01, 0x10, + 0xcd, 0xe9, 0x02, 0x10, 0xb9, 0x48, 0x69, 0x46, 0x03, 0x68, 0x80, 0x20, + 0x98, 0x47, 0x1f, 0xbd, 0xa4, 0xe5, 0x08, 0x00, 0x64, 0xd4, 0x05, 0x00, + 0x2d, 0xe9, 0xfe, 0x4f, 0xdf, 0xf8, 0xb0, 0xa2, 0x1a, 0xf8, 0x02, 0x0f, + 0x01, 0x38, 0xc0, 0xb2, 0x03, 0x28, 0x05, 0xd2, 0xc0, 0x00, 0x01, 0x21, + 0x21, 0xfa, 0x00, 0xf0, 0xbd, 0xe8, 0xfe, 0x8f, 0xa6, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x00, 0x28, 0x00, 0xf0, 0xb6, 0x80, 0xa4, 0x48, 0xa5, 0x49, + 0xdf, 0xf8, 0x94, 0x92, 0x72, 0xb6, 0x00, 0x68, 0x08, 0x60, 0xd9, 0xf8, + 0x00, 0x00, 0x40, 0x00, 0x01, 0x30, 0xc9, 0xf8, 0x00, 0x00, 0xa1, 0x48, + 0x90, 0xf8, 0x34, 0x02, 0x01, 0x28, 0x1a, 0xd1, 0xd9, 0xf8, 0x00, 0x00, + 0x00, 0x21, 0x00, 0x22, 0x4f, 0xf0, 0x00, 0x0b, 0x40, 0x08, 0xc9, 0xf8, + 0x00, 0x00, 0xd9, 0xf8, 0x00, 0x00, 0x80, 0xf3, 0x10, 0x88, 0x9a, 0x48, + 0x03, 0x68, 0x70, 0x20, 0x98, 0x47, 0x99, 0x48, 0x00, 0xf5, 0x05, 0x76, + 0x36, 0xf8, 0x44, 0x0f, 0xb1, 0x88, 0xc1, 0x42, 0x0e, 0xd1, 0x01, 0x25, + 0x79, 0xe0, 0x03, 0x20, 0x8a, 0xf8, 0x00, 0x00, 0xd9, 0xf8, 0x00, 0x00, + 0x40, 0x08, 0xc9, 0xf8, 0x00, 0x00, 0xd9, 0xf8, 0x00, 0x00, 0x80, 0xf3, + 0x10, 0x88, 0xfa, 0xe0, 0xe2, 0x49, 0x8e, 0x4f, 0xdf, 0xf8, 0x38, 0xb2, + 0x01, 0x20, 0x6f, 0xf0, 0x01, 0x08, 0x4c, 0x1c, 0x05, 0x46, 0x38, 0x68, + 0x80, 0x47, 0x03, 0x28, 0x02, 0xd1, 0x9a, 0xf8, 0x01, 0x00, 0xe0, 0xb1, + 0x9b, 0xf8, 0x00, 0x00, 0x01, 0x28, 0x06, 0xd1, 0x86, 0x48, 0x00, 0x78, + 0x18, 0xb1, 0x9a, 0xf8, 0x01, 0x00, 0x00, 0x28, 0x3f, 0xd0, 0xd4, 0x48, + 0x00, 0x88, 0x00, 0xeb, 0x80, 0x00, 0x08, 0xeb, 0x40, 0x00, 0xa0, 0x47, + 0x30, 0x88, 0xb1, 0x88, 0xaa, 0xb2, 0x01, 0x44, 0x68, 0x1c, 0x91, 0x42, + 0xde, 0xd8, 0x4f, 0xf0, 0x00, 0x0b, 0x05, 0x46, 0x3f, 0xe0, 0xdf, 0xf8, + 0xec, 0x81, 0x4f, 0xf0, 0x00, 0x0b, 0x42, 0xf2, 0x10, 0x77, 0x88, 0xf8, + 0x00, 0xb0, 0xbb, 0xf1, 0x03, 0x0f, 0x25, 0xd0, 0x72, 0xb6, 0xd9, 0xf8, + 0x00, 0x00, 0x40, 0x00, 0x01, 0x30, 0xc9, 0xf8, 0x00, 0x00, 0x73, 0x48, + 0x00, 0x68, 0x80, 0x47, 0xe8, 0xb1, 0x01, 0x20, 0x8a, 0xf8, 0x00, 0x00, + 0xd9, 0xf8, 0x00, 0x00, 0x40, 0x08, 0xc9, 0xf8, 0x00, 0x00, 0xd9, 0xf8, + 0x00, 0x00, 0x80, 0xf3, 0x10, 0x88, 0xba, 0x48, 0x00, 0x88, 0x78, 0x43, + 0x02, 0x38, 0xa0, 0x47, 0x98, 0xf8, 0x00, 0x00, 0x0b, 0xf1, 0x01, 0x0b, + 0x01, 0x28, 0xda, 0xd1, 0x11, 0xe0, 0x4f, 0xf0, 0x00, 0x0b, 0x0e, 0xe0, + 0x4f, 0xf0, 0x03, 0x0b, 0x0b, 0xe0, 0x03, 0x20, 0x8a, 0xf8, 0x00, 0x00, + 0xd9, 0xf8, 0x00, 0x00, 0x40, 0x08, 0xc9, 0xf8, 0x00, 0x00, 0xd9, 0xf8, + 0x00, 0x00, 0x80, 0xf3, 0x10, 0x88, 0x30, 0x88, 0xb1, 0x88, 0x08, 0x44, + 0xa9, 0xb2, 0x88, 0x42, 0x02, 0xd8, 0x57, 0x48, 0x01, 0x21, 0x01, 0x70, + 0x9a, 0xf8, 0x00, 0x00, 0x00, 0x28, 0x75, 0xd0, 0x03, 0x28, 0x00, 0xd1, + 0x7d, 0xe0, 0x70, 0x88, 0x00, 0x28, 0x5a, 0xd0, 0xa2, 0x48, 0x51, 0x4c, + 0x01, 0x25, 0x00, 0xf1, 0x01, 0x09, 0x96, 0xf8, 0x20, 0x00, 0x18, 0xb1, + 0x44, 0x48, 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, 0x9b, 0x48, 0x6f, 0xf0, + 0x01, 0x01, 0x00, 0x88, 0x00, 0xeb, 0x80, 0x00, 0x01, 0xeb, 0x40, 0x00, + 0xc8, 0x47, 0x20, 0x78, 0x02, 0x28, 0x3a, 0xd0, 0x01, 0x28, 0x67, 0xd0, + 0x70, 0x88, 0x1f, 0xfa, 0x85, 0xf8, 0xb8, 0xeb, 0x50, 0x0f, 0x2d, 0xd1, + 0x43, 0x48, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x07, 0x68, 0x48, 0xf2, + 0x68, 0x00, 0xb8, 0x47, 0x40, 0x48, 0x01, 0x21, 0x04, 0x22, 0x1e, 0x23, + 0x07, 0x68, 0x00, 0x20, 0x00, 0x90, 0x40, 0xf2, 0xf2, 0x20, 0x01, 0x90, + 0x40, 0xf2, 0xe1, 0x40, 0xb8, 0x47, 0xbb, 0xf1, 0x05, 0x0f, 0x15, 0xd8, + 0x5f, 0x46, 0x36, 0x48, 0x00, 0x68, 0x80, 0x47, 0xd0, 0xb3, 0x83, 0x48, + 0x42, 0xf2, 0x10, 0x71, 0x00, 0x88, 0x48, 0x43, 0x02, 0x38, 0xc8, 0x47, + 0x20, 0x78, 0x01, 0x28, 0x05, 0xd0, 0x07, 0xf1, 0x01, 0x0b, 0x05, 0x2f, + 0x5f, 0x46, 0xec, 0xd3, 0x00, 0xe0, 0xbb, 0x46, 0x70, 0x88, 0x01, 0x35, + 0x80, 0x45, 0xb2, 0xd3, 0x07, 0xe0, 0x2a, 0x48, 0x00, 0x21, 0x00, 0x22, + 0x00, 0x23, 0x04, 0x68, 0x48, 0xf2, 0x61, 0x00, 0xa0, 0x47, 0x24, 0x48, + 0x00, 0x78, 0x02, 0x28, 0x0b, 0xd0, 0x24, 0x48, 0x00, 0x21, 0x00, 0x22, + 0x00, 0x23, 0x04, 0x68, 0x48, 0xf2, 0x62, 0x00, 0xa0, 0x47, 0x6d, 0x48, + 0x81, 0x78, 0x01, 0x31, 0x81, 0x70, 0x20, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x01, 0x28, 0x07, 0xd1, 0xea, 0x48, 0x00, 0x68, 0x80, 0x47, 0x03, 0x28, + 0x04, 0xbf, 0x01, 0x20, 0xbd, 0xe8, 0xfe, 0x8f, 0x03, 0x20, 0x8a, 0xf8, + 0x00, 0x00, 0x0e, 0x48, 0x01, 0x68, 0x01, 0x20, 0x03, 0xb0, 0xbd, 0xe8, + 0xf0, 0x4f, 0x08, 0x47, 0x12, 0x48, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, + 0x04, 0x68, 0x48, 0xf2, 0x60, 0x00, 0xa0, 0x47, 0x02, 0x20, 0xec, 0xe7, + 0x74, 0x2a, 0x01, 0x00, 0x48, 0xe5, 0x08, 0x00, 0xac, 0xfd, 0x08, 0x00, + 0xa0, 0xe9, 0x01, 0x00, 0x24, 0x36, 0x01, 0x00, 0x38, 0x21, 0x01, 0x00, + 0xa8, 0xfd, 0x08, 0x00, 0x8c, 0xe5, 0x08, 0x00, 0x8c, 0x7e, 0x08, 0x00, + 0x3c, 0xe5, 0x08, 0x00, 0xa6, 0x58, 0x01, 0x00, 0xf0, 0xda, 0x05, 0x00, + 0x60, 0x14, 0x01, 0x00, 0xb0, 0xfd, 0x08, 0x00, 0x78, 0x9b, 0x08, 0x00, + 0xec, 0x9a, 0x08, 0x00, 0x90, 0xe5, 0x08, 0x00, 0xf8, 0xb5, 0xd5, 0x4d, + 0xa8, 0x78, 0x18, 0xb1, 0xbd, 0xe8, 0xf8, 0x40, 0xff, 0xf7, 0x7a, 0xbe, + 0xc5, 0x4e, 0x30, 0x68, 0x80, 0x47, 0xc5, 0x4f, 0x78, 0x60, 0xff, 0xf7, + 0x73, 0xfe, 0x04, 0x46, 0xa8, 0x78, 0x38, 0x70, 0x30, 0x68, 0x80, 0x47, + 0xb8, 0x60, 0x20, 0x46, 0xf8, 0xbd, 0x00, 0xbf, 0xf0, 0xb5, 0x85, 0xb0, + 0x05, 0x46, 0xbc, 0x48, 0x00, 0x68, 0x80, 0x47, 0xbb, 0x4e, 0xc6, 0x4f, + 0x04, 0x46, 0x01, 0x2d, 0xc6, 0xf8, 0x68, 0x01, 0xb8, 0x78, 0x70, 0x70, + 0x12, 0xd1, 0x30, 0x78, 0x01, 0x28, 0x03, 0xd0, 0x34, 0x48, 0xc0, 0x78, + 0x02, 0x28, 0x0b, 0xd3, 0x01, 0x20, 0xff, 0xf7, 0x29, 0xfe, 0x32, 0x48, + 0x44, 0xf6, 0x20, 0x61, 0x00, 0x88, 0x48, 0x43, 0x30, 0x49, 0x02, 0x38, + 0x01, 0x31, 0x88, 0x47, 0x2f, 0x48, 0x90, 0xf8, 0x34, 0x02, 0x01, 0x28, + 0x34, 0xd1, 0x02, 0x20, 0x06, 0xf2, 0x65, 0x15, 0x01, 0x94, 0x8d, 0xf8, + 0x08, 0x00, 0x00, 0x20, 0x04, 0x90, 0x96, 0xf8, 0x62, 0x01, 0x8d, 0xf8, + 0x09, 0x00, 0xb8, 0x78, 0x8d, 0xf8, 0x0a, 0x00, 0xa4, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x8d, 0xf8, 0x0b, 0x00, 0x28, 0x78, 0x14, 0x21, 0x03, 0x94, + 0x01, 0xac, 0x10, 0x23, 0x22, 0x46, 0xb0, 0xfb, 0xf1, 0xf1, 0x01, 0xeb, + 0x81, 0x01, 0xa0, 0xeb, 0x81, 0x00, 0x10, 0x21, 0x06, 0xeb, 0x00, 0x10, + 0x00, 0xf5, 0x03, 0x70, 0xfe, 0xf7, 0xd6, 0xfd, 0x28, 0x78, 0x21, 0x46, + 0x10, 0x22, 0x01, 0x30, 0x28, 0x70, 0x96, 0xf8, 0x62, 0x01, 0x01, 0x30, + 0x86, 0xf8, 0x62, 0x01, 0x94, 0x48, 0x03, 0x68, 0x80, 0x20, 0x98, 0x47, + 0x9c, 0x49, 0x00, 0x20, 0xb8, 0x70, 0x08, 0x60, 0x11, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x11, 0x48, 0x00, 0x68, 0x80, 0x47, 0x10, 0x48, 0x00, 0x68, + 0xc6, 0xf8, 0x4c, 0x01, 0x0f, 0x48, 0x00, 0x68, 0xc6, 0xf8, 0x50, 0x01, + 0x0e, 0x48, 0x00, 0x68, 0xc6, 0xf8, 0x54, 0x01, 0x0d, 0x48, 0x00, 0x68, + 0xc6, 0xf8, 0x58, 0x01, 0x0c, 0x48, 0x00, 0x68, 0xc6, 0xf8, 0x5c, 0x01, + 0x05, 0xb0, 0xf0, 0xbd, 0x9c, 0xe9, 0x01, 0x00, 0x34, 0xec, 0x01, 0x00, + 0x40, 0xec, 0x01, 0x00, 0x38, 0x21, 0x01, 0x00, 0x70, 0xe5, 0x08, 0x00, + 0x50, 0xe5, 0x08, 0x00, 0x30, 0x60, 0x00, 0x40, 0x14, 0x50, 0x00, 0x40, + 0x14, 0x60, 0x00, 0x40, 0x1c, 0x50, 0x00, 0x40, 0x1c, 0x60, 0x00, 0x40, + 0x2d, 0xe9, 0xf0, 0x41, 0x86, 0xb0, 0x0d, 0xf1, 0x04, 0x08, 0x05, 0x46, + 0x14, 0x21, 0x40, 0x46, 0x00, 0xf0, 0x1c, 0xff, 0x16, 0x4f, 0x70, 0x49, + 0x2c, 0x79, 0x6e, 0x79, 0x2a, 0x46, 0x10, 0x23, 0x38, 0x78, 0x14, 0x28, + 0x24, 0xbf, 0x00, 0x20, 0x38, 0x70, 0x01, 0xeb, 0x00, 0x10, 0x10, 0x21, + 0x0c, 0x30, 0xfe, 0xf7, 0x77, 0xfd, 0x38, 0x78, 0x0c, 0x2c, 0x00, 0xf1, + 0x01, 0x00, 0x38, 0x70, 0x08, 0xbf, 0x03, 0x2e, 0x03, 0xd0, 0x28, 0x46, + 0x00, 0xf0, 0x06, 0xff, 0x0d, 0xe0, 0x80, 0x20, 0x10, 0x21, 0x2a, 0x46, + 0x10, 0x23, 0x8d, 0xf8, 0x04, 0x00, 0x08, 0xf1, 0x04, 0x00, 0xfe, 0xf7, + 0x61, 0xfd, 0x04, 0x48, 0x01, 0x68, 0x40, 0x46, 0x88, 0x47, 0x06, 0xb0, + 0xbd, 0xe8, 0xf0, 0x81, 0xf1, 0xda, 0x05, 0x00, 0xa0, 0x9a, 0x08, 0x00, + 0xf0, 0xb5, 0x85, 0xb0, 0x9f, 0x48, 0x90, 0xf8, 0x34, 0x02, 0x01, 0x28, + 0x45, 0xd1, 0x53, 0x48, 0x00, 0x68, 0x80, 0x47, 0x52, 0x4f, 0x04, 0x46, + 0x01, 0x90, 0x00, 0x26, 0x04, 0x96, 0x8d, 0xf8, 0x08, 0x60, 0x97, 0xf8, + 0x60, 0x01, 0x8d, 0xf8, 0x09, 0x00, 0x58, 0x48, 0x80, 0x78, 0x8d, 0xf8, + 0x0a, 0x00, 0x4c, 0x48, 0x00, 0x68, 0x80, 0x47, 0x8d, 0xf8, 0x0b, 0x00, + 0x97, 0xf8, 0x65, 0x01, 0x14, 0x21, 0x01, 0xad, 0x10, 0x23, 0x03, 0x94, + 0x2a, 0x46, 0xb0, 0xfb, 0xf1, 0xf1, 0x01, 0xeb, 0x81, 0x01, 0xa0, 0xeb, + 0x81, 0x00, 0x10, 0x21, 0x07, 0xeb, 0x00, 0x10, 0x00, 0xf5, 0x03, 0x70, + 0xfe, 0xf7, 0x24, 0xfd, 0x97, 0xf8, 0x60, 0x01, 0x97, 0xf8, 0x65, 0x11, + 0x00, 0x22, 0x00, 0x23, 0x00, 0x96, 0x01, 0x24, 0x01, 0x30, 0x01, 0x31, + 0x87, 0xf8, 0x60, 0x01, 0x36, 0x48, 0x87, 0xf8, 0x65, 0x11, 0x01, 0x21, + 0x07, 0x68, 0x48, 0xf2, 0x63, 0x00, 0xb8, 0x47, 0x36, 0x48, 0x29, 0x46, + 0x10, 0x22, 0x03, 0x68, 0x80, 0x20, 0x98, 0x47, 0x09, 0xe0, 0x2f, 0x48, + 0x00, 0x24, 0x01, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x94, 0x05, 0x68, + 0x48, 0xf2, 0x64, 0x00, 0xa8, 0x47, 0x20, 0x46, 0x05, 0xb0, 0xf0, 0xbd, + 0xb0, 0xb5, 0x86, 0xb0, 0x72, 0x48, 0x90, 0xf8, 0x34, 0x02, 0x01, 0x28, + 0x3d, 0xd1, 0x26, 0x48, 0x00, 0x68, 0x80, 0x47, 0x04, 0x46, 0x00, 0x20, + 0x24, 0x4d, 0x05, 0x90, 0x07, 0x20, 0x02, 0x94, 0x8d, 0xf8, 0x0c, 0x00, + 0x95, 0xf8, 0x61, 0x01, 0x8d, 0xf8, 0x0d, 0x00, 0x2a, 0x48, 0x80, 0x78, + 0x8d, 0xf8, 0x0e, 0x00, 0x1e, 0x48, 0x00, 0x68, 0x80, 0x47, 0x8d, 0xf8, + 0x0f, 0x00, 0x95, 0xf8, 0x65, 0x01, 0x14, 0x21, 0x04, 0x94, 0x02, 0xac, + 0x10, 0x23, 0x22, 0x46, 0xb0, 0xfb, 0xf1, 0xf1, 0x01, 0xeb, 0x81, 0x01, + 0xa0, 0xeb, 0x81, 0x00, 0x10, 0x21, 0x05, 0xeb, 0x00, 0x10, 0x00, 0xf5, + 0x03, 0x70, 0xfe, 0xf7, 0xc9, 0xfc, 0x95, 0xf8, 0x61, 0x01, 0x95, 0xf8, + 0x65, 0x11, 0x10, 0x22, 0x01, 0x30, 0x01, 0x31, 0x85, 0xf8, 0x61, 0x01, + 0x0e, 0x48, 0x85, 0xf8, 0x65, 0x11, 0x21, 0x46, 0x03, 0x68, 0x80, 0x20, + 0x98, 0x47, 0x01, 0x24, 0x09, 0xe0, 0x06, 0x48, 0x00, 0x24, 0x01, 0x21, + 0x00, 0x22, 0x00, 0x23, 0x00, 0x94, 0x05, 0x68, 0x48, 0xf2, 0x64, 0x00, + 0xa8, 0x47, 0x20, 0x46, 0x06, 0xb0, 0xb0, 0xbd, 0xa0, 0xa0, 0x08, 0x00, + 0xa4, 0xe5, 0x08, 0x00, 0x64, 0xd4, 0x05, 0x00, 0x3c, 0xe5, 0x08, 0x00, + 0x8c, 0xe5, 0x08, 0x00, 0x80, 0xb5, 0x08, 0x48, 0x01, 0x68, 0x49, 0xb1, + 0x05, 0x48, 0x80, 0x78, 0x03, 0x28, 0x05, 0xd1, 0x02, 0x20, 0x88, 0x47, + 0xbd, 0xe8, 0x80, 0x40, 0xff, 0xf7, 0x96, 0xbf, 0x80, 0xbd, 0x00, 0xbf, + 0x74, 0x2a, 0x01, 0x00, 0xa0, 0xe9, 0x01, 0x00, 0x70, 0xb5, 0xe4, 0x48, + 0x90, 0xf8, 0x55, 0x02, 0xd0, 0xb3, 0x39, 0x48, 0xd0, 0xf8, 0xac, 0x05, + 0x02, 0x46, 0x41, 0x79, 0x12, 0xf8, 0x04, 0x3f, 0x43, 0xea, 0x01, 0x21, + 0x93, 0x78, 0xd2, 0x78, 0x43, 0xea, 0x02, 0x22, 0x41, 0xea, 0x02, 0x41, + 0x81, 0x42, 0x29, 0xd0, 0xb1, 0x4a, 0x16, 0x4b, 0x11, 0xf8, 0x0a, 0x4c, + 0x16, 0x2c, 0x16, 0xd8, 0x04, 0xeb, 0x44, 0x05, 0x52, 0xf8, 0x25, 0x50, + 0x8d, 0xb1, 0x04, 0xeb, 0x44, 0x05, 0x02, 0xeb, 0x85, 0x05, 0x2d, 0x79, + 0x05, 0x3d, 0x01, 0x2d, 0x09, 0xd8, 0x04, 0xeb, 0xc4, 0x04, 0x03, 0xeb, + 0x44, 0x04, 0xe4, 0x79, 0x04, 0xf0, 0x03, 0x04, 0x01, 0x3c, 0x02, 0x2c, + 0x0e, 0xd3, 0x11, 0xf8, 0x04, 0x4f, 0x4d, 0x78, 0x8e, 0x78, 0xc9, 0x78, + 0x44, 0xea, 0x05, 0x24, 0x46, 0xea, 0x01, 0x21, 0x44, 0xea, 0x01, 0x41, + 0x81, 0x42, 0xd7, 0xd1, 0x00, 0x20, 0x70, 0xbd, 0x01, 0x20, 0x70, 0xbd, + 0x44, 0x28, 0x01, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0xe3, 0xfd, 0xc0, 0x49, + 0x91, 0xf8, 0x7a, 0x12, 0xb0, 0xeb, 0x41, 0x0f, 0x06, 0xd9, 0x29, 0xb1, + 0x03, 0x4a, 0x92, 0xf8, 0x20, 0x20, 0x01, 0x2a, 0x08, 0xbf, 0x48, 0x00, + 0x80, 0xbd, 0x00, 0xbf, 0x8c, 0xe6, 0x05, 0x00, 0x70, 0xb5, 0x06, 0x46, + 0x0d, 0x48, 0x0d, 0x46, 0x14, 0x46, 0x90, 0xf8, 0x32, 0x12, 0x29, 0xb9, + 0x06, 0xf0, 0xfc, 0x01, 0x18, 0x29, 0x08, 0xbf, 0x01, 0x2c, 0x06, 0xd0, + 0x30, 0x46, 0x29, 0x46, 0x22, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x00, 0xf0, + 0xc3, 0xbd, 0x90, 0xf8, 0x33, 0x02, 0x00, 0x28, 0xf4, 0xd1, 0x03, 0x48, + 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, 0xef, 0xe7, 0x38, 0x21, 0x01, 0x00, + 0x88, 0xe5, 0x08, 0x00, 0x06, 0x28, 0x04, 0xbf, 0x01, 0x20, 0x70, 0x47, + 0xff, 0x28, 0x09, 0xd1, 0x0f, 0x20, 0x0a, 0x29, 0x07, 0xd1, 0xad, 0x2a, + 0x08, 0xbf, 0x05, 0x20, 0x01, 0x2a, 0x08, 0xbf, 0x03, 0x20, 0x70, 0x47, + 0x00, 0x20, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x43, 0x05, 0x46, 0x55, 0x48, + 0x88, 0x46, 0x95, 0xf8, 0x1d, 0x41, 0x07, 0x68, 0x68, 0x6b, 0x82, 0x89, + 0x41, 0x89, 0x40, 0x7a, 0xff, 0xf7, 0xe0, 0xff, 0x25, 0x4a, 0x04, 0xeb, + 0x44, 0x01, 0x02, 0xeb, 0x81, 0x06, 0x02, 0xf8, 0x21, 0x00, 0x95, 0xf8, + 0x47, 0x11, 0x70, 0x78, 0x01, 0xf0, 0x0f, 0x01, 0x00, 0xf0, 0xf0, 0x00, + 0x08, 0x44, 0x70, 0x70, 0x95, 0xf8, 0x51, 0x01, 0x41, 0xea, 0x00, 0x10, + 0x70, 0x70, 0xc4, 0xeb, 0x04, 0x10, 0x07, 0xeb, 0x40, 0x17, 0xb8, 0x78, + 0xf0, 0x71, 0x19, 0x48, 0x00, 0x88, 0x08, 0xb9, 0xb5, 0xf8, 0x34, 0x01, + 0x70, 0x80, 0xb5, 0xf8, 0x36, 0x01, 0xdf, 0xf8, 0x58, 0x90, 0x16, 0x4c, + 0xb0, 0x80, 0x78, 0x78, 0xd9, 0xf8, 0x04, 0x10, 0xc0, 0xeb, 0xc0, 0x00, + 0x01, 0xeb, 0x80, 0x00, 0xd0, 0xe9, 0x04, 0x10, 0x81, 0x42, 0x38, 0xbf, + 0x01, 0x46, 0xb1, 0x71, 0x95, 0xf8, 0x4a, 0x01, 0x21, 0x68, 0x88, 0x47, + 0x70, 0x72, 0x21, 0x68, 0x95, 0xf8, 0x54, 0x01, 0x88, 0x47, 0x79, 0x78, + 0xd9, 0xf8, 0x04, 0x20, 0xb0, 0x72, 0x01, 0x20, 0x86, 0xf8, 0x0b, 0x80, + 0x30, 0x72, 0xc1, 0xeb, 0xc1, 0x01, 0x02, 0xeb, 0x81, 0x01, 0x08, 0x73, + 0xbd, 0xe8, 0xf8, 0x83, 0xbc, 0xda, 0x05, 0x00, 0x7e, 0xe5, 0x05, 0x00, + 0xec, 0xe5, 0x05, 0x00, 0x68, 0xe5, 0x08, 0x00, 0x2d, 0xe9, 0xfe, 0x43, + 0x43, 0x4c, 0x05, 0x46, 0x01, 0xeb, 0x41, 0x00, 0xdd, 0xf8, 0x30, 0x80, + 0x54, 0xf8, 0x20, 0x40, 0x0b, 0x98, 0xcd, 0xf8, 0x08, 0x80, 0x01, 0x90, + 0x0a, 0x98, 0x00, 0x90, 0x28, 0x46, 0x00, 0xf0, 0x35, 0xfd, 0x14, 0x2d, + 0x33, 0xd1, 0x1b, 0x48, 0x94, 0xf8, 0x1d, 0x11, 0xdf, 0xf8, 0x68, 0x90, + 0x00, 0x68, 0xc1, 0xeb, 0x01, 0x11, 0xd9, 0xf8, 0x00, 0x20, 0x00, 0xeb, + 0x41, 0x15, 0x01, 0x21, 0x28, 0x46, 0x90, 0x47, 0xc1, 0x4f, 0x69, 0x78, + 0x4f, 0xf4, 0x7a, 0x76, 0xb0, 0xfb, 0xf6, 0xf0, 0x7a, 0x68, 0xc1, 0xeb, + 0xc1, 0x01, 0x02, 0xeb, 0x81, 0x01, 0xd9, 0xf8, 0x00, 0x20, 0x08, 0x61, + 0x28, 0x46, 0x00, 0x21, 0x90, 0x47, 0x69, 0x78, 0x7a, 0x68, 0xb0, 0xfb, + 0xf6, 0xf0, 0xc1, 0xeb, 0xc1, 0x01, 0x02, 0xeb, 0x81, 0x01, 0x48, 0x61, + 0x20, 0x46, 0x01, 0x21, 0xff, 0xf7, 0x5c, 0xff, 0xb8, 0xf1, 0x01, 0x0f, + 0x03, 0xd1, 0x05, 0x48, 0x4f, 0xf0, 0xff, 0x31, 0x01, 0x60, 0xbd, 0xe8, + 0xfe, 0x83, 0x00, 0xbf, 0xe0, 0x35, 0x01, 0x00, 0x00, 0x9e, 0x08, 0x00, + 0x6c, 0xd1, 0x05, 0x00, 0x70, 0xb5, 0x05, 0x46, 0x80, 0x79, 0x0c, 0x46, + 0x02, 0x28, 0x29, 0xd1, 0x28, 0x7a, 0x01, 0x28, 0x26, 0xd1, 0x68, 0x79, + 0x05, 0x28, 0x23, 0xd1, 0xe8, 0x79, 0x16, 0x28, 0x20, 0xd8, 0x14, 0x49, + 0x00, 0xeb, 0x40, 0x02, 0x51, 0xf8, 0x22, 0x60, 0xd6, 0xb1, 0x00, 0xeb, + 0x40, 0x00, 0x01, 0xeb, 0x80, 0x00, 0x00, 0x79, 0x01, 0x28, 0x13, 0xd1, + 0x0e, 0x48, 0x01, 0x68, 0x30, 0x46, 0x88, 0x47, 0xb0, 0xfa, 0x80, 0xf0, + 0x19, 0x21, 0x40, 0x09, 0xe8, 0x72, 0x7e, 0x48, 0x02, 0x68, 0x30, 0x46, + 0x90, 0x47, 0x28, 0xb1, 0x08, 0x48, 0x41, 0x78, 0x21, 0xf0, 0x03, 0x01, + 0xa9, 0x73, 0x41, 0x70, 0x62, 0x48, 0x29, 0x46, 0x22, 0x46, 0x03, 0x68, + 0x80, 0x20, 0xbd, 0xe8, 0x70, 0x40, 0x18, 0x47, 0xe8, 0x72, 0x01, 0x00, + 0x54, 0x9d, 0x08, 0x00, 0x50, 0x2e, 0x01, 0x00, 0x1f, 0xb5, 0xe7, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x03, 0x28, 0x3e, 0xd1, 0xe5, 0x48, 0x00, 0x24, + 0xcd, 0xe9, 0x02, 0x44, 0xcd, 0xe9, 0x00, 0x44, 0x00, 0x68, 0x80, 0x47, + 0x00, 0x90, 0x1b, 0x48, 0x44, 0xf2, 0x0c, 0x11, 0xad, 0xf8, 0x04, 0x10, + 0x00, 0x78, 0x68, 0xb1, 0x18, 0x48, 0x90, 0xf8, 0xd4, 0x1d, 0x18, 0x48, + 0x90, 0xf8, 0xb8, 0x05, 0x00, 0x29, 0x00, 0xf0, 0x01, 0x00, 0x01, 0x46, + 0x1c, 0xbf, 0x03, 0x21, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x21, + 0x8d, 0xf8, 0x08, 0x10, 0xa9, 0x49, 0x40, 0xea, 0x80, 0x00, 0x8d, 0xf8, + 0x09, 0x40, 0x8d, 0xf8, 0x07, 0x40, 0x91, 0xf8, 0x3e, 0x16, 0x8d, 0xf8, + 0x0a, 0x10, 0x17, 0x49, 0x09, 0x78, 0x01, 0xf0, 0x01, 0x02, 0x01, 0xf0, + 0x02, 0x01, 0x40, 0xea, 0x42, 0x00, 0x0c, 0x22, 0x40, 0xea, 0x81, 0x00, + 0x69, 0x46, 0x8d, 0xf8, 0x06, 0x00, 0x3b, 0x48, 0x03, 0x68, 0x80, 0x20, + 0x98, 0x47, 0x1f, 0xbd, 0x53, 0xf1, 0x05, 0x00, 0x00, 0x69, 0x08, 0x00, + 0x8c, 0x7e, 0x08, 0x00, 0x10, 0xb5, 0x04, 0x46, 0xc0, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x03, 0x28, 0x0c, 0xd1, 0xe1, 0x79, 0x06, 0x4b, 0xa0, 0x79, + 0x22, 0x7a, 0x59, 0x70, 0x19, 0x78, 0x00, 0xf0, 0x03, 0x00, 0x9a, 0x70, + 0x01, 0xf0, 0xfc, 0x01, 0x08, 0x44, 0x18, 0x70, 0x10, 0xbd, 0x00, 0xbf, + 0xf2, 0xda, 0x05, 0x00, 0x7f, 0xb5, 0x00, 0x28, 0x45, 0xd0, 0x0d, 0x46, + 0x00, 0x29, 0x42, 0xd0, 0x04, 0x46, 0x00, 0x20, 0xcd, 0xe9, 0x02, 0x00, + 0xcd, 0xe9, 0x00, 0x00, 0xb0, 0x48, 0x00, 0x68, 0x80, 0x47, 0x20, 0x4e, + 0x00, 0x90, 0x45, 0xf2, 0x0c, 0x21, 0xad, 0xf8, 0x04, 0x10, 0x30, 0x78, + 0x10, 0xb1, 0x1d, 0x49, 0x09, 0x88, 0x69, 0xb3, 0x00, 0xeb, 0xc0, 0x01, + 0x6a, 0x1a, 0x1a, 0x4d, 0x93, 0xb2, 0x2a, 0x80, 0x02, 0xf0, 0x0f, 0x02, + 0x09, 0x2b, 0x4f, 0xf0, 0x09, 0x03, 0x88, 0xbf, 0x0f, 0x22, 0x42, 0xea, + 0x00, 0x10, 0x62, 0x18, 0x6c, 0x46, 0x8d, 0xf8, 0x06, 0x00, 0x09, 0x21, + 0xe0, 0x1d, 0xfe, 0xf7, 0x77, 0xfa, 0x11, 0x48, 0x21, 0x46, 0x10, 0x22, + 0x03, 0x68, 0x80, 0x20, 0x98, 0x47, 0x30, 0x78, 0x01, 0x30, 0x30, 0x70, + 0x28, 0x88, 0x08, 0x28, 0x0a, 0xd8, 0x00, 0x24, 0x2c, 0x80, 0x0b, 0x4d, + 0x34, 0x70, 0xe8, 0x7b, 0x20, 0xb1, 0x0a, 0x48, 0x01, 0x68, 0x42, 0x20, + 0x88, 0x47, 0xec, 0x73, 0x7f, 0xbd, 0x04, 0x48, 0x00, 0x21, 0x01, 0x80, + 0x01, 0x48, 0x01, 0x70, 0x7f, 0xbd, 0x00, 0xbf, 0xf5, 0xda, 0x05, 0x00, + 0xf6, 0xda, 0x05, 0x00, 0x8c, 0xe5, 0x08, 0x00, 0x90, 0xdb, 0x05, 0x00, + 0x30, 0x9d, 0x08, 0x00, 0x2d, 0xe9, 0xfe, 0x43, 0xf0, 0xb1, 0x05, 0x46, + 0x0f, 0x48, 0x1c, 0x46, 0x16, 0x46, 0x0f, 0x46, 0x00, 0x68, 0x80, 0x47, + 0xb0, 0xb1, 0x0d, 0x48, 0xdd, 0xe9, 0x0a, 0x98, 0x1a, 0x21, 0x02, 0x68, + 0x28, 0x46, 0x90, 0x47, 0x30, 0xb1, 0x95, 0xf8, 0x35, 0x11, 0xcd, 0xe9, + 0x00, 0x98, 0x28, 0x46, 0x65, 0x22, 0x04, 0xe0, 0x28, 0x46, 0x39, 0x46, + 0x32, 0x46, 0xcd, 0xe9, 0x00, 0x98, 0x23, 0x46, 0x00, 0xf0, 0xde, 0xfb, + 0xbd, 0xe8, 0xfe, 0x83, 0x48, 0xe5, 0x08, 0x00, 0x0c, 0xbb, 0x08, 0x00, + 0xf8, 0xb5, 0x04, 0x46, 0x80, 0x79, 0xe6, 0x79, 0x25, 0x7b, 0x16, 0xf0, + 0xc0, 0x0f, 0x03, 0xd0, 0x12, 0x49, 0x09, 0x68, 0x88, 0x47, 0x03, 0xe0, + 0x11, 0x49, 0x0a, 0x68, 0x00, 0x21, 0x90, 0x47, 0xd0, 0xb1, 0xf1, 0x07, + 0x18, 0xd1, 0xc6, 0xf3, 0x41, 0x02, 0xdf, 0xf8, 0x38, 0xc0, 0x04, 0xf1, + 0x08, 0x01, 0x00, 0x23, 0x92, 0x00, 0x25, 0xfa, 0x03, 0xf6, 0xf6, 0x07, + 0x09, 0xd0, 0x44, 0x78, 0xdc, 0xf8, 0x04, 0x70, 0xce, 0x5c, 0xc4, 0xeb, + 0xc4, 0x04, 0x07, 0xeb, 0x84, 0x04, 0x14, 0x44, 0xe6, 0x54, 0x01, 0x33, + 0x04, 0x2b, 0xee, 0xd1, 0xf8, 0xbd, 0x00, 0xbf, 0x10, 0xb6, 0x08, 0x00, + 0xfc, 0x9b, 0x08, 0x00, 0xec, 0xe5, 0x05, 0x00, 0x01, 0x46, 0x80, 0x79, + 0x0a, 0x7a, 0x01, 0x2a, 0x0a, 0xd0, 0x32, 0xbb, 0xc9, 0x79, 0x40, 0x28, + 0x0d, 0xd8, 0xda, 0x4a, 0x02, 0x44, 0x82, 0xf8, 0x14, 0x12, 0x26, 0x49, + 0x09, 0x68, 0x08, 0x47, 0x40, 0x28, 0x0d, 0xd8, 0xd5, 0x49, 0x01, 0x44, + 0x91, 0xf8, 0x14, 0x12, 0x11, 0xe0, 0x44, 0x28, 0x13, 0xd8, 0x1f, 0x4a, + 0x41, 0x38, 0x52, 0xfa, 0x80, 0xf0, 0x80, 0xf8, 0xec, 0x10, 0x0c, 0xe0, + 0x44, 0x28, 0x0a, 0xd8, 0x1a, 0x4a, 0xa0, 0xf1, 0x41, 0x01, 0x52, 0xfa, + 0x81, 0xf1, 0x91, 0xf8, 0xec, 0x10, 0x02, 0x4a, 0x13, 0x68, 0x02, 0x22, + 0x18, 0x47, 0x70, 0x47, 0x90, 0x96, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x41, + 0x04, 0x46, 0x41, 0x48, 0x00, 0x68, 0x80, 0x47, 0x03, 0x28, 0x1c, 0xd1, + 0xc2, 0x4e, 0x10, 0x4f, 0xdf, 0xf8, 0x38, 0x80, 0x06, 0x34, 0x00, 0x25, + 0x20, 0x78, 0xff, 0x28, 0x13, 0xd0, 0x61, 0x78, 0x40, 0x28, 0x05, 0xd8, + 0x32, 0x18, 0x82, 0xf8, 0x14, 0x12, 0x39, 0x68, 0x88, 0x47, 0x06, 0xe0, + 0x44, 0x28, 0x9e, 0xbf, 0x41, 0x38, 0x58, 0xfa, 0x80, 0xf0, 0x80, 0xf8, + 0xec, 0x10, 0x01, 0x35, 0x02, 0x34, 0x05, 0x2d, 0xe8, 0xd1, 0xbd, 0xe8, + 0xf0, 0x81, 0x00, 0xbf, 0x04, 0x31, 0x06, 0x00, 0x8c, 0x96, 0x08, 0x00, + 0x80, 0x79, 0x02, 0x49, 0x81, 0xf8, 0x3d, 0x06, 0x70, 0x47, 0x00, 0xbf, + 0x64, 0xd4, 0x05, 0x00, 0x7f, 0xb5, 0x04, 0x46, 0x27, 0x48, 0x0d, 0x46, + 0x00, 0x68, 0x80, 0x47, 0x03, 0x28, 0x47, 0xd1, 0x00, 0x20, 0xcd, 0xe9, + 0x02, 0x00, 0x24, 0x48, 0x00, 0x68, 0x80, 0x47, 0x43, 0xf6, 0x0c, 0x11, + 0x00, 0x90, 0x04, 0xeb, 0x44, 0x00, 0x8d, 0xf8, 0x07, 0x50, 0x8d, 0xf8, + 0x06, 0x40, 0xad, 0xf8, 0x04, 0x10, 0xa2, 0x49, 0x01, 0xeb, 0x80, 0x00, + 0x01, 0x79, 0x05, 0x29, 0x16, 0xd0, 0x01, 0x29, 0x28, 0xd1, 0x00, 0x68, + 0x30, 0xb3, 0x90, 0xf8, 0x88, 0x04, 0x80, 0x07, 0x22, 0xd5, 0x72, 0x48, + 0x72, 0x49, 0xd0, 0xe9, 0x01, 0x45, 0x20, 0x46, 0x00, 0xf0, 0x18, 0xfb, + 0x06, 0x46, 0x20, 0x46, 0x29, 0x46, 0x00, 0xf0, 0x19, 0xfb, 0x01, 0x46, + 0x30, 0x46, 0x0d, 0xe0, 0x05, 0x68, 0x8d, 0xb1, 0xd5, 0xf8, 0xac, 0x01, + 0x69, 0x49, 0x00, 0xf0, 0x09, 0xfb, 0x04, 0x46, 0x95, 0xf8, 0xb2, 0x01, + 0x00, 0xf0, 0x10, 0xfb, 0x01, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x12, 0xfb, + 0x00, 0xf0, 0x16, 0xfb, 0x8d, 0xf8, 0x08, 0x00, 0xd3, 0x48, 0x69, 0x46, + 0x10, 0x22, 0x03, 0x68, 0x80, 0x20, 0x98, 0x47, 0x7f, 0xbd, 0x00, 0xbf, + 0x3c, 0xe5, 0x08, 0x00, 0xa4, 0xe5, 0x08, 0x00, 0x70, 0x47, 0x70, 0x47, + 0x70, 0x47, 0x00, 0xbf, 0x2d, 0xe9, 0xf0, 0x43, 0x85, 0xb0, 0x04, 0x46, + 0x7d, 0x48, 0x90, 0xf8, 0x55, 0x12, 0x00, 0x29, 0x00, 0xf0, 0x9a, 0x80, + 0x4e, 0x49, 0x91, 0xf8, 0x00, 0x90, 0x4e, 0x49, 0x91, 0xf8, 0xb6, 0x16, + 0x49, 0x06, 0x44, 0xbf, 0x90, 0xf8, 0xa4, 0x12, 0x5f, 0xea, 0x41, 0x61, + 0x04, 0xd4, 0x75, 0x49, 0x09, 0x78, 0x00, 0x29, 0x00, 0xf0, 0x88, 0x80, + 0x16, 0x2c, 0x22, 0xd8, 0x72, 0x48, 0x04, 0xeb, 0x44, 0x01, 0x50, 0xf8, + 0x21, 0x60, 0x00, 0x2e, 0x46, 0xd0, 0x04, 0xeb, 0x44, 0x01, 0x96, 0xf8, + 0x74, 0x90, 0x00, 0xeb, 0x81, 0x00, 0x00, 0x79, 0x05, 0x28, 0x24, 0xd1, + 0xd6, 0xf8, 0xac, 0x01, 0x41, 0x49, 0x00, 0xf0, 0xb9, 0xfa, 0x05, 0x46, + 0x96, 0xf8, 0xb2, 0x01, 0x00, 0xf0, 0xc0, 0xfa, 0x01, 0x46, 0x28, 0x46, + 0x00, 0xf0, 0xc2, 0xfa, 0x00, 0xf0, 0xc6, 0xfa, 0x96, 0xf8, 0x42, 0x51, + 0x40, 0xe0, 0xa4, 0xf1, 0x17, 0x01, 0x00, 0x26, 0x08, 0x29, 0x26, 0xd8, + 0x00, 0x25, 0x00, 0x27, 0xdf, 0xe8, 0x01, 0xf0, 0x13, 0x3a, 0x17, 0x1a, + 0x3a, 0x05, 0x1f, 0x3a, 0x05, 0x00, 0x2e, 0x48, 0x90, 0xf8, 0x4a, 0x90, + 0x18, 0xe0, 0x96, 0xf8, 0x3a, 0x50, 0x01, 0x28, 0x03, 0xd1, 0x96, 0xf8, + 0x88, 0x04, 0x80, 0x07, 0x14, 0xd4, 0x00, 0x26, 0x10, 0xe0, 0x29, 0x48, + 0x90, 0xf8, 0x50, 0x90, 0x0a, 0xe0, 0x90, 0xf8, 0xab, 0x93, 0x01, 0xe0, + 0x90, 0xf8, 0xaa, 0x93, 0x00, 0x25, 0x02, 0x26, 0x04, 0xe0, 0x22, 0x48, + 0x90, 0xf8, 0x13, 0x90, 0x00, 0x26, 0x00, 0x25, 0x00, 0x27, 0x13, 0xe0, + 0x20, 0x48, 0x21, 0x49, 0xd0, 0xe9, 0x01, 0x68, 0x30, 0x46, 0x00, 0xf0, + 0x75, 0xfa, 0x07, 0x46, 0x30, 0x46, 0x41, 0x46, 0x00, 0xf0, 0x76, 0xfa, + 0x01, 0x46, 0x38, 0x46, 0x00, 0xf0, 0x7e, 0xfa, 0x00, 0xf0, 0x82, 0xfa, + 0x07, 0x46, 0x00, 0x26, 0x86, 0x48, 0x00, 0x68, 0x80, 0x47, 0x03, 0x28, + 0x1a, 0xd1, 0x85, 0x48, 0x00, 0x68, 0x80, 0x47, 0x01, 0x90, 0x14, 0x48, + 0x40, 0xf6, 0x0c, 0x71, 0x8d, 0xf8, 0x0a, 0x40, 0xad, 0xf8, 0x08, 0x10, + 0x31, 0x46, 0x02, 0x68, 0x48, 0x46, 0x90, 0x47, 0x8d, 0xf8, 0x0b, 0x00, + 0x7e, 0x48, 0x01, 0xa9, 0x10, 0x22, 0x8d, 0xf8, 0x0d, 0x70, 0x8d, 0xf8, + 0x0c, 0x50, 0x03, 0x68, 0x80, 0x20, 0x98, 0x47, 0x05, 0xb0, 0xbd, 0xe8, + 0xf0, 0x83, 0x00, 0xbf, 0x69, 0x34, 0x01, 0x00, 0x38, 0x21, 0x01, 0x00, + 0x04, 0x5b, 0x01, 0x00, 0x50, 0x5b, 0x01, 0x00, 0x24, 0x5c, 0x01, 0x00, + 0xac, 0x76, 0x01, 0x00, 0x00, 0x00, 0xc8, 0x42, 0x34, 0x9c, 0x08, 0x00, + 0x2d, 0xe9, 0xf0, 0x47, 0x22, 0x49, 0x21, 0x4c, 0x20, 0x78, 0x91, 0xf8, + 0x55, 0x12, 0x01, 0x30, 0x00, 0x29, 0x20, 0x70, 0x36, 0xd0, 0x1f, 0x49, + 0xc0, 0xb2, 0x09, 0x78, 0x81, 0x42, 0x2f, 0xd8, 0x71, 0xb3, 0x1d, 0x48, + 0xdf, 0xf8, 0x74, 0x90, 0xdf, 0xf8, 0x74, 0x80, 0x4f, 0xf0, 0x00, 0x0a, + 0x00, 0x27, 0x00, 0x26, 0x05, 0x1d, 0x55, 0xf8, 0x04, 0x0c, 0x84, 0xf8, + 0x00, 0xa0, 0xd0, 0xb1, 0x29, 0x78, 0x05, 0x29, 0x17, 0xd8, 0xdf, 0xe8, + 0x01, 0xf0, 0x03, 0x09, 0x03, 0x0d, 0x16, 0x10, 0x40, 0x69, 0xd9, 0xf8, + 0x00, 0x20, 0x90, 0xf9, 0x3a, 0x10, 0x0a, 0xe0, 0xd8, 0xf8, 0x2c, 0x10, + 0x81, 0x42, 0x08, 0xd0, 0x90, 0xf9, 0x3a, 0x10, 0x01, 0xe0, 0x90, 0xf9, + 0x42, 0x11, 0xd9, 0xf8, 0x00, 0x20, 0xf8, 0xb2, 0x90, 0x47, 0x01, 0x36, + 0x01, 0x37, 0x0c, 0x35, 0x17, 0x2e, 0xda, 0xd1, 0xbd, 0xe8, 0xf0, 0x87, + 0x00, 0x20, 0x20, 0x70, 0xbd, 0xe8, 0xf0, 0x87, 0x2c, 0x21, 0x01, 0x00, + 0x8c, 0x7e, 0x08, 0x00, 0x2b, 0x21, 0x01, 0x00, 0xe8, 0x72, 0x01, 0x00, + 0x74, 0x9a, 0x08, 0x00, 0x38, 0x5d, 0x01, 0x00, 0xf0, 0xb5, 0x05, 0x9c, + 0x94, 0xf8, 0x1d, 0x51, 0x94, 0xf8, 0x20, 0x61, 0x94, 0xf8, 0xb0, 0x71, + 0x1a, 0x4c, 0x24, 0x68, 0xc5, 0xeb, 0x05, 0x15, 0x76, 0x1a, 0x04, 0xeb, + 0x45, 0x14, 0x94, 0xf8, 0xc0, 0x50, 0x96, 0xfb, 0xf5, 0xf5, 0x0d, 0x44, + 0x39, 0x44, 0xee, 0xb2, 0xcf, 0xb2, 0xb7, 0x42, 0x03, 0xd9, 0xe4, 0x78, + 0x80, 0x2c, 0x88, 0xbf, 0x29, 0x46, 0x73, 0xb1, 0x0b, 0x06, 0x19, 0xd0, + 0xcb, 0xb2, 0x00, 0x24, 0x01, 0x25, 0x00, 0x21, 0x16, 0x18, 0x05, 0xfa, + 0x02, 0xf2, 0x01, 0x34, 0x11, 0x43, 0x9c, 0x42, 0x32, 0x46, 0xf7, 0xd1, + 0x0d, 0xe0, 0x08, 0x06, 0x0a, 0xd0, 0xc8, 0xb2, 0x00, 0x22, 0x01, 0x23, + 0x00, 0x21, 0x03, 0xfa, 0x02, 0xf4, 0x01, 0x32, 0x21, 0x43, 0x82, 0x42, + 0xf9, 0xd1, 0x00, 0xe0, 0x00, 0x21, 0x08, 0x46, 0xf0, 0xbd, 0x00, 0xbf, + 0xe0, 0x35, 0x01, 0x00, 0x80, 0xb5, 0x0f, 0x48, 0x90, 0xf8, 0x5f, 0x10, + 0x01, 0x29, 0x15, 0xd1, 0x90, 0xf8, 0x60, 0x00, 0x01, 0x28, 0x11, 0xd1, + 0x0b, 0x48, 0x01, 0x68, 0x14, 0x20, 0x88, 0x47, 0x50, 0xb1, 0xcb, 0x21, + 0x01, 0x70, 0x09, 0x49, 0x60, 0x31, 0x00, 0xf0, 0xab, 0xf9, 0x08, 0x48, + 0x05, 0x21, 0x00, 0x78, 0xfd, 0xf7, 0xd6, 0xff, 0x00, 0x20, 0x80, 0xbd, + 0xbd, 0xe8, 0x80, 0x40, 0x00, 0xf0, 0xa6, 0xb9, 0xd0, 0xe2, 0x05, 0x00, + 0xd4, 0x9b, 0x08, 0x00, 0x2c, 0xba, 0x01, 0x00, 0x67, 0x34, 0x01, 0x00, + 0xbf, 0xb5, 0x05, 0x46, 0x0e, 0x48, 0x74, 0x46, 0x00, 0x68, 0x80, 0x47, + 0x03, 0x28, 0x16, 0xd1, 0x0c, 0x48, 0x00, 0x68, 0x80, 0x47, 0x00, 0x21, + 0x00, 0x90, 0x0b, 0x48, 0x8d, 0xf8, 0x06, 0x50, 0x03, 0x94, 0x10, 0x22, + 0x8d, 0xf8, 0x07, 0x10, 0x44, 0xf6, 0x0c, 0x21, 0xad, 0xf8, 0x04, 0x10, + 0x69, 0x46, 0x00, 0x68, 0x02, 0x90, 0x05, 0x48, 0x03, 0x68, 0x80, 0x20, + 0x98, 0x47, 0xbf, 0xbd, 0x3c, 0xe5, 0x08, 0x00, 0xa4, 0xe5, 0x08, 0x00, + 0x24, 0x20, 0x00, 0x40, 0x8c, 0xe5, 0x08, 0x00, 0xf1, 0x20, 0xff, 0xf7, + 0xd5, 0xbf, 0x00, 0xbf, 0x10, 0xb5, 0x14, 0x46, 0x0a, 0x46, 0x21, 0x78, + 0xa0, 0x29, 0x01, 0xd0, 0x70, 0x29, 0x13, 0xd1, 0x0c, 0x49, 0x89, 0x78, + 0x01, 0xf0, 0xfe, 0x01, 0x02, 0x29, 0x0d, 0xd1, 0x0a, 0x49, 0x4f, 0xf4, + 0x84, 0x60, 0x00, 0x2b, 0x23, 0x46, 0x08, 0xbf, 0x4f, 0xf4, 0x82, 0x60, + 0xd1, 0xf8, 0x00, 0xc0, 0x00, 0x21, 0xbd, 0xe8, 0x10, 0x40, 0x60, 0x47, + 0x11, 0x46, 0x22, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, 0x56, 0xb9, + 0x74, 0x2a, 0x01, 0x00, 0xe8, 0x9a, 0x08, 0x00, 0x80, 0xb5, 0x07, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x06, 0x48, 0x00, 0x68, 0x80, 0x47, 0x06, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x05, 0x48, 0x00, 0x68, 0xbd, 0xe8, 0x80, 0x40, + 0x00, 0x47, 0x00, 0xbf, 0x8c, 0x92, 0x08, 0x00, 0x94, 0x92, 0x08, 0x00, + 0x98, 0x92, 0x08, 0x00, 0x90, 0x92, 0x08, 0x00, 0x03, 0x49, 0x91, 0xf8, + 0xe5, 0x10, 0x09, 0xb1, 0x00, 0xf0, 0x3a, 0xb9, 0x70, 0x47, 0x00, 0xbf, + 0xe8, 0x65, 0x08, 0x00, 0x2d, 0x48, 0x2e, 0x49, 0x2f, 0x4a, 0xc0, 0xf8, + 0x98, 0x10, 0x2d, 0x49, 0x0a, 0x60, 0x2e, 0x49, 0x2f, 0x4a, 0x81, 0x60, + 0x2d, 0x49, 0x0a, 0x60, 0x2e, 0x49, 0x2f, 0x4a, 0x0a, 0x60, 0x2f, 0x49, + 0x2f, 0x4a, 0x0a, 0x60, 0x2f, 0x49, 0x30, 0x4a, 0x0a, 0x60, 0x30, 0x49, + 0x30, 0x4a, 0x0a, 0x60, 0x30, 0x49, 0x31, 0x4a, 0x0a, 0x60, 0x31, 0x49, + 0x31, 0x4a, 0x0a, 0x60, 0x31, 0x49, 0x33, 0x4a, 0xc0, 0xf8, 0x08, 0x11, + 0x30, 0x49, 0x0a, 0x60, 0x31, 0x49, 0x33, 0x4a, 0xc0, 0xf8, 0x18, 0x11, + 0x30, 0x49, 0x0a, 0x60, 0x31, 0x49, 0x32, 0x4a, 0x0a, 0x60, 0x32, 0x49, + 0x35, 0x4a, 0xc0, 0xf8, 0xf4, 0x10, 0x31, 0x49, 0x41, 0x62, 0x31, 0x49, + 0xc0, 0xf8, 0xdc, 0x10, 0x30, 0x49, 0x0a, 0x60, 0x31, 0x49, 0x32, 0x4a, + 0x0a, 0x60, 0x32, 0x49, 0x32, 0x4a, 0x0a, 0x60, 0x32, 0x49, 0x33, 0x4a, + 0x0a, 0x60, 0x33, 0x49, 0x33, 0x4a, 0x0a, 0x60, 0x33, 0x49, 0x34, 0x4a, + 0x0a, 0x60, 0x34, 0x49, 0x34, 0x4a, 0x0a, 0x60, 0x34, 0x49, 0x35, 0x4a, + 0x0a, 0x60, 0x35, 0x49, 0x35, 0x4a, 0x0a, 0x60, 0x35, 0x49, 0x36, 0x4a, + 0x0a, 0x60, 0x36, 0x49, 0x36, 0x4a, 0x0a, 0x60, 0x36, 0x49, 0x37, 0x4a, + 0x0a, 0x60, 0x37, 0x49, 0x01, 0x61, 0x70, 0x47, 0x30, 0x99, 0x08, 0x00, + 0x39, 0x1e, 0x02, 0x00, 0x04, 0xa1, 0x08, 0x00, 0xd1, 0x1b, 0x02, 0x00, + 0xf5, 0x1f, 0x02, 0x00, 0x84, 0x9a, 0x08, 0x00, 0xa9, 0x23, 0x02, 0x00, + 0xa8, 0x9a, 0x08, 0x00, 0xfd, 0x24, 0x02, 0x00, 0x78, 0xe5, 0x08, 0x00, + 0xe1, 0x26, 0x02, 0x00, 0x70, 0xcf, 0x08, 0x00, 0x95, 0x27, 0x02, 0x00, + 0xfc, 0xa0, 0x08, 0x00, 0xbd, 0x27, 0x02, 0x00, 0x24, 0xce, 0x08, 0x00, + 0x8d, 0x29, 0x02, 0x00, 0x18, 0xc3, 0x08, 0x00, 0x09, 0x2a, 0x02, 0x00, + 0xa1, 0x2a, 0x02, 0x00, 0x2c, 0xce, 0x08, 0x00, 0x85, 0x2b, 0x02, 0x00, + 0xd5, 0x2b, 0x02, 0x00, 0xd4, 0xb6, 0x08, 0x00, 0x7d, 0x1c, 0x02, 0x00, + 0xa0, 0x9a, 0x08, 0x00, 0x61, 0x1d, 0x02, 0x00, 0x9d, 0x2c, 0x02, 0x00, + 0x3d, 0x2c, 0x02, 0x00, 0xf5, 0x2c, 0x02, 0x00, 0x74, 0x9a, 0x08, 0x00, + 0x05, 0x2d, 0x02, 0x00, 0x5c, 0xe5, 0x08, 0x00, 0xb1, 0x2d, 0x02, 0x00, + 0xd4, 0x9a, 0x08, 0x00, 0xe9, 0x28, 0x02, 0x00, 0x60, 0xe5, 0x08, 0x00, + 0xb3, 0x2d, 0x02, 0x00, 0x64, 0xe5, 0x08, 0x00, 0xb5, 0x2d, 0x02, 0x00, + 0x30, 0xd9, 0x08, 0x00, 0xb9, 0x2d, 0x02, 0x00, 0xac, 0xca, 0x08, 0x00, + 0x29, 0x2f, 0x02, 0x00, 0x70, 0xd2, 0x08, 0x00, 0xcd, 0x2f, 0x02, 0x00, + 0x94, 0xb7, 0x08, 0x00, 0x4d, 0x30, 0x02, 0x00, 0xb0, 0xfd, 0x08, 0x00, + 0x75, 0x25, 0x02, 0x00, 0x80, 0xe5, 0x08, 0x00, 0xf5, 0x30, 0x02, 0x00, + 0x88, 0x9f, 0x08, 0x00, 0x41, 0x31, 0x02, 0x00, 0x71, 0x31, 0x02, 0x00, + 0x47, 0xf2, 0x09, 0x7c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x46, 0xf6, 0x19, 0x1c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x46, 0xf2, 0xb1, 0x1c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x44, 0xf2, 0x91, 0x4c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4b, 0xf2, 0xc7, 0x4c, 0xc1, 0xf2, 0x12, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x46, 0xf6, 0x75, 0x0c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x47, 0xf6, 0xb5, 0x1c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x46, 0xf6, 0xe9, 0x5c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x45, 0xf2, 0xe1, 0x4c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x45, 0xf6, 0x61, 0x3c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4c, 0xf2, 0xf9, 0x1c, 0xc1, 0xf2, 0x12, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4b, 0xf6, 0x59, 0x1c, 0xc1, 0xf2, 0x12, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4b, 0xf6, 0x7f, 0x6c, 0xc1, 0xf2, 0x12, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4b, 0xf6, 0x8d, 0x3c, 0xc1, 0xf2, 0x12, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4b, 0xf6, 0x11, 0x5c, 0xc1, 0xf2, 0x12, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x49, 0xf6, 0x85, 0x6c, 0xc1, 0xf2, 0x11, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x47, 0xf2, 0xf9, 0x3c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x48, 0xf6, 0xad, 0x4c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x45, 0xf6, 0x89, 0x6c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0xbc, 0xb5, 0xb9, 0x49, 0x14, 0x46, 0x91, 0xf8, 0xcb, 0x22, 0x52, 0x07, + 0x3f, 0xd5, 0x62, 0x7a, 0x74, 0x23, 0x00, 0x2a, 0x08, 0xbf, 0x3a, 0x23, + 0xc2, 0x5c, 0x1d, 0x4b, 0xa2, 0x72, 0x90, 0xf8, 0xf3, 0x22, 0x90, 0xf8, + 0x3e, 0x03, 0x33, 0xf8, 0x12, 0x20, 0x01, 0xf2, 0x4d, 0x23, 0xc0, 0x07, + 0x62, 0x61, 0x08, 0xbf, 0x01, 0xf5, 0x0c, 0x73, 0x18, 0x78, 0xe0, 0x72, + 0x20, 0x68, 0x10, 0x44, 0x60, 0x60, 0x14, 0x48, 0x00, 0x68, 0x80, 0x47, + 0xa8, 0xb1, 0x05, 0x46, 0x50, 0xf8, 0x08, 0x0c, 0x22, 0x46, 0x38, 0x23, + 0x01, 0x89, 0x28, 0x46, 0xfd, 0xf7, 0xe4, 0xfd, 0x0e, 0x48, 0x00, 0xf5, + 0x90, 0x71, 0x28, 0x46, 0xff, 0xf7, 0xb4, 0xff, 0xa4, 0x48, 0x15, 0x21, + 0x00, 0x78, 0xbd, 0xe8, 0xbc, 0x40, 0xfd, 0xf7, 0xdd, 0xbd, 0x09, 0x48, + 0x00, 0x21, 0x04, 0x22, 0x03, 0x23, 0x04, 0x68, 0x7b, 0x20, 0xcd, 0xe9, + 0x00, 0x10, 0x40, 0xf2, 0xe1, 0x40, 0x01, 0x21, 0xa0, 0x47, 0xbc, 0xbd, + 0xb0, 0x31, 0x0a, 0x10, 0xe8, 0x9b, 0x08, 0x00, 0x2c, 0xba, 0x01, 0x00, + 0xec, 0x9a, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x47, 0x92, 0xb0, 0x0f, 0x46, + 0x06, 0x46, 0x01, 0xa8, 0x38, 0x21, 0x1c, 0x46, 0x15, 0x46, 0xff, 0xf7, + 0x4b, 0xff, 0x8c, 0x48, 0x90, 0xf8, 0xca, 0x02, 0x18, 0xb1, 0x07, 0x2d, + 0x98, 0xbf, 0x16, 0x2e, 0x02, 0xd9, 0x12, 0xb0, 0xbd, 0xe8, 0xf0, 0x87, + 0x88, 0x48, 0x06, 0xeb, 0x46, 0x01, 0x50, 0xf8, 0x21, 0x80, 0xb8, 0xf1, + 0x00, 0x0f, 0xf4, 0xd0, 0x06, 0xeb, 0x46, 0x01, 0x00, 0xeb, 0x81, 0x00, + 0x00, 0x79, 0x41, 0x1f, 0x02, 0x29, 0x06, 0xd3, 0x03, 0x28, 0x01, 0xd0, + 0x01, 0x28, 0xe8, 0xd1, 0x08, 0xf1, 0xd4, 0x00, 0x08, 0xe0, 0x22, 0x48, + 0x98, 0xf8, 0x1d, 0x11, 0x00, 0x68, 0xc1, 0xeb, 0x01, 0x11, 0x00, 0xeb, + 0x41, 0x10, 0xa0, 0x30, 0xd0, 0xf8, 0x00, 0xa0, 0xba, 0xf1, 0x00, 0x0f, + 0xd7, 0xd0, 0x1c, 0x48, 0xd7, 0xf8, 0x00, 0x90, 0x10, 0xaa, 0x0f, 0xab, + 0x40, 0x69, 0x50, 0x45, 0x11, 0xbf, 0x0a, 0xf1, 0x14, 0x00, 0xd7, 0xe9, + 0x02, 0x01, 0xcd, 0xe9, 0x10, 0x01, 0x00, 0x20, 0x15, 0x49, 0x0f, 0x68, + 0x49, 0x46, 0xb8, 0x47, 0x00, 0x28, 0xc2, 0xd0, 0x10, 0x98, 0x01, 0xaa, + 0x49, 0x46, 0x23, 0x46, 0x8d, 0xf8, 0x10, 0x60, 0x09, 0x90, 0xbd, 0xf8, + 0x44, 0x00, 0xad, 0xf8, 0x28, 0x00, 0x00, 0x20, 0x0e, 0x90, 0xad, 0xf8, + 0x16, 0x00, 0x0d, 0x90, 0x0e, 0x20, 0x8d, 0xf8, 0x0c, 0x00, 0x0f, 0x98, + 0x01, 0x90, 0x9a, 0xf8, 0x1d, 0x00, 0xb0, 0xfa, 0x80, 0xf0, 0x40, 0x09, + 0x8d, 0xf8, 0x0d, 0x00, 0x6a, 0x48, 0x50, 0xf8, 0x25, 0x50, 0x40, 0x46, + 0xa8, 0x47, 0xa0, 0xe7, 0xe0, 0x35, 0x01, 0x00, 0xfc, 0x73, 0x01, 0x00, + 0x18, 0x97, 0x08, 0x00, 0x2d, 0xe9, 0xfc, 0x47, 0x54, 0x4d, 0x04, 0x46, + 0x0a, 0x98, 0x4f, 0xea, 0x13, 0x68, 0x91, 0x42, 0x08, 0xbf, 0xb8, 0xf1, + 0x00, 0x0f, 0x05, 0xf2, 0x73, 0x2a, 0x00, 0xf0, 0x9a, 0x80, 0xc7, 0xb2, + 0x05, 0xf2, 0xac, 0x55, 0x16, 0x2f, 0x15, 0xd8, 0xdf, 0xf8, 0x34, 0xc1, + 0x07, 0xeb, 0x47, 0x07, 0x5c, 0xf8, 0x27, 0x60, 0x06, 0xb3, 0x0c, 0xeb, + 0x87, 0x06, 0x05, 0xf1, 0x0a, 0x09, 0x05, 0xf1, 0x08, 0x0c, 0x05, 0xf1, + 0x06, 0x0e, 0x37, 0x79, 0x03, 0x2f, 0x1a, 0xd0, 0x7e, 0x1f, 0x02, 0x2e, + 0x12, 0xd2, 0x16, 0xe0, 0xa7, 0xf1, 0x19, 0x06, 0x05, 0xf1, 0x0a, 0x09, + 0x05, 0xf1, 0x08, 0x0c, 0x05, 0xf1, 0x06, 0x0e, 0x02, 0x2e, 0x0c, 0xd3, + 0x2c, 0x2f, 0x05, 0xd3, 0x3b, 0x4e, 0x96, 0xf8, 0xc3, 0x61, 0x2c, 0x36, + 0xb7, 0x42, 0x04, 0xd9, 0x05, 0xf1, 0x04, 0x09, 0x05, 0xf1, 0x02, 0x0c, + 0x00, 0xe0, 0x75, 0x46, 0xb9, 0xf8, 0x00, 0x60, 0x31, 0x44, 0x03, 0xf4, + 0x7f, 0x46, 0x64, 0x39, 0xb6, 0xf5, 0x80, 0x7f, 0x0a, 0xd1, 0x9a, 0xf8, + 0x59, 0x50, 0x9a, 0xf8, 0x5b, 0x60, 0x49, 0x1b, 0x21, 0x60, 0xbc, 0xf8, + 0x00, 0x10, 0x11, 0x44, 0x31, 0x44, 0x08, 0xe0, 0x9a, 0xf8, 0x5a, 0x60, + 0x9a, 0xf8, 0x5c, 0x70, 0x89, 0x1b, 0x21, 0x60, 0x29, 0x88, 0x11, 0x44, + 0x39, 0x44, 0x61, 0x60, 0x00, 0xf0, 0x7f, 0x41, 0xe1, 0x60, 0x06, 0x21, + 0x01, 0xea, 0xd0, 0x12, 0x4f, 0xf0, 0xff, 0x61, 0x01, 0xea, 0xc3, 0x01, + 0x41, 0xea, 0x03, 0x71, 0x41, 0xea, 0xc8, 0x25, 0xc1, 0xb2, 0xc0, 0xf3, + 0x00, 0x40, 0x45, 0xea, 0xc1, 0x05, 0x2a, 0x44, 0x9a, 0xf8, 0x00, 0x50, + 0x10, 0x44, 0x4f, 0xf0, 0x00, 0x62, 0x00, 0x2d, 0x08, 0xbf, 0x02, 0xea, + 0xc3, 0x42, 0x10, 0x44, 0x19, 0x4a, 0xa0, 0x60, 0x12, 0x78, 0x91, 0x42, + 0x06, 0xd3, 0x08, 0x32, 0x91, 0x42, 0x03, 0xd2, 0x16, 0x49, 0xc9, 0x78, + 0x08, 0x43, 0xa0, 0x60, 0x15, 0x48, 0x11, 0x21, 0x00, 0x78, 0xfd, 0xf7, + 0xc1, 0xfc, 0x9a, 0xf8, 0x30, 0x00, 0xa0, 0xb1, 0xff, 0x28, 0x01, 0xd0, + 0x80, 0x45, 0x10, 0xd1, 0x10, 0x48, 0x01, 0x21, 0x00, 0x22, 0x23, 0x46, + 0x05, 0x68, 0x10, 0x20, 0x00, 0x90, 0x40, 0xf2, 0xfd, 0x40, 0xa8, 0x47, + 0x0c, 0x48, 0x12, 0x21, 0x00, 0x78, 0xbd, 0xe8, 0xfc, 0x47, 0xfd, 0xf7, + 0xa9, 0xbc, 0xbd, 0xe8, 0xfc, 0x87, 0x21, 0x60, 0xb4, 0xe7, 0x00, 0xbf, + 0x8c, 0x7e, 0x08, 0x00, 0xe8, 0x65, 0x08, 0x00, 0xe8, 0x72, 0x01, 0x00, + 0x14, 0x01, 0x01, 0x00, 0x30, 0x72, 0x01, 0x00, 0xa5, 0x58, 0x01, 0x00, + 0xa0, 0xa0, 0x08, 0x00, 0x66, 0x34, 0x01, 0x00, 0x04, 0x48, 0x05, 0x49, + 0x01, 0x60, 0x05, 0x48, 0x05, 0x49, 0xc1, 0x60, 0x05, 0x48, 0x06, 0x49, + 0x01, 0x60, 0x70, 0x47, 0xc8, 0x98, 0x08, 0x00, 0x9d, 0x34, 0x02, 0x00, + 0xa0, 0x98, 0x08, 0x00, 0xfd, 0x33, 0x02, 0x00, 0x4c, 0xe5, 0x08, 0x00, + 0x8d, 0x35, 0x02, 0x00, 0x2d, 0xe9, 0xfe, 0x4f, 0x32, 0x48, 0x90, 0xf8, + 0x55, 0x02, 0x38, 0xb3, 0xdf, 0xf8, 0xc4, 0x80, 0xdf, 0xf8, 0xc4, 0xa0, + 0x7c, 0x4e, 0x00, 0x27, 0x4f, 0xf0, 0x10, 0x0b, 0x08, 0xf5, 0x7d, 0x79, + 0x4d, 0x46, 0x28, 0x68, 0x68, 0xb1, 0xda, 0xf8, 0x00, 0x40, 0x40, 0xf2, + 0x12, 0x40, 0x00, 0x21, 0x00, 0x22, 0x2b, 0x46, 0xcd, 0xf8, 0x00, 0xb0, + 0xa0, 0x47, 0x30, 0x78, 0x12, 0x21, 0xfd, 0xf7, 0x5d, 0xfc, 0x01, 0x37, + 0x10, 0x35, 0x0a, 0x2f, 0xeb, 0xd1, 0x48, 0x46, 0xa0, 0x21, 0xff, 0xf7, + 0xe3, 0xfd, 0x00, 0xf0, 0x95, 0xf9, 0x86, 0x48, 0x01, 0x78, 0x09, 0xb1, + 0xbd, 0xe8, 0xfe, 0x8f, 0x98, 0xf8, 0x3e, 0x16, 0x01, 0x29, 0xf9, 0xd1, + 0x40, 0x79, 0x01, 0x28, 0xf6, 0xd1, 0x94, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x04, 0x28, 0xf1, 0xd1, 0xa9, 0x48, 0x08, 0xf2, 0x3e, 0x64, 0x00, 0x68, + 0x80, 0x47, 0xd4, 0xf8, 0x06, 0x10, 0x40, 0x1a, 0x14, 0x49, 0x08, 0x44, + 0x20, 0xf0, 0x70, 0x40, 0xb0, 0xf1, 0x00, 0x6f, 0xe2, 0xd8, 0x79, 0x48, + 0x90, 0xf8, 0xcd, 0x01, 0x18, 0xb9, 0x00, 0x20, 0x00, 0x21, 0x35, 0xf0, + 0x4f, 0xfa, 0x00, 0x20, 0x00, 0x25, 0xfe, 0xf7, 0x91, 0xf9, 0x74, 0x48, + 0x25, 0x70, 0x99, 0x21, 0x08, 0x22, 0x23, 0x23, 0x05, 0x68, 0xd4, 0xf8, + 0x06, 0x00, 0xcd, 0xe9, 0x00, 0x01, 0x40, 0xf2, 0xe7, 0x40, 0x01, 0x21, + 0xa8, 0x47, 0xbd, 0xe8, 0xfe, 0x8f, 0x00, 0xbf, 0x8c, 0x7e, 0x08, 0x00, + 0x64, 0xd4, 0x05, 0x00, 0xa0, 0xa0, 0x08, 0x00, 0x80, 0xc1, 0xff, 0x0f, + 0x01, 0x28, 0x14, 0xd1, 0x0b, 0x48, 0x00, 0x78, 0x00, 0xea, 0x50, 0x00, + 0xc0, 0x07, 0x0e, 0xd1, 0x75, 0x48, 0x90, 0xf8, 0xb4, 0x16, 0x51, 0xb1, + 0x90, 0xf8, 0x34, 0x12, 0x39, 0xb1, 0x90, 0xf8, 0x2f, 0x12, 0x11, 0xb9, + 0x90, 0xf8, 0x30, 0x02, 0x08, 0xb1, 0x00, 0x20, 0x70, 0x47, 0x01, 0x20, + 0x70, 0x47, 0x00, 0xbf, 0xf2, 0xda, 0x05, 0x00, 0x7c, 0xb5, 0x05, 0x46, + 0x58, 0x48, 0x0c, 0x46, 0x06, 0x68, 0x08, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x45, 0xea, 0x04, 0x22, 0xe5, 0x21, 0x22, 0x23, 0x42, 0xea, 0x00, 0x40, + 0x08, 0x22, 0xcd, 0xe9, 0x00, 0x01, 0x40, 0xf2, 0xe7, 0x40, 0x01, 0x21, + 0xb0, 0x47, 0x7c, 0xbd, 0xa4, 0xe5, 0x08, 0x00, 0x1c, 0xb5, 0x00, 0xf0, + 0x1f, 0xf9, 0x49, 0x48, 0x7f, 0x21, 0x00, 0x24, 0x80, 0xf8, 0x54, 0x16, + 0x80, 0xf8, 0x3d, 0x16, 0x23, 0x48, 0x04, 0x60, 0x00, 0x20, 0xfe, 0xf7, + 0x35, 0xf9, 0x22, 0x48, 0x22, 0x4a, 0x90, 0xf8, 0xf4, 0x30, 0x00, 0xf1, + 0xf0, 0x01, 0x21, 0x48, 0x13, 0xb3, 0x53, 0x6b, 0xb4, 0xeb, 0x93, 0x5f, + 0x03, 0xd1, 0x53, 0x6b, 0x1e, 0x4c, 0x23, 0x42, 0x04, 0xd0, 0x53, 0x6b, + 0x1d, 0x4c, 0xb4, 0xeb, 0x13, 0x3f, 0x15, 0xd1, 0x13, 0x68, 0x43, 0xf0, + 0x01, 0x03, 0x13, 0x60, 0x53, 0x68, 0x43, 0xf0, 0x00, 0x43, 0x53, 0x60, + 0x0b, 0x88, 0x54, 0x6b, 0x6f, 0xf3, 0x9f, 0x54, 0x44, 0xea, 0x83, 0x53, + 0x53, 0x63, 0x01, 0x23, 0x03, 0x72, 0x4b, 0x88, 0x54, 0x6b, 0x63, 0xf3, + 0x15, 0x34, 0x54, 0x63, 0x09, 0x68, 0x0e, 0x4b, 0x41, 0x60, 0x51, 0x6b, + 0x40, 0xf6, 0xff, 0x72, 0x91, 0x43, 0x00, 0x22, 0x01, 0x60, 0x0d, 0x48, + 0x01, 0x21, 0x04, 0x68, 0x0c, 0x20, 0x00, 0x90, 0x40, 0xf2, 0x74, 0x40, + 0xa0, 0x47, 0x0a, 0x48, 0x12, 0x21, 0x00, 0x78, 0xbd, 0xe8, 0x1c, 0x40, + 0xfd, 0xf7, 0x88, 0xbb, 0xec, 0xda, 0x05, 0x00, 0x04, 0x31, 0x06, 0x00, + 0x84, 0x48, 0x05, 0x30, 0x00, 0xdb, 0x05, 0x00, 0x00, 0xf0, 0x3f, 0x00, + 0x60, 0x81, 0x05, 0x00, 0xa0, 0xa0, 0x08, 0x00, 0x66, 0x34, 0x01, 0x00, + 0x7c, 0xb5, 0x00, 0xf0, 0xc3, 0xf8, 0x17, 0x48, 0x01, 0x78, 0x01, 0xb1, + 0x7c, 0xbd, 0x16, 0x4c, 0x94, 0xf8, 0x3e, 0x16, 0x01, 0x29, 0xf9, 0xd1, + 0x40, 0x79, 0x01, 0x28, 0xf6, 0xd1, 0x13, 0x4d, 0x28, 0x68, 0x00, 0x07, + 0xf2, 0xd4, 0x12, 0x48, 0x90, 0xf8, 0xcd, 0x01, 0x18, 0xb9, 0x00, 0x20, + 0x00, 0x21, 0x35, 0xf0, 0x81, 0xf9, 0x00, 0x20, 0x00, 0x26, 0xfe, 0xf7, + 0xc3, 0xf8, 0x01, 0x20, 0x84, 0xf8, 0x3e, 0x66, 0x4f, 0xf4, 0x9c, 0x71, + 0x08, 0x22, 0x25, 0x23, 0x84, 0xf8, 0x41, 0x06, 0x08, 0x48, 0x04, 0x68, + 0x28, 0x68, 0xcd, 0xe9, 0x00, 0x01, 0x40, 0xf2, 0xe2, 0x40, 0x01, 0x21, + 0xa0, 0x47, 0x7c, 0xbd, 0x48, 0xdc, 0x05, 0x00, 0x64, 0xd4, 0x05, 0x00, + 0xac, 0x41, 0x05, 0x30, 0x00, 0x69, 0x08, 0x00, 0xec, 0x9a, 0x08, 0x00, + 0x70, 0xb5, 0x0e, 0x4e, 0x30, 0x68, 0x80, 0x47, 0x05, 0x46, 0x00, 0xf0, + 0x89, 0xf8, 0x04, 0x46, 0x01, 0x2d, 0x10, 0xd1, 0x30, 0x68, 0x80, 0x47, + 0x03, 0x28, 0x0c, 0xd1, 0x08, 0x48, 0x00, 0x7c, 0x48, 0xb9, 0x08, 0x48, + 0x02, 0x21, 0x00, 0x22, 0x80, 0xf8, 0xb4, 0x16, 0x06, 0x48, 0x00, 0x21, + 0x03, 0x68, 0x70, 0x20, 0x98, 0x47, 0x20, 0x46, 0x70, 0xbd, 0x00, 0xbf, + 0x3c, 0xe5, 0x08, 0x00, 0x4c, 0x01, 0x01, 0x00, 0x38, 0x21, 0x01, 0x00, + 0x8c, 0xe5, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x41, 0x07, 0x46, 0x0f, 0x48, + 0x00, 0x7a, 0x40, 0x06, 0x17, 0xd5, 0x0e, 0x48, 0x1c, 0x46, 0x15, 0x46, + 0x0e, 0x46, 0x00, 0x68, 0x80, 0x47, 0x80, 0xb1, 0x0b, 0x48, 0xd0, 0xf8, + 0x00, 0x80, 0x0b, 0x48, 0x00, 0x68, 0x80, 0x47, 0xc0, 0x47, 0x0a, 0x48, + 0x31, 0x46, 0x2a, 0x46, 0x23, 0x46, 0xd0, 0xf8, 0x00, 0xc0, 0x38, 0x46, + 0xbd, 0xe8, 0xf0, 0x41, 0x60, 0x47, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0xbf, + 0x74, 0x2a, 0x01, 0x00, 0x48, 0xe5, 0x08, 0x00, 0x2c, 0x97, 0x08, 0x00, + 0xe0, 0xa0, 0x08, 0x00, 0xc8, 0x98, 0x08, 0x00, 0x09, 0x48, 0x0a, 0x49, + 0x01, 0x60, 0x0a, 0x48, 0x0a, 0x49, 0x01, 0x60, 0x0a, 0x48, 0x0b, 0x49, + 0x01, 0x60, 0x0b, 0x48, 0x0b, 0x49, 0x01, 0x60, 0x0b, 0x48, 0x0c, 0x49, + 0x01, 0x60, 0x0c, 0x48, 0x0c, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0xcc, 0xbd, 0x08, 0x00, 0x11, 0x38, 0x02, 0x00, 0xa8, 0xca, 0x08, 0x00, + 0x31, 0x37, 0x02, 0x00, 0x7c, 0x96, 0x08, 0x00, 0x79, 0x38, 0x02, 0x00, + 0xa0, 0x92, 0x08, 0x00, 0x3d, 0x39, 0x02, 0x00, 0x40, 0xe5, 0x08, 0x00, + 0xb5, 0x39, 0x02, 0x00, 0x6c, 0xd2, 0x08, 0x00, 0x01, 0x3a, 0x02, 0x00, + 0x40, 0xf2, 0x95, 0x4c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4f, 0xf6, 0xe1, 0x6c, 0xc1, 0xf2, 0x01, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x40, 0xf2, 0x2d, 0x3c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x40, 0xf2, 0x95, 0x1c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0xf8, 0xb5, 0x0b, 0x4c, 0x94, 0xf8, 0xc3, 0x01, 0x88, 0xb1, 0x0a, 0x49, + 0x00, 0x26, 0x00, 0x27, 0x01, 0xf1, 0x08, 0x05, 0x29, 0x78, 0x01, 0x29, + 0x05, 0xd1, 0xf8, 0xb2, 0x2e, 0x70, 0xfe, 0xf7, 0xbf, 0xf8, 0x94, 0xf8, + 0xc3, 0x01, 0x01, 0x37, 0x0c, 0x35, 0x87, 0x42, 0xf2, 0xd3, 0xf8, 0xbd, + 0xe8, 0x65, 0x08, 0x00, 0xbc, 0xda, 0x05, 0x00, 0x01, 0x48, 0x02, 0x49, + 0x01, 0x60, 0x70, 0x47, 0x9c, 0xf4, 0x08, 0x00, 0xe1, 0x3a, 0x02, 0x00, + 0x70, 0xb5, 0x2d, 0x49, 0x2b, 0x4c, 0x00, 0x20, 0x01, 0xf5, 0x40, 0x75, + 0x26, 0x46, 0x15, 0xf8, 0x11, 0x1f, 0x46, 0xf8, 0x34, 0x0f, 0x30, 0x83, + 0x19, 0xb3, 0x70, 0x68, 0x40, 0xb9, 0x27, 0x48, 0x02, 0x68, 0x88, 0x00, + 0x90, 0x47, 0x29, 0x78, 0xa0, 0x63, 0x89, 0x00, 0x00, 0xf0, 0xac, 0xf8, + 0xb0, 0x68, 0x48, 0xb9, 0x21, 0x48, 0x01, 0x68, 0x28, 0x78, 0x80, 0x00, + 0x88, 0x47, 0x29, 0x78, 0xe0, 0x63, 0x89, 0x00, 0x00, 0xf0, 0xa0, 0xf8, + 0xf0, 0x68, 0x68, 0xb9, 0x1b, 0x48, 0x01, 0x68, 0x28, 0x78, 0x80, 0x00, + 0x88, 0x47, 0x29, 0x78, 0x20, 0x64, 0x89, 0x00, 0x00, 0xf0, 0x94, 0xf8, + 0x02, 0xe0, 0xc6, 0xe9, 0x01, 0x00, 0xf0, 0x60, 0x68, 0x78, 0x68, 0xb1, + 0x31, 0x69, 0x41, 0xb9, 0x12, 0x49, 0x80, 0x00, 0x09, 0x68, 0x88, 0x47, + 0x69, 0x78, 0x60, 0x64, 0x89, 0x00, 0x00, 0xf0, 0x83, 0xf8, 0x70, 0x69, + 0x20, 0xb1, 0x70, 0xbd, 0x00, 0x20, 0xc6, 0xe9, 0x04, 0x00, 0x70, 0xbd, + 0x0a, 0x49, 0x68, 0x78, 0x03, 0x26, 0x06, 0xeb, 0x40, 0x00, 0x09, 0x68, + 0x20, 0xf0, 0x03, 0x00, 0x88, 0x47, 0x69, 0x78, 0xa0, 0x64, 0x06, 0xeb, + 0x41, 0x01, 0x21, 0xf0, 0x03, 0x01, 0x00, 0xf0, 0x6b, 0xf8, 0x70, 0xbd, + 0xc4, 0x1d, 0x01, 0x00, 0x8c, 0x7e, 0x08, 0x00, 0xdc, 0x9b, 0x08, 0x00, + 0x10, 0xb5, 0x14, 0x46, 0x00, 0xf0, 0x66, 0xf8, 0x01, 0x20, 0x00, 0xf0, + 0xff, 0xfb, 0x1d, 0x48, 0x00, 0x21, 0x01, 0x2c, 0xc0, 0xe9, 0x00, 0x11, + 0x18, 0xbf, 0x10, 0xbd, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, 0x40, 0xbe, + 0x10, 0xb5, 0x15, 0x48, 0x00, 0x78, 0x01, 0x28, 0x18, 0xbf, 0x10, 0xbd, + 0x14, 0x4c, 0x20, 0x79, 0x28, 0xb1, 0x01, 0x20, 0x00, 0xf0, 0xe8, 0xfb, + 0x00, 0x20, 0xc4, 0xe9, 0x00, 0x00, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, + 0x4b, 0xb8, 0x00, 0xbf, 0x10, 0xb5, 0x0b, 0x48, 0x00, 0x78, 0x01, 0x28, + 0x11, 0xd1, 0x0a, 0x48, 0x01, 0x68, 0x00, 0x20, 0x88, 0x47, 0x0a, 0x49, + 0x08, 0x4c, 0x09, 0x8e, 0x20, 0x68, 0x01, 0xeb, 0x81, 0x01, 0xb0, 0xeb, + 0x41, 0x0f, 0x04, 0xd9, 0x00, 0x20, 0x00, 0xf0, 0xcb, 0xfb, 0x01, 0x20, + 0x20, 0x71, 0x10, 0xbd, 0xec, 0x1e, 0x01, 0x00, 0x6c, 0x92, 0x08, 0x00, + 0x0c, 0xdb, 0x05, 0x00, 0xfc, 0x31, 0x06, 0x00, 0x06, 0x48, 0x07, 0x49, + 0x01, 0x60, 0x07, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x08, 0x49, + 0x01, 0x60, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0x84, 0x95, 0x08, 0x00, 0xe9, 0x3b, 0x02, 0x00, 0xa8, 0x95, 0x08, 0x00, + 0x29, 0x3b, 0x02, 0x00, 0x9c, 0x92, 0x08, 0x00, 0x0d, 0x3c, 0x02, 0x00, + 0x8c, 0x92, 0x08, 0x00, 0x35, 0x3c, 0x02, 0x00, 0x4b, 0xf2, 0xc7, 0x4c, + 0xc1, 0xf2, 0x12, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4b, 0xf6, 0x61, 0x6c, + 0xc1, 0xf2, 0x01, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4c, 0xf2, 0xad, 0x4c, + 0xc1, 0xf2, 0x01, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x7f, 0xb5, 0x05, 0x46, + 0x22, 0x48, 0x0c, 0x46, 0x02, 0x21, 0x22, 0x46, 0x2b, 0x46, 0x06, 0x68, + 0x00, 0x20, 0x00, 0x90, 0x01, 0x20, 0xb0, 0x47, 0x1e, 0x48, 0x0d, 0xf1, + 0x0f, 0x01, 0x03, 0xaa, 0x0d, 0xf1, 0x0a, 0x03, 0x06, 0x68, 0x02, 0xa8, + 0x00, 0x90, 0x28, 0x46, 0xb0, 0x47, 0xbd, 0xf8, 0x0a, 0x00, 0x69, 0x28, + 0x0c, 0xd0, 0x21, 0x28, 0x10, 0xd0, 0x67, 0x28, 0x20, 0xd0, 0x20, 0x28, + 0x23, 0xd1, 0x17, 0x48, 0x61, 0x1f, 0xc9, 0xb2, 0x02, 0x68, 0xa8, 0x1c, + 0x90, 0x47, 0x1c, 0xe0, 0x61, 0x1f, 0xa8, 0x1c, 0xc9, 0xb2, 0x00, 0xf0, + 0x91, 0xf8, 0x16, 0xe0, 0x0e, 0x48, 0x61, 0x1f, 0xc9, 0xb2, 0x02, 0x68, + 0xa8, 0x1c, 0x90, 0x47, 0xa3, 0x4c, 0x20, 0x7b, 0x01, 0x28, 0x0c, 0xd1, + 0x0a, 0x48, 0x00, 0x21, 0x00, 0x25, 0x02, 0x68, 0x02, 0x20, 0x90, 0x47, + 0x25, 0x73, 0x04, 0xe0, 0x61, 0x1f, 0xa8, 0x1c, 0xc9, 0xb2, 0x00, 0xf0, + 0x0d, 0xf8, 0x01, 0x20, 0x04, 0xb0, 0x70, 0xbd, 0xec, 0x9e, 0x08, 0x00, + 0xf0, 0x9e, 0x08, 0x00, 0xc0, 0x9e, 0x08, 0x00, 0x68, 0xa3, 0x08, 0x00, + 0xbc, 0x9e, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x43, 0xa1, 0xb0, 0x92, 0x4c, + 0x0e, 0x46, 0x05, 0x46, 0x27, 0x68, 0x27, 0xb9, 0x00, 0x20, 0xca, 0x21, + 0xfd, 0xf7, 0x36, 0xf9, 0x27, 0x68, 0x0d, 0xf1, 0x44, 0x08, 0x40, 0x21, + 0x4f, 0xf0, 0x40, 0x09, 0x40, 0x46, 0xff, 0xf7, 0xd3, 0xfa, 0x29, 0x48, + 0x39, 0x46, 0x67, 0x22, 0x2b, 0x46, 0x8d, 0xe8, 0x40, 0x03, 0x04, 0x68, + 0x02, 0x20, 0xa0, 0x47, 0x03, 0xad, 0x36, 0x21, 0x68, 0x1c, 0xff, 0xf7, + 0x79, 0xff, 0x14, 0x99, 0xe8, 0x1d, 0x08, 0xf1, 0x2c, 0x04, 0x00, 0xf8, + 0x02, 0x1b, 0x0a, 0x0e, 0x8b, 0x00, 0x42, 0x70, 0x0a, 0x0c, 0x02, 0x70, + 0x12, 0x98, 0x9d, 0xf8, 0x4d, 0x20, 0xad, 0xf8, 0x0e, 0x00, 0x8d, 0xf8, + 0x0c, 0x20, 0x9d, 0xf8, 0x45, 0x20, 0x00, 0x0c, 0xad, 0xf8, 0x10, 0x00, + 0x08, 0x0a, 0x14, 0x21, 0x8d, 0xf8, 0x12, 0x20, 0x8d, 0xf8, 0x14, 0x00, + 0x05, 0xf1, 0x0b, 0x00, 0x22, 0x46, 0xfd, 0xf7, 0x0f, 0xf9, 0x1b, 0x99, + 0x05, 0xf1, 0x1f, 0x00, 0x00, 0x22, 0x8d, 0xf8, 0x2c, 0x20, 0x00, 0xf8, + 0x02, 0x1b, 0x8b, 0x00, 0x14, 0x21, 0x42, 0x70, 0x02, 0x70, 0x05, 0xf1, + 0x23, 0x00, 0x22, 0x46, 0xfd, 0xf7, 0xfe, 0xf8, 0x2c, 0x48, 0x90, 0xf8, + 0x2c, 0x01, 0x80, 0x07, 0x06, 0xd5, 0xb4, 0x48, 0x06, 0x49, 0x11, 0xaa, + 0x40, 0x23, 0x04, 0x68, 0x09, 0x20, 0xa0, 0x47, 0x03, 0xa8, 0x06, 0xf0, + 0x9f, 0xf9, 0x21, 0xb0, 0xbd, 0xe8, 0xf0, 0x83, 0xc8, 0xff, 0x08, 0x00, + 0xae, 0x44, 0x02, 0x00, 0xf0, 0xb5, 0x85, 0xb0, 0x5c, 0x4e, 0x0d, 0x46, + 0x04, 0x46, 0x31, 0x68, 0x29, 0xb9, 0x00, 0x20, 0x4f, 0xf4, 0x84, 0x71, + 0xfd, 0xf7, 0xca, 0xf8, 0x31, 0x68, 0xe6, 0x48, 0x04, 0xaa, 0x00, 0x26, + 0x23, 0x46, 0xcd, 0xe9, 0x00, 0x52, 0x69, 0x22, 0x04, 0x96, 0x07, 0x68, + 0x04, 0x20, 0x02, 0x90, 0x02, 0x20, 0xb8, 0x47, 0x51, 0x48, 0xc1, 0x7b, + 0x05, 0x29, 0x09, 0xd1, 0xc6, 0x73, 0x65, 0x48, 0x01, 0x68, 0x42, 0x20, + 0x88, 0x47, 0x18, 0xb1, 0xdb, 0x48, 0x01, 0x68, 0x42, 0x20, 0x88, 0x47, + 0x0d, 0x4c, 0xd4, 0xf8, 0x2c, 0x01, 0x81, 0x07, 0x08, 0xd5, 0xbd, 0xf8, + 0x12, 0x30, 0x0b, 0x48, 0x0b, 0x4a, 0x78, 0x21, 0x00, 0xf0, 0xdc, 0xfa, + 0xd4, 0xf8, 0x2c, 0x01, 0x80, 0x07, 0x05, 0xd5, 0x08, 0x48, 0x06, 0x4a, + 0x02, 0x21, 0x03, 0x68, 0x09, 0x20, 0x98, 0x47, 0x00, 0x20, 0x06, 0xf0, + 0x25, 0xf8, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0xbf, 0x8c, 0x7e, 0x08, 0x00, + 0x14, 0xdb, 0x05, 0x00, 0x88, 0x44, 0x02, 0x00, 0x70, 0x9b, 0x08, 0x00, + 0x70, 0xb5, 0x8e, 0xb0, 0x19, 0x9c, 0x36, 0x4e, 0x02, 0xad, 0x0d, 0x94, + 0x18, 0x9c, 0x0c, 0x94, 0x17, 0x9c, 0x0b, 0x94, 0x16, 0x9c, 0x0a, 0x94, + 0x15, 0x9c, 0x09, 0x94, 0x14, 0x9c, 0x08, 0x94, 0x13, 0x9c, 0x07, 0x94, + 0x12, 0x9c, 0x1f, 0xc5, 0x30, 0x68, 0x1a, 0x9d, 0x20, 0xb9, 0x00, 0x20, + 0x4f, 0xf4, 0xa1, 0x71, 0xfd, 0xf7, 0x6e, 0xf8, 0x2a, 0x4c, 0x14, 0xf8, + 0x0d, 0x0f, 0x03, 0x28, 0x04, 0xd1, 0x29, 0x48, 0x90, 0xf8, 0x79, 0x00, + 0x01, 0x28, 0x0d, 0xd1, 0xe7, 0x48, 0x90, 0xf8, 0x2c, 0x01, 0x80, 0x07, + 0x2c, 0xd5, 0xe6, 0x48, 0x27, 0x4a, 0x03, 0x68, 0x09, 0x20, 0x00, 0x21, + 0x0e, 0xb0, 0xbd, 0xe8, 0x70, 0x40, 0x18, 0x47, 0x01, 0x2d, 0x09, 0xd1, + 0xa0, 0x78, 0x58, 0xb1, 0xde, 0x48, 0x90, 0xf8, 0x2c, 0x01, 0x80, 0x07, + 0x1a, 0xd5, 0xdd, 0x48, 0xde, 0x4a, 0xec, 0xe7, 0x15, 0xb9, 0xa0, 0x78, + 0x00, 0x28, 0xf3, 0xd0, 0xdc, 0x49, 0x30, 0x68, 0x02, 0xab, 0x68, 0x22, + 0x0e, 0x68, 0x30, 0x21, 0x00, 0x91, 0x02, 0x21, 0xb0, 0x47, 0x14, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x30, 0xb1, 0x13, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x03, 0x28, 0x08, 0xbf, 0x01, 0x2d, 0x01, 0xd0, 0x0e, 0xb0, 0x70, 0xbd, + 0xcd, 0x48, 0x90, 0xf8, 0x2c, 0x01, 0x80, 0x07, 0x06, 0xd5, 0x56, 0x48, + 0x0c, 0x49, 0x02, 0xaa, 0x30, 0x23, 0x05, 0x68, 0x09, 0x20, 0xa8, 0x47, + 0xcc, 0x48, 0x00, 0x21, 0x01, 0x70, 0x00, 0xf0, 0x13, 0xf8, 0x00, 0x28, + 0xea, 0xd1, 0x05, 0x20, 0xa0, 0x70, 0xe7, 0xe7, 0x18, 0x1f, 0x01, 0x00, + 0x90, 0xdb, 0x05, 0x00, 0x50, 0xe2, 0x05, 0x00, 0x48, 0xe5, 0x08, 0x00, + 0x3c, 0xe5, 0x08, 0x00, 0xe7, 0x44, 0x02, 0x00, 0xc1, 0x44, 0x02, 0x00, + 0xb0, 0xb5, 0x0f, 0x48, 0x01, 0x68, 0x42, 0x20, 0x88, 0x47, 0x08, 0xb1, + 0x17, 0x20, 0xb0, 0xbd, 0xbc, 0x4c, 0x20, 0x78, 0x09, 0x28, 0x03, 0xd3, + 0x00, 0x20, 0x20, 0x70, 0x43, 0x20, 0xb0, 0xbd, 0x08, 0x49, 0x91, 0xf8, + 0xc0, 0x10, 0x39, 0xb1, 0x07, 0x48, 0x01, 0x21, 0x01, 0x22, 0x03, 0x23, + 0x05, 0x68, 0x42, 0x20, 0xa8, 0x47, 0x20, 0x78, 0x01, 0x30, 0x20, 0x70, + 0x00, 0x20, 0xb0, 0xbd, 0x34, 0x9d, 0x08, 0x00, 0xd0, 0x32, 0x06, 0x00, + 0x20, 0x9d, 0x08, 0x00, 0x70, 0xb5, 0x92, 0xb0, 0xa6, 0x4d, 0x04, 0x46, + 0x28, 0x68, 0x20, 0xb9, 0x00, 0x20, 0x4f, 0xf4, 0xc8, 0x71, 0xfc, 0xf7, + 0xdb, 0xff, 0x01, 0x2c, 0x0e, 0xd1, 0xe8, 0x48, 0xc0, 0x7b, 0x78, 0xb1, + 0xa0, 0x48, 0x90, 0xf8, 0x2c, 0x01, 0x80, 0x07, 0x4c, 0xd5, 0x9f, 0x48, + 0xa0, 0x4a, 0x03, 0x68, 0x09, 0x20, 0x00, 0x21, 0x98, 0x47, 0x45, 0xe0, + 0x14, 0xb9, 0xe0, 0x48, 0xc0, 0x7b, 0xe0, 0xb3, 0x02, 0xa8, 0x40, 0x21, + 0xff, 0xf7, 0x68, 0xf9, 0xd0, 0x48, 0x01, 0x78, 0x1f, 0x29, 0x00, 0xd8, + 0x09, 0xb9, 0x01, 0x21, 0x01, 0x70, 0x40, 0x78, 0x08, 0x23, 0x41, 0xf0, + 0x80, 0x01, 0x01, 0x22, 0x8d, 0xf8, 0x10, 0x30, 0x02, 0x23, 0x8d, 0xf8, + 0x11, 0x10, 0x40, 0x21, 0x8d, 0xf8, 0x12, 0x20, 0x8d, 0xf8, 0x08, 0x20, + 0x20, 0x22, 0x8d, 0xf8, 0x13, 0x00, 0x8e, 0x48, 0x03, 0x93, 0x00, 0x91, + 0x02, 0xab, 0x02, 0x21, 0x06, 0x68, 0x28, 0x68, 0xb0, 0x47, 0x01, 0x2c, + 0x1a, 0xd1, 0x85, 0x48, 0x90, 0xf8, 0x2c, 0x01, 0x80, 0x07, 0x06, 0xd5, + 0x0d, 0x48, 0x0e, 0x49, 0x02, 0xaa, 0x40, 0x23, 0x04, 0x68, 0x09, 0x20, + 0xa0, 0x47, 0x84, 0x48, 0x00, 0x21, 0x01, 0x70, 0xff, 0xf7, 0x82, 0xff, + 0x40, 0xb9, 0xc2, 0x48, 0x01, 0x21, 0xc1, 0x73, 0x04, 0xe0, 0x7a, 0x48, + 0x90, 0xf8, 0x2c, 0x01, 0x80, 0x07, 0x01, 0xd4, 0x12, 0xb0, 0x70, 0xbd, + 0x77, 0x48, 0x78, 0x4a, 0xaf, 0xe7, 0x00, 0xbf, 0xf8, 0x9d, 0x08, 0x00, + 0x19, 0x45, 0x02, 0x00, 0x2d, 0xe9, 0xf0, 0x43, 0x93, 0xb0, 0x70, 0x4c, + 0x0e, 0x46, 0x81, 0x46, 0x27, 0x68, 0x2f, 0xb9, 0x00, 0x20, 0x4f, 0xf4, + 0xf1, 0x71, 0xfc, 0xf7, 0x6d, 0xff, 0x27, 0x68, 0x03, 0xac, 0x40, 0x21, + 0x4f, 0xf0, 0x40, 0x08, 0x20, 0x46, 0xff, 0xf7, 0x0b, 0xf9, 0x34, 0x48, + 0x39, 0x46, 0x20, 0x22, 0x4b, 0x46, 0xcd, 0xe9, 0x00, 0x64, 0xcd, 0xf8, + 0x08, 0x80, 0x05, 0x68, 0x02, 0x20, 0xa8, 0x47, 0x04, 0x98, 0x98, 0xb1, + 0x9b, 0x49, 0x00, 0x23, 0x01, 0x22, 0x04, 0xeb, 0x43, 0x03, 0x1d, 0x7a, + 0x01, 0x2d, 0x06, 0xd1, 0x4d, 0x78, 0x5b, 0x7a, 0x05, 0xf0, 0x1f, 0x05, + 0x45, 0xea, 0x53, 0x13, 0x4b, 0x70, 0xd3, 0xb2, 0x55, 0x1c, 0x98, 0x42, + 0x2a, 0x46, 0xee, 0xd8, 0x9d, 0x48, 0x41, 0x7b, 0x03, 0x29, 0x1c, 0xbf, + 0x03, 0x21, 0x41, 0x73, 0x9b, 0x48, 0x09, 0x21, 0x00, 0x78, 0xfc, 0xf7, + 0x51, 0xff, 0x13, 0xb0, 0xbd, 0xe8, 0xf0, 0x83, 0x2d, 0xe9, 0xf0, 0x43, + 0x93, 0xb0, 0x4e, 0x4f, 0x0d, 0x46, 0x81, 0x46, 0x3e, 0x68, 0x2e, 0xb9, + 0x00, 0x20, 0x40, 0xf2, 0x49, 0x21, 0xfc, 0xf7, 0x29, 0xff, 0x3e, 0x68, + 0x04, 0xaf, 0x3c, 0x21, 0x4f, 0xf0, 0x3c, 0x08, 0x38, 0x46, 0xff, 0xf7, + 0xc7, 0xf8, 0x12, 0x48, 0x31, 0x46, 0x21, 0x22, 0x4b, 0x46, 0x8d, 0xe8, + 0xa0, 0x01, 0x04, 0x68, 0x02, 0x20, 0xa0, 0x47, 0x87, 0x48, 0x10, 0xf8, + 0x0d, 0x1f, 0x03, 0x29, 0x1c, 0xbf, 0x03, 0x21, 0x01, 0x70, 0x81, 0x78, + 0x01, 0x29, 0x0e, 0xd1, 0x00, 0x21, 0x81, 0x70, 0x75, 0x48, 0x01, 0x78, + 0x01, 0x31, 0x01, 0x70, 0x7e, 0x48, 0x01, 0x68, 0x42, 0x20, 0x88, 0x47, + 0x18, 0xb1, 0x04, 0x48, 0x01, 0x68, 0x42, 0x20, 0x88, 0x47, 0x13, 0xb0, + 0xbd, 0xe8, 0xf0, 0x83, 0xc8, 0xff, 0x08, 0x00, 0x30, 0x9d, 0x08, 0x00, + 0x70, 0xb5, 0x90, 0xb0, 0x2f, 0x4e, 0x04, 0x46, 0x30, 0x68, 0x20, 0xb9, + 0x00, 0x20, 0x40, 0xf2, 0x81, 0x21, 0xfc, 0xf7, 0xed, 0xfe, 0x01, 0xa8, + 0x3c, 0x21, 0xff, 0xf7, 0x8f, 0xf8, 0x70, 0x48, 0x01, 0x2c, 0x00, 0xf1, + 0x0d, 0x05, 0x0d, 0xd1, 0xa8, 0x78, 0x70, 0xb1, 0x26, 0x48, 0x90, 0xf8, + 0x2c, 0x01, 0x80, 0x07, 0x40, 0xd5, 0x25, 0x48, 0x26, 0x4a, 0x03, 0x68, + 0x09, 0x20, 0x00, 0x21, 0x98, 0x47, 0x39, 0xe0, 0x0c, 0xb9, 0xa8, 0x78, + 0x88, 0xb3, 0x01, 0x21, 0x08, 0x20, 0x01, 0xab, 0x8d, 0xf8, 0x04, 0x10, + 0x8d, 0xf8, 0x0e, 0x10, 0x55, 0x49, 0x8d, 0xf8, 0x0c, 0x00, 0x02, 0x20, + 0x02, 0x90, 0x0a, 0x78, 0x49, 0x78, 0x8d, 0xf8, 0x0f, 0x10, 0x29, 0x78, + 0x8d, 0xf8, 0x0d, 0x20, 0x21, 0x22, 0x03, 0x29, 0x18, 0x49, 0x18, 0xbf, + 0x28, 0x70, 0x30, 0x68, 0x0e, 0x68, 0x3c, 0x21, 0x00, 0x91, 0x02, 0x21, + 0xb0, 0x47, 0x01, 0x2c, 0x16, 0xd1, 0x44, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x90, 0xb1, 0x43, 0x48, 0x00, 0x68, 0x80, 0x47, 0x03, 0x28, 0x0d, 0xd1, + 0x0f, 0x48, 0x00, 0x21, 0x01, 0x70, 0xff, 0xf7, 0x99, 0xfe, 0x38, 0xb9, + 0x02, 0x20, 0xa8, 0x70, 0x04, 0xe0, 0x06, 0x48, 0x90, 0xf8, 0x2c, 0x01, + 0x80, 0x07, 0x01, 0xd4, 0x10, 0xb0, 0x70, 0xbd, 0x03, 0x48, 0x04, 0x4a, + 0xbb, 0xe7, 0x00, 0xbf, 0x18, 0x1f, 0x01, 0x00, 0x8c, 0x7e, 0x08, 0x00, + 0x70, 0x9b, 0x08, 0x00, 0x01, 0x45, 0x02, 0x00, 0xd4, 0x44, 0x02, 0x00, + 0x48, 0xca, 0x08, 0x00, 0x8c, 0xdb, 0x05, 0x00, 0x42, 0x28, 0x18, 0xbf, + 0x00, 0xf0, 0xc4, 0xb8, 0x2d, 0xe9, 0xf0, 0x4f, 0x89, 0xb0, 0x3c, 0x4a, + 0xd0, 0x7b, 0x02, 0xf1, 0x0c, 0x04, 0x05, 0x28, 0x28, 0xd8, 0xdf, 0xe8, + 0x00, 0xf0, 0x4c, 0x03, 0x07, 0x27, 0x27, 0x0b, 0x00, 0x20, 0xff, 0xf7, + 0x8d, 0xfe, 0x1f, 0xe0, 0x00, 0x20, 0xff, 0xf7, 0x77, 0xff, 0x1b, 0xe0, + 0x52, 0xf8, 0x14, 0x0f, 0x04, 0xf1, 0x20, 0x0e, 0x04, 0xf1, 0x2c, 0x0a, + 0xa6, 0x69, 0x00, 0x25, 0x9e, 0xe8, 0x80, 0x48, 0x9a, 0xe8, 0x00, 0x07, + 0xd2, 0xf8, 0x14, 0xc0, 0x51, 0x68, 0xd3, 0x68, 0x22, 0x69, 0x08, 0x95, + 0x02, 0xad, 0xcd, 0xe9, 0x00, 0x6c, 0x85, 0xe8, 0x80, 0x48, 0x05, 0xad, + 0x85, 0xe8, 0x00, 0x07, 0xff, 0xf7, 0xc8, 0xfd, 0xff, 0xf7, 0x44, 0xfe, + 0x08, 0xb3, 0x12, 0x48, 0x00, 0x68, 0x80, 0x47, 0x48, 0xb1, 0x11, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x03, 0x28, 0x04, 0xd1, 0x0f, 0x48, 0x00, 0x21, + 0x01, 0x80, 0x0f, 0x48, 0x01, 0x70, 0xe0, 0x78, 0x01, 0x28, 0x0e, 0xd1, + 0x0d, 0x48, 0x00, 0x68, 0x80, 0x47, 0x0d, 0x48, 0x00, 0x25, 0x45, 0x70, + 0x20, 0x78, 0x01, 0x28, 0x05, 0xd1, 0x0b, 0x48, 0x01, 0x21, 0x02, 0x68, + 0x02, 0x20, 0x90, 0x47, 0x25, 0x70, 0x00, 0x20, 0xe0, 0x70, 0x09, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0x48, 0xe5, 0x08, 0x00, 0x3c, 0xe5, 0x08, 0x00, + 0xf6, 0xda, 0x05, 0x00, 0xf5, 0xda, 0x05, 0x00, 0x3c, 0xca, 0x08, 0x00, + 0x50, 0x1f, 0x01, 0x00, 0x68, 0xa3, 0x08, 0x00, 0x80, 0xb5, 0x08, 0x48, + 0x01, 0x68, 0x42, 0x20, 0x88, 0x47, 0x08, 0xb1, 0x17, 0x20, 0x80, 0xbd, + 0x05, 0x48, 0x01, 0x21, 0x01, 0x73, 0x05, 0x48, 0x08, 0x21, 0x00, 0x78, + 0xfc, 0xf7, 0x24, 0xfe, 0x00, 0x20, 0x80, 0xbd, 0x34, 0x9d, 0x08, 0x00, + 0x90, 0xdb, 0x05, 0x00, 0x24, 0xba, 0x01, 0x00, 0x1c, 0xb5, 0x04, 0x46, + 0x09, 0x48, 0x01, 0x68, 0x20, 0x01, 0x0b, 0x30, 0x8d, 0xf8, 0x07, 0x00, + 0xc0, 0xb2, 0x88, 0x47, 0x4c, 0xb1, 0x06, 0x48, 0x0d, 0xf1, 0x07, 0x03, + 0x03, 0x21, 0x01, 0x22, 0x04, 0x68, 0x01, 0x20, 0x00, 0x90, 0x01, 0x20, + 0xa0, 0x47, 0x1c, 0xbd, 0xf4, 0x9e, 0x08, 0x00, 0xec, 0x9e, 0x08, 0x00, + 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, + 0x08, 0x48, 0x09, 0x49, 0x01, 0x60, 0x09, 0x48, 0x09, 0x49, 0x01, 0x60, + 0x09, 0x48, 0x0a, 0x49, 0x01, 0x60, 0x70, 0x47, 0xc0, 0x9e, 0x08, 0x00, + 0x91, 0x41, 0x02, 0x00, 0xb8, 0x9e, 0x08, 0x00, 0xd5, 0x3c, 0x02, 0x00, + 0xbc, 0x9e, 0x08, 0x00, 0x09, 0x41, 0x02, 0x00, 0x5c, 0x95, 0x08, 0x00, + 0xed, 0x42, 0x02, 0x00, 0xe8, 0x9e, 0x08, 0x00, 0xc5, 0x43, 0x02, 0x00, + 0x4b, 0xf2, 0x7d, 0x3c, 0xc1, 0xf2, 0x12, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4c, 0xf6, 0xd5, 0x3c, 0xc1, 0xf2, 0x01, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x70, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x20, 0x61, 0x63, 0x6b, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, + 0x64, 0x20, 0x73, 0x65, 0x71, 0x5f, 0x6e, 0x75, 0x6d, 0x3a, 0x20, 0x25, + 0x78, 0x00, 0x52, 0x58, 0x3a, 0x20, 0x42, 0x54, 0x20, 0x4e, 0x45, 0x20, + 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x3a, 0x20, 0x20, 0x00, 0x4d, 0x57, 0x53, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x65, 0x64, 0x00, 0x4d, 0x57, 0x53, 0x20, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x66, 0x61, 0x63, 0x65, 0x20, 0x62, 0x75, 0x73, 0x79, 0x00, 0x54, + 0x58, 0x3a, 0x20, 0x42, 0x54, 0x20, 0x4e, 0x45, 0x20, 0x50, 0x4f, 0x57, + 0x45, 0x52, 0x20, 0x52, 0x45, 0x50, 0x4f, 0x52, 0x54, 0x3a, 0x20, 0x20, + 0x00, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x74, 0x72, 0x79, + 0x00, 0x54, 0x58, 0x3a, 0x20, 0x42, 0x54, 0x20, 0x53, 0x59, 0x4e, 0x43, + 0x20, 0x52, 0x45, 0x51, 0x3a, 0x20, 0x20, 0x00, 0x2d, 0xe9, 0xfc, 0x41, + 0x05, 0x46, 0x2e, 0x48, 0x01, 0x2a, 0x00, 0x68, 0x01, 0x90, 0x22, 0xd8, + 0x0d, 0xb3, 0x00, 0x27, 0x00, 0xb3, 0x0e, 0x46, 0x80, 0x21, 0x14, 0x46, + 0xff, 0xf7, 0xb2, 0xfb, 0x28, 0x48, 0x01, 0xab, 0x31, 0x46, 0x22, 0x46, + 0x00, 0x97, 0xd0, 0xf8, 0x00, 0xc0, 0x28, 0x46, 0xe0, 0x47, 0x88, 0xb1, + 0xdf, 0xf8, 0x90, 0x80, 0x04, 0x46, 0xd8, 0xf8, 0x00, 0x00, 0x80, 0x47, + 0x68, 0xb1, 0x22, 0x48, 0x00, 0x68, 0x80, 0x47, 0x03, 0x28, 0x08, 0xd1, + 0x01, 0x98, 0x21, 0x46, 0xfe, 0xf7, 0xa8, 0xfa, 0x32, 0xe0, 0x10, 0x27, + 0x38, 0x46, 0xbd, 0xe8, 0xfc, 0x81, 0x1c, 0x48, 0xf2, 0xb2, 0x02, 0x21, + 0x2b, 0x46, 0x07, 0x68, 0x01, 0x20, 0x00, 0x90, 0x01, 0x20, 0xb8, 0x47, + 0xd8, 0xf8, 0x00, 0x00, 0x80, 0x47, 0x17, 0x4d, 0x78, 0xb1, 0x17, 0x48, + 0x90, 0xf8, 0x34, 0x02, 0x58, 0xb9, 0x28, 0x68, 0x40, 0xf4, 0x00, 0x70, + 0x28, 0x60, 0x28, 0x68, 0x40, 0xf4, 0x80, 0x60, 0x28, 0x60, 0x28, 0x68, + 0x20, 0xf4, 0x00, 0x60, 0x28, 0x60, 0x10, 0x48, 0x21, 0x46, 0x02, 0x68, + 0x01, 0x98, 0x90, 0x47, 0x28, 0x68, 0x20, 0xf4, 0x80, 0x60, 0x28, 0x60, + 0x28, 0x68, 0x40, 0xf4, 0x00, 0x70, 0x28, 0x60, 0x28, 0x68, 0x40, 0xf4, + 0x00, 0x60, 0x28, 0x60, 0x00, 0x27, 0xcb, 0xe7, 0x70, 0x20, 0x01, 0x00, + 0xd0, 0x95, 0x08, 0x00, 0x48, 0xe5, 0x08, 0x00, 0x3c, 0xe5, 0x08, 0x00, + 0xec, 0x9e, 0x08, 0x00, 0xb0, 0x50, 0x00, 0x30, 0x38, 0x21, 0x01, 0x00, + 0xd4, 0x95, 0x08, 0x00, 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, + 0xf0, 0x95, 0x08, 0x00, 0x2d, 0x45, 0x02, 0x00, 0x2d, 0xe9, 0xf8, 0x43, + 0x98, 0x46, 0x15, 0x46, 0x0e, 0x46, 0x07, 0x46, 0x20, 0xb1, 0x02, 0x2e, + 0x02, 0xd8, 0xb8, 0xf1, 0x00, 0x0f, 0x03, 0xd1, 0x00, 0x20, 0x54, 0x21, + 0xfc, 0xf7, 0xe0, 0xfc, 0x38, 0x68, 0x01, 0x38, 0x05, 0x28, 0x23, 0xd8, + 0xdf, 0xf8, 0x54, 0x90, 0x07, 0xeb, 0x46, 0x00, 0x07, 0xeb, 0x86, 0x01, + 0x00, 0x8a, 0x8c, 0x69, 0x58, 0xb1, 0x00, 0xeb, 0x40, 0x01, 0x04, 0xeb, + 0x41, 0x01, 0x22, 0x88, 0xaa, 0x42, 0x0f, 0xd0, 0x01, 0x38, 0x04, 0xf1, + 0x06, 0x04, 0xf8, 0xd1, 0x0c, 0x46, 0xd9, 0xf8, 0x00, 0x10, 0x38, 0x46, + 0x88, 0x47, 0x07, 0x46, 0x00, 0x28, 0xe5, 0xd1, 0x00, 0x20, 0x72, 0x21, + 0xfc, 0xf7, 0xbc, 0xfc, 0xa0, 0x88, 0xc8, 0xf8, 0x00, 0x00, 0x03, 0xe0, + 0x00, 0x20, 0x79, 0x21, 0xfc, 0xf7, 0xb4, 0xfc, 0x00, 0x20, 0xbd, 0xe8, + 0xf8, 0x83, 0x00, 0xbf, 0xc8, 0x95, 0x08, 0x00, 0x01, 0x48, 0x02, 0x49, + 0x01, 0x60, 0x70, 0x47, 0xf4, 0x95, 0x08, 0x00, 0x1d, 0x46, 0x02, 0x00, + 0xb0, 0xb5, 0x12, 0x48, 0x00, 0x21, 0x14, 0x4c, 0x26, 0x4d, 0x01, 0x70, + 0x10, 0x48, 0x11, 0x49, 0x01, 0x60, 0x94, 0xf8, 0x0b, 0x03, 0x00, 0x28, + 0x18, 0xbf, 0x01, 0x20, 0x28, 0x70, 0x0f, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x0e, 0x48, 0x2a, 0x78, 0xd4, 0xf8, 0x00, 0x13, 0x03, 0x68, 0x01, 0x20, + 0x98, 0x47, 0x28, 0x78, 0x40, 0xb1, 0x1c, 0x48, 0x01, 0x68, 0x01, 0x20, + 0x88, 0x47, 0x01, 0x20, 0xbd, 0xe8, 0xb0, 0x40, 0xff, 0xf7, 0x9c, 0xbc, + 0xb0, 0xbd, 0x00, 0xbf, 0xed, 0x1e, 0x01, 0x00, 0x18, 0x1f, 0x01, 0x00, + 0x9c, 0xd1, 0x05, 0x00, 0x8c, 0x7e, 0x08, 0x00, 0x7c, 0x95, 0x08, 0x00, + 0x84, 0x95, 0x08, 0x00, 0x0f, 0x48, 0x00, 0x78, 0x01, 0x28, 0x18, 0xbf, + 0x70, 0x47, 0x01, 0x20, 0xff, 0xf7, 0x86, 0xbc, 0x0b, 0x48, 0x00, 0x78, + 0x01, 0x28, 0x18, 0xbf, 0x70, 0x47, 0x01, 0x20, 0xff, 0xf7, 0x6c, 0xbd, + 0x80, 0xb5, 0x07, 0x48, 0x00, 0x78, 0x01, 0x28, 0x18, 0xbf, 0x80, 0xbd, + 0x05, 0x48, 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, 0x01, 0x20, 0xbd, 0xe8, + 0x80, 0x40, 0xff, 0xf7, 0x6f, 0xbc, 0x00, 0xbf, 0xec, 0x1e, 0x01, 0x00, + 0x74, 0x95, 0x08, 0x00, 0x06, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, + 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, + 0x08, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, 0x20, 0xf5, 0x08, 0x00, + 0x15, 0x47, 0x02, 0x00, 0xfc, 0xf4, 0x08, 0x00, 0xb1, 0x46, 0x02, 0x00, + 0x24, 0xf5, 0x08, 0x00, 0x25, 0x47, 0x02, 0x00, 0x1c, 0xf5, 0x08, 0x00, + 0x35, 0x47, 0x02, 0x00, 0x01, 0x38, 0x00, 0x21, 0x02, 0x28, 0x38, 0xbf, + 0x01, 0x21, 0x48, 0x00, 0x38, 0x49, 0x48, 0x73, 0x70, 0x47, 0x00, 0xbf, + 0x36, 0x49, 0x88, 0x60, 0x70, 0x47, 0x00, 0xbf, 0x2d, 0xe9, 0xf0, 0x47, + 0x8a, 0xb0, 0x33, 0x4d, 0x04, 0x46, 0x30, 0x21, 0x05, 0xf1, 0x14, 0x00, + 0xfe, 0xf7, 0xc0, 0xfd, 0x20, 0x78, 0x61, 0x78, 0xe2, 0x78, 0xa3, 0x79, + 0x4f, 0xf0, 0x01, 0x08, 0x85, 0xf8, 0x14, 0x80, 0x85, 0xf8, 0x18, 0x80, + 0x85, 0xf8, 0x20, 0x80, 0x85, 0xf8, 0x22, 0x80, 0x85, 0xf8, 0x28, 0x80, + 0x85, 0xf8, 0x2a, 0x80, 0x40, 0xea, 0x01, 0x20, 0x85, 0xf8, 0x21, 0x30, + 0xe3, 0x7a, 0xe8, 0x82, 0x20, 0x46, 0x10, 0xf8, 0x02, 0x1f, 0x85, 0xf8, + 0x29, 0x30, 0x14, 0x23, 0x41, 0xea, 0x02, 0x21, 0x82, 0x78, 0xc0, 0x78, + 0x42, 0xea, 0x00, 0x20, 0x41, 0xea, 0x00, 0x40, 0x21, 0x46, 0xe8, 0x61, + 0x20, 0x7a, 0x11, 0xf8, 0x07, 0x2f, 0x42, 0xea, 0x00, 0x20, 0x8a, 0x78, + 0xc9, 0x78, 0x42, 0xea, 0x01, 0x21, 0x40, 0xea, 0x01, 0x40, 0x21, 0x46, + 0x68, 0x62, 0x60, 0x7b, 0x11, 0xf8, 0x0c, 0x2f, 0x42, 0xea, 0x00, 0x20, + 0x8a, 0x78, 0xc9, 0x78, 0x42, 0xea, 0x01, 0x21, 0x04, 0xf1, 0x10, 0x02, + 0x40, 0xea, 0x01, 0x40, 0x14, 0x21, 0xe8, 0x62, 0x05, 0xf1, 0x30, 0x00, + 0xfc, 0xf7, 0xe4, 0xfb, 0x05, 0xf1, 0x14, 0x07, 0x05, 0xf1, 0x2c, 0x0e, + 0xd5, 0xe9, 0x0e, 0x9a, 0x2d, 0x6c, 0x9f, 0xcf, 0x9e, 0xe8, 0x40, 0x50, + 0xcd, 0xe9, 0x00, 0x47, 0x02, 0xac, 0x84, 0xe8, 0x40, 0x50, 0xcd, 0xe9, + 0x05, 0x9a, 0xcd, 0xe9, 0x07, 0x58, 0xff, 0xf7, 0x33, 0xfb, 0x0a, 0xb0, + 0xbd, 0xe8, 0xf0, 0x87, 0x90, 0xdb, 0x05, 0x00, 0x10, 0x48, 0x00, 0x21, + 0x01, 0x22, 0x40, 0xf8, 0x0c, 0x1f, 0x81, 0x80, 0x42, 0x70, 0x40, 0xf8, + 0x04, 0x1c, 0x70, 0x47, 0x0b, 0x48, 0x00, 0x21, 0x41, 0x73, 0x70, 0x47, + 0x09, 0x48, 0x01, 0x21, 0x41, 0x73, 0x70, 0x47, 0x07, 0x48, 0x01, 0x21, + 0x01, 0x73, 0x70, 0x47, 0x05, 0x48, 0x00, 0x21, 0x01, 0x73, 0x70, 0x47, + 0x03, 0x48, 0x02, 0x21, 0x41, 0x73, 0x70, 0x47, 0x01, 0x48, 0x03, 0x21, + 0x41, 0x73, 0x70, 0x47, 0x90, 0xdb, 0x05, 0x00, 0x02, 0x28, 0x08, 0xbf, + 0x10, 0x29, 0x01, 0xd0, 0x00, 0x20, 0x70, 0x47, 0x02, 0x48, 0x06, 0x2a, + 0x18, 0xbf, 0x00, 0x20, 0x70, 0x47, 0x00, 0xbf, 0x9c, 0xd1, 0x05, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x21, 0x00, 0x01, 0x00, 0x39, 0x00, + 0x22, 0x00, 0x02, 0x00, 0x05, 0x00, 0x23, 0x00, 0x03, 0x00, 0x1c, 0x00, + 0x24, 0x00, 0x04, 0x00, 0x8b, 0x00, 0x25, 0x00, 0x05, 0x00, 0x25, 0x00, + 0x26, 0x00, 0x06, 0x00, 0x45, 0x00, 0x27, 0x00, 0x09, 0x00, 0x25, 0x00, + 0x28, 0x00, 0x0a, 0x00, 0x25, 0x00, 0x29, 0x00, 0x0b, 0x00, 0x25, 0x00, + 0x2a, 0x00, 0x0e, 0x00, 0x6a, 0x00, 0x2b, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x10, 0x00, 0x08, 0x00, 0x2d, 0x00, 0x11, 0x00, 0x08, 0x00, + 0x2e, 0x00, 0x12, 0x00, 0x04, 0x00, 0x2f, 0x00, 0x13, 0x00, 0x0e, 0x00, + 0x30, 0x00, 0x14, 0x00, 0x04, 0x00, 0x31, 0x00, 0x07, 0x00, 0x45, 0x00, + 0x32, 0x00, 0x08, 0x00, 0x45, 0x00, 0x33, 0x00, 0x19, 0x00, 0x04, 0x00, + 0x34, 0x00, 0x1a, 0x00, 0x25, 0x00, 0x35, 0x00, 0x0c, 0x00, 0x25, 0x00, + 0x36, 0x00, 0x1b, 0x00, 0x78, 0x00, 0x37, 0x00, 0x1c, 0x00, 0x08, 0x00, + 0x38, 0x00, 0x1d, 0x00, 0x40, 0x00, 0x39, 0x00, 0x1e, 0x00, 0x28, 0x00, + 0x3a, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x8b, 0x00, + 0x3c, 0x00, 0x11, 0x00, 0x08, 0x00, 0x3d, 0x00, 0x12, 0x00, 0x04, 0x00, + 0x3e, 0x00, 0x13, 0x00, 0x0e, 0x00, 0x3f, 0x00, 0x14, 0x00, 0x04, 0x00, + 0x40, 0x00, 0x15, 0x00, 0x0e, 0x00, 0x41, 0x00, 0x16, 0x00, 0x46, 0x00, + 0x42, 0x00, 0x17, 0x00, 0x00, 0x00, 0x43, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x44, 0x00, 0x15, 0x00, 0x0e, 0x00, 0x45, 0x00, 0x16, 0x00, 0x46, 0x00, + 0x46, 0x00, 0x17, 0x00, 0x00, 0x00, 0x47, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x0d, 0x00, 0x25, 0x00, 0x49, 0x00, 0x20, 0x00, 0x0e, 0x00, + 0x4a, 0x00, 0x0d, 0x00, 0x25, 0x00, 0x4b, 0x00, 0x21, 0x00, 0x04, 0x00, + 0x4c, 0x00, 0x22, 0x00, 0x18, 0x00, 0x4d, 0x00, 0x23, 0x00, 0x1b, 0x00, + 0x4e, 0x00, 0x24, 0x00, 0x29, 0x00, 0x4f, 0x00, 0x25, 0x00, 0x19, 0x00, + 0x50, 0x00, 0x26, 0x00, 0x18, 0x00, 0x51, 0x00, 0x27, 0x00, 0x18, 0x00, + 0x52, 0x00, 0x28, 0x00, 0x25, 0x00, 0x53, 0x00, 0x29, 0x00, 0x05, 0x00, + 0x54, 0x00, 0x2a, 0x00, 0x05, 0x00, 0x55, 0x00, 0x2b, 0x00, 0x15, 0x00, + 0x56, 0x00, 0x2c, 0x00, 0x09, 0x00, 0x57, 0x00, 0x2d, 0x00, 0x13, 0x00, + 0x58, 0x00, 0x2e, 0x00, 0x64, 0x00, 0x59, 0x00, 0x30, 0x00, 0x44, 0x00, + 0x5a, 0x00, 0x31, 0x00, 0x05, 0x00, 0x5b, 0x00, 0x32, 0x00, 0x4b, 0x00, + 0x5c, 0x00, 0x33, 0x00, 0x05, 0x00, 0x5d, 0x00, 0x34, 0x00, 0x43, 0x00, + 0x5e, 0x00, 0x2f, 0x00, 0x4e, 0x00, 0x5f, 0x00, 0x35, 0x00, 0x08, 0x00, + 0x60, 0x00, 0x3e, 0x00, 0x10, 0x00, 0x61, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x62, 0x00, 0x41, 0x00, 0x13, 0x00, 0x63, 0x00, 0x36, 0x00, 0x05, 0x00, + 0x64, 0x00, 0x37, 0x00, 0x51, 0x00, 0x65, 0x00, 0x38, 0x00, 0x43, 0x00, + 0x66, 0x00, 0x39, 0x00, 0x05, 0x00, 0x67, 0x00, 0x3a, 0x00, 0x3f, 0x00, + 0x68, 0x00, 0x3b, 0x00, 0x33, 0x00, 0x69, 0x00, 0x3c, 0x00, 0x05, 0x00, + 0x6a, 0x00, 0x3d, 0x00, 0x53, 0x00, 0x6b, 0x00, 0x3f, 0x00, 0x8a, 0x00, + 0x28, 0x00, 0x42, 0x00, 0x01, 0x00, 0x00, 0x00, 0xd0, 0x4a, 0x02, 0x00, + 0x10, 0x4c, 0x02, 0x00, 0xcc, 0xd1, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x94, 0x50, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x94, 0x50, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x99, 0x50, 0x02, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x9e, 0x50, 0x02, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0xa3, 0x50, 0x02, 0x00, 0x28, 0x00, 0x00, 0x00, 0xae, 0x50, 0x02, 0x00, + 0x08, 0x00, 0x00, 0x00, 0xb7, 0x50, 0x02, 0x00, 0x18, 0x00, 0x00, 0x00, + 0xbc, 0x50, 0x02, 0x00, 0x18, 0x00, 0x00, 0x00, 0xbc, 0x50, 0x02, 0x00, + 0x18, 0x00, 0x00, 0x00, 0xbc, 0x50, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xc1, 0x50, 0x02, 0x00, 0x2c, 0x00, 0x00, 0x00, 0xc4, 0x50, 0x02, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xd1, 0x50, 0x02, 0x00, 0x74, 0x00, 0x00, 0x00, + 0xd8, 0x50, 0x02, 0x00, 0x28, 0x00, 0x00, 0x00, 0xe7, 0x50, 0x02, 0x00, + 0x48, 0x00, 0x00, 0x00, 0xf0, 0x50, 0x02, 0x00, 0x28, 0x00, 0x00, 0x00, + 0xe7, 0x50, 0x02, 0x00, 0x28, 0x00, 0x00, 0x00, 0xe7, 0x50, 0x02, 0x00, + 0x28, 0x00, 0x00, 0x00, 0xe7, 0x50, 0x02, 0x00, 0x28, 0x00, 0x00, 0x00, + 0xe7, 0x50, 0x02, 0x00, 0x14, 0x00, 0x00, 0x00, 0xf9, 0x50, 0x02, 0x00, + 0x7c, 0x00, 0x00, 0x00, 0x00, 0x51, 0x02, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x0f, 0x51, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0xc1, 0x50, 0x02, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x16, 0x51, 0x02, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x21, 0x51, 0x02, 0x00, 0x06, 0x00, 0x00, 0x00, 0x2a, 0x51, 0x02, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x2a, 0x51, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x31, 0x51, 0x02, 0x00, 0x28, 0x00, 0x00, 0x00, 0x3e, 0x51, 0x02, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x99, 0x50, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x4b, 0x51, 0x02, 0x00, 0x06, 0x00, 0x00, 0x00, 0x50, 0x51, 0x02, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x57, 0x51, 0x02, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xd1, 0x50, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x99, 0x50, 0x02, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x5c, 0x51, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x94, 0x50, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x94, 0x50, 0x02, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x69, 0x51, 0x02, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x20, 0x4e, 0x02, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x30, 0x4e, 0x02, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x3c, 0x4e, 0x02, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x42, 0x4e, 0x02, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x4a, 0x4e, 0x02, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x56, 0x4e, 0x02, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x5c, 0x4e, 0x02, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x5c, 0x4e, 0x02, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x5c, 0x4e, 0x02, 0x00, 0x2c, 0x00, 0x00, 0x00, + 0x62, 0x4e, 0x02, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x68, 0x4e, 0x02, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x6e, 0x4e, 0x02, 0x00, 0x2c, 0x00, 0x00, 0x00, + 0x6e, 0x4e, 0x02, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x74, 0x4e, 0x02, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x7a, 0x4e, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x80, 0x4e, 0x02, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x86, 0x4e, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x90, 0x4e, 0x02, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x94, 0x4e, 0x02, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x90, 0x4e, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x9e, 0x4e, 0x02, 0x00, 0x50, 0x00, 0x00, 0x00, 0xa4, 0x4e, 0x02, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x90, 0x4e, 0x02, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0xcc, 0x4e, 0x02, 0x00, 0xa0, 0x00, 0x00, 0x00, + 0xd2, 0x4e, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0xf2, 0x4e, 0x02, 0x00, + 0x50, 0x00, 0x00, 0x00, 0xfa, 0x4e, 0x02, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x02, 0x4f, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x0e, 0x4f, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x14, 0x4f, 0x02, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x17, 0x4f, 0x02, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x1d, 0x4f, 0x02, 0x00, 0x2c, 0x00, 0x00, 0x00, + 0x26, 0x4f, 0x02, 0x00, 0x18, 0x00, 0x00, 0x00, 0x41, 0x4f, 0x02, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x50, 0x4f, 0x02, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x5f, 0x4f, 0x02, 0x00, 0x20, 0x00, 0x00, 0x00, 0x6e, 0x4f, 0x02, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x7e, 0x4f, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x7e, 0x4f, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x82, 0x4f, 0x02, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x91, 0x4f, 0x02, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x99, 0x4f, 0x02, 0x00, 0x6c, 0x00, 0x00, 0x00, 0xa0, 0x4f, 0x02, 0x00, + 0x58, 0x00, 0x00, 0x00, 0xc2, 0x4f, 0x02, 0x00, 0x48, 0x00, 0x00, 0x00, + 0xc9, 0x4f, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x7e, 0x4f, 0x02, 0x00, + 0x50, 0x00, 0x00, 0x00, 0xe5, 0x4f, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x7e, 0x4f, 0x02, 0x00, 0x50, 0x00, 0x00, 0x00, 0x05, 0x50, 0x02, 0x00, + 0x04, 0x00, 0x00, 0x00, 0xf2, 0x4e, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x7e, 0x4f, 0x02, 0x00, 0x44, 0x00, 0x00, 0x00, 0x12, 0x50, 0x02, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x2e, 0x50, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x3b, 0x50, 0x02, 0x00, 0x40, 0x00, 0x00, 0x00, 0x3e, 0x50, 0x02, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x56, 0x50, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x7e, 0x4f, 0x02, 0x00, 0x58, 0x00, 0x00, 0x00, 0x70, 0x50, 0x02, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x7a, 0x50, 0x02, 0x00, 0x9c, 0x00, 0x00, 0x00, + 0x7f, 0x50, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x99, 0x4f, 0x02, 0x00, 0x48, 0x10, 0x57, 0x08, + 0x18, 0x04, 0x02, 0x00, 0x41, 0x11, 0x00, 0x39, 0xc2, 0x12, 0x01, 0x3c, + 0x48, 0x10, 0x57, 0x08, 0x18, 0x04, 0x02, 0x00, 0xc2, 0x11, 0x01, 0x3a, + 0xc1, 0x10, 0x07, 0x01, 0x02, 0x00, 0xc8, 0x10, 0x57, 0x08, 0x18, 0x04, + 0x0a, 0x00, 0x44, 0x10, 0x07, 0x04, 0x0b, 0x00, 0xc4, 0x11, 0x07, 0x34, + 0x0d, 0x00, 0xc4, 0x10, 0x07, 0x04, 0x0e, 0x00, 0xc4, 0x10, 0x07, 0x04, + 0x0f, 0x00, 0xc4, 0x10, 0x07, 0x04, 0x10, 0x00, 0xc4, 0x10, 0x07, 0x04, + 0x11, 0x00, 0xc4, 0x10, 0x07, 0x04, 0x12, 0x00, 0xc4, 0x10, 0x07, 0x04, + 0x13, 0x00, 0xc4, 0x10, 0x07, 0x04, 0x15, 0x00, 0xc2, 0x10, 0x07, 0x02, + 0x16, 0x00, 0x41, 0x10, 0x07, 0x01, 0x17, 0x00, 0xc1, 0x11, 0x00, 0x03, + 0xc1, 0x10, 0x00, 0x01, 0x41, 0x10, 0x07, 0x01, 0x19, 0x00, 0xc1, 0x11, + 0x00, 0x09, 0x01, 0x02, 0x00, 0x82, 0x02, 0x04, 0x44, 0x10, 0x02, 0x04, + 0x44, 0x11, 0x02, 0x0c, 0x44, 0x12, 0x02, 0x14, 0x44, 0x13, 0x02, 0x1c, + 0x44, 0x14, 0x02, 0x24, 0x44, 0x15, 0x02, 0x2c, 0x44, 0x16, 0x02, 0x34, + 0x44, 0x17, 0x02, 0x3c, 0x44, 0x18, 0x02, 0x44, 0xc4, 0x19, 0x02, 0x4c, + 0xc4, 0x10, 0x07, 0x04, 0x1d, 0x00, 0x48, 0x10, 0x57, 0x08, 0x08, 0x04, + 0x1e, 0x00, 0x48, 0x11, 0x57, 0x20, 0x08, 0x04, 0x1f, 0x00, 0x48, 0x12, + 0x57, 0x48, 0x08, 0x04, 0x20, 0x00, 0xc8, 0x13, 0x57, 0x80, 0x08, 0x04, + 0x21, 0x00, 0x41, 0x10, 0x00, 0x01, 0xc1, 0x11, 0x00, 0x03, 0xc8, 0x10, + 0x57, 0x08, 0x0c, 0x04, 0x22, 0x00, 0x41, 0x10, 0x00, 0x01, 0xc6, 0x11, + 0x57, 0x08, 0x10, 0x04, 0x23, 0x00, 0xc8, 0x10, 0x50, 0x08, 0x0a, 0x04, + 0x81, 0x00, 0x00, 0xc4, 0x10, 0x07, 0x04, 0x24, 0x00, 0x01, 0x02, 0x00, + 0xc8, 0x10, 0x51, 0x0c, 0x08, 0x04, 0x01, 0x02, 0x00, 0x42, 0x10, 0x01, + 0x06, 0x42, 0x11, 0x01, 0x0a, 0x48, 0x12, 0x57, 0x14, 0x02, 0x04, 0x26, + 0x00, 0xc8, 0x13, 0x57, 0x24, 0x02, 0x04, 0x26, 0x00, 0x01, 0x02, 0x00, + 0x44, 0x10, 0x02, 0x08, 0x44, 0x11, 0x02, 0x10, 0xc1, 0x12, 0x00, 0x15, + 0x01, 0x57, 0x04, 0x02, 0x04, 0x25, 0x00, 0x42, 0x10, 0x01, 0x0e, 0xc4, + 0x11, 0x02, 0x14, 0x01, 0x57, 0x04, 0x02, 0x04, 0x26, 0x00, 0xc8, 0x10, + 0x57, 0x14, 0x02, 0x04, 0x26, 0x00, 0x01, 0x02, 0x00, 0x02, 0x00, 0x04, + 0x43, 0x10, 0x02, 0x08, 0xc4, 0x11, 0x07, 0x10, 0x27, 0x00, 0xc2, 0x10, + 0x01, 0x02, 0x01, 0x02, 0x00, 0x42, 0x10, 0x01, 0x06, 0x42, 0x11, 0x01, + 0x0a, 0xc1, 0x12, 0x00, 0x0d, 0x41, 0x10, 0x00, 0x01, 0xc2, 0x11, 0x01, + 0x04, 0x81, 0x57, 0x04, 0x03, 0x04, 0x06, 0x00, 0x01, 0x01, 0x00, 0x02, + 0x02, 0x04, 0x03, 0x00, 0x08, 0x04, 0x01, 0x0a, 0x05, 0x51, 0x10, 0x03, + 0x04, 0x06, 0x57, 0x1c, 0x02, 0x04, 0x07, 0x00, 0x07, 0x57, 0x50, 0x03, + 0x04, 0x03, 0x00, 0x88, 0x02, 0x68, 0x81, 0x57, 0x08, 0x02, 0x08, 0x05, + 0x00, 0x41, 0x10, 0x00, 0x01, 0x41, 0x11, 0x00, 0x03, 0x42, 0x12, 0x01, + 0x06, 0x44, 0x13, 0x02, 0x0c, 0x48, 0x14, 0x52, 0x18, 0x05, 0x04, 0xc8, + 0x15, 0x52, 0x34, 0x05, 0x04, 0x44, 0x10, 0x02, 0x04, 0x42, 0x11, 0x01, + 0x0a, 0x44, 0x12, 0x02, 0x10, 0x41, 0x13, 0x00, 0x15, 0x41, 0x14, 0x00, + 0x17, 0x48, 0x15, 0x52, 0x20, 0x05, 0x04, 0xc8, 0x16, 0x52, 0x3c, 0x05, + 0x04, 0x01, 0x00, 0x00, 0x02, 0x01, 0x02, 0x83, 0x57, 0x08, 0x06, 0x04, + 0x04, 0x00, 0x01, 0x00, 0x00, 0x02, 0x01, 0x02, 0x03, 0x01, 0x04, 0x04, + 0x00, 0x06, 0x05, 0x01, 0x08, 0x06, 0x01, 0x0a, 0x07, 0x57, 0x10, 0x02, + 0x04, 0x08, 0x00, 0x88, 0x02, 0x40, 0x01, 0x01, 0x00, 0x02, 0x00, 0x02, + 0x83, 0x57, 0x08, 0x06, 0x04, 0x04, 0x00, 0x81, 0x01, 0x00, 0x41, 0x10, + 0x00, 0x01, 0x42, 0x11, 0x02, 0x04, 0x41, 0x12, 0x00, 0x09, 0x46, 0x13, + 0x52, 0x10, 0x05, 0x04, 0xc8, 0x14, 0x52, 0x2c, 0x05, 0x04, 0x42, 0x10, + 0x01, 0x02, 0x44, 0x11, 0x02, 0x08, 0x41, 0x12, 0x00, 0x0d, 0x42, 0x13, + 0x02, 0x10, 0x41, 0x14, 0x00, 0x15, 0xc6, 0x15, 0x52, 0x1c, 0x05, 0x04, + 0x01, 0x01, 0x00, 0x82, 0x57, 0x08, 0x02, 0x04, 0x05, 0x00, 0x81, 0x52, + 0x04, 0x03, 0x04, 0x01, 0x57, 0x04, 0x02, 0x04, 0x09, 0x00, 0x02, 0x57, + 0x38, 0x02, 0x04, 0x09, 0x00, 0x83, 0x57, 0x6c, 0x02, 0x04, 0x09, 0x00, + 0x01, 0x00, 0x01, 0x02, 0x20, 0x00, 0x00, 0x00, 0x01, 0x20, 0x50, 0x04, + 0x03, 0x04, 0x20, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x04, 0x00, + 0x08, 0x20, 0x52, 0x04, 0x05, 0x04, 0x03, 0x18, 0x03, 0x20, 0x20, 0x51, + 0x04, 0x02, 0x04, 0x20, 0x52, 0x04, 0x05, 0x04, 0x20, 0x00, 0x00, 0x20, + 0x57, 0x04, 0x08, 0x04, 0x00, 0x00, 0x00, 0x24, 0x01, 0x26, 0x01, 0x28, + 0x20, 0x00, 0x00, 0x01, 0x02, 0x01, 0x04, 0x20, 0x57, 0x04, 0x08, 0x04, + 0x00, 0x00, 0x00, 0x24, 0x57, 0x2c, 0x0c, 0x04, 0x0c, 0x00, 0x20, 0x57, + 0x04, 0x08, 0x04, 0x00, 0x00, 0x00, 0x24, 0x20, 0x57, 0x04, 0x10, 0x04, + 0x00, 0x00, 0x00, 0x44, 0x20, 0x57, 0x04, 0x04, 0x04, 0x00, 0x00, 0x20, + 0x57, 0x04, 0x08, 0x04, 0x00, 0x00, 0x57, 0x28, 0x04, 0x04, 0x14, 0x00, + 0x00, 0x78, 0x20, 0x07, 0x00, 0x01, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, + 0x01, 0x07, 0x02, 0x18, 0x00, 0x20, 0x01, 0x00, 0x01, 0x02, 0x01, 0x04, + 0x20, 0x07, 0x00, 0x1a, 0x00, 0x07, 0x06, 0x1b, 0x00, 0x01, 0x0c, 0x00, + 0x0e, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x57, 0x08, 0x02, 0x04, + 0x1c, 0x00, 0x20, 0x01, 0x00, 0x00, 0x02, 0x20, 0x01, 0x00, 0x00, 0x02, + 0x01, 0x04, 0x20, 0x00, 0x00, 0x01, 0x02, 0x20, 0x02, 0x00, 0x00, 0x04, + 0x02, 0x08, 0x02, 0x0c, 0x02, 0x10, 0x02, 0x14, 0x20, 0x02, 0x00, 0x01, + 0x04, 0x01, 0x06, 0x01, 0x08, 0x01, 0x0a, 0x01, 0x0c, 0x01, 0x0e, 0x20, + 0xb0, 0xb5, 0x1c, 0x4c, 0x21, 0x78, 0x61, 0xb1, 0x7e, 0x28, 0x11, 0xd1, + 0x61, 0x78, 0x00, 0x25, 0xf9, 0xb1, 0x1a, 0x48, 0x02, 0x68, 0x1a, 0x48, + 0x90, 0x47, 0x65, 0x70, 0xa5, 0x70, 0x25, 0x70, 0xb0, 0xbd, 0x7e, 0x28, + 0x24, 0xd1, 0x00, 0x20, 0x01, 0x21, 0xa0, 0x70, 0x21, 0x70, 0x1e, 0xe0, + 0x7d, 0x28, 0x02, 0xd1, 0x01, 0x20, 0xa0, 0x70, 0xb0, 0xbd, 0x65, 0x78, + 0x69, 0xb2, 0xb1, 0xf1, 0xff, 0x3f, 0x07, 0xdc, 0x00, 0x20, 0x20, 0x70, + 0x0b, 0x48, 0x81, 0x6a, 0x01, 0x31, 0x81, 0x62, 0xb0, 0xbd, 0x00, 0x21, + 0xa2, 0x78, 0x01, 0x2a, 0x06, 0xd1, 0x09, 0x4a, 0x80, 0xf0, 0x20, 0x00, + 0x50, 0x55, 0x00, 0x20, 0xa0, 0x70, 0x01, 0xe0, 0x05, 0x4a, 0x50, 0x55, + 0x48, 0x1c, 0x60, 0x70, 0xb0, 0xbd, 0x00, 0xbf, 0xd4, 0xdb, 0x05, 0x00, + 0xc4, 0x1d, 0x01, 0x00, 0xcc, 0x95, 0x08, 0x00, 0x78, 0x20, 0x01, 0x00, + 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, 0x98, 0x95, 0x08, 0x00, + 0x79, 0x51, 0x02, 0x00, 0x2d, 0xe9, 0xf8, 0x43, 0x06, 0x46, 0x1e, 0x48, + 0x08, 0x9c, 0x98, 0x46, 0x91, 0x46, 0x0f, 0x46, 0x00, 0x78, 0x01, 0x28, + 0x06, 0xd0, 0x1b, 0x48, 0x39, 0x46, 0x02, 0x68, 0x30, 0x46, 0x90, 0x47, + 0x01, 0x28, 0x1b, 0xd1, 0x18, 0x48, 0x90, 0xf8, 0xfc, 0x14, 0x18, 0x48, + 0x00, 0xf5, 0xa0, 0x70, 0x01, 0xf0, 0x01, 0x01, 0x00, 0xf0, 0x38, 0xf8, + 0x80, 0xb1, 0x05, 0x46, 0x80, 0xf8, 0x04, 0x90, 0x87, 0x70, 0x06, 0x80, + 0x64, 0xb1, 0x08, 0xf1, 0x04, 0x00, 0x44, 0x21, 0x22, 0x46, 0x41, 0x23, + 0xe8, 0x70, 0x05, 0xf1, 0x08, 0x00, 0xfb, 0xf7, 0xdd, 0xfe, 0x03, 0xe0, + 0xbd, 0xe8, 0xf8, 0x83, 0x01, 0x20, 0xe8, 0x70, 0x0a, 0x48, 0x00, 0xf5, + 0xb4, 0x71, 0x28, 0x46, 0xfe, 0xf7, 0xa8, 0xf8, 0x08, 0x48, 0x0e, 0x21, + 0x00, 0x78, 0xbd, 0xe8, 0xf8, 0x43, 0xfb, 0xf7, 0xd1, 0xbe, 0x00, 0xbf, + 0x25, 0xba, 0x01, 0x00, 0xd4, 0xa2, 0x08, 0x00, 0x8c, 0x7e, 0x08, 0x00, + 0x68, 0x8a, 0x01, 0x00, 0x2c, 0xba, 0x01, 0x00, 0x24, 0xba, 0x01, 0x00, + 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, 0x90, 0x95, 0x08, 0x00, + 0x0d, 0x52, 0x02, 0x00, 0x49, 0xf6, 0xd5, 0x5c, 0xc1, 0xf2, 0x11, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0xb0, 0xb5, 0x94, 0xb0, 0x21, 0x4d, 0x03, 0xac, + 0x40, 0x21, 0x28, 0x68, 0x13, 0x90, 0x00, 0x20, 0x02, 0x90, 0x20, 0x46, + 0xfe, 0xf7, 0x38, 0xf8, 0x1d, 0x48, 0x00, 0x68, 0x80, 0x47, 0x1d, 0x49, + 0x1d, 0x4a, 0x83, 0xb2, 0x20, 0x46, 0x09, 0x68, 0x00, 0x91, 0x40, 0x21, + 0xff, 0xf7, 0xc0, 0xf8, 0x1a, 0x48, 0x02, 0xaa, 0x90, 0x21, 0x03, 0x68, + 0xff, 0x20, 0x98, 0x47, 0x02, 0x98, 0xc0, 0xb1, 0xcc, 0x21, 0x17, 0x4a, + 0x4f, 0x23, 0x81, 0x70, 0x02, 0x98, 0x50, 0xf8, 0x08, 0x1c, 0x03, 0x30, + 0x09, 0x89, 0x03, 0x39, 0xfb, 0xf7, 0x84, 0xfe, 0x02, 0x98, 0x03, 0xaa, + 0x40, 0x23, 0x50, 0xf8, 0x08, 0x1c, 0x52, 0x30, 0x09, 0x89, 0x52, 0x39, + 0xfb, 0xf7, 0x7a, 0xfe, 0x02, 0x98, 0x01, 0xf0, 0xa9, 0xfc, 0x00, 0x20, + 0x4f, 0xf6, 0xdd, 0x41, 0x01, 0xf0, 0xaa, 0xfc, 0x28, 0x68, 0x13, 0x99, + 0x40, 0x1a, 0x04, 0xbf, 0x14, 0xb0, 0xb0, 0xbd, 0x01, 0xf0, 0xa8, 0xfc, + 0x38, 0xec, 0x01, 0x00, 0xcc, 0x9d, 0x08, 0x00, 0xb8, 0x60, 0x01, 0x30, + 0x98, 0x6d, 0x02, 0x00, 0x24, 0x9c, 0x08, 0x00, 0xd4, 0xd1, 0x05, 0x00, + 0x2d, 0xe9, 0xf8, 0x43, 0x30, 0xb3, 0x0d, 0x46, 0x21, 0xb3, 0x04, 0x46, + 0x47, 0x88, 0x00, 0x88, 0x16, 0x46, 0x48, 0x28, 0x03, 0xd1, 0x28, 0x78, + 0x01, 0x30, 0xb8, 0x42, 0x45, 0xd1, 0x24, 0x48, 0x01, 0x68, 0x20, 0x46, + 0x88, 0x47, 0x38, 0xb9, 0x00, 0x20, 0x60, 0x60, 0x60, 0x80, 0x21, 0x48, + 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x68, 0xb1, 0x20, 0x88, 0x71, 0x28, + 0x0d, 0xd0, 0xc5, 0x28, 0x19, 0xbf, 0x4f, 0xf0, 0x00, 0x08, 0x4f, 0xf0, + 0x00, 0x09, 0x4f, 0xf0, 0x08, 0x09, 0xdf, 0xf8, 0x6c, 0x80, 0x06, 0xe0, + 0x05, 0x20, 0xbd, 0xe8, 0xf8, 0x83, 0xdf, 0xf8, 0x5c, 0x80, 0x4f, 0xf0, + 0x10, 0x09, 0x60, 0x88, 0x08, 0xb3, 0xb0, 0x42, 0x1f, 0xd8, 0xa7, 0xeb, + 0x09, 0x01, 0x81, 0x42, 0x1b, 0xd1, 0x60, 0x68, 0x2a, 0x46, 0x0b, 0x46, + 0xfb, 0xf7, 0x20, 0xfe, 0xb8, 0xf1, 0x00, 0x0f, 0x18, 0xbf, 0xb9, 0xf1, + 0x00, 0x0f, 0x09, 0xd0, 0x60, 0x88, 0x49, 0x46, 0x4b, 0x46, 0x2a, 0x18, + 0x40, 0x46, 0xfb, 0xf7, 0x13, 0xfe, 0x60, 0x88, 0x48, 0x44, 0x60, 0x80, + 0x08, 0x49, 0x20, 0x88, 0x09, 0x68, 0x88, 0x47, 0x00, 0x20, 0xbd, 0xe8, + 0xf8, 0x83, 0x06, 0x20, 0xbd, 0xe8, 0xf8, 0x83, 0x88, 0xa5, 0x08, 0x00, + 0x84, 0xa5, 0x08, 0x00, 0x74, 0x32, 0x06, 0x00, 0x84, 0x32, 0x06, 0x00, + 0x78, 0xa5, 0x08, 0x00, 0x01, 0xf0, 0x3e, 0xbc, 0xb0, 0xb5, 0x04, 0x46, + 0xc5, 0x78, 0x46, 0x48, 0x46, 0x49, 0x25, 0x22, 0x03, 0x68, 0x20, 0x46, + 0x98, 0x47, 0x00, 0x28, 0x00, 0xf0, 0x82, 0x80, 0xa5, 0xf1, 0x0e, 0x00, + 0x16, 0x28, 0x27, 0xd8, 0xdf, 0xe8, 0x00, 0xf0, 0x28, 0x34, 0x34, 0x34, + 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x0c, 0x39, 0x3d, 0x34, + 0x41, 0x45, 0x55, 0x59, 0x5d, 0x61, 0x65, 0x00, 0x20, 0x46, 0x00, 0xf0, + 0x79, 0xf8, 0x05, 0x46, 0x40, 0xb9, 0x20, 0x46, 0x00, 0xf0, 0xdb, 0xf8, + 0x05, 0x46, 0x18, 0xb9, 0x1a, 0x21, 0x00, 0xf0, 0x07, 0xf9, 0x00, 0x25, + 0x34, 0x48, 0x4f, 0xf6, 0xda, 0x41, 0x2a, 0x46, 0x1a, 0x23, 0x04, 0x68, + 0x02, 0x20, 0xa0, 0x47, 0x00, 0x28, 0x57, 0xd0, 0x45, 0x71, 0x51, 0xe0, + 0x06, 0x2d, 0x0b, 0xd1, 0x2e, 0x48, 0x90, 0xf8, 0x78, 0x00, 0x0d, 0x38, + 0x01, 0x28, 0x05, 0xd8, 0x2a, 0x48, 0x4f, 0xf6, 0xda, 0x41, 0x0c, 0x22, + 0x2b, 0x46, 0x3f, 0xe0, 0x20, 0x46, 0xbd, 0xe8, 0xb0, 0x40, 0x01, 0xf0, + 0xf9, 0xbb, 0x20, 0x46, 0x03, 0xf0, 0x58, 0xff, 0x39, 0xe0, 0x20, 0x46, + 0x03, 0xf0, 0x96, 0xff, 0x35, 0xe0, 0x20, 0x46, 0x03, 0xf0, 0xd6, 0xff, + 0x31, 0xe0, 0x20, 0x79, 0x61, 0x79, 0x1d, 0x4b, 0x42, 0x1e, 0xb2, 0xfa, + 0x82, 0xf2, 0x52, 0x09, 0x1a, 0x70, 0x33, 0xf0, 0xc3, 0xfb, 0x02, 0x46, + 0x19, 0x48, 0x4f, 0xf6, 0xda, 0x41, 0x1f, 0x23, 0x1e, 0xe0, 0x20, 0x46, + 0x03, 0xf0, 0xda, 0xff, 0x1d, 0xe0, 0x20, 0x46, 0x04, 0xf0, 0x00, 0xf8, + 0x19, 0xe0, 0x20, 0x46, 0x04, 0xf0, 0x38, 0xf8, 0x15, 0xe0, 0x20, 0x46, + 0x04, 0xf0, 0x14, 0xf8, 0x11, 0xe0, 0x20, 0x79, 0x01, 0x28, 0x06, 0xd8, + 0x0c, 0x49, 0x00, 0x22, 0x00, 0x28, 0x18, 0xbf, 0x01, 0x20, 0x48, 0x70, + 0x00, 0xe0, 0x12, 0x22, 0x09, 0x48, 0x4f, 0xf6, 0xda, 0x41, 0x24, 0x23, + 0x04, 0x68, 0x02, 0x20, 0xa0, 0x47, 0x18, 0xb1, 0xbd, 0xe8, 0xb0, 0x40, + 0x01, 0xf0, 0x9e, 0xbb, 0xb0, 0xbd, 0x00, 0xbf, 0x58, 0x9c, 0x08, 0x00, + 0xb6, 0x6d, 0x02, 0x00, 0x48, 0xdc, 0x05, 0x00, 0x2c, 0x9c, 0x08, 0x00, + 0x50, 0xe2, 0x05, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, 0x81, 0x78, 0x06, 0x29, + 0x5e, 0xd3, 0x90, 0xf8, 0x04, 0x90, 0xb9, 0xf1, 0x05, 0x0f, 0x59, 0xd8, + 0xb9, 0xf1, 0x00, 0x0f, 0x56, 0xd0, 0x00, 0xf1, 0x08, 0x02, 0x02, 0x27, + 0x4f, 0xf0, 0x00, 0x0e, 0x4f, 0xf0, 0x00, 0x08, 0x4f, 0xf0, 0x00, 0x0b, + 0x4f, 0xf0, 0x00, 0x0a, 0x00, 0x92, 0x02, 0x37, 0xfa, 0xb2, 0x8a, 0x42, + 0x46, 0xd8, 0x50, 0xfa, 0x8b, 0xf2, 0x52, 0x79, 0x04, 0x2a, 0x41, 0xd8, + 0x5f, 0xfa, 0x8b, 0xf4, 0x95, 0x1e, 0x23, 0x18, 0x02, 0x2d, 0x9b, 0x79, + 0x05, 0xd2, 0xb8, 0xf1, 0x00, 0x0f, 0x08, 0xbf, 0x4f, 0xf0, 0x01, 0x08, + 0x04, 0xe0, 0x04, 0x2a, 0x08, 0xbf, 0xbe, 0xf1, 0x00, 0x0f, 0x02, 0xd0, + 0xbe, 0xf1, 0x01, 0x0f, 0x04, 0xd1, 0xb8, 0xf1, 0x01, 0x0f, 0x29, 0xd0, + 0x4f, 0xf0, 0x01, 0x0e, 0x04, 0x2b, 0x25, 0xd8, 0x07, 0xeb, 0x43, 0x02, + 0xd7, 0xb2, 0x8f, 0x42, 0x20, 0xd8, 0x8b, 0xb1, 0x00, 0x9a, 0x14, 0x44, + 0x00, 0x22, 0x94, 0xf9, 0x00, 0x50, 0x14, 0xf8, 0x01, 0x6c, 0x15, 0xf1, + 0x80, 0x0c, 0x01, 0xd0, 0x50, 0x2d, 0x13, 0xdc, 0x03, 0x2e, 0x11, 0xd8, + 0x01, 0x32, 0x02, 0x34, 0x9a, 0x42, 0xf0, 0xd1, 0x5a, 0x00, 0x0b, 0xf1, + 0x02, 0x03, 0x0a, 0xf1, 0x01, 0x0a, 0x52, 0xfa, 0x83, 0xfb, 0xca, 0x45, + 0xb9, 0xd1, 0x78, 0x1a, 0x18, 0xbf, 0x12, 0x20, 0xbd, 0xe8, 0xf8, 0x8f, + 0x12, 0x20, 0xbd, 0xe8, 0xf8, 0x8f, 0x2d, 0xe9, 0xf8, 0x4f, 0x90, 0xf8, + 0x04, 0x90, 0xb9, 0xf1, 0x00, 0x0f, 0x26, 0xd0, 0x82, 0x46, 0x08, 0x30, + 0x4f, 0xf0, 0x00, 0x0b, 0x00, 0x26, 0x00, 0x90, 0x5a, 0xfa, 0x8b, 0xf0, + 0x84, 0x79, 0xa4, 0xb1, 0x00, 0x99, 0x5f, 0xfa, 0x8b, 0xf0, 0x4f, 0xf0, + 0x00, 0x08, 0x0f, 0x18, 0x50, 0x44, 0x45, 0x79, 0x97, 0xf9, 0x00, 0x20, + 0x17, 0xf8, 0x01, 0x1c, 0x28, 0x46, 0x00, 0xf0, 0xe9, 0xf8, 0x68, 0xb9, + 0x08, 0xf1, 0x01, 0x08, 0x02, 0x37, 0xa0, 0x45, 0xf2, 0xd1, 0x01, 0x36, + 0x0b, 0xf1, 0x02, 0x00, 0x61, 0x00, 0x51, 0xfa, 0x80, 0xfb, 0x4e, 0x45, + 0xde, 0xd1, 0x00, 0x20, 0xbd, 0xe8, 0xf8, 0x8f, 0x2d, 0xe9, 0xf0, 0x4f, + 0x85, 0xb0, 0x1a, 0x29, 0x40, 0xf0, 0xcc, 0x80, 0xae, 0x4f, 0x03, 0x20, + 0x00, 0x21, 0x00, 0x24, 0x01, 0xeb, 0xc1, 0x02, 0x00, 0x23, 0x00, 0x25, + 0x37, 0xf8, 0x12, 0x20, 0x22, 0xfa, 0x03, 0xf6, 0xf6, 0x07, 0x04, 0xd0, + 0x15, 0xb9, 0x02, 0x30, 0x01, 0x34, 0x01, 0x25, 0x04, 0x30, 0x01, 0x33, + 0x04, 0x2b, 0xf3, 0xd1, 0x01, 0x31, 0x05, 0x29, 0xea, 0xd1, 0x21, 0x06, + 0x00, 0xf0, 0xb0, 0x80, 0x59, 0x49, 0x04, 0xaa, 0x0b, 0x68, 0xc1, 0xb2, + 0xff, 0x20, 0x98, 0x47, 0x04, 0x98, 0x00, 0x28, 0x00, 0xf0, 0xa6, 0x80, + 0xb4, 0x21, 0x9a, 0x4d, 0x00, 0x26, 0x81, 0x70, 0x1a, 0x20, 0x04, 0x99, + 0xc8, 0x70, 0x05, 0xf5, 0xca, 0x71, 0x04, 0x98, 0x00, 0x91, 0x04, 0x71, + 0x00, 0x20, 0x3c, 0x46, 0x05, 0x22, 0x07, 0x21, 0xdd, 0xf8, 0x00, 0x90, + 0x01, 0x96, 0x4f, 0xf0, 0x00, 0x0c, 0x52, 0xfa, 0x86, 0xf2, 0x51, 0xfa, + 0x86, 0xf3, 0x06, 0x21, 0xcd, 0xe9, 0x02, 0x20, 0x00, 0xeb, 0xc0, 0x02, + 0x51, 0xfa, 0x86, 0xf1, 0x00, 0x26, 0x07, 0xeb, 0x42, 0x08, 0x00, 0x22, + 0xb8, 0xf8, 0x00, 0x70, 0x27, 0xfa, 0x0c, 0xf7, 0xff, 0x07, 0x36, 0xd0, + 0x62, 0xb9, 0x22, 0x46, 0x2c, 0x46, 0x0d, 0x46, 0x19, 0x46, 0xdd, 0xe9, + 0x03, 0x07, 0x02, 0x9b, 0xf8, 0x54, 0x0b, 0x46, 0x29, 0x46, 0x25, 0x46, + 0x14, 0x46, 0x01, 0x22, 0x04, 0x9f, 0x06, 0xf1, 0x01, 0x0e, 0xf6, 0xb2, + 0x03, 0xeb, 0x86, 0x0a, 0x07, 0xf8, 0x01, 0xe0, 0x04, 0xeb, 0x0c, 0x07, + 0x04, 0x9e, 0x06, 0xf8, 0x0a, 0xc0, 0x04, 0x9e, 0xb8, 0x78, 0x56, 0x44, + 0x70, 0x70, 0x04, 0x98, 0xbe, 0x79, 0x50, 0x44, 0x86, 0x70, 0x73, 0x48, + 0x90, 0xf8, 0x00, 0xb0, 0xbb, 0xf1, 0x00, 0x0f, 0x0f, 0xd0, 0xbb, 0xf1, + 0x0b, 0x0f, 0x05, 0xeb, 0x0b, 0x06, 0x98, 0xbf, 0xbc, 0xf1, 0x02, 0x0f, + 0x19, 0xf9, 0x0b, 0x00, 0x96, 0xf9, 0x88, 0x61, 0x00, 0xeb, 0x86, 0x06, + 0x07, 0xe0, 0xb6, 0x46, 0x27, 0xe0, 0x95, 0xf9, 0x88, 0x01, 0x99, 0xf9, + 0x00, 0x60, 0x06, 0xeb, 0x80, 0x06, 0x95, 0xf9, 0x0e, 0x72, 0x70, 0xb2, + 0xb8, 0x42, 0x01, 0xdd, 0xfe, 0xb2, 0x16, 0xe0, 0xbb, 0xf1, 0x00, 0x0f, + 0x0d, 0xd0, 0xbb, 0xf1, 0x0b, 0x0f, 0x05, 0xeb, 0x0b, 0x06, 0x98, 0xbf, + 0xbc, 0xf1, 0x02, 0x0f, 0x19, 0xf8, 0x0b, 0x00, 0x96, 0xf8, 0x88, 0x61, + 0x00, 0xeb, 0x86, 0x06, 0x05, 0xe0, 0x95, 0xf8, 0x88, 0x01, 0x99, 0xf8, + 0x00, 0x60, 0x06, 0xeb, 0x80, 0x06, 0x04, 0x98, 0x50, 0x44, 0xc6, 0x70, + 0x76, 0x46, 0x0c, 0xf1, 0x01, 0x0c, 0x09, 0xf1, 0x0c, 0x09, 0xbc, 0xf1, + 0x04, 0x0f, 0x91, 0xd1, 0x32, 0xb1, 0x01, 0x98, 0x51, 0x4f, 0x00, 0xeb, + 0x8e, 0x00, 0x86, 0x1c, 0x03, 0x98, 0x02, 0xe0, 0x4e, 0x4f, 0x03, 0x98, + 0x01, 0x9e, 0x01, 0x30, 0x12, 0x34, 0x05, 0x28, 0x7f, 0xf4, 0x6c, 0xaf, + 0x04, 0x98, 0x01, 0xf0, 0x29, 0xfa, 0xff, 0xe7, 0x05, 0xb0, 0xbd, 0xe8, + 0xf0, 0x8f, 0x00, 0xbf, 0x24, 0x9c, 0x08, 0x00, 0xf8, 0xb5, 0x04, 0x29, + 0x1b, 0xd2, 0x12, 0xf1, 0x80, 0x03, 0x1f, 0xd1, 0x42, 0x4b, 0x00, 0xeb, + 0xc0, 0x00, 0x01, 0x22, 0x8a, 0x40, 0x33, 0xf8, 0x10, 0x40, 0x24, 0xea, + 0x02, 0x02, 0x3c, 0x4c, 0x23, 0xf8, 0x10, 0x20, 0x03, 0xeb, 0x40, 0x02, + 0x00, 0x20, 0x24, 0x78, 0x53, 0x18, 0x02, 0xeb, 0x41, 0x01, 0x4f, 0xf6, + 0x80, 0x72, 0x98, 0x71, 0x9c, 0x70, 0x4a, 0x81, 0xf8, 0xbd, 0x00, 0x20, + 0x40, 0xf6, 0x48, 0x11, 0x01, 0xf0, 0x1c, 0xfa, 0x12, 0x20, 0xf8, 0xbd, + 0x30, 0x4b, 0x93, 0xf9, 0x00, 0xe0, 0xbe, 0xf1, 0x01, 0x0f, 0x1f, 0xdb, + 0xdf, 0xf8, 0xb8, 0xc0, 0x01, 0xeb, 0x41, 0x03, 0x00, 0x27, 0xbe, 0xf1, + 0x0c, 0x0f, 0xa8, 0xbf, 0x4f, 0xf0, 0x0c, 0x0e, 0x0c, 0xeb, 0x83, 0x03, + 0x03, 0xf5, 0xca, 0x76, 0x00, 0x23, 0x0c, 0xeb, 0x07, 0x04, 0xf5, 0x57, + 0x01, 0x37, 0x94, 0xf9, 0x88, 0x41, 0x05, 0xeb, 0x84, 0x04, 0x94, 0x42, + 0xb8, 0xbf, 0x01, 0x33, 0x77, 0x45, 0xf2, 0xdb, 0xdc, 0xb2, 0x0b, 0x2c, + 0x02, 0xd9, 0x02, 0xe0, 0x00, 0x24, 0x00, 0x23, 0x02, 0x29, 0x1d, 0x4d, + 0x01, 0xeb, 0x41, 0x06, 0x05, 0xf5, 0xc4, 0x75, 0x2f, 0x57, 0x05, 0xeb, + 0x86, 0x05, 0x2c, 0x44, 0x94, 0xf9, 0x0c, 0x50, 0xfc, 0xb2, 0x05, 0xeb, + 0x87, 0x06, 0xed, 0xb2, 0x96, 0x42, 0x0a, 0xdd, 0x15, 0x4e, 0x05, 0xeb, + 0x84, 0x04, 0x00, 0xeb, 0xc0, 0x05, 0xa4, 0x1a, 0x06, 0xeb, 0x45, 0x05, + 0x0d, 0x44, 0xac, 0x71, 0x07, 0xe0, 0x10, 0x4d, 0x00, 0xeb, 0xc0, 0x04, + 0x05, 0xeb, 0x44, 0x04, 0x00, 0x25, 0x0c, 0x44, 0xa5, 0x71, 0x0c, 0x4c, + 0x00, 0xeb, 0xc0, 0x00, 0x04, 0xeb, 0x40, 0x05, 0x05, 0xeb, 0x41, 0x06, + 0x72, 0x81, 0x6a, 0x18, 0x93, 0x70, 0x01, 0x22, 0x02, 0xfa, 0x01, 0xf1, + 0x34, 0xf8, 0x10, 0x20, 0x11, 0x43, 0x24, 0xf8, 0x10, 0x10, 0x00, 0x20, + 0xf8, 0xbd, 0x00, 0xbf, 0x6a, 0x34, 0x01, 0x00, 0x8c, 0x7e, 0x08, 0x00, + 0xd8, 0xdb, 0x05, 0x00, 0x10, 0xb5, 0x27, 0x48, 0x0f, 0x21, 0x02, 0x68, + 0x4f, 0xf6, 0x17, 0x40, 0x90, 0x47, 0x00, 0x28, 0x45, 0xd0, 0x06, 0x21, + 0x59, 0x4b, 0x05, 0x22, 0x02, 0x24, 0xc1, 0x71, 0x19, 0x21, 0x81, 0x71, + 0x00, 0x21, 0x41, 0x71, 0x93, 0xf8, 0x78, 0x10, 0x42, 0x72, 0x01, 0xf0, + 0x0f, 0x01, 0x02, 0x39, 0xb1, 0xfa, 0x81, 0xf1, 0x49, 0x09, 0x89, 0x00, + 0x01, 0x72, 0x93, 0xf8, 0x78, 0x10, 0xc2, 0x72, 0x01, 0xf0, 0x0f, 0x01, + 0x02, 0x29, 0x08, 0xbf, 0x04, 0x24, 0x84, 0x72, 0x93, 0xf8, 0x78, 0x10, + 0x42, 0x73, 0x01, 0x22, 0x01, 0xf0, 0x0f, 0x01, 0x02, 0x29, 0x4f, 0xf0, + 0x01, 0x01, 0x08, 0xbf, 0x04, 0x21, 0x01, 0x73, 0x03, 0xf1, 0x0a, 0x01, + 0x93, 0xf8, 0x8f, 0x30, 0x1b, 0xb1, 0x01, 0x2b, 0x14, 0xbf, 0x04, 0x22, + 0x02, 0x22, 0x82, 0x73, 0x00, 0x22, 0x09, 0x78, 0xc2, 0x73, 0x04, 0x22, + 0xc2, 0x74, 0x82, 0x74, 0x05, 0x22, 0x42, 0x74, 0x01, 0xf0, 0x0f, 0x01, + 0x02, 0x22, 0x02, 0x29, 0x08, 0xbf, 0x04, 0x22, 0x02, 0x74, 0xbd, 0xe8, + 0x10, 0x40, 0x01, 0xf0, 0x45, 0xb9, 0x10, 0xbd, 0x28, 0x9c, 0x08, 0x00, + 0xbc, 0xb5, 0x04, 0x46, 0xc0, 0x78, 0x03, 0x28, 0x11, 0xd0, 0x19, 0x28, + 0x03, 0xd1, 0xbd, 0xe8, 0xbc, 0x40, 0xff, 0xf7, 0xa3, 0xbf, 0xa2, 0x48, + 0x1b, 0x49, 0x18, 0x22, 0x03, 0x68, 0x20, 0x46, 0x98, 0x47, 0x50, 0xb3, + 0xe0, 0x78, 0x19, 0x28, 0xf1, 0xd0, 0x03, 0x28, 0x26, 0xd1, 0x20, 0x79, + 0x78, 0xb1, 0x16, 0x48, 0x01, 0x21, 0x4f, 0xf4, 0x7a, 0x72, 0x4f, 0xf4, + 0x7a, 0x73, 0x01, 0x70, 0x13, 0x48, 0x00, 0x21, 0x05, 0x68, 0x00, 0x20, + 0xcd, 0xe9, 0x00, 0x00, 0x29, 0x20, 0xa8, 0x47, 0x06, 0xe0, 0x0e, 0x48, + 0x00, 0x21, 0x01, 0x70, 0x29, 0x20, 0x00, 0x21, 0x01, 0xf0, 0x36, 0xf9, + 0x02, 0x20, 0x4f, 0xf6, 0x17, 0x41, 0x00, 0x22, 0x01, 0xf0, 0x36, 0xf9, + 0x28, 0xb1, 0xe1, 0x78, 0x81, 0x71, 0xbd, 0xe8, 0xbc, 0x40, 0x01, 0xf0, + 0x05, 0xb9, 0xbc, 0xbd, 0x20, 0x46, 0xbd, 0xe8, 0xbc, 0x40, 0x01, 0xf0, + 0x2f, 0xb9, 0x00, 0xbf, 0xb3, 0x9f, 0x01, 0x10, 0xf8, 0xdd, 0x05, 0x00, + 0xcc, 0x9b, 0x08, 0x00, 0x10, 0xb5, 0x04, 0x46, 0x01, 0xf0, 0x2a, 0xf9, + 0x0e, 0x48, 0x90, 0xf8, 0x3e, 0x00, 0xc0, 0x06, 0x16, 0xd5, 0x21, 0x79, + 0x6f, 0xf0, 0x02, 0x03, 0xe0, 0x78, 0x6f, 0xf0, 0x02, 0x02, 0xff, 0x29, + 0x08, 0xbf, 0x4f, 0xf0, 0xff, 0x33, 0x00, 0x29, 0x08, 0xbf, 0x0b, 0x46, + 0x06, 0x49, 0xff, 0x28, 0xcb, 0x72, 0x08, 0xbf, 0x4f, 0xf0, 0xff, 0x32, + 0x00, 0x28, 0x08, 0xbf, 0x02, 0x46, 0x8a, 0x72, 0x10, 0xbd, 0x00, 0xbf, + 0x40, 0x86, 0x08, 0x00, 0xa4, 0x11, 0x01, 0x00, 0xf0, 0xb5, 0x85, 0xb0, + 0x06, 0x46, 0x00, 0x20, 0x15, 0x46, 0x0c, 0x46, 0x04, 0xaa, 0x06, 0x21, + 0x04, 0x90, 0x10, 0x48, 0x03, 0x68, 0xff, 0x20, 0x98, 0x47, 0x04, 0x98, + 0xc0, 0xb1, 0x0e, 0x48, 0x02, 0xaf, 0x01, 0x68, 0x38, 0x46, 0x88, 0x47, + 0x0c, 0x48, 0x0d, 0x49, 0x6a, 0x46, 0x03, 0x68, 0x38, 0x46, 0x98, 0x47, + 0x04, 0x99, 0xd1, 0x20, 0x88, 0x70, 0x31, 0x0a, 0x04, 0x98, 0xc6, 0x70, + 0x01, 0x71, 0x29, 0x0a, 0x04, 0x98, 0xc1, 0x71, 0x85, 0x71, 0x44, 0x71, + 0x01, 0xf0, 0xe6, 0xf8, 0x05, 0xb0, 0xf0, 0xbd, 0x24, 0x9c, 0x08, 0x00, + 0x50, 0xa1, 0x08, 0x00, 0x44, 0xa1, 0x08, 0x00, 0x0c, 0xf0, 0x05, 0x00, + 0x70, 0xb5, 0x86, 0xb0, 0x04, 0x46, 0x00, 0x20, 0x55, 0x49, 0x04, 0x22, + 0x05, 0x90, 0x53, 0x48, 0x03, 0x68, 0x20, 0x46, 0x98, 0x47, 0xe8, 0xb3, + 0x52, 0x48, 0xa5, 0x79, 0x05, 0xa9, 0x02, 0x68, 0x20, 0x79, 0x90, 0x47, + 0x40, 0xbb, 0x01, 0x2d, 0x26, 0xd8, 0xe0, 0x78, 0x03, 0x28, 0x33, 0xd0, + 0x02, 0x28, 0x3a, 0xd0, 0x01, 0x28, 0x1f, 0xd1, 0x05, 0x98, 0x00, 0x2d, + 0xd0, 0xf8, 0x88, 0x14, 0x73, 0xd0, 0x41, 0xf0, 0x02, 0x01, 0x21, 0xf0, + 0x20, 0x01, 0xc0, 0xf8, 0x88, 0x14, 0x01, 0xf0, 0xb9, 0xf8, 0x4a, 0x48, + 0x00, 0x26, 0x01, 0x22, 0x05, 0x68, 0x05, 0x98, 0x90, 0xf8, 0xb0, 0x35, + 0x90, 0xf8, 0x35, 0x11, 0x00, 0xf5, 0xee, 0x70, 0xcd, 0xe9, 0x00, 0x26, + 0xcd, 0xe9, 0x02, 0x26, 0x01, 0x2b, 0x08, 0xbf, 0x02, 0x22, 0x68, 0xe0, + 0x01, 0x22, 0x20, 0x78, 0x61, 0x78, 0x40, 0xea, 0x01, 0x20, 0x81, 0xb2, + 0x02, 0x20, 0x01, 0xf0, 0x85, 0xf8, 0x18, 0xb1, 0xe1, 0x78, 0x81, 0x71, + 0x01, 0xf0, 0x56, 0xf8, 0x06, 0xb0, 0x70, 0xbd, 0x05, 0x98, 0xd0, 0xf8, + 0x88, 0x14, 0x2d, 0xb3, 0x02, 0x22, 0x62, 0xf3, 0x98, 0x51, 0x01, 0x22, + 0x07, 0xe0, 0x05, 0x98, 0xd0, 0xf8, 0x88, 0x14, 0xe5, 0xb1, 0x06, 0x22, + 0x62, 0xf3, 0x98, 0x51, 0x00, 0x22, 0xc0, 0xf8, 0x88, 0x14, 0x2a, 0x49, + 0x0b, 0x68, 0x01, 0x21, 0x98, 0x47, 0x05, 0x98, 0xd0, 0xf8, 0x88, 0x14, + 0x8a, 0x07, 0x5c, 0xbf, 0x41, 0xf0, 0x20, 0x01, 0xc0, 0xf8, 0x88, 0x14, + 0x09, 0xb2, 0x00, 0x29, 0x37, 0xd4, 0x23, 0x49, 0x90, 0xf8, 0x35, 0x01, + 0x0a, 0x68, 0x01, 0x21, 0x90, 0x47, 0x30, 0xe0, 0x0a, 0x02, 0x06, 0xd5, + 0x1f, 0x49, 0x0a, 0x68, 0x01, 0x21, 0x90, 0x47, 0x05, 0x98, 0xd0, 0xf8, + 0x88, 0x14, 0x21, 0xf0, 0xc0, 0x72, 0x09, 0xb2, 0x00, 0x29, 0xc0, 0xf8, + 0x88, 0x24, 0x20, 0xd4, 0x19, 0x49, 0x90, 0xf8, 0x35, 0x01, 0x00, 0x22, + 0x0b, 0x68, 0x01, 0x21, 0x98, 0x47, 0x05, 0x98, 0xd0, 0xf8, 0x88, 0x14, + 0x21, 0xf0, 0x20, 0x01, 0xc0, 0xf8, 0x88, 0x14, 0x11, 0xe0, 0x20, 0x22, + 0x02, 0xea, 0x91, 0x22, 0x21, 0xf0, 0x02, 0x01, 0x11, 0x43, 0x90, 0xf8, + 0x35, 0x21, 0xc0, 0xf8, 0x88, 0x14, 0x10, 0x49, 0x0d, 0x68, 0x00, 0xf5, + 0xee, 0x71, 0x10, 0x46, 0x01, 0x22, 0x00, 0x23, 0xa8, 0x47, 0x0a, 0x48, + 0x0c, 0x21, 0x00, 0x78, 0xfb, 0xf7, 0xc8, 0xf9, 0x00, 0x22, 0x8e, 0xe7, + 0x58, 0x9c, 0x08, 0x00, 0xdb, 0x6d, 0x02, 0x00, 0x14, 0x9c, 0x08, 0x00, + 0x08, 0xce, 0x08, 0x00, 0x10, 0xce, 0x08, 0x00, 0x50, 0xd4, 0x08, 0x00, + 0x54, 0xd4, 0x08, 0x00, 0x67, 0x34, 0x01, 0x00, 0x48, 0xd4, 0x08, 0x00, + 0x44, 0xd4, 0x08, 0x00, 0x10, 0xb5, 0x04, 0x46, 0x05, 0x48, 0x00, 0x78, + 0x01, 0x28, 0x02, 0xd1, 0x00, 0x20, 0xfe, 0xf7, 0x8d, 0xfb, 0x20, 0x46, + 0xbd, 0xe8, 0x10, 0x40, 0x01, 0xf0, 0x18, 0xb8, 0xec, 0x1e, 0x01, 0x00, + 0x70, 0xb5, 0x8e, 0xb0, 0x3c, 0x4d, 0x04, 0x46, 0x34, 0x21, 0x28, 0x68, + 0x0d, 0x90, 0x68, 0x46, 0xfd, 0xf7, 0x26, 0xfb, 0xe0, 0x78, 0x03, 0x28, + 0x62, 0xd1, 0x38, 0x4e, 0xb0, 0x8a, 0xb1, 0x8c, 0xad, 0xf8, 0x00, 0x00, + 0x70, 0x8a, 0xad, 0xf8, 0x02, 0x00, 0xb0, 0x8e, 0xad, 0xf8, 0x06, 0x00, + 0xb0, 0x8b, 0xad, 0xf8, 0x08, 0x00, 0x70, 0x8b, 0xad, 0xf8, 0x0a, 0x00, + 0x96, 0xf8, 0x32, 0x00, 0x8d, 0xf8, 0x0c, 0x00, 0x70, 0x8c, 0x08, 0x44, + 0x4f, 0xf6, 0xff, 0x71, 0x88, 0x42, 0x38, 0xbf, 0x01, 0x46, 0x08, 0x0a, + 0x8d, 0xf8, 0x04, 0x10, 0x96, 0xf8, 0x33, 0x10, 0x8d, 0xf8, 0x05, 0x00, + 0x20, 0x79, 0x8d, 0xf8, 0x0d, 0x10, 0xf1, 0x8e, 0xad, 0xf8, 0x0e, 0x10, + 0x31, 0x8f, 0xad, 0xf8, 0x10, 0x10, 0x31, 0x8b, 0xad, 0xf8, 0x12, 0x10, + 0xf1, 0x8a, 0xad, 0xf8, 0x14, 0x10, 0x31, 0x8c, 0xad, 0xf8, 0x16, 0x10, + 0xf1, 0x8b, 0xad, 0xf8, 0x18, 0x10, 0x80, 0xb1, 0x06, 0xf1, 0x12, 0x00, + 0x14, 0x21, 0xfd, 0xf7, 0x99, 0xff, 0x1a, 0x48, 0x00, 0x21, 0x26, 0xf8, + 0x32, 0x1f, 0x01, 0x80, 0x18, 0x48, 0xf1, 0x80, 0xb1, 0x80, 0x71, 0x80, + 0xc0, 0xe9, 0x00, 0x11, 0x01, 0x81, 0x35, 0x48, 0x1c, 0x21, 0x02, 0x68, + 0x4f, 0xf6, 0x19, 0x40, 0x90, 0x47, 0xa0, 0xb1, 0x04, 0x46, 0x03, 0x20, + 0x6a, 0x46, 0x1a, 0x23, 0xa0, 0x71, 0x00, 0x20, 0x60, 0x71, 0x54, 0xf8, + 0x08, 0x0c, 0x01, 0x89, 0xe0, 0x1d, 0x07, 0x39, 0xfb, 0xf7, 0x30, 0xf9, + 0x20, 0x46, 0x00, 0xf0, 0x5f, 0xff, 0x02, 0xe0, 0x20, 0x46, 0x00, 0xf0, + 0xa9, 0xff, 0x28, 0x68, 0x0d, 0x99, 0x40, 0x1a, 0x04, 0xbf, 0x0e, 0xb0, + 0x70, 0xbd, 0x00, 0xf0, 0x5f, 0xff, 0x00, 0xbf, 0x38, 0xec, 0x01, 0x00, + 0xc4, 0x79, 0x01, 0x00, 0x7e, 0xfa, 0x05, 0x00, 0x74, 0xfa, 0x05, 0x00, + 0x2d, 0xe9, 0xfc, 0x41, 0x4c, 0x48, 0x90, 0xf8, 0x1c, 0x81, 0xd0, 0xf8, + 0x18, 0x41, 0x90, 0xf8, 0x4c, 0x61, 0x19, 0x48, 0x01, 0x68, 0x01, 0xa8, + 0x88, 0x47, 0x18, 0x48, 0xbd, 0xf8, 0x06, 0x70, 0x9d, 0xf8, 0x04, 0x50, + 0x19, 0x21, 0x02, 0x68, 0x4f, 0xf6, 0x53, 0x50, 0x90, 0x47, 0x08, 0xb3, + 0x00, 0x21, 0x1f, 0x22, 0x01, 0x23, 0x07, 0x74, 0x05, 0x73, 0x86, 0x72, + 0x04, 0x72, 0x80, 0xf8, 0x06, 0x80, 0x41, 0x77, 0x01, 0x77, 0xc1, 0x76, + 0x01, 0x76, 0xc1, 0x75, 0x81, 0x75, 0x01, 0x75, 0xc1, 0x73, 0x41, 0x71, + 0x39, 0x0a, 0x82, 0x76, 0x42, 0x75, 0x62, 0x22, 0x43, 0x76, 0xc3, 0x74, + 0x83, 0x74, 0x43, 0x73, 0xc3, 0x72, 0xc3, 0x71, 0x41, 0x74, 0x21, 0x0a, + 0x82, 0x73, 0x41, 0x72, 0x00, 0xf0, 0x10, 0xff, 0xbd, 0xe8, 0xfc, 0x81, + 0xf8, 0xb3, 0x08, 0x00, 0x28, 0x9c, 0x08, 0x00, 0x10, 0xb5, 0x0c, 0x46, + 0x00, 0xf0, 0x5a, 0xff, 0x06, 0x2c, 0x18, 0xbf, 0x10, 0xbd, 0x04, 0x48, + 0x80, 0x21, 0x00, 0x22, 0x03, 0x68, 0x00, 0x20, 0xbd, 0xe8, 0x10, 0x40, + 0x18, 0x47, 0x00, 0xbf, 0x48, 0x9c, 0x08, 0x00, 0x1c, 0xb5, 0x21, 0x48, + 0x21, 0x49, 0x22, 0x4a, 0x06, 0x23, 0x04, 0x68, 0x68, 0x46, 0xa0, 0x47, + 0x0b, 0x20, 0x4f, 0xf6, 0x1d, 0x41, 0x00, 0x22, 0x00, 0xf0, 0x14, 0xff, + 0x04, 0x46, 0x1d, 0x48, 0x90, 0xf8, 0x7c, 0x12, 0xc9, 0x07, 0x04, 0xd0, + 0x1b, 0x49, 0x91, 0xf8, 0xc8, 0x11, 0xc9, 0x07, 0x05, 0xd0, 0x9d, 0xf8, + 0x03, 0x10, 0x01, 0xf0, 0xef, 0x01, 0x8d, 0xf8, 0x03, 0x10, 0x90, 0xf8, + 0xfe, 0x01, 0xc0, 0x07, 0x04, 0xd0, 0x14, 0x48, 0x90, 0xf8, 0xc8, 0x01, + 0xc0, 0x07, 0x05, 0xd0, 0x9d, 0xf8, 0x03, 0x00, 0x00, 0xf0, 0xdf, 0x00, + 0x8d, 0xf8, 0x03, 0x00, 0x9c, 0xb1, 0x00, 0x20, 0x01, 0x21, 0x6a, 0x46, + 0x06, 0x23, 0x60, 0x72, 0xe0, 0x71, 0x19, 0x20, 0x21, 0x72, 0xa0, 0x71, + 0x54, 0xf8, 0x08, 0x0c, 0x01, 0x89, 0x04, 0xf1, 0x0a, 0x00, 0x0a, 0x39, + 0xfb, 0xf7, 0x86, 0xf8, 0x20, 0x46, 0x00, 0xf0, 0xb5, 0xfe, 0x1c, 0xbd, + 0x74, 0xc3, 0x08, 0x00, 0x98, 0x32, 0x06, 0x00, 0xdf, 0x6d, 0x02, 0x00, + 0xe8, 0x65, 0x08, 0x00, 0x50, 0xec, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x46, + 0x0e, 0x48, 0xb0, 0xf8, 0x6c, 0x05, 0x40, 0x06, 0x11, 0xd5, 0xe0, 0x78, + 0x05, 0x28, 0x0e, 0xd1, 0xe4, 0x48, 0x02, 0x21, 0x02, 0x68, 0x4f, 0xf6, + 0x3a, 0x40, 0x90, 0x47, 0x60, 0xb1, 0x01, 0x21, 0x41, 0x71, 0xe1, 0x78, + 0x81, 0x71, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, 0x91, 0xbe, 0x20, 0x46, + 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, 0xe6, 0xbe, 0x10, 0xbd, 0x00, 0xbf, + 0x8c, 0x7e, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x41, 0xc1, 0x78, 0x24, 0x29, + 0x0b, 0xd0, 0x23, 0x29, 0x15, 0xd0, 0x1e, 0x29, 0x1c, 0xd1, 0x81, 0x79, + 0x90, 0xf8, 0x04, 0x80, 0x46, 0x79, 0x01, 0x29, 0x25, 0xd9, 0x12, 0x22, + 0x5a, 0xe0, 0x01, 0x79, 0x01, 0x29, 0x15, 0xd1, 0x40, 0x79, 0x98, 0xb1, + 0x03, 0x28, 0x11, 0xd8, 0xe9, 0x49, 0x01, 0x38, 0x00, 0x22, 0xc8, 0x70, + 0x0d, 0xe0, 0x00, 0x79, 0xe6, 0x49, 0x00, 0x22, 0x23, 0x23, 0xc8, 0x72, + 0x33, 0x48, 0x4f, 0xf6, 0xff, 0x71, 0x08, 0xe0, 0xbd, 0xe8, 0xf0, 0x41, + 0x00, 0xf0, 0xbe, 0xbe, 0x12, 0x22, 0x2f, 0x48, 0x4f, 0xf6, 0xff, 0x71, + 0x24, 0x23, 0x04, 0x68, 0x02, 0x20, 0xa0, 0x47, 0x00, 0x28, 0x46, 0xd1, + 0x49, 0xe0, 0x48, 0xea, 0x06, 0x22, 0x16, 0x2a, 0x31, 0xd8, 0x6e, 0x4b, + 0x02, 0xeb, 0x42, 0x04, 0x53, 0xf8, 0x24, 0x00, 0x58, 0xb3, 0x03, 0xeb, + 0x84, 0x04, 0x24, 0x79, 0x03, 0x2c, 0x26, 0xd1, 0xdf, 0xf8, 0x8c, 0xc0, + 0x1c, 0x1d, 0x00, 0x27, 0x4f, 0xf0, 0x68, 0x0e, 0x97, 0x42, 0x0d, 0xd0, + 0x54, 0xf8, 0x04, 0x3c, 0x53, 0xb1, 0x25, 0x78, 0x03, 0x2d, 0x07, 0xd1, + 0x93, 0xf8, 0x35, 0x31, 0x13, 0xfb, 0x0e, 0xc3, 0x93, 0xf8, 0x2e, 0x30, + 0x01, 0x2b, 0x2d, 0xd0, 0x01, 0x37, 0x0c, 0x34, 0x17, 0x2f, 0xeb, 0xd1, + 0x00, 0x22, 0x90, 0xf8, 0x35, 0x31, 0x68, 0x24, 0x13, 0xfb, 0x04, 0xc3, + 0x13, 0xf8, 0x2e, 0x4f, 0x8c, 0x42, 0x00, 0xd0, 0xba, 0xb1, 0x0c, 0x22, + 0x00, 0xe0, 0x02, 0x22, 0x00, 0x27, 0x00, 0x24, 0x0d, 0x48, 0x4f, 0xf6, + 0xff, 0x71, 0x1e, 0x23, 0x05, 0x68, 0x06, 0x20, 0xa8, 0x47, 0x40, 0xb1, + 0x87, 0x72, 0x44, 0x72, 0x06, 0x72, 0x80, 0xf8, 0x07, 0x80, 0xbd, 0xe8, + 0xf0, 0x41, 0x00, 0xf0, 0x09, 0xbe, 0xbd, 0xe8, 0xf0, 0x81, 0x19, 0x70, + 0x00, 0xf0, 0x6a, 0xfe, 0x04, 0x46, 0x07, 0x0a, 0x00, 0x22, 0xe5, 0xe7, + 0x0c, 0x22, 0xd4, 0xe7, 0x2c, 0x9c, 0x08, 0x00, 0xb0, 0xe6, 0x05, 0x00, + 0x2d, 0xe9, 0xf0, 0x43, 0x8d, 0xb0, 0x06, 0x46, 0x00, 0x20, 0x59, 0x21, + 0x00, 0x22, 0x0c, 0x90, 0x07, 0x20, 0x00, 0xf0, 0x19, 0xfe, 0x00, 0x28, + 0x75, 0xd0, 0x04, 0x46, 0x3b, 0x48, 0x37, 0x79, 0x75, 0x79, 0x0c, 0xa9, + 0x02, 0x68, 0x47, 0xea, 0x05, 0x20, 0x90, 0x47, 0x10, 0xb1, 0x02, 0x20, + 0x60, 0x71, 0x65, 0xe0, 0x4f, 0xf0, 0x00, 0x08, 0x0c, 0x21, 0x84, 0xf8, + 0x05, 0x80, 0xf0, 0x78, 0x25, 0x72, 0xe7, 0x71, 0xf0, 0x4d, 0xa0, 0x71, + 0x0c, 0x98, 0xd0, 0xf8, 0xb0, 0x96, 0xd0, 0xf8, 0xb4, 0x66, 0xd0, 0xf8, + 0xb8, 0x76, 0x72, 0xb6, 0x28, 0x68, 0x40, 0x00, 0x01, 0x30, 0x28, 0x60, + 0x0c, 0x98, 0x00, 0xf5, 0xd6, 0x60, 0xfd, 0xf7, 0xdb, 0xfd, 0x28, 0x68, + 0x40, 0x08, 0x28, 0x60, 0x28, 0x68, 0x80, 0xf3, 0x10, 0x88, 0x09, 0xeb, + 0x07, 0x00, 0x82, 0x19, 0x07, 0xd0, 0x42, 0xf2, 0x10, 0x71, 0x00, 0x23, + 0xa0, 0xfb, 0x01, 0x01, 0x00, 0xf0, 0x20, 0xfe, 0x80, 0x46, 0x4f, 0xea, + 0x18, 0x20, 0x0c, 0x99, 0x84, 0xf8, 0x09, 0x80, 0xa0, 0x72, 0x91, 0xf8, + 0x3a, 0x00, 0x80, 0x28, 0x2d, 0xd1, 0x91, 0xf8, 0x35, 0x01, 0x16, 0x28, + 0x11, 0xd8, 0x19, 0x4a, 0x00, 0xeb, 0x40, 0x03, 0x52, 0xf8, 0x23, 0x30, + 0x5b, 0xb1, 0x00, 0xeb, 0x40, 0x00, 0x02, 0xeb, 0x80, 0x00, 0x00, 0x79, + 0x01, 0x28, 0x04, 0xd1, 0x13, 0x48, 0x02, 0x68, 0x05, 0xa8, 0x90, 0x47, + 0x03, 0xe0, 0x12, 0x48, 0x01, 0x68, 0x05, 0xa8, 0x88, 0x47, 0x11, 0x48, + 0xdd, 0xf8, 0x2c, 0xc0, 0x05, 0x99, 0x06, 0x9a, 0x07, 0x9b, 0x08, 0x9d, + 0xdd, 0xf8, 0x28, 0xe0, 0x09, 0x9f, 0x06, 0x68, 0x0c, 0x98, 0x8d, 0xe8, + 0xa0, 0x40, 0xcd, 0xf8, 0x0c, 0xc0, 0xb0, 0x47, 0x0c, 0x98, 0x90, 0xf8, + 0x3a, 0x00, 0xe0, 0x72, 0x20, 0x46, 0x00, 0xf0, 0x77, 0xfd, 0x0d, 0xb0, + 0xbd, 0xe8, 0xf0, 0x83, 0x14, 0x9c, 0x08, 0x00, 0xe8, 0x72, 0x01, 0x00, + 0x24, 0xb8, 0x08, 0x00, 0xc4, 0xb7, 0x08, 0x00, 0x14, 0xb8, 0x08, 0x00, + 0xc1, 0x78, 0x03, 0x29, 0x18, 0xbf, 0x00, 0xf0, 0xd7, 0xbd, 0xff, 0xf7, + 0x69, 0xbf, 0x00, 0xbf, 0x70, 0xb5, 0x04, 0x46, 0xd4, 0x48, 0x3c, 0x49, + 0x04, 0x22, 0x03, 0x68, 0x20, 0x46, 0x98, 0x47, 0x00, 0x28, 0x65, 0xd0, + 0xe5, 0x78, 0x03, 0x2d, 0x41, 0xd8, 0xdf, 0xe8, 0x05, 0xf0, 0x02, 0x0a, + 0x11, 0x17, 0x3c, 0x48, 0x62, 0x79, 0x01, 0x68, 0x20, 0x79, 0x40, 0xea, + 0x02, 0x20, 0x80, 0xb2, 0x02, 0xe0, 0x37, 0x49, 0x20, 0x79, 0x09, 0x68, + 0x88, 0x47, 0x00, 0x24, 0x00, 0x26, 0x3c, 0xe0, 0x20, 0x79, 0x32, 0x49, + 0x00, 0x26, 0x01, 0x24, 0x08, 0x70, 0x36, 0xe0, 0x21, 0x79, 0xa1, 0xf1, + 0x0e, 0x00, 0x03, 0x28, 0x1d, 0xd8, 0xdf, 0xe8, 0x00, 0xf0, 0x02, 0x25, + 0x44, 0x48, 0xe0, 0x7a, 0xa1, 0x7a, 0xe2, 0x79, 0x27, 0x4e, 0x23, 0x7a, + 0x41, 0xea, 0x00, 0x20, 0x21, 0x7b, 0x40, 0xea, 0x01, 0x40, 0x61, 0x7b, + 0x40, 0xea, 0x01, 0x60, 0xa1, 0x79, 0x64, 0x7a, 0xc6, 0xf8, 0xd8, 0x02, + 0x41, 0xea, 0x02, 0x20, 0x40, 0xea, 0x03, 0x40, 0x40, 0xea, 0x04, 0x60, + 0xc6, 0xf8, 0x34, 0x02, 0x11, 0xe0, 0x01, 0x29, 0x03, 0xd1, 0x1c, 0x48, + 0x01, 0x68, 0xa0, 0x1d, 0xcc, 0xe7, 0x12, 0x26, 0x00, 0x24, 0x0a, 0xe0, + 0xa0, 0x79, 0xe1, 0x79, 0x22, 0x7a, 0x40, 0xea, 0x01, 0x20, 0x84, 0x49, + 0x21, 0xf8, 0xc4, 0x0f, 0x8a, 0x70, 0x12, 0x26, 0x01, 0x24, 0x17, 0x48, + 0x02, 0x21, 0x02, 0x68, 0x4f, 0xf6, 0x3b, 0x40, 0x90, 0x47, 0x18, 0xb1, + 0x85, 0x71, 0x46, 0x71, 0x00, 0xf0, 0xfa, 0xfc, 0x34, 0xb1, 0xa4, 0x48, + 0x1a, 0x21, 0x00, 0x78, 0xbd, 0xe8, 0x70, 0x40, 0xfa, 0xf7, 0xc6, 0xbe, + 0x70, 0xbd, 0x60, 0x1d, 0x2d, 0xf0, 0x22, 0xfb, 0xa7, 0xe7, 0x04, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x03, 0x48, 0x00, 0x68, 0x80, 0x47, 0xa0, 0xe7, + 0xe5, 0x6d, 0x02, 0x00, 0x3c, 0xbc, 0x08, 0x00, 0x68, 0xfc, 0x08, 0x00, + 0x00, 0x69, 0x08, 0x00, 0xb4, 0xfd, 0x08, 0x00, 0x64, 0x8d, 0x08, 0x00, + 0xbc, 0xfd, 0x08, 0x00, 0xb8, 0xfd, 0x08, 0x00, 0x28, 0x9c, 0x08, 0x00, + 0x7c, 0xb5, 0x05, 0x46, 0x1a, 0x48, 0x40, 0x78, 0x58, 0xb3, 0x1a, 0x48, + 0x0c, 0x46, 0x01, 0xaa, 0x07, 0x21, 0x03, 0x68, 0xff, 0x20, 0x98, 0x47, + 0x01, 0x98, 0x18, 0xb3, 0xda, 0x21, 0x16, 0x4e, 0x81, 0x70, 0x03, 0x20, + 0x01, 0x99, 0xc8, 0x70, 0x95, 0xf8, 0x35, 0x01, 0x01, 0x99, 0x32, 0x68, + 0x08, 0x71, 0x95, 0xf8, 0x36, 0x01, 0x48, 0x71, 0x00, 0x21, 0x95, 0xf8, + 0x74, 0x00, 0x90, 0x47, 0x01, 0x99, 0x32, 0x68, 0x88, 0x71, 0x01, 0x21, + 0x95, 0xf8, 0x74, 0x00, 0x90, 0x47, 0x00, 0x2c, 0x18, 0xbf, 0x01, 0x24, + 0x01, 0x99, 0xe2, 0x01, 0xc8, 0x71, 0x08, 0x46, 0x0a, 0x72, 0x00, 0xf0, + 0xa3, 0xfc, 0x7c, 0xbd, 0x00, 0x20, 0x40, 0xf6, 0x9c, 0x41, 0x00, 0xf0, + 0xbb, 0xfc, 0x7c, 0xbd, 0x48, 0xdc, 0x05, 0x00, 0x24, 0x9c, 0x08, 0x00, + 0x34, 0x9c, 0x08, 0x00, 0xbc, 0xb5, 0x04, 0x46, 0x90, 0xf8, 0x74, 0x00, + 0x90, 0x42, 0x19, 0xd0, 0x0d, 0x46, 0x0d, 0x49, 0x94, 0xf8, 0x35, 0x01, + 0x09, 0x68, 0x88, 0x47, 0x20, 0x46, 0x29, 0x46, 0xff, 0xf7, 0xb2, 0xff, + 0x94, 0xf8, 0x74, 0x00, 0x94, 0xf8, 0x35, 0x11, 0x07, 0x4b, 0x00, 0x22, + 0xc3, 0xe9, 0x00, 0x10, 0x06, 0x48, 0x01, 0x21, 0x04, 0x68, 0x08, 0x20, + 0x00, 0x90, 0x40, 0xf2, 0x13, 0x20, 0xa0, 0x47, 0xbc, 0xbd, 0x00, 0xbf, + 0x54, 0x9c, 0x08, 0x00, 0x8c, 0x34, 0x01, 0x00, 0xa0, 0xa0, 0x08, 0x00, + 0xb0, 0xb5, 0x34, 0x4d, 0x28, 0x7c, 0x02, 0x28, 0x15, 0xd1, 0x33, 0x48, + 0x33, 0x49, 0xc0, 0x79, 0x08, 0x70, 0x33, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x32, 0x48, 0x00, 0x68, 0x80, 0x47, 0x32, 0x48, 0x29, 0x68, 0x02, 0x68, + 0xe8, 0x68, 0x90, 0x47, 0x48, 0xb1, 0x30, 0x49, 0x04, 0x46, 0xe8, 0x68, + 0x09, 0x68, 0x88, 0x47, 0x32, 0xe0, 0xbd, 0xe8, 0xb0, 0x40, 0x00, 0xf0, + 0xc7, 0xbc, 0x2c, 0x4c, 0x72, 0xb6, 0x20, 0x68, 0x40, 0x00, 0x01, 0x30, + 0x20, 0x60, 0x2a, 0x48, 0x29, 0x68, 0x2a, 0x7c, 0x03, 0x68, 0xe8, 0x68, + 0x98, 0x47, 0x20, 0x68, 0x24, 0x49, 0x40, 0x08, 0x20, 0x60, 0x20, 0x68, + 0x80, 0xf3, 0x10, 0x88, 0xe8, 0x68, 0x09, 0x68, 0x88, 0x47, 0x23, 0x48, + 0x00, 0x21, 0x01, 0x70, 0x28, 0x7c, 0x22, 0x49, 0x01, 0x28, 0x08, 0x70, + 0x01, 0xd0, 0x7f, 0x28, 0x01, 0xd1, 0x20, 0x49, 0x08, 0x70, 0x00, 0xf0, + 0xa9, 0xfc, 0x58, 0xb1, 0x1e, 0x48, 0x00, 0x21, 0x00, 0x22, 0x00, 0x24, + 0x03, 0x68, 0x89, 0x20, 0x98, 0x47, 0x1c, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x20, 0x46, 0xb0, 0xbd, 0x72, 0xb6, 0x20, 0x68, 0x40, 0x00, 0x01, 0x30, + 0x20, 0x60, 0x18, 0x48, 0x00, 0x68, 0x80, 0x47, 0x17, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x17, 0x48, 0x00, 0x68, 0x80, 0x47, 0x11, 0x48, 0x02, 0x21, + 0x00, 0x22, 0x03, 0x68, 0x89, 0x20, 0x98, 0x47, 0x13, 0x48, 0x01, 0x68, + 0x41, 0xf0, 0x04, 0x01, 0x01, 0x60, 0xfe, 0xe7, 0x8c, 0x35, 0x01, 0x00, + 0x8c, 0x7e, 0x08, 0x00, 0xda, 0xf1, 0x01, 0x00, 0xe0, 0x9d, 0x08, 0x00, + 0xc0, 0x9d, 0x08, 0x00, 0x04, 0xa5, 0x08, 0x00, 0xe0, 0x9b, 0x08, 0x00, + 0x24, 0x36, 0x01, 0x00, 0x08, 0xa5, 0x08, 0x00, 0xde, 0xf1, 0x01, 0x00, + 0xdb, 0xf1, 0x01, 0x00, 0xdc, 0xf1, 0x01, 0x00, 0x7c, 0x9d, 0x08, 0x00, + 0xac, 0x9d, 0x08, 0x00, 0xd4, 0x9d, 0x08, 0x00, 0xa4, 0x9d, 0x08, 0x00, + 0x98, 0x9d, 0x08, 0x00, 0x30, 0x60, 0x01, 0x30, 0x10, 0xb5, 0x00, 0xb3, + 0x04, 0x46, 0x13, 0x48, 0x13, 0x49, 0x4c, 0x22, 0x03, 0x68, 0x20, 0x46, + 0x98, 0x47, 0xc0, 0xb1, 0xe0, 0x78, 0x00, 0xf0, 0xfe, 0x00, 0x04, 0x28, + 0x14, 0xd1, 0x02, 0x20, 0x4f, 0xf6, 0x0c, 0x41, 0x01, 0x22, 0x00, 0xf0, + 0xf5, 0xfb, 0x68, 0xb1, 0xe1, 0x78, 0x81, 0x71, 0x0a, 0x49, 0x0c, 0x31, + 0xfc, 0xf7, 0x68, 0xff, 0x09, 0x48, 0x0a, 0x21, 0x00, 0x78, 0xbd, 0xe8, + 0x10, 0x40, 0xfa, 0xf7, 0x91, 0xbd, 0x10, 0xbd, 0x20, 0x46, 0xbd, 0xe8, + 0x10, 0x40, 0x00, 0xf0, 0x3b, 0xbc, 0x00, 0xbf, 0x58, 0x9c, 0x08, 0x00, + 0x33, 0x9f, 0x01, 0x10, 0x2c, 0xba, 0x01, 0x00, 0x66, 0x34, 0x01, 0x00, + 0x2d, 0xe9, 0xfe, 0x4f, 0x00, 0x21, 0xdf, 0xf8, 0xa0, 0x81, 0xcd, 0xe9, + 0x01, 0x11, 0x90, 0xf8, 0x04, 0x90, 0x45, 0x79, 0x43, 0x46, 0x03, 0xf8, + 0x10, 0x5f, 0xb9, 0xf1, 0x03, 0x0f, 0x4f, 0xd1, 0x00, 0x2d, 0x00, 0xf0, + 0x96, 0x80, 0xd9, 0x78, 0x93, 0xf8, 0x02, 0xe0, 0xdf, 0xf8, 0x7c, 0xb1, + 0x82, 0x1d, 0x00, 0x24, 0x00, 0x26, 0x00, 0x91, 0x5d, 0x49, 0xd1, 0xf8, + 0x00, 0xa0, 0x92, 0xf8, 0x00, 0xc0, 0x51, 0x78, 0x61, 0xf3, 0x0b, 0x2c, + 0x0c, 0xeb, 0x4c, 0x01, 0x5b, 0xf8, 0x21, 0x70, 0xbc, 0xb1, 0xbc, 0xf1, + 0x16, 0x0f, 0x7a, 0xd8, 0x00, 0x2f, 0x78, 0xd0, 0x0b, 0xeb, 0x81, 0x01, + 0x09, 0x79, 0x05, 0x29, 0x73, 0xd1, 0x97, 0xf8, 0x1c, 0x11, 0x01, 0x29, + 0x6f, 0xd1, 0x97, 0xf8, 0x1d, 0x11, 0xc1, 0xeb, 0x01, 0x11, 0x0a, 0xeb, + 0x41, 0x11, 0x89, 0x78, 0xb1, 0x42, 0x1a, 0xd0, 0x65, 0xe0, 0xbc, 0xf1, + 0x16, 0x0f, 0x62, 0xd8, 0x00, 0x2f, 0x60, 0xd0, 0x0b, 0xeb, 0x81, 0x01, + 0x09, 0x79, 0x05, 0x29, 0x5b, 0xd1, 0x97, 0xf8, 0x1c, 0x11, 0x01, 0x29, + 0x57, 0xd1, 0x97, 0xf8, 0x1d, 0x11, 0xc1, 0xeb, 0x01, 0x11, 0x0a, 0xeb, + 0x41, 0x11, 0x8e, 0x78, 0x00, 0x99, 0x11, 0xb1, 0xb6, 0x45, 0x76, 0x46, + 0x4b, 0xd1, 0x01, 0x34, 0x02, 0x32, 0xac, 0x42, 0xbf, 0xd1, 0x14, 0xe0, + 0x95, 0xb1, 0xfb, 0x4c, 0x81, 0x1d, 0x00, 0x22, 0x0e, 0x78, 0x4f, 0x78, + 0x67, 0xf3, 0x0b, 0x26, 0x06, 0xeb, 0x46, 0x06, 0x54, 0xf8, 0x26, 0x60, + 0x96, 0xf8, 0x24, 0x61, 0x0a, 0x2e, 0x54, 0xd1, 0x01, 0x32, 0x02, 0x31, + 0xaa, 0x42, 0xef, 0xd1, 0x00, 0x26, 0x12, 0x22, 0xb9, 0xf1, 0x03, 0x0f, + 0x4c, 0xd8, 0xb9, 0xf1, 0x01, 0x0f, 0x49, 0xd0, 0x95, 0xb1, 0x06, 0x30, + 0x00, 0x21, 0x10, 0xf8, 0x11, 0x20, 0x08, 0xeb, 0x41, 0x04, 0x22, 0x72, + 0x00, 0xeb, 0x41, 0x02, 0x01, 0x31, 0x52, 0x78, 0x62, 0x72, 0x22, 0x89, + 0x6f, 0xf3, 0x1f, 0x32, 0x22, 0x81, 0x1a, 0x78, 0x91, 0x42, 0xee, 0xd3, + 0xb9, 0xf1, 0x03, 0x0f, 0x9e, 0x70, 0x83, 0xf8, 0x01, 0x90, 0x18, 0xbf, + 0xb9, 0xf1, 0x02, 0x0f, 0x13, 0xd0, 0xb9, 0xf1, 0x00, 0x0f, 0x22, 0xd1, + 0x1e, 0x48, 0x01, 0x68, 0x01, 0xa8, 0x88, 0x47, 0xdd, 0xe9, 0x01, 0x01, + 0xc8, 0xe9, 0x00, 0x01, 0x00, 0xf0, 0x38, 0xf8, 0x17, 0xe0, 0x12, 0x22, + 0x1c, 0xe0, 0x00, 0x20, 0x83, 0xf8, 0x01, 0x90, 0x98, 0x70, 0x16, 0x48, + 0x01, 0x68, 0x01, 0xa8, 0x88, 0x47, 0x01, 0x98, 0x40, 0xf2, 0x71, 0x21, + 0x04, 0x30, 0x01, 0x90, 0x48, 0x43, 0xbd, 0xf8, 0x08, 0x10, 0x40, 0x08, + 0x00, 0xeb, 0x11, 0x10, 0x01, 0x21, 0x00, 0xf0, 0xa3, 0xf9, 0xdd, 0xe9, + 0x01, 0x01, 0xc8, 0xe9, 0x00, 0x01, 0xbd, 0xe8, 0xfe, 0x8f, 0x02, 0x22, + 0x0a, 0x48, 0x4f, 0xf6, 0x91, 0x51, 0x06, 0x23, 0x04, 0x68, 0x02, 0x20, + 0xa0, 0x47, 0x00, 0x28, 0xf3, 0xd0, 0x00, 0xf0, 0xdd, 0xfa, 0xbd, 0xe8, + 0xfe, 0x8f, 0x00, 0xbf, 0x34, 0xdc, 0x05, 0x00, 0xe8, 0x72, 0x01, 0x00, + 0xe0, 0x35, 0x01, 0x00, 0x50, 0xa1, 0x08, 0x00, 0x2c, 0x9c, 0x08, 0x00, + 0x2d, 0xe9, 0xf0, 0x4f, 0x89, 0xb0, 0xb9, 0x4d, 0x40, 0xf2, 0x71, 0x21, + 0x00, 0x24, 0x07, 0x94, 0xcd, 0xe9, 0x04, 0x44, 0x28, 0x68, 0x48, 0x43, + 0xa9, 0x88, 0x40, 0x08, 0x00, 0xeb, 0x11, 0x10, 0x14, 0x21, 0x06, 0x90, + 0x28, 0x7c, 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, 0x80, 0x00, 0xc1, 0xb2, + 0xaf, 0x48, 0x02, 0x68, 0x4f, 0xf6, 0x91, 0x50, 0x90, 0x47, 0x00, 0x28, + 0x00, 0xf0, 0x53, 0x81, 0x06, 0x46, 0x06, 0x20, 0x04, 0xaa, 0x08, 0x21, + 0x08, 0x23, 0xb0, 0x71, 0x74, 0x71, 0x68, 0x7c, 0xf0, 0x71, 0x06, 0xf1, + 0x08, 0x00, 0xfa, 0xf7, 0x71, 0xfc, 0x06, 0xf1, 0x10, 0x00, 0x06, 0xaa, + 0x08, 0x21, 0x08, 0x23, 0xfa, 0xf7, 0x6a, 0xfc, 0x28, 0x7c, 0x00, 0x96, + 0x00, 0x28, 0x30, 0x76, 0x00, 0xf0, 0x36, 0x81, 0x00, 0x98, 0xa3, 0x4f, + 0xac, 0x46, 0x4f, 0xf0, 0x00, 0x0a, 0x00, 0xf1, 0x24, 0x04, 0x00, 0x20, + 0x02, 0x90, 0x00, 0x20, 0x01, 0x90, 0x0c, 0xeb, 0x4a, 0x00, 0x99, 0x49, + 0xb0, 0xf8, 0x08, 0xb0, 0x0b, 0xeb, 0x4b, 0x00, 0xbb, 0xf1, 0x17, 0x0f, + 0x01, 0xeb, 0x80, 0x00, 0x7d, 0xd2, 0xd0, 0xf8, 0x00, 0x90, 0xb9, 0xf1, + 0x00, 0x0f, 0x7a, 0xd0, 0x00, 0x79, 0x03, 0x28, 0x77, 0xd1, 0x91, 0x48, + 0x68, 0x21, 0x40, 0xf2, 0x71, 0x23, 0x0b, 0xfb, 0x01, 0x08, 0xd9, 0xf8, + 0xd4, 0x10, 0x4a, 0x69, 0x09, 0x8b, 0xd8, 0xf8, 0x54, 0x00, 0xb8, 0xf8, + 0x58, 0x70, 0xcd, 0xf8, 0x08, 0x80, 0x5a, 0x43, 0x52, 0x08, 0x02, 0xeb, + 0x11, 0x11, 0xdd, 0xe9, 0x06, 0x32, 0x45, 0x1a, 0x4f, 0xf0, 0x00, 0x00, + 0x60, 0xf1, 0x00, 0x06, 0xe8, 0x1a, 0x66, 0xeb, 0x02, 0x01, 0xb0, 0xf1, + 0x00, 0x40, 0x71, 0xf1, 0x00, 0x00, 0x13, 0xd3, 0x80, 0x48, 0x29, 0x46, + 0x02, 0x68, 0x18, 0x46, 0x90, 0x47, 0xb8, 0xf8, 0x5a, 0x10, 0x40, 0xf2, + 0xe2, 0x42, 0x51, 0x43, 0xb0, 0xfb, 0xf1, 0xf2, 0x17, 0x44, 0x02, 0xfb, + 0x11, 0x00, 0xdd, 0xe9, 0x06, 0x32, 0x1d, 0x1a, 0x62, 0xf1, 0x00, 0x06, + 0xb9, 0xf8, 0x14, 0x03, 0xb9, 0xb2, 0x03, 0x97, 0x81, 0x42, 0x1b, 0xd1, + 0x70, 0x00, 0x90, 0x46, 0x37, 0x46, 0x1e, 0x46, 0x40, 0xf2, 0x71, 0x22, + 0x00, 0x23, 0x40, 0xea, 0xd5, 0x71, 0x4f, 0xf4, 0x1c, 0x70, 0x10, 0xeb, + 0x45, 0x00, 0x41, 0xf1, 0x00, 0x01, 0x00, 0xf0, 0x95, 0xfa, 0xd9, 0xf8, + 0x20, 0x13, 0x33, 0x46, 0x42, 0x46, 0x3e, 0x46, 0x40, 0x1a, 0x20, 0xf0, + 0x70, 0x40, 0xb0, 0xf1, 0x00, 0x6f, 0x08, 0xd8, 0x58, 0x1b, 0x62, 0xeb, + 0x06, 0x01, 0x65, 0x4a, 0x80, 0x1a, 0x71, 0xf1, 0x00, 0x00, 0xc0, 0xf0, + 0xa3, 0x80, 0x02, 0x9e, 0x40, 0xf2, 0xe2, 0x41, 0xb6, 0xf8, 0x5a, 0x00, + 0x41, 0x43, 0x5e, 0x48, 0x02, 0x68, 0x28, 0x46, 0x90, 0x47, 0xdd, 0xf8, + 0x0c, 0x80, 0x06, 0x9b, 0xdf, 0xf8, 0x58, 0xc1, 0xbe, 0x4f, 0x05, 0x46, + 0xa8, 0xf1, 0x01, 0x08, 0x93, 0xe0, 0xd0, 0xf8, 0x00, 0x90, 0x99, 0xf8, + 0x1d, 0x31, 0xd7, 0xf8, 0x00, 0xe0, 0x40, 0xf2, 0x71, 0x25, 0x54, 0x4a, + 0xcd, 0xf8, 0x0c, 0xb0, 0xbb, 0x46, 0xb9, 0xf8, 0x74, 0x81, 0xc3, 0xeb, + 0x03, 0x10, 0x0e, 0xeb, 0x40, 0x10, 0xb0, 0xf8, 0xbc, 0x10, 0xd0, 0xf8, + 0xb8, 0x00, 0x68, 0x43, 0x40, 0x08, 0x00, 0xeb, 0x11, 0x15, 0xdd, 0xe9, + 0x06, 0x10, 0x4e, 0x1b, 0x60, 0xf1, 0x00, 0x07, 0xb6, 0x1a, 0x77, 0xf1, + 0x00, 0x06, 0x24, 0xd3, 0x45, 0x48, 0x02, 0x68, 0x28, 0x46, 0x90, 0x47, + 0x99, 0xf8, 0x1d, 0x31, 0xdb, 0xf8, 0x00, 0xe0, 0x40, 0xf2, 0xe2, 0x46, + 0xdf, 0xf8, 0xf0, 0xc0, 0xc3, 0xeb, 0x03, 0x11, 0x0e, 0xeb, 0x41, 0x11, + 0x09, 0x89, 0x71, 0x43, 0xb0, 0xfb, 0xf1, 0xf6, 0x06, 0xfb, 0x11, 0x00, + 0x00, 0x28, 0x18, 0xbf, 0x01, 0x36, 0x06, 0xfb, 0x01, 0xf0, 0xa8, 0xeb, + 0x06, 0x08, 0x2d, 0x1a, 0x4f, 0xf0, 0x00, 0x00, 0x60, 0xf1, 0x00, 0x06, + 0xdd, 0xe9, 0x06, 0x10, 0x00, 0xe0, 0x00, 0x26, 0xc3, 0xeb, 0x03, 0x13, + 0x5f, 0x46, 0xdd, 0xf8, 0x0c, 0xb0, 0x0e, 0xeb, 0x43, 0x12, 0xd3, 0x68, + 0x5b, 0x19, 0x46, 0xf1, 0x00, 0x05, 0x5e, 0x1a, 0x65, 0xeb, 0x00, 0x00, + 0xb6, 0xf1, 0x00, 0x45, 0x70, 0xf1, 0x00, 0x00, 0x04, 0xd3, 0x10, 0x89, + 0x40, 0xf2, 0xe2, 0x45, 0x68, 0x43, 0x1b, 0x18, 0x58, 0x1a, 0x02, 0xf1, + 0x08, 0x01, 0x01, 0x9a, 0x09, 0x88, 0x04, 0xf8, 0x07, 0x0c, 0x04, 0xf8, + 0x09, 0x8c, 0x04, 0xf8, 0x0b, 0xbc, 0x0a, 0xf1, 0x01, 0x0a, 0x22, 0x70, + 0x02, 0x9a, 0x04, 0xf8, 0x03, 0x1c, 0x04, 0xf8, 0x01, 0x2c, 0x02, 0x0e, + 0x04, 0xf8, 0x04, 0x2c, 0x02, 0x0c, 0x04, 0xf8, 0x05, 0x2c, 0x02, 0x0a, + 0x4f, 0xea, 0x18, 0x20, 0x04, 0xf8, 0x08, 0x0c, 0x4f, 0xea, 0x1b, 0x20, + 0x04, 0xf8, 0x06, 0x2c, 0x04, 0xf8, 0x0a, 0x0c, 0x08, 0x0a, 0x04, 0xf8, + 0x02, 0x0c, 0x0c, 0x34, 0x9c, 0xf8, 0x10, 0x00, 0x82, 0x45, 0xff, 0xf4, + 0xe8, 0xae, 0x11, 0xe0, 0xdf, 0xf8, 0x2c, 0xc0, 0x73, 0x4f, 0xdd, 0xe9, + 0x02, 0x68, 0x30, 0x6b, 0x06, 0xf1, 0x5a, 0x01, 0x00, 0xeb, 0x80, 0x00, + 0xc0, 0xf3, 0x12, 0x32, 0x01, 0x92, 0xc0, 0xf3, 0x1a, 0x10, 0x02, 0x90, + 0x58, 0x1b, 0xc2, 0xe7, 0x00, 0x98, 0x00, 0xf0, 0x5d, 0xf9, 0x09, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0x34, 0xdc, 0x05, 0x00, 0x28, 0x9c, 0x08, 0x00, + 0xe8, 0x72, 0x01, 0x00, 0xb0, 0xe6, 0x05, 0x00, 0x1c, 0x9d, 0x08, 0x00, + 0x01, 0x00, 0x00, 0x80, 0xe0, 0x35, 0x01, 0x00, 0xbc, 0xb5, 0x05, 0x46, + 0x08, 0x48, 0x0c, 0x46, 0x0d, 0xf1, 0x07, 0x01, 0x02, 0x68, 0x1c, 0x20, + 0x90, 0x47, 0x9d, 0xf8, 0x07, 0x00, 0x35, 0xf0, 0x85, 0xff, 0x04, 0x49, + 0x28, 0x46, 0x22, 0x46, 0x2c, 0xf0, 0x3a, 0xfe, 0xbc, 0xbd, 0x00, 0xbf, + 0xf4, 0xfe, 0x08, 0x00, 0x1d, 0x6a, 0x02, 0x00, 0x10, 0xb5, 0x0d, 0x4c, + 0x60, 0x6c, 0x80, 0x07, 0x5c, 0xbf, 0x60, 0x6c, 0x5f, 0xea, 0x80, 0x40, + 0x02, 0xd5, 0x42, 0xf2, 0x02, 0x00, 0x20, 0x60, 0x60, 0x6c, 0x80, 0x06, + 0x5c, 0xbf, 0x60, 0x6c, 0x5f, 0xea, 0x80, 0x30, 0x03, 0xd5, 0x05, 0x48, + 0x20, 0x60, 0xff, 0xf7, 0x4d, 0xfe, 0x00, 0x20, 0xc4, 0xf8, 0xc4, 0x00, + 0x10, 0xbd, 0x00, 0xbf, 0x40, 0x22, 0x00, 0x40, 0x20, 0x00, 0x02, 0x00, + 0x10, 0xb5, 0xc3, 0x78, 0x07, 0x2b, 0x05, 0xd0, 0x06, 0x2b, 0x07, 0xd1, + 0xbd, 0xe8, 0x10, 0x40, 0xff, 0xf7, 0x5c, 0xbd, 0xbd, 0xe8, 0x10, 0x40, + 0x00, 0xf0, 0x0e, 0xb8, 0x41, 0x48, 0x4f, 0xf6, 0x91, 0x51, 0x01, 0x22, + 0x04, 0x68, 0x02, 0x20, 0xa0, 0x47, 0x18, 0xb1, 0xbd, 0xe8, 0x10, 0x40, + 0x00, 0xf0, 0xfa, 0xb8, 0x10, 0xbd, 0x00, 0xbf, 0xf8, 0xb5, 0x41, 0x79, + 0x03, 0x29, 0x59, 0xd1, 0x82, 0x79, 0x00, 0x2a, 0x41, 0xd0, 0x34, 0x49, + 0x34, 0x4e, 0xc4, 0x1d, 0x00, 0x25, 0x4f, 0xf0, 0x00, 0x0c, 0xd1, 0xf8, + 0x00, 0xe0, 0x23, 0x78, 0x61, 0x78, 0x61, 0xf3, 0x0b, 0x23, 0x03, 0xeb, + 0x43, 0x01, 0x56, 0xf8, 0x21, 0x70, 0xad, 0xb1, 0x16, 0x2b, 0x2c, 0xd8, + 0x5f, 0xb3, 0x06, 0xeb, 0x81, 0x01, 0x09, 0x79, 0x05, 0x29, 0x26, 0xd1, + 0x97, 0xf8, 0x1c, 0x11, 0x01, 0x29, 0x22, 0xd1, 0x97, 0xf8, 0x1d, 0x11, + 0xc1, 0xeb, 0x01, 0x11, 0x0e, 0xeb, 0x41, 0x11, 0x89, 0x78, 0x61, 0x45, + 0x14, 0xd0, 0x18, 0xe0, 0x16, 0x2b, 0x16, 0xd8, 0xaf, 0xb1, 0x06, 0xeb, + 0x81, 0x01, 0x09, 0x79, 0x05, 0x29, 0x10, 0xd1, 0x97, 0xf8, 0x1c, 0x11, + 0x01, 0x29, 0x0c, 0xd1, 0x97, 0xf8, 0x1d, 0x11, 0xc1, 0xeb, 0x01, 0x11, + 0x0e, 0xeb, 0x41, 0x11, 0x91, 0xf8, 0x02, 0xc0, 0x01, 0x35, 0x02, 0x34, + 0x95, 0x42, 0xc8, 0xd1, 0x03, 0xe0, 0x02, 0x22, 0x02, 0xe0, 0x4f, 0xf0, + 0x00, 0x0c, 0x00, 0x22, 0x13, 0x4b, 0x13, 0xf8, 0x11, 0x1f, 0x03, 0x29, + 0x02, 0xd1, 0x59, 0x78, 0x61, 0x45, 0x09, 0xd1, 0x4a, 0xb9, 0x00, 0x79, + 0x01, 0x28, 0x13, 0xd1, 0x01, 0x20, 0x83, 0xf8, 0x01, 0xc0, 0x00, 0x22, + 0x98, 0x70, 0x00, 0xe0, 0x12, 0x22, 0x0b, 0x48, 0x4f, 0xf6, 0x91, 0x51, + 0x07, 0x23, 0x04, 0x68, 0x02, 0x20, 0xa0, 0x47, 0x18, 0xb1, 0xbd, 0xe8, + 0xf8, 0x40, 0x00, 0xf0, 0x8d, 0xb8, 0xf8, 0xbd, 0x00, 0x22, 0x9a, 0x70, + 0xef, 0xe7, 0x00, 0xbf, 0xe0, 0x35, 0x01, 0x00, 0xe8, 0x72, 0x01, 0x00, + 0x34, 0xdc, 0x05, 0x00, 0x2c, 0x9c, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, + 0x85, 0xb0, 0x07, 0x46, 0x27, 0x48, 0x99, 0x46, 0x93, 0x46, 0x0c, 0x46, + 0x4f, 0xf0, 0x00, 0x0a, 0x04, 0xaa, 0x18, 0x21, 0xcd, 0xf8, 0x10, 0xa0, + 0x03, 0x68, 0xff, 0x20, 0x98, 0x47, 0x04, 0x98, 0xe8, 0xb3, 0x21, 0x48, + 0x02, 0xad, 0x01, 0x68, 0x28, 0x46, 0x88, 0x47, 0x1f, 0x48, 0xdf, 0xf8, + 0x80, 0x80, 0x6a, 0x46, 0x03, 0x68, 0x28, 0x46, 0x41, 0x46, 0x98, 0x47, + 0x04, 0x98, 0xd0, 0x21, 0xbd, 0xf8, 0x04, 0x50, 0x00, 0x9e, 0x07, 0xf5, + 0x80, 0x72, 0x06, 0x23, 0x81, 0x70, 0x06, 0x21, 0x04, 0x98, 0x80, 0xf8, + 0x03, 0xa0, 0x04, 0x98, 0x04, 0x30, 0xfa, 0xf7, 0x1d, 0xfa, 0x97, 0xf8, + 0x2c, 0x03, 0x04, 0x99, 0x42, 0x46, 0x08, 0x23, 0x88, 0x72, 0x81, 0xf8, + 0x14, 0xb0, 0x81, 0xf8, 0x0b, 0x90, 0x01, 0xf1, 0x0c, 0x00, 0x08, 0x21, + 0xfa, 0xf7, 0x0e, 0xfa, 0x04, 0x98, 0x21, 0x0a, 0x2a, 0x09, 0x41, 0x76, + 0x40, 0xf2, 0x71, 0x21, 0x04, 0x76, 0x80, 0xf8, 0x15, 0xa0, 0x71, 0x43, + 0x02, 0xeb, 0x51, 0x01, 0x0a, 0x0a, 0x81, 0x75, 0xc2, 0x75, 0x00, 0xf0, + 0x2f, 0xf8, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x24, 0x9c, 0x08, 0x00, + 0x50, 0xa1, 0x08, 0x00, 0x44, 0xa1, 0x08, 0x00, 0x0c, 0xf0, 0x05, 0x00, + 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, + 0x08, 0x48, 0x09, 0x49, 0x01, 0x60, 0x09, 0x48, 0x09, 0x49, 0x01, 0x60, + 0x09, 0x48, 0x0a, 0x49, 0x01, 0x60, 0x70, 0x47, 0x50, 0xb5, 0x08, 0x00, + 0xe1, 0x5a, 0x02, 0x00, 0x5c, 0xa3, 0x08, 0x00, 0x65, 0x53, 0x02, 0x00, + 0xec, 0xa3, 0x08, 0x00, 0xf1, 0x5d, 0x02, 0x00, 0xd8, 0xd7, 0x08, 0x00, + 0x71, 0x5e, 0x02, 0x00, 0x58, 0xa3, 0x08, 0x00, 0xa9, 0x63, 0x02, 0x00, + 0x40, 0xf6, 0x41, 0x5c, 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x40, 0xf6, 0x61, 0x6c, 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4a, 0xf6, 0x49, 0x1c, 0xc1, 0xf2, 0x01, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4b, 0xf2, 0xb3, 0x0c, 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x48, 0xf6, 0x75, 0x5c, 0xc1, 0xf2, 0x01, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4c, 0xf6, 0xe1, 0x4c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x44, 0xf6, 0x5d, 0x0c, 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x40, 0xf6, 0x09, 0x6c, 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x48, 0xf2, 0x51, 0x1c, 0xc1, 0xf2, 0x01, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x49, 0xf6, 0x05, 0x1c, 0xc1, 0xf2, 0x01, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x49, 0xf6, 0x79, 0x6c, 0xc1, 0xf2, 0x11, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x41, 0xf2, 0x5b, 0x7c, 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x49, 0xf2, 0xb1, 0x4c, 0xc1, 0xf2, 0x01, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x48, 0xf2, 0xc1, 0x5c, 0xc1, 0xf2, 0x01, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x49, 0xf2, 0x6d, 0x2c, 0xc1, 0xf2, 0x01, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x49, 0xf6, 0x11, 0x5c, 0xc1, 0xf2, 0x01, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x49, 0xf2, 0x5d, 0x4c, 0xc1, 0xf2, 0x01, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x43, 0xf2, 0x77, 0x0c, 0xc1, 0xf2, 0x0a, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4b, 0xf6, 0xc1, 0x0c, 0xc1, 0xf2, 0x12, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x44, 0xf6, 0x95, 0x3c, 0xc1, 0xf2, 0x01, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x45, 0xf6, 0xc1, 0x5c, 0xc1, 0xf2, 0x01, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x41, 0xf2, 0x71, 0x2c, 0xc1, 0xf2, 0x00, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x46, 0xf6, 0x21, 0x2c, 0xc1, 0xf2, 0x01, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x20, 0x50, 0x61, 0x74, 0x63, 0x68, 0x56, 0x65, 0x72, 0x3d, 0x30, 0x78, + 0x25, 0x6c, 0x58, 0x20, 0x53, 0x6f, 0x43, 0x49, 0x44, 0x3d, 0x30, 0x78, + 0x25, 0x38, 0x6c, 0x58, 0x20, 0x00, 0x01, 0x01, 0x04, 0x03, 0x03, 0x03, + 0x02, 0x01, 0x01, 0x02, 0x01, 0x04, 0x01, 0x02, 0xff, 0xff, 0x05, 0x06, + 0x01, 0x02, 0x04, 0x05, 0x03, 0x02, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, + 0x02, 0x03, 0x02, 0x02, 0x03, 0x02, 0x02, 0x00, 0x04, 0x04, 0x04, 0x1c, + 0xfd, 0x7f, 0xfc, 0x01, 0x01, 0x03, 0x02, 0x02, 0xff, 0x00, 0x00, 0x00, + 0xf0, 0xb5, 0x67, 0x4d, 0x6f, 0xf3, 0x9f, 0x20, 0x00, 0x22, 0x16, 0x23, + 0x0b, 0x24, 0xa6, 0xb2, 0x35, 0xf8, 0x36, 0x60, 0xb0, 0x42, 0x0c, 0xd0, + 0x94, 0xbf, 0x23, 0x46, 0x62, 0x1c, 0x96, 0xb2, 0x9f, 0xb2, 0x16, 0xfa, + 0x83, 0xf4, 0xbe, 0x42, 0x4f, 0xea, 0x54, 0x04, 0xef, 0xd3, 0x00, 0x20, + 0xf0, 0xbd, 0x01, 0x20, 0x0c, 0x80, 0xf0, 0xbd, 0x70, 0xb5, 0x05, 0x46, + 0x0f, 0x48, 0x16, 0x46, 0x0c, 0x46, 0x00, 0x68, 0x80, 0x47, 0x28, 0xb1, + 0x55, 0x48, 0x00, 0xeb, 0xc6, 0x00, 0xc0, 0x78, 0x80, 0x07, 0x0a, 0xd4, + 0x52, 0x48, 0xa9, 0x78, 0x00, 0xeb, 0xc6, 0x00, 0x80, 0x78, 0x81, 0x42, + 0x18, 0xbf, 0xff, 0x28, 0x03, 0xd1, 0x01, 0x20, 0x70, 0xbd, 0x0c, 0x20, + 0x00, 0xe0, 0x12, 0x20, 0x21, 0x46, 0xff, 0xf7, 0x17, 0xff, 0x00, 0x20, + 0x70, 0xbd, 0x00, 0xbf, 0x34, 0xa4, 0x08, 0x00, 0x7c, 0xb5, 0x04, 0x46, + 0x00, 0x78, 0x45, 0x4a, 0x61, 0x78, 0x40, 0xea, 0x01, 0x20, 0x25, 0x49, + 0x86, 0xb2, 0x88, 0x80, 0x30, 0x46, 0x12, 0x68, 0x0a, 0x60, 0x4f, 0xf6, + 0xff, 0x71, 0xad, 0xf8, 0x06, 0x10, 0x0d, 0xf1, 0x06, 0x01, 0xff, 0xf7, + 0xab, 0xff, 0x01, 0x28, 0x1b, 0xd1, 0xbd, 0xf8, 0x06, 0x50, 0x20, 0x46, + 0x31, 0x46, 0x2a, 0x46, 0xff, 0xf7, 0xbe, 0xff, 0x01, 0x28, 0x2c, 0xd1, + 0x37, 0x48, 0x00, 0xeb, 0xc5, 0x06, 0x16, 0xf8, 0x03, 0x1f, 0xc9, 0x07, + 0x0f, 0xd1, 0x17, 0x48, 0x00, 0xf1, 0x54, 0x01, 0x20, 0x46, 0xfc, 0xf7, + 0x83, 0xfa, 0x15, 0x48, 0x04, 0x21, 0x00, 0x78, 0xfa, 0xf7, 0xae, 0xf8, + 0x7c, 0xbd, 0x20, 0x46, 0x00, 0xf0, 0x6e, 0xf8, 0x7c, 0xbd, 0x00, 0xeb, + 0xc5, 0x00, 0x41, 0x68, 0x89, 0xb1, 0x20, 0x46, 0x88, 0x47, 0x2a, 0x48, + 0x90, 0xf8, 0x2c, 0x01, 0xc0, 0x06, 0x0a, 0xd4, 0x08, 0x48, 0x00, 0x78, + 0x01, 0x28, 0x06, 0xd0, 0x30, 0x78, 0x40, 0x07, 0x03, 0xd5, 0x00, 0x20, + 0x00, 0x21, 0xff, 0xf7, 0xc5, 0xfe, 0x20, 0x46, 0xff, 0xf7, 0xf8, 0xfe, + 0x7c, 0xbd, 0x00, 0xbf, 0x54, 0xdc, 0x05, 0x00, 0x9e, 0x53, 0x01, 0x00, + 0x2c, 0xba, 0x01, 0x00, 0x67, 0x34, 0x01, 0x00, 0x7c, 0xb5, 0x06, 0x46, + 0x0d, 0x46, 0x41, 0xf4, 0x7c, 0x40, 0x16, 0x49, 0x34, 0x68, 0x88, 0x80, + 0x15, 0x48, 0x00, 0x68, 0x08, 0x60, 0x4f, 0xf6, 0xff, 0x70, 0x0d, 0xf1, + 0x06, 0x01, 0xad, 0xf8, 0x06, 0x00, 0x28, 0x46, 0xff, 0xf7, 0x52, 0xff, + 0x01, 0x28, 0x15, 0xd1, 0xbd, 0xf8, 0x06, 0x00, 0x0e, 0x49, 0x01, 0xeb, + 0xc0, 0x05, 0x69, 0x68, 0x09, 0xb1, 0x20, 0x46, 0x88, 0x47, 0x0c, 0x48, + 0x90, 0xf8, 0x2c, 0x01, 0xc0, 0x06, 0x0b, 0xd4, 0xe8, 0x78, 0x40, 0x07, + 0x08, 0xd5, 0x00, 0x20, 0x00, 0x21, 0xff, 0xf7, 0x8d, 0xfe, 0x7c, 0xbd, + 0x30, 0x46, 0x29, 0x46, 0x00, 0xf0, 0x20, 0xf8, 0x7c, 0xbd, 0x00, 0xbf, + 0x5c, 0xdc, 0x05, 0x00, 0x24, 0x20, 0x00, 0x40, 0x24, 0xd2, 0x05, 0x00, + 0x8c, 0x7e, 0x08, 0x00, 0x03, 0x48, 0x04, 0x49, 0x01, 0x60, 0x04, 0x48, + 0x04, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, 0x20, 0xe6, 0x08, 0x00, + 0x21, 0x6f, 0x02, 0x00, 0xd0, 0xa9, 0x08, 0x00, 0x6d, 0x6e, 0x02, 0x00, + 0x4a, 0xf2, 0x2d, 0x1c, 0xc1, 0xf2, 0x01, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4a, 0xf2, 0xa1, 0x1c, 0xc1, 0xf2, 0x01, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x5c, 0x49, 0x09, 0x78, 0x02, 0x29, 0x04, 0xd1, 0x0a, 0x49, 0x09, 0x88, + 0x08, 0x43, 0x0a, 0x49, 0x0b, 0xe0, 0x07, 0x49, 0x09, 0x78, 0x0b, 0x29, + 0x08, 0xd1, 0x06, 0x4a, 0x01, 0x02, 0x11, 0x80, 0x05, 0x49, 0x0a, 0x68, + 0xd2, 0xb2, 0x42, 0xea, 0x00, 0x20, 0x08, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0x8c, 0x01, 0x01, 0x00, 0x26, 0x21, 0x01, 0x00, 0x04, 0x08, 0x00, 0x40, + 0xf8, 0xb5, 0x18, 0x48, 0x00, 0x68, 0x80, 0x47, 0x17, 0x4c, 0x20, 0x68, + 0xc0, 0xb2, 0x52, 0x28, 0x0c, 0xd0, 0x17, 0x48, 0x15, 0x4d, 0x41, 0xf2, + 0x88, 0x36, 0x47, 0x1c, 0x28, 0x88, 0x70, 0x43, 0x02, 0x38, 0xb8, 0x47, + 0x20, 0x68, 0xc0, 0xb2, 0x52, 0x28, 0xf7, 0xd1, 0x00, 0x20, 0x12, 0x49, + 0x4f, 0xf0, 0x00, 0x52, 0x4f, 0xf4, 0x10, 0x23, 0x20, 0x60, 0x0e, 0x48, + 0x00, 0x68, 0x08, 0x44, 0x4f, 0xf4, 0x10, 0x21, 0xf9, 0xf7, 0xe8, 0xff, + 0x08, 0x48, 0x41, 0xf2, 0x88, 0x31, 0x00, 0x88, 0x48, 0x43, 0x07, 0x49, + 0x02, 0x38, 0x01, 0x31, 0x88, 0x47, 0x60, 0x68, 0x07, 0x48, 0x60, 0x60, + 0xf8, 0xbd, 0x00, 0xbf, 0x80, 0xf2, 0x08, 0x00, 0x80, 0x10, 0x01, 0x30, + 0x34, 0xec, 0x01, 0x00, 0x40, 0xec, 0x01, 0x00, 0x08, 0x00, 0x00, 0x70, + 0x00, 0x00, 0xc0, 0x6e, 0x52, 0x44, 0x44, 0x41, 0x10, 0xb5, 0x08, 0x4c, + 0x20, 0x78, 0x01, 0x28, 0x02, 0xd1, 0x60, 0x78, 0x01, 0x28, 0x05, 0xd0, + 0x00, 0xf0, 0x64, 0xf8, 0x20, 0x78, 0x01, 0x28, 0x18, 0xbf, 0x10, 0xbd, + 0xbd, 0xe8, 0x10, 0x40, 0xff, 0xf7, 0xae, 0xbf, 0xf8, 0xdd, 0x05, 0x00, + 0x10, 0xb5, 0x0f, 0x4b, 0x0f, 0x4a, 0x19, 0x68, 0x01, 0x31, 0x31, 0x29, + 0x88, 0xbf, 0x00, 0x21, 0x19, 0x60, 0x14, 0x68, 0x0c, 0x4a, 0xff, 0x28, + 0x42, 0xf8, 0x31, 0x40, 0x01, 0xd0, 0x03, 0x46, 0x06, 0xe0, 0xef, 0xf3, + 0x05, 0x84, 0x19, 0x68, 0xa4, 0xf1, 0x10, 0x03, 0x43, 0xf4, 0x00, 0x43, + 0x02, 0xeb, 0xc1, 0x01, 0x4b, 0x60, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, + 0x41, 0xb8, 0x00, 0xbf, 0x64, 0xdc, 0x05, 0x00, 0x24, 0x20, 0x00, 0x40, + 0x68, 0xdc, 0x05, 0x00, 0x70, 0xb5, 0x06, 0x46, 0x06, 0x48, 0x0d, 0x46, + 0x14, 0x46, 0x01, 0x68, 0x00, 0x20, 0x88, 0x47, 0x30, 0x46, 0x29, 0x46, + 0x22, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x00, 0xf0, 0x31, 0xb8, 0x00, 0xbf, + 0xa8, 0xfd, 0x08, 0x00, 0x07, 0x48, 0x02, 0x21, 0x01, 0x70, 0x07, 0x48, + 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, + 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, 0x09, 0x49, 0x01, 0x60, 0x70, 0x47, + 0x6f, 0x34, 0x01, 0x00, 0x00, 0x9d, 0x08, 0x00, 0xcd, 0x6f, 0x02, 0x00, + 0xd0, 0x8f, 0x08, 0x00, 0x89, 0x70, 0x02, 0x00, 0xa4, 0x8d, 0x08, 0x00, + 0xb1, 0x70, 0x02, 0x00, 0x60, 0xa0, 0x08, 0x00, 0xfd, 0x70, 0x02, 0x00, + 0x4c, 0xf6, 0x01, 0x3c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4b, 0xf6, 0xa5, 0x7c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4c, 0xf2, 0x51, 0x2c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0xf0, 0xb5, 0x85, 0xb0, 0x06, 0x46, 0x40, 0xf2, 0x16, 0x70, 0x0c, 0x46, + 0x86, 0x42, 0x05, 0xd1, 0x03, 0xad, 0x28, 0x46, 0x2f, 0xf0, 0xe8, 0xfe, + 0x08, 0x23, 0x00, 0xe0, 0x15, 0x46, 0x9e, 0x48, 0x01, 0x21, 0x22, 0x46, + 0x07, 0x68, 0x00, 0x20, 0xcd, 0xe9, 0x00, 0x30, 0x30, 0x46, 0x2b, 0x46, + 0xb8, 0x47, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0xbf, 0xf8, 0xb5, 0x14, 0x46, + 0x0a, 0x46, 0x88, 0x49, 0x00, 0xf0, 0x07, 0x03, 0x01, 0xeb, 0xd0, 0x01, + 0x91, 0xf8, 0x50, 0x11, 0xd9, 0x40, 0xc9, 0x07, 0x27, 0xd0, 0x14, 0x4d, + 0x55, 0xf8, 0x04, 0x1f, 0x01, 0xb3, 0xeb, 0x88, 0xaf, 0x88, 0x1e, 0x19, + 0xbe, 0x42, 0x1b, 0xd2, 0x5e, 0x1c, 0x40, 0x28, 0xee, 0x80, 0x39, 0xbf, + 0x40, 0xf0, 0xc0, 0x00, 0xc8, 0x54, 0xff, 0x26, 0xce, 0x54, 0x21, 0xbf, + 0xe9, 0x88, 0x4b, 0x1c, 0xeb, 0x80, 0x2b, 0x68, 0x28, 0xbf, 0x58, 0x54, + 0xe9, 0x88, 0x28, 0x68, 0xab, 0x88, 0x08, 0x44, 0x59, 0x1a, 0x23, 0x46, + 0xf9, 0xf7, 0x02, 0xff, 0xe8, 0x88, 0x20, 0x44, 0xe8, 0x80, 0xf8, 0xbd, + 0x68, 0x7a, 0x01, 0x30, 0x68, 0x72, 0xf8, 0xbd, 0x78, 0x34, 0x01, 0x00, + 0xb0, 0xb5, 0x0d, 0x46, 0x04, 0x46, 0x00, 0xf0, 0xf7, 0xf8, 0x20, 0x78, + 0xc0, 0x07, 0x0d, 0xd0, 0x02, 0x2d, 0x0b, 0xd3, 0x68, 0x48, 0x62, 0x78, + 0xb0, 0xf8, 0x3c, 0x11, 0xd2, 0x07, 0x0c, 0xbf, 0x41, 0xf4, 0x00, 0x51, + 0x21, 0xf4, 0x00, 0x51, 0xa0, 0xf8, 0x3c, 0x11, 0xb0, 0xbd, 0x00, 0xbf, + 0x2d, 0xe9, 0xf8, 0x4f, 0xb0, 0xf5, 0xc0, 0x6f, 0x31, 0xd0, 0x0f, 0x46, + 0x40, 0xf2, 0x14, 0x61, 0x88, 0x42, 0x2c, 0xd0, 0x15, 0x46, 0x40, 0xf2, + 0xfd, 0x62, 0xdd, 0xf8, 0x28, 0x90, 0x1c, 0x46, 0x90, 0x42, 0x27, 0xd0, + 0x40, 0xf2, 0xa9, 0x61, 0x88, 0x42, 0x22, 0xd1, 0xfc, 0xb1, 0xdf, 0xf8, + 0xec, 0xa0, 0x3b, 0x49, 0x1a, 0xf8, 0x01, 0x0f, 0x00, 0xeb, 0x40, 0x00, + 0x51, 0xf8, 0x20, 0xb0, 0x38, 0x48, 0x39, 0x46, 0x02, 0x68, 0x4f, 0xf4, + 0xc0, 0x60, 0x90, 0x47, 0x78, 0xb1, 0x36, 0x48, 0x01, 0x68, 0x09, 0xf1, + 0x0c, 0x00, 0x1f, 0xfa, 0x80, 0xf8, 0x40, 0x46, 0x88, 0x47, 0x30, 0xb1, + 0x06, 0x46, 0x9b, 0xf8, 0xb0, 0x05, 0x01, 0x28, 0x0e, 0xd1, 0x03, 0x21, + 0x12, 0xe0, 0xbd, 0xe8, 0xf8, 0x8f, 0x01, 0x46, 0x08, 0x46, 0x39, 0x46, + 0x2a, 0x46, 0x23, 0x46, 0xcd, 0xf8, 0x00, 0x90, 0x00, 0xf0, 0xa8, 0xf8, + 0xbd, 0xe8, 0xf8, 0x8f, 0x9b, 0xf8, 0x00, 0x00, 0x01, 0x38, 0xb0, 0xfa, + 0x80, 0xf0, 0x41, 0x09, 0x25, 0x4a, 0x9a, 0xf8, 0x03, 0x00, 0x12, 0x68, + 0x90, 0x47, 0x8a, 0xf8, 0x03, 0x00, 0x9b, 0xf8, 0x74, 0x00, 0x06, 0xf1, + 0x0a, 0x03, 0x39, 0x46, 0x2a, 0x46, 0x8a, 0xf8, 0x06, 0x00, 0x1f, 0x48, + 0xd0, 0xf8, 0x00, 0xc0, 0x09, 0xf1, 0x02, 0x00, 0x80, 0xb2, 0x00, 0x90, + 0x4f, 0xf4, 0xc0, 0x60, 0xe0, 0x47, 0x56, 0xf8, 0x08, 0x0c, 0x22, 0x46, + 0x4b, 0x46, 0x01, 0x89, 0x06, 0xf1, 0x14, 0x00, 0x14, 0x39, 0xf9, 0xf7, + 0x73, 0xfe, 0x09, 0xf1, 0x14, 0x00, 0x15, 0x4a, 0x00, 0x21, 0x04, 0x23, + 0xff, 0x24, 0xc0, 0xb2, 0x92, 0xf8, 0x5f, 0x50, 0x01, 0x2d, 0x01, 0xeb, + 0x00, 0x05, 0x11, 0xbf, 0x74, 0x55, 0x02, 0xeb, 0x41, 0x07, 0xb7, 0xf9, + 0x58, 0x70, 0x97, 0xfb, 0xf3, 0xf7, 0x08, 0xbf, 0x77, 0x55, 0x00, 0x29, + 0x4f, 0xf0, 0x01, 0x01, 0xec, 0xd0, 0x0a, 0x48, 0x41, 0x46, 0x02, 0x68, + 0x30, 0x46, 0xbd, 0xe8, 0xf8, 0x4f, 0x10, 0x47, 0xe0, 0x76, 0x01, 0x00, + 0xe8, 0x72, 0x01, 0x00, 0xd4, 0xa2, 0x08, 0x00, 0xd8, 0xa2, 0x08, 0x00, + 0x34, 0x9c, 0x08, 0x00, 0xcc, 0xa2, 0x08, 0x00, 0xd0, 0xe2, 0x05, 0x00, + 0xdc, 0xa2, 0x08, 0x00, 0xbc, 0xb5, 0x07, 0x4c, 0x25, 0x78, 0x06, 0x9c, + 0x25, 0xb1, 0x1c, 0x4d, 0x00, 0x94, 0x2d, 0x68, 0xa8, 0x47, 0xbc, 0xbd, + 0x07, 0x9d, 0xcd, 0xe9, 0x00, 0x45, 0x00, 0xf0, 0x43, 0xf8, 0xbc, 0xbd, + 0xdb, 0xb8, 0x01, 0x00, 0x80, 0xb5, 0x09, 0x4a, 0xb2, 0xf8, 0x3c, 0x31, + 0xdb, 0x07, 0x01, 0xd1, 0x00, 0x20, 0x80, 0xbd, 0x20, 0xf0, 0xff, 0x03, + 0xb3, 0xf5, 0x80, 0x6f, 0x03, 0xd1, 0x92, 0xf8, 0x7b, 0x22, 0x00, 0x2a, + 0xf4, 0xd0, 0x00, 0xf0, 0x33, 0xf8, 0x80, 0xbd, 0x8c, 0x7e, 0x08, 0x00, + 0x06, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x07, 0x49, 0x01, 0x60, + 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, + 0x70, 0x47, 0x00, 0xbf, 0xf4, 0xa2, 0x08, 0x00, 0x31, 0x72, 0x02, 0x00, + 0x78, 0x9b, 0x08, 0x00, 0x89, 0x71, 0x02, 0x00, 0xa0, 0xa0, 0x08, 0x00, + 0x61, 0x72, 0x02, 0x00, 0x00, 0xa3, 0x08, 0x00, 0x9d, 0x73, 0x02, 0x00, + 0x4e, 0xf2, 0x35, 0x2c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4d, 0xf6, 0x29, 0x4c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4d, 0xf6, 0xdd, 0x5c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4d, 0xf6, 0xb9, 0x2c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x11, 0x48, 0x1f, 0x21, 0x00, 0x78, 0xf9, 0xf7, 0xe5, 0xbd, 0x00, 0xbf, + 0x70, 0xb5, 0x06, 0x46, 0xd0, 0xf8, 0xd4, 0x00, 0x40, 0x7f, 0x98, 0xb1, + 0x0a, 0x48, 0x0c, 0x46, 0x15, 0x46, 0x01, 0x68, 0x0c, 0x20, 0x88, 0x47, + 0x60, 0xb1, 0x3d, 0x49, 0x05, 0x72, 0xc0, 0xe9, 0x00, 0x64, 0xfb, 0xf7, + 0xa1, 0xff, 0x05, 0x48, 0x1e, 0x21, 0x00, 0x78, 0xf9, 0xf7, 0xcc, 0xfd, + 0x01, 0x20, 0x70, 0xbd, 0x00, 0x20, 0x70, 0xbd, 0x4c, 0x9c, 0x08, 0x00, + 0x66, 0x34, 0x01, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, 0x81, 0x46, 0x00, 0x78, + 0x0d, 0x46, 0x00, 0x07, 0x13, 0xd5, 0x2f, 0x4c, 0x2f, 0x48, 0x21, 0x68, + 0x88, 0x47, 0x70, 0xb1, 0x2d, 0x4e, 0x07, 0x46, 0x78, 0x68, 0x08, 0xb1, + 0xff, 0xf7, 0x1a, 0xfc, 0x38, 0x46, 0xff, 0xf7, 0x17, 0xfc, 0x21, 0x68, + 0x30, 0x46, 0x88, 0x47, 0x07, 0x46, 0x00, 0x28, 0xf2, 0xd1, 0xd9, 0xf8, + 0x00, 0x00, 0x41, 0x00, 0x3b, 0xd5, 0xdf, 0xf8, 0x8c, 0x80, 0x23, 0x48, + 0x00, 0x95, 0xd8, 0xf8, 0x00, 0x10, 0x88, 0x47, 0x80, 0xb3, 0x20, 0x4e, + 0xdf, 0xf8, 0x80, 0xa0, 0xdf, 0xf8, 0x80, 0xb0, 0x07, 0x46, 0x38, 0x68, + 0xf0, 0xb1, 0x7a, 0x68, 0xe2, 0xb1, 0x3c, 0x7a, 0x10, 0x1d, 0x21, 0x46, + 0x23, 0x46, 0x00, 0xf0, 0x3f, 0xf8, 0xda, 0xf8, 0x00, 0x20, 0xd7, 0xe9, + 0x00, 0x01, 0x90, 0x47, 0xd7, 0xe9, 0x00, 0x01, 0x23, 0x1d, 0x90, 0xf8, + 0x35, 0x01, 0x08, 0x70, 0x00, 0x21, 0x78, 0x68, 0x84, 0x70, 0x4f, 0xf4, + 0x40, 0x70, 0x7a, 0x68, 0xdb, 0xf8, 0x00, 0x50, 0xa8, 0x47, 0x78, 0x68, + 0xff, 0xf7, 0xde, 0xfb, 0x38, 0x46, 0xff, 0xf7, 0xdb, 0xfb, 0xd8, 0xf8, + 0x00, 0x10, 0x30, 0x46, 0x88, 0x47, 0x07, 0x46, 0x00, 0x28, 0xd4, 0xd1, + 0xd9, 0xf8, 0x00, 0x00, 0x00, 0x9d, 0xb0, 0xf1, 0xff, 0x3f, 0xd8, 0xbf, + 0xfb, 0xf7, 0xc4, 0xfd, 0x48, 0x46, 0x29, 0x46, 0xbd, 0xe8, 0xf8, 0x4f, + 0x00, 0xf0, 0x16, 0xb8, 0x24, 0x9d, 0x08, 0x00, 0xfc, 0xdd, 0x05, 0x00, + 0xa4, 0xc2, 0x08, 0x00, 0x78, 0x9b, 0x08, 0x00, 0x01, 0x48, 0x02, 0x49, + 0x01, 0x60, 0x70, 0x47, 0x98, 0xaa, 0x08, 0x00, 0xa5, 0x74, 0x02, 0x00, + 0x4c, 0xf6, 0x63, 0x5c, 0xc1, 0xf2, 0x11, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x49, 0xf2, 0xa9, 0x0c, 0xc1, 0xf2, 0x11, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x80, 0xb5, 0x00, 0xf0, 0x65, 0xf9, 0x08, 0x48, 0x01, 0x68, 0x2a, 0x20, + 0x88, 0x47, 0x97, 0x49, 0x00, 0x28, 0x4f, 0xf0, 0x2a, 0x00, 0x0b, 0x68, + 0x4f, 0xf0, 0x01, 0x01, 0x0c, 0xbf, 0x00, 0x22, 0x01, 0x22, 0xbd, 0xe8, + 0x80, 0x40, 0x18, 0x47, 0xe8, 0x9c, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x41, + 0x42, 0x4e, 0x00, 0x20, 0x00, 0x21, 0x00, 0x24, 0x32, 0x68, 0x90, 0x47, + 0x87, 0x48, 0xdf, 0xf8, 0x04, 0x81, 0x01, 0x68, 0x21, 0xf0, 0x40, 0x61, + 0x01, 0x60, 0x01, 0x68, 0x21, 0xf4, 0x40, 0x71, 0x01, 0x60, 0x3b, 0x48, + 0x00, 0x68, 0x80, 0xf8, 0x7d, 0x40, 0x80, 0xf8, 0x7e, 0x40, 0x80, 0xf8, + 0x7f, 0x40, 0x98, 0xf8, 0x00, 0x00, 0x40, 0xf0, 0x04, 0x01, 0x05, 0x29, + 0x3c, 0xd1, 0x36, 0x48, 0x00, 0x78, 0x01, 0x28, 0x04, 0xd1, 0x35, 0x48, + 0x32, 0x68, 0x01, 0x68, 0x00, 0x20, 0x90, 0x47, 0x33, 0x48, 0x01, 0x78, + 0x01, 0x29, 0x03, 0xd1, 0x32, 0x49, 0x00, 0x22, 0x0a, 0x70, 0x02, 0x70, + 0x73, 0x48, 0x40, 0x21, 0x30, 0x4f, 0x00, 0x26, 0x06, 0x25, 0x01, 0x80, + 0x2f, 0x48, 0x3e, 0x60, 0xf8, 0x67, 0x2f, 0x48, 0x04, 0x68, 0x2f, 0x48, + 0x01, 0x68, 0x06, 0x20, 0x88, 0x47, 0x2e, 0x48, 0x21, 0x46, 0x02, 0x68, + 0x06, 0x20, 0x90, 0x47, 0x2c, 0x48, 0x01, 0x68, 0x06, 0x20, 0x88, 0x47, + 0x78, 0x6e, 0x01, 0x24, 0x65, 0xf3, 0x13, 0x40, 0x78, 0x66, 0xb8, 0x6e, + 0x65, 0xf3, 0x13, 0x40, 0xb8, 0x66, 0x27, 0x48, 0xc7, 0xf8, 0xec, 0x40, + 0x04, 0x70, 0x26, 0x48, 0x06, 0x70, 0x26, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x98, 0xf8, 0x00, 0x00, 0x03, 0x28, 0x19, 0xd1, 0x5e, 0x48, 0x00, 0x21, + 0x02, 0x68, 0x2a, 0x20, 0x90, 0x47, 0x5d, 0x48, 0x5d, 0x4c, 0x01, 0x21, + 0x03, 0x68, 0xe0, 0x7e, 0x00, 0x28, 0x4f, 0xf0, 0x2a, 0x00, 0x14, 0xbf, + 0x00, 0x22, 0x01, 0x22, 0x98, 0x47, 0x6e, 0x4d, 0x60, 0x7f, 0x29, 0x68, + 0x35, 0xf0, 0xd8, 0xf8, 0x28, 0x68, 0xbd, 0xe8, 0xf0, 0x41, 0x00, 0x47, + 0x0c, 0xb1, 0xbd, 0xe8, 0xf0, 0x81, 0x12, 0x48, 0x01, 0x21, 0x01, 0x70, + 0x12, 0x48, 0x00, 0x68, 0x80, 0x47, 0x4b, 0x48, 0x40, 0x21, 0x01, 0x80, + 0xbd, 0xe8, 0xf0, 0x81, 0xc4, 0x9c, 0x08, 0x00, 0xcc, 0x35, 0x01, 0x00, + 0xba, 0x36, 0x01, 0x00, 0xb9, 0x36, 0x01, 0x00, 0x08, 0xa7, 0x08, 0x00, + 0xb1, 0x36, 0x01, 0x00, 0xb3, 0x36, 0x01, 0x00, 0xc4, 0x21, 0x00, 0x40, + 0x00, 0x01, 0x10, 0x00, 0x0c, 0xa7, 0x08, 0x00, 0xb8, 0x9c, 0x08, 0x00, + 0xac, 0x9c, 0x08, 0x00, 0xb0, 0x9c, 0x08, 0x00, 0xb5, 0x36, 0x01, 0x00, + 0xb4, 0x36, 0x01, 0x00, 0x88, 0x9c, 0x08, 0x00, 0x01, 0x28, 0x08, 0xd1, + 0x05, 0x4a, 0x06, 0x4b, 0x12, 0x68, 0x1a, 0x60, 0x0a, 0x78, 0x03, 0xf8, + 0x04, 0x2f, 0x4a, 0x78, 0x5a, 0x70, 0x00, 0xf0, 0xa3, 0xb8, 0x00, 0xbf, + 0x24, 0x20, 0x00, 0x40, 0x08, 0xde, 0x05, 0x00, 0xb0, 0xb5, 0x04, 0x46, + 0x2b, 0x48, 0x01, 0x21, 0x2b, 0x4d, 0x01, 0x60, 0x28, 0x78, 0x40, 0xf0, + 0x04, 0x01, 0x05, 0x29, 0x0c, 0xd1, 0x29, 0x48, 0x01, 0x68, 0x21, 0xf0, + 0x40, 0x61, 0x01, 0x60, 0x01, 0x68, 0x21, 0xf4, 0x40, 0x71, 0x01, 0x60, + 0x25, 0x48, 0x40, 0x21, 0x01, 0x80, 0x28, 0x78, 0x03, 0x28, 0x13, 0xd1, + 0x23, 0x48, 0x40, 0x21, 0x01, 0x80, 0x23, 0x48, 0x00, 0x21, 0x02, 0x68, + 0x2a, 0x20, 0x90, 0x47, 0x21, 0x48, 0x01, 0x21, 0x03, 0x68, 0x21, 0x48, + 0xc0, 0x7e, 0x00, 0x28, 0x4f, 0xf0, 0x2a, 0x00, 0x14, 0xbf, 0x00, 0x22, + 0x01, 0x22, 0x98, 0x47, 0x64, 0xb9, 0x28, 0x78, 0x40, 0xf0, 0x04, 0x00, + 0x05, 0x28, 0x07, 0xd1, 0x1a, 0x48, 0x64, 0x21, 0x00, 0x88, 0x48, 0x43, + 0x19, 0x49, 0x02, 0x38, 0x01, 0x31, 0x88, 0x47, 0x18, 0x4c, 0x01, 0x20, + 0x81, 0x21, 0x22, 0x68, 0x90, 0x47, 0x22, 0x68, 0x03, 0x20, 0x81, 0x21, + 0x90, 0x47, 0x15, 0x48, 0x16, 0x4a, 0x01, 0x88, 0x14, 0x48, 0x12, 0x68, + 0x00, 0x88, 0x90, 0x47, 0x14, 0x48, 0x00, 0x68, 0x80, 0x47, 0x14, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x28, 0x78, 0x03, 0x28, 0x02, 0xd0, 0x05, 0x48, + 0x40, 0x21, 0x01, 0x80, 0xb0, 0xbd, 0x00, 0xbf, 0x04, 0x04, 0x00, 0x40, + 0xba, 0x36, 0x01, 0x00, 0x24, 0x40, 0x01, 0x30, 0x08, 0x90, 0x03, 0x30, + 0x0c, 0x90, 0x03, 0x30, 0xd8, 0x9c, 0x08, 0x00, 0xdc, 0x9c, 0x08, 0x00, + 0x8c, 0x7e, 0x08, 0x00, 0x34, 0xec, 0x01, 0x00, 0x40, 0xec, 0x01, 0x00, + 0x88, 0xa7, 0x08, 0x00, 0xaa, 0x36, 0x01, 0x00, 0xa8, 0x36, 0x01, 0x00, + 0x18, 0xa7, 0x08, 0x00, 0x1c, 0xa7, 0x08, 0x00, 0x20, 0xa7, 0x08, 0x00, + 0x06, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x07, 0x49, 0x01, 0x60, + 0x07, 0x48, 0x08, 0x49, 0x01, 0x62, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, + 0x70, 0x47, 0x00, 0xbf, 0x34, 0xa7, 0x08, 0x00, 0x25, 0x77, 0x02, 0x00, + 0x2c, 0xa7, 0x08, 0x00, 0xd5, 0x75, 0x02, 0x00, 0xc0, 0xa5, 0x08, 0x00, + 0x49, 0x77, 0x02, 0x00, 0x10, 0xa7, 0x08, 0x00, 0xa9, 0x75, 0x02, 0x00, + 0x4f, 0xf2, 0x49, 0x3c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4f, 0xf6, 0x5d, 0x6c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x2d, 0xe9, 0xf0, 0x47, 0x37, 0x48, 0x80, 0x79, 0x01, 0x28, 0x08, 0xd0, + 0xb9, 0x48, 0x44, 0x68, 0x00, 0xf0, 0x94, 0xf9, 0x18, 0xb1, 0x4f, 0x48, + 0x40, 0x88, 0xc0, 0x07, 0x01, 0xd1, 0xbd, 0xe8, 0xf0, 0x87, 0xdf, 0xf8, + 0xc4, 0x80, 0x98, 0xf8, 0x00, 0x00, 0x01, 0x28, 0x03, 0xd1, 0x98, 0xf8, + 0x01, 0x00, 0x01, 0x28, 0x4d, 0xd0, 0x86, 0x48, 0x40, 0xf6, 0x71, 0x11, + 0xac, 0x4f, 0xa0, 0xf8, 0x02, 0x11, 0x55, 0x21, 0x00, 0xf5, 0x81, 0x76, + 0xa0, 0xf8, 0x04, 0x11, 0x97, 0xf8, 0x5b, 0x07, 0x04, 0x28, 0x0d, 0xd8, + 0x01, 0x21, 0x01, 0xfa, 0x00, 0xf0, 0x10, 0xf0, 0x1a, 0x0f, 0x07, 0xd0, + 0x22, 0x48, 0x00, 0x68, 0x80, 0x47, 0x18, 0xb1, 0x21, 0x48, 0x01, 0x68, + 0x01, 0x20, 0x88, 0x47, 0x3a, 0x4d, 0xdf, 0xf8, 0x80, 0x90, 0xdf, 0xf8, + 0x80, 0xa0, 0x00, 0x20, 0xb0, 0x80, 0x28, 0x68, 0x80, 0x47, 0x30, 0x79, + 0x10, 0xb9, 0x71, 0x79, 0x01, 0x29, 0x13, 0xd0, 0x97, 0xf8, 0xfe, 0x13, + 0x02, 0x29, 0x04, 0xbf, 0x00, 0x20, 0x30, 0x71, 0xe1, 0x6a, 0x00, 0x29, + 0xef, 0xd1, 0x00, 0x28, 0xed, 0xd1, 0xd9, 0xf8, 0x00, 0x00, 0x80, 0x47, + 0x00, 0x28, 0xe8, 0xd0, 0xda, 0xf8, 0x00, 0x00, 0x80, 0x47, 0xe4, 0xe7, + 0x00, 0x20, 0x42, 0xf2, 0x28, 0x31, 0x70, 0x71, 0x28, 0x48, 0x00, 0x88, + 0x48, 0x43, 0x28, 0x49, 0x02, 0x38, 0x01, 0x31, 0x88, 0x47, 0x98, 0xf8, + 0x00, 0x00, 0x01, 0x28, 0x03, 0xd1, 0xbd, 0xe8, 0xf0, 0x47, 0xff, 0xf7, + 0x4f, 0xbb, 0xbd, 0xe8, 0xf0, 0x47, 0x00, 0xf0, 0x0d, 0xb8, 0x00, 0xbf, + 0x9e, 0x3a, 0x01, 0x00, 0xf8, 0xdd, 0x05, 0x00, 0x5c, 0xa9, 0x08, 0x00, + 0xe8, 0x9f, 0x08, 0x00, 0x7c, 0xa8, 0x08, 0x00, 0x9c, 0xa6, 0x08, 0x00, + 0xb0, 0xb5, 0x7d, 0x48, 0x53, 0x4d, 0xff, 0x21, 0x04, 0x68, 0x28, 0x46, + 0xfc, 0xf7, 0x8a, 0xf9, 0x4f, 0xf4, 0x88, 0x70, 0x29, 0x46, 0x03, 0x22, + 0x28, 0x80, 0x0f, 0x48, 0x00, 0x78, 0xa8, 0x70, 0x4e, 0x48, 0x03, 0x68, + 0x20, 0x46, 0x98, 0x47, 0x4d, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, + 0x0a, 0x4c, 0x0b, 0x4d, 0x01, 0x20, 0x20, 0x70, 0x28, 0x68, 0x80, 0x47, + 0x20, 0x78, 0x00, 0x28, 0xfa, 0xd1, 0x08, 0x48, 0x42, 0xf2, 0x28, 0x31, + 0x00, 0x88, 0x48, 0x43, 0x06, 0x49, 0x02, 0x38, 0x01, 0x31, 0xbd, 0xe8, + 0xb0, 0x40, 0x08, 0x47, 0x48, 0xec, 0x01, 0x00, 0x10, 0xde, 0x05, 0x00, + 0x58, 0xa7, 0x08, 0x00, 0x34, 0xec, 0x01, 0x00, 0x40, 0xec, 0x01, 0x00, + 0x7c, 0xb5, 0x62, 0x48, 0x43, 0x4d, 0xff, 0x21, 0xff, 0x26, 0x44, 0x68, + 0x4f, 0xf4, 0x10, 0x20, 0x01, 0x90, 0x28, 0x46, 0xe5, 0x62, 0xfb, 0xf7, + 0x9b, 0xfc, 0x40, 0xf6, 0x01, 0x00, 0x2e, 0x71, 0xe8, 0x80, 0x42, 0xf6, + 0xdd, 0x60, 0x28, 0x80, 0x2f, 0x48, 0x00, 0xf5, 0x80, 0x76, 0x90, 0xf8, + 0x06, 0x01, 0xe0, 0xb1, 0x30, 0x88, 0x71, 0x88, 0x81, 0x42, 0x35, 0xd9, + 0xfb, 0x20, 0xf8, 0x21, 0x32, 0x46, 0x02, 0x23, 0xa8, 0x70, 0xf9, 0x20, + 0x68, 0x71, 0x05, 0xf1, 0x08, 0x00, 0xf9, 0xf7, 0xeb, 0xfa, 0x30, 0x88, + 0x25, 0x49, 0xf4, 0x22, 0xf4, 0x23, 0x00, 0xfb, 0x02, 0x12, 0x05, 0xf1, + 0x0b, 0x00, 0xf5, 0x21, 0xf9, 0xf7, 0xe0, 0xfa, 0x30, 0x88, 0x01, 0x30, + 0x14, 0xe0, 0xfb, 0x20, 0x01, 0xaa, 0xf5, 0x21, 0x04, 0x23, 0xa8, 0x70, + 0xf9, 0x20, 0x68, 0x71, 0x05, 0xf1, 0x0b, 0x00, 0xf9, 0xf7, 0xd2, 0xfa, + 0x05, 0xf1, 0x0f, 0x00, 0xf1, 0x21, 0x4f, 0xf0, 0x00, 0x52, 0xf0, 0x23, + 0xf9, 0xf7, 0xca, 0xfa, 0x01, 0x20, 0xb0, 0x71, 0x30, 0x80, 0x15, 0x48, + 0x29, 0x46, 0xff, 0x22, 0x03, 0x68, 0x20, 0x46, 0x98, 0x47, 0x1a, 0xe0, + 0x4f, 0xf6, 0xff, 0x71, 0xf4, 0x23, 0x29, 0x81, 0xb1, 0x88, 0x8a, 0x1c, + 0x69, 0x71, 0xaa, 0x70, 0x0c, 0x4a, 0x00, 0xfb, 0x03, 0x22, 0x4b, 0x1f, + 0x05, 0xf1, 0x0b, 0x00, 0xf5, 0x21, 0xf9, 0xf7, 0xaf, 0xfa, 0x09, 0x48, + 0x29, 0x46, 0x03, 0x68, 0xb0, 0x88, 0x06, 0x30, 0x82, 0xb2, 0x20, 0x46, + 0x98, 0x47, 0x01, 0x20, 0xf0, 0x71, 0x05, 0x48, 0x01, 0x68, 0x20, 0x46, + 0x88, 0x47, 0x7c, 0xbd, 0xec, 0x36, 0x01, 0x00, 0xfc, 0xff, 0xff, 0x1f, + 0x50, 0xa7, 0x08, 0x00, 0x54, 0xa7, 0x08, 0x00, 0x10, 0xb5, 0x48, 0xb1, + 0x04, 0x46, 0xc0, 0x6a, 0x30, 0xb1, 0x04, 0x49, 0x88, 0x42, 0x18, 0xbf, + 0xff, 0xf7, 0xfc, 0xf8, 0x00, 0x20, 0xe0, 0x62, 0x10, 0xbd, 0x00, 0xbf, + 0x00, 0xff, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x43, 0x19, 0x48, 0x1a, 0x4c, + 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x19, 0x4e, 0xdf, 0xf8, 0x64, 0x90, + 0x00, 0x27, 0x04, 0xf1, 0x2c, 0x05, 0x04, 0xf2, 0xfe, 0x38, 0xc4, 0xf8, + 0x40, 0x77, 0x84, 0xf8, 0x00, 0x74, 0x84, 0xf8, 0x5b, 0x77, 0x07, 0xeb, + 0x87, 0x00, 0x31, 0x69, 0x04, 0xeb, 0x00, 0x10, 0x2c, 0x30, 0x88, 0x42, + 0x06, 0xd0, 0xf1, 0x68, 0x88, 0x42, 0x03, 0xd0, 0xd9, 0xf8, 0x00, 0x10, + 0x28, 0x46, 0x88, 0x47, 0x01, 0x37, 0x50, 0x35, 0x0b, 0x2f, 0xec, 0xd1, + 0x0a, 0x48, 0x00, 0x68, 0x80, 0x47, 0x00, 0x20, 0x88, 0xf8, 0x04, 0x00, + 0x88, 0xf8, 0x03, 0x00, 0x02, 0x20, 0xa8, 0xf8, 0x00, 0x00, 0xbd, 0xe8, + 0xf8, 0x83, 0x00, 0xbf, 0x30, 0xa8, 0x08, 0x00, 0xf8, 0xf5, 0x01, 0x00, + 0x78, 0xfe, 0x01, 0x00, 0x8c, 0xa4, 0x08, 0x00, 0xc0, 0xa4, 0x08, 0x00, + 0x06, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x07, 0x49, 0x01, 0x60, + 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, + 0x70, 0x47, 0x00, 0xbf, 0x9c, 0xa6, 0x08, 0x00, 0xf9, 0x79, 0x02, 0x00, + 0x9c, 0x9e, 0x08, 0x00, 0x91, 0x78, 0x02, 0x00, 0x8c, 0xa4, 0x08, 0x00, + 0xf1, 0x7a, 0x02, 0x00, 0x40, 0xa8, 0x08, 0x00, 0x11, 0x7b, 0x02, 0x00, + 0x43, 0xf2, 0x39, 0x0c, 0xc1, 0xf2, 0x00, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x2d, 0xe9, 0xf8, 0x43, 0x07, 0x46, 0x42, 0x28, 0x04, 0xd3, 0x00, 0x20, + 0xb0, 0x21, 0xff, 0xf7, 0x6b, 0xf8, 0x41, 0x27, 0x4f, 0x4d, 0x50, 0x4e, + 0x28, 0x78, 0x30, 0x44, 0x90, 0xf8, 0x01, 0x04, 0x06, 0x28, 0x3d, 0xd1, + 0x4d, 0x48, 0x00, 0x68, 0x80, 0x47, 0x04, 0x46, 0x28, 0x78, 0x59, 0x49, + 0x30, 0x44, 0x09, 0x68, 0x90, 0xf8, 0x01, 0x04, 0x88, 0x47, 0xdf, 0xf8, + 0x24, 0x81, 0x06, 0x46, 0x45, 0x46, 0x15, 0xf8, 0x11, 0x0f, 0x80, 0xb3, + 0x4f, 0xf6, 0xff, 0x70, 0x84, 0x42, 0x2c, 0xd0, 0x44, 0x48, 0x01, 0x68, + 0x20, 0x46, 0x88, 0x47, 0x58, 0xb1, 0x81, 0x46, 0xc0, 0x78, 0x07, 0xeb, + 0x47, 0x02, 0xc1, 0x1c, 0xc8, 0xb2, 0x82, 0x42, 0x25, 0xd2, 0x3f, 0x48, + 0x01, 0x68, 0x48, 0x46, 0x88, 0x47, 0x00, 0x20, 0x28, 0x72, 0xe8, 0x71, + 0xa8, 0x71, 0x28, 0x78, 0xc8, 0xb1, 0x3b, 0x48, 0x00, 0x68, 0x80, 0x47, + 0xa8, 0xb1, 0x2f, 0x78, 0xf0, 0xb2, 0x87, 0x42, 0x24, 0xd9, 0xb7, 0xeb, + 0x40, 0x0f, 0xae, 0x71, 0x4a, 0xd9, 0xa7, 0xeb, 0x46, 0x00, 0xee, 0x71, + 0x28, 0x72, 0x49, 0xe0, 0x38, 0x46, 0xbd, 0xe8, 0xf8, 0x43, 0x00, 0xf0, + 0x9b, 0xba, 0x00, 0x20, 0xe8, 0x71, 0x28, 0x72, 0xa8, 0x71, 0xbd, 0xe8, + 0xf8, 0x83, 0xf2, 0xb2, 0x90, 0x42, 0x08, 0xd9, 0xb0, 0xeb, 0x42, 0x0f, + 0xae, 0x71, 0x0d, 0xd9, 0xa1, 0xeb, 0x46, 0x00, 0xee, 0x71, 0x28, 0x72, + 0x0c, 0xe0, 0x00, 0x20, 0xa9, 0x71, 0x28, 0x72, 0xe8, 0x71, 0x08, 0xe0, + 0x00, 0x20, 0xaf, 0x71, 0x28, 0x72, 0x28, 0xe0, 0x00, 0x20, 0x28, 0x72, + 0x88, 0x1b, 0xe8, 0x71, 0x31, 0x46, 0x09, 0xf1, 0x01, 0x04, 0xcb, 0xb2, + 0x08, 0xf5, 0xce, 0x70, 0x44, 0x21, 0x22, 0x46, 0xf9, 0xf7, 0xa6, 0xf9, + 0xeb, 0x79, 0x3b, 0xb1, 0xa8, 0x79, 0x44, 0x21, 0x04, 0x44, 0x08, 0xf5, + 0xf0, 0x70, 0x22, 0x46, 0xf9, 0xf7, 0x9c, 0xf9, 0x2b, 0x7a, 0x33, 0xb1, + 0xe8, 0x79, 0x44, 0x21, 0x22, 0x18, 0x08, 0xf5, 0x09, 0x70, 0xf9, 0xf7, + 0x93, 0xf9, 0x48, 0x46, 0xbd, 0xe8, 0xf8, 0x43, 0xfe, 0xf7, 0xfc, 0xbf, + 0x00, 0x20, 0x28, 0x72, 0xb8, 0x1b, 0xe8, 0x71, 0x08, 0xf5, 0xce, 0x70, + 0xcc, 0x21, 0xfb, 0xf7, 0x19, 0xfb, 0xf8, 0x1e, 0x88, 0xf8, 0x9c, 0x41, + 0x88, 0xf8, 0x9e, 0x01, 0x20, 0x0a, 0x88, 0xf8, 0x9d, 0x01, 0xbd, 0xe8, + 0xf8, 0x83, 0x00, 0xbf, 0x8d, 0xfe, 0x01, 0x00, 0xf8, 0xf5, 0x01, 0x00, + 0xa8, 0xa8, 0x08, 0x00, 0xfc, 0x37, 0x01, 0x00, 0xac, 0xa8, 0x08, 0x00, + 0xa4, 0xa8, 0x08, 0x00, 0xb0, 0xa8, 0x08, 0x00, 0x80, 0xb5, 0x00, 0xf0, + 0x3b, 0xfa, 0xa3, 0x48, 0xa3, 0x49, 0x00, 0x78, 0x08, 0x44, 0x90, 0xf8, + 0x01, 0x04, 0x06, 0x28, 0x05, 0xd1, 0x03, 0x48, 0x01, 0x68, 0x06, 0x20, + 0x88, 0x47, 0x45, 0x49, 0x48, 0x74, 0x80, 0xbd, 0xac, 0xa4, 0x08, 0x00, + 0x2d, 0xe9, 0xf8, 0x43, 0x04, 0x46, 0x99, 0x48, 0x99, 0x49, 0x00, 0x78, + 0x08, 0x44, 0x90, 0xf8, 0x01, 0x04, 0x06, 0x28, 0x03, 0xd1, 0xb9, 0x48, + 0xc0, 0x68, 0xa0, 0x42, 0x04, 0xd0, 0x20, 0x46, 0xbd, 0xe8, 0xf8, 0x43, + 0x00, 0xf0, 0x1c, 0xba, 0xdf, 0xf8, 0xe0, 0x80, 0x01, 0x20, 0x94, 0xf8, + 0x00, 0x90, 0x20, 0x70, 0x46, 0x46, 0x16, 0xf8, 0x11, 0x0f, 0x00, 0x28, + 0x54, 0xd0, 0x34, 0x48, 0x34, 0x4b, 0xdf, 0xf8, 0xd4, 0xc0, 0x00, 0x25, + 0x72, 0xb6, 0x01, 0x68, 0x49, 0x00, 0x01, 0x31, 0x01, 0x60, 0xb1, 0x78, + 0x03, 0xeb, 0xc5, 0x02, 0x2f, 0x46, 0x12, 0x79, 0x92, 0x07, 0x0e, 0xd5, + 0x53, 0xf8, 0x37, 0x50, 0x5d, 0xb1, 0x2a, 0x68, 0x4a, 0xb1, 0x92, 0xf8, + 0x0a, 0x21, 0x92, 0x07, 0x05, 0xd5, 0x3c, 0xf8, 0x17, 0x20, 0xed, 0x8a, + 0x95, 0x42, 0x00, 0xd0, 0xc1, 0xb3, 0x01, 0x25, 0x00, 0x2f, 0xe7, 0xd0, + 0x01, 0x68, 0x49, 0x08, 0x01, 0x60, 0x00, 0x68, 0x80, 0xf3, 0x10, 0x88, + 0xb0, 0x78, 0x03, 0x28, 0x1d, 0xd2, 0x08, 0xeb, 0x00, 0x01, 0xca, 0x7d, + 0xca, 0xb1, 0x00, 0xeb, 0x00, 0x10, 0x08, 0xeb, 0x80, 0x00, 0x00, 0xf5, + 0xce, 0x71, 0x96, 0x48, 0x03, 0x68, 0x20, 0x46, 0x98, 0x47, 0xb0, 0x78, + 0x01, 0x30, 0xc1, 0xb2, 0xb0, 0x70, 0x03, 0x29, 0x03, 0xd0, 0x58, 0xfa, + 0x80, 0xf0, 0xc0, 0x7d, 0x80, 0xb9, 0x00, 0x20, 0x30, 0x72, 0xb0, 0x70, + 0xf0, 0x71, 0xb0, 0x71, 0x0a, 0xe0, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, + 0x30, 0x72, 0xb0, 0x70, 0xf0, 0x71, 0xb0, 0x71, 0x0e, 0x48, 0x03, 0x68, + 0x20, 0x46, 0x98, 0x47, 0x84, 0xf8, 0x00, 0x90, 0xbd, 0xe8, 0xf8, 0x83, + 0x2c, 0xf8, 0x17, 0x50, 0x01, 0x68, 0x49, 0x08, 0x01, 0x60, 0xc7, 0x49, + 0x00, 0x68, 0x80, 0xf3, 0x10, 0x88, 0xe0, 0x89, 0x09, 0x68, 0x88, 0x47, + 0xc2, 0xe7, 0x00, 0xbf, 0xfc, 0x37, 0x01, 0x00, 0x24, 0x36, 0x01, 0x00, + 0x3c, 0x4c, 0x01, 0x00, 0x12, 0xde, 0x05, 0x00, 0xbc, 0xa4, 0x08, 0x00, + 0x2d, 0xe9, 0xf8, 0x4f, 0x05, 0x46, 0x51, 0x48, 0x0c, 0x46, 0x51, 0x49, + 0x00, 0x78, 0x08, 0x44, 0x90, 0xf8, 0x01, 0x04, 0x06, 0x28, 0x03, 0xd1, + 0x70, 0x48, 0x00, 0x69, 0xa0, 0x42, 0x05, 0xd0, 0x28, 0x46, 0x21, 0x46, + 0xbd, 0xe8, 0xf8, 0x4f, 0x00, 0xf0, 0x90, 0xb9, 0x49, 0x4e, 0xb0, 0x7c, + 0x06, 0xf1, 0x11, 0x07, 0x02, 0x28, 0x77, 0xd8, 0xe2, 0x69, 0x31, 0x18, + 0x00, 0x28, 0x0a, 0x75, 0x57, 0xd0, 0x39, 0x78, 0x00, 0x29, 0x6f, 0xd0, + 0xf9, 0x78, 0x3a, 0x79, 0x7b, 0x79, 0x11, 0x44, 0xca, 0x18, 0x98, 0x49, + 0xb1, 0xf8, 0x56, 0x35, 0x04, 0x3b, 0x9a, 0x42, 0x64, 0xdc, 0xb3, 0x7f, + 0x03, 0x33, 0x93, 0x42, 0x6c, 0xd1, 0x01, 0xf2, 0x54, 0x59, 0x93, 0x48, + 0x99, 0xf8, 0x00, 0x10, 0x00, 0xf5, 0x28, 0x70, 0x01, 0xf0, 0x01, 0x01, + 0xfd, 0xf7, 0xd4, 0xf9, 0x00, 0x28, 0x53, 0xd0, 0x80, 0x46, 0x00, 0x20, + 0xdf, 0xf8, 0xd4, 0xa0, 0x06, 0xf1, 0x1c, 0x02, 0x88, 0xf8, 0x00, 0x00, + 0x08, 0xf1, 0x01, 0x00, 0xb9, 0xf8, 0x02, 0x10, 0xfb, 0x78, 0x01, 0x39, + 0xd0, 0x47, 0xf8, 0x78, 0xb9, 0xf8, 0x02, 0x10, 0x3b, 0x79, 0x00, 0xf1, + 0x01, 0x0b, 0x5f, 0xfa, 0x8b, 0xf2, 0x58, 0xfa, 0x8b, 0xf0, 0x89, 0x1a, + 0x06, 0xf1, 0x9c, 0x02, 0xd0, 0x47, 0x38, 0x79, 0xb9, 0xf8, 0x02, 0x20, + 0x7b, 0x79, 0x83, 0x44, 0x5f, 0xfa, 0x8b, 0xf1, 0x58, 0xfa, 0x8b, 0xf0, + 0x51, 0x1a, 0x06, 0xf5, 0x8e, 0x72, 0xd0, 0x47, 0x78, 0x79, 0x98, 0xf8, + 0x03, 0x10, 0x58, 0x44, 0x04, 0x31, 0xc0, 0xb2, 0x81, 0x42, 0x2f, 0xd1, + 0x1e, 0x48, 0x00, 0xf1, 0x30, 0x01, 0x40, 0x46, 0xfb, 0xf7, 0x26, 0xfa, + 0x1a, 0xe0, 0x19, 0x48, 0x96, 0xf8, 0x1e, 0x80, 0x01, 0x68, 0xb0, 0x8b, + 0x88, 0x47, 0x60, 0xb1, 0x6c, 0x48, 0xb0, 0xf8, 0x56, 0x05, 0x01, 0x38, + 0x40, 0x45, 0x06, 0xdd, 0xb8, 0xf1, 0x00, 0x0f, 0x03, 0xd0, 0x78, 0x78, + 0x01, 0x30, 0x78, 0x70, 0x00, 0xe0, 0x78, 0x78, 0xc1, 0xb2, 0x02, 0x29, + 0x02, 0xd8, 0x01, 0x06, 0x8d, 0xd1, 0xff, 0xe7, 0x00, 0x20, 0x78, 0x71, + 0xa7, 0xf8, 0x03, 0x00, 0x78, 0x70, 0x7b, 0x48, 0x21, 0x46, 0x02, 0x68, + 0x28, 0x46, 0xbd, 0xe8, 0xf8, 0x4f, 0x10, 0x47, 0x01, 0x30, 0xf5, 0xe7, + 0x40, 0x46, 0xfe, 0xf7, 0x91, 0xfe, 0xed, 0xe7, 0x8d, 0xfe, 0x01, 0x00, + 0xf8, 0xf5, 0x01, 0x00, 0xfc, 0x37, 0x01, 0x00, 0xa8, 0xa4, 0x08, 0x00, + 0x4d, 0xcd, 0x11, 0x10, 0x2c, 0xba, 0x01, 0x00, 0x10, 0xb5, 0x1b, 0x48, + 0x0c, 0x46, 0x02, 0x68, 0x08, 0x46, 0x00, 0x21, 0x90, 0x47, 0x48, 0xb3, + 0x18, 0x48, 0x90, 0xf8, 0x06, 0x11, 0x01, 0x29, 0x03, 0xd1, 0x17, 0x49, + 0x49, 0x68, 0xa1, 0x42, 0x1a, 0xd0, 0x16, 0x48, 0x01, 0x78, 0x01, 0x29, + 0x05, 0xd1, 0x13, 0x49, 0x09, 0x68, 0xa1, 0x42, 0x04, 0xbf, 0x00, 0x21, + 0x01, 0x70, 0x94, 0xf8, 0x20, 0x00, 0x38, 0xb1, 0x10, 0x48, 0x00, 0x21, + 0x00, 0x22, 0x03, 0x68, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x18, 0x47, + 0x55, 0x48, 0x01, 0x68, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x08, 0x47, + 0x90, 0xf8, 0x07, 0x11, 0x19, 0xb1, 0x00, 0x21, 0x80, 0xf8, 0x06, 0x11, + 0x10, 0xbd, 0x07, 0x48, 0x00, 0x68, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0x47, + 0xa0, 0xa4, 0x08, 0x00, 0xec, 0x36, 0x01, 0x00, 0x78, 0xfe, 0x01, 0x00, + 0x10, 0xde, 0x05, 0x00, 0xac, 0xa6, 0x08, 0x00, 0x9c, 0xa6, 0x08, 0x00, + 0xf8, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x08, 0x79, 0x2d, 0x49, 0x0a, 0x78, + 0x02, 0xf0, 0xfe, 0x02, 0x02, 0x2a, 0x08, 0xbf, 0x5f, 0xea, 0x00, 0x72, + 0x48, 0xd0, 0x00, 0x07, 0x05, 0xd0, 0x20, 0x46, 0x29, 0x46, 0xbd, 0xe8, + 0xf8, 0x40, 0x00, 0xf0, 0xa1, 0xb8, 0xd4, 0xf8, 0x40, 0x07, 0x18, 0xb9, + 0x24, 0x48, 0x00, 0x68, 0xc4, 0xf8, 0x40, 0x07, 0x23, 0x4f, 0xb4, 0xf8, + 0x3c, 0x17, 0xb7, 0xf8, 0xb6, 0x04, 0x81, 0x42, 0x0e, 0xd2, 0x21, 0x48, + 0x90, 0xf8, 0x2a, 0x10, 0x51, 0xb1, 0x97, 0xf8, 0xb4, 0x14, 0x20, 0x30, + 0x01, 0xf0, 0x01, 0x01, 0xfd, 0xf7, 0xee, 0xf8, 0x10, 0xb1, 0x06, 0x46, + 0x1b, 0x48, 0x0c, 0xe0, 0x19, 0x48, 0x80, 0x7a, 0x18, 0xb3, 0x97, 0xf8, + 0xac, 0x04, 0x00, 0xf0, 0x01, 0x01, 0x16, 0x48, 0xfd, 0xf7, 0xe0, 0xf8, + 0xd8, 0xb1, 0x06, 0x46, 0x15, 0x48, 0xc4, 0xf8, 0x68, 0x07, 0xe9, 0x6a, + 0x31, 0xb1, 0x00, 0x20, 0x40, 0xf2, 0x7d, 0x21, 0xf8, 0xf7, 0x78, 0xff, + 0xd4, 0xf8, 0x68, 0x07, 0xee, 0x62, 0x01, 0x78, 0x01, 0x31, 0x01, 0x70, + 0x0e, 0x48, 0xb4, 0xf8, 0x3c, 0x17, 0x02, 0x68, 0x30, 0x46, 0xbd, 0xe8, + 0xf8, 0x40, 0x10, 0x47, 0x03, 0x20, 0x08, 0x70, 0xf8, 0xbd, 0x0a, 0x48, + 0x00, 0xf0, 0x60, 0xf8, 0x09, 0x48, 0x00, 0xf0, 0x5d, 0xf8, 0xfe, 0xe7, + 0xc1, 0xf0, 0x05, 0x00, 0xa8, 0xa6, 0x08, 0x00, 0x8c, 0x7e, 0x08, 0x00, + 0x68, 0x8a, 0x01, 0x00, 0x01, 0x62, 0x01, 0x00, 0x00, 0x62, 0x01, 0x00, + 0xd8, 0xa4, 0x08, 0x00, 0x00, 0x82, 0x02, 0x00, 0x08, 0x82, 0x02, 0x00, + 0x09, 0x48, 0x0a, 0x49, 0x01, 0x60, 0x0a, 0x48, 0x0a, 0x49, 0x41, 0x60, + 0x0a, 0x48, 0x0b, 0x49, 0x01, 0x60, 0x0b, 0x48, 0x0b, 0x49, 0x01, 0x60, + 0x0b, 0x48, 0x0c, 0x49, 0x01, 0x60, 0x0c, 0x48, 0x0c, 0x49, 0x01, 0x60, + 0x70, 0x47, 0x00, 0xbf, 0xb8, 0xa4, 0x08, 0x00, 0xd9, 0x7b, 0x02, 0x00, + 0x98, 0x02, 0x01, 0x00, 0xf5, 0x7f, 0x02, 0x00, 0xb4, 0xa6, 0x08, 0x00, + 0x71, 0x7d, 0x02, 0x00, 0xb0, 0xa6, 0x08, 0x00, 0x91, 0x7e, 0x02, 0x00, + 0xb0, 0xa4, 0x08, 0x00, 0x49, 0x7d, 0x02, 0x00, 0xa4, 0xa6, 0x08, 0x00, + 0x7d, 0x80, 0x02, 0x00, 0x43, 0xf2, 0x51, 0x4c, 0xc1, 0xf2, 0x03, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x43, 0xf2, 0x7d, 0x0c, 0xc1, 0xf2, 0x03, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x43, 0xf6, 0x21, 0x0c, 0xc1, 0xf2, 0x03, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x42, 0xf6, 0x49, 0x3c, 0xc1, 0xf2, 0x03, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x42, 0xf6, 0xf5, 0x1c, 0xc1, 0xf2, 0x03, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4b, 0xf2, 0x59, 0x3c, 0xc1, 0xf2, 0x12, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x55, 0x53, 0x42, 0x5f, 0x41, 0x3a, 0x20, 0x00, + 0x55, 0x53, 0x42, 0x3a, 0x20, 0x4e, 0x6f, 0x20, 0x42, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x43, 0x4d, 0x44, 0x21, 0x00, + 0x10, 0xb5, 0x06, 0x48, 0x04, 0x68, 0x00, 0xf0, 0x27, 0xf8, 0x60, 0x06, + 0x58, 0xbf, 0x10, 0xbd, 0x03, 0x48, 0x01, 0x68, 0x07, 0x48, 0xbd, 0xe8, + 0x10, 0x40, 0x08, 0x47, 0x14, 0x00, 0x00, 0x54, 0x2c, 0xa0, 0x08, 0x00, + 0x03, 0x48, 0x90, 0xf8, 0x5b, 0x07, 0x08, 0xb1, 0x00, 0xf0, 0x1a, 0xb8, + 0x00, 0x20, 0x70, 0x47, 0xf8, 0xf5, 0x01, 0x00, 0x03, 0x48, 0x04, 0x49, + 0x01, 0x60, 0x04, 0x48, 0x04, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0x5c, 0xa9, 0x08, 0x00, 0x45, 0x82, 0x02, 0x00, 0x44, 0xa9, 0x08, 0x00, + 0x21, 0x82, 0x02, 0x00, 0x46, 0xf2, 0xdd, 0x0c, 0xc1, 0xf2, 0x03, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x46, 0xf2, 0x9d, 0x4c, 0xc1, 0xf2, 0x03, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x70, 0x47, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x46, + 0x0c, 0x20, 0x00, 0xf0, 0x25, 0xf8, 0x20, 0x46, 0x00, 0xf0, 0x56, 0xf8, + 0xc4, 0x4e, 0xc5, 0x4d, 0x04, 0xeb, 0x44, 0x04, 0x31, 0x78, 0x01, 0xeb, + 0x41, 0x00, 0x05, 0xeb, 0x40, 0x10, 0x50, 0xf8, 0x24, 0x00, 0x60, 0xb1, + 0xfe, 0xf7, 0x1e, 0xfd, 0x31, 0x78, 0x00, 0x22, 0x01, 0xeb, 0x41, 0x00, + 0x05, 0xeb, 0x40, 0x10, 0x40, 0xf8, 0x24, 0x20, 0x00, 0xeb, 0x84, 0x00, + 0x42, 0x60, 0x01, 0xeb, 0x41, 0x00, 0x00, 0x21, 0x05, 0xeb, 0x40, 0x10, + 0x00, 0xeb, 0x84, 0x00, 0x41, 0x72, 0x70, 0xbd, 0xf0, 0xb5, 0xdf, 0xf8, + 0x58, 0xc0, 0x16, 0x4d, 0xb2, 0x4e, 0xbc, 0xf8, 0x00, 0x20, 0x02, 0xeb, + 0xc2, 0x04, 0x05, 0xf8, 0x24, 0x00, 0x05, 0xeb, 0x84, 0x00, 0xad, 0x4c, + 0x00, 0xf1, 0x08, 0x0e, 0x24, 0x78, 0x04, 0xeb, 0x44, 0x04, 0x65, 0x01, + 0x06, 0xeb, 0x44, 0x14, 0x75, 0x59, 0x23, 0x6b, 0xa6, 0x69, 0x67, 0x6a, + 0x45, 0x60, 0xe5, 0x68, 0xae, 0xe8, 0xe0, 0x00, 0x43, 0x61, 0xe3, 0x6b, + 0x41, 0x70, 0x08, 0x49, 0x83, 0x61, 0xa3, 0x6c, 0xc3, 0x61, 0x09, 0x68, + 0x01, 0x62, 0x50, 0x1c, 0x00, 0xf0, 0x1d, 0x00, 0xac, 0xf8, 0x00, 0x00, + 0xf0, 0xbd, 0x00, 0xbf, 0x16, 0xde, 0x05, 0x00, 0x18, 0xde, 0x05, 0x00, + 0x24, 0x20, 0x00, 0x40, 0x01, 0x38, 0x06, 0x28, 0x2d, 0xd8, 0xdf, 0xe8, + 0x00, 0xf0, 0x04, 0x0b, 0x12, 0x19, 0x2c, 0x2c, 0x20, 0x00, 0x21, 0x48, + 0x00, 0x21, 0x01, 0x60, 0x20, 0x48, 0x01, 0x60, 0x20, 0x48, 0x1a, 0xe0, + 0x1a, 0x48, 0x00, 0x21, 0x01, 0x60, 0x1a, 0x48, 0x01, 0x60, 0x1a, 0x48, + 0x13, 0xe0, 0x14, 0x48, 0x00, 0x21, 0x01, 0x60, 0x13, 0x48, 0x01, 0x60, + 0x13, 0x48, 0x0c, 0xe0, 0x0d, 0x48, 0x00, 0x21, 0x01, 0x60, 0x0d, 0x48, + 0x01, 0x60, 0x0d, 0x48, 0x05, 0xe0, 0x06, 0x48, 0x00, 0x21, 0x01, 0x60, + 0x05, 0x48, 0x01, 0x60, 0x05, 0x48, 0x01, 0x60, 0x05, 0x48, 0x01, 0x68, + 0x21, 0xf0, 0x7f, 0x61, 0x01, 0x60, 0x70, 0x47, 0x80, 0x80, 0x21, 0x40, + 0x84, 0x80, 0x21, 0x40, 0x88, 0x80, 0x21, 0x40, 0x08, 0x00, 0x2c, 0x40, + 0x1c, 0x80, 0x21, 0x40, 0x4c, 0x80, 0x21, 0x40, 0x3c, 0x80, 0x21, 0x40, + 0x18, 0x80, 0x21, 0x40, 0x48, 0x80, 0x21, 0x40, 0x38, 0x80, 0x21, 0x40, + 0x14, 0x80, 0x21, 0x40, 0x44, 0x80, 0x21, 0x40, 0x34, 0x80, 0x21, 0x40, + 0x10, 0x80, 0x21, 0x40, 0x40, 0x80, 0x21, 0x40, 0x30, 0x80, 0x21, 0x40, + 0x2d, 0xe9, 0xf8, 0x4f, 0xab, 0x48, 0x05, 0x68, 0xa9, 0x48, 0xd0, 0xf8, + 0x00, 0x90, 0x6b, 0x48, 0x04, 0x68, 0x0e, 0x20, 0x21, 0x46, 0xff, 0xf7, + 0x6d, 0xff, 0xe0, 0x07, 0x5f, 0xd0, 0xc4, 0xf3, 0x02, 0x16, 0x00, 0x2e, + 0x5b, 0xd0, 0xdf, 0xf8, 0x98, 0xb1, 0xdf, 0xf8, 0x98, 0x81, 0xdf, 0xf8, + 0x98, 0xa1, 0x06, 0xeb, 0x46, 0x01, 0x72, 0xb6, 0xdb, 0xf8, 0x00, 0x00, + 0x40, 0x00, 0x01, 0x30, 0xcb, 0xf8, 0x00, 0x00, 0x98, 0xf8, 0x00, 0x00, + 0x00, 0xeb, 0x40, 0x00, 0x0a, 0xeb, 0x40, 0x10, 0x00, 0xeb, 0x81, 0x00, + 0x42, 0x68, 0x1a, 0xb1, 0x5f, 0xfa, 0x89, 0xf1, 0x30, 0x46, 0x90, 0x47, + 0x0f, 0x20, 0x31, 0x46, 0xff, 0xf7, 0x46, 0xff, 0x98, 0xf8, 0x00, 0x00, + 0x06, 0xeb, 0x46, 0x07, 0x00, 0xeb, 0x40, 0x00, 0x0a, 0xeb, 0x40, 0x10, + 0x50, 0xf8, 0x27, 0x00, 0xc0, 0xb1, 0x30, 0x46, 0xff, 0xf7, 0x6c, 0xff, + 0x98, 0xf8, 0x00, 0x00, 0x00, 0xeb, 0x40, 0x00, 0x0a, 0xeb, 0x40, 0x10, + 0x50, 0xf8, 0x27, 0x00, 0xfe, 0xf7, 0x38, 0xfc, 0x98, 0xf8, 0x00, 0x00, + 0x00, 0x21, 0x00, 0xeb, 0x40, 0x00, 0x0a, 0xeb, 0x40, 0x10, 0x40, 0xf8, + 0x27, 0x10, 0x00, 0xeb, 0x87, 0x00, 0x41, 0x60, 0xdb, 0xf8, 0x00, 0x00, + 0x29, 0x46, 0x40, 0x08, 0xcb, 0xf8, 0x00, 0x00, 0xdb, 0xf8, 0x00, 0x00, + 0x80, 0xf3, 0x10, 0x88, 0x10, 0x20, 0xff, 0xf7, 0x15, 0xff, 0x98, 0xf8, + 0x00, 0x00, 0x00, 0x21, 0x00, 0xeb, 0x40, 0x00, 0x0a, 0xeb, 0x40, 0x10, + 0x00, 0xeb, 0x87, 0x00, 0x41, 0x72, 0xc5, 0xf3, 0x02, 0x15, 0x00, 0x2d, + 0x5c, 0xd0, 0x11, 0x20, 0x29, 0x46, 0xff, 0xf7, 0x03, 0xff, 0xa2, 0x4e, + 0xdf, 0xf8, 0xd0, 0xa0, 0xdf, 0xf8, 0xd0, 0x80, 0x05, 0xeb, 0x45, 0x01, + 0x72, 0xb6, 0x30, 0x68, 0x40, 0x00, 0x01, 0x30, 0x30, 0x60, 0x9a, 0xf8, + 0x00, 0x00, 0x00, 0xeb, 0x40, 0x00, 0x08, 0xeb, 0x40, 0x10, 0x00, 0xeb, + 0x81, 0x00, 0x42, 0x68, 0x1a, 0xb1, 0x5f, 0xfa, 0x89, 0xf1, 0x28, 0x46, + 0x90, 0x47, 0x12, 0x20, 0x29, 0x46, 0xff, 0xf7, 0xe5, 0xfe, 0x9a, 0xf8, + 0x00, 0x00, 0x05, 0xeb, 0x45, 0x07, 0x00, 0xeb, 0x40, 0x00, 0x08, 0xeb, + 0x40, 0x10, 0x50, 0xf8, 0x27, 0x00, 0xc0, 0xb1, 0x28, 0x46, 0xff, 0xf7, + 0x0b, 0xff, 0x9a, 0xf8, 0x00, 0x00, 0x00, 0xeb, 0x40, 0x00, 0x08, 0xeb, + 0x40, 0x10, 0x50, 0xf8, 0x27, 0x00, 0xfe, 0xf7, 0xd7, 0xfb, 0x9a, 0xf8, + 0x00, 0x00, 0x00, 0x21, 0x00, 0xeb, 0x40, 0x00, 0x08, 0xeb, 0x40, 0x10, + 0x40, 0xf8, 0x27, 0x10, 0x00, 0xeb, 0x87, 0x00, 0x41, 0x60, 0x30, 0x68, + 0x29, 0x46, 0x40, 0x08, 0x30, 0x60, 0x30, 0x68, 0x80, 0xf3, 0x10, 0x88, + 0x13, 0x20, 0xff, 0xf7, 0xb7, 0xfe, 0x9a, 0xf8, 0x00, 0x00, 0x4d, 0x49, + 0x01, 0x22, 0x00, 0xeb, 0x40, 0x00, 0x0a, 0x60, 0x00, 0x21, 0x08, 0xeb, + 0x40, 0x10, 0x00, 0xeb, 0x87, 0x00, 0x41, 0x72, 0x0a, 0x48, 0x80, 0x21, + 0x01, 0x60, 0x47, 0x48, 0x01, 0x68, 0x0a, 0x20, 0x88, 0x47, 0x14, 0x20, + 0x21, 0x46, 0xbd, 0xe8, 0xf8, 0x4f, 0xff, 0xf7, 0x9d, 0xbe, 0x00, 0xbf, + 0x08, 0x80, 0x21, 0x40, 0x24, 0x36, 0x01, 0x00, 0x74, 0x87, 0x08, 0x00, + 0x78, 0xad, 0x01, 0x00, 0x14, 0x00, 0x21, 0x40, 0x2d, 0xe9, 0xf8, 0x43, + 0x36, 0x48, 0x06, 0x68, 0x36, 0x48, 0x04, 0x68, 0x15, 0x20, 0x31, 0x46, + 0xff, 0xf7, 0x88, 0xfe, 0xc4, 0xf3, 0x02, 0x25, 0x00, 0x2d, 0x57, 0xd0, + 0x62, 0x4f, 0xdf, 0xf8, 0xc8, 0x90, 0xdf, 0xf8, 0xc8, 0x80, 0x05, 0xeb, + 0x45, 0x01, 0x72, 0xb6, 0x38, 0x68, 0x40, 0x00, 0x01, 0x30, 0x38, 0x60, + 0x99, 0xf8, 0x00, 0x00, 0x00, 0xeb, 0x40, 0x00, 0x08, 0xeb, 0x40, 0x10, + 0x00, 0xeb, 0x81, 0x00, 0x42, 0x68, 0x12, 0xb1, 0xf1, 0xb2, 0x28, 0x46, + 0x90, 0x47, 0x16, 0x20, 0x29, 0x46, 0xff, 0xf7, 0x67, 0xfe, 0x99, 0xf8, + 0x00, 0x00, 0x05, 0xeb, 0x45, 0x06, 0x00, 0xeb, 0x40, 0x00, 0x08, 0xeb, + 0x40, 0x10, 0x50, 0xf8, 0x26, 0x00, 0xc0, 0xb1, 0x28, 0x46, 0xff, 0xf7, + 0x8d, 0xfe, 0x99, 0xf8, 0x00, 0x00, 0x00, 0xeb, 0x40, 0x00, 0x08, 0xeb, + 0x40, 0x10, 0x50, 0xf8, 0x26, 0x00, 0xfe, 0xf7, 0x59, 0xfb, 0x99, 0xf8, + 0x00, 0x00, 0x00, 0x21, 0x00, 0xeb, 0x40, 0x00, 0x08, 0xeb, 0x40, 0x10, + 0x40, 0xf8, 0x26, 0x10, 0x00, 0xeb, 0x86, 0x00, 0x41, 0x60, 0x38, 0x68, + 0x29, 0x46, 0x40, 0x08, 0x38, 0x60, 0x38, 0x68, 0x80, 0xf3, 0x10, 0x88, + 0x17, 0x20, 0xff, 0xf7, 0x39, 0xfe, 0x99, 0xf8, 0x00, 0x00, 0x0e, 0x49, + 0x01, 0x22, 0x00, 0xeb, 0x40, 0x00, 0x0a, 0x60, 0x00, 0x21, 0x08, 0xeb, + 0x40, 0x10, 0x00, 0xeb, 0x86, 0x00, 0x41, 0x72, 0x09, 0x48, 0x01, 0x68, + 0x0e, 0x20, 0x88, 0x47, 0x18, 0x20, 0x21, 0x46, 0xbd, 0xe8, 0xf8, 0x43, + 0xff, 0xf7, 0x22, 0xbe, 0x0c, 0x10, 0x2c, 0x40, 0x0c, 0x80, 0x21, 0x40, + 0x74, 0x87, 0x08, 0x00, 0x78, 0xad, 0x01, 0x00, 0x94, 0x80, 0x21, 0x40, + 0xb8, 0x9c, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x41, 0x1a, 0x20, 0xaa, 0x21, + 0xff, 0xf7, 0x10, 0xfe, 0x1a, 0x4b, 0x17, 0x49, 0x17, 0x4a, 0xdf, 0xf8, + 0x60, 0xc0, 0x1a, 0x4f, 0x01, 0x20, 0x00, 0x26, 0x01, 0x24, 0x9e, 0x46, + 0x16, 0x4b, 0x98, 0x46, 0x80, 0x23, 0x15, 0x68, 0x25, 0xf0, 0x01, 0x05, + 0x25, 0x43, 0x15, 0x60, 0x75, 0x46, 0x8c, 0xf8, 0x00, 0x40, 0xce, 0xf8, + 0x00, 0x00, 0xc8, 0xf8, 0x00, 0x60, 0x3e, 0x60, 0x08, 0x60, 0x08, 0x61, + 0x01, 0x3c, 0x45, 0x46, 0x4d, 0x69, 0x45, 0xf0, 0x80, 0x05, 0x4d, 0x61, + 0x8b, 0x61, 0x4d, 0x68, 0x25, 0xf0, 0x02, 0x05, 0x4d, 0x60, 0xe5, 0xb2, + 0x02, 0x2d, 0xe2, 0xd3, 0x1a, 0x20, 0x55, 0x21, 0xbd, 0xe8, 0xf0, 0x41, + 0xff, 0xf7, 0xe0, 0xbd, 0x00, 0x00, 0x21, 0x40, 0x04, 0x10, 0x00, 0x40, + 0x74, 0x87, 0x08, 0x00, 0x00, 0x80, 0x21, 0x40, 0x0c, 0x00, 0x2c, 0x40, + 0x10, 0x00, 0x2c, 0x40, 0x80, 0xb5, 0x00, 0xf0, 0x37, 0xf8, 0x09, 0x48, + 0x0c, 0x22, 0x72, 0xb6, 0x01, 0x68, 0x49, 0x00, 0x01, 0x31, 0x01, 0x60, + 0x06, 0x49, 0x0a, 0x70, 0x06, 0x49, 0x0a, 0x70, 0x01, 0x68, 0x49, 0x08, + 0x01, 0x60, 0x00, 0x68, 0x80, 0xf3, 0x10, 0x88, 0x80, 0xbd, 0x00, 0xbf, + 0x24, 0x36, 0x01, 0x00, 0x0a, 0xe4, 0x00, 0xe0, 0x0e, 0xe4, 0x00, 0xe0, + 0x06, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x07, 0x49, 0x01, 0x60, + 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, + 0x70, 0x47, 0x00, 0xbf, 0x08, 0xf4, 0x08, 0x00, 0xc5, 0x85, 0x02, 0x00, + 0x04, 0xf4, 0x08, 0x00, 0xf5, 0x83, 0x02, 0x00, 0x3c, 0x9f, 0x08, 0x00, + 0xbd, 0x86, 0x02, 0x00, 0x54, 0x8f, 0x08, 0x00, 0x41, 0x87, 0x02, 0x00, + 0x46, 0xf2, 0xe9, 0x6c, 0xc1, 0xf2, 0x11, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0xf8, 0xb5, 0x00, 0x28, 0x45, 0xd0, 0x04, 0x46, 0x22, 0x48, 0x0d, 0x46, + 0x00, 0x21, 0x16, 0x46, 0x00, 0xf5, 0xf8, 0x70, 0xfc, 0xf7, 0x6e, 0xfd, + 0x07, 0x46, 0x30, 0xb9, 0x1e, 0x48, 0x01, 0x68, 0x68, 0x1c, 0x80, 0xb2, + 0x88, 0x47, 0x07, 0x46, 0xf8, 0xb1, 0x57, 0xf8, 0x08, 0x0c, 0x3e, 0x70, + 0x22, 0x46, 0x2b, 0x46, 0x01, 0x89, 0x78, 0x1c, 0x01, 0x39, 0xf8, 0xf7, + 0x11, 0xfc, 0x17, 0x48, 0x00, 0xf5, 0x84, 0x71, 0x38, 0x46, 0xfa, 0xf7, + 0xe1, 0xfd, 0x85, 0x48, 0x00, 0x7d, 0xc0, 0x07, 0x04, 0xd1, 0x14, 0x48, + 0x00, 0x68, 0xbd, 0xe8, 0xf8, 0x40, 0x00, 0x47, 0x10, 0x49, 0x68, 0x1c, + 0x08, 0x85, 0xbd, 0xe8, 0xf8, 0x40, 0x02, 0xf0, 0xdd, 0xbf, 0x0f, 0x48, + 0x00, 0x21, 0x02, 0x22, 0x05, 0x68, 0x01, 0x20, 0x00, 0x90, 0x4a, 0x48, + 0xc3, 0x1c, 0x40, 0xf2, 0x23, 0x70, 0xa8, 0x47, 0x20, 0x78, 0x0e, 0x28, + 0x05, 0xd1, 0x00, 0x20, 0x94, 0x21, 0xbd, 0xe8, 0xf8, 0x40, 0xf8, 0xf7, + 0xd5, 0xbb, 0xf8, 0xbd, 0x68, 0x8a, 0x01, 0x00, 0x08, 0xb8, 0x08, 0x00, + 0x2c, 0xba, 0x01, 0x00, 0x48, 0xe4, 0x05, 0x00, 0x24, 0xaa, 0x08, 0x00, + 0xa0, 0xa0, 0x08, 0x00, 0x01, 0x46, 0x42, 0xf2, 0x35, 0x00, 0x0a, 0x1a, + 0x01, 0x20, 0x0d, 0x2a, 0x06, 0xd8, 0x00, 0xfa, 0x02, 0xf2, 0x43, 0xf2, + 0xd7, 0x03, 0x1a, 0x42, 0x00, 0xd0, 0x70, 0x47, 0x40, 0xf6, 0x14, 0x42, + 0x91, 0x42, 0xfa, 0xd0, 0x4f, 0xf6, 0x53, 0x52, 0x91, 0x42, 0xf6, 0xd0, + 0x4f, 0xf6, 0x57, 0x52, 0x91, 0x42, 0x1c, 0xbf, 0x00, 0x20, 0x70, 0x47, + 0x70, 0x47, 0x00, 0xbf, 0x10, 0xb5, 0x4a, 0x48, 0x01, 0x21, 0x46, 0x4c, + 0x72, 0xb6, 0x01, 0x70, 0x20, 0x68, 0x40, 0x00, 0x01, 0x30, 0x20, 0x60, + 0x46, 0x48, 0x00, 0x68, 0x80, 0x47, 0x20, 0x68, 0x40, 0x08, 0x20, 0x60, + 0x20, 0x68, 0x80, 0xf3, 0x10, 0x88, 0x10, 0xbd, 0x80, 0xb5, 0x00, 0xf0, + 0xd5, 0xf8, 0x25, 0x48, 0xb0, 0xf8, 0x6c, 0x15, 0x49, 0x06, 0x03, 0xd5, + 0x90, 0xf8, 0x72, 0x05, 0xff, 0x28, 0x00, 0xd0, 0x80, 0xbd, 0x0b, 0x48, + 0x00, 0x21, 0x02, 0x68, 0x0a, 0x20, 0x90, 0x47, 0x09, 0x48, 0x01, 0x21, + 0x01, 0x22, 0x03, 0x68, 0x0a, 0x20, 0x98, 0x47, 0x07, 0x48, 0x08, 0x49, + 0x02, 0x68, 0x01, 0x20, 0x90, 0x47, 0x49, 0x48, 0x01, 0x68, 0x41, 0xf0, + 0x30, 0x01, 0x01, 0x60, 0x80, 0xbd, 0x00, 0xbf, 0xd8, 0x9c, 0x08, 0x00, + 0xdc, 0x9c, 0x08, 0x00, 0xc4, 0x9c, 0x08, 0x00, 0xa9, 0x88, 0x02, 0x00, + 0x80, 0xb5, 0x0d, 0x48, 0x00, 0x78, 0x80, 0xb1, 0x0c, 0x48, 0x40, 0x6a, + 0x20, 0xb9, 0x0c, 0x48, 0x81, 0x21, 0x02, 0x68, 0x09, 0x20, 0x90, 0x47, + 0x0a, 0x48, 0xb0, 0xf8, 0x6c, 0x15, 0x49, 0x06, 0x03, 0xd5, 0x90, 0xf8, + 0x72, 0x05, 0xff, 0x28, 0x00, 0xd0, 0x80, 0xbd, 0x36, 0x48, 0x01, 0x68, + 0x21, 0xf0, 0x30, 0x01, 0x01, 0x60, 0x80, 0xbd, 0x1c, 0x3b, 0x01, 0x00, + 0x88, 0xea, 0x01, 0x00, 0x88, 0xa7, 0x08, 0x00, 0x8c, 0x7e, 0x08, 0x00, + 0xb0, 0xb5, 0x15, 0x4c, 0x2a, 0x4d, 0x72, 0xb6, 0x20, 0x68, 0x40, 0x00, + 0x01, 0x30, 0x20, 0x60, 0x12, 0x48, 0x01, 0x68, 0xa8, 0x7b, 0x88, 0x47, + 0x11, 0x49, 0x40, 0xb1, 0x11, 0x48, 0x01, 0x22, 0x02, 0x70, 0xa8, 0x7b, + 0x02, 0xfa, 0x00, 0xf0, 0x0a, 0x68, 0x10, 0x43, 0x09, 0xe0, 0x0d, 0x48, + 0x00, 0x22, 0x02, 0x70, 0xa8, 0x7b, 0x01, 0x22, 0x02, 0xfa, 0x00, 0xf0, + 0x0a, 0x68, 0x22, 0xea, 0x00, 0x00, 0x08, 0x60, 0x08, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x20, 0x68, 0x40, 0x08, 0x20, 0x60, 0x20, 0x68, 0x80, 0xf3, + 0x10, 0x88, 0xb0, 0xbd, 0x24, 0x36, 0x01, 0x00, 0x10, 0xff, 0x08, 0x00, + 0x54, 0xf4, 0x00, 0x30, 0x18, 0x3b, 0x01, 0x00, 0xa0, 0x9e, 0x08, 0x00, + 0x10, 0xb5, 0x10, 0x4c, 0xa0, 0x7b, 0x0d, 0x28, 0x88, 0xbf, 0x10, 0xbd, + 0x0e, 0x49, 0x0a, 0x68, 0x00, 0x21, 0x90, 0x47, 0x0d, 0x4a, 0xa0, 0x7b, + 0x01, 0x21, 0x13, 0x68, 0x81, 0x40, 0x0b, 0x43, 0x13, 0x60, 0x53, 0x68, + 0x23, 0xea, 0x01, 0x01, 0x51, 0x60, 0x09, 0x49, 0x33, 0xf0, 0x32, 0xff, + 0x08, 0x48, 0x01, 0x68, 0x41, 0xf0, 0x30, 0x01, 0x01, 0x60, 0xbd, 0xe8, + 0x10, 0x40, 0xff, 0xf7, 0xa9, 0xbf, 0x00, 0xbf, 0xdc, 0x2c, 0x06, 0x00, + 0x04, 0xff, 0x08, 0x00, 0x50, 0xf4, 0x00, 0x30, 0x71, 0x89, 0x02, 0x00, + 0x24, 0x40, 0x01, 0x30, 0x80, 0xb5, 0x00, 0xf0, 0x29, 0xf8, 0xbd, 0xe8, + 0x80, 0x40, 0xff, 0xf7, 0xcd, 0xbf, 0x00, 0xbf, 0x06, 0x48, 0x07, 0x49, + 0x01, 0x60, 0x07, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x08, 0x49, + 0x01, 0x60, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0x24, 0x9f, 0x08, 0x00, 0xd1, 0x88, 0x02, 0x00, 0xa8, 0xa2, 0x08, 0x00, + 0xc1, 0x87, 0x02, 0x00, 0x28, 0x9f, 0x08, 0x00, 0x29, 0x89, 0x02, 0x00, + 0x20, 0x9f, 0x08, 0x00, 0x35, 0x8a, 0x02, 0x00, 0x47, 0xf6, 0x95, 0x1c, + 0xc1, 0xf2, 0x03, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x47, 0xf2, 0x3d, 0x1c, + 0xc1, 0xf2, 0x03, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x02, 0xf0, 0x40, 0xbe, + 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, 0xb4, 0xa9, 0x08, 0x00, + 0x99, 0x8a, 0x02, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x11, 0xf8, 0x02, 0x48, + 0x02, 0x49, 0x01, 0x60, 0x80, 0xbd, 0x00, 0xbf, 0xd4, 0x40, 0x05, 0x30, + 0x00, 0x00, 0x01, 0x80, 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, + 0x58, 0xa4, 0x08, 0x00, 0xad, 0x8a, 0x02, 0x00, 0x41, 0xf2, 0xf1, 0x3c, + 0xc1, 0xf2, 0x00, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x70, 0x47, 0x00, 0x00, + 0x08, 0xb1, 0x00, 0xf0, 0x15, 0xb8, 0x05, 0x49, 0x91, 0xf8, 0x28, 0x20, + 0x01, 0x2a, 0x03, 0xd0, 0x91, 0xf8, 0x58, 0x10, 0x01, 0x29, 0xf4, 0xd1, + 0x00, 0x20, 0x70, 0x47, 0x4c, 0x49, 0x01, 0x00, 0x01, 0x48, 0x02, 0x49, + 0x01, 0x60, 0x70, 0x47, 0x50, 0x9c, 0x08, 0x00, 0xe5, 0x8a, 0x02, 0x00, + 0x41, 0xf2, 0x71, 0x6c, 0xc1, 0xf2, 0x00, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0xd4, 0x4a, 0x01, 0xeb, 0x41, 0x01, 0x02, 0xeb, 0xc1, 0x01, 0x89, 0x79, + 0x29, 0xb1, 0xc0, 0x43, 0x08, 0x44, 0xb0, 0xfa, 0x80, 0xf0, 0x40, 0x09, + 0x70, 0x47, 0x01, 0x20, 0x70, 0x47, 0x00, 0xbf, 0xb0, 0xb5, 0x04, 0x29, + 0x29, 0xd8, 0xdf, 0xe8, 0x01, 0xf0, 0x03, 0x18, 0x28, 0x03, 0x18, 0x00, + 0x42, 0x7e, 0x1e, 0x23, 0xc0, 0x7e, 0x14, 0x24, 0x01, 0xeb, 0x41, 0x01, + 0x02, 0xeb, 0x82, 0x02, 0x03, 0xeb, 0x82, 0x02, 0xd3, 0xb2, 0x13, 0xfb, + 0x00, 0x43, 0xc2, 0x4c, 0x24, 0xf8, 0x31, 0x30, 0x04, 0xeb, 0xc1, 0x01, + 0x08, 0x72, 0x4a, 0x72, 0xb0, 0xbd, 0x82, 0x7a, 0xc0, 0x7a, 0xbd, 0x4b, + 0x01, 0xeb, 0x41, 0x01, 0x42, 0xea, 0x00, 0x20, 0x00, 0xeb, 0x80, 0x02, + 0x04, 0x32, 0x23, 0xf8, 0x31, 0x20, 0x03, 0xeb, 0xc1, 0x01, 0x88, 0x80, + 0xb0, 0xbd, 0x03, 0x7c, 0xc2, 0x7b, 0x44, 0x7c, 0x85, 0x7c, 0x01, 0xeb, + 0x41, 0x01, 0x9b, 0x02, 0x43, 0xea, 0x82, 0x02, 0x42, 0xea, 0x84, 0x43, + 0x43, 0xea, 0x85, 0x63, 0x18, 0x44, 0xc3, 0x7c, 0x00, 0x7d, 0x80, 0x02, + 0x40, 0xea, 0x83, 0x00, 0x10, 0x44, 0xac, 0x4a, 0x0f, 0x30, 0x22, 0xf8, + 0x31, 0x00, 0xb0, 0xbd, 0x70, 0xb5, 0xa9, 0x49, 0x00, 0xeb, 0x40, 0x00, + 0x01, 0xeb, 0xc0, 0x04, 0x25, 0x69, 0x55, 0xb1, 0x68, 0x68, 0x08, 0xb1, + 0xfe, 0xf7, 0x8c, 0xf8, 0xae, 0x68, 0x28, 0x46, 0xfe, 0xf7, 0x88, 0xf8, + 0x00, 0x2e, 0x35, 0x46, 0xf4, 0xd1, 0x20, 0x46, 0x18, 0x21, 0xfa, 0xf7, + 0xa7, 0xfb, 0x70, 0xbd, 0x10, 0xb5, 0x00, 0x24, 0xe0, 0xb2, 0xff, 0xf7, + 0xe3, 0xff, 0x01, 0x34, 0xe0, 0xb2, 0x05, 0x28, 0xf8, 0xd1, 0x99, 0x48, + 0x80, 0x21, 0xfa, 0xf7, 0x99, 0xfb, 0x10, 0xbd, 0x96, 0x4a, 0x00, 0xeb, + 0x40, 0x00, 0x02, 0xeb, 0xc0, 0x00, 0x00, 0x69, 0x38, 0xb1, 0x00, 0x22, + 0xd3, 0xb2, 0x8b, 0x42, 0x04, 0xd0, 0x80, 0x68, 0x01, 0x32, 0x00, 0x28, + 0xf8, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x00, 0xbf, 0x2d, 0xe9, 0xf8, 0x43, + 0x8c, 0x49, 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, 0xc0, 0x00, 0x00, 0x69, + 0x40, 0x68, 0x81, 0x78, 0xc0, 0x78, 0x41, 0xea, 0x00, 0x29, 0xb9, 0xf1, + 0x00, 0x0f, 0x30, 0xd0, 0x00, 0x25, 0x33, 0x26, 0x00, 0x27, 0x4f, 0xf0, + 0x00, 0x08, 0x00, 0x24, 0xa1, 0xb2, 0xb1, 0xfb, 0xf6, 0xf1, 0x01, 0xfb, + 0x16, 0x42, 0x12, 0x04, 0x05, 0xd1, 0x48, 0x1c, 0xc1, 0xb2, 0x01, 0x20, + 0xff, 0xf7, 0xcc, 0xff, 0x40, 0x68, 0xb5, 0xfb, 0xf6, 0xf1, 0xa1, 0xeb, + 0x01, 0x21, 0x39, 0x44, 0x42, 0x5c, 0x7f, 0x2a, 0x09, 0xd1, 0x01, 0x44, + 0x89, 0x78, 0x01, 0x29, 0x03, 0xd0, 0x21, 0xb9, 0x48, 0xf0, 0x01, 0x08, + 0x01, 0xe0, 0x48, 0xf0, 0x02, 0x08, 0x01, 0x34, 0x01, 0x35, 0x05, 0x37, + 0xa1, 0xb2, 0x49, 0x45, 0xda, 0xd3, 0xb8, 0xf1, 0x03, 0x00, 0x18, 0xbf, + 0x12, 0x20, 0xbd, 0xe8, 0xf8, 0x83, 0x12, 0x20, 0xbd, 0xe8, 0xf8, 0x83, + 0x10, 0xb5, 0x04, 0x46, 0xff, 0xf7, 0x80, 0xff, 0x69, 0x49, 0x00, 0x2c, + 0x4f, 0xf0, 0x18, 0x03, 0x08, 0x46, 0x01, 0xf1, 0x60, 0x02, 0x18, 0xbf, + 0x18, 0x30, 0x08, 0xbf, 0x01, 0xf1, 0x48, 0x02, 0x18, 0x21, 0xbd, 0xe8, + 0x10, 0x40, 0xf8, 0xf7, 0x99, 0xb9, 0x00, 0xbf, 0xf0, 0xb5, 0x85, 0xb0, + 0x13, 0x4d, 0x00, 0x26, 0x72, 0xb6, 0x28, 0x68, 0x40, 0x00, 0x01, 0x30, + 0x28, 0x60, 0x00, 0x20, 0xff, 0xf7, 0xde, 0xff, 0x5a, 0x4f, 0x6c, 0x46, + 0x11, 0x21, 0x11, 0x23, 0x38, 0x69, 0x42, 0x68, 0x20, 0x46, 0xf8, 0xf7, + 0x83, 0xf9, 0x01, 0x20, 0xff, 0xf7, 0xd2, 0xff, 0x20, 0x46, 0x01, 0xf0, + 0x9b, 0xfa, 0x28, 0x68, 0x30, 0x21, 0x40, 0x08, 0x28, 0x60, 0x28, 0x68, + 0x80, 0xf3, 0x10, 0x88, 0x07, 0xf1, 0x48, 0x00, 0x87, 0xf8, 0x7b, 0x60, + 0xfa, 0xf7, 0x04, 0xfb, 0x05, 0xb0, 0xf0, 0xbd, 0x24, 0x36, 0x01, 0x00, + 0xf8, 0xb5, 0x17, 0x49, 0x49, 0x4e, 0x00, 0xeb, 0x40, 0x05, 0x36, 0xf8, + 0x35, 0x00, 0x09, 0x68, 0x88, 0x47, 0x18, 0xb3, 0x06, 0xeb, 0xc5, 0x05, + 0x04, 0x46, 0x28, 0x7a, 0x03, 0x28, 0x18, 0xd8, 0x2e, 0x69, 0xde, 0xb1, + 0x00, 0x27, 0x72, 0x68, 0x5a, 0xb1, 0x31, 0x78, 0x54, 0xfa, 0x87, 0xf0, + 0x0b, 0x46, 0xf8, 0xf7, 0x51, 0xf9, 0x30, 0x78, 0xb6, 0x68, 0x50, 0xfa, + 0x87, 0xf7, 0x00, 0x2e, 0xf1, 0xd1, 0x3b, 0x48, 0x2b, 0x88, 0x00, 0x21, + 0x22, 0x46, 0x05, 0x68, 0x4f, 0xf4, 0x8e, 0x60, 0xa8, 0x47, 0x20, 0x46, + 0xbd, 0xe8, 0xf8, 0x40, 0xfd, 0xf7, 0xac, 0xbf, 0xf8, 0xbd, 0x00, 0xbf, + 0xd4, 0x9b, 0x08, 0x00, 0xf8, 0xb5, 0x31, 0x49, 0x00, 0xeb, 0x40, 0x00, + 0x01, 0xeb, 0xc0, 0x05, 0xaa, 0x88, 0x61, 0x2a, 0x25, 0xd8, 0x31, 0xf8, + 0x30, 0x00, 0xed, 0x49, 0x09, 0x68, 0x88, 0x47, 0x00, 0x28, 0x52, 0xd0, + 0x2e, 0x69, 0x00, 0x2e, 0x4f, 0xd0, 0x04, 0x46, 0x00, 0x27, 0x31, 0x78, + 0x72, 0x68, 0x54, 0xfa, 0x87, 0xf0, 0x0b, 0x46, 0xf8, 0xf7, 0x1e, 0xf9, + 0x30, 0x78, 0xb6, 0x68, 0x50, 0xfa, 0x87, 0xf7, 0x00, 0x2e, 0xf2, 0xd1, + 0x21, 0x48, 0x2b, 0x88, 0x00, 0x21, 0x22, 0x46, 0x05, 0x68, 0x40, 0xf2, + 0x71, 0x40, 0xa8, 0x47, 0x20, 0x46, 0xbd, 0xe8, 0xf8, 0x40, 0xfd, 0xf7, + 0x79, 0xbf, 0x2e, 0x69, 0x8e, 0xb3, 0xb1, 0x68, 0x30, 0x78, 0x09, 0x78, + 0x0c, 0x18, 0xd8, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x40, 0xb3, + 0x31, 0x78, 0x72, 0x68, 0x05, 0x46, 0x0b, 0x46, 0xf8, 0xf7, 0xfa, 0xf8, + 0xb2, 0x68, 0x30, 0x78, 0x11, 0x78, 0x52, 0x68, 0x28, 0x44, 0x0b, 0x46, + 0xf8, 0xf7, 0xf2, 0xf8, 0x0e, 0x4e, 0x40, 0xf2, 0x71, 0x40, 0x00, 0x21, + 0x2a, 0x46, 0x23, 0x46, 0x37, 0x68, 0xb8, 0x47, 0x28, 0x46, 0xfd, 0xf7, + 0x55, 0xff, 0x01, 0x20, 0x02, 0x21, 0xff, 0xf7, 0xdf, 0xfe, 0x50, 0xb1, + 0x04, 0x46, 0x23, 0x78, 0x62, 0x68, 0x35, 0x68, 0x40, 0xf2, 0x71, 0x40, + 0x00, 0x21, 0xa8, 0x47, 0xa4, 0x68, 0x00, 0x2c, 0xf5, 0xd1, 0xf8, 0xbd, + 0x50, 0xe2, 0x05, 0x00, 0x78, 0x9b, 0x08, 0x00, 0xb0, 0xb5, 0x86, 0xb0, + 0xa0, 0xf1, 0x1e, 0x01, 0x12, 0x24, 0x05, 0x29, 0x1c, 0xd8, 0xdf, 0xe8, + 0x01, 0xf0, 0x87, 0x88, 0x03, 0x39, 0x3f, 0x44, 0xb9, 0x4c, 0x94, 0xf8, + 0x78, 0x10, 0x01, 0xf0, 0x03, 0x00, 0x42, 0x1e, 0xd2, 0xb2, 0x01, 0x2a, + 0x05, 0xd8, 0x4a, 0x07, 0x48, 0xbf, 0x5f, 0xea, 0x01, 0x72, 0x00, 0xf1, + 0x79, 0x80, 0x88, 0x07, 0x72, 0xd1, 0x00, 0x20, 0x00, 0x24, 0x01, 0xf0, + 0xcf, 0xf8, 0xff, 0xf7, 0x9d, 0xfe, 0x6c, 0xe0, 0x04, 0x28, 0x6a, 0xd8, + 0xdf, 0xe8, 0x00, 0xf0, 0x03, 0x2b, 0x69, 0x32, 0x3d, 0x00, 0xaa, 0x4d, + 0x01, 0xac, 0x11, 0x21, 0x11, 0x23, 0x28, 0x69, 0x42, 0x68, 0x20, 0x46, + 0xf8, 0xf7, 0x9e, 0xf8, 0x20, 0x46, 0x01, 0xf0, 0xb9, 0xf9, 0x95, 0xf8, + 0x78, 0x00, 0x00, 0x24, 0x40, 0xf0, 0x04, 0x00, 0x85, 0xf8, 0x78, 0x00, + 0x00, 0x20, 0xff, 0xf7, 0x25, 0xff, 0x4e, 0xe0, 0x9e, 0x48, 0x90, 0xf8, + 0x7a, 0x00, 0x01, 0xf0, 0x9d, 0xf9, 0x47, 0xe0, 0x00, 0x20, 0x00, 0x24, + 0x01, 0xf0, 0x04, 0xf8, 0x43, 0xe0, 0x99, 0x48, 0x90, 0xf8, 0x7c, 0x00, + 0x00, 0xf0, 0x82, 0xfe, 0x3c, 0xe0, 0x01, 0x20, 0xff, 0xf7, 0x8a, 0xfe, + 0xb0, 0xb1, 0x04, 0x46, 0x01, 0x20, 0x10, 0xe0, 0x03, 0x20, 0xff, 0xf7, + 0x09, 0xff, 0x91, 0x48, 0x90, 0xf8, 0x7b, 0x10, 0x41, 0xf0, 0x01, 0x01, + 0x80, 0xf8, 0x7b, 0x10, 0x2a, 0xe0, 0x04, 0x20, 0xff, 0xf7, 0x78, 0xfe, + 0xc0, 0xb1, 0x04, 0x46, 0x04, 0x20, 0xff, 0xf7, 0x3b, 0xfe, 0x22, 0xe0, + 0x88, 0x49, 0x91, 0xf8, 0x78, 0x00, 0x40, 0xf0, 0x08, 0x02, 0x81, 0xf8, + 0x78, 0x20, 0xa2, 0xf1, 0x0d, 0x01, 0xc9, 0xb2, 0x01, 0x29, 0x03, 0xd8, + 0x00, 0xf0, 0x03, 0x00, 0x01, 0xf0, 0x72, 0xf8, 0x01, 0x20, 0xff, 0xf7, + 0x17, 0xff, 0x0d, 0xe0, 0x04, 0x20, 0xff, 0xf7, 0x13, 0xff, 0x7d, 0x48, + 0x90, 0xf8, 0x7b, 0x10, 0x41, 0xf0, 0x02, 0x01, 0x03, 0x29, 0x80, 0xf8, + 0x7b, 0x10, 0x01, 0xd1, 0xff, 0xf7, 0xaa, 0xfe, 0x00, 0x24, 0x20, 0x46, + 0x06, 0xb0, 0xb0, 0xbd, 0x01, 0xf0, 0x5a, 0xf8, 0x94, 0xf8, 0x78, 0x10, + 0x81, 0xe7, 0x00, 0xbf, 0x2d, 0xe9, 0xfe, 0x4f, 0x04, 0x46, 0x04, 0x28, + 0x00, 0xf2, 0xae, 0x80, 0xdf, 0xe8, 0x04, 0xf0, 0x03, 0x51, 0xac, 0x03, + 0x51, 0x00, 0xdf, 0xf8, 0xb0, 0xb1, 0x0c, 0x20, 0xdb, 0xf8, 0x00, 0x10, + 0x88, 0x47, 0x6a, 0x4a, 0x04, 0xeb, 0x44, 0x01, 0x4f, 0xf0, 0x00, 0x0a, + 0x14, 0x24, 0xc0, 0xf8, 0x08, 0xa0, 0x02, 0xeb, 0xc1, 0x06, 0xdb, 0xf8, + 0x00, 0x10, 0xb1, 0x46, 0x49, 0xf8, 0x10, 0x0f, 0x14, 0x20, 0x88, 0x47, + 0xd9, 0xf8, 0x00, 0x10, 0x35, 0x46, 0x45, 0xf8, 0x14, 0x1f, 0x48, 0x60, + 0x0c, 0x70, 0x2f, 0x46, 0x17, 0xf8, 0x0c, 0x0d, 0x00, 0x28, 0x00, 0xf0, + 0xa3, 0x80, 0x02, 0x96, 0x09, 0x36, 0x4f, 0xf0, 0x00, 0x08, 0xdb, 0xf8, + 0x00, 0x10, 0x0c, 0x20, 0x88, 0x47, 0x00, 0x28, 0x00, 0xf0, 0xa7, 0x80, + 0x04, 0x46, 0x30, 0x78, 0xdb, 0xf8, 0x00, 0x10, 0x88, 0x47, 0x00, 0x28, + 0x60, 0x60, 0x00, 0xf0, 0x99, 0x80, 0x30, 0x78, 0x08, 0xf1, 0x01, 0x08, + 0xc4, 0xf8, 0x08, 0xa0, 0x84, 0xf8, 0x01, 0xa0, 0x1f, 0xfa, 0x88, 0xf1, + 0x20, 0x70, 0x28, 0x68, 0x2c, 0x60, 0x84, 0x60, 0x38, 0x78, 0x81, 0x42, + 0xdf, 0xd3, 0xd9, 0xf8, 0x00, 0x10, 0x02, 0x9e, 0x08, 0xf1, 0x01, 0x00, + 0x79, 0xe0, 0xdf, 0xf8, 0x14, 0xb1, 0x0c, 0x20, 0xdb, 0xf8, 0x00, 0x10, + 0x88, 0x47, 0x43, 0x4a, 0x04, 0xeb, 0x44, 0x01, 0x4f, 0xf0, 0x00, 0x0a, + 0x04, 0x24, 0xc0, 0xf8, 0x08, 0xa0, 0x02, 0xeb, 0xc1, 0x05, 0xdb, 0xf8, + 0x00, 0x10, 0x2f, 0x46, 0x47, 0xf8, 0x10, 0x0f, 0x04, 0x20, 0x88, 0x47, + 0x39, 0x68, 0x2e, 0x46, 0x46, 0xf8, 0x14, 0x1f, 0x48, 0x60, 0x0c, 0x70, + 0x36, 0xf9, 0x10, 0x8c, 0xb8, 0xf1, 0x01, 0x0f, 0x5a, 0xdb, 0xcd, 0xe9, + 0x01, 0x75, 0x01, 0x27, 0x4f, 0xf0, 0x33, 0x09, 0x0f, 0xfa, 0x88, 0xf0, + 0x32, 0x28, 0x01, 0xdd, 0xff, 0x24, 0x07, 0xe0, 0x1f, 0xfa, 0x88, 0xf0, + 0xb0, 0xfb, 0xf9, 0xf1, 0x01, 0xfb, 0x19, 0x00, 0x00, 0xeb, 0x80, 0x04, + 0xdb, 0xf8, 0x00, 0x10, 0x0c, 0x20, 0x88, 0x47, 0x00, 0x28, 0x4c, 0xd0, + 0xdb, 0xf8, 0x00, 0x10, 0x05, 0x46, 0x20, 0x46, 0x88, 0x47, 0x00, 0x28, + 0x68, 0x60, 0x41, 0xd0, 0x30, 0x68, 0xc5, 0xf8, 0x08, 0xa0, 0x05, 0x21, + 0x01, 0x37, 0x2c, 0x70, 0x85, 0xf8, 0x01, 0xa0, 0x35, 0x60, 0x85, 0x60, + 0xe0, 0xb2, 0xb0, 0xfb, 0xf1, 0xf0, 0xa8, 0xeb, 0x00, 0x00, 0x0f, 0xfa, + 0x80, 0xf8, 0xb8, 0xf1, 0x00, 0x0f, 0xcf, 0xdc, 0x01, 0x98, 0x02, 0x9d, + 0x01, 0x68, 0x22, 0xe0, 0x17, 0x4d, 0x0c, 0x20, 0x29, 0x68, 0x88, 0x47, + 0xd7, 0x4a, 0x04, 0xeb, 0x44, 0x01, 0x02, 0xeb, 0xc1, 0x04, 0x26, 0x46, + 0x46, 0xf8, 0x10, 0x0f, 0xf8, 0xb1, 0x00, 0x23, 0x43, 0x70, 0x83, 0x60, + 0x32, 0xf8, 0x31, 0x00, 0x29, 0x68, 0x88, 0x47, 0x01, 0x46, 0x30, 0x68, + 0x41, 0x60, 0x91, 0xb1, 0x21, 0x78, 0x60, 0x61, 0x01, 0x70, 0x01, 0x20, + 0x20, 0x73, 0x06, 0xe0, 0x01, 0x20, 0x29, 0x60, 0x30, 0x73, 0x02, 0xe0, + 0x01, 0x27, 0x31, 0x60, 0x2f, 0x73, 0x00, 0x20, 0xbd, 0xe8, 0xfe, 0x8f, + 0x20, 0x46, 0x00, 0xe0, 0x28, 0x46, 0xfd, 0xf7, 0xc5, 0xfd, 0x07, 0x20, + 0xbd, 0xe8, 0xfe, 0x8f, 0xd4, 0x9b, 0x08, 0x00, 0x50, 0xe2, 0x05, 0x00, + 0x2d, 0xe9, 0xf8, 0x43, 0x6a, 0xb3, 0x05, 0x46, 0x01, 0xeb, 0x41, 0x00, + 0xbc, 0x49, 0x14, 0x46, 0x01, 0xeb, 0xc0, 0x08, 0x18, 0xf8, 0x07, 0x0f, + 0x47, 0x1c, 0x08, 0xf1, 0x0d, 0x09, 0xe1, 0xb2, 0xf6, 0x29, 0x1e, 0xd8, + 0xd9, 0xf8, 0x00, 0x00, 0xd8, 0xb1, 0x02, 0x78, 0x43, 0x78, 0x40, 0x68, + 0xd6, 0x1a, 0x18, 0x44, 0x8e, 0x42, 0x16, 0xda, 0xf1, 0xb2, 0x2a, 0x46, + 0x0b, 0x46, 0xf7, 0xf7, 0x2f, 0xff, 0xd9, 0xf8, 0x00, 0x00, 0xa4, 0x1b, + 0x88, 0xf8, 0x00, 0x70, 0x55, 0xfa, 0x86, 0xf5, 0x01, 0x37, 0x81, 0x68, + 0xc9, 0xf8, 0x00, 0x10, 0x41, 0x78, 0x31, 0x44, 0x41, 0x70, 0x20, 0x06, + 0xdd, 0xd1, 0xbd, 0xe8, 0xf8, 0x83, 0x2a, 0x46, 0x0b, 0x46, 0xf7, 0xf7, + 0x19, 0xff, 0xd9, 0xf8, 0x00, 0x00, 0x41, 0x78, 0x21, 0x44, 0x41, 0x70, + 0xbd, 0xe8, 0xf8, 0x83, 0x2d, 0xe9, 0xf8, 0x4f, 0x06, 0x46, 0x89, 0x46, + 0x01, 0xeb, 0x41, 0x00, 0x9d, 0x49, 0x96, 0xf8, 0x04, 0xa0, 0x77, 0x79, + 0xb4, 0x79, 0xf2, 0x79, 0x01, 0xeb, 0xc0, 0x0b, 0xd8, 0x46, 0x5d, 0x46, + 0x18, 0xf8, 0x06, 0x0f, 0xd8, 0xb1, 0x3b, 0xf8, 0x02, 0x1f, 0x28, 0x88, + 0xba, 0xf1, 0x00, 0x0f, 0x2d, 0xd0, 0x11, 0x44, 0x47, 0xea, 0x04, 0x23, + 0x89, 0xb2, 0x40, 0x1a, 0x98, 0x42, 0x2c, 0xd1, 0x06, 0xf1, 0x08, 0x00, + 0x49, 0x46, 0x14, 0x46, 0xff, 0xf7, 0x9c, 0xff, 0xbb, 0xf8, 0x00, 0x00, + 0x00, 0x27, 0x88, 0xf8, 0x00, 0xa0, 0x20, 0x44, 0xab, 0xf8, 0x00, 0x00, + 0x28, 0xe0, 0x30, 0x46, 0x49, 0x46, 0x00, 0x92, 0xff, 0xf7, 0x6e, 0xfc, + 0x28, 0x88, 0xba, 0xf1, 0x00, 0x0f, 0x18, 0xd0, 0x00, 0x9a, 0x47, 0xea, + 0x04, 0x21, 0x80, 0x1a, 0x88, 0x42, 0x18, 0xd1, 0x48, 0x46, 0xff, 0xf7, + 0x99, 0xfe, 0xc0, 0xb1, 0x07, 0x46, 0x48, 0x46, 0xff, 0xf7, 0xa2, 0xfc, + 0x10, 0xe0, 0x40, 0x1a, 0x90, 0x42, 0x02, 0xd1, 0x47, 0xea, 0x04, 0x20, + 0x70, 0xb3, 0x48, 0x46, 0xff, 0xf7, 0x98, 0xfc, 0x05, 0xe0, 0x00, 0x99, + 0x88, 0x42, 0x02, 0xd1, 0x47, 0xea, 0x04, 0x20, 0xb8, 0xb3, 0x12, 0x27, + 0x38, 0x46, 0xbd, 0xe8, 0xf8, 0x8f, 0xdb, 0xe9, 0x04, 0x02, 0x01, 0x78, + 0x50, 0x68, 0x06, 0xf1, 0x08, 0x02, 0x0b, 0x46, 0xf7, 0xf7, 0xae, 0xfe, + 0x01, 0x20, 0x00, 0x27, 0x00, 0x9c, 0x8b, 0xf8, 0x07, 0x00, 0xdb, 0xe9, + 0x04, 0x01, 0x89, 0x68, 0xcb, 0xf8, 0x14, 0x10, 0x4f, 0x70, 0x01, 0x78, + 0x88, 0x19, 0x61, 0x1a, 0xca, 0xb2, 0x08, 0x30, 0x49, 0x46, 0xff, 0xf7, + 0x4b, 0xff, 0x88, 0xf8, 0x00, 0xa0, 0xab, 0xf8, 0x02, 0x40, 0xdb, 0xe7, + 0x06, 0xf1, 0x08, 0x00, 0x49, 0x46, 0x14, 0x46, 0xff, 0xf7, 0x40, 0xff, + 0xbb, 0xf8, 0x00, 0x00, 0x20, 0x44, 0xab, 0xf8, 0x00, 0x00, 0x48, 0x46, + 0xff, 0xf7, 0xb6, 0xfd, 0x00, 0x21, 0x88, 0xf8, 0x00, 0x10, 0xbd, 0xe8, + 0xf8, 0x8f, 0x48, 0x46, 0xff, 0xf7, 0x48, 0xfe, 0x00, 0x28, 0xad, 0xd1, + 0x5c, 0x46, 0x06, 0xf1, 0x08, 0x02, 0x54, 0xf8, 0x10, 0x0f, 0x27, 0x46, + 0x01, 0x78, 0x57, 0xf8, 0x04, 0x0f, 0x0b, 0x46, 0x40, 0x68, 0xf7, 0xf7, + 0x71, 0xfe, 0x00, 0x9d, 0x01, 0x20, 0xb9, 0xf1, 0x02, 0x0f, 0x04, 0xf8, + 0x09, 0x0c, 0x0d, 0xd0, 0x38, 0x68, 0x00, 0x21, 0x80, 0x68, 0x38, 0x60, + 0x41, 0x70, 0x20, 0x68, 0x01, 0x78, 0x88, 0x19, 0x69, 0x1a, 0xca, 0xb2, + 0x08, 0x30, 0x49, 0x46, 0xff, 0xf7, 0x0c, 0xff, 0xab, 0xf8, 0x02, 0x50, + 0x48, 0x46, 0xbd, 0xe8, 0xf8, 0x4f, 0xff, 0xf7, 0x83, 0xbd, 0x00, 0xbf, + 0x2d, 0xe9, 0xf8, 0x43, 0x06, 0x46, 0xc4, 0x78, 0x05, 0x79, 0x90, 0x48, + 0x90, 0xf8, 0xc0, 0x00, 0x01, 0x28, 0x11, 0xd1, 0x3c, 0x48, 0x90, 0xf8, + 0x78, 0x10, 0x01, 0xf0, 0x03, 0x02, 0x01, 0x3a, 0x01, 0x2a, 0x09, 0xd8, + 0x0d, 0x39, 0x96, 0xf8, 0x02, 0x80, 0x96, 0xf8, 0x07, 0x90, 0x01, 0x29, + 0x0c, 0xd8, 0x90, 0xf8, 0x7b, 0x00, 0x58, 0xb1, 0x0c, 0x22, 0x03, 0x20, + 0x4f, 0xf6, 0xda, 0x41, 0x23, 0x46, 0x00, 0x95, 0x24, 0xf0, 0xe0, 0xfd, + 0xbd, 0xe8, 0xf8, 0x83, 0x00, 0x27, 0x00, 0xe0, 0x03, 0x27, 0x28, 0x46, + 0x39, 0x46, 0xff, 0xf7, 0xa7, 0xfb, 0x01, 0x28, 0x0c, 0xd1, 0xb9, 0xf1, + 0xf6, 0x0f, 0x09, 0xd8, 0x09, 0xf1, 0x05, 0x00, 0x40, 0x45, 0x05, 0xd1, + 0x30, 0x46, 0x39, 0x46, 0xff, 0xf7, 0x08, 0xff, 0x02, 0x46, 0xe0, 0xe7, + 0x38, 0x46, 0xff, 0xf7, 0xeb, 0xfb, 0x12, 0x22, 0xdb, 0xe7, 0x00, 0xbf, + 0x2d, 0xe9, 0xf8, 0x43, 0x06, 0x46, 0xc4, 0x78, 0x05, 0x79, 0x6f, 0x48, + 0x90, 0xf8, 0xc0, 0x00, 0x01, 0x28, 0x14, 0xd1, 0x1b, 0x48, 0x90, 0xf8, + 0x78, 0x10, 0x01, 0xf0, 0x07, 0x02, 0x05, 0x3a, 0x01, 0x2a, 0x0c, 0xd8, + 0x0d, 0x39, 0x96, 0xf8, 0x02, 0x80, 0x96, 0xf8, 0x07, 0x90, 0x01, 0x29, + 0x0f, 0xd8, 0x90, 0xf8, 0x7b, 0x00, 0x01, 0x28, 0x01, 0xd1, 0x04, 0x27, + 0x0a, 0xe0, 0x0c, 0x22, 0x03, 0x20, 0x4f, 0xf6, 0xda, 0x41, 0x23, 0x46, + 0x00, 0x95, 0x24, 0xf0, 0x9b, 0xfd, 0xbd, 0xe8, 0xf8, 0x83, 0x01, 0x27, + 0x28, 0x46, 0x39, 0x46, 0xff, 0xf7, 0x64, 0xfb, 0x01, 0x28, 0x0c, 0xd1, + 0xb9, 0xf1, 0xf6, 0x0f, 0x09, 0xd8, 0x09, 0xf1, 0x05, 0x00, 0x40, 0x45, + 0x05, 0xd1, 0x30, 0x46, 0x39, 0x46, 0xff, 0xf7, 0xc5, 0xfe, 0x02, 0x46, + 0xe2, 0xe7, 0x38, 0x46, 0xff, 0xf7, 0xa8, 0xfb, 0x12, 0x22, 0xdd, 0xe7, + 0x50, 0xe2, 0x05, 0x00, 0x4f, 0x49, 0xc3, 0x78, 0x91, 0xf8, 0xc0, 0x10, + 0x01, 0x29, 0x08, 0xd1, 0x00, 0x79, 0x01, 0x28, 0x8f, 0xbf, 0x12, 0x22, + 0xf2, 0x49, 0x81, 0xf8, 0x79, 0x00, 0x00, 0x22, 0x00, 0xe0, 0x0c, 0x22, + 0x48, 0x48, 0x4f, 0xf6, 0xda, 0x41, 0xd0, 0xf8, 0x00, 0xc0, 0x02, 0x20, + 0x60, 0x47, 0x00, 0xbf, 0x10, 0xb5, 0x43, 0x49, 0xc4, 0x78, 0x91, 0xf8, + 0xc0, 0x10, 0x01, 0x29, 0x15, 0xd1, 0x00, 0x79, 0x02, 0x28, 0x14, 0xd8, + 0xe6, 0x49, 0x91, 0xf8, 0x78, 0x20, 0x20, 0xb9, 0x02, 0xf0, 0x03, 0x03, + 0x01, 0x3b, 0x01, 0x2b, 0x09, 0xd8, 0x02, 0xf0, 0xfc, 0x02, 0x10, 0x43, + 0x81, 0xf8, 0x78, 0x00, 0x20, 0x20, 0xff, 0xf7, 0xc9, 0xfc, 0x02, 0x46, + 0x02, 0xe0, 0x0c, 0x22, 0x00, 0xe0, 0x12, 0x22, 0x34, 0x48, 0x4f, 0xf6, + 0xda, 0x41, 0x23, 0x46, 0xd0, 0xf8, 0x00, 0xc0, 0x02, 0x20, 0xbd, 0xe8, + 0x10, 0x40, 0x60, 0x47, 0x10, 0xb5, 0x2e, 0x49, 0xc4, 0x78, 0x91, 0xf8, + 0xc0, 0x10, 0x01, 0x29, 0x08, 0xd1, 0x00, 0x79, 0xd2, 0x49, 0x81, 0xf8, + 0x7a, 0x00, 0x21, 0x20, 0xff, 0xf7, 0xac, 0xfc, 0x02, 0x46, 0x00, 0xe0, + 0x0c, 0x22, 0x27, 0x48, 0x4f, 0xf6, 0xda, 0x41, 0x23, 0x46, 0xd0, 0xf8, + 0x00, 0xc0, 0x02, 0x20, 0xbd, 0xe8, 0x10, 0x40, 0x60, 0x47, 0x00, 0xbf, + 0x10, 0xb5, 0x20, 0x49, 0xc4, 0x78, 0x91, 0xf8, 0xc0, 0x10, 0x01, 0x29, + 0x0a, 0xd1, 0x00, 0x79, 0x01, 0x28, 0x09, 0xd8, 0xc3, 0x49, 0x81, 0xf8, + 0x7c, 0x00, 0x23, 0x20, 0xff, 0xf7, 0x8e, 0xfc, 0x02, 0x46, 0x02, 0xe0, + 0x0c, 0x22, 0x00, 0xe0, 0x12, 0x22, 0x17, 0x48, 0x4f, 0xf6, 0xda, 0x41, + 0x23, 0x46, 0xd0, 0xf8, 0x00, 0xc0, 0x02, 0x20, 0xbd, 0xe8, 0x10, 0x40, + 0x60, 0x47, 0x00, 0xbf, 0x10, 0xb5, 0x10, 0x49, 0xc4, 0x78, 0x91, 0xf8, + 0xc0, 0x10, 0x01, 0x29, 0x0f, 0xd1, 0xb5, 0x49, 0x91, 0xf8, 0x78, 0x20, + 0x0d, 0x3a, 0x01, 0x2a, 0x09, 0xd8, 0x02, 0x79, 0x01, 0xf8, 0x7e, 0x2f, + 0x40, 0x79, 0x48, 0x70, 0x22, 0x20, 0xff, 0xf7, 0x69, 0xfc, 0x02, 0x46, + 0x00, 0xe0, 0x0c, 0x22, 0x05, 0x48, 0x4f, 0xf6, 0xda, 0x41, 0x23, 0x46, + 0xd0, 0xf8, 0x00, 0xc0, 0x02, 0x20, 0xbd, 0xe8, 0x10, 0x40, 0x60, 0x47, + 0xd0, 0x32, 0x06, 0x00, 0x2c, 0x9c, 0x08, 0x00, 0xf8, 0xb5, 0x01, 0x30, + 0x0c, 0x46, 0x00, 0x25, 0xc1, 0xb2, 0x00, 0x20, 0xff, 0xf7, 0x1e, 0xfb, + 0x43, 0x68, 0x93, 0xf8, 0x00, 0xe0, 0xbe, 0xf1, 0x00, 0x0f, 0x1b, 0xd0, + 0x4f, 0xf0, 0x01, 0x0c, 0x01, 0x33, 0x00, 0x25, 0x0c, 0xfa, 0x04, 0xf2, + 0x00, 0x24, 0x03, 0xeb, 0x84, 0x07, 0x13, 0xf8, 0x24, 0x60, 0x79, 0x78, + 0xb8, 0x78, 0xff, 0x78, 0x46, 0xea, 0x01, 0x21, 0x40, 0xea, 0x07, 0x20, + 0x41, 0xea, 0x00, 0x40, 0x10, 0x42, 0x1c, 0xbf, 0x0c, 0xfa, 0x04, 0xf0, + 0x05, 0x43, 0x01, 0x34, 0x74, 0x45, 0xea, 0xd3, 0xe8, 0xb2, 0xf8, 0xbd, + 0xb0, 0xb5, 0x05, 0x46, 0x48, 0x1c, 0x14, 0x46, 0xc1, 0xb2, 0x00, 0x20, + 0xff, 0xf7, 0xf2, 0xfa, 0x40, 0x68, 0x01, 0x78, 0xa1, 0x42, 0x47, 0xd9, + 0x02, 0x2d, 0x16, 0xd0, 0x01, 0x2d, 0x27, 0xd0, 0x00, 0x2d, 0x41, 0xd1, + 0x01, 0x46, 0x11, 0xf8, 0x25, 0x2f, 0x4b, 0x78, 0x8d, 0x78, 0xc9, 0x78, + 0x42, 0xea, 0x03, 0x22, 0x45, 0xea, 0x01, 0x21, 0x42, 0xea, 0x01, 0x41, + 0xa1, 0x42, 0x33, 0xd9, 0x00, 0xeb, 0x84, 0x00, 0x10, 0xf8, 0x29, 0x1f, + 0x24, 0xe0, 0x01, 0x46, 0x11, 0xf8, 0x55, 0x2f, 0x4b, 0x78, 0x8d, 0x78, + 0xc9, 0x78, 0x42, 0xea, 0x03, 0x22, 0x45, 0xea, 0x01, 0x21, 0x42, 0xea, + 0x01, 0x41, 0xa1, 0x42, 0x20, 0xd9, 0x00, 0xeb, 0x84, 0x00, 0x10, 0xf8, + 0x59, 0x1f, 0x11, 0xe0, 0x01, 0x46, 0x11, 0xf8, 0x3d, 0x2f, 0x4b, 0x78, + 0x8d, 0x78, 0xc9, 0x78, 0x42, 0xea, 0x03, 0x22, 0x45, 0xea, 0x01, 0x21, + 0x42, 0xea, 0x01, 0x41, 0xa1, 0x42, 0x0d, 0xd9, 0x00, 0xeb, 0x84, 0x00, + 0x10, 0xf8, 0x41, 0x1f, 0x42, 0x78, 0x83, 0x78, 0xc0, 0x78, 0x41, 0xea, + 0x02, 0x21, 0x43, 0xea, 0x00, 0x20, 0x41, 0xea, 0x00, 0x40, 0xb0, 0xbd, + 0x4f, 0xf0, 0xff, 0x30, 0xb0, 0xbd, 0x10, 0xb5, 0x01, 0x30, 0x0c, 0x46, + 0xc1, 0xb2, 0x00, 0x20, 0xff, 0xf7, 0x9c, 0xfa, 0x40, 0x68, 0x01, 0x78, + 0xa1, 0x42, 0x11, 0xd9, 0x90, 0xf8, 0x6d, 0x10, 0xa1, 0x42, 0x0d, 0xd9, + 0x00, 0xeb, 0x84, 0x00, 0x10, 0xf8, 0x6e, 0x1f, 0x42, 0x78, 0x83, 0x78, + 0xc0, 0x78, 0x41, 0xea, 0x02, 0x21, 0x43, 0xea, 0x00, 0x20, 0x41, 0xea, + 0x00, 0x40, 0x10, 0xbd, 0x4f, 0xf0, 0xff, 0x30, 0x10, 0xbd, 0x2d, 0xe9, + 0xf8, 0x4f, 0x83, 0x46, 0x00, 0x20, 0x00, 0x21, 0xff, 0xf7, 0x7c, 0xfa, + 0x40, 0x68, 0x90, 0xf8, 0x13, 0xa0, 0xba, 0xf1, 0x00, 0x0f, 0x57, 0xd0, + 0x01, 0x20, 0x00, 0x24, 0xff, 0x26, 0x00, 0xfa, 0x0b, 0xf9, 0x04, 0xf1, + 0x01, 0x08, 0x00, 0x20, 0x5f, 0xfa, 0x88, 0xf5, 0x29, 0x46, 0xff, 0xf7, + 0x69, 0xfa, 0x40, 0x68, 0xf1, 0xb2, 0xff, 0x29, 0x00, 0xf1, 0x15, 0x00, + 0x20, 0xd1, 0x01, 0x46, 0x5f, 0x46, 0x11, 0xf8, 0x08, 0xcf, 0x11, 0xf8, + 0x04, 0xef, 0xce, 0x78, 0x8a, 0x78, 0x11, 0xf8, 0x02, 0x3c, 0x42, 0xea, + 0x06, 0x2b, 0x11, 0xf8, 0x03, 0x6c, 0x11, 0xf8, 0x01, 0x2c, 0x49, 0x78, + 0x4e, 0xea, 0x01, 0x21, 0x4c, 0xea, 0x06, 0x26, 0x43, 0xea, 0x02, 0x22, + 0x41, 0xea, 0x0b, 0x41, 0x46, 0xea, 0x02, 0x42, 0xbb, 0x46, 0x26, 0x46, + 0x11, 0x43, 0x08, 0xbf, 0x4f, 0xf0, 0xff, 0x36, 0xbb, 0xf1, 0x28, 0x0f, + 0x1b, 0xd8, 0x01, 0x78, 0x42, 0x78, 0x83, 0x78, 0xc7, 0x78, 0x41, 0xea, + 0x02, 0x21, 0x43, 0xea, 0x07, 0x23, 0x42, 0x79, 0x41, 0xea, 0x03, 0x41, + 0x10, 0xf8, 0x04, 0x3f, 0x01, 0xea, 0x09, 0x01, 0x43, 0xea, 0x02, 0x22, + 0x83, 0x78, 0xc0, 0x78, 0x43, 0xea, 0x00, 0x20, 0x42, 0xea, 0x00, 0x40, + 0x00, 0xea, 0xe9, 0x70, 0x08, 0x43, 0x20, 0x46, 0x05, 0xd1, 0x55, 0x45, + 0x44, 0x46, 0x30, 0x46, 0xad, 0xd3, 0x00, 0xe0, 0xff, 0x20, 0xc0, 0xb2, + 0xbd, 0xe8, 0xf8, 0x8f, 0x10, 0xb5, 0x0c, 0x46, 0x1e, 0x49, 0x91, 0xf8, + 0x78, 0x10, 0x0d, 0x39, 0x01, 0x29, 0x08, 0xd8, 0xff, 0xf7, 0x8d, 0xff, + 0xff, 0x28, 0x04, 0xd0, 0x21, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0xff, 0xf7, + 0xe3, 0xbe, 0xff, 0x20, 0x10, 0xbd, 0x00, 0xbf, 0xb0, 0xb5, 0x0c, 0x46, + 0x14, 0x49, 0x91, 0xf8, 0x78, 0x10, 0x0d, 0x39, 0x01, 0x29, 0x0b, 0xd8, + 0x15, 0x46, 0xff, 0xf7, 0x78, 0xff, 0xff, 0x28, 0x06, 0xd0, 0x01, 0x46, + 0x28, 0x46, 0x22, 0x46, 0xbd, 0xe8, 0xb0, 0x40, 0xff, 0xf7, 0xf8, 0xbe, + 0x4f, 0xf0, 0xff, 0x30, 0xb0, 0xbd, 0x00, 0xbf, 0x10, 0xb5, 0x0c, 0x46, + 0x08, 0x49, 0x91, 0xf8, 0x78, 0x10, 0x0d, 0x39, 0x01, 0x29, 0x08, 0xd8, + 0xff, 0xf7, 0x61, 0xff, 0xff, 0x28, 0x04, 0xd0, 0x21, 0x46, 0xbd, 0xe8, + 0x10, 0x40, 0xff, 0xf7, 0x3a, 0xbf, 0x4f, 0xf0, 0xff, 0x30, 0x10, 0xbd, + 0x50, 0xe2, 0x05, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, 0x85, 0xb0, 0xcd, 0xe9, + 0x03, 0x01, 0x01, 0x20, 0x00, 0x21, 0x14, 0x46, 0xff, 0xf7, 0xce, 0xf9, + 0x45, 0x68, 0x20, 0x46, 0x05, 0x21, 0xfa, 0xf7, 0x15, 0xfa, 0xa8, 0x78, + 0xe9, 0x78, 0x40, 0xea, 0x01, 0x26, 0x00, 0x2e, 0x00, 0xf0, 0x89, 0x80, + 0xcd, 0xe9, 0x01, 0x54, 0x4f, 0xf0, 0x00, 0x08, 0x4f, 0xf0, 0xff, 0x0e, + 0x4f, 0xf0, 0x33, 0x0a, 0x4f, 0xf0, 0x00, 0x0b, 0x4f, 0xf0, 0x00, 0x09, + 0x00, 0x27, 0xdd, 0xf8, 0x0c, 0xc0, 0xb8, 0xb2, 0xb0, 0xfb, 0xfa, 0xf4, + 0x04, 0xfb, 0x1a, 0x70, 0x00, 0x04, 0x09, 0xd1, 0x60, 0x1c, 0x75, 0x46, + 0xc1, 0xb2, 0x01, 0x20, 0xff, 0xf7, 0xa6, 0xf9, 0xae, 0x46, 0xdd, 0xf8, + 0x0c, 0xc0, 0x45, 0x68, 0xbb, 0xfb, 0xfa, 0xf0, 0x5f, 0xfa, 0x8e, 0xf3, + 0xff, 0x2b, 0xa0, 0xeb, 0x00, 0x20, 0x48, 0x44, 0x05, 0xeb, 0x00, 0x01, + 0x2a, 0x5c, 0x88, 0x78, 0xc9, 0x78, 0x40, 0xea, 0x01, 0x21, 0x4f, 0xea, + 0x11, 0x20, 0x15, 0xd1, 0x7f, 0x2a, 0x0d, 0xd1, 0xca, 0xb2, 0xff, 0x2a, + 0x02, 0xd0, 0x04, 0x9b, 0x9a, 0x42, 0x04, 0xd0, 0xff, 0x28, 0x08, 0xd0, + 0x04, 0x9a, 0x90, 0x42, 0x05, 0xd1, 0x04, 0xfb, 0x1a, 0x8e, 0x04, 0xe0, + 0x4f, 0xf0, 0xff, 0x0e, 0x02, 0xe0, 0x4f, 0xf0, 0xff, 0x0e, 0x7f, 0x22, + 0x62, 0x45, 0x0a, 0xd1, 0xc9, 0xb2, 0xff, 0x29, 0x02, 0xd0, 0x04, 0x9a, + 0x91, 0x42, 0x10, 0xd0, 0xff, 0x28, 0x02, 0xd0, 0x04, 0x99, 0x88, 0x42, + 0x0b, 0xd0, 0x01, 0x37, 0x08, 0xf1, 0x01, 0x08, 0x0b, 0xf1, 0x01, 0x0b, + 0x09, 0xf1, 0x05, 0x09, 0xb8, 0xb2, 0xb0, 0x42, 0xaf, 0xd3, 0x02, 0x9c, + 0x14, 0xe0, 0x33, 0x20, 0x02, 0x9c, 0x05, 0x21, 0x05, 0x23, 0x76, 0x46, + 0xbb, 0xfb, 0xf0, 0xf0, 0xc0, 0xeb, 0x00, 0x20, 0xa9, 0xeb, 0x00, 0x00, + 0x2a, 0x18, 0x20, 0x46, 0xf7, 0xf7, 0x56, 0xfb, 0x01, 0x99, 0xb6, 0x46, + 0x88, 0x78, 0xc9, 0x78, 0x40, 0xea, 0x01, 0x26, 0x5f, 0xfa, 0x8e, 0xf0, + 0xff, 0x28, 0x0e, 0xd0, 0xb9, 0xb2, 0xb1, 0x42, 0x0b, 0xd1, 0x80, 0x00, + 0x05, 0x21, 0x05, 0x23, 0x50, 0xfa, 0x8e, 0xf0, 0x2a, 0x18, 0x20, 0x46, + 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, 0xf7, 0xf7, 0x3d, 0xbb, 0x05, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0x80, 0xb5, 0x03, 0x46, 0x00, 0x7b, 0x12, 0x21, + 0x1b, 0x22, 0x01, 0xeb, 0x80, 0x00, 0xb4, 0x21, 0xc0, 0xb2, 0x24, 0xf0, + 0xe9, 0xfa, 0x18, 0xb1, 0xbd, 0xe8, 0x80, 0x40, 0xfd, 0xf7, 0x5c, 0xb9, + 0x80, 0xbd, 0xe0, 0xb5, 0x03, 0x46, 0x08, 0x78, 0x00, 0x91, 0x07, 0x21, + 0x1c, 0x22, 0x01, 0xeb, 0x80, 0x00, 0xb4, 0x21, 0xc0, 0xb2, 0x24, 0xf0, + 0x2b, 0xfb, 0x18, 0xb1, 0xbd, 0xe8, 0x8c, 0x40, 0xfd, 0xf7, 0x4a, 0xb9, + 0x8c, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0xf9, 0xf7, 0xd7, 0xfc, 0x4f, 0xf0, + 0x5e, 0x51, 0xf9, 0xf7, 0xc7, 0xfc, 0x80, 0xbd, 0xb0, 0xb5, 0xef, 0x48, + 0x00, 0xf1, 0x11, 0x05, 0x15, 0xf8, 0x06, 0x4f, 0x95, 0xf8, 0x3d, 0x10, + 0x20, 0x46, 0xff, 0xf7, 0xe5, 0xfe, 0x85, 0xf8, 0x3f, 0x00, 0x06, 0x48, + 0x00, 0x78, 0x00, 0xb1, 0xb0, 0xbd, 0x95, 0xf8, 0x3e, 0x10, 0x20, 0x46, + 0xff, 0xf7, 0xda, 0xfe, 0x85, 0xf8, 0x40, 0x00, 0xb0, 0xbd, 0x00, 0xbf, + 0x34, 0xe4, 0x05, 0x00, 0x02, 0x49, 0x01, 0xeb, 0x80, 0x00, 0x80, 0x6f, + 0x70, 0x47, 0x00, 0xbf, 0x04, 0xa9, 0x02, 0x00, 0x04, 0x48, 0x05, 0x49, + 0x00, 0x68, 0x09, 0x68, 0x88, 0x42, 0x8e, 0xbf, 0x40, 0x1a, 0xc9, 0x43, + 0x08, 0x44, 0x70, 0x47, 0x18, 0x12, 0x21, 0x40, 0x00, 0x12, 0x21, 0x40, + 0x40, 0x08, 0xb0, 0xfa, 0x80, 0xf0, 0xc0, 0xf1, 0x20, 0x00, 0xc0, 0xb2, + 0x70, 0x47, 0x00, 0xbf, 0xf0, 0xb5, 0xd2, 0x4b, 0x93, 0xf8, 0x5f, 0x30, + 0x01, 0x2b, 0x40, 0xf0, 0xb5, 0x80, 0x60, 0x4d, 0xdf, 0xf8, 0x80, 0xc1, + 0x12, 0x29, 0xd5, 0xe9, 0x05, 0x34, 0x03, 0xeb, 0x00, 0x06, 0xdc, 0xe9, + 0x05, 0x73, 0x04, 0xf1, 0x01, 0x04, 0xc5, 0xe9, 0x05, 0x64, 0x05, 0xf1, + 0x02, 0x04, 0x38, 0x44, 0x03, 0xf1, 0x01, 0x03, 0xcc, 0xe9, 0x05, 0x03, + 0x0c, 0xf1, 0x02, 0x00, 0x08, 0xdb, 0x14, 0x29, 0x45, 0xdc, 0x21, 0x88, + 0x01, 0x31, 0x21, 0x80, 0x01, 0x88, 0x01, 0x31, 0x01, 0x80, 0x3e, 0xe0, + 0x0f, 0x29, 0x06, 0xdb, 0x61, 0x88, 0x01, 0x31, 0x61, 0x80, 0x41, 0x88, + 0x01, 0x31, 0x41, 0x80, 0x35, 0xe0, 0x0c, 0x29, 0x06, 0xdb, 0xa1, 0x88, + 0x01, 0x31, 0xa1, 0x80, 0x81, 0x88, 0x01, 0x31, 0x81, 0x80, 0x2c, 0xe0, + 0x09, 0x29, 0x06, 0xdb, 0xe1, 0x88, 0x01, 0x31, 0xe1, 0x80, 0xc1, 0x88, + 0x01, 0x31, 0xc1, 0x80, 0x23, 0xe0, 0x06, 0x29, 0x06, 0xdb, 0x21, 0x89, + 0x01, 0x31, 0x21, 0x81, 0x01, 0x89, 0x01, 0x31, 0x01, 0x81, 0x1a, 0xe0, + 0x03, 0x29, 0x06, 0xdb, 0x61, 0x89, 0x01, 0x31, 0x61, 0x81, 0x41, 0x89, + 0x01, 0x31, 0x41, 0x81, 0x11, 0xe0, 0x00, 0x29, 0x06, 0xd4, 0xa1, 0x89, + 0x01, 0x31, 0xa1, 0x81, 0x81, 0x89, 0x01, 0x31, 0x81, 0x81, 0x08, 0xe0, + 0x11, 0xf1, 0x1e, 0x0f, 0x05, 0xdb, 0xe1, 0x89, 0x01, 0x31, 0xe1, 0x81, + 0xc1, 0x89, 0x01, 0x31, 0xc1, 0x81, 0x32, 0x49, 0x09, 0x78, 0x9a, 0xb1, + 0x31, 0x4a, 0x01, 0xeb, 0x01, 0x10, 0x02, 0xeb, 0xc0, 0x00, 0x90, 0xf8, + 0x49, 0x00, 0x00, 0xf0, 0xe0, 0x00, 0x20, 0x28, 0x2c, 0xd1, 0x01, 0xeb, + 0x81, 0x00, 0x2d, 0x49, 0x01, 0xeb, 0xc0, 0x00, 0x90, 0xf8, 0x24, 0x00, + 0x03, 0x30, 0x28, 0xe0, 0x29, 0x4a, 0x01, 0xeb, 0x81, 0x01, 0x05, 0x23, + 0x02, 0xeb, 0xc1, 0x01, 0x0a, 0x7a, 0x89, 0x7b, 0xb2, 0xfb, 0xf3, 0xf3, + 0x03, 0xeb, 0x83, 0x03, 0xd2, 0x1a, 0x24, 0x4b, 0x03, 0xeb, 0xc2, 0x12, + 0x02, 0xeb, 0xc1, 0x01, 0x09, 0x79, 0x01, 0x29, 0x1e, 0xd0, 0x03, 0x29, + 0x27, 0xd0, 0x05, 0x29, 0x24, 0xd1, 0xd4, 0xf8, 0x22, 0x10, 0x01, 0x31, + 0xc4, 0xf8, 0x22, 0x10, 0xd0, 0xf8, 0x22, 0x10, 0x01, 0x31, 0xc0, 0xf8, + 0x22, 0x10, 0xf0, 0xbd, 0x5c, 0x20, 0x11, 0xfb, 0x00, 0xf0, 0x15, 0x49, + 0x08, 0x5c, 0x05, 0xeb, 0x40, 0x01, 0x0c, 0xeb, 0x40, 0x00, 0x0a, 0x8d, + 0x01, 0x32, 0x0a, 0x85, 0x01, 0x8d, 0x01, 0x31, 0x01, 0x85, 0xf0, 0xbd, + 0xd4, 0xf8, 0x1a, 0x10, 0x01, 0x31, 0xc4, 0xf8, 0x1a, 0x10, 0xd0, 0xf8, + 0x1a, 0x10, 0x01, 0x31, 0xc0, 0xf8, 0x1a, 0x10, 0xf0, 0xbd, 0xd4, 0xf8, + 0x1e, 0x10, 0x01, 0x31, 0xc4, 0xf8, 0x1e, 0x10, 0xd0, 0xf8, 0x1e, 0x10, + 0x01, 0x31, 0xc0, 0xf8, 0x1e, 0x10, 0xf0, 0xbd, 0xbc, 0xe3, 0x05, 0x00, + 0xf8, 0xe3, 0x05, 0x00, 0x74, 0x87, 0x08, 0x00, 0xfc, 0x6d, 0x01, 0x00, + 0x44, 0x4f, 0x01, 0x00, 0x84, 0x71, 0x01, 0x00, 0x86, 0x71, 0x0d, 0x10, + 0x67, 0x49, 0x81, 0xf8, 0x53, 0x00, 0x91, 0xf8, 0x5f, 0x00, 0x01, 0x28, + 0x18, 0xbf, 0x70, 0x47, 0xc8, 0x7d, 0x00, 0xf0, 0x01, 0xb8, 0x00, 0xbf, + 0x2d, 0xe9, 0xf0, 0x4f, 0x89, 0xb0, 0x02, 0x90, 0x03, 0xa8, 0x18, 0x21, + 0xf9, 0xf7, 0x7e, 0xfb, 0xdf, 0xf8, 0x74, 0xa1, 0x0a, 0xf1, 0x0b, 0x05, + 0xff, 0xf7, 0xd6, 0xfe, 0x00, 0x24, 0xd7, 0x48, 0x00, 0x78, 0x01, 0x28, + 0x08, 0xbf, 0x01, 0x2c, 0x00, 0xf0, 0x8d, 0x80, 0x0a, 0xeb, 0x04, 0x06, + 0x04, 0xeb, 0x84, 0x00, 0x0a, 0xeb, 0x00, 0x0b, 0x96, 0xf8, 0x54, 0x10, + 0x02, 0x98, 0x0b, 0xf1, 0x48, 0x02, 0xff, 0xf7, 0xf3, 0xfd, 0x9b, 0xf8, + 0x4c, 0x00, 0x01, 0x28, 0x02, 0xd1, 0x4f, 0xf0, 0x7e, 0x56, 0x25, 0xe0, + 0x06, 0xf1, 0x56, 0x08, 0x4f, 0xf0, 0x9f, 0x46, 0x4f, 0xf0, 0x00, 0x09, + 0x98, 0xf8, 0x00, 0x00, 0x37, 0x46, 0x20, 0xfa, 0x09, 0xf0, 0xc0, 0x07, + 0x12, 0xd0, 0x95, 0xf8, 0x53, 0x00, 0x5f, 0xfa, 0x89, 0xf2, 0x00, 0x21, + 0x00, 0xf0, 0x8c, 0xf8, 0x06, 0x46, 0x38, 0x46, 0x4f, 0xf0, 0x9f, 0x41, + 0x00, 0xf0, 0x08, 0xfe, 0x28, 0xb9, 0x30, 0x46, 0x39, 0x46, 0x00, 0xf0, + 0x09, 0xfe, 0x00, 0xb9, 0x3e, 0x46, 0x09, 0xf1, 0x01, 0x09, 0xb9, 0xf1, + 0x05, 0x0f, 0xdf, 0xd1, 0x28, 0x78, 0x01, 0x28, 0x09, 0xd1, 0x30, 0x46, + 0x4f, 0xf0, 0x7e, 0x51, 0x00, 0xf0, 0xfa, 0xfd, 0x00, 0x28, 0x4f, 0xf0, + 0x7e, 0x50, 0x08, 0xbf, 0x06, 0x46, 0x88, 0x49, 0x30, 0x46, 0xf9, 0xf7, + 0x49, 0xfb, 0x00, 0xf0, 0xf5, 0xfd, 0xc8, 0x28, 0x5a, 0xd8, 0x0d, 0xf1, + 0x0c, 0x09, 0x07, 0x46, 0x30, 0x46, 0x00, 0x21, 0x09, 0xeb, 0x84, 0x08, + 0xc8, 0xf8, 0x08, 0x60, 0x00, 0xf0, 0xdc, 0xfd, 0x00, 0x28, 0x18, 0xbf, + 0x01, 0x20, 0x85, 0xf8, 0x55, 0x00, 0x04, 0x22, 0x09, 0xeb, 0x44, 0x01, + 0x9b, 0xf9, 0x49, 0x00, 0x90, 0xfb, 0xf2, 0xf0, 0x40, 0xb2, 0x88, 0x80, + 0x00, 0xf0, 0xde, 0xfd, 0x06, 0x46, 0x22, 0x48, 0x22, 0x49, 0x50, 0xf8, + 0x27, 0x00, 0xf9, 0xf7, 0x23, 0xfb, 0x31, 0x46, 0xf9, 0xf7, 0x26, 0xfb, + 0x4f, 0xf0, 0x81, 0x41, 0xf9, 0xf7, 0x1c, 0xfb, 0xf9, 0xf7, 0x32, 0xfb, + 0x0a, 0xeb, 0x44, 0x01, 0x50, 0x28, 0xa8, 0xbf, 0x50, 0x20, 0xa1, 0xf8, + 0x58, 0x00, 0x00, 0xf0, 0xc5, 0xfd, 0x4f, 0xf0, 0x7a, 0x51, 0xf9, 0xf7, + 0x0d, 0xfb, 0x01, 0x34, 0xc8, 0xf8, 0x10, 0x00, 0x02, 0x2c, 0x7f, 0xf4, + 0x6c, 0xaf, 0x28, 0x7b, 0x95, 0xf8, 0x4b, 0x20, 0x95, 0xf8, 0x4c, 0x30, + 0x95, 0xf8, 0x48, 0x10, 0x8d, 0xf8, 0x0c, 0x00, 0x95, 0xf8, 0x53, 0x00, + 0x8d, 0xf8, 0x0e, 0x10, 0x01, 0x21, 0x8d, 0xf8, 0x0d, 0x00, 0x43, 0xea, + 0x02, 0x00, 0x03, 0xab, 0x00, 0x22, 0x8d, 0xf8, 0x0f, 0x00, 0xf2, 0x48, + 0x04, 0x68, 0x18, 0x20, 0x00, 0x90, 0x40, 0xf2, 0x37, 0x70, 0xa0, 0x47, + 0x09, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0xbf, 0xd0, 0xe2, 0x05, 0x00, + 0xd0, 0xa9, 0x02, 0x00, 0x00, 0x00, 0x20, 0x41, 0x2d, 0xe9, 0xf0, 0x47, + 0xdf, 0xf8, 0x3c, 0x91, 0x90, 0x46, 0x07, 0x46, 0xd9, 0xf8, 0x18, 0x50, + 0x99, 0xf8, 0x17, 0x60, 0x09, 0xf1, 0x0d, 0x04, 0x15, 0xb1, 0x4f, 0xf0, + 0x00, 0x0a, 0x05, 0xe0, 0x30, 0x46, 0x41, 0x46, 0x02, 0x22, 0xff, 0xf7, + 0x09, 0xfd, 0x82, 0x46, 0x03, 0x2f, 0x22, 0xd0, 0x02, 0x2f, 0x2c, 0xd0, + 0x01, 0x2f, 0x50, 0xd1, 0x6b, 0x48, 0x00, 0x21, 0x41, 0x70, 0x00, 0x2d, + 0x6d, 0xd0, 0x20, 0x46, 0x10, 0xf8, 0x06, 0x1f, 0x42, 0x78, 0x83, 0x78, + 0xc0, 0x78, 0x41, 0xea, 0x02, 0x21, 0x43, 0xea, 0x00, 0x20, 0x41, 0xea, + 0x00, 0x40, 0x01, 0x28, 0x52, 0xd8, 0x14, 0xf8, 0x0f, 0x0f, 0x61, 0x78, + 0xa2, 0x78, 0xe3, 0x78, 0x40, 0xea, 0x01, 0x20, 0x42, 0xea, 0x03, 0x21, + 0x40, 0xea, 0x01, 0x4a, 0x53, 0xe0, 0x5c, 0x48, 0x00, 0x21, 0x41, 0x70, + 0x94, 0xf8, 0x46, 0x00, 0x01, 0x28, 0x30, 0xd1, 0x30, 0x46, 0x41, 0x46, + 0xff, 0xf7, 0xf0, 0xfc, 0x0b, 0xe0, 0x94, 0xf8, 0x46, 0x00, 0x01, 0x28, + 0x2b, 0xd1, 0x30, 0x46, 0x41, 0x46, 0x02, 0x22, 0xff, 0xf7, 0xce, 0xfc, + 0x51, 0x49, 0x01, 0x22, 0x4a, 0x70, 0x21, 0x78, 0x62, 0x78, 0xa3, 0x78, + 0xe4, 0x78, 0x43, 0xea, 0x04, 0x23, 0x41, 0xea, 0x02, 0x21, 0x41, 0xea, + 0x03, 0x45, 0xff, 0xf7, 0xb3, 0xfd, 0x04, 0x46, 0x8d, 0xb3, 0x28, 0x46, + 0xf9, 0xf7, 0x88, 0xfa, 0x00, 0xf0, 0x28, 0xfd, 0xff, 0xf7, 0xaa, 0xfd, + 0x01, 0x46, 0x20, 0x46, 0xf9, 0xf7, 0x74, 0xfa, 0x24, 0xe0, 0x00, 0x20, + 0x40, 0xf2, 0xaf, 0x11, 0xfc, 0xf7, 0x06, 0xff, 0x1b, 0xe0, 0x30, 0x46, + 0x41, 0x46, 0x00, 0x22, 0x06, 0xe0, 0x3e, 0x48, 0x40, 0x78, 0x01, 0x28, + 0xa3, 0xd1, 0x30, 0x46, 0x41, 0x46, 0x02, 0x22, 0xff, 0xf7, 0x9e, 0xfc, + 0x82, 0x46, 0x0c, 0xe0, 0x09, 0xeb, 0x88, 0x00, 0x10, 0xf8, 0x1c, 0x1f, + 0x42, 0x78, 0x83, 0x78, 0xc0, 0x78, 0x41, 0xea, 0x02, 0x21, 0x43, 0xea, + 0x00, 0x20, 0x41, 0xea, 0x00, 0x4a, 0x50, 0x46, 0xff, 0xf7, 0x80, 0xfd, + 0x04, 0x46, 0x08, 0x4d, 0x20, 0x46, 0x29, 0x46, 0xf9, 0xf7, 0x48, 0xfa, + 0x00, 0xf0, 0xf4, 0xfc, 0xf9, 0xf7, 0x50, 0xfa, 0x29, 0x46, 0xf9, 0xf7, + 0x53, 0xfa, 0xbd, 0xe8, 0xf0, 0x87, 0x00, 0xbf, 0xd0, 0xe2, 0x05, 0x00, + 0x00, 0x00, 0xc8, 0x42, 0xf8, 0xb5, 0x42, 0x4c, 0x42, 0x4d, 0x2c, 0x21, + 0xb4, 0xf8, 0x5c, 0x00, 0x01, 0x30, 0xa4, 0xf8, 0x5c, 0x00, 0x72, 0xb6, + 0x28, 0x68, 0x40, 0x00, 0x01, 0x30, 0x28, 0x60, 0x04, 0xf1, 0x90, 0x00, + 0xf9, 0xf7, 0x04, 0xfa, 0x1d, 0x4e, 0x00, 0x27, 0x04, 0xf1, 0xbc, 0x00, + 0x2c, 0x21, 0xb7, 0x70, 0xf9, 0xf7, 0xfc, 0xf9, 0x05, 0x48, 0xf7, 0x70, + 0x00, 0x68, 0xc4, 0xf8, 0xbc, 0x00, 0x28, 0x68, 0x40, 0x08, 0x28, 0x60, + 0x28, 0x68, 0x80, 0xf3, 0x10, 0x88, 0xf8, 0xbd, 0x24, 0x20, 0x00, 0x40, + 0x2e, 0x49, 0x81, 0xf8, 0x5e, 0x00, 0x70, 0x47, 0x0f, 0x48, 0x10, 0x49, + 0x00, 0x68, 0x09, 0x78, 0x01, 0x29, 0x0a, 0xd0, 0x69, 0xb9, 0x50, 0x28, + 0x03, 0xd0, 0x14, 0x28, 0x0a, 0xd0, 0x10, 0x28, 0x0d, 0xd1, 0x26, 0x48, + 0x4f, 0xf4, 0x80, 0x71, 0x06, 0xe0, 0x24, 0x48, 0x02, 0x21, 0x80, 0xf8, + 0x54, 0x10, 0x70, 0x47, 0x21, 0x48, 0x01, 0x21, 0xa0, 0xf8, 0x54, 0x10, + 0x70, 0x47, 0x00, 0x20, 0x40, 0xf2, 0x31, 0x21, 0xfc, 0xf7, 0x86, 0xbe, + 0x00, 0xc0, 0x00, 0x40, 0x34, 0xe4, 0x05, 0x00, 0xb0, 0xb5, 0x1a, 0x4a, + 0x92, 0xf8, 0x5f, 0x10, 0x01, 0x29, 0x18, 0xbf, 0xb0, 0xbd, 0x18, 0x4c, + 0x72, 0xb6, 0x21, 0x68, 0x49, 0x00, 0x01, 0x31, 0x21, 0x60, 0xf8, 0x49, + 0x0b, 0x78, 0x83, 0x42, 0x06, 0xd1, 0x20, 0x68, 0x40, 0x08, 0x20, 0x60, + 0x20, 0x68, 0x80, 0xf3, 0x10, 0x88, 0xb0, 0xbd, 0x02, 0xf1, 0x17, 0x05, + 0x95, 0xf8, 0x3f, 0x20, 0xca, 0x70, 0x8a, 0x70, 0x23, 0xb9, 0x95, 0xf8, + 0x40, 0x30, 0x1a, 0x43, 0xca, 0x70, 0x8a, 0x70, 0x00, 0x22, 0x08, 0x70, + 0xc5, 0xf8, 0x3d, 0x20, 0xff, 0xf7, 0xb2, 0xff, 0x20, 0x68, 0x40, 0x08, + 0x20, 0x60, 0x20, 0x68, 0x80, 0xf3, 0x10, 0x88, 0x28, 0x78, 0xbd, 0xe8, + 0xb0, 0x40, 0xff, 0xf7, 0x0b, 0xbe, 0x00, 0xbf, 0xd0, 0xe2, 0x05, 0x00, + 0x24, 0x36, 0x01, 0x00, 0x10, 0xb5, 0x2d, 0x20, 0x00, 0x21, 0x00, 0x24, + 0xfc, 0xf7, 0x48, 0xfe, 0x2e, 0x20, 0x00, 0x21, 0xfc, 0xf7, 0x44, 0xfe, + 0xd9, 0x48, 0xec, 0x21, 0xf9, 0xf7, 0x7e, 0xf9, 0xff, 0xf7, 0x92, 0xff, + 0xd9, 0x48, 0xc4, 0x70, 0x44, 0x70, 0x84, 0x70, 0x10, 0xbd, 0x00, 0xbf, + 0x2d, 0xe9, 0xf0, 0x41, 0x8c, 0xb0, 0x02, 0xac, 0x05, 0x46, 0x28, 0x21, + 0x20, 0x46, 0xf9, 0xf7, 0x6d, 0xf9, 0x68, 0x1e, 0x02, 0x28, 0x79, 0xd2, + 0xcd, 0x4e, 0x30, 0x88, 0x20, 0xb9, 0x00, 0x20, 0x4f, 0xf4, 0x1c, 0x71, + 0xfc, 0xf7, 0x1e, 0xfe, 0x96, 0xf8, 0x5e, 0x00, 0xd8, 0xb9, 0xdf, 0xf8, + 0xe8, 0x80, 0xb2, 0x88, 0x01, 0x20, 0x00, 0x27, 0x00, 0x21, 0x86, 0xf8, + 0x5e, 0x00, 0x2d, 0x20, 0xcd, 0xe9, 0x00, 0x77, 0xd8, 0xf8, 0x00, 0xc0, + 0x13, 0x46, 0xe0, 0x47, 0x70, 0x88, 0x4f, 0xf4, 0x7a, 0x71, 0xd8, 0xf8, + 0x00, 0xc0, 0xcd, 0xe9, 0x00, 0x77, 0x00, 0xfb, 0x01, 0xf2, 0x2e, 0x20, + 0x00, 0x21, 0x13, 0x46, 0xe0, 0x47, 0xa8, 0x1e, 0xb0, 0xfa, 0x80, 0xf0, + 0x40, 0x09, 0xf0, 0x72, 0xf0, 0x7d, 0xff, 0xf7, 0xb5, 0xfd, 0x04, 0xf1, + 0x08, 0x00, 0x00, 0x21, 0x4f, 0xf4, 0x00, 0x42, 0x01, 0x31, 0x04, 0xc0, + 0x08, 0x29, 0xfb, 0xd1, 0x08, 0x20, 0x21, 0x1d, 0xb3, 0x4c, 0x01, 0x22, + 0x03, 0x90, 0xb6, 0xf9, 0x58, 0x00, 0x23, 0x78, 0x04, 0x90, 0x96, 0xf8, + 0x54, 0x00, 0x02, 0xfa, 0x00, 0xf0, 0x8d, 0xf8, 0x08, 0x00, 0x43, 0xb9, + 0xb6, 0xf9, 0x5a, 0x30, 0x05, 0x93, 0x96, 0xf8, 0x55, 0x30, 0x9a, 0x40, + 0x10, 0x43, 0x8d, 0xf8, 0x08, 0x00, 0xc0, 0xb2, 0xff, 0xf7, 0x59, 0xfc, + 0xb6, 0xf9, 0x58, 0x10, 0x04, 0x20, 0x91, 0xfb, 0xf0, 0xf1, 0x09, 0xb2, + 0x04, 0x91, 0x21, 0x78, 0x29, 0xb9, 0xb6, 0xf9, 0x5a, 0x10, 0x91, 0xfb, + 0xf0, 0xf0, 0x00, 0xb2, 0x05, 0x90, 0x0f, 0x48, 0x02, 0xab, 0x01, 0x21, + 0x01, 0x22, 0x01, 0x24, 0x05, 0x68, 0x28, 0x20, 0x00, 0x90, 0x40, 0xf2, + 0x36, 0x70, 0xa8, 0x47, 0x96, 0xf8, 0x5f, 0x00, 0x01, 0x28, 0x04, 0xd0, + 0x96, 0x48, 0x00, 0x68, 0x70, 0x66, 0xc6, 0xf8, 0xbc, 0x00, 0x86, 0xf8, + 0x5f, 0x40, 0x02, 0xe0, 0x0d, 0xb9, 0xff, 0xf7, 0x61, 0xff, 0x0c, 0xb0, + 0xbd, 0xe8, 0xf0, 0x81, 0xcc, 0x9b, 0x08, 0x00, 0xa0, 0xa0, 0x08, 0x00, + 0x70, 0x47, 0x00, 0xbf, 0x2d, 0xe9, 0xfc, 0x41, 0x04, 0x46, 0x89, 0x48, + 0x90, 0xf8, 0x5f, 0x10, 0x01, 0x29, 0x18, 0xbf, 0xbd, 0xe8, 0xfc, 0x81, + 0x85, 0x1c, 0x37, 0x21, 0x22, 0x46, 0x37, 0x23, 0x05, 0xf1, 0x0f, 0x00, + 0xf6, 0xf7, 0x3e, 0xff, 0x95, 0xf8, 0x5c, 0x00, 0x01, 0x28, 0x23, 0xd0, + 0x03, 0x28, 0x05, 0xd0, 0x02, 0x28, 0x40, 0xd1, 0x2e, 0x20, 0x00, 0x21, + 0xfc, 0xf7, 0x88, 0xfd, 0xdf, 0xf8, 0x80, 0x80, 0x6a, 0x88, 0x01, 0x20, + 0x00, 0x26, 0x00, 0x21, 0x85, 0xf8, 0x5c, 0x00, 0x2d, 0x20, 0xd8, 0xf8, + 0x00, 0x70, 0x13, 0x46, 0xcd, 0xe9, 0x00, 0x66, 0xb8, 0x47, 0x28, 0x88, + 0x4f, 0xf4, 0x7a, 0x71, 0xd8, 0xf8, 0x00, 0x70, 0xcd, 0xe9, 0x00, 0x66, + 0x00, 0xfb, 0x01, 0xf2, 0x2e, 0x20, 0x00, 0x21, 0x13, 0x46, 0xb8, 0x47, + 0x2d, 0x20, 0x00, 0x21, 0x00, 0x26, 0xfc, 0xf7, 0x67, 0xfd, 0xdf, 0xf8, + 0x40, 0x80, 0x6a, 0x88, 0x2d, 0x20, 0x00, 0x21, 0xd8, 0xf8, 0x00, 0x70, + 0x13, 0x46, 0xcd, 0xe9, 0x00, 0x66, 0xb8, 0x47, 0x2e, 0x20, 0x00, 0x21, + 0xfc, 0xf7, 0x58, 0xfd, 0x28, 0x88, 0x4f, 0xf4, 0x7a, 0x71, 0xd8, 0xf8, + 0x00, 0x70, 0xcd, 0xe9, 0x00, 0x66, 0x00, 0xfb, 0x01, 0xf2, 0x2e, 0x20, + 0x00, 0x21, 0x13, 0x46, 0xb8, 0x47, 0xa0, 0x79, 0xbd, 0xe8, 0xfc, 0x41, + 0xff, 0xf7, 0xfe, 0xbc, 0xcc, 0x9b, 0x08, 0x00, 0x59, 0x49, 0xca, 0x7d, + 0x82, 0x42, 0x06, 0xd0, 0xc8, 0x75, 0x91, 0xf8, 0x5f, 0x10, 0x01, 0x29, + 0x08, 0xbf, 0xff, 0xf7, 0xf1, 0xbc, 0x70, 0x47, 0x10, 0xb5, 0x53, 0x4c, + 0x02, 0x46, 0x11, 0x21, 0x11, 0x23, 0x20, 0x46, 0xf6, 0xf7, 0xda, 0xfe, + 0x94, 0xf8, 0x5f, 0x00, 0x01, 0x28, 0x18, 0xbf, 0x10, 0xbd, 0xe0, 0x7d, + 0xbd, 0xe8, 0x10, 0x40, 0xff, 0xf7, 0xde, 0xbc, 0x04, 0x48, 0x05, 0x49, + 0x00, 0x68, 0x09, 0x68, 0x88, 0x42, 0x8e, 0xbf, 0x40, 0x1a, 0xc9, 0x43, + 0x08, 0x44, 0x70, 0x47, 0x2c, 0x23, 0x21, 0x40, 0x1c, 0x23, 0x21, 0x40, + 0x2d, 0xe9, 0xf0, 0x41, 0x42, 0x4f, 0x0c, 0x46, 0x97, 0xf8, 0x5f, 0x10, + 0x01, 0x29, 0x7d, 0xd1, 0x15, 0x46, 0xf9, 0xf7, 0x7b, 0xf8, 0x3f, 0x49, + 0xf9, 0xf7, 0x7e, 0xf8, 0x06, 0x46, 0x3e, 0x48, 0xd0, 0xf8, 0x00, 0x80, + 0x28, 0x46, 0xff, 0xf7, 0xbb, 0xfb, 0x01, 0x46, 0x30, 0x46, 0xf9, 0xf7, + 0x61, 0xf8, 0x07, 0xeb, 0x84, 0x06, 0x05, 0x46, 0x30, 0x6f, 0xd6, 0xf8, + 0xc8, 0x40, 0x29, 0x46, 0xf9, 0xf7, 0x5e, 0xf8, 0x30, 0x67, 0x28, 0x46, + 0x21, 0x46, 0xf9, 0xf7, 0x59, 0xf8, 0xc6, 0xf8, 0xc8, 0x00, 0xb8, 0x79, + 0x43, 0xf6, 0x09, 0x51, 0x10, 0xfb, 0x01, 0xf0, 0xd7, 0xf8, 0xbc, 0x10, + 0xa8, 0xeb, 0x01, 0x01, 0xb1, 0xeb, 0x80, 0x1f, 0x1b, 0xd9, 0x97, 0xf8, + 0xe8, 0x10, 0xc8, 0x07, 0x4f, 0xf0, 0x00, 0x00, 0x16, 0xd1, 0x41, 0xf0, + 0x01, 0x01, 0x87, 0xf8, 0xe8, 0x10, 0xd7, 0xf8, 0xc8, 0x10, 0xc7, 0xf8, + 0xc8, 0x00, 0x25, 0x48, 0x00, 0x78, 0xc7, 0xf8, 0xc0, 0x10, 0x30, 0xb9, + 0xd7, 0xf8, 0xcc, 0x00, 0x00, 0x21, 0xc7, 0xf8, 0xcc, 0x10, 0xc7, 0xf8, + 0xc4, 0x00, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x39, 0x88, 0x4f, 0xf4, + 0x7a, 0x72, 0x51, 0x43, 0x7a, 0x6e, 0xa8, 0xeb, 0x02, 0x02, 0x8a, 0x42, + 0x13, 0xd9, 0x97, 0xf8, 0xe8, 0x10, 0x8a, 0x07, 0x0f, 0xd4, 0x3a, 0x6f, + 0x41, 0xf0, 0x02, 0x01, 0x87, 0xf8, 0xe8, 0x10, 0x00, 0x21, 0xba, 0x66, + 0x13, 0x4a, 0x39, 0x67, 0x12, 0x78, 0x12, 0xb9, 0x7a, 0x6f, 0x79, 0x67, + 0xfa, 0x66, 0x84, 0x1c, 0x01, 0xe0, 0xa8, 0xb1, 0x01, 0x24, 0x0f, 0x48, + 0x01, 0x68, 0x14, 0x20, 0x88, 0x47, 0x78, 0xb1, 0xca, 0x21, 0x04, 0x72, + 0xc0, 0xf8, 0x04, 0x80, 0x01, 0x70, 0x0b, 0x49, 0x60, 0x31, 0xf9, 0xf7, + 0x19, 0xf8, 0x0a, 0x48, 0x05, 0x21, 0x00, 0x78, 0xbd, 0xe8, 0xf0, 0x41, + 0xf6, 0xf7, 0x42, 0xbe, 0xbd, 0xe8, 0xf0, 0x81, 0xd0, 0xe2, 0x05, 0x00, + 0x00, 0x00, 0x7a, 0x44, 0x24, 0x20, 0x00, 0x40, 0x34, 0xe4, 0x05, 0x00, + 0xd4, 0x9b, 0x08, 0x00, 0x2c, 0xba, 0x01, 0x00, 0x67, 0x34, 0x01, 0x00, + 0x2d, 0xe9, 0xf0, 0x4f, 0x97, 0xb0, 0x0d, 0xf1, 0x38, 0x09, 0x8a, 0x46, + 0x06, 0x46, 0x24, 0x21, 0x48, 0x46, 0xf8, 0xf7, 0xb5, 0xff, 0x0d, 0xf1, + 0x10, 0x08, 0x28, 0x21, 0x40, 0x46, 0xf8, 0xf7, 0xaf, 0xff, 0xe8, 0x49, + 0x91, 0xf8, 0x5f, 0x00, 0x01, 0x28, 0x40, 0xf0, 0xc8, 0x81, 0x01, 0xf1, + 0x06, 0x0b, 0x5f, 0xea, 0xca, 0x70, 0x9b, 0xf8, 0x06, 0x70, 0xcd, 0xe9, + 0x02, 0x76, 0x00, 0xf0, 0xd8, 0x80, 0xdb, 0xf8, 0xb6, 0x00, 0x4f, 0xf4, + 0x7a, 0x71, 0xdb, 0xf8, 0xba, 0x50, 0x30, 0x1a, 0xb0, 0xfb, 0xf1, 0xf0, + 0xf8, 0xf7, 0xc4, 0xff, 0x04, 0x46, 0x28, 0x46, 0x21, 0x46, 0xf8, 0xf7, + 0xc5, 0xff, 0xd9, 0x4d, 0xcb, 0xf8, 0xba, 0x00, 0x28, 0x78, 0x30, 0xb9, + 0xdb, 0xf8, 0xbe, 0x00, 0x21, 0x46, 0xf8, 0xf7, 0xbb, 0xff, 0xcb, 0xf8, + 0xbe, 0x00, 0x01, 0x20, 0x01, 0x24, 0x00, 0xf0, 0xab, 0xf9, 0xbb, 0xf8, + 0x56, 0x00, 0xad, 0xf8, 0x38, 0x00, 0x9b, 0xf8, 0x11, 0x00, 0x8d, 0xf8, + 0x3e, 0x00, 0x07, 0xf0, 0xfe, 0x00, 0x02, 0x28, 0x08, 0xd1, 0x28, 0x78, + 0x9b, 0xf8, 0x50, 0x40, 0x8d, 0xf8, 0x43, 0x40, 0x20, 0xb9, 0x9b, 0xf8, + 0x51, 0x00, 0x04, 0x43, 0x8d, 0xf8, 0x43, 0x40, 0x4f, 0xf0, 0x00, 0x08, + 0xe8, 0x78, 0xdb, 0xf8, 0xde, 0x20, 0xdb, 0xf8, 0xb6, 0x10, 0x85, 0xf8, + 0x03, 0x80, 0x09, 0xf1, 0x07, 0x05, 0x2b, 0x46, 0x16, 0x0e, 0x20, 0x43, + 0x03, 0xf8, 0x02, 0x2b, 0x8d, 0xf8, 0x43, 0x00, 0x5e, 0x70, 0x16, 0x0c, + 0x12, 0x0a, 0x1e, 0x70, 0x03, 0x9e, 0x05, 0x23, 0x8d, 0xf8, 0x40, 0x20, + 0x11, 0x93, 0x14, 0x23, 0x70, 0x1a, 0x4f, 0xf4, 0x7a, 0x71, 0xb0, 0xfb, + 0xf1, 0xf0, 0xb4, 0x49, 0x01, 0xf1, 0xd0, 0x04, 0xad, 0xf8, 0x3a, 0x00, + 0x00, 0x0c, 0x14, 0x21, 0xad, 0xf8, 0x3c, 0x00, 0x09, 0xf1, 0x10, 0x00, + 0x22, 0x46, 0xf6, 0xf7, 0xa5, 0xfd, 0x58, 0x46, 0x10, 0xf8, 0x01, 0x1f, + 0x42, 0x78, 0x83, 0x78, 0xc0, 0x78, 0x41, 0xea, 0x02, 0x21, 0x43, 0xea, + 0x00, 0x20, 0x41, 0xea, 0x00, 0x40, 0x10, 0x21, 0x09, 0xeb, 0x01, 0x03, + 0x39, 0xf8, 0x01, 0x20, 0x5b, 0x88, 0x42, 0xea, 0x03, 0x42, 0x90, 0x42, + 0x06, 0xd3, 0x08, 0xf1, 0x01, 0x08, 0x04, 0x31, 0xb8, 0xf1, 0x05, 0x0f, + 0xf0, 0xd1, 0x34, 0xe0, 0x48, 0x46, 0xff, 0xf7, 0x4b, 0xfa, 0xeb, 0x49, + 0x04, 0xaf, 0x22, 0x46, 0x14, 0x23, 0xd1, 0xe9, 0x30, 0x01, 0xcd, 0xe9, + 0x06, 0x01, 0x07, 0xf1, 0x10, 0x00, 0x14, 0x21, 0xf6, 0xf7, 0x78, 0xfd, + 0x9d, 0xf8, 0x43, 0x10, 0xbd, 0xf8, 0x3a, 0x20, 0x01, 0x20, 0x3b, 0x46, + 0x8d, 0xf8, 0x10, 0x00, 0x9d, 0xf8, 0x40, 0x00, 0x8d, 0xf8, 0x11, 0x10, + 0xbd, 0xf8, 0x3c, 0x10, 0x42, 0xea, 0x01, 0x41, 0x05, 0x91, 0x15, 0xf8, + 0x02, 0x1b, 0x41, 0xea, 0x00, 0x20, 0x29, 0x78, 0x6a, 0x78, 0x41, 0xea, + 0x02, 0x21, 0x00, 0x22, 0x40, 0xea, 0x01, 0x40, 0x01, 0x21, 0x0d, 0x90, + 0x89, 0x48, 0x04, 0x68, 0x28, 0x20, 0x00, 0x90, 0x4f, 0xf4, 0xe7, 0x60, + 0xa0, 0x47, 0x87, 0x4c, 0x01, 0x20, 0x01, 0x21, 0x00, 0x22, 0x20, 0x70, + 0x83, 0x48, 0x23, 0x46, 0x05, 0x68, 0x3c, 0x20, 0x00, 0x90, 0x40, 0xf2, + 0x39, 0x70, 0xa8, 0x47, 0xcb, 0x48, 0x28, 0x21, 0xc0, 0x30, 0xf8, 0xf7, + 0xd5, 0xfe, 0x20, 0x46, 0x3c, 0x21, 0xf8, 0xf7, 0xd1, 0xfe, 0x9b, 0xf8, + 0xe2, 0x00, 0x0d, 0xf1, 0x10, 0x08, 0xcb, 0xf8, 0xb6, 0x60, 0x00, 0xf0, + 0xfe, 0x00, 0x8b, 0xf8, 0xe2, 0x00, 0x5f, 0xea, 0x8a, 0x70, 0x40, 0xf1, + 0xe2, 0x80, 0x9b, 0xf8, 0x00, 0x00, 0x43, 0xf6, 0x09, 0x51, 0x10, 0xfb, + 0x01, 0xf2, 0xdb, 0xf8, 0x8a, 0x10, 0xdb, 0xf8, 0x5e, 0x00, 0x0b, 0x46, + 0x00, 0x29, 0x08, 0xbf, 0x03, 0x46, 0xf3, 0x1a, 0xb3, 0xeb, 0x82, 0x1f, + 0x0d, 0xd9, 0xb7, 0x48, 0x54, 0x21, 0x68, 0x30, 0xf8, 0xf7, 0xac, 0xfe, + 0x9b, 0xf8, 0xe2, 0x00, 0xcb, 0xf8, 0x5e, 0x60, 0x00, 0xf0, 0xfd, 0x00, + 0x8b, 0xf8, 0xe2, 0x00, 0xc1, 0xe0, 0x09, 0xb9, 0xcb, 0xf8, 0x8a, 0x00, + 0x30, 0x1a, 0x4f, 0xf4, 0x7a, 0x71, 0xb0, 0xfb, 0xf1, 0xf0, 0xf8, 0xf7, + 0xc9, 0xfe, 0xdf, 0xf8, 0x74, 0xa1, 0x04, 0x46, 0x00, 0x26, 0x0a, 0xeb, + 0x86, 0x07, 0x21, 0x46, 0xb8, 0x6e, 0xd7, 0xf8, 0x94, 0x50, 0xf8, 0xf7, + 0xc3, 0xfe, 0x29, 0x46, 0xb8, 0x66, 0xf8, 0xf7, 0xb3, 0xfe, 0x00, 0x2e, + 0x4f, 0xf0, 0x01, 0x06, 0xc7, 0xf8, 0x94, 0x00, 0xed, 0xd0, 0x56, 0x48, + 0x00, 0x21, 0x01, 0x70, 0x0a, 0xf1, 0x64, 0x00, 0x2c, 0x21, 0xf8, 0xf7, + 0x7b, 0xfe, 0x00, 0x20, 0x00, 0xf0, 0xa4, 0xf8, 0xbb, 0xf8, 0x56, 0x00, + 0xad, 0xf8, 0x38, 0x00, 0x9b, 0xf8, 0x11, 0x00, 0x8d, 0xf8, 0x3e, 0x00, + 0x02, 0x98, 0x00, 0xf0, 0xfe, 0x00, 0x02, 0x28, 0x0b, 0xd1, 0x97, 0x49, + 0x9b, 0xf8, 0x50, 0x00, 0x47, 0x46, 0x09, 0x78, 0x8d, 0xf8, 0x43, 0x00, + 0x39, 0xb9, 0x9b, 0xf8, 0x51, 0x10, 0x08, 0x43, 0x01, 0xe0, 0x01, 0x20, + 0x47, 0x46, 0x8d, 0xf8, 0x43, 0x00, 0x09, 0xf1, 0x07, 0x05, 0xdb, 0xf8, + 0xb2, 0x20, 0x8d, 0x4e, 0xdb, 0xf8, 0x8a, 0x10, 0x2b, 0x46, 0x03, 0xf8, + 0x02, 0x2b, 0x14, 0x0e, 0x5c, 0x70, 0x14, 0x0c, 0x12, 0x0a, 0x8d, 0xf8, + 0x40, 0x20, 0xb2, 0x78, 0x1c, 0x70, 0x05, 0x23, 0x0a, 0xf1, 0xa4, 0x04, + 0x11, 0x93, 0x14, 0x23, 0x10, 0x43, 0x22, 0x46, 0x8d, 0xf8, 0x43, 0x00, + 0x03, 0x98, 0x40, 0x1a, 0x4f, 0xf4, 0x7a, 0x71, 0xb0, 0xfb, 0xf1, 0xf0, + 0x14, 0x21, 0xad, 0xf8, 0x3a, 0x00, 0x00, 0x0c, 0xad, 0xf8, 0x3c, 0x00, + 0x09, 0xf1, 0x10, 0x00, 0xf6, 0xf7, 0x9c, 0xfc, 0x48, 0x46, 0xfa, 0xf7, + 0x63, 0xf8, 0xda, 0xf8, 0x94, 0x00, 0x06, 0x90, 0x30, 0x78, 0x01, 0x28, + 0x02, 0xd0, 0xda, 0xf8, 0x98, 0x00, 0x07, 0x90, 0x07, 0xf1, 0x10, 0x00, + 0x14, 0x21, 0x22, 0x46, 0x14, 0x23, 0xf6, 0xf7, 0x89, 0xfc, 0x03, 0x98, + 0x9d, 0xf8, 0x43, 0x10, 0xbd, 0xf8, 0x3a, 0x20, 0x20, 0x4c, 0xcb, 0xf8, + 0x5e, 0x00, 0x9b, 0xf8, 0xe2, 0x00, 0x8d, 0xf8, 0x11, 0x10, 0xbd, 0xf8, + 0x3c, 0x10, 0x23, 0x46, 0x00, 0xf0, 0xfd, 0x00, 0x42, 0xea, 0x01, 0x41, + 0x8b, 0xf8, 0xe2, 0x00, 0x00, 0x20, 0x05, 0x91, 0x15, 0xf8, 0x02, 0x1b, + 0x8d, 0xf8, 0x10, 0x00, 0x9d, 0xf8, 0x40, 0x00, 0x6a, 0x78, 0x41, 0xea, + 0x00, 0x20, 0x29, 0x78, 0x10, 0x4d, 0x41, 0xea, 0x02, 0x21, 0x2e, 0x68, + 0x00, 0x22, 0x40, 0xea, 0x01, 0x40, 0x01, 0x21, 0x0d, 0x90, 0x3c, 0x20, + 0x00, 0x90, 0x40, 0xf2, 0x39, 0x70, 0xb0, 0x47, 0x28, 0x20, 0x2d, 0x68, + 0x01, 0x21, 0x00, 0x22, 0x3b, 0x46, 0x00, 0x90, 0x4f, 0xf4, 0xe7, 0x60, + 0xa8, 0x47, 0x20, 0x46, 0x3c, 0x21, 0xf8, 0xf7, 0xe1, 0xfd, 0x17, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0xd0, 0xe2, 0x05, 0x00, 0x34, 0xe4, 0x05, 0x00, + 0xa0, 0xa0, 0x08, 0x00, 0xbc, 0xe3, 0x05, 0x00, 0xf8, 0xe3, 0x05, 0x00, + 0x2d, 0xe9, 0xfe, 0x4f, 0x47, 0x4f, 0x97, 0xf8, 0x5f, 0x10, 0x00, 0x29, + 0x00, 0xf0, 0x80, 0x80, 0x97, 0xf8, 0x0c, 0x90, 0x01, 0x28, 0x06, 0xd0, + 0x00, 0x28, 0x7b, 0xd1, 0xba, 0x46, 0x43, 0x4d, 0x3a, 0xf8, 0x90, 0x6b, + 0x07, 0xe0, 0xb8, 0x79, 0x4f, 0xf4, 0x7a, 0x71, 0x3e, 0x4d, 0x07, 0xf1, + 0xbc, 0x0a, 0x10, 0xfb, 0x01, 0xf6, 0x0a, 0xf1, 0x14, 0x04, 0x18, 0x21, + 0x20, 0x46, 0xf9, 0xf7, 0x67, 0xfa, 0x30, 0x46, 0xf8, 0xf7, 0xe0, 0xfd, + 0x29, 0x46, 0xf8, 0xf7, 0xe3, 0xfd, 0x02, 0x90, 0x09, 0xf0, 0xfe, 0x00, + 0x00, 0x25, 0x01, 0x90, 0x35, 0x48, 0x90, 0xf8, 0x00, 0xb0, 0xbb, 0xf1, + 0x01, 0x0f, 0x08, 0xbf, 0x01, 0x2d, 0x53, 0xd0, 0x05, 0xeb, 0x85, 0x00, + 0x04, 0x21, 0x38, 0x44, 0x90, 0xf9, 0x49, 0x00, 0x90, 0xfb, 0xf1, 0xf0, + 0x40, 0xb2, 0xff, 0xf7, 0x0f, 0xf9, 0x01, 0x46, 0x0a, 0xeb, 0x85, 0x00, + 0x40, 0x68, 0xf8, 0xf7, 0xc5, 0xfd, 0x01, 0x46, 0x02, 0x98, 0xf8, 0xf7, + 0xaf, 0xfd, 0x4f, 0xf0, 0x8f, 0x41, 0xf8, 0xf7, 0xab, 0xfd, 0x06, 0x46, + 0x01, 0x98, 0x02, 0x28, 0x1c, 0xd1, 0x78, 0x19, 0x4f, 0xf0, 0x00, 0x09, + 0x00, 0xf1, 0x56, 0x08, 0x98, 0xf8, 0x00, 0x00, 0x20, 0xfa, 0x09, 0xf0, + 0xc0, 0x07, 0x0b, 0xd0, 0x54, 0xf8, 0x29, 0x00, 0xf8, 0xf7, 0xa4, 0xfd, + 0x01, 0x46, 0x30, 0x46, 0xf8, 0xf7, 0x9a, 0xfd, 0x00, 0xf0, 0x40, 0xf8, + 0x44, 0xf8, 0x29, 0x00, 0x09, 0xf1, 0x01, 0x09, 0xb9, 0xf1, 0x05, 0x0f, + 0xe8, 0xd1, 0x09, 0xe0, 0x20, 0x68, 0xf8, 0xf7, 0x93, 0xfd, 0x01, 0x46, + 0x30, 0x46, 0xf8, 0xf7, 0x89, 0xfd, 0x00, 0xf0, 0x2f, 0xf8, 0x20, 0x60, + 0xda, 0xf8, 0x28, 0x00, 0xf8, 0xf7, 0x88, 0xfd, 0x01, 0x46, 0x30, 0x46, + 0xf8, 0xf7, 0x7e, 0xfd, 0x00, 0xf0, 0x24, 0xf8, 0x01, 0x35, 0x07, 0x4f, + 0xca, 0xf8, 0x28, 0x00, 0x02, 0x2d, 0xa6, 0xd1, 0xbd, 0xe8, 0xfe, 0x8f, + 0x00, 0x20, 0x40, 0xf2, 0x4e, 0x41, 0x03, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, + 0xfc, 0xf7, 0xfe, 0xb9, 0xd0, 0xe2, 0x05, 0x00, 0x00, 0x40, 0x9c, 0x45, + 0x00, 0x00, 0xfa, 0x43, 0x34, 0xe4, 0x05, 0x00, 0x4b, 0xf2, 0xe1, 0x7c, + 0xc1, 0xf2, 0x12, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4b, 0xf2, 0xf5, 0x7c, + 0xc1, 0xf2, 0x12, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4b, 0xf6, 0xb1, 0x5c, + 0xc1, 0xf2, 0x12, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4b, 0xf6, 0xf1, 0x5c, + 0xc1, 0xf2, 0x12, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x6f, 0x12, 0x83, 0x3a, + 0x87, 0x02, 0xa5, 0x3a, 0x31, 0xbc, 0xcf, 0x3a, 0xf2, 0xc2, 0x02, 0x3b, + 0x76, 0x9e, 0x24, 0x3b, 0x37, 0x3e, 0x4f, 0x3b, 0xa6, 0x73, 0x82, 0x3b, + 0xa2, 0x3a, 0xa4, 0x3b, 0x8a, 0xc0, 0xce, 0x3b, 0x8a, 0x24, 0x02, 0x3c, + 0x0a, 0xd7, 0x23, 0x3c, 0x29, 0x43, 0x4e, 0x3c, 0x9f, 0xd5, 0x81, 0x3c, + 0xaf, 0x73, 0xa3, 0x3c, 0x14, 0xc6, 0xcd, 0x3c, 0xe2, 0x86, 0x01, 0x3d, + 0x90, 0x10, 0x23, 0x3d, 0x4a, 0x49, 0x4d, 0x3d, 0x56, 0x38, 0x81, 0x3d, + 0xad, 0xad, 0xa2, 0x3d, 0xcd, 0xcc, 0xcc, 0x3d, 0xf9, 0xe9, 0x00, 0x3e, + 0x06, 0x4b, 0x22, 0x3e, 0x9b, 0x50, 0x4c, 0x3e, 0xcc, 0x9b, 0x80, 0x3e, + 0x9b, 0xe8, 0xa1, 0x3e, 0xb4, 0xd4, 0xcb, 0x3e, 0xce, 0x4d, 0x00, 0x3f, + 0x6c, 0x86, 0x21, 0x3f, 0x18, 0x59, 0x4b, 0x3f, 0x00, 0x00, 0x80, 0x3f, + 0x78, 0x24, 0xa1, 0x3f, 0xc8, 0xdd, 0xca, 0x3f, 0xc1, 0x64, 0xff, 0x3f, + 0xbf, 0xc2, 0x20, 0x40, 0xc2, 0x62, 0x4a, 0x40, 0xe1, 0xc9, 0x7e, 0x40, + 0x42, 0x61, 0xa0, 0x40, 0x07, 0xe8, 0xc9, 0x40, 0x5e, 0x2f, 0xfe, 0x40, + 0x00, 0x00, 0x20, 0x41, 0x96, 0x6d, 0x49, 0x41, 0x3a, 0x95, 0x7d, 0x41, + 0xf9, 0x9e, 0x9f, 0x41, 0x6f, 0xf3, 0xc8, 0x41, 0x72, 0xfb, 0xfc, 0x41, + 0x2d, 0x3e, 0x1f, 0x42, 0x93, 0x79, 0x48, 0x42, 0x08, 0x62, 0x7c, 0x42, + 0x9b, 0xdd, 0x9e, 0x42, 0x00, 0x00, 0xc8, 0x42, 0x00, 0x00, 0x00, 0x00, + 0x52, 0xb8, 0xfe, 0xbf, 0xec, 0x51, 0xd8, 0xbf, 0x5c, 0x8f, 0xc2, 0xbf, + 0x85, 0xeb, 0xb1, 0xbf, 0x66, 0x66, 0xa6, 0xbf, 0xf6, 0x28, 0x9c, 0xbf, + 0x33, 0x33, 0x93, 0xbf, 0x1f, 0x85, 0x8b, 0xbf, 0xb8, 0x1e, 0x85, 0xbf, + 0xa4, 0x70, 0x7d, 0xbf, 0x33, 0x33, 0x73, 0xbf, 0x1f, 0x85, 0x6b, 0xbf, + 0xae, 0x47, 0x61, 0xbf, 0x9a, 0x99, 0x59, 0xbf, 0x85, 0xeb, 0x51, 0xbf, + 0x71, 0x3d, 0x4a, 0xbf, 0x5c, 0x8f, 0x42, 0xbf, 0xa4, 0x70, 0x3d, 0xbf, + 0xec, 0x51, 0x38, 0xbf, 0xd7, 0xa3, 0x30, 0xbf, 0x1f, 0x85, 0x2b, 0xbf, + 0x66, 0x66, 0x26, 0xbf, 0xae, 0x47, 0x21, 0xbf, 0xf6, 0x28, 0x1c, 0xbf, + 0x9a, 0x99, 0x19, 0xbf, 0xe1, 0x7a, 0x14, 0xbf, 0x29, 0x5c, 0x0f, 0xbf, + 0xcd, 0xcc, 0x0c, 0xbf, 0x14, 0xae, 0x07, 0xbf, 0xb8, 0x1e, 0x05, 0xbf, + 0x00, 0x00, 0x00, 0xbf, 0x48, 0xe1, 0xfa, 0xbe, 0x8f, 0xc2, 0xf5, 0xbe, + 0x1f, 0x85, 0xeb, 0xbe, 0x66, 0x66, 0xe6, 0xbe, 0xae, 0x47, 0xe1, 0xbe, + 0xf6, 0x28, 0xdc, 0xbe, 0x3d, 0x0a, 0xd7, 0xbe, 0xcd, 0xcc, 0xcc, 0xbe, + 0x14, 0xae, 0xc7, 0xbe, 0x5c, 0x8f, 0xc2, 0xbe, 0xa4, 0x70, 0xbd, 0xbe, + 0xec, 0x51, 0xb8, 0xbe, 0x33, 0x33, 0xb3, 0xbe, 0x7b, 0x14, 0xae, 0xbe, + 0xc3, 0xf5, 0xa8, 0xbe, 0x0a, 0xd7, 0xa3, 0xbe, 0x52, 0xb8, 0x9e, 0xbe, + 0x9a, 0x99, 0x99, 0xbe, 0x9a, 0x99, 0x99, 0xbe, 0xe1, 0x7a, 0x94, 0xbe, + 0x29, 0x5c, 0x8f, 0xbe, 0x71, 0x3d, 0x8a, 0xbe, 0xb8, 0x1e, 0x85, 0xbe, + 0x00, 0x00, 0x80, 0xbe, 0x00, 0x00, 0x80, 0xbe, 0x8f, 0xc2, 0x75, 0xbe, + 0x1f, 0x85, 0x6b, 0xbe, 0xae, 0x47, 0x61, 0xbe, 0xae, 0x47, 0x61, 0xbe, + 0x3d, 0x0a, 0x57, 0xbe, 0xcd, 0xcc, 0x4c, 0xbe, 0xcd, 0xcc, 0x4c, 0xbe, + 0x5c, 0x8f, 0x42, 0xbe, 0xec, 0x51, 0x38, 0xbe, 0xec, 0x51, 0x38, 0xbe, + 0x7b, 0x14, 0x2e, 0xbe, 0x0a, 0xd7, 0x23, 0xbe, 0x0a, 0xd7, 0x23, 0xbe, + 0x9a, 0x99, 0x19, 0xbe, 0x29, 0x5c, 0x0f, 0xbe, 0x29, 0x5c, 0x0f, 0xbe, + 0xb8, 0x1e, 0x05, 0xbe, 0xb8, 0x1e, 0x05, 0xbe, 0x8f, 0xc2, 0xf5, 0xbd, + 0xae, 0x47, 0xe1, 0xbd, 0xae, 0x47, 0xe1, 0xbd, 0xcd, 0xcc, 0xcc, 0xbd, + 0xcd, 0xcc, 0xcc, 0xbd, 0xec, 0x51, 0xb8, 0xbd, 0xec, 0x51, 0xb8, 0xbd, + 0x0a, 0xd7, 0xa3, 0xbd, 0x0a, 0xd7, 0xa3, 0xbd, 0x29, 0x5c, 0x8f, 0xbd, + 0x8f, 0xc2, 0x75, 0xbd, 0x8f, 0xc2, 0x75, 0xbd, 0x8f, 0xc2, 0x75, 0xbd, + 0xcd, 0xcc, 0x4c, 0xbd, 0xcd, 0xcc, 0x4c, 0xbd, 0x0a, 0xd7, 0x23, 0xbd, + 0x0a, 0xd7, 0x23, 0xbd, 0x8f, 0xc2, 0xf5, 0xbc, 0x8f, 0xc2, 0xf5, 0xbc, + 0x0a, 0xd7, 0xa3, 0xbc, 0x0a, 0xd7, 0xa3, 0xbc, 0x0a, 0xd7, 0x23, 0xbc, + 0x0a, 0xd7, 0x23, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0a, 0xd7, 0x23, 0x3c, 0x0a, 0xd7, 0x23, 0x3c, 0x0a, 0xd7, 0xa3, 0x3c, + 0x0a, 0xd7, 0xa3, 0x3c, 0x0a, 0xd7, 0xa3, 0x3c, 0x8f, 0xc2, 0xf5, 0x3c, + 0x8f, 0xc2, 0xf5, 0x3c, 0x0a, 0xd7, 0x23, 0x3d, 0x0a, 0xd7, 0x23, 0x3d, + 0x0a, 0xd7, 0x23, 0x3d, 0xcd, 0xcc, 0x4c, 0x3d, 0xcd, 0xcc, 0x4c, 0x3d, + 0x8f, 0xc2, 0x75, 0x3d, 0x8f, 0xc2, 0x75, 0x3d, 0x8f, 0xc2, 0x75, 0x3d, + 0x29, 0x5c, 0x8f, 0x3d, 0x29, 0x5c, 0x8f, 0x3d, 0x29, 0x5c, 0x8f, 0x3d, + 0x0a, 0xd7, 0xa3, 0x3d, 0x0a, 0xd7, 0xa3, 0x3d, 0x0a, 0xd7, 0xa3, 0x3d, + 0xec, 0x51, 0xb8, 0x3d, 0xec, 0x51, 0xb8, 0x3d, 0xcd, 0xcc, 0xcc, 0x3d, + 0xcd, 0xcc, 0xcc, 0x3d, 0xcd, 0xcc, 0xcc, 0x3d, 0xae, 0x47, 0xe1, 0x3d, + 0xae, 0x47, 0xe1, 0x3d, 0xae, 0x47, 0xe1, 0x3d, 0x8f, 0xc2, 0xf5, 0x3d, + 0x8f, 0xc2, 0xf5, 0x3d, 0x8f, 0xc2, 0xf5, 0x3d, 0xb8, 0x1e, 0x05, 0x3e, + 0xb8, 0x1e, 0x05, 0x3e, 0xb8, 0x1e, 0x05, 0x3e, 0xb8, 0x1e, 0x05, 0x3e, + 0x29, 0x5c, 0x0f, 0x3e, 0x29, 0x5c, 0x0f, 0x3e, 0x29, 0x5c, 0x0f, 0x3e, + 0x9a, 0x99, 0x19, 0x3e, 0x9a, 0x99, 0x19, 0x3e, 0x9a, 0x99, 0x19, 0x3e, + 0x0a, 0xd7, 0x23, 0x3e, 0x0a, 0xd7, 0x23, 0x3e, 0x0a, 0xd7, 0x23, 0x3e, + 0x7b, 0x14, 0x2e, 0x3e, 0x7b, 0x14, 0x2e, 0x3e, 0x7b, 0x14, 0x2e, 0x3e, + 0x7b, 0x14, 0x2e, 0x3e, 0xec, 0x51, 0x38, 0x3e, 0xec, 0x51, 0x38, 0x3e, + 0xec, 0x51, 0x38, 0x3e, 0x5c, 0x8f, 0x42, 0x3e, 0x5c, 0x8f, 0x42, 0x3e, + 0x5c, 0x8f, 0x42, 0x3e, 0x5c, 0x8f, 0x42, 0x3e, 0xcd, 0xcc, 0x4c, 0x3e, + 0xcd, 0xcc, 0x4c, 0x3e, 0xcd, 0xcc, 0x4c, 0x3e, 0xcd, 0xcc, 0x4c, 0x3e, + 0x3d, 0x0a, 0x57, 0x3e, 0x3d, 0x0a, 0x57, 0x3e, 0x3d, 0x0a, 0x57, 0x3e, + 0xae, 0x47, 0x61, 0x3e, 0xae, 0x47, 0x61, 0x3e, 0xae, 0x47, 0x61, 0x3e, + 0xae, 0x47, 0x61, 0x3e, 0x1f, 0x85, 0x6b, 0x3e, 0x1f, 0x85, 0x6b, 0x3e, + 0x1f, 0x85, 0x6b, 0x3e, 0x1f, 0x85, 0x6b, 0x3e, 0x8f, 0xc2, 0x75, 0x3e, + 0x8f, 0xc2, 0x75, 0x3e, 0x8f, 0xc2, 0x75, 0x3e, 0x8f, 0xc2, 0x75, 0x3e, + 0x00, 0x00, 0x80, 0x3e, 0x00, 0x00, 0x80, 0x3e, 0x00, 0x00, 0x80, 0x3e, + 0xb8, 0x1e, 0x85, 0x3e, 0xb8, 0x1e, 0x85, 0x3e, 0xb8, 0x1e, 0x85, 0x3e, + 0xb8, 0x1e, 0x85, 0x3e, 0xb8, 0x1e, 0x85, 0x3e, 0xb8, 0x1e, 0x85, 0x3e, + 0x71, 0x3d, 0x8a, 0x3e, 0x71, 0x3d, 0x8a, 0x3e, 0x71, 0x3d, 0x8a, 0x3e, + 0x71, 0x3d, 0x8a, 0x3e, 0x29, 0x5c, 0x8f, 0x3e, 0x29, 0x5c, 0x8f, 0x3e, + 0x29, 0x5c, 0x8f, 0x3e, 0x29, 0x5c, 0x8f, 0x3e, 0xe1, 0x7a, 0x94, 0x3e, + 0xe1, 0x7a, 0x94, 0x3e, 0xe1, 0x7a, 0x94, 0x3e, 0xe1, 0x7a, 0x94, 0x3e, + 0xe1, 0x7a, 0x94, 0x3e, 0x9a, 0x99, 0x99, 0x3e, 0x00, 0x00, 0x30, 0x41, + 0x00, 0x00, 0x30, 0x41, 0x00, 0x00, 0xa0, 0x41, 0x66, 0x66, 0x0e, 0x42, + 0x33, 0x33, 0x33, 0x42, 0x9a, 0x99, 0x83, 0x42, 0x9a, 0x99, 0x88, 0x42, + 0x9a, 0x99, 0xa6, 0x42, 0x9a, 0x99, 0xa6, 0x42, 0x00, 0x00, 0xac, 0x42, + 0x00, 0x00, 0x10, 0x41, 0x00, 0x00, 0x10, 0x41, 0x00, 0x00, 0x10, 0x41, + 0x10, 0xb5, 0xc7, 0x4c, 0xa0, 0x7a, 0x0d, 0x28, 0x88, 0xbf, 0x10, 0xbd, + 0x66, 0x49, 0x0a, 0x68, 0x00, 0x21, 0x90, 0x47, 0x0d, 0x4b, 0xa0, 0x7a, + 0xa1, 0x78, 0x01, 0x22, 0x1c, 0x68, 0x82, 0x40, 0x81, 0x40, 0x11, 0x40, + 0x14, 0x43, 0x1c, 0x60, 0x5c, 0x68, 0x24, 0xea, 0x02, 0x02, 0x11, 0x43, + 0x59, 0x60, 0x07, 0x49, 0x31, 0xf0, 0x88, 0xfd, 0x06, 0x48, 0x01, 0x68, + 0x41, 0xf0, 0x30, 0x01, 0x01, 0x60, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, + 0x07, 0xb8, 0x00, 0xbf, 0x50, 0xf4, 0x00, 0x30, 0x81, 0xad, 0x02, 0x00, + 0x24, 0x40, 0x01, 0x30, 0xb0, 0xb5, 0x19, 0x49, 0xb0, 0x4c, 0xa0, 0x7a, + 0x09, 0x68, 0x88, 0x47, 0x01, 0x46, 0x00, 0x28, 0x88, 0x4d, 0x18, 0xbf, + 0x01, 0x21, 0xa2, 0x78, 0x85, 0xf8, 0x32, 0x10, 0x01, 0x2a, 0x04, 0xbf, + 0xb0, 0xfa, 0x80, 0xf0, 0x41, 0x09, 0x21, 0xb1, 0x29, 0x20, 0x00, 0xf0, + 0x21, 0xf8, 0x01, 0x20, 0x03, 0xe0, 0x2a, 0x20, 0x00, 0xf0, 0x1c, 0xf8, + 0x00, 0x20, 0x85, 0xf8, 0x31, 0x00, 0x00, 0xf0, 0x31, 0xf8, 0x95, 0xf8, + 0x32, 0x20, 0xa0, 0x7a, 0x01, 0x21, 0x00, 0x2a, 0x18, 0xbf, 0x01, 0x22, + 0x81, 0x40, 0x02, 0xfa, 0x00, 0xf0, 0x05, 0x4a, 0x08, 0x40, 0x13, 0x68, + 0x23, 0xea, 0x01, 0x01, 0x08, 0x43, 0x10, 0x60, 0xb0, 0xbd, 0x00, 0xbf, + 0x10, 0xff, 0x08, 0x00, 0x54, 0xf4, 0x00, 0x30, 0x10, 0xb5, 0x7b, 0x49, + 0x09, 0x68, 0x89, 0xb1, 0x09, 0x4a, 0x7b, 0x4b, 0x12, 0x68, 0x1c, 0x78, + 0x41, 0xf8, 0x34, 0x20, 0x01, 0xeb, 0xc4, 0x01, 0x08, 0x71, 0x8f, 0x48, + 0x19, 0x78, 0xc0, 0x88, 0x01, 0x31, 0xca, 0xb2, 0x90, 0x42, 0x98, 0xbf, + 0x00, 0x21, 0x19, 0x70, 0x10, 0xbd, 0x00, 0xbf, 0x24, 0x20, 0x00, 0x40, + 0x63, 0x48, 0x90, 0xf8, 0x31, 0x10, 0x11, 0xb9, 0x90, 0xf8, 0x30, 0x00, + 0x20, 0xb1, 0x04, 0x48, 0x01, 0x21, 0x02, 0x68, 0x0d, 0x20, 0x10, 0x47, + 0x01, 0x48, 0x00, 0x21, 0xf9, 0xe7, 0x00, 0xbf, 0x18, 0x9d, 0x08, 0x00, + 0xf8, 0xb5, 0x7f, 0x49, 0x04, 0x46, 0xc8, 0x7a, 0x0d, 0x28, 0x88, 0xbf, + 0xf8, 0xbd, 0xcd, 0x1c, 0x1d, 0x49, 0x01, 0x27, 0x0a, 0x68, 0x01, 0x21, + 0x90, 0x47, 0x1c, 0x4e, 0x72, 0xb6, 0x30, 0x68, 0x4f, 0xea, 0x40, 0x00, + 0x00, 0xf1, 0x01, 0x00, 0x30, 0x60, 0x54, 0xb1, 0x2b, 0x20, 0xff, 0xf7, + 0xbb, 0xff, 0x4e, 0x48, 0x80, 0xf8, 0x30, 0x70, 0x00, 0xf0, 0x2e, 0xf8, + 0x00, 0xf0, 0x42, 0xf8, 0x06, 0xe0, 0x2c, 0x20, 0xff, 0xf7, 0xb0, 0xff, + 0x48, 0x48, 0x00, 0x21, 0x80, 0xf8, 0x30, 0x10, 0x30, 0x68, 0x40, 0x08, + 0x30, 0x60, 0x30, 0x68, 0x80, 0xf3, 0x10, 0x88, 0x28, 0x78, 0x01, 0x28, + 0x04, 0xbf, 0xb4, 0xfa, 0x84, 0xf0, 0x44, 0x09, 0x2c, 0xb1, 0x2d, 0x20, + 0xff, 0xf7, 0x9c, 0xff, 0x28, 0x7a, 0x07, 0x49, 0x04, 0xe0, 0x2e, 0x20, + 0xff, 0xf7, 0x96, 0xff, 0x28, 0x7a, 0x05, 0x49, 0x09, 0x68, 0xbd, 0xe8, + 0xf8, 0x40, 0x08, 0x47, 0x04, 0xff, 0x08, 0x00, 0x24, 0x36, 0x01, 0x00, + 0x08, 0xff, 0x08, 0x00, 0x0c, 0xff, 0x08, 0x00, 0x80, 0xb5, 0x16, 0x48, + 0x00, 0x21, 0x01, 0x60, 0x06, 0x48, 0x15, 0x49, 0x01, 0x60, 0x06, 0x48, + 0x01, 0x68, 0x07, 0x20, 0x88, 0x47, 0x94, 0x48, 0x01, 0x68, 0x07, 0x20, + 0xbd, 0xe8, 0x80, 0x40, 0x08, 0x47, 0x00, 0xbf, 0x40, 0x22, 0x00, 0x40, + 0xb4, 0x9c, 0x08, 0x00, 0x80, 0xb5, 0x0b, 0x48, 0x0b, 0x49, 0x47, 0xf2, + 0x30, 0x52, 0xc1, 0x66, 0x01, 0x68, 0x41, 0xf0, 0x01, 0x01, 0x01, 0x60, + 0x08, 0x49, 0x41, 0x58, 0x11, 0x44, 0x41, 0x60, 0x87, 0x48, 0x01, 0x68, + 0x07, 0x20, 0x88, 0x47, 0x6a, 0x48, 0x01, 0x68, 0x07, 0x20, 0xbd, 0xe8, + 0x80, 0x40, 0x08, 0x47, 0xd4, 0x21, 0x00, 0x40, 0x00, 0x02, 0x20, 0x00, + 0x50, 0xfe, 0xff, 0xff, 0x80, 0xb5, 0x1a, 0x48, 0x90, 0xf8, 0x30, 0x00, + 0x20, 0xb1, 0xff, 0xf7, 0xc5, 0xff, 0xbd, 0xe8, 0x80, 0x40, 0xd7, 0xe7, + 0x80, 0xbd, 0x80, 0xb5, 0x2f, 0x20, 0xff, 0xf7, 0x45, 0xff, 0xff, 0xf7, + 0xbb, 0xff, 0x00, 0x20, 0xbd, 0xe8, 0x80, 0x40, 0xff, 0xf7, 0x6a, 0xbf, + 0x10, 0xb5, 0x0f, 0x4c, 0x60, 0x69, 0x20, 0xb1, 0x50, 0xf8, 0x08, 0x1c, + 0x09, 0xb1, 0xfb, 0xf7, 0xbb, 0xfe, 0x60, 0x6a, 0x20, 0xb1, 0x50, 0xf8, + 0x08, 0x1c, 0x09, 0xb1, 0xfb, 0xf7, 0xb4, 0xfe, 0xf4, 0x48, 0x34, 0x21, + 0xf8, 0xf7, 0xd6, 0xf9, 0x10, 0x48, 0x00, 0x68, 0x38, 0xb1, 0x29, 0x49, + 0xc9, 0x88, 0xc9, 0x00, 0xf8, 0xf7, 0x82, 0xfe, 0x0e, 0x48, 0x00, 0x21, + 0x01, 0x70, 0x10, 0xbd, 0x48, 0xe4, 0x05, 0x00, 0xb0, 0xb5, 0x23, 0x4c, + 0xe1, 0x88, 0x71, 0xb1, 0x07, 0x4d, 0x28, 0x68, 0x28, 0xb9, 0x07, 0x48, + 0x02, 0x68, 0xc8, 0x00, 0x90, 0x47, 0xe1, 0x88, 0x28, 0x60, 0xc9, 0x00, + 0xf8, 0xf7, 0x6c, 0xfe, 0x03, 0x48, 0x00, 0x21, 0x01, 0x70, 0xb0, 0xbd, + 0x7c, 0xe4, 0x05, 0x00, 0xdc, 0x9b, 0x08, 0x00, 0x80, 0xe4, 0x05, 0x00, + 0x16, 0x49, 0x4f, 0xf4, 0xa0, 0x73, 0x08, 0x78, 0x4a, 0x7b, 0x01, 0x28, + 0x78, 0x48, 0x08, 0xbf, 0x50, 0x23, 0x43, 0x63, 0x83, 0x63, 0x1a, 0xb1, + 0x0a, 0x7b, 0x42, 0xf0, 0x10, 0x02, 0x00, 0xe0, 0x00, 0x22, 0xc2, 0x63, + 0x0a, 0x89, 0x49, 0x78, 0x01, 0x29, 0x12, 0xbf, 0x02, 0xf0, 0x7f, 0x02, + 0x01, 0x21, 0x61, 0xf3, 0x9f, 0x22, 0x91, 0xb2, 0x01, 0x63, 0x40, 0xf6, + 0x5f, 0x01, 0x01, 0x62, 0x02, 0x68, 0x22, 0xf0, 0x08, 0x02, 0x02, 0x60, + 0x43, 0xf2, 0x08, 0x02, 0x02, 0x60, 0x81, 0x66, 0x4f, 0xf0, 0x80, 0x21, + 0x01, 0x64, 0x03, 0x21, 0x01, 0x66, 0x70, 0x47, 0x38, 0xe4, 0x05, 0x00, + 0xf8, 0xb5, 0x1e, 0x48, 0x01, 0x68, 0x41, 0xf0, 0x20, 0x01, 0x01, 0x60, + 0x1c, 0x48, 0x8e, 0x21, 0x01, 0x60, 0x1c, 0x48, 0x01, 0x60, 0xff, 0xf7, + 0xc3, 0xff, 0xff, 0xf7, 0x5f, 0xfe, 0x00, 0x20, 0xff, 0xf7, 0xec, 0xfe, + 0xff, 0xf7, 0x80, 0xff, 0xff, 0xf7, 0xa0, 0xff, 0xff, 0xf7, 0x32, 0xff, + 0x32, 0x4c, 0x07, 0x20, 0x07, 0x25, 0x21, 0x68, 0x88, 0x47, 0x13, 0x4e, + 0x13, 0x49, 0x07, 0x20, 0x32, 0x68, 0x90, 0x47, 0x12, 0x4f, 0x07, 0x20, + 0x39, 0x68, 0x88, 0x47, 0x11, 0x48, 0x01, 0x68, 0x65, 0xf3, 0x17, 0x51, + 0x01, 0x60, 0x41, 0x68, 0x65, 0xf3, 0x17, 0x51, 0x41, 0x60, 0x01, 0x21, + 0xc0, 0xf8, 0x98, 0x10, 0x34, 0x20, 0x21, 0x68, 0x88, 0x47, 0x32, 0x68, + 0x0a, 0x49, 0x34, 0x20, 0x90, 0x47, 0x39, 0x68, 0x34, 0x20, 0xbd, 0xe8, + 0xf8, 0x40, 0x08, 0x47, 0x04, 0x00, 0x00, 0x40, 0x30, 0xf4, 0x00, 0x30, + 0x34, 0xf4, 0x00, 0x30, 0xac, 0x9c, 0x08, 0x00, 0x5f, 0xaf, 0x02, 0x00, + 0xb0, 0x9c, 0x08, 0x00, 0x28, 0x22, 0x00, 0x40, 0xe9, 0xb0, 0x02, 0x00, + 0xb0, 0xb5, 0xff, 0xf7, 0x2d, 0xff, 0x15, 0x4c, 0x9d, 0x4d, 0x20, 0x68, + 0x28, 0x60, 0x60, 0x68, 0x68, 0x60, 0x60, 0x6b, 0xe8, 0x60, 0x20, 0x6b, + 0xa8, 0x60, 0x00, 0xf0, 0x23, 0xf8, 0x00, 0xf0, 0x6f, 0xf8, 0x00, 0xf0, + 0xa5, 0xf8, 0x00, 0xf0, 0xfb, 0xf8, 0x20, 0x68, 0x29, 0x7c, 0x02, 0x22, + 0x40, 0x0a, 0x49, 0x08, 0x61, 0xf3, 0x5f, 0x00, 0x28, 0x74, 0x00, 0xf0, + 0xfd, 0x00, 0x21, 0x68, 0x02, 0xea, 0xd1, 0x11, 0x08, 0x44, 0x28, 0x74, + 0x0c, 0x20, 0xff, 0xf7, 0x5d, 0xfe, 0x04, 0x48, 0x01, 0x68, 0x34, 0x20, + 0xbd, 0xe8, 0xb0, 0x40, 0x08, 0x47, 0x00, 0xbf, 0x14, 0xf0, 0x03, 0x30, + 0xb8, 0x9c, 0x08, 0x00, 0x70, 0xb5, 0x86, 0x4d, 0x28, 0x78, 0xc0, 0x07, + 0x40, 0xd0, 0x01, 0x20, 0x01, 0x26, 0xff, 0xf7, 0x49, 0xfe, 0x19, 0x20, + 0xff, 0xf7, 0x46, 0xfe, 0x1d, 0x4c, 0x20, 0x68, 0x20, 0xf0, 0x04, 0x00, + 0x20, 0x60, 0x28, 0x78, 0xc1, 0x09, 0xb6, 0xeb, 0xd0, 0x1f, 0x85, 0xf8, + 0x2f, 0x10, 0x18, 0xd1, 0x08, 0x20, 0xff, 0xf7, 0x37, 0xfe, 0x17, 0x48, + 0x01, 0x68, 0x17, 0x48, 0x00, 0xf5, 0x84, 0x70, 0x88, 0x47, 0x00, 0x21, + 0x85, 0xf8, 0x2e, 0x60, 0x68, 0x62, 0xa9, 0x85, 0x08, 0xb1, 0x28, 0x8d, + 0x20, 0xb9, 0x00, 0x20, 0x4f, 0xf4, 0xd9, 0x71, 0xf5, 0xf7, 0x2a, 0xff, + 0x00, 0xf0, 0x5e, 0xfa, 0x10, 0xe0, 0x09, 0x20, 0xff, 0xf7, 0x1e, 0xfe, + 0x85, 0xf8, 0x22, 0x60, 0x4f, 0xf6, 0xff, 0x71, 0x60, 0x68, 0x88, 0x43, + 0x60, 0x60, 0x17, 0x20, 0xff, 0xf7, 0x14, 0xfe, 0xa0, 0x68, 0x40, 0xf4, + 0x80, 0x50, 0xa0, 0x60, 0xa0, 0x6e, 0x40, 0xf0, 0x01, 0x00, 0xa0, 0x66, + 0x70, 0xbd, 0x00, 0xbf, 0x00, 0xf0, 0x03, 0x30, 0x24, 0x9d, 0x08, 0x00, + 0x2c, 0xba, 0x01, 0x00, 0xb0, 0xb5, 0x5f, 0x4d, 0x19, 0x4c, 0x28, 0x68, + 0x41, 0x07, 0x09, 0xd5, 0x03, 0x20, 0xff, 0xf7, 0xfb, 0xfd, 0x00, 0xf0, + 0xb9, 0xf8, 0x20, 0x6d, 0x40, 0xf0, 0x04, 0x00, 0x20, 0x65, 0x28, 0x68, + 0x80, 0x07, 0x21, 0xd5, 0x02, 0x20, 0xff, 0xf7, 0xef, 0xfd, 0x68, 0x8d, + 0x21, 0x68, 0x6f, 0xf3, 0xdf, 0x31, 0x81, 0x42, 0x04, 0xd0, 0x00, 0x20, + 0x40, 0xf2, 0xed, 0x11, 0xf5, 0xf7, 0xea, 0xfe, 0xa8, 0x8d, 0x29, 0x8d, + 0x81, 0x42, 0x06, 0xd1, 0x4f, 0xf0, 0x00, 0x40, 0xa0, 0x62, 0x03, 0x20, + 0x85, 0xf8, 0x2e, 0x00, 0x04, 0xe0, 0x02, 0x20, 0x85, 0xf8, 0x2e, 0x00, + 0x00, 0xf0, 0x10, 0xfa, 0x20, 0x6d, 0x40, 0xf0, 0x02, 0x00, 0x20, 0x65, + 0xb0, 0xbd, 0x00, 0xbf, 0x18, 0xf0, 0x03, 0x30, 0xb0, 0xb5, 0x43, 0x4d, + 0x28, 0x68, 0x01, 0x05, 0x03, 0xd5, 0x0b, 0x20, 0xff, 0xf7, 0xc4, 0xfd, + 0x28, 0x68, 0x41, 0x05, 0x03, 0xd5, 0x0a, 0x20, 0xff, 0xf7, 0xbe, 0xfd, + 0x28, 0x68, 0x23, 0x4c, 0x40, 0x06, 0x10, 0xd5, 0x07, 0x20, 0xff, 0xf7, + 0xb7, 0xfd, 0x95, 0xf8, 0x2f, 0x00, 0x30, 0xb9, 0x95, 0xf8, 0x22, 0x00, + 0x05, 0x28, 0x02, 0xd0, 0x26, 0x20, 0xff, 0xf7, 0xad, 0xfd, 0x60, 0x6a, + 0x40, 0xf0, 0x40, 0x00, 0x60, 0x62, 0x60, 0x68, 0x00, 0x04, 0x06, 0xd0, + 0x0d, 0x20, 0xff, 0xf7, 0xa3, 0xfd, 0x00, 0xf0, 0x61, 0xf8, 0x02, 0x20, + 0xe0, 0x61, 0x60, 0x68, 0x40, 0x03, 0x04, 0xd5, 0x10, 0x20, 0xff, 0xf7, + 0x99, 0xfd, 0x02, 0x20, 0xe0, 0x61, 0x60, 0x68, 0x00, 0x03, 0x04, 0xd5, + 0x11, 0x20, 0xff, 0xf7, 0x91, 0xfd, 0x02, 0x20, 0xe0, 0x61, 0x20, 0x68, + 0x00, 0x03, 0x04, 0xd5, 0x16, 0x20, 0xff, 0xf7, 0x89, 0xfd, 0x01, 0x20, + 0xe0, 0x61, 0x20, 0x68, 0x40, 0x03, 0x04, 0xd5, 0x15, 0x20, 0xff, 0xf7, + 0x81, 0xfd, 0x01, 0x20, 0xe0, 0x61, 0x20, 0x68, 0x00, 0x04, 0x04, 0xd0, + 0x12, 0x20, 0xff, 0xf7, 0x79, 0xfd, 0x01, 0x20, 0xe0, 0x61, 0xb0, 0xbd, + 0x44, 0xf0, 0x03, 0x30, 0x10, 0xb5, 0x17, 0x4c, 0x20, 0x68, 0xc1, 0x06, + 0x08, 0xd5, 0x05, 0x20, 0xff, 0xf7, 0x6c, 0xfd, 0x14, 0x48, 0x01, 0x68, + 0x41, 0xf0, 0x10, 0x01, 0x01, 0x60, 0x20, 0x68, 0x00, 0x07, 0x1e, 0xd5, + 0x04, 0x20, 0xff, 0xf7, 0x61, 0xfd, 0x94, 0xf8, 0x2f, 0x00, 0x48, 0xb1, + 0x94, 0xf8, 0x2e, 0x00, 0x03, 0x28, 0x11, 0xbf, 0x1c, 0x20, 0x00, 0x20, + 0x84, 0xf8, 0x2e, 0x00, 0x1b, 0x20, 0x07, 0xe0, 0x94, 0xf8, 0x22, 0x00, + 0x05, 0x28, 0x05, 0xd1, 0x00, 0x20, 0x84, 0xf8, 0x22, 0x00, 0x23, 0x20, + 0xff, 0xf7, 0x4a, 0xfd, 0x03, 0x48, 0x01, 0x68, 0x41, 0xf0, 0x08, 0x01, + 0x01, 0x60, 0x10, 0xbd, 0x48, 0xe4, 0x05, 0x00, 0x68, 0xf0, 0x03, 0x30, + 0x2d, 0xe9, 0xf8, 0x43, 0xe3, 0x4f, 0x97, 0xf8, 0x22, 0x00, 0x1d, 0x30, + 0xc0, 0xb2, 0xff, 0xf7, 0x37, 0xfd, 0x90, 0x4c, 0xdf, 0xf8, 0x40, 0x92, + 0x07, 0xf1, 0x14, 0x05, 0xa6, 0x6c, 0x78, 0x8b, 0xb9, 0xf8, 0x2e, 0x15, + 0x10, 0xfa, 0x86, 0xf0, 0x88, 0x42, 0x04, 0xd9, 0x00, 0x20, 0x40, 0xf2, + 0xe9, 0x21, 0xf5, 0xf7, 0x2b, 0xfe, 0xa8, 0x7b, 0x06, 0x28, 0x00, 0xf2, + 0xee, 0x80, 0xdf, 0xe8, 0x00, 0xf0, 0x04, 0x3f, 0x7a, 0x17, 0x17, 0x04, + 0x07, 0x00, 0x28, 0x20, 0xff, 0xf7, 0x18, 0xfd, 0x82, 0x48, 0x00, 0x21, + 0x01, 0x80, 0x19, 0x20, 0xff, 0xf7, 0x12, 0xfd, 0x20, 0x68, 0x40, 0xf2, + 0x7a, 0x31, 0x20, 0xf0, 0x04, 0x00, 0x20, 0x60, 0x00, 0x20, 0xf5, 0xf7, + 0x0f, 0xfe, 0xda, 0xe0, 0x7a, 0x4f, 0xb0, 0xb2, 0x39, 0x88, 0x81, 0x42, + 0x05, 0xd0, 0x00, 0x20, 0x4f, 0xf4, 0x4f, 0x71, 0xf5, 0xf7, 0x04, 0xfe, + 0x39, 0x88, 0x28, 0x68, 0xea, 0x88, 0x10, 0x44, 0x01, 0x38, 0x00, 0xf0, + 0xf1, 0xf8, 0xe9, 0x88, 0x08, 0x44, 0xa9, 0x88, 0x82, 0xb2, 0xe8, 0x80, + 0x8a, 0x42, 0x7b, 0xd2, 0x8e, 0x1a, 0xbd, 0x4a, 0x04, 0x23, 0xab, 0x73, + 0x92, 0x88, 0x96, 0x42, 0xc8, 0xbf, 0x16, 0x46, 0xb2, 0xb2, 0x3e, 0x80, + 0x12, 0xfa, 0x80, 0xf0, 0x88, 0x42, 0x00, 0xf0, 0xa6, 0x80, 0xb4, 0xe0, + 0x00, 0x20, 0x68, 0x81, 0x68, 0x60, 0x28, 0x68, 0x20, 0xb1, 0x50, 0xf8, + 0x08, 0x1c, 0x09, 0xb1, 0xfb, 0xf7, 0x5c, 0xfc, 0x65, 0x48, 0x00, 0x21, + 0x00, 0xf5, 0x00, 0x70, 0xf9, 0xf7, 0x32, 0xff, 0x28, 0x60, 0x28, 0xb9, + 0x00, 0x20, 0x40, 0xf2, 0xfa, 0x21, 0xf5, 0xf7, 0xcf, 0xfd, 0x28, 0x68, + 0xb9, 0xf8, 0x2e, 0x15, 0xf8, 0xf7, 0x24, 0xfc, 0x05, 0xf1, 0x0d, 0x00, + 0x01, 0x21, 0x01, 0x26, 0x00, 0xf0, 0xb8, 0xf8, 0xe9, 0x88, 0x08, 0x44, + 0xe8, 0x80, 0x68, 0x7b, 0x05, 0x28, 0x68, 0xd3, 0x24, 0x20, 0xff, 0xf7, + 0xb5, 0xfc, 0x18, 0x20, 0xff, 0xf7, 0xb2, 0xfc, 0x20, 0x68, 0x40, 0xf0, + 0x04, 0x00, 0x20, 0x60, 0x4d, 0x48, 0x06, 0x80, 0x06, 0x20, 0xa8, 0x73, + 0x20, 0x6c, 0x40, 0xf4, 0x00, 0x40, 0x20, 0x64, 0x7f, 0xe0, 0xdf, 0xf8, + 0x24, 0x81, 0x28, 0x68, 0xb8, 0xf8, 0x00, 0x10, 0x00, 0xf0, 0x98, 0xf8, + 0xe9, 0x88, 0x2b, 0x7b, 0x08, 0x44, 0xd9, 0x43, 0xe8, 0x80, 0x28, 0x89, + 0x08, 0x44, 0x29, 0x68, 0x0a, 0x18, 0x07, 0xf1, 0x1e, 0x00, 0x02, 0x21, + 0xf5, 0xf7, 0xa8, 0xfd, 0x8d, 0x48, 0x69, 0x89, 0x80, 0x88, 0x88, 0x42, + 0x28, 0xbf, 0x08, 0x46, 0x2a, 0x89, 0xa8, 0xf8, 0x00, 0x00, 0x11, 0x44, + 0xb9, 0xf8, 0x2e, 0x25, 0xa9, 0x80, 0x89, 0xb2, 0x91, 0x42, 0x3e, 0xd9, + 0x25, 0x20, 0xff, 0xf7, 0x7d, 0xfc, 0x01, 0x20, 0xa8, 0xf8, 0x00, 0x00, + 0x18, 0x20, 0xff, 0xf7, 0x77, 0xfc, 0x06, 0x20, 0xa8, 0x73, 0x3b, 0xe0, + 0x05, 0x20, 0xa8, 0x73, 0x00, 0x20, 0x38, 0x80, 0x19, 0x20, 0xff, 0xf7, + 0x6d, 0xfc, 0x20, 0x68, 0x20, 0xf0, 0x04, 0x00, 0x20, 0x60, 0xa8, 0x88, + 0xe9, 0x88, 0x81, 0x42, 0x02, 0xd0, 0x27, 0x20, 0xff, 0xf7, 0x62, 0xfc, + 0x2a, 0x68, 0x10, 0x78, 0x51, 0x78, 0x40, 0xea, 0x01, 0x20, 0x0c, 0x28, + 0x28, 0xd1, 0x26, 0x48, 0x00, 0xf5, 0x8a, 0x71, 0x10, 0x46, 0xf7, 0xf7, + 0x43, 0xff, 0x24, 0x48, 0x05, 0x21, 0x00, 0x78, 0xf5, 0xf7, 0x6e, 0xfd, + 0x21, 0xe0, 0x02, 0x21, 0x1d, 0x4b, 0xa9, 0x73, 0x21, 0x49, 0x11, 0xf8, + 0x10, 0x20, 0x01, 0xeb, 0x40, 0x00, 0x40, 0x78, 0x1a, 0x80, 0x28, 0x73, + 0x50, 0x1c, 0x28, 0x81, 0x13, 0xe0, 0x03, 0x22, 0xaa, 0x73, 0xea, 0x88, + 0x10, 0x44, 0x88, 0x42, 0x07, 0xd1, 0x18, 0x20, 0xff, 0xf7, 0x38, 0xfc, + 0x20, 0x68, 0x40, 0xf0, 0x04, 0x00, 0x20, 0x60, 0x05, 0xe0, 0x04, 0xe0, + 0x10, 0x49, 0x68, 0x7b, 0x0b, 0x68, 0x11, 0x46, 0x98, 0x47, 0x0d, 0x48, + 0x06, 0x88, 0x20, 0x6c, 0x40, 0xf4, 0x00, 0x40, 0x20, 0x64, 0x30, 0x04, + 0x0b, 0xd0, 0x60, 0x68, 0x71, 0x1e, 0xc1, 0xea, 0x00, 0x00, 0x60, 0x60, + 0x17, 0x20, 0xff, 0xf7, 0x1d, 0xfc, 0xa0, 0x68, 0x40, 0xf4, 0x80, 0x50, + 0xa0, 0x60, 0xbd, 0xe8, 0xf8, 0x83, 0x00, 0xbf, 0x00, 0xf0, 0x03, 0x30, + 0x8c, 0x7e, 0x08, 0x00, 0x82, 0xe4, 0x05, 0x00, 0x34, 0xa7, 0x08, 0x00, + 0x2c, 0xba, 0x01, 0x00, 0x9d, 0x53, 0x01, 0x00, 0x68, 0x8a, 0x01, 0x00, + 0x10, 0xb7, 0x02, 0x00, 0x2d, 0xe9, 0xfe, 0x4f, 0x1d, 0x4d, 0x0c, 0x46, + 0x4f, 0xf0, 0x00, 0x0a, 0x04, 0x29, 0x1f, 0xd3, 0x21, 0x1f, 0xdf, 0xf8, + 0x6c, 0x80, 0x02, 0xae, 0x07, 0x46, 0x01, 0x90, 0x21, 0xf0, 0x03, 0x0b, + 0x00, 0x91, 0x0b, 0xf1, 0x04, 0x09, 0x28, 0x68, 0x32, 0x46, 0x04, 0x23, + 0x02, 0x90, 0xc5, 0xf8, 0x00, 0xa0, 0x38, 0x46, 0xb8, 0xf8, 0x2e, 0x15, + 0xf5, 0xf7, 0x00, 0xfd, 0x04, 0x3c, 0x04, 0x37, 0xa0, 0xb2, 0x03, 0x28, + 0xef, 0xd8, 0x00, 0x98, 0xa0, 0xeb, 0x0b, 0x04, 0x01, 0x98, 0x01, 0xe0, + 0x4f, 0xf0, 0x00, 0x09, 0x21, 0x04, 0x0d, 0xd0, 0x29, 0x68, 0x10, 0xfa, + 0x89, 0xf0, 0xa3, 0xb2, 0x02, 0xaa, 0x02, 0x91, 0x00, 0x21, 0x29, 0x60, + 0x05, 0x49, 0xb1, 0xf8, 0x2e, 0x15, 0xf5, 0xf7, 0xe5, 0xfc, 0xa1, 0x44, + 0x1f, 0xfa, 0x89, 0xf0, 0xbd, 0xe8, 0xfe, 0x8f, 0x28, 0xf0, 0x03, 0x30, + 0x8c, 0x7e, 0x08, 0x00, 0xf8, 0xb5, 0x1a, 0x20, 0xff, 0xf7, 0xc0, 0xfb, + 0x24, 0x4c, 0x54, 0xf8, 0x24, 0x0f, 0x28, 0xb9, 0x00, 0x20, 0x40, 0xf2, + 0xab, 0x21, 0xf5, 0xf7, 0xbd, 0xfc, 0x20, 0x68, 0x21, 0x89, 0x20, 0x4b, + 0x20, 0x4e, 0x42, 0x18, 0xa0, 0x88, 0x9b, 0x88, 0x45, 0x1a, 0x9d, 0x42, + 0xb8, 0xbf, 0x2b, 0x46, 0x9f, 0xb2, 0x00, 0x25, 0x04, 0x2f, 0x07, 0xd3, + 0x3b, 0x46, 0xaf, 0xb2, 0x04, 0x3b, 0x04, 0x35, 0xd7, 0x59, 0x03, 0x2b, + 0x37, 0x62, 0xf8, 0xd8, 0x01, 0x27, 0xb7, 0x66, 0x1f, 0x04, 0x05, 0xd0, + 0xaf, 0xb2, 0x01, 0x35, 0x01, 0x3b, 0xd7, 0x5d, 0x37, 0x62, 0xf7, 0xe7, + 0x00, 0x22, 0xb2, 0x66, 0x2a, 0x04, 0x0e, 0xd0, 0x30, 0x68, 0xc0, 0xea, + 0x05, 0x40, 0xa0, 0xf5, 0x80, 0x30, 0x30, 0x60, 0x17, 0x20, 0xff, 0xf7, + 0x89, 0xfb, 0x70, 0x68, 0x40, 0xf4, 0x80, 0x50, 0x70, 0x60, 0xa0, 0x88, + 0x21, 0x89, 0x29, 0x44, 0xe5, 0x80, 0x21, 0x81, 0x89, 0xb2, 0x88, 0x42, + 0x88, 0xbf, 0xf8, 0xbd, 0x20, 0x68, 0xbd, 0xe8, 0xf8, 0x40, 0xfb, 0xf7, + 0xfd, 0xba, 0x00, 0xbf, 0x48, 0xe4, 0x05, 0x00, 0x38, 0xe4, 0x05, 0x00, + 0x04, 0xf0, 0x03, 0x30, 0x01, 0x00, 0x03, 0x01, 0x04, 0x02, 0x03, 0x01, + 0x02, 0x01, 0x00, 0x00, 0xb0, 0xb5, 0x2d, 0x4a, 0x10, 0x7d, 0xc1, 0x07, + 0x02, 0xd0, 0x2c, 0x49, 0x8b, 0x7b, 0x03, 0xb1, 0xb0, 0xbd, 0x01, 0x23, + 0x0e, 0x32, 0x8b, 0x73, 0xc0, 0xf3, 0xc0, 0x03, 0x4b, 0x73, 0xc0, 0xf3, + 0x80, 0x03, 0xd5, 0x79, 0x54, 0x79, 0x0b, 0x70, 0x13, 0x78, 0x0d, 0x73, + 0xc0, 0xf3, 0x40, 0x05, 0xcc, 0x72, 0x4d, 0x70, 0x15, 0x89, 0x8b, 0x72, + 0x0d, 0x81, 0x55, 0x89, 0x92, 0x89, 0x8d, 0x80, 0xca, 0x80, 0xc0, 0xf3, + 0x40, 0x12, 0xca, 0x70, 0xc0, 0xf3, 0x00, 0x10, 0x88, 0x70, 0xbd, 0xe8, + 0xb0, 0x40, 0xff, 0xf7, 0x6d, 0xbc, 0x00, 0xbf, 0x70, 0xb5, 0x17, 0x48, + 0x00, 0x7d, 0xc0, 0x07, 0x28, 0xd0, 0x16, 0x48, 0x80, 0x7b, 0x01, 0x28, + 0x24, 0xd1, 0xff, 0xf7, 0x31, 0xfc, 0x14, 0x4d, 0xd5, 0xf8, 0x08, 0x01, + 0x58, 0xb1, 0x13, 0x4e, 0x05, 0xf5, 0x84, 0x74, 0x31, 0x68, 0x20, 0x46, + 0x88, 0x47, 0xfb, 0xf7, 0xad, 0xfa, 0xd5, 0xf8, 0x08, 0x01, 0x00, 0x28, + 0xf6, 0xd1, 0xd5, 0xf8, 0x14, 0x01, 0x58, 0xb1, 0x0b, 0x4e, 0x05, 0xf5, + 0x8a, 0x74, 0x31, 0x68, 0x20, 0x46, 0x88, 0x47, 0xfb, 0xf7, 0x9e, 0xfa, + 0xd5, 0xf8, 0x14, 0x01, 0x00, 0x28, 0xf6, 0xd1, 0xbd, 0xe8, 0x70, 0x40, + 0xff, 0xf7, 0xd2, 0xbb, 0x70, 0xbd, 0x00, 0xbf, 0xdc, 0x2c, 0x06, 0x00, + 0x38, 0xe4, 0x05, 0x00, 0x2c, 0xba, 0x01, 0x00, 0x24, 0x9d, 0x08, 0x00, + 0x01, 0x20, 0xff, 0xf7, 0x2f, 0xbb, 0x00, 0x00, 0x00, 0xb3, 0x01, 0x88, + 0xa1, 0xf1, 0xf1, 0x02, 0x0f, 0x2a, 0x1d, 0xd9, 0x01, 0x29, 0x2d, 0xd0, + 0x0a, 0x29, 0x31, 0xd0, 0x34, 0x29, 0x35, 0xd0, 0x40, 0x29, 0x3a, 0xd0, + 0x41, 0x29, 0x3e, 0xd0, 0x53, 0x29, 0x42, 0xd0, 0x9b, 0x29, 0x46, 0xd0, + 0xab, 0x29, 0x4a, 0xd0, 0xdc, 0x29, 0x4e, 0xd0, 0xe1, 0x29, 0x52, 0xd0, + 0xe5, 0x29, 0x17, 0xd1, 0x00, 0x21, 0x01, 0x72, 0xd2, 0x49, 0x41, 0x60, + 0xa0, 0x21, 0x83, 0xe0, 0x00, 0x21, 0x83, 0xe0, 0xdf, 0xe8, 0x02, 0xf0, + 0x08, 0x4f, 0x0e, 0x0e, 0x55, 0x5b, 0x61, 0x0e, 0x67, 0x6b, 0x6f, 0x75, + 0x0e, 0x0e, 0x0e, 0x7b, 0x00, 0x21, 0x01, 0x72, 0xd0, 0x49, 0x41, 0x60, + 0x18, 0x21, 0x71, 0xe0, 0x00, 0xf0, 0x08, 0xba, 0x00, 0x21, 0x01, 0x72, + 0xca, 0x49, 0x41, 0x60, 0x40, 0x21, 0x69, 0xe0, 0x00, 0x21, 0x01, 0x72, + 0xe8, 0x49, 0x41, 0x60, 0x06, 0x21, 0x63, 0xe0, 0x00, 0x21, 0x01, 0x72, + 0xcf, 0x49, 0x41, 0x60, 0x01, 0x21, 0x41, 0x80, 0x5e, 0xe0, 0x00, 0x21, + 0x01, 0x72, 0xd9, 0x49, 0x41, 0x60, 0xf8, 0x21, 0x56, 0xe0, 0x00, 0x21, + 0x01, 0x72, 0xe1, 0x49, 0x41, 0x60, 0x34, 0x21, 0x50, 0xe0, 0x00, 0x21, + 0x01, 0x72, 0xc7, 0x49, 0x41, 0x60, 0x0f, 0x21, 0x4a, 0xe0, 0x00, 0x21, + 0x01, 0x72, 0xc0, 0x49, 0x41, 0x60, 0x1c, 0x21, 0x44, 0xe0, 0x00, 0x21, + 0x01, 0x72, 0x24, 0x49, 0x41, 0x60, 0x08, 0x21, 0x3e, 0xe0, 0x00, 0x21, + 0x01, 0x72, 0xce, 0x49, 0x41, 0x60, 0xe4, 0x21, 0x38, 0xe0, 0x00, 0x21, + 0x01, 0x72, 0x04, 0x21, 0x41, 0x80, 0xb4, 0x49, 0x04, 0x31, 0x41, 0x60, + 0x31, 0xe0, 0x00, 0x21, 0x01, 0x72, 0xa8, 0x49, 0x41, 0x60, 0x84, 0x21, + 0x2a, 0xe0, 0x00, 0x21, 0x01, 0x72, 0xac, 0x49, 0x41, 0x60, 0x80, 0x21, + 0x24, 0xe0, 0x00, 0x21, 0x01, 0x72, 0xab, 0x49, 0x41, 0x60, 0x04, 0x21, + 0x1e, 0xe0, 0x00, 0x21, 0x01, 0x72, 0x10, 0x49, 0x41, 0x60, 0x0d, 0x21, + 0x18, 0xe0, 0x00, 0x21, 0x01, 0x72, 0xad, 0x49, 0x12, 0xe0, 0x00, 0x21, + 0x01, 0x72, 0xad, 0x49, 0x02, 0xe0, 0x00, 0x21, 0x01, 0x72, 0xad, 0x49, + 0x41, 0x60, 0x86, 0x21, 0x0a, 0xe0, 0x00, 0x21, 0x01, 0x72, 0xac, 0x49, + 0x41, 0x60, 0x3e, 0x21, 0x04, 0xe0, 0x00, 0x21, 0x01, 0x72, 0x8d, 0x49, + 0x41, 0x60, 0x0a, 0x21, 0x41, 0x80, 0x01, 0x21, 0x08, 0x46, 0x70, 0x47, + 0xa0, 0x2f, 0x06, 0x00, 0xf8, 0x2c, 0x06, 0x00, 0x70, 0xb5, 0x04, 0x46, + 0x0a, 0x28, 0x1b, 0xd0, 0x40, 0x2c, 0x1e, 0xd0, 0x41, 0x2c, 0x23, 0xd0, + 0x53, 0x2c, 0x28, 0xd0, 0x5f, 0x2c, 0x2d, 0xd0, 0x74, 0x2c, 0x31, 0xd0, + 0x9b, 0x2c, 0x36, 0xd0, 0xcd, 0x2c, 0x4f, 0xd0, 0xdc, 0x2c, 0x54, 0xd0, + 0xe1, 0x2c, 0x59, 0xd0, 0xe5, 0x2c, 0x60, 0xd1, 0x82, 0x49, 0x41, 0xf2, + 0xac, 0x00, 0x7d, 0x4a, 0xa0, 0x23, 0x08, 0x44, 0x20, 0x21, 0x56, 0xe0, + 0x2e, 0x48, 0xa0, 0x4a, 0x05, 0x21, 0x05, 0x23, 0x51, 0xe0, 0x2c, 0x48, + 0x94, 0x4a, 0xec, 0x21, 0xec, 0x23, 0x00, 0xf5, 0x05, 0x70, 0x4a, 0xe0, + 0x28, 0x48, 0x9c, 0x4a, 0x30, 0x21, 0x34, 0x23, 0x00, 0xf5, 0x40, 0x70, + 0x43, 0xe0, 0x25, 0x48, 0x81, 0x4a, 0x09, 0x21, 0x09, 0x23, 0x00, 0xf2, + 0xaa, 0x30, 0x3c, 0xe0, 0x22, 0x48, 0x91, 0x4a, 0xc0, 0x21, 0xc8, 0x23, + 0xf4, 0x30, 0x36, 0xe0, 0x1f, 0x48, 0x89, 0x4a, 0x1e, 0x21, 0x1e, 0x23, + 0x00, 0xf5, 0xdc, 0x70, 0x2f, 0xe0, 0x1b, 0x48, 0x73, 0x4d, 0x10, 0x21, + 0x1c, 0x23, 0x00, 0xf2, 0x64, 0x50, 0x2a, 0x46, 0xf5, 0xf7, 0x1c, 0xfb, + 0x17, 0x48, 0xeb, 0x7b, 0x2e, 0x7c, 0x6d, 0x7c, 0x90, 0xf8, 0x1c, 0x21, + 0x90, 0xf8, 0x17, 0x11, 0x90, 0xf8, 0x55, 0x01, 0x1a, 0x44, 0x6d, 0x4b, + 0x31, 0x44, 0x28, 0x44, 0x5a, 0x70, 0x99, 0x70, 0xd8, 0x70, 0x16, 0xe0, + 0x0e, 0x48, 0x74, 0x4a, 0x0c, 0x21, 0x0c, 0x23, 0x00, 0xf5, 0x35, 0x70, + 0x0d, 0xe0, 0x5a, 0x48, 0x76, 0x4a, 0xd8, 0x21, 0xe4, 0x23, 0x00, 0xf6, + 0xc4, 0x40, 0x06, 0xe0, 0x06, 0x48, 0x5d, 0x49, 0x04, 0x23, 0x0a, 0x1d, + 0x00, 0xf5, 0xf6, 0x60, 0x02, 0x21, 0xf5, 0xf7, 0xf3, 0xfa, 0x20, 0x46, + 0xbd, 0xe8, 0x70, 0x40, 0x00, 0xf0, 0x18, 0xb9, 0x8c, 0x7e, 0x08, 0x00, + 0xe8, 0x65, 0x08, 0x00, 0x70, 0xb5, 0x46, 0x48, 0x46, 0x4a, 0x47, 0x4e, + 0x0c, 0x21, 0x0c, 0x23, 0xb0, 0x47, 0x46, 0x48, 0x46, 0x4a, 0xa0, 0x21, + 0xa0, 0x23, 0xb0, 0x47, 0x45, 0x48, 0x46, 0x4a, 0x84, 0x21, 0x84, 0x23, + 0xb0, 0x47, 0x45, 0x4c, 0x01, 0x20, 0x46, 0x4a, 0x40, 0x21, 0x40, 0x23, + 0x84, 0xf8, 0xef, 0x02, 0x42, 0x48, 0xb0, 0x47, 0x43, 0x48, 0x44, 0x4a, + 0x18, 0x21, 0x18, 0x23, 0xb0, 0x47, 0x40, 0xf2, 0xff, 0x30, 0x43, 0x4a, + 0x80, 0x21, 0x80, 0x23, 0xa4, 0xf8, 0xde, 0x02, 0x3f, 0x48, 0xb0, 0x47, + 0x40, 0x4d, 0x41, 0x4a, 0x04, 0x21, 0x04, 0x23, 0x28, 0x46, 0xb0, 0x47, + 0x3f, 0x48, 0x40, 0x4a, 0x1c, 0x21, 0x1c, 0x23, 0xb0, 0x47, 0x3f, 0x48, + 0x3f, 0x4c, 0x0f, 0x23, 0x90, 0xf8, 0x17, 0x11, 0x90, 0xf8, 0x1c, 0x21, + 0x90, 0xf8, 0x55, 0x01, 0xe0, 0x70, 0x62, 0x70, 0x3b, 0x48, 0x3c, 0x4a, + 0xa1, 0x70, 0x0f, 0x21, 0xb0, 0x47, 0x3b, 0x48, 0x3b, 0x4a, 0x0a, 0x21, + 0x0a, 0x23, 0xb0, 0x47, 0x3a, 0x48, 0x3b, 0x4a, 0x86, 0x21, 0x86, 0x23, + 0xb0, 0x47, 0x3a, 0x48, 0x3a, 0x4a, 0x86, 0x21, 0x86, 0x23, 0xb0, 0x47, + 0x39, 0x48, 0x3a, 0x4a, 0x3e, 0x21, 0x3e, 0x23, 0xb0, 0x47, 0x39, 0x48, + 0x39, 0x4a, 0x20, 0x21, 0x20, 0x23, 0xb0, 0x47, 0x38, 0x48, 0x39, 0x4a, + 0xf8, 0x21, 0xf8, 0x23, 0xb0, 0x47, 0x38, 0x48, 0x38, 0x4a, 0x24, 0x21, + 0x24, 0x23, 0xb0, 0x47, 0x37, 0x48, 0x38, 0x4a, 0xe4, 0x21, 0xe4, 0x23, + 0xb0, 0x47, 0x37, 0x4a, 0x28, 0x1d, 0x04, 0x21, 0x04, 0x23, 0xb0, 0x47, + 0x35, 0x48, 0x36, 0x4a, 0xc8, 0x21, 0xc8, 0x23, 0xb0, 0x47, 0x35, 0x4d, + 0x35, 0x4a, 0x06, 0x21, 0x06, 0x23, 0xa8, 0x1d, 0xb0, 0x47, 0x34, 0x48, + 0x34, 0x4a, 0x34, 0x21, 0x34, 0x23, 0xb0, 0x47, 0x33, 0x4a, 0x20, 0x46, + 0x01, 0x21, 0x01, 0x23, 0xb0, 0x47, 0x32, 0x4a, 0x28, 0x46, 0x06, 0x21, + 0x06, 0x23, 0xb4, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x60, 0x47, 0x00, 0xbf, + 0x80, 0x2c, 0x06, 0x00, 0x80, 0xbc, 0x02, 0x00, 0x4d, 0xcd, 0x11, 0x10, + 0xfc, 0x2d, 0x06, 0x00, 0x8c, 0xbc, 0x02, 0x00, 0x9c, 0x2e, 0x06, 0x00, + 0x2c, 0xbd, 0x02, 0x00, 0x00, 0x69, 0x08, 0x00, 0x8c, 0x2c, 0x06, 0x00, + 0xb0, 0xbd, 0x02, 0x00, 0xe4, 0x2d, 0x06, 0x00, 0xf0, 0xbd, 0x02, 0x00, + 0x20, 0x2f, 0x06, 0x00, 0x08, 0xbe, 0x02, 0x00, 0x8c, 0x32, 0x06, 0x00, + 0x88, 0xbe, 0x02, 0x00, 0xdc, 0x2c, 0x06, 0x00, 0x8c, 0xbe, 0x02, 0x00, + 0x50, 0x50, 0x00, 0x10, 0x94, 0x32, 0x06, 0x00, 0xcc, 0x2c, 0x06, 0x00, + 0xa8, 0xbe, 0x02, 0x00, 0xad, 0x2f, 0x06, 0x00, 0xb7, 0xbe, 0x02, 0x00, + 0xb8, 0x2f, 0x06, 0x00, 0xc2, 0xbe, 0x02, 0x00, 0x3e, 0x30, 0x06, 0x00, + 0x48, 0xbf, 0x02, 0x00, 0xc4, 0x30, 0x06, 0x00, 0xce, 0xbf, 0x02, 0x00, + 0x30, 0x32, 0x06, 0x00, 0x0c, 0xc0, 0x02, 0x00, 0x04, 0x31, 0x06, 0x00, + 0x2c, 0xc0, 0x02, 0x00, 0x50, 0x32, 0x06, 0x00, 0x24, 0xc1, 0x02, 0x00, + 0x00, 0x2d, 0x06, 0x00, 0x48, 0xc1, 0x02, 0x00, 0x2c, 0xc2, 0x02, 0x00, + 0xd0, 0x32, 0x06, 0x00, 0x84, 0xc3, 0x02, 0x00, 0x98, 0x32, 0x06, 0x00, + 0xd4, 0xd2, 0x05, 0x00, 0xfc, 0x31, 0x06, 0x00, 0x30, 0xc2, 0x02, 0x00, + 0x64, 0xc2, 0x02, 0x00, 0x65, 0xc2, 0x02, 0x00, 0xff, 0xf7, 0x12, 0xbf, + 0x08, 0x48, 0x09, 0x49, 0x01, 0x60, 0x09, 0x48, 0x09, 0x49, 0x01, 0x60, + 0x09, 0x48, 0x0a, 0x49, 0x01, 0x60, 0x0a, 0x48, 0x00, 0x78, 0x02, 0x38, + 0x03, 0x28, 0x28, 0xbf, 0xff, 0xf7, 0x02, 0xbf, 0x70, 0x47, 0x00, 0xbf, + 0x78, 0xa5, 0x08, 0x00, 0x49, 0xb9, 0x02, 0x00, 0x5c, 0x90, 0x08, 0x00, + 0xed, 0xb7, 0x02, 0x00, 0xb4, 0x1d, 0x01, 0x00, 0x25, 0xbc, 0x02, 0x00, + 0xdb, 0xf1, 0x01, 0x00, 0x45, 0xf2, 0x75, 0x3c, 0xc1, 0xf2, 0x00, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x47, 0xf6, 0x01, 0x2c, 0xc1, 0xf2, 0x00, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x33, 0x22, 0x11, 0x00, 0x77, 0x66, 0x55, 0x44, + 0x99, 0x88, 0x00, 0x00, 0x01, 0x32, 0xaa, 0x02, 0x05, 0x20, 0x28, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0xc8, 0x02, 0x32, + 0xb0, 0x00, 0xea, 0x00, 0xb2, 0x00, 0xea, 0x00, 0xb0, 0x00, 0xea, 0x00, + 0xb2, 0x00, 0xea, 0x00, 0xb0, 0x00, 0xea, 0x00, 0xb2, 0x00, 0xea, 0x00, + 0xb0, 0x00, 0xea, 0x00, 0xb2, 0x00, 0xea, 0x00, 0xb0, 0x00, 0xea, 0x00, + 0xb2, 0x00, 0xea, 0x00, 0xb0, 0x00, 0xea, 0x00, 0xb2, 0x00, 0xea, 0x00, + 0xb0, 0x00, 0xea, 0x00, 0xb2, 0x00, 0xea, 0x00, 0xb0, 0x00, 0xea, 0x00, + 0xb2, 0x00, 0xea, 0x00, 0xb0, 0x00, 0xea, 0x00, 0xb2, 0x00, 0xea, 0x00, + 0xb2, 0x00, 0xea, 0x00, 0xb2, 0x00, 0xea, 0x00, 0xb0, 0x00, 0xea, 0x00, + 0xb2, 0x00, 0xea, 0x00, 0xb0, 0x00, 0xea, 0x00, 0xb2, 0x00, 0xea, 0x00, + 0xb0, 0x00, 0xea, 0x00, 0xb2, 0x00, 0xea, 0x00, 0xb0, 0x00, 0xea, 0x00, + 0xb2, 0x00, 0xea, 0x00, 0xb0, 0x00, 0xea, 0x00, 0xb2, 0x00, 0xea, 0x00, + 0xb0, 0x00, 0xea, 0x00, 0xb2, 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x0e, 0x0e, 0x10, 0x10, 0x10, 0x70, 0x17, 0x00, 0x00, + 0x03, 0xe0, 0x09, 0x00, 0x03, 0x20, 0x0b, 0x00, 0x07, 0x20, 0x0b, 0x00, + 0x0b, 0x20, 0x0b, 0x00, 0x0f, 0x20, 0x0b, 0x00, 0x17, 0x20, 0x0b, 0x00, + 0x1f, 0x20, 0x0b, 0x00, 0x27, 0x20, 0x8f, 0x00, 0x27, 0x20, 0x93, 0x0a, + 0x2b, 0x20, 0x9b, 0x13, 0x33, 0x20, 0x9f, 0x1b, 0x02, 0x21, 0x03, 0x24, + 0x03, 0x00, 0x08, 0x00, 0x03, 0x40, 0x08, 0x00, 0x03, 0x80, 0x08, 0x00, + 0x03, 0xc0, 0x08, 0x00, 0x03, 0xe0, 0x09, 0x00, 0x03, 0x20, 0x0b, 0x00, + 0x07, 0x20, 0x0b, 0x00, 0x0b, 0x20, 0x0b, 0x00, 0x0f, 0x20, 0x0b, 0x00, + 0x17, 0x20, 0x0b, 0x00, 0x1f, 0x20, 0x0b, 0x00, 0x27, 0x20, 0x8f, 0x00, + 0x27, 0x20, 0x93, 0x0a, 0x2b, 0x20, 0x9b, 0x13, 0x33, 0x20, 0x9f, 0x1b, + 0x02, 0x21, 0x03, 0x24, 0x03, 0x00, 0x08, 0x00, 0x03, 0x40, 0x08, 0x00, + 0x03, 0x80, 0x08, 0x00, 0x03, 0xc0, 0x08, 0x00, 0x00, 0x00, 0x07, 0x08, + 0x00, 0x10, 0x0e, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x48, 0x00, + 0x48, 0x00, 0xff, 0x08, 0x10, 0x10, 0x00, 0xff, 0x0c, 0x02, 0x60, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, 0x00, 0x01, 0x03, 0x05, + 0x07, 0x00, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x00, 0xff, 0x0a, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x03, 0x05, 0x05, 0x05, 0x07, 0x05, + 0x09, 0x05, 0x0b, 0x05, 0x0d, 0x05, 0x43, 0x05, 0x45, 0x05, 0x47, 0x05, + 0x49, 0x05, 0x4b, 0x05, 0x4d, 0x05, 0x82, 0x05, 0x84, 0x05, 0x86, 0x05, + 0x88, 0x05, 0x8a, 0x05, 0x8c, 0x05, 0x92, 0x05, 0x94, 0x05, 0x96, 0x05, + 0x98, 0x05, 0x9a, 0x05, 0x9c, 0x05, 0x92, 0x09, 0x94, 0x09, 0x96, 0x09, + 0x98, 0x09, 0x9a, 0x09, 0x9c, 0x09, 0x92, 0x0d, 0x94, 0x0d, 0x96, 0x0d, + 0x98, 0x0d, 0x9a, 0x0d, 0x9c, 0x0d, 0x91, 0x11, 0x93, 0x11, 0x95, 0x11, + 0x97, 0x11, 0x99, 0x11, 0x9b, 0x11, 0x92, 0x15, 0x94, 0x15, 0x96, 0x15, + 0x98, 0x15, 0x9a, 0x15, 0x9c, 0x15, 0x91, 0x19, 0x93, 0x19, 0x95, 0x19, + 0x97, 0x19, 0x99, 0x19, 0x9b, 0x19, 0xa1, 0x19, 0xa3, 0x19, 0xa5, 0x19, + 0xa7, 0x19, 0xa9, 0x19, 0xab, 0x19, 0xa2, 0x1d, 0xa4, 0x1d, 0xa6, 0x1d, + 0xa8, 0x1d, 0xaa, 0x1d, 0xac, 0x1d, 0xe3, 0x1d, 0x44, 0x01, 0x46, 0x01, + 0x48, 0x01, 0x4a, 0x01, 0x4c, 0x01, 0x4e, 0x01, 0x83, 0x01, 0x85, 0x01, + 0x87, 0x01, 0x89, 0x01, 0x8b, 0x01, 0x8d, 0x01, 0xc4, 0x01, 0xc6, 0x01, + 0xc8, 0x01, 0xca, 0x01, 0xcc, 0x01, 0xce, 0x01, 0xd4, 0x01, 0xd6, 0x01, + 0xd8, 0x01, 0xda, 0x01, 0xdc, 0x01, 0xde, 0x01, 0xe4, 0x01, 0xe6, 0x01, + 0xe8, 0x01, 0xea, 0x01, 0xec, 0x01, 0xee, 0x01, 0xe3, 0x05, 0xe5, 0x05, + 0xe7, 0x05, 0xe9, 0x05, 0xeb, 0x05, 0xed, 0x05, 0xe3, 0x09, 0xe5, 0x09, + 0xe7, 0x09, 0xe9, 0x09, 0xeb, 0x09, 0xed, 0x09, 0xe2, 0x0d, 0xe4, 0x0d, + 0xe6, 0x0d, 0xe8, 0x0d, 0xea, 0x0d, 0xec, 0x0d, 0xe1, 0x11, 0xe3, 0x11, + 0xe5, 0x11, 0xe7, 0x11, 0xe9, 0x11, 0xeb, 0x11, 0xe3, 0x15, 0xe5, 0x15, + 0xe7, 0x15, 0xe9, 0x15, 0xeb, 0x15, 0xed, 0x15, 0xe2, 0x19, 0xe4, 0x19, + 0xe6, 0x19, 0xe8, 0x19, 0xea, 0x19, 0xec, 0x19, 0xe3, 0x1d, 0x91, 0x11, + 0x93, 0x11, 0x95, 0x11, 0x97, 0x11, 0x99, 0x11, 0x9b, 0x11, 0x92, 0x15, + 0x94, 0x15, 0x96, 0x15, 0x98, 0x15, 0x9a, 0x15, 0x9c, 0x15, 0x91, 0x19, + 0x93, 0x19, 0x95, 0x19, 0x97, 0x19, 0x99, 0x19, 0x9b, 0x19, 0xa1, 0x19, + 0xa3, 0x19, 0xa5, 0x19, 0xa7, 0x19, 0xa9, 0x19, 0xab, 0x19, 0xa2, 0x1d, + 0xa4, 0x1d, 0xa6, 0x1d, 0xa8, 0x1d, 0xaa, 0x1d, 0xac, 0x1d, 0xe3, 0x1d, + 0x00, 0x09, 0xae, 0xb1, 0x21, 0x0f, 0x19, 0x0a, 0xab, 0x50, 0xfa, 0x14, + 0x00, 0x09, 0x05, 0x05, 0x12, 0x08, 0x1e, 0x0f, 0x05, 0xa9, 0xb1, 0x00, + 0x64, 0x00, 0x14, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x0a, + 0x0c, 0x0e, 0x10, 0x40, 0x12, 0x14, 0x16, 0x1e, 0x20, 0x22, 0x24, 0x28, + 0x2e, 0x32, 0x34, 0x38, 0x3a, 0x3c, 0x3e, 0x40, 0x42, 0x44, 0x48, 0x4a, + 0x4c, 0x4e, 0x50, 0x5a, 0x60, 0x66, 0x6e, 0x70, 0x72, 0x74, 0x76, 0x78, + 0x7a, 0xe6, 0x00, 0x00, 0x5e, 0x6b, 0x6b, 0x6b, 0x3e, 0xbe, 0x7b, 0x6d, + 0x7c, 0x7c, 0x7e, 0x46, 0x7a, 0x74, 0x76, 0x7a, 0x78, 0x76, 0x6e, 0x5a, + 0x5a, 0x00, 0x38, 0x00, 0xd0, 0x07, 0x20, 0x4e, 0x00, 0x00, 0x05, 0x01, + 0x38, 0x00, 0x41, 0x00, 0xa0, 0x00, 0x01, 0x04, 0x00, 0x61, 0x3c, 0x30, + 0x30, 0x20, 0x00, 0x00, 0x00, 0x30, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x00, 0x12, 0x00, 0x00, 0x55, 0x65, 0x95, 0x55, 0x55, 0x45, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x51, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0xe7, + 0x00, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x7f, 0x0f, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x76, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, + 0x30, 0x02, 0x04, 0x07, 0x90, 0x01, 0x60, 0x00, 0x1a, 0xff, 0x64, 0x32, + 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x96, 0x00, 0x0f, 0x00, 0x14, 0x00, 0xd0, 0x07, + 0xfb, 0x03, 0x08, 0x04, 0x10, 0x08, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0a, + 0x0c, 0x0e, 0x04, 0x28, 0x04, 0x06, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x00, 0x16, 0x0f, 0x00, 0x84, 0x00, 0x25, 0x00, 0x84, 0x80, 0x1c, 0x00, + 0x44, 0x82, 0x18, 0x00, 0x44, 0x86, 0x18, 0x00, 0x44, 0x8a, 0x18, 0x00, + 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, + 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0xc4, 0x00, 0x25, 0x00, + 0x84, 0x00, 0x1d, 0x00, 0x84, 0x80, 0x14, 0x00, 0x44, 0x82, 0x18, 0x00, + 0x44, 0x86, 0x18, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, + 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, + 0x84, 0x00, 0x25, 0x00, 0x84, 0x80, 0x1c, 0x00, 0x44, 0x82, 0x18, 0x00, + 0x44, 0x86, 0x18, 0x00, 0x44, 0x8a, 0x18, 0x00, 0x14, 0x00, 0x10, 0x00, + 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, + 0x14, 0x00, 0x10, 0x00, 0xc4, 0x00, 0x25, 0x00, 0x84, 0x00, 0x1d, 0x00, + 0x84, 0x80, 0x14, 0x00, 0x44, 0x82, 0x18, 0x00, 0x44, 0x86, 0x18, 0x00, + 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, + 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x90, 0xa0, 0xb0, 0x0b, 0x11, 0x1b, + 0x2b, 0x45, 0x0b, 0x11, 0x1b, 0x2b, 0x45, 0xc4, 0xd6, 0xea, 0xf6, 0x00, + 0xb8, 0xcc, 0xde, 0xea, 0xf6, 0xc4, 0xd6, 0xea, 0xf6, 0x00, 0xb8, 0xcc, + 0xde, 0xea, 0xf6, 0x26, 0x4e, 0x76, 0x8e, 0xa6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x10, 0x00, 0xc0, 0xc6, 0x2d, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x04, 0x00, 0x02, 0x96, + 0x01, 0x32, 0x32, 0x00, 0x01, 0x00, 0x00, 0x00, 0x55, 0xa9, 0xaa, 0xaa, + 0xaa, 0xaa, 0x96, 0xaa, 0x55, 0x55, 0x55, 0x55, 0x55, 0x15, 0x00, 0x00, + 0x8a, 0xaa, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x50, 0xc3, 0x00, 0x00, + 0x0c, 0x1c, 0x7d, 0x7f, 0xfc, 0x01, 0x01, 0x00, 0xe4, 0x07, 0x00, 0x00, + 0x05, 0x06, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x20, 0x04, 0x00, + 0xe4, 0x07, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x22, 0x48, 0x02, 0x4a, + 0x2a, 0x21, 0x2a, 0x23, 0xf4, 0xf7, 0xc8, 0xbe, 0x58, 0xc3, 0x02, 0x00, + 0x80, 0xb5, 0x00, 0xf0, 0x53, 0xf8, 0xbd, 0xe8, 0x80, 0x40, 0xff, 0xf7, + 0xf1, 0xbf, 0x00, 0xbf, 0x90, 0xb1, 0x01, 0x88, 0x5f, 0x29, 0x11, 0xd0, + 0xfe, 0x29, 0x15, 0xd0, 0xcd, 0x29, 0x1b, 0xd0, 0xf3, 0x29, 0x1f, 0xd0, + 0x74, 0x29, 0x18, 0xbf, 0x00, 0xf0, 0x46, 0xb8, 0x00, 0x21, 0x01, 0x72, + 0x14, 0x49, 0x41, 0x60, 0x24, 0x21, 0x1a, 0xe0, 0x00, 0x20, 0x70, 0x47, + 0x00, 0x21, 0x01, 0x72, 0x0d, 0x49, 0x41, 0x60, 0xc8, 0x21, 0x12, 0xe0, + 0x00, 0x21, 0x01, 0x72, 0x06, 0x21, 0x41, 0x80, 0x08, 0x49, 0x06, 0x31, + 0x41, 0x60, 0x0b, 0xe0, 0x00, 0x21, 0x01, 0x72, 0x08, 0x49, 0x41, 0x60, + 0x20, 0x21, 0x04, 0xe0, 0x00, 0x21, 0x01, 0x72, 0x04, 0x49, 0x41, 0x60, + 0x2a, 0x21, 0x41, 0x80, 0x01, 0x20, 0x70, 0x47, 0x98, 0x32, 0x06, 0x00, + 0xd0, 0x32, 0x06, 0x00, 0xa4, 0x32, 0x06, 0x00, 0x30, 0x32, 0x06, 0x00, + 0x50, 0x32, 0x06, 0x00, 0x80, 0xb5, 0x04, 0x48, 0x04, 0x49, 0x01, 0x60, + 0xff, 0xf7, 0xae, 0xff, 0x03, 0x48, 0x04, 0x49, 0x01, 0x60, 0x80, 0xbd, + 0x38, 0x90, 0x08, 0x00, 0x95, 0xc2, 0x02, 0x00, 0x60, 0x90, 0x08, 0x00, + 0xa5, 0xc2, 0x02, 0x00, 0x44, 0xf6, 0xf5, 0x5c, 0xc1, 0xf2, 0x00, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x44, 0xf6, 0x19, 0x6c, 0xc1, 0xf2, 0x00, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x00, 0x00, 0x00, 0x00, 0x60, 0x02, 0x00, 0x00, + 0xe0, 0x01, 0x00, 0x00, 0x68, 0x01, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0c, 0x00, + 0x05, 0x05, 0x05, 0x00, 0x01, 0x00, 0x80, 0x02, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x4f, 0x02, 0x00, 0x00, 0x10, 0x33, 0x73, 0x33, 0x33, 0x07, 0x00, + 0x02, 0x00, 0x01, 0x22, 0xd7, 0x03, 0xec, 0x01, 0xda, 0x00, 0x66, 0x06, + 0x33, 0x13, 0x90, 0x00, 0x00, 0x13, 0x36, 0x00, 0x21, 0x00, 0x07, 0x40, + 0x00, 0x28, 0x00, 0x00, 0x10, 0x01, 0x14, 0x64, 0x0a, 0x00, 0x72, 0x01, + 0x2b, 0x2b, 0x44, 0x4a, 0x47, 0x45, 0x45, 0x45, 0x43, 0x44, 0x58, 0x57, + 0x55, 0x54, 0x5a, 0x59, 0x25, 0x40, 0x28, 0x28, 0x39, 0x3d, 0x39, 0x3a, + 0x3a, 0x3a, 0x38, 0x39, 0x44, 0x44, 0x43, 0x42, 0x45, 0x45, 0x24, 0x36, + 0x19, 0x48, 0x40, 0x00, 0x20, 0x40, 0x0a, 0x00, 0x72, 0x06, 0x2c, 0x01, + 0x03, 0x40, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0x03, 0x01, 0x00, + 0x02, 0x00, 0x10, 0x00, 0x07, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, 0xc0, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x14, 0x35, 0x09, 0x01, + 0x00, 0x00, 0x00, 0x90, 0x32, 0x38, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, + 0x00, 0x02, 0x04, 0x03, 0x03, 0x06, 0x00, 0x01, 0x51, 0x32, 0xd0, 0x0d, + 0xb2, 0x26, 0xf2, 0x08, 0x0e, 0x05, 0x84, 0x06, 0x8e, 0x12, 0xdb, 0x06, + 0x5e, 0x01, 0xd6, 0x03, 0xb0, 0x02, 0x2e, 0x00, 0x45, 0x00, 0x67, 0x00, + 0x9a, 0x00, 0xe7, 0x00, 0x14, 0x00, 0x90, 0x01, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x46, + 0x00, 0xf0, 0xfc, 0xf8, 0x00, 0xb1, 0x10, 0xbd, 0x4c, 0x49, 0x4f, 0xf6, + 0x0a, 0x43, 0xb1, 0xf8, 0x7c, 0x20, 0x9a, 0x42, 0xf7, 0xd1, 0xe2, 0x78, + 0x0a, 0x2a, 0xf4, 0xd1, 0x91, 0xf8, 0x79, 0x20, 0x0a, 0x2a, 0x06, 0xd0, + 0x02, 0x2a, 0xee, 0xd1, 0xe2, 0x7f, 0xd2, 0x09, 0x81, 0xf8, 0x98, 0x20, + 0x10, 0xbd, 0x94, 0xf8, 0x22, 0x10, 0x01, 0xf0, 0x03, 0x01, 0x03, 0x29, + 0x02, 0x49, 0x14, 0xbf, 0x00, 0x22, 0x01, 0x22, 0x0a, 0x70, 0x10, 0xbd, + 0x84, 0xe4, 0x05, 0x00, 0x7c, 0xb5, 0x06, 0x9d, 0x00, 0x95, 0x00, 0xf0, + 0xd9, 0xf8, 0x04, 0x46, 0x08, 0xb1, 0x20, 0x46, 0x7c, 0xbd, 0x0d, 0x4e, + 0x05, 0xeb, 0x85, 0x05, 0x56, 0xf8, 0x35, 0x00, 0x00, 0x28, 0xf6, 0xd0, + 0x01, 0x78, 0x00, 0x29, 0xf3, 0xd1, 0x32, 0x49, 0x91, 0xf8, 0x79, 0x10, + 0x00, 0x29, 0xee, 0xd1, 0x06, 0x49, 0x0a, 0x68, 0x08, 0x21, 0x90, 0x47, + 0x00, 0x28, 0xe8, 0xd0, 0x06, 0xeb, 0xc5, 0x00, 0x40, 0xf2, 0x53, 0x11, + 0xc1, 0x82, 0xe2, 0xe7, 0x40, 0x01, 0x00, 0x00, 0x0c, 0xbb, 0x08, 0x00, + 0x70, 0xb5, 0x04, 0x46, 0x00, 0x78, 0x26, 0x4e, 0x61, 0x78, 0x40, 0xea, + 0x01, 0x25, 0xa6, 0xf8, 0x7c, 0x50, 0xe0, 0x78, 0xa6, 0xf8, 0x7e, 0x00, + 0x48, 0x48, 0x00, 0x78, 0x01, 0x28, 0x17, 0xd1, 0x20, 0x48, 0x21, 0x49, + 0x22, 0x22, 0x03, 0x68, 0x20, 0x46, 0x98, 0x47, 0xe0, 0xb1, 0xe0, 0x78, + 0x13, 0x28, 0x1a, 0xd1, 0x1d, 0x48, 0x90, 0xf8, 0x62, 0x00, 0x48, 0xb1, + 0x21, 0x79, 0x06, 0xf1, 0x29, 0x02, 0x00, 0x23, 0x16, 0x78, 0xae, 0xb9, + 0x01, 0x33, 0x30, 0x32, 0x83, 0x42, 0xf9, 0xd3, 0xa9, 0xb2, 0x02, 0x20, + 0x0c, 0x22, 0xfa, 0xf7, 0xc9, 0xfb, 0x28, 0xb1, 0xe1, 0x78, 0x81, 0x71, + 0xbd, 0xe8, 0x70, 0x40, 0xfa, 0xf7, 0x98, 0xbb, 0x70, 0xbd, 0x20, 0x46, + 0xbd, 0xe8, 0x70, 0x40, 0x00, 0xf0, 0x82, 0xb8, 0x0e, 0x48, 0x00, 0x7a, + 0x18, 0xb1, 0x0e, 0x48, 0x00, 0x78, 0x80, 0x07, 0x01, 0xd4, 0x0c, 0x22, + 0x09, 0xe0, 0x39, 0xb1, 0x02, 0x29, 0x05, 0xd8, 0x0a, 0x48, 0x02, 0x68, + 0x60, 0x1d, 0x90, 0x47, 0x00, 0x22, 0x00, 0xe0, 0x12, 0x22, 0xa9, 0xb2, + 0x02, 0x20, 0xda, 0xe7, 0x4c, 0x49, 0x01, 0x00, 0x58, 0x9c, 0x08, 0x00, + 0xb2, 0x2f, 0x04, 0x10, 0x40, 0x86, 0x08, 0x00, 0xa8, 0x35, 0x01, 0x00, + 0xa4, 0x5a, 0x01, 0x00, 0x20, 0xe2, 0x08, 0x00, 0xb0, 0xb5, 0x1f, 0x4a, + 0x04, 0x46, 0x00, 0x78, 0x61, 0x78, 0x12, 0x78, 0x01, 0x2a, 0x12, 0xd1, + 0xe2, 0x78, 0x40, 0xea, 0x01, 0x21, 0x02, 0x2a, 0x17, 0xd0, 0x01, 0x2a, + 0x24, 0xd1, 0xc6, 0x20, 0x00, 0x22, 0xfa, 0xf7, 0x85, 0xfb, 0x50, 0xb3, + 0x05, 0x46, 0xe0, 0x78, 0xa8, 0x71, 0x28, 0x46, 0x01, 0xf0, 0xba, 0xff, + 0x1e, 0xe0, 0x40, 0xea, 0x01, 0x21, 0x02, 0x20, 0x0c, 0x22, 0xfa, 0xf7, + 0x77, 0xfb, 0xe0, 0xb1, 0xe1, 0x78, 0x81, 0x71, 0x15, 0xe0, 0x04, 0x20, + 0x00, 0x22, 0xfa, 0xf7, 0x6f, 0xfb, 0xa0, 0xb1, 0x05, 0x46, 0x20, 0x46, + 0x02, 0xf0, 0x1a, 0xf8, 0xe1, 0x78, 0xe8, 0x71, 0xa9, 0x71, 0x01, 0x0a, + 0x29, 0x72, 0x05, 0xe0, 0x02, 0x20, 0x01, 0x22, 0xfa, 0xf7, 0x60, 0xfb, + 0x05, 0x46, 0x20, 0xb1, 0x28, 0x46, 0xbd, 0xe8, 0xb0, 0x40, 0xfa, 0xf7, + 0x2f, 0xbb, 0xb0, 0xbd, 0x48, 0x49, 0x01, 0x00, 0x03, 0x48, 0x04, 0x49, + 0x01, 0x60, 0x04, 0x48, 0x04, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0x6c, 0xd9, 0x08, 0x00, 0x9d, 0xc4, 0x02, 0x00, 0x5c, 0xe2, 0x08, 0x00, + 0x4d, 0xc4, 0x02, 0x00, 0x42, 0xf2, 0x91, 0x2c, 0xc1, 0xf2, 0x04, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x42, 0xf2, 0x51, 0x3c, 0xc1, 0xf2, 0x04, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x42, 0xf6, 0x11, 0x3c, 0xc1, 0xf2, 0x04, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0xb0, 0xb5, 0x0c, 0x46, 0x05, 0x46, 0x00, 0xf0, + 0xc5, 0xfe, 0x03, 0x28, 0x18, 0xbf, 0xb0, 0xbd, 0x03, 0x48, 0x21, 0x46, + 0x02, 0x68, 0x28, 0x46, 0xbd, 0xe8, 0xb0, 0x40, 0x10, 0x47, 0x00, 0xbf, + 0x80, 0xaf, 0x08, 0x00, 0xd0, 0xf8, 0xbc, 0x05, 0x13, 0x23, 0x90, 0xf8, + 0x3e, 0x00, 0xc0, 0xf1, 0x05, 0x02, 0x12, 0xfb, 0x03, 0xf2, 0x8a, 0x42, + 0x01, 0xdd, 0x01, 0x30, 0x09, 0xe0, 0x06, 0x4b, 0x1b, 0x89, 0x1a, 0x44, + 0x8a, 0x42, 0x04, 0xda, 0x41, 0x1e, 0x08, 0xbf, 0x01, 0x46, 0xc8, 0xb2, + 0x70, 0x47, 0xc0, 0xb2, 0x70, 0x47, 0x00, 0xbf, 0xda, 0xd2, 0x05, 0x00, + 0x2d, 0xe9, 0xf8, 0x43, 0x07, 0x46, 0x72, 0x48, 0x98, 0x46, 0x91, 0x46, + 0x0e, 0x46, 0x3c, 0x0c, 0x00, 0x68, 0x80, 0x47, 0x01, 0x28, 0x1b, 0xd1, + 0x6e, 0x48, 0xb9, 0xb2, 0x6e, 0x4f, 0x05, 0x22, 0x04, 0x23, 0x00, 0xf5, + 0xd5, 0x60, 0x37, 0xf8, 0x13, 0x50, 0xa9, 0x42, 0x0b, 0xd8, 0x30, 0xf8, + 0x06, 0x5c, 0xac, 0x42, 0x07, 0xd8, 0x50, 0xf8, 0x04, 0x5c, 0xae, 0x42, + 0x03, 0xd8, 0x05, 0x68, 0xa9, 0x45, 0x40, 0xf2, 0xc2, 0x80, 0x0c, 0x38, + 0x01, 0x3b, 0x01, 0x3a, 0xeb, 0xd1, 0x13, 0xe0, 0x60, 0x48, 0x05, 0x27, + 0x05, 0x21, 0x00, 0xf5, 0xd5, 0x60, 0x30, 0xf8, 0x06, 0x2c, 0x94, 0x42, + 0x06, 0xd8, 0x50, 0xf8, 0x04, 0x2c, 0x96, 0x42, 0x02, 0xd8, 0x02, 0x68, + 0x91, 0x45, 0x04, 0xd9, 0x0c, 0x38, 0x01, 0x3f, 0x01, 0x39, 0xf0, 0xd1, + 0x01, 0x27, 0xd2, 0x48, 0x81, 0x89, 0x40, 0x46, 0xff, 0xf7, 0xa2, 0xff, + 0xf9, 0xb2, 0x00, 0x22, 0x88, 0x42, 0xd2, 0x49, 0x38, 0xbf, 0x01, 0x22, + 0x8a, 0x70, 0x38, 0xbf, 0x07, 0x46, 0xf8, 0xb2, 0x05, 0x28, 0x0e, 0xd1, + 0xb8, 0xf8, 0x3e, 0x04, 0x42, 0xf2, 0x04, 0x22, 0x10, 0x42, 0x01, 0xd0, + 0x05, 0x27, 0x06, 0xe0, 0x49, 0x48, 0x04, 0x27, 0x90, 0xf8, 0xae, 0x06, + 0x00, 0x28, 0x08, 0xbf, 0x05, 0x27, 0xc3, 0x48, 0x02, 0x7a, 0x2a, 0xb1, + 0xd8, 0xf8, 0xbc, 0x25, 0x92, 0xf8, 0x44, 0x20, 0x92, 0x07, 0x09, 0xd4, + 0xfa, 0xb2, 0x04, 0x2a, 0x1b, 0xd3, 0x44, 0x4a, 0x92, 0xf8, 0x2f, 0x22, + 0x00, 0x2a, 0x18, 0xbf, 0x03, 0x27, 0x14, 0xe0, 0xfa, 0xb2, 0x04, 0x2a, + 0x11, 0xd3, 0x3d, 0x4a, 0x12, 0x7d, 0x22, 0xb1, 0x39, 0x4a, 0x92, 0xf8, + 0xaf, 0x26, 0xd2, 0x07, 0x08, 0xd1, 0x3a, 0x4a, 0x12, 0x7b, 0x00, 0x2a, + 0xe9, 0xd0, 0x35, 0x4a, 0x92, 0xf8, 0xaf, 0x26, 0x92, 0x07, 0xe4, 0xd5, + 0x03, 0x27, 0x32, 0x4a, 0x92, 0xf8, 0xec, 0x22, 0x1a, 0xb1, 0x34, 0x4a, + 0x92, 0xf8, 0xfe, 0x26, 0x32, 0xb9, 0x33, 0x4a, 0x92, 0xf8, 0x3e, 0x26, + 0xaa, 0xb1, 0x49, 0x79, 0x01, 0x29, 0x12, 0xd1, 0x30, 0x49, 0x91, 0xf8, + 0x79, 0x20, 0xf9, 0xb2, 0x02, 0x29, 0x07, 0xd3, 0x01, 0x24, 0x04, 0x2a, + 0x0a, 0xd0, 0x0a, 0x2a, 0x04, 0xd0, 0x40, 0x2a, 0x05, 0xd1, 0x05, 0xe0, + 0x0a, 0x2a, 0x02, 0xd1, 0x03, 0x29, 0x28, 0xbf, 0x03, 0x27, 0x3c, 0x46, + 0xd8, 0xf8, 0xbc, 0x15, 0x02, 0x23, 0xe4, 0xb2, 0x91, 0xf8, 0x3e, 0x20, + 0x03, 0x2a, 0x88, 0xbf, 0x01, 0x23, 0x83, 0x72, 0x94, 0x42, 0x01, 0xd2, + 0x00, 0x20, 0x03, 0xe0, 0x05, 0x2a, 0x19, 0xd1, 0x00, 0x20, 0x05, 0x22, + 0xd5, 0xb2, 0xac, 0x42, 0x12, 0xd8, 0x01, 0x2d, 0x10, 0xd0, 0x91, 0xf8, + 0x43, 0x60, 0x01, 0x36, 0x81, 0xf8, 0x43, 0x60, 0xf6, 0xb2, 0x9e, 0x42, + 0x08, 0xd3, 0xac, 0x42, 0x06, 0xd2, 0x00, 0x20, 0xa1, 0xf8, 0x42, 0x00, + 0x50, 0x1e, 0x81, 0xf8, 0x3e, 0x00, 0x01, 0x20, 0xbd, 0xe8, 0xf8, 0x83, + 0x91, 0xf8, 0x42, 0x50, 0xc0, 0x7a, 0x01, 0x35, 0x81, 0xf8, 0x42, 0x50, + 0xed, 0xb2, 0x85, 0x42, 0xd8, 0xd3, 0x00, 0x20, 0x94, 0x42, 0xdb, 0xd9, + 0xa1, 0xf8, 0x42, 0x00, 0x01, 0x32, 0x01, 0x20, 0x81, 0xf8, 0x3e, 0x20, + 0xd4, 0xe7, 0x5f, 0x1c, 0x55, 0xe7, 0x00, 0xbf, 0x74, 0xcf, 0x08, 0x00, + 0x8c, 0x7e, 0x08, 0x00, 0xe4, 0x05, 0x01, 0x00, 0x7c, 0x5c, 0x01, 0x00, + 0x24, 0x5c, 0x01, 0x00, 0x38, 0x21, 0x01, 0x00, 0x64, 0xd4, 0x05, 0x00, + 0x4c, 0x49, 0x01, 0x00, 0x2d, 0xe9, 0xff, 0x41, 0xd0, 0xb3, 0x04, 0x46, + 0xd0, 0xf8, 0xbc, 0x05, 0xb0, 0xb3, 0x00, 0xf0, 0xa1, 0xfd, 0x30, 0x48, + 0x21, 0x46, 0x02, 0x68, 0x01, 0xa8, 0x90, 0x47, 0x2e, 0x48, 0x01, 0xaa, + 0x23, 0x46, 0x05, 0x68, 0x07, 0xca, 0xa8, 0x47, 0x6b, 0x4f, 0x05, 0x46, + 0x38, 0x7a, 0x38, 0xb1, 0xd4, 0xf8, 0xbc, 0x05, 0x90, 0xf8, 0x44, 0x10, + 0xc9, 0x07, 0x18, 0xbf, 0x00, 0x2d, 0x1f, 0xd1, 0x01, 0xa9, 0x28, 0x46, + 0x22, 0x46, 0x00, 0xf0, 0x4b, 0xf8, 0xd4, 0xf8, 0xbc, 0x05, 0x00, 0x25, + 0xc5, 0x86, 0xc0, 0xe9, 0x05, 0x55, 0xf4, 0xf7, 0x7f, 0xfb, 0xd4, 0xf8, + 0xbc, 0x15, 0x0a, 0x23, 0x8d, 0x87, 0xc1, 0xe9, 0x07, 0x55, 0x4d, 0x62, + 0x3a, 0x88, 0x52, 0x01, 0xb2, 0xfb, 0xf3, 0xf2, 0x10, 0x44, 0x20, 0xf0, + 0x70, 0x40, 0x08, 0x61, 0x00, 0xf0, 0x72, 0xfd, 0xbd, 0xe8, 0xff, 0x81, + 0x06, 0x69, 0x70, 0x1c, 0xdc, 0xd0, 0xf4, 0xf7, 0x67, 0xfb, 0x30, 0x1a, + 0x20, 0xf0, 0x70, 0x40, 0xb0, 0xf1, 0x00, 0x6f, 0xd4, 0xd9, 0x38, 0x88, + 0x0a, 0x21, 0x40, 0x01, 0xb0, 0xfb, 0xf1, 0xf6, 0xf4, 0xf7, 0x5a, 0xfb, + 0xd4, 0xf8, 0xbc, 0x15, 0x0a, 0x69, 0x8b, 0x69, 0xc9, 0x6a, 0x80, 0x1a, + 0xda, 0x00, 0x30, 0x44, 0x00, 0xeb, 0x80, 0x00, 0xc0, 0xf3, 0x0f, 0x10, + 0xb2, 0xfb, 0xf0, 0xf8, 0x06, 0x48, 0x06, 0x68, 0x08, 0x46, 0xfd, 0xf7, + 0xb3, 0xff, 0x01, 0x46, 0x20, 0x46, 0x42, 0x46, 0xb0, 0x47, 0xb5, 0xe7, + 0xe4, 0xa3, 0x08, 0x00, 0xe8, 0xa3, 0x08, 0x00, 0xe0, 0xa3, 0x08, 0x00, + 0x2d, 0xe9, 0xf8, 0x43, 0xd2, 0xf8, 0xbc, 0xe5, 0x91, 0x46, 0x03, 0x22, + 0x80, 0x46, 0x8e, 0xf8, 0x41, 0x20, 0x37, 0x4a, 0x13, 0x68, 0x96, 0x6a, + 0x4b, 0x45, 0x18, 0xbf, 0x1e, 0x46, 0xbe, 0xb1, 0xd6, 0xf8, 0xbc, 0x25, + 0x92, 0xf8, 0x41, 0x30, 0x93, 0xb1, 0x03, 0x2b, 0x55, 0xd1, 0xdf, 0xf8, + 0xc4, 0xc0, 0x92, 0xf8, 0x3e, 0x20, 0x9e, 0xf8, 0x3e, 0x70, 0x9c, 0xf8, + 0x0e, 0x30, 0x97, 0x42, 0x4d, 0xd9, 0x93, 0x42, 0x1c, 0xbf, 0x8c, 0xf8, + 0x0e, 0x20, 0x4f, 0xf0, 0x01, 0x08, 0x04, 0xe0, 0x9e, 0xf8, 0x3e, 0x20, + 0x27, 0x4b, 0x00, 0x26, 0x9a, 0x73, 0x0f, 0x46, 0x25, 0x4b, 0x97, 0xe8, + 0x31, 0x00, 0x25, 0x4f, 0x31, 0xc3, 0x38, 0x7a, 0x78, 0xb3, 0x9e, 0xf8, + 0x44, 0x00, 0x80, 0x07, 0x2b, 0xd5, 0x22, 0x48, 0x89, 0x78, 0x03, 0x68, + 0x48, 0x46, 0x98, 0x47, 0x20, 0x49, 0x08, 0x78, 0x01, 0x30, 0x08, 0x70, + 0xc0, 0xb2, 0x09, 0x28, 0x0c, 0xd8, 0xb8, 0xf1, 0x00, 0x0f, 0x09, 0xd1, + 0xd9, 0xf8, 0xbc, 0xe5, 0xf8, 0x7a, 0x9e, 0xf8, 0x42, 0x20, 0x82, 0x42, + 0x15, 0xd3, 0x19, 0x48, 0x80, 0x78, 0x90, 0xb1, 0x00, 0x20, 0x13, 0x4b, + 0x00, 0x22, 0x08, 0x70, 0x16, 0x48, 0x01, 0x21, 0x04, 0x68, 0x10, 0x20, + 0x00, 0x90, 0x40, 0xf6, 0x07, 0x10, 0xa0, 0x47, 0x13, 0x48, 0x12, 0x21, + 0x00, 0x78, 0xf4, 0xf7, 0xe5, 0xfa, 0xd9, 0xf8, 0xbc, 0xe5, 0x04, 0x21, + 0x8e, 0xf8, 0x41, 0x10, 0x1e, 0xb1, 0xd6, 0xf8, 0xbc, 0x05, 0x80, 0xf8, + 0x41, 0x10, 0xbd, 0xe8, 0xf8, 0x83, 0xbb, 0x42, 0x1c, 0xbf, 0x8c, 0xf8, + 0x0e, 0x70, 0x4f, 0xf0, 0x01, 0x08, 0x3a, 0x46, 0xb5, 0xe7, 0x00, 0xbf, + 0x40, 0x01, 0x00, 0x00, 0xa4, 0x4a, 0x01, 0x00, 0xa8, 0x35, 0x01, 0x00, + 0x5c, 0xaf, 0x08, 0x00, 0xb5, 0x4a, 0x01, 0x00, 0x48, 0xdc, 0x05, 0x00, + 0xa0, 0xa0, 0x08, 0x00, 0x66, 0x34, 0x01, 0x00, 0x70, 0xb5, 0x04, 0x46, + 0x90, 0xf8, 0x88, 0x04, 0x80, 0x07, 0x00, 0xd4, 0x70, 0xbd, 0x94, 0xf8, + 0xa4, 0x04, 0x41, 0x07, 0x01, 0xd5, 0x00, 0x07, 0xf8, 0xd5, 0x94, 0xf8, + 0xf5, 0x04, 0x40, 0xbb, 0x43, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, + 0x18, 0xbb, 0x94, 0xf8, 0xf4, 0x04, 0x00, 0xbb, 0xd4, 0xf8, 0x04, 0x05, + 0x80, 0xb1, 0xf4, 0xf7, 0x97, 0xfa, 0xd4, 0xf8, 0x04, 0x15, 0x40, 0x1a, + 0x3c, 0x49, 0x08, 0x40, 0xb0, 0xf5, 0xc8, 0x5f, 0x06, 0xd3, 0x3b, 0x48, + 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x01, 0x20, 0x84, 0xf8, 0xf4, 0x04, + 0x38, 0x48, 0x90, 0xf8, 0x4d, 0x00, 0x02, 0x28, 0x07, 0xd3, 0x40, 0xf2, + 0x59, 0x10, 0xc4, 0xf8, 0x0c, 0x05, 0x35, 0x48, 0x01, 0x68, 0x20, 0x46, + 0x88, 0x47, 0x34, 0x48, 0x01, 0x68, 0x14, 0x20, 0x88, 0x47, 0xd4, 0xf8, + 0xbc, 0x05, 0x00, 0x28, 0x4f, 0xd0, 0x31, 0x48, 0x05, 0x68, 0xf4, 0xf7, + 0x6f, 0xfa, 0x28, 0x1a, 0x20, 0xf0, 0x70, 0x40, 0xb0, 0xf1, 0x00, 0x6f, + 0x03, 0xd9, 0x70, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0xd4, 0xf8, + 0xbc, 0x05, 0x05, 0x69, 0xf4, 0xf7, 0x60, 0xfa, 0x28, 0x1a, 0x20, 0xf0, + 0x70, 0x40, 0xb0, 0xf1, 0x00, 0x6f, 0x36, 0xd9, 0x67, 0x48, 0x02, 0x68, + 0xd4, 0xf8, 0xbc, 0x05, 0xc1, 0x6a, 0x20, 0x46, 0x90, 0x47, 0xd4, 0xf8, + 0xbc, 0x65, 0x05, 0x46, 0x64, 0x49, 0xf0, 0x62, 0x02, 0x20, 0x86, 0xf8, + 0x41, 0x00, 0x30, 0x6b, 0xf6, 0xf7, 0x06, 0xfc, 0x4f, 0xf0, 0x76, 0x51, + 0xf6, 0xf7, 0x02, 0xfc, 0x04, 0x46, 0xf0, 0x8e, 0xf6, 0xf7, 0x0a, 0xfc, + 0x4f, 0xf0, 0x76, 0x51, 0xf6, 0xf7, 0xfa, 0xfb, 0x01, 0x46, 0x20, 0x46, + 0xf6, 0xf7, 0xfc, 0xfb, 0x01, 0x46, 0x30, 0x63, 0x28, 0x46, 0xf6, 0xf7, + 0xf7, 0xfb, 0x57, 0x49, 0x04, 0x46, 0x28, 0x46, 0xf6, 0xf7, 0xec, 0xfb, + 0x21, 0x46, 0xf6, 0xf7, 0xfb, 0xfb, 0xfd, 0xf7, 0x95, 0xfe, 0x70, 0x61, + 0x52, 0x48, 0x22, 0x21, 0x00, 0x78, 0xf4, 0xf7, 0x2f, 0xfa, 0x0a, 0x48, + 0x01, 0x68, 0x14, 0x20, 0xbd, 0xe8, 0x70, 0x40, 0x08, 0x47, 0x00, 0xbf, + 0x54, 0x9d, 0x08, 0x00, 0x00, 0xff, 0xff, 0x0f, 0x38, 0xa2, 0x08, 0x00, + 0x18, 0x74, 0x01, 0x00, 0x00, 0xe2, 0x08, 0x00, 0x40, 0x9d, 0x08, 0x00, + 0xac, 0x76, 0x01, 0x00, 0x44, 0x9d, 0x08, 0x00, 0xf8, 0xb5, 0x68, 0xb1, + 0x04, 0x46, 0x90, 0xf8, 0x88, 0x04, 0x80, 0x07, 0x08, 0xd5, 0xd4, 0xf8, + 0xbc, 0x05, 0x28, 0xb1, 0x94, 0xf8, 0xa4, 0x04, 0x41, 0x07, 0x02, 0xd5, + 0x00, 0x07, 0x00, 0xd4, 0xf8, 0xbd, 0x37, 0x48, 0x01, 0x68, 0x20, 0x46, + 0x88, 0x47, 0xfb, 0x4e, 0x35, 0x4d, 0x20, 0x46, 0x71, 0x68, 0x2a, 0x68, + 0x90, 0x47, 0x70, 0x60, 0x36, 0x68, 0xf4, 0xf7, 0xed, 0xf9, 0x30, 0x1a, + 0x20, 0xf0, 0x70, 0x40, 0xb0, 0xf1, 0x00, 0x6f, 0x03, 0xd9, 0x2f, 0x48, + 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0xd4, 0xf8, 0xbc, 0x05, 0x06, 0x69, + 0xf4, 0xf7, 0xde, 0xf9, 0x30, 0x1a, 0x20, 0xf0, 0x70, 0x40, 0xb0, 0xf1, + 0x00, 0x6f, 0x35, 0xd9, 0xd4, 0xf8, 0xbc, 0x05, 0x2a, 0x68, 0xc1, 0x6a, + 0x20, 0x46, 0x90, 0x47, 0xd4, 0xf8, 0xbc, 0x75, 0x05, 0x46, 0x24, 0x49, + 0xf8, 0x62, 0x02, 0x20, 0x87, 0xf8, 0x41, 0x00, 0x38, 0x6b, 0xf6, 0xf7, + 0x85, 0xfb, 0x4f, 0xf0, 0x76, 0x51, 0xf6, 0xf7, 0x81, 0xfb, 0x06, 0x46, + 0xf8, 0x8e, 0xf6, 0xf7, 0x89, 0xfb, 0x4f, 0xf0, 0x76, 0x51, 0xf6, 0xf7, + 0x79, 0xfb, 0x01, 0x46, 0x30, 0x46, 0xf6, 0xf7, 0x7b, 0xfb, 0x01, 0x46, + 0x38, 0x63, 0x28, 0x46, 0xf6, 0xf7, 0x76, 0xfb, 0x16, 0x49, 0x06, 0x46, + 0x28, 0x46, 0xf6, 0xf7, 0x6b, 0xfb, 0x31, 0x46, 0xf6, 0xf7, 0x7a, 0xfb, + 0xfd, 0xf7, 0x14, 0xfe, 0x78, 0x61, 0x12, 0x48, 0x22, 0x21, 0x00, 0x78, + 0xf4, 0xf7, 0xae, 0xf9, 0x94, 0xf8, 0x33, 0x04, 0xc1, 0x07, 0xa1, 0xd0, + 0x80, 0x07, 0x9f, 0xd5, 0xf4, 0xf7, 0x9a, 0xf9, 0x05, 0x46, 0x20, 0x46, + 0x00, 0xf0, 0xa0, 0xfb, 0xd4, 0xf8, 0xbc, 0x15, 0x28, 0x1a, 0x20, 0xf0, + 0x70, 0x40, 0xca, 0x69, 0x10, 0x44, 0xc8, 0x61, 0xf8, 0xbd, 0x00, 0xbf, + 0x30, 0xa2, 0x08, 0x00, 0x34, 0xa2, 0x08, 0x00, 0x2c, 0xa2, 0x08, 0x00, + 0x00, 0x00, 0x70, 0x41, 0x00, 0x00, 0xc8, 0x42, 0x67, 0x34, 0x01, 0x00, + 0x2d, 0xe9, 0xf0, 0x4f, 0x85, 0xb0, 0x82, 0x46, 0xbc, 0x48, 0x89, 0x46, + 0x01, 0x68, 0x50, 0x46, 0x88, 0x47, 0xbb, 0x49, 0x01, 0xf1, 0x0e, 0x07, + 0xba, 0x49, 0x01, 0xf1, 0x4d, 0x05, 0xcd, 0xe9, 0x03, 0x75, 0xd0, 0xb1, + 0xb8, 0x48, 0x01, 0x68, 0x50, 0x46, 0x88, 0x47, 0x00, 0x28, 0x00, 0xf0, + 0x84, 0x80, 0x84, 0x46, 0x64, 0x20, 0xbb, 0x79, 0x3a, 0x79, 0x0c, 0xfb, + 0x00, 0xf0, 0xb0, 0xfb, 0xf3, 0xf1, 0x33, 0x2a, 0x39, 0xd8, 0x0b, 0x22, + 0xa1, 0xf1, 0x0a, 0x08, 0x13, 0xfb, 0x02, 0xf2, 0x90, 0x42, 0x38, 0xbf, + 0x4f, 0xf0, 0x00, 0x08, 0x73, 0xe0, 0x28, 0x78, 0x02, 0x28, 0x32, 0xd3, + 0xdf, 0xf8, 0xac, 0xb2, 0xab, 0x4d, 0xdf, 0xf8, 0xa4, 0x82, 0x00, 0x27, + 0x00, 0x26, 0x0b, 0xeb, 0x47, 0x01, 0xb1, 0xf8, 0x48, 0x16, 0x01, 0xeb, + 0x41, 0x01, 0x55, 0xf8, 0x21, 0x10, 0x09, 0x6a, 0xb9, 0xb1, 0xb8, 0xf8, + 0x1e, 0x05, 0x03, 0x30, 0x20, 0xf0, 0x03, 0x00, 0x0a, 0x18, 0x08, 0x5c, + 0x51, 0x78, 0x93, 0x78, 0xd2, 0x78, 0x40, 0xea, 0x01, 0x20, 0x40, 0xea, + 0x03, 0x40, 0x40, 0xea, 0x02, 0x64, 0xf4, 0xf7, 0x2d, 0xf9, 0x00, 0x1b, + 0x20, 0xf0, 0x70, 0x40, 0x06, 0x44, 0x04, 0x98, 0x00, 0x78, 0x01, 0x37, + 0x87, 0x42, 0xda, 0xd3, 0x20, 0xe0, 0x03, 0x20, 0xb2, 0xfb, 0xf0, 0xf0, + 0x01, 0xeb, 0x00, 0x08, 0x3d, 0xe0, 0xda, 0xf8, 0x20, 0x00, 0xb0, 0xb1, + 0x8f, 0x49, 0xb1, 0xf8, 0x1e, 0x15, 0x03, 0x31, 0x21, 0xf0, 0x03, 0x01, + 0x42, 0x18, 0x40, 0x5c, 0x51, 0x78, 0x93, 0x78, 0xd2, 0x78, 0x40, 0xea, + 0x01, 0x20, 0x40, 0xea, 0x03, 0x40, 0x40, 0xea, 0x02, 0x64, 0xf4, 0xf7, + 0x07, 0xf9, 0x00, 0x1b, 0x20, 0xf0, 0x70, 0x46, 0x00, 0xe0, 0x00, 0x26, + 0x06, 0xeb, 0x86, 0x01, 0xc1, 0xf3, 0x1a, 0x10, 0x4a, 0x00, 0x84, 0x49, + 0x03, 0x9f, 0x4b, 0x78, 0x8c, 0x78, 0x23, 0x44, 0xb3, 0xeb, 0x52, 0x1f, + 0x10, 0xd2, 0x04, 0x9d, 0x0a, 0x1d, 0x00, 0x21, 0x01, 0x31, 0x07, 0x29, + 0x00, 0xf0, 0xd7, 0x80, 0xd3, 0x1c, 0x14, 0x78, 0x52, 0x78, 0x22, 0x44, + 0x90, 0x42, 0x1a, 0x46, 0xf4, 0xd8, 0x13, 0xf8, 0x07, 0x8c, 0x02, 0xe0, + 0x04, 0x9d, 0x4f, 0xf0, 0x00, 0x08, 0x4f, 0xf0, 0x00, 0x0c, 0xfa, 0x79, + 0x51, 0x1f, 0x41, 0x45, 0x02, 0xd9, 0x05, 0x2a, 0x88, 0xbf, 0x88, 0x46, + 0x72, 0x4b, 0xf8, 0x78, 0x1b, 0x78, 0x1b, 0x1a, 0x28, 0x78, 0x1b, 0x1a, + 0x02, 0x28, 0x03, 0xeb, 0x83, 0x03, 0x4f, 0xea, 0x43, 0x03, 0x7b, 0x70, + 0x0d, 0xd3, 0xeb, 0x4c, 0x94, 0xf9, 0x3c, 0x50, 0xb5, 0xf1, 0xff, 0x3f, + 0x07, 0xdc, 0x80, 0x35, 0x05, 0xd0, 0x94, 0xf8, 0x3d, 0x40, 0x01, 0x2c, + 0x04, 0xbf, 0x0a, 0x33, 0x7b, 0x70, 0x3c, 0x79, 0x64, 0x26, 0x04, 0xfb, + 0x09, 0xf5, 0xe1, 0x46, 0xb5, 0xfb, 0xf6, 0xf5, 0x56, 0x1d, 0x2c, 0x44, + 0xe5, 0xb2, 0x3c, 0x70, 0xae, 0x42, 0x03, 0xd3, 0x05, 0x2a, 0x4b, 0xd3, + 0xa9, 0x42, 0x49, 0xdd, 0xaa, 0x42, 0x84, 0xbf, 0x39, 0x70, 0x0c, 0x46, + 0xd9, 0xb2, 0xfc, 0x71, 0xba, 0x78, 0x51, 0xfa, 0x84, 0xf1, 0x8c, 0x18, + 0x58, 0x49, 0xa0, 0x45, 0x82, 0xbf, 0x87, 0xf8, 0x00, 0x80, 0x87, 0xf8, + 0x07, 0x80, 0x44, 0x46, 0x09, 0x7d, 0x00, 0x29, 0x18, 0xbf, 0x0a, 0x34, + 0x02, 0x28, 0x73, 0xd3, 0xdf, 0xf8, 0x34, 0xb1, 0x4d, 0x4e, 0xdf, 0xf8, + 0x44, 0xa1, 0x00, 0x25, 0x0b, 0xeb, 0x45, 0x00, 0xb0, 0xf8, 0x48, 0x06, + 0x00, 0xeb, 0x40, 0x00, 0x56, 0xf8, 0x20, 0x00, 0x90, 0xf8, 0xf6, 0x14, + 0x49, 0xb1, 0x03, 0x99, 0xda, 0xf8, 0x00, 0x70, 0x01, 0x23, 0x0a, 0x79, + 0x90, 0xf8, 0x35, 0x11, 0xcd, 0xe9, 0x00, 0x8c, 0x0e, 0xe0, 0x03, 0x9a, + 0x90, 0xf8, 0x35, 0x11, 0xda, 0xf8, 0x00, 0x70, 0xcd, 0xe9, 0x00, 0x8c, + 0x12, 0x79, 0xa3, 0x18, 0x5f, 0x2b, 0x88, 0xbf, 0xc2, 0xf1, 0x5f, 0x04, + 0xe2, 0xb2, 0x02, 0x23, 0xb8, 0x47, 0x04, 0x98, 0x01, 0x35, 0xcc, 0x46, + 0x00, 0x78, 0x85, 0x42, 0xd4, 0xd3, 0x5b, 0xe0, 0xb0, 0x45, 0x59, 0xd9, + 0x03, 0x9a, 0x58, 0xfa, 0x83, 0xf1, 0x82, 0xf8, 0x07, 0x80, 0x82, 0xf8, + 0x00, 0x80, 0x92, 0x78, 0x8c, 0x18, 0x33, 0x49, 0x09, 0x7d, 0x00, 0x29, + 0x18, 0xbf, 0x0a, 0x34, 0x02, 0x28, 0x3b, 0xd3, 0xdf, 0xf8, 0xac, 0xb0, + 0xdf, 0xf8, 0xac, 0xa0, 0x2e, 0x4e, 0x00, 0x25, 0x0b, 0xeb, 0x45, 0x00, + 0xb0, 0xf8, 0x48, 0x06, 0x00, 0xeb, 0x40, 0x00, 0x5a, 0xf8, 0x20, 0x00, + 0x90, 0xf8, 0xf6, 0x14, 0x41, 0xb1, 0x03, 0x99, 0x37, 0x68, 0x04, 0x23, + 0x0a, 0x79, 0x90, 0xf8, 0x35, 0x11, 0xcd, 0xe9, 0x00, 0x8c, 0x0d, 0xe0, + 0x03, 0x9a, 0x90, 0xf8, 0x35, 0x11, 0x37, 0x68, 0xcd, 0xe9, 0x00, 0x8c, + 0x12, 0x79, 0xa3, 0x18, 0x5f, 0x2b, 0x88, 0xbf, 0xc2, 0xf1, 0x5f, 0x04, + 0xe2, 0xb2, 0x05, 0x23, 0xb8, 0x47, 0x04, 0x98, 0x01, 0x35, 0xcc, 0x46, + 0x00, 0x78, 0x85, 0x42, 0xd6, 0xd3, 0x19, 0xe0, 0x18, 0x48, 0x9a, 0xf8, + 0x35, 0x11, 0xcd, 0xe9, 0x00, 0x8c, 0x5f, 0x2c, 0x4f, 0xf0, 0x03, 0x03, + 0x0a, 0xe0, 0x12, 0xf8, 0x04, 0x8c, 0x32, 0xe7, 0x12, 0x48, 0x9a, 0xf8, + 0x35, 0x11, 0xcd, 0xe9, 0x00, 0x8c, 0x5f, 0x2c, 0x4f, 0xf0, 0x06, 0x03, + 0x05, 0x68, 0x28, 0xbf, 0x5f, 0x24, 0xe2, 0xb2, 0x50, 0x46, 0xa8, 0x47, + 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0xbf, 0x54, 0x9d, 0x08, 0x00, + 0xac, 0x76, 0x01, 0x00, 0x18, 0x74, 0x01, 0x00, 0x50, 0x9d, 0x08, 0x00, + 0x8c, 0x7e, 0x08, 0x00, 0x64, 0xd4, 0x05, 0x00, 0xe8, 0x72, 0x01, 0x00, + 0xe4, 0xd2, 0x05, 0x00, 0x5c, 0x34, 0x01, 0x00, 0x7c, 0x5c, 0x01, 0x00, + 0x2c, 0xce, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, 0x8d, 0xb0, 0x71, 0x4d, + 0x06, 0x46, 0x28, 0x68, 0x0c, 0x90, 0x70, 0x48, 0x00, 0x78, 0x00, 0x28, + 0x00, 0xf0, 0xd1, 0x80, 0x6e, 0x48, 0x90, 0x46, 0x8a, 0x46, 0x00, 0x24, + 0x90, 0xf8, 0x78, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x02, 0x28, 0x12, 0xd1, + 0x03, 0x20, 0x8d, 0xf8, 0x0f, 0x80, 0x8d, 0xf8, 0x0e, 0x40, 0x8d, 0xf8, + 0x0d, 0x00, 0x11, 0x20, 0x8d, 0xf8, 0x0c, 0x00, 0x65, 0x48, 0x01, 0x68, + 0x30, 0x46, 0x88, 0x47, 0x01, 0x27, 0x05, 0x24, 0x8d, 0xf8, 0x10, 0x00, + 0x00, 0xe0, 0x00, 0x27, 0x61, 0x48, 0x90, 0xf8, 0x79, 0x00, 0x0a, 0x28, + 0x04, 0xd0, 0x40, 0x28, 0x6b, 0xd0, 0x0c, 0x28, 0x40, 0xf0, 0xa3, 0x80, + 0x5d, 0x49, 0x03, 0xad, 0x05, 0x20, 0xcd, 0xe9, 0x01, 0x78, 0x4f, 0xf0, + 0x02, 0x0b, 0x4f, 0xf0, 0x01, 0x09, 0x28, 0x55, 0x44, 0xf0, 0x02, 0x00, + 0x0a, 0x78, 0x05, 0xeb, 0x00, 0x08, 0x49, 0x78, 0x88, 0xf8, 0x03, 0x90, + 0x2a, 0x54, 0x06, 0x20, 0x88, 0xf8, 0x01, 0x10, 0x2a, 0x19, 0x88, 0xf8, + 0x02, 0x00, 0x4f, 0x48, 0x82, 0xf8, 0x01, 0xb0, 0x01, 0x68, 0x30, 0x46, + 0x88, 0x47, 0x88, 0xf8, 0x04, 0x00, 0x4e, 0x48, 0x44, 0xf0, 0x0a, 0x01, + 0x08, 0x22, 0x88, 0xf8, 0x07, 0xa0, 0x88, 0xf8, 0x06, 0x90, 0x6a, 0x54, + 0x07, 0x22, 0x6f, 0x18, 0x00, 0x68, 0x88, 0xf8, 0x05, 0x20, 0x87, 0xf8, + 0x01, 0x90, 0x80, 0x47, 0xb8, 0x70, 0x46, 0x48, 0x0e, 0x21, 0x03, 0x22, + 0x87, 0xf8, 0x05, 0x90, 0x87, 0xf8, 0x0a, 0xb0, 0x87, 0xf8, 0x09, 0xb0, + 0x87, 0xf8, 0x0d, 0xb0, 0x05, 0x23, 0x3a, 0x71, 0xf9, 0x70, 0x39, 0x72, + 0xba, 0x73, 0x39, 0x73, 0x00, 0x78, 0xf8, 0x73, 0x3d, 0x48, 0xc0, 0x69, + 0x00, 0x28, 0x18, 0xbf, 0x01, 0x20, 0xb8, 0x71, 0x3b, 0x48, 0x90, 0xf8, + 0x3c, 0x00, 0xc0, 0x09, 0xf8, 0x71, 0x96, 0xf8, 0xb0, 0x05, 0x01, 0x38, + 0xb0, 0xfa, 0x80, 0xf0, 0x4f, 0xea, 0x50, 0x10, 0xf8, 0x72, 0x44, 0xf0, + 0x1a, 0x00, 0x29, 0x54, 0x05, 0xeb, 0x00, 0x01, 0x8b, 0x70, 0x4a, 0x70, + 0x15, 0xd1, 0x96, 0xf8, 0xc3, 0x23, 0x96, 0xf8, 0xc4, 0x33, 0x26, 0x4d, + 0xdd, 0xe9, 0x01, 0x68, 0x2d, 0xe0, 0x03, 0xa8, 0x06, 0x21, 0x96, 0xf8, + 0xa6, 0x20, 0x01, 0x37, 0x01, 0x55, 0x44, 0xf0, 0x02, 0x01, 0x42, 0x54, + 0x20, 0x44, 0x01, 0x22, 0x42, 0x70, 0x48, 0x1c, 0x24, 0xe0, 0xb6, 0xf8, + 0xb8, 0x33, 0x42, 0xf2, 0x04, 0x22, 0x1b, 0x4d, 0x1a, 0x40, 0x18, 0xbf, + 0x01, 0x22, 0xdd, 0xe9, 0x01, 0x68, 0x9c, 0x04, 0x58, 0xbf, 0x5f, 0xea, + 0xc3, 0x44, 0x01, 0xd5, 0x05, 0x23, 0x0e, 0xe0, 0x9c, 0x05, 0x58, 0xbf, + 0x5f, 0xea, 0xc3, 0x54, 0x01, 0xd5, 0x03, 0x23, 0x07, 0xe0, 0x5c, 0x07, + 0x58, 0xbf, 0x5f, 0xea, 0x83, 0x73, 0x01, 0xd5, 0x01, 0x23, 0x00, 0xe0, + 0x00, 0x23, 0x0b, 0x71, 0xca, 0x70, 0xb1, 0x1d, 0x05, 0x30, 0x8f, 0x1c, + 0x25, 0x28, 0x04, 0xd3, 0x00, 0x20, 0x40, 0xf2, 0x33, 0x61, 0xf9, 0xf7, + 0x6b, 0xfd, 0x11, 0x48, 0x03, 0xa9, 0x3a, 0x46, 0x03, 0x68, 0x40, 0x46, + 0x98, 0x47, 0x28, 0x68, 0x0c, 0x99, 0x40, 0x1a, 0x04, 0xbf, 0x0d, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0xf9, 0xf7, 0x4a, 0xfd, 0x38, 0xec, 0x01, 0x00, + 0x80, 0x4a, 0x01, 0x00, 0x40, 0x86, 0x08, 0x00, 0xe4, 0xc2, 0x08, 0x00, + 0x4c, 0x49, 0x01, 0x00, 0xda, 0x05, 0x01, 0x00, 0xd8, 0xc2, 0x08, 0x00, + 0x96, 0x4a, 0x01, 0x00, 0x38, 0x5d, 0x01, 0x00, 0x90, 0x01, 0x00, 0x00, + 0xe8, 0xc2, 0x08, 0x00, 0xf8, 0xb5, 0x30, 0xb1, 0x04, 0x46, 0x1b, 0x48, + 0x1a, 0x21, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0x00, 0xb1, 0xf8, 0xbd, + 0x18, 0x4f, 0x4d, 0x49, 0xd7, 0xe9, 0x01, 0x50, 0xf6, 0xf7, 0x9e, 0xf8, + 0x4f, 0xf0, 0x76, 0x51, 0xf6, 0xf7, 0x9a, 0xf8, 0x06, 0x46, 0xb8, 0x89, + 0xf6, 0xf7, 0xa2, 0xf8, 0x4f, 0xf0, 0x76, 0x51, 0xf6, 0xf7, 0x92, 0xf8, + 0x01, 0x46, 0x30, 0x46, 0xf6, 0xf7, 0x94, 0xf8, 0x0e, 0x49, 0x06, 0x46, + 0xb8, 0x60, 0x28, 0x46, 0xf6, 0xf7, 0x88, 0xf8, 0x31, 0x46, 0xf6, 0xf7, + 0x97, 0xf8, 0xfd, 0xf7, 0x31, 0xfb, 0x01, 0x46, 0x55, 0x48, 0x02, 0x68, + 0x20, 0x46, 0x90, 0x47, 0x00, 0x20, 0xb8, 0x81, 0xf3, 0xf7, 0xbc, 0xfe, + 0xa0, 0x30, 0x20, 0xf0, 0x70, 0x40, 0x38, 0x60, 0xf8, 0xbd, 0x00, 0xbf, + 0x0c, 0xbb, 0x08, 0x00, 0xac, 0x76, 0x01, 0x00, 0x00, 0x00, 0xc8, 0x42, + 0xf8, 0xb5, 0x8c, 0x46, 0x2e, 0x49, 0x91, 0xf8, 0x4d, 0x10, 0x02, 0x29, + 0x2a, 0xd3, 0x2d, 0x48, 0xdf, 0xf8, 0xb4, 0xe0, 0x00, 0x23, 0x00, 0x24, + 0x00, 0xf5, 0xc9, 0x60, 0x02, 0x88, 0x02, 0xeb, 0x42, 0x02, 0x5e, 0xf8, + 0x22, 0x60, 0xd6, 0xf8, 0xd4, 0x20, 0x52, 0x7f, 0x62, 0xb1, 0xb6, 0xf8, + 0x76, 0x71, 0xb6, 0xf8, 0x78, 0x21, 0xb6, 0xf8, 0x80, 0x61, 0xd5, 0x19, + 0xb5, 0x42, 0x3e, 0xbf, 0x34, 0x44, 0xe4, 0x1b, 0xa4, 0x1a, 0x08, 0xe0, + 0xb6, 0xf8, 0x74, 0x21, 0x22, 0x44, 0xb6, 0xf8, 0x82, 0x41, 0x22, 0x44, + 0x96, 0xf8, 0x89, 0x41, 0x14, 0x44, 0x01, 0x33, 0x02, 0x30, 0x8b, 0x42, + 0xdc, 0xd1, 0x18, 0xe0, 0xd0, 0xf8, 0xd4, 0x10, 0x49, 0x7f, 0x61, 0xb1, + 0xb0, 0xf8, 0x76, 0x11, 0xb0, 0xf8, 0x78, 0x21, 0xb0, 0xf8, 0x80, 0x01, + 0x53, 0x18, 0x83, 0x42, 0x3a, 0xbf, 0x40, 0x1a, 0x84, 0x1a, 0x00, 0x24, + 0x07, 0xe0, 0xb0, 0xf8, 0x74, 0x11, 0xb0, 0xf8, 0x82, 0x21, 0x90, 0xf8, + 0x89, 0x01, 0x11, 0x44, 0x0c, 0x18, 0x0d, 0x49, 0x60, 0x46, 0xf6, 0xf7, + 0x1f, 0xf8, 0x4f, 0xf0, 0x76, 0x51, 0xf6, 0xf7, 0x1b, 0xf8, 0x05, 0x46, + 0x20, 0x46, 0xf6, 0xf7, 0x23, 0xf8, 0x4f, 0xf0, 0x76, 0x51, 0xf6, 0xf7, + 0x13, 0xf8, 0x01, 0x46, 0x28, 0x46, 0xf6, 0xf7, 0x15, 0xf8, 0xf8, 0xbd, + 0x18, 0x74, 0x01, 0x00, 0x64, 0xd4, 0x05, 0x00, 0xe8, 0x72, 0x01, 0x00, + 0x00, 0x00, 0x70, 0x41, 0x0d, 0x48, 0x0e, 0x49, 0x01, 0x60, 0x0e, 0x48, + 0x0e, 0x49, 0x01, 0x60, 0x0e, 0x48, 0x0f, 0x49, 0x01, 0x60, 0x0f, 0x48, + 0x0f, 0x49, 0x01, 0x60, 0x0f, 0x48, 0x10, 0x49, 0x01, 0x60, 0x10, 0x48, + 0x10, 0x49, 0x01, 0x60, 0x10, 0x48, 0x11, 0x49, 0x01, 0x60, 0x11, 0x48, + 0x11, 0x49, 0x01, 0x60, 0x11, 0x48, 0x12, 0x49, 0x01, 0x60, 0x70, 0x47, + 0xe8, 0xa3, 0x08, 0x00, 0xcd, 0xc6, 0x02, 0x00, 0x84, 0xaf, 0x08, 0x00, + 0x71, 0xc6, 0x02, 0x00, 0x7c, 0xaf, 0x08, 0x00, 0xbd, 0xc8, 0x02, 0x00, + 0x20, 0xb8, 0x08, 0x00, 0xad, 0xca, 0x02, 0x00, 0x38, 0xe3, 0x08, 0x00, + 0xfd, 0xcb, 0x02, 0x00, 0x58, 0xaf, 0x08, 0x00, 0x15, 0xcd, 0x02, 0x00, + 0x5c, 0xaf, 0x08, 0x00, 0x3d, 0xd0, 0x02, 0x00, 0x2c, 0xa2, 0x08, 0x00, + 0x35, 0xd2, 0x02, 0x00, 0x34, 0xa2, 0x08, 0x00, 0xb5, 0xd2, 0x02, 0x00, + 0x40, 0xf6, 0xdd, 0x0c, 0xc1, 0xf2, 0x04, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x47, 0xf6, 0x05, 0x5c, 0xc1, 0xf2, 0x11, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x47, 0xf6, 0x39, 0x5c, 0xc1, 0xf2, 0x11, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4e, 0xf6, 0x9d, 0x4c, 0xc1, 0xf2, 0x03, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0xf0, 0xb5, 0xb0, 0xf8, 0x3e, 0xe4, 0x5f, 0xea, 0x8e, 0x62, 0x44, 0xbf, + 0x08, 0x20, 0xf0, 0xbd, 0x05, 0x78, 0x1d, 0x4b, 0x1d, 0x4a, 0x37, 0x4e, + 0x01, 0x24, 0x00, 0x2d, 0x08, 0xbf, 0x1a, 0x46, 0x4f, 0xf0, 0x07, 0x03, + 0x06, 0xeb, 0xc5, 0x15, 0x08, 0xbf, 0x06, 0x23, 0xb0, 0xf8, 0x26, 0xc4, + 0x00, 0x20, 0x32, 0xf8, 0x20, 0x60, 0x35, 0xf8, 0x36, 0x70, 0x8f, 0x42, + 0x05, 0xd3, 0x02, 0xeb, 0x80, 0x07, 0x7f, 0x88, 0x17, 0xea, 0x0e, 0x0f, + 0x05, 0xd1, 0xe0, 0xb2, 0x66, 0x1c, 0x83, 0x42, 0x34, 0x46, 0xee, 0xd8, + 0x76, 0x46, 0x83, 0x42, 0x1c, 0xbf, 0x30, 0x46, 0xf0, 0xbd, 0x00, 0x24, + 0x01, 0x21, 0x32, 0xf8, 0x24, 0x00, 0x35, 0xf8, 0x30, 0x70, 0xbc, 0x45, + 0x04, 0xd3, 0x02, 0xeb, 0x84, 0x04, 0x64, 0x88, 0x34, 0x42, 0x05, 0xd1, + 0xcc, 0xb2, 0x48, 0x1c, 0xa3, 0x42, 0x01, 0x46, 0xef, 0xd8, 0x03, 0x20, + 0xf0, 0xbd, 0x00, 0xbf, 0x16, 0xd3, 0x05, 0x00, 0xfa, 0xd2, 0x05, 0x00, + 0xf8, 0xb5, 0x04, 0x46, 0x01, 0xfb, 0x02, 0xf6, 0x06, 0xf1, 0x11, 0x00, + 0xb4, 0xf8, 0x26, 0x24, 0x81, 0xb2, 0xb1, 0xfb, 0xf2, 0xf7, 0x07, 0xfb, + 0x12, 0x00, 0x85, 0xb2, 0x20, 0x46, 0x29, 0x46, 0xff, 0xf7, 0xa6, 0xff, + 0x22, 0x78, 0x0f, 0x4b, 0xf9, 0xb2, 0x00, 0x2d, 0x03, 0xeb, 0xc2, 0x12, + 0xb4, 0xf8, 0x40, 0x34, 0x02, 0xeb, 0xc0, 0x00, 0x02, 0xeb, 0xc3, 0x03, + 0x00, 0x79, 0x1b, 0x79, 0x03, 0xf1, 0x01, 0x03, 0x13, 0xfb, 0x01, 0x00, + 0x00, 0xf1, 0x01, 0x00, 0x08, 0xbf, 0x13, 0xfb, 0x01, 0xf0, 0xb1, 0xb2, + 0x00, 0xeb, 0x80, 0x00, 0xc9, 0x00, 0xb1, 0xfb, 0xf0, 0xf0, 0x80, 0xb2, + 0xf8, 0xbd, 0x00, 0xbf, 0x86, 0x71, 0x0d, 0x10, 0x2d, 0xe9, 0xf0, 0x47, + 0x80, 0x46, 0xa1, 0xf1, 0x11, 0x00, 0x14, 0x46, 0x90, 0xfb, 0xf2, 0xf0, + 0x0e, 0x28, 0x07, 0xdc, 0x5f, 0xfa, 0x80, 0xf9, 0xb9, 0xf1, 0x00, 0x0f, + 0x08, 0xbf, 0x4f, 0xf0, 0x01, 0x09, 0x01, 0xe0, 0x4f, 0xf0, 0x0f, 0x09, + 0x00, 0x27, 0x02, 0x25, 0x68, 0x1e, 0x22, 0x46, 0xc6, 0xb2, 0x40, 0x46, + 0x31, 0x46, 0xff, 0xf7, 0xaf, 0xff, 0xb9, 0xb2, 0x88, 0x42, 0x82, 0xbf, + 0x06, 0xfb, 0x04, 0xf1, 0x01, 0xf1, 0x0d, 0x0a, 0x07, 0x46, 0x68, 0x1c, + 0xe9, 0xb2, 0x05, 0x46, 0x89, 0x45, 0xeb, 0xd2, 0x1f, 0xfa, 0x8a, 0xf0, + 0xbd, 0xe8, 0xf0, 0x87, 0x2d, 0xe9, 0xf0, 0x4f, 0x87, 0xb0, 0x43, 0x4e, + 0x0d, 0x46, 0x04, 0x46, 0x37, 0x68, 0x3f, 0xb1, 0xb7, 0xf8, 0xd2, 0x01, + 0x0a, 0x28, 0x03, 0xd1, 0x97, 0xf8, 0xd1, 0x01, 0x04, 0x28, 0x09, 0xd9, + 0x3d, 0x48, 0x90, 0xf8, 0x79, 0x00, 0x40, 0x07, 0x04, 0xd5, 0x1f, 0xb1, + 0x97, 0xf8, 0xb0, 0x05, 0x01, 0x28, 0x06, 0xd1, 0x20, 0x46, 0x29, 0x46, + 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, 0x00, 0xf0, 0xb7, 0xb8, 0xdf, 0xf8, + 0xd8, 0x90, 0xb9, 0xf8, 0x04, 0x00, 0x00, 0x28, 0xf2, 0xd0, 0xb7, 0xf8, + 0x26, 0x04, 0xb9, 0xf8, 0x00, 0x10, 0x81, 0x42, 0x52, 0xd0, 0x31, 0x48, + 0xdf, 0xf8, 0xc8, 0xb0, 0xd0, 0xf8, 0x00, 0x80, 0x2f, 0x48, 0xd0, 0xf8, + 0x00, 0xa0, 0xdb, 0xf8, 0x00, 0x00, 0x80, 0x47, 0xb9, 0xf8, 0x04, 0x20, + 0x01, 0x46, 0x38, 0x46, 0xff, 0xf7, 0x94, 0xff, 0xd0, 0x47, 0x30, 0x68, + 0xb0, 0xf8, 0x26, 0x04, 0xa9, 0xf8, 0x00, 0x00, 0x00, 0x20, 0xcd, 0xe9, + 0x04, 0x00, 0xcd, 0xe9, 0x02, 0x00, 0xdb, 0xf8, 0x00, 0x00, 0x80, 0x47, + 0x95, 0xf8, 0x3d, 0x10, 0xad, 0xf8, 0x08, 0x00, 0xb9, 0xf8, 0x04, 0x00, + 0x8d, 0xf8, 0x16, 0x10, 0x31, 0x68, 0xad, 0xf8, 0x0e, 0x00, 0x38, 0x48, + 0xb1, 0xf8, 0x26, 0x24, 0x00, 0x89, 0xad, 0xf8, 0x0a, 0x20, 0xb1, 0xf8, + 0x40, 0x24, 0xad, 0xf8, 0x12, 0x00, 0xa0, 0x42, 0x4f, 0xf0, 0x00, 0x00, + 0xad, 0xf8, 0x0c, 0x20, 0x09, 0x78, 0xad, 0xf8, 0x14, 0x40, 0x8d, 0xf8, + 0x10, 0x10, 0x38, 0xbf, 0x01, 0x20, 0x8d, 0xf8, 0x11, 0x00, 0x41, 0x46, + 0x12, 0x48, 0x02, 0x68, 0x0e, 0x48, 0x00, 0x68, 0x90, 0x47, 0x06, 0x90, + 0x10, 0x48, 0x02, 0xab, 0x00, 0x21, 0x00, 0x22, 0x05, 0x68, 0x14, 0x20, + 0x00, 0x90, 0x40, 0xf6, 0x5e, 0x10, 0xa8, 0x47, 0x23, 0x48, 0x01, 0x89, + 0x00, 0x20, 0xa1, 0x42, 0x38, 0xbf, 0x01, 0x20, 0x07, 0xb0, 0xbd, 0xe8, + 0xf0, 0x8f, 0x00, 0xbf, 0x40, 0x01, 0x00, 0x00, 0x40, 0x86, 0x08, 0x00, + 0x86, 0xe4, 0x05, 0x00, 0x24, 0x20, 0x00, 0x40, 0x2c, 0xe2, 0x08, 0x00, + 0x28, 0xe2, 0x08, 0x00, 0x1c, 0x9d, 0x08, 0x00, 0xa0, 0xa0, 0x08, 0x00, + 0x10, 0xb5, 0x04, 0x46, 0x00, 0xf0, 0x40, 0xf8, 0x3c, 0xb1, 0x0c, 0x2c, + 0x01, 0xd0, 0x0a, 0x2c, 0x09, 0xd1, 0x06, 0x48, 0x07, 0x49, 0x01, 0x61, + 0x10, 0xbd, 0x03, 0x48, 0x00, 0x21, 0x01, 0x80, 0x02, 0x48, 0x03, 0x49, + 0xc1, 0x61, 0x10, 0xbd, 0x86, 0xe4, 0x05, 0x00, 0xec, 0x4a, 0x01, 0x00, + 0x89, 0xd5, 0x02, 0x00, 0xf5, 0xd6, 0x02, 0x00, 0x07, 0x48, 0x00, 0x78, + 0x01, 0x28, 0x08, 0xd1, 0x07, 0x48, 0x08, 0x49, 0x00, 0x68, 0xc9, 0x6e, + 0x48, 0x43, 0x07, 0x49, 0xb0, 0xfb, 0xf1, 0xf0, 0x70, 0x47, 0x02, 0x48, + 0x00, 0x68, 0x70, 0x47, 0x84, 0xe4, 0x05, 0x00, 0xe8, 0x49, 0x01, 0x00, + 0x98, 0x4a, 0x01, 0x00, 0x4c, 0x49, 0x01, 0x00, 0x40, 0x42, 0x0f, 0x00, + 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, 0xf4, 0xaf, 0x08, 0x00, + 0xbd, 0xd6, 0x02, 0x00, 0x44, 0xf2, 0xa5, 0x0c, 0xc1, 0xf2, 0x04, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x43, 0xf6, 0x5d, 0x6c, 0xc1, 0xf2, 0x04, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x10, 0xb5, 0x01, 0xf0, 0xef, 0xf8, 0x13, 0x49, + 0x91, 0xf8, 0x79, 0x10, 0x8a, 0x1e, 0xd3, 0xb2, 0x09, 0x2b, 0x07, 0xd8, + 0x53, 0xb2, 0x10, 0x4a, 0x10, 0x4c, 0x52, 0xf8, 0x23, 0x20, 0x54, 0xf8, + 0x23, 0x30, 0x02, 0xe0, 0x96, 0x22, 0x40, 0xf2, 0x59, 0x13, 0x5a, 0x43, + 0xcb, 0x23, 0x40, 0xf2, 0xa7, 0x24, 0x03, 0xeb, 0xd2, 0x02, 0x4f, 0xf6, + 0xfc, 0x73, 0x03, 0xea, 0x02, 0x03, 0xb3, 0xfb, 0xf4, 0xf3, 0x07, 0x4c, + 0x23, 0x75, 0x01, 0xb1, 0x10, 0xbd, 0x22, 0xf0, 0x03, 0x01, 0x05, 0x4a, + 0x51, 0x80, 0x10, 0xbd, 0x4c, 0x49, 0x01, 0x00, 0x24, 0xce, 0x05, 0x00, + 0xfc, 0xcd, 0x05, 0x00, 0xac, 0x76, 0x01, 0x00, 0x90, 0x4a, 0x01, 0x00, + 0x2d, 0xe9, 0xf0, 0x41, 0x86, 0xb0, 0x07, 0x46, 0x25, 0x48, 0x00, 0x26, + 0x90, 0x46, 0x0d, 0x46, 0x0d, 0xf1, 0x16, 0x01, 0x03, 0xaa, 0x05, 0xab, + 0xad, 0xf8, 0x16, 0x60, 0xad, 0xf8, 0x14, 0x60, 0xcd, 0xe9, 0x03, 0x66, + 0x04, 0x68, 0x04, 0xa8, 0xa0, 0x47, 0xbd, 0xf8, 0x16, 0x20, 0xbd, 0xf8, + 0x14, 0x00, 0x10, 0x44, 0x06, 0x28, 0x2e, 0xd3, 0x67, 0xb3, 0x00, 0x20, + 0x0d, 0xf1, 0x06, 0x01, 0x5a, 0xb1, 0x04, 0x9a, 0x53, 0x1c, 0x04, 0x93, + 0x12, 0x78, 0x01, 0xf8, 0x01, 0x2b, 0xbd, 0xf8, 0x16, 0x20, 0x01, 0x3a, + 0xad, 0xf8, 0x16, 0x20, 0x0d, 0xe0, 0xbd, 0xf8, 0x14, 0x20, 0x52, 0xb1, + 0x03, 0x9a, 0x53, 0x1c, 0x03, 0x93, 0x12, 0x78, 0x01, 0xf8, 0x01, 0x2b, + 0xbd, 0xf8, 0x14, 0x20, 0x01, 0x3a, 0xad, 0xf8, 0x14, 0x20, 0x01, 0x30, + 0x06, 0x28, 0x02, 0xd0, 0xbd, 0xf8, 0x16, 0x20, 0xde, 0xe7, 0x0c, 0x48, + 0x29, 0x46, 0x42, 0x46, 0x03, 0x68, 0x0d, 0xf1, 0x06, 0x00, 0x98, 0x47, + 0x06, 0x46, 0x00, 0xe0, 0x00, 0x26, 0x30, 0x46, 0x06, 0xb0, 0xbd, 0xe8, + 0xf0, 0x81, 0x00, 0xbf, 0x78, 0x9d, 0x08, 0x00, 0x18, 0xb1, 0x03, 0x48, + 0x03, 0x68, 0x03, 0x48, 0x18, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0xbf, + 0xc0, 0xae, 0x08, 0x00, 0x8c, 0xe4, 0x05, 0x00, 0x70, 0xb5, 0xb0, 0xb3, + 0x04, 0x46, 0xd0, 0xf8, 0xbc, 0x05, 0x90, 0xb3, 0x19, 0x48, 0x01, 0x68, + 0x20, 0x46, 0x88, 0x47, 0x88, 0xb1, 0xf3, 0xf7, 0xc3, 0xfb, 0x05, 0x46, + 0x16, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x28, 0x1a, 0xd4, 0xf8, + 0xbc, 0x55, 0x20, 0xf0, 0x70, 0x40, 0xa8, 0x62, 0x00, 0xeb, 0x80, 0x00, + 0xc0, 0xf3, 0x1a, 0x10, 0x03, 0xe0, 0xd4, 0xf8, 0xbc, 0x55, 0x00, 0x20, + 0xa8, 0x62, 0x0e, 0x49, 0x8a, 0x88, 0x81, 0xb2, 0x91, 0x42, 0x12, 0xd3, + 0x95, 0xf8, 0x3e, 0x60, 0x04, 0x2e, 0x0e, 0xd3, 0x20, 0x46, 0xfe, 0xf7, + 0xe3, 0xfe, 0xb0, 0x42, 0x09, 0xd2, 0x02, 0x20, 0x22, 0x21, 0x85, 0xf8, + 0x41, 0x00, 0x06, 0x48, 0x00, 0x78, 0xbd, 0xe8, 0x70, 0x40, 0xf3, 0xf7, + 0xa3, 0xbb, 0x70, 0xbd, 0x4c, 0x9d, 0x08, 0x00, 0x58, 0x9d, 0x08, 0x00, + 0xee, 0x05, 0x01, 0x00, 0x67, 0x34, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x46, + 0x40, 0x89, 0xe1, 0x88, 0x11, 0xf0, 0x03, 0x05, 0x04, 0xd0, 0x24, 0xf0, + 0xb5, 0xfb, 0x6f, 0xf3, 0x9f, 0x30, 0x06, 0xe0, 0x21, 0x89, 0x01, 0xf0, + 0x01, 0x01, 0x08, 0x44, 0x80, 0xb2, 0x24, 0xf0, 0xab, 0xfb, 0x08, 0x21, + 0x00, 0x2d, 0x08, 0xbf, 0x0a, 0x21, 0x08, 0x44, 0x21, 0x89, 0x08, 0x44, + 0x21, 0x7b, 0x08, 0x44, 0xc0, 0xf3, 0x4f, 0x00, 0xb0, 0xbd, 0x00, 0xbf, + 0x2d, 0xe9, 0xf0, 0x4f, 0x99, 0xb0, 0xdf, 0xf8, 0x7c, 0xc7, 0x06, 0x46, + 0x01, 0xeb, 0x81, 0x00, 0x0f, 0x46, 0x8d, 0xf8, 0x63, 0x10, 0x5c, 0xf8, + 0x30, 0x10, 0x00, 0x29, 0x00, 0xf0, 0xa2, 0x80, 0xdf, 0xf8, 0x64, 0x57, + 0x95, 0xf8, 0x79, 0x40, 0x0c, 0x2c, 0x01, 0xd0, 0x0a, 0x2c, 0x00, 0xd1, + 0x08, 0x3e, 0x07, 0xeb, 0x47, 0x04, 0x05, 0xeb, 0x04, 0x1b, 0x9b, 0xf8, + 0x28, 0x40, 0x00, 0x2c, 0x00, 0xf0, 0x9a, 0x80, 0x0d, 0x92, 0x05, 0xf1, + 0x29, 0x02, 0x05, 0x93, 0x0f, 0x92, 0xdf, 0xf8, 0x3c, 0x27, 0x94, 0x1c, + 0x91, 0xf8, 0xf3, 0x24, 0xba, 0xb1, 0x0c, 0xeb, 0xc0, 0x05, 0xf3, 0xf7, + 0x3d, 0xfb, 0x29, 0x68, 0xc1, 0xf8, 0x04, 0x05, 0xdf, 0xf8, 0x24, 0x07, + 0x00, 0x68, 0x80, 0x47, 0xf3, 0xf7, 0x34, 0xfb, 0x29, 0x68, 0x00, 0x22, + 0xa0, 0x30, 0x20, 0xf0, 0x70, 0x40, 0x81, 0xf8, 0xf3, 0x24, 0xe2, 0x55, + 0xdf, 0xf8, 0x0c, 0x27, 0x10, 0x60, 0xd1, 0xf8, 0x08, 0x05, 0x0e, 0x94, + 0x0d, 0xf1, 0x52, 0x02, 0x15, 0xab, 0x10, 0xfa, 0x86, 0xf0, 0xc1, 0xf8, + 0x08, 0x05, 0xdf, 0xf8, 0xf8, 0x06, 0x16, 0xa9, 0x00, 0xeb, 0x87, 0x19, + 0xdb, 0xf8, 0x20, 0x00, 0x09, 0xf1, 0x0c, 0x04, 0xc9, 0xf8, 0x18, 0x00, + 0xdf, 0xf8, 0xe4, 0x06, 0x05, 0x68, 0x14, 0xa8, 0x00, 0x90, 0x20, 0x46, + 0xa8, 0x47, 0xc8, 0x46, 0xbd, 0xf8, 0x50, 0x70, 0xbd, 0xf8, 0x52, 0xa0, + 0x38, 0xf8, 0x30, 0x0f, 0x58, 0xb1, 0x99, 0xf8, 0x4a, 0x00, 0x40, 0xb9, + 0x00, 0x20, 0xa8, 0xf8, 0x00, 0x00, 0x89, 0xf8, 0x49, 0x00, 0xdb, 0xf8, + 0x1c, 0x00, 0xc9, 0xf8, 0x14, 0x00, 0x0f, 0x9d, 0xb5, 0xf8, 0x47, 0x00, + 0x28, 0xb9, 0xdf, 0xf8, 0xac, 0x06, 0xff, 0xf7, 0x63, 0xff, 0xa5, 0xf8, + 0x47, 0x00, 0xdf, 0xf8, 0xa0, 0x06, 0xb2, 0xb2, 0x90, 0xf8, 0x21, 0x10, + 0xc9, 0x07, 0x1c, 0xbf, 0x80, 0x8c, 0xa5, 0xf8, 0x47, 0x00, 0x0d, 0x98, + 0x07, 0xeb, 0x0a, 0x01, 0x00, 0x28, 0x18, 0xbf, 0x01, 0x20, 0x22, 0xfa, + 0x00, 0xf3, 0x0c, 0x92, 0x0e, 0x98, 0xcd, 0xe9, 0x0a, 0x13, 0x43, 0x80, + 0xb8, 0xf8, 0x00, 0x00, 0x70, 0xb3, 0xdf, 0xf8, 0x70, 0x06, 0x8a, 0xb2, + 0x59, 0x46, 0x06, 0x68, 0x00, 0x20, 0x00, 0x90, 0x20, 0x46, 0xb0, 0x47, + 0x0b, 0x99, 0xdf, 0xf8, 0x3c, 0x66, 0x00, 0x28, 0x08, 0x46, 0x25, 0xd0, + 0xb8, 0xf8, 0x00, 0x00, 0x00, 0x28, 0x08, 0x46, 0x20, 0xd1, 0xdf, 0xf8, + 0x3c, 0x06, 0x40, 0x89, 0x08, 0x44, 0x1b, 0xe0, 0xdf, 0xf8, 0x80, 0x06, + 0x0d, 0xf1, 0x63, 0x03, 0x04, 0x68, 0x01, 0x20, 0x00, 0x90, 0x40, 0xf6, + 0x0a, 0x10, 0x08, 0xe0, 0xdf, 0xf8, 0x6c, 0x06, 0x0d, 0xf1, 0x63, 0x03, + 0x04, 0x68, 0x01, 0x20, 0x00, 0x90, 0x40, 0xf6, 0x5f, 0x10, 0x00, 0x21, + 0x02, 0x22, 0x83, 0xe0, 0xdf, 0xf8, 0x04, 0x06, 0xdf, 0xf8, 0xec, 0x65, + 0x40, 0x89, 0x18, 0x44, 0x09, 0x90, 0x22, 0x98, 0x37, 0x46, 0x08, 0x94, + 0x48, 0xb1, 0xb8, 0xf8, 0x00, 0x00, 0x90, 0xb1, 0x00, 0x20, 0x00, 0x24, + 0x4f, 0xf0, 0x00, 0x0a, 0x07, 0x90, 0x00, 0x20, 0x1c, 0xe0, 0xdf, 0xf8, + 0xdc, 0x05, 0x00, 0x24, 0x4f, 0xf0, 0x00, 0x0a, 0x46, 0x68, 0x00, 0x20, + 0x07, 0x90, 0x00, 0x20, 0x17, 0x96, 0x06, 0x90, 0x1e, 0xe0, 0x95, 0xf8, + 0x50, 0x00, 0x0c, 0x28, 0x01, 0xd0, 0x0a, 0x28, 0xe6, 0xd1, 0xdf, 0xf8, + 0xc8, 0x05, 0x00, 0x68, 0x80, 0x47, 0x82, 0x46, 0x00, 0x0e, 0x07, 0x90, + 0x4f, 0xea, 0x1a, 0x40, 0x4f, 0xea, 0x1a, 0x24, 0x06, 0x90, 0x9d, 0xf8, + 0x63, 0x00, 0x17, 0xaa, 0x00, 0xeb, 0x80, 0x00, 0x56, 0xf8, 0x30, 0x10, + 0xdf, 0xf8, 0xa4, 0x05, 0x03, 0x68, 0x01, 0x20, 0x98, 0x47, 0x17, 0x9e, + 0xdf, 0xf8, 0x9c, 0x05, 0x0a, 0x21, 0xb0, 0xf8, 0x8c, 0x00, 0x40, 0x01, + 0xb0, 0xfb, 0xf1, 0xf5, 0xf3, 0xf7, 0x5c, 0xfa, 0x30, 0x1a, 0x28, 0x44, + 0x20, 0xf0, 0x70, 0x40, 0xb0, 0xf1, 0x00, 0x6f, 0x36, 0xd9, 0x22, 0x98, + 0x0f, 0x9d, 0xc8, 0xb1, 0x9d, 0xf8, 0x63, 0x00, 0xdf, 0xf8, 0x58, 0x45, + 0x00, 0xeb, 0x80, 0x00, 0x22, 0x1d, 0x57, 0xf8, 0x30, 0x10, 0xdf, 0xf8, + 0x60, 0x05, 0x03, 0x68, 0x01, 0x20, 0x98, 0x47, 0x20, 0x60, 0x95, 0xf8, + 0x50, 0x00, 0x0c, 0x28, 0x01, 0xd0, 0x0a, 0x28, 0x04, 0xd1, 0xdf, 0xf8, + 0x50, 0x05, 0x01, 0x68, 0x08, 0x20, 0x88, 0x47, 0x23, 0x98, 0x20, 0xb1, + 0xdf, 0xf8, 0x40, 0x05, 0x01, 0x68, 0x0c, 0x98, 0x88, 0x47, 0xdb, 0xf8, + 0x08, 0x00, 0x17, 0xab, 0x00, 0x21, 0x00, 0x22, 0x01, 0x30, 0xcb, 0xf8, + 0x08, 0x00, 0xdf, 0xf8, 0x5c, 0x05, 0x04, 0x68, 0x04, 0x20, 0x00, 0x90, + 0x40, 0xf6, 0x03, 0x10, 0xa0, 0x47, 0x19, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0xdd, 0xe9, 0x09, 0x10, 0x0f, 0x9d, 0x3e, 0x46, 0x88, 0x42, 0x1e, 0xd3, + 0x16, 0x98, 0xe0, 0xb1, 0xb8, 0xf8, 0x00, 0x00, 0x00, 0x28, 0x52, 0xd0, + 0x22, 0x98, 0x08, 0x9c, 0x00, 0x28, 0x00, 0xf0, 0x3f, 0x81, 0xdf, 0xf8, + 0xe8, 0x04, 0x00, 0x21, 0x00, 0x22, 0x03, 0x68, 0x00, 0x20, 0x98, 0x47, + 0x95, 0xf8, 0x50, 0x00, 0x0c, 0x28, 0x02, 0xd0, 0x0a, 0x28, 0x40, 0xf0, + 0x31, 0x81, 0xdf, 0xf8, 0xd4, 0x04, 0x01, 0x68, 0x08, 0x20, 0x88, 0x47, + 0x2a, 0xe1, 0x9d, 0xf8, 0x63, 0x00, 0x0e, 0x9a, 0x01, 0x21, 0x0c, 0x9b, + 0x11, 0x54, 0xbb, 0xf8, 0x24, 0x10, 0xdb, 0xf8, 0x2c, 0x20, 0x01, 0x31, + 0x1a, 0x44, 0xab, 0xf8, 0x24, 0x10, 0xcb, 0xf8, 0x2c, 0x20, 0xdb, 0xf8, + 0x10, 0x10, 0xb5, 0xf8, 0x47, 0x20, 0x11, 0x44, 0xcb, 0xf8, 0x10, 0x10, + 0x22, 0x99, 0xb9, 0xb1, 0x00, 0xeb, 0x80, 0x00, 0xdf, 0xf8, 0x74, 0x44, + 0x56, 0xf8, 0x30, 0x10, 0xdf, 0xf8, 0x80, 0x04, 0x22, 0x1d, 0x03, 0x68, + 0x01, 0x20, 0x98, 0x47, 0x20, 0x60, 0x95, 0xf8, 0x50, 0x00, 0x0c, 0x28, + 0x01, 0xd0, 0x0a, 0x28, 0x04, 0xd1, 0xdf, 0xf8, 0x70, 0x04, 0x01, 0x68, + 0x08, 0x20, 0x88, 0x47, 0x23, 0x98, 0x00, 0x28, 0xa3, 0xd0, 0xdf, 0xf8, + 0x60, 0x04, 0x01, 0x68, 0x0c, 0x98, 0x88, 0x47, 0x9d, 0xe7, 0xdf, 0xf8, + 0x58, 0x04, 0x01, 0x68, 0x9d, 0xf8, 0x63, 0x00, 0x88, 0x47, 0x89, 0xf8, + 0x4a, 0x00, 0x95, 0xf8, 0x50, 0x00, 0x0c, 0x28, 0x01, 0xd0, 0x0a, 0x28, + 0x0b, 0xd1, 0xdf, 0xf8, 0x2c, 0x04, 0x00, 0x68, 0x80, 0x47, 0x82, 0x46, + 0x00, 0x0e, 0x07, 0x90, 0x4f, 0xea, 0x1a, 0x40, 0x4f, 0xea, 0x1a, 0x24, + 0x06, 0x90, 0x22, 0x98, 0x58, 0xb3, 0x95, 0xf8, 0x50, 0x00, 0x0c, 0x28, + 0x01, 0xd0, 0x0a, 0x28, 0x03, 0xd1, 0xdf, 0xf8, 0x18, 0x04, 0x00, 0x68, + 0x78, 0xb1, 0x9d, 0xf8, 0x63, 0x00, 0x00, 0xeb, 0x80, 0x00, 0x56, 0xf8, + 0x30, 0x10, 0xdf, 0xf8, 0xf4, 0x03, 0xdf, 0xf8, 0xdc, 0x63, 0x03, 0x68, + 0x32, 0x1d, 0x01, 0x20, 0x98, 0x47, 0x30, 0x60, 0x06, 0xe0, 0xdf, 0xf8, + 0xe0, 0x03, 0x00, 0x21, 0x00, 0x22, 0x03, 0x68, 0x00, 0x20, 0x98, 0x47, + 0x95, 0xf8, 0x50, 0x00, 0x0c, 0x28, 0x01, 0xd0, 0x0a, 0x28, 0x04, 0xd1, + 0xdf, 0xf8, 0xcc, 0x03, 0x01, 0x68, 0x08, 0x20, 0x88, 0x47, 0xdf, 0xf8, + 0xa8, 0x03, 0x17, 0xaa, 0x04, 0x21, 0x04, 0x23, 0x40, 0x68, 0x17, 0x90, + 0x09, 0xf1, 0x39, 0x00, 0xf3, 0xf7, 0x72, 0xf9, 0xdf, 0xf8, 0xb8, 0x63, + 0x31, 0x69, 0x11, 0xb1, 0x58, 0x46, 0x88, 0x47, 0x00, 0xe0, 0x00, 0x20, + 0x01, 0x0a, 0x04, 0x90, 0x89, 0xf8, 0x42, 0x00, 0x89, 0xf8, 0x41, 0x10, + 0x01, 0x0c, 0x00, 0x0e, 0x89, 0xf8, 0x3f, 0x00, 0x95, 0xf8, 0x50, 0x00, + 0x89, 0xf8, 0x40, 0x10, 0x0a, 0x28, 0x0c, 0xd0, 0x0c, 0x28, 0xd9, 0x4d, + 0xdd, 0xe9, 0x06, 0x10, 0x10, 0xd0, 0xf1, 0x68, 0x49, 0xb1, 0x88, 0x47, + 0x82, 0x46, 0x00, 0x20, 0x00, 0x21, 0x00, 0x24, 0x08, 0xe0, 0xd3, 0x4d, + 0xdd, 0xe9, 0x06, 0x10, 0x04, 0xe0, 0x00, 0x20, 0x00, 0x21, 0x00, 0x24, + 0x4f, 0xf0, 0x00, 0x0a, 0x89, 0xf8, 0x44, 0x10, 0xbd, 0xf8, 0x52, 0x10, + 0x89, 0xf8, 0x43, 0x00, 0x16, 0x98, 0x89, 0xf8, 0x45, 0x40, 0x89, 0xf8, + 0x46, 0xa0, 0x08, 0x9c, 0xa9, 0xf8, 0x24, 0x10, 0x15, 0x99, 0xc9, 0xe9, + 0x07, 0x01, 0xbd, 0xf8, 0x50, 0x00, 0xb8, 0xf8, 0x00, 0x10, 0xa9, 0xf8, + 0x26, 0x00, 0xc2, 0x48, 0x40, 0x89, 0x08, 0x44, 0xa8, 0xf8, 0x00, 0x00, + 0x81, 0xb2, 0xca, 0x48, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0x14, 0xa8, + 0x2d, 0x68, 0x16, 0xa9, 0x0d, 0xf1, 0x52, 0x02, 0x15, 0xab, 0x00, 0x90, + 0x20, 0x46, 0xa8, 0x47, 0x0f, 0x9d, 0xb3, 0x4e, 0x95, 0xf8, 0x50, 0x00, + 0x0c, 0x28, 0x01, 0xd0, 0x0a, 0x28, 0x3d, 0xd1, 0x00, 0x20, 0x10, 0xaa, + 0xad, 0xf8, 0x4c, 0x00, 0x17, 0x98, 0x12, 0x90, 0x9d, 0xf8, 0x63, 0x00, + 0x00, 0xeb, 0x80, 0x00, 0x56, 0xf8, 0x30, 0x00, 0xd0, 0xf8, 0xd4, 0x00, + 0x00, 0xf1, 0x14, 0x01, 0xb8, 0x48, 0x03, 0x68, 0x12, 0xa8, 0x98, 0x47, + 0x10, 0x99, 0x40, 0xf2, 0x71, 0x20, 0x04, 0x9a, 0xa1, 0xfb, 0x00, 0x01, + 0x5f, 0xea, 0x51, 0x01, 0xbd, 0xf8, 0x44, 0x10, 0x4f, 0xea, 0x30, 0x00, + 0x00, 0xeb, 0x11, 0x10, 0x82, 0x42, 0x01, 0xd9, 0x10, 0x1a, 0x07, 0xe0, + 0xc1, 0x0e, 0x10, 0x29, 0x87, 0xbf, 0xc0, 0x43, 0x10, 0x44, 0x10, 0x1a, + 0x00, 0xf1, 0x08, 0x40, 0xaa, 0x49, 0x88, 0x42, 0x07, 0xd2, 0x44, 0xf6, + 0x37, 0x21, 0x88, 0x42, 0x08, 0xd8, 0x00, 0x20, 0x40, 0xf2, 0x99, 0x31, + 0x02, 0xe0, 0x00, 0x20, 0x4f, 0xf4, 0x66, 0x71, 0xf8, 0xf7, 0x24, 0xff, + 0x16, 0x99, 0x81, 0xb1, 0x37, 0x46, 0xbd, 0xf8, 0x52, 0x20, 0x0b, 0x9e, + 0x96, 0x42, 0x11, 0xd9, 0x15, 0x9b, 0x00, 0x2b, 0x3f, 0xf4, 0xa1, 0xae, + 0x0d, 0x98, 0x00, 0xb3, 0x9d, 0x48, 0x05, 0x68, 0xb0, 0x1a, 0x80, 0xb2, + 0x0d, 0xe0, 0xa0, 0x48, 0x00, 0x21, 0x06, 0x22, 0x00, 0x23, 0x04, 0x68, + 0x00, 0x20, 0x8e, 0xe6, 0x0d, 0x98, 0x68, 0xb1, 0x96, 0x48, 0x32, 0x46, + 0x00, 0x23, 0x05, 0x68, 0x00, 0x20, 0x00, 0x90, 0x05, 0x98, 0x01, 0x90, + 0x23, 0x98, 0x02, 0x90, 0x0c, 0x98, 0xa8, 0x47, 0x0f, 0x9d, 0x11, 0xe0, + 0x8e, 0x48, 0x02, 0x68, 0x08, 0x46, 0x31, 0x46, 0x0b, 0xe0, 0x8c, 0x4d, + 0x08, 0x46, 0x11, 0x46, 0x2b, 0x68, 0x98, 0x47, 0xbd, 0xf8, 0x52, 0x00, + 0x2a, 0x68, 0x0f, 0x9d, 0x30, 0x1a, 0x81, 0xb2, 0x15, 0x98, 0x90, 0x47, + 0x95, 0xf8, 0x50, 0x00, 0xd8, 0xb9, 0xbd, 0xf8, 0x52, 0x00, 0x03, 0x28, + 0x17, 0xd3, 0x16, 0x98, 0x41, 0x78, 0xc1, 0xf3, 0x01, 0x11, 0x85, 0xf8, + 0x5f, 0x10, 0x41, 0x78, 0xc1, 0xf3, 0x81, 0x01, 0x85, 0xf8, 0x60, 0x10, + 0x41, 0x78, 0xc1, 0xf3, 0x40, 0x01, 0x85, 0xf8, 0x61, 0x10, 0x41, 0x78, + 0x01, 0xf0, 0x01, 0x01, 0x85, 0xf8, 0x62, 0x10, 0x80, 0x78, 0x85, 0xf8, + 0x63, 0x00, 0x73, 0x48, 0x0b, 0x9e, 0x02, 0x68, 0x20, 0x46, 0x31, 0x46, + 0x90, 0x47, 0xb8, 0xf8, 0x00, 0x00, 0x33, 0x46, 0x81, 0x19, 0x95, 0xf8, + 0x50, 0x00, 0xa8, 0xf8, 0x00, 0x10, 0x20, 0xb9, 0x99, 0xf8, 0x49, 0x20, + 0x01, 0x32, 0x89, 0xf8, 0x49, 0x20, 0x09, 0x04, 0x0b, 0xd0, 0x99, 0xf8, + 0x4a, 0x10, 0x41, 0xb9, 0x00, 0x21, 0xa8, 0xf8, 0x00, 0x10, 0x89, 0xf8, + 0x49, 0x10, 0xdb, 0xf8, 0x1c, 0x10, 0xc9, 0xf8, 0x14, 0x10, 0x9d, 0xf8, + 0x63, 0x10, 0x0e, 0x9e, 0x72, 0x5c, 0x01, 0x2a, 0x12, 0xd1, 0x95, 0xf8, + 0x4c, 0x20, 0x01, 0x2a, 0x0c, 0xd1, 0x01, 0xeb, 0x81, 0x02, 0x07, 0xeb, + 0xc2, 0x02, 0x92, 0xf8, 0x26, 0x20, 0xd2, 0x07, 0x04, 0xd0, 0xb9, 0xf8, + 0x32, 0x20, 0x01, 0x32, 0xa9, 0xf8, 0x32, 0x20, 0x00, 0x22, 0x72, 0x54, + 0xdd, 0xe9, 0x09, 0x21, 0x3e, 0x46, 0x91, 0x42, 0x8c, 0xbf, 0x89, 0x1a, + 0x00, 0x21, 0x40, 0x28, 0x09, 0xd0, 0x0a, 0x28, 0x07, 0xd0, 0x0c, 0x28, + 0x05, 0xd0, 0x04, 0x28, 0x08, 0xd1, 0x95, 0xf8, 0x70, 0x00, 0x7f, 0x28, + 0x04, 0xd1, 0x44, 0x48, 0x59, 0x46, 0x00, 0x22, 0x00, 0x23, 0x02, 0xe0, + 0x41, 0x48, 0x8a, 0xb2, 0x59, 0x46, 0x05, 0x68, 0x00, 0x20, 0x00, 0x90, + 0x20, 0x46, 0xa8, 0x47, 0x0f, 0x9d, 0xdb, 0xf8, 0x10, 0x00, 0xb5, 0xf8, + 0x47, 0x10, 0x08, 0x44, 0xcb, 0xf8, 0x10, 0x00, 0x9d, 0xf8, 0x63, 0x00, + 0x00, 0xeb, 0x80, 0x00, 0x56, 0xf8, 0x30, 0x00, 0xff, 0xf7, 0x38, 0xfc, + 0x95, 0xf8, 0x50, 0x00, 0x0c, 0x28, 0x0b, 0xd0, 0x0a, 0x28, 0x1a, 0xd1, + 0x9d, 0xf8, 0x63, 0x00, 0x3e, 0x49, 0x00, 0xeb, 0x80, 0x00, 0x0a, 0x68, + 0x00, 0x21, 0x56, 0xf8, 0x30, 0x00, 0x0f, 0xe0, 0x22, 0x98, 0x70, 0xb1, + 0x2a, 0x78, 0x95, 0xf8, 0x30, 0x30, 0x30, 0x68, 0xb1, 0x6a, 0x00, 0x24, + 0x03, 0x2a, 0x36, 0x4a, 0x18, 0xbf, 0x20, 0x46, 0x03, 0x2b, 0x18, 0xbf, + 0x21, 0x46, 0x12, 0x68, 0x90, 0x47, 0xf2, 0xf7, 0xe5, 0xff, 0x01, 0x46, + 0x9d, 0xf8, 0x63, 0x00, 0x00, 0xeb, 0x80, 0x00, 0x56, 0xf8, 0x30, 0x00, + 0xd0, 0xf8, 0x04, 0x25, 0x89, 0x1a, 0x2d, 0x4a, 0x21, 0xf0, 0x70, 0x41, + 0x12, 0x78, 0x01, 0xeb, 0x81, 0x01, 0x49, 0x00, 0x52, 0x07, 0x04, 0xd4, + 0xb1, 0xf5, 0xfa, 0x4f, 0xff, 0xf4, 0xad, 0xad, 0x1c, 0xe0, 0x95, 0xf8, + 0x50, 0x20, 0x02, 0x2a, 0x03, 0xd1, 0x95, 0xf8, 0x6f, 0x20, 0x01, 0x2a, + 0xf2, 0xd0, 0xb1, 0xf5, 0xfa, 0x4f, 0xff, 0xf4, 0xa0, 0xad, 0x48, 0xf2, + 0x3f, 0x32, 0x91, 0x42, 0x0c, 0xd8, 0xd0, 0xf8, 0x08, 0x15, 0xc5, 0xf8, + 0x67, 0x10, 0x1d, 0x49, 0x09, 0x68, 0x88, 0x47, 0x9d, 0xf8, 0x63, 0x00, + 0x00, 0xeb, 0x80, 0x00, 0x57, 0xf8, 0x30, 0x00, 0x19, 0x49, 0x09, 0x68, + 0xeb, 0xe5, 0x00, 0xbf, 0x40, 0x01, 0x00, 0x00, 0x4c, 0x49, 0x01, 0x00, + 0x86, 0xe4, 0x05, 0x00, 0x10, 0xa2, 0x08, 0x00, 0xac, 0x76, 0x01, 0x00, + 0xe8, 0x49, 0x01, 0x00, 0x04, 0xa2, 0x08, 0x00, 0x8c, 0xe4, 0x05, 0x00, + 0x14, 0xa2, 0x08, 0x00, 0x20, 0xa2, 0x08, 0x00, 0x18, 0xa2, 0x08, 0x00, + 0x40, 0x86, 0x08, 0x00, 0x34, 0xf3, 0x08, 0x00, 0x1c, 0xa2, 0x08, 0x00, + 0x84, 0x4a, 0x01, 0x00, 0xec, 0x4a, 0x01, 0x00, 0x08, 0xa2, 0x08, 0x00, + 0x48, 0xa1, 0x08, 0x00, 0xe9, 0xe5, 0x04, 0x00, 0x44, 0xa2, 0x08, 0x00, + 0x48, 0xa2, 0x08, 0x00, 0x24, 0xa2, 0x08, 0x00, 0x28, 0x5e, 0x01, 0x00, + 0xfc, 0xa1, 0x08, 0x00, 0x38, 0xa2, 0x08, 0x00, 0xa0, 0xa0, 0x08, 0x00, + 0x2d, 0xe9, 0xf0, 0x4f, 0x97, 0xb0, 0xd5, 0x4d, 0x06, 0x92, 0x83, 0x46, + 0x0e, 0x46, 0xbb, 0xf1, 0x00, 0x0f, 0x28, 0x68, 0x16, 0x90, 0x04, 0xd1, + 0x00, 0x20, 0x40, 0xf2, 0xca, 0x41, 0xf8, 0xf7, 0xbd, 0xfd, 0xcf, 0x48, + 0x0d, 0xf1, 0x4a, 0x01, 0x10, 0xaa, 0x12, 0xab, 0x04, 0x68, 0x11, 0xa8, + 0xa0, 0x47, 0xbd, 0xf8, 0x4a, 0x00, 0xbd, 0xf8, 0x48, 0x10, 0x08, 0x44, + 0x0a, 0x28, 0x01, 0xd2, 0x00, 0x24, 0x81, 0xe1, 0x0b, 0xf1, 0x20, 0x00, + 0xdf, 0xf8, 0x18, 0x83, 0x04, 0x96, 0x4f, 0xf0, 0x0a, 0x09, 0x00, 0x24, + 0x13, 0xae, 0x4f, 0xf0, 0x00, 0x0a, 0x0a, 0x25, 0xcd, 0xf8, 0x20, 0xb0, + 0x05, 0x90, 0x00, 0x20, 0x0a, 0x90, 0xaf, 0xb2, 0x0c, 0x2f, 0x0c, 0xd2, + 0x1f, 0xfa, 0x8a, 0xf3, 0x10, 0x9a, 0xbd, 0xf8, 0x4a, 0x10, 0x11, 0x98, + 0xcd, 0xe9, 0x00, 0x37, 0x00, 0x23, 0x02, 0x96, 0x23, 0xf0, 0x0e, 0xff, + 0x04, 0xe0, 0x00, 0x20, 0x40, 0xf2, 0xe2, 0x41, 0xf8, 0xf7, 0x86, 0xfd, + 0xd8, 0xf8, 0x00, 0x10, 0x38, 0x46, 0x88, 0x47, 0xe0, 0xb2, 0x0a, 0xeb, + 0x05, 0x07, 0x04, 0x28, 0x00, 0xf2, 0xa4, 0x80, 0xdf, 0xe8, 0x00, 0xf0, + 0x03, 0x5c, 0x65, 0x6c, 0x7d, 0x00, 0x9d, 0xf8, 0x54, 0x00, 0x9d, 0xf8, + 0x55, 0x10, 0xc8, 0x46, 0x40, 0xea, 0x01, 0x24, 0xbd, 0xf8, 0x4a, 0x00, + 0xbd, 0xf8, 0x48, 0x10, 0xa6, 0xb2, 0x16, 0xfa, 0x85, 0xf9, 0x08, 0x44, + 0x48, 0x45, 0xc0, 0xf0, 0x2b, 0x81, 0x9d, 0xf8, 0x52, 0x00, 0x9d, 0xf8, + 0x53, 0x10, 0x40, 0xea, 0x01, 0x20, 0x09, 0x90, 0x00, 0xf0, 0x03, 0x0b, + 0x06, 0x98, 0x83, 0x45, 0x10, 0xd0, 0x06, 0x98, 0x01, 0x21, 0x01, 0x22, + 0x0d, 0xf1, 0x2e, 0x03, 0x8d, 0xf8, 0x2e, 0xb0, 0x8d, 0xf8, 0x2f, 0x00, + 0x9b, 0x48, 0xd0, 0xf8, 0x00, 0xc0, 0x02, 0x20, 0x00, 0x90, 0x40, 0xf6, + 0x61, 0x10, 0xe0, 0x47, 0x4b, 0xf0, 0x02, 0x00, 0x02, 0x28, 0x40, 0xf0, + 0x10, 0x81, 0xdd, 0xe9, 0x08, 0xa0, 0x06, 0x21, 0x13, 0xaa, 0x06, 0x23, + 0xaa, 0xf8, 0x06, 0x00, 0x50, 0x46, 0xf2, 0xf7, 0xe9, 0xfe, 0x91, 0x4a, + 0x06, 0xf0, 0x01, 0x01, 0xaa, 0xf8, 0x08, 0x40, 0x8a, 0xf8, 0x0c, 0x10, + 0x49, 0x44, 0x50, 0x88, 0x02, 0x31, 0x8b, 0xb2, 0x01, 0x30, 0x50, 0x80, + 0x11, 0x9a, 0x0c, 0x92, 0xbd, 0xf8, 0x4a, 0x20, 0x93, 0x42, 0x28, 0xbf, + 0x13, 0x46, 0xad, 0xf8, 0x34, 0x30, 0x52, 0xd9, 0x10, 0x9b, 0x89, 0x1a, + 0x0e, 0x93, 0x50, 0xe0, 0x9d, 0xf8, 0x4c, 0x00, 0x02, 0x24, 0x8b, 0xf8, + 0x20, 0x00, 0x00, 0x28, 0x08, 0xbf, 0x04, 0x24, 0x3b, 0xe0, 0x9d, 0xf8, + 0x4c, 0x00, 0x9d, 0xf8, 0x4d, 0x50, 0x03, 0x24, 0x07, 0x90, 0x35, 0xe0, + 0x79, 0x4a, 0x07, 0x9b, 0x00, 0x20, 0x12, 0xf8, 0x30, 0x10, 0x8b, 0x42, + 0x1d, 0xd0, 0x00, 0x28, 0x4f, 0xf0, 0x01, 0x00, 0xf7, 0xd0, 0x00, 0x20, + 0x40, 0xf2, 0x9e, 0x51, 0xf8, 0xf7, 0xfe, 0xfc, 0x19, 0xe0, 0x9d, 0xf8, + 0x4c, 0x00, 0x9d, 0xf8, 0x4d, 0x10, 0x9d, 0xf8, 0x4e, 0x20, 0x41, 0xea, + 0x02, 0x24, 0x00, 0x28, 0x5a, 0xd0, 0x00, 0x20, 0x4f, 0xf4, 0xb7, 0x61, + 0xf8, 0xf7, 0xee, 0xfc, 0x04, 0xeb, 0x07, 0x0a, 0x04, 0x24, 0x03, 0x25, + 0x11, 0xe0, 0x02, 0xeb, 0xc0, 0x00, 0x31, 0x46, 0x42, 0x68, 0x05, 0x98, + 0x90, 0x47, 0x0a, 0x99, 0x9b, 0xf8, 0x20, 0x00, 0x04, 0x24, 0x01, 0x31, + 0x0a, 0x91, 0xc9, 0xb2, 0x81, 0x42, 0x38, 0xbf, 0x02, 0x24, 0x03, 0x25, + 0xba, 0x46, 0x1f, 0xfa, 0x89, 0xf0, 0x1f, 0xfa, 0x8a, 0xf1, 0x81, 0x42, + 0xff, 0xf4, 0x35, 0xaf, 0x92, 0xe0, 0x00, 0x21, 0x0e, 0x91, 0xad, 0xf8, + 0x3c, 0x10, 0x5b, 0x49, 0x01, 0x22, 0xc1, 0x46, 0x0b, 0x68, 0x81, 0xb2, + 0x0c, 0xa8, 0x98, 0x47, 0x04, 0xeb, 0x08, 0x09, 0xdf, 0xf8, 0x48, 0x81, + 0xbb, 0xf1, 0x02, 0x0f, 0x44, 0xd0, 0xbb, 0xf1, 0x00, 0x0f, 0x56, 0xd1, + 0xdd, 0xf8, 0x20, 0xb0, 0xbd, 0xf8, 0x4a, 0x10, 0x16, 0xfa, 0x87, 0xfa, + 0x9b, 0xf8, 0x0c, 0x00, 0x8a, 0x45, 0xab, 0xf8, 0x0a, 0x40, 0x00, 0xf1, + 0x02, 0x00, 0x8b, 0xf8, 0x0c, 0x00, 0xb8, 0xb2, 0x4b, 0xd9, 0x81, 0x42, + 0x4b, 0xd9, 0x10, 0x9a, 0xcb, 0xf8, 0x18, 0x20, 0xca, 0x1b, 0xab, 0xf8, + 0x14, 0x20, 0x11, 0x9a, 0x10, 0x44, 0xcb, 0xf8, 0x10, 0x00, 0xe0, 0x19, + 0x40, 0x1a, 0xab, 0xf8, 0x1c, 0x00, 0x43, 0xe0, 0x20, 0x04, 0xa2, 0xd0, + 0x04, 0x99, 0xa0, 0xb2, 0x88, 0x42, 0x9e, 0xd8, 0xbd, 0xf8, 0x4a, 0x10, + 0x10, 0xfa, 0x87, 0xfa, 0xb8, 0xb2, 0xab, 0xf8, 0x0a, 0x40, 0x8a, 0x45, + 0x42, 0xd9, 0x81, 0x42, 0x42, 0xd9, 0x10, 0x9a, 0xcb, 0xf8, 0x18, 0x20, + 0xca, 0x1b, 0xab, 0xf8, 0x14, 0x20, 0x11, 0x9a, 0x10, 0x44, 0xcb, 0xf8, + 0x10, 0x00, 0xe0, 0x19, 0x40, 0x1a, 0xab, 0xf8, 0x1c, 0x00, 0x8b, 0xe7, + 0xdd, 0xf8, 0x20, 0xb0, 0x09, 0x98, 0x01, 0x24, 0x01, 0x25, 0xba, 0x46, + 0x13, 0xae, 0x9b, 0xf8, 0x0c, 0x10, 0x80, 0xb2, 0x10, 0xf0, 0x04, 0x00, + 0x01, 0xf1, 0x02, 0x01, 0x8b, 0xf8, 0x0c, 0x10, 0x08, 0xbf, 0x04, 0x24, + 0x08, 0xbf, 0x03, 0x25, 0x8b, 0xe7, 0xdd, 0xf8, 0x20, 0xb0, 0x00, 0x24, + 0xba, 0x46, 0x13, 0xae, 0x85, 0xe7, 0x11, 0x99, 0x01, 0xe0, 0x40, 0x1a, + 0x10, 0x99, 0xab, 0xf8, 0x14, 0x40, 0x08, 0x44, 0xcb, 0xf8, 0x10, 0x00, + 0x1f, 0xfa, 0x8a, 0xf0, 0x1f, 0xfa, 0x89, 0xf1, 0x13, 0xae, 0x81, 0x42, + 0x10, 0xd0, 0x00, 0x20, 0x40, 0xf2, 0x5c, 0x51, 0x00, 0x24, 0xf8, 0xf7, + 0x47, 0xfc, 0x6e, 0xe7, 0x11, 0x99, 0x01, 0xe0, 0x40, 0x1a, 0x10, 0x99, + 0xab, 0xf8, 0x14, 0x40, 0x08, 0x44, 0xcb, 0xf8, 0x10, 0x00, 0x4f, 0xe7, + 0x01, 0x24, 0x0e, 0xe0, 0x00, 0xf0, 0x78, 0xfa, 0x00, 0x24, 0x00, 0x20, + 0x40, 0xf2, 0xff, 0x41, 0x05, 0xe0, 0x00, 0xf0, 0x71, 0xfa, 0x00, 0x24, + 0x00, 0x20, 0x4f, 0xf4, 0xa2, 0x61, 0xf2, 0xf7, 0xc9, 0xfd, 0x05, 0x4d, + 0x28, 0x68, 0x16, 0x99, 0x40, 0x1a, 0x02, 0xbf, 0x20, 0x46, 0x17, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0xf8, 0xf7, 0x0e, 0xfc, 0x38, 0xec, 0x01, 0x00, + 0x78, 0x9d, 0x08, 0x00, 0x34, 0xf3, 0x08, 0x00, 0x30, 0xd3, 0x05, 0x00, + 0xa0, 0xa0, 0x08, 0x00, 0x76, 0xe5, 0x05, 0x00, 0x04, 0xb1, 0x08, 0x00, + 0xbc, 0xb5, 0x24, 0x4c, 0x28, 0x21, 0x20, 0x46, 0xf4, 0xf7, 0x50, 0xff, + 0x22, 0x48, 0x4f, 0xf6, 0xff, 0x75, 0xe5, 0x80, 0xc1, 0x8a, 0x21, 0x48, + 0x90, 0xf8, 0x78, 0x00, 0x02, 0x09, 0x20, 0x46, 0xff, 0xf7, 0x32, 0xfe, + 0xd0, 0xb1, 0x1e, 0x49, 0x60, 0x89, 0x09, 0x68, 0x88, 0x47, 0xe0, 0x88, + 0xa8, 0x42, 0x06, 0xd0, 0x1b, 0x49, 0x20, 0x7b, 0x09, 0x68, 0x88, 0x47, + 0x4f, 0xf6, 0xff, 0x70, 0xe0, 0x80, 0x19, 0x48, 0x01, 0x68, 0x0b, 0x20, + 0x88, 0x47, 0x18, 0x48, 0x4f, 0xf4, 0x7a, 0x71, 0x4f, 0xf4, 0x7a, 0x72, + 0x00, 0x23, 0x04, 0x68, 0x0b, 0x20, 0xa0, 0x47, 0x14, 0x48, 0x01, 0x68, + 0x00, 0x20, 0x88, 0x47, 0xea, 0x4c, 0xad, 0xf8, 0x06, 0x00, 0xb4, 0xf8, + 0x72, 0x10, 0x88, 0x42, 0x0c, 0xd0, 0x9b, 0x48, 0x0d, 0xf1, 0x06, 0x03, + 0x01, 0x21, 0x03, 0x22, 0x05, 0x68, 0x02, 0x20, 0x00, 0x90, 0x40, 0xf6, + 0x01, 0x10, 0xa8, 0x47, 0xbd, 0xf8, 0x06, 0x00, 0xa4, 0xf8, 0x72, 0x00, + 0xbc, 0xbd, 0x00, 0xbf, 0x8c, 0xe4, 0x05, 0x00, 0x40, 0x01, 0x00, 0x00, + 0x40, 0x86, 0x08, 0x00, 0x38, 0xaf, 0x08, 0x00, 0x34, 0xf3, 0x08, 0x00, + 0x30, 0x9d, 0x08, 0x00, 0x20, 0x9d, 0x08, 0x00, 0x3c, 0xaf, 0x08, 0x00, + 0xf8, 0xb5, 0x04, 0x46, 0x37, 0x48, 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, + 0xc5, 0x00, 0x40, 0xf2, 0x59, 0x13, 0x1f, 0x22, 0x00, 0x21, 0xb5, 0xfb, + 0xf3, 0xf7, 0xe2, 0x71, 0x96, 0x22, 0x61, 0x72, 0x21, 0x72, 0x21, 0x73, + 0xa1, 0x72, 0x32, 0x23, 0x21, 0x74, 0xa1, 0x74, 0xa1, 0x75, 0x21, 0x76, + 0x21, 0x77, 0x84, 0xf8, 0x22, 0x10, 0xa1, 0x77, 0x84, 0xf8, 0x28, 0x10, + 0x84, 0xf8, 0x24, 0x10, 0xe2, 0x72, 0xe3, 0x73, 0x62, 0x74, 0x63, 0x75, + 0xe2, 0x75, 0xe3, 0x76, 0x84, 0xf8, 0x21, 0x30, 0x62, 0x77, 0x84, 0xf8, + 0x23, 0x20, 0x84, 0xf8, 0x27, 0x30, 0x00, 0x22, 0x3e, 0x0a, 0x67, 0x73, + 0xa6, 0x73, 0x71, 0x4e, 0x37, 0x80, 0xa5, 0x27, 0x73, 0x80, 0x33, 0x81, + 0xf3, 0x81, 0xb5, 0xfb, 0xf7, 0xf7, 0xf7, 0x80, 0xe7, 0x74, 0x3f, 0x0a, + 0x27, 0x75, 0x4f, 0xf4, 0xbe, 0x77, 0xb3, 0x82, 0xb5, 0xfb, 0xf7, 0xf7, + 0xb7, 0x81, 0x67, 0x76, 0x3f, 0x0a, 0xa7, 0x76, 0x48, 0x27, 0x73, 0x83, + 0x27, 0x23, 0xb0, 0xfb, 0xf7, 0xf0, 0x40, 0xf2, 0xde, 0x37, 0xb5, 0xfb, + 0xf7, 0xf5, 0x70, 0x82, 0xe0, 0x77, 0x35, 0x83, 0x06, 0x0a, 0x28, 0x0a, + 0x84, 0xf8, 0x25, 0x50, 0x84, 0xf8, 0x26, 0x00, 0x02, 0x20, 0x84, 0xf8, + 0x20, 0x60, 0x9d, 0x1c, 0x04, 0x33, 0x01, 0x32, 0xee, 0xb2, 0x54, 0xfa, + 0x85, 0xf5, 0x1b, 0x2a, 0x69, 0x70, 0xdd, 0xb2, 0xa1, 0x55, 0x61, 0x55, + 0x54, 0xfa, 0x83, 0xf5, 0x50, 0xfa, 0x83, 0xf3, 0x69, 0x70, 0xdd, 0xb2, + 0x61, 0x55, 0x54, 0xfa, 0x83, 0xf5, 0x69, 0x70, 0xe9, 0xd1, 0xf8, 0xbd, + 0x98, 0xd4, 0x08, 0x00, 0xb0, 0xb5, 0x4f, 0x49, 0x0a, 0x88, 0x9a, 0xb1, + 0x9a, 0x4a, 0x04, 0x79, 0x40, 0x79, 0x92, 0xf8, 0x28, 0x30, 0x01, 0x2b, + 0x03, 0xd0, 0x92, 0xf8, 0x58, 0x30, 0x01, 0x2b, 0x0a, 0xd1, 0x92, 0xf8, + 0x79, 0x20, 0x09, 0x2a, 0x04, 0xd8, 0x40, 0xf2, 0x15, 0x33, 0xd3, 0x40, + 0xdb, 0x07, 0x13, 0xd1, 0x00, 0x20, 0xb0, 0xbd, 0x44, 0xea, 0x00, 0x22, + 0x02, 0x31, 0x00, 0x23, 0x0d, 0x88, 0xaa, 0x42, 0x04, 0xd3, 0x31, 0xf8, + 0x02, 0x5c, 0xaa, 0x42, 0x98, 0xbf, 0x15, 0x46, 0x01, 0x33, 0x4d, 0x80, + 0x06, 0x31, 0x05, 0x2b, 0xf2, 0xd1, 0x18, 0xe0, 0x44, 0xea, 0x00, 0x20, + 0x0d, 0x4c, 0x53, 0xb2, 0x54, 0xf8, 0x23, 0x30, 0x03, 0xeb, 0x43, 0x03, + 0x01, 0xeb, 0x43, 0x04, 0x64, 0x88, 0xa0, 0x42, 0x05, 0xd3, 0x31, 0xf8, + 0x13, 0x10, 0x88, 0x42, 0x88, 0xbf, 0x08, 0x46, 0x04, 0x46, 0x95, 0x48, + 0x21, 0x46, 0x03, 0x68, 0x00, 0x20, 0x98, 0x47, 0x20, 0x0a, 0xe1, 0xb2, + 0x41, 0xea, 0x00, 0x20, 0xb0, 0xbd, 0x00, 0xbf, 0x4c, 0xce, 0x05, 0x00, + 0x2d, 0xe9, 0xfc, 0x41, 0x0c, 0x46, 0x00, 0x20, 0x09, 0x2a, 0x0a, 0xd8, + 0x4f, 0xf0, 0x00, 0x08, 0xdf, 0xe8, 0x02, 0xf0, 0x05, 0x1d, 0x0a, 0x1d, + 0x0f, 0x1d, 0x1d, 0x1d, 0x14, 0x19, 0x22, 0x48, 0x80, 0x88, 0x4f, 0xf0, + 0x00, 0x08, 0x12, 0xe0, 0x1f, 0x48, 0x4f, 0xf0, 0x01, 0x08, 0x40, 0x89, + 0x0d, 0xe0, 0x1d, 0x48, 0x4f, 0xf0, 0x04, 0x08, 0x80, 0x8b, 0x08, 0xe0, + 0x1a, 0x48, 0x4f, 0xf0, 0x02, 0x08, 0x00, 0x8a, 0x03, 0xe0, 0x18, 0x48, + 0x4f, 0xf0, 0x03, 0x08, 0xc0, 0x8a, 0x24, 0xb9, 0x04, 0x46, 0x00, 0x28, + 0x0c, 0xbf, 0xc8, 0x24, 0xc8, 0x20, 0x60, 0x4f, 0x61, 0x01, 0x0a, 0x23, + 0x40, 0x01, 0xb1, 0xfb, 0xf3, 0xf6, 0xb0, 0xfb, 0xf3, 0xf1, 0x38, 0x6e, + 0x81, 0x42, 0x18, 0xbf, 0x86, 0x42, 0x16, 0xd8, 0x0d, 0x48, 0x8d, 0xf8, + 0x06, 0x20, 0x01, 0xab, 0x01, 0x21, 0x00, 0x22, 0xad, 0xf8, 0x04, 0x40, + 0x05, 0x68, 0x04, 0x20, 0x00, 0x90, 0x40, 0xf6, 0x12, 0x10, 0xa8, 0x47, + 0x05, 0x49, 0x08, 0xeb, 0x48, 0x00, 0x3e, 0x66, 0x01, 0xeb, 0x40, 0x00, + 0x84, 0x80, 0xbd, 0xe8, 0xfc, 0x81, 0x00, 0x28, 0xfb, 0xd1, 0xe5, 0xe7, + 0xb4, 0xe4, 0x05, 0x00, 0xa0, 0xa0, 0x08, 0x00, 0x80, 0xb5, 0x4a, 0x4a, + 0x00, 0xeb, 0x40, 0x01, 0x02, 0xeb, 0x01, 0x11, 0x91, 0xf8, 0x28, 0x20, + 0x0a, 0xb9, 0x49, 0x69, 0x61, 0xb1, 0x00, 0xf0, 0xd9, 0xf8, 0x00, 0xb1, + 0x80, 0xbd, 0x07, 0x48, 0x4f, 0xf4, 0xfa, 0x51, 0x01, 0x60, 0x0a, 0x48, + 0x01, 0x21, 0x01, 0x70, 0x00, 0x20, 0x80, 0xbd, 0x07, 0x49, 0x09, 0x78, + 0x00, 0x29, 0xee, 0xd0, 0x07, 0x20, 0x80, 0xbd, 0xe0, 0x77, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0xf0, 0xc9, 0xf8, 0x02, 0x48, 0x00, 0x21, 0x01, 0x70, + 0x80, 0xbd, 0x00, 0xbf, 0x74, 0xe5, 0x05, 0x00, 0x80, 0xb5, 0x09, 0x49, + 0x09, 0x68, 0x88, 0x47, 0x58, 0xb1, 0x33, 0x48, 0x90, 0xf8, 0x79, 0x00, + 0x0a, 0x28, 0x06, 0xd1, 0x05, 0x48, 0x00, 0x78, 0x01, 0x38, 0xb0, 0xfa, + 0x80, 0xf0, 0x40, 0x09, 0x80, 0xbd, 0x01, 0x20, 0x80, 0xbd, 0x00, 0xbf, + 0x54, 0x9d, 0x08, 0x00, 0x84, 0xe4, 0x05, 0x00, 0x70, 0xb5, 0x1d, 0x4e, + 0x05, 0x46, 0x81, 0xf8, 0x32, 0x04, 0x00, 0xeb, 0x80, 0x00, 0x0c, 0x46, + 0x28, 0x21, 0x06, 0xeb, 0xc0, 0x00, 0xf4, 0xf7, 0x95, 0xfd, 0x94, 0xf8, + 0x32, 0x04, 0x00, 0xeb, 0x80, 0x00, 0x46, 0xf8, 0x30, 0x40, 0x20, 0x48, + 0x90, 0xf8, 0x7a, 0x00, 0x28, 0xb9, 0x13, 0x48, 0xb4, 0xf8, 0x30, 0x14, + 0x00, 0xeb, 0x85, 0x10, 0x41, 0x86, 0x11, 0x48, 0x72, 0xb6, 0x01, 0x68, + 0x49, 0x00, 0x01, 0x31, 0x01, 0x60, 0x4f, 0xf0, 0xff, 0x31, 0xc4, 0xf8, + 0x70, 0x11, 0x94, 0xf8, 0x33, 0x14, 0x41, 0xf0, 0x01, 0x01, 0x84, 0xf8, + 0x33, 0x14, 0x01, 0x68, 0x49, 0x08, 0x01, 0x60, 0x01, 0x21, 0x00, 0x68, + 0x80, 0xf3, 0x10, 0x88, 0x00, 0x20, 0x84, 0xf8, 0xf3, 0x14, 0xc4, 0xf8, + 0x04, 0x05, 0xc4, 0xf8, 0x08, 0x05, 0x70, 0xbd, 0x40, 0x01, 0x00, 0x00, + 0xe8, 0x49, 0x01, 0x00, 0x24, 0x36, 0x01, 0x00, 0x1c, 0xb5, 0x08, 0x4c, + 0xd4, 0xe9, 0x19, 0x01, 0xcd, 0xe9, 0x00, 0x01, 0x00, 0xf0, 0x66, 0xf8, + 0x05, 0x48, 0x01, 0x68, 0x21, 0xb9, 0xdd, 0xe9, 0x00, 0x12, 0x44, 0xf8, + 0x64, 0x1f, 0x62, 0x60, 0x80, 0x68, 0x1c, 0xbd, 0x4c, 0x49, 0x01, 0x00, + 0x84, 0x4a, 0x01, 0x00, 0x0d, 0x48, 0x0e, 0x49, 0x01, 0x60, 0x0e, 0x48, + 0x0e, 0x49, 0x01, 0x60, 0x0e, 0x48, 0x0f, 0x49, 0x01, 0x60, 0x0f, 0x48, + 0x0f, 0x49, 0x01, 0x60, 0x0f, 0x48, 0x10, 0x49, 0x01, 0x60, 0x10, 0x48, + 0x10, 0x49, 0x01, 0x60, 0x10, 0x48, 0x11, 0x49, 0x01, 0x60, 0x11, 0x48, + 0x11, 0x49, 0x01, 0x60, 0x11, 0x48, 0x12, 0x49, 0x01, 0x60, 0x70, 0x47, + 0xf0, 0x98, 0x08, 0x00, 0x39, 0xd9, 0x02, 0x00, 0x58, 0xfa, 0x08, 0x00, + 0x51, 0xd7, 0x02, 0x00, 0xbc, 0xae, 0x08, 0x00, 0x9d, 0xe4, 0x02, 0x00, + 0x18, 0xa2, 0x08, 0x00, 0x5d, 0xd8, 0x02, 0x00, 0x44, 0xaf, 0x08, 0x00, + 0xd1, 0xe6, 0x02, 0x00, 0x50, 0xd9, 0x08, 0x00, 0x81, 0xe7, 0x02, 0x00, + 0x10, 0xe2, 0x08, 0x00, 0xc1, 0xe7, 0x02, 0x00, 0x54, 0xd9, 0x08, 0x00, + 0x05, 0xe8, 0x02, 0x00, 0x20, 0xa2, 0x08, 0x00, 0x89, 0xe8, 0x02, 0x00, + 0x40, 0xf2, 0x81, 0x0c, 0xc1, 0xf2, 0x04, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x42, 0xf6, 0x19, 0x2c, 0xc1, 0xf2, 0x11, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x40, 0xf2, 0x29, 0x3c, 0xc1, 0xf2, 0x04, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4e, 0xf6, 0x75, 0x1c, 0xc1, 0xf2, 0x03, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4f, 0xf6, 0x11, 0x3c, 0xc1, 0xf2, 0x03, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x2d, 0xe9, 0xf0, 0x4f, 0x8b, 0xb0, 0x90, 0xf8, 0x32, 0x54, 0x83, 0x49, + 0x04, 0x46, 0x05, 0xeb, 0x85, 0x00, 0x01, 0xeb, 0xc0, 0x08, 0x85, 0x49, + 0x08, 0xf1, 0x04, 0x00, 0x01, 0x90, 0x05, 0xeb, 0x45, 0x00, 0x01, 0xeb, + 0x00, 0x19, 0x09, 0xf1, 0x0c, 0x00, 0x09, 0xf1, 0x14, 0x06, 0x04, 0x90, + 0x09, 0xf1, 0x08, 0x00, 0x03, 0x90, 0x09, 0xf1, 0x04, 0x00, 0x02, 0x90, + 0x09, 0xf1, 0x20, 0x00, 0x07, 0x90, 0x09, 0xf1, 0x1c, 0x00, 0x06, 0x90, + 0x34, 0x48, 0x00, 0x68, 0x80, 0x47, 0x05, 0x90, 0xa8, 0x1c, 0x00, 0x25, + 0x4f, 0xf0, 0x02, 0x0a, 0x4f, 0xf0, 0x00, 0x0b, 0x00, 0x90, 0x07, 0x98, + 0x06, 0x99, 0x00, 0x68, 0x09, 0x68, 0x81, 0x42, 0x55, 0xd0, 0x6c, 0x48, + 0x08, 0xa9, 0x08, 0x22, 0x00, 0x23, 0x07, 0x68, 0x30, 0x46, 0xb8, 0x47, + 0x6c, 0x48, 0x00, 0x6e, 0xd0, 0xb1, 0x09, 0x99, 0x05, 0x9a, 0x51, 0x1a, + 0x21, 0xf0, 0x70, 0x41, 0x88, 0x42, 0x13, 0xd8, 0xd9, 0xf8, 0x00, 0x10, + 0x04, 0x9a, 0x01, 0x25, 0x08, 0x44, 0x02, 0x99, 0xc9, 0xf8, 0x00, 0x00, + 0x08, 0x68, 0x01, 0x30, 0x08, 0x60, 0x03, 0x99, 0x08, 0x68, 0x01, 0x30, + 0x08, 0x60, 0x10, 0x68, 0xbd, 0xf8, 0x20, 0x10, 0x08, 0x44, 0x10, 0x60, + 0xd8, 0xf8, 0x00, 0x00, 0xa0, 0x42, 0x1c, 0xd1, 0xdc, 0xb1, 0x94, 0xf8, + 0x33, 0x04, 0x80, 0x07, 0x17, 0xd5, 0x55, 0x48, 0x0a, 0xa9, 0x04, 0x22, + 0x04, 0x23, 0x07, 0x68, 0x01, 0x98, 0xb8, 0x47, 0x00, 0x98, 0x08, 0xa9, + 0x08, 0x5c, 0x60, 0xb1, 0xdd, 0xe9, 0x09, 0x10, 0x81, 0x42, 0x08, 0xd1, + 0x01, 0x2d, 0x04, 0xd1, 0x8f, 0x49, 0xd8, 0xf8, 0x00, 0x00, 0x09, 0x68, + 0x88, 0x47, 0x0b, 0xf1, 0x01, 0x0b, 0x5f, 0xea, 0x0b, 0x60, 0x18, 0xbf, + 0x01, 0x2d, 0x0a, 0xd1, 0x07, 0x48, 0xbd, 0xf8, 0x20, 0x10, 0x02, 0x68, + 0x30, 0x46, 0x90, 0x47, 0xaa, 0xf1, 0x01, 0x0a, 0x5f, 0xea, 0x0a, 0x60, + 0xa3, 0xd1, 0x0b, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0xe0, 0xa0, 0x08, 0x00, + 0x38, 0xe5, 0x08, 0x00, 0x90, 0xf8, 0x32, 0x14, 0x3b, 0x4a, 0x01, 0xeb, + 0x81, 0x01, 0x02, 0xeb, 0xc1, 0x01, 0xd1, 0xe9, 0x03, 0x21, 0x8a, 0x42, + 0x18, 0xbf, 0x00, 0xf0, 0x05, 0xb9, 0x70, 0x47, 0xf8, 0xb5, 0x04, 0x46, + 0x00, 0x20, 0x8d, 0xf8, 0x03, 0x00, 0x1c, 0xb9, 0x00, 0x20, 0xe1, 0x21, + 0xf2, 0xf7, 0x9c, 0xfa, 0x65, 0x68, 0x30, 0x49, 0x95, 0xf8, 0x32, 0x64, + 0x06, 0xeb, 0x86, 0x00, 0x01, 0xeb, 0xc0, 0x01, 0x08, 0x46, 0x50, 0xf8, + 0x04, 0x2f, 0xda, 0xb3, 0x8b, 0x68, 0x9a, 0x42, 0x38, 0xd0, 0xd1, 0xe9, + 0x03, 0x21, 0x8a, 0x42, 0x34, 0xd0, 0x28, 0x49, 0xb3, 0x1c, 0x01, 0x22, + 0x0f, 0x68, 0x0d, 0xf1, 0x03, 0x01, 0xb8, 0x47, 0x95, 0xf8, 0x62, 0x00, + 0x01, 0x28, 0x29, 0xd1, 0x9d, 0xf8, 0x03, 0x00, 0x02, 0x28, 0x25, 0xd1, + 0xd5, 0xf8, 0xd4, 0x10, 0x11, 0xb3, 0x0a, 0x7f, 0x04, 0x2a, 0x1f, 0xd8, + 0x1e, 0x48, 0x50, 0xf8, 0x22, 0x20, 0x91, 0x42, 0x1a, 0xd1, 0x91, 0xf8, + 0xe6, 0x20, 0x2a, 0xb9, 0x91, 0xf8, 0xe7, 0x20, 0x12, 0xb9, 0x91, 0xf8, + 0xe8, 0x20, 0x8a, 0xb1, 0x18, 0x4a, 0x80, 0x69, 0x02, 0xeb, 0x86, 0x12, + 0x00, 0x69, 0x92, 0x6a, 0x10, 0x1a, 0x00, 0xf5, 0x70, 0x70, 0x20, 0xf0, + 0x70, 0x40, 0xb0, 0xf1, 0x00, 0x6f, 0x15, 0xd9, 0x52, 0x48, 0x01, 0x68, + 0x28, 0x46, 0x88, 0x47, 0x11, 0x48, 0x90, 0xf8, 0x7b, 0x10, 0x21, 0xb1, + 0x01, 0x39, 0x80, 0xf8, 0x7b, 0x10, 0x08, 0x06, 0x04, 0xd1, 0x0e, 0x48, + 0x14, 0x21, 0x00, 0x78, 0xf2, 0xf7, 0x5e, 0xfa, 0x20, 0x46, 0x00, 0xf0, + 0xa7, 0xf8, 0xf8, 0xbd, 0x20, 0x68, 0x04, 0x30, 0x20, 0x60, 0x06, 0x48, + 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0xf8, 0xbd, 0x40, 0x01, 0x00, 0x00, + 0x34, 0xe5, 0x08, 0x00, 0xfc, 0x73, 0x01, 0x00, 0xe8, 0x49, 0x01, 0x00, + 0xc4, 0xa0, 0x08, 0x00, 0x4c, 0x49, 0x01, 0x00, 0x66, 0x34, 0x01, 0x00, + 0x7c, 0xb5, 0xd0, 0xf8, 0x08, 0x65, 0xd0, 0xf8, 0x0c, 0x55, 0x04, 0x46, + 0xf2, 0xf7, 0x30, 0xfa, 0xd4, 0xf8, 0x04, 0x15, 0x40, 0x1a, 0xf1, 0x00, + 0x20, 0xf0, 0x70, 0x40, 0x00, 0xeb, 0x80, 0x00, 0xc0, 0xf3, 0x1a, 0x10, + 0xb1, 0xfb, 0xf0, 0xf0, 0xa8, 0x42, 0x02, 0xd9, 0x41, 0x1b, 0x01, 0x29, + 0x03, 0xd8, 0x29, 0x1a, 0x39, 0xd9, 0x02, 0x29, 0x37, 0xd3, 0x20, 0x4e, + 0x04, 0xf2, 0x0c, 0x55, 0x72, 0xb6, 0xc4, 0xf8, 0x0c, 0x05, 0x30, 0x68, + 0x40, 0x00, 0x01, 0x30, 0x30, 0x60, 0x1c, 0x48, 0x01, 0x68, 0x20, 0x46, + 0x88, 0x47, 0x30, 0x68, 0x01, 0x21, 0x00, 0x22, 0x2b, 0x46, 0x40, 0x08, + 0x30, 0x60, 0x30, 0x68, 0x80, 0xf3, 0x10, 0x88, 0x16, 0x48, 0x06, 0x68, + 0x04, 0x20, 0x00, 0x90, 0x4f, 0xf4, 0x11, 0x60, 0xb0, 0x47, 0x14, 0x48, + 0x94, 0xf8, 0x35, 0x51, 0x06, 0x68, 0x13, 0x48, 0x01, 0x68, 0x20, 0x46, + 0x88, 0x47, 0x01, 0x46, 0x28, 0x46, 0xb0, 0x47, 0x94, 0xf8, 0x35, 0x01, + 0x0f, 0x4a, 0x00, 0x23, 0x00, 0xeb, 0xc0, 0x01, 0x02, 0xeb, 0x41, 0x01, + 0x0d, 0x4a, 0x49, 0x78, 0x15, 0x68, 0x20, 0x22, 0x00, 0x92, 0x01, 0x22, + 0xa8, 0x47, 0xf2, 0xf7, 0xe1, 0xf9, 0x00, 0x21, 0xc4, 0xf8, 0x04, 0x05, + 0xc4, 0xf8, 0x08, 0x15, 0x7c, 0xbd, 0x00, 0xbf, 0x24, 0x36, 0x01, 0x00, + 0x00, 0xe2, 0x08, 0x00, 0xa0, 0xa0, 0x08, 0x00, 0x0c, 0xe2, 0x08, 0x00, + 0x24, 0xd9, 0x08, 0x00, 0x44, 0x28, 0x01, 0x00, 0x28, 0xd9, 0x08, 0x00, + 0x06, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x07, 0x49, 0x01, 0x60, + 0x07, 0x48, 0x08, 0x49, 0xc1, 0x64, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, + 0x70, 0x47, 0x00, 0xbf, 0xe8, 0xaf, 0x08, 0x00, 0x95, 0xea, 0x02, 0x00, + 0xec, 0xaf, 0x08, 0x00, 0x71, 0xe9, 0x02, 0x00, 0xc8, 0xae, 0x08, 0x00, + 0xb1, 0xea, 0x02, 0x00, 0x38, 0xa2, 0x08, 0x00, 0xa5, 0xeb, 0x02, 0x00, + 0x42, 0xf6, 0xd9, 0x7c, 0xc1, 0xf2, 0x04, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x43, 0xf2, 0x11, 0x5c, 0xc1, 0xf2, 0x10, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x2d, 0xe9, 0xf0, 0x43, 0x85, 0xb0, 0x0e, 0x46, 0x05, 0x46, 0x00, 0xf0, + 0x39, 0xf9, 0x04, 0x46, 0x73, 0x48, 0x00, 0x78, 0x02, 0x28, 0x52, 0xd1, + 0x2b, 0x48, 0x01, 0x68, 0x13, 0x20, 0x88, 0x47, 0x00, 0x28, 0x04, 0x90, + 0x3e, 0xd0, 0x00, 0xf1, 0x08, 0x01, 0x04, 0xaa, 0x0d, 0xf1, 0x0e, 0x03, + 0x41, 0x60, 0x26, 0x48, 0x0d, 0xf1, 0x0f, 0x01, 0x07, 0x68, 0x03, 0xa8, + 0xcd, 0xe9, 0x00, 0x10, 0x28, 0x46, 0x31, 0x46, 0xb8, 0x47, 0x98, 0xb3, + 0x07, 0x46, 0x21, 0x48, 0x00, 0x21, 0x4f, 0xf0, 0x00, 0x09, 0x00, 0xf5, + 0xe8, 0x70, 0xf6, 0xf7, 0xc5, 0xfa, 0x48, 0xb3, 0x80, 0x46, 0x1d, 0x48, + 0x9d, 0xf8, 0x0e, 0x30, 0x04, 0x9a, 0x3f, 0x21, 0xd0, 0xf8, 0x00, 0xc0, + 0xbd, 0xf8, 0x0c, 0x00, 0xcd, 0xe9, 0x00, 0x90, 0x40, 0x46, 0x02, 0x97, + 0xe0, 0x47, 0x07, 0x46, 0x30, 0x46, 0xf7, 0xf7, 0xd5, 0xff, 0x6d, 0x48, + 0x2c, 0x21, 0x3a, 0x46, 0x15, 0xfb, 0x01, 0x00, 0x12, 0x49, 0x90, 0xf8, + 0x29, 0x00, 0x0b, 0x68, 0x41, 0x46, 0x98, 0x47, 0x01, 0x28, 0x0a, 0xd0, + 0x40, 0x46, 0xf7, 0xf7, 0xc5, 0xff, 0x06, 0xe0, 0x00, 0x20, 0x66, 0x21, + 0x00, 0x25, 0xf7, 0xf7, 0xa1, 0xff, 0x04, 0xe0, 0x00, 0x24, 0x04, 0x98, + 0xf7, 0xf7, 0xba, 0xff, 0x01, 0x25, 0x05, 0xb9, 0x00, 0x24, 0x20, 0x46, + 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x83, 0x00, 0xbf, 0xd4, 0x9b, 0x08, 0x00, + 0xb0, 0xaf, 0x08, 0x00, 0x68, 0x8a, 0x01, 0x00, 0xc0, 0xaf, 0x08, 0x00, + 0xd4, 0xaf, 0x08, 0x00, 0xf0, 0xb5, 0x85, 0xb0, 0x41, 0x4c, 0x94, 0xf8, + 0x8f, 0x50, 0x0b, 0x9c, 0x02, 0x2d, 0x07, 0xd1, 0x09, 0x4d, 0xb5, 0xf8, + 0x22, 0x55, 0x19, 0x3d, 0xa5, 0x42, 0x01, 0xda, 0x12, 0x20, 0x08, 0xe0, + 0x0a, 0x9f, 0xdd, 0xe9, 0x0c, 0x65, 0xcd, 0xe9, 0x00, 0x74, 0xcd, 0xe9, + 0x02, 0x65, 0x00, 0xf0, 0xbf, 0xf8, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0xbf, + 0x8c, 0x7e, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, 0x85, 0xb0, 0x0c, 0x46, + 0xd1, 0xb2, 0x45, 0x4a, 0x2c, 0x23, 0x11, 0xfb, 0x03, 0x27, 0xf9, 0x7a, + 0x0a, 0x29, 0x42, 0xd1, 0x2b, 0x49, 0x0b, 0x22, 0x03, 0xae, 0x09, 0x78, + 0x02, 0x29, 0x08, 0xbf, 0x0e, 0x22, 0x81, 0x18, 0x21, 0x60, 0x10, 0xf8, + 0x02, 0x90, 0x4d, 0x78, 0x91, 0xf8, 0x02, 0xa0, 0x91, 0xf8, 0x03, 0xb0, + 0x30, 0x46, 0x00, 0xf0, 0xa1, 0xf8, 0x80, 0x46, 0x38, 0x69, 0x32, 0x46, + 0xd0, 0xf8, 0xd4, 0x00, 0x00, 0xf1, 0x14, 0x01, 0x1f, 0x48, 0x03, 0x68, + 0x30, 0x46, 0x98, 0x47, 0x03, 0x9a, 0x40, 0xf2, 0x71, 0x21, 0x49, 0xea, + 0x05, 0x20, 0x1c, 0x4b, 0x40, 0xea, 0x0a, 0x40, 0xa2, 0xfb, 0x01, 0x12, + 0x40, 0xea, 0x0b, 0x60, 0x93, 0xf8, 0x91, 0x30, 0x5f, 0xea, 0x52, 0x02, + 0xbd, 0xf8, 0x10, 0x20, 0x4f, 0xea, 0x31, 0x01, 0x01, 0xeb, 0x12, 0x11, + 0x42, 0x1a, 0x9a, 0x42, 0x0f, 0xdd, 0xa8, 0xeb, 0x03, 0x00, 0x21, 0x68, + 0x10, 0x44, 0x02, 0x0e, 0x08, 0x70, 0xca, 0x70, 0x02, 0x0c, 0x00, 0x0a, + 0x8a, 0x70, 0x48, 0x70, 0x01, 0xe0, 0x00, 0x20, 0x20, 0x60, 0x01, 0x24, + 0x0c, 0xe0, 0xcd, 0xe9, 0x01, 0x01, 0x0a, 0x48, 0x01, 0xab, 0x00, 0x21, + 0x00, 0x22, 0x00, 0x24, 0x05, 0x68, 0x08, 0x20, 0x00, 0x90, 0x40, 0xf6, + 0x22, 0x10, 0xa8, 0x47, 0x20, 0x46, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0xe7, 0x4a, 0x01, 0x00, 0x48, 0xa1, 0x08, 0x00, 0x40, 0x86, 0x08, 0x00, + 0xa0, 0xa0, 0x08, 0x00, 0x10, 0x4a, 0x12, 0x78, 0x01, 0x2a, 0x12, 0xd1, + 0x0f, 0x4a, 0x2c, 0x23, 0x10, 0xfb, 0x03, 0x20, 0x00, 0x69, 0x48, 0xb1, + 0x90, 0xf8, 0x35, 0x01, 0x0d, 0x4a, 0x00, 0xeb, 0x40, 0x00, 0x02, 0xeb, + 0x40, 0x10, 0x42, 0x6c, 0x01, 0x32, 0x42, 0x64, 0x08, 0x46, 0xf7, 0xf7, + 0x07, 0xbf, 0x06, 0x4a, 0x2c, 0x23, 0x10, 0xfb, 0x03, 0x20, 0x00, 0xf1, + 0x14, 0x02, 0x04, 0x48, 0x03, 0x68, 0x08, 0x46, 0x11, 0x46, 0x18, 0x47, + 0xe8, 0x4a, 0x01, 0x00, 0xb8, 0x4a, 0x01, 0x00, 0x4c, 0xb5, 0x08, 0x00, + 0x54, 0xf1, 0x05, 0x00, 0x06, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, + 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, + 0x08, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, 0x44, 0xe2, 0x08, 0x00, + 0xad, 0xed, 0x02, 0x00, 0xdc, 0xaf, 0x08, 0x00, 0xd1, 0xec, 0x02, 0x00, + 0x14, 0xe9, 0x08, 0x00, 0xe9, 0xed, 0x02, 0x00, 0xe0, 0xaf, 0x08, 0x00, + 0xc1, 0xee, 0x02, 0x00, 0x41, 0xf6, 0xc9, 0x3c, 0xc1, 0xf2, 0x04, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf6, 0x49, 0x7c, 0xc1, 0xf2, 0x04, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4c, 0xf2, 0x27, 0x0c, 0xc1, 0xf2, 0x0f, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x7c, 0xb5, 0x04, 0x46, 0x08, 0x78, 0x0f, 0x4d, + 0xa0, 0x70, 0x48, 0x78, 0xe0, 0x70, 0x60, 0x78, 0x61, 0x88, 0x40, 0xf0, + 0x02, 0x00, 0x60, 0x70, 0x28, 0x88, 0x88, 0x42, 0x0e, 0xd0, 0xad, 0xf8, + 0x06, 0x00, 0x09, 0x48, 0xad, 0xf8, 0x04, 0x10, 0x01, 0xab, 0x00, 0x21, + 0x01, 0x22, 0x06, 0x68, 0x04, 0x20, 0x00, 0x90, 0x40, 0xf6, 0x62, 0x10, + 0xb0, 0x47, 0x60, 0x88, 0x01, 0x30, 0x28, 0x80, 0x7c, 0xbd, 0x00, 0xbf, + 0x76, 0xe5, 0x05, 0x00, 0xa0, 0xa0, 0x08, 0x00, 0x42, 0x78, 0x42, 0xf0, + 0x01, 0x02, 0x42, 0x70, 0x4a, 0x78, 0x02, 0x71, 0x89, 0x78, 0x41, 0x71, + 0x70, 0x47, 0x10, 0xb5, 0x51, 0xb1, 0x09, 0x23, 0x10, 0xfa, 0x83, 0xf4, + 0x01, 0x39, 0x64, 0x78, 0x23, 0x44, 0x0c, 0x06, 0x03, 0xf1, 0x03, 0x03, + 0xf6, 0xd1, 0x00, 0xe0, 0x08, 0x23, 0x0a, 0xb1, 0x98, 0x18, 0xc3, 0x1c, + 0x98, 0x1c, 0xc1, 0x07, 0x18, 0xbf, 0xd8, 0x1c, 0x80, 0xb2, 0x10, 0xbd, + 0x7f, 0xb5, 0x0d, 0x46, 0x32, 0x49, 0xb1, 0xf8, 0x3c, 0x11, 0x49, 0x06, + 0x03, 0xd4, 0x31, 0x48, 0x00, 0x21, 0x01, 0x70, 0x7f, 0xbd, 0x2f, 0x49, + 0x14, 0x46, 0x01, 0x22, 0x0a, 0x70, 0x81, 0x88, 0x82, 0x89, 0x56, 0x18, + 0x2c, 0x4a, 0xb1, 0xb2, 0xb2, 0xf8, 0x78, 0x22, 0x14, 0x3a, 0xad, 0xf8, + 0x08, 0x20, 0x92, 0xb2, 0x8a, 0x42, 0x45, 0xd2, 0x28, 0x48, 0x0d, 0xf1, + 0x0a, 0x01, 0x02, 0xaa, 0x03, 0x68, 0x03, 0xa8, 0x98, 0x47, 0x01, 0x28, + 0x40, 0xd1, 0xbd, 0xf8, 0x0a, 0x00, 0x03, 0x99, 0x01, 0x2c, 0x0d, 0x54, + 0x08, 0x44, 0x4f, 0xea, 0x15, 0x21, 0x41, 0x70, 0xbd, 0xf8, 0x0a, 0x00, + 0x03, 0x9a, 0x00, 0xf1, 0x02, 0x00, 0x81, 0xb2, 0xad, 0xf8, 0x0a, 0x00, + 0x12, 0xfa, 0x80, 0xf0, 0x56, 0x54, 0x4f, 0xea, 0x16, 0x21, 0x41, 0x70, + 0xbd, 0xf8, 0x0a, 0x00, 0x03, 0x9a, 0x9d, 0xf8, 0x08, 0x30, 0x00, 0xf1, + 0x02, 0x00, 0x81, 0xb2, 0xad, 0xf8, 0x0a, 0x00, 0x12, 0xfa, 0x80, 0xf0, + 0x53, 0x54, 0x4f, 0xf0, 0x01, 0x02, 0x9d, 0xf8, 0x09, 0x10, 0x41, 0x70, + 0x10, 0x48, 0x4f, 0xf0, 0x00, 0x01, 0x03, 0x9b, 0x05, 0x68, 0x4f, 0xf0, + 0x06, 0x00, 0x00, 0x90, 0x40, 0xf6, 0x59, 0x10, 0x08, 0xbf, 0x40, 0xf6, + 0x58, 0x10, 0xa8, 0x47, 0x0a, 0x48, 0x12, 0x21, 0x00, 0x78, 0xf1, 0xf7, + 0xb5, 0xff, 0x7f, 0xbd, 0x29, 0x46, 0x22, 0x46, 0x00, 0xf0, 0x16, 0xf8, + 0x7f, 0xbd, 0x00, 0xbf, 0x8c, 0x7e, 0x08, 0x00, 0x1c, 0x4c, 0x01, 0x00, + 0x68, 0x8a, 0x01, 0x00, 0xf8, 0xa1, 0x08, 0x00, 0xf4, 0xa1, 0x08, 0x00, + 0x66, 0x34, 0x01, 0x00, 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, + 0x04, 0xb1, 0x08, 0x00, 0x01, 0xf0, 0x02, 0x00, 0x4a, 0xf2, 0x79, 0x4c, + 0xc1, 0xf2, 0x04, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x70, 0x47, 0x70, 0x47, + 0x7f, 0xb5, 0x05, 0x46, 0x10, 0x48, 0x0c, 0x46, 0xb0, 0xf8, 0x3c, 0x01, + 0xc0, 0x04, 0x15, 0xd5, 0xa0, 0x7a, 0x98, 0xb9, 0x00, 0x20, 0x01, 0xab, + 0x01, 0x21, 0x00, 0x22, 0x8d, 0xf8, 0x04, 0x00, 0xa8, 0x8a, 0xad, 0xf8, + 0x06, 0x00, 0x20, 0x68, 0x02, 0x90, 0x68, 0x68, 0x03, 0x90, 0x80, 0x48, + 0x06, 0x68, 0x0c, 0x20, 0x00, 0x90, 0x4f, 0xf4, 0x16, 0x60, 0xb0, 0x47, + 0x28, 0x46, 0x21, 0x46, 0x00, 0xf0, 0x60, 0xff, 0x7f, 0xbd, 0x00, 0xbf, + 0x8c, 0x7e, 0x08, 0x00, 0xbc, 0xb5, 0x04, 0x46, 0x80, 0x79, 0xe1, 0x79, + 0x40, 0xea, 0x01, 0x20, 0xc0, 0xf3, 0xc5, 0x00, 0x0e, 0x28, 0x8d, 0xf8, + 0x07, 0x00, 0x0c, 0xd0, 0x3f, 0x28, 0x0a, 0xd0, 0x71, 0x48, 0x0d, 0xf1, + 0x07, 0x03, 0x00, 0x21, 0x01, 0x22, 0x05, 0x68, 0x01, 0x20, 0x00, 0x90, + 0x40, 0xf6, 0x09, 0x10, 0xa8, 0x47, 0x20, 0x46, 0x00, 0xf0, 0x46, 0xff, + 0xbc, 0xbd, 0x00, 0xbf, 0x2d, 0xe9, 0xf0, 0x43, 0x85, 0xb0, 0x81, 0x46, + 0x08, 0x78, 0x16, 0x46, 0x88, 0x46, 0x13, 0x28, 0x3d, 0xd1, 0xd8, 0xf8, + 0x04, 0xc0, 0x9c, 0xf8, 0x01, 0x10, 0x02, 0x29, 0x37, 0xd1, 0xd9, 0xf8, + 0x00, 0x20, 0x5d, 0x49, 0xd2, 0xf8, 0xd8, 0x20, 0x09, 0x68, 0x52, 0x78, + 0xc2, 0xeb, 0x02, 0x12, 0x01, 0xeb, 0x42, 0x12, 0x02, 0xf5, 0xea, 0x73, + 0x92, 0xf8, 0xd5, 0x11, 0x02, 0xf5, 0xe8, 0x72, 0x13, 0xf8, 0x02, 0x7b, + 0x47, 0xea, 0x01, 0x21, 0x1f, 0x78, 0x5b, 0x78, 0x47, 0xea, 0x03, 0x23, + 0x41, 0xea, 0x03, 0x41, 0x91, 0x42, 0x1a, 0xd0, 0x91, 0xf8, 0x24, 0x30, + 0x01, 0x2b, 0x0b, 0xd0, 0x11, 0xf8, 0x04, 0x3f, 0x4f, 0x78, 0x88, 0x78, + 0xc9, 0x78, 0x43, 0xea, 0x07, 0x23, 0x40, 0xea, 0x01, 0x20, 0x43, 0xea, + 0x00, 0x41, 0xed, 0xe7, 0x9c, 0xf8, 0x02, 0x20, 0x3a, 0xb1, 0x89, 0x68, + 0xb1, 0xf8, 0xdc, 0x12, 0x19, 0x29, 0x9c, 0xbf, 0x51, 0x1e, 0x8c, 0xf8, + 0x02, 0x10, 0x43, 0x48, 0x01, 0x68, 0x48, 0x46, 0x88, 0x47, 0xff, 0x28, + 0x21, 0xd0, 0x07, 0x46, 0x01, 0x2e, 0x03, 0xd1, 0x3f, 0x48, 0x01, 0x68, + 0x40, 0x46, 0x88, 0x47, 0x5d, 0x49, 0x09, 0xeb, 0x87, 0x04, 0x00, 0x26, + 0x42, 0x46, 0x01, 0x23, 0x20, 0x6b, 0xcd, 0xe9, 0x00, 0x66, 0x02, 0x96, + 0x0d, 0x68, 0x0e, 0x21, 0xa8, 0x47, 0x02, 0x46, 0x57, 0x48, 0x21, 0x6b, + 0x03, 0x68, 0x99, 0xf8, 0x8c, 0x00, 0x98, 0x47, 0x01, 0x28, 0x1c, 0xbf, + 0x09, 0xeb, 0x07, 0x00, 0x80, 0xf8, 0x40, 0x60, 0x59, 0xe0, 0x99, 0xf8, + 0x4c, 0x00, 0x04, 0x28, 0x2d, 0xd8, 0x98, 0xf8, 0x00, 0x00, 0x0a, 0x28, + 0x29, 0xd0, 0x10, 0x28, 0x27, 0xd0, 0x15, 0x28, 0x25, 0xd0, 0x13, 0x28, + 0x04, 0xd1, 0xd8, 0xf8, 0x04, 0x00, 0x40, 0x78, 0x02, 0x28, 0x1e, 0xd0, + 0x27, 0x48, 0x01, 0x68, 0xb8, 0xf8, 0x02, 0x00, 0x08, 0x30, 0x88, 0x47, + 0xb8, 0xb1, 0xb8, 0xf8, 0x02, 0x10, 0x06, 0x46, 0x98, 0xf8, 0x00, 0x20, + 0x41, 0x80, 0x08, 0x30, 0x32, 0x70, 0x70, 0x60, 0xb8, 0xf8, 0x02, 0x30, + 0xd8, 0xf8, 0x04, 0x20, 0xf1, 0xf7, 0xb0, 0xfe, 0x09, 0xf1, 0x44, 0x01, + 0x30, 0x46, 0xf4, 0xf7, 0x81, 0xf8, 0xd9, 0xf8, 0x6c, 0x00, 0x01, 0x21, + 0x05, 0xe0, 0xd9, 0xf8, 0x6c, 0x00, 0x00, 0x21, 0x01, 0x30, 0xc9, 0xf8, + 0x6c, 0x00, 0x8d, 0xf8, 0x0f, 0x00, 0x00, 0x20, 0x8d, 0xf8, 0x0e, 0x00, + 0x40, 0xf2, 0x17, 0x10, 0xad, 0xf8, 0x0c, 0x00, 0x11, 0xb1, 0x01, 0x20, + 0x8d, 0xf8, 0x0e, 0x00, 0x98, 0xf8, 0x00, 0x00, 0x13, 0x28, 0x8d, 0xf8, + 0x10, 0x00, 0x04, 0xd1, 0xd8, 0xf8, 0x04, 0x00, 0x40, 0x78, 0x8d, 0xf8, + 0x11, 0x00, 0x0a, 0x48, 0x03, 0xab, 0x00, 0x21, 0x00, 0x22, 0x04, 0x68, + 0x06, 0x20, 0x00, 0x90, 0x40, 0xf6, 0x5b, 0x10, 0xa0, 0x47, 0x05, 0xb0, + 0xbd, 0xe8, 0xf0, 0x83, 0xe0, 0x35, 0x01, 0x00, 0xd0, 0xaf, 0x08, 0x00, + 0xcc, 0xaf, 0x08, 0x00, 0xd4, 0x9b, 0x08, 0x00, 0xa0, 0xa0, 0x08, 0x00, + 0xf0, 0xb5, 0x85, 0xb0, 0x14, 0x46, 0x05, 0x46, 0x00, 0x6d, 0x0e, 0x46, + 0x8a, 0x68, 0x99, 0x88, 0x1f, 0x46, 0x03, 0x30, 0x0b, 0x46, 0xf1, 0xf7, + 0x65, 0xfe, 0x70, 0x7c, 0x29, 0x6d, 0x01, 0x23, 0x08, 0x70, 0x30, 0x7c, + 0xf2, 0x89, 0x29, 0x6d, 0x42, 0xea, 0x80, 0x30, 0x4a, 0x70, 0x11, 0x4a, + 0x00, 0x0a, 0x88, 0x70, 0x0f, 0x20, 0x8d, 0xf8, 0x0c, 0x00, 0x28, 0x6d, + 0xb9, 0x88, 0x17, 0x68, 0x72, 0x7c, 0x00, 0x26, 0x04, 0x90, 0xc8, 0x1c, + 0xad, 0xf8, 0x0e, 0x00, 0x20, 0x68, 0xcd, 0xe9, 0x00, 0x21, 0x03, 0xaa, + 0x0e, 0x21, 0x02, 0x96, 0xb8, 0x47, 0x02, 0x46, 0x06, 0x48, 0x21, 0x68, + 0x03, 0x68, 0x95, 0xf8, 0x8c, 0x00, 0x98, 0x47, 0x01, 0x28, 0x18, 0xbf, + 0xa6, 0x71, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0xbf, 0xc0, 0xaf, 0x08, 0x00, + 0xd4, 0xaf, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, 0x93, 0xb0, 0xde, 0x49, + 0x0d, 0xf1, 0x3a, 0x02, 0x0c, 0xab, 0x09, 0x68, 0x12, 0x91, 0x06, 0x90, + 0x0e, 0xa9, 0x90, 0xf8, 0x8d, 0x00, 0x00, 0x91, 0x0d, 0xa9, 0x00, 0xf0, + 0x25, 0xfe, 0xbd, 0xf8, 0x3a, 0x10, 0xbd, 0xf8, 0x38, 0x00, 0x08, 0x44, + 0x0a, 0x28, 0x09, 0xd2, 0xd3, 0x48, 0x00, 0x68, 0x12, 0x99, 0x40, 0x1a, + 0x04, 0xbf, 0x13, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0xf7, 0xf7, 0x50, 0xfc, + 0xcf, 0x48, 0x0a, 0x25, 0x00, 0x24, 0x0d, 0xf1, 0x3c, 0x0b, 0x4f, 0xf0, + 0x00, 0x08, 0x4f, 0xf0, 0x00, 0x0a, 0x4f, 0xf0, 0x0a, 0x09, 0x02, 0x30, + 0x01, 0x90, 0x00, 0x20, 0x03, 0x90, 0x00, 0x20, 0x05, 0x90, 0x00, 0x20, + 0x04, 0x90, 0x14, 0xfa, 0x89, 0xf7, 0x88, 0xb2, 0x1f, 0xfa, 0x89, 0xf6, + 0x87, 0x42, 0x0f, 0xd9, 0x1f, 0xfa, 0x8a, 0xf2, 0x90, 0x42, 0x13, 0xd9, + 0x0d, 0x99, 0x0a, 0x19, 0x01, 0x1b, 0x58, 0x46, 0x0b, 0x46, 0xf1, 0xf7, + 0xed, 0xfd, 0xbd, 0xf8, 0x3a, 0x10, 0x0a, 0x1b, 0x92, 0x44, 0x08, 0xe0, + 0x0d, 0x98, 0x31, 0x46, 0x33, 0x46, 0x02, 0x19, 0x58, 0x46, 0xf1, 0xf7, + 0xe1, 0xfd, 0x0f, 0xe0, 0x00, 0x22, 0x1b, 0xfa, 0x82, 0xf0, 0x92, 0xb2, + 0x89, 0xb2, 0xb7, 0x1a, 0x1f, 0xfa, 0x8a, 0xf2, 0x51, 0x1a, 0x0c, 0x9a, + 0x3b, 0x46, 0x0a, 0x44, 0x39, 0x46, 0xf1, 0xf7, 0xd1, 0xfd, 0x57, 0x44, + 0x5f, 0xfa, 0x88, 0xf0, 0x04, 0x28, 0x00, 0xf2, 0xe3, 0x80, 0x07, 0x95, + 0xdf, 0xe8, 0x00, 0xf0, 0x03, 0x2d, 0x3a, 0x5d, 0x71, 0x00, 0x9b, 0xf8, + 0x08, 0x50, 0x9b, 0xf8, 0x09, 0x00, 0xbd, 0xf8, 0x38, 0x20, 0x45, 0xea, + 0x00, 0x24, 0xbd, 0xf8, 0x3a, 0x00, 0x16, 0xfa, 0x84, 0xf1, 0x02, 0x44, + 0x8a, 0x42, 0xc0, 0xf0, 0x20, 0x81, 0x9b, 0xf8, 0x06, 0x20, 0x9b, 0xf8, + 0x07, 0x30, 0x42, 0xea, 0x03, 0x28, 0x18, 0xf0, 0x03, 0x0a, 0x77, 0xd0, + 0xba, 0xf1, 0x02, 0x0f, 0x40, 0xf0, 0x1d, 0x81, 0x01, 0x9b, 0x1f, 0xfa, + 0x84, 0xfc, 0x02, 0x31, 0x1a, 0x88, 0x01, 0x32, 0x1a, 0x80, 0x0c, 0xf0, + 0x01, 0x03, 0x13, 0xfa, 0x81, 0xf1, 0x01, 0x23, 0x6b, 0xe0, 0x9b, 0xf8, + 0x00, 0x10, 0x4f, 0xf0, 0x02, 0x08, 0x08, 0x46, 0x04, 0x91, 0x00, 0x29, + 0x08, 0xbf, 0x4f, 0xf0, 0x04, 0x08, 0x4f, 0xf0, 0x03, 0x09, 0xa5, 0xe0, + 0x8f, 0x48, 0x9b, 0xf8, 0x02, 0x20, 0x01, 0x68, 0x9b, 0xf8, 0x01, 0x00, + 0x40, 0xea, 0x02, 0x29, 0x1f, 0xfa, 0x89, 0xf0, 0x88, 0x47, 0x05, 0x9c, + 0x00, 0x28, 0x04, 0xf1, 0x01, 0x04, 0x05, 0x94, 0x00, 0xf0, 0x96, 0x80, + 0x01, 0x46, 0x9b, 0xf8, 0x00, 0x00, 0xa1, 0xf8, 0x02, 0x90, 0x03, 0x91, + 0x08, 0x70, 0x5f, 0xea, 0x09, 0x40, 0x08, 0x46, 0x00, 0xf0, 0xa3, 0x80, + 0xd1, 0xf8, 0x04, 0xb0, 0x4f, 0xf0, 0x03, 0x08, 0x82, 0xe0, 0x7d, 0x48, + 0x03, 0x99, 0x02, 0x68, 0x06, 0x98, 0x90, 0x47, 0x04, 0x98, 0x05, 0x99, + 0x4f, 0xf0, 0x04, 0x08, 0x4f, 0xf0, 0x03, 0x09, 0x0d, 0xf1, 0x3c, 0x0b, + 0xc0, 0xb2, 0xc9, 0xb2, 0x81, 0x42, 0x38, 0xbf, 0x4f, 0xf0, 0x02, 0x08, + 0x6e, 0xe0, 0x9b, 0xf8, 0x01, 0x10, 0x9b, 0xf8, 0x02, 0x20, 0x9b, 0xf8, + 0x00, 0x00, 0x41, 0xea, 0x02, 0x24, 0x06, 0x99, 0x09, 0x68, 0x91, 0xf8, + 0x08, 0x21, 0x90, 0x42, 0x0a, 0xd2, 0x01, 0xeb, 0x80, 0x01, 0xc9, 0x6b, + 0xb1, 0xf8, 0x42, 0x10, 0x49, 0xb1, 0x22, 0x04, 0x02, 0xd0, 0xa2, 0xb2, + 0x8a, 0x42, 0x7e, 0xd9, 0x00, 0x20, 0x4f, 0xf4, 0x2d, 0x71, 0xf7, 0xf7, + 0x89, 0xfb, 0x04, 0xeb, 0x07, 0x0a, 0x4f, 0xf0, 0x04, 0x08, 0x5b, 0xe0, + 0x01, 0x9b, 0x1a, 0x88, 0x01, 0x32, 0x1a, 0x80, 0x00, 0x23, 0x02, 0x93, + 0x0d, 0x9b, 0x08, 0x93, 0x8b, 0xb2, 0x83, 0x42, 0x28, 0xbf, 0x03, 0x46, + 0xad, 0xf8, 0x24, 0x30, 0x03, 0xd9, 0x0c, 0x9b, 0x08, 0x1a, 0x0a, 0x93, + 0x01, 0xe0, 0x00, 0x20, 0x0a, 0x90, 0xad, 0xf8, 0x2c, 0x00, 0x58, 0x48, + 0x91, 0xb2, 0x01, 0x22, 0x03, 0x68, 0x08, 0xa8, 0x98, 0x47, 0x06, 0x98, + 0x31, 0x46, 0x90, 0xf8, 0x8d, 0x00, 0x00, 0xf0, 0x19, 0xfd, 0xba, 0xf1, + 0x00, 0x0f, 0x00, 0xf0, 0x8e, 0x80, 0x07, 0x98, 0x20, 0x44, 0x07, 0x90, + 0x02, 0x98, 0xe0, 0xb1, 0x4e, 0x48, 0x06, 0x9e, 0x1f, 0xfa, 0x88, 0xf9, + 0x01, 0x68, 0x0f, 0xa8, 0xa6, 0xf8, 0x12, 0x80, 0x88, 0x47, 0x01, 0x21, + 0x70, 0x60, 0x19, 0xf0, 0x04, 0x00, 0x4f, 0xf0, 0x01, 0x08, 0x4f, 0xf0, + 0x01, 0x09, 0xb4, 0x82, 0x61, 0xf3, 0x5f, 0x05, 0x86, 0xf8, 0x8e, 0x50, + 0x08, 0xbf, 0x4f, 0xf0, 0x04, 0x08, 0x08, 0xbf, 0x4f, 0xf0, 0x03, 0x09, + 0x01, 0xe0, 0x4f, 0xf0, 0x00, 0x08, 0x07, 0x9d, 0xba, 0x46, 0x0f, 0xe0, + 0x04, 0x98, 0xe1, 0xb2, 0x4f, 0xf0, 0x04, 0x08, 0x09, 0xeb, 0x07, 0x0a, + 0xc0, 0xb2, 0x81, 0x42, 0x4f, 0xf0, 0x00, 0x00, 0x38, 0xbf, 0x4f, 0xf0, + 0x02, 0x08, 0x03, 0x90, 0x4f, 0xf0, 0x03, 0x09, 0xa8, 0xb2, 0x1f, 0xfa, + 0x8a, 0xf4, 0x84, 0x42, 0xbf, 0xf4, 0xb4, 0xae, 0xbd, 0xf8, 0x3a, 0x10, + 0xcd, 0xe6, 0x2e, 0x48, 0x02, 0x68, 0x06, 0x98, 0x90, 0x47, 0x04, 0x98, + 0xe1, 0xb2, 0x4f, 0xf0, 0x04, 0x08, 0xc0, 0xb2, 0x81, 0x42, 0x38, 0xbf, + 0x4f, 0xf0, 0x02, 0x08, 0x2d, 0xe7, 0xbd, 0xf8, 0x3a, 0x10, 0x12, 0xfa, + 0x87, 0xfa, 0xba, 0xb2, 0x8a, 0x45, 0x14, 0xd9, 0x91, 0x42, 0x15, 0xd9, + 0x06, 0x9d, 0x0d, 0x9b, 0xc9, 0x1b, 0xed, 0x69, 0x1a, 0x44, 0x03, 0x01, + 0x05, 0xeb, 0x00, 0x10, 0xea, 0x50, 0x07, 0x9d, 0x81, 0x80, 0x0c, 0x99, + 0xbd, 0xf8, 0x3a, 0x20, 0x81, 0x60, 0xe1, 0x19, 0x89, 0x1a, 0x81, 0x81, + 0x6b, 0xe7, 0x0d, 0x99, 0x11, 0x44, 0x02, 0xe0, 0x51, 0x1a, 0x0c, 0x9a, + 0x11, 0x44, 0x06, 0x9b, 0x02, 0x01, 0xdb, 0x69, 0x03, 0xeb, 0x00, 0x10, + 0x99, 0x50, 0x84, 0x80, 0x5d, 0xe7, 0x06, 0x98, 0x15, 0x49, 0x90, 0xf8, + 0x8d, 0x00, 0x09, 0x68, 0x88, 0x47, 0x00, 0x20, 0x4f, 0xf4, 0xe3, 0x71, + 0x08, 0xe0, 0x06, 0x98, 0x10, 0x49, 0x90, 0xf8, 0x8d, 0x00, 0x09, 0x68, + 0x88, 0x47, 0x00, 0x20, 0x4f, 0xf4, 0xe7, 0x71, 0xf1, 0xf7, 0x6e, 0xfc, + 0x62, 0xe6, 0x60, 0x1c, 0x4f, 0xf6, 0xfe, 0x71, 0x01, 0x40, 0x06, 0x98, + 0x90, 0xf8, 0x8d, 0x00, 0x00, 0xf0, 0x7e, 0xfc, 0x58, 0xe6, 0x00, 0xbf, + 0x38, 0xec, 0x01, 0x00, 0x76, 0xe5, 0x05, 0x00, 0x10, 0xb1, 0x08, 0x00, + 0x0c, 0xb1, 0x08, 0x00, 0x04, 0xb1, 0x08, 0x00, 0x08, 0xb1, 0x08, 0x00, + 0x14, 0xb1, 0x08, 0x00, 0xf8, 0xb5, 0x0c, 0x4e, 0xff, 0x21, 0x04, 0x46, + 0x32, 0x68, 0x90, 0x47, 0x80, 0xb1, 0x0a, 0x4f, 0x05, 0x46, 0x3b, 0x68, + 0x20, 0x46, 0x29, 0x46, 0x01, 0x22, 0x98, 0x47, 0x28, 0x46, 0xf7, 0xf7, + 0xc3, 0xfa, 0x32, 0x68, 0x20, 0x46, 0xff, 0x21, 0x90, 0x47, 0x05, 0x46, + 0x00, 0x28, 0xf0, 0xd1, 0xf8, 0xbd, 0x00, 0xbf, 0xd8, 0xb1, 0x08, 0x00, + 0x74, 0x9d, 0x08, 0x00, 0x40, 0x30, 0x00, 0x21, 0x02, 0x78, 0x32, 0xb1, + 0x01, 0x31, 0x01, 0x30, 0x04, 0x29, 0x04, 0xbf, 0x00, 0x20, 0x70, 0x47, + 0xf6, 0xe7, 0x01, 0x20, 0x70, 0x47, 0x00, 0xbf, 0xfe, 0xb5, 0x05, 0x46, + 0x00, 0x68, 0x0c, 0x46, 0x76, 0x49, 0xd0, 0xf8, 0xd8, 0x00, 0x09, 0x68, + 0x42, 0x78, 0xc2, 0xeb, 0x02, 0x12, 0x01, 0xeb, 0x42, 0x11, 0x01, 0xf5, + 0xea, 0x73, 0x91, 0xf8, 0xd5, 0x21, 0x01, 0xf5, 0xe8, 0x71, 0x13, 0xf8, + 0x02, 0x6b, 0x46, 0xea, 0x02, 0x22, 0x1e, 0x78, 0x5b, 0x78, 0x46, 0xea, + 0x03, 0x23, 0x42, 0xea, 0x03, 0x42, 0x8a, 0x42, 0x11, 0xd0, 0x92, 0xf8, + 0x24, 0x30, 0x01, 0x2b, 0x1e, 0xd0, 0xad, 0xf8, 0x0a, 0x30, 0x12, 0xf8, + 0x04, 0x3f, 0x56, 0x78, 0x97, 0x78, 0xd2, 0x78, 0x43, 0xea, 0x06, 0x23, + 0x47, 0xea, 0x02, 0x22, 0x43, 0xea, 0x02, 0x42, 0xeb, 0xe7, 0x00, 0x20, + 0x02, 0xab, 0x00, 0x21, 0x00, 0x22, 0xad, 0xf8, 0x08, 0x00, 0x24, 0x48, + 0x05, 0x68, 0x04, 0x20, 0x00, 0x90, 0x40, 0xf6, 0x5d, 0x10, 0xa8, 0x47, + 0x20, 0x46, 0xf7, 0xf7, 0x67, 0xfa, 0xfe, 0xbd, 0x21, 0x78, 0x18, 0x29, + 0x06, 0xd0, 0x0d, 0x29, 0x2d, 0xd1, 0x28, 0x46, 0x03, 0x21, 0x00, 0xf0, + 0xfd, 0xfb, 0x1e, 0xe0, 0x18, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, + 0x61, 0x68, 0x4d, 0x4e, 0x0a, 0x78, 0x49, 0x78, 0x30, 0x88, 0x42, 0xea, + 0x01, 0x27, 0xb9, 0xb2, 0x88, 0x42, 0x0e, 0xd0, 0xad, 0xf8, 0x06, 0x00, + 0x11, 0x48, 0x01, 0xab, 0x00, 0x21, 0x01, 0x22, 0xad, 0xf8, 0x04, 0x70, + 0xd0, 0xf8, 0x00, 0xc0, 0x04, 0x20, 0x00, 0x90, 0x40, 0xf6, 0x62, 0x10, + 0xe0, 0x47, 0x78, 0x1c, 0x30, 0x80, 0x20, 0x46, 0xf7, 0xf7, 0x3a, 0xfa, + 0x95, 0xf8, 0x84, 0x00, 0x10, 0xb1, 0x28, 0x46, 0xff, 0xf7, 0x60, 0xff, + 0xfe, 0xbd, 0x00, 0x78, 0x00, 0x28, 0xc5, 0xd1, 0x28, 0x46, 0x21, 0x46, + 0x00, 0xf0, 0xd2, 0xfb, 0xf0, 0xe7, 0x00, 0xbf, 0xcc, 0xaf, 0x08, 0x00, + 0xa0, 0xa0, 0x08, 0x00, 0x70, 0xb5, 0x06, 0x46, 0x92, 0xf8, 0x8f, 0x00, + 0x14, 0x46, 0x0d, 0x46, 0x02, 0x28, 0x06, 0xd1, 0x94, 0xf8, 0x82, 0x00, + 0x18, 0xb9, 0x20, 0x46, 0x03, 0x21, 0x00, 0xf0, 0xb7, 0xfb, 0x30, 0x46, + 0x29, 0x46, 0x22, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x00, 0xf0, 0xbc, 0xbb, + 0x70, 0xb5, 0x0d, 0x46, 0x04, 0x46, 0x00, 0xf0, 0xbd, 0xfb, 0x27, 0x49, + 0x00, 0x22, 0x01, 0x28, 0x0a, 0x80, 0x26, 0x49, 0x4f, 0xf0, 0xff, 0x02, + 0x0a, 0x70, 0x41, 0xd1, 0x21, 0x68, 0x24, 0x4a, 0x01, 0xeb, 0x85, 0x01, + 0xc9, 0x6b, 0xb1, 0xf8, 0x40, 0x10, 0x01, 0xeb, 0x41, 0x01, 0x52, 0xf8, + 0x21, 0x10, 0x20, 0x4a, 0x91, 0xf8, 0x1d, 0x11, 0x12, 0x68, 0xc1, 0xeb, + 0x01, 0x11, 0x02, 0xeb, 0x41, 0x11, 0x49, 0x78, 0xc1, 0xeb, 0x01, 0x11, + 0x02, 0xeb, 0x41, 0x11, 0x01, 0xf5, 0xea, 0x73, 0x91, 0xf8, 0xd5, 0x21, + 0x01, 0xf5, 0xe8, 0x71, 0x13, 0xf8, 0x02, 0x5b, 0x45, 0xea, 0x02, 0x22, + 0x1d, 0x78, 0x5b, 0x78, 0x45, 0xea, 0x03, 0x23, 0x42, 0xea, 0x03, 0x42, + 0x8a, 0x42, 0x14, 0xd0, 0x52, 0xf8, 0xc8, 0x3c, 0x2b, 0xb1, 0x52, 0xf8, + 0xc4, 0x3c, 0x13, 0xb1, 0x1b, 0x78, 0xff, 0x2b, 0x0f, 0xd1, 0x12, 0xf8, + 0x04, 0x3f, 0x55, 0x78, 0x96, 0x78, 0xd2, 0x78, 0x43, 0xea, 0x05, 0x23, + 0x46, 0xea, 0x02, 0x22, 0x43, 0xea, 0x02, 0x42, 0xe8, 0xe7, 0x00, 0x21, + 0xa4, 0xf8, 0x82, 0x10, 0x70, 0xbd, 0x40, 0xf2, 0x01, 0x11, 0xf9, 0xe7, + 0x7c, 0xe5, 0x05, 0x00, 0x40, 0xd3, 0x05, 0x00, 0xe8, 0x72, 0x01, 0x00, + 0xe0, 0x35, 0x01, 0x00, 0x2d, 0xe9, 0xf8, 0x43, 0x0f, 0x46, 0x04, 0x46, + 0x10, 0x46, 0x40, 0x21, 0x98, 0x46, 0x91, 0x46, 0xf4, 0xf7, 0x84, 0xf9, + 0x04, 0xf1, 0x20, 0x00, 0x00, 0x21, 0x50, 0xf8, 0x31, 0x20, 0x0b, 0x46, + 0x42, 0xb1, 0x00, 0xeb, 0xc3, 0x06, 0x7d, 0x7c, 0xf1, 0x79, 0xa9, 0x42, + 0x02, 0xd1, 0x16, 0xf8, 0x06, 0x5f, 0x25, 0xb1, 0x01, 0x21, 0x00, 0x2b, + 0xef, 0xd0, 0x79, 0x7c, 0x08, 0xe0, 0x01, 0x20, 0xa9, 0xf8, 0x04, 0x80, + 0x30, 0x70, 0x08, 0xeb, 0x02, 0x00, 0x12, 0x30, 0xc9, 0xf8, 0x00, 0x00, + 0x03, 0x48, 0x00, 0x22, 0x03, 0x68, 0x20, 0x46, 0x01, 0xb0, 0xbd, 0xe8, + 0xf0, 0x43, 0x18, 0x47, 0xe4, 0xb1, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x47, + 0x86, 0xb0, 0x89, 0x46, 0x49, 0x7c, 0x90, 0x46, 0x04, 0x46, 0x00, 0xf1, + 0x20, 0x06, 0x00, 0x20, 0x06, 0xeb, 0xc0, 0x02, 0xd2, 0x79, 0x8a, 0x42, + 0x04, 0xd0, 0x00, 0x28, 0x4f, 0xf0, 0x01, 0x00, 0xf6, 0xd0, 0x3a, 0xe0, + 0xd8, 0xf8, 0x00, 0x00, 0xb8, 0xb3, 0x94, 0xf8, 0x8f, 0x00, 0x03, 0x28, + 0x72, 0xd1, 0x5d, 0x48, 0x82, 0x88, 0x01, 0x32, 0x82, 0x80, 0x99, 0xf8, + 0x10, 0x00, 0xb8, 0xf8, 0x04, 0x30, 0x0b, 0xb1, 0x00, 0x28, 0x4b, 0xd0, + 0xad, 0xf8, 0x0a, 0x20, 0xb9, 0xf8, 0x0c, 0x20, 0x8d, 0xf8, 0x15, 0x00, + 0x8d, 0xf8, 0x14, 0x10, 0xad, 0xf8, 0x12, 0x30, 0xad, 0xf8, 0x08, 0x20, + 0x22, 0x68, 0x02, 0xeb, 0x81, 0x01, 0xf5, 0x4a, 0xc9, 0x6b, 0xb1, 0xf8, + 0x40, 0x10, 0x01, 0xeb, 0x41, 0x01, 0x52, 0xf8, 0x21, 0x10, 0x39, 0xb3, + 0x4a, 0x6b, 0x2a, 0xb3, 0x92, 0xf8, 0x28, 0x20, 0xd1, 0xf8, 0x60, 0x31, + 0xa3, 0xeb, 0x02, 0x02, 0xd2, 0xb2, 0xa3, 0xeb, 0x02, 0x02, 0x03, 0x92, + 0xb1, 0xf8, 0x74, 0x21, 0x98, 0xb1, 0x50, 0x1e, 0x14, 0xe0, 0x00, 0x20, + 0x02, 0xab, 0x00, 0x21, 0x00, 0x22, 0x8d, 0xf8, 0x0a, 0x00, 0x40, 0xf2, + 0x07, 0x40, 0xad, 0xf8, 0x08, 0x00, 0x79, 0x48, 0x04, 0x68, 0x06, 0x20, + 0x00, 0x90, 0x40, 0xf6, 0x5b, 0x10, 0xa0, 0x47, 0x69, 0xe0, 0x91, 0xf8, + 0x51, 0x01, 0x10, 0x1a, 0xad, 0xf8, 0x10, 0x00, 0x72, 0x48, 0x02, 0xab, + 0x01, 0x21, 0x00, 0x22, 0x05, 0x68, 0x10, 0x20, 0x00, 0x90, 0x40, 0xf6, + 0x55, 0x10, 0xa8, 0x47, 0x99, 0xf8, 0x11, 0x10, 0xdf, 0xf8, 0xc8, 0xa0, + 0x20, 0x46, 0xda, 0xf8, 0x00, 0x20, 0x90, 0x47, 0x90, 0xb1, 0x30, 0x4d, + 0x07, 0x46, 0x2b, 0x68, 0x20, 0x46, 0x39, 0x46, 0x01, 0x22, 0x98, 0x47, + 0x38, 0x46, 0xf7, 0xf7, 0xff, 0xf8, 0x99, 0xf8, 0x11, 0x10, 0xda, 0xf8, + 0x00, 0x20, 0x20, 0x46, 0x90, 0x47, 0x07, 0x46, 0x00, 0x28, 0xee, 0xd1, + 0x99, 0xf8, 0x11, 0x10, 0x00, 0x20, 0x06, 0xeb, 0xc0, 0x07, 0xfa, 0x79, + 0x8a, 0x42, 0x04, 0xd0, 0x00, 0x28, 0x4f, 0xf0, 0x01, 0x00, 0xf6, 0xd0, + 0x2c, 0xe0, 0xd8, 0xf8, 0x00, 0x00, 0x48, 0xb3, 0x94, 0xf8, 0x8f, 0x20, + 0x03, 0x2a, 0x2d, 0xd1, 0xb8, 0xf8, 0x04, 0x20, 0x62, 0xb9, 0x22, 0x68, + 0x02, 0xeb, 0x81, 0x01, 0xc9, 0x6b, 0xb1, 0xf8, 0x44, 0x10, 0xa8, 0xf8, + 0x04, 0x10, 0xf4, 0xf7, 0xaf, 0xf8, 0x03, 0x20, 0x89, 0xf8, 0x10, 0x00, + 0x15, 0x48, 0x49, 0x46, 0x3a, 0x46, 0x43, 0x46, 0x05, 0x68, 0x20, 0x46, + 0xa8, 0x47, 0x99, 0xf8, 0x11, 0x00, 0x80, 0xb9, 0x94, 0xf8, 0x8f, 0x00, + 0x03, 0x28, 0x0c, 0xd1, 0xc5, 0x48, 0xd9, 0xf8, 0x00, 0x10, 0x00, 0x22, + 0x03, 0x68, 0x20, 0x46, 0x98, 0x47, 0x04, 0xe0, 0x00, 0x20, 0x40, 0xf2, + 0x53, 0x41, 0xf7, 0xf7, 0x99, 0xf8, 0x06, 0xb0, 0xbd, 0xe8, 0xf0, 0x87, + 0x00, 0x20, 0xb8, 0x71, 0xb4, 0xf8, 0x80, 0x00, 0x01, 0x30, 0xa4, 0xf8, + 0x80, 0x00, 0xf4, 0xe7, 0x76, 0xe5, 0x05, 0x00, 0xd8, 0xb1, 0x08, 0x00, + 0x74, 0x9d, 0x08, 0x00, 0xdc, 0xb1, 0x08, 0x00, 0x70, 0xb5, 0x05, 0x46, + 0x08, 0x78, 0x16, 0x46, 0x0c, 0x46, 0x13, 0x28, 0x1a, 0xd1, 0x61, 0x68, + 0x48, 0x78, 0x04, 0x28, 0x16, 0xd1, 0x12, 0x4a, 0x28, 0x68, 0x09, 0x78, + 0x12, 0x68, 0x90, 0x47, 0x61, 0x68, 0x08, 0x70, 0xae, 0xb1, 0x95, 0xf8, + 0x84, 0x00, 0x01, 0x28, 0x11, 0xd1, 0xef, 0x48, 0x21, 0x46, 0x01, 0x22, + 0x03, 0x68, 0x28, 0x46, 0x98, 0x47, 0x20, 0x46, 0xbd, 0xe8, 0x70, 0x40, + 0xf7, 0xf7, 0x82, 0xb8, 0x28, 0x46, 0x21, 0x46, 0x32, 0x46, 0xbd, 0xe8, + 0x70, 0x40, 0x00, 0xf0, 0x33, 0xba, 0x05, 0xf1, 0x44, 0x01, 0x20, 0x46, + 0xbd, 0xe8, 0x70, 0x40, 0xf3, 0xf7, 0xdc, 0xbb, 0x34, 0xce, 0x08, 0x00, + 0xfe, 0xb5, 0x0e, 0x46, 0x05, 0x46, 0x10, 0x46, 0x40, 0x21, 0x1f, 0x46, + 0x14, 0x46, 0xf4, 0xf7, 0x43, 0xf8, 0x6f, 0xb3, 0xa2, 0x48, 0xb1, 0x7a, + 0x02, 0x68, 0x28, 0x46, 0x90, 0x47, 0x15, 0x4f, 0xad, 0xf8, 0x0a, 0x00, + 0x79, 0x88, 0x38, 0x80, 0x81, 0x42, 0x0e, 0xd0, 0x12, 0x48, 0x0d, 0xf1, + 0x0a, 0x03, 0x01, 0x21, 0x03, 0x22, 0xd0, 0xf8, 0x00, 0xc0, 0x02, 0x20, + 0x00, 0x90, 0x40, 0xf6, 0x5c, 0x10, 0xe0, 0x47, 0xbd, 0xf8, 0x0a, 0x00, + 0x78, 0x80, 0xb0, 0x7a, 0xe9, 0x69, 0x01, 0xeb, 0x00, 0x12, 0x00, 0x01, + 0x52, 0x68, 0x62, 0x60, 0x08, 0x58, 0x20, 0x60, 0xb0, 0x7a, 0xe9, 0x69, + 0x01, 0xeb, 0x00, 0x10, 0xd0, 0xe9, 0x02, 0x10, 0xc4, 0xe9, 0x02, 0x10, + 0x01, 0x20, 0xfe, 0xbd, 0x00, 0x20, 0xfe, 0xbd, 0x7e, 0xe5, 0x05, 0x00, + 0xa0, 0xa0, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x41, 0x06, 0x46, 0x10, 0x48, + 0x0f, 0x46, 0x00, 0x21, 0x00, 0x24, 0x06, 0xf1, 0x44, 0x08, 0x02, 0x68, + 0x40, 0x46, 0x90, 0x47, 0x90, 0xb1, 0x05, 0x46, 0x40, 0x68, 0x00, 0x78, + 0xb8, 0x42, 0x18, 0xbf, 0xff, 0x2f, 0x0a, 0xd1, 0x30, 0x46, 0xff, 0xf7, + 0x67, 0xfd, 0x30, 0xb1, 0x06, 0x48, 0x29, 0x46, 0x02, 0x68, 0x40, 0x46, + 0x90, 0x47, 0x2c, 0x46, 0x00, 0xe0, 0x00, 0x24, 0x20, 0x46, 0xbd, 0xe8, + 0xf0, 0x81, 0x00, 0xbf, 0x2c, 0xfa, 0x08, 0x00, 0xe8, 0xa0, 0x08, 0x00, + 0x2d, 0xe9, 0xf0, 0x41, 0x8c, 0xb0, 0xdf, 0xf8, 0x48, 0x81, 0x04, 0x46, + 0x51, 0x4a, 0x0d, 0x46, 0xd8, 0xf8, 0x00, 0x00, 0x0b, 0x90, 0x20, 0x20, + 0xad, 0xf8, 0x06, 0x00, 0x15, 0x20, 0x8d, 0xf8, 0x04, 0x00, 0x20, 0x68, + 0x00, 0xeb, 0x81, 0x00, 0x03, 0xa9, 0xc0, 0x6b, 0x02, 0x91, 0x00, 0x21, + 0x8d, 0xf8, 0x0c, 0x50, 0xad, 0xf8, 0x0e, 0x10, 0x06, 0x91, 0xb0, 0xf8, + 0x40, 0x00, 0x00, 0xeb, 0x40, 0x00, 0x52, 0xf8, 0x20, 0x00, 0x90, 0xf8, + 0x90, 0x10, 0x90, 0xf8, 0x42, 0x21, 0x90, 0xf8, 0x89, 0x30, 0x90, 0xf8, + 0x8a, 0x70, 0x90, 0xf8, 0x8b, 0x60, 0x8d, 0xf8, 0x1c, 0x10, 0x90, 0xf8, + 0x91, 0x10, 0x8d, 0xf8, 0x0d, 0x20, 0x90, 0xf8, 0x88, 0x20, 0x8d, 0xf8, + 0x11, 0x30, 0x8d, 0xf8, 0x13, 0x60, 0x8d, 0xf8, 0x12, 0x70, 0x90, 0xf8, + 0x9a, 0x30, 0x90, 0xf8, 0x9b, 0x60, 0x8d, 0xf8, 0x1d, 0x10, 0x90, 0xf8, + 0x92, 0x10, 0x8d, 0xf8, 0x10, 0x20, 0x8d, 0xf8, 0x1e, 0x10, 0x90, 0xf8, + 0x93, 0x10, 0x8d, 0xf8, 0x1f, 0x10, 0x90, 0xf8, 0xa4, 0x10, 0x8d, 0xf8, + 0x20, 0x10, 0xd0, 0xe9, 0x21, 0x12, 0x8d, 0xf8, 0x26, 0x30, 0x8d, 0xf8, + 0x27, 0x60, 0x89, 0x1a, 0x0a, 0x0e, 0x8d, 0xf8, 0x14, 0x10, 0x8d, 0xf8, + 0x17, 0x20, 0x0a, 0x0c, 0x09, 0x0a, 0x8d, 0xf8, 0x15, 0x10, 0x90, 0xf8, + 0xa5, 0x10, 0x8d, 0xf8, 0x16, 0x20, 0x90, 0xf8, 0x99, 0x20, 0x8d, 0xf8, + 0x21, 0x10, 0x90, 0xf8, 0xa6, 0x10, 0x8d, 0xf8, 0x25, 0x20, 0x8d, 0xf8, + 0x22, 0x10, 0x90, 0xf8, 0xa7, 0x10, 0x8d, 0xf8, 0x23, 0x10, 0x90, 0xf8, + 0x98, 0x10, 0x8d, 0xf8, 0x24, 0x10, 0x90, 0xf8, 0xa8, 0x10, 0x8d, 0xf8, + 0x28, 0x10, 0x90, 0xf8, 0xa9, 0x10, 0x8d, 0xf8, 0x29, 0x10, 0x90, 0xf8, + 0xaa, 0x10, 0x90, 0xf8, 0xab, 0x00, 0x8d, 0xf8, 0x2b, 0x00, 0x6d, 0x48, + 0x8d, 0xf8, 0x2a, 0x10, 0x01, 0xa9, 0x03, 0x68, 0xb4, 0xf8, 0x88, 0x00, + 0xb0, 0xfa, 0x80, 0xf0, 0x42, 0x09, 0x20, 0x46, 0x98, 0x47, 0x20, 0x68, + 0x90, 0xf8, 0x08, 0x01, 0x01, 0x38, 0xa8, 0x42, 0x08, 0xd1, 0x0b, 0x49, + 0xb4, 0xf8, 0x88, 0x00, 0x09, 0x88, 0x41, 0x1a, 0x18, 0xbf, 0x41, 0x1c, + 0xa4, 0xf8, 0x88, 0x10, 0xd8, 0xf8, 0x00, 0x00, 0x0b, 0x99, 0x40, 0x1a, + 0x04, 0xbf, 0x0c, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, 0xf6, 0xf7, 0x34, 0xff, + 0x38, 0xec, 0x01, 0x00, 0xe8, 0x72, 0x01, 0x00, 0x4a, 0x0a, 0x01, 0x00, + 0xb0, 0xb5, 0x0d, 0x46, 0x04, 0x46, 0x00, 0xf0, 0x17, 0xf9, 0x94, 0xf8, + 0x8f, 0x00, 0x03, 0x28, 0x19, 0xd1, 0xa8, 0x7a, 0x50, 0xb1, 0x94, 0xf8, + 0x8d, 0x00, 0x0b, 0x49, 0x08, 0x5c, 0x28, 0xb9, 0x0a, 0x48, 0x29, 0x68, + 0x01, 0x22, 0x03, 0x68, 0x20, 0x46, 0x98, 0x47, 0x94, 0xf8, 0x8d, 0x00, + 0x05, 0x49, 0x01, 0x22, 0x0a, 0x54, 0x94, 0xf8, 0x84, 0x00, 0x20, 0xb1, + 0x20, 0x46, 0xbd, 0xe8, 0xb0, 0x40, 0xff, 0xf7, 0x67, 0xbc, 0xb0, 0xbd, + 0x88, 0xe5, 0x05, 0x00, 0xe0, 0xb1, 0x08, 0x00, 0x70, 0xb5, 0x05, 0x46, + 0x08, 0x48, 0x14, 0x46, 0x0e, 0x46, 0x89, 0x7a, 0x02, 0x68, 0x28, 0x46, + 0x90, 0x47, 0x20, 0x80, 0x38, 0xb1, 0xb0, 0x7a, 0x29, 0x68, 0x01, 0xeb, + 0x80, 0x00, 0xc0, 0x6b, 0xb0, 0xf8, 0x46, 0x00, 0x20, 0x80, 0x70, 0xbd, + 0xb0, 0xb1, 0x08, 0x00, 0xb0, 0xb5, 0x04, 0x46, 0x90, 0xf8, 0x8d, 0x00, + 0x0d, 0x46, 0x00, 0xf0, 0xdd, 0xf8, 0x0c, 0x4a, 0x11, 0x78, 0xff, 0x29, + 0x04, 0xbf, 0x15, 0x70, 0x29, 0x46, 0x22, 0x8b, 0x90, 0x42, 0x09, 0xd1, + 0xa9, 0x42, 0x18, 0xbf, 0xb0, 0xbd, 0x07, 0x48, 0x29, 0x46, 0x02, 0x68, + 0x20, 0x46, 0xbd, 0xe8, 0xb0, 0x40, 0x10, 0x47, 0x20, 0x46, 0x03, 0x21, + 0xbd, 0xe8, 0xb0, 0x40, 0x00, 0xf0, 0xa0, 0xb8, 0x40, 0xd3, 0x05, 0x00, + 0xac, 0xb1, 0x08, 0x00, 0x10, 0xb5, 0x04, 0x46, 0x90, 0xf8, 0x8d, 0x00, + 0x00, 0xf0, 0xc0, 0xf8, 0xe1, 0x8a, 0x88, 0x42, 0x07, 0xd1, 0x20, 0x46, + 0x01, 0x21, 0x00, 0xf0, 0x8f, 0xf8, 0x00, 0x20, 0x84, 0xf8, 0x84, 0x00, + 0xa0, 0x81, 0x10, 0xbd, 0x19, 0x48, 0x1a, 0x49, 0x2e, 0x4a, 0x01, 0x60, + 0x19, 0x48, 0x1a, 0x49, 0x01, 0x60, 0x1a, 0x48, 0x1a, 0x49, 0x01, 0x60, + 0x1a, 0x48, 0x1b, 0x49, 0x01, 0x60, 0x1b, 0x48, 0x1b, 0x49, 0x01, 0x60, + 0x1b, 0x48, 0x1c, 0x49, 0x01, 0x60, 0x1c, 0x48, 0x1c, 0x49, 0x01, 0x60, + 0x1c, 0x48, 0x1d, 0x49, 0x01, 0x60, 0x1d, 0x48, 0x1d, 0x49, 0x01, 0x60, + 0x1d, 0x48, 0x1e, 0x49, 0x01, 0x60, 0x1e, 0x48, 0x1e, 0x49, 0xc0, 0xe9, + 0x02, 0x21, 0x1f, 0x48, 0x1f, 0x49, 0x24, 0x4a, 0x01, 0x60, 0x1f, 0x48, + 0x1f, 0x49, 0x40, 0xf8, 0x20, 0x1f, 0x1f, 0x49, 0xc1, 0x61, 0x1f, 0x49, + 0xc0, 0xe9, 0x03, 0x21, 0x1f, 0x49, 0x41, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0x08, 0xb1, 0x08, 0x00, 0x55, 0xf1, 0x02, 0x00, 0xf8, 0xb1, 0x08, 0x00, + 0x09, 0xf1, 0x02, 0x00, 0x74, 0x9d, 0x08, 0x00, 0x91, 0xf1, 0x02, 0x00, + 0xdc, 0xb1, 0x08, 0x00, 0x3d, 0xf3, 0x02, 0x00, 0xb4, 0xb1, 0x08, 0x00, + 0xb9, 0xf3, 0x02, 0x00, 0x10, 0xb1, 0x08, 0x00, 0xad, 0xf7, 0x02, 0x00, + 0xa4, 0xb1, 0x08, 0x00, 0xdd, 0xf8, 0x02, 0x00, 0xe8, 0xb1, 0x08, 0x00, + 0x19, 0xfc, 0x02, 0x00, 0xf0, 0xb1, 0x08, 0x00, 0xe5, 0xfc, 0x02, 0x00, + 0xd8, 0xb1, 0x08, 0x00, 0x95, 0xfc, 0x02, 0x00, 0x38, 0x0a, 0x01, 0x00, + 0x05, 0xff, 0x02, 0x00, 0xbd, 0xfe, 0x02, 0x00, 0xcc, 0xb1, 0x08, 0x00, + 0xb1, 0xf8, 0x02, 0x00, 0xf0, 0x09, 0x01, 0x00, 0x41, 0xfe, 0x02, 0x00, + 0xb5, 0xfb, 0x02, 0x00, 0xf9, 0xf9, 0x02, 0x00, 0x95, 0xf9, 0x02, 0x00, + 0x91, 0xfe, 0x02, 0x00, 0x41, 0xf6, 0x1d, 0x6c, 0xc1, 0xf2, 0x05, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf6, 0xd7, 0x3c, 0xc1, 0xf2, 0x05, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf6, 0xa1, 0x0c, 0xc1, 0xf2, 0x11, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf6, 0xbd, 0x0c, 0xc1, 0xf2, 0x11, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x40, 0xf6, 0x83, 0x4c, 0xc1, 0xf2, 0x05, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf6, 0x29, 0x3c, 0xc1, 0xf2, 0x05, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x40, 0xf6, 0xef, 0x3c, 0xc1, 0xf2, 0x05, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x40, 0xf6, 0x09, 0x3c, 0xc1, 0xf2, 0x05, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf2, 0x79, 0x0c, 0xc1, 0xf2, 0x05, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x40, 0xf6, 0x8f, 0x5c, 0xc1, 0xf2, 0x05, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf6, 0x75, 0x0c, 0xc1, 0xf2, 0x11, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf6, 0x81, 0x0c, 0xc1, 0xf2, 0x11, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0xb0, 0xf8, 0x86, 0x10, 0xb0, 0xf8, 0x84, 0x00, + 0x40, 0x1a, 0x18, 0xbf, 0x01, 0x20, 0x70, 0x47, 0x10, 0xb5, 0x04, 0x46, + 0xb0, 0xf8, 0x96, 0x00, 0x4f, 0xf6, 0xff, 0x71, 0x88, 0x42, 0x10, 0xd1, + 0x0b, 0x49, 0xb4, 0xf8, 0x86, 0x00, 0x49, 0x88, 0x81, 0x42, 0x0a, 0xd0, + 0x21, 0x68, 0x09, 0x4a, 0x04, 0xf1, 0x90, 0x00, 0xc9, 0x6b, 0x92, 0x7a, + 0xb1, 0xf8, 0x42, 0x10, 0x12, 0x09, 0xfe, 0xf7, 0x23, 0xf8, 0xb4, 0xf8, + 0xa4, 0x00, 0xb4, 0xf8, 0xac, 0x10, 0x08, 0x44, 0x80, 0xb2, 0x10, 0xbd, + 0x76, 0xe5, 0x05, 0x00, 0x40, 0x86, 0x08, 0x00, 0x70, 0xb5, 0x14, 0x46, + 0x0d, 0x46, 0x06, 0x46, 0xff, 0xf7, 0xd6, 0xff, 0x20, 0x80, 0x06, 0x48, + 0x01, 0x68, 0xb0, 0x68, 0x88, 0x47, 0xa9, 0x7a, 0x32, 0x68, 0x02, 0xeb, + 0x81, 0x01, 0xc9, 0x6b, 0x81, 0xf8, 0x5e, 0x00, 0x70, 0xbd, 0x00, 0xbf, + 0x3c, 0xaf, 0x08, 0x00, 0xfe, 0xb5, 0x0c, 0x46, 0x23, 0x49, 0x05, 0x46, + 0x80, 0x68, 0x09, 0x68, 0x88, 0x47, 0xa5, 0xf8, 0x86, 0x00, 0x21, 0x48, + 0x01, 0x68, 0xa8, 0x68, 0x88, 0x47, 0xa5, 0xf8, 0x88, 0x00, 0x1f, 0x48, + 0x01, 0x68, 0xa8, 0x68, 0x88, 0x47, 0xa5, 0xf8, 0x8a, 0x00, 0x28, 0x46, + 0xff, 0xf7, 0xae, 0xff, 0x06, 0x46, 0xb5, 0xf8, 0x8a, 0x00, 0xc0, 0xb1, + 0x95, 0xf8, 0x9c, 0x10, 0x42, 0x1a, 0x29, 0x68, 0xc9, 0x6b, 0xb1, 0xf8, + 0x46, 0x10, 0x8a, 0x42, 0x0f, 0xd0, 0xad, 0xf8, 0x06, 0x00, 0x14, 0x48, + 0xad, 0xf8, 0x08, 0x10, 0x01, 0xab, 0x00, 0x21, 0x00, 0x22, 0xad, 0xf8, + 0x04, 0x60, 0x07, 0x68, 0x06, 0x20, 0x00, 0x90, 0x40, 0xf6, 0x4b, 0x10, + 0xb8, 0x47, 0x20, 0x46, 0x40, 0x21, 0xf3, 0xf7, 0x8f, 0xfd, 0x6e, 0xb1, + 0xb5, 0xf8, 0xa4, 0x00, 0xa0, 0x80, 0xd5, 0xf8, 0xa0, 0x00, 0x20, 0x60, + 0xb5, 0xf8, 0xac, 0x00, 0xa0, 0x81, 0xd5, 0xf8, 0xa8, 0x00, 0xa0, 0x60, + 0x01, 0x20, 0xfe, 0xbd, 0x00, 0x20, 0xfe, 0xbd, 0x50, 0xb2, 0x08, 0x00, + 0x4c, 0xb2, 0x08, 0x00, 0x54, 0xb2, 0x08, 0x00, 0xa0, 0xa0, 0x08, 0x00, + 0x10, 0xb5, 0x0c, 0x46, 0x00, 0xf0, 0xae, 0xfa, 0x20, 0x88, 0x2f, 0x30, + 0x20, 0xf0, 0x03, 0x00, 0x20, 0x80, 0x10, 0xbd, 0x2d, 0xe9, 0xf8, 0x43, + 0x1b, 0x4c, 0x89, 0x46, 0x00, 0x21, 0x90, 0x22, 0x07, 0x46, 0x00, 0x26, + 0x23, 0x68, 0x98, 0x47, 0x58, 0xb3, 0x23, 0x68, 0x05, 0x46, 0x38, 0x46, + 0x00, 0x21, 0x2c, 0x22, 0x00, 0x26, 0x98, 0x47, 0xdf, 0xf8, 0x50, 0x80, + 0xc8, 0xf8, 0x00, 0x00, 0xf8, 0xb1, 0x13, 0x48, 0x00, 0x21, 0x00, 0x26, + 0x05, 0x60, 0x2f, 0x60, 0x07, 0xeb, 0x89, 0x00, 0xc0, 0x6b, 0x23, 0x68, + 0xb0, 0xf8, 0x44, 0x00, 0x02, 0x30, 0x82, 0xb2, 0x38, 0x46, 0x98, 0x47, + 0x68, 0x60, 0x70, 0xb1, 0x0b, 0x48, 0x49, 0x46, 0x02, 0x68, 0x28, 0x46, + 0x90, 0x47, 0xa8, 0x60, 0x30, 0xb1, 0xd8, 0xf8, 0x00, 0x00, 0x4f, 0xf6, + 0xff, 0x71, 0x2e, 0x46, 0xc1, 0x80, 0x00, 0xe0, 0x00, 0x26, 0x30, 0x46, + 0xbd, 0xe8, 0xf8, 0x83, 0x74, 0xd4, 0x08, 0x00, 0x84, 0xe5, 0x05, 0x00, + 0x5c, 0x4c, 0x01, 0x00, 0x14, 0xb2, 0x08, 0x00, 0xb0, 0xb5, 0x04, 0x46, + 0x00, 0x20, 0x4f, 0xf6, 0xff, 0x75, 0xa4, 0xf8, 0xac, 0x00, 0xc4, 0xf8, + 0xa8, 0x00, 0xa4, 0xf8, 0xa4, 0x00, 0xc4, 0xf8, 0xa0, 0x00, 0xb4, 0xf8, + 0x96, 0x00, 0xa8, 0x42, 0x0a, 0xd0, 0x94, 0xf8, 0x9c, 0x00, 0xb4, 0xf8, + 0x9a, 0x10, 0x08, 0x44, 0x03, 0x49, 0x80, 0xb2, 0x09, 0x68, 0x88, 0x47, + 0xa4, 0xf8, 0x96, 0x50, 0xb0, 0xbd, 0x00, 0xbf, 0x34, 0xf3, 0x08, 0x00, + 0xf0, 0xb5, 0x85, 0xb0, 0x1c, 0x46, 0xdc, 0x4b, 0x04, 0x94, 0x9d, 0x88, + 0x01, 0x35, 0x9d, 0x80, 0xaf, 0x4b, 0x9b, 0x7a, 0x03, 0xf0, 0x0f, 0x05, + 0x0a, 0x9b, 0x02, 0x2d, 0x14, 0xd1, 0x4b, 0xb1, 0x26, 0x78, 0x00, 0x25, + 0x01, 0x35, 0x09, 0x2e, 0x04, 0xbf, 0x10, 0x26, 0x26, 0x70, 0xef, 0xb2, + 0x9f, 0x42, 0xf7, 0xd1, 0x0d, 0x4d, 0x00, 0x26, 0xcd, 0xe9, 0x00, 0x62, + 0x02, 0x91, 0x3f, 0x21, 0x22, 0x46, 0x2d, 0x68, 0xa8, 0x47, 0x0c, 0xe0, + 0x07, 0x4c, 0x15, 0x46, 0x00, 0x2a, 0x24, 0x68, 0x18, 0xbf, 0x01, 0x25, + 0xcd, 0xe9, 0x00, 0x52, 0x02, 0x91, 0x04, 0xaa, 0x40, 0xf2, 0xf9, 0x11, + 0xa0, 0x47, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0xbf, 0xbc, 0xaf, 0x08, 0x00, + 0xc0, 0xaf, 0x08, 0x00, 0xf0, 0xb5, 0x85, 0xb0, 0x06, 0x46, 0x92, 0xf8, + 0x57, 0x00, 0x0d, 0x46, 0x91, 0x68, 0x14, 0x46, 0x00, 0xeb, 0x80, 0x02, + 0x01, 0xeb, 0x82, 0x01, 0x64, 0x31, 0xb1, 0x42, 0x43, 0xd1, 0x90, 0x49, + 0x89, 0x7a, 0x01, 0xf0, 0x0f, 0x01, 0x02, 0x29, 0x3d, 0xd1, 0x71, 0x7a, + 0x10, 0x29, 0x3a, 0xd1, 0x31, 0x7b, 0x72, 0x7b, 0xb3, 0x7b, 0xf7, 0x7b, + 0x8d, 0xf8, 0x04, 0x10, 0x8d, 0xf8, 0x05, 0x20, 0x8d, 0xf8, 0x06, 0x30, + 0x8d, 0xf8, 0x07, 0x70, 0x01, 0x99, 0xb1, 0xf1, 0xff, 0x3f, 0x11, 0xdc, + 0xae, 0x48, 0x01, 0xab, 0x00, 0x21, 0x02, 0x22, 0x07, 0x68, 0x04, 0x20, + 0x00, 0x90, 0x40, 0xf6, 0x45, 0x10, 0xb8, 0x47, 0xaa, 0x48, 0x12, 0x21, + 0x00, 0x78, 0xf0, 0xf7, 0x59, 0xfe, 0x94, 0xf8, 0x57, 0x00, 0x01, 0x99, + 0x94, 0xf8, 0x7c, 0x20, 0x00, 0x27, 0x04, 0xeb, 0x82, 0x03, 0x99, 0x66, + 0x11, 0x1f, 0x18, 0xbf, 0x51, 0x1c, 0x84, 0xf8, 0x7c, 0x10, 0x21, 0x18, + 0x80, 0xf0, 0x01, 0x00, 0x84, 0xf8, 0x57, 0x00, 0xa0, 0x8f, 0x81, 0xf8, + 0x58, 0x70, 0x01, 0x30, 0xa0, 0x87, 0xe0, 0x69, 0x01, 0x30, 0xe0, 0x61, + 0x00, 0xe0, 0x01, 0x27, 0x00, 0x20, 0x00, 0x22, 0xcd, 0xe9, 0x03, 0x00, + 0xcd, 0xe9, 0x01, 0x60, 0xad, 0xf8, 0x10, 0x00, 0x07, 0x48, 0xad, 0xf8, + 0x08, 0x50, 0x03, 0x68, 0x91, 0x48, 0x81, 0x88, 0x01, 0xa8, 0x98, 0x47, + 0x27, 0xb1, 0x30, 0x46, 0x29, 0x46, 0x22, 0x46, 0x00, 0xf0, 0xaa, 0xf9, + 0x05, 0xb0, 0xf0, 0xbd, 0x04, 0xb1, 0x08, 0x00, 0x80, 0xb5, 0x00, 0x21, + 0xa0, 0xf8, 0x52, 0x10, 0x80, 0xf8, 0x64, 0x10, 0xa0, 0xf8, 0x54, 0x10, + 0xa0, 0xf8, 0x56, 0x10, 0xa0, 0xf8, 0x58, 0x10, 0x42, 0xf6, 0xb0, 0x01, + 0x41, 0x61, 0x68, 0x30, 0x18, 0x21, 0xf3, 0xf7, 0x51, 0xfc, 0x80, 0xbd, + 0x10, 0xb5, 0x04, 0x46, 0xb0, 0xf8, 0x84, 0x00, 0xb4, 0xf8, 0x86, 0x10, + 0x81, 0x42, 0x1d, 0xd1, 0xb4, 0xf8, 0x82, 0x00, 0xb4, 0xf8, 0x88, 0x10, + 0x81, 0x42, 0x1a, 0xd1, 0x00, 0x20, 0x18, 0x21, 0xa4, 0xf8, 0x52, 0x00, + 0x84, 0xf8, 0x64, 0x00, 0xa4, 0xf8, 0x54, 0x00, 0xa4, 0xf8, 0x56, 0x00, + 0xa4, 0xf8, 0x58, 0x00, 0x42, 0xf6, 0xb0, 0x00, 0x60, 0x61, 0x04, 0xf1, + 0x68, 0x00, 0xf3, 0xf7, 0x2f, 0xfc, 0x07, 0x48, 0x01, 0x68, 0x20, 0x46, + 0x88, 0x47, 0x02, 0xe0, 0x94, 0xf8, 0xb8, 0x00, 0x28, 0xb1, 0xac, 0x48, + 0x01, 0x68, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x08, 0x47, 0x10, 0xbd, + 0x7c, 0xb2, 0x08, 0x00, 0x3d, 0x4b, 0x9b, 0x7a, 0x03, 0xf0, 0x0f, 0x03, + 0x02, 0x2b, 0x09, 0xd1, 0x03, 0x79, 0x5b, 0x07, 0x06, 0xd5, 0xc3, 0x79, + 0x10, 0x2b, 0x03, 0xd1, 0x0c, 0x30, 0x08, 0x60, 0x01, 0x20, 0x70, 0x47, + 0x00, 0xf0, 0x54, 0xb9, 0x10, 0xb5, 0x04, 0x46, 0x00, 0xf0, 0x56, 0xf9, + 0x40, 0xb1, 0x94, 0xf8, 0x63, 0x10, 0x04, 0x4a, 0x01, 0xeb, 0x81, 0x01, + 0x02, 0xeb, 0xc1, 0x01, 0x02, 0x4a, 0x8a, 0x60, 0x10, 0xbd, 0x00, 0xbf, + 0xb0, 0xaa, 0x01, 0x00, 0x75, 0x04, 0x03, 0x00, 0x2d, 0xe9, 0xfe, 0x43, + 0x0f, 0x46, 0x29, 0x49, 0x04, 0x46, 0x40, 0x68, 0x1d, 0x46, 0x91, 0x46, + 0x89, 0x7a, 0x01, 0xf0, 0x0f, 0x01, 0x02, 0x29, 0x19, 0xd1, 0xa9, 0x88, + 0xba, 0x68, 0x97, 0xf8, 0x10, 0x80, 0xfe, 0x89, 0x03, 0x30, 0x0b, 0x46, + 0xf0, 0xf7, 0x9a, 0xfd, 0x78, 0x7c, 0x61, 0x68, 0x08, 0x70, 0x46, 0xea, + 0x88, 0x31, 0x60, 0x68, 0x09, 0x0a, 0x46, 0x70, 0x81, 0x70, 0x0f, 0x20, + 0x8d, 0xf8, 0x04, 0x00, 0x60, 0x68, 0xaa, 0x88, 0x02, 0x90, 0xd0, 0x1c, + 0x11, 0xe0, 0xa9, 0x88, 0xba, 0x68, 0x02, 0x30, 0x0b, 0x46, 0xf0, 0xf7, + 0x83, 0xfd, 0x38, 0x7c, 0xf9, 0x89, 0x41, 0xea, 0x80, 0x30, 0x61, 0x68, + 0x08, 0x80, 0x0b, 0x20, 0x02, 0x91, 0xaa, 0x88, 0x8d, 0xf8, 0x04, 0x00, + 0x90, 0x1c, 0x6e, 0x4b, 0xad, 0xf8, 0x06, 0x00, 0x29, 0x68, 0xd9, 0xf8, + 0x00, 0x00, 0x1e, 0x68, 0x01, 0x23, 0x00, 0x93, 0x01, 0xab, 0xb0, 0x47, + 0x02, 0x46, 0x09, 0x48, 0xd9, 0xf8, 0x00, 0x10, 0x03, 0x68, 0x94, 0xf8, + 0x63, 0x00, 0x98, 0x47, 0x01, 0x28, 0x05, 0xd1, 0xa8, 0x88, 0xa4, 0xf8, + 0x4e, 0x00, 0xa0, 0x69, 0x01, 0x30, 0xa0, 0x61, 0xbd, 0xe8, 0xfe, 0x83, + 0x40, 0x86, 0x08, 0x00, 0xd4, 0xaf, 0x08, 0x00, 0x10, 0xb5, 0x8a, 0xb0, + 0x84, 0x8e, 0xb0, 0xf8, 0x88, 0x20, 0xb0, 0xf8, 0x86, 0x30, 0x90, 0xf8, + 0x80, 0x10, 0xad, 0xf8, 0x06, 0x40, 0x04, 0x8f, 0xad, 0xf8, 0x08, 0x20, + 0xad, 0xf8, 0x0a, 0x30, 0xad, 0xf8, 0x04, 0x10, 0x03, 0x29, 0x4f, 0xf0, + 0x01, 0x01, 0xad, 0xf8, 0x10, 0x40, 0x84, 0x8f, 0xad, 0xf8, 0x12, 0x40, + 0x44, 0x8f, 0xad, 0xf8, 0x14, 0x40, 0xb0, 0xf8, 0x82, 0x40, 0xa2, 0xeb, + 0x04, 0x02, 0xad, 0xf8, 0x0c, 0x20, 0xb0, 0xf8, 0x84, 0x20, 0xa3, 0xeb, + 0x02, 0x02, 0xd0, 0xf8, 0x8c, 0x30, 0xad, 0xf8, 0x0e, 0x20, 0xc2, 0x8f, + 0x07, 0x93, 0x01, 0xab, 0xad, 0xf8, 0x16, 0x20, 0xb0, 0xf8, 0x40, 0x20, + 0xad, 0xf8, 0x18, 0x20, 0xc2, 0x6a, 0xad, 0xf8, 0x1a, 0x20, 0x4f, 0xf0, + 0x00, 0x02, 0x0c, 0xbf, 0x00, 0x69, 0x00, 0x20, 0x08, 0x90, 0x09, 0x48, + 0x40, 0x88, 0xad, 0xf8, 0x24, 0x00, 0x08, 0x48, 0x04, 0x68, 0x24, 0x20, + 0x00, 0x90, 0x40, 0xf6, 0x4a, 0x10, 0xa0, 0x47, 0x05, 0x48, 0x12, 0x21, + 0x00, 0x78, 0xf0, 0xf7, 0x0f, 0xfd, 0x0a, 0xb0, 0x10, 0xbd, 0x00, 0xbf, + 0x76, 0xe5, 0x05, 0x00, 0xa0, 0xa0, 0x08, 0x00, 0x66, 0x34, 0x01, 0x00, + 0x70, 0xb5, 0x16, 0x46, 0x0d, 0x46, 0x04, 0x46, 0x00, 0xf0, 0x96, 0xf8, + 0xac, 0xb1, 0x94, 0xf8, 0x80, 0x00, 0x03, 0x28, 0x11, 0xd1, 0x30, 0x1d, + 0x00, 0x21, 0x02, 0x88, 0x12, 0xb1, 0x50, 0xf8, 0x04, 0x2c, 0x52, 0xb9, + 0x01, 0x31, 0x08, 0x30, 0x08, 0x29, 0xf6, 0xd1, 0x34, 0x48, 0x29, 0x68, + 0x02, 0x68, 0x20, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x10, 0x47, 0x70, 0xbd, + 0xb0, 0xb5, 0x05, 0x8d, 0x04, 0x46, 0x00, 0xf0, 0x7f, 0xf8, 0xa0, 0x6a, + 0x40, 0x1b, 0x18, 0xbf, 0x01, 0x20, 0x84, 0xf8, 0xb8, 0x00, 0xb0, 0xbd, + 0x13, 0x48, 0x14, 0x49, 0x15, 0x4a, 0x41, 0x62, 0x13, 0x49, 0xc0, 0xe9, + 0x00, 0x21, 0x14, 0x49, 0x14, 0x4a, 0x0a, 0x60, 0x14, 0x49, 0x15, 0x4a, + 0x0a, 0x60, 0x15, 0x49, 0x15, 0x4a, 0x0a, 0x60, 0x15, 0x49, 0x16, 0x4a, + 0x0a, 0x60, 0x16, 0x49, 0x16, 0x4a, 0x0a, 0x60, 0x16, 0x49, 0x17, 0x4a, + 0x0a, 0x60, 0x17, 0x49, 0x17, 0x4a, 0x0a, 0x60, 0x17, 0x49, 0x18, 0x4a, + 0x0a, 0x60, 0x18, 0x49, 0x18, 0x4a, 0x0a, 0x60, 0x18, 0x49, 0x01, 0x63, + 0x18, 0x48, 0x19, 0x49, 0x01, 0x60, 0x70, 0x47, 0x24, 0x0c, 0x01, 0x00, + 0xf5, 0x00, 0x03, 0x00, 0xd9, 0x01, 0x03, 0x00, 0xc5, 0x01, 0x03, 0x00, + 0x90, 0xb2, 0x08, 0x00, 0x9d, 0x00, 0x03, 0x00, 0x60, 0xb2, 0x08, 0x00, + 0x21, 0x01, 0x03, 0x00, 0x20, 0xb2, 0x08, 0x00, 0x5d, 0x02, 0x03, 0x00, + 0xc8, 0xaf, 0x08, 0x00, 0x9d, 0x02, 0x03, 0x00, 0x80, 0xd4, 0x08, 0x00, + 0x0d, 0x03, 0x03, 0x00, 0x94, 0xb2, 0x08, 0x00, 0x11, 0x04, 0x03, 0x00, + 0x14, 0xb2, 0x08, 0x00, 0x99, 0x04, 0x03, 0x00, 0x58, 0xb2, 0x08, 0x00, + 0xc1, 0x04, 0x03, 0x00, 0x8c, 0xb2, 0x08, 0x00, 0x75, 0x05, 0x03, 0x00, + 0x21, 0x06, 0x03, 0x00, 0x5c, 0xb2, 0x08, 0x00, 0x5d, 0x06, 0x03, 0x00, + 0x43, 0xf6, 0xe5, 0x6c, 0xc1, 0xf2, 0x05, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x44, 0xf2, 0xa7, 0x0c, 0xc1, 0xf2, 0x05, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x44, 0xf2, 0xb9, 0x1c, 0xc1, 0xf2, 0x05, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x43, 0xf6, 0x65, 0x7c, 0xc1, 0xf2, 0x05, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x44, 0xf6, 0xff, 0x2c, 0xc1, 0xf2, 0x05, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x44, 0xf6, 0x6b, 0x3c, 0xc1, 0xf2, 0x05, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x90, 0xf8, 0x0a, 0x11, 0x89, 0x07, 0x58, 0xbf, 0x70, 0x47, 0xc1, 0x6b, + 0x51, 0xb1, 0x09, 0x6a, 0x41, 0xb1, 0x90, 0xf8, 0x09, 0x21, 0x92, 0x07, + 0x04, 0xd0, 0x91, 0xf8, 0x8d, 0x10, 0x02, 0x4a, 0x00, 0x23, 0x53, 0x54, + 0x00, 0xf0, 0x0a, 0xb8, 0x88, 0xe5, 0x05, 0x00, 0x01, 0x48, 0x02, 0x49, + 0x01, 0x60, 0x70, 0x47, 0x58, 0xf4, 0x08, 0x00, 0x71, 0x07, 0x03, 0x00, + 0x4b, 0xf2, 0xc9, 0x4c, 0xc1, 0xf2, 0x04, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x10, 0xb5, 0x90, 0xf8, 0x09, 0x41, 0xa4, 0x07, 0x18, 0xbf, 0x10, 0xbd, + 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, 0x1a, 0xb8, 0x10, 0xb5, 0x90, 0xf8, + 0x09, 0x41, 0xa4, 0x07, 0x18, 0xbf, 0x10, 0xbd, 0xbd, 0xe8, 0x10, 0x40, + 0x00, 0xf0, 0x16, 0xb8, 0x03, 0x48, 0x04, 0x49, 0x01, 0x60, 0x04, 0x48, + 0x04, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, 0x98, 0xb1, 0x08, 0x00, + 0xcd, 0x07, 0x03, 0x00, 0x40, 0xce, 0x08, 0x00, 0xb9, 0x07, 0x03, 0x00, + 0x4d, 0xf2, 0x45, 0x1c, 0xc1, 0xf2, 0x04, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4d, 0xf2, 0xd3, 0x3c, 0xc1, 0xf2, 0x04, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x1c, 0xb5, 0x8a, 0x7a, 0x00, 0x68, 0x00, 0xeb, 0x82, 0x00, 0xc4, 0x6b, + 0xe2, 0x68, 0x20, 0x6a, 0x53, 0x6a, 0x0d, 0xf1, 0x06, 0x02, 0x98, 0x47, + 0xb4, 0xf8, 0x46, 0x00, 0xbd, 0xf8, 0x06, 0x10, 0x81, 0x42, 0x05, 0xd2, + 0x94, 0xf8, 0x5c, 0x00, 0x01, 0x30, 0x84, 0xf8, 0x5c, 0x00, 0x00, 0x20, + 0x1c, 0xbd, 0x00, 0xbf, 0x01, 0x48, 0x02, 0x49, 0x81, 0x61, 0x70, 0x47, + 0x84, 0x08, 0x01, 0x00, 0x19, 0x08, 0x03, 0x00, 0x07, 0x49, 0x09, 0x68, + 0x29, 0xb1, 0xc2, 0x78, 0x1a, 0xb1, 0x89, 0x78, 0x42, 0x79, 0x8a, 0x42, + 0x01, 0xd2, 0x00, 0xf0, 0x09, 0xb8, 0x12, 0x20, 0x4f, 0xf6, 0x57, 0x51, + 0xf6, 0xf7, 0x0a, 0xba, 0x84, 0x4c, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x4c, 0xf6, 0xcd, 0x6c, 0xc1, 0xf2, 0x05, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x80, 0xb5, 0x00, 0xf4, 0x7c, 0x41, 0xb1, 0xf5, 0x00, 0x5f, 0x03, 0xd1, + 0x06, 0x49, 0x09, 0x79, 0x49, 0x06, 0x03, 0xd5, 0x42, 0xf2, 0x5f, 0x01, + 0x88, 0x42, 0x01, 0xd1, 0x00, 0x20, 0x80, 0xbd, 0x00, 0xf0, 0xea, 0xf9, + 0x80, 0xbd, 0x00, 0xbf, 0xa8, 0x52, 0x01, 0x00, 0x70, 0xb5, 0xc0, 0xb1, + 0x0c, 0x46, 0xb1, 0xb1, 0x05, 0x46, 0xa0, 0x78, 0xe1, 0x78, 0x61, 0xf3, + 0x0d, 0x20, 0x06, 0x1d, 0x55, 0xf8, 0x08, 0x0c, 0x00, 0x89, 0x86, 0x42, + 0x03, 0xd9, 0x00, 0x20, 0x65, 0x21, 0xf0, 0xf7, 0x8d, 0xfb, 0x28, 0x46, + 0x31, 0x46, 0x22, 0x46, 0x33, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0xf0, 0xf7, + 0x97, 0xbb, 0x70, 0xbd, 0xb0, 0xb5, 0x43, 0x78, 0x01, 0x25, 0x1c, 0x09, + 0x65, 0xf3, 0x5f, 0x04, 0x02, 0x2c, 0x0a, 0xd1, 0xc3, 0xf3, 0x80, 0x13, + 0x91, 0xb1, 0x00, 0xeb, 0x83, 0x04, 0x25, 0x79, 0x0d, 0x70, 0x64, 0x79, + 0x4c, 0x70, 0x01, 0x21, 0x0b, 0xe0, 0x3a, 0xb1, 0x81, 0x78, 0x11, 0x70, + 0xc0, 0x78, 0x50, 0x70, 0x10, 0x88, 0x6f, 0xf3, 0x9f, 0x30, 0x10, 0x80, + 0x00, 0x21, 0x07, 0xe0, 0x00, 0x21, 0x2a, 0xb1, 0x00, 0xeb, 0x83, 0x00, + 0x83, 0x79, 0x13, 0x70, 0xc0, 0x79, 0x50, 0x70, 0x08, 0x46, 0xb0, 0xbd, + 0xfe, 0xb5, 0x0d, 0x46, 0x00, 0x21, 0x16, 0x46, 0x01, 0x22, 0x00, 0x23, + 0x02, 0x91, 0x02, 0xa9, 0x01, 0xf0, 0xfa, 0xf9, 0x02, 0x9c, 0x94, 0xb1, + 0x07, 0x46, 0x21, 0x1d, 0xa2, 0x1d, 0x28, 0x46, 0xa6, 0x70, 0xff, 0xf7, + 0xc5, 0xff, 0x06, 0x48, 0x01, 0x21, 0x00, 0x22, 0x23, 0x46, 0x00, 0x97, + 0x05, 0x68, 0x40, 0xf2, 0x33, 0x60, 0xa8, 0x47, 0x20, 0x46, 0xf6, 0xf7, + 0xbd, 0xf9, 0xfe, 0xbd, 0xa0, 0xa0, 0x08, 0x00, 0xf8, 0xb5, 0x00, 0x28, + 0x52, 0xd0, 0x05, 0x46, 0x04, 0x78, 0x40, 0x78, 0x60, 0xf3, 0x0b, 0x24, + 0x16, 0x2c, 0x17, 0xd8, 0x2c, 0x48, 0x04, 0xeb, 0x44, 0x01, 0x50, 0xf8, + 0x21, 0x60, 0x8e, 0xb1, 0x04, 0xeb, 0x44, 0x01, 0x00, 0xeb, 0x81, 0x00, + 0x00, 0x79, 0x05, 0x38, 0x01, 0x28, 0x09, 0xd8, 0x70, 0x6b, 0x38, 0xb1, + 0x31, 0x6b, 0x29, 0xb1, 0x90, 0xf8, 0x29, 0x10, 0xca, 0x07, 0x01, 0xd0, + 0x02, 0x78, 0x5a, 0xb1, 0x28, 0x46, 0xf6, 0xf7, 0x95, 0xf9, 0x21, 0x48, + 0x01, 0x21, 0x01, 0x22, 0x03, 0x68, 0x20, 0x46, 0x01, 0xb0, 0xbd, 0xe8, + 0xf0, 0x40, 0x18, 0x47, 0x00, 0x69, 0x00, 0x28, 0xf0, 0xd0, 0x48, 0x07, + 0xee, 0xd4, 0x93, 0x48, 0x90, 0xf8, 0x20, 0x00, 0xc0, 0x07, 0x15, 0xd0, + 0x16, 0x48, 0x90, 0xf9, 0xba, 0x01, 0x00, 0x28, 0x10, 0xd4, 0x6d, 0x48, + 0xea, 0x78, 0x01, 0x68, 0xa8, 0x78, 0x62, 0xf3, 0x0d, 0x20, 0x04, 0x30, + 0x88, 0x47, 0xb0, 0xb1, 0x29, 0x46, 0x07, 0x46, 0xff, 0xf7, 0x50, 0xff, + 0x28, 0x46, 0xf6, 0xf7, 0x6d, 0xf9, 0x00, 0xe0, 0x2f, 0x46, 0x38, 0x46, + 0x31, 0x46, 0xf2, 0xf7, 0xcf, 0xfc, 0x78, 0x78, 0x80, 0x06, 0x00, 0xd4, + 0xf8, 0xbd, 0x09, 0x48, 0x01, 0x68, 0x30, 0x46, 0xbd, 0xe8, 0xf8, 0x40, + 0x08, 0x47, 0x30, 0x46, 0x29, 0x46, 0x03, 0x22, 0xff, 0xf7, 0x7c, 0xff, + 0xbe, 0xe7, 0x00, 0xbf, 0xe8, 0x72, 0x01, 0x00, 0xe8, 0x65, 0x08, 0x00, + 0xe4, 0xb2, 0x08, 0x00, 0x98, 0xb2, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x47, + 0x04, 0x46, 0x75, 0x48, 0x88, 0x46, 0x99, 0x46, 0x92, 0x46, 0x90, 0xf8, + 0x20, 0x10, 0xc9, 0x07, 0x0a, 0xd1, 0x72, 0x48, 0x90, 0xf8, 0x60, 0x15, + 0x71, 0x48, 0x00, 0xf5, 0x34, 0x70, 0x01, 0xf0, 0x01, 0x01, 0xf4, 0xf7, + 0x15, 0xfc, 0x09, 0xe0, 0x90, 0xf8, 0x22, 0x00, 0x21, 0x7d, 0x81, 0x42, + 0x19, 0xd2, 0x48, 0x48, 0x01, 0x68, 0x0a, 0xf1, 0x0c, 0x00, 0x88, 0x47, + 0x07, 0x46, 0x90, 0xb1, 0x0a, 0x98, 0x08, 0x9e, 0x00, 0x21, 0x02, 0x28, + 0x1d, 0xd0, 0x04, 0x28, 0x3c, 0xd0, 0x06, 0x28, 0x3d, 0xd1, 0xb2, 0x45, + 0x04, 0xd0, 0x00, 0x20, 0x40, 0xf2, 0x1d, 0x21, 0xf6, 0xf7, 0xfe, 0xf8, + 0x4f, 0xf4, 0x00, 0x50, 0x10, 0xe0, 0x3c, 0x48, 0x94, 0xf8, 0x1d, 0x11, + 0x00, 0x68, 0xc1, 0xeb, 0x01, 0x11, 0x00, 0xeb, 0x41, 0x10, 0xb0, 0xf8, + 0x8e, 0x10, 0x01, 0x31, 0xa0, 0xf8, 0x8e, 0x10, 0x00, 0x20, 0xbd, 0xe8, + 0xf0, 0x87, 0x00, 0x20, 0x09, 0x9a, 0x4f, 0xea, 0x19, 0x23, 0x0b, 0x99, + 0xbe, 0x72, 0x87, 0xf8, 0x08, 0x90, 0x7b, 0x72, 0x13, 0x0e, 0x3a, 0x71, + 0x00, 0x29, 0xfb, 0x71, 0x4f, 0xea, 0x12, 0x43, 0x4f, 0xea, 0x12, 0x22, + 0x7a, 0x71, 0x4f, 0xf4, 0x80, 0x42, 0xbb, 0x71, 0x04, 0xbf, 0x48, 0xf2, + 0x00, 0x02, 0xcf, 0xf6, 0xff, 0x72, 0x01, 0x29, 0x18, 0xbf, 0x16, 0x43, + 0x31, 0x0a, 0xf9, 0x72, 0x01, 0x21, 0x05, 0xe0, 0x4f, 0xf4, 0x40, 0x50, + 0x02, 0xe0, 0x00, 0x21, 0x4f, 0xf4, 0x80, 0x50, 0x00, 0xf4, 0x40, 0x50, + 0x94, 0xf8, 0x44, 0x20, 0x40, 0xea, 0x81, 0x30, 0x00, 0x0a, 0x3a, 0x70, + 0x78, 0x70, 0x11, 0xfb, 0x01, 0xf0, 0x80, 0x00, 0x40, 0xea, 0x41, 0x00, + 0x00, 0xeb, 0x41, 0x00, 0x06, 0x1d, 0x0a, 0xeb, 0x06, 0x00, 0x05, 0x1f, + 0xa8, 0xb2, 0xb0, 0xf5, 0x80, 0x4f, 0x04, 0xd3, 0x00, 0x20, 0x40, 0xf2, + 0x47, 0x21, 0xf6, 0xf7, 0xa7, 0xf8, 0x28, 0x0a, 0x51, 0x46, 0x42, 0x46, + 0x53, 0x46, 0xbd, 0x70, 0xf8, 0x70, 0xb8, 0x19, 0xf0, 0xf7, 0x4e, 0xfa, + 0x04, 0xf1, 0x0c, 0x01, 0x38, 0x46, 0xf2, 0xf7, 0x1f, 0xfc, 0x0b, 0x48, + 0x94, 0xf8, 0x1d, 0x11, 0x00, 0x68, 0xc1, 0xeb, 0x01, 0x11, 0x00, 0xeb, + 0x41, 0x10, 0xb0, 0xf8, 0x8c, 0x10, 0x01, 0x31, 0xa0, 0xf8, 0x8c, 0x10, + 0x05, 0x48, 0x04, 0x21, 0x00, 0x78, 0xf0, 0xf7, 0x3d, 0xfa, 0x01, 0x20, + 0xbd, 0xe8, 0xf0, 0x87, 0xd4, 0x9b, 0x08, 0x00, 0xe0, 0x35, 0x01, 0x00, + 0x66, 0x34, 0x01, 0x00, 0xb0, 0xb5, 0x1b, 0x48, 0x00, 0x78, 0x50, 0xb1, + 0x1a, 0x4a, 0x00, 0x21, 0x52, 0xf8, 0x21, 0x40, 0x14, 0xb1, 0x54, 0xf8, + 0x0c, 0x3f, 0x2b, 0xb9, 0x01, 0x31, 0x81, 0x42, 0xf6, 0xd3, 0x00, 0x25, + 0x28, 0x46, 0xb0, 0xbd, 0x14, 0x48, 0x90, 0xf8, 0x20, 0x00, 0xc0, 0x07, + 0x05, 0xd1, 0x15, 0x48, 0x01, 0x68, 0x20, 0x46, 0xbd, 0xe8, 0xb0, 0x40, + 0x08, 0x47, 0x10, 0x48, 0x90, 0xf8, 0x60, 0x15, 0x0f, 0x48, 0x00, 0xf5, + 0x34, 0x70, 0x01, 0xf0, 0x01, 0x01, 0xf4, 0xf7, 0x51, 0xfb, 0x00, 0x28, + 0xe5, 0xd0, 0x05, 0x46, 0x0b, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, + 0x04, 0x46, 0x28, 0x46, 0x21, 0x46, 0xff, 0xf7, 0x49, 0xfe, 0x20, 0x46, + 0xf6, 0xf7, 0x66, 0xf8, 0xd8, 0xe7, 0x00, 0xbf, 0xd4, 0x58, 0x01, 0x00, + 0x14, 0x58, 0x01, 0x00, 0x50, 0x32, 0x06, 0x00, 0x8c, 0x7e, 0x08, 0x00, + 0x68, 0x8a, 0x01, 0x00, 0x24, 0x9d, 0x08, 0x00, 0x06, 0x48, 0x07, 0x49, + 0x01, 0x60, 0x07, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x08, 0x49, + 0x01, 0x60, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0x6c, 0xa7, 0x08, 0x00, 0x89, 0x09, 0x03, 0x00, 0xc0, 0xb3, 0x08, 0x00, + 0x91, 0x08, 0x03, 0x00, 0xcc, 0xb3, 0x08, 0x00, 0x61, 0x0a, 0x03, 0x00, + 0xe4, 0xa2, 0x08, 0x00, 0xc5, 0x0b, 0x03, 0x00, 0x45, 0xf2, 0x5d, 0x2c, + 0xc1, 0xf2, 0x05, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x80, 0xb5, 0x00, 0xf0, + 0x7b, 0xfb, 0x04, 0x48, 0x5a, 0x21, 0xf2, 0xf7, 0x53, 0xfb, 0x03, 0x48, + 0x00, 0x21, 0x01, 0x60, 0x80, 0xbd, 0x00, 0xbf, 0x8c, 0xe5, 0x05, 0x00, + 0xe8, 0xe5, 0x05, 0x00, 0xbc, 0xb5, 0xc1, 0x78, 0x0f, 0x29, 0x18, 0xd1, + 0x00, 0x21, 0x04, 0x78, 0x45, 0x78, 0x8d, 0xf8, 0x07, 0x10, 0x0d, 0xf1, + 0x07, 0x01, 0x00, 0xf0, 0x13, 0xf8, 0x02, 0x46, 0x44, 0xea, 0x05, 0x20, + 0x81, 0xb2, 0x03, 0x20, 0xf5, 0xf7, 0xfe, 0xff, 0x30, 0xb1, 0x9d, 0xf8, + 0x07, 0x10, 0xc1, 0x71, 0x0f, 0x21, 0x81, 0x71, 0xf5, 0xf7, 0xcc, 0xff, + 0xbc, 0xbd, 0x00, 0xf0, 0x55, 0xfb, 0xbc, 0xbd, 0x2d, 0xe9, 0xf0, 0x4f, + 0x9b, 0xb0, 0xdf, 0xf8, 0xb4, 0x93, 0x05, 0x46, 0x8a, 0x46, 0xd9, 0xf8, + 0x00, 0x00, 0x1a, 0x90, 0x00, 0x20, 0x2e, 0x7a, 0x08, 0x70, 0x28, 0x46, + 0x00, 0xf0, 0xe8, 0xf9, 0x00, 0xb3, 0xdf, 0xf8, 0xa0, 0xb3, 0xdf, 0xf8, + 0x98, 0x03, 0xdb, 0xf8, 0x00, 0x10, 0x90, 0xf8, 0x1e, 0x01, 0x49, 0x78, + 0x81, 0x42, 0x80, 0xf0, 0xaa, 0x80, 0x95, 0xf8, 0x21, 0x00, 0x01, 0x38, + 0x03, 0x28, 0x0f, 0xd8, 0x80, 0x24, 0x05, 0x96, 0xdf, 0xe8, 0x00, 0xf0, + 0x70, 0x02, 0x0e, 0x19, 0x95, 0xf8, 0x22, 0x00, 0x03, 0x28, 0x20, 0xd0, + 0x02, 0x28, 0x25, 0xd0, 0x01, 0x28, 0x01, 0xd1, 0x02, 0x20, 0x22, 0xe0, + 0x12, 0x24, 0x93, 0xe0, 0x08, 0xa8, 0x05, 0xf1, 0x22, 0x02, 0x10, 0x21, + 0x10, 0x23, 0x08, 0x30, 0xf0, 0xf7, 0x5a, 0xf9, 0x4f, 0xf4, 0x80, 0x74, + 0x56, 0xe0, 0x95, 0xf8, 0x22, 0x00, 0x05, 0xf1, 0x23, 0x02, 0x06, 0x21, + 0x06, 0x23, 0x8d, 0xf8, 0x28, 0x00, 0x08, 0xa8, 0x09, 0x30, 0xf0, 0xf7, + 0x4b, 0xf9, 0x01, 0x24, 0x48, 0xe0, 0x10, 0x23, 0x00, 0x24, 0x0d, 0xf1, + 0x20, 0x08, 0x8d, 0xf8, 0x28, 0x30, 0x14, 0xe0, 0x04, 0x20, 0x0d, 0xf1, + 0x20, 0x08, 0xc6, 0x4a, 0x8d, 0xf8, 0x28, 0x00, 0x10, 0x21, 0x10, 0x23, + 0x08, 0xf1, 0x0a, 0x00, 0xf0, 0xf7, 0x36, 0xf9, 0x08, 0xf1, 0x1a, 0x00, + 0x10, 0x21, 0xff, 0x22, 0x00, 0xf0, 0xf4, 0xfa, 0x9d, 0xf8, 0x28, 0x30, + 0x0c, 0x24, 0x08, 0xf1, 0x0a, 0x06, 0xc4, 0xf1, 0x10, 0x01, 0x05, 0xf1, + 0x23, 0x02, 0x30, 0x19, 0xf0, 0xf7, 0x24, 0xf9, 0x08, 0xa8, 0x9d, 0xf8, + 0x28, 0x10, 0xff, 0x22, 0x00, 0xf1, 0x1a, 0x07, 0x38, 0x19, 0x00, 0xf0, + 0xdf, 0xfa, 0x98, 0xf8, 0x09, 0x00, 0xb3, 0x4a, 0x40, 0xf0, 0x01, 0x01, + 0x88, 0xf8, 0x09, 0x10, 0x00, 0x21, 0x33, 0x78, 0x3c, 0x78, 0x23, 0x40, + 0x14, 0x78, 0xa3, 0x42, 0x06, 0xd1, 0x01, 0x31, 0x01, 0x36, 0x01, 0x37, + 0x01, 0x32, 0x0c, 0x29, 0xf3, 0xd1, 0x03, 0xe0, 0x00, 0xf0, 0xfe, 0x00, + 0x88, 0xf8, 0x09, 0x00, 0x05, 0x9e, 0x04, 0x24, 0xa7, 0x48, 0x00, 0x68, + 0x80, 0x47, 0xff, 0x28, 0x2b, 0xd0, 0x07, 0x46, 0xa5, 0x48, 0x01, 0x68, + 0x06, 0x20, 0x88, 0x47, 0x88, 0xb3, 0x95, 0xf8, 0x21, 0x10, 0xdf, 0xf8, + 0x8c, 0xc2, 0x04, 0x94, 0x01, 0x23, 0x02, 0x90, 0x41, 0x71, 0x29, 0x79, + 0x41, 0x70, 0x69, 0x79, 0x81, 0x70, 0xa9, 0x79, 0xc1, 0x70, 0xe9, 0x79, + 0x07, 0x70, 0xdb, 0xf8, 0x00, 0x20, 0x01, 0x71, 0x51, 0x78, 0x02, 0xeb, + 0x81, 0x01, 0x48, 0x60, 0xdb, 0xf8, 0x00, 0x20, 0x51, 0x78, 0x01, 0x31, + 0x51, 0x70, 0xdc, 0xf8, 0x00, 0x40, 0xe1, 0x07, 0x16, 0xd1, 0x01, 0x21, + 0x4f, 0xf0, 0x00, 0x08, 0x01, 0x91, 0x01, 0x21, 0x23, 0xe0, 0x07, 0x24, + 0xd9, 0xf8, 0x00, 0x00, 0x1a, 0x99, 0x40, 0x1a, 0x02, 0xbf, 0x20, 0x46, + 0x1b, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0xf5, 0xf7, 0x01, 0xff, 0x91, 0x48, + 0x01, 0x68, 0x38, 0x46, 0x88, 0x47, 0xee, 0xe7, 0x4f, 0xf0, 0x00, 0x08, + 0x01, 0x22, 0x1e, 0x2a, 0x1b, 0xd0, 0x08, 0xf1, 0x01, 0x08, 0x01, 0x32, + 0x03, 0xfa, 0x08, 0xf1, 0x0c, 0x42, 0xf6, 0xd1, 0xa8, 0xf1, 0x01, 0x02, + 0x00, 0x23, 0x1d, 0x2a, 0x38, 0xbf, 0x01, 0x23, 0x01, 0x93, 0x02, 0x78, + 0x7f, 0x48, 0x08, 0xeb, 0x48, 0x03, 0xc2, 0x54, 0x03, 0x44, 0x44, 0xea, + 0x01, 0x00, 0x5e, 0x70, 0xcc, 0xf8, 0x00, 0x00, 0x68, 0x7a, 0x98, 0x70, + 0x08, 0xe0, 0x00, 0x21, 0xb8, 0xf1, 0x1d, 0x0f, 0x4f, 0xf0, 0x1e, 0x08, + 0x38, 0xbf, 0x01, 0x21, 0x02, 0x78, 0x01, 0x91, 0x75, 0x48, 0x8a, 0xf8, + 0x00, 0x20, 0x75, 0x49, 0x00, 0x22, 0xcd, 0xf8, 0x0c, 0xa0, 0x03, 0x68, + 0x38, 0x46, 0x98, 0x47, 0x04, 0x99, 0x07, 0x97, 0x80, 0x29, 0x37, 0xd1, + 0x95, 0xf8, 0x22, 0xa0, 0xba, 0xf1, 0x00, 0x0f, 0x41, 0xd0, 0x08, 0xa8, + 0x4f, 0xf0, 0x00, 0x09, 0x80, 0x27, 0x0c, 0x30, 0x06, 0x90, 0x23, 0x20, + 0x41, 0x1c, 0x00, 0xf1, 0x03, 0x0b, 0xc9, 0xb2, 0x55, 0xfa, 0x8b, 0xf2, + 0x69, 0x5c, 0x8d, 0xf8, 0x28, 0x10, 0x81, 0x1c, 0xc0, 0xb2, 0x28, 0x5c, + 0xc9, 0xb2, 0x69, 0x5c, 0x02, 0x38, 0x8d, 0xf8, 0x2b, 0x00, 0xc3, 0xb2, + 0x00, 0x20, 0x8d, 0xf8, 0x29, 0x10, 0x1d, 0x21, 0x8d, 0xf8, 0x2a, 0x00, + 0x06, 0x98, 0xf0, 0xf7, 0x5f, 0xf8, 0x5d, 0x48, 0x9d, 0xf8, 0x2b, 0x60, + 0x80, 0x21, 0x00, 0x22, 0x08, 0xab, 0x04, 0x68, 0x07, 0x98, 0xa0, 0x47, + 0x70, 0xb9, 0x09, 0xf1, 0x01, 0x09, 0x06, 0xeb, 0x0b, 0x00, 0xd1, 0x45, + 0xd4, 0xd1, 0x0e, 0xe0, 0x54, 0x48, 0x08, 0xab, 0x00, 0x22, 0x04, 0x68, + 0x38, 0x46, 0xa0, 0x47, 0x38, 0xb1, 0x04, 0x9f, 0xdf, 0xf8, 0x18, 0x91, + 0xdd, 0xf8, 0x0c, 0xa0, 0xdf, 0xf8, 0x18, 0xb1, 0x48, 0xe0, 0x05, 0x98, + 0x10, 0xf0, 0x05, 0x0f, 0x21, 0xd0, 0x08, 0xac, 0x48, 0x21, 0x20, 0x46, + 0x00, 0xf0, 0x00, 0xfa, 0x28, 0x7c, 0x05, 0xf1, 0x0a, 0x02, 0x06, 0x21, + 0x06, 0x23, 0x8d, 0xf8, 0x28, 0x00, 0x04, 0xf1, 0x09, 0x00, 0xf0, 0xf7, + 0x2b, 0xf8, 0x43, 0x48, 0x01, 0x21, 0x00, 0x22, 0x23, 0x46, 0x06, 0x68, + 0x07, 0x98, 0xb0, 0x47, 0x04, 0x99, 0xdf, 0xf8, 0xd4, 0x90, 0xdd, 0xf8, + 0x0c, 0xa0, 0xdf, 0xf8, 0xd4, 0xb0, 0x41, 0xf0, 0x01, 0x07, 0x18, 0xbb, + 0x06, 0xe0, 0x04, 0x9f, 0xdf, 0xf8, 0xbc, 0x90, 0xdd, 0xf8, 0x0c, 0xa0, + 0xdf, 0xf8, 0xbc, 0xb0, 0x05, 0x98, 0x10, 0xf0, 0x0a, 0x0f, 0x4a, 0xd0, + 0x08, 0xac, 0x48, 0x21, 0x20, 0x46, 0x00, 0xf0, 0xd3, 0xf9, 0x04, 0xf1, + 0x08, 0x00, 0x05, 0xf1, 0x11, 0x02, 0x10, 0x21, 0x10, 0x23, 0xf0, 0xf7, + 0x01, 0xf8, 0x2e, 0x48, 0x4f, 0xf4, 0x80, 0x71, 0x00, 0x22, 0x23, 0x46, + 0x05, 0x68, 0x07, 0x98, 0xa8, 0x47, 0x47, 0xf4, 0x80, 0x77, 0x90, 0xb3, + 0x29, 0x48, 0x07, 0x9e, 0x39, 0x46, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, + 0x05, 0x68, 0x02, 0x20, 0x00, 0x90, 0x30, 0x46, 0xa8, 0x47, 0x25, 0x48, + 0x8a, 0xf8, 0x00, 0x40, 0x01, 0x68, 0x30, 0x46, 0x88, 0x47, 0x02, 0x98, + 0xf5, 0xf7, 0x50, 0xfe, 0xdb, 0xf8, 0x00, 0x00, 0x41, 0x78, 0x01, 0x39, + 0x41, 0x70, 0xdb, 0xf8, 0x00, 0x00, 0x41, 0x78, 0x00, 0xeb, 0x81, 0x00, + 0x44, 0x60, 0x01, 0x98, 0x00, 0x28, 0x3f, 0xf4, 0x04, 0xaf, 0xad, 0x49, + 0x08, 0xeb, 0x48, 0x00, 0xaa, 0x4a, 0x0c, 0x54, 0x08, 0x44, 0x11, 0x68, + 0x84, 0x70, 0x44, 0x70, 0x01, 0x20, 0x00, 0xfa, 0x08, 0xf0, 0x21, 0xea, + 0x00, 0x00, 0x10, 0x60, 0xf3, 0xe6, 0x10, 0x48, 0x39, 0x46, 0x00, 0x22, + 0x00, 0x23, 0x00, 0x24, 0x05, 0x68, 0x02, 0x20, 0x00, 0x90, 0x07, 0x98, + 0xa8, 0x47, 0xe9, 0xe6, 0x38, 0xec, 0x01, 0x00, 0xe8, 0x65, 0x08, 0x00, + 0xac, 0x4c, 0x01, 0x00, 0xf8, 0x31, 0x0a, 0x10, 0x00, 0xbf, 0x08, 0x00, + 0xd4, 0x9b, 0x08, 0x00, 0xe8, 0xe5, 0x05, 0x00, 0x8c, 0xe5, 0x05, 0x00, + 0x08, 0xbf, 0x08, 0x00, 0x25, 0x11, 0x03, 0x00, 0x08, 0x9c, 0x08, 0x00, + 0x0c, 0xbf, 0x08, 0x00, 0x04, 0xbf, 0x08, 0x00, 0xf8, 0xb5, 0x06, 0x7a, + 0xbe, 0xb1, 0xc4, 0x79, 0x45, 0x7a, 0x90, 0xf8, 0x21, 0x70, 0x16, 0xf0, + 0x0a, 0x0f, 0x05, 0xd0, 0x09, 0x49, 0x11, 0x30, 0x10, 0x22, 0x00, 0xf0, + 0x5f, 0xf9, 0x50, 0xb1, 0x30, 0x07, 0x02, 0xd0, 0xf8, 0x1e, 0x02, 0x28, + 0x05, 0xd3, 0xe8, 0x07, 0x18, 0xbf, 0x00, 0x2c, 0x01, 0xd1, 0x01, 0x20, + 0xf8, 0xbd, 0x00, 0x20, 0xf8, 0xbd, 0x00, 0xbf, 0x9a, 0xad, 0x09, 0x10, + 0x2d, 0xe9, 0xfe, 0x43, 0x07, 0x46, 0x1e, 0x48, 0xad, 0xf8, 0x0a, 0x10, + 0x92, 0xf8, 0x02, 0x90, 0x98, 0x46, 0x14, 0x46, 0x01, 0x68, 0x38, 0x46, + 0x88, 0x47, 0x05, 0x46, 0x38, 0x46, 0x00, 0xf0, 0x31, 0xf8, 0x40, 0xb3, + 0x3d, 0xb3, 0x06, 0x46, 0x0d, 0xf1, 0x0a, 0x03, 0x28, 0x46, 0x22, 0x46, + 0x31, 0x46, 0x00, 0xf0, 0x41, 0xf8, 0xe0, 0xb1, 0x80, 0x48, 0x01, 0x68, + 0x20, 0x46, 0x88, 0x47, 0x7f, 0x28, 0x18, 0xd0, 0x0a, 0x98, 0xbd, 0xf8, + 0x0a, 0x10, 0x22, 0x46, 0x43, 0x46, 0x00, 0x90, 0x38, 0x46, 0x00, 0xf0, + 0x29, 0xf9, 0x70, 0xb1, 0x05, 0x46, 0x59, 0x48, 0x00, 0x68, 0x00, 0x78, + 0x01, 0x28, 0x09, 0xd1, 0x30, 0x46, 0x21, 0x46, 0x00, 0xf0, 0x57, 0xf8, + 0x20, 0xb9, 0x84, 0xf8, 0x02, 0x90, 0x01, 0x25, 0x00, 0xe0, 0x00, 0x25, + 0x28, 0x46, 0xbd, 0xe8, 0xfe, 0x83, 0x00, 0xbf, 0xb4, 0xca, 0x08, 0x00, + 0xb0, 0xb5, 0x01, 0x46, 0x5f, 0x48, 0x02, 0x68, 0x92, 0xb1, 0x5f, 0x48, + 0x00, 0x23, 0x00, 0x25, 0x1e, 0x2b, 0x0d, 0xd0, 0xd4, 0x07, 0x02, 0xd0, + 0x04, 0x78, 0x8c, 0x42, 0x09, 0xd0, 0x54, 0x08, 0xb5, 0xeb, 0x52, 0x0f, + 0x00, 0xf1, 0x03, 0x00, 0x03, 0xf1, 0x01, 0x03, 0x22, 0x46, 0xef, 0xd1, + 0x00, 0x20, 0xb0, 0xbd, 0xb0, 0xb5, 0x49, 0x78, 0x59, 0xb3, 0x12, 0x79, + 0x1c, 0x46, 0x52, 0x07, 0x0e, 0xd4, 0x8a, 0x06, 0x19, 0xd4, 0xca, 0x07, + 0x1c, 0xbf, 0x25, 0x88, 0x5f, 0xea, 0xc5, 0x72, 0x14, 0xd1, 0x89, 0x07, + 0x44, 0xbf, 0x25, 0x88, 0x5f, 0xea, 0xc5, 0x51, 0x13, 0xd5, 0x0d, 0xe0, + 0xca, 0x06, 0x12, 0xd4, 0x48, 0x07, 0x02, 0xd5, 0x20, 0x88, 0xc0, 0x07, + 0x11, 0xd1, 0x08, 0x07, 0x09, 0xd5, 0x20, 0x88, 0xc0, 0x05, 0x06, 0xd5, + 0x0b, 0xe0, 0x25, 0x88, 0x40, 0x79, 0x00, 0xf0, 0x29, 0xf8, 0x28, 0x42, + 0x05, 0xd1, 0x00, 0x20, 0xb0, 0xbd, 0x40, 0x79, 0x00, 0xf0, 0x22, 0xf8, + 0x20, 0x80, 0x01, 0x20, 0xb0, 0xbd, 0x42, 0x78, 0xb2, 0xb1, 0x82, 0x78, + 0xd2, 0x07, 0x03, 0xd0, 0x8a, 0x78, 0x42, 0xf0, 0x40, 0x02, 0x8a, 0x70, + 0x09, 0x79, 0x4a, 0x07, 0x05, 0xd4, 0x80, 0x78, 0xc9, 0x06, 0x07, 0xd4, + 0x40, 0x07, 0x03, 0xd5, 0x06, 0xe0, 0x80, 0x78, 0x00, 0x07, 0x03, 0xd4, + 0x00, 0x20, 0x70, 0x47, 0x80, 0x07, 0xfb, 0xd5, 0x01, 0x20, 0x70, 0x47, + 0x00, 0x79, 0xc0, 0xf3, 0x80, 0x00, 0x70, 0x47, 0x41, 0x1e, 0x03, 0x29, + 0x06, 0xd8, 0x80, 0x20, 0xdf, 0xe8, 0x01, 0xf0, 0x05, 0x02, 0x06, 0x09, + 0x04, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x4f, 0xf4, 0x80, 0x70, + 0x70, 0x47, 0x01, 0x20, 0x70, 0x47, 0x00, 0xbf, 0x10, 0xb5, 0x10, 0x48, + 0x00, 0x68, 0x00, 0x78, 0xb8, 0xb1, 0x20, 0x48, 0x01, 0x68, 0xa1, 0xb1, + 0x1f, 0x48, 0x00, 0x23, 0x42, 0x1c, 0x1e, 0x2b, 0x0f, 0xd0, 0xc8, 0x07, + 0x03, 0xd0, 0x10, 0x78, 0x10, 0xf0, 0x0c, 0x0f, 0x0b, 0xd1, 0x00, 0x20, + 0x4c, 0x08, 0x03, 0x32, 0x01, 0x33, 0xb0, 0xeb, 0x51, 0x0f, 0x21, 0x46, + 0x08, 0xbf, 0x10, 0xbd, 0xed, 0xe7, 0x00, 0x20, 0x10, 0xbd, 0x01, 0x20, + 0x10, 0xbd, 0x00, 0xbf, 0xac, 0x4c, 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x46, + 0x00, 0xf0, 0x74, 0xf8, 0x88, 0xb9, 0xdf, 0xf8, 0x38, 0xc0, 0x0e, 0x4b, + 0x00, 0x25, 0x01, 0x26, 0xdc, 0xf8, 0x00, 0x20, 0x06, 0xfa, 0x05, 0xf7, + 0x3a, 0x42, 0x02, 0xd0, 0x19, 0x78, 0xa1, 0x42, 0x04, 0xd0, 0x01, 0x35, + 0x03, 0x33, 0x1e, 0x2d, 0xf4, 0xd1, 0xf8, 0xbd, 0x00, 0x21, 0x99, 0x70, + 0x59, 0x70, 0x19, 0x70, 0x22, 0xea, 0x07, 0x01, 0xcc, 0xf8, 0x00, 0x10, + 0xf8, 0xbd, 0x00, 0xbf, 0xe8, 0xe5, 0x05, 0x00, 0x8c, 0xe5, 0x05, 0x00, + 0xf8, 0xb5, 0x07, 0x46, 0x09, 0x48, 0x0e, 0x46, 0x1c, 0x46, 0x15, 0x46, + 0x01, 0x68, 0x10, 0x46, 0x88, 0x47, 0x7f, 0x28, 0x04, 0xbf, 0x00, 0x20, + 0xf8, 0xbd, 0x38, 0x46, 0x31, 0x46, 0x2a, 0x46, 0x23, 0x46, 0x01, 0xb0, + 0xbd, 0xe8, 0xf0, 0x40, 0x00, 0xf0, 0x36, 0xb8, 0x60, 0xa2, 0x08, 0x00, + 0x04, 0x48, 0x05, 0x49, 0x01, 0x60, 0x05, 0x48, 0x05, 0x49, 0x01, 0x60, + 0x05, 0x48, 0x06, 0x49, 0x01, 0x60, 0x70, 0x47, 0x60, 0xca, 0x08, 0x00, + 0xe9, 0x12, 0x03, 0x00, 0x24, 0xc3, 0x08, 0x00, 0x95, 0x0c, 0x03, 0x00, + 0x60, 0xbf, 0x08, 0x00, 0x35, 0x13, 0x03, 0x00, 0x4e, 0xf2, 0x55, 0x6c, + 0xc1, 0xf2, 0x05, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4f, 0xf2, 0x49, 0x0c, + 0xc1, 0xf2, 0x05, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4b, 0xf2, 0xc9, 0x4c, + 0xc1, 0xf2, 0x12, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4b, 0xf2, 0xc7, 0x4c, + 0xc1, 0xf2, 0x12, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4b, 0xf6, 0x59, 0x0c, + 0xc1, 0xf2, 0x12, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4e, 0xf6, 0xd1, 0x1c, + 0xc1, 0xf2, 0x05, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4e, 0xf6, 0x09, 0x6c, + 0xc1, 0xf2, 0x05, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x3d, 0x28, 0x18, 0xbf, + 0x00, 0xf0, 0x66, 0xb8, 0x01, 0x20, 0x70, 0x47, 0xfe, 0xb5, 0x1d, 0x4e, + 0x1d, 0x4f, 0x30, 0x68, 0x02, 0x90, 0x97, 0xf8, 0x7c, 0x02, 0xc0, 0x07, + 0x06, 0xd0, 0x1b, 0x48, 0x90, 0xf8, 0xc8, 0x01, 0xc0, 0x07, 0x01, 0xd1, + 0x00, 0x25, 0x00, 0xe0, 0x0c, 0x25, 0x18, 0x48, 0x4f, 0xf6, 0x51, 0x41, + 0x2a, 0x46, 0x0b, 0x23, 0x04, 0x68, 0x0a, 0x20, 0xa0, 0x47, 0xd0, 0xb1, + 0x04, 0x46, 0xad, 0xb9, 0x13, 0x48, 0x07, 0xf5, 0x29, 0x71, 0x6f, 0x46, + 0x12, 0x4a, 0x08, 0x23, 0x05, 0x68, 0x38, 0x46, 0xa8, 0x47, 0x11, 0x48, + 0x11, 0x4a, 0x39, 0x46, 0x08, 0x23, 0x05, 0x68, 0x38, 0x46, 0xa8, 0x47, + 0xe0, 0x1d, 0x08, 0x21, 0x3a, 0x46, 0x08, 0x23, 0xef, 0xf7, 0xe6, 0xfd, + 0x20, 0x46, 0xf5, 0xf7, 0x15, 0xfc, 0x30, 0x68, 0x02, 0x99, 0x40, 0x1a, + 0x08, 0xbf, 0xfe, 0xbd, 0xf5, 0xf7, 0x1a, 0xfc, 0x38, 0xec, 0x01, 0x00, + 0xe8, 0x65, 0x08, 0x00, 0x50, 0xec, 0x01, 0x00, 0x2c, 0x9c, 0x08, 0x00, + 0x74, 0xc3, 0x08, 0x00, 0xbf, 0x82, 0x08, 0x10, 0x28, 0xc3, 0x08, 0x00, + 0x8c, 0x53, 0x01, 0x00, 0xc1, 0x78, 0x0b, 0x29, 0x18, 0xbf, 0x00, 0xf0, + 0x19, 0xb8, 0xff, 0xf7, 0xad, 0xbf, 0x00, 0xbf, 0x03, 0x48, 0x04, 0x49, + 0x01, 0x60, 0x04, 0x48, 0x04, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0x84, 0xb4, 0x08, 0x00, 0x89, 0x14, 0x03, 0x00, 0x78, 0xb4, 0x08, 0x00, + 0xe5, 0x13, 0x03, 0x00, 0x4d, 0xf6, 0xfd, 0x3c, 0xc1, 0xf2, 0x05, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4e, 0xf2, 0xb5, 0x1c, 0xc1, 0xf2, 0x05, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x70, 0x47, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x41, + 0x86, 0xb0, 0x0d, 0xf1, 0x04, 0x08, 0x0f, 0x46, 0x04, 0x46, 0x14, 0x21, + 0x1d, 0x46, 0x16, 0x46, 0x40, 0x46, 0xf1, 0xf7, 0x2d, 0xff, 0x7f, 0x48, + 0x00, 0x68, 0x01, 0x90, 0x79, 0x48, 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, + 0x02, 0x90, 0x0d, 0x98, 0x8d, 0xf8, 0x0c, 0x40, 0x00, 0x21, 0x42, 0x46, + 0x14, 0x23, 0x8d, 0xf8, 0x0e, 0x60, 0x8d, 0xf8, 0x0d, 0x70, 0xad, 0xf8, + 0x10, 0x50, 0x8d, 0xf8, 0x14, 0x00, 0x0c, 0x98, 0xad, 0xf8, 0x12, 0x00, + 0x70, 0x48, 0x00, 0x78, 0x8d, 0xf8, 0x0f, 0x00, 0x06, 0x48, 0x04, 0x68, + 0x40, 0xf2, 0x4c, 0x60, 0xa0, 0x47, 0x05, 0x48, 0x12, 0x21, 0x00, 0x78, + 0xef, 0xf7, 0x78, 0xfd, 0x06, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0xbf, + 0x78, 0x9b, 0x08, 0x00, 0x66, 0x34, 0x01, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, + 0x85, 0xb0, 0x07, 0x46, 0x61, 0x48, 0x89, 0x46, 0x98, 0x46, 0x15, 0x46, + 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, 0x04, 0x46, 0x5e, 0x48, 0x01, 0x68, + 0x01, 0x20, 0x88, 0x47, 0x5d, 0x49, 0x06, 0x46, 0x08, 0x78, 0xff, 0x28, + 0x12, 0xd1, 0x5c, 0x48, 0x02, 0x78, 0x0a, 0xb1, 0xff, 0x20, 0x0d, 0xe0, + 0x01, 0x22, 0x02, 0x70, 0x59, 0x48, 0x97, 0xf8, 0x1d, 0x21, 0x04, 0x60, + 0x58, 0x48, 0xc2, 0xeb, 0x02, 0x12, 0x00, 0x68, 0x00, 0xeb, 0x42, 0x10, + 0x40, 0x78, 0x08, 0x70, 0xdd, 0xb3, 0xdf, 0xf8, 0x50, 0xb1, 0x97, 0xf8, + 0x1d, 0x21, 0xdb, 0xf8, 0x00, 0x10, 0xc2, 0xeb, 0x02, 0x12, 0x01, 0xeb, + 0x42, 0x11, 0x49, 0x78, 0x88, 0x42, 0x30, 0xd1, 0x4c, 0x4a, 0xa0, 0x19, + 0x11, 0x68, 0x81, 0x42, 0x05, 0xd3, 0x00, 0x20, 0xa0, 0x21, 0x92, 0x46, + 0xef, 0xf7, 0x18, 0xfd, 0x52, 0x46, 0x5f, 0xea, 0x89, 0x70, 0x59, 0xbf, + 0x08, 0xf1, 0x04, 0x03, 0x07, 0xf5, 0xfe, 0x7a, 0x08, 0xf1, 0x0c, 0x03, + 0x07, 0xf5, 0x03, 0x7a, 0x10, 0x68, 0x68, 0xb3, 0xda, 0xf8, 0x00, 0x10, + 0xe1, 0xb3, 0x97, 0xf8, 0x1d, 0x11, 0xdb, 0xf8, 0x00, 0x00, 0x01, 0x24, + 0xc1, 0xeb, 0x01, 0x11, 0x00, 0xeb, 0x41, 0x10, 0x4f, 0xf6, 0xfc, 0x71, + 0x82, 0x78, 0xba, 0xf8, 0x08, 0x00, 0x0f, 0x30, 0x08, 0x40, 0xcd, 0xe9, + 0x00, 0x09, 0x01, 0x20, 0x0e, 0xe0, 0x02, 0x20, 0x00, 0xe0, 0x03, 0x20, + 0xeb, 0x49, 0x97, 0xf8, 0x1d, 0x21, 0x00, 0x24, 0x09, 0x68, 0xc2, 0xeb, + 0x02, 0x12, 0x01, 0xeb, 0x42, 0x11, 0x8a, 0x78, 0xcd, 0xe9, 0x00, 0x49, + 0x29, 0x46, 0x43, 0x46, 0xff, 0xf7, 0x4c, 0xff, 0x20, 0x46, 0x05, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0x97, 0xf8, 0x1d, 0x11, 0xdb, 0xf8, 0x00, 0x00, + 0x43, 0x46, 0xc1, 0xeb, 0x01, 0x11, 0x00, 0xeb, 0x41, 0x10, 0x29, 0x46, + 0x82, 0x78, 0x00, 0x20, 0xcd, 0xe9, 0x00, 0x09, 0x04, 0x20, 0xff, 0xf7, + 0x37, 0xff, 0x37, 0xe0, 0x34, 0x44, 0x03, 0xf1, 0x0f, 0x0e, 0x4f, 0xf6, + 0xfc, 0x7c, 0x0e, 0xea, 0x0c, 0x01, 0x24, 0x1a, 0x94, 0xfb, 0xf1, 0xf4, + 0xa4, 0xb2, 0xac, 0x42, 0x01, 0xd2, 0x05, 0x20, 0xca, 0xe7, 0x69, 0x43, + 0x2e, 0xf0, 0x03, 0x04, 0x16, 0x46, 0x04, 0x91, 0x01, 0xea, 0x0c, 0x01, + 0x03, 0x94, 0x1c, 0x46, 0xf2, 0xf7, 0x0a, 0xfb, 0x30, 0x68, 0xa1, 0xb2, + 0x2a, 0x46, 0x02, 0x23, 0x00, 0x90, 0x50, 0x46, 0x21, 0xf0, 0xee, 0xf8, + 0x97, 0xf8, 0x1d, 0x11, 0xdb, 0xf8, 0x00, 0x00, 0x43, 0x46, 0xc1, 0xeb, + 0x01, 0x11, 0x00, 0xeb, 0x41, 0x10, 0x29, 0x46, 0x82, 0x78, 0x03, 0x98, + 0x80, 0xb2, 0xcd, 0xe9, 0x00, 0x09, 0x00, 0x20, 0xff, 0xf7, 0x02, 0xff, + 0x30, 0x68, 0x04, 0x99, 0x08, 0x44, 0x30, 0x60, 0x01, 0x24, 0xaf, 0xe7, + 0x94, 0xd4, 0x08, 0x00, 0x98, 0xd4, 0x08, 0x00, 0x41, 0xd3, 0x05, 0x00, + 0x74, 0xe5, 0x05, 0x00, 0xec, 0xe5, 0x05, 0x00, 0xe0, 0x35, 0x01, 0x00, + 0x10, 0xb5, 0x90, 0xf8, 0x50, 0x11, 0xe1, 0xb1, 0x90, 0xf8, 0x51, 0x41, + 0x90, 0xf8, 0x20, 0x31, 0x90, 0xf8, 0x1d, 0x21, 0x11, 0xfb, 0x04, 0xf1, + 0x13, 0xfb, 0x04, 0xf3, 0xc2, 0xeb, 0x02, 0x12, 0x01, 0xeb, 0x41, 0x01, + 0x8b, 0x42, 0x38, 0xbf, 0x19, 0x46, 0xab, 0x4b, 0x1b, 0x68, 0x03, 0xeb, + 0x42, 0x12, 0x01, 0x23, 0x92, 0xf8, 0x21, 0x20, 0x01, 0x2a, 0x08, 0xbf, + 0x03, 0x23, 0x19, 0x44, 0x00, 0xe0, 0x00, 0x21, 0xb0, 0xf8, 0x52, 0x31, + 0xca, 0xb2, 0x02, 0x21, 0xbd, 0xe8, 0x10, 0x40, 0xff, 0xf7, 0x02, 0xbf, + 0xb0, 0xb5, 0x03, 0x46, 0x44, 0x6b, 0x00, 0x20, 0x10, 0x60, 0x1d, 0x6b, + 0x0d, 0xb3, 0x58, 0x6b, 0x70, 0xb1, 0x90, 0xf8, 0x29, 0x50, 0xed, 0x07, + 0x0a, 0xd0, 0x9a, 0x4d, 0x93, 0xf8, 0x1d, 0x31, 0x2d, 0x68, 0xc3, 0xeb, + 0x03, 0x13, 0x05, 0xeb, 0x43, 0x13, 0x93, 0xf8, 0x21, 0x30, 0x0b, 0xb1, + 0x00, 0x20, 0xb0, 0xbd, 0xa3, 0x69, 0x33, 0xb1, 0x93, 0xf8, 0x2f, 0x40, + 0x8c, 0x42, 0x06, 0xd0, 0x53, 0xf8, 0x04, 0x3c, 0xf7, 0xe7, 0x00, 0x69, + 0x01, 0xf0, 0x80, 0xfb, 0x00, 0xe0, 0x13, 0x60, 0x01, 0x20, 0xb0, 0xbd, + 0x2d, 0xe9, 0xf0, 0x4f, 0x85, 0xb0, 0x82, 0x46, 0x90, 0xf8, 0x28, 0x00, + 0x00, 0x28, 0x40, 0xf0, 0xfa, 0x80, 0xdf, 0xf8, 0x1c, 0x92, 0x9a, 0xf8, + 0x1d, 0x01, 0xd9, 0xf8, 0x00, 0x10, 0xc0, 0xeb, 0x00, 0x12, 0x01, 0xeb, + 0x42, 0x10, 0xd0, 0xf8, 0xa0, 0x30, 0x5b, 0x7f, 0x23, 0xb1, 0x00, 0xf1, + 0x18, 0x06, 0x0a, 0xf5, 0x9b, 0x73, 0x03, 0xe0, 0x00, 0xf1, 0x14, 0x06, + 0x0a, 0xf5, 0x9a, 0x73, 0x9a, 0xf8, 0x46, 0x71, 0xb3, 0xf8, 0x00, 0x80, + 0x57, 0xb3, 0x03, 0x89, 0x40, 0xf2, 0xe2, 0x44, 0xc5, 0x68, 0x4f, 0xf0, + 0x02, 0x0b, 0x5c, 0x43, 0x65, 0x1b, 0xfb, 0x2d, 0x38, 0xbf, 0x4f, 0xf0, + 0x03, 0x0b, 0x90, 0xf8, 0x21, 0x50, 0x36, 0x68, 0x01, 0x2d, 0x06, 0xd1, + 0x34, 0x44, 0x01, 0x3c, 0xb4, 0xfb, 0xf6, 0xf4, 0x5c, 0x44, 0x04, 0xf1, + 0x01, 0x0b, 0x52, 0x01, 0x89, 0x5c, 0x01, 0xf0, 0xfe, 0x01, 0x02, 0x29, + 0x0e, 0xd1, 0x9a, 0xf8, 0x20, 0x11, 0x90, 0xf8, 0xe0, 0x20, 0x90, 0xf8, + 0xe1, 0x00, 0xb1, 0xfb, 0xf7, 0xf1, 0x89, 0x1a, 0x01, 0x22, 0x11, 0xfb, + 0x00, 0x27, 0x29, 0xe0, 0x00, 0x24, 0x32, 0xe0, 0x00, 0x20, 0xcd, 0xe9, + 0x03, 0x00, 0xda, 0xf8, 0x34, 0x00, 0x9a, 0xf8, 0x47, 0x71, 0xb0, 0xb1, + 0x50, 0xf8, 0x04, 0x2f, 0x03, 0xa9, 0x00, 0xf0, 0xc9, 0xf8, 0x00, 0xf0, + 0x05, 0x00, 0x05, 0x28, 0x0d, 0xd1, 0x9d, 0xf8, 0x13, 0x00, 0x01, 0x38, + 0x01, 0x28, 0x08, 0xd8, 0x9d, 0xf8, 0x11, 0x00, 0x02, 0x28, 0x04, 0xd1, + 0x9d, 0xf8, 0x10, 0x00, 0x06, 0x28, 0x08, 0xbf, 0x0c, 0x27, 0x9a, 0xf8, + 0x1d, 0x11, 0xd9, 0xf8, 0x00, 0x00, 0xc1, 0xeb, 0x01, 0x11, 0x00, 0xeb, + 0x41, 0x10, 0x03, 0x89, 0x07, 0xfb, 0x03, 0xf0, 0x40, 0xf2, 0xe2, 0x41, + 0x00, 0xfb, 0x01, 0x60, 0x01, 0x38, 0xb0, 0xfb, 0xf6, 0xf0, 0x0b, 0xeb, + 0x00, 0x04, 0x04, 0x21, 0x9a, 0xf8, 0x44, 0x00, 0xdf, 0xf8, 0x20, 0x91, + 0xe6, 0xb2, 0x48, 0x4a, 0x01, 0xeb, 0x48, 0x01, 0x33, 0x46, 0xcd, 0xe9, + 0x00, 0x10, 0x48, 0x46, 0x48, 0x21, 0xf2, 0xf7, 0xd5, 0xfd, 0xa4, 0x48, + 0x00, 0xf5, 0x96, 0x7b, 0x90, 0xf8, 0x2c, 0x01, 0x80, 0x07, 0x05, 0xd5, + 0x40, 0x48, 0x01, 0x21, 0x4a, 0x46, 0x03, 0x68, 0x02, 0x20, 0x98, 0x47, + 0x50, 0x46, 0x01, 0x21, 0x32, 0x46, 0x43, 0x46, 0xff, 0xf7, 0x30, 0xfe, + 0x02, 0x94, 0x58, 0xb3, 0x20, 0x06, 0x53, 0xd0, 0x0a, 0xf1, 0x18, 0x05, + 0x0a, 0xf5, 0xfe, 0x77, 0x4f, 0xf0, 0x00, 0x08, 0x38, 0x46, 0x01, 0x21, + 0xf3, 0xf7, 0xd6, 0xfc, 0x00, 0x28, 0x4e, 0xd0, 0x29, 0x46, 0x04, 0x46, + 0xf1, 0xf7, 0x5c, 0xfd, 0x9a, 0xf8, 0x44, 0x00, 0x30, 0x4a, 0x48, 0x21, + 0x23, 0x46, 0x00, 0x90, 0x48, 0x46, 0xf2, 0xf7, 0xa5, 0xfd, 0x9b, 0xf8, + 0x00, 0x00, 0x80, 0x07, 0x05, 0xd5, 0x2a, 0x48, 0x01, 0x21, 0x4a, 0x46, + 0x03, 0x68, 0x02, 0x20, 0x98, 0x47, 0x08, 0xf1, 0x01, 0x08, 0x5f, 0xfa, + 0x88, 0xf0, 0xb0, 0x42, 0xdc, 0xd1, 0x29, 0xe0, 0x20, 0x06, 0x27, 0xd0, + 0x08, 0xf1, 0x04, 0x07, 0x0a, 0xf1, 0x18, 0x05, 0x4f, 0xf0, 0x00, 0x08, + 0x23, 0x48, 0x01, 0x68, 0x38, 0x46, 0x88, 0x47, 0x18, 0xb3, 0x29, 0x46, + 0x04, 0x46, 0xf1, 0xf7, 0x31, 0xfd, 0x9a, 0xf8, 0x44, 0x00, 0x1b, 0x4a, + 0x48, 0x21, 0x23, 0x46, 0x00, 0x90, 0x48, 0x46, 0xf2, 0xf7, 0x7a, 0xfd, + 0x9b, 0xf8, 0x00, 0x00, 0x80, 0x07, 0x05, 0xd5, 0x14, 0x48, 0x01, 0x21, + 0x4a, 0x46, 0x03, 0x68, 0x02, 0x20, 0x98, 0x47, 0x08, 0xf1, 0x01, 0x08, + 0x5f, 0xfa, 0x88, 0xf0, 0xb0, 0x42, 0xdd, 0xd1, 0x02, 0x98, 0x8a, 0xf8, + 0x28, 0x00, 0x01, 0x20, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x0d, 0x48, + 0x01, 0x68, 0x28, 0x46, 0x88, 0x47, 0x9b, 0xf8, 0x00, 0x00, 0x80, 0x07, + 0x05, 0xd5, 0x07, 0x48, 0x09, 0x4a, 0x01, 0x21, 0x03, 0x68, 0x02, 0x20, + 0x98, 0x47, 0x00, 0x20, 0xec, 0xe7, 0x00, 0xbf, 0xe0, 0x35, 0x01, 0x00, + 0x04, 0x86, 0x01, 0x00, 0x34, 0x22, 0x03, 0x00, 0x70, 0x9b, 0x08, 0x00, + 0x7e, 0x22, 0x03, 0x00, 0x2c, 0x9d, 0x08, 0x00, 0xc3, 0x22, 0x03, 0x00, + 0xd4, 0x9b, 0x08, 0x00, 0x70, 0xb5, 0x43, 0x79, 0x0b, 0x71, 0xc3, 0x88, + 0x0b, 0x80, 0x03, 0x89, 0x4b, 0x80, 0x1a, 0xb3, 0x03, 0x79, 0x0b, 0xb3, + 0x00, 0x24, 0x00, 0x20, 0x25, 0x46, 0x14, 0x5d, 0xec, 0xb1, 0x2c, 0x44, + 0x01, 0x34, 0xa4, 0xb2, 0x9c, 0x42, 0x18, 0xd8, 0x15, 0x44, 0x6e, 0x78, + 0x02, 0x2e, 0x07, 0xd0, 0x01, 0x2e, 0x0a, 0xd0, 0x6e, 0xb9, 0xad, 0x78, + 0x40, 0xf0, 0x01, 0x00, 0x4d, 0x71, 0x08, 0xe0, 0xad, 0x78, 0x40, 0xf0, + 0x04, 0x00, 0xcd, 0x71, 0x03, 0xe0, 0xad, 0x78, 0x40, 0xf0, 0x02, 0x00, + 0x8d, 0x71, 0x9c, 0x42, 0xe0, 0xd3, 0x00, 0xe0, 0x00, 0x20, 0xc0, 0xb2, + 0x70, 0xbd, 0x00, 0xbf, 0x2d, 0xe9, 0xf0, 0x43, 0x03, 0x68, 0x93, 0xf8, + 0x20, 0x51, 0x93, 0xf8, 0x46, 0x61, 0x93, 0x7f, 0x93, 0xb1, 0x92, 0xf8, + 0x20, 0x30, 0xdb, 0x07, 0x0e, 0xd0, 0xd3, 0x7f, 0x92, 0xf8, 0x21, 0x40, + 0xa3, 0x42, 0x09, 0xd0, 0x38, 0x4b, 0x1b, 0x68, 0x9b, 0x78, 0x2b, 0xb9, + 0x90, 0xf8, 0x3d, 0x30, 0xb3, 0x42, 0x04, 0xbf, 0x0a, 0x23, 0xd3, 0x70, + 0xdf, 0xf8, 0xd0, 0x90, 0x99, 0xf8, 0x80, 0x31, 0x9b, 0x07, 0x0a, 0xd4, + 0xd7, 0x78, 0x0a, 0x2f, 0x05, 0xd8, 0x01, 0x23, 0x03, 0xfa, 0x07, 0xf4, + 0x14, 0xf4, 0xe7, 0x6f, 0x02, 0xd1, 0x13, 0x7f, 0x1b, 0xb1, 0x01, 0x23, + 0x18, 0x46, 0xbd, 0xe8, 0xf0, 0x83, 0x07, 0x2f, 0x17, 0xd1, 0x07, 0x68, + 0x53, 0x4b, 0x97, 0xf8, 0x1d, 0xe1, 0xd3, 0xf8, 0x00, 0xc0, 0xce, 0xeb, + 0x0e, 0x18, 0x4f, 0xea, 0x48, 0x13, 0x1c, 0xf8, 0x03, 0x30, 0x01, 0x2b, + 0x14, 0xd8, 0x01, 0x23, 0xae, 0x42, 0xe9, 0xd1, 0x0c, 0xeb, 0x48, 0x14, + 0xd4, 0xf8, 0xa0, 0x40, 0x64, 0x7f, 0x5c, 0xb9, 0xe2, 0xe7, 0x7b, 0x1e, + 0x02, 0x2b, 0x01, 0xd2, 0x00, 0x23, 0xdd, 0xe7, 0x45, 0x4b, 0x07, 0x68, + 0xd3, 0xf8, 0x00, 0xc0, 0x97, 0xf8, 0x1d, 0xe1, 0x90, 0xf8, 0x3d, 0x40, + 0xb9, 0xf8, 0x82, 0x31, 0xc0, 0x6d, 0x99, 0xf8, 0x81, 0x61, 0x97, 0xf8, + 0x47, 0x51, 0x00, 0xfb, 0x04, 0x33, 0xce, 0xeb, 0x0e, 0x14, 0x00, 0x2e, + 0x0c, 0xeb, 0x44, 0x14, 0x24, 0x89, 0x08, 0xbf, 0x01, 0x26, 0xae, 0x42, + 0x88, 0xbf, 0x2e, 0x46, 0x75, 0x1e, 0x6c, 0x43, 0x40, 0xf2, 0xe2, 0x45, + 0x04, 0xfb, 0x05, 0x33, 0x7c, 0x6b, 0x24, 0x78, 0x03, 0xf2, 0x53, 0x73, + 0x1c, 0xb9, 0x08, 0x4c, 0xa4, 0x7f, 0x00, 0xfb, 0x04, 0x33, 0x88, 0x68, + 0x11, 0x69, 0x09, 0x1a, 0x00, 0x20, 0x99, 0x42, 0x88, 0xbf, 0x01, 0x20, + 0xbd, 0xe8, 0xf0, 0x83, 0xd4, 0x35, 0x01, 0x00, 0x8c, 0x7e, 0x08, 0x00, + 0x50, 0x32, 0x06, 0x00, 0x10, 0xb5, 0x28, 0x4b, 0x90, 0xf8, 0x1d, 0x41, + 0x1b, 0x68, 0xc4, 0xeb, 0x04, 0x14, 0x03, 0xeb, 0x44, 0x13, 0x93, 0xf8, + 0x21, 0x30, 0x3b, 0xb9, 0x32, 0xb9, 0x43, 0x6b, 0x93, 0xf8, 0x2a, 0x40, + 0x44, 0xf0, 0x04, 0x04, 0x83, 0xf8, 0x2a, 0x40, 0xbd, 0xe8, 0x10, 0x40, + 0x00, 0xf0, 0x22, 0xbb, 0x08, 0xb1, 0x01, 0x68, 0x09, 0xb1, 0x00, 0xf0, + 0x23, 0xbb, 0xf5, 0xf7, 0xaf, 0xb8, 0x02, 0x68, 0x0a, 0xb1, 0x00, 0xf0, + 0x23, 0xbb, 0x70, 0x47, 0x41, 0x6b, 0x09, 0xb1, 0x00, 0xf0, 0x24, 0xbb, + 0x70, 0x47, 0x00, 0xbf, 0xfe, 0xb5, 0x11, 0x4c, 0xa2, 0x42, 0x06, 0xd0, + 0xdd, 0xe9, 0x08, 0x54, 0xcd, 0xe9, 0x00, 0x54, 0x00, 0xf0, 0x1e, 0xfb, + 0xfe, 0xbd, 0x0d, 0x4c, 0x94, 0xf8, 0xc3, 0xc1, 0xbc, 0xf1, 0x00, 0x0f, + 0xf2, 0xd0, 0x0b, 0x4e, 0x90, 0xf8, 0x1d, 0x51, 0x00, 0x27, 0x36, 0x68, + 0x06, 0xf5, 0xec, 0x76, 0xaf, 0x42, 0x01, 0xd0, 0x34, 0x68, 0x2c, 0xb9, + 0x01, 0x37, 0x06, 0xf5, 0xf0, 0x76, 0x67, 0x45, 0xf6, 0xd3, 0xe1, 0xe7, + 0x00, 0x20, 0xfe, 0xbd, 0x18, 0x0d, 0x01, 0x00, 0xe8, 0x65, 0x08, 0x00, + 0xe0, 0x35, 0x01, 0x00, 0xb0, 0xb5, 0x14, 0x46, 0x05, 0x46, 0x00, 0xf0, + 0xff, 0xfa, 0x21, 0x68, 0xc5, 0xf8, 0x30, 0x12, 0x21, 0x68, 0x31, 0xb1, + 0x89, 0x6a, 0x21, 0xb1, 0x0a, 0x7d, 0x06, 0x2a, 0x04, 0xbf, 0x00, 0x22, + 0x0a, 0x75, 0xb0, 0xbd, 0x42, 0xb1, 0xd0, 0xb1, 0xd0, 0xf8, 0x20, 0x22, + 0xba, 0xb1, 0x90, 0xf8, 0x2b, 0x02, 0x02, 0xf8, 0x10, 0x10, 0x12, 0xe0, + 0x40, 0x6b, 0x00, 0x69, 0x40, 0x69, 0x70, 0xb1, 0x02, 0x7e, 0x52, 0x1a, + 0x52, 0xb2, 0x00, 0x2a, 0x04, 0xd4, 0x82, 0x7d, 0x8a, 0x1a, 0x52, 0xb2, + 0x00, 0x2a, 0x02, 0xd5, 0x50, 0xf8, 0x04, 0x0c, 0xf1, 0xe7, 0x09, 0x21, + 0x01, 0x75, 0x00, 0x20, 0x70, 0x47, 0x00, 0xbf, 0xf0, 0xb5, 0x35, 0x4a, + 0x11, 0x78, 0xc1, 0xeb, 0x41, 0x13, 0x34, 0x49, 0x01, 0xeb, 0xc3, 0x03, + 0xb3, 0xf8, 0xdc, 0x40, 0x65, 0x06, 0x03, 0xd4, 0xe5, 0x07, 0x46, 0xd1, + 0x30, 0x24, 0x00, 0xe0, 0x20, 0x24, 0xd0, 0xf8, 0x24, 0x52, 0x00, 0x2d, + 0x3e, 0xd0, 0x00, 0xf5, 0x08, 0x70, 0x93, 0xf8, 0x72, 0x30, 0x0c, 0x27, + 0x86, 0x7a, 0xb3, 0x42, 0x08, 0xbf, 0x0b, 0x27, 0xc3, 0x5d, 0x05, 0xeb, + 0x43, 0x05, 0x6e, 0x78, 0x06, 0xf0, 0x0f, 0x06, 0x34, 0x43, 0x6c, 0x70, + 0x14, 0x78, 0x45, 0x68, 0xc4, 0xeb, 0x44, 0x14, 0x01, 0xeb, 0xc4, 0x04, + 0x94, 0xf8, 0xa0, 0x40, 0x05, 0xf8, 0x13, 0x40, 0x14, 0x78, 0xc4, 0xeb, + 0x44, 0x16, 0x01, 0xeb, 0xc6, 0x06, 0xb6, 0xf8, 0xdc, 0x60, 0x77, 0x06, + 0x0c, 0xd4, 0x06, 0xf0, 0x49, 0x07, 0x09, 0x2f, 0x08, 0xd1, 0x76, 0x05, + 0x06, 0xd4, 0x05, 0xeb, 0x43, 0x04, 0x65, 0x78, 0x45, 0xf0, 0x01, 0x05, + 0x65, 0x70, 0x14, 0x78, 0xc4, 0xeb, 0x44, 0x12, 0x01, 0xeb, 0xc2, 0x01, + 0x91, 0xf8, 0x9c, 0x10, 0x31, 0xb1, 0x40, 0x68, 0x00, 0xeb, 0x43, 0x00, + 0x41, 0x78, 0x41, 0xf0, 0x02, 0x01, 0x41, 0x70, 0xf0, 0xbd, 0x04, 0xf0, + 0x49, 0x05, 0x09, 0x2d, 0x04, 0xd1, 0x93, 0xf8, 0x9d, 0x50, 0x1d, 0xb1, + 0x50, 0x24, 0xb2, 0xe7, 0x40, 0x24, 0xb0, 0xe7, 0xb3, 0xf8, 0xde, 0x50, + 0x35, 0xb1, 0x65, 0xb2, 0x6f, 0xf0, 0x7f, 0x04, 0x00, 0x2d, 0x48, 0xbf, + 0x70, 0x24, 0xa6, 0xe7, 0x60, 0x24, 0xa4, 0xe7, 0x74, 0x87, 0x08, 0x00, + 0x0c, 0x6f, 0x01, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, 0x85, 0xb0, 0x89, 0x46, + 0x00, 0xf5, 0x08, 0x71, 0x83, 0x46, 0x88, 0x46, 0x7b, 0xb1, 0x40, 0x46, + 0x00, 0x2a, 0x4f, 0xf0, 0x20, 0x07, 0x08, 0xc8, 0x08, 0xbf, 0x01, 0x46, + 0x0e, 0x68, 0x5b, 0xb1, 0x98, 0xf8, 0x0d, 0x10, 0x01, 0x24, 0x03, 0x93, + 0x07, 0xeb, 0x41, 0x07, 0x05, 0xe0, 0x00, 0x24, 0x20, 0x27, 0x4f, 0xf0, + 0x00, 0x0a, 0x0e, 0xe0, 0x00, 0x24, 0x00, 0x68, 0x50, 0xb1, 0x03, 0xa9, + 0x04, 0xf1, 0x01, 0x0a, 0x41, 0xf8, 0x24, 0x00, 0x98, 0xf8, 0x0d, 0x00, + 0x02, 0x34, 0x07, 0xeb, 0x40, 0x07, 0x00, 0xe0, 0xa2, 0x46, 0x70, 0x48, + 0x01, 0x68, 0x38, 0x46, 0x88, 0x47, 0x05, 0x46, 0x00, 0x28, 0x00, 0xf0, + 0xd0, 0x80, 0x9b, 0xf8, 0x44, 0x00, 0x01, 0x95, 0x28, 0x70, 0xa0, 0x4d, + 0x9b, 0xf8, 0x1d, 0x11, 0x28, 0x68, 0xc1, 0xeb, 0x01, 0x11, 0x49, 0x01, + 0x40, 0x5c, 0x01, 0x99, 0x48, 0x70, 0x01, 0x99, 0x9b, 0xf8, 0x20, 0x01, + 0xc8, 0x70, 0x64, 0x48, 0x00, 0x68, 0x01, 0x99, 0xc8, 0x60, 0x63, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x01, 0x99, 0x9b, 0xf8, 0x1d, 0x21, 0xba, 0xf1, + 0x00, 0x0f, 0x08, 0x61, 0x29, 0x68, 0xc2, 0xeb, 0x02, 0x12, 0x01, 0x9d, + 0x01, 0xeb, 0x42, 0x11, 0xbb, 0xf8, 0x74, 0x21, 0xd1, 0xf8, 0xb8, 0x10, + 0xec, 0x76, 0xa1, 0xeb, 0x00, 0x00, 0xc0, 0xf3, 0xc0, 0x60, 0x10, 0x44, + 0xa0, 0xf1, 0x01, 0x00, 0xa8, 0x82, 0x78, 0xd0, 0x55, 0x4c, 0x72, 0xb6, + 0x20, 0x68, 0x40, 0x00, 0x01, 0x30, 0x20, 0x60, 0xb8, 0xf8, 0x08, 0x00, + 0x98, 0xf8, 0x0a, 0x10, 0xa9, 0x76, 0x28, 0x83, 0x20, 0x68, 0x40, 0x08, + 0x20, 0x60, 0x98, 0xf8, 0x0b, 0x00, 0x21, 0x68, 0x81, 0xf3, 0x10, 0x88, + 0xa9, 0x7e, 0x01, 0x39, 0xa9, 0x76, 0xcb, 0xb2, 0x9b, 0xf8, 0x20, 0x21, + 0x93, 0x42, 0x04, 0xd3, 0x51, 0x1e, 0x2a, 0x8b, 0xa9, 0x76, 0x01, 0x3a, + 0x2a, 0x83, 0x01, 0x38, 0x98, 0xf8, 0x0d, 0x30, 0xc2, 0xb2, 0x9a, 0x42, + 0x28, 0xbf, 0x58, 0x1e, 0x86, 0xb1, 0xc2, 0xb2, 0x06, 0xeb, 0x42, 0x03, + 0x5b, 0x78, 0x10, 0x2b, 0x0a, 0xd3, 0x98, 0xf8, 0x0b, 0x30, 0x9a, 0x42, + 0x06, 0xd0, 0x16, 0xf8, 0x12, 0x20, 0xeb, 0x7d, 0x9a, 0x1a, 0x52, 0xb2, + 0x00, 0x2a, 0xda, 0xd4, 0xcd, 0xf8, 0x00, 0x90, 0x72, 0xb6, 0x21, 0x68, + 0x49, 0x00, 0x01, 0x31, 0x21, 0x60, 0x98, 0xf8, 0x0b, 0x20, 0x98, 0xf8, + 0x0d, 0x10, 0x01, 0x32, 0xb2, 0xfb, 0xf1, 0xf3, 0x03, 0xfb, 0x11, 0x29, + 0xc2, 0xb2, 0x91, 0x45, 0x2d, 0xd9, 0x50, 0x1c, 0x00, 0x24, 0x00, 0x27, + 0xcd, 0xf8, 0x08, 0x80, 0x01, 0x44, 0x46, 0x00, 0xa1, 0xeb, 0x09, 0x01, + 0x29, 0x77, 0x20, 0x35, 0x0d, 0xf1, 0x0c, 0x0b, 0x15, 0xfa, 0x87, 0xf0, + 0x5b, 0xf8, 0x24, 0x10, 0x01, 0xeb, 0x49, 0x02, 0x02, 0x99, 0x49, 0x7b, + 0xa1, 0xeb, 0x09, 0x08, 0x4f, 0xea, 0x48, 0x01, 0x89, 0xb2, 0x0b, 0x46, + 0xef, 0xf7, 0x98, 0xf8, 0x07, 0xeb, 0x48, 0x07, 0x5b, 0xf8, 0x24, 0x20, + 0x31, 0x46, 0x33, 0x46, 0x15, 0xfa, 0x87, 0xf0, 0xef, 0xf7, 0x8e, 0xf8, + 0x01, 0x34, 0x37, 0x44, 0x54, 0x45, 0xdf, 0xd3, 0x1a, 0xe0, 0x00, 0x27, + 0x21, 0xe0, 0xa0, 0xeb, 0x09, 0x00, 0x05, 0xf1, 0x20, 0x04, 0x00, 0x27, + 0x0d, 0xf1, 0x0c, 0x08, 0x01, 0x30, 0x28, 0x77, 0xc0, 0xb2, 0x00, 0x25, + 0x46, 0x00, 0x58, 0xf8, 0x25, 0x10, 0xe0, 0x19, 0x33, 0x46, 0x01, 0xeb, + 0x49, 0x02, 0x31, 0x46, 0xef, 0xf7, 0x72, 0xf8, 0x01, 0x35, 0x37, 0x44, + 0x55, 0x45, 0xf2, 0xd3, 0x0b, 0x49, 0x08, 0x68, 0x40, 0x08, 0x08, 0x60, + 0x08, 0x68, 0x80, 0xf3, 0x10, 0x88, 0xdd, 0xe9, 0x00, 0x95, 0x07, 0xf1, + 0x20, 0x00, 0xc9, 0xf8, 0x00, 0x50, 0x80, 0xb2, 0x05, 0xb0, 0xbd, 0xe8, + 0xf0, 0x8f, 0x00, 0xbf, 0x4c, 0x9c, 0x08, 0x00, 0x24, 0x20, 0x00, 0x40, + 0xe0, 0xa0, 0x08, 0x00, 0x24, 0x36, 0x01, 0x00, 0xbc, 0xb5, 0x00, 0x68, + 0x0c, 0x46, 0x00, 0x21, 0x01, 0x91, 0x2f, 0x49, 0x90, 0xf8, 0x1d, 0x21, + 0x09, 0x68, 0xc2, 0xeb, 0x02, 0x12, 0x52, 0x01, 0x89, 0x5c, 0x01, 0xf0, + 0xfe, 0x01, 0x02, 0x29, 0x21, 0xd0, 0x21, 0x7d, 0x06, 0x29, 0x1e, 0xd0, + 0x01, 0xa9, 0x01, 0x22, 0x01, 0x23, 0xff, 0xf7, 0xd1, 0xfe, 0x01, 0x9d, + 0xbd, 0xb1, 0x21, 0x7d, 0x00, 0x22, 0x2b, 0x46, 0xa9, 0x70, 0x61, 0x88, + 0xa9, 0x80, 0x21, 0x88, 0xe9, 0x80, 0xa1, 0x7d, 0xa9, 0x75, 0x21, 0x7e, + 0xe9, 0x75, 0xa1, 0x68, 0xa9, 0x60, 0x1e, 0x49, 0x00, 0x90, 0x40, 0xf2, + 0x33, 0x60, 0x0c, 0x68, 0x01, 0x21, 0xa0, 0x47, 0x28, 0x46, 0xf4, 0xf7, + 0x8f, 0xfe, 0xbc, 0xbd, 0x7c, 0xb5, 0x00, 0x68, 0x0c, 0x46, 0x00, 0x21, + 0x01, 0x91, 0x15, 0x49, 0x90, 0xf8, 0x1d, 0x21, 0x09, 0x68, 0xc2, 0xeb, + 0x02, 0x12, 0x52, 0x01, 0x89, 0x5c, 0x01, 0xf0, 0xfe, 0x01, 0x02, 0x29, + 0x1d, 0xd0, 0x1d, 0x46, 0xdb, 0xb1, 0x01, 0xa9, 0x00, 0x22, 0x01, 0x23, + 0xff, 0xf7, 0x9e, 0xfe, 0x01, 0x9e, 0xa6, 0xb1, 0xb5, 0x70, 0x00, 0x22, + 0x33, 0x46, 0xa1, 0x88, 0xb1, 0x80, 0x21, 0x88, 0xf1, 0x80, 0xa1, 0x7e, + 0xb1, 0x75, 0x21, 0x7f, 0xf1, 0x75, 0x06, 0x49, 0x00, 0x90, 0x40, 0xf2, + 0x34, 0x60, 0x0c, 0x68, 0x01, 0x21, 0xa0, 0x47, 0x30, 0x46, 0xf4, 0xf7, + 0x5f, 0xfe, 0x7c, 0xbd, 0xe0, 0x35, 0x01, 0x00, 0xa0, 0xa0, 0x08, 0x00, + 0x2d, 0xe9, 0xf8, 0x43, 0x81, 0x46, 0x90, 0xf8, 0x26, 0x70, 0x17, 0x48, + 0x00, 0x78, 0x28, 0xb9, 0x16, 0x48, 0x17, 0x49, 0x00, 0x88, 0x40, 0xf0, + 0xe6, 0x00, 0x08, 0x60, 0x4d, 0x46, 0x55, 0xf8, 0x18, 0x6f, 0xa8, 0x7c, + 0x40, 0xf0, 0x02, 0x00, 0xa8, 0x74, 0xde, 0xb1, 0xdf, 0xf8, 0x44, 0x80, + 0x96, 0xf8, 0x2f, 0x00, 0x56, 0xf8, 0x04, 0x4c, 0x38, 0x1a, 0x40, 0xb2, + 0x00, 0x28, 0x0e, 0xd4, 0xd9, 0xf8, 0x14, 0x00, 0x32, 0x46, 0x01, 0x6b, + 0x0b, 0x6a, 0x01, 0x21, 0x98, 0x47, 0xd8, 0xf8, 0x00, 0x20, 0x28, 0x46, + 0x31, 0x46, 0x90, 0x47, 0x30, 0x46, 0xf4, 0xf7, 0x2b, 0xfe, 0x00, 0x2c, + 0x26, 0x46, 0xe5, 0xd1, 0xbd, 0xe8, 0xf8, 0x83, 0x6f, 0x34, 0x01, 0x00, + 0x26, 0x21, 0x01, 0x00, 0x04, 0x08, 0x00, 0x40, 0xe8, 0xa0, 0x08, 0x00, + 0x80, 0xb5, 0xca, 0x07, 0x1c, 0xbf, 0x00, 0x22, 0xc0, 0xf8, 0x30, 0x22, + 0x00, 0xf0, 0xa6, 0xf8, 0x80, 0xbd, 0x28, 0xb1, 0x90, 0xf8, 0x7c, 0x21, + 0x02, 0x2a, 0x1c, 0xbf, 0x00, 0x20, 0x70, 0x47, 0x00, 0xf0, 0xa2, 0xb8, + 0x41, 0x1e, 0x12, 0x20, 0x09, 0x29, 0x38, 0xbf, 0x00, 0x20, 0x70, 0x47, + 0x18, 0x48, 0x19, 0x49, 0x01, 0x60, 0x19, 0x48, 0x19, 0x49, 0x01, 0x60, + 0x19, 0x48, 0x1a, 0x49, 0x01, 0x60, 0x1a, 0x48, 0x1a, 0x49, 0x01, 0x60, + 0x1a, 0x48, 0x1b, 0x49, 0x01, 0x60, 0x1b, 0x48, 0x1b, 0x49, 0x01, 0x60, + 0x1b, 0x48, 0x1c, 0x49, 0x01, 0x60, 0x1c, 0x48, 0x1c, 0x49, 0x01, 0x60, + 0x1c, 0x48, 0x1d, 0x49, 0x01, 0x60, 0x1d, 0x48, 0x1d, 0x49, 0x01, 0x60, + 0x1d, 0x48, 0x1e, 0x49, 0x01, 0x60, 0x1e, 0x48, 0x1e, 0x49, 0x01, 0x60, + 0x1e, 0x48, 0x1f, 0x49, 0x01, 0x60, 0x1f, 0x48, 0x1f, 0x49, 0x01, 0x60, + 0x1f, 0x48, 0x20, 0x49, 0x01, 0x60, 0x20, 0x48, 0x20, 0x49, 0x01, 0x60, + 0x70, 0x47, 0x00, 0xbf, 0x00, 0xb7, 0x08, 0x00, 0x4d, 0x1a, 0x03, 0x00, + 0x5c, 0xb5, 0x08, 0x00, 0x9d, 0x17, 0x03, 0x00, 0x2c, 0xb7, 0x08, 0x00, + 0x61, 0x1b, 0x03, 0x00, 0xc0, 0xb4, 0x08, 0x00, 0x91, 0x1b, 0x03, 0x00, + 0xec, 0xb5, 0x08, 0x00, 0x9f, 0x1b, 0x03, 0x00, 0xf8, 0xb8, 0x08, 0x00, + 0xa9, 0x1b, 0x03, 0x00, 0x18, 0xb9, 0x08, 0x00, 0xb5, 0x1b, 0x03, 0x00, + 0x38, 0xb8, 0x08, 0x00, 0x09, 0x1c, 0x03, 0x00, 0x0c, 0xb7, 0x08, 0x00, + 0x2d, 0x1c, 0x03, 0x00, 0x20, 0xb7, 0x08, 0x00, 0x6d, 0x1c, 0x03, 0x00, + 0x1c, 0xb7, 0x08, 0x00, 0x79, 0x1f, 0x03, 0x00, 0x08, 0xb7, 0x08, 0x00, + 0xe1, 0x1f, 0x03, 0x00, 0xd0, 0xb8, 0x08, 0x00, 0x49, 0x20, 0x03, 0x00, + 0x30, 0xb7, 0x08, 0x00, 0xc1, 0x20, 0x03, 0x00, 0x3c, 0xb7, 0x08, 0x00, + 0xd3, 0x20, 0x03, 0x00, 0x98, 0xb3, 0x08, 0x00, 0xe5, 0x20, 0x03, 0x00, + 0x43, 0xf2, 0xe5, 0x0c, 0xc1, 0xf2, 0x06, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4f, 0xf6, 0x71, 0x2c, 0xc1, 0xf2, 0x05, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x41, 0xf6, 0x85, 0x1c, 0xc1, 0xf2, 0x06, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x43, 0xf2, 0x25, 0x1c, 0xc1, 0xf2, 0x06, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x42, 0xf6, 0x5d, 0x1c, 0xc1, 0xf2, 0x06, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x43, 0xf2, 0xa1, 0x3c, 0xc1, 0xf2, 0x06, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x43, 0xf2, 0x01, 0x2c, 0xc1, 0xf2, 0x06, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x43, 0xf6, 0xd9, 0x6c, 0xc1, 0xf2, 0x06, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4c, 0x45, 0x5f, 0x49, 0x53, 0x4f, 0x5f, 0x70, 0x72, 0x65, 0x70, 0x61, + 0x72, 0x65, 0x53, 0x64, 0x75, 0x42, 0x75, 0x66, 0x51, 0x2e, 0x20, 0x42, + 0x75, 0x66, 0x51, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x25, 0x64, + 0x20, 0x6c, 0x65, 0x6e, 0x3a, 0x20, 0x25, 0x64, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, 0x68, 0x63, 0x69, 0x43, + 0x6f, 0x6e, 0x6e, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x3a, 0x20, 0x25, + 0x64, 0x00, 0x4c, 0x45, 0x5f, 0x49, 0x53, 0x4f, 0x5f, 0x70, 0x72, 0x65, + 0x70, 0x61, 0x72, 0x65, 0x53, 0x64, 0x75, 0x42, 0x75, 0x66, 0x51, 0x2e, + 0x20, 0x45, 0x6e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x20, 0x70, 0x46, + 0x4d, 0x42, 0x20, 0x30, 0x78, 0x25, 0x30, 0x38, 0x78, 0x20, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x20, 0x68, 0x63, 0x69, 0x43, 0x6f, 0x6e, 0x6e, + 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x3a, 0x20, 0x25, 0x64, 0x00, 0x4c, + 0x45, 0x5f, 0x49, 0x53, 0x4f, 0x5f, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, + 0x65, 0x53, 0x64, 0x75, 0x42, 0x75, 0x66, 0x51, 0x2e, 0x20, 0x46, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x6d, + 0x65, 0x6d, 0x2e, 0x20, 0x46, 0x72, 0x65, 0x65, 0x69, 0x6e, 0x67, 0x20, + 0x71, 0x75, 0x65, 0x75, 0x65, 0x00, 0x00, 0x00, 0x7c, 0xb5, 0x23, 0x4b, + 0x0c, 0x46, 0x00, 0xeb, 0x40, 0x01, 0x00, 0x25, 0x53, 0xf8, 0x21, 0x10, + 0x82, 0x4b, 0x13, 0xf8, 0x15, 0x60, 0x86, 0x42, 0x10, 0xd0, 0x00, 0x2d, + 0x4f, 0xf0, 0x01, 0x05, 0xf7, 0xd0, 0x00, 0x25, 0x13, 0xf8, 0x15, 0x60, + 0x36, 0xb1, 0x00, 0x2d, 0x4f, 0xf0, 0x01, 0x05, 0xf8, 0xd0, 0x18, 0x48, + 0x02, 0x78, 0x14, 0xe0, 0x03, 0xf8, 0x15, 0x00, 0x64, 0x20, 0xb2, 0xfb, + 0xf0, 0xf6, 0x06, 0xfb, 0x10, 0x26, 0x03, 0xeb, 0x45, 0x02, 0x12, 0xf8, + 0x01, 0x0f, 0x2e, 0xb9, 0x43, 0x1c, 0xd8, 0xb2, 0x08, 0x38, 0x18, 0xbf, + 0x18, 0x46, 0x10, 0x70, 0x0d, 0x4a, 0xc0, 0xb2, 0x12, 0x5c, 0xd1, 0xf8, + 0x00, 0x01, 0x01, 0xa9, 0x0d, 0xf1, 0x07, 0x03, 0xd0, 0xf8, 0xd4, 0x00, + 0x40, 0x7f, 0x00, 0x91, 0xb0, 0xfa, 0x80, 0xf0, 0x41, 0x09, 0x20, 0x46, + 0x09, 0xf0, 0x04, 0xf8, 0x9d, 0xf8, 0x07, 0x00, 0xbd, 0xf8, 0x04, 0x10, + 0x48, 0x43, 0x80, 0xb2, 0x7c, 0xbd, 0x00, 0xbf, 0xe8, 0x72, 0x01, 0x00, + 0x42, 0xd3, 0x05, 0x00, 0xf8, 0xb5, 0x04, 0x46, 0xc0, 0x8d, 0x62, 0x8e, + 0x43, 0x1c, 0x20, 0x68, 0xe3, 0x85, 0xd0, 0xf8, 0x3c, 0x11, 0x49, 0xb1, + 0x91, 0xf8, 0x21, 0x50, 0x35, 0xb1, 0x90, 0xf8, 0x44, 0x00, 0x02, 0x31, + 0x9a, 0xb2, 0xff, 0xf7, 0xa1, 0xff, 0x09, 0xe0, 0x94, 0xf8, 0x74, 0x00, + 0xc0, 0x07, 0x06, 0xd0, 0x47, 0x49, 0x94, 0xf8, 0x75, 0x00, 0x0b, 0x68, + 0x11, 0x46, 0x98, 0x47, 0x02, 0x46, 0x45, 0x48, 0x01, 0x21, 0x00, 0x23, + 0x05, 0x68, 0x20, 0x46, 0xa8, 0x47, 0x00, 0x28, 0x7e, 0xd0, 0x01, 0x88, + 0x0c, 0x29, 0x5e, 0xd3, 0xc1, 0x68, 0x22, 0x7c, 0x0a, 0x70, 0x00, 0x22, + 0xc1, 0x68, 0x4a, 0x70, 0xd0, 0xe9, 0x02, 0x12, 0x09, 0x0a, 0x91, 0x70, + 0xd0, 0xe9, 0x02, 0x12, 0xd1, 0x70, 0x53, 0x22, 0xc1, 0x68, 0x0a, 0x71, + 0x44, 0x22, 0xc1, 0x68, 0x4a, 0x71, 0x55, 0x22, 0xc1, 0x68, 0x8a, 0x71, + 0x41, 0x88, 0xc1, 0xf3, 0x03, 0x11, 0x0a, 0x29, 0x34, 0xbf, 0x30, 0x31, + 0x37, 0x31, 0xc2, 0x68, 0xd1, 0x71, 0x41, 0x88, 0x01, 0xf0, 0x0f, 0x01, + 0x0a, 0x29, 0x34, 0xbf, 0x30, 0x31, 0x37, 0x31, 0xc2, 0x68, 0x11, 0x72, + 0x01, 0x88, 0x0d, 0x29, 0x23, 0xd3, 0x2b, 0x4b, 0x09, 0x21, 0x00, 0x22, + 0xc5, 0x68, 0x86, 0x78, 0x6e, 0x54, 0x27, 0x68, 0x1e, 0x68, 0xc5, 0x68, + 0x97, 0xf8, 0x1d, 0x71, 0x0d, 0x44, 0xc7, 0xeb, 0x07, 0x17, 0x06, 0xeb, + 0x47, 0x16, 0xd6, 0xf8, 0xa0, 0x60, 0x76, 0x7f, 0x00, 0x2e, 0x4f, 0xf0, + 0x53, 0x06, 0x08, 0xbf, 0x4d, 0x26, 0x6e, 0x70, 0xc5, 0x68, 0x0d, 0x44, + 0x03, 0x31, 0xaa, 0x70, 0x89, 0xb2, 0x01, 0x32, 0x05, 0x88, 0x03, 0x3d, + 0xa9, 0x42, 0xdf, 0xdb, 0x00, 0xe0, 0xcd, 0x1e, 0xc1, 0x68, 0x45, 0x22, + 0x4a, 0x55, 0xc1, 0x68, 0x02, 0x88, 0x11, 0x44, 0x4e, 0x22, 0x01, 0xf8, + 0x02, 0x2c, 0xc1, 0x68, 0x02, 0x88, 0x11, 0x44, 0x44, 0x22, 0x01, 0xf8, + 0x01, 0x2c, 0x94, 0xf8, 0x74, 0x10, 0xc9, 0x07, 0x18, 0xd0, 0x22, 0x68, + 0x0e, 0x49, 0x92, 0xf8, 0x1d, 0x21, 0x09, 0x68, 0xc2, 0xeb, 0x02, 0x12, + 0x01, 0xeb, 0x42, 0x11, 0x91, 0xf8, 0x21, 0x10, 0x01, 0x29, 0x0b, 0xd1, + 0x01, 0x88, 0x04, 0x29, 0x08, 0xd3, 0x81, 0x78, 0xc2, 0x68, 0x11, 0x70, + 0xc1, 0x78, 0x51, 0x70, 0x01, 0x79, 0x91, 0x70, 0x41, 0x79, 0xd1, 0x70, + 0xf8, 0xbd, 0x00, 0xbf, 0x04, 0xb7, 0x08, 0x00, 0xd8, 0xb4, 0x08, 0x00, + 0xe0, 0x35, 0x01, 0x00, 0xb0, 0xb5, 0x09, 0x49, 0x00, 0x22, 0x0a, 0x60, + 0x49, 0x68, 0x88, 0x47, 0x04, 0x46, 0x40, 0xb9, 0x06, 0x4d, 0x07, 0x49, + 0x08, 0x20, 0x2a, 0x68, 0x90, 0x47, 0x2a, 0x68, 0x05, 0x49, 0x09, 0x20, + 0x90, 0x47, 0x20, 0x46, 0xb0, 0xbd, 0x00, 0xbf, 0xf4, 0xe5, 0x05, 0x00, + 0xac, 0x9c, 0x08, 0x00, 0x29, 0x25, 0x03, 0x00, 0x9d, 0x25, 0x03, 0x00, + 0x10, 0xb5, 0x1a, 0x4c, 0xd4, 0xf8, 0x30, 0x01, 0x40, 0x06, 0x11, 0xd5, + 0x36, 0x48, 0x41, 0x7d, 0x39, 0xb1, 0x40, 0x21, 0xc4, 0xf8, 0x9c, 0x10, + 0x00, 0x21, 0x21, 0x60, 0x01, 0x68, 0x00, 0x20, 0x17, 0xe0, 0x13, 0x48, + 0x01, 0x88, 0x01, 0x31, 0x01, 0x80, 0x00, 0x20, 0x00, 0xf0, 0x3a, 0xf9, + 0xd4, 0xf8, 0x30, 0x01, 0x40, 0x05, 0x58, 0xbf, 0x10, 0xbd, 0x2b, 0x48, + 0x90, 0xf8, 0x2d, 0x10, 0x51, 0xb1, 0x4f, 0xf4, 0x80, 0x61, 0xc4, 0xf8, + 0x9c, 0x10, 0x00, 0x21, 0x21, 0x64, 0x81, 0x69, 0x01, 0x20, 0xbd, 0xe8, + 0x10, 0x40, 0x09, 0xe1, 0x05, 0x48, 0x01, 0x8c, 0x01, 0x31, 0x01, 0x84, + 0x01, 0x20, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, 0x1d, 0xb9, 0x00, 0xbf, + 0xa4, 0x21, 0x00, 0x40, 0xf4, 0x4d, 0x01, 0x00, 0x10, 0xb5, 0x1b, 0x4c, + 0xd4, 0xf8, 0x30, 0x01, 0x40, 0xb2, 0xb0, 0xf1, 0xff, 0x3f, 0x11, 0xdd, + 0xd4, 0xf8, 0x30, 0x01, 0x00, 0x05, 0x58, 0xbf, 0x10, 0xbd, 0x16, 0x48, + 0x90, 0xf8, 0x2e, 0x10, 0xa9, 0xb1, 0x4f, 0xf4, 0x00, 0x61, 0xc4, 0xf8, + 0x8c, 0x10, 0x00, 0x21, 0x21, 0x64, 0xc1, 0x69, 0x01, 0x20, 0x09, 0xe0, + 0xf5, 0x48, 0x81, 0x7d, 0x91, 0xb1, 0x80, 0x21, 0xc4, 0xf8, 0x8c, 0x10, + 0x00, 0x21, 0x21, 0x60, 0x41, 0x68, 0x00, 0x20, 0xbd, 0xe8, 0x10, 0x40, + 0x14, 0xe0, 0xf3, 0x48, 0x41, 0x8c, 0x01, 0x31, 0x41, 0x84, 0x01, 0x20, + 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, 0x24, 0xb8, 0xee, 0x48, 0x41, 0x88, + 0x01, 0x31, 0x41, 0x80, 0x00, 0x20, 0x00, 0xf0, 0x1d, 0xf8, 0xcf, 0xe7, + 0xb4, 0x21, 0x00, 0x40, 0xe8, 0x0c, 0x01, 0x00, 0x1c, 0xb5, 0x04, 0x46, + 0x6a, 0x48, 0x01, 0x91, 0x01, 0x68, 0x01, 0xa8, 0x88, 0x47, 0xe0, 0x4a, + 0x70, 0x21, 0x01, 0x23, 0x00, 0x2c, 0x08, 0xbf, 0x30, 0x21, 0x8b, 0x50, + 0x65, 0x4b, 0x01, 0x9a, 0xca, 0x50, 0xdc, 0x4a, 0x04, 0xeb, 0x44, 0x01, + 0x02, 0xeb, 0xc1, 0x01, 0x88, 0x75, 0x1c, 0xbd, 0x2d, 0xe9, 0xfe, 0x4f, + 0xd7, 0x49, 0x83, 0x46, 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, 0xc0, 0x04, + 0xa0, 0x46, 0x58, 0xf8, 0x04, 0xaf, 0x98, 0xf8, 0x10, 0x70, 0x00, 0xf0, + 0x91, 0xf8, 0x28, 0xb1, 0x43, 0x48, 0x44, 0x49, 0x00, 0x88, 0x40, 0xf0, + 0xf7, 0x00, 0x08, 0x60, 0x07, 0x20, 0x10, 0x21, 0xcb, 0x4d, 0xbb, 0xf1, + 0x00, 0x0f, 0x04, 0xf1, 0x08, 0x06, 0x08, 0xbf, 0x03, 0x20, 0x81, 0x40, + 0xc5, 0xf8, 0xbc, 0x10, 0x00, 0x01, 0x00, 0x21, 0x29, 0x50, 0xc7, 0x48, + 0x01, 0x68, 0x30, 0x46, 0x88, 0x47, 0x00, 0x28, 0x61, 0xd0, 0xde, 0x49, + 0xc7, 0xeb, 0x07, 0x10, 0xd8, 0xf8, 0x00, 0x30, 0xc2, 0x4f, 0x09, 0x68, + 0x01, 0xeb, 0x40, 0x10, 0x02, 0x89, 0x40, 0xf2, 0xe2, 0x40, 0x50, 0x43, + 0xc1, 0x18, 0xc8, 0xf8, 0x00, 0x10, 0xec, 0x59, 0x64, 0x1a, 0x29, 0xd4, + 0xdf, 0xf8, 0xb8, 0xe0, 0x40, 0xf6, 0xc4, 0x14, 0xa9, 0x46, 0xbc, 0x46, + 0x02, 0x96, 0x02, 0xfb, 0x04, 0x32, 0x4b, 0x42, 0x5e, 0xf8, 0x2b, 0x40, + 0x65, 0x1c, 0xb7, 0x4c, 0x04, 0xeb, 0x4b, 0x14, 0x34, 0xf8, 0x06, 0x7f, + 0x01, 0x94, 0x00, 0x24, 0x16, 0x19, 0x4e, 0xf8, 0x2b, 0x50, 0x1b, 0x1a, + 0x04, 0x44, 0x01, 0x35, 0x01, 0x37, 0xc8, 0xf8, 0x00, 0x60, 0x59, 0xf8, + 0x0c, 0x60, 0x1e, 0x44, 0xb6, 0xf1, 0xff, 0x3f, 0xf0, 0xdc, 0x01, 0x98, + 0x02, 0x9e, 0xa2, 0x44, 0x21, 0x44, 0x4d, 0x46, 0x07, 0x80, 0x67, 0x46, + 0x58, 0x46, 0xff, 0xf7, 0x7d, 0xff, 0x55, 0xf8, 0x07, 0x80, 0x36, 0x68, + 0x4e, 0xb1, 0x17, 0x4c, 0x23, 0x68, 0x30, 0x46, 0x51, 0x46, 0xff, 0x22, + 0x98, 0x47, 0x56, 0xf8, 0x04, 0x6c, 0x00, 0x2e, 0xf6, 0xd1, 0xa0, 0x48, + 0xa3, 0x4e, 0xed, 0x59, 0x41, 0x46, 0x00, 0xeb, 0x4b, 0x14, 0x32, 0x68, + 0x28, 0x46, 0x54, 0xf8, 0x1c, 0x7f, 0x44, 0xe9, 0x02, 0x85, 0x90, 0x47, + 0x87, 0x42, 0x04, 0xd2, 0x32, 0x68, 0x28, 0x46, 0x41, 0x46, 0x90, 0x47, + 0x20, 0x60, 0x00, 0xf0, 0x11, 0xf8, 0x28, 0xb1, 0x03, 0x48, 0x04, 0x49, + 0x00, 0x88, 0x40, 0xf0, 0x07, 0x00, 0x08, 0x60, 0xbd, 0xe8, 0xfe, 0x8f, + 0x26, 0x21, 0x01, 0x00, 0x04, 0x08, 0x00, 0x40, 0x34, 0x4e, 0x01, 0x00, + 0x38, 0xb7, 0x08, 0x00, 0x02, 0x48, 0x00, 0x78, 0xb0, 0xfa, 0x80, 0xf0, + 0x40, 0x09, 0x70, 0x47, 0x6f, 0x34, 0x01, 0x00, 0x1c, 0xb5, 0x04, 0x46, + 0x0a, 0x48, 0x01, 0x91, 0x01, 0x68, 0x01, 0xa8, 0x88, 0x47, 0x80, 0x4a, + 0x60, 0x21, 0x01, 0x23, 0x00, 0x2c, 0x08, 0xbf, 0x20, 0x21, 0x8b, 0x50, + 0x05, 0x4b, 0x01, 0x9a, 0xca, 0x50, 0x7c, 0x4a, 0x04, 0xeb, 0x44, 0x01, + 0x02, 0xeb, 0xc1, 0x01, 0x48, 0x75, 0x1c, 0xbd, 0x1c, 0xb9, 0x08, 0x00, + 0x88, 0x21, 0x00, 0x40, 0x2d, 0xe9, 0xf0, 0x4f, 0x85, 0xb0, 0x83, 0x46, + 0x06, 0x20, 0x10, 0x21, 0x72, 0x4a, 0x73, 0x4f, 0xbb, 0xf1, 0x00, 0x0f, + 0x08, 0xbf, 0x02, 0x20, 0x81, 0x40, 0x0b, 0xeb, 0x4b, 0x05, 0xc2, 0xf8, + 0xbc, 0x10, 0x00, 0x01, 0x00, 0x21, 0x07, 0xeb, 0xc5, 0x06, 0x11, 0x50, + 0x6c, 0x48, 0x06, 0xf1, 0x08, 0x08, 0x34, 0x7d, 0x01, 0x68, 0x40, 0x46, + 0x88, 0x47, 0x00, 0x28, 0x00, 0xf0, 0xc9, 0x80, 0xd8, 0xf8, 0x00, 0x00, + 0x57, 0xf8, 0x35, 0x90, 0xa0, 0xb1, 0x40, 0x69, 0x90, 0xb1, 0x7e, 0x49, + 0x90, 0xf8, 0x1d, 0x01, 0x09, 0x68, 0xc0, 0xeb, 0x00, 0x10, 0x01, 0xeb, + 0x40, 0x10, 0x00, 0x21, 0x00, 0xf0, 0x14, 0xf9, 0x31, 0x68, 0x04, 0x90, + 0x0a, 0x18, 0x71, 0x68, 0x32, 0x60, 0x08, 0x44, 0x70, 0x60, 0x02, 0xe0, + 0x00, 0x20, 0x4a, 0x46, 0x04, 0x90, 0x73, 0x49, 0xc4, 0xeb, 0x04, 0x10, + 0x55, 0x4d, 0x58, 0x4f, 0x09, 0x68, 0x01, 0xeb, 0x40, 0x10, 0x03, 0x89, + 0x40, 0xf2, 0xe2, 0x40, 0x58, 0x43, 0x81, 0x18, 0x31, 0x60, 0xec, 0x59, + 0x64, 0x1a, 0x32, 0xd4, 0x40, 0xf6, 0xc4, 0x14, 0xdf, 0xf8, 0x44, 0xe1, + 0xcd, 0xf8, 0x0c, 0x80, 0xa8, 0x46, 0xbc, 0x46, 0x4f, 0x42, 0x4f, 0xf0, + 0x01, 0x0a, 0x03, 0xfb, 0x04, 0x22, 0x4d, 0x4b, 0x5e, 0xf8, 0x2b, 0x40, + 0x03, 0xeb, 0x4b, 0x13, 0x33, 0xf8, 0x04, 0x5f, 0xcd, 0xe9, 0x01, 0x53, + 0x00, 0x23, 0x04, 0xeb, 0x0a, 0x05, 0x3f, 0x1a, 0x0a, 0xf1, 0x01, 0x0a, + 0x4e, 0xf8, 0x2b, 0x50, 0xd5, 0x18, 0x03, 0x44, 0x35, 0x60, 0x58, 0xf8, + 0x0c, 0x50, 0x3d, 0x44, 0xb5, 0xf1, 0xff, 0x3f, 0xef, 0xdc, 0x01, 0x98, + 0x45, 0x46, 0x02, 0x9a, 0xdd, 0xf8, 0x0c, 0x80, 0x99, 0x44, 0x19, 0x44, + 0x67, 0x46, 0x50, 0x44, 0x01, 0x38, 0x10, 0x80, 0x01, 0xe0, 0x4f, 0xf0, + 0x01, 0x0a, 0x58, 0x46, 0xff, 0xf7, 0x5e, 0xff, 0xe8, 0x59, 0xd8, 0xf8, + 0x00, 0x60, 0x00, 0x2e, 0x03, 0x90, 0x42, 0xd0, 0x35, 0x4c, 0xdf, 0xf8, + 0xdc, 0x80, 0xa9, 0xf1, 0x96, 0x00, 0x4f, 0xea, 0x0a, 0x67, 0x02, 0x90, + 0x70, 0x69, 0x01, 0x6b, 0x99, 0xb3, 0x41, 0x6b, 0x89, 0xb3, 0x91, 0xf8, + 0x29, 0x10, 0xc9, 0x07, 0x2d, 0xd0, 0x31, 0x78, 0xfe, 0x29, 0x1c, 0xd1, + 0xb1, 0x6d, 0x09, 0xb9, 0x02, 0x99, 0xb1, 0x65, 0x04, 0x9a, 0x11, 0x44, + 0xb1, 0x65, 0xb9, 0xeb, 0x01, 0x01, 0x12, 0xd4, 0x90, 0xf8, 0x44, 0x00, + 0x21, 0x68, 0x88, 0x47, 0xb0, 0x6d, 0xb9, 0xeb, 0x00, 0x00, 0x0a, 0xd4, + 0x70, 0x69, 0x21, 0x68, 0x90, 0xf8, 0x44, 0x00, 0x88, 0x47, 0xb0, 0x6d, + 0xa9, 0xeb, 0x00, 0x00, 0xb0, 0xf1, 0xff, 0x3f, 0xf4, 0xdc, 0x1e, 0x48, + 0x01, 0x68, 0x30, 0x46, 0x88, 0x47, 0x47, 0xb1, 0x55, 0x46, 0xd8, 0xf8, + 0x00, 0x20, 0x30, 0x46, 0x00, 0x21, 0x90, 0x47, 0x01, 0x3d, 0x28, 0x06, + 0xf7, 0xd1, 0x56, 0xf8, 0x04, 0x6c, 0x00, 0x2e, 0xc4, 0xd1, 0x0e, 0x48, + 0x10, 0x49, 0xdf, 0xf8, 0x58, 0x80, 0x45, 0x58, 0x10, 0x48, 0x03, 0x9e, + 0xd8, 0xf8, 0x00, 0x20, 0x00, 0xeb, 0x4b, 0x14, 0x28, 0x46, 0x31, 0x46, + 0x54, 0xf8, 0x10, 0x7f, 0x44, 0xe9, 0x02, 0x65, 0x90, 0x47, 0x87, 0x42, + 0x05, 0xd2, 0xd8, 0xf8, 0x00, 0x20, 0x28, 0x46, 0x31, 0x46, 0x90, 0x47, + 0x20, 0x60, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x84, 0x21, 0x00, 0x40, + 0xe8, 0x0c, 0x01, 0x00, 0x28, 0x9d, 0x08, 0x00, 0xa0, 0xfe, 0xff, 0xff, + 0x3c, 0x4e, 0x01, 0x00, 0xf4, 0x4d, 0x01, 0x00, 0xe0, 0xb8, 0x08, 0x00, + 0xd0, 0xb8, 0x08, 0x00, 0xd4, 0xb8, 0x08, 0x00, 0x1c, 0x9d, 0x08, 0x00, + 0x70, 0xb5, 0x06, 0x46, 0x14, 0x46, 0x0d, 0x46, 0x88, 0x07, 0x02, 0xd5, + 0x30, 0x46, 0xfe, 0xf7, 0x8b, 0xfe, 0x0d, 0x48, 0x96, 0xf8, 0x1d, 0x11, + 0x00, 0x68, 0xc1, 0xeb, 0x01, 0x11, 0x00, 0xeb, 0x41, 0x10, 0x90, 0xf8, + 0x21, 0x00, 0x30, 0xb9, 0x70, 0x6b, 0x90, 0xf8, 0x2a, 0x10, 0x41, 0xf0, + 0x04, 0x01, 0x80, 0xf8, 0x2a, 0x10, 0x13, 0x48, 0x29, 0x46, 0x22, 0x46, + 0x83, 0x68, 0x30, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x18, 0x47, 0x00, 0xbf, + 0xe0, 0x35, 0x01, 0x00, 0xb0, 0xb5, 0x08, 0x48, 0x08, 0x49, 0x0b, 0x4b, + 0x0b, 0x4c, 0x0c, 0x4d, 0x01, 0x60, 0x07, 0x48, 0x07, 0x49, 0x01, 0x61, + 0xd0, 0xe9, 0x00, 0x12, 0xc0, 0xe9, 0x00, 0x35, 0xc4, 0xe9, 0x01, 0x12, + 0xb0, 0xbd, 0x00, 0xbf, 0x70, 0xa7, 0x08, 0x00, 0x95, 0x23, 0x03, 0x00, + 0xc0, 0x0c, 0x01, 0x00, 0x6d, 0x34, 0x03, 0x00, 0xf1, 0x24, 0x03, 0x00, + 0xf4, 0xe5, 0x05, 0x00, 0xcd, 0x29, 0x03, 0x00, 0x43, 0xf6, 0x89, 0x6c, + 0xc1, 0xf2, 0x06, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x2d, 0xe9, 0xf0, 0x4f, + 0x8d, 0xb0, 0xc0, 0xb3, 0x90, 0xf8, 0x70, 0x40, 0x05, 0x46, 0x00, 0x68, + 0x88, 0x46, 0x90, 0xf8, 0x4a, 0x71, 0xe8, 0x8e, 0x8d, 0xf8, 0x32, 0x40, + 0x0b, 0x90, 0x95, 0xf8, 0x3c, 0x00, 0x8d, 0xf8, 0x33, 0x70, 0x50, 0xb1, + 0xb5, 0xf8, 0x64, 0x00, 0x00, 0x07, 0x06, 0xd5, 0xdf, 0xf8, 0xd8, 0x03, + 0xb8, 0xfb, 0xf4, 0xf1, 0x02, 0x68, 0x28, 0x46, 0x90, 0x47, 0xdf, 0xf8, + 0xd0, 0x03, 0xa9, 0x6c, 0x02, 0x68, 0x05, 0xf1, 0x14, 0x00, 0x90, 0x47, + 0x02, 0x90, 0x38, 0xb1, 0x02, 0x98, 0x80, 0x88, 0x80, 0x07, 0x03, 0xd4, + 0x00, 0x20, 0x66, 0x21, 0xf4, 0xf7, 0xfe, 0xf8, 0x29, 0x68, 0xcd, 0xf8, + 0x14, 0x80, 0xd1, 0xf8, 0x3c, 0x01, 0x58, 0xb1, 0x90, 0xf8, 0x21, 0x20, + 0x42, 0xb1, 0x02, 0x9a, 0x52, 0xb1, 0x16, 0x88, 0x09, 0xe0, 0x00, 0x20, + 0x50, 0x21, 0xf4, 0xf7, 0xed, 0xf8, 0xc0, 0xe1, 0x00, 0x20, 0x03, 0x90, + 0x0a, 0x97, 0x2c, 0xe0, 0x00, 0x26, 0xd1, 0xf8, 0x00, 0x11, 0x0d, 0xf1, + 0x32, 0x02, 0x02, 0x30, 0x0d, 0xf1, 0x33, 0x03, 0xd1, 0xf8, 0xd4, 0x10, + 0x49, 0x7f, 0x00, 0x92, 0x32, 0x46, 0xb1, 0xfa, 0x81, 0xf1, 0x49, 0x09, + 0x08, 0xf0, 0xc6, 0xfb, 0x9d, 0xf8, 0x32, 0x40, 0xb6, 0xfb, 0xf4, 0xf0, + 0x0b, 0x90, 0x9d, 0xf8, 0x33, 0x00, 0x87, 0x42, 0x0a, 0x90, 0x06, 0xd1, + 0x28, 0x68, 0x90, 0xf8, 0xcc, 0x11, 0xa1, 0x42, 0x02, 0xd1, 0x01, 0x20, + 0xd9, 0xe7, 0x28, 0x68, 0x0a, 0x9a, 0x04, 0x21, 0x97, 0x42, 0x08, 0xbf, + 0x03, 0x21, 0xef, 0xf7, 0x6f, 0xfe, 0x01, 0x20, 0x03, 0x90, 0x05, 0x98, + 0x00, 0x28, 0x00, 0xf0, 0x8c, 0x81, 0x28, 0x1d, 0x00, 0x26, 0x09, 0x90, + 0x95, 0xf8, 0x70, 0x00, 0x00, 0x2c, 0x04, 0x90, 0x00, 0xf0, 0x74, 0x81, + 0xdd, 0xf8, 0x08, 0x90, 0xdd, 0xf8, 0x2c, 0xb0, 0x4f, 0xf0, 0x00, 0x0a, + 0x00, 0x20, 0x08, 0x90, 0x4f, 0x46, 0xcd, 0xe9, 0x06, 0xa6, 0x0b, 0x98, + 0x1f, 0xfa, 0x8b, 0xf8, 0x80, 0x45, 0x54, 0xd1, 0xbc, 0x48, 0x01, 0x68, + 0x64, 0x20, 0x88, 0x47, 0x06, 0x46, 0x18, 0xb9, 0x00, 0x20, 0x93, 0x21, + 0xee, 0xf7, 0x32, 0xfa, 0x28, 0x8a, 0x2a, 0x68, 0xb9, 0xf1, 0x00, 0x0f, + 0xc6, 0xf8, 0x28, 0x90, 0x00, 0xf1, 0x01, 0x01, 0x92, 0xf8, 0x1d, 0x21, + 0x86, 0xf8, 0x2f, 0x00, 0x29, 0x82, 0xb2, 0x49, 0xc2, 0xeb, 0x02, 0x12, + 0x09, 0x68, 0x01, 0xeb, 0x42, 0x12, 0xb2, 0xf8, 0x64, 0x30, 0x03, 0xf1, + 0x01, 0x03, 0xa2, 0xf8, 0x64, 0x30, 0x0a, 0x9a, 0x86, 0xf8, 0x46, 0x40, + 0x86, 0xf8, 0x47, 0x20, 0x30, 0xd1, 0xc0, 0xb2, 0x01, 0x22, 0xa5, 0xf8, + 0x96, 0x00, 0xa8, 0x48, 0x86, 0xf8, 0x2c, 0x20, 0x00, 0x68, 0xc5, 0xf8, + 0xac, 0x00, 0x5f, 0xea, 0x0a, 0x60, 0x10, 0xd1, 0x95, 0xf8, 0x3c, 0x00, + 0x01, 0x30, 0x85, 0xf8, 0x3c, 0x00, 0x28, 0x68, 0x90, 0xf8, 0x1d, 0x01, + 0xc0, 0xeb, 0x00, 0x10, 0x01, 0xeb, 0x40, 0x10, 0xb0, 0xf8, 0x56, 0x10, + 0x01, 0x31, 0xa0, 0xf8, 0x56, 0x10, 0x9f, 0x48, 0x09, 0x99, 0x02, 0x68, + 0x30, 0x46, 0x90, 0x47, 0x0a, 0xf1, 0x01, 0x0a, 0x4f, 0xf0, 0x00, 0x09, + 0x5f, 0xfa, 0x8a, 0xf0, 0xa0, 0x42, 0xa6, 0xd3, 0x0e, 0xe1, 0x67, 0xb3, + 0xdd, 0xf8, 0x18, 0xa0, 0xb9, 0x46, 0x30, 0xe0, 0xb9, 0xf8, 0x04, 0x10, + 0xca, 0x06, 0x44, 0xbf, 0x21, 0xf0, 0x10, 0x01, 0xa9, 0xf8, 0x04, 0x10, + 0x01, 0x21, 0x4f, 0xf6, 0xff, 0x72, 0x86, 0xf8, 0x2c, 0x10, 0xb9, 0xf8, + 0x16, 0x10, 0x91, 0x42, 0x04, 0xbf, 0xc1, 0xb2, 0xa9, 0xf8, 0x16, 0x10, + 0xc0, 0xb2, 0xa9, 0xf8, 0x18, 0x00, 0xa5, 0xf8, 0x96, 0x00, 0xb9, 0xf8, + 0x02, 0x00, 0xd9, 0xf8, 0x08, 0x10, 0xa5, 0xf8, 0x94, 0x00, 0x82, 0x48, + 0xc5, 0xf8, 0xa8, 0x10, 0x00, 0x68, 0xdd, 0xf8, 0x2c, 0x80, 0x07, 0x96, + 0xc5, 0xf8, 0xac, 0x00, 0x07, 0xe0, 0x00, 0x20, 0xd4, 0x21, 0x4f, 0xf0, + 0x00, 0x09, 0xee, 0xf7, 0xb3, 0xf9, 0xdd, 0xf8, 0x18, 0xa0, 0x08, 0x98, + 0xb9, 0xf8, 0x00, 0x60, 0x78, 0x49, 0x1f, 0xfa, 0x80, 0xfe, 0xa6, 0xeb, + 0x0e, 0x00, 0x40, 0x45, 0xc8, 0xbf, 0x40, 0x46, 0x0a, 0x68, 0x00, 0x2a, + 0x7e, 0xd0, 0x74, 0x49, 0xdf, 0xf8, 0xd0, 0x81, 0x91, 0xf8, 0xd2, 0x31, + 0x98, 0xf8, 0x00, 0x10, 0x99, 0x42, 0x72, 0xd2, 0xb1, 0xfb, 0xf3, 0xf7, + 0x4f, 0xf0, 0x1a, 0x0c, 0x07, 0xfb, 0x13, 0x11, 0xde, 0x27, 0x01, 0xfb, + 0x0c, 0xf1, 0x57, 0x52, 0x98, 0xf8, 0x00, 0x10, 0xb1, 0xfb, 0xf3, 0xf7, + 0x07, 0xfb, 0x13, 0x11, 0xb9, 0xf8, 0x02, 0x70, 0x01, 0xfb, 0x0c, 0x21, + 0x4f, 0x80, 0x98, 0xf8, 0x00, 0x10, 0xb1, 0xfb, 0xf3, 0xf7, 0x07, 0xfb, + 0x13, 0x11, 0x07, 0x9f, 0x01, 0xfb, 0x0c, 0x21, 0x8e, 0x80, 0x98, 0xf8, + 0x00, 0x10, 0xb1, 0xfb, 0xf3, 0xf6, 0x06, 0xfb, 0x13, 0x11, 0x2e, 0x8a, + 0x01, 0xfb, 0x0c, 0x21, 0xce, 0x82, 0x98, 0xf8, 0x00, 0x10, 0xb1, 0xfb, + 0xf3, 0xf6, 0x06, 0xfb, 0x13, 0x11, 0x08, 0x9e, 0x01, 0xfb, 0x0c, 0x21, + 0x0e, 0x81, 0x98, 0xf8, 0x00, 0x10, 0xb1, 0xfb, 0xf3, 0xf6, 0x06, 0xfb, + 0x13, 0x11, 0x01, 0xfb, 0x0c, 0x21, 0x48, 0x81, 0x98, 0xf8, 0x00, 0x10, + 0xb1, 0xfb, 0xf3, 0xf6, 0x06, 0xfb, 0x13, 0x11, 0x01, 0xfb, 0x0c, 0x21, + 0xa1, 0xf8, 0x0c, 0xb0, 0x98, 0xf8, 0x00, 0x10, 0xb1, 0xfb, 0xf3, 0xf6, + 0x06, 0xfb, 0x13, 0x11, 0x3e, 0x8e, 0x01, 0xfb, 0x0c, 0x21, 0xce, 0x81, + 0x98, 0xf8, 0x00, 0x10, 0xb1, 0xfb, 0xf3, 0xf6, 0x06, 0xfb, 0x13, 0x11, + 0x97, 0xf8, 0x2d, 0x60, 0x01, 0xfb, 0x0c, 0x21, 0x0e, 0x82, 0x98, 0xf8, + 0x00, 0x10, 0xb1, 0xfb, 0xf3, 0xf6, 0x06, 0xfb, 0x13, 0x11, 0x97, 0xf8, + 0x2e, 0x60, 0x01, 0xfb, 0x0c, 0x21, 0x4e, 0x82, 0x98, 0xf8, 0x00, 0x10, + 0xb1, 0xfb, 0xf3, 0xf6, 0x06, 0xfb, 0x13, 0x11, 0x01, 0xfb, 0x0c, 0x21, + 0x97, 0xf8, 0x2f, 0x20, 0x8a, 0x82, 0x98, 0xf8, 0x00, 0x10, 0x01, 0x31, + 0x88, 0xf8, 0x00, 0x10, 0x01, 0x04, 0x15, 0xd0, 0x07, 0x9e, 0xd9, 0xf8, + 0x0c, 0x10, 0xab, 0xeb, 0x00, 0x0b, 0x96, 0xf8, 0x2e, 0x20, 0x71, 0x44, + 0x46, 0xf8, 0x22, 0x10, 0x06, 0xeb, 0x42, 0x01, 0x48, 0x86, 0x51, 0x1c, + 0x08, 0x9a, 0x86, 0xf8, 0x2e, 0x10, 0x31, 0x8e, 0x02, 0x44, 0x01, 0x44, + 0x31, 0x86, 0x01, 0xe0, 0xdd, 0xe9, 0x07, 0x62, 0xb9, 0xf8, 0x00, 0x00, + 0x91, 0xb2, 0x81, 0x42, 0x06, 0xd1, 0xb9, 0xf8, 0x04, 0x00, 0x40, 0x07, + 0x04, 0xd4, 0x59, 0xf8, 0x04, 0x9c, 0x0c, 0xe0, 0x08, 0x92, 0x11, 0xe0, + 0x59, 0xf8, 0x04, 0x0c, 0x4f, 0xf0, 0x00, 0x0b, 0xc5, 0xf8, 0x48, 0x90, + 0x4f, 0xf0, 0x00, 0x09, 0x86, 0xf8, 0x2c, 0xb0, 0x02, 0x90, 0x96, 0xf8, + 0x2d, 0x00, 0x01, 0x30, 0x86, 0xf8, 0x2d, 0x00, 0x00, 0x20, 0x08, 0x90, + 0x5f, 0xea, 0x0b, 0x40, 0x08, 0xd1, 0x18, 0x48, 0x09, 0x99, 0x02, 0x68, + 0x30, 0x46, 0x90, 0x47, 0xdd, 0xf8, 0x2c, 0xb0, 0x0a, 0xf1, 0x01, 0x0a, + 0x5f, 0xfa, 0x8a, 0xf0, 0xa0, 0x42, 0xff, 0xf4, 0x95, 0xae, 0xff, 0xe7, + 0x03, 0x98, 0x28, 0xb1, 0x95, 0xf8, 0x70, 0x00, 0x29, 0x8a, 0x00, 0x1b, + 0x08, 0x44, 0x28, 0x82, 0xdd, 0xe9, 0x04, 0x01, 0x09, 0x1a, 0x08, 0x06, + 0x05, 0x91, 0x7f, 0xf4, 0x77, 0xae, 0x0d, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0xe0, 0xb6, 0x08, 0x00, 0xec, 0xa0, 0x08, 0x00, 0x4c, 0x9c, 0x08, 0x00, + 0xe0, 0x35, 0x01, 0x00, 0x24, 0x20, 0x00, 0x40, 0xd0, 0x35, 0x01, 0x00, + 0xe8, 0x65, 0x08, 0x00, 0xc1, 0x4d, 0x01, 0x00, 0x10, 0xb7, 0x08, 0x00, + 0x40, 0x68, 0x30, 0xb1, 0x90, 0xf8, 0x2f, 0x30, 0x8b, 0x42, 0x04, 0xd0, + 0x50, 0xf8, 0x04, 0x0c, 0xf7, 0xe7, 0x00, 0x20, 0x70, 0x47, 0x10, 0x60, + 0x01, 0x20, 0x70, 0x47, 0xf8, 0xb5, 0x0d, 0x46, 0x04, 0x46, 0x00, 0xf0, + 0x95, 0xfa, 0x94, 0xf8, 0x74, 0x00, 0x80, 0x07, 0x2b, 0xd5, 0x55, 0xb3, + 0x2b, 0x88, 0x04, 0x2b, 0x27, 0xd3, 0x6a, 0x69, 0x24, 0x68, 0x10, 0x78, + 0x51, 0x78, 0x95, 0x78, 0xd6, 0x78, 0xb4, 0xf8, 0x74, 0x71, 0x10, 0x4c, + 0x40, 0xea, 0x01, 0x20, 0x0c, 0x21, 0xa7, 0x80, 0xe3, 0x80, 0x40, 0xea, + 0x05, 0x40, 0x40, 0xea, 0x06, 0x60, 0x20, 0x60, 0x04, 0xf1, 0x08, 0x00, + 0xee, 0xf7, 0x94, 0xf8, 0x09, 0x48, 0x01, 0x21, 0x00, 0x22, 0x23, 0x46, + 0x05, 0x68, 0x14, 0x20, 0x00, 0x90, 0x40, 0xf6, 0x5a, 0x10, 0xa8, 0x47, + 0x05, 0x48, 0x12, 0x21, 0x00, 0x78, 0xbd, 0xe8, 0xf8, 0x40, 0xee, 0xf7, + 0x89, 0xb8, 0xf8, 0xbd, 0x00, 0xe6, 0x05, 0x00, 0xa0, 0xa0, 0x08, 0x00, + 0x66, 0x34, 0x01, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, 0x04, 0x46, 0x00, 0x68, + 0x41, 0x6b, 0x49, 0x78, 0xa9, 0xb1, 0xfe, 0x29, 0x13, 0xd0, 0x21, 0x6a, + 0x89, 0xb1, 0x0a, 0x89, 0x52, 0x06, 0x03, 0xd0, 0x36, 0x48, 0x00, 0x22, + 0x01, 0x23, 0x07, 0xe0, 0xb0, 0xf8, 0x36, 0x01, 0x0a, 0x88, 0x82, 0x42, + 0x05, 0xd0, 0x32, 0x48, 0x00, 0x22, 0x04, 0x23, 0x05, 0x68, 0x20, 0x46, + 0xa8, 0x47, 0x20, 0x68, 0x40, 0x6b, 0x40, 0x78, 0x00, 0x28, 0x52, 0xd0, + 0xfe, 0x28, 0x4e, 0xd1, 0x25, 0x46, 0x55, 0xf8, 0x20, 0x0f, 0x70, 0xb1, + 0x00, 0x21, 0xc2, 0x88, 0x92, 0x07, 0x02, 0x46, 0x04, 0xd4, 0x02, 0x88, + 0x0b, 0x88, 0x1a, 0x44, 0x0a, 0x80, 0x0a, 0x46, 0x50, 0xf8, 0x04, 0x0c, + 0x11, 0x46, 0x00, 0x28, 0xf1, 0xd1, 0xdf, 0xf8, 0x90, 0x80, 0x28, 0x46, + 0xd8, 0xf8, 0x00, 0x10, 0x88, 0x47, 0xa0, 0xb3, 0xdf, 0xf8, 0x84, 0x90, + 0xdf, 0xf8, 0x88, 0xa0, 0x22, 0x4f, 0xdf, 0xf8, 0x80, 0xb0, 0xd9, 0xf8, + 0x00, 0x10, 0x28, 0x46, 0x88, 0x47, 0x06, 0x46, 0xc0, 0x88, 0x81, 0x07, + 0x05, 0xd5, 0xdb, 0xf8, 0x00, 0x20, 0x20, 0x46, 0x31, 0x46, 0x90, 0x47, + 0xf0, 0x88, 0x22, 0x68, 0xda, 0xf8, 0x00, 0x10, 0x40, 0x07, 0x92, 0xf8, + 0x1d, 0x21, 0xc2, 0xeb, 0x02, 0x12, 0x01, 0xeb, 0x42, 0x11, 0xb1, 0xf8, + 0x7e, 0x20, 0x02, 0xf1, 0x01, 0x02, 0xa1, 0xf8, 0x7e, 0x20, 0x04, 0xd5, + 0x94, 0xf8, 0x2d, 0x00, 0x01, 0x38, 0x84, 0xf8, 0x2d, 0x00, 0x3a, 0x68, + 0x20, 0x46, 0x31, 0x46, 0x90, 0x47, 0xd8, 0xf8, 0x00, 0x10, 0x28, 0x46, + 0x88, 0x47, 0x00, 0x28, 0xd1, 0xd1, 0xbd, 0xe8, 0xf8, 0x8f, 0x04, 0x48, + 0x01, 0x68, 0x20, 0x46, 0xbd, 0xe8, 0xf8, 0x4f, 0x08, 0x47, 0x00, 0xbf, + 0x08, 0xb7, 0x08, 0x00, 0xd8, 0xb3, 0x08, 0x00, 0x28, 0x9d, 0x08, 0x00, + 0x24, 0x9d, 0x08, 0x00, 0xd4, 0xb3, 0x08, 0x00, 0xe0, 0x35, 0x01, 0x00, + 0xd0, 0xb3, 0x08, 0x00, 0x2d, 0xe9, 0xfe, 0x4f, 0x04, 0x46, 0x00, 0x68, + 0x90, 0xf8, 0x46, 0x51, 0x00, 0x2d, 0x00, 0xf0, 0x74, 0x81, 0xd2, 0x4a, + 0x02, 0xf5, 0xdd, 0x78, 0xb4, 0xf8, 0x64, 0x20, 0x12, 0xf0, 0x01, 0x02, + 0x0e, 0xd1, 0xb7, 0x4b, 0x90, 0xf8, 0x1d, 0x61, 0xc6, 0xeb, 0x06, 0x16, + 0x1b, 0x68, 0x76, 0x01, 0x9b, 0x5d, 0x01, 0x2b, 0x04, 0xd8, 0x43, 0x6b, + 0x1b, 0x78, 0x00, 0x2b, 0x00, 0xf0, 0x4b, 0x81, 0x71, 0xb1, 0xaf, 0x4b, + 0x90, 0xf8, 0x1d, 0x61, 0x1b, 0x68, 0xc6, 0xeb, 0x06, 0x16, 0x03, 0xeb, + 0x46, 0x13, 0x93, 0xf8, 0x21, 0x30, 0x1b, 0xb9, 0x94, 0xf8, 0x70, 0x30, + 0x03, 0xfb, 0x01, 0xf5, 0x00, 0x2a, 0x40, 0xf0, 0xb6, 0x80, 0xb8, 0xf8, + 0x00, 0x10, 0xc9, 0x05, 0x13, 0xd4, 0xa4, 0x49, 0x90, 0xf8, 0x1d, 0x21, + 0xc2, 0xeb, 0x02, 0x12, 0x09, 0x68, 0x53, 0x01, 0xcb, 0x5c, 0x02, 0x2b, + 0x09, 0xd1, 0x01, 0xeb, 0x42, 0x11, 0x91, 0xf8, 0xe2, 0x10, 0x21, 0xb1, + 0x94, 0xf8, 0x2c, 0x10, 0x00, 0x29, 0x56, 0xd1, 0x31, 0xe1, 0x42, 0x6b, + 0x94, 0xf8, 0x2c, 0x10, 0x12, 0x78, 0xd2, 0xb3, 0xdf, 0xf8, 0x5c, 0x92, + 0x90, 0xf8, 0x1d, 0x31, 0xd9, 0xf8, 0x00, 0x20, 0xc3, 0xeb, 0x03, 0x13, + 0x02, 0xeb, 0x43, 0x12, 0x94, 0xf8, 0x3d, 0x30, 0x92, 0xf8, 0x21, 0x20, + 0x00, 0x2a, 0x18, 0xbf, 0x01, 0x33, 0x8b, 0x42, 0x3d, 0xd2, 0xdf, 0xf8, + 0x40, 0xb2, 0x90, 0x4f, 0x04, 0xf1, 0x14, 0x05, 0x4f, 0xf0, 0x04, 0x0a, + 0x28, 0x68, 0x08, 0xb1, 0x80, 0xf8, 0x14, 0xa0, 0x39, 0x68, 0xdb, 0xf8, + 0x00, 0x60, 0x28, 0x46, 0x88, 0x47, 0x01, 0x46, 0x20, 0x46, 0xb0, 0x47, + 0x20, 0x68, 0xd9, 0xf8, 0x00, 0x10, 0x90, 0xf8, 0x1d, 0x21, 0xc2, 0xeb, + 0x02, 0x12, 0x01, 0xeb, 0x42, 0x11, 0x94, 0xf8, 0x3d, 0x20, 0x91, 0xf8, + 0x21, 0x10, 0x00, 0x29, 0x18, 0xbf, 0x01, 0x32, 0x94, 0xf8, 0x2c, 0x10, + 0x8a, 0x42, 0xdf, 0xd3, 0x15, 0xe0, 0x94, 0xf8, 0x3d, 0x20, 0x91, 0x42, + 0x11, 0xd2, 0x61, 0x69, 0x00, 0x29, 0x00, 0xf0, 0xea, 0x80, 0x7a, 0x48, + 0x7a, 0x4a, 0x00, 0x68, 0x12, 0x68, 0x89, 0x68, 0x90, 0x47, 0x94, 0xf8, + 0x3d, 0x10, 0xe2, 0x6d, 0x51, 0x43, 0x88, 0x42, 0xc0, 0xf0, 0xdd, 0x80, + 0x20, 0x68, 0x75, 0x49, 0x0d, 0xf1, 0x0a, 0x02, 0x01, 0xab, 0x0d, 0x68, + 0x01, 0x21, 0xa8, 0x47, 0x00, 0x28, 0x00, 0xf0, 0xd2, 0x80, 0x6a, 0x48, + 0x01, 0x99, 0x03, 0x68, 0x20, 0x68, 0x21, 0x82, 0x90, 0xf8, 0x1d, 0x21, + 0xc2, 0xeb, 0x02, 0x16, 0x03, 0xeb, 0x46, 0x12, 0x92, 0xf8, 0x21, 0x50, + 0x65, 0xb1, 0x75, 0x01, 0x5f, 0x5d, 0x90, 0xf8, 0x46, 0x51, 0x02, 0x2f, + 0x0b, 0xd1, 0x92, 0xf8, 0xe1, 0xc0, 0x92, 0xf8, 0xe2, 0x70, 0x07, 0xfb, + 0x0c, 0x55, 0x04, 0xe0, 0x94, 0xf8, 0x3d, 0x50, 0x94, 0xf8, 0x70, 0x70, + 0x7d, 0x43, 0xb8, 0xf8, 0x00, 0x70, 0xff, 0x05, 0x0d, 0xd4, 0x76, 0x01, + 0x9b, 0x5d, 0x02, 0x2b, 0x09, 0xd1, 0x92, 0xf8, 0xe2, 0x30, 0x33, 0xb1, + 0x92, 0xf8, 0xe1, 0x20, 0x90, 0xf8, 0x46, 0x51, 0x12, 0xfb, 0x03, 0x11, + 0x21, 0x82, 0xa4, 0xf8, 0x8e, 0x10, 0xb4, 0xf8, 0x64, 0x10, 0x41, 0xf0, + 0x01, 0x01, 0xa4, 0xf8, 0x64, 0x10, 0x61, 0x69, 0x49, 0x88, 0xa4, 0xf8, + 0x8c, 0x10, 0xb4, 0xf8, 0x90, 0x10, 0x94, 0xf8, 0x2c, 0x20, 0x91, 0x42, + 0x88, 0xbf, 0x0a, 0x46, 0x98, 0xf8, 0x17, 0x10, 0xa4, 0xf8, 0x90, 0x20, + 0xd1, 0xb3, 0x90, 0xf8, 0x1d, 0x21, 0x44, 0x4f, 0xc2, 0xeb, 0x02, 0x12, + 0x39, 0x68, 0x53, 0x01, 0xcb, 0x5c, 0x02, 0x2b, 0x0f, 0xd1, 0x90, 0xf8, + 0x20, 0x31, 0x90, 0xf8, 0x46, 0x01, 0x01, 0xeb, 0x42, 0x11, 0x91, 0xf8, + 0xe0, 0x20, 0x91, 0xf8, 0xe1, 0x10, 0xb3, 0xfb, 0xf0, 0xf0, 0x80, 0x1a, + 0x48, 0x43, 0x46, 0x1c, 0x01, 0xe0, 0x90, 0xf8, 0x47, 0x61, 0x3e, 0x48, + 0x01, 0x68, 0x20, 0x1d, 0x88, 0x47, 0x01, 0x46, 0x98, 0xf8, 0x17, 0x00, + 0x50, 0xfa, 0x86, 0xf0, 0x42, 0x1e, 0x20, 0x68, 0x90, 0xf8, 0x46, 0x31, + 0x12, 0xfb, 0x03, 0xf2, 0x8a, 0x42, 0x0d, 0xda, 0x90, 0xf8, 0x1d, 0x01, + 0x39, 0x68, 0xc0, 0xeb, 0x00, 0x10, 0x01, 0xeb, 0x40, 0x10, 0xb0, 0xf8, + 0x6c, 0x10, 0x01, 0x31, 0xa0, 0xf8, 0x6c, 0x10, 0xbd, 0xe8, 0xfe, 0x8f, + 0x27, 0x49, 0x90, 0xf8, 0x1d, 0x01, 0x09, 0x68, 0xc0, 0xeb, 0x00, 0x10, + 0x01, 0xeb, 0x40, 0x10, 0xe9, 0xb2, 0x90, 0xf8, 0x21, 0x00, 0x01, 0x28, + 0x14, 0xbf, 0x45, 0x48, 0x28, 0x48, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, + 0x27, 0x48, 0x00, 0x68, 0x98, 0xb1, 0x27, 0x4d, 0x98, 0xf8, 0x18, 0x20, + 0x29, 0x78, 0x91, 0x42, 0x0b, 0xd2, 0xb1, 0xfb, 0xf2, 0xf3, 0x03, 0xfb, + 0x12, 0x11, 0x1a, 0x22, 0x01, 0xfb, 0x02, 0x00, 0x1a, 0x21, 0xff, 0x22, + 0xfe, 0xf7, 0x60, 0xf8, 0x29, 0x78, 0x48, 0x1c, 0x28, 0x70, 0x1a, 0x4e, + 0x25, 0x1d, 0xb4, 0xf8, 0x92, 0x70, 0x28, 0x46, 0x31, 0x68, 0x88, 0x47, + 0x87, 0x42, 0x8f, 0xbf, 0xb4, 0xf8, 0x92, 0x00, 0x31, 0x68, 0x28, 0x46, + 0x88, 0x47, 0xa4, 0xf8, 0x92, 0x00, 0xbd, 0xe8, 0xfe, 0x8f, 0x98, 0xf9, + 0x00, 0x30, 0x00, 0x2b, 0x3f, 0xf5, 0xb0, 0xae, 0x08, 0x4b, 0x9b, 0x7f, + 0x00, 0x2b, 0x3f, 0xf4, 0xab, 0xae, 0x94, 0xf8, 0x3d, 0x70, 0x94, 0xf8, + 0x2c, 0x60, 0x3b, 0x44, 0xb3, 0x42, 0x7f, 0xf6, 0xa3, 0xae, 0xbd, 0xe8, + 0xfe, 0x8f, 0x00, 0xbf, 0xe0, 0x35, 0x01, 0x00, 0x50, 0x32, 0x06, 0x00, + 0xa0, 0xb2, 0x08, 0x00, 0x24, 0x9d, 0x08, 0x00, 0x24, 0x20, 0x00, 0x40, + 0x1c, 0x9d, 0x08, 0x00, 0xe0, 0xb5, 0x08, 0x00, 0x28, 0x9d, 0x08, 0x00, + 0xd0, 0xb5, 0x08, 0x00, 0xd0, 0x35, 0x01, 0x00, 0xc1, 0x4d, 0x01, 0x00, + 0x70, 0xb5, 0x04, 0x46, 0x00, 0x68, 0x0a, 0x4d, 0x40, 0x6b, 0x95, 0xf8, + 0xd1, 0x61, 0x00, 0x78, 0x10, 0xb9, 0x00, 0x20, 0x85, 0xf8, 0xd1, 0x01, + 0x20, 0x46, 0x00, 0xf0, 0x35, 0xf8, 0x21, 0x68, 0x49, 0x6b, 0x09, 0x78, + 0x01, 0xb1, 0x70, 0xbd, 0x85, 0xf8, 0xd1, 0x61, 0x70, 0xbd, 0x00, 0xbf, + 0xe8, 0x65, 0x08, 0x00, 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, + 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, 0x09, 0x49, 0x01, 0x60, 0x09, 0x48, + 0x09, 0x49, 0x01, 0x60, 0x09, 0x48, 0x0a, 0x49, 0x01, 0x60, 0x70, 0x47, + 0xd4, 0xb3, 0x08, 0x00, 0xb1, 0x2e, 0x03, 0x00, 0xbc, 0xb4, 0x08, 0x00, + 0x29, 0x2f, 0x03, 0x00, 0xd4, 0xb5, 0x08, 0x00, 0x65, 0x2a, 0x03, 0x00, + 0xc4, 0xb4, 0x08, 0x00, 0x3d, 0x30, 0x03, 0x00, 0xd8, 0xb4, 0x08, 0x00, + 0x69, 0x33, 0x03, 0x00, 0x41, 0xf2, 0x8d, 0x0c, 0xc1, 0xf2, 0x06, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x40, 0xf2, 0xc9, 0x6c, 0xc1, 0xf2, 0x06, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0xb0, 0xb5, 0x04, 0x46, 0xd0, 0xf8, 0x0c, 0x02, + 0x58, 0xb1, 0x08, 0x68, 0x0d, 0x46, 0x30, 0xb9, 0x04, 0xf5, 0x03, 0x70, + 0x01, 0x21, 0xf1, 0xf7, 0x4f, 0xff, 0x20, 0xb1, 0x28, 0x60, 0x01, 0x24, + 0x11, 0xe0, 0x00, 0x24, 0x0f, 0xe0, 0x09, 0x48, 0x94, 0xf8, 0x1d, 0x11, + 0x00, 0x24, 0x00, 0x68, 0xc1, 0xeb, 0x01, 0x11, 0x00, 0xeb, 0x41, 0x10, + 0x41, 0x8f, 0x01, 0x31, 0x41, 0x87, 0x00, 0x20, 0x53, 0x21, 0xed, 0xf7, + 0xdd, 0xfd, 0x20, 0x46, 0xb0, 0xbd, 0x00, 0xbf, 0xe0, 0x35, 0x01, 0x00, + 0x70, 0xb5, 0x06, 0x46, 0x14, 0x46, 0x0d, 0x46, 0x88, 0x07, 0x02, 0xd5, + 0x30, 0x46, 0xfe, 0xf7, 0x4b, 0xf9, 0x30, 0x46, 0x29, 0x46, 0x22, 0x46, + 0xbd, 0xe8, 0x70, 0x40, 0x00, 0xf0, 0x52, 0xba, 0xb0, 0xb5, 0x0c, 0x46, + 0x05, 0x46, 0xff, 0xf7, 0xc3, 0xff, 0x08, 0xb1, 0x01, 0x20, 0xb0, 0xbd, + 0x28, 0x46, 0x21, 0x46, 0xbd, 0xe8, 0xb0, 0x40, 0x00, 0xf0, 0x4a, 0xba, + 0x70, 0xb5, 0x04, 0x46, 0x40, 0x69, 0x02, 0x6b, 0x2a, 0xb1, 0x40, 0x6b, + 0x18, 0xb1, 0x90, 0xf8, 0x29, 0x00, 0x80, 0x07, 0x01, 0xd4, 0x00, 0x20, + 0x70, 0xbd, 0x18, 0x48, 0x01, 0x22, 0x03, 0x68, 0x20, 0x46, 0x98, 0x47, + 0xa1, 0x6d, 0x04, 0xf1, 0x54, 0x00, 0x00, 0x29, 0xf4, 0xd0, 0x0a, 0x68, + 0x02, 0xf4, 0x40, 0x42, 0xb2, 0xf5, 0x00, 0x4f, 0xee, 0xd1, 0x04, 0xf1, + 0x5c, 0x02, 0x4f, 0xf6, 0xff, 0x73, 0x00, 0x24, 0x0e, 0x46, 0x15, 0x46, + 0x2e, 0xb1, 0x36, 0x68, 0x9b, 0xb2, 0xb3, 0xeb, 0x96, 0x5f, 0x28, 0xbf, + 0xb3, 0x0d, 0x01, 0x34, 0x03, 0x2c, 0x01, 0xd0, 0x40, 0xcd, 0xf3, 0xe7, + 0x9b, 0x05, 0x00, 0x24, 0x21, 0xb1, 0x0d, 0x68, 0x6f, 0xf3, 0x9f, 0x55, + 0x1d, 0x43, 0x0d, 0x60, 0x01, 0x34, 0x03, 0x2c, 0xd0, 0xd0, 0x02, 0xca, + 0xf4, 0xe7, 0x00, 0xbf, 0x38, 0xb7, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, + 0x89, 0xb0, 0x98, 0xb1, 0x04, 0x46, 0x40, 0x6b, 0x80, 0xb1, 0xc4, 0x49, + 0x94, 0xf8, 0x1d, 0x21, 0x09, 0x68, 0xc2, 0xeb, 0x02, 0x12, 0x01, 0xeb, + 0x42, 0x16, 0xd6, 0xf8, 0xd8, 0x11, 0x71, 0xb1, 0x7c, 0x48, 0x01, 0x68, + 0x20, 0x46, 0x88, 0x47, 0x00, 0x24, 0x04, 0xe0, 0x00, 0x20, 0xbb, 0x21, + 0xf3, 0xf7, 0xc0, 0xfb, 0x1f, 0x24, 0x20, 0x46, 0x09, 0xb0, 0xbd, 0xe8, + 0xf0, 0x8f, 0x96, 0xf8, 0xc0, 0x70, 0x7f, 0xb1, 0x21, 0x6b, 0x39, 0xb1, + 0x01, 0x78, 0xff, 0x29, 0x03, 0x91, 0x0c, 0xd1, 0x40, 0x78, 0xff, 0x28, + 0x03, 0x90, 0x08, 0xd1, 0x00, 0x20, 0xdb, 0x21, 0x00, 0x24, 0xf3, 0xf7, + 0xa9, 0xfb, 0xe8, 0xe7, 0x00, 0x20, 0xd2, 0x21, 0xe2, 0xe7, 0x6b, 0x48, + 0x94, 0xf8, 0x85, 0x51, 0x01, 0x68, 0x07, 0xeb, 0x87, 0x00, 0x80, 0x00, + 0x88, 0x47, 0x00, 0x28, 0x08, 0x90, 0x00, 0xf0, 0xc1, 0x80, 0x83, 0x46, + 0x06, 0xf5, 0xec, 0x70, 0x8d, 0xf8, 0x1c, 0x70, 0x06, 0xf5, 0xea, 0x71, + 0x01, 0x96, 0x00, 0x90, 0x96, 0xf8, 0xd5, 0x01, 0x11, 0xf8, 0x02, 0x2b, + 0x42, 0xea, 0x00, 0x20, 0x0a, 0x78, 0x49, 0x78, 0x42, 0xea, 0x01, 0x21, + 0x40, 0xea, 0x01, 0x48, 0x06, 0xf5, 0xe8, 0x70, 0x80, 0x45, 0x04, 0x90, + 0x00, 0xf0, 0x84, 0x80, 0x01, 0x98, 0x4f, 0xf0, 0x00, 0x09, 0xa0, 0x30, + 0x02, 0x90, 0x18, 0xf8, 0xb6, 0x0c, 0x00, 0x07, 0x05, 0xd5, 0x58, 0xf8, + 0xc8, 0x0c, 0x28, 0xb3, 0x58, 0xf8, 0xc4, 0x0c, 0x10, 0xb3, 0x02, 0x98, + 0x3e, 0x21, 0x5f, 0xfa, 0x89, 0xf7, 0x00, 0x68, 0x40, 0x7f, 0x00, 0x28, + 0x08, 0xbf, 0x3c, 0x21, 0x38, 0xf8, 0x01, 0x20, 0xf9, 0x00, 0x00, 0x28, + 0x4f, 0xf0, 0x3c, 0x00, 0x51, 0xfa, 0x89, 0xf1, 0x0b, 0xeb, 0x41, 0x06, + 0x72, 0x80, 0x88, 0xf8, 0x8d, 0x50, 0x08, 0xbf, 0x3e, 0x20, 0x38, 0xf8, + 0x00, 0x10, 0x26, 0xf8, 0x04, 0x1f, 0x32, 0xb1, 0x42, 0x48, 0x01, 0x68, + 0x03, 0x98, 0x88, 0x47, 0x31, 0x88, 0x01, 0xe0, 0x3e, 0xe0, 0xfe, 0x20, + 0x07, 0xeb, 0xc7, 0x07, 0x0b, 0xeb, 0x47, 0x0a, 0x8a, 0xf8, 0x10, 0x00, + 0x21, 0xb1, 0x3b, 0x48, 0x01, 0x68, 0x03, 0x98, 0x88, 0x47, 0x00, 0xe0, + 0xfe, 0x20, 0x18, 0xf8, 0xb4, 0x1c, 0x02, 0x2d, 0x2b, 0xf8, 0x17, 0x10, + 0x88, 0xf8, 0x8d, 0x50, 0x8a, 0xf8, 0x11, 0x00, 0x0f, 0xd1, 0x34, 0x48, + 0x90, 0xf8, 0x2c, 0x01, 0x80, 0x07, 0x05, 0xd5, 0x32, 0x48, 0x33, 0x4a, + 0x00, 0x21, 0x03, 0x68, 0x02, 0x20, 0x98, 0x47, 0x4f, 0xf6, 0xff, 0x70, + 0xaa, 0xf8, 0x00, 0x00, 0x14, 0xe0, 0x0a, 0xf1, 0x0a, 0x00, 0x05, 0x2d, + 0x0a, 0xd1, 0x05, 0x21, 0x01, 0x70, 0x4f, 0xf4, 0x80, 0x50, 0xaa, 0xf8, + 0x0e, 0x00, 0x4f, 0xf4, 0x01, 0x70, 0xaa, 0xf8, 0x0c, 0x00, 0x03, 0xe0, + 0x03, 0x21, 0x01, 0x70, 0x8a, 0xf8, 0x0c, 0x10, 0x8a, 0xf8, 0x0b, 0x10, + 0x09, 0xf1, 0x01, 0x09, 0x18, 0xf8, 0x04, 0x0f, 0x98, 0xf8, 0x01, 0x10, + 0x98, 0xf8, 0x02, 0x20, 0x98, 0xf8, 0x03, 0x30, 0x40, 0xea, 0x01, 0x20, + 0x42, 0xea, 0x03, 0x21, 0x40, 0xea, 0x01, 0x48, 0x04, 0x98, 0x80, 0x45, + 0x7f, 0xf4, 0x81, 0xaf, 0x1a, 0x48, 0x06, 0x94, 0x58, 0x4d, 0x02, 0x21, + 0x05, 0x90, 0x01, 0x98, 0x90, 0xf8, 0x21, 0x00, 0x00, 0x28, 0x08, 0xbf, + 0x01, 0x21, 0x6a, 0x68, 0x05, 0xa8, 0x90, 0x47, 0x00, 0x9e, 0x30, 0x60, + 0x08, 0x98, 0xf3, 0xf7, 0x05, 0xfb, 0x30, 0x68, 0x88, 0xb1, 0xa9, 0x68, + 0x88, 0x47, 0x00, 0x28, 0x7f, 0xf4, 0x1a, 0xaf, 0x60, 0x6b, 0x90, 0xf8, + 0x2a, 0x10, 0x41, 0xf0, 0x01, 0x01, 0x80, 0xf8, 0x2a, 0x10, 0x11, 0xe7, + 0x00, 0x20, 0x40, 0xf2, 0x15, 0x11, 0xf3, 0xf7, 0xd3, 0xfa, 0x07, 0x24, + 0x11, 0xe7, 0x00, 0xbf, 0xf8, 0xb8, 0x08, 0x00, 0x4c, 0x9c, 0x08, 0x00, + 0x00, 0xb9, 0x08, 0x00, 0x8c, 0x7e, 0x08, 0x00, 0x70, 0x9b, 0x08, 0x00, + 0x40, 0x39, 0x03, 0x00, 0x91, 0x54, 0x06, 0x10, 0x2d, 0xe9, 0xf0, 0x41, + 0x00, 0x28, 0x45, 0xd0, 0x42, 0x6b, 0x00, 0x2a, 0x42, 0xd0, 0x37, 0x4a, + 0x90, 0xf8, 0x1d, 0x41, 0x16, 0x68, 0x36, 0x4a, 0x12, 0x68, 0x90, 0x47, + 0x00, 0x28, 0x40, 0xd0, 0xdf, 0xf8, 0xd0, 0x80, 0x72, 0xb6, 0xd8, 0xf8, + 0x00, 0x00, 0x40, 0x00, 0x01, 0x30, 0xc8, 0xf8, 0x00, 0x00, 0xc4, 0xeb, + 0x04, 0x10, 0x06, 0xeb, 0x40, 0x11, 0xd1, 0xf8, 0xd8, 0x01, 0x00, 0x28, + 0x43, 0xd0, 0xc4, 0xeb, 0x04, 0x12, 0x06, 0xeb, 0x42, 0x12, 0x02, 0xf5, + 0xea, 0x74, 0x92, 0xf8, 0xd5, 0x31, 0x14, 0xf8, 0x02, 0x6b, 0x46, 0xea, + 0x03, 0x23, 0x26, 0x78, 0x64, 0x78, 0x46, 0xea, 0x04, 0x24, 0x43, 0xea, + 0x04, 0x44, 0x02, 0xf5, 0xe8, 0x73, 0x9c, 0x42, 0x1b, 0xd0, 0x54, 0xf8, + 0xc4, 0x6c, 0x1e, 0xb1, 0x96, 0xf8, 0x29, 0x60, 0xb6, 0x07, 0x26, 0xd1, + 0x14, 0xf8, 0x04, 0x6f, 0x67, 0x78, 0xa5, 0x78, 0xe4, 0x78, 0x46, 0xea, + 0x07, 0x26, 0x45, 0xea, 0x04, 0x24, 0x46, 0xea, 0x04, 0x44, 0xea, 0xe7, + 0x00, 0x20, 0x40, 0xf2, 0x8f, 0x11, 0xbd, 0xe8, 0xf0, 0x41, 0xf3, 0xf7, + 0x71, 0xba, 0xbd, 0xe8, 0xf0, 0x81, 0x01, 0xf5, 0xec, 0x75, 0x92, 0xf8, + 0x21, 0x10, 0x12, 0x4e, 0x02, 0x24, 0x00, 0x29, 0x08, 0xbf, 0x01, 0x24, + 0x72, 0x69, 0x21, 0x46, 0x90, 0x47, 0x28, 0x68, 0xf2, 0x68, 0x21, 0x46, + 0x90, 0x47, 0x00, 0x20, 0x28, 0x60, 0xd8, 0xf8, 0x00, 0x00, 0x0b, 0x4a, + 0x00, 0x21, 0x40, 0x08, 0xc8, 0xf8, 0x00, 0x00, 0xd8, 0xf8, 0x00, 0x00, + 0x80, 0xf3, 0x10, 0x88, 0x00, 0x20, 0xbd, 0xe8, 0xf0, 0x41, 0x00, 0xf0, + 0x81, 0xb8, 0x00, 0xbf, 0xe0, 0x35, 0x01, 0x00, 0x30, 0xb7, 0x08, 0x00, + 0x24, 0x36, 0x01, 0x00, 0x18, 0xb1, 0x08, 0x00, 0x65, 0x39, 0x03, 0x00, + 0x70, 0xb5, 0x00, 0xf5, 0xea, 0x73, 0x90, 0xf8, 0xd5, 0x21, 0x13, 0xf8, + 0x02, 0x4b, 0x44, 0xea, 0x02, 0x22, 0x1c, 0x78, 0x5b, 0x78, 0x44, 0xea, + 0x03, 0x23, 0x42, 0xea, 0x03, 0x43, 0x00, 0xf5, 0xe8, 0x72, 0x93, 0x42, + 0x24, 0xd0, 0xd0, 0xf8, 0xa0, 0x00, 0x89, 0x6a, 0x00, 0x24, 0x40, 0x7f, + 0x3e, 0x25, 0x00, 0x28, 0xe6, 0xb2, 0x04, 0xf1, 0x01, 0x04, 0x08, 0xbf, + 0x3c, 0x25, 0x00, 0x28, 0x5d, 0x5b, 0x21, 0xf8, 0x26, 0x50, 0x01, 0xeb, + 0x86, 0x05, 0x4f, 0xf0, 0x3c, 0x06, 0x08, 0xbf, 0x3e, 0x26, 0x9e, 0x5b, + 0x6e, 0x80, 0x5d, 0x79, 0x13, 0xf8, 0x04, 0x6f, 0x46, 0xea, 0x05, 0x25, + 0x9e, 0x78, 0xdb, 0x78, 0x46, 0xea, 0x03, 0x23, 0x45, 0xea, 0x03, 0x43, + 0x93, 0x42, 0xdf, 0xd1, 0x70, 0xbd, 0x4a, 0x79, 0x0a, 0xb1, 0x00, 0xf0, + 0x3f, 0xb8, 0x12, 0x20, 0x70, 0x47, 0x00, 0xbf, 0x09, 0x48, 0x0a, 0x49, + 0x0b, 0x4a, 0x0c, 0x4b, 0x13, 0x60, 0x01, 0x61, 0x08, 0x49, 0x0c, 0x4b, + 0x0a, 0x4a, 0xc0, 0xe9, 0x00, 0x31, 0x82, 0x60, 0x0a, 0x48, 0x0b, 0x49, + 0x01, 0x60, 0x0b, 0x48, 0x0b, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0x18, 0x0d, 0x01, 0x00, 0x6d, 0x34, 0x03, 0x00, 0x4d, 0x34, 0x03, 0x00, + 0x30, 0xb9, 0x08, 0x00, 0x89, 0x34, 0x03, 0x00, 0x3d, 0x37, 0x03, 0x00, + 0x09, 0x35, 0x03, 0x00, 0x08, 0xb9, 0x08, 0x00, 0x3d, 0x38, 0x03, 0x00, + 0x48, 0xb9, 0x08, 0x00, 0xaf, 0x38, 0x03, 0x00, 0x45, 0xf6, 0x25, 0x5c, + 0xc1, 0xf2, 0x06, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x45, 0xf6, 0xd5, 0x5c, + 0xc1, 0xf2, 0x06, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4b, 0xf6, 0x4d, 0x3c, + 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x45, 0xf6, 0xe9, 0x4c, + 0xc1, 0xf2, 0x06, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x49, 0x53, 0x4f, 0x3a, + 0x20, 0x43, 0x56, 0x53, 0x44, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x6f, + 0x76, 0x65, 0x72, 0x20, 0x49, 0x53, 0x4f, 0x2e, 0x00, 0x73, 0x74, 0x6f, + 0x70, 0x56, 0x6f, 0x69, 0x63, 0x65, 0x00, 0x00, 0x70, 0xb5, 0x06, 0x46, + 0x12, 0x48, 0x0d, 0x46, 0x00, 0x21, 0x14, 0x46, 0x01, 0x60, 0x11, 0x48, + 0x01, 0x60, 0x22, 0xf0, 0x1b, 0xfa, 0x04, 0x2d, 0x12, 0xd8, 0x0f, 0x48, + 0x0f, 0x49, 0x40, 0x5d, 0x0a, 0x68, 0x40, 0x00, 0x22, 0xf0, 0x7f, 0x62, + 0xc0, 0xb2, 0x42, 0xea, 0x00, 0x52, 0x0a, 0x60, 0xd1, 0xf8, 0x90, 0x20, + 0x22, 0xf0, 0x7f, 0x62, 0x42, 0xea, 0x00, 0x50, 0xc1, 0xf8, 0x90, 0x00, + 0x30, 0x46, 0x29, 0x46, 0x22, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x00, 0xf0, + 0x17, 0xb9, 0x00, 0xbf, 0x10, 0xd6, 0x05, 0x30, 0x10, 0xee, 0x05, 0x30, + 0x75, 0x14, 0x01, 0x00, 0x00, 0xc2, 0x23, 0x40, 0x80, 0xb5, 0x00, 0xf0, + 0x11, 0xf9, 0x01, 0x28, 0x0c, 0xd1, 0x64, 0x49, 0x64, 0x4a, 0x5c, 0x23, + 0x09, 0x78, 0x11, 0xfb, 0x03, 0x21, 0x49, 0x78, 0x05, 0x29, 0x03, 0xd3, + 0x01, 0x20, 0x0a, 0x29, 0x38, 0xbf, 0x05, 0x20, 0x80, 0xbd, 0x00, 0xbf, + 0x80, 0xb5, 0x00, 0xf0, 0x03, 0xf9, 0x05, 0x48, 0x01, 0x68, 0x21, 0xf0, + 0x01, 0x01, 0x01, 0x60, 0x03, 0x48, 0x00, 0x21, 0xc0, 0xe9, 0x00, 0x11, + 0x80, 0xbd, 0x00, 0xbf, 0x5c, 0x11, 0x21, 0x40, 0x14, 0xe6, 0x05, 0x00, + 0xb0, 0xb5, 0x1c, 0x21, 0x04, 0x46, 0xef, 0xf7, 0x91, 0xfc, 0x13, 0x48, + 0x15, 0x4b, 0x00, 0x22, 0x00, 0x68, 0x60, 0x76, 0x11, 0x48, 0x00, 0x68, + 0xc0, 0xf3, 0x40, 0x00, 0x20, 0x76, 0x10, 0x48, 0x00, 0x68, 0x19, 0x68, + 0xc9, 0xb2, 0xc4, 0xe9, 0x01, 0x21, 0x19, 0xb1, 0x1d, 0x68, 0xc5, 0xf3, + 0x00, 0x65, 0x00, 0xe0, 0x00, 0x25, 0x25, 0x75, 0x1d, 0x6c, 0xed, 0xb2, + 0xc4, 0xe9, 0x03, 0x25, 0x15, 0xb1, 0x1a, 0x6c, 0xc2, 0xf3, 0x00, 0x62, + 0x00, 0x07, 0x62, 0x75, 0x03, 0xd5, 0xc8, 0x1c, 0xa0, 0x60, 0xe8, 0x1c, + 0x20, 0x61, 0xb0, 0xbd, 0x3c, 0x10, 0x21, 0x40, 0xf8, 0x95, 0x23, 0x40, + 0x54, 0x10, 0x21, 0x40, 0xa8, 0xc2, 0x23, 0x40, 0xb0, 0xb5, 0x1c, 0x21, + 0x04, 0x46, 0xef, 0xf7, 0x5d, 0xfc, 0x13, 0x48, 0x15, 0x4b, 0x00, 0x22, + 0x00, 0x68, 0x60, 0x76, 0x11, 0x48, 0x00, 0x68, 0xc0, 0xf3, 0x40, 0x00, + 0x20, 0x76, 0x10, 0x48, 0x00, 0x68, 0x19, 0x68, 0xc9, 0xb2, 0xc4, 0xe9, + 0x01, 0x21, 0x19, 0xb1, 0x1d, 0x68, 0xc5, 0xf3, 0x00, 0x65, 0x00, 0xe0, + 0x00, 0x25, 0x25, 0x75, 0x1d, 0x6c, 0xed, 0xb2, 0xc4, 0xe9, 0x03, 0x25, + 0x15, 0xb1, 0x1a, 0x6c, 0xc2, 0xf3, 0x00, 0x62, 0x00, 0x07, 0x62, 0x75, + 0x03, 0xd5, 0xc8, 0x1c, 0xa0, 0x60, 0xe8, 0x1c, 0x20, 0x61, 0xb0, 0xbd, + 0x8c, 0x10, 0x21, 0x40, 0xfc, 0x95, 0x23, 0x40, 0xa4, 0x10, 0x21, 0x40, + 0xc8, 0xc2, 0x23, 0x40, 0x10, 0xb5, 0x07, 0x4c, 0x72, 0xb6, 0x22, 0x68, + 0x52, 0x00, 0x01, 0x32, 0x22, 0x60, 0x00, 0xf0, 0x89, 0xf8, 0x20, 0x68, + 0x40, 0x08, 0x20, 0x60, 0x20, 0x68, 0x80, 0xf3, 0x10, 0x88, 0x10, 0xbd, + 0x24, 0x36, 0x01, 0x00, 0x7c, 0xb5, 0x06, 0x9c, 0x24, 0x28, 0x0f, 0xd3, + 0x09, 0x4d, 0x6e, 0x7a, 0xf6, 0x07, 0x0b, 0xd0, 0x08, 0x4e, 0x06, 0x44, + 0x16, 0xf8, 0x24, 0x6c, 0x04, 0x2e, 0x28, 0xbf, 0x04, 0x26, 0x35, 0x44, + 0xad, 0x7a, 0x95, 0x42, 0x38, 0xbf, 0x2a, 0x46, 0x00, 0x94, 0x00, 0xf0, + 0x6f, 0xf8, 0x7c, 0xbd, 0xcc, 0x2c, 0x06, 0x00, 0x40, 0x0d, 0x01, 0x00, + 0x80, 0xb5, 0x08, 0x48, 0x08, 0x49, 0x5c, 0x22, 0x00, 0x78, 0x10, 0xfb, + 0x02, 0x10, 0x07, 0x49, 0x90, 0xf8, 0x52, 0x00, 0x0a, 0x68, 0x00, 0x21, + 0x90, 0x47, 0xbd, 0xe8, 0x80, 0x40, 0x00, 0xf0, 0x5f, 0xb8, 0x00, 0xbf, + 0x74, 0x87, 0x08, 0x00, 0x44, 0x4f, 0x01, 0x00, 0xbc, 0xfc, 0x08, 0x00, + 0x0c, 0x48, 0x0d, 0x49, 0x01, 0x60, 0x0d, 0x48, 0x0d, 0x49, 0x01, 0x60, + 0x0d, 0x48, 0x0e, 0x49, 0x01, 0x60, 0x0e, 0x48, 0x0e, 0x49, 0x01, 0x60, + 0x0e, 0x48, 0x0f, 0x49, 0x01, 0x60, 0x0f, 0x48, 0x0f, 0x49, 0x01, 0x60, + 0x0f, 0x48, 0x10, 0x49, 0x01, 0x60, 0x10, 0x48, 0x10, 0x49, 0x01, 0x60, + 0x70, 0x47, 0x00, 0xbf, 0x80, 0xb9, 0x08, 0x00, 0xd1, 0x39, 0x03, 0x00, + 0x20, 0xbe, 0x08, 0x00, 0x71, 0x39, 0x03, 0x00, 0xcc, 0xbc, 0x08, 0x00, + 0xf9, 0x39, 0x03, 0x00, 0x14, 0xbb, 0x08, 0x00, 0x1d, 0x3a, 0x03, 0x00, + 0xc4, 0xb7, 0x08, 0x00, 0x85, 0x3a, 0x03, 0x00, 0xac, 0xbe, 0x08, 0x00, + 0xed, 0x3a, 0x03, 0x00, 0x1c, 0xbe, 0x08, 0x00, 0x11, 0x3b, 0x03, 0x00, + 0x1c, 0xbb, 0x08, 0x00, 0x49, 0x3b, 0x03, 0x00, 0x48, 0xf2, 0x8f, 0x5c, + 0xc1, 0xf2, 0x06, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x47, 0xf6, 0x7d, 0x4c, + 0xc1, 0xf2, 0x06, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x46, 0xf2, 0xcd, 0x3c, + 0xc1, 0xf2, 0x06, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x48, 0xf2, 0xd1, 0x1c, + 0xc1, 0xf2, 0x06, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x48, 0xf2, 0x61, 0x4c, + 0xc1, 0xf2, 0x06, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x48, 0xf2, 0x49, 0x7c, + 0xc1, 0xf2, 0x06, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0xe0, 0xb5, 0x0b, 0x48, + 0x0b, 0x49, 0x00, 0x78, 0x00, 0xeb, 0x00, 0x10, 0x01, 0xeb, 0xc0, 0x00, + 0x90, 0xf8, 0x84, 0x00, 0x01, 0x38, 0xb0, 0xfa, 0x80, 0xf0, 0x40, 0x09, + 0x8d, 0xf8, 0x04, 0x00, 0x05, 0x48, 0x01, 0x68, 0x01, 0xa8, 0x88, 0x47, + 0x04, 0x48, 0x00, 0x68, 0x80, 0x47, 0x8c, 0xbd, 0x74, 0x87, 0x08, 0x00, + 0xfc, 0x6d, 0x01, 0x00, 0x8c, 0xb7, 0x08, 0x00, 0x3c, 0xbd, 0x08, 0x00, + 0x2d, 0xe9, 0xfc, 0x47, 0xdf, 0xf8, 0xa4, 0x04, 0xd0, 0xe9, 0x00, 0x10, + 0xcd, 0xe9, 0x00, 0x10, 0x00, 0xf0, 0x7a, 0xfa, 0xc9, 0x4d, 0xdf, 0xf8, + 0x98, 0x14, 0xe8, 0x69, 0x08, 0x60, 0xa8, 0x69, 0x80, 0x05, 0x3f, 0xd4, + 0xa8, 0x68, 0x80, 0x07, 0x5a, 0xd4, 0xa8, 0x69, 0x40, 0x06, 0x14, 0xd5, + 0xdf, 0xf8, 0x80, 0x04, 0x6f, 0xf0, 0xfc, 0x21, 0x00, 0x78, 0x29, 0x60, + 0x40, 0x21, 0x29, 0x61, 0xdf, 0xf8, 0x74, 0x14, 0xc0, 0xeb, 0x40, 0x10, + 0x01, 0xeb, 0xc0, 0x00, 0x00, 0x21, 0xa0, 0xf8, 0xdc, 0x10, 0xe8, 0x69, + 0xb0, 0xf1, 0xff, 0x3f, 0x5d, 0xdc, 0xa8, 0x68, 0x40, 0xb2, 0xb0, 0xf1, + 0xff, 0x3f, 0x5a, 0xdc, 0xa8, 0x68, 0x80, 0x06, 0x57, 0xd4, 0x80, 0x20, + 0xd5, 0xf8, 0xe0, 0x20, 0x28, 0x60, 0xdf, 0xf8, 0x40, 0x04, 0x01, 0x78, + 0xc1, 0xeb, 0x41, 0x13, 0xdf, 0xf8, 0x38, 0x14, 0x01, 0xeb, 0xc3, 0x03, + 0xb3, 0xf8, 0xdc, 0x30, 0x5b, 0x06, 0x58, 0xbf, 0x5f, 0xea, 0xc2, 0x32, + 0x41, 0xd4, 0x00, 0x22, 0x45, 0xf8, 0x60, 0x2c, 0x00, 0x78, 0xc0, 0xeb, + 0x40, 0x10, 0x01, 0xeb, 0xc0, 0x00, 0x15, 0xe0, 0xdf, 0xf8, 0x0c, 0x04, + 0x4f, 0xf4, 0x00, 0x72, 0xdf, 0xf8, 0x08, 0x34, 0x01, 0x78, 0x2a, 0x61, + 0x00, 0x22, 0x45, 0xf8, 0x60, 0x2c, 0x00, 0x78, 0xc1, 0xeb, 0x41, 0x11, + 0x03, 0xeb, 0xc1, 0x01, 0xc0, 0xeb, 0x40, 0x10, 0xa1, 0xf8, 0xdc, 0x20, + 0x03, 0xeb, 0xc0, 0x00, 0xb0, 0xf8, 0xdc, 0x10, 0x41, 0xf0, 0x40, 0x01, + 0xa0, 0xf8, 0xdc, 0x10, 0xbd, 0xe8, 0xfc, 0x87, 0xdf, 0xf8, 0xd0, 0x43, + 0xdf, 0xf8, 0xd0, 0x63, 0x00, 0x27, 0x20, 0x78, 0xc0, 0xeb, 0x40, 0x10, + 0x06, 0xeb, 0xc0, 0x00, 0xa0, 0xf8, 0xdc, 0x70, 0xdf, 0xf8, 0xc0, 0x03, + 0x00, 0x68, 0x80, 0x47, 0x02, 0x20, 0x28, 0x60, 0x20, 0x78, 0xc0, 0xeb, + 0x40, 0x10, 0x06, 0xeb, 0xc0, 0x00, 0x00, 0x69, 0xc0, 0x68, 0x80, 0x47, + 0x70, 0xb3, 0xbd, 0xe8, 0xfc, 0x87, 0xdf, 0xf8, 0x98, 0x43, 0xdf, 0xf8, + 0x98, 0x93, 0x20, 0x78, 0xc0, 0xeb, 0x40, 0x11, 0x09, 0xeb, 0xc1, 0x02, + 0x32, 0xf8, 0xdc, 0x1f, 0xcb, 0x07, 0x10, 0xd0, 0x4b, 0x06, 0x0e, 0xd4, + 0xeb, 0x68, 0x03, 0xf0, 0xd0, 0x03, 0x10, 0x2b, 0x09, 0xd1, 0x41, 0xf0, + 0x18, 0x03, 0x13, 0x80, 0xee, 0x68, 0xb6, 0x05, 0x44, 0xbf, 0x41, 0xf0, + 0x38, 0x03, 0x13, 0x80, 0x00, 0xe0, 0x0b, 0x46, 0x00, 0xeb, 0x00, 0x10, + 0xd9, 0x07, 0x11, 0xd1, 0xd7, 0x49, 0x01, 0xeb, 0xc0, 0x00, 0x00, 0xf1, + 0x68, 0x01, 0xd7, 0x48, 0x02, 0x68, 0x68, 0x46, 0x90, 0x47, 0x27, 0xe0, + 0x45, 0xf8, 0x60, 0x7c, 0x20, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x06, 0xeb, + 0xc0, 0x00, 0xa5, 0xe7, 0xce, 0x49, 0x01, 0xeb, 0xc0, 0x00, 0xd5, 0xf8, + 0xc8, 0x10, 0xd5, 0xf8, 0xb0, 0x20, 0xd5, 0xf8, 0xcc, 0x30, 0xd5, 0xf8, + 0xb4, 0x60, 0xd5, 0xf8, 0xb8, 0x70, 0x89, 0x1a, 0x03, 0xf0, 0x0f, 0x02, + 0x40, 0xf8, 0x68, 0x7f, 0x42, 0xea, 0x01, 0x11, 0x06, 0xf0, 0x0f, 0x02, + 0xd5, 0xf8, 0xbc, 0x70, 0x89, 0x1a, 0xc3, 0x4a, 0x01, 0xf5, 0x16, 0x61, + 0x87, 0x80, 0x13, 0x68, 0x02, 0x46, 0x98, 0x47, 0xc1, 0x4f, 0xfe, 0xf7, + 0xa3, 0xfc, 0x20, 0xb1, 0xc0, 0x48, 0x00, 0x88, 0x40, 0xf0, 0xd4, 0x00, + 0x38, 0x60, 0x20, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x09, 0xeb, 0xc0, 0x00, + 0x00, 0x69, 0x00, 0x69, 0x80, 0x47, 0x21, 0x78, 0xdf, 0xf8, 0xe8, 0x82, + 0x5c, 0x22, 0x11, 0xfb, 0x02, 0x82, 0x92, 0xf8, 0x4d, 0x30, 0xeb, 0xb3, + 0x92, 0xf8, 0x4a, 0x00, 0x18, 0xb1, 0xb6, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x21, 0x78, 0xc1, 0xeb, 0x41, 0x10, 0x09, 0xeb, 0xc0, 0x00, 0x00, 0x69, + 0x80, 0x69, 0x80, 0x47, 0x00, 0x28, 0x00, 0xf0, 0x93, 0x80, 0xb0, 0x48, + 0xba, 0x46, 0x00, 0x68, 0x80, 0x47, 0x20, 0x78, 0xa6, 0x4f, 0x00, 0xeb, + 0x00, 0x10, 0x07, 0xeb, 0xc0, 0x00, 0x00, 0x69, 0x00, 0x68, 0x80, 0x47, + 0x21, 0x78, 0x5c, 0x26, 0x00, 0x20, 0x11, 0xfb, 0x06, 0x82, 0x82, 0xf8, + 0x4d, 0x00, 0x90, 0x6b, 0x28, 0xb1, 0xd1, 0x6b, 0xa5, 0x4a, 0x12, 0x68, + 0x52, 0x68, 0x90, 0x47, 0x21, 0x78, 0x11, 0xfb, 0x06, 0x80, 0x01, 0xeb, + 0x01, 0x11, 0xd0, 0xe9, 0x07, 0x20, 0x07, 0xeb, 0xc1, 0x01, 0x57, 0x46, + 0xc1, 0xe9, 0x1a, 0x20, 0x40, 0xf2, 0xff, 0x30, 0x28, 0x60, 0x9d, 0x48, + 0x28, 0x61, 0x06, 0xe0, 0x40, 0xf2, 0xff, 0x31, 0x00, 0x28, 0x29, 0x60, + 0x99, 0x49, 0x29, 0x61, 0x5a, 0xd0, 0x20, 0x78, 0x5c, 0x21, 0x10, 0xfb, + 0x01, 0x80, 0x90, 0xf8, 0x26, 0x00, 0x00, 0x28, 0x52, 0xd1, 0xe8, 0x69, + 0x40, 0x00, 0x4f, 0xd4, 0x93, 0x48, 0x00, 0x68, 0x80, 0x47, 0x93, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x26, 0x78, 0x92, 0x49, 0x92, 0x4a, 0x06, 0xeb, + 0x86, 0x00, 0x01, 0xeb, 0xc0, 0x00, 0xc1, 0x69, 0x11, 0x60, 0x28, 0x21, + 0xef, 0xf7, 0x0c, 0xfa, 0x06, 0xeb, 0x06, 0x10, 0x7f, 0x4e, 0x06, 0xeb, + 0xc0, 0x00, 0x00, 0x69, 0x40, 0x68, 0x80, 0x47, 0x00, 0x28, 0x00, 0xf0, + 0xbe, 0x80, 0x28, 0x6e, 0x00, 0xb2, 0x00, 0x28, 0x00, 0xf1, 0xb9, 0x80, + 0x86, 0x48, 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, 0x85, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x20, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x09, 0xeb, 0xc0, 0x00, + 0x01, 0x69, 0x49, 0x69, 0x88, 0x47, 0xfe, 0xf7, 0x09, 0xfc, 0x20, 0xb1, + 0x73, 0x48, 0x00, 0x88, 0x40, 0xf0, 0xd6, 0x00, 0x38, 0x60, 0x20, 0x78, + 0x5c, 0x21, 0x10, 0xfb, 0x01, 0x80, 0xc0, 0x6a, 0x00, 0x28, 0x00, 0xf0, + 0xaf, 0x80, 0x80, 0x47, 0x00, 0x28, 0x00, 0xf0, 0xab, 0x80, 0x77, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x20, 0x78, 0x5c, 0x21, 0x01, 0x22, 0x10, 0xfb, + 0x01, 0x81, 0x81, 0xf8, 0x4d, 0x20, 0xa3, 0xe0, 0x07, 0xe0, 0x00, 0xbf, + 0xd0, 0x10, 0x21, 0x40, 0x40, 0xf2, 0xff, 0x30, 0x28, 0x60, 0x67, 0x48, + 0x28, 0x61, 0x00, 0x20, 0x45, 0xf8, 0xb0, 0x0c, 0x5c, 0x20, 0x25, 0x78, + 0x15, 0xfb, 0x00, 0x80, 0x90, 0xf8, 0x27, 0x10, 0x01, 0x29, 0x4d, 0xd1, + 0x01, 0x21, 0x80, 0xf8, 0x4d, 0x10, 0xfe, 0xf7, 0xd3, 0xfb, 0x28, 0xb1, + 0x58, 0x48, 0x00, 0x88, 0x40, 0xf0, 0xd7, 0x00, 0x38, 0x60, 0x25, 0x78, + 0xc5, 0xeb, 0x45, 0x10, 0x09, 0xeb, 0xc0, 0x00, 0x00, 0x69, 0x80, 0x69, + 0x80, 0x47, 0xc8, 0xb3, 0x00, 0xf0, 0xec, 0xf8, 0xfe, 0xf7, 0xc0, 0xfb, + 0x20, 0xb1, 0x4f, 0x48, 0x00, 0x88, 0x40, 0xf0, 0xd8, 0x00, 0x38, 0x60, + 0x4f, 0x48, 0x00, 0x68, 0x80, 0x47, 0x20, 0x78, 0x46, 0x4d, 0x00, 0xeb, + 0x00, 0x10, 0x05, 0xeb, 0xc0, 0x00, 0x00, 0x69, 0x00, 0x68, 0x80, 0x47, + 0x20, 0x78, 0x00, 0xeb, 0x00, 0x11, 0x05, 0xeb, 0xc1, 0x01, 0x91, 0xf8, + 0x49, 0x10, 0x01, 0xf0, 0xfe, 0x01, 0x60, 0x29, 0x05, 0xd0, 0x00, 0x20, + 0x4f, 0xf4, 0xee, 0x71, 0xf2, 0xf7, 0x3c, 0xfe, 0x20, 0x78, 0x00, 0xeb, + 0x00, 0x10, 0x01, 0x21, 0x05, 0xeb, 0xc0, 0x00, 0x80, 0xf8, 0x48, 0x10, + 0xfe, 0xf7, 0x94, 0xfb, 0x20, 0xb1, 0x39, 0x48, 0x00, 0x88, 0x40, 0xf0, + 0x81, 0x00, 0x38, 0x60, 0x00, 0xf0, 0xc8, 0xf8, 0xbd, 0xe8, 0xfc, 0x87, + 0xfe, 0xf7, 0x88, 0xfb, 0x20, 0xb1, 0x33, 0x48, 0x00, 0x88, 0x40, 0xf0, + 0xd5, 0x00, 0x38, 0x60, 0x20, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x09, 0xeb, + 0xc0, 0x00, 0x01, 0x69, 0x49, 0x69, 0x88, 0x47, 0x24, 0x78, 0x28, 0x4a, + 0xc4, 0xeb, 0x44, 0x10, 0x04, 0xeb, 0x04, 0x11, 0x02, 0xeb, 0xc1, 0x01, + 0x09, 0xeb, 0xc0, 0x00, 0x88, 0x22, 0x00, 0xf0, 0x8b, 0xff, 0x5c, 0x20, + 0x14, 0xfb, 0x00, 0x80, 0x90, 0xf8, 0x4d, 0x00, 0xb0, 0xfa, 0x80, 0xf0, + 0x40, 0x09, 0x00, 0xf0, 0xb1, 0xf8, 0xbd, 0xe8, 0xfc, 0x87, 0x28, 0x6e, + 0x00, 0xb2, 0xb0, 0xf1, 0xff, 0x3f, 0x3f, 0xf7, 0x78, 0xaf, 0x20, 0x78, + 0x00, 0xeb, 0x00, 0x10, 0x06, 0xeb, 0xc0, 0x00, 0xc0, 0x68, 0x00, 0x28, + 0x3f, 0xf4, 0x6f, 0xaf, 0xb0, 0xf8, 0xb4, 0x10, 0x01, 0x31, 0xa0, 0xf8, + 0xb4, 0x10, 0x68, 0xe7, 0x22, 0x48, 0x00, 0x68, 0x80, 0x47, 0x20, 0x78, + 0x5c, 0x25, 0x00, 0x26, 0x10, 0xfb, 0x05, 0x80, 0xc6, 0x62, 0x00, 0xf0, + 0x4b, 0xf8, 0x20, 0x78, 0x10, 0xfb, 0x05, 0x80, 0x00, 0x6b, 0x00, 0x28, + 0x3f, 0xf4, 0x3d, 0xae, 0x80, 0x47, 0x20, 0x78, 0x10, 0xfb, 0x05, 0x80, + 0x06, 0x63, 0xbd, 0xe8, 0xfc, 0x87, 0x00, 0xbf, 0x2c, 0x50, 0x03, 0x00, + 0x40, 0x36, 0x01, 0x00, 0x74, 0x87, 0x08, 0x00, 0x0c, 0x6f, 0x01, 0x00, + 0x8c, 0xa1, 0x08, 0x00, 0xfc, 0x6d, 0x01, 0x00, 0x5c, 0xa1, 0x08, 0x00, + 0x54, 0xa1, 0x08, 0x00, 0x04, 0x08, 0x00, 0x40, 0x26, 0x21, 0x01, 0x00, + 0x44, 0x4f, 0x01, 0x00, 0x88, 0xa1, 0x08, 0x00, 0x74, 0xa1, 0x08, 0x00, + 0xe4, 0x35, 0x01, 0x00, 0xf3, 0xf3, 0xff, 0x1f, 0x70, 0xa1, 0x08, 0x00, + 0x68, 0xa1, 0x08, 0x00, 0x84, 0x71, 0x01, 0x00, 0x0c, 0x36, 0x01, 0x00, + 0xf8, 0xa0, 0x08, 0x00, 0x94, 0xa1, 0x08, 0x00, 0x28, 0xbd, 0x08, 0x00, + 0x50, 0xbd, 0x08, 0x00, 0x04, 0x48, 0x00, 0x68, 0x00, 0xf0, 0x1f, 0x00, + 0x1f, 0x28, 0x18, 0xbf, 0x70, 0x47, 0x02, 0x48, 0x00, 0x68, 0x00, 0x47, + 0x00, 0x1b, 0x21, 0x40, 0x90, 0xa1, 0x08, 0x00, 0x10, 0xb5, 0xbb, 0x48, + 0x0d, 0x49, 0x04, 0x78, 0x0b, 0x48, 0x00, 0x68, 0x41, 0xf8, 0x24, 0x00, + 0xfe, 0xf7, 0xec, 0xfa, 0x70, 0xb1, 0xba, 0x48, 0x5c, 0x21, 0x14, 0xfb, + 0x01, 0x00, 0xe1, 0x21, 0x90, 0xf8, 0x4e, 0x00, 0x00, 0x28, 0xbf, 0x48, + 0x08, 0xbf, 0xe2, 0x21, 0x00, 0x88, 0x08, 0x43, 0xbd, 0x49, 0x08, 0x60, + 0x10, 0xbd, 0x00, 0xbf, 0xc0, 0xbe, 0x08, 0x00, 0xc0, 0x5d, 0x01, 0x00, + 0xb0, 0xb5, 0xab, 0x48, 0x5c, 0x21, 0x05, 0x78, 0xad, 0x48, 0x15, 0xfb, + 0x01, 0x04, 0x5c, 0x21, 0x20, 0x46, 0xef, 0xf7, 0xad, 0xf8, 0xb0, 0x48, + 0x90, 0xf8, 0xc9, 0x01, 0x68, 0x40, 0x84, 0xf8, 0x52, 0x00, 0xb0, 0xbd, + 0xa2, 0x48, 0xa3, 0x49, 0x00, 0x78, 0x00, 0xeb, 0x00, 0x10, 0x01, 0xeb, + 0xc0, 0x00, 0x04, 0x49, 0x90, 0xf8, 0x49, 0x00, 0xc0, 0xf3, 0x42, 0x10, + 0x51, 0xf8, 0x20, 0x00, 0x00, 0x47, 0x00, 0xbf, 0xb8, 0xe6, 0x08, 0x00, + 0x10, 0xb5, 0x04, 0x46, 0xfe, 0xf7, 0xae, 0xfa, 0x28, 0xb1, 0xa4, 0x48, + 0xa4, 0x49, 0x00, 0x88, 0x40, 0xf0, 0xe3, 0x00, 0x08, 0x60, 0x03, 0x48, + 0x01, 0x68, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x08, 0x47, 0x00, 0xbf, + 0x0c, 0xa1, 0x08, 0x00, 0xb0, 0xb5, 0x8f, 0x4c, 0x29, 0x4d, 0x20, 0x78, + 0x00, 0xeb, 0x80, 0x01, 0x05, 0xeb, 0x41, 0x11, 0x89, 0x6d, 0x6f, 0xf3, + 0x9f, 0x51, 0x79, 0xb1, 0x25, 0x4a, 0x04, 0x32, 0x91, 0x42, 0x03, 0xd0, + 0x08, 0x1f, 0xf2, 0xf7, 0x47, 0xfd, 0x20, 0x78, 0x00, 0xeb, 0x80, 0x00, + 0x00, 0x21, 0x05, 0xeb, 0x40, 0x10, 0x80, 0xf8, 0x9c, 0x10, 0x81, 0x65, + 0x00, 0xf0, 0xa4, 0xfe, 0x0a, 0x48, 0x01, 0x68, 0x2d, 0x20, 0x88, 0x47, + 0x70, 0xb1, 0x21, 0x78, 0x01, 0x22, 0x04, 0x30, 0x29, 0x23, 0x63, 0xf3, + 0x9f, 0x50, 0x01, 0xeb, 0x81, 0x01, 0x05, 0xeb, 0x41, 0x11, 0x81, 0xf8, + 0x9c, 0x20, 0x00, 0x22, 0xc1, 0xe9, 0x16, 0x02, 0xb0, 0xbd, 0x00, 0xbf, + 0xd4, 0x9b, 0x08, 0x00, 0xb0, 0xb5, 0x74, 0x4d, 0x0e, 0x4c, 0x28, 0x78, + 0x00, 0xeb, 0x80, 0x01, 0x04, 0xeb, 0x41, 0x11, 0x89, 0x6d, 0x6f, 0xf3, + 0x9f, 0x51, 0x79, 0xb1, 0x0a, 0x4a, 0x04, 0x32, 0x91, 0x42, 0x03, 0xd0, + 0x08, 0x1f, 0xf2, 0xf7, 0x11, 0xfd, 0x28, 0x78, 0x00, 0xeb, 0x80, 0x00, + 0x00, 0x21, 0x04, 0xeb, 0x40, 0x10, 0x80, 0xf8, 0x9c, 0x10, 0x81, 0x65, + 0xbd, 0xe8, 0xb0, 0x40, 0x00, 0xf0, 0x72, 0xbe, 0xbc, 0x65, 0x01, 0x00, + 0x4c, 0x51, 0x01, 0x00, 0x80, 0x48, 0x01, 0x68, 0x41, 0xf0, 0x01, 0x01, + 0x01, 0x60, 0x00, 0xf0, 0x6d, 0xbe, 0x00, 0xbf, 0x2d, 0xe9, 0xf0, 0x4f, + 0x8d, 0xb0, 0x5b, 0x4c, 0x20, 0x78, 0x08, 0x28, 0x05, 0xd1, 0x6a, 0x48, + 0x00, 0x68, 0x0d, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, 0x00, 0x47, 0x57, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x56, 0x48, 0x57, 0x49, 0x00, 0x78, 0x00, 0xeb, + 0x00, 0x10, 0x01, 0xeb, 0xc0, 0x00, 0x00, 0x69, 0x00, 0x68, 0x80, 0x47, + 0x70, 0x48, 0x00, 0x68, 0x38, 0xb1, 0x70, 0x49, 0x0a, 0x68, 0x01, 0x32, + 0x0a, 0x60, 0x82, 0x42, 0x04, 0xbf, 0x08, 0x20, 0x20, 0x70, 0x4e, 0x4d, + 0x40, 0xf2, 0xff, 0x30, 0x5c, 0x22, 0x4e, 0x4b, 0x28, 0x60, 0x4c, 0x48, + 0x28, 0x61, 0x48, 0x48, 0x00, 0x78, 0x10, 0xfb, 0x02, 0xf1, 0x5c, 0x5c, + 0x02, 0x21, 0x05, 0x2c, 0x03, 0xd3, 0x02, 0x21, 0x0a, 0x2c, 0x38, 0xbf, + 0x03, 0x21, 0x10, 0xfb, 0x02, 0x30, 0x46, 0x4a, 0x05, 0x91, 0x90, 0xf8, + 0x4f, 0x00, 0x12, 0x68, 0x90, 0x47, 0x47, 0x4c, 0x04, 0x90, 0x06, 0xa8, + 0xdf, 0xf8, 0x08, 0xa1, 0xdf, 0xf8, 0x08, 0x91, 0x42, 0x4f, 0x40, 0xf2, + 0x71, 0x28, 0x4f, 0xf0, 0x00, 0x0b, 0x02, 0x30, 0xa6, 0x1c, 0x03, 0x90, + 0xd9, 0xf8, 0x00, 0x20, 0xda, 0xf8, 0x00, 0x30, 0xb2, 0xf8, 0x68, 0x10, + 0x92, 0xf8, 0x8b, 0x00, 0x92, 0xf8, 0x9c, 0x20, 0x98, 0x47, 0x55, 0xf8, + 0xac, 0x1c, 0x08, 0x44, 0xd9, 0xf8, 0x00, 0x10, 0x91, 0xf8, 0xc0, 0x10, + 0x11, 0xfb, 0x08, 0x00, 0x45, 0xf8, 0xac, 0x0c, 0xc5, 0xf8, 0x74, 0xb0, + 0x00, 0x20, 0x39, 0x68, 0x88, 0x47, 0x20, 0x78, 0xf0, 0xb1, 0x32, 0x48, + 0x90, 0xf8, 0xca, 0x01, 0x02, 0x28, 0x19, 0xd1, 0x03, 0x98, 0x31, 0x46, + 0x0a, 0x22, 0x00, 0xf0, 0xfb, 0xfd, 0xf0, 0x48, 0xf0, 0x4a, 0x5c, 0x21, + 0x01, 0x23, 0x8d, 0xf8, 0x24, 0xb0, 0x8d, 0xf8, 0x19, 0x30, 0x00, 0x78, + 0x10, 0xfb, 0x01, 0x20, 0x90, 0xf8, 0x4f, 0x20, 0x02, 0x20, 0xcd, 0xe9, + 0x00, 0x03, 0x06, 0xa8, 0xdd, 0xe9, 0x04, 0x13, 0x27, 0xf0, 0x66, 0xfd, + 0x28, 0x6e, 0x00, 0xb2, 0x00, 0x28, 0xbf, 0xd4, 0x21, 0x48, 0x00, 0x68, + 0x80, 0x47, 0xe2, 0x4d, 0xeb, 0x49, 0xec, 0x4a, 0x2c, 0x78, 0x04, 0xeb, + 0x84, 0x00, 0x01, 0xeb, 0xc0, 0x00, 0xc1, 0x69, 0x11, 0x60, 0x28, 0x21, + 0xee, 0xf7, 0x7e, 0xff, 0xdd, 0x49, 0x04, 0xeb, 0x04, 0x10, 0x01, 0xeb, + 0xc0, 0x00, 0x00, 0x69, 0x40, 0x68, 0x80, 0x47, 0x28, 0x78, 0xf8, 0x49, + 0x15, 0x4a, 0x41, 0xf8, 0x20, 0x20, 0xfe, 0xf7, 0x8d, 0xf9, 0x28, 0xb1, + 0x13, 0x48, 0x14, 0x49, 0x00, 0x88, 0x40, 0xf0, 0xe7, 0x00, 0x08, 0x60, + 0x0d, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0xbf, 0x61, 0x34, 0x01, 0x00, + 0x74, 0xa1, 0x08, 0x00, 0x74, 0x87, 0x08, 0x00, 0xfc, 0x6d, 0x01, 0x00, + 0xd0, 0x10, 0x21, 0x40, 0xf3, 0xf3, 0xff, 0x1f, 0x44, 0x4f, 0x01, 0x00, + 0x38, 0x9c, 0x08, 0x00, 0xdc, 0xbc, 0x08, 0x00, 0xf8, 0x35, 0x01, 0x00, + 0xb8, 0xbe, 0x08, 0x00, 0x58, 0xf0, 0x05, 0x00, 0x00, 0x69, 0x08, 0x00, + 0x4c, 0xbd, 0x08, 0x00, 0x35, 0x3c, 0x03, 0x00, 0x26, 0x21, 0x01, 0x00, + 0x04, 0x08, 0x00, 0x40, 0x48, 0xbd, 0x08, 0x00, 0x10, 0xb5, 0x0d, 0x48, + 0x01, 0x68, 0x21, 0xf0, 0x01, 0x01, 0x01, 0x60, 0x0b, 0x48, 0x00, 0x68, + 0x68, 0xb1, 0x0b, 0x49, 0x09, 0x68, 0x81, 0x42, 0x09, 0xd1, 0x0a, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x09, 0x4c, 0x20, 0x68, 0x18, 0xb1, 0xf2, 0xf7, + 0x05, 0xfc, 0x00, 0x20, 0x20, 0x60, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, + 0x7f, 0xbd, 0x00, 0xbf, 0x5c, 0x11, 0x21, 0x40, 0x7c, 0x51, 0x01, 0x00, + 0x44, 0x36, 0x01, 0x00, 0x14, 0x8f, 0x08, 0x00, 0x04, 0x36, 0x01, 0x00, + 0x2d, 0xe9, 0xfe, 0x4f, 0xf0, 0x48, 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, + 0xa5, 0x48, 0x41, 0xf2, 0x01, 0x01, 0xdf, 0xf8, 0x94, 0xa2, 0xdf, 0xf8, + 0x94, 0x82, 0xa5, 0x4f, 0x01, 0x60, 0x5c, 0x20, 0x9a, 0xf8, 0x00, 0x10, + 0x11, 0xfb, 0x00, 0x80, 0x01, 0xeb, 0x01, 0x11, 0x50, 0xf8, 0x1c, 0x2f, + 0x07, 0xeb, 0xc1, 0x01, 0x43, 0x68, 0xc1, 0xe9, 0x1a, 0x23, 0x9e, 0x49, + 0x0a, 0x68, 0x01, 0xa9, 0x90, 0x47, 0x9d, 0x4e, 0x01, 0x98, 0x30, 0x60, + 0x9d, 0xf8, 0x08, 0x00, 0x70, 0x60, 0x4f, 0xf4, 0xd1, 0x70, 0xc6, 0xf8, + 0xb0, 0x00, 0x99, 0x48, 0xc6, 0xf8, 0xc0, 0x00, 0x98, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x98, 0x48, 0x00, 0x68, 0x00, 0xb1, 0x80, 0x47, 0x97, 0x48, + 0x4f, 0xf0, 0x00, 0x0b, 0x01, 0x68, 0x00, 0x20, 0x88, 0x47, 0x95, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x9a, 0xf8, 0x00, 0x40, 0xdf, 0xf8, 0x4c, 0x92, + 0x93, 0x4a, 0x04, 0xeb, 0x84, 0x00, 0x09, 0xeb, 0xc0, 0x00, 0xc1, 0x69, + 0x11, 0x60, 0x28, 0x21, 0xee, 0xf7, 0xce, 0xfe, 0x04, 0xeb, 0x04, 0x10, + 0x07, 0xeb, 0xc0, 0x00, 0x00, 0x69, 0x40, 0x68, 0x80, 0x47, 0x9a, 0xf8, + 0x00, 0x50, 0x04, 0x46, 0x05, 0xeb, 0x05, 0x10, 0x07, 0xeb, 0xc0, 0x00, + 0x10, 0xf8, 0x48, 0x1f, 0xa1, 0xb1, 0x80, 0xf8, 0x00, 0xb0, 0xfe, 0xf7, + 0xd7, 0xf8, 0x38, 0xb1, 0xc6, 0x48, 0xc7, 0x49, 0x00, 0x88, 0x40, 0xf0, + 0xd5, 0x00, 0x08, 0x60, 0x9a, 0xf8, 0x00, 0x50, 0xbd, 0x49, 0xc5, 0xeb, + 0x45, 0x10, 0x01, 0xeb, 0xc0, 0x00, 0x01, 0x69, 0x49, 0x69, 0x88, 0x47, + 0x00, 0x2c, 0x54, 0xd0, 0xd6, 0xf8, 0x0c, 0x01, 0x00, 0xb2, 0x00, 0x28, + 0x4f, 0xd4, 0x79, 0x48, 0x00, 0x68, 0x80, 0x47, 0x00, 0x28, 0x4a, 0xd0, + 0x9a, 0xf8, 0x00, 0x10, 0x01, 0xeb, 0x01, 0x12, 0x07, 0xeb, 0xc2, 0x00, + 0x57, 0xf8, 0x32, 0x20, 0x00, 0x2a, 0x00, 0xf0, 0xbd, 0x80, 0x5c, 0x22, + 0x73, 0x4b, 0x74, 0x4c, 0x00, 0x90, 0x11, 0xfb, 0x02, 0xf2, 0x01, 0xeb, + 0x81, 0x01, 0x18, 0xf8, 0x02, 0x20, 0x09, 0xeb, 0xc1, 0x01, 0x49, 0x89, + 0x33, 0xf8, 0x12, 0x30, 0xa2, 0x5c, 0x01, 0xfb, 0x02, 0x31, 0x6d, 0x4a, + 0x03, 0x6a, 0x00, 0x20, 0x11, 0x80, 0x96, 0x22, 0x12, 0xfa, 0x81, 0xf1, + 0x6a, 0x4a, 0x11, 0x60, 0xa3, 0x49, 0x04, 0x22, 0x0c, 0x68, 0x00, 0x21, + 0xa0, 0x47, 0x9a, 0xf8, 0x00, 0x10, 0x5c, 0x24, 0x11, 0xfb, 0x04, 0x80, + 0xc0, 0x78, 0x10, 0xb9, 0x64, 0x48, 0x00, 0x68, 0x80, 0x47, 0xff, 0xf7, + 0x8d, 0xfd, 0x63, 0x48, 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, 0x9a, 0xf8, + 0x00, 0x00, 0x10, 0xfb, 0x04, 0x80, 0x00, 0x6b, 0x38, 0xb1, 0x80, 0x47, + 0x9a, 0xf8, 0x00, 0x00, 0x5c, 0x21, 0x10, 0xfb, 0x01, 0x80, 0x00, 0x21, + 0x01, 0x63, 0xbd, 0xe8, 0xfe, 0x8f, 0x9a, 0xf8, 0x00, 0x40, 0x8d, 0x49, + 0x88, 0x22, 0xc4, 0xeb, 0x44, 0x10, 0x01, 0xeb, 0xc0, 0x00, 0x04, 0xeb, + 0x04, 0x11, 0x07, 0xeb, 0xc1, 0x01, 0x00, 0xf0, 0x7f, 0xfc, 0xd6, 0xf8, + 0x0c, 0x01, 0x00, 0xb2, 0xb0, 0xf1, 0xff, 0x3f, 0x2f, 0xdd, 0x47, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x00, 0x28, 0x5e, 0xd1, 0x9a, 0xf8, 0x00, 0x00, + 0x00, 0xeb, 0x00, 0x11, 0x07, 0xeb, 0xc1, 0x01, 0xc9, 0x68, 0x69, 0xb1, + 0xd1, 0xf8, 0x20, 0x22, 0x52, 0xb1, 0x91, 0xf8, 0x2b, 0x02, 0x02, 0xeb, + 0x40, 0x00, 0x02, 0x22, 0x41, 0x78, 0x62, 0xf3, 0x1f, 0x11, 0x41, 0x70, + 0x9a, 0xf8, 0x00, 0x00, 0x00, 0xeb, 0x80, 0x00, 0x09, 0xeb, 0xc0, 0x00, + 0xc1, 0x69, 0x41, 0xf4, 0x00, 0x21, 0xc1, 0x61, 0x00, 0xf0, 0x80, 0xf8, + 0x3d, 0x48, 0x00, 0x22, 0x03, 0x68, 0x3d, 0x48, 0x00, 0x68, 0x00, 0xf1, + 0x19, 0x01, 0x00, 0x20, 0x98, 0x47, 0xbd, 0xe8, 0xfe, 0x8f, 0xfe, 0xf7, + 0x29, 0xf8, 0x38, 0xb1, 0x6f, 0x48, 0x70, 0x49, 0x00, 0x88, 0x40, 0xf0, + 0xe4, 0x00, 0x08, 0x60, 0x9a, 0xf8, 0x00, 0x40, 0x04, 0xeb, 0x04, 0x10, + 0x57, 0xf8, 0x30, 0x10, 0x07, 0xeb, 0xc0, 0x00, 0x99, 0xb1, 0xd1, 0xf8, + 0xcc, 0x21, 0x22, 0xf0, 0x0f, 0x02, 0xc1, 0xf8, 0xcc, 0x21, 0x01, 0x68, + 0xd1, 0xf8, 0xcc, 0x21, 0x42, 0xf0, 0x06, 0x02, 0xc1, 0xf8, 0xcc, 0x21, + 0x01, 0x68, 0x21, 0xb1, 0x91, 0xf8, 0x6e, 0x21, 0x01, 0x32, 0x81, 0xf8, + 0x6e, 0x21, 0xc0, 0x68, 0x58, 0xb1, 0xd0, 0xf8, 0x20, 0x12, 0x41, 0xb1, + 0x90, 0xf8, 0x2b, 0x02, 0x01, 0x22, 0x01, 0xeb, 0x40, 0x00, 0x41, 0x78, + 0x62, 0xf3, 0x1f, 0x11, 0x41, 0x70, 0x01, 0x20, 0xff, 0xf7, 0x42, 0xfd, + 0xbd, 0xe8, 0xfe, 0x8f, 0x13, 0x4b, 0x02, 0x69, 0x1b, 0x68, 0x93, 0x42, + 0x3f, 0xf4, 0x3d, 0xaf, 0x11, 0x4b, 0x1b, 0x68, 0x93, 0x42, 0x7f, 0xf4, + 0x5a, 0xaf, 0x36, 0xe7, 0x40, 0x22, 0x00, 0x40, 0x74, 0x87, 0x08, 0x00, + 0x44, 0x4f, 0x01, 0x00, 0xfc, 0x6d, 0x01, 0x00, 0x58, 0xa1, 0x08, 0x00, + 0x24, 0x10, 0x21, 0x40, 0x40, 0x42, 0x13, 0x01, 0x70, 0xa1, 0x08, 0x00, + 0x14, 0xe6, 0x05, 0x00, 0xb8, 0xbe, 0x08, 0x00, 0x68, 0xa1, 0x08, 0x00, + 0x84, 0x71, 0x01, 0x00, 0x0c, 0x36, 0x01, 0x00, 0x94, 0xb7, 0x08, 0x00, + 0xe4, 0xbc, 0x08, 0x00, 0xf0, 0xbc, 0x08, 0x00, 0xb0, 0x31, 0x0a, 0x10, + 0xc4, 0x31, 0x0a, 0x10, 0x22, 0x21, 0x01, 0x00, 0x38, 0x36, 0x01, 0x00, + 0x50, 0xbd, 0x08, 0x00, 0x90, 0xb7, 0x08, 0x00, 0xdc, 0xa0, 0x08, 0x00, + 0x24, 0x20, 0x00, 0x40, 0x80, 0xb5, 0x72, 0x48, 0x07, 0x49, 0x08, 0x4a, + 0x00, 0x78, 0x09, 0x68, 0x42, 0xf8, 0x20, 0x10, 0xfd, 0xf7, 0xac, 0xff, + 0x28, 0xb1, 0x31, 0x48, 0x31, 0x49, 0x00, 0x88, 0x40, 0xf0, 0xe3, 0x00, + 0x08, 0x60, 0x80, 0xbd, 0x38, 0xbd, 0x08, 0x00, 0xc0, 0x5d, 0x01, 0x00, + 0xbc, 0xb5, 0x04, 0x46, 0x24, 0x48, 0x00, 0x25, 0x01, 0x68, 0x00, 0x20, + 0x88, 0x47, 0x66, 0x48, 0x05, 0x60, 0xc7, 0x48, 0x05, 0x60, 0x8c, 0xb1, + 0x61, 0x48, 0x20, 0x49, 0x00, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x01, 0xeb, + 0xc0, 0x00, 0x00, 0x69, 0x80, 0x69, 0x80, 0x47, 0x04, 0x46, 0xff, 0xf7, + 0xb1, 0xfc, 0x60, 0x48, 0xc0, 0xe9, 0x00, 0x55, 0x5c, 0xb9, 0x04, 0xe0, + 0xff, 0xf7, 0xaa, 0xfc, 0x5c, 0x48, 0xc0, 0xe9, 0x00, 0x55, 0x16, 0x48, + 0xc8, 0x21, 0x02, 0x68, 0x4f, 0xf0, 0xff, 0x30, 0x90, 0x47, 0xff, 0xf7, + 0x71, 0xfc, 0x13, 0x48, 0x00, 0x68, 0x80, 0x47, 0x50, 0x48, 0x53, 0x49, + 0x01, 0x22, 0x00, 0x78, 0x00, 0xeb, 0x00, 0x10, 0x01, 0xeb, 0xc0, 0x00, + 0x0e, 0x49, 0x03, 0x6a, 0x0c, 0x68, 0x00, 0x90, 0x00, 0x20, 0x02, 0x21, + 0xa0, 0x47, 0x0c, 0x48, 0x00, 0x68, 0x80, 0x47, 0xfd, 0xf7, 0x5e, 0xff, + 0x28, 0xb1, 0x0a, 0x48, 0x0a, 0x49, 0x00, 0x88, 0x40, 0xf0, 0x81, 0x00, + 0x08, 0x60, 0xbd, 0xe8, 0xbc, 0x40, 0x8f, 0xe4, 0xf8, 0xa0, 0x08, 0x00, + 0x0c, 0x6f, 0x01, 0x00, 0xcc, 0xa0, 0x08, 0x00, 0x6c, 0xbb, 0x08, 0x00, + 0xf0, 0xa0, 0x08, 0x00, 0xd0, 0xa0, 0x08, 0x00, 0x26, 0x21, 0x01, 0x00, + 0x04, 0x08, 0x00, 0x40, 0x2d, 0xe9, 0xf8, 0x43, 0xdf, 0xf8, 0xe0, 0x80, + 0x5c, 0x23, 0xdf, 0xf8, 0xe0, 0x90, 0x98, 0xf8, 0x00, 0x20, 0x12, 0xfb, + 0x03, 0xf1, 0x19, 0xf8, 0x01, 0x40, 0x02, 0x21, 0x05, 0x2c, 0x02, 0xd3, + 0x0a, 0x2c, 0x38, 0xbf, 0x03, 0x21, 0x12, 0xfb, 0x03, 0x93, 0x00, 0x28, + 0x93, 0xf8, 0x27, 0x50, 0x93, 0xf8, 0x4b, 0x60, 0x96, 0x4b, 0x53, 0xf8, + 0x25, 0xc0, 0x94, 0x4d, 0x55, 0xf8, 0x26, 0x70, 0x91, 0x4d, 0x2b, 0x4e, + 0x55, 0xf8, 0x34, 0x40, 0x18, 0xbf, 0x01, 0x20, 0x08, 0xd0, 0x00, 0x25, + 0xb5, 0xf5, 0xc8, 0x5f, 0x04, 0xd0, 0xd6, 0xf8, 0xe0, 0x3a, 0x01, 0x35, + 0x9b, 0x04, 0xf7, 0xd4, 0x5c, 0x25, 0x00, 0x28, 0x23, 0x4b, 0x12, 0xfb, + 0x05, 0x92, 0x52, 0x68, 0x72, 0x61, 0x4f, 0xf0, 0x21, 0x02, 0x18, 0xbf, + 0x46, 0xf2, 0x31, 0x02, 0x44, 0xea, 0x02, 0x00, 0x38, 0x43, 0x40, 0xea, + 0x0c, 0x00, 0x30, 0x60, 0x98, 0xf8, 0x00, 0x00, 0x00, 0xeb, 0x00, 0x12, + 0x53, 0xf8, 0x32, 0x20, 0x1a, 0xb1, 0x92, 0xf8, 0x24, 0x21, 0x0a, 0x2a, + 0x07, 0xd0, 0x17, 0x4a, 0x10, 0xfb, 0x05, 0x90, 0x90, 0xf8, 0x4f, 0x00, + 0x13, 0x68, 0x02, 0x22, 0x98, 0x47, 0x14, 0x48, 0x00, 0x79, 0x50, 0xb9, + 0x98, 0xf8, 0x00, 0x00, 0x5c, 0x21, 0x10, 0xfb, 0x01, 0x90, 0x11, 0x49, + 0x90, 0xf8, 0x52, 0x00, 0x0a, 0x68, 0x01, 0x21, 0x90, 0x47, 0x98, 0xf8, + 0x00, 0x00, 0x5c, 0x21, 0x10, 0xfb, 0x01, 0xf0, 0x0c, 0x49, 0x19, 0xf8, + 0x00, 0x00, 0x09, 0x68, 0x88, 0x47, 0x00, 0x20, 0xc6, 0xf8, 0x98, 0x02, + 0xc6, 0xf8, 0xcc, 0x02, 0xbd, 0xe8, 0xf8, 0x83, 0x74, 0x87, 0x08, 0x00, + 0x44, 0x4f, 0x01, 0x00, 0x20, 0x10, 0x21, 0x40, 0xfc, 0x6d, 0x01, 0x00, + 0x6c, 0xa1, 0x08, 0x00, 0x14, 0xe6, 0x05, 0x00, 0x2c, 0xa1, 0x08, 0x00, + 0x78, 0xa1, 0x08, 0x00, 0x2d, 0xe9, 0xfc, 0x47, 0xf5, 0x4c, 0xf6, 0x4d, + 0x5c, 0x26, 0x20, 0x78, 0x10, 0xfb, 0x06, 0x50, 0x90, 0xf8, 0x27, 0x10, + 0x01, 0x29, 0x07, 0xd1, 0x53, 0x49, 0x0a, 0x78, 0x01, 0x2a, 0x03, 0xd1, + 0x00, 0x20, 0x08, 0x70, 0xbd, 0xe8, 0xfc, 0x87, 0x4f, 0x49, 0x00, 0x22, + 0x90, 0xf8, 0x52, 0x00, 0x0a, 0x70, 0x4e, 0x49, 0x0a, 0x68, 0x03, 0x21, + 0x90, 0x47, 0x20, 0x78, 0x10, 0xfb, 0x06, 0x51, 0x4b, 0x4e, 0x49, 0x78, + 0x05, 0x29, 0x03, 0xd3, 0x09, 0x29, 0x01, 0xd8, 0x52, 0x20, 0x08, 0xe0, + 0x5c, 0x21, 0x10, 0xfb, 0x01, 0x50, 0x90, 0xf8, 0x51, 0x00, 0x08, 0xb1, + 0x32, 0x20, 0x00, 0xe0, 0x00, 0x20, 0xc6, 0xf8, 0x18, 0x02, 0x4f, 0xf0, + 0x5c, 0x0a, 0x20, 0x78, 0x10, 0xfb, 0x0a, 0x51, 0x91, 0xf8, 0x27, 0x10, + 0x02, 0x29, 0x43, 0xd0, 0x01, 0x29, 0x43, 0xd1, 0xd9, 0x49, 0x4f, 0xf0, + 0x5c, 0x08, 0x10, 0xfb, 0x08, 0x50, 0x0a, 0x68, 0x1c, 0x30, 0x69, 0x46, + 0x90, 0x47, 0x00, 0x98, 0x70, 0x60, 0x9d, 0xf8, 0x04, 0x00, 0xb0, 0x60, + 0x20, 0x78, 0x10, 0xfb, 0x08, 0x50, 0x90, 0xf8, 0x4e, 0x10, 0x90, 0xf8, + 0x58, 0x20, 0x4f, 0xea, 0xc2, 0x48, 0xd1, 0xb3, 0xdf, 0xf8, 0xc8, 0x90, + 0x40, 0x78, 0xd6, 0xf8, 0xe4, 0x70, 0xd9, 0xf8, 0x00, 0x10, 0x88, 0x47, + 0x87, 0x42, 0x0f, 0xd8, 0x00, 0x20, 0x40, 0xf2, 0x6f, 0x41, 0xf2, 0xf7, + 0xf9, 0xf8, 0x20, 0x78, 0x5c, 0x21, 0x10, 0xfb, 0x01, 0x50, 0xd9, 0xf8, + 0x00, 0x10, 0x40, 0x78, 0x88, 0x47, 0x0a, 0x30, 0xc6, 0xf8, 0xe4, 0x00, + 0xd6, 0xf8, 0xe4, 0x70, 0x20, 0x78, 0x5c, 0x21, 0x10, 0xfb, 0x01, 0x50, + 0xd9, 0xf8, 0x00, 0x10, 0x40, 0x78, 0x88, 0x47, 0x38, 0x1a, 0xc6, 0xf8, + 0xe4, 0x00, 0x48, 0xf0, 0xe3, 0x00, 0x12, 0xe0, 0x1c, 0x48, 0x10, 0xe0, + 0x5c, 0x21, 0x10, 0xfb, 0x01, 0x50, 0xb6, 0x49, 0x1c, 0x30, 0x0a, 0x68, + 0x69, 0x46, 0x90, 0x47, 0x00, 0x98, 0x70, 0x60, 0x9d, 0xf8, 0x04, 0x00, + 0xb0, 0x60, 0x17, 0x48, 0x01, 0xe0, 0x08, 0xf1, 0x23, 0x00, 0x21, 0x78, + 0x15, 0x4b, 0x16, 0x4f, 0x11, 0xfb, 0x0a, 0x51, 0x4a, 0x78, 0x03, 0xeb, + 0xc2, 0x02, 0x4b, 0x68, 0x52, 0x68, 0x73, 0x61, 0x91, 0xf8, 0x4c, 0x30, + 0x10, 0x43, 0x91, 0xf8, 0x27, 0x10, 0x10, 0x4a, 0x57, 0xf8, 0x23, 0x30, + 0x52, 0xf8, 0x21, 0x10, 0x18, 0x43, 0x08, 0x43, 0x0d, 0x49, 0x30, 0x60, + 0x20, 0x78, 0x09, 0x68, 0x10, 0xfb, 0x0a, 0x50, 0x40, 0x6b, 0x88, 0x47, + 0xbd, 0xe8, 0xfc, 0x87, 0x74, 0xe6, 0x05, 0x00, 0xb0, 0xb9, 0x08, 0x00, + 0x70, 0x10, 0x21, 0x40, 0x03, 0x00, 0x08, 0x00, 0xcc, 0xbe, 0x08, 0x00, + 0x23, 0x00, 0x08, 0x00, 0x58, 0x0d, 0x01, 0x00, 0x58, 0xb5, 0x0e, 0x10, + 0xc8, 0xbb, 0x06, 0x10, 0xf0, 0xb9, 0x08, 0x00, 0x2d, 0xe9, 0xfe, 0x43, + 0x8f, 0x48, 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, 0x8e, 0x48, 0x41, 0xf2, + 0x01, 0x01, 0xdf, 0xf8, 0x38, 0x92, 0xdf, 0xf8, 0x38, 0x82, 0xd1, 0x4e, + 0x01, 0x60, 0x5c, 0x20, 0x99, 0xf8, 0x00, 0x10, 0x11, 0xfb, 0x00, 0x80, + 0x01, 0xeb, 0x01, 0x11, 0x50, 0xf8, 0x1c, 0x2f, 0x06, 0xeb, 0xc1, 0x01, + 0x43, 0x68, 0xc1, 0xe9, 0x1a, 0x23, 0x86, 0x49, 0x0a, 0x68, 0x01, 0xa9, + 0x90, 0x47, 0x85, 0x4d, 0x01, 0x98, 0x28, 0x60, 0x9d, 0xf8, 0x08, 0x00, + 0x68, 0x60, 0x4f, 0xf4, 0xd1, 0x70, 0xc5, 0xf8, 0xb0, 0x00, 0x81, 0x48, + 0xc5, 0xf8, 0xc0, 0x00, 0x80, 0x48, 0x00, 0x68, 0x80, 0x47, 0xe6, 0x48, + 0x01, 0x68, 0x00, 0x20, 0x88, 0x47, 0x7e, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x99, 0xf8, 0x00, 0x40, 0x7c, 0x4f, 0x7d, 0x4a, 0x04, 0xeb, 0x84, 0x00, + 0x07, 0xeb, 0xc0, 0x00, 0xc1, 0x69, 0x11, 0x60, 0x28, 0x21, 0xee, 0xf7, + 0x95, 0xfb, 0x04, 0xeb, 0x04, 0x10, 0x06, 0xeb, 0xc0, 0x00, 0x00, 0x69, + 0x40, 0x68, 0x80, 0x47, 0x00, 0x28, 0x79, 0xd0, 0xd5, 0xf8, 0x0c, 0x01, + 0x00, 0xb2, 0x00, 0x28, 0x74, 0xd4, 0x72, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x00, 0x28, 0x6f, 0xd0, 0x99, 0xf8, 0x00, 0x00, 0x5c, 0x25, 0x6f, 0x4a, + 0x6f, 0x4b, 0x10, 0xfb, 0x05, 0xf1, 0x18, 0xf8, 0x01, 0x10, 0x32, 0xf8, + 0x11, 0x20, 0x59, 0x5c, 0x00, 0xeb, 0x80, 0x03, 0x00, 0xeb, 0x00, 0x10, + 0x07, 0xeb, 0xc3, 0x03, 0x06, 0xeb, 0xc0, 0x00, 0x5b, 0x89, 0x00, 0x90, + 0x03, 0xfb, 0x01, 0x21, 0x66, 0x4a, 0x03, 0x6a, 0x00, 0x20, 0x11, 0x80, + 0x65, 0x4a, 0x89, 0xb2, 0x11, 0x60, 0x65, 0x49, 0x04, 0x22, 0x0c, 0x68, + 0x00, 0x21, 0xa0, 0x47, 0xfd, 0xf7, 0x7a, 0xfd, 0x28, 0xb1, 0x62, 0x48, + 0x62, 0x49, 0x00, 0x88, 0x40, 0xf0, 0xd6, 0x00, 0x08, 0x60, 0x99, 0xf8, + 0x00, 0x70, 0x17, 0xfb, 0x05, 0x80, 0xc1, 0x6a, 0x49, 0xb1, 0x88, 0x47, + 0x99, 0xf8, 0x00, 0x70, 0x28, 0xb1, 0x5c, 0x20, 0x01, 0x21, 0x17, 0xfb, + 0x00, 0x80, 0x80, 0xf8, 0x4d, 0x10, 0x5c, 0x25, 0x00, 0x21, 0x88, 0x22, + 0x17, 0xfb, 0x05, 0x80, 0xc1, 0x62, 0x76, 0x49, 0xc7, 0xeb, 0x47, 0x10, + 0x01, 0xeb, 0xc0, 0x00, 0x07, 0xeb, 0x07, 0x11, 0x06, 0xeb, 0xc1, 0x01, + 0x00, 0xf0, 0x70, 0xf9, 0x50, 0x48, 0x51, 0x49, 0x00, 0x68, 0x41, 0xf8, + 0x27, 0x00, 0xfd, 0xf7, 0x4b, 0xfd, 0x28, 0xb1, 0x4a, 0x48, 0x4b, 0x49, + 0x00, 0x88, 0x40, 0xf0, 0xe2, 0x00, 0x08, 0x60, 0x4b, 0x48, 0x01, 0x68, + 0x01, 0x20, 0x88, 0x47, 0x99, 0xf8, 0x00, 0x00, 0x10, 0xfb, 0x05, 0x80, + 0x00, 0x6b, 0x38, 0xb1, 0x80, 0x47, 0x99, 0xf8, 0x00, 0x00, 0x5c, 0x21, + 0x10, 0xfb, 0x01, 0x80, 0x00, 0x21, 0x01, 0x63, 0xbd, 0xe8, 0xfe, 0x83, + 0x99, 0xf8, 0x00, 0x40, 0x5e, 0x49, 0x88, 0x22, 0xc4, 0xeb, 0x44, 0x10, + 0x01, 0xeb, 0xc0, 0x00, 0x04, 0xeb, 0x04, 0x11, 0x06, 0xeb, 0xc1, 0x01, + 0x00, 0xf0, 0x40, 0xf9, 0xd5, 0xf8, 0x0c, 0x01, 0x00, 0xb2, 0xb0, 0xf1, + 0xff, 0x3f, 0x25, 0xdc, 0xfd, 0xf7, 0x1a, 0xfd, 0x38, 0xb1, 0x32, 0x48, + 0x32, 0x49, 0x00, 0x88, 0x40, 0xf0, 0xe4, 0x00, 0x08, 0x60, 0x99, 0xf8, + 0x00, 0x40, 0x04, 0xeb, 0x04, 0x11, 0x56, 0xf8, 0x31, 0x00, 0xa8, 0xb1, + 0xd0, 0xf8, 0xcc, 0x21, 0x06, 0xeb, 0xc1, 0x01, 0x22, 0xf0, 0x0f, 0x02, + 0xc0, 0xf8, 0xcc, 0x21, 0x08, 0x68, 0xd0, 0xf8, 0xcc, 0x21, 0x42, 0xf0, + 0x06, 0x02, 0xc0, 0xf8, 0xcc, 0x21, 0x08, 0x68, 0x20, 0xb1, 0x90, 0xf8, + 0x6e, 0x11, 0x01, 0x31, 0x80, 0xf8, 0x6e, 0x11, 0x1a, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x20, 0xb1, 0x01, 0x20, 0xff, 0xf7, 0x3d, 0xfa, 0xbd, 0xe8, + 0xfe, 0x83, 0x99, 0xf8, 0x00, 0x00, 0x00, 0xeb, 0x80, 0x00, 0x07, 0xeb, + 0xc0, 0x00, 0xc1, 0x69, 0x41, 0xf4, 0x00, 0x21, 0xc1, 0x61, 0xff, 0xf7, + 0x2b, 0xfd, 0x1b, 0x48, 0x00, 0x22, 0x03, 0x68, 0x1a, 0x48, 0x00, 0x68, + 0x00, 0xf1, 0x19, 0x01, 0x00, 0x20, 0x98, 0x47, 0xbd, 0xe8, 0xfe, 0x83, + 0xf8, 0xa0, 0x08, 0x00, 0x40, 0x22, 0x00, 0x40, 0x74, 0x87, 0x08, 0x00, + 0x44, 0x4f, 0x01, 0x00, 0x58, 0xa1, 0x08, 0x00, 0x24, 0x10, 0x21, 0x40, + 0x40, 0x42, 0x13, 0x01, 0x70, 0xa1, 0x08, 0x00, 0x68, 0xa1, 0x08, 0x00, + 0x84, 0x71, 0x01, 0x00, 0x0c, 0x36, 0x01, 0x00, 0x94, 0xb7, 0x08, 0x00, + 0xb0, 0x31, 0x0a, 0x10, 0xc4, 0x31, 0x0a, 0x10, 0x22, 0x21, 0x01, 0x00, + 0x38, 0x36, 0x01, 0x00, 0xf0, 0xa0, 0x08, 0x00, 0x26, 0x21, 0x01, 0x00, + 0x04, 0x08, 0x00, 0x40, 0xbc, 0xbe, 0x08, 0x00, 0xc0, 0x5d, 0x01, 0x00, + 0x90, 0xb7, 0x08, 0x00, 0xdc, 0xa0, 0x08, 0x00, 0x24, 0x20, 0x00, 0x40, + 0x19, 0x48, 0x81, 0x69, 0x49, 0x06, 0x13, 0xd5, 0x2b, 0x49, 0x6f, 0xf0, + 0xfc, 0x22, 0x09, 0x78, 0x02, 0x60, 0x40, 0x22, 0x02, 0x61, 0x15, 0x4a, + 0xc1, 0xeb, 0x41, 0x11, 0x02, 0xeb, 0xc1, 0x01, 0x00, 0x22, 0xa1, 0xf8, + 0xdc, 0x20, 0xc0, 0x69, 0xb0, 0xf1, 0xff, 0x3f, 0xc8, 0xbf, 0x70, 0x47, + 0x00, 0xf0, 0xce, 0xb8, 0x0c, 0x48, 0x81, 0x69, 0x49, 0x06, 0x13, 0xd5, + 0x1e, 0x49, 0x6f, 0xf0, 0xfc, 0x22, 0x09, 0x78, 0x02, 0x60, 0x40, 0x22, + 0x02, 0x61, 0x08, 0x4a, 0xc1, 0xeb, 0x41, 0x11, 0x02, 0xeb, 0xc1, 0x01, + 0x00, 0x22, 0xa1, 0xf8, 0xdc, 0x20, 0xc0, 0x69, 0xb0, 0xf1, 0xff, 0x3f, + 0xc8, 0xbf, 0x70, 0x47, 0x00, 0xf0, 0xba, 0xb8, 0xd0, 0x10, 0x21, 0x40, + 0x0c, 0x6f, 0x01, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0xb9, 0xf8, 0x0f, 0x48, + 0x00, 0x68, 0xb0, 0xf1, 0xff, 0x3f, 0x00, 0xdd, 0x80, 0xbd, 0x0d, 0x48, + 0x0d, 0x49, 0x00, 0x78, 0x00, 0xeb, 0x00, 0x10, 0x01, 0xeb, 0xc0, 0x00, + 0xc0, 0x68, 0x00, 0x28, 0xf4, 0xd0, 0xd0, 0xf8, 0x24, 0x12, 0x00, 0x29, + 0xf0, 0xd0, 0x90, 0xf8, 0x2b, 0x02, 0x01, 0x22, 0x01, 0xeb, 0x40, 0x00, + 0x41, 0x78, 0x62, 0xf3, 0x1f, 0x11, 0x41, 0x70, 0x80, 0xbd, 0x00, 0xbf, + 0x30, 0x11, 0x21, 0x40, 0x74, 0x87, 0x08, 0x00, 0xfc, 0x6d, 0x01, 0x00, + 0x15, 0x48, 0x16, 0x49, 0x01, 0x60, 0x16, 0x48, 0x16, 0x49, 0x01, 0x60, + 0x16, 0x48, 0x17, 0x49, 0x01, 0x60, 0x17, 0x48, 0x17, 0x49, 0x01, 0x60, + 0x17, 0x48, 0x18, 0x49, 0x01, 0x60, 0x18, 0x48, 0x18, 0x49, 0x01, 0x60, + 0x18, 0x48, 0x19, 0x49, 0x01, 0x60, 0x19, 0x48, 0x19, 0x49, 0x01, 0x60, + 0x19, 0x48, 0x1a, 0x49, 0x01, 0x60, 0x1a, 0x48, 0x1a, 0x49, 0x01, 0x60, + 0x1a, 0x48, 0x1b, 0x49, 0x01, 0x60, 0x1b, 0x48, 0x1b, 0x49, 0x01, 0x60, + 0x1b, 0x48, 0x1c, 0x49, 0x01, 0x60, 0x1c, 0x48, 0x1c, 0x49, 0x01, 0x60, + 0x70, 0x47, 0x00, 0xbf, 0x24, 0xbd, 0x08, 0x00, 0x49, 0x42, 0x03, 0x00, + 0xc8, 0xbe, 0x08, 0x00, 0x75, 0x3c, 0x03, 0x00, 0x30, 0xbd, 0x08, 0x00, + 0xb5, 0x42, 0x03, 0x00, 0x18, 0xbd, 0x08, 0x00, 0xfd, 0x42, 0x03, 0x00, + 0x3c, 0xbd, 0x08, 0x00, 0x0d, 0x43, 0x03, 0x00, 0x48, 0xbd, 0x08, 0x00, + 0xc9, 0x44, 0x03, 0x00, 0x14, 0xbd, 0x08, 0x00, 0x15, 0x45, 0x03, 0x00, + 0x0c, 0xa1, 0x08, 0x00, 0x45, 0x48, 0x03, 0x00, 0xb8, 0xbe, 0x08, 0x00, + 0xfd, 0x48, 0x03, 0x00, 0x28, 0xbd, 0x08, 0x00, 0x05, 0x4a, 0x03, 0x00, + 0x1c, 0xbd, 0x08, 0x00, 0x95, 0x4b, 0x03, 0x00, 0x34, 0xbd, 0x08, 0x00, + 0x39, 0x4e, 0x03, 0x00, 0x2c, 0xbd, 0x08, 0x00, 0x6d, 0x4e, 0x03, 0x00, + 0x10, 0xbd, 0x08, 0x00, 0xa9, 0x4e, 0x03, 0x00, 0x4b, 0xf2, 0x93, 0x4c, + 0xc1, 0xf2, 0x12, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x48, 0xf6, 0x17, 0x5c, + 0xc1, 0xf2, 0x06, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x49, 0xf2, 0xa5, 0x1c, + 0xc1, 0xf2, 0x06, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4a, 0xf2, 0x15, 0x4c, + 0xc1, 0xf2, 0x06, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4b, 0xf2, 0x7f, 0x4c, + 0xc1, 0xf2, 0x12, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4a, 0xf6, 0x2b, 0x0c, + 0xc1, 0xf2, 0x06, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x49, 0xf2, 0x3d, 0x6c, + 0xc1, 0xf2, 0x06, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x48, 0xf6, 0xa7, 0x6c, + 0xc1, 0xf2, 0x06, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4b, 0xf6, 0x51, 0x0c, + 0xc1, 0xf2, 0x06, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x07, 0x00, 0x00, 0x03, 0x4a, 0x13, 0x68, 0x02, 0x22, 0x18, 0x47, + 0x01, 0x4a, 0x13, 0x68, 0x03, 0x22, 0x18, 0x47, 0xb8, 0xfc, 0x08, 0x00, + 0x03, 0x48, 0x04, 0x49, 0x01, 0x60, 0x04, 0x48, 0x04, 0x49, 0x01, 0x60, + 0x70, 0x47, 0x00, 0xbf, 0x9c, 0xbe, 0x08, 0x00, 0x3d, 0x50, 0x03, 0x00, + 0x2c, 0xa1, 0x08, 0x00, 0x35, 0x50, 0x03, 0x00, 0xb0, 0xb5, 0x04, 0x46, + 0x00, 0x79, 0x40, 0x07, 0x42, 0xd5, 0x20, 0x7d, 0x01, 0x28, 0x37, 0xd1, + 0xa0, 0x7e, 0x00, 0xf0, 0xc0, 0x00, 0x40, 0x28, 0x32, 0xd1, 0x2f, 0x48, + 0xa1, 0x79, 0x02, 0x68, 0xe0, 0x1d, 0x01, 0xf0, 0x01, 0x01, 0x90, 0x47, + 0xff, 0x28, 0x1d, 0xd0, 0x2b, 0x49, 0x34, 0x22, 0x09, 0x68, 0x10, 0xfb, + 0x02, 0x15, 0x2a, 0x49, 0x10, 0x22, 0x28, 0x46, 0xfc, 0xf7, 0x8c, 0xf9, + 0x90, 0xb1, 0x28, 0x48, 0x29, 0x46, 0x00, 0x22, 0x03, 0x68, 0x04, 0xf1, + 0x15, 0x00, 0x98, 0x47, 0x50, 0xb1, 0x25, 0x48, 0x90, 0xf8, 0x64, 0x00, + 0x03, 0x28, 0x11, 0xd8, 0xdf, 0xe8, 0x00, 0xf0, 0x02, 0x3a, 0x02, 0x3a, + 0x02, 0x20, 0x0a, 0xe0, 0x20, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, + 0x01, 0x28, 0x03, 0xd1, 0x1e, 0x48, 0x00, 0x78, 0x80, 0x07, 0x21, 0xd4, + 0xfe, 0x20, 0x20, 0x75, 0x1a, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, + 0x01, 0x28, 0x04, 0xbf, 0x00, 0x20, 0xe0, 0x76, 0x18, 0x48, 0xc0, 0x79, + 0x80, 0x06, 0x06, 0xd5, 0x17, 0x48, 0x41, 0x78, 0xc9, 0x06, 0x07, 0xd4, + 0x00, 0x78, 0x80, 0x07, 0x06, 0xd4, 0x20, 0x46, 0xbd, 0xe8, 0xb0, 0x40, + 0xf1, 0xf7, 0xf2, 0xbd, 0x13, 0x48, 0x00, 0xe0, 0x13, 0x48, 0x01, 0x68, + 0x20, 0x46, 0xbd, 0xe8, 0xb0, 0x40, 0x08, 0x47, 0x0c, 0x48, 0xc0, 0x79, + 0x80, 0x06, 0xdb, 0xd5, 0x0b, 0x48, 0x40, 0x78, 0x40, 0x07, 0xd7, 0xd5, + 0x0a, 0x48, 0xf0, 0xe7, 0x03, 0x20, 0xd2, 0xe7, 0x48, 0xc9, 0x08, 0x00, + 0x20, 0x54, 0x01, 0x00, 0x9a, 0xad, 0x09, 0x10, 0xf4, 0xc5, 0x08, 0x00, + 0x90, 0x01, 0x00, 0x00, 0xf8, 0xc5, 0x08, 0x00, 0x99, 0x53, 0x01, 0x00, + 0xc8, 0x52, 0x01, 0x00, 0x78, 0x52, 0x01, 0x00, 0xc4, 0xc5, 0x08, 0x00, + 0xc8, 0xc5, 0x08, 0x00, 0xcc, 0xc5, 0x08, 0x00, 0x01, 0x48, 0x02, 0x49, + 0x01, 0x60, 0x70, 0x47, 0x2c, 0xc4, 0x08, 0x00, 0x69, 0x50, 0x03, 0x00, + 0x2d, 0xe9, 0xf8, 0x43, 0xf2, 0x4f, 0x04, 0x46, 0x4f, 0xf4, 0xa8, 0x72, + 0x38, 0x68, 0x14, 0xfb, 0x02, 0x02, 0x92, 0xf8, 0x4d, 0x21, 0x0a, 0x42, + 0x36, 0xd0, 0x1c, 0x4e, 0xb1, 0x79, 0x01, 0x29, 0x32, 0xd1, 0x4f, 0xf4, + 0xa8, 0x71, 0x14, 0xfb, 0x01, 0x00, 0x90, 0xf8, 0x31, 0x11, 0x89, 0x07, + 0x2a, 0xd5, 0x17, 0x4a, 0x90, 0xf8, 0x32, 0x11, 0x00, 0xf2, 0x33, 0x10, + 0x12, 0x68, 0x90, 0x47, 0xff, 0x28, 0x21, 0xd0, 0x36, 0x68, 0x4f, 0xf0, + 0x34, 0x09, 0x12, 0x49, 0x05, 0x46, 0x10, 0x22, 0x10, 0xfb, 0x09, 0x68, + 0x40, 0x46, 0xfc, 0xf7, 0xf3, 0xf8, 0x38, 0xb1, 0x15, 0xfb, 0x09, 0x60, + 0x00, 0xf1, 0x20, 0x01, 0x0c, 0x48, 0x02, 0x68, 0x40, 0x46, 0x90, 0x47, + 0x38, 0x68, 0x4f, 0xf4, 0xa8, 0x71, 0x14, 0xfb, 0x01, 0x00, 0x90, 0xf8, + 0x54, 0x10, 0x01, 0x29, 0x04, 0xd1, 0x07, 0x49, 0x09, 0x68, 0xbd, 0xe8, + 0xf8, 0x43, 0x08, 0x47, 0xbd, 0xe8, 0xf8, 0x83, 0x20, 0x54, 0x01, 0x00, + 0x48, 0xc9, 0x08, 0x00, 0x9a, 0xad, 0x09, 0x10, 0x50, 0xba, 0x08, 0x00, + 0x3c, 0xba, 0x08, 0x00, 0xf0, 0xb5, 0x85, 0xb0, 0x04, 0x46, 0x12, 0x48, + 0xdd, 0xe9, 0x0a, 0xe7, 0x45, 0x7a, 0xed, 0x07, 0xdd, 0xe9, 0x0c, 0x5c, + 0x08, 0xd0, 0x3e, 0x46, 0x04, 0x2f, 0x28, 0xbf, 0x04, 0x26, 0x30, 0x44, + 0x80, 0x7a, 0xa8, 0x42, 0x38, 0xbf, 0x05, 0x46, 0x20, 0x46, 0xcd, 0xe9, + 0x00, 0xe7, 0xcd, 0xe9, 0x02, 0x5c, 0x00, 0xf0, 0x5d, 0xfa, 0x40, 0xb9, + 0x44, 0xf0, 0x02, 0x01, 0x03, 0x29, 0x04, 0xd1, 0x04, 0x49, 0x01, 0x22, + 0x0a, 0x73, 0x00, 0x22, 0x0a, 0x70, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0xbf, + 0xcc, 0x2c, 0x06, 0x00, 0x58, 0xf0, 0x05, 0x00, 0xb0, 0xb5, 0x90, 0xf9, + 0x16, 0x50, 0x04, 0x46, 0x7f, 0x2d, 0x0b, 0xd0, 0x08, 0x48, 0x09, 0x49, + 0x0a, 0x68, 0x00, 0x78, 0x02, 0x21, 0x90, 0x47, 0x85, 0x42, 0x01, 0xdb, + 0x14, 0x2d, 0x01, 0xdd, 0x12, 0x20, 0xb0, 0xbd, 0x20, 0x46, 0xbd, 0xe8, + 0xb0, 0x40, 0x00, 0xf0, 0x3b, 0xba, 0x00, 0xbf, 0x6b, 0x34, 0x01, 0x00, + 0x34, 0x9c, 0x08, 0x00, 0x2d, 0xe9, 0xfe, 0x43, 0xa6, 0x4e, 0x04, 0x46, + 0x4f, 0xf4, 0xa8, 0x77, 0x30, 0x68, 0x14, 0xfb, 0x07, 0x00, 0x90, 0xf8, + 0x54, 0x00, 0x08, 0xb1, 0xbd, 0xe8, 0xfe, 0x83, 0x4a, 0x48, 0x4f, 0xf0, + 0x00, 0x08, 0x01, 0x68, 0x00, 0x20, 0x88, 0x47, 0xeb, 0xf7, 0x9c, 0xfe, + 0x81, 0x46, 0x30, 0x68, 0x14, 0xfb, 0x07, 0x00, 0x01, 0x6d, 0x45, 0x48, + 0x05, 0x68, 0x02, 0xa8, 0xcd, 0xe9, 0x00, 0x08, 0x6f, 0xf0, 0x01, 0x00, + 0xc9, 0xf3, 0xc0, 0x63, 0x00, 0xea, 0x51, 0x02, 0x48, 0x46, 0xa8, 0x47, + 0x31, 0x68, 0x14, 0xfb, 0x07, 0x11, 0x48, 0x62, 0x3d, 0x48, 0x01, 0x68, + 0x20, 0x46, 0x88, 0x47, 0x32, 0x68, 0x14, 0xfb, 0x07, 0x21, 0x91, 0xf8, + 0x55, 0x70, 0x48, 0x87, 0x05, 0x2f, 0x07, 0xd3, 0x4f, 0xf4, 0xa8, 0x70, + 0x10, 0x21, 0x14, 0xfb, 0x00, 0x20, 0xb0, 0xf8, 0x00, 0x31, 0x07, 0xe0, + 0x00, 0xeb, 0x40, 0x00, 0x40, 0xf2, 0x71, 0x21, 0xb0, 0xfb, 0xf1, 0xf0, + 0x07, 0x21, 0x43, 0x1c, 0x4f, 0xf4, 0xa8, 0x78, 0x14, 0xfb, 0x08, 0x20, + 0xb0, 0xf8, 0x50, 0x20, 0x2d, 0x48, 0x05, 0x68, 0x1a, 0x20, 0xcd, 0xe9, + 0x00, 0x07, 0x02, 0x20, 0xa8, 0x47, 0x30, 0x68, 0x14, 0xfb, 0x08, 0x00, + 0x90, 0xf8, 0x55, 0x00, 0x01, 0x28, 0x13, 0xd1, 0x20, 0x46, 0x00, 0xf0, + 0xdd, 0xf9, 0x30, 0x68, 0x2c, 0x49, 0x14, 0xfb, 0x08, 0x00, 0x0a, 0x68, + 0x20, 0x21, 0x08, 0x30, 0x90, 0x47, 0x30, 0x68, 0x29, 0x49, 0x14, 0xfb, + 0x08, 0x00, 0x09, 0x68, 0x08, 0x30, 0x88, 0x47, 0xbd, 0xe8, 0xfe, 0x83, + 0x1d, 0x48, 0x49, 0x46, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0x30, 0x68, + 0x00, 0x21, 0x14, 0xfb, 0x08, 0x00, 0x80, 0xf8, 0x30, 0x11, 0x01, 0x21, + 0x80, 0xf8, 0x54, 0x10, 0x27, 0x21, 0x80, 0xf8, 0x56, 0x10, 0x20, 0x46, + 0x00, 0xf0, 0xb8, 0xf9, 0x14, 0x48, 0x00, 0x68, 0x80, 0x47, 0x14, 0x48, + 0x01, 0x68, 0x1a, 0x20, 0x88, 0x47, 0x13, 0x4a, 0x20, 0x04, 0x00, 0x21, + 0x08, 0x23, 0x10, 0x60, 0x30, 0x68, 0x14, 0xfb, 0x08, 0x00, 0x90, 0xf8, + 0x5d, 0x00, 0x50, 0x60, 0x0e, 0x48, 0x04, 0x68, 0x40, 0xf2, 0x13, 0x20, + 0xa0, 0x47, 0x0d, 0x48, 0x00, 0x68, 0x80, 0x47, 0x0c, 0x48, 0x00, 0x68, + 0x80, 0x47, 0xbd, 0xe8, 0xfe, 0x83, 0x00, 0xbf, 0xd4, 0x8e, 0x08, 0x00, + 0x08, 0xbb, 0x08, 0x00, 0x04, 0x8f, 0x08, 0x00, 0x14, 0x99, 0x08, 0x00, + 0x7c, 0xc9, 0x08, 0x00, 0x24, 0xc9, 0x08, 0x00, 0x54, 0x9c, 0x08, 0x00, + 0x8c, 0x34, 0x01, 0x00, 0x78, 0x9b, 0x08, 0x00, 0xec, 0xba, 0x08, 0x00, + 0xfc, 0xba, 0x08, 0x00, 0xe4, 0xc9, 0x08, 0x00, 0xe8, 0xc9, 0x08, 0x00, + 0x2d, 0xe9, 0xfc, 0x41, 0x04, 0x46, 0x41, 0xf0, 0x02, 0x00, 0x0d, 0x46, + 0x03, 0x28, 0x46, 0xd1, 0x43, 0x48, 0x06, 0x68, 0x20, 0x46, 0x11, 0x46, + 0x1a, 0x46, 0xb0, 0x47, 0x06, 0x46, 0xdf, 0xf8, 0x04, 0x81, 0x4f, 0xf4, + 0xa8, 0x71, 0xd8, 0xf8, 0x00, 0x00, 0x14, 0xfb, 0x01, 0x01, 0x91, 0xf8, + 0x54, 0x20, 0x92, 0xb1, 0x91, 0xf8, 0x55, 0x10, 0x05, 0x29, 0x0e, 0xd3, + 0x4f, 0xf4, 0xa8, 0x71, 0x14, 0xfb, 0x01, 0x00, 0x83, 0x8f, 0x02, 0x6d, + 0x90, 0xf8, 0x04, 0x11, 0x36, 0x48, 0x07, 0x68, 0x01, 0x20, 0x00, 0x90, + 0x20, 0x46, 0xb8, 0x47, 0x68, 0xb3, 0x45, 0x2e, 0x2b, 0xd0, 0x07, 0x2e, + 0x2a, 0xd0, 0x00, 0x2e, 0x56, 0xd1, 0x05, 0xf0, 0xfe, 0x00, 0x02, 0x28, + 0x45, 0xd1, 0x85, 0x49, 0xd8, 0xf8, 0x00, 0x00, 0x4f, 0xf4, 0xa8, 0x75, + 0x14, 0xfb, 0x05, 0x00, 0x09, 0x68, 0x66, 0x30, 0x88, 0x47, 0x8e, 0x48, + 0x02, 0x21, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0xd8, 0xf8, 0x00, 0x00, + 0x14, 0xfb, 0x05, 0x00, 0xb0, 0xf8, 0x62, 0x10, 0x21, 0xf0, 0x04, 0x01, + 0x37, 0xe0, 0x74, 0x48, 0x4f, 0xf4, 0xa8, 0x71, 0x00, 0x68, 0x14, 0xfb, + 0x01, 0x06, 0xb6, 0xf8, 0x62, 0x60, 0x76, 0x07, 0x17, 0xd4, 0x12, 0x26, + 0xb3, 0xe7, 0x45, 0x26, 0x73, 0x49, 0xd8, 0xf8, 0x00, 0x00, 0x4f, 0xf4, + 0xa8, 0x75, 0x14, 0xfb, 0x05, 0x00, 0x09, 0x68, 0x3c, 0x30, 0x88, 0x47, + 0xd8, 0xf8, 0x00, 0x00, 0x14, 0xfb, 0x05, 0x00, 0xb0, 0xf8, 0x62, 0x10, + 0x21, 0xf0, 0x04, 0x01, 0xa0, 0xf8, 0x62, 0x10, 0x18, 0xe0, 0x14, 0xfb, + 0x01, 0x00, 0x64, 0x4e, 0x30, 0xf8, 0x3c, 0x1f, 0xb6, 0xf8, 0x50, 0x61, + 0x19, 0x44, 0xb1, 0x42, 0x11, 0xd9, 0x07, 0x26, 0x91, 0xe7, 0xd8, 0xf8, + 0x00, 0x00, 0x4f, 0xf4, 0xa8, 0x71, 0x14, 0xfb, 0x01, 0x00, 0xb0, 0xf8, + 0x62, 0x10, 0x41, 0xf0, 0x04, 0x01, 0xa0, 0xf8, 0x62, 0x10, 0x00, 0x26, + 0x30, 0x46, 0xbd, 0xe8, 0xfc, 0x81, 0x58, 0x49, 0x0e, 0x68, 0x7a, 0xe7, + 0x24, 0xbe, 0x08, 0x00, 0xdc, 0x35, 0x01, 0x00, 0x6c, 0xc9, 0x08, 0x00, + 0x2d, 0xe9, 0xf0, 0x41, 0x0d, 0x46, 0x04, 0x46, 0x01, 0x29, 0x03, 0xd0, + 0x04, 0x2d, 0x2c, 0xd0, 0x03, 0x2d, 0x08, 0xd1, 0x4b, 0x48, 0x4f, 0xf4, + 0xa8, 0x71, 0x00, 0x68, 0x14, 0xfb, 0x01, 0x00, 0x49, 0x49, 0x70, 0x30, + 0x1a, 0xe0, 0x47, 0x48, 0x4f, 0xf4, 0xa8, 0x71, 0x00, 0x68, 0x14, 0xfb, + 0x01, 0x06, 0xb6, 0xf8, 0x62, 0x60, 0x36, 0x07, 0x5c, 0xbf, 0x12, 0x20, + 0xbd, 0xe8, 0xf0, 0x81, 0x14, 0xfb, 0x01, 0x00, 0x41, 0x4e, 0x30, 0xf8, + 0x70, 0x1f, 0xb6, 0xf8, 0x50, 0x61, 0x19, 0x44, 0xb1, 0x42, 0x84, 0xbf, + 0x07, 0x20, 0xbd, 0xe8, 0xf0, 0x81, 0x3d, 0x49, 0x0e, 0x68, 0x11, 0x46, + 0x1a, 0x46, 0xb0, 0x47, 0x08, 0xb1, 0xbd, 0xe8, 0xf0, 0x81, 0xdf, 0xf8, + 0xd8, 0x80, 0x4f, 0xf4, 0xa8, 0x77, 0xd8, 0xf8, 0x00, 0x00, 0x14, 0xfb, + 0x07, 0x00, 0xb0, 0xf8, 0x70, 0x10, 0x35, 0x48, 0x02, 0x68, 0x20, 0x46, + 0x90, 0x47, 0xd8, 0xf8, 0x00, 0x10, 0x14, 0xfb, 0x07, 0x12, 0xd2, 0xf8, + 0x84, 0x20, 0x3a, 0xb9, 0x14, 0xfb, 0x07, 0x13, 0xb3, 0xf8, 0x62, 0x30, + 0x03, 0xf0, 0xc0, 0x06, 0xc0, 0x2e, 0x21, 0xd1, 0x14, 0xfb, 0x07, 0x13, + 0xb3, 0xf8, 0x98, 0x30, 0x98, 0x42, 0x14, 0xd9, 0x4f, 0xf4, 0xa8, 0x75, + 0x14, 0xfb, 0x05, 0x10, 0x28, 0x49, 0x70, 0x30, 0x09, 0x68, 0x88, 0x47, + 0xd8, 0xf8, 0x00, 0x00, 0x14, 0xfb, 0x05, 0x00, 0xb0, 0xf8, 0x62, 0x10, + 0x21, 0xf0, 0x08, 0x01, 0xa0, 0xf8, 0x62, 0x10, 0x45, 0x20, 0xbd, 0xe8, + 0xf0, 0x81, 0x8a, 0xb9, 0x4f, 0xf4, 0xa8, 0x72, 0x14, 0xfb, 0x02, 0x12, + 0xb2, 0xf8, 0x62, 0x30, 0x03, 0xf0, 0xc0, 0x02, 0xc0, 0x2a, 0x07, 0xd0, + 0x4f, 0xf4, 0xa8, 0x72, 0x14, 0xfb, 0x02, 0x12, 0xb2, 0xf8, 0x9e, 0x20, + 0x90, 0x42, 0xd7, 0xd8, 0xa8, 0x1e, 0x02, 0x28, 0x10, 0xd8, 0x4f, 0xf4, + 0xa8, 0x75, 0x14, 0xfb, 0x05, 0x10, 0x12, 0x49, 0x82, 0x30, 0x09, 0x68, + 0x88, 0x47, 0xd8, 0xf8, 0x00, 0x00, 0x14, 0xfb, 0x05, 0x00, 0xb0, 0xf8, + 0x62, 0x10, 0x21, 0xf0, 0x08, 0x01, 0x07, 0xe0, 0x4f, 0xf4, 0xa8, 0x70, + 0x14, 0xfb, 0x00, 0x10, 0xb0, 0xf8, 0x62, 0x10, 0x41, 0xf0, 0x08, 0x01, + 0xa0, 0xf8, 0x62, 0x10, 0x00, 0x20, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0xbf, + 0xdc, 0x35, 0x01, 0x00, 0x08, 0xc9, 0x08, 0x00, 0xe8, 0x65, 0x08, 0x00, + 0x10, 0xc9, 0x08, 0x00, 0x5c, 0xb6, 0x08, 0x00, 0x04, 0xc9, 0x08, 0x00, + 0x8c, 0xec, 0x08, 0x00, 0x09, 0x48, 0x0a, 0x49, 0x01, 0x60, 0x0a, 0x48, + 0x0a, 0x49, 0x01, 0x60, 0x0a, 0x48, 0x0b, 0x49, 0x01, 0x60, 0x0b, 0x48, + 0x0b, 0x49, 0x01, 0x60, 0x0b, 0x48, 0x0c, 0x49, 0x01, 0x60, 0x0c, 0x48, + 0x0c, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, 0x54, 0xbe, 0x08, 0x00, + 0x21, 0x52, 0x03, 0x00, 0x0c, 0xc9, 0x08, 0x00, 0x81, 0x51, 0x03, 0x00, + 0x30, 0xb6, 0x08, 0x00, 0x79, 0x52, 0x03, 0x00, 0x38, 0xba, 0x08, 0x00, + 0xb1, 0x52, 0x03, 0x00, 0x40, 0xbe, 0x08, 0x00, 0x2d, 0x54, 0x03, 0x00, + 0x44, 0xbe, 0x08, 0x00, 0x59, 0x55, 0x03, 0x00, 0x4b, 0xf2, 0xe5, 0x4c, + 0xc1, 0xf2, 0x07, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x49, 0xf2, 0xe9, 0x7c, + 0xc1, 0xf2, 0x07, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4e, 0xf2, 0xbb, 0x6c, + 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0xb0, 0xb5, 0x17, 0x48, + 0x00, 0x78, 0x08, 0xb3, 0x16, 0x4a, 0x00, 0x21, 0x52, 0xf8, 0x21, 0x30, + 0xab, 0xb1, 0x93, 0xf8, 0x3b, 0x43, 0x87, 0x2c, 0x05, 0xd0, 0x93, 0xf8, + 0x3c, 0x53, 0x87, 0x2d, 0x18, 0xbf, 0x81, 0x2c, 0x0f, 0xd1, 0xb3, 0xf8, + 0x84, 0x40, 0xa4, 0x06, 0x10, 0xd5, 0xd3, 0xf8, 0xd4, 0x40, 0x64, 0x7f, + 0x1c, 0xb9, 0xd3, 0xf8, 0x34, 0x43, 0xe5, 0x00, 0x0a, 0xd5, 0x01, 0x31, + 0x81, 0x42, 0xe3, 0xd3, 0x02, 0xe0, 0x81, 0x2d, 0xed, 0xd0, 0xf8, 0xe7, + 0x00, 0x20, 0xb0, 0xbd, 0xd3, 0xf8, 0x34, 0x43, 0x44, 0xf0, 0x00, 0x50, + 0xc3, 0xf8, 0x34, 0x03, 0x01, 0x20, 0xb0, 0xbd, 0x53, 0x34, 0x01, 0x00, + 0xb8, 0x57, 0x01, 0x00, 0xca, 0x79, 0x07, 0x2a, 0x04, 0xd8, 0x0a, 0x7a, + 0x07, 0x2a, 0x98, 0xbf, 0x01, 0xf0, 0xcc, 0xba, 0x00, 0x20, 0x70, 0x47, + 0x70, 0xb5, 0xb8, 0xb1, 0x0c, 0x46, 0x05, 0x46, 0xf7, 0xf7, 0x2a, 0xfe, + 0x10, 0x48, 0x06, 0x68, 0x66, 0xb1, 0x10, 0x48, 0x95, 0xf8, 0x35, 0x11, + 0x00, 0x68, 0x72, 0x78, 0x91, 0x42, 0x01, 0xd1, 0xb0, 0x42, 0x0e, 0xd1, + 0x56, 0xf8, 0x04, 0x6c, 0x00, 0x2e, 0xf6, 0xd1, 0xf7, 0xf7, 0x1e, 0xfe, + 0x00, 0x24, 0x04, 0xe0, 0x00, 0x20, 0xbe, 0x21, 0x00, 0x24, 0xf1, 0xf7, + 0x69, 0xfa, 0x20, 0x46, 0x70, 0xbd, 0xf7, 0xf7, 0x13, 0xfe, 0x30, 0x78, + 0xa0, 0x42, 0xf1, 0xd0, 0x01, 0x24, 0xf6, 0xe7, 0x54, 0x52, 0x01, 0x00, + 0x60, 0x52, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x46, 0xd0, 0xf8, 0x50, 0x04, + 0x10, 0xb1, 0xd4, 0xf8, 0x4c, 0x04, 0x00, 0xb1, 0x10, 0xbd, 0x94, 0xf8, + 0x3b, 0x03, 0x00, 0x28, 0xfa, 0xd1, 0x94, 0xf8, 0x3c, 0x03, 0x00, 0x28, + 0xf6, 0xd1, 0x20, 0x46, 0x50, 0x21, 0xff, 0xf7, 0xbf, 0xff, 0x00, 0x28, + 0xf0, 0xd1, 0xb4, 0xf8, 0x46, 0x04, 0x80, 0x07, 0x16, 0xd4, 0xd4, 0xf8, + 0x4c, 0x04, 0x20, 0xb1, 0x00, 0x20, 0x4f, 0xf4, 0x88, 0x71, 0xf1, 0xf7, + 0x39, 0xfa, 0x00, 0x20, 0xd4, 0xf8, 0x50, 0x14, 0xc4, 0xf8, 0x50, 0x04, + 0x12, 0x48, 0xc4, 0xf8, 0x4c, 0x14, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, + 0x92, 0x20, 0x84, 0xf8, 0x3b, 0x03, 0x10, 0xbd, 0x0c, 0x48, 0x72, 0xb6, + 0x01, 0x68, 0x49, 0x00, 0x01, 0x31, 0x01, 0x60, 0xb4, 0xf8, 0x46, 0x14, + 0x21, 0xf0, 0x02, 0x01, 0xa4, 0xf8, 0x46, 0x14, 0x01, 0x68, 0x49, 0x08, + 0x01, 0x60, 0x00, 0x68, 0x80, 0xf3, 0x10, 0x88, 0xd4, 0xf8, 0x50, 0x04, + 0xf1, 0xf7, 0x32, 0xfa, 0x00, 0x20, 0xc4, 0xf8, 0x50, 0x04, 0x10, 0xbd, + 0x24, 0x36, 0x01, 0x00, 0x24, 0xb5, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, + 0x85, 0xb0, 0xd0, 0xb1, 0x04, 0x46, 0xab, 0x48, 0x0d, 0x46, 0x16, 0x46, + 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x20, 0xb9, 0xa8, 0x48, 0x01, 0x68, + 0x20, 0x46, 0x88, 0x47, 0x20, 0xb1, 0x00, 0x20, 0x40, 0xf2, 0x33, 0x11, + 0xeb, 0xf7, 0x94, 0xfb, 0x03, 0xf0, 0x8e, 0xfb, 0x68, 0xb1, 0xa3, 0x48, + 0xd0, 0xf8, 0x00, 0xc0, 0x8e, 0xb3, 0x4e, 0x20, 0x30, 0xe0, 0x00, 0x20, + 0x40, 0xf2, 0x2d, 0x11, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, 0xf1, 0xf7, + 0xe5, 0xb9, 0x68, 0x79, 0x95, 0xf8, 0x08, 0xb0, 0x95, 0xf8, 0x0c, 0x90, + 0x95, 0xf8, 0x0b, 0xa0, 0xaf, 0x7a, 0x95, 0xf8, 0x09, 0x80, 0x29, 0x46, + 0x32, 0x46, 0x04, 0x90, 0xa8, 0x79, 0x03, 0x90, 0xe8, 0x79, 0x02, 0x90, + 0x20, 0x46, 0x01, 0xf0, 0x19, 0xfa, 0x7e, 0xb9, 0x0d, 0x49, 0x4a, 0xea, + 0x09, 0x20, 0x48, 0xea, 0x07, 0x23, 0x0d, 0x68, 0x00, 0x90, 0xdd, 0xe9, + 0x03, 0x10, 0x40, 0xea, 0x01, 0x21, 0x02, 0x98, 0x40, 0xea, 0x0b, 0x22, + 0x20, 0x46, 0xa8, 0x47, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x06, 0x20, + 0x21, 0x46, 0x2a, 0x46, 0x01, 0x23, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, + 0x60, 0x47, 0x00, 0xbf, 0x3c, 0xc7, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x47, + 0x00, 0x28, 0x67, 0xd0, 0x04, 0x46, 0xd0, 0xf8, 0x00, 0x04, 0x00, 0x28, + 0x62, 0xd0, 0xd0, 0xf8, 0xec, 0x50, 0x00, 0x2d, 0x5e, 0xd0, 0x95, 0xf8, + 0x1c, 0x01, 0x02, 0x28, 0x07, 0xd1, 0xd4, 0xf8, 0x04, 0x04, 0xa8, 0x42, + 0x03, 0xd1, 0x95, 0xf8, 0x41, 0x00, 0x80, 0x07, 0x52, 0xd4, 0x74, 0x48, + 0x72, 0x4e, 0x95, 0xf8, 0x1d, 0x81, 0x01, 0x68, 0xd6, 0xf8, 0x00, 0x90, + 0x20, 0x46, 0x88, 0x47, 0x20, 0xb9, 0x70, 0x48, 0x01, 0x68, 0x20, 0x46, + 0x88, 0x47, 0x20, 0xb1, 0x00, 0x20, 0x4f, 0xf4, 0xcb, 0x71, 0xeb, 0xf7, + 0x23, 0xfb, 0x94, 0xf9, 0x3c, 0x03, 0xb0, 0xf1, 0xff, 0x3f, 0x3b, 0xdd, + 0xff, 0xf7, 0xb8, 0xfe, 0xc0, 0xbb, 0x94, 0xf8, 0x8c, 0x00, 0xc0, 0x06, + 0x34, 0xd4, 0x95, 0xf8, 0x1d, 0x11, 0x30, 0x68, 0xc1, 0xeb, 0x01, 0x11, + 0x00, 0xeb, 0x41, 0x17, 0x3e, 0x46, 0x16, 0xf8, 0x9a, 0x0f, 0x70, 0xb9, + 0x28, 0x6c, 0x4f, 0xf0, 0x00, 0x0a, 0xc7, 0xf8, 0x10, 0xa0, 0x40, 0xf0, + 0x01, 0x00, 0x28, 0x64, 0x5d, 0x48, 0x01, 0x68, 0x38, 0x46, 0x88, 0x47, + 0x00, 0x28, 0x00, 0xf0, 0x91, 0x80, 0x28, 0x6c, 0x41, 0xb2, 0x00, 0x29, + 0x4b, 0xd4, 0x57, 0xf8, 0x10, 0x0f, 0x57, 0xf8, 0x04, 0x1c, 0x09, 0x1a, + 0xc5, 0xf8, 0x30, 0x11, 0x17, 0xf8, 0x0d, 0x1c, 0x81, 0x29, 0x15, 0xd0, + 0x01, 0x29, 0x23, 0xd1, 0xd5, 0xf8, 0x28, 0x11, 0x08, 0x44, 0x51, 0x49, + 0xb1, 0xf8, 0xb8, 0x11, 0x43, 0x18, 0x21, 0xe0, 0xbd, 0xe8, 0xf0, 0x87, + 0x4b, 0x48, 0x21, 0x46, 0x00, 0x22, 0x01, 0x23, 0xd0, 0xf8, 0x00, 0xc0, + 0x34, 0x20, 0xbd, 0xe8, 0xf0, 0x47, 0x60, 0x47, 0xd5, 0xf8, 0x24, 0x11, + 0x95, 0xf8, 0x46, 0x31, 0xb0, 0xfb, 0xf1, 0xf2, 0x85, 0xf8, 0xf9, 0x21, + 0x95, 0xf8, 0x50, 0x21, 0x93, 0x42, 0x38, 0xbf, 0x13, 0x46, 0x01, 0xfb, + 0x03, 0x03, 0x05, 0xe0, 0x95, 0xf8, 0x20, 0x11, 0xd5, 0xf8, 0x24, 0x21, + 0x02, 0xfb, 0x01, 0x03, 0x3e, 0x48, 0x3f, 0x4a, 0x78, 0x21, 0x3b, 0x60, + 0xee, 0xf7, 0xf6, 0xfc, 0x3d, 0x48, 0x90, 0xf8, 0x2c, 0x01, 0x80, 0x07, + 0x05, 0xd5, 0x3c, 0x48, 0x38, 0x4a, 0x01, 0x21, 0x03, 0x68, 0x02, 0x20, + 0x98, 0x47, 0x28, 0x6c, 0x40, 0xf0, 0x80, 0x00, 0x28, 0x64, 0xc0, 0x07, + 0x01, 0xd1, 0x00, 0x21, 0x06, 0xe0, 0xc8, 0xeb, 0x08, 0x10, 0x09, 0xeb, + 0x40, 0x10, 0xd0, 0xe9, 0x39, 0x10, 0x41, 0x1a, 0x28, 0x46, 0x02, 0xf0, + 0x21, 0xfe, 0xd4, 0xf8, 0x18, 0x01, 0xd5, 0xf8, 0xe0, 0x10, 0x48, 0x40, + 0xa8, 0x63, 0xd4, 0xf8, 0x1c, 0x01, 0xe8, 0x63, 0x8d, 0x20, 0x84, 0xf8, + 0x3b, 0x03, 0x29, 0x48, 0x90, 0xf8, 0x2c, 0x01, 0x80, 0x07, 0x05, 0xd5, + 0x27, 0x48, 0x28, 0x4a, 0x01, 0x21, 0x03, 0x68, 0x02, 0x20, 0x98, 0x47, + 0xd4, 0xf8, 0x1c, 0x04, 0x50, 0xb1, 0x01, 0x7e, 0x05, 0x29, 0x07, 0xd1, + 0x81, 0x79, 0x49, 0x06, 0x04, 0xd5, 0x1c, 0x49, 0x91, 0xf8, 0xa6, 0x12, + 0x49, 0x06, 0x25, 0xd4, 0x20, 0x48, 0x02, 0x68, 0x20, 0x46, 0x29, 0x46, + 0x90, 0x47, 0x1f, 0x48, 0x4f, 0xf4, 0x7a, 0x41, 0x0c, 0x22, 0x03, 0x68, + 0x20, 0x46, 0xbd, 0xe8, 0xf0, 0x47, 0x18, 0x47, 0x28, 0x6c, 0x86, 0xf8, + 0x00, 0xa0, 0x20, 0xf0, 0x01, 0x00, 0x28, 0x64, 0x12, 0x48, 0x90, 0xf8, + 0x2c, 0x01, 0x80, 0x07, 0x05, 0xd5, 0x11, 0x48, 0x15, 0x4a, 0x00, 0x21, + 0x03, 0x68, 0x02, 0x20, 0x98, 0x47, 0x41, 0x48, 0x0d, 0x21, 0x02, 0x68, + 0x20, 0x46, 0xbd, 0xe8, 0xf0, 0x47, 0x10, 0x47, 0x0c, 0x49, 0x0a, 0x68, + 0xd9, 0xe7, 0x00, 0xbf, 0xe0, 0x35, 0x01, 0x00, 0xa0, 0x9b, 0x08, 0x00, + 0x84, 0x9b, 0x08, 0x00, 0x80, 0x9b, 0x08, 0x00, 0x8c, 0xb8, 0x08, 0x00, + 0xe8, 0x65, 0x08, 0x00, 0xff, 0x6a, 0x01, 0x00, 0x50, 0x6e, 0x03, 0x00, + 0x8c, 0x7e, 0x08, 0x00, 0x70, 0x9b, 0x08, 0x00, 0x65, 0x6e, 0x03, 0x00, + 0xa0, 0xb8, 0x08, 0x00, 0xb8, 0xb8, 0x08, 0x00, 0x8c, 0x9b, 0x08, 0x00, + 0x34, 0x6e, 0x03, 0x00, 0x70, 0xb5, 0x1e, 0x46, 0x04, 0x46, 0x01, 0xf0, + 0xdd, 0xf8, 0x05, 0x46, 0x50, 0xbb, 0xd4, 0xf8, 0x34, 0x03, 0x01, 0x2e, + 0x20, 0xf0, 0x80, 0x51, 0xc4, 0xf8, 0x34, 0x13, 0x22, 0xd1, 0x80, 0x00, + 0x03, 0xd5, 0x11, 0x48, 0x01, 0x68, 0x00, 0x20, 0x88, 0x47, 0xb4, 0xf8, + 0x84, 0x00, 0x80, 0x06, 0x18, 0xd5, 0xd4, 0xf8, 0xd4, 0x00, 0x40, 0x7f, + 0xa0, 0xb1, 0xd4, 0xf8, 0x34, 0x03, 0x41, 0x00, 0x10, 0xd5, 0x94, 0xf8, + 0x35, 0x11, 0x09, 0x4a, 0x68, 0x23, 0x11, 0xfb, 0x03, 0x21, 0x51, 0xf8, + 0x60, 0x2f, 0x01, 0x32, 0x06, 0xd0, 0x4f, 0xf0, 0xff, 0x32, 0x20, 0xf0, + 0x80, 0x40, 0x0a, 0x60, 0xc4, 0xf8, 0x34, 0x03, 0x28, 0x46, 0x70, 0xbd, + 0x10, 0xb5, 0x08, 0x00, 0xb0, 0xe6, 0x05, 0x00, 0x70, 0xb5, 0x05, 0x46, + 0xd0, 0xf8, 0x00, 0x04, 0x0e, 0x46, 0x95, 0xf8, 0x35, 0x11, 0xd0, 0xf8, + 0xec, 0x40, 0x55, 0x20, 0xf1, 0xf7, 0x56, 0xf8, 0x0d, 0x2e, 0x18, 0xbf, + 0x70, 0xbd, 0x09, 0x48, 0x10, 0x21, 0x02, 0x68, 0x28, 0x46, 0x90, 0x47, + 0x07, 0x48, 0x10, 0x21, 0x1f, 0x22, 0x00, 0x23, 0x06, 0x68, 0x28, 0x46, + 0xb0, 0x47, 0x05, 0x48, 0x10, 0x21, 0x02, 0x68, 0x20, 0x46, 0xbd, 0xe8, + 0x70, 0x40, 0x10, 0x47, 0x9c, 0xc4, 0x08, 0x00, 0x94, 0x9b, 0x08, 0x00, + 0xcc, 0xc4, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, 0x85, 0xb0, 0x06, 0x46, + 0xb6, 0x48, 0xd6, 0xf8, 0x00, 0x90, 0x03, 0x68, 0x09, 0xf5, 0x80, 0x7a, + 0x99, 0xf8, 0x2c, 0x13, 0x4a, 0x46, 0x50, 0x46, 0x98, 0x47, 0x00, 0xb3, + 0x90, 0xf8, 0x24, 0x01, 0x0a, 0x28, 0x1c, 0xd1, 0x02, 0x20, 0x89, 0xf8, + 0x08, 0x03, 0xae, 0x48, 0x00, 0x68, 0x80, 0x47, 0xad, 0x48, 0xc0, 0x78, + 0x01, 0x28, 0x0a, 0xd1, 0xd9, 0xf8, 0xd4, 0x00, 0x40, 0x7f, 0x01, 0x28, + 0x05, 0xd1, 0xaa, 0x49, 0x99, 0xf9, 0x3d, 0x03, 0x0a, 0x68, 0x01, 0x21, + 0x90, 0x47, 0xa8, 0x48, 0x0b, 0x21, 0x02, 0x68, 0x48, 0x46, 0x05, 0xb0, + 0xbd, 0xe8, 0xf0, 0x4f, 0x10, 0x47, 0xb9, 0xf8, 0xe2, 0x02, 0x99, 0xf8, + 0x3d, 0x13, 0x00, 0x01, 0x80, 0xb2, 0xc9, 0xf8, 0xf0, 0x00, 0x15, 0x20, + 0xf0, 0xf7, 0xfe, 0xff, 0x9f, 0x48, 0x01, 0x21, 0x01, 0x22, 0x03, 0x68, + 0x48, 0x46, 0x98, 0x47, 0x74, 0x68, 0xa0, 0x79, 0xff, 0x28, 0x06, 0xd0, + 0x9b, 0x49, 0x34, 0x22, 0x09, 0x68, 0x10, 0xfb, 0x02, 0x10, 0x26, 0x30, + 0x00, 0xe0, 0x00, 0x20, 0x04, 0x90, 0xd9, 0xf8, 0xd4, 0x00, 0x40, 0x7f, + 0x00, 0xb3, 0x96, 0x48, 0x90, 0xf8, 0x9e, 0x10, 0xc9, 0x07, 0x0e, 0xd1, + 0xd0, 0xf8, 0xac, 0x00, 0x58, 0xb1, 0x00, 0xf5, 0x80, 0x70, 0x51, 0x46, + 0x06, 0x22, 0xfb, 0xf7, 0x53, 0xfb, 0x20, 0xb9, 0x8f, 0x48, 0x49, 0x46, + 0x02, 0x68, 0x02, 0x20, 0x90, 0x47, 0x8e, 0x48, 0xb9, 0xf8, 0xdc, 0x12, + 0xb9, 0xf8, 0xe4, 0x32, 0x05, 0x68, 0xb9, 0xf8, 0xe2, 0x02, 0x0a, 0x46, + 0x00, 0x90, 0x48, 0x46, 0xa8, 0x47, 0x3a, 0xe0, 0x86, 0x48, 0x49, 0x46, + 0x02, 0x68, 0x02, 0x20, 0x90, 0x47, 0xc9, 0x48, 0x90, 0xf8, 0x1c, 0x51, + 0x8d, 0xb3, 0x84, 0x48, 0x00, 0x27, 0x4f, 0xf0, 0x01, 0x0b, 0x40, 0xf2, + 0x52, 0x58, 0x00, 0x68, 0x00, 0xf5, 0x99, 0x76, 0x16, 0xf8, 0xde, 0x0c, + 0x01, 0x28, 0x0e, 0xd1, 0x16, 0xf8, 0xdd, 0x0c, 0x0a, 0x28, 0x0a, 0xd8, + 0x0b, 0xfa, 0x00, 0xf0, 0x10, 0xea, 0x08, 0x0f, 0x05, 0xd0, 0x70, 0x1c, + 0x51, 0x46, 0x06, 0x22, 0xfb, 0xf7, 0x1c, 0xfb, 0x28, 0xb1, 0x01, 0x37, + 0x06, 0xf5, 0xa8, 0x76, 0xaf, 0x42, 0xe7, 0xd3, 0x0f, 0xe0, 0x74, 0x48, + 0x74, 0x49, 0x0b, 0x23, 0x32, 0x58, 0x16, 0xf8, 0x01, 0x0b, 0x0d, 0x68, + 0x00, 0x21, 0xcd, 0xe9, 0x00, 0x11, 0x31, 0x46, 0xa8, 0x47, 0x70, 0x48, + 0x01, 0x68, 0x78, 0xb2, 0x88, 0x47, 0x01, 0x20, 0x4a, 0x46, 0x00, 0x23, + 0x00, 0x26, 0xa9, 0xf8, 0x40, 0x04, 0x6c, 0x48, 0x01, 0x88, 0xa9, 0xf8, + 0x36, 0x14, 0x41, 0x88, 0xa9, 0xf8, 0x38, 0x14, 0x81, 0x88, 0xa9, 0xf8, + 0x3a, 0x14, 0xc1, 0x88, 0x00, 0x89, 0xa9, 0xf8, 0x3e, 0x04, 0x63, 0x48, + 0xa9, 0xf8, 0x3c, 0x14, 0x05, 0x68, 0x99, 0xf8, 0x2c, 0x03, 0x00, 0x94, + 0x04, 0x99, 0x01, 0x91, 0x51, 0x46, 0xa8, 0x47, 0xd9, 0xf8, 0xd4, 0x00, + 0x40, 0x7f, 0x70, 0xb1, 0x5e, 0x48, 0x00, 0x78, 0xc0, 0x07, 0x0a, 0xd0, + 0x99, 0xf9, 0x3d, 0x03, 0x00, 0xf0, 0xae, 0xff, 0x5b, 0x49, 0x99, 0xf8, + 0x3d, 0x03, 0x4a, 0x46, 0x0b, 0x68, 0x00, 0x21, 0x98, 0x47, 0x59, 0x4a, + 0x99, 0xf8, 0x35, 0x01, 0x99, 0xf8, 0xb8, 0x12, 0x12, 0x68, 0x90, 0x47, + 0x56, 0x48, 0x01, 0x68, 0x48, 0x46, 0x88, 0x47, 0x55, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x55, 0x48, 0x99, 0xf8, 0x35, 0x11, 0x02, 0x68, 0x54, 0x48, + 0x90, 0x47, 0x3f, 0x48, 0x00, 0x68, 0x80, 0x47, 0x52, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x52, 0x48, 0x00, 0x68, 0x80, 0x47, 0x51, 0x48, 0x99, 0xf8, + 0x35, 0x11, 0x03, 0x22, 0x00, 0x23, 0x04, 0x68, 0x09, 0xf5, 0xee, 0x70, + 0xcd, 0xe9, 0x00, 0x66, 0xcd, 0xe9, 0x02, 0x66, 0xa0, 0x47, 0x4c, 0x48, + 0x01, 0x21, 0x02, 0x68, 0x00, 0x20, 0x90, 0x47, 0x60, 0xb1, 0x4a, 0x48, + 0x04, 0x68, 0xd9, 0xf8, 0xd4, 0x00, 0x40, 0x7f, 0x08, 0xb1, 0x18, 0x20, + 0x00, 0xe0, 0x16, 0x20, 0x49, 0x46, 0x00, 0x22, 0x01, 0x23, 0xa0, 0x47, + 0x76, 0x48, 0xb0, 0xf8, 0xe0, 0x01, 0xc0, 0x07, 0x06, 0xd0, 0x41, 0x48, + 0x49, 0x46, 0x00, 0x22, 0x01, 0x23, 0x04, 0x68, 0x16, 0x20, 0xa0, 0x47, + 0x99, 0xf8, 0xf2, 0x02, 0x02, 0x28, 0x01, 0xd3, 0x05, 0x28, 0x05, 0xd3, + 0x99, 0xf8, 0xf3, 0x02, 0x02, 0x28, 0x07, 0xd3, 0x04, 0x28, 0x05, 0xd8, + 0x99, 0xf8, 0x4b, 0x03, 0x40, 0xf0, 0x08, 0x00, 0x89, 0xf8, 0x4b, 0x03, + 0x09, 0xf2, 0xbb, 0x30, 0x28, 0x21, 0xed, 0xf7, 0xeb, 0xfe, 0x33, 0x48, + 0x99, 0xf8, 0x74, 0x10, 0x00, 0x22, 0x03, 0x68, 0x48, 0x46, 0x98, 0x47, + 0x99, 0xf8, 0xf2, 0x12, 0x48, 0x46, 0x81, 0x22, 0x00, 0x23, 0x1a, 0xf0, + 0x3f, 0xff, 0x2d, 0x48, 0xd0, 0xf8, 0x90, 0x60, 0xde, 0xb1, 0xdf, 0xf8, + 0xb0, 0xb0, 0xdf, 0xf8, 0xb0, 0x80, 0x00, 0xf1, 0x90, 0x07, 0x71, 0x79, + 0x99, 0xf8, 0x2c, 0x03, 0xdb, 0xf8, 0x00, 0x50, 0x56, 0xf8, 0x04, 0x4c, + 0xb3, 0x1d, 0x52, 0x46, 0xa8, 0x47, 0x38, 0xb1, 0xd8, 0xf8, 0x00, 0x20, + 0x38, 0x46, 0x31, 0x46, 0x90, 0x47, 0x30, 0x46, 0xf0, 0xf7, 0xe6, 0xfe, + 0x00, 0x2c, 0x26, 0x46, 0xe9, 0xd1, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0xf8, 0xc8, 0x08, 0x00, 0xd4, 0xc4, 0x08, 0x00, 0xa8, 0x56, 0x01, 0x00, + 0x40, 0xc7, 0x08, 0x00, 0x38, 0xc7, 0x08, 0x00, 0xc0, 0x9b, 0x08, 0x00, + 0x20, 0x54, 0x01, 0x00, 0x90, 0x01, 0x00, 0x00, 0x9c, 0xba, 0x08, 0x00, + 0x3c, 0xc7, 0x08, 0x00, 0xdc, 0x35, 0x01, 0x00, 0xd2, 0xfe, 0xff, 0xff, + 0xe0, 0xb4, 0x08, 0x00, 0x08, 0xb5, 0x08, 0x00, 0x70, 0x58, 0x01, 0x00, + 0x99, 0x53, 0x01, 0x00, 0xe8, 0xb4, 0x08, 0x00, 0xf0, 0xc6, 0x08, 0x00, + 0x00, 0xc7, 0x08, 0x00, 0x3c, 0xc5, 0x08, 0x00, 0xa4, 0xda, 0x08, 0x00, + 0xc0, 0x52, 0x01, 0x00, 0xec, 0xba, 0x08, 0x00, 0xfc, 0xba, 0x08, 0x00, + 0x48, 0xd4, 0x08, 0x00, 0x0c, 0xbb, 0x08, 0x00, 0x80, 0x9b, 0x08, 0x00, + 0x00, 0x9c, 0x08, 0x00, 0x2c, 0xba, 0x01, 0x00, 0x5c, 0xc7, 0x08, 0x00, + 0xe8, 0xa0, 0x08, 0x00, 0x70, 0xb5, 0x0d, 0x46, 0x04, 0x46, 0x12, 0x48, + 0x6e, 0x79, 0x01, 0x68, 0x30, 0x46, 0x88, 0x47, 0x01, 0x28, 0x02, 0xd8, + 0x16, 0xf0, 0xf0, 0x0f, 0x09, 0xd0, 0x98, 0x48, 0x20, 0x21, 0x23, 0x22, + 0x00, 0x23, 0xd0, 0xf8, 0x00, 0xc0, 0x20, 0x46, 0xbd, 0xe8, 0x70, 0x40, + 0x60, 0x47, 0xd4, 0xf8, 0x1c, 0x04, 0x10, 0xb1, 0x00, 0x7e, 0x05, 0x28, + 0x01, 0xd0, 0x00, 0x2e, 0xed, 0xd0, 0x10, 0x2e, 0xeb, 0xd2, 0x20, 0x46, + 0x29, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x00, 0xf0, 0xb7, 0xbe, 0x00, 0xbf, + 0x5c, 0x9e, 0x08, 0x00, 0x10, 0xb5, 0x04, 0x46, 0x00, 0xf0, 0xb6, 0xfe, + 0x16, 0x48, 0xb0, 0xf8, 0xe0, 0x01, 0x80, 0x06, 0x09, 0xd5, 0xd4, 0xf8, + 0xd4, 0x00, 0x40, 0x7f, 0x28, 0xb9, 0x7d, 0x48, 0x90, 0xf9, 0x04, 0x00, + 0xb0, 0xf1, 0xff, 0x3f, 0x00, 0xdd, 0x10, 0xbd, 0xf6, 0x48, 0x21, 0x46, + 0x00, 0x22, 0x01, 0x23, 0xd0, 0xf8, 0x00, 0xc0, 0x55, 0x20, 0xbd, 0xe8, + 0x10, 0x40, 0x60, 0x47, 0x70, 0xb5, 0x09, 0x4e, 0x73, 0x4c, 0xb6, 0xf8, + 0xe0, 0x21, 0x25, 0x79, 0x92, 0x06, 0x44, 0xbf, 0x05, 0xf0, 0x7f, 0x02, + 0x22, 0x71, 0x00, 0xf0, 0x95, 0xfe, 0xb6, 0xf8, 0xe0, 0x01, 0x80, 0x06, + 0x48, 0xbf, 0x25, 0x71, 0x70, 0xbd, 0x00, 0xbf, 0xe8, 0x65, 0x08, 0x00, + 0xb0, 0xb5, 0x90, 0xf8, 0x4e, 0x53, 0x04, 0x46, 0x45, 0xf0, 0x80, 0x00, + 0x84, 0xf8, 0x4e, 0x03, 0x20, 0x46, 0x00, 0xf0, 0x87, 0xfe, 0x84, 0xf8, + 0x4e, 0x53, 0xb0, 0xbd, 0xb0, 0xb5, 0x90, 0xf8, 0x4e, 0x53, 0x04, 0x46, + 0x45, 0xf0, 0x80, 0x00, 0x84, 0xf8, 0x4e, 0x03, 0x20, 0x46, 0x00, 0xf0, + 0x7f, 0xfe, 0x84, 0xf8, 0x4e, 0x53, 0xb0, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, + 0x58, 0xb1, 0x04, 0x46, 0x59, 0x48, 0x0d, 0x46, 0x00, 0x79, 0x81, 0x06, + 0x48, 0xbf, 0x5f, 0xea, 0x40, 0x60, 0x09, 0xd4, 0x5b, 0x48, 0x1a, 0x21, + 0x38, 0xe0, 0x00, 0x20, 0x40, 0xf2, 0x2e, 0x41, 0xbd, 0xe8, 0xf8, 0x4f, + 0xf0, 0xf7, 0xf4, 0xbd, 0x94, 0xf8, 0x3b, 0x03, 0x93, 0x28, 0x09, 0xd1, + 0x94, 0xf8, 0x35, 0x11, 0x53, 0x20, 0xf0, 0xf7, 0xf1, 0xfd, 0x4d, 0x48, + 0x93, 0x21, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0x68, 0x79, 0xa9, 0x79, + 0x40, 0xea, 0x01, 0x26, 0xb6, 0xf5, 0xfa, 0x7f, 0x1a, 0xd8, 0xce, 0xb1, + 0xe8, 0x7a, 0x29, 0x7b, 0x40, 0xea, 0x01, 0x27, 0xbe, 0x42, 0x13, 0xd9, + 0x68, 0x7a, 0xa9, 0x7a, 0x40, 0xea, 0x01, 0x29, 0x09, 0xf1, 0x01, 0x00, + 0x70, 0x43, 0xb0, 0xf5, 0xfa, 0x7f, 0x09, 0xd8, 0xb4, 0xf8, 0xdc, 0x12, + 0xaa, 0x7b, 0x48, 0x43, 0x69, 0x7b, 0x41, 0xea, 0x02, 0x2a, 0xb0, 0xeb, + 0x8a, 0x0f, 0x0a, 0xd9, 0x3e, 0x48, 0x1e, 0x21, 0xd0, 0xf8, 0x00, 0xc0, + 0x20, 0x46, 0x27, 0x22, 0x00, 0x23, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, + 0x60, 0x47, 0xe8, 0x79, 0x95, 0xf8, 0x08, 0x80, 0x00, 0x90, 0xb4, 0xf8, + 0x40, 0x04, 0x86, 0x42, 0x12, 0xd1, 0xb4, 0xf8, 0xe4, 0x02, 0x81, 0x45, + 0x0e, 0xd1, 0xb4, 0xf8, 0x42, 0x04, 0x87, 0x42, 0x0a, 0xd1, 0xb4, 0xf8, + 0xe2, 0x02, 0x82, 0x45, 0x06, 0xd1, 0x94, 0xf8, 0x31, 0x03, 0x80, 0x07, + 0x02, 0xd4, 0x4f, 0xf0, 0x00, 0x0b, 0x01, 0xe0, 0x4f, 0xf0, 0x01, 0x0b, + 0x26, 0x48, 0x01, 0x68, 0x14, 0x20, 0x88, 0x47, 0xc8, 0xb1, 0x06, 0x80, + 0x05, 0x46, 0xa0, 0xf8, 0x08, 0xa0, 0x87, 0x80, 0xa0, 0xf8, 0x06, 0x90, + 0x00, 0x98, 0x21, 0x4e, 0x40, 0xea, 0x08, 0x20, 0x68, 0x80, 0x72, 0xb6, + 0x30, 0x68, 0x40, 0x00, 0x01, 0x30, 0x30, 0x60, 0xd4, 0xf8, 0x4c, 0x04, + 0x60, 0xb1, 0xf0, 0xf7, 0x9f, 0xfd, 0x00, 0x20, 0xc4, 0xf8, 0x4c, 0x04, + 0x07, 0xe0, 0xd4, 0xf8, 0x30, 0x03, 0x20, 0xf4, 0x00, 0x70, 0xc4, 0xf8, + 0x30, 0x03, 0x10, 0xe0, 0x01, 0x20, 0xc4, 0xf8, 0x4c, 0x54, 0x31, 0x68, + 0x4f, 0xea, 0x51, 0x01, 0x31, 0x60, 0x31, 0x68, 0x81, 0xf3, 0x10, 0x88, + 0xd4, 0xf8, 0x30, 0x13, 0x21, 0xf4, 0x00, 0x71, 0xc4, 0xf8, 0x30, 0x13, + 0x18, 0xb1, 0x0d, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0xbb, 0xf1, + 0x00, 0x0f, 0x08, 0xbf, 0xbd, 0xe8, 0xf8, 0x8f, 0x09, 0x48, 0xd4, 0xf8, + 0x4c, 0x24, 0x00, 0x21, 0x03, 0x68, 0x20, 0x46, 0x01, 0xb0, 0xbd, 0xe8, + 0xf0, 0x4f, 0x18, 0x47, 0x70, 0x52, 0x01, 0x00, 0x88, 0x9b, 0x08, 0x00, + 0x78, 0xc4, 0x08, 0x00, 0x24, 0x36, 0x01, 0x00, 0x20, 0xb5, 0x08, 0x00, + 0xec, 0xb4, 0x08, 0x00, 0x94, 0x9b, 0x08, 0x00, 0x2d, 0xe9, 0xf8, 0x43, + 0x05, 0x46, 0x10, 0x78, 0x0e, 0x46, 0x35, 0x49, 0x14, 0x46, 0x02, 0x46, + 0x01, 0xeb, 0x40, 0x03, 0x03, 0x28, 0x88, 0xbf, 0x04, 0x22, 0x11, 0xf8, + 0x12, 0x80, 0x05, 0xeb, 0xc2, 0x07, 0x01, 0x33, 0x03, 0x28, 0x2f, 0x4a, + 0x88, 0xbf, 0x01, 0xf1, 0x09, 0x03, 0x03, 0x21, 0x93, 0xf8, 0x00, 0x90, + 0x05, 0x28, 0x38, 0xbf, 0x02, 0x21, 0x97, 0xf8, 0xbc, 0x03, 0x12, 0x68, + 0x90, 0x47, 0xa0, 0x70, 0x7e, 0xb1, 0x70, 0x79, 0x01, 0x28, 0x0c, 0xd1, + 0x30, 0x79, 0x05, 0x28, 0x3c, 0xd0, 0x40, 0xb9, 0x70, 0x78, 0x31, 0x78, + 0x60, 0x70, 0x23, 0x48, 0x21, 0x70, 0x02, 0x68, 0x28, 0x46, 0x90, 0x47, + 0x37, 0xe0, 0x97, 0xf8, 0xbe, 0x03, 0x01, 0x28, 0x13, 0xd8, 0x7f, 0x20, + 0x22, 0x78, 0x29, 0x46, 0x8d, 0xf8, 0x03, 0x00, 0x1c, 0x48, 0x04, 0x2a, + 0x28, 0xbf, 0x04, 0x22, 0x03, 0x68, 0x0d, 0xf1, 0x03, 0x00, 0x98, 0x47, + 0x9d, 0xf8, 0x03, 0x00, 0x7f, 0x28, 0x08, 0xd1, 0x00, 0x20, 0xbd, 0xe8, + 0xf8, 0x83, 0x02, 0x28, 0x14, 0xbf, 0x00, 0x20, 0x7f, 0x20, 0x60, 0x70, + 0x1a, 0xe0, 0x4f, 0xfa, 0x88, 0xf2, 0x07, 0xf2, 0xbe, 0x31, 0x02, 0x23, + 0x42, 0xfa, 0x89, 0xf2, 0x09, 0x78, 0x92, 0xfb, 0xf3, 0xf2, 0xa2, 0xeb, + 0x00, 0x00, 0x60, 0x70, 0x61, 0xb9, 0x97, 0xf9, 0xc0, 0x13, 0x49, 0xb1, + 0x40, 0xb2, 0x88, 0x42, 0xe2, 0xdb, 0x05, 0xe0, 0x7f, 0x20, 0xa0, 0x70, + 0x00, 0x20, 0x70, 0x71, 0x30, 0x78, 0x20, 0x70, 0x01, 0x20, 0xbd, 0xe8, + 0xf8, 0x83, 0x00, 0xbf, 0x80, 0x53, 0x01, 0x00, 0x34, 0x9c, 0x08, 0x00, + 0x58, 0x9e, 0x08, 0x00, 0x1c, 0xcb, 0x08, 0x00, 0x2d, 0xe9, 0xfc, 0x47, + 0x04, 0x46, 0x33, 0x48, 0x0d, 0x46, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, + 0x00, 0x28, 0x56, 0xd0, 0x94, 0xf9, 0x3c, 0x03, 0x00, 0x28, 0x22, 0xd4, + 0xdf, 0xf8, 0xb8, 0x90, 0x04, 0xf2, 0xbe, 0x36, 0x04, 0xf2, 0xe3, 0x35, + 0x00, 0x20, 0x0d, 0xf1, 0x04, 0x08, 0x4f, 0xf0, 0x03, 0x0a, 0x07, 0x46, + 0x16, 0xf8, 0x30, 0x00, 0x03, 0x28, 0x0e, 0xd0, 0x38, 0x46, 0x03, 0x2f, + 0x29, 0x46, 0x42, 0x46, 0x88, 0xbf, 0x05, 0x20, 0xd9, 0xf8, 0x00, 0x30, + 0x8d, 0xf8, 0x04, 0x00, 0x20, 0x46, 0x98, 0x47, 0x70, 0xb9, 0x06, 0xf8, + 0x37, 0xa0, 0x78, 0x1c, 0x05, 0x28, 0xe8, 0xd1, 0x1b, 0xe0, 0x21, 0x48, + 0x21, 0x46, 0x2a, 0x46, 0x01, 0x23, 0x06, 0x68, 0x32, 0x20, 0xb0, 0x47, + 0xbd, 0xe8, 0xfc, 0x87, 0x19, 0x48, 0x01, 0xa9, 0x02, 0x68, 0x20, 0x46, + 0x90, 0x47, 0x01, 0x28, 0x0b, 0xd1, 0x17, 0x48, 0x4f, 0xf4, 0x7a, 0x41, + 0x0b, 0x22, 0x03, 0x68, 0x20, 0x46, 0x98, 0x47, 0x0c, 0x20, 0x84, 0xf8, + 0x3b, 0x03, 0xbd, 0xe8, 0xfc, 0x87, 0x04, 0xeb, 0xc7, 0x00, 0x03, 0x21, + 0x80, 0xf8, 0xbe, 0x13, 0x0f, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, + 0x01, 0x28, 0x08, 0xd1, 0x0d, 0x48, 0x21, 0x46, 0x00, 0x22, 0x01, 0x23, + 0x05, 0x68, 0x32, 0x20, 0xa8, 0x47, 0xbd, 0xe8, 0xfc, 0x87, 0xd4, 0xf8, + 0x34, 0x03, 0x20, 0xf0, 0x80, 0x00, 0xc4, 0xf8, 0x34, 0x03, 0xbd, 0xe8, + 0xfc, 0x87, 0x00, 0xbf, 0x10, 0xc1, 0x08, 0x00, 0x18, 0xc1, 0x08, 0x00, + 0x1c, 0xc1, 0x08, 0x00, 0x8c, 0x9b, 0x08, 0x00, 0x14, 0xc1, 0x08, 0x00, + 0x80, 0x9b, 0x08, 0x00, 0xf0, 0xb5, 0x85, 0xb0, 0x4f, 0x4f, 0x04, 0x46, + 0x0d, 0x46, 0x38, 0x68, 0x04, 0x90, 0x4e, 0x48, 0x01, 0x68, 0x20, 0x46, + 0x88, 0x47, 0x70, 0xb1, 0xf1, 0x48, 0x21, 0x46, 0x2a, 0x46, 0x01, 0x23, + 0x06, 0x68, 0x96, 0x20, 0xb0, 0x47, 0x38, 0x68, 0x04, 0x99, 0x40, 0x1a, + 0x04, 0xbf, 0x05, 0xb0, 0xf0, 0xbd, 0xf0, 0xf7, 0x29, 0xfc, 0x25, 0xb9, + 0x00, 0x20, 0x40, 0xf2, 0x55, 0x51, 0xea, 0xf7, 0xd3, 0xfd, 0x28, 0x79, + 0x0e, 0x28, 0x0b, 0xd1, 0x40, 0x48, 0x00, 0x78, 0x00, 0x07, 0x07, 0xd4, + 0x45, 0x48, 0x07, 0x21, 0x0e, 0x22, 0x00, 0x23, 0x05, 0x68, 0x20, 0x46, + 0xa8, 0x47, 0xe2, 0xe7, 0x94, 0xf8, 0x3c, 0x03, 0x04, 0x28, 0xde, 0xd0, + 0x6a, 0x1d, 0x02, 0xad, 0x08, 0x21, 0x08, 0x23, 0x28, 0x46, 0xea, 0xf7, + 0xcb, 0xfd, 0x04, 0xf2, 0x4a, 0x36, 0x08, 0x21, 0x2a, 0x46, 0x08, 0x23, + 0x30, 0x46, 0xea, 0xf7, 0xc3, 0xfd, 0x31, 0x4d, 0x9d, 0xf8, 0x08, 0x10, + 0x31, 0x4a, 0x28, 0x78, 0x08, 0x40, 0xd4, 0xf8, 0x34, 0x13, 0x84, 0xf8, + 0x4a, 0x03, 0xc0, 0xb2, 0x41, 0xf0, 0x04, 0x01, 0xc4, 0xf8, 0x34, 0x13, + 0x94, 0xf8, 0x4b, 0x13, 0x40, 0xea, 0x01, 0x23, 0x28, 0x48, 0x78, 0x21, + 0xed, 0xf7, 0xd4, 0xff, 0x28, 0x48, 0x90, 0xf8, 0x2c, 0x01, 0x80, 0x07, + 0x05, 0xd5, 0x27, 0x48, 0x23, 0x4a, 0x02, 0x21, 0x03, 0x68, 0x02, 0x20, + 0x98, 0x47, 0x30, 0x78, 0x80, 0x06, 0x44, 0xbf, 0x28, 0x78, 0x5f, 0xea, + 0x80, 0x60, 0x27, 0xd4, 0x94, 0xf8, 0x4d, 0x03, 0xc1, 0x07, 0x01, 0xd1, + 0x80, 0x07, 0x05, 0xd5, 0xd4, 0xf8, 0x34, 0x03, 0x40, 0xf4, 0x80, 0x70, + 0xc4, 0xf8, 0x34, 0x03, 0x6e, 0x46, 0x08, 0x21, 0x2a, 0x46, 0x08, 0x23, + 0x30, 0x46, 0xea, 0xf7, 0x87, 0xfd, 0x04, 0x20, 0x9d, 0xf8, 0x08, 0x10, + 0x84, 0xf8, 0x3c, 0x03, 0x28, 0x78, 0x08, 0x40, 0x31, 0x46, 0x8d, 0xf8, + 0x00, 0x00, 0x9d, 0xf8, 0x03, 0x00, 0x00, 0xf0, 0xf7, 0x00, 0x8d, 0xf8, + 0x03, 0x00, 0x11, 0x48, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0x7e, 0xe7, + 0x0d, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x00, 0x28, 0xd1, 0xd0, + 0xaa, 0x48, 0x21, 0x46, 0x00, 0x22, 0x01, 0x23, 0x06, 0x68, 0x20, 0x20, + 0xb0, 0x47, 0xc9, 0xe7, 0x38, 0xec, 0x01, 0x00, 0xa0, 0x9b, 0x08, 0x00, + 0x70, 0x52, 0x01, 0x00, 0xff, 0x6a, 0x01, 0x00, 0x74, 0x6e, 0x03, 0x00, + 0x8c, 0x7e, 0x08, 0x00, 0x70, 0x9b, 0x08, 0x00, 0x7c, 0x9b, 0x08, 0x00, + 0x10, 0xc2, 0x08, 0x00, 0x98, 0x9b, 0x08, 0x00, 0xf0, 0xb5, 0x85, 0xb0, + 0x04, 0x46, 0x15, 0x46, 0x90, 0xf8, 0x35, 0x01, 0x01, 0xf0, 0x7f, 0x03, + 0x26, 0x29, 0x94, 0xf8, 0x3b, 0x23, 0x8d, 0xf8, 0x0d, 0x30, 0x8d, 0xf8, + 0x0e, 0x00, 0x8d, 0xf8, 0x0c, 0x20, 0x94, 0xf9, 0x3c, 0x23, 0x8d, 0xf8, + 0x10, 0x20, 0x49, 0xd0, 0x05, 0x29, 0x4f, 0xd1, 0x00, 0x2d, 0x60, 0xd0, + 0xa9, 0x78, 0x02, 0x29, 0x4d, 0xd1, 0x8f, 0x49, 0x68, 0x22, 0x10, 0xfb, + 0x02, 0x10, 0x00, 0x79, 0x01, 0x28, 0x46, 0xd1, 0x5c, 0x48, 0x90, 0x21, + 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0x5b, 0x48, 0x00, 0x21, 0x02, 0x68, + 0x20, 0x46, 0x90, 0x47, 0x59, 0x48, 0xb4, 0xf8, 0xdc, 0x72, 0x94, 0xf8, + 0xec, 0x32, 0x94, 0xf8, 0x35, 0x11, 0xb4, 0xf8, 0xe4, 0x62, 0xd0, 0xf8, + 0x00, 0xc0, 0xd4, 0xf8, 0xd4, 0x00, 0x42, 0x7f, 0xb4, 0xf8, 0xda, 0x02, + 0xcd, 0xe9, 0x00, 0x07, 0x10, 0x20, 0x02, 0x96, 0xe0, 0x47, 0x50, 0x48, + 0x94, 0xf8, 0xf2, 0x12, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0x28, 0x46, + 0xf0, 0xf7, 0x72, 0xfb, 0xf4, 0x48, 0x00, 0x68, 0x18, 0xb9, 0x45, 0x48, + 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x94, 0xf8, 0x3b, 0x03, 0x03, 0xaa, + 0x00, 0x21, 0x05, 0x23, 0x8d, 0xf8, 0x0f, 0x00, 0x40, 0x48, 0x05, 0x68, + 0x40, 0xf2, 0x03, 0x20, 0xa8, 0x47, 0x12, 0xe0, 0x00, 0x2a, 0x03, 0xd4, + 0x39, 0x48, 0x00, 0x68, 0x80, 0x47, 0xd0, 0xb1, 0x01, 0x26, 0x19, 0xe0, + 0x20, 0x46, 0x2a, 0x46, 0x12, 0xe0, 0x20, 0x46, 0x05, 0x21, 0x2a, 0x46, + 0x00, 0xf0, 0xa8, 0xfb, 0xa8, 0x78, 0x01, 0x28, 0x44, 0xd1, 0x94, 0xf8, + 0xf2, 0x12, 0x20, 0x46, 0x01, 0x22, 0x00, 0x23, 0x1a, 0xf0, 0x80, 0xfb, + 0x3c, 0xe0, 0x20, 0x46, 0x05, 0x21, 0x00, 0x22, 0x00, 0xf0, 0x98, 0xfb, + 0x36, 0xe0, 0x00, 0x26, 0x2a, 0x48, 0x29, 0x46, 0x05, 0x22, 0x03, 0x68, + 0x20, 0x46, 0x98, 0x47, 0xd5, 0x48, 0x00, 0x22, 0x01, 0x1d, 0x00, 0x20, + 0x51, 0xf8, 0x04, 0x3c, 0x2b, 0xb1, 0x0b, 0x78, 0x43, 0xf0, 0x02, 0x03, + 0x02, 0x2b, 0x08, 0xbf, 0x01, 0x30, 0x01, 0x32, 0x0c, 0x31, 0x17, 0x2a, + 0xf2, 0xd1, 0xd4, 0xf8, 0xd4, 0x10, 0x49, 0x7f, 0x39, 0xb1, 0x00, 0x06, + 0x05, 0xd0, 0x94, 0xf8, 0x3b, 0x03, 0x87, 0x28, 0x08, 0xbf, 0x00, 0x2e, + 0x14, 0xd0, 0xc8, 0x48, 0x00, 0x68, 0x18, 0xb9, 0xce, 0x48, 0x01, 0x68, + 0x20, 0x46, 0x88, 0x47, 0x94, 0xf8, 0x3b, 0x03, 0x03, 0xaa, 0x00, 0x21, + 0x05, 0x23, 0x8d, 0xf8, 0x0f, 0x00, 0x14, 0x48, 0x04, 0x68, 0x40, 0xf2, + 0x03, 0x20, 0xa0, 0x47, 0x05, 0xb0, 0xf0, 0xbd, 0x94, 0xf8, 0x37, 0x03, + 0x40, 0x06, 0xe6, 0xd4, 0x94, 0xf8, 0x35, 0x01, 0x3d, 0x4d, 0x68, 0x26, + 0x10, 0xfb, 0x06, 0x50, 0x00, 0x6e, 0x01, 0x30, 0xdd, 0xd1, 0xea, 0xf7, + 0x81, 0xfc, 0x94, 0xf8, 0x35, 0x11, 0x11, 0xfb, 0x06, 0x51, 0x08, 0x66, + 0xd4, 0xf8, 0x34, 0x03, 0x40, 0xf0, 0x80, 0x40, 0xc4, 0xf8, 0x34, 0x03, + 0xcf, 0xe7, 0x00, 0xbf, 0x14, 0xb5, 0x08, 0x00, 0xcc, 0xc6, 0x08, 0x00, + 0x10, 0xb5, 0x08, 0x00, 0x78, 0x9b, 0x08, 0x00, 0x88, 0x9b, 0x08, 0x00, + 0x58, 0xc4, 0x08, 0x00, 0x10, 0xbb, 0x08, 0x00, 0x98, 0xc4, 0x08, 0x00, + 0xb0, 0xb5, 0x90, 0xf8, 0x74, 0x50, 0x04, 0x46, 0x00, 0xf0, 0x32, 0xfb, + 0x94, 0xf8, 0xf2, 0x12, 0x20, 0x46, 0x02, 0x22, 0x2b, 0x46, 0xbd, 0xe8, + 0xb0, 0x40, 0x1a, 0xf0, 0x05, 0xbb, 0x00, 0xbf, 0x90, 0xf8, 0x3b, 0x23, + 0x8d, 0x2a, 0x08, 0xbf, 0x00, 0xf0, 0x28, 0xbb, 0xd0, 0xf8, 0x00, 0x14, + 0xd1, 0xf8, 0xec, 0x10, 0x11, 0xb1, 0x91, 0xf8, 0x1f, 0x11, 0x00, 0xe0, + 0x02, 0x21, 0xce, 0x4a, 0x00, 0x23, 0xd2, 0xf8, 0x00, 0xc0, 0x20, 0x22, + 0x60, 0x47, 0x90, 0xf8, 0xd1, 0x11, 0x00, 0x20, 0x0b, 0x29, 0x38, 0xbf, + 0x01, 0x20, 0x70, 0x47, 0xb0, 0xb5, 0x04, 0x46, 0x90, 0xf8, 0x89, 0x00, + 0xc0, 0x07, 0x20, 0xd1, 0xed, 0x48, 0x0d, 0x46, 0x01, 0x68, 0x20, 0x46, + 0x88, 0x47, 0x48, 0xb1, 0x0d, 0x48, 0x21, 0x46, 0x2a, 0x46, 0x01, 0x23, + 0xd0, 0xf8, 0x00, 0xc0, 0x98, 0x20, 0xbd, 0xe8, 0xb0, 0x40, 0x60, 0x47, + 0x20, 0x46, 0x29, 0x46, 0x00, 0xf0, 0xfe, 0xfa, 0x94, 0xf8, 0xd1, 0x01, + 0x0a, 0x28, 0x08, 0xd8, 0x94, 0xf8, 0x35, 0x01, 0x04, 0x49, 0x68, 0x22, + 0x10, 0xfb, 0x02, 0x10, 0x00, 0x21, 0x80, 0xf8, 0x50, 0x10, 0xb0, 0xbd, + 0x80, 0x9b, 0x08, 0x00, 0xb0, 0xe6, 0x05, 0x00, 0x10, 0xb5, 0x04, 0x46, + 0x00, 0xf0, 0xee, 0xfa, 0x94, 0xf8, 0x3b, 0x03, 0x00, 0xb1, 0x10, 0xbd, + 0x94, 0xf8, 0x3c, 0x03, 0x00, 0x28, 0xfa, 0xd1, 0xd5, 0x48, 0x72, 0xb6, + 0x01, 0x68, 0x49, 0x00, 0x01, 0x31, 0x01, 0x60, 0xb4, 0xf8, 0x84, 0x10, + 0x6f, 0xf3, 0xdf, 0x31, 0xa4, 0xf8, 0x84, 0x10, 0x01, 0x68, 0x49, 0x08, + 0x01, 0x60, 0x00, 0x68, 0x80, 0xf3, 0x10, 0x88, 0x10, 0xbd, 0x00, 0xbf, + 0x01, 0x78, 0x34, 0x29, 0x0b, 0xd1, 0x40, 0x78, 0x68, 0x49, 0x00, 0xeb, + 0x40, 0x00, 0x51, 0xf8, 0x20, 0x00, 0x90, 0xf8, 0x34, 0x03, 0x40, 0x07, + 0x44, 0xbf, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0xb0, 0xb5, + 0x00, 0x68, 0x00, 0x24, 0x68, 0xb1, 0x05, 0x46, 0xff, 0xf7, 0xe8, 0xff, + 0x20, 0xb9, 0x95, 0xf9, 0x00, 0x00, 0xb0, 0xf1, 0xff, 0x3f, 0x04, 0xdc, + 0x55, 0xf8, 0x04, 0x0c, 0x2c, 0x46, 0x00, 0x28, 0xf1, 0xd1, 0x20, 0x46, + 0xb0, 0xbd, 0x00, 0xbf, 0x2d, 0xe9, 0xf0, 0x41, 0x01, 0xb3, 0x06, 0x46, + 0x91, 0xf8, 0x35, 0x01, 0x0c, 0x46, 0x16, 0x28, 0x1a, 0xd8, 0x53, 0x49, + 0x15, 0x46, 0x00, 0xeb, 0x40, 0x02, 0x51, 0xf8, 0x22, 0x20, 0x9a, 0xb1, + 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, 0x80, 0x00, 0x00, 0x79, 0x03, 0x28, + 0x0c, 0xd1, 0x1f, 0x46, 0xf6, 0xf7, 0xaa, 0xfd, 0xdf, 0xf8, 0x2c, 0x81, + 0xd8, 0xf8, 0x00, 0x00, 0x65, 0xb1, 0xa8, 0x42, 0x3b, 0xd0, 0x4f, 0xf0, + 0x00, 0x08, 0x0c, 0xe0, 0x00, 0x20, 0x40, 0xf2, 0x16, 0x71, 0xf0, 0xf7, + 0xf3, 0xf9, 0x0c, 0x20, 0xbd, 0xe8, 0xf0, 0x81, 0x41, 0x1c, 0x02, 0x29, + 0x55, 0xd2, 0x4f, 0xf0, 0x01, 0x08, 0x6f, 0xb1, 0x41, 0x48, 0x00, 0x68, + 0x50, 0xb1, 0x01, 0x78, 0xb1, 0x42, 0x04, 0xd1, 0x94, 0xf8, 0x35, 0x11, + 0x42, 0x78, 0x8a, 0x42, 0x53, 0xd0, 0x50, 0xf8, 0x04, 0x0c, 0xf3, 0xe7, + 0xf6, 0xf7, 0x88, 0xfd, 0xb8, 0xf1, 0x00, 0x0f, 0x2f, 0x46, 0x08, 0xd0, + 0x38, 0x48, 0x00, 0x68, 0x80, 0x47, 0x00, 0x28, 0x42, 0xd0, 0x05, 0x21, + 0x07, 0x46, 0xed, 0xf7, 0xc5, 0xf9, 0x94, 0xf8, 0x35, 0x01, 0x3e, 0x70, + 0x78, 0x70, 0x38, 0x46, 0xff, 0xf7, 0x84, 0xff, 0x20, 0xb3, 0x31, 0x48, + 0x2e, 0x49, 0x02, 0x68, 0x38, 0x46, 0x90, 0x47, 0x3c, 0xe0, 0x29, 0x78, + 0xb1, 0x42, 0x04, 0xd1, 0x94, 0xf8, 0x35, 0x11, 0x40, 0x78, 0x88, 0x42, + 0x0f, 0xd0, 0x27, 0x48, 0x27, 0x4f, 0x29, 0x46, 0x02, 0x68, 0x38, 0x46, + 0x90, 0x47, 0xd8, 0xf8, 0x00, 0x00, 0x94, 0xf8, 0x35, 0x11, 0x41, 0x70, + 0x06, 0x70, 0x28, 0x46, 0x39, 0x46, 0xec, 0xf7, 0x2d, 0xfd, 0x4f, 0xf0, + 0xff, 0x30, 0xc8, 0xf8, 0x00, 0x00, 0xf6, 0xf7, 0x4f, 0xfd, 0x2f, 0xe0, + 0x70, 0xb2, 0x1c, 0x49, 0xb0, 0xf1, 0xff, 0x3f, 0x14, 0xdd, 0x38, 0x46, + 0xec, 0xf7, 0x1e, 0xfd, 0x14, 0xe0, 0x01, 0x78, 0xb1, 0x42, 0xa6, 0xd1, + 0x94, 0xf8, 0x35, 0x11, 0x40, 0x78, 0x88, 0x42, 0xa1, 0xd1, 0xe6, 0xe7, + 0x07, 0x20, 0xbd, 0xe8, 0xf0, 0x81, 0xf6, 0xf7, 0x37, 0xfd, 0x3a, 0x20, + 0xbd, 0xe8, 0xf0, 0x81, 0x12, 0x4a, 0x38, 0x46, 0x1b, 0xf0, 0xc0, 0xff, + 0x11, 0x48, 0x01, 0x68, 0x19, 0xb1, 0xa9, 0x42, 0x04, 0xbf, 0x00, 0x21, + 0x01, 0x60, 0x0f, 0x48, 0x01, 0x68, 0x19, 0xb1, 0xa9, 0x42, 0x04, 0xbf, + 0x00, 0x21, 0x01, 0x60, 0x0c, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, + 0x00, 0x20, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0xbf, 0xe8, 0x72, 0x01, 0x00, + 0x60, 0x52, 0x01, 0x00, 0xe8, 0xa0, 0x08, 0x00, 0x54, 0x52, 0x01, 0x00, + 0x48, 0xb5, 0x08, 0x00, 0x4c, 0xb5, 0x08, 0x00, 0x5f, 0x68, 0x03, 0x00, + 0x64, 0x52, 0x01, 0x00, 0x68, 0x52, 0x01, 0x00, 0x10, 0xb5, 0x08, 0x00, + 0x08, 0x48, 0x00, 0x78, 0x50, 0xb1, 0x08, 0x4a, 0x00, 0x21, 0x52, 0xf8, + 0x21, 0x30, 0x13, 0xb1, 0xd3, 0xf8, 0x00, 0x34, 0x23, 0xb9, 0x01, 0x31, + 0x81, 0x42, 0xf6, 0xd3, 0x00, 0x20, 0x70, 0x47, 0x01, 0x20, 0x70, 0x47, + 0x53, 0x34, 0x01, 0x00, 0xb8, 0x57, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x46, + 0xd0, 0xf8, 0xd4, 0x00, 0x0d, 0x46, 0x40, 0x7f, 0x50, 0xb1, 0xff, 0xf7, + 0xe1, 0xff, 0xa0, 0xb1, 0xaa, 0x48, 0x21, 0x46, 0x2a, 0x46, 0x01, 0x23, + 0xd0, 0xf8, 0x00, 0xc0, 0xa2, 0x20, 0x2b, 0xe0, 0x94, 0xf9, 0x3b, 0x03, + 0xb0, 0xf1, 0xff, 0x3f, 0x17, 0xdd, 0x94, 0xf9, 0x3c, 0x03, 0xb0, 0xf1, + 0xff, 0x3f, 0xea, 0xdc, 0x13, 0x48, 0x24, 0x21, 0x19, 0xe0, 0x11, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x28, 0xb1, 0x94, 0xf8, 0x3b, 0x03, 0x81, 0x28, + 0x01, 0xd0, 0x87, 0x28, 0xe0, 0xd1, 0x20, 0x46, 0x29, 0x46, 0xbd, 0xe8, + 0xb0, 0x40, 0x00, 0xf0, 0xa9, 0xb9, 0x10, 0xf1, 0x7f, 0x01, 0x4f, 0xf0, + 0x23, 0x01, 0x03, 0xd0, 0xc0, 0xb2, 0x87, 0x28, 0x18, 0xbf, 0x2a, 0x21, + 0x05, 0x48, 0xd0, 0xf8, 0x00, 0xc0, 0x20, 0x46, 0x0f, 0x22, 0x00, 0x23, + 0xbd, 0xe8, 0xb0, 0x40, 0x60, 0x47, 0x00, 0xbf, 0x14, 0xb5, 0x08, 0x00, + 0x94, 0x9b, 0x08, 0x00, 0xb0, 0xb5, 0x15, 0x46, 0x04, 0x46, 0x00, 0xf0, + 0x93, 0xf9, 0x0f, 0x2d, 0x13, 0xd1, 0x94, 0xf8, 0x3e, 0x03, 0xc1, 0x07, + 0x0f, 0xd0, 0xb4, 0xf8, 0xdc, 0x12, 0x08, 0x29, 0x07, 0xd3, 0x10, 0x29, + 0x05, 0xd8, 0xb4, 0xf8, 0xe8, 0x12, 0x11, 0xb1, 0xb4, 0xf8, 0xea, 0x12, + 0x19, 0xb9, 0x00, 0xf0, 0xfe, 0x00, 0x84, 0xf8, 0x3e, 0x03, 0xb0, 0xbd, + 0x68, 0xb3, 0xb0, 0xb5, 0x05, 0x46, 0x18, 0x48, 0x0c, 0x46, 0x01, 0x68, + 0x28, 0x46, 0x88, 0x47, 0x20, 0xb1, 0x00, 0x20, 0x40, 0xf6, 0x14, 0x01, + 0xea, 0xf7, 0x70, 0xfa, 0xd5, 0xf8, 0x10, 0x03, 0xb8, 0xb9, 0xb5, 0xf8, + 0x14, 0x03, 0xb5, 0xf8, 0x16, 0x13, 0x81, 0x42, 0x11, 0xd1, 0x0f, 0x48, + 0x72, 0xb6, 0x01, 0x68, 0x49, 0x00, 0x01, 0x31, 0x01, 0x60, 0xb5, 0xf8, + 0x84, 0x10, 0x41, 0xf4, 0x00, 0x41, 0xa5, 0xf8, 0x84, 0x10, 0x01, 0x68, + 0x49, 0x08, 0x01, 0x60, 0x00, 0x68, 0x80, 0xf3, 0x10, 0x88, 0x28, 0x46, + 0x21, 0x46, 0xbd, 0xe8, 0xb0, 0x40, 0x00, 0xf0, 0x53, 0xb9, 0x00, 0x20, + 0x40, 0xf6, 0x0e, 0x01, 0xf0, 0xf7, 0xac, 0xb8, 0xa0, 0x9b, 0x08, 0x00, + 0x24, 0x36, 0x01, 0x00, 0x20, 0xb1, 0xd0, 0xf8, 0x00, 0x24, 0x0a, 0xb1, + 0x00, 0xf0, 0x4a, 0xb9, 0x70, 0x47, 0xd0, 0xf8, 0x50, 0x24, 0x2a, 0xb1, + 0xb0, 0xf8, 0xe4, 0x32, 0xd3, 0x80, 0xb0, 0xf8, 0xe2, 0x32, 0x13, 0x81, + 0x00, 0xf0, 0x44, 0xb9, 0x90, 0xf8, 0x34, 0x23, 0x52, 0x07, 0x09, 0xd5, + 0x90, 0xf8, 0x4c, 0x23, 0xd2, 0x07, 0x05, 0xd0, 0x03, 0x4a, 0x92, 0x78, + 0xd2, 0x07, 0x18, 0xbf, 0x00, 0xf0, 0x3c, 0xb9, 0x70, 0x47, 0x00, 0xbf, + 0x70, 0x52, 0x01, 0x00, 0x2a, 0x48, 0x2b, 0x49, 0x01, 0x60, 0x2b, 0x48, + 0x2b, 0x49, 0x01, 0x60, 0x2b, 0x48, 0x2c, 0x49, 0x01, 0x60, 0x2c, 0x48, + 0x2c, 0x49, 0x01, 0x60, 0x2c, 0x48, 0x2d, 0x49, 0x01, 0x60, 0x2d, 0x48, + 0x2d, 0x49, 0x01, 0x60, 0x2d, 0x48, 0x2e, 0x49, 0x81, 0x61, 0x2e, 0x48, + 0x2e, 0x49, 0x01, 0x60, 0x2e, 0x48, 0x2f, 0x49, 0x01, 0x60, 0x2f, 0x48, + 0x2f, 0x49, 0x01, 0x60, 0x2f, 0x48, 0x30, 0x49, 0x01, 0x60, 0x30, 0x48, + 0x30, 0x49, 0x01, 0x60, 0x30, 0x48, 0x31, 0x49, 0x01, 0x60, 0x31, 0x48, + 0x31, 0x49, 0x01, 0x60, 0x31, 0x48, 0x32, 0x49, 0x01, 0x60, 0x32, 0x48, + 0x32, 0x49, 0x01, 0x60, 0x32, 0x48, 0x33, 0x49, 0x01, 0x60, 0x33, 0x48, + 0x33, 0x49, 0x01, 0x60, 0x33, 0x48, 0x34, 0x49, 0x01, 0x60, 0x34, 0x48, + 0x34, 0x49, 0x01, 0x60, 0x34, 0x48, 0x35, 0x49, 0x01, 0x60, 0x35, 0x48, + 0x35, 0x49, 0x01, 0x60, 0x35, 0x48, 0x36, 0x49, 0x01, 0x60, 0x36, 0x48, + 0x36, 0x49, 0x01, 0x60, 0x36, 0x48, 0x37, 0x49, 0x01, 0x60, 0x37, 0x48, + 0x37, 0x49, 0x01, 0x60, 0x37, 0x48, 0x38, 0x49, 0x01, 0x60, 0x38, 0x48, + 0x38, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, 0x64, 0xcc, 0x08, 0x00, + 0x09, 0x58, 0x03, 0x00, 0x60, 0xc8, 0x08, 0x00, 0x9d, 0x57, 0x03, 0x00, + 0xc8, 0xc6, 0x08, 0x00, 0xa9, 0x58, 0x03, 0x00, 0x58, 0xc1, 0x08, 0x00, + 0x5d, 0x59, 0x03, 0x00, 0x94, 0xc4, 0x08, 0x00, 0x99, 0x5b, 0x03, 0x00, + 0x58, 0xcc, 0x08, 0x00, 0x09, 0x5c, 0x03, 0x00, 0x38, 0xc0, 0x08, 0x00, + 0x59, 0x5c, 0x03, 0x00, 0x64, 0xc6, 0x08, 0x00, 0xb9, 0x5f, 0x03, 0x00, + 0x50, 0xcc, 0x08, 0x00, 0x0d, 0x60, 0x03, 0x00, 0x1c, 0xc6, 0x08, 0x00, + 0x49, 0x60, 0x03, 0x00, 0xb4, 0xc1, 0x08, 0x00, 0x75, 0x60, 0x03, 0x00, + 0xbc, 0xc1, 0x08, 0x00, 0x91, 0x60, 0x03, 0x00, 0xa8, 0xc1, 0x08, 0x00, + 0xad, 0x60, 0x03, 0x00, 0x60, 0xc6, 0x08, 0x00, 0x29, 0x63, 0x03, 0x00, + 0x18, 0xc6, 0x08, 0x00, 0x15, 0x64, 0x03, 0x00, 0x60, 0xcc, 0x08, 0x00, + 0x81, 0x65, 0x03, 0x00, 0xa0, 0xc1, 0x08, 0x00, 0x4d, 0x67, 0x03, 0x00, + 0x60, 0xc1, 0x08, 0x00, 0x6d, 0x67, 0x03, 0x00, 0x24, 0xc6, 0x08, 0x00, + 0xa5, 0x67, 0x03, 0x00, 0x80, 0x9b, 0x08, 0x00, 0x89, 0x68, 0x03, 0x00, + 0x88, 0x9b, 0x08, 0x00, 0xfd, 0x67, 0x03, 0x00, 0xd4, 0xc6, 0x08, 0x00, + 0x3d, 0x6a, 0x03, 0x00, 0x5c, 0xcc, 0x08, 0x00, 0xc9, 0x6a, 0x03, 0x00, + 0xe0, 0xc6, 0x08, 0x00, 0x01, 0x6b, 0x03, 0x00, 0x9c, 0xc4, 0x08, 0x00, + 0x71, 0x6b, 0x03, 0x00, 0x98, 0xc1, 0x08, 0x00, 0x7f, 0x6b, 0x03, 0x00, + 0x5c, 0xc6, 0x08, 0x00, 0x95, 0x6b, 0x03, 0x00, 0x18, 0xc1, 0x08, 0x00, + 0x39, 0x62, 0x03, 0x00, 0x42, 0xf6, 0x71, 0x1c, 0xc1, 0xf2, 0x07, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x44, 0xf6, 0x8d, 0x5c, 0xc1, 0xf2, 0x07, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4f, 0xf2, 0x09, 0x6c, 0xc1, 0xf2, 0x06, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4e, 0xf2, 0xe3, 0x6c, 0xc1, 0xf2, 0x0f, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x42, 0xf6, 0x5d, 0x5c, 0xc1, 0xf2, 0x07, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4f, 0xf2, 0x9d, 0x1c, 0xc1, 0xf2, 0x06, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x44, 0xf2, 0x31, 0x0c, 0xc1, 0xf2, 0x07, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf2, 0xc5, 0x0c, 0xc1, 0xf2, 0x07, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf2, 0x79, 0x0c, 0xc1, 0xf2, 0x07, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4f, 0xf6, 0xe9, 0x5c, 0xc1, 0xf2, 0x06, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf2, 0xfd, 0x6c, 0xc1, 0xf2, 0x07, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x42, 0xf2, 0x01, 0x2c, 0xc1, 0xf2, 0x07, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x43, 0xf6, 0x91, 0x6c, 0xc1, 0xf2, 0x07, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf6, 0x0d, 0x1c, 0xc1, 0xf2, 0x07, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x44, 0xf6, 0x3d, 0x1c, 0xc1, 0xf2, 0x07, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x44, 0xf6, 0x71, 0x6c, 0xc1, 0xf2, 0x07, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x44, 0xf2, 0x31, 0x3c, 0xc1, 0xf2, 0x07, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf6, 0x09, 0x6c, 0xc1, 0xf2, 0x07, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf6, 0x75, 0x1c, 0xc1, 0xf2, 0x07, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x42, 0xf6, 0x9d, 0x7c, 0xc1, 0xf2, 0x07, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x49, 0x53, 0x4f, 0x3a, 0x20, 0x4d, 0x20, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x00, 0x49, 0x53, 0x4f, 0x3a, + 0x20, 0x4d, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x43, 0x68, 0x20, 0x4f, 0x66, + 0x66, 0x3a, 0x25, 0x64, 0x00, 0x49, 0x53, 0x4f, 0x3a, 0x20, 0x54, 0x78, + 0x20, 0x43, 0x49, 0x53, 0x52, 0x65, 0x71, 0x00, 0x70, 0x65, 0x65, 0x72, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x25, + 0x30, 0x34, 0x78, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, 0x91, 0xb0, 0xdf, 0xf8, + 0x2c, 0x55, 0x0b, 0x91, 0x04, 0x46, 0x29, 0x46, 0x68, 0x79, 0x11, 0xf8, + 0x04, 0x2f, 0x42, 0xea, 0x00, 0x20, 0x8a, 0x78, 0xc9, 0x78, 0x42, 0xea, + 0x01, 0x21, 0x40, 0xea, 0x01, 0x40, 0xa8, 0x42, 0x00, 0xf0, 0x79, 0x82, + 0xdf, 0xf8, 0x08, 0x05, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x20, 0xb1, + 0xfa, 0xf7, 0xee, 0xf9, 0x00, 0x28, 0x00, 0xf0, 0x6e, 0x82, 0xdf, 0xf8, + 0xf8, 0x04, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x29, 0x46, 0x06, 0x46, + 0x68, 0x79, 0x11, 0xf8, 0x04, 0x2f, 0x42, 0xea, 0x00, 0x20, 0x8a, 0x78, + 0xc9, 0x78, 0x42, 0xea, 0x01, 0x21, 0x40, 0xea, 0x01, 0x47, 0xaf, 0x42, + 0x00, 0xf0, 0x5c, 0x82, 0x0b, 0x98, 0x4f, 0xf0, 0x00, 0x08, 0x02, 0x21, + 0x00, 0x28, 0x08, 0xbf, 0x01, 0x21, 0x0a, 0x91, 0x97, 0xf9, 0x60, 0x00, + 0x7f, 0x28, 0x03, 0xd0, 0x71, 0xb2, 0x81, 0x42, 0xc0, 0xf2, 0x3a, 0x82, + 0x97, 0xf9, 0x5f, 0x00, 0x7f, 0x28, 0x03, 0xd0, 0x71, 0xb2, 0x81, 0x42, + 0x00, 0xf3, 0x32, 0x82, 0xb8, 0x68, 0x00, 0x28, 0x00, 0xf0, 0x2e, 0x82, + 0x0b, 0x98, 0x98, 0xb1, 0xdf, 0xf8, 0x90, 0x04, 0x01, 0x68, 0x0b, 0x98, + 0x88, 0x47, 0x06, 0x46, 0x97, 0xf9, 0x60, 0x00, 0x7f, 0x28, 0x02, 0xd0, + 0x86, 0x42, 0xc0, 0xf2, 0x1f, 0x82, 0x97, 0xf9, 0x5f, 0x00, 0x7f, 0x28, + 0x02, 0xd0, 0x86, 0x42, 0x00, 0xf3, 0x18, 0x82, 0xdf, 0xf8, 0x6c, 0x04, + 0x00, 0x78, 0xf0, 0xb1, 0x00, 0x20, 0xad, 0xf8, 0x38, 0x00, 0xb7, 0xf8, + 0x5c, 0x00, 0xc1, 0x07, 0xad, 0xf8, 0x3a, 0x00, 0x22, 0xd0, 0xdf, 0xf8, + 0x5c, 0x04, 0x07, 0xf1, 0x10, 0x01, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, + 0x01, 0x28, 0x17, 0xd1, 0xbd, 0xf8, 0x38, 0x00, 0x40, 0xf0, 0x01, 0x00, + 0xad, 0xf8, 0x38, 0x00, 0xbd, 0xf8, 0x3a, 0x00, 0x20, 0xf0, 0x01, 0x00, + 0xad, 0xf8, 0x3a, 0x00, 0x0c, 0xe0, 0xdf, 0xf8, 0x2c, 0x14, 0x97, 0xf8, + 0x5e, 0x00, 0x09, 0x68, 0x88, 0x47, 0x00, 0x28, 0xd8, 0xd0, 0x4f, 0xf0, + 0x01, 0x08, 0xe9, 0xe1, 0xbd, 0xf8, 0x3a, 0x00, 0xc0, 0x05, 0x14, 0xd5, + 0xdf, 0xf8, 0x14, 0x04, 0x07, 0xf1, 0x50, 0x01, 0x02, 0x68, 0x20, 0x46, + 0x90, 0x47, 0x01, 0x28, 0x0b, 0xd1, 0xbd, 0xf8, 0x38, 0x00, 0x40, 0xf4, + 0x80, 0x70, 0xad, 0xf8, 0x38, 0x00, 0xbd, 0xf8, 0x3a, 0x00, 0x20, 0xf4, + 0x80, 0x70, 0xad, 0xf8, 0x3a, 0x00, 0xb7, 0xf8, 0x5a, 0x50, 0x68, 0x07, + 0x52, 0xbf, 0x00, 0x20, 0x07, 0xf1, 0x18, 0x00, 0x00, 0xf0, 0x02, 0xfa, + 0x8d, 0xf8, 0x42, 0x00, 0x28, 0x07, 0x52, 0xbf, 0x00, 0x20, 0x07, 0xf1, + 0x20, 0x00, 0x00, 0xf0, 0xf9, 0xf9, 0x8d, 0xf8, 0x41, 0x00, 0xa8, 0x06, + 0x52, 0xbf, 0x00, 0x20, 0x07, 0xf1, 0x30, 0x00, 0x00, 0xf0, 0xf0, 0xf9, + 0x8d, 0xf8, 0x40, 0x00, 0x68, 0x06, 0x52, 0xbf, 0x00, 0x20, 0x07, 0xf1, + 0x38, 0x00, 0x00, 0xf0, 0xe7, 0xf9, 0x8d, 0xf8, 0x3f, 0x00, 0x68, 0xb2, + 0xb0, 0xf1, 0xff, 0x3f, 0xce, 0xbf, 0x00, 0x20, 0x07, 0xf1, 0x48, 0x00, + 0x00, 0xf0, 0xdc, 0xf9, 0x8d, 0xf8, 0x3e, 0x00, 0xa8, 0x05, 0xcd, 0xf8, + 0x08, 0x80, 0x03, 0x96, 0x52, 0xbf, 0x00, 0x20, 0x07, 0xf1, 0x40, 0x00, + 0x00, 0xf0, 0xd0, 0xf9, 0x8d, 0xf8, 0x3d, 0x00, 0x07, 0xf1, 0x18, 0x00, + 0x07, 0xf1, 0x48, 0x0a, 0x00, 0x26, 0x09, 0x90, 0x07, 0xf1, 0x20, 0x00, + 0x08, 0x90, 0x07, 0xf1, 0x28, 0x00, 0x06, 0x90, 0x07, 0xf1, 0x30, 0x00, + 0x04, 0x90, 0x07, 0xf1, 0x38, 0x00, 0x07, 0x90, 0x07, 0xf1, 0x40, 0x00, + 0x05, 0x90, 0x30, 0x06, 0xdf, 0xf8, 0x48, 0x13, 0xa0, 0x46, 0x0b, 0x98, + 0x08, 0xbf, 0x20, 0x46, 0x0a, 0x68, 0x0d, 0xf1, 0x43, 0x01, 0x90, 0x47, + 0x9d, 0xf8, 0x43, 0x10, 0x00, 0x29, 0x00, 0xf0, 0x2e, 0x81, 0x81, 0x46, + 0x00, 0x25, 0xbd, 0xf8, 0x3a, 0x00, 0x00, 0x28, 0x00, 0xf0, 0x27, 0x81, + 0x19, 0xf8, 0x05, 0x20, 0x00, 0x2a, 0x00, 0xf0, 0x22, 0x81, 0x09, 0xeb, + 0x05, 0x0b, 0x9b, 0xf8, 0x01, 0x30, 0x00, 0x2b, 0x00, 0xf0, 0x1b, 0x81, + 0x15, 0x44, 0x01, 0x35, 0xad, 0xb2, 0x8d, 0x42, 0x00, 0xf2, 0x15, 0x81, + 0x99, 0x1e, 0x24, 0x29, 0x00, 0xf2, 0x74, 0x80, 0xdf, 0xe8, 0x01, 0xf0, + 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x92, 0x92, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0x33, 0x33, 0x53, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0x33, 0x53, 0x53, 0xac, 0xac, 0xac, 0xac, + 0xb5, 0x00, 0x40, 0x07, 0x40, 0xf1, 0xd1, 0x80, 0xb5, 0x48, 0x09, 0x99, + 0x0d, 0xf1, 0x42, 0x02, 0x03, 0x68, 0x58, 0x46, 0x98, 0x47, 0x01, 0x28, + 0x40, 0xf0, 0xc7, 0x80, 0xbd, 0xf8, 0x38, 0x00, 0x40, 0xf0, 0x04, 0x00, + 0xad, 0xf8, 0x38, 0x00, 0x97, 0xf8, 0x61, 0x00, 0x20, 0xb9, 0xb7, 0xf8, + 0x58, 0x00, 0x00, 0x28, 0x00, 0xf0, 0xb6, 0x80, 0xbd, 0xf8, 0x3a, 0x00, + 0x20, 0xf0, 0x04, 0x00, 0xb1, 0xe0, 0x00, 0x07, 0x40, 0xf1, 0xb1, 0x80, + 0xa5, 0x48, 0x08, 0x99, 0x0d, 0xf1, 0x41, 0x02, 0x03, 0x68, 0x58, 0x46, + 0x98, 0x47, 0x01, 0x28, 0x40, 0xf0, 0xa7, 0x80, 0xbd, 0xf8, 0x38, 0x00, + 0x40, 0xf0, 0x08, 0x00, 0xad, 0xf8, 0x38, 0x00, 0x97, 0xf8, 0x61, 0x00, + 0x20, 0xb9, 0xb7, 0xf8, 0x58, 0x00, 0x00, 0x28, 0x00, 0xf0, 0x96, 0x80, + 0xbd, 0xf8, 0x3a, 0x00, 0x20, 0xf0, 0x08, 0x00, 0x91, 0xe0, 0x40, 0x06, + 0x40, 0xf1, 0x91, 0x80, 0x92, 0x48, 0x07, 0x99, 0x0d, 0xf1, 0x3f, 0x02, + 0x03, 0x68, 0x58, 0x46, 0x98, 0x47, 0x01, 0x28, 0x40, 0xf0, 0x87, 0x80, + 0xbd, 0xf8, 0x38, 0x00, 0x40, 0xf0, 0x40, 0x00, 0xad, 0xf8, 0x38, 0x00, + 0x97, 0xf8, 0x61, 0x00, 0x18, 0xb9, 0xb7, 0xf8, 0x58, 0x00, 0x00, 0x28, + 0x76, 0xd0, 0xbd, 0xf8, 0x3a, 0x00, 0x20, 0xf0, 0x40, 0x00, 0x72, 0xe0, + 0x2e, 0x2b, 0x5c, 0xd0, 0xff, 0x2b, 0x35, 0xd1, 0x80, 0x06, 0x6e, 0xd5, + 0x82, 0x48, 0x04, 0x99, 0x10, 0xaa, 0x03, 0x68, 0x58, 0x46, 0x98, 0x47, + 0x01, 0x28, 0x66, 0xd1, 0xbd, 0xf8, 0x38, 0x00, 0x40, 0xf0, 0x20, 0x00, + 0xad, 0xf8, 0x38, 0x00, 0x97, 0xf8, 0x61, 0x00, 0x18, 0xb9, 0xb7, 0xf8, + 0x58, 0x00, 0x00, 0x28, 0x56, 0xd0, 0xbd, 0xf8, 0x3a, 0x00, 0x20, 0xf0, + 0x20, 0x00, 0x52, 0xe0, 0xc0, 0x06, 0x52, 0xd5, 0x75, 0x48, 0x06, 0x99, + 0x02, 0x68, 0x58, 0x46, 0x90, 0x47, 0x01, 0x28, 0x4b, 0xd1, 0xbd, 0xf8, + 0x38, 0x00, 0x40, 0xf0, 0x10, 0x00, 0xad, 0xf8, 0x38, 0x00, 0x97, 0xf8, + 0x61, 0x00, 0x10, 0xb9, 0xb7, 0xf8, 0x58, 0x00, 0xe0, 0xb3, 0xbd, 0xf8, + 0x3a, 0x00, 0x20, 0xf0, 0x10, 0x00, 0x38, 0xe0, 0x6b, 0x48, 0x39, 0x46, + 0x0d, 0xf1, 0x3a, 0x02, 0x0e, 0xab, 0x04, 0x68, 0x58, 0x46, 0xa0, 0x47, + 0x31, 0xe0, 0x80, 0x05, 0x2f, 0xd5, 0x61, 0x48, 0x05, 0x99, 0x0d, 0xf1, + 0x3d, 0x02, 0x03, 0x68, 0x58, 0x46, 0x98, 0x47, 0x01, 0x28, 0x26, 0xd1, + 0xbd, 0xf8, 0x38, 0x00, 0x40, 0xf4, 0x00, 0x70, 0xad, 0xf8, 0x38, 0x00, + 0x97, 0xf8, 0x61, 0x00, 0x10, 0xb9, 0xb7, 0xf8, 0x58, 0x00, 0xb8, 0xb1, + 0xbd, 0xf8, 0x3a, 0x00, 0x20, 0xf4, 0x00, 0x70, 0x13, 0xe0, 0x41, 0x05, + 0x13, 0xd5, 0x07, 0x2a, 0x11, 0xd1, 0xbd, 0xf8, 0x38, 0x10, 0x41, 0xf4, + 0x80, 0x61, 0xad, 0xf8, 0x38, 0x10, 0x97, 0xf8, 0x61, 0x10, 0x11, 0xb9, + 0xb7, 0xf8, 0x58, 0x10, 0x11, 0xb1, 0x20, 0xf4, 0x80, 0x60, 0x00, 0xe0, + 0x00, 0x20, 0xad, 0xf8, 0x3a, 0x00, 0x9d, 0xf9, 0x3a, 0x00, 0xb0, 0xf1, + 0xff, 0x3f, 0x1a, 0xdc, 0x4c, 0x48, 0x51, 0x46, 0x0d, 0xf1, 0x3e, 0x02, + 0x03, 0x68, 0x58, 0x46, 0x98, 0x47, 0x01, 0x28, 0x11, 0xd1, 0xbd, 0xf8, + 0x38, 0x00, 0x40, 0xf0, 0x80, 0x00, 0xad, 0xf8, 0x38, 0x00, 0x97, 0xf8, + 0x61, 0x00, 0x10, 0xb9, 0xb7, 0xf8, 0x58, 0x00, 0x58, 0xb1, 0xbd, 0xf8, + 0x3a, 0x00, 0x20, 0xf0, 0x80, 0x00, 0xad, 0xf8, 0x3a, 0x00, 0x9d, 0xf8, + 0x43, 0x10, 0x8d, 0x42, 0xff, 0xf4, 0xd7, 0xae, 0x01, 0xe0, 0x00, 0x20, + 0xf5, 0xe7, 0x01, 0x36, 0x0a, 0x99, 0x44, 0x46, 0xf0, 0xb2, 0x81, 0x42, + 0x3f, 0xf6, 0xbb, 0xae, 0xbd, 0xf8, 0x3a, 0x00, 0x10, 0xb1, 0x97, 0xf8, + 0x62, 0x00, 0x80, 0xb3, 0xb8, 0x68, 0x70, 0xb3, 0xbd, 0xf8, 0x38, 0x00, + 0x97, 0xf8, 0x61, 0x10, 0x97, 0xf8, 0x62, 0x20, 0x06, 0x23, 0xad, 0xf8, + 0x30, 0x00, 0xb7, 0xf8, 0x5c, 0x00, 0xad, 0xf8, 0x32, 0x00, 0x97, 0xf8, + 0x5e, 0x00, 0x8d, 0xf8, 0x34, 0x00, 0x41, 0xea, 0x02, 0x00, 0x00, 0x21, + 0x0c, 0xaa, 0x8d, 0xf8, 0x35, 0x00, 0x29, 0x48, 0x05, 0x68, 0x40, 0xf2, + 0x0e, 0x20, 0xa8, 0x47, 0xd7, 0xe9, 0x02, 0x52, 0x97, 0xf8, 0x5e, 0x00, + 0xbd, 0xf8, 0x38, 0x10, 0x0b, 0x9b, 0x00, 0x92, 0x22, 0x46, 0xa8, 0x47, + 0xdd, 0xf8, 0x08, 0x80, 0x11, 0x4d, 0xb8, 0xf1, 0x00, 0x0f, 0x08, 0xbf, + 0x80, 0x46, 0x03, 0x9e, 0x02, 0xe0, 0x0e, 0x4d, 0xdd, 0xe9, 0x02, 0x86, + 0x17, 0xf8, 0x04, 0x0f, 0x79, 0x78, 0xba, 0x78, 0xfb, 0x78, 0x40, 0xea, + 0x01, 0x20, 0x42, 0xea, 0x03, 0x21, 0x40, 0xea, 0x01, 0x47, 0xaf, 0x42, + 0x7f, 0xf4, 0xb0, 0xad, 0x04, 0xe0, 0x4f, 0xf0, 0x01, 0x08, 0x01, 0xe0, + 0x4f, 0xf0, 0x00, 0x08, 0x5f, 0xfa, 0x88, 0xf0, 0x11, 0xb0, 0xbd, 0xe8, + 0xf0, 0x8f, 0x00, 0xbf, 0xac, 0x0d, 0x01, 0x00, 0xf8, 0xc5, 0x08, 0x00, + 0x60, 0xa2, 0x08, 0x00, 0x88, 0x4c, 0x01, 0x00, 0x1c, 0xbf, 0x08, 0x00, + 0xd0, 0xc5, 0x08, 0x00, 0xd4, 0xc5, 0x08, 0x00, 0x64, 0xa2, 0x08, 0x00, + 0xe8, 0xc5, 0x08, 0x00, 0xe4, 0xc5, 0x08, 0x00, 0xe0, 0xc5, 0x08, 0x00, + 0xdc, 0xc5, 0x08, 0x00, 0xd8, 0xc5, 0x08, 0x00, 0xec, 0xc5, 0x08, 0x00, + 0xf0, 0xc5, 0x08, 0x00, 0x4c, 0xa2, 0x08, 0x00, 0xb0, 0xb5, 0x02, 0x46, + 0x41, 0x79, 0x12, 0xf8, 0x04, 0x3f, 0x43, 0xea, 0x01, 0x21, 0x93, 0x78, + 0xd2, 0x78, 0x43, 0xea, 0x02, 0x22, 0x41, 0xea, 0x02, 0x42, 0x00, 0x21, + 0x82, 0x42, 0x0c, 0xd0, 0x12, 0xf8, 0x04, 0x3f, 0x01, 0x31, 0x54, 0x78, + 0x95, 0x78, 0xd2, 0x78, 0x43, 0xea, 0x04, 0x23, 0x45, 0xea, 0x02, 0x22, + 0x43, 0xea, 0x02, 0x42, 0xf0, 0xe7, 0xc8, 0xb2, 0xb0, 0xbd, 0x00, 0xbf, + 0x2d, 0xe9, 0xf8, 0x4f, 0x82, 0x46, 0x33, 0x48, 0x0c, 0x46, 0x09, 0x78, + 0x00, 0x26, 0x8d, 0xf8, 0x03, 0x60, 0x02, 0x68, 0x50, 0x46, 0x90, 0x47, + 0x00, 0x28, 0x58, 0xd0, 0x07, 0x46, 0x2e, 0x48, 0x0d, 0xf1, 0x03, 0x01, + 0x02, 0x68, 0x38, 0x46, 0x90, 0x47, 0x61, 0x78, 0x9d, 0xf8, 0x03, 0x20, + 0x00, 0x26, 0x8a, 0x42, 0x4b, 0xd9, 0x10, 0xf8, 0x01, 0x80, 0x28, 0x48, + 0x08, 0xf1, 0x01, 0x09, 0x01, 0x68, 0x48, 0x46, 0x88, 0x47, 0x06, 0x46, + 0x4f, 0xf0, 0x00, 0x0b, 0x00, 0x2f, 0x3e, 0xd0, 0xa6, 0xb3, 0x21, 0x48, + 0x0d, 0xf1, 0x03, 0x01, 0x02, 0x68, 0x38, 0x46, 0x90, 0x47, 0x61, 0x78, + 0x9d, 0xf8, 0x03, 0x30, 0xa9, 0xeb, 0x0b, 0x07, 0x42, 0x18, 0x5b, 0x1a, + 0x06, 0xeb, 0x0b, 0x00, 0x39, 0x46, 0xe9, 0xf7, 0xb7, 0xfd, 0x05, 0x46, + 0x60, 0x78, 0x9d, 0xf8, 0x03, 0x10, 0x09, 0x1a, 0xb9, 0x42, 0x1d, 0xdc, + 0x4f, 0xf0, 0x00, 0x00, 0x1d, 0xd0, 0x60, 0x70, 0x11, 0x48, 0x02, 0x68, + 0x20, 0x78, 0x41, 0x1c, 0x50, 0x46, 0x90, 0x47, 0x07, 0x46, 0x18, 0xb1, + 0x20, 0x78, 0x01, 0x30, 0x20, 0x70, 0x04, 0xe0, 0x0e, 0x48, 0x01, 0x68, + 0x30, 0x46, 0x88, 0x47, 0x00, 0x26, 0x5b, 0xfa, 0x85, 0xf0, 0x1f, 0xfa, + 0x80, 0xfb, 0xc3, 0x45, 0xc8, 0xd9, 0x08, 0xe0, 0x00, 0x26, 0x06, 0xe0, + 0x28, 0x44, 0x60, 0x70, 0x03, 0xe0, 0x60, 0x70, 0x20, 0x78, 0x01, 0x30, + 0x20, 0x70, 0x30, 0x46, 0xbd, 0xe8, 0xf8, 0x8f, 0x2c, 0xfa, 0x08, 0x00, + 0x64, 0xa2, 0x08, 0x00, 0xdc, 0x9b, 0x08, 0x00, 0xe0, 0x9b, 0x08, 0x00, + 0x2d, 0xe9, 0xf0, 0x47, 0x05, 0x68, 0x05, 0xb3, 0xdf, 0xf8, 0x48, 0x90, + 0xdf, 0xf8, 0x48, 0xa0, 0x80, 0x46, 0x00, 0x27, 0x00, 0x24, 0xd9, 0xf8, + 0x00, 0x10, 0x28, 0x46, 0x88, 0x47, 0xda, 0xf8, 0x00, 0x20, 0x06, 0x46, + 0x40, 0x46, 0x29, 0x46, 0x90, 0x47, 0x05, 0x46, 0xa0, 0x19, 0x01, 0x37, + 0x04, 0xb2, 0x00, 0x2d, 0xef, 0xd1, 0x98, 0xf8, 0x08, 0x00, 0xf9, 0xb2, + 0x81, 0x42, 0x04, 0xd1, 0x98, 0xf8, 0x08, 0x00, 0x94, 0xfb, 0xf0, 0xf0, + 0x00, 0xe0, 0x81, 0x20, 0x40, 0xb2, 0xbd, 0xe8, 0xf0, 0x87, 0x00, 0xbf, + 0x60, 0xa2, 0x08, 0x00, 0xec, 0xa0, 0x08, 0x00, 0xfe, 0xb5, 0x0d, 0x46, + 0xb1, 0xf8, 0x5a, 0x70, 0x41, 0x78, 0x06, 0x46, 0x14, 0x46, 0x88, 0x1e, + 0x24, 0x28, 0x00, 0xf2, 0xb3, 0x80, 0xdf, 0xe8, 0x10, 0xf0, 0x25, 0x00, + 0x25, 0x00, 0x25, 0x00, 0x25, 0x00, 0x25, 0x00, 0x25, 0x00, 0x96, 0x00, + 0x96, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, + 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0x4b, 0x00, + 0x4b, 0x00, 0x71, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, + 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0x4b, 0x00, 0x71, 0x00, + 0x71, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xd8, 0x00, + 0x78, 0x07, 0x52, 0xbf, 0x00, 0x20, 0x05, 0xf1, 0x18, 0x00, 0xff, 0xf7, + 0x07, 0xff, 0x8d, 0xf8, 0x0b, 0x00, 0x20, 0x78, 0x40, 0x07, 0x7e, 0xd5, + 0x80, 0x48, 0x05, 0xf1, 0x18, 0x01, 0x0d, 0xf1, 0x0b, 0x02, 0x03, 0x68, + 0x30, 0x46, 0x98, 0x47, 0x01, 0x28, 0x74, 0xd1, 0x60, 0x88, 0x40, 0xf0, + 0x04, 0x00, 0x60, 0x80, 0x95, 0xf8, 0x61, 0x00, 0x20, 0xb9, 0xb5, 0xf8, + 0x58, 0x00, 0x00, 0x28, 0x00, 0xf0, 0xb5, 0x80, 0x20, 0x88, 0x20, 0xf0, + 0x04, 0x00, 0xb1, 0xe0, 0x38, 0x07, 0x52, 0xbf, 0x00, 0x20, 0x05, 0xf1, + 0x20, 0x00, 0xff, 0xf7, 0xe1, 0xfe, 0x8d, 0xf8, 0x0a, 0x00, 0x20, 0x78, + 0x00, 0x07, 0x58, 0xd5, 0x6d, 0x48, 0x05, 0xf1, 0x20, 0x01, 0x0d, 0xf1, + 0x0a, 0x02, 0x03, 0x68, 0x30, 0x46, 0x98, 0x47, 0x01, 0x28, 0x4e, 0xd1, + 0x60, 0x88, 0x40, 0xf0, 0x08, 0x00, 0x60, 0x80, 0x95, 0xf8, 0x61, 0x00, + 0x20, 0xb9, 0xb5, 0xf8, 0x58, 0x00, 0x00, 0x28, 0x00, 0xf0, 0x8f, 0x80, + 0x20, 0x88, 0x20, 0xf0, 0x08, 0x00, 0x8b, 0xe0, 0x78, 0x06, 0x52, 0xbf, + 0x00, 0x20, 0x05, 0xf1, 0x38, 0x00, 0xff, 0xf7, 0xbb, 0xfe, 0x8d, 0xf8, + 0x08, 0x00, 0x20, 0x78, 0x40, 0x06, 0x40, 0xf1, 0x80, 0x80, 0x57, 0x48, + 0x05, 0xf1, 0x38, 0x01, 0x02, 0xaa, 0x03, 0x68, 0x30, 0x46, 0x98, 0x47, + 0x01, 0x28, 0x76, 0xd1, 0x60, 0x88, 0x40, 0xf0, 0x40, 0x00, 0x60, 0x80, + 0x95, 0xf8, 0x61, 0x00, 0x18, 0xb9, 0xb5, 0xf8, 0x58, 0x00, 0x00, 0x28, + 0x69, 0xd0, 0x20, 0x88, 0x20, 0xf0, 0x40, 0x00, 0x66, 0xe0, 0x20, 0x88, + 0xc0, 0x06, 0x16, 0xd5, 0x4b, 0x48, 0x05, 0xf1, 0x28, 0x01, 0x02, 0x68, + 0x30, 0x46, 0x90, 0x47, 0x01, 0x28, 0x0e, 0xd1, 0x60, 0x88, 0x40, 0xf0, + 0x10, 0x00, 0x60, 0x80, 0x95, 0xf8, 0x61, 0x00, 0x18, 0xb9, 0xb5, 0xf8, + 0x58, 0x00, 0x00, 0x28, 0x4f, 0xd0, 0x20, 0x88, 0x20, 0xf0, 0x10, 0x00, + 0x4c, 0xe0, 0x4c, 0xe0, 0xff, 0x29, 0x23, 0xd1, 0xb8, 0x06, 0x52, 0xbf, + 0x00, 0x20, 0x05, 0xf1, 0x30, 0x00, 0xff, 0xf7, 0x79, 0xfe, 0x8d, 0xf8, + 0x09, 0x00, 0x20, 0x78, 0x80, 0x06, 0x17, 0xd5, 0x37, 0x48, 0x05, 0xf1, + 0x30, 0x01, 0x0d, 0xf1, 0x09, 0x02, 0x03, 0x68, 0x30, 0x46, 0x98, 0x47, + 0x01, 0x28, 0x0d, 0xd1, 0x60, 0x88, 0x40, 0xf0, 0x20, 0x00, 0x60, 0x80, + 0x95, 0xf8, 0x61, 0x00, 0x10, 0xb9, 0xb5, 0xf8, 0x58, 0x00, 0x40, 0xb3, + 0x20, 0x88, 0x20, 0xf0, 0x20, 0x00, 0x25, 0xe0, 0x25, 0xe0, 0xb8, 0x05, + 0x52, 0xbf, 0x00, 0x20, 0x05, 0xf1, 0x40, 0x00, 0xff, 0xf7, 0x54, 0xfe, + 0x8d, 0xf8, 0x06, 0x00, 0x60, 0x78, 0x80, 0x07, 0x19, 0xd5, 0x23, 0x48, + 0x05, 0xf1, 0x40, 0x01, 0x0d, 0xf1, 0x06, 0x02, 0x03, 0x68, 0x30, 0x46, + 0x98, 0x47, 0x01, 0x28, 0x0f, 0xd1, 0x60, 0x88, 0x40, 0xf4, 0x00, 0x70, + 0x60, 0x80, 0x95, 0xf8, 0x61, 0x00, 0x10, 0xb9, 0xb5, 0xf8, 0x58, 0x00, + 0x18, 0xb1, 0x20, 0x88, 0x20, 0xf4, 0x00, 0x70, 0x00, 0xe0, 0x00, 0x20, + 0x20, 0x80, 0x94, 0xf9, 0x00, 0x00, 0xb0, 0xf1, 0xff, 0x3f, 0x22, 0xdc, + 0x78, 0xb2, 0xb0, 0xf1, 0xff, 0x3f, 0xce, 0xbf, 0x00, 0x20, 0x05, 0xf1, + 0x48, 0x00, 0xff, 0xf7, 0x27, 0xfe, 0x8d, 0xf8, 0x07, 0x00, 0x13, 0x48, + 0x05, 0xf1, 0x48, 0x01, 0x0d, 0xf1, 0x07, 0x02, 0x03, 0x68, 0x30, 0x46, + 0x98, 0x47, 0x01, 0x28, 0x0d, 0xd1, 0x60, 0x88, 0x40, 0xf0, 0x80, 0x00, + 0x60, 0x80, 0x95, 0xf8, 0x61, 0x00, 0x10, 0xb9, 0xb5, 0xf8, 0x58, 0x00, + 0x28, 0xb1, 0x20, 0x88, 0x20, 0xf0, 0x80, 0x00, 0x20, 0x80, 0x01, 0x20, + 0xfe, 0xbd, 0x00, 0x20, 0xfa, 0xe7, 0x00, 0xbf, 0xe8, 0xc5, 0x08, 0x00, + 0xe4, 0xc5, 0x08, 0x00, 0xe0, 0xc5, 0x08, 0x00, 0xdc, 0xc5, 0x08, 0x00, + 0xd8, 0xc5, 0x08, 0x00, 0xf0, 0xc5, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, + 0x87, 0xb0, 0x81, 0x46, 0x00, 0x68, 0x00, 0x28, 0x01, 0x90, 0x00, 0xf0, + 0xd5, 0x80, 0xdf, 0xf8, 0xbc, 0xb1, 0x59, 0x46, 0x9b, 0xf8, 0x05, 0x00, + 0x11, 0xf8, 0x04, 0x2f, 0x42, 0xea, 0x00, 0x20, 0x8a, 0x78, 0xc9, 0x78, + 0x42, 0xea, 0x01, 0x21, 0x40, 0xea, 0x01, 0x40, 0x58, 0x45, 0x00, 0xf0, + 0xc5, 0x80, 0x67, 0x48, 0x01, 0x68, 0x01, 0x98, 0x88, 0x47, 0x20, 0xb1, + 0xf9, 0xf7, 0x2c, 0xfd, 0x00, 0x28, 0x00, 0xf0, 0xbb, 0x80, 0x48, 0x46, + 0xff, 0xf7, 0x66, 0xfe, 0x59, 0x46, 0x80, 0x46, 0x9b, 0xf8, 0x05, 0x00, + 0x11, 0xf8, 0x04, 0x2f, 0x42, 0xea, 0x00, 0x20, 0x8a, 0x78, 0xc9, 0x78, + 0x42, 0xea, 0x01, 0x21, 0x40, 0xea, 0x01, 0x47, 0x5f, 0x45, 0x00, 0xf0, + 0xa5, 0x80, 0x00, 0x20, 0x02, 0x90, 0x97, 0xf9, 0x60, 0x00, 0x7f, 0x28, + 0x02, 0xd0, 0x80, 0x45, 0xc0, 0xf2, 0x8d, 0x80, 0x97, 0xf9, 0x5f, 0x00, + 0x7f, 0x28, 0x02, 0xd0, 0x80, 0x45, 0x00, 0xf3, 0x86, 0x80, 0xb7, 0xf8, + 0x5c, 0x50, 0x00, 0x20, 0xad, 0xf8, 0x16, 0x00, 0xe8, 0x07, 0xad, 0xf8, + 0x14, 0x50, 0x11, 0xd0, 0x4c, 0x48, 0x07, 0xf1, 0x10, 0x01, 0x02, 0x68, + 0x01, 0x98, 0x90, 0x47, 0x01, 0x28, 0x09, 0xd1, 0x01, 0x20, 0x25, 0xf0, + 0x01, 0x05, 0x40, 0xf2, 0x01, 0x1a, 0xad, 0xf8, 0x16, 0x00, 0xad, 0xf8, + 0x14, 0x50, 0x01, 0xe0, 0x4f, 0xf4, 0x80, 0x7a, 0xe8, 0x05, 0x0d, 0xd5, + 0x42, 0x48, 0x07, 0xf1, 0x50, 0x01, 0x02, 0x68, 0x01, 0x98, 0x90, 0x47, + 0x01, 0x28, 0x02, 0xbf, 0xad, 0xf8, 0x16, 0xa0, 0x25, 0xf4, 0x80, 0x75, + 0xad, 0xf8, 0x14, 0x50, 0x3c, 0x4c, 0x00, 0x20, 0x0d, 0xf1, 0x14, 0x0a, + 0x06, 0xae, 0xad, 0xf8, 0x18, 0x00, 0xad, 0xb1, 0x48, 0x46, 0x31, 0x46, + 0xff, 0xf7, 0x9a, 0xfd, 0xa8, 0xb1, 0x05, 0x46, 0x00, 0x78, 0x78, 0xb1, + 0x68, 0x78, 0x68, 0xb1, 0x28, 0x46, 0x39, 0x46, 0x52, 0x46, 0xff, 0xf7, + 0x2f, 0xfe, 0x21, 0x68, 0x28, 0x46, 0x88, 0x47, 0xbd, 0xf8, 0x14, 0x00, + 0x00, 0x28, 0xe9, 0xd1, 0x01, 0x20, 0x06, 0xe0, 0x21, 0x68, 0x28, 0x46, + 0x88, 0x47, 0x97, 0xf8, 0x62, 0x00, 0x90, 0xb3, 0x00, 0x20, 0xb9, 0x68, + 0x51, 0xb3, 0xb7, 0xf8, 0x5c, 0x00, 0x97, 0xf8, 0x61, 0x10, 0x97, 0xf8, + 0x62, 0x20, 0xbd, 0xf8, 0x16, 0x50, 0x06, 0x23, 0xad, 0xf8, 0x0e, 0x00, + 0x97, 0xf8, 0x5e, 0x00, 0xad, 0xf8, 0x0c, 0x50, 0x8d, 0xf8, 0x10, 0x00, + 0x41, 0xea, 0x02, 0x00, 0x00, 0x21, 0x03, 0xaa, 0x8d, 0xf8, 0x11, 0x00, + 0x1d, 0x48, 0x06, 0x68, 0x40, 0xf2, 0x0e, 0x20, 0xb0, 0x47, 0xd7, 0xe9, + 0x02, 0x61, 0x97, 0xf8, 0x5e, 0x00, 0x01, 0x9a, 0x00, 0x23, 0x00, 0x91, + 0x29, 0x46, 0xb0, 0x47, 0x02, 0x9a, 0x11, 0x06, 0x08, 0xbf, 0x02, 0x46, + 0x02, 0x92, 0x04, 0xe0, 0x00, 0x28, 0x02, 0x98, 0x18, 0xbf, 0x01, 0x20, + 0x02, 0x90, 0x17, 0xf8, 0x04, 0x0f, 0x79, 0x78, 0xba, 0x78, 0xfb, 0x78, + 0x40, 0xea, 0x01, 0x20, 0x42, 0xea, 0x03, 0x21, 0x40, 0xea, 0x01, 0x47, + 0x5f, 0x45, 0x7f, 0xf4, 0x5e, 0xaf, 0x03, 0xe0, 0x00, 0x20, 0x00, 0xe0, + 0x01, 0x20, 0x02, 0x90, 0x02, 0x98, 0xc0, 0xb2, 0x07, 0xb0, 0xbd, 0xe8, + 0xf0, 0x8f, 0x00, 0xbf, 0xac, 0x0d, 0x01, 0x00, 0xf8, 0xc5, 0x08, 0x00, + 0xd0, 0xc5, 0x08, 0x00, 0xd4, 0xc5, 0x08, 0x00, 0xe0, 0x9b, 0x08, 0x00, + 0x4c, 0xa2, 0x08, 0x00, 0xb0, 0xb5, 0x4f, 0xf6, 0xff, 0x71, 0x88, 0x42, + 0x28, 0xd0, 0x04, 0x28, 0x13, 0xd0, 0x08, 0x28, 0x11, 0xd0, 0x10, 0x28, + 0x13, 0xd0, 0x20, 0x28, 0x0f, 0xd0, 0x40, 0x28, 0x0d, 0xd0, 0x80, 0x28, + 0x0f, 0xd0, 0xb0, 0xf5, 0x80, 0x7f, 0x0e, 0xd0, 0xb0, 0xf5, 0x00, 0x7f, + 0x0d, 0xd0, 0x01, 0x28, 0x0d, 0xd1, 0x0f, 0x24, 0x13, 0xe0, 0x2a, 0x24, + 0x11, 0xe0, 0x43, 0x24, 0x0f, 0xe0, 0x26, 0x24, 0x0d, 0xe0, 0x29, 0x24, + 0x0b, 0xe0, 0x18, 0x24, 0x09, 0xe0, 0x28, 0x24, 0x07, 0xe0, 0x00, 0x20, + 0x40, 0xf2, 0xe1, 0x31, 0x00, 0x24, 0xef, 0xf7, 0x3d, 0xf9, 0x00, 0xe0, + 0x64, 0x24, 0x38, 0x4d, 0x14, 0x4a, 0x28, 0x88, 0xb2, 0xf8, 0x82, 0x21, + 0x21, 0x18, 0x91, 0x42, 0x0d, 0xd8, 0x12, 0x48, 0x01, 0x68, 0x20, 0x46, + 0x88, 0x47, 0x38, 0xb1, 0x04, 0x46, 0x28, 0x88, 0x54, 0xf8, 0x08, 0x1c, + 0x09, 0x89, 0x08, 0x44, 0x28, 0x80, 0x12, 0xe0, 0x28, 0x88, 0x0c, 0x4a, + 0x00, 0x21, 0x04, 0x23, 0x00, 0x24, 0x10, 0x60, 0x1d, 0x48, 0x05, 0x68, + 0x4f, 0xf4, 0x11, 0x70, 0xa8, 0x47, 0x1a, 0x48, 0x00, 0x68, 0x20, 0xb1, + 0x40, 0x78, 0x08, 0xb1, 0x00, 0xf0, 0x0a, 0xf8, 0x00, 0x24, 0x20, 0x46, + 0xb0, 0xbd, 0x00, 0xbf, 0xe8, 0x65, 0x08, 0x00, 0xd4, 0x9b, 0x08, 0x00, + 0x8c, 0x34, 0x01, 0x00, 0x70, 0xb5, 0x0f, 0x48, 0x0f, 0x4a, 0x00, 0x78, + 0x10, 0x70, 0x0f, 0x48, 0x00, 0x68, 0x41, 0x78, 0x03, 0x7a, 0x44, 0x7a, + 0x85, 0x7a, 0xc6, 0x88, 0x51, 0x70, 0x81, 0x88, 0x80, 0x89, 0x93, 0x71, + 0x96, 0x80, 0xd4, 0x71, 0x15, 0x72, 0x0c, 0x23, 0x50, 0x81, 0x08, 0x48, + 0x51, 0x80, 0x00, 0x21, 0xd0, 0xf8, 0x00, 0xc0, 0x40, 0xf2, 0xa3, 0x60, + 0xbd, 0xe8, 0x70, 0x40, 0x60, 0x47, 0x00, 0xbf, 0x88, 0x4c, 0x01, 0x00, + 0x1e, 0xe6, 0x05, 0x00, 0x84, 0x4c, 0x01, 0x00, 0x78, 0x9b, 0x08, 0x00, + 0x08, 0x46, 0x0b, 0x49, 0x50, 0xf8, 0x08, 0x3c, 0x0a, 0x88, 0x1b, 0x89, + 0xd2, 0x1a, 0x0a, 0x80, 0xef, 0xf7, 0xf6, 0xb8, 0x10, 0xb5, 0x00, 0xf0, + 0x2b, 0xf8, 0x05, 0x4c, 0x20, 0x88, 0x20, 0xb1, 0x00, 0x20, 0x40, 0xf2, + 0x27, 0x41, 0xef, 0xf7, 0xcd, 0xf8, 0x00, 0x20, 0x20, 0x80, 0x10, 0xbd, + 0x1c, 0xe6, 0x05, 0x00, 0x06, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, + 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, + 0x08, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, 0x68, 0xbf, 0x08, 0x00, + 0xed, 0x79, 0x03, 0x00, 0x34, 0xc7, 0x08, 0x00, 0x89, 0x6e, 0x03, 0x00, + 0x6c, 0xbf, 0x08, 0x00, 0xfd, 0x7a, 0x03, 0x00, 0x04, 0xc3, 0x08, 0x00, + 0x11, 0x7b, 0x03, 0x00, 0x4e, 0xf2, 0xc9, 0x0c, 0xc1, 0xf2, 0x06, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x2d, 0xe9, 0xfe, 0x43, 0x04, 0x46, 0x00, 0x20, + 0x00, 0x2c, 0xcd, 0xe9, 0x01, 0x00, 0x00, 0xf0, 0x8b, 0x80, 0x01, 0xae, + 0xe2, 0x1d, 0x06, 0x21, 0x06, 0x23, 0x30, 0x46, 0xe9, 0xf7, 0x44, 0xfa, + 0xa0, 0x79, 0xdf, 0xf8, 0x14, 0x81, 0xe1, 0x7b, 0x44, 0x4d, 0x00, 0xf0, + 0x07, 0x00, 0xd8, 0xf8, 0x00, 0x20, 0x40, 0xea, 0xc1, 0x00, 0x31, 0x46, + 0x8d, 0xf8, 0x0a, 0x00, 0x28, 0x46, 0x90, 0x47, 0xff, 0x28, 0x08, 0xd0, + 0x29, 0x68, 0x01, 0xeb, 0xc0, 0x00, 0xc5, 0x79, 0xff, 0x2d, 0x6d, 0xd0, + 0x3b, 0x48, 0x06, 0x68, 0x40, 0xe0, 0xdf, 0xf8, 0xec, 0x90, 0x38, 0x4e, + 0x01, 0xa9, 0xd9, 0xf8, 0x00, 0x20, 0x30, 0x46, 0x90, 0x47, 0xff, 0x28, + 0x14, 0xd0, 0x07, 0x46, 0x36, 0x48, 0x00, 0x68, 0x80, 0x47, 0x05, 0x46, + 0x30, 0x7a, 0x87, 0x42, 0x05, 0xd3, 0xd8, 0xf8, 0x00, 0x20, 0x2f, 0x48, + 0x01, 0xa9, 0x90, 0x47, 0x07, 0x46, 0x30, 0x68, 0xff, 0x2d, 0x00, 0xeb, + 0xc7, 0x00, 0xc5, 0x71, 0x15, 0xd1, 0x4b, 0xe0, 0x2d, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x05, 0x46, 0xff, 0x28, 0x05, 0xd1, 0x2b, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x05, 0x46, 0xff, 0x28, 0x3f, 0xd0, 0xd9, 0xf8, 0x00, 0x20, + 0x01, 0xa9, 0x30, 0x46, 0x90, 0x47, 0x31, 0x68, 0x01, 0xeb, 0xc0, 0x00, + 0xc5, 0x71, 0x20, 0x49, 0x05, 0xeb, 0x85, 0x00, 0x0e, 0x68, 0x4f, 0xf6, + 0xff, 0x71, 0x06, 0xeb, 0x80, 0x00, 0x81, 0x81, 0x81, 0x7b, 0x41, 0xf0, + 0x01, 0x01, 0x81, 0x73, 0x1e, 0x48, 0x05, 0xeb, 0x85, 0x05, 0x00, 0x68, + 0x80, 0x47, 0x17, 0x49, 0x09, 0x68, 0x01, 0xeb, 0x85, 0x01, 0x06, 0xeb, + 0x85, 0x05, 0x08, 0x61, 0x20, 0x79, 0x10, 0xf0, 0x60, 0x00, 0x18, 0xbf, + 0x40, 0x28, 0x0f, 0xd1, 0x20, 0x46, 0x29, 0x46, 0xeb, 0xf7, 0xa8, 0xfb, + 0x28, 0x46, 0xff, 0xf7, 0xc1, 0xfd, 0x01, 0x28, 0x0c, 0xbf, 0x13, 0x48, + 0x11, 0x48, 0x01, 0x68, 0x28, 0x46, 0x88, 0x47, 0xbd, 0xe8, 0xfe, 0x83, + 0x20, 0x28, 0x05, 0xd1, 0x20, 0x46, 0x29, 0x46, 0xeb, 0xf7, 0x96, 0xfb, + 0xbd, 0xe8, 0xfe, 0x83, 0x20, 0x46, 0xef, 0xf7, 0x29, 0xf8, 0xbd, 0xe8, + 0xfe, 0x83, 0x00, 0xbf, 0x40, 0xc9, 0x08, 0x00, 0xd8, 0x54, 0x01, 0x00, + 0xcc, 0x58, 0x01, 0x00, 0x44, 0xc9, 0x08, 0x00, 0x60, 0xc7, 0x08, 0x00, + 0x48, 0xc7, 0x08, 0x00, 0x4c, 0xc7, 0x08, 0x00, 0xe0, 0xa0, 0x08, 0x00, + 0x2c, 0x9d, 0x08, 0x00, 0x0c, 0xc7, 0x08, 0x00, 0x70, 0xb5, 0x92, 0xb0, + 0x04, 0x46, 0x00, 0x78, 0x94, 0x28, 0x2a, 0xd0, 0x98, 0x28, 0x48, 0xd0, + 0xa6, 0x28, 0x50, 0xd0, 0xc7, 0x28, 0x65, 0xd0, 0xa7, 0x28, 0x5d, 0xd1, + 0x65, 0x68, 0xd5, 0xf8, 0xd4, 0x00, 0x40, 0x7f, 0xa0, 0xb9, 0x95, 0xf8, + 0x08, 0x03, 0x88, 0xb9, 0x48, 0x49, 0x62, 0x7a, 0x95, 0xf8, 0x35, 0x01, + 0x0b, 0x68, 0x21, 0x7a, 0x41, 0xea, 0x02, 0x21, 0x8c, 0xb2, 0x00, 0x21, + 0x22, 0x46, 0x98, 0x47, 0x28, 0x46, 0x21, 0x46, 0xff, 0x22, 0x00, 0x23, + 0xee, 0xf7, 0x2e, 0xff, 0x40, 0x48, 0x29, 0x46, 0x00, 0x22, 0x03, 0x68, + 0x01, 0x20, 0x12, 0xb0, 0xbd, 0xe8, 0x70, 0x40, 0x18, 0x47, 0xa5, 0x68, + 0x00, 0x2d, 0x5b, 0xd0, 0x28, 0x79, 0x66, 0x68, 0x18, 0x28, 0x59, 0xd0, + 0x90, 0xbb, 0xd6, 0xf8, 0x34, 0x03, 0x40, 0xf0, 0x80, 0x51, 0x80, 0x00, + 0xc6, 0xf8, 0x34, 0x13, 0x09, 0xd5, 0x32, 0x48, 0x01, 0x68, 0x00, 0x20, + 0x88, 0x47, 0xd6, 0xf8, 0x34, 0x03, 0x20, 0xf0, 0x00, 0x50, 0xc6, 0xf8, + 0x34, 0x03, 0x28, 0x46, 0x12, 0xb0, 0xbd, 0xe8, 0x70, 0x40, 0xee, 0xf7, + 0xc1, 0xbf, 0x21, 0x7a, 0x60, 0x68, 0x3e, 0x29, 0x80, 0xf8, 0x39, 0x10, + 0x14, 0xd1, 0x3e, 0x21, 0x14, 0xf0, 0x80, 0xf9, 0x10, 0xe0, 0x1f, 0x48, + 0x72, 0xb6, 0x01, 0x68, 0x49, 0x00, 0x01, 0x31, 0x01, 0x60, 0x1d, 0x49, + 0x0a, 0x78, 0x0a, 0xb1, 0x01, 0x3a, 0x0a, 0x70, 0x01, 0x68, 0x49, 0x08, + 0x01, 0x60, 0x00, 0x68, 0x80, 0xf3, 0x10, 0x88, 0x20, 0x46, 0x12, 0xb0, + 0xbd, 0xe8, 0x70, 0x40, 0x00, 0xf0, 0x0e, 0xba, 0x01, 0xac, 0x15, 0x4a, + 0x44, 0x21, 0x20, 0x23, 0x20, 0x46, 0xe9, 0xf7, 0x2b, 0xf9, 0x13, 0x4a, + 0x04, 0xf1, 0x20, 0x00, 0x24, 0x21, 0x24, 0x23, 0xe9, 0xf7, 0x24, 0xf9, + 0x80, 0x48, 0x00, 0x21, 0x22, 0x46, 0x44, 0x23, 0xb0, 0xf8, 0xd0, 0x02, + 0xad, 0xf8, 0x3a, 0x00, 0x0c, 0x48, 0x00, 0x68, 0x0f, 0x90, 0x0c, 0x48, + 0x05, 0x68, 0x40, 0xf2, 0x17, 0x60, 0xa8, 0x47, 0x12, 0xb0, 0x70, 0xbd, + 0xa1, 0x89, 0x30, 0x46, 0x18, 0x22, 0x00, 0x23, 0xee, 0xf7, 0xbe, 0xfe, + 0xd2, 0xe7, 0x00, 0xbf, 0x24, 0x36, 0x01, 0x00, 0x52, 0xf1, 0x05, 0x00, + 0x38, 0x7a, 0x01, 0x00, 0x38, 0xfb, 0x05, 0x00, 0x34, 0x21, 0x01, 0x00, + 0x78, 0x9b, 0x08, 0x00, 0x10, 0xb5, 0x08, 0x00, 0x50, 0xb5, 0x08, 0x00, + 0xfc, 0xc8, 0x08, 0x00, 0x10, 0xb5, 0x00, 0xf0, 0xd7, 0xf9, 0x0a, 0x48, + 0x00, 0x24, 0x01, 0x68, 0x00, 0x20, 0x88, 0x47, 0x08, 0x49, 0x48, 0x70, + 0x08, 0x70, 0x08, 0x48, 0x00, 0x68, 0x80, 0x47, 0x07, 0x49, 0x08, 0x71, + 0x07, 0x48, 0x4f, 0xf0, 0xff, 0x31, 0x01, 0x60, 0x06, 0x48, 0x04, 0x70, + 0x10, 0xbd, 0x00, 0xbf, 0xdc, 0x8e, 0x08, 0x00, 0xb8, 0x58, 0x01, 0x00, + 0x10, 0x9c, 0x08, 0x00, 0xcd, 0x0d, 0x01, 0x00, 0x50, 0xd3, 0x05, 0x00, + 0x2c, 0xe6, 0x05, 0x00, 0xb0, 0xb5, 0x02, 0xf0, 0xc0, 0x04, 0x40, 0x2c, + 0x05, 0xd1, 0x07, 0x4d, 0x01, 0xeb, 0x41, 0x04, 0x55, 0xf8, 0x24, 0x40, + 0x3c, 0xb1, 0x2b, 0x2a, 0xbd, 0xe8, 0xb0, 0x40, 0x18, 0xbf, 0x00, 0xf0, + 0xab, 0xb9, 0x04, 0xf0, 0x1f, 0xba, 0xb0, 0xbd, 0xe8, 0x72, 0x01, 0x00, + 0xb0, 0xb5, 0x58, 0xb1, 0x01, 0x68, 0x49, 0xb1, 0x05, 0x4c, 0x89, 0x78, + 0xe5, 0x7a, 0x49, 0x06, 0x44, 0xbf, 0x01, 0x21, 0xe1, 0x72, 0x00, 0xf0, + 0x9f, 0xf9, 0xe5, 0x72, 0xb0, 0xbd, 0x00, 0xbf, 0x60, 0x55, 0x01, 0x00, + 0x2d, 0xe9, 0xf0, 0x41, 0x88, 0x46, 0x05, 0x46, 0x00, 0xf0, 0x9a, 0xf9, + 0x40, 0x48, 0x01, 0x68, 0x28, 0x46, 0x88, 0x47, 0x40, 0x45, 0x18, 0xd0, + 0xdf, 0xf8, 0x34, 0xc0, 0x00, 0x21, 0x01, 0x22, 0x01, 0xf0, 0x07, 0x03, + 0xce, 0x08, 0x02, 0xfa, 0x03, 0xf7, 0xab, 0x5d, 0x1f, 0x42, 0x09, 0xd0, + 0x1c, 0xf8, 0x06, 0x40, 0x27, 0x42, 0x05, 0xd1, 0xbb, 0x43, 0x01, 0x38, + 0xab, 0x55, 0xc3, 0xb2, 0x43, 0x45, 0x02, 0xd0, 0x01, 0x31, 0x25, 0x29, + 0xea, 0xd1, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0xbf, 0x4a, 0xd3, 0x05, 0x00, + 0x2d, 0xe9, 0xfe, 0x43, 0x89, 0x46, 0x48, 0x49, 0x29, 0x4a, 0x45, 0x4b, + 0x29, 0x4e, 0x2a, 0x4f, 0x80, 0x46, 0x00, 0x20, 0x0d, 0xf1, 0x07, 0x04, + 0x17, 0xf8, 0x01, 0xcb, 0x16, 0xf8, 0x01, 0x5b, 0x01, 0x30, 0x05, 0x28, + 0x0c, 0xea, 0x05, 0x0c, 0x13, 0xf8, 0x01, 0x5b, 0x0c, 0xea, 0x05, 0x0c, + 0x12, 0xf8, 0x01, 0x5b, 0x0c, 0xea, 0x05, 0x0c, 0x11, 0xf8, 0x01, 0x5b, + 0x05, 0xea, 0x0c, 0x05, 0x04, 0xf8, 0x01, 0x5b, 0xe8, 0xd1, 0x1d, 0x48, + 0x01, 0x68, 0x0d, 0xf1, 0x07, 0x00, 0x88, 0x47, 0x48, 0x45, 0x05, 0xd2, + 0x95, 0x48, 0x49, 0x46, 0x02, 0x68, 0x0d, 0xf1, 0x07, 0x00, 0x90, 0x47, + 0x0d, 0xf1, 0x07, 0x01, 0x40, 0x46, 0x05, 0x22, 0xf9, 0xf7, 0x1c, 0xfa, + 0xe0, 0xb1, 0x0d, 0xf1, 0x07, 0x02, 0x40, 0x46, 0x05, 0x21, 0x05, 0x23, + 0xe9, 0xf7, 0x44, 0xf8, 0x10, 0x48, 0xb0, 0xf8, 0x3c, 0x01, 0xc0, 0x07, + 0x06, 0xd0, 0x0f, 0x48, 0x05, 0x21, 0x42, 0x46, 0x05, 0x23, 0x10, 0x30, + 0xe9, 0xf7, 0x38, 0xf8, 0x0c, 0x48, 0x01, 0x68, 0x00, 0x20, 0x88, 0x47, + 0x0b, 0x48, 0x00, 0x68, 0x80, 0x47, 0x01, 0x20, 0xbd, 0xe8, 0xfe, 0x83, + 0x00, 0x20, 0xbd, 0xe8, 0xfe, 0x83, 0x00, 0xbf, 0x47, 0x52, 0x01, 0x00, + 0x3d, 0x52, 0x01, 0x00, 0x38, 0x52, 0x01, 0x00, 0x9c, 0xc7, 0x08, 0x00, + 0x8c, 0x7e, 0x08, 0x00, 0xa4, 0x79, 0x01, 0x00, 0xa8, 0xc7, 0x08, 0x00, + 0xa4, 0xc7, 0x08, 0x00, 0xb0, 0xb5, 0x11, 0x4d, 0x11, 0x48, 0x12, 0x49, + 0x2a, 0x68, 0x0c, 0x30, 0x90, 0x47, 0x04, 0x46, 0x2a, 0x68, 0x10, 0x48, + 0x10, 0x49, 0x90, 0x47, 0x04, 0xb9, 0xa0, 0xb1, 0x6d, 0x48, 0x0f, 0x4c, + 0x02, 0x21, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0x0d, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x0d, 0x48, 0x00, 0x68, 0x80, 0x47, 0x0c, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x0c, 0x48, 0x01, 0x68, 0x20, 0x46, 0xbd, 0xe8, 0xb0, 0x40, + 0x08, 0x47, 0xb0, 0xbd, 0x8c, 0xc4, 0x08, 0x00, 0xb8, 0x68, 0x01, 0x00, + 0x42, 0x52, 0x01, 0x00, 0x34, 0xf1, 0x05, 0x00, 0x4a, 0xd3, 0x05, 0x00, + 0x4c, 0x52, 0x01, 0x00, 0xc4, 0xc4, 0x08, 0x00, 0xa8, 0xc4, 0x08, 0x00, + 0x88, 0xc4, 0x08, 0x00, 0x70, 0xc4, 0x08, 0x00, 0x2d, 0xe9, 0xfe, 0x43, + 0x04, 0x46, 0x00, 0x20, 0x00, 0x2c, 0x02, 0x90, 0xcd, 0xe9, 0x00, 0x00, + 0x6a, 0xd0, 0xdf, 0xf8, 0xd8, 0x80, 0xd8, 0xf8, 0x00, 0x70, 0x00, 0x2f, + 0x40, 0xd0, 0x34, 0x48, 0x94, 0xf8, 0x06, 0x90, 0xbe, 0x79, 0x01, 0x68, + 0x20, 0x46, 0x88, 0x47, 0xf8, 0xb1, 0x31, 0x48, 0xfa, 0x1d, 0xe3, 0x1d, + 0x49, 0x46, 0x05, 0x68, 0x30, 0x46, 0xa8, 0x47, 0xb8, 0xb1, 0x2e, 0x49, + 0xd8, 0xf8, 0x00, 0x00, 0x0a, 0x68, 0x21, 0x46, 0x90, 0x47, 0x01, 0x46, + 0xd8, 0xf8, 0x00, 0x00, 0x01, 0x29, 0x3b, 0xd1, 0x6d, 0x46, 0x29, 0x46, + 0xeb, 0xf7, 0x8a, 0xf9, 0x3d, 0x48, 0x01, 0x68, 0x28, 0x46, 0x88, 0x47, + 0x20, 0x46, 0x29, 0x46, 0xeb, 0xf7, 0x82, 0xf9, 0x33, 0xe0, 0x22, 0x49, + 0xd8, 0xf8, 0x00, 0x00, 0x0a, 0x68, 0x00, 0x21, 0x90, 0x47, 0x01, 0x46, + 0xd8, 0xf8, 0x00, 0x00, 0x01, 0x29, 0x08, 0xd1, 0x6d, 0x46, 0x29, 0x46, + 0xeb, 0xf7, 0x72, 0xf9, 0x31, 0x48, 0x01, 0x68, 0x28, 0x46, 0x88, 0x47, + 0x01, 0xe0, 0xee, 0xf7, 0x03, 0xfe, 0x00, 0x20, 0xc8, 0xf8, 0x00, 0x00, + 0xa0, 0x78, 0x80, 0x06, 0x0b, 0xd4, 0x14, 0x48, 0x00, 0x21, 0x02, 0x68, + 0x20, 0x46, 0x90, 0x47, 0x01, 0x28, 0x07, 0xd1, 0x69, 0x46, 0x20, 0x46, + 0xeb, 0xf7, 0x5a, 0xf9, 0x0e, 0xe0, 0xc8, 0xf8, 0x00, 0x40, 0x0b, 0xe0, + 0x20, 0x46, 0xee, 0xf7, 0xeb, 0xfd, 0x07, 0xe0, 0xee, 0xf7, 0xe8, 0xfd, + 0x20, 0x46, 0xee, 0xf7, 0xe5, 0xfd, 0x00, 0x20, 0xc8, 0xf8, 0x00, 0x00, + 0x00, 0x98, 0x18, 0xb1, 0x1c, 0x48, 0x01, 0x68, 0x68, 0x46, 0x88, 0x47, + 0xbd, 0xe8, 0xfe, 0x83, 0xd0, 0x58, 0x01, 0x00, 0x54, 0xc7, 0x08, 0x00, + 0x5c, 0xc7, 0x08, 0x00, 0x34, 0xc7, 0x08, 0x00, 0x0d, 0x48, 0x0e, 0x49, + 0x01, 0x60, 0x0e, 0x48, 0x0e, 0x49, 0x01, 0x60, 0x0e, 0x48, 0x0f, 0x49, + 0x01, 0x60, 0x0f, 0x48, 0x0f, 0x49, 0x01, 0x60, 0x0f, 0x48, 0x10, 0x49, + 0x01, 0x60, 0x10, 0x48, 0x10, 0x49, 0x01, 0x60, 0x10, 0x48, 0x11, 0x49, + 0x01, 0x60, 0x11, 0x48, 0x11, 0x49, 0x01, 0x60, 0x11, 0x48, 0x12, 0x49, + 0x01, 0x60, 0x70, 0x47, 0x14, 0xcd, 0x08, 0x00, 0xd9, 0x7c, 0x03, 0x00, + 0x9c, 0xcd, 0x08, 0x00, 0x79, 0x7b, 0x03, 0x00, 0xdc, 0xc7, 0x08, 0x00, + 0x31, 0x7e, 0x03, 0x00, 0xf8, 0xcc, 0x08, 0x00, 0x79, 0x7e, 0x03, 0x00, + 0x0c, 0xc7, 0x08, 0x00, 0xa5, 0x7e, 0x03, 0x00, 0x90, 0xcd, 0x08, 0x00, + 0xed, 0x7f, 0x03, 0x00, 0x90, 0xc4, 0x08, 0x00, 0x1d, 0x7f, 0x03, 0x00, + 0xa0, 0xc7, 0x08, 0x00, 0xc9, 0x7e, 0x03, 0x00, 0xa0, 0xcd, 0x08, 0x00, + 0x5d, 0x80, 0x03, 0x00, 0x48, 0xf6, 0x31, 0x7c, 0xc1, 0xf2, 0x08, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x48, 0xf6, 0x21, 0x2c, 0xc1, 0xf2, 0x08, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x49, 0xf2, 0xc1, 0x2c, 0xc1, 0xf2, 0x08, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x48, 0xf6, 0x29, 0x3c, 0xc1, 0xf2, 0x08, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4e, 0xf2, 0x75, 0x2c, 0xc1, 0xf2, 0x06, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x2d, 0xe9, 0xf0, 0x4f, 0x87, 0xb0, 0x80, 0x46, + 0xc0, 0x78, 0x81, 0x28, 0x04, 0xbf, 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0xdf, 0xf8, 0xe0, 0xa0, 0x98, 0xf8, 0x01, 0x10, 0x81, 0x20, 0x88, 0xf8, + 0x03, 0x00, 0xda, 0xf8, 0x00, 0x00, 0xc1, 0xeb, 0x01, 0x11, 0x00, 0xeb, + 0x41, 0x10, 0x00, 0xf5, 0xea, 0x72, 0x90, 0xf8, 0xd5, 0x11, 0x00, 0xf5, + 0xe8, 0x70, 0x12, 0xf8, 0x02, 0x3b, 0x43, 0xea, 0x01, 0x21, 0x13, 0x78, + 0x52, 0x78, 0x43, 0xea, 0x02, 0x22, 0x41, 0xea, 0x02, 0x46, 0x86, 0x42, + 0x4a, 0xd0, 0x4f, 0xf0, 0x01, 0x0b, 0x29, 0x48, 0x31, 0x6b, 0x96, 0xf8, + 0x4e, 0x20, 0xb0, 0xf8, 0xb8, 0x01, 0x08, 0x44, 0x11, 0x46, 0xf0, 0x62, + 0x96, 0xf8, 0x58, 0x00, 0x82, 0x42, 0x38, 0xbf, 0x01, 0x46, 0x96, 0xf8, + 0x28, 0x30, 0xc1, 0xeb, 0x43, 0x01, 0xcb, 0xb2, 0x1f, 0x2b, 0x28, 0xbf, + 0x1f, 0x21, 0x1f, 0x4b, 0x96, 0xf8, 0x52, 0x70, 0xb6, 0xf8, 0x50, 0x40, + 0x86, 0xf8, 0x28, 0x10, 0x96, 0xf8, 0x59, 0x50, 0x96, 0xf8, 0x5c, 0xe0, + 0xb6, 0xf8, 0x5a, 0x90, 0xc9, 0xb2, 0xd3, 0xf8, 0x00, 0xc0, 0x96, 0xf8, + 0x4f, 0x30, 0xcd, 0xe9, 0x00, 0x74, 0x02, 0xac, 0xa4, 0xe8, 0x21, 0x40, + 0xa6, 0xf1, 0xf8, 0x00, 0xcd, 0xe9, 0x05, 0x9b, 0xe0, 0x47, 0x16, 0xf8, + 0x04, 0x0f, 0x71, 0x78, 0xb2, 0x78, 0xf3, 0x78, 0x40, 0xea, 0x01, 0x20, + 0x42, 0xea, 0x03, 0x21, 0x40, 0xea, 0x01, 0x46, 0x98, 0xf8, 0x01, 0x10, + 0xda, 0xf8, 0x00, 0x00, 0xc1, 0xeb, 0x01, 0x11, 0x00, 0xeb, 0x41, 0x10, + 0x00, 0xf5, 0xe8, 0x70, 0x86, 0x42, 0xb6, 0xd1, 0x06, 0x48, 0x01, 0x68, + 0x40, 0x46, 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, 0x08, 0x47, 0x00, 0xbf, + 0xe0, 0x35, 0x01, 0x00, 0xe8, 0x65, 0x08, 0x00, 0x08, 0xb6, 0x08, 0x00, + 0x84, 0xb8, 0x08, 0x00, 0x2d, 0xe9, 0xfc, 0x41, 0xdf, 0xf8, 0x78, 0x80, + 0x05, 0x46, 0x00, 0x20, 0x4f, 0xf4, 0xa8, 0x77, 0x6e, 0x46, 0x0c, 0x46, + 0xad, 0xf8, 0x04, 0x00, 0x32, 0x46, 0xd8, 0xf8, 0x00, 0x00, 0x15, 0xfb, + 0x07, 0x00, 0xd0, 0xf8, 0x88, 0x00, 0x00, 0x90, 0x16, 0x48, 0x03, 0x68, + 0xdb, 0x48, 0x00, 0x69, 0x00, 0xf1, 0x14, 0x01, 0x30, 0x46, 0x98, 0x47, + 0x13, 0x48, 0x04, 0xf1, 0x14, 0x01, 0x32, 0x46, 0x03, 0x68, 0x30, 0x46, + 0x98, 0x47, 0x11, 0x48, 0x50, 0x21, 0x02, 0x68, 0x30, 0x46, 0x90, 0x47, + 0x06, 0x46, 0x00, 0x90, 0xd8, 0xf8, 0x00, 0x00, 0x15, 0xfb, 0x07, 0x00, + 0xb0, 0xf8, 0x98, 0x00, 0x45, 0x00, 0x0b, 0x48, 0x07, 0x68, 0x20, 0x46, + 0xe9, 0xf7, 0xaa, 0xfa, 0xc0, 0xf3, 0xc0, 0x62, 0x30, 0x46, 0x29, 0x46, + 0xb8, 0x47, 0xc0, 0xf3, 0x47, 0x00, 0xbd, 0xe8, 0xfc, 0x81, 0x00, 0xbf, + 0xdc, 0x35, 0x01, 0x00, 0x44, 0xa1, 0x08, 0x00, 0x48, 0xa1, 0x08, 0x00, + 0x3c, 0xa1, 0x08, 0x00, 0x40, 0xa1, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, + 0x8d, 0xb0, 0x83, 0x46, 0xba, 0x48, 0x0e, 0x46, 0x01, 0x68, 0x58, 0x46, + 0x88, 0x47, 0x48, 0xb1, 0x04, 0x46, 0x9b, 0xf8, 0x00, 0x00, 0x48, 0xb1, + 0x02, 0x28, 0x15, 0xd1, 0xb6, 0x48, 0x01, 0x21, 0x01, 0x70, 0x11, 0xe0, + 0x00, 0x27, 0x00, 0x20, 0xd5, 0x21, 0xf7, 0xe0, 0x9b, 0xf8, 0xc0, 0x00, + 0x02, 0x28, 0x09, 0xd1, 0xaf, 0x48, 0x40, 0x7f, 0x81, 0x28, 0x05, 0xd1, + 0x58, 0x46, 0xff, 0xf7, 0x0f, 0xff, 0x9b, 0xf8, 0x00, 0x00, 0xe7, 0xe7, + 0xac, 0x4a, 0x08, 0x94, 0xbb, 0xf8, 0x08, 0x10, 0xdb, 0xf8, 0xa0, 0x00, + 0x0c, 0xab, 0x14, 0x68, 0x0d, 0xf1, 0x2f, 0x02, 0xcd, 0xe9, 0x00, 0x32, + 0x0d, 0xf1, 0x32, 0x03, 0x32, 0x46, 0xa0, 0x47, 0x07, 0x46, 0x9b, 0xf8, + 0x00, 0x00, 0x02, 0x28, 0x0f, 0xd1, 0xa1, 0x4c, 0x60, 0x78, 0x50, 0xb1, + 0xdb, 0xf8, 0xa0, 0x10, 0x9b, 0xf8, 0xe6, 0x00, 0xff, 0xf7, 0x72, 0xff, + 0x00, 0x21, 0x02, 0x30, 0x61, 0x70, 0xad, 0xf8, 0x32, 0x00, 0x00, 0x20, + 0x20, 0x70, 0x09, 0x2e, 0x05, 0xd3, 0x9b, 0xf8, 0x00, 0x00, 0x10, 0xb9, + 0x98, 0x48, 0xff, 0x21, 0x01, 0x70, 0x08, 0x9c, 0x01, 0x2f, 0x40, 0xf0, + 0xbb, 0x80, 0x9b, 0xf8, 0x00, 0x00, 0x8b, 0xf8, 0x9a, 0x60, 0x02, 0x28, + 0x00, 0xf0, 0xb8, 0x80, 0x00, 0x28, 0x40, 0xf0, 0xab, 0x80, 0xd4, 0xf8, + 0x00, 0x01, 0x00, 0x28, 0x00, 0xf0, 0xa6, 0x80, 0x0b, 0xa9, 0x0a, 0xaa, + 0x00, 0xf0, 0x28, 0xf9, 0xbd, 0xf8, 0x2c, 0x50, 0xd4, 0xf8, 0x00, 0x01, + 0xbb, 0xf8, 0x08, 0x20, 0xdd, 0xf8, 0x28, 0xe0, 0x00, 0x23, 0x07, 0x95, + 0x00, 0x25, 0xb0, 0xf8, 0xdc, 0x12, 0x05, 0x95, 0x00, 0x25, 0x06, 0x95, + 0x00, 0x25, 0x04, 0x95, 0x00, 0x25, 0x03, 0x95, 0x9a, 0x46, 0x86, 0x4b, + 0x9d, 0xf8, 0x2f, 0x50, 0x89, 0xb2, 0x0e, 0xeb, 0x81, 0x08, 0x91, 0xb2, + 0x1f, 0x68, 0xbd, 0xf8, 0x32, 0x30, 0xcd, 0xe9, 0x00, 0x35, 0x07, 0x9b, + 0x53, 0x44, 0x03, 0xf1, 0x01, 0x09, 0x28, 0xf0, 0x70, 0x43, 0x1f, 0xfa, + 0x89, 0xf6, 0x1d, 0x46, 0x32, 0x46, 0xb8, 0x47, 0x07, 0x46, 0xd4, 0xf8, + 0x00, 0x01, 0xb0, 0xf8, 0xdc, 0x12, 0xef, 0xb3, 0x8f, 0x42, 0xae, 0x46, + 0x3b, 0xd2, 0xbd, 0xf8, 0x32, 0x20, 0xbd, 0xf8, 0x30, 0x30, 0x06, 0x96, + 0x9a, 0x1a, 0xd3, 0x19, 0x9a, 0xb2, 0x8a, 0x42, 0x28, 0xbf, 0x4b, 0x1e, + 0x05, 0x93, 0x94, 0xf8, 0x20, 0x51, 0x9a, 0xb2, 0x40, 0xf2, 0xe2, 0x43, + 0xd4, 0xe9, 0x49, 0xc6, 0xde, 0x4c, 0x4b, 0x43, 0x01, 0x3d, 0x9e, 0x1b, + 0x05, 0xfb, 0x1c, 0x65, 0xb4, 0xf8, 0xb8, 0x61, 0x40, 0xf2, 0xe2, 0x44, + 0x40, 0xf2, 0xe2, 0x4c, 0xad, 0x1b, 0xb5, 0xfb, 0xf4, 0xf5, 0x5c, 0x46, + 0x95, 0x42, 0x88, 0xbf, 0x15, 0x46, 0xaa, 0xb2, 0xdb, 0xf8, 0x0c, 0x50, + 0x5b, 0x1b, 0x9b, 0x1b, 0xb3, 0xfb, 0xfc, 0xfb, 0x5a, 0x45, 0x38, 0xbf, + 0x93, 0x46, 0xbb, 0x45, 0x7e, 0xd2, 0xa3, 0x46, 0x08, 0x9c, 0x06, 0x97, + 0xcd, 0xf8, 0x10, 0x90, 0x72, 0x46, 0xcd, 0xf8, 0x0c, 0xe0, 0x00, 0xe0, + 0xae, 0x46, 0xbb, 0xf8, 0x08, 0x20, 0x0d, 0x46, 0x5f, 0xfa, 0x8a, 0xf6, + 0x0a, 0xf1, 0x01, 0x03, 0x8a, 0x42, 0x38, 0xbf, 0x15, 0x46, 0xb5, 0x42, + 0x96, 0xd8, 0x07, 0x98, 0x06, 0x99, 0xcd, 0xf8, 0x28, 0xe0, 0x18, 0x44, + 0xad, 0xf8, 0x2c, 0x00, 0x08, 0x04, 0x5d, 0xd0, 0x03, 0x98, 0x8d, 0xb2, + 0x05, 0x99, 0x00, 0xeb, 0x85, 0x00, 0x89, 0xb2, 0x20, 0xf0, 0x70, 0x40, + 0xcb, 0xf8, 0xb4, 0x00, 0x40, 0xf2, 0xe2, 0x40, 0x01, 0xfb, 0x00, 0xf3, + 0xba, 0x49, 0x05, 0xfb, 0x00, 0xf2, 0x20, 0x46, 0x0c, 0x68, 0x04, 0x99, + 0x89, 0xb2, 0xa0, 0x47, 0xb7, 0x48, 0x44, 0x4a, 0x78, 0x21, 0x2b, 0x46, + 0x00, 0x95, 0x5e, 0xe0, 0x00, 0x27, 0x00, 0x20, 0x40, 0xf2, 0xad, 0x11, + 0xee, 0xf7, 0x76, 0xfb, 0x38, 0x46, 0x0d, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x36, 0x48, 0x00, 0x69, 0xe9, 0xf7, 0x7c, 0xf9, 0x01, 0x46, 0x35, 0x48, + 0x9b, 0xf8, 0xe6, 0x20, 0x4f, 0xf4, 0xa8, 0x73, 0x00, 0x68, 0x12, 0xfb, + 0x03, 0x02, 0x6f, 0xf0, 0x1f, 0x03, 0xd2, 0xf8, 0x88, 0x00, 0x59, 0x1a, + 0x0b, 0x18, 0x1b, 0x01, 0x08, 0xd5, 0xb2, 0xf8, 0x98, 0x20, 0x92, 0x00, + 0x13, 0x18, 0x23, 0xf0, 0x70, 0x40, 0x0b, 0x44, 0x1b, 0x01, 0xf9, 0xd4, + 0x29, 0x49, 0xbd, 0xf8, 0x32, 0x20, 0x9d, 0xf8, 0x2f, 0x30, 0x20, 0x25, + 0x09, 0xae, 0x0c, 0x68, 0xbb, 0xf8, 0x08, 0x10, 0x52, 0x00, 0xcd, 0xe9, + 0x00, 0x65, 0x49, 0x00, 0xa0, 0x47, 0xcb, 0xf8, 0xb4, 0x00, 0x22, 0x48, + 0x59, 0x46, 0x01, 0x22, 0x01, 0x27, 0x03, 0x68, 0x9b, 0xf9, 0xe6, 0x00, + 0x98, 0x47, 0xc3, 0xe7, 0x00, 0x27, 0xc1, 0xe7, 0x08, 0xeb, 0x87, 0x00, + 0x06, 0x99, 0xcd, 0xf8, 0x28, 0xe0, 0xad, 0xf8, 0x2c, 0x90, 0x20, 0xf0, + 0x70, 0x40, 0xc4, 0xf8, 0xb4, 0x00, 0x40, 0xf2, 0xe2, 0x40, 0x07, 0xfb, + 0x00, 0xf2, 0x0b, 0xfb, 0x00, 0xf3, 0x89, 0x48, 0x04, 0x68, 0x08, 0x98, + 0xa0, 0x47, 0x88, 0x48, 0x13, 0x4a, 0xcd, 0xf8, 0x00, 0xb0, 0x78, 0x21, + 0x3b, 0x46, 0xeb, 0xf7, 0xf3, 0xfe, 0x86, 0x48, 0x90, 0xf8, 0x2c, 0x01, + 0x80, 0x07, 0x05, 0xd5, 0x84, 0x48, 0x81, 0x4a, 0x02, 0x21, 0x03, 0x68, + 0x02, 0x20, 0x98, 0x47, 0x01, 0x27, 0x97, 0xe7, 0x64, 0xb8, 0x08, 0x00, + 0x50, 0x32, 0x06, 0x00, 0x2a, 0xe6, 0x05, 0x00, 0x6c, 0xc7, 0x08, 0x00, + 0x7f, 0xd3, 0x05, 0x00, 0xfc, 0x73, 0x01, 0x00, 0xdc, 0x35, 0x01, 0x00, + 0x08, 0xbb, 0x08, 0x00, 0x68, 0xb8, 0x08, 0x00, 0x10, 0xc7, 0x08, 0x00, + 0x6c, 0x9f, 0x03, 0x00, 0x8a, 0x9f, 0x03, 0x00, 0x10, 0xb5, 0x09, 0x4b, + 0x72, 0xb6, 0x1c, 0x68, 0x64, 0x00, 0x01, 0x34, 0x1c, 0x60, 0x84, 0x6e, + 0xb0, 0xf8, 0x14, 0x03, 0x14, 0x60, 0x08, 0x80, 0x18, 0x68, 0x40, 0x08, + 0x18, 0x60, 0x18, 0x68, 0x80, 0xf3, 0x10, 0x88, 0x10, 0xbd, 0x00, 0xbf, + 0x24, 0x36, 0x01, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, 0x87, 0xb0, 0x83, 0x46, + 0x60, 0x48, 0x03, 0x91, 0x0d, 0xf1, 0x1a, 0x01, 0x05, 0xaa, 0x9b, 0xf8, + 0x1d, 0x51, 0x04, 0x68, 0xdb, 0xf8, 0x00, 0x01, 0xff, 0xf7, 0xda, 0xff, + 0xc5, 0xeb, 0x05, 0x10, 0x40, 0xf2, 0x71, 0x25, 0xdb, 0xf8, 0x00, 0x31, + 0xdd, 0xf8, 0x14, 0x90, 0x4f, 0xf0, 0x00, 0x08, 0x04, 0xeb, 0x40, 0x10, + 0xdb, 0xf8, 0x30, 0x41, 0xc1, 0x68, 0xd0, 0xf8, 0xb4, 0x20, 0x00, 0xf1, + 0x08, 0x0a, 0x09, 0x1b, 0x4f, 0xf4, 0x1c, 0x74, 0x04, 0xeb, 0x41, 0x04, + 0xb4, 0xfb, 0xf5, 0xf4, 0x65, 0x43, 0xa1, 0xeb, 0x55, 0x01, 0xbd, 0xf8, + 0x1a, 0x50, 0x04, 0x91, 0xa1, 0x18, 0x21, 0xf0, 0x70, 0x47, 0xb3, 0xf8, + 0xdc, 0x12, 0x88, 0xb2, 0x09, 0xeb, 0x80, 0x02, 0xb9, 0x1a, 0x21, 0xf0, + 0x70, 0x43, 0x81, 0x00, 0xb3, 0xf1, 0x00, 0x6f, 0x0b, 0xd9, 0xba, 0xf8, + 0x00, 0x30, 0x9b, 0x00, 0xde, 0x19, 0x26, 0xf0, 0x70, 0x47, 0xb6, 0x1a, + 0x26, 0xf0, 0x70, 0x46, 0xb6, 0xf1, 0x00, 0x6f, 0xf6, 0xd8, 0x22, 0xf0, + 0x70, 0x49, 0x01, 0x35, 0x09, 0xeb, 0x01, 0x02, 0xd3, 0x1b, 0x1b, 0x01, + 0xf7, 0xd4, 0xba, 0xf8, 0x00, 0x10, 0x8b, 0x00, 0xfc, 0x1a, 0x3e, 0x46, + 0x24, 0xf0, 0x70, 0x47, 0xa9, 0xeb, 0x04, 0x04, 0x24, 0x01, 0xf7, 0xd4, + 0xb1, 0x45, 0x08, 0xd1, 0x4b, 0x44, 0x81, 0x42, 0x84, 0xbf, 0x22, 0xf0, + 0x70, 0x49, 0x01, 0x35, 0x23, 0xf0, 0x70, 0x47, 0x00, 0xe0, 0x37, 0x46, + 0xa7, 0xeb, 0x09, 0x02, 0x40, 0xf2, 0x71, 0x23, 0x22, 0xf0, 0x70, 0x42, + 0x5a, 0x43, 0x04, 0x9b, 0x03, 0xeb, 0x52, 0x06, 0xb6, 0xf5, 0xfa, 0x7f, + 0x14, 0xd3, 0x03, 0x9a, 0x06, 0xeb, 0x02, 0x0c, 0x40, 0xf2, 0xe2, 0x42, + 0x00, 0xfb, 0x02, 0xf3, 0xdb, 0xe9, 0x49, 0x42, 0x9a, 0x1a, 0x9b, 0xf8, + 0x20, 0x31, 0x01, 0x3b, 0x03, 0xfb, 0x14, 0x22, 0x20, 0x4b, 0xb3, 0xf8, + 0xb8, 0x31, 0xd2, 0x1a, 0x94, 0x45, 0x14, 0xd3, 0x1e, 0x4a, 0x12, 0x68, + 0x90, 0x47, 0xdb, 0xf8, 0x00, 0x11, 0xba, 0xf8, 0x00, 0x20, 0xb1, 0xf8, + 0xdc, 0x12, 0x8a, 0x42, 0x28, 0xbf, 0x0a, 0x46, 0x90, 0x42, 0x06, 0xd0, + 0x5f, 0xfa, 0x88, 0xf3, 0x08, 0xf1, 0x01, 0x00, 0x9a, 0x42, 0x80, 0x46, + 0x93, 0xd8, 0x03, 0x98, 0xa9, 0xb2, 0x32, 0x46, 0xcd, 0xf8, 0x14, 0x90, + 0xad, 0xf8, 0x1a, 0x50, 0x33, 0x18, 0x11, 0x48, 0x04, 0x68, 0x58, 0x46, + 0xa0, 0x47, 0x9b, 0xf8, 0x1e, 0x31, 0x0f, 0x48, 0x0f, 0x4a, 0x78, 0x21, + 0xcd, 0xe9, 0x00, 0x97, 0xeb, 0xf7, 0x02, 0xfe, 0x0d, 0x48, 0x90, 0xf8, + 0x2c, 0x01, 0x80, 0x07, 0x05, 0xd5, 0x0c, 0x48, 0x08, 0x4a, 0x02, 0x21, + 0x03, 0x68, 0x02, 0x20, 0x98, 0x47, 0x01, 0x20, 0x07, 0xb0, 0xbd, 0xe8, + 0xf0, 0x8f, 0x00, 0xbf, 0xe0, 0x35, 0x01, 0x00, 0xe8, 0x65, 0x08, 0x00, + 0xc0, 0xc8, 0x08, 0x00, 0xf8, 0xc6, 0x08, 0x00, 0xff, 0x6a, 0x01, 0x00, + 0xaf, 0x9f, 0x03, 0x00, 0x8c, 0x7e, 0x08, 0x00, 0x70, 0x9b, 0x08, 0x00, + 0xf8, 0xb5, 0x04, 0x46, 0x90, 0xf8, 0x21, 0x00, 0x0d, 0x46, 0xa0, 0xb1, + 0x01, 0x28, 0x2a, 0xd1, 0x1b, 0x4f, 0x20, 0x46, 0x29, 0x46, 0x01, 0xf0, + 0x1d, 0xfb, 0x50, 0xb3, 0x39, 0x68, 0x06, 0x46, 0x20, 0x46, 0x88, 0x47, + 0x41, 0xb2, 0xb1, 0xf1, 0xff, 0x3f, 0x23, 0xdc, 0x00, 0xf0, 0x87, 0x00, + 0x82, 0x28, 0xee, 0xd0, 0x1e, 0xe0, 0x20, 0x89, 0xa8, 0xb9, 0xa0, 0x8b, + 0x3c, 0x28, 0x12, 0xd3, 0x4f, 0x28, 0x10, 0xd8, 0x20, 0x78, 0x70, 0xb9, + 0xd4, 0xe9, 0x05, 0x01, 0x88, 0x42, 0x38, 0xbf, 0x08, 0x46, 0x47, 0xf2, + 0x30, 0x51, 0x88, 0x42, 0x05, 0xd8, 0x80, 0xb2, 0xb1, 0xfb, 0xf0, 0xf2, + 0x02, 0xfb, 0x10, 0x10, 0x40, 0xb1, 0x20, 0x46, 0x29, 0x46, 0xbd, 0xe8, + 0xf8, 0x40, 0x01, 0xf0, 0xf1, 0xba, 0x00, 0x26, 0x30, 0x46, 0xf8, 0xbd, + 0x18, 0x20, 0x01, 0x26, 0x20, 0x81, 0xf9, 0xe7, 0x98, 0xc8, 0x08, 0x00, + 0x2d, 0xe9, 0xfe, 0x43, 0x00, 0x28, 0x6f, 0xd0, 0xf4, 0x4d, 0x04, 0x46, + 0x00, 0x6c, 0x89, 0x46, 0x94, 0xf8, 0x1d, 0x61, 0x2f, 0x68, 0x20, 0xf4, + 0x80, 0x50, 0x20, 0x64, 0xe1, 0xbb, 0x01, 0x20, 0x4f, 0xf0, 0x00, 0x08, + 0x84, 0xf8, 0x1c, 0x01, 0x5b, 0x48, 0x01, 0x68, 0x00, 0x20, 0x88, 0x47, + 0x5a, 0x48, 0x00, 0x68, 0x80, 0x47, 0x5a, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x20, 0x46, 0x03, 0xf0, 0x4f, 0xf8, 0x94, 0xf8, 0x1d, 0x11, 0x28, 0x68, + 0x56, 0x4a, 0xd4, 0xf8, 0x00, 0x51, 0xc1, 0xeb, 0x01, 0x11, 0x52, 0x68, + 0xb5, 0xf8, 0xe2, 0x52, 0x00, 0xeb, 0x41, 0x10, 0x43, 0x78, 0xc3, 0xeb, + 0xc3, 0x01, 0x02, 0xeb, 0x81, 0x01, 0x0a, 0x7e, 0x01, 0x32, 0x0a, 0x76, + 0xd0, 0xf8, 0xa0, 0x10, 0x00, 0x89, 0x4a, 0x7f, 0x4c, 0x49, 0xd1, 0xf8, + 0x00, 0xc0, 0x94, 0xf8, 0x44, 0x10, 0xcd, 0xe9, 0x00, 0x50, 0x03, 0xf1, + 0x2c, 0x00, 0xcd, 0xf8, 0x08, 0x80, 0xc3, 0xb2, 0x14, 0x20, 0xe0, 0x47, + 0x46, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0xc6, 0xeb, 0x06, 0x10, + 0x00, 0x22, 0x07, 0xeb, 0x40, 0x10, 0xd0, 0xf8, 0xec, 0x10, 0xc0, 0xf8, + 0xec, 0x20, 0xd1, 0xf8, 0x00, 0x01, 0xc0, 0xf8, 0x00, 0x24, 0xd4, 0xf8, + 0x00, 0x01, 0x90, 0xf8, 0x4e, 0x13, 0x49, 0x07, 0x08, 0xd5, 0x3c, 0x49, + 0x09, 0x79, 0x49, 0x07, 0x44, 0xbf, 0x90, 0xf8, 0x36, 0x03, 0x5f, 0xea, + 0x40, 0x60, 0x40, 0xd4, 0x3b, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, + 0xb9, 0xf1, 0x00, 0x0f, 0x0c, 0xd0, 0x20, 0x6c, 0x81, 0x07, 0x2b, 0xd4, + 0x01, 0x25, 0x0e, 0xe0, 0x00, 0x20, 0x40, 0xf2, 0x76, 0x21, 0x03, 0xb0, + 0xbd, 0xe8, 0xf0, 0x43, 0xee, 0xf7, 0x4c, 0xb9, 0x33, 0x48, 0x21, 0x46, + 0x02, 0x68, 0x01, 0x20, 0x90, 0x47, 0x20, 0x6c, 0x00, 0x25, 0xc0, 0x05, + 0x08, 0xd5, 0x30, 0x48, 0x49, 0x46, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, + 0x20, 0x6c, 0x20, 0xf4, 0x80, 0x70, 0x20, 0x64, 0x1d, 0xb1, 0x2c, 0x48, + 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x94, 0xf8, 0x4a, 0x11, 0xd4, 0xf8, + 0x00, 0x01, 0x82, 0x22, 0x00, 0x23, 0x03, 0xb0, 0xbd, 0xe8, 0xf0, 0x43, + 0x18, 0xf0, 0x84, 0xb9, 0x21, 0x48, 0x84, 0xf8, 0x1f, 0x91, 0x01, 0x68, + 0x20, 0x46, 0x88, 0x47, 0x06, 0x20, 0x84, 0xf8, 0x1c, 0x01, 0xbd, 0xe8, + 0xfe, 0x83, 0x18, 0x48, 0x00, 0x68, 0x80, 0x47, 0x00, 0x28, 0xb9, 0xd0, + 0x06, 0x46, 0x94, 0xf8, 0x4a, 0x01, 0x02, 0x28, 0x07, 0xd3, 0x04, 0x28, + 0x01, 0xd8, 0x0c, 0x20, 0x05, 0xe0, 0x09, 0x28, 0x01, 0xd8, 0x80, 0x20, + 0x01, 0xe0, 0x10, 0x49, 0x08, 0x5c, 0x30, 0x71, 0x0f, 0x48, 0x32, 0x46, + 0x01, 0x23, 0xd4, 0xf8, 0x00, 0x11, 0x05, 0x68, 0x4f, 0x20, 0xa8, 0x47, + 0x00, 0x28, 0x9f, 0xd0, 0x30, 0x46, 0xee, 0xf7, 0x1b, 0xf9, 0x9b, 0xe7, + 0x00, 0xbb, 0x08, 0x00, 0xb8, 0xa0, 0x08, 0x00, 0xfc, 0xba, 0x08, 0x00, + 0xec, 0xe5, 0x05, 0x00, 0x10, 0xbb, 0x08, 0x00, 0x8c, 0xc8, 0x08, 0x00, + 0x70, 0x52, 0x01, 0x00, 0x48, 0xb5, 0x08, 0x00, 0x6a, 0x32, 0x0a, 0x10, + 0x80, 0x9b, 0x08, 0x00, 0x7c, 0xc8, 0x08, 0x00, 0x34, 0xb5, 0x08, 0x00, + 0x78, 0xc8, 0x08, 0x00, 0xcc, 0xc4, 0x08, 0x00, 0xd0, 0xc4, 0x08, 0x00, + 0x2d, 0xe9, 0xfe, 0x4f, 0x86, 0x46, 0x80, 0x48, 0x89, 0x46, 0x01, 0x26, + 0x4f, 0xf0, 0x00, 0x08, 0x4f, 0xf0, 0x00, 0x0b, 0x4f, 0xf0, 0x00, 0x0a, + 0x9e, 0xf8, 0x01, 0x10, 0x00, 0x68, 0xc1, 0xeb, 0x01, 0x11, 0x00, 0xeb, + 0x41, 0x10, 0x00, 0xf5, 0xea, 0x73, 0x90, 0xf8, 0xd5, 0x11, 0x00, 0xf5, + 0xe8, 0x7c, 0x13, 0xf8, 0x02, 0x4b, 0x44, 0xea, 0x01, 0x21, 0x1c, 0x78, + 0x5b, 0x78, 0x44, 0xea, 0x03, 0x23, 0x00, 0x24, 0x41, 0xea, 0x03, 0x41, + 0x61, 0x45, 0x00, 0xf0, 0xc0, 0x80, 0x00, 0x23, 0x91, 0xf8, 0x40, 0x00, + 0x91, 0xf8, 0x41, 0x50, 0xa8, 0x42, 0x01, 0xd3, 0x00, 0x28, 0x66, 0xd0, + 0x91, 0xf8, 0x4e, 0x40, 0x24, 0xb3, 0xd8, 0xb2, 0xd9, 0xf8, 0x08, 0x50, + 0x80, 0x00, 0x50, 0xfa, 0x83, 0xf0, 0x05, 0xeb, 0x40, 0x06, 0x15, 0xf8, + 0x10, 0x00, 0xb7, 0x78, 0x36, 0x79, 0x01, 0x38, 0xb6, 0xfb, 0xf7, 0xf5, + 0x10, 0xfb, 0x06, 0xf0, 0x05, 0xfb, 0x17, 0x66, 0x35, 0x44, 0x50, 0xfa, + 0x85, 0xfa, 0x91, 0xf8, 0x28, 0x00, 0x91, 0xf8, 0x4f, 0x50, 0xb0, 0xfb, + 0xf4, 0xf6, 0x01, 0x3d, 0x06, 0xfb, 0x14, 0x04, 0x15, 0xfb, 0x00, 0xf0, + 0x34, 0x44, 0x50, 0xfa, 0x84, 0xfb, 0x03, 0xe0, 0x4f, 0xf0, 0x00, 0x0a, + 0x4f, 0xf0, 0x00, 0x0b, 0x91, 0xf8, 0x58, 0x40, 0x1c, 0xb3, 0xd8, 0xb2, + 0xd9, 0xf8, 0x08, 0x50, 0x80, 0x00, 0x50, 0xfa, 0x83, 0xf0, 0x05, 0xeb, + 0x40, 0x00, 0x45, 0x78, 0xc6, 0x78, 0x00, 0x79, 0xb0, 0xfb, 0xf6, 0xf7, + 0x01, 0x3d, 0x15, 0xfb, 0x00, 0xf5, 0x07, 0xfb, 0x16, 0x00, 0x38, 0x44, + 0x55, 0xfa, 0x80, 0xf8, 0x91, 0xf8, 0x28, 0x00, 0x91, 0xf8, 0x59, 0x50, + 0xb0, 0xfb, 0xf4, 0xf6, 0x01, 0x3d, 0x06, 0xfb, 0x14, 0x04, 0x15, 0xfb, + 0x00, 0xf0, 0x34, 0x44, 0x50, 0xfa, 0x84, 0xf4, 0x02, 0xe0, 0x4f, 0xf0, + 0x00, 0x08, 0x00, 0x24, 0x1f, 0xfa, 0x8a, 0xf6, 0x1f, 0xfa, 0x8b, 0xf0, + 0xb0, 0x42, 0x31, 0xd8, 0x1f, 0xfa, 0x88, 0xf7, 0xa5, 0xb2, 0xbd, 0x42, + 0x2c, 0xd8, 0xb0, 0x42, 0x08, 0xbf, 0xbd, 0x42, 0x10, 0xd0, 0x01, 0x33, + 0x00, 0x26, 0x11, 0xf8, 0x04, 0x0f, 0x4d, 0x78, 0x8f, 0x78, 0xc9, 0x78, + 0x40, 0xea, 0x05, 0x20, 0x47, 0xea, 0x01, 0x21, 0x40, 0xea, 0x01, 0x41, + 0x61, 0x45, 0x7f, 0xf4, 0x83, 0xaf, 0x19, 0xe0, 0x99, 0xf8, 0x04, 0x00, + 0x10, 0xb1, 0x9e, 0xf8, 0xe2, 0x00, 0xa8, 0xb1, 0xb9, 0xf8, 0x00, 0x60, + 0xbe, 0xf8, 0x08, 0x00, 0xb0, 0x42, 0x07, 0xd8, 0x00, 0x2a, 0xe0, 0xd0, + 0xb6, 0xfb, 0xf2, 0xf0, 0x00, 0xfb, 0x12, 0x60, 0x00, 0x28, 0xda, 0xd0, + 0x01, 0x26, 0x44, 0x46, 0xd3, 0x46, 0x28, 0xe0, 0x01, 0x26, 0x26, 0xe0, + 0x2e, 0xbb, 0x01, 0xe0, 0x44, 0x46, 0xd3, 0x46, 0xb9, 0xf8, 0x00, 0x10, + 0x40, 0xf2, 0xe2, 0x45, 0xbe, 0xf8, 0x08, 0x00, 0x1f, 0xfa, 0x8a, 0xf2, + 0x1f, 0xfa, 0x8b, 0xf3, 0x77, 0x46, 0x69, 0x43, 0xcd, 0xe9, 0x00, 0x13, + 0x02, 0x92, 0x00, 0xfb, 0x05, 0xf3, 0x73, 0x48, 0x17, 0x4a, 0x78, 0x21, + 0xeb, 0xf7, 0xdc, 0xfb, 0x72, 0x48, 0x90, 0xf8, 0x2c, 0x01, 0x80, 0x07, + 0x05, 0xd5, 0x71, 0x48, 0x6d, 0x4a, 0x01, 0x21, 0x03, 0x68, 0x02, 0x20, + 0x98, 0x47, 0x00, 0x26, 0xbe, 0x46, 0xb9, 0xf8, 0x00, 0x00, 0xbe, 0xf8, + 0x08, 0x10, 0x0e, 0x4a, 0x0c, 0x23, 0x41, 0xea, 0x00, 0x40, 0x1f, 0xfa, + 0x8a, 0xf1, 0x16, 0x60, 0x50, 0x60, 0xcb, 0xea, 0x04, 0x40, 0x40, 0xea, + 0x08, 0x60, 0x40, 0xea, 0x01, 0x20, 0x00, 0x21, 0x90, 0x60, 0x07, 0x48, + 0x04, 0x68, 0x40, 0xf2, 0x33, 0x20, 0xa0, 0x47, 0xf0, 0xb2, 0xbd, 0xe8, + 0xfe, 0x8f, 0x00, 0xbf, 0xe0, 0x35, 0x01, 0x00, 0xd3, 0x9f, 0x03, 0x00, + 0x8c, 0x34, 0x01, 0x00, 0x78, 0x9b, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, + 0x87, 0xb0, 0x06, 0x46, 0x4e, 0x48, 0x0d, 0x46, 0x00, 0x68, 0x80, 0x47, + 0x4d, 0x49, 0x91, 0xf8, 0xc4, 0x11, 0x88, 0x42, 0x14, 0xd2, 0x4c, 0x48, + 0x01, 0x68, 0x4f, 0xf4, 0x1a, 0x70, 0x88, 0x47, 0x70, 0xb1, 0x31, 0x78, + 0x80, 0x46, 0x06, 0x20, 0x02, 0x29, 0x48, 0x49, 0x38, 0xbf, 0x05, 0x20, + 0x0a, 0x68, 0x41, 0x46, 0x90, 0x47, 0xff, 0x28, 0x06, 0xd1, 0x40, 0x46, + 0xed, 0xf7, 0xce, 0xff, 0x00, 0x20, 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x41, 0x49, 0x88, 0xf8, 0x44, 0x00, 0x0a, 0x68, 0xc1, 0xb2, 0x40, 0x48, + 0x90, 0x47, 0x98, 0xf8, 0x44, 0x10, 0x00, 0x20, 0x16, 0x29, 0xf0, 0xd8, + 0x96, 0x49, 0xb3, 0x78, 0x44, 0x46, 0x0a, 0x68, 0x71, 0x78, 0x06, 0x93, + 0x05, 0x91, 0xc1, 0xeb, 0x01, 0x11, 0x04, 0x91, 0x02, 0xeb, 0x41, 0x11, + 0x01, 0xf5, 0xe8, 0x77, 0x91, 0xf8, 0xd1, 0xc1, 0x3a, 0x46, 0x12, 0xf8, + 0x02, 0x9b, 0x92, 0xf8, 0x00, 0xa0, 0x92, 0xf8, 0x01, 0xb0, 0x04, 0xf8, + 0xf8, 0x9f, 0x88, 0xf8, 0xf9, 0xc0, 0x49, 0xea, 0x0c, 0x2c, 0x4f, 0xea, + 0x14, 0x4e, 0x23, 0x0e, 0x84, 0xf8, 0x03, 0xb0, 0x84, 0xf8, 0x02, 0xa0, + 0x82, 0xf8, 0x00, 0xe0, 0x53, 0x70, 0x22, 0x0a, 0x81, 0xf8, 0xd0, 0x41, + 0x81, 0xf8, 0xd1, 0x21, 0x4a, 0xea, 0x0b, 0x21, 0x4c, 0xea, 0x01, 0x41, + 0x4a, 0x71, 0x01, 0xf8, 0x04, 0x4f, 0x04, 0x9a, 0x81, 0xf8, 0x02, 0xe0, + 0xcb, 0x70, 0x7b, 0x49, 0x88, 0xf8, 0x1c, 0x01, 0x20, 0x48, 0x05, 0x9b, + 0x88, 0xf8, 0x1e, 0x51, 0x09, 0x68, 0x90, 0xf8, 0xca, 0x01, 0x88, 0xf8, + 0x1d, 0x31, 0x01, 0xeb, 0x42, 0x11, 0x88, 0xf8, 0xd0, 0x01, 0x38, 0x0a, + 0x91, 0xf8, 0xc0, 0x20, 0x01, 0x32, 0x81, 0xf8, 0xc0, 0x20, 0x88, 0xf8, + 0xfd, 0x00, 0x40, 0x46, 0x39, 0x0c, 0x17, 0x4a, 0x00, 0xf8, 0xfc, 0x7f, + 0x81, 0x70, 0x39, 0x0e, 0xc1, 0x70, 0x96, 0xf8, 0xc0, 0x00, 0x78, 0x21, + 0x00, 0x90, 0x06, 0x98, 0xcd, 0xe9, 0x01, 0x05, 0x0f, 0x48, 0xeb, 0xf7, + 0x17, 0xfb, 0x10, 0x48, 0x90, 0xf8, 0x2c, 0x01, 0x80, 0x07, 0x40, 0x46, + 0x89, 0xd5, 0x0e, 0x48, 0x0a, 0x4a, 0x02, 0x21, 0x03, 0x68, 0x02, 0x20, + 0x98, 0x47, 0x40, 0x46, 0x81, 0xe7, 0x00, 0xbf, 0x40, 0xc8, 0x08, 0x00, + 0xe8, 0x65, 0x08, 0x00, 0x4c, 0x9c, 0x08, 0x00, 0x44, 0xc8, 0x08, 0x00, + 0xa4, 0xda, 0x08, 0x00, 0xc0, 0x52, 0x01, 0x00, 0x00, 0x69, 0x08, 0x00, + 0xff, 0x6a, 0x01, 0x00, 0x16, 0xa0, 0x03, 0x00, 0x8c, 0x7e, 0x08, 0x00, + 0x70, 0x9b, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x47, 0x00, 0x28, 0x00, 0xf0, + 0x97, 0x80, 0x04, 0x46, 0x90, 0xf8, 0x41, 0x00, 0x40, 0x06, 0x09, 0xd5, + 0x4d, 0x49, 0x94, 0xf8, 0x44, 0x00, 0x0a, 0x68, 0x00, 0x21, 0x90, 0x47, + 0x20, 0x6c, 0x20, 0xf4, 0x80, 0x40, 0x20, 0x64, 0xdf, 0xf8, 0x24, 0x91, + 0x94, 0xf8, 0x1d, 0x01, 0xc0, 0xeb, 0x00, 0x17, 0xd9, 0xf8, 0x00, 0x50, + 0x79, 0x01, 0x69, 0x5c, 0x01, 0x29, 0x29, 0x46, 0x09, 0xd8, 0x20, 0x46, + 0x02, 0xf0, 0xc0, 0xfe, 0x00, 0x20, 0xc4, 0xe9, 0x7c, 0x00, 0x94, 0xf8, + 0x1d, 0x01, 0xd9, 0xf8, 0x00, 0x10, 0xc0, 0xeb, 0x00, 0x10, 0xdf, 0xf8, + 0xf8, 0x80, 0x01, 0xeb, 0x40, 0x10, 0x40, 0x78, 0xd8, 0xf8, 0x04, 0x10, + 0xc0, 0xeb, 0xc0, 0x00, 0x01, 0xeb, 0x80, 0x00, 0x10, 0xf8, 0x18, 0x1f, + 0x09, 0xb1, 0x01, 0x39, 0x01, 0x70, 0x37, 0x48, 0x05, 0xeb, 0x47, 0x17, + 0x72, 0xb6, 0x01, 0x68, 0x49, 0x00, 0x01, 0x31, 0x01, 0x60, 0xb4, 0xf8, + 0x7a, 0x11, 0x21, 0xf0, 0x08, 0x01, 0xa4, 0xf8, 0x7a, 0x11, 0x01, 0x68, + 0x49, 0x08, 0x01, 0x60, 0x00, 0x68, 0x80, 0xf3, 0x10, 0x88, 0x20, 0x46, + 0x00, 0xf0, 0xec, 0xff, 0x82, 0x46, 0x97, 0xf8, 0x06, 0x01, 0x03, 0x28, + 0x49, 0xd1, 0x94, 0xf8, 0x1d, 0x11, 0xd9, 0xf8, 0x00, 0x00, 0xc1, 0xeb, + 0x01, 0x11, 0x00, 0xeb, 0x41, 0x11, 0x4a, 0x78, 0x25, 0x49, 0x0b, 0x78, + 0x93, 0x42, 0x3c, 0xd1, 0x24, 0x4a, 0x00, 0x24, 0xc8, 0xf8, 0x00, 0x40, + 0x14, 0x70, 0xff, 0x22, 0x0a, 0x70, 0x17, 0xf8, 0x01, 0x1f, 0xc1, 0xeb, + 0x01, 0x11, 0x00, 0xeb, 0x41, 0x10, 0xd0, 0xf8, 0xd4, 0x61, 0x00, 0xf5, + 0xe8, 0x70, 0x86, 0x42, 0x29, 0xd0, 0x1c, 0x4d, 0x29, 0x68, 0xa6, 0xf1, + 0xe0, 0x00, 0x06, 0xf8, 0xd0, 0x4c, 0x88, 0x47, 0x06, 0xf5, 0x82, 0x70, + 0x10, 0x21, 0xea, 0xf7, 0x8d, 0xfe, 0x16, 0xf8, 0x04, 0x0f, 0x71, 0x78, + 0xb2, 0x78, 0xf3, 0x78, 0x40, 0xea, 0x01, 0x20, 0x42, 0xea, 0x03, 0x21, + 0x40, 0xea, 0x01, 0x46, 0x39, 0x78, 0xd9, 0xf8, 0x00, 0x00, 0xc1, 0xeb, + 0x01, 0x11, 0x00, 0xeb, 0x41, 0x10, 0x00, 0xf5, 0xe8, 0x70, 0x86, 0x42, + 0xde, 0xd1, 0x06, 0xe0, 0x00, 0x20, 0x40, 0xf2, 0x16, 0x41, 0x4f, 0xf0, + 0x00, 0x0a, 0xed, 0xf7, 0x77, 0xfe, 0x50, 0x46, 0xbd, 0xe8, 0xf0, 0x87, + 0x00, 0xb6, 0x08, 0x00, 0xe0, 0x35, 0x01, 0x00, 0xec, 0xe5, 0x05, 0x00, + 0x24, 0x36, 0x01, 0x00, 0x41, 0xd3, 0x05, 0x00, 0x74, 0xe5, 0x05, 0x00, + 0x2c, 0x9d, 0x08, 0x00, 0x0a, 0x48, 0x00, 0x22, 0x01, 0x1d, 0x51, 0xf8, + 0x04, 0x0c, 0x48, 0xb1, 0x0b, 0x78, 0x05, 0x2b, 0x06, 0xd1, 0x90, 0xf8, + 0x1c, 0x31, 0x01, 0x20, 0x02, 0x2b, 0x18, 0xbf, 0x04, 0x2b, 0x04, 0xd0, + 0x01, 0x32, 0x0c, 0x31, 0x17, 0x2a, 0xee, 0xd1, 0x00, 0x20, 0x70, 0x47, + 0xe8, 0x72, 0x01, 0x00, 0x70, 0xb5, 0x88, 0xb0, 0x04, 0x46, 0x12, 0x98, + 0x0e, 0x9e, 0x15, 0x46, 0x06, 0x90, 0x11, 0x98, 0x02, 0x96, 0x05, 0x90, + 0x10, 0x98, 0x04, 0x90, 0x0f, 0x98, 0x03, 0x90, 0x0d, 0x98, 0x01, 0x90, + 0x0c, 0x98, 0x00, 0x90, 0x20, 0x46, 0x00, 0xf0, 0x65, 0xff, 0xe2, 0x48, + 0x94, 0xf8, 0x1d, 0x11, 0x00, 0x68, 0xc1, 0xeb, 0x01, 0x11, 0x00, 0xeb, + 0x41, 0x12, 0xd2, 0xf8, 0xa0, 0x20, 0x52, 0x7f, 0x22, 0xb1, 0x04, 0xf5, + 0xe6, 0x72, 0x04, 0xf2, 0xcd, 0x13, 0x03, 0xe0, 0x04, 0xf2, 0xcd, 0x12, + 0x04, 0xf5, 0xe6, 0x73, 0x49, 0x01, 0x1d, 0x70, 0x40, 0x5c, 0x04, 0x49, + 0x01, 0x28, 0x98, 0xbf, 0x16, 0x70, 0xb4, 0xf8, 0x34, 0x01, 0x08, 0x80, + 0x08, 0xb0, 0x70, 0xbd, 0x7e, 0xe5, 0x05, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, + 0x8f, 0xb0, 0xb3, 0xf5, 0xfa, 0x7f, 0xc0, 0xf0, 0x97, 0x81, 0x18, 0x9c, + 0x1f, 0x46, 0xa3, 0x42, 0x00, 0xf2, 0x92, 0x81, 0x06, 0x46, 0xb1, 0xf8, + 0xdc, 0x02, 0x8b, 0x46, 0x40, 0xf2, 0xe2, 0x41, 0x48, 0x43, 0xa0, 0x42, + 0x40, 0xf2, 0x88, 0x81, 0x15, 0x46, 0xa7, 0x42, 0x06, 0xd1, 0xc7, 0x48, + 0x29, 0x46, 0x3a, 0x46, 0x3b, 0x46, 0x04, 0x68, 0x30, 0x46, 0xfe, 0xe0, + 0xc0, 0x48, 0x96, 0xf8, 0x1d, 0x11, 0xc0, 0x4b, 0x00, 0x68, 0xc1, 0xeb, + 0x01, 0x11, 0xd3, 0xf8, 0x00, 0xc0, 0x9b, 0xf8, 0x35, 0x31, 0x00, 0xeb, + 0x41, 0x18, 0xdb, 0xf8, 0xd4, 0x00, 0x38, 0xf8, 0x08, 0x1f, 0x98, 0xf8, + 0x92, 0x20, 0x00, 0x93, 0xb8, 0x4b, 0xe0, 0x47, 0x00, 0x28, 0x00, 0xf0, + 0x65, 0x81, 0x40, 0xf2, 0xe2, 0x40, 0x07, 0xf2, 0xe1, 0x42, 0xcd, 0xe9, + 0x0b, 0x86, 0x0e, 0x95, 0xb4, 0xfb, 0xf0, 0xf8, 0xb2, 0xfb, 0xf0, 0xfa, + 0x1f, 0xfa, 0x88, 0xf1, 0x1f, 0xfa, 0x8a, 0xf7, 0x41, 0x43, 0x07, 0xfb, + 0x00, 0xf2, 0x8a, 0x42, 0x54, 0xd2, 0xae, 0x48, 0x0e, 0x9c, 0x02, 0x68, + 0x58, 0x46, 0x21, 0x46, 0x90, 0x47, 0x81, 0x46, 0xab, 0x48, 0x22, 0x46, + 0x4b, 0x46, 0x05, 0x68, 0x0b, 0x98, 0x01, 0x88, 0xa5, 0x48, 0x00, 0x7a, + 0xcd, 0xe9, 0x00, 0x70, 0x58, 0x46, 0xa8, 0x47, 0x04, 0x46, 0xa8, 0xeb, + 0x0a, 0x00, 0xa5, 0x4e, 0xa5, 0x4a, 0x78, 0x21, 0x05, 0x19, 0x23, 0x46, + 0xa8, 0xb2, 0x0d, 0x90, 0x00, 0x90, 0x30, 0x46, 0xeb, 0xf7, 0x80, 0xf9, + 0xa1, 0x4f, 0x97, 0xf8, 0x2c, 0x01, 0x80, 0x07, 0x05, 0xd5, 0xa0, 0x48, + 0x02, 0x21, 0x32, 0x46, 0x03, 0x68, 0x02, 0x20, 0x98, 0x47, 0x41, 0x2c, + 0x2b, 0xd3, 0x95, 0x48, 0x0b, 0x9e, 0xdf, 0xf8, 0x80, 0x82, 0x0e, 0x9d, + 0x4b, 0x46, 0x00, 0x7a, 0x31, 0x88, 0xd8, 0xf8, 0x00, 0x70, 0x2a, 0x46, + 0xcd, 0xe9, 0x00, 0x40, 0x58, 0x46, 0xb8, 0x47, 0x82, 0x46, 0x8d, 0x48, + 0x0d, 0x9a, 0xd8, 0xf8, 0x00, 0x40, 0x31, 0x88, 0x4b, 0x46, 0x00, 0x7a, + 0xcd, 0xe9, 0x00, 0x20, 0x58, 0x46, 0x2a, 0x46, 0xa0, 0x47, 0x40, 0xf2, + 0xe2, 0x41, 0x00, 0xfb, 0x01, 0xf3, 0x86, 0x48, 0x0a, 0xfb, 0x01, 0xf2, + 0x29, 0x46, 0x04, 0x68, 0x0c, 0x98, 0x7c, 0xe0, 0x82, 0x48, 0x18, 0xbf, + 0x22, 0x46, 0x0e, 0x99, 0x74, 0xe0, 0x0d, 0x98, 0x40, 0x21, 0x06, 0x95, + 0x3f, 0x28, 0x38, 0xbf, 0x41, 0x1c, 0xa1, 0x42, 0x5a, 0xd9, 0x07, 0xf5, + 0x96, 0x70, 0x0d, 0x46, 0x00, 0x26, 0xa0, 0x46, 0xa2, 0x46, 0x04, 0x94, + 0x05, 0x90, 0x77, 0x48, 0xd0, 0xe9, 0x00, 0x12, 0x07, 0x8a, 0x00, 0x20, + 0x07, 0x90, 0x00, 0x20, 0x08, 0x90, 0x00, 0x20, 0xcd, 0xe9, 0x09, 0x21, + 0x5f, 0xfa, 0x8a, 0xf9, 0x04, 0x46, 0xb9, 0xfb, 0xf7, 0xf0, 0x00, 0xfb, + 0x17, 0x92, 0xdd, 0xe9, 0x09, 0x10, 0xe8, 0xf7, 0x51, 0xfb, 0xc0, 0x07, + 0x07, 0xd0, 0x60, 0x1c, 0xb9, 0xf1, 0x3f, 0x0f, 0x16, 0xd0, 0x0d, 0x99, + 0x41, 0x45, 0x0c, 0xd1, 0x12, 0xe0, 0x08, 0x98, 0xe1, 0xb2, 0xc0, 0xb2, + 0x81, 0x42, 0x05, 0xd9, 0xaa, 0xeb, 0x04, 0x00, 0xaa, 0xf1, 0x01, 0x06, + 0x08, 0x94, 0x07, 0x90, 0x00, 0x20, 0x0a, 0xf1, 0x01, 0x0a, 0x5f, 0xfa, + 0x8a, 0xf8, 0x45, 0x45, 0xd8, 0xd8, 0x0a, 0xe0, 0x08, 0x99, 0xc2, 0xb2, + 0xc9, 0xb2, 0x8a, 0x42, 0x05, 0xd9, 0x08, 0x90, 0x5e, 0x48, 0xaa, 0xeb, + 0x04, 0x03, 0x56, 0x46, 0x05, 0xe0, 0x08, 0x98, 0x04, 0x9c, 0x07, 0x9b, + 0x00, 0x06, 0xfc, 0x48, 0x0e, 0xd0, 0x05, 0x46, 0x0d, 0x98, 0x0e, 0x9a, + 0xb0, 0x46, 0x40, 0x28, 0x20, 0xd3, 0xf0, 0xb2, 0xdd, 0xf8, 0x14, 0xa0, + 0x3f, 0x28, 0x7e, 0xd1, 0xdd, 0xf8, 0x18, 0x80, 0x0c, 0x9e, 0x1a, 0xe0, + 0x0b, 0x98, 0x0e, 0x9d, 0x23, 0x46, 0x01, 0x88, 0x54, 0x48, 0x2a, 0x46, + 0x06, 0x68, 0x4a, 0x48, 0x00, 0x7a, 0x00, 0x90, 0x58, 0x46, 0xb0, 0x47, + 0x40, 0xf2, 0xe2, 0x41, 0x00, 0xfb, 0x01, 0xf2, 0x46, 0x48, 0x29, 0x46, + 0x04, 0x68, 0x0c, 0x98, 0x13, 0x46, 0xa0, 0x47, 0x01, 0x20, 0x7c, 0xe0, + 0x0c, 0x9e, 0xdd, 0xf8, 0x14, 0xa0, 0x0b, 0x98, 0x5f, 0xfa, 0x83, 0xf9, + 0x4b, 0x46, 0x01, 0x88, 0x46, 0x48, 0x04, 0x68, 0x3c, 0x48, 0x00, 0x7a, + 0x00, 0x90, 0x58, 0x46, 0xa0, 0x47, 0x30, 0xb1, 0x07, 0x46, 0x5f, 0xfa, + 0x88, 0xf0, 0xa0, 0xeb, 0x09, 0x00, 0x38, 0x44, 0x11, 0xe0, 0x9a, 0xf8, + 0x00, 0x00, 0x80, 0x07, 0x05, 0xd5, 0xdd, 0x48, 0x3d, 0x4a, 0x01, 0x21, + 0x03, 0x68, 0x02, 0x20, 0x98, 0x47, 0x5f, 0xfa, 0x88, 0xf0, 0x01, 0x27, + 0xa0, 0xeb, 0x09, 0x00, 0x01, 0x28, 0xd8, 0xbf, 0x38, 0x46, 0xbb, 0xf8, + 0xdc, 0x12, 0x40, 0xf2, 0xe2, 0x42, 0xd6, 0xe9, 0x49, 0x34, 0x51, 0x43, + 0x09, 0x1b, 0x96, 0xf8, 0x20, 0x41, 0x01, 0x3c, 0x04, 0xfb, 0x13, 0x11, + 0xcb, 0x4b, 0xb3, 0xf8, 0xb8, 0x31, 0xc9, 0x1a, 0xb1, 0xfb, 0xf2, 0xf1, + 0xb9, 0x42, 0x01, 0xd2, 0x01, 0x46, 0x03, 0xe0, 0x80, 0xb2, 0x81, 0x42, + 0x88, 0xbf, 0x01, 0x46, 0x5f, 0xfa, 0x88, 0xf0, 0x29, 0x4a, 0x8c, 0xb2, + 0x78, 0x21, 0x4b, 0x46, 0xcd, 0xe9, 0x00, 0x07, 0x28, 0x46, 0x02, 0x94, + 0xeb, 0xf7, 0x7c, 0xf8, 0x9a, 0xf8, 0x00, 0x00, 0x80, 0x07, 0x05, 0xd5, + 0xc0, 0x48, 0x02, 0x21, 0x2a, 0x46, 0x03, 0x68, 0x02, 0x20, 0x98, 0x47, + 0x40, 0xf2, 0xe2, 0x40, 0x0e, 0x99, 0x07, 0xfb, 0x00, 0xf2, 0x04, 0xfb, + 0x00, 0xf3, 0x12, 0x48, 0x97, 0xe6, 0x0d, 0x98, 0x08, 0x99, 0x0c, 0x9e, + 0x3f, 0x38, 0xc9, 0xb2, 0x88, 0x42, 0x98, 0xd9, 0x01, 0x06, 0x05, 0xd0, + 0xdd, 0xf8, 0x18, 0x80, 0xa8, 0xeb, 0x00, 0x00, 0x43, 0x1c, 0x90, 0xe7, + 0x9a, 0xf8, 0x00, 0x00, 0x80, 0x07, 0x05, 0xd5, 0xaf, 0x48, 0x0e, 0x4a, + 0x01, 0x21, 0x03, 0x68, 0x02, 0x20, 0x98, 0x47, 0x00, 0x20, 0x0f, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0xe0, 0x35, 0x01, 0x00, 0xf4, 0xc6, 0x08, 0x00, + 0x38, 0x53, 0x01, 0x00, 0xf8, 0xc6, 0x08, 0x00, 0x64, 0xc7, 0x08, 0x00, + 0x14, 0xc7, 0x08, 0x00, 0xff, 0x6a, 0x01, 0x00, 0x3e, 0xa0, 0x03, 0x00, + 0x8c, 0x7e, 0x08, 0x00, 0x70, 0x9b, 0x08, 0x00, 0x9c, 0xa0, 0x03, 0x00, + 0x20, 0xc7, 0x08, 0x00, 0x5b, 0xa0, 0x03, 0x00, 0x71, 0xa0, 0x03, 0x00, + 0x10, 0xc7, 0x08, 0x00, 0x10, 0xb5, 0x04, 0x46, 0x00, 0x20, 0x21, 0x78, + 0x20, 0x81, 0x84, 0xf8, 0x9a, 0x00, 0xe0, 0x70, 0x01, 0x29, 0x07, 0xd8, + 0xe0, 0x60, 0x84, 0xf8, 0x06, 0x01, 0x04, 0xf5, 0x80, 0x70, 0x05, 0x21, + 0xea, 0xf7, 0x3c, 0xfc, 0x05, 0x48, 0x61, 0x78, 0x40, 0x68, 0xc1, 0xeb, + 0xc1, 0x01, 0x00, 0xeb, 0x81, 0x00, 0x1c, 0x21, 0xea, 0xf7, 0x32, 0xfc, + 0x10, 0xbd, 0x00, 0xbf, 0xec, 0xe5, 0x05, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, + 0x87, 0xb0, 0x00, 0x28, 0x00, 0xf0, 0xab, 0x80, 0x04, 0x46, 0x84, 0x48, + 0x0e, 0x46, 0x00, 0xf5, 0xdc, 0x78, 0x94, 0xf8, 0x9a, 0x00, 0x18, 0xf8, + 0x17, 0x9f, 0x98, 0xf8, 0x01, 0xa0, 0x18, 0xb1, 0x20, 0x89, 0x00, 0x28, + 0x40, 0xf0, 0x9b, 0x80, 0x94, 0xf8, 0x21, 0x00, 0x00, 0x28, 0x7b, 0xd0, + 0x46, 0x21, 0x00, 0x28, 0x7a, 0x4d, 0x7f, 0x4b, 0x7f, 0x4a, 0x08, 0xbf, + 0x55, 0x21, 0x20, 0x78, 0x00, 0x91, 0x7b, 0x49, 0x00, 0x28, 0x08, 0xbf, + 0x0b, 0x46, 0x28, 0x46, 0x78, 0x21, 0xea, 0xf7, 0xe3, 0xff, 0x75, 0x48, + 0x90, 0xf8, 0x2c, 0x01, 0x80, 0x07, 0x05, 0xd5, 0x73, 0x48, 0x01, 0x21, + 0x2a, 0x46, 0x03, 0x68, 0x02, 0x20, 0x98, 0x47, 0x00, 0x27, 0x74, 0x48, + 0xcd, 0xe9, 0x04, 0x77, 0x01, 0x68, 0x94, 0xf8, 0xc0, 0x00, 0x00, 0xeb, + 0x80, 0x00, 0x40, 0x00, 0x88, 0x47, 0x00, 0x28, 0x06, 0x90, 0x6d, 0xd0, + 0xa0, 0x8b, 0x5b, 0x28, 0x07, 0xd3, 0x95, 0x28, 0x05, 0xd8, 0x00, 0x20, + 0x88, 0xf8, 0x01, 0x00, 0x39, 0x20, 0x88, 0xf8, 0x00, 0x00, 0x00, 0x20, + 0x20, 0x81, 0x5e, 0xb9, 0x67, 0x48, 0x06, 0x88, 0x46, 0xb9, 0x67, 0x48, + 0x00, 0x21, 0x02, 0x68, 0x00, 0x20, 0x90, 0x47, 0x06, 0x46, 0x08, 0xb9, + 0x64, 0x48, 0x06, 0x68, 0x64, 0x48, 0xb6, 0xb2, 0x31, 0x46, 0x02, 0x68, + 0x20, 0x46, 0x90, 0x47, 0x00, 0x28, 0x57, 0xd0, 0xcd, 0xe9, 0x02, 0x9a, + 0xdf, 0xf8, 0x80, 0xa1, 0xdf, 0xf8, 0x80, 0x91, 0x04, 0xaf, 0xda, 0xf8, + 0x00, 0x10, 0x20, 0x46, 0x88, 0x47, 0x4f, 0xfa, 0x80, 0xfb, 0xbb, 0xf1, + 0x00, 0x0f, 0x1c, 0xd4, 0x49, 0xd1, 0xd9, 0xf8, 0x00, 0x50, 0x20, 0x46, + 0x39, 0x46, 0x01, 0x22, 0x33, 0x46, 0xa8, 0x47, 0x57, 0x48, 0x01, 0x68, + 0x20, 0x46, 0x88, 0x47, 0x30, 0xb1, 0xd9, 0xf8, 0x00, 0x50, 0x20, 0x46, + 0x39, 0x46, 0x01, 0x22, 0x33, 0x46, 0xa8, 0x47, 0x4e, 0x48, 0x31, 0x46, + 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0x00, 0x28, 0xdb, 0xd1, 0x4f, 0xf0, + 0x00, 0x0b, 0xdd, 0xe9, 0x02, 0x9a, 0x38, 0xe0, 0xd4, 0xe9, 0x05, 0x31, + 0x40, 0xf2, 0xe2, 0x42, 0xb3, 0xfb, 0xf2, 0xf7, 0x07, 0xfb, 0x12, 0x37, + 0x37, 0xb9, 0xb1, 0xfb, 0xf2, 0xf7, 0x07, 0xfb, 0x12, 0x12, 0x00, 0x2a, + 0x3f, 0xf4, 0x74, 0xaf, 0x35, 0x48, 0x36, 0x4a, 0x00, 0x91, 0x78, 0x21, + 0xea, 0xf7, 0x62, 0xff, 0x34, 0x48, 0x90, 0xf8, 0x2c, 0x01, 0x80, 0x07, + 0x04, 0xd4, 0x00, 0x27, 0x38, 0x46, 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x30, 0x48, 0x2d, 0x4a, 0x00, 0x21, 0x00, 0x27, 0x03, 0x68, 0x02, 0x20, + 0x98, 0x47, 0xf3, 0xe7, 0x4f, 0xf0, 0x00, 0x0b, 0x0d, 0xe0, 0xbd, 0xf8, + 0x10, 0x00, 0xdd, 0xf8, 0x0c, 0xa0, 0x30, 0xb9, 0xd9, 0xf8, 0x00, 0x70, + 0x04, 0xa9, 0x20, 0x46, 0x01, 0x22, 0x33, 0x46, 0xb8, 0x47, 0xdd, 0xf8, + 0x08, 0x90, 0xbd, 0xf8, 0x10, 0x00, 0x40, 0xb1, 0x2c, 0x48, 0x04, 0xa9, + 0x00, 0x22, 0x33, 0x46, 0x05, 0x68, 0x20, 0x46, 0xa8, 0x47, 0x01, 0x27, + 0x00, 0xe0, 0x00, 0x27, 0x06, 0x98, 0xed, 0xf7, 0x75, 0xfb, 0x20, 0x89, + 0x40, 0xf2, 0xe2, 0x41, 0x5f, 0xfa, 0x8b, 0xf6, 0x16, 0x4d, 0x26, 0x4b, + 0x26, 0x4a, 0x00, 0x2f, 0x01, 0xfb, 0x00, 0xf0, 0x4f, 0xf0, 0x78, 0x01, + 0xcd, 0xe9, 0x00, 0x06, 0x20, 0x48, 0x08, 0xbf, 0x03, 0x46, 0x28, 0x46, + 0xea, 0xf7, 0x1a, 0xff, 0x10, 0x48, 0x90, 0xf8, 0x2c, 0x01, 0x80, 0x07, + 0x05, 0xd5, 0x0f, 0x48, 0x02, 0x21, 0x2a, 0x46, 0x03, 0x68, 0x02, 0x20, + 0x98, 0x47, 0x1b, 0x4a, 0x20, 0x89, 0x00, 0x21, 0x0c, 0x23, 0x50, 0x60, + 0x19, 0x48, 0x17, 0x60, 0x96, 0x60, 0x04, 0x68, 0x40, 0xf2, 0x36, 0x20, + 0xa0, 0x47, 0x88, 0xf8, 0x01, 0xa0, 0x88, 0xf8, 0x00, 0x90, 0xa1, 0xe7, + 0xe8, 0x65, 0x08, 0x00, 0xff, 0x6a, 0x01, 0x00, 0xb5, 0xa0, 0x03, 0x00, + 0x8c, 0x7e, 0x08, 0x00, 0x70, 0x9b, 0x08, 0x00, 0xec, 0xa0, 0x03, 0x00, + 0xe8, 0xa0, 0x03, 0x00, 0xf0, 0xa0, 0x03, 0x00, 0xd4, 0x9b, 0x08, 0x00, + 0xc0, 0x58, 0x01, 0x00, 0x78, 0xc8, 0x08, 0x00, 0xd8, 0x0d, 0x01, 0x00, + 0x94, 0xc8, 0x08, 0x00, 0x98, 0xc8, 0x08, 0x00, 0x9c, 0xc8, 0x08, 0x00, + 0xa0, 0xc8, 0x08, 0x00, 0x1c, 0xa1, 0x03, 0x00, 0x17, 0xa1, 0x03, 0x00, + 0x21, 0xa1, 0x03, 0x00, 0x8c, 0x34, 0x01, 0x00, 0x78, 0x9b, 0x08, 0x00, + 0x1c, 0xb5, 0x0c, 0x46, 0x00, 0x21, 0xcd, 0xe9, 0x00, 0x11, 0x40, 0x6b, + 0xc0, 0xb1, 0x50, 0xf8, 0x04, 0x2f, 0x69, 0x46, 0xf8, 0xf7, 0x86, 0xf9, + 0x00, 0xf0, 0x05, 0x00, 0x05, 0x28, 0x0f, 0xd1, 0x9d, 0xf8, 0x07, 0x10, + 0x48, 0x1e, 0x01, 0x28, 0x0a, 0xd8, 0x9d, 0xf8, 0x05, 0x00, 0x02, 0x28, + 0x06, 0xd1, 0x9d, 0xf8, 0x04, 0x00, 0x06, 0x28, 0x02, 0xd1, 0x1c, 0xb1, + 0x07, 0x20, 0x1c, 0xbd, 0x0a, 0x20, 0x1c, 0xbd, 0x05, 0x20, 0x02, 0x29, + 0x08, 0xbf, 0x07, 0x20, 0x1c, 0xbd, 0x00, 0xbf, 0x70, 0xb5, 0x60, 0xb1, + 0x04, 0x46, 0x16, 0x48, 0x0e, 0x46, 0x01, 0x68, 0x4e, 0xb1, 0x94, 0xf8, + 0x3a, 0x01, 0x88, 0x47, 0x0a, 0x28, 0x10, 0xd1, 0x94, 0xf8, 0x3a, 0x01, + 0x08, 0xe0, 0x00, 0x25, 0x13, 0xe0, 0x94, 0xf8, 0x3b, 0x01, 0x88, 0x47, + 0x0a, 0x28, 0x10, 0xd1, 0x94, 0xf8, 0x3b, 0x01, 0x0c, 0x49, 0x08, 0x5c, + 0x0c, 0x49, 0x0d, 0x5c, 0x07, 0xe0, 0x05, 0x46, 0x20, 0x46, 0x31, 0x46, + 0xff, 0xf7, 0xb6, 0xff, 0x0a, 0x28, 0x18, 0xbf, 0x05, 0x46, 0x28, 0x46, + 0x70, 0xbd, 0x05, 0x46, 0x20, 0x46, 0x00, 0x21, 0xff, 0xf7, 0xac, 0xff, + 0x0a, 0x28, 0x08, 0xbf, 0x28, 0x46, 0x70, 0xbd, 0x50, 0xce, 0x08, 0x00, + 0xd7, 0x5b, 0x07, 0x10, 0xcd, 0x0d, 0x01, 0x00, 0xb0, 0xb5, 0x05, 0x46, + 0x28, 0x48, 0x0c, 0x46, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x48, 0xb1, + 0x28, 0x46, 0x21, 0x46, 0x00, 0xf0, 0xc4, 0xfb, 0x24, 0x49, 0x4a, 0x7a, + 0xd2, 0x07, 0x00, 0xd0, 0x10, 0xb1, 0xb0, 0xbd, 0x0d, 0x20, 0xb0, 0xbd, + 0x94, 0xf8, 0x4a, 0x21, 0x04, 0x20, 0x94, 0xf8, 0x40, 0x31, 0x04, 0x25, + 0x04, 0x2a, 0x38, 0xbf, 0x10, 0x46, 0x08, 0x44, 0x80, 0x7a, 0x98, 0x42, + 0x2f, 0xd2, 0x05, 0x2a, 0x1a, 0x4a, 0x4f, 0xf0, 0x03, 0x01, 0x84, 0xf8, + 0x40, 0x01, 0x38, 0xbf, 0x02, 0x21, 0x12, 0x68, 0x90, 0x47, 0x94, 0xf8, + 0x4a, 0x11, 0x84, 0xf8, 0x41, 0x01, 0x04, 0x29, 0x38, 0xbf, 0x0d, 0x46, + 0xd4, 0xf8, 0x00, 0x01, 0x94, 0xf8, 0x40, 0x21, 0x02, 0x29, 0x00, 0xeb, + 0xc5, 0x03, 0x83, 0xf8, 0xbc, 0x23, 0x14, 0xd3, 0x04, 0x29, 0x12, 0xd8, + 0x03, 0xf5, 0x6f, 0x71, 0x80, 0xf8, 0xd4, 0x23, 0x90, 0xf8, 0xd3, 0x33, + 0x90, 0xf8, 0xcb, 0x23, 0x09, 0x78, 0x43, 0xf0, 0x40, 0x03, 0x80, 0xf8, + 0xcc, 0x13, 0x42, 0xf0, 0x40, 0x01, 0x80, 0xf8, 0xd3, 0x33, 0x80, 0xf8, + 0xcb, 0x13, 0x00, 0x20, 0xb0, 0xbd, 0x00, 0xbf, 0x5c, 0xb5, 0x08, 0x00, + 0xcc, 0x2c, 0x06, 0x00, 0x34, 0x9c, 0x08, 0x00, 0x10, 0xb5, 0x04, 0x46, + 0x38, 0xb3, 0xe6, 0x48, 0x94, 0xf8, 0x1d, 0x11, 0x00, 0x68, 0xc1, 0xeb, + 0x01, 0x11, 0x00, 0xeb, 0x41, 0x10, 0x90, 0xf8, 0xc0, 0x10, 0x01, 0x29, + 0x0b, 0xd8, 0x41, 0x78, 0x0f, 0x48, 0x02, 0x78, 0x8a, 0x42, 0x06, 0xd1, + 0x0e, 0x49, 0x00, 0x22, 0x0a, 0x60, 0xff, 0x21, 0x01, 0x70, 0x0d, 0x48, + 0x02, 0x70, 0xd4, 0xf8, 0x20, 0x02, 0x20, 0xb1, 0xed, 0xf7, 0x42, 0xfa, + 0x00, 0x20, 0xc4, 0xf8, 0x20, 0x02, 0xd4, 0xf8, 0x24, 0x02, 0x20, 0xb1, + 0xed, 0xf7, 0x3a, 0xfa, 0x00, 0x20, 0xc4, 0xf8, 0x24, 0x02, 0x20, 0x46, + 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, 0x4c, 0xbb, 0x41, 0xd3, 0x05, 0x00, + 0xec, 0xe5, 0x05, 0x00, 0x74, 0xe5, 0x05, 0x00, 0xb0, 0xb5, 0xb0, 0xb1, + 0x05, 0x46, 0x90, 0xf8, 0x1c, 0x01, 0x90, 0xb1, 0x0c, 0x46, 0xd5, 0xf8, + 0x00, 0x11, 0x91, 0xf8, 0x8a, 0x20, 0xd2, 0x06, 0x0b, 0xd4, 0xc6, 0x4a, + 0x95, 0xf8, 0x1d, 0x31, 0xc3, 0xeb, 0x03, 0x13, 0x12, 0x68, 0x5b, 0x01, + 0xd2, 0x5c, 0x01, 0x2a, 0x03, 0xd1, 0x01, 0x28, 0x08, 0xd0, 0x00, 0x20, + 0xb0, 0xbd, 0x02, 0x28, 0x04, 0xd1, 0x91, 0xf8, 0x35, 0x11, 0x53, 0x20, + 0xed, 0xf7, 0xf2, 0xf9, 0x28, 0x46, 0x21, 0x46, 0xbd, 0xe8, 0xb0, 0x40, + 0x00, 0xf0, 0x24, 0xbb, 0x2d, 0xe9, 0xf0, 0x4f, 0x89, 0xb0, 0x81, 0x46, + 0x00, 0x89, 0x00, 0x28, 0x00, 0xf0, 0x3c, 0x81, 0xb4, 0x4f, 0x99, 0xf8, + 0x01, 0x10, 0x38, 0x68, 0xc1, 0xeb, 0x01, 0x11, 0x00, 0xeb, 0x41, 0x10, + 0x00, 0xf5, 0xea, 0x72, 0x90, 0xf8, 0xd5, 0x11, 0x12, 0xf8, 0x02, 0x3b, + 0x43, 0xea, 0x01, 0x21, 0x13, 0x78, 0x52, 0x78, 0x43, 0xea, 0x02, 0x22, + 0x41, 0xea, 0x02, 0x44, 0x00, 0xf5, 0xe8, 0x70, 0x84, 0x42, 0x00, 0xf0, + 0x23, 0x81, 0xa8, 0x4d, 0xa4, 0xf1, 0xf8, 0x0b, 0x01, 0x21, 0x58, 0x46, + 0x2a, 0x68, 0x90, 0x47, 0x2a, 0x68, 0x08, 0x90, 0x58, 0x46, 0x00, 0x21, + 0x90, 0x47, 0x94, 0xf8, 0x25, 0x10, 0x86, 0x46, 0x38, 0x68, 0xcd, 0xf8, + 0x1c, 0xe0, 0xc1, 0xeb, 0x01, 0x11, 0x00, 0xeb, 0x41, 0x10, 0xd0, 0xf8, + 0xa0, 0x10, 0x49, 0x7f, 0x31, 0xb1, 0x80, 0x69, 0xb0, 0xb3, 0xe0, 0x8f, + 0xa0, 0xb3, 0xb4, 0xf8, 0x3c, 0x80, 0x06, 0xe0, 0x40, 0x69, 0x78, 0xb3, + 0xb4, 0xf8, 0x3c, 0x80, 0xb8, 0xf1, 0x00, 0x0f, 0x2a, 0xd0, 0x95, 0x48, + 0x08, 0x99, 0xd9, 0xf8, 0x14, 0x50, 0xb9, 0xf8, 0x08, 0x60, 0x02, 0x68, + 0x01, 0x20, 0x90, 0x47, 0x40, 0xf2, 0xe2, 0x41, 0x6b, 0x1e, 0x06, 0xfb, + 0x01, 0xf2, 0x99, 0xf8, 0x21, 0x60, 0x99, 0x18, 0xb1, 0xfb, 0xf5, 0xf1, + 0xce, 0xb1, 0x02, 0xfb, 0x08, 0x32, 0xb2, 0xfb, 0xf5, 0xf2, 0x02, 0xeb, + 0xc1, 0x01, 0x4f, 0xf0, 0xff, 0x32, 0x12, 0xfa, 0x81, 0xf2, 0x89, 0xb2, + 0x81, 0x42, 0x38, 0xbf, 0x08, 0x46, 0x11, 0x18, 0x91, 0xfb, 0xf0, 0xf6, + 0x52, 0xfa, 0x86, 0xf0, 0xf1, 0xb2, 0x90, 0xfb, 0xf1, 0xf5, 0x10, 0xe0, + 0x00, 0x26, 0x00, 0x25, 0x0f, 0xe0, 0xa2, 0x8f, 0x89, 0xb2, 0x82, 0x42, + 0x38, 0xbf, 0x10, 0x46, 0x01, 0x3a, 0x13, 0x18, 0x93, 0xfb, 0xf0, 0xf0, + 0x02, 0x44, 0x00, 0xfb, 0x01, 0xf6, 0x92, 0xfb, 0xf0, 0xf5, 0xdd, 0xf8, + 0x1c, 0xe0, 0x9b, 0xf8, 0x1d, 0x11, 0x38, 0x68, 0xc1, 0xeb, 0x01, 0x11, + 0x00, 0xeb, 0x41, 0x10, 0xd0, 0xf8, 0xa0, 0x10, 0x49, 0x7f, 0x31, 0xb1, + 0x40, 0x69, 0xb8, 0xb3, 0xa0, 0x8f, 0xa8, 0xb3, 0xb4, 0xf8, 0x3e, 0xa0, + 0x06, 0xe0, 0x80, 0x69, 0x80, 0xb3, 0xb4, 0xf8, 0x3e, 0xa0, 0xba, 0xf1, + 0x00, 0x0f, 0x2b, 0xd0, 0x69, 0x48, 0xa8, 0x46, 0x37, 0x46, 0xd9, 0xf8, + 0x18, 0x50, 0xb9, 0xf8, 0x08, 0x60, 0x71, 0x46, 0x02, 0x68, 0x00, 0x20, + 0x90, 0x47, 0x40, 0xf2, 0xe2, 0x41, 0x6b, 0x1e, 0x71, 0x43, 0x99, 0xf8, + 0x21, 0x60, 0x5a, 0x18, 0xb2, 0xfb, 0xf5, 0xf2, 0xce, 0xb1, 0x01, 0xfb, + 0x0a, 0x31, 0xb1, 0xfb, 0xf5, 0xf1, 0x01, 0xeb, 0xc2, 0x01, 0x4f, 0xf0, + 0xff, 0x32, 0x12, 0xfa, 0x81, 0xf2, 0x89, 0xb2, 0x81, 0x42, 0x38, 0xbf, + 0x08, 0x46, 0x11, 0x18, 0x91, 0xfb, 0xf0, 0xf0, 0x52, 0xfa, 0x80, 0xf1, + 0xc2, 0xb2, 0x91, 0xfb, 0xf2, 0xf1, 0x0f, 0xe0, 0x00, 0x20, 0x00, 0x21, + 0x10, 0xe0, 0xe1, 0x8f, 0x92, 0xb2, 0x81, 0x42, 0x38, 0xbf, 0x08, 0x46, + 0x01, 0x39, 0x0b, 0x18, 0x93, 0xfb, 0xf0, 0xf0, 0x01, 0x44, 0x91, 0xfb, + 0xf0, 0xf1, 0x50, 0x43, 0xdd, 0xf8, 0x1c, 0xe0, 0x3e, 0x46, 0x45, 0x46, + 0x99, 0xf8, 0x00, 0x20, 0x02, 0xf0, 0xfe, 0x03, 0x02, 0x2b, 0x06, 0xd1, + 0xc3, 0xb2, 0x07, 0x2b, 0x00, 0xf2, 0x80, 0x80, 0xf3, 0xb2, 0x07, 0x2b, + 0x7c, 0xd8, 0x01, 0x2a, 0x05, 0xd8, 0xc2, 0xb2, 0x0f, 0x2a, 0x77, 0xd8, + 0xf2, 0xb2, 0x0f, 0x2a, 0x74, 0xd8, 0x1f, 0xfa, 0x81, 0xfa, 0x08, 0x99, + 0xe7, 0x4a, 0xaf, 0xb2, 0x5f, 0xfa, 0x80, 0xf8, 0xf5, 0xb2, 0x01, 0x23, + 0xa8, 0x45, 0x8d, 0xe8, 0x82, 0x01, 0x4f, 0xf0, 0x01, 0x01, 0xd2, 0xf8, + 0x00, 0xc0, 0x2a, 0x46, 0xcd, 0xe9, 0x03, 0x1e, 0xcd, 0xe9, 0x05, 0xa1, + 0x38, 0xbf, 0x30, 0x46, 0xc6, 0xb2, 0x58, 0x46, 0x31, 0x46, 0xe0, 0x47, + 0x9b, 0xf8, 0x1e, 0x11, 0xb9, 0xf8, 0x08, 0x00, 0x31, 0x4a, 0xcd, 0xe9, + 0x00, 0x16, 0x40, 0xf2, 0xe2, 0x41, 0xcd, 0xe9, 0x02, 0x58, 0xcd, 0xe9, + 0x04, 0x7a, 0x00, 0xfb, 0x01, 0xf3, 0x2b, 0x48, 0x78, 0x21, 0xea, 0xf7, + 0x99, 0xfc, 0x64, 0x48, 0x90, 0xf8, 0x2c, 0x01, 0x80, 0x07, 0x05, 0xd5, + 0x28, 0x48, 0x26, 0x4a, 0x01, 0x21, 0x03, 0x68, 0x02, 0x20, 0x98, 0x47, + 0x14, 0xf8, 0x04, 0x0f, 0x9a, 0x4f, 0x61, 0x78, 0xa2, 0x78, 0xe3, 0x78, + 0x40, 0xea, 0x01, 0x20, 0x42, 0xea, 0x03, 0x21, 0x40, 0xea, 0x01, 0x44, + 0x99, 0xf8, 0x01, 0x10, 0x38, 0x68, 0xc1, 0xeb, 0x01, 0x11, 0x00, 0xeb, + 0x41, 0x10, 0xd9, 0xe6, 0x00, 0x25, 0x26, 0xe0, 0x99, 0xf8, 0x00, 0x00, + 0x00, 0xf0, 0xfe, 0x00, 0x02, 0x28, 0x05, 0xd1, 0x00, 0x20, 0x89, 0xf8, + 0xe2, 0x00, 0x01, 0x20, 0xa9, 0xf8, 0xe0, 0x00, 0x15, 0x48, 0x99, 0xf8, + 0x03, 0x10, 0x02, 0x68, 0x48, 0x46, 0x90, 0x47, 0x01, 0x46, 0x13, 0x48, + 0xff, 0x22, 0x03, 0x68, 0x48, 0x46, 0x98, 0x47, 0x05, 0x46, 0x11, 0x4a, + 0xb9, 0xf8, 0x08, 0x00, 0x00, 0x21, 0x08, 0x23, 0xc2, 0xe9, 0x00, 0x05, + 0x0e, 0x48, 0x04, 0x68, 0x4f, 0xf4, 0x0c, 0x70, 0xa0, 0x47, 0x00, 0xe0, + 0x84, 0x25, 0x28, 0x46, 0x09, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0xbf, + 0xe0, 0x35, 0x01, 0x00, 0x68, 0xc8, 0x08, 0x00, 0x6c, 0xc8, 0x08, 0x00, + 0xff, 0x6a, 0x01, 0x00, 0x5e, 0xa1, 0x03, 0x00, 0x70, 0x9b, 0x08, 0x00, + 0x04, 0xb6, 0x08, 0x00, 0x0c, 0xb6, 0x08, 0x00, 0x8c, 0x34, 0x01, 0x00, + 0x78, 0x9b, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x41, 0x04, 0x46, 0x90, 0xf8, + 0x20, 0x01, 0x94, 0xf8, 0x46, 0x11, 0x94, 0xf8, 0x50, 0x21, 0x91, 0x42, + 0x38, 0xbf, 0x11, 0x46, 0x40, 0x1a, 0x84, 0xf8, 0xb1, 0x01, 0x00, 0x06, + 0x41, 0xd0, 0x68, 0x4f, 0x94, 0xf8, 0x1d, 0x11, 0xdf, 0xf8, 0xa4, 0x80, + 0x38, 0x68, 0xc1, 0xeb, 0x01, 0x11, 0x98, 0xf8, 0xfa, 0x62, 0x00, 0xeb, + 0x41, 0x10, 0x05, 0x89, 0xe7, 0xf7, 0xea, 0xf9, 0x94, 0xf8, 0x1d, 0x11, + 0xc4, 0xf8, 0xa4, 0x01, 0x38, 0x68, 0xc1, 0xeb, 0x01, 0x11, 0x00, 0xeb, + 0x41, 0x10, 0x27, 0x49, 0x40, 0x78, 0x49, 0x68, 0xc0, 0xeb, 0xc0, 0x00, + 0x01, 0xeb, 0x80, 0x00, 0xd0, 0xe9, 0x04, 0x10, 0x81, 0x42, 0x38, 0xbf, + 0x01, 0x46, 0x1f, 0x29, 0x21, 0xd3, 0x00, 0x20, 0x0a, 0x21, 0x02, 0x22, + 0xc4, 0xf8, 0x40, 0x02, 0x30, 0x01, 0xb0, 0xfb, 0xf1, 0xf0, 0x05, 0xf0, + 0x7f, 0x01, 0x89, 0x00, 0x81, 0x42, 0x88, 0xbf, 0x01, 0x22, 0x94, 0xf8, + 0x20, 0x01, 0x94, 0xf8, 0x46, 0x11, 0x94, 0xf8, 0x50, 0x31, 0x84, 0xf8, + 0x38, 0x22, 0x50, 0x43, 0x99, 0x42, 0x38, 0xbf, 0x19, 0x46, 0x40, 0x1a, + 0x0f, 0xe0, 0x4f, 0xf0, 0xff, 0x30, 0xc4, 0xf8, 0xa4, 0x01, 0xbd, 0xe8, + 0xf0, 0x81, 0x69, 0x00, 0x98, 0xf8, 0xfa, 0x02, 0xc9, 0xb2, 0xb0, 0xfb, + 0xf1, 0xf0, 0x94, 0xf8, 0xb1, 0x11, 0x48, 0x43, 0x02, 0x30, 0x84, 0xf8, + 0xb2, 0x01, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0xbf, 0x8c, 0x7e, 0x08, 0x00, + 0x80, 0xb5, 0x00, 0xf0, 0x37, 0xf9, 0x40, 0xb1, 0x04, 0x49, 0x42, 0x78, + 0x49, 0x68, 0xc2, 0xeb, 0xc2, 0x02, 0x01, 0xeb, 0x82, 0x01, 0x00, 0x22, + 0x0a, 0x76, 0x80, 0xbd, 0xec, 0xe5, 0x05, 0x00, 0xb0, 0xb5, 0x60, 0xb3, + 0xd0, 0xf8, 0x00, 0x11, 0x04, 0x46, 0xd1, 0xf8, 0xd4, 0x00, 0x40, 0x7f, + 0x48, 0xb9, 0x91, 0xf8, 0x34, 0x03, 0x40, 0x07, 0x05, 0xd4, 0x2e, 0x48, + 0x00, 0x22, 0x01, 0x23, 0x05, 0x68, 0x16, 0x20, 0xa8, 0x47, 0x2a, 0x48, + 0x94, 0xf8, 0x1d, 0x11, 0x00, 0x68, 0xc1, 0xeb, 0x01, 0x11, 0x00, 0xeb, + 0x41, 0x10, 0xd0, 0xf8, 0xec, 0x00, 0x20, 0xb1, 0xd0, 0xf8, 0x00, 0x01, + 0xd0, 0xf8, 0x00, 0x04, 0x50, 0xb9, 0xd4, 0xf8, 0x00, 0x01, 0x90, 0xf8, + 0x38, 0x00, 0x03, 0x28, 0x04, 0xd1, 0x20, 0x46, 0xbd, 0xe8, 0xb0, 0x40, + 0x00, 0xf0, 0x02, 0xb9, 0xb0, 0xbd, 0x00, 0x20, 0x40, 0xf6, 0x1b, 0x31, + 0xbd, 0xe8, 0xb0, 0x40, 0xec, 0xf7, 0xb0, 0xbf, 0xb0, 0xb5, 0x88, 0xb1, + 0x04, 0x46, 0x17, 0x48, 0x94, 0xf8, 0x1d, 0x11, 0x02, 0x68, 0xc1, 0xeb, + 0x01, 0x11, 0x02, 0xeb, 0x41, 0x12, 0x52, 0xf8, 0xf0, 0x3f, 0x4b, 0xb1, + 0xd3, 0xf8, 0x00, 0x31, 0xd3, 0xf8, 0xfc, 0x33, 0x23, 0xb1, 0xb0, 0xbd, + 0x00, 0x20, 0x40, 0xf6, 0x41, 0x31, 0x11, 0xe0, 0x14, 0x60, 0x00, 0x22, + 0x01, 0x23, 0x00, 0x68, 0x00, 0xeb, 0x41, 0x10, 0xd4, 0xf8, 0x00, 0x11, + 0xc1, 0xf8, 0xfc, 0x03, 0x08, 0x48, 0x05, 0x68, 0x3a, 0x20, 0xa8, 0x47, + 0x30, 0xb1, 0x00, 0x20, 0x40, 0xf6, 0x55, 0x31, 0xbd, 0xe8, 0xb0, 0x40, + 0xec, 0xf7, 0x82, 0xbf, 0x03, 0x20, 0x84, 0xf8, 0x1c, 0x01, 0xb0, 0xbd, + 0xe0, 0x35, 0x01, 0x00, 0x80, 0x9b, 0x08, 0x00, 0x03, 0x49, 0x09, 0x78, + 0x11, 0xb1, 0x03, 0x49, 0x09, 0x68, 0x08, 0x47, 0x00, 0xf0, 0xc2, 0xb8, + 0xc0, 0xf0, 0x05, 0x00, 0x5c, 0xb5, 0x08, 0x00, 0x1e, 0x48, 0x1f, 0x49, + 0x01, 0x60, 0x1f, 0x48, 0x1f, 0x49, 0x01, 0x60, 0x1f, 0x48, 0x20, 0x49, + 0x01, 0x60, 0x20, 0x48, 0x20, 0x49, 0x01, 0x60, 0x20, 0x48, 0x21, 0x49, + 0x01, 0x60, 0x21, 0x48, 0x21, 0x49, 0x01, 0x60, 0x21, 0x48, 0x22, 0x49, + 0x01, 0x60, 0x22, 0x48, 0x22, 0x49, 0x01, 0x60, 0x22, 0x48, 0x23, 0x49, + 0x01, 0x60, 0x23, 0x48, 0x23, 0x49, 0x01, 0x60, 0x23, 0x48, 0x24, 0x49, + 0x01, 0x60, 0x24, 0x48, 0x24, 0x49, 0x01, 0x60, 0x24, 0x48, 0x25, 0x49, + 0x01, 0x60, 0x25, 0x48, 0x25, 0x49, 0x01, 0x60, 0x25, 0x48, 0x26, 0x49, + 0x01, 0x60, 0x26, 0x48, 0x26, 0x49, 0x01, 0x60, 0x26, 0x48, 0x27, 0x49, + 0x01, 0x60, 0x27, 0x48, 0x27, 0x49, 0x01, 0x60, 0x27, 0x48, 0x28, 0x49, + 0x01, 0x60, 0x28, 0x48, 0x28, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0x70, 0xc7, 0x08, 0x00, 0xb1, 0x83, 0x03, 0x00, 0xbc, 0x8e, 0x08, 0x00, + 0x1d, 0x8d, 0x03, 0x00, 0x94, 0xc8, 0x08, 0x00, 0xad, 0x88, 0x03, 0x00, + 0x88, 0xc7, 0x08, 0x00, 0x31, 0x89, 0x03, 0x00, 0x80, 0xc7, 0x08, 0x00, + 0x05, 0x8b, 0x03, 0x00, 0x08, 0xb6, 0x08, 0x00, 0x25, 0x90, 0x03, 0x00, + 0x5c, 0xc8, 0x08, 0x00, 0x95, 0x90, 0x03, 0x00, 0x74, 0xc7, 0x08, 0x00, + 0x15, 0x94, 0x03, 0x00, 0x7c, 0xc7, 0x08, 0x00, 0x55, 0x94, 0x03, 0x00, + 0xc4, 0x8e, 0x08, 0x00, 0x85, 0x97, 0x03, 0x00, 0xd0, 0xc4, 0x08, 0x00, + 0x8d, 0x8e, 0x03, 0x00, 0x68, 0xc8, 0x08, 0x00, 0x19, 0x97, 0x03, 0x00, + 0xb0, 0x8e, 0x08, 0x00, 0x39, 0x98, 0x03, 0x00, 0x8c, 0xc7, 0x08, 0x00, + 0xa5, 0x98, 0x03, 0x00, 0x98, 0xc8, 0x08, 0x00, 0xf5, 0x98, 0x03, 0x00, + 0x8c, 0xc8, 0x08, 0x00, 0x01, 0x9c, 0x03, 0x00, 0xcc, 0x8e, 0x08, 0x00, + 0xd5, 0x9c, 0x03, 0x00, 0x84, 0xc8, 0x08, 0x00, 0xf5, 0x9c, 0x03, 0x00, + 0x88, 0xc8, 0x08, 0x00, 0x61, 0x9d, 0x03, 0x00, 0x58, 0xc8, 0x08, 0x00, + 0xcd, 0x9d, 0x03, 0x00, 0x42, 0xf2, 0x5d, 0x3c, 0xc1, 0xf2, 0x08, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4f, 0xf2, 0xa5, 0x4c, 0xc1, 0xf2, 0x07, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4f, 0xf6, 0x61, 0x4c, 0xc1, 0xf2, 0x07, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4f, 0xf6, 0x79, 0x6c, 0xc1, 0xf2, 0x07, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4f, 0xf2, 0x15, 0x3c, 0xc1, 0xf2, 0x07, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4f, 0xf6, 0xb5, 0x7c, 0xc1, 0xf2, 0x07, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x42, 0xf6, 0x19, 0x6c, 0xc1, 0xf2, 0x08, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4f, 0xf6, 0xd9, 0x1c, 0xc1, 0xf2, 0x07, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x40, 0xf2, 0x81, 0x2c, 0xc1, 0xf2, 0x08, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x49, 0x53, 0x4f, 0x28, 0x4d, 0x29, 0x20, 0x31, + 0x73, 0x74, 0x20, 0x72, 0x65, 0x66, 0x3a, 0x20, 0x6d, 0x69, 0x6e, 0x3a, + 0x25, 0x64, 0x20, 0x6d, 0x61, 0x78, 0x3a, 0x25, 0x64, 0x00, 0x49, 0x53, + 0x4f, 0x28, 0x4d, 0x29, 0x20, 0x31, 0x73, 0x74, 0x20, 0x72, 0x65, 0x66, + 0x20, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x29, 0x3a, 0x20, 0x6d, 0x69, 0x6e, + 0x3a, 0x25, 0x64, 0x20, 0x6d, 0x61, 0x78, 0x3a, 0x25, 0x64, 0x00, 0x49, + 0x53, 0x4f, 0x28, 0x4d, 0x29, 0x20, 0x43, 0x49, 0x44, 0x3a, 0x25, 0x64, + 0x2c, 0x20, 0x65, 0x43, 0x6c, 0x6b, 0x3a, 0x30, 0x78, 0x25, 0x78, 0x2c, + 0x20, 0x73, 0x43, 0x6c, 0x6b, 0x3a, 0x30, 0x78, 0x25, 0x78, 0x00, 0x50, + 0x43, 0x6f, 0x6e, 0x76, 0x3a, 0x20, 0x69, 0x73, 0x42, 0x65, 0x74, 0x74, + 0x65, 0x72, 0x53, 0x65, 0x74, 0x20, 0x28, 0x46, 0x41, 0x4c, 0x53, 0x45, + 0x29, 0x20, 0x49, 0x53, 0x4f, 0x5f, 0x69, 0x6e, 0x74, 0x3d, 0x25, 0x64, + 0x2c, 0x20, 0x4f, 0x6c, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x3d, 0x25, 0x64, + 0x2c, 0x20, 0x6e, 0x65, 0x77, 0x3d, 0x25, 0x64, 0x2c, 0x20, 0x6f, 0x6c, + 0x64, 0x3d, 0x25, 0x64, 0x2c, 0x00, 0x49, 0x53, 0x4f, 0x3a, 0x20, 0x53, + 0x74, 0x28, 0x25, 0x64, 0x29, 0x20, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x20, 0x6e, 0x75, 0x6d, 0x3a, 0x25, 0x64, 0x20, 0x53, 0x49, 0x44, 0x3a, + 0x25, 0x64, 0x20, 0x43, 0x49, 0x44, 0x3a, 0x25, 0x64, 0x00, 0x49, 0x53, + 0x4f, 0x3a, 0x20, 0x53, 0x20, 0x63, 0x68, 0x6b, 0x20, 0x52, 0x65, 0x6d, + 0x20, 0x6d, 0x69, 0x6e, 0x2f, 0x6d, 0x61, 0x78, 0x3a, 0x25, 0x64, 0x2f, + 0x25, 0x64, 0x00, 0x49, 0x53, 0x4f, 0x3a, 0x20, 0x53, 0x20, 0x73, 0x6b, + 0x69, 0x70, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x20, 0x52, 0x4f, 0x66, 0x66, + 0x00, 0x49, 0x53, 0x4f, 0x3a, 0x20, 0x53, 0x20, 0x63, 0x68, 0x6b, 0x20, + 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x44, 0x6f, 0x66, 0x66, 0x3a, 0x20, + 0x25, 0x64, 0x2f, 0x25, 0x64, 0x2c, 0x20, 0x72, 0x65, 0x66, 0x4f, 0x66, + 0x66, 0x3a, 0x25, 0x64, 0x2f, 0x25, 0x64, 0x00, 0x49, 0x53, 0x4f, 0x28, + 0x53, 0x29, 0x3a, 0x20, 0x4e, 0x6f, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x21, 0x00, 0x43, 0x6f, 0x6e, + 0x76, 0x20, 0x65, 0x72, 0x72, 0x2c, 0x20, 0x53, 0x44, 0x55, 0x20, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x20, 0x76, 0x69, 0x6f, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x25, 0x64, 0x2f, 0x25, 0x64, 0x20, + 0x69, 0x6e, 0x20, 0x55, 0x4e, 0x46, 0x52, 0x41, 0x4d, 0x45, 0x44, 0x00, + 0x42, 0x49, 0x47, 0x00, 0x43, 0x49, 0x47, 0x00, 0x50, 0x43, 0x6f, 0x6e, + 0x76, 0x3a, 0x20, 0x53, 0x74, 0x61, 0x72, 0x74, 0x20, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x3a, 0x20, 0x25, 0x73, 0x2c, 0x20, 0x25, 0x63, 0x00, 0x50, + 0x41, 0x53, 0x53, 0x00, 0x46, 0x41, 0x49, 0x4c, 0x00, 0x50, 0x43, 0x6f, + 0x6e, 0x76, 0x3a, 0x20, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x63, + 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, + 0x6e, 0x65, 0x20, 0x5b, 0x25, 0x73, 0x5d, 0x2c, 0x20, 0x49, 0x53, 0x4f, + 0x5f, 0x69, 0x6e, 0x74, 0x20, 0x25, 0x64, 0x3a, 0x2c, 0x20, 0x76, 0x69, + 0x6f, 0x20, 0x6d, 0x61, 0x73, 0x6b, 0x20, 0x25, 0x78, 0x00, 0x50, 0x43, + 0x6f, 0x6e, 0x76, 0x3a, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x42, 0x61, + 0x73, 0x69, 0x63, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x49, 0x53, 0x4f, + 0x5f, 0x69, 0x6e, 0x74, 0x3d, 0x25, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x20, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x28, 0x25, 0x64, 0x29, 0x3a, 0x20, + 0x4e, 0x53, 0x45, 0x3d, 0x25, 0x64, 0x2c, 0x20, 0x42, 0x4e, 0x28, 0x4d, + 0x53, 0x29, 0x3d, 0x25, 0x64, 0x2c, 0x20, 0x42, 0x4e, 0x28, 0x53, 0x4d, + 0x29, 0x3d, 0x25, 0x64, 0x2c, 0x20, 0x50, 0x4c, 0x28, 0x4d, 0x53, 0x29, + 0x3d, 0x25, 0x64, 0x2c, 0x20, 0x50, 0x4c, 0x28, 0x53, 0x4d, 0x29, 0x3d, + 0x25, 0x64, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, 0x03, 0x26, 0x05, 0x29, + 0x4f, 0xf0, 0x04, 0x05, 0x00, 0x93, 0x88, 0x46, 0x17, 0x46, 0x81, 0x46, + 0x4f, 0xf0, 0x04, 0x04, 0x38, 0xbf, 0x02, 0x26, 0x04, 0x29, 0x38, 0xbf, + 0x0d, 0x46, 0x43, 0x49, 0x00, 0xeb, 0xc5, 0x0a, 0x9a, 0xf8, 0xbc, 0x03, + 0x0a, 0x68, 0x31, 0x46, 0x90, 0x47, 0x90, 0xfb, 0xf4, 0xfb, 0x97, 0xb1, + 0x97, 0xf9, 0x00, 0x00, 0x40, 0xfa, 0x8b, 0xf1, 0x01, 0x28, 0x04, 0xdb, + 0x7f, 0x29, 0xc8, 0xbf, 0xcb, 0xf1, 0x7f, 0x00, 0x06, 0xe0, 0x6f, 0xf0, + 0x7f, 0x02, 0x11, 0xf1, 0x80, 0x0f, 0xb8, 0xbf, 0xa2, 0xeb, 0x0b, 0x00, + 0x38, 0x70, 0x35, 0x48, 0x35, 0x4c, 0x41, 0x7a, 0xc9, 0x07, 0x1a, 0xbf, + 0x28, 0x44, 0x85, 0x7a, 0xff, 0x25, 0x99, 0xf8, 0x35, 0x01, 0x68, 0x21, + 0x10, 0xfb, 0x01, 0x40, 0x00, 0x79, 0x01, 0x28, 0x04, 0xd1, 0x2f, 0x48, + 0x40, 0x7b, 0x85, 0x42, 0x01, 0xd2, 0x03, 0xe0, 0x28, 0x46, 0xff, 0x28, + 0x05, 0x46, 0x4c, 0xd0, 0xcf, 0xb1, 0x97, 0xf9, 0x00, 0x00, 0x01, 0x28, + 0x15, 0xdb, 0x29, 0x48, 0x31, 0x46, 0x02, 0x68, 0x28, 0x46, 0x90, 0x47, + 0x39, 0x78, 0x7f, 0x29, 0x04, 0xd0, 0x59, 0x44, 0x4a, 0xb2, 0x82, 0x42, + 0xb8, 0xbf, 0x08, 0x46, 0x4f, 0xfa, 0x8b, 0xf1, 0x42, 0xb2, 0x00, 0x23, + 0x8a, 0x42, 0xc8, 0xbf, 0xa0, 0xeb, 0x0b, 0x03, 0x3b, 0x70, 0x00, 0x99, + 0x41, 0xb1, 0x0a, 0xf5, 0x6f, 0x70, 0x00, 0x78, 0xa8, 0x42, 0x03, 0xd3, + 0x08, 0x78, 0x40, 0xf0, 0x02, 0x00, 0x08, 0x70, 0x99, 0xf8, 0x35, 0x01, + 0x68, 0x21, 0x10, 0xfb, 0x01, 0x40, 0x00, 0x79, 0x01, 0x28, 0x1e, 0xd1, + 0x0a, 0x98, 0xe0, 0xb1, 0x90, 0xf9, 0x00, 0x00, 0xc8, 0xb1, 0xb8, 0xf1, + 0x04, 0x0f, 0x28, 0xbf, 0x4f, 0xf0, 0x04, 0x08, 0x25, 0x23, 0x00, 0x21, + 0x42, 0x46, 0x25, 0x46, 0x00, 0x24, 0x00, 0x28, 0x48, 0x46, 0xc8, 0xbf, + 0x23, 0x23, 0x01, 0xf0, 0x05, 0xfc, 0x99, 0xf8, 0x35, 0x01, 0x68, 0x21, + 0x10, 0xfb, 0x01, 0x50, 0x00, 0xeb, 0xc8, 0x00, 0x44, 0x81, 0x04, 0x81, + 0xc4, 0x80, 0xbd, 0xe8, 0xf8, 0x8f, 0x00, 0xbf, 0x38, 0x9c, 0x08, 0x00, + 0xcc, 0x2c, 0x06, 0x00, 0xb0, 0xe6, 0x05, 0x00, 0x30, 0x32, 0x06, 0x00, + 0x34, 0x9c, 0x08, 0x00, 0x00, 0x2a, 0x08, 0xbf, 0x41, 0xf0, 0x80, 0x01, + 0x00, 0xf0, 0xd8, 0xbb, 0x10, 0xb5, 0x04, 0x46, 0x00, 0xf0, 0xda, 0xfb, + 0xe6, 0xf7, 0x7a, 0xfe, 0xb4, 0xf8, 0xdc, 0x12, 0x00, 0xeb, 0x81, 0x00, + 0x20, 0xf0, 0x70, 0x40, 0xc4, 0xf8, 0x54, 0x04, 0x10, 0xbd, 0x00, 0xbf, + 0x2d, 0xe9, 0xf0, 0x4f, 0x8d, 0xb0, 0x04, 0x46, 0x00, 0x20, 0x8d, 0xf8, + 0x32, 0x00, 0x8d, 0xf8, 0x31, 0x00, 0xd4, 0xf8, 0x1c, 0x04, 0x20, 0xb1, + 0x00, 0x7e, 0x05, 0x28, 0x01, 0xd1, 0x48, 0x79, 0xd8, 0xb1, 0x48, 0x79, + 0xdf, 0xf8, 0xc0, 0x25, 0x15, 0x5c, 0x03, 0x2d, 0x03, 0xd9, 0xdf, 0xf8, + 0xf0, 0x05, 0x20, 0x21, 0x5a, 0xe0, 0xa8, 0x1e, 0x02, 0x28, 0x05, 0xd2, + 0xdf, 0xf8, 0xac, 0x05, 0x40, 0x78, 0x00, 0x07, 0xf3, 0xd5, 0x0b, 0xe0, + 0x01, 0x2d, 0x08, 0xd1, 0xdf, 0xf8, 0x9c, 0x05, 0x40, 0x78, 0xc0, 0x07, + 0xeb, 0xd0, 0x01, 0x25, 0x02, 0xe0, 0x05, 0x25, 0x00, 0xe0, 0x00, 0x25, + 0x2f, 0x46, 0x04, 0x2d, 0x0d, 0xf1, 0x33, 0x02, 0x4f, 0xf0, 0x00, 0x03, + 0x28, 0xbf, 0x04, 0x27, 0x88, 0x79, 0xc9, 0x79, 0x04, 0xeb, 0xc7, 0x0a, + 0x05, 0x2d, 0x8d, 0xf8, 0x33, 0x00, 0x4f, 0xf0, 0x06, 0x00, 0x8a, 0xf8, + 0xbd, 0x13, 0x4f, 0xf0, 0x00, 0x01, 0x38, 0xbf, 0x04, 0x20, 0x04, 0xeb, + 0x00, 0x09, 0x9a, 0xf8, 0xbc, 0xb3, 0x00, 0x20, 0x39, 0xf8, 0x78, 0x6f, + 0x00, 0x91, 0x29, 0x46, 0x0b, 0x90, 0x20, 0x46, 0xff, 0xf7, 0xf4, 0xfe, + 0x4f, 0xf0, 0x03, 0x08, 0x05, 0x2d, 0x38, 0xbf, 0x4f, 0xf0, 0x02, 0x08, + 0x94, 0xf8, 0xe8, 0x03, 0x01, 0x28, 0x0f, 0xd1, 0x94, 0xf8, 0xe7, 0x03, + 0x04, 0xf2, 0xe3, 0x31, 0x0b, 0x91, 0x03, 0x28, 0x05, 0xd0, 0x02, 0x28, + 0x06, 0xd1, 0x00, 0x20, 0x84, 0xf8, 0xe8, 0x03, 0x0f, 0xe0, 0x00, 0x20, + 0x84, 0xf8, 0xe8, 0x03, 0x0a, 0xf2, 0xbd, 0x30, 0x00, 0x78, 0x7e, 0x28, + 0x0a, 0xd1, 0xdf, 0xf8, 0x38, 0x05, 0x1e, 0x21, 0x05, 0x68, 0x20, 0x46, + 0x23, 0x22, 0x00, 0x23, 0xa8, 0x47, 0x0d, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x30, 0xb2, 0x04, 0x21, 0x0a, 0xf5, 0x6f, 0x72, 0xdf, 0xf8, 0xe8, 0x34, + 0x90, 0xfb, 0xf1, 0xf0, 0x9d, 0xf9, 0x33, 0x10, 0xcd, 0xe9, 0x08, 0x20, + 0x18, 0x78, 0x12, 0x78, 0x82, 0x42, 0x02, 0xd1, 0xb1, 0xf1, 0xff, 0x3f, + 0x73, 0xdd, 0xdf, 0xf8, 0xd0, 0x64, 0xcd, 0xe9, 0x05, 0xb7, 0x30, 0x78, + 0x82, 0x42, 0x08, 0xd1, 0x01, 0x29, 0x2f, 0xdb, 0x00, 0x20, 0x7f, 0x26, + 0x8d, 0xf8, 0x33, 0x00, 0x01, 0x20, 0x0a, 0x90, 0xdf, 0xe1, 0x7f, 0x29, + 0x26, 0xd1, 0xdf, 0xf8, 0xb0, 0x74, 0x02, 0x21, 0x3a, 0x68, 0x90, 0x47, + 0x3a, 0x68, 0x08, 0x9f, 0x83, 0x46, 0x41, 0x46, 0x38, 0x78, 0x90, 0x47, + 0x01, 0x46, 0x30, 0x78, 0xab, 0xeb, 0x01, 0x01, 0x8d, 0xf8, 0x32, 0x10, + 0x94, 0xf8, 0xf2, 0x12, 0x38, 0x70, 0xa9, 0x42, 0x71, 0xd1, 0xdf, 0xf8, + 0x88, 0x14, 0x84, 0xf8, 0x74, 0x00, 0x0a, 0x68, 0x41, 0x46, 0x90, 0x47, + 0x04, 0x21, 0xa9, 0xf8, 0x00, 0x00, 0x00, 0x22, 0x90, 0xfb, 0xf1, 0xf0, + 0x94, 0xf8, 0x3a, 0x10, 0x09, 0x90, 0x1b, 0xe1, 0x94, 0xf8, 0xf2, 0x02, + 0x00, 0x29, 0x40, 0xd0, 0xa8, 0x42, 0x4d, 0xd1, 0xb9, 0xf9, 0x00, 0x00, + 0x04, 0x22, 0x00, 0x23, 0x4f, 0xf0, 0x00, 0x0b, 0x90, 0xfb, 0xf2, 0xf6, + 0x00, 0x22, 0x88, 0x19, 0xdf, 0xf8, 0x54, 0x14, 0x40, 0xb2, 0x0f, 0x68, + 0x41, 0x46, 0xb8, 0x47, 0x07, 0x46, 0xdf, 0xf8, 0x34, 0x04, 0x41, 0x46, + 0x02, 0x68, 0x38, 0x46, 0x90, 0x47, 0x08, 0x99, 0x80, 0x1b, 0x8d, 0xf8, + 0x32, 0x00, 0x08, 0x78, 0x87, 0x42, 0xdf, 0xf8, 0x20, 0x04, 0x14, 0xbf, + 0x0f, 0x70, 0x8d, 0xf8, 0x32, 0xb0, 0x41, 0x46, 0x84, 0xf8, 0x74, 0x70, + 0x02, 0x68, 0x38, 0x46, 0x90, 0x47, 0x04, 0x21, 0xa9, 0xf8, 0x00, 0x00, + 0x06, 0x9f, 0x90, 0xfb, 0xf1, 0xf0, 0x00, 0x21, 0x0a, 0x91, 0x09, 0x90, + 0x94, 0xf8, 0x3a, 0x00, 0x4b, 0xe0, 0x00, 0x20, 0x0b, 0x99, 0xdd, 0xf8, + 0x24, 0x80, 0x7f, 0x26, 0x8d, 0xf8, 0x33, 0x00, 0x01, 0x20, 0x0a, 0x90, + 0x75, 0xe1, 0xa8, 0x42, 0x28, 0xd1, 0xb9, 0xf9, 0x00, 0x00, 0x04, 0x21, + 0x94, 0xf8, 0x3a, 0x60, 0x4f, 0xf0, 0x00, 0x0b, 0x8d, 0xf8, 0x32, 0xb0, + 0x90, 0xfb, 0xf1, 0xf0, 0x09, 0x90, 0x3b, 0xe1, 0x02, 0x28, 0x2d, 0xd3, + 0x04, 0x28, 0x26, 0xd8, 0x01, 0x20, 0x02, 0x2d, 0x0a, 0x90, 0x4f, 0xf0, + 0x7f, 0x00, 0x28, 0xd3, 0x04, 0x2d, 0xa5, 0xd9, 0x25, 0xe0, 0x02, 0x29, + 0xc0, 0xf0, 0xb6, 0x80, 0x04, 0x29, 0x00, 0xf2, 0xae, 0x80, 0x01, 0x22, + 0x7f, 0x21, 0x02, 0x2d, 0xc0, 0xf0, 0xb0, 0x80, 0x04, 0x2d, 0x7f, 0xf6, + 0x80, 0xaf, 0xab, 0xe0, 0x02, 0x28, 0xc0, 0xf0, 0x1a, 0x81, 0x04, 0x28, + 0x00, 0xf2, 0x12, 0x81, 0x4f, 0xf0, 0x01, 0x0b, 0x7f, 0x26, 0x02, 0x2d, + 0xc0, 0xf0, 0x14, 0x81, 0x04, 0x2d, 0xc8, 0xd9, 0x10, 0xe1, 0x09, 0x28, + 0x02, 0xd8, 0x05, 0x2d, 0xbf, 0xf4, 0x82, 0xaf, 0x01, 0x20, 0x0a, 0x90, + 0x7f, 0x20, 0xd7, 0x4a, 0x07, 0x90, 0x10, 0x78, 0x00, 0x28, 0x7b, 0xd0, + 0x00, 0x20, 0x04, 0x2d, 0x4f, 0xf0, 0x00, 0x01, 0xd3, 0x4e, 0x4f, 0xf0, + 0x00, 0x0b, 0x88, 0xbf, 0x01, 0x20, 0x02, 0x2d, 0x38, 0xbf, 0x01, 0x21, + 0x08, 0x43, 0x04, 0x90, 0x68, 0x1f, 0xc0, 0xb2, 0x03, 0x90, 0x56, 0xf8, + 0x2b, 0x90, 0xb9, 0xf1, 0x00, 0x0f, 0x33, 0xd0, 0xcb, 0x48, 0x99, 0xf8, + 0x1d, 0x11, 0xc1, 0xeb, 0x01, 0x11, 0x00, 0x68, 0x49, 0x01, 0x40, 0x5c, + 0x01, 0x28, 0x2f, 0xd8, 0xd9, 0xf8, 0x00, 0x01, 0xa0, 0x42, 0x2b, 0xd1, + 0x99, 0xf8, 0x4a, 0x01, 0xa8, 0x42, 0x2d, 0xd1, 0x0a, 0x98, 0x98, 0xb3, + 0x99, 0xf8, 0x41, 0x01, 0x9d, 0xf8, 0x33, 0x10, 0x00, 0x22, 0x00, 0x23, + 0x08, 0x44, 0xbf, 0x49, 0x40, 0xb2, 0x0f, 0x68, 0x41, 0x46, 0xb8, 0x47, + 0x07, 0x46, 0xb7, 0x48, 0x41, 0x46, 0x02, 0x68, 0x38, 0x46, 0x90, 0x47, + 0x99, 0xf8, 0x41, 0x11, 0x40, 0x1a, 0x08, 0x99, 0x8d, 0xf8, 0x32, 0x00, + 0x08, 0x78, 0x87, 0x42, 0x12, 0xbf, 0x0f, 0x70, 0x00, 0x20, 0x8d, 0xf8, + 0x32, 0x00, 0x15, 0xe0, 0x00, 0x20, 0x40, 0xf2, 0x81, 0x11, 0xec, 0xf7, + 0x21, 0xfb, 0xad, 0x4a, 0x10, 0x78, 0x0b, 0xf1, 0x01, 0x0b, 0x83, 0x45, + 0xbb, 0xd3, 0x25, 0xe0, 0x02, 0x28, 0xf7, 0xd3, 0x04, 0x28, 0x1b, 0xd8, + 0x04, 0x98, 0x00, 0x28, 0xca, 0xd0, 0xf1, 0xe7, 0x08, 0x98, 0x07, 0x78, + 0xf6, 0x48, 0x41, 0x46, 0x89, 0xf8, 0x40, 0x71, 0x02, 0x68, 0x38, 0x46, + 0x90, 0x47, 0x07, 0x9a, 0x99, 0xf9, 0x42, 0x11, 0x09, 0x90, 0x89, 0xf8, + 0x41, 0x01, 0x50, 0xb2, 0x88, 0x42, 0xa8, 0xbf, 0x0a, 0x46, 0x06, 0x9f, + 0x00, 0x20, 0x07, 0x92, 0x0a, 0x90, 0xd8, 0xe7, 0x03, 0x99, 0x04, 0x29, + 0x98, 0xbf, 0x09, 0x28, 0xd4, 0xd8, 0xab, 0xe7, 0x0a, 0x98, 0xdd, 0xf8, + 0x24, 0x80, 0xe5, 0x4b, 0x01, 0x28, 0x08, 0xbf, 0x4f, 0xf0, 0x7e, 0x08, + 0xdd, 0xf8, 0x14, 0xb0, 0x0b, 0x99, 0x07, 0x9e, 0xa5, 0xe0, 0x09, 0x29, + 0x02, 0xd8, 0x05, 0x2d, 0xbf, 0xf4, 0xd5, 0xae, 0x01, 0x22, 0x7f, 0x21, + 0xdf, 0xf8, 0x30, 0xb2, 0x0a, 0x92, 0x07, 0x91, 0x9b, 0xf8, 0x00, 0x00, + 0x00, 0x28, 0x57, 0xd0, 0x00, 0x20, 0x04, 0x2d, 0x4f, 0xf0, 0x00, 0x01, + 0x87, 0x4f, 0x4f, 0xf0, 0x00, 0x06, 0x88, 0xbf, 0x01, 0x20, 0x02, 0x2d, + 0x38, 0xbf, 0x01, 0x21, 0x08, 0x43, 0x04, 0x90, 0x68, 0x1f, 0xc0, 0xb2, + 0x03, 0x90, 0x57, 0xf8, 0x26, 0x90, 0xb9, 0xf1, 0x00, 0x0f, 0x28, 0xd0, + 0x7f, 0x48, 0x99, 0xf8, 0x1d, 0x11, 0xc1, 0xeb, 0x01, 0x11, 0x00, 0x68, + 0x49, 0x01, 0x40, 0x5c, 0x01, 0x28, 0x23, 0xd8, 0xd9, 0xf8, 0x00, 0x01, + 0xa0, 0x42, 0x1f, 0xd1, 0x99, 0xf8, 0x4a, 0x01, 0xa8, 0x42, 0x21, 0xd1, + 0x08, 0x98, 0xc6, 0x49, 0x00, 0x78, 0x0a, 0x68, 0x41, 0x46, 0x89, 0xf8, + 0x40, 0x01, 0x90, 0x47, 0x07, 0x9a, 0x99, 0xf9, 0x42, 0x11, 0x09, 0x90, + 0x89, 0xf8, 0x41, 0x01, 0x50, 0xb2, 0x88, 0x42, 0x4f, 0xf0, 0x00, 0x00, + 0xa8, 0xbf, 0x0a, 0x46, 0x07, 0x92, 0x0a, 0x90, 0x04, 0xe0, 0x00, 0x20, + 0x4f, 0xf4, 0x9d, 0x71, 0xec, 0xf7, 0x94, 0xfa, 0x9b, 0xf8, 0x00, 0x00, + 0x01, 0x36, 0x86, 0x42, 0xc7, 0xd3, 0x0d, 0xe0, 0x02, 0x28, 0xf7, 0xd3, + 0x04, 0x28, 0x03, 0xd8, 0x04, 0x98, 0x00, 0x28, 0xd6, 0xd0, 0xf1, 0xe7, + 0x03, 0x99, 0x04, 0x29, 0x98, 0xbf, 0x09, 0x28, 0xec, 0xd8, 0xcf, 0xe7, + 0x0a, 0x98, 0x07, 0x9e, 0x01, 0x28, 0x34, 0xd1, 0x00, 0x20, 0x8d, 0xf8, + 0x32, 0x00, 0x01, 0x20, 0x4f, 0xf0, 0x7e, 0x08, 0x0a, 0x90, 0x21, 0xe0, + 0x09, 0x28, 0x02, 0xd8, 0x05, 0x2d, 0xbf, 0xf4, 0xba, 0xae, 0x4f, 0xf0, + 0x01, 0x0b, 0x7f, 0x26, 0x56, 0x48, 0x29, 0x46, 0x02, 0x68, 0x20, 0x46, + 0x90, 0x47, 0xc0, 0xb1, 0x07, 0x46, 0x00, 0x20, 0x00, 0x21, 0x0a, 0x90, + 0x9f, 0x48, 0x8d, 0xf8, 0x32, 0x10, 0x41, 0x46, 0x02, 0x68, 0x08, 0x98, + 0x00, 0x78, 0x90, 0x47, 0x97, 0xf9, 0x42, 0x11, 0x80, 0x46, 0x70, 0xb2, + 0x88, 0x42, 0xb8, 0xbf, 0x31, 0x46, 0x0e, 0x46, 0xdd, 0xe9, 0x05, 0xb7, + 0x0b, 0x99, 0x94, 0x4b, 0x0b, 0xe0, 0x00, 0x20, 0xbb, 0xf1, 0x00, 0x0f, + 0xcd, 0xd1, 0x00, 0x20, 0x0a, 0x90, 0xdd, 0xe9, 0x05, 0xb7, 0x0b, 0x99, + 0x8e, 0x4b, 0xdd, 0xf8, 0x24, 0x80, 0x31, 0xb1, 0x08, 0x79, 0x04, 0x28, + 0x03, 0xd1, 0x00, 0x20, 0x48, 0x71, 0x03, 0x20, 0x0b, 0xe0, 0x08, 0x98, + 0x19, 0x78, 0x00, 0x78, 0x88, 0x42, 0x01, 0xd1, 0x01, 0x20, 0x04, 0xe0, + 0x86, 0x49, 0x09, 0x78, 0x88, 0x42, 0x02, 0xd1, 0x02, 0x20, 0x8d, 0xf8, + 0x31, 0x00, 0x94, 0xf8, 0x3b, 0x03, 0x0c, 0x28, 0x02, 0xd0, 0x0a, 0x98, + 0x01, 0x28, 0x01, 0xd1, 0xff, 0x27, 0x08, 0xe0, 0x32, 0x48, 0x00, 0xeb, + 0x47, 0x00, 0x40, 0x78, 0x37, 0x1a, 0x78, 0xb2, 0x00, 0x28, 0xd8, 0xbf, + 0x00, 0x27, 0x0d, 0xf1, 0x32, 0x00, 0x0d, 0xf1, 0x31, 0x03, 0x29, 0x46, + 0x00, 0x22, 0x00, 0x90, 0x20, 0x46, 0xff, 0xf7, 0x91, 0xfc, 0x20, 0x46, + 0x29, 0x46, 0x00, 0x22, 0x5b, 0x46, 0x16, 0xf0, 0x63, 0xfa, 0x27, 0x48, + 0x9d, 0xf9, 0x32, 0x20, 0x9d, 0xf8, 0x31, 0x10, 0x4f, 0xfa, 0x88, 0xf8, + 0x7b, 0xb2, 0xcd, 0xf8, 0x00, 0x80, 0x06, 0x68, 0x20, 0x46, 0xb0, 0x47, + 0x9a, 0xf8, 0xbb, 0x03, 0x41, 0x07, 0x5e, 0xbf, 0x0a, 0xf2, 0xbb, 0x31, + 0x40, 0xf0, 0x04, 0x00, 0x08, 0x70, 0xd4, 0xf8, 0x34, 0x03, 0x41, 0x02, + 0x5c, 0xbf, 0x40, 0xf4, 0x80, 0x00, 0xc4, 0xf8, 0x34, 0x03, 0x00, 0xb2, + 0xb0, 0xf1, 0xff, 0x3f, 0x3f, 0xf7, 0x9b, 0xad, 0x9d, 0xf8, 0x32, 0x00, + 0x00, 0x28, 0x3f, 0xf4, 0x96, 0xad, 0x14, 0x49, 0x40, 0xb2, 0x00, 0x22, + 0x2b, 0x46, 0x0e, 0x68, 0x9d, 0xf8, 0x31, 0x10, 0xcd, 0xe9, 0x00, 0x81, + 0x02, 0x90, 0x20, 0x46, 0x00, 0x21, 0xb0, 0x47, 0x87, 0xe5, 0x00, 0xbf, + 0x72, 0x32, 0x0a, 0x10, 0x70, 0x52, 0x01, 0x00, 0x6b, 0x34, 0x01, 0x00, + 0x6a, 0x34, 0x01, 0x00, 0x34, 0x9c, 0x08, 0x00, 0x38, 0x9c, 0x08, 0x00, + 0xd4, 0x58, 0x01, 0x00, 0x14, 0x58, 0x01, 0x00, 0xe0, 0x35, 0x01, 0x00, + 0x3c, 0x9c, 0x08, 0x00, 0xe8, 0xc7, 0x08, 0x00, 0x80, 0x53, 0x01, 0x00, + 0xf0, 0xc1, 0x08, 0x00, 0xf4, 0x9b, 0x08, 0x00, 0x94, 0x9b, 0x08, 0x00, + 0x2d, 0xe9, 0xf0, 0x4f, 0x85, 0xb0, 0x05, 0x46, 0x0c, 0x29, 0x01, 0x91, + 0x08, 0xd0, 0x80, 0x29, 0x1a, 0xbf, 0x41, 0x48, 0x47, 0x5c, 0x95, 0xf8, + 0xf2, 0x72, 0x3e, 0x46, 0x01, 0x20, 0x0b, 0xe0, 0x95, 0xf8, 0xcc, 0x03, + 0x95, 0xf8, 0xd4, 0x13, 0x03, 0x26, 0x02, 0x27, 0x88, 0x42, 0x08, 0xbf, + 0x02, 0x26, 0x40, 0x1a, 0x18, 0xbf, 0x01, 0x20, 0x02, 0x90, 0x4f, 0xf0, + 0x00, 0x08, 0x0d, 0xf1, 0x10, 0x0b, 0x44, 0x48, 0x00, 0x21, 0x25, 0x22, + 0x04, 0x23, 0x8d, 0xf8, 0x0f, 0x80, 0x04, 0x68, 0x58, 0x46, 0xa0, 0x47, + 0x04, 0x98, 0x00, 0x28, 0x56, 0xd0, 0xfc, 0xb2, 0x04, 0x20, 0x2f, 0x49, + 0x04, 0x2c, 0x38, 0xbf, 0x20, 0x46, 0x05, 0xeb, 0xc0, 0x09, 0x99, 0xf8, + 0xbc, 0x03, 0x09, 0x78, 0x09, 0xf5, 0x6f, 0x7a, 0x88, 0x42, 0x01, 0xd1, + 0x01, 0x20, 0x04, 0xe0, 0x28, 0x49, 0x09, 0x78, 0x88, 0x42, 0x02, 0xd1, + 0x02, 0x20, 0x8d, 0xf8, 0x0f, 0x00, 0x28, 0x46, 0x21, 0x46, 0x00, 0x22, + 0x0d, 0xf1, 0x0f, 0x03, 0xcd, 0xf8, 0x00, 0x80, 0xff, 0xf7, 0xe8, 0xfb, + 0x21, 0x49, 0x9a, 0xf8, 0x00, 0x00, 0x0a, 0x68, 0x02, 0x21, 0x90, 0x47, + 0xd5, 0xf8, 0x1c, 0x14, 0x99, 0xf8, 0xbf, 0x23, 0x51, 0xb1, 0x09, 0x7e, + 0x05, 0x29, 0x07, 0xd1, 0x05, 0x2c, 0x05, 0xd3, 0x09, 0x2c, 0x05, 0xd8, + 0x04, 0x99, 0x81, 0xf8, 0x05, 0x80, 0x0e, 0xe0, 0x04, 0x2c, 0x03, 0xd3, + 0x04, 0x98, 0xec, 0xf7, 0x69, 0xf9, 0x14, 0xe0, 0x02, 0x99, 0x19, 0xb1, + 0x13, 0x49, 0x0b, 0x5d, 0x04, 0x99, 0x01, 0xe0, 0x04, 0x99, 0x01, 0x9b, + 0x4b, 0x71, 0x08, 0x72, 0x9d, 0xf8, 0x0f, 0x00, 0xca, 0x71, 0x00, 0xf0, + 0x03, 0x00, 0x88, 0x71, 0x0d, 0x48, 0x02, 0x68, 0x08, 0x46, 0x29, 0x46, + 0x90, 0x47, 0x01, 0x37, 0xf8, 0xb2, 0xb0, 0x42, 0x9d, 0xd9, 0x04, 0xe0, + 0x00, 0x20, 0x40, 0xf2, 0x5d, 0x21, 0xec, 0xf7, 0x2b, 0xf9, 0x05, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0x72, 0x32, 0x0a, 0x10, 0x6b, 0x34, 0x01, 0x00, + 0x6a, 0x34, 0x01, 0x00, 0x34, 0x9c, 0x08, 0x00, 0x6a, 0x32, 0x0a, 0x10, + 0xa8, 0xb8, 0x08, 0x00, 0x06, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, + 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, + 0x08, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, 0x04, 0xc2, 0x08, 0x00, + 0x15, 0xa3, 0x03, 0x00, 0xa4, 0xb8, 0x08, 0x00, 0x09, 0xa3, 0x03, 0x00, + 0x84, 0xc6, 0x08, 0x00, 0x35, 0xa3, 0x03, 0x00, 0x24, 0xc1, 0x08, 0x00, + 0x59, 0xa9, 0x03, 0x00, 0x45, 0xf6, 0xe1, 0x3c, 0xc1, 0xf2, 0x07, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x45, 0xf6, 0x69, 0x7c, 0xc1, 0xf2, 0x07, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0xfe, 0xf7, 0x8a, 0xba, 0x2d, 0xe9, 0xf0, 0x4f, + 0x89, 0xb0, 0x04, 0x46, 0xbb, 0x48, 0x99, 0x46, 0x88, 0x46, 0x00, 0x78, + 0xff, 0x28, 0x18, 0xbf, 0x90, 0x42, 0x40, 0xf0, 0x33, 0x81, 0xb8, 0x49, + 0x02, 0xeb, 0x42, 0x00, 0x51, 0xf8, 0x20, 0x60, 0x00, 0x2e, 0x55, 0xd0, + 0x20, 0x78, 0x00, 0x21, 0x04, 0xeb, 0xc0, 0x00, 0xc1, 0x72, 0x96, 0xf8, + 0x24, 0x01, 0x0a, 0x28, 0x51, 0xd1, 0xdf, 0xf8, 0xc4, 0xa2, 0x72, 0xb6, + 0xda, 0xf8, 0x00, 0x00, 0x40, 0x00, 0x01, 0x30, 0xca, 0xf8, 0x00, 0x00, + 0xd6, 0xe9, 0xc8, 0x10, 0xb7, 0x6e, 0xb6, 0xf8, 0xdc, 0xb2, 0x01, 0x90, + 0xb6, 0xf8, 0xea, 0x02, 0x03, 0x91, 0x06, 0x90, 0x96, 0xf8, 0xf2, 0x02, + 0x05, 0x90, 0x96, 0xf8, 0xf3, 0x02, 0x04, 0x90, 0xd6, 0xf8, 0x84, 0x02, + 0xd0, 0xe9, 0x02, 0x50, 0x02, 0x90, 0xfe, 0xf7, 0x4d, 0xfa, 0x00, 0x28, + 0x42, 0xd0, 0xd6, 0xf8, 0x0c, 0x03, 0x00, 0x28, 0x3e, 0xd0, 0xb6, 0xf8, + 0x84, 0x10, 0x89, 0x06, 0x3a, 0xd5, 0xb6, 0xf8, 0x14, 0x13, 0x02, 0x8b, + 0x51, 0x1a, 0x09, 0xb2, 0x00, 0x29, 0x33, 0xd4, 0x90, 0xf8, 0x32, 0x20, + 0x89, 0xb2, 0x0b, 0xfb, 0x01, 0xf1, 0xb0, 0xf8, 0x1c, 0xb0, 0x05, 0x92, + 0x90, 0xf8, 0x33, 0x20, 0x89, 0x00, 0x04, 0x92, 0x42, 0x8d, 0x06, 0x92, + 0xd6, 0xf8, 0xd4, 0x20, 0x52, 0x7f, 0xa2, 0xb1, 0x40, 0x8b, 0x01, 0xeb, + 0x80, 0x00, 0x03, 0x99, 0x01, 0x44, 0x28, 0x44, 0x20, 0xf0, 0x70, 0x45, + 0x03, 0x91, 0x17, 0xe0, 0x00, 0x20, 0x64, 0x21, 0xec, 0xf7, 0x82, 0xf8, + 0xd0, 0xe0, 0x20, 0x46, 0x41, 0x46, 0x4b, 0x46, 0x00, 0xf0, 0x60, 0xf9, + 0xca, 0xe0, 0x03, 0x9a, 0x11, 0x44, 0x90, 0xf8, 0x2c, 0x20, 0x40, 0x8b, + 0x01, 0xeb, 0x42, 0x01, 0x01, 0xeb, 0x80, 0x00, 0x81, 0x49, 0x00, 0xea, + 0x01, 0x07, 0x03, 0x97, 0xda, 0xf8, 0x00, 0x00, 0x7f, 0x49, 0x40, 0x08, + 0xca, 0xf8, 0x00, 0x00, 0xda, 0xf8, 0x00, 0x00, 0x80, 0xf3, 0x10, 0x88, + 0xd6, 0xf8, 0xd4, 0x00, 0x49, 0x69, 0x81, 0x42, 0x0c, 0xd0, 0x7a, 0x49, + 0x4f, 0xf0, 0x00, 0x0a, 0x07, 0x97, 0xad, 0xf8, 0x20, 0xa0, 0x0b, 0x68, + 0x00, 0xf1, 0x14, 0x01, 0x07, 0xa8, 0x02, 0x46, 0x98, 0x47, 0x19, 0xe0, + 0x74, 0x48, 0x90, 0xf8, 0x2e, 0x00, 0x80, 0xb1, 0x98, 0xf8, 0x1d, 0x00, + 0x68, 0xb1, 0x72, 0x48, 0x41, 0x46, 0x02, 0x68, 0x30, 0x46, 0x90, 0x47, + 0x38, 0xb1, 0x01, 0x98, 0xa0, 0x25, 0x4f, 0xf0, 0x01, 0x0a, 0x08, 0x90, + 0x03, 0x98, 0x07, 0x90, 0x05, 0xe0, 0x02, 0x98, 0x4f, 0xf0, 0x00, 0x0a, + 0xcd, 0xe9, 0x07, 0x50, 0x50, 0x25, 0x69, 0x48, 0x07, 0xaf, 0x08, 0xf1, + 0x14, 0x01, 0x3a, 0x46, 0x03, 0x68, 0x38, 0x46, 0x98, 0x47, 0x66, 0x48, + 0x29, 0x46, 0x02, 0x68, 0x38, 0x46, 0x90, 0x47, 0x21, 0x78, 0x25, 0x1d, + 0xa2, 0x78, 0x07, 0x90, 0x05, 0xeb, 0xc1, 0x01, 0xa1, 0xf8, 0x02, 0xb0, + 0x60, 0x49, 0x0b, 0x68, 0x4f, 0xea, 0x4b, 0x01, 0x98, 0x47, 0x96, 0xf8, + 0x3e, 0x23, 0x41, 0x08, 0x20, 0x78, 0xd2, 0x07, 0x25, 0xf8, 0x30, 0x10, + 0x0c, 0xd0, 0x04, 0xeb, 0xc0, 0x03, 0xdf, 0x88, 0x7a, 0x08, 0xda, 0x80, + 0x8b, 0xb2, 0xb3, 0xeb, 0x57, 0x0f, 0x22, 0xbf, 0x05, 0xeb, 0xc0, 0x03, + 0x89, 0x1a, 0x19, 0x80, 0xba, 0xf1, 0x00, 0x0f, 0x08, 0xbf, 0xb9, 0xf1, + 0x00, 0x0f, 0x54, 0xd0, 0x06, 0x9d, 0x04, 0xeb, 0xc0, 0x02, 0x01, 0x21, + 0x11, 0x72, 0x05, 0x9b, 0x01, 0x2b, 0x02, 0xd8, 0x04, 0x9a, 0x02, 0x2a, + 0x05, 0xd3, 0x02, 0x29, 0x9e, 0xbf, 0x04, 0xeb, 0xc0, 0x01, 0x03, 0x22, + 0x0a, 0x72, 0x18, 0xb1, 0x14, 0xf8, 0x30, 0x00, 0x86, 0xf8, 0x76, 0x01, + 0x86, 0xf8, 0x77, 0x51, 0x02, 0x21, 0x20, 0x78, 0x04, 0xeb, 0xc0, 0x00, + 0x81, 0x72, 0x01, 0x21, 0x41, 0x72, 0x43, 0x48, 0x41, 0x46, 0x02, 0x68, + 0xd6, 0xf8, 0xd4, 0x00, 0x90, 0x47, 0x28, 0xb1, 0x37, 0x49, 0xd6, 0xf8, + 0xd4, 0x00, 0x49, 0x69, 0x81, 0x42, 0x12, 0xd1, 0xba, 0xf1, 0x00, 0x0f, + 0x0c, 0xd1, 0x20, 0x78, 0x04, 0xeb, 0xc0, 0x00, 0x01, 0x7a, 0x42, 0x7a, + 0xc3, 0x7a, 0x01, 0x31, 0x01, 0x72, 0x51, 0x1c, 0x41, 0x72, 0x43, 0xf0, + 0x01, 0x01, 0xc1, 0x72, 0x60, 0x78, 0x01, 0x30, 0x60, 0x70, 0x20, 0x78, + 0x33, 0x4a, 0x0c, 0x23, 0x10, 0x60, 0x04, 0xeb, 0xc0, 0x00, 0x01, 0x7a, + 0x80, 0x88, 0x90, 0x60, 0x30, 0x48, 0x51, 0x60, 0x00, 0x21, 0x05, 0x68, + 0x48, 0xf2, 0x0d, 0x00, 0xa8, 0x47, 0x20, 0x78, 0x01, 0x30, 0x20, 0x70, + 0x09, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x06, 0x9d, 0x5d, 0xb3, 0x26, 0x49, + 0x64, 0x23, 0x04, 0xeb, 0xc0, 0x02, 0xb1, 0xf8, 0xf0, 0x11, 0x01, 0xfb, + 0x0b, 0xf1, 0xb1, 0xfb, 0xf3, 0xf1, 0xc5, 0xf3, 0x47, 0x03, 0x99, 0x42, + 0x28, 0xbf, 0x69, 0x08, 0xc9, 0xb2, 0x00, 0x29, 0x08, 0xbf, 0x01, 0x21, + 0x40, 0x29, 0x28, 0xbf, 0x40, 0x21, 0x96, 0xf8, 0xf2, 0x32, 0x02, 0xf8, + 0x08, 0x1f, 0x01, 0x2b, 0x09, 0xd8, 0x96, 0xf8, 0xf3, 0x32, 0x01, 0x2b, + 0x05, 0xd8, 0x05, 0x9b, 0x05, 0x29, 0x24, 0xbf, 0x04, 0x21, 0x11, 0x70, + 0x88, 0xe7, 0x05, 0x9b, 0x11, 0x29, 0x24, 0xbf, 0x10, 0x21, 0x11, 0x70, + 0x82, 0xe7, 0x96, 0xf8, 0xa6, 0x13, 0x04, 0xeb, 0xc0, 0x02, 0x02, 0x29, + 0xff, 0xf4, 0x79, 0xaf, 0x40, 0x29, 0x28, 0xbf, 0x40, 0x21, 0x75, 0xe7, + 0x7f, 0xd3, 0x05, 0x00, 0xe8, 0x72, 0x01, 0x00, 0x24, 0x36, 0x01, 0x00, + 0xfc, 0xff, 0xff, 0x0f, 0xfc, 0x73, 0x01, 0x00, 0x44, 0xa1, 0x08, 0x00, + 0x10, 0x5a, 0x01, 0x00, 0xbc, 0xcd, 0x08, 0x00, 0x48, 0xa1, 0x08, 0x00, + 0x3c, 0xa1, 0x08, 0x00, 0x40, 0xa1, 0x08, 0x00, 0xe8, 0x65, 0x08, 0x00, + 0x38, 0xa1, 0x08, 0x00, 0x8c, 0x34, 0x01, 0x00, 0x78, 0x9b, 0x08, 0x00, + 0xf8, 0xb5, 0x07, 0x46, 0x12, 0x48, 0x15, 0x46, 0x0e, 0x46, 0x19, 0x46, + 0x1c, 0x46, 0x02, 0x68, 0x28, 0x46, 0x90, 0x47, 0xc1, 0xb2, 0x55, 0xfa, + 0x80, 0xf0, 0x01, 0x38, 0x90, 0xfb, 0xf1, 0xf0, 0x00, 0xfb, 0x01, 0xf2, + 0x06, 0x98, 0xa2, 0x42, 0x09, 0xdc, 0x38, 0xb1, 0xb1, 0xfb, 0xf0, 0xf2, + 0x02, 0xfb, 0x10, 0x12, 0x00, 0x2a, 0x08, 0xbf, 0x08, 0x46, 0x00, 0xe0, + 0x00, 0x20, 0x00, 0x90, 0x38, 0x46, 0x31, 0x46, 0x2a, 0x46, 0x23, 0x46, + 0x00, 0xf0, 0x1a, 0xf8, 0xf8, 0xbd, 0x00, 0xbf, 0xc8, 0xc8, 0x08, 0x00, + 0x03, 0x48, 0x04, 0x49, 0x01, 0x60, 0x04, 0x48, 0x04, 0x49, 0x01, 0x60, + 0x70, 0x47, 0x00, 0xbf, 0x1c, 0xc7, 0x08, 0x00, 0x15, 0xae, 0x03, 0x00, + 0xa4, 0xc8, 0x08, 0x00, 0xe1, 0xaa, 0x03, 0x00, 0x4a, 0xf2, 0x39, 0x1c, + 0xc1, 0xf2, 0x08, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x49, 0xf6, 0xe5, 0x5c, + 0xc1, 0xf2, 0x08, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x10, 0xb5, 0x00, 0xf0, + 0xf7, 0xf9, 0x50, 0x48, 0x4f, 0xf0, 0xff, 0x31, 0x01, 0x60, 0x46, 0x48, + 0x90, 0xf8, 0x3d, 0x00, 0x40, 0xb1, 0x45, 0x4c, 0x00, 0x20, 0x21, 0x68, + 0x88, 0x47, 0x21, 0x68, 0x01, 0x20, 0xbd, 0xe8, 0x10, 0x40, 0x08, 0x47, + 0x10, 0xbd, 0x00, 0xbf, 0x2d, 0xe9, 0xf0, 0x41, 0x94, 0xb0, 0x04, 0x46, + 0x3c, 0x48, 0x02, 0x2c, 0x00, 0xf1, 0x3d, 0x06, 0x08, 0xd1, 0x3c, 0x48, + 0x0d, 0x46, 0x01, 0x68, 0x02, 0x20, 0x88, 0x47, 0xd5, 0xb1, 0x95, 0xf8, + 0x35, 0x01, 0x1c, 0xe0, 0x30, 0x78, 0x28, 0xb1, 0x35, 0x48, 0x00, 0x25, + 0x01, 0x68, 0x00, 0x20, 0x88, 0x47, 0x35, 0x70, 0x33, 0x48, 0x01, 0x68, + 0x20, 0x46, 0x88, 0x47, 0x32, 0x48, 0x0e, 0x21, 0x06, 0xf1, 0x23, 0x02, + 0x06, 0xf1, 0x1f, 0x03, 0x00, 0x78, 0xc0, 0x07, 0x08, 0xbf, 0x04, 0x21, + 0x19, 0x20, 0x0f, 0xe0, 0x00, 0x20, 0x87, 0x21, 0xeb, 0xf7, 0xcc, 0xfe, + 0xff, 0x20, 0x2a, 0x49, 0x06, 0xf1, 0x5b, 0x02, 0x06, 0xf1, 0x57, 0x03, + 0x09, 0x78, 0xc9, 0x07, 0x4f, 0xf0, 0x0f, 0x01, 0x08, 0xbf, 0x06, 0x21, + 0x25, 0x4c, 0x00, 0x25, 0x1b, 0x88, 0x12, 0x88, 0xcd, 0xe9, 0x00, 0x05, + 0x00, 0x20, 0x24, 0x68, 0xa0, 0x47, 0x22, 0x4c, 0x03, 0xae, 0x44, 0x21, + 0x20, 0x23, 0x4f, 0xf0, 0x44, 0x08, 0x30, 0x46, 0x22, 0x46, 0xe6, 0xf7, + 0x5d, 0xf8, 0x1e, 0x4d, 0x06, 0xf1, 0x20, 0x00, 0x24, 0x21, 0x24, 0x23, + 0x2a, 0x46, 0xe6, 0xf7, 0x55, 0xf8, 0x1b, 0x48, 0x01, 0x21, 0x00, 0x22, + 0x33, 0x46, 0xcd, 0xf8, 0x00, 0x80, 0xb0, 0xf8, 0xd0, 0x02, 0xad, 0xf8, + 0x42, 0x00, 0x17, 0x48, 0x00, 0x68, 0x11, 0x90, 0x16, 0x48, 0x07, 0x68, + 0x40, 0xf2, 0x17, 0x60, 0xb8, 0x47, 0x15, 0x4e, 0x20, 0x21, 0x72, 0xb6, + 0x30, 0x68, 0x40, 0x00, 0x01, 0x30, 0x30, 0x60, 0x20, 0x46, 0xe8, 0xf7, + 0xcd, 0xf9, 0x28, 0x46, 0x24, 0x21, 0xe8, 0xf7, 0xc9, 0xf9, 0x30, 0x68, + 0x40, 0x08, 0x30, 0x60, 0x30, 0x68, 0x80, 0xf3, 0x10, 0x88, 0x14, 0xb0, + 0xbd, 0xe8, 0xf0, 0x81, 0x90, 0x01, 0x00, 0x00, 0x94, 0xba, 0x08, 0x00, + 0x60, 0xba, 0x08, 0x00, 0x99, 0x53, 0x01, 0x00, 0x14, 0x99, 0x08, 0x00, + 0x38, 0x7a, 0x01, 0x00, 0x38, 0xfb, 0x05, 0x00, 0x8c, 0x7e, 0x08, 0x00, + 0x34, 0x21, 0x01, 0x00, 0xa0, 0xa0, 0x08, 0x00, 0x24, 0x36, 0x01, 0x00, + 0x2d, 0xe9, 0xff, 0x41, 0x0f, 0x46, 0x04, 0x29, 0x05, 0x46, 0x90, 0x46, + 0x0e, 0x46, 0x28, 0xbf, 0x04, 0x27, 0xd0, 0xf8, 0x34, 0x03, 0x81, 0x03, + 0x04, 0xd4, 0xc0, 0x03, 0x15, 0xd5, 0xa3, 0xb1, 0x01, 0x22, 0x05, 0xe0, + 0x20, 0xf4, 0x00, 0x30, 0x00, 0x23, 0x02, 0x22, 0xc5, 0xf8, 0x34, 0x03, + 0x05, 0xeb, 0xc7, 0x00, 0x8a, 0x49, 0x90, 0xf9, 0xbd, 0x03, 0x0c, 0x68, + 0x00, 0x21, 0xcd, 0xe9, 0x00, 0x08, 0x02, 0x93, 0x28, 0x46, 0x33, 0x46, + 0xa0, 0x47, 0x05, 0xeb, 0xc7, 0x01, 0x01, 0xf2, 0xbb, 0x30, 0x91, 0xf8, + 0xbb, 0x13, 0x4a, 0x07, 0x5c, 0xbf, 0x41, 0xf0, 0x04, 0x01, 0x01, 0x70, + 0x01, 0xf0, 0xfc, 0x01, 0xb8, 0xf1, 0x02, 0x0f, 0x01, 0xd1, 0x01, 0x31, + 0x04, 0xe0, 0xb8, 0xf1, 0x01, 0x0f, 0x08, 0xbf, 0x41, 0xf0, 0x02, 0x01, + 0x01, 0x70, 0xbd, 0xe8, 0xff, 0x81, 0x00, 0xbf, 0x2d, 0xe9, 0xf0, 0x4f, + 0x85, 0xb0, 0x80, 0x46, 0x90, 0xf8, 0x4e, 0x03, 0x40, 0x07, 0x40, 0xf1, + 0xd2, 0x80, 0x6a, 0x48, 0x00, 0x79, 0x40, 0x07, 0x40, 0xf1, 0xcd, 0x80, + 0x0d, 0x46, 0x98, 0xf8, 0xf2, 0x12, 0x91, 0x46, 0x66, 0x4a, 0x0e, 0x46, + 0x04, 0x29, 0x28, 0xbf, 0x04, 0x26, 0x50, 0x7a, 0xc0, 0x07, 0x04, 0xd0, + 0x90, 0x19, 0x80, 0x7a, 0xa8, 0x42, 0x38, 0xbf, 0x05, 0x46, 0x61, 0x4c, + 0x4f, 0xf0, 0x03, 0x0a, 0x05, 0x29, 0x28, 0x46, 0x38, 0xbf, 0x4f, 0xf0, + 0x02, 0x0a, 0x04, 0x91, 0x51, 0x46, 0x22, 0x68, 0x90, 0x47, 0x07, 0x46, + 0x22, 0x68, 0x98, 0xf8, 0x74, 0x00, 0x04, 0x9c, 0x51, 0x46, 0x90, 0x47, + 0x08, 0xeb, 0xc6, 0x0b, 0x38, 0x1a, 0x51, 0x46, 0x88, 0xf8, 0x74, 0x50, + 0x8b, 0xf8, 0xbf, 0x03, 0x54, 0x48, 0x8b, 0xf8, 0xbc, 0x53, 0x02, 0x68, + 0x28, 0x46, 0x90, 0x47, 0x08, 0xeb, 0x4a, 0x01, 0x0b, 0xf5, 0x6f, 0x77, + 0xa1, 0xf8, 0x78, 0x00, 0xa0, 0x1e, 0x02, 0x28, 0x3e, 0xd8, 0x03, 0x2c, + 0x1d, 0xd0, 0x02, 0x2c, 0x40, 0xf0, 0x8d, 0x80, 0x48, 0x48, 0x41, 0x7b, + 0x38, 0x78, 0x81, 0x42, 0x38, 0xbf, 0x08, 0x46, 0x98, 0xf8, 0xd4, 0x53, + 0xa8, 0x42, 0x2f, 0xd0, 0x44, 0x4c, 0x02, 0x21, 0x88, 0xf8, 0xd4, 0x03, + 0x22, 0x68, 0x90, 0x47, 0x22, 0x68, 0x06, 0x46, 0x04, 0x9c, 0x28, 0x46, + 0x02, 0x21, 0x90, 0x47, 0x30, 0x1a, 0x03, 0x21, 0x88, 0xf8, 0xd7, 0x03, + 0x19, 0xe0, 0x3b, 0x48, 0x01, 0x7b, 0x38, 0x78, 0x81, 0x42, 0x38, 0xbf, + 0x08, 0x46, 0x98, 0xf8, 0xcc, 0x53, 0xa8, 0x42, 0x14, 0xd0, 0x37, 0x4c, + 0x02, 0x21, 0x88, 0xf8, 0xcc, 0x03, 0x22, 0x68, 0x90, 0x47, 0x22, 0x68, + 0x06, 0x46, 0x04, 0x9c, 0x28, 0x46, 0x02, 0x21, 0x90, 0x47, 0x30, 0x1a, + 0x02, 0x21, 0x88, 0xf8, 0xcf, 0x03, 0x40, 0x46, 0x03, 0x22, 0x2b, 0x46, + 0x15, 0xf0, 0xf8, 0xfd, 0xb9, 0xf1, 0x00, 0x0f, 0x4f, 0xd0, 0x98, 0xf8, + 0x36, 0x03, 0x40, 0x06, 0x4b, 0xd5, 0x9b, 0xf8, 0xbb, 0x03, 0x00, 0xf0, + 0xf7, 0x00, 0x8b, 0xf8, 0xbb, 0x03, 0x28, 0x48, 0x00, 0x68, 0x80, 0x47, + 0xc0, 0xb1, 0x05, 0x46, 0x02, 0x2c, 0x07, 0xd3, 0x04, 0x2c, 0x01, 0xd8, + 0x0c, 0x20, 0x05, 0xe0, 0x09, 0x2c, 0x01, 0xd8, 0x80, 0x20, 0x01, 0xe0, + 0x21, 0x48, 0x00, 0x5d, 0x28, 0x71, 0x21, 0x48, 0x41, 0x46, 0x2a, 0x46, + 0x01, 0x23, 0x06, 0x68, 0x4f, 0x20, 0xb0, 0x47, 0x10, 0xb1, 0x28, 0x46, + 0xeb, 0xf7, 0x92, 0xfd, 0xb8, 0xf9, 0x34, 0x03, 0xb0, 0xf1, 0xff, 0x3f, + 0x23, 0xdc, 0x15, 0x4e, 0x38, 0x78, 0x51, 0x46, 0x32, 0x68, 0x90, 0x47, + 0x05, 0x46, 0x17, 0x48, 0x32, 0x68, 0x02, 0x21, 0x00, 0x78, 0x90, 0x47, + 0x85, 0x42, 0x01, 0xd1, 0x01, 0x20, 0x09, 0xe0, 0x13, 0x48, 0x32, 0x68, + 0x02, 0x21, 0x00, 0x78, 0x90, 0x47, 0x28, 0x1a, 0xb0, 0xfa, 0x80, 0xf0, + 0x40, 0x09, 0x40, 0x00, 0x0f, 0x49, 0xcd, 0xe9, 0x00, 0x50, 0x40, 0x46, + 0x00, 0x22, 0x23, 0x46, 0x0e, 0x68, 0x7f, 0x21, 0x02, 0x91, 0x00, 0x21, + 0xb0, 0x47, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x70, 0x52, 0x01, 0x00, + 0xcc, 0x2c, 0x06, 0x00, 0x34, 0x9c, 0x08, 0x00, 0x38, 0x9c, 0x08, 0x00, + 0x48, 0xb5, 0x08, 0x00, 0x6a, 0x32, 0x0a, 0x10, 0x80, 0x9b, 0x08, 0x00, + 0x6b, 0x34, 0x01, 0x00, 0x6a, 0x34, 0x01, 0x00, 0xf4, 0x9b, 0x08, 0x00, + 0x06, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x07, 0x49, 0x01, 0x60, + 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, + 0x70, 0x47, 0x00, 0xbf, 0x9c, 0xba, 0x08, 0x00, 0xcd, 0xae, 0x03, 0x00, + 0xfc, 0xc6, 0x08, 0x00, 0xa1, 0xae, 0x03, 0x00, 0xf4, 0xc8, 0x08, 0x00, + 0xf5, 0xaf, 0x03, 0x00, 0x00, 0x9c, 0x08, 0x00, 0x75, 0xb0, 0x03, 0x00, + 0x43, 0xf6, 0x35, 0x4c, 0xc1, 0xf2, 0x08, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0xb0, 0xb5, 0x04, 0x9c, 0x01, 0xb3, 0x01, 0x7f, 0x19, 0xb1, 0x05, 0x8a, + 0x69, 0x43, 0x91, 0x42, 0x3e, 0xd2, 0x81, 0x7e, 0x19, 0xb1, 0x85, 0x89, + 0x69, 0x43, 0x91, 0x42, 0x3c, 0xd2, 0x01, 0x7e, 0x19, 0xb1, 0x05, 0x89, + 0x69, 0x43, 0x91, 0x42, 0x3e, 0xd2, 0x81, 0x7d, 0x19, 0xb1, 0x85, 0x88, + 0x69, 0x43, 0x91, 0x42, 0x40, 0xd2, 0x01, 0x7d, 0x19, 0xb1, 0x05, 0x88, + 0x69, 0x43, 0x91, 0x42, 0x42, 0xd2, 0x00, 0x20, 0x68, 0x21, 0x1f, 0xe0, + 0x41, 0x7f, 0x19, 0xb1, 0x45, 0x8a, 0x69, 0x43, 0x91, 0x42, 0x25, 0xd2, + 0xc1, 0x7e, 0x19, 0xb1, 0xc5, 0x89, 0x69, 0x43, 0x91, 0x42, 0x27, 0xd2, + 0x41, 0x7e, 0x19, 0xb1, 0x45, 0x89, 0x69, 0x43, 0x91, 0x42, 0x29, 0xd2, + 0xc1, 0x7d, 0x19, 0xb1, 0xc5, 0x88, 0x69, 0x43, 0x91, 0x42, 0x2b, 0xd2, + 0x41, 0x7d, 0x19, 0xb1, 0x45, 0x88, 0x69, 0x43, 0x91, 0x42, 0x29, 0xd2, + 0x00, 0x20, 0x8c, 0x21, 0xbd, 0xe8, 0xb0, 0x40, 0xe5, 0xf7, 0x66, 0xbe, + 0x05, 0x21, 0x19, 0x70, 0x00, 0x7f, 0x22, 0xe0, 0x06, 0x21, 0x19, 0x70, + 0x80, 0x7e, 0x1e, 0xe0, 0x05, 0x21, 0x19, 0x70, 0x40, 0x7f, 0x1a, 0xe0, + 0x07, 0x21, 0x19, 0x70, 0x00, 0x7e, 0x16, 0xe0, 0x06, 0x21, 0x19, 0x70, + 0xc0, 0x7e, 0x12, 0xe0, 0x08, 0x21, 0x19, 0x70, 0x80, 0x7d, 0x0e, 0xe0, + 0x07, 0x21, 0x19, 0x70, 0x40, 0x7e, 0x0a, 0xe0, 0x09, 0x21, 0x19, 0x70, + 0x00, 0x7d, 0x06, 0xe0, 0x08, 0x21, 0x19, 0x70, 0xc0, 0x7d, 0x02, 0xe0, + 0x09, 0x21, 0x19, 0x70, 0x40, 0x7d, 0x20, 0x70, 0xb0, 0xbd, 0x00, 0xbf, + 0x10, 0xb5, 0x02, 0x9c, 0x51, 0xb1, 0x51, 0x1f, 0x04, 0x29, 0x12, 0xd8, + 0xdf, 0xe8, 0x01, 0xf0, 0x03, 0x14, 0x17, 0x1a, 0x1d, 0x00, 0x01, 0x8a, + 0x00, 0x7f, 0x2a, 0xe0, 0x51, 0x1f, 0x04, 0x29, 0x16, 0xd8, 0xdf, 0xe8, + 0x01, 0xf0, 0x03, 0x1b, 0x1e, 0x21, 0x24, 0x00, 0x41, 0x8a, 0x40, 0x7f, + 0x1f, 0xe0, 0x00, 0x20, 0xbc, 0x21, 0x0d, 0xe0, 0x81, 0x89, 0x80, 0x7e, + 0x19, 0xe0, 0x01, 0x89, 0x00, 0x7e, 0x16, 0xe0, 0x81, 0x88, 0x80, 0x7d, + 0x13, 0xe0, 0x01, 0x88, 0x00, 0x7d, 0x10, 0xe0, 0x00, 0x20, 0xd9, 0x21, + 0xbd, 0xe8, 0x10, 0x40, 0xe5, 0xf7, 0x0e, 0xbe, 0xc1, 0x89, 0xc0, 0x7e, + 0x07, 0xe0, 0x41, 0x89, 0x40, 0x7e, 0x04, 0xe0, 0xc1, 0x88, 0xc0, 0x7d, + 0x01, 0xe0, 0x41, 0x88, 0x40, 0x7d, 0x21, 0x80, 0x18, 0x70, 0x10, 0xbd, + 0x02, 0x88, 0x0a, 0x80, 0x42, 0x88, 0x4a, 0x80, 0x82, 0x88, 0x8a, 0x80, + 0xc2, 0x88, 0xca, 0x80, 0x02, 0x89, 0x0a, 0x81, 0x42, 0x89, 0x4a, 0x81, + 0x82, 0x89, 0x8a, 0x81, 0xc2, 0x89, 0xca, 0x81, 0x02, 0x8a, 0x0a, 0x82, + 0x42, 0x8a, 0x43, 0x8b, 0x4a, 0x82, 0x4b, 0x83, 0x82, 0x8a, 0x8a, 0x82, + 0xc2, 0x8a, 0xca, 0x82, 0x02, 0x8b, 0x0a, 0x83, 0x02, 0x7f, 0x0a, 0x77, + 0x42, 0x7f, 0x90, 0xf8, 0x29, 0x00, 0x4a, 0x77, 0x88, 0x77, 0x70, 0x47, + 0x21, 0xb1, 0x01, 0x39, 0xc8, 0x40, 0x00, 0xf0, 0x01, 0x00, 0x70, 0x47, + 0x00, 0x20, 0x70, 0x47, 0x70, 0xb5, 0x18, 0x4d, 0x06, 0x46, 0x95, 0xf8, + 0x23, 0x00, 0xb0, 0xeb, 0x11, 0x6f, 0x26, 0xd1, 0x14, 0x46, 0xc1, 0xf3, + 0x07, 0x20, 0x95, 0xf8, 0x28, 0x20, 0x82, 0x42, 0x1f, 0xd1, 0xe8, 0x8c, + 0xc1, 0xf3, 0x07, 0x41, 0xff, 0xf7, 0xe4, 0xff, 0xc8, 0xb1, 0xa8, 0x8c, + 0xb0, 0xeb, 0x16, 0x4f, 0x15, 0xd1, 0xd4, 0xf8, 0x3c, 0x61, 0x3e, 0xb9, + 0x0b, 0x48, 0x01, 0x68, 0x2c, 0x20, 0x88, 0x47, 0x06, 0x46, 0xc4, 0xf8, + 0x3c, 0x01, 0x50, 0xb1, 0xb1, 0x1c, 0x28, 0x46, 0xff, 0xf7, 0xac, 0xff, + 0x00, 0x20, 0x84, 0xf8, 0xec, 0x01, 0x01, 0x20, 0x86, 0xf8, 0x21, 0x00, + 0x70, 0xbd, 0x00, 0x20, 0x70, 0xbd, 0x00, 0xbf, 0xa4, 0x32, 0x06, 0x00, + 0x4c, 0x9c, 0x08, 0x00, 0x19, 0xb1, 0x01, 0x7d, 0x29, 0xb1, 0x00, 0x88, + 0x22, 0xe0, 0x41, 0x7d, 0x29, 0xb1, 0x40, 0x88, 0x1e, 0xe0, 0x81, 0x7d, + 0x29, 0xb1, 0x80, 0x88, 0x1a, 0xe0, 0xc1, 0x7d, 0x29, 0xb1, 0xc0, 0x88, + 0x16, 0xe0, 0x01, 0x7e, 0x29, 0xb1, 0x00, 0x89, 0x12, 0xe0, 0x41, 0x7e, + 0x29, 0xb1, 0x40, 0x89, 0x0e, 0xe0, 0x81, 0x7e, 0x29, 0xb1, 0x80, 0x89, + 0x0a, 0xe0, 0xc1, 0x7e, 0x29, 0xb1, 0xc0, 0x89, 0x06, 0xe0, 0x01, 0x7f, + 0x31, 0xb1, 0x00, 0x8a, 0x02, 0xe0, 0x41, 0x7f, 0x11, 0xb1, 0x40, 0x8a, + 0x10, 0x80, 0x19, 0x70, 0x70, 0x47, 0x00, 0xbf, 0x70, 0xb5, 0x0c, 0x46, + 0x05, 0x46, 0x00, 0xf0, 0xb1, 0xf8, 0x0f, 0x48, 0xa1, 0x79, 0xe2, 0x79, + 0x2b, 0x46, 0x06, 0x68, 0x01, 0x20, 0xb0, 0x47, 0xa0, 0xb1, 0xd0, 0xf8, + 0x3c, 0x11, 0x89, 0xb1, 0x05, 0x22, 0x89, 0x7f, 0x80, 0xf8, 0x54, 0x21, + 0x90, 0xf8, 0x20, 0x21, 0x80, 0xf8, 0xcd, 0x11, 0xb2, 0xfb, 0xf1, 0xf3, + 0x03, 0xfb, 0x11, 0x21, 0x80, 0xf8, 0x56, 0x31, 0x19, 0x44, 0x01, 0x39, + 0x80, 0xf8, 0x55, 0x11, 0x70, 0xbd, 0x00, 0xbf, 0xf8, 0x9b, 0x08, 0x00, + 0x0b, 0x49, 0x91, 0xf8, 0xa4, 0x22, 0x02, 0xf0, 0x21, 0x02, 0x21, 0x2a, + 0x08, 0xd1, 0x42, 0xb2, 0xb2, 0xf1, 0xff, 0x3f, 0x06, 0xdd, 0x07, 0x49, + 0x08, 0x5c, 0x07, 0x49, 0x08, 0x5c, 0x04, 0xe0, 0x0a, 0x20, 0x02, 0xe0, + 0x91, 0xf8, 0xc8, 0x02, 0x05, 0x30, 0xc0, 0xb2, 0x70, 0x47, 0x00, 0xbf, + 0xe8, 0x65, 0x08, 0x00, 0xd7, 0x5b, 0x07, 0x10, 0xcd, 0x0d, 0x01, 0x00, + 0x2d, 0xe9, 0xf8, 0x43, 0xdf, 0xf8, 0xa4, 0x80, 0x04, 0x46, 0x40, 0x78, + 0xd8, 0xf8, 0x00, 0x10, 0xc0, 0xeb, 0x00, 0x12, 0x01, 0xeb, 0x42, 0x12, + 0x02, 0xf5, 0xea, 0x75, 0x92, 0xf8, 0xd5, 0x31, 0x02, 0xf5, 0xe8, 0x72, + 0x15, 0xf8, 0x02, 0x6b, 0x46, 0xea, 0x03, 0x23, 0x2e, 0x78, 0x6d, 0x78, + 0x46, 0xea, 0x05, 0x25, 0x43, 0xea, 0x05, 0x46, 0x96, 0x42, 0x2a, 0xd0, + 0x1c, 0x4f, 0xdf, 0xf8, 0x74, 0x90, 0x96, 0xf8, 0x24, 0x20, 0x01, 0x2a, + 0x0f, 0xd1, 0x38, 0x68, 0x80, 0x47, 0x48, 0xb3, 0x02, 0x46, 0x16, 0xf8, + 0xb4, 0x0c, 0xd9, 0xf8, 0x00, 0x50, 0x00, 0x23, 0x10, 0x71, 0x49, 0x20, + 0xb1, 0x68, 0xa8, 0x47, 0x60, 0x78, 0xd8, 0xf8, 0x00, 0x10, 0x16, 0xf8, + 0x04, 0x2f, 0x73, 0x78, 0xb5, 0x78, 0xf6, 0x78, 0x42, 0xea, 0x03, 0x22, + 0x45, 0xea, 0x06, 0x23, 0x42, 0xea, 0x03, 0x46, 0xc2, 0xb2, 0xc2, 0xeb, + 0x02, 0x12, 0x01, 0xeb, 0x42, 0x12, 0x02, 0xf5, 0xe8, 0x72, 0x96, 0x42, + 0xd7, 0xd1, 0x94, 0xf8, 0x04, 0x01, 0x40, 0xf0, 0x08, 0x00, 0x84, 0xf8, + 0x04, 0x01, 0x00, 0x20, 0xbd, 0xe8, 0xf8, 0x83, 0x07, 0x20, 0xbd, 0xe8, + 0xf8, 0x83, 0x00, 0xbf, 0xe0, 0x35, 0x01, 0x00, 0x48, 0xb5, 0x08, 0x00, + 0x80, 0x9b, 0x08, 0x00, 0x04, 0x48, 0x05, 0x49, 0x01, 0x60, 0x05, 0x48, + 0x05, 0x49, 0x01, 0x60, 0x05, 0x48, 0x06, 0x49, 0x01, 0x60, 0x70, 0x47, + 0x50, 0xce, 0x08, 0x00, 0x65, 0xb5, 0x03, 0x00, 0xc0, 0xc6, 0x08, 0x00, + 0x19, 0xb5, 0x03, 0x00, 0x5c, 0xb9, 0x08, 0x00, 0xa1, 0xb5, 0x03, 0x00, + 0x4a, 0xf6, 0x21, 0x4c, 0xc1, 0xf2, 0x08, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x7f, 0xb5, 0x04, 0x46, 0x00, 0x20, 0x8d, 0xf8, 0x05, 0x10, 0xad, 0xf8, + 0x0c, 0x00, 0x94, 0xf8, 0x2d, 0x03, 0x94, 0xf8, 0x35, 0x31, 0x04, 0xf2, + 0x2d, 0x35, 0x12, 0x28, 0x8d, 0xf8, 0x06, 0x30, 0x8d, 0xf8, 0x04, 0x00, + 0x0d, 0xd8, 0xdf, 0xe8, 0x00, 0xf0, 0x20, 0x1a, 0x33, 0x33, 0x33, 0x0a, + 0x22, 0x24, 0x26, 0x33, 0x28, 0x1a, 0x33, 0x33, 0x33, 0x0a, 0x2a, 0x0a, + 0x0a, 0x00, 0x5b, 0x48, 0x20, 0xe0, 0x82, 0x38, 0x0c, 0x28, 0x23, 0xd8, + 0xdf, 0xe8, 0x00, 0xf0, 0x07, 0x0b, 0x0d, 0x22, 0x22, 0x22, 0x22, 0x1b, + 0x22, 0x22, 0x07, 0x0b, 0x0d, 0x00, 0x57, 0x48, 0x12, 0xe0, 0x57, 0x48, + 0x10, 0xe0, 0x54, 0x48, 0x0e, 0xe0, 0x52, 0x48, 0x0c, 0xe0, 0x55, 0x48, + 0x0a, 0xe0, 0x4b, 0x48, 0x08, 0xe0, 0x4d, 0x48, 0x06, 0xe0, 0x4b, 0x48, + 0x04, 0xe0, 0x47, 0x48, 0x02, 0xe0, 0x45, 0x48, 0x00, 0xe0, 0x47, 0x48, + 0x06, 0x68, 0x03, 0xa8, 0x2b, 0x46, 0x00, 0x90, 0x20, 0x46, 0xb0, 0x47, + 0xd4, 0xf8, 0x34, 0x03, 0x01, 0x07, 0x12, 0xd5, 0x95, 0xf9, 0x00, 0x10, + 0xb1, 0xf1, 0xff, 0x3f, 0x1b, 0xdd, 0x48, 0x48, 0x94, 0xf8, 0x39, 0x20, + 0x02, 0x21, 0xc0, 0x23, 0x06, 0x68, 0x20, 0x46, 0xb0, 0x47, 0xd4, 0xf8, + 0x34, 0x03, 0x20, 0xf0, 0x08, 0x00, 0xc4, 0xf8, 0x34, 0x03, 0xd4, 0xf8, + 0xd4, 0x20, 0x94, 0xf8, 0x2d, 0x13, 0x52, 0x7f, 0x59, 0xb9, 0x00, 0x21, + 0x00, 0x2a, 0x14, 0xbf, 0x84, 0xf8, 0x3c, 0x13, 0x84, 0xf8, 0x3b, 0x13, + 0x12, 0xe0, 0xd4, 0xf8, 0xd4, 0x20, 0xc9, 0xb2, 0x52, 0x7f, 0x00, 0x2a, + 0x4f, 0xf0, 0x03, 0x02, 0x14, 0xbf, 0x84, 0xf8, 0x3c, 0x23, 0x84, 0xf8, + 0x3b, 0x23, 0x10, 0x29, 0x2d, 0xd8, 0x01, 0x22, 0x33, 0x4b, 0x8a, 0x40, + 0x1a, 0x42, 0x28, 0xd0, 0x20, 0xf0, 0x40, 0x00, 0x0f, 0x29, 0xc4, 0xf8, + 0x34, 0x03, 0x01, 0xd0, 0x05, 0x29, 0x02, 0xd1, 0x40, 0xf4, 0x00, 0x60, + 0x01, 0xe0, 0x20, 0xf4, 0x00, 0x60, 0xc4, 0xf8, 0x34, 0x03, 0x9d, 0xf8, + 0x0d, 0x00, 0x02, 0x28, 0x03, 0xd0, 0x01, 0x28, 0x07, 0xd1, 0x29, 0x48, + 0x00, 0xe0, 0x27, 0x48, 0x02, 0x68, 0x9d, 0xf8, 0x0c, 0x10, 0x20, 0x46, + 0x90, 0x47, 0x28, 0x78, 0x78, 0xb9, 0x9d, 0xf8, 0x04, 0x00, 0x58, 0xb1, + 0x23, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x94, 0xf8, 0x2d, 0x03, + 0x05, 0xe0, 0x83, 0x29, 0xd4, 0xd0, 0x40, 0xf0, 0x40, 0x00, 0xd3, 0xe7, + 0x00, 0x20, 0x8d, 0xf8, 0x07, 0x00, 0xd4, 0xf8, 0x88, 0x00, 0x01, 0xaa, + 0x00, 0x21, 0x05, 0x23, 0x00, 0x25, 0xc0, 0xf3, 0x41, 0x40, 0x8d, 0xf8, + 0x08, 0x00, 0x18, 0x48, 0x04, 0x68, 0x40, 0xf2, 0x05, 0x20, 0xa0, 0x47, + 0x9d, 0xf8, 0x0d, 0x10, 0x9d, 0xf8, 0x0c, 0x00, 0x00, 0x29, 0x18, 0xbf, + 0x28, 0x46, 0xc0, 0xb2, 0x04, 0xb0, 0x70, 0xbd, 0xf8, 0xc3, 0x08, 0x00, + 0xf4, 0xc3, 0x08, 0x00, 0xf0, 0xc3, 0x08, 0x00, 0xec, 0xc3, 0x08, 0x00, + 0xe8, 0xc3, 0x08, 0x00, 0xe4, 0xc3, 0x08, 0x00, 0xe0, 0xc3, 0x08, 0x00, + 0xdc, 0xc3, 0x08, 0x00, 0xd8, 0xc3, 0x08, 0x00, 0xd4, 0xc3, 0x08, 0x00, + 0xd0, 0xc3, 0x08, 0x00, 0xcc, 0xc3, 0x08, 0x00, 0x98, 0x9b, 0x08, 0x00, + 0x83, 0x04, 0x01, 0x00, 0x40, 0xc3, 0x08, 0x00, 0x38, 0xc7, 0x08, 0x00, + 0x10, 0xb5, 0x08, 0x00, 0x78, 0x9b, 0x08, 0x00, 0xf0, 0xb5, 0x85, 0xb0, + 0x40, 0x4f, 0x04, 0x46, 0x38, 0x68, 0x04, 0x90, 0x3f, 0x48, 0x00, 0x78, + 0xc0, 0x07, 0x01, 0xd1, 0x1a, 0x20, 0x6e, 0xe0, 0x3d, 0x48, 0x0d, 0x46, + 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0x40, 0xb1, 0x3b, 0x48, 0x21, 0x46, + 0x2a, 0x46, 0x01, 0x23, 0x06, 0x68, 0x8b, 0x20, 0xb0, 0x47, 0x24, 0x20, + 0x5f, 0xe0, 0x38, 0x48, 0x10, 0x21, 0x00, 0x22, 0x03, 0x68, 0x20, 0x46, + 0x98, 0x47, 0x01, 0x20, 0x10, 0x21, 0x84, 0xf8, 0x22, 0x01, 0x04, 0xf5, + 0x1a, 0x70, 0xe8, 0xf7, 0xf9, 0xf9, 0xe5, 0xf7, 0xa9, 0xfb, 0xc4, 0xf8, + 0x7c, 0x02, 0x25, 0xb9, 0x00, 0x20, 0x4f, 0xf4, 0xb4, 0x71, 0xe5, 0xf7, + 0x95, 0xfb, 0x2d, 0x4e, 0xd4, 0xf8, 0x80, 0x02, 0x05, 0xf1, 0x0f, 0x01, + 0x08, 0x22, 0x33, 0x68, 0x0c, 0x30, 0x98, 0x47, 0x04, 0xf5, 0x8c, 0x70, + 0x05, 0xf1, 0x17, 0x02, 0x08, 0x21, 0x04, 0x23, 0xe5, 0xf7, 0x96, 0xfb, + 0x25, 0x48, 0x6d, 0x46, 0x01, 0x68, 0x28, 0x46, 0x88, 0x47, 0xd4, 0xf8, + 0x80, 0x02, 0x33, 0x68, 0x29, 0x46, 0x08, 0x22, 0x04, 0x30, 0x98, 0x47, + 0x05, 0xf1, 0x08, 0x06, 0x04, 0xf5, 0x8e, 0x70, 0x04, 0x21, 0x04, 0x23, + 0x32, 0x46, 0xe5, 0xf7, 0x81, 0xfb, 0x1c, 0x48, 0x29, 0x46, 0x32, 0x46, + 0x03, 0x68, 0x20, 0x46, 0x98, 0x47, 0x94, 0xf8, 0x2d, 0x03, 0x06, 0x28, + 0x03, 0xd1, 0x18, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x17, 0x48, + 0xc0, 0x79, 0x80, 0x06, 0x03, 0xd5, 0x16, 0x48, 0x00, 0x78, 0xc0, 0x06, + 0x01, 0xd4, 0x06, 0x20, 0x09, 0xe0, 0x14, 0x49, 0x94, 0xf8, 0x35, 0x01, + 0x0b, 0x68, 0xd4, 0xf8, 0x80, 0x12, 0x8a, 0x8d, 0x24, 0x31, 0x98, 0x47, + 0x00, 0x20, 0x39, 0x68, 0x04, 0x9a, 0x89, 0x1a, 0x04, 0xbf, 0x05, 0xb0, + 0xf0, 0xbd, 0xeb, 0xf7, 0x95, 0xf9, 0x00, 0xbf, 0x38, 0xec, 0x01, 0x00, + 0x70, 0x52, 0x01, 0x00, 0x88, 0xc6, 0x08, 0x00, 0x80, 0x9b, 0x08, 0x00, + 0xc0, 0x9b, 0x08, 0x00, 0x10, 0x9e, 0x08, 0x00, 0xd8, 0x9b, 0x08, 0x00, + 0x80, 0xc6, 0x08, 0x00, 0x0c, 0x9e, 0x08, 0x00, 0xc8, 0x52, 0x01, 0x00, + 0x78, 0x52, 0x01, 0x00, 0x10, 0xc6, 0x08, 0x00, 0x03, 0x48, 0x04, 0x49, + 0x01, 0x60, 0x04, 0x48, 0x04, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0xb8, 0xc3, 0x08, 0x00, 0x6d, 0xb8, 0x03, 0x00, 0xec, 0xc7, 0x08, 0x00, + 0x91, 0xb6, 0x03, 0x00, 0x06, 0x49, 0x4f, 0xf4, 0xa8, 0x72, 0x09, 0x68, + 0x10, 0xfb, 0x02, 0x11, 0x91, 0xf9, 0x62, 0x10, 0x00, 0x29, 0x01, 0xd4, + 0x00, 0xf0, 0x0c, 0xb8, 0x70, 0x47, 0x00, 0xbf, 0xdc, 0x35, 0x01, 0x00, + 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, 0x04, 0xc7, 0x08, 0x00, + 0xc5, 0xb9, 0x03, 0x00, 0x48, 0xf2, 0x8d, 0x6c, 0xc1, 0xf2, 0x08, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x73, 0x48, 0x00, 0x21, 0x01, 0x70, 0x71, 0x48, + 0x4f, 0xf0, 0xff, 0x31, 0x01, 0x60, 0x70, 0x47, 0xf8, 0xb5, 0x00, 0x28, + 0x41, 0xd0, 0x04, 0x46, 0xd0, 0xf8, 0x00, 0x01, 0xe8, 0xb3, 0x68, 0x49, + 0x0a, 0x7b, 0xd2, 0x07, 0x39, 0xd0, 0xb5, 0x4b, 0x4a, 0x7b, 0x1b, 0x78, + 0x93, 0x42, 0x34, 0xd9, 0x64, 0x4b, 0x1b, 0x78, 0x01, 0x2b, 0x30, 0xd0, + 0x63, 0x4b, 0x1b, 0x78, 0x01, 0x2b, 0x2c, 0xd0, 0x90, 0xf8, 0x35, 0x31, + 0x99, 0x4d, 0x68, 0x26, 0x13, 0xfb, 0x06, 0x53, 0x24, 0x4e, 0x5b, 0x79, + 0x36, 0x78, 0x16, 0xb1, 0x02, 0x2b, 0x02, 0xd1, 0x1f, 0xe0, 0x01, 0x2b, + 0x1d, 0xd1, 0x90, 0xf8, 0x4e, 0x33, 0x9b, 0x07, 0x03, 0xd5, 0xa3, 0x4b, + 0x1b, 0x79, 0x9b, 0x07, 0x03, 0xd4, 0x94, 0xf8, 0x40, 0x31, 0x93, 0x42, + 0x11, 0xd3, 0x94, 0xf8, 0x46, 0x21, 0x72, 0xb1, 0x94, 0xf8, 0x20, 0x31, + 0x94, 0xf8, 0x47, 0x61, 0x89, 0x7b, 0xb3, 0xfb, 0xf2, 0xf7, 0x01, 0x3a, + 0x12, 0xfb, 0x07, 0xf2, 0xd2, 0x43, 0x16, 0xfb, 0x03, 0x22, 0x8a, 0x42, + 0x00, 0xda, 0xf8, 0xbd, 0x94, 0xf8, 0x4a, 0x21, 0x21, 0x46, 0x40, 0x23, + 0x04, 0x26, 0x04, 0x2a, 0x28, 0xbf, 0x32, 0x46, 0x00, 0xf0, 0x1a, 0xf8, + 0xd4, 0xf8, 0x00, 0x01, 0x68, 0x21, 0x90, 0xf8, 0x35, 0x01, 0x10, 0xfb, + 0x01, 0x50, 0x01, 0x21, 0x01, 0x71, 0x94, 0xf8, 0x4a, 0x11, 0x04, 0x29, + 0x38, 0xbf, 0x0e, 0x46, 0x00, 0xeb, 0xc6, 0x00, 0x00, 0x21, 0x41, 0x81, + 0x01, 0x81, 0xc1, 0x80, 0xbd, 0xe8, 0xf8, 0x40, 0x00, 0xf0, 0x4a, 0xb8, + 0xe0, 0x0e, 0x01, 0x00, 0xbf, 0xb5, 0x00, 0x24, 0xad, 0xf8, 0x06, 0x30, + 0x8d, 0xf8, 0x04, 0x40, 0x33, 0x4c, 0x64, 0x7b, 0x8d, 0xf8, 0x0c, 0x40, + 0x7f, 0x4c, 0x65, 0x7a, 0xed, 0x07, 0x01, 0xd1, 0x7e, 0x4c, 0x05, 0xe0, + 0x15, 0x46, 0x04, 0x2a, 0x28, 0xbf, 0x04, 0x25, 0x2c, 0x44, 0x0a, 0x34, + 0x24, 0x78, 0x8d, 0xf8, 0x0b, 0x40, 0x90, 0xf8, 0x35, 0x41, 0x8d, 0xf8, + 0x08, 0x40, 0x90, 0xf8, 0x4e, 0x43, 0xa4, 0x07, 0x51, 0xbf, 0x00, 0x24, + 0x72, 0x4c, 0x24, 0x79, 0xc4, 0xf3, 0x40, 0x04, 0x8d, 0xf8, 0x09, 0x20, + 0x00, 0xeb, 0xc2, 0x02, 0x8d, 0xf8, 0x0d, 0x40, 0x92, 0xf8, 0xbc, 0x23, + 0x8d, 0xf8, 0x0a, 0x20, 0x1a, 0x06, 0x01, 0xea, 0xe2, 0x71, 0x00, 0xf0, + 0x45, 0xf8, 0x8d, 0xf8, 0x0e, 0x00, 0x04, 0x48, 0x01, 0xaa, 0x00, 0x21, + 0x0c, 0x23, 0x04, 0x68, 0x40, 0xf2, 0x42, 0x20, 0xa0, 0x47, 0xbf, 0xbd, + 0x78, 0x9b, 0x08, 0x00, 0x00, 0x21, 0x81, 0x80, 0x41, 0x80, 0x01, 0x80, + 0x70, 0x47, 0x00, 0xbf, 0x7c, 0xb5, 0x12, 0x4c, 0x20, 0x7b, 0xc0, 0x07, + 0x1f, 0xd0, 0x5f, 0x49, 0x60, 0x7b, 0x09, 0x78, 0x81, 0x42, 0x1a, 0xd9, + 0x0e, 0x48, 0x00, 0x78, 0x01, 0x28, 0x16, 0xd0, 0x0d, 0x48, 0x00, 0x78, + 0x01, 0x28, 0x12, 0xd0, 0x0c, 0x4d, 0x28, 0x68, 0x01, 0x30, 0x0e, 0xd1, + 0x0b, 0x48, 0x00, 0x26, 0x06, 0x70, 0xe5, 0xf7, 0x35, 0xfa, 0x28, 0x60, + 0x09, 0x48, 0x22, 0x8b, 0x00, 0x21, 0xcd, 0xe9, 0x00, 0x66, 0x05, 0x68, + 0x2b, 0x20, 0x13, 0x46, 0xa8, 0x47, 0x7c, 0xbd, 0x30, 0x32, 0x06, 0x00, + 0x54, 0x34, 0x01, 0x00, 0x63, 0x34, 0x01, 0x00, 0x50, 0xd3, 0x05, 0x00, + 0x2c, 0xe6, 0x05, 0x00, 0xcc, 0x9b, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x47, + 0x70, 0xb3, 0xdf, 0xf8, 0x68, 0x80, 0x05, 0x46, 0x98, 0xf8, 0x00, 0x00, + 0x40, 0xb3, 0x18, 0x4f, 0xdf, 0xf8, 0x60, 0xa0, 0x0c, 0x46, 0x00, 0x26, + 0x4f, 0xf0, 0x00, 0x09, 0x57, 0xf8, 0x26, 0x10, 0x99, 0xb1, 0x0c, 0xb1, + 0xa1, 0x42, 0x17, 0xd0, 0xd1, 0xf8, 0x00, 0x21, 0xaa, 0x42, 0x13, 0xd1, + 0x91, 0xf8, 0x1d, 0x11, 0xda, 0xf8, 0x00, 0x20, 0xc1, 0xeb, 0x01, 0x11, + 0x49, 0x01, 0x51, 0x5c, 0x02, 0x29, 0x38, 0xbf, 0x09, 0xf1, 0x01, 0x09, + 0x06, 0xe0, 0x00, 0x20, 0x40, 0xf2, 0x05, 0x21, 0xeb, 0xf7, 0x48, 0xf8, + 0x98, 0xf8, 0x00, 0x00, 0x01, 0x36, 0x86, 0x42, 0xde, 0xd3, 0x01, 0xe0, + 0x4f, 0xf0, 0x00, 0x09, 0x5f, 0xfa, 0x89, 0xf0, 0xbd, 0xe8, 0xf0, 0x87, + 0xd4, 0x58, 0x01, 0x00, 0x14, 0x58, 0x01, 0x00, 0xe0, 0x35, 0x01, 0x00, + 0x70, 0xb5, 0xd8, 0xb1, 0xd0, 0xf8, 0x00, 0x41, 0x05, 0x46, 0xbc, 0xb1, + 0x94, 0xf8, 0x35, 0x01, 0x11, 0x4e, 0x68, 0x21, 0x10, 0xfb, 0x01, 0x60, + 0x00, 0x79, 0x01, 0x28, 0x0e, 0xd1, 0x95, 0xf8, 0x4a, 0x21, 0x20, 0x46, + 0x29, 0x46, 0x80, 0x23, 0x04, 0x2a, 0x28, 0xbf, 0x04, 0x22, 0xff, 0xf7, + 0x2f, 0xff, 0x20, 0x46, 0x29, 0x46, 0xff, 0xf7, 0xa5, 0xff, 0x00, 0xb1, + 0x70, 0xbd, 0x94, 0xf8, 0x35, 0x01, 0x68, 0x21, 0x10, 0xfb, 0x01, 0x60, + 0x00, 0x21, 0x01, 0x71, 0x20, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x00, 0xf0, + 0x03, 0xb8, 0x00, 0xbf, 0xb0, 0xe6, 0x05, 0x00, 0x0f, 0x4a, 0x0e, 0x49, + 0x13, 0x68, 0x90, 0xf8, 0x4e, 0x23, 0x01, 0xf5, 0x6b, 0x71, 0x92, 0x07, + 0x10, 0xd5, 0x0c, 0x4a, 0x12, 0x79, 0x92, 0x07, 0x0c, 0xd5, 0x0b, 0x49, + 0x4a, 0x7a, 0xd2, 0x07, 0x01, 0xd1, 0x0a, 0x49, 0x06, 0xe0, 0x90, 0xf8, + 0xf2, 0x22, 0x04, 0x2a, 0x28, 0xbf, 0x04, 0x22, 0x11, 0x44, 0x0a, 0x31, + 0x09, 0x78, 0x01, 0x22, 0x18, 0x47, 0x00, 0xbf, 0x8c, 0x7e, 0x08, 0x00, + 0x00, 0x9c, 0x08, 0x00, 0x70, 0x52, 0x01, 0x00, 0xcc, 0x2c, 0x06, 0x00, + 0x6a, 0x34, 0x01, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, 0x8f, 0xb0, 0xdf, 0xf8, + 0xcc, 0x23, 0x12, 0xf8, 0x0c, 0x0f, 0xc0, 0x07, 0x00, 0xf0, 0xd9, 0x81, + 0xdf, 0xf8, 0xc0, 0x13, 0x50, 0x78, 0x09, 0x78, 0x81, 0x42, 0x40, 0xf2, + 0xd2, 0x81, 0xdf, 0xf8, 0xb8, 0x03, 0x00, 0x78, 0x01, 0x28, 0x00, 0xf0, + 0xcc, 0x81, 0xdf, 0xf8, 0xb0, 0x03, 0x00, 0x78, 0x01, 0x28, 0x00, 0xf0, + 0xc6, 0x81, 0xdf, 0xf8, 0xa8, 0x03, 0x01, 0x78, 0x01, 0x31, 0x01, 0x70, + 0xdf, 0xf8, 0xa0, 0x03, 0x90, 0xf8, 0x00, 0xc0, 0xbc, 0xf1, 0x00, 0x0f, + 0x00, 0xf0, 0xb9, 0x81, 0xe5, 0x4c, 0xdf, 0xf8, 0xa0, 0xa3, 0xdf, 0xf8, + 0xa0, 0x53, 0x0d, 0xae, 0x00, 0x27, 0x4f, 0xf0, 0x00, 0x08, 0x07, 0x92, + 0x20, 0x68, 0x00, 0x28, 0x00, 0xf0, 0xa5, 0x81, 0x90, 0xf8, 0x35, 0x11, + 0xde, 0x4a, 0x68, 0x23, 0x11, 0xfb, 0x03, 0x21, 0x09, 0x79, 0x01, 0x29, + 0x40, 0xf0, 0x9b, 0x81, 0x0a, 0x90, 0x00, 0x20, 0x44, 0x21, 0x8d, 0xf8, + 0x38, 0x00, 0x0d, 0x90, 0xd8, 0x48, 0xe7, 0xf7, 0xd9, 0xfa, 0x9a, 0xf8, + 0x00, 0x00, 0xcd, 0xe9, 0x00, 0x74, 0xcd, 0xf8, 0x08, 0x80, 0x00, 0x28, + 0x6c, 0xd0, 0x07, 0x9c, 0xdd, 0xf8, 0x28, 0xe0, 0x00, 0x21, 0x4f, 0xf0, + 0xff, 0x0b, 0x00, 0x27, 0x4f, 0xf0, 0x7f, 0x08, 0x04, 0x91, 0x55, 0xf8, + 0x27, 0x10, 0x00, 0x29, 0x4b, 0xd0, 0xd1, 0xf8, 0x00, 0x21, 0x72, 0x45, + 0x4f, 0xd1, 0xcd, 0x4a, 0x91, 0xf8, 0x1d, 0x31, 0xc3, 0xeb, 0x03, 0x13, + 0x12, 0x68, 0x5b, 0x01, 0xd2, 0x5c, 0x01, 0x2a, 0x45, 0xd8, 0x91, 0xf8, + 0x1c, 0x21, 0x01, 0x2a, 0x41, 0xd1, 0x91, 0xf8, 0x4a, 0x31, 0x01, 0x22, + 0x91, 0xf8, 0x46, 0xc1, 0x04, 0x25, 0x4f, 0xfa, 0x88, 0xf4, 0x04, 0x2b, + 0x28, 0xbf, 0x2b, 0x46, 0xf2, 0x54, 0x91, 0xf9, 0x42, 0x21, 0x94, 0x42, + 0xa8, 0xbf, 0x90, 0x46, 0x9e, 0xf8, 0xf2, 0x22, 0x04, 0x2a, 0x28, 0xbf, + 0x2a, 0x46, 0x9a, 0x42, 0x04, 0x9a, 0x08, 0xbf, 0x01, 0x22, 0xbc, 0xf1, + 0x00, 0x0f, 0x04, 0x92, 0x27, 0xd0, 0x91, 0xf8, 0x20, 0x31, 0xac, 0xf1, + 0x01, 0x02, 0x91, 0xf8, 0x47, 0xe1, 0x5f, 0xfa, 0x8b, 0xf4, 0xb3, 0xfb, + 0xfc, 0xf5, 0x12, 0xfb, 0x05, 0xf1, 0xc9, 0x43, 0x13, 0xfb, 0x0e, 0x11, + 0xa1, 0x42, 0xde, 0xbf, 0x15, 0xfb, 0x02, 0xf1, 0xc9, 0x43, 0x13, 0xfb, + 0x0e, 0x1b, 0x07, 0x9c, 0xf0, 0x4d, 0xdd, 0xf8, 0x28, 0xe0, 0x01, 0x21, + 0x10, 0xe0, 0x00, 0x20, 0xd1, 0x21, 0xea, 0xf7, 0x2f, 0xff, 0xdd, 0xf8, + 0x28, 0xe0, 0x9a, 0xf8, 0x00, 0x00, 0x01, 0x37, 0x87, 0x42, 0xa4, 0xd3, + 0x0f, 0xe0, 0x01, 0x21, 0x07, 0x9c, 0xe7, 0x4d, 0x4f, 0xf0, 0x00, 0x0b, + 0x02, 0x91, 0xf4, 0xe7, 0x07, 0x9c, 0xdd, 0xf8, 0x28, 0xe0, 0x00, 0x20, + 0x4f, 0xf0, 0x7f, 0x08, 0x4f, 0xf0, 0xff, 0x0b, 0x04, 0x90, 0x4f, 0xfa, + 0x88, 0xf0, 0x0e, 0xf5, 0x6f, 0x75, 0x4f, 0xf0, 0x00, 0x08, 0x4f, 0xf0, + 0x06, 0x0a, 0x4f, 0xf0, 0x00, 0x09, 0x0b, 0xaf, 0xcd, 0xf8, 0x0c, 0xb0, + 0x08, 0x90, 0x00, 0x20, 0x09, 0x95, 0x05, 0x90, 0x00, 0x20, 0x06, 0x90, + 0x16, 0xf8, 0x08, 0x00, 0x00, 0x28, 0x00, 0xf0, 0xcf, 0x80, 0x15, 0xf8, + 0x38, 0x00, 0x61, 0x78, 0x88, 0x42, 0xc0, 0xf0, 0xc9, 0x80, 0x9e, 0xf8, + 0x35, 0x01, 0x68, 0x21, 0x08, 0x23, 0x10, 0xfb, 0x01, 0xa0, 0x85, 0x49, + 0x0a, 0x18, 0x38, 0x46, 0x08, 0x21, 0xe5, 0xf7, 0x9d, 0xf8, 0x7c, 0x48, + 0x09, 0x9d, 0x94, 0xf9, 0x09, 0x20, 0x21, 0x7a, 0x08, 0x9b, 0x15, 0xf8, + 0x38, 0xb0, 0x00, 0x78, 0xa0, 0xeb, 0x0b, 0x00, 0x10, 0xfb, 0x01, 0x22, + 0x9a, 0x42, 0x02, 0xdd, 0x0a, 0x9b, 0x0a, 0x24, 0x52, 0xe0, 0xbd, 0xf8, + 0x2e, 0x20, 0xbd, 0xf8, 0x2c, 0x30, 0x1a, 0x44, 0xbd, 0xf8, 0x30, 0x30, + 0xd7, 0x18, 0xe3, 0x89, 0x9f, 0x42, 0x03, 0xd2, 0xdd, 0xf8, 0x28, 0xe0, + 0x0b, 0xaf, 0x9b, 0xe0, 0x03, 0x9b, 0x94, 0xf8, 0x03, 0xc0, 0xa5, 0x1d, + 0x5f, 0xfa, 0x83, 0xfe, 0x64, 0x23, 0x5a, 0x43, 0xe6, 0x45, 0x38, 0xbf, + 0x25, 0x1d, 0xb2, 0xfb, 0xf7, 0xf2, 0x2d, 0x78, 0xd2, 0xb2, 0xaa, 0x42, + 0x02, 0xd9, 0x0a, 0x9b, 0x12, 0x24, 0x2c, 0xe0, 0xe5, 0x1d, 0xe6, 0x45, + 0x38, 0xbf, 0x65, 0x1d, 0x2b, 0x78, 0x9a, 0x42, 0x1a, 0xd2, 0x10, 0xfb, + 0x01, 0xf0, 0x94, 0xf9, 0x0a, 0x10, 0x08, 0x44, 0x08, 0x99, 0x88, 0x42, + 0x12, 0xda, 0x0a, 0x9b, 0x5f, 0x49, 0x68, 0x22, 0x93, 0xf8, 0x35, 0x01, + 0x10, 0xfb, 0x02, 0x10, 0x00, 0xeb, 0xc8, 0x00, 0x01, 0x7b, 0x01, 0x31, + 0x01, 0x73, 0xc8, 0xb2, 0x21, 0x7c, 0x1c, 0x24, 0x88, 0x42, 0x38, 0xbf, + 0x00, 0x24, 0x0a, 0xe0, 0x0a, 0x9b, 0x56, 0x49, 0x68, 0x22, 0x00, 0x24, + 0x93, 0xf8, 0x35, 0x01, 0x10, 0xfb, 0x02, 0x10, 0x00, 0xeb, 0xc8, 0x00, + 0x04, 0x73, 0x4f, 0xf0, 0x00, 0x09, 0x0b, 0xaf, 0x93, 0xf8, 0x35, 0x01, + 0x4e, 0x49, 0x68, 0x22, 0x10, 0xfb, 0x02, 0x10, 0x00, 0xeb, 0xc8, 0x00, + 0x01, 0x7b, 0x8d, 0xf8, 0x32, 0x10, 0x8c, 0xb3, 0x80, 0xf8, 0x0c, 0x90, + 0xa0, 0x07, 0x0d, 0xd5, 0x4c, 0x48, 0x10, 0xf8, 0x09, 0x1f, 0xc9, 0x07, + 0x40, 0x44, 0x3f, 0x49, 0x18, 0xbf, 0x41, 0x1c, 0x08, 0x78, 0x83, 0x45, + 0x02, 0xd2, 0x0b, 0xf1, 0x01, 0x0b, 0x08, 0xe0, 0x60, 0x07, 0x13, 0xd5, + 0x07, 0x98, 0x40, 0x78, 0x83, 0x45, 0x88, 0xbf, 0xab, 0xf1, 0x01, 0x0b, + 0x0c, 0xd9, 0x18, 0x46, 0x5f, 0xfa, 0x88, 0xf1, 0x5f, 0xfa, 0x8b, 0xf2, + 0x00, 0x23, 0x00, 0xf0, 0x7d, 0xf8, 0x0a, 0x9b, 0x44, 0xf0, 0x01, 0x04, + 0x01, 0x20, 0x05, 0x90, 0x06, 0x9a, 0x5f, 0xfa, 0x8b, 0xf0, 0xd1, 0xb2, + 0x81, 0x42, 0x88, 0xbf, 0x93, 0x46, 0xcd, 0xf8, 0x18, 0xb0, 0x00, 0xe0, + 0x00, 0x24, 0x18, 0x46, 0x5f, 0xfa, 0x88, 0xf1, 0x22, 0x46, 0x3b, 0x46, + 0x00, 0xf0, 0xf0, 0xf8, 0xdd, 0xf8, 0x28, 0xe0, 0x2b, 0x49, 0x68, 0x22, + 0x07, 0x9c, 0x09, 0x9d, 0x9e, 0xf8, 0x35, 0x01, 0x10, 0xfb, 0x02, 0x10, + 0x00, 0xeb, 0xc8, 0x00, 0xa0, 0xf8, 0x0a, 0x90, 0xa0, 0xf8, 0x08, 0x90, + 0xa0, 0xf8, 0x06, 0x90, 0x08, 0xf1, 0x01, 0x08, 0x0a, 0xf1, 0x08, 0x0a, + 0xb8, 0xf1, 0x05, 0x0f, 0x7f, 0xf4, 0x24, 0xaf, 0x05, 0x98, 0xa0, 0xb1, + 0x04, 0x98, 0x00, 0x06, 0x11, 0xd1, 0x06, 0x98, 0xc2, 0xb2, 0x9e, 0xf8, + 0x74, 0x00, 0x90, 0x42, 0x0b, 0xd2, 0x9e, 0xf8, 0xf2, 0x12, 0x04, 0x20, + 0x00, 0x23, 0x04, 0x29, 0x28, 0xbf, 0x01, 0x46, 0x70, 0x46, 0x00, 0xf0, + 0x37, 0xf8, 0xdd, 0xf8, 0x28, 0xe0, 0x08, 0x99, 0x70, 0x46, 0x00, 0xf0, + 0xf3, 0xf8, 0x10, 0x48, 0x01, 0x9c, 0xdf, 0xf8, 0x4c, 0xa0, 0x59, 0x4d, + 0x00, 0x9f, 0xdd, 0xf8, 0x08, 0x80, 0x90, 0xf8, 0x00, 0xc0, 0x01, 0x37, + 0x04, 0x34, 0x67, 0x45, 0xff, 0xf4, 0x52, 0xae, 0x01, 0xe0, 0x4f, 0xf0, + 0x00, 0x08, 0x5f, 0xfa, 0x88, 0xf0, 0x0f, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x30, 0x32, 0x06, 0x00, 0x6a, 0x34, 0x01, 0x00, 0x54, 0x34, 0x01, 0x00, + 0x63, 0x34, 0x01, 0x00, 0x2c, 0xe6, 0x05, 0x00, 0x53, 0x34, 0x01, 0x00, + 0xb8, 0x57, 0x01, 0x00, 0xb0, 0xe6, 0x05, 0x00, 0x30, 0xe6, 0x05, 0x00, + 0xd4, 0x58, 0x01, 0x00, 0x14, 0x58, 0x01, 0x00, 0xe0, 0x35, 0x01, 0x00, + 0xcc, 0x2c, 0x06, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, 0xdf, 0xf8, 0xf8, 0x90, + 0x04, 0x29, 0x4f, 0xf0, 0x04, 0x07, 0x4f, 0xf0, 0x02, 0x0a, 0x14, 0x46, + 0x06, 0x46, 0x8b, 0x46, 0x4f, 0xf0, 0x04, 0x05, 0x38, 0xbf, 0x0f, 0x46, + 0x03, 0x29, 0x88, 0xbf, 0x4f, 0xf0, 0x03, 0x0a, 0x20, 0x46, 0x51, 0x46, + 0xd9, 0xf8, 0x00, 0x20, 0x90, 0x47, 0x06, 0xeb, 0xc7, 0x07, 0x80, 0x46, + 0xd9, 0xf8, 0x00, 0x20, 0x51, 0x46, 0x97, 0xf8, 0xbc, 0x03, 0x90, 0x47, + 0xa8, 0xeb, 0x00, 0x00, 0x97, 0xf8, 0xbc, 0x33, 0x59, 0x46, 0x83, 0x22, + 0x00, 0x94, 0x87, 0xf8, 0xbc, 0x43, 0x87, 0xf8, 0xbf, 0x03, 0x30, 0x46, + 0x14, 0xf0, 0x06, 0xfe, 0x96, 0xf8, 0xf2, 0x02, 0x04, 0x28, 0x38, 0xbf, + 0x05, 0x46, 0x5d, 0x45, 0x0d, 0xd1, 0x00, 0x99, 0x07, 0xf5, 0x6f, 0x70, + 0x00, 0x78, 0x86, 0xf8, 0x74, 0x10, 0x22, 0x49, 0x0a, 0x68, 0x51, 0x46, + 0x90, 0x47, 0x06, 0xeb, 0x4a, 0x01, 0xa1, 0xf8, 0x78, 0x00, 0x1f, 0x4c, + 0x20, 0x78, 0xa0, 0xb3, 0x1e, 0x4d, 0xdf, 0xf8, 0x7c, 0x90, 0x00, 0x27, + 0x55, 0xf8, 0x27, 0x80, 0xb8, 0xf1, 0x00, 0x0f, 0x22, 0xd0, 0xd8, 0xf8, + 0x00, 0x01, 0xb0, 0x42, 0x23, 0xd1, 0x98, 0xf8, 0x1d, 0x11, 0xd9, 0xf8, + 0x00, 0x00, 0xc1, 0xeb, 0x01, 0x11, 0x49, 0x01, 0x40, 0x5c, 0x01, 0x28, + 0x19, 0xd8, 0x98, 0xf8, 0x1c, 0x01, 0x01, 0x28, 0x15, 0xd1, 0x98, 0xf8, + 0x4a, 0x01, 0x04, 0x28, 0x28, 0xbf, 0x04, 0x20, 0x58, 0x45, 0x0e, 0xd1, + 0x0a, 0x49, 0x00, 0x98, 0x0a, 0x68, 0x51, 0x46, 0x88, 0xf8, 0x40, 0x01, + 0x90, 0x47, 0x88, 0xf8, 0x41, 0x01, 0x04, 0xe0, 0x00, 0x20, 0x40, 0xf2, + 0xa7, 0x11, 0xea, 0xf7, 0x63, 0xfd, 0x20, 0x78, 0x01, 0x37, 0x87, 0x42, + 0xce, 0xd3, 0xbd, 0xe8, 0xf8, 0x8f, 0x00, 0xbf, 0x34, 0x9c, 0x08, 0x00, + 0x38, 0x9c, 0x08, 0x00, 0xd4, 0x58, 0x01, 0x00, 0x14, 0x58, 0x01, 0x00, + 0xe0, 0x35, 0x01, 0x00, 0x2d, 0xe9, 0xf0, 0x47, 0x81, 0x46, 0x98, 0x46, + 0x14, 0x46, 0x0e, 0x46, 0xd0, 0x07, 0x03, 0xd1, 0x16, 0x48, 0x90, 0xf8, + 0x72, 0x01, 0x30, 0xb3, 0x26, 0x4f, 0xfd, 0x79, 0x07, 0xf1, 0x02, 0x0a, + 0x68, 0x1c, 0x05, 0x2d, 0xf8, 0x71, 0x04, 0xd3, 0x00, 0x20, 0x40, 0xf2, + 0x87, 0x21, 0xe4, 0xf7, 0xd7, 0xfe, 0x05, 0xeb, 0x45, 0x00, 0x04, 0x2e, + 0x42, 0x46, 0x4f, 0xf0, 0x08, 0x03, 0x07, 0xeb, 0x80, 0x00, 0x06, 0x72, + 0x44, 0x81, 0x28, 0xbf, 0x04, 0x26, 0x09, 0xeb, 0xc6, 0x01, 0x91, 0xf8, + 0xbc, 0x13, 0x41, 0x72, 0x0c, 0x30, 0x08, 0x21, 0xe4, 0xf7, 0xd4, 0xfe, + 0xba, 0xf8, 0x00, 0x00, 0x20, 0x43, 0xaa, 0xf8, 0x00, 0x00, 0xbd, 0xe8, + 0xf0, 0x87, 0x00, 0xbf, 0x8c, 0x7e, 0x08, 0x00, 0x10, 0xb5, 0x10, 0x4a, + 0xd3, 0x79, 0xe3, 0xb1, 0x91, 0x71, 0x0f, 0x49, 0x01, 0x24, 0x14, 0x70, + 0x09, 0x78, 0x51, 0x70, 0x90, 0xf8, 0x35, 0x11, 0x90, 0xf8, 0xf2, 0x02, + 0x11, 0x71, 0x04, 0x28, 0x28, 0xbf, 0x04, 0x20, 0x50, 0x71, 0x08, 0x21, + 0x03, 0xeb, 0x43, 0x00, 0x01, 0xeb, 0x80, 0x03, 0x06, 0x48, 0x00, 0x21, + 0xd0, 0xf8, 0x00, 0xc0, 0x40, 0xf2, 0x42, 0x20, 0xbd, 0xe8, 0x10, 0x40, + 0x60, 0x47, 0x10, 0xbd, 0x30, 0xe6, 0x05, 0x00, 0x2c, 0xe6, 0x05, 0x00, + 0x78, 0x9b, 0x08, 0x00, 0x7c, 0xb5, 0x40, 0x4c, 0x20, 0x7b, 0xc0, 0x07, + 0x1d, 0xd0, 0x3f, 0x49, 0x60, 0x7b, 0x09, 0x78, 0x81, 0x42, 0x18, 0xd9, + 0x3d, 0x48, 0x00, 0x78, 0x01, 0x28, 0x14, 0xd0, 0x3c, 0x48, 0x00, 0x78, + 0x01, 0x28, 0x10, 0xd0, 0xe4, 0xf7, 0x88, 0xfe, 0x3a, 0x4d, 0x22, 0x8b, + 0x00, 0x21, 0x28, 0x60, 0x26, 0x48, 0x13, 0x46, 0x06, 0x68, 0x00, 0x20, + 0xcd, 0xe9, 0x00, 0x00, 0x2b, 0x20, 0xb0, 0x47, 0xff, 0xf7, 0xf0, 0xfc, + 0x00, 0xb1, 0x7c, 0xbd, 0x4f, 0xf0, 0xff, 0x30, 0x00, 0x21, 0x28, 0x60, + 0x2b, 0x20, 0xbd, 0xe8, 0x7c, 0x40, 0xea, 0xf7, 0xcb, 0xbc, 0x00, 0xbf, + 0xbc, 0xb5, 0x29, 0x4c, 0x20, 0x7b, 0xc0, 0x07, 0x2d, 0xd0, 0x28, 0x49, + 0x60, 0x7b, 0x09, 0x78, 0x81, 0x42, 0x28, 0xd9, 0x26, 0x48, 0x00, 0x78, + 0x01, 0x28, 0x24, 0xd0, 0x25, 0x48, 0x00, 0x78, 0x01, 0x28, 0x20, 0xd0, + 0x24, 0x4d, 0x28, 0x68, 0x01, 0x30, 0x1c, 0xd0, 0xe4, 0xf7, 0x56, 0xfe, + 0x29, 0x68, 0x0a, 0x22, 0x08, 0x1a, 0x21, 0x8b, 0x49, 0x01, 0xb1, 0xfb, + 0xf2, 0xf1, 0x08, 0x44, 0x01, 0x01, 0x11, 0xd4, 0x0a, 0x49, 0x20, 0xf0, + 0x70, 0x40, 0x00, 0xeb, 0x80, 0x00, 0x0c, 0x68, 0x00, 0x21, 0x40, 0x00, + 0xcd, 0xe9, 0x00, 0x11, 0x01, 0x21, 0x01, 0xeb, 0x50, 0x12, 0x2b, 0x20, + 0x00, 0x21, 0x13, 0x46, 0xa0, 0x47, 0xbc, 0xbd, 0xbd, 0xe8, 0xbc, 0x40, + 0xff, 0xf7, 0x9a, 0xbf, 0xcc, 0x9b, 0x08, 0x00, 0x0c, 0x48, 0x01, 0x7b, + 0xc9, 0x07, 0x14, 0xd0, 0x0b, 0x49, 0x40, 0x7b, 0x09, 0x78, 0x81, 0x42, + 0x0f, 0xd9, 0x0a, 0x48, 0x00, 0x78, 0x01, 0x28, 0x0b, 0xd0, 0x09, 0x48, + 0x00, 0x78, 0x01, 0x28, 0x07, 0xd0, 0x08, 0x48, 0x00, 0x68, 0x01, 0x30, + 0x03, 0xd0, 0x2b, 0x20, 0x00, 0x21, 0xea, 0xf7, 0x77, 0xbc, 0x70, 0x47, + 0x30, 0x32, 0x06, 0x00, 0x6a, 0x34, 0x01, 0x00, 0x54, 0x34, 0x01, 0x00, + 0x63, 0x34, 0x01, 0x00, 0x50, 0xd3, 0x05, 0x00, 0xfe, 0xb5, 0x0c, 0x46, + 0x45, 0x28, 0x29, 0xd1, 0x25, 0x68, 0x3d, 0xb3, 0x95, 0xf8, 0x35, 0x11, + 0x15, 0x4b, 0x68, 0x26, 0x11, 0xfb, 0x06, 0x33, 0x1b, 0x79, 0x01, 0x2b, + 0x1e, 0xd1, 0x13, 0x48, 0xb5, 0xf8, 0xdc, 0x72, 0x95, 0xf8, 0xec, 0x32, + 0xb5, 0xf8, 0xe4, 0x62, 0xd0, 0xf8, 0x00, 0xc0, 0xd5, 0xf8, 0xd4, 0x00, + 0x42, 0x7f, 0xb5, 0xf8, 0xda, 0x02, 0xcd, 0xe9, 0x00, 0x07, 0x10, 0x20, + 0x02, 0x96, 0xe0, 0x47, 0x0a, 0x48, 0x95, 0xf8, 0xf2, 0x12, 0x02, 0x68, + 0x28, 0x46, 0x90, 0x47, 0xe0, 0x7e, 0x00, 0xf0, 0xfb, 0x00, 0xe0, 0x76, + 0x00, 0x20, 0xfe, 0xbd, 0x21, 0x46, 0x03, 0xb0, 0xbd, 0xe8, 0xf0, 0x40, + 0x00, 0xf0, 0x0e, 0xb8, 0xb0, 0xe6, 0x05, 0x00, 0x10, 0xbb, 0x08, 0x00, + 0x98, 0xc4, 0x08, 0x00, 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, + 0x48, 0xcc, 0x08, 0x00, 0xf5, 0xc3, 0x03, 0x00, 0x46, 0xf6, 0x49, 0x3c, + 0xc1, 0xf2, 0x08, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x2d, 0xe9, 0xf0, 0x47, + 0xa0, 0xb3, 0x20, 0x4b, 0xdf, 0xf8, 0x80, 0xc0, 0x00, 0x26, 0x02, 0x27, + 0x4f, 0xf0, 0x04, 0x0e, 0x4f, 0xf0, 0x00, 0x08, 0x4f, 0xf0, 0x00, 0x0a, + 0x93, 0xf9, 0xcc, 0x90, 0x00, 0x23, 0x00, 0xeb, 0xd6, 0x05, 0x06, 0xf0, + 0x07, 0x04, 0x95, 0xf8, 0x8a, 0x52, 0x25, 0xfa, 0x04, 0xf4, 0xe4, 0x07, + 0x13, 0xd0, 0x3d, 0x46, 0x0b, 0x2e, 0x28, 0xbf, 0x0e, 0xeb, 0x43, 0x05, + 0x5c, 0xfa, 0x85, 0xf4, 0x94, 0xf9, 0x01, 0x40, 0x4c, 0x45, 0x05, 0xdc, + 0xec, 0xb2, 0x64, 0x44, 0x94, 0xf9, 0x02, 0x40, 0x4c, 0x45, 0x04, 0xdd, + 0x0a, 0xf1, 0x01, 0x0a, 0x01, 0xe0, 0x08, 0xf1, 0x01, 0x08, 0x01, 0x36, + 0x02, 0x37, 0x01, 0x33, 0x25, 0x2e, 0xda, 0xd1, 0x01, 0x20, 0x04, 0xe0, + 0x00, 0x20, 0x4f, 0xf0, 0xff, 0x08, 0x4f, 0xf0, 0xff, 0x0a, 0x81, 0xf8, + 0x00, 0x80, 0x82, 0xf8, 0x00, 0xa0, 0xbd, 0xe8, 0xf0, 0x87, 0x00, 0xbf, + 0xe8, 0x65, 0x08, 0x00, 0x30, 0x69, 0x01, 0x00, 0x01, 0x48, 0x02, 0x49, + 0x01, 0x60, 0x70, 0x47, 0xb4, 0xbf, 0x08, 0x00, 0x85, 0xc4, 0x03, 0x00, + 0x2d, 0xe9, 0xfc, 0x41, 0x31, 0x48, 0x34, 0x4d, 0x81, 0x69, 0x01, 0x31, + 0x81, 0x61, 0x30, 0x48, 0x30, 0x49, 0x00, 0x78, 0x00, 0xeb, 0x00, 0x10, + 0x01, 0xeb, 0xc0, 0x00, 0x4f, 0xf4, 0xa8, 0x71, 0x90, 0xf8, 0x74, 0x40, + 0x28, 0x68, 0x14, 0xfb, 0x01, 0x01, 0x91, 0xf8, 0x54, 0x10, 0x01, 0x29, + 0x49, 0xd1, 0x2a, 0x49, 0x09, 0x68, 0x0a, 0x01, 0x58, 0xbf, 0x5f, 0xea, + 0x41, 0x11, 0x19, 0xd5, 0x4f, 0xf4, 0xa8, 0x77, 0x14, 0xfb, 0x07, 0x00, + 0x90, 0xf8, 0x55, 0x00, 0x01, 0x28, 0x11, 0xd0, 0x23, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x23, 0x4e, 0x30, 0x60, 0x28, 0x68, 0x14, 0xfb, 0x07, 0x01, + 0x91, 0xf8, 0x56, 0x00, 0x01, 0xf1, 0x59, 0x02, 0x1f, 0x49, 0x0b, 0x68, + 0x0d, 0xf1, 0x07, 0x01, 0x98, 0x47, 0x18, 0xb1, 0x00, 0xf0, 0x6a, 0xf8, + 0xbd, 0xe8, 0xfc, 0x81, 0x1b, 0x4f, 0xb9, 0x68, 0x00, 0x29, 0xf7, 0xd0, + 0x32, 0x68, 0x08, 0x68, 0x16, 0x1d, 0x80, 0x1b, 0x00, 0x01, 0x0f, 0xd5, + 0x18, 0x4a, 0xdf, 0xf8, 0x5c, 0x80, 0xd8, 0xf8, 0x18, 0x00, 0x12, 0x68, + 0x90, 0x47, 0xb8, 0x68, 0x26, 0xf0, 0x70, 0x41, 0x01, 0x60, 0x14, 0x49, + 0x0a, 0x68, 0xd8, 0xf8, 0x18, 0x10, 0x90, 0x47, 0x28, 0x68, 0x4f, 0xf4, + 0xa8, 0x71, 0x14, 0xfb, 0x01, 0x00, 0x9d, 0xf8, 0x07, 0x10, 0x80, 0xf8, + 0x57, 0x10, 0x80, 0xf8, 0x56, 0x10, 0x00, 0x20, 0xbd, 0xe8, 0xfc, 0x81, + 0x84, 0xf0, 0x05, 0x00, 0x74, 0x87, 0x08, 0x00, 0xfc, 0x6d, 0x01, 0x00, + 0xdc, 0x35, 0x01, 0x00, 0x40, 0x36, 0x01, 0x00, 0x14, 0xd9, 0x08, 0x00, + 0x54, 0xd3, 0x05, 0x00, 0x80, 0xba, 0x08, 0x00, 0xa8, 0x56, 0x01, 0x00, + 0xfc, 0x73, 0x01, 0x00, 0xe8, 0xa0, 0x08, 0x00, 0xc4, 0xa0, 0x08, 0x00, + 0x80, 0xb5, 0x03, 0x48, 0x00, 0x68, 0x80, 0x47, 0xbd, 0xe8, 0x80, 0x40, + 0xff, 0xf7, 0x7a, 0xbf, 0xb4, 0xd2, 0x08, 0x00, 0x06, 0x48, 0x07, 0x49, + 0x01, 0x60, 0x07, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x08, 0x49, + 0x01, 0x60, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0xe4, 0xbc, 0x08, 0x00, 0x9c, 0xc6, 0x03, 0x00, 0xec, 0xbc, 0x08, 0x00, + 0x7c, 0xc6, 0x03, 0x00, 0xe8, 0xbc, 0x08, 0x00, 0xbc, 0xc6, 0x03, 0x00, + 0xf0, 0xbc, 0x08, 0x00, 0xdc, 0xc6, 0x03, 0x00, 0x4c, 0xf6, 0x0b, 0x7c, + 0xc1, 0xf2, 0x08, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x41, 0xcd, 0x08, 0x10, + 0x85, 0xce, 0x08, 0x10, 0xeb, 0xce, 0x08, 0x10, 0xf5, 0xce, 0x08, 0x10, + 0xff, 0xce, 0x08, 0x10, 0x09, 0xcf, 0x08, 0x10, 0x25, 0xc5, 0x03, 0x00, + 0x63, 0x00, 0x00, 0x00, 0x61, 0xcd, 0x08, 0x10, 0x85, 0xce, 0x08, 0x10, + 0x79, 0xd0, 0x08, 0x10, 0x7d, 0xd0, 0x08, 0x10, 0x75, 0xdc, 0x08, 0x10, + 0x29, 0xdf, 0x08, 0x10, 0x25, 0xc5, 0x03, 0x00, 0x64, 0x00, 0x00, 0x00, + 0x61, 0xcd, 0x08, 0x10, 0xf1, 0xdf, 0x08, 0x10, 0xeb, 0xce, 0x08, 0x10, + 0xf5, 0xce, 0x08, 0x10, 0xff, 0xce, 0x08, 0x10, 0x09, 0xcf, 0x08, 0x10, + 0x25, 0xc5, 0x03, 0x00, 0x65, 0x00, 0x00, 0x00, 0x61, 0xcd, 0x08, 0x10, + 0x85, 0xce, 0x08, 0x10, 0x67, 0xe0, 0x08, 0x10, 0x6b, 0xe0, 0x08, 0x10, + 0xcb, 0xe0, 0x08, 0x10, 0xd9, 0xe2, 0x08, 0x10, 0x21, 0xc6, 0x03, 0x00, + 0x6c, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xfc, 0x47, 0x07, 0x68, 0x04, 0x46, + 0x00, 0x20, 0xcd, 0xe9, 0x00, 0x00, 0x3f, 0xb1, 0x2c, 0x48, 0x92, 0x46, + 0x89, 0x46, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0xff, 0x28, 0x01, 0xd0, + 0xbd, 0xe8, 0xfc, 0x87, 0x60, 0x7a, 0xb8, 0xb1, 0x00, 0x22, 0x00, 0x26, + 0x00, 0x21, 0x07, 0xeb, 0xc2, 0x05, 0xeb, 0x79, 0xff, 0x2b, 0x1a, 0xbf, + 0x01, 0x33, 0xeb, 0x71, 0xff, 0x23, 0x9e, 0x42, 0x06, 0xda, 0xad, 0x79, + 0xff, 0x2d, 0x18, 0xbf, 0x55, 0x45, 0x01, 0xd1, 0x11, 0x46, 0x1e, 0x46, + 0x01, 0x32, 0x82, 0x42, 0xeb, 0xd3, 0x00, 0xe0, 0x00, 0x21, 0xdf, 0xf8, + 0x6c, 0x80, 0x72, 0xb6, 0xd8, 0xf8, 0x00, 0x00, 0x40, 0x00, 0x01, 0x30, + 0xc8, 0xf8, 0x00, 0x00, 0x20, 0x7a, 0x63, 0x7a, 0x83, 0x42, 0x0e, 0xd1, + 0x58, 0x1e, 0x81, 0x42, 0x09, 0xda, 0x07, 0xeb, 0xc1, 0x00, 0x59, 0x1a, + 0xc9, 0x00, 0x00, 0xf1, 0x08, 0x02, 0x0b, 0x46, 0xea, 0xf7, 0x04, 0xff, + 0x63, 0x7a, 0x58, 0x1e, 0x60, 0x72, 0xd8, 0xf8, 0x00, 0x00, 0x6f, 0x46, + 0x06, 0x21, 0x4a, 0x46, 0x06, 0x23, 0x40, 0x08, 0xc8, 0xf8, 0x00, 0x00, + 0xd8, 0xf8, 0x00, 0x00, 0x80, 0xf3, 0x10, 0x88, 0x38, 0x46, 0xe4, 0xf7, + 0x39, 0xfc, 0x06, 0x48, 0x39, 0x46, 0x8d, 0xf8, 0x06, 0xa0, 0x02, 0x68, + 0x20, 0x46, 0x90, 0x47, 0xbd, 0xe8, 0xfc, 0x87, 0xc0, 0xd2, 0x08, 0x00, + 0x24, 0x36, 0x01, 0x00, 0x44, 0xc9, 0x08, 0x00, 0x01, 0x48, 0x02, 0x49, + 0x01, 0x60, 0x70, 0x47, 0xc8, 0xd2, 0x08, 0x00, 0xfd, 0xc6, 0x03, 0x00, + 0x10, 0xb5, 0x11, 0x49, 0x0a, 0x68, 0x4f, 0xf4, 0xa8, 0x71, 0x10, 0xfb, + 0x01, 0x21, 0x91, 0xf8, 0x55, 0x30, 0x01, 0x2b, 0x16, 0xd0, 0x0d, 0x4b, + 0x1c, 0x68, 0x9c, 0xb1, 0x93, 0xf8, 0x32, 0x40, 0x01, 0x2c, 0x0f, 0xd1, + 0x9b, 0x68, 0x6b, 0xb1, 0xb3, 0xf8, 0xac, 0x32, 0xdb, 0x06, 0x09, 0xd4, + 0x4f, 0xf4, 0xa8, 0x73, 0x10, 0xfb, 0x03, 0x20, 0x02, 0x6d, 0xf5, 0x48, + 0xb0, 0xf8, 0x82, 0x00, 0x82, 0x42, 0x00, 0xd3, 0x08, 0x6d, 0x10, 0xbd, + 0xdc, 0x35, 0x01, 0x00, 0x7c, 0x5c, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x46, + 0x00, 0x7d, 0x6f, 0x28, 0x29, 0xd1, 0xf0, 0x48, 0xec, 0x4d, 0x21, 0x79, + 0x4f, 0xf4, 0xa8, 0x72, 0x00, 0x68, 0xb5, 0xf8, 0x64, 0x50, 0x11, 0xfb, + 0x02, 0x02, 0xad, 0x08, 0xb2, 0xf8, 0x98, 0x30, 0x05, 0xeb, 0x45, 0x05, + 0xab, 0x42, 0x18, 0xd9, 0xd2, 0xf8, 0xf8, 0x20, 0xd2, 0xb1, 0x4f, 0xf4, + 0xa8, 0x72, 0x11, 0xfb, 0x02, 0x05, 0x95, 0xf8, 0xd4, 0x00, 0x40, 0x08, + 0x00, 0xf0, 0x1e, 0xf8, 0x01, 0x28, 0x06, 0xd8, 0x95, 0xf8, 0xd5, 0x00, + 0x40, 0x08, 0x00, 0xf0, 0x17, 0xf8, 0x05, 0x28, 0x0d, 0xd3, 0x09, 0x48, + 0x90, 0xf8, 0x98, 0x03, 0x07, 0xe0, 0x20, 0x46, 0xbd, 0xe8, 0xb0, 0x40, + 0x00, 0xf0, 0x26, 0xba, 0x04, 0x48, 0x90, 0xf8, 0x5b, 0x03, 0x01, 0x30, + 0xa0, 0x74, 0xe0, 0x7c, 0x40, 0xf0, 0x04, 0x00, 0xe0, 0x74, 0xb0, 0xbd, + 0x8c, 0x7e, 0x08, 0x00, 0xa0, 0xb1, 0x10, 0xf0, 0x0f, 0x01, 0x08, 0xbf, + 0x00, 0x09, 0xb1, 0xfa, 0x81, 0xf1, 0x82, 0x07, 0x4f, 0xea, 0x51, 0x11, + 0x4f, 0xf0, 0x01, 0x02, 0x4f, 0xea, 0x81, 0x01, 0x04, 0xbf, 0x80, 0x08, + 0x41, 0xf0, 0x02, 0x01, 0x22, 0xea, 0x00, 0x00, 0x08, 0x44, 0x70, 0x47, + 0xff, 0x20, 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x4f, 0x89, 0xb0, 0x05, 0x46, + 0xc1, 0x48, 0x90, 0xf8, 0x5e, 0x01, 0x01, 0x28, 0x04, 0xd1, 0xc0, 0x48, + 0x19, 0x21, 0x00, 0x78, 0xe4, 0xf7, 0x9a, 0xfb, 0xd5, 0xe9, 0x02, 0x01, + 0x00, 0x27, 0xcd, 0xe9, 0x05, 0x01, 0xbc, 0x48, 0x00, 0x21, 0x95, 0xf8, + 0x14, 0xb0, 0x95, 0xf9, 0x04, 0x90, 0x02, 0x68, 0xa8, 0x7c, 0x90, 0x47, + 0xdf, 0xf8, 0xe0, 0xa2, 0x06, 0x46, 0xdf, 0xf8, 0xe0, 0x82, 0xbb, 0xf1, + 0x6f, 0x0f, 0xda, 0xf8, 0x00, 0x00, 0x23, 0xd1, 0x4f, 0xf4, 0xa8, 0x71, + 0x19, 0xfb, 0x01, 0x00, 0xa0, 0xf8, 0x80, 0x70, 0x98, 0xf8, 0x53, 0x10, + 0x01, 0xf0, 0xbf, 0x01, 0x88, 0xf8, 0x53, 0x10, 0xd0, 0xf8, 0x20, 0x71, + 0x5f, 0xb1, 0x00, 0xf5, 0x90, 0x74, 0xae, 0x48, 0x01, 0x68, 0x38, 0x46, + 0x88, 0x47, 0x39, 0x7d, 0x00, 0x20, 0x38, 0x61, 0x38, 0x75, 0xb9, 0x75, + 0x20, 0x60, 0xa8, 0x48, 0x00, 0x68, 0x80, 0x47, 0x01, 0x28, 0x24, 0xd1, + 0x28, 0x46, 0x00, 0xf0, 0xbf, 0xf9, 0x1e, 0xe0, 0x4f, 0xf4, 0xa8, 0x74, + 0x19, 0xfb, 0x04, 0x00, 0x90, 0xf8, 0x2c, 0x01, 0x88, 0xf8, 0x50, 0x00, + 0x28, 0x46, 0xf2, 0xf7, 0x9f, 0xf9, 0xda, 0xf8, 0x00, 0x00, 0x19, 0xfb, + 0x04, 0x00, 0xc0, 0xf8, 0x20, 0x71, 0xda, 0xf8, 0x00, 0x00, 0x19, 0xfb, + 0x04, 0x00, 0xd0, 0xf8, 0x84, 0x00, 0x00, 0x28, 0x00, 0xf0, 0x1f, 0x81, + 0x96, 0x48, 0x00, 0x68, 0x80, 0x47, 0x01, 0x28, 0x03, 0xd1, 0x00, 0x27, + 0x17, 0xe1, 0x95, 0x48, 0x45, 0x60, 0xda, 0xf8, 0x00, 0x00, 0x4f, 0xf4, + 0xa8, 0x75, 0x5f, 0xfa, 0x89, 0xf3, 0x03, 0x93, 0x19, 0xfb, 0x05, 0x01, + 0xb1, 0xf8, 0x70, 0x20, 0xb1, 0xf8, 0x80, 0x40, 0x88, 0xf8, 0x74, 0x30, + 0x02, 0x92, 0x00, 0x22, 0xc8, 0xf8, 0x00, 0x20, 0x61, 0x22, 0x88, 0xf8, + 0x49, 0x20, 0x04, 0x22, 0x88, 0xf8, 0x54, 0x20, 0xff, 0x22, 0xa8, 0xf8, + 0x70, 0x20, 0x91, 0xf8, 0x6c, 0x20, 0x91, 0xf8, 0x0c, 0x31, 0x71, 0x1c, + 0x08, 0xbf, 0x4f, 0xf4, 0x48, 0x66, 0xd8, 0xf8, 0x20, 0x70, 0xd8, 0xf8, + 0x28, 0x10, 0x3e, 0x44, 0x88, 0xf8, 0x51, 0x30, 0x88, 0xf8, 0x53, 0x20, + 0x26, 0xf0, 0x70, 0x46, 0xc8, 0xf8, 0x34, 0x60, 0x69, 0xb3, 0x7c, 0x48, + 0x07, 0xaa, 0x03, 0x68, 0x01, 0xf1, 0x08, 0x00, 0x05, 0xa9, 0x98, 0x47, + 0xda, 0xf8, 0x00, 0x00, 0x40, 0xf2, 0x71, 0x23, 0x19, 0xfb, 0x05, 0x01, + 0x07, 0x9d, 0x91, 0xf8, 0x0c, 0x21, 0x75, 0x49, 0x6b, 0x43, 0xbd, 0xf8, + 0x20, 0x50, 0x5b, 0x08, 0x31, 0xf8, 0x12, 0x10, 0x03, 0xeb, 0x15, 0x13, + 0x67, 0x4d, 0xb5, 0xf8, 0xf4, 0x51, 0x5b, 0x1b, 0x59, 0x1a, 0x6f, 0x4b, + 0x9a, 0x5c, 0xc2, 0xeb, 0x02, 0x43, 0x99, 0x42, 0x09, 0xd2, 0xb1, 0xfb, + 0xf2, 0xf5, 0xb8, 0xf8, 0x70, 0x20, 0xa9, 0xb2, 0x8a, 0x42, 0x88, 0xbf, + 0xa8, 0xf8, 0x70, 0x50, 0x01, 0xe0, 0x4f, 0xf6, 0xff, 0x75, 0x98, 0xf8, + 0x53, 0x20, 0xdd, 0xf8, 0x08, 0xa0, 0xbb, 0xf1, 0x70, 0x0f, 0x02, 0xf0, + 0xd0, 0x01, 0x88, 0xf8, 0x53, 0x10, 0x09, 0xd1, 0x02, 0xf0, 0x90, 0x01, + 0x98, 0xf8, 0x54, 0x20, 0x88, 0xf8, 0x53, 0x10, 0x42, 0xf0, 0x01, 0x02, + 0x88, 0xf8, 0x54, 0x20, 0x4f, 0xf4, 0xa8, 0x72, 0x19, 0xfb, 0x02, 0x00, + 0xb0, 0xf8, 0x62, 0x00, 0x80, 0x05, 0x44, 0xbf, 0x41, 0xf0, 0x08, 0x00, + 0x88, 0xf8, 0x53, 0x00, 0x2f, 0x21, 0x56, 0x48, 0x00, 0x68, 0xc8, 0xf8, + 0x10, 0x00, 0x55, 0x48, 0x02, 0x68, 0x40, 0x46, 0x90, 0x47, 0x54, 0x48, + 0x40, 0x7c, 0x01, 0x28, 0x09, 0xd1, 0x42, 0xf6, 0xfa, 0x70, 0x0d, 0xf1, + 0x12, 0x01, 0xad, 0xf8, 0x12, 0x00, 0x50, 0x48, 0x02, 0x68, 0x02, 0x20, + 0x90, 0x47, 0x4f, 0x49, 0x98, 0xf8, 0x53, 0x00, 0xaa, 0xeb, 0x04, 0x07, + 0x09, 0x68, 0x88, 0x47, 0x06, 0x46, 0xbb, 0xf1, 0x6f, 0x0f, 0x30, 0xd1, + 0x4a, 0x48, 0xba, 0xb2, 0x31, 0x46, 0x02, 0x23, 0x04, 0x68, 0x49, 0x48, + 0x00, 0x90, 0x03, 0x98, 0x40, 0xb2, 0xa0, 0x47, 0x5a, 0x4b, 0x4f, 0xf4, + 0xa8, 0x72, 0x19, 0x68, 0x19, 0xfb, 0x02, 0x12, 0x82, 0xf8, 0xf4, 0x00, + 0x10, 0xb1, 0x01, 0x2e, 0x08, 0xbf, 0x02, 0x26, 0x92, 0xf8, 0xe1, 0x20, + 0x06, 0x44, 0x92, 0x07, 0x16, 0xd5, 0x4f, 0xf4, 0xa8, 0x70, 0x19, 0xfb, + 0x00, 0x10, 0x39, 0xb2, 0x90, 0xf8, 0xe0, 0x00, 0x51, 0xfa, 0x86, 0xf1, + 0x00, 0xf0, 0x3f, 0x00, 0x08, 0x44, 0xa9, 0xb2, 0x88, 0x42, 0x07, 0xdc, + 0x98, 0xf8, 0x53, 0x00, 0x40, 0xf0, 0x04, 0x00, 0x88, 0xf8, 0x53, 0x00, + 0x00, 0xe0, 0x47, 0x4b, 0x38, 0xb2, 0xb8, 0xf8, 0x70, 0x50, 0x50, 0xfa, + 0x86, 0xf0, 0xa8, 0x42, 0x30, 0xdd, 0x98, 0xf8, 0x53, 0x00, 0x4f, 0xf4, + 0xa8, 0x71, 0x00, 0x22, 0x40, 0xf0, 0x10, 0x00, 0x88, 0xf8, 0x53, 0x00, + 0x18, 0x68, 0x19, 0xfb, 0x01, 0x00, 0x22, 0x49, 0x90, 0xf8, 0x0c, 0x01, + 0x11, 0xf8, 0x00, 0x80, 0x1e, 0x49, 0x31, 0xf8, 0x10, 0x40, 0x14, 0x48, + 0xb0, 0xf8, 0x52, 0x91, 0xf0, 0x1c, 0xc0, 0xb2, 0x85, 0x42, 0x84, 0xbf, + 0x79, 0x1b, 0x0f, 0x18, 0x21, 0x48, 0x39, 0xb2, 0x03, 0x9f, 0x03, 0x68, + 0x38, 0x46, 0x98, 0x47, 0x08, 0x28, 0x28, 0xbf, 0x08, 0x20, 0x1e, 0x49, + 0x00, 0x90, 0x05, 0xaa, 0x08, 0xfb, 0x05, 0x40, 0x0e, 0x68, 0x70, 0x21, + 0x00, 0xeb, 0x09, 0x03, 0x78, 0xb2, 0xb0, 0x47, 0x19, 0x48, 0x0e, 0x21, + 0x01, 0x22, 0x01, 0x27, 0x03, 0x68, 0x1a, 0x20, 0x98, 0x47, 0x38, 0x46, + 0x09, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0xbf, 0xe8, 0x65, 0x08, 0x00, + 0x66, 0x34, 0x01, 0x00, 0x60, 0xcf, 0x08, 0x00, 0xdc, 0x35, 0x01, 0x00, + 0xfc, 0x70, 0x01, 0x00, 0x74, 0xcf, 0x08, 0x00, 0xc8, 0xa0, 0x08, 0x00, + 0x18, 0x74, 0x01, 0x00, 0x44, 0xa1, 0x08, 0x00, 0xb0, 0x31, 0x0a, 0x10, + 0xc4, 0x31, 0x0a, 0x10, 0x30, 0xcf, 0x08, 0x00, 0xf4, 0xa0, 0x08, 0x00, + 0x4c, 0x01, 0x01, 0x00, 0x08, 0xa1, 0x08, 0x00, 0x5c, 0xc9, 0x08, 0x00, + 0x18, 0xcf, 0x08, 0x00, 0xfc, 0x50, 0x01, 0x00, 0x1c, 0xc9, 0x08, 0x00, + 0x20, 0xc9, 0x08, 0x00, 0xfc, 0xa0, 0x08, 0x00, 0xb0, 0xb5, 0x0d, 0x46, + 0x04, 0x46, 0x00, 0xf0, 0x57, 0xf8, 0x0c, 0x48, 0x01, 0x68, 0x4a, 0x1c, + 0x12, 0xd0, 0x0b, 0x4a, 0x4f, 0xf4, 0xa8, 0x73, 0x12, 0x68, 0x15, 0xfb, + 0x03, 0x22, 0x52, 0xf8, 0x24, 0x3f, 0x8b, 0x42, 0x05, 0xd1, 0x08, 0x1d, + 0x20, 0xf0, 0x70, 0x40, 0x20, 0x60, 0x10, 0x60, 0xb0, 0xbd, 0x4f, 0xf0, + 0xff, 0x31, 0x01, 0x60, 0xb0, 0xbd, 0x00, 0xbf, 0x54, 0xd3, 0x05, 0x00, + 0xdc, 0x35, 0x01, 0x00, 0x03, 0x48, 0x40, 0x78, 0xc0, 0x07, 0x08, 0xbf, + 0x00, 0xf0, 0x3a, 0xb8, 0x70, 0x47, 0x00, 0xbf, 0x1b, 0x54, 0x01, 0x00, + 0x0a, 0x4a, 0x0b, 0x4b, 0x07, 0x48, 0x08, 0x49, 0x13, 0x60, 0x0a, 0x4a, + 0xc0, 0xe9, 0x2f, 0x12, 0xc0, 0xf8, 0xb4, 0x20, 0x08, 0x48, 0x09, 0x49, + 0x01, 0x60, 0x09, 0x48, 0x09, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0x90, 0xcf, 0x08, 0x00, 0x2d, 0xc8, 0x03, 0x00, 0xf8, 0xce, 0x08, 0x00, + 0xdd, 0xc7, 0x03, 0x00, 0xdd, 0xc8, 0x03, 0x00, 0x80, 0xcf, 0x08, 0x00, + 0x41, 0xcc, 0x03, 0x00, 0x00, 0xcf, 0x08, 0x00, 0x85, 0xcc, 0x03, 0x00, + 0x4c, 0xf6, 0x13, 0x4c, 0xc1, 0xf2, 0x08, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4c, 0xf6, 0xf1, 0x1c, 0xc1, 0xf2, 0x08, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4b, 0xf2, 0x75, 0x3c, 0xc1, 0xf2, 0x08, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4b, 0xf2, 0x8d, 0x2c, 0xc1, 0xf2, 0x08, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0xb0, 0xb5, 0xf4, 0x4c, 0xf4, 0x4d, 0x20, 0x78, 0x00, 0xeb, 0x00, 0x10, + 0x05, 0xeb, 0xc0, 0x01, 0xc9, 0x68, 0x51, 0xb1, 0x55, 0xf8, 0x30, 0x00, + 0x38, 0xb1, 0x0f, 0x48, 0x00, 0x78, 0x40, 0x07, 0x0a, 0xd4, 0x00, 0x20, + 0x40, 0xf2, 0x15, 0x71, 0x02, 0xe0, 0x00, 0x20, 0x40, 0xf2, 0x14, 0x71, + 0xbd, 0xe8, 0xb0, 0x40, 0xe9, 0xf7, 0xbc, 0xbf, 0x02, 0xf0, 0xc8, 0xf8, + 0x07, 0x48, 0x01, 0x21, 0x02, 0x68, 0x40, 0x20, 0x90, 0x47, 0x20, 0x78, + 0x00, 0xeb, 0x00, 0x10, 0x05, 0xeb, 0xc0, 0x00, 0xbd, 0xe8, 0xb0, 0x40, + 0x10, 0xf0, 0x2a, 0xbe, 0x97, 0x53, 0x01, 0x00, 0xf8, 0xb9, 0x08, 0x00, + 0x2d, 0xe9, 0xfe, 0x4f, 0xdb, 0x4e, 0xdf, 0xf8, 0x70, 0x83, 0x31, 0x78, + 0x01, 0xeb, 0x01, 0x10, 0x08, 0xeb, 0xc0, 0x02, 0xd4, 0x68, 0x00, 0x2c, + 0x46, 0xd0, 0xd8, 0x4d, 0xd5, 0xf8, 0x00, 0x90, 0xb9, 0xf1, 0x00, 0x0f, + 0x40, 0xd0, 0x58, 0xf8, 0x30, 0x00, 0xe8, 0xb3, 0x94, 0xf8, 0x1d, 0x21, + 0xb4, 0xf8, 0x48, 0x31, 0x02, 0x92, 0xb4, 0xf8, 0x52, 0x21, 0x93, 0x42, + 0x06, 0xd3, 0xd0, 0x4a, 0x5c, 0x23, 0x11, 0xfb, 0x03, 0x22, 0xcf, 0x4b, + 0x1b, 0x68, 0x13, 0x63, 0x5c, 0x22, 0x02, 0x23, 0x11, 0xfb, 0x02, 0xf1, + 0xca, 0x4a, 0x52, 0x5c, 0x02, 0x21, 0x05, 0x2a, 0x03, 0xd3, 0x02, 0x23, + 0x0a, 0x2a, 0x38, 0xbf, 0x03, 0x23, 0xd0, 0xf8, 0xd4, 0x00, 0x94, 0xf9, + 0x41, 0x71, 0x94, 0xf8, 0x40, 0x21, 0x40, 0x7f, 0xcd, 0xe9, 0x00, 0x10, + 0x04, 0xf5, 0xe8, 0x70, 0xb9, 0x00, 0x1f, 0xf0, 0x7f, 0xf8, 0x30, 0x78, + 0xb4, 0xf8, 0x48, 0x21, 0x00, 0xeb, 0x00, 0x11, 0x08, 0xeb, 0xc1, 0x01, + 0xa1, 0xf8, 0x70, 0x20, 0xbc, 0x49, 0x01, 0xf1, 0x1d, 0x0b, 0x94, 0xf8, + 0x78, 0x11, 0xc9, 0x07, 0x09, 0xd1, 0x4f, 0xf0, 0x01, 0x0a, 0x15, 0xe0, + 0x00, 0x20, 0x40, 0xf2, 0xdf, 0x41, 0x00, 0x24, 0xe9, 0xf7, 0x4e, 0xff, + 0xed, 0xe0, 0xd4, 0xf8, 0x90, 0x10, 0x4f, 0xf0, 0x00, 0x0a, 0x01, 0x31, + 0xc4, 0xf8, 0x90, 0x10, 0x35, 0x21, 0x8b, 0xf8, 0x00, 0x10, 0xb0, 0x49, + 0x91, 0xf8, 0x49, 0x12, 0x8b, 0xf8, 0x01, 0x10, 0xae, 0x4a, 0x00, 0xeb, + 0x80, 0x01, 0xa9, 0x4f, 0x02, 0xeb, 0x41, 0x11, 0x02, 0x22, 0x81, 0xf8, + 0x54, 0x20, 0x5c, 0x22, 0x10, 0xfb, 0x02, 0xf1, 0x7b, 0x5c, 0xa9, 0x49, + 0x05, 0x2b, 0x16, 0xd3, 0x09, 0x2b, 0x14, 0xd8, 0x5c, 0x22, 0x10, 0xfb, + 0x02, 0x70, 0xc0, 0x68, 0xc8, 0x60, 0x30, 0x78, 0x10, 0xfb, 0x02, 0x70, + 0x00, 0x69, 0x88, 0x60, 0x30, 0x78, 0x10, 0xfb, 0x02, 0x70, 0x40, 0x69, + 0x48, 0x60, 0x30, 0x78, 0x10, 0xfb, 0x02, 0x70, 0x80, 0x69, 0x08, 0x60, + 0x03, 0xe0, 0x10, 0xfb, 0x02, 0x70, 0x80, 0x68, 0xc8, 0x60, 0x9b, 0x48, + 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0xba, 0xf1, 0x00, 0x0f, 0x1c, 0xbf, + 0xb4, 0xf8, 0x78, 0x01, 0x5f, 0xea, 0xc0, 0x70, 0x40, 0xf0, 0xaa, 0x80, + 0x30, 0x78, 0x00, 0xeb, 0x00, 0x11, 0x58, 0xf8, 0x31, 0x10, 0x91, 0xf8, + 0x8a, 0x10, 0x89, 0x07, 0x14, 0xd5, 0xfd, 0x4f, 0x00, 0xeb, 0x80, 0x01, + 0x07, 0xeb, 0xc1, 0x01, 0x49, 0x89, 0x69, 0xb1, 0x8d, 0x48, 0x00, 0x68, + 0x82, 0x69, 0x04, 0xf5, 0xb0, 0x70, 0x90, 0x47, 0x30, 0x78, 0x00, 0xeb, + 0x80, 0x01, 0x07, 0xeb, 0xc1, 0x01, 0x4a, 0x89, 0x04, 0x32, 0x4a, 0x81, + 0x94, 0xf8, 0x50, 0x11, 0x41, 0xb1, 0xb4, 0xf8, 0x58, 0x11, 0xb4, 0xf8, + 0x74, 0x21, 0x51, 0x1a, 0x09, 0xb2, 0xb1, 0xf1, 0xff, 0x3f, 0x0c, 0xdc, + 0xec, 0x4a, 0x00, 0xeb, 0x80, 0x01, 0x02, 0xeb, 0xc1, 0x01, 0x49, 0x7d, + 0x29, 0xb9, 0x7e, 0x49, 0xb1, 0xf8, 0xba, 0x11, 0xca, 0x07, 0x40, 0xf0, + 0x94, 0x80, 0x00, 0x25, 0xe5, 0x49, 0x00, 0xeb, 0x80, 0x00, 0x7b, 0x4b, + 0x01, 0xeb, 0xc0, 0x01, 0x94, 0xf8, 0x7e, 0x01, 0x1f, 0x68, 0x0a, 0x7d, + 0x92, 0xb1, 0x09, 0x7b, 0x00, 0x22, 0x01, 0x23, 0xcd, 0xe9, 0x00, 0x12, + 0x00, 0x21, 0x2a, 0x46, 0xb8, 0x47, 0x00, 0x2d, 0x68, 0x4f, 0x6c, 0x4d, + 0x1d, 0xd0, 0x2b, 0x20, 0x8b, 0xf8, 0x00, 0x00, 0x68, 0x48, 0x90, 0xf8, + 0x3f, 0x02, 0x14, 0xe0, 0x0a, 0x7b, 0x4b, 0x89, 0x94, 0xf8, 0x7d, 0x11, + 0xcd, 0xe9, 0x00, 0x23, 0x2a, 0x46, 0x00, 0x23, 0xb8, 0x47, 0x02, 0x98, + 0x9b, 0xf8, 0x00, 0x10, 0xc0, 0xeb, 0x00, 0x10, 0x09, 0xeb, 0x40, 0x10, + 0x40, 0x78, 0xe4, 0xf7, 0x77, 0xf8, 0x5a, 0x4f, 0x5d, 0x4d, 0x8b, 0xf8, + 0x01, 0x00, 0x63, 0x48, 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, 0x30, 0x78, + 0x00, 0xeb, 0x80, 0x01, 0x05, 0xeb, 0x41, 0x11, 0x91, 0xf8, 0x54, 0x20, + 0x51, 0xf8, 0x22, 0x30, 0x6f, 0xf3, 0x9f, 0x53, 0x41, 0xf8, 0x22, 0x30, + 0x91, 0xf8, 0x54, 0x20, 0x51, 0xf8, 0x22, 0x30, 0x6f, 0xf3, 0x15, 0x03, + 0x41, 0xf8, 0x22, 0x30, 0x91, 0xf8, 0x54, 0x10, 0x0e, 0x29, 0x05, 0xd3, + 0x00, 0x20, 0x40, 0xf2, 0x3e, 0x51, 0xe4, 0xf7, 0x15, 0xf8, 0x30, 0x78, + 0x5c, 0x25, 0x52, 0x49, 0x02, 0x22, 0x10, 0xfb, 0x05, 0x70, 0x81, 0x62, + 0x00, 0x20, 0x21, 0x46, 0x1e, 0xf0, 0xda, 0xfc, 0x30, 0x78, 0x00, 0xeb, + 0x00, 0x11, 0x08, 0xeb, 0xc1, 0x01, 0x49, 0x68, 0x49, 0x7f, 0x19, 0xb1, + 0x4a, 0x49, 0x10, 0xfb, 0x05, 0x70, 0xc1, 0x62, 0x01, 0x24, 0x20, 0x46, + 0xbd, 0xe8, 0xfe, 0x8f, 0x94, 0xf8, 0x47, 0x01, 0xb4, 0xf8, 0x4e, 0x11, + 0x08, 0x44, 0xb4, 0xf8, 0x74, 0x11, 0x01, 0x38, 0x0a, 0x1a, 0x12, 0xb2, + 0xb2, 0xf1, 0xff, 0x3f, 0x39, 0xdd, 0x88, 0x42, 0x53, 0xd1, 0x94, 0xf8, + 0x4b, 0x01, 0x94, 0xf8, 0x4d, 0x11, 0x01, 0x30, 0x11, 0xb1, 0x94, 0xf8, + 0x4c, 0x11, 0x08, 0x44, 0x31, 0x78, 0x01, 0xeb, 0x01, 0x11, 0x08, 0xeb, + 0xc1, 0x01, 0x91, 0xf8, 0x72, 0x10, 0x40, 0x1a, 0x3f, 0xe0, 0xb4, 0xf8, + 0x78, 0x21, 0x89, 0x07, 0x42, 0xf0, 0x04, 0x02, 0xa4, 0xf8, 0x78, 0x21, + 0x1b, 0xd5, 0x2e, 0x4a, 0xc0, 0xeb, 0x40, 0x11, 0x02, 0xeb, 0xc1, 0x01, + 0x91, 0xf8, 0x9d, 0x20, 0x01, 0x2a, 0x02, 0xd0, 0x49, 0x68, 0x49, 0x7f, + 0x79, 0xb9, 0x94, 0xf8, 0x1d, 0x21, 0x29, 0x68, 0x94, 0xf8, 0x20, 0x31, + 0xc2, 0xeb, 0x02, 0x12, 0x01, 0xeb, 0x42, 0x11, 0x5a, 0x1e, 0x91, 0xf8, + 0xc1, 0x10, 0x8a, 0x42, 0x01, 0xd1, 0x00, 0x24, 0xb7, 0xe7, 0x01, 0x25, + 0x46, 0xe7, 0x40, 0x1a, 0x94, 0xf8, 0x20, 0x11, 0x94, 0xf8, 0x4d, 0x31, + 0x94, 0xf8, 0x4b, 0x21, 0x48, 0x43, 0x31, 0x78, 0x01, 0xeb, 0x01, 0x11, + 0x08, 0xeb, 0xc1, 0x01, 0x91, 0xf8, 0x72, 0x10, 0xa0, 0xeb, 0x01, 0x00, + 0x02, 0xf1, 0x01, 0x01, 0xa4, 0xf8, 0x3c, 0x02, 0x13, 0xb1, 0x94, 0xf8, + 0x4c, 0x21, 0x11, 0x44, 0x08, 0x44, 0xa4, 0xf8, 0x3c, 0x02, 0xb4, 0xf8, + 0x3a, 0x12, 0xb4, 0xf8, 0x3c, 0x02, 0x11, 0xb1, 0x81, 0x42, 0x7f, 0xf6, + 0xeb, 0xae, 0xa4, 0xf8, 0x3a, 0x02, 0xe7, 0xe6, 0x74, 0x87, 0x08, 0x00, + 0xfc, 0x6d, 0x01, 0x00, 0xe0, 0x35, 0x01, 0x00, 0x44, 0x4f, 0x01, 0x00, + 0x58, 0xa2, 0x08, 0x00, 0xfc, 0x20, 0x01, 0x00, 0x8c, 0x7e, 0x08, 0x00, + 0xbc, 0x65, 0x01, 0x00, 0xe0, 0x12, 0x21, 0x40, 0x5c, 0xa2, 0x08, 0x00, + 0xe4, 0x35, 0x01, 0x00, 0xe8, 0x65, 0x08, 0x00, 0x0c, 0x6f, 0x01, 0x00, + 0x98, 0xb9, 0x08, 0x00, 0xf8, 0xa0, 0x08, 0x00, 0x29, 0xd1, 0x03, 0x00, + 0x6d, 0x71, 0x09, 0x10, 0xf8, 0xb5, 0x01, 0xf0, 0xdd, 0xfe, 0x01, 0x28, + 0x40, 0xf0, 0xab, 0x80, 0x5d, 0x4a, 0x5f, 0x4d, 0x5d, 0x49, 0x14, 0x78, + 0xed, 0x78, 0x04, 0xeb, 0x04, 0x13, 0x2d, 0x07, 0x01, 0xeb, 0xc3, 0x03, + 0xdb, 0x68, 0x31, 0xd4, 0x73, 0xb1, 0xd3, 0xf8, 0x00, 0x51, 0x5d, 0xb1, + 0x95, 0xf8, 0x35, 0x51, 0x57, 0x4e, 0x68, 0x27, 0x15, 0xfb, 0x07, 0x65, + 0x2d, 0x79, 0x01, 0x2d, 0x04, 0xbf, 0x00, 0x25, 0x83, 0xf8, 0xb9, 0x51, + 0x54, 0x4d, 0x93, 0xf8, 0x1d, 0x61, 0x2d, 0x68, 0xc6, 0xeb, 0x06, 0x16, + 0x05, 0xeb, 0x46, 0x15, 0xd5, 0xf8, 0xa0, 0x50, 0x6d, 0x7f, 0x2d, 0xb9, + 0x93, 0xf8, 0xf8, 0x51, 0x15, 0xb1, 0x01, 0x3d, 0x83, 0xf8, 0xf8, 0x51, + 0x4a, 0x4d, 0x04, 0xeb, 0x84, 0x04, 0x05, 0xeb, 0xc4, 0x04, 0x25, 0x7d, + 0xd3, 0xf8, 0x20, 0x42, 0x00, 0x2d, 0x42, 0xd0, 0x00, 0x2c, 0x4a, 0xd0, + 0x93, 0xf8, 0x2b, 0x32, 0x03, 0x25, 0x40, 0xe0, 0xdb, 0xb1, 0xd3, 0xf8, + 0x00, 0x51, 0x5d, 0xb1, 0x95, 0xf8, 0x35, 0x51, 0xe9, 0x4e, 0x68, 0x27, + 0x15, 0xfb, 0x07, 0x65, 0x2d, 0x79, 0x01, 0x2d, 0x04, 0xbf, 0x01, 0x25, + 0x83, 0xf8, 0xb9, 0x51, 0xd3, 0xf8, 0x20, 0x52, 0x4d, 0xb1, 0x93, 0xf8, + 0x2b, 0x32, 0x05, 0xeb, 0x43, 0x03, 0x02, 0x25, 0x5c, 0x78, 0x65, 0xf3, + 0x1f, 0x14, 0x5c, 0x70, 0x14, 0x78, 0x04, 0xeb, 0x04, 0x12, 0x33, 0x4b, + 0x01, 0xeb, 0xc2, 0x01, 0x04, 0xeb, 0x84, 0x02, 0x03, 0xeb, 0xc2, 0x02, + 0xc9, 0x68, 0x12, 0x7d, 0x01, 0x2a, 0x05, 0xd1, 0xd1, 0xf8, 0x60, 0x22, + 0x01, 0x32, 0xc1, 0xf8, 0x60, 0x22, 0x04, 0xe0, 0xd1, 0xf8, 0x54, 0x22, + 0x01, 0x32, 0xc1, 0xf8, 0x54, 0x22, 0xd1, 0xf8, 0xdc, 0x20, 0x05, 0x23, + 0x63, 0xf3, 0x03, 0x02, 0xc1, 0xf8, 0xdc, 0x20, 0xf8, 0xbd, 0x44, 0xb1, + 0x93, 0xf8, 0x2b, 0x32, 0x04, 0x25, 0x04, 0xeb, 0x43, 0x03, 0x5c, 0x78, + 0x65, 0xf3, 0x1f, 0x14, 0x5c, 0x70, 0x13, 0x78, 0xc1, 0x4d, 0xc3, 0xeb, + 0x43, 0x14, 0x05, 0xeb, 0xc4, 0x04, 0x94, 0xf8, 0x9e, 0x40, 0x01, 0x2c, + 0x11, 0xd1, 0x03, 0xeb, 0x03, 0x14, 0x01, 0xeb, 0xc4, 0x04, 0xe4, 0x68, + 0x5c, 0xb1, 0xd4, 0xf8, 0x20, 0x52, 0x45, 0xb1, 0x94, 0xf8, 0x2b, 0x32, + 0x05, 0xeb, 0x43, 0x03, 0x5c, 0x78, 0x44, 0xf0, 0x01, 0x04, 0x5c, 0x70, + 0x13, 0x78, 0x03, 0xeb, 0x03, 0x12, 0x01, 0xeb, 0xc2, 0x01, 0xc9, 0x68, + 0x91, 0xf9, 0x78, 0x21, 0xb2, 0xf1, 0xff, 0x3f, 0x00, 0xdd, 0xf8, 0xbd, + 0x00, 0x29, 0xfc, 0xd0, 0xd1, 0xf8, 0x20, 0x22, 0x00, 0x2a, 0xf8, 0xd0, + 0x91, 0xf8, 0x2b, 0x12, 0x02, 0xeb, 0x41, 0x01, 0x4a, 0x78, 0x42, 0xf0, + 0x02, 0x02, 0x4a, 0x70, 0xf8, 0xbd, 0x00, 0xbf, 0x74, 0x87, 0x08, 0x00, + 0xfc, 0x6d, 0x01, 0x00, 0x40, 0x36, 0x01, 0x00, 0xb0, 0xe6, 0x05, 0x00, + 0x84, 0x71, 0x01, 0x00, 0xe0, 0x35, 0x01, 0x00, 0xf8, 0xb5, 0x9f, 0x48, + 0xa1, 0x49, 0x00, 0x78, 0x00, 0xeb, 0x00, 0x10, 0x01, 0xeb, 0xc0, 0x02, + 0x51, 0xf8, 0x30, 0x00, 0xd5, 0x68, 0xd0, 0xf8, 0xd4, 0x00, 0x46, 0x7f, + 0x01, 0xf0, 0x08, 0xfe, 0xb0, 0xb1, 0xd5, 0xf8, 0x3c, 0x01, 0x00, 0xf0, + 0x51, 0xf8, 0x98, 0xb1, 0xd5, 0xf8, 0x00, 0x11, 0x84, 0x7f, 0xb1, 0xf8, + 0x8a, 0x10, 0x01, 0xf0, 0x04, 0x02, 0x6e, 0xb1, 0x81, 0x88, 0x01, 0xeb, + 0x02, 0x0c, 0x01, 0x89, 0x01, 0xeb, 0x02, 0x0e, 0x81, 0x89, 0x8e, 0x18, + 0x01, 0x8a, 0x0d, 0xe0, 0x00, 0x21, 0x36, 0xe0, 0x01, 0x21, 0x34, 0xe0, + 0xc1, 0x88, 0x01, 0xeb, 0x02, 0x0c, 0x41, 0x89, 0x01, 0xeb, 0x02, 0x0e, + 0xc1, 0x89, 0x8e, 0x18, 0x41, 0x8a, 0x02, 0x30, 0x8f, 0x18, 0x01, 0x21, + 0x21, 0xea, 0x04, 0x03, 0xdc, 0x03, 0x44, 0xea, 0xc3, 0x75, 0x45, 0xea, + 0x06, 0x44, 0xbe, 0xb2, 0x45, 0xea, 0x0c, 0x45, 0x34, 0x43, 0x24, 0xf0, + 0x7c, 0x26, 0x0f, 0x4c, 0x27, 0x68, 0x07, 0xf0, 0x7c, 0x27, 0x3e, 0x44, + 0x26, 0x60, 0x1f, 0xfa, 0x8e, 0xf6, 0x35, 0x43, 0x66, 0x68, 0x25, 0xf0, + 0x7c, 0x25, 0x06, 0xf0, 0x7c, 0x26, 0x35, 0x44, 0x65, 0x60, 0x00, 0x88, + 0x10, 0x44, 0x48, 0xf2, 0xff, 0x32, 0x10, 0x40, 0xa2, 0x68, 0x40, 0xea, + 0xc3, 0x30, 0x02, 0xf0, 0x7c, 0x22, 0x10, 0x44, 0xa0, 0x60, 0x08, 0x46, + 0xf8, 0xbd, 0x00, 0xbf, 0x34, 0x14, 0x21, 0x40, 0x30, 0xb1, 0x90, 0xf8, + 0x21, 0x10, 0x00, 0x29, 0x18, 0xbf, 0x81, 0x1c, 0x08, 0x46, 0x70, 0x47, + 0x00, 0x20, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x43, 0x66, 0x4e, 0xdf, 0xf8, + 0x9c, 0x91, 0x30, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x09, 0xeb, 0xc0, 0x01, + 0x08, 0x46, 0x50, 0xf8, 0x0c, 0x4f, 0x54, 0xb3, 0x82, 0x4a, 0x94, 0xf8, + 0x1d, 0x31, 0x12, 0x68, 0xc3, 0xeb, 0x03, 0x13, 0x02, 0xeb, 0x43, 0x15, + 0xd5, 0xf8, 0xa0, 0x20, 0x52, 0x7f, 0x2a, 0xb1, 0x94, 0xf8, 0xf8, 0x21, + 0x12, 0xb1, 0x01, 0x3a, 0x84, 0xf8, 0xf8, 0x21, 0xb1, 0xf8, 0xdc, 0x10, + 0xc9, 0x07, 0x1b, 0xd1, 0xd4, 0xf8, 0xdc, 0x10, 0x0c, 0x22, 0x62, 0xf3, + 0x03, 0x01, 0xc4, 0xf8, 0xdc, 0x10, 0x94, 0xf9, 0x78, 0x11, 0xb1, 0xf1, + 0xff, 0x3f, 0x70, 0xdd, 0xd4, 0xf8, 0x9c, 0x10, 0x01, 0x31, 0xc4, 0xf8, + 0x9c, 0x10, 0x04, 0x68, 0x00, 0x2c, 0x6d, 0xd1, 0x7c, 0xe0, 0x00, 0x20, + 0x4f, 0xf4, 0xe3, 0x71, 0x00, 0x25, 0xe9, 0xf7, 0x4f, 0xfc, 0x76, 0xe0, + 0x49, 0x48, 0x00, 0x68, 0x80, 0x47, 0x30, 0x78, 0x48, 0x4f, 0x01, 0x21, + 0x01, 0x22, 0x00, 0xeb, 0x00, 0x10, 0x57, 0xf8, 0x30, 0x00, 0xd0, 0xf8, + 0xd4, 0x00, 0x43, 0x7f, 0x04, 0xf5, 0xe8, 0x70, 0x1e, 0xf0, 0xd8, 0xf9, + 0x30, 0x78, 0x00, 0xeb, 0x00, 0x11, 0x07, 0xeb, 0xc1, 0x01, 0x49, 0x68, + 0x49, 0x7f, 0xe9, 0xb1, 0x3e, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, + 0xd5, 0xf8, 0xb8, 0x10, 0x03, 0x20, 0xc5, 0xe9, 0x31, 0x10, 0x3b, 0x4d, + 0x28, 0x78, 0xc0, 0x07, 0x0b, 0xd0, 0x3a, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x38, 0xb1, 0xb4, 0xf8, 0x58, 0x11, 0x80, 0x46, 0x20, 0x46, 0x00, 0xf0, + 0x71, 0xf8, 0xc8, 0xf8, 0x04, 0x00, 0x28, 0x78, 0x00, 0xf0, 0xfe, 0x00, + 0x28, 0x70, 0x30, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0xb4, 0xf8, 0x52, 0x21, + 0x59, 0xf8, 0x30, 0x10, 0x09, 0xeb, 0xc0, 0x00, 0xb1, 0xf8, 0x8a, 0x10, + 0x01, 0xf0, 0x04, 0x01, 0x11, 0x44, 0xb0, 0xf8, 0xde, 0x20, 0x91, 0x42, + 0x15, 0xd2, 0x2a, 0x49, 0x00, 0x20, 0x00, 0x25, 0x01, 0xf0, 0x20, 0xfd, + 0x30, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x09, 0xeb, 0xc0, 0x00, 0xb0, 0xf8, + 0xdc, 0x10, 0x41, 0xf0, 0x40, 0x01, 0xa0, 0xf8, 0xdc, 0x10, 0xd4, 0xf8, + 0xa0, 0x00, 0x01, 0x30, 0xc4, 0xf8, 0xa0, 0x00, 0x17, 0xe0, 0x01, 0x25, + 0x15, 0xe0, 0xd4, 0xf8, 0x58, 0x02, 0x01, 0x30, 0xc4, 0xf8, 0x58, 0x02, + 0xd4, 0xf8, 0x00, 0x21, 0x62, 0xb1, 0x92, 0xf8, 0x35, 0x01, 0x1a, 0x49, + 0x68, 0x23, 0x10, 0xfb, 0x03, 0x13, 0x1b, 0x79, 0x01, 0x2b, 0x03, 0xd1, + 0xd2, 0xf8, 0xd4, 0x20, 0x52, 0x7f, 0x1a, 0xb1, 0x00, 0x25, 0x28, 0x46, + 0xbd, 0xe8, 0xf8, 0x83, 0x94, 0xf8, 0xb9, 0x21, 0x1a, 0xb1, 0x00, 0x25, + 0x84, 0xf8, 0xb9, 0x51, 0xf5, 0xe7, 0x68, 0x22, 0x10, 0xfb, 0x02, 0x10, + 0x94, 0xf8, 0x4a, 0x11, 0x04, 0x29, 0x28, 0xbf, 0x04, 0x21, 0x00, 0xeb, + 0xc1, 0x00, 0xc1, 0x88, 0x01, 0x31, 0xc1, 0x80, 0xe6, 0xe7, 0x00, 0xbf, + 0x74, 0x87, 0x08, 0x00, 0x0c, 0x6f, 0x01, 0x00, 0x98, 0xbb, 0x08, 0x00, + 0xfc, 0x6d, 0x01, 0x00, 0xa4, 0xbb, 0x08, 0x00, 0x97, 0x53, 0x01, 0x00, + 0x90, 0xbb, 0x08, 0x00, 0x78, 0xef, 0x03, 0x00, 0xb0, 0xe6, 0x05, 0x00, + 0xb0, 0xb5, 0xb0, 0xf8, 0x74, 0x21, 0x53, 0x1a, 0x1c, 0xb2, 0xb4, 0xf1, + 0xff, 0x3f, 0x12, 0xdd, 0x14, 0x49, 0x90, 0xf8, 0x1d, 0x01, 0x09, 0x68, + 0xc0, 0xeb, 0x00, 0x10, 0x01, 0xeb, 0x40, 0x10, 0x11, 0x49, 0x05, 0x89, + 0xb8, 0x30, 0x09, 0x68, 0x88, 0x47, 0xa1, 0xb2, 0x0f, 0x4a, 0x69, 0x43, + 0x01, 0xfb, 0x02, 0x00, 0xb0, 0xbd, 0x89, 0x1a, 0x0a, 0x4a, 0x90, 0xf8, + 0x1d, 0x01, 0x89, 0xb2, 0x12, 0x68, 0xc0, 0xeb, 0x00, 0x10, 0x02, 0xeb, + 0x40, 0x10, 0x02, 0x89, 0xb8, 0x30, 0x01, 0xfb, 0x02, 0xf4, 0x05, 0x49, + 0x09, 0x68, 0x88, 0x47, 0x40, 0xf2, 0xe2, 0x41, 0x04, 0xfb, 0x01, 0x00, + 0xb0, 0xbd, 0x00, 0xbf, 0xe0, 0x35, 0x01, 0x00, 0xd0, 0xb6, 0x08, 0x00, + 0x1e, 0xfb, 0xff, 0xff, 0x2d, 0xe9, 0xfe, 0x4f, 0xdf, 0xf8, 0xd8, 0xa6, + 0xdf, 0xf8, 0xd8, 0x86, 0x9a, 0xf8, 0x00, 0x00, 0xc0, 0xeb, 0x40, 0x10, + 0x08, 0xeb, 0xc0, 0x01, 0xcc, 0x68, 0x00, 0x2c, 0x00, 0xf0, 0xa4, 0x80, + 0x58, 0xf8, 0x30, 0x00, 0x00, 0x28, 0x00, 0xf0, 0x9f, 0x80, 0xb4, 0xf8, + 0x78, 0x01, 0x94, 0xf8, 0x60, 0x21, 0x94, 0xf8, 0x68, 0x11, 0x20, 0xf0, + 0x02, 0x00, 0xa4, 0xf8, 0x78, 0x01, 0xdf, 0xf8, 0xa8, 0x06, 0x03, 0x68, + 0x20, 0x46, 0x98, 0x47, 0x9a, 0xf8, 0x00, 0x00, 0xdf, 0xf8, 0x9c, 0x96, + 0xc0, 0xeb, 0x40, 0x11, 0x00, 0xeb, 0x00, 0x10, 0x09, 0xeb, 0xc0, 0x00, + 0x08, 0xeb, 0xc1, 0x01, 0xc0, 0x68, 0x90, 0xf8, 0x60, 0x01, 0x81, 0xf8, + 0xa0, 0x00, 0xdf, 0xf8, 0x84, 0x06, 0x00, 0x68, 0x80, 0x47, 0xd2, 0x48, + 0x00, 0x25, 0x05, 0x60, 0xd1, 0x48, 0x05, 0x60, 0xd1, 0x48, 0x05, 0x60, + 0xdf, 0xf8, 0x70, 0x06, 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, 0xdf, 0xf8, + 0x6c, 0x06, 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, 0xdf, 0xf8, 0x64, 0x16, + 0x94, 0xf8, 0x7d, 0x01, 0x0a, 0x68, 0xb4, 0xf8, 0x78, 0x11, 0x01, 0xf0, + 0x01, 0x01, 0x90, 0x47, 0x9a, 0xf8, 0x00, 0x70, 0xc7, 0xeb, 0x47, 0x10, + 0x08, 0xeb, 0xc0, 0x00, 0xb0, 0xf8, 0xdc, 0x10, 0xc8, 0x07, 0x00, 0xf0, + 0xba, 0x81, 0x01, 0xf0, 0x49, 0x00, 0x09, 0x28, 0x0f, 0xd0, 0xdf, 0xf8, + 0x38, 0x06, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x9a, 0xf8, 0x00, 0x70, + 0x00, 0x28, 0xc7, 0xeb, 0x47, 0x11, 0x08, 0xeb, 0xc1, 0x02, 0xb2, 0xf8, + 0xdc, 0x10, 0x00, 0xf0, 0x85, 0x80, 0xc7, 0xeb, 0x47, 0x10, 0x08, 0xeb, + 0xc0, 0x06, 0x41, 0xf0, 0x10, 0x00, 0xa6, 0xf8, 0xdc, 0x00, 0xd4, 0xf8, + 0x3c, 0x01, 0xff, 0xf7, 0x5d, 0xfe, 0x28, 0xb1, 0x05, 0x46, 0x96, 0xf8, + 0x9d, 0x00, 0x00, 0x28, 0x00, 0xf0, 0x8a, 0x80, 0xb4, 0xf8, 0x78, 0x01, + 0xc1, 0x07, 0x00, 0xf0, 0x6b, 0x81, 0xc7, 0xeb, 0x47, 0x11, 0x94, 0xf8, + 0x7d, 0x31, 0x08, 0xeb, 0xc1, 0x01, 0x91, 0xf8, 0x99, 0x20, 0x93, 0x42, + 0x27, 0xd1, 0xb1, 0xf8, 0xdc, 0x20, 0x42, 0xf4, 0x80, 0x62, 0xa1, 0xf8, + 0xdc, 0x20, 0xd4, 0xf8, 0x00, 0x11, 0x00, 0x29, 0x00, 0xf0, 0x51, 0x81, + 0x91, 0xf8, 0x35, 0x11, 0xdf, 0xf8, 0xdc, 0x25, 0x68, 0x23, 0x11, 0xfb, + 0x03, 0x23, 0x1b, 0x79, 0x01, 0x2b, 0x40, 0xf0, 0x46, 0x81, 0x94, 0xf8, + 0xb9, 0x31, 0x00, 0x2b, 0x00, 0xf0, 0x34, 0x81, 0x00, 0x21, 0x84, 0xf8, + 0xb9, 0x11, 0x3c, 0xe1, 0x00, 0x20, 0x40, 0xf2, 0x92, 0x21, 0x00, 0x25, + 0xe9, 0xf7, 0xba, 0xfa, 0x28, 0x46, 0xbd, 0xe8, 0xfe, 0x8f, 0xd4, 0xf8, + 0x30, 0x02, 0x28, 0xb1, 0x80, 0x6a, 0x18, 0xb1, 0x01, 0x7d, 0x09, 0xb9, + 0x06, 0x21, 0x01, 0x75, 0xdf, 0xf8, 0x8c, 0x05, 0x94, 0xf8, 0x68, 0x11, + 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0xdf, 0xf8, 0x84, 0x05, 0x01, 0x68, + 0x20, 0x46, 0x88, 0x47, 0xb4, 0xf8, 0x78, 0x01, 0xd4, 0xf8, 0x80, 0x20, + 0xd4, 0xf8, 0x00, 0x11, 0x20, 0xf0, 0x01, 0x00, 0x01, 0x32, 0x00, 0x29, + 0xa4, 0xf8, 0x78, 0x01, 0xc4, 0xf8, 0x80, 0x20, 0x00, 0xf0, 0x14, 0x81, + 0x91, 0xf8, 0x35, 0x11, 0xdf, 0xf8, 0x58, 0x25, 0x68, 0x23, 0x11, 0xfb, + 0x03, 0x21, 0x0a, 0x79, 0x01, 0x2a, 0x40, 0xf0, 0x09, 0x81, 0x94, 0xf8, + 0x4a, 0x21, 0x04, 0x2a, 0x28, 0xbf, 0x04, 0x22, 0x01, 0xeb, 0xc2, 0x01, + 0x4a, 0x89, 0x01, 0x32, 0x4a, 0x81, 0xfd, 0xe0, 0x48, 0x06, 0x00, 0xf1, + 0x1d, 0x81, 0x02, 0x20, 0x09, 0x21, 0x82, 0xf8, 0x9e, 0x00, 0xd4, 0xf8, + 0xdc, 0x00, 0x61, 0xf3, 0x03, 0x00, 0xc4, 0xf8, 0xdc, 0x00, 0xb2, 0xf8, + 0xde, 0x00, 0x00, 0x28, 0x00, 0xf0, 0x0e, 0x81, 0xd4, 0xf8, 0xa4, 0x00, + 0x01, 0x30, 0xc4, 0xf8, 0xa4, 0x00, 0x07, 0xe1, 0x96, 0xf8, 0xb2, 0x20, + 0x94, 0xf8, 0x54, 0x01, 0x90, 0x42, 0x00, 0xf0, 0x95, 0x80, 0x94, 0xf8, + 0x1e, 0x02, 0x90, 0x42, 0x16, 0xd0, 0x94, 0xf8, 0x44, 0x00, 0x01, 0xa9, + 0x40, 0xea, 0x02, 0x40, 0x00, 0xf5, 0x80, 0x70, 0x01, 0x90, 0xdf, 0xf8, + 0xbc, 0x04, 0x02, 0x68, 0x31, 0x20, 0x90, 0x47, 0x9a, 0xf8, 0x00, 0x00, + 0xc0, 0xeb, 0x40, 0x10, 0x08, 0xeb, 0xc0, 0x00, 0x90, 0xf8, 0xb2, 0x20, + 0x84, 0xf8, 0x1e, 0x22, 0xd4, 0xf8, 0x00, 0x01, 0x84, 0xf8, 0x54, 0x21, + 0x04, 0xf2, 0xcd, 0x13, 0xd0, 0xf8, 0xd4, 0x00, 0x41, 0x7f, 0x0d, 0xf1, + 0x0a, 0x00, 0x00, 0x90, 0x28, 0x46, 0x00, 0x29, 0x18, 0xbf, 0x01, 0x21, + 0xfd, 0xf7, 0x92, 0xfd, 0x94, 0xf8, 0x20, 0x01, 0x94, 0xf8, 0xcd, 0x11, + 0xb0, 0xfb, 0xf1, 0xf2, 0x02, 0xfb, 0x11, 0x00, 0x84, 0xf8, 0x56, 0x21, + 0x10, 0x44, 0x01, 0x38, 0x84, 0xf8, 0x55, 0x01, 0x9a, 0xf8, 0x00, 0x00, + 0xc0, 0xeb, 0x40, 0x10, 0x08, 0xeb, 0xc0, 0x00, 0x90, 0xf8, 0x72, 0x00, + 0x00, 0x28, 0x4f, 0xd0, 0xdf, 0xf8, 0x4c, 0xb4, 0x01, 0x38, 0xb4, 0xf8, + 0x74, 0x11, 0x04, 0xf5, 0xa8, 0x75, 0xc2, 0xb2, 0x28, 0x46, 0xdb, 0xf8, + 0x00, 0x30, 0x98, 0x47, 0x00, 0x28, 0x41, 0xd0, 0xdf, 0xf8, 0x34, 0x94, + 0xdf, 0xf8, 0x34, 0x74, 0xd4, 0xf8, 0x60, 0x21, 0x00, 0x20, 0x49, 0x46, + 0x01, 0xf0, 0x20, 0xfb, 0x39, 0x68, 0x20, 0x46, 0x88, 0x47, 0xd4, 0xf8, + 0x98, 0x00, 0xdb, 0xf8, 0x00, 0x30, 0xb4, 0xf8, 0x74, 0x11, 0x01, 0x30, + 0xc4, 0xf8, 0x98, 0x00, 0x9a, 0xf8, 0x00, 0x00, 0xc0, 0xeb, 0x40, 0x10, + 0x08, 0xeb, 0xc0, 0x00, 0x90, 0xf8, 0x72, 0x00, 0x01, 0x38, 0xc2, 0xb2, + 0x28, 0x46, 0x98, 0x47, 0x00, 0x28, 0xdf, 0xd1, 0xdf, 0xf8, 0xf4, 0x03, + 0x00, 0x22, 0x01, 0x23, 0x01, 0x25, 0x06, 0x68, 0x94, 0xf8, 0x60, 0x01, + 0x01, 0x38, 0xc1, 0xb2, 0x20, 0x46, 0xb0, 0x47, 0x9a, 0xf8, 0x00, 0x00, + 0xdf, 0xf8, 0xb0, 0x93, 0xc0, 0xeb, 0x40, 0x11, 0x00, 0xeb, 0x00, 0x10, + 0x09, 0xeb, 0xc0, 0x00, 0x08, 0xeb, 0xc1, 0x01, 0xc0, 0x68, 0x90, 0xf8, + 0x60, 0x01, 0x81, 0xf8, 0xa0, 0x00, 0x00, 0xe0, 0x00, 0x25, 0xdf, 0xf8, + 0xbc, 0x03, 0x00, 0x68, 0x00, 0x6a, 0x80, 0x47, 0x70, 0xb1, 0xdd, 0xb1, + 0x9a, 0xf8, 0x00, 0x70, 0x02, 0x21, 0xc7, 0xeb, 0x47, 0x10, 0x08, 0xeb, + 0xc0, 0x00, 0x80, 0xf8, 0x9e, 0x10, 0x90, 0xf8, 0x9a, 0x10, 0x84, 0xf8, + 0x7e, 0x11, 0xa6, 0xe1, 0x9a, 0xf8, 0x00, 0x70, 0xc7, 0xeb, 0x47, 0x10, + 0x08, 0xeb, 0xc0, 0x00, 0xb0, 0xf8, 0xde, 0x10, 0x00, 0x29, 0x00, 0xf0, + 0x90, 0x81, 0x90, 0xf8, 0x9a, 0x10, 0x92, 0xe1, 0x9a, 0xf8, 0x00, 0x70, + 0x94, 0xf8, 0x7e, 0x21, 0xc7, 0xeb, 0x47, 0x10, 0x08, 0xeb, 0xc0, 0x00, + 0x90, 0xf8, 0x9a, 0x10, 0x8a, 0x42, 0x3f, 0xf4, 0xa9, 0xae, 0x87, 0xe1, + 0x34, 0x14, 0x21, 0x40, 0x38, 0x14, 0x21, 0x40, 0x3c, 0x14, 0x21, 0x40, + 0x68, 0x23, 0x11, 0xfb, 0x03, 0x21, 0x94, 0xf8, 0x4a, 0x21, 0x04, 0x2a, + 0x28, 0xbf, 0x04, 0x22, 0x01, 0xeb, 0xc2, 0x01, 0x0a, 0x89, 0x01, 0x32, + 0x0a, 0x81, 0xd4, 0xf8, 0x5c, 0x12, 0x01, 0x31, 0xc4, 0xf8, 0x5c, 0x12, + 0x9a, 0xf8, 0x00, 0x70, 0xc7, 0xeb, 0x47, 0x11, 0x08, 0xeb, 0xc1, 0x01, + 0x91, 0xf8, 0x9c, 0x20, 0x1a, 0xb1, 0x40, 0xf0, 0x04, 0x00, 0xa4, 0xf8, + 0x78, 0x01, 0xd4, 0xf8, 0xdc, 0x20, 0x01, 0x23, 0x63, 0xf3, 0x03, 0x02, + 0xc4, 0xf8, 0xdc, 0x20, 0xb1, 0xf8, 0xdc, 0x20, 0x02, 0xf0, 0x69, 0x02, + 0x09, 0x2a, 0x02, 0xd0, 0x91, 0xf8, 0x8f, 0x20, 0x22, 0xb9, 0x91, 0xf8, + 0x9d, 0x10, 0x00, 0x29, 0x00, 0xf0, 0x0a, 0x81, 0x01, 0x25, 0xc7, 0xeb, + 0x47, 0x10, 0x08, 0xeb, 0xc0, 0x00, 0x41, 0x68, 0x49, 0x7f, 0x39, 0xbb, + 0x90, 0xf8, 0x9e, 0x10, 0x01, 0x29, 0x23, 0xd0, 0x90, 0xf8, 0x72, 0x20, + 0xae, 0x48, 0xb4, 0xf8, 0x74, 0x11, 0x03, 0x68, 0x04, 0xf5, 0xa8, 0x70, + 0x98, 0x47, 0xc8, 0xb1, 0x20, 0x46, 0x00, 0xf0, 0x73, 0xf9, 0xab, 0x48, + 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0xd4, 0xf8, 0x98, 0x00, 0x94, 0xf8, + 0x1d, 0x11, 0x01, 0x30, 0xc1, 0xeb, 0x01, 0x11, 0xc4, 0xf8, 0x98, 0x00, + 0xaa, 0x48, 0x00, 0x68, 0x00, 0xeb, 0x41, 0x10, 0x90, 0xf8, 0xd6, 0x10, + 0x41, 0xf0, 0x01, 0x01, 0x80, 0xf8, 0xd6, 0x10, 0x00, 0xf0, 0x8a, 0xf9, + 0xa5, 0x48, 0x01, 0x78, 0x0a, 0x07, 0x23, 0xd4, 0xb4, 0xf8, 0x78, 0x21, + 0x52, 0x07, 0x7f, 0xf5, 0x67, 0xae, 0x9a, 0xf8, 0x00, 0x20, 0x02, 0xeb, + 0x02, 0x13, 0x09, 0xeb, 0xc3, 0x03, 0x5b, 0x68, 0x5b, 0x7f, 0x00, 0x2b, + 0x7f, 0xf4, 0x5c, 0xae, 0x9d, 0x4b, 0x1b, 0x68, 0xa3, 0x42, 0x7f, 0xf4, + 0x57, 0xae, 0x9f, 0x4b, 0x5c, 0x24, 0x01, 0xf0, 0xfd, 0x01, 0x01, 0x70, + 0x12, 0xfb, 0x04, 0x32, 0x00, 0x23, 0x82, 0xf8, 0x4d, 0x30, 0xd3, 0x62, + 0x01, 0x23, 0x82, 0xf8, 0x26, 0x30, 0x47, 0xe6, 0xed, 0x48, 0x94, 0xf8, + 0x1d, 0x11, 0x00, 0x68, 0xc1, 0xeb, 0x01, 0x11, 0x00, 0xeb, 0x41, 0x10, + 0xd0, 0xf8, 0xa4, 0x00, 0x84, 0x42, 0x08, 0xbf, 0x54, 0xf8, 0x04, 0x0c, + 0xb4, 0xf8, 0x78, 0x11, 0x49, 0x07, 0x00, 0xf1, 0x8b, 0x80, 0x94, 0xf8, + 0x50, 0xc1, 0xbc, 0xf1, 0x00, 0x0f, 0x1d, 0xd0, 0xb4, 0xf8, 0x58, 0x21, + 0xb4, 0xf8, 0x74, 0x31, 0x9a, 0x1a, 0x12, 0xb2, 0x00, 0x2a, 0x15, 0xd4, + 0x82, 0x4b, 0x94, 0xf8, 0x51, 0x61, 0x94, 0xf8, 0x56, 0x11, 0x94, 0xf8, + 0x55, 0x71, 0x63, 0xea, 0x02, 0x02, 0x94, 0xf8, 0x20, 0x31, 0x32, 0x44, + 0x5a, 0x43, 0x94, 0xf8, 0x57, 0x31, 0x13, 0xfb, 0x01, 0x21, 0x94, 0xf8, + 0xfb, 0x21, 0x39, 0x44, 0x8a, 0x1a, 0x00, 0xe0, 0xff, 0x22, 0x94, 0xf8, + 0x46, 0x31, 0xeb, 0xb1, 0xb4, 0xf8, 0x4e, 0x11, 0xb4, 0xf8, 0x74, 0x61, + 0x71, 0x1a, 0x0e, 0xb2, 0x00, 0x2e, 0x15, 0xd4, 0x71, 0x49, 0x94, 0xf8, + 0x47, 0x71, 0x94, 0xf8, 0x4b, 0xe1, 0x61, 0xea, 0x06, 0x08, 0x94, 0xf8, + 0x20, 0x61, 0x94, 0xf8, 0x4c, 0x11, 0x47, 0x44, 0x7e, 0x43, 0x94, 0xf8, + 0x4d, 0x71, 0x17, 0xfb, 0x01, 0x61, 0x94, 0xf8, 0xfb, 0x61, 0x71, 0x44, + 0x8e, 0x1b, 0x00, 0xe0, 0xff, 0x26, 0xb2, 0x42, 0x1a, 0xda, 0xbc, 0xf1, + 0x00, 0x0f, 0x36, 0xd0, 0xb4, 0xf8, 0x58, 0x11, 0xb4, 0xf8, 0x74, 0x21, + 0x51, 0x1a, 0x09, 0xb2, 0x00, 0x29, 0x2e, 0xd4, 0x5f, 0x4a, 0x94, 0xf8, + 0x51, 0x31, 0x94, 0xf8, 0x55, 0x61, 0x94, 0xf8, 0x56, 0x71, 0x62, 0xea, + 0x01, 0x01, 0x94, 0xf8, 0x20, 0x21, 0x19, 0x44, 0x51, 0x43, 0x94, 0xf8, + 0x57, 0x21, 0x17, 0xe0, 0xeb, 0xb1, 0xb4, 0xf8, 0x4e, 0x11, 0xb4, 0xf8, + 0x74, 0x21, 0x51, 0x1a, 0x09, 0xb2, 0x00, 0x29, 0x15, 0xd4, 0x53, 0x4a, + 0x94, 0xf8, 0x47, 0x31, 0x94, 0xf8, 0x4b, 0x61, 0x94, 0xf8, 0x4c, 0x71, + 0x62, 0xea, 0x01, 0x01, 0x94, 0xf8, 0x20, 0x21, 0x19, 0x44, 0x51, 0x43, + 0x94, 0xf8, 0x4d, 0x21, 0x12, 0xfb, 0x07, 0x11, 0x94, 0xf8, 0xfb, 0x21, + 0x31, 0x44, 0x89, 0x1a, 0x00, 0xe0, 0xff, 0x21, 0x84, 0xf8, 0xfa, 0x11, + 0xc9, 0xb2, 0x90, 0xf8, 0xfa, 0x21, 0x91, 0x42, 0xff, 0xf4, 0xaa, 0xad, + 0x44, 0x49, 0x45, 0x4a, 0x08, 0x60, 0x90, 0xf8, 0xfb, 0x11, 0x11, 0x70, + 0x00, 0xf0, 0x38, 0xf9, 0x42, 0x4c, 0x01, 0x20, 0x00, 0x26, 0x20, 0x71, + 0x41, 0x48, 0x01, 0x68, 0x00, 0x20, 0x88, 0x47, 0x26, 0x71, 0x97, 0xe5, + 0x80, 0x06, 0x08, 0xd5, 0x33, 0x48, 0x00, 0x68, 0x00, 0x6a, 0x80, 0x47, + 0x9a, 0xf8, 0x00, 0x70, 0x00, 0x28, 0x7f, 0xf4, 0xeb, 0xae, 0xc7, 0xeb, + 0x47, 0x10, 0x94, 0xf8, 0x7e, 0x21, 0x08, 0xeb, 0xc0, 0x00, 0x90, 0xf8, + 0x9a, 0x10, 0x8a, 0x42, 0x19, 0xd1, 0x28, 0x48, 0x01, 0x68, 0x20, 0x46, + 0x88, 0x47, 0xd4, 0xf8, 0x94, 0x00, 0xd4, 0xf8, 0xdc, 0x10, 0x9a, 0xf8, + 0x00, 0x70, 0x01, 0x25, 0x01, 0x30, 0xc4, 0xf8, 0x94, 0x00, 0x02, 0x20, + 0x60, 0xf3, 0x03, 0x01, 0xc7, 0xeb, 0x47, 0x10, 0x08, 0xeb, 0xc0, 0x00, + 0xc4, 0xf8, 0xdc, 0x10, 0x80, 0xf8, 0x9e, 0x50, 0xc7, 0xe6, 0xb0, 0xf8, + 0xdc, 0x10, 0x41, 0xf0, 0x80, 0x01, 0xa0, 0xf8, 0xdc, 0x10, 0xd4, 0xf8, + 0xa8, 0x00, 0x01, 0x30, 0xc4, 0xf8, 0xa8, 0x00, 0xba, 0xe6, 0x90, 0xf8, + 0x9a, 0x20, 0x94, 0xf8, 0x7e, 0x11, 0x91, 0x42, 0x02, 0xd1, 0x84, 0xf8, + 0x7e, 0x11, 0x1f, 0xe5, 0x02, 0x21, 0x80, 0xf8, 0x9e, 0x10, 0xb0, 0xf8, + 0xdc, 0x10, 0x41, 0xf0, 0x40, 0x01, 0xa0, 0xf8, 0xdc, 0x10, 0x15, 0xe5, + 0x74, 0x87, 0x08, 0x00, 0x0c, 0x6f, 0x01, 0x00, 0x40, 0xb7, 0x08, 0x00, + 0xfc, 0x6d, 0x01, 0x00, 0x60, 0xb7, 0x08, 0x00, 0x68, 0xd2, 0x08, 0x00, + 0x70, 0xe3, 0x08, 0x00, 0x44, 0xb7, 0x08, 0x00, 0x4c, 0xb7, 0x08, 0x00, + 0x1c, 0xa1, 0x08, 0x00, 0xd0, 0xb7, 0x08, 0x00, 0xc2, 0xef, 0x03, 0x00, + 0xd8, 0xb7, 0x08, 0x00, 0xc0, 0xb7, 0x08, 0x00, 0xe4, 0x35, 0x01, 0x00, + 0xbc, 0xb7, 0x08, 0x00, 0xd4, 0xb7, 0x08, 0x00, 0xb0, 0xe6, 0x05, 0x00, + 0xe0, 0x35, 0x01, 0x00, 0x97, 0x53, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xd8, 0x35, 0x01, 0x00, 0x98, 0x53, 0x01, 0x00, 0x14, 0xe6, 0x05, 0x00, + 0xb8, 0xbe, 0x08, 0x00, 0x44, 0x4f, 0x01, 0x00, 0x54, 0x49, 0x90, 0xf8, + 0x1d, 0x21, 0x09, 0x68, 0xc2, 0xeb, 0x02, 0x12, 0x01, 0xeb, 0x42, 0x11, + 0x91, 0xf8, 0xc1, 0x10, 0x03, 0x29, 0x07, 0xd8, 0xdf, 0xe8, 0x01, 0xf0, + 0x02, 0x0a, 0x0e, 0x12, 0xd0, 0xf8, 0x60, 0x21, 0x0c, 0x49, 0x0e, 0xe0, + 0xd0, 0xf8, 0x60, 0x21, 0x0b, 0x49, 0x0a, 0xe0, 0xd0, 0xf8, 0x60, 0x21, + 0x07, 0x49, 0x06, 0xe0, 0xd0, 0xf8, 0x60, 0x21, 0x04, 0x49, 0x02, 0xe0, + 0xd0, 0xf8, 0x60, 0x21, 0x01, 0x49, 0x00, 0x20, 0x01, 0xf0, 0xca, 0xb8, + 0xaa, 0xef, 0x03, 0x00, 0x9e, 0xef, 0x03, 0x00, 0x92, 0xef, 0x03, 0x00, + 0x86, 0xef, 0x03, 0x00, 0xb6, 0xef, 0x03, 0x00, 0x70, 0xb5, 0x6f, 0x48, + 0x39, 0x49, 0x00, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x01, 0xeb, 0xc0, 0x02, + 0xd0, 0x68, 0x90, 0xf8, 0x46, 0x11, 0x41, 0xb1, 0xb0, 0xf8, 0x4e, 0x31, + 0xb0, 0xf8, 0x74, 0x41, 0xe3, 0x1a, 0x1b, 0xb2, 0xb3, 0xf1, 0xff, 0x3f, + 0x2c, 0xdc, 0x90, 0xf8, 0x50, 0x31, 0x43, 0xb1, 0xb0, 0xf8, 0x58, 0x31, + 0xb0, 0xf8, 0x74, 0x41, 0xe3, 0x1a, 0x1b, 0xb2, 0xb3, 0xf1, 0xff, 0x3f, + 0x20, 0xdc, 0xb0, 0xf8, 0x78, 0x31, 0x43, 0xf0, 0x80, 0x04, 0xa0, 0xf8, + 0x78, 0x41, 0x28, 0x4c, 0xb4, 0xf8, 0xba, 0x41, 0xa4, 0x07, 0x15, 0xd5, + 0x54, 0x68, 0x64, 0x7f, 0x94, 0xb9, 0x25, 0x4c, 0x90, 0xf8, 0x1d, 0x51, + 0x90, 0xf8, 0x20, 0x61, 0x24, 0x68, 0xc5, 0xeb, 0x05, 0x15, 0x04, 0xeb, + 0x45, 0x14, 0x94, 0xf8, 0xc1, 0x40, 0x02, 0x34, 0xb4, 0x42, 0x04, 0xbf, + 0x43, 0xf0, 0x84, 0x03, 0xa0, 0xf8, 0x78, 0x31, 0xb2, 0xf8, 0xdc, 0x30, + 0xdb, 0x07, 0x06, 0xbf, 0x90, 0xf8, 0xb8, 0x31, 0x01, 0x33, 0x00, 0x23, + 0x52, 0x68, 0x80, 0xf8, 0xb8, 0x31, 0x52, 0x7f, 0x02, 0xb1, 0x70, 0xbd, + 0x00, 0x29, 0xfc, 0xd0, 0xda, 0xb2, 0x03, 0x2a, 0xf9, 0xd3, 0x90, 0xf8, + 0x47, 0x21, 0x02, 0x2a, 0xf5, 0xd3, 0x90, 0xf8, 0x50, 0x31, 0xb0, 0xf8, + 0x74, 0x21, 0x33, 0xb1, 0xb0, 0xf8, 0x58, 0x31, 0xd3, 0x1a, 0x1b, 0xb2, + 0xb3, 0xf1, 0xff, 0x3f, 0xe9, 0xdc, 0xb0, 0xf8, 0x4e, 0x31, 0x93, 0x42, + 0xe5, 0xd1, 0x90, 0xf8, 0x4d, 0x21, 0x01, 0x39, 0x91, 0x42, 0xe0, 0xd1, + 0xb0, 0xf8, 0x78, 0x11, 0x41, 0xf0, 0x04, 0x01, 0xa0, 0xf8, 0x78, 0x11, + 0x70, 0xbd, 0x00, 0xbf, 0x0c, 0x6f, 0x01, 0x00, 0xe8, 0x65, 0x08, 0x00, + 0xe0, 0x35, 0x01, 0x00, 0x2d, 0xe9, 0xf0, 0x47, 0x89, 0x46, 0x04, 0x46, + 0x20, 0xb9, 0x00, 0x20, 0x4f, 0xf4, 0x18, 0x71, 0xe3, 0xf7, 0xb8, 0xf8, + 0x94, 0xf8, 0x20, 0x01, 0x48, 0x45, 0x04, 0xd8, 0x00, 0x20, 0x40, 0xf2, + 0x61, 0x21, 0xe3, 0xf7, 0xaf, 0xf8, 0xd4, 0xf8, 0x00, 0x01, 0x00, 0xf2, + 0xed, 0x20, 0x00, 0xf0, 0x53, 0xf8, 0xdf, 0xf8, 0x94, 0x80, 0xdf, 0xf8, + 0x94, 0xa0, 0x5c, 0x27, 0x04, 0xf5, 0x82, 0x71, 0x98, 0xf8, 0x00, 0x00, + 0x10, 0xfb, 0x07, 0xa0, 0x41, 0x63, 0x94, 0xf8, 0x40, 0x11, 0x80, 0xf8, + 0x4f, 0x10, 0xd4, 0xf8, 0xe0, 0x10, 0x81, 0x60, 0x04, 0xf1, 0xe4, 0x01, + 0x0c, 0x30, 0x91, 0xe8, 0x6c, 0x00, 0x6c, 0xc0, 0x1a, 0x48, 0x4b, 0x46, + 0xd4, 0xf8, 0x00, 0x11, 0xb4, 0xf8, 0x74, 0x21, 0x05, 0x68, 0xd4, 0xf8, + 0xe0, 0x00, 0x01, 0xf5, 0x22, 0x71, 0xa8, 0x47, 0x98, 0xf8, 0x00, 0x00, + 0x94, 0xf8, 0x4a, 0x21, 0x02, 0x23, 0x10, 0xfb, 0x07, 0xf1, 0x0a, 0xf8, + 0x01, 0x20, 0x10, 0xfb, 0x07, 0xa1, 0x94, 0xf8, 0x54, 0x01, 0x48, 0x70, + 0xd4, 0xf8, 0x00, 0x01, 0xd0, 0xf8, 0x88, 0x20, 0x03, 0xea, 0x52, 0x45, + 0x03, 0xea, 0x12, 0x42, 0x01, 0x23, 0x81, 0xf8, 0x4b, 0x20, 0x81, 0xf8, + 0x4c, 0x50, 0x01, 0xf1, 0x52, 0x02, 0x07, 0x49, 0xd1, 0xf8, 0x00, 0xc0, + 0x94, 0xf8, 0x44, 0x10, 0xbd, 0xe8, 0xf0, 0x47, 0x60, 0x47, 0x00, 0xbf, + 0x74, 0x87, 0x08, 0x00, 0x44, 0x4f, 0x01, 0x00, 0x24, 0xa1, 0x08, 0x00, + 0xc4, 0xbc, 0x08, 0x00, 0xcd, 0x49, 0x08, 0x4a, 0x5c, 0x23, 0x09, 0x78, + 0x11, 0xfb, 0x03, 0x21, 0x02, 0x78, 0x4a, 0x60, 0x43, 0x78, 0x42, 0xea, + 0x03, 0x22, 0x4a, 0x60, 0x80, 0x78, 0x42, 0xea, 0x00, 0x40, 0x48, 0x60, + 0x70, 0x47, 0x00, 0xbf, 0x44, 0x4f, 0x01, 0x00, 0x2d, 0xe9, 0xf0, 0x41, + 0x8c, 0xb0, 0xc4, 0x68, 0x00, 0x2c, 0x3e, 0xd0, 0xc0, 0x4e, 0x05, 0x46, + 0xc0, 0x4f, 0x30, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x07, 0xeb, 0xc0, 0x00, + 0xb0, 0xf8, 0xdc, 0x00, 0x00, 0xf0, 0x49, 0x00, 0x09, 0x28, 0x1d, 0xd1, + 0xbb, 0x48, 0x00, 0x68, 0x80, 0x47, 0x29, 0x68, 0xc1, 0xf8, 0xd8, 0x00, + 0x20, 0x6c, 0x20, 0xf4, 0x80, 0x10, 0x20, 0x64, 0x28, 0x68, 0xd0, 0xf8, + 0xd8, 0x00, 0xc4, 0xf8, 0xf4, 0x00, 0x94, 0xf8, 0x54, 0x01, 0x02, 0x28, + 0x0a, 0xd3, 0x04, 0x28, 0x08, 0xd8, 0x30, 0x78, 0xc0, 0xeb, 0x40, 0x10, + 0x07, 0xeb, 0xc0, 0x00, 0x90, 0xf8, 0xb2, 0x00, 0x84, 0xf8, 0x54, 0x01, + 0x30, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x07, 0xeb, 0xc0, 0x01, 0x91, 0xf8, + 0x9e, 0x20, 0x01, 0xf1, 0xde, 0x00, 0x82, 0xb1, 0x02, 0x88, 0x2a, 0xb1, + 0x2b, 0x68, 0x93, 0xf8, 0x8a, 0x30, 0x5b, 0x07, 0x00, 0xf1, 0xc7, 0x80, + 0x09, 0xe0, 0x00, 0x20, 0x40, 0xf2, 0x26, 0x41, 0x0c, 0xb0, 0xbd, 0xe8, + 0xf0, 0x41, 0xe8, 0xf7, 0x57, 0xbe, 0x00, 0x21, 0x01, 0x80, 0x30, 0x78, + 0xc0, 0xeb, 0x40, 0x10, 0x07, 0xeb, 0xc0, 0x00, 0x41, 0x68, 0x49, 0x7f, + 0x39, 0xb3, 0x90, 0xf8, 0x9e, 0x10, 0x01, 0x29, 0x23, 0xd0, 0x90, 0xf8, + 0x72, 0x20, 0xc1, 0x48, 0xb4, 0xf8, 0x74, 0x11, 0x03, 0x68, 0x04, 0xf5, + 0xa8, 0x70, 0x98, 0x47, 0xc8, 0xb1, 0x20, 0x46, 0xff, 0xf7, 0x6c, 0xfe, + 0x96, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0xd4, 0xf8, 0x98, 0x00, + 0x94, 0xf8, 0x1d, 0x11, 0x01, 0x30, 0xc1, 0xeb, 0x01, 0x11, 0xc4, 0xf8, + 0x98, 0x00, 0xb6, 0x48, 0x00, 0x68, 0x00, 0xeb, 0x41, 0x10, 0x90, 0xf8, + 0xd6, 0x10, 0x41, 0xf0, 0x01, 0x01, 0x80, 0xf8, 0xd6, 0x10, 0x8c, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x98, 0xb3, 0x31, 0x78, 0x02, 0x68, 0xc1, 0xeb, + 0x41, 0x11, 0x6f, 0xf3, 0x9f, 0x52, 0x07, 0xeb, 0xc1, 0x01, 0xb1, 0xf8, + 0xde, 0x10, 0x42, 0xea, 0x81, 0x51, 0x01, 0x60, 0x21, 0xf4, 0x40, 0x61, + 0x32, 0x78, 0xc2, 0xeb, 0x42, 0x12, 0x07, 0xeb, 0xc2, 0x02, 0x92, 0xf8, + 0xa1, 0x20, 0x02, 0xf0, 0x03, 0x02, 0x41, 0xea, 0x82, 0x21, 0x01, 0x60, + 0x21, 0xf4, 0x40, 0x41, 0x32, 0x78, 0xc2, 0xeb, 0x42, 0x12, 0x07, 0xeb, + 0xc2, 0x02, 0x92, 0xf8, 0x9e, 0x20, 0x02, 0xf0, 0x03, 0x02, 0x41, 0xea, + 0x82, 0x31, 0x01, 0x60, 0x21, 0xf0, 0xff, 0x01, 0x32, 0x78, 0xc2, 0xeb, + 0x42, 0x12, 0x07, 0xeb, 0xc2, 0x02, 0x92, 0xf8, 0xa0, 0x20, 0x11, 0x44, + 0x01, 0x60, 0x30, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x07, 0xeb, 0xc0, 0x00, + 0x90, 0xf8, 0x9e, 0x20, 0x90, 0xf8, 0xa0, 0x10, 0x94, 0xf8, 0x60, 0x01, + 0x43, 0x1a, 0x6b, 0x48, 0x18, 0xbf, 0x01, 0x23, 0x05, 0x68, 0x20, 0x46, + 0xa8, 0x47, 0x94, 0xf8, 0x7c, 0x01, 0x01, 0x28, 0x13, 0xd1, 0x30, 0x78, + 0xc0, 0xeb, 0x40, 0x10, 0x07, 0xeb, 0xc0, 0x00, 0xb0, 0xf8, 0xdc, 0x00, + 0x00, 0xf0, 0x49, 0x00, 0x09, 0x28, 0x08, 0xd1, 0x02, 0x20, 0x21, 0x46, + 0x00, 0x22, 0x84, 0xf8, 0x7c, 0x01, 0x59, 0x48, 0x03, 0x68, 0xac, 0x20, + 0x98, 0x47, 0x30, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x07, 0xeb, 0xc0, 0x00, + 0xb0, 0xf8, 0xdc, 0x10, 0xc9, 0x07, 0x12, 0xd0, 0x00, 0xf1, 0xc0, 0x01, + 0x57, 0x48, 0xd0, 0xf8, 0x00, 0x80, 0x57, 0x48, 0x02, 0x68, 0x05, 0xa8, + 0x90, 0x47, 0x08, 0xaf, 0x05, 0xab, 0x0b, 0x9d, 0xc1, 0xcf, 0x0e, 0xcb, + 0x8d, 0xe8, 0xc1, 0x00, 0x20, 0x46, 0x03, 0x95, 0xc0, 0x47, 0x51, 0x4a, + 0x94, 0xf8, 0x44, 0x10, 0xd4, 0xf8, 0x00, 0x01, 0x12, 0x68, 0x90, 0x47, + 0x4e, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x0c, 0xb0, 0xbd, 0xe8, + 0xf0, 0x81, 0x04, 0x3a, 0x02, 0x80, 0xb1, 0xf8, 0xdc, 0x00, 0x00, 0xf0, + 0x49, 0x00, 0x09, 0x28, 0x41, 0xd1, 0xb4, 0xf8, 0x7a, 0x01, 0x40, 0x07, + 0x3d, 0xd4, 0x3b, 0x48, 0x00, 0x68, 0x00, 0x6a, 0x80, 0x47, 0xc0, 0xb3, + 0x94, 0xf9, 0x8c, 0x01, 0x00, 0x28, 0x34, 0xd4, 0xd4, 0xf8, 0xdc, 0x00, + 0x0a, 0x21, 0x61, 0xf3, 0x03, 0x00, 0xc4, 0xf8, 0xdc, 0x00, 0x30, 0x78, + 0xc0, 0xeb, 0x40, 0x10, 0x07, 0xeb, 0xc0, 0x00, 0xb0, 0xf8, 0xdc, 0x10, + 0x41, 0xf4, 0x80, 0x71, 0xa0, 0xf8, 0xdc, 0x10, 0x94, 0xf8, 0x78, 0x01, + 0x80, 0x06, 0x5c, 0xbf, 0xb4, 0xf8, 0x7a, 0x01, 0x5f, 0xea, 0x00, 0x70, + 0x3e, 0xd5, 0xb4, 0xf8, 0x74, 0x21, 0x2a, 0x49, 0x00, 0x20, 0x00, 0x25, + 0x00, 0xf0, 0x82, 0xfe, 0x30, 0x78, 0x28, 0x49, 0xc0, 0xeb, 0x40, 0x10, + 0x07, 0xeb, 0xc0, 0x00, 0x90, 0xf8, 0x72, 0x20, 0x00, 0x20, 0x00, 0xf0, + 0x77, 0xfe, 0x30, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x07, 0xeb, 0xc0, 0x00, + 0xa0, 0xf8, 0xde, 0x50, 0xf9, 0xe6, 0x30, 0x78, 0xc0, 0xeb, 0x40, 0x10, + 0x07, 0xeb, 0xc0, 0x00, 0xb0, 0xf8, 0xdc, 0x00, 0x00, 0xf0, 0x49, 0x00, + 0x09, 0x28, 0x04, 0xd1, 0x16, 0x48, 0x00, 0x68, 0x00, 0x6a, 0x80, 0x47, + 0x68, 0xb1, 0xb4, 0xf8, 0x7a, 0x01, 0x40, 0x07, 0x7f, 0xf5, 0xe5, 0xae, + 0x30, 0x78, 0x00, 0x21, 0xc0, 0xeb, 0x40, 0x10, 0x07, 0xeb, 0xc0, 0x00, + 0xa0, 0xf8, 0xde, 0x10, 0xdb, 0xe6, 0xb4, 0xf8, 0x78, 0x01, 0x20, 0xf0, + 0x20, 0x00, 0xa4, 0xf8, 0x78, 0x01, 0xd4, 0xe6, 0x0a, 0x48, 0x21, 0x46, + 0x3d, 0x22, 0x03, 0x68, 0xb1, 0x20, 0x98, 0x47, 0xb4, 0xf8, 0x7a, 0x01, + 0x40, 0xf0, 0x08, 0x00, 0xa4, 0xf8, 0x7a, 0x01, 0xb3, 0xe7, 0x00, 0xbf, + 0x74, 0x87, 0x08, 0x00, 0x0c, 0x6f, 0x01, 0x00, 0xe0, 0xa0, 0x08, 0x00, + 0xe4, 0x35, 0x01, 0x00, 0xa8, 0xa0, 0x08, 0x00, 0xce, 0xef, 0x03, 0x00, + 0xe1, 0xef, 0x03, 0x00, 0xd8, 0xb7, 0x08, 0x00, 0xcc, 0xb7, 0x08, 0x00, + 0xc0, 0xb7, 0x08, 0x00, 0xf4, 0xb7, 0x08, 0x00, 0x18, 0xb8, 0x08, 0x00, + 0xcc, 0xa1, 0x08, 0x00, 0xdc, 0xb7, 0x08, 0x00, 0x70, 0xb5, 0x64, 0x4c, + 0x4f, 0x4d, 0x1c, 0x4b, 0x20, 0x78, 0x1b, 0x68, 0xc0, 0xeb, 0x40, 0x10, + 0x05, 0xeb, 0xc0, 0x00, 0xc6, 0x68, 0x90, 0xf8, 0x72, 0x20, 0xb6, 0xf8, + 0x74, 0x11, 0x06, 0xf5, 0xa3, 0x70, 0x98, 0x47, 0x50, 0xb1, 0xb6, 0xf8, + 0x78, 0x01, 0xc0, 0x07, 0x06, 0xd0, 0xd6, 0xf8, 0x30, 0x02, 0x18, 0xb1, + 0x80, 0x6a, 0x08, 0xb1, 0x08, 0x21, 0x01, 0x75, 0x00, 0xf0, 0x06, 0xfe, + 0x98, 0xb1, 0x01, 0x28, 0x14, 0xd1, 0x20, 0x78, 0x0c, 0x49, 0xc0, 0xeb, + 0x40, 0x10, 0x09, 0x68, 0x05, 0xeb, 0xc0, 0x00, 0xc0, 0x68, 0x90, 0xf8, + 0x1d, 0x01, 0xc0, 0xeb, 0x00, 0x10, 0x01, 0xeb, 0x40, 0x10, 0x07, 0x49, + 0x09, 0x68, 0x88, 0x47, 0x18, 0xb1, 0x3c, 0x49, 0x00, 0x20, 0x08, 0x70, + 0x70, 0xbd, 0x01, 0x20, 0x70, 0xbd, 0x00, 0xbf, 0xd0, 0xb7, 0x08, 0x00, + 0xe0, 0x35, 0x01, 0x00, 0x34, 0xd1, 0x08, 0x00, 0x80, 0xb5, 0x43, 0x48, + 0x43, 0x49, 0x00, 0x78, 0x00, 0xeb, 0x00, 0x10, 0x01, 0xeb, 0xc0, 0x00, + 0xc0, 0x68, 0x38, 0xb1, 0x0b, 0x48, 0x00, 0x78, 0x40, 0x07, 0x0a, 0xd4, + 0x00, 0x20, 0x40, 0xf2, 0x27, 0x71, 0x02, 0xe0, 0x00, 0x20, 0x40, 0xf2, + 0x26, 0x71, 0xbd, 0xe8, 0x80, 0x40, 0xe8, 0xf7, 0xa5, 0xbc, 0x00, 0xf0, + 0xcf, 0xfd, 0x38, 0x48, 0x01, 0x21, 0x02, 0x68, 0x40, 0x20, 0xbd, 0xe8, + 0x80, 0x40, 0x10, 0x47, 0x97, 0x53, 0x01, 0x00, 0x10, 0xb5, 0x31, 0x48, + 0x1c, 0x49, 0x00, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x01, 0xeb, 0xc0, 0x00, + 0xc4, 0x68, 0x8c, 0xb1, 0x0c, 0x48, 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, + 0x0b, 0x48, 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, 0x94, 0xf8, 0xf8, 0x01, + 0x10, 0xb1, 0x01, 0x38, 0x84, 0xf8, 0xf8, 0x01, 0xbd, 0xe8, 0x10, 0x40, + 0x00, 0xf0, 0xb0, 0xbd, 0x00, 0x20, 0x40, 0xf2, 0x45, 0x71, 0xe8, 0xf7, + 0x79, 0xfc, 0x00, 0x20, 0x10, 0xbd, 0x00, 0xbf, 0x68, 0xd2, 0x08, 0x00, + 0x70, 0xe3, 0x08, 0x00, 0x1d, 0x49, 0x09, 0x4a, 0x09, 0x78, 0xc1, 0xeb, + 0x41, 0x11, 0x02, 0xeb, 0xc1, 0x01, 0xb1, 0xf8, 0xdc, 0x10, 0x01, 0xf0, + 0x49, 0x01, 0x09, 0x29, 0x04, 0xd1, 0xc1, 0x68, 0x0a, 0x6c, 0x22, 0xf4, + 0x80, 0x12, 0x0a, 0x64, 0x00, 0xf0, 0x96, 0xbd, 0x0c, 0x6f, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0xf0, 0x97, 0xfd, 0x00, 0xb1, 0x80, 0xbd, 0x02, 0x49, + 0x00, 0x22, 0x0a, 0x70, 0x80, 0xbd, 0x00, 0xbf, 0x60, 0xd4, 0x05, 0x00, + 0x80, 0xb5, 0x0c, 0x48, 0x0c, 0x49, 0x00, 0x78, 0x00, 0xeb, 0x00, 0x10, + 0x01, 0xeb, 0xc0, 0x00, 0xc0, 0x68, 0x40, 0xb1, 0x00, 0xf0, 0x88, 0xfd, + 0x08, 0x48, 0x01, 0x21, 0x02, 0x68, 0x40, 0x20, 0xbd, 0xe8, 0x80, 0x40, + 0x10, 0x47, 0x00, 0x20, 0x40, 0xf2, 0x36, 0x71, 0xbd, 0xe8, 0x80, 0x40, + 0xe8, 0xf7, 0x36, 0xbc, 0x74, 0x87, 0x08, 0x00, 0xfc, 0x6d, 0x01, 0x00, + 0xf8, 0xb9, 0x08, 0x00, 0x7c, 0xb5, 0x2c, 0x48, 0xf0, 0x4d, 0x00, 0x21, + 0x01, 0x60, 0x28, 0x78, 0xef, 0x49, 0x00, 0xeb, 0x00, 0x10, 0x01, 0xeb, + 0xc0, 0x02, 0xd4, 0x68, 0x00, 0x2c, 0x45, 0xd0, 0x51, 0xf8, 0x30, 0x00, + 0x00, 0x28, 0x41, 0xd0, 0x94, 0xf8, 0x68, 0x11, 0x01, 0xaa, 0x20, 0x46, + 0xf3, 0xf7, 0x5c, 0xf9, 0xc8, 0xb3, 0x01, 0x9e, 0xbe, 0xb3, 0x96, 0xf8, + 0x47, 0x00, 0x94, 0xf8, 0x4a, 0x11, 0x81, 0x42, 0x31, 0xd0, 0x94, 0xf8, + 0x1d, 0x12, 0x81, 0x42, 0x0f, 0xd0, 0x94, 0xf8, 0x44, 0x10, 0x41, 0xea, + 0x00, 0x40, 0x69, 0x46, 0x00, 0x90, 0xe5, 0x48, 0x02, 0x68, 0x31, 0x20, + 0x90, 0x47, 0x96, 0xf8, 0x47, 0x00, 0x84, 0xf8, 0x1d, 0x02, 0x96, 0xf8, + 0x47, 0x00, 0x84, 0xf8, 0x4a, 0x01, 0x2b, 0x78, 0x5c, 0x25, 0x96, 0xf8, + 0x46, 0x10, 0x13, 0xfb, 0x05, 0xf3, 0x84, 0xf8, 0xcc, 0x11, 0x94, 0xf8, + 0x20, 0x11, 0x96, 0xf8, 0x46, 0x20, 0xb1, 0xfb, 0xf2, 0xf2, 0x84, 0xf8, + 0x4c, 0x21, 0x96, 0xf8, 0x46, 0x50, 0xd3, 0x4e, 0xf0, 0x54, 0xb1, 0xfb, + 0xf5, 0xf0, 0x00, 0xfb, 0x15, 0x10, 0x10, 0x44, 0x01, 0x38, 0x84, 0xf8, + 0x4b, 0x01, 0x7c, 0xbd, 0x00, 0x20, 0x40, 0xf2, 0xc1, 0x51, 0xe8, 0xf7, + 0xd7, 0xfb, 0x7c, 0xbd, 0x14, 0xe6, 0x05, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, + 0x87, 0xb0, 0x88, 0x46, 0x04, 0x46, 0x20, 0xb9, 0x00, 0x20, 0x40, 0xf2, + 0xef, 0x51, 0xe2, 0xf7, 0x67, 0xfd, 0x94, 0xf8, 0x20, 0x01, 0x40, 0x45, + 0x04, 0xd8, 0x00, 0x20, 0x4f, 0xf4, 0xbe, 0x61, 0xe2, 0xf7, 0x5e, 0xfd, + 0xd4, 0xf8, 0x70, 0x01, 0xd4, 0xf8, 0x24, 0x11, 0xb5, 0x4e, 0x94, 0xf8, + 0x1d, 0x21, 0x01, 0xfb, 0x08, 0x05, 0x30, 0x68, 0xc2, 0xeb, 0x02, 0x12, + 0x00, 0xeb, 0x42, 0x10, 0xb1, 0x4a, 0x29, 0x01, 0xb8, 0x30, 0x13, 0x68, + 0x05, 0xaa, 0x98, 0x47, 0xdf, 0xf8, 0xbc, 0x92, 0xaf, 0x4a, 0x99, 0xf8, + 0x00, 0x00, 0x00, 0xeb, 0x00, 0x11, 0x02, 0xeb, 0xc1, 0x01, 0x49, 0x68, + 0x49, 0x7f, 0x29, 0xb3, 0x94, 0xf8, 0x7c, 0x01, 0x01, 0x28, 0x0e, 0xd1, + 0x94, 0xf8, 0x42, 0x00, 0x00, 0x07, 0x11, 0xd5, 0x94, 0xf8, 0x1d, 0x11, + 0x30, 0x68, 0xc1, 0xeb, 0x01, 0x11, 0x00, 0xeb, 0x41, 0x10, 0x90, 0xf8, + 0xc0, 0x00, 0x01, 0x28, 0x06, 0xd9, 0xa2, 0x48, 0x05, 0xaa, 0x29, 0x46, + 0x03, 0x68, 0x20, 0x46, 0x98, 0x47, 0x04, 0xe0, 0x9f, 0x48, 0x05, 0xa9, + 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0x9e, 0x49, 0x09, 0x78, 0x08, 0x44, + 0x9d, 0x49, 0x08, 0x60, 0x99, 0xf8, 0x00, 0x00, 0x9c, 0x4f, 0x4f, 0xf0, + 0x5c, 0x0a, 0xdd, 0xe9, 0x05, 0x12, 0x10, 0xfb, 0x0a, 0x70, 0xc0, 0xe9, + 0x07, 0x12, 0x99, 0x49, 0x12, 0x22, 0x0a, 0x60, 0x05, 0x21, 0x80, 0xf8, + 0x27, 0x10, 0xfa, 0x21, 0x81, 0x84, 0x01, 0x21, 0x81, 0x70, 0x99, 0xf8, + 0x00, 0x00, 0x10, 0xfb, 0x0a, 0x70, 0x80, 0xf8, 0x51, 0x10, 0xd4, 0xf8, + 0x00, 0x01, 0x00, 0xf2, 0xed, 0x20, 0xff, 0xf7, 0xa3, 0xfc, 0x99, 0xf8, + 0x00, 0x00, 0x04, 0xf5, 0x82, 0x71, 0x10, 0xfb, 0x0a, 0x70, 0x41, 0x63, + 0x94, 0xf8, 0x40, 0x11, 0x80, 0xf8, 0x4f, 0x10, 0xd4, 0xf8, 0xe0, 0x10, + 0x81, 0x60, 0x04, 0xf1, 0xe4, 0x01, 0x0c, 0x30, 0x91, 0xe8, 0x6c, 0x00, + 0x6c, 0xc0, 0x85, 0x48, 0x43, 0x46, 0xd4, 0xf8, 0x00, 0x11, 0xb4, 0xf8, + 0x74, 0x21, 0x05, 0x68, 0xd4, 0xf8, 0xe0, 0x00, 0x01, 0xf5, 0x22, 0x71, + 0xa8, 0x47, 0xd4, 0xf8, 0x3c, 0x01, 0xfe, 0xf7, 0x9f, 0xfe, 0x00, 0x28, + 0x00, 0xf0, 0xc0, 0x80, 0x01, 0x90, 0x00, 0x20, 0x94, 0xf8, 0x68, 0x11, + 0x04, 0xaa, 0x04, 0x90, 0x20, 0x46, 0xf3, 0xf7, 0x6f, 0xf8, 0x00, 0x28, + 0x00, 0xf0, 0x90, 0x80, 0xa8, 0xf1, 0x01, 0x00, 0xdf, 0xf8, 0xd8, 0x91, + 0xdf, 0xf8, 0xe0, 0xa1, 0x76, 0x4f, 0x75, 0x4d, 0xcd, 0xf8, 0x08, 0x80, + 0x04, 0xf5, 0xa3, 0x78, 0xc6, 0xb2, 0xdd, 0xf8, 0x10, 0xb0, 0xbb, 0xf1, + 0x00, 0x0f, 0x7a, 0xd0, 0x9b, 0xf8, 0x47, 0x00, 0x94, 0xf8, 0x4a, 0x11, + 0x81, 0x42, 0x73, 0xd0, 0x94, 0xf8, 0x1d, 0x12, 0x81, 0x42, 0x0f, 0xd0, + 0x94, 0xf8, 0x44, 0x10, 0x41, 0xea, 0x00, 0x40, 0x03, 0xa9, 0x03, 0x90, + 0x65, 0x48, 0x02, 0x68, 0x31, 0x20, 0x90, 0x47, 0x9b, 0xf8, 0x47, 0x00, + 0x84, 0xf8, 0x1d, 0x02, 0x9b, 0xf8, 0x47, 0x00, 0x84, 0xf8, 0x4a, 0x01, + 0x94, 0xf8, 0x20, 0x11, 0x9b, 0xf8, 0x46, 0x00, 0xb1, 0xfb, 0xf0, 0xf2, + 0x84, 0xf8, 0xcc, 0x01, 0x02, 0xfb, 0x10, 0x10, 0x84, 0xf8, 0x4c, 0x21, + 0x10, 0x44, 0x01, 0x38, 0x84, 0xf8, 0x4b, 0x01, 0x02, 0x98, 0x00, 0x28, + 0x6d, 0xd0, 0xb4, 0xf8, 0x74, 0x11, 0xd9, 0xf8, 0x00, 0x30, 0x40, 0x46, + 0x32, 0x46, 0x98, 0x47, 0xdf, 0xf8, 0x1c, 0xb1, 0xb8, 0xb3, 0xd4, 0xf8, + 0x68, 0x21, 0x00, 0x20, 0x29, 0x46, 0x00, 0xf0, 0xf7, 0xfb, 0x94, 0xf8, + 0x68, 0x11, 0x3a, 0x68, 0x20, 0x46, 0x90, 0x47, 0xda, 0xf8, 0x00, 0x10, + 0x20, 0x46, 0x88, 0x47, 0xb4, 0xf8, 0x78, 0x01, 0xc1, 0x07, 0x08, 0xd0, + 0x20, 0xf0, 0x01, 0x00, 0xa4, 0xf8, 0x78, 0x01, 0xd4, 0xf8, 0x88, 0x00, + 0x01, 0x30, 0xc4, 0xf8, 0x88, 0x00, 0xd4, 0xf8, 0x84, 0x00, 0x94, 0xf8, + 0x1d, 0x11, 0x32, 0x46, 0x01, 0x30, 0xc1, 0xeb, 0x01, 0x11, 0xc4, 0xf8, + 0x84, 0x00, 0xdb, 0xf8, 0x00, 0x00, 0x00, 0xeb, 0x41, 0x10, 0x90, 0xf8, + 0xd6, 0x10, 0x41, 0xf0, 0x01, 0x01, 0x80, 0xf8, 0xd6, 0x10, 0x40, 0x46, + 0xb4, 0xf8, 0x74, 0x11, 0xd9, 0xf8, 0x00, 0x30, 0x98, 0x47, 0x00, 0x28, + 0xc7, 0xd1, 0x94, 0xf8, 0x68, 0x11, 0x20, 0x46, 0x04, 0xaa, 0xf2, 0xf7, + 0xe3, 0xff, 0x00, 0x28, 0x7f, 0xf4, 0x81, 0xaf, 0x21, 0xe0, 0x35, 0x48, + 0x35, 0x49, 0x01, 0x60, 0x94, 0xf8, 0xcc, 0x01, 0xd8, 0xb1, 0xd4, 0xf8, + 0x00, 0x01, 0x1d, 0x21, 0xd0, 0xf8, 0xd4, 0x00, 0x40, 0x7f, 0x00, 0x28, + 0x08, 0xbf, 0x1c, 0x21, 0x01, 0x98, 0x40, 0x5c, 0x05, 0x21, 0x84, 0xf8, + 0x4a, 0x11, 0x94, 0xf8, 0x20, 0x11, 0x84, 0xf8, 0xcc, 0x01, 0xb1, 0xfb, + 0xf0, 0xf2, 0x02, 0xfb, 0x10, 0x10, 0x84, 0xf8, 0x4c, 0x21, 0x10, 0x44, + 0x01, 0x38, 0x84, 0xf8, 0x4b, 0x01, 0xdf, 0xf8, 0x58, 0x90, 0x1b, 0x4f, + 0x4f, 0xf0, 0x5c, 0x0a, 0x99, 0xf8, 0x00, 0x00, 0x94, 0xf8, 0x4a, 0x21, + 0x02, 0x23, 0x10, 0xfb, 0x0a, 0xf1, 0x7a, 0x54, 0x10, 0xfb, 0x0a, 0x71, + 0x94, 0xf8, 0x54, 0x01, 0x48, 0x70, 0xd4, 0xf8, 0x00, 0x01, 0xd0, 0xf8, + 0x88, 0x20, 0x03, 0xea, 0x52, 0x45, 0x03, 0xea, 0x12, 0x42, 0x01, 0x23, + 0x81, 0xf8, 0x4b, 0x20, 0x81, 0xf8, 0x4c, 0x50, 0x01, 0xf1, 0x52, 0x02, + 0x15, 0x49, 0x0d, 0x68, 0x94, 0xf8, 0x44, 0x10, 0xa8, 0x47, 0x07, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0xe0, 0x35, 0x01, 0x00, 0x5c, 0xa1, 0x08, 0x00, + 0x74, 0x87, 0x08, 0x00, 0xfc, 0x6d, 0x01, 0x00, 0x30, 0xa1, 0x08, 0x00, + 0xa0, 0xbc, 0x08, 0x00, 0xa8, 0x0d, 0x01, 0x00, 0x54, 0x11, 0x21, 0x40, + 0x44, 0x4f, 0x01, 0x00, 0x60, 0x11, 0x21, 0x40, 0x24, 0xa1, 0x08, 0x00, + 0x1c, 0xa1, 0x08, 0x00, 0xd0, 0xb7, 0x08, 0x00, 0xf4, 0xef, 0x03, 0x00, + 0xbc, 0xb7, 0x08, 0x00, 0xd4, 0xb7, 0x08, 0x00, 0x14, 0xe6, 0x05, 0x00, + 0x61, 0xe4, 0x03, 0x00, 0xc4, 0xbc, 0x08, 0x00, 0x2d, 0xe9, 0xfc, 0x41, + 0x04, 0x46, 0x90, 0xf8, 0x46, 0x01, 0x00, 0x28, 0x69, 0xd0, 0xb4, 0xf8, + 0x4e, 0x61, 0xb4, 0xf8, 0x74, 0x01, 0x80, 0x1b, 0x00, 0xb2, 0x00, 0x28, + 0x61, 0xd4, 0xd4, 0xf8, 0x3c, 0x01, 0xfe, 0xf7, 0x7f, 0xfd, 0x05, 0x46, + 0xb4, 0xf8, 0x78, 0x01, 0x42, 0x4f, 0xdf, 0xf8, 0x0c, 0x81, 0x4f, 0xf4, + 0x80, 0x71, 0x40, 0xf0, 0x01, 0x00, 0xa4, 0xf8, 0x78, 0x01, 0x38, 0x78, + 0x00, 0xeb, 0x80, 0x00, 0x08, 0xeb, 0xc0, 0x00, 0x81, 0x82, 0x00, 0x21, + 0x41, 0x81, 0x20, 0x46, 0x31, 0x46, 0xfe, 0xf7, 0x53, 0xfe, 0x03, 0x46, + 0x39, 0x48, 0x94, 0xf8, 0x68, 0x11, 0x01, 0xaa, 0x06, 0x68, 0x20, 0x46, + 0xb0, 0x47, 0x00, 0x28, 0x48, 0xd0, 0x01, 0x98, 0x00, 0x28, 0x53, 0xd0, + 0x2d, 0xb1, 0x90, 0xf8, 0x47, 0x10, 0x94, 0xf8, 0x4a, 0x21, 0x8a, 0x42, + 0x4c, 0xd1, 0x39, 0x78, 0x90, 0xf8, 0x2c, 0x30, 0x90, 0xf8, 0x2e, 0x40, + 0x01, 0xeb, 0x81, 0x01, 0x08, 0xeb, 0xc1, 0x02, 0x13, 0x73, 0x03, 0x8e, + 0x53, 0x81, 0x14, 0xb3, 0x2a, 0x4a, 0x00, 0x23, 0x02, 0xeb, 0x41, 0x11, + 0x01, 0xf1, 0x54, 0x02, 0x15, 0x78, 0x00, 0xeb, 0x43, 0x04, 0x64, 0x8e, + 0x51, 0xf8, 0x25, 0x60, 0x6f, 0xf3, 0x9f, 0x56, 0x46, 0xea, 0x84, 0x54, + 0x50, 0xf8, 0x23, 0x60, 0x01, 0x33, 0x41, 0xf8, 0x25, 0x40, 0x14, 0x78, + 0x65, 0x1c, 0x15, 0x70, 0x51, 0xf8, 0x24, 0x50, 0x66, 0xf3, 0x15, 0x05, + 0x41, 0xf8, 0x24, 0x50, 0xdc, 0xb2, 0x90, 0xf8, 0x2e, 0x50, 0xac, 0x42, + 0xe2, 0xd3, 0xbd, 0xe8, 0xfc, 0x81, 0x15, 0x48, 0x15, 0x49, 0x00, 0x78, + 0x00, 0xeb, 0x80, 0x00, 0x01, 0xeb, 0xc0, 0x00, 0x01, 0x21, 0x81, 0x82, + 0x00, 0x21, 0x41, 0x81, 0xbd, 0xe8, 0xfc, 0x81, 0x12, 0x48, 0xd4, 0xe9, + 0x5a, 0x23, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x39, 0x78, 0x01, 0xeb, + 0x81, 0x01, 0x08, 0xeb, 0xc1, 0x01, 0x08, 0x73, 0xbd, 0xe8, 0xfc, 0x81, + 0xb4, 0xf8, 0x78, 0x01, 0x01, 0x21, 0x20, 0xf0, 0x01, 0x00, 0xa4, 0xf8, + 0x78, 0x01, 0x38, 0x78, 0x00, 0xeb, 0x80, 0x00, 0x08, 0xeb, 0xc0, 0x00, + 0x01, 0x75, 0xbd, 0xe8, 0xfc, 0x81, 0x00, 0xbf, 0x74, 0x87, 0x08, 0x00, + 0x84, 0x71, 0x01, 0x00, 0x38, 0xb8, 0x08, 0x00, 0xbc, 0x65, 0x01, 0x00, + 0x3c, 0xb8, 0x08, 0x00, 0x10, 0xb5, 0x04, 0x46, 0x90, 0xf8, 0x8c, 0x01, + 0xc0, 0x07, 0x21, 0xd0, 0x20, 0x6b, 0xf8, 0xb1, 0x60, 0x6b, 0xe8, 0xb1, + 0x90, 0xf8, 0x29, 0x00, 0x81, 0x07, 0x19, 0xd5, 0x00, 0x07, 0x17, 0xd4, + 0x0c, 0x48, 0x94, 0xf8, 0x1d, 0x11, 0xc1, 0xeb, 0x01, 0x11, 0x00, 0x68, + 0x49, 0x01, 0x40, 0x5c, 0x01, 0x28, 0x08, 0xd8, 0x94, 0xf8, 0x96, 0x01, + 0x28, 0xb9, 0x07, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x84, 0xf8, + 0x97, 0x01, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, 0xa6, 0xba, + 0x10, 0xbd, 0x00, 0xbf, 0xe0, 0x35, 0x01, 0x00, 0x44, 0xe8, 0x08, 0x00, + 0x2d, 0xe9, 0xf0, 0x4f, 0x87, 0xb0, 0x04, 0x91, 0x81, 0x46, 0x90, 0xf8, + 0xac, 0x00, 0x00, 0x28, 0x00, 0xf0, 0xce, 0x80, 0x99, 0xf8, 0xc1, 0x10, + 0xd9, 0xf8, 0xb0, 0x70, 0x00, 0x26, 0x00, 0x22, 0x4f, 0xf0, 0x00, 0x0a, + 0xc8, 0x43, 0x4d, 0x1c, 0xff, 0x21, 0x05, 0x91, 0xb7, 0xf8, 0x78, 0x11, + 0x49, 0x07, 0x2d, 0xd4, 0x97, 0xf8, 0x42, 0x10, 0xc9, 0x06, 0x02, 0xd5, + 0x97, 0xf8, 0xf8, 0x11, 0x31, 0xb3, 0x97, 0xf8, 0x20, 0x11, 0x6b, 0xb2, + 0x8b, 0x42, 0x21, 0xda, 0x00, 0x2b, 0x1f, 0xd4, 0x97, 0xf8, 0x50, 0xc1, + 0x06, 0x92, 0xbc, 0xf1, 0x00, 0x0f, 0x2d, 0xd0, 0xb7, 0xf8, 0x58, 0x21, + 0xb7, 0xf8, 0x74, 0x41, 0xa2, 0x1a, 0x12, 0xb2, 0x00, 0x2a, 0x25, 0xd4, + 0x5f, 0x4c, 0x97, 0xf8, 0x56, 0x81, 0x97, 0xf8, 0x57, 0xb1, 0x97, 0xf8, + 0x55, 0xe1, 0x64, 0xea, 0x02, 0x02, 0x97, 0xf8, 0x51, 0x41, 0x22, 0x44, + 0x4a, 0x43, 0xd2, 0x1a, 0x1b, 0xfb, 0x08, 0x22, 0x96, 0x44, 0x15, 0xe0, + 0x57, 0xf8, 0x04, 0x0c, 0x20, 0xb1, 0x90, 0xf8, 0xf9, 0x11, 0x07, 0x46, + 0x6d, 0x1a, 0x04, 0xe0, 0x97, 0xf8, 0xf9, 0x01, 0xd9, 0xf8, 0xa4, 0x70, + 0x05, 0x44, 0x99, 0xf8, 0xac, 0x10, 0x01, 0x36, 0x68, 0x42, 0x8e, 0x42, + 0xba, 0xd3, 0x7e, 0xe0, 0x4f, 0xf0, 0xff, 0x0e, 0x97, 0xf8, 0x46, 0xb1, + 0xbb, 0xf1, 0x00, 0x0f, 0x23, 0xd0, 0xb7, 0xf8, 0x4e, 0x41, 0xb7, 0xf8, + 0x74, 0x21, 0x12, 0x1b, 0x0f, 0xfa, 0x82, 0xf8, 0xb8, 0xf1, 0x00, 0x0f, + 0x19, 0xd4, 0x44, 0x4a, 0x97, 0xf8, 0x47, 0x41, 0x62, 0xea, 0x08, 0x02, + 0xe0, 0x46, 0x01, 0x92, 0x97, 0xf8, 0x4b, 0x21, 0xcd, 0xe9, 0x02, 0x2a, + 0x01, 0x9a, 0x97, 0xf8, 0x4c, 0xa1, 0x97, 0xf8, 0x4d, 0xc1, 0x22, 0x44, + 0x4a, 0x43, 0xd2, 0x1a, 0x1c, 0xfb, 0x0a, 0x22, 0xdd, 0xe9, 0x02, 0x3a, + 0xc4, 0x46, 0x13, 0x44, 0x00, 0xe0, 0xff, 0x23, 0x9e, 0x45, 0x15, 0xda, + 0xbc, 0xf1, 0x00, 0x0f, 0x2e, 0xd0, 0xb7, 0xf8, 0x58, 0x21, 0xb7, 0xf8, + 0x74, 0x31, 0x9a, 0x1a, 0x12, 0xb2, 0x00, 0x2a, 0x26, 0xd4, 0x6f, 0xea, + 0x02, 0x0e, 0x97, 0xf8, 0x51, 0x31, 0x97, 0xf8, 0x55, 0xc1, 0x97, 0xf8, + 0x56, 0x41, 0x97, 0xf8, 0x57, 0x21, 0x14, 0xe0, 0xbb, 0xf1, 0x00, 0x0f, + 0x18, 0xd0, 0xb7, 0xf8, 0x4e, 0x21, 0xb7, 0xf8, 0x74, 0x31, 0x9a, 0x1a, + 0x12, 0xb2, 0x00, 0x2a, 0x10, 0xd4, 0x6f, 0xea, 0x02, 0x0e, 0x97, 0xf8, + 0x47, 0x31, 0x97, 0xf8, 0x4b, 0xc1, 0x97, 0xf8, 0x4c, 0x41, 0x97, 0xf8, + 0x4d, 0x21, 0x73, 0x44, 0x03, 0xfb, 0x01, 0x00, 0x02, 0xfb, 0x04, 0x00, + 0x60, 0x44, 0x00, 0xe0, 0xff, 0x20, 0x87, 0xf8, 0xfa, 0x01, 0xe9, 0xb2, + 0x38, 0x46, 0x87, 0xf8, 0xfb, 0x51, 0x02, 0xf0, 0xab, 0xf9, 0x97, 0xf8, + 0xfa, 0x01, 0x05, 0x99, 0x81, 0x42, 0x0a, 0xd3, 0x04, 0x98, 0xba, 0x46, + 0x05, 0x70, 0x97, 0xf8, 0xfa, 0x01, 0x05, 0x90, 0x97, 0xf8, 0x1c, 0x02, + 0x01, 0x30, 0x87, 0xf8, 0x1c, 0x02, 0x06, 0x9a, 0x01, 0x32, 0x6f, 0xe7, + 0x4f, 0xf0, 0x00, 0x0a, 0x00, 0x22, 0xd9, 0xf8, 0xa0, 0x00, 0x40, 0x7f, + 0x30, 0xb9, 0xd0, 0xb2, 0x02, 0x28, 0x03, 0xd3, 0xd9, 0xf8, 0xb0, 0x00, + 0x82, 0x45, 0x09, 0xd0, 0x08, 0x48, 0x00, 0x78, 0x20, 0xf0, 0x08, 0x00, + 0x06, 0x49, 0x08, 0x70, 0x50, 0x46, 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x03, 0x48, 0x00, 0x78, 0x40, 0xf0, 0x08, 0x00, 0xf4, 0xe7, 0x00, 0xbf, + 0x00, 0x00, 0xff, 0xff, 0x97, 0x53, 0x01, 0x00, 0xf8, 0xb5, 0xc2, 0x78, + 0x90, 0xf8, 0xc1, 0x30, 0xd0, 0xf8, 0xb0, 0x40, 0x01, 0x2a, 0x05, 0xd0, + 0x81, 0x2a, 0x2d, 0xd1, 0xbd, 0xe8, 0xf8, 0x40, 0xff, 0xf7, 0xf8, 0xbe, + 0x4b, 0xb9, 0xd0, 0xf8, 0xa4, 0x20, 0x32, 0xb1, 0x00, 0x25, 0x82, 0xf8, + 0x1c, 0x52, 0x52, 0xf8, 0x04, 0x2c, 0x00, 0x2a, 0xf9, 0xd1, 0x90, 0xf8, + 0xc0, 0x50, 0xcd, 0xb1, 0x00, 0x26, 0x54, 0xf8, 0x04, 0x4c, 0x14, 0xb9, + 0xd0, 0xf8, 0xa4, 0x40, 0x01, 0x33, 0x94, 0xf8, 0x20, 0x71, 0xda, 0xb2, + 0xba, 0x42, 0x0a, 0xd2, 0xb4, 0xf8, 0x78, 0x71, 0x7f, 0x07, 0x06, 0xd4, + 0x94, 0xf8, 0x42, 0x70, 0xff, 0x06, 0x21, 0xd5, 0x94, 0xf8, 0xf8, 0x71, + 0xf7, 0xb9, 0x01, 0x36, 0xae, 0x42, 0xe6, 0xd3, 0x00, 0x24, 0x1e, 0xe0, + 0x58, 0x1c, 0x94, 0xf8, 0x20, 0x51, 0xc2, 0xb2, 0xaa, 0x42, 0x0c, 0xd2, + 0xb4, 0xf8, 0x78, 0x31, 0x5b, 0x07, 0x08, 0xd4, 0x94, 0xf8, 0x42, 0x30, + 0xdb, 0x06, 0x02, 0xd5, 0x94, 0xf8, 0xf8, 0x31, 0x0b, 0xb1, 0x08, 0x70, + 0x07, 0xe0, 0x54, 0xf8, 0x04, 0x0c, 0x00, 0x24, 0x38, 0xb1, 0x0c, 0x70, + 0x04, 0x46, 0x04, 0xe0, 0x0b, 0x70, 0x20, 0x46, 0x11, 0x46, 0x02, 0xf0, + 0x1f, 0xf9, 0x20, 0x46, 0xf8, 0xbd, 0x00, 0xbf, 0x2d, 0xe9, 0xf8, 0x43, + 0xd0, 0xf8, 0xb0, 0x40, 0x06, 0x46, 0x90, 0xf8, 0xc1, 0x70, 0xc0, 0x78, + 0xdf, 0xf8, 0x7c, 0x90, 0x88, 0x46, 0x94, 0xf8, 0x20, 0x51, 0x01, 0x28, + 0x19, 0xd1, 0x54, 0xf8, 0x04, 0x4c, 0x2c, 0xb9, 0x01, 0x37, 0xf8, 0xb2, + 0xa8, 0x42, 0x2d, 0xd2, 0xd6, 0xf8, 0xa4, 0x40, 0xd9, 0xf8, 0x00, 0x30, + 0xfa, 0xb2, 0x30, 0x46, 0x21, 0x46, 0x98, 0x47, 0x00, 0x28, 0xee, 0xd0, + 0x94, 0xf8, 0x42, 0x00, 0xc0, 0x06, 0x1c, 0xd5, 0x94, 0xf8, 0xf8, 0x01, + 0x00, 0x28, 0xe6, 0xd0, 0x17, 0xe0, 0x01, 0x37, 0xf8, 0xb2, 0xa8, 0x42, + 0x03, 0xd3, 0x54, 0xf8, 0x04, 0x4c, 0x00, 0x27, 0x94, 0xb1, 0xd9, 0xf8, + 0x00, 0x30, 0xfa, 0xb2, 0x30, 0x46, 0x21, 0x46, 0x98, 0x47, 0x00, 0x28, + 0xef, 0xd0, 0x94, 0xf8, 0x42, 0x00, 0xc0, 0x06, 0x03, 0xd5, 0x94, 0xf8, + 0xf8, 0x01, 0x00, 0x28, 0xe7, 0xd0, 0x88, 0xf8, 0x00, 0x70, 0x00, 0xe0, + 0x00, 0x24, 0x20, 0x46, 0xbd, 0xe8, 0xf8, 0x83, 0x28, 0xd1, 0x08, 0x00, + 0x01, 0x78, 0xc9, 0xb9, 0xd0, 0xf8, 0xb0, 0x10, 0x90, 0xf8, 0xc1, 0x20, + 0x91, 0xf8, 0x20, 0x11, 0x02, 0x32, 0x8a, 0x42, 0x10, 0xd1, 0xd0, 0xf8, + 0xa4, 0x10, 0x49, 0xb1, 0xb1, 0xf8, 0x78, 0x21, 0x53, 0xb2, 0x00, 0x2b, + 0x01, 0xd4, 0x52, 0x07, 0x06, 0xd5, 0x51, 0xf8, 0x04, 0x1c, 0xf4, 0xe7, + 0xd0, 0xf8, 0x9c, 0x10, 0x11, 0x22, 0x8a, 0x74, 0xd0, 0xf8, 0x9c, 0x00, + 0x80, 0x7c, 0x70, 0x47, 0xf0, 0xb5, 0x85, 0xb0, 0x04, 0x46, 0x00, 0xf0, + 0xe3, 0xf8, 0x94, 0xf8, 0x7c, 0x01, 0x01, 0x28, 0x32, 0xd1, 0x1a, 0x48, + 0x06, 0x68, 0x94, 0xf8, 0x1d, 0x01, 0xc0, 0xeb, 0x00, 0x17, 0x78, 0x01, + 0x30, 0x5c, 0x01, 0x28, 0x28, 0xd1, 0xd4, 0xf8, 0x70, 0x01, 0x28, 0xbb, + 0x14, 0x48, 0x03, 0xad, 0x01, 0x68, 0x28, 0x46, 0x88, 0x47, 0x13, 0x48, + 0x13, 0x49, 0xd4, 0xf8, 0x70, 0x21, 0x00, 0x78, 0xc0, 0xeb, 0x40, 0x10, + 0x01, 0xeb, 0xc0, 0x00, 0xd4, 0xf8, 0x24, 0x11, 0x01, 0xac, 0x90, 0xf8, + 0x72, 0x00, 0x01, 0xfb, 0x00, 0x20, 0x0d, 0x49, 0x0a, 0x68, 0x00, 0x01, + 0x21, 0x46, 0x90, 0x47, 0x0b, 0x48, 0x21, 0x46, 0x2a, 0x46, 0x03, 0x68, + 0x28, 0x46, 0x98, 0x47, 0xdd, 0xe9, 0x03, 0x12, 0x06, 0xeb, 0x47, 0x10, + 0xc0, 0xe9, 0x2e, 0x12, 0x05, 0xb0, 0xf0, 0xbd, 0xe0, 0x35, 0x01, 0x00, + 0xa4, 0xbe, 0x08, 0x00, 0x74, 0x87, 0x08, 0x00, 0x0c, 0x6f, 0x01, 0x00, + 0x4c, 0xa1, 0x08, 0x00, 0x44, 0xa1, 0x08, 0x00, 0xd0, 0xf8, 0x9c, 0x10, + 0x02, 0x78, 0x89, 0x7c, 0x02, 0x2a, 0x05, 0xd1, 0x90, 0xf8, 0xe0, 0x20, + 0x03, 0x2a, 0x28, 0xbf, 0x00, 0xf0, 0x98, 0xb8, 0x08, 0x46, 0x70, 0x47, + 0x10, 0x48, 0x11, 0x49, 0x01, 0x60, 0x11, 0x48, 0x11, 0x49, 0x01, 0x60, + 0x11, 0x48, 0x12, 0x49, 0x01, 0x60, 0x12, 0x48, 0x12, 0x49, 0x01, 0x60, + 0x12, 0x48, 0x13, 0x49, 0x01, 0x60, 0x13, 0x48, 0x13, 0x49, 0x01, 0x60, + 0x13, 0x48, 0x14, 0x49, 0x01, 0x60, 0x14, 0x48, 0x14, 0x49, 0x01, 0x60, + 0x14, 0x48, 0x15, 0x49, 0x01, 0x60, 0x15, 0x48, 0x15, 0x49, 0x01, 0x60, + 0x15, 0x48, 0x16, 0x49, 0x01, 0x60, 0x70, 0x47, 0xc8, 0xb6, 0x08, 0x00, + 0x20, 0xf0, 0x03, 0x00, 0xc4, 0xb6, 0x08, 0x00, 0x00, 0xf0, 0x03, 0x00, + 0x0c, 0xd1, 0x08, 0x00, 0x19, 0xe5, 0x03, 0x00, 0x5c, 0xa2, 0x08, 0x00, + 0x6d, 0xe8, 0x03, 0x00, 0x30, 0xd1, 0x08, 0x00, 0x40, 0xf0, 0x03, 0x00, + 0x44, 0xb8, 0x08, 0x00, 0xb9, 0xe9, 0x03, 0x00, 0x10, 0xd1, 0x08, 0x00, + 0x09, 0xec, 0x03, 0x00, 0x20, 0xd1, 0x08, 0x00, 0xbd, 0xec, 0x03, 0x00, + 0x18, 0xd1, 0x08, 0x00, 0x51, 0xed, 0x03, 0x00, 0xa4, 0xbb, 0x08, 0x00, + 0x91, 0xed, 0x03, 0x00, 0x38, 0xd1, 0x08, 0x00, 0x25, 0xee, 0x03, 0x00, + 0x46, 0xf6, 0x09, 0x2c, 0xc1, 0xf2, 0x09, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x46, 0xf6, 0xe9, 0x7c, 0xc1, 0xf2, 0x09, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x47, 0xf2, 0xeb, 0x4c, 0xc1, 0xf2, 0x09, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4b, 0xf6, 0xd1, 0x2c, 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x48, 0xf2, 0x05, 0x1c, 0xc1, 0xf2, 0x09, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x48, 0xf2, 0x21, 0x3c, 0xc1, 0xf2, 0x09, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x49, 0xf2, 0x23, 0x6c, 0xc1, 0xf2, 0x09, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x49, 0xf6, 0x33, 0x0c, 0xc1, 0xf2, 0x09, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x49, 0xf6, 0x6d, 0x2c, 0xc1, 0xf2, 0x09, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x48, 0xf6, 0xc9, 0x5c, 0xc1, 0xf2, 0x09, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x47, 0xf2, 0xa3, 0x5c, 0xc1, 0xf2, 0x09, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x47, 0xf2, 0x97, 0x7c, 0xc1, 0xf2, 0x09, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x49, 0xf6, 0xf9, 0x3c, 0xc1, 0xf2, 0x09, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x52, 0x58, 0x20, 0x57, 0x72, 0x6f, 0x6e, 0x67, 0x20, 0x4c, 0x65, 0x6e, + 0x3a, 0x00, 0x52, 0x58, 0x5b, 0x30, 0x5d, 0x20, 0x46, 0x6c, 0x75, 0x73, + 0x68, 0x00, 0x52, 0x58, 0x5b, 0x31, 0x5d, 0x20, 0x46, 0x6c, 0x75, 0x73, + 0x68, 0x00, 0x52, 0x58, 0x5b, 0x32, 0x5d, 0x20, 0x46, 0x6c, 0x75, 0x73, + 0x68, 0x00, 0x52, 0x58, 0x5b, 0x33, 0x5d, 0x20, 0x46, 0x6c, 0x75, 0x73, + 0x68, 0x00, 0x52, 0x58, 0x5b, 0x78, 0x5d, 0x20, 0x46, 0x6c, 0x75, 0x73, + 0x68, 0x00, 0x52, 0x58, 0x5b, 0x55, 0x5d, 0x20, 0x46, 0x6c, 0x75, 0x73, + 0x68, 0x00, 0x4d, 0x49, 0x43, 0x20, 0x46, 0x41, 0x49, 0x4c, 0x3a, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x74, 0x72, 0x00, 0x4d, 0x49, 0x43, + 0x20, 0x46, 0x41, 0x49, 0x4c, 0x3a, 0x20, 0x73, 0x75, 0x62, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x00, 0x54, 0x58, 0x5b, 0x55, 0x5d, 0x20, 0x46, 0x6c, + 0x75, 0x73, 0x68, 0x00, 0x11, 0xcd, 0x03, 0x00, 0x71, 0xcd, 0x03, 0x00, + 0xc5, 0xd2, 0x03, 0x00, 0xa5, 0xd3, 0x03, 0x00, 0xd9, 0xd5, 0x03, 0x00, + 0x79, 0xdf, 0x03, 0x00, 0xc1, 0xe2, 0x03, 0x00, 0x7d, 0x00, 0x00, 0x00, + 0x45, 0xe3, 0x03, 0x00, 0xad, 0x85, 0x09, 0x10, 0x57, 0x93, 0x09, 0x10, + 0xb3, 0x94, 0x09, 0x10, 0x8d, 0xe3, 0x03, 0x00, 0xdd, 0xe3, 0x03, 0x00, + 0x09, 0xe4, 0x03, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x21, 0xe4, 0x03, 0x00, + 0x9f, 0x8e, 0x09, 0x10, 0xc5, 0x8f, 0x09, 0x10, 0x53, 0x90, 0x09, 0x10, + 0x3f, 0x91, 0x09, 0x10, 0xdb, 0x91, 0x09, 0x10, 0x41, 0x93, 0x09, 0x10, + 0x7f, 0x00, 0x00, 0x00, 0x99, 0x48, 0xd9, 0x4a, 0x00, 0x78, 0xc0, 0xeb, + 0x40, 0x11, 0x52, 0xf8, 0x31, 0x00, 0x02, 0xeb, 0xc1, 0x01, 0xb1, 0xf8, + 0xdc, 0x20, 0xd1, 0x07, 0x03, 0xd0, 0x02, 0xf0, 0x49, 0x02, 0x09, 0x2a, + 0x0d, 0xd1, 0x51, 0xb9, 0x48, 0xb1, 0x90, 0xf8, 0x35, 0x01, 0x67, 0x49, + 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, 0x40, 0x10, 0xc1, 0x69, 0x01, 0x31, + 0xc1, 0x61, 0x00, 0xf0, 0xd9, 0xbc, 0x00, 0x28, 0xfb, 0xd0, 0x90, 0xf8, + 0x35, 0x01, 0x60, 0x49, 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, 0x40, 0x10, + 0x01, 0x6d, 0x01, 0x31, 0x01, 0x65, 0x00, 0xf0, 0xcb, 0xbc, 0x00, 0xbf, + 0xf0, 0xb5, 0x85, 0xb0, 0x81, 0x4c, 0x5a, 0x4d, 0x2f, 0x49, 0x20, 0x78, + 0x49, 0x69, 0x00, 0xeb, 0x00, 0x10, 0x05, 0xeb, 0xc0, 0x00, 0x40, 0x68, + 0x81, 0x42, 0x04, 0xd0, 0x00, 0x20, 0x40, 0xf2, 0xdd, 0x11, 0xe1, 0xf7, + 0x8d, 0xff, 0x4f, 0xf4, 0x2a, 0x60, 0xad, 0xf8, 0x10, 0x00, 0x00, 0x20, + 0x03, 0x90, 0x26, 0x48, 0x02, 0x68, 0x03, 0xa8, 0x01, 0x46, 0x90, 0x47, + 0x24, 0x4e, 0x03, 0x99, 0xb0, 0x68, 0x42, 0x1a, 0x12, 0x01, 0x06, 0xd4, + 0x88, 0x42, 0x24, 0xd1, 0xb0, 0x89, 0xbd, 0xf8, 0x10, 0x10, 0x81, 0x42, + 0x1f, 0xd9, 0x1f, 0x48, 0x06, 0xf1, 0x08, 0x01, 0x01, 0xaa, 0x03, 0x68, + 0x03, 0xa8, 0x98, 0x47, 0x01, 0x99, 0x40, 0xf2, 0x71, 0x20, 0x48, 0x43, + 0xbd, 0xf8, 0x08, 0x10, 0x40, 0x08, 0x00, 0xeb, 0x11, 0x10, 0x21, 0x78, + 0x01, 0xeb, 0x01, 0x11, 0x55, 0xf8, 0x31, 0x10, 0xd1, 0xf8, 0x1c, 0x23, + 0x82, 0x42, 0x06, 0xd9, 0xdd, 0xe9, 0x03, 0x37, 0x10, 0x1a, 0xc6, 0xe9, + 0x02, 0x37, 0xc1, 0xf8, 0x1c, 0x03, 0x20, 0x78, 0x0f, 0x49, 0x00, 0xeb, + 0x00, 0x10, 0x09, 0x78, 0x55, 0xf8, 0x30, 0x00, 0xd0, 0xf8, 0x1c, 0x03, + 0x08, 0x44, 0x0c, 0x49, 0x08, 0x60, 0x0c, 0x48, 0x01, 0x21, 0x02, 0x68, + 0x80, 0x20, 0x90, 0x47, 0x0a, 0x48, 0x00, 0x68, 0x80, 0x47, 0x01, 0x20, + 0x00, 0xf0, 0x6e, 0xfc, 0x05, 0xb0, 0xf0, 0xbd, 0xfc, 0x73, 0x01, 0x00, + 0x54, 0xa1, 0x08, 0x00, 0x60, 0x86, 0x01, 0x00, 0x44, 0xa1, 0x08, 0x00, + 0xa8, 0x0d, 0x01, 0x00, 0x54, 0x11, 0x21, 0x40, 0xf8, 0xb9, 0x08, 0x00, + 0xb4, 0xb9, 0x08, 0x00, 0x48, 0x48, 0x88, 0x4b, 0x00, 0x78, 0xc0, 0xeb, + 0x40, 0x11, 0x53, 0xf8, 0x31, 0x20, 0x03, 0xeb, 0xc1, 0x01, 0xb1, 0xf8, + 0xdc, 0x30, 0xd9, 0x07, 0x03, 0xd0, 0x03, 0xf0, 0x49, 0x03, 0x09, 0x2b, + 0x0c, 0xd1, 0xb1, 0xb9, 0xaa, 0xb1, 0x92, 0xf8, 0x35, 0x21, 0x16, 0x4b, + 0x02, 0xeb, 0x42, 0x02, 0x03, 0xeb, 0x42, 0x12, 0xd3, 0x69, 0x01, 0x33, + 0xd3, 0x61, 0x0a, 0xe0, 0x4a, 0xb1, 0x92, 0xf8, 0x35, 0x21, 0x10, 0x4b, + 0x02, 0xeb, 0x42, 0x02, 0x03, 0xeb, 0x42, 0x12, 0x13, 0x6d, 0x01, 0x33, + 0x13, 0x65, 0xa9, 0xb1, 0x0c, 0x49, 0x00, 0xeb, 0x00, 0x10, 0x68, 0x22, + 0x51, 0xf8, 0x30, 0x00, 0x59, 0x49, 0x90, 0xf8, 0x35, 0x01, 0x10, 0xfb, + 0x02, 0x10, 0x01, 0x46, 0x11, 0xf8, 0x5c, 0x2f, 0xd3, 0x07, 0x05, 0xd0, + 0x02, 0xf0, 0xfe, 0x02, 0x0a, 0x70, 0x04, 0x49, 0x09, 0x68, 0x41, 0x65, + 0x00, 0xf0, 0x20, 0xbc, 0x54, 0xf1, 0x05, 0x00, 0xfc, 0x6d, 0x01, 0x00, + 0x80, 0x11, 0x21, 0x40, 0x2d, 0xe9, 0xf0, 0x43, 0x8b, 0xb0, 0x23, 0x48, + 0x62, 0x49, 0x4b, 0x4e, 0x00, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x51, 0xf8, + 0x30, 0x50, 0x68, 0x21, 0x95, 0xf8, 0x35, 0x01, 0x10, 0xfb, 0x01, 0x61, + 0x91, 0xf8, 0x2e, 0x10, 0x01, 0x29, 0x2f, 0xd1, 0xd5, 0xf8, 0x84, 0x12, + 0x09, 0x7d, 0x66, 0x29, 0x2a, 0xd1, 0x68, 0x21, 0x10, 0xfb, 0x01, 0x61, + 0xb1, 0xf8, 0x48, 0x20, 0x22, 0xb3, 0x91, 0xf8, 0x4b, 0x10, 0x09, 0xb3, + 0x4f, 0xf0, 0x68, 0x08, 0x8d, 0xf8, 0x28, 0x00, 0x02, 0xac, 0x20, 0x22, + 0x10, 0xfb, 0x08, 0x60, 0x00, 0xf1, 0x30, 0x01, 0x20, 0x46, 0xf5, 0xf7, + 0xaf, 0xfe, 0x01, 0x20, 0x01, 0x21, 0x00, 0x22, 0x23, 0x46, 0x4f, 0xf0, + 0x00, 0x09, 0x8d, 0xf8, 0x24, 0x00, 0x0a, 0x48, 0x07, 0x68, 0x24, 0x20, + 0x00, 0x90, 0x40, 0xf2, 0x51, 0x60, 0xb8, 0x47, 0x95, 0xf8, 0x35, 0x01, + 0x10, 0xfb, 0x08, 0x60, 0x80, 0xf8, 0x4b, 0x90, 0x00, 0xf0, 0xda, 0xfb, + 0x0b, 0xb0, 0xbd, 0xe8, 0xf0, 0x83, 0x00, 0xbf, 0x74, 0x87, 0x08, 0x00, + 0xa0, 0xa0, 0x08, 0x00, 0xf0, 0xb5, 0x90, 0xf8, 0x35, 0x41, 0xdf, 0xf8, + 0x94, 0xc0, 0x68, 0x26, 0x14, 0xfb, 0x06, 0xc6, 0x96, 0xf8, 0x50, 0x60, + 0x00, 0x2e, 0x40, 0xd0, 0x00, 0x2a, 0x3e, 0xd0, 0x20, 0x4a, 0xb0, 0xf8, + 0xdc, 0x52, 0x97, 0x88, 0xbd, 0x42, 0x38, 0xd3, 0x03, 0x29, 0x02, 0xf1, + 0x01, 0x02, 0x18, 0xbf, 0x00, 0x29, 0x17, 0xd1, 0xf5, 0x07, 0x30, 0xd0, + 0x03, 0x29, 0x1a, 0xd1, 0x19, 0x79, 0xa1, 0xf1, 0x1f, 0x03, 0x02, 0x2b, + 0x18, 0xd3, 0x21, 0x29, 0x27, 0xd1, 0x68, 0x21, 0x00, 0x22, 0x14, 0xfb, + 0x01, 0xc1, 0x81, 0xf8, 0x51, 0x20, 0xb0, 0xf8, 0x84, 0x10, 0x6f, 0xf3, + 0xdf, 0x31, 0xa0, 0xf8, 0x84, 0x10, 0xf0, 0xbd, 0xb0, 0x07, 0x18, 0xd5, + 0x68, 0x20, 0x52, 0x78, 0x14, 0xfb, 0x00, 0xc0, 0x0c, 0xe0, 0x59, 0x79, + 0xae, 0x29, 0x10, 0xd1, 0xb0, 0xf8, 0x84, 0x10, 0x41, 0xf4, 0x00, 0x41, + 0xa0, 0xf8, 0x84, 0x10, 0x68, 0x20, 0x14, 0xfb, 0x00, 0xc0, 0x12, 0x78, + 0x90, 0xf8, 0x51, 0x10, 0x91, 0x42, 0x38, 0xbf, 0x11, 0x46, 0x80, 0xf8, + 0x51, 0x10, 0xf0, 0xbd, 0xb0, 0xe6, 0x05, 0x00, 0x4c, 0xf1, 0x05, 0x00, + 0xb0, 0xb5, 0xe1, 0x49, 0x13, 0x4a, 0x09, 0x78, 0xc1, 0xeb, 0x41, 0x11, + 0x02, 0xeb, 0xc1, 0x01, 0xb1, 0xf8, 0xdc, 0x10, 0x01, 0xf0, 0x49, 0x01, + 0x09, 0x29, 0x16, 0xd1, 0xb0, 0xf8, 0xe4, 0x42, 0xb0, 0xf8, 0x14, 0x53, + 0x90, 0xf8, 0x35, 0x11, 0x68, 0x22, 0x2c, 0x44, 0x77, 0x4d, 0x11, 0xfb, + 0x02, 0xf3, 0x01, 0x34, 0x11, 0xfb, 0x02, 0x51, 0x00, 0x22, 0xec, 0x52, + 0x8a, 0x70, 0xb0, 0xf8, 0x38, 0x13, 0x6f, 0xf3, 0xdf, 0x31, 0xa0, 0xf8, + 0x38, 0x13, 0xbd, 0xe8, 0xb0, 0x40, 0x00, 0xf0, 0x5d, 0xbb, 0x00, 0xbf, + 0x0c, 0x6f, 0x01, 0x00, 0x2d, 0xe9, 0xf8, 0x43, 0x0c, 0x46, 0x06, 0x46, + 0x00, 0xf0, 0x5a, 0xfb, 0x05, 0x46, 0x68, 0x48, 0xa1, 0x7c, 0x00, 0xf2, + 0x83, 0x37, 0x90, 0xf8, 0x84, 0x03, 0x81, 0x42, 0x08, 0xbf, 0x13, 0x2d, + 0x4a, 0xd0, 0xb8, 0x78, 0x81, 0x42, 0x14, 0xd2, 0x96, 0xf8, 0x49, 0x23, + 0x03, 0x2a, 0x11, 0xd1, 0xb6, 0xf8, 0x84, 0x20, 0x92, 0x06, 0x0d, 0xd5, + 0xd6, 0xf8, 0xd4, 0x20, 0x52, 0x7f, 0x00, 0x2a, 0x75, 0xd0, 0x96, 0xf9, + 0x38, 0x23, 0xb2, 0xf1, 0xff, 0x3f, 0x03, 0xdc, 0xa0, 0x74, 0x01, 0x46, + 0x00, 0xe0, 0x76, 0xb3, 0xd6, 0xf8, 0x00, 0x24, 0x0a, 0xb1, 0xa0, 0x74, + 0x29, 0xe0, 0x81, 0x42, 0x27, 0xd2, 0xd6, 0xf8, 0xd4, 0x00, 0x40, 0x7f, + 0x18, 0xb3, 0x96, 0xf8, 0x3b, 0x03, 0x87, 0x28, 0x1f, 0xd1, 0x96, 0xf8, + 0x37, 0x03, 0x40, 0x06, 0x1b, 0xd5, 0x96, 0xf8, 0x35, 0x01, 0xdf, 0xf8, + 0x34, 0x81, 0x4f, 0xf0, 0x68, 0x09, 0x10, 0xfb, 0x09, 0x80, 0x00, 0x6e, + 0x01, 0x30, 0x10, 0xd0, 0xe1, 0xf7, 0xda, 0xfd, 0x96, 0xf8, 0x35, 0x11, + 0x11, 0xfb, 0x09, 0x81, 0x09, 0x6e, 0x40, 0x1a, 0xb6, 0xf8, 0xdc, 0x12, + 0x20, 0xf0, 0x70, 0x40, 0x01, 0xeb, 0xc1, 0x01, 0xb0, 0xeb, 0x81, 0x0f, + 0x7c, 0xd9, 0x28, 0x46, 0xbd, 0xe8, 0xf8, 0x83, 0xb6, 0xf8, 0x84, 0x00, + 0x80, 0x06, 0xb0, 0xd4, 0xb6, 0xf8, 0x38, 0x23, 0x50, 0xb2, 0x00, 0x28, + 0xab, 0xd4, 0xb6, 0xf8, 0xdc, 0x02, 0x07, 0x28, 0xa7, 0xd8, 0xd6, 0xf8, + 0xd4, 0x00, 0x40, 0x7f, 0x00, 0x28, 0x42, 0xd0, 0x96, 0xf8, 0x35, 0x31, + 0xdf, 0xf8, 0xd0, 0x80, 0x4f, 0xf0, 0x68, 0x09, 0x13, 0xfb, 0x09, 0x80, + 0x80, 0x78, 0x88, 0xb9, 0x82, 0xf4, 0x00, 0x40, 0xa6, 0xf8, 0x38, 0x03, + 0x2f, 0x48, 0x01, 0x68, 0x2f, 0x48, 0x88, 0x47, 0x96, 0xf8, 0x35, 0x31, + 0x01, 0x22, 0x62, 0xf3, 0x9f, 0x00, 0xb6, 0xf8, 0x38, 0x23, 0x13, 0xfb, + 0x09, 0x81, 0x88, 0x70, 0x11, 0xb2, 0x68, 0x22, 0x01, 0x38, 0xb1, 0xf1, + 0xff, 0x3f, 0xc6, 0xbf, 0x39, 0x78, 0xa1, 0x74, 0xa1, 0x7c, 0x13, 0xfb, + 0x02, 0x82, 0x90, 0x70, 0x79, 0xe7, 0x96, 0xf8, 0x3b, 0x23, 0x81, 0x2a, + 0x06, 0xd0, 0x87, 0x2a, 0x04, 0xd0, 0x96, 0xf8, 0x3c, 0x23, 0x87, 0x2a, + 0x7f, 0xf4, 0x7f, 0xaf, 0xb2, 0x68, 0x00, 0x2a, 0x3f, 0xf4, 0x7b, 0xaf, + 0x53, 0x78, 0x9b, 0x06, 0x3f, 0xf5, 0x77, 0xaf, 0x12, 0x79, 0x00, 0x2a, + 0x7f, 0xf4, 0x73, 0xaf, 0x01, 0x46, 0xa0, 0x74, 0x6f, 0xe7, 0xb6, 0xf8, + 0xe4, 0x02, 0x00, 0x28, 0xb8, 0xd0, 0x96, 0xf8, 0x35, 0xe1, 0x68, 0x20, + 0xdf, 0xf8, 0x40, 0xc0, 0x1e, 0xfb, 0x00, 0xf0, 0x3c, 0xf8, 0x00, 0x80, + 0xb6, 0xf8, 0x14, 0x03, 0xa0, 0xeb, 0x08, 0x03, 0x02, 0x33, 0x1b, 0xb2, + 0x00, 0x2b, 0xa7, 0xd4, 0xa8, 0xeb, 0x00, 0x00, 0x02, 0x30, 0x00, 0xb2, + 0x00, 0x28, 0xa1, 0xd4, 0x68, 0x20, 0x00, 0x23, 0x1e, 0xfb, 0x00, 0xc0, + 0x83, 0x70, 0x42, 0xf4, 0x00, 0x40, 0xa6, 0xf8, 0x38, 0x03, 0x3a, 0xe7, + 0xb8, 0x78, 0x54, 0xe7, 0x8c, 0x7e, 0x08, 0x00, 0xb0, 0xe6, 0x05, 0x00, + 0xa0, 0x8e, 0x08, 0x00, 0xf8, 0x6d, 0x01, 0x00, 0xf8, 0xb5, 0x5b, 0x4d, + 0xb5, 0x4e, 0x28, 0x78, 0x00, 0xeb, 0x00, 0x10, 0x56, 0xf8, 0x30, 0x00, + 0xe0, 0xb3, 0xb0, 0xf8, 0x42, 0x71, 0x00, 0xf0, 0x79, 0xfa, 0x29, 0x78, + 0x04, 0x46, 0x01, 0xeb, 0x01, 0x12, 0x56, 0xf8, 0x32, 0x00, 0x68, 0xb1, + 0xb0, 0xf8, 0x42, 0x31, 0x9f, 0x42, 0x09, 0xd0, 0x90, 0xf8, 0x35, 0x31, + 0xf0, 0x4f, 0x03, 0xeb, 0x43, 0x03, 0x07, 0xeb, 0x43, 0x13, 0x9f, 0x69, + 0x01, 0x37, 0x9f, 0x61, 0x00, 0x2c, 0x3e, 0xd0, 0x01, 0x2c, 0x31, 0xd1, + 0x06, 0xeb, 0xc2, 0x02, 0x12, 0x69, 0x6a, 0xb3, 0x12, 0x7f, 0x66, 0x2a, + 0x18, 0xbf, 0x6d, 0x2a, 0x1d, 0xd1, 0x62, 0x4b, 0x01, 0xeb, 0x81, 0x02, + 0x03, 0xeb, 0xc2, 0x02, 0x12, 0x7b, 0x03, 0x2a, 0x00, 0xd0, 0xfa, 0xb9, + 0xd0, 0xf8, 0x1c, 0x34, 0x82, 0x68, 0x2b, 0xb1, 0x1b, 0x7e, 0x05, 0x2b, + 0x02, 0xd1, 0x53, 0x78, 0x9b, 0x06, 0x22, 0xd4, 0x12, 0x79, 0x18, 0x2a, + 0x09, 0xd0, 0x11, 0xe0, 0x00, 0x20, 0x40, 0xf2, 0x05, 0x21, 0x00, 0x24, + 0xe7, 0xf7, 0x4e, 0xfb, 0x15, 0xe0, 0x68, 0x2a, 0x08, 0xd1, 0x0f, 0x4a, + 0x5c, 0x23, 0x11, 0xfb, 0x03, 0x21, 0x0e, 0x4b, 0xca, 0x69, 0x09, 0x6a, + 0xc3, 0xe9, 0x00, 0x21, 0x00, 0x21, 0x02, 0x22, 0x1c, 0xf0, 0xac, 0xf9, + 0x28, 0x78, 0x08, 0x49, 0x5c, 0x22, 0x10, 0xfb, 0x02, 0x10, 0x08, 0x49, + 0x81, 0x62, 0x20, 0x46, 0xf8, 0xbd, 0x13, 0x79, 0x03, 0xf0, 0xfe, 0x03, + 0x02, 0x2b, 0xed, 0xd1, 0x52, 0x79, 0xa4, 0x2a, 0xe1, 0xd0, 0xe9, 0xe7, + 0x44, 0x4f, 0x01, 0x00, 0x0c, 0xf0, 0x05, 0x00, 0x75, 0xf6, 0x03, 0x00, + 0x2d, 0xe9, 0xf0, 0x41, 0xdf, 0xf8, 0x80, 0x80, 0x7a, 0x4f, 0x98, 0xf8, + 0x00, 0x00, 0x00, 0xeb, 0x00, 0x10, 0x57, 0xf8, 0x30, 0x50, 0x75, 0xb3, + 0x95, 0xf8, 0x6c, 0x61, 0x00, 0xf0, 0x08, 0xfa, 0x04, 0x46, 0x95, 0xf8, + 0x6c, 0x01, 0x86, 0x42, 0x03, 0xd0, 0x18, 0x48, 0xc1, 0x68, 0x01, 0x31, + 0xc1, 0x60, 0xd5, 0xf8, 0xd4, 0x00, 0x40, 0x7f, 0x18, 0xbb, 0x98, 0xf8, + 0x00, 0x00, 0x68, 0x21, 0x00, 0xeb, 0x00, 0x10, 0x57, 0xf8, 0x30, 0x00, + 0x90, 0xf8, 0x35, 0x21, 0x57, 0x48, 0x12, 0xfb, 0x01, 0x02, 0x92, 0xf8, + 0x5c, 0x20, 0xd2, 0x07, 0x13, 0xd0, 0x95, 0xf8, 0x35, 0x21, 0x12, 0xfb, + 0x01, 0x00, 0x0b, 0x49, 0x09, 0x68, 0x41, 0x65, 0x90, 0xf8, 0x5c, 0x10, + 0x01, 0xf0, 0xfe, 0x01, 0x80, 0xf8, 0x5c, 0x10, 0x05, 0xe0, 0x00, 0x20, + 0x40, 0xf2, 0xc5, 0x21, 0x00, 0x24, 0xe7, 0xf7, 0xe5, 0xfa, 0x20, 0x46, + 0xbd, 0xe8, 0xf0, 0x81, 0x74, 0x87, 0x08, 0x00, 0xb0, 0xf0, 0x05, 0x00, + 0x00, 0x12, 0x21, 0x40, 0x10, 0xb5, 0x04, 0x46, 0x00, 0xf0, 0xd0, 0xf9, + 0xd4, 0xf8, 0xd4, 0x00, 0x40, 0x7f, 0x08, 0xb1, 0x00, 0x20, 0x02, 0xe0, + 0xb4, 0xf8, 0x84, 0x00, 0xc0, 0x0b, 0x94, 0xf8, 0x35, 0x11, 0x3e, 0x4a, + 0x68, 0x23, 0x11, 0xfb, 0x03, 0x21, 0x81, 0xf8, 0x51, 0x00, 0x10, 0xbd, + 0xb0, 0xb5, 0x05, 0x46, 0x00, 0xf0, 0xc0, 0xf9, 0x04, 0x46, 0x8d, 0x48, + 0x0c, 0x49, 0xab, 0x68, 0x00, 0x78, 0x00, 0xeb, 0x80, 0x00, 0x01, 0xeb, + 0xc0, 0x00, 0x42, 0x89, 0x01, 0x7b, 0x28, 0x46, 0xff, 0xf7, 0xbc, 0xfd, + 0x95, 0xf8, 0x35, 0x01, 0x30, 0x49, 0x68, 0x22, 0x10, 0xfb, 0x02, 0x10, + 0x10, 0xf8, 0x51, 0x1f, 0x11, 0xb1, 0x01, 0x39, 0x01, 0x24, 0x01, 0x70, + 0x20, 0x46, 0xb0, 0xbd, 0x84, 0x71, 0x01, 0x00, 0xf8, 0xb5, 0x7e, 0x4e, + 0x7e, 0x4f, 0x30, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x57, 0xf8, 0x30, 0x40, + 0x8c, 0xb1, 0x07, 0xeb, 0xc0, 0x00, 0x22, 0x79, 0x90, 0xf8, 0x99, 0x10, + 0x94, 0xf8, 0x35, 0x01, 0x8a, 0x42, 0x0f, 0xd1, 0x79, 0x49, 0x00, 0xeb, + 0x40, 0x00, 0x01, 0xeb, 0x40, 0x10, 0x01, 0x6a, 0x01, 0x31, 0x01, 0x62, + 0x10, 0xe0, 0x00, 0x20, 0x4f, 0xf4, 0x27, 0x71, 0x00, 0x25, 0xe7, 0xf7, + 0x83, 0xfa, 0x2f, 0xe0, 0x18, 0x49, 0x68, 0x22, 0x10, 0xfb, 0x02, 0x10, + 0xb0, 0xf8, 0x64, 0x10, 0x21, 0xf0, 0x01, 0x01, 0xa0, 0xf8, 0x64, 0x10, + 0x00, 0xf0, 0x7a, 0xf9, 0x05, 0x46, 0x30, 0x78, 0xc0, 0xeb, 0x40, 0x10, + 0x07, 0xeb, 0xc0, 0x00, 0x90, 0xf8, 0x9e, 0x10, 0x01, 0x29, 0x19, 0xd1, + 0x90, 0xf8, 0x91, 0x10, 0xb1, 0xb1, 0xb0, 0xf8, 0xde, 0x60, 0x9e, 0xb1, + 0x94, 0xf8, 0x35, 0x11, 0x09, 0x4a, 0x68, 0x23, 0x11, 0xfb, 0x03, 0x21, + 0x91, 0xf8, 0x50, 0x10, 0x51, 0xb1, 0x90, 0xf8, 0xa1, 0x70, 0x06, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x03, 0x1f, 0x20, 0x46, 0x39, 0x46, 0x32, 0x46, + 0xff, 0xf7, 0x5a, 0xfd, 0x28, 0x46, 0xf8, 0xbd, 0xb0, 0xe6, 0x05, 0x00, + 0x60, 0xbd, 0x08, 0x00, 0xb0, 0xb5, 0x00, 0xf0, 0x53, 0xf9, 0x51, 0x4c, + 0x0d, 0x4d, 0x20, 0x78, 0x00, 0xeb, 0x00, 0x10, 0x05, 0xeb, 0xc0, 0x00, + 0x0e, 0xf0, 0xbe, 0xf8, 0x20, 0x78, 0x00, 0xeb, 0x00, 0x10, 0x55, 0xf8, + 0x30, 0x00, 0xb0, 0xf8, 0x38, 0x13, 0x8a, 0x04, 0x58, 0xbf, 0xb0, 0xbd, + 0x21, 0xf4, 0x00, 0x51, 0xa0, 0xf8, 0x38, 0x13, 0x03, 0x48, 0x01, 0x68, + 0x32, 0x20, 0xbd, 0xe8, 0xb0, 0x40, 0x08, 0x47, 0xfc, 0x6d, 0x01, 0x00, + 0xe4, 0x9c, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x41, 0x00, 0xf0, 0x34, 0xf9, + 0x3e, 0x4e, 0x3f, 0x4f, 0x30, 0x78, 0xc0, 0xeb, 0x40, 0x11, 0x57, 0xf8, + 0x31, 0x00, 0x00, 0x28, 0x46, 0xd0, 0x90, 0xf8, 0x35, 0x21, 0x16, 0x2a, + 0x42, 0xd8, 0x3a, 0x4b, 0x02, 0xeb, 0x42, 0x04, 0x53, 0xf8, 0x24, 0x40, + 0xe4, 0xb3, 0x02, 0xeb, 0x42, 0x02, 0x03, 0xeb, 0x82, 0x02, 0x12, 0x79, + 0x03, 0x2a, 0x35, 0xd1, 0x07, 0xeb, 0xc1, 0x01, 0x91, 0xf8, 0x91, 0x20, + 0x82, 0xb3, 0xb1, 0xf8, 0xdc, 0x20, 0xd2, 0x06, 0x2c, 0xd5, 0xb1, 0xf8, + 0xde, 0x10, 0xc1, 0xb1, 0x90, 0xf8, 0x8a, 0x00, 0x40, 0x07, 0x14, 0xd5, + 0x2c, 0x48, 0x00, 0x68, 0x00, 0x6a, 0x80, 0x47, 0x78, 0xb1, 0x30, 0x78, + 0xc0, 0xeb, 0x40, 0x10, 0x57, 0xf8, 0x30, 0x00, 0x48, 0xb1, 0x90, 0xf8, + 0x35, 0x01, 0x27, 0x49, 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, 0x40, 0x10, + 0x41, 0x6b, 0x01, 0x31, 0x41, 0x63, 0x24, 0x48, 0x00, 0x78, 0x40, 0xf0, + 0x02, 0x00, 0x02, 0x28, 0x0c, 0xd1, 0x30, 0x78, 0xc0, 0xeb, 0x40, 0x11, + 0x57, 0xf8, 0x31, 0x10, 0x91, 0xf8, 0x88, 0x20, 0x52, 0x07, 0x08, 0xd5, + 0x1d, 0x4c, 0x08, 0xe0, 0xbd, 0xe8, 0xf0, 0x81, 0x30, 0x78, 0xc0, 0xeb, + 0x40, 0x11, 0x57, 0xf8, 0x31, 0x10, 0x01, 0xf1, 0x2c, 0x04, 0x25, 0x68, + 0x00, 0x2d, 0xf3, 0xd0, 0xc0, 0xeb, 0x40, 0x10, 0x29, 0x46, 0x57, 0xf8, + 0x30, 0x00, 0x10, 0xf0, 0xed, 0xfb, 0xdf, 0xf8, 0x50, 0x80, 0x20, 0x46, + 0x29, 0x46, 0xd8, 0xf8, 0x00, 0x20, 0x90, 0x47, 0x00, 0x28, 0xe3, 0xd0, + 0x05, 0x46, 0x30, 0x78, 0x29, 0x46, 0xc0, 0xeb, 0x40, 0x10, 0x57, 0xf8, + 0x30, 0x00, 0x10, 0xf0, 0xdb, 0xfb, 0xd8, 0xf8, 0x00, 0x20, 0x20, 0x46, + 0x29, 0x46, 0x90, 0x47, 0x05, 0x46, 0x00, 0x28, 0xef, 0xd1, 0xd1, 0xe7, + 0x74, 0x87, 0x08, 0x00, 0x0c, 0x6f, 0x01, 0x00, 0xe8, 0x72, 0x01, 0x00, + 0xe4, 0x35, 0x01, 0x00, 0x54, 0xf1, 0x05, 0x00, 0x5d, 0x34, 0x01, 0x00, + 0xf4, 0x61, 0x01, 0x00, 0xec, 0xa0, 0x08, 0x00, 0x10, 0xb5, 0x15, 0x48, + 0x15, 0x49, 0x1a, 0x4a, 0x1a, 0x4b, 0x1b, 0x4c, 0x01, 0x60, 0x14, 0x48, + 0x14, 0x49, 0x01, 0x60, 0x14, 0x48, 0x15, 0x49, 0xc0, 0xe9, 0x00, 0x43, + 0xc0, 0xe9, 0x02, 0x12, 0x16, 0x48, 0x17, 0x49, 0x17, 0x4a, 0x18, 0x4b, + 0xc0, 0xe9, 0x00, 0x32, 0xc0, 0xe9, 0x02, 0x21, 0x16, 0x48, 0x17, 0x49, + 0x01, 0x60, 0x17, 0x48, 0x17, 0x49, 0x01, 0x60, 0x17, 0x48, 0x18, 0x49, + 0x01, 0x60, 0x18, 0x48, 0x18, 0x49, 0x01, 0x60, 0x18, 0x48, 0x19, 0x49, + 0x01, 0x60, 0x19, 0x48, 0x19, 0x49, 0x01, 0x60, 0x10, 0xbd, 0x00, 0xbf, + 0xa8, 0xba, 0x08, 0x00, 0x75, 0xf3, 0x03, 0x00, 0x94, 0xd1, 0x08, 0x00, + 0xcd, 0xf3, 0x03, 0x00, 0x60, 0xd1, 0x08, 0x00, 0x58, 0xd3, 0x05, 0x00, + 0x2c, 0xfb, 0x03, 0x00, 0x0c, 0xfb, 0x03, 0x00, 0xec, 0xfa, 0x03, 0x00, + 0x78, 0xd1, 0x08, 0x00, 0x8c, 0xfb, 0x03, 0x00, 0x6c, 0xfb, 0x03, 0x00, + 0x4c, 0xfb, 0x03, 0x00, 0x54, 0xa2, 0x08, 0x00, 0x8d, 0xf5, 0x03, 0x00, + 0xc8, 0xd1, 0x08, 0x00, 0x09, 0xf7, 0x03, 0x00, 0xf0, 0xbd, 0x08, 0x00, + 0x35, 0xf7, 0x03, 0x00, 0x48, 0xb7, 0x08, 0x00, 0x79, 0xf7, 0x03, 0x00, + 0xb4, 0xb9, 0x08, 0x00, 0x29, 0xf8, 0x03, 0x00, 0xdc, 0xd1, 0x08, 0x00, + 0x71, 0xf8, 0x03, 0x00, 0x41, 0xf6, 0x9b, 0x3c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x40, 0xf6, 0x37, 0x4c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x42, 0xf6, 0x25, 0x7c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x43, 0xf2, 0x57, 0x1c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x42, 0xf2, 0x35, 0x3c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x40, 0xf2, 0x59, 0x6c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x40, 0xf6, 0x51, 0x6c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf2, 0x9b, 0x2c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4f, 0xf2, 0x5d, 0x3c, 0xc1, 0xf2, 0x08, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf2, 0xa7, 0x4c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf6, 0x67, 0x5c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x40, 0xf6, 0x39, 0x4c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x42, 0xf2, 0x15, 0x4c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0xef, 0x29, 0x09, 0x10, 0x5b, 0x2a, 0x09, 0x10, + 0xd7, 0x2c, 0x09, 0x10, 0x8f, 0x2d, 0x09, 0x10, 0xa5, 0xf1, 0x03, 0x00, + 0xf1, 0x33, 0x09, 0x10, 0xb3, 0x35, 0x09, 0x10, 0x69, 0x00, 0x00, 0x00, + 0xef, 0x29, 0x09, 0x10, 0x5b, 0x2a, 0x09, 0x10, 0xd7, 0x2c, 0x09, 0x10, + 0x8f, 0x2d, 0x09, 0x10, 0xa5, 0xf1, 0x03, 0x00, 0xdd, 0x34, 0x09, 0x10, + 0x57, 0x31, 0x09, 0x10, 0x6f, 0x00, 0x00, 0x00, 0xef, 0x29, 0x09, 0x10, + 0x5b, 0x2a, 0x09, 0x10, 0xd7, 0x2c, 0x09, 0x10, 0x8f, 0x2d, 0x09, 0x10, + 0xa5, 0xf1, 0x03, 0x00, 0x37, 0x37, 0x09, 0x10, 0x33, 0x38, 0x09, 0x10, + 0x6e, 0x00, 0x00, 0x00, 0xe9, 0x0b, 0x09, 0x10, 0xf1, 0x0d, 0x09, 0x10, + 0x17, 0x19, 0x09, 0x10, 0x21, 0x1a, 0x09, 0x10, 0x61, 0xf0, 0x03, 0x00, + 0x47, 0x32, 0x09, 0x10, 0x61, 0x33, 0x09, 0x10, 0x68, 0x00, 0x00, 0x00, + 0xe9, 0x0b, 0x09, 0x10, 0xf1, 0x0d, 0x09, 0x10, 0x17, 0x19, 0x09, 0x10, + 0x21, 0x1a, 0x09, 0x10, 0x61, 0xf0, 0x03, 0x00, 0x5f, 0x20, 0x09, 0x10, + 0x75, 0x28, 0x09, 0x10, 0x66, 0x00, 0x00, 0x00, 0xe9, 0x0b, 0x09, 0x10, + 0xf1, 0x0d, 0x09, 0x10, 0x17, 0x19, 0x09, 0x10, 0x21, 0x1a, 0x09, 0x10, + 0x61, 0xf0, 0x03, 0x00, 0x37, 0x36, 0x09, 0x10, 0x29, 0x37, 0x09, 0x10, + 0x6d, 0x00, 0x00, 0x00, 0x7f, 0xb5, 0xf4, 0x4c, 0x37, 0x49, 0x36, 0x4d, + 0x6a, 0x46, 0x20, 0x78, 0x0b, 0x68, 0x36, 0x49, 0x00, 0xeb, 0x00, 0x10, + 0x89, 0x69, 0x05, 0xeb, 0xc0, 0x00, 0x68, 0x30, 0x14, 0x31, 0x98, 0x47, + 0xf3, 0x48, 0x00, 0x99, 0x82, 0x6a, 0x8a, 0x1a, 0x12, 0x01, 0x02, 0xd5, + 0x2f, 0x4a, 0x11, 0x40, 0x81, 0x62, 0x20, 0x78, 0x00, 0xeb, 0x00, 0x10, + 0x05, 0xeb, 0xc0, 0x01, 0x4a, 0x6b, 0x88, 0x6e, 0x83, 0x1a, 0x1b, 0x01, + 0x06, 0xd4, 0x90, 0x42, 0x33, 0xd1, 0xb1, 0xf8, 0x6c, 0x30, 0x0c, 0x8f, + 0x9c, 0x42, 0x2e, 0xd9, 0xdc, 0x4c, 0xdb, 0x4d, 0xc4, 0xe9, 0x00, 0x02, + 0x25, 0x4a, 0x68, 0x60, 0x01, 0xf1, 0x34, 0x00, 0x68, 0x31, 0x13, 0x68, + 0x02, 0xaa, 0x98, 0x47, 0xbd, 0xf8, 0x0c, 0x10, 0x02, 0x9a, 0x41, 0xf2, + 0x88, 0x30, 0x02, 0xfb, 0x00, 0x10, 0x1f, 0x49, 0x01, 0xeb, 0x10, 0x16, + 0xb0, 0xf5, 0x2f, 0x5f, 0x2e, 0x82, 0x14, 0xd3, 0xe2, 0x48, 0x01, 0x68, + 0x02, 0x20, 0x88, 0x47, 0x1a, 0x48, 0x1b, 0x49, 0x00, 0x78, 0x30, 0x44, + 0x08, 0x60, 0x94, 0xf8, 0x20, 0x00, 0x01, 0x28, 0x0c, 0xd1, 0xdb, 0x48, + 0x02, 0x68, 0xa0, 0x7f, 0x01, 0x28, 0x10, 0xd0, 0x01, 0x20, 0x00, 0x21, + 0x0f, 0xe0, 0x0f, 0x48, 0x01, 0x21, 0x01, 0x70, 0x00, 0x20, 0x0f, 0xe0, + 0xa8, 0x7c, 0x40, 0x07, 0x03, 0xd4, 0x10, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x04, 0xe0, 0xd1, 0x48, 0x02, 0x68, 0x01, 0x20, 0x01, 0x21, 0x90, 0x47, + 0x06, 0x48, 0x00, 0x21, 0x01, 0x70, 0x01, 0x20, 0x04, 0xb0, 0x70, 0xbd, + 0xfc, 0x6d, 0x01, 0x00, 0x48, 0xa1, 0x08, 0x00, 0xfc, 0x73, 0x01, 0x00, + 0xfc, 0xff, 0xff, 0x0f, 0x74, 0xe6, 0x05, 0x00, 0x44, 0xa1, 0x08, 0x00, + 0xa8, 0xfd, 0xff, 0xff, 0xa8, 0x0d, 0x01, 0x00, 0x54, 0x11, 0x21, 0x40, + 0x64, 0xbb, 0x08, 0x00, 0x2d, 0xe9, 0xff, 0x47, 0xe1, 0xf7, 0xac, 0xf9, + 0xad, 0x4a, 0xab, 0x4d, 0xab, 0x4c, 0xff, 0x21, 0x13, 0x68, 0x29, 0x70, + 0xe1, 0x68, 0x1e, 0x1a, 0x09, 0x01, 0x36, 0x01, 0xe1, 0x60, 0x46, 0xbf, + 0xc3, 0x1a, 0x23, 0xf0, 0x70, 0x43, 0x00, 0x23, 0x92, 0xf8, 0x20, 0x60, + 0x01, 0x2e, 0x0a, 0xd1, 0x96, 0x7f, 0x9b, 0xb2, 0x01, 0x2e, 0x03, 0xd1, + 0x96, 0x68, 0x33, 0x44, 0x93, 0x60, 0x02, 0xe0, 0xd6, 0x68, 0x33, 0x44, + 0xd3, 0x60, 0x9f, 0x4b, 0xdb, 0x78, 0x5b, 0x07, 0x26, 0xd4, 0xdf, 0xf8, + 0x7c, 0xa2, 0x9f, 0x4f, 0x9a, 0xf8, 0x00, 0x00, 0xc0, 0xeb, 0x40, 0x10, + 0x07, 0xeb, 0xc0, 0x02, 0xb2, 0xf8, 0xdc, 0x00, 0x00, 0xf0, 0x69, 0x00, + 0x09, 0x28, 0x13, 0xd1, 0x99, 0x4b, 0x92, 0xf8, 0xba, 0x00, 0x1b, 0x78, + 0x98, 0x42, 0x0d, 0xd2, 0x97, 0x4b, 0x92, 0xf8, 0xb0, 0x20, 0x13, 0xf8, + 0x10, 0x60, 0xb2, 0x42, 0x06, 0xd3, 0x03, 0xeb, 0x40, 0x03, 0x5b, 0x78, + 0x9a, 0x42, 0x98, 0xbf, 0x07, 0x28, 0x41, 0xd9, 0x41, 0xf0, 0x01, 0x00, + 0xe0, 0x60, 0x1c, 0xe0, 0x53, 0x68, 0x1b, 0x1a, 0xc3, 0xf3, 0x4e, 0x03, + 0x95, 0x7f, 0x1d, 0xb1, 0x95, 0x8a, 0x2b, 0x44, 0x93, 0x82, 0x02, 0xe0, + 0xd5, 0x8a, 0x2b, 0x44, 0xd3, 0x82, 0x20, 0x60, 0x41, 0xf0, 0x04, 0x00, + 0xe0, 0x60, 0xa0, 0x7c, 0x40, 0xf0, 0x01, 0x00, 0xa0, 0x74, 0x80, 0x48, + 0x01, 0x88, 0x01, 0x31, 0x01, 0x80, 0xb7, 0x48, 0x01, 0x89, 0x01, 0x31, + 0x01, 0x81, 0x00, 0x24, 0x8b, 0x48, 0x00, 0x21, 0x01, 0x26, 0x00, 0x25, + 0x02, 0x68, 0x01, 0x20, 0x90, 0x47, 0x89, 0x48, 0x01, 0x68, 0x00, 0x20, + 0x88, 0x47, 0xf0, 0x48, 0xf7, 0x49, 0x00, 0x78, 0xc0, 0xeb, 0x40, 0x10, + 0x01, 0xeb, 0xc0, 0x00, 0xb0, 0xf8, 0xdc, 0x00, 0xc1, 0x07, 0x83, 0x49, + 0x09, 0x68, 0x18, 0xbf, 0x26, 0xea, 0xd0, 0x05, 0x28, 0x46, 0x88, 0x47, + 0x20, 0x46, 0x04, 0xb0, 0xbd, 0xe8, 0xf0, 0x87, 0x01, 0x22, 0x02, 0xfa, + 0x00, 0xf0, 0x10, 0xf0, 0xc7, 0x0f, 0xb7, 0xd0, 0x6d, 0x48, 0x00, 0x68, + 0x80, 0x47, 0xe1, 0x68, 0x00, 0x28, 0xb1, 0xd0, 0x41, 0xf0, 0x02, 0x00, + 0x6a, 0x49, 0xe0, 0x60, 0x9a, 0xf8, 0x00, 0x00, 0x0a, 0x68, 0x00, 0x21, + 0xc0, 0xeb, 0x40, 0x10, 0x07, 0xeb, 0xc0, 0x00, 0x90, 0x47, 0xdf, 0xf8, + 0x98, 0x81, 0x58, 0xf8, 0x04, 0x0f, 0x01, 0x30, 0xc8, 0xf8, 0x00, 0x00, + 0x9a, 0xf8, 0x00, 0x00, 0xc0, 0xeb, 0x40, 0x12, 0x07, 0xeb, 0xc2, 0x01, + 0x91, 0xf8, 0xba, 0x00, 0x07, 0x28, 0x2c, 0xd1, 0xe0, 0x68, 0x40, 0xf0, + 0x03, 0x00, 0xe0, 0x60, 0x60, 0x48, 0x90, 0xf8, 0x2e, 0x20, 0x85, 0x1c, + 0x00, 0x2a, 0x57, 0xd0, 0x95, 0xf8, 0x2b, 0x40, 0x01, 0x22, 0x81, 0xf8, + 0x91, 0x20, 0x02, 0x2c, 0x5f, 0xd0, 0x01, 0x2c, 0x03, 0xd1, 0x5a, 0x49, + 0x49, 0x78, 0xc9, 0x07, 0x5d, 0xd0, 0xe9, 0x8c, 0x00, 0x29, 0x9a, 0xd0, + 0x57, 0x4e, 0x01, 0x6a, 0x95, 0xf8, 0x28, 0x30, 0xd5, 0xf8, 0x1a, 0x00, + 0xd5, 0xf8, 0x22, 0x20, 0xdf, 0xf8, 0x50, 0xc1, 0x71, 0x27, 0x8d, 0xe8, + 0x90, 0x10, 0x36, 0x68, 0xb0, 0x47, 0x00, 0x24, 0x00, 0x28, 0x89, 0xd1, + 0x48, 0xe0, 0xdf, 0xf8, 0x20, 0x91, 0x99, 0xf8, 0x3c, 0x00, 0x00, 0xf0, + 0x82, 0x01, 0x82, 0x29, 0x0b, 0xd1, 0x57, 0xf8, 0x32, 0x10, 0x41, 0xb1, + 0x00, 0xf0, 0x5e, 0xfd, 0x01, 0x28, 0x3f, 0xd0, 0x04, 0x46, 0x00, 0x28, + 0x42, 0xd1, 0x99, 0xf8, 0x3c, 0x00, 0x00, 0xf0, 0x81, 0x00, 0x81, 0x28, + 0x1a, 0xd1, 0x00, 0xf0, 0x8d, 0xf8, 0x01, 0x28, 0x2e, 0xd1, 0x3b, 0x48, + 0x01, 0x24, 0x41, 0x88, 0x01, 0x31, 0x41, 0x80, 0xd8, 0xf8, 0x04, 0x00, + 0x01, 0x30, 0xc8, 0xf8, 0x04, 0x00, 0x9a, 0xf8, 0x00, 0x00, 0xc0, 0xeb, + 0x40, 0x10, 0x07, 0xeb, 0xc0, 0x00, 0x90, 0xf8, 0xb9, 0x10, 0x41, 0xf0, + 0x20, 0x01, 0x80, 0xf8, 0xb9, 0x10, 0x21, 0xe0, 0x00, 0x24, 0x1f, 0xe0, + 0x28, 0x78, 0xc0, 0x07, 0x3f, 0xf4, 0x4f, 0xaf, 0x2b, 0x48, 0x90, 0xf8, + 0x3c, 0x00, 0x00, 0xf0, 0x81, 0x00, 0x81, 0x28, 0x7f, 0xf4, 0x47, 0xaf, + 0x00, 0xf0, 0x2e, 0xfd, 0x43, 0xe7, 0x2b, 0x49, 0x49, 0x78, 0x09, 0x07, + 0xa1, 0xd4, 0x00, 0x24, 0xec, 0x84, 0x3d, 0xe7, 0x04, 0x46, 0x00, 0xf0, + 0x23, 0xfd, 0x05, 0xe0, 0xb8, 0xf8, 0x14, 0x00, 0x01, 0x24, 0x01, 0x30, + 0xa8, 0xf8, 0x14, 0x00, 0x2a, 0x78, 0x1f, 0x48, 0xff, 0x21, 0xff, 0x2a, + 0x01, 0x70, 0x1b, 0xd0, 0x02, 0xf0, 0x07, 0x01, 0x01, 0x23, 0xd2, 0x08, + 0x03, 0xfa, 0x01, 0xf1, 0x1a, 0x4b, 0x9d, 0x5c, 0x29, 0x42, 0x11, 0xd0, + 0x9a, 0xf8, 0x00, 0x50, 0xc5, 0xeb, 0x45, 0x15, 0x07, 0xeb, 0xc5, 0x05, + 0x95, 0xf8, 0xb1, 0x50, 0x05, 0xf0, 0x0f, 0x06, 0x01, 0x2e, 0x0f, 0xbf, + 0xe9, 0x09, 0x1a, 0x44, 0x12, 0x7c, 0x11, 0x40, 0x01, 0x70, 0x11, 0xe7, + 0x10, 0xe7, 0x00, 0xbf, 0xca, 0x0e, 0x01, 0x00, 0x78, 0xe6, 0x05, 0x00, + 0x8c, 0xe6, 0x05, 0x00, 0x40, 0x36, 0x01, 0x00, 0xf8, 0xda, 0x05, 0x00, + 0x74, 0x87, 0x08, 0x00, 0x0c, 0x6f, 0x01, 0x00, 0x96, 0x53, 0x01, 0x00, + 0x1e, 0xcd, 0x08, 0x10, 0x50, 0xc9, 0x08, 0x00, 0x38, 0xc9, 0x08, 0x00, + 0x38, 0x7a, 0x01, 0x00, 0x90, 0x01, 0x00, 0x00, 0x7a, 0x2e, 0x01, 0x00, + 0xc9, 0x0e, 0x01, 0x00, 0x88, 0x56, 0x01, 0x00, 0x74, 0x54, 0x01, 0x00, + 0x70, 0x52, 0x01, 0x00, 0x54, 0xc9, 0x08, 0x00, 0xb4, 0x55, 0x01, 0x00, + 0x68, 0xbb, 0x08, 0x00, 0x20, 0xbb, 0x08, 0x00, 0x24, 0xbb, 0x08, 0x00, + 0xb0, 0xb5, 0x00, 0xf0, 0xcd, 0xfc, 0x04, 0x46, 0x64, 0x48, 0x65, 0x49, + 0x00, 0x78, 0x00, 0xeb, 0x00, 0x10, 0x01, 0xeb, 0xc0, 0x00, 0x1c, 0x49, + 0x00, 0x69, 0x09, 0x68, 0x88, 0x42, 0x01, 0xd0, 0x20, 0x46, 0xb0, 0xbd, + 0x19, 0x4d, 0xe1, 0xf7, 0x11, 0xf8, 0x15, 0xf8, 0x1d, 0x2f, 0x42, 0x21, + 0x06, 0x2a, 0x5e, 0x4a, 0x08, 0xbf, 0x41, 0x21, 0x29, 0x70, 0x92, 0xf8, + 0x20, 0x30, 0x01, 0x2b, 0x08, 0xd1, 0x92, 0xf8, 0x21, 0x00, 0x01, 0x28, + 0xea, 0xd1, 0x68, 0x78, 0x40, 0xf0, 0x80, 0x00, 0x68, 0x70, 0xe5, 0xe7, + 0x0e, 0x4a, 0x11, 0x44, 0x91, 0xf8, 0xab, 0x10, 0x00, 0x29, 0xdf, 0xd0, + 0x0c, 0x4a, 0x12, 0x68, 0x53, 0x1c, 0x06, 0xd0, 0x10, 0x1a, 0x40, 0x30, + 0x20, 0xf0, 0x70, 0x40, 0xb0, 0xf1, 0x00, 0x6f, 0xd4, 0xd9, 0x68, 0x78, + 0x88, 0x42, 0xd1, 0xd0, 0x06, 0x48, 0x69, 0x70, 0x81, 0x8a, 0x01, 0x31, + 0x81, 0x82, 0xcb, 0xe7, 0x68, 0xba, 0x08, 0x00, 0xfc, 0x20, 0x01, 0x00, + 0x04, 0x31, 0x06, 0x00, 0x78, 0xd3, 0x05, 0x00, 0x38, 0xfb, 0x05, 0x00, + 0x70, 0xb5, 0x3e, 0x48, 0x80, 0x7c, 0xc1, 0x07, 0x33, 0xd1, 0x80, 0x07, + 0x31, 0xd4, 0x00, 0xf0, 0x7f, 0xfc, 0x00, 0x28, 0x48, 0xd0, 0x01, 0x28, + 0x6e, 0xd1, 0x39, 0x4d, 0x39, 0x4c, 0x3f, 0x4e, 0x28, 0x78, 0x32, 0x68, + 0x00, 0xeb, 0x00, 0x11, 0x04, 0xeb, 0xc1, 0x01, 0x09, 0x69, 0x91, 0x42, + 0x13, 0xd1, 0x3b, 0x4a, 0xc0, 0xeb, 0x40, 0x11, 0x02, 0xeb, 0xc1, 0x01, + 0x91, 0xf8, 0xba, 0x10, 0x07, 0x29, 0x0c, 0xd0, 0x31, 0x48, 0x01, 0x68, + 0x00, 0x20, 0x88, 0x47, 0x28, 0x78, 0x32, 0x68, 0x00, 0xeb, 0x00, 0x11, + 0x04, 0xeb, 0xc1, 0x01, 0x09, 0x69, 0x91, 0x42, 0x07, 0xd1, 0x31, 0x49, + 0x00, 0xeb, 0x00, 0x10, 0x04, 0xeb, 0xc0, 0x00, 0x0a, 0x68, 0x2c, 0x21, + 0x90, 0x47, 0x01, 0x20, 0x70, 0xbd, 0xf8, 0x4c, 0x23, 0x4d, 0x24, 0x49, + 0x20, 0x78, 0x09, 0x68, 0x00, 0xeb, 0x00, 0x10, 0x05, 0xeb, 0xc0, 0x00, + 0x40, 0x68, 0x88, 0x47, 0x21, 0x78, 0x01, 0xeb, 0x01, 0x11, 0x05, 0xeb, + 0xc1, 0x01, 0x09, 0x6a, 0x0a, 0x1a, 0x12, 0x01, 0x46, 0xbf, 0x40, 0x1a, + 0xc0, 0xf3, 0x5a, 0x00, 0x00, 0x20, 0x1a, 0x49, 0x09, 0x68, 0x88, 0x47, + 0x19, 0x48, 0x90, 0xf8, 0x20, 0x10, 0x01, 0x29, 0x21, 0xd1, 0x08, 0x30, + 0x01, 0x68, 0x91, 0xb1, 0x42, 0xf2, 0x10, 0x72, 0x64, 0x25, 0x01, 0xfb, + 0x02, 0xf3, 0x42, 0x68, 0x54, 0x18, 0xb3, 0xfb, 0xf4, 0xf4, 0x12, 0x4b, + 0x93, 0xf8, 0xfd, 0x32, 0x13, 0xfb, 0x05, 0xf5, 0x00, 0x23, 0xa5, 0x42, + 0x88, 0xbf, 0x01, 0x23, 0x01, 0xe0, 0x42, 0x68, 0x01, 0x23, 0x11, 0x44, + 0x0c, 0x4a, 0x83, 0x75, 0x91, 0x42, 0x24, 0xbf, 0x00, 0x21, 0xc0, 0xe9, + 0x00, 0x11, 0x01, 0x21, 0x41, 0x76, 0x00, 0x20, 0x70, 0xbd, 0x00, 0xbf, + 0x78, 0xe6, 0x05, 0x00, 0x74, 0x87, 0x08, 0x00, 0xfc, 0x6d, 0x01, 0x00, + 0xac, 0xa0, 0x08, 0x00, 0x4c, 0xba, 0x08, 0x00, 0x8c, 0xe6, 0x05, 0x00, + 0x8c, 0x7e, 0x08, 0x00, 0x01, 0xee, 0x02, 0x00, 0x6c, 0xba, 0x08, 0x00, + 0x0c, 0x6f, 0x01, 0x00, 0xf4, 0xa0, 0x08, 0x00, 0x70, 0xb5, 0x00, 0xf0, + 0xf7, 0xfb, 0x04, 0x46, 0x12, 0x4d, 0xc8, 0x48, 0x12, 0x49, 0x5c, 0x22, + 0xd5, 0xf8, 0x00, 0x61, 0x00, 0x78, 0x10, 0xfb, 0x02, 0x10, 0x10, 0x49, + 0x40, 0x78, 0x09, 0x68, 0x88, 0x47, 0x86, 0x42, 0x03, 0xd9, 0x8c, 0xb1, + 0x18, 0xf0, 0x8a, 0xfc, 0x0f, 0xe0, 0x0c, 0x48, 0x90, 0xf8, 0x64, 0x01, + 0xc0, 0xf3, 0xc1, 0x00, 0x29, 0x6d, 0x21, 0xf0, 0x0b, 0x01, 0x01, 0x44, + 0x29, 0x65, 0x29, 0x68, 0x21, 0xf0, 0x0b, 0x01, 0x08, 0x44, 0x28, 0x60, + 0x00, 0x24, 0x20, 0x46, 0x70, 0xbd, 0x00, 0xbf, 0x54, 0x10, 0x21, 0x40, + 0x44, 0x4f, 0x01, 0x00, 0xcc, 0xbe, 0x08, 0x00, 0xe8, 0x65, 0x08, 0x00, + 0xb0, 0xb5, 0xb1, 0x4c, 0xb1, 0x4d, 0xff, 0x21, 0x20, 0x78, 0xc0, 0xeb, + 0x40, 0x10, 0x05, 0xeb, 0xc0, 0x00, 0x80, 0xf8, 0xbb, 0x10, 0xb0, 0xf8, + 0xdc, 0x00, 0xc0, 0x07, 0x17, 0xd0, 0x0d, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x20, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x05, 0xeb, 0xc0, 0x00, 0x90, 0xf8, + 0xba, 0x10, 0x07, 0x29, 0x0b, 0xd8, 0x01, 0x22, 0x02, 0xfa, 0x01, 0xf1, + 0x11, 0xf0, 0x86, 0x0f, 0x05, 0xd0, 0x90, 0xf8, 0xb0, 0x00, 0x26, 0x28, + 0x3c, 0xbf, 0x01, 0x20, 0xb0, 0xbd, 0x00, 0x20, 0xb0, 0xbd, 0x00, 0xbf, + 0x20, 0xa1, 0x08, 0x00, 0x2d, 0xe9, 0xfe, 0x43, 0x9a, 0x4f, 0x9b, 0x4e, + 0x38, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x06, 0xeb, 0xc0, 0x00, 0xb0, 0xf8, + 0xdc, 0x10, 0x01, 0xf0, 0x69, 0x01, 0x09, 0x29, 0x42, 0xd1, 0xda, 0x4a, + 0x90, 0xf8, 0xba, 0x10, 0x12, 0x78, 0x91, 0x42, 0x3c, 0xd2, 0xd8, 0x4a, + 0x90, 0xf8, 0xb0, 0x00, 0x12, 0xf8, 0x11, 0x30, 0x98, 0x42, 0x35, 0xd3, + 0x02, 0xeb, 0x41, 0x01, 0x49, 0x78, 0x88, 0x42, 0x30, 0xd8, 0xd3, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x60, 0xb3, 0x38, 0x78, 0x8a, 0x49, 0xc0, 0xeb, + 0x40, 0x10, 0x0a, 0x68, 0x00, 0x21, 0x06, 0xeb, 0xc0, 0x00, 0x90, 0x47, + 0x38, 0x78, 0xdf, 0xf8, 0x1c, 0x92, 0xc0, 0xeb, 0x40, 0x10, 0x06, 0xeb, + 0xc0, 0x04, 0x94, 0xf8, 0xba, 0x00, 0x07, 0x28, 0x1d, 0xd0, 0x02, 0x28, + 0x4b, 0xd0, 0x01, 0x28, 0x40, 0xf0, 0xbc, 0x80, 0xdf, 0xf8, 0x00, 0x82, + 0xd8, 0xf8, 0xac, 0x00, 0x00, 0x28, 0x00, 0xf0, 0xb5, 0x80, 0x98, 0xf8, + 0x9e, 0x00, 0xc0, 0x07, 0x52, 0xd1, 0x81, 0x4b, 0x94, 0xf8, 0xb8, 0x20, + 0xd4, 0xf8, 0xb4, 0x10, 0x20, 0x68, 0x1b, 0x68, 0x98, 0x47, 0x50, 0xe0, + 0x18, 0xf0, 0x26, 0xfc, 0x00, 0x20, 0xbd, 0xe8, 0xfe, 0x83, 0x75, 0x48, + 0x90, 0xf8, 0x2e, 0x10, 0x85, 0x1c, 0xa1, 0xb3, 0x01, 0x21, 0x84, 0xf8, + 0x91, 0x10, 0x95, 0xf8, 0x2b, 0x40, 0x02, 0x2c, 0x00, 0xf0, 0x9c, 0x80, + 0x01, 0x2c, 0x04, 0xd1, 0x6e, 0x49, 0x49, 0x78, 0xc9, 0x07, 0x00, 0xf0, + 0x9a, 0x80, 0xe9, 0x8c, 0x00, 0x29, 0x00, 0xf0, 0x8b, 0x80, 0x6b, 0x4e, + 0x01, 0x6a, 0x95, 0xf8, 0x28, 0x30, 0xd5, 0xf8, 0x1a, 0x00, 0xd5, 0xf8, + 0x22, 0x20, 0xdf, 0xf8, 0xa0, 0xc1, 0x71, 0x27, 0x8d, 0xe8, 0x90, 0x10, + 0x36, 0x68, 0xb0, 0x47, 0x08, 0xb9, 0x00, 0x20, 0xe8, 0x84, 0xb9, 0xf8, + 0x06, 0x00, 0x01, 0x30, 0xa9, 0xf8, 0x06, 0x00, 0x72, 0xe0, 0x5c, 0x48, + 0x90, 0xf8, 0x3c, 0x00, 0x00, 0xf0, 0x81, 0x00, 0x81, 0x28, 0x6b, 0xd1, + 0x00, 0xf0, 0xfa, 0xfa, 0x68, 0xe0, 0x57, 0x48, 0x90, 0xf8, 0x3c, 0x00, + 0x00, 0xf0, 0x81, 0x00, 0x81, 0x28, 0x61, 0xd1, 0x28, 0x78, 0xc0, 0x07, + 0xf2, 0xd1, 0x5d, 0xe0, 0x56, 0x4a, 0x94, 0xf8, 0xb8, 0x10, 0xd4, 0xf8, + 0xb4, 0x00, 0x12, 0x68, 0x90, 0x47, 0x00, 0x28, 0x54, 0xd0, 0x38, 0x78, + 0x53, 0x49, 0x08, 0xf1, 0x94, 0x05, 0xc0, 0xeb, 0x40, 0x10, 0x0a, 0x68, + 0x29, 0x46, 0x06, 0xeb, 0xc0, 0x00, 0x90, 0xf8, 0xbb, 0x00, 0x90, 0x47, + 0x38, 0x78, 0x29, 0x46, 0xc0, 0xeb, 0x40, 0x10, 0x06, 0xeb, 0xc0, 0x00, + 0xd0, 0xf8, 0xa4, 0x00, 0x82, 0x1d, 0x4a, 0x48, 0x03, 0x68, 0x20, 0x46, + 0x98, 0x47, 0xc8, 0xb3, 0x38, 0x78, 0x48, 0x4b, 0x22, 0x68, 0xc0, 0xeb, + 0x40, 0x10, 0x1b, 0x68, 0x06, 0xeb, 0xc0, 0x00, 0x90, 0xf8, 0xb8, 0x10, + 0xd0, 0xf8, 0xb4, 0x00, 0x98, 0x47, 0x68, 0xb1, 0x01, 0x46, 0xb0, 0xf8, + 0x84, 0x00, 0xc0, 0x06, 0x08, 0xd5, 0x91, 0xf8, 0x24, 0x01, 0x46, 0x28, + 0x04, 0xd0, 0x3e, 0x48, 0x08, 0x22, 0x03, 0x68, 0x98, 0x20, 0x98, 0x47, + 0xc5, 0x4d, 0x72, 0xb6, 0x28, 0x68, 0x40, 0x00, 0x01, 0x30, 0x28, 0x60, + 0xd8, 0xe9, 0x08, 0x01, 0x81, 0x42, 0x21, 0xd1, 0x3d, 0x48, 0x08, 0xf1, + 0x04, 0x04, 0x00, 0x6b, 0xa0, 0x42, 0x3e, 0xd0, 0x36, 0x48, 0x00, 0x68, + 0x80, 0x47, 0xc8, 0xf8, 0x28, 0x00, 0x20, 0x30, 0x03, 0x21, 0xc8, 0xf8, + 0x14, 0x00, 0x37, 0x48, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0x26, 0xe0, + 0xd9, 0xf8, 0x00, 0x00, 0x01, 0x30, 0xc9, 0xf8, 0x00, 0x00, 0x51, 0xe7, + 0x21, 0x49, 0x49, 0x78, 0x09, 0x07, 0x3f, 0xf5, 0x66, 0xaf, 0x00, 0x20, + 0xe8, 0x84, 0xf1, 0xe7, 0x27, 0x4a, 0x26, 0x4c, 0xd8, 0xf8, 0x00, 0x10, + 0xa0, 0x69, 0x12, 0x68, 0x90, 0x47, 0xd0, 0xb1, 0x24, 0x48, 0x00, 0x68, + 0x80, 0x47, 0xd8, 0xf8, 0x00, 0x20, 0x00, 0xf1, 0x20, 0x01, 0xc8, 0xf8, + 0x28, 0x00, 0xc8, 0xf8, 0x14, 0x10, 0xa1, 0x69, 0x10, 0x60, 0x1f, 0x48, + 0x03, 0x68, 0x10, 0x46, 0x98, 0x47, 0xd8, 0xf8, 0x24, 0x00, 0xd8, 0xf8, + 0x28, 0x10, 0x01, 0xeb, 0x40, 0x00, 0x1b, 0x49, 0x08, 0x40, 0x1b, 0x49, + 0x48, 0x60, 0x28, 0x68, 0x40, 0x08, 0x28, 0x60, 0x28, 0x68, 0x80, 0xf3, + 0x10, 0x88, 0xb9, 0xf8, 0x04, 0x00, 0x01, 0x30, 0xa9, 0xf8, 0x04, 0x00, + 0xc2, 0xe7, 0x00, 0xbf, 0x74, 0x87, 0x08, 0x00, 0x0c, 0x6f, 0x01, 0x00, + 0x38, 0xc9, 0x08, 0x00, 0x38, 0xfb, 0x05, 0x00, 0x90, 0x01, 0x00, 0x00, + 0x74, 0x54, 0x01, 0x00, 0x70, 0x52, 0x01, 0x00, 0x54, 0xc9, 0x08, 0x00, + 0xb4, 0x55, 0x01, 0x00, 0x3c, 0xc9, 0x08, 0x00, 0x34, 0xc9, 0x08, 0x00, + 0x4c, 0xc9, 0x08, 0x00, 0x58, 0xc9, 0x08, 0x00, 0xf8, 0xc8, 0x08, 0x00, + 0xa8, 0xa0, 0x08, 0x00, 0xfc, 0x73, 0x01, 0x00, 0xe8, 0xa0, 0x08, 0x00, + 0x14, 0xd9, 0x08, 0x00, 0xd4, 0xa0, 0x08, 0x00, 0xfc, 0xff, 0xff, 0x0f, + 0x64, 0x54, 0x01, 0x00, 0x18, 0x74, 0x01, 0x00, 0xbc, 0xa0, 0x08, 0x00, + 0xfe, 0xb5, 0xe4, 0x4c, 0xe4, 0x4d, 0x20, 0x78, 0xc0, 0xeb, 0x40, 0x10, + 0x05, 0xeb, 0xc0, 0x00, 0xb0, 0xf8, 0xdc, 0x10, 0x01, 0xf0, 0x69, 0x01, + 0x09, 0x29, 0x4d, 0xd1, 0x27, 0x4a, 0x90, 0xf8, 0xba, 0x10, 0x12, 0x78, + 0x91, 0x42, 0x47, 0xd2, 0x25, 0x4a, 0x90, 0xf8, 0xb0, 0x00, 0x12, 0xf8, + 0x11, 0x30, 0x98, 0x42, 0x40, 0xd3, 0x02, 0xeb, 0x41, 0x01, 0x49, 0x78, + 0x88, 0x42, 0x3b, 0xd8, 0x20, 0x48, 0x00, 0x68, 0x80, 0x47, 0xb8, 0xb3, + 0x20, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x05, 0xeb, 0xc0, 0x01, 0x91, 0xf8, + 0xba, 0x00, 0x07, 0x28, 0x2e, 0xd1, 0x91, 0xf8, 0x54, 0x00, 0x80, 0x07, + 0x70, 0x48, 0x00, 0xf1, 0x02, 0x04, 0x0b, 0xd4, 0x22, 0x78, 0x12, 0x07, + 0x08, 0xd5, 0x16, 0x4a, 0x23, 0x7c, 0x15, 0x79, 0x9d, 0x42, 0x1f, 0xd1, + 0x63, 0x7c, 0x52, 0x79, 0x9a, 0x42, 0x1b, 0xd1, 0x01, 0x22, 0x81, 0xf8, + 0x91, 0x20, 0x94, 0xf8, 0x2c, 0x10, 0xa9, 0xb1, 0xe1, 0x8c, 0x99, 0xb1, + 0xda, 0x4d, 0x01, 0x6a, 0x94, 0xf8, 0x28, 0x30, 0xd4, 0xf8, 0x1a, 0x00, + 0xd4, 0xf8, 0x22, 0x20, 0x94, 0xf8, 0x2b, 0x60, 0xdf, 0xf8, 0x24, 0xc0, + 0x72, 0x27, 0x2d, 0x68, 0x8d, 0xe8, 0xc0, 0x10, 0xa8, 0x47, 0x08, 0xb9, + 0x00, 0x20, 0xe0, 0x84, 0x00, 0x20, 0xfe, 0xbd, 0x96, 0x53, 0x01, 0x00, + 0x1e, 0xcd, 0x08, 0x10, 0x50, 0xc9, 0x08, 0x00, 0x94, 0x57, 0x01, 0x00, + 0xb4, 0x55, 0x01, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0xd1, 0xf9, 0xaf, 0x48, + 0x04, 0x49, 0x5c, 0x22, 0x00, 0x78, 0x10, 0xfb, 0x02, 0x10, 0x03, 0x49, + 0x81, 0x62, 0x01, 0x20, 0x80, 0xbd, 0x00, 0xbf, 0x44, 0x4f, 0x01, 0x00, + 0x09, 0x06, 0x04, 0x00, 0x10, 0xb5, 0x2d, 0x48, 0x18, 0x4c, 0x41, 0x6a, + 0x01, 0x31, 0x41, 0x62, 0x15, 0x48, 0x90, 0xf8, 0x20, 0x10, 0x01, 0x29, + 0x04, 0xbf, 0x00, 0x21, 0x80, 0xf8, 0x21, 0x10, 0x20, 0x68, 0x01, 0x01, + 0x0b, 0xd4, 0x12, 0x49, 0x12, 0x4a, 0x91, 0xf8, 0xec, 0x10, 0x92, 0x7f, + 0x8a, 0x42, 0x04, 0xd1, 0xe0, 0xf7, 0xec, 0xfc, 0x0f, 0x49, 0x08, 0x60, + 0x20, 0x68, 0x00, 0x01, 0x5c, 0xbf, 0x01, 0x20, 0x10, 0xbd, 0x0d, 0x48, + 0x04, 0x22, 0x81, 0x7c, 0x41, 0xf0, 0x02, 0x01, 0x81, 0x74, 0xc1, 0x68, + 0x62, 0xf3, 0x03, 0x01, 0xc1, 0x60, 0x17, 0x48, 0x41, 0x8a, 0x01, 0x31, + 0x41, 0x82, 0x00, 0x20, 0x10, 0xbd, 0x00, 0xbf, 0x8c, 0xe6, 0x05, 0x00, + 0x40, 0x36, 0x01, 0x00, 0x04, 0x31, 0x06, 0x00, 0xfc, 0x20, 0x01, 0x00, + 0x78, 0xd3, 0x05, 0x00, 0x78, 0xe6, 0x05, 0x00, 0xb0, 0xb5, 0x0d, 0x4c, + 0xe5, 0x68, 0x00, 0xf0, 0x85, 0xf9, 0xe1, 0x68, 0x8d, 0x42, 0x03, 0xd0, + 0x0a, 0x49, 0x8a, 0x6a, 0x01, 0x32, 0x8a, 0x62, 0xb0, 0xbd, 0x00, 0xbf, + 0xb0, 0xb5, 0x06, 0x4c, 0xe5, 0x68, 0x00, 0xf0, 0x7d, 0xf9, 0xe1, 0x68, + 0x8d, 0x42, 0x03, 0xd0, 0x03, 0x49, 0x8a, 0x6a, 0x01, 0x32, 0x8a, 0x62, + 0xb0, 0xbd, 0x00, 0xbf, 0x38, 0x7a, 0x01, 0x00, 0x84, 0xf0, 0x05, 0x00, + 0x2d, 0xe9, 0xff, 0x47, 0x13, 0x4c, 0x07, 0x46, 0xdd, 0xf8, 0x38, 0x90, + 0x98, 0x46, 0x15, 0x46, 0x0e, 0x46, 0x72, 0xb6, 0x20, 0x68, 0x40, 0x00, + 0x01, 0x30, 0x20, 0x60, 0xdd, 0xe9, 0x0c, 0x0a, 0x02, 0x28, 0x04, 0xd3, + 0x04, 0x28, 0x02, 0xd8, 0x0b, 0x48, 0x00, 0x68, 0x80, 0x47, 0xcd, 0xe9, + 0x00, 0x0a, 0x38, 0x46, 0x31, 0x46, 0x2a, 0x46, 0x43, 0x46, 0xcd, 0xf8, + 0x08, 0x90, 0x00, 0xf0, 0x55, 0xf9, 0x21, 0x68, 0x49, 0x08, 0x21, 0x60, + 0x21, 0x68, 0x81, 0xf3, 0x10, 0x88, 0x04, 0xb0, 0xbd, 0xe8, 0xf0, 0x87, + 0x24, 0x36, 0x01, 0x00, 0x10, 0x9c, 0x08, 0x00, 0xb0, 0xb5, 0x05, 0x4c, + 0xa5, 0x78, 0x6d, 0x06, 0x44, 0xbf, 0x94, 0xf8, 0x58, 0x40, 0x84, 0x70, + 0xbd, 0xe8, 0xb0, 0x40, 0x00, 0xf0, 0x42, 0xb9, 0x74, 0x54, 0x01, 0x00, + 0x70, 0xb5, 0x85, 0x79, 0x00, 0x24, 0x80, 0x2d, 0x07, 0xd1, 0x7f, 0x25, + 0x85, 0x71, 0x3f, 0x4d, 0xb5, 0xf8, 0x58, 0x60, 0xa5, 0xf8, 0x58, 0x40, + 0x34, 0x46, 0x54, 0x4d, 0x54, 0x4e, 0x2d, 0x78, 0xc5, 0xeb, 0x45, 0x15, + 0x06, 0xeb, 0xc5, 0x05, 0x2d, 0x69, 0x2d, 0x7f, 0x7b, 0x2d, 0x02, 0xd1, + 0x05, 0x68, 0x7f, 0x26, 0xae, 0x70, 0x00, 0xf0, 0x29, 0xf9, 0x14, 0xb1, + 0x33, 0x49, 0xa1, 0xf8, 0x58, 0x40, 0x70, 0xbd, 0x70, 0xb5, 0x84, 0x79, + 0x80, 0x2c, 0x0d, 0xd1, 0x7f, 0x24, 0x00, 0x26, 0x84, 0x71, 0x2e, 0x4c, + 0xb4, 0xf8, 0x58, 0x50, 0xa4, 0xf8, 0x58, 0x60, 0x00, 0xf0, 0x1c, 0xf9, + 0x0d, 0xb1, 0xa4, 0xf8, 0x58, 0x50, 0x70, 0xbd, 0xbd, 0xe8, 0x70, 0x40, + 0x00, 0xf0, 0x14, 0xb9, 0x7c, 0xb5, 0x25, 0x4a, 0x01, 0x69, 0x12, 0x68, + 0x8a, 0x42, 0x03, 0xd0, 0xbd, 0xe8, 0x7c, 0x40, 0x00, 0xf0, 0x10, 0xb9, + 0x21, 0x49, 0xd1, 0xf8, 0xac, 0x40, 0x64, 0xb3, 0x91, 0xf8, 0x3c, 0x10, + 0x01, 0xf0, 0x82, 0x01, 0x82, 0x29, 0xf1, 0xd0, 0x34, 0x4d, 0x35, 0x4e, + 0x06, 0x21, 0x06, 0x23, 0x28, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x06, 0xeb, + 0xc0, 0x00, 0xd0, 0xf8, 0xb4, 0x20, 0x04, 0xf5, 0x80, 0x70, 0xe0, 0xf7, + 0x17, 0xfc, 0x28, 0x78, 0x15, 0x49, 0x00, 0x25, 0xc0, 0xeb, 0x40, 0x10, + 0x0b, 0x68, 0x14, 0x49, 0x06, 0xeb, 0xc0, 0x00, 0x90, 0xf8, 0xb8, 0x00, + 0x09, 0x78, 0x84, 0xf8, 0x2c, 0x03, 0x94, 0xf8, 0x35, 0x01, 0xc9, 0x07, + 0x06, 0xd1, 0x04, 0x21, 0x00, 0x22, 0x98, 0x47, 0x0d, 0x48, 0x06, 0x21, + 0x05, 0xe0, 0x7c, 0xbd, 0x0d, 0x21, 0x00, 0x22, 0x98, 0x47, 0x0a, 0x48, + 0x0f, 0x21, 0x06, 0x68, 0x94, 0xf8, 0x35, 0x01, 0xcd, 0xe9, 0x00, 0x05, + 0x00, 0x20, 0x00, 0x22, 0x00, 0x23, 0xb0, 0x47, 0x7c, 0xbd, 0x00, 0xbf, + 0x54, 0xd3, 0x08, 0x00, 0x90, 0x01, 0x00, 0x00, 0xfc, 0xa0, 0x08, 0x00, + 0x99, 0x53, 0x01, 0x00, 0x14, 0x99, 0x08, 0x00, 0x80, 0xb5, 0x00, 0xf0, + 0xc7, 0xf8, 0x12, 0x49, 0x12, 0x4a, 0x09, 0x78, 0xc1, 0xeb, 0x41, 0x11, + 0x02, 0xeb, 0xc1, 0x02, 0x10, 0x49, 0x92, 0xf8, 0x91, 0x30, 0x1c, 0x31, + 0x01, 0x2b, 0x03, 0xd1, 0xca, 0x88, 0x01, 0x32, 0xca, 0x80, 0x80, 0xbd, + 0xb2, 0xf8, 0xdc, 0x20, 0xd3, 0x07, 0x03, 0xd1, 0x0a, 0x88, 0x01, 0x32, + 0x0a, 0x80, 0x80, 0xbd, 0x02, 0xf0, 0x69, 0x02, 0x09, 0x2a, 0x1d, 0xbf, + 0x4a, 0x88, 0x01, 0x32, 0x4a, 0x80, 0x8a, 0x88, 0x04, 0xbf, 0x01, 0x32, + 0x8a, 0x80, 0x80, 0xbd, 0x74, 0x87, 0x08, 0x00, 0x0c, 0x6f, 0x01, 0x00, + 0x38, 0xfb, 0x05, 0x00, 0x10, 0x48, 0x11, 0x49, 0x01, 0x60, 0x11, 0x48, + 0x11, 0x49, 0x01, 0x60, 0x11, 0x48, 0x12, 0x49, 0x01, 0x60, 0x12, 0x48, + 0x12, 0x49, 0x01, 0x60, 0x12, 0x48, 0x13, 0x49, 0x01, 0x60, 0x13, 0x48, + 0x13, 0x49, 0x01, 0x60, 0x13, 0x48, 0x14, 0x49, 0x01, 0x60, 0x14, 0x48, + 0x14, 0x49, 0x01, 0x60, 0x14, 0x48, 0x15, 0x49, 0x01, 0x60, 0x15, 0x48, + 0x15, 0x49, 0x01, 0x60, 0x15, 0x48, 0x16, 0x49, 0x01, 0x60, 0x70, 0x47, + 0x68, 0xba, 0x08, 0x00, 0x18, 0x0a, 0x04, 0x00, 0x6c, 0xba, 0x08, 0x00, + 0xf8, 0x09, 0x04, 0x00, 0x20, 0xd3, 0x08, 0x00, 0x38, 0x0a, 0x04, 0x00, + 0x54, 0xc9, 0x08, 0x00, 0xc5, 0x06, 0x04, 0x00, 0xdc, 0xd2, 0x08, 0x00, + 0x21, 0x07, 0x04, 0x00, 0xec, 0xb7, 0x08, 0x00, 0x3d, 0x07, 0x04, 0x00, + 0xe8, 0xb7, 0x08, 0x00, 0x81, 0x07, 0x04, 0x00, 0x40, 0xd3, 0x08, 0x00, + 0x58, 0x0a, 0x04, 0x00, 0x00, 0xca, 0x08, 0x00, 0xad, 0x07, 0x04, 0x00, + 0x04, 0xca, 0x08, 0x00, 0x78, 0x0a, 0x04, 0x00, 0x74, 0xba, 0x08, 0x00, + 0x98, 0x0a, 0x04, 0x00, 0x4c, 0xf6, 0x5b, 0x2c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4c, 0xf6, 0x1b, 0x6c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4c, 0xf6, 0x63, 0x4c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4d, 0xf2, 0x11, 0x1c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4f, 0xf2, 0x73, 0x7c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4d, 0xf2, 0xfd, 0x6c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4d, 0xf6, 0x11, 0x0c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4f, 0xf2, 0x63, 0x1c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4c, 0xf6, 0xd7, 0x6c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4f, 0xf2, 0x11, 0x4c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x40, 0xf2, 0xcb, 0x0c, 0xc1, 0xf2, 0x0a, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4d, 0xf2, 0x19, 0x4c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4d, 0xf6, 0x5b, 0x4c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4e, 0xf2, 0x09, 0x0c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x71, 0xc4, 0x09, 0x10, 0x89, 0xc5, 0x09, 0x10, + 0xad, 0xfb, 0x03, 0x00, 0x25, 0xc6, 0x09, 0x10, 0xb5, 0xfc, 0x03, 0x00, + 0x2b, 0xd0, 0x09, 0x10, 0x65, 0x00, 0x04, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x71, 0xc4, 0x09, 0x10, 0xe5, 0x05, 0x04, 0x00, 0x3f, 0xd7, 0x09, 0x10, + 0x43, 0xd7, 0x09, 0x10, 0x85, 0x06, 0x04, 0x00, 0xeb, 0xd8, 0x09, 0x10, + 0x65, 0x00, 0x04, 0x00, 0x61, 0x00, 0x00, 0x00, 0x09, 0xf7, 0x09, 0x10, + 0x13, 0xf1, 0x08, 0x10, 0x8d, 0x01, 0x04, 0x00, 0xf1, 0x01, 0x04, 0x00, + 0x49, 0x02, 0x04, 0x00, 0x2b, 0xd0, 0x09, 0x10, 0xe9, 0x70, 0x0f, 0x10, + 0xa1, 0x00, 0x00, 0x00, 0x71, 0xc4, 0x09, 0x10, 0x89, 0xc5, 0x09, 0x10, + 0x37, 0xe5, 0x09, 0x10, 0x87, 0xe5, 0x09, 0x10, 0x15, 0x05, 0x04, 0x00, + 0xa3, 0xf6, 0x09, 0x10, 0xe7, 0xe0, 0x09, 0x10, 0x7a, 0x00, 0x00, 0x00, + 0x71, 0xc4, 0x09, 0x10, 0xfd, 0xde, 0x09, 0x10, 0xbb, 0xdf, 0x09, 0x10, + 0xbf, 0xdf, 0x09, 0x10, 0x59, 0x08, 0x04, 0x00, 0xd3, 0xdb, 0x09, 0x10, + 0xe7, 0xe0, 0x09, 0x10, 0x7c, 0x00, 0x00, 0x00, 0x71, 0xc4, 0x09, 0x10, + 0xfd, 0xd6, 0x09, 0x10, 0x3f, 0xd7, 0x09, 0x10, 0x43, 0xd7, 0x09, 0x10, + 0xa1, 0x06, 0x04, 0x00, 0x8f, 0xf2, 0x09, 0x10, 0xe7, 0xe0, 0x09, 0x10, + 0x79, 0x00, 0x00, 0x00, 0xb0, 0xb5, 0x15, 0x4d, 0x04, 0x46, 0x28, 0x88, + 0x28, 0xb3, 0xa9, 0x48, 0x94, 0xf8, 0x1d, 0x11, 0xc1, 0xeb, 0x01, 0x11, + 0x00, 0x68, 0x49, 0x01, 0x40, 0x5c, 0x02, 0x28, 0x1b, 0xd0, 0x0f, 0x48, + 0x00, 0x68, 0x80, 0x47, 0xd4, 0xf8, 0xf4, 0x10, 0x40, 0x1a, 0x29, 0x88, + 0x20, 0xf0, 0x70, 0x40, 0x00, 0xeb, 0x80, 0x00, 0x40, 0x00, 0xb1, 0xeb, + 0x50, 0x1f, 0x0c, 0xd2, 0x20, 0x6c, 0x94, 0xf8, 0x46, 0x11, 0x40, 0xf4, + 0x80, 0x10, 0x20, 0x64, 0x94, 0xf8, 0x50, 0x01, 0x81, 0x42, 0x38, 0xbf, + 0x01, 0x46, 0x84, 0xf8, 0xf8, 0x11, 0xb0, 0xbd, 0x7c, 0xd3, 0x05, 0x00, + 0xe0, 0xa0, 0x08, 0x00, 0x42, 0x78, 0x03, 0x89, 0x1a, 0x44, 0x01, 0x3a, + 0x8a, 0x42, 0x1c, 0xbf, 0x00, 0x20, 0x70, 0x47, 0x00, 0x78, 0x00, 0x28, + 0x18, 0xbf, 0x01, 0x20, 0x70, 0x47, 0x00, 0xbf, 0x2d, 0xe9, 0xf0, 0x41, + 0x88, 0x46, 0x01, 0x78, 0x09, 0xb1, 0xbd, 0xe8, 0xf0, 0x81, 0xd0, 0xf8, + 0xa4, 0x40, 0x14, 0xb3, 0x94, 0xf8, 0x20, 0x51, 0x04, 0xf5, 0xa3, 0x77, + 0x38, 0x46, 0x29, 0x46, 0x00, 0xf0, 0x2e, 0xf8, 0x00, 0x28, 0xf0, 0xd1, + 0xb4, 0xf8, 0x74, 0x61, 0x38, 0x46, 0x31, 0x46, 0xff, 0xf7, 0xd8, 0xff, + 0x00, 0x28, 0xe8, 0xd1, 0x04, 0xf5, 0xa8, 0x77, 0x29, 0x46, 0x38, 0x46, + 0x00, 0xf0, 0x1e, 0xf8, 0x00, 0x28, 0xe0, 0xd1, 0x38, 0x46, 0x31, 0x46, + 0xff, 0xf7, 0xca, 0xff, 0x00, 0x28, 0xda, 0xd1, 0x54, 0xf8, 0x04, 0x4c, + 0xdb, 0xe7, 0x08, 0x49, 0x98, 0xf8, 0x12, 0x00, 0x91, 0xf8, 0x69, 0x23, + 0x91, 0xf8, 0x83, 0x13, 0x91, 0x42, 0x38, 0xbf, 0x0a, 0x46, 0x82, 0x42, + 0x98, 0xbf, 0x50, 0x1e, 0x88, 0xf8, 0x12, 0x00, 0xbd, 0xe8, 0xf0, 0x81, + 0x8c, 0x7e, 0x08, 0x00, 0x03, 0x78, 0x02, 0x46, 0x00, 0x20, 0x3b, 0xb1, + 0x53, 0x78, 0x52, 0x79, 0x01, 0x3b, 0x13, 0xfb, 0x01, 0x21, 0x0a, 0x29, + 0xb8, 0xbf, 0x01, 0x20, 0x70, 0x47, 0x00, 0xbf, 0x2d, 0xe9, 0xf0, 0x4f, + 0x85, 0xb0, 0x81, 0x46, 0x63, 0x48, 0x00, 0x68, 0x98, 0xb1, 0x99, 0xf8, + 0x04, 0x10, 0xc1, 0xeb, 0x01, 0x11, 0x00, 0xeb, 0x41, 0x15, 0x60, 0x49, + 0x05, 0xf1, 0xd4, 0x00, 0x09, 0x68, 0x88, 0x47, 0xd5, 0xf8, 0xa0, 0x00, + 0x40, 0x7f, 0x40, 0xb1, 0x28, 0x46, 0x49, 0x46, 0x00, 0xf0, 0x82, 0xfe, + 0x07, 0xe0, 0x48, 0x46, 0xee, 0xf7, 0x5c, 0xf8, 0x1d, 0xe0, 0x28, 0x46, + 0x49, 0x46, 0x00, 0xf0, 0x7f, 0xfe, 0x56, 0x48, 0x01, 0x68, 0x28, 0x46, + 0x88, 0x47, 0xab, 0x46, 0x1b, 0xf8, 0xc1, 0x0f, 0xa8, 0xb1, 0x55, 0x49, + 0x68, 0x78, 0x49, 0x68, 0xc0, 0xeb, 0xc0, 0x00, 0x01, 0xeb, 0x80, 0x00, + 0x10, 0xf8, 0x0c, 0x1f, 0x01, 0x29, 0x06, 0xd1, 0x00, 0x21, 0x01, 0x70, + 0x53, 0x48, 0x07, 0x21, 0x00, 0x78, 0xe0, 0xf7, 0xf1, 0xf9, 0x00, 0x20, + 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x28, 0x46, 0x50, 0xf8, 0xa4, 0x6f, + 0x00, 0x2e, 0xe4, 0xd0, 0x01, 0x90, 0xe8, 0x1c, 0x05, 0xf1, 0xc0, 0x0a, + 0x4f, 0xf0, 0x00, 0x08, 0x04, 0x90, 0x68, 0x1c, 0x03, 0x90, 0x00, 0x20, + 0x02, 0x90, 0x40, 0x49, 0x96, 0xf8, 0x44, 0x00, 0x0f, 0x68, 0x29, 0x78, + 0x02, 0x29, 0x06, 0xd3, 0x3d, 0x4b, 0x49, 0x46, 0x07, 0x22, 0xb8, 0x47, + 0x96, 0xf8, 0x20, 0x71, 0x21, 0xe0, 0x3a, 0x4b, 0x49, 0x46, 0x06, 0x22, + 0xb8, 0x47, 0x03, 0x99, 0x38, 0x48, 0x09, 0x78, 0x40, 0x68, 0xc1, 0xeb, + 0xc1, 0x01, 0x00, 0xeb, 0x81, 0x00, 0xd0, 0xe9, 0x04, 0x10, 0x81, 0x42, + 0x38, 0xbf, 0x01, 0x46, 0x96, 0xf8, 0x50, 0x01, 0x96, 0xf8, 0xcc, 0x71, + 0x87, 0x42, 0x38, 0xbf, 0x07, 0x46, 0x1f, 0x29, 0x03, 0xd3, 0x30, 0x46, + 0x00, 0xf0, 0x66, 0xf8, 0x03, 0xe0, 0x2d, 0x48, 0x01, 0x68, 0x30, 0x46, + 0x88, 0x47, 0x04, 0x98, 0x2b, 0x49, 0x5f, 0xfa, 0x88, 0xf2, 0x03, 0x78, + 0x9a, 0xf8, 0x00, 0x00, 0x0c, 0x68, 0x39, 0x46, 0x00, 0x96, 0xa0, 0x47, + 0xd6, 0xf8, 0xa0, 0x11, 0x81, 0x42, 0x0f, 0xd0, 0x96, 0xf8, 0x44, 0x10, + 0x24, 0x4a, 0x01, 0xeb, 0xc1, 0x01, 0x02, 0xeb, 0x41, 0x01, 0x91, 0xf9, + 0x08, 0x10, 0xb1, 0xf1, 0xff, 0x3f, 0x03, 0xdc, 0xc6, 0xf8, 0xa0, 0x01, + 0x01, 0x20, 0x02, 0x90, 0x9b, 0xf8, 0x00, 0x00, 0x18, 0xb9, 0x30, 0x46, + 0x00, 0x21, 0x00, 0xf0, 0xeb, 0xf8, 0x56, 0xf8, 0x04, 0x6c, 0x08, 0xf1, + 0x01, 0x08, 0x00, 0x2e, 0xa3, 0xd1, 0x02, 0x98, 0x00, 0x28, 0x01, 0x98, + 0x3f, 0xf4, 0x79, 0xaf, 0x04, 0x68, 0x00, 0x2c, 0x3f, 0xf4, 0x75, 0xaf, + 0xdf, 0xf8, 0x4c, 0x80, 0x00, 0x26, 0xd4, 0xf8, 0xa0, 0x31, 0xd9, 0xf8, + 0x00, 0x10, 0x94, 0xf8, 0x44, 0x00, 0xf2, 0xb2, 0xd8, 0xf8, 0x00, 0x70, + 0x00, 0x92, 0x01, 0x22, 0xb8, 0x47, 0x54, 0xf8, 0x04, 0x4c, 0x01, 0x36, + 0x00, 0x2c, 0xee, 0xd1, 0x5f, 0xe7, 0x00, 0xbf, 0xe0, 0x35, 0x01, 0x00, + 0x50, 0xd2, 0x08, 0x00, 0x98, 0xb6, 0x08, 0x00, 0x6c, 0xd2, 0x08, 0x00, + 0xfc, 0x70, 0x01, 0x00, 0xec, 0xe5, 0x05, 0x00, 0x1c, 0xd2, 0x08, 0x00, + 0x70, 0xd2, 0x08, 0x00, 0x44, 0x28, 0x01, 0x00, 0x74, 0xd2, 0x08, 0x00, + 0xa5, 0x58, 0x01, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, 0x90, 0xf8, 0xb0, 0x81, + 0x04, 0x46, 0xe0, 0xf7, 0x39, 0xf9, 0x05, 0x46, 0xd4, 0xf8, 0xa4, 0x01, + 0x01, 0x30, 0x02, 0x28, 0x01, 0xd2, 0xbd, 0xe8, 0xf8, 0x8f, 0x94, 0xf8, + 0x38, 0x02, 0xd4, 0xf8, 0x40, 0x12, 0xb4, 0xf8, 0x74, 0x91, 0x08, 0x44, + 0xa9, 0xeb, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x28, 0xf1, 0xd4, 0xd4, 0xf8, + 0x90, 0x00, 0xd4, 0xf8, 0xa8, 0x11, 0x88, 0x42, 0x2e, 0xbf, 0x46, 0x1a, + 0xc9, 0x43, 0x46, 0x18, 0xd4, 0xf8, 0x50, 0x22, 0x94, 0xf8, 0x7f, 0x10, + 0x8a, 0x42, 0x92, 0xbf, 0x8a, 0x1a, 0xd2, 0x43, 0x0a, 0x44, 0xc4, 0xf8, + 0x50, 0x12, 0xc4, 0xf8, 0xa8, 0x01, 0xd4, 0xf8, 0xac, 0x01, 0x3c, 0x49, + 0x5f, 0xfa, 0x82, 0xfa, 0xa6, 0xeb, 0x0a, 0x0b, 0xe2, 0xf7, 0xc4, 0xfa, + 0x56, 0x45, 0x07, 0x46, 0x38, 0xbf, 0x4f, 0xf0, 0x00, 0x0b, 0x58, 0x46, + 0xe2, 0xf7, 0xc8, 0xfa, 0x01, 0x46, 0x38, 0x46, 0xe2, 0xf7, 0xbe, 0xfa, + 0x4f, 0xf0, 0x78, 0x51, 0xe2, 0xf7, 0xb4, 0xfa, 0x31, 0x49, 0xc4, 0xf8, + 0xac, 0x01, 0xe2, 0xf7, 0xaf, 0xfa, 0x07, 0x46, 0x94, 0xf8, 0xb2, 0x01, + 0xe2, 0xf7, 0xb6, 0xfa, 0x01, 0x46, 0x38, 0x46, 0xe2, 0xf7, 0xb8, 0xfa, + 0xe9, 0xf7, 0x52, 0xfd, 0xd4, 0xf8, 0x4c, 0x12, 0x4f, 0xf0, 0x00, 0x0c, + 0x00, 0x22, 0x81, 0x42, 0x82, 0xbf, 0xc1, 0xeb, 0xc1, 0x01, 0x08, 0x44, + 0xc0, 0x08, 0x94, 0xf8, 0x47, 0x31, 0x02, 0x2b, 0x18, 0xd3, 0xb4, 0xf8, + 0x3a, 0x22, 0xa2, 0xb1, 0x94, 0xf8, 0x20, 0xe1, 0x94, 0xf8, 0x4c, 0x71, + 0x59, 0x1e, 0x02, 0x26, 0x11, 0xfb, 0x0e, 0x71, 0x91, 0xfb, 0xf6, 0xf1, + 0x91, 0x42, 0x08, 0xdd, 0x1e, 0xfb, 0x03, 0xf3, 0x89, 0x1a, 0x64, 0x22, + 0xdb, 0x1b, 0x51, 0x43, 0xb1, 0xfb, 0xf3, 0xf2, 0x00, 0xe0, 0x00, 0x22, + 0x94, 0xf8, 0x20, 0x31, 0x64, 0x27, 0x11, 0x18, 0xc4, 0xf8, 0xa4, 0x51, + 0x94, 0xf8, 0xb1, 0x51, 0xc4, 0xf8, 0x40, 0x92, 0xa4, 0xf8, 0x3a, 0xc2, + 0xc4, 0xf8, 0x4c, 0x12, 0x9e, 0x00, 0xb7, 0xfb, 0xf3, 0xf3, 0xb7, 0xfb, + 0xf6, 0xf6, 0x31, 0x44, 0xb1, 0xfb, 0xf3, 0xf1, 0xa9, 0x42, 0x38, 0xbf, + 0x0d, 0x46, 0xe9, 0xb2, 0x84, 0xf8, 0xb0, 0x51, 0x88, 0x45, 0x3f, 0xf4, + 0x6c, 0xaf, 0x4b, 0xea, 0x0a, 0x61, 0x41, 0xea, 0x00, 0x20, 0x40, 0xea, + 0x02, 0x41, 0x20, 0x46, 0xbd, 0xe8, 0xf8, 0x4f, 0x0f, 0xf0, 0xd6, 0xbf, + 0x00, 0x00, 0xe0, 0x40, 0x00, 0x00, 0xc8, 0x42, 0xf8, 0xb5, 0x00, 0x22, + 0xad, 0xf8, 0x00, 0x20, 0xd0, 0xf8, 0x24, 0x22, 0x1a, 0xb9, 0xd0, 0xf8, + 0x20, 0x22, 0x00, 0x2a, 0x4c, 0xd0, 0x90, 0xf8, 0x2b, 0x42, 0x90, 0xf8, + 0x2a, 0x62, 0xb0, 0xf8, 0x28, 0x72, 0xb0, 0xf8, 0x74, 0x21, 0x90, 0xf8, + 0x20, 0xc1, 0x90, 0xf8, 0x2d, 0x52, 0x63, 0x18, 0xd7, 0x1b, 0x80, 0xf8, + 0x2c, 0x42, 0x9b, 0x1b, 0x0c, 0xfb, 0x07, 0x33, 0xdb, 0xb2, 0xb3, 0xfb, + 0xf5, 0xf6, 0x06, 0xfb, 0x15, 0x33, 0x9c, 0x42, 0x2e, 0xd0, 0x01, 0x22, + 0xdb, 0xb2, 0x52, 0xfa, 0x84, 0xf4, 0xed, 0xb2, 0xb4, 0xfb, 0xf5, 0xf6, + 0x06, 0xfb, 0x15, 0x45, 0xd0, 0xf8, 0x20, 0x42, 0x80, 0xf8, 0x2b, 0x52, + 0x4c, 0xb1, 0x9d, 0xf8, 0x00, 0x60, 0xad, 0xb2, 0x9d, 0xf8, 0x01, 0x70, + 0x04, 0xf8, 0x15, 0x60, 0x04, 0xeb, 0x45, 0x04, 0x67, 0x70, 0xd0, 0xf8, + 0x24, 0x42, 0x54, 0xb1, 0x90, 0xf8, 0x2b, 0x52, 0x9d, 0xf8, 0x00, 0x60, + 0x9d, 0xf8, 0x01, 0x70, 0x04, 0xf8, 0x15, 0x60, 0x04, 0xeb, 0x45, 0x04, + 0x67, 0x70, 0x90, 0xf8, 0x2b, 0x42, 0x9c, 0x42, 0x02, 0xd0, 0x90, 0xf8, + 0x2d, 0x52, 0xd4, 0xe7, 0xb0, 0xf8, 0x74, 0x21, 0x80, 0xf8, 0x2a, 0x12, + 0xa0, 0xf8, 0x28, 0x22, 0xf8, 0xbd, 0xb0, 0xb5, 0x60, 0xb1, 0x04, 0x46, + 0xd0, 0xf8, 0x3c, 0x01, 0x40, 0xb1, 0x45, 0x6a, 0x20, 0x46, 0x00, 0xf0, + 0xb3, 0xfc, 0x1d, 0xb1, 0xd4, 0xf8, 0x3c, 0x01, 0x40, 0x6a, 0x00, 0xb1, + 0xb0, 0xbd, 0x20, 0x46, 0x02, 0x21, 0xbd, 0xe8, 0xb0, 0x40, 0xe1, 0xf7, + 0x29, 0xbc, 0x00, 0xbf, 0xf8, 0xb5, 0x04, 0x46, 0x3e, 0x48, 0x06, 0x68, + 0xd6, 0xb1, 0x25, 0x79, 0x20, 0x46, 0x00, 0xf0, 0xa3, 0xfc, 0xc5, 0xeb, + 0x05, 0x17, 0x21, 0x46, 0x06, 0xeb, 0x47, 0x15, 0x28, 0x46, 0xff, 0xf7, + 0x9f, 0xfd, 0x78, 0x01, 0x30, 0x5c, 0x02, 0x28, 0x0a, 0xd1, 0xd5, 0xf8, + 0x3c, 0x01, 0x38, 0xb1, 0x04, 0x48, 0xa1, 0x7c, 0x90, 0xf8, 0x98, 0x03, + 0x81, 0x42, 0x38, 0xbf, 0x01, 0x46, 0xa1, 0x74, 0xf8, 0xbd, 0x00, 0xbf, + 0x8c, 0x7e, 0x08, 0x00, 0x2d, 0xe9, 0xff, 0x41, 0xdf, 0xf8, 0xb0, 0x80, + 0xd8, 0xf8, 0x00, 0x70, 0x00, 0x2f, 0x48, 0xd0, 0x06, 0x79, 0x05, 0x46, + 0x00, 0xf0, 0x82, 0xfc, 0x04, 0x46, 0x01, 0x28, 0x1b, 0xd1, 0x27, 0x48, + 0x01, 0x21, 0x01, 0x70, 0x28, 0x7d, 0x8d, 0xf8, 0x0c, 0x00, 0xc6, 0xeb, + 0x06, 0x10, 0x07, 0xeb, 0x40, 0x10, 0x81, 0x78, 0x90, 0xf8, 0xc1, 0x20, + 0xd0, 0xf8, 0xb0, 0x00, 0xb0, 0xf8, 0x74, 0x01, 0x42, 0xea, 0x41, 0x11, + 0x8d, 0xf8, 0x0d, 0x10, 0x03, 0xa9, 0xad, 0xf8, 0x0e, 0x00, 0x1c, 0x48, + 0x02, 0x68, 0x1f, 0x20, 0x90, 0x47, 0x1b, 0x48, 0xc1, 0x7c, 0x41, 0xb3, + 0xc6, 0xeb, 0x06, 0x11, 0x80, 0x7c, 0x07, 0xeb, 0x41, 0x11, 0x89, 0x78, + 0x88, 0x42, 0x20, 0xd1, 0xd8, 0xf8, 0x00, 0x10, 0xc0, 0xeb, 0x00, 0x10, + 0x14, 0x4a, 0x01, 0xeb, 0x40, 0x11, 0x13, 0x68, 0x01, 0xaa, 0x01, 0xf1, + 0xb8, 0x00, 0xc9, 0x68, 0x09, 0x01, 0x98, 0x47, 0x01, 0x99, 0x40, 0xf2, + 0x71, 0x20, 0x48, 0x43, 0xbd, 0xf8, 0x08, 0x10, 0x40, 0x08, 0x00, 0xeb, + 0x11, 0x10, 0x81, 0x21, 0xe5, 0xf7, 0x98, 0xfc, 0x05, 0xe0, 0x00, 0x20, + 0x4f, 0xf4, 0xb2, 0x71, 0x00, 0x24, 0xe5, 0xf7, 0xfb, 0xfd, 0x20, 0x46, + 0x04, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0xbf, 0xe0, 0x35, 0x01, 0x00, + 0x60, 0xd4, 0x05, 0x00, 0x1c, 0xa1, 0x08, 0x00, 0x34, 0xdc, 0x05, 0x00, + 0x5c, 0xa1, 0x08, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, 0x81, 0x46, 0x48, 0x48, + 0xd9, 0xf8, 0x04, 0xb0, 0x04, 0x68, 0x48, 0x46, 0x9b, 0xf8, 0x1d, 0x51, + 0xed, 0xf7, 0xe2, 0xfd, 0xc5, 0xeb, 0x05, 0x10, 0x04, 0xeb, 0x40, 0x1a, + 0x40, 0x01, 0x20, 0x5c, 0xd0, 0x46, 0x02, 0x28, 0x13, 0xd3, 0x56, 0x46, + 0x56, 0xf8, 0xa4, 0x7f, 0x00, 0x2f, 0x4c, 0xd0, 0x3d, 0x4d, 0x00, 0x24, + 0x2a, 0x68, 0x30, 0x46, 0x39, 0x46, 0x87, 0xf8, 0x7c, 0x41, 0x90, 0x47, + 0x38, 0x46, 0x00, 0xf0, 0x7d, 0xf8, 0x37, 0x68, 0x00, 0x2f, 0xf3, 0xd1, + 0x3d, 0xe0, 0x9b, 0xf8, 0x7c, 0x01, 0x01, 0x28, 0x0c, 0xd1, 0x50, 0x46, + 0x50, 0xf8, 0xf4, 0x1f, 0x41, 0xb1, 0x59, 0x45, 0x02, 0xd0, 0x51, 0xf8, + 0x04, 0x1c, 0xf9, 0xe7, 0x2f, 0x49, 0x0a, 0x68, 0x59, 0x46, 0x90, 0x47, + 0x57, 0x46, 0x57, 0xf8, 0xb0, 0x0f, 0x58, 0x45, 0x02, 0xd1, 0x5b, 0xf8, + 0x04, 0x0c, 0x38, 0x60, 0x00, 0x20, 0x0a, 0xf1, 0xa4, 0x06, 0x59, 0x46, + 0x8b, 0xf8, 0x7c, 0x01, 0x26, 0x48, 0x02, 0x68, 0x30, 0x46, 0x90, 0x47, + 0x38, 0x68, 0x08, 0xb9, 0x30, 0x68, 0x38, 0x60, 0x23, 0x48, 0x01, 0x68, + 0x40, 0x46, 0x88, 0x47, 0xda, 0xf8, 0x9c, 0x00, 0x21, 0x49, 0x02, 0x8a, + 0x00, 0x20, 0xfd, 0xf7, 0xb1, 0xfe, 0x20, 0x48, 0x9b, 0xf8, 0x1f, 0x21, + 0x59, 0x46, 0x03, 0x68, 0xad, 0x20, 0x98, 0x47, 0x58, 0x46, 0x00, 0xf0, + 0x3d, 0xf8, 0xda, 0xf8, 0xa4, 0x70, 0xdf, 0xb9, 0x98, 0xf8, 0x00, 0x00, + 0x01, 0x28, 0x02, 0xd8, 0xda, 0xf8, 0xf4, 0x00, 0xa0, 0xb9, 0x5a, 0xf8, + 0x9c, 0x6f, 0x56, 0xb1, 0x15, 0x48, 0x01, 0x68, 0x30, 0x46, 0x88, 0x47, + 0x31, 0x7d, 0x00, 0x20, 0x30, 0x61, 0x30, 0x75, 0xca, 0xf8, 0x00, 0x00, + 0xb1, 0x75, 0x0f, 0x48, 0x9b, 0xf8, 0x1f, 0x21, 0x41, 0x46, 0x03, 0x68, + 0xae, 0x20, 0x98, 0x47, 0x99, 0xf8, 0x14, 0x00, 0x69, 0x46, 0x8d, 0xf8, + 0x00, 0x00, 0x9b, 0xf8, 0x44, 0x00, 0x8d, 0xf8, 0x01, 0x00, 0x09, 0x48, + 0x02, 0x68, 0x19, 0x20, 0x90, 0x47, 0x00, 0x20, 0xbd, 0xe8, 0xf8, 0x8f, + 0xe0, 0x35, 0x01, 0x00, 0xe8, 0xa0, 0x08, 0x00, 0x98, 0xb6, 0x08, 0x00, + 0x80, 0x19, 0x04, 0x00, 0xa8, 0xa0, 0x08, 0x00, 0xc8, 0xa0, 0x08, 0x00, + 0xa4, 0xa0, 0x08, 0x00, 0xb0, 0xb5, 0xd0, 0xf8, 0x80, 0x20, 0x15, 0x49, + 0x15, 0x4d, 0x04, 0x46, 0x00, 0x20, 0xa8, 0x47, 0xd4, 0xf8, 0x84, 0x20, + 0x13, 0x49, 0x00, 0x20, 0xa8, 0x47, 0xd4, 0xf8, 0x90, 0x20, 0x12, 0x49, + 0x00, 0x20, 0xa8, 0x47, 0xd4, 0xf8, 0x94, 0x20, 0x10, 0x49, 0x00, 0x20, + 0xa8, 0x47, 0xd4, 0xf8, 0x98, 0x20, 0x0f, 0x49, 0x00, 0x20, 0xa8, 0x47, + 0xd4, 0xf8, 0x9c, 0x20, 0x0d, 0x49, 0x00, 0x20, 0xa8, 0x47, 0xd4, 0xf8, + 0xa0, 0x20, 0x0c, 0x49, 0x00, 0x20, 0xa8, 0x47, 0xe2, 0x6c, 0x0b, 0x49, + 0x00, 0x20, 0x2b, 0x46, 0xbd, 0xe8, 0xb0, 0x40, 0x18, 0x47, 0x00, 0xbf, + 0x91, 0x19, 0x04, 0x00, 0xd1, 0xba, 0x02, 0x10, 0x9f, 0x19, 0x04, 0x00, + 0xad, 0x19, 0x04, 0x00, 0xbb, 0x19, 0x04, 0x00, 0xc9, 0x19, 0x04, 0x00, + 0xd7, 0x19, 0x04, 0x00, 0xe5, 0x19, 0x04, 0x00, 0xf3, 0x19, 0x04, 0x00, + 0xb0, 0xb5, 0x04, 0x46, 0x90, 0xf8, 0x4d, 0x01, 0x94, 0xf8, 0xcc, 0x51, + 0x01, 0x30, 0x84, 0xf8, 0x4d, 0x01, 0xc0, 0xb2, 0xa8, 0x42, 0x27, 0xd3, + 0x00, 0x20, 0x84, 0xf8, 0x4d, 0x01, 0xb4, 0xf8, 0x4e, 0x01, 0x01, 0x30, + 0xa4, 0xf8, 0x4e, 0x01, 0xd4, 0xf8, 0x3c, 0x01, 0xfc, 0xf7, 0x5a, 0xf8, + 0xd0, 0xb1, 0x94, 0xf8, 0x46, 0x01, 0xd4, 0xf8, 0x68, 0x11, 0x52, 0x4a, + 0x40, 0x1b, 0x09, 0x18, 0xc4, 0xf8, 0x68, 0x11, 0xd4, 0xf8, 0x6c, 0x11, + 0x41, 0xeb, 0xe0, 0x70, 0xd4, 0xf8, 0x00, 0x11, 0x00, 0xf0, 0x7f, 0x00, + 0xc4, 0xf8, 0x6c, 0x01, 0xd1, 0xf8, 0xd4, 0x10, 0x49, 0x7f, 0x12, 0xf8, + 0x11, 0x10, 0x08, 0x43, 0xc4, 0xf8, 0x6c, 0x01, 0xd4, 0xe9, 0x5a, 0x12, + 0xd4, 0xf8, 0x00, 0x01, 0x01, 0x31, 0x42, 0xf1, 0x00, 0x02, 0x02, 0xf0, + 0x7f, 0x02, 0xc4, 0xe9, 0x5a, 0x12, 0x94, 0xf8, 0x7d, 0x11, 0xd0, 0xf8, + 0xd4, 0x00, 0x81, 0xf0, 0x01, 0x01, 0x40, 0x7f, 0x84, 0xf8, 0x7d, 0x11, + 0x3c, 0x49, 0x11, 0xf8, 0x10, 0x00, 0x10, 0x43, 0xc4, 0xf8, 0x6c, 0x01, + 0xb0, 0xbd, 0x00, 0xbf, 0xb0, 0xb5, 0x04, 0x46, 0x90, 0xf8, 0x57, 0x01, + 0x94, 0xf8, 0xcd, 0x51, 0x01, 0x30, 0x84, 0xf8, 0x57, 0x01, 0xc0, 0xb2, + 0xa8, 0x42, 0x42, 0xd3, 0x00, 0x20, 0x84, 0xf8, 0x57, 0x01, 0xb4, 0xf8, + 0x58, 0x01, 0x01, 0x30, 0xa4, 0xf8, 0x58, 0x01, 0xd4, 0xf8, 0x3c, 0x01, + 0xfc, 0xf7, 0x0a, 0xf8, 0xa8, 0xb3, 0x94, 0xf8, 0x50, 0x11, 0xd4, 0xf8, + 0x60, 0x21, 0x49, 0x1b, 0x29, 0x4d, 0x52, 0x18, 0xc4, 0xf8, 0x60, 0x21, + 0xd4, 0xf8, 0x64, 0x21, 0x42, 0xeb, 0xe1, 0x71, 0xd4, 0xf8, 0x00, 0x21, + 0x01, 0xf0, 0x7f, 0x01, 0xc4, 0xf8, 0x64, 0x11, 0xd2, 0xf8, 0xd4, 0x30, + 0x5b, 0x7f, 0x05, 0xeb, 0x43, 0x03, 0x5b, 0x78, 0x19, 0x43, 0xc4, 0xf8, + 0x64, 0x11, 0xd2, 0xf8, 0xd4, 0x10, 0x1c, 0x22, 0x49, 0x7f, 0x00, 0x29, + 0x4f, 0xf0, 0x05, 0x01, 0x08, 0xbf, 0x1d, 0x22, 0x80, 0x5c, 0x84, 0xf8, + 0x54, 0x11, 0x94, 0xf8, 0x20, 0x11, 0x84, 0xf8, 0xcd, 0x01, 0xb1, 0xfb, + 0xf0, 0xf2, 0x02, 0xfb, 0x10, 0x10, 0x84, 0xf8, 0x56, 0x21, 0x10, 0x44, + 0x01, 0x38, 0x84, 0xf8, 0x55, 0x01, 0xd4, 0xe9, 0x58, 0x12, 0xd4, 0xf8, + 0x00, 0x01, 0x01, 0x31, 0x42, 0xf1, 0x00, 0x02, 0x02, 0xf0, 0x7f, 0x02, + 0xc4, 0xe9, 0x58, 0x12, 0x94, 0xf8, 0x7e, 0x11, 0xd0, 0xf8, 0xd4, 0x00, + 0x81, 0xf0, 0x01, 0x01, 0x40, 0x7f, 0x84, 0xf8, 0x7e, 0x11, 0xb4, 0xf8, + 0x78, 0x11, 0x41, 0xf0, 0x08, 0x01, 0xa4, 0xf8, 0x78, 0x11, 0x04, 0x49, + 0x01, 0xeb, 0x40, 0x00, 0x40, 0x78, 0x10, 0x43, 0xc4, 0xf8, 0x64, 0x01, + 0xb0, 0xbd, 0x00, 0xbf, 0xf4, 0x31, 0x0a, 0x10, 0x70, 0xb5, 0xd0, 0xf8, + 0xa4, 0x60, 0x0c, 0x46, 0x05, 0x46, 0x5e, 0xb1, 0x30, 0x46, 0xff, 0xf7, + 0x39, 0xfb, 0xb6, 0xf8, 0x78, 0x01, 0x20, 0xf0, 0x80, 0x00, 0xa6, 0xf8, + 0x78, 0x01, 0x56, 0xf8, 0x04, 0x6c, 0xf2, 0xe7, 0x28, 0x46, 0x21, 0x46, + 0xbd, 0xe8, 0x70, 0x40, 0x00, 0xf0, 0x70, 0xba, 0x70, 0xb5, 0xd0, 0xf8, + 0xa4, 0x60, 0x0c, 0x46, 0x05, 0x46, 0x2e, 0xb1, 0x30, 0x46, 0xff, 0xf7, + 0x21, 0xfb, 0x56, 0xf8, 0x04, 0x6c, 0xf8, 0xe7, 0x28, 0x46, 0x21, 0x46, + 0xbd, 0xe8, 0x70, 0x40, 0x00, 0xf0, 0x64, 0xba, 0x2d, 0xe9, 0xf0, 0x4f, + 0x85, 0xb0, 0x83, 0x46, 0x00, 0x20, 0xcd, 0xe9, 0x03, 0x00, 0xdb, 0xf8, + 0x9c, 0x00, 0x00, 0x28, 0x00, 0xf0, 0xef, 0x80, 0x7b, 0x48, 0x91, 0x46, + 0x0c, 0x46, 0xd1, 0xf8, 0x00, 0x71, 0x9a, 0x46, 0x02, 0x68, 0x08, 0x46, + 0x00, 0x21, 0x90, 0x47, 0xd4, 0xe9, 0x49, 0x01, 0xdf, 0xf8, 0xd8, 0x81, + 0x94, 0xf8, 0x20, 0x31, 0x75, 0x4a, 0xcd, 0xe9, 0x00, 0x10, 0x40, 0x46, + 0x78, 0x21, 0xcd, 0xf8, 0x08, 0x90, 0xe2, 0xf7, 0xcf, 0xff, 0xdb, 0x4d, + 0x95, 0xf8, 0x2c, 0x01, 0x80, 0x07, 0x05, 0xd5, 0x6f, 0x48, 0x01, 0x21, + 0x42, 0x46, 0x03, 0x68, 0x02, 0x20, 0x98, 0x47, 0x94, 0xf8, 0x46, 0x01, + 0xb4, 0xf8, 0x48, 0x21, 0x94, 0xf8, 0x47, 0x31, 0x94, 0xf8, 0x4a, 0x11, + 0x8d, 0xe8, 0x07, 0x00, 0x68, 0x4a, 0x40, 0x46, 0x78, 0x21, 0xe2, 0xf7, + 0xb5, 0xff, 0x95, 0xf8, 0x2c, 0x01, 0x80, 0x07, 0x05, 0xd5, 0x63, 0x48, + 0x01, 0x21, 0x42, 0x46, 0x03, 0x68, 0x02, 0x20, 0x98, 0x47, 0x94, 0xf8, + 0x50, 0x01, 0xb4, 0xf8, 0x52, 0x21, 0x94, 0xf8, 0x51, 0x31, 0x94, 0xf8, + 0x54, 0x11, 0x8d, 0xe8, 0x07, 0x00, 0x5d, 0x4a, 0x40, 0x46, 0x78, 0x21, + 0xe2, 0xf7, 0x9c, 0xff, 0x95, 0xf8, 0x2c, 0x01, 0x80, 0x07, 0x05, 0xd5, + 0x56, 0x48, 0x01, 0x21, 0x42, 0x46, 0x03, 0x68, 0x02, 0x20, 0x98, 0x47, + 0x9b, 0xf8, 0x03, 0x00, 0x01, 0x28, 0x08, 0xd1, 0xd4, 0xf8, 0x24, 0x01, + 0x48, 0x45, 0x04, 0xd8, 0x00, 0x20, 0x40, 0xf2, 0xdb, 0x21, 0xdf, 0xf7, + 0x4b, 0xfd, 0xd4, 0xf8, 0x00, 0x01, 0xc4, 0xf8, 0x70, 0x91, 0xd0, 0xf8, + 0xd8, 0x00, 0xc4, 0xf8, 0xf4, 0x00, 0x4c, 0x48, 0x01, 0x68, 0xdb, 0xf8, + 0xa0, 0x00, 0x14, 0x30, 0x88, 0x47, 0xb7, 0xf8, 0xdc, 0x32, 0x49, 0x4e, + 0x72, 0xb6, 0x00, 0xeb, 0x83, 0x00, 0x31, 0x68, 0x04, 0x30, 0x20, 0xf0, + 0x03, 0x00, 0x49, 0x00, 0x01, 0x31, 0x31, 0x60, 0x31, 0x68, 0x49, 0x08, + 0x31, 0x60, 0xba, 0x6e, 0xb7, 0xf8, 0x14, 0xe3, 0x36, 0x68, 0x86, 0xf3, + 0x10, 0x88, 0x80, 0x1a, 0x00, 0x01, 0x07, 0xd4, 0xb7, 0xf8, 0xdc, 0x02, + 0x0e, 0xf1, 0x01, 0x0e, 0x02, 0xeb, 0x80, 0x00, 0x20, 0xf0, 0x70, 0x42, + 0xdb, 0xf8, 0xb4, 0x00, 0xdd, 0xf8, 0x38, 0xc0, 0xbb, 0xf8, 0x08, 0x80, + 0x13, 0x1a, 0x1b, 0x01, 0x07, 0xd4, 0x4f, 0xea, 0x88, 0x03, 0x19, 0x18, + 0x21, 0xf0, 0x70, 0x40, 0x51, 0x1a, 0x09, 0x01, 0xf9, 0xd5, 0x32, 0x49, + 0x40, 0xf2, 0xe2, 0x43, 0x4f, 0xf4, 0x7a, 0x75, 0x08, 0xfb, 0x03, 0xf6, + 0xb1, 0xf9, 0xbc, 0x11, 0xaa, 0xf8, 0x00, 0xe0, 0x11, 0xfb, 0x05, 0x61, + 0x01, 0x39, 0x91, 0xfb, 0xf6, 0xf1, 0x08, 0xfb, 0x01, 0xf1, 0x00, 0xeb, + 0x81, 0x00, 0x40, 0xf2, 0x71, 0x21, 0x20, 0xf0, 0x70, 0x46, 0xb0, 0x1a, + 0x48, 0x43, 0xd4, 0xf8, 0x70, 0x11, 0x01, 0xeb, 0x50, 0x00, 0xb7, 0xf8, + 0xdc, 0x12, 0xcc, 0xf8, 0x00, 0x00, 0x59, 0x43, 0x88, 0x42, 0x0e, 0xd9, + 0x20, 0x4a, 0x0e, 0xf1, 0x01, 0x01, 0xaa, 0xf8, 0x00, 0x10, 0x01, 0x31, + 0xb7, 0xf8, 0xdc, 0x52, 0x05, 0xfb, 0x02, 0x00, 0x5d, 0x43, 0xa8, 0x42, + 0xf5, 0xd8, 0xcc, 0xf8, 0x00, 0x00, 0x1a, 0x48, 0x01, 0x68, 0x20, 0x46, + 0x88, 0x47, 0x19, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x4a, 0x48, + 0x03, 0x96, 0x03, 0x68, 0x49, 0x48, 0x00, 0x69, 0x00, 0xf1, 0x14, 0x01, + 0x03, 0xa8, 0x02, 0x46, 0x98, 0x47, 0x13, 0x48, 0x03, 0x99, 0x02, 0x68, + 0x20, 0x46, 0x90, 0x47, 0x04, 0xe0, 0x00, 0x20, 0x40, 0xf2, 0xcd, 0x21, + 0xe5, 0xf7, 0x1c, 0xfb, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0xbf, + 0x88, 0xb6, 0x08, 0x00, 0xff, 0x6a, 0x01, 0x00, 0x01, 0x1a, 0x04, 0x00, + 0x70, 0x9b, 0x08, 0x00, 0x2a, 0x1a, 0x04, 0x00, 0x4b, 0x1a, 0x04, 0x00, + 0xec, 0xb9, 0x08, 0x00, 0x24, 0x36, 0x01, 0x00, 0xe8, 0x65, 0x08, 0x00, + 0x1e, 0xfb, 0xff, 0xff, 0x8c, 0xb6, 0x08, 0x00, 0x6c, 0xb6, 0x08, 0x00, + 0x90, 0xb6, 0x08, 0x00, 0x00, 0xf0, 0x4a, 0xb9, 0x70, 0xb5, 0x86, 0xb0, + 0xd0, 0xf8, 0xb0, 0x20, 0x04, 0x46, 0x10, 0x46, 0x1a, 0xb9, 0xd4, 0xf8, + 0xa4, 0x00, 0x00, 0x28, 0x4e, 0xd0, 0xd4, 0xf8, 0x9c, 0x10, 0xc2, 0xb3, + 0xd4, 0xf8, 0xa0, 0x20, 0x52, 0x7f, 0xa2, 0xbb, 0x00, 0x20, 0x26, 0x4e, + 0xad, 0xf8, 0x0c, 0x00, 0x08, 0x68, 0x33, 0x68, 0x02, 0x90, 0x24, 0x48, + 0x00, 0x69, 0x00, 0xf1, 0x14, 0x01, 0x02, 0xa8, 0x02, 0x46, 0x98, 0x47, + 0x21, 0x48, 0x04, 0xad, 0x29, 0x46, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, + 0x1f, 0x48, 0x20, 0x49, 0x2a, 0x46, 0x03, 0x68, 0x28, 0x46, 0x98, 0x47, + 0x04, 0x98, 0x02, 0x99, 0x0a, 0x1a, 0x12, 0x01, 0x07, 0xd4, 0x81, 0x42, + 0x21, 0xd1, 0xbd, 0xf8, 0x0c, 0x00, 0xbd, 0xf8, 0x14, 0x10, 0x81, 0x42, + 0x1b, 0xd9, 0x33, 0x68, 0x04, 0xa8, 0x02, 0xa9, 0x6a, 0x46, 0x98, 0x47, + 0xbd, 0xf8, 0x04, 0x10, 0x00, 0x98, 0x00, 0x29, 0x18, 0xbf, 0x01, 0x30, + 0xd4, 0xf8, 0x9c, 0x10, 0x0a, 0xe0, 0xd0, 0xf8, 0x28, 0x01, 0x4f, 0xf4, + 0x1c, 0x72, 0x02, 0xeb, 0x40, 0x00, 0x40, 0xf2, 0x71, 0x22, 0xb0, 0xfb, + 0xf2, 0xf0, 0x01, 0x30, 0x08, 0x82, 0x06, 0xb0, 0x70, 0xbd, 0xd4, 0xf8, + 0x9c, 0x00, 0x01, 0x21, 0x01, 0x82, 0xf8, 0xe7, 0x20, 0x46, 0x06, 0xb0, + 0xbd, 0xe8, 0x70, 0x40, 0x00, 0xf0, 0xf0, 0xb8, 0x44, 0xa1, 0x08, 0x00, + 0xfc, 0x73, 0x01, 0x00, 0x14, 0xd1, 0x08, 0x00, 0x48, 0xa1, 0x08, 0x00, + 0x84, 0x0e, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x46, 0x27, 0x48, 0x00, 0xf5, + 0x96, 0x70, 0x10, 0xf8, 0x54, 0x1f, 0xca, 0x07, 0x02, 0xd0, 0x02, 0x79, + 0x02, 0xb1, 0xb0, 0xbd, 0x49, 0x07, 0x02, 0xd5, 0x41, 0x79, 0x00, 0x29, + 0xf9, 0xd1, 0x94, 0xf8, 0x1d, 0x21, 0x20, 0x4d, 0xc2, 0xeb, 0x02, 0x12, + 0x29, 0x68, 0x52, 0x01, 0x89, 0x5c, 0x00, 0x29, 0xef, 0xd1, 0x94, 0xf8, + 0x47, 0x21, 0x94, 0xf8, 0x51, 0x31, 0x00, 0x21, 0x84, 0xf8, 0x2c, 0x12, + 0xc4, 0xf8, 0x28, 0x12, 0x94, 0xf8, 0x20, 0x11, 0x9a, 0x42, 0x38, 0xbf, + 0x1a, 0x46, 0x00, 0x79, 0x01, 0x32, 0x51, 0x43, 0xca, 0xb2, 0x82, 0x42, + 0x38, 0xbf, 0x08, 0x46, 0xd4, 0xf8, 0x20, 0x12, 0x84, 0xf8, 0x2d, 0x02, + 0x79, 0xb9, 0x10, 0x49, 0xc0, 0xb2, 0x40, 0x00, 0x09, 0x68, 0x88, 0x47, + 0x94, 0xf8, 0x1d, 0x11, 0xc4, 0xf8, 0x20, 0x02, 0x28, 0x68, 0xc1, 0xeb, + 0x01, 0x11, 0x49, 0x01, 0x40, 0x5c, 0x01, 0x28, 0xc5, 0xd8, 0xd4, 0xf8, + 0x24, 0x02, 0x00, 0x28, 0xc1, 0xd1, 0x06, 0x48, 0x01, 0x68, 0x94, 0xf8, + 0x2d, 0x02, 0x40, 0x00, 0x88, 0x47, 0xc4, 0xf8, 0x24, 0x02, 0xb0, 0xbd, + 0x8c, 0x7e, 0x08, 0x00, 0xe0, 0x35, 0x01, 0x00, 0x4c, 0x9c, 0x08, 0x00, + 0x10, 0xb5, 0x04, 0x46, 0x00, 0xf0, 0x90, 0xf8, 0x20, 0x46, 0xbd, 0xe8, + 0x10, 0x40, 0xff, 0xf7, 0x9f, 0xbf, 0x00, 0xbf, 0x10, 0xb5, 0x12, 0x48, + 0x12, 0x49, 0x13, 0x4a, 0x14, 0x4c, 0x13, 0x4b, 0xc0, 0xe9, 0x42, 0x42, + 0xc0, 0xe9, 0x44, 0x13, 0x12, 0x48, 0x13, 0x49, 0x01, 0x60, 0x13, 0x48, + 0x13, 0x49, 0x01, 0x60, 0x13, 0x48, 0x14, 0x49, 0x01, 0x60, 0x14, 0x48, + 0x14, 0x49, 0x01, 0x60, 0x14, 0x48, 0x15, 0x49, 0x01, 0x60, 0x15, 0x48, + 0x15, 0x49, 0x01, 0x60, 0x15, 0x48, 0x16, 0x49, 0x01, 0x60, 0x16, 0x48, + 0x16, 0x49, 0x01, 0x60, 0x16, 0x48, 0x17, 0x49, 0x01, 0x60, 0x10, 0xbd, + 0x90, 0xcf, 0x08, 0x00, 0xd5, 0x0f, 0x04, 0x00, 0xd1, 0x0b, 0x04, 0x00, + 0xe9, 0x10, 0x04, 0x00, 0x1d, 0x10, 0x04, 0x00, 0xd4, 0xb7, 0x08, 0x00, + 0xad, 0x12, 0x04, 0x00, 0xd8, 0xb7, 0x08, 0x00, 0x4d, 0x13, 0x04, 0x00, + 0xb8, 0xb6, 0x08, 0x00, 0x35, 0x14, 0x04, 0x00, 0xb4, 0xb6, 0x08, 0x00, + 0x65, 0x14, 0x04, 0x00, 0xbc, 0xb6, 0x08, 0x00, 0xa7, 0x0f, 0x04, 0x00, + 0xa4, 0xd2, 0x08, 0x00, 0x89, 0x14, 0x04, 0x00, 0xc0, 0xb8, 0x08, 0x00, + 0xc5, 0x16, 0x04, 0x00, 0x98, 0xb6, 0x08, 0x00, 0xc9, 0x16, 0x04, 0x00, + 0x88, 0xb6, 0x08, 0x00, 0x4d, 0x18, 0x04, 0x00, 0x45, 0xf6, 0x67, 0x7c, + 0xc1, 0xf2, 0x09, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x45, 0xf6, 0x37, 0x3c, + 0xc1, 0xf2, 0x09, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x45, 0xf6, 0x1d, 0x5c, + 0xc1, 0xf2, 0x09, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x46, 0xf2, 0x15, 0x4c, + 0xc1, 0xf2, 0x09, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x45, 0xf2, 0x19, 0x5c, + 0xc1, 0xf2, 0x09, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x45, 0xf6, 0x67, 0x4c, + 0xc1, 0xf2, 0x09, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x45, 0xf6, 0x65, 0x5c, + 0xc1, 0xf2, 0x09, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x44, 0xf2, 0xc9, 0x3c, + 0xc1, 0xf2, 0x09, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x44, 0xf6, 0xa3, 0x0c, + 0xc1, 0xf2, 0x09, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x44, 0xf2, 0x6b, 0x3c, + 0xc1, 0xf2, 0x09, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x2d, 0x20, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x20, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x00, 0x49, 0x53, 0x4f, 0x20, 0x20, 0x20, 0x54, 0x78, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x00, 0x49, 0x53, 0x4f, 0x20, 0x20, 0x20, 0x54, 0x78, 0x46, + 0x6c, 0x75, 0x73, 0x68, 0x00, 0x49, 0x53, 0x4f, 0x20, 0x54, 0x78, 0x52, + 0x65, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x00, 0x49, 0x53, 0x4f, 0x20, 0x20, + 0x20, 0x52, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x00, 0x49, 0x53, 0x4f, + 0x20, 0x20, 0x20, 0x52, 0x78, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x00, 0x49, + 0x53, 0x4f, 0x20, 0x20, 0x20, 0x20, 0x52, 0x78, 0x4d, 0x69, 0x73, 0x73, + 0x00, 0x49, 0x53, 0x4f, 0x20, 0x20, 0x20, 0x52, 0x78, 0x41, 0x62, 0x6f, + 0x72, 0x74, 0x00, 0x43, 0x6f, 0x6e, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x73, + 0x55, 0x73, 0x65, 0x64, 0x00, 0x43, 0x49, 0x53, 0x2d, 0x4d, 0x3a, 0x20, + 0x4e, 0x53, 0x45, 0x3a, 0x25, 0x64, 0x20, 0x73, 0x75, 0x62, 0x44, 0x75, + 0x72, 0x3a, 0x25, 0x64, 0x20, 0x73, 0x75, 0x62, 0x49, 0x6e, 0x74, 0x3a, + 0x25, 0x64, 0x20, 0x6f, 0x66, 0x66, 0x3a, 0x25, 0x64, 0x00, 0x43, 0x49, + 0x53, 0x2d, 0x54, 0x58, 0x3a, 0x20, 0x46, 0x54, 0x3a, 0x25, 0x64, 0x20, + 0x42, 0x4e, 0x3a, 0x25, 0x64, 0x20, 0x50, 0x48, 0x59, 0x3a, 0x25, 0x64, + 0x20, 0x50, 0x4c, 0x3a, 0x25, 0x64, 0x00, 0x43, 0x49, 0x53, 0x2d, 0x52, + 0x58, 0x3a, 0x20, 0x46, 0x54, 0x3a, 0x25, 0x64, 0x20, 0x42, 0x4e, 0x3a, + 0x25, 0x64, 0x20, 0x50, 0x48, 0x59, 0x3a, 0x25, 0x64, 0x20, 0x50, 0x4c, + 0x3a, 0x25, 0x64, 0x00, 0x10, 0xb5, 0x8c, 0xb0, 0xcd, 0xe9, 0x02, 0x01, + 0x5e, 0x48, 0x02, 0xab, 0x90, 0xf8, 0xfd, 0x02, 0x04, 0x90, 0x9b, 0x48, + 0x01, 0x8a, 0x05, 0x91, 0x41, 0x8a, 0x06, 0x91, 0x01, 0x8b, 0x07, 0x91, + 0xd0, 0xe9, 0x02, 0x12, 0xcd, 0xe9, 0x08, 0x12, 0x81, 0x8a, 0xc0, 0x8a, + 0x00, 0x22, 0x0b, 0x90, 0x05, 0x48, 0x0a, 0x91, 0x01, 0x21, 0x04, 0x68, + 0x28, 0x20, 0x00, 0x90, 0x40, 0xf2, 0x45, 0x60, 0xa0, 0x47, 0x0c, 0xb0, + 0x10, 0xbd, 0x00, 0xbf, 0xa0, 0xa0, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x47, + 0x04, 0x46, 0x84, 0x48, 0xdf, 0xf8, 0xb8, 0x90, 0x87, 0x6a, 0xd9, 0xf8, + 0x20, 0x50, 0x90, 0xf8, 0x3d, 0x80, 0x00, 0xf1, 0x20, 0x06, 0xe9, 0x1b, + 0x09, 0x01, 0x07, 0xd5, 0x00, 0x20, 0x9b, 0x21, 0xe5, 0xf7, 0xf0, 0xf8, + 0xd9, 0xf8, 0x20, 0x70, 0x3d, 0x46, 0xb7, 0x60, 0xd6, 0xf8, 0x04, 0xa0, + 0x20, 0x46, 0x00, 0xf0, 0x1d, 0xfb, 0xd6, 0xe9, 0x00, 0x49, 0x4c, 0x45, + 0x0f, 0xd0, 0x21, 0x48, 0x21, 0x49, 0x00, 0x78, 0x09, 0x78, 0x08, 0x44, + 0x20, 0x49, 0x09, 0x78, 0xc8, 0x42, 0x06, 0xd1, 0x96, 0xf8, 0x45, 0x00, + 0x18, 0xb1, 0x1e, 0x48, 0x90, 0xf8, 0x3e, 0x06, 0x58, 0xb3, 0x1d, 0x48, + 0x80, 0x7c, 0x20, 0xf0, 0x04, 0x00, 0x1b, 0x49, 0x88, 0x74, 0xe0, 0xf7, + 0xef, 0xfd, 0x01, 0x28, 0x07, 0xd1, 0x17, 0x48, 0x90, 0xf8, 0x4f, 0x16, + 0x01, 0x29, 0x04, 0xd0, 0x90, 0xf8, 0x4e, 0x06, 0x08, 0xb1, 0x00, 0x20, + 0x00, 0xe0, 0x01, 0x20, 0x69, 0x49, 0xb8, 0xf1, 0x00, 0x0f, 0x81, 0xf8, + 0x20, 0x00, 0xa5, 0xeb, 0x07, 0x01, 0xc1, 0xf3, 0x5a, 0x01, 0x18, 0xbf, + 0x8a, 0x45, 0x07, 0xd8, 0x71, 0x7f, 0x01, 0x29, 0x04, 0xd1, 0x18, 0xb1, + 0x20, 0x46, 0x49, 0x46, 0xff, 0xf7, 0x80, 0xff, 0x01, 0x20, 0xbd, 0xe8, + 0xf0, 0x87, 0x07, 0x48, 0x80, 0x7c, 0x40, 0xf0, 0x04, 0x00, 0xd2, 0xe7, + 0xfc, 0x70, 0x01, 0x00, 0x5c, 0x34, 0x01, 0x00, 0x53, 0x34, 0x01, 0x00, + 0xd4, 0x58, 0x01, 0x00, 0x64, 0xd4, 0x05, 0x00, 0x78, 0xe6, 0x05, 0x00, + 0xb0, 0xb5, 0x0a, 0x46, 0x01, 0x46, 0x54, 0x48, 0x00, 0x23, 0x14, 0x4d, + 0x43, 0x82, 0x64, 0x23, 0x95, 0xf8, 0xfd, 0x52, 0x10, 0x30, 0x02, 0xfb, + 0x03, 0xf4, 0xb4, 0xfb, 0xf1, 0xf4, 0xac, 0x42, 0x14, 0x46, 0x84, 0xbf, + 0x05, 0xfb, 0x02, 0xf4, 0xb4, 0xfb, 0xf3, 0xf4, 0xa3, 0xb2, 0x04, 0x80, + 0x11, 0x2b, 0x0d, 0xd3, 0x00, 0x24, 0xb4, 0xeb, 0x13, 0x1f, 0x09, 0xd0, + 0x1b, 0x09, 0x4f, 0xf6, 0xf0, 0x74, 0xb2, 0xfb, 0xf3, 0xf3, 0x43, 0x80, + 0x23, 0x42, 0x1c, 0xbf, 0x10, 0x3b, 0x43, 0x80, 0x10, 0x46, 0xbd, 0xe8, + 0xb0, 0x40, 0xff, 0xf7, 0x3f, 0xbf, 0x00, 0xbf, 0x8c, 0x7e, 0x08, 0x00, + 0x70, 0xb5, 0x36, 0x4d, 0xd5, 0xe9, 0x08, 0x01, 0x81, 0x42, 0x02, 0xd1, + 0x00, 0xf0, 0x9a, 0xfa, 0x57, 0xe0, 0x28, 0x7b, 0x00, 0x28, 0x54, 0xd1, + 0x95, 0xf8, 0x3c, 0x00, 0x00, 0x21, 0x31, 0x4e, 0x00, 0xf0, 0x82, 0x00, + 0x82, 0x28, 0x2e, 0x48, 0x14, 0xbf, 0x41, 0x84, 0x81, 0x84, 0x72, 0xb6, + 0x30, 0x68, 0x40, 0x00, 0x01, 0x30, 0x30, 0x60, 0x2b, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x04, 0x46, 0x30, 0x68, 0x4f, 0xea, 0x50, 0x00, 0x30, 0x60, + 0x30, 0x68, 0x80, 0xf3, 0x10, 0x88, 0xc4, 0xb3, 0x63, 0x20, 0x2c, 0x60, + 0x20, 0x75, 0x04, 0x20, 0x20, 0x82, 0x72, 0xb6, 0x30, 0x68, 0x40, 0x00, + 0x01, 0x30, 0x30, 0x60, 0x21, 0x48, 0x00, 0x68, 0x80, 0x47, 0x20, 0x60, + 0xee, 0x49, 0xf6, 0x4a, 0x30, 0x68, 0x40, 0x08, 0x30, 0x60, 0x30, 0x68, + 0x80, 0xf3, 0x10, 0x88, 0x25, 0x20, 0x85, 0xf8, 0x3e, 0x00, 0x00, 0x20, + 0x2b, 0x6a, 0x50, 0x86, 0xe8, 0x4a, 0x85, 0xf8, 0x3d, 0x00, 0x08, 0x73, + 0x20, 0x68, 0x5e, 0x00, 0xa8, 0x62, 0x12, 0x88, 0x00, 0xeb, 0x43, 0x00, + 0x2e, 0x63, 0x48, 0x60, 0xc8, 0x20, 0x8a, 0x60, 0x50, 0x43, 0x12, 0x4a, + 0x12, 0x88, 0xb0, 0xfb, 0xf2, 0xf0, 0x01, 0x30, 0x20, 0xf0, 0x01, 0x00, + 0x08, 0x60, 0x0f, 0x48, 0x02, 0x68, 0x6c, 0x48, 0x81, 0x69, 0x20, 0x46, + 0x90, 0x47, 0x0d, 0x48, 0x01, 0x21, 0x4f, 0xf0, 0xff, 0x32, 0x80, 0xf8, + 0x21, 0x10, 0x0b, 0x49, 0x0a, 0x60, 0x00, 0x21, 0xc0, 0xe9, 0x02, 0x11, + 0x70, 0xbd, 0x00, 0xbf, 0x90, 0x01, 0x00, 0x00, 0xc4, 0x79, 0x01, 0x00, + 0x24, 0x36, 0x01, 0x00, 0xd8, 0xa0, 0x08, 0x00, 0x14, 0xd9, 0x08, 0x00, + 0x9a, 0x0e, 0x01, 0x00, 0xd4, 0xa0, 0x08, 0x00, 0x8c, 0xe6, 0x05, 0x00, + 0x78, 0xd3, 0x05, 0x00, 0x2d, 0xe9, 0xf0, 0x41, 0xc6, 0x4e, 0x04, 0x46, + 0x70, 0x68, 0x50, 0xb1, 0x53, 0x48, 0x54, 0x49, 0x00, 0x68, 0x09, 0x6a, + 0x08, 0x1a, 0x53, 0x49, 0x20, 0xf0, 0x70, 0x40, 0xca, 0x68, 0x10, 0x44, + 0xc8, 0x60, 0xe8, 0x4d, 0x95, 0xf9, 0x3c, 0x00, 0xb0, 0xf1, 0xff, 0x3f, + 0x01, 0xdc, 0x80, 0x30, 0x0e, 0xd1, 0x6c, 0x48, 0x00, 0x26, 0x00, 0x21, + 0x85, 0xf8, 0x3c, 0x60, 0x02, 0x68, 0x28, 0x1d, 0x90, 0x47, 0x2e, 0x60, + 0x20, 0x46, 0xec, 0xf7, 0xc3, 0xff, 0x00, 0x20, 0xbd, 0xe8, 0xf0, 0x81, + 0xd5, 0xe9, 0x08, 0xc3, 0x63, 0x45, 0x0b, 0xd1, 0x31, 0x6b, 0x28, 0x1d, + 0x81, 0x42, 0x07, 0xd0, 0x41, 0x49, 0x28, 0x6b, 0x91, 0xf8, 0x2c, 0x10, + 0xa3, 0xeb, 0x50, 0x00, 0x88, 0x42, 0x2a, 0xd2, 0xdf, 0xf8, 0xf8, 0x80, + 0xa8, 0x6a, 0x2f, 0x6b, 0xd8, 0xf8, 0x18, 0x10, 0x04, 0x2f, 0x0a, 0x69, + 0xa2, 0xeb, 0x00, 0x00, 0xc0, 0xf3, 0x5a, 0x00, 0x28, 0xbf, 0x83, 0x42, + 0x0b, 0xd8, 0xdd, 0x49, 0x09, 0x68, 0x88, 0x47, 0xd8, 0xf8, 0x18, 0x10, + 0xa8, 0x6a, 0xd5, 0xe9, 0x08, 0xc3, 0x0a, 0x69, 0x10, 0x1a, 0x00, 0x01, + 0x08, 0xd4, 0x63, 0x45, 0x04, 0xd0, 0x2f, 0x4a, 0x6b, 0x8a, 0x90, 0x8f, + 0x83, 0x42, 0x15, 0xd2, 0x00, 0x20, 0x46, 0xe0, 0x63, 0x45, 0x07, 0xd1, + 0x49, 0x48, 0x01, 0x21, 0x02, 0x68, 0x28, 0x1d, 0x90, 0x47, 0x00, 0x20, + 0x28, 0x60, 0xbb, 0xe7, 0x96, 0xf8, 0x4d, 0x00, 0x60, 0xb1, 0x27, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x03, 0x28, 0x07, 0xd1, 0xa8, 0x6a, 0x17, 0xe0, + 0x28, 0x48, 0x00, 0x7d, 0x00, 0xb3, 0xd0, 0x8e, 0x40, 0x00, 0x1e, 0xe0, + 0x22, 0x48, 0x01, 0x68, 0x22, 0x48, 0x88, 0x47, 0x4f, 0xf4, 0xff, 0x71, + 0x05, 0xf1, 0x20, 0x03, 0x01, 0xea, 0x40, 0x00, 0x0e, 0xcb, 0x51, 0x1a, + 0x48, 0x43, 0x40, 0xf2, 0xfb, 0x41, 0xb0, 0xfb, 0xf1, 0xf0, 0x18, 0x44, + 0x18, 0x49, 0x08, 0x40, 0x20, 0x60, 0x1a, 0x48, 0xd8, 0xf8, 0x18, 0x10, + 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0x00, 0x20, 0x68, 0x82, 0x90, 0xe7, + 0x00, 0x20, 0x17, 0x4b, 0x1b, 0x7b, 0x13, 0xb1, 0x12, 0x8f, 0x00, 0xeb, + 0x42, 0x00, 0x00, 0x22, 0x6a, 0x82, 0x09, 0x4a, 0x12, 0x6a, 0x02, 0x44, + 0x22, 0xf0, 0x70, 0x42, 0x6a, 0x61, 0x06, 0x4a, 0x12, 0x6a, 0x10, 0x44, + 0x20, 0xf0, 0x70, 0x40, 0x20, 0x60, 0x0b, 0x48, 0x02, 0x68, 0x20, 0x46, + 0x90, 0x47, 0x76, 0xe7, 0x60, 0x86, 0x01, 0x00, 0xfc, 0x70, 0x01, 0x00, + 0x38, 0xfb, 0x05, 0x00, 0xe8, 0x65, 0x08, 0x00, 0xfc, 0x73, 0x01, 0x00, + 0x3c, 0xe5, 0x08, 0x00, 0xfc, 0xff, 0xff, 0x0f, 0xa0, 0x8e, 0x08, 0x00, + 0xf8, 0x6d, 0x01, 0x00, 0xc4, 0xa0, 0x08, 0x00, 0x7c, 0x5c, 0x01, 0x00, + 0x24, 0x5c, 0x01, 0x00, 0xb0, 0xb5, 0x8d, 0x4d, 0x2c, 0x1d, 0x00, 0xf0, + 0x5d, 0xf9, 0x2a, 0x7b, 0xd5, 0xe9, 0x08, 0x01, 0x42, 0xb1, 0x88, 0x42, + 0x1e, 0xd0, 0x10, 0x48, 0x00, 0x21, 0x02, 0x68, 0x20, 0x46, 0xbd, 0xe8, + 0xb0, 0x40, 0x10, 0x47, 0x88, 0x42, 0x15, 0xd1, 0x94, 0xf8, 0x38, 0x00, + 0x00, 0x21, 0x00, 0xf0, 0x82, 0x00, 0x82, 0x28, 0x61, 0x48, 0x19, 0xbf, + 0x41, 0x84, 0x21, 0x21, 0x81, 0x84, 0x22, 0x21, 0x06, 0x48, 0x02, 0x68, + 0x20, 0x46, 0x90, 0x47, 0x05, 0x48, 0x01, 0x68, 0x20, 0x46, 0xbd, 0xe8, + 0xb0, 0x40, 0x08, 0x47, 0xb0, 0xbd, 0x00, 0xbf, 0xbc, 0xa0, 0x08, 0x00, + 0xe4, 0xc9, 0x08, 0x00, 0xe8, 0xc9, 0x08, 0x00, 0x2d, 0xe9, 0xfe, 0x43, + 0x75, 0x49, 0xb1, 0xf8, 0xb0, 0x17, 0x49, 0x07, 0x05, 0xd5, 0x71, 0x4b, + 0x93, 0xf9, 0x3c, 0x20, 0xb2, 0xf1, 0xff, 0x3f, 0x02, 0xdd, 0x00, 0x20, + 0xbd, 0xe8, 0xfe, 0x83, 0x19, 0x1d, 0x12, 0xf1, 0x7e, 0x04, 0x05, 0xd0, + 0xd2, 0xb2, 0x81, 0x2a, 0x0a, 0xd1, 0x41, 0x4a, 0x12, 0x68, 0x05, 0xe0, + 0x3e, 0x4a, 0x12, 0x6b, 0x8a, 0x42, 0xee, 0xd0, 0x91, 0xf8, 0x39, 0x20, + 0x00, 0x2a, 0xea, 0xd1, 0x64, 0x4d, 0x3c, 0x4a, 0xad, 0x69, 0x54, 0x68, + 0x2d, 0x69, 0x2e, 0x1b, 0x37, 0x01, 0xe2, 0xd4, 0x00, 0x28, 0x68, 0xd0, + 0x10, 0x7b, 0xa8, 0xb1, 0x00, 0x20, 0x10, 0x73, 0x36, 0x48, 0x00, 0x88, + 0x90, 0x60, 0xc6, 0xf3, 0x5a, 0x06, 0x17, 0x68, 0x3e, 0x44, 0x01, 0x3e, + 0xb6, 0xfb, 0xf7, 0xf6, 0x7e, 0x43, 0x04, 0xeb, 0x46, 0x06, 0xad, 0x1b, + 0x26, 0xf0, 0x70, 0x44, 0x2d, 0x01, 0x54, 0x60, 0xc9, 0xd4, 0x00, 0xe0, + 0x90, 0x68, 0xdf, 0xf8, 0xb4, 0x80, 0xd3, 0xf8, 0xac, 0x30, 0xdf, 0xf8, + 0xb0, 0x90, 0x98, 0xf8, 0x00, 0x50, 0x05, 0xeb, 0x05, 0x16, 0x2a, 0x4d, + 0x49, 0xf8, 0x36, 0x30, 0x35, 0xf8, 0x06, 0x3f, 0xa0, 0xeb, 0x53, 0x07, + 0x09, 0xeb, 0xc6, 0x00, 0x65, 0x26, 0x80, 0xf8, 0x49, 0x60, 0x25, 0x4e, + 0x00, 0x2f, 0x97, 0x60, 0x36, 0x68, 0x06, 0x61, 0x4e, 0x8f, 0x91, 0xf8, + 0x3c, 0x10, 0xa0, 0xf8, 0x50, 0x60, 0x80, 0xf8, 0x52, 0x10, 0x06, 0xdc, + 0x1a, 0x49, 0x16, 0x68, 0x09, 0x88, 0x04, 0xeb, 0x46, 0x04, 0xc2, 0xe9, + 0x01, 0x41, 0xd5, 0xf8, 0x06, 0x20, 0x00, 0x21, 0xad, 0xf8, 0x08, 0x10, + 0xd5, 0xf8, 0x02, 0x10, 0x1a, 0x44, 0x22, 0xf0, 0x70, 0x42, 0x14, 0x31, + 0x01, 0x92, 0x00, 0xf1, 0x34, 0x02, 0x15, 0x48, 0x03, 0x68, 0x01, 0xa8, + 0x98, 0x47, 0x98, 0xf8, 0x00, 0x00, 0x13, 0x49, 0x00, 0xeb, 0x00, 0x10, + 0x0a, 0x68, 0x2c, 0x21, 0x09, 0xeb, 0xc0, 0x00, 0x90, 0x47, 0xe8, 0x8a, + 0x2a, 0x88, 0x01, 0x30, 0x01, 0x32, 0xe8, 0x82, 0x0d, 0x48, 0x41, 0x8e, + 0x01, 0xeb, 0x52, 0x01, 0x41, 0x86, 0x01, 0x20, 0xbd, 0xe8, 0xfe, 0x83, + 0x18, 0x74, 0x01, 0x00, 0xb4, 0x55, 0x01, 0x00, 0x64, 0x54, 0x01, 0x00, + 0x98, 0x0e, 0x01, 0x00, 0x74, 0x87, 0x08, 0x00, 0xfc, 0x6d, 0x01, 0x00, + 0x3c, 0x88, 0x01, 0x00, 0x20, 0xd3, 0x08, 0x00, 0x44, 0xa1, 0x08, 0x00, + 0xf4, 0xa0, 0x08, 0x00, 0xc4, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x00, 0xf0, + 0x85, 0xf8, 0x06, 0x48, 0x06, 0x49, 0x00, 0x78, 0x08, 0x44, 0x80, 0x7e, + 0x00, 0x28, 0xbd, 0xe8, 0x80, 0x40, 0x08, 0xbf, 0x16, 0xf0, 0x70, 0xbd, + 0x16, 0xf0, 0x36, 0xbd, 0x74, 0x87, 0x08, 0x00, 0x48, 0x54, 0x01, 0x00, + 0xb0, 0xb5, 0x12, 0x49, 0x12, 0x4d, 0xca, 0x69, 0xac, 0x6a, 0x01, 0x32, + 0xca, 0x61, 0x00, 0xf0, 0x71, 0xf8, 0x28, 0x1d, 0x10, 0xf8, 0x08, 0x1f, + 0x59, 0xb1, 0x0e, 0x4a, 0xc1, 0x69, 0x92, 0x69, 0x12, 0x69, 0x51, 0x1a, + 0x04, 0x31, 0x21, 0xf0, 0x70, 0x41, 0xb1, 0xf1, 0x00, 0x6f, 0x88, 0xbf, + 0xc4, 0x61, 0x09, 0x48, 0x90, 0xf8, 0x2f, 0x01, 0xc0, 0x06, 0x06, 0xd5, + 0x07, 0x48, 0x01, 0x68, 0xc7, 0x20, 0x88, 0x47, 0x06, 0x48, 0x00, 0x21, + 0x01, 0x62, 0xb0, 0xbd, 0x84, 0xf0, 0x05, 0x00, 0x90, 0x01, 0x00, 0x00, + 0xfc, 0x73, 0x01, 0x00, 0x8c, 0x7e, 0x08, 0x00, 0x8c, 0xba, 0x08, 0x00, + 0x38, 0x7a, 0x01, 0x00, 0x0a, 0x48, 0x0b, 0x49, 0x01, 0x60, 0x0b, 0x48, + 0x0b, 0x49, 0x01, 0x60, 0x0b, 0x48, 0x0c, 0x49, 0x01, 0x60, 0x0c, 0x48, + 0x0c, 0x49, 0x01, 0x60, 0x0c, 0x48, 0x0d, 0x49, 0x01, 0x60, 0x0d, 0x48, + 0x0d, 0x49, 0x40, 0xf8, 0x24, 0x1f, 0x0d, 0x49, 0x41, 0x60, 0x70, 0x47, + 0x54, 0xba, 0x08, 0x00, 0x69, 0x20, 0x04, 0x00, 0xf8, 0xd2, 0x08, 0x00, + 0xf5, 0x1b, 0x04, 0x00, 0x5c, 0xba, 0x08, 0x00, 0x81, 0x1e, 0x04, 0x00, + 0x00, 0xd3, 0x08, 0x00, 0xe5, 0x1e, 0x04, 0x00, 0x20, 0xbb, 0x08, 0x00, + 0x41, 0x20, 0x04, 0x00, 0x90, 0xcf, 0x08, 0x00, 0xb9, 0x1a, 0x04, 0x00, + 0xf5, 0x1c, 0x04, 0x00, 0x4b, 0xf6, 0x3f, 0x0c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4b, 0xf2, 0xf3, 0x5c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4b, 0xf6, 0x21, 0x3c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4b, 0xf2, 0x03, 0x0c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4b, 0xf6, 0x17, 0x2c, 0xc1, 0xf2, 0x09, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x10, 0xb5, 0x6d, 0x49, 0x0b, 0x4a, 0x5c, 0x23, + 0x08, 0x78, 0x10, 0xfb, 0x03, 0x20, 0xc4, 0x69, 0x09, 0x48, 0x84, 0x60, + 0x09, 0x78, 0x11, 0xfb, 0x03, 0x21, 0x09, 0x8c, 0x41, 0x60, 0x07, 0x49, + 0x01, 0x60, 0x41, 0x6a, 0xc9, 0x07, 0x11, 0xbf, 0x00, 0x20, 0x80, 0x69, + 0x01, 0x30, 0x40, 0x08, 0x10, 0xbd, 0x00, 0xbf, 0x44, 0x4f, 0x01, 0x00, + 0x80, 0x23, 0x00, 0x40, 0x20, 0x21, 0x31, 0x00, 0xf8, 0xb5, 0xff, 0xf7, + 0xdd, 0xff, 0x04, 0x46, 0x5a, 0x48, 0x5b, 0x4f, 0x5b, 0x4e, 0x5d, 0x4d, + 0x01, 0x6a, 0x21, 0x44, 0x01, 0x62, 0x5a, 0x49, 0x38, 0x78, 0x31, 0xf8, + 0x10, 0x2f, 0x00, 0xeb, 0x00, 0x10, 0x06, 0xeb, 0xc0, 0x00, 0x22, 0x44, + 0x0b, 0x46, 0x23, 0xf8, 0x02, 0x2b, 0xc0, 0xe9, 0x1e, 0x13, 0xd5, 0xe9, + 0x08, 0x12, 0x8a, 0x42, 0x49, 0xd1, 0x29, 0x7b, 0x00, 0x29, 0x00, 0xf0, + 0x97, 0x80, 0x51, 0x49, 0x00, 0x69, 0x0a, 0x69, 0x90, 0x42, 0x0e, 0xd0, + 0x49, 0x69, 0x88, 0x42, 0x0b, 0xd0, 0x4e, 0x49, 0x09, 0x68, 0x88, 0x42, + 0x07, 0xd0, 0x28, 0x6b, 0xb0, 0xeb, 0x44, 0x0f, 0x92, 0xbf, 0x00, 0x20, + 0x61, 0x00, 0x40, 0x1a, 0x28, 0x63, 0x68, 0x8a, 0x21, 0x46, 0x20, 0x44, + 0x68, 0x82, 0x4b, 0x48, 0x02, 0x68, 0xe8, 0x69, 0x00, 0x78, 0x90, 0x47, + 0x46, 0x48, 0x90, 0xf8, 0x2c, 0x10, 0xb0, 0xf8, 0x76, 0x00, 0x40, 0x1a, + 0x44, 0x49, 0x89, 0x69, 0x09, 0x69, 0x01, 0xeb, 0x40, 0x00, 0x29, 0x8a, + 0x20, 0xf0, 0x70, 0x40, 0x68, 0x61, 0x68, 0x8a, 0x01, 0x39, 0x81, 0x42, + 0x66, 0xdc, 0x28, 0x7b, 0x03, 0x28, 0x63, 0xd1, 0x2c, 0x68, 0x4c, 0xb1, + 0x3d, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x21, 0x7d, 0x00, 0x20, + 0x20, 0x61, 0x28, 0x60, 0x20, 0x75, 0xa1, 0x75, 0x39, 0x49, 0x28, 0x1d, + 0x0a, 0x68, 0x03, 0x21, 0xbd, 0xe8, 0xf8, 0x40, 0x10, 0x47, 0x2e, 0x4a, + 0x01, 0x69, 0x13, 0x69, 0x99, 0x42, 0x3a, 0xd0, 0x52, 0x69, 0x91, 0x42, + 0x37, 0xd0, 0x2b, 0x4a, 0x12, 0x68, 0x91, 0x42, 0x33, 0xd0, 0x2a, 0x49, + 0x40, 0x68, 0x09, 0x68, 0x88, 0x47, 0x29, 0x49, 0x08, 0x1d, 0x89, 0x7c, + 0xca, 0x07, 0x01, 0xd0, 0x4a, 0x07, 0x06, 0xd4, 0x8a, 0x07, 0x48, 0xbf, + 0x5f, 0xea, 0x41, 0x72, 0x0a, 0xd4, 0x60, 0x00, 0x1b, 0xe0, 0x01, 0xf0, + 0xfe, 0x01, 0x81, 0x73, 0x81, 0x68, 0x01, 0xf0, 0xf0, 0x01, 0x40, 0x29, + 0x03, 0xd1, 0x0c, 0xe0, 0x01, 0xf0, 0xfd, 0x01, 0x81, 0x73, 0x39, 0x78, + 0x00, 0x68, 0x01, 0xeb, 0x01, 0x11, 0x06, 0xeb, 0xc1, 0x01, 0x09, 0x6a, + 0x0a, 0x1a, 0x12, 0x01, 0x01, 0xd4, 0x00, 0x20, 0x03, 0xe0, 0x40, 0x1a, + 0x20, 0xf0, 0x70, 0x40, 0x01, 0x30, 0x29, 0x6b, 0x81, 0x42, 0x94, 0xbf, + 0x00, 0x20, 0x08, 0x1a, 0x28, 0x63, 0x68, 0x8a, 0x20, 0x44, 0x68, 0x82, + 0x10, 0x48, 0x90, 0xf8, 0x2c, 0x10, 0xb0, 0xf8, 0x76, 0x00, 0x40, 0x1a, + 0x0e, 0x49, 0x89, 0x69, 0x09, 0x69, 0x01, 0xeb, 0x40, 0x00, 0x20, 0xf0, + 0x70, 0x40, 0x68, 0x61, 0xf8, 0xbd, 0x00, 0xbf, 0x84, 0xf0, 0x05, 0x00, + 0x74, 0x87, 0x08, 0x00, 0xfc, 0x6d, 0x01, 0x00, 0xe4, 0x77, 0x01, 0x00, + 0x90, 0x01, 0x00, 0x00, 0x60, 0xd1, 0x08, 0x00, 0x24, 0xd3, 0x08, 0x00, + 0xac, 0xa0, 0x08, 0x00, 0x78, 0xe6, 0x05, 0x00, 0xe8, 0x65, 0x08, 0x00, + 0xfc, 0x73, 0x01, 0x00, 0x34, 0xd3, 0x08, 0x00, 0xc8, 0xa0, 0x08, 0x00, + 0xbc, 0xa0, 0x08, 0x00, 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, + 0x4c, 0xba, 0x08, 0x00, 0xa9, 0x21, 0x04, 0x00, 0xb0, 0xb5, 0x00, 0xf0, + 0x2b, 0xf9, 0x48, 0xb1, 0x0a, 0x4d, 0x00, 0x21, 0x01, 0x22, 0x01, 0x24, + 0xa8, 0x1c, 0x19, 0xf0, 0xcd, 0xfa, 0x18, 0xb1, 0x2c, 0x70, 0x08, 0xe0, + 0x00, 0x24, 0x06, 0xe0, 0x28, 0x78, 0x01, 0x24, 0x18, 0xb9, 0x01, 0x20, + 0x19, 0xf0, 0xc6, 0xfb, 0x28, 0x73, 0x20, 0x46, 0xb0, 0xbd, 0x00, 0xbf, + 0x58, 0xf0, 0x05, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, 0x99, 0xb0, 0x5d, 0x48, + 0x04, 0x68, 0x5d, 0x48, 0x00, 0x68, 0x80, 0x47, 0xdf, 0xf8, 0x70, 0x91, + 0xdf, 0xf8, 0x70, 0xa1, 0x99, 0xf8, 0x00, 0x00, 0xc0, 0xeb, 0x40, 0x10, + 0x0a, 0xeb, 0xc0, 0x01, 0xb1, 0xf8, 0xdc, 0x00, 0xc2, 0x07, 0x03, 0xd1, + 0x60, 0x68, 0x01, 0x30, 0x60, 0x60, 0x9d, 0xe0, 0x00, 0x07, 0x03, 0xd4, + 0xe0, 0x68, 0x01, 0x30, 0xe0, 0x60, 0x32, 0xe0, 0x6d, 0x4d, 0x91, 0xf8, + 0xbe, 0x10, 0x2a, 0x68, 0x92, 0xf8, 0x9c, 0x00, 0x92, 0xf8, 0x9d, 0x20, + 0x00, 0xf0, 0x3f, 0x03, 0x62, 0xf3, 0x87, 0x13, 0x8b, 0x42, 0x24, 0xd1, + 0x21, 0x68, 0x44, 0xf6, 0x3e, 0x12, 0x01, 0xf1, 0x01, 0x01, 0x21, 0x60, + 0x49, 0x49, 0x09, 0x78, 0x11, 0x44, 0x49, 0x4a, 0x11, 0x60, 0xc0, 0xb1, + 0x48, 0x48, 0x00, 0x68, 0x80, 0x47, 0x99, 0xf8, 0x00, 0x00, 0xc0, 0xeb, + 0x40, 0x10, 0x0a, 0xeb, 0xc0, 0x00, 0x90, 0xf8, 0xbe, 0x40, 0x44, 0x48, + 0xd0, 0xf8, 0x00, 0x80, 0x28, 0x68, 0x90, 0xf8, 0x72, 0x50, 0x42, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x03, 0x46, 0x00, 0x20, 0x29, 0x46, 0x22, 0x46, + 0xc0, 0x47, 0xdf, 0xf8, 0xe4, 0x80, 0xd8, 0xf8, 0x00, 0x00, 0x00, 0x69, + 0x00, 0x79, 0x20, 0xb3, 0x99, 0xf8, 0x00, 0x00, 0xc0, 0xeb, 0x40, 0x10, + 0x0a, 0xeb, 0xc0, 0x00, 0x00, 0xf1, 0xc0, 0x01, 0x37, 0x48, 0xd0, 0xf8, + 0x00, 0xb0, 0x37, 0x48, 0x06, 0x68, 0x37, 0x48, 0x02, 0x68, 0x12, 0xa8, + 0x90, 0x47, 0x12, 0xaf, 0xdd, 0xe9, 0x17, 0x45, 0x8f, 0xcf, 0xcd, 0xe9, + 0x00, 0x74, 0x02, 0x95, 0xb0, 0x47, 0x32, 0x49, 0xca, 0x78, 0xd8, 0xf8, + 0x00, 0x10, 0x09, 0x69, 0x02, 0x31, 0xd8, 0x47, 0xd8, 0xf8, 0x00, 0x10, + 0x09, 0x69, 0x08, 0x70, 0x1c, 0xe0, 0x99, 0xf8, 0x00, 0x00, 0xc0, 0xeb, + 0x40, 0x10, 0x0a, 0xeb, 0xc0, 0x00, 0x00, 0xf1, 0xc0, 0x01, 0x26, 0x48, + 0x04, 0x68, 0x26, 0x48, 0x02, 0x68, 0x0b, 0xa8, 0x90, 0x47, 0x0b, 0xaf, + 0xef, 0xcf, 0x8d, 0xe8, 0xe0, 0x00, 0xa0, 0x47, 0xd8, 0xf8, 0x00, 0x10, + 0x01, 0x22, 0x09, 0x69, 0x0a, 0x71, 0x20, 0x4a, 0x08, 0x70, 0xd2, 0x78, + 0x90, 0x40, 0x48, 0x80, 0x99, 0xf8, 0x00, 0x00, 0xc0, 0xeb, 0x40, 0x10, + 0x0a, 0xeb, 0xc0, 0x00, 0x00, 0xf1, 0xc0, 0x01, 0x18, 0x48, 0x02, 0x68, + 0x04, 0xa8, 0x90, 0x47, 0x15, 0x4f, 0x04, 0xae, 0x7f, 0xce, 0x8d, 0xe8, + 0x70, 0x00, 0x3f, 0x68, 0x4f, 0xf4, 0xff, 0x74, 0x54, 0xfa, 0x96, 0xf4, + 0xb8, 0x47, 0x01, 0x46, 0xc4, 0xf3, 0x47, 0x00, 0x0f, 0xf0, 0x8e, 0xf8, + 0x10, 0x48, 0x00, 0x68, 0x80, 0x47, 0x19, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x04, 0x36, 0x01, 0x00, 0xa4, 0xba, 0x08, 0x00, 0x74, 0x87, 0x08, 0x00, + 0x0c, 0x6f, 0x01, 0x00, 0xf8, 0x35, 0x01, 0x00, 0xa8, 0x0d, 0x01, 0x00, + 0x54, 0x11, 0x21, 0x40, 0x8c, 0xbb, 0x08, 0x00, 0xf0, 0xb7, 0x08, 0x00, + 0xc8, 0xb7, 0x08, 0x00, 0x10, 0xb8, 0x08, 0x00, 0x1c, 0xb8, 0x08, 0x00, + 0x18, 0xb8, 0x08, 0x00, 0x00, 0x69, 0x08, 0x00, 0xa0, 0xba, 0x08, 0x00, + 0x80, 0xb5, 0x00, 0xf0, 0x39, 0xf8, 0x0d, 0x48, 0x41, 0x7a, 0xc9, 0x07, + 0x14, 0xd0, 0x0c, 0x49, 0x09, 0x68, 0x91, 0xf8, 0x78, 0x20, 0x91, 0xf8, + 0x8b, 0x10, 0x04, 0x29, 0x28, 0xbf, 0x04, 0x21, 0x08, 0x44, 0x80, 0x7a, + 0x90, 0x42, 0x07, 0xd2, 0x06, 0x49, 0x07, 0x4a, 0x5c, 0x23, 0x09, 0x78, + 0x11, 0xfb, 0x03, 0x21, 0x81, 0xf8, 0x4f, 0x00, 0x80, 0xbd, 0x00, 0xbf, + 0xcc, 0x2c, 0x06, 0x00, 0xf8, 0x35, 0x01, 0x00, 0x74, 0x87, 0x08, 0x00, + 0x44, 0x4f, 0x01, 0x00, 0x03, 0x48, 0x04, 0x49, 0x01, 0x60, 0x04, 0x48, + 0x04, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, 0x58, 0xd3, 0x08, 0x00, + 0xf8, 0x25, 0x04, 0x00, 0xa4, 0xd3, 0x08, 0x00, 0xd8, 0x25, 0x04, 0x00, + 0x40, 0xf6, 0x49, 0x0c, 0xc1, 0xf2, 0x0a, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x40, 0xf6, 0xff, 0x1c, 0xc1, 0xf2, 0x0a, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0xaf, 0x07, 0x0a, 0x10, 0x13, 0xf1, 0x08, 0x10, 0x43, 0x08, 0x0a, 0x10, + 0x65, 0x23, 0x04, 0x00, 0xf1, 0x70, 0x0f, 0x10, 0x9d, 0x23, 0x04, 0x00, + 0xe9, 0x70, 0x0f, 0x10, 0x6b, 0x00, 0x00, 0x00, 0x55, 0x25, 0x04, 0x00, + 0x7b, 0x0a, 0x0a, 0x10, 0x09, 0x0b, 0x0a, 0x10, 0x1d, 0x0b, 0x0a, 0x10, + 0xf1, 0x70, 0x0f, 0x10, 0xbf, 0x0b, 0x0a, 0x10, 0xe9, 0x70, 0x0f, 0x10, + 0x72, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x43, 0x06, 0x46, 0x49, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x00, 0x28, 0x45, 0xd0, 0x04, 0x46, 0x46, 0x60, + 0x93, 0x20, 0x0c, 0x21, 0x04, 0xf1, 0x08, 0x05, 0x20, 0x70, 0x28, 0x46, + 0xe1, 0xf7, 0x3a, 0xfb, 0xff, 0x20, 0xa0, 0x73, 0xd6, 0xf8, 0xd4, 0x00, + 0x40, 0x7f, 0xb8, 0xb3, 0x3f, 0x48, 0x96, 0xf9, 0x3d, 0x13, 0x4f, 0xf4, + 0xa8, 0x72, 0x00, 0x68, 0x11, 0xfb, 0x02, 0x00, 0x90, 0xf8, 0x31, 0x11, + 0x89, 0x07, 0x21, 0xd5, 0x3a, 0x4a, 0x90, 0xf8, 0x32, 0x11, 0x00, 0xf2, + 0x33, 0x10, 0x12, 0x68, 0x90, 0x47, 0xff, 0x28, 0x18, 0xd0, 0x37, 0x49, + 0x34, 0x22, 0x09, 0x68, 0x10, 0xfb, 0x02, 0x10, 0x35, 0x49, 0x10, 0x22, + 0xee, 0xf7, 0x9e, 0xfe, 0x70, 0xb1, 0x34, 0x48, 0x34, 0x49, 0x06, 0x23, + 0x00, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x01, 0xeb, 0xc0, 0x00, 0x06, 0x21, + 0xd0, 0xf8, 0xa4, 0x00, 0x82, 0x1d, 0x28, 0x46, 0xde, 0xf7, 0xbe, 0xfc, + 0x2c, 0x48, 0x2d, 0x49, 0x00, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x01, 0xeb, + 0xc0, 0x00, 0x32, 0xe0, 0xbd, 0xe8, 0xf8, 0x83, 0xdf, 0xf8, 0x9c, 0x80, + 0x28, 0x49, 0xdf, 0xf8, 0x9c, 0x90, 0x98, 0xf8, 0x00, 0x70, 0xce, 0x6c, + 0xc7, 0xeb, 0x47, 0x10, 0x96, 0xf8, 0x9c, 0x10, 0x09, 0xeb, 0xc0, 0x00, + 0x90, 0xf8, 0xbb, 0x00, 0xff, 0x28, 0x05, 0xd1, 0x88, 0x07, 0x18, 0xd5, + 0x1b, 0x48, 0xc0, 0x79, 0xff, 0x28, 0x14, 0xd0, 0x89, 0x07, 0x12, 0xd5, + 0x18, 0x49, 0x34, 0x22, 0x09, 0x68, 0x10, 0xfb, 0x02, 0x10, 0x17, 0x49, + 0x10, 0x22, 0xee, 0xf7, 0x61, 0xfe, 0x40, 0xb1, 0x06, 0xf1, 0xa0, 0x02, + 0x28, 0x46, 0x06, 0x21, 0x06, 0x23, 0xde, 0xf7, 0x89, 0xfc, 0x98, 0xf8, + 0x00, 0x70, 0xc7, 0xeb, 0x47, 0x10, 0x09, 0xeb, 0xc0, 0x00, 0x90, 0xf8, + 0xb9, 0x10, 0x89, 0x07, 0x44, 0xbf, 0x90, 0xf8, 0xbb, 0x00, 0xa0, 0x73, + 0x0e, 0x48, 0x00, 0xf1, 0x60, 0x01, 0x20, 0x46, 0xe0, 0xf7, 0x4c, 0xfe, + 0x0c, 0x48, 0x05, 0x21, 0x00, 0x78, 0xbd, 0xe8, 0xf8, 0x43, 0xde, 0xf7, + 0x75, 0xbc, 0x00, 0xbf, 0xe8, 0xb9, 0x08, 0x00, 0xdc, 0x35, 0x01, 0x00, + 0x48, 0xc9, 0x08, 0x00, 0x20, 0x54, 0x01, 0x00, 0x9a, 0xad, 0x09, 0x10, + 0x74, 0x87, 0x08, 0x00, 0x0c, 0x6f, 0x01, 0x00, 0xfc, 0x70, 0x01, 0x00, + 0x2c, 0xba, 0x01, 0x00, 0x67, 0x34, 0x01, 0x00, 0x01, 0x48, 0x02, 0x49, + 0x01, 0x60, 0x70, 0x47, 0xe4, 0x8e, 0x08, 0x00, 0x19, 0x26, 0x04, 0x00, + 0x2d, 0xe9, 0xfc, 0x47, 0x04, 0x46, 0x90, 0xf8, 0x12, 0xa0, 0x45, 0x68, + 0xc0, 0x7c, 0x01, 0x07, 0x4e, 0xd4, 0x40, 0xf0, 0x04, 0x00, 0x95, 0xf8, + 0x28, 0x91, 0x21, 0x46, 0xe0, 0x74, 0x66, 0x48, 0x02, 0x68, 0x28, 0x46, + 0x90, 0x47, 0x80, 0x46, 0x61, 0x48, 0x64, 0x4a, 0x68, 0x23, 0xb8, 0xf1, + 0x16, 0x0f, 0x00, 0xf2, 0x57, 0x31, 0x04, 0xbf, 0x91, 0xf8, 0x2b, 0x00, + 0xa0, 0x74, 0x95, 0xf8, 0x35, 0x01, 0x10, 0xfb, 0x03, 0x23, 0x93, 0xf8, + 0x2e, 0x30, 0x01, 0x2b, 0x17, 0xd1, 0x23, 0x7d, 0x66, 0x2b, 0x14, 0xd1, + 0xa3, 0x7c, 0x91, 0xf8, 0x2c, 0x60, 0xb3, 0x42, 0x02, 0xd8, 0x0b, 0x78, + 0x01, 0x33, 0xa3, 0x74, 0x68, 0x26, 0xdf, 0xb2, 0x10, 0xfb, 0x06, 0x26, + 0x32, 0x46, 0x12, 0xf8, 0x4a, 0xcf, 0xbc, 0x45, 0x1c, 0xbf, 0x01, 0x27, + 0x86, 0xf8, 0x4b, 0x70, 0x13, 0x70, 0x95, 0xf8, 0x3e, 0x23, 0xa3, 0x7c, + 0xd2, 0x07, 0x45, 0xd0, 0x91, 0xf8, 0x51, 0x20, 0x93, 0x42, 0x41, 0xd2, + 0xa2, 0x74, 0x95, 0xf8, 0x29, 0x31, 0x03, 0xf0, 0x1e, 0x03, 0x1e, 0x2b, + 0x28, 0xd1, 0x95, 0xf8, 0x28, 0x31, 0xc3, 0xf3, 0x41, 0x06, 0x03, 0x2e, + 0x26, 0xd1, 0x91, 0xf8, 0x52, 0xc0, 0x2c, 0xe0, 0xdf, 0x49, 0x91, 0xf8, + 0x81, 0x23, 0x92, 0x45, 0x15, 0xd9, 0x91, 0xf8, 0x82, 0x13, 0xa1, 0x74, + 0x89, 0xb1, 0x12, 0x20, 0x8d, 0xf8, 0x05, 0x10, 0x01, 0xa9, 0x8d, 0xf8, + 0x06, 0x00, 0x20, 0x7d, 0x8d, 0xf8, 0x04, 0x00, 0x95, 0xf8, 0x35, 0x01, + 0x8d, 0xf8, 0x07, 0x00, 0x35, 0x48, 0x02, 0x68, 0x15, 0x20, 0x90, 0x47, + 0xe0, 0x7c, 0x00, 0xf0, 0xfb, 0x00, 0xe0, 0x74, 0xbd, 0xe8, 0xfc, 0x87, + 0x91, 0xf8, 0x52, 0x30, 0xa3, 0x74, 0x0d, 0xe0, 0x5b, 0x08, 0x5b, 0x07, + 0x09, 0xd0, 0x91, 0xf8, 0x52, 0x30, 0xd4, 0x46, 0x9a, 0x45, 0x13, 0x46, + 0x04, 0xd1, 0x63, 0x46, 0x84, 0xf8, 0x12, 0xc0, 0x00, 0xe0, 0x13, 0x46, + 0x91, 0xf8, 0x2d, 0x10, 0x8b, 0x42, 0x17, 0xd2, 0x05, 0x21, 0x09, 0xf0, + 0x05, 0x02, 0x01, 0xea, 0x59, 0x01, 0x11, 0x44, 0x01, 0xf0, 0x03, 0x02, + 0x02, 0xeb, 0x91, 0x01, 0x95, 0xf8, 0x25, 0x21, 0x91, 0x42, 0x09, 0xd8, + 0xbf, 0x49, 0xb5, 0xf8, 0xdc, 0x22, 0x89, 0x7f, 0x51, 0x43, 0xd5, 0xf8, + 0xf0, 0x20, 0xb2, 0xeb, 0x81, 0x0f, 0x2e, 0xd2, 0x08, 0x23, 0x01, 0x21, + 0x1b, 0x4a, 0x16, 0x68, 0x01, 0x22, 0xb0, 0x47, 0x95, 0xf8, 0x29, 0x01, + 0x40, 0x08, 0xf9, 0xf7, 0xe7, 0xff, 0x04, 0x28, 0x09, 0xd3, 0x17, 0x48, + 0x01, 0x68, 0x17, 0x48, 0x88, 0x47, 0xa1, 0x7c, 0x00, 0xf0, 0x01, 0x00, + 0x08, 0x44, 0x03, 0x30, 0x01, 0xe0, 0xa1, 0x7c, 0x08, 0x44, 0xc1, 0xb2, + 0xa0, 0x74, 0x51, 0x45, 0x0f, 0xd0, 0x8d, 0xf8, 0x01, 0x00, 0x20, 0x7d, + 0x69, 0x46, 0x8d, 0xf8, 0x02, 0x80, 0x8d, 0xf8, 0x00, 0x00, 0x95, 0xf8, + 0x35, 0x01, 0x8d, 0xf8, 0x03, 0x00, 0xd5, 0x48, 0x02, 0x68, 0x15, 0x20, + 0x90, 0x47, 0xbd, 0xe8, 0xfc, 0x87, 0x36, 0x23, 0x00, 0x21, 0xcf, 0xe7, + 0x8c, 0x7e, 0x08, 0x00, 0x1c, 0xa1, 0x08, 0x00, 0x94, 0xd1, 0x08, 0x00, + 0xb0, 0xe6, 0x05, 0x00, 0x04, 0xa1, 0x08, 0x00, 0xa0, 0x8e, 0x08, 0x00, + 0xf8, 0x6d, 0x01, 0x00, 0x2d, 0xe9, 0xfe, 0x4f, 0xd0, 0xf8, 0x84, 0xb2, + 0x0c, 0x46, 0x05, 0x46, 0xbb, 0xf1, 0x00, 0x0f, 0x03, 0xd1, 0x00, 0x20, + 0xe0, 0x21, 0xde, 0xf7, 0x4d, 0xfb, 0xd9, 0x46, 0x95, 0xf8, 0x35, 0x01, + 0xc0, 0x4e, 0x68, 0x21, 0xb5, 0xf8, 0xdc, 0x72, 0x59, 0xf8, 0x08, 0x2f, + 0x10, 0xfb, 0x01, 0x60, 0x4f, 0xea, 0x87, 0x0a, 0x00, 0x97, 0xd9, 0xf8, + 0x04, 0x30, 0xc0, 0xe9, 0x0e, 0x23, 0xcd, 0xe9, 0x01, 0x23, 0x95, 0xf8, + 0x35, 0x01, 0x10, 0xfb, 0x01, 0x61, 0x08, 0x46, 0x30, 0xf8, 0x48, 0x2f, + 0xb2, 0xeb, 0x87, 0x0f, 0x1c, 0xbf, 0x01, 0x22, 0x81, 0xf8, 0x4b, 0x20, + 0xa0, 0xf8, 0x00, 0xa0, 0x7e, 0x48, 0x27, 0x46, 0x90, 0xf8, 0x4d, 0x20, + 0x90, 0xf8, 0x4e, 0x30, 0x90, 0xf8, 0x4c, 0x10, 0x1a, 0x44, 0x02, 0xeb, + 0x42, 0x02, 0x11, 0x44, 0x0a, 0x06, 0x0b, 0xd0, 0xc9, 0xb2, 0x03, 0x20, + 0xb1, 0xfb, 0xf0, 0xf0, 0x0b, 0x29, 0x00, 0xf1, 0x01, 0x00, 0x88, 0xbf, + 0x04, 0x20, 0x4f, 0xf0, 0x00, 0x08, 0x34, 0xe0, 0x00, 0xf1, 0x08, 0x02, + 0x71, 0x48, 0x00, 0x21, 0x4f, 0xf0, 0x00, 0x08, 0x03, 0x68, 0x70, 0x48, + 0x90, 0xf8, 0x81, 0x03, 0x01, 0x38, 0xc0, 0xb2, 0x98, 0x47, 0x28, 0xb3, + 0x39, 0x68, 0x82, 0x68, 0x53, 0x1a, 0x23, 0xf0, 0x70, 0x43, 0xb3, 0xf1, + 0x00, 0x6f, 0x06, 0xd8, 0x8a, 0x42, 0x19, 0xd1, 0xb9, 0x88, 0x82, 0x89, + 0x3c, 0x46, 0x8a, 0x42, 0x14, 0xd2, 0x00, 0x7d, 0xa0, 0xf1, 0x44, 0x01, + 0x1f, 0x29, 0x06, 0xd8, 0x01, 0x22, 0x02, 0xfa, 0x01, 0xf1, 0x62, 0x4a, + 0x11, 0x42, 0x40, 0xf0, 0xb9, 0x80, 0x32, 0x28, 0x00, 0xf0, 0xb6, 0x80, + 0x02, 0x28, 0x03, 0xd1, 0x00, 0x20, 0x4f, 0xf0, 0x16, 0x08, 0x02, 0xe0, + 0x4f, 0xf0, 0x00, 0x08, 0x00, 0x20, 0x5b, 0x49, 0x64, 0x22, 0x01, 0x44, + 0x91, 0xf8, 0x84, 0x10, 0x0a, 0xfb, 0x01, 0xf1, 0xb1, 0xfb, 0xf2, 0xf4, + 0x30, 0xb1, 0x43, 0xf6, 0xe3, 0x60, 0xb8, 0x46, 0x81, 0x42, 0x0a, 0xd9, + 0xa0, 0x24, 0x14, 0xe0, 0xb8, 0xf1, 0x00, 0x0f, 0x10, 0xd0, 0x52, 0x48, + 0x81, 0x42, 0x09, 0xd3, 0xc8, 0xf5, 0x96, 0x64, 0x0a, 0xe0, 0xaa, 0xeb, + 0x04, 0x00, 0x0c, 0x28, 0x38, 0xbf, 0xaa, 0xf1, 0x0c, 0x04, 0x04, 0xe0, + 0xb4, 0xeb, 0x08, 0x00, 0x88, 0xbf, 0x04, 0x46, 0xb8, 0x46, 0x95, 0xf8, + 0x35, 0x01, 0x68, 0x21, 0x48, 0x4b, 0x10, 0xfb, 0x01, 0x61, 0x1b, 0x68, + 0x08, 0x46, 0x50, 0xf8, 0x30, 0x2f, 0x9c, 0x42, 0x88, 0xbf, 0x1c, 0x46, + 0xa2, 0x42, 0x1c, 0xbf, 0x01, 0x22, 0x81, 0xf8, 0x4b, 0x20, 0x04, 0x60, + 0x3c, 0x49, 0x01, 0x98, 0x91, 0xf8, 0x59, 0x23, 0x91, 0xf8, 0x81, 0x13, + 0x20, 0x44, 0x20, 0xf0, 0x70, 0x47, 0x9b, 0xf8, 0x12, 0x00, 0x01, 0x97, + 0x88, 0x42, 0x98, 0xbf, 0x0a, 0x46, 0x34, 0x49, 0x50, 0x1e, 0xc0, 0xb2, + 0x42, 0x46, 0x0b, 0x68, 0x00, 0x21, 0x98, 0x47, 0x95, 0xf8, 0x35, 0x11, + 0x00, 0x28, 0x4a, 0xd0, 0x68, 0x22, 0x11, 0xfb, 0x02, 0x62, 0x92, 0xf8, + 0x2e, 0x20, 0x01, 0x2a, 0x32, 0xd1, 0x9b, 0xf8, 0x14, 0x20, 0x66, 0x2a, + 0x2e, 0xd1, 0x02, 0x7d, 0x37, 0x2a, 0x1f, 0xd1, 0x42, 0x68, 0xd2, 0xf8, + 0xd0, 0x20, 0x12, 0x78, 0x02, 0x2a, 0x19, 0xd1, 0x68, 0x22, 0x00, 0x9f, + 0x11, 0xfb, 0x02, 0x63, 0x1a, 0x46, 0x18, 0x2f, 0x52, 0xf8, 0x34, 0x5f, + 0x28, 0xbf, 0x18, 0x27, 0xbc, 0x42, 0x38, 0xbf, 0x27, 0x46, 0xbd, 0x42, + 0x1c, 0xbf, 0x01, 0x24, 0x83, 0xf8, 0x4b, 0x40, 0x17, 0x60, 0xd9, 0xf8, + 0x00, 0x20, 0x3a, 0x44, 0x22, 0xf0, 0x70, 0x47, 0x01, 0x97, 0x0b, 0xe0, + 0x68, 0x22, 0x11, 0xfb, 0x02, 0x62, 0x13, 0x46, 0x53, 0xf8, 0x34, 0x4f, + 0x24, 0xb1, 0x00, 0x24, 0x1c, 0x60, 0x01, 0x23, 0x82, 0xf8, 0x4b, 0x30, + 0x02, 0x46, 0x52, 0xf8, 0x08, 0x3f, 0xdc, 0x1b, 0x24, 0x01, 0x06, 0xd4, + 0xbb, 0x42, 0x08, 0xd1, 0x80, 0x89, 0xbd, 0xf8, 0x08, 0x30, 0x83, 0x42, + 0x03, 0xd9, 0xd2, 0xe9, 0x00, 0x02, 0xcd, 0xe9, 0x01, 0x02, 0x68, 0x20, + 0x11, 0xfb, 0x00, 0x60, 0xdd, 0xe9, 0x01, 0x12, 0xc0, 0xe9, 0x10, 0x12, + 0xc5, 0x48, 0x0b, 0x49, 0x42, 0x46, 0x03, 0x68, 0x01, 0xa8, 0x98, 0x47, + 0xbd, 0xe8, 0xfe, 0x8f, 0x01, 0x20, 0x18, 0xe7, 0x18, 0x74, 0x01, 0x00, + 0xa8, 0xeb, 0x08, 0x00, 0x8c, 0x7e, 0x08, 0x00, 0x03, 0x00, 0x00, 0x90, + 0xe8, 0x65, 0x08, 0x00, 0x24, 0xd5, 0x01, 0x00, 0xa0, 0x5a, 0x01, 0x00, + 0x7c, 0x0e, 0x01, 0x00, 0x7c, 0xb5, 0x46, 0x68, 0x05, 0x46, 0x00, 0xf0, + 0xf1, 0xfa, 0x04, 0x46, 0x96, 0xf8, 0x35, 0x01, 0x25, 0x49, 0x68, 0x22, + 0xb6, 0xf8, 0xdc, 0x32, 0x01, 0x2c, 0x10, 0xfb, 0x02, 0x12, 0xb6, 0xf8, + 0x14, 0x13, 0xa2, 0xf8, 0x5a, 0x30, 0x92, 0xf8, 0x5c, 0x30, 0xa2, 0xf8, + 0x58, 0x10, 0x43, 0xf0, 0x01, 0x03, 0x82, 0xf8, 0x5c, 0x30, 0x0b, 0xd1, + 0x8d, 0xf8, 0x05, 0x00, 0x28, 0x7d, 0xad, 0xf8, 0x06, 0x10, 0x01, 0xa9, + 0x8d, 0xf8, 0x04, 0x00, 0x18, 0x48, 0x02, 0x68, 0x1f, 0x20, 0x90, 0x47, + 0x20, 0x46, 0x7c, 0xbd, 0x7c, 0xb5, 0x46, 0x68, 0x05, 0x46, 0x00, 0xf0, + 0xcd, 0xfa, 0x04, 0x46, 0x96, 0xf8, 0x35, 0x01, 0x10, 0x49, 0x68, 0x22, + 0xb6, 0xf8, 0xdc, 0x32, 0x01, 0x2c, 0x10, 0xfb, 0x02, 0x12, 0xb6, 0xf8, + 0x14, 0x13, 0xa2, 0xf8, 0x5a, 0x30, 0x92, 0xf8, 0x5c, 0x30, 0xa2, 0xf8, + 0x58, 0x10, 0x43, 0xf0, 0x01, 0x03, 0x82, 0xf8, 0x5c, 0x30, 0x0b, 0xd1, + 0x8d, 0xf8, 0x05, 0x00, 0x28, 0x7d, 0xad, 0xf8, 0x06, 0x10, 0x01, 0xa9, + 0x8d, 0xf8, 0x04, 0x00, 0x03, 0x48, 0x02, 0x68, 0x1f, 0x20, 0x90, 0x47, + 0x20, 0x46, 0x7c, 0xbd, 0xb0, 0xe6, 0x05, 0x00, 0x1c, 0xa1, 0x08, 0x00, + 0x10, 0xb5, 0x04, 0x46, 0xd0, 0xf8, 0xd4, 0x00, 0x40, 0x7f, 0xe8, 0xb9, + 0x94, 0xf8, 0x29, 0x01, 0x94, 0xf8, 0x30, 0x11, 0x08, 0x43, 0x40, 0x08, + 0xf9, 0xf7, 0x0e, 0xfe, 0xa0, 0xb9, 0x94, 0xf8, 0x2b, 0x01, 0x94, 0xf8, + 0x2c, 0x11, 0x94, 0xf8, 0x2d, 0x21, 0x94, 0xf8, 0x2e, 0x31, 0x08, 0x43, + 0x10, 0x43, 0x18, 0x43, 0x40, 0x08, 0xf9, 0xf7, 0xff, 0xfd, 0x05, 0x28, + 0x04, 0xd3, 0xb4, 0xf8, 0xe4, 0x02, 0x08, 0xb1, 0x00, 0x20, 0x10, 0xbd, + 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, 0x81, 0xba, 0x00, 0xbf, + 0x10, 0xb5, 0x04, 0x46, 0xd0, 0xf8, 0x10, 0x03, 0xa8, 0xb9, 0xb4, 0xf9, + 0x84, 0x00, 0xb0, 0xf1, 0xff, 0x3f, 0x10, 0xdc, 0xb4, 0xf8, 0x14, 0x13, + 0xb4, 0xf8, 0x16, 0x23, 0x51, 0x1a, 0x09, 0xb2, 0xb1, 0xf1, 0xff, 0x3f, + 0x07, 0xdc, 0x6f, 0xf3, 0xdf, 0x30, 0xa4, 0xf8, 0x84, 0x00, 0x04, 0x48, + 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, + 0x00, 0xf0, 0x66, 0xba, 0x10, 0xb5, 0x08, 0x00, 0x80, 0xb5, 0x41, 0x68, + 0xb1, 0xf8, 0x38, 0x23, 0x12, 0x07, 0x03, 0xd4, 0xbd, 0xe8, 0x80, 0x40, + 0x00, 0xf0, 0x60, 0xba, 0x02, 0x7d, 0x6a, 0x2a, 0x05, 0xd1, 0xb1, 0xf8, + 0x84, 0x20, 0x22, 0xf0, 0x40, 0x02, 0xa1, 0xf8, 0x84, 0x20, 0xeb, 0xf7, + 0xc7, 0xff, 0x00, 0x20, 0x80, 0xbd, 0x00, 0xbf, 0xfe, 0xb5, 0x04, 0x46, + 0xd0, 0xf8, 0xd4, 0x00, 0x15, 0x46, 0x40, 0x7f, 0xe0, 0xb1, 0x56, 0x4e, + 0xd4, 0xf8, 0x20, 0x23, 0x30, 0x46, 0x50, 0xf8, 0x08, 0x1f, 0x53, 0x1a, + 0x1b, 0x01, 0x06, 0xd4, 0x8a, 0x42, 0x1d, 0xd1, 0xb4, 0xf8, 0x24, 0x13, + 0x82, 0x88, 0x8a, 0x42, 0x18, 0xd9, 0x4f, 0x4a, 0x04, 0xf5, 0x48, 0x71, + 0x13, 0x68, 0x01, 0xaa, 0x98, 0x47, 0xbd, 0xf8, 0x08, 0x10, 0x01, 0x98, + 0x59, 0xb1, 0x01, 0x30, 0x01, 0x90, 0x08, 0xe0, 0xd4, 0xf8, 0x84, 0x02, + 0x00, 0x68, 0x42, 0x1a, 0x12, 0x01, 0x2c, 0xd5, 0x08, 0x1a, 0x20, 0xf0, + 0x70, 0x40, 0x01, 0x30, 0x40, 0x08, 0x27, 0xe0, 0x94, 0xf8, 0x8c, 0x10, + 0x49, 0x07, 0x22, 0xd4, 0x40, 0x49, 0x01, 0xaa, 0x0b, 0x68, 0xd4, 0xf8, + 0x84, 0x12, 0x08, 0x31, 0x98, 0x47, 0x01, 0x99, 0x40, 0xf2, 0x71, 0x20, + 0xd4, 0xf8, 0x1c, 0x23, 0x48, 0x43, 0xd4, 0xf8, 0x84, 0x12, 0xa2, 0xeb, + 0x50, 0x00, 0xbd, 0xf8, 0x08, 0x20, 0xa0, 0xeb, 0x12, 0x10, 0xc4, 0xf8, + 0x1c, 0x03, 0x56, 0xf8, 0x08, 0x0f, 0x72, 0x68, 0xc1, 0xe9, 0x02, 0x02, + 0xce, 0x4a, 0xd4, 0xf8, 0x84, 0x02, 0x81, 0x68, 0x11, 0x40, 0x01, 0x60, + 0xfe, 0xbd, 0x01, 0x20, 0xd4, 0xf8, 0xf8, 0x20, 0xb0, 0xfb, 0xf2, 0xf1, + 0x4a, 0x43, 0x82, 0x42, 0x38, 0xbf, 0x01, 0x31, 0xb4, 0xf8, 0x40, 0x04, + 0x02, 0x28, 0x05, 0xd3, 0x29, 0x48, 0x89, 0xb2, 0x02, 0x68, 0x20, 0x46, + 0x90, 0x47, 0x01, 0x46, 0xd4, 0xf8, 0xd4, 0x00, 0x40, 0x7f, 0xe8, 0xb1, + 0xb4, 0xf8, 0xe4, 0x02, 0xd0, 0xb1, 0x94, 0xf8, 0x3a, 0x23, 0x80, 0x2a, + 0x16, 0xd1, 0x22, 0x6a, 0xa2, 0xb9, 0xa2, 0x68, 0x92, 0xb9, 0x20, 0x4a, + 0x92, 0xf8, 0xc3, 0x20, 0x22, 0xb1, 0xd4, 0xf8, 0x54, 0x23, 0x0a, 0xb1, + 0x92, 0x88, 0x4a, 0xb1, 0xb4, 0xf8, 0x40, 0x24, 0x02, 0x2a, 0x02, 0xd3, + 0x02, 0xfb, 0x00, 0x11, 0x02, 0xe0, 0x81, 0x42, 0x98, 0xbf, 0x41, 0x1c, + 0x17, 0x48, 0xb4, 0xf8, 0x14, 0x63, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, + 0xb4, 0xf8, 0x14, 0x23, 0x94, 0xf8, 0xb8, 0x32, 0x90, 0x1b, 0x01, 0x2b, + 0x86, 0xb2, 0x0a, 0xd0, 0x94, 0xf8, 0xb9, 0x02, 0x00, 0xfb, 0x06, 0xf1, + 0x0f, 0x48, 0x07, 0x68, 0x04, 0xf5, 0x22, 0x70, 0xb8, 0x47, 0x84, 0xf8, + 0x89, 0x02, 0x00, 0x2d, 0x08, 0xbf, 0x01, 0x26, 0x4e, 0xb1, 0x0b, 0x4f, + 0x04, 0xf5, 0x94, 0x74, 0x00, 0x25, 0x39, 0x68, 0x20, 0x46, 0x88, 0x47, + 0x01, 0x35, 0xb5, 0x42, 0xf9, 0xd1, 0xfe, 0xbd, 0x18, 0x74, 0x01, 0x00, + 0x44, 0xa1, 0x08, 0x00, 0x58, 0xd1, 0x08, 0x00, 0xd0, 0x32, 0x06, 0x00, + 0x5c, 0xd1, 0x08, 0x00, 0x50, 0xd1, 0x08, 0x00, 0x50, 0xd2, 0x08, 0x00, + 0xfe, 0xb5, 0x04, 0x46, 0x20, 0xb9, 0x00, 0x20, 0x40, 0xf2, 0xa9, 0x21, + 0xde, 0xf7, 0x96, 0xf8, 0xb4, 0xf8, 0x38, 0x03, 0x01, 0x07, 0x16, 0xd5, + 0x94, 0xf8, 0x35, 0x11, 0x8b, 0x4a, 0x68, 0x23, 0x11, 0xfb, 0x03, 0x21, + 0xb1, 0xf8, 0x64, 0x10, 0xc9, 0x07, 0x0c, 0xd1, 0x88, 0x49, 0x0b, 0x68, + 0xc0, 0xf3, 0x00, 0x12, 0x99, 0x20, 0x21, 0x46, 0x98, 0x47, 0xb4, 0xf8, + 0x38, 0x03, 0x20, 0xf0, 0x98, 0x00, 0xa4, 0xf8, 0x38, 0x03, 0xd4, 0xf8, + 0x0c, 0x03, 0x18, 0xb1, 0xb4, 0xf8, 0x84, 0x10, 0x89, 0x06, 0x02, 0xd4, + 0x00, 0x25, 0x28, 0x46, 0xfe, 0xbd, 0x7e, 0x4a, 0xb4, 0xf8, 0x14, 0x13, + 0x00, 0x8b, 0x12, 0x68, 0x90, 0x47, 0x00, 0x25, 0x90, 0xb1, 0x01, 0x28, + 0x2a, 0xd0, 0x02, 0x28, 0xf1, 0xd1, 0xd4, 0xf8, 0x0c, 0x13, 0xb4, 0xf8, + 0x14, 0x03, 0x09, 0x8b, 0x08, 0x1a, 0x01, 0x28, 0xe8, 0xd1, 0xb4, 0xf8, + 0x38, 0x03, 0x40, 0xf0, 0x80, 0x00, 0xa4, 0xf8, 0x38, 0x03, 0xe1, 0xe7, + 0xb4, 0xf8, 0x84, 0x00, 0x21, 0x46, 0x28, 0x22, 0x20, 0xf0, 0x20, 0x00, + 0xa4, 0xf8, 0x84, 0x00, 0x6b, 0x48, 0x03, 0x68, 0x98, 0x20, 0x98, 0x47, + 0x6e, 0x48, 0x94, 0xf8, 0x35, 0x11, 0x00, 0x23, 0x06, 0x68, 0xd4, 0xf8, + 0xd4, 0x00, 0x42, 0x7f, 0x12, 0x20, 0xcd, 0xe9, 0x00, 0x55, 0x02, 0x95, + 0xb0, 0x47, 0xc8, 0xe7, 0xd4, 0xf8, 0xd4, 0x10, 0xb4, 0xf8, 0xdc, 0x02, + 0xd4, 0xf8, 0x0c, 0x53, 0x49, 0x7f, 0x82, 0x00, 0x51, 0xb1, 0xd4, 0xf8, + 0x20, 0x13, 0x11, 0x44, 0x6a, 0x8b, 0x01, 0xeb, 0x82, 0x01, 0x21, 0xf0, + 0x70, 0x43, 0x95, 0xf8, 0x2c, 0x10, 0x0b, 0xe0, 0x95, 0xf8, 0x2c, 0x10, + 0xd4, 0xf8, 0x20, 0x33, 0x58, 0x4e, 0x02, 0xeb, 0x41, 0x02, 0x13, 0x44, + 0x6a, 0x8b, 0x03, 0xeb, 0x82, 0x03, 0x33, 0x40, 0xc4, 0xf8, 0x20, 0x33, + 0x02, 0x44, 0x23, 0xf0, 0x03, 0x03, 0x0a, 0x44, 0xb4, 0xf8, 0xe2, 0x12, + 0xa3, 0x66, 0xb2, 0xeb, 0xc1, 0x0f, 0x04, 0xd3, 0x6a, 0x8c, 0x12, 0x01, + 0x92, 0xb2, 0xc4, 0xf8, 0xf0, 0x20, 0xb4, 0xf8, 0x38, 0x23, 0x48, 0x4e, + 0x68, 0x27, 0x42, 0xf0, 0x08, 0x03, 0xa4, 0xf8, 0x38, 0x33, 0x94, 0xf8, + 0x35, 0x31, 0x13, 0xfb, 0x07, 0x63, 0xb3, 0xf8, 0x64, 0x60, 0x46, 0xf0, + 0x01, 0x06, 0xa3, 0xf8, 0x64, 0x60, 0xab, 0x8b, 0x98, 0x42, 0x0c, 0xd1, + 0xa8, 0x8c, 0xb4, 0xf8, 0xe4, 0x32, 0x83, 0x42, 0x02, 0xd1, 0x68, 0x8c, + 0x81, 0x42, 0x18, 0xd0, 0x42, 0xf0, 0x18, 0x00, 0xa4, 0xf8, 0x38, 0x03, + 0x13, 0xe0, 0x42, 0xf0, 0x18, 0x00, 0xa4, 0xf8, 0x38, 0x03, 0xb4, 0xf8, + 0x46, 0x04, 0x40, 0xf0, 0x02, 0x00, 0xa4, 0xf8, 0x46, 0x04, 0xb4, 0xf8, + 0x40, 0x04, 0x02, 0x28, 0x05, 0xd3, 0x00, 0x20, 0xa4, 0xf8, 0x42, 0x04, + 0x01, 0x20, 0xa4, 0xf8, 0x40, 0x04, 0x04, 0xf5, 0x30, 0x70, 0x29, 0x46, + 0x4c, 0x22, 0xf1, 0xf7, 0xb1, 0xff, 0x2f, 0x48, 0x2d, 0x21, 0x02, 0x68, + 0x2e, 0x48, 0x90, 0x47, 0x2e, 0x48, 0xaf, 0x8b, 0x95, 0xf8, 0x2c, 0x30, + 0x94, 0xf8, 0x35, 0x11, 0x06, 0x68, 0xd4, 0xf8, 0xd4, 0x00, 0x42, 0x7f, + 0x68, 0x8b, 0xad, 0x8c, 0xcd, 0xe9, 0x00, 0x07, 0x10, 0x20, 0x02, 0x95, + 0xb0, 0x47, 0xb4, 0xf8, 0xdc, 0x02, 0x40, 0x00, 0xc4, 0xf8, 0xf8, 0x00, + 0xb4, 0xf8, 0x38, 0x03, 0x40, 0xf0, 0x20, 0x00, 0xa4, 0xf8, 0x38, 0x03, + 0xd4, 0xf8, 0xd4, 0x00, 0x40, 0x7f, 0x30, 0xb1, 0x94, 0xf8, 0x3a, 0x03, + 0x00, 0xf0, 0xfc, 0x00, 0x02, 0x30, 0x84, 0xf8, 0x3a, 0x03, 0x1c, 0x48, + 0x00, 0x68, 0x80, 0x47, 0xc4, 0xf8, 0xd8, 0x00, 0xb4, 0xf8, 0x84, 0x00, + 0x20, 0xf0, 0x10, 0x00, 0xa4, 0xf8, 0x84, 0x00, 0x17, 0x48, 0x00, 0x78, + 0x20, 0xb1, 0x94, 0xf9, 0x82, 0x00, 0xb0, 0xf1, 0xff, 0x3f, 0x0d, 0xdc, + 0xd4, 0xf8, 0xf0, 0x00, 0x50, 0xb1, 0xb4, 0xf8, 0x82, 0x00, 0x08, 0x21, + 0x20, 0xf0, 0x80, 0x00, 0xa4, 0xf8, 0x82, 0x00, 0x0f, 0x48, 0x00, 0x78, + 0xdd, 0xf7, 0x9a, 0xff, 0xd4, 0xf8, 0x0c, 0x03, 0xe3, 0xf7, 0xfe, 0xfd, + 0x00, 0x20, 0x01, 0x25, 0xc4, 0xf8, 0x0c, 0x03, 0x05, 0xe7, 0x00, 0xbf, + 0xb0, 0xe6, 0x05, 0x00, 0xa8, 0xa0, 0x08, 0x00, 0xf8, 0xc9, 0x08, 0x00, + 0xfc, 0xff, 0xff, 0x0f, 0xf4, 0xa0, 0x08, 0x00, 0xfc, 0x70, 0x01, 0x00, + 0x10, 0xbb, 0x08, 0x00, 0xe0, 0xa0, 0x08, 0x00, 0x64, 0x34, 0x01, 0x00, + 0x67, 0x34, 0x01, 0x00, 0x0f, 0x48, 0x10, 0x49, 0x1a, 0x4a, 0x01, 0x60, + 0x0f, 0x48, 0x10, 0x49, 0x01, 0x60, 0x10, 0x48, 0x10, 0x49, 0x01, 0x60, + 0x10, 0x48, 0x11, 0x49, 0x01, 0x60, 0x11, 0x48, 0x11, 0x49, 0x01, 0x60, + 0x11, 0x48, 0x12, 0x49, 0x40, 0xf8, 0x3c, 0x1f, 0x41, 0x62, 0x12, 0x49, + 0x42, 0x61, 0xc0, 0xe9, 0x0b, 0x21, 0xc0, 0xe9, 0x02, 0x21, 0x10, 0x49, + 0xc0, 0xe9, 0x0e, 0x21, 0x01, 0x64, 0x70, 0x47, 0x9c, 0xbb, 0x08, 0x00, + 0x49, 0x29, 0x04, 0x00, 0x98, 0xd1, 0x08, 0x00, 0x75, 0x2c, 0x04, 0x00, + 0xc0, 0xd1, 0x08, 0x00, 0xc9, 0x2c, 0x04, 0x00, 0xb0, 0xd1, 0x08, 0x00, + 0x3d, 0x2d, 0x04, 0x00, 0xcc, 0xd1, 0x08, 0x00, 0xc1, 0x2e, 0x04, 0x00, + 0x90, 0xcf, 0x08, 0x00, 0xc5, 0x2b, 0x04, 0x00, 0x7d, 0x27, 0x04, 0x00, + 0x19, 0x2c, 0x04, 0x00, 0x0d, 0x2d, 0x04, 0x00, 0x4f, 0xf2, 0x85, 0x6c, + 0xc1, 0xf2, 0x08, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4f, 0xf2, 0x15, 0x2c, + 0xc1, 0xf2, 0x08, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x40, 0xf2, 0x71, 0x7c, + 0xc1, 0xf2, 0x09, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4f, 0xf2, 0x69, 0x4c, + 0xc1, 0xf2, 0x08, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4f, 0xf6, 0x9b, 0x0c, + 0xc1, 0xf2, 0x08, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x70, 0xb5, 0x8a, 0x4c, + 0x20, 0x68, 0xb8, 0xb9, 0x87, 0x4d, 0x4d, 0x49, 0x4f, 0xf4, 0xa8, 0x76, + 0x95, 0xf8, 0x1c, 0x01, 0x09, 0x68, 0x10, 0xfb, 0x06, 0xf0, 0x88, 0x47, + 0x20, 0x60, 0x30, 0xb1, 0x95, 0xf8, 0x1c, 0x11, 0x11, 0xfb, 0x06, 0xf1, + 0xe0, 0xf7, 0x98, 0xf8, 0x20, 0x68, 0x18, 0xb9, 0x00, 0x20, 0xf9, 0x21, + 0xdd, 0xf7, 0xec, 0xfe, 0x03, 0x48, 0x00, 0x21, 0xc0, 0xe9, 0x00, 0x11, + 0xc0, 0xe9, 0x02, 0x11, 0x70, 0xbd, 0x00, 0xbf, 0xa8, 0x56, 0x01, 0x00, + 0xfe, 0xb5, 0x00, 0xb3, 0x1e, 0x4d, 0x04, 0x46, 0xdd, 0xe9, 0x0a, 0x60, + 0xdd, 0xe9, 0x08, 0xc7, 0x2d, 0x68, 0xcd, 0xe9, 0x00, 0x76, 0x02, 0x90, + 0x08, 0x46, 0x11, 0x46, 0x1a, 0x46, 0x63, 0x46, 0xa8, 0x47, 0x14, 0x28, + 0x0f, 0xdc, 0x10, 0xf1, 0x80, 0x01, 0x0c, 0xd0, 0x21, 0x6c, 0xca, 0x03, + 0x0a, 0xd4, 0x41, 0xf4, 0x80, 0x31, 0x84, 0xf8, 0x42, 0x01, 0x21, 0x64, + 0x73, 0x49, 0xc9, 0x78, 0x88, 0x40, 0xa4, 0xf8, 0x44, 0x01, 0xfe, 0xbd, + 0x2b, 0x49, 0x94, 0xf8, 0x1d, 0x21, 0x09, 0x68, 0xc2, 0xeb, 0x02, 0x12, + 0x01, 0xeb, 0x42, 0x11, 0x09, 0x89, 0x65, 0x29, 0x05, 0xd3, 0x02, 0x22, + 0xb1, 0xf5, 0xc8, 0x7f, 0x88, 0xbf, 0x01, 0x22, 0x01, 0xe0, 0x68, 0x49, + 0xca, 0x78, 0x05, 0x49, 0x0b, 0x68, 0x04, 0xf5, 0xa2, 0x71, 0x98, 0x47, + 0x84, 0xf8, 0x42, 0x01, 0xfe, 0xbd, 0x00, 0xbf, 0x1c, 0xb8, 0x08, 0x00, + 0x10, 0xb8, 0x08, 0x00, 0xb0, 0xb5, 0x19, 0x4d, 0x53, 0x49, 0x68, 0x68, + 0x01, 0xf2, 0xc3, 0x14, 0x40, 0xb9, 0x17, 0x48, 0x01, 0x68, 0x20, 0x78, + 0xc0, 0xeb, 0xc0, 0x00, 0x80, 0x00, 0x88, 0x47, 0x68, 0x60, 0xd8, 0xb1, + 0x21, 0x78, 0xc1, 0xeb, 0xc1, 0x01, 0x89, 0x00, 0xe0, 0xf7, 0xe2, 0xfc, + 0x10, 0x4d, 0x28, 0x68, 0x70, 0xb9, 0x20, 0x78, 0xc0, 0xeb, 0x00, 0x10, + 0x40, 0x01, 0x0f, 0xf0, 0xd3, 0xfe, 0x28, 0x60, 0x30, 0xb1, 0x21, 0x78, + 0xc1, 0xeb, 0x01, 0x11, 0x49, 0x01, 0x89, 0xb2, 0xe0, 0xf7, 0xd0, 0xfc, + 0xbd, 0xe8, 0xb0, 0x40, 0x00, 0xf0, 0x20, 0xb9, 0x00, 0x20, 0x40, 0xf2, + 0xa5, 0x11, 0xbd, 0xe8, 0xb0, 0x40, 0xe3, 0xf7, 0xcd, 0xbc, 0x00, 0xbf, + 0xec, 0xe5, 0x05, 0x00, 0xdc, 0x9b, 0x08, 0x00, 0xe0, 0x35, 0x01, 0x00, + 0x10, 0xb5, 0x04, 0x46, 0x00, 0xf0, 0x14, 0xf9, 0x94, 0xf8, 0x35, 0x01, + 0x04, 0x49, 0x68, 0x22, 0x10, 0xfb, 0x02, 0x10, 0x03, 0x49, 0x89, 0x79, + 0x80, 0xf8, 0x50, 0x10, 0x10, 0xbd, 0x00, 0xbf, 0xb0, 0xe6, 0x05, 0x00, + 0x98, 0x32, 0x06, 0x00, 0x2d, 0xe9, 0xf0, 0x47, 0x29, 0x49, 0x27, 0x48, + 0x27, 0x4c, 0x09, 0x68, 0xc0, 0xe9, 0x00, 0x44, 0x88, 0x47, 0x27, 0x48, + 0x27, 0x49, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0xdf, 0xf8, 0x98, 0x80, + 0x98, 0xf8, 0x1c, 0x01, 0xc0, 0xb1, 0x25, 0x4f, 0xdf, 0xf8, 0x94, 0xa0, + 0x25, 0x4e, 0x00, 0x20, 0x01, 0x25, 0x4f, 0xf4, 0xa8, 0x79, 0x00, 0xfb, + 0x09, 0xf4, 0x38, 0x68, 0xda, 0xf8, 0x00, 0x10, 0x20, 0x44, 0x88, 0x47, + 0x38, 0x68, 0x31, 0x68, 0x20, 0x44, 0x88, 0x47, 0x98, 0xf8, 0x1c, 0x11, + 0x68, 0xb2, 0x01, 0x35, 0x88, 0x42, 0xee, 0xdb, 0x1b, 0x48, 0x00, 0x68, + 0x20, 0xb1, 0x00, 0x20, 0x40, 0xf2, 0xe3, 0x11, 0xe3, 0xf7, 0x7e, 0xfc, + 0x18, 0x48, 0x00, 0x24, 0x04, 0x70, 0x18, 0x48, 0x04, 0x80, 0x18, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x17, 0x49, 0x08, 0x70, 0x17, 0x48, 0x6f, 0xf0, + 0x7f, 0x41, 0x41, 0x60, 0x16, 0x49, 0x44, 0x72, 0x0c, 0x70, 0x98, 0xf8, + 0x54, 0x11, 0x01, 0x72, 0x14, 0x48, 0x00, 0x68, 0x80, 0x47, 0x14, 0x48, + 0x14, 0x49, 0x90, 0xf8, 0xca, 0x01, 0xc8, 0x70, 0xbd, 0xe8, 0xf0, 0x87, + 0xf4, 0x54, 0x01, 0x00, 0xd6, 0xbe, 0x89, 0x8e, 0x18, 0x8f, 0x08, 0x00, + 0x6c, 0xfb, 0x08, 0x00, 0x0c, 0x55, 0x01, 0x00, 0xe8, 0x65, 0x08, 0x00, + 0xdc, 0x35, 0x01, 0x00, 0x3c, 0x9e, 0x08, 0x00, 0x40, 0x9e, 0x08, 0x00, + 0x08, 0xf0, 0x05, 0x00, 0x99, 0x53, 0x01, 0x00, 0xb2, 0x58, 0x01, 0x00, + 0xf4, 0x8e, 0x08, 0x00, 0x9a, 0x53, 0x01, 0x00, 0x24, 0x55, 0x01, 0x00, + 0x30, 0x55, 0x01, 0x00, 0xc4, 0xc4, 0x08, 0x00, 0x00, 0x69, 0x08, 0x00, + 0x48, 0xdc, 0x05, 0x00, 0x70, 0xb5, 0x1c, 0x4d, 0x04, 0x46, 0x28, 0x30, + 0x29, 0x68, 0x88, 0x47, 0x29, 0x68, 0x04, 0xf1, 0x3c, 0x00, 0x88, 0x47, + 0x29, 0x68, 0x04, 0xf1, 0x70, 0x00, 0x88, 0x47, 0x04, 0xf1, 0xe4, 0x00, + 0x00, 0xf0, 0x80, 0xf8, 0xd4, 0xf8, 0x84, 0x00, 0xc8, 0xb1, 0x13, 0x4e, + 0x72, 0xb6, 0x30, 0x68, 0x40, 0x00, 0x01, 0x30, 0x30, 0x60, 0xd4, 0xf8, + 0x84, 0x50, 0x55, 0xb1, 0x0f, 0x48, 0x01, 0x68, 0x28, 0x46, 0x88, 0x47, + 0x29, 0x7d, 0x00, 0x20, 0x28, 0x61, 0x28, 0x75, 0xc4, 0xf8, 0x84, 0x00, + 0xa9, 0x75, 0x30, 0x68, 0x40, 0x08, 0x30, 0x60, 0x30, 0x68, 0x80, 0xf3, + 0x10, 0x88, 0x11, 0x49, 0xd4, 0xf8, 0xdc, 0x00, 0x09, 0x68, 0x88, 0x47, + 0x20, 0x46, 0x4f, 0xf4, 0xa8, 0x71, 0xe0, 0xf7, 0xf9, 0xfb, 0x70, 0xbd, + 0x8c, 0xec, 0x08, 0x00, 0x24, 0x36, 0x01, 0x00, 0xc8, 0xa0, 0x08, 0x00, + 0xb0, 0xb5, 0x04, 0x46, 0x40, 0xb1, 0x07, 0x4d, 0xd4, 0xf8, 0x50, 0x04, + 0x29, 0x68, 0x88, 0x47, 0xd4, 0xf8, 0x4c, 0x04, 0x29, 0x68, 0x88, 0x47, + 0x20, 0x46, 0xbd, 0xe8, 0xb0, 0x40, 0x00, 0xf0, 0x47, 0xb8, 0x00, 0xbf, + 0x74, 0xc4, 0x08, 0x00, 0x0a, 0x48, 0x0b, 0x49, 0x01, 0x60, 0x0b, 0x48, + 0x0b, 0x49, 0x01, 0x60, 0x0b, 0x48, 0x0c, 0x49, 0x01, 0x60, 0x0c, 0x48, + 0x0c, 0x49, 0x01, 0x60, 0x0c, 0x48, 0x0d, 0x49, 0x01, 0x60, 0x0d, 0x48, + 0x0d, 0x49, 0x01, 0x60, 0x0d, 0x48, 0x0e, 0x49, 0x01, 0x60, 0x70, 0x47, + 0xf4, 0xb7, 0x08, 0x00, 0x39, 0x32, 0x04, 0x00, 0xc0, 0xb2, 0x08, 0x00, + 0xed, 0x31, 0x04, 0x00, 0xc4, 0xb2, 0x08, 0x00, 0xc1, 0x32, 0x04, 0x00, + 0x34, 0xc0, 0x08, 0x00, 0x35, 0x33, 0x04, 0x00, 0xb4, 0xb2, 0x08, 0x00, + 0x5d, 0x33, 0x04, 0x00, 0x3c, 0x9e, 0x08, 0x00, 0x4d, 0x34, 0x04, 0x00, + 0xb0, 0xb2, 0x08, 0x00, 0xcd, 0x34, 0x04, 0x00, 0x42, 0xf2, 0x6d, 0x7c, + 0xc1, 0xf2, 0x0a, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf2, 0xab, 0x1c, + 0xc1, 0xf2, 0x0a, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x46, 0xf6, 0xed, 0x3c, + 0xc1, 0xf2, 0x10, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf2, 0xad, 0x2c, + 0xc1, 0xf2, 0x0a, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x70, 0xb5, 0x0d, 0x46, + 0x04, 0x46, 0x00, 0xf0, 0x51, 0xfa, 0x94, 0xf8, 0x88, 0x04, 0x80, 0x07, + 0x09, 0xd5, 0x17, 0x48, 0x4f, 0xf0, 0xff, 0x31, 0xb0, 0xf8, 0x1e, 0x05, + 0x03, 0x30, 0x20, 0xf0, 0x03, 0x00, 0x28, 0x44, 0x81, 0x60, 0x13, 0x48, + 0x00, 0x78, 0xb0, 0xb1, 0x12, 0x4a, 0x1c, 0x4b, 0x00, 0x21, 0x52, 0xf8, + 0x21, 0x50, 0x6d, 0xb1, 0x95, 0xf8, 0x88, 0x64, 0xb6, 0x07, 0x09, 0xd5, + 0x95, 0xf8, 0x35, 0x61, 0x95, 0xf8, 0xf6, 0x54, 0x15, 0xb1, 0xa3, 0xf8, + 0x4a, 0x66, 0x01, 0xe0, 0xa3, 0xf8, 0x48, 0x66, 0x01, 0x31, 0x81, 0x42, + 0xeb, 0xd3, 0x94, 0xf8, 0xa4, 0x04, 0x41, 0x07, 0x05, 0xd5, 0x00, 0x07, + 0x03, 0xd4, 0x05, 0x48, 0x4f, 0xf0, 0xff, 0x31, 0x01, 0x60, 0x70, 0xbd, + 0x8c, 0x7e, 0x08, 0x00, 0x5c, 0x34, 0x01, 0x00, 0x10, 0x61, 0x01, 0x00, + 0xbc, 0x11, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x46, 0x00, 0xf0, 0x18, 0xfa, + 0x94, 0xf8, 0xf6, 0x04, 0x00, 0x21, 0x00, 0x28, 0x03, 0x48, 0x0c, 0xbf, + 0xa0, 0xf8, 0x48, 0x16, 0xa0, 0xf8, 0x4a, 0x16, 0x10, 0xbd, 0x00, 0xbf, + 0x64, 0xd4, 0x05, 0x00, 0x2d, 0xe9, 0xf0, 0x41, 0x1b, 0x88, 0xdc, 0x07, + 0x41, 0xd1, 0x9c, 0x1e, 0x4f, 0xf0, 0x02, 0x08, 0x94, 0xfb, 0xf8, 0xf5, + 0x6c, 0xb2, 0x01, 0x2c, 0x39, 0xdb, 0x00, 0xf5, 0x97, 0x64, 0x00, 0x2a, + 0x40, 0xf2, 0xa7, 0x4e, 0x05, 0xf1, 0x01, 0x06, 0x4f, 0xf0, 0x00, 0x07, + 0x4f, 0xf0, 0x01, 0x0c, 0x1c, 0xbf, 0x00, 0xf5, 0x95, 0x64, 0x4f, 0xf0, + 0x01, 0x08, 0x01, 0xf1, 0x0b, 0x01, 0x18, 0xbf, 0x40, 0xf2, 0xa6, 0x4e, + 0x00, 0x2a, 0x18, 0xbf, 0x01, 0x22, 0x0d, 0x78, 0x0f, 0x2d, 0x19, 0xd8, + 0x11, 0xf8, 0x01, 0x3c, 0xfd, 0xb2, 0x9b, 0x08, 0x63, 0x55, 0x90, 0xf8, + 0xa4, 0x34, 0x43, 0xea, 0x08, 0x03, 0x80, 0xf8, 0xa4, 0x34, 0x0b, 0x78, + 0x2c, 0xea, 0xd3, 0x03, 0x93, 0x42, 0x03, 0xd0, 0x63, 0x5d, 0x43, 0xf0, + 0x40, 0x03, 0x63, 0x55, 0x01, 0x37, 0xfb, 0xb2, 0x00, 0xf8, 0x0e, 0x70, + 0x10, 0x2b, 0x04, 0xd0, 0x73, 0x1e, 0x02, 0x31, 0x5e, 0xb2, 0x01, 0x2e, + 0xdd, 0xdc, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0xbf, 0xf8, 0xb5, 0x07, 0x46, + 0x18, 0x88, 0x08, 0x28, 0x20, 0xd1, 0xd8, 0x88, 0x1c, 0x46, 0x04, 0x28, + 0x1c, 0xd1, 0x97, 0xf8, 0x88, 0x04, 0x15, 0x46, 0x0e, 0x46, 0x80, 0x07, + 0x0d, 0xd4, 0xdd, 0xf7, 0x99, 0xfc, 0x97, 0xf8, 0x35, 0x11, 0x13, 0x4a, + 0x01, 0xeb, 0x41, 0x01, 0x02, 0xeb, 0x41, 0x11, 0x08, 0x61, 0xd7, 0xf8, + 0xd4, 0x00, 0x40, 0x7f, 0x48, 0xb1, 0x38, 0x46, 0x31, 0x46, 0x2a, 0x46, + 0x23, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x40, 0x00, 0xf0, 0xa0, 0xb9, + 0xf8, 0xbd, 0x20, 0x89, 0x19, 0x28, 0x01, 0xd0, 0x03, 0x28, 0xf0, 0xd1, + 0x97, 0xf8, 0x90, 0x00, 0x41, 0x07, 0xec, 0xd4, 0x05, 0x49, 0x91, 0xf8, + 0x4d, 0x10, 0x00, 0x29, 0xe7, 0xd1, 0x40, 0xf0, 0x04, 0x00, 0x87, 0xf8, + 0x90, 0x00, 0xe2, 0xe7, 0x54, 0xf1, 0x05, 0x00, 0x18, 0x74, 0x01, 0x00, + 0x2d, 0xe9, 0xf0, 0x41, 0x04, 0x46, 0x18, 0x88, 0x08, 0x28, 0x24, 0xd1, + 0xd8, 0x88, 0x1f, 0x46, 0x04, 0x28, 0x20, 0xd1, 0x06, 0x98, 0x00, 0x79, + 0x07, 0x28, 0x08, 0xbf, 0x00, 0x2a, 0x50, 0xd0, 0x00, 0x25, 0x9c, 0x4e, + 0x07, 0xf1, 0x0a, 0x08, 0x40, 0x46, 0x31, 0x68, 0x88, 0x47, 0x08, 0x37, + 0x31, 0x68, 0x38, 0x46, 0x88, 0x47, 0xd4, 0xf8, 0x88, 0x04, 0xc1, 0x03, + 0x2f, 0xd5, 0x96, 0x49, 0x00, 0xf4, 0x00, 0x60, 0x0a, 0x68, 0x29, 0x46, + 0x90, 0x47, 0xb4, 0xf8, 0xc8, 0x14, 0x20, 0xb1, 0xb8, 0xf8, 0x00, 0x00, + 0x02, 0xe0, 0xbd, 0xe8, 0xf0, 0x81, 0x38, 0x88, 0x81, 0x42, 0x1e, 0xd1, + 0x8e, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0xd4, 0xf8, 0x88, 0x14, + 0x8c, 0x48, 0x0a, 0xb2, 0x08, 0x40, 0x00, 0x2a, 0xc4, 0xf8, 0x88, 0x04, + 0x01, 0xd4, 0x09, 0x02, 0x03, 0xd5, 0x40, 0xf0, 0x20, 0x00, 0xc4, 0xf8, + 0x88, 0x04, 0x20, 0xf4, 0x00, 0x60, 0x00, 0x21, 0xc4, 0xf8, 0x88, 0x04, + 0x84, 0x48, 0xc4, 0xf8, 0xc8, 0x14, 0x0c, 0x21, 0x00, 0x78, 0xdd, 0xf7, + 0x29, 0xfc, 0xd4, 0xf8, 0x88, 0x04, 0x01, 0xb2, 0xb1, 0xf1, 0xff, 0x3f, + 0x2a, 0xdc, 0x7b, 0x49, 0x00, 0xf4, 0x80, 0x60, 0x0a, 0x68, 0x29, 0x46, + 0x90, 0x47, 0xb4, 0xf8, 0xd0, 0x14, 0x20, 0xb1, 0xb8, 0xf8, 0x00, 0x00, + 0x02, 0xe0, 0x01, 0x25, 0xad, 0xe7, 0x38, 0x88, 0x81, 0x42, 0x19, 0xd1, + 0xd4, 0xf8, 0x88, 0x04, 0x01, 0x02, 0x0c, 0xd4, 0x74, 0x49, 0x94, 0xf8, + 0x35, 0x01, 0x00, 0x22, 0x0b, 0x68, 0x01, 0x21, 0x98, 0x47, 0xd4, 0xf8, + 0x88, 0x04, 0x20, 0xf0, 0x20, 0x00, 0xc4, 0xf8, 0x88, 0x04, 0x20, 0xf4, + 0x04, 0x40, 0x0c, 0x21, 0xc4, 0xf8, 0x88, 0x04, 0x6a, 0x48, 0x00, 0x78, + 0xdd, 0xf7, 0xf8, 0xfb, 0x94, 0xf8, 0x8a, 0x04, 0x00, 0x06, 0x2e, 0xd5, + 0x63, 0x48, 0x29, 0x46, 0x02, 0x68, 0x00, 0x20, 0x90, 0x47, 0xb4, 0xf8, + 0xd6, 0x14, 0x10, 0xb1, 0xb8, 0xf8, 0x00, 0x00, 0x00, 0xe0, 0x38, 0x88, + 0x81, 0x42, 0x20, 0xd1, 0xb4, 0xf9, 0x88, 0x04, 0x00, 0x28, 0x0c, 0xd4, + 0x5e, 0x49, 0x94, 0xf8, 0x35, 0x01, 0x00, 0x22, 0x0b, 0x68, 0x01, 0x21, + 0x98, 0x47, 0xd4, 0xf8, 0x88, 0x04, 0x20, 0xf0, 0x20, 0x00, 0xc4, 0xf8, + 0x88, 0x04, 0x59, 0x48, 0x01, 0x21, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, + 0xd4, 0xf8, 0x88, 0x04, 0x0c, 0x21, 0x20, 0xf0, 0xc0, 0x70, 0xc4, 0xf8, + 0x88, 0x04, 0x51, 0x48, 0x00, 0x78, 0xdd, 0xf7, 0xc5, 0xfb, 0xd4, 0xf8, + 0x88, 0x04, 0x01, 0x07, 0x21, 0xd5, 0x4a, 0x49, 0x00, 0xf4, 0x80, 0x50, + 0x0a, 0x68, 0x29, 0x46, 0x90, 0x47, 0xb4, 0xf8, 0xce, 0x14, 0x10, 0xb1, + 0xb8, 0xf8, 0x00, 0x00, 0x00, 0xe0, 0x38, 0x88, 0x81, 0x42, 0x12, 0xd1, + 0x46, 0x49, 0x94, 0xf8, 0x35, 0x01, 0x00, 0x22, 0x0b, 0x68, 0x03, 0x21, + 0x98, 0x47, 0xd4, 0xf8, 0x88, 0x04, 0x41, 0xf2, 0x08, 0x01, 0x88, 0x43, + 0x0c, 0x21, 0xc4, 0xf8, 0x88, 0x04, 0x3e, 0x48, 0x00, 0x78, 0xdd, 0xf7, + 0x9f, 0xfb, 0xd4, 0xf8, 0x88, 0x04, 0x01, 0xb2, 0xb1, 0xf1, 0xff, 0x3f, + 0x21, 0xdc, 0x36, 0x49, 0x00, 0xf4, 0x80, 0x60, 0x0a, 0x68, 0x29, 0x46, + 0x90, 0x47, 0xb4, 0xf8, 0xd0, 0x14, 0x10, 0xb1, 0xb8, 0xf8, 0x00, 0x00, + 0x00, 0xe0, 0x38, 0x88, 0x81, 0x42, 0x12, 0xd1, 0x32, 0x49, 0x94, 0xf8, + 0x35, 0x01, 0x00, 0x22, 0x0b, 0x68, 0x01, 0x21, 0x98, 0x47, 0xd4, 0xf8, + 0x88, 0x04, 0x48, 0xf2, 0x20, 0x41, 0x88, 0x43, 0x0c, 0x21, 0xc4, 0xf8, + 0x88, 0x04, 0x2a, 0x48, 0x00, 0x78, 0xdd, 0xf7, 0x77, 0xfb, 0xd4, 0xf8, + 0x88, 0x04, 0x41, 0xb2, 0xb1, 0xf1, 0xff, 0x3f, 0x20, 0xdc, 0x22, 0x49, + 0x00, 0xf4, 0x00, 0x50, 0x0a, 0x68, 0x29, 0x46, 0x90, 0x47, 0xb4, 0xf8, + 0xd2, 0x14, 0x10, 0xb1, 0xb8, 0xf8, 0x00, 0x00, 0x00, 0xe0, 0x38, 0x88, + 0x81, 0x42, 0x11, 0xd1, 0x1e, 0x49, 0x94, 0xf8, 0x35, 0x01, 0x00, 0x22, + 0x0b, 0x68, 0x04, 0x21, 0x98, 0x47, 0xd4, 0xf8, 0x88, 0x04, 0x0c, 0x21, + 0x20, 0xf4, 0x02, 0x50, 0xc4, 0xf8, 0x88, 0x04, 0x16, 0x48, 0x00, 0x78, + 0xdd, 0xf7, 0x50, 0xfb, 0xd4, 0xf8, 0x88, 0x04, 0x81, 0x05, 0x7f, 0xf5, + 0xfe, 0xae, 0x0f, 0x49, 0x00, 0xf4, 0x80, 0x40, 0x0a, 0x68, 0x29, 0x46, + 0x90, 0x47, 0xb4, 0xf8, 0xd4, 0x14, 0x10, 0xb1, 0xb8, 0xf8, 0x00, 0x00, + 0x00, 0xe0, 0x38, 0x88, 0x81, 0x42, 0x7f, 0xf4, 0xee, 0xae, 0xd4, 0xf8, + 0x88, 0x04, 0x0c, 0x21, 0x20, 0xf4, 0x00, 0x70, 0xc4, 0xf8, 0x88, 0x04, + 0x06, 0x48, 0x00, 0x78, 0xbd, 0xe8, 0xf0, 0x41, 0xdd, 0xf7, 0x2e, 0xbb, + 0x2c, 0xd4, 0x08, 0x00, 0x34, 0xd4, 0x08, 0x00, 0x30, 0xd4, 0x08, 0x00, + 0xfd, 0xff, 0xfe, 0xff, 0x67, 0x34, 0x01, 0x00, 0x54, 0xd4, 0x08, 0x00, + 0x50, 0xd4, 0x08, 0x00, 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, + 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, 0x09, 0x49, 0x01, 0x60, 0x09, 0x48, + 0x09, 0x49, 0x01, 0x60, 0x09, 0x48, 0x0a, 0x49, 0x01, 0x60, 0x70, 0x47, + 0xa8, 0xd4, 0x08, 0x00, 0x2d, 0x36, 0x04, 0x00, 0xb0, 0xd4, 0x08, 0x00, + 0x89, 0x35, 0x04, 0x00, 0xb4, 0xd4, 0x08, 0x00, 0x09, 0x36, 0x04, 0x00, + 0x54, 0xd5, 0x08, 0x00, 0xc1, 0x36, 0x04, 0x00, 0x5c, 0xd5, 0x08, 0x00, + 0x3d, 0x37, 0x04, 0x00, 0x48, 0xf2, 0xa5, 0x0c, 0xc1, 0xf2, 0x0a, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x48, 0xf2, 0xc1, 0x1c, 0xc1, 0xf2, 0x0a, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x47, 0xf2, 0x31, 0x6c, 0xc1, 0xf2, 0x0a, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x70, 0xb5, 0x17, 0x49, 0x09, 0x78, 0x81, 0xb1, + 0x16, 0x4b, 0x17, 0x4d, 0x00, 0x22, 0x01, 0x24, 0x53, 0xf8, 0x22, 0x60, + 0x96, 0xf8, 0xf9, 0x62, 0x1f, 0x2e, 0x03, 0xd8, 0x04, 0xfa, 0x06, 0xf6, + 0x2e, 0x42, 0x04, 0xd1, 0x01, 0x32, 0x8a, 0x42, 0xf2, 0xd3, 0x00, 0x22, + 0x00, 0xe0, 0x23, 0x22, 0xc0, 0x78, 0x07, 0x28, 0x01, 0xd3, 0x10, 0x28, + 0x0b, 0xd9, 0x11, 0x22, 0x01, 0x20, 0x40, 0xf6, 0x84, 0x41, 0xe3, 0xf7, + 0x1d, 0xf9, 0x18, 0xb1, 0xbd, 0xe8, 0x70, 0x40, 0xe3, 0xf7, 0xee, 0xb8, + 0x70, 0xbd, 0x00, 0x2a, 0xf2, 0xd1, 0x05, 0x49, 0x00, 0x22, 0x81, 0xf8, + 0xac, 0x00, 0xed, 0xe7, 0x5c, 0x34, 0x01, 0x00, 0x10, 0x61, 0x01, 0x00, + 0x80, 0x1f, 0x00, 0x80, 0xe8, 0x65, 0x08, 0x00, 0xbc, 0xb5, 0x04, 0x46, + 0x40, 0xf6, 0x84, 0x40, 0x81, 0x42, 0x17, 0xd0, 0x40, 0xf6, 0x1a, 0x40, + 0x81, 0x42, 0x0d, 0xd0, 0x40, 0xf6, 0x6d, 0x40, 0x81, 0x42, 0x14, 0xd0, + 0x40, 0xf2, 0x44, 0x40, 0x81, 0x42, 0x26, 0xd1, 0x4e, 0x48, 0x00, 0x78, + 0x00, 0x07, 0x27, 0xd4, 0x01, 0x20, 0x4d, 0xe0, 0xe0, 0x78, 0x10, 0xf0, + 0xfc, 0x0f, 0x53, 0xd0, 0x12, 0x20, 0x6e, 0xe0, 0x20, 0x46, 0xbd, 0xe8, + 0xbc, 0x40, 0xff, 0xf7, 0xa5, 0xbf, 0x3e, 0x48, 0x01, 0x21, 0x02, 0x68, + 0x40, 0xf6, 0x6d, 0x40, 0x90, 0x47, 0x00, 0x28, 0x67, 0xd0, 0x3b, 0x49, + 0x09, 0x79, 0x49, 0x06, 0x3e, 0xd5, 0xe1, 0x78, 0x00, 0x29, 0x61, 0xd0, + 0x01, 0x29, 0x39, 0xd1, 0x37, 0x49, 0x0a, 0x78, 0x42, 0xf0, 0x02, 0x02, + 0x5e, 0xe0, 0x20, 0x46, 0xbd, 0xe8, 0xbc, 0x40, 0x00, 0xf0, 0xbc, 0xb8, + 0x61, 0x7a, 0xa2, 0x7a, 0xe0, 0x7a, 0x23, 0x7b, 0x40, 0xea, 0x03, 0x20, + 0x41, 0xea, 0x02, 0x22, 0x83, 0xb2, 0x92, 0xb2, 0x9a, 0x42, 0x1a, 0xd3, + 0xc9, 0x07, 0x18, 0xd1, 0x22, 0x2b, 0x16, 0xd3, 0x4f, 0xf6, 0xfd, 0x71, + 0x8b, 0x42, 0x12, 0xd8, 0xc0, 0x07, 0x10, 0xd1, 0x60, 0x7b, 0xa1, 0x7b, + 0x40, 0xea, 0x01, 0x20, 0x99, 0x1c, 0x80, 0xb2, 0x81, 0x42, 0x08, 0xd8, + 0xc1, 0x07, 0x06, 0xd1, 0x29, 0x49, 0x0d, 0x68, 0x00, 0x90, 0xe1, 0x1c, + 0x00, 0x20, 0xa8, 0x47, 0x00, 0xe0, 0x12, 0x20, 0x26, 0x49, 0x0a, 0x68, + 0x40, 0xf2, 0x44, 0x41, 0x02, 0xb0, 0xbd, 0xe8, 0xb0, 0x40, 0x10, 0x47, + 0x11, 0x21, 0x29, 0xe0, 0x1a, 0x49, 0x82, 0x07, 0x01, 0xf1, 0x12, 0x01, + 0x0a, 0xd5, 0x19, 0x4b, 0x00, 0x22, 0x8a, 0x81, 0x0a, 0x80, 0x8a, 0x80, + 0x0a, 0x81, 0x1a, 0x80, 0x16, 0x4b, 0xc3, 0xe9, 0x00, 0x22, 0x1a, 0x81, + 0xc2, 0x07, 0x04, 0xd0, 0x00, 0x22, 0xca, 0x81, 0x4a, 0x80, 0xca, 0x80, + 0x4a, 0x81, 0x12, 0x49, 0x08, 0x70, 0x12, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x00, 0x20, 0x40, 0xf6, 0x1a, 0x41, 0xbd, 0xe8, 0xbc, 0x40, 0xe3, 0xf7, + 0x51, 0xb8, 0xbc, 0xbd, 0x07, 0x49, 0x0a, 0x78, 0x02, 0xf0, 0xfd, 0x02, + 0x0a, 0x70, 0x00, 0x21, 0x41, 0x71, 0xbd, 0xe8, 0xbc, 0x40, 0xe3, 0xf7, + 0x3f, 0xb8, 0x00, 0xbf, 0x28, 0x9c, 0x08, 0x00, 0xa8, 0x52, 0x01, 0x00, + 0xb0, 0x52, 0x01, 0x00, 0xc4, 0x79, 0x01, 0x00, 0x7e, 0xfa, 0x05, 0x00, + 0x74, 0xfa, 0x05, 0x00, 0x98, 0x58, 0x01, 0x00, 0xbc, 0xba, 0x08, 0x00, + 0xb8, 0x52, 0x01, 0x00, 0x74, 0xd8, 0x08, 0x00, 0xbc, 0x9b, 0x08, 0x00, + 0x10, 0xb5, 0x0c, 0x46, 0x58, 0xb1, 0x01, 0x46, 0x90, 0xf8, 0xfd, 0x02, + 0x40, 0x06, 0x07, 0xd4, 0x11, 0x48, 0x02, 0x68, 0x01, 0xf5, 0x80, 0x70, + 0x90, 0x47, 0x01, 0x46, 0x00, 0xe0, 0x00, 0x21, 0x08, 0x46, 0x21, 0x46, + 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, 0x34, 0xb8, 0xb0, 0xb5, 0x05, 0x46, + 0x09, 0x48, 0x0c, 0x46, 0x00, 0x21, 0x02, 0x68, 0xe8, 0x1c, 0x90, 0x47, + 0x28, 0xb1, 0x90, 0xf8, 0xfa, 0x02, 0x80, 0x07, 0x44, 0xbf, 0x0c, 0x20, + 0xb0, 0xbd, 0x28, 0x46, 0x21, 0x46, 0xbd, 0xe8, 0xb0, 0x40, 0x00, 0xf0, + 0x25, 0xb8, 0x00, 0xbf, 0xf0, 0xba, 0x08, 0x00, 0x04, 0x48, 0x05, 0x49, + 0x01, 0x60, 0x05, 0x48, 0x05, 0x49, 0x01, 0x60, 0x05, 0x48, 0x06, 0x49, + 0x01, 0x60, 0x70, 0x47, 0xac, 0xc0, 0x08, 0x00, 0x35, 0x3c, 0x04, 0x00, + 0x24, 0xe6, 0x08, 0x00, 0xc9, 0x3a, 0x04, 0x00, 0xa4, 0xc0, 0x08, 0x00, + 0x61, 0x3c, 0x04, 0x00, 0x43, 0xf6, 0xb5, 0x0c, 0xc1, 0xf2, 0x0a, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x45, 0xf2, 0x69, 0x5c, 0xc1, 0xf2, 0x0b, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x45, 0xf2, 0x5d, 0x3c, 0xc1, 0xf2, 0x0b, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0xb0, 0xb5, 0x01, 0x23, 0x40, 0xf2, 0x44, 0x45, + 0x13, 0x70, 0x0c, 0x88, 0xac, 0x42, 0x07, 0xd0, 0x40, 0xf6, 0x84, 0x43, + 0x9c, 0x42, 0x08, 0xd1, 0x00, 0x20, 0x10, 0x70, 0x00, 0x20, 0xb0, 0xbd, + 0x2b, 0x48, 0x00, 0x78, 0x23, 0xea, 0x50, 0x00, 0xb0, 0xbd, 0xbd, 0xe8, + 0xb0, 0x40, 0x00, 0xf0, 0x8d, 0xb8, 0x00, 0xbf, 0x70, 0xb5, 0x90, 0xf8, + 0x3a, 0x60, 0x16, 0x2e, 0x1f, 0xd8, 0x04, 0x46, 0x14, 0xf9, 0x3c, 0x5f, + 0x28, 0x46, 0x00, 0xf0, 0x1f, 0xf8, 0xc0, 0xb1, 0x94, 0xf9, 0x01, 0x40, + 0x20, 0x46, 0x00, 0xf0, 0x19, 0xf8, 0x90, 0xb1, 0xac, 0x42, 0x10, 0xdb, + 0x08, 0x49, 0x60, 0x1b, 0x91, 0xf9, 0x00, 0x10, 0x88, 0x42, 0x0a, 0xdc, + 0x06, 0x49, 0x06, 0xeb, 0x46, 0x00, 0x01, 0xeb, 0x40, 0x10, 0xc1, 0x88, + 0x21, 0x44, 0xc1, 0x80, 0x01, 0x79, 0x01, 0x31, 0x01, 0x71, 0x70, 0xbd, + 0x7e, 0xd3, 0x05, 0x00, 0x54, 0xf1, 0x05, 0x00, 0x01, 0x46, 0x00, 0x20, + 0x1f, 0x29, 0x03, 0xdc, 0x11, 0xf1, 0x21, 0x0f, 0xc8, 0xbf, 0x01, 0x20, + 0x70, 0x47, 0x00, 0xbf, 0x80, 0xb5, 0x05, 0x48, 0x05, 0x49, 0x00, 0x68, + 0x08, 0x60, 0x08, 0xb1, 0xff, 0xf7, 0xc4, 0xff, 0xbd, 0xe8, 0x80, 0x40, + 0x00, 0xf0, 0x52, 0xb8, 0x4c, 0x76, 0x01, 0x00, 0x14, 0xf0, 0x05, 0x00, + 0x04, 0x49, 0x09, 0x78, 0x89, 0x07, 0x03, 0xd4, 0xc1, 0x7f, 0x01, 0xf0, + 0xf5, 0x01, 0xc1, 0x77, 0x70, 0x47, 0x00, 0xbf, 0xb8, 0x52, 0x01, 0x00, + 0x10, 0xb5, 0x0d, 0x4a, 0x00, 0x24, 0xb2, 0xf8, 0x1e, 0x35, 0x03, 0x33, + 0x23, 0xf0, 0x03, 0x03, 0x03, 0x44, 0xdc, 0x71, 0x9c, 0x71, 0x5c, 0x71, + 0x1c, 0x71, 0xb2, 0xf8, 0x1e, 0x25, 0x03, 0x32, 0x22, 0xf0, 0x03, 0x02, + 0x02, 0x44, 0xd4, 0x72, 0x94, 0x72, 0x54, 0x72, 0x14, 0x72, 0xbd, 0xe8, + 0x10, 0x40, 0x00, 0xf0, 0x2d, 0xb8, 0x00, 0xbf, 0x8c, 0x7e, 0x08, 0x00, + 0x06, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x07, 0x49, 0x01, 0x60, + 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, + 0x70, 0x47, 0x00, 0xbf, 0xc8, 0xb3, 0x08, 0x00, 0xe1, 0x3c, 0x04, 0x00, + 0x3c, 0xaa, 0x08, 0x00, 0x7d, 0x3d, 0x04, 0x00, 0xac, 0xb3, 0x08, 0x00, + 0x9d, 0x3d, 0x04, 0x00, 0x20, 0xb3, 0x08, 0x00, 0xb5, 0x3d, 0x04, 0x00, + 0x43, 0xf2, 0x65, 0x5c, 0xc1, 0xf2, 0x0a, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x43, 0xf2, 0xc1, 0x3c, 0xc1, 0xf2, 0x0a, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x43, 0xf2, 0x2d, 0x7c, 0xc1, 0xf2, 0x0a, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x2d, 0xe9, 0xf0, 0x4f, 0x8b, 0xb0, 0xda, 0x4c, 0xdf, 0xf8, 0x0c, 0xb2, + 0x20, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x5b, 0xf8, 0x30, 0x80, 0x0b, 0xeb, + 0xc0, 0x00, 0xb0, 0xf8, 0xdc, 0x00, 0xc1, 0x07, 0x0b, 0xd0, 0x00, 0x20, + 0x4f, 0xf4, 0xe0, 0x71, 0xdd, 0xf7, 0xc0, 0xf8, 0x20, 0x78, 0xc0, 0xeb, + 0x40, 0x10, 0x0b, 0xeb, 0xc0, 0x00, 0xb0, 0xf8, 0xdc, 0x00, 0x80, 0x07, + 0x04, 0xd5, 0x00, 0x20, 0x40, 0xf2, 0xc1, 0x11, 0xdd, 0xf7, 0xb2, 0xf8, + 0xb8, 0xf1, 0x00, 0x0f, 0x35, 0xd0, 0x73, 0x4a, 0x10, 0x68, 0xc0, 0x07, + 0x2e, 0xd0, 0xd2, 0xf8, 0x00, 0xa0, 0xd2, 0xf8, 0x00, 0x90, 0xd2, 0xf8, + 0xd4, 0x00, 0xc9, 0x49, 0x03, 0x90, 0x20, 0x78, 0xd2, 0xf8, 0xa4, 0x20, + 0x01, 0xeb, 0x40, 0x11, 0xc0, 0xeb, 0x40, 0x10, 0x0b, 0xeb, 0xc0, 0x00, + 0xca, 0x60, 0xb0, 0xf8, 0xdc, 0x10, 0x41, 0xf0, 0x01, 0x01, 0xa0, 0xf8, + 0xdc, 0x10, 0x66, 0x48, 0x05, 0x68, 0x66, 0x48, 0x01, 0x68, 0x04, 0xa8, + 0x88, 0x47, 0x04, 0xab, 0xa4, 0x46, 0xdd, 0xe9, 0x08, 0x64, 0x0a, 0x9f, + 0x0f, 0xcb, 0x00, 0x96, 0x66, 0x46, 0xcd, 0xe9, 0x01, 0x47, 0xa8, 0x47, + 0x5c, 0x4b, 0x5f, 0xea, 0x8a, 0x70, 0xd3, 0xf8, 0xd4, 0x10, 0x0a, 0xd4, + 0x0b, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0x20, 0x40, 0xf2, 0xc3, 0x11, + 0x0b, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, 0xe2, 0xf7, 0xd3, 0xbe, 0x4f, 0xfa, + 0x89, 0xf2, 0xb2, 0xf1, 0xff, 0x3f, 0x02, 0xdc, 0x03, 0x98, 0xc0, 0x03, + 0xec, 0xd5, 0xd3, 0xf8, 0xb4, 0x70, 0x30, 0x78, 0xb2, 0xf1, 0xff, 0x3f, + 0xc0, 0xeb, 0x40, 0x13, 0x07, 0xf0, 0x03, 0x04, 0x0b, 0xeb, 0xc3, 0x03, + 0x83, 0xf8, 0xa1, 0x40, 0xfc, 0xb2, 0xc4, 0xf3, 0xc0, 0x05, 0x83, 0xf8, + 0x9a, 0x50, 0xc7, 0xf3, 0x09, 0x25, 0xa3, 0xf8, 0xde, 0x50, 0xc4, 0xf3, + 0x40, 0x15, 0x83, 0xf8, 0xa2, 0x50, 0xc4, 0xf3, 0x00, 0x14, 0x83, 0xf8, + 0x99, 0x40, 0xc1, 0xf3, 0x03, 0x65, 0x4f, 0xf0, 0x01, 0x01, 0x83, 0xf8, + 0xe6, 0x50, 0x83, 0xf8, 0xa0, 0x10, 0x13, 0xdc, 0xb3, 0xf8, 0xdc, 0x10, + 0x00, 0xeb, 0x00, 0x10, 0x41, 0xf0, 0x40, 0x01, 0xa3, 0xf8, 0xdc, 0x10, + 0x97, 0x49, 0x01, 0xeb, 0xc0, 0x00, 0x8e, 0x49, 0x90, 0xf8, 0x84, 0x00, + 0x00, 0xeb, 0x40, 0x00, 0x51, 0xf8, 0x30, 0x00, 0x80, 0x47, 0x30, 0x78, + 0xc0, 0xeb, 0x40, 0x10, 0x0b, 0xeb, 0xc0, 0x00, 0x90, 0xf8, 0x4a, 0x10, + 0xc7, 0xf3, 0x80, 0x03, 0xc9, 0x07, 0x0d, 0xd0, 0x2b, 0xb1, 0xd8, 0xf8, + 0xb4, 0x15, 0x91, 0xf8, 0x6c, 0x10, 0x89, 0x07, 0x0b, 0xd4, 0x01, 0x46, + 0x31, 0xf8, 0xde, 0x2f, 0x05, 0x2a, 0x24, 0xbf, 0x04, 0x3a, 0x0a, 0x80, + 0x1b, 0xb9, 0x4f, 0xf0, 0x00, 0x09, 0x00, 0x27, 0x06, 0xe0, 0x81, 0x68, + 0x09, 0xb1, 0x0f, 0x78, 0x00, 0xe0, 0x00, 0x27, 0x4f, 0xf0, 0x01, 0x09, + 0x20, 0x49, 0xd1, 0xf8, 0xd8, 0x10, 0x49, 0x01, 0x2a, 0xd4, 0x90, 0xf8, + 0xa1, 0x20, 0xb0, 0xf8, 0xde, 0x10, 0x1f, 0x48, 0x04, 0x68, 0x28, 0x46, + 0x00, 0x97, 0xa0, 0x47, 0x00, 0xb3, 0x30, 0x78, 0xb9, 0xf1, 0x00, 0x0f, + 0xc0, 0xeb, 0x40, 0x10, 0x0b, 0xeb, 0xc0, 0x00, 0xb0, 0xf8, 0xdc, 0x10, + 0x41, 0xf0, 0x02, 0x01, 0xa0, 0xf8, 0xdc, 0x10, 0x08, 0xeb, 0x45, 0x00, + 0xb0, 0xf8, 0x92, 0x11, 0x01, 0xf1, 0x01, 0x01, 0xa0, 0xf8, 0x92, 0x11, + 0x30, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x0b, 0xeb, 0xc0, 0x00, 0x08, 0xd0, + 0x81, 0x68, 0x00, 0x29, 0x3f, 0xf4, 0x60, 0xaf, 0x49, 0x78, 0x04, 0xe0, + 0x00, 0xf0, 0x22, 0xfd, 0x5a, 0xe7, 0x98, 0xf8, 0x01, 0x10, 0x01, 0xf0, + 0x07, 0x01, 0x80, 0xf8, 0x9f, 0x10, 0xb0, 0xf8, 0xdc, 0x10, 0x41, 0xf0, + 0x04, 0x01, 0xa0, 0xf8, 0xdc, 0x10, 0x4d, 0xe7, 0x0c, 0x6f, 0x01, 0x00, + 0xdc, 0x10, 0x21, 0x40, 0x50, 0xbb, 0x08, 0x00, 0x14, 0xbb, 0x08, 0x00, + 0x88, 0xbb, 0x08, 0x00, 0xf8, 0xb5, 0x4f, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x00, 0x28, 0x7d, 0xd0, 0x4d, 0x4c, 0x4e, 0x4d, 0x4e, 0x49, 0x20, 0x78, + 0xc0, 0xeb, 0x40, 0x10, 0x05, 0xeb, 0xc0, 0x00, 0x90, 0xf8, 0x84, 0x00, + 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, 0xc0, 0x00, 0x40, 0x69, 0x80, 0x47, + 0x48, 0x48, 0x00, 0x68, 0x80, 0x47, 0x20, 0x78, 0xc0, 0xeb, 0x40, 0x10, + 0x05, 0xeb, 0xc0, 0x00, 0x00, 0x69, 0x00, 0x69, 0x80, 0x47, 0x44, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x43, 0x48, 0x00, 0x68, 0x80, 0x47, 0x21, 0x78, + 0x42, 0x4e, 0x4b, 0x01, 0xc1, 0xeb, 0x41, 0x12, 0xf3, 0x58, 0x05, 0xeb, + 0xc2, 0x00, 0xc0, 0xf8, 0x88, 0x30, 0x01, 0x23, 0x80, 0xf8, 0x8f, 0x30, + 0x3d, 0x4b, 0x1b, 0x68, 0x80, 0xf8, 0xe1, 0x30, 0x3c, 0x4b, 0x1b, 0x68, + 0x55, 0xf8, 0x32, 0x20, 0x80, 0xf8, 0xe2, 0x30, 0x6a, 0xb1, 0x92, 0xf8, + 0x4d, 0x34, 0x92, 0xf8, 0x35, 0x21, 0x80, 0xf8, 0x8d, 0x30, 0x37, 0x4b, + 0x02, 0xeb, 0xc2, 0x02, 0x03, 0xeb, 0x42, 0x02, 0x52, 0x78, 0x80, 0xf8, + 0x8c, 0x20, 0x34, 0x4e, 0x01, 0xeb, 0x01, 0x11, 0x90, 0xf8, 0x49, 0x20, + 0x06, 0xeb, 0xc1, 0x01, 0x91, 0xf8, 0x49, 0x30, 0x93, 0x42, 0x03, 0xd1, + 0x42, 0x68, 0x49, 0x68, 0x91, 0x42, 0x28, 0xd0, 0x01, 0x69, 0x49, 0x69, + 0x88, 0x47, 0x2c, 0x48, 0x01, 0x21, 0x01, 0x22, 0x07, 0x68, 0x20, 0x78, + 0x00, 0x91, 0xf8, 0x21, 0xc0, 0xeb, 0x40, 0x10, 0x05, 0xeb, 0xc0, 0x00, + 0x03, 0x46, 0xb8, 0x47, 0xee, 0xf7, 0x16, 0xfb, 0x28, 0xb1, 0x25, 0x48, + 0x25, 0x49, 0x00, 0x88, 0x40, 0xf0, 0x81, 0x00, 0x08, 0x60, 0x20, 0x78, + 0x23, 0x49, 0x00, 0xeb, 0x00, 0x10, 0x06, 0xeb, 0xc0, 0x00, 0x90, 0xf8, + 0x49, 0x00, 0xc0, 0xf3, 0x42, 0x10, 0x51, 0xf8, 0x20, 0x00, 0xbd, 0xe8, + 0xf8, 0x40, 0x00, 0x47, 0xf8, 0xbd, 0x19, 0x49, 0x01, 0x22, 0x03, 0x46, + 0x0d, 0x68, 0x01, 0x21, 0x00, 0x91, 0xf8, 0x21, 0xa8, 0x47, 0x19, 0x49, + 0x20, 0x78, 0x0a, 0x68, 0xf7, 0x49, 0x14, 0x46, 0x41, 0xf8, 0x20, 0x20, + 0xee, 0xf7, 0xee, 0xfa, 0x28, 0xb1, 0xf5, 0x48, 0xf5, 0x49, 0x00, 0x88, + 0x40, 0xf0, 0x91, 0x00, 0x08, 0x60, 0x20, 0x46, 0xe1, 0xe7, 0x00, 0xbf, + 0xfc, 0xd6, 0x08, 0x00, 0x74, 0x87, 0x08, 0x00, 0x0c, 0x6f, 0x01, 0x00, + 0x28, 0xd6, 0x08, 0x00, 0x10, 0xa1, 0x08, 0x00, 0x14, 0xa1, 0x08, 0x00, + 0xd0, 0xa0, 0x08, 0x00, 0xe0, 0x58, 0x01, 0x00, 0x0c, 0x22, 0x21, 0x40, + 0x10, 0x22, 0x21, 0x40, 0x44, 0x28, 0x01, 0x00, 0xfc, 0x6d, 0x01, 0x00, + 0x74, 0xb7, 0x08, 0x00, 0x26, 0x21, 0x01, 0x00, 0x04, 0x08, 0x00, 0x40, + 0xb8, 0xe6, 0x08, 0x00, 0xb0, 0xb7, 0x08, 0x00, 0x2d, 0xe9, 0xf8, 0x43, + 0xc8, 0x48, 0x00, 0x68, 0x80, 0x47, 0xc8, 0x4d, 0x00, 0x28, 0x29, 0x78, + 0x00, 0xf0, 0xb9, 0x80, 0xc6, 0x4f, 0x01, 0xeb, 0x81, 0x00, 0xc6, 0x4a, + 0x07, 0xeb, 0xc0, 0x00, 0xc1, 0x69, 0x11, 0x60, 0x28, 0x21, 0xdf, 0xf7, + 0x8f, 0xf8, 0xc3, 0x48, 0x00, 0x68, 0x80, 0x47, 0x00, 0x28, 0x00, 0xf0, + 0x9f, 0x80, 0xdf, 0xf8, 0x04, 0x83, 0x40, 0xf2, 0x99, 0x20, 0xd8, 0xf8, + 0x00, 0x10, 0x88, 0x47, 0xbe, 0x48, 0x00, 0x68, 0x80, 0x47, 0xbe, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x28, 0x78, 0xbd, 0x4e, 0x00, 0xeb, 0x00, 0x10, + 0x06, 0xeb, 0xc0, 0x00, 0x01, 0x69, 0x49, 0x68, 0x88, 0x47, 0x00, 0x28, + 0x00, 0xf0, 0x92, 0x80, 0x04, 0x46, 0x00, 0xf0, 0xa1, 0xf9, 0x00, 0x28, + 0x00, 0xf0, 0x91, 0x80, 0xd7, 0x48, 0x00, 0x68, 0x80, 0x05, 0x00, 0xf1, + 0x91, 0x80, 0x00, 0xf0, 0x9f, 0xf9, 0x40, 0xb1, 0xb3, 0x49, 0x20, 0x22, + 0x28, 0x78, 0x0a, 0x60, 0xb2, 0x49, 0x01, 0xeb, 0x40, 0x10, 0x00, 0x21, + 0x01, 0x75, 0xb1, 0x48, 0xb2, 0x49, 0xdf, 0xf8, 0xc4, 0x92, 0x44, 0x71, + 0x28, 0x78, 0x09, 0x68, 0xd9, 0xf8, 0x00, 0x70, 0x00, 0xeb, 0x00, 0x10, + 0x06, 0xeb, 0xc0, 0x00, 0x40, 0x68, 0x88, 0x47, 0x29, 0x78, 0x02, 0x22, + 0x01, 0xeb, 0x01, 0x11, 0x06, 0xeb, 0xc1, 0x01, 0x00, 0x91, 0xa9, 0x49, + 0x00, 0xea, 0x01, 0x03, 0x00, 0x20, 0x01, 0x21, 0xb8, 0x47, 0xa7, 0x48, + 0x90, 0xf8, 0x5f, 0x02, 0x10, 0xb1, 0xa6, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x20, 0x46, 0x00, 0xf0, 0x7d, 0xf9, 0x28, 0x78, 0x00, 0xeb, 0x00, 0x10, + 0x06, 0xeb, 0xc0, 0x00, 0x02, 0x6a, 0x01, 0x69, 0x02, 0xeb, 0x44, 0x02, + 0xd9, 0xf8, 0x00, 0x40, 0x22, 0xf0, 0x70, 0x43, 0x9d, 0x4a, 0x12, 0x68, + 0x00, 0x90, 0x00, 0x20, 0x91, 0x42, 0x4f, 0xf0, 0x01, 0x02, 0x14, 0xbf, + 0x00, 0x21, 0x01, 0x21, 0xa0, 0x47, 0xd8, 0xf8, 0x00, 0x10, 0x40, 0xf2, + 0xf1, 0x20, 0x88, 0x47, 0x28, 0x78, 0x00, 0xeb, 0x00, 0x10, 0x56, 0xf8, + 0x30, 0x00, 0x90, 0xf8, 0xb0, 0x15, 0x00, 0x29, 0x18, 0xbf, 0x01, 0x21, + 0x4a, 0x00, 0x00, 0x21, 0x17, 0xf0, 0x32, 0xfb, 0x28, 0x78, 0x85, 0x49, + 0xc0, 0xeb, 0x40, 0x10, 0x01, 0xeb, 0xc0, 0x00, 0x01, 0x69, 0x49, 0x69, + 0x88, 0x47, 0x00, 0xf0, 0x31, 0xf9, 0x00, 0x28, 0x00, 0xf0, 0xd8, 0x80, + 0x88, 0x49, 0x28, 0x78, 0x88, 0x4a, 0x09, 0x68, 0x42, 0xf8, 0x20, 0x10, + 0xee, 0xf7, 0x10, 0xfa, 0x00, 0x28, 0x00, 0xf0, 0xc7, 0x80, 0x85, 0x48, + 0x00, 0x88, 0x40, 0xf0, 0x98, 0x00, 0xd5, 0xe0, 0x29, 0x78, 0x01, 0xeb, + 0x81, 0x00, 0x07, 0xeb, 0xc0, 0x00, 0xc2, 0x69, 0x42, 0xf4, 0x00, 0x22, + 0xc2, 0x61, 0xc1, 0xeb, 0x41, 0x10, 0x3a, 0xe0, 0x7f, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x28, 0x78, 0x33, 0xe0, 0x00, 0xf0, 0x13, 0xf9, 0x00, 0x28, + 0x3f, 0xf4, 0x6a, 0xaf, 0x6a, 0x48, 0x01, 0x68, 0x00, 0x20, 0x88, 0x47, + 0x28, 0x78, 0x00, 0xeb, 0x00, 0x11, 0x56, 0xf8, 0x31, 0x20, 0x06, 0xeb, + 0xc1, 0x01, 0x9a, 0xb1, 0x92, 0xf8, 0x85, 0x31, 0x01, 0x33, 0x82, 0xf8, + 0x85, 0x31, 0x0a, 0x68, 0x62, 0xb1, 0xd2, 0xf8, 0xcc, 0x31, 0x23, 0xf0, + 0x0f, 0x03, 0xc2, 0xf8, 0xcc, 0x31, 0x0a, 0x68, 0xd2, 0xf8, 0xcc, 0x31, + 0x43, 0xf0, 0x06, 0x03, 0xc2, 0xf8, 0xcc, 0x31, 0x89, 0x68, 0x21, 0xb1, + 0xb1, 0xf8, 0x72, 0x20, 0x01, 0x32, 0xa1, 0xf8, 0x72, 0x20, 0x00, 0xeb, + 0x80, 0x01, 0x07, 0xeb, 0xc1, 0x01, 0xca, 0x69, 0x42, 0xf4, 0x00, 0x12, + 0xca, 0x61, 0xc0, 0xeb, 0x40, 0x10, 0x53, 0x49, 0x01, 0xeb, 0xc0, 0x00, + 0x01, 0x69, 0x49, 0x69, 0x88, 0x47, 0x4c, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x4d, 0x48, 0x01, 0x68, 0x00, 0x20, 0x88, 0x47, 0x28, 0x78, 0x4a, 0x4c, + 0x00, 0xeb, 0x00, 0x10, 0x54, 0xf8, 0x30, 0x10, 0x21, 0xb1, 0xb1, 0xf8, + 0x46, 0x21, 0x01, 0x32, 0xa1, 0xf8, 0x46, 0x21, 0x04, 0xeb, 0xc0, 0x01, + 0x91, 0xf8, 0x45, 0x20, 0x08, 0x69, 0xd2, 0x07, 0x53, 0x4a, 0x12, 0x68, + 0x39, 0xd1, 0x90, 0x42, 0x42, 0xd0, 0x53, 0x4a, 0x12, 0x68, 0x82, 0x42, + 0x03, 0xd1, 0x52, 0x48, 0x82, 0x88, 0x01, 0x32, 0x82, 0x80, 0x48, 0x68, + 0x00, 0x69, 0x00, 0xf0, 0xd1, 0xf8, 0x4f, 0x48, 0x29, 0x78, 0x32, 0x4e, + 0x00, 0x22, 0x07, 0x68, 0x01, 0x20, 0x00, 0x90, 0x01, 0xeb, 0x81, 0x00, + 0x01, 0xeb, 0x01, 0x11, 0x04, 0xeb, 0xc1, 0x03, 0x06, 0xeb, 0xc0, 0x00, + 0x28, 0x21, 0xb8, 0x47, 0x47, 0x48, 0x2c, 0x78, 0x3c, 0x49, 0x00, 0x68, + 0x41, 0xf8, 0x24, 0x00, 0xee, 0xf7, 0x78, 0xf9, 0x30, 0xb1, 0x3a, 0x48, + 0x3a, 0x49, 0x00, 0x88, 0x40, 0xf0, 0x99, 0x00, 0x08, 0x60, 0x2c, 0x78, + 0x04, 0xeb, 0x84, 0x00, 0x06, 0xeb, 0xc0, 0x00, 0x80, 0x7f, 0x00, 0x07, + 0x15, 0xd4, 0x3d, 0x48, 0x00, 0x21, 0x03, 0x22, 0x1b, 0xe0, 0x90, 0x42, + 0x08, 0xd0, 0x91, 0xf8, 0x40, 0x00, 0x34, 0x49, 0x00, 0xf0, 0x0f, 0x00, + 0x01, 0xeb, 0xc0, 0x00, 0x00, 0x79, 0x00, 0xe0, 0x01, 0x20, 0x00, 0xf0, + 0x83, 0xf8, 0x2c, 0x48, 0x00, 0x68, 0x80, 0x47, 0x0c, 0xe0, 0x01, 0x20, + 0x00, 0xf0, 0x7c, 0xf8, 0x28, 0x78, 0x1c, 0x49, 0x01, 0x22, 0x01, 0xeb, + 0x40, 0x10, 0xc1, 0x68, 0x2d, 0x48, 0x03, 0x68, 0x00, 0x20, 0x98, 0x47, + 0x2c, 0x48, 0x01, 0x68, 0x01, 0x20, 0xbd, 0xe8, 0xf8, 0x43, 0x08, 0x47, + 0x20, 0x49, 0x28, 0x78, 0x1c, 0x4a, 0x09, 0x68, 0x42, 0xf8, 0x20, 0x10, + 0xee, 0xf7, 0x38, 0xf9, 0x00, 0x28, 0xef, 0xd0, 0x19, 0x48, 0x00, 0x88, + 0x40, 0xf0, 0x97, 0x00, 0x18, 0x49, 0x08, 0x60, 0xe8, 0xe7, 0x00, 0xbf, + 0xc0, 0xe1, 0x08, 0x00, 0x74, 0x87, 0x08, 0x00, 0x84, 0x71, 0x01, 0x00, + 0x0c, 0x36, 0x01, 0x00, 0x94, 0xb7, 0x08, 0x00, 0xa8, 0xb7, 0x08, 0x00, + 0x14, 0xa1, 0x08, 0x00, 0x9c, 0xb7, 0x08, 0x00, 0xfc, 0x6d, 0x01, 0x00, + 0xf8, 0xa0, 0x08, 0x00, 0x0c, 0x6f, 0x01, 0x00, 0xc4, 0x20, 0x21, 0x40, + 0xe0, 0x58, 0x01, 0x00, 0xfc, 0x20, 0x01, 0x00, 0xf0, 0xa0, 0x08, 0x00, + 0xac, 0xa0, 0x08, 0x00, 0xfe, 0xff, 0xff, 0x0f, 0x8c, 0x7e, 0x08, 0x00, + 0xc4, 0xe1, 0x08, 0x00, 0x64, 0xb7, 0x08, 0x00, 0xc8, 0xe1, 0x08, 0x00, + 0xc0, 0x5d, 0x01, 0x00, 0x26, 0x21, 0x01, 0x00, 0x04, 0x08, 0x00, 0x40, + 0xcc, 0xe1, 0x08, 0x00, 0xf4, 0xd6, 0x08, 0x00, 0x58, 0xb7, 0x08, 0x00, + 0x86, 0x71, 0x0d, 0x10, 0x50, 0xb7, 0x08, 0x00, 0x64, 0x5b, 0x01, 0x00, + 0x74, 0xb7, 0x08, 0x00, 0xb4, 0xb7, 0x08, 0x00, 0xdc, 0xa0, 0x08, 0x00, + 0x90, 0xb7, 0x08, 0x00, 0x24, 0x48, 0xf1, 0x49, 0x00, 0x78, 0x01, 0xeb, + 0x40, 0x10, 0x00, 0x7d, 0x70, 0x47, 0x00, 0xbf, 0x04, 0x48, 0x00, 0x68, + 0x80, 0x06, 0x4f, 0xbf, 0x01, 0x20, 0x03, 0x48, 0x00, 0x68, 0xc0, 0xf3, + 0x40, 0x50, 0x70, 0x47, 0xcc, 0x20, 0x21, 0x40, 0xec, 0x10, 0x21, 0x40, + 0x10, 0xb5, 0x19, 0x49, 0xe5, 0x4b, 0x09, 0x78, 0x4a, 0x01, 0x03, 0xeb, + 0x41, 0x11, 0x9c, 0x58, 0x04, 0xeb, 0x40, 0x04, 0x24, 0xf0, 0x70, 0x44, + 0x9c, 0x50, 0xca, 0x68, 0x40, 0xf2, 0x71, 0x23, 0x10, 0xfb, 0x03, 0x20, + 0xc8, 0x60, 0x10, 0xbd, 0x10, 0xb5, 0x0f, 0x4a, 0x0f, 0x4b, 0xd2, 0x4c, + 0x12, 0x78, 0x1b, 0x68, 0x02, 0xeb, 0x82, 0x02, 0x44, 0xf8, 0x32, 0x00, + 0x04, 0xeb, 0xc2, 0x00, 0x00, 0x22, 0xc2, 0x75, 0x03, 0x74, 0x0a, 0x68, + 0x62, 0xb1, 0x92, 0xf8, 0x4c, 0x24, 0x42, 0x74, 0x07, 0x4a, 0x09, 0x68, + 0x91, 0xf8, 0x35, 0x11, 0x01, 0xeb, 0xc1, 0x01, 0x02, 0xeb, 0x41, 0x01, + 0x49, 0x78, 0xc1, 0x73, 0x10, 0xbd, 0x00, 0xbf, 0x74, 0x87, 0x08, 0x00, + 0x9c, 0x21, 0x21, 0x40, 0x44, 0x28, 0x01, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, + 0xbd, 0x4f, 0x4f, 0xf4, 0x54, 0x70, 0x39, 0x68, 0x88, 0x47, 0xbc, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x00, 0x28, 0x00, 0xf0, 0xd6, 0x80, 0xf0, 0x4d, + 0xdf, 0xf8, 0xe4, 0x82, 0xb9, 0x4a, 0x28, 0x78, 0x00, 0xeb, 0x80, 0x00, + 0x08, 0xeb, 0xc0, 0x00, 0xc1, 0x69, 0x11, 0x60, 0x28, 0x21, 0xde, 0xf7, + 0x61, 0xfe, 0xb5, 0x48, 0x00, 0x68, 0x80, 0x47, 0x29, 0x78, 0x00, 0x28, + 0x44, 0xd0, 0xe8, 0x4e, 0x01, 0xeb, 0x01, 0x10, 0x06, 0xeb, 0xc0, 0x00, + 0x01, 0x69, 0x49, 0x68, 0x88, 0x47, 0x04, 0x46, 0x00, 0xf0, 0x86, 0xf9, + 0x00, 0x28, 0x40, 0xd0, 0x00, 0xf0, 0x82, 0xf9, 0x00, 0x28, 0x00, 0xf0, + 0xad, 0x80, 0x28, 0x78, 0xdd, 0x4a, 0xc0, 0xeb, 0x40, 0x11, 0x02, 0xeb, + 0xc1, 0x01, 0x00, 0x22, 0x81, 0xf8, 0x93, 0x20, 0x00, 0xeb, 0x00, 0x11, + 0x56, 0xf8, 0x31, 0x20, 0x06, 0xeb, 0xc1, 0x01, 0x9a, 0xb1, 0xd2, 0xf8, + 0xcc, 0x31, 0x23, 0xf0, 0x0f, 0x03, 0xc2, 0xf8, 0xcc, 0x31, 0x0a, 0x68, + 0xd2, 0xf8, 0xcc, 0x31, 0x43, 0xf0, 0x06, 0x03, 0xc2, 0xf8, 0xcc, 0x31, + 0x0a, 0x68, 0x22, 0xb1, 0x92, 0xf8, 0x85, 0x31, 0x01, 0x33, 0x82, 0xf8, + 0x85, 0x31, 0x89, 0x68, 0x21, 0xb1, 0xb1, 0xf8, 0x72, 0x20, 0x01, 0x32, + 0xa1, 0xf8, 0x72, 0x20, 0x00, 0xeb, 0x80, 0x00, 0x08, 0xeb, 0xc0, 0x00, + 0xc1, 0x69, 0x41, 0xf4, 0x00, 0x11, 0x06, 0xe0, 0x01, 0xeb, 0x81, 0x00, + 0x08, 0xeb, 0xc0, 0x00, 0xc1, 0x69, 0x41, 0xf4, 0x00, 0x21, 0xc1, 0x61, + 0x73, 0xe0, 0x00, 0x2c, 0xbc, 0xd0, 0x8c, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x28, 0x78, 0x00, 0xeb, 0x00, 0x10, 0x56, 0xf8, 0x30, 0x00, 0x90, 0xf8, + 0xb0, 0x15, 0x00, 0x29, 0x18, 0xbf, 0x01, 0x21, 0x4a, 0x00, 0x00, 0x21, + 0x17, 0xf0, 0x24, 0xf9, 0x84, 0x48, 0x86, 0x49, 0xdf, 0xf8, 0x10, 0x92, + 0x44, 0x71, 0x28, 0x78, 0x09, 0x68, 0xd9, 0xf8, 0x00, 0x70, 0x00, 0xeb, + 0x00, 0x10, 0x06, 0xeb, 0xc0, 0x00, 0x40, 0x68, 0x88, 0x47, 0x29, 0x78, + 0x02, 0x22, 0x01, 0xeb, 0x01, 0x11, 0x06, 0xeb, 0xc1, 0x01, 0x00, 0x91, + 0x7c, 0x49, 0x00, 0xea, 0x01, 0x03, 0x00, 0x20, 0x01, 0x21, 0xb8, 0x47, + 0x28, 0x78, 0xdf, 0xf8, 0xe8, 0xa1, 0x7a, 0x49, 0x40, 0x01, 0x8b, 0x46, + 0x5a, 0xf8, 0x00, 0x00, 0x00, 0xeb, 0x44, 0x00, 0x08, 0x40, 0x77, 0x49, + 0x0a, 0x68, 0x4f, 0xf4, 0xf0, 0x71, 0x90, 0x47, 0x28, 0x78, 0xd9, 0xf8, + 0x00, 0x70, 0x02, 0x21, 0x01, 0x22, 0x00, 0xeb, 0x00, 0x10, 0x06, 0xeb, + 0xc0, 0x00, 0x03, 0x6a, 0x00, 0x90, 0x00, 0x20, 0xb8, 0x47, 0x2a, 0x78, + 0x99, 0x4f, 0x50, 0x01, 0x02, 0xeb, 0x82, 0x01, 0x5a, 0xf8, 0x00, 0x00, + 0x48, 0xf8, 0x31, 0x00, 0xc2, 0xeb, 0x42, 0x11, 0x02, 0xeb, 0x02, 0x12, + 0x06, 0xeb, 0xc2, 0x02, 0x07, 0xeb, 0xc1, 0x01, 0x91, 0xf8, 0x49, 0x30, + 0x92, 0xf8, 0x49, 0x60, 0x9e, 0x42, 0x7a, 0xd1, 0x4b, 0x68, 0x56, 0x68, + 0x9e, 0x42, 0x76, 0xd1, 0x91, 0xf8, 0x84, 0x30, 0x92, 0xf8, 0x84, 0x20, + 0x9a, 0x42, 0x70, 0xd1, 0x00, 0x20, 0x81, 0xf8, 0x93, 0x00, 0x77, 0xe0, + 0x62, 0x48, 0x00, 0x68, 0x80, 0x47, 0x39, 0x68, 0x40, 0xf2, 0xbd, 0x30, + 0x88, 0x47, 0x60, 0x48, 0x00, 0x68, 0x80, 0x47, 0x81, 0x4c, 0xdf, 0xf8, + 0x38, 0x91, 0x20, 0x78, 0x00, 0xeb, 0x00, 0x10, 0x59, 0xf8, 0x30, 0x00, + 0x20, 0xb1, 0xb0, 0xf8, 0x46, 0x11, 0x02, 0x31, 0xa0, 0xf8, 0x46, 0x11, + 0x58, 0x48, 0x4f, 0xf0, 0x00, 0x08, 0x01, 0x68, 0x00, 0x20, 0x88, 0x47, + 0x20, 0x78, 0x78, 0x4f, 0x4f, 0xf0, 0x01, 0x0a, 0xc0, 0xeb, 0x40, 0x10, + 0x07, 0xeb, 0xc0, 0x00, 0x01, 0x69, 0x80, 0xf8, 0x92, 0xa0, 0x49, 0x69, + 0x88, 0x47, 0x20, 0x78, 0x47, 0x4d, 0xf8, 0x21, 0x01, 0x22, 0xc0, 0xeb, + 0x40, 0x10, 0x2e, 0x68, 0xcd, 0xf8, 0x00, 0x80, 0x07, 0xeb, 0xc0, 0x00, + 0x03, 0x46, 0xb0, 0x47, 0x21, 0x78, 0x3d, 0x4a, 0x48, 0x01, 0x01, 0xeb, + 0x01, 0x11, 0x10, 0x58, 0x09, 0xeb, 0xc1, 0x01, 0xff, 0xf7, 0xb8, 0xfe, + 0x21, 0x78, 0x2f, 0x4a, 0x2d, 0x68, 0xcd, 0xf8, 0x00, 0xa0, 0x01, 0xeb, + 0x81, 0x00, 0x01, 0xeb, 0x01, 0x11, 0x02, 0xeb, 0xc0, 0x00, 0x09, 0xeb, + 0xc1, 0x03, 0x28, 0x21, 0x00, 0x22, 0xa8, 0x47, 0x3c, 0x49, 0x20, 0x78, + 0x35, 0x4a, 0x09, 0x68, 0x42, 0xf8, 0x20, 0x10, 0xed, 0xf7, 0x60, 0xff, + 0x28, 0xb1, 0x33, 0x48, 0x33, 0x49, 0x00, 0x88, 0x40, 0xf0, 0xb1, 0x00, + 0x08, 0x60, 0x36, 0x48, 0x00, 0x21, 0x03, 0x22, 0x03, 0x68, 0x00, 0x20, + 0x98, 0x47, 0x34, 0x48, 0x01, 0x68, 0x00, 0x20, 0xbd, 0xe8, 0xf8, 0x4f, + 0x08, 0x47, 0x61, 0x00, 0x08, 0x44, 0x25, 0x49, 0x00, 0xea, 0x0b, 0x00, + 0x09, 0x68, 0x88, 0x47, 0x10, 0xb1, 0x20, 0x46, 0xff, 0xf7, 0x6e, 0xfe, + 0x28, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x07, 0xeb, 0xc0, 0x00, 0x01, 0x69, + 0x49, 0x69, 0x88, 0x47, 0x1d, 0x48, 0x01, 0x21, 0x01, 0x22, 0x04, 0x68, + 0x28, 0x78, 0x00, 0x91, 0xf8, 0x21, 0xc0, 0xeb, 0x40, 0x10, 0x07, 0xeb, + 0xc0, 0x00, 0x03, 0x46, 0xa0, 0x47, 0x18, 0x49, 0x28, 0x78, 0x18, 0x4a, + 0x09, 0x68, 0x42, 0xf8, 0x20, 0x10, 0xed, 0xf7, 0x25, 0xff, 0x00, 0x28, + 0xcf, 0xd0, 0x15, 0x48, 0x15, 0x49, 0x00, 0x88, 0x40, 0xf0, 0xb8, 0x00, + 0x08, 0x60, 0xc8, 0xe7, 0xa8, 0xb7, 0x08, 0x00, 0xd4, 0xe1, 0x08, 0x00, + 0x84, 0x71, 0x01, 0x00, 0x0c, 0x36, 0x01, 0x00, 0x94, 0xb7, 0x08, 0x00, + 0xfc, 0x6d, 0x01, 0x00, 0x9c, 0xb7, 0x08, 0x00, 0xfc, 0x20, 0x01, 0x00, + 0xf0, 0xa0, 0x08, 0x00, 0xac, 0xa0, 0x08, 0x00, 0xfe, 0xff, 0xff, 0x0f, + 0xe0, 0x58, 0x01, 0x00, 0xfc, 0xff, 0xff, 0x0f, 0xcc, 0xa0, 0x08, 0x00, + 0xd0, 0xe1, 0x08, 0x00, 0x74, 0xb7, 0x08, 0x00, 0xd8, 0xe1, 0x08, 0x00, + 0xc0, 0x5d, 0x01, 0x00, 0x26, 0x21, 0x01, 0x00, 0x04, 0x08, 0x00, 0x40, + 0xf4, 0xd6, 0x08, 0x00, 0x14, 0xa1, 0x08, 0x00, 0xf8, 0xa0, 0x08, 0x00, + 0xa4, 0xb7, 0x08, 0x00, 0xdc, 0xa0, 0x08, 0x00, 0x90, 0xb7, 0x08, 0x00, + 0x05, 0x48, 0x00, 0x68, 0x10, 0xf4, 0x08, 0x7f, 0x11, 0xbf, 0x01, 0x20, + 0x03, 0x48, 0x00, 0x68, 0xc0, 0xf3, 0x40, 0x50, 0x70, 0x47, 0x00, 0xbf, + 0xcc, 0x20, 0x21, 0x40, 0xec, 0x10, 0x21, 0x40, 0xb0, 0xb5, 0x06, 0x4c, + 0xa5, 0x88, 0x00, 0xf0, 0x5f, 0xf8, 0xa0, 0x88, 0x85, 0x42, 0x03, 0xd0, + 0x03, 0x48, 0x41, 0x68, 0x01, 0x31, 0x41, 0x60, 0xb0, 0xbd, 0x00, 0xbf, + 0x04, 0x78, 0x01, 0x00, 0x84, 0xf0, 0x05, 0x00, 0x80, 0xb5, 0x00, 0xf0, + 0x55, 0xf8, 0x0b, 0x48, 0x0b, 0x4a, 0x00, 0x78, 0xc0, 0xeb, 0x40, 0x11, + 0x02, 0xeb, 0xc1, 0x01, 0x91, 0xf8, 0xee, 0x10, 0xc9, 0x06, 0x0a, 0xd5, + 0x07, 0x49, 0x00, 0xeb, 0x00, 0x10, 0x51, 0xf8, 0x30, 0x00, 0x20, 0xb1, + 0x90, 0xf8, 0x85, 0x11, 0x01, 0x31, 0x80, 0xf8, 0x85, 0x11, 0x80, 0xbd, + 0x74, 0x87, 0x08, 0x00, 0x0c, 0x6f, 0x01, 0x00, 0xfc, 0x6d, 0x01, 0x00, + 0x09, 0x48, 0x0a, 0x49, 0x01, 0x60, 0x0a, 0x48, 0x0a, 0x49, 0x81, 0x62, + 0x0a, 0x48, 0x0b, 0x49, 0x01, 0x60, 0x0b, 0x48, 0x0b, 0x49, 0x01, 0x60, + 0x0b, 0x48, 0x0c, 0x49, 0x01, 0x60, 0x0c, 0x48, 0x0c, 0x49, 0x01, 0x60, + 0x70, 0x47, 0x00, 0xbf, 0xb8, 0xb7, 0x08, 0x00, 0x7d, 0x40, 0x04, 0x00, + 0x28, 0xd6, 0x08, 0x00, 0x51, 0x3e, 0x04, 0x00, 0xf8, 0xd6, 0x08, 0x00, + 0x01, 0x42, 0x04, 0x00, 0xa8, 0xe3, 0x08, 0x00, 0x51, 0x46, 0x04, 0x00, + 0xcc, 0xe1, 0x08, 0x00, 0xd5, 0x49, 0x04, 0x00, 0x9c, 0xe3, 0x08, 0x00, + 0xf9, 0x49, 0x04, 0x00, 0x4a, 0xf6, 0x5f, 0x0c, 0xc1, 0xf2, 0x0a, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x40, 0xf2, 0xc7, 0x1c, 0xc1, 0xf2, 0x0b, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4d, 0xf2, 0xb5, 0x7c, 0xc1, 0xf2, 0x0a, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0xb0, 0xb5, 0x05, 0x46, 0x11, 0x48, 0x0c, 0x46, + 0x00, 0x21, 0x01, 0x60, 0x10, 0x48, 0x01, 0x60, 0x11, 0xf0, 0x7a, 0xf9, + 0x04, 0x2c, 0x12, 0xd8, 0x0e, 0x48, 0x0f, 0x49, 0x00, 0x5d, 0x0a, 0x68, + 0x40, 0x00, 0x22, 0xf0, 0x7f, 0x62, 0xc0, 0xb2, 0x42, 0xea, 0x00, 0x52, + 0x0a, 0x60, 0xd1, 0xf8, 0x90, 0x20, 0x22, 0xf0, 0x7f, 0x62, 0x42, 0xea, + 0x00, 0x50, 0xc1, 0xf8, 0x90, 0x00, 0x28, 0x46, 0x21, 0x46, 0xbd, 0xe8, + 0xb0, 0x40, 0x00, 0xf0, 0x1f, 0xba, 0x00, 0xbf, 0x10, 0xd6, 0x05, 0x30, + 0x10, 0xee, 0x05, 0x30, 0x75, 0x14, 0x01, 0x00, 0x00, 0xc2, 0x23, 0x40, + 0x10, 0xb5, 0x1c, 0x21, 0x04, 0x46, 0xde, 0xf7, 0x17, 0xfc, 0x2a, 0x48, + 0x00, 0x68, 0x60, 0x76, 0x27, 0x48, 0x00, 0x68, 0xc0, 0xf3, 0x40, 0x00, + 0x20, 0x76, 0x27, 0x48, 0x00, 0x68, 0x00, 0xf0, 0x08, 0x01, 0x20, 0x46, + 0x00, 0xf0, 0x02, 0xf8, 0x10, 0xbd, 0x00, 0xbf, 0xb0, 0xb5, 0x0e, 0x4c, + 0x00, 0x23, 0x22, 0x68, 0xd2, 0xb2, 0xc0, 0xe9, 0x01, 0x32, 0x1a, 0xb1, + 0x25, 0x68, 0xc5, 0xf3, 0x00, 0x65, 0x00, 0xe0, 0x00, 0x25, 0x05, 0x75, + 0x25, 0x6c, 0xed, 0xb2, 0xc0, 0xe9, 0x03, 0x35, 0x15, 0xb1, 0x23, 0x6c, + 0xc3, 0xf3, 0x00, 0x63, 0x43, 0x75, 0x19, 0xb1, 0xd1, 0x1c, 0x81, 0x60, + 0xe9, 0x1c, 0x01, 0x61, 0xb0, 0xbd, 0x00, 0xbf, 0xa8, 0xc2, 0x23, 0x40, + 0xb0, 0xb5, 0x0d, 0x46, 0x1c, 0x21, 0x04, 0x46, 0xde, 0xf7, 0xe0, 0xfb, + 0x6d, 0xb1, 0x0d, 0x48, 0x00, 0x68, 0xc0, 0xf3, 0x40, 0x00, 0x20, 0x76, + 0x95, 0xf8, 0xb0, 0x05, 0x01, 0x28, 0x05, 0xd1, 0x0b, 0x48, 0x00, 0x68, + 0x60, 0x76, 0x0b, 0x48, 0x04, 0xe0, 0xb0, 0xbd, 0x06, 0x48, 0x00, 0x68, + 0x60, 0x76, 0x06, 0x48, 0x00, 0x68, 0x00, 0xf0, 0x08, 0x01, 0x20, 0x46, + 0xff, 0xf7, 0xc0, 0xff, 0xb0, 0xbd, 0x00, 0xbf, 0xf8, 0x95, 0x23, 0x40, + 0x9c, 0x21, 0x21, 0x40, 0x3c, 0x20, 0x21, 0x40, 0x3c, 0x10, 0x21, 0x40, + 0x54, 0x10, 0x21, 0x40, 0xb0, 0xb5, 0x1c, 0x21, 0x04, 0x46, 0xde, 0xf7, + 0xb5, 0xfb, 0x13, 0x48, 0x15, 0x4b, 0x00, 0x22, 0x00, 0x68, 0x60, 0x76, + 0x11, 0x48, 0x00, 0x68, 0xc0, 0xf3, 0x40, 0x00, 0x20, 0x76, 0x10, 0x48, + 0x00, 0x68, 0x19, 0x68, 0xc9, 0xb2, 0xc4, 0xe9, 0x01, 0x21, 0x19, 0xb1, + 0x1d, 0x68, 0xc5, 0xf3, 0x00, 0x65, 0x00, 0xe0, 0x00, 0x25, 0x25, 0x75, + 0x1d, 0x6c, 0xed, 0xb2, 0xc4, 0xe9, 0x03, 0x25, 0x15, 0xb1, 0x1a, 0x6c, + 0xc2, 0xf3, 0x00, 0x62, 0x00, 0x07, 0x62, 0x75, 0x03, 0xd5, 0xc8, 0x1c, + 0xa0, 0x60, 0xe8, 0x1c, 0x20, 0x61, 0xb0, 0xbd, 0xa0, 0x21, 0x21, 0x40, + 0xfc, 0x95, 0x23, 0x40, 0x8c, 0x20, 0x21, 0x40, 0xc8, 0xc2, 0x23, 0x40, + 0x2d, 0xe9, 0xfe, 0x4f, 0x5d, 0x48, 0x01, 0x68, 0x5d, 0x48, 0x88, 0x47, + 0x84, 0x4f, 0x5d, 0x4a, 0x85, 0x4c, 0x5e, 0x4d, 0x38, 0x78, 0x00, 0xeb, + 0x00, 0x11, 0x02, 0xeb, 0xc1, 0x01, 0x5a, 0x4a, 0x49, 0x68, 0x16, 0x68, + 0xa2, 0x6a, 0x8a, 0x42, 0x2a, 0xd0, 0x59, 0x48, 0x01, 0x68, 0xa9, 0x60, + 0x41, 0x68, 0xe9, 0x60, 0x80, 0x68, 0x28, 0x61, 0x56, 0x48, 0x01, 0x68, + 0x56, 0x48, 0x00, 0x69, 0x14, 0x30, 0x88, 0x47, 0x02, 0x46, 0x02, 0x90, + 0x38, 0x78, 0x54, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x80, 0x7d, 0x02, 0x28, + 0x29, 0xd1, 0x52, 0x48, 0x94, 0xf8, 0x32, 0x10, 0x00, 0x78, 0x89, 0x07, + 0x06, 0xd5, 0x50, 0x49, 0x50, 0x4b, 0x91, 0xf8, 0x0e, 0x13, 0x59, 0x5c, + 0x88, 0x42, 0x01, 0xd3, 0x01, 0x46, 0xa8, 0xb1, 0x4d, 0x48, 0x02, 0x68, + 0x02, 0xa8, 0x90, 0x47, 0x02, 0x9a, 0x14, 0xe0, 0x68, 0x49, 0x01, 0xeb, + 0x40, 0x10, 0x10, 0xf8, 0x16, 0x3f, 0x02, 0x46, 0x52, 0xf8, 0x06, 0x1d, + 0x9b, 0xb1, 0x00, 0x23, 0x03, 0x70, 0x48, 0x1c, 0x20, 0xf0, 0x70, 0x41, + 0x11, 0x60, 0x0c, 0xe0, 0x02, 0xf5, 0x80, 0x30, 0x20, 0xf0, 0x70, 0x42, + 0x02, 0x92, 0x41, 0x48, 0x11, 0x46, 0x03, 0x68, 0x40, 0x48, 0x98, 0x47, + 0x40, 0x49, 0x08, 0x40, 0x01, 0x1d, 0x40, 0x48, 0x02, 0x91, 0x02, 0x68, + 0x3f, 0x48, 0x08, 0x30, 0x90, 0x47, 0x4f, 0xf4, 0x80, 0x70, 0x20, 0xea, + 0x06, 0x21, 0x3d, 0x48, 0x29, 0x60, 0x00, 0x68, 0xc0, 0x07, 0x4f, 0xd0, + 0x3b, 0x48, 0x90, 0xf8, 0x06, 0xe0, 0xbe, 0xf1, 0x00, 0x0f, 0x49, 0xd0, + 0x38, 0x78, 0x01, 0x91, 0x4e, 0x49, 0x39, 0x4f, 0x3b, 0x4c, 0x4f, 0xf0, + 0x07, 0x0b, 0x00, 0x22, 0x40, 0x01, 0x0e, 0x58, 0x36, 0x49, 0x34, 0x48, + 0x88, 0x46, 0x36, 0x49, 0x90, 0xf8, 0x00, 0xa0, 0x00, 0x20, 0x89, 0x46, + 0x41, 0x46, 0x68, 0x60, 0x28, 0x60, 0x45, 0xf8, 0x08, 0x60, 0x45, 0xf8, + 0x09, 0xb0, 0x00, 0x23, 0x49, 0x46, 0xd5, 0xf8, 0x00, 0xc0, 0x5f, 0xea, + 0xcc, 0x31, 0x03, 0xd4, 0x01, 0x33, 0xb3, 0xf5, 0x16, 0x6f, 0xf6, 0xd1, + 0x21, 0x68, 0x3b, 0x68, 0x99, 0x42, 0x99, 0xbf, 0x39, 0x68, 0x23, 0x68, + 0x21, 0x68, 0x3b, 0x68, 0xcb, 0x1a, 0x73, 0x45, 0x02, 0xd3, 0x39, 0x68, + 0x51, 0x45, 0x0d, 0xd1, 0x35, 0x49, 0x36, 0x4b, 0x01, 0x32, 0x06, 0xf5, + 0x80, 0x56, 0x10, 0x2a, 0x09, 0x78, 0x03, 0xeb, 0x41, 0x11, 0x49, 0x88, + 0x61, 0xf3, 0x10, 0x46, 0xd2, 0xd1, 0x07, 0xe0, 0x2e, 0x48, 0x2f, 0x49, + 0x00, 0x78, 0x40, 0x01, 0x0e, 0x50, 0x17, 0x49, 0x38, 0x68, 0x08, 0x70, + 0x01, 0x98, 0x28, 0x60, 0xbd, 0xe8, 0xfe, 0x8f, 0x04, 0xba, 0x08, 0x00, + 0x8e, 0x58, 0x01, 0x00, 0xfc, 0x6d, 0x01, 0x00, 0x68, 0xf0, 0x05, 0x00, + 0x88, 0x21, 0x21, 0x40, 0xa0, 0x59, 0x01, 0x00, 0xec, 0xb9, 0x08, 0x00, + 0xfc, 0x73, 0x01, 0x00, 0xb8, 0x5d, 0x01, 0x00, 0x94, 0x58, 0x01, 0x00, + 0x8c, 0x7e, 0x08, 0x00, 0xb3, 0xd8, 0x01, 0x10, 0xd0, 0xb9, 0x08, 0x00, + 0xc0, 0xb9, 0x08, 0x00, 0xc8, 0x5d, 0x01, 0x00, 0xfc, 0xff, 0xff, 0x0f, + 0x00, 0xba, 0x08, 0x00, 0x60, 0x86, 0x01, 0x00, 0x04, 0x10, 0x00, 0x40, + 0x8c, 0x32, 0x06, 0x00, 0x20, 0xf0, 0x05, 0x00, 0x9c, 0x21, 0x11, 0x40, + 0x98, 0xfe, 0xff, 0xff, 0x88, 0xfe, 0xff, 0xff, 0x9c, 0x21, 0x01, 0x40, + 0x80, 0xb5, 0x00, 0xf0, 0x93, 0xf8, 0x02, 0x48, 0x02, 0x49, 0x00, 0x68, + 0x08, 0x60, 0x80, 0xbd, 0x24, 0x20, 0x00, 0x40, 0x24, 0xf0, 0x05, 0x00, + 0x70, 0xb5, 0x09, 0x4c, 0x09, 0x4d, 0x20, 0x78, 0x05, 0xeb, 0x40, 0x10, + 0x06, 0x69, 0x00, 0xf0, 0x87, 0xf8, 0x07, 0x48, 0x90, 0xf8, 0x30, 0x00, + 0x82, 0x28, 0x03, 0xd1, 0x20, 0x78, 0x05, 0xeb, 0x40, 0x10, 0x06, 0x61, + 0x70, 0xbd, 0x00, 0xbf, 0x74, 0x87, 0x08, 0x00, 0xe0, 0x58, 0x01, 0x00, + 0x38, 0x5d, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x46, 0x08, 0xf0, 0xa6, 0xfd, + 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, 0x73, 0xb8, 0xb0, 0xb5, + 0x0c, 0x46, 0x05, 0x46, 0x08, 0xf0, 0x9c, 0xfd, 0x28, 0x46, 0x21, 0x46, + 0xbd, 0xe8, 0xb0, 0x40, 0x00, 0xf0, 0x6e, 0xb8, 0x10, 0xb5, 0x04, 0x46, + 0x08, 0xf0, 0x92, 0xfd, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, + 0x6b, 0xb8, 0xb0, 0xb5, 0x0c, 0x46, 0x05, 0x46, 0x08, 0xf0, 0x88, 0xfd, + 0x28, 0x46, 0x21, 0x46, 0xbd, 0xe8, 0xb0, 0x40, 0x00, 0xf0, 0x66, 0xb8, + 0x0e, 0x48, 0x0f, 0x49, 0x18, 0x4a, 0x01, 0x60, 0x0e, 0x48, 0x0f, 0x49, + 0x01, 0x60, 0x0f, 0x48, 0x0f, 0x49, 0x01, 0x60, 0x0f, 0x48, 0x10, 0x49, + 0x01, 0x60, 0x10, 0x48, 0x10, 0x49, 0x01, 0x61, 0x10, 0x49, 0x0a, 0x60, + 0x11, 0x49, 0x12, 0x4a, 0x0a, 0x60, 0x12, 0x49, 0x12, 0x4a, 0xc0, 0xe9, + 0x1f, 0x21, 0x12, 0x49, 0x12, 0x4a, 0xc0, 0xe9, 0x0e, 0x21, 0x70, 0x47, + 0x74, 0xbb, 0x08, 0x00, 0x11, 0x4b, 0x04, 0x00, 0xc0, 0xd6, 0x08, 0x00, + 0xb5, 0x4a, 0x04, 0x00, 0x78, 0xbb, 0x08, 0x00, 0xd5, 0x4b, 0x04, 0x00, + 0x24, 0xb8, 0x08, 0x00, 0x7d, 0x4b, 0x04, 0x00, 0x94, 0xd5, 0x08, 0x00, + 0x1d, 0x4e, 0x04, 0x00, 0xd8, 0xbc, 0x08, 0x00, 0x35, 0x4e, 0x04, 0x00, + 0x88, 0xd6, 0x08, 0x00, 0x3d, 0x4c, 0x04, 0x00, 0xa3, 0x4e, 0x04, 0x00, + 0x91, 0x4e, 0x04, 0x00, 0x7b, 0x4e, 0x04, 0x00, 0x69, 0x4e, 0x04, 0x00, + 0x4c, 0xf2, 0xe3, 0x5c, 0xc1, 0xf2, 0x0a, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x49, 0xf2, 0x81, 0x1c, 0xc1, 0xf2, 0x0a, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4a, 0xf6, 0x95, 0x0c, 0xc1, 0xf2, 0x0a, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x49, 0xf2, 0x8b, 0x5c, 0xc1, 0xf2, 0x0a, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x49, 0xf2, 0x25, 0x7c, 0xc1, 0xf2, 0x0a, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x49, 0xf6, 0x31, 0x7c, 0xc1, 0xf2, 0x0a, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4a, 0xf2, 0x17, 0x0c, 0xc1, 0xf2, 0x0a, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0xf8, 0xb5, 0x04, 0x46, 0xc8, 0x06, 0x48, 0xbf, 0xf8, 0xbd, 0xc8, 0x48, + 0x0f, 0x46, 0x16, 0x46, 0x01, 0x68, 0x0c, 0x20, 0x88, 0x47, 0x88, 0xb1, + 0x05, 0x46, 0x07, 0x72, 0x00, 0x20, 0x28, 0x80, 0xb4, 0xf9, 0x8c, 0x00, + 0x6e, 0x80, 0x6c, 0x60, 0x00, 0x28, 0x0d, 0xd4, 0x16, 0x48, 0xc4, 0xf8, + 0x50, 0x53, 0x01, 0x68, 0x20, 0x46, 0xbd, 0xe8, 0xf8, 0x40, 0x08, 0x47, + 0x00, 0x20, 0x47, 0x21, 0xbd, 0xe8, 0xf8, 0x40, 0xe1, 0xf7, 0x74, 0xbe, + 0x10, 0x48, 0x01, 0x68, 0x51, 0xb1, 0x10, 0x4f, 0x0e, 0x4e, 0x48, 0x68, + 0xa0, 0x42, 0x0b, 0xd0, 0x3a, 0x68, 0x30, 0x46, 0x90, 0x47, 0x01, 0x46, + 0x00, 0x28, 0xf6, 0xd1, 0x09, 0x49, 0x28, 0x46, 0xbd, 0xe8, 0xf8, 0x40, + 0xde, 0xf7, 0xe6, 0xb9, 0x08, 0x46, 0x0c, 0x21, 0x2a, 0x46, 0x0c, 0x23, + 0xdc, 0xf7, 0x0a, 0xf8, 0x28, 0x46, 0xbd, 0xe8, 0xf8, 0x40, 0xe1, 0xf7, + 0x73, 0xbe, 0x00, 0xbf, 0x3c, 0xdd, 0x08, 0x00, 0xf4, 0x5a, 0x01, 0x00, + 0xec, 0xa0, 0x08, 0x00, 0xf0, 0xb5, 0xdf, 0xf8, 0x30, 0xc1, 0x9c, 0xf8, + 0xc3, 0x51, 0xa5, 0xb1, 0x4a, 0x4a, 0x00, 0x23, 0x00, 0x26, 0x12, 0x68, + 0x14, 0x46, 0x4a, 0xb1, 0x94, 0xf8, 0x9a, 0x70, 0x37, 0xb1, 0xd4, 0xf8, + 0x9c, 0x10, 0x19, 0xb1, 0xf1, 0xb2, 0x81, 0x42, 0x08, 0xd0, 0x01, 0x36, + 0x01, 0x33, 0x04, 0xf5, 0xf0, 0x74, 0xab, 0x42, 0xef, 0xd3, 0x00, 0x27, + 0xf8, 0xb2, 0xf0, 0xbd, 0x20, 0x78, 0xa8, 0xb3, 0x01, 0x28, 0xf9, 0xd1, + 0x04, 0xf5, 0xea, 0x71, 0x94, 0xf8, 0xd5, 0x01, 0x11, 0xf8, 0x02, 0x4b, + 0x44, 0xea, 0x00, 0x20, 0x0c, 0x78, 0x49, 0x78, 0x44, 0xea, 0x01, 0x21, + 0x40, 0xea, 0x01, 0x44, 0xc3, 0xeb, 0x03, 0x10, 0x02, 0xeb, 0x40, 0x10, + 0x00, 0xf5, 0xe8, 0x72, 0x94, 0x42, 0x5a, 0xd0, 0xbc, 0xf8, 0xb8, 0x11, + 0x00, 0x20, 0x14, 0xf8, 0x04, 0x3f, 0x40, 0x1a, 0xe5, 0x6a, 0x94, 0xf8, + 0x4a, 0x60, 0x94, 0xf8, 0x54, 0x70, 0xbe, 0x42, 0x88, 0xbf, 0x37, 0x46, + 0x0d, 0x44, 0x7e, 0x1c, 0x06, 0xfb, 0x05, 0x00, 0x65, 0x78, 0xa6, 0x78, + 0xe4, 0x78, 0x43, 0xea, 0x05, 0x23, 0x46, 0xea, 0x04, 0x24, 0x43, 0xea, + 0x04, 0x44, 0x94, 0x42, 0xe5, 0xd1, 0x3d, 0xe0, 0x04, 0xf5, 0xea, 0x71, + 0x94, 0xf8, 0xd5, 0x01, 0x11, 0xf8, 0x02, 0x4b, 0x44, 0xea, 0x00, 0x20, + 0x0c, 0x78, 0x49, 0x78, 0x44, 0xea, 0x01, 0x21, 0x40, 0xea, 0x01, 0x44, + 0xc3, 0xeb, 0x03, 0x10, 0x02, 0xeb, 0x40, 0x10, 0x00, 0xf5, 0xe8, 0x72, + 0x94, 0x42, 0x26, 0xd0, 0x00, 0x20, 0x00, 0x23, 0x14, 0xf8, 0x04, 0x1f, + 0x65, 0x6f, 0x9d, 0x42, 0x84, 0xbf, 0xa4, 0xf1, 0xfc, 0x00, 0x2b, 0x46, + 0x65, 0x78, 0xa6, 0x78, 0xe4, 0x78, 0x41, 0xea, 0x05, 0x21, 0x46, 0xea, + 0x04, 0x24, 0x41, 0xea, 0x04, 0x44, 0x94, 0x42, 0xec, 0xd1, 0x80, 0xb1, + 0xbc, 0xf8, 0xb8, 0x11, 0x5a, 0x1a, 0xd0, 0xf8, 0x28, 0x31, 0x19, 0x44, + 0x90, 0xf8, 0x46, 0x31, 0x90, 0xf8, 0x50, 0x01, 0x83, 0x42, 0x88, 0xbf, + 0x18, 0x46, 0x01, 0x30, 0x00, 0xfb, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, + 0x40, 0xf2, 0xe2, 0x41, 0xb0, 0xfb, 0xf1, 0xf0, 0x47, 0x1c, 0x81, 0xe7, + 0xe8, 0x65, 0x08, 0x00, 0xe0, 0x35, 0x01, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, + 0x06, 0x46, 0x55, 0x48, 0x0d, 0x46, 0x01, 0x68, 0xbc, 0x20, 0x88, 0x47, + 0x00, 0x28, 0x00, 0xf0, 0x87, 0x80, 0x80, 0x46, 0x51, 0x48, 0xd6, 0xf8, + 0xd4, 0x10, 0x2a, 0x46, 0x00, 0x23, 0x4f, 0xf0, 0x00, 0x0b, 0x04, 0x68, + 0x40, 0x46, 0xa0, 0x47, 0x98, 0xf8, 0x00, 0x50, 0x15, 0xb3, 0x00, 0x27, + 0x4f, 0xf0, 0x00, 0x09, 0x4f, 0xf0, 0x00, 0x0b, 0x08, 0xeb, 0xc7, 0x06, + 0xf4, 0x88, 0x20, 0x2c, 0x10, 0xd8, 0xb0, 0x7a, 0x05, 0x28, 0x03, 0xd0, + 0x01, 0x28, 0x08, 0xd1, 0x70, 0x7a, 0x05, 0xe0, 0x5f, 0xfa, 0x89, 0xf0, + 0xff, 0xf7, 0x34, 0xff, 0x09, 0xf1, 0x01, 0x09, 0x30, 0x72, 0xa3, 0x45, + 0x38, 0xbf, 0xa3, 0x46, 0x01, 0x37, 0xaf, 0x42, 0xe6, 0xd3, 0xbb, 0xf1, + 0x1f, 0x0f, 0x88, 0xbf, 0x4f, 0xf0, 0x20, 0x0b, 0x08, 0xf1, 0x04, 0x03, + 0x4f, 0xea, 0x4b, 0x00, 0x00, 0x21, 0x4f, 0xf0, 0x01, 0x0c, 0x00, 0x22, + 0x2c, 0x06, 0x26, 0xd0, 0x01, 0x3d, 0xec, 0xb2, 0x03, 0xeb, 0xc4, 0x06, + 0x77, 0x88, 0x20, 0x2f, 0xf6, 0xd8, 0x96, 0xf8, 0x04, 0xe0, 0x88, 0xf8, + 0x00, 0x50, 0xbe, 0xf1, 0x00, 0x0f, 0xef, 0xd0, 0x33, 0xf8, 0x34, 0x90, + 0x4f, 0xf0, 0x00, 0x0a, 0x0a, 0xeb, 0x09, 0x04, 0xb4, 0xfb, 0xf7, 0xf6, + 0x06, 0xfb, 0x17, 0x44, 0x84, 0x42, 0x07, 0xd2, 0x0c, 0xfa, 0x04, 0xf6, + 0x3c, 0x44, 0x42, 0xea, 0xe6, 0x72, 0x31, 0x43, 0xa4, 0xb2, 0xf5, 0xe7, + 0x0a, 0xf1, 0x01, 0x0a, 0xf2, 0x45, 0xeb, 0xd3, 0xd6, 0xe7, 0xff, 0x23, + 0x88, 0xf8, 0x00, 0x30, 0x51, 0xea, 0x02, 0x03, 0x21, 0xd0, 0xbb, 0xf1, + 0x00, 0x0f, 0x20, 0xd0, 0xa0, 0xf1, 0x01, 0x0c, 0x00, 0x25, 0x4f, 0xf0, + 0x01, 0x0e, 0x00, 0x27, 0x00, 0x24, 0x0e, 0xfa, 0x05, 0xf3, 0x02, 0xea, + 0xe3, 0x76, 0x0b, 0x40, 0x33, 0x43, 0x01, 0xd1, 0xac, 0x45, 0x09, 0xd1, + 0x63, 0xb2, 0xfe, 0xb2, 0x9e, 0x42, 0xc8, 0xbf, 0x3c, 0x46, 0x00, 0x27, + 0x01, 0x35, 0x85, 0x42, 0xed, 0xd3, 0x07, 0xe0, 0x01, 0x37, 0xf9, 0xe7, + 0x01, 0x20, 0xbd, 0xe8, 0xf8, 0x8f, 0x14, 0x24, 0x01, 0xe0, 0x00, 0x24, + 0x64, 0x00, 0x98, 0xf8, 0x01, 0x50, 0x40, 0x46, 0xe1, 0xf7, 0x30, 0xfd, + 0x00, 0x2d, 0x18, 0xbf, 0x02, 0x3c, 0x61, 0xb2, 0x05, 0x29, 0xc4, 0xbf, + 0x05, 0x20, 0xbd, 0xe8, 0xf8, 0x8f, 0x01, 0x20, 0x03, 0x29, 0xc8, 0xbf, + 0x03, 0x20, 0xbd, 0xe8, 0xf8, 0x8f, 0x00, 0xbf, 0xd4, 0x9b, 0x08, 0x00, + 0xc4, 0x9b, 0x08, 0x00, 0x2d, 0xe9, 0xf8, 0x43, 0xdf, 0xf8, 0x48, 0x80, + 0x98, 0xf8, 0x00, 0x10, 0xe9, 0xb1, 0x11, 0x4f, 0x11, 0x4d, 0xdf, 0xf8, + 0x48, 0x90, 0x04, 0x46, 0x00, 0x26, 0x57, 0xf8, 0x26, 0x00, 0x88, 0xb1, + 0x2a, 0x68, 0x0a, 0xb1, 0x82, 0x42, 0x0d, 0xd0, 0x90, 0xf8, 0x38, 0x20, + 0x02, 0xf0, 0xfe, 0x02, 0x4a, 0x2a, 0x07, 0xd0, 0xb0, 0xf8, 0x7e, 0x24, + 0xd9, 0xf8, 0x00, 0x30, 0x21, 0x46, 0x98, 0x47, 0x98, 0xf8, 0x00, 0x10, + 0x01, 0x36, 0x8e, 0x42, 0xe7, 0xd3, 0xbd, 0xe8, 0xf8, 0x83, 0x00, 0xbf, + 0x5c, 0x34, 0x01, 0x00, 0x10, 0x61, 0x01, 0x00, 0xe4, 0x5e, 0x01, 0x00, + 0x18, 0xc5, 0x08, 0x00, 0x04, 0x48, 0x05, 0x49, 0x01, 0x60, 0x05, 0x48, + 0x05, 0x49, 0x01, 0x60, 0x05, 0x48, 0x06, 0x49, 0x01, 0x60, 0x70, 0x47, + 0xe4, 0xbf, 0x08, 0x00, 0x61, 0x51, 0x04, 0x00, 0xe0, 0xbf, 0x08, 0x00, + 0x91, 0x4f, 0x04, 0x00, 0xcc, 0xca, 0x08, 0x00, 0xc5, 0x52, 0x04, 0x00, + 0xf8, 0xb5, 0x04, 0x46, 0x40, 0x48, 0xd4, 0xf8, 0x88, 0x10, 0x00, 0x78, + 0x11, 0xf4, 0x00, 0x71, 0x84, 0xf8, 0x75, 0x00, 0x3d, 0x48, 0x00, 0x78, + 0x84, 0xf8, 0x76, 0x00, 0x03, 0xd0, 0x94, 0xf8, 0xdc, 0x24, 0x92, 0x07, + 0x03, 0xd5, 0x3a, 0x4a, 0x92, 0x78, 0x52, 0x07, 0x03, 0xd4, 0x39, 0x4a, + 0x12, 0x78, 0x84, 0xf8, 0x74, 0x20, 0x89, 0x4a, 0x92, 0xf8, 0xd5, 0x30, + 0xdb, 0x07, 0x07, 0xd1, 0x98, 0x4b, 0x1b, 0x78, 0x01, 0x2b, 0x18, 0xd0, + 0x42, 0x4b, 0x1b, 0x78, 0x01, 0x2b, 0x14, 0xd0, 0xd4, 0xf8, 0xd4, 0x30, + 0x5b, 0x7f, 0x1b, 0xb1, 0x79, 0xb1, 0x94, 0xf8, 0xe0, 0x14, 0x02, 0xe0, + 0x59, 0xb1, 0x94, 0xf8, 0xdf, 0x14, 0x11, 0xf0, 0x08, 0x01, 0x06, 0xd1, + 0x92, 0xf8, 0xd6, 0x10, 0x00, 0x29, 0x18, 0xbf, 0x08, 0x46, 0x84, 0xf8, + 0x76, 0x00, 0x27, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0xc8, 0xb1, + 0x43, 0x79, 0x82, 0x79, 0x05, 0x46, 0x93, 0x42, 0x05, 0xd9, 0x00, 0x20, + 0x78, 0x21, 0xe1, 0xf7, 0x6d, 0xfc, 0x6b, 0x79, 0xaa, 0x79, 0x94, 0xf8, + 0x75, 0x00, 0x94, 0xf8, 0x76, 0x10, 0x83, 0x42, 0x88, 0xbf, 0x18, 0x46, + 0x84, 0xf8, 0x75, 0x00, 0x8a, 0x42, 0x38, 0xbf, 0x11, 0x46, 0x84, 0xf8, + 0x76, 0x10, 0x03, 0xe0, 0x94, 0xf8, 0x75, 0x00, 0x94, 0xf8, 0x76, 0x10, + 0x88, 0x42, 0x24, 0xbf, 0x84, 0xf8, 0x75, 0x10, 0x08, 0x46, 0x94, 0xf8, + 0x74, 0x20, 0x8a, 0x42, 0x8c, 0xbf, 0x0a, 0x46, 0x90, 0x42, 0x04, 0xd9, + 0x90, 0x42, 0x88, 0xbf, 0x02, 0x46, 0x84, 0xf8, 0x74, 0x20, 0x0e, 0x48, + 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x0d, 0x4f, 0x04, 0xf1, 0x78, 0x05, + 0x00, 0x26, 0x94, 0xf8, 0x74, 0x00, 0x3a, 0x68, 0xf1, 0xb2, 0x90, 0x47, + 0x25, 0xf8, 0x16, 0x00, 0x01, 0x36, 0x04, 0x2e, 0xf5, 0xd1, 0xf8, 0xbd, + 0x6b, 0x34, 0x01, 0x00, 0x6a, 0x34, 0x01, 0x00, 0xa8, 0x52, 0x01, 0x00, + 0x6e, 0x34, 0x01, 0x00, 0x30, 0xea, 0x08, 0x00, 0x18, 0x9c, 0x08, 0x00, + 0x38, 0x9c, 0x08, 0x00, 0x10, 0xb5, 0x04, 0x46, 0x0a, 0x48, 0x00, 0x78, + 0x01, 0x28, 0x08, 0xbf, 0x10, 0xbd, 0x20, 0x46, 0xff, 0xf7, 0x64, 0xff, + 0x07, 0x49, 0x94, 0xf8, 0x35, 0x01, 0x09, 0x68, 0x88, 0x47, 0x06, 0x48, + 0x81, 0x21, 0x00, 0x22, 0x03, 0x68, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, + 0x18, 0x47, 0x00, 0xbf, 0x63, 0x34, 0x01, 0x00, 0x54, 0x9c, 0x08, 0x00, + 0x48, 0x9c, 0x08, 0x00, 0x15, 0x28, 0x03, 0xd1, 0x13, 0x88, 0x43, 0xf0, + 0x08, 0x03, 0x13, 0x80, 0x00, 0xf0, 0xbe, 0xb8, 0x2d, 0xe9, 0xf0, 0x47, + 0x15, 0x46, 0x0c, 0x46, 0x11, 0x28, 0x1e, 0xd0, 0x2c, 0x28, 0x16, 0xd1, + 0x00, 0x2d, 0x5b, 0xd0, 0x21, 0x78, 0x01, 0x29, 0x11, 0xd1, 0x94, 0xf8, + 0x88, 0x14, 0x89, 0x07, 0x0d, 0xd5, 0x94, 0xf8, 0xa4, 0x14, 0x4a, 0x07, + 0x48, 0xbf, 0x5f, 0xea, 0x01, 0x71, 0x06, 0xd5, 0x69, 0x79, 0xc1, 0xf3, + 0xc3, 0x01, 0x05, 0x39, 0x02, 0x29, 0x00, 0xd2, 0x4e, 0xe0, 0x21, 0x46, + 0x2a, 0x46, 0xbd, 0xe8, 0xf0, 0x47, 0x00, 0xf0, 0x9f, 0xb8, 0x00, 0x2d, + 0x41, 0xd0, 0x94, 0xf8, 0x38, 0x00, 0x47, 0x28, 0x42, 0xd1, 0x24, 0x48, + 0x47, 0x21, 0x2a, 0x46, 0x03, 0x68, 0x20, 0x46, 0x98, 0x47, 0x07, 0x46, + 0x2a, 0x28, 0x3a, 0xd1, 0xdf, 0xf8, 0x80, 0x90, 0x20, 0x48, 0x99, 0xf8, + 0xbc, 0x14, 0x40, 0x30, 0x01, 0xf0, 0x01, 0x01, 0xdf, 0xf7, 0xbc, 0xfe, + 0x90, 0xb3, 0xdf, 0xf8, 0x74, 0xa0, 0x80, 0x46, 0x04, 0xf5, 0x5b, 0x76, + 0x00, 0x27, 0xda, 0xf8, 0x00, 0x20, 0x30, 0x46, 0x39, 0x46, 0x90, 0x47, + 0x58, 0xb1, 0x07, 0x46, 0x00, 0x78, 0x47, 0x28, 0xf5, 0xd1, 0x16, 0x48, + 0x39, 0x46, 0x02, 0x68, 0x30, 0x46, 0x90, 0x47, 0x38, 0x46, 0xe1, 0xf7, + 0xc7, 0xfb, 0xb9, 0xf8, 0xbe, 0x14, 0x40, 0x46, 0x2a, 0x46, 0x0d, 0x23, + 0xdb, 0xf7, 0x52, 0xfd, 0x20, 0x46, 0x41, 0x46, 0x47, 0x22, 0x00, 0x23, + 0x00, 0x27, 0x00, 0xf0, 0x65, 0xf8, 0x08, 0xe0, 0x00, 0x20, 0xeb, 0x21, + 0x02, 0xe0, 0x00, 0x20, 0x40, 0xf2, 0x07, 0x11, 0xdb, 0xf7, 0x30, 0xfd, + 0x0c, 0x27, 0x38, 0x46, 0xbd, 0xe8, 0xf0, 0x87, 0x2a, 0x27, 0xfa, 0xe7, + 0xc4, 0xba, 0x08, 0x00, 0x8c, 0x7e, 0x08, 0x00, 0x68, 0x8a, 0x01, 0x00, + 0xec, 0xa0, 0x08, 0x00, 0xe8, 0xa0, 0x08, 0x00, 0x10, 0xb5, 0x04, 0x46, + 0x0c, 0x48, 0x00, 0x78, 0x08, 0xb9, 0x09, 0xf0, 0x75, 0xf8, 0x0b, 0x48, + 0x01, 0x68, 0x21, 0xf0, 0x01, 0x01, 0x01, 0x60, 0x20, 0x46, 0x00, 0xf0, + 0x43, 0xf8, 0x20, 0x68, 0x07, 0x49, 0x90, 0xf8, 0x35, 0x01, 0x00, 0xeb, + 0x40, 0x00, 0x01, 0xeb, 0x40, 0x10, 0x4f, 0xf0, 0xff, 0x31, 0x41, 0x65, + 0x10, 0xbd, 0x00, 0xbf, 0x54, 0x34, 0x01, 0x00, 0x68, 0xf0, 0x05, 0x00, + 0x54, 0xf1, 0x05, 0x00, 0x06, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, + 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, + 0x08, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, 0xb8, 0x9b, 0x08, 0x00, + 0xb1, 0x54, 0x04, 0x00, 0x90, 0xd7, 0x08, 0x00, 0x75, 0x54, 0x04, 0x00, + 0xf0, 0xcb, 0x08, 0x00, 0xc1, 0x54, 0x04, 0x00, 0xbc, 0xd8, 0x08, 0x00, + 0xbd, 0x55, 0x04, 0x00, 0x42, 0xf6, 0x35, 0x6c, 0xc1, 0xf2, 0x0b, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x43, 0xf2, 0xc1, 0x1c, 0xc1, 0xf2, 0x0b, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x44, 0xf2, 0xf1, 0x7c, 0xc1, 0xf2, 0x0b, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x42, 0xf6, 0x45, 0x3c, 0xc1, 0xf2, 0x0b, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x70, 0xb5, 0x14, 0x46, 0x0d, 0x46, 0x06, 0x46, + 0x00, 0xf0, 0xda, 0xf8, 0x28, 0x88, 0x03, 0x28, 0x18, 0xbf, 0x70, 0xbd, + 0x03, 0x48, 0x29, 0x46, 0x22, 0x46, 0x03, 0x68, 0x30, 0x46, 0xbd, 0xe8, + 0x70, 0x40, 0x18, 0x47, 0x40, 0xdb, 0x08, 0x00, 0x10, 0xb5, 0x04, 0x46, + 0x00, 0xf0, 0xce, 0xf8, 0x01, 0x28, 0x0d, 0xd1, 0x0a, 0x49, 0x91, 0xf8, + 0x2d, 0x10, 0x49, 0x07, 0x08, 0xd4, 0x94, 0xf8, 0x88, 0x14, 0x89, 0x07, + 0x44, 0xbf, 0x94, 0xf8, 0xa4, 0x14, 0x5f, 0xea, 0x41, 0x72, 0x00, 0xd4, + 0x10, 0xbd, 0x08, 0x07, 0x4f, 0xf0, 0x03, 0x00, 0x58, 0xbf, 0x01, 0x20, + 0x10, 0xbd, 0x00, 0xbf, 0x10, 0x5a, 0x01, 0x00, 0x2d, 0xe9, 0xf0, 0x41, + 0x1f, 0x4e, 0x88, 0x46, 0x04, 0x46, 0x90, 0xf8, 0x35, 0x51, 0x00, 0xf2, + 0xdb, 0x40, 0x31, 0x68, 0x88, 0x47, 0x07, 0x46, 0x31, 0x68, 0x1b, 0x48, + 0x88, 0x47, 0x06, 0x46, 0x1a, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, + 0x08, 0xb1, 0x90, 0xf8, 0xb9, 0x50, 0x07, 0xea, 0x08, 0x00, 0x06, 0x40, + 0x16, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x06, 0xea, 0x00, 0x01, + 0x14, 0x48, 0x02, 0x68, 0x20, 0x78, 0x90, 0x47, 0x06, 0x46, 0x13, 0x48, + 0x29, 0x46, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0x01, 0x28, 0x0e, 0xd1, + 0x94, 0xf8, 0x88, 0x04, 0x80, 0x07, 0x01, 0xd4, 0x01, 0x20, 0x08, 0xe0, + 0x94, 0xf8, 0xa4, 0x14, 0x48, 0x07, 0x4f, 0xf0, 0x01, 0x00, 0x02, 0xd5, + 0x09, 0x07, 0x58, 0xbf, 0x03, 0x20, 0x86, 0x42, 0x88, 0xbf, 0x06, 0x46, + 0x30, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0xbf, 0xd4, 0xbf, 0x08, 0x00, + 0xa8, 0x52, 0x01, 0x00, 0xec, 0xbf, 0x08, 0x00, 0xf0, 0xbf, 0x08, 0x00, + 0xc4, 0xbf, 0x08, 0x00, 0xe4, 0xbf, 0x08, 0x00, 0x80, 0xb5, 0x01, 0x88, + 0x16, 0x29, 0x12, 0xd8, 0x0b, 0x4a, 0x01, 0xeb, 0x41, 0x03, 0x52, 0xf8, + 0x23, 0x30, 0x63, 0xb1, 0x01, 0xeb, 0x41, 0x01, 0x02, 0xeb, 0x81, 0x01, + 0x09, 0x79, 0x01, 0x29, 0x05, 0xd1, 0x00, 0xf0, 0x59, 0xf8, 0xbd, 0xe8, + 0x80, 0x40, 0x08, 0xf0, 0x8d, 0xbf, 0xbd, 0xe8, 0x80, 0x40, 0x00, 0xf0, + 0x51, 0xb8, 0x00, 0xbf, 0xe8, 0x72, 0x01, 0x00, 0xb0, 0xb5, 0x0c, 0x46, + 0x05, 0x46, 0x0b, 0xf0, 0xf3, 0xfe, 0x28, 0x46, 0x21, 0x46, 0xbd, 0xe8, + 0xb0, 0x40, 0x00, 0xf0, 0x49, 0xb8, 0x1c, 0xb5, 0x05, 0x9c, 0x41, 0xf0, + 0x08, 0x01, 0x01, 0x94, 0x04, 0x9c, 0x00, 0x94, 0x00, 0xf0, 0x46, 0xf8, + 0x1c, 0xbd, 0x00, 0xbf, 0x09, 0x48, 0x0a, 0x49, 0x01, 0x60, 0x0a, 0x48, + 0x0a, 0x49, 0x01, 0x60, 0x0a, 0x48, 0x0b, 0x49, 0x01, 0x60, 0x0b, 0x48, + 0x0b, 0x49, 0x01, 0x60, 0x0b, 0x48, 0x0c, 0x49, 0x01, 0x60, 0x0c, 0x48, + 0x0c, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, 0xcc, 0xbf, 0x08, 0x00, + 0x95, 0x56, 0x04, 0x00, 0x3c, 0xdb, 0x08, 0x00, 0x6d, 0x56, 0x04, 0x00, + 0xc8, 0xbf, 0x08, 0x00, 0xd1, 0x56, 0x04, 0x00, 0x08, 0xca, 0x08, 0x00, + 0x6d, 0x57, 0x04, 0x00, 0xbc, 0xd4, 0x08, 0x00, 0xa9, 0x57, 0x04, 0x00, + 0xc8, 0xc0, 0x08, 0x00, 0xbf, 0x57, 0x04, 0x00, 0x46, 0xf6, 0xb9, 0x4c, + 0xc1, 0xf2, 0x0b, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x47, 0xf6, 0xc1, 0x1c, + 0xc1, 0xf2, 0x0b, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x47, 0xf2, 0x71, 0x4c, + 0xc1, 0xf2, 0x0b, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x47, 0xf2, 0xc5, 0x0c, + 0xc1, 0xf2, 0x0b, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x47, 0xf2, 0x9d, 0x6c, + 0xc1, 0xf2, 0x0b, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x90, 0xf8, 0x38, 0x10, + 0x01, 0xf0, 0xfe, 0x01, 0x4a, 0x29, 0x18, 0xbf, 0x00, 0xf0, 0x0a, 0xb8, + 0x00, 0x20, 0x70, 0x47, 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, + 0xf0, 0xdb, 0x08, 0x00, 0x69, 0x58, 0x04, 0x00, 0x4a, 0xf6, 0x2d, 0x3c, + 0xc1, 0xf2, 0x0b, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0xfe, 0xb5, 0x05, 0x46, + 0x19, 0x48, 0x1c, 0x46, 0x16, 0x46, 0x0f, 0x46, 0x00, 0x68, 0x80, 0x47, + 0xbc, 0x48, 0x90, 0xf8, 0xbc, 0x14, 0x16, 0x48, 0x40, 0x30, 0x01, 0xf0, + 0x01, 0x01, 0xdf, 0xf7, 0xfd, 0xfc, 0x08, 0x99, 0x28, 0x60, 0x70, 0xb1, + 0x01, 0x31, 0x13, 0x2c, 0x81, 0x70, 0x08, 0xbf, 0x47, 0xf0, 0x20, 0x07, + 0x28, 0x68, 0xc7, 0x70, 0x06, 0xf0, 0x01, 0x00, 0x29, 0x68, 0x40, 0xea, + 0x44, 0x00, 0x08, 0x71, 0xfe, 0xbd, 0x00, 0x20, 0x8d, 0xf8, 0x09, 0x40, + 0x8d, 0xf8, 0x0a, 0x10, 0x02, 0xab, 0x00, 0x21, 0x00, 0x22, 0x8d, 0xf8, + 0x08, 0x00, 0x06, 0x48, 0x04, 0x68, 0x04, 0x20, 0x00, 0x90, 0x40, 0xf2, + 0x09, 0x20, 0xa0, 0x47, 0xfe, 0xbd, 0x00, 0xbf, 0xf8, 0xdc, 0x08, 0x00, + 0x68, 0x8a, 0x01, 0x00, 0xa0, 0xa0, 0x08, 0x00, 0x2d, 0xe9, 0xfe, 0x4f, + 0x9a, 0x4d, 0x28, 0x78, 0x00, 0x28, 0x00, 0xf0, 0x2e, 0x81, 0x99, 0x48, + 0x99, 0x4f, 0x9a, 0x4e, 0xdf, 0xf8, 0x68, 0xa2, 0xdf, 0xf8, 0x68, 0xb2, + 0x4f, 0xf0, 0x00, 0x08, 0x00, 0xf1, 0x04, 0x09, 0x57, 0xf8, 0x28, 0x40, + 0x44, 0xb1, 0x30, 0x68, 0x08, 0xb1, 0xa0, 0x42, 0x04, 0xd0, 0xda, 0xf8, + 0x00, 0x10, 0x20, 0x46, 0x88, 0x47, 0x28, 0xb1, 0x28, 0x78, 0x08, 0xf1, + 0x01, 0x08, 0x80, 0x45, 0xee, 0xd3, 0x10, 0xe1, 0xdb, 0xf8, 0x00, 0x10, + 0x20, 0x46, 0x88, 0x47, 0x00, 0x28, 0x70, 0xd0, 0x94, 0xf8, 0xdd, 0x04, + 0x40, 0x07, 0x19, 0xd4, 0x94, 0xf8, 0x75, 0x00, 0x94, 0xf8, 0x76, 0x10, + 0x81, 0x42, 0xe9, 0xd0, 0x88, 0x48, 0x90, 0xf8, 0xd5, 0x00, 0x40, 0x07, + 0xe4, 0xd5, 0x94, 0xf8, 0xdc, 0x04, 0x80, 0x07, 0xe0, 0xd4, 0x89, 0x48, + 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x00, 0x28, 0xda, 0xd0, 0x87, 0x48, + 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0xd5, 0xe7, 0x7d, 0x49, 0x94, 0xf9, + 0x3a, 0x00, 0x91, 0xf9, 0x01, 0x10, 0x88, 0x42, 0x5b, 0xdb, 0xb9, 0xf8, + 0x00, 0x10, 0x89, 0x06, 0x57, 0xd4, 0x78, 0x49, 0x91, 0xf9, 0x00, 0x10, + 0x88, 0x42, 0x40, 0xf3, 0xac, 0x80, 0x94, 0xf8, 0xd8, 0x01, 0x75, 0x49, + 0x01, 0x30, 0x49, 0x7b, 0x84, 0xf8, 0xd8, 0x01, 0xc0, 0xb2, 0x88, 0x42, + 0xc0, 0xf0, 0xc3, 0x80, 0x00, 0x20, 0x84, 0xf8, 0xd8, 0x01, 0x94, 0xf8, + 0xfa, 0x02, 0x41, 0x06, 0x00, 0xf1, 0xbb, 0x80, 0x94, 0xf9, 0x80, 0x10, + 0x11, 0xf1, 0x0e, 0x0f, 0xc0, 0xf2, 0xb5, 0x80, 0x42, 0xb2, 0x00, 0x2a, + 0xa8, 0xd4, 0x00, 0xf0, 0x5f, 0x00, 0x01, 0x29, 0xa4, 0xbf, 0x00, 0x21, + 0x84, 0xf8, 0x80, 0x10, 0x80, 0x30, 0x01, 0x39, 0x84, 0xf8, 0xfa, 0x02, + 0x94, 0xf8, 0xe2, 0x04, 0x84, 0xf8, 0x80, 0x10, 0x40, 0x07, 0x04, 0xd5, + 0x60, 0x48, 0xc0, 0x79, 0x40, 0x07, 0x00, 0xf1, 0xa1, 0x80, 0x60, 0x48, + 0x20, 0x22, 0xd0, 0xf8, 0x00, 0xc0, 0xd4, 0xf8, 0xd4, 0x00, 0x41, 0x7f, + 0x00, 0x20, 0x00, 0x90, 0x80, 0x20, 0x01, 0x90, 0x00, 0x29, 0x18, 0xbf, + 0x01, 0x21, 0x20, 0x46, 0x62, 0xe0, 0x94, 0xf8, 0x38, 0x00, 0xa0, 0xf1, + 0x4a, 0x01, 0x02, 0x29, 0x5f, 0xd2, 0xb4, 0xf8, 0x54, 0x14, 0xb4, 0xf8, + 0x56, 0x04, 0x49, 0x08, 0x11, 0xeb, 0x50, 0x0f, 0x3f, 0xf4, 0x74, 0xaf, + 0x7e, 0xe7, 0x94, 0xf8, 0xd7, 0x01, 0xf9, 0x49, 0x01, 0x30, 0x09, 0x7b, + 0x84, 0xf8, 0xd7, 0x01, 0xc0, 0xb2, 0x88, 0x42, 0x04, 0xd2, 0xb9, 0xf8, + 0x00, 0x00, 0x80, 0x06, 0x7f, 0xf5, 0x64, 0xaf, 0x94, 0xf8, 0xfa, 0x12, + 0x00, 0x20, 0x84, 0xf8, 0xd7, 0x01, 0x88, 0x06, 0x0c, 0xd4, 0xf6, 0x48, + 0x04, 0x21, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0x94, 0xf8, 0xfa, 0x12, + 0x01, 0x28, 0x04, 0xbf, 0x41, 0xf0, 0x20, 0x01, 0x84, 0xf8, 0xfa, 0x12, + 0x88, 0x06, 0x3f, 0xf5, 0x4d, 0xaf, 0x94, 0xf9, 0x80, 0x00, 0x0e, 0x28, + 0x3f, 0xf7, 0x48, 0xaf, 0x4a, 0xb2, 0x00, 0x2a, 0x4d, 0xd4, 0xb0, 0xf1, + 0xff, 0x3f, 0xdc, 0xbf, 0x00, 0x20, 0x84, 0xf8, 0x80, 0x00, 0x02, 0x22, + 0x01, 0x30, 0x62, 0xf3, 0x9f, 0x11, 0x84, 0xf8, 0x80, 0x00, 0x94, 0xf8, + 0xe2, 0x04, 0x84, 0xf8, 0xfa, 0x12, 0x40, 0x07, 0x03, 0xd5, 0x2e, 0x48, + 0xc0, 0x79, 0x40, 0x07, 0x1b, 0xd4, 0xdb, 0x48, 0xd0, 0xf8, 0x00, 0xc0, + 0xd4, 0xf8, 0xd4, 0x00, 0x41, 0x7f, 0x00, 0x20, 0x00, 0x90, 0x80, 0x20, + 0x01, 0x90, 0x20, 0x46, 0x1f, 0x22, 0x00, 0x29, 0x18, 0xbf, 0x01, 0x21, + 0x01, 0x23, 0xe0, 0x47, 0x1c, 0xe7, 0x47, 0x28, 0x7f, 0xf4, 0x1a, 0xaf, + 0x24, 0xe7, 0x00, 0x20, 0x84, 0xf8, 0xd8, 0x01, 0x84, 0xf8, 0xd7, 0x01, + 0x12, 0xe7, 0x1f, 0x48, 0x1f, 0x22, 0x01, 0x23, 0xd0, 0xf8, 0x00, 0xc0, + 0xd4, 0xf8, 0xd4, 0x00, 0x41, 0x7f, 0xb9, 0xf8, 0x00, 0x00, 0x80, 0x06, + 0x4f, 0xf0, 0x02, 0x00, 0x58, 0xbf, 0x01, 0x20, 0x00, 0x90, 0x00, 0x29, + 0x4f, 0xf0, 0x00, 0x00, 0x01, 0x90, 0x20, 0x46, 0x18, 0xbf, 0x01, 0x21, + 0xe0, 0x47, 0xb9, 0xf8, 0x00, 0x00, 0x80, 0x06, 0x00, 0xd4, 0xf5, 0xe6, + 0x12, 0x49, 0x01, 0x20, 0x88, 0x73, 0xf1, 0xe6, 0x0e, 0x48, 0xd0, 0xf8, + 0x00, 0xc0, 0xd4, 0xf8, 0xd4, 0x00, 0x41, 0x7f, 0x00, 0x20, 0x00, 0x90, + 0xc2, 0xe7, 0xbd, 0xe8, 0xfe, 0x8f, 0x00, 0xbf, 0x5c, 0x34, 0x01, 0x00, + 0xf0, 0x1e, 0x01, 0x00, 0x10, 0x61, 0x01, 0x00, 0xe4, 0x5e, 0x01, 0x00, + 0xb8, 0xc9, 0x08, 0x00, 0xcc, 0xba, 0x08, 0x00, 0x8a, 0x76, 0x01, 0x00, + 0x8c, 0x7e, 0x08, 0x00, 0xa8, 0x52, 0x01, 0x00, 0xa4, 0xdc, 0x08, 0x00, + 0xac, 0x9b, 0x08, 0x00, 0xfc, 0x1e, 0x01, 0x00, 0xb0, 0xdc, 0x08, 0x00, + 0xa8, 0xdc, 0x08, 0x00, 0x2d, 0xe9, 0xfc, 0x41, 0x0e, 0x68, 0x04, 0x46, + 0x03, 0x2a, 0x3e, 0xd0, 0x30, 0x79, 0x0f, 0x2a, 0x00, 0xf0, 0x01, 0x08, + 0x4c, 0xd0, 0x11, 0x2a, 0x60, 0xd0, 0x7f, 0x2a, 0x73, 0xd0, 0x26, 0x2a, + 0x00, 0xf0, 0x81, 0x80, 0x38, 0x2a, 0x00, 0xf0, 0xb1, 0x80, 0x42, 0x2a, + 0x00, 0xf0, 0xb9, 0x80, 0x25, 0x2a, 0x40, 0xf0, 0xc2, 0x80, 0x70, 0x79, + 0x1f, 0x21, 0x84, 0xf8, 0xd1, 0x01, 0xb0, 0x79, 0x84, 0xf8, 0xd2, 0x01, + 0xf0, 0x79, 0x84, 0xf8, 0xd3, 0x01, 0x30, 0x7a, 0x84, 0xf8, 0xd4, 0x01, + 0x70, 0x7a, 0x84, 0xf8, 0xd5, 0x01, 0xd4, 0xf8, 0x88, 0x00, 0x40, 0xf4, + 0x80, 0x70, 0xc4, 0xf8, 0x88, 0x00, 0x94, 0x48, 0x02, 0x68, 0x20, 0x46, + 0x90, 0x47, 0x10, 0xb1, 0x0b, 0x20, 0x84, 0xf8, 0xd6, 0x01, 0x94, 0x48, + 0x41, 0x46, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0x90, 0x48, 0x21, 0x46, + 0x32, 0x46, 0x03, 0x68, 0x2d, 0x20, 0x98, 0x47, 0x95, 0xe0, 0x70, 0x79, + 0x11, 0x28, 0x49, 0xd1, 0x94, 0xf8, 0xf9, 0x02, 0x0a, 0x28, 0x05, 0xd1, + 0xd4, 0xf8, 0x88, 0x00, 0x40, 0xf4, 0xc0, 0x20, 0xc4, 0xf8, 0x88, 0x00, + 0x20, 0x46, 0x2e, 0x21, 0x32, 0x46, 0x00, 0xf0, 0xb7, 0xf9, 0x82, 0xe0, + 0xc6, 0x48, 0x00, 0x78, 0x40, 0x07, 0x40, 0xf1, 0x80, 0x80, 0x7d, 0x48, + 0x75, 0x79, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x00, 0x28, 0x78, 0xd1, + 0x00, 0x2d, 0x76, 0xd1, 0x94, 0xf8, 0x82, 0x04, 0x03, 0x28, 0x72, 0xd1, + 0x20, 0x46, 0x41, 0x46, 0x0f, 0x22, 0x69, 0xe0, 0xbb, 0x48, 0x00, 0x78, + 0x40, 0x07, 0x6a, 0xd5, 0xd4, 0xf8, 0xd4, 0x00, 0x40, 0x7f, 0x00, 0x28, + 0x65, 0xd0, 0x94, 0xf8, 0x8a, 0x00, 0x80, 0x07, 0x03, 0xd4, 0x94, 0xf8, + 0xa2, 0x02, 0x00, 0x28, 0x5d, 0xd1, 0x20, 0x46, 0x41, 0x46, 0x11, 0x22, + 0x54, 0xe0, 0x70, 0x79, 0x17, 0x28, 0x0b, 0xd1, 0x94, 0xf8, 0x8a, 0x00, + 0x80, 0x07, 0x07, 0xd4, 0x5b, 0x48, 0x41, 0x46, 0x17, 0x22, 0x24, 0x23, + 0x05, 0x68, 0x20, 0x46, 0xa8, 0x47, 0x48, 0xe0, 0x49, 0xe0, 0x70, 0x79, + 0x84, 0xf8, 0xd1, 0x01, 0xb0, 0x79, 0x84, 0xf8, 0xd2, 0x01, 0xf0, 0x79, + 0x84, 0xf8, 0xd3, 0x01, 0x30, 0x7a, 0x84, 0xf8, 0xd4, 0x01, 0x70, 0x7a, + 0x84, 0xf8, 0xd5, 0x01, 0x94, 0xf8, 0x89, 0x00, 0xc0, 0x07, 0x0c, 0xd1, + 0x59, 0x48, 0x1f, 0x21, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0x30, 0xb1, + 0x0b, 0x20, 0x84, 0xf8, 0xd6, 0x01, 0x56, 0x48, 0x01, 0x68, 0x20, 0x46, + 0x88, 0x47, 0xd4, 0xf8, 0x88, 0x00, 0x00, 0x21, 0x00, 0x27, 0x40, 0xf4, + 0x80, 0x70, 0xc4, 0xf8, 0x88, 0x00, 0x51, 0x48, 0x02, 0x68, 0x20, 0x46, + 0x90, 0x47, 0x50, 0x48, 0x21, 0x46, 0x32, 0x46, 0x03, 0x68, 0x2e, 0x20, + 0x98, 0x47, 0x17, 0xe0, 0x3e, 0x4e, 0x30, 0x78, 0x01, 0x28, 0x02, 0xd1, + 0x3d, 0x4f, 0x38, 0x78, 0x98, 0xb1, 0x20, 0x46, 0x41, 0x46, 0x38, 0x22, + 0x06, 0xe0, 0x94, 0xf8, 0x8a, 0x00, 0x80, 0x07, 0x07, 0xd4, 0x20, 0x46, + 0x41, 0x46, 0x42, 0x22, 0x24, 0x23, 0x00, 0xf0, 0x39, 0xf9, 0x00, 0x27, + 0x00, 0xe0, 0x19, 0x27, 0x38, 0x46, 0xbd, 0xe8, 0xfc, 0x81, 0x01, 0x20, + 0x38, 0x70, 0x32, 0x48, 0x00, 0x68, 0x80, 0x47, 0x31, 0x48, 0x90, 0xf8, + 0xf7, 0x00, 0xc0, 0x07, 0x15, 0xd1, 0x30, 0x48, 0x90, 0xf8, 0xd5, 0x00, + 0xc0, 0x07, 0x05, 0xd1, 0x30, 0x78, 0x01, 0x28, 0x16, 0xd0, 0x38, 0x78, + 0x01, 0x28, 0x13, 0xd0, 0xd4, 0xf8, 0xd4, 0x00, 0x40, 0x7f, 0x10, 0xb1, + 0x94, 0xf8, 0xe0, 0x04, 0x01, 0xe0, 0x94, 0xf8, 0xdf, 0x04, 0x00, 0x07, + 0x08, 0xd4, 0x25, 0x49, 0x25, 0x48, 0x91, 0xf8, 0xd6, 0x10, 0x00, 0x78, + 0x00, 0x29, 0x18, 0xbf, 0x08, 0x46, 0x01, 0xe0, 0x21, 0x48, 0x00, 0x78, + 0x6d, 0x4e, 0x84, 0xf8, 0x76, 0x00, 0x84, 0xf8, 0x74, 0x00, 0xc0, 0xb2, + 0x00, 0x21, 0x32, 0x68, 0x90, 0x47, 0x01, 0x27, 0x3d, 0x25, 0xa4, 0xf8, + 0x78, 0x00, 0xa5, 0xf1, 0x3c, 0x01, 0x32, 0x68, 0x94, 0xf8, 0x74, 0x00, + 0xc9, 0xb2, 0x90, 0x47, 0x01, 0x37, 0x24, 0xf8, 0x15, 0x00, 0x01, 0x35, + 0x04, 0x2f, 0xf2, 0xd1, 0x14, 0x48, 0x01, 0x21, 0x00, 0x27, 0x03, 0x22, + 0x01, 0x23, 0x00, 0x68, 0x80, 0xf8, 0x83, 0x10, 0x80, 0xf8, 0x7f, 0x10, + 0x10, 0x48, 0x41, 0x46, 0x05, 0x68, 0x38, 0x20, 0xcd, 0xe9, 0x00, 0x07, + 0x20, 0x46, 0xa8, 0x47, 0x0d, 0x48, 0x00, 0x68, 0x80, 0x47, 0x0d, 0x49, + 0x94, 0xf8, 0x35, 0x01, 0x09, 0x68, 0x88, 0x47, 0x9c, 0xe7, 0x00, 0xbf, + 0xb0, 0x9b, 0x08, 0x00, 0x54, 0x34, 0x01, 0x00, 0x63, 0x34, 0x01, 0x00, + 0xac, 0xda, 0x08, 0x00, 0xe8, 0x65, 0x08, 0x00, 0x8c, 0x7e, 0x08, 0x00, + 0x6a, 0x34, 0x01, 0x00, 0xf8, 0x35, 0x01, 0x00, 0xac, 0x9b, 0x08, 0x00, + 0xbc, 0xba, 0x08, 0x00, 0xc4, 0xc2, 0x08, 0x00, 0xa4, 0x9b, 0x08, 0x00, + 0x0c, 0xbb, 0x08, 0x00, 0x7c, 0xd8, 0x08, 0x00, 0xd4, 0xd8, 0x08, 0x00, + 0xb8, 0x9b, 0x08, 0x00, 0xd0, 0xda, 0x08, 0x00, 0x2d, 0xe9, 0xfe, 0x43, + 0x05, 0x46, 0x90, 0xf8, 0x74, 0x80, 0x3a, 0x48, 0x0e, 0x46, 0x01, 0x68, + 0x28, 0x46, 0x88, 0x47, 0x07, 0x46, 0x38, 0x48, 0x01, 0x68, 0x28, 0x46, + 0x88, 0x47, 0x04, 0x46, 0x95, 0xf8, 0x75, 0x00, 0x95, 0xf8, 0x76, 0x20, + 0x96, 0xf8, 0x04, 0x90, 0xb1, 0x79, 0x82, 0x42, 0x03, 0xd1, 0x02, 0x29, + 0x0a, 0xd1, 0x02, 0x20, 0x29, 0xe0, 0x02, 0x29, 0x0e, 0xd1, 0x95, 0xf8, + 0x74, 0x00, 0xa0, 0x42, 0x38, 0xbf, 0x85, 0xf8, 0x74, 0x40, 0x12, 0xe0, + 0x00, 0x20, 0x00, 0x29, 0x08, 0xbf, 0x03, 0x20, 0x01, 0x29, 0x08, 0xbf, + 0x02, 0x20, 0x18, 0xe0, 0x21, 0xb1, 0x01, 0x29, 0x07, 0xd1, 0x27, 0x48, + 0x21, 0x46, 0x01, 0xe0, 0x24, 0x48, 0x39, 0x46, 0x02, 0x68, 0x28, 0x46, + 0x90, 0x47, 0x95, 0xf8, 0x74, 0x10, 0xa1, 0x42, 0x04, 0xd2, 0x03, 0x20, + 0xb9, 0x42, 0x88, 0xbf, 0x01, 0x20, 0x04, 0xe0, 0xb1, 0x79, 0x02, 0x20, + 0x00, 0x29, 0x08, 0xbf, 0x01, 0x20, 0x1d, 0x49, 0x06, 0x46, 0x1d, 0x4c, + 0x09, 0xf0, 0x01, 0x09, 0x00, 0x27, 0xc9, 0x78, 0x8a, 0x07, 0x48, 0xbf, + 0x40, 0xea, 0x80, 0x06, 0x49, 0x07, 0x48, 0xbf, 0x46, 0xea, 0x00, 0x16, + 0x95, 0xf8, 0x74, 0x00, 0x22, 0x68, 0xf9, 0xb2, 0x90, 0x47, 0x05, 0xeb, + 0x47, 0x01, 0x01, 0x37, 0x04, 0x2f, 0xa1, 0xf8, 0x78, 0x00, 0xf3, 0xd1, + 0x11, 0x48, 0x49, 0x46, 0x20, 0x22, 0x01, 0x23, 0x04, 0x68, 0x00, 0x20, + 0xcd, 0xe9, 0x00, 0x60, 0x28, 0x46, 0xa0, 0x47, 0x0d, 0x49, 0x95, 0xf8, + 0x35, 0x01, 0x09, 0x68, 0x88, 0x47, 0x0c, 0x48, 0x00, 0x21, 0x42, 0x46, + 0x03, 0x68, 0x28, 0x46, 0x03, 0xb0, 0xbd, 0xe8, 0xf0, 0x43, 0x18, 0x47, + 0xcc, 0xdc, 0x08, 0x00, 0xd0, 0xdc, 0x08, 0x00, 0x40, 0x9c, 0x08, 0x00, + 0x44, 0x9c, 0x08, 0x00, 0xa8, 0x52, 0x01, 0x00, 0x38, 0x9c, 0x08, 0x00, + 0xa4, 0xdc, 0x08, 0x00, 0x54, 0x9c, 0x08, 0x00, 0x48, 0x9c, 0x08, 0x00, + 0x06, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x07, 0x49, 0x01, 0x60, + 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, + 0x70, 0x47, 0x00, 0xbf, 0x78, 0xca, 0x08, 0x00, 0x11, 0x59, 0x04, 0x00, + 0x50, 0xc5, 0x08, 0x00, 0x99, 0x58, 0x04, 0x00, 0xc0, 0xda, 0x08, 0x00, + 0xb9, 0x5b, 0x04, 0x00, 0xec, 0xda, 0x08, 0x00, 0x81, 0x5e, 0x04, 0x00, + 0x49, 0xf6, 0x31, 0x3c, 0xc1, 0xf2, 0x0c, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4c, 0xf6, 0x89, 0x0c, 0xc1, 0xf2, 0x0b, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x2d, 0xe9, 0xf0, 0x4f, 0x87, 0xb0, 0x52, 0x4f, 0x38, 0x78, 0x00, 0x28, + 0x00, 0xf0, 0x9a, 0x80, 0xdf, 0xf8, 0x40, 0xa1, 0xdf, 0xf8, 0x40, 0x91, + 0xdf, 0xf8, 0x40, 0x81, 0xdf, 0xf8, 0x4c, 0xb1, 0x00, 0x26, 0x59, 0xf8, + 0x26, 0x40, 0x00, 0x2c, 0x00, 0xf0, 0x82, 0x80, 0xd8, 0xf8, 0x00, 0x00, + 0x08, 0xb1, 0xa0, 0x42, 0x7c, 0xd0, 0xd4, 0xf8, 0x60, 0x53, 0xdd, 0xb1, + 0x94, 0xf8, 0xf9, 0x02, 0xc0, 0xb9, 0x47, 0x48, 0x29, 0x78, 0x00, 0x22, + 0x03, 0x68, 0x20, 0x46, 0x98, 0x47, 0x88, 0xb1, 0x9a, 0xf8, 0x2e, 0x00, + 0x38, 0xb1, 0xda, 0xf8, 0x00, 0x00, 0x40, 0x69, 0x84, 0x42, 0x02, 0xd1, + 0x28, 0x78, 0x6c, 0x28, 0x06, 0xd1, 0x29, 0x78, 0x20, 0x46, 0x2a, 0x46, + 0xc4, 0xf8, 0xe0, 0x52, 0xff, 0xf7, 0xba, 0xff, 0xd4, 0xf8, 0x6c, 0x53, + 0x05, 0xb3, 0x29, 0x78, 0x70, 0x29, 0x02, 0xd0, 0x94, 0xf8, 0xc8, 0x02, + 0xd0, 0xb9, 0x36, 0x48, 0x00, 0x22, 0x03, 0x68, 0x20, 0x46, 0x98, 0x47, + 0xa0, 0xb1, 0x9a, 0xf8, 0x2e, 0x00, 0x20, 0xb1, 0xda, 0xf8, 0x00, 0x00, + 0x40, 0x69, 0x84, 0x42, 0x0c, 0xd0, 0x30, 0x49, 0x04, 0xf5, 0x5b, 0x70, + 0x09, 0x68, 0x88, 0x47, 0x2e, 0x48, 0x29, 0x46, 0x02, 0x68, 0x20, 0x46, + 0x90, 0x47, 0x28, 0x46, 0xe0, 0xf7, 0x2a, 0xfe, 0xd4, 0xf8, 0x78, 0x53, + 0xb5, 0xb3, 0x94, 0xf8, 0x38, 0x03, 0x98, 0xbb, 0x9a, 0xf8, 0x2e, 0x00, + 0x20, 0xb1, 0xda, 0xf8, 0x00, 0x00, 0x40, 0x69, 0x84, 0x42, 0x2b, 0xd0, + 0x9b, 0xf8, 0x4a, 0x00, 0x70, 0xb3, 0x04, 0xf5, 0x5e, 0x70, 0x3a, 0x46, + 0x69, 0x69, 0xaf, 0x7a, 0xd5, 0xf8, 0x00, 0xe0, 0xeb, 0x7a, 0x95, 0xf8, + 0x08, 0xc0, 0x06, 0x90, 0x68, 0x7a, 0x05, 0x90, 0x1d, 0x48, 0x00, 0x68, + 0x04, 0x90, 0x58, 0x46, 0xd5, 0xf8, 0x04, 0xb0, 0xcd, 0xf8, 0x00, 0xb0, + 0xcd, 0xe9, 0x01, 0x17, 0xcd, 0xf8, 0x0c, 0xe0, 0x83, 0x46, 0x20, 0x46, + 0x19, 0x46, 0x17, 0x46, 0x62, 0x46, 0xdd, 0xe9, 0x04, 0x43, 0xa0, 0x47, + 0x10, 0x48, 0x01, 0x68, 0x06, 0x98, 0x88, 0x47, 0x28, 0x46, 0xe0, 0xf7, + 0xf1, 0xfd, 0xff, 0xe7, 0x38, 0x78, 0x01, 0x36, 0x86, 0x42, 0xff, 0xf4, + 0x74, 0xaf, 0x03, 0xe0, 0x0d, 0x48, 0x00, 0x68, 0x80, 0x47, 0xf5, 0xe7, + 0x0c, 0x48, 0x00, 0x68, 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, 0x00, 0x47, + 0x5c, 0x34, 0x01, 0x00, 0x10, 0x5a, 0x01, 0x00, 0x10, 0x61, 0x01, 0x00, + 0xe4, 0x5e, 0x01, 0x00, 0x24, 0xc5, 0x08, 0x00, 0x24, 0x9d, 0x08, 0x00, + 0xdc, 0xdc, 0x08, 0x00, 0x68, 0x8a, 0x01, 0x00, 0xd8, 0xdc, 0x08, 0x00, + 0x04, 0x9d, 0x08, 0x00, 0xe0, 0xdc, 0x08, 0x00, 0x19, 0x49, 0x09, 0x68, + 0x21, 0xb1, 0x49, 0x68, 0x81, 0x42, 0x04, 0xbf, 0x01, 0x20, 0x70, 0x47, + 0x16, 0x49, 0x49, 0x68, 0x29, 0xb1, 0x49, 0x68, 0x08, 0x1a, 0xb0, 0xfa, + 0x80, 0xf0, 0x40, 0x09, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0xbf, + 0x70, 0xb5, 0x06, 0x46, 0x93, 0xf8, 0x2d, 0x00, 0x0f, 0x28, 0x16, 0xd0, + 0xb6, 0xf9, 0x88, 0x00, 0xb0, 0xf1, 0xff, 0x3f, 0x11, 0xdc, 0x0a, 0x48, + 0x14, 0x46, 0x0d, 0x46, 0x00, 0x68, 0x10, 0xb9, 0x08, 0x48, 0x40, 0x68, + 0x18, 0xb1, 0x30, 0x46, 0xff, 0xf7, 0xd6, 0xff, 0x28, 0xb1, 0x06, 0x48, + 0x29, 0x46, 0x22, 0x46, 0x03, 0x68, 0x30, 0x46, 0x98, 0x47, 0x00, 0x20, + 0x70, 0xbd, 0x00, 0xbf, 0xa0, 0x52, 0x01, 0x00, 0xd8, 0x5d, 0x01, 0x00, + 0x18, 0xdf, 0x08, 0x00, 0x29, 0x29, 0x05, 0xd1, 0x10, 0xb5, 0x00, 0x24, + 0x80, 0xf8, 0x22, 0x41, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, 0x36, 0xb8, + 0xb0, 0xb5, 0x04, 0x46, 0x48, 0x79, 0x03, 0x28, 0x0c, 0xd3, 0x0d, 0x79, + 0x20, 0x46, 0x00, 0xf0, 0x33, 0xf8, 0x05, 0xf0, 0x01, 0x01, 0x20, 0x46, + 0x0f, 0x22, 0x20, 0x23, 0xbd, 0xe8, 0xb0, 0x40, 0xff, 0xf7, 0xe6, 0xbe, + 0x20, 0x46, 0xbd, 0xe8, 0xb0, 0x40, 0x00, 0xf0, 0x2b, 0xb8, 0x00, 0xbf, + 0x06, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x07, 0x49, 0x01, 0x60, + 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, + 0x70, 0x47, 0x00, 0xbf, 0xcc, 0xde, 0x08, 0x00, 0x91, 0x61, 0x04, 0x00, + 0x50, 0xdb, 0x08, 0x00, 0xed, 0x5f, 0x04, 0x00, 0xf8, 0xde, 0x08, 0x00, + 0xdd, 0x61, 0x04, 0x00, 0xb4, 0xdc, 0x08, 0x00, 0xf1, 0x61, 0x04, 0x00, + 0x4b, 0xf6, 0x71, 0x1c, 0xc1, 0xf2, 0x0c, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x49, 0xf2, 0x11, 0x1c, 0xc1, 0xf2, 0x0c, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4b, 0xf6, 0x0d, 0x4c, 0xc1, 0xf2, 0x0c, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0xbc, 0xb5, 0x04, 0x46, 0x00, 0x68, 0x80, 0xb1, 0x0d, 0x46, 0xe1, 0x7b, + 0x01, 0x39, 0x01, 0x29, 0x0c, 0xd8, 0x41, 0x69, 0xd1, 0xf8, 0xd4, 0x10, + 0x49, 0x7f, 0x19, 0xb9, 0x58, 0x49, 0x40, 0x78, 0x09, 0x68, 0x88, 0x47, + 0x28, 0x78, 0x01, 0x28, 0x06, 0xd1, 0xbc, 0xbd, 0x20, 0x46, 0x29, 0x46, + 0xbd, 0xe8, 0xbc, 0x40, 0x00, 0xf0, 0xbc, 0xb9, 0x21, 0x68, 0x4c, 0x48, + 0xab, 0x78, 0xb1, 0xf8, 0xb0, 0x20, 0x05, 0x68, 0x48, 0x69, 0x02, 0xf0, + 0x04, 0x02, 0x00, 0x92, 0x02, 0x22, 0xa8, 0x47, 0x4c, 0x49, 0x20, 0x68, + 0x09, 0x68, 0xbd, 0xe8, 0xbc, 0x40, 0x08, 0x47, 0xf8, 0xb5, 0x04, 0x46, + 0xb0, 0xf8, 0xb0, 0x00, 0x16, 0x46, 0x0d, 0x46, 0xc0, 0x07, 0x02, 0xd0, + 0x22, 0x2d, 0x18, 0xbf, 0x16, 0x25, 0x3a, 0x49, 0x94, 0xf8, 0xb9, 0x00, + 0x0a, 0x68, 0x04, 0xf1, 0xcc, 0x01, 0x90, 0x47, 0xa0, 0x69, 0x18, 0xb1, + 0x36, 0x49, 0x4a, 0x69, 0x00, 0x21, 0x90, 0x47, 0x35, 0x4f, 0x97, 0xf8, + 0x2e, 0x00, 0x60, 0xb3, 0x39, 0x68, 0xa1, 0x42, 0x29, 0xd1, 0xb4, 0xf8, + 0xb0, 0x10, 0x8a, 0x07, 0x08, 0xd5, 0x31, 0x48, 0x01, 0xf0, 0x04, 0x02, + 0x29, 0x46, 0x03, 0x68, 0x20, 0x46, 0x98, 0x47, 0x97, 0xf8, 0x2e, 0x00, + 0x19, 0x28, 0x01, 0xd0, 0x17, 0x28, 0x14, 0xd1, 0x39, 0x68, 0x60, 0x69, + 0x49, 0x69, 0x88, 0x42, 0x0f, 0xd1, 0x29, 0x49, 0xb4, 0xf8, 0xb0, 0x20, + 0x2b, 0x46, 0x0e, 0x68, 0x21, 0x78, 0x02, 0xf0, 0x04, 0x02, 0x00, 0x92, + 0x00, 0x29, 0x18, 0xbf, 0x01, 0x21, 0x4a, 0x00, 0x21, 0x46, 0xb0, 0x47, + 0x00, 0x26, 0x22, 0x48, 0x01, 0x68, 0x00, 0x20, 0x88, 0x47, 0x01, 0x2e, + 0x06, 0xd1, 0x20, 0x49, 0x94, 0xf8, 0xb9, 0x00, 0x2a, 0x46, 0x0b, 0x68, + 0x00, 0x21, 0x98, 0x47, 0x20, 0x78, 0x00, 0xf0, 0xfe, 0x00, 0x02, 0x28, + 0x18, 0xd1, 0x61, 0x69, 0x60, 0x78, 0x00, 0x22, 0xd1, 0xf8, 0xd4, 0x10, + 0x01, 0xeb, 0x80, 0x01, 0xc1, 0xf8, 0x94, 0x20, 0x61, 0x69, 0xd1, 0xf8, + 0xd4, 0x10, 0x4a, 0x7f, 0x8a, 0xb1, 0x80, 0x00, 0x01, 0x22, 0x02, 0xfa, + 0x00, 0xf0, 0xd1, 0xf8, 0x90, 0x20, 0x22, 0xea, 0x00, 0x00, 0xc1, 0xf8, + 0x90, 0x00, 0x09, 0xe0, 0x0e, 0x48, 0x04, 0xf1, 0x94, 0x01, 0x02, 0x68, + 0x0d, 0x48, 0x90, 0x47, 0x02, 0xe0, 0x0d, 0x49, 0x09, 0x68, 0x88, 0x47, + 0x0c, 0x48, 0x01, 0x68, 0x20, 0x46, 0xbd, 0xe8, 0xf8, 0x40, 0x08, 0x47, + 0x80, 0xc3, 0x08, 0x00, 0x18, 0xb1, 0x08, 0x00, 0x10, 0x5a, 0x01, 0x00, + 0x44, 0xda, 0x08, 0x00, 0x48, 0xda, 0x08, 0x00, 0x4c, 0xda, 0x08, 0x00, + 0x34, 0xc5, 0x08, 0x00, 0x50, 0xda, 0x08, 0x00, 0x08, 0x5a, 0x01, 0x00, + 0x9c, 0xda, 0x08, 0x00, 0x40, 0xda, 0x08, 0x00, 0xb0, 0xb5, 0x05, 0x46, + 0x27, 0x48, 0x0c, 0x46, 0x4f, 0xf0, 0xff, 0x31, 0x81, 0x60, 0x26, 0x48, + 0x01, 0x68, 0x28, 0x46, 0x88, 0x47, 0x28, 0x46, 0x21, 0x46, 0xbd, 0xe8, + 0xb0, 0x40, 0x00, 0xf0, 0x09, 0xb9, 0x00, 0xbf, 0xb0, 0xb5, 0x05, 0x46, + 0x2d, 0x48, 0x0c, 0x46, 0x01, 0x68, 0x28, 0x46, 0x88, 0x47, 0x30, 0xb1, + 0x1b, 0x49, 0x4f, 0xf0, 0xff, 0x32, 0x8a, 0x60, 0x1a, 0x49, 0x09, 0x68, + 0x88, 0x47, 0x28, 0x46, 0x21, 0x46, 0xbd, 0xe8, 0xb0, 0x40, 0x00, 0xf0, + 0xf9, 0xb8, 0x00, 0xbf, 0x10, 0xb5, 0x04, 0x46, 0x22, 0x48, 0x01, 0x68, + 0x20, 0x46, 0x88, 0x47, 0x30, 0xb1, 0x11, 0x49, 0x4f, 0xf0, 0xff, 0x32, + 0x8a, 0x60, 0x10, 0x49, 0x09, 0x68, 0x88, 0x47, 0x20, 0x46, 0xbd, 0xe8, + 0x10, 0x40, 0x00, 0xf0, 0xeb, 0xb8, 0x00, 0xbf, 0xb0, 0xb5, 0x05, 0x46, + 0x18, 0x48, 0x0c, 0x46, 0x01, 0x68, 0x28, 0x46, 0x88, 0x47, 0x30, 0xb1, + 0x06, 0x49, 0x4f, 0xf0, 0xff, 0x32, 0x8a, 0x60, 0x05, 0x49, 0x09, 0x68, + 0x88, 0x47, 0x28, 0x46, 0x21, 0x46, 0xbd, 0xe8, 0xb0, 0x40, 0x00, 0xf0, + 0xdb, 0xb8, 0x00, 0xbf, 0x34, 0x5e, 0x01, 0x00, 0x4c, 0xc3, 0x08, 0x00, + 0x80, 0xb5, 0x0c, 0x49, 0x09, 0x68, 0x88, 0x47, 0x90, 0xb1, 0x90, 0xf8, + 0xb9, 0x00, 0x16, 0x28, 0x0e, 0xd8, 0x09, 0x49, 0x00, 0xeb, 0x40, 0x02, + 0x51, 0xf8, 0x22, 0x20, 0x42, 0xb1, 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, + 0x80, 0x00, 0x00, 0x79, 0x02, 0x28, 0x04, 0xbf, 0x01, 0x20, 0x80, 0xbd, + 0x00, 0x20, 0x80, 0xbd, 0xec, 0xbf, 0x08, 0x00, 0xe8, 0x72, 0x01, 0x00, + 0x10, 0xb5, 0x04, 0x46, 0x0b, 0x48, 0x86, 0x45, 0x04, 0xd0, 0x20, 0x46, + 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, 0xb4, 0xb8, 0x00, 0x2c, 0xf8, 0xd0, + 0x20, 0x46, 0xff, 0xf7, 0xd3, 0xff, 0x08, 0xb1, 0x00, 0x20, 0x10, 0xbd, + 0x04, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x00, 0x28, 0xec, 0xd1, + 0xf6, 0xe7, 0x00, 0xbf, 0x57, 0x6e, 0x0a, 0x10, 0xa4, 0x9b, 0x08, 0x00, + 0xb0, 0xb5, 0xa1, 0xf1, 0xbc, 0x04, 0x02, 0x2c, 0x01, 0xd3, 0x21, 0x29, + 0x06, 0xd1, 0x1c, 0x68, 0xb4, 0xf8, 0xb0, 0x50, 0x25, 0xf0, 0x04, 0x05, + 0xa4, 0xf8, 0xb0, 0x50, 0xbd, 0xe8, 0xb0, 0x40, 0x00, 0xf0, 0x94, 0xb8, + 0xfe, 0xb5, 0x0c, 0x46, 0x41, 0x88, 0x06, 0x23, 0x11, 0xf4, 0x4c, 0x75, + 0x08, 0xbf, 0x02, 0x23, 0x46, 0x78, 0x94, 0xf8, 0x35, 0x10, 0x36, 0xb1, + 0x0c, 0x26, 0x00, 0x2d, 0x08, 0xbf, 0x04, 0x26, 0x02, 0x29, 0x38, 0xbf, + 0x33, 0x46, 0x26, 0x68, 0x01, 0x29, 0x75, 0x69, 0x05, 0xd8, 0xd5, 0xf8, + 0xd4, 0x10, 0x49, 0x7f, 0x00, 0x29, 0x18, 0xbf, 0x02, 0x33, 0x01, 0x78, + 0x07, 0x48, 0x07, 0x68, 0x02, 0x20, 0xcd, 0xe9, 0x00, 0x06, 0x28, 0x46, + 0xb8, 0x47, 0x94, 0xf8, 0x35, 0x10, 0x01, 0x29, 0x02, 0xd8, 0x01, 0x28, + 0x08, 0xbf, 0x02, 0x20, 0xfe, 0xbd, 0x00, 0xbf, 0xec, 0xdd, 0x08, 0x00, + 0x0d, 0x48, 0x0e, 0x49, 0x01, 0x60, 0x0e, 0x48, 0x0e, 0x49, 0x01, 0x60, + 0x0e, 0x48, 0x0f, 0x49, 0x01, 0x60, 0x0f, 0x48, 0x0f, 0x49, 0x01, 0x60, + 0x0f, 0x48, 0x10, 0x49, 0x01, 0x60, 0x10, 0x48, 0x10, 0x49, 0x01, 0x60, + 0x10, 0x48, 0x11, 0x49, 0x01, 0x60, 0x11, 0x48, 0x11, 0x49, 0x01, 0x60, + 0x11, 0x48, 0x12, 0x49, 0x01, 0x60, 0x70, 0x47, 0x3c, 0xd4, 0x08, 0x00, + 0xdd, 0x62, 0x04, 0x00, 0x14, 0xde, 0x08, 0x00, 0x81, 0x62, 0x04, 0x00, + 0x10, 0xde, 0x08, 0x00, 0x09, 0x64, 0x04, 0x00, 0x90, 0xc2, 0x08, 0x00, + 0x2d, 0x64, 0x04, 0x00, 0x94, 0xc2, 0x08, 0x00, 0x59, 0x64, 0x04, 0x00, + 0x98, 0xc2, 0x08, 0x00, 0x81, 0x64, 0x04, 0x00, 0xcc, 0xba, 0x08, 0x00, + 0xf1, 0x64, 0x04, 0x00, 0x60, 0xde, 0x08, 0x00, 0x2d, 0x65, 0x04, 0x00, + 0xec, 0xd9, 0x08, 0x00, 0x51, 0x65, 0x04, 0x00, 0x47, 0xf6, 0x01, 0x3c, + 0xc1, 0xf2, 0x0c, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x45, 0xf2, 0x45, 0x5c, + 0xc1, 0xf2, 0x0c, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x45, 0xf2, 0xe9, 0x5c, + 0xc1, 0xf2, 0x0c, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x45, 0xf6, 0x25, 0x1c, + 0xc1, 0xf2, 0x0c, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x48, 0xf6, 0x19, 0x2c, + 0xc1, 0xf2, 0x0c, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x45, 0xf6, 0x75, 0x0c, + 0xc1, 0xf2, 0x0c, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x47, 0xf6, 0x05, 0x5c, + 0xc1, 0xf2, 0x0c, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x2d, 0xe9, 0xf0, 0x43, + 0x8b, 0xb0, 0x81, 0x46, 0x51, 0x48, 0x0e, 0x46, 0x01, 0x68, 0xbc, 0x20, + 0x88, 0x47, 0x04, 0x46, 0x78, 0xb1, 0x4f, 0x49, 0x30, 0x7c, 0x00, 0x23, + 0xd1, 0xf8, 0xb0, 0x11, 0x81, 0x42, 0x4d, 0x48, 0x38, 0xbf, 0x01, 0x23, + 0x99, 0xf8, 0x35, 0x21, 0xd9, 0xf8, 0xd4, 0x10, 0x05, 0x68, 0x20, 0x46, + 0xa8, 0x47, 0xb7, 0x88, 0x01, 0x2f, 0x03, 0xd1, 0xf0, 0x88, 0x00, 0x28, + 0x18, 0xbf, 0x01, 0x37, 0x88, 0x48, 0x99, 0xf8, 0x88, 0x24, 0x04, 0xab, + 0x05, 0x68, 0x30, 0x88, 0x12, 0x07, 0x4f, 0xf0, 0x00, 0x02, 0x4f, 0xea, + 0x50, 0x01, 0x70, 0x88, 0xcd, 0xe9, 0x00, 0x43, 0xfb, 0xb2, 0xcd, 0xe9, + 0x02, 0x22, 0x54, 0xbf, 0x00, 0x22, 0x03, 0x22, 0x40, 0x08, 0xa8, 0x47, + 0xbd, 0xf8, 0x1e, 0x10, 0xf8, 0xb2, 0x81, 0x42, 0x38, 0xbf, 0x0f, 0x46, + 0x1c, 0xb3, 0x20, 0x78, 0x08, 0xb3, 0x36, 0x48, 0x5f, 0xfa, 0x87, 0xf8, + 0x04, 0xa9, 0x42, 0x46, 0x03, 0x68, 0x20, 0x46, 0x98, 0x47, 0xc0, 0xb9, + 0xf1, 0x88, 0xbd, 0xf8, 0x1e, 0x00, 0x59, 0xb1, 0x04, 0x21, 0x51, 0xfa, + 0x87, 0xf1, 0x81, 0x42, 0x0f, 0xd2, 0x01, 0x38, 0xad, 0xf8, 0x1e, 0x00, + 0xbd, 0xf8, 0x1a, 0x00, 0x01, 0x30, 0x06, 0xe0, 0xbd, 0xf8, 0x1a, 0x10, + 0xa0, 0xeb, 0x08, 0x00, 0xad, 0xf8, 0x1e, 0x80, 0x08, 0x44, 0xad, 0xf8, + 0x1a, 0x00, 0x26, 0x48, 0x04, 0xab, 0x31, 0x46, 0x22, 0x46, 0x05, 0x68, + 0xf8, 0xb2, 0x00, 0x90, 0x48, 0x46, 0xa8, 0x47, 0x70, 0x89, 0xbd, 0xf8, + 0x1a, 0x20, 0xb0, 0xeb, 0x42, 0x0f, 0x05, 0xd1, 0x31, 0x89, 0xbd, 0xf8, + 0x1c, 0x30, 0xb1, 0xeb, 0x43, 0x0f, 0x0c, 0xd0, 0x31, 0x7c, 0x05, 0x29, + 0x06, 0xd2, 0xbd, 0xf8, 0x1c, 0x10, 0x50, 0x00, 0x70, 0x81, 0x49, 0x00, + 0x31, 0x81, 0x00, 0xe0, 0x31, 0x89, 0x00, 0x22, 0x72, 0x74, 0x4d, 0x4d, + 0x4b, 0x4e, 0x80, 0xb2, 0x89, 0xb2, 0x08, 0x23, 0x2f, 0x68, 0xc6, 0xe9, + 0x00, 0x10, 0x48, 0xf2, 0x08, 0x00, 0x00, 0x21, 0x32, 0x46, 0xb8, 0x47, + 0xd9, 0xf8, 0xd4, 0x00, 0x2d, 0x68, 0x32, 0x46, 0x08, 0x23, 0x41, 0x69, + 0x00, 0x8b, 0x00, 0x09, 0xc6, 0xe9, 0x00, 0x10, 0x48, 0xf2, 0x09, 0x00, + 0x00, 0x21, 0xa8, 0x47, 0x14, 0xb1, 0x20, 0x46, 0xe0, 0xf7, 0x98, 0xfa, + 0x0b, 0xb0, 0xbd, 0xe8, 0xf0, 0x83, 0x00, 0xbf, 0xd4, 0x9b, 0x08, 0x00, + 0xe8, 0x65, 0x08, 0x00, 0xc4, 0x9b, 0x08, 0x00, 0x48, 0xce, 0x08, 0x00, + 0xe4, 0xdb, 0x08, 0x00, 0x04, 0x4b, 0x1b, 0x78, 0xff, 0x2b, 0x18, 0xbf, + 0x93, 0x42, 0x01, 0xd1, 0x00, 0xf0, 0x7e, 0xb8, 0x70, 0x47, 0x00, 0xbf, + 0x7f, 0xd3, 0x05, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, 0x89, 0xb0, 0xdd, 0xf8, + 0x48, 0x90, 0x05, 0xac, 0x0f, 0xc4, 0xb9, 0xf1, 0x00, 0x0f, 0x46, 0xd0, + 0x99, 0xf8, 0x00, 0x00, 0x03, 0x28, 0x42, 0xd3, 0x28, 0x4c, 0xdf, 0xf8, + 0xa4, 0x80, 0x00, 0x27, 0x40, 0xf2, 0x8f, 0x1b, 0x09, 0xeb, 0xc7, 0x00, + 0x85, 0x1d, 0x17, 0x2f, 0x03, 0xd3, 0x00, 0x20, 0xd5, 0x21, 0xda, 0xf7, + 0xe1, 0xfb, 0x28, 0x88, 0x58, 0x45, 0x2b, 0xd1, 0x99, 0xf8, 0x00, 0x60, + 0xb7, 0x42, 0x15, 0xd2, 0xba, 0x46, 0xba, 0xf1, 0x16, 0x0f, 0x05, 0xd3, + 0x00, 0x20, 0xdd, 0x21, 0xda, 0xf7, 0xd2, 0xfb, 0x99, 0xf8, 0x00, 0x60, + 0x09, 0xeb, 0xca, 0x01, 0x08, 0x22, 0x08, 0x1d, 0x0c, 0x31, 0xee, 0xf7, + 0xc3, 0xfb, 0x0a, 0xf1, 0x01, 0x0a, 0xf0, 0xb2, 0x82, 0x45, 0xea, 0xd3, + 0xd8, 0xf8, 0x00, 0x60, 0x4f, 0xf4, 0x00, 0x40, 0x00, 0x21, 0x22, 0x46, + 0x04, 0x23, 0x27, 0x60, 0xb0, 0x47, 0x99, 0xf8, 0x00, 0x00, 0x01, 0x38, + 0x89, 0xf8, 0x00, 0x00, 0xc0, 0xb2, 0x87, 0x42, 0xcb, 0xd3, 0x04, 0xe0, + 0x99, 0xf8, 0x00, 0x00, 0x01, 0x37, 0x87, 0x42, 0xc2, 0xd3, 0x13, 0x98, + 0x05, 0xab, 0xcd, 0xf8, 0x00, 0x90, 0x01, 0x90, 0x14, 0x98, 0x02, 0x90, + 0x15, 0x98, 0x03, 0x90, 0x0f, 0xcb, 0x00, 0xf0, 0x23, 0xf8, 0x09, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0x8c, 0x34, 0x01, 0x00, 0x78, 0x9b, 0x08, 0x00, + 0x04, 0x48, 0x05, 0x49, 0x01, 0x60, 0x05, 0x48, 0x05, 0x49, 0x01, 0x60, + 0x05, 0x48, 0x06, 0x49, 0x01, 0x60, 0x70, 0x47, 0xbc, 0xc8, 0x08, 0x00, + 0xe9, 0x67, 0x04, 0x00, 0xa0, 0xdc, 0x08, 0x00, 0x85, 0x66, 0x04, 0x00, + 0xc8, 0x9b, 0x08, 0x00, 0x01, 0x68, 0x04, 0x00, 0x49, 0xf6, 0xb5, 0x2c, + 0xc1, 0xf2, 0x0b, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x43, 0xf2, 0x01, 0x2c, + 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x90, 0xf8, 0xeb, 0x04, + 0x81, 0x07, 0x48, 0xbf, 0x5f, 0xea, 0x00, 0x71, 0x01, 0xd4, 0x00, 0x20, + 0x70, 0x47, 0xc0, 0x06, 0x5c, 0xbf, 0x01, 0x20, 0x70, 0x47, 0xf8, 0xe7, + 0xb0, 0xb5, 0x04, 0x46, 0x5a, 0x48, 0x0d, 0x46, 0x90, 0xf8, 0xfe, 0x01, + 0x80, 0x07, 0x03, 0xd5, 0x20, 0x46, 0xff, 0xf7, 0xe7, 0xff, 0x28, 0xb1, + 0x20, 0x46, 0x29, 0x46, 0xbd, 0xe8, 0xb0, 0x40, 0x00, 0xf0, 0x38, 0xb9, + 0x03, 0x48, 0x0a, 0x21, 0x24, 0x22, 0x03, 0x68, 0x20, 0x46, 0xbd, 0xe8, + 0xb0, 0x40, 0x18, 0x47, 0x80, 0xcb, 0x08, 0x00, 0xb0, 0xb5, 0x04, 0x46, + 0xd0, 0xf8, 0xb4, 0x05, 0x50, 0xb3, 0x0d, 0x46, 0x90, 0xf8, 0x2c, 0x10, + 0x04, 0x29, 0x25, 0xd1, 0x90, 0xf8, 0x2e, 0x10, 0x11, 0xb3, 0x47, 0x49, + 0x91, 0xf8, 0xff, 0x21, 0xd2, 0x06, 0x1d, 0xd5, 0x91, 0xf8, 0x02, 0x22, + 0xd3, 0x07, 0x19, 0xd0, 0x12, 0x07, 0x17, 0xd5, 0x94, 0xf8, 0xb0, 0x25, + 0xaa, 0x42, 0x13, 0xd0, 0x90, 0xf8, 0x64, 0x30, 0x93, 0x42, 0x0f, 0xd1, + 0x94, 0xf8, 0x8b, 0x20, 0x52, 0x06, 0x0b, 0xd4, 0x90, 0xf8, 0x2f, 0x20, + 0xd2, 0x06, 0x05, 0xd5, 0x90, 0xf8, 0x32, 0x00, 0xc2, 0x07, 0x01, 0xd0, + 0x00, 0x07, 0x03, 0xd4, 0x1a, 0x20, 0xb0, 0xbd, 0x0c, 0x20, 0xb0, 0xbd, + 0x91, 0xf8, 0xfe, 0x01, 0x80, 0x07, 0x04, 0xd5, 0x20, 0x46, 0xff, 0xf7, + 0x9d, 0xff, 0x00, 0x28, 0xf2, 0xd0, 0x0c, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x88, 0xb1, 0x01, 0x46, 0xd4, 0xf8, 0xb4, 0x05, 0x01, 0x23, 0x90, 0xf8, + 0x6c, 0x20, 0x80, 0xf8, 0x64, 0x50, 0x42, 0xf0, 0x01, 0x02, 0x80, 0xf8, + 0x6c, 0x20, 0x20, 0x46, 0xa4, 0x22, 0x00, 0xf0, 0xe5, 0xf8, 0x00, 0x20, + 0xb0, 0xbd, 0x07, 0x20, 0xb0, 0xbd, 0x00, 0xbf, 0xe0, 0xc4, 0x08, 0x00, + 0xd0, 0xf8, 0xb4, 0x25, 0x0a, 0xb1, 0x00, 0xf0, 0xdf, 0xb8, 0x70, 0x47, + 0xf8, 0xb5, 0x0e, 0x46, 0x04, 0x46, 0x60, 0xb1, 0x94, 0xf8, 0x2c, 0x00, + 0x94, 0xf8, 0x2d, 0x70, 0x25, 0x68, 0x60, 0xb1, 0x03, 0x28, 0x0a, 0xd8, + 0x28, 0x46, 0x00, 0x21, 0x00, 0xf0, 0xd4, 0xf8, 0x05, 0xe0, 0x00, 0x20, + 0xab, 0x21, 0xda, 0xf7, 0xdd, 0xfa, 0x2d, 0x20, 0x07, 0x78, 0x20, 0x46, + 0x70, 0x21, 0xdd, 0xf7, 0x31, 0xf9, 0x12, 0x48, 0x84, 0xf8, 0x2d, 0x70, + 0x90, 0xf8, 0x7d, 0x02, 0x87, 0x42, 0x0a, 0xd2, 0x22, 0x2e, 0x08, 0xd1, + 0x78, 0x1c, 0x25, 0x60, 0x84, 0xf8, 0x2d, 0x00, 0xd5, 0xf8, 0xd4, 0x00, + 0x40, 0x7f, 0x60, 0xb1, 0xf8, 0xbd, 0xd5, 0xf8, 0xb4, 0x05, 0xe0, 0xf7, + 0x41, 0xf9, 0x00, 0x20, 0xc5, 0xf8, 0xb4, 0x05, 0x06, 0x48, 0x00, 0x68, + 0xbd, 0xe8, 0xf8, 0x40, 0x00, 0x47, 0x05, 0x48, 0x01, 0x68, 0x28, 0x46, + 0xbd, 0xe8, 0xf8, 0x40, 0x08, 0x47, 0x00, 0xbf, 0xe8, 0x65, 0x08, 0x00, + 0x04, 0x9d, 0x08, 0x00, 0x80, 0xdd, 0x08, 0x00, 0x10, 0xb5, 0x04, 0x46, + 0x0b, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x60, 0xb1, 0xd4, 0xf8, + 0xe0, 0x02, 0x70, 0xb1, 0x08, 0x48, 0x01, 0x68, 0x04, 0xf5, 0x58, 0x70, + 0x88, 0x47, 0x40, 0xb1, 0xbd, 0xe8, 0x10, 0x40, 0xe0, 0xf7, 0x18, 0xb9, + 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0xff, 0xf7, 0xc9, 0xbb, 0x10, 0xbd, + 0xb8, 0xc9, 0x08, 0x00, 0x24, 0x9d, 0x08, 0x00, 0xbc, 0xb5, 0x06, 0x9d, + 0x1c, 0x46, 0x0c, 0x2a, 0x08, 0xd1, 0xff, 0xf7, 0xdb, 0xff, 0x4c, 0xb1, + 0x45, 0xb1, 0x20, 0x46, 0xbd, 0xe8, 0xbc, 0x40, 0xe0, 0xf7, 0x00, 0xb9, + 0x23, 0x46, 0x00, 0x95, 0x00, 0xf0, 0x74, 0xf8, 0xbc, 0xbd, 0x00, 0xbf, + 0x1c, 0xb5, 0x04, 0x46, 0x0a, 0x29, 0x19, 0xd1, 0x94, 0xf8, 0x35, 0x11, + 0x61, 0x20, 0xe0, 0xf7, 0xd9, 0xf8, 0x20, 0x46, 0xff, 0xf7, 0xc2, 0xff, + 0xd4, 0xf8, 0xd4, 0x00, 0x40, 0x7f, 0x90, 0xb1, 0x0c, 0x48, 0x94, 0xf8, + 0x35, 0x11, 0x47, 0xf2, 0xf8, 0x52, 0x47, 0xf2, 0xf8, 0x53, 0x04, 0x68, + 0x00, 0x20, 0xcd, 0xe9, 0x00, 0x00, 0x61, 0x20, 0xa0, 0x47, 0x1c, 0xbd, + 0x20, 0x46, 0xbd, 0xe8, 0x1c, 0x40, 0x00, 0xf0, 0x55, 0xb8, 0x04, 0x48, + 0x01, 0x68, 0x20, 0x46, 0xbd, 0xe8, 0x1c, 0x40, 0x08, 0x47, 0x00, 0xbf, + 0xcc, 0x9b, 0x08, 0x00, 0x60, 0xcb, 0x08, 0x00, 0x09, 0x48, 0x0a, 0x49, + 0x01, 0x60, 0x0a, 0x48, 0x0a, 0x49, 0x01, 0x60, 0x0a, 0x48, 0x0b, 0x49, + 0x01, 0x60, 0x0b, 0x48, 0x0b, 0x49, 0x01, 0x60, 0x0b, 0x48, 0x0c, 0x49, + 0x01, 0x60, 0x0c, 0x48, 0x0c, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0x78, 0xcb, 0x08, 0x00, 0x61, 0x69, 0x04, 0x00, 0x9c, 0xcb, 0x08, 0x00, + 0x29, 0x69, 0x04, 0x00, 0x54, 0xdd, 0x08, 0x00, 0x0d, 0x6a, 0x04, 0x00, + 0x6c, 0xcb, 0x08, 0x00, 0x19, 0x6a, 0x04, 0x00, 0x50, 0xdd, 0x08, 0x00, + 0xe1, 0x6a, 0x04, 0x00, 0x90, 0xcb, 0x08, 0x00, 0x09, 0x6b, 0x04, 0x00, + 0x42, 0xf6, 0x11, 0x2c, 0xc1, 0xf2, 0x0c, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x44, 0xf2, 0xcd, 0x7c, 0xc1, 0xf2, 0x0b, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x42, 0xf6, 0xb9, 0x7c, 0xc1, 0xf2, 0x0c, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x48, 0xf2, 0xf7, 0x4c, 0xc1, 0xf2, 0x0e, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x42, 0xf2, 0xcd, 0x2c, 0xc1, 0xf2, 0x0c, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x42, 0xf6, 0xd5, 0x5c, 0xc1, 0xf2, 0x0c, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x10, 0xb5, 0x04, 0x46, 0x00, 0x78, 0x82, 0x28, 0x1f, 0xd1, 0x60, 0x68, + 0x10, 0xb3, 0x09, 0xf0, 0x77, 0xfe, 0x20, 0x48, 0x64, 0x68, 0x02, 0x68, + 0x94, 0xf8, 0x35, 0x11, 0x1e, 0x48, 0x90, 0x47, 0x1e, 0x48, 0x00, 0x21, + 0x80, 0xf8, 0x30, 0x10, 0x1d, 0x48, 0x21, 0x46, 0x02, 0x68, 0x04, 0xf5, + 0x80, 0x70, 0x90, 0x47, 0xc0, 0xb1, 0x01, 0x46, 0x90, 0xf8, 0x24, 0x01, + 0x07, 0x28, 0x0b, 0xd1, 0x19, 0x48, 0x02, 0x68, 0x13, 0x20, 0x90, 0x47, + 0x0e, 0xe0, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, 0x3c, 0xb8, + 0x18, 0x48, 0x18, 0xe0, 0x08, 0x20, 0x00, 0x22, 0x81, 0xf8, 0x39, 0x00, + 0x10, 0x48, 0x03, 0x68, 0x3f, 0x20, 0x98, 0x47, 0x10, 0x48, 0x00, 0x22, + 0x01, 0x78, 0x40, 0x78, 0x84, 0xf8, 0x7a, 0x04, 0x0b, 0x48, 0x84, 0xf8, + 0x79, 0x14, 0x21, 0x46, 0x03, 0x68, 0x01, 0x20, 0x98, 0x47, 0x0b, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x0a, 0x48, 0x00, 0x68, 0xbd, 0xe8, 0x10, 0x40, + 0x00, 0x47, 0x00, 0xbf, 0xa4, 0xda, 0x08, 0x00, 0xc0, 0x52, 0x01, 0x00, + 0x38, 0x5d, 0x01, 0x00, 0xf0, 0xba, 0x08, 0x00, 0xb8, 0x9b, 0x08, 0x00, + 0x64, 0xd8, 0x08, 0x00, 0xbc, 0x58, 0x01, 0x00, 0xec, 0xba, 0x08, 0x00, + 0xfc, 0xba, 0x08, 0x00, 0x60, 0xc2, 0x08, 0x00, 0x01, 0x48, 0x02, 0x49, + 0x01, 0x60, 0x70, 0x47, 0xdc, 0xdb, 0x08, 0x00, 0x05, 0x6c, 0x04, 0x00, + 0x48, 0xf6, 0xa5, 0x3c, 0xc1, 0xf2, 0x0b, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x80, 0xb5, 0xd0, 0xf8, 0xfc, 0x22, 0x13, 0xb2, 0x00, 0x2b, 0x05, 0xd4, + 0x12, 0x07, 0x03, 0xd4, 0xbd, 0xe8, 0x80, 0x40, 0x00, 0xf0, 0x14, 0xb8, + 0x03, 0x48, 0x00, 0x68, 0x80, 0x47, 0x03, 0x48, 0x00, 0x68, 0xbd, 0xe8, + 0x80, 0x40, 0x00, 0x47, 0x84, 0xda, 0x08, 0x00, 0x88, 0xda, 0x08, 0x00, + 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, 0x90, 0xdb, 0x08, 0x00, + 0xdd, 0x6c, 0x04, 0x00, 0x48, 0xf6, 0x51, 0x2c, 0xc1, 0xf2, 0x0b, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0xd8, 0xb3, 0xb0, 0xb5, 0x86, 0xb0, 0x8d, 0xf8, + 0x10, 0x10, 0xad, 0xf8, 0x0e, 0x30, 0x90, 0xf8, 0x3a, 0x10, 0x90, 0xf8, + 0x35, 0x31, 0x0a, 0x9c, 0x8d, 0xf8, 0x06, 0x20, 0x90, 0xf8, 0x74, 0x20, + 0x8d, 0xf8, 0x04, 0x30, 0x15, 0x4b, 0x8d, 0xf8, 0x07, 0x10, 0xb0, 0xf8, + 0xde, 0x13, 0xad, 0xf8, 0x12, 0x40, 0x8d, 0xf8, 0x11, 0x20, 0x01, 0xac, + 0x1f, 0x4a, 0x1b, 0x78, 0xad, 0xf8, 0x08, 0x10, 0xb0, 0xf8, 0xe0, 0x13, + 0xb0, 0xf8, 0xe2, 0x03, 0x8d, 0xf8, 0x05, 0x30, 0xad, 0xf8, 0x0a, 0x10, + 0xad, 0xf8, 0x0c, 0x00, 0x04, 0xf1, 0x10, 0x00, 0x03, 0x21, 0x03, 0x23, + 0xda, 0xf7, 0x4c, 0xf9, 0x07, 0x48, 0x01, 0x21, 0x00, 0x22, 0x23, 0x46, + 0x05, 0x68, 0x14, 0x20, 0x00, 0x90, 0x40, 0xf2, 0x37, 0x20, 0xa8, 0x47, + 0x06, 0xb0, 0xbd, 0xe8, 0xb0, 0x40, 0x70, 0x47, 0x97, 0xca, 0x01, 0x00, + 0xa0, 0xa0, 0x08, 0x00, 0xc1, 0x78, 0xc2, 0x79, 0x0b, 0x4b, 0xc0, 0x7a, + 0x19, 0x70, 0x5a, 0x70, 0x98, 0x70, 0x70, 0x47, 0x08, 0x49, 0x00, 0x20, + 0x91, 0xf9, 0x00, 0x20, 0x4a, 0xb1, 0x12, 0xf1, 0x47, 0x0f, 0x06, 0xdd, + 0x01, 0x30, 0x01, 0x31, 0x03, 0x28, 0x04, 0xbf, 0x01, 0x20, 0x70, 0x47, + 0xf2, 0xe7, 0x00, 0x20, 0x70, 0x47, 0x00, 0xbf, 0x28, 0xf0, 0x05, 0x00, + 0x2d, 0xe9, 0xf0, 0x4f, 0x87, 0xb0, 0xca, 0x48, 0x90, 0xf8, 0xd4, 0x12, + 0x00, 0x29, 0x00, 0xf0, 0x8c, 0x81, 0xc8, 0x49, 0x09, 0x78, 0x01, 0x29, + 0x00, 0xf0, 0x87, 0x81, 0xc6, 0x49, 0x09, 0x78, 0x01, 0x29, 0x00, 0xf0, + 0x82, 0x81, 0xc6, 0x4a, 0xc4, 0x4d, 0x92, 0xf8, 0x4d, 0xc0, 0x29, 0x78, + 0xbc, 0xf1, 0x00, 0x0f, 0x17, 0xd0, 0xc1, 0xb1, 0xc2, 0x4d, 0x00, 0x24, + 0x00, 0x22, 0x55, 0xf8, 0x24, 0x60, 0x66, 0xb1, 0x96, 0xf8, 0x88, 0x74, + 0xbf, 0x07, 0x08, 0xd5, 0x96, 0xf8, 0xa4, 0x74, 0x7b, 0x07, 0x01, 0xd5, + 0x3b, 0x07, 0x02, 0xd5, 0xd6, 0xf8, 0x0c, 0x35, 0x1a, 0x44, 0x01, 0x34, + 0x8c, 0x42, 0xec, 0xd3, 0x02, 0xe0, 0x00, 0x22, 0x0e, 0xe0, 0x00, 0x22, + 0xb6, 0x4b, 0x93, 0xf8, 0x7a, 0x30, 0x0b, 0xb1, 0xc2, 0x23, 0x01, 0xe0, + 0x40, 0xf2, 0x59, 0x13, 0xaf, 0x4d, 0x1c, 0xfb, 0x03, 0xf3, 0x9a, 0x42, + 0x38, 0xbf, 0x1a, 0x46, 0x00, 0x29, 0x00, 0xf0, 0x4e, 0x81, 0x00, 0xf5, + 0x35, 0x70, 0x40, 0xf2, 0x59, 0x11, 0xdf, 0xf8, 0xac, 0xb2, 0xac, 0x4f, + 0x4f, 0xf0, 0x00, 0x0a, 0x4f, 0xf0, 0x64, 0x08, 0x06, 0x90, 0x64, 0x20, + 0x50, 0x43, 0xb0, 0xfb, 0xf1, 0xf0, 0x4f, 0xf4, 0x48, 0x61, 0x03, 0x90, + 0x80, 0xb2, 0x48, 0x43, 0x02, 0x90, 0x00, 0x20, 0x05, 0x90, 0xdb, 0xf8, + 0x00, 0x40, 0xec, 0xb1, 0x94, 0xf8, 0x8d, 0x00, 0x40, 0x07, 0x19, 0xd5, + 0x94, 0xf8, 0x35, 0x11, 0x01, 0xeb, 0x41, 0x00, 0x07, 0xeb, 0x40, 0x10, + 0x40, 0x6d, 0x01, 0x30, 0x18, 0xd0, 0xda, 0xf7, 0xa7, 0xf8, 0x94, 0xf8, + 0x35, 0x11, 0x01, 0xeb, 0x41, 0x02, 0x07, 0xeb, 0x42, 0x12, 0x52, 0x6d, + 0x80, 0x1a, 0x97, 0x4a, 0x10, 0x44, 0x20, 0xf0, 0x70, 0x40, 0xb0, 0xf1, + 0x00, 0x6f, 0x07, 0xd9, 0x28, 0x78, 0x0a, 0xf1, 0x01, 0x0a, 0x0b, 0xf1, + 0x04, 0x0b, 0x82, 0x45, 0xd7, 0xd3, 0x0c, 0xe1, 0x01, 0xeb, 0x41, 0x00, + 0x4f, 0xf0, 0xff, 0x31, 0x94, 0xf8, 0x74, 0x90, 0x07, 0xeb, 0x40, 0x10, + 0x41, 0x65, 0x94, 0xf8, 0x24, 0x01, 0x03, 0x28, 0x07, 0xd0, 0x94, 0xf8, + 0x24, 0x01, 0x84, 0x28, 0x03, 0xd0, 0x94, 0xf8, 0x24, 0x01, 0x85, 0x28, + 0x05, 0xd1, 0xd4, 0xf8, 0x88, 0x04, 0x01, 0x07, 0x01, 0xd4, 0x00, 0x23, + 0x37, 0xe0, 0x83, 0x48, 0x94, 0xf9, 0x3a, 0x50, 0xb4, 0xf8, 0xe0, 0x23, + 0xb4, 0xf8, 0xe2, 0x13, 0x90, 0xf9, 0x01, 0x30, 0xb4, 0xf8, 0xde, 0x03, + 0x9d, 0x42, 0x10, 0xda, 0xd4, 0xf8, 0xd4, 0x60, 0x76, 0x7f, 0x2e, 0xb1, + 0x06, 0x9e, 0x76, 0x7a, 0x71, 0x43, 0x64, 0x26, 0xb1, 0xfb, 0xf6, 0xf1, + 0x5d, 0x1b, 0x8e, 0xb2, 0x5b, 0x42, 0x75, 0x43, 0x95, 0xfb, 0xf3, 0xf3, + 0x00, 0xe0, 0x00, 0x23, 0x06, 0x9e, 0x15, 0x18, 0x9b, 0xb2, 0x13, 0xfa, + 0x85, 0xf2, 0xf6, 0x7a, 0xb2, 0x42, 0x40, 0xf2, 0x97, 0x80, 0xad, 0xb2, + 0x64, 0x26, 0x18, 0x44, 0x15, 0xfa, 0x81, 0xf5, 0x89, 0xb2, 0x70, 0x43, + 0x71, 0x43, 0xb0, 0xfb, 0xf2, 0xf3, 0xd4, 0xf8, 0x88, 0x04, 0xb1, 0xfb, + 0xf5, 0xf1, 0x89, 0xb2, 0x05, 0x91, 0x80, 0x07, 0x13, 0xd5, 0x94, 0xf8, + 0xa4, 0x04, 0x41, 0x07, 0x01, 0xd5, 0x00, 0x07, 0x0d, 0xd5, 0xb4, 0xf8, + 0xe4, 0x03, 0xdd, 0xf8, 0x0c, 0x80, 0x41, 0x09, 0x18, 0x29, 0x06, 0xd8, + 0x4f, 0xf4, 0x48, 0x61, 0xa1, 0xeb, 0x80, 0x00, 0x02, 0x99, 0x91, 0xfb, + 0xf0, 0xf8, 0x5e, 0x49, 0x72, 0xb6, 0x08, 0x68, 0x40, 0x00, 0x01, 0x30, + 0x08, 0x60, 0x1f, 0xfa, 0x88, 0xf0, 0x64, 0x28, 0x4f, 0xf0, 0x64, 0x00, + 0x98, 0xbf, 0x80, 0x46, 0x94, 0xf8, 0x74, 0x60, 0x06, 0x98, 0x47, 0x78, + 0xbe, 0x42, 0x49, 0xd3, 0x05, 0x98, 0x04, 0x93, 0x45, 0x28, 0x04, 0xd8, + 0xff, 0xf7, 0xe2, 0xfe, 0x04, 0x9b, 0x00, 0x28, 0x5a, 0xd0, 0x94, 0xf8, + 0x76, 0x50, 0x84, 0xf8, 0x74, 0x50, 0xbd, 0x42, 0x1e, 0xd9, 0x05, 0x98, + 0x45, 0x28, 0x1b, 0xd8, 0x06, 0x99, 0xc6, 0xf1, 0x0b, 0x02, 0xc8, 0x78, + 0xc9, 0x79, 0x12, 0xfb, 0x01, 0x00, 0x94, 0xf8, 0x3a, 0x10, 0x88, 0x42, + 0x10, 0xda, 0x06, 0x98, 0x64, 0x21, 0x40, 0x79, 0x10, 0xfb, 0x01, 0xf0, + 0x1f, 0xfa, 0x88, 0xf1, 0xb0, 0xfb, 0xf1, 0xf0, 0x99, 0xb2, 0x88, 0x42, + 0x04, 0xd9, 0xff, 0xf7, 0xbd, 0xfe, 0x04, 0x9b, 0x00, 0x28, 0x4e, 0xd0, + 0x00, 0x20, 0x84, 0xf8, 0xe6, 0x03, 0x98, 0xb2, 0x1f, 0xfa, 0x88, 0xf3, + 0x31, 0x46, 0x01, 0x22, 0x00, 0x90, 0x20, 0x46, 0xff, 0xf7, 0x64, 0xfe, + 0x3a, 0x4f, 0xb5, 0x42, 0x0c, 0xd0, 0x04, 0xf1, 0x78, 0x05, 0x00, 0x26, + 0x94, 0xf8, 0x74, 0x00, 0x3a, 0x68, 0xf1, 0xb2, 0x90, 0x47, 0x25, 0xf8, + 0x16, 0x00, 0x01, 0x36, 0x04, 0x2e, 0xf5, 0xd1, 0x2f, 0x49, 0x08, 0x68, + 0x40, 0x08, 0x08, 0x60, 0x08, 0x68, 0x80, 0xf3, 0x10, 0x88, 0x2b, 0x48, + 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x2e, 0x48, 0x85, 0x21, 0x4a, 0x46, + 0x03, 0x68, 0x20, 0x46, 0x98, 0x47, 0x1f, 0x4d, 0x22, 0x4f, 0x1d, 0xe7, + 0x24, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x1b, 0x4d, 0x17, 0xe7, + 0x06, 0x98, 0x64, 0x21, 0x35, 0x46, 0x00, 0x79, 0x10, 0xfb, 0x01, 0xf0, + 0x1f, 0xfa, 0x88, 0xf1, 0xb0, 0xfb, 0xf1, 0xf0, 0x99, 0xb2, 0x88, 0x42, + 0x9b, 0xd2, 0x1d, 0x48, 0x94, 0xf8, 0x76, 0x10, 0x02, 0x68, 0x20, 0x46, + 0x90, 0x47, 0x06, 0x98, 0x04, 0x9b, 0x94, 0xf8, 0x74, 0x50, 0x47, 0x78, + 0x8f, 0xe7, 0x94, 0xf8, 0xe6, 0x03, 0x01, 0x30, 0x84, 0xf8, 0xe6, 0x03, + 0xc0, 0xb2, 0x06, 0x28, 0xab, 0xd3, 0x00, 0x20, 0x39, 0x46, 0x84, 0xf8, + 0xe6, 0x03, 0x12, 0x48, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0x04, 0x9b, + 0x94, 0xf8, 0x74, 0x50, 0x9f, 0xe7, 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0xe8, 0x65, 0x08, 0x00, 0x54, 0x34, 0x01, 0x00, 0x63, 0x34, 0x01, 0x00, + 0x5c, 0x34, 0x01, 0x00, 0x18, 0x74, 0x01, 0x00, 0x10, 0x61, 0x01, 0x00, + 0x4c, 0x49, 0x01, 0x00, 0x54, 0xf1, 0x05, 0x00, 0x80, 0xf3, 0xff, 0x0f, + 0x8a, 0x76, 0x01, 0x00, 0x18, 0x9c, 0x08, 0x00, 0x24, 0x36, 0x01, 0x00, + 0x44, 0x9c, 0x08, 0x00, 0x40, 0x9c, 0x08, 0x00, 0x38, 0x9c, 0x08, 0x00, + 0x48, 0x9c, 0x08, 0x00, 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, + 0x08, 0xdc, 0x08, 0x00, 0xe5, 0x6d, 0x04, 0x00, 0x10, 0xb5, 0x0a, 0x49, + 0x09, 0x78, 0x69, 0xb1, 0x09, 0x4b, 0x00, 0x22, 0x53, 0xf8, 0x22, 0x40, + 0x2c, 0xb1, 0x84, 0x42, 0x03, 0xd0, 0xb4, 0xf9, 0xfc, 0x42, 0x00, 0x2c, + 0x04, 0xd4, 0x01, 0x32, 0x8a, 0x42, 0xf3, 0xd3, 0x00, 0x20, 0x10, 0xbd, + 0x01, 0x20, 0x10, 0xbd, 0x5c, 0x34, 0x01, 0x00, 0x10, 0x61, 0x01, 0x00, + 0x70, 0xb5, 0x0c, 0x46, 0x05, 0x46, 0x18, 0xb9, 0x00, 0x20, 0x41, 0x21, + 0xd9, 0xf7, 0x2a, 0xff, 0xd5, 0xf8, 0x88, 0x60, 0xb0, 0x03, 0x48, 0xbf, + 0x5f, 0xea, 0x46, 0x30, 0x30, 0xd4, 0x00, 0xf0, 0x39, 0xf8, 0x18, 0xb9, + 0x28, 0x46, 0xff, 0xf7, 0xd1, 0xff, 0x48, 0xb3, 0x30, 0xb2, 0x00, 0x28, + 0x0e, 0xd4, 0x95, 0xf8, 0x90, 0x00, 0x40, 0xf0, 0x04, 0x00, 0x85, 0xf8, + 0x90, 0x00, 0x28, 0x46, 0x00, 0xf0, 0xe4, 0xf8, 0xd5, 0xf8, 0x88, 0x00, + 0x40, 0xf4, 0x00, 0x40, 0xc5, 0xf8, 0x88, 0x00, 0xd5, 0xf8, 0xfc, 0x02, + 0x18, 0x21, 0x40, 0xf4, 0x00, 0x40, 0xc5, 0xf8, 0xfc, 0x02, 0x0b, 0x48, + 0xdc, 0xf7, 0xa6, 0xf8, 0x0a, 0x48, 0x04, 0x21, 0x00, 0x22, 0x03, 0x68, + 0x28, 0x46, 0x98, 0x47, 0x64, 0x48, 0x21, 0x46, 0x3a, 0x22, 0x03, 0x68, + 0x28, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x18, 0x47, 0x28, 0x46, 0x21, 0x46, + 0xbd, 0xe8, 0x70, 0x40, 0x00, 0xf0, 0xc6, 0xb8, 0x1c, 0x7a, 0x01, 0x00, + 0xc0, 0x9b, 0x08, 0x00, 0x05, 0x48, 0x00, 0x68, 0x08, 0xb1, 0x01, 0x20, + 0x70, 0x47, 0x04, 0x48, 0x40, 0x68, 0x00, 0x28, 0x18, 0xbf, 0x01, 0x20, + 0x70, 0x47, 0x00, 0xbf, 0xa0, 0x52, 0x01, 0x00, 0xd8, 0x5d, 0x01, 0x00, + 0x70, 0xb5, 0xc0, 0xb3, 0x14, 0x46, 0x0d, 0x46, 0x06, 0x46, 0xff, 0xf7, + 0xe9, 0xff, 0x18, 0xb9, 0x28, 0x46, 0xff, 0xf7, 0x81, 0xff, 0xd0, 0xb3, + 0xd5, 0xf8, 0xd4, 0x00, 0x13, 0x22, 0x21, 0x23, 0x40, 0x7f, 0xb0, 0xfa, + 0x80, 0xf0, 0x41, 0x09, 0x28, 0x46, 0xfe, 0xf7, 0xb3, 0xfe, 0xd5, 0xf8, + 0xd4, 0x00, 0x40, 0x7f, 0x28, 0xb3, 0x19, 0x49, 0x94, 0xf8, 0x24, 0x00, + 0x09, 0x68, 0x88, 0x47, 0x94, 0xf8, 0x24, 0x10, 0x68, 0x78, 0x81, 0x42, + 0x1f, 0xd0, 0x00, 0x20, 0xff, 0x29, 0x11, 0xd0, 0x89, 0x00, 0x01, 0x22, + 0x02, 0xfa, 0x01, 0xf1, 0xd5, 0xf8, 0xd4, 0x20, 0xd2, 0xf8, 0x90, 0x30, + 0x23, 0xea, 0x01, 0x01, 0xc2, 0xf8, 0x90, 0x10, 0x94, 0xf8, 0x24, 0x10, + 0x02, 0xeb, 0x81, 0x01, 0xc1, 0xf8, 0x94, 0x00, 0x70, 0xbd, 0x00, 0x20, + 0x70, 0x21, 0xd9, 0xf7, 0x99, 0xfe, 0x0c, 0x20, 0x70, 0xbd, 0x07, 0x49, + 0xe0, 0x69, 0x09, 0x68, 0x88, 0x47, 0x00, 0x20, 0x70, 0xbd, 0x30, 0x46, + 0x29, 0x46, 0x22, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x00, 0xf0, 0x6a, 0xb8, + 0x9c, 0xda, 0x08, 0x00, 0xa0, 0xda, 0x08, 0x00, 0xb0, 0xb5, 0x0c, 0x46, + 0x05, 0x46, 0x09, 0xb9, 0x07, 0xf0, 0xdc, 0xf9, 0x28, 0x46, 0x21, 0x46, + 0xbd, 0xe8, 0xb0, 0x40, 0x00, 0xf0, 0x60, 0xb8, 0xf8, 0xb5, 0x06, 0x46, + 0x00, 0xf0, 0x62, 0xf8, 0x96, 0xf8, 0xf9, 0x02, 0x39, 0x28, 0x20, 0xd1, + 0x10, 0x4f, 0x06, 0xf5, 0x58, 0x74, 0x00, 0x25, 0x3a, 0x68, 0x20, 0x46, + 0x29, 0x46, 0x90, 0x47, 0xb8, 0xb1, 0x05, 0x46, 0x00, 0x78, 0x6d, 0x28, + 0xf6, 0xd1, 0x30, 0x46, 0x6d, 0x21, 0x2a, 0x46, 0xfe, 0xf7, 0x4c, 0xfe, + 0x08, 0x48, 0x12, 0x21, 0x00, 0x78, 0xd9, 0xf7, 0x73, 0xfe, 0x07, 0x48, + 0x29, 0x46, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0x28, 0x46, 0xbd, 0xe8, + 0xf8, 0x40, 0xdf, 0xf7, 0xd1, 0xbc, 0xf8, 0xbd, 0xec, 0xa0, 0x08, 0x00, + 0x66, 0x34, 0x01, 0x00, 0xe8, 0xa0, 0x08, 0x00, 0x06, 0x48, 0x07, 0x49, + 0x01, 0x60, 0x07, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x08, 0x49, + 0x01, 0x60, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0xdc, 0xd4, 0x08, 0x00, 0x4d, 0x72, 0x04, 0x00, 0xd8, 0xd4, 0x08, 0x00, + 0x99, 0x71, 0x04, 0x00, 0x9c, 0xd8, 0x08, 0x00, 0xf1, 0x72, 0x04, 0x00, + 0x9c, 0xdb, 0x08, 0x00, 0x09, 0x73, 0x04, 0x00, 0x48, 0xf2, 0xcd, 0x4c, + 0xc1, 0xf2, 0x0e, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x43, 0xf6, 0xad, 0x2c, + 0xc1, 0xf2, 0x0c, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x43, 0xf6, 0x49, 0x5c, + 0xc1, 0xf2, 0x0c, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x43, 0xf2, 0x6d, 0x7c, + 0xc1, 0xf2, 0x0c, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x43, 0xf2, 0xe1, 0x6c, + 0xc1, 0xf2, 0x0c, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0xfe, 0xb5, 0x05, 0x46, + 0x2f, 0x48, 0x0c, 0x46, 0x90, 0xf8, 0xff, 0x00, 0x98, 0xb1, 0x95, 0xf8, + 0x88, 0x04, 0x80, 0x07, 0x0f, 0xd5, 0x94, 0xf9, 0x00, 0x00, 0xb0, 0xf1, + 0xff, 0x3f, 0x0a, 0xdc, 0x29, 0x48, 0x2a, 0x49, 0x00, 0x78, 0xc0, 0xeb, + 0x40, 0x10, 0x01, 0xeb, 0xc0, 0x00, 0xb0, 0xf8, 0xdc, 0x00, 0x40, 0x07, + 0x02, 0xd4, 0x00, 0x20, 0x20, 0x70, 0xfe, 0xbd, 0x25, 0x48, 0x24, 0x4f, + 0x90, 0xf8, 0x3e, 0x06, 0x3e, 0x89, 0x01, 0x28, 0x2f, 0xd1, 0x23, 0x48, + 0x40, 0x79, 0x01, 0x28, 0x2b, 0xd1, 0x95, 0xf8, 0xda, 0x03, 0x00, 0x28, + 0xed, 0xd1, 0x01, 0x20, 0x85, 0xf8, 0xda, 0x03, 0x8d, 0xf8, 0x09, 0x00, + 0xd5, 0xf8, 0x88, 0x00, 0x41, 0x06, 0x09, 0xd4, 0x40, 0xf0, 0x40, 0x00, + 0x29, 0x46, 0x00, 0x22, 0xc5, 0xf8, 0x88, 0x00, 0x19, 0x48, 0x03, 0x68, + 0x9c, 0x20, 0x98, 0x47, 0xb5, 0xf8, 0xd8, 0x03, 0x01, 0xab, 0x01, 0x21, + 0x00, 0x22, 0x01, 0x90, 0x95, 0xf8, 0xdb, 0x03, 0x8d, 0xf8, 0x0a, 0x00, + 0x20, 0x78, 0x8d, 0xf8, 0x0b, 0x00, 0x12, 0x48, 0x05, 0x68, 0x08, 0x20, + 0x00, 0x90, 0x40, 0xf2, 0x12, 0x60, 0xa8, 0x47, 0xc5, 0xe7, 0x28, 0x46, + 0x21, 0x46, 0x00, 0xf0, 0x23, 0xf8, 0x38, 0x89, 0xb0, 0x42, 0x03, 0xd0, + 0x08, 0x48, 0x01, 0x68, 0x30, 0x46, 0x88, 0x47, 0xfe, 0xbd, 0x00, 0xbf, + 0xe8, 0x65, 0x08, 0x00, 0x74, 0x87, 0x08, 0x00, 0x0c, 0x6f, 0x01, 0x00, + 0xe8, 0x49, 0x01, 0x00, 0x64, 0xd4, 0x05, 0x00, 0x48, 0xdc, 0x05, 0x00, + 0x2c, 0xe2, 0x08, 0x00, 0xa8, 0xa0, 0x08, 0x00, 0xa0, 0xa0, 0x08, 0x00, + 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, 0x50, 0xdc, 0x08, 0x00, + 0xe1, 0x73, 0x04, 0x00, 0x4b, 0xf2, 0xad, 0x5c, 0xc1, 0xf2, 0x0b, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0xb0, 0xb5, 0x70, 0xb1, 0x04, 0x46, 0x90, 0xf8, + 0xc8, 0x02, 0x0d, 0x46, 0x13, 0x28, 0x0e, 0xd0, 0x11, 0x28, 0x18, 0xd1, + 0x4b, 0x2d, 0x16, 0xd1, 0x3a, 0xb9, 0x20, 0x46, 0x4b, 0x21, 0x00, 0x22, + 0x0d, 0xe0, 0x00, 0x20, 0x55, 0x21, 0xd9, 0xf7, 0x77, 0xfd, 0x0c, 0x20, + 0xb0, 0xbd, 0x4c, 0x2d, 0x09, 0xd1, 0x4d, 0x48, 0x90, 0xf8, 0x4a, 0x00, + 0x90, 0xb1, 0x20, 0x46, 0x4c, 0x21, 0xbd, 0xe8, 0xb0, 0x40, 0x00, 0xf0, + 0xb1, 0xb8, 0x20, 0x46, 0x29, 0x46, 0x00, 0xf0, 0xad, 0xf8, 0x47, 0x2d, + 0x05, 0xd1, 0x94, 0xf8, 0xc8, 0x12, 0x11, 0x29, 0x08, 0xbf, 0x00, 0x28, + 0x02, 0xd0, 0xb0, 0xbd, 0x07, 0x20, 0xb0, 0xbd, 0x94, 0xf8, 0xc0, 0x02, + 0x84, 0xf8, 0xc1, 0x02, 0x00, 0x20, 0xb0, 0xbd, 0x70, 0xb5, 0x05, 0x46, + 0xb0, 0xf8, 0xac, 0x02, 0x0c, 0x46, 0x80, 0x05, 0x08, 0xd4, 0xd5, 0xf8, + 0xd4, 0x10, 0xa0, 0x7b, 0x49, 0x7f, 0x00, 0x29, 0x18, 0xbf, 0x01, 0x21, + 0x88, 0x42, 0x0b, 0xd0, 0x20, 0x89, 0x20, 0xf0, 0x01, 0x01, 0x60, 0x89, + 0x21, 0x81, 0x20, 0xf0, 0x01, 0x00, 0x60, 0x81, 0xa0, 0x88, 0x08, 0xb1, + 0x06, 0x29, 0x01, 0xd2, 0x00, 0x20, 0x70, 0xbd, 0xd5, 0xf8, 0xd4, 0x30, + 0xa2, 0x7b, 0x01, 0x20, 0x60, 0x74, 0x5b, 0x7f, 0x00, 0x2b, 0x18, 0xbf, + 0x01, 0x23, 0x9a, 0x42, 0x0a, 0xd0, 0xd5, 0xf8, 0x88, 0x04, 0x21, 0x80, + 0x01, 0x07, 0x58, 0xbf, 0x5f, 0xea, 0x40, 0x70, 0x03, 0xd5, 0x20, 0x88, + 0x60, 0x80, 0x01, 0x20, 0x70, 0xbd, 0x18, 0x48, 0x00, 0x21, 0x02, 0x68, + 0x00, 0x20, 0x90, 0x47, 0x06, 0x46, 0x20, 0x7d, 0x00, 0x28, 0xf2, 0xd1, + 0x14, 0x49, 0x08, 0x78, 0xc2, 0x06, 0x0a, 0xd5, 0xd5, 0xf8, 0xf0, 0x20, + 0x3a, 0xb1, 0x05, 0x23, 0xb2, 0xfb, 0xf3, 0xf2, 0x23, 0x88, 0x9a, 0x42, + 0x3c, 0xbf, 0x22, 0x80, 0x08, 0x78, 0x00, 0x07, 0xe1, 0xd5, 0x0d, 0x48, + 0x1c, 0x21, 0x02, 0x68, 0x28, 0x46, 0x90, 0x47, 0x00, 0x28, 0xda, 0xd1, + 0x71, 0x00, 0x20, 0x88, 0x89, 0xb2, 0x88, 0x42, 0x38, 0xbf, 0x70, 0x00, + 0x82, 0xb2, 0xb2, 0xfb, 0xf1, 0xf3, 0x59, 0x43, 0x89, 0x1a, 0x08, 0x44, + 0x60, 0x80, 0x20, 0x80, 0xcb, 0xe7, 0x00, 0xbf, 0xc8, 0xc8, 0x08, 0x00, + 0x7f, 0x0f, 0x01, 0x00, 0x0c, 0xbb, 0x08, 0x00, 0x07, 0x49, 0x91, 0xf8, + 0x4a, 0x10, 0x09, 0xb1, 0x00, 0xf0, 0x30, 0xb8, 0x07, 0x20, 0x70, 0x47, + 0x03, 0x4b, 0x93, 0xf8, 0x4a, 0x30, 0x0b, 0xb1, 0x00, 0xf0, 0x2e, 0xb8, + 0x70, 0x47, 0x00, 0xbf, 0x68, 0x8a, 0x01, 0x00, 0x06, 0x48, 0x07, 0x49, + 0x01, 0x60, 0x07, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x08, 0x49, + 0x01, 0x60, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0x38, 0xdd, 0x08, 0x00, 0x55, 0x75, 0x04, 0x00, 0xc4, 0xba, 0x08, 0x00, + 0xe5, 0x74, 0x04, 0x00, 0x68, 0xc5, 0x08, 0x00, 0x2d, 0x76, 0x04, 0x00, + 0x6c, 0xc5, 0x08, 0x00, 0x3d, 0x76, 0x04, 0x00, 0x4f, 0xf6, 0xe5, 0x6c, + 0xc1, 0xf2, 0x0b, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4f, 0xf6, 0x8d, 0x5c, + 0xc1, 0xf2, 0x0b, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4f, 0xf6, 0x19, 0x5c, + 0xc1, 0xf2, 0x0b, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0xf8, 0xb5, 0x1c, 0x46, + 0x15, 0x46, 0x0e, 0x46, 0x07, 0x46, 0x60, 0xb1, 0x5d, 0xb9, 0xd7, 0xf8, + 0xd4, 0x00, 0xda, 0xf7, 0x0b, 0xf9, 0x97, 0xf8, 0x35, 0x11, 0x07, 0x4a, + 0x01, 0xeb, 0x41, 0x01, 0x02, 0xeb, 0x41, 0x11, 0xc8, 0x63, 0x38, 0x46, + 0x31, 0x46, 0x2a, 0x46, 0x23, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x40, + 0x00, 0xf0, 0x0a, 0xb8, 0x54, 0xf1, 0x05, 0x00, 0x01, 0x48, 0x02, 0x49, + 0x01, 0x60, 0x70, 0x47, 0xf8, 0xc4, 0x08, 0x00, 0xb1, 0x76, 0x04, 0x00, + 0x45, 0xf6, 0x41, 0x6c, 0xc1, 0xf2, 0x0b, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x2d, 0xe9, 0xf0, 0x41, 0x05, 0x68, 0xa5, 0xb3, 0xb5, 0xf8, 0x80, 0x71, + 0xb5, 0xf8, 0x7e, 0x61, 0x95, 0xf8, 0xc2, 0x80, 0x00, 0xf0, 0xcc, 0xfc, + 0x04, 0x46, 0xb5, 0xf8, 0x7e, 0x01, 0x86, 0x42, 0x09, 0xd0, 0x95, 0xf8, + 0x35, 0x01, 0x58, 0x49, 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, 0x40, 0x10, + 0x41, 0x6a, 0x01, 0x31, 0x41, 0x62, 0xb5, 0xf8, 0x80, 0x01, 0x87, 0x42, + 0x09, 0xd0, 0x95, 0xf8, 0x35, 0x01, 0x51, 0x49, 0x00, 0xeb, 0x40, 0x00, + 0x01, 0xeb, 0x40, 0x10, 0x81, 0x69, 0x01, 0x31, 0x81, 0x61, 0x6a, 0x48, + 0x0b, 0x49, 0x00, 0x78, 0x00, 0xeb, 0x80, 0x00, 0x01, 0xeb, 0xc0, 0x00, + 0x01, 0x7b, 0x03, 0x29, 0x0a, 0xd1, 0x00, 0x7e, 0x01, 0x28, 0x08, 0xbf, + 0x85, 0xf8, 0xc2, 0x80, 0x04, 0xe0, 0x00, 0x20, 0xa6, 0x21, 0x00, 0x24, + 0xdf, 0xf7, 0x9e, 0xfa, 0x20, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0xbf, + 0x84, 0x71, 0x01, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, 0x00, 0x28, 0x6d, 0xd0, + 0x04, 0x68, 0x00, 0x2c, 0x6e, 0xd0, 0xb4, 0xf8, 0x74, 0x61, 0xb4, 0xf8, + 0x84, 0x50, 0x00, 0xf0, 0x8d, 0xfc, 0x81, 0x46, 0xb4, 0xf8, 0x74, 0x01, + 0x86, 0x42, 0x09, 0xd0, 0x94, 0xf8, 0x35, 0x01, 0x35, 0x49, 0x00, 0xeb, + 0x40, 0x00, 0x01, 0xeb, 0x40, 0x10, 0xc1, 0x69, 0x01, 0x31, 0xc1, 0x61, + 0xa8, 0x07, 0x5e, 0xd5, 0xb4, 0xf8, 0x84, 0x00, 0x80, 0x07, 0x5a, 0xd4, + 0x2f, 0x48, 0x00, 0x68, 0x00, 0x28, 0x56, 0xd1, 0xdf, 0xf8, 0xb8, 0xa0, + 0x2e, 0x48, 0x00, 0x21, 0x00, 0xf1, 0x60, 0x05, 0xda, 0xf8, 0x00, 0x20, + 0x28, 0x46, 0x90, 0x47, 0xda, 0xf8, 0x00, 0x20, 0xc8, 0xb1, 0xdf, 0xf8, + 0xa8, 0x80, 0x06, 0x46, 0x28, 0x46, 0x31, 0x46, 0x37, 0x46, 0x90, 0x47, + 0x06, 0x46, 0x38, 0x78, 0xa3, 0x28, 0x0a, 0xd1, 0x78, 0x68, 0xa0, 0x42, + 0x07, 0xd1, 0xd8, 0xf8, 0x00, 0x20, 0x28, 0x46, 0x39, 0x46, 0x90, 0x47, + 0x38, 0x46, 0xdf, 0xf7, 0x6d, 0xfa, 0xda, 0xf8, 0x00, 0x20, 0x00, 0x2e, + 0xe8, 0xd1, 0x1e, 0x48, 0x00, 0x21, 0x90, 0x47, 0x58, 0xb3, 0x1c, 0x4e, + 0xdf, 0xf8, 0x68, 0xb0, 0x05, 0x46, 0x04, 0xf5, 0x80, 0x78, 0xda, 0xf8, + 0x00, 0x20, 0x30, 0x46, 0x29, 0x46, 0x2f, 0x46, 0x90, 0x47, 0x05, 0x46, + 0x38, 0x68, 0x84, 0x42, 0x0d, 0xd1, 0x38, 0x1d, 0x41, 0x46, 0x06, 0x22, + 0xe9, 0xf7, 0xb2, 0xfd, 0x38, 0xb9, 0xdb, 0xf8, 0x00, 0x20, 0x30, 0x46, + 0x39, 0x46, 0x90, 0x47, 0x38, 0x46, 0xdf, 0xf7, 0x47, 0xfa, 0x00, 0x2d, + 0xe5, 0xd1, 0x0a, 0xe0, 0x00, 0x20, 0x4f, 0xf4, 0xd0, 0x71, 0x02, 0xe0, + 0x00, 0x20, 0x4f, 0xf4, 0xd1, 0x71, 0x4f, 0xf0, 0x00, 0x09, 0xdf, 0xf7, + 0x1b, 0xfa, 0x48, 0x46, 0xbd, 0xe8, 0xf8, 0x8f, 0x54, 0xf1, 0x05, 0x00, + 0x68, 0x52, 0x01, 0x00, 0xec, 0xa0, 0x08, 0x00, 0x2c, 0xba, 0x01, 0x00, + 0xe8, 0xa0, 0x08, 0x00, 0xe4, 0x5a, 0x01, 0x00, 0x80, 0xb5, 0x00, 0xf0, + 0x11, 0xfc, 0x11, 0x48, 0x90, 0xf8, 0xec, 0x12, 0xe9, 0xb1, 0x10, 0x49, + 0x91, 0xf8, 0xfe, 0x16, 0xc9, 0xb1, 0x0f, 0x49, 0x49, 0x78, 0x03, 0x29, + 0x15, 0xd1, 0x0e, 0x49, 0x4a, 0x7f, 0x3f, 0x2a, 0x11, 0xd1, 0x0d, 0x4a, + 0x0d, 0x4b, 0x12, 0x78, 0xc2, 0xeb, 0x42, 0x12, 0x53, 0xf8, 0x32, 0x20, + 0x92, 0xf8, 0xbc, 0x26, 0x01, 0x2a, 0x06, 0xd1, 0x90, 0xf8, 0x54, 0x02, + 0x40, 0x22, 0x4a, 0x77, 0x40, 0xf0, 0x80, 0x00, 0x88, 0x77, 0x80, 0xbd, + 0x8c, 0x7e, 0x08, 0x00, 0x38, 0x21, 0x01, 0x00, 0x50, 0x2e, 0x01, 0x00, + 0xfc, 0x20, 0x01, 0x00, 0x74, 0x87, 0x08, 0x00, 0x0c, 0x6f, 0x01, 0x00, + 0x7c, 0xb5, 0x04, 0x46, 0x00, 0x68, 0x00, 0x28, 0x00, 0xf0, 0x98, 0x81, + 0xcc, 0x48, 0x00, 0x21, 0xcc, 0x4d, 0x01, 0x60, 0x20, 0x68, 0x29, 0x68, + 0x09, 0x05, 0x65, 0xd4, 0xca, 0x49, 0x69, 0x58, 0x09, 0x01, 0x61, 0xd4, + 0x90, 0xf8, 0x29, 0x11, 0x41, 0xf0, 0x01, 0x01, 0x80, 0xf8, 0x29, 0x11, + 0x21, 0x68, 0xd1, 0xf8, 0xcc, 0x21, 0x22, 0xf0, 0x0f, 0x02, 0xc1, 0xf8, + 0xcc, 0x21, 0x21, 0x68, 0xd1, 0xf8, 0xcc, 0x21, 0x42, 0xf0, 0x03, 0x02, + 0xc1, 0xf8, 0xcc, 0x21, 0xdf, 0xf8, 0xe4, 0x13, 0x22, 0x68, 0x09, 0x78, + 0xd2, 0xf8, 0xd4, 0x20, 0x52, 0x7f, 0x7a, 0xb1, 0xdf, 0xf8, 0xdc, 0x33, + 0xc1, 0xeb, 0x41, 0x12, 0x03, 0xeb, 0xc2, 0x02, 0x92, 0xf8, 0x99, 0x20, + 0x01, 0x2a, 0x05, 0xd1, 0x90, 0xf8, 0x31, 0x21, 0x42, 0xf0, 0x01, 0x02, + 0x80, 0xf8, 0x31, 0x21, 0xdf, 0xf8, 0xb8, 0x23, 0x01, 0xeb, 0x81, 0x01, + 0x02, 0xeb, 0xc1, 0x02, 0x91, 0x7b, 0x4b, 0x1e, 0x01, 0x2b, 0x05, 0xd8, + 0x90, 0xf8, 0x30, 0x31, 0x43, 0xf0, 0x01, 0x03, 0x80, 0xf8, 0x30, 0x31, + 0x23, 0x68, 0xd3, 0xf8, 0xbc, 0x05, 0x80, 0xb1, 0x93, 0xf8, 0x6a, 0x61, + 0x01, 0x2e, 0x0c, 0xd1, 0x93, 0xf8, 0x69, 0x31, 0x0f, 0x2b, 0x08, 0xd8, + 0x01, 0x26, 0x06, 0xfa, 0x03, 0xf3, 0x13, 0xf4, 0x09, 0x4f, 0x1e, 0xbf, + 0xc3, 0x88, 0x01, 0x33, 0xc3, 0x80, 0x02, 0x29, 0x03, 0xd3, 0x10, 0x7b, + 0x03, 0x28, 0x40, 0xf0, 0xdb, 0x80, 0x20, 0x68, 0x90, 0xf8, 0xb0, 0x15, + 0x00, 0x20, 0x01, 0x29, 0xd9, 0x49, 0x08, 0xbf, 0x03, 0x20, 0x0a, 0x68, + 0x01, 0x21, 0xdd, 0xe0, 0x90, 0xf8, 0x28, 0x11, 0x41, 0xf0, 0x01, 0x01, + 0x80, 0xf8, 0x28, 0x11, 0x20, 0x68, 0xd0, 0xf8, 0xd4, 0x10, 0x49, 0x7f, + 0x21, 0xb1, 0xc7, 0x49, 0x09, 0x68, 0x39, 0xb1, 0x81, 0x42, 0x05, 0xd1, + 0xc5, 0x49, 0x00, 0x22, 0x0b, 0x68, 0x00, 0x21, 0x98, 0x47, 0x20, 0x68, + 0xe8, 0xb1, 0xd0, 0xf8, 0xcc, 0x11, 0x21, 0xf0, 0x0f, 0x01, 0xc0, 0xf8, + 0xcc, 0x11, 0x20, 0x68, 0xd0, 0xf8, 0xcc, 0x11, 0x41, 0xf0, 0x05, 0x01, + 0xc0, 0xf8, 0xcc, 0x11, 0x20, 0x68, 0x70, 0xb1, 0x90, 0xf8, 0x35, 0x11, + 0xba, 0x4a, 0x01, 0xeb, 0xc1, 0x01, 0x02, 0xeb, 0x41, 0x01, 0x49, 0x78, + 0x31, 0xb1, 0xb0, 0xf8, 0x78, 0x11, 0x01, 0x31, 0xa0, 0xf8, 0x78, 0x11, + 0x05, 0xe0, 0x55, 0xe0, 0xb0, 0xf8, 0x76, 0x11, 0x01, 0x31, 0xa0, 0xf8, + 0x76, 0x11, 0x20, 0x68, 0xb0, 0xf8, 0x40, 0x11, 0x01, 0x31, 0xa0, 0xf8, + 0x40, 0x11, 0xaf, 0x48, 0x00, 0x68, 0x01, 0x07, 0x18, 0xbf, 0x5f, 0xea, + 0xc0, 0x71, 0x6e, 0xd1, 0x10, 0xf0, 0xf0, 0x0f, 0x19, 0xd0, 0xc1, 0x06, + 0x17, 0xd5, 0x21, 0x68, 0xb1, 0xf8, 0x54, 0x21, 0x01, 0x32, 0xa1, 0xf8, + 0x54, 0x21, 0x21, 0x68, 0xb1, 0xf8, 0x56, 0x21, 0x01, 0x32, 0xa1, 0xf8, + 0x56, 0x21, 0x21, 0x68, 0xb1, 0xf8, 0x58, 0x21, 0x01, 0x32, 0xa1, 0xf8, + 0x58, 0x21, 0x21, 0x68, 0xb1, 0xf8, 0x5a, 0x21, 0x01, 0x32, 0xa1, 0xf8, + 0x5a, 0x21, 0x10, 0xf4, 0x70, 0x6f, 0x19, 0xd0, 0xc0, 0x05, 0x17, 0xd5, + 0x20, 0x68, 0xb0, 0xf8, 0x5c, 0x11, 0x01, 0x31, 0xa0, 0xf8, 0x5c, 0x11, + 0x20, 0x68, 0xb0, 0xf8, 0x5e, 0x11, 0x01, 0x31, 0xa0, 0xf8, 0x5e, 0x11, + 0x20, 0x68, 0xb0, 0xf8, 0x60, 0x11, 0x01, 0x31, 0xa0, 0xf8, 0x60, 0x11, + 0x20, 0x68, 0xb0, 0xf8, 0x62, 0x11, 0x01, 0x31, 0xa0, 0xf8, 0x62, 0x11, + 0x8f, 0x48, 0x00, 0x68, 0xc0, 0x01, 0x05, 0xd5, 0x20, 0x68, 0xb0, 0xf8, + 0x64, 0x11, 0x01, 0x31, 0xa0, 0xf8, 0x64, 0x11, 0x8b, 0x48, 0xc1, 0x68, + 0x01, 0x31, 0xc1, 0x60, 0xd0, 0x48, 0x8b, 0x49, 0x00, 0x78, 0x00, 0xeb, + 0x80, 0x00, 0x01, 0xeb, 0xc0, 0x00, 0xc1, 0x69, 0x41, 0xf4, 0x80, 0x11, + 0xc1, 0x61, 0x20, 0x68, 0xd0, 0xf8, 0xe0, 0x10, 0x01, 0x31, 0x0f, 0xd0, + 0x90, 0xf8, 0x35, 0x11, 0x7d, 0x4a, 0x01, 0xeb, 0xc1, 0x01, 0x02, 0xeb, + 0x41, 0x01, 0x49, 0x78, 0x01, 0x29, 0x06, 0xd1, 0xb0, 0xf8, 0xfa, 0x14, + 0x01, 0x31, 0xa0, 0xf8, 0xfa, 0x14, 0x20, 0x68, 0x90, 0xb3, 0xb0, 0xf8, + 0xe4, 0x13, 0x01, 0x31, 0xa0, 0xf8, 0xe4, 0x13, 0x2c, 0xe0, 0x21, 0x68, + 0xb1, 0xf8, 0x4c, 0x21, 0x01, 0x32, 0xa1, 0xf8, 0x4c, 0x21, 0x21, 0x68, + 0xb1, 0xf8, 0x4e, 0x21, 0x01, 0x32, 0xa1, 0xf8, 0x4e, 0x21, 0x21, 0x68, + 0xb1, 0xf8, 0x50, 0x21, 0x01, 0x32, 0xa1, 0xf8, 0x50, 0x21, 0x21, 0x68, + 0xb1, 0xf8, 0x52, 0x21, 0x01, 0x32, 0xa1, 0xf8, 0x52, 0x21, 0x77, 0xe7, + 0x20, 0x68, 0x90, 0xf8, 0xb0, 0x25, 0x01, 0x20, 0x01, 0x2a, 0x6b, 0x4a, + 0x08, 0xbf, 0x03, 0x20, 0x02, 0xeb, 0xc1, 0x01, 0x69, 0x4a, 0x91, 0xf8, + 0x84, 0x10, 0x12, 0x68, 0x90, 0x47, 0xd9, 0xf7, 0x2f, 0xfa, 0x21, 0x68, + 0xc1, 0xf8, 0xe4, 0x00, 0x20, 0x68, 0xd0, 0xf8, 0xd4, 0x10, 0x49, 0x7f, + 0x00, 0x29, 0x00, 0xf0, 0x9c, 0x80, 0x62, 0x49, 0x00, 0xf5, 0x94, 0x70, + 0x09, 0x68, 0x88, 0x47, 0x20, 0x68, 0x70, 0xb3, 0x90, 0xf8, 0x88, 0x14, + 0x89, 0x07, 0x2a, 0xd5, 0xd0, 0xf8, 0xbc, 0x05, 0x38, 0xb3, 0x5c, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x03, 0x28, 0x22, 0xd1, 0x28, 0x68, 0x00, 0x05, + 0x03, 0xd4, 0x4b, 0x48, 0x28, 0x58, 0x00, 0x01, 0x1b, 0xd5, 0x20, 0x68, + 0x4b, 0x4a, 0xd0, 0xf8, 0xbc, 0x05, 0x41, 0x6a, 0x02, 0x31, 0x41, 0x62, + 0x20, 0x68, 0x90, 0xf8, 0x35, 0x11, 0x01, 0xeb, 0xc1, 0x01, 0x02, 0xeb, + 0x41, 0x01, 0x49, 0x78, 0x59, 0xb9, 0x4f, 0x49, 0x91, 0xf8, 0x79, 0x10, + 0x0c, 0x29, 0x01, 0xd0, 0x0a, 0x29, 0x04, 0xd1, 0xd0, 0xf8, 0xbc, 0x05, + 0x41, 0x6a, 0x02, 0x39, 0x41, 0x62, 0x4a, 0x49, 0x20, 0x68, 0x09, 0x68, + 0x88, 0x47, 0x20, 0x68, 0x90, 0xf8, 0x88, 0x14, 0x89, 0x07, 0x07, 0xd4, + 0x7c, 0xbd, 0x00, 0xbf, 0xc0, 0x00, 0x21, 0x40, 0xcc, 0x20, 0x21, 0x40, + 0x20, 0xf0, 0xff, 0xff, 0x90, 0xf8, 0xa4, 0x04, 0x41, 0x07, 0x01, 0xd5, + 0x00, 0x07, 0xf1, 0xd5, 0x28, 0x68, 0x00, 0x05, 0x03, 0xd4, 0x2e, 0x48, + 0x28, 0x58, 0x00, 0x01, 0xea, 0xd5, 0x3c, 0x4e, 0xd9, 0xf7, 0xce, 0xf9, + 0x30, 0x60, 0x21, 0x68, 0xb1, 0xf8, 0x76, 0x11, 0x31, 0x81, 0x22, 0x68, + 0xb2, 0xf8, 0x78, 0x21, 0x11, 0x44, 0x72, 0x81, 0x01, 0x29, 0x08, 0xbf, + 0x70, 0x60, 0x31, 0x48, 0x00, 0x68, 0x80, 0x47, 0xb0, 0x81, 0x30, 0x68, + 0x21, 0x68, 0xd1, 0xf8, 0x70, 0x11, 0x40, 0x1a, 0x71, 0x89, 0x00, 0xeb, + 0x80, 0x00, 0x00, 0x09, 0xf0, 0x81, 0x30, 0x89, 0x08, 0x44, 0x33, 0x28, + 0xc8, 0xd3, 0x05, 0x21, 0xb0, 0xfb, 0xf1, 0xf1, 0x01, 0xeb, 0x81, 0x01, + 0x40, 0x1a, 0xc1, 0xd1, 0x28, 0x68, 0x27, 0x4b, 0x01, 0x21, 0x00, 0x22, + 0x30, 0x61, 0x26, 0x48, 0x00, 0x68, 0x70, 0x61, 0x25, 0x48, 0x00, 0x68, + 0xb0, 0x61, 0x25, 0x48, 0x00, 0x68, 0xf0, 0x61, 0x24, 0x48, 0x00, 0x68, + 0x30, 0x62, 0x24, 0x48, 0x00, 0x68, 0x70, 0x62, 0x11, 0x48, 0x00, 0x68, + 0xb0, 0x62, 0x22, 0x48, 0x04, 0x68, 0x2c, 0x20, 0x00, 0x90, 0x40, 0xf2, + 0x49, 0x60, 0xa0, 0x47, 0x7c, 0xbd, 0x09, 0x49, 0x09, 0x68, 0x11, 0xb1, + 0x81, 0x42, 0x3f, 0xf4, 0x5e, 0xaf, 0x29, 0x68, 0x09, 0x05, 0x3f, 0xf5, + 0x5a, 0xaf, 0x03, 0x49, 0x69, 0x58, 0x09, 0x01, 0x3f, 0xf5, 0x55, 0xaf, + 0x59, 0xe7, 0x00, 0xbf, 0x20, 0xf0, 0xff, 0xff, 0xe4, 0x5e, 0x01, 0x00, + 0xac, 0xbb, 0x08, 0x00, 0x44, 0x28, 0x01, 0x00, 0x14, 0x51, 0x00, 0x40, + 0x98, 0x60, 0x00, 0x40, 0xb0, 0xf0, 0x05, 0x00, 0x74, 0x87, 0x08, 0x00, + 0x84, 0x71, 0x01, 0x00, 0x0c, 0x6f, 0x01, 0x00, 0x86, 0x71, 0x0d, 0x10, + 0xfc, 0xb9, 0x08, 0x00, 0x50, 0xd2, 0x08, 0x00, 0x3c, 0xe5, 0x08, 0x00, + 0x4c, 0x49, 0x01, 0x00, 0xc0, 0xbb, 0x08, 0x00, 0x2c, 0xf0, 0x05, 0x00, + 0xcc, 0x43, 0x05, 0x30, 0x40, 0x40, 0x05, 0x30, 0x1c, 0x50, 0x00, 0x40, + 0x64, 0x50, 0x00, 0x30, 0xe8, 0x43, 0x05, 0x30, 0xa0, 0xa0, 0x08, 0x00, + 0x2d, 0xe9, 0xf8, 0x43, 0xdf, 0xf8, 0xd0, 0x80, 0xa3, 0x4f, 0x98, 0xf8, + 0x00, 0x00, 0xc0, 0xeb, 0x40, 0x10, 0x57, 0xf8, 0x30, 0x50, 0x00, 0x2d, + 0x4e, 0xd0, 0x07, 0xeb, 0xc0, 0x00, 0x6a, 0x78, 0x90, 0xf8, 0x9f, 0x10, + 0x91, 0x42, 0x50, 0xd1, 0xb5, 0xf8, 0x82, 0x10, 0xc9, 0x07, 0x0f, 0xd0, + 0x90, 0xf8, 0x99, 0x00, 0x01, 0x28, 0x0b, 0xd1, 0x95, 0xf8, 0xa3, 0x02, + 0x01, 0x07, 0x07, 0xd5, 0x95, 0xf8, 0x8a, 0x10, 0x89, 0x07, 0x5c, 0xbf, + 0x00, 0xf0, 0xf7, 0x00, 0x85, 0xf8, 0xa3, 0x02, 0xb5, 0xf8, 0x44, 0x91, + 0xb5, 0xf8, 0x82, 0x61, 0x00, 0xf0, 0x80, 0xf9, 0x04, 0x46, 0xb5, 0xf8, + 0x82, 0x01, 0x86, 0x42, 0x09, 0xd0, 0x95, 0xf8, 0x35, 0x01, 0x7b, 0x49, + 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, 0x40, 0x10, 0x01, 0x6a, 0x01, 0x31, + 0x01, 0x62, 0xb5, 0xf8, 0x44, 0x01, 0x81, 0x45, 0x20, 0xd0, 0x98, 0xf8, + 0x00, 0x00, 0xc0, 0xeb, 0x40, 0x10, 0x57, 0xf8, 0x30, 0x00, 0xb0, 0xf8, + 0x82, 0x10, 0x09, 0x07, 0x16, 0xd4, 0x90, 0xf8, 0xa4, 0x04, 0x41, 0x07, + 0x12, 0xd5, 0x00, 0x07, 0x10, 0xd4, 0x95, 0xf8, 0x35, 0x01, 0x6c, 0x49, + 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, 0x40, 0x10, 0xc1, 0x6c, 0x01, 0x31, + 0xc1, 0x64, 0x05, 0xe0, 0x00, 0x20, 0x40, 0xf2, 0xed, 0x11, 0x00, 0x24, + 0xde, 0xf7, 0x3e, 0xff, 0x20, 0x46, 0xbd, 0xe8, 0xf8, 0x83, 0x8f, 0x49, + 0x51, 0xf8, 0x48, 0x2f, 0x41, 0x61, 0xbd, 0xe8, 0xf8, 0x43, 0x10, 0x47, + 0x74, 0x87, 0x08, 0x00, 0xfe, 0xb5, 0x05, 0x46, 0x08, 0x79, 0x0c, 0x46, + 0x00, 0xf0, 0xfe, 0x00, 0x26, 0x28, 0x43, 0xd1, 0x95, 0xf8, 0x88, 0x04, + 0xb5, 0xf8, 0x58, 0x24, 0x06, 0x21, 0x80, 0x07, 0x04, 0xd5, 0xb5, 0xf8, + 0x82, 0x00, 0xc0, 0x07, 0x08, 0xbf, 0x02, 0x21, 0x1e, 0x48, 0x20, 0x23, + 0x06, 0x68, 0x02, 0xa8, 0x00, 0x90, 0x28, 0x46, 0xb0, 0x47, 0x06, 0x46, + 0x60, 0x71, 0x00, 0x0e, 0x1a, 0x4f, 0x20, 0x72, 0x30, 0x0c, 0xe0, 0x71, + 0x30, 0x0a, 0xa0, 0x71, 0x72, 0xb6, 0x38, 0x68, 0x40, 0x00, 0x01, 0x30, + 0x38, 0x60, 0x16, 0x48, 0x00, 0x68, 0x80, 0x47, 0x39, 0x68, 0x4f, 0xea, + 0x51, 0x01, 0x39, 0x60, 0x39, 0x68, 0x81, 0xf3, 0x10, 0x88, 0x90, 0xb1, + 0x12, 0x4a, 0x04, 0x21, 0x45, 0x60, 0x01, 0x82, 0x2c, 0x21, 0x01, 0x75, + 0x0e, 0x49, 0x02, 0xea, 0x46, 0x02, 0x02, 0x60, 0x72, 0x00, 0x08, 0x60, + 0x4a, 0x60, 0x0d, 0x49, 0x0a, 0x68, 0xd5, 0xf8, 0xd4, 0x10, 0x90, 0x47, + 0x04, 0xe0, 0x00, 0x20, 0x40, 0xf2, 0x6e, 0x21, 0xd9, 0xf7, 0x84, 0xf8, + 0x28, 0x46, 0x21, 0x46, 0x00, 0xf0, 0xf6, 0xf8, 0xfe, 0xbd, 0x00, 0xbf, + 0xe8, 0xc4, 0x08, 0x00, 0x24, 0x36, 0x01, 0x00, 0xd8, 0xa0, 0x08, 0x00, + 0xa0, 0x52, 0x01, 0x00, 0xfc, 0xff, 0xff, 0x0f, 0xd4, 0xa0, 0x08, 0x00, + 0x10, 0xb5, 0x00, 0xf0, 0xeb, 0xf8, 0x3d, 0x49, 0x3d, 0x4b, 0x09, 0x78, + 0xc1, 0xeb, 0x41, 0x12, 0x53, 0xf8, 0x32, 0x10, 0xb1, 0xf8, 0x82, 0x40, + 0xe4, 0x07, 0x18, 0xbf, 0x00, 0x29, 0x00, 0xd1, 0x10, 0xbd, 0x03, 0xeb, + 0xc2, 0x02, 0x92, 0x68, 0x00, 0x2a, 0xf9, 0xd1, 0xb1, 0xf8, 0xe2, 0x23, + 0x01, 0x32, 0xa1, 0xf8, 0xe2, 0x23, 0x10, 0xbd, 0x70, 0xb5, 0x30, 0x48, + 0x30, 0x4a, 0x00, 0x78, 0xc0, 0xeb, 0x40, 0x11, 0x52, 0xf8, 0x31, 0x40, + 0x64, 0xb3, 0x1a, 0x49, 0x94, 0xf8, 0x88, 0x61, 0x94, 0xf8, 0x9c, 0x52, + 0x18, 0x4a, 0x09, 0x68, 0x02, 0xf8, 0x10, 0x10, 0x17, 0x49, 0x02, 0xeb, + 0x40, 0x00, 0x09, 0x68, 0x41, 0x70, 0x00, 0xf0, 0xbf, 0xf8, 0x94, 0xf8, + 0x88, 0x01, 0x86, 0x42, 0x09, 0xd0, 0x94, 0xf8, 0x35, 0x01, 0x12, 0x49, + 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, 0x40, 0x10, 0x01, 0x6b, 0x01, 0x31, + 0x01, 0x63, 0x94, 0xf8, 0x9c, 0x02, 0x85, 0x42, 0x09, 0xd0, 0x94, 0xf8, + 0x35, 0x01, 0x0b, 0x49, 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, 0x40, 0x10, + 0x41, 0x6b, 0x01, 0x31, 0x41, 0x63, 0x70, 0xbd, 0x00, 0x20, 0x4f, 0xf4, + 0x23, 0x71, 0xbd, 0xe8, 0x70, 0x40, 0xde, 0xf7, 0x7b, 0xbe, 0x00, 0xbf, + 0x34, 0xa1, 0x23, 0x40, 0x48, 0xf1, 0x05, 0x00, 0x30, 0xa1, 0x23, 0x40, + 0x54, 0xf1, 0x05, 0x00, 0x10, 0xb5, 0x00, 0xf0, 0x95, 0xf8, 0x0c, 0x49, + 0x0c, 0x4b, 0x09, 0x78, 0xc1, 0xeb, 0x41, 0x12, 0x53, 0xf8, 0x32, 0x10, + 0xb1, 0xf8, 0x82, 0x40, 0xe4, 0x07, 0x18, 0xbf, 0x00, 0x29, 0x00, 0xd1, + 0x10, 0xbd, 0x03, 0xeb, 0xc2, 0x02, 0x92, 0x68, 0x00, 0x2a, 0xf9, 0xd1, + 0xb1, 0xf8, 0xe2, 0x23, 0x01, 0x32, 0xa1, 0xf8, 0xe2, 0x23, 0x10, 0xbd, + 0x74, 0x87, 0x08, 0x00, 0x0c, 0x6f, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x46, + 0x00, 0x68, 0xb0, 0xf8, 0x40, 0x51, 0x08, 0xf0, 0xc3, 0xf9, 0x20, 0x46, + 0x00, 0xf0, 0x74, 0xf8, 0x20, 0x68, 0xb0, 0xf8, 0x40, 0x01, 0x85, 0x42, + 0x03, 0xd0, 0x02, 0x48, 0xc1, 0x68, 0x01, 0x31, 0xc1, 0x60, 0xb0, 0xbd, + 0xb0, 0xf0, 0x05, 0x00, 0x0d, 0x48, 0x0e, 0x49, 0x11, 0x4a, 0x01, 0x60, + 0x0d, 0x48, 0x0e, 0x49, 0xc1, 0x60, 0x01, 0x60, 0x0d, 0x49, 0x0a, 0x60, + 0x0e, 0x49, 0x11, 0x4a, 0x81, 0x64, 0x0e, 0x49, 0xc1, 0x63, 0x0e, 0x49, + 0x0a, 0x60, 0x0f, 0x49, 0x01, 0x61, 0x41, 0x60, 0x0e, 0x48, 0x0f, 0x49, + 0x40, 0xf8, 0x10, 0x1f, 0x0e, 0x49, 0x41, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0x78, 0xa2, 0x08, 0x00, 0x24, 0x81, 0x04, 0x00, 0x2c, 0xe9, 0x08, 0x00, + 0x81, 0x7d, 0x04, 0x00, 0xbc, 0xb9, 0x08, 0x00, 0x5d, 0x7e, 0x04, 0x00, + 0x19, 0x7f, 0x04, 0x00, 0xdd, 0x7f, 0x04, 0x00, 0x74, 0xa2, 0x08, 0x00, + 0x44, 0x81, 0x04, 0x00, 0x51, 0x7f, 0x04, 0x00, 0x9c, 0x0f, 0x01, 0x00, + 0x0d, 0x79, 0x04, 0x00, 0x1d, 0x80, 0x04, 0x00, 0x47, 0xf2, 0x9b, 0x4c, + 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x47, 0xf6, 0xcb, 0x5c, + 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x48, 0xf2, 0xc7, 0x4c, + 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x49, 0xf2, 0x01, 0x2c, + 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x48, 0xf6, 0xdf, 0x2c, + 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4a, 0xf2, 0x2d, 0x4c, + 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x49, 0xf6, 0xa7, 0x1c, + 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4a, 0xf2, 0xb5, 0x2c, + 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4a, 0xf2, 0xa9, 0x7c, + 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0xc1, 0x8b, 0x0d, 0x10, + 0x09, 0x77, 0x04, 0x00, 0x0f, 0x7d, 0x0d, 0x10, 0x91, 0x77, 0x04, 0x00, + 0xc7, 0x84, 0x0d, 0x10, 0x5f, 0x8c, 0x0d, 0x10, 0xd1, 0x8c, 0x0d, 0x10, + 0x21, 0x00, 0x00, 0x00, 0x09, 0x74, 0x0d, 0x10, 0x09, 0x77, 0x04, 0x00, + 0x0f, 0x7d, 0x0d, 0x10, 0x91, 0x77, 0x04, 0x00, 0xa9, 0x78, 0x04, 0x00, + 0xf3, 0x84, 0x0d, 0x10, 0x91, 0x6a, 0x0f, 0x10, 0x20, 0x00, 0x00, 0x00, + 0x2d, 0xe9, 0xf0, 0x41, 0x04, 0x46, 0xd8, 0xf7, 0x53, 0xff, 0x05, 0x46, + 0x8e, 0x48, 0x90, 0xf8, 0x3e, 0x06, 0x01, 0x28, 0x55, 0xd1, 0x8d, 0x48, + 0x40, 0x79, 0x01, 0x28, 0x51, 0xd1, 0x8c, 0x48, 0x01, 0x68, 0x20, 0x46, + 0x88, 0x47, 0x68, 0xb1, 0x8a, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, + 0xb0, 0xb1, 0x89, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x01, 0x0e, + 0x03, 0x0c, 0x02, 0x0a, 0x06, 0x46, 0x17, 0xe0, 0x20, 0x6a, 0x58, 0xb1, + 0x84, 0x49, 0xb1, 0xf8, 0x1e, 0x15, 0x03, 0x31, 0x21, 0xf0, 0x03, 0x01, + 0x46, 0x18, 0x40, 0x5c, 0x72, 0x78, 0xb3, 0x78, 0xf1, 0x78, 0x03, 0xe0, + 0x00, 0x21, 0x00, 0x23, 0x00, 0x22, 0x00, 0x20, 0x1e, 0x04, 0x46, 0xea, + 0x01, 0x66, 0x46, 0xea, 0x02, 0x26, 0x06, 0x44, 0x2e, 0xb3, 0xdb, 0xb2, + 0xd2, 0xb2, 0xc0, 0xb2, 0x1b, 0x04, 0x43, 0xea, 0x01, 0x61, 0x41, 0xea, + 0x02, 0x21, 0x08, 0x44, 0xc5, 0xf5, 0xa0, 0x71, 0x08, 0x44, 0x20, 0xf0, + 0x70, 0x40, 0xb0, 0xf1, 0x00, 0x6f, 0x14, 0xd9, 0x94, 0xf8, 0x35, 0x01, + 0x70, 0x4b, 0x00, 0xeb, 0x40, 0x02, 0x03, 0xeb, 0x42, 0x12, 0x52, 0xf8, + 0x14, 0x3f, 0x19, 0x44, 0x21, 0xf0, 0x70, 0x41, 0xb1, 0xf1, 0x00, 0x6f, + 0x05, 0xd9, 0x6b, 0x49, 0x15, 0x60, 0x0a, 0x68, 0x94, 0xf9, 0x3a, 0x10, + 0x90, 0x47, 0x94, 0xf8, 0x88, 0x04, 0x80, 0x07, 0x40, 0xf1, 0xbc, 0x80, + 0x94, 0xf8, 0x35, 0x01, 0xe3, 0x49, 0x00, 0xeb, 0xc0, 0x00, 0x01, 0xeb, + 0x40, 0x00, 0x47, 0x78, 0x94, 0xf8, 0xa4, 0x04, 0x41, 0x07, 0x01, 0xd5, + 0x00, 0x07, 0x0f, 0xd5, 0xd6, 0x4e, 0x96, 0xf8, 0x67, 0x02, 0x58, 0xb1, + 0xd8, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x01, 0x28, 0x0d, 0xd1, + 0xd6, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x05, 0x46, 0x08, 0xe0, + 0x00, 0x25, 0x01, 0x2f, 0x4f, 0xf0, 0x00, 0x08, 0x4f, 0xf0, 0x00, 0x06, + 0x18, 0xd0, 0x7e, 0xe0, 0x00, 0x25, 0xd0, 0x48, 0x01, 0x68, 0x04, 0xf1, + 0x20, 0x00, 0x88, 0x47, 0x00, 0xeb, 0x05, 0x08, 0x01, 0x2f, 0x73, 0xd1, + 0x96, 0xf8, 0x68, 0x02, 0x1f, 0xfa, 0x88, 0xf1, 0x81, 0x42, 0x07, 0xd8, + 0x4b, 0x49, 0x94, 0xf8, 0x35, 0x01, 0x01, 0x22, 0x4c, 0x23, 0x0e, 0x68, + 0x00, 0x21, 0xb0, 0x47, 0x94, 0xf8, 0xa4, 0x04, 0x41, 0x07, 0x61, 0xd5, + 0x00, 0x07, 0x5f, 0xd4, 0x45, 0x48, 0x46, 0x49, 0x00, 0x78, 0xc0, 0xeb, + 0x40, 0x10, 0x01, 0xeb, 0xc0, 0x00, 0xb0, 0xf8, 0xdc, 0x00, 0x40, 0x07, + 0x0b, 0xd5, 0x42, 0x48, 0x00, 0x68, 0x90, 0xf8, 0x24, 0x00, 0x01, 0x28, + 0x05, 0xd8, 0x3c, 0x49, 0x94, 0xf8, 0x35, 0x01, 0x01, 0x22, 0x02, 0x23, + 0x39, 0xe0, 0xd4, 0xf8, 0xe0, 0x00, 0x01, 0x30, 0x20, 0xd0, 0xae, 0x48, + 0xb4, 0xf8, 0xfa, 0x24, 0x90, 0xf8, 0x6c, 0x12, 0x90, 0xf8, 0x6d, 0x02, + 0x02, 0xeb, 0x42, 0x02, 0x00, 0xeb, 0x42, 0x00, 0x82, 0xb2, 0x8a, 0x42, + 0x88, 0xbf, 0x08, 0x46, 0xd4, 0xf8, 0x00, 0x15, 0x00, 0xeb, 0x51, 0x00, + 0x86, 0xb2, 0x31, 0x48, 0x00, 0x68, 0x80, 0x47, 0xd4, 0xf8, 0xe0, 0x10, + 0x40, 0x1a, 0xa0, 0xeb, 0x46, 0x00, 0x20, 0xf0, 0x70, 0x40, 0xb0, 0xf1, + 0x00, 0x6f, 0x17, 0xd9, 0x2a, 0x48, 0x00, 0x68, 0x80, 0x47, 0x28, 0x49, + 0x89, 0x68, 0x40, 0x1a, 0x9a, 0x49, 0x91, 0xf8, 0x6e, 0x12, 0xa0, 0xeb, + 0x41, 0x00, 0x20, 0xf0, 0x70, 0x40, 0xb0, 0xf1, 0x00, 0x6f, 0x13, 0xd8, + 0x1e, 0x49, 0x94, 0xf8, 0x35, 0x01, 0x01, 0x22, 0x4d, 0x23, 0x0e, 0x68, + 0x00, 0x21, 0x0a, 0xe0, 0xd8, 0xf7, 0x58, 0xfe, 0x1c, 0x49, 0x01, 0x22, + 0x49, 0x23, 0x48, 0x60, 0x17, 0x48, 0x00, 0x21, 0x06, 0x68, 0x94, 0xf8, + 0x35, 0x01, 0xb0, 0x47, 0x46, 0x46, 0x8f, 0x48, 0x01, 0x68, 0x20, 0x46, + 0x88, 0x47, 0xd4, 0xf8, 0xbc, 0x15, 0x01, 0x28, 0x07, 0xd1, 0x69, 0xb1, + 0x00, 0x2d, 0x18, 0xbf, 0x01, 0x25, 0x81, 0xf8, 0x40, 0x50, 0xbd, 0xe8, + 0xf0, 0x81, 0x29, 0xb1, 0xb0, 0xb2, 0x00, 0x28, 0x18, 0xbf, 0x01, 0x20, + 0x81, 0xf8, 0x40, 0x00, 0xbd, 0xe8, 0xf0, 0x81, 0x64, 0xd4, 0x05, 0x00, + 0x48, 0xdc, 0x05, 0x00, 0x54, 0x9d, 0x08, 0x00, 0x50, 0x9d, 0x08, 0x00, + 0x58, 0x9d, 0x08, 0x00, 0x8c, 0x7e, 0x08, 0x00, 0x54, 0xf1, 0x05, 0x00, + 0x74, 0x9a, 0x08, 0x00, 0x04, 0xa1, 0x08, 0x00, 0x74, 0x87, 0x08, 0x00, + 0x0c, 0x6f, 0x01, 0x00, 0x14, 0xf0, 0x05, 0x00, 0xe0, 0xa0, 0x08, 0x00, + 0x2d, 0xe9, 0xf0, 0x41, 0x04, 0x46, 0x70, 0x48, 0x90, 0xf8, 0xec, 0x12, + 0x00, 0x29, 0x41, 0xd0, 0x6e, 0x49, 0x91, 0xf8, 0xfe, 0x16, 0xe9, 0xb3, + 0x6d, 0x4f, 0x17, 0xf8, 0x01, 0x1f, 0x03, 0x29, 0x38, 0xd1, 0x00, 0xf2, + 0x53, 0x28, 0xd7, 0xf8, 0x07, 0x00, 0x41, 0x1c, 0x05, 0xd1, 0xd7, 0xf8, + 0x0f, 0x00, 0x68, 0x49, 0x08, 0x44, 0x20, 0xf0, 0x70, 0x40, 0x00, 0xf0, + 0x03, 0x01, 0x01, 0x29, 0x88, 0xbf, 0x04, 0x30, 0x46, 0x1a, 0x20, 0x68, + 0x90, 0xf8, 0x88, 0x14, 0x89, 0x07, 0x23, 0xd4, 0x61, 0x68, 0x98, 0xf8, + 0x9c, 0x30, 0x0a, 0x69, 0x92, 0x1b, 0x22, 0xf0, 0x70, 0x42, 0xb2, 0xfb, + 0xf3, 0xf5, 0x05, 0xfb, 0x13, 0x25, 0x15, 0xf0, 0x03, 0x02, 0x1c, 0xbf, + 0xaa, 0x1a, 0x15, 0x1d, 0x49, 0x7f, 0x00, 0x29, 0x5d, 0xd0, 0x01, 0x6a, + 0x31, 0xb9, 0x81, 0x68, 0x21, 0xb9, 0x56, 0x49, 0x09, 0x68, 0x88, 0x47, + 0x00, 0x28, 0x58, 0xd0, 0x08, 0x2d, 0xc0, 0xf0, 0x96, 0x80, 0x14, 0x2d, + 0x55, 0xd3, 0x92, 0xe0, 0xbd, 0xe8, 0xf0, 0x81, 0x4f, 0x49, 0x09, 0x68, + 0x88, 0x47, 0x01, 0x28, 0x05, 0xd1, 0x4e, 0x49, 0x20, 0x68, 0x09, 0x68, + 0x88, 0x47, 0x05, 0x46, 0x00, 0xe0, 0x00, 0x25, 0x4b, 0x48, 0x01, 0x68, + 0x20, 0x68, 0x20, 0x30, 0x88, 0x47, 0x29, 0x18, 0x98, 0xf8, 0x9e, 0x20, + 0x88, 0xb2, 0x90, 0x42, 0x14, 0xd2, 0xd7, 0xf8, 0x07, 0x00, 0x42, 0x1c, + 0x10, 0xd0, 0x98, 0xf8, 0x9c, 0x20, 0x83, 0x18, 0x60, 0x68, 0x00, 0x69, + 0x1b, 0x1a, 0x1b, 0x01, 0x08, 0xd4, 0x83, 0x1b, 0x23, 0xf0, 0x70, 0x43, + 0xb3, 0xfb, 0xf2, 0xf5, 0x05, 0xfb, 0x12, 0x33, 0x14, 0x25, 0x0b, 0xe0, + 0x60, 0x68, 0x98, 0xf8, 0x9c, 0x30, 0x00, 0x69, 0x82, 0x1b, 0x22, 0xf0, + 0x70, 0x42, 0xb2, 0xfb, 0xf3, 0xf5, 0x05, 0xfb, 0x13, 0x23, 0x08, 0x25, + 0x26, 0x68, 0x96, 0xf8, 0xbc, 0x26, 0x01, 0x2a, 0x1c, 0xbf, 0xd7, 0xf8, + 0x0f, 0xc0, 0x1c, 0xf1, 0x01, 0x02, 0x15, 0xd1, 0xc7, 0xf8, 0x0f, 0x00, + 0x98, 0xf8, 0x01, 0x00, 0x32, 0x49, 0x40, 0x22, 0x40, 0xf0, 0x80, 0x00, + 0x4a, 0x77, 0x88, 0x77, 0x43, 0xe0, 0x90, 0xf8, 0xbc, 0x06, 0x01, 0x28, + 0xa6, 0xd0, 0x08, 0x2d, 0x3d, 0xd1, 0x2c, 0x48, 0x81, 0x7f, 0x41, 0xf0, + 0x80, 0x01, 0x37, 0xe0, 0x09, 0x04, 0x30, 0xd0, 0xab, 0x42, 0x14, 0xd0, + 0x08, 0x2b, 0x2c, 0xd3, 0x96, 0xf8, 0x35, 0x11, 0x22, 0x4a, 0x01, 0xeb, + 0xc1, 0x01, 0x02, 0xeb, 0x41, 0x01, 0x49, 0x78, 0x01, 0x29, 0x08, 0xd0, + 0x1f, 0x4a, 0xa0, 0xeb, 0x0c, 0x01, 0x11, 0x44, 0x21, 0xf0, 0x70, 0x41, + 0xb1, 0xf1, 0x00, 0x6f, 0x19, 0xd8, 0xd7, 0xf8, 0x0b, 0x10, 0x42, 0x1a, + 0x0c, 0x32, 0x22, 0xf0, 0x70, 0x42, 0xb2, 0xf1, 0x00, 0x6f, 0x07, 0xd8, + 0x4a, 0x1c, 0x05, 0xd0, 0x09, 0x1a, 0x21, 0xf0, 0x70, 0x41, 0xb1, 0xf1, + 0x00, 0x6f, 0x08, 0xd9, 0x13, 0x4a, 0xa0, 0xeb, 0x0c, 0x01, 0x11, 0x44, + 0x21, 0xf0, 0x70, 0x41, 0xb1, 0xf1, 0x00, 0x6f, 0xb6, 0xd9, 0x10, 0x48, + 0x3f, 0x21, 0x41, 0x77, 0x98, 0xf8, 0x00, 0x10, 0x81, 0x77, 0x20, 0x68, + 0x00, 0x21, 0x80, 0xf8, 0xbc, 0x16, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0xbf, + 0x8c, 0x7e, 0x08, 0x00, 0x38, 0x21, 0x01, 0x00, 0x50, 0x2e, 0x01, 0x00, + 0xf8, 0xff, 0xff, 0x0f, 0x4c, 0x9d, 0x08, 0x00, 0x50, 0x9d, 0x08, 0x00, + 0x28, 0x9d, 0x08, 0x00, 0x44, 0x28, 0x01, 0x00, 0xe0, 0xff, 0xff, 0x0f, + 0xe8, 0xff, 0xff, 0x0f, 0xfc, 0x20, 0x01, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, + 0xdf, 0xf8, 0x68, 0x84, 0x04, 0x46, 0xdf, 0xf8, 0x60, 0x14, 0xd4, 0xf8, + 0x0c, 0x35, 0xb8, 0xf8, 0x76, 0x20, 0x91, 0xf8, 0x67, 0x02, 0x01, 0xf2, + 0x33, 0x2b, 0x93, 0x42, 0x07, 0xd9, 0x07, 0x46, 0x00, 0x28, 0x18, 0xbf, + 0x01, 0x3f, 0x9b, 0xf8, 0x3e, 0x60, 0x35, 0x46, 0x04, 0xe0, 0x91, 0xf8, + 0x6a, 0x52, 0xb1, 0xf8, 0x62, 0x62, 0x07, 0x46, 0xdf, 0xf8, 0x34, 0xa4, + 0x9a, 0xf8, 0x79, 0x10, 0x0c, 0x29, 0x01, 0xd0, 0x0a, 0x29, 0x0b, 0xd1, + 0xdf, 0xf8, 0x28, 0x14, 0x09, 0x78, 0x01, 0x29, 0x06, 0xd1, 0x00, 0x28, + 0x18, 0xbf, 0x02, 0x38, 0x9b, 0xf8, 0x3e, 0x60, 0x07, 0x46, 0x35, 0x46, + 0xdf, 0xf8, 0x14, 0x04, 0x00, 0x68, 0x80, 0x47, 0x81, 0x46, 0xd4, 0xf8, + 0x88, 0x04, 0x81, 0x07, 0x54, 0xd4, 0xbb, 0xf8, 0x31, 0x50, 0x00, 0x02, + 0x58, 0xbf, 0xa0, 0x25, 0x00, 0x26, 0xd4, 0xf8, 0xd4, 0x00, 0x40, 0x7f, + 0x48, 0xb1, 0x94, 0xf8, 0x88, 0x04, 0x80, 0x07, 0x44, 0xbf, 0x94, 0xf8, + 0xa4, 0x04, 0x5f, 0xea, 0x40, 0x71, 0x00, 0xf1, 0xe0, 0x80, 0x5a, 0x20, + 0x8b, 0xf8, 0x00, 0x00, 0x20, 0x6a, 0x60, 0xb1, 0xdf, 0xf8, 0x00, 0x14, + 0x09, 0x68, 0x88, 0x47, 0xa9, 0xb2, 0xa9, 0xeb, 0x41, 0x01, 0x08, 0x1a, + 0x20, 0xf0, 0x70, 0x40, 0xb0, 0xf1, 0x00, 0x6f, 0x4c, 0xd9, 0xdf, 0xf8, + 0xc8, 0x03, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x01, 0x28, 0x18, 0xd1, + 0xdf, 0xf8, 0xdc, 0x03, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x9a, 0xf8, + 0x79, 0x10, 0x31, 0xb9, 0x98, 0xf8, 0x79, 0x10, 0x49, 0x07, 0x44, 0xbf, + 0x20, 0x30, 0x20, 0xf0, 0x70, 0x40, 0xa9, 0xb2, 0xa9, 0xeb, 0x41, 0x01, + 0x08, 0x1a, 0x20, 0xf0, 0x70, 0x40, 0xb0, 0xf1, 0x00, 0x6f, 0x40, 0xf2, + 0x90, 0x80, 0xd4, 0xe9, 0x35, 0x10, 0x49, 0x7f, 0x00, 0x29, 0x5f, 0xd0, + 0xd4, 0xf8, 0xe4, 0x70, 0xc1, 0x1b, 0x21, 0xf0, 0x70, 0x41, 0xb1, 0xf1, + 0x00, 0x6f, 0x88, 0xbf, 0x07, 0x46, 0x56, 0xe0, 0x94, 0xf8, 0xa4, 0x04, + 0x10, 0xf0, 0x04, 0x01, 0x01, 0xd0, 0x02, 0x07, 0x25, 0xd5, 0x9b, 0xf8, + 0x33, 0x20, 0x01, 0x2a, 0x20, 0xd1, 0x3a, 0x06, 0x1e, 0xd0, 0x20, 0x78, + 0x50, 0xb1, 0x9a, 0xf8, 0x7a, 0x00, 0x00, 0x28, 0x00, 0xf0, 0xe7, 0x80, + 0xcd, 0x48, 0x90, 0xf8, 0x4d, 0x00, 0x02, 0x28, 0xc0, 0xf0, 0xe1, 0x80, + 0x05, 0xeb, 0x85, 0x00, 0xc5, 0x08, 0x06, 0xe1, 0xd8, 0xf7, 0x70, 0xfc, + 0xd0, 0x49, 0x01, 0x22, 0x19, 0x23, 0x01, 0x26, 0x88, 0x60, 0xcb, 0x48, + 0x01, 0x21, 0x05, 0x68, 0x94, 0xf8, 0x35, 0x01, 0xa8, 0x47, 0x5d, 0xe0, + 0xd9, 0xb1, 0x00, 0x07, 0x19, 0xd4, 0x94, 0xf8, 0x35, 0x01, 0xc4, 0x4a, + 0x00, 0xeb, 0xc0, 0x01, 0x02, 0xeb, 0x41, 0x01, 0x4e, 0x78, 0x01, 0x2e, + 0x7a, 0xd1, 0xd4, 0xf8, 0xfc, 0x04, 0x41, 0x1c, 0x07, 0xd0, 0xa9, 0xeb, + 0x00, 0x00, 0x20, 0xf0, 0x70, 0x40, 0x0d, 0x28, 0x28, 0xbf, 0xc4, 0xf8, + 0x00, 0x05, 0xc4, 0xf8, 0xfc, 0x94, 0x01, 0x26, 0x40, 0xe0, 0xb4, 0xf8, + 0x3e, 0x04, 0x81, 0x04, 0x3f, 0xd4, 0x10, 0xf4, 0x90, 0x5f, 0x0c, 0xbf, + 0x06, 0xeb, 0x86, 0x00, 0xc6, 0xeb, 0xc6, 0x00, 0xc5, 0x08, 0x37, 0xe0, + 0x07, 0x46, 0xa8, 0xb2, 0xa9, 0xeb, 0x40, 0x00, 0xc0, 0x1b, 0x20, 0xf0, + 0x70, 0x40, 0xb0, 0xf1, 0x00, 0x6f, 0x19, 0xd9, 0xb4, 0x48, 0x90, 0xf8, + 0x20, 0x00, 0xc0, 0x07, 0x14, 0xd1, 0xb3, 0x48, 0x01, 0x68, 0x20, 0x46, + 0x88, 0x47, 0xf8, 0xb1, 0xb1, 0x49, 0xa9, 0xeb, 0x07, 0x00, 0x08, 0x44, + 0x20, 0xf0, 0x70, 0x40, 0xb0, 0xf1, 0x00, 0x6f, 0x16, 0xd8, 0xa4, 0x49, + 0x94, 0xf8, 0x35, 0x01, 0x01, 0x26, 0x01, 0x22, 0x1b, 0x23, 0x0c, 0xe0, + 0xa0, 0x49, 0x94, 0xf8, 0x35, 0x01, 0x01, 0x26, 0x01, 0x22, 0x1e, 0x23, + 0x05, 0xe0, 0x9d, 0x49, 0x94, 0xf8, 0x35, 0x01, 0x01, 0x26, 0x01, 0x22, + 0x1d, 0x23, 0x0c, 0x68, 0x01, 0x21, 0xa0, 0x47, 0x30, 0x46, 0xbd, 0xe8, + 0xf8, 0x8f, 0x35, 0x46, 0xd4, 0xf8, 0xbc, 0x05, 0x00, 0x28, 0x3f, 0xf4, + 0x1d, 0xaf, 0x90, 0xf8, 0x3e, 0x00, 0x01, 0x28, 0x7f, 0xf4, 0x18, 0xaf, + 0xa8, 0xb2, 0x40, 0x00, 0x10, 0xfa, 0x85, 0xf0, 0xc0, 0xf3, 0x9c, 0x05, + 0x10, 0xe7, 0x00, 0x07, 0x3f, 0xf5, 0x1d, 0xaf, 0xe0, 0x78, 0x01, 0x28, + 0x7f, 0xf4, 0x19, 0xaf, 0xd4, 0xf8, 0xdc, 0x00, 0x8d, 0x49, 0xa9, 0xeb, + 0x00, 0x00, 0x08, 0x44, 0x20, 0xf0, 0x70, 0x40, 0xb0, 0xf1, 0x00, 0x6f, + 0x7f, 0xf6, 0x0d, 0xaf, 0xdd, 0x20, 0x0b, 0xe7, 0x00, 0x21, 0x4f, 0xf0, + 0xff, 0x32, 0x9b, 0xf8, 0x38, 0x30, 0xc4, 0xf8, 0x00, 0x15, 0xd4, 0xf8, + 0xdc, 0x10, 0xc4, 0xf8, 0xfc, 0x24, 0xc4, 0xf8, 0xe0, 0x20, 0xa9, 0xeb, + 0x01, 0x02, 0xa2, 0xeb, 0x43, 0x02, 0x22, 0xf0, 0x70, 0x42, 0xb2, 0xf1, + 0x00, 0x6f, 0xbf, 0xd8, 0x7b, 0x4d, 0x9b, 0xf8, 0x3c, 0x70, 0x55, 0xf8, + 0x04, 0x3f, 0xa9, 0xeb, 0x03, 0x03, 0xa3, 0xeb, 0x47, 0x03, 0x23, 0xf0, + 0x70, 0x43, 0xb3, 0xf1, 0x00, 0x6f, 0x2c, 0xd9, 0x00, 0x29, 0xaf, 0xd0, + 0xb2, 0xf1, 0x00, 0x6f, 0xac, 0xd8, 0x28, 0x68, 0x9b, 0xf8, 0x3c, 0x70, + 0xa9, 0xeb, 0x00, 0x08, 0x00, 0xf0, 0xba, 0xfa, 0xc1, 0x17, 0x00, 0xeb, + 0x51, 0x71, 0x21, 0xf0, 0x07, 0x01, 0x40, 0x1a, 0x38, 0x44, 0xa8, 0xeb, + 0x40, 0x00, 0x20, 0xf0, 0x70, 0x40, 0xb0, 0xf1, 0x00, 0x6f, 0x97, 0xd8, + 0xd8, 0xf7, 0x9c, 0xfb, 0x68, 0x60, 0x63, 0x48, 0x01, 0x21, 0x01, 0x22, + 0x23, 0x23, 0x01, 0x26, 0x2b, 0xe7, 0xb4, 0xf8, 0x3e, 0x04, 0x81, 0x04, + 0x18, 0xd4, 0x10, 0xf4, 0x90, 0x5f, 0x0d, 0xd0, 0xc5, 0xeb, 0xc5, 0x00, + 0x11, 0xe0, 0x5b, 0x49, 0x01, 0x22, 0x1a, 0x23, 0x01, 0x26, 0x0c, 0x68, + 0x01, 0x21, 0xa0, 0x47, 0xd8, 0xf7, 0x82, 0xfb, 0x68, 0x60, 0x79, 0xe7, + 0x9b, 0xf8, 0x34, 0x70, 0x05, 0xeb, 0x85, 0x00, 0x00, 0x2f, 0x18, 0xbf, + 0x01, 0x3f, 0xc5, 0x08, 0xd4, 0xf8, 0xbc, 0x05, 0x48, 0xb1, 0x90, 0xf8, + 0x3e, 0x00, 0x01, 0x28, 0x05, 0xd1, 0xa8, 0xb2, 0x40, 0x00, 0x10, 0xfa, + 0x85, 0xf0, 0xc0, 0xf3, 0x9c, 0x05, 0x9b, 0xf8, 0xb9, 0x00, 0x58, 0xb1, + 0x44, 0x48, 0x90, 0xf8, 0xfe, 0x06, 0x38, 0xb1, 0x43, 0x48, 0x40, 0x78, + 0x03, 0x28, 0x03, 0xd1, 0xbb, 0xf8, 0xc3, 0x50, 0x9b, 0xf8, 0xbf, 0x70, + 0x40, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x01, 0x28, 0x17, 0xd1, + 0xf2, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x06, 0x46, 0x9b, 0xf8, + 0xb9, 0x00, 0x68, 0xb1, 0xf3, 0x48, 0x90, 0xf8, 0xfe, 0x06, 0x48, 0xb1, + 0x36, 0x48, 0x40, 0x78, 0x03, 0x28, 0x05, 0xd1, 0x9b, 0xf8, 0xc0, 0x00, + 0x86, 0x42, 0x28, 0xbf, 0x02, 0x2e, 0x4a, 0xd2, 0xb0, 0x46, 0x01, 0xe0, + 0x4f, 0xf0, 0x00, 0x08, 0xe7, 0x48, 0x01, 0x68, 0x04, 0xf1, 0x20, 0x00, + 0x88, 0x47, 0x08, 0xeb, 0x00, 0x01, 0x94, 0xf8, 0x35, 0x01, 0xe7, 0x4b, + 0x00, 0xeb, 0xc0, 0x02, 0x03, 0xeb, 0x42, 0x02, 0x56, 0x78, 0x01, 0x2e, + 0x24, 0xd1, 0x2c, 0x4a, 0x2c, 0x4b, 0x12, 0x78, 0xc2, 0xeb, 0x42, 0x12, + 0x53, 0xf8, 0x32, 0x60, 0xa6, 0x42, 0x0a, 0xd1, 0xd4, 0xf8, 0xd4, 0x60, + 0x76, 0x7f, 0x36, 0xb9, 0x03, 0xeb, 0xc2, 0x02, 0xd2, 0xf8, 0xc0, 0x20, + 0x52, 0x79, 0x02, 0x2a, 0x1c, 0xd2, 0x9b, 0xf8, 0x35, 0x20, 0x89, 0xb2, + 0x91, 0x42, 0x8f, 0xbf, 0x01, 0x26, 0x1e, 0x49, 0x0f, 0x68, 0x00, 0x26, + 0x9f, 0xbf, 0x00, 0x21, 0x01, 0x22, 0x4b, 0x23, 0xb8, 0x47, 0xdf, 0xf8, + 0x40, 0x80, 0x26, 0xe6, 0xfa, 0xb2, 0x89, 0xb2, 0xdf, 0xf8, 0x34, 0x80, + 0x91, 0x42, 0xff, 0xf4, 0x20, 0xae, 0x15, 0x49, 0x01, 0x26, 0x01, 0x22, + 0x18, 0x23, 0xf0, 0xe6, 0x12, 0x49, 0x01, 0x26, 0x01, 0x22, 0x17, 0x23, + 0xeb, 0xe6, 0x4f, 0xf0, 0x01, 0x08, 0x0d, 0x48, 0x01, 0x68, 0x20, 0x46, + 0x88, 0x47, 0x01, 0x3e, 0xb0, 0xb2, 0x01, 0x28, 0xf7, 0xd8, 0xad, 0xe7, + 0x8c, 0x7e, 0x08, 0x00, 0x40, 0x86, 0x08, 0x00, 0x4c, 0x49, 0x01, 0x00, + 0x81, 0x4a, 0x01, 0x00, 0xe0, 0xa0, 0x08, 0x00, 0x18, 0x74, 0x01, 0x00, + 0x38, 0x21, 0x01, 0x00, 0x50, 0x2e, 0x01, 0x00, 0x4c, 0x9d, 0x08, 0x00, + 0xe8, 0xaf, 0x08, 0x00, 0x44, 0x28, 0x01, 0x00, 0x04, 0xa1, 0x08, 0x00, + 0x74, 0x87, 0x08, 0x00, 0x0c, 0x6f, 0x01, 0x00, 0x14, 0xf0, 0x05, 0x00, + 0xf8, 0xff, 0xff, 0x0f, 0x0c, 0x9d, 0x08, 0x00, 0x58, 0x9d, 0x08, 0x00, + 0xd8, 0x5d, 0x01, 0x00, 0xcc, 0xba, 0x08, 0x00, 0x60, 0xff, 0xff, 0x0f, + 0x2d, 0xe9, 0xf8, 0x4f, 0x45, 0x68, 0x04, 0x46, 0x90, 0xf8, 0x12, 0x80, + 0x95, 0xf8, 0xc0, 0x00, 0x02, 0x28, 0x1b, 0xd1, 0x9e, 0x48, 0x07, 0x21, + 0x90, 0xf8, 0x58, 0x03, 0xa0, 0x74, 0xe2, 0x7c, 0x40, 0x45, 0x02, 0xf0, + 0xfb, 0x02, 0xe2, 0x74, 0x0e, 0xd0, 0x8d, 0xf8, 0x01, 0x00, 0x20, 0x7d, + 0x00, 0x22, 0x8d, 0xf8, 0x02, 0x10, 0x69, 0x46, 0x8d, 0xf8, 0x03, 0x20, + 0x8d, 0xf8, 0x00, 0x00, 0x9f, 0x48, 0x02, 0x68, 0x15, 0x20, 0x90, 0x47, + 0xbd, 0xe8, 0xf8, 0x8f, 0xd5, 0xf8, 0xd0, 0x00, 0x00, 0x78, 0x02, 0x28, + 0x17, 0xd2, 0xb5, 0xf8, 0x82, 0x10, 0xc8, 0x04, 0x3f, 0xd4, 0x8d, 0x48, + 0xb0, 0xf8, 0x7a, 0x10, 0xd5, 0xf8, 0xc8, 0x00, 0x42, 0x18, 0x8b, 0x49, + 0x89, 0x69, 0x09, 0x69, 0x52, 0x1a, 0x22, 0xf0, 0x70, 0x42, 0xb2, 0xf1, + 0x00, 0x6f, 0x4f, 0xd9, 0x84, 0x48, 0x0d, 0x21, 0x90, 0xf8, 0x5b, 0x03, + 0xca, 0xe7, 0x33, 0xd1, 0x84, 0x48, 0xd5, 0xf8, 0xc8, 0x70, 0x01, 0x68, + 0x28, 0x46, 0x88, 0x47, 0x4f, 0xea, 0x17, 0x69, 0x4f, 0xea, 0x17, 0x4a, + 0x4f, 0xea, 0x17, 0x2b, 0x00, 0x28, 0x4c, 0xd0, 0x7e, 0x4e, 0x28, 0x46, + 0x31, 0x68, 0x88, 0x47, 0x60, 0xb1, 0x7d, 0x48, 0x01, 0x68, 0x28, 0x46, + 0x88, 0x47, 0xd5, 0xf8, 0x10, 0x15, 0x0f, 0x18, 0xc7, 0xf3, 0x03, 0x69, + 0x4f, 0xea, 0x17, 0x4a, 0x4f, 0xea, 0x17, 0x2b, 0x31, 0x68, 0x28, 0x46, + 0x88, 0x47, 0x06, 0x46, 0x75, 0x48, 0x01, 0x68, 0x05, 0xf1, 0x20, 0x00, + 0x88, 0x47, 0x30, 0x44, 0x52, 0xe0, 0x6c, 0x48, 0x21, 0xf4, 0x80, 0x51, + 0xa5, 0xf8, 0x82, 0x10, 0x36, 0x21, 0x90, 0xf8, 0x93, 0x03, 0x95, 0xe7, + 0x69, 0x49, 0xd5, 0xf8, 0xc8, 0x00, 0x89, 0x69, 0x09, 0x69, 0x40, 0x1a, + 0x20, 0xf0, 0x70, 0x40, 0xb0, 0xf1, 0x00, 0x6f, 0x62, 0x48, 0x9d, 0xbf, + 0x90, 0xf8, 0x59, 0x03, 0xa0, 0x74, 0x0c, 0x21, 0x90, 0xf8, 0x5a, 0x03, + 0x84, 0xbf, 0xa0, 0x74, 0x0b, 0x21, 0x80, 0xe7, 0x40, 0x1a, 0x20, 0xf0, + 0x70, 0x40, 0xb0, 0xf1, 0x00, 0x6f, 0x5a, 0x48, 0x9d, 0xbf, 0x90, 0xf8, + 0x59, 0x03, 0xa0, 0x74, 0x0f, 0x21, 0x90, 0xf8, 0x5a, 0x03, 0x84, 0xbf, + 0xa0, 0x74, 0x0e, 0x21, 0x6f, 0xe7, 0x28, 0x46, 0x50, 0xf8, 0x20, 0x1f, + 0xd9, 0xb1, 0x52, 0x4a, 0xb2, 0xf8, 0x1e, 0x25, 0x03, 0x32, 0x22, 0xf0, + 0x03, 0x02, 0x8b, 0x18, 0x89, 0x5c, 0x5a, 0x78, 0x9e, 0x78, 0xdb, 0x78, + 0x41, 0xea, 0x02, 0x21, 0xd5, 0xf8, 0x10, 0x25, 0x41, 0xea, 0x06, 0x41, + 0x41, 0xea, 0x03, 0x61, 0x11, 0x44, 0x21, 0xf0, 0x70, 0x47, 0x4f, 0xea, + 0x17, 0x69, 0x4f, 0xea, 0x17, 0x4a, 0x4f, 0xea, 0x17, 0x2b, 0x4a, 0x49, + 0x09, 0x68, 0x88, 0x47, 0x4f, 0xea, 0x09, 0x62, 0x4f, 0xea, 0x0b, 0x21, + 0xdf, 0xf8, 0x04, 0xb1, 0xdf, 0xf8, 0x04, 0x91, 0x6a, 0xf3, 0x17, 0x42, + 0x89, 0xb2, 0x0a, 0x44, 0xf9, 0xb2, 0x57, 0x18, 0xbb, 0xf8, 0x78, 0x10, + 0x7a, 0x18, 0xd9, 0xf8, 0x18, 0x10, 0x09, 0x69, 0x51, 0x1a, 0x21, 0xf0, + 0x70, 0x41, 0xb1, 0xf1, 0x00, 0x6f, 0x18, 0xd8, 0xdf, 0xf8, 0xf0, 0xa0, + 0x06, 0x46, 0xda, 0xf8, 0x00, 0x10, 0x88, 0x47, 0x32, 0x46, 0xa8, 0xb1, + 0x39, 0x48, 0x90, 0xf8, 0x79, 0x00, 0x0c, 0x28, 0x0b, 0xd0, 0xd9, 0xf8, + 0x18, 0x10, 0xbb, 0xf8, 0x7c, 0x00, 0x09, 0x69, 0x38, 0x44, 0x40, 0x1a, + 0x20, 0xf0, 0x70, 0x40, 0xb0, 0xf1, 0x00, 0x6f, 0x04, 0xd9, 0x29, 0x48, + 0x08, 0x21, 0x90, 0xf8, 0x57, 0x03, 0x13, 0xe7, 0x10, 0x06, 0x18, 0xd0, + 0x2e, 0x48, 0x90, 0xf8, 0x01, 0x17, 0x0a, 0x29, 0x13, 0xd1, 0x90, 0xf8, + 0x34, 0x12, 0x01, 0x29, 0x0f, 0xd1, 0x95, 0xf8, 0x35, 0x11, 0x2a, 0x4a, + 0x01, 0xeb, 0xc1, 0x01, 0x02, 0xeb, 0x41, 0x01, 0x49, 0x78, 0x01, 0x29, + 0x05, 0xd1, 0x90, 0xf8, 0x02, 0x07, 0x10, 0xb1, 0x1a, 0x48, 0x42, 0x21, + 0xe1, 0xe7, 0xd9, 0xf8, 0x18, 0x00, 0x00, 0x69, 0x38, 0x1a, 0x20, 0xf0, + 0x70, 0x40, 0xb0, 0xf1, 0x00, 0x6f, 0x0f, 0xd9, 0xda, 0xf8, 0x00, 0x00, + 0x80, 0x47, 0x01, 0x28, 0x12, 0x48, 0x1d, 0xbf, 0x90, 0xf8, 0x56, 0x03, + 0xa0, 0x74, 0x09, 0x21, 0x90, 0xf8, 0x95, 0x03, 0x04, 0xbf, 0xa0, 0x74, + 0x37, 0x21, 0xe0, 0xe6, 0x17, 0x48, 0x90, 0xf8, 0x4d, 0x00, 0x02, 0x28, + 0x01, 0xd3, 0x28, 0x6a, 0x48, 0xb9, 0x95, 0xf8, 0x35, 0x01, 0x12, 0x49, + 0x00, 0xeb, 0xc0, 0x00, 0x01, 0xeb, 0x40, 0x00, 0x40, 0x78, 0x01, 0x28, + 0x02, 0xd1, 0x28, 0x20, 0x41, 0x21, 0xcb, 0xe6, 0x02, 0x48, 0x0a, 0x21, + 0x90, 0xf8, 0x55, 0x03, 0xc6, 0xe6, 0x00, 0xbf, 0x8c, 0x7e, 0x08, 0x00, + 0xe8, 0x65, 0x08, 0x00, 0xfc, 0x73, 0x01, 0x00, 0x54, 0x9d, 0x08, 0x00, + 0x50, 0x9d, 0x08, 0x00, 0x58, 0x9d, 0x08, 0x00, 0x28, 0x9d, 0x08, 0x00, + 0x74, 0xcf, 0x08, 0x00, 0x4c, 0x49, 0x01, 0x00, 0x38, 0x21, 0x01, 0x00, + 0x44, 0x28, 0x01, 0x00, 0x18, 0x74, 0x01, 0x00, 0x1c, 0xa1, 0x08, 0x00, + 0x10, 0xb5, 0x04, 0x46, 0x00, 0xf0, 0x6e, 0xf8, 0xc0, 0xb1, 0x94, 0xf8, + 0xa4, 0x14, 0x4a, 0x07, 0x01, 0xd5, 0x09, 0x07, 0x12, 0xd5, 0xb4, 0xf8, + 0x3e, 0x14, 0x89, 0x07, 0x0e, 0xd5, 0x90, 0xf8, 0x20, 0x10, 0x01, 0xf0, + 0x0f, 0x01, 0x03, 0x29, 0x08, 0xd1, 0x81, 0x8a, 0x31, 0xb1, 0x21, 0x78, + 0x03, 0x4a, 0x51, 0x5c, 0x41, 0xf0, 0x04, 0x01, 0x80, 0xf8, 0x20, 0x10, + 0x10, 0xbd, 0x00, 0xbf, 0xfe, 0xca, 0x0a, 0x10, 0xa0, 0xb1, 0xb0, 0xb5, + 0x90, 0xf8, 0x8b, 0x51, 0x04, 0x46, 0x00, 0xf0, 0x4f, 0xf8, 0x94, 0xf8, + 0x8b, 0x01, 0x85, 0x42, 0x09, 0xd0, 0x94, 0xf8, 0x35, 0x01, 0x07, 0x49, + 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, 0x40, 0x10, 0x01, 0x6c, 0x01, 0x31, + 0x01, 0x64, 0xb0, 0xbd, 0x00, 0x20, 0x40, 0xf2, 0x1b, 0x51, 0xdd, 0xf7, + 0x77, 0xbf, 0x00, 0xbf, 0x54, 0xf1, 0x05, 0x00, 0x09, 0x48, 0x0a, 0x49, + 0x01, 0x60, 0x0a, 0x48, 0x0a, 0x49, 0x01, 0x60, 0x0a, 0x48, 0x0b, 0x49, + 0x01, 0x60, 0x0b, 0x48, 0x0b, 0x49, 0xc0, 0xf8, 0x1c, 0x11, 0x0b, 0x48, + 0x0b, 0x49, 0x81, 0x60, 0x0b, 0x48, 0x0c, 0x49, 0x01, 0x60, 0x70, 0x47, + 0xac, 0xe2, 0x08, 0x00, 0xe1, 0x83, 0x04, 0x00, 0x58, 0xdc, 0x08, 0x00, + 0x65, 0x81, 0x04, 0x00, 0xa8, 0xe2, 0x08, 0x00, 0xd5, 0x85, 0x04, 0x00, + 0x98, 0xdf, 0x08, 0x00, 0x95, 0x8a, 0x04, 0x00, 0xc0, 0xe2, 0x08, 0x00, + 0x59, 0x8d, 0x04, 0x00, 0xd4, 0xe2, 0x08, 0x00, 0x9d, 0x8d, 0x04, 0x00, + 0x4a, 0xf2, 0x0d, 0x5c, 0xc1, 0xf2, 0x12, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x45, 0xf2, 0x6d, 0x3c, 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x47, 0xf2, 0x85, 0x1c, 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x60, 0x49, 0x91, 0xf8, 0x32, 0x10, 0x02, 0x29, 0x0b, 0xd1, 0x0e, 0x49, + 0x0e, 0x4a, 0x09, 0x78, 0x01, 0xeb, 0x01, 0x11, 0x02, 0xeb, 0xc1, 0x01, + 0x0c, 0x4a, 0x09, 0x69, 0x12, 0x68, 0x91, 0x42, 0x01, 0xd0, 0x00, 0xf0, + 0xc9, 0xb8, 0x0a, 0x49, 0x0a, 0x6a, 0x01, 0x68, 0x8a, 0x1a, 0x22, 0xf0, + 0x70, 0x42, 0xb2, 0xf1, 0x00, 0x6f, 0x82, 0xbf, 0x04, 0x31, 0x21, 0xf0, + 0x70, 0x41, 0x01, 0x60, 0x00, 0xf0, 0xba, 0xb8, 0x74, 0x87, 0x08, 0x00, + 0xfc, 0x6d, 0x01, 0x00, 0x10, 0xe4, 0x08, 0x00, 0xfc, 0x70, 0x01, 0x00, + 0x2d, 0xe9, 0xf8, 0x4f, 0x04, 0x46, 0x00, 0xf0, 0xb3, 0xf8, 0xd4, 0xf8, + 0x88, 0x00, 0x41, 0xb2, 0x00, 0x29, 0x00, 0xf1, 0x89, 0x80, 0x00, 0x01, + 0x00, 0xf1, 0x86, 0x80, 0x43, 0x48, 0x00, 0x68, 0x80, 0x47, 0xdf, 0xf8, + 0x0c, 0x91, 0x80, 0x46, 0x43, 0x4f, 0x72, 0xb6, 0x59, 0xf8, 0x0c, 0x0f, + 0xd9, 0xf8, 0x04, 0x10, 0x02, 0x46, 0x02, 0xf8, 0x04, 0x1f, 0x0b, 0x0e, + 0xd3, 0x70, 0x0b, 0x0c, 0x09, 0x0a, 0x41, 0x71, 0x93, 0x70, 0x01, 0x0e, + 0xd9, 0xf8, 0x04, 0x20, 0xd1, 0x70, 0x01, 0x0c, 0x10, 0x70, 0x91, 0x70, + 0x01, 0x0a, 0x37, 0x48, 0x51, 0x70, 0x81, 0x6b, 0x0a, 0x78, 0x4b, 0x78, + 0x8c, 0x78, 0xcd, 0x78, 0x44, 0xea, 0x05, 0x24, 0x42, 0xea, 0x03, 0x22, + 0x4f, 0xea, 0x19, 0x23, 0x4f, 0xea, 0x19, 0x45, 0x42, 0xea, 0x04, 0x42, + 0x4f, 0xea, 0x19, 0x64, 0xc9, 0xf8, 0x00, 0x20, 0x53, 0x71, 0x02, 0xf8, + 0x04, 0x9f, 0xd4, 0x70, 0x95, 0x70, 0x3a, 0x68, 0x52, 0x00, 0x01, 0x32, + 0x3a, 0x60, 0x8d, 0x70, 0x4b, 0x70, 0x81, 0xf8, 0x00, 0x90, 0xcc, 0x70, + 0x00, 0xf1, 0x34, 0x04, 0xc9, 0xf8, 0x04, 0x10, 0x86, 0x6b, 0xa6, 0x42, + 0x38, 0xd0, 0xdf, 0xf8, 0x90, 0xa0, 0x4f, 0xf0, 0x00, 0x0b, 0xb0, 0x69, + 0x00, 0x78, 0x05, 0x28, 0x09, 0xd0, 0x21, 0x28, 0x21, 0xd1, 0xb9, 0xf8, + 0x0c, 0x00, 0x08, 0xeb, 0x40, 0x00, 0x20, 0xf0, 0x70, 0x40, 0x30, 0x61, + 0x19, 0xe0, 0x72, 0xb6, 0x38, 0x68, 0x40, 0x00, 0x01, 0x30, 0x38, 0x60, + 0xda, 0xf8, 0x00, 0x50, 0x5d, 0xb1, 0x18, 0x48, 0x01, 0x68, 0x28, 0x46, + 0x88, 0x47, 0x28, 0x7d, 0xc5, 0xf8, 0x10, 0xb0, 0xca, 0xf8, 0x00, 0xb0, + 0x85, 0xf8, 0x14, 0xb0, 0xa8, 0x75, 0x38, 0x68, 0x40, 0x08, 0x38, 0x60, + 0x38, 0x68, 0x80, 0xf3, 0x10, 0x88, 0x16, 0xf8, 0x04, 0x0f, 0x71, 0x78, + 0xb2, 0x78, 0xf3, 0x78, 0x40, 0xea, 0x01, 0x20, 0x42, 0xea, 0x03, 0x21, + 0x40, 0xea, 0x01, 0x46, 0xa6, 0x42, 0xca, 0xd1, 0x38, 0x68, 0x40, 0x08, + 0x38, 0x60, 0x38, 0x68, 0x80, 0xf3, 0x10, 0x88, 0xbd, 0xe8, 0xf8, 0x8f, + 0xe0, 0xa0, 0x08, 0x00, 0x7c, 0x5c, 0x01, 0x00, 0x18, 0x74, 0x01, 0x00, + 0x24, 0x36, 0x01, 0x00, 0x24, 0x5c, 0x01, 0x00, 0xc8, 0xa0, 0x08, 0x00, + 0x03, 0x48, 0x04, 0x49, 0x01, 0x60, 0x04, 0x48, 0x04, 0x49, 0xc0, 0xf8, + 0xb8, 0x10, 0x70, 0x47, 0x18, 0xaa, 0x08, 0x00, 0xa9, 0x8e, 0x04, 0x00, + 0x98, 0xdf, 0x08, 0x00, 0x55, 0x8e, 0x04, 0x00, 0x4c, 0xf6, 0x4f, 0x5c, + 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4c, 0xf6, 0x51, 0x7c, + 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x09, 0x49, 0x49, 0x68, + 0x81, 0x42, 0x08, 0xd0, 0x39, 0x49, 0x11, 0xf8, 0x30, 0x2f, 0x83, 0x2a, + 0x03, 0xd1, 0x0a, 0x79, 0x1a, 0xb1, 0x01, 0x3a, 0x0a, 0x71, 0x00, 0xf0, + 0x99, 0xb8, 0x85, 0x22, 0x0a, 0x70, 0x00, 0xf0, 0x9b, 0xb8, 0x00, 0xbf, + 0x18, 0x74, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x46, 0x00, 0xf0, 0x9a, 0xf8, + 0x07, 0x48, 0x80, 0x7d, 0x01, 0x28, 0x09, 0xd0, 0x13, 0x48, 0xa1, 0x7c, + 0x90, 0xf8, 0x5b, 0x23, 0x01, 0x32, 0x8a, 0x42, 0x04, 0xbf, 0x90, 0xf8, + 0x4a, 0x03, 0xa0, 0x74, 0x10, 0xbd, 0x00, 0xbf, 0xc8, 0x5c, 0x01, 0x00, + 0x10, 0xb5, 0x04, 0x46, 0x00, 0xf0, 0x8a, 0xf8, 0x23, 0x48, 0x90, 0xf8, + 0x30, 0x10, 0x19, 0xb1, 0x90, 0xf8, 0x30, 0x10, 0x81, 0x29, 0x0c, 0xd1, + 0x80, 0x7d, 0x01, 0x28, 0x09, 0xd0, 0x05, 0x48, 0xa1, 0x7c, 0x90, 0xf8, + 0x5b, 0x23, 0x01, 0x32, 0x8a, 0x42, 0x04, 0xbf, 0x90, 0xf8, 0x4a, 0x03, + 0xa0, 0x74, 0x10, 0xbd, 0x8c, 0x7e, 0x08, 0x00, 0xb0, 0xb5, 0x17, 0x49, + 0x0c, 0x4d, 0x91, 0xf8, 0x30, 0x20, 0x6c, 0x8a, 0x85, 0x2a, 0x04, 0xd0, + 0x84, 0x2a, 0x06, 0xd1, 0x91, 0xf8, 0x35, 0x10, 0x19, 0xb9, 0x08, 0x49, + 0x0a, 0x88, 0x01, 0x32, 0x0a, 0x80, 0x00, 0xf0, 0x53, 0xf8, 0x69, 0x8a, + 0x8c, 0x42, 0x03, 0xd0, 0x12, 0x49, 0x0a, 0x69, 0x01, 0x32, 0x0a, 0x61, + 0xb0, 0xbd, 0x00, 0xbf, 0xc4, 0x79, 0x01, 0x00, 0x7e, 0xfa, 0x05, 0x00, + 0x06, 0x49, 0x91, 0xf8, 0x20, 0x10, 0x01, 0x29, 0x05, 0xd1, 0x05, 0x49, + 0x89, 0x7d, 0x02, 0x29, 0x04, 0xbf, 0x00, 0x20, 0x70, 0x47, 0x00, 0xf0, + 0x4b, 0xb8, 0x00, 0xbf, 0x3c, 0x88, 0x01, 0x00, 0x38, 0x5d, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0xf0, 0x49, 0xf8, 0x01, 0x28, 0x03, 0xd1, 0x02, 0x49, + 0x8a, 0x68, 0x01, 0x32, 0x8a, 0x60, 0x80, 0xbd, 0x84, 0xf0, 0x05, 0x00, + 0x10, 0xb5, 0x08, 0x48, 0x08, 0x49, 0x09, 0x4a, 0x0a, 0x4c, 0x09, 0x4b, + 0xc0, 0xe9, 0x35, 0x24, 0xc0, 0xe9, 0x37, 0x31, 0x08, 0x49, 0x09, 0x4a, + 0x0a, 0x60, 0x09, 0x49, 0xc0, 0xf8, 0xcc, 0x10, 0x10, 0xbd, 0x00, 0xbf, + 0x98, 0xdf, 0x08, 0x00, 0x7d, 0x90, 0x04, 0x00, 0x51, 0x90, 0x04, 0x00, + 0x25, 0x90, 0x04, 0x00, 0xb5, 0x90, 0x04, 0x00, 0x04, 0xd3, 0x08, 0x00, + 0xf5, 0x90, 0x04, 0x00, 0x19, 0x91, 0x04, 0x00, 0x4e, 0xf2, 0x6f, 0x0c, + 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4d, 0xf6, 0x45, 0x4c, + 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4e, 0xf2, 0x21, 0x1c, + 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4e, 0xf2, 0xa5, 0x1c, + 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4e, 0xf6, 0x8f, 0x2c, + 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4d, 0xf6, 0x7f, 0x1c, + 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0xf8, 0xb5, 0x04, 0x46, + 0x58, 0x48, 0x81, 0x89, 0x01, 0x31, 0x81, 0x81, 0x57, 0x48, 0x01, 0x68, + 0x20, 0x46, 0x88, 0x47, 0x56, 0x48, 0x05, 0x69, 0x56, 0x48, 0x01, 0x68, + 0x00, 0x20, 0x88, 0x47, 0x68, 0x6f, 0x55, 0x49, 0x08, 0x60, 0x55, 0x49, + 0xa8, 0x6f, 0x08, 0x60, 0x54, 0x48, 0x4f, 0xf4, 0x88, 0x41, 0x01, 0x60, + 0x53, 0x48, 0x00, 0x68, 0x20, 0xb1, 0xd0, 0xf8, 0xc0, 0x11, 0x01, 0x31, + 0xc0, 0xf8, 0xc0, 0x11, 0x50, 0x4e, 0x51, 0x4f, 0x30, 0x78, 0xc0, 0xeb, + 0x40, 0x10, 0x07, 0xeb, 0xc0, 0x00, 0x90, 0xf8, 0xe0, 0x00, 0x02, 0x28, + 0x7a, 0xd1, 0xa3, 0x49, 0x20, 0x68, 0x09, 0x68, 0x88, 0x47, 0x20, 0x68, + 0x00, 0x25, 0x4a, 0x4b, 0x05, 0x70, 0x20, 0x68, 0x41, 0x78, 0xd0, 0xf8, + 0xd4, 0x20, 0x02, 0xeb, 0x81, 0x01, 0x0f, 0x22, 0xc1, 0xf8, 0x94, 0x00, + 0x04, 0x21, 0x60, 0x68, 0x80, 0xf8, 0x55, 0x50, 0x60, 0x68, 0x80, 0xf8, + 0x54, 0x10, 0xd4, 0xe9, 0x00, 0x01, 0xd0, 0xf8, 0xd4, 0x00, 0x54, 0x30, + 0xc1, 0xf8, 0x94, 0x00, 0x20, 0x68, 0x41, 0x78, 0xd0, 0xf8, 0xd4, 0x00, + 0x89, 0x00, 0x02, 0xfa, 0x01, 0xf1, 0xd0, 0xf8, 0x90, 0x20, 0x22, 0xea, + 0x01, 0x01, 0xc0, 0xf8, 0x90, 0x10, 0x20, 0x68, 0x01, 0x78, 0x42, 0x78, + 0xd0, 0xf8, 0xd4, 0x00, 0x59, 0x5c, 0x92, 0x00, 0x41, 0xf0, 0x01, 0x01, + 0x91, 0x40, 0xd0, 0xf8, 0x90, 0x20, 0x11, 0x43, 0xc0, 0xf8, 0x90, 0x10, + 0x20, 0x68, 0xd0, 0xf8, 0xd4, 0x00, 0xd0, 0xf8, 0x90, 0x10, 0x21, 0xf0, + 0x0f, 0x01, 0xc0, 0xf8, 0x90, 0x10, 0x20, 0x68, 0x01, 0x78, 0xd0, 0xf8, + 0xd4, 0x00, 0x59, 0x5c, 0xd0, 0xf8, 0x90, 0x20, 0x11, 0x43, 0x41, 0xf0, + 0x01, 0x01, 0xc0, 0xf8, 0x90, 0x10, 0x26, 0x48, 0x01, 0x68, 0x20, 0x68, + 0xd0, 0xf8, 0xd4, 0x00, 0x14, 0x30, 0x88, 0x47, 0xe5, 0x48, 0x84, 0x21, + 0x80, 0xf8, 0x30, 0x10, 0x10, 0x21, 0x80, 0xf8, 0x35, 0x10, 0x30, 0x78, + 0x1f, 0x49, 0xc0, 0xeb, 0x40, 0x10, 0x09, 0x68, 0x57, 0xf8, 0x30, 0x00, + 0x00, 0xf5, 0x80, 0x70, 0x88, 0x47, 0x88, 0xb1, 0x1b, 0x48, 0x01, 0x21, + 0x00, 0x22, 0x80, 0xf8, 0x46, 0x10, 0x30, 0x78, 0x00, 0x21, 0xc0, 0xeb, + 0x40, 0x10, 0x07, 0xeb, 0xc0, 0x00, 0x80, 0xf8, 0x9e, 0x50, 0x6e, 0x48, + 0x03, 0x68, 0xbb, 0x20, 0x98, 0x47, 0x09, 0xe0, 0x13, 0x48, 0x02, 0x68, + 0x20, 0x68, 0xd0, 0xf8, 0xd4, 0x10, 0x00, 0xf5, 0x80, 0x70, 0x74, 0x31, + 0x90, 0x47, 0x01, 0x25, 0x28, 0x46, 0xf8, 0xbd, 0xc4, 0x79, 0x01, 0x00, + 0x78, 0xf2, 0x08, 0x00, 0xfc, 0x73, 0x01, 0x00, 0x64, 0xa1, 0x08, 0x00, + 0x0c, 0x23, 0x21, 0x40, 0x10, 0x23, 0x21, 0x40, 0x14, 0x23, 0x21, 0x40, + 0x08, 0x36, 0x01, 0x00, 0x74, 0x87, 0x08, 0x00, 0x0c, 0x6f, 0x01, 0x00, + 0x03, 0xcb, 0x0a, 0x10, 0x70, 0xf2, 0x08, 0x00, 0x6c, 0xf2, 0x08, 0x00, + 0x7c, 0x5c, 0x01, 0x00, 0x98, 0xda, 0x08, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, + 0xba, 0x4d, 0xbb, 0x4c, 0x28, 0x78, 0xc0, 0xeb, 0x40, 0x12, 0x04, 0xeb, + 0xc2, 0x01, 0x91, 0xf8, 0x9e, 0x30, 0x3b, 0xb1, 0x91, 0xf8, 0xe0, 0x30, + 0x02, 0x2b, 0x03, 0xd1, 0xb1, 0xf8, 0xdc, 0x30, 0x1b, 0x07, 0x2f, 0xd4, + 0x01, 0x22, 0x00, 0x26, 0x81, 0xf8, 0x92, 0x20, 0xb2, 0x4a, 0x81, 0xf8, + 0x94, 0x60, 0x92, 0xf8, 0x34, 0x30, 0x01, 0x3b, 0x82, 0xf8, 0x34, 0x30, + 0x1b, 0x06, 0x19, 0xd1, 0x30, 0x32, 0x85, 0x23, 0x13, 0x70, 0x42, 0x4b, + 0x09, 0x6a, 0x53, 0xf8, 0x20, 0x00, 0x03, 0x68, 0x59, 0x1a, 0x40, 0x4b, + 0x19, 0x44, 0x09, 0x01, 0x05, 0xd5, 0x51, 0x78, 0x19, 0xb1, 0x81, 0x8a, + 0x40, 0x31, 0x81, 0x81, 0x01, 0x81, 0x3c, 0x48, 0x00, 0x21, 0x00, 0x22, + 0x03, 0x68, 0x82, 0x20, 0x98, 0x47, 0x28, 0x78, 0xc0, 0xeb, 0x40, 0x10, + 0x04, 0xeb, 0xc0, 0x00, 0x80, 0xf8, 0xe0, 0x60, 0xbd, 0xe8, 0xf8, 0x8f, + 0x2e, 0x49, 0x54, 0xf8, 0x32, 0x00, 0x09, 0x68, 0x88, 0x47, 0x28, 0x78, + 0x01, 0x21, 0xc0, 0xeb, 0x40, 0x10, 0x04, 0xeb, 0xc0, 0x09, 0x09, 0xf8, + 0x94, 0x1f, 0x00, 0x21, 0xc8, 0x46, 0x08, 0xf8, 0x02, 0x1d, 0x27, 0x49, + 0x0e, 0x78, 0x00, 0x2e, 0xe8, 0xd0, 0x54, 0xf8, 0x30, 0x50, 0xdf, 0xf8, + 0x94, 0xb0, 0x00, 0x24, 0x05, 0xf5, 0x80, 0x7a, 0x5b, 0xf8, 0x24, 0x70, + 0xaf, 0x42, 0x06, 0xd0, 0x07, 0xf5, 0x80, 0x71, 0x50, 0x46, 0x06, 0x22, + 0xe7, 0xf7, 0xc6, 0xff, 0x20, 0xb1, 0x01, 0x34, 0xb4, 0x42, 0xf1, 0xd3, + 0x00, 0x20, 0x00, 0xe0, 0x01, 0x20, 0x00, 0x2f, 0xce, 0xd0, 0x00, 0x28, + 0xcc, 0xd0, 0x97, 0xf8, 0x24, 0x01, 0x03, 0x28, 0x0b, 0xd0, 0x97, 0xf8, + 0x24, 0x01, 0x84, 0x28, 0x07, 0xd0, 0x97, 0xf8, 0x24, 0x01, 0x85, 0x28, + 0x03, 0xd0, 0x97, 0xf8, 0x24, 0x01, 0x81, 0x28, 0x14, 0xd1, 0xb7, 0xf8, + 0x84, 0x00, 0xc0, 0x06, 0x10, 0xd4, 0x97, 0xf8, 0x2c, 0x04, 0x10, 0xf0, + 0x26, 0x0f, 0x0b, 0xd0, 0x01, 0x20, 0x85, 0x21, 0x88, 0xf8, 0x00, 0x00, + 0x00, 0x20, 0x89, 0xf8, 0x00, 0x00, 0x74, 0x48, 0x80, 0xf8, 0x30, 0x10, + 0xbd, 0xe8, 0xf8, 0x8f, 0x06, 0x49, 0x07, 0xf1, 0xb8, 0x00, 0x0a, 0x68, + 0x00, 0x21, 0xbd, 0xe8, 0xf8, 0x4f, 0x10, 0x47, 0x74, 0xf2, 0x08, 0x00, + 0x5c, 0x34, 0x01, 0x00, 0x10, 0x61, 0x01, 0x00, 0xbc, 0xa0, 0x08, 0x00, + 0xb8, 0x5d, 0x01, 0x00, 0x80, 0xff, 0xff, 0x0f, 0xa8, 0xa0, 0x08, 0x00, + 0x10, 0xb5, 0x04, 0x46, 0x62, 0x48, 0x3e, 0x49, 0x00, 0x78, 0x00, 0xeb, + 0x00, 0x10, 0x01, 0xeb, 0xc0, 0x00, 0x4b, 0x49, 0x01, 0xf1, 0x0a, 0x02, + 0x08, 0x31, 0xc0, 0xe9, 0x1e, 0x12, 0x01, 0x20, 0x0f, 0xf0, 0x72, 0xfb, + 0x05, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x39, 0x48, 0x02, 0x21, + 0x02, 0x68, 0x01, 0x20, 0x90, 0x47, 0x01, 0x20, 0x10, 0xbd, 0x00, 0xbf, + 0x38, 0xd9, 0x08, 0x00, 0x70, 0xb5, 0x53, 0x49, 0x53, 0x4a, 0x3e, 0x4e, + 0x09, 0x78, 0x35, 0x89, 0xc1, 0xeb, 0x41, 0x11, 0x02, 0xeb, 0xc1, 0x01, + 0xb1, 0xf8, 0xdc, 0x10, 0xc9, 0x07, 0x0c, 0xd1, 0x0e, 0x49, 0xb1, 0xf8, + 0xb0, 0x17, 0x89, 0x07, 0x07, 0xd5, 0x4d, 0x49, 0x89, 0x7d, 0x02, 0x29, + 0x03, 0xd1, 0x0b, 0x49, 0x0a, 0x88, 0x01, 0x32, 0x0a, 0x80, 0x00, 0xf0, + 0xb5, 0xf8, 0x04, 0x46, 0x30, 0x89, 0xa8, 0x42, 0x04, 0xd9, 0x30, 0x49, + 0x40, 0x1b, 0x4a, 0x69, 0x10, 0x44, 0x48, 0x61, 0x00, 0x20, 0x0f, 0xf0, + 0x3b, 0xfb, 0x20, 0x46, 0x70, 0xbd, 0x00, 0xbf, 0x8c, 0x7e, 0x08, 0x00, + 0x7e, 0xfa, 0x05, 0x00, 0x80, 0xb5, 0x3b, 0x48, 0x16, 0x4a, 0x00, 0x78, + 0x00, 0xeb, 0x00, 0x11, 0x02, 0xeb, 0xc1, 0x01, 0x23, 0x4a, 0x02, 0xf1, + 0x0e, 0x03, 0x0c, 0x32, 0xc1, 0xe9, 0x1e, 0x23, 0x11, 0x49, 0x89, 0x79, + 0xc9, 0x07, 0x09, 0xd0, 0x10, 0x49, 0x89, 0x8a, 0x31, 0xb1, 0x10, 0x49, + 0x01, 0xeb, 0x40, 0x10, 0x81, 0x7f, 0x41, 0xf0, 0x01, 0x01, 0x05, 0xe0, + 0x0c, 0x49, 0x01, 0xeb, 0x40, 0x10, 0x81, 0x7f, 0x01, 0xf0, 0xfe, 0x01, + 0x81, 0x77, 0x01, 0x20, 0x0f, 0xf0, 0x0e, 0xfb, 0x08, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x08, 0x48, 0x01, 0x21, 0x02, 0x68, 0x01, 0x20, 0x90, 0x47, + 0x01, 0x20, 0x80, 0xbd, 0xfc, 0x6d, 0x01, 0x00, 0xa8, 0x52, 0x01, 0x00, + 0x70, 0x5d, 0x01, 0x00, 0xe0, 0x58, 0x01, 0x00, 0x40, 0xd9, 0x08, 0x00, + 0x10, 0xd9, 0x08, 0x00, 0x70, 0xb5, 0x09, 0x4e, 0xb5, 0x89, 0x00, 0xf0, + 0x67, 0xf8, 0x04, 0x46, 0xb0, 0x89, 0xa8, 0x42, 0x04, 0xd9, 0x06, 0x49, + 0x40, 0x1b, 0xca, 0x68, 0x10, 0x44, 0xc8, 0x60, 0x00, 0x20, 0x0f, 0xf0, + 0xe7, 0xfa, 0x20, 0x46, 0x70, 0xbd, 0x00, 0xbf, 0xe4, 0x77, 0x01, 0x00, + 0x84, 0xf0, 0x05, 0x00, 0x11, 0x48, 0x12, 0x49, 0x00, 0x78, 0xc0, 0xeb, + 0x40, 0x10, 0x01, 0xeb, 0xc0, 0x00, 0xb0, 0xf8, 0xdc, 0x00, 0xc0, 0x07, + 0x17, 0xd0, 0x0e, 0x48, 0xc1, 0x8b, 0x01, 0x31, 0xc1, 0x83, 0x0e, 0x49, + 0x0c, 0x48, 0x89, 0x7d, 0x0a, 0x30, 0x02, 0x29, 0x4f, 0xf0, 0x00, 0x01, + 0x14, 0xbf, 0x01, 0x80, 0xc1, 0x81, 0xd0, 0xf8, 0x12, 0x10, 0x31, 0xb1, + 0x90, 0xf8, 0x26, 0x00, 0x82, 0x28, 0x02, 0xd1, 0x06, 0x48, 0x00, 0x68, + 0x00, 0x47, 0x70, 0x47, 0x74, 0x87, 0x08, 0x00, 0x0c, 0x6f, 0x01, 0x00, + 0xc4, 0x79, 0x01, 0x00, 0x38, 0x5d, 0x01, 0x00, 0x9c, 0x5d, 0x01, 0x00, + 0x28, 0xc0, 0x08, 0x00, 0x06, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, + 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, + 0x08, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, 0x20, 0xe4, 0x08, 0x00, + 0xdc, 0x96, 0x04, 0x00, 0x24, 0xe4, 0x08, 0x00, 0xbc, 0x96, 0x04, 0x00, + 0x68, 0xe3, 0x08, 0x00, 0xfc, 0x96, 0x04, 0x00, 0xf8, 0xd8, 0x08, 0x00, + 0x09, 0x96, 0x04, 0x00, 0x4e, 0xf6, 0x19, 0x6c, 0xc1, 0xf2, 0x0d, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x4f, 0xf2, 0x15, 0x7c, 0xc1, 0xf2, 0x0d, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0xeb, 0xf1, 0x0d, 0x10, 0xbd, 0x91, 0x04, 0x00, + 0xc5, 0xf3, 0x0d, 0x10, 0xd7, 0xf3, 0x0d, 0x10, 0x61, 0x93, 0x04, 0x00, + 0x8f, 0x6a, 0x0f, 0x10, 0x91, 0x6a, 0x0f, 0x10, 0x2a, 0x00, 0x00, 0x00, + 0x71, 0xec, 0x0d, 0x10, 0xbb, 0xec, 0x0d, 0x10, 0xc1, 0x94, 0x04, 0x00, + 0x01, 0x95, 0x04, 0x00, 0x8d, 0x6a, 0x0f, 0x10, 0x8f, 0x6a, 0x0f, 0x10, + 0x91, 0x6a, 0x0f, 0x10, 0x29, 0x00, 0x00, 0x00, 0x6b, 0xf5, 0x0d, 0x10, + 0x77, 0xf5, 0x0d, 0x10, 0x61, 0x95, 0x04, 0x00, 0xd9, 0x95, 0x04, 0x00, + 0x8d, 0x6a, 0x0f, 0x10, 0x8f, 0x6a, 0x0f, 0x10, 0x91, 0x6a, 0x0f, 0x10, + 0x2c, 0x00, 0x00, 0x00, 0x02, 0x29, 0x04, 0xd0, 0x01, 0x29, 0x04, 0xd0, + 0x31, 0xb9, 0x06, 0x49, 0x02, 0xe0, 0x03, 0x49, 0x00, 0xe0, 0x03, 0x49, + 0x81, 0x61, 0x70, 0x47, 0x00, 0xf0, 0x1e, 0xbb, 0xf4, 0x9d, 0x04, 0x00, + 0xd8, 0x9d, 0x04, 0x00, 0xbc, 0x9d, 0x04, 0x00, 0x2d, 0xe9, 0xf8, 0x43, + 0x3d, 0x49, 0x05, 0x46, 0x2e, 0x6a, 0xa5, 0xf1, 0xb8, 0x04, 0x91, 0xf8, + 0x4c, 0x20, 0x91, 0xf8, 0x4d, 0x00, 0x01, 0xf1, 0x2c, 0x08, 0x22, 0xb1, + 0x01, 0x28, 0x02, 0xd1, 0x37, 0x48, 0x80, 0x8c, 0x0c, 0xe0, 0x36, 0x49, + 0x01, 0x28, 0x01, 0xf1, 0x22, 0x02, 0x88, 0xbf, 0x01, 0xf1, 0x24, 0x02, + 0x02, 0x28, 0x02, 0xd3, 0xb1, 0xf8, 0x26, 0x90, 0x04, 0xe0, 0x10, 0x88, + 0x40, 0x01, 0x0a, 0x21, 0xb0, 0xfb, 0xf1, 0xf9, 0x2e, 0x48, 0x01, 0x68, + 0x20, 0x46, 0x88, 0x47, 0x18, 0xb1, 0x2d, 0x48, 0x01, 0x68, 0x20, 0x46, + 0x03, 0xe0, 0x20, 0x6a, 0xb8, 0xb1, 0x2b, 0x49, 0x09, 0x68, 0x88, 0x47, + 0x07, 0x46, 0x01, 0x30, 0x11, 0xd0, 0xb8, 0x1b, 0x20, 0xf0, 0x70, 0x40, + 0xb0, 0xf1, 0x00, 0x6f, 0x0b, 0xd9, 0x26, 0x48, 0xb9, 0x44, 0x00, 0x68, + 0x80, 0x47, 0xa9, 0xeb, 0x00, 0x00, 0x20, 0xf0, 0x70, 0x40, 0xb0, 0xf1, + 0x00, 0x6f, 0x98, 0xbf, 0x3e, 0x46, 0x98, 0xf8, 0x21, 0x00, 0x02, 0x28, + 0x03, 0xd3, 0x1e, 0x48, 0x00, 0x68, 0x80, 0x47, 0x06, 0x46, 0xea, 0x69, + 0xd5, 0xf8, 0x58, 0x14, 0x52, 0x7f, 0x88, 0x19, 0x20, 0xf0, 0x70, 0x40, + 0x28, 0x61, 0x0a, 0xb3, 0x50, 0x29, 0x1f, 0xd3, 0xd4, 0xf8, 0x24, 0x35, + 0xd4, 0xf8, 0xd8, 0x20, 0x5e, 0x1c, 0x18, 0xbf, 0x1a, 0x46, 0xb4, 0xf8, + 0x20, 0x35, 0x0a, 0x2b, 0x08, 0xd3, 0x12, 0x4b, 0x1b, 0x7d, 0x53, 0xb1, + 0x00, 0x20, 0xa5, 0xf8, 0x68, 0x04, 0x50, 0x18, 0x24, 0x30, 0x01, 0xe0, + 0x1b, 0xb9, 0x50, 0x18, 0x20, 0xf0, 0x70, 0x40, 0x28, 0x61, 0x4f, 0xf0, + 0xff, 0x31, 0xc4, 0xf8, 0x24, 0x15, 0x00, 0x21, 0xa4, 0xf8, 0x20, 0x15, + 0xc8, 0xf8, 0x00, 0x00, 0xbd, 0xe8, 0xf8, 0x83, 0x18, 0x74, 0x01, 0x00, + 0xe8, 0x65, 0x08, 0x00, 0x4c, 0x9d, 0x08, 0x00, 0x58, 0x9d, 0x08, 0x00, + 0x0c, 0x9d, 0x08, 0x00, 0xe0, 0xa0, 0x08, 0x00, 0x7c, 0x5c, 0x01, 0x00, + 0x30, 0xf8, 0x36, 0x1c, 0x89, 0x07, 0x03, 0xd5, 0x90, 0xf8, 0x7d, 0x13, + 0x49, 0x07, 0x01, 0xd5, 0x0f, 0x21, 0x81, 0x72, 0x00, 0xf0, 0x86, 0xba, + 0x10, 0xb5, 0x04, 0x46, 0xd7, 0xf7, 0xcc, 0xfb, 0x61, 0x7a, 0xc9, 0x06, + 0x44, 0xbf, 0x20, 0x61, 0x10, 0xbd, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, + 0x00, 0xf0, 0x7e, 0xba, 0x81, 0x7a, 0x0e, 0x29, 0x9c, 0xbf, 0x01, 0x31, + 0x81, 0x72, 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x47, 0x9a, 0x46, 0x17, 0x46, + 0x0e, 0x46, 0x05, 0x46, 0xd7, 0xf7, 0xb4, 0xfb, 0x95, 0xf8, 0x35, 0x11, + 0xad, 0x4a, 0x05, 0xf1, 0xb8, 0x08, 0x01, 0xeb, 0x41, 0x01, 0x02, 0xeb, + 0x41, 0x13, 0xd5, 0xf8, 0xd0, 0x10, 0x03, 0xf1, 0x10, 0x04, 0x0a, 0x78, + 0x02, 0x2a, 0x0a, 0xd1, 0x00, 0x20, 0x05, 0xf2, 0x35, 0x19, 0x20, 0x60, + 0x95, 0xf8, 0x90, 0x00, 0x00, 0xf0, 0xfb, 0x00, 0x85, 0xf8, 0x90, 0x00, + 0x13, 0xe0, 0x24, 0x68, 0x6c, 0xb1, 0x04, 0x1b, 0x24, 0xf0, 0x70, 0x44, + 0xb4, 0xf5, 0xc8, 0x5f, 0x07, 0xd9, 0x00, 0x24, 0x1c, 0x61, 0x95, 0xf8, + 0x90, 0x30, 0x03, 0xf0, 0xfb, 0x03, 0x85, 0xf8, 0x90, 0x30, 0x05, 0xf2, + 0x35, 0x19, 0x00, 0x2a, 0x7a, 0xd0, 0x56, 0xb1, 0x95, 0xf8, 0xc1, 0x00, + 0x40, 0xf0, 0x01, 0x00, 0x85, 0xf8, 0xc1, 0x00, 0x1f, 0xb1, 0x00, 0x20, + 0x85, 0xf8, 0xc2, 0x00, 0x02, 0xe0, 0x40, 0x46, 0xff, 0xf7, 0xb4, 0xff, + 0x90, 0x48, 0x31, 0x46, 0x3a, 0x46, 0x53, 0x46, 0x04, 0x68, 0x28, 0x46, + 0xa0, 0x47, 0xb5, 0xf8, 0xc4, 0x00, 0xb5, 0xf8, 0xc6, 0x10, 0x81, 0x42, + 0x01, 0xd2, 0xbd, 0xe8, 0xf0, 0x87, 0x95, 0xf8, 0xc1, 0x00, 0xc1, 0x07, + 0x1a, 0xd1, 0xd5, 0xf8, 0xd0, 0x00, 0x00, 0x78, 0x02, 0x28, 0x7b, 0xd1, + 0xac, 0x48, 0x01, 0x68, 0x28, 0x46, 0x88, 0x47, 0x01, 0x28, 0x68, 0xd1, + 0xc5, 0x48, 0x90, 0xf8, 0x4c, 0x10, 0x90, 0xf8, 0x4d, 0x20, 0xd5, 0xf8, + 0xd8, 0x00, 0x00, 0x29, 0x00, 0xf0, 0xaa, 0x80, 0x01, 0x2a, 0x40, 0xf0, + 0xa7, 0x80, 0x7d, 0x49, 0x24, 0x31, 0xaa, 0xe0, 0xba, 0xf1, 0x00, 0x0f, + 0x05, 0xd0, 0x00, 0x2e, 0x00, 0xf0, 0xe4, 0x80, 0x00, 0x2f, 0x00, 0xf0, + 0xe1, 0x80, 0x00, 0x21, 0x85, 0xf8, 0xc2, 0x10, 0xd5, 0xf8, 0xd0, 0x10, + 0x09, 0x78, 0x02, 0x29, 0x3f, 0xd1, 0xb5, 0x49, 0x91, 0xf8, 0x4d, 0x20, + 0x01, 0x2a, 0x00, 0xf2, 0xa8, 0x80, 0xb5, 0xf8, 0x82, 0x00, 0x80, 0x07, + 0x40, 0xf1, 0xba, 0x80, 0x95, 0xf8, 0x35, 0x04, 0x40, 0x07, 0x00, 0xf1, + 0xb5, 0x80, 0x08, 0x6d, 0x42, 0x1c, 0xba, 0xd0, 0x6a, 0x4a, 0x92, 0xf8, + 0x99, 0x20, 0x03, 0x2a, 0x03, 0xd1, 0x69, 0x4a, 0x92, 0x7c, 0x52, 0x2a, + 0xb1, 0xd0, 0x68, 0x4a, 0x92, 0x69, 0x12, 0x69, 0x80, 0x1a, 0x00, 0xf5, + 0xa0, 0x70, 0x20, 0xf0, 0x70, 0x40, 0xb0, 0xf1, 0x00, 0x6f, 0xa6, 0xd9, + 0x91, 0xf8, 0x4c, 0x00, 0x00, 0x28, 0x40, 0xf0, 0x94, 0x80, 0xa0, 0xe7, + 0x9e, 0x4a, 0x92, 0xf8, 0x4d, 0x20, 0x00, 0x2a, 0x3f, 0xf4, 0x7f, 0xaf, + 0xd5, 0xf8, 0xc8, 0x20, 0x10, 0x1a, 0x20, 0xf0, 0x70, 0x40, 0xb0, 0xf1, + 0x00, 0x6f, 0x7f, 0xf6, 0x76, 0xaf, 0x49, 0x69, 0x40, 0x46, 0x88, 0x47, + 0x71, 0xe7, 0x52, 0x48, 0x01, 0x68, 0x28, 0x46, 0x88, 0x47, 0x00, 0x28, + 0x7f, 0xf4, 0x87, 0xaf, 0x77, 0xe0, 0x50, 0x48, 0x90, 0xf8, 0x28, 0x10, + 0x01, 0x29, 0x07, 0xd0, 0x90, 0xf8, 0x58, 0x00, 0x01, 0x28, 0x03, 0xd0, + 0x28, 0x6a, 0x00, 0x28, 0x7f, 0xf4, 0x8a, 0xaf, 0x95, 0xf8, 0xa4, 0x04, + 0x41, 0x07, 0x1c, 0xd5, 0x00, 0x07, 0x1a, 0xd4, 0x99, 0xf8, 0x00, 0x00, + 0x49, 0x49, 0x00, 0xeb, 0xc0, 0x00, 0x01, 0xeb, 0x40, 0x00, 0x40, 0x78, + 0x01, 0x28, 0x5a, 0xd0, 0x43, 0x49, 0xd5, 0xf8, 0xdc, 0x00, 0x89, 0x69, + 0x09, 0x69, 0x08, 0x1a, 0xd5, 0xf8, 0xa0, 0x14, 0x20, 0xf0, 0x70, 0x40, + 0xb0, 0xeb, 0x51, 0x0f, 0x03, 0xd9, 0x01, 0xeb, 0x81, 0x01, 0x88, 0x42, + 0x49, 0xd3, 0x38, 0x48, 0x90, 0xf8, 0x89, 0x00, 0x80, 0x07, 0x5d, 0xd5, + 0xd5, 0xf8, 0x88, 0x14, 0x95, 0xf8, 0x28, 0x01, 0x0a, 0x02, 0x58, 0xbf, + 0x5f, 0xea, 0x81, 0x52, 0x50, 0xd5, 0x05, 0x21, 0x01, 0xea, 0x50, 0x01, + 0x00, 0xf0, 0x05, 0x00, 0x08, 0x44, 0x00, 0xf0, 0x03, 0x01, 0x01, 0xeb, + 0x90, 0x00, 0x02, 0x28, 0x48, 0xd3, 0x52, 0x48, 0x02, 0x68, 0x17, 0xe0, + 0x29, 0x4b, 0x01, 0x2a, 0x03, 0xf1, 0x22, 0x01, 0x88, 0xbf, 0x03, 0xf1, + 0x24, 0x01, 0x09, 0x88, 0x0a, 0x22, 0x49, 0x01, 0xb1, 0xfb, 0xf2, 0xf1, + 0x26, 0x4a, 0x92, 0x69, 0x12, 0x69, 0x80, 0x1a, 0x08, 0x44, 0x48, 0x49, + 0x20, 0xf0, 0x70, 0x40, 0x0a, 0x68, 0xb0, 0xf1, 0x00, 0x6f, 0x16, 0xd9, + 0x40, 0x46, 0x02, 0x21, 0x2e, 0xe0, 0x86, 0xb1, 0x01, 0x07, 0x0e, 0xd4, + 0x1a, 0x49, 0x91, 0xf8, 0x4b, 0x10, 0x51, 0xb1, 0x00, 0x22, 0x40, 0xf0, + 0x08, 0x00, 0xa5, 0xf8, 0xc4, 0x10, 0xa5, 0xf8, 0xc6, 0x20, 0x85, 0xf8, + 0xc1, 0x00, 0xbd, 0xe8, 0xf0, 0x87, 0x3a, 0x48, 0x02, 0x68, 0x40, 0x46, + 0x03, 0x21, 0x17, 0xe0, 0x37, 0x48, 0x03, 0x21, 0x02, 0x68, 0x40, 0x46, + 0x90, 0x47, 0x12, 0x49, 0x99, 0xf8, 0x00, 0x00, 0x01, 0x22, 0x47, 0x23, + 0xd1, 0xf8, 0x00, 0xc0, 0x00, 0x21, 0xbd, 0xe8, 0xf0, 0x47, 0x60, 0x47, + 0x09, 0xb2, 0xb1, 0xf1, 0xff, 0x3f, 0xaa, 0xdd, 0x2d, 0x48, 0x01, 0x21, + 0x02, 0x68, 0x40, 0x46, 0xbd, 0xe8, 0xf0, 0x47, 0x10, 0x47, 0x00, 0xbf, + 0x54, 0xf1, 0x05, 0x00, 0xec, 0xe1, 0x08, 0x00, 0xf0, 0xe1, 0x08, 0x00, + 0xe8, 0x65, 0x08, 0x00, 0x4c, 0x49, 0x01, 0x00, 0xac, 0x76, 0x01, 0x00, + 0xfc, 0x73, 0x01, 0x00, 0x04, 0xa1, 0x08, 0x00, 0x44, 0x28, 0x01, 0x00, + 0x70, 0xb5, 0x06, 0x46, 0x90, 0xf8, 0xc0, 0x00, 0x88, 0xb3, 0x30, 0x6a, + 0x14, 0x46, 0x0d, 0x46, 0x08, 0xb9, 0xb0, 0x68, 0x60, 0xb3, 0x00, 0x20, + 0x15, 0xb3, 0x01, 0x2c, 0x20, 0xd8, 0xf8, 0xb1, 0x96, 0xf8, 0x90, 0x00, + 0x40, 0x07, 0x1b, 0xd4, 0xd6, 0xf8, 0xd4, 0x00, 0x40, 0x7f, 0xb8, 0xb9, + 0x96, 0xf8, 0x2d, 0x11, 0x96, 0xf8, 0x2e, 0x21, 0x96, 0xf8, 0x29, 0x01, + 0x11, 0x43, 0x88, 0x43, 0x00, 0xf0, 0x06, 0x00, 0x06, 0x28, 0x0b, 0xd1, + 0x96, 0xf8, 0xc0, 0x00, 0x02, 0x28, 0x07, 0xd1, 0x0c, 0x49, 0x06, 0xf1, + 0xb8, 0x00, 0x0a, 0x68, 0x01, 0x21, 0xbd, 0xe8, 0x70, 0x40, 0x10, 0x47, + 0x30, 0x46, 0x29, 0x46, 0x22, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x00, 0xf0, + 0xcf, 0xb8, 0x70, 0xbd, 0x03, 0x48, 0x01, 0x68, 0x30, 0x46, 0x88, 0x47, + 0xb0, 0xfa, 0x80, 0xf0, 0x40, 0x09, 0xcb, 0xe7, 0x4c, 0x9d, 0x08, 0x00, + 0xbc, 0xa0, 0x08, 0x00, 0xb0, 0xb5, 0xd0, 0xf8, 0xd4, 0x40, 0xb4, 0xf8, + 0x6c, 0x40, 0x05, 0x2c, 0x0c, 0xd3, 0x59, 0xb9, 0xd0, 0xf8, 0xd0, 0x50, + 0x2d, 0x78, 0x01, 0x2d, 0x06, 0xd8, 0xb0, 0xf8, 0xc6, 0x50, 0x05, 0xeb, + 0x94, 0x04, 0x01, 0x3c, 0xa0, 0xf8, 0xc6, 0x40, 0xbd, 0xe8, 0xb0, 0x40, + 0x00, 0xf0, 0xb0, 0xb8, 0xe0, 0xb5, 0x00, 0xf0, 0xb3, 0xf8, 0x0c, 0x48, + 0x00, 0x6b, 0xa0, 0xb1, 0x00, 0x21, 0x08, 0x22, 0xcd, 0xe9, 0x00, 0x11, + 0x81, 0x69, 0x09, 0x78, 0x02, 0x29, 0x9c, 0xbf, 0x90, 0xf8, 0x7d, 0x10, + 0xad, 0xf8, 0x00, 0x10, 0x81, 0x89, 0x00, 0x69, 0xad, 0xf8, 0x02, 0x10, + 0x01, 0x90, 0x69, 0x46, 0x29, 0x20, 0xdd, 0xf7, 0xa3, 0xfa, 0x8c, 0xbd, + 0x18, 0x74, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x46, 0xe1, 0xb3, 0x01, 0x2a, + 0x3a, 0xd8, 0xcb, 0xb3, 0xd4, 0xf8, 0xd0, 0x00, 0x00, 0x78, 0x02, 0x28, + 0x08, 0xd1, 0xd4, 0xf8, 0xd4, 0x00, 0x40, 0x7f, 0xe0, 0xb1, 0xd4, 0xf8, + 0x10, 0x05, 0x4f, 0x28, 0x18, 0xd9, 0x2b, 0xe0, 0x94, 0xf8, 0xc1, 0x00, + 0xc1, 0x06, 0x18, 0xd4, 0x94, 0xf8, 0x90, 0x00, 0x40, 0x07, 0x03, 0xd5, + 0xd4, 0xf8, 0xd4, 0x00, 0x40, 0x7f, 0xf8, 0xb9, 0x94, 0xf8, 0x2d, 0x11, + 0x94, 0xf8, 0x2e, 0x21, 0x94, 0xf8, 0x29, 0x01, 0x11, 0x43, 0x88, 0x43, + 0x00, 0xf0, 0x0e, 0x00, 0x0e, 0x28, 0x13, 0xd1, 0xb4, 0xf8, 0xc4, 0x00, + 0xa4, 0xf8, 0xc6, 0x00, 0x0e, 0xe0, 0x0c, 0x49, 0x8a, 0x68, 0xa2, 0x42, + 0x06, 0xd1, 0xd4, 0xf8, 0xd4, 0x20, 0x09, 0x69, 0x12, 0x69, 0x51, 0x1a, + 0x09, 0x01, 0x03, 0xd4, 0x00, 0xf0, 0xef, 0x00, 0x84, 0xf8, 0xc1, 0x00, + 0x05, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x18, 0xb1, 0xb4, 0xf8, + 0xc4, 0x00, 0xa4, 0xf8, 0xc6, 0x00, 0x10, 0xbd, 0xd8, 0x5d, 0x01, 0x00, + 0xf4, 0xe1, 0x08, 0x00, 0x09, 0x48, 0x0a, 0x49, 0x01, 0x60, 0x0a, 0x48, + 0x0a, 0x49, 0x01, 0x60, 0x0a, 0x48, 0x0b, 0x49, 0x01, 0x60, 0x0b, 0x48, + 0x0b, 0x49, 0x01, 0x60, 0x0b, 0x48, 0x0c, 0x49, 0x01, 0x60, 0x0c, 0x48, + 0x0c, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, 0x2c, 0xd3, 0x08, 0x00, + 0x9d, 0x98, 0x04, 0x00, 0xbc, 0xd2, 0x08, 0x00, 0x1d, 0x97, 0x04, 0x00, + 0xac, 0xbb, 0x08, 0x00, 0x8d, 0x9b, 0x04, 0x00, 0x30, 0xd3, 0x08, 0x00, + 0x15, 0x9c, 0x04, 0x00, 0x64, 0xeb, 0x08, 0x00, 0x45, 0x9c, 0x04, 0x00, + 0xec, 0xe1, 0x08, 0x00, 0x81, 0x9c, 0x04, 0x00, 0x40, 0xf6, 0x35, 0x7c, + 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf2, 0xe7, 0x3c, + 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf2, 0x29, 0x5c, + 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf2, 0x8f, 0x7c, + 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf6, 0xe9, 0x0c, + 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf6, 0xf9, 0x5c, + 0xc1, 0xf2, 0x10, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x00, 0x00, 0x00, 0x00, + 0xcb, 0x10, 0x0d, 0x10, 0x9d, 0x11, 0x0d, 0x10, 0xbf, 0x11, 0x0d, 0x10, + 0xd5, 0x16, 0x0d, 0x10, 0x75, 0x98, 0x04, 0x00, 0x05, 0x16, 0x0d, 0x10, + 0x01, 0x00, 0x00, 0x00, 0xcb, 0x10, 0x0d, 0x10, 0x9d, 0x11, 0x0d, 0x10, + 0xbf, 0x11, 0x0d, 0x10, 0x03, 0x15, 0x0d, 0x10, 0x75, 0x98, 0x04, 0x00, + 0x05, 0x16, 0x0d, 0x10, 0x02, 0x00, 0x00, 0x00, 0xcb, 0x10, 0x0d, 0x10, + 0x55, 0x12, 0x0d, 0x10, 0x69, 0x12, 0x0d, 0x10, 0x83, 0x12, 0x0d, 0x10, + 0x45, 0x97, 0x04, 0x00, 0x5d, 0x98, 0x04, 0x00, 0x70, 0xb5, 0x05, 0x46, + 0x00, 0xf0, 0x30, 0xf9, 0x04, 0x46, 0x01, 0x28, 0x20, 0xd1, 0x28, 0x68, + 0xc1, 0x78, 0x01, 0x29, 0x1c, 0xd1, 0x4e, 0x49, 0x09, 0x68, 0xc9, 0xb1, + 0x91, 0xf8, 0x88, 0x14, 0x09, 0x07, 0x15, 0xd5, 0x0b, 0x4a, 0x86, 0x6e, + 0x69, 0x68, 0xd0, 0xf8, 0xdc, 0x00, 0x12, 0x68, 0x90, 0x47, 0x30, 0x1a, + 0x00, 0x01, 0x0b, 0xd5, 0x28, 0x68, 0xb0, 0xf8, 0x82, 0x10, 0x21, 0xf4, + 0x80, 0x61, 0xa0, 0xf8, 0x82, 0x10, 0x43, 0x48, 0x22, 0x21, 0x02, 0x68, + 0x40, 0x48, 0x90, 0x47, 0x20, 0x46, 0x70, 0xbd, 0xe4, 0xe5, 0x08, 0x00, + 0xf8, 0xb5, 0x28, 0xb3, 0x06, 0x68, 0x05, 0x46, 0x2e, 0xb3, 0xb6, 0xf8, + 0x74, 0x71, 0x28, 0x46, 0x00, 0xf0, 0x04, 0xf9, 0x04, 0x46, 0x28, 0x68, + 0x90, 0xf8, 0x89, 0x10, 0xc9, 0x06, 0x08, 0xd5, 0xb0, 0xf8, 0x54, 0x14, + 0x82, 0x6e, 0x02, 0xeb, 0x41, 0x01, 0x21, 0xf0, 0x70, 0x41, 0xc0, 0xf8, + 0x88, 0x13, 0xb6, 0xf8, 0x74, 0x01, 0x87, 0x42, 0x12, 0xd0, 0x96, 0xf8, + 0x35, 0x01, 0x30, 0x49, 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, 0x40, 0x10, + 0xc1, 0x69, 0x01, 0x31, 0xc1, 0x61, 0x07, 0xe0, 0x00, 0x20, 0xd9, 0x21, + 0x01, 0xe0, 0x00, 0x20, 0xdb, 0x21, 0x00, 0x24, 0xdc, 0xf7, 0xfc, 0xfe, + 0x20, 0x46, 0xf8, 0xbd, 0x70, 0xb5, 0x52, 0x4d, 0x22, 0x4e, 0x28, 0x78, + 0xc0, 0xeb, 0x40, 0x10, 0x56, 0xf8, 0x30, 0x40, 0xfe, 0xf7, 0xf8, 0xf8, + 0x28, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x06, 0xeb, 0xc0, 0x00, 0xb0, 0xf8, + 0xdc, 0x00, 0x40, 0x07, 0x25, 0xd5, 0xe0, 0x78, 0x98, 0xb1, 0x01, 0x28, + 0x18, 0xd1, 0x28, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x06, 0xeb, 0xc0, 0x00, + 0x90, 0xf8, 0x91, 0x00, 0x80, 0xb9, 0x94, 0xf8, 0x35, 0x01, 0x16, 0x49, + 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, 0x40, 0x10, 0x81, 0x7b, 0x01, 0x31, + 0x0e, 0xe0, 0x10, 0x48, 0x00, 0x68, 0x18, 0xb1, 0x90, 0xf8, 0x88, 0x04, + 0x00, 0x07, 0x09, 0xd4, 0x94, 0xf8, 0x35, 0x01, 0x0d, 0x49, 0x00, 0xeb, + 0x40, 0x00, 0x01, 0xeb, 0x40, 0x10, 0x00, 0x21, 0x81, 0x73, 0x70, 0xbd, + 0xb4, 0xf8, 0x82, 0x00, 0x22, 0x21, 0x20, 0xf4, 0x80, 0x60, 0xa4, 0xf8, + 0x82, 0x00, 0x05, 0x48, 0x02, 0x68, 0x03, 0x48, 0x90, 0x47, 0xe0, 0x78, + 0xcd, 0xe7, 0x00, 0xbf, 0x0c, 0x6f, 0x01, 0x00, 0xfc, 0x70, 0x01, 0x00, + 0xf4, 0xa0, 0x08, 0x00, 0x54, 0xf1, 0x05, 0x00, 0x00, 0x68, 0x00, 0x28, + 0x4c, 0xd0, 0x90, 0xf8, 0x24, 0x11, 0x03, 0x29, 0x03, 0xd0, 0x90, 0xf8, + 0x24, 0x11, 0x85, 0x29, 0x01, 0xd1, 0x02, 0x21, 0x00, 0xe0, 0x01, 0x21, + 0x21, 0x4a, 0x12, 0x68, 0x12, 0x05, 0x0c, 0xd4, 0x20, 0x4a, 0x12, 0x68, + 0x12, 0x01, 0x08, 0xd4, 0x90, 0xf8, 0x29, 0x21, 0xd3, 0x07, 0x1c, 0xd1, + 0x42, 0xf0, 0x01, 0x02, 0x80, 0xf8, 0x29, 0x21, 0x1d, 0xe0, 0x90, 0xf8, + 0x28, 0x21, 0x05, 0x23, 0x0a, 0x43, 0x80, 0xf8, 0x28, 0x21, 0xd0, 0xf8, + 0xcc, 0x21, 0x63, 0xf3, 0x03, 0x02, 0x17, 0x4b, 0xc0, 0xf8, 0xcc, 0x21, + 0x14, 0x4a, 0x12, 0x78, 0x02, 0xeb, 0x82, 0x02, 0x03, 0xeb, 0xc2, 0x02, + 0xd3, 0x69, 0x43, 0xf4, 0x80, 0x13, 0xd3, 0x61, 0x10, 0xe0, 0x90, 0xf8, + 0x2a, 0x21, 0x42, 0xf0, 0x01, 0x02, 0x80, 0xf8, 0x2a, 0x21, 0xd0, 0xf8, + 0xd8, 0x20, 0xd0, 0xf8, 0xcc, 0x31, 0xc0, 0xf8, 0x8c, 0x23, 0x03, 0x22, + 0x62, 0xf3, 0x03, 0x03, 0xc0, 0xf8, 0xcc, 0x31, 0x02, 0x29, 0x05, 0xd1, + 0xd0, 0xf8, 0xb4, 0x03, 0x10, 0xb1, 0x06, 0x49, 0x09, 0x68, 0x08, 0x47, + 0x70, 0x47, 0x00, 0xbf, 0xcc, 0x20, 0x21, 0x40, 0xec, 0x10, 0x21, 0x40, + 0x74, 0x87, 0x08, 0x00, 0x84, 0x71, 0x01, 0x00, 0x58, 0xd2, 0x08, 0x00, + 0xb0, 0xb5, 0x80, 0xb1, 0x04, 0x46, 0x00, 0x68, 0x68, 0xb1, 0xb0, 0xf8, + 0x40, 0x51, 0x20, 0x46, 0x00, 0xf0, 0x2c, 0xf8, 0x20, 0x68, 0xb0, 0xf8, + 0x40, 0x01, 0x85, 0x42, 0x03, 0xd0, 0x02, 0x48, 0xc1, 0x68, 0x01, 0x31, + 0xc1, 0x60, 0xb0, 0xbd, 0xb0, 0xf0, 0x05, 0x00, 0x04, 0x48, 0x05, 0x49, + 0x01, 0x60, 0x05, 0x48, 0x05, 0x49, 0x40, 0xf8, 0x18, 0x1f, 0x05, 0x49, + 0x41, 0x60, 0x70, 0x47, 0x7c, 0xe4, 0x08, 0x00, 0x80, 0xd3, 0x05, 0x00, + 0x9c, 0x0f, 0x01, 0x00, 0x6d, 0x9f, 0x04, 0x00, 0x25, 0xa0, 0x04, 0x00, + 0x47, 0xf6, 0x0f, 0x5c, 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x40, 0xf6, 0x29, 0x7c, 0xc1, 0xf2, 0x0e, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x41, 0xf2, 0x97, 0x1c, 0xc1, 0xf2, 0x0e, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0xb0, 0xb5, 0x04, 0x46, 0x00, 0x68, 0x00, 0x28, 0x6d, 0xd0, 0xa0, 0x68, + 0x00, 0x28, 0x6a, 0xd0, 0x52, 0x49, 0x00, 0x22, 0x52, 0x4d, 0x0a, 0x60, + 0xd5, 0xf8, 0xe0, 0x1f, 0x09, 0x05, 0x5c, 0xbf, 0x29, 0x68, 0x5f, 0xea, + 0x01, 0x11, 0x5f, 0xd5, 0x90, 0xf8, 0xbc, 0x10, 0x4d, 0x4a, 0x41, 0xf0, + 0x01, 0x01, 0x80, 0xf8, 0xbc, 0x10, 0x58, 0x49, 0x09, 0x78, 0xc1, 0xeb, + 0x41, 0x11, 0x02, 0xeb, 0xc1, 0x01, 0x89, 0x68, 0x89, 0x68, 0x09, 0x7d, + 0x21, 0x29, 0x09, 0xd1, 0x46, 0x49, 0x91, 0xf8, 0x4e, 0x11, 0x80, 0xf8, + 0xc8, 0x10, 0xc0, 0x68, 0x10, 0xb1, 0x44, 0x49, 0x09, 0x68, 0x88, 0x47, + 0x21, 0x68, 0xa0, 0x68, 0xd1, 0xf8, 0xcc, 0x21, 0x22, 0xf0, 0x0f, 0x02, + 0xc1, 0xf8, 0xcc, 0x21, 0x21, 0x68, 0xd1, 0xf8, 0xcc, 0x21, 0x42, 0xf0, + 0x05, 0x02, 0xc1, 0xf8, 0xcc, 0x21, 0x3c, 0x4a, 0x21, 0x68, 0x91, 0xf8, + 0x35, 0x11, 0x01, 0xeb, 0xc1, 0x01, 0x02, 0xeb, 0x41, 0x01, 0x49, 0x78, + 0x01, 0x29, 0x1d, 0xbf, 0xb0, 0xf8, 0x68, 0x10, 0x01, 0x31, 0xa0, 0xf8, + 0x68, 0x10, 0xb0, 0xf8, 0x66, 0x10, 0x04, 0xbf, 0x01, 0x31, 0xa0, 0xf8, + 0x66, 0x10, 0x94, 0xf8, 0x45, 0x00, 0x80, 0x07, 0x19, 0xd5, 0x20, 0x68, + 0xd0, 0xf8, 0xd4, 0x00, 0x40, 0x7f, 0x38, 0xb9, 0xd5, 0xf8, 0xe0, 0x0f, + 0x00, 0x05, 0x5c, 0xbf, 0x28, 0x68, 0x5f, 0xea, 0x00, 0x10, 0x0c, 0xd5, + 0x2a, 0x48, 0x01, 0x68, 0xa0, 0x68, 0xbc, 0x30, 0x88, 0x47, 0xa0, 0x68, + 0x80, 0x68, 0x20, 0xb1, 0x23, 0x49, 0x09, 0x68, 0xbd, 0xe8, 0xb0, 0x40, + 0x08, 0x47, 0xb0, 0xbd, 0x90, 0xf8, 0xbd, 0x10, 0xca, 0x07, 0x04, 0xd1, + 0x41, 0xf0, 0x01, 0x01, 0x80, 0xf8, 0xbd, 0x10, 0x05, 0xe0, 0x90, 0xf8, + 0xbe, 0x10, 0x41, 0xf0, 0x01, 0x01, 0x80, 0xf8, 0xbe, 0x10, 0x21, 0x68, + 0x61, 0xb1, 0xd1, 0xf8, 0xcc, 0x21, 0x22, 0xf0, 0x0f, 0x02, 0xc1, 0xf8, + 0xcc, 0x21, 0x21, 0x68, 0xd1, 0xf8, 0xcc, 0x21, 0x42, 0xf0, 0x03, 0x02, + 0xc1, 0xf8, 0xcc, 0x21, 0x90, 0xf8, 0xb9, 0x00, 0x16, 0x28, 0xbe, 0xd8, + 0x11, 0x49, 0x00, 0xeb, 0x40, 0x02, 0x51, 0xf8, 0x22, 0x20, 0x00, 0x2a, + 0xb7, 0xd0, 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, 0x80, 0x00, 0x00, 0x79, + 0x02, 0x28, 0xb0, 0xd1, 0xe0, 0x69, 0x00, 0x78, 0x01, 0x28, 0xac, 0xd8, + 0xd6, 0xf7, 0x12, 0xff, 0x21, 0x68, 0xc1, 0xf8, 0xe4, 0x00, 0xa6, 0xe7, + 0xc0, 0x00, 0x21, 0x40, 0xec, 0x10, 0x21, 0x40, 0x0c, 0x6f, 0x01, 0x00, + 0xe8, 0x65, 0x08, 0x00, 0x58, 0xd2, 0x08, 0x00, 0x44, 0x28, 0x01, 0x00, + 0xe8, 0x72, 0x01, 0x00, 0x50, 0xd2, 0x08, 0x00, 0x06, 0x48, 0x07, 0x49, + 0x07, 0x4a, 0x00, 0x78, 0x09, 0x68, 0x02, 0xf8, 0x10, 0x10, 0x06, 0x49, + 0x02, 0xeb, 0x40, 0x00, 0x09, 0x68, 0x41, 0x70, 0x00, 0xf0, 0x26, 0xb8, + 0x74, 0x87, 0x08, 0x00, 0x34, 0xa1, 0x23, 0x40, 0x48, 0xf1, 0x05, 0x00, + 0x30, 0xa1, 0x23, 0x40, 0x06, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, + 0x07, 0x49, 0x01, 0x62, 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, + 0x08, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, 0x44, 0xd2, 0x08, 0x00, + 0x8c, 0xa2, 0x04, 0x00, 0x9c, 0x0f, 0x01, 0x00, 0x9d, 0xa0, 0x04, 0x00, + 0x40, 0xd2, 0x08, 0x00, 0xac, 0xa2, 0x04, 0x00, 0x48, 0xd2, 0x08, 0x00, + 0xcc, 0xa2, 0x04, 0x00, 0x44, 0xf6, 0xcd, 0x3c, 0xc1, 0xf2, 0x0e, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x09, 0x74, 0x0d, 0x10, 0x1d, 0x3c, 0x0e, 0x10, + 0x0f, 0x7d, 0x0d, 0x10, 0x91, 0x77, 0x04, 0x00, 0xc7, 0x84, 0x0d, 0x10, + 0xf3, 0x84, 0x0d, 0x10, 0x91, 0x6a, 0x0f, 0x10, 0x33, 0x00, 0x00, 0x00, + 0x09, 0x74, 0x0d, 0x10, 0x5d, 0x44, 0x0e, 0x10, 0x07, 0x49, 0x0e, 0x10, + 0x91, 0x77, 0x04, 0x00, 0xc7, 0x84, 0x0d, 0x10, 0xf3, 0x84, 0x0d, 0x10, + 0x91, 0x6a, 0x0f, 0x10, 0x35, 0x00, 0x00, 0x00, 0x2f, 0x4a, 0x0e, 0x10, + 0x9b, 0x74, 0x0d, 0x10, 0x07, 0x49, 0x0e, 0x10, 0x91, 0x77, 0x04, 0x00, + 0xc7, 0x84, 0x0d, 0x10, 0x5f, 0x8c, 0x0d, 0x10, 0x11, 0x4a, 0x0e, 0x10, + 0x37, 0x00, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x47, + 0x48, 0xb1, 0xd0, 0xf8, 0xdc, 0x11, 0xca, 0x07, 0x05, 0xd0, 0x8a, 0x06, + 0x03, 0xd5, 0x49, 0xb2, 0xb1, 0xf1, 0xff, 0x3f, 0x01, 0xdd, 0xbd, 0xe8, + 0xf0, 0x87, 0x2e, 0x49, 0x00, 0xf5, 0xee, 0x70, 0x09, 0x68, 0x88, 0x47, + 0xdf, 0xf8, 0xb0, 0x90, 0x00, 0xf1, 0x04, 0x0a, 0xdf, 0xf8, 0xac, 0x80, + 0x99, 0xf8, 0x00, 0x00, 0xc0, 0xeb, 0x40, 0x10, 0x08, 0xeb, 0xc0, 0x00, + 0xb0, 0xf8, 0xde, 0x50, 0x90, 0xf8, 0xa1, 0x00, 0x03, 0x28, 0x10, 0xd1, + 0x48, 0x48, 0x01, 0x68, 0x08, 0x46, 0x6f, 0xf3, 0x9f, 0x50, 0x00, 0x28, + 0xdf, 0xd0, 0xb5, 0xeb, 0x91, 0x5f, 0xdc, 0xd2, 0x89, 0x0d, 0x52, 0x46, + 0x2b, 0x46, 0xbd, 0xe8, 0xf0, 0x47, 0xd6, 0xf7, 0x61, 0xbe, 0x00, 0x2d, + 0xd3, 0xd0, 0x1c, 0x48, 0x00, 0x24, 0x00, 0xf1, 0x58, 0x07, 0x10, 0x2c, + 0xcd, 0xd0, 0x99, 0xf8, 0x00, 0x00, 0xc0, 0xeb, 0x40, 0x11, 0x08, 0xeb, + 0xc1, 0x01, 0xb1, 0xf8, 0xdc, 0x10, 0x89, 0x06, 0x0b, 0xd4, 0x00, 0xeb, + 0x80, 0x01, 0x49, 0x01, 0x79, 0x58, 0x89, 0x02, 0x05, 0xd1, 0x00, 0x20, + 0x5b, 0x21, 0xd6, 0xf7, 0x33, 0xfe, 0x99, 0xf8, 0x00, 0x00, 0x00, 0xeb, + 0x80, 0x00, 0xae, 0xb2, 0x52, 0x46, 0x40, 0x01, 0x38, 0x58, 0xb6, 0xeb, + 0x90, 0x5f, 0x28, 0xbf, 0x86, 0x0d, 0x6f, 0xf3, 0x9f, 0x50, 0x31, 0x46, + 0x33, 0x46, 0xd6, 0xf7, 0x33, 0xfe, 0xad, 0x1b, 0xb2, 0x44, 0x04, 0x37, + 0x01, 0x34, 0x28, 0x04, 0xd1, 0xd1, 0xa0, 0xe7, 0xb4, 0xb5, 0x08, 0x00, + 0x74, 0x87, 0x08, 0x00, 0x0c, 0x6f, 0x01, 0x00, 0xbc, 0x65, 0x01, 0x00, + 0x70, 0xb5, 0x1f, 0x4e, 0x04, 0x46, 0x1f, 0x4d, 0x30, 0x78, 0xc0, 0xeb, + 0x40, 0x10, 0x05, 0xeb, 0xc0, 0x01, 0xd1, 0xf8, 0xc0, 0x20, 0x52, 0x79, + 0x03, 0x2a, 0x2b, 0xd1, 0x91, 0xf8, 0x91, 0x10, 0x41, 0xb3, 0x55, 0xf8, + 0x30, 0x00, 0xff, 0xf7, 0x77, 0xff, 0x30, 0x78, 0xc0, 0xeb, 0x40, 0x10, + 0x05, 0xeb, 0xc0, 0x01, 0x91, 0xf8, 0x91, 0x20, 0xe2, 0xb1, 0x91, 0xf8, + 0xa1, 0x20, 0x03, 0x2a, 0x18, 0xd1, 0xb1, 0xf8, 0xde, 0x20, 0xaa, 0xb1, + 0x91, 0xf8, 0x9f, 0x10, 0x91, 0xb1, 0x0e, 0x4e, 0x31, 0x68, 0x6f, 0xf3, + 0x9f, 0x51, 0x61, 0xb1, 0x0b, 0x78, 0x03, 0xf0, 0xfe, 0x03, 0x78, 0x2b, + 0x08, 0xd1, 0x55, 0xf8, 0x30, 0x00, 0xd2, 0xb2, 0xdd, 0xf7, 0x10, 0xf8, + 0x10, 0xb1, 0x00, 0x20, 0x30, 0x60, 0x70, 0xbd, 0x20, 0x46, 0xbd, 0xe8, + 0x70, 0x40, 0x00, 0xf0, 0x21, 0xb8, 0x00, 0xbf, 0x74, 0x87, 0x08, 0x00, + 0x0c, 0x6f, 0x01, 0x00, 0x8c, 0x59, 0x01, 0x00, 0x70, 0x47, 0x00, 0xbf, + 0x05, 0x48, 0x06, 0x49, 0xc0, 0xf8, 0xc4, 0x10, 0x05, 0x48, 0x06, 0x49, + 0x01, 0x60, 0x06, 0x48, 0x06, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0x98, 0xdf, 0x08, 0x00, 0x2f, 0xcd, 0x0d, 0x10, 0x48, 0xe4, 0x08, 0x00, + 0xd9, 0xa3, 0x04, 0x00, 0xfc, 0xb7, 0x08, 0x00, 0x65, 0xa4, 0x04, 0x00, + 0x40, 0xf6, 0x8b, 0x2c, 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0xb0, 0xb5, 0x00, 0xf0, 0x8f, 0xf9, 0x24, 0x49, 0x08, 0x78, 0xa8, 0xb1, + 0xb1, 0x48, 0x90, 0xf8, 0xca, 0x01, 0x02, 0x28, 0x10, 0xd1, 0xaa, 0x48, + 0x08, 0x4d, 0x02, 0x31, 0x0a, 0x22, 0x00, 0x78, 0x00, 0xeb, 0x00, 0x14, + 0x55, 0xf8, 0x34, 0x00, 0x94, 0x30, 0xea, 0xf7, 0x8f, 0xfd, 0x55, 0xf8, + 0x34, 0x00, 0x01, 0x21, 0x80, 0xf8, 0x93, 0x10, 0xb0, 0xbd, 0x00, 0xbf, + 0xfc, 0x6d, 0x01, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x75, 0xf9, 0x14, 0x48, + 0x01, 0x21, 0x01, 0x73, 0x00, 0x21, 0x01, 0x70, 0x80, 0xbd, 0x00, 0xbf, + 0xb0, 0xb5, 0x00, 0xf0, 0x71, 0xf9, 0x04, 0x46, 0x98, 0x48, 0x99, 0x49, + 0x00, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x01, 0xeb, 0xc0, 0x00, 0xb0, 0xf8, + 0xdc, 0x00, 0xc0, 0x07, 0x0f, 0xd0, 0x09, 0x4d, 0x00, 0x21, 0x00, 0x22, + 0xa8, 0x1c, 0x11, 0xf0, 0xf9, 0xf9, 0x10, 0xb1, 0x01, 0x20, 0x28, 0x70, + 0x05, 0xe0, 0x28, 0x78, 0x18, 0xb9, 0x00, 0x20, 0x11, 0xf0, 0xf4, 0xfa, + 0x28, 0x73, 0x20, 0x46, 0xb0, 0xbd, 0x00, 0xbf, 0x58, 0xf0, 0x05, 0x00, + 0x2d, 0xe9, 0xf0, 0x4f, 0x99, 0xb0, 0x82, 0x48, 0x00, 0x68, 0x40, 0xb1, + 0x81, 0x49, 0x09, 0x68, 0x91, 0xf8, 0x6c, 0x10, 0xc1, 0xeb, 0xc1, 0x01, + 0x00, 0xeb, 0x81, 0x00, 0x00, 0xe0, 0x12, 0xa8, 0x7d, 0x49, 0x0a, 0x88, + 0x2a, 0xb1, 0x7d, 0x49, 0x0b, 0x68, 0x93, 0x42, 0x21, 0xd2, 0x5a, 0x1c, + 0x0a, 0x60, 0x78, 0x4c, 0x21, 0x68, 0xd1, 0xf8, 0xc4, 0x20, 0x2a, 0xb1, + 0x77, 0x4b, 0x1d, 0x68, 0x95, 0x42, 0x1b, 0xd2, 0x6a, 0x1c, 0x1a, 0x60, + 0xdf, 0xf8, 0xd8, 0x81, 0xdf, 0xf8, 0xd8, 0xa1, 0x98, 0xf8, 0x00, 0x20, + 0xc2, 0xeb, 0x42, 0x12, 0x0a, 0xeb, 0xc2, 0x03, 0xb3, 0xf8, 0xdc, 0x20, + 0xd7, 0x07, 0x01, 0xd0, 0x95, 0x07, 0x15, 0xd4, 0x87, 0xb9, 0x41, 0x68, + 0x01, 0x31, 0x41, 0x60, 0xc5, 0xe0, 0x93, 0x42, 0x09, 0xd1, 0x58, 0x1c, + 0x08, 0x60, 0x02, 0xe0, 0x05, 0xd1, 0x50, 0x1c, 0x18, 0x60, 0x67, 0x48, + 0x00, 0x68, 0x80, 0x47, 0xb9, 0xe0, 0xb8, 0xe0, 0x81, 0x68, 0x01, 0x31, + 0x81, 0x60, 0xb4, 0xe0, 0x93, 0xf8, 0xe0, 0x30, 0x02, 0x2b, 0x05, 0xd3, + 0x12, 0x07, 0x03, 0xd4, 0xc2, 0x68, 0x01, 0x32, 0xc2, 0x60, 0x02, 0xe0, + 0x02, 0x68, 0x01, 0x32, 0x02, 0x60, 0x08, 0x69, 0x00, 0x79, 0x18, 0xb3, + 0x98, 0xf8, 0x00, 0x00, 0xc0, 0xeb, 0x40, 0x10, 0x0a, 0xeb, 0xc0, 0x00, + 0x00, 0xf1, 0xc0, 0x01, 0x59, 0x48, 0xd0, 0xf8, 0x00, 0x90, 0x59, 0x48, + 0xd0, 0xf8, 0x00, 0xb0, 0x58, 0x48, 0x02, 0x68, 0x0b, 0xa8, 0x90, 0x47, + 0x0b, 0xaf, 0xdd, 0xe9, 0x10, 0x65, 0x8f, 0xcf, 0xcd, 0xe9, 0x00, 0x76, + 0x02, 0x95, 0xd8, 0x47, 0x53, 0x49, 0xca, 0x78, 0x21, 0x68, 0x09, 0x69, + 0x02, 0x31, 0xc8, 0x47, 0x21, 0x68, 0x09, 0x69, 0x08, 0x70, 0x1e, 0xe0, + 0x98, 0xf8, 0x00, 0x00, 0xc0, 0xeb, 0x40, 0x10, 0x0a, 0xeb, 0xc0, 0x00, + 0x00, 0xf1, 0xc0, 0x01, 0x48, 0x48, 0xd0, 0xf8, 0x00, 0x90, 0x48, 0x48, + 0x02, 0x68, 0x04, 0xa8, 0x90, 0x47, 0x04, 0xaf, 0x0a, 0x9d, 0xcf, 0xcf, + 0xcd, 0xe9, 0x00, 0x67, 0x02, 0x95, 0xc8, 0x47, 0x21, 0x68, 0x01, 0x22, + 0x09, 0x69, 0x0a, 0x71, 0x41, 0x4a, 0x08, 0x70, 0xd2, 0x78, 0x90, 0x40, + 0x48, 0x80, 0x98, 0xf8, 0x00, 0x00, 0xc0, 0xeb, 0x40, 0x10, 0x0a, 0xeb, + 0xc0, 0x00, 0xb0, 0xf8, 0xdc, 0x10, 0x0a, 0x07, 0x28, 0xd5, 0x90, 0xf8, + 0xa1, 0x20, 0x03, 0x2a, 0x24, 0xd1, 0xd0, 0xf8, 0xc0, 0x20, 0x52, 0x79, + 0x03, 0x2a, 0x1f, 0xd1, 0x49, 0xb2, 0x00, 0x29, 0x1c, 0xd4, 0xb0, 0xf8, + 0xde, 0x00, 0x00, 0x28, 0x47, 0xd0, 0x33, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x00, 0x28, 0x45, 0xd0, 0x98, 0xf8, 0x00, 0x10, 0xc1, 0xeb, 0x41, 0x11, + 0x0a, 0xeb, 0xc1, 0x02, 0x92, 0xf8, 0xde, 0x20, 0x82, 0x70, 0x5a, 0xf8, + 0x31, 0x10, 0x14, 0x31, 0xd8, 0xf7, 0x7c, 0xfe, 0x2a, 0x48, 0x06, 0x21, + 0x00, 0x78, 0xd6, 0xf7, 0xa7, 0xfc, 0x07, 0xe0, 0x28, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x20, 0x68, 0x41, 0x69, 0x41, 0xf0, 0x80, 0x41, 0x41, 0x61, + 0x25, 0x48, 0x00, 0x68, 0x18, 0xb3, 0x98, 0xf8, 0x00, 0x10, 0xc1, 0xeb, + 0x41, 0x11, 0x0a, 0xeb, 0xc1, 0x01, 0x91, 0xf8, 0xe0, 0x10, 0x00, 0xeb, + 0x81, 0x01, 0xd1, 0xf8, 0xc8, 0x21, 0x01, 0x32, 0xc1, 0xf8, 0xc8, 0x21, + 0x21, 0x68, 0x91, 0xf8, 0x8e, 0x10, 0x03, 0x29, 0x88, 0xbf, 0x00, 0x21, + 0x00, 0xeb, 0x41, 0x10, 0x98, 0xf8, 0x00, 0x10, 0xc1, 0xeb, 0x41, 0x11, + 0x0a, 0xeb, 0xc1, 0x01, 0x91, 0xf8, 0xe0, 0x10, 0x00, 0xeb, 0x41, 0x00, + 0x01, 0x8f, 0x01, 0x31, 0x01, 0x87, 0x19, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x00, 0x20, 0x4f, 0xf4, 0xaf, 0x71, 0xdc, 0xf7, 0xb9, 0xfa, 0xf6, 0xe7, + 0x04, 0x36, 0x01, 0x00, 0xf8, 0x35, 0x01, 0x00, 0x88, 0x5a, 0x01, 0x00, + 0xec, 0x35, 0x01, 0x00, 0x00, 0xb8, 0x08, 0x00, 0x74, 0x87, 0x08, 0x00, + 0x0c, 0x6f, 0x01, 0x00, 0x10, 0xb8, 0x08, 0x00, 0x1c, 0xb8, 0x08, 0x00, + 0x18, 0xb8, 0x08, 0x00, 0x00, 0x69, 0x08, 0x00, 0x34, 0xb8, 0x08, 0x00, + 0x67, 0x34, 0x01, 0x00, 0xb8, 0xd6, 0x08, 0x00, 0x08, 0x36, 0x01, 0x00, + 0x06, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x07, 0x49, 0x01, 0x60, + 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, + 0x70, 0x47, 0x00, 0xbf, 0xfc, 0xe3, 0x08, 0x00, 0x0c, 0xa8, 0x04, 0x00, + 0xe4, 0xb9, 0x08, 0x00, 0xec, 0xa7, 0x04, 0x00, 0x88, 0xd3, 0x08, 0x00, + 0x2c, 0xa8, 0x04, 0x00, 0xf4, 0xe3, 0x08, 0x00, 0x41, 0xa5, 0x04, 0x00, + 0x4a, 0xf6, 0x13, 0x3c, 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4b, 0xf2, 0x41, 0x7c, 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4b, 0xf6, 0x2d, 0x0c, 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0xa5, 0xa4, 0x04, 0x00, 0xdd, 0xb8, 0x0d, 0x10, 0xf9, 0xbb, 0x0d, 0x10, + 0x47, 0xbc, 0x0d, 0x10, 0x99, 0xbc, 0x0d, 0x10, 0x3b, 0xbd, 0x0d, 0x10, + 0x91, 0x6a, 0x0f, 0x10, 0x4b, 0x00, 0x00, 0x00, 0xe5, 0xa4, 0x04, 0x00, + 0x93, 0xb7, 0x0d, 0x10, 0x0f, 0x7d, 0x0d, 0x10, 0xf9, 0xa4, 0x04, 0x00, + 0xf1, 0xb1, 0x0d, 0x10, 0xf1, 0xb4, 0x0d, 0x10, 0x91, 0x6a, 0x0f, 0x10, + 0x2e, 0x00, 0x00, 0x00, 0xc1, 0x8b, 0x0d, 0x10, 0xdd, 0xb9, 0x0d, 0x10, + 0xf9, 0xba, 0x0d, 0x10, 0xf9, 0xa4, 0x04, 0x00, 0x99, 0xbc, 0x0d, 0x10, + 0x4d, 0xbd, 0x0d, 0x10, 0x91, 0x6a, 0x0f, 0x10, 0x4c, 0x00, 0x00, 0x00, + 0x70, 0xb5, 0x82, 0x6e, 0x0c, 0x68, 0xd0, 0xf8, 0xd4, 0x30, 0xa2, 0x1a, + 0xc2, 0xf3, 0x99, 0x05, 0xb0, 0xf8, 0x54, 0x24, 0x54, 0x08, 0xb5, 0xeb, + 0x52, 0x0f, 0x07, 0xd3, 0x90, 0xf8, 0x88, 0x24, 0x12, 0x07, 0x44, 0xbf, + 0xca, 0x7c, 0x5f, 0xea, 0x82, 0x72, 0x15, 0xd4, 0x1d, 0xb1, 0xbd, 0xe8, + 0x70, 0x40, 0x00, 0xf0, 0x31, 0xb9, 0x5a, 0x7f, 0x00, 0x2a, 0xf8, 0xd0, + 0xb3, 0xf8, 0x6a, 0x30, 0x0b, 0x4a, 0x40, 0xf2, 0xe2, 0x45, 0x14, 0xfb, + 0x05, 0x22, 0x03, 0xf5, 0x9c, 0x73, 0x93, 0x42, 0xed, 0xd3, 0x02, 0x22, + 0x10, 0x46, 0x70, 0xbd, 0x01, 0x2c, 0xe7, 0xd1, 0xb0, 0xf8, 0x56, 0x64, + 0x05, 0x2e, 0xe3, 0xd8, 0x01, 0x22, 0x02, 0xeb, 0x56, 0x06, 0xb5, 0x42, + 0xde, 0xd2, 0xf1, 0xe7, 0x1e, 0xfb, 0xff, 0xff, 0x41, 0x68, 0x09, 0x4b, + 0x91, 0xf8, 0x35, 0x21, 0x02, 0xeb, 0x42, 0x02, 0x03, 0xeb, 0x42, 0x12, + 0x06, 0x4b, 0x92, 0x7b, 0x93, 0xf8, 0x57, 0x31, 0x9a, 0x42, 0x03, 0xd3, + 0x04, 0x4a, 0x12, 0x6a, 0xc1, 0xf8, 0x88, 0x23, 0x00, 0xf0, 0x04, 0xb9, + 0x54, 0xf1, 0x05, 0x00, 0xe8, 0x65, 0x08, 0x00, 0xfc, 0x70, 0x01, 0x00, + 0x2d, 0xe9, 0xf0, 0x47, 0x04, 0x46, 0x80, 0x6e, 0x89, 0x46, 0xd4, 0xf8, + 0xf8, 0x80, 0x41, 0x1a, 0x09, 0x01, 0x4f, 0xea, 0x48, 0x07, 0x15, 0xd5, + 0xdf, 0xf8, 0x94, 0xa1, 0x04, 0xf5, 0x94, 0x76, 0x01, 0x25, 0x38, 0x44, + 0xe9, 0xb2, 0x20, 0xf0, 0x70, 0x40, 0x02, 0x29, 0xa0, 0x66, 0x04, 0xd3, + 0xda, 0xf8, 0x00, 0x10, 0x30, 0x46, 0x88, 0x47, 0xa0, 0x6e, 0xa0, 0xeb, + 0x09, 0x01, 0x01, 0x35, 0x09, 0x01, 0xee, 0xd4, 0x5b, 0x49, 0x91, 0xf8, + 0xec, 0x22, 0x00, 0x2a, 0x57, 0xd0, 0x5a, 0x4a, 0x92, 0xf8, 0xfe, 0x26, + 0x00, 0x2a, 0x52, 0xd0, 0x91, 0xf8, 0xee, 0x12, 0x00, 0x29, 0x4e, 0xd0, + 0x94, 0xf8, 0x88, 0x14, 0x09, 0x07, 0x4a, 0xd5, 0xd4, 0xf8, 0xd4, 0x10, + 0x4a, 0x7f, 0x0a, 0xb3, 0xd4, 0xf8, 0xf8, 0x20, 0x0f, 0x2a, 0x14, 0xd8, + 0xb1, 0xf8, 0x6a, 0x10, 0x41, 0xf2, 0x88, 0x32, 0x02, 0xeb, 0x81, 0x01, + 0x40, 0xf2, 0xe2, 0x42, 0x08, 0xfb, 0x02, 0xf2, 0xb1, 0xeb, 0x52, 0x0f, + 0x07, 0xd3, 0x52, 0x08, 0xb1, 0xfb, 0xf2, 0xf1, 0x01, 0xfb, 0x07, 0x00, + 0x20, 0xf0, 0x70, 0x40, 0xa0, 0x66, 0x20, 0x6a, 0xf0, 0xb9, 0xa0, 0x68, + 0xe0, 0xb9, 0x44, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0xb8, 0xb9, + 0xd4, 0xf8, 0xf8, 0x00, 0x0f, 0x28, 0x13, 0xd8, 0x40, 0x4a, 0xa0, 0x6e, + 0x52, 0x68, 0xa0, 0xeb, 0x88, 0x01, 0x89, 0x1a, 0x21, 0xf0, 0x70, 0x41, + 0xb1, 0xf1, 0x00, 0x6f, 0x08, 0xd9, 0x38, 0x44, 0x20, 0xf0, 0x70, 0x40, + 0xa0, 0x66, 0x35, 0x48, 0x01, 0x68, 0x04, 0xf5, 0x94, 0x70, 0x88, 0x47, + 0xd4, 0xf8, 0xd4, 0x20, 0xa0, 0x6e, 0x51, 0x7f, 0x00, 0x29, 0x01, 0x46, + 0x03, 0xd0, 0x51, 0x69, 0x41, 0x1a, 0x21, 0xf0, 0x70, 0x41, 0x31, 0x4a, + 0xd1, 0x60, 0xd4, 0xf8, 0xa8, 0x13, 0x01, 0x31, 0x4d, 0xd0, 0xd4, 0xe9, + 0x35, 0x16, 0x4f, 0x69, 0x94, 0xf8, 0xb2, 0x13, 0x0a, 0x07, 0x08, 0xd5, + 0xd4, 0xf8, 0xa0, 0x23, 0x80, 0x1a, 0x00, 0x01, 0x5c, 0xbf, 0x01, 0xf0, + 0xf7, 0x00, 0x84, 0xf8, 0xb2, 0x03, 0xb4, 0xf8, 0xa6, 0x03, 0x01, 0x28, + 0x14, 0xd1, 0x20, 0x6a, 0x90, 0xb9, 0x22, 0x48, 0x01, 0x68, 0x20, 0x46, + 0x88, 0x47, 0x68, 0xb9, 0xa0, 0x68, 0x58, 0xb9, 0x94, 0xf8, 0xb2, 0x03, + 0xc1, 0x07, 0x07, 0xd1, 0x01, 0x07, 0x5e, 0xbf, 0x5f, 0xea, 0x80, 0x60, + 0xb4, 0xf8, 0xa4, 0x03, 0xa4, 0xf8, 0xa6, 0x03, 0xd4, 0xf8, 0xa8, 0x03, + 0xa9, 0xeb, 0x00, 0x01, 0x09, 0x01, 0x0e, 0xd4, 0xb4, 0xf8, 0xa4, 0x13, + 0xd4, 0xf8, 0xf8, 0x20, 0x51, 0x43, 0x49, 0x00, 0x42, 0x18, 0x22, 0xf0, + 0x70, 0x40, 0xa9, 0xeb, 0x02, 0x02, 0x12, 0x01, 0xf8, 0xd5, 0xc4, 0xf8, + 0xa8, 0x03, 0xd4, 0xf8, 0xf0, 0x10, 0x39, 0xb1, 0xba, 0x19, 0x82, 0x1a, + 0x51, 0x1a, 0x21, 0xf0, 0x70, 0x41, 0xb1, 0xf1, 0x00, 0x6f, 0x06, 0xd9, + 0xb4, 0xf8, 0xa6, 0x13, 0x01, 0x29, 0x18, 0xbf, 0xa0, 0x66, 0xbd, 0xe8, + 0xf0, 0x87, 0x01, 0x20, 0xa4, 0xf8, 0xa6, 0x03, 0xbd, 0xe8, 0xf0, 0x87, + 0x50, 0xd2, 0x08, 0x00, 0x8c, 0x7e, 0x08, 0x00, 0x38, 0x21, 0x01, 0x00, + 0x4c, 0x9d, 0x08, 0x00, 0x50, 0x2e, 0x01, 0x00, 0x04, 0x48, 0x05, 0x49, + 0x41, 0x66, 0x05, 0x48, 0x05, 0x49, 0x01, 0x60, 0x05, 0x48, 0x06, 0x49, + 0x01, 0x60, 0x70, 0x47, 0x98, 0xdf, 0x08, 0x00, 0xc1, 0xa8, 0x04, 0x00, + 0xb0, 0xe4, 0x08, 0x00, 0x4d, 0xa8, 0x04, 0x00, 0x08, 0xc0, 0x08, 0x00, + 0xf5, 0xa8, 0x04, 0x00, 0x42, 0xf2, 0x5d, 0x0c, 0xc1, 0xf2, 0x0e, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf6, 0x4f, 0x7c, 0xc1, 0xf2, 0x0e, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x02, 0x49, 0x0a, 0x68, 0x01, 0x32, 0x0a, 0x60, + 0x00, 0xf0, 0x88, 0xb8, 0x84, 0xf0, 0x05, 0x00, 0x70, 0xb5, 0x34, 0x4c, + 0x34, 0x4d, 0x21, 0x78, 0xc1, 0xeb, 0x41, 0x11, 0x05, 0xeb, 0xc1, 0x01, + 0xb1, 0xf8, 0xdc, 0x10, 0xc9, 0x07, 0x09, 0xd1, 0x37, 0x48, 0x00, 0x68, + 0x20, 0xb1, 0xd0, 0xf8, 0x7c, 0x11, 0x01, 0x31, 0xc0, 0xf8, 0x7c, 0x11, + 0x00, 0x24, 0x51, 0xe0, 0x90, 0xf8, 0x84, 0x00, 0x2a, 0x49, 0x00, 0xeb, + 0x40, 0x00, 0x01, 0xeb, 0xc0, 0x00, 0x40, 0x68, 0x80, 0x47, 0x20, 0x78, + 0x27, 0x4b, 0xc0, 0xeb, 0x40, 0x11, 0x05, 0xeb, 0xc1, 0x01, 0x91, 0xf8, + 0xe0, 0x20, 0x03, 0xeb, 0xc2, 0x02, 0xc1, 0xf8, 0xc0, 0x20, 0x23, 0x49, + 0x01, 0xeb, 0x40, 0x11, 0x89, 0x7d, 0x21, 0xb3, 0x21, 0x4e, 0x00, 0xeb, + 0x00, 0x10, 0x27, 0x49, 0x06, 0xeb, 0xc0, 0x00, 0x09, 0x68, 0x00, 0x69, + 0x88, 0x42, 0x20, 0xd0, 0x1d, 0x49, 0x09, 0x68, 0x88, 0x42, 0x1c, 0xd0, + 0x1c, 0x48, 0x81, 0x6e, 0x21, 0xf4, 0x80, 0x71, 0x81, 0x66, 0x4f, 0xf4, + 0x80, 0x71, 0x41, 0x66, 0x00, 0x21, 0x01, 0x60, 0x20, 0x78, 0x01, 0x24, + 0xc0, 0xeb, 0x40, 0x10, 0x05, 0xeb, 0xc0, 0x00, 0xb0, 0xf8, 0xdc, 0x10, + 0x41, 0xf0, 0x40, 0x01, 0xa0, 0xf8, 0xdc, 0x10, 0x12, 0xe0, 0x12, 0x48, + 0x01, 0x24, 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, 0x0c, 0xe0, 0x0f, 0x48, + 0x01, 0x68, 0x00, 0x20, 0x88, 0x47, 0x20, 0x78, 0x25, 0x21, 0x01, 0x24, + 0x00, 0xeb, 0x00, 0x10, 0x06, 0xeb, 0xc0, 0x00, 0x80, 0xf8, 0x49, 0x10, + 0x20, 0x46, 0x70, 0xbd, 0x74, 0x87, 0x08, 0x00, 0x0c, 0x6f, 0x01, 0x00, + 0x28, 0xd6, 0x08, 0x00, 0x86, 0x71, 0x0d, 0x10, 0xe0, 0x58, 0x01, 0x00, + 0xfc, 0x6d, 0x01, 0x00, 0x58, 0xb7, 0x08, 0x00, 0x60, 0x20, 0x21, 0x40, + 0x00, 0xe4, 0x08, 0x00, 0x08, 0x36, 0x01, 0x00, 0x01, 0x48, 0x02, 0x49, + 0x01, 0x60, 0x70, 0x47, 0x54, 0xb7, 0x08, 0x00, 0xa0, 0xd3, 0x05, 0x00, + 0x4c, 0xf2, 0x99, 0x0c, 0xc1, 0xf2, 0x0d, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x70, 0xb5, 0x04, 0x46, 0x57, 0x48, 0x00, 0x68, 0x00, 0x01, 0x00, 0xf1, + 0x81, 0x80, 0x59, 0x48, 0x01, 0x68, 0x20, 0x68, 0x09, 0x05, 0x7c, 0xd4, + 0x60, 0xb1, 0xd0, 0xf8, 0xcc, 0x11, 0x21, 0xf0, 0x0f, 0x01, 0xc0, 0xf8, + 0xcc, 0x11, 0x20, 0x68, 0xd0, 0xf8, 0xcc, 0x11, 0x41, 0xf0, 0x03, 0x01, + 0xc0, 0xf8, 0xcc, 0x11, 0x50, 0x4d, 0x95, 0xf8, 0x21, 0x00, 0x01, 0x28, + 0x40, 0xf0, 0x86, 0x80, 0xa8, 0x68, 0x49, 0x49, 0xd0, 0xf8, 0xcc, 0x01, + 0x88, 0x60, 0x95, 0xf8, 0x20, 0x00, 0xc1, 0x07, 0x7c, 0xd0, 0x40, 0x07, + 0x7a, 0xd5, 0x45, 0x48, 0x48, 0x49, 0x00, 0x78, 0xc0, 0xeb, 0x40, 0x10, + 0x01, 0xeb, 0xc0, 0x00, 0x46, 0x49, 0x00, 0x69, 0x09, 0x68, 0x88, 0x42, + 0x6e, 0xd1, 0x28, 0x68, 0x00, 0x26, 0x01, 0x7b, 0x80, 0x68, 0x00, 0xeb, + 0x81, 0x02, 0x89, 0x00, 0xc2, 0xf8, 0x94, 0x60, 0x01, 0x22, 0x02, 0xfa, + 0x01, 0xf1, 0xd0, 0xf8, 0x90, 0x20, 0x22, 0xea, 0x01, 0x01, 0xc0, 0xf8, + 0x90, 0x10, 0x3c, 0x48, 0x00, 0x68, 0x80, 0x47, 0x3b, 0x48, 0xa9, 0x68, + 0x01, 0x22, 0x03, 0x68, 0x88, 0x20, 0x98, 0x47, 0xa8, 0x68, 0x90, 0xf8, + 0x24, 0x11, 0x69, 0xb1, 0x90, 0xf8, 0xc0, 0x10, 0x51, 0xb9, 0x90, 0xf8, + 0xc1, 0x10, 0x41, 0xf0, 0x10, 0x01, 0x80, 0xf8, 0xc1, 0x10, 0x33, 0x49, + 0xb8, 0x30, 0x0a, 0x68, 0x03, 0x21, 0x90, 0x47, 0x95, 0xf8, 0x20, 0x00, + 0x00, 0xf0, 0xde, 0x00, 0x20, 0x30, 0x85, 0xf8, 0x20, 0x00, 0x20, 0x68, + 0xc0, 0xf8, 0x90, 0x62, 0x26, 0x68, 0xd6, 0xf8, 0xe8, 0x43, 0x54, 0xb1, + 0x2a, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x21, 0x7d, 0x00, 0x20, + 0x20, 0x61, 0x20, 0x75, 0xc6, 0xf8, 0xe8, 0x03, 0xa1, 0x75, 0xa8, 0x68, + 0x84, 0x68, 0x2c, 0xb3, 0x21, 0x79, 0x01, 0xf0, 0xfe, 0x01, 0x78, 0x29, + 0x21, 0xd0, 0x54, 0xf8, 0x04, 0x4c, 0xf6, 0xe7, 0x20, 0x68, 0x60, 0xb1, + 0xd0, 0xf8, 0xcc, 0x11, 0x21, 0xf0, 0x0f, 0x01, 0xc0, 0xf8, 0xcc, 0x11, + 0x20, 0x68, 0xd0, 0xf8, 0xcc, 0x11, 0x41, 0xf0, 0x05, 0x01, 0xc0, 0xf8, + 0xcc, 0x11, 0x0e, 0x48, 0x81, 0x7c, 0x01, 0x31, 0x81, 0x74, 0x0d, 0x48, + 0x0d, 0x49, 0x00, 0x78, 0x00, 0xeb, 0x80, 0x00, 0x01, 0xeb, 0xc0, 0x00, + 0xc1, 0x69, 0x41, 0xf4, 0x80, 0x11, 0xc1, 0x61, 0x70, 0xbd, 0x11, 0x49, + 0x08, 0x30, 0x0a, 0x68, 0x21, 0x46, 0x90, 0x47, 0x20, 0x46, 0xbd, 0xe8, + 0x70, 0x40, 0xdb, 0xf7, 0xbb, 0xbf, 0x00, 0xbf, 0xec, 0x10, 0x21, 0x40, + 0x1c, 0x7a, 0x01, 0x00, 0x74, 0x87, 0x08, 0x00, 0x84, 0x71, 0x01, 0x00, + 0xcc, 0x20, 0x21, 0x40, 0xd8, 0x5d, 0x01, 0x00, 0x0c, 0x6f, 0x01, 0x00, + 0x74, 0xe4, 0x08, 0x00, 0xb8, 0xa0, 0x08, 0x00, 0xa8, 0xa0, 0x08, 0x00, + 0xbc, 0xa0, 0x08, 0x00, 0xc8, 0xa0, 0x08, 0x00, 0xe8, 0xa0, 0x08, 0x00, + 0x01, 0x48, 0x02, 0x49, 0x81, 0x62, 0x70, 0x47, 0x9c, 0x0f, 0x01, 0x00, + 0x25, 0xac, 0x04, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x17, 0xf8, 0x05, 0x48, + 0x90, 0xf8, 0x21, 0x00, 0x00, 0xb1, 0x80, 0xbd, 0x03, 0x48, 0x00, 0x68, + 0xbd, 0xe8, 0x80, 0x40, 0x00, 0x47, 0x00, 0xbf, 0xd8, 0x5d, 0x01, 0x00, + 0xb8, 0xa0, 0x08, 0x00, 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, + 0x8c, 0xe4, 0x08, 0x00, 0xcd, 0xad, 0x04, 0x00, 0x40, 0xf2, 0xd5, 0x0c, + 0xc1, 0xf2, 0x0e, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x00, 0xf0, 0xa8, 0xb8, + 0xb0, 0xb5, 0x28, 0xb3, 0x04, 0x46, 0x90, 0xf8, 0x35, 0x01, 0x17, 0x4d, + 0x00, 0xeb, 0x40, 0x00, 0x40, 0x01, 0x28, 0x58, 0x40, 0xb1, 0xdb, 0xf7, + 0x69, 0xff, 0x94, 0xf8, 0x35, 0x01, 0x00, 0x21, 0x00, 0xeb, 0x40, 0x00, + 0x40, 0x01, 0x29, 0x50, 0x20, 0x46, 0x00, 0xf0, 0x97, 0xf8, 0x0f, 0x48, + 0x00, 0x21, 0x00, 0x22, 0x04, 0x30, 0x50, 0xf8, 0x04, 0x3c, 0x1b, 0xb1, + 0x03, 0x78, 0x01, 0x2b, 0x08, 0xbf, 0x1a, 0x46, 0x01, 0x31, 0x0c, 0x30, + 0x17, 0x29, 0xf4, 0xd1, 0x10, 0x06, 0x00, 0xd0, 0xb0, 0xbd, 0x07, 0x48, + 0x01, 0x68, 0x41, 0xf0, 0x01, 0x01, 0x01, 0x60, 0x05, 0x48, 0x00, 0x68, + 0xbd, 0xe8, 0xb0, 0x40, 0x00, 0x47, 0x00, 0xbf, 0x54, 0xf1, 0x05, 0x00, + 0xe8, 0x72, 0x01, 0x00, 0x68, 0xf0, 0x05, 0x00, 0x40, 0xe4, 0x08, 0x00, + 0xb0, 0xb5, 0x0d, 0x46, 0x04, 0x46, 0x00, 0xf0, 0x73, 0xf8, 0x0f, 0x48, + 0x90, 0xf8, 0x3e, 0x00, 0xc0, 0x06, 0x17, 0xd5, 0x95, 0xf8, 0x31, 0x10, + 0x95, 0xf8, 0x30, 0x00, 0x6f, 0xf0, 0x02, 0x03, 0x6f, 0xf0, 0x02, 0x02, + 0xff, 0x29, 0x08, 0xbf, 0x4f, 0xf0, 0xff, 0x33, 0x00, 0x29, 0x08, 0xbf, + 0x0b, 0x46, 0xe3, 0x72, 0xff, 0x28, 0x08, 0xbf, 0x4f, 0xf0, 0xff, 0x32, + 0x00, 0x28, 0x08, 0xbf, 0x02, 0x46, 0xa2, 0x72, 0xb0, 0xbd, 0x00, 0xbf, + 0x40, 0x86, 0x08, 0x00, 0x10, 0xb5, 0x04, 0x46, 0x00, 0xf0, 0x54, 0xf8, + 0x94, 0xf8, 0x76, 0x10, 0x81, 0x42, 0x38, 0xbf, 0x08, 0x46, 0x10, 0xbd, + 0x0a, 0x69, 0xb2, 0xf1, 0xff, 0x3f, 0x00, 0xdd, 0x70, 0x47, 0x13, 0x1a, + 0x1b, 0x01, 0x0a, 0xd5, 0x22, 0xf0, 0x70, 0x42, 0x82, 0x1a, 0xb2, 0xf1, + 0x00, 0x6f, 0x04, 0xd9, 0x0a, 0x8b, 0x01, 0x32, 0x6f, 0xf3, 0xdf, 0x22, + 0x0a, 0x83, 0x40, 0xf0, 0x00, 0x42, 0x0a, 0x61, 0x70, 0x47, 0x00, 0xbf, + 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, + 0x08, 0x48, 0x09, 0x49, 0x01, 0x60, 0x09, 0x48, 0x09, 0x49, 0x01, 0x60, + 0x09, 0x48, 0x0a, 0x49, 0x01, 0x60, 0x70, 0x47, 0x8c, 0xda, 0x08, 0x00, + 0x11, 0xae, 0x04, 0x00, 0xa0, 0xce, 0x08, 0x00, 0x0d, 0xae, 0x04, 0x00, + 0x94, 0xda, 0x08, 0x00, 0x89, 0xae, 0x04, 0x00, 0xd0, 0xdc, 0x08, 0x00, + 0xd5, 0xae, 0x04, 0x00, 0xd8, 0xe5, 0x08, 0x00, 0xe9, 0xae, 0x04, 0x00, + 0x48, 0xf2, 0x11, 0x3c, 0xc1, 0xf2, 0x0e, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x47, 0xf6, 0x41, 0x1c, 0xc1, 0xf2, 0x0e, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x47, 0xf6, 0xcd, 0x3c, 0xc1, 0xf2, 0x0e, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x4c, 0xf6, 0x61, 0x1c, 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x80, 0xb5, 0x01, 0xf0, 0x6d, 0xf9, 0x2c, 0x48, 0x00, 0x21, 0xc0, 0xe9, + 0x00, 0x11, 0x81, 0x60, 0x80, 0xbd, 0x00, 0xbf, 0x2d, 0xe9, 0xf0, 0x41, + 0x99, 0x4e, 0x04, 0x46, 0x30, 0x78, 0x40, 0x07, 0x44, 0xd5, 0x94, 0xf8, + 0x32, 0x54, 0xdf, 0xf8, 0x88, 0x80, 0x05, 0xeb, 0x45, 0x00, 0x08, 0xeb, + 0x80, 0x00, 0x80, 0x68, 0x01, 0x30, 0x0b, 0xd0, 0xd6, 0xf7, 0x24, 0xf8, + 0x94, 0xf8, 0x32, 0x54, 0x05, 0xeb, 0x45, 0x01, 0x08, 0xeb, 0x81, 0x01, + 0x89, 0x68, 0x40, 0x1a, 0x00, 0x01, 0x2d, 0xd4, 0x6e, 0x4f, 0xd7, 0xf8, + 0x94, 0x00, 0x50, 0xb1, 0x16, 0x48, 0x03, 0x21, 0x02, 0x68, 0x20, 0x46, + 0x90, 0x47, 0x00, 0x20, 0x94, 0xf8, 0x32, 0x54, 0x47, 0xf8, 0x90, 0x0f, + 0x78, 0x60, 0xf0, 0x88, 0x05, 0xeb, 0x45, 0x07, 0xd8, 0xf7, 0xd0, 0xf9, + 0x06, 0x46, 0x58, 0xf8, 0x27, 0x00, 0x31, 0x46, 0x01, 0xf0, 0x34, 0xf9, + 0x28, 0xb9, 0x0c, 0x48, 0x31, 0x46, 0x00, 0x68, 0x01, 0xf0, 0x2e, 0xf9, + 0x30, 0xb1, 0x08, 0x48, 0x03, 0x21, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, + 0x94, 0xf8, 0x32, 0x54, 0x06, 0x48, 0x01, 0x68, 0x28, 0x46, 0xbd, 0xe8, + 0xf0, 0x41, 0x08, 0x47, 0xbd, 0xe8, 0xf0, 0x81, 0x10, 0x5e, 0x01, 0x00, + 0xe8, 0xcd, 0x08, 0x00, 0x6c, 0xf0, 0x05, 0x00, 0xec, 0xcd, 0x08, 0x00, + 0xf8, 0xb5, 0x04, 0x46, 0x51, 0x48, 0x00, 0x22, 0x01, 0x46, 0x51, 0xf8, + 0x6c, 0x5f, 0x4e, 0x7b, 0x09, 0x2e, 0x65, 0xd8, 0x00, 0x23, 0xdf, 0xe8, + 0x06, 0xf0, 0x05, 0x64, 0x34, 0x64, 0x64, 0x64, 0x64, 0x64, 0x28, 0x48, + 0x0a, 0x7f, 0x03, 0x2a, 0x59, 0xd1, 0x4a, 0x7f, 0x03, 0x2a, 0x56, 0xd1, + 0x8a, 0x7f, 0x00, 0x2a, 0x53, 0xd1, 0xca, 0x7f, 0x01, 0x2a, 0x50, 0xd1, + 0x4a, 0xf6, 0x44, 0x43, 0x00, 0x22, 0x9d, 0x42, 0x76, 0xd0, 0x4b, 0xf6, + 0x80, 0x33, 0x9d, 0x42, 0x4f, 0xf0, 0x00, 0x03, 0x47, 0xd1, 0x91, 0xf8, + 0x20, 0x30, 0x00, 0x22, 0x33, 0x2b, 0x4f, 0xf0, 0x00, 0x03, 0x04, 0xbf, + 0x4a, 0xf6, 0x80, 0x43, 0x40, 0xf2, 0x0b, 0x42, 0x3b, 0xe0, 0x4b, 0xf6, + 0x80, 0x32, 0x95, 0x42, 0x27, 0xd0, 0x4a, 0xf6, 0x44, 0x42, 0x95, 0x42, + 0x31, 0xd1, 0x4a, 0xf6, 0xcc, 0x63, 0x8c, 0x22, 0x2f, 0xe0, 0x4a, 0xf6, + 0x44, 0x42, 0x95, 0x42, 0x1f, 0xd0, 0x4b, 0xf6, 0x80, 0x32, 0x95, 0x42, + 0x25, 0xd1, 0x8b, 0x69, 0x2f, 0x4d, 0x00, 0x22, 0xab, 0x42, 0x4f, 0xf0, + 0x00, 0x03, 0x04, 0xbf, 0x4f, 0xf4, 0xa5, 0x43, 0x4f, 0xf4, 0x96, 0x72, + 0x1b, 0xe0, 0x4b, 0xf6, 0x80, 0x32, 0x95, 0x42, 0x36, 0xd0, 0x4a, 0xf6, + 0x44, 0x42, 0x95, 0x42, 0x11, 0xd1, 0x25, 0x4b, 0x40, 0xf2, 0x91, 0x42, + 0x0f, 0xe0, 0x4f, 0xf4, 0x3e, 0x43, 0x60, 0x22, 0x0b, 0xe0, 0x8a, 0x69, + 0x21, 0x4b, 0x9a, 0x42, 0x2b, 0xd0, 0x21, 0x4b, 0x9a, 0x42, 0x02, 0xd1, + 0x4a, 0xf2, 0xbc, 0x13, 0x27, 0xe0, 0x00, 0x22, 0x00, 0x23, 0x4e, 0x6a, + 0x9e, 0x42, 0x94, 0xbf, 0x9d, 0x1b, 0xf5, 0x1a, 0xba, 0xb1, 0x9e, 0x42, + 0x15, 0xd2, 0x95, 0x42, 0x13, 0xd9, 0x8a, 0x6a, 0x00, 0xf1, 0x90, 0x03, + 0x40, 0xf6, 0x11, 0x10, 0x2a, 0x44, 0x8a, 0x62, 0x15, 0x49, 0x00, 0x22, + 0x0d, 0x68, 0x08, 0x21, 0x00, 0x91, 0x01, 0x21, 0xa8, 0x47, 0x13, 0x48, + 0x01, 0x68, 0x20, 0x46, 0xbd, 0xe8, 0xf8, 0x40, 0x08, 0x47, 0xf8, 0xbd, + 0x4f, 0xf4, 0x90, 0x33, 0x4f, 0xf4, 0x8d, 0x62, 0xdb, 0xe7, 0x44, 0xf6, + 0xe6, 0x33, 0x40, 0xf6, 0xb8, 0x32, 0xd6, 0xe7, 0x91, 0xf8, 0x20, 0x30, + 0x35, 0x2b, 0x4f, 0xf0, 0x00, 0x03, 0x04, 0xbf, 0x49, 0xf6, 0xb3, 0x63, + 0x4f, 0xf4, 0xd6, 0x72, 0xcb, 0xe7, 0x00, 0xbf, 0x4c, 0x49, 0x01, 0x00, + 0xf5, 0x08, 0x01, 0x00, 0x88, 0x84, 0x02, 0x00, 0x00, 0xe2, 0x04, 0x00, + 0xa0, 0xa0, 0x08, 0x00, 0x2c, 0xe5, 0x08, 0x00, 0xbc, 0xb5, 0x16, 0x4a, + 0x12, 0x78, 0xd2, 0x07, 0x26, 0xd0, 0x01, 0x29, 0x24, 0xd1, 0x55, 0x49, + 0x00, 0xeb, 0x40, 0x00, 0x01, 0xaa, 0x51, 0xf8, 0x20, 0x40, 0x11, 0x48, + 0x49, 0x21, 0x03, 0x68, 0xff, 0x20, 0x98, 0x47, 0x01, 0x98, 0xb8, 0xb1, + 0x0e, 0x49, 0x22, 0x46, 0x01, 0x23, 0x0d, 0x68, 0x49, 0x21, 0xa8, 0x47, + 0x01, 0x99, 0x20, 0x46, 0x00, 0xf0, 0x16, 0xf8, 0x01, 0x98, 0xdb, 0xf7, + 0x47, 0xfd, 0x94, 0xf8, 0x35, 0x01, 0x46, 0x49, 0x00, 0xeb, 0x40, 0x00, + 0x01, 0xeb, 0x40, 0x10, 0x20, 0x21, 0x18, 0x30, 0xd8, 0xf7, 0x9e, 0xf8, + 0xbc, 0xbd, 0x00, 0xbf, 0x28, 0x5e, 0x01, 0x00, 0x24, 0x9c, 0x08, 0x00, + 0x1c, 0x9c, 0x08, 0x00, 0xf8, 0xb5, 0x00, 0x28, 0x58, 0xd0, 0x05, 0x46, + 0x90, 0xf8, 0x74, 0x00, 0x3a, 0x4f, 0x0c, 0x46, 0x04, 0xf1, 0x3b, 0x06, + 0x81, 0xf8, 0x3a, 0x00, 0x95, 0xf8, 0x35, 0x01, 0x00, 0xeb, 0x40, 0x00, + 0x07, 0xeb, 0x40, 0x10, 0x00, 0xf1, 0x30, 0x01, 0x30, 0x46, 0x00, 0xf0, + 0x83, 0xf8, 0x95, 0xf8, 0x35, 0x01, 0x16, 0x28, 0x2e, 0xd8, 0x31, 0x4a, + 0x00, 0xeb, 0x40, 0x01, 0x52, 0xf8, 0x21, 0x30, 0x43, 0xb3, 0x02, 0xeb, + 0x81, 0x02, 0x12, 0x79, 0x03, 0x2a, 0x23, 0xd1, 0x07, 0xeb, 0x41, 0x10, + 0x00, 0xf1, 0x50, 0x01, 0x30, 0x46, 0x00, 0xf0, 0x6d, 0xf8, 0x95, 0xf8, + 0x35, 0x01, 0x00, 0xeb, 0x40, 0x00, 0x07, 0xeb, 0x40, 0x10, 0x00, 0xf1, + 0x34, 0x01, 0x04, 0xf1, 0x3f, 0x00, 0x00, 0xf0, 0x61, 0xf8, 0x95, 0xf8, + 0xf2, 0x02, 0x00, 0x21, 0x04, 0x28, 0x28, 0xbf, 0x04, 0x20, 0x05, 0xeb, + 0xc0, 0x00, 0x90, 0xf8, 0xbc, 0x03, 0x84, 0xf8, 0x47, 0x10, 0x84, 0xf8, + 0x43, 0x10, 0x84, 0xf8, 0x3a, 0x00, 0xf8, 0xbd, 0x00, 0xeb, 0x40, 0x00, + 0x07, 0xeb, 0x40, 0x10, 0x00, 0xf1, 0x34, 0x01, 0x04, 0xf1, 0x3f, 0x00, + 0x00, 0xf0, 0x46, 0xf8, 0xd5, 0xf8, 0x2c, 0x05, 0x58, 0xb1, 0x01, 0x69, + 0x08, 0x0e, 0x0a, 0x0c, 0x0b, 0x0a, 0x0a, 0xe0, 0x00, 0x20, 0x40, 0xf2, + 0x33, 0x31, 0xbd, 0xe8, 0xf8, 0x40, 0xdb, 0xf7, 0xef, 0xbc, 0x00, 0x20, + 0x00, 0x22, 0x00, 0x23, 0x00, 0x21, 0x84, 0xf8, 0x46, 0x00, 0x84, 0xf8, + 0x45, 0x20, 0x84, 0xf8, 0x44, 0x30, 0x84, 0xf8, 0x43, 0x10, 0x95, 0xf8, + 0x35, 0x01, 0x00, 0xeb, 0x40, 0x00, 0x07, 0xeb, 0x40, 0x10, 0x00, 0xf1, + 0x3c, 0x01, 0x04, 0xf1, 0x47, 0x00, 0xbd, 0xe8, 0xf8, 0x40, 0x1d, 0xe0, + 0x54, 0xf1, 0x05, 0x00, 0xe8, 0x72, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x28, + 0x0b, 0xd0, 0x01, 0x28, 0x13, 0xd1, 0x01, 0xeb, 0x41, 0x00, 0xd6, 0x49, + 0x01, 0xeb, 0x40, 0x10, 0x20, 0x21, 0x18, 0x30, 0xd8, 0xf7, 0x08, 0xf8, + 0x80, 0xbd, 0x01, 0xeb, 0x41, 0x00, 0xd1, 0x49, 0x01, 0xeb, 0x40, 0x10, + 0x00, 0x21, 0xc0, 0xe9, 0x10, 0x11, 0xc0, 0xe9, 0x12, 0x11, 0x80, 0xbd, + 0x0a, 0x78, 0x02, 0x70, 0x4a, 0x78, 0x42, 0x70, 0x8a, 0x78, 0x82, 0x70, + 0xc9, 0x78, 0xc1, 0x70, 0x70, 0x47, 0x00, 0xbf, 0x62, 0xb1, 0xf8, 0xb5, + 0x04, 0x46, 0xd2, 0xf8, 0xd4, 0x00, 0x15, 0x46, 0x92, 0xf8, 0x35, 0x71, + 0x90, 0xf8, 0x71, 0x20, 0x1a, 0xb1, 0x00, 0xf1, 0x60, 0x06, 0x02, 0xe0, + 0x70, 0x47, 0x00, 0xf1, 0x14, 0x06, 0x20, 0x46, 0x2a, 0x46, 0x00, 0xf0, + 0x7d, 0xff, 0x95, 0xf8, 0x35, 0x01, 0x16, 0x28, 0x56, 0xd8, 0xba, 0x49, + 0x00, 0xeb, 0x40, 0x02, 0x51, 0xf8, 0x22, 0x20, 0x00, 0x2a, 0x4f, 0xd0, + 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, 0x80, 0x00, 0x00, 0x79, 0x03, 0x28, + 0x11, 0xd0, 0x01, 0x28, 0x46, 0xd1, 0xd5, 0xf8, 0x6c, 0x01, 0x31, 0x68, + 0x08, 0x44, 0xe0, 0x77, 0xc0, 0xf3, 0x03, 0x61, 0x84, 0xf8, 0x22, 0x10, + 0x01, 0x0c, 0x00, 0x0a, 0x84, 0xf8, 0x21, 0x10, 0x84, 0xf8, 0x20, 0x00, + 0x36, 0xe0, 0x95, 0xf8, 0x68, 0x01, 0x00, 0x23, 0xe0, 0x77, 0x95, 0xf8, + 0x69, 0x01, 0x84, 0xf8, 0x20, 0x00, 0x95, 0xf8, 0xf2, 0x02, 0x03, 0x28, + 0x9a, 0xbf, 0x2b, 0x49, 0x09, 0x5c, 0xff, 0x21, 0xb5, 0xf8, 0x14, 0x23, + 0x21, 0x71, 0xa3, 0x74, 0x63, 0x74, 0x05, 0x28, 0x4f, 0xea, 0x12, 0x21, + 0xe2, 0x73, 0x4f, 0xf0, 0x04, 0x02, 0x21, 0x74, 0x4f, 0xf0, 0x03, 0x01, + 0x38, 0xbf, 0x02, 0x21, 0x04, 0x28, 0x28, 0xbf, 0x10, 0x46, 0x21, 0x4a, + 0x05, 0xeb, 0xc0, 0x00, 0x90, 0xf8, 0xbc, 0x03, 0x12, 0x68, 0x90, 0x47, + 0x04, 0xf1, 0x33, 0x06, 0x20, 0x72, 0x06, 0x21, 0x30, 0x46, 0xd8, 0xf7, + 0x3d, 0xfc, 0x05, 0xf5, 0x30, 0x72, 0x30, 0x46, 0x06, 0x21, 0x04, 0x23, + 0xd5, 0xf7, 0xee, 0xfd, 0x95, 0xf8, 0x35, 0x01, 0x8e, 0x4d, 0x16, 0x4e, + 0x00, 0xeb, 0x40, 0x00, 0x05, 0xeb, 0x40, 0x10, 0x00, 0xf1, 0x28, 0x01, + 0x04, 0xf1, 0x2b, 0x00, 0xb0, 0x47, 0x00, 0x20, 0x84, 0xf8, 0x2f, 0x00, + 0x07, 0xeb, 0x47, 0x00, 0x05, 0xeb, 0x40, 0x15, 0x04, 0xf1, 0x13, 0x00, + 0x05, 0xf1, 0x18, 0x01, 0xb0, 0x47, 0x05, 0xf1, 0x1c, 0x01, 0x04, 0xf1, + 0x17, 0x00, 0xb0, 0x47, 0x05, 0xf1, 0x20, 0x01, 0x04, 0xf1, 0x1b, 0x00, + 0xb0, 0x47, 0x05, 0xf1, 0x24, 0x01, 0x04, 0xf1, 0x23, 0x00, 0x32, 0x46, + 0xbd, 0xe8, 0xf8, 0x40, 0x10, 0x47, 0x00, 0xbf, 0xac, 0xc2, 0x04, 0x00, + 0x34, 0x9c, 0x08, 0x00, 0x51, 0xb3, 0x04, 0x00, 0x2d, 0xe9, 0xf8, 0x43, + 0x0d, 0x46, 0x73, 0x49, 0x09, 0x68, 0x8a, 0x07, 0x01, 0xd5, 0x02, 0x2d, + 0x05, 0xd0, 0xc9, 0x07, 0x00, 0xf0, 0xad, 0x80, 0x01, 0x2d, 0x40, 0xf0, + 0xaa, 0x80, 0xdf, 0xf8, 0xb8, 0x91, 0x00, 0xeb, 0x40, 0x00, 0x59, 0xf8, + 0x20, 0x40, 0x3c, 0xb1, 0xd4, 0xf8, 0xd4, 0x00, 0x90, 0xf8, 0x71, 0x10, + 0x49, 0xb1, 0x00, 0xf1, 0x60, 0x08, 0x08, 0xe0, 0x00, 0x20, 0x40, 0xf2, + 0xc1, 0x11, 0xbd, 0xe8, 0xf8, 0x43, 0xdb, 0xf7, 0xe7, 0xbb, 0x00, 0xf1, + 0x14, 0x08, 0xee, 0x48, 0x60, 0x26, 0x01, 0x2d, 0x6a, 0x46, 0x08, 0xbf, + 0x49, 0x26, 0x31, 0x46, 0x03, 0x68, 0xff, 0x20, 0x98, 0x47, 0x00, 0x98, + 0x00, 0x28, 0x00, 0xf0, 0x84, 0x80, 0xe8, 0x49, 0x22, 0x46, 0x2b, 0x46, + 0x0f, 0x68, 0x31, 0x46, 0xb8, 0x47, 0x94, 0xf8, 0x35, 0x01, 0x16, 0x28, + 0x7b, 0xd8, 0x00, 0xeb, 0x40, 0x01, 0x59, 0xf8, 0x21, 0x10, 0x00, 0x29, + 0x75, 0xd0, 0x00, 0xeb, 0x40, 0x00, 0x09, 0xeb, 0x80, 0x00, 0x00, 0x79, + 0x01, 0x28, 0x6e, 0xd1, 0x02, 0x2d, 0x7c, 0xd1, 0x94, 0xf8, 0x24, 0x01, + 0x00, 0x99, 0xdd, 0x4d, 0x81, 0xf8, 0x3a, 0x00, 0x01, 0xf1, 0x3b, 0x00, + 0x04, 0xf5, 0xe6, 0x71, 0xa8, 0x47, 0x00, 0x98, 0x04, 0xf5, 0x9e, 0x71, + 0x3f, 0x30, 0xa8, 0x47, 0x94, 0xf8, 0x40, 0x01, 0x00, 0x99, 0x81, 0xf8, + 0x43, 0x00, 0x94, 0xf8, 0x41, 0x01, 0x81, 0xf8, 0x44, 0x00, 0x94, 0xf8, + 0x46, 0x01, 0x81, 0xf8, 0x45, 0x00, 0x94, 0xf8, 0x47, 0x01, 0x81, 0xf8, + 0x46, 0x00, 0x94, 0xf8, 0x48, 0x01, 0x81, 0xf8, 0x47, 0x00, 0x94, 0xf8, + 0x49, 0x01, 0x81, 0xf8, 0x48, 0x00, 0xd5, 0xf7, 0x3d, 0xfd, 0x00, 0x9a, + 0x01, 0x0e, 0x39, 0x4e, 0x82, 0xf8, 0x4c, 0x10, 0x01, 0x0c, 0x82, 0xf8, + 0x49, 0x00, 0x82, 0xf8, 0x4b, 0x10, 0x01, 0x0a, 0x82, 0xf8, 0x4a, 0x10, + 0xd4, 0xf8, 0xd8, 0x00, 0xd8, 0xf8, 0x00, 0x10, 0x08, 0x44, 0x01, 0x0a, + 0x82, 0xf8, 0x4d, 0x00, 0x82, 0xf8, 0x4e, 0x10, 0x01, 0x0c, 0x82, 0xf8, + 0x4f, 0x10, 0xc0, 0xf3, 0x03, 0x60, 0x82, 0xf8, 0x50, 0x00, 0x94, 0xf8, + 0x74, 0x00, 0x82, 0xf8, 0x51, 0x00, 0x94, 0xf8, 0x35, 0x01, 0x00, 0xeb, + 0x40, 0x00, 0x06, 0xeb, 0x40, 0x10, 0x00, 0xf1, 0x30, 0x01, 0x02, 0xf1, + 0x52, 0x00, 0xa8, 0x47, 0x94, 0xf8, 0x35, 0x01, 0x00, 0xeb, 0x40, 0x00, + 0x06, 0xeb, 0x40, 0x10, 0x00, 0xf1, 0x34, 0x01, 0x00, 0x98, 0x56, 0x30, + 0xa8, 0x47, 0xd4, 0xf8, 0x2c, 0x05, 0xd8, 0xb1, 0x01, 0x69, 0x08, 0x0e, + 0x0a, 0x0c, 0x0b, 0x0a, 0x1a, 0xe0, 0xbd, 0xe8, 0xf8, 0x83, 0x00, 0x98, + 0xdb, 0xf7, 0x30, 0xfb, 0x94, 0xf8, 0x35, 0x01, 0x16, 0x49, 0x00, 0xeb, + 0x40, 0x00, 0x01, 0xeb, 0x40, 0x10, 0x20, 0x21, 0x18, 0x30, 0xd7, 0xf7, + 0x87, 0xfe, 0xbd, 0xe8, 0xf8, 0x83, 0x00, 0x99, 0x20, 0x46, 0xff, 0xf7, + 0xeb, 0xfd, 0xea, 0xe7, 0x00, 0x20, 0x00, 0x22, 0x00, 0x23, 0x00, 0x21, + 0x00, 0x9d, 0x85, 0xf8, 0x5d, 0x00, 0x85, 0xf8, 0x5c, 0x20, 0x85, 0xf8, + 0x5b, 0x30, 0x85, 0xf8, 0x5a, 0x10, 0x94, 0xf8, 0x35, 0x01, 0x00, 0xeb, + 0x40, 0x00, 0x06, 0xeb, 0x40, 0x10, 0x00, 0xf1, 0x3c, 0x01, 0x05, 0xf1, + 0x5e, 0x00, 0xff, 0xf7, 0x6b, 0xfe, 0xd0, 0xe7, 0x28, 0x5e, 0x01, 0x00, + 0xe8, 0x72, 0x01, 0x00, 0x54, 0xf1, 0x05, 0x00, 0x2d, 0xe9, 0xfc, 0x47, + 0x78, 0xb3, 0x04, 0x46, 0x87, 0x48, 0x6a, 0x26, 0x01, 0x29, 0x0d, 0x46, + 0x01, 0xaa, 0x08, 0xbf, 0x49, 0x26, 0x31, 0x46, 0x03, 0x68, 0xff, 0x20, + 0x98, 0x47, 0x01, 0x98, 0x00, 0x28, 0x00, 0xf0, 0xff, 0x80, 0x81, 0x49, + 0x22, 0x46, 0x2b, 0x46, 0x0f, 0x68, 0x31, 0x46, 0xb8, 0x47, 0x03, 0x2d, + 0x1e, 0xd1, 0x7e, 0x4d, 0xd5, 0xf8, 0x94, 0x00, 0x00, 0xb3, 0x01, 0x9e, + 0x00, 0x20, 0x1c, 0x21, 0xb0, 0x72, 0x30, 0x71, 0x06, 0xf1, 0x13, 0x00, + 0xd8, 0xf7, 0xec, 0xfa, 0x06, 0xf1, 0x2f, 0x00, 0x05, 0xf1, 0x94, 0x01, + 0xff, 0xf7, 0x36, 0xfe, 0x01, 0x98, 0x01, 0x21, 0x80, 0xf8, 0x4b, 0x10, + 0xc6, 0xe0, 0x00, 0x20, 0x40, 0xf2, 0x1e, 0x21, 0xdb, 0xf7, 0xe4, 0xfa, + 0xbd, 0xe8, 0xfc, 0x87, 0x01, 0x99, 0x20, 0x46, 0xff, 0xf7, 0x8c, 0xfd, + 0x01, 0x98, 0xb9, 0xe0, 0x6c, 0x4d, 0x01, 0x98, 0xdf, 0xf8, 0xb0, 0x81, + 0xb5, 0xf8, 0x0c, 0x90, 0xb5, 0xf8, 0x0a, 0xa0, 0x2f, 0x8a, 0xee, 0x89, + 0x3a, 0x30, 0x05, 0xf1, 0x54, 0x01, 0xc0, 0x47, 0x01, 0x98, 0x05, 0xf1, + 0x58, 0x01, 0x3e, 0x30, 0xc0, 0x47, 0x01, 0x9a, 0xb8, 0x19, 0x01, 0x0a, + 0x82, 0xf8, 0x46, 0x00, 0x09, 0xeb, 0x0a, 0x00, 0x82, 0xf8, 0x47, 0x10, + 0x01, 0x0a, 0x82, 0xf8, 0x44, 0x00, 0x28, 0x7e, 0xe7, 0x4d, 0x82, 0xf8, + 0x45, 0x10, 0x82, 0xf8, 0x48, 0x00, 0x5c, 0x48, 0x80, 0x7b, 0x82, 0xf8, + 0x49, 0x00, 0x94, 0xf8, 0x74, 0x00, 0x82, 0xf8, 0x4a, 0x00, 0x94, 0xf8, + 0x35, 0x01, 0x00, 0xeb, 0x40, 0x00, 0x05, 0xeb, 0x40, 0x10, 0x00, 0xf1, + 0x30, 0x01, 0x02, 0xf1, 0x4c, 0x00, 0xc0, 0x47, 0x94, 0xf8, 0x35, 0x01, + 0x00, 0xeb, 0x40, 0x00, 0x05, 0xeb, 0x40, 0x10, 0x00, 0xf1, 0x34, 0x01, + 0x01, 0x98, 0x50, 0x30, 0xc0, 0x47, 0xd4, 0xf8, 0x2c, 0x05, 0x20, 0xb1, + 0x01, 0x69, 0x08, 0x0e, 0x0a, 0x0c, 0x0b, 0x0a, 0x03, 0xe0, 0x00, 0x20, + 0x00, 0x22, 0x00, 0x23, 0x00, 0x21, 0x01, 0x9e, 0x86, 0xf8, 0x57, 0x00, + 0x86, 0xf8, 0x56, 0x20, 0x86, 0xf8, 0x55, 0x30, 0x86, 0xf8, 0x54, 0x10, + 0x94, 0xf8, 0x35, 0x01, 0x00, 0xeb, 0x40, 0x00, 0x05, 0xeb, 0x40, 0x10, + 0x00, 0xf1, 0x3c, 0x01, 0x06, 0xf1, 0x58, 0x00, 0xff, 0xf7, 0xc0, 0xfd, + 0x94, 0xf8, 0xa4, 0x04, 0x41, 0x07, 0x2a, 0xd5, 0x00, 0x07, 0x28, 0xd4, + 0x01, 0x9e, 0x00, 0x20, 0x86, 0xf8, 0x5c, 0x00, 0x86, 0xf8, 0x4b, 0x00, + 0x37, 0x48, 0x00, 0x68, 0xd7, 0xf7, 0xe8, 0xfd, 0x86, 0xf8, 0x42, 0x00, + 0x00, 0x0a, 0x86, 0xf8, 0x43, 0x00, 0x94, 0xf8, 0x35, 0x01, 0x00, 0xeb, + 0x40, 0x00, 0x05, 0xeb, 0x40, 0x10, 0x00, 0xf1, 0x44, 0x01, 0x06, 0xf1, + 0x60, 0x00, 0xff, 0xf7, 0x9f, 0xfd, 0x94, 0xf8, 0x35, 0x01, 0x00, 0xeb, + 0x40, 0x00, 0x05, 0xeb, 0x40, 0x10, 0x00, 0xf1, 0x4c, 0x01, 0x01, 0x98, + 0x68, 0x30, 0xff, 0xf7, 0x93, 0xfd, 0x01, 0x98, 0x23, 0xe0, 0x94, 0xf8, + 0x32, 0x04, 0x26, 0x49, 0x01, 0x9e, 0x00, 0xeb, 0x40, 0x00, 0x51, 0xf8, + 0x20, 0x00, 0x01, 0x21, 0x86, 0xf8, 0x4b, 0x10, 0xd7, 0xf7, 0xbc, 0xfd, + 0x86, 0xf8, 0x42, 0x00, 0x00, 0x0a, 0x86, 0xf8, 0x43, 0x00, 0x94, 0xf8, + 0x35, 0x01, 0x00, 0xeb, 0x40, 0x00, 0x05, 0xeb, 0x40, 0x10, 0x00, 0xf1, + 0x40, 0x01, 0x06, 0xf1, 0x5c, 0x00, 0xff, 0xf7, 0x73, 0xfd, 0x01, 0x98, + 0x00, 0x21, 0x80, 0xf8, 0x68, 0x10, 0x80, 0xf8, 0x60, 0x10, 0x00, 0x21, + 0x80, 0xf8, 0x64, 0x10, 0xdb, 0xf7, 0x02, 0xfa, 0x94, 0xf8, 0x35, 0x01, + 0x98, 0x4d, 0x20, 0x21, 0x00, 0xeb, 0x40, 0x00, 0x05, 0xeb, 0x40, 0x10, + 0x18, 0x30, 0xd7, 0xf7, 0x59, 0xfd, 0x94, 0xf8, 0x35, 0x01, 0x00, 0x21, + 0x00, 0xeb, 0x40, 0x00, 0x05, 0xeb, 0x40, 0x10, 0xc0, 0xe9, 0x10, 0x11, + 0xc0, 0xe9, 0x12, 0x11, 0xbd, 0xe8, 0xfc, 0x87, 0x24, 0x9c, 0x08, 0x00, + 0x1c, 0x9c, 0x08, 0x00, 0x4c, 0x49, 0x01, 0x00, 0xe0, 0x76, 0x01, 0x00, + 0x51, 0xb3, 0x04, 0x00, 0xa4, 0x4a, 0x01, 0x00, 0x6c, 0xf0, 0x05, 0x00, + 0x10, 0x5e, 0x01, 0x00, 0x2d, 0xe9, 0xf8, 0x43, 0x00, 0x28, 0x00, 0xf0, + 0xce, 0x80, 0xd0, 0xf8, 0x14, 0x90, 0x05, 0x46, 0xb9, 0xf1, 0x00, 0x0f, + 0x00, 0xf0, 0xc7, 0x80, 0x0e, 0x46, 0x01, 0x29, 0x00, 0xf0, 0xc3, 0x80, + 0x79, 0x48, 0x78, 0x4c, 0x6a, 0x46, 0x6a, 0x21, 0x03, 0x68, 0xd4, 0xf8, + 0x00, 0x80, 0xff, 0x20, 0x98, 0x47, 0x00, 0x98, 0x00, 0x28, 0x00, 0xf0, + 0xb6, 0x80, 0x74, 0x49, 0x4a, 0x46, 0x33, 0x46, 0x0f, 0x68, 0x6a, 0x21, + 0xb8, 0x47, 0x14, 0xf8, 0x04, 0x0f, 0x00, 0x9f, 0x04, 0x2e, 0x87, 0xf8, + 0x2b, 0x00, 0x60, 0x78, 0x87, 0xf8, 0x2c, 0x00, 0x40, 0xf0, 0xa7, 0x80, + 0x40, 0x46, 0xd7, 0xf7, 0x47, 0xfd, 0x87, 0xf8, 0x3a, 0x00, 0x00, 0x0a, + 0x87, 0xf8, 0x3b, 0x00, 0x95, 0xf8, 0xa0, 0x00, 0x87, 0xf8, 0x3c, 0x00, + 0x95, 0xf8, 0xa1, 0x00, 0x87, 0xf8, 0x3d, 0x00, 0x64, 0x48, 0x01, 0x68, + 0x95, 0xf8, 0xa8, 0x00, 0x88, 0x47, 0x00, 0x9a, 0x82, 0xf8, 0x3e, 0x00, + 0x61, 0x48, 0x01, 0x78, 0x43, 0x78, 0x82, 0xf8, 0x3f, 0x10, 0x01, 0x46, + 0x82, 0xf8, 0x40, 0x30, 0x11, 0xf8, 0x02, 0x3f, 0x82, 0xf8, 0x41, 0x30, + 0x03, 0x46, 0x49, 0x78, 0x13, 0xf8, 0x04, 0x4f, 0x82, 0xf8, 0x42, 0x10, + 0x82, 0xf8, 0x43, 0x40, 0x04, 0x46, 0x59, 0x78, 0x14, 0xf8, 0x06, 0x5f, + 0x82, 0xf8, 0x44, 0x10, 0x61, 0x78, 0x82, 0xf8, 0x45, 0x50, 0x00, 0x25, + 0x82, 0xf8, 0x4c, 0x50, 0x82, 0xf8, 0x4b, 0x50, 0x82, 0xf8, 0x46, 0x10, + 0x01, 0x46, 0x11, 0xf8, 0x08, 0x3f, 0x82, 0xf8, 0x47, 0x30, 0x03, 0x46, + 0x49, 0x78, 0x13, 0xf8, 0x0a, 0x4f, 0x82, 0xf8, 0x48, 0x10, 0x82, 0xf8, + 0x49, 0x40, 0x04, 0x46, 0x59, 0x78, 0x14, 0xf8, 0x0c, 0x6f, 0x82, 0xf8, + 0x4a, 0x10, 0x82, 0xf8, 0x4d, 0x60, 0x06, 0x46, 0x61, 0x78, 0x16, 0xf8, + 0x0e, 0x7f, 0x82, 0xf8, 0x4e, 0x10, 0x71, 0x78, 0x82, 0xf8, 0x4f, 0x70, + 0x41, 0x4e, 0x82, 0xf8, 0x50, 0x10, 0x01, 0x46, 0x11, 0xf8, 0x10, 0x3f, + 0x49, 0x78, 0x82, 0xf8, 0x51, 0x30, 0x82, 0xf8, 0x52, 0x10, 0x10, 0xf8, + 0x18, 0x1f, 0x82, 0xf8, 0x59, 0x10, 0x10, 0xf8, 0x02, 0x1d, 0x82, 0xf8, + 0x57, 0x10, 0x10, 0xf8, 0x02, 0x1d, 0x82, 0xf8, 0x55, 0x10, 0x10, 0xf8, + 0x02, 0x1d, 0x82, 0xf8, 0x53, 0x10, 0x41, 0x78, 0xc3, 0x78, 0x44, 0x79, + 0xc0, 0x79, 0x82, 0xf8, 0x54, 0x10, 0x82, 0xf8, 0x56, 0x30, 0x82, 0xf8, + 0x58, 0x40, 0x82, 0xf8, 0x5a, 0x00, 0x99, 0xf8, 0x74, 0x00, 0x82, 0xf8, + 0x5b, 0x00, 0x99, 0xf8, 0x35, 0x01, 0x00, 0xeb, 0x40, 0x00, 0x06, 0xeb, + 0x40, 0x10, 0x00, 0xf1, 0x30, 0x01, 0x02, 0xf1, 0x5c, 0x00, 0xff, 0xf7, + 0x81, 0xfc, 0x99, 0xf8, 0x35, 0x01, 0x00, 0xeb, 0x40, 0x00, 0x06, 0xeb, + 0x40, 0x10, 0x00, 0xf1, 0x34, 0x01, 0x00, 0x98, 0x60, 0x30, 0xff, 0xf7, + 0x75, 0xfc, 0xd9, 0xf8, 0x2c, 0x05, 0x58, 0xb1, 0x00, 0x69, 0x05, 0x0e, + 0x01, 0x0c, 0x02, 0x0a, 0x09, 0xe0, 0xbd, 0xe8, 0xf8, 0x83, 0x48, 0x46, + 0x39, 0x46, 0xff, 0xf7, 0xcd, 0xfb, 0x17, 0xe0, 0x00, 0x21, 0x00, 0x22, + 0x00, 0x20, 0x00, 0x9b, 0x83, 0xf8, 0x67, 0x50, 0x83, 0xf8, 0x66, 0x10, + 0x83, 0xf8, 0x65, 0x20, 0x83, 0xf8, 0x64, 0x00, 0x99, 0xf8, 0x35, 0x01, + 0x00, 0xeb, 0x40, 0x00, 0x06, 0xeb, 0x40, 0x10, 0x00, 0xf1, 0x3c, 0x01, + 0x03, 0xf1, 0x68, 0x00, 0xff, 0xf7, 0x4e, 0xfc, 0x00, 0x98, 0xdb, 0xf7, + 0xe5, 0xf8, 0x99, 0xf8, 0x35, 0x01, 0x0a, 0x49, 0x00, 0xeb, 0x40, 0x00, + 0x01, 0xeb, 0x40, 0x10, 0x20, 0x21, 0x18, 0x30, 0xd7, 0xf7, 0x3c, 0xfc, + 0xbd, 0xe8, 0xf8, 0x83, 0x34, 0x5e, 0x01, 0x00, 0x24, 0x9c, 0x08, 0x00, + 0x1c, 0x9c, 0x08, 0x00, 0x80, 0xc5, 0x08, 0x00, 0x40, 0x5e, 0x01, 0x00, + 0x54, 0xf1, 0x05, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, 0x87, 0xb0, 0x82, 0x78, + 0xc1, 0x78, 0x07, 0x2a, 0x04, 0xd0, 0x0f, 0x2a, 0x1d, 0xd1, 0x00, 0x26, + 0x0d, 0x24, 0x01, 0xe0, 0x01, 0x26, 0x05, 0x24, 0x02, 0x29, 0x1a, 0xd0, + 0x01, 0x29, 0x24, 0xd0, 0x91, 0xbb, 0x01, 0x79, 0x90, 0xf8, 0x06, 0xe0, + 0x02, 0x7a, 0x47, 0x7a, 0x90, 0xf9, 0x07, 0xc0, 0x90, 0xf9, 0x05, 0x50, + 0xcd, 0xe9, 0x05, 0x27, 0x46, 0xb3, 0x00, 0x23, 0x4f, 0xf0, 0x00, 0x08, + 0x4f, 0xf0, 0x00, 0x0a, 0x4f, 0xf0, 0x00, 0x0b, 0x65, 0xe0, 0x12, 0x25, + 0x00, 0x26, 0x0d, 0x24, 0xea, 0xe0, 0x9a, 0x48, 0x00, 0x21, 0x00, 0x25, + 0x02, 0x68, 0x05, 0x20, 0x90, 0x47, 0x99, 0x48, 0xc0, 0xe9, 0x01, 0x55, + 0x96, 0x48, 0x05, 0x60, 0xde, 0xe0, 0x90, 0xf9, 0x07, 0x80, 0x90, 0xf8, + 0x04, 0xc0, 0x90, 0xf8, 0x06, 0xe0, 0x90, 0xf9, 0x05, 0x50, 0xb6, 0xb1, + 0x4f, 0xf0, 0x00, 0x09, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0xb4, 0xe0, + 0x12, 0x25, 0xcd, 0xe0, 0x8d, 0x4f, 0x01, 0x23, 0xb5, 0xf1, 0xff, 0x3f, + 0x3b, 0x70, 0x11, 0xdd, 0x4f, 0xf0, 0x00, 0x09, 0x4f, 0xf0, 0x00, 0x08, + 0x4f, 0xf0, 0x00, 0x0a, 0x4f, 0xf0, 0x00, 0x0b, 0x1c, 0xe0, 0xb5, 0xf1, + 0xff, 0x3f, 0x76, 0xdd, 0x4f, 0xf0, 0x00, 0x09, 0x00, 0x21, 0x00, 0x22, + 0x00, 0x23, 0x83, 0xe0, 0x90, 0xf8, 0x0a, 0xb0, 0x90, 0xf8, 0x0b, 0xa0, + 0x90, 0xf8, 0x0c, 0x80, 0x7b, 0x70, 0x43, 0x7b, 0x4b, 0xea, 0x0a, 0x22, + 0x42, 0xea, 0x08, 0x49, 0x7a, 0x68, 0x42, 0xea, 0x09, 0x02, 0x99, 0x46, + 0x42, 0xea, 0x03, 0x62, 0x7a, 0x60, 0x05, 0x9a, 0xbc, 0xf1, 0xff, 0x3f, + 0x13, 0xdc, 0x01, 0x22, 0x03, 0x7c, 0xba, 0x70, 0x82, 0x7b, 0x03, 0x92, + 0xc2, 0x7b, 0x40, 0x7c, 0x04, 0x90, 0x03, 0x98, 0x40, 0xea, 0x02, 0x22, + 0xb8, 0x68, 0x42, 0xea, 0x03, 0x42, 0x10, 0x43, 0xdd, 0xe9, 0x04, 0x32, + 0x40, 0xea, 0x03, 0x60, 0xb8, 0x60, 0x06, 0x9f, 0x4b, 0x46, 0xe8, 0xb2, + 0xdf, 0xf8, 0x54, 0x91, 0x11, 0xf0, 0x0c, 0x0f, 0x41, 0xea, 0x00, 0x20, + 0x40, 0xea, 0x0e, 0x40, 0x40, 0xea, 0x0c, 0x65, 0x0f, 0xd1, 0x4f, 0xea, + 0x08, 0x40, 0x1f, 0x46, 0x40, 0xea, 0x03, 0x60, 0x40, 0xea, 0x0a, 0x20, + 0x00, 0xeb, 0x0b, 0x01, 0x28, 0x46, 0x00, 0xf0, 0x97, 0xf8, 0x3b, 0x46, + 0xdd, 0xe9, 0x05, 0x27, 0x30, 0xb1, 0x42, 0xea, 0x07, 0x20, 0x0a, 0x28, + 0x98, 0xbf, 0x0a, 0x20, 0xa9, 0xf8, 0x04, 0x00, 0x01, 0x20, 0x89, 0xf8, + 0x0a, 0x00, 0xd9, 0xf8, 0x00, 0x00, 0x28, 0x43, 0xc9, 0xf8, 0x00, 0x00, + 0x4f, 0xea, 0x08, 0x40, 0x40, 0xea, 0x03, 0x60, 0x40, 0xea, 0x0a, 0x20, + 0x00, 0xeb, 0x0b, 0x01, 0x28, 0x46, 0x00, 0xf0, 0x79, 0xf8, 0x00, 0x25, + 0x00, 0x28, 0x4f, 0xd0, 0xb1, 0x48, 0xb9, 0xf8, 0x04, 0x20, 0x00, 0x21, + 0x07, 0x68, 0x05, 0x20, 0x13, 0x46, 0xcd, 0xe9, 0x00, 0x55, 0xb8, 0x47, + 0x44, 0xe0, 0x83, 0x7a, 0xc2, 0x7a, 0x01, 0x7b, 0x90, 0xf8, 0x0d, 0x90, + 0xdf, 0xf8, 0xc0, 0xa0, 0x43, 0xea, 0x02, 0x27, 0x47, 0xea, 0x01, 0x47, + 0x47, 0xea, 0x09, 0x6b, 0xda, 0xf8, 0x04, 0x70, 0x27, 0xea, 0x0b, 0x07, + 0xca, 0xf8, 0x04, 0x70, 0xb8, 0xf1, 0xff, 0x3f, 0x13, 0xdc, 0x90, 0xf8, + 0x0e, 0xa0, 0xc7, 0x7b, 0x90, 0xf8, 0x10, 0xb0, 0x40, 0x7c, 0x4a, 0xea, + 0x07, 0x27, 0xdf, 0xf8, 0x90, 0xa0, 0x47, 0xea, 0x0b, 0x47, 0x47, 0xea, + 0x00, 0x60, 0xda, 0xf8, 0x08, 0x70, 0x27, 0xea, 0x00, 0x00, 0xca, 0xf8, + 0x08, 0x00, 0xe8, 0xb2, 0x4c, 0xea, 0x00, 0x20, 0x40, 0xea, 0x0e, 0x40, + 0x40, 0xea, 0x08, 0x65, 0x08, 0x04, 0x40, 0xea, 0x09, 0x60, 0x40, 0xea, + 0x02, 0x20, 0xc1, 0x18, 0x28, 0x46, 0x00, 0xf0, 0x31, 0xf8, 0x20, 0xb1, + 0x29, 0x48, 0x00, 0x21, 0x02, 0x68, 0x05, 0x20, 0x90, 0x47, 0x28, 0x48, + 0x01, 0x68, 0xa9, 0x43, 0x00, 0x25, 0x01, 0x60, 0x20, 0x46, 0x4f, 0xf6, + 0x5e, 0x51, 0x2a, 0x46, 0xda, 0xf7, 0xda, 0xff, 0xb8, 0xb1, 0x22, 0x49, + 0x04, 0x46, 0x06, 0x30, 0xff, 0xf7, 0x10, 0xfb, 0x5e, 0xb9, 0x20, 0x4d, + 0x04, 0xf1, 0x0a, 0x00, 0x29, 0x1d, 0xff, 0xf7, 0x09, 0xfb, 0x04, 0xf1, + 0x0e, 0x00, 0x05, 0xf1, 0x08, 0x01, 0xff, 0xf7, 0x03, 0xfb, 0x20, 0x46, + 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, 0xda, 0xf7, 0x97, 0xbf, 0x07, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0x78, 0xf0, 0x05, 0x00, 0x28, 0x5e, 0x01, 0x00, + 0xc0, 0x07, 0x1c, 0xbf, 0x01, 0x20, 0x70, 0x47, 0x11, 0xf0, 0x03, 0x00, + 0x18, 0xbf, 0x01, 0x20, 0x70, 0x47, 0x00, 0xbf, 0x10, 0xb5, 0x0c, 0x48, + 0x00, 0x21, 0x00, 0x24, 0x02, 0x68, 0x05, 0x20, 0x90, 0x47, 0x0a, 0x48, + 0x2c, 0x21, 0xc0, 0xe9, 0x00, 0x44, 0x84, 0x60, 0x08, 0x48, 0xc0, 0xe9, + 0x00, 0x44, 0x84, 0x60, 0x9c, 0x48, 0xd7, 0xf7, 0xd5, 0xfa, 0xb7, 0x48, + 0xc0, 0xe9, 0x00, 0x44, 0xc0, 0xe9, 0x02, 0x44, 0x10, 0xbd, 0x00, 0xbf, + 0xf8, 0xcd, 0x08, 0x00, 0x28, 0x5e, 0x01, 0x00, 0x78, 0xf0, 0x05, 0x00, + 0x2d, 0xe9, 0xfc, 0x47, 0xf7, 0x4d, 0x04, 0x46, 0x90, 0xf8, 0x35, 0x81, + 0x16, 0x46, 0x89, 0x46, 0x28, 0x78, 0x48, 0xb1, 0x68, 0x78, 0x00, 0x28, + 0x41, 0xd0, 0x28, 0x79, 0x40, 0x07, 0x3e, 0xd5, 0x4f, 0xf0, 0x10, 0x0a, + 0x09, 0x27, 0x06, 0xe0, 0xed, 0x48, 0xc0, 0x78, 0x40, 0x06, 0x36, 0xd5, + 0x4f, 0xf0, 0x1f, 0x0a, 0x08, 0x27, 0xec, 0x48, 0x01, 0xaa, 0x39, 0x46, + 0x03, 0x68, 0xff, 0x20, 0x98, 0x47, 0x01, 0x98, 0x58, 0xb3, 0x02, 0x30, + 0x39, 0x46, 0xd7, 0xf7, 0x55, 0xff, 0x01, 0x99, 0x58, 0x20, 0x88, 0x70, + 0x29, 0x78, 0x01, 0x98, 0x80, 0xf8, 0x03, 0xa0, 0x01, 0x98, 0x79, 0xb1, + 0x00, 0x21, 0x06, 0x72, 0x80, 0xf8, 0x07, 0x90, 0x80, 0xf8, 0x05, 0x80, + 0x81, 0x71, 0x03, 0x21, 0x01, 0x71, 0x94, 0xf8, 0x74, 0x10, 0x41, 0x72, + 0x94, 0xf8, 0x3a, 0x10, 0x81, 0x72, 0x0c, 0xe0, 0x00, 0x21, 0xc6, 0x71, + 0x80, 0xf8, 0x06, 0x90, 0x80, 0xf8, 0x04, 0x80, 0x41, 0x71, 0x94, 0xf8, + 0x74, 0x10, 0x01, 0x72, 0x94, 0xf8, 0x3a, 0x10, 0x41, 0x72, 0xda, 0xf7, + 0x17, 0xff, 0xbd, 0xe8, 0xfc, 0x87, 0x00, 0xbf, 0x2d, 0xe9, 0xfc, 0x41, + 0x0c, 0x46, 0xce, 0x49, 0x05, 0x46, 0xcc, 0x48, 0x95, 0xf8, 0x35, 0x61, + 0x09, 0x78, 0x00, 0x68, 0x21, 0xb1, 0x40, 0xb2, 0x00, 0x28, 0x07, 0xd4, + 0xbd, 0xe8, 0xfc, 0x81, 0xb0, 0xf1, 0xff, 0x3f, 0xfa, 0xdc, 0x4f, 0xf0, + 0x20, 0x08, 0x01, 0xe0, 0x4f, 0xf0, 0x08, 0x08, 0xc4, 0x48, 0x01, 0xaa, + 0x39, 0x21, 0x03, 0x68, 0xff, 0x20, 0x98, 0x47, 0x01, 0x9f, 0x00, 0x2f, + 0xec, 0xd0, 0xf8, 0x1c, 0x38, 0x21, 0xd7, 0xf7, 0x05, 0xff, 0x58, 0x20, + 0xb8, 0x70, 0x01, 0x98, 0x80, 0xf8, 0x03, 0x80, 0x00, 0x20, 0x01, 0x99, + 0x88, 0x71, 0x4e, 0x71, 0xd5, 0xf8, 0xd4, 0x00, 0x40, 0x7f, 0xc8, 0x71, + 0x95, 0xf8, 0x3a, 0x00, 0x08, 0x72, 0x95, 0xf8, 0xf0, 0x00, 0x48, 0x73, + 0x95, 0xf8, 0xf1, 0x00, 0x88, 0x73, 0xd5, 0xf8, 0xd4, 0x00, 0xd5, 0xf7, + 0x01, 0xfd, 0x01, 0x9b, 0x01, 0x0e, 0x05, 0xf5, 0x80, 0x72, 0x99, 0x74, + 0x01, 0x0c, 0xd8, 0x73, 0x59, 0x74, 0x01, 0x0a, 0x03, 0xf1, 0x33, 0x00, + 0x19, 0x74, 0x06, 0x21, 0x06, 0x23, 0xd5, 0xf7, 0x93, 0xf8, 0xae, 0x49, + 0x01, 0x98, 0x09, 0x78, 0x80, 0xf8, 0x3a, 0x40, 0x80, 0xf8, 0x39, 0x10, + 0xda, 0xf7, 0xbc, 0xfe, 0xbd, 0xe8, 0xfc, 0x81, 0x1c, 0xb5, 0x00, 0xf0, + 0x17, 0xf8, 0x00, 0xf0, 0x7b, 0xf8, 0x9f, 0x48, 0x01, 0x78, 0xc9, 0x07, + 0x0a, 0xd1, 0x82, 0x88, 0x06, 0x48, 0x00, 0x21, 0x04, 0x68, 0x00, 0x20, + 0x13, 0x46, 0xcd, 0xe9, 0x00, 0x00, 0x05, 0x20, 0xa0, 0x47, 0x1c, 0xbd, + 0xbd, 0xe8, 0x1c, 0x40, 0x00, 0xf0, 0xaa, 0xb9, 0x00, 0xce, 0x08, 0x00, + 0xbc, 0xb5, 0x00, 0x20, 0x01, 0x90, 0x94, 0x48, 0x41, 0x78, 0x11, 0xb1, + 0x00, 0x79, 0xc0, 0x07, 0x00, 0xd1, 0xbc, 0xbd, 0x91, 0x48, 0x01, 0xaa, + 0x2b, 0x21, 0x03, 0x68, 0xff, 0x20, 0x98, 0x47, 0x01, 0x9c, 0x00, 0x2c, + 0xf5, 0xd0, 0xe0, 0x1c, 0x2a, 0x21, 0xd7, 0xf7, 0x9f, 0xfe, 0x58, 0x20, + 0x8e, 0x4d, 0xa0, 0x70, 0x10, 0x20, 0x24, 0x4c, 0x01, 0x99, 0xc8, 0x70, + 0x01, 0x20, 0x01, 0x9a, 0x10, 0x71, 0xd4, 0xe9, 0x00, 0x01, 0x40, 0x1a, + 0x38, 0xbf, 0x4f, 0xf0, 0xff, 0x30, 0x01, 0x0c, 0x50, 0x71, 0xd1, 0x71, + 0x01, 0x0a, 0x00, 0x0e, 0x91, 0x71, 0x10, 0x72, 0x04, 0xf1, 0x08, 0x01, + 0x02, 0xf1, 0x09, 0x00, 0xa8, 0x47, 0x01, 0x98, 0x04, 0xf1, 0x0c, 0x01, + 0x0d, 0x30, 0xa8, 0x47, 0x01, 0x98, 0x04, 0xf1, 0x10, 0x01, 0x11, 0x30, + 0xa8, 0x47, 0x01, 0x98, 0x04, 0xf1, 0x14, 0x01, 0x15, 0x30, 0xa8, 0x47, + 0x01, 0x98, 0x04, 0xf1, 0x18, 0x01, 0x19, 0x30, 0xa8, 0x47, 0x01, 0x98, + 0x04, 0xf1, 0x1c, 0x01, 0x1d, 0x30, 0xa8, 0x47, 0x01, 0x98, 0x04, 0xf1, + 0x20, 0x01, 0x21, 0x30, 0xa8, 0x47, 0x01, 0x98, 0x04, 0xf1, 0x24, 0x01, + 0x25, 0x30, 0xa8, 0x47, 0x01, 0x98, 0x04, 0xf1, 0x28, 0x01, 0x29, 0x30, + 0xa8, 0x47, 0x01, 0x98, 0xda, 0xf7, 0x42, 0xfe, 0x20, 0x46, 0x2c, 0x21, + 0xd7, 0xf7, 0xa0, 0xf9, 0xbc, 0xbd, 0x00, 0xbf, 0x84, 0xf0, 0x05, 0x00, + 0x7c, 0xb5, 0x00, 0x20, 0x01, 0x90, 0x61, 0x48, 0x41, 0x78, 0x69, 0xb3, + 0x00, 0x79, 0x80, 0x07, 0x2a, 0xd5, 0x5f, 0x48, 0x01, 0xaa, 0x13, 0x21, + 0x03, 0x68, 0xff, 0x20, 0x98, 0x47, 0x01, 0x9c, 0x14, 0xb3, 0xe0, 0x1c, + 0x12, 0x21, 0xd7, 0xf7, 0x3b, 0xfe, 0x58, 0x20, 0x5c, 0x4d, 0xa0, 0x70, + 0x10, 0x20, 0x0e, 0x4c, 0x01, 0x99, 0xc8, 0x70, 0x02, 0x20, 0x01, 0x99, + 0x08, 0x71, 0x48, 0x1d, 0x21, 0x46, 0xa8, 0x47, 0x01, 0x98, 0x21, 0x1d, + 0x09, 0x30, 0xa8, 0x47, 0x01, 0x98, 0x00, 0x26, 0x04, 0xf1, 0x0c, 0x01, + 0x46, 0x73, 0x11, 0x30, 0xa8, 0x47, 0x01, 0x98, 0xda, 0xf7, 0x0a, 0xfe, + 0xc4, 0xe9, 0x00, 0x66, 0xc4, 0xe9, 0x02, 0x66, 0x7c, 0xbd, 0x00, 0xbf, + 0xb0, 0xf0, 0x05, 0x00, 0x04, 0x29, 0x38, 0xbf, 0x00, 0x20, 0x00, 0xf0, + 0x0b, 0xb9, 0x00, 0xbf, 0x2d, 0xe9, 0xfc, 0x47, 0x88, 0x46, 0x42, 0x49, + 0x05, 0x46, 0x40, 0x48, 0x95, 0xf8, 0x35, 0xa1, 0x09, 0x78, 0x00, 0x68, + 0x21, 0xb1, 0x40, 0xb2, 0x00, 0x28, 0x07, 0xd4, 0xbd, 0xe8, 0xfc, 0x87, + 0xb0, 0xf1, 0xff, 0x3f, 0xfa, 0xdc, 0x4f, 0xf0, 0x20, 0x09, 0x01, 0xe0, + 0x4f, 0xf0, 0x08, 0x09, 0x38, 0x48, 0x01, 0xaa, 0x39, 0x21, 0xff, 0x27, + 0x03, 0x68, 0xff, 0x20, 0x98, 0x47, 0x95, 0xf8, 0xf2, 0x42, 0x03, 0x2c, + 0x01, 0xd8, 0x34, 0x48, 0x07, 0x5d, 0x01, 0x9e, 0x00, 0x2e, 0xe5, 0xd0, + 0xf0, 0x1c, 0x38, 0x21, 0xd7, 0xf7, 0xe6, 0xfd, 0x58, 0x20, 0x37, 0x71, + 0x00, 0x27, 0x05, 0x2c, 0x2e, 0x4a, 0xb0, 0x70, 0x01, 0x98, 0x80, 0xf8, + 0x03, 0x90, 0x01, 0x98, 0x87, 0x71, 0x80, 0xf8, 0x05, 0xa0, 0xd5, 0xf8, + 0xd4, 0x10, 0x49, 0x7f, 0xc1, 0x71, 0x4f, 0xf0, 0x03, 0x01, 0x4f, 0xf0, + 0x04, 0x00, 0x38, 0xbf, 0x02, 0x21, 0x04, 0x2c, 0x28, 0xbf, 0x04, 0x46, + 0x05, 0xeb, 0xc4, 0x00, 0x12, 0x68, 0x90, 0xf8, 0xbc, 0x03, 0x90, 0x47, + 0x01, 0x9a, 0x21, 0x49, 0x21, 0x4e, 0x10, 0x72, 0x95, 0xf8, 0x3a, 0x00, + 0x50, 0x72, 0x95, 0xf8, 0xf0, 0x00, 0x50, 0x73, 0x95, 0xf8, 0xf1, 0x00, + 0x90, 0x73, 0xb5, 0xf8, 0x14, 0x03, 0x57, 0x74, 0x97, 0x74, 0xd0, 0x73, + 0x00, 0x0a, 0x10, 0x74, 0x0a, 0xeb, 0x4a, 0x00, 0x01, 0xeb, 0x40, 0x14, + 0x02, 0xf1, 0x13, 0x00, 0x04, 0xf1, 0x18, 0x01, 0xb0, 0x47, 0x01, 0x98, + 0x04, 0xf1, 0x1c, 0x01, 0x17, 0x30, 0xb0, 0x47, 0x01, 0x98, 0x04, 0xf1, + 0x20, 0x01, 0x1b, 0x30, 0xb0, 0x47, 0x01, 0x98, 0x05, 0xf5, 0x30, 0x72, + 0x06, 0x21, 0x04, 0x23, 0x33, 0x30, 0xd4, 0xf7, 0x4f, 0xff, 0x0c, 0x49, + 0x01, 0x98, 0x09, 0x78, 0x80, 0xf8, 0x3a, 0x80, 0x80, 0xf8, 0x39, 0x10, + 0xda, 0xf7, 0x78, 0xfd, 0xbd, 0xe8, 0xfc, 0x87, 0x28, 0x5e, 0x01, 0x00, + 0x78, 0xf0, 0x05, 0x00, 0x24, 0x9c, 0x08, 0x00, 0xac, 0xc2, 0x04, 0x00, + 0x34, 0x9c, 0x08, 0x00, 0x54, 0xf1, 0x05, 0x00, 0x51, 0xb3, 0x04, 0x00, + 0xb6, 0x35, 0x01, 0x00, 0x13, 0x48, 0x14, 0x49, 0x01, 0x60, 0x14, 0x48, + 0x14, 0x49, 0x01, 0x60, 0x14, 0x48, 0x15, 0x49, 0x01, 0x60, 0x15, 0x48, + 0x15, 0x49, 0x01, 0x60, 0x15, 0x48, 0x16, 0x49, 0x01, 0x60, 0x16, 0x48, + 0x16, 0x49, 0x01, 0x60, 0x16, 0x48, 0x17, 0x49, 0x01, 0x60, 0x17, 0x48, + 0x17, 0x49, 0x01, 0x60, 0x17, 0x48, 0x18, 0x49, 0x01, 0x60, 0x18, 0x48, + 0x18, 0x49, 0x01, 0x60, 0x18, 0x48, 0x19, 0x49, 0x01, 0x60, 0x19, 0x48, + 0x19, 0x49, 0x01, 0x60, 0x19, 0x48, 0x1a, 0x49, 0x01, 0x60, 0x70, 0x47, + 0x2c, 0xe5, 0x08, 0x00, 0xa5, 0xaf, 0x04, 0x00, 0xec, 0xcd, 0x08, 0x00, + 0x91, 0xaf, 0x04, 0x00, 0xfc, 0xa1, 0x08, 0x00, 0x51, 0xb0, 0x04, 0x00, + 0xf0, 0xcd, 0x08, 0x00, 0xb5, 0xb1, 0x04, 0x00, 0x1c, 0x9c, 0x08, 0x00, + 0x65, 0xb3, 0x04, 0x00, 0x48, 0xc3, 0x08, 0x00, 0xa9, 0xb4, 0x04, 0x00, + 0xe8, 0xcd, 0x08, 0x00, 0x89, 0xb6, 0x04, 0x00, 0xe0, 0xcd, 0x08, 0x00, + 0xd1, 0xb8, 0x04, 0x00, 0xc4, 0x8d, 0x08, 0x00, 0x79, 0xbd, 0x04, 0x00, + 0xc8, 0xdc, 0x08, 0x00, 0xb9, 0xbd, 0x04, 0x00, 0xac, 0xe5, 0x08, 0x00, + 0x5d, 0xbe, 0x04, 0x00, 0x90, 0xa8, 0x08, 0x00, 0x11, 0xbf, 0x04, 0x00, + 0x14, 0xc0, 0x08, 0x00, 0x81, 0xc0, 0x04, 0x00, 0x45, 0xf2, 0xb9, 0x3c, + 0xc1, 0xf2, 0x0e, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4b, 0xf6, 0x1d, 0x0c, + 0xc1, 0xf2, 0x12, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x45, 0xf2, 0x37, 0x4c, + 0xc1, 0xf2, 0x0e, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x46, 0xf2, 0x6d, 0x2c, + 0xc1, 0xf2, 0x0e, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x45, 0xf2, 0x15, 0x4c, + 0xc1, 0xf2, 0x0e, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x52, 0x53, 0x54, 0x55, + 0xf0, 0xb5, 0x33, 0x4c, 0x4f, 0xf0, 0x00, 0x0c, 0x22, 0x78, 0xc2, 0xb1, + 0x31, 0x4d, 0x00, 0x22, 0x8a, 0x42, 0x16, 0xd0, 0x55, 0xf8, 0x22, 0x60, + 0x02, 0xeb, 0x42, 0x03, 0x01, 0x32, 0x03, 0x44, 0x96, 0xf8, 0x35, 0x71, + 0x83, 0xf8, 0x39, 0xc0, 0x83, 0xf8, 0x38, 0x70, 0xd6, 0xf8, 0xd4, 0x60, + 0x76, 0x7f, 0x83, 0xf8, 0x3a, 0x60, 0x23, 0x78, 0x9a, 0x42, 0xe9, 0xd3, + 0x02, 0xe0, 0x00, 0x22, 0x00, 0xe0, 0x0a, 0x46, 0x24, 0x4c, 0x00, 0x26, + 0x8a, 0x42, 0x18, 0xda, 0x35, 0x46, 0x26, 0x68, 0x8e, 0xb1, 0xb3, 0x68, + 0x7b, 0xb1, 0x02, 0xeb, 0x42, 0x03, 0x96, 0xf8, 0xb9, 0x70, 0x01, 0x32, + 0x03, 0x44, 0x83, 0xf8, 0x39, 0xc0, 0x83, 0xf8, 0x38, 0x70, 0x76, 0x69, + 0xd6, 0xf8, 0xd4, 0x60, 0x76, 0x7f, 0x83, 0xf8, 0x3a, 0x60, 0x04, 0x34, + 0x01, 0x26, 0x00, 0x2d, 0xe4, 0xd0, 0xdf, 0xf8, 0x5c, 0xc0, 0x9c, 0xf8, + 0x00, 0x40, 0x04, 0xb3, 0x02, 0xeb, 0x42, 0x04, 0x14, 0x4e, 0x4f, 0xf0, + 0x00, 0x0e, 0x00, 0x25, 0x20, 0x44, 0x57, 0x19, 0x8f, 0x42, 0x17, 0xda, + 0x56, 0xf8, 0x25, 0x70, 0x05, 0xeb, 0x45, 0x04, 0x01, 0x35, 0x04, 0x44, + 0x97, 0xf8, 0x35, 0x31, 0x84, 0xf8, 0x39, 0xe0, 0x84, 0xf8, 0x38, 0x30, + 0xd7, 0xf8, 0xd4, 0x30, 0x5b, 0x7f, 0x84, 0xf8, 0x3a, 0x30, 0x9c, 0xf8, + 0x00, 0x30, 0x9d, 0x42, 0xe7, 0xd3, 0x57, 0x19, 0x00, 0xe0, 0x17, 0x46, + 0xf8, 0xb2, 0xf0, 0xbd, 0x5c, 0x34, 0x01, 0x00, 0x10, 0x61, 0x01, 0x00, + 0x98, 0x52, 0x01, 0x00, 0x53, 0x34, 0x01, 0x00, 0xb8, 0x57, 0x01, 0x00, + 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, 0xc8, 0xe5, 0x08, 0x00, + 0xb1, 0xc2, 0x04, 0x00, 0x70, 0x47, 0x00, 0x00, 0xf8, 0xb5, 0x04, 0x46, + 0x25, 0x48, 0x80, 0x79, 0xc8, 0xb1, 0x25, 0x4d, 0x95, 0xf8, 0x3c, 0x00, + 0x00, 0xf0, 0x81, 0x01, 0x81, 0x29, 0x03, 0xd1, 0x22, 0x49, 0x89, 0x78, + 0x01, 0x29, 0x31, 0xd1, 0x00, 0xf0, 0x82, 0x00, 0x82, 0x28, 0x2d, 0xd0, + 0x1f, 0x48, 0x00, 0x68, 0x80, 0x47, 0x10, 0xb1, 0x1e, 0x48, 0xc0, 0x78, + 0x30, 0xb3, 0x95, 0xf8, 0x56, 0x00, 0xc0, 0x07, 0x22, 0xd1, 0xe5, 0x78, + 0x01, 0x2d, 0x21, 0xd8, 0x1a, 0x48, 0x26, 0x1d, 0x29, 0x46, 0x02, 0x68, + 0x30, 0x46, 0x90, 0x47, 0xff, 0x28, 0x04, 0xd0, 0x17, 0x48, 0x29, 0x46, + 0x02, 0x68, 0x30, 0x46, 0x90, 0x47, 0x16, 0x48, 0x04, 0xf1, 0x0a, 0x01, + 0x32, 0x46, 0x2b, 0x46, 0x07, 0x68, 0x04, 0xf1, 0x1a, 0x00, 0xb8, 0x47, + 0x04, 0x46, 0x12, 0x48, 0x01, 0x68, 0x12, 0x48, 0x88, 0x47, 0x00, 0x20, + 0xff, 0x2c, 0x08, 0xbf, 0x07, 0x20, 0x02, 0xe0, 0x0c, 0x20, 0x00, 0xe0, + 0x12, 0x20, 0x42, 0xf2, 0x27, 0x01, 0xda, 0xf7, 0x2b, 0xfc, 0x0c, 0x48, + 0x00, 0x68, 0xbd, 0xe8, 0xf8, 0x40, 0x00, 0x47, 0x20, 0x54, 0x01, 0x00, + 0x90, 0x01, 0x00, 0x00, 0x9c, 0x55, 0x01, 0x00, 0x48, 0x9e, 0x08, 0x00, + 0xa8, 0x56, 0x01, 0x00, 0x48, 0xc9, 0x08, 0x00, 0x30, 0x9e, 0x08, 0x00, + 0x28, 0x9e, 0x08, 0x00, 0x24, 0x9e, 0x08, 0x00, 0x30, 0x54, 0x01, 0x00, + 0x38, 0x9e, 0x08, 0x00, 0x10, 0xb5, 0xc1, 0x78, 0x00, 0x79, 0x60, 0xf3, + 0x0b, 0x21, 0x16, 0x29, 0x15, 0xd8, 0x15, 0x4a, 0x01, 0xeb, 0x41, 0x00, + 0x52, 0xf8, 0x20, 0x10, 0x79, 0xb1, 0x02, 0xeb, 0x80, 0x00, 0x00, 0x79, + 0x03, 0x28, 0x0a, 0xd1, 0x10, 0x48, 0xc0, 0x78, 0x40, 0x07, 0x44, 0xbf, + 0x91, 0xf8, 0x4d, 0x03, 0x5f, 0xea, 0x40, 0x70, 0x09, 0xd4, 0x1a, 0x20, + 0x00, 0xe0, 0x02, 0x20, 0x0c, 0x49, 0x0a, 0x68, 0x42, 0xf2, 0x6d, 0x01, + 0xbd, 0xe8, 0x10, 0x40, 0x10, 0x47, 0xd1, 0xf8, 0x30, 0x03, 0x00, 0x22, + 0x01, 0x23, 0x40, 0xf0, 0x80, 0x00, 0xc1, 0xf8, 0x30, 0x03, 0x04, 0x48, + 0x04, 0x68, 0x3d, 0x20, 0xa0, 0x47, 0xeb, 0xe7, 0xe8, 0x72, 0x01, 0x00, + 0x70, 0x52, 0x01, 0x00, 0x80, 0x9b, 0x08, 0x00, 0xbc, 0x9b, 0x08, 0x00, + 0x2d, 0xe9, 0xf0, 0x4f, 0x8b, 0xb0, 0xdf, 0xf8, 0x90, 0xb4, 0x82, 0x46, + 0x00, 0x21, 0x0b, 0xf1, 0x04, 0x00, 0x50, 0xf8, 0x04, 0x2c, 0x7a, 0xb1, + 0x03, 0x78, 0x05, 0x2b, 0x0c, 0xd1, 0xd2, 0xf8, 0x00, 0x31, 0xd3, 0xf8, + 0xd4, 0x30, 0x5b, 0x7f, 0x33, 0xb9, 0x92, 0xf8, 0x1c, 0x21, 0x02, 0x2a, + 0x18, 0xbf, 0x04, 0x2a, 0x00, 0xf0, 0xa2, 0x80, 0x01, 0x31, 0x0c, 0x30, + 0x17, 0x29, 0xe8, 0xd1, 0x9a, 0xf8, 0x03, 0x60, 0x0e, 0xb1, 0x1f, 0x2e, + 0x01, 0xd9, 0x12, 0x20, 0x97, 0xe0, 0xdf, 0xf8, 0x4c, 0x04, 0xdf, 0xf8, + 0x4c, 0x94, 0x00, 0x22, 0x90, 0xf8, 0x04, 0xe0, 0xd9, 0xf8, 0x00, 0xc0, + 0x0a, 0xeb, 0x82, 0x00, 0x05, 0x79, 0x40, 0x79, 0x60, 0xf3, 0x0b, 0x25, + 0x16, 0x2d, 0x00, 0xf2, 0x8e, 0x80, 0x05, 0xeb, 0x45, 0x00, 0x5b, 0xf8, + 0x20, 0x30, 0x00, 0x2b, 0x00, 0xf0, 0x87, 0x80, 0x0b, 0xeb, 0x80, 0x00, + 0x00, 0x79, 0x05, 0x28, 0x40, 0xf0, 0x81, 0x80, 0x90, 0x00, 0x00, 0xeb, + 0x0a, 0x01, 0x88, 0x79, 0xc9, 0x79, 0x61, 0xf3, 0x0b, 0x20, 0x16, 0x28, + 0x77, 0xd8, 0x00, 0xeb, 0x40, 0x00, 0x5b, 0xf8, 0x20, 0x70, 0x00, 0x2f, + 0x71, 0xd0, 0x0b, 0xeb, 0x80, 0x00, 0x00, 0x79, 0x03, 0x28, 0x6c, 0xd1, + 0x10, 0x46, 0x41, 0x1c, 0xb1, 0x42, 0x09, 0xd2, 0x0a, 0xeb, 0x80, 0x00, + 0x04, 0x7a, 0x40, 0x7a, 0x60, 0xf3, 0x0b, 0x24, 0x08, 0x46, 0xac, 0x42, + 0xf3, 0xd1, 0xbc, 0xe7, 0x93, 0xf8, 0x1d, 0x01, 0xc0, 0xeb, 0x00, 0x10, + 0x40, 0x01, 0x1c, 0xf8, 0x00, 0x00, 0x00, 0x28, 0x4c, 0xd1, 0xd7, 0xf8, + 0xd4, 0x00, 0x40, 0x7f, 0x00, 0x28, 0x47, 0xd1, 0x97, 0xf8, 0x4e, 0x03, + 0x00, 0xea, 0x0e, 0x00, 0xc0, 0x07, 0x41, 0xd0, 0x97, 0xf8, 0x38, 0x00, + 0x03, 0x28, 0x3d, 0xd1, 0x93, 0xf8, 0x1c, 0x01, 0x00, 0x28, 0x44, 0xd1, + 0x01, 0x32, 0xb2, 0x42, 0xa8, 0xd1, 0x9a, 0xf8, 0x04, 0x00, 0x9a, 0xf8, + 0x05, 0x10, 0x61, 0xf3, 0x0b, 0x20, 0x00, 0xeb, 0x40, 0x00, 0x5b, 0xf8, + 0x20, 0x00, 0x90, 0xf8, 0x1d, 0x01, 0xc0, 0xeb, 0x00, 0x10, 0x0c, 0xeb, + 0x40, 0x14, 0xe0, 0x68, 0x88, 0xb3, 0xdf, 0xf8, 0x90, 0x83, 0x00, 0x27, + 0x0a, 0xeb, 0x87, 0x00, 0x01, 0x79, 0x42, 0x79, 0x62, 0xf3, 0x0b, 0x21, + 0x01, 0xeb, 0x41, 0x01, 0x5b, 0xf8, 0x21, 0x50, 0x8d, 0xb1, 0x81, 0x79, + 0xc0, 0x79, 0x60, 0xf3, 0x0b, 0x21, 0x01, 0xeb, 0x41, 0x00, 0x5b, 0xf8, + 0x20, 0x00, 0x40, 0xb1, 0xd8, 0xf8, 0x00, 0x20, 0x29, 0x46, 0x90, 0x47, + 0x48, 0xb9, 0x28, 0x6c, 0x40, 0xf4, 0x80, 0x70, 0x28, 0x64, 0x01, 0x37, + 0x00, 0x20, 0xb7, 0x42, 0xde, 0xd3, 0x00, 0xe0, 0x0c, 0x20, 0xd2, 0x49, + 0x0a, 0x68, 0x42, 0xf2, 0x64, 0x01, 0x0b, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, + 0x10, 0x47, 0x02, 0x20, 0xf5, 0xe7, 0x0b, 0x20, 0xf3, 0xe7, 0x9a, 0xf8, + 0x06, 0x00, 0x9a, 0xf8, 0x07, 0x10, 0x61, 0xf3, 0x0b, 0x20, 0x00, 0xeb, + 0x40, 0x00, 0x5b, 0xf8, 0x20, 0x70, 0xd7, 0xf8, 0x1c, 0x14, 0xf1, 0xb1, + 0x08, 0x7e, 0x05, 0x28, 0x10, 0xd1, 0x88, 0x79, 0x40, 0x06, 0x0d, 0xd5, + 0xb9, 0x4a, 0x92, 0xf8, 0xa6, 0x02, 0x40, 0x06, 0x08, 0xd5, 0x92, 0xf8, + 0xa7, 0x02, 0x00, 0x07, 0x44, 0xbf, 0xc8, 0x79, 0x5f, 0xea, 0x00, 0x70, + 0x00, 0xf1, 0xa3, 0x80, 0x08, 0x7e, 0x05, 0x28, 0x07, 0xd1, 0x88, 0x79, + 0x40, 0x06, 0x04, 0xd5, 0xaf, 0x48, 0x90, 0xf8, 0xa6, 0x02, 0x40, 0x06, + 0x46, 0xd4, 0x60, 0x78, 0xc0, 0xeb, 0x00, 0x10, 0x0c, 0xeb, 0x40, 0x10, + 0x00, 0xf5, 0xea, 0x72, 0x90, 0xf8, 0xd5, 0x11, 0x00, 0xf5, 0xe8, 0x70, + 0x12, 0xf8, 0x02, 0x3b, 0x43, 0xea, 0x01, 0x21, 0x13, 0x78, 0x52, 0x78, + 0x43, 0xea, 0x02, 0x22, 0x41, 0xea, 0x02, 0x41, 0x81, 0x42, 0x4a, 0xd0, + 0x91, 0xf9, 0x42, 0x20, 0xb2, 0xf1, 0xff, 0x3f, 0x0c, 0xdc, 0xd2, 0xb2, + 0x12, 0xf0, 0x7f, 0x02, 0x81, 0xf8, 0x42, 0x20, 0x06, 0xd1, 0x8a, 0x68, + 0x92, 0xf8, 0x81, 0x23, 0x02, 0xf0, 0x7f, 0x02, 0x81, 0xf8, 0x42, 0x20, + 0x91, 0xf9, 0x43, 0x20, 0xb2, 0xf1, 0xff, 0x3f, 0x0c, 0xdc, 0xd2, 0xb2, + 0x12, 0xf0, 0x7f, 0x02, 0x81, 0xf8, 0x43, 0x20, 0x06, 0xd1, 0x8a, 0x68, + 0x92, 0xf8, 0x82, 0x23, 0x02, 0xf0, 0x7f, 0x02, 0x81, 0xf8, 0x43, 0x20, + 0x11, 0xf8, 0x04, 0x2f, 0x4b, 0x78, 0x8d, 0x78, 0xc9, 0x78, 0x42, 0xea, + 0x03, 0x22, 0x45, 0xea, 0x01, 0x21, 0x42, 0xea, 0x01, 0x41, 0xcd, 0xe7, + 0x60, 0x78, 0xc0, 0xeb, 0x00, 0x10, 0x0c, 0xeb, 0x40, 0x11, 0x01, 0xf5, + 0xe8, 0x70, 0xd1, 0xf8, 0xd4, 0x11, 0x81, 0x42, 0x0f, 0xd0, 0x48, 0xf2, + 0x80, 0x02, 0x11, 0xf8, 0x04, 0x3f, 0x4d, 0x78, 0xca, 0x87, 0x8f, 0x78, + 0xc9, 0x78, 0x43, 0xea, 0x05, 0x23, 0x47, 0xea, 0x01, 0x21, 0x43, 0xea, + 0x01, 0x41, 0x81, 0x42, 0xf1, 0xd1, 0x7f, 0x48, 0xd4, 0xe9, 0x05, 0xc5, + 0xa7, 0x8b, 0xb4, 0xf8, 0x1e, 0x80, 0x94, 0xf8, 0x20, 0x30, 0xe2, 0x78, + 0x94, 0xf8, 0x21, 0x10, 0xd0, 0xf8, 0x00, 0xe0, 0x01, 0x20, 0xcd, 0xe9, + 0x00, 0xc5, 0xcd, 0xe9, 0x02, 0x78, 0x04, 0x90, 0x20, 0x46, 0xf0, 0x47, + 0x98, 0xb1, 0x75, 0x4d, 0x01, 0x20, 0x28, 0x70, 0x74, 0x48, 0x01, 0x68, + 0x20, 0x46, 0x88, 0x47, 0x38, 0xb1, 0x73, 0x48, 0xe1, 0x78, 0x02, 0x68, + 0x20, 0x46, 0x90, 0x47, 0x21, 0x89, 0x81, 0x42, 0x05, 0xd2, 0x12, 0x20, + 0x00, 0x21, 0x29, 0x70, 0x3b, 0xe7, 0x11, 0x20, 0x39, 0xe7, 0x6d, 0x48, + 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x10, 0xb1, 0x00, 0x20, 0x28, 0x70, + 0x0b, 0xe7, 0x07, 0x20, 0xf0, 0xe7, 0x05, 0x94, 0x14, 0xf8, 0x01, 0xef, + 0xce, 0xeb, 0x0e, 0x10, 0x07, 0x94, 0x0c, 0xeb, 0x40, 0x10, 0x00, 0xf5, + 0xea, 0x73, 0x90, 0xf8, 0xd5, 0x21, 0x00, 0xf5, 0xe8, 0x70, 0x13, 0xf8, + 0x02, 0x5b, 0x45, 0xea, 0x02, 0x22, 0x1d, 0x78, 0x5b, 0x78, 0x45, 0xea, + 0x03, 0x23, 0x42, 0xea, 0x03, 0x48, 0x80, 0x45, 0x00, 0xf0, 0x94, 0x80, + 0x05, 0x98, 0x00, 0x21, 0x08, 0x30, 0x06, 0x90, 0xd8, 0xf8, 0x44, 0x00, + 0x00, 0x28, 0x71, 0xd0, 0x90, 0xf8, 0x21, 0x20, 0x00, 0x2a, 0x6d, 0xd0, + 0x0a, 0x91, 0x98, 0xf8, 0xf4, 0x10, 0x85, 0x1c, 0x08, 0xf1, 0x50, 0x02, + 0x08, 0xf1, 0x4e, 0x03, 0x28, 0x46, 0x09, 0x91, 0x01, 0x21, 0xee, 0xf7, + 0x2b, 0xfe, 0x98, 0xf8, 0x4e, 0x00, 0x08, 0xf1, 0x58, 0x03, 0x08, 0xf1, + 0x5a, 0x02, 0x00, 0x21, 0x2c, 0x46, 0x08, 0x93, 0x88, 0xf8, 0xd4, 0x00, + 0x28, 0x46, 0xee, 0xf7, 0x1d, 0xfe, 0x41, 0x49, 0x09, 0x9d, 0x2a, 0x23, + 0x98, 0xf8, 0x4e, 0x20, 0x98, 0xf8, 0x58, 0x00, 0x15, 0xfb, 0x03, 0x11, + 0x06, 0x9d, 0x88, 0xf8, 0xd5, 0x00, 0xcb, 0x8b, 0x2b, 0x80, 0x91, 0xf8, + 0x20, 0x30, 0x91, 0xf8, 0x21, 0x50, 0x91, 0xf8, 0x22, 0x10, 0x88, 0xf8, + 0x4f, 0x30, 0xb8, 0xf8, 0x50, 0x30, 0x88, 0xf8, 0x59, 0x50, 0x88, 0xf8, + 0x28, 0x10, 0x02, 0xfb, 0x03, 0xf3, 0xa8, 0xf8, 0x3c, 0x30, 0xb8, 0xf8, + 0x5a, 0x30, 0x00, 0xfb, 0x03, 0xf3, 0xa8, 0xf8, 0x3e, 0x30, 0x2d, 0x4b, + 0x93, 0xf8, 0xc8, 0x32, 0x03, 0xf1, 0x05, 0x03, 0x88, 0xf8, 0x5c, 0x30, + 0x88, 0xf8, 0x52, 0x30, 0x4a, 0xb1, 0xb1, 0xfb, 0xf2, 0xf3, 0x03, 0xfb, + 0x12, 0x12, 0x88, 0xf8, 0x54, 0x30, 0x1a, 0x44, 0x01, 0x3a, 0x88, 0xf8, + 0x53, 0x20, 0x40, 0xb1, 0xb1, 0xfb, 0xf0, 0xf2, 0x08, 0x9b, 0x02, 0xfb, + 0x10, 0x10, 0x9a, 0x71, 0x10, 0x44, 0x01, 0x38, 0x58, 0x71, 0x20, 0x48, + 0x01, 0x21, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0xc8, 0xf8, 0x30, 0x00, + 0x07, 0x98, 0x0a, 0x99, 0xd9, 0xf8, 0x00, 0xc0, 0x90, 0xf8, 0x00, 0xe0, + 0x01, 0x31, 0xff, 0xe7, 0x18, 0xf8, 0x04, 0x0f, 0x98, 0xf8, 0x01, 0x20, + 0x98, 0xf8, 0x02, 0x30, 0x98, 0xf8, 0x03, 0x50, 0x40, 0xea, 0x02, 0x20, + 0x43, 0xea, 0x05, 0x22, 0x40, 0xea, 0x02, 0x48, 0x5f, 0xfa, 0x8e, 0xf0, + 0xc0, 0xeb, 0x00, 0x10, 0x0c, 0xeb, 0x40, 0x10, 0x00, 0xf5, 0xe8, 0x70, + 0x80, 0x45, 0x7f, 0xf4, 0x71, 0xaf, 0x00, 0xe0, 0x00, 0x21, 0x05, 0x9c, + 0xc9, 0xb2, 0x94, 0xf8, 0xc0, 0x00, 0x81, 0x42, 0x3f, 0xf4, 0x29, 0xaf, + 0xd7, 0xf8, 0x1c, 0x14, 0x00, 0x29, 0x7f, 0xf4, 0xa1, 0xae, 0xaa, 0xe6, + 0xe8, 0x72, 0x01, 0x00, 0x70, 0x52, 0x01, 0x00, 0xe0, 0x35, 0x01, 0x00, + 0xe8, 0x65, 0x08, 0x00, 0xa4, 0x32, 0x06, 0x00, 0x58, 0xce, 0x08, 0x00, + 0xb8, 0x8e, 0x08, 0x00, 0xc0, 0xf0, 0x05, 0x00, 0xb4, 0x8e, 0x08, 0x00, + 0x04, 0xb6, 0x08, 0x00, 0x88, 0xb8, 0x08, 0x00, 0xc4, 0x8e, 0x08, 0x00, + 0xbc, 0x9b, 0x08, 0x00, 0xb0, 0xb5, 0xc4, 0x78, 0x00, 0x79, 0x4f, 0xf4, + 0x70, 0x61, 0x01, 0xea, 0x00, 0x25, 0x28, 0x19, 0x16, 0x28, 0x0c, 0xd8, + 0xd3, 0x49, 0x00, 0xeb, 0x40, 0x00, 0x51, 0xf8, 0x20, 0x20, 0x32, 0xb1, + 0x01, 0xeb, 0x80, 0x00, 0x00, 0x79, 0x03, 0x28, 0x04, 0xbf, 0x01, 0x20, + 0xb0, 0xbd, 0x03, 0x20, 0x42, 0xf2, 0x7a, 0x01, 0x02, 0x22, 0xda, 0xf7, + 0x77, 0xf9, 0x20, 0xb1, 0x29, 0x0a, 0x84, 0x71, 0xc1, 0x71, 0xda, 0xf7, + 0x47, 0xf9, 0x00, 0x20, 0xb0, 0xbd, 0x00, 0xbf, 0x10, 0xb5, 0x08, 0x20, + 0x41, 0xf2, 0x05, 0x01, 0x00, 0x22, 0xda, 0xf7, 0x67, 0xf9, 0xf0, 0xb1, + 0x04, 0x46, 0x0f, 0x48, 0x00, 0x68, 0x80, 0x47, 0xa0, 0x71, 0x00, 0x0a, + 0x00, 0x23, 0x00, 0x21, 0xe0, 0x71, 0xe6, 0x48, 0xb0, 0xf8, 0x56, 0x25, + 0x04, 0x2a, 0x28, 0xbf, 0x13, 0x1f, 0x23, 0x72, 0x90, 0xf8, 0x1d, 0x25, + 0x01, 0x3a, 0x62, 0x72, 0x12, 0x0a, 0xa2, 0x72, 0x90, 0xf8, 0x55, 0x05, + 0x21, 0x73, 0xe0, 0x72, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0xda, 0xf7, + 0x1d, 0xb9, 0x10, 0xbd, 0xc8, 0xc9, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, + 0x87, 0xb0, 0x00, 0x24, 0x07, 0x46, 0x4f, 0xf4, 0x70, 0x61, 0x06, 0x94, + 0xcd, 0xe9, 0x04, 0x44, 0xcd, 0xe9, 0x02, 0x44, 0x90, 0xf8, 0x07, 0xb0, + 0xc3, 0x78, 0x00, 0x79, 0x97, 0xf8, 0x05, 0x90, 0x97, 0xf8, 0x06, 0x80, + 0x01, 0xea, 0x00, 0x25, 0xb9, 0xf1, 0x01, 0x0f, 0x8d, 0xf8, 0x15, 0xb0, + 0xcd, 0xe9, 0x00, 0x53, 0x0a, 0xd8, 0x79, 0x7b, 0xba, 0x7b, 0x38, 0x7b, + 0x09, 0x02, 0x41, 0xea, 0x02, 0x41, 0x08, 0x44, 0x9d, 0x49, 0x88, 0x42, + 0x02, 0xd9, 0x00, 0x24, 0x12, 0x25, 0x39, 0xe0, 0x45, 0xea, 0x03, 0x00, + 0x16, 0x28, 0x33, 0xd8, 0x99, 0x49, 0x00, 0xeb, 0x40, 0x00, 0x51, 0xf8, + 0x20, 0x40, 0x6c, 0xb3, 0x01, 0xeb, 0x80, 0x00, 0x00, 0x79, 0x05, 0x38, + 0x01, 0x28, 0x27, 0xd8, 0x94, 0x48, 0x94, 0xf8, 0x1d, 0x11, 0xc1, 0xeb, + 0x01, 0x11, 0x00, 0x68, 0x49, 0x01, 0x40, 0x5c, 0x40, 0xf0, 0x02, 0x01, + 0x02, 0x29, 0x19, 0xbf, 0x04, 0xf5, 0x9b, 0x72, 0x04, 0xf5, 0x9a, 0x71, + 0x04, 0xf5, 0x9b, 0x71, 0x04, 0xf5, 0x9a, 0x72, 0x09, 0x88, 0x12, 0x88, + 0x19, 0xb9, 0xb9, 0xf1, 0x01, 0x0f, 0x00, 0xf0, 0x08, 0x81, 0x1a, 0xb9, + 0xb9, 0xf1, 0x00, 0x0f, 0x00, 0xf0, 0x03, 0x81, 0x20, 0xb1, 0x94, 0xf8, + 0x1c, 0x01, 0x01, 0x28, 0x40, 0xf0, 0xfd, 0x80, 0x00, 0x25, 0x01, 0xe0, + 0x00, 0x24, 0x02, 0x25, 0x80, 0x4e, 0x81, 0x4a, 0x48, 0x21, 0x43, 0x46, + 0x30, 0x46, 0xd7, 0xf7, 0xa5, 0xfc, 0xa4, 0x48, 0x00, 0xf5, 0x96, 0x7a, + 0x90, 0xf8, 0x2c, 0x01, 0x80, 0x07, 0x05, 0xd5, 0x7b, 0x48, 0x01, 0x21, + 0x32, 0x46, 0x03, 0x68, 0x02, 0x20, 0x98, 0x47, 0x79, 0x4a, 0x30, 0x46, + 0x48, 0x21, 0x4b, 0x46, 0xd7, 0xf7, 0x92, 0xfc, 0x9a, 0xf8, 0x00, 0x00, + 0x80, 0x07, 0x05, 0xd5, 0x73, 0x48, 0x01, 0x21, 0x32, 0x46, 0x03, 0x68, + 0x02, 0x20, 0x98, 0x47, 0x7d, 0xb1, 0x78, 0x48, 0x03, 0x21, 0x02, 0x68, + 0x42, 0xf2, 0x6e, 0x00, 0x90, 0x47, 0x28, 0xb3, 0x01, 0x99, 0x45, 0x71, + 0x81, 0x71, 0x00, 0x99, 0x09, 0x0a, 0xc1, 0x71, 0xda, 0xf7, 0x82, 0xf8, + 0x26, 0xe0, 0x65, 0x4d, 0x94, 0xf8, 0x1d, 0x11, 0x28, 0x68, 0xc1, 0xeb, + 0x01, 0x11, 0x00, 0xeb, 0x41, 0x10, 0x66, 0x49, 0x40, 0x78, 0x49, 0x68, + 0xc0, 0xeb, 0xc0, 0x00, 0x01, 0xeb, 0x80, 0x00, 0xff, 0x21, 0x41, 0x73, + 0x20, 0x6b, 0xb0, 0xb1, 0x60, 0x6b, 0xa0, 0xb1, 0xb9, 0xf1, 0x01, 0x0f, + 0x69, 0xd0, 0xb9, 0xf1, 0x00, 0x0f, 0x4e, 0xd1, 0x00, 0x78, 0x65, 0xe0, + 0x9a, 0xf8, 0x00, 0x00, 0x80, 0x07, 0x05, 0xd5, 0x57, 0x48, 0x60, 0x4a, + 0x00, 0x21, 0x03, 0x68, 0x02, 0x20, 0x98, 0x47, 0x07, 0xb0, 0xbd, 0xe8, + 0xf0, 0x8f, 0xbb, 0xf1, 0xff, 0x0f, 0x0b, 0xd1, 0x38, 0x7a, 0x79, 0x7a, + 0xba, 0x7a, 0xfb, 0x7a, 0x8d, 0xf8, 0x16, 0x00, 0x8d, 0xf8, 0x17, 0x10, + 0x8d, 0xf8, 0x18, 0x20, 0x8d, 0xf8, 0x19, 0x30, 0xfb, 0x7b, 0x8d, 0xf8, + 0x14, 0x30, 0x13, 0xb3, 0x4e, 0x4a, 0x30, 0x46, 0x48, 0x21, 0xd7, 0xf7, + 0x35, 0xfc, 0x9a, 0xf8, 0x00, 0x00, 0x80, 0x07, 0x05, 0xd5, 0x45, 0x48, + 0x01, 0x21, 0x32, 0x46, 0x03, 0x68, 0x02, 0x20, 0x98, 0x47, 0xb9, 0xf1, + 0x00, 0x0f, 0x08, 0xbf, 0xbb, 0xf1, 0xff, 0x0f, 0x34, 0xd0, 0x45, 0x48, + 0x9d, 0xf8, 0x14, 0x50, 0x01, 0x68, 0x28, 0x46, 0x88, 0x47, 0x04, 0x90, + 0x28, 0xb3, 0x07, 0xf1, 0x10, 0x02, 0x29, 0x46, 0x2b, 0x46, 0xd4, 0xf7, + 0xef, 0xf9, 0x3b, 0x48, 0x04, 0xab, 0x42, 0x46, 0x10, 0xf8, 0x09, 0x10, + 0x39, 0x48, 0x05, 0x68, 0x20, 0x46, 0xa8, 0x47, 0x78, 0xb1, 0x3a, 0x48, + 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x05, 0x46, 0x00, 0x28, 0x7f, 0xf4, + 0x7e, 0xaf, 0x60, 0x6b, 0x18, 0xb1, 0x90, 0xf8, 0x2a, 0x00, 0xc0, 0x07, + 0xae, 0xd1, 0x00, 0x25, 0x75, 0xe7, 0x04, 0x98, 0x00, 0x28, 0x44, 0xd0, + 0xda, 0xf7, 0x3e, 0xf8, 0x41, 0xe0, 0x07, 0x25, 0x6d, 0xe7, 0x40, 0x78, + 0xff, 0x28, 0x31, 0xd0, 0x0c, 0x25, 0x68, 0xe7, 0x94, 0xf8, 0x1d, 0x11, + 0x28, 0x68, 0xc1, 0xeb, 0x01, 0x11, 0x49, 0x01, 0x40, 0x5c, 0x00, 0x28, + 0xc1, 0xd1, 0x07, 0xf1, 0x10, 0x02, 0x04, 0xa8, 0x02, 0xa9, 0xe4, 0xf7, + 0x9f, 0xfe, 0x41, 0x07, 0x10, 0xd5, 0x94, 0xf8, 0x1d, 0x21, 0x29, 0x68, + 0xc2, 0xeb, 0x02, 0x12, 0x01, 0xeb, 0x42, 0x11, 0x1a, 0x4a, 0x49, 0x78, + 0x52, 0x68, 0xc1, 0xeb, 0xc1, 0x01, 0x02, 0xeb, 0x81, 0x01, 0x9d, 0xf8, + 0x0f, 0x20, 0x4a, 0x73, 0x07, 0x28, 0xa6, 0xd1, 0xbd, 0xf8, 0x0a, 0x00, + 0x01, 0x28, 0xa2, 0xd1, 0xdd, 0xe9, 0x02, 0x01, 0x22, 0x46, 0xee, 0xf7, + 0xb5, 0xfb, 0x00, 0x28, 0x9b, 0xd1, 0x0a, 0xe0, 0x0f, 0x48, 0x42, 0x46, + 0x00, 0x23, 0x10, 0xf8, 0x09, 0x10, 0x0e, 0x48, 0x05, 0x68, 0x20, 0x46, + 0xa8, 0x47, 0x00, 0x28, 0xa7, 0xd1, 0x1f, 0x25, 0x2b, 0xe7, 0x0c, 0x25, + 0x04, 0xe7, 0x00, 0xbf, 0x00, 0x09, 0x3d, 0x00, 0xe8, 0x72, 0x01, 0x00, + 0xe0, 0x35, 0x01, 0x00, 0x04, 0x86, 0x01, 0x00, 0x70, 0xd7, 0x04, 0x00, + 0x70, 0x9b, 0x08, 0x00, 0x83, 0xd7, 0x04, 0x00, 0xec, 0xe5, 0x05, 0x00, + 0xb4, 0x42, 0x06, 0x10, 0x68, 0xb6, 0x08, 0x00, 0x97, 0xd7, 0x04, 0x00, + 0x4c, 0x9c, 0x08, 0x00, 0x6c, 0xb6, 0x08, 0x00, 0x28, 0x9c, 0x08, 0x00, + 0xb1, 0xd7, 0x04, 0x00, 0xb0, 0xb5, 0x07, 0x20, 0x42, 0xf2, 0x60, 0x01, + 0x00, 0x22, 0xd9, 0xf7, 0xbf, 0xff, 0x60, 0xb3, 0x16, 0x4d, 0x04, 0x46, + 0xb5, 0xf8, 0x32, 0x05, 0xa0, 0x71, 0x00, 0x0a, 0xe0, 0x71, 0x14, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x20, 0x72, 0x13, 0x48, 0xb5, 0xf8, 0x5e, 0x25, + 0xb0, 0xf8, 0xc0, 0x11, 0x0c, 0x3a, 0x8a, 0x42, 0xb8, 0xbf, 0x11, 0x46, + 0x61, 0x72, 0x09, 0x0a, 0xa1, 0x72, 0x0e, 0x49, 0x91, 0xf8, 0x20, 0x20, + 0xd2, 0x07, 0x07, 0xd0, 0x90, 0xf9, 0xba, 0x01, 0xb0, 0xf1, 0xff, 0x3f, + 0x02, 0xdd, 0x01, 0xf1, 0x21, 0x00, 0x01, 0xe0, 0x05, 0xf2, 0x5d, 0x50, + 0x00, 0x78, 0xe0, 0x72, 0x20, 0x46, 0xbd, 0xe8, 0xb0, 0x40, 0xd9, 0xf7, + 0x67, 0xbf, 0xb0, 0xbd, 0x8c, 0x7e, 0x08, 0x00, 0xe8, 0xb3, 0x08, 0x00, + 0xe8, 0x65, 0x08, 0x00, 0x50, 0x32, 0x06, 0x00, 0x7f, 0xb5, 0x84, 0x79, + 0x0c, 0xb1, 0x04, 0x2c, 0x01, 0xd9, 0x11, 0x20, 0x0f, 0xe0, 0xc1, 0x78, + 0x02, 0x79, 0x43, 0x79, 0x29, 0x48, 0x01, 0x3c, 0x00, 0x26, 0xe4, 0xb2, + 0x05, 0x68, 0x24, 0x48, 0x00, 0x78, 0xcd, 0xe9, 0x00, 0x64, 0xcd, 0xe9, + 0x02, 0x06, 0x00, 0x20, 0xa8, 0x47, 0x42, 0xf2, 0x34, 0x01, 0x04, 0xb0, + 0xbd, 0xe8, 0x70, 0x40, 0xd9, 0xf7, 0x46, 0xbf, 0x7f, 0xb5, 0x04, 0x46, + 0x40, 0x7a, 0x20, 0x44, 0x80, 0x7a, 0x7e, 0x28, 0x03, 0xd0, 0x7f, 0x28, + 0x04, 0xd1, 0x18, 0x48, 0x00, 0xe0, 0x16, 0x48, 0x05, 0x78, 0x07, 0xe0, + 0x16, 0x49, 0x40, 0xb2, 0x00, 0x22, 0x02, 0x23, 0x0d, 0x68, 0x02, 0x21, + 0xa8, 0x47, 0x05, 0x46, 0xa0, 0x79, 0x08, 0xb1, 0x04, 0x28, 0x01, 0xd9, + 0x11, 0x20, 0x13, 0xe0, 0x10, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, + 0x70, 0xb9, 0x0f, 0x48, 0xe1, 0x78, 0x22, 0x79, 0x63, 0x79, 0x06, 0x68, + 0xa0, 0x79, 0x00, 0x24, 0x01, 0x38, 0xc0, 0xb2, 0xcd, 0xe9, 0x00, 0x40, + 0x00, 0x20, 0xcd, 0xe9, 0x02, 0x54, 0xb0, 0x47, 0x42, 0xf2, 0x7b, 0x01, + 0x04, 0xb0, 0xbd, 0xe8, 0x70, 0x40, 0xd9, 0xf7, 0x0f, 0xbf, 0x00, 0xbf, + 0x6b, 0x34, 0x01, 0x00, 0x6a, 0x34, 0x01, 0x00, 0x3c, 0x9c, 0x08, 0x00, + 0x7c, 0xbe, 0x08, 0x00, 0x54, 0xbe, 0x08, 0x00, 0x10, 0xb5, 0x0e, 0x48, + 0x90, 0xf8, 0x3c, 0x10, 0x01, 0xf0, 0x82, 0x01, 0x82, 0x29, 0x0d, 0xd1, + 0xd0, 0xf8, 0xac, 0x40, 0x00, 0x20, 0x42, 0xf2, 0x0e, 0x01, 0xd9, 0xf7, + 0xf5, 0xfe, 0x08, 0x48, 0x21, 0x46, 0x02, 0x68, 0x02, 0x20, 0xbd, 0xe8, + 0x10, 0x40, 0x10, 0x47, 0x0c, 0x20, 0x42, 0xf2, 0x0e, 0x01, 0xbd, 0xe8, + 0x10, 0x40, 0xd9, 0xf7, 0xe7, 0xbe, 0x00, 0xbf, 0x90, 0x01, 0x00, 0x00, + 0x9c, 0xba, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, 0xaf, 0xb0, 0xdf, 0xf8, + 0x5c, 0x16, 0x9d, 0x4b, 0x8a, 0x80, 0x1b, 0x68, 0x0b, 0x60, 0x40, 0xf6, + 0x7c, 0x41, 0x8a, 0x42, 0x44, 0xd0, 0x41, 0xf2, 0x05, 0x01, 0x8a, 0x42, + 0x00, 0xf0, 0x92, 0x80, 0x41, 0xf2, 0x0e, 0x01, 0x8a, 0x42, 0x00, 0xf0, + 0x90, 0x80, 0x41, 0xf2, 0x0f, 0x01, 0x8a, 0x42, 0x00, 0xf0, 0xa6, 0x80, + 0x42, 0xf2, 0x0e, 0x01, 0x8a, 0x42, 0x00, 0xf0, 0xba, 0x80, 0x42, 0xf2, + 0x7b, 0x01, 0x8a, 0x42, 0x00, 0xf0, 0xb8, 0x80, 0x42, 0xf2, 0x34, 0x01, + 0x8a, 0x42, 0x00, 0xf0, 0xb7, 0x80, 0x42, 0xf2, 0x60, 0x01, 0x8a, 0x42, + 0x00, 0xf0, 0xb6, 0x80, 0x42, 0xf2, 0x62, 0x01, 0x8a, 0x42, 0x00, 0xf0, + 0xb4, 0x80, 0x42, 0xf2, 0x64, 0x01, 0x8a, 0x42, 0x00, 0xf0, 0xdd, 0x80, + 0x42, 0xf2, 0x6d, 0x01, 0x8a, 0x42, 0x00, 0xf0, 0xdc, 0x80, 0x42, 0xf2, + 0x6e, 0x01, 0x8a, 0x42, 0x00, 0xf0, 0xdb, 0x80, 0x42, 0xf2, 0x7a, 0x01, + 0x8a, 0x42, 0x00, 0xf0, 0xda, 0x80, 0x42, 0xf2, 0x27, 0x01, 0x8a, 0x42, + 0x40, 0xf0, 0xdb, 0x80, 0x00, 0x68, 0xff, 0xf7, 0x1d, 0xfa, 0xcb, 0xe0, + 0x05, 0x68, 0x00, 0x20, 0x03, 0x21, 0x1f, 0x90, 0xdf, 0xf8, 0xe0, 0x05, + 0x2e, 0x79, 0xef, 0x78, 0x02, 0x68, 0x40, 0xf6, 0x7c, 0x40, 0x90, 0x47, + 0x00, 0x28, 0x00, 0xf0, 0xd5, 0x80, 0x04, 0x46, 0x87, 0x71, 0x30, 0x02, + 0xc0, 0xf3, 0x03, 0x20, 0xe0, 0x71, 0x4f, 0xf4, 0x70, 0x60, 0x00, 0xea, + 0x06, 0x20, 0x38, 0x44, 0x16, 0x28, 0x00, 0xf2, 0xbc, 0x80, 0xdf, 0xf8, + 0xb4, 0x15, 0x00, 0xeb, 0x40, 0x02, 0x51, 0xf8, 0x22, 0x20, 0x00, 0x2a, + 0x00, 0xf0, 0xb3, 0x80, 0x00, 0xeb, 0x40, 0x02, 0x01, 0xeb, 0x82, 0x01, + 0x09, 0x79, 0x03, 0x29, 0x40, 0xf0, 0xab, 0x80, 0xdf, 0xf8, 0x94, 0x15, + 0x0a, 0x68, 0x1f, 0xa9, 0x90, 0x47, 0x06, 0x46, 0x00, 0x28, 0x40, 0xf0, + 0x15, 0x82, 0x68, 0x79, 0xa9, 0x79, 0x40, 0xea, 0x01, 0x20, 0x00, 0x28, + 0x00, 0xf0, 0xf6, 0x81, 0x1f, 0x99, 0x00, 0x29, 0x00, 0xf0, 0x04, 0x82, + 0xb1, 0xf8, 0xe4, 0x32, 0xb1, 0xf8, 0xdc, 0x22, 0x01, 0x33, 0x5a, 0x43, + 0xb1, 0xf8, 0x40, 0x34, 0x5a, 0x43, 0x03, 0x01, 0xb3, 0xeb, 0x42, 0x0f, + 0x80, 0xf0, 0xef, 0x81, 0x12, 0x26, 0xf4, 0xe1, 0xff, 0xf7, 0xf2, 0xfc, + 0x93, 0xe0, 0x00, 0x68, 0x05, 0x21, 0x05, 0x23, 0xc2, 0x1c, 0x1f, 0xa8, + 0xd3, 0xf7, 0xfc, 0xff, 0xdf, 0xf8, 0x30, 0x05, 0x05, 0x21, 0x02, 0x68, + 0x41, 0xf2, 0x0e, 0x00, 0x90, 0x47, 0x00, 0x28, 0x66, 0xd0, 0x12, 0x21, + 0x41, 0x72, 0x34, 0x21, 0x01, 0x72, 0x02, 0x21, 0xc1, 0x71, 0x01, 0x21, + 0x81, 0x71, 0x00, 0x21, 0x41, 0x71, 0x51, 0xe0, 0x00, 0x68, 0x05, 0x21, + 0x05, 0x23, 0xc2, 0x1c, 0x1f, 0xa8, 0xd3, 0xf7, 0xe1, 0xff, 0x07, 0x20, + 0x41, 0xf2, 0x0f, 0x01, 0x00, 0x22, 0x00, 0x24, 0xd9, 0xf7, 0x36, 0xfe, + 0x00, 0x28, 0x4b, 0xd0, 0x01, 0x21, 0xc4, 0x72, 0x84, 0x72, 0x04, 0x72, + 0xc4, 0x71, 0x44, 0x71, 0x41, 0x72, 0x81, 0x71, 0x38, 0xe0, 0xff, 0xf7, + 0x01, 0xff, 0x5c, 0xe0, 0x00, 0x68, 0xff, 0xf7, 0xbb, 0xfe, 0x58, 0xe0, + 0x00, 0x68, 0xff, 0xf7, 0x99, 0xfe, 0x54, 0xe0, 0xff, 0xf7, 0x58, 0xfe, + 0x51, 0xe0, 0x06, 0x68, 0x75, 0x7c, 0x96, 0xf8, 0x03, 0xa0, 0x1f, 0x2d, + 0x98, 0xbf, 0xba, 0xf1, 0xef, 0x0f, 0x4f, 0xd9, 0x00, 0x25, 0x12, 0x27, + 0x03, 0x20, 0x00, 0xeb, 0x45, 0x00, 0xc1, 0xb2, 0xdf, 0xf8, 0x9c, 0x04, + 0x02, 0x68, 0x42, 0xf2, 0x62, 0x00, 0x90, 0x47, 0xd8, 0xb3, 0xc5, 0x71, + 0x80, 0xf8, 0x06, 0xa0, 0x47, 0x71, 0x7d, 0xb1, 0x00, 0x22, 0x01, 0x21, + 0x1f, 0xab, 0x13, 0xf8, 0x12, 0x60, 0x00, 0xeb, 0x42, 0x04, 0x03, 0xeb, + 0x42, 0x02, 0x26, 0x72, 0x52, 0x78, 0x62, 0x72, 0x4a, 0xb2, 0x01, 0x31, + 0xaa, 0x42, 0xf2, 0xdb, 0xd9, 0xf7, 0xc6, 0xfd, 0x23, 0xe0, 0x00, 0x68, + 0xff, 0xf7, 0xf2, 0xf9, 0x1f, 0xe0, 0x00, 0x68, 0xff, 0xf7, 0xb4, 0xf9, + 0x1b, 0xe0, 0x00, 0x68, 0xff, 0xf7, 0xa0, 0xfc, 0x17, 0xe0, 0x00, 0x68, + 0x2f, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, 0xff, 0xf7, 0x49, 0xbc, 0x01, 0x20, + 0x10, 0xe0, 0x20, 0x46, 0xd9, 0xf7, 0xea, 0xfd, 0xdf, 0xf8, 0x40, 0x04, + 0x40, 0xf6, 0x7c, 0x41, 0x02, 0x68, 0x28, 0x46, 0x90, 0x47, 0x04, 0xe0, + 0x00, 0x20, 0x40, 0xf2, 0x53, 0x11, 0xd9, 0xf7, 0xbf, 0xfd, 0x00, 0x20, + 0x2f, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0xbf, 0x24, 0x20, 0x00, 0x40, + 0x96, 0xf8, 0x0a, 0xb0, 0xbb, 0xf1, 0x07, 0x0f, 0xaa, 0xd8, 0xf4, 0x7a, + 0x01, 0x2c, 0xa7, 0xd8, 0x37, 0x7b, 0x01, 0x2f, 0xa4, 0xd8, 0x30, 0x7a, + 0x96, 0xf8, 0x09, 0x80, 0x96, 0xf8, 0x06, 0x90, 0x51, 0x46, 0x00, 0x22, + 0x1a, 0x90, 0x30, 0x79, 0x1c, 0x90, 0x70, 0x79, 0x1b, 0x90, 0xf0, 0x79, + 0x19, 0x90, 0x30, 0x7c, 0x18, 0x90, 0xf0, 0x7b, 0x16, 0x90, 0xb0, 0x7b, + 0x17, 0x90, 0x70, 0x7b, 0x15, 0x90, 0xe8, 0x48, 0x03, 0x68, 0x00, 0x20, + 0x98, 0x47, 0x00, 0x28, 0x00, 0xf0, 0x1e, 0x81, 0x90, 0xf8, 0x06, 0x11, + 0x01, 0x29, 0x40, 0xf0, 0x1c, 0x81, 0x10, 0x90, 0x08, 0x97, 0x00, 0x27, + 0x00, 0x2d, 0xcd, 0xe9, 0x06, 0x98, 0x00, 0xf0, 0x2a, 0x81, 0x18, 0x98, + 0x16, 0x99, 0x4f, 0xf0, 0x00, 0x0e, 0x4f, 0xf0, 0x00, 0x0c, 0x41, 0xea, + 0x00, 0x20, 0x40, 0xf6, 0x9c, 0x71, 0x05, 0x38, 0x80, 0xb2, 0x88, 0x42, + 0x4f, 0xf0, 0x00, 0x00, 0x38, 0xbf, 0x01, 0x20, 0xdd, 0xe9, 0x19, 0x32, + 0x43, 0xea, 0x02, 0x22, 0xd5, 0x4b, 0x42, 0xea, 0x08, 0x42, 0xff, 0x3a, + 0x9a, 0x42, 0x4f, 0xf0, 0x00, 0x02, 0x38, 0xbf, 0x01, 0x22, 0x10, 0x40, + 0x09, 0x90, 0x17, 0x98, 0x15, 0x9a, 0x42, 0xea, 0x00, 0x20, 0x05, 0x38, + 0x80, 0xb2, 0x88, 0x42, 0x4f, 0xf0, 0x00, 0x00, 0x38, 0xbf, 0x01, 0x20, + 0xdd, 0xe9, 0x1b, 0x21, 0x41, 0xea, 0x02, 0x21, 0x41, 0xea, 0x09, 0x41, + 0x4f, 0xf0, 0x00, 0x09, 0xff, 0x39, 0x99, 0x42, 0x4f, 0xf0, 0x00, 0x01, + 0x4f, 0xf0, 0x00, 0x03, 0x38, 0xbf, 0x01, 0x21, 0x08, 0x40, 0x0a, 0x90, + 0x00, 0x20, 0x0b, 0x90, 0x0e, 0xeb, 0xce, 0x00, 0x30, 0x44, 0x81, 0x7c, + 0xef, 0x29, 0x1d, 0x91, 0x00, 0xf2, 0x3a, 0x81, 0xc1, 0x7c, 0x02, 0x7d, + 0x41, 0xea, 0x02, 0x21, 0xb7, 0xeb, 0x11, 0x3f, 0x1e, 0x91, 0x40, 0xf0, + 0x31, 0x81, 0x41, 0x7d, 0x82, 0x7d, 0x41, 0xea, 0x02, 0x28, 0xb7, 0xeb, + 0x18, 0x3f, 0x40, 0xf0, 0x29, 0x81, 0x81, 0x7e, 0x42, 0x7e, 0x90, 0xf9, + 0x17, 0x70, 0x11, 0x91, 0x90, 0xf9, 0x18, 0x10, 0x14, 0x91, 0x1e, 0x98, + 0x68, 0xb1, 0x01, 0x20, 0xbc, 0xf1, 0x00, 0x0f, 0x1c, 0xbf, 0x60, 0x46, + 0x4f, 0xf0, 0x01, 0x0c, 0x0a, 0x99, 0x41, 0xea, 0x0c, 0x01, 0x01, 0x29, + 0x40, 0xf0, 0x12, 0x81, 0x84, 0x46, 0xb8, 0xf1, 0x00, 0x0f, 0x0a, 0xd0, + 0x01, 0x20, 0x00, 0x2b, 0x1c, 0xbf, 0x18, 0x46, 0x01, 0x23, 0x09, 0x99, + 0x19, 0x43, 0x01, 0x29, 0x40, 0xf0, 0x04, 0x81, 0x03, 0x46, 0x1e, 0x98, + 0x50, 0xea, 0x08, 0x00, 0x00, 0xf0, 0x00, 0x81, 0x9f, 0x48, 0x00, 0x78, + 0x03, 0x28, 0x06, 0xd0, 0x00, 0x2f, 0x00, 0xf1, 0xf9, 0x80, 0x14, 0x99, + 0x00, 0x29, 0x00, 0xf1, 0xf5, 0x80, 0x00, 0x2f, 0xcd, 0xe9, 0x0d, 0xc2, + 0xcd, 0xe9, 0x12, 0xe3, 0x00, 0xf0, 0xee, 0x80, 0x97, 0x49, 0x03, 0x38, + 0xb0, 0xfa, 0x80, 0xf0, 0x09, 0x68, 0x40, 0x09, 0x88, 0x47, 0x38, 0x40, + 0xf9, 0xb2, 0x81, 0x42, 0x40, 0xf0, 0xe2, 0x80, 0xcd, 0xf8, 0x3c, 0x90, + 0x14, 0x9f, 0x00, 0x2f, 0x00, 0xf0, 0xe0, 0x80, 0x8e, 0x48, 0x0c, 0x91, + 0x01, 0x68, 0x8c, 0x48, 0x00, 0x78, 0x03, 0x38, 0xb0, 0xfa, 0x80, 0xf0, + 0x40, 0x09, 0x88, 0x47, 0x38, 0x40, 0x5f, 0xfa, 0x87, 0xf9, 0x81, 0x45, + 0x40, 0xf0, 0xd0, 0x80, 0x87, 0x48, 0x1d, 0x9a, 0x51, 0x46, 0x00, 0x23, + 0x07, 0x68, 0x00, 0x20, 0xb8, 0x47, 0x70, 0xb1, 0x1e, 0x99, 0x10, 0x9a, + 0x00, 0x29, 0x40, 0xd0, 0xb8, 0xf1, 0x00, 0x0f, 0x0e, 0xd1, 0x01, 0x6b, + 0x61, 0xb1, 0x40, 0x6b, 0x50, 0xb1, 0x40, 0x78, 0xff, 0x28, 0x07, 0xd0, + 0x3e, 0xe0, 0x12, 0x99, 0x01, 0x20, 0x88, 0x40, 0x0b, 0x99, 0x01, 0x43, + 0x0b, 0x91, 0x10, 0x9a, 0x79, 0x48, 0x00, 0x21, 0x00, 0x23, 0x07, 0x68, + 0x0c, 0x98, 0xcd, 0xe9, 0x00, 0x09, 0x0e, 0x98, 0x02, 0x90, 0x11, 0x98, + 0x03, 0x90, 0x1e, 0x98, 0xcd, 0xe9, 0x04, 0x08, 0x10, 0x46, 0x1d, 0x9a, + 0xb8, 0x47, 0x00, 0x28, 0x00, 0xf0, 0xa0, 0x80, 0x90, 0xf8, 0x44, 0x10, + 0x12, 0x9b, 0x1f, 0xaa, 0x07, 0x46, 0x90, 0xf8, 0x1e, 0x01, 0x22, 0xf8, + 0x13, 0x10, 0x6c, 0x49, 0x09, 0x68, 0x88, 0x47, 0xdd, 0xf8, 0x3c, 0x90, + 0x13, 0x9b, 0xdd, 0xf8, 0x34, 0xc0, 0xf8, 0x62, 0x00, 0x27, 0x09, 0xf1, + 0x01, 0x09, 0x4f, 0xfa, 0x89, 0xfe, 0xae, 0x45, 0xff, 0xf6, 0x3c, 0xaf, + 0x2c, 0xe0, 0x01, 0x6b, 0x00, 0x29, 0xbb, 0xd0, 0x41, 0x6b, 0x00, 0x29, + 0xb8, 0xd0, 0x09, 0x78, 0xff, 0x29, 0xb5, 0xd0, 0x0c, 0x27, 0x7a, 0xe0, + 0x12, 0x26, 0x15, 0xe0, 0x07, 0x27, 0x00, 0x25, 0x68, 0xe6, 0x55, 0x49, + 0x09, 0x68, 0x88, 0x47, 0x00, 0x25, 0x0c, 0x27, 0x62, 0xe6, 0xa1, 0xf8, + 0x78, 0x02, 0xd3, 0xf7, 0x0f, 0xfe, 0x1f, 0x99, 0xc1, 0xf8, 0x7c, 0x02, + 0x00, 0x26, 0x5a, 0x48, 0x09, 0x21, 0x00, 0x78, 0xd3, 0xf7, 0x12, 0xfe, + 0x66, 0x71, 0x20, 0x46, 0x72, 0xe6, 0x00, 0x20, 0x4f, 0xf0, 0xff, 0x09, + 0x00, 0x23, 0x4f, 0xf0, 0x00, 0x0c, 0x0b, 0x90, 0x10, 0x98, 0x00, 0x27, + 0x90, 0xf8, 0xc0, 0x00, 0x00, 0x28, 0x3f, 0xf4, 0x45, 0xae, 0x4a, 0x48, + 0xbc, 0xf1, 0x00, 0x0f, 0x9e, 0x46, 0x00, 0x68, 0x1e, 0x90, 0x04, 0x97, + 0xdd, 0xe9, 0x17, 0x10, 0x08, 0xbf, 0x01, 0x46, 0x00, 0x2b, 0x08, 0xbf, + 0x08, 0x46, 0x16, 0x9a, 0x13, 0x93, 0xbc, 0xf1, 0x00, 0x0f, 0x15, 0x9b, + 0x08, 0xbf, 0x13, 0x46, 0xbe, 0xf1, 0x00, 0x0f, 0x08, 0xbf, 0x1a, 0x46, + 0x42, 0xea, 0x00, 0x20, 0x03, 0x90, 0x43, 0xea, 0x01, 0x20, 0xbc, 0xf1, + 0x00, 0x0f, 0x02, 0x90, 0xdd, 0xe9, 0x1a, 0x81, 0x08, 0xbf, 0x41, 0x46, + 0x1c, 0x9b, 0xdd, 0xf8, 0x64, 0xc0, 0x08, 0xbf, 0x63, 0x46, 0xdd, 0xe9, + 0x06, 0x2e, 0x43, 0xea, 0x01, 0x20, 0x08, 0xbf, 0x72, 0x46, 0x40, 0xea, + 0x02, 0x40, 0x00, 0x90, 0x13, 0x98, 0x00, 0x28, 0x1c, 0xbf, 0x41, 0x46, + 0x63, 0x46, 0x43, 0xea, 0x01, 0x20, 0x18, 0xbf, 0x72, 0x46, 0x40, 0xea, + 0x02, 0x40, 0x22, 0x46, 0x5b, 0x46, 0x01, 0x90, 0x10, 0x98, 0x08, 0x99, + 0x1e, 0x9c, 0xa0, 0x47, 0x00, 0x28, 0x7f, 0xf4, 0xfd, 0xad, 0x01, 0xe0, + 0x12, 0x27, 0x00, 0xe0, 0x11, 0x27, 0xdd, 0xf8, 0x2c, 0xb0, 0x06, 0xe0, + 0x11, 0x27, 0x00, 0xe0, 0x09, 0x27, 0xdd, 0xf8, 0x2c, 0xb0, 0xdd, 0xf8, + 0x3c, 0x90, 0x4f, 0xfa, 0x89, 0xf0, 0x00, 0x28, 0x3f, 0xf5, 0x7f, 0xaf, + 0x19, 0x4c, 0x06, 0xf1, 0x12, 0x08, 0x5f, 0xfa, 0x89, 0xf6, 0x4f, 0xf0, + 0x01, 0x09, 0xbb, 0xf1, 0x00, 0x0f, 0x3f, 0xf4, 0x74, 0xaf, 0x09, 0xfa, + 0x06, 0xf5, 0x15, 0xea, 0x0b, 0x0f, 0x0f, 0xd0, 0x06, 0xeb, 0xc6, 0x00, + 0xd4, 0xf8, 0x00, 0xc0, 0x51, 0x46, 0x00, 0x23, 0x18, 0xf8, 0x00, 0x20, + 0x00, 0x20, 0xe0, 0x47, 0x10, 0xb1, 0x10, 0x49, 0x09, 0x68, 0x88, 0x47, + 0x2b, 0xea, 0x05, 0x0b, 0x70, 0x1e, 0x00, 0x2e, 0x4f, 0xf0, 0x00, 0x05, + 0x06, 0x46, 0xe0, 0xdc, 0xc2, 0xe5, 0x00, 0xbf, 0x5c, 0xdc, 0x05, 0x00, + 0xcc, 0x8e, 0x08, 0x00, 0x84, 0xb8, 0x08, 0x00, 0x01, 0xff, 0x0f, 0x00, + 0x95, 0x53, 0x01, 0x00, 0xdc, 0x8e, 0x08, 0x00, 0xf8, 0x9b, 0x08, 0x00, + 0x90, 0xb8, 0x08, 0x00, 0x7c, 0xb6, 0x08, 0x00, 0xb8, 0x8e, 0x08, 0x00, + 0xb0, 0x8e, 0x08, 0x00, 0x28, 0x9c, 0x08, 0x00, 0xe8, 0x72, 0x01, 0x00, + 0x0c, 0x9c, 0x08, 0x00, 0x67, 0x34, 0x01, 0x00, 0x14, 0xe6, 0x08, 0x00, + 0x1c, 0xb5, 0x00, 0xf0, 0xf1, 0xf8, 0xdc, 0xf7, 0x5b, 0xfd, 0x0c, 0x48, + 0x00, 0x78, 0x01, 0x28, 0x0b, 0xd1, 0x0b, 0x48, 0x00, 0x21, 0x4f, 0xf4, + 0x7a, 0x72, 0x4f, 0xf4, 0x7a, 0x73, 0x04, 0x68, 0x00, 0x20, 0xcd, 0xe9, + 0x00, 0x00, 0x29, 0x20, 0xa0, 0x47, 0xdb, 0xf7, 0x2f, 0xfb, 0xde, 0xf7, + 0xe9, 0xf8, 0xbd, 0xe8, 0x1c, 0x40, 0x04, 0xf0, 0x2f, 0xb8, 0x00, 0xbf, + 0xf8, 0xdd, 0x05, 0x00, 0xcc, 0x9b, 0x08, 0x00, 0x80, 0xb5, 0x60, 0xb1, + 0x1c, 0x48, 0x00, 0x68, 0x80, 0x47, 0x1c, 0x48, 0x00, 0x78, 0x89, 0x28, + 0x20, 0xd1, 0xd9, 0xf7, 0xdb, 0xfb, 0x90, 0xb1, 0x34, 0x48, 0x01, 0x21, + 0x19, 0xe0, 0xd9, 0xf7, 0xd5, 0xfb, 0x30, 0xb9, 0x36, 0x48, 0x90, 0xf8, + 0x00, 0x04, 0x10, 0xb1, 0x15, 0x48, 0x02, 0x21, 0x01, 0x70, 0x15, 0x48, + 0x00, 0x68, 0x40, 0x68, 0x60, 0xb1, 0x80, 0x47, 0x0a, 0xe0, 0xd9, 0xf7, + 0xc5, 0xfb, 0x20, 0xb9, 0x0e, 0x48, 0x00, 0x68, 0x80, 0x47, 0x00, 0x28, + 0xe4, 0xd0, 0x27, 0x48, 0x02, 0x21, 0x01, 0x70, 0x0d, 0x48, 0x01, 0x21, + 0x02, 0x68, 0x06, 0x20, 0x90, 0x47, 0x0c, 0x48, 0x4f, 0xf4, 0x7a, 0x71, + 0x4f, 0xf4, 0x7a, 0x72, 0x00, 0x23, 0xd0, 0xf8, 0x00, 0xc0, 0x01, 0x20, + 0xbd, 0xe8, 0x80, 0x40, 0x60, 0x47, 0x00, 0xbf, 0xd8, 0x8f, 0x08, 0x00, + 0xe8, 0x2e, 0x01, 0x00, 0xdc, 0x8f, 0x08, 0x00, 0x98, 0x58, 0x01, 0x00, + 0x48, 0x36, 0x01, 0x00, 0x18, 0x9d, 0x08, 0x00, 0x20, 0x9d, 0x08, 0x00, + 0xb0, 0xb5, 0x00, 0xf0, 0x8b, 0xf8, 0x14, 0x4c, 0x20, 0x78, 0x01, 0x28, + 0x06, 0xd1, 0x04, 0x20, 0x20, 0x70, 0x12, 0x48, 0x01, 0x68, 0x12, 0x48, + 0x00, 0x78, 0x88, 0x47, 0x11, 0x4d, 0x72, 0xb6, 0x28, 0x68, 0x40, 0x00, + 0x01, 0x30, 0x28, 0x60, 0x20, 0x78, 0x02, 0x28, 0x0a, 0xd0, 0x03, 0x28, + 0x0a, 0xd1, 0x04, 0x20, 0x20, 0x70, 0x0c, 0x48, 0x02, 0x68, 0x0c, 0x48, + 0x00, 0xf1, 0x2c, 0x01, 0x90, 0x47, 0x01, 0xe0, 0x04, 0x20, 0x20, 0x70, + 0x28, 0x68, 0x40, 0x08, 0x28, 0x60, 0x28, 0x68, 0x80, 0xf3, 0x10, 0x88, + 0xb0, 0xbd, 0x00, 0xbf, 0xc1, 0xf0, 0x05, 0x00, 0xf0, 0xa4, 0x08, 0x00, + 0xde, 0xf1, 0x01, 0x00, 0x24, 0x36, 0x01, 0x00, 0xa4, 0xa6, 0x08, 0x00, + 0xf8, 0xf5, 0x01, 0x00, 0x70, 0xb5, 0x04, 0x46, 0x00, 0x68, 0x08, 0xb3, + 0x11, 0x4d, 0x12, 0x4e, 0x02, 0x78, 0x16, 0x2a, 0x14, 0xd8, 0x02, 0xeb, + 0x42, 0x01, 0x55, 0xf8, 0x21, 0x10, 0x79, 0xb1, 0x02, 0xeb, 0x42, 0x02, + 0x05, 0xeb, 0x82, 0x02, 0x12, 0x79, 0x42, 0xf0, 0x02, 0x02, 0x03, 0x2a, + 0x06, 0xd1, 0x91, 0xf8, 0x24, 0x21, 0x1a, 0xb1, 0x91, 0xf8, 0x24, 0x11, + 0x46, 0x29, 0x08, 0xd1, 0x31, 0x68, 0x20, 0x46, 0x88, 0x47, 0xd9, 0xf7, + 0xff, 0xfa, 0x20, 0x68, 0x00, 0x28, 0xdf, 0xd1, 0x00, 0x20, 0x70, 0xbd, + 0xe8, 0x72, 0x01, 0x00, 0x24, 0x9d, 0x08, 0x00, 0x07, 0x48, 0x08, 0x49, + 0x01, 0x60, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, 0x09, 0x49, + 0x01, 0x60, 0x09, 0x48, 0x09, 0x49, 0x01, 0x60, 0x09, 0x48, 0x0a, 0x49, + 0x01, 0x60, 0x70, 0x47, 0xa0, 0x9d, 0x08, 0x00, 0x71, 0xd5, 0x04, 0x00, + 0x1c, 0xe6, 0x08, 0x00, 0xcd, 0xce, 0x04, 0x00, 0xc8, 0x8d, 0x08, 0x00, + 0xb5, 0xd5, 0x04, 0x00, 0x88, 0xaa, 0x08, 0x00, 0x49, 0xd6, 0x04, 0x00, + 0x44, 0xd5, 0x08, 0x00, 0xb9, 0xd6, 0x04, 0x00, 0x49, 0xf2, 0x1d, 0x2c, + 0xc1, 0xf2, 0x0e, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x49, 0xf6, 0x8d, 0x5c, + 0xc1, 0xf2, 0x0e, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x64, 0x61, 0x74, 0x61, + 0x50, 0x61, 0x74, 0x68, 0x49, 0x44, 0x3a, 0x20, 0x30, 0x78, 0x25, 0x30, + 0x32, 0x78, 0x00, 0x64, 0x61, 0x74, 0x61, 0x50, 0x61, 0x74, 0x68, 0x44, + 0x69, 0x72, 0x3a, 0x20, 0x30, 0x78, 0x25, 0x30, 0x32, 0x78, 0x00, 0x63, + 0x6f, 0x64, 0x65, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x66, 0x67, + 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x69, 0x73, 0x20, 0x25, 0x64, + 0x00, 0x53, 0x65, 0x74, 0x75, 0x70, 0x49, 0x53, 0x4f, 0x44, 0x61, 0x74, + 0x61, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, + 0x64, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x01, 0x79, 0x02, 0x29, 0x05, 0xd1, + 0x40, 0x79, 0x41, 0x1e, 0x02, 0x29, 0x05, 0xd2, 0x12, 0x24, 0x10, 0xe0, + 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, 0x9e, 0xb8, 0x04, 0x28, 0x07, 0xd1, + 0x0c, 0x48, 0x90, 0xf8, 0x7c, 0x12, 0x01, 0xf0, 0xfe, 0x01, 0x80, 0xf8, + 0x7c, 0x12, 0x01, 0xe0, 0x09, 0x49, 0x08, 0x70, 0x00, 0x24, 0x09, 0x48, + 0x02, 0x21, 0x02, 0x68, 0x4f, 0xf6, 0x51, 0x40, 0x90, 0x47, 0x30, 0xb1, + 0x01, 0x21, 0x44, 0x71, 0x81, 0x71, 0xbd, 0xe8, 0x10, 0x40, 0xd9, 0xf7, + 0x2d, 0xba, 0x10, 0xbd, 0xe8, 0x65, 0x08, 0x00, 0x95, 0x53, 0x01, 0x00, + 0x28, 0x9c, 0x08, 0x00, 0xb0, 0xb5, 0x04, 0x46, 0x31, 0x48, 0x4f, 0xf6, + 0x51, 0x41, 0x00, 0x22, 0x25, 0x23, 0x05, 0x68, 0x02, 0x20, 0xa8, 0x47, + 0x90, 0xb1, 0xa1, 0x78, 0x06, 0x29, 0x09, 0xd1, 0xa1, 0x79, 0xe2, 0x79, + 0x91, 0x42, 0x05, 0xd8, 0x23, 0x79, 0x65, 0x79, 0x43, 0xea, 0x05, 0x23, + 0x06, 0x2b, 0x06, 0xd2, 0x12, 0x21, 0x41, 0x71, 0xbd, 0xe8, 0xb0, 0x40, + 0xd9, 0xf7, 0x08, 0xba, 0xb0, 0xbd, 0x04, 0x4d, 0x29, 0x70, 0x21, 0x7a, + 0xab, 0x80, 0x6a, 0x70, 0xa9, 0x70, 0x00, 0x21, 0xf1, 0xe7, 0x00, 0xbf, + 0x4c, 0xf1, 0x05, 0x00, 0x70, 0xb5, 0x04, 0x46, 0x1c, 0x48, 0x4f, 0xf6, + 0x51, 0x41, 0x00, 0x22, 0x26, 0x23, 0x05, 0x68, 0x04, 0x20, 0xa8, 0x47, + 0x20, 0xb3, 0xa1, 0x78, 0x04, 0x29, 0x22, 0xd1, 0x21, 0x79, 0x62, 0x79, + 0x41, 0xea, 0x02, 0x23, 0x16, 0x2b, 0x1e, 0xd8, 0x14, 0x4e, 0x03, 0xeb, + 0x43, 0x05, 0x56, 0xf8, 0x25, 0x30, 0xc3, 0xb1, 0x06, 0xeb, 0x85, 0x05, + 0x2d, 0x79, 0x03, 0x2d, 0x13, 0xd1, 0x93, 0xf8, 0xd1, 0x51, 0x0b, 0x2d, + 0x0a, 0xd3, 0xa4, 0x79, 0x93, 0xf8, 0x35, 0x31, 0x0c, 0x4d, 0x68, 0x26, + 0x13, 0xfb, 0x06, 0x53, 0x04, 0xf0, 0x03, 0x04, 0x83, 0xf8, 0x50, 0x40, + 0x00, 0x23, 0x03, 0xe0, 0x70, 0xbd, 0x12, 0x23, 0x00, 0xe0, 0x02, 0x23, + 0x02, 0x72, 0xc1, 0x71, 0x43, 0x71, 0xbd, 0xe8, 0x70, 0x40, 0xd9, 0xf7, + 0xc1, 0xb9, 0x00, 0xbf, 0x2c, 0x9c, 0x08, 0x00, 0xe8, 0x72, 0x01, 0x00, + 0xb0, 0xe6, 0x05, 0x00, 0xc1, 0x78, 0x26, 0x29, 0x08, 0xbf, 0xff, 0xf7, + 0xb9, 0xbf, 0x25, 0x29, 0x05, 0xd0, 0x01, 0x29, 0x18, 0xbf, 0x00, 0xf0, + 0x0b, 0xb8, 0xff, 0xf7, 0x57, 0xbf, 0xff, 0xf7, 0x85, 0xbf, 0x70, 0x47, + 0x49, 0xf6, 0x4d, 0x1c, 0xc1, 0xf2, 0x0e, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x49, 0xf6, 0xf9, 0x2c, 0xc1, 0xf2, 0x0e, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x80, 0xb5, 0x00, 0xf0, 0x8b, 0xf8, 0x03, 0x48, 0x01, 0x68, 0x41, 0xf0, + 0x00, 0x51, 0x01, 0x60, 0x80, 0xbd, 0x00, 0xbf, 0x28, 0x60, 0x21, 0x40, + 0xb0, 0xb5, 0x00, 0xf0, 0x85, 0xf8, 0x09, 0x49, 0x09, 0x4a, 0x0a, 0x4b, + 0x0a, 0x4c, 0x01, 0x20, 0x0d, 0x68, 0x25, 0xf0, 0x01, 0x05, 0x05, 0x43, + 0x0d, 0x60, 0x10, 0x70, 0x1d, 0x68, 0x44, 0xf8, 0x20, 0x50, 0x01, 0x38, + 0xc5, 0xb2, 0x02, 0x2d, 0xf2, 0xd3, 0xb0, 0xbd, 0x04, 0x10, 0x00, 0x40, + 0x74, 0x87, 0x08, 0x00, 0x84, 0x00, 0x21, 0x40, 0xc4, 0xf0, 0x05, 0x00, + 0xb0, 0xb5, 0x05, 0x46, 0x05, 0x48, 0x0c, 0x46, 0x00, 0x68, 0x80, 0x47, + 0xd4, 0xf8, 0xd8, 0x10, 0x40, 0x1a, 0xa5, 0xeb, 0x90, 0x10, 0x40, 0xb2, + 0xb0, 0xbd, 0x00, 0xbf, 0xe0, 0xa0, 0x08, 0x00, 0x80, 0xb5, 0x1e, 0x49, + 0x91, 0xf8, 0x3e, 0x26, 0x01, 0x2a, 0x29, 0xd1, 0x1c, 0x4a, 0x52, 0x79, + 0x01, 0x2a, 0x25, 0xd1, 0x91, 0xf8, 0x3f, 0x16, 0x02, 0x29, 0x21, 0xd1, + 0x01, 0x68, 0x91, 0xf9, 0x3a, 0x00, 0xff, 0xf7, 0xdd, 0xff, 0x42, 0x21, + 0x10, 0xf1, 0x46, 0x0f, 0x06, 0xdb, 0x6f, 0xf0, 0x19, 0x02, 0x10, 0x1a, + 0xc0, 0xb2, 0x42, 0x28, 0x38, 0xbf, 0x01, 0x46, 0x11, 0x4a, 0x41, 0xea, + 0x01, 0x40, 0x40, 0xea, 0x01, 0x60, 0x13, 0x68, 0x40, 0xea, 0x01, 0x20, + 0x23, 0xf0, 0x7f, 0x33, 0x18, 0x43, 0x10, 0x60, 0x10, 0x68, 0x20, 0xf0, + 0x7f, 0x00, 0x08, 0x43, 0x10, 0x60, 0x80, 0xbd, 0x08, 0x48, 0x42, 0x22, + 0x01, 0x68, 0x21, 0xf0, 0x7f, 0x31, 0x01, 0xf1, 0x42, 0x31, 0x01, 0x60, + 0x01, 0x68, 0x62, 0xf3, 0x06, 0x01, 0x01, 0x60, 0x80, 0xbd, 0x00, 0xbf, + 0x64, 0xd4, 0x05, 0x00, 0x48, 0xdc, 0x05, 0x00, 0x08, 0xc2, 0x23, 0x40, + 0x03, 0x48, 0x04, 0x49, 0x01, 0x60, 0x04, 0x48, 0x04, 0x49, 0x01, 0x60, + 0x70, 0x47, 0x00, 0xbf, 0xb4, 0x9f, 0x08, 0x00, 0x61, 0xd9, 0x04, 0x00, + 0xd0, 0xbc, 0x08, 0x00, 0x49, 0xd9, 0x04, 0x00, 0x49, 0xf6, 0xbd, 0x7c, + 0xc1, 0xf2, 0x0e, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4a, 0xf6, 0x69, 0x6c, + 0xc1, 0xf2, 0x0e, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x80, 0xb5, 0x19, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x18, 0xb9, 0x00, 0x20, 0x46, 0x21, 0xd9, 0xf7, + 0x19, 0xf9, 0x16, 0x48, 0x00, 0x21, 0x01, 0x60, 0x15, 0x48, 0x01, 0x60, + 0x15, 0x48, 0x00, 0x68, 0x80, 0x0f, 0x02, 0x28, 0x03, 0xd8, 0x00, 0x20, + 0x4f, 0x21, 0xd3, 0xf7, 0xa9, 0xfa, 0x12, 0x48, 0x00, 0x68, 0x80, 0x0f, + 0x02, 0x28, 0x03, 0xd8, 0x00, 0x20, 0x50, 0x21, 0xd3, 0xf7, 0xa0, 0xfa, + 0x0e, 0x48, 0x0f, 0x49, 0x0f, 0x4a, 0x00, 0x78, 0x09, 0x68, 0x42, 0xf8, + 0x20, 0x10, 0x0e, 0x48, 0x00, 0x78, 0x28, 0xb9, 0x0d, 0x48, 0x0e, 0x49, + 0x00, 0x88, 0x40, 0xf0, 0x8a, 0x00, 0x08, 0x60, 0x0c, 0x48, 0x01, 0x21, + 0x41, 0x70, 0x80, 0xbd, 0x18, 0xbb, 0x08, 0x00, 0xc0, 0x10, 0x21, 0x40, + 0xb0, 0x20, 0x21, 0x40, 0xcc, 0x20, 0x21, 0x40, 0xec, 0x10, 0x21, 0x40, + 0x74, 0x87, 0x08, 0x00, 0x04, 0xe7, 0x08, 0x00, 0xc0, 0x5d, 0x01, 0x00, + 0x6f, 0x34, 0x01, 0x00, 0x26, 0x21, 0x01, 0x00, 0x04, 0x08, 0x00, 0x40, + 0x3c, 0x88, 0x01, 0x00, 0x10, 0xb5, 0x0d, 0x48, 0x0d, 0x4c, 0x00, 0x21, + 0x01, 0x60, 0x21, 0x60, 0x0b, 0xf0, 0x2a, 0xf8, 0x4f, 0xf4, 0x80, 0x30, + 0x20, 0x60, 0x0a, 0x48, 0x00, 0x68, 0x80, 0x47, 0x09, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x09, 0x48, 0x00, 0x68, 0xc0, 0x07, 0x14, 0xbf, 0x08, 0x48, + 0x08, 0x48, 0x00, 0x68, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0x47, 0x00, 0xbf, + 0xd4, 0x10, 0x21, 0x40, 0xe4, 0x10, 0x21, 0x40, 0x5c, 0xbb, 0x08, 0x00, + 0xb0, 0xa0, 0x08, 0x00, 0x04, 0x10, 0x00, 0x40, 0x28, 0xbb, 0x08, 0x00, + 0x2c, 0xbb, 0x08, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x29, 0xf8, 0xbd, 0xe8, + 0x80, 0x40, 0x0b, 0xf0, 0x09, 0xb8, 0x80, 0xb5, 0x00, 0xf0, 0x28, 0xf8, + 0xbd, 0xe8, 0x80, 0x40, 0x0b, 0xf0, 0x02, 0xb8, 0x06, 0x48, 0x07, 0x49, + 0x01, 0x60, 0x07, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x08, 0x49, + 0x01, 0x60, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0xfc, 0xe6, 0x08, 0x00, 0x15, 0xdb, 0x04, 0x00, 0x08, 0xe7, 0x08, 0x00, + 0x7d, 0xda, 0x04, 0x00, 0xd0, 0xe6, 0x08, 0x00, 0x69, 0xdb, 0x04, 0x00, + 0xe8, 0xe6, 0x08, 0x00, 0x77, 0xdb, 0x04, 0x00, 0x4b, 0xf6, 0x1b, 0x5c, + 0xc1, 0xf2, 0x0e, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4b, 0xf6, 0xad, 0x6c, + 0xc1, 0xf2, 0x0e, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x70, 0xb5, 0x00, 0xf0, + 0x1f, 0xf8, 0x04, 0x46, 0x78, 0xb1, 0x94, 0xf8, 0x35, 0x01, 0x08, 0x4d, + 0x68, 0x26, 0x68, 0x21, 0x10, 0xfb, 0x06, 0x50, 0xd5, 0xf7, 0xaa, 0xfb, + 0x94, 0xf8, 0x35, 0x01, 0x4f, 0xf0, 0xff, 0x31, 0x10, 0xfb, 0x06, 0x50, + 0x01, 0x66, 0x20, 0x46, 0x70, 0xbd, 0x00, 0xbf, 0xb0, 0xe6, 0x05, 0x00, + 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, 0xcc, 0xc9, 0x08, 0x00, + 0xd9, 0xdb, 0x04, 0x00, 0x4e, 0xf6, 0x9d, 0x3c, 0xc1, 0xf2, 0x0e, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x70, 0xb5, 0x04, 0x46, 0x00, 0x78, 0x65, 0x78, + 0x0f, 0x28, 0x06, 0xd0, 0x0e, 0x28, 0x07, 0xbf, 0xe1, 0x78, 0x20, 0x79, + 0xff, 0x20, 0xff, 0x21, 0x01, 0xe0, 0x21, 0x79, 0x60, 0x79, 0x13, 0x4a, + 0x92, 0x6a, 0x32, 0xb1, 0x12, 0x4b, 0x52, 0xf8, 0x08, 0x2c, 0x03, 0xf5, + 0x00, 0x73, 0x9a, 0x42, 0x01, 0xd0, 0x00, 0x20, 0x70, 0xbd, 0x41, 0xea, + 0x00, 0x20, 0xda, 0xf7, 0x03, 0xfe, 0x00, 0x28, 0xf7, 0xd0, 0x0c, 0x48, + 0x02, 0x35, 0x04, 0x22, 0x29, 0x46, 0x03, 0x68, 0x20, 0x46, 0x98, 0x47, + 0x09, 0x48, 0x00, 0x21, 0x22, 0x46, 0x2b, 0x46, 0x06, 0x68, 0x40, 0xf2, + 0x24, 0x70, 0xb0, 0x47, 0x20, 0x46, 0xd9, 0xf7, 0x37, 0xf8, 0x01, 0x20, + 0x70, 0xbd, 0x00, 0xbf, 0x1c, 0x3b, 0x01, 0x00, 0x68, 0x8a, 0x01, 0x00, + 0xa8, 0xa2, 0x08, 0x00, 0x4c, 0xa2, 0x08, 0x00, 0xf8, 0xb5, 0x14, 0x46, + 0x0d, 0x46, 0x00, 0xeb, 0x40, 0x01, 0x09, 0x4a, 0x06, 0x46, 0x48, 0x01, + 0x10, 0x58, 0x28, 0xb1, 0x02, 0xeb, 0x41, 0x17, 0xd9, 0xf7, 0x1e, 0xf8, + 0x00, 0x20, 0x38, 0x60, 0x30, 0x46, 0x29, 0x46, 0x22, 0x46, 0xbd, 0xe8, + 0xf8, 0x40, 0x00, 0xf0, 0x37, 0xba, 0x00, 0xbf, 0x54, 0xf1, 0x05, 0x00, + 0x2d, 0xe9, 0xf0, 0x4f, 0x8b, 0xb0, 0x01, 0x90, 0x00, 0x20, 0xdf, 0xf8, + 0x34, 0x92, 0x0a, 0x90, 0xcd, 0xe9, 0x06, 0x00, 0xcd, 0xe9, 0x04, 0x00, + 0xcd, 0xe9, 0x08, 0x00, 0xcd, 0xe9, 0x02, 0x00, 0x72, 0xb6, 0xd9, 0xf8, + 0x00, 0x00, 0x40, 0x00, 0x01, 0x30, 0xc9, 0xf8, 0x00, 0x00, 0x85, 0x48, + 0xc6, 0x68, 0x56, 0xb3, 0x83, 0x48, 0x84, 0x4f, 0xdf, 0xf8, 0x10, 0xb2, + 0x0d, 0xf1, 0x14, 0x08, 0x0d, 0xf1, 0x20, 0x0a, 0x00, 0xf1, 0x0c, 0x04, + 0x3a, 0x68, 0x20, 0x46, 0x31, 0x46, 0x35, 0x46, 0x90, 0x47, 0x06, 0x46, + 0x28, 0x78, 0x3e, 0x28, 0x15, 0xd1, 0xa8, 0x78, 0x0d, 0x28, 0x09, 0xd0, + 0x07, 0x28, 0x10, 0xd1, 0xdb, 0xf8, 0x00, 0x20, 0x20, 0x46, 0x29, 0x46, + 0x90, 0x47, 0x28, 0x46, 0x51, 0x46, 0x06, 0xe0, 0xdb, 0xf8, 0x00, 0x20, + 0x20, 0x46, 0x29, 0x46, 0x90, 0x47, 0x28, 0x46, 0x41, 0x46, 0xd5, 0xf7, + 0x37, 0xfb, 0x00, 0x2e, 0xde, 0xd1, 0xd9, 0xf8, 0x00, 0x00, 0x4f, 0xf0, + 0x00, 0x08, 0x40, 0x08, 0xc9, 0xf8, 0x00, 0x00, 0xd9, 0xf8, 0x00, 0x00, + 0x80, 0xf3, 0x10, 0x88, 0x08, 0x9d, 0x00, 0x2d, 0x40, 0xd0, 0xdf, 0xf8, + 0xa0, 0xb1, 0xdf, 0xf8, 0xa0, 0xa1, 0x08, 0xae, 0xdb, 0xf8, 0x00, 0x20, + 0x2f, 0x79, 0x95, 0xf8, 0x03, 0x90, 0x55, 0xf8, 0x08, 0x4c, 0x30, 0x46, + 0x29, 0x46, 0x90, 0x47, 0x78, 0xb1, 0x01, 0x46, 0x49, 0xea, 0x07, 0x27, + 0xc8, 0x78, 0x0b, 0x79, 0xdb, 0xf8, 0x00, 0x20, 0x40, 0xea, 0x03, 0x20, + 0x87, 0x42, 0x0b, 0xd0, 0x30, 0x46, 0x90, 0x47, 0x01, 0x46, 0x00, 0x28, + 0xf2, 0xd1, 0xdb, 0xf8, 0x00, 0x20, 0x30, 0x46, 0x29, 0x46, 0x90, 0x47, + 0x05, 0x46, 0x14, 0xe0, 0x30, 0x46, 0x29, 0x46, 0x90, 0x47, 0xda, 0xf8, + 0x00, 0x20, 0x07, 0x46, 0x30, 0x46, 0x29, 0x46, 0x90, 0x47, 0xb8, 0xf1, + 0x00, 0x0f, 0x03, 0xd1, 0x20, 0x89, 0x01, 0x99, 0x88, 0x42, 0x07, 0xd2, + 0x28, 0x46, 0x02, 0xa9, 0xd5, 0xf7, 0xec, 0xfa, 0x3d, 0x46, 0x00, 0x2d, + 0xc6, 0xd1, 0x01, 0xe0, 0xa8, 0x46, 0xf9, 0xe7, 0x05, 0x9f, 0xc7, 0xb3, + 0x46, 0x4c, 0xdf, 0xf8, 0x1c, 0xb1, 0xdf, 0xf8, 0x0c, 0x91, 0x05, 0xad, + 0x22, 0x68, 0x7e, 0x78, 0x57, 0xf8, 0x08, 0xac, 0x28, 0x46, 0x39, 0x46, + 0x90, 0x47, 0x48, 0xb1, 0x01, 0x46, 0x48, 0x78, 0x22, 0x68, 0x86, 0x42, + 0x0a, 0xd0, 0x28, 0x46, 0x90, 0x47, 0x01, 0x46, 0x00, 0x28, 0xf6, 0xd1, + 0x22, 0x68, 0x28, 0x46, 0x39, 0x46, 0x90, 0x47, 0x07, 0x46, 0x15, 0xe0, + 0x28, 0x46, 0x39, 0x46, 0x90, 0x47, 0xdb, 0xf8, 0x00, 0x20, 0x06, 0x46, + 0x28, 0x46, 0x39, 0x46, 0x90, 0x47, 0xb8, 0xf1, 0x00, 0x0f, 0x04, 0xd1, + 0xba, 0xf8, 0x08, 0x00, 0x01, 0x99, 0x88, 0x42, 0x07, 0xd2, 0x38, 0x46, + 0x02, 0xa9, 0xd5, 0xf7, 0xb1, 0xfa, 0x37, 0x46, 0x00, 0x2f, 0xcf, 0xd1, + 0x03, 0xe0, 0xb8, 0x46, 0xf9, 0xe7, 0xdf, 0xf8, 0xa0, 0x90, 0xb8, 0xf1, + 0x00, 0x0f, 0x1b, 0xd1, 0xdd, 0xf8, 0x14, 0x80, 0xb8, 0xf1, 0x00, 0x0f, + 0x0e, 0xd0, 0x25, 0x4c, 0x05, 0xad, 0x58, 0xf8, 0x08, 0x0c, 0x01, 0x99, + 0x00, 0x89, 0x88, 0x42, 0x09, 0xd2, 0x22, 0x68, 0x28, 0x46, 0x41, 0x46, + 0x90, 0x47, 0x80, 0x46, 0x00, 0x28, 0xf2, 0xd1, 0x4f, 0xf0, 0x00, 0x08, + 0x04, 0xe0, 0x1d, 0x48, 0x41, 0x46, 0x02, 0x68, 0x05, 0xa8, 0x90, 0x47, + 0x1b, 0x4c, 0x08, 0xa9, 0x72, 0xb6, 0xd9, 0xf8, 0x00, 0x00, 0x40, 0x00, + 0x01, 0x30, 0xc9, 0xf8, 0x00, 0x00, 0x14, 0x48, 0x22, 0x68, 0x00, 0xf1, + 0x0c, 0x05, 0x28, 0x46, 0x90, 0x47, 0x22, 0x68, 0x05, 0xa9, 0x28, 0x46, + 0x90, 0x47, 0xd9, 0xf8, 0x00, 0x00, 0x40, 0x08, 0xc9, 0xf8, 0x00, 0x00, + 0xd9, 0xf8, 0x00, 0x00, 0x80, 0xf3, 0x10, 0x88, 0x02, 0x98, 0x60, 0xb1, + 0x0d, 0x4c, 0x02, 0xa8, 0x21, 0x68, 0x88, 0x47, 0x38, 0xb1, 0x02, 0xad, + 0xd8, 0xf7, 0xfc, 0xfe, 0x21, 0x68, 0x28, 0x46, 0x88, 0x47, 0x00, 0x28, + 0xf8, 0xd1, 0x40, 0x46, 0x0b, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0xbf, + 0x24, 0x36, 0x01, 0x00, 0x2c, 0xba, 0x01, 0x00, 0xec, 0xa0, 0x08, 0x00, + 0xe8, 0xa0, 0x08, 0x00, 0x24, 0xfa, 0x08, 0x00, 0x24, 0x9d, 0x08, 0x00, + 0xb0, 0xb5, 0x14, 0x46, 0x0d, 0x46, 0x00, 0xf0, 0x09, 0xf9, 0x20, 0x68, + 0x00, 0xb1, 0xb0, 0xbd, 0xa8, 0x1c, 0x80, 0xb2, 0xff, 0xf7, 0xc8, 0xfe, + 0x20, 0x60, 0xb0, 0xbd, 0x02, 0x78, 0x0e, 0x2a, 0x0c, 0xd1, 0x0a, 0x4a, + 0x12, 0x68, 0x4a, 0xb1, 0xc2, 0x78, 0x03, 0x79, 0x42, 0xea, 0x03, 0x22, + 0x4f, 0xf6, 0x70, 0x53, 0x9a, 0x42, 0x01, 0xd1, 0x82, 0x79, 0x0a, 0xb1, + 0x00, 0xf0, 0xf4, 0xb8, 0x02, 0x7a, 0x42, 0xf0, 0x04, 0x02, 0x02, 0x72, + 0x00, 0xf0, 0xee, 0xb8, 0x64, 0x52, 0x01, 0x00, 0x10, 0xb5, 0x03, 0x4c, + 0x24, 0x68, 0xa0, 0x47, 0x08, 0xb1, 0x02, 0x99, 0xc1, 0x71, 0x10, 0xbd, + 0x2c, 0x9c, 0x08, 0x00, 0xf8, 0xb5, 0x07, 0x46, 0x00, 0x20, 0x1c, 0x46, + 0x15, 0x46, 0x0e, 0x46, 0x6a, 0x46, 0x00, 0x90, 0x60, 0x48, 0x39, 0x46, + 0x03, 0x68, 0xff, 0x20, 0x98, 0x47, 0x00, 0x98, 0x00, 0x28, 0x3f, 0xd0, + 0x02, 0x30, 0x39, 0x46, 0xd5, 0xf7, 0x7a, 0xfe, 0x00, 0x98, 0xa1, 0x1c, + 0x86, 0x70, 0x1d, 0x4e, 0x00, 0x98, 0xc5, 0x70, 0x20, 0x78, 0x00, 0x9a, + 0x10, 0x71, 0x60, 0x78, 0x50, 0x71, 0x90, 0x1d, 0xb0, 0x47, 0xa0, 0x79, + 0x00, 0x9a, 0xe1, 0x1d, 0x90, 0x72, 0x02, 0xf1, 0x0b, 0x00, 0xb0, 0x47, + 0xe0, 0x7a, 0x00, 0x99, 0x04, 0xf1, 0x0c, 0x05, 0xc8, 0x73, 0x01, 0xf1, + 0x10, 0x00, 0x29, 0x46, 0xb0, 0x47, 0x15, 0xf8, 0x02, 0x1b, 0x60, 0x7b, + 0x41, 0xea, 0x00, 0x20, 0x29, 0x78, 0x6a, 0x78, 0x41, 0xea, 0x02, 0x21, + 0x40, 0xea, 0x01, 0x40, 0xc5, 0xb2, 0x05, 0x28, 0x88, 0xbf, 0x05, 0x25, + 0x75, 0xb1, 0x00, 0x21, 0x01, 0x26, 0x00, 0x98, 0x00, 0xeb, 0x81, 0x00, + 0x04, 0xeb, 0x81, 0x01, 0x14, 0x30, 0x10, 0x31, 0xfd, 0xf7, 0x92, 0xf9, + 0xf1, 0xb2, 0x01, 0x36, 0x8d, 0x42, 0xf2, 0xd8, 0x00, 0x98, 0xf8, 0xbd, + 0x51, 0xb3, 0x04, 0x00, 0x2d, 0xe9, 0xfc, 0x41, 0x05, 0x46, 0x00, 0x20, + 0x98, 0x46, 0x16, 0x46, 0x0f, 0x46, 0x01, 0xaa, 0x01, 0x90, 0x36, 0x48, + 0x29, 0x46, 0x03, 0x68, 0xff, 0x20, 0x98, 0x47, 0x01, 0x98, 0x20, 0xb3, + 0x08, 0x9c, 0x02, 0x30, 0x29, 0x46, 0xd5, 0xf7, 0x25, 0xfe, 0x01, 0x98, + 0x21, 0x46, 0x87, 0x70, 0x01, 0x98, 0xc6, 0x70, 0x01, 0x98, 0x80, 0xf8, + 0x04, 0x80, 0x05, 0x30, 0xfd, 0xf7, 0x6a, 0xf9, 0x20, 0x68, 0x08, 0x25, + 0x08, 0x28, 0x38, 0xbf, 0xc5, 0xb2, 0x75, 0xb1, 0x00, 0x21, 0x01, 0x26, + 0x01, 0x98, 0x00, 0xeb, 0x81, 0x00, 0x04, 0xeb, 0x81, 0x01, 0x09, 0x30, + 0x04, 0x31, 0xfd, 0xf7, 0x59, 0xf9, 0xf1, 0xb2, 0x01, 0x36, 0x8d, 0x42, + 0xf2, 0xd8, 0x01, 0x98, 0xbd, 0xe8, 0xfc, 0x81, 0xb0, 0xb5, 0x1d, 0x46, + 0x04, 0x46, 0x00, 0xf0, 0x57, 0xf8, 0x05, 0xb1, 0xb0, 0xbd, 0x0c, 0x48, + 0x90, 0xf8, 0xd4, 0x0d, 0x00, 0x28, 0xf9, 0xd0, 0x94, 0xf8, 0x35, 0x01, + 0x09, 0x4d, 0x00, 0xeb, 0x40, 0x00, 0x40, 0x01, 0x28, 0x58, 0x00, 0x28, + 0xf0, 0xd1, 0x07, 0x48, 0x01, 0x68, 0x14, 0x20, 0x88, 0x47, 0x94, 0xf8, + 0x35, 0x11, 0x01, 0xeb, 0x41, 0x01, 0x49, 0x01, 0x68, 0x50, 0xb0, 0xbd, + 0x00, 0x69, 0x08, 0x00, 0x54, 0xf1, 0x05, 0x00, 0x4c, 0x9c, 0x08, 0x00, + 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, + 0x08, 0x48, 0x09, 0x49, 0x01, 0x60, 0x09, 0x48, 0x09, 0x49, 0x01, 0x60, + 0x09, 0x48, 0x0a, 0x49, 0x01, 0x60, 0x70, 0x47, 0x34, 0xc5, 0x08, 0x00, + 0xa5, 0xdc, 0x04, 0x00, 0x04, 0xe8, 0x08, 0x00, 0x29, 0xdc, 0x04, 0x00, + 0x24, 0x9c, 0x08, 0x00, 0x31, 0xdf, 0x04, 0x00, 0x08, 0xe8, 0x08, 0x00, + 0x4d, 0xdf, 0x04, 0x00, 0x34, 0xda, 0x08, 0x00, 0xad, 0xe0, 0x04, 0x00, + 0x40, 0xf6, 0xe9, 0x6c, 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x40, 0xf6, 0x21, 0x3c, 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x40, 0xf6, 0xa1, 0x4c, 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x45, 0xf2, 0x45, 0x7c, 0xc1, 0xf2, 0x0b, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x70, 0xb5, 0x04, 0x46, 0x19, 0x48, 0x01, 0x21, 0x02, 0x68, 0x02, 0x20, + 0x90, 0x47, 0x18, 0x48, 0x00, 0x68, 0x80, 0x47, 0x17, 0x48, 0x65, 0x79, + 0xa6, 0x79, 0x00, 0x68, 0x80, 0x47, 0x16, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x15, 0x48, 0xff, 0x21, 0x01, 0x70, 0x20, 0x79, 0x40, 0xb9, 0x14, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x13, 0x48, 0x31, 0x46, 0x02, 0x68, 0x28, 0x46, + 0x90, 0x47, 0x20, 0x79, 0x01, 0x28, 0x0c, 0xd1, 0x0e, 0x48, 0x00, 0x68, + 0x80, 0x47, 0xe2, 0x79, 0x09, 0x2a, 0x01, 0xd9, 0x12, 0x20, 0x05, 0xe0, + 0x0c, 0x48, 0x31, 0x46, 0x03, 0x68, 0x28, 0x46, 0x98, 0x47, 0x00, 0x20, + 0x4f, 0xf6, 0x04, 0x41, 0xbd, 0xe8, 0x70, 0x40, 0xd8, 0xf7, 0x5a, 0xbd, + 0x18, 0x9d, 0x08, 0x00, 0x48, 0x9d, 0x08, 0x00, 0x84, 0xda, 0x08, 0x00, + 0x88, 0xda, 0x08, 0x00, 0x55, 0x34, 0x01, 0x00, 0x80, 0xbe, 0x08, 0x00, + 0xc0, 0xd6, 0x08, 0x00, 0x20, 0xbe, 0x08, 0x00, 0xb0, 0xb5, 0x10, 0x4c, + 0x03, 0x20, 0x4f, 0xf6, 0x04, 0x41, 0x00, 0x22, 0x25, 0x78, 0x00, 0x2d, + 0x18, 0xbf, 0x04, 0x20, 0xd8, 0xf7, 0x62, 0xfd, 0x30, 0xb1, 0x2d, 0x21, + 0x81, 0x71, 0x5d, 0xb1, 0xa1, 0x78, 0x01, 0x72, 0x00, 0x21, 0x08, 0xe0, + 0x07, 0x48, 0x4f, 0xf6, 0x04, 0x41, 0x02, 0x68, 0x07, 0x20, 0xbd, 0xe8, + 0xb0, 0x40, 0x10, 0x47, 0x21, 0x7b, 0xc1, 0x71, 0xbd, 0xe8, 0xb0, 0x40, + 0xd8, 0xf7, 0x22, 0xbd, 0x58, 0xf0, 0x05, 0x00, 0xbc, 0x9b, 0x08, 0x00, + 0x80, 0xb5, 0x00, 0x79, 0x50, 0xb1, 0x01, 0x28, 0x0c, 0xd1, 0x0f, 0x48, + 0xc0, 0x7a, 0xc0, 0x07, 0x08, 0xd1, 0x01, 0x20, 0x03, 0xf0, 0x60, 0xf9, + 0x02, 0x46, 0x08, 0xe0, 0x0a, 0x48, 0xc0, 0x7a, 0xc0, 0x07, 0x01, 0xd1, + 0x12, 0x22, 0x02, 0xe0, 0x03, 0xf0, 0x92, 0xf9, 0x00, 0x22, 0x02, 0x20, + 0x4f, 0xf6, 0x04, 0x41, 0xd8, 0xf7, 0x2c, 0xfd, 0x28, 0xb1, 0x2e, 0x21, + 0x81, 0x71, 0xbd, 0xe8, 0x80, 0x40, 0xd8, 0xf7, 0xfb, 0xbc, 0x80, 0xbd, + 0x90, 0xfb, 0x05, 0x00, 0x80, 0xb5, 0x4c, 0x48, 0x00, 0x68, 0x28, 0xb3, + 0x01, 0x68, 0x19, 0xb3, 0x91, 0xf8, 0x38, 0x20, 0x01, 0x2a, 0x1f, 0xd1, + 0x16, 0x22, 0x81, 0xf8, 0x39, 0x20, 0x91, 0xf8, 0xfa, 0x22, 0x02, 0xf0, + 0xfd, 0x02, 0x81, 0xf8, 0xfa, 0x22, 0x1d, 0x4a, 0x12, 0x78, 0x32, 0xb3, + 0x1c, 0x4a, 0x1d, 0x4b, 0x12, 0x68, 0x1b, 0x88, 0x9a, 0x42, 0x07, 0xd0, + 0xd0, 0xf8, 0xc4, 0x30, 0x9a, 0x42, 0x03, 0xd0, 0xd0, 0xf8, 0xc8, 0x00, + 0x98, 0x42, 0x18, 0xd1, 0x17, 0x48, 0x08, 0x22, 0x03, 0x68, 0x83, 0x20, + 0x98, 0x47, 0x04, 0xe0, 0x0c, 0x20, 0x4f, 0xf6, 0x04, 0x41, 0xd8, 0xf7, + 0xcf, 0xfc, 0x02, 0x20, 0x4f, 0xf6, 0x04, 0x41, 0x00, 0x22, 0xd8, 0xf7, + 0xed, 0xfc, 0x28, 0xb1, 0x2f, 0x21, 0x81, 0x71, 0xbd, 0xe8, 0x80, 0x40, + 0xd8, 0xf7, 0xbc, 0xbc, 0x80, 0xbd, 0x23, 0x48, 0x01, 0x22, 0x72, 0xb6, + 0x01, 0x68, 0x49, 0x00, 0x01, 0x31, 0x01, 0x60, 0x20, 0x49, 0x0a, 0x70, + 0x01, 0x68, 0x49, 0x08, 0x01, 0x60, 0x00, 0x68, 0x80, 0xf3, 0x10, 0x88, + 0xe1, 0xe7, 0x00, 0xbf, 0x5f, 0x34, 0x01, 0x00, 0xec, 0x35, 0x01, 0x00, + 0x88, 0x5a, 0x01, 0x00, 0xa8, 0xa0, 0x08, 0x00, 0xc1, 0x78, 0x2f, 0x29, + 0x09, 0xd0, 0x2e, 0x29, 0x0d, 0xd0, 0x2d, 0x29, 0x15, 0xd1, 0x80, 0x78, + 0x01, 0x28, 0x08, 0xbf, 0xff, 0xf7, 0x52, 0xbf, 0x0a, 0xe0, 0x80, 0x78, + 0x01, 0x28, 0x08, 0xbf, 0xff, 0xf7, 0x98, 0xbf, 0x04, 0xe0, 0x81, 0x78, + 0x02, 0x29, 0x08, 0xbf, 0xff, 0xf7, 0x6c, 0xbf, 0x12, 0x20, 0x4f, 0xf6, + 0x04, 0x41, 0xd8, 0xf7, 0x8b, 0xbc, 0x08, 0x49, 0x00, 0x23, 0x72, 0xb6, + 0x0a, 0x68, 0x52, 0x00, 0x01, 0x32, 0x0a, 0x60, 0x05, 0x4a, 0x13, 0x70, + 0x0a, 0x68, 0x52, 0x08, 0x0a, 0x60, 0x09, 0x68, 0x81, 0xf3, 0x10, 0x88, + 0x00, 0xf0, 0x28, 0xb8, 0x24, 0x36, 0x01, 0x00, 0xcc, 0xf0, 0x05, 0x00, + 0x10, 0xb5, 0x04, 0x46, 0x00, 0xf0, 0x26, 0xf8, 0xa0, 0x7a, 0x0a, 0x28, + 0x07, 0xd3, 0x04, 0x49, 0x09, 0x78, 0x88, 0x42, 0x03, 0xd8, 0x03, 0x49, + 0x09, 0x68, 0x81, 0xf8, 0x78, 0x00, 0x10, 0xbd, 0x6a, 0x34, 0x01, 0x00, + 0xf8, 0x35, 0x01, 0x00, 0x03, 0x48, 0x04, 0x49, 0x01, 0x60, 0x04, 0x48, + 0x04, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, 0x94, 0xd3, 0x08, 0x00, + 0xa5, 0xe3, 0x04, 0x00, 0x74, 0xd3, 0x08, 0x00, 0x71, 0xe1, 0x04, 0x00, + 0x4e, 0xf6, 0x99, 0x5c, 0xc1, 0xf2, 0x0e, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x49, 0xf2, 0x95, 0x3c, 0xc1, 0xf2, 0x07, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0xf0, 0xb5, 0x10, 0x48, 0x01, 0x68, 0xd1, 0xb1, 0x0f, 0x4a, 0x48, 0x1c, + 0x00, 0x24, 0x05, 0x46, 0x92, 0xf8, 0x2d, 0x30, 0x43, 0xf0, 0x18, 0x03, + 0x2d, 0x2c, 0x05, 0xd1, 0x91, 0xf8, 0x2e, 0x60, 0x1e, 0x40, 0x81, 0xf8, + 0x2e, 0x60, 0x03, 0xe0, 0x16, 0x78, 0x2f, 0x78, 0x3e, 0x40, 0x2e, 0x70, + 0x01, 0x34, 0x01, 0x35, 0x01, 0x32, 0x2f, 0x2c, 0x08, 0xbf, 0xf0, 0xbd, + 0xec, 0xe7, 0x02, 0x48, 0xf0, 0xbd, 0x00, 0xbf, 0xf4, 0x68, 0x08, 0x00, + 0x68, 0xed, 0x0e, 0x10, 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, + 0xd4, 0xc9, 0x08, 0x00, 0x05, 0xe4, 0x04, 0x00, 0x1c, 0xb5, 0x10, 0x4c, + 0x20, 0x78, 0x78, 0xb1, 0x0f, 0x48, 0x00, 0x68, 0x80, 0x47, 0x0f, 0x48, + 0x00, 0x68, 0xc0, 0xb2, 0x52, 0x28, 0x08, 0xd1, 0x01, 0x20, 0x5a, 0x21, + 0x60, 0x70, 0x00, 0x20, 0xbd, 0xe8, 0x1c, 0x40, 0xd2, 0xf7, 0xba, 0xbd, + 0x1c, 0xbd, 0x09, 0x48, 0x00, 0x21, 0x4f, 0xf4, 0x7a, 0x72, 0x4f, 0xf4, + 0x7a, 0x73, 0x04, 0x68, 0x00, 0x20, 0xcd, 0xe9, 0x00, 0x00, 0x29, 0x20, + 0xa0, 0x47, 0x1c, 0xbd, 0xf8, 0xdd, 0x05, 0x00, 0x80, 0xf2, 0x08, 0x00, + 0x80, 0x10, 0x01, 0x30, 0xcc, 0x9b, 0x08, 0x00, 0x80, 0xb5, 0x41, 0x4b, + 0x01, 0x46, 0x00, 0xeb, 0x40, 0x00, 0x13, 0xf8, 0x10, 0x20, 0x03, 0xeb, + 0x40, 0x00, 0x2e, 0x2a, 0x0a, 0xd0, 0x2d, 0x2a, 0x0e, 0xd0, 0x29, 0x2a, + 0x18, 0xd1, 0x06, 0x21, 0xd5, 0xf7, 0xec, 0xfb, 0xbd, 0xe8, 0x80, 0x40, + 0xff, 0xf7, 0xc0, 0xbf, 0x06, 0x21, 0xd5, 0xf7, 0xe5, 0xfb, 0x0a, 0x48, + 0x03, 0x21, 0x04, 0xe0, 0x06, 0x21, 0xd5, 0xf7, 0xdf, 0xfb, 0x07, 0x48, + 0x02, 0x21, 0x80, 0xf8, 0x5e, 0x10, 0xc0, 0x7d, 0xbd, 0xe8, 0x80, 0x40, + 0xdb, 0xf7, 0x9c, 0xbb, 0x08, 0x46, 0xbd, 0xe8, 0x80, 0x40, 0x00, 0xf0, + 0x83, 0xb8, 0x00, 0xbf, 0xd0, 0xe2, 0x05, 0x00, 0x80, 0xb5, 0x0a, 0x48, + 0x00, 0x7f, 0x02, 0x28, 0x06, 0xd0, 0x58, 0xb9, 0x08, 0x48, 0x00, 0x78, + 0x40, 0xb9, 0xed, 0xf7, 0x07, 0xff, 0x05, 0xe0, 0x05, 0x48, 0x00, 0x78, + 0x01, 0x28, 0x08, 0xbf, 0xed, 0xf7, 0x3a, 0xff, 0xbd, 0xe8, 0x80, 0x40, + 0x00, 0xf0, 0x70, 0xb8, 0x18, 0x74, 0x01, 0x00, 0xa1, 0x58, 0x01, 0x00, + 0xb0, 0xb5, 0x50, 0xb1, 0x04, 0x46, 0x00, 0x78, 0xcb, 0x28, 0x0c, 0xd0, + 0xca, 0x28, 0x17, 0xd1, 0x21, 0x7a, 0x60, 0x68, 0xdb, 0xf7, 0x34, 0xff, + 0x0d, 0xe0, 0x00, 0x20, 0x9c, 0x21, 0xbd, 0xe8, 0xb0, 0x40, 0xd8, 0xf7, + 0xa9, 0xbb, 0x09, 0x48, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x05, 0x68, + 0x40, 0xf2, 0x3a, 0x70, 0xa8, 0x47, 0x20, 0x46, 0xbd, 0xe8, 0xb0, 0x40, + 0xd8, 0xf7, 0xba, 0xbb, 0x20, 0x46, 0xbd, 0xe8, 0xb0, 0x40, 0x00, 0xf0, + 0x4d, 0xb8, 0x00, 0xbf, 0x78, 0x9b, 0x08, 0x00, 0x80, 0xb5, 0x00, 0xf0, + 0x4d, 0xf8, 0xbd, 0xe8, 0x80, 0x40, 0x00, 0xf0, 0x05, 0xbe, 0x00, 0xbf, + 0x80, 0xb5, 0x04, 0x48, 0x78, 0x21, 0xd5, 0xf7, 0x7f, 0xfb, 0xbd, 0xe8, + 0x80, 0x40, 0x00, 0xf0, 0x45, 0xb8, 0x00, 0xbf, 0x80, 0x6b, 0x01, 0x00, + 0x0a, 0x48, 0x0b, 0x4a, 0x0d, 0x21, 0xd8, 0x30, 0x01, 0x31, 0x40, 0xf8, + 0x10, 0x2b, 0x21, 0x29, 0xfa, 0xd1, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, + 0x08, 0x48, 0x09, 0x49, 0x01, 0x60, 0x09, 0x48, 0x09, 0x49, 0x01, 0x60, + 0x09, 0x48, 0x0a, 0x49, 0x01, 0x60, 0x70, 0x47, 0xc0, 0xf5, 0x08, 0x00, + 0xb5, 0xe4, 0x04, 0x00, 0x58, 0xe8, 0x08, 0x00, 0x49, 0xe5, 0x04, 0x00, + 0x9c, 0xcc, 0x08, 0x00, 0x15, 0xe5, 0x04, 0x00, 0xb4, 0xcc, 0x08, 0x00, + 0x99, 0xe5, 0x04, 0x00, 0x8c, 0xcc, 0x08, 0x00, 0xa9, 0xe5, 0x04, 0x00, + 0x42, 0xf6, 0x55, 0x4c, 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x42, 0xf6, 0xd5, 0x1c, 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x42, 0xf6, 0xbd, 0x2c, 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x42, 0xf6, 0x09, 0x4c, 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x42, 0xf6, 0xd1, 0x0c, 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x0f, 0x49, 0x90, 0xf8, 0x1d, 0x21, 0xc2, 0xeb, 0x02, 0x12, 0x09, 0x68, + 0x52, 0x01, 0x89, 0x5c, 0x01, 0x29, 0x88, 0xbf, 0x00, 0xf0, 0x20, 0xb8, + 0x90, 0xf8, 0x20, 0x11, 0x90, 0xf8, 0x51, 0x21, 0x90, 0xf8, 0xcd, 0x01, + 0x11, 0xfb, 0x02, 0xf1, 0xb1, 0xfb, 0xf0, 0xf0, 0xc1, 0xb2, 0x05, 0x48, + 0x90, 0xf8, 0xd3, 0x22, 0x00, 0x20, 0x91, 0x42, 0x98, 0xbf, 0x01, 0x20, + 0x70, 0x47, 0x00, 0xbf, 0xe0, 0x35, 0x01, 0x00, 0xe8, 0x65, 0x08, 0x00, + 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, 0x44, 0xe8, 0x08, 0x00, + 0x51, 0xe6, 0x04, 0x00, 0x42, 0xf2, 0x15, 0x2c, 0xc1, 0xf2, 0x0f, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0xf0, 0xb5, 0x17, 0x48, 0x00, 0x78, 0x40, 0x06, + 0x22, 0xd5, 0x16, 0x48, 0x00, 0x78, 0xf8, 0xb1, 0x15, 0x49, 0x16, 0x4c, + 0x00, 0x23, 0x00, 0x25, 0x0a, 0x68, 0x01, 0x21, 0x54, 0xf8, 0x23, 0x60, + 0x86, 0xb1, 0x0a, 0xb1, 0xb2, 0x42, 0x0d, 0xd0, 0x96, 0xf8, 0xeb, 0x74, + 0xd6, 0xf8, 0xd4, 0x60, 0x76, 0x7f, 0x07, 0xf0, 0x40, 0x07, 0x0e, 0xb1, + 0x27, 0xb1, 0x0d, 0xe0, 0x01, 0x25, 0x00, 0x2f, 0x08, 0xbf, 0x39, 0x46, + 0x01, 0x33, 0x83, 0x42, 0xe8, 0xd3, 0x0d, 0xb1, 0x8c, 0x48, 0x01, 0xe0, + 0x8b, 0x48, 0x00, 0x21, 0x01, 0x71, 0xf0, 0xbd, 0x89, 0x48, 0x01, 0x21, + 0xfa, 0xe7, 0x00, 0xbf, 0xb8, 0x52, 0x01, 0x00, 0x5c, 0x34, 0x01, 0x00, + 0xe4, 0x5e, 0x01, 0x00, 0x10, 0x61, 0x01, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, + 0x8d, 0xb0, 0x04, 0x93, 0x82, 0x4b, 0x01, 0x90, 0x80, 0x48, 0x00, 0x24, + 0xdd, 0xf8, 0x58, 0xb0, 0x4f, 0xf0, 0x01, 0x08, 0x0d, 0xf1, 0x14, 0x0a, + 0x07, 0x94, 0xcd, 0xe9, 0x05, 0x44, 0x00, 0x79, 0x1b, 0x68, 0x53, 0xea, + 0x00, 0x0c, 0x7b, 0x48, 0x18, 0xbf, 0x4f, 0xf0, 0x01, 0x0c, 0x43, 0x78, + 0x90, 0xf8, 0x00, 0x90, 0x80, 0x78, 0x02, 0x90, 0x4f, 0x20, 0x03, 0x93, + 0xbb, 0xf1, 0x00, 0x0f, 0x17, 0xd0, 0xbc, 0xf1, 0x00, 0x0f, 0x0c, 0xd0, + 0x04, 0x9b, 0x25, 0x46, 0x00, 0x2b, 0x18, 0xbf, 0x05, 0xf0, 0x7e, 0x05, + 0x4d, 0x45, 0x02, 0xd0, 0x03, 0x9b, 0x9d, 0x42, 0x20, 0xd1, 0x01, 0x27, + 0x08, 0xe0, 0x04, 0x9b, 0x2b, 0xb1, 0x04, 0xf0, 0x7e, 0x05, 0xb5, 0xfa, + 0x85, 0xf5, 0x6f, 0x09, 0x00, 0xe0, 0x00, 0x27, 0x7f, 0xb9, 0x04, 0xf0, + 0x1f, 0x05, 0x08, 0xfa, 0x05, 0xf7, 0x65, 0x09, 0x51, 0xf8, 0x25, 0xe0, + 0x1e, 0xea, 0x07, 0x06, 0x05, 0xd0, 0x5a, 0xf8, 0x25, 0x60, 0x3e, 0x43, + 0x4a, 0xf8, 0x25, 0x60, 0x00, 0xe0, 0x01, 0x38, 0x01, 0x34, 0x4f, 0x2c, + 0xce, 0xd1, 0x0a, 0xe0, 0x02, 0x9b, 0xed, 0x1a, 0xb5, 0xfa, 0x85, 0xf5, + 0x4f, 0xea, 0x55, 0x17, 0xe2, 0xd0, 0x04, 0x9b, 0x00, 0x2b, 0xd8, 0xd1, + 0xde, 0xe7, 0x58, 0x4f, 0x00, 0x21, 0x07, 0xeb, 0x81, 0x05, 0xec, 0x78, + 0x9c, 0xb1, 0x17, 0xf8, 0x21, 0x40, 0x6d, 0x78, 0xac, 0x42, 0x0e, 0xd8, + 0xc4, 0xf3, 0x42, 0x16, 0x04, 0xf0, 0x1f, 0x03, 0x01, 0x34, 0x5a, 0xf8, + 0x26, 0x60, 0x26, 0xfa, 0x03, 0xf3, 0xdb, 0x07, 0x18, 0xbf, 0x01, 0x38, + 0xe3, 0xb2, 0xab, 0x42, 0xf0, 0xd9, 0x01, 0x31, 0x03, 0x29, 0xe4, 0xd1, + 0x04, 0x99, 0x41, 0xb3, 0x79, 0x1c, 0x00, 0x24, 0x8b, 0x78, 0x03, 0xb3, + 0x0d, 0x78, 0x4d, 0x2d, 0x0d, 0xd8, 0xeb, 0x07, 0x0b, 0xd1, 0xc5, 0xf3, + 0x42, 0x13, 0x05, 0xf0, 0x1f, 0x05, 0x5a, 0xf8, 0x23, 0x30, 0x85, 0xf0, + 0x01, 0x05, 0xeb, 0x40, 0xdb, 0x07, 0x18, 0xbf, 0x01, 0x32, 0x11, 0xf8, + 0x01, 0x5c, 0xeb, 0x07, 0x0b, 0xd0, 0xc5, 0xf3, 0x42, 0x13, 0x05, 0xf0, + 0x1f, 0x05, 0x5a, 0xf8, 0x23, 0x30, 0x85, 0xf0, 0x01, 0x05, 0xeb, 0x40, + 0xdb, 0x07, 0x18, 0xbf, 0x01, 0x32, 0x01, 0x34, 0x04, 0x31, 0x03, 0x2c, + 0xd8, 0xd1, 0x5f, 0xfa, 0x82, 0xfb, 0x5f, 0xfa, 0x80, 0xf9, 0xd9, 0x45, + 0x53, 0xd2, 0x00, 0x20, 0x0d, 0xf1, 0x31, 0x01, 0x0d, 0xf1, 0x2e, 0x0e, + 0x4f, 0xf0, 0x01, 0x0c, 0x8d, 0xf8, 0x30, 0x00, 0xad, 0xf8, 0x2e, 0x00, + 0xff, 0x24, 0x7f, 0x23, 0x00, 0x25, 0x0c, 0x70, 0x07, 0xeb, 0x85, 0x06, + 0xf2, 0x78, 0x52, 0xb1, 0x96, 0xf9, 0x02, 0x60, 0x5a, 0xb2, 0x96, 0x42, + 0x05, 0xda, 0x1e, 0xf8, 0x05, 0x20, 0x12, 0xb9, 0xec, 0xb2, 0x33, 0x46, + 0x0d, 0x70, 0x01, 0x35, 0x03, 0x2d, 0xed, 0xd1, 0xff, 0x2c, 0x00, 0xf1, + 0x01, 0x00, 0x18, 0xbf, 0x0e, 0xf8, 0x04, 0xc0, 0x01, 0x31, 0x03, 0x28, + 0xe0, 0xd1, 0x00, 0x25, 0x08, 0xac, 0x0d, 0xf1, 0x31, 0x06, 0x4f, 0xf0, + 0x00, 0x08, 0x30, 0x78, 0x02, 0x28, 0x06, 0xd8, 0x07, 0xeb, 0x80, 0x01, + 0x20, 0x46, 0x04, 0x22, 0xe6, 0xf7, 0x82, 0xfb, 0x02, 0xe0, 0x65, 0x70, + 0x25, 0x70, 0xe5, 0x70, 0x08, 0xf1, 0x01, 0x08, 0x04, 0x34, 0x01, 0x36, + 0xb8, 0xf1, 0x03, 0x0f, 0xeb, 0xd1, 0x9d, 0xf8, 0x31, 0x00, 0x02, 0x28, + 0x08, 0xd8, 0x0f, 0x48, 0x08, 0xa9, 0x4a, 0x46, 0x5b, 0x46, 0x04, 0x68, + 0x04, 0x98, 0x00, 0x90, 0x05, 0xa8, 0xa0, 0x47, 0x09, 0x48, 0x08, 0xa9, + 0x01, 0xe0, 0x08, 0x48, 0x06, 0x49, 0x03, 0x68, 0x01, 0x98, 0x5a, 0x46, + 0x98, 0x47, 0x0d, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x48, 0xdc, 0x05, 0x00, + 0x04, 0x5b, 0x01, 0x00, 0x30, 0x0f, 0x01, 0x00, 0xd8, 0x6a, 0x01, 0x00, + 0x68, 0xe7, 0x08, 0x00, 0x64, 0xe7, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x43, + 0x4f, 0xf0, 0x00, 0x0e, 0x4f, 0xf0, 0x01, 0x0c, 0x4f, 0xf0, 0x01, 0x08, + 0x00, 0x2b, 0x52, 0xd0, 0x00, 0x26, 0x00, 0x27, 0xd4, 0x5d, 0x4e, 0x2f, + 0x04, 0xd0, 0xd3, 0x19, 0x5b, 0x78, 0x9c, 0x42, 0x98, 0xbf, 0x1c, 0x46, + 0x7b, 0x09, 0x07, 0xf0, 0x1e, 0x05, 0x51, 0xf8, 0x23, 0x30, 0xeb, 0x40, + 0xdb, 0x07, 0x02, 0xd1, 0x44, 0x45, 0x08, 0xbf, 0x02, 0x36, 0xbb, 0x1c, + 0x4d, 0x2f, 0x1f, 0x46, 0xe8, 0xd3, 0x33, 0x06, 0x28, 0xd0, 0x00, 0x24, + 0x26, 0x46, 0x14, 0x5d, 0x4e, 0x2e, 0x04, 0xd0, 0x93, 0x19, 0x5b, 0x78, + 0x9c, 0x42, 0x98, 0xbf, 0x1c, 0x46, 0x4f, 0xea, 0x56, 0x19, 0x06, 0xf0, + 0x1e, 0x03, 0x51, 0xf8, 0x29, 0x70, 0x0c, 0xfa, 0x03, 0xf5, 0x2f, 0x42, + 0x08, 0xbf, 0x44, 0x45, 0x03, 0xd0, 0xb4, 0x1c, 0x4d, 0x2e, 0xe7, 0xd3, + 0x0e, 0xe0, 0x43, 0xf0, 0x01, 0x03, 0x47, 0xea, 0x05, 0x04, 0x0e, 0xf1, + 0x02, 0x0e, 0x0c, 0xfa, 0x03, 0xf3, 0x23, 0x43, 0x41, 0xf8, 0x29, 0x30, + 0x5f, 0xfa, 0x8e, 0xf3, 0x83, 0x42, 0xec, 0xd3, 0x5f, 0xfa, 0x8e, 0xf3, + 0x83, 0x42, 0x3a, 0xd2, 0x08, 0xf1, 0x01, 0x08, 0xb8, 0xf1, 0x10, 0x0f, + 0xb2, 0xd1, 0x34, 0xe0, 0x08, 0xf1, 0x01, 0x08, 0xb8, 0xf1, 0x10, 0x0f, + 0x2f, 0xd0, 0x00, 0x26, 0x00, 0x27, 0x73, 0x09, 0x06, 0xf0, 0x1f, 0x04, + 0x51, 0xf8, 0x23, 0x30, 0xe3, 0x40, 0xdb, 0x07, 0x03, 0xd1, 0x93, 0x5d, + 0x98, 0x45, 0x08, 0xbf, 0x01, 0x37, 0x01, 0x36, 0x4f, 0x2e, 0xf0, 0xd1, + 0x3b, 0x06, 0x18, 0xd0, 0x00, 0x26, 0x77, 0x09, 0x06, 0xf0, 0x1f, 0x03, + 0x51, 0xf8, 0x27, 0x40, 0x0c, 0xfa, 0x03, 0xf3, 0x1c, 0x42, 0x0b, 0xd1, + 0x95, 0x5d, 0xa8, 0x45, 0x08, 0xd1, 0x23, 0x43, 0x0e, 0xf1, 0x01, 0x0e, + 0x41, 0xf8, 0x27, 0x30, 0x5f, 0xfa, 0x8e, 0xf3, 0x83, 0x42, 0x02, 0xd2, + 0x01, 0x36, 0x4f, 0x2e, 0xe7, 0xd1, 0x5f, 0xfa, 0x8e, 0xf3, 0x83, 0x42, + 0xca, 0xd3, 0x5f, 0xfa, 0x8e, 0xf0, 0xbd, 0xe8, 0xf0, 0x83, 0x00, 0xbf, + 0x2d, 0xe9, 0xf0, 0x4f, 0x8d, 0xb0, 0x02, 0x90, 0xdf, 0xf8, 0x88, 0x03, + 0x0d, 0xf1, 0x24, 0x0b, 0x0c, 0x46, 0x1e, 0x46, 0x00, 0x68, 0x0c, 0x90, + 0xdf, 0xf8, 0x7c, 0x03, 0x04, 0x92, 0x05, 0x93, 0x05, 0x68, 0x01, 0x20, + 0x00, 0x90, 0x58, 0x46, 0xa8, 0x47, 0xdc, 0x4d, 0x0b, 0xf1, 0x01, 0x02, + 0x0a, 0x21, 0x0a, 0x23, 0x05, 0xf1, 0x1e, 0x00, 0xd2, 0xf7, 0xba, 0xfa, + 0xdf, 0xf8, 0x60, 0x93, 0x4f, 0xf6, 0xff, 0x70, 0x4f, 0x21, 0x68, 0x86, + 0x00, 0x25, 0x48, 0x46, 0xcd, 0xe9, 0x06, 0x55, 0x08, 0x95, 0xd5, 0xf7, + 0xf5, 0xf8, 0xd3, 0x4e, 0xdf, 0xf8, 0x4c, 0xa3, 0xd5, 0x4f, 0xdf, 0xf8, + 0x50, 0x83, 0x0b, 0xeb, 0xd5, 0x00, 0x05, 0xf0, 0x07, 0x01, 0x40, 0x78, + 0xc8, 0x40, 0xc0, 0x07, 0x05, 0xd1, 0x19, 0xf8, 0x05, 0x00, 0x40, 0xf0, + 0x04, 0x00, 0x09, 0xf8, 0x05, 0x00, 0x31, 0x68, 0xe8, 0xb2, 0x88, 0x47, + 0x05, 0xf0, 0x1f, 0x00, 0x01, 0x21, 0x01, 0xfa, 0x00, 0xf0, 0x69, 0x09, + 0x54, 0xf8, 0x21, 0x20, 0x02, 0x42, 0x05, 0xd1, 0x19, 0xf8, 0x05, 0x20, + 0x42, 0xf0, 0x08, 0x02, 0x09, 0xf8, 0x05, 0x20, 0xda, 0xf8, 0x00, 0x20, + 0x12, 0xb9, 0xc0, 0x4a, 0x12, 0x79, 0x8a, 0xb1, 0x05, 0x9a, 0x00, 0x2a, + 0x2a, 0x46, 0x18, 0xbf, 0x02, 0xf0, 0x7e, 0x02, 0x98, 0xf8, 0x00, 0x30, + 0x9a, 0x42, 0x0c, 0xd0, 0x98, 0xf8, 0x01, 0x30, 0x9a, 0x42, 0x08, 0xd0, + 0x98, 0xf8, 0x02, 0x30, 0x9a, 0x42, 0x04, 0xd0, 0x05, 0x9a, 0x42, 0xb1, + 0x15, 0xf0, 0x7e, 0x0f, 0x05, 0xd1, 0x19, 0xf8, 0x05, 0x20, 0x42, 0xf0, + 0x10, 0x02, 0x09, 0xf8, 0x05, 0x20, 0x57, 0xf8, 0x21, 0x10, 0x01, 0x42, + 0x0e, 0xd1, 0xb1, 0x48, 0x90, 0xf8, 0x3e, 0x06, 0x01, 0x28, 0x09, 0xd1, + 0xab, 0x48, 0x40, 0x79, 0x01, 0x28, 0x05, 0xd1, 0x19, 0xf8, 0x05, 0x00, + 0x40, 0xf0, 0x01, 0x00, 0x09, 0xf8, 0x05, 0x00, 0x01, 0x35, 0x4f, 0x2d, + 0xa5, 0xd1, 0x05, 0x98, 0x00, 0x28, 0x00, 0xf0, 0xa0, 0x80, 0xa8, 0x48, + 0xdd, 0xf8, 0x10, 0xc0, 0x4f, 0xf0, 0x00, 0x0b, 0x4f, 0xf0, 0x01, 0x0a, + 0x06, 0xac, 0x4f, 0xf0, 0x00, 0x08, 0x50, 0x30, 0x03, 0x90, 0x00, 0x21, + 0x00, 0x22, 0x00, 0x20, 0x19, 0xf8, 0x01, 0x30, 0x5f, 0xea, 0x08, 0x65, + 0x08, 0xbf, 0x00, 0x2b, 0x1c, 0xd0, 0x4e, 0x29, 0x01, 0xd1, 0x1d, 0x46, + 0x05, 0xe0, 0x01, 0xeb, 0x09, 0x05, 0x6d, 0x78, 0xab, 0x42, 0x88, 0xbf, + 0x1d, 0x46, 0x4b, 0x09, 0x02, 0xf0, 0x1f, 0x02, 0x54, 0xf8, 0x23, 0x30, + 0x23, 0xfa, 0x02, 0xf2, 0xd2, 0x07, 0x04, 0xd1, 0x5f, 0xfa, 0x88, 0xf2, + 0x95, 0x42, 0x08, 0xbf, 0x02, 0x30, 0x8a, 0x1c, 0xd1, 0xb2, 0x4f, 0x29, + 0xdc, 0xd3, 0x1f, 0xe0, 0x4e, 0x29, 0x05, 0xd0, 0x01, 0xeb, 0x09, 0x03, + 0x5d, 0x78, 0x0d, 0xb1, 0x00, 0x23, 0xe1, 0xe7, 0x4b, 0x09, 0x02, 0xf0, + 0x1f, 0x02, 0x0b, 0xf1, 0x02, 0x0b, 0x54, 0xf8, 0x23, 0x50, 0x0a, 0xfa, + 0x02, 0xf2, 0x2a, 0x43, 0x44, 0xf8, 0x23, 0x20, 0x4a, 0x1c, 0x02, 0xf0, + 0x1f, 0x03, 0x52, 0x09, 0x54, 0xf8, 0x22, 0x50, 0x0a, 0xfa, 0x03, 0xf3, + 0x2b, 0x43, 0x44, 0xf8, 0x22, 0x30, 0xda, 0xe7, 0x5f, 0xfa, 0x8b, 0xf1, + 0x61, 0x45, 0x80, 0xf0, 0xaa, 0x80, 0x02, 0x06, 0x3d, 0xd0, 0xac, 0xeb, + 0x01, 0x01, 0xc0, 0xb2, 0x81, 0x42, 0x0d, 0xda, 0x77, 0x48, 0x03, 0x9a, + 0x5f, 0xfa, 0x88, 0xf3, 0xcd, 0xe9, 0x00, 0x9a, 0x05, 0x68, 0xc8, 0xb2, + 0x21, 0x46, 0xa8, 0x47, 0xdd, 0xf8, 0x10, 0xc0, 0x83, 0x44, 0x26, 0xe0, + 0x00, 0x21, 0x08, 0x46, 0x19, 0xf8, 0x01, 0x10, 0x4e, 0x28, 0x05, 0xd0, + 0x09, 0xeb, 0x00, 0x02, 0x52, 0x78, 0x91, 0x42, 0x98, 0xbf, 0x11, 0x46, + 0x42, 0x09, 0x00, 0xf0, 0x1e, 0x03, 0x54, 0xf8, 0x22, 0x60, 0x0a, 0xfa, + 0x03, 0xf5, 0x2e, 0x42, 0x0e, 0xd1, 0x5f, 0xfa, 0x88, 0xf7, 0xb9, 0x42, + 0x0a, 0xd1, 0x43, 0xf0, 0x01, 0x03, 0x46, 0xea, 0x05, 0x01, 0x0b, 0xf1, + 0x02, 0x0b, 0x0a, 0xfa, 0x03, 0xf3, 0x19, 0x43, 0x44, 0xf8, 0x22, 0x10, + 0x81, 0x1c, 0x4d, 0x28, 0xd9, 0xd3, 0x5f, 0xfa, 0x8b, 0xf0, 0x60, 0x45, + 0x69, 0xd2, 0x08, 0xf1, 0x01, 0x08, 0x5f, 0xfa, 0x88, 0xf0, 0x10, 0x28, + 0x7f, 0xf4, 0x6d, 0xaf, 0x61, 0xe0, 0x58, 0x48, 0xdd, 0xf8, 0x10, 0xc0, + 0x4f, 0xf0, 0x00, 0x0a, 0x01, 0x25, 0x06, 0xac, 0x4f, 0xf0, 0x00, 0x0b, + 0x4f, 0xf0, 0x00, 0x08, 0x00, 0xf1, 0x50, 0x06, 0x00, 0x21, 0x00, 0x20, + 0x19, 0xf8, 0x01, 0x20, 0x5f, 0xea, 0x08, 0x63, 0x08, 0xbf, 0x00, 0x2a, + 0x08, 0xd0, 0x5f, 0xfa, 0x88, 0xf3, 0x93, 0x42, 0x08, 0xbf, 0x01, 0x30, + 0x01, 0x31, 0x4f, 0x29, 0xf0, 0xd1, 0x0c, 0xe0, 0x4b, 0x09, 0x01, 0xf0, + 0x1f, 0x02, 0x0b, 0xf1, 0x01, 0x0b, 0x54, 0xf8, 0x23, 0x70, 0x05, 0xfa, + 0x02, 0xf2, 0x3a, 0x43, 0x44, 0xf8, 0x23, 0x20, 0xee, 0xe7, 0x01, 0x06, + 0x29, 0xd0, 0xac, 0xeb, 0x0b, 0x01, 0xc0, 0xb2, 0x4a, 0xb2, 0x90, 0x42, + 0x0d, 0xdd, 0x3d, 0x48, 0x5f, 0xfa, 0x88, 0xf3, 0x32, 0x46, 0xcd, 0xe9, + 0x00, 0x9a, 0x07, 0x68, 0xc8, 0xb2, 0x21, 0x46, 0xb8, 0x47, 0xdd, 0xf8, + 0x10, 0xc0, 0x83, 0x44, 0x15, 0xe0, 0x00, 0x20, 0x19, 0xf8, 0x00, 0x10, + 0x5f, 0xfa, 0x88, 0xf2, 0x8a, 0x42, 0x0b, 0xd1, 0x42, 0x09, 0x00, 0xf0, + 0x1f, 0x01, 0x0b, 0xf1, 0x01, 0x0b, 0x54, 0xf8, 0x22, 0x30, 0x05, 0xfa, + 0x01, 0xf1, 0x19, 0x43, 0x44, 0xf8, 0x22, 0x10, 0x01, 0x30, 0x4f, 0x28, + 0xea, 0xd1, 0x5f, 0xfa, 0x8b, 0xf0, 0x60, 0x45, 0x05, 0xd2, 0x08, 0xf1, + 0x01, 0x08, 0x5f, 0xfa, 0x88, 0xf0, 0x10, 0x28, 0xaa, 0xd1, 0x5f, 0xfa, + 0x8b, 0xf0, 0x60, 0x45, 0x07, 0xd2, 0xac, 0xeb, 0x0b, 0x00, 0x05, 0x9b, + 0x06, 0xa9, 0x4a, 0x46, 0xc0, 0xb2, 0xff, 0xf7, 0xd1, 0xfd, 0x02, 0x9c, + 0x06, 0x99, 0x20, 0x68, 0x81, 0x42, 0x09, 0xd1, 0x60, 0x68, 0x07, 0x99, + 0x81, 0x42, 0x05, 0xd1, 0xa0, 0x68, 0x08, 0x99, 0x81, 0x42, 0x01, 0xd1, + 0x00, 0x20, 0x13, 0xe0, 0x06, 0xaa, 0x20, 0x46, 0x0c, 0x21, 0x0c, 0x23, + 0xd2, 0xf7, 0x26, 0xf9, 0x0d, 0x48, 0x0a, 0x21, 0x22, 0x46, 0x0a, 0x23, + 0x28, 0x30, 0xd2, 0xf7, 0x1f, 0xf9, 0x14, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x13, 0x48, 0x00, 0x68, 0x80, 0x47, 0x01, 0x20, 0x04, 0x49, 0x09, 0x68, + 0x0c, 0x9a, 0x89, 0x1a, 0x04, 0xbf, 0x0d, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0xd7, 0xf7, 0x4c, 0xff, 0x38, 0xec, 0x01, 0x00, 0x28, 0xd7, 0x08, 0x00, + 0x7c, 0x78, 0x01, 0x00, 0xdc, 0x68, 0x01, 0x00, 0x2c, 0xd7, 0x08, 0x00, + 0x04, 0x5b, 0x01, 0x00, 0x48, 0xdc, 0x05, 0x00, 0x30, 0x0f, 0x01, 0x00, + 0x28, 0xf1, 0x05, 0x00, 0x64, 0xd4, 0x05, 0x00, 0x30, 0xd7, 0x08, 0x00, + 0x30, 0x69, 0x01, 0x00, 0x34, 0xd7, 0x08, 0x00, 0x38, 0xd7, 0x08, 0x00, + 0x2d, 0xe9, 0xf0, 0x47, 0xa3, 0x4e, 0xdf, 0xf8, 0xa0, 0x80, 0x82, 0x46, + 0x0a, 0x21, 0xff, 0x22, 0x96, 0xf8, 0xbe, 0x50, 0x08, 0xf1, 0x01, 0x00, + 0xe2, 0xf7, 0xa8, 0xfa, 0x96, 0xf9, 0xcc, 0x00, 0x96, 0xf8, 0xd5, 0xc0, + 0x4f, 0xf0, 0x01, 0x0e, 0x00, 0x23, 0x81, 0x1c, 0x00, 0x20, 0x1a, 0xf9, + 0x00, 0x20, 0x91, 0x42, 0x31, 0xda, 0x5e, 0x19, 0x01, 0x27, 0xf2, 0xb2, + 0x4e, 0x2a, 0x0b, 0xd8, 0xf2, 0xb2, 0x1a, 0xf9, 0x02, 0x20, 0x91, 0x42, + 0x04, 0xda, 0x2e, 0x44, 0x01, 0x37, 0xf2, 0xb2, 0x4f, 0x2a, 0xf5, 0xd3, + 0x3a, 0x06, 0x20, 0xd0, 0xfa, 0xb2, 0x12, 0xfb, 0x05, 0xf2, 0x62, 0x45, + 0x18, 0xd2, 0x1e, 0x06, 0x16, 0xd0, 0x02, 0xeb, 0x00, 0x09, 0xb9, 0xf1, + 0x4e, 0x0f, 0x11, 0xd8, 0xde, 0xb2, 0xb1, 0x45, 0x0e, 0xd9, 0x5a, 0x1c, + 0x06, 0xf0, 0x07, 0x00, 0x08, 0xeb, 0xd6, 0x06, 0x74, 0x78, 0x0e, 0xfa, + 0x00, 0xf0, 0x24, 0xea, 0x00, 0x00, 0x70, 0x70, 0xd6, 0xb2, 0x01, 0x32, + 0xb1, 0x45, 0xf1, 0xd8, 0x78, 0x1e, 0x00, 0xfb, 0x05, 0x33, 0x2b, 0x44, + 0xd8, 0xb2, 0x4f, 0x28, 0x28, 0xbf, 0xbd, 0xe8, 0xf0, 0x87, 0xc2, 0xe7, + 0xcd, 0xf0, 0x05, 0x00, 0x2d, 0xe9, 0xfe, 0x4f, 0x78, 0x49, 0x04, 0x46, + 0x76, 0x48, 0x91, 0xf8, 0xcc, 0x20, 0x01, 0xf1, 0xae, 0x0b, 0x91, 0xf8, + 0xd4, 0x10, 0x02, 0x30, 0x95, 0x1c, 0x00, 0x22, 0x43, 0x78, 0x33, 0xb1, + 0x03, 0x78, 0x6f, 0xb2, 0x0b, 0x44, 0x5e, 0xb2, 0xbe, 0x42, 0xc8, 0xbf, + 0x1d, 0x46, 0x01, 0x32, 0x04, 0x30, 0x03, 0x2a, 0xf2, 0xd1, 0x6d, 0x48, + 0x90, 0xf8, 0x38, 0x01, 0xc0, 0x07, 0x03, 0xd0, 0x6b, 0x48, 0x01, 0x68, + 0x20, 0x46, 0x88, 0x47, 0x20, 0x46, 0xff, 0xf7, 0x83, 0xff, 0x6b, 0x4f, + 0x6b, 0x4e, 0x00, 0x20, 0x4f, 0xf0, 0x00, 0x08, 0x4f, 0xf0, 0x00, 0x0a, + 0x01, 0x90, 0x14, 0xf9, 0x08, 0x90, 0x19, 0xf1, 0x7f, 0x00, 0x72, 0xd0, + 0x62, 0x48, 0x0d, 0xf1, 0x0b, 0x01, 0x0d, 0xf1, 0x0a, 0x02, 0x03, 0x68, + 0x5f, 0xfa, 0x8a, 0xf0, 0x98, 0x47, 0x9d, 0xf9, 0x0b, 0x00, 0x9b, 0xf8, + 0x26, 0x10, 0x20, 0x56, 0x08, 0x44, 0x48, 0x45, 0x05, 0xdc, 0x9d, 0xf9, + 0x0a, 0x00, 0x20, 0x56, 0x08, 0x44, 0x48, 0x45, 0x5b, 0xdd, 0x08, 0xf0, + 0x07, 0x00, 0x01, 0x22, 0x02, 0xfa, 0x00, 0xf3, 0x55, 0x48, 0x00, 0xeb, + 0xd8, 0x00, 0x40, 0x78, 0x03, 0x42, 0x50, 0xd0, 0x07, 0xeb, 0x08, 0x00, + 0xb6, 0x46, 0x6e, 0xb2, 0x10, 0xf9, 0x01, 0xcf, 0xb4, 0x45, 0x11, 0xdd, + 0x3a, 0x46, 0x14, 0xf9, 0x08, 0x70, 0xb7, 0x42, 0x0b, 0xdd, 0x4f, 0xea, + 0xd8, 0x06, 0x17, 0x46, 0x16, 0x44, 0x01, 0x9a, 0x96, 0xf8, 0x3f, 0x61, + 0x33, 0x42, 0x18, 0xbf, 0x01, 0x32, 0x01, 0x92, 0x00, 0xe0, 0x17, 0x46, + 0x1e, 0xf9, 0x08, 0x30, 0x72, 0x46, 0x5e, 0x18, 0x4e, 0x45, 0x12, 0xdd, + 0x99, 0x45, 0xd4, 0xbf, 0xa3, 0xeb, 0x09, 0x06, 0xa9, 0xeb, 0x03, 0x06, + 0x8e, 0x42, 0x16, 0xda, 0x48, 0x49, 0x00, 0x22, 0x4b, 0x45, 0x76, 0x46, + 0x01, 0xf8, 0x08, 0x20, 0xc8, 0xbf, 0x99, 0x46, 0x0e, 0xf8, 0x08, 0x90, + 0x1b, 0xe0, 0x43, 0x49, 0x00, 0x26, 0x4b, 0x45, 0x01, 0xf8, 0x08, 0x60, + 0xc8, 0xbf, 0x99, 0x46, 0x02, 0xf8, 0x08, 0x90, 0x03, 0x70, 0x16, 0x46, + 0x11, 0xe0, 0x3d, 0x4a, 0x76, 0x46, 0x12, 0xf8, 0x08, 0x10, 0x02, 0x29, + 0x9c, 0xbf, 0x01, 0x31, 0x02, 0xf8, 0x08, 0x10, 0x4b, 0x45, 0xd8, 0xbf, + 0x4b, 0x46, 0x0e, 0xf8, 0x08, 0x30, 0xe1, 0x45, 0x01, 0xdd, 0x80, 0xf8, + 0x00, 0x90, 0x9b, 0xf8, 0x25, 0x00, 0x82, 0x44, 0x5f, 0xfa, 0x8a, 0xf8, + 0xb8, 0xf1, 0x4f, 0x0f, 0xff, 0xf4, 0x7f, 0xaf, 0x01, 0x99, 0x9b, 0xf8, + 0x27, 0x00, 0x81, 0x22, 0xc9, 0xb2, 0x81, 0x42, 0x24, 0xbf, 0x00, 0x20, + 0xa7, 0xf8, 0x54, 0x01, 0x4f, 0x21, 0x20, 0x46, 0xe2, 0xf7, 0xa2, 0xf9, + 0xbb, 0xf8, 0x00, 0x00, 0xb7, 0xf8, 0x54, 0x11, 0x81, 0x42, 0x17, 0xd1, + 0x25, 0x48, 0x1e, 0x49, 0x00, 0x22, 0x10, 0xf8, 0x08, 0x00, 0x09, 0x78, + 0x01, 0x30, 0xc0, 0xb2, 0x11, 0xfb, 0x00, 0xf0, 0x9b, 0xf8, 0x25, 0x10, + 0xb3, 0x56, 0x1b, 0x1a, 0x13, 0xf1, 0x7f, 0x0f, 0xd8, 0xbf, 0x6f, 0xf0, + 0x7e, 0x03, 0xb3, 0x54, 0x0a, 0x44, 0xd2, 0xb2, 0x4f, 0x2a, 0xf3, 0xd3, + 0x0c, 0x48, 0x90, 0xf8, 0x38, 0x01, 0xc0, 0x07, 0x0d, 0xd0, 0x11, 0x48, + 0x07, 0xf5, 0xaa, 0x72, 0x00, 0x21, 0x02, 0x23, 0x04, 0x68, 0x40, 0xf2, + 0x21, 0x20, 0xa0, 0x47, 0x0d, 0x48, 0x12, 0x21, 0x00, 0x78, 0xd1, 0xf7, + 0xb3, 0xff, 0xbd, 0xe8, 0xfe, 0x8f, 0x00, 0xbf, 0xd8, 0x6a, 0x01, 0x00, + 0xe8, 0x65, 0x08, 0x00, 0x8c, 0x7e, 0x08, 0x00, 0x60, 0xe7, 0x08, 0x00, + 0x5c, 0xe7, 0x08, 0x00, 0xcd, 0xf0, 0x05, 0x00, 0x30, 0x69, 0x01, 0x00, + 0x88, 0x6a, 0x01, 0x00, 0x7d, 0x0f, 0x01, 0x00, 0x78, 0x9b, 0x08, 0x00, + 0x66, 0x34, 0x01, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x25, 0xf8, 0x02, 0x48, + 0x4f, 0x21, 0xd4, 0xf7, 0x21, 0xf9, 0x80, 0xbd, 0xd8, 0xf0, 0x05, 0x00, + 0x06, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x07, 0x49, 0x01, 0x60, + 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, + 0x70, 0x47, 0x00, 0xbf, 0x44, 0xd7, 0x08, 0x00, 0x71, 0xea, 0x04, 0x00, + 0x28, 0xd7, 0x08, 0x00, 0x25, 0xe7, 0x04, 0x00, 0x58, 0xe7, 0x08, 0x00, + 0xe9, 0xee, 0x04, 0x00, 0xb4, 0xb3, 0x08, 0x00, 0xf9, 0xf0, 0x04, 0x00, + 0x4c, 0xf6, 0xd1, 0x2c, 0xc1, 0xf2, 0x0e, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x08, 0x49, 0x90, 0xf9, 0x3a, 0x00, 0x91, 0xf9, 0x01, 0x20, 0x90, 0x42, + 0xc2, 0xbf, 0x80, 0x1a, 0x40, 0xb2, 0x70, 0x47, 0x91, 0xf9, 0x00, 0x10, + 0x40, 0x1a, 0xa8, 0xbf, 0x00, 0x20, 0x40, 0xb2, 0x70, 0x47, 0x00, 0xbf, + 0x00, 0x69, 0x08, 0x00, 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, + 0xfc, 0xe7, 0x08, 0x00, 0x55, 0xf1, 0x04, 0x00, 0x10, 0xb5, 0x4f, 0x4c, + 0x4d, 0x48, 0x0c, 0x21, 0x0c, 0x23, 0x22, 0x46, 0xd1, 0xf7, 0x42, 0xff, + 0x50, 0x48, 0x0c, 0x21, 0x22, 0x46, 0x0c, 0x23, 0xd1, 0xf7, 0x3c, 0xff, + 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, 0xa2, 0xb8, 0xf8, 0xb5, 0x45, 0x4c, + 0x45, 0x4a, 0x0c, 0x21, 0x0c, 0x23, 0x20, 0x46, 0xd1, 0xf7, 0x30, 0xff, + 0x43, 0x4a, 0x00, 0x21, 0x48, 0x09, 0x01, 0xf0, 0x1f, 0x05, 0x02, 0xeb, + 0x80, 0x03, 0xd8, 0x68, 0xe8, 0x40, 0xc0, 0x07, 0x03, 0xd0, 0x01, 0x31, + 0x4f, 0x29, 0xf3, 0xd1, 0x5a, 0xe0, 0xc8, 0xb2, 0x4f, 0x28, 0x05, 0xd2, + 0xdb, 0x68, 0xeb, 0x40, 0xdb, 0x07, 0x03, 0xd0, 0x0a, 0x46, 0x14, 0xe0, + 0x0a, 0x46, 0x14, 0xe0, 0x4b, 0x1c, 0x0d, 0x46, 0x01, 0x35, 0x4f, 0x2d, + 0x0c, 0xd0, 0x5e, 0x09, 0x03, 0xf0, 0x1f, 0x07, 0x01, 0x33, 0x02, 0xeb, + 0x86, 0x06, 0xf6, 0x68, 0xfe, 0x40, 0xf6, 0x07, 0xf2, 0xd0, 0x03, 0xf1, + 0xfe, 0x02, 0x00, 0xe0, 0x4e, 0x22, 0x09, 0x06, 0x19, 0xd0, 0x2d, 0x49, + 0x91, 0xf8, 0xc1, 0x10, 0x0b, 0x46, 0x88, 0x42, 0x88, 0xbf, 0x03, 0x46, + 0x59, 0x1a, 0xc9, 0xb2, 0x81, 0x42, 0x0e, 0xd2, 0x01, 0x23, 0x4e, 0x09, + 0x01, 0xf0, 0x1f, 0x05, 0x01, 0x31, 0x54, 0xf8, 0x26, 0x70, 0x03, 0xfa, + 0x05, 0xf5, 0x81, 0x42, 0x27, 0xea, 0x05, 0x05, 0x44, 0xf8, 0x26, 0x50, + 0xf1, 0xd1, 0xd0, 0xb2, 0x4d, 0x28, 0x1d, 0xd8, 0x1e, 0x48, 0x90, 0xf8, + 0xc1, 0x00, 0x50, 0xfa, 0x82, 0xf1, 0x4e, 0x20, 0x4e, 0x29, 0x38, 0xbf, + 0xc8, 0xb2, 0x51, 0x1c, 0xc9, 0xb2, 0x88, 0x42, 0x10, 0xd3, 0x02, 0x32, + 0x01, 0x23, 0x01, 0xf0, 0x1f, 0x05, 0x49, 0x09, 0x54, 0xf8, 0x21, 0x60, + 0x03, 0xfa, 0x05, 0xf5, 0x26, 0xea, 0x05, 0x05, 0x44, 0xf8, 0x21, 0x50, + 0xd1, 0xb2, 0x01, 0x32, 0x88, 0x42, 0xf0, 0xd2, 0x10, 0x48, 0x90, 0xf8, + 0x3e, 0x16, 0x01, 0x29, 0x0a, 0xd1, 0x0f, 0x49, 0x49, 0x79, 0x01, 0x29, + 0x06, 0xd1, 0x90, 0xf8, 0x3f, 0x06, 0x02, 0x28, 0x02, 0xd1, 0x0c, 0x48, + 0x05, 0x4a, 0x01, 0xe0, 0x0a, 0x48, 0x05, 0x4a, 0x0c, 0x21, 0x0c, 0x23, + 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x40, 0xd1, 0xf7, 0xad, 0xbe, 0x00, 0xbf, + 0x28, 0xf1, 0x05, 0x00, 0x78, 0xc9, 0x0e, 0x10, 0xb8, 0x68, 0x01, 0x00, + 0xe8, 0x65, 0x08, 0x00, 0x64, 0xd4, 0x05, 0x00, 0x48, 0xdc, 0x05, 0x00, + 0x34, 0xf1, 0x05, 0x00, 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, + 0xf8, 0xc7, 0x08, 0x00, 0x8d, 0xf1, 0x04, 0x00, 0x4c, 0xf2, 0x75, 0x2c, + 0xc1, 0xf2, 0x0e, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x10, 0xb5, 0x00, 0x2a, + 0xb0, 0xf8, 0x00, 0x32, 0x14, 0xbf, 0x23, 0xea, 0x01, 0x04, 0x43, 0xea, + 0x01, 0x04, 0xa0, 0xf8, 0x00, 0x42, 0x09, 0x4b, 0x90, 0xf8, 0x35, 0x01, + 0xa4, 0xb2, 0xc3, 0xe9, 0x00, 0x02, 0x07, 0x48, 0xc3, 0xe9, 0x02, 0x14, + 0x1a, 0x46, 0x00, 0x21, 0x10, 0x23, 0xd0, 0xf8, 0x00, 0xc0, 0x40, 0xf2, + 0x2b, 0x20, 0xbd, 0xe8, 0x10, 0x40, 0x60, 0x47, 0x8c, 0x34, 0x01, 0x00, + 0xa4, 0x8e, 0x08, 0x00, 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, + 0xc0, 0x9b, 0x08, 0x00, 0x01, 0xf3, 0x04, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, + 0x85, 0xb0, 0x05, 0x46, 0x17, 0x48, 0x0f, 0x46, 0x9b, 0x46, 0x90, 0x46, + 0x01, 0x68, 0xbc, 0x20, 0x88, 0x47, 0x00, 0xb3, 0x04, 0x46, 0x14, 0x48, + 0x10, 0x9a, 0xdd, 0xe9, 0x0e, 0xa9, 0x29, 0x46, 0x00, 0x23, 0x06, 0x68, + 0x20, 0x46, 0xb0, 0x47, 0x10, 0x48, 0x39, 0x46, 0x00, 0x22, 0x43, 0x46, + 0x05, 0x68, 0x38, 0x46, 0xcd, 0xe9, 0x00, 0x4b, 0xcd, 0xe9, 0x02, 0xa9, + 0xa8, 0x47, 0x20, 0xb9, 0x0b, 0x48, 0x01, 0x78, 0x09, 0xb1, 0x01, 0x21, + 0x41, 0x70, 0x20, 0x46, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, 0xd7, 0xf7, + 0xa7, 0xbc, 0x4f, 0xf6, 0xff, 0x70, 0xab, 0xf8, 0x0a, 0x00, 0x05, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0xd4, 0x9b, 0x08, 0x00, 0xc4, 0x9b, 0x08, 0x00, + 0xc8, 0x9b, 0x08, 0x00, 0x2a, 0xe6, 0x05, 0x00, 0x01, 0x48, 0x02, 0x49, + 0x01, 0x60, 0x70, 0x47, 0x64, 0xe8, 0x08, 0x00, 0x55, 0xf3, 0x04, 0x00, + 0xb0, 0xb5, 0x80, 0xb3, 0x0d, 0x46, 0x01, 0x79, 0x04, 0x46, 0x7f, 0x22, + 0x48, 0x08, 0xb2, 0xeb, 0x51, 0x0f, 0x0c, 0xbf, 0x61, 0x79, 0x00, 0x21, + 0x85, 0xf8, 0xab, 0x15, 0x85, 0xf8, 0xac, 0x05, 0x94, 0xf9, 0x03, 0x00, + 0xb0, 0xf1, 0xff, 0x3f, 0x04, 0xdd, 0x20, 0x46, 0xbd, 0xe8, 0xb0, 0x40, + 0xd7, 0xf7, 0x76, 0xbc, 0x0c, 0x48, 0x00, 0x68, 0x80, 0x47, 0x00, 0x28, + 0xf5, 0xd0, 0x4f, 0xf4, 0xc3, 0x71, 0x01, 0x80, 0x21, 0x79, 0xc0, 0xe9, + 0x01, 0x54, 0x81, 0x70, 0x07, 0x49, 0x60, 0x31, 0xd3, 0xf7, 0xce, 0xff, + 0x06, 0x48, 0x05, 0x21, 0x00, 0x78, 0xd1, 0xf7, 0xf9, 0xfd, 0xe0, 0x78, + 0x00, 0xf0, 0x7f, 0x00, 0xe0, 0x70, 0xb0, 0xbd, 0xe8, 0xb9, 0x08, 0x00, + 0x2c, 0xba, 0x01, 0x00, 0x67, 0x34, 0x01, 0x00, 0x09, 0xb1, 0x00, 0xf0, + 0x4d, 0xb8, 0x00, 0x20, 0x70, 0x47, 0x80, 0xb5, 0x00, 0xf0, 0x4e, 0xf8, + 0x00, 0x28, 0x08, 0xbf, 0x01, 0x20, 0x80, 0xbd, 0xb0, 0xf5, 0x33, 0x7f, + 0x08, 0xd0, 0x40, 0xf2, 0xdf, 0x11, 0x88, 0x42, 0x08, 0xd1, 0x05, 0x48, + 0x05, 0x49, 0x00, 0x68, 0x08, 0x60, 0x70, 0x47, 0x02, 0x48, 0x03, 0x49, + 0x00, 0x68, 0x48, 0x60, 0x70, 0x47, 0x00, 0xbf, 0x24, 0x20, 0x00, 0x40, + 0x40, 0xf1, 0x05, 0x00, 0x70, 0x47, 0x00, 0xbf, 0x09, 0x48, 0x0a, 0x49, + 0x01, 0x60, 0x0a, 0x48, 0x0a, 0x49, 0x01, 0x60, 0x0a, 0x48, 0x0b, 0x49, + 0x01, 0x60, 0x0b, 0x48, 0x0b, 0x49, 0x01, 0x60, 0x0b, 0x48, 0x0c, 0x49, + 0x81, 0x62, 0xc1, 0x61, 0x0b, 0x48, 0x0c, 0x49, 0x01, 0x60, 0x70, 0x47, + 0x24, 0xc0, 0x08, 0x00, 0x51, 0xf4, 0x04, 0x00, 0x14, 0x9d, 0x08, 0x00, + 0xdd, 0xf3, 0x04, 0x00, 0x80, 0xe9, 0x08, 0x00, 0x5b, 0xf4, 0x04, 0x00, + 0xb4, 0xa0, 0x08, 0x00, 0x69, 0xf4, 0x04, 0x00, 0x2c, 0xe9, 0x08, 0x00, + 0x19, 0xa2, 0x04, 0x00, 0x14, 0xe3, 0x08, 0x00, 0x95, 0xf4, 0x04, 0x00, + 0x46, 0xf6, 0xb1, 0x7c, 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x47, 0xf2, 0x2b, 0x0c, 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x2d, 0xe9, 0xf8, 0x4f, 0x48, 0x48, 0x00, 0x78, 0x08, 0xb1, 0xbd, 0xe8, + 0xf8, 0x8f, 0x47, 0x48, 0x90, 0xf8, 0xb8, 0x14, 0x46, 0x48, 0x30, 0x30, + 0x01, 0xf0, 0x01, 0x01, 0xd5, 0xf7, 0xc6, 0xfe, 0x00, 0x28, 0xf2, 0xd0, + 0x13, 0x21, 0x05, 0x46, 0xdf, 0xf8, 0x08, 0x91, 0x00, 0x90, 0x00, 0x24, + 0x05, 0xf8, 0x03, 0x1b, 0x99, 0xf8, 0x00, 0x00, 0x00, 0x28, 0x3e, 0xd0, + 0xdf, 0xf8, 0xf8, 0xa0, 0x3e, 0x4f, 0x4f, 0xf0, 0x00, 0x0b, 0x00, 0x26, + 0x57, 0xf8, 0x2b, 0x80, 0xb8, 0xf1, 0x00, 0x0f, 0x1a, 0xd0, 0x98, 0xf8, + 0x23, 0x11, 0xb9, 0xb1, 0xda, 0xf8, 0x00, 0x10, 0x09, 0xb1, 0x41, 0x45, + 0x19, 0xd0, 0x98, 0xf8, 0x35, 0x01, 0x36, 0x49, 0x28, 0x70, 0x98, 0xf9, + 0xa5, 0x00, 0x09, 0x68, 0x88, 0x47, 0x68, 0x70, 0x01, 0x36, 0x98, 0xf8, + 0x23, 0x01, 0xec, 0x70, 0xa8, 0x70, 0x99, 0xf8, 0x00, 0x00, 0x04, 0x35, + 0x88, 0xf8, 0x23, 0x41, 0x0b, 0xf1, 0x01, 0x0b, 0x5f, 0xfa, 0x8b, 0xf1, + 0x81, 0x42, 0xd9, 0xd3, 0x12, 0xe0, 0x9a, 0xf8, 0x06, 0x10, 0x00, 0x29, + 0xf2, 0xd0, 0x9a, 0xf8, 0x04, 0x10, 0x01, 0x36, 0x29, 0x70, 0x9a, 0xf8, + 0x05, 0x10, 0x69, 0x70, 0x9a, 0xf8, 0x06, 0x10, 0xec, 0x70, 0xa9, 0x70, + 0x8a, 0xf8, 0x06, 0x40, 0xe3, 0xe7, 0x00, 0x26, 0x21, 0x48, 0x00, 0x78, + 0xc0, 0xb1, 0x21, 0x4a, 0x00, 0x21, 0x00, 0x23, 0x52, 0xf8, 0x23, 0x40, + 0x74, 0xb1, 0x94, 0xf8, 0x23, 0x71, 0x4f, 0xb1, 0x94, 0xf8, 0x35, 0x71, + 0x69, 0x70, 0x01, 0x36, 0x2f, 0x70, 0x94, 0xf8, 0x23, 0x71, 0xe9, 0x70, + 0xaf, 0x70, 0x04, 0x35, 0x84, 0xf8, 0x23, 0x11, 0x01, 0x33, 0xdc, 0xb2, + 0x84, 0x42, 0xe9, 0xd3, 0x30, 0x06, 0x12, 0xd0, 0x14, 0x4a, 0x00, 0x21, + 0x00, 0x98, 0x11, 0x70, 0xb1, 0x00, 0x86, 0x70, 0x01, 0x31, 0x41, 0x70, + 0x11, 0x49, 0x0c, 0x31, 0xd3, 0xf7, 0xda, 0xfe, 0x10, 0x48, 0x0a, 0x21, + 0x00, 0x78, 0xbd, 0xe8, 0xf8, 0x4f, 0xd1, 0xf7, 0x03, 0xbd, 0x00, 0x98, + 0xbd, 0xe8, 0xf8, 0x4f, 0xd7, 0xf7, 0x66, 0xbb, 0xa3, 0x58, 0x01, 0x00, + 0x8c, 0x7e, 0x08, 0x00, 0x68, 0x8a, 0x01, 0x00, 0x5c, 0x34, 0x01, 0x00, + 0xe4, 0x5e, 0x01, 0x00, 0x10, 0x61, 0x01, 0x00, 0x18, 0xea, 0x08, 0x00, + 0x53, 0x34, 0x01, 0x00, 0xb8, 0x57, 0x01, 0x00, 0x60, 0x34, 0x01, 0x00, + 0x2c, 0xba, 0x01, 0x00, 0x66, 0x34, 0x01, 0x00, 0xb0, 0xb5, 0x05, 0x46, + 0x09, 0x48, 0x0c, 0x46, 0xc0, 0x68, 0x48, 0xb1, 0x08, 0x49, 0x09, 0x4a, + 0x3c, 0x30, 0x02, 0x23, 0x09, 0x78, 0x02, 0xeb, 0x41, 0x02, 0x02, 0x21, + 0xd1, 0xf7, 0xd0, 0xfc, 0x28, 0x46, 0x21, 0x46, 0xbd, 0xe8, 0xb0, 0x40, + 0x00, 0xf0, 0x72, 0xb8, 0x4c, 0x76, 0x01, 0x00, 0x74, 0x87, 0x08, 0x00, + 0x48, 0xf1, 0x05, 0x00, 0xb0, 0xb5, 0x04, 0x46, 0x90, 0xf8, 0x35, 0x01, + 0x16, 0x28, 0x16, 0xd8, 0x14, 0x49, 0x00, 0xeb, 0x40, 0x02, 0x51, 0xf8, + 0x22, 0x20, 0x82, 0xb1, 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, 0x80, 0x00, + 0x00, 0x79, 0x01, 0x28, 0x09, 0xd1, 0xd4, 0xf8, 0x88, 0x50, 0x28, 0xb2, + 0xb0, 0xf1, 0xff, 0x3f, 0x03, 0xdc, 0x20, 0x46, 0xf6, 0xf7, 0x4c, 0xfd, + 0x20, 0xb1, 0x20, 0x46, 0xbd, 0xe8, 0xb0, 0x40, 0x00, 0xf0, 0x50, 0xb8, + 0x25, 0xf4, 0x00, 0x40, 0xc4, 0xf8, 0x88, 0x00, 0x20, 0x46, 0x00, 0xf0, + 0x49, 0xf8, 0xd4, 0xf8, 0x88, 0x00, 0x40, 0xf4, 0x00, 0x40, 0xc4, 0xf8, + 0x88, 0x00, 0xb0, 0xbd, 0xe8, 0x72, 0x01, 0x00, 0x80, 0xb5, 0x00, 0xf0, + 0x43, 0xf8, 0x0a, 0x49, 0x91, 0xf8, 0x4d, 0x20, 0x02, 0x2a, 0x06, 0xd3, + 0xc9, 0x6a, 0x01, 0x31, 0x04, 0xd0, 0x10, 0x28, 0x28, 0xbf, 0x10, 0x20, + 0x00, 0xe0, 0x32, 0xb1, 0x04, 0x49, 0x09, 0x78, 0x01, 0x29, 0x02, 0xd1, + 0x10, 0x28, 0x28, 0xbf, 0x10, 0x20, 0x80, 0xbd, 0x18, 0x74, 0x01, 0x00, + 0x7e, 0x2c, 0x06, 0x00, 0x06, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, + 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, + 0x08, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, 0x08, 0x9d, 0x08, 0x00, + 0x09, 0xf5, 0x04, 0x00, 0xcc, 0xa1, 0x08, 0x00, 0x61, 0xf6, 0x04, 0x00, + 0x58, 0xa0, 0x08, 0x00, 0x99, 0xf6, 0x04, 0x00, 0x58, 0xcf, 0x08, 0x00, + 0xfd, 0xf6, 0x04, 0x00, 0x46, 0xf2, 0x53, 0x2c, 0xc1, 0xf2, 0x0f, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x45, 0xf6, 0xc7, 0x7c, 0xc1, 0xf2, 0x0f, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x45, 0xf6, 0x9f, 0x4c, 0xc1, 0xf2, 0x0f, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0xb0, 0xb5, 0x05, 0x46, 0x00, 0xf0, 0x7a, 0xf8, + 0x04, 0x46, 0x01, 0x28, 0x07, 0xd1, 0x05, 0x48, 0x02, 0x68, 0x28, 0x68, + 0x90, 0xf8, 0xb0, 0x15, 0x4f, 0xf4, 0x00, 0x70, 0x90, 0x47, 0x20, 0x46, + 0xb0, 0xbd, 0x00, 0xbf, 0xf8, 0xb9, 0x08, 0x00, 0x10, 0xb5, 0x01, 0x68, + 0x04, 0x46, 0x79, 0xb1, 0x26, 0x48, 0x27, 0x4a, 0x00, 0x78, 0xc0, 0xeb, + 0x40, 0x10, 0x02, 0xeb, 0xc0, 0x00, 0xb0, 0xf8, 0xdc, 0x00, 0xc0, 0x07, + 0x04, 0xd0, 0x05, 0x4a, 0x94, 0xf8, 0x84, 0x00, 0x12, 0x68, 0x90, 0x47, + 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, 0x57, 0xb8, 0x00, 0xbf, + 0xfc, 0xbb, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x41, 0x8a, 0xb0, 0x04, 0x46, + 0x00, 0xf0, 0x54, 0xf8, 0x20, 0x68, 0x40, 0xb3, 0x15, 0x49, 0x90, 0xf8, + 0xb0, 0x05, 0x09, 0x68, 0x88, 0x47, 0x20, 0x68, 0x08, 0xb3, 0x13, 0x48, + 0x13, 0x49, 0x00, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x01, 0xeb, 0xc0, 0x00, + 0xb0, 0xf8, 0xdc, 0x10, 0x49, 0x07, 0x16, 0xd5, 0x00, 0xf1, 0xc0, 0x01, + 0x0e, 0x48, 0x02, 0x68, 0x03, 0xa8, 0x90, 0x47, 0x0d, 0x48, 0x03, 0xaf, + 0x09, 0x9d, 0x9d, 0xf8, 0x25, 0x80, 0x04, 0x68, 0xcf, 0xcf, 0xcd, 0xe9, + 0x00, 0x67, 0x02, 0x95, 0xa0, 0x47, 0x01, 0x46, 0xa8, 0xf1, 0x02, 0x00, + 0xc0, 0xb2, 0x01, 0xf0, 0xe9, 0xfe, 0x0a, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, + 0x68, 0xd2, 0x08, 0x00, 0x74, 0x87, 0x08, 0x00, 0x0c, 0x6f, 0x01, 0x00, + 0x18, 0xb8, 0x08, 0x00, 0x1c, 0xb8, 0x08, 0x00, 0x03, 0x48, 0x04, 0x49, + 0x01, 0x60, 0x04, 0x48, 0x04, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0xf4, 0xbb, 0x08, 0x00, 0xd4, 0xf8, 0x04, 0x00, 0xb4, 0xe2, 0x08, 0x00, + 0xb4, 0xf8, 0x04, 0x00, 0x49, 0xf2, 0xe1, 0x1c, 0xc1, 0xf2, 0x0f, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x49, 0xf2, 0x6b, 0x2c, 0xc1, 0xf2, 0x0f, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x49, 0xf6, 0x99, 0x2c, 0xc1, 0xf2, 0x0f, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x8d, 0x91, 0x0d, 0x10, 0xfb, 0x91, 0x0d, 0x10, + 0x95, 0xf7, 0x04, 0x00, 0xbd, 0xf7, 0x04, 0x00, 0x41, 0x99, 0x0f, 0x10, + 0xf5, 0xf7, 0x04, 0x00, 0x91, 0x6a, 0x0f, 0x10, 0x49, 0x00, 0x00, 0x00, + 0x8d, 0x91, 0x0d, 0x10, 0xf7, 0x95, 0x0f, 0x10, 0x95, 0xf7, 0x04, 0x00, + 0xbd, 0xf7, 0x04, 0x00, 0x41, 0x99, 0x0f, 0x10, 0xf5, 0xf7, 0x04, 0x00, + 0x91, 0x6a, 0x0f, 0x10, 0x4a, 0x00, 0x00, 0x00, 0xb0, 0xb5, 0x16, 0x49, + 0x09, 0x68, 0xc9, 0x07, 0x24, 0xd0, 0x15, 0x49, 0x15, 0x4a, 0x13, 0x78, + 0x09, 0x7c, 0x15, 0x4a, 0x8b, 0x42, 0x94, 0xbf, 0xcc, 0x1a, 0x5c, 0x1a, + 0x92, 0x79, 0xe4, 0xb2, 0x94, 0x42, 0x15, 0xd3, 0x11, 0x4c, 0x24, 0x79, + 0x02, 0x2c, 0x13, 0xd1, 0x10, 0x4c, 0x94, 0xf8, 0xbe, 0x50, 0x94, 0xf8, + 0xbf, 0x40, 0x2b, 0x44, 0xdd, 0xb2, 0xa5, 0x42, 0x28, 0xbf, 0x1b, 0x1b, + 0xdc, 0xb2, 0x8c, 0x42, 0x94, 0xbf, 0xc9, 0x1a, 0x59, 0x1a, 0xc9, 0xb2, + 0x91, 0x42, 0x01, 0xd2, 0x00, 0x20, 0xb0, 0xbd, 0xbd, 0xe8, 0xb0, 0x40, + 0x00, 0xf0, 0x14, 0xb8, 0x04, 0x10, 0x00, 0x40, 0x84, 0x71, 0x01, 0x00, + 0xf4, 0x6d, 0x01, 0x00, 0x8c, 0x32, 0x06, 0x00, 0xc8, 0x6d, 0x01, 0x00, + 0xe8, 0x65, 0x08, 0x00, 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, + 0x4c, 0xbb, 0x08, 0x00, 0x84, 0xf9, 0x04, 0x00, 0x45, 0xf2, 0x07, 0x4c, + 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0xf1, 0x52, 0x0f, 0x10, + 0x55, 0x6a, 0x0f, 0x10, 0xf5, 0xf8, 0x04, 0x00, 0x47, 0x54, 0x0f, 0x10, + 0x8d, 0x6a, 0x0f, 0x10, 0x8f, 0x6a, 0x0f, 0x10, 0x91, 0x6a, 0x0f, 0x10, + 0x01, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x43, 0x26, 0x4f, 0x14, 0x46, + 0x00, 0x28, 0x41, 0xd0, 0x06, 0x46, 0xb8, 0x68, 0x00, 0x28, 0x3d, 0xd1, + 0x23, 0x48, 0x0d, 0x46, 0xb0, 0xf8, 0x30, 0x03, 0x88, 0x42, 0x37, 0xd9, + 0xdf, 0xf8, 0x84, 0x90, 0x72, 0xb6, 0xd9, 0xf8, 0x00, 0x00, 0x40, 0x00, + 0x01, 0x30, 0xc9, 0xf8, 0x00, 0x00, 0x1e, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x80, 0x46, 0xd9, 0xf8, 0x00, 0x00, 0xb8, 0xf1, 0x00, 0x0f, 0x4f, 0xea, + 0x50, 0x00, 0xc9, 0xf8, 0x00, 0x00, 0xd9, 0xf8, 0x00, 0x00, 0x80, 0xf3, + 0x10, 0x88, 0x1a, 0xd0, 0xd1, 0xf7, 0x0c, 0xfb, 0x03, 0x21, 0x04, 0x30, + 0xc7, 0xf8, 0x0c, 0x80, 0x3c, 0x74, 0xbe, 0x60, 0x88, 0xf8, 0x14, 0x10, + 0x69, 0x1c, 0xa8, 0xf8, 0x10, 0x10, 0x1a, 0x49, 0x08, 0x40, 0x79, 0x68, + 0x38, 0x60, 0xc8, 0xf8, 0x00, 0x00, 0x0d, 0x48, 0x01, 0x31, 0x02, 0x68, + 0x0c, 0x48, 0x79, 0x60, 0x81, 0x69, 0x40, 0x46, 0x90, 0x47, 0x01, 0x20, + 0xbd, 0xe8, 0xf8, 0x83, 0x38, 0x7c, 0xa0, 0x42, 0x4f, 0xf0, 0x00, 0x00, + 0x38, 0xbf, 0x3c, 0x74, 0xbd, 0xe8, 0xf8, 0x83, 0xf4, 0x71, 0x01, 0x00, + 0x00, 0x69, 0x08, 0x00, 0x24, 0x36, 0x01, 0x00, 0xd8, 0xa0, 0x08, 0x00, + 0xd4, 0xa0, 0x08, 0x00, 0xfc, 0x73, 0x01, 0x00, 0x80, 0xb5, 0x06, 0x4a, + 0x06, 0x4b, 0x51, 0x68, 0x12, 0x6a, 0x82, 0x60, 0x04, 0x32, 0x1a, 0x40, + 0x02, 0x60, 0x04, 0x4a, 0x12, 0x68, 0x90, 0x47, 0x00, 0x20, 0x80, 0xbd, + 0xfc, 0x70, 0x01, 0x00, 0xfc, 0xff, 0xff, 0x0f, 0xc4, 0xa0, 0x08, 0x00, + 0x01, 0x48, 0x02, 0x49, 0x81, 0x62, 0x70, 0x47, 0x90, 0xe8, 0x08, 0x00, + 0x5d, 0xfa, 0x04, 0x00, 0x10, 0xb5, 0x04, 0x46, 0x16, 0x48, 0x01, 0x78, + 0x61, 0xb1, 0x00, 0x21, 0x08, 0x22, 0x01, 0x70, 0x14, 0x48, 0x61, 0x68, + 0x03, 0x68, 0x83, 0x20, 0x98, 0x47, 0x20, 0x46, 0xdf, 0xf7, 0x08, 0xf9, + 0x00, 0x20, 0x10, 0xbd, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, + 0x29, 0xb8, 0x00, 0xbf, 0x10, 0xb5, 0x04, 0x46, 0x0a, 0x48, 0x01, 0x78, + 0x61, 0xb1, 0x00, 0x21, 0x08, 0x22, 0x01, 0x70, 0x08, 0x48, 0x61, 0x68, + 0x03, 0x68, 0x83, 0x20, 0x98, 0x47, 0x20, 0x46, 0xdf, 0xf7, 0xf0, 0xf8, + 0x00, 0x20, 0x10, 0xbd, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, + 0x17, 0xb8, 0x00, 0xbf, 0xcc, 0xf0, 0x05, 0x00, 0xa8, 0xa0, 0x08, 0x00, + 0x02, 0x48, 0x03, 0x49, 0x81, 0x61, 0x03, 0x49, 0xc1, 0x60, 0x70, 0x47, + 0xf4, 0xe0, 0x08, 0x00, 0x95, 0xfa, 0x04, 0x00, 0xc5, 0xfa, 0x04, 0x00, + 0x47, 0xf2, 0xc3, 0x6c, 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x47, 0xf2, 0xd3, 0x5c, 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x2d, 0xe9, 0xfe, 0x4f, 0xc6, 0x4c, 0xdf, 0xf8, 0x1c, 0x93, 0x20, 0x78, + 0xc0, 0xeb, 0x40, 0x10, 0x09, 0xeb, 0xc0, 0x02, 0x92, 0xf8, 0x91, 0x10, + 0x31, 0xb1, 0xb2, 0xf8, 0xdc, 0x10, 0xcb, 0x06, 0x48, 0xbf, 0x5f, 0xea, + 0x01, 0x71, 0x01, 0xd4, 0xbd, 0xe8, 0xfe, 0x8f, 0x59, 0xf8, 0x30, 0x60, + 0xb2, 0xf8, 0xde, 0xb0, 0x92, 0xf8, 0x9f, 0x30, 0xdf, 0xf8, 0xec, 0x82, + 0x31, 0x6f, 0xb3, 0xfa, 0x83, 0xf3, 0x5b, 0x09, 0x59, 0x44, 0x31, 0x67, + 0x00, 0x21, 0x82, 0xf8, 0x9e, 0x10, 0x92, 0xf8, 0xa1, 0x10, 0x59, 0xf8, + 0x30, 0x00, 0x18, 0xf8, 0x01, 0x10, 0x90, 0xf8, 0x35, 0x71, 0x41, 0xea, + 0x83, 0x03, 0x82, 0xf8, 0x95, 0x70, 0x1b, 0x01, 0x82, 0xf8, 0x96, 0x30, + 0xaf, 0x4a, 0x12, 0x78, 0x12, 0xb1, 0x00, 0xf1, 0x20, 0x02, 0x0d, 0xe0, + 0xad, 0x4a, 0x12, 0x78, 0x42, 0xf0, 0x02, 0x02, 0x02, 0x2a, 0x03, 0xd1, + 0x90, 0xf8, 0x88, 0x20, 0x52, 0x07, 0x02, 0xd4, 0x00, 0xf1, 0x2c, 0x02, + 0x00, 0xe0, 0xa8, 0x4a, 0x4f, 0xea, 0x1b, 0x27, 0xbb, 0xf1, 0x00, 0x0f, + 0x00, 0x92, 0x05, 0xd0, 0xbb, 0xf1, 0x03, 0x0f, 0x24, 0xd8, 0x02, 0x29, + 0x2e, 0xd0, 0x21, 0xe0, 0x02, 0x29, 0x1f, 0xd1, 0xa2, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x00, 0x28, 0xb6, 0xd0, 0x21, 0x78, 0xc1, 0xeb, 0x41, 0x11, + 0x09, 0xeb, 0xc1, 0x01, 0x91, 0xf8, 0x95, 0x10, 0x01, 0x70, 0x21, 0x78, + 0xc1, 0xeb, 0x41, 0x11, 0x09, 0xeb, 0xc1, 0x01, 0x91, 0xf8, 0x96, 0x10, + 0xc7, 0x70, 0x80, 0xf8, 0x02, 0xb0, 0x41, 0x70, 0x00, 0x99, 0xd3, 0xf7, + 0xdd, 0xfb, 0x01, 0x20, 0x4f, 0xf0, 0x00, 0x0b, 0x00, 0x27, 0xa2, 0xe0, + 0x90, 0xf8, 0x35, 0x01, 0x90, 0x49, 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, + 0x40, 0x10, 0x90, 0xf8, 0x5d, 0x00, 0x01, 0x28, 0x40, 0xf0, 0x96, 0x80, + 0x8c, 0x48, 0x00, 0x68, 0x80, 0x47, 0x00, 0x28, 0x3f, 0xf4, 0x8a, 0xaf, + 0x05, 0x46, 0x96, 0xf8, 0x35, 0x01, 0x4f, 0xf0, 0x01, 0x0a, 0x02, 0xa9, + 0xad, 0xf8, 0x0a, 0xb0, 0x8d, 0xf8, 0x08, 0xa0, 0x8d, 0xf8, 0x09, 0x00, + 0x84, 0x48, 0x02, 0x68, 0x42, 0x20, 0x90, 0x47, 0x20, 0x78, 0xc0, 0xeb, + 0x40, 0x10, 0x09, 0xeb, 0xc0, 0x00, 0x90, 0xf8, 0xa1, 0x00, 0x18, 0xf8, + 0x00, 0x10, 0x96, 0xf8, 0x35, 0x01, 0x02, 0x29, 0x06, 0xd1, 0x7a, 0x4a, + 0x00, 0xeb, 0x40, 0x01, 0x02, 0xeb, 0x41, 0x11, 0x81, 0xf8, 0x5d, 0xa0, + 0x76, 0x4c, 0x00, 0xeb, 0x40, 0x00, 0x04, 0xeb, 0x40, 0x10, 0x90, 0xf8, + 0x5c, 0x20, 0x02, 0xeb, 0x0b, 0x01, 0x03, 0x29, 0x12, 0xd8, 0x10, 0x44, + 0x2a, 0x1d, 0x59, 0x46, 0x5b, 0x46, 0x58, 0x30, 0xd1, 0xf7, 0xba, 0xf9, + 0x96, 0xf8, 0x35, 0x01, 0x00, 0xeb, 0x40, 0x00, 0x04, 0xeb, 0x40, 0x10, + 0x90, 0xf8, 0x5c, 0x10, 0x59, 0x44, 0x80, 0xf8, 0x5c, 0x10, 0x4c, 0xe0, + 0x6a, 0x48, 0x00, 0x88, 0x81, 0x42, 0x48, 0xd2, 0x69, 0x48, 0x00, 0x21, + 0x4f, 0xf0, 0x00, 0x0a, 0x00, 0xf5, 0xe8, 0x70, 0xd5, 0xf7, 0xec, 0xfa, + 0x00, 0x28, 0x3e, 0xd0, 0x80, 0x46, 0x96, 0xf8, 0x35, 0x01, 0x00, 0xeb, + 0x40, 0x00, 0x04, 0xeb, 0x40, 0x10, 0x90, 0xf8, 0x5c, 0x10, 0x00, 0xf1, + 0x58, 0x02, 0x08, 0xf1, 0x04, 0x00, 0x0b, 0x46, 0xd1, 0xf7, 0x90, 0xf9, + 0x96, 0xf8, 0x35, 0x01, 0x2a, 0x1d, 0x59, 0x46, 0x5b, 0x46, 0x00, 0xeb, + 0x40, 0x00, 0x04, 0xeb, 0x40, 0x10, 0x90, 0xf8, 0x5c, 0x00, 0x40, 0x44, + 0x04, 0x30, 0xd1, 0xf7, 0x81, 0xf9, 0x4b, 0x48, 0x00, 0x78, 0xc0, 0xeb, + 0x40, 0x10, 0x09, 0xeb, 0xc0, 0x00, 0x90, 0xf8, 0x96, 0x10, 0x01, 0xf0, + 0xcf, 0x01, 0x20, 0x31, 0x80, 0xf8, 0x96, 0x10, 0x28, 0x46, 0xd6, 0xf7, + 0xdf, 0xff, 0x96, 0xf8, 0x35, 0x01, 0x00, 0xeb, 0x40, 0x00, 0x04, 0xeb, + 0x40, 0x10, 0x90, 0xf8, 0x5c, 0x10, 0x80, 0xf8, 0x5d, 0xa0, 0x80, 0xf8, + 0x5c, 0xa0, 0x8b, 0x44, 0x1f, 0xfa, 0x8b, 0xf0, 0x07, 0x0a, 0x3b, 0x4c, + 0x00, 0x20, 0x01, 0x90, 0xdf, 0xf8, 0x10, 0x81, 0x5f, 0xfa, 0x8b, 0xf0, + 0x40, 0xea, 0x07, 0x25, 0x28, 0x04, 0x60, 0xd0, 0x3c, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x00, 0x28, 0x3f, 0xf4, 0xea, 0xae, 0x06, 0x46, 0x20, 0x78, + 0x3a, 0x49, 0xc0, 0xeb, 0x40, 0x10, 0x09, 0x88, 0x09, 0xeb, 0xc0, 0x00, + 0x90, 0xf8, 0x95, 0x00, 0x30, 0x70, 0xa8, 0xb2, 0x88, 0x42, 0x98, 0xbf, + 0x29, 0x46, 0x22, 0x78, 0x08, 0x0a, 0xa5, 0xeb, 0x01, 0x0b, 0xc2, 0xeb, + 0x42, 0x12, 0x09, 0xeb, 0xc2, 0x03, 0x93, 0xf8, 0x96, 0x70, 0xf0, 0x70, + 0xb1, 0x70, 0x77, 0x70, 0x93, 0xf8, 0x96, 0x00, 0x59, 0xf8, 0x32, 0x10, + 0x00, 0xf0, 0xcf, 0x00, 0x10, 0x30, 0x83, 0xf8, 0x96, 0x00, 0x1f, 0xfa, + 0x8b, 0xf0, 0x07, 0x0a, 0x91, 0xf8, 0xd0, 0x01, 0xff, 0x28, 0x27, 0xd0, + 0x72, 0x78, 0x02, 0xf0, 0x30, 0x02, 0x10, 0x2a, 0x03, 0xd1, 0x08, 0xeb, + 0x00, 0x12, 0x92, 0x7b, 0x0c, 0xe0, 0x08, 0xeb, 0x00, 0x13, 0xb4, 0x79, + 0xf5, 0x79, 0x9a, 0x89, 0x44, 0xea, 0x05, 0x24, 0xa2, 0x1a, 0x14, 0x4c, + 0xb2, 0xfa, 0x82, 0xf2, 0x52, 0x09, 0x9a, 0x73, 0x01, 0x2a, 0x0f, 0xd1, + 0x02, 0x01, 0x08, 0xeb, 0x00, 0x1a, 0x91, 0xf8, 0x35, 0x11, 0x58, 0xf8, + 0x02, 0x30, 0xba, 0xf8, 0x0c, 0x00, 0x32, 0x46, 0x98, 0x47, 0x01, 0x28, + 0xa2, 0xd0, 0x00, 0x20, 0x8a, 0xf8, 0x0e, 0x00, 0x00, 0x99, 0x30, 0x46, + 0xd3, 0xf7, 0xce, 0xfa, 0x01, 0x20, 0x01, 0x90, 0x98, 0xe7, 0x01, 0x98, + 0x00, 0x28, 0x3f, 0xf4, 0x8b, 0xae, 0x0f, 0x48, 0x04, 0x21, 0x00, 0x78, + 0xd1, 0xf7, 0xf2, 0xf8, 0xbd, 0xe8, 0xfe, 0x8f, 0x74, 0x87, 0x08, 0x00, + 0x0c, 0x6f, 0x01, 0x00, 0xd8, 0x69, 0x0f, 0x10, 0x70, 0x59, 0x01, 0x00, + 0x5d, 0x34, 0x01, 0x00, 0xf4, 0x61, 0x01, 0x00, 0x54, 0xf1, 0x05, 0x00, + 0xc4, 0xa1, 0x08, 0x00, 0x1c, 0xa1, 0x08, 0x00, 0xc6, 0x58, 0x01, 0x00, + 0x68, 0x8a, 0x01, 0x00, 0xd4, 0x71, 0x01, 0x00, 0x66, 0x34, 0x01, 0x00, + 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, 0x0c, 0xb8, 0x08, 0x00, + 0x2d, 0xfb, 0x04, 0x00, 0x05, 0x48, 0x06, 0x4a, 0x41, 0x89, 0x03, 0x7a, + 0x91, 0x80, 0xc1, 0x79, 0x40, 0x7a, 0x53, 0x70, 0x11, 0x70, 0x90, 0x70, + 0x70, 0x47, 0x00, 0xbf, 0x98, 0x32, 0x06, 0x00, 0x4c, 0xf1, 0x05, 0x00, + 0xf8, 0xb5, 0x0c, 0x46, 0x05, 0x46, 0x00, 0xf0, 0x97, 0xf9, 0x06, 0x46, + 0x05, 0x48, 0x06, 0x49, 0x0a, 0x22, 0x23, 0x46, 0x07, 0x68, 0x28, 0x46, + 0xb8, 0x47, 0x01, 0x28, 0x08, 0xbf, 0x06, 0x46, 0x30, 0x46, 0xf8, 0xbd, + 0x20, 0xea, 0x08, 0x00, 0xc0, 0xd3, 0x05, 0x00, 0x80, 0xb5, 0x07, 0x49, + 0x09, 0x68, 0x88, 0x47, 0x4f, 0x49, 0x91, 0xf8, 0x2e, 0x10, 0x40, 0x1a, + 0x00, 0xb2, 0x10, 0xf1, 0x80, 0x0f, 0xd8, 0xbf, 0x6f, 0xf0, 0x7f, 0x00, + 0x40, 0xb2, 0x80, 0xbd, 0x1c, 0xea, 0x08, 0x00, 0xb0, 0xb5, 0x48, 0x4b, + 0x01, 0x24, 0xb1, 0xf9, 0x00, 0x50, 0x04, 0xfa, 0x02, 0xf2, 0xdb, 0x78, + 0xd2, 0xb2, 0x98, 0x40, 0x90, 0xfb, 0xf2, 0xf0, 0x95, 0xfb, 0xf2, 0xf2, + 0xaa, 0x1a, 0x10, 0x44, 0x08, 0x80, 0x00, 0xb2, 0x04, 0xfa, 0x03, 0xf1, + 0x90, 0xfb, 0xf1, 0xf0, 0x40, 0xb2, 0xb0, 0xbd, 0xfe, 0xb5, 0xa8, 0xb1, + 0x3a, 0x4d, 0x04, 0x46, 0xdd, 0xe9, 0x0a, 0x60, 0xdd, 0xe9, 0x08, 0xc7, + 0x2d, 0x68, 0xcd, 0xe9, 0x00, 0x76, 0x02, 0x90, 0x08, 0x46, 0x11, 0x46, + 0x1a, 0x46, 0x63, 0x46, 0xa8, 0x47, 0x14, 0x28, 0x84, 0xf8, 0xa5, 0x00, + 0x02, 0xdc, 0x05, 0x46, 0x80, 0x30, 0x00, 0xd1, 0xfe, 0xbd, 0xb4, 0xf8, + 0x84, 0x00, 0x40, 0x07, 0x1d, 0xd4, 0x30, 0x48, 0x72, 0xb6, 0x01, 0x68, + 0x49, 0x00, 0x01, 0x31, 0x01, 0x60, 0xb4, 0xf8, 0x84, 0x10, 0x41, 0xf0, + 0x04, 0x01, 0xa4, 0xf8, 0x84, 0x10, 0x01, 0x68, 0x49, 0x08, 0x01, 0x60, + 0x00, 0x68, 0x80, 0xf3, 0x10, 0x88, 0x25, 0x48, 0x84, 0xf8, 0x3a, 0x50, + 0x84, 0xf8, 0xa6, 0x50, 0xc0, 0x78, 0x05, 0xfa, 0x00, 0xf0, 0xa0, 0x87, + 0xa4, 0xf8, 0xa8, 0x00, 0xfe, 0xbd, 0x1f, 0x49, 0x94, 0xf8, 0x35, 0x01, + 0xce, 0x78, 0x16, 0x28, 0x0c, 0xd8, 0x1d, 0x49, 0x00, 0xeb, 0x40, 0x02, + 0x51, 0xf8, 0x22, 0x20, 0x32, 0xb1, 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, + 0x80, 0x00, 0x00, 0x79, 0x03, 0x28, 0x0b, 0xd0, 0x94, 0xf8, 0x24, 0x01, + 0x03, 0x28, 0x07, 0xd0, 0x94, 0xf8, 0x24, 0x01, 0x84, 0x28, 0x03, 0xd0, + 0x94, 0xf8, 0x24, 0x01, 0x85, 0x28, 0x08, 0xd1, 0xd4, 0xf8, 0xf8, 0x00, + 0xc9, 0x28, 0x04, 0xd3, 0x02, 0x26, 0xb0, 0xf5, 0x48, 0x7f, 0x88, 0xbf, + 0x01, 0x26, 0x72, 0x4f, 0x04, 0xf1, 0x3c, 0x01, 0x28, 0x46, 0x32, 0x46, + 0x3b, 0x68, 0x98, 0x47, 0x84, 0xf8, 0x3a, 0x00, 0x00, 0x2e, 0x18, 0xbf, + 0x01, 0x3e, 0x3b, 0x68, 0xf2, 0xb2, 0x04, 0xf1, 0xa8, 0x01, 0x28, 0x46, + 0x98, 0x47, 0x84, 0xf8, 0xa6, 0x00, 0xfe, 0xbd, 0x1c, 0xb8, 0x08, 0x00, + 0x00, 0x69, 0x08, 0x00, 0xe8, 0x72, 0x01, 0x00, 0x24, 0x36, 0x01, 0x00, + 0x10, 0xb5, 0x00, 0xf0, 0xdf, 0xf8, 0x18, 0x48, 0x18, 0x4c, 0x40, 0xf2, + 0xf3, 0x11, 0x81, 0x80, 0x20, 0x68, 0x40, 0xb9, 0x60, 0x79, 0x34, 0x21, + 0x10, 0xfb, 0x01, 0xf0, 0x14, 0x49, 0x09, 0x68, 0x88, 0x47, 0x20, 0x60, + 0xa0, 0xb1, 0x13, 0x4c, 0x20, 0x68, 0x30, 0xb9, 0x10, 0x48, 0x01, 0x68, + 0x20, 0x7a, 0xc0, 0x00, 0x88, 0x47, 0x20, 0x60, 0x70, 0xb1, 0xff, 0xf7, + 0x11, 0xff, 0x0e, 0x48, 0x00, 0x21, 0x01, 0x70, 0x0d, 0x48, 0x01, 0x78, + 0x41, 0xf0, 0x08, 0x01, 0x01, 0x70, 0x10, 0xbd, 0x00, 0x20, 0x40, 0xf2, + 0x71, 0x11, 0x02, 0xe0, 0x00, 0x20, 0x40, 0xf2, 0x7b, 0x11, 0xbd, 0xe8, + 0x10, 0x40, 0xd6, 0xf7, 0x15, 0xbe, 0x00, 0xbf, 0x70, 0x58, 0x01, 0x00, + 0x20, 0x54, 0x01, 0x00, 0xdc, 0x9b, 0x08, 0x00, 0x30, 0x54, 0x01, 0x00, + 0x52, 0xf1, 0x05, 0x00, 0x7f, 0x0f, 0x01, 0x00, 0x80, 0xb5, 0x00, 0xf0, + 0xa5, 0xf8, 0x09, 0x4a, 0x07, 0x48, 0x12, 0x78, 0x01, 0x78, 0x12, 0xb1, + 0x49, 0xb9, 0x01, 0x21, 0x01, 0xe0, 0x31, 0xb1, 0x00, 0x21, 0x01, 0x70, + 0x04, 0x48, 0x00, 0x68, 0xbd, 0xe8, 0x80, 0x40, 0x00, 0x47, 0x80, 0xbd, + 0x53, 0xf1, 0x05, 0x00, 0xd5, 0x58, 0x01, 0x00, 0x18, 0xc3, 0x08, 0x00, + 0x10, 0xb5, 0x04, 0x46, 0x09, 0x48, 0x90, 0xf8, 0x5f, 0x01, 0x01, 0x28, + 0x06, 0xd1, 0x08, 0x49, 0x20, 0x46, 0x04, 0x22, 0x00, 0xf0, 0x88, 0xf8, + 0x10, 0xb1, 0x10, 0xbd, 0x00, 0x20, 0x10, 0xbd, 0x20, 0x46, 0xbd, 0xe8, + 0x10, 0x40, 0x00, 0xf0, 0x85, 0xb8, 0x00, 0xbf, 0xe8, 0x65, 0x08, 0x00, + 0x24, 0xd4, 0x05, 0x00, 0xbc, 0xb5, 0x04, 0x46, 0x48, 0x78, 0x00, 0xf0, + 0x30, 0x00, 0x10, 0x28, 0x2b, 0xd0, 0x0d, 0x46, 0x0a, 0x1d, 0x68, 0x46, + 0x05, 0x21, 0x05, 0x23, 0xd0, 0xf7, 0x76, 0xff, 0xbd, 0xf8, 0x02, 0x00, + 0x04, 0x28, 0x20, 0xd1, 0xbd, 0xf8, 0x00, 0x00, 0x38, 0x28, 0x1c, 0xd1, + 0x9d, 0xf8, 0x04, 0x00, 0x1b, 0x28, 0x18, 0xd1, 0x68, 0x7a, 0xa9, 0x7a, + 0x40, 0xea, 0x01, 0x20, 0x15, 0x28, 0x12, 0xd1, 0xe8, 0x7a, 0x10, 0xf0, + 0x03, 0x01, 0x0e, 0xd0, 0x03, 0x29, 0x0c, 0xd0, 0x10, 0xf0, 0xfc, 0x0f, + 0x09, 0xd0, 0xb4, 0xf8, 0x38, 0x03, 0x40, 0xf4, 0x00, 0x50, 0xa4, 0xf8, + 0x38, 0x03, 0x02, 0x48, 0x01, 0x68, 0x32, 0x20, 0x88, 0x47, 0xbc, 0xbd, + 0xe0, 0x9c, 0x08, 0x00, 0x0a, 0x48, 0x0b, 0x49, 0x01, 0x60, 0x0b, 0x48, + 0x0b, 0x49, 0x01, 0x60, 0x0b, 0x48, 0x0c, 0x49, 0x01, 0x60, 0x0c, 0x48, + 0x0c, 0x49, 0x01, 0x60, 0x0c, 0x48, 0x0d, 0x49, 0x01, 0x60, 0x0d, 0x48, + 0x0d, 0x49, 0x01, 0x60, 0x0d, 0x48, 0x0e, 0x49, 0x01, 0x60, 0x70, 0x47, + 0x24, 0xea, 0x08, 0x00, 0xdd, 0xfe, 0x04, 0x00, 0x0c, 0xbb, 0x08, 0x00, + 0xb1, 0xfe, 0x04, 0x00, 0x10, 0xb8, 0x08, 0x00, 0x01, 0xff, 0x04, 0x00, + 0x14, 0xb8, 0x08, 0x00, 0x31, 0xff, 0x04, 0x00, 0x34, 0xc8, 0x08, 0x00, + 0x31, 0x00, 0x05, 0x00, 0xb8, 0xa0, 0x08, 0x00, 0xb1, 0x00, 0x05, 0x00, + 0x30, 0xea, 0x08, 0x00, 0xe5, 0x00, 0x05, 0x00, 0x4c, 0xf2, 0x2d, 0x6c, + 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4b, 0xf2, 0x11, 0x3c, + 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4b, 0xf6, 0xbf, 0x0c, + 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4c, 0xf2, 0xf7, 0x6c, + 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4c, 0xf2, 0x87, 0x7c, + 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x7c, 0xb5, 0x04, 0x46, + 0x2a, 0x48, 0x0d, 0x46, 0x00, 0x68, 0x80, 0x47, 0x16, 0x2d, 0x4d, 0xd8, + 0x28, 0x49, 0x05, 0xeb, 0x45, 0x00, 0x51, 0xf8, 0x20, 0x00, 0x00, 0x28, + 0x46, 0xd0, 0x05, 0xeb, 0x45, 0x02, 0x01, 0xeb, 0x82, 0x01, 0x09, 0x79, + 0x04, 0x29, 0x3f, 0xd8, 0x01, 0x22, 0x8a, 0x40, 0x12, 0xf0, 0x1a, 0x0f, + 0x3a, 0xd0, 0x90, 0xf8, 0x35, 0x21, 0x03, 0x29, 0xad, 0xf8, 0x00, 0x20, + 0xd0, 0xf8, 0xd8, 0x20, 0xa4, 0xeb, 0x02, 0x02, 0xad, 0xf8, 0x02, 0x20, + 0x03, 0xd0, 0x90, 0xf8, 0xb0, 0x15, 0x01, 0x29, 0x01, 0xd1, 0x03, 0x21, + 0x04, 0xe0, 0x01, 0x78, 0x01, 0x39, 0xb1, 0xfa, 0x81, 0xf1, 0x49, 0x09, + 0x14, 0x4a, 0x90, 0xf8, 0x74, 0x00, 0x12, 0x68, 0x90, 0x47, 0x8d, 0xf8, + 0x06, 0x00, 0x12, 0x48, 0x00, 0x22, 0x04, 0x23, 0x6c, 0x46, 0x90, 0xf8, + 0x5f, 0x10, 0x01, 0x29, 0x11, 0xbf, 0xff, 0x25, 0x00, 0xeb, 0x42, 0x05, + 0xb5, 0xf9, 0x58, 0x50, 0x95, 0xfb, 0xf3, 0xf5, 0xa6, 0x18, 0x00, 0x2a, + 0x4f, 0xf0, 0x01, 0x02, 0x35, 0x71, 0xf0, 0xd0, 0x08, 0x48, 0x6a, 0x46, + 0x00, 0x21, 0x08, 0x23, 0x04, 0x68, 0x4f, 0xf4, 0xc1, 0x60, 0xa0, 0x47, + 0x7c, 0xbd, 0x00, 0xbf, 0x3c, 0xc5, 0x08, 0x00, 0xe8, 0x72, 0x01, 0x00, + 0x34, 0x9c, 0x08, 0x00, 0xd0, 0xe2, 0x05, 0x00, 0x78, 0x9b, 0x08, 0x00, + 0x10, 0xb5, 0x40, 0xf2, 0x71, 0x23, 0xc1, 0xf3, 0x0b, 0x11, 0xa0, 0xfb, + 0x03, 0x03, 0x5f, 0xea, 0x53, 0x03, 0x4f, 0xea, 0x30, 0x00, 0x08, 0x44, + 0x90, 0x42, 0x01, 0xd2, 0x14, 0x1a, 0x07, 0xe0, 0xc1, 0x0e, 0x10, 0x29, + 0x87, 0xbf, 0xc0, 0x43, 0x84, 0x18, 0x10, 0x1a, 0x00, 0xf1, 0x08, 0x44, + 0x08, 0x48, 0x84, 0x42, 0x07, 0xd2, 0x44, 0xf6, 0x37, 0x20, 0x84, 0x42, + 0x08, 0xd8, 0x00, 0x20, 0x40, 0xf2, 0x13, 0x11, 0x02, 0xe0, 0x00, 0x20, + 0x4f, 0xf4, 0x89, 0x71, 0xd6, 0xf7, 0xc4, 0xfc, 0x20, 0x46, 0x10, 0xbd, + 0xe9, 0xe5, 0x04, 0x00, 0xf0, 0xb5, 0x85, 0xb0, 0x14, 0x46, 0x0f, 0x46, + 0x06, 0x46, 0xde, 0xf7, 0x43, 0xfa, 0x00, 0x25, 0x28, 0xbb, 0x14, 0x48, + 0x6a, 0x46, 0x02, 0x97, 0xad, 0xf8, 0x0c, 0x50, 0x03, 0x68, 0xd6, 0xf8, + 0xd4, 0x00, 0x00, 0xf1, 0x14, 0x01, 0x02, 0xa8, 0x98, 0x47, 0x96, 0xf8, + 0x32, 0x04, 0x0e, 0x49, 0x04, 0x22, 0x0a, 0x23, 0x00, 0xeb, 0x80, 0x00, + 0x01, 0xeb, 0xc0, 0x00, 0x0b, 0x49, 0x04, 0x30, 0x0e, 0x68, 0x04, 0xa9, + 0xb0, 0x47, 0x04, 0x9a, 0xdd, 0xe9, 0x00, 0x01, 0x12, 0xba, 0xff, 0xf7, + 0xab, 0xff, 0x41, 0xf2, 0x70, 0x71, 0x40, 0x1a, 0xa0, 0x42, 0x38, 0xbf, + 0x01, 0x25, 0x28, 0x46, 0x05, 0xb0, 0xf0, 0xbd, 0x48, 0xa1, 0x08, 0x00, + 0x40, 0x01, 0x00, 0x00, 0x34, 0xe5, 0x08, 0x00, 0x7c, 0xb5, 0x58, 0xb1, + 0x04, 0x46, 0xd0, 0xf8, 0xd4, 0x00, 0x38, 0xb1, 0x01, 0x7f, 0x04, 0x29, + 0x04, 0xd8, 0x25, 0x4a, 0x52, 0xf8, 0x21, 0x10, 0x88, 0x42, 0x00, 0xd0, + 0x7c, 0xbd, 0x90, 0xf8, 0xe6, 0x10, 0x31, 0xb9, 0x90, 0xf8, 0xe7, 0x10, + 0x19, 0xb9, 0x90, 0xf8, 0xe8, 0x00, 0x00, 0x28, 0xf4, 0xd0, 0x94, 0xf8, + 0xa4, 0x04, 0x41, 0x07, 0x01, 0xd5, 0x00, 0x07, 0xee, 0xd5, 0xb4, 0xf8, + 0x82, 0x00, 0x41, 0x06, 0x2b, 0xd5, 0x19, 0x48, 0x9f, 0x4d, 0x01, 0x21, + 0x00, 0x22, 0x06, 0x68, 0x80, 0x20, 0x2b, 0x46, 0x00, 0x90, 0x40, 0xf2, + 0xa9, 0x60, 0xb0, 0x47, 0xb4, 0xf8, 0x82, 0x00, 0x40, 0x06, 0x15, 0xd5, + 0x28, 0x6d, 0xe9, 0x6d, 0x11, 0x4a, 0x40, 0x1a, 0x20, 0xf0, 0x70, 0x40, + 0x01, 0x09, 0x32, 0x29, 0x9a, 0xbf, 0x00, 0xeb, 0x80, 0x00, 0xc0, 0xf3, + 0x1a, 0x11, 0xff, 0x21, 0xab, 0x6c, 0x68, 0x78, 0x15, 0x68, 0x00, 0x22, + 0xc9, 0xb2, 0x00, 0x92, 0x00, 0x22, 0xa8, 0x47, 0x08, 0x48, 0x12, 0x21, + 0x00, 0x78, 0xd0, 0xf7, 0xf1, 0xfd, 0xb4, 0xf8, 0x82, 0x00, 0x20, 0xf0, + 0x40, 0x00, 0xa4, 0xf8, 0x82, 0x00, 0x7c, 0xbd, 0xfc, 0x73, 0x01, 0x00, + 0xa0, 0xa0, 0x08, 0x00, 0x7c, 0xe5, 0x08, 0x00, 0x66, 0x34, 0x01, 0x00, + 0x2d, 0xe9, 0xfe, 0x4f, 0x00, 0x28, 0x44, 0xd0, 0x04, 0x46, 0x90, 0xf8, + 0x88, 0x04, 0x80, 0x07, 0x3f, 0xd5, 0xd0, 0xf7, 0xcb, 0xfd, 0xc4, 0xf8, + 0x70, 0x01, 0x73, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0xb8, 0xb1, + 0x71, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x06, 0x46, 0x4f, 0xea, + 0x10, 0x6a, 0x4f, 0xea, 0x10, 0x4b, 0x05, 0x0a, 0x6d, 0x48, 0x01, 0x68, + 0x20, 0x46, 0x88, 0x47, 0x07, 0x46, 0x4f, 0xea, 0x10, 0x68, 0x4f, 0xea, + 0x10, 0x49, 0x01, 0x0a, 0x00, 0x20, 0x02, 0x90, 0x30, 0x46, 0x1b, 0xe0, + 0x94, 0x48, 0x27, 0x6a, 0xb0, 0xf8, 0x1e, 0x05, 0x3b, 0x46, 0x02, 0x97, + 0x03, 0x30, 0x20, 0xf0, 0x03, 0x01, 0x7a, 0x18, 0x7f, 0x5c, 0x55, 0x7a, + 0x16, 0x7a, 0x92, 0xf8, 0x0a, 0xb0, 0x92, 0xf8, 0x0b, 0xa0, 0x51, 0x78, + 0x92, 0xf8, 0x02, 0x90, 0x92, 0xf8, 0x03, 0x80, 0x46, 0xea, 0x05, 0x20, + 0x40, 0xea, 0x0b, 0x40, 0x40, 0xea, 0x0a, 0x60, 0x01, 0x30, 0x02, 0x28, + 0x01, 0xd2, 0xbd, 0xe8, 0xfe, 0x8f, 0x57, 0x48, 0x01, 0x91, 0x01, 0x68, + 0x20, 0x46, 0x88, 0x47, 0x5f, 0xfa, 0x8b, 0xf0, 0xe9, 0xb2, 0x00, 0x04, + 0x40, 0xea, 0x0a, 0x60, 0x40, 0xea, 0x01, 0x20, 0xf1, 0xb2, 0x08, 0x44, + 0xd4, 0xf8, 0x70, 0x11, 0x08, 0x1a, 0x01, 0x99, 0x20, 0xf0, 0x70, 0x4a, + 0x5f, 0xfa, 0x89, 0xf0, 0x00, 0x04, 0xc9, 0xb2, 0x40, 0xea, 0x08, 0x60, + 0x40, 0xea, 0x01, 0x20, 0xf9, 0xb2, 0x47, 0x18, 0xd0, 0xf7, 0x6a, 0xfd, + 0xc0, 0x1b, 0x94, 0xf8, 0x32, 0x94, 0x20, 0xf0, 0x70, 0x46, 0x41, 0x48, + 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x30, 0xb1, 0x42, 0x49, 0x09, 0xeb, + 0x49, 0x00, 0x01, 0xeb, 0x00, 0x10, 0x80, 0x8c, 0x48, 0xbb, 0x3b, 0x48, + 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x30, 0xb1, 0x3c, 0x49, 0x09, 0xeb, + 0x49, 0x00, 0x01, 0xeb, 0x00, 0x10, 0x80, 0x68, 0xe8, 0xb9, 0x3a, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x18, 0xb1, 0x39, 0x48, 0x00, 0x68, 0x86, 0x42, + 0x15, 0xd8, 0xd4, 0xf8, 0xa0, 0x04, 0x82, 0x45, 0x03, 0xd9, 0x20, 0x46, + 0xde, 0xf7, 0x1e, 0xf9, 0x68, 0xb9, 0x40, 0xf2, 0x71, 0x20, 0x39, 0x46, + 0x70, 0x43, 0x42, 0x08, 0x20, 0x46, 0xff, 0xf7, 0xcb, 0xfe, 0x20, 0xb9, + 0x58, 0x48, 0xb0, 0xf8, 0x3c, 0x01, 0xc0, 0x04, 0xa1, 0xd5, 0x2c, 0x48, + 0x01, 0x68, 0x8e, 0x42, 0x88, 0xbf, 0x06, 0x60, 0x94, 0xf8, 0xf3, 0x04, + 0xd0, 0xb9, 0x50, 0x46, 0xd2, 0xf7, 0xee, 0xfe, 0x06, 0x46, 0xd4, 0xf8, + 0xa0, 0x04, 0xd2, 0xf7, 0xe9, 0xfe, 0x01, 0x46, 0x30, 0x46, 0xd2, 0xf7, + 0xeb, 0xfe, 0x23, 0x49, 0xd2, 0xf7, 0xdc, 0xfe, 0x01, 0x46, 0x94, 0xf8, + 0x32, 0x04, 0x21, 0x4e, 0x00, 0xeb, 0x40, 0x05, 0x56, 0xf8, 0x25, 0x00, + 0xd2, 0xf7, 0xd2, 0xfe, 0x46, 0xf8, 0x25, 0x00, 0xb4, 0xf8, 0x82, 0x00, + 0x17, 0x4b, 0x09, 0xeb, 0x49, 0x02, 0xb2, 0x49, 0x00, 0x26, 0x40, 0xf0, + 0x40, 0x00, 0x03, 0xeb, 0x02, 0x15, 0xa4, 0xf8, 0x82, 0x00, 0x94, 0xf8, + 0x35, 0x01, 0xea, 0x68, 0xeb, 0x6a, 0x00, 0xeb, 0x40, 0x00, 0x1a, 0x44, + 0x01, 0xeb, 0x40, 0x10, 0x81, 0x6a, 0x11, 0x44, 0x00, 0x22, 0x81, 0x62, + 0x10, 0x48, 0x21, 0x46, 0x03, 0x68, 0x02, 0x98, 0x98, 0x47, 0x0f, 0x48, + 0xee, 0x62, 0xae, 0x84, 0xc5, 0xe9, 0x02, 0x66, 0x81, 0x79, 0x41, 0xf0, + 0x08, 0x01, 0x81, 0x71, 0xbd, 0xe8, 0xfe, 0x8f, 0x54, 0x9d, 0x08, 0x00, + 0x78, 0xcf, 0x08, 0x00, 0x58, 0x9d, 0x08, 0x00, 0x50, 0xcf, 0x08, 0x00, + 0x4c, 0x49, 0x01, 0x00, 0x74, 0xcf, 0x08, 0x00, 0xe0, 0x77, 0x01, 0x00, + 0x00, 0x00, 0x80, 0xbf, 0x10, 0x5e, 0x01, 0x00, 0x5c, 0xcf, 0x08, 0x00, + 0xe0, 0x76, 0x01, 0x00, 0x2d, 0xe9, 0xf0, 0x41, 0xdf, 0xf8, 0x68, 0x80, + 0x80, 0x21, 0x40, 0x46, 0xd2, 0xf7, 0x5e, 0xfe, 0x18, 0x4c, 0x65, 0x69, + 0x28, 0x46, 0x00, 0xf0, 0xf3, 0xfc, 0x06, 0x46, 0x40, 0x46, 0x7f, 0x21, + 0x2a, 0x46, 0xf7, 0xb2, 0x00, 0xf8, 0x01, 0x6b, 0x3b, 0x46, 0xd0, 0xf7, + 0xbb, 0xfc, 0x12, 0x4d, 0x58, 0xfa, 0x86, 0xf6, 0x28, 0x46, 0x00, 0xf0, + 0xe3, 0xfc, 0x72, 0x1c, 0xc3, 0xb2, 0xc7, 0xf1, 0x7f, 0x01, 0x10, 0x46, + 0x2a, 0x46, 0xd0, 0xf7, 0xad, 0xfc, 0x65, 0x69, 0xc4, 0xf8, 0x14, 0x80, + 0x00, 0xf0, 0xdc, 0xfc, 0x8a, 0x48, 0x65, 0x61, 0x08, 0x4a, 0x00, 0x21, + 0x48, 0x23, 0x04, 0x68, 0x40, 0xf2, 0x35, 0x70, 0xa0, 0x47, 0x06, 0x48, + 0x00, 0x68, 0xbd, 0xe8, 0xf0, 0x41, 0x00, 0x47, 0xf4, 0xf9, 0x05, 0x00, + 0xe0, 0xfe, 0x00, 0x00, 0x8c, 0x2c, 0x06, 0x00, 0xe4, 0xfe, 0x05, 0x00, + 0x8c, 0x8e, 0x08, 0x00, 0x03, 0x49, 0xb1, 0xf8, 0x3c, 0x11, 0x49, 0x04, + 0x48, 0xbf, 0x00, 0xf0, 0xc3, 0xbc, 0x70, 0x47, 0x8c, 0x7e, 0x08, 0x00, + 0x2d, 0xe9, 0xff, 0x41, 0x15, 0x46, 0x0e, 0x46, 0x80, 0xb3, 0x04, 0x46, + 0xa6, 0xb9, 0x94, 0xf8, 0x74, 0x00, 0xa8, 0x42, 0x10, 0xd0, 0x67, 0x48, + 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x66, 0x48, 0x00, 0x68, 0x80, 0x47, + 0xd0, 0xf7, 0x6c, 0xfc, 0x94, 0xf8, 0x35, 0x11, 0x63, 0x4a, 0x01, 0xeb, + 0x41, 0x01, 0x02, 0xeb, 0x41, 0x11, 0x48, 0x65, 0x94, 0xf8, 0x74, 0x00, + 0xa8, 0x42, 0x19, 0xd0, 0x20, 0x46, 0x31, 0x46, 0xd5, 0xf7, 0xc0, 0xfd, + 0x5d, 0x48, 0x31, 0x46, 0x2a, 0x46, 0x03, 0x68, 0x20, 0x46, 0x98, 0x47, + 0x94, 0xf8, 0x35, 0x01, 0x94, 0xf8, 0xdd, 0x14, 0x8d, 0xf8, 0x02, 0x60, + 0xad, 0xf8, 0x00, 0x00, 0x48, 0x07, 0x07, 0xd4, 0x00, 0x20, 0x0a, 0xe0, + 0x80, 0x2e, 0x08, 0xbf, 0x00, 0x2d, 0x35, 0xd0, 0xbd, 0xe8, 0xff, 0x81, + 0x52, 0x48, 0x08, 0x22, 0x80, 0x78, 0x02, 0xea, 0x40, 0x00, 0x94, 0xf8, + 0xe2, 0x24, 0x8d, 0xf8, 0x03, 0x00, 0xdf, 0xf8, 0x3c, 0x81, 0x53, 0x07, + 0x51, 0xbf, 0x00, 0x23, 0x4b, 0x4b, 0xdb, 0x79, 0x03, 0xf0, 0x04, 0x03, + 0x94, 0xf8, 0x75, 0x50, 0x94, 0xf8, 0x76, 0x60, 0x18, 0x43, 0x98, 0xf8, + 0xd5, 0x72, 0x73, 0x1b, 0xb3, 0xfa, 0x83, 0xf3, 0x5b, 0x09, 0x40, 0xea, + 0x43, 0x00, 0x45, 0x4b, 0x8d, 0xf8, 0x03, 0x00, 0x1b, 0x78, 0xbb, 0x42, + 0x28, 0xd9, 0x98, 0xf8, 0xd4, 0x32, 0x2b, 0xb3, 0x41, 0x4b, 0x94, 0xf8, + 0xdd, 0xc3, 0x1b, 0x78, 0x8b, 0xb1, 0x00, 0x23, 0xbc, 0xf1, 0x02, 0x0f, + 0x1d, 0xd0, 0xae, 0x42, 0x11, 0xd1, 0x1a, 0xe0, 0x40, 0x4a, 0x42, 0x49, + 0x50, 0x89, 0x0b, 0x88, 0x83, 0x42, 0x4c, 0xd1, 0x92, 0x89, 0x4b, 0x88, + 0x93, 0x42, 0xbf, 0xd0, 0x48, 0xe0, 0x00, 0x23, 0xae, 0x42, 0x0c, 0xd0, + 0xbc, 0xf1, 0x01, 0x0f, 0x09, 0xd1, 0x11, 0x43, 0x49, 0x07, 0x05, 0xd5, + 0xbe, 0x42, 0x03, 0xd9, 0x31, 0x49, 0x09, 0x78, 0x01, 0x29, 0x49, 0xd1, + 0x00, 0x23, 0x18, 0x43, 0x8d, 0xf8, 0x03, 0x00, 0x2f, 0x48, 0x01, 0x68, + 0x20, 0x46, 0x88, 0x47, 0x8d, 0xf8, 0x04, 0x00, 0x94, 0xf8, 0x76, 0x00, + 0x2c, 0x4d, 0x94, 0xf8, 0x74, 0x10, 0x8d, 0xf8, 0x05, 0x00, 0x98, 0xf8, + 0xd5, 0x02, 0x2a, 0x68, 0x8d, 0xf8, 0x07, 0x10, 0x8d, 0xf8, 0x06, 0x00, + 0x00, 0x20, 0x90, 0x47, 0x2a, 0x68, 0x94, 0xf8, 0x74, 0x10, 0x8d, 0xf8, + 0x08, 0x00, 0x01, 0x20, 0x90, 0x47, 0x8d, 0xf8, 0x09, 0x00, 0x22, 0x48, + 0x10, 0xf8, 0x0a, 0x1f, 0x8d, 0xf8, 0x0a, 0x10, 0x94, 0xf8, 0x3a, 0x10, + 0x80, 0x78, 0x8d, 0xf8, 0x0c, 0x10, 0x8d, 0xf8, 0x0b, 0x00, 0x1d, 0x48, + 0x6a, 0x46, 0x00, 0x21, 0x0e, 0x23, 0x04, 0x68, 0x40, 0xf2, 0x3b, 0x20, + 0xa0, 0x47, 0xbd, 0xe8, 0xff, 0x81, 0x92, 0x89, 0x4a, 0x80, 0x08, 0x80, + 0x00, 0x21, 0x02, 0x91, 0xad, 0xf8, 0x0c, 0x10, 0x8d, 0xf8, 0x0a, 0x00, + 0x88, 0x20, 0x00, 0x91, 0x01, 0x91, 0x8d, 0xf8, 0x0b, 0x20, 0x8d, 0xf8, + 0x02, 0x00, 0xe4, 0xe7, 0x0b, 0x49, 0x09, 0x78, 0x4b, 0x1e, 0x18, 0xbf, + 0x01, 0x23, 0xb0, 0xe7, 0x18, 0x9c, 0x08, 0x00, 0x7c, 0xca, 0x08, 0x00, + 0x54, 0xf1, 0x05, 0x00, 0xc8, 0xdc, 0x08, 0x00, 0xa8, 0x52, 0x01, 0x00, + 0xe8, 0x65, 0x08, 0x00, 0x6a, 0x34, 0x01, 0x00, 0xe0, 0x0e, 0x01, 0x00, + 0x54, 0x34, 0x01, 0x00, 0x63, 0x34, 0x01, 0x00, 0xcc, 0xdc, 0x08, 0x00, + 0xd4, 0xdc, 0x08, 0x00, 0x5c, 0xca, 0x01, 0x00, 0x78, 0x9b, 0x08, 0x00, + 0x44, 0xd4, 0x05, 0x00, 0xf8, 0xb5, 0x18, 0x4c, 0x18, 0x4d, 0x19, 0x4e, + 0x00, 0x22, 0x20, 0x88, 0x69, 0x8a, 0x23, 0x46, 0x08, 0x1a, 0xe9, 0x8a, + 0x20, 0x80, 0xa0, 0x88, 0x08, 0x1a, 0x69, 0x8b, 0xa0, 0x80, 0x60, 0x88, + 0x08, 0x1a, 0xe9, 0x8b, 0x60, 0x80, 0xe0, 0x88, 0x08, 0x1a, 0x31, 0x88, + 0xe0, 0x80, 0x20, 0x89, 0x08, 0x1a, 0x01, 0x21, 0x20, 0x81, 0x0e, 0x48, + 0x07, 0x68, 0x0a, 0x20, 0x00, 0x90, 0x40, 0xf2, 0x39, 0x60, 0xb8, 0x47, + 0x0b, 0x48, 0x12, 0x21, 0x00, 0x78, 0xd0, 0xf7, 0x6d, 0xfb, 0x68, 0x8a, + 0x20, 0x80, 0xe8, 0x8a, 0xa0, 0x80, 0x68, 0x8b, 0x60, 0x80, 0xe8, 0x8b, + 0xe0, 0x80, 0x30, 0x88, 0x20, 0x81, 0xf8, 0xbd, 0x74, 0xfa, 0x05, 0x00, + 0xc4, 0x79, 0x01, 0x00, 0x7e, 0xfa, 0x05, 0x00, 0xa0, 0xa0, 0x08, 0x00, + 0x66, 0x34, 0x01, 0x00, 0xf8, 0xb5, 0x90, 0xf8, 0x02, 0x12, 0x01, 0x29, + 0x88, 0xbf, 0xf8, 0xbd, 0x90, 0xf8, 0x35, 0x21, 0x66, 0x4c, 0x84, 0xf8, + 0x4e, 0x20, 0x66, 0x4a, 0x52, 0xf8, 0x21, 0x50, 0xb5, 0xf8, 0x4c, 0x10, + 0xaa, 0x7f, 0xb5, 0xf8, 0x4e, 0x70, 0xab, 0x6b, 0x2e, 0x6c, 0xa1, 0x85, + 0x95, 0xf8, 0x58, 0x10, 0x84, 0xf8, 0x45, 0x20, 0xaa, 0x69, 0x27, 0x86, + 0x84, 0xf8, 0x4a, 0x10, 0x95, 0xf8, 0x5a, 0x10, 0x84, 0xf8, 0x4c, 0x10, + 0x95, 0xf8, 0x35, 0x10, 0x84, 0xf8, 0x28, 0x10, 0x95, 0xf8, 0x37, 0x10, + 0x84, 0xf8, 0x48, 0x10, 0xa9, 0x79, 0x84, 0xf8, 0x44, 0x10, 0x29, 0x68, + 0xc4, 0xe9, 0x02, 0x31, 0xc4, 0xe9, 0x04, 0x26, 0xb5, 0xf8, 0x50, 0x10, + 0xe1, 0x85, 0xb5, 0xf8, 0x46, 0x10, 0x61, 0x86, 0x95, 0xf8, 0x5b, 0x10, + 0x84, 0xf8, 0x29, 0x10, 0x95, 0xf8, 0x59, 0x10, 0x84, 0xf8, 0x4d, 0x10, + 0xb5, 0xf8, 0x44, 0x10, 0x61, 0x85, 0xa9, 0x88, 0xa1, 0x84, 0xa9, 0x8b, + 0xe1, 0x84, 0x49, 0x49, 0x91, 0xf8, 0xb4, 0x26, 0x91, 0xf8, 0x30, 0x32, + 0x84, 0xf8, 0x52, 0x20, 0x91, 0xf8, 0x2f, 0x22, 0x91, 0xf8, 0x34, 0x12, + 0x84, 0xf8, 0x55, 0x30, 0x84, 0xf8, 0x53, 0x10, 0x95, 0xf8, 0x5d, 0x10, + 0x84, 0xf8, 0x54, 0x20, 0x84, 0xf8, 0x56, 0x10, 0x3f, 0x49, 0x09, 0x78, + 0x01, 0xf0, 0x01, 0x02, 0x84, 0xf8, 0x50, 0x20, 0xc1, 0xf3, 0x40, 0x01, + 0xd0, 0xf8, 0xd4, 0x00, 0x84, 0xf8, 0x51, 0x10, 0xd0, 0xf7, 0x46, 0xff, + 0x20, 0x60, 0x95, 0xf8, 0x36, 0x00, 0x29, 0x7d, 0x95, 0xf8, 0x2b, 0x20, + 0x95, 0xf8, 0x2c, 0x30, 0x84, 0xf8, 0x47, 0x00, 0x95, 0xf8, 0x5e, 0x00, + 0x84, 0xf8, 0x5c, 0x20, 0x84, 0xf8, 0x5a, 0x30, 0x84, 0xf8, 0x59, 0x10, + 0x05, 0xf1, 0x68, 0x02, 0x04, 0xf1, 0x18, 0x03, 0x84, 0xf8, 0x57, 0x00, + 0xe8, 0x7c, 0x84, 0xf8, 0x5b, 0x00, 0xe8, 0x89, 0xa0, 0x87, 0xe8, 0x8c, + 0xe0, 0x87, 0x07, 0xca, 0x07, 0xc3, 0x22, 0x46, 0xb5, 0xf8, 0x74, 0x00, + 0x95, 0xf8, 0x81, 0x10, 0x64, 0x23, 0xe0, 0x86, 0xb5, 0xf8, 0x76, 0x00, + 0x84, 0xf8, 0x5f, 0x10, 0x95, 0xf8, 0x82, 0x10, 0x20, 0x87, 0xb5, 0xf8, + 0x78, 0x00, 0x84, 0xf8, 0x60, 0x10, 0x95, 0xf8, 0x83, 0x10, 0x60, 0x87, + 0x95, 0xf8, 0x7e, 0x00, 0x84, 0xf8, 0x4b, 0x10, 0x95, 0xf8, 0x84, 0x10, + 0x84, 0xf8, 0x58, 0x00, 0x95, 0xf8, 0x7a, 0x00, 0x84, 0xf8, 0x61, 0x10, + 0x95, 0xf8, 0x34, 0x10, 0x84, 0xf8, 0x5d, 0x00, 0x95, 0xf8, 0x7b, 0x00, + 0x84, 0xf8, 0x4f, 0x10, 0x00, 0x21, 0x84, 0xf8, 0x5e, 0x00, 0x28, 0x8a, + 0xa4, 0xf8, 0x40, 0x00, 0x28, 0x8d, 0xa4, 0xf8, 0x42, 0x00, 0xb5, 0xf8, + 0x7c, 0x00, 0xa0, 0x86, 0x95, 0xf8, 0x7f, 0x00, 0x84, 0xf8, 0x49, 0x00, + 0x95, 0xf8, 0x80, 0x00, 0x84, 0xf8, 0x46, 0x00, 0x01, 0x30, 0x85, 0xf8, + 0x80, 0x00, 0x28, 0x6b, 0x60, 0x60, 0xce, 0x48, 0xd0, 0xf8, 0x00, 0xc0, + 0x40, 0xf2, 0x19, 0x60, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x40, 0x60, 0x47, + 0x10, 0x79, 0x01, 0x00, 0x20, 0x72, 0x01, 0x00, 0x38, 0x21, 0x01, 0x00, + 0xf2, 0xda, 0x05, 0x00, 0x2d, 0xe9, 0xf0, 0x41, 0x00, 0xf0, 0xb0, 0xfa, + 0xdf, 0xf8, 0x4c, 0x80, 0x00, 0x26, 0x00, 0x27, 0x58, 0xf8, 0x0c, 0x4b, + 0xf5, 0xb2, 0x29, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x23, 0xf8, 0x20, 0x46, + 0x29, 0x46, 0x00, 0xf0, 0x57, 0xf8, 0x20, 0x46, 0x29, 0x46, 0x00, 0xf0, + 0x9b, 0xf8, 0x01, 0x37, 0x01, 0x36, 0x17, 0x2f, 0xec, 0xd1, 0x09, 0x48, + 0x40, 0x88, 0x50, 0xb1, 0x08, 0x48, 0x07, 0x4a, 0x00, 0x21, 0x08, 0x23, + 0xd0, 0xf8, 0x00, 0xc0, 0x40, 0xf2, 0x4f, 0x60, 0xbd, 0xe8, 0xf0, 0x41, + 0x60, 0x47, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0xbf, 0xe8, 0x72, 0x01, 0x00, + 0xb6, 0xfc, 0x05, 0x00, 0xa8, 0x8e, 0x08, 0x00, 0x1c, 0xb5, 0x16, 0x29, + 0x32, 0xd8, 0x71, 0x4a, 0x01, 0xeb, 0x41, 0x03, 0x52, 0xf8, 0x23, 0x30, + 0x63, 0xb3, 0x01, 0xeb, 0x41, 0x01, 0x02, 0xeb, 0x81, 0x01, 0x09, 0x79, + 0x04, 0x29, 0x25, 0xd8, 0x01, 0x22, 0x02, 0xfa, 0x01, 0xf1, 0x11, 0xf0, + 0x1a, 0x0f, 0x1f, 0xd0, 0x90, 0xf8, 0x24, 0x11, 0x08, 0x29, 0x1b, 0xd0, + 0x90, 0xf8, 0x24, 0x11, 0xc1, 0xb1, 0xb0, 0xf8, 0x84, 0x10, 0x49, 0x07, + 0x14, 0xd5, 0x90, 0xf8, 0x3a, 0x10, 0x90, 0xf8, 0x35, 0x21, 0x80, 0x8f, + 0x01, 0xab, 0xad, 0xf8, 0x06, 0x00, 0xd4, 0x48, 0x8d, 0xf8, 0x04, 0x20, + 0x8d, 0xf8, 0x05, 0x10, 0x01, 0x21, 0x00, 0x22, 0x04, 0x68, 0x04, 0x20, + 0x00, 0x90, 0x40, 0xf2, 0x47, 0x60, 0xa0, 0x47, 0x1c, 0xbd, 0x00, 0xbf, + 0x7f, 0xb5, 0x22, 0x4a, 0x32, 0xf8, 0x31, 0x30, 0x00, 0x2b, 0x3d, 0xd0, + 0x16, 0x29, 0x17, 0xd8, 0x52, 0x4c, 0x01, 0xeb, 0x41, 0x03, 0x54, 0xf8, + 0x23, 0x50, 0x8d, 0xb1, 0x04, 0xeb, 0x83, 0x03, 0x1b, 0x79, 0x04, 0x2b, + 0x0c, 0xd8, 0x01, 0x24, 0x04, 0xfa, 0x03, 0xf3, 0x13, 0xf0, 0x1a, 0x0f, + 0x06, 0xd0, 0x90, 0xf8, 0x24, 0x31, 0x08, 0x2b, 0x26, 0xd0, 0x90, 0xf8, + 0x24, 0x01, 0x18, 0xb3, 0x02, 0xeb, 0xc1, 0x05, 0x02, 0xac, 0x08, 0x21, + 0x08, 0x23, 0x08, 0x26, 0x20, 0x46, 0x2a, 0x46, 0xd0, 0xf7, 0xe0, 0xf9, + 0x42, 0x48, 0x00, 0x22, 0x23, 0x46, 0x72, 0xb6, 0x01, 0x68, 0x49, 0x00, + 0x01, 0x31, 0x01, 0x60, 0x00, 0x21, 0x29, 0x80, 0x69, 0x80, 0xa9, 0x80, + 0xe9, 0x80, 0x01, 0x68, 0x49, 0x08, 0x01, 0x60, 0x01, 0x21, 0x00, 0x68, + 0x80, 0xf3, 0x10, 0x88, 0xad, 0x48, 0x00, 0x96, 0x05, 0x68, 0x40, 0xf2, + 0x56, 0x60, 0xa8, 0x47, 0x7f, 0xbd, 0x00, 0xbf, 0x80, 0xfa, 0x05, 0x00, + 0x70, 0xb5, 0x86, 0xb0, 0x16, 0x29, 0x39, 0xd8, 0x30, 0x4c, 0x01, 0xeb, + 0x41, 0x02, 0x54, 0xf8, 0x22, 0x30, 0x9b, 0xb3, 0x01, 0xeb, 0x41, 0x02, + 0x04, 0xeb, 0x82, 0x04, 0x24, 0x79, 0xe5, 0x1e, 0x02, 0x2d, 0x03, 0xd3, + 0x05, 0x2c, 0x2b, 0xd0, 0x01, 0x2c, 0x27, 0xd1, 0x29, 0x4c, 0x53, 0x01, + 0xe3, 0x58, 0x1b, 0xb3, 0x90, 0xf8, 0x24, 0x51, 0x08, 0x2d, 0x1f, 0xd0, + 0x90, 0xf8, 0x24, 0x01, 0xe0, 0xb1, 0x04, 0xeb, 0x42, 0x15, 0x01, 0xac, + 0xad, 0xf8, 0x04, 0x10, 0x9a, 0x1c, 0x12, 0x21, 0x12, 0x23, 0xa0, 0x1c, + 0xd0, 0xf7, 0x96, 0xf9, 0x1d, 0x4e, 0x12, 0x21, 0x72, 0xb6, 0x30, 0x68, + 0x40, 0x00, 0x01, 0x30, 0x30, 0x60, 0x28, 0x68, 0x02, 0x30, 0xd2, 0xf7, + 0xd3, 0xff, 0x30, 0x68, 0x40, 0x08, 0x30, 0x60, 0x30, 0x68, 0x80, 0xf3, + 0x10, 0x88, 0x1c, 0xe0, 0x06, 0xb0, 0x70, 0xbd, 0x03, 0xf5, 0xdd, 0x75, + 0x01, 0xac, 0xad, 0xf8, 0x04, 0x10, 0x12, 0x21, 0x12, 0x23, 0xa0, 0x1c, + 0x2a, 0x46, 0xd0, 0xf7, 0x77, 0xf9, 0x0e, 0x4e, 0x12, 0x21, 0x72, 0xb6, + 0x30, 0x68, 0x40, 0x00, 0x01, 0x30, 0x30, 0x60, 0x28, 0x46, 0xd2, 0xf7, + 0xb5, 0xff, 0x30, 0x68, 0x40, 0x08, 0x30, 0x60, 0x30, 0x68, 0x80, 0xf3, + 0x10, 0x88, 0x7b, 0x48, 0x01, 0x21, 0x00, 0x22, 0x23, 0x46, 0x05, 0x68, + 0x14, 0x20, 0x00, 0x90, 0x4f, 0xf4, 0xc9, 0x60, 0xa8, 0x47, 0xd7, 0xe7, + 0xe8, 0x72, 0x01, 0x00, 0x24, 0x36, 0x01, 0x00, 0x54, 0xf1, 0x05, 0x00, + 0xbf, 0xb5, 0x04, 0x46, 0x04, 0x29, 0x4f, 0xf0, 0x04, 0x05, 0x4f, 0xf0, + 0x04, 0x00, 0x38, 0xbf, 0x0d, 0x46, 0xcc, 0xb3, 0x04, 0xeb, 0xc5, 0x00, + 0x90, 0xf8, 0xbc, 0x03, 0x98, 0x42, 0x55, 0xd0, 0x94, 0xf8, 0x35, 0x01, + 0x8d, 0xf8, 0x06, 0x20, 0x8d, 0xf8, 0x08, 0x50, 0xad, 0xf8, 0x04, 0x00, + 0x27, 0x48, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0x26, 0x49, 0x00, 0x28, + 0x18, 0xbf, 0x01, 0x20, 0x0a, 0x23, 0x4a, 0x7a, 0x62, 0xf3, 0x82, 0x00, + 0x94, 0xf8, 0x4e, 0x23, 0x8d, 0xf8, 0x07, 0x00, 0x92, 0x07, 0x51, 0xbf, + 0x00, 0x22, 0x20, 0x4a, 0x12, 0x79, 0x02, 0xf0, 0x02, 0x02, 0x10, 0x43, + 0x04, 0x2d, 0x8d, 0xf8, 0x07, 0x00, 0xa8, 0xbf, 0x04, 0x25, 0x48, 0x19, + 0x01, 0xaa, 0x00, 0x21, 0x80, 0x7a, 0x8d, 0xf8, 0x09, 0x00, 0x04, 0xeb, + 0xc5, 0x00, 0x90, 0xf8, 0xbc, 0x03, 0x8d, 0xf8, 0x0a, 0x00, 0x16, 0x48, + 0x04, 0x68, 0x1e, 0xe0, 0x4f, 0xf6, 0xff, 0x71, 0x8d, 0xf8, 0x06, 0x20, + 0x8d, 0xf8, 0x0a, 0x30, 0x8d, 0xf8, 0x08, 0x50, 0x04, 0x2d, 0x01, 0xab, + 0xad, 0xf8, 0x04, 0x10, 0x0c, 0x49, 0x11, 0xf8, 0x09, 0x2f, 0x00, 0xea, + 0x82, 0x02, 0x8d, 0xf8, 0x07, 0x20, 0xb8, 0xbf, 0x28, 0x46, 0x00, 0x22, + 0x08, 0x44, 0x01, 0x21, 0x40, 0x78, 0x8d, 0xf8, 0x09, 0x00, 0x43, 0x48, + 0x04, 0x68, 0x0a, 0x20, 0x00, 0x90, 0x40, 0xf2, 0xfb, 0x20, 0xa0, 0x47, + 0xbf, 0xbd, 0x00, 0xbf, 0xe8, 0xc7, 0x08, 0x00, 0xcc, 0x2c, 0x06, 0x00, + 0x70, 0x52, 0x01, 0x00, 0x78, 0x9b, 0x08, 0x00, 0x10, 0xb5, 0x04, 0x46, + 0x00, 0xf0, 0x28, 0xf9, 0x00, 0xb1, 0x10, 0xbd, 0x0a, 0x48, 0x90, 0xf9, + 0x3c, 0x01, 0xb0, 0xf1, 0xff, 0x3f, 0xc4, 0xbf, 0x00, 0x20, 0x10, 0xbd, + 0xb4, 0xf8, 0x8e, 0x00, 0x07, 0x49, 0x01, 0x38, 0xa4, 0xf8, 0x8e, 0x00, + 0x04, 0x4c, 0x20, 0x68, 0xd2, 0xf7, 0x8c, 0xfa, 0x20, 0x60, 0x01, 0x20, + 0x10, 0xbd, 0x00, 0xbf, 0x8c, 0x7e, 0x08, 0x00, 0x34, 0x5e, 0x01, 0x00, + 0x00, 0x00, 0x80, 0xbf, 0x10, 0xb5, 0x88, 0xb0, 0x07, 0x91, 0x90, 0xf8, + 0x44, 0x10, 0x8d, 0xf8, 0x04, 0x10, 0xd0, 0xf8, 0x40, 0x12, 0x02, 0x91, + 0x90, 0xf8, 0xb0, 0x11, 0x8d, 0xf8, 0x05, 0x10, 0x90, 0xf8, 0xb2, 0x11, + 0x8d, 0xf8, 0x06, 0x10, 0x90, 0xf8, 0xb1, 0x11, 0x8d, 0xf8, 0x07, 0x10, + 0xd0, 0xf8, 0x34, 0x12, 0x04, 0x91, 0xd0, 0xe9, 0x93, 0x12, 0xcd, 0xe9, + 0x05, 0x21, 0xd0, 0xf8, 0xac, 0x01, 0xd9, 0xf7, 0x09, 0xfd, 0x03, 0x90, + 0x18, 0x48, 0x01, 0xab, 0x01, 0x21, 0x00, 0x22, 0x04, 0x68, 0x1c, 0x20, + 0x00, 0x90, 0x40, 0xf2, 0x4d, 0x60, 0xa0, 0x47, 0x03, 0x48, 0x12, 0x21, + 0x00, 0x78, 0xd0, 0xf7, 0x99, 0xf8, 0x08, 0xb0, 0x10, 0xbd, 0x00, 0xbf, + 0x66, 0x34, 0x01, 0x00, 0xb0, 0xb5, 0x9a, 0xb0, 0x04, 0x46, 0x00, 0xf0, + 0xd5, 0xf8, 0x01, 0xad, 0x04, 0xf1, 0x78, 0x02, 0x54, 0x21, 0x54, 0x23, + 0x28, 0x46, 0xd0, 0xf7, 0x81, 0xf8, 0x04, 0xf5, 0x15, 0x73, 0x16, 0xac, + 0x0f, 0xcb, 0x0f, 0xc4, 0x05, 0x48, 0x01, 0x21, 0x00, 0x22, 0x2b, 0x46, + 0x04, 0x68, 0x64, 0x20, 0x00, 0x90, 0x40, 0xf2, 0xfd, 0x60, 0xa0, 0x47, + 0x1a, 0xb0, 0xb0, 0xbd, 0xa0, 0xa0, 0x08, 0x00, 0xb0, 0xb5, 0x04, 0x46, + 0x88, 0xb3, 0xd4, 0xf8, 0xd4, 0x00, 0x70, 0xb3, 0x01, 0x7f, 0x04, 0x29, + 0x2b, 0xd8, 0x18, 0x4a, 0x52, 0xf8, 0x21, 0x10, 0x88, 0x42, 0x26, 0xd1, + 0x90, 0xf8, 0xe6, 0x10, 0x29, 0xb9, 0x90, 0xf8, 0xe7, 0x10, 0x11, 0xb9, + 0x90, 0xf8, 0xe8, 0x00, 0xe8, 0xb1, 0x94, 0xf8, 0xa4, 0x04, 0x41, 0x07, + 0x19, 0xd5, 0x00, 0x07, 0x17, 0xd4, 0x0f, 0x48, 0x00, 0x68, 0x41, 0x1c, + 0x13, 0xd0, 0xd4, 0xf8, 0xdc, 0x10, 0x08, 0x1a, 0xd4, 0xf8, 0xa0, 0x14, + 0x20, 0xf0, 0x70, 0x40, 0x88, 0x42, 0x0a, 0xd9, 0x09, 0x4d, 0x4f, 0xf0, + 0x7e, 0x51, 0x28, 0x68, 0xd2, 0xf7, 0xfc, 0xf9, 0x28, 0x60, 0x07, 0x48, + 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x20, 0x46, 0xbd, 0xe8, 0xb0, 0x40, + 0x00, 0xf0, 0x86, 0xb8, 0xfc, 0x73, 0x01, 0x00, 0xbc, 0x11, 0x01, 0x00, + 0x6c, 0xf0, 0x05, 0x00, 0x2c, 0xe5, 0x08, 0x00, 0x80, 0xb5, 0x00, 0xf0, + 0x81, 0xf8, 0x03, 0x48, 0x4f, 0x30, 0xbd, 0xe8, 0x80, 0x40, 0xf5, 0xf7, + 0xe9, 0xbe, 0x00, 0xbf, 0x20, 0x78, 0x01, 0x00, 0x10, 0x48, 0x11, 0x49, + 0x01, 0x60, 0x11, 0x48, 0x11, 0x49, 0x01, 0x60, 0x11, 0x48, 0x12, 0x49, + 0x01, 0x60, 0x12, 0x48, 0x12, 0x49, 0x01, 0x60, 0x12, 0x48, 0x13, 0x49, + 0x01, 0x60, 0x13, 0x48, 0x13, 0x49, 0x01, 0x60, 0x13, 0x48, 0x14, 0x49, + 0x01, 0x60, 0x14, 0x48, 0x14, 0x49, 0x01, 0x60, 0x14, 0x48, 0x15, 0x49, + 0x01, 0x60, 0x15, 0x48, 0x15, 0x49, 0x01, 0x60, 0x15, 0x48, 0x16, 0x49, + 0x01, 0x60, 0x70, 0x47, 0x9c, 0xc3, 0x08, 0x00, 0x25, 0x02, 0x05, 0x00, + 0x48, 0x9c, 0x08, 0x00, 0x15, 0x07, 0x05, 0x00, 0x28, 0xe3, 0x08, 0x00, + 0x69, 0x04, 0x05, 0x00, 0x3c, 0xc5, 0x08, 0x00, 0x7d, 0x06, 0x05, 0x00, + 0x90, 0xc3, 0x08, 0x00, 0x01, 0x07, 0x05, 0x00, 0x38, 0xc8, 0x08, 0x00, + 0x7d, 0x09, 0x05, 0x00, 0x8c, 0xca, 0x08, 0x00, 0x39, 0x0b, 0x05, 0x00, + 0x9c, 0xa2, 0x08, 0x00, 0x55, 0x0e, 0x05, 0x00, 0x94, 0xc3, 0x08, 0x00, + 0x05, 0x0f, 0x05, 0x00, 0xec, 0xe3, 0x08, 0x00, 0x45, 0x0f, 0x05, 0x00, + 0x84, 0xe7, 0x08, 0x00, 0xc9, 0x0f, 0x05, 0x00, 0x4b, 0xf2, 0x99, 0x7c, + 0xc1, 0xf2, 0x12, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4e, 0xf2, 0xd7, 0x1c, + 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4d, 0xf6, 0x3d, 0x1c, + 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4d, 0xf2, 0xad, 0x7c, + 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4d, 0xf6, 0x03, 0x4c, + 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4d, 0xf6, 0x53, 0x0c, + 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4e, 0xf6, 0xdf, 0x6c, + 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4e, 0xf2, 0x39, 0x5c, + 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x40, 0xb1, 0xc1, 0x78, + 0x20, 0x29, 0x01, 0xd0, 0x10, 0x29, 0x01, 0xd1, 0x00, 0x21, 0x41, 0x71, + 0xd5, 0xf7, 0xca, 0xbd, 0x70, 0x47, 0x00, 0xbf, 0x01, 0x48, 0x02, 0x49, + 0x01, 0x60, 0x70, 0x47, 0x30, 0x9c, 0x08, 0x00, 0xdd, 0x10, 0x05, 0x00, + 0x04, 0x28, 0x18, 0xbf, 0x00, 0xf0, 0xfa, 0xb8, 0x00, 0x20, 0x70, 0x47, + 0x2d, 0xe9, 0xf8, 0x4f, 0xdf, 0xf8, 0x84, 0x90, 0xdf, 0xf8, 0x84, 0xa0, + 0x83, 0x46, 0x00, 0x26, 0x00, 0x25, 0x00, 0x24, 0xcd, 0xf8, 0x00, 0xe0, + 0x59, 0xf8, 0x24, 0x00, 0xa8, 0xb1, 0x01, 0x89, 0x59, 0x45, 0x0e, 0xd3, + 0x0a, 0xeb, 0x84, 0x08, 0x00, 0x2d, 0x08, 0xbf, 0x27, 0x46, 0x98, 0xf8, + 0x6c, 0x14, 0x01, 0xf0, 0x01, 0x01, 0xd4, 0xf7, 0xb5, 0xf8, 0x00, 0x2d, + 0x08, 0xbf, 0x01, 0x25, 0x30, 0xb9, 0x01, 0x34, 0x10, 0x36, 0x10, 0x2c, + 0xe6, 0xd1, 0x00, 0x20, 0xbd, 0xe8, 0xf8, 0x8f, 0x98, 0xf8, 0x6c, 0x14, + 0x09, 0x07, 0x05, 0xd5, 0x50, 0xf8, 0x08, 0x1c, 0x00, 0x9a, 0x09, 0x89, + 0x01, 0x44, 0x4a, 0x60, 0xf9, 0xb2, 0x8c, 0x42, 0xf0, 0xd0, 0x01, 0xf0, + 0x0f, 0x01, 0x0a, 0x4c, 0x41, 0xea, 0x06, 0x02, 0x07, 0x49, 0x0b, 0x78, + 0xe2, 0x54, 0x5a, 0x1c, 0x0a, 0x70, 0xd2, 0xb2, 0x32, 0x2a, 0xe3, 0xd3, + 0x00, 0x22, 0x0a, 0x70, 0xbd, 0xe8, 0xf8, 0x8f, 0x28, 0x8a, 0x01, 0x00, + 0x8c, 0x7e, 0x08, 0x00, 0x5c, 0xfb, 0x05, 0x00, 0x5d, 0xfb, 0x05, 0x00, + 0xb0, 0xb5, 0x20, 0x4d, 0x04, 0x46, 0x01, 0x88, 0x28, 0x68, 0x88, 0x42, + 0x06, 0xd2, 0x00, 0x20, 0xa4, 0x21, 0xd5, 0xf7, 0x7f, 0xfd, 0x20, 0x88, + 0x01, 0x46, 0x28, 0x60, 0x40, 0x1a, 0x28, 0x60, 0x20, 0x46, 0xbd, 0xe8, + 0xb0, 0x40, 0xf2, 0xf7, 0xcd, 0xb9, 0x00, 0xbf, 0xb0, 0xb5, 0x15, 0x4d, + 0x04, 0x46, 0x01, 0x88, 0x28, 0x68, 0x88, 0x42, 0x06, 0xd2, 0x00, 0x20, + 0xb5, 0x21, 0xd5, 0xf7, 0x69, 0xfd, 0x20, 0x88, 0x01, 0x46, 0x28, 0x60, + 0x40, 0x1a, 0x28, 0x60, 0x20, 0x46, 0xbd, 0xe8, 0xb0, 0x40, 0x00, 0xf0, + 0x85, 0xb8, 0x00, 0xbf, 0xb0, 0xb5, 0x0b, 0x4b, 0x09, 0x4d, 0x14, 0x46, + 0x2a, 0x68, 0xd3, 0xf8, 0xc4, 0x30, 0x9a, 0x1a, 0xa2, 0x42, 0x08, 0xd3, + 0x22, 0x46, 0x00, 0xf0, 0x7d, 0xf8, 0x20, 0xb1, 0x28, 0x68, 0x20, 0x44, + 0x28, 0x60, 0x01, 0x20, 0xb0, 0xbd, 0x00, 0x20, 0xb0, 0xbd, 0x00, 0xbf, + 0x08, 0xf0, 0x05, 0x00, 0xd0, 0x32, 0x06, 0x00, 0xf8, 0xb5, 0x16, 0x4e, + 0x74, 0x46, 0xb6, 0x45, 0x05, 0xd1, 0x15, 0x48, 0x00, 0x78, 0x05, 0x28, + 0x01, 0xd1, 0x00, 0x25, 0x1a, 0xe0, 0x13, 0x48, 0x13, 0x4f, 0x90, 0xf8, + 0xc4, 0x14, 0x07, 0xf1, 0x60, 0x00, 0x01, 0xf0, 0x01, 0x01, 0xd4, 0xf7, + 0x29, 0xf8, 0x05, 0x46, 0x30, 0xb9, 0x0f, 0x49, 0xb7, 0xf8, 0x68, 0x00, + 0x09, 0x68, 0x88, 0x47, 0x05, 0x46, 0x48, 0xb1, 0x08, 0x48, 0x01, 0x78, + 0x04, 0x29, 0x03, 0xd8, 0xb4, 0x42, 0x04, 0xbf, 0x01, 0x31, 0x01, 0x70, + 0x28, 0x46, 0xf8, 0xbd, 0x00, 0x20, 0xf0, 0x21, 0x00, 0x25, 0xd5, 0xf7, + 0x17, 0xfd, 0xf7, 0xe7, 0x0b, 0xec, 0x08, 0x10, 0x52, 0xf1, 0x05, 0x00, + 0x8c, 0x7e, 0x08, 0x00, 0x68, 0x8a, 0x01, 0x00, 0x4c, 0x9c, 0x08, 0x00, + 0x09, 0x48, 0x0a, 0x49, 0x01, 0x60, 0x0a, 0x48, 0x0a, 0x49, 0x01, 0x60, + 0x0a, 0x48, 0x0b, 0x49, 0x01, 0x60, 0x0b, 0x48, 0x0b, 0x49, 0x01, 0x60, + 0x0b, 0x48, 0x0c, 0x49, 0x01, 0x60, 0x0c, 0x48, 0x0c, 0x49, 0x01, 0x60, + 0x70, 0x47, 0x00, 0xbf, 0xd4, 0x9b, 0x08, 0x00, 0x11, 0x11, 0x05, 0x00, + 0xd0, 0xdb, 0x08, 0x00, 0x05, 0x11, 0x05, 0x00, 0x8c, 0xec, 0x08, 0x00, + 0xad, 0x11, 0x05, 0x00, 0xac, 0xec, 0x08, 0x00, 0xd9, 0x11, 0x05, 0x00, + 0xb0, 0xec, 0x08, 0x00, 0x05, 0x12, 0x05, 0x00, 0xe8, 0xb9, 0x08, 0x00, + 0x39, 0x12, 0x05, 0x00, 0x46, 0xf6, 0x69, 0x2c, 0xc1, 0xf2, 0x10, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x46, 0xf6, 0xa7, 0x2c, 0xc1, 0xf2, 0x10, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x46, 0xf6, 0xc3, 0x2c, 0xc1, 0xf2, 0x10, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x88, 0xb3, 0xf0, 0xb5, 0x89, 0xb0, 0x02, 0xac, + 0x0e, 0x46, 0x05, 0x46, 0x1c, 0x21, 0x1c, 0x27, 0x20, 0x46, 0xd2, 0xf7, + 0x07, 0xf8, 0x95, 0xf8, 0x35, 0x11, 0x68, 0x78, 0x05, 0xf5, 0x01, 0x72, + 0x10, 0x23, 0x8d, 0xf8, 0x10, 0x60, 0x8d, 0xf8, 0x08, 0x10, 0x95, 0xf8, + 0x5c, 0x12, 0x8d, 0xf8, 0x11, 0x00, 0x04, 0xf1, 0x0c, 0x00, 0x8d, 0xf8, + 0x09, 0x10, 0x95, 0xf8, 0x5d, 0x12, 0x8d, 0xf8, 0x0a, 0x10, 0xd5, 0xf8, + 0x58, 0x12, 0x03, 0x91, 0x10, 0x21, 0xcf, 0xf7, 0x57, 0xfe, 0x06, 0x48, + 0x01, 0x21, 0x00, 0x22, 0x23, 0x46, 0x00, 0x97, 0x05, 0x68, 0x40, 0xf2, + 0x31, 0x60, 0xa8, 0x47, 0x09, 0xb0, 0xbd, 0xe8, 0xf0, 0x40, 0x70, 0x47, + 0xa0, 0xa0, 0x08, 0x00, 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, + 0x6c, 0xea, 0x08, 0x00, 0x25, 0x13, 0x05, 0x00, 0x10, 0xb5, 0x04, 0x46, + 0x5a, 0x48, 0x90, 0xf8, 0x48, 0x15, 0x5a, 0x48, 0x00, 0xf5, 0x1c, 0x70, + 0x01, 0xf0, 0x01, 0x01, 0xd3, 0xf7, 0x7e, 0xff, 0x38, 0xb1, 0x01, 0x21, + 0x01, 0x71, 0x0e, 0x21, 0x41, 0x70, 0xd2, 0x21, 0x01, 0x70, 0x05, 0x21, + 0x21, 0x80, 0x10, 0xbd, 0x70, 0xb1, 0x80, 0xb5, 0x81, 0x70, 0x09, 0x0a, + 0xc1, 0x70, 0x06, 0x49, 0x18, 0x31, 0xd1, 0xf7, 0xf7, 0xff, 0x05, 0x48, + 0x15, 0x21, 0x00, 0x78, 0xbd, 0xe8, 0x80, 0x40, 0xcf, 0xf7, 0x20, 0xbe, + 0x70, 0x47, 0x00, 0xbf, 0x2c, 0xba, 0x01, 0x00, 0x66, 0x34, 0x01, 0x00, + 0x2d, 0xe9, 0xf8, 0x4f, 0xdf, 0xf8, 0x10, 0x91, 0x44, 0x49, 0x05, 0x46, + 0x99, 0xf8, 0xb0, 0x04, 0x01, 0xf1, 0x10, 0x06, 0x00, 0xf0, 0x01, 0x01, + 0x30, 0x46, 0xd3, 0xf7, 0x4f, 0xff, 0x00, 0x28, 0x5c, 0xd0, 0xdf, 0xf8, + 0xfc, 0xa0, 0x04, 0x46, 0x4f, 0xf0, 0x00, 0x0b, 0x4f, 0xf0, 0x00, 0x08, + 0x00, 0x27, 0x9a, 0xf8, 0x0b, 0x00, 0x10, 0xf0, 0x02, 0x00, 0x4f, 0xf0, + 0x01, 0x00, 0x08, 0xbf, 0x04, 0x20, 0xe0, 0x70, 0x6f, 0xf0, 0x2d, 0x00, + 0x08, 0xbf, 0x0c, 0x20, 0xa0, 0x70, 0x28, 0x88, 0x90, 0xb1, 0xf8, 0xb2, + 0x40, 0x00, 0x50, 0xfa, 0x87, 0xf0, 0x01, 0x37, 0x04, 0xeb, 0x40, 0x00, + 0x80, 0xf8, 0x05, 0xb0, 0x29, 0x78, 0x81, 0x71, 0x69, 0x78, 0xc1, 0x71, + 0xa9, 0x78, 0x01, 0x72, 0xe9, 0x78, 0x41, 0x72, 0x29, 0x79, 0x81, 0x72, + 0xf8, 0xb2, 0x29, 0x28, 0x24, 0xd3, 0x29, 0x48, 0xff, 0x21, 0x27, 0x71, + 0x03, 0x68, 0x07, 0xeb, 0x47, 0x00, 0x40, 0x00, 0x01, 0x30, 0x02, 0x30, + 0xc2, 0xb2, 0x20, 0x46, 0x98, 0x47, 0x20, 0x46, 0xd5, 0xf7, 0xf8, 0xfb, + 0x99, 0xf8, 0xb0, 0x04, 0x00, 0xf0, 0x01, 0x01, 0x30, 0x46, 0xd3, 0xf7, + 0x09, 0xff, 0x29, 0x3f, 0xc0, 0xb1, 0x04, 0x46, 0x9a, 0xf8, 0x0b, 0x00, + 0x80, 0x07, 0x03, 0xd4, 0x04, 0x20, 0xe0, 0x70, 0x0c, 0x20, 0x02, 0xe0, + 0x01, 0x20, 0xe0, 0x70, 0xd2, 0x20, 0xa0, 0x70, 0x08, 0xf1, 0x01, 0x08, + 0x06, 0x35, 0x0b, 0xf1, 0x01, 0x0b, 0xb8, 0xf1, 0x4f, 0x0f, 0xba, 0xd1, + 0x00, 0x25, 0x03, 0xe0, 0x07, 0x25, 0x18, 0xe0, 0x00, 0x24, 0x07, 0x25, + 0x38, 0x06, 0x10, 0xd0, 0x9c, 0xb1, 0x0e, 0x48, 0xff, 0x21, 0x27, 0x71, + 0x03, 0x68, 0x07, 0xeb, 0x47, 0x00, 0x40, 0x00, 0x01, 0x30, 0x02, 0x30, + 0xc2, 0xb2, 0x20, 0x46, 0x98, 0x47, 0x20, 0x46, 0xd5, 0xf7, 0xc2, 0xfb, + 0x03, 0xe0, 0x14, 0xb1, 0x20, 0x46, 0xd5, 0xf7, 0xf9, 0xfb, 0x28, 0x46, + 0xbd, 0xe8, 0xf8, 0x8f, 0x8c, 0x7e, 0x08, 0x00, 0x68, 0x8a, 0x01, 0x00, + 0x90, 0xfb, 0x05, 0x00, 0x04, 0xb8, 0x08, 0x00, 0x10, 0xb5, 0x6d, 0x4c, + 0xe1, 0x7a, 0xc9, 0x07, 0x03, 0xd1, 0x01, 0x28, 0x0a, 0xd0, 0x12, 0x21, + 0x2d, 0xe0, 0x41, 0x1e, 0x18, 0xbf, 0x12, 0x21, 0xa2, 0x7a, 0x82, 0x42, + 0x14, 0xbf, 0x0c, 0x21, 0x01, 0x28, 0x24, 0xd1, 0xa0, 0x72, 0x20, 0x68, + 0x30, 0xb9, 0x12, 0x48, 0x01, 0x68, 0x4f, 0xf4, 0xed, 0x70, 0x88, 0x47, + 0x20, 0x60, 0xc8, 0xb1, 0x60, 0x68, 0x28, 0xb1, 0xe0, 0x7a, 0x00, 0x21, + 0x40, 0xf0, 0x01, 0x00, 0xe0, 0x72, 0x12, 0xe0, 0xe0, 0x7a, 0x81, 0x07, + 0x07, 0xd5, 0x04, 0xf1, 0x08, 0x00, 0xff, 0xf7, 0x15, 0xff, 0x00, 0x28, + 0x60, 0x60, 0xef, 0xd1, 0xe0, 0x7a, 0x80, 0x07, 0xec, 0xd5, 0x20, 0x68, + 0xd5, 0xf7, 0xba, 0xfb, 0x00, 0x20, 0x20, 0x60, 0x07, 0x21, 0xc8, 0xb2, + 0x10, 0xbd, 0x00, 0xbf, 0x4c, 0x9c, 0x08, 0x00, 0xb0, 0xb5, 0x4f, 0x4c, + 0xe0, 0x7a, 0xc1, 0x07, 0x04, 0xbf, 0x00, 0x20, 0xb0, 0xbd, 0x00, 0xf0, + 0xfe, 0x01, 0x80, 0x07, 0xe1, 0x72, 0x15, 0xd5, 0x14, 0x4d, 0x72, 0xb6, + 0x28, 0x68, 0x40, 0x00, 0x01, 0x30, 0x28, 0x60, 0x20, 0x89, 0x01, 0x1f, + 0x08, 0x04, 0x05, 0xd0, 0x60, 0x68, 0x89, 0xb2, 0xff, 0xf7, 0x00, 0xff, + 0x00, 0x20, 0x60, 0x60, 0x28, 0x68, 0x40, 0x08, 0x28, 0x60, 0x28, 0x68, + 0x80, 0xf3, 0x10, 0x88, 0x20, 0x68, 0xff, 0xf7, 0x0b, 0xff, 0x08, 0x4d, + 0x04, 0x46, 0x72, 0xb6, 0x28, 0x68, 0x40, 0x00, 0x01, 0x30, 0x28, 0x60, + 0x00, 0xf0, 0x0a, 0xf8, 0x28, 0x68, 0x40, 0x08, 0x28, 0x60, 0x28, 0x68, + 0x80, 0xf3, 0x10, 0x88, 0x20, 0x46, 0xb0, 0xbd, 0x24, 0x36, 0x01, 0x00, + 0x10, 0xb5, 0x33, 0x4c, 0x60, 0x68, 0x08, 0xb1, 0xd5, 0xf7, 0x74, 0xfb, + 0x20, 0x68, 0x08, 0xb1, 0xd5, 0xf7, 0x70, 0xfb, 0x00, 0x20, 0xc4, 0xe9, + 0x00, 0x00, 0xa0, 0x60, 0x10, 0xbd, 0x00, 0xbf, 0xf8, 0xb5, 0x2b, 0x4c, + 0xe2, 0x7a, 0xd3, 0x07, 0x50, 0xd0, 0x4e, 0x28, 0x4e, 0xd8, 0x23, 0x68, + 0x83, 0xb3, 0x00, 0xeb, 0x40, 0x06, 0x4f, 0xf6, 0xff, 0x77, 0x33, 0xf8, + 0x16, 0x50, 0xbd, 0x42, 0x28, 0xd0, 0x03, 0xeb, 0x46, 0x06, 0x4d, 0xb9, + 0x01, 0x25, 0x35, 0x80, 0x00, 0xeb, 0x40, 0x05, 0x03, 0xeb, 0x45, 0x03, + 0x19, 0x71, 0xd9, 0x70, 0x99, 0x70, 0x1b, 0xe0, 0x01, 0x35, 0x35, 0x80, + 0x00, 0xeb, 0x40, 0x06, 0xad, 0xb2, 0x03, 0xeb, 0x46, 0x03, 0x1e, 0x46, + 0x16, 0xf9, 0x02, 0x7f, 0x8f, 0x42, 0xb8, 0xbf, 0x31, 0x70, 0x1e, 0x46, + 0x16, 0xf9, 0x03, 0x7f, 0x8f, 0x42, 0xc8, 0xbf, 0x31, 0x70, 0x93, 0xf9, + 0x04, 0x60, 0x96, 0xfb, 0xf5, 0xf7, 0x91, 0xfb, 0xf5, 0xf5, 0xf6, 0x1b, + 0x35, 0x44, 0x1d, 0x71, 0x92, 0x07, 0x19, 0xd5, 0x62, 0x68, 0xba, 0xb1, + 0x23, 0x89, 0x5d, 0x1c, 0x25, 0x81, 0xd0, 0x54, 0x20, 0x89, 0x42, 0x1c, + 0x22, 0x81, 0x62, 0x68, 0x11, 0x54, 0x40, 0xf2, 0x9a, 0x30, 0x21, 0x89, + 0x81, 0x42, 0x09, 0xd3, 0x04, 0x39, 0x60, 0x68, 0x89, 0xb2, 0xff, 0xf7, + 0x81, 0xfe, 0x04, 0xf1, 0x08, 0x00, 0xff, 0xf7, 0x67, 0xfe, 0x60, 0x60, + 0xf8, 0xbd, 0x00, 0xbf, 0x90, 0xfb, 0x05, 0x00, 0xb0, 0xb5, 0x68, 0xb1, + 0x0d, 0x46, 0x59, 0xb1, 0x29, 0x46, 0x04, 0x46, 0x00, 0xf0, 0x2e, 0xf8, + 0x28, 0x68, 0x00, 0xb3, 0x90, 0xf8, 0xb0, 0x15, 0x01, 0x29, 0x07, 0xd1, + 0x03, 0x21, 0x0a, 0xe0, 0x00, 0x20, 0x34, 0x21, 0xbd, 0xe8, 0xb0, 0x40, + 0xd5, 0xf7, 0xdc, 0xba, 0x00, 0x78, 0x01, 0x38, 0xb0, 0xfa, 0x80, 0xf0, + 0x41, 0x09, 0x08, 0x4a, 0x94, 0xf8, 0x40, 0x00, 0x12, 0x68, 0x90, 0x47, + 0x29, 0x68, 0x84, 0xf8, 0x40, 0x00, 0x94, 0xf8, 0x42, 0x00, 0x91, 0xf8, + 0x74, 0x10, 0x40, 0xea, 0x01, 0x10, 0x84, 0xf8, 0x42, 0x00, 0xb0, 0xbd, + 0x34, 0x9c, 0x08, 0x00, 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, + 0x10, 0xeb, 0x08, 0x00, 0xdd, 0x16, 0x05, 0x00, 0x4f, 0xf6, 0xbb, 0x2c, + 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x2d, 0xe9, 0xf0, 0x41, + 0x29, 0xb3, 0x20, 0xb3, 0x03, 0x78, 0x44, 0x78, 0x11, 0x2b, 0x04, 0xd0, + 0x09, 0x2b, 0x04, 0xd1, 0x01, 0x2c, 0x02, 0xd8, 0x1d, 0xe0, 0x04, 0x2c, + 0x1b, 0xd3, 0x16, 0x2c, 0x19, 0xd2, 0x02, 0x39, 0x54, 0x70, 0xb1, 0xfb, + 0xf4, 0xf1, 0x5f, 0xfa, 0x81, 0xf8, 0x11, 0x70, 0xb8, 0xf1, 0x00, 0x0f, + 0x0d, 0xd0, 0xd5, 0x1c, 0x86, 0x1c, 0x00, 0x27, 0x28, 0x46, 0x21, 0x46, + 0x32, 0x46, 0x23, 0x46, 0xcf, 0xf7, 0x42, 0xfc, 0x01, 0x37, 0x26, 0x44, + 0x16, 0x35, 0x47, 0x45, 0xf4, 0xd3, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0x20, + 0x10, 0x70, 0xbd, 0xe8, 0xf0, 0x81, 0xff, 0xf7, 0xcf, 0xbf, 0xff, 0xf7, + 0xfc, 0xbf, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, 0xc7, 0xb0, 0xcf, 0x4e, + 0x0f, 0x46, 0x04, 0xad, 0x10, 0x46, 0x2a, 0x46, 0x31, 0x68, 0x46, 0x91, + 0x19, 0x46, 0xff, 0xf7, 0xee, 0xff, 0x9d, 0xf8, 0x10, 0x00, 0x00, 0x22, + 0x00, 0x28, 0x50, 0xd0, 0x02, 0x97, 0x73, 0x4f, 0x04, 0x35, 0x00, 0x26, + 0x4f, 0xf0, 0x16, 0x0b, 0x4f, 0xf0, 0x02, 0x08, 0x39, 0x78, 0xca, 0xb2, + 0x2c, 0x78, 0x15, 0xf8, 0x01, 0x3c, 0x95, 0xf8, 0x01, 0x90, 0x95, 0xf8, + 0x02, 0xa0, 0x12, 0xfb, 0x0b, 0x72, 0x14, 0x75, 0x9d, 0xf8, 0x11, 0x40, + 0xd3, 0x74, 0x53, 0x1c, 0x82, 0xf8, 0x16, 0xa0, 0x82, 0xf8, 0x15, 0x90, + 0x07, 0x2c, 0x0b, 0xd3, 0x10, 0x20, 0x10, 0x21, 0x18, 0x70, 0x90, 0x1c, + 0xea, 0x1c, 0x10, 0x23, 0xcf, 0xf7, 0xfa, 0xfb, 0x39, 0x78, 0x9d, 0xf8, + 0x10, 0x00, 0x05, 0xe0, 0x83, 0xf8, 0x00, 0x80, 0xeb, 0x78, 0x2c, 0x79, + 0xd4, 0x70, 0x93, 0x70, 0x01, 0x36, 0x01, 0x31, 0x16, 0x35, 0x86, 0x42, + 0x39, 0x70, 0xd2, 0xd3, 0x49, 0xea, 0x0a, 0x20, 0x4f, 0xf6, 0xff, 0x72, + 0xaa, 0x4e, 0x02, 0x9f, 0x81, 0xb2, 0x91, 0x42, 0x4f, 0xf0, 0x00, 0x02, + 0x10, 0xd1, 0x00, 0x20, 0x0d, 0xf2, 0x01, 0x11, 0x8d, 0xf8, 0x01, 0x01, + 0xa8, 0x48, 0x02, 0x68, 0x38, 0x46, 0x90, 0x47, 0x1a, 0x48, 0x4e, 0x49, + 0x02, 0x68, 0x9d, 0xf8, 0x01, 0x01, 0x90, 0x47, 0x25, 0xe0, 0x00, 0x20, + 0x28, 0x21, 0x01, 0x30, 0x8d, 0xf8, 0x0f, 0x20, 0x3c, 0xaa, 0x0d, 0xf2, + 0x01, 0x13, 0x8d, 0xf8, 0xf2, 0x10, 0x02, 0x21, 0x80, 0xb2, 0xad, 0xf8, + 0xf0, 0x10, 0x11, 0x49, 0x0c, 0x68, 0x17, 0x21, 0x00, 0x91, 0x4f, 0xf6, + 0xff, 0x71, 0xa0, 0x47, 0x05, 0x46, 0x98, 0x48, 0x0d, 0xf1, 0x0f, 0x01, + 0x02, 0x68, 0x38, 0x46, 0x90, 0x47, 0x40, 0xb1, 0x01, 0x46, 0x95, 0x48, + 0x0d, 0xf2, 0x01, 0x12, 0x2b, 0x46, 0x04, 0x68, 0x9d, 0xf8, 0x0f, 0x00, + 0xa0, 0x47, 0x30, 0x68, 0x46, 0x99, 0x40, 0x1a, 0x04, 0xbf, 0x47, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0xd5, 0xf7, 0xde, 0xf9, 0x78, 0xf0, 0x08, 0x00, + 0xac, 0xf0, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x47, 0xba, 0xb0, 0x02, 0xad, + 0x88, 0x46, 0xde, 0x21, 0x1e, 0x46, 0x17, 0x46, 0x28, 0x46, 0xd1, 0xf7, + 0x25, 0xfd, 0x00, 0x24, 0x38, 0x46, 0x31, 0x46, 0x2a, 0x46, 0x8d, 0xf8, + 0x07, 0x40, 0xff, 0xf7, 0x52, 0xff, 0x26, 0x48, 0x04, 0x70, 0x9d, 0xf8, + 0x08, 0x00, 0xc0, 0xb3, 0x24, 0x4f, 0x25, 0x4c, 0x05, 0x35, 0x00, 0x26, + 0x4f, 0xf0, 0x02, 0x09, 0x4f, 0xf0, 0x10, 0x0a, 0x39, 0x78, 0x15, 0xf8, + 0x01, 0x3c, 0x15, 0xf8, 0x02, 0x2c, 0x01, 0xeb, 0x41, 0x01, 0x07, 0xeb, + 0xc1, 0x01, 0x0b, 0x76, 0x6b, 0x78, 0xca, 0x75, 0x2a, 0x78, 0x0b, 0x75, + 0xeb, 0x78, 0xca, 0x74, 0xaa, 0x78, 0x8b, 0x75, 0x9d, 0xf8, 0x09, 0x30, + 0x4a, 0x75, 0x4a, 0x1c, 0x08, 0x2b, 0x06, 0xd1, 0x82, 0xf8, 0x00, 0x90, + 0x2a, 0x79, 0x6b, 0x79, 0xcb, 0x70, 0x8a, 0x70, 0x09, 0xe0, 0x82, 0xf8, + 0x00, 0xa0, 0x88, 0x1c, 0x2a, 0x1d, 0x10, 0x21, 0x10, 0x23, 0xcf, 0xf7, + 0x55, 0xfb, 0x9d, 0xf8, 0x08, 0x00, 0x21, 0x78, 0x01, 0x36, 0x16, 0x35, + 0x86, 0x42, 0x01, 0xf1, 0x01, 0x01, 0x21, 0x70, 0xce, 0xd3, 0x61, 0x48, + 0x0d, 0xf1, 0x07, 0x01, 0x02, 0x68, 0x40, 0x46, 0x90, 0x47, 0x07, 0x48, + 0x04, 0x49, 0x02, 0x68, 0x9d, 0xf8, 0x07, 0x00, 0x90, 0x47, 0x3a, 0xb0, + 0xbd, 0xe8, 0xf0, 0x87, 0xd5, 0x9b, 0x01, 0x00, 0xac, 0x93, 0x01, 0x00, + 0xf0, 0x91, 0x01, 0x00, 0x7c, 0xf0, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, + 0xc7, 0xb0, 0xdf, 0xf8, 0x40, 0xa1, 0x03, 0xad, 0x0c, 0x46, 0xde, 0x21, + 0x1e, 0x46, 0x17, 0x46, 0xda, 0xf8, 0x00, 0x00, 0x46, 0x90, 0x28, 0x46, + 0xd1, 0xf7, 0xb8, 0xfc, 0x38, 0x46, 0x31, 0x46, 0x2a, 0x46, 0xff, 0xf7, + 0xe8, 0xfe, 0x9d, 0xf8, 0x0c, 0x00, 0x00, 0x28, 0x3e, 0xd0, 0x46, 0x4e, + 0x04, 0x35, 0x00, 0x27, 0x4f, 0xf0, 0x16, 0x0a, 0x4f, 0xf0, 0x02, 0x0b, + 0x01, 0x94, 0x31, 0x78, 0xca, 0xb2, 0x15, 0xf8, 0x01, 0x3c, 0x2c, 0x78, + 0x95, 0xf8, 0x02, 0x80, 0x95, 0xf8, 0x03, 0x90, 0x12, 0xfb, 0x0a, 0x62, + 0xd4, 0x74, 0x93, 0x74, 0x6b, 0x78, 0x9d, 0xf8, 0x0d, 0x40, 0x82, 0xf8, + 0x16, 0x90, 0x82, 0xf8, 0x15, 0x80, 0x13, 0x75, 0x53, 0x1c, 0x08, 0x2c, + 0x0b, 0xd3, 0x10, 0x20, 0x10, 0x21, 0x18, 0x70, 0x90, 0x1c, 0x2a, 0x1d, + 0x10, 0x23, 0xcf, 0xf7, 0xf3, 0xfa, 0x31, 0x78, 0x9d, 0xf8, 0x0c, 0x00, + 0x05, 0xe0, 0x83, 0xf8, 0x00, 0xb0, 0x2b, 0x79, 0x6c, 0x79, 0xd4, 0x70, + 0x93, 0x70, 0x01, 0x37, 0x01, 0x31, 0x16, 0x35, 0x87, 0x42, 0x31, 0x70, + 0xd0, 0xd3, 0x48, 0xea, 0x09, 0x20, 0xdf, 0xf8, 0xa0, 0xa0, 0x01, 0x9c, + 0x80, 0xb2, 0x00, 0xe0, 0x00, 0x20, 0x27, 0x49, 0x0d, 0x88, 0xa8, 0x42, + 0x2e, 0xd0, 0x46, 0x1c, 0xae, 0x42, 0x2b, 0xd2, 0x0d, 0xf1, 0xec, 0x09, + 0x17, 0x21, 0x4f, 0xf0, 0x17, 0x08, 0x48, 0x46, 0xd1, 0xf7, 0x60, 0xfc, + 0x28, 0x20, 0x41, 0xaa, 0x29, 0x46, 0x4b, 0x46, 0xcd, 0xf8, 0x00, 0x80, + 0x8d, 0xf8, 0x06, 0x01, 0x40, 0xf2, 0x02, 0x30, 0xad, 0xf8, 0x04, 0x01, + 0x00, 0x20, 0x8d, 0xf8, 0x0b, 0x00, 0x19, 0x48, 0x07, 0x68, 0xb0, 0xb2, + 0xb8, 0x47, 0xe8, 0xb1, 0x05, 0x46, 0x17, 0x48, 0x0d, 0xf1, 0x0b, 0x01, + 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0xa8, 0xb1, 0x01, 0x46, 0x14, 0x48, + 0x3b, 0xaa, 0x2b, 0x46, 0x06, 0x68, 0x00, 0x20, 0xb0, 0x47, 0x0d, 0xe0, + 0x00, 0x20, 0x3b, 0xa9, 0x8d, 0xf8, 0xec, 0x00, 0x0d, 0x48, 0x02, 0x68, + 0x20, 0x46, 0x90, 0x47, 0x0d, 0x48, 0x08, 0x49, 0x02, 0x68, 0x9d, 0xf8, + 0xec, 0x00, 0x90, 0x47, 0xda, 0xf8, 0x00, 0x00, 0x46, 0x99, 0x40, 0x1a, + 0x04, 0xbf, 0x47, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0xd5, 0xf7, 0xce, 0xf8, + 0x38, 0xec, 0x01, 0x00, 0x90, 0x95, 0x01, 0x00, 0x8e, 0x95, 0x01, 0x00, + 0xb0, 0xf0, 0x08, 0x00, 0x98, 0xf0, 0x08, 0x00, 0x9c, 0xf0, 0x08, 0x00, + 0x80, 0xf0, 0x08, 0x00, 0x04, 0x48, 0x05, 0x49, 0x01, 0x60, 0x05, 0x48, + 0x05, 0x49, 0x01, 0x60, 0x05, 0x48, 0x06, 0x49, 0x01, 0x60, 0x70, 0x47, + 0x0c, 0xf0, 0x08, 0x00, 0xe9, 0x18, 0x05, 0x00, 0x00, 0xf0, 0x08, 0x00, + 0xbd, 0x17, 0x05, 0x00, 0x10, 0xf0, 0x08, 0x00, 0xb9, 0x19, 0x05, 0x00, + 0x70, 0x47, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x43, 0x04, 0x46, 0x01, 0x01, + 0x35, 0x48, 0x45, 0x58, 0xe9, 0x88, 0xc9, 0x07, 0x50, 0xd1, 0x34, 0x49, + 0x91, 0xf8, 0x9c, 0x15, 0xc9, 0x07, 0x4b, 0xd1, 0x00, 0xeb, 0x04, 0x16, + 0x56, 0xf8, 0x04, 0x1f, 0x00, 0x29, 0x4a, 0xd0, 0xdf, 0xf8, 0xbc, 0x80, + 0xd8, 0xf8, 0x00, 0x00, 0x78, 0xb9, 0x2e, 0x48, 0x01, 0x68, 0x2c, 0x20, + 0x88, 0x47, 0xc8, 0xf8, 0x00, 0x00, 0xc8, 0xb3, 0x2b, 0x4a, 0x2c, 0x21, + 0x2c, 0x23, 0xcf, 0xf7, 0x45, 0xfa, 0xd8, 0xf8, 0x00, 0x00, 0x88, 0xb3, + 0x31, 0x68, 0x0e, 0x68, 0x4f, 0xf6, 0xff, 0x77, 0x31, 0x88, 0x61, 0xb1, + 0x31, 0x88, 0xb9, 0x42, 0x09, 0xd0, 0x00, 0x20, 0x6f, 0x21, 0x4f, 0xf0, + 0x00, 0x09, 0xd5, 0xf7, 0x83, 0xf8, 0xa6, 0xf8, 0x00, 0x90, 0xb8, 0xf8, + 0x00, 0x00, 0xe9, 0x88, 0x41, 0xf0, 0x01, 0x01, 0xe9, 0x80, 0x00, 0x21, + 0xb5, 0x80, 0xb7, 0x81, 0xb7, 0x82, 0xb1, 0x83, 0x30, 0x80, 0x31, 0x88, + 0xb9, 0x42, 0x05, 0xd1, 0x00, 0x20, 0x84, 0x21, 0xd5, 0xf7, 0x6e, 0xf8, + 0xb8, 0xf8, 0x00, 0x00, 0x31, 0x88, 0x80, 0xb2, 0x88, 0x42, 0x16, 0xd3, + 0x05, 0x21, 0x0a, 0x04, 0x0f, 0xd0, 0x32, 0x88, 0x01, 0x39, 0x90, 0x42, + 0xf9, 0xd2, 0x0e, 0xe0, 0x20, 0x46, 0xbd, 0xe8, 0xf8, 0x43, 0x00, 0xf0, + 0x3d, 0xb8, 0x00, 0x20, 0x5f, 0x21, 0xbd, 0xe8, 0xf8, 0x43, 0xd5, 0xf7, + 0x55, 0xb8, 0x00, 0x20, 0x84, 0x21, 0xd5, 0xf7, 0x51, 0xf8, 0xe8, 0x88, + 0xc0, 0x07, 0xfc, 0xd1, 0x00, 0x20, 0x30, 0x80, 0xea, 0xe7, 0x00, 0xbf, + 0x64, 0xaa, 0x01, 0x00, 0x8c, 0x7e, 0x08, 0x00, 0x9c, 0xfb, 0x05, 0x00, + 0xd4, 0x9c, 0x08, 0x00, 0x9c, 0x1c, 0x05, 0x00, 0x10, 0xb5, 0x07, 0x4b, + 0xb3, 0xf8, 0x5c, 0x40, 0xc4, 0x86, 0xb3, 0xf8, 0x5e, 0x40, 0x04, 0x87, + 0xb3, 0xf8, 0x5a, 0x30, 0x83, 0x80, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0xf0, + 0x19, 0xb8, 0x00, 0xbf, 0x40, 0x86, 0x08, 0x00, 0x03, 0x48, 0x04, 0x49, + 0x01, 0x60, 0x04, 0x48, 0x04, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0xf8, 0x9c, 0x08, 0x00, 0x41, 0x1c, 0x05, 0x00, 0xac, 0xf2, 0x08, 0x00, + 0x4d, 0x1b, 0x05, 0x00, 0x41, 0xf2, 0xfd, 0x6c, 0xc1, 0xf2, 0x11, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf2, 0x45, 0x6c, 0xc1, 0xf2, 0x11, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x84, 0x36, 0xa6, 0x10, 0x82, 0x02, 0xa6, 0x11, + 0x84, 0x37, 0xa6, 0x13, 0x84, 0x38, 0xa6, 0x14, 0x84, 0x39, 0xa6, 0x15, + 0xb6, 0x20, 0xa6, 0x12, 0xb6, 0x21, 0xa6, 0x1b, 0x0a, 0xa6, 0x1c, 0xc1, + 0xa6, 0x1d, 0x80, 0x03, 0xb5, 0x01, 0x1c, 0xc1, 0x88, 0x03, 0xc0, 0xc0, + 0x2d, 0xe9, 0xf0, 0x41, 0xb0, 0x4c, 0x20, 0x68, 0xd0, 0xb3, 0x01, 0x79, + 0x2f, 0x4a, 0x52, 0xf8, 0x21, 0x70, 0xf9, 0x88, 0xc9, 0x07, 0x4d, 0xd1, + 0x2d, 0x4d, 0x29, 0x68, 0x79, 0xb9, 0x2d, 0x48, 0x01, 0x68, 0x4f, 0xf4, + 0xd0, 0x70, 0x88, 0x47, 0x00, 0x28, 0x28, 0x60, 0x4b, 0xd0, 0x2a, 0x4a, + 0x4f, 0xf4, 0xd0, 0x71, 0x4f, 0xf4, 0xd0, 0x73, 0xcf, 0xf7, 0x8e, 0xf9, + 0x20, 0x68, 0x06, 0x68, 0x30, 0x88, 0x58, 0xb1, 0x4f, 0xf6, 0xff, 0x71, + 0x88, 0x42, 0x07, 0xd0, 0x00, 0x20, 0x87, 0x21, 0x4f, 0xf0, 0x00, 0x08, + 0xd4, 0xf7, 0xd0, 0xff, 0xa6, 0xf8, 0x00, 0x80, 0xf8, 0x88, 0x4f, 0xf6, + 0xff, 0x71, 0x40, 0xf0, 0x01, 0x00, 0xf8, 0x80, 0x00, 0x20, 0xb7, 0x80, + 0xb1, 0x81, 0xb1, 0x82, 0xb0, 0x83, 0x28, 0x68, 0x30, 0x80, 0x32, 0x88, + 0x8a, 0x42, 0x07, 0xd0, 0x80, 0xb2, 0x0a, 0xe0, 0x00, 0x20, 0x64, 0x21, + 0xbd, 0xe8, 0xf0, 0x41, 0xd4, 0xf7, 0xb6, 0xbf, 0x00, 0x20, 0x9d, 0x21, + 0xd4, 0xf7, 0xb2, 0xff, 0x28, 0x88, 0x31, 0x88, 0x88, 0x42, 0x0b, 0xd3, + 0x05, 0x21, 0x0a, 0x04, 0x04, 0xd0, 0x32, 0x88, 0x01, 0x39, 0x90, 0x42, + 0xf9, 0xd2, 0x03, 0xe0, 0x00, 0x20, 0x9d, 0x21, 0xd4, 0xf7, 0xa2, 0xff, + 0x09, 0x48, 0x01, 0x21, 0x03, 0x68, 0x20, 0x68, 0x02, 0x79, 0x01, 0x20, + 0xbd, 0xe8, 0xf0, 0x41, 0x18, 0x47, 0x00, 0x20, 0x7b, 0x21, 0xdb, 0xe7, + 0x54, 0xab, 0x01, 0x00, 0xa0, 0xfb, 0x05, 0x00, 0xd4, 0x9c, 0x08, 0x00, + 0xc0, 0x20, 0x05, 0x00, 0xec, 0x9c, 0x08, 0x00, 0x1c, 0xb5, 0x05, 0x9c, + 0x01, 0x94, 0x04, 0x9c, 0x00, 0x94, 0x00, 0xf0, 0x79, 0xf9, 0x04, 0x49, + 0x04, 0x4a, 0x0a, 0x60, 0x04, 0x49, 0x00, 0x22, 0x8a, 0x80, 0x4a, 0x80, + 0x0a, 0x80, 0x1c, 0xbd, 0x7c, 0xab, 0x01, 0x00, 0xc9, 0x1c, 0x05, 0x00, + 0x76, 0xe5, 0x05, 0x00, 0x2d, 0xe9, 0xfe, 0x4f, 0xdf, 0xf8, 0xb4, 0x91, + 0x80, 0x46, 0xd9, 0xf8, 0x00, 0x00, 0x00, 0x28, 0x00, 0xf0, 0xcc, 0x80, + 0x6a, 0x4d, 0x0f, 0x46, 0x00, 0x79, 0x92, 0x46, 0x69, 0x68, 0x01, 0x31, + 0x69, 0x60, 0x00, 0xf0, 0x5d, 0xf9, 0x04, 0x28, 0x28, 0x60, 0x15, 0xd3, + 0xa8, 0x68, 0x64, 0x4b, 0x00, 0x21, 0x00, 0x22, 0x01, 0x30, 0xa8, 0x60, + 0x6a, 0x48, 0x04, 0x68, 0x0c, 0x20, 0x00, 0x90, 0x40, 0xf6, 0x0d, 0x10, + 0xa0, 0x47, 0x69, 0x48, 0x01, 0x68, 0xd9, 0xf8, 0x00, 0x00, 0x00, 0x79, + 0x03, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, 0x08, 0x47, 0x5b, 0x48, 0x5a, 0x4c, + 0x51, 0x46, 0x00, 0x22, 0x03, 0x68, 0x94, 0xf8, 0x78, 0x50, 0x38, 0x46, + 0x98, 0x47, 0x05, 0xf0, 0x0f, 0x01, 0x02, 0x29, 0x56, 0x49, 0x08, 0xbf, + 0x50, 0x44, 0x86, 0xb2, 0x01, 0xf5, 0x96, 0x65, 0xb1, 0xf8, 0xb2, 0x14, + 0x8e, 0x42, 0x03, 0xd3, 0x00, 0x20, 0xf0, 0x21, 0xcf, 0xf7, 0xce, 0xf8, + 0x68, 0x8c, 0x86, 0x42, 0x03, 0xd9, 0x4f, 0x48, 0x29, 0x78, 0x10, 0x30, + 0x03, 0xe0, 0x4d, 0x48, 0x95, 0xf8, 0x20, 0x10, 0x90, 0x30, 0x01, 0xf0, + 0x01, 0x01, 0xd3, 0xf7, 0x1b, 0xfa, 0x83, 0x46, 0xd0, 0xb3, 0xba, 0xf1, + 0x00, 0x0f, 0x3e, 0xd0, 0x47, 0x48, 0x01, 0x68, 0x0a, 0xeb, 0x4a, 0x00, + 0x80, 0x00, 0x88, 0x47, 0x00, 0x28, 0x45, 0xd0, 0x81, 0x46, 0xa6, 0x46, + 0x00, 0xeb, 0x8a, 0x00, 0x00, 0x21, 0x4f, 0xf0, 0x02, 0x0c, 0x00, 0x23, + 0x00, 0x25, 0xec, 0xb2, 0x01, 0x33, 0x00, 0xeb, 0x81, 0x02, 0x3c, 0x5d, + 0x53, 0x45, 0x00, 0xf8, 0x21, 0x40, 0x57, 0xfa, 0x85, 0xf4, 0x5c, 0xfa, + 0x85, 0xf5, 0x64, 0x78, 0x07, 0xeb, 0x05, 0x06, 0x49, 0xf8, 0x11, 0x20, + 0x01, 0xf1, 0x02, 0x01, 0x56, 0x60, 0x25, 0x44, 0x54, 0x80, 0xe8, 0xd1, + 0x9e, 0xf8, 0x78, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x02, 0x28, 0x25, 0xd1, + 0x32, 0x48, 0xd9, 0xf8, 0x00, 0x20, 0x3f, 0x21, 0x04, 0x68, 0x00, 0x20, + 0xcd, 0xe9, 0x00, 0x00, 0x02, 0x90, 0x27, 0xe0, 0x00, 0x20, 0xfc, 0x21, + 0x03, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, 0xd4, 0xf7, 0xdd, 0xbe, 0x2b, 0x48, + 0x00, 0x22, 0x00, 0x23, 0x04, 0x68, 0x00, 0x20, 0x00, 0x90, 0x4f, 0xea, + 0xc8, 0x20, 0x00, 0xf5, 0x7f, 0x70, 0x81, 0xb2, 0x58, 0x46, 0xa0, 0x47, + 0x04, 0x46, 0x1a, 0xe0, 0x00, 0x20, 0x4f, 0xf4, 0x89, 0x71, 0xd4, 0xf7, + 0xc9, 0xfe, 0x29, 0xe0, 0x1e, 0x48, 0x4a, 0x46, 0x04, 0x68, 0x00, 0x20, + 0xcd, 0xe9, 0x00, 0x00, 0x02, 0x90, 0x4f, 0xea, 0x48, 0x20, 0x00, 0xf2, + 0xf9, 0x10, 0x81, 0xb2, 0x58, 0x46, 0x53, 0x46, 0xa0, 0x47, 0x04, 0x46, + 0x48, 0x46, 0xd4, 0xf7, 0xd3, 0xfe, 0xdf, 0xf8, 0x38, 0x90, 0x17, 0x48, + 0x03, 0x21, 0x00, 0x22, 0x5b, 0x46, 0x05, 0x68, 0x40, 0xf6, 0x14, 0x10, + 0x00, 0x94, 0xa8, 0x47, 0x13, 0x48, 0x59, 0x46, 0x22, 0x46, 0x03, 0x68, + 0xd9, 0xf8, 0x00, 0x00, 0x00, 0x79, 0x98, 0x47, 0x01, 0x28, 0x01, 0xd1, + 0xbd, 0xe8, 0xfe, 0x8f, 0x58, 0x46, 0xbd, 0xe8, 0xfe, 0x4f, 0xd4, 0xf7, + 0xb7, 0xbe, 0x00, 0xbf, 0xc0, 0xab, 0x01, 0x00, 0x8c, 0xab, 0x01, 0x00, + 0x40, 0x86, 0x08, 0x00, 0xb8, 0xaf, 0x08, 0x00, 0x8c, 0x7e, 0x08, 0x00, + 0x68, 0x8a, 0x01, 0x00, 0xd4, 0x9b, 0x08, 0x00, 0xbc, 0xaf, 0x08, 0x00, + 0xc0, 0xaf, 0x08, 0x00, 0xb4, 0xaf, 0x08, 0x00, 0xa0, 0xa0, 0x08, 0x00, + 0xd4, 0xaf, 0x08, 0x00, 0xd8, 0xaf, 0x08, 0x00, 0x2d, 0xe9, 0xf8, 0x43, + 0xdd, 0xe9, 0x08, 0x75, 0x0e, 0x46, 0xdd, 0xf8, 0x28, 0x90, 0xe9, 0x19, + 0xb1, 0x42, 0x0c, 0xd9, 0x90, 0x46, 0xbe, 0x42, 0x0e, 0xd9, 0xf4, 0x1b, + 0xc2, 0x19, 0x48, 0x46, 0x21, 0x46, 0x23, 0x46, 0xcf, 0xf7, 0x1a, 0xf8, + 0x27, 0x44, 0xa1, 0xb2, 0x05, 0xe0, 0xc2, 0x19, 0x48, 0x46, 0x29, 0x46, + 0x2b, 0x46, 0x07, 0xe0, 0x00, 0x21, 0xba, 0xb2, 0x09, 0xeb, 0x01, 0x00, + 0x69, 0x1a, 0x92, 0x1b, 0x0b, 0x46, 0x42, 0x44, 0x01, 0xb0, 0xbd, 0xe8, + 0xf0, 0x43, 0xcf, 0xf7, 0x05, 0xb8, 0x00, 0xbf, 0xbf, 0xb5, 0x04, 0x46, + 0x14, 0x48, 0x0d, 0xf1, 0x0e, 0x01, 0x01, 0xaa, 0x03, 0xab, 0x05, 0x68, + 0x02, 0xa8, 0xa8, 0x47, 0xbd, 0xf8, 0x0e, 0x00, 0xbd, 0xf8, 0x0c, 0x10, + 0x0a, 0x18, 0xa1, 0x1c, 0x8a, 0x42, 0x01, 0xd2, 0x00, 0x20, 0x14, 0xe0, + 0x81, 0x42, 0x03, 0xd9, 0x01, 0x9a, 0x21, 0x1a, 0x11, 0x44, 0x01, 0xe0, + 0x02, 0x99, 0x21, 0x44, 0x01, 0x31, 0xa0, 0x42, 0x09, 0x78, 0x02, 0xd9, + 0x02, 0x98, 0x20, 0x44, 0x02, 0xe0, 0x01, 0x9a, 0x20, 0x1a, 0x10, 0x44, + 0x00, 0x78, 0x40, 0xea, 0x01, 0x20, 0x04, 0xb0, 0xb0, 0xbd, 0x00, 0xbf, + 0x78, 0x9d, 0x08, 0x00, 0x03, 0x49, 0x09, 0x68, 0x09, 0xb1, 0xff, 0xf7, + 0xcd, 0xbf, 0x00, 0x20, 0x70, 0x47, 0x00, 0xbf, 0xc8, 0xab, 0x01, 0x00, + 0x03, 0x48, 0x04, 0x49, 0x01, 0x60, 0x04, 0x48, 0x04, 0x49, 0x01, 0x60, + 0x70, 0x47, 0x00, 0xbf, 0xe8, 0xc2, 0x08, 0x00, 0xd5, 0x1d, 0x05, 0x00, + 0x9c, 0xd4, 0x08, 0x00, 0xa9, 0x1d, 0x05, 0x00, 0x42, 0xf6, 0x0d, 0x4c, + 0xc1, 0xf2, 0x11, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x42, 0xf6, 0x25, 0x1c, + 0xc1, 0xf2, 0x11, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x84, 0x36, 0xa6, 0x10, + 0x82, 0x02, 0xa6, 0x11, 0x84, 0x37, 0xa6, 0x13, 0x84, 0x38, 0xa6, 0x14, + 0x84, 0x39, 0xa6, 0x15, 0x84, 0x3a, 0xa6, 0x12, 0x84, 0x3b, 0xa6, 0x1b, + 0x84, 0x3c, 0xa6, 0x1c, 0x0a, 0xa6, 0x16, 0xc1, 0xa6, 0x17, 0x8c, 0x3d, + 0x9a, 0x9a, 0xb4, 0x02, 0x10, 0x80, 0xa4, 0xfd, 0xa0, 0x10, 0x10, 0x01, + 0xa4, 0x10, 0xc1, 0xc1, 0xc0, 0x9a, 0xa3, 0x90, 0x8f, 0x00, 0xa0, 0xfe, + 0x20, 0x80, 0xbc, 0x45, 0x83, 0x13, 0x93, 0xc1, 0x8b, 0x13, 0x85, 0x3e, + 0x2f, 0x05, 0xbc, 0x47, 0xa3, 0xf0, 0xb9, 0x14, 0x80, 0x0d, 0x38, 0x02, + 0x88, 0x0d, 0xbd, 0xdc, 0x85, 0x3d, 0x27, 0x04, 0xe2, 0xcb, 0x27, 0x02, + 0xe2, 0x5e, 0x5a, 0x56, 0x2a, 0x03, 0xbc, 0x16, 0x83, 0x0e, 0x8b, 0x07, + 0x83, 0x1a, 0x93, 0xc1, 0x8b, 0x1a, 0xb4, 0x08, 0xa4, 0xff, 0x0f, 0xc1, + 0x8d, 0x3e, 0xbb, 0xb8, 0x80, 0x03, 0x10, 0x10, 0x88, 0x03, 0xd0, 0xc1, + 0xa0, 0xfc, 0xa4, 0xfc, 0x80, 0x03, 0xb5, 0x01, 0x1c, 0x88, 0x03, 0xc1, + 0xc0, 0x2f, 0x00, 0xc1, 0xbc, 0x18, 0xb3, 0xf7, 0x17, 0x82, 0x2e, 0xc1, + 0xbc, 0x0e, 0x83, 0x19, 0x93, 0x8b, 0x19, 0x0f, 0x93, 0x8d, 0x3e, 0x0f, + 0x8b, 0x16, 0xbb, 0x88, 0x2f, 0x01, 0xbc, 0x10, 0xb3, 0x41, 0x17, 0xef, + 0x2e, 0xbd, 0xc1, 0xc1, 0xb7, 0x02, 0x8d, 0x3e, 0xbb, 0x76, 0x2f, 0x02, + 0xbc, 0x52, 0x2a, 0x00, 0xe3, 0xbb, 0xb1, 0xc1, 0xb7, 0x03, 0x03, 0xc1, + 0x2f, 0x01, 0xbc, 0x0a, 0x80, 0x03, 0x10, 0x02, 0x88, 0x03, 0xbb, 0x9c, + 0x8a, 0x0c, 0x80, 0x07, 0x88, 0x0e, 0x0a, 0xc1, 0x8c, 0x3d, 0x86, 0x00, + 0xa3, 0xf0, 0xb8, 0x7c, 0x5e, 0x5e, 0xa3, 0x91, 0x4f, 0x16, 0xa3, 0xf0, + 0xb8, 0x72, 0x5e, 0x5e, 0xa3, 0xf0, 0xb8, 0x6c, 0x82, 0x0c, 0xa3, 0xf0, + 0xb8, 0x66, 0xb7, 0x03, 0x03, 0x2f, 0x00, 0xe5, 0x0a, 0xb7, 0x03, 0xc5, + 0xb6, 0x04, 0xb7, 0x04, 0x8c, 0x3d, 0x8d, 0x3e, 0xbb, 0x22, 0x2f, 0x03, + 0xbc, 0x18, 0x2a, 0x01, 0x8a, 0x15, 0x8a, 0x0b, 0xbc, 0x08, 0xb7, 0x04, + 0x8d, 0x3e, 0xbb, 0x10, 0x80, 0x03, 0x10, 0x04, 0x88, 0x03, 0xbb, 0x48, + 0x2f, 0x04, 0xbd, 0x48, 0x2a, 0x00, 0xbc, 0x0a, 0x80, 0x03, 0x10, 0x08, + 0x88, 0x03, 0xbb, 0x38, 0x85, 0x3d, 0x1f, 0x03, 0x22, 0x01, 0xe2, 0xc3, + 0x17, 0x02, 0x8d, 0x3d, 0xb7, 0x02, 0x33, 0x93, 0x1f, 0x01, 0x8b, 0x0d, + 0x81, 0x16, 0x80, 0x0d, 0x31, 0x89, 0x16, 0xc1, 0xa3, 0xf0, 0xc8, 0xc1, + 0xb7, 0x05, 0x8d, 0x3e, 0xba, 0xd2, 0x88, 0x0f, 0x89, 0x10, 0x8b, 0x11, + 0x85, 0x3d, 0x27, 0x01, 0xbc, 0x26, 0x80, 0x0e, 0x81, 0x06, 0x30, 0x02, + 0x2c, 0xe3, 0x80, 0x05, 0x81, 0x08, 0x2c, 0xc1, 0xbc, 0x10, 0x17, 0x01, + 0x8d, 0x3d, 0x80, 0x07, 0x88, 0x0e, 0x80, 0x09, 0x90, 0x88, 0x09, 0xc7, + 0x81, 0x0e, 0x7a, 0xc1, 0x88, 0x0e, 0x80, 0x0f, 0x81, 0x10, 0x83, 0x11, + 0xb8, 0x03, 0xc0, 0xc0, 0x52, 0x48, 0x53, 0x4a, 0x53, 0x4d, 0x54, 0x4c, + 0x01, 0x68, 0xc2, 0xf8, 0x58, 0x11, 0x01, 0x6a, 0xc2, 0xf8, 0x5c, 0x11, + 0x41, 0x6a, 0xc2, 0xf8, 0x60, 0x11, 0x81, 0x6a, 0xc2, 0xf8, 0x64, 0x11, + 0xc1, 0x6a, 0xc2, 0xf8, 0x68, 0x11, 0x01, 0x6b, 0xc2, 0xf8, 0x6c, 0x11, + 0x41, 0x6b, 0xc2, 0xf8, 0x70, 0x11, 0x80, 0x6b, 0xc2, 0xf8, 0x74, 0x01, + 0xef, 0xf3, 0x14, 0x80, 0x90, 0x64, 0xef, 0xf3, 0x10, 0x80, 0x50, 0x64, + 0x00, 0x20, 0x82, 0xf8, 0x7c, 0x01, 0xd5, 0xf8, 0x80, 0x0e, 0xc2, 0xf8, + 0x78, 0x01, 0x10, 0x6c, 0xa0, 0x60, 0x41, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x20, 0x61, 0x40, 0x48, 0x00, 0x68, 0x80, 0x47, 0xa0, 0x61, 0x3f, 0x4f, + 0xdf, 0xf8, 0xfc, 0x80, 0x40, 0x4e, 0x41, 0x4c, 0xe8, 0x69, 0x47, 0xf8, + 0x8c, 0x0f, 0x98, 0xf8, 0x2e, 0x01, 0x80, 0x06, 0x44, 0xbf, 0xd5, 0xf8, + 0x20, 0x01, 0xb8, 0x66, 0x39, 0x48, 0x01, 0x68, 0x21, 0xf4, 0x80, 0x61, + 0x01, 0x60, 0x01, 0x68, 0x41, 0xf4, 0x00, 0x71, 0x01, 0x60, 0x01, 0x68, + 0x41, 0xf4, 0x00, 0x61, 0x01, 0x60, 0x70, 0x69, 0x20, 0x60, 0x35, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x28, 0x68, 0x80, 0x07, 0x09, 0xd0, 0x68, 0x68, + 0x01, 0x21, 0x00, 0x22, 0x40, 0xf0, 0x01, 0x00, 0x68, 0x60, 0x30, 0x48, + 0x03, 0x68, 0x8d, 0x20, 0x98, 0x47, 0x2f, 0x48, 0x01, 0x68, 0xc9, 0x07, + 0x18, 0xd0, 0xc1, 0x68, 0xc9, 0x07, 0x0b, 0xd0, 0x41, 0x69, 0x82, 0x69, + 0x7a, 0x67, 0xc2, 0x69, 0xba, 0x67, 0x2a, 0x4a, 0x12, 0x68, 0xa7, 0xf8, + 0x80, 0x10, 0x01, 0x21, 0x62, 0x60, 0x01, 0x61, 0x01, 0x6a, 0x00, 0x22, + 0xf9, 0x67, 0x01, 0x21, 0x41, 0x60, 0x22, 0x48, 0x01, 0x21, 0x03, 0x68, + 0x8a, 0x20, 0x98, 0x47, 0xe8, 0x69, 0x40, 0x07, 0x08, 0xd5, 0x01, 0x20, + 0x01, 0x21, 0x00, 0x22, 0xc5, 0xf8, 0x78, 0x01, 0x1b, 0x48, 0x03, 0x68, + 0x9b, 0x20, 0x98, 0x47, 0x70, 0x69, 0xc0, 0x07, 0x0d, 0xd0, 0x30, 0x68, + 0x01, 0x21, 0x00, 0x22, 0x40, 0xf0, 0x02, 0x00, 0x30, 0x60, 0x01, 0x20, + 0x70, 0x61, 0x00, 0x20, 0xb0, 0x61, 0x13, 0x48, 0x03, 0x68, 0x8c, 0x20, + 0x98, 0x47, 0x98, 0xf8, 0x34, 0x03, 0x28, 0xb1, 0x0f, 0x48, 0x01, 0x21, + 0x00, 0x22, 0x03, 0x68, 0x84, 0x20, 0x98, 0x47, 0xfe, 0xe7, 0x00, 0xbf, + 0x04, 0xed, 0x00, 0xe0, 0x90, 0xfe, 0x01, 0x00, 0xa4, 0x11, 0x00, 0x40, + 0xe0, 0xfe, 0x00, 0x00, 0xcc, 0x9d, 0x08, 0x00, 0x84, 0x9c, 0x08, 0x00, + 0xf0, 0x2e, 0x01, 0x00, 0x8c, 0x7e, 0x08, 0x00, 0xb0, 0x50, 0x00, 0x30, + 0x04, 0x00, 0x03, 0x30, 0xa4, 0xfb, 0x05, 0x00, 0x64, 0xa0, 0x08, 0x00, + 0x60, 0xa0, 0x08, 0x00, 0x14, 0x30, 0x00, 0x40, 0xd0, 0x40, 0x05, 0x30, + 0x02, 0x48, 0x03, 0x49, 0xc0, 0xe9, 0x02, 0x11, 0x70, 0x47, 0x00, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x23, 0x05, 0x00, 0x04, 0x20, 0x71, 0x46, + 0x08, 0x42, 0x03, 0xd0, 0x01, 0x20, 0xef, 0xf3, 0x09, 0x82, 0x02, 0xe0, + 0x00, 0x20, 0xef, 0xf3, 0x08, 0x82, 0x0f, 0x49, 0x08, 0x65, 0x0b, 0x46, + 0x54, 0x33, 0x80, 0x33, 0x80, 0x33, 0x70, 0x46, 0x18, 0x60, 0x0b, 0x46, + 0x10, 0x33, 0xf0, 0xc3, 0x44, 0x46, 0x4d, 0x46, 0x56, 0x46, 0x5f, 0x46, + 0xf0, 0xc3, 0x64, 0x46, 0x10, 0xc3, 0xef, 0xf3, 0x08, 0x84, 0xef, 0xf3, + 0x09, 0x85, 0x56, 0x69, 0x97, 0x69, 0xf0, 0xc3, 0xd7, 0x69, 0x12, 0x1d, + 0x70, 0xca, 0xf0, 0xc1, 0xff, 0xf7, 0x08, 0xff, 0x90, 0xfe, 0x01, 0x00, + 0xf0, 0xb5, 0x3d, 0x4d, 0x95, 0xf8, 0x2f, 0x41, 0x64, 0x07, 0x53, 0xd5, + 0x3e, 0x4c, 0x00, 0x2b, 0x20, 0x60, 0x20, 0x46, 0x40, 0xf8, 0x04, 0x2f, + 0x4f, 0xf0, 0x00, 0x02, 0xc2, 0x80, 0x81, 0x80, 0x48, 0xd0, 0x59, 0xb3, + 0x01, 0x29, 0x43, 0xd1, 0xb9, 0x4b, 0x04, 0xf1, 0x0f, 0x01, 0x00, 0x22, + 0x40, 0xcb, 0x01, 0x32, 0x10, 0x2a, 0x77, 0x89, 0x21, 0xf8, 0x03, 0x7c, + 0xb6, 0x89, 0x21, 0xf8, 0x01, 0x6c, 0x01, 0xf1, 0x04, 0x01, 0xf3, 0xd1, + 0xcd, 0x49, 0x05, 0xf2, 0xac, 0x43, 0x00, 0x25, 0x01, 0xf1, 0x0d, 0x02, + 0x10, 0x21, 0x1e, 0x78, 0xf6, 0x07, 0x09, 0xd0, 0x8e, 0xb2, 0x32, 0xf8, + 0x03, 0x7c, 0x01, 0x31, 0x04, 0xeb, 0x86, 0x06, 0xb7, 0x81, 0x32, 0xf8, + 0x01, 0x7c, 0xf7, 0x81, 0x01, 0x35, 0x04, 0x33, 0x10, 0x32, 0x2e, 0x2d, + 0xed, 0xd1, 0x1a, 0xe0, 0xc0, 0x49, 0x05, 0xf2, 0xac, 0x43, 0x00, 0x25, + 0x01, 0xf1, 0x0d, 0x02, 0x00, 0x21, 0x1e, 0x78, 0xf6, 0x07, 0x09, 0xd1, + 0x8e, 0xb2, 0x32, 0xf8, 0x03, 0x7c, 0x01, 0x31, 0x04, 0xeb, 0x86, 0x06, + 0xb7, 0x81, 0x32, 0xf8, 0x01, 0x7c, 0xf7, 0x81, 0x01, 0x35, 0x04, 0x33, + 0x10, 0x32, 0x2e, 0x2d, 0xed, 0xd1, 0x00, 0xe0, 0x00, 0x21, 0xc1, 0x80, + 0xf0, 0xbd, 0x00, 0xbf, 0x1c, 0xb5, 0x0f, 0x48, 0x90, 0xf8, 0x2f, 0x01, + 0x40, 0x07, 0x17, 0xd5, 0x0d, 0x48, 0x0e, 0x49, 0x02, 0x68, 0x0b, 0x68, + 0xd2, 0x1a, 0x0d, 0x4b, 0x9a, 0x42, 0x0f, 0xd3, 0x00, 0x68, 0x0c, 0x4b, + 0x00, 0x22, 0x08, 0x60, 0x58, 0x89, 0x0c, 0x21, 0x01, 0xeb, 0x80, 0x00, + 0x09, 0x49, 0x80, 0xb2, 0x0c, 0x68, 0x00, 0x90, 0x40, 0xf2, 0x33, 0x70, + 0x00, 0x21, 0xa0, 0x47, 0x1c, 0xbd, 0x00, 0xbf, 0x8c, 0x7e, 0x08, 0x00, + 0x24, 0x20, 0x00, 0x40, 0xb0, 0xfc, 0x05, 0x00, 0xa0, 0x86, 0x01, 0x00, + 0xac, 0xfb, 0x05, 0x00, 0xa0, 0xa0, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x47, + 0xdf, 0xf8, 0xf4, 0x91, 0x05, 0x46, 0x99, 0x4c, 0x90, 0x46, 0x72, 0xb6, + 0xd9, 0xf8, 0x00, 0x00, 0x40, 0x00, 0x01, 0x30, 0xc9, 0xf8, 0x00, 0x00, + 0x04, 0xf5, 0xf8, 0x70, 0x85, 0x42, 0x04, 0xd0, 0x04, 0xf5, 0x00, 0x70, + 0x8a, 0x46, 0x85, 0x42, 0x01, 0xd1, 0x4f, 0xf0, 0x01, 0x0a, 0x2f, 0x68, + 0xff, 0xb1, 0x57, 0xf8, 0x08, 0x0c, 0x58, 0xb9, 0xe4, 0x4a, 0x28, 0x89, + 0x39, 0x5a, 0x12, 0x88, 0x91, 0x42, 0x05, 0xd1, 0xe2, 0x49, 0x38, 0x44, + 0x80, 0x78, 0x09, 0x78, 0x88, 0x42, 0x04, 0xd0, 0x00, 0x20, 0x40, 0xf2, + 0x03, 0x11, 0xce, 0xf7, 0x1d, 0xfd, 0x57, 0xf8, 0x04, 0x0c, 0x69, 0x7b, + 0x28, 0x60, 0xa8, 0x7a, 0x01, 0x38, 0xc2, 0xb2, 0xa8, 0x72, 0x8a, 0x42, + 0x6f, 0xd2, 0x68, 0x73, 0x6d, 0xe0, 0xe8, 0x7a, 0x00, 0x28, 0x00, 0xf0, + 0x95, 0x80, 0xa9, 0x7a, 0xae, 0x7b, 0x2f, 0x89, 0x81, 0x42, 0x04, 0xd0, + 0x00, 0x20, 0x40, 0xf2, 0x21, 0x11, 0xce, 0xf7, 0x03, 0xfd, 0xf0, 0x07, + 0x07, 0xf1, 0x03, 0x01, 0x4f, 0xf0, 0x10, 0x00, 0x21, 0xf0, 0x03, 0x01, + 0x08, 0xbf, 0x0c, 0x20, 0xba, 0xf1, 0x01, 0x0f, 0x08, 0x44, 0x13, 0xd0, + 0xba, 0xf1, 0x00, 0x0f, 0x2f, 0xd1, 0x55, 0x49, 0x80, 0xb2, 0x0b, 0x68, + 0x54, 0x49, 0x0a, 0x68, 0xd3, 0x1a, 0x83, 0x42, 0x30, 0xda, 0x28, 0x7b, + 0x40, 0xf2, 0x37, 0x11, 0x01, 0x30, 0x28, 0x73, 0x00, 0x20, 0xd4, 0xf7, + 0x45, 0xfb, 0x6c, 0xe0, 0x04, 0xf5, 0xc8, 0x71, 0x8d, 0x42, 0x45, 0xd0, + 0x48, 0x49, 0x0a, 0x68, 0xaa, 0x42, 0x1a, 0xd0, 0x4a, 0x68, 0xaa, 0x42, + 0x17, 0xd0, 0x8a, 0x68, 0xaa, 0x42, 0x14, 0xd0, 0xca, 0x68, 0xaa, 0x42, + 0x11, 0xd0, 0x0a, 0x69, 0xaa, 0x42, 0x0e, 0xd0, 0x4a, 0x69, 0xaa, 0x42, + 0x0b, 0xd0, 0x8a, 0x69, 0xaa, 0x42, 0x08, 0xd0, 0xc9, 0x69, 0xa9, 0x42, + 0x05, 0xd0, 0x3d, 0x49, 0x00, 0xe0, 0x3f, 0x49, 0x09, 0x68, 0x80, 0xb2, + 0x2e, 0xe0, 0x87, 0xb2, 0x38, 0x46, 0x00, 0xf0, 0x2f, 0xfd, 0x25, 0xe0, + 0x10, 0x1a, 0xaa, 0x4a, 0x2b, 0x89, 0x08, 0x60, 0xe9, 0x7a, 0x00, 0xf1, + 0x08, 0x07, 0xa8, 0x7a, 0x12, 0x88, 0x01, 0x39, 0x01, 0x38, 0xfa, 0x52, + 0xe9, 0x72, 0xf9, 0x18, 0xa4, 0x4b, 0x6a, 0x7b, 0xa8, 0x72, 0x1b, 0x78, + 0x8b, 0x70, 0xc1, 0xb2, 0x91, 0x42, 0xff, 0xf4, 0x90, 0xaf, 0x00, 0x20, + 0x47, 0xe9, 0x02, 0x50, 0xa8, 0x7b, 0xc0, 0x07, 0x39, 0xd0, 0x28, 0x89, + 0x38, 0x44, 0xc0, 0xf8, 0x04, 0x80, 0x34, 0xe0, 0x87, 0xb2, 0x38, 0x46, + 0x00, 0xf0, 0xe8, 0xfc, 0x20, 0xb9, 0x24, 0x48, 0x01, 0x68, 0x38, 0x46, + 0x88, 0x47, 0xa8, 0xb1, 0x94, 0x49, 0x2a, 0x89, 0x00, 0xf1, 0x08, 0x07, + 0xa8, 0x7a, 0x6b, 0x7b, 0x09, 0x88, 0x01, 0x38, 0xa8, 0x72, 0xb9, 0x52, + 0xe9, 0x7a, 0x01, 0x39, 0xe9, 0x72, 0xb9, 0x18, 0x8e, 0x4a, 0x12, 0x78, + 0x8a, 0x70, 0xc1, 0xb2, 0x99, 0x42, 0xff, 0xf4, 0x66, 0xaf, 0xd4, 0xe7, + 0x28, 0x7b, 0x01, 0x30, 0x28, 0x73, 0x19, 0x4c, 0x20, 0x78, 0x68, 0xb9, + 0xa8, 0x7b, 0x80, 0x07, 0x0a, 0xd5, 0xeb, 0x7a, 0x28, 0x46, 0x51, 0x46, + 0x42, 0x46, 0x00, 0x2b, 0x18, 0xbf, 0x01, 0x23, 0xff, 0xf7, 0x92, 0xfe, + 0x01, 0x20, 0x20, 0x70, 0x00, 0x27, 0xd9, 0xf8, 0x00, 0x00, 0x4f, 0xea, + 0x50, 0x00, 0xc9, 0xf8, 0x00, 0x00, 0xd9, 0xf8, 0x00, 0x00, 0x80, 0xf3, + 0x10, 0x88, 0x37, 0xb9, 0x0a, 0x4c, 0x20, 0x78, 0x18, 0xb1, 0xff, 0xf7, + 0xdb, 0xfe, 0x00, 0x20, 0x20, 0x70, 0x38, 0x46, 0xbd, 0xe8, 0xf0, 0x87, + 0x24, 0x36, 0x01, 0x00, 0x28, 0x8a, 0x01, 0x00, 0xdc, 0x9b, 0x08, 0x00, + 0x2c, 0x36, 0x01, 0x00, 0x30, 0x36, 0x01, 0x00, 0x6c, 0xfa, 0x08, 0x00, + 0xb4, 0xfc, 0x05, 0x00, 0xb0, 0xb5, 0x1c, 0x46, 0x12, 0x4b, 0x98, 0x42, + 0x0f, 0xd0, 0x12, 0x4b, 0x98, 0x42, 0x0c, 0xd0, 0x11, 0x4b, 0x03, 0xf5, + 0xe8, 0x75, 0xa8, 0x42, 0x07, 0xd0, 0x03, 0xf5, 0x04, 0x75, 0xa8, 0x42, + 0x03, 0xd0, 0x03, 0xf5, 0x18, 0x73, 0x98, 0x42, 0x01, 0xd1, 0x44, 0xf0, + 0x10, 0x04, 0x0a, 0x4b, 0x03, 0xf5, 0xa8, 0x73, 0x98, 0x42, 0x23, 0x46, + 0x08, 0xbf, 0x40, 0x21, 0x00, 0xf0, 0x32, 0xf9, 0xe1, 0x06, 0x03, 0xd5, + 0x81, 0x7b, 0x41, 0xf0, 0x02, 0x01, 0x81, 0x73, 0xb0, 0xbd, 0x00, 0xbf, + 0xa8, 0xab, 0x01, 0x00, 0x98, 0xab, 0x01, 0x00, 0x68, 0x8a, 0x01, 0x00, + 0xf8, 0xb5, 0x21, 0x4f, 0x00, 0x26, 0x84, 0x4d, 0x04, 0x46, 0x72, 0xb6, + 0x3e, 0x70, 0x28, 0x68, 0x40, 0x00, 0x01, 0x30, 0x28, 0x60, 0x1d, 0x48, + 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x1c, 0x49, 0x20, 0x01, 0x01, 0x22, + 0x08, 0x58, 0x1b, 0x49, 0x00, 0x78, 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, + 0xc0, 0x00, 0x10, 0xf8, 0x08, 0x1c, 0x50, 0xf8, 0x0c, 0x0c, 0x61, 0x1a, + 0x16, 0x4c, 0x02, 0xfa, 0x01, 0xf1, 0x02, 0x68, 0x22, 0xea, 0x01, 0x01, + 0x01, 0x60, 0x20, 0x78, 0x80, 0xb1, 0x38, 0x78, 0x98, 0xb1, 0x12, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x11, 0x49, 0x0a, 0x68, 0x10, 0x44, 0x08, 0x60, + 0x20, 0x78, 0x10, 0x49, 0x51, 0xf8, 0x30, 0x00, 0x0f, 0x49, 0x09, 0x68, + 0x88, 0x47, 0x04, 0xe0, 0x0e, 0x48, 0x00, 0x68, 0x80, 0x47, 0x0a, 0x48, + 0x06, 0x60, 0x28, 0x68, 0x40, 0x08, 0x28, 0x60, 0x28, 0x68, 0x80, 0xf3, + 0x10, 0x88, 0xf8, 0xbd, 0x41, 0xbe, 0x01, 0x00, 0xbc, 0x9c, 0x08, 0x00, + 0xc0, 0xf5, 0x08, 0x00, 0x30, 0xf5, 0x08, 0x00, 0x40, 0xbe, 0x01, 0x00, + 0xd0, 0x9c, 0x08, 0x00, 0x20, 0x36, 0x01, 0x00, 0xd0, 0xbb, 0x01, 0x00, + 0xc0, 0x9c, 0x08, 0x00, 0xc8, 0x9c, 0x08, 0x00, 0x2d, 0xe9, 0xf8, 0x43, + 0x00, 0x28, 0x44, 0xd0, 0x08, 0x9e, 0x00, 0x2e, 0x41, 0xd0, 0x03, 0x31, + 0x04, 0x46, 0x42, 0x73, 0x00, 0x20, 0x21, 0xf0, 0x03, 0x07, 0x99, 0x07, + 0xa2, 0x72, 0x20, 0x73, 0x60, 0x60, 0xc3, 0xf3, 0xc0, 0x05, 0x02, 0xea, + 0xe1, 0x71, 0xa5, 0x73, 0x27, 0x81, 0x52, 0x1a, 0x00, 0x29, 0xe2, 0x72, + 0x0a, 0x46, 0x18, 0xbf, 0x06, 0xf1, 0x08, 0x02, 0x22, 0x60, 0x91, 0xb3, + 0x07, 0xf1, 0x0c, 0x03, 0x4f, 0xf6, 0xfc, 0x76, 0xdf, 0xf8, 0x60, 0xc0, + 0xdf, 0xf8, 0x60, 0x80, 0x4f, 0xf0, 0x08, 0x0e, 0x03, 0xea, 0x06, 0x09, + 0xbc, 0xf8, 0x00, 0x60, 0xbb, 0xb2, 0xd6, 0x52, 0x02, 0xeb, 0x09, 0x06, + 0x12, 0xfa, 0x87, 0xf3, 0x42, 0xe9, 0x02, 0x06, 0x98, 0xf8, 0x00, 0x70, + 0x9f, 0x70, 0xeb, 0x07, 0x06, 0xd0, 0xbe, 0xf8, 0x00, 0x30, 0x13, 0x44, + 0xd8, 0x71, 0x98, 0x71, 0x58, 0x71, 0x18, 0x71, 0x01, 0x39, 0x0b, 0x06, + 0x0a, 0xd0, 0xa5, 0x7b, 0x27, 0x89, 0x32, 0x46, 0xe2, 0xe7, 0x00, 0x20, + 0x4f, 0xf4, 0x13, 0x71, 0x00, 0x24, 0xce, 0xf7, 0x6b, 0xfb, 0x02, 0xe0, + 0x00, 0x20, 0x42, 0xf8, 0x04, 0x0c, 0x20, 0x46, 0xbd, 0xe8, 0xf8, 0x83, + 0x2a, 0xba, 0x01, 0x00, 0x3e, 0xbe, 0x01, 0x00, 0x00, 0x28, 0x43, 0xd0, + 0x2d, 0xe9, 0xf0, 0x41, 0x05, 0x46, 0x50, 0xf8, 0x08, 0x0c, 0x90, 0x46, + 0x0c, 0x46, 0x06, 0x89, 0x20, 0xb9, 0x00, 0x20, 0x40, 0xf2, 0xaa, 0x21, + 0xce, 0xf7, 0x50, 0xfb, 0x21, 0x49, 0xa8, 0x5b, 0xaf, 0x19, 0x09, 0x88, + 0x88, 0x42, 0x04, 0xd0, 0x00, 0x20, 0x40, 0xf2, 0xad, 0x21, 0xce, 0xf7, + 0x45, 0xfb, 0x1d, 0x48, 0xb9, 0x78, 0x00, 0x78, 0x81, 0x42, 0x04, 0xd0, + 0x00, 0x20, 0x4f, 0xf4, 0x2c, 0x71, 0xce, 0xf7, 0x3b, 0xfb, 0x19, 0x48, + 0x00, 0x78, 0xb8, 0x70, 0x18, 0x4f, 0x72, 0xb6, 0x38, 0x68, 0x40, 0x00, + 0x01, 0x30, 0x38, 0x60, 0x20, 0x46, 0xc0, 0x47, 0xc8, 0xb1, 0x50, 0xf8, + 0x04, 0x1c, 0x45, 0xf8, 0x04, 0x1c, 0x61, 0x68, 0x40, 0xf8, 0x04, 0x5c, + 0x81, 0x42, 0x00, 0xd1, 0x65, 0x60, 0x20, 0x7a, 0x01, 0x30, 0x20, 0x72, + 0x38, 0x68, 0x40, 0x08, 0x38, 0x60, 0x38, 0x68, 0x80, 0xf3, 0x10, 0x88, + 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0x20, 0x40, 0xf2, 0xa5, 0x21, 0xd4, 0xf7, + 0x77, 0xb9, 0xd4, 0xe9, 0x00, 0x01, 0x25, 0x60, 0x00, 0x29, 0x45, 0xf8, + 0x04, 0x0c, 0xe8, 0xd1, 0xe6, 0xe7, 0x00, 0xbf, 0x2a, 0xba, 0x01, 0x00, + 0x3e, 0xbe, 0x01, 0x00, 0x3f, 0xbe, 0x01, 0x00, 0x24, 0x36, 0x01, 0x00, + 0x04, 0x48, 0x05, 0x49, 0x01, 0x60, 0x05, 0x48, 0x05, 0x49, 0x01, 0x60, + 0x05, 0x48, 0x06, 0x49, 0x01, 0x60, 0x70, 0x47, 0x10, 0xfa, 0x08, 0x00, + 0x65, 0x25, 0x05, 0x00, 0xd4, 0xdb, 0x08, 0x00, 0x7d, 0x27, 0x05, 0x00, + 0x30, 0x9d, 0x08, 0x00, 0xd9, 0x27, 0x05, 0x00, 0x49, 0xf6, 0x21, 0x3c, + 0xc1, 0xf2, 0x11, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x80, 0xb5, 0x09, 0x48, + 0x09, 0x4a, 0x01, 0x68, 0x92, 0xf8, 0x6d, 0x21, 0x6f, 0xea, 0x12, 0x12, + 0x52, 0x08, 0x62, 0xf3, 0x41, 0x01, 0x01, 0x60, 0x0a, 0xf0, 0x00, 0xf8, + 0x00, 0xf0, 0x10, 0xf8, 0xbd, 0xe8, 0x80, 0x40, 0xd8, 0xf7, 0x90, 0xbe, + 0xb8, 0x11, 0x00, 0x40, 0x50, 0xec, 0x01, 0x00, 0x01, 0x48, 0x02, 0x49, + 0x01, 0x60, 0x70, 0x47, 0x30, 0x9f, 0x08, 0x00, 0x2d, 0x2a, 0x05, 0x00, + 0x42, 0xf6, 0x21, 0x3c, 0xc1, 0xf2, 0x00, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x80, 0xb5, 0x18, 0x48, 0x90, 0xf8, 0x3c, 0x10, 0x11, 0xf0, 0x1e, 0x0f, + 0x19, 0xd1, 0x38, 0x30, 0x42, 0x78, 0x01, 0x78, 0x02, 0xf0, 0x03, 0x02, + 0x42, 0xea, 0x91, 0x11, 0x89, 0xb9, 0x41, 0x79, 0x80, 0x79, 0x00, 0xf0, + 0x01, 0x00, 0x40, 0xea, 0x51, 0x10, 0x50, 0xb9, 0x0e, 0x48, 0x85, 0x21, + 0xa0, 0xf8, 0x28, 0x11, 0x84, 0x21, 0xa0, 0xf8, 0x1a, 0x11, 0x42, 0xf2, + 0xa8, 0x31, 0xc0, 0xf8, 0x14, 0x11, 0x00, 0xf0, 0x87, 0xfa, 0x09, 0x48, + 0x01, 0x68, 0x30, 0x20, 0x88, 0x47, 0x08, 0x48, 0x08, 0x49, 0x02, 0x68, + 0x30, 0x20, 0x90, 0x47, 0x07, 0x48, 0x01, 0x68, 0x30, 0x20, 0xbd, 0xe8, + 0x80, 0x40, 0x08, 0x47, 0x50, 0xec, 0x01, 0x00, 0x8c, 0x7e, 0x08, 0x00, + 0xb4, 0x9c, 0x08, 0x00, 0xac, 0x9c, 0x08, 0x00, 0xf5, 0x2a, 0x05, 0x00, + 0xb0, 0x9c, 0x08, 0x00, 0x0a, 0x49, 0x0b, 0x48, 0x42, 0xf2, 0x30, 0x03, + 0x0a, 0x68, 0x1a, 0x42, 0x02, 0xd0, 0x42, 0x68, 0x01, 0x32, 0x42, 0x60, + 0x09, 0x68, 0x42, 0xf2, 0xb4, 0x02, 0x11, 0x42, 0x01, 0xd0, 0x00, 0xf0, + 0x61, 0xba, 0x01, 0x68, 0x01, 0x31, 0x01, 0x60, 0x00, 0xf0, 0x5c, 0xba, + 0x28, 0x40, 0x01, 0x30, 0xb0, 0xf0, 0x05, 0x00, 0x80, 0xb5, 0x00, 0xf0, + 0x5b, 0xfa, 0xe4, 0x48, 0xb0, 0xf8, 0x6c, 0x15, 0x49, 0x06, 0x03, 0xd5, + 0x90, 0xf8, 0x72, 0x05, 0xff, 0x28, 0x00, 0xd0, 0x80, 0xbd, 0x05, 0x48, + 0x00, 0x78, 0x00, 0x28, 0xfa, 0xd0, 0x04, 0x48, 0x04, 0x49, 0x00, 0x68, + 0x09, 0x68, 0xbd, 0xe8, 0x80, 0x40, 0x08, 0x47, 0x54, 0x3b, 0x01, 0x00, + 0x34, 0x02, 0x01, 0x00, 0x20, 0x9f, 0x08, 0x00, 0x05, 0x48, 0x01, 0x68, + 0x41, 0xf0, 0x18, 0x01, 0x01, 0x60, 0xd0, 0xf8, 0xe8, 0x10, 0x41, 0xf0, + 0x80, 0x71, 0xc0, 0xf8, 0xe8, 0x10, 0x70, 0x47, 0x14, 0xed, 0x00, 0xe0, + 0x2d, 0xe9, 0xfe, 0x4f, 0x80, 0x46, 0x00, 0x20, 0x02, 0x21, 0x00, 0x25, + 0x00, 0xf0, 0xda, 0xf9, 0xc2, 0x48, 0x00, 0x68, 0x80, 0x47, 0xc2, 0x4e, + 0x70, 0x60, 0x30, 0x68, 0x40, 0xf0, 0x01, 0x00, 0x30, 0x60, 0xc0, 0x48, + 0x00, 0x68, 0x80, 0x47, 0xbf, 0x48, 0x00, 0x68, 0x80, 0x47, 0xbf, 0x48, + 0x00, 0x68, 0x80, 0x69, 0x00, 0xb1, 0x80, 0x47, 0xbd, 0x48, 0x00, 0x68, + 0x80, 0x47, 0xbd, 0x48, 0xbd, 0x4f, 0x00, 0x68, 0x01, 0x90, 0xc7, 0xf8, + 0xfc, 0x50, 0xc7, 0xf8, 0x00, 0x51, 0xb8, 0x68, 0x40, 0xf0, 0x80, 0x00, + 0xb8, 0x60, 0x30, 0x68, 0x40, 0xf0, 0x02, 0x00, 0x30, 0x60, 0xb7, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x30, 0x68, 0xb7, 0x4a, 0x40, 0xf0, 0x04, 0x00, + 0x30, 0x60, 0xb4, 0x48, 0xd0, 0xf8, 0x10, 0x11, 0x11, 0x60, 0xb4, 0x4a, + 0x31, 0x68, 0x41, 0xf0, 0x08, 0x01, 0x31, 0x60, 0x01, 0x21, 0xf9, 0x61, + 0x13, 0x68, 0x43, 0xf0, 0x04, 0x03, 0x13, 0x60, 0x79, 0x60, 0xf9, 0x6d, + 0x41, 0xf0, 0x01, 0x01, 0xf9, 0x65, 0x31, 0x68, 0x41, 0xf0, 0x10, 0x01, + 0x31, 0x60, 0x90, 0xf8, 0x74, 0x12, 0x19, 0xb1, 0xa9, 0x4a, 0x12, 0x88, + 0x51, 0x43, 0x8d, 0x1e, 0x00, 0xf5, 0x82, 0x74, 0xa7, 0x48, 0x41, 0x1c, + 0x28, 0x46, 0x88, 0x47, 0xa6, 0x48, 0x00, 0x68, 0x80, 0x47, 0xa6, 0x48, + 0x00, 0x78, 0x20, 0xb1, 0x00, 0x20, 0x4f, 0xf4, 0xb7, 0x71, 0xce, 0xf7, + 0xd7, 0xf9, 0xa3, 0x48, 0x00, 0x7f, 0x02, 0x28, 0x04, 0xd0, 0x00, 0x20, + 0x40, 0xf2, 0x6f, 0x11, 0xce, 0xf7, 0xce, 0xf9, 0x20, 0x68, 0x02, 0x94, + 0x78, 0x63, 0x9e, 0x48, 0xd8, 0xf8, 0x00, 0x10, 0x02, 0x68, 0xd8, 0xf8, + 0x08, 0x00, 0x00, 0x29, 0x18, 0xbf, 0x01, 0x21, 0x90, 0x47, 0x9a, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x30, 0x68, 0x02, 0x21, 0x4f, 0xf0, 0x01, 0x0b, + 0x40, 0xf0, 0x20, 0x00, 0x30, 0x60, 0x01, 0x20, 0x00, 0xf0, 0x58, 0xf9, + 0x87, 0x49, 0xdf, 0xf8, 0x50, 0x92, 0xb8, 0x46, 0x93, 0x4d, 0x94, 0x4f, + 0xdf, 0xf8, 0x50, 0xa2, 0xd1, 0xf8, 0x9c, 0x00, 0x20, 0xf0, 0x04, 0x00, + 0xc1, 0xf8, 0x9c, 0x00, 0x72, 0xb6, 0xd9, 0xf8, 0x00, 0x00, 0x40, 0x00, + 0x01, 0x30, 0xc9, 0xf8, 0x00, 0x00, 0x78, 0x59, 0x79, 0x59, 0x21, 0xf0, + 0x01, 0x01, 0x79, 0x51, 0x8b, 0x49, 0xca, 0xf8, 0x04, 0x10, 0x78, 0x51, + 0xd9, 0xf8, 0x00, 0x00, 0x40, 0x08, 0xc9, 0xf8, 0x00, 0x00, 0xd9, 0xf8, + 0x00, 0x00, 0x80, 0xf3, 0x10, 0x88, 0x86, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x04, 0x46, 0x72, 0xb6, 0xd9, 0xf8, 0x00, 0x00, 0x40, 0x00, 0x01, 0x30, + 0xc9, 0xf8, 0x00, 0x00, 0x78, 0x59, 0x79, 0x59, 0x21, 0xf0, 0x01, 0x01, + 0x79, 0x51, 0x7f, 0x49, 0xca, 0xf8, 0x04, 0x10, 0x78, 0x51, 0xd9, 0xf8, + 0x00, 0x00, 0x40, 0x08, 0xc9, 0xf8, 0x00, 0x00, 0xd9, 0xf8, 0x00, 0x00, + 0x80, 0xf3, 0x10, 0x88, 0x00, 0xf0, 0x68, 0xf9, 0x00, 0x2c, 0xc2, 0x46, + 0x4c, 0xd0, 0x30, 0x68, 0x60, 0x4c, 0x40, 0xf4, 0x80, 0x70, 0x30, 0x60, + 0x00, 0x20, 0xc8, 0xf8, 0x00, 0x00, 0xc7, 0xf8, 0x08, 0xb0, 0xc7, 0xf8, + 0x00, 0xb0, 0xc7, 0xf8, 0x04, 0xb0, 0x20, 0x68, 0xc0, 0x69, 0x00, 0xb1, + 0x80, 0x47, 0x6e, 0x48, 0x00, 0x68, 0x80, 0x47, 0x9a, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x6c, 0x48, 0x00, 0x68, 0x80, 0x47, 0x6b, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x6b, 0x48, 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, 0x6a, 0x48, + 0xd0, 0xf8, 0x00, 0x80, 0x69, 0x48, 0x00, 0x68, 0x80, 0x47, 0x69, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x68, 0x48, 0x00, 0x68, 0x80, 0x47, 0x00, 0x20, + 0x08, 0x21, 0x00, 0x25, 0x00, 0xf0, 0xdc, 0xf8, 0x65, 0x48, 0x01, 0x68, + 0x30, 0x20, 0x88, 0x47, 0x47, 0x48, 0x01, 0x99, 0x01, 0x60, 0x21, 0x68, + 0x30, 0x68, 0x02, 0x9c, 0x09, 0x6a, 0x40, 0xf4, 0x80, 0x30, 0x30, 0x60, + 0x11, 0xb1, 0x01, 0x20, 0x88, 0x47, 0x30, 0x68, 0xb1, 0x68, 0x35, 0x82, + 0x40, 0xf4, 0x00, 0x70, 0x01, 0x27, 0x01, 0x31, 0xb1, 0x60, 0x33, 0xe0, + 0x7a, 0x48, 0x00, 0x68, 0x80, 0x47, 0x30, 0x68, 0x08, 0x21, 0x40, 0xf4, + 0x80, 0x50, 0x30, 0x60, 0x00, 0x20, 0x00, 0xf0, 0xb7, 0xf8, 0x35, 0x4c, + 0x20, 0x68, 0xc0, 0x69, 0x00, 0xb1, 0x80, 0x47, 0x48, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x48, 0x48, 0x00, 0x68, 0x80, 0x47, 0x48, 0x48, 0x01, 0x68, + 0x00, 0x20, 0x88, 0x47, 0x4c, 0x48, 0x00, 0x68, 0x80, 0x47, 0x4c, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x21, 0x68, 0x30, 0x68, 0x02, 0x9c, 0x09, 0x6a, + 0x40, 0xf4, 0x80, 0x30, 0x30, 0x60, 0x11, 0xb1, 0x00, 0x20, 0x88, 0x47, + 0x30, 0x68, 0xf1, 0x68, 0x40, 0xf4, 0x00, 0x50, 0x00, 0x27, 0x01, 0x31, + 0xf1, 0x60, 0x31, 0x8a, 0x01, 0x31, 0x31, 0x82, 0x30, 0x60, 0x41, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x00, 0x20, 0xca, 0xf8, 0x5c, 0x00, 0x60, 0x68, + 0xca, 0xf8, 0x34, 0x00, 0x30, 0x68, 0x40, 0xf4, 0xc0, 0x20, 0x30, 0x60, + 0x3b, 0x48, 0x00, 0x68, 0x80, 0x47, 0x01, 0x20, 0x08, 0x21, 0x00, 0xf0, + 0x79, 0xf8, 0x39, 0x48, 0x00, 0x68, 0x80, 0x47, 0xaf, 0xb1, 0x38, 0x4d, + 0x41, 0x46, 0x28, 0x88, 0x01, 0x30, 0x28, 0x80, 0x36, 0x48, 0x02, 0x68, + 0x2a, 0x48, 0x00, 0x68, 0x90, 0x47, 0xa2, 0x8a, 0x81, 0xb2, 0xa8, 0x80, + 0x91, 0x42, 0x02, 0xd9, 0x6a, 0x88, 0x01, 0x32, 0x6a, 0x80, 0xea, 0x88, + 0x8a, 0x42, 0x38, 0xbf, 0xe8, 0x80, 0xd9, 0xf8, 0x00, 0x00, 0x40, 0x08, + 0xc9, 0xf8, 0x00, 0x00, 0xd9, 0xf8, 0x00, 0x00, 0x80, 0xf3, 0x10, 0x88, + 0xbd, 0xe8, 0xfe, 0x8f, 0x84, 0x9c, 0x08, 0x00, 0xc8, 0xbf, 0x01, 0x00, + 0x24, 0x9f, 0x08, 0x00, 0x64, 0x36, 0x01, 0x00, 0x48, 0x36, 0x01, 0x00, + 0x78, 0x9f, 0x08, 0x00, 0x98, 0x60, 0x01, 0x30, 0x04, 0x40, 0x01, 0x30, + 0x88, 0x9f, 0x08, 0x00, 0x8c, 0x7e, 0x08, 0x00, 0x1c, 0xf0, 0x00, 0x30, + 0x10, 0xed, 0x00, 0xe0, 0x34, 0xec, 0x01, 0x00, 0x40, 0xec, 0x01, 0x00, + 0x8c, 0x9f, 0x08, 0x00, 0xdb, 0xb8, 0x01, 0x00, 0x18, 0x74, 0x01, 0x00, + 0x34, 0x9f, 0x08, 0x00, 0x44, 0x9f, 0x08, 0x00, 0x24, 0x36, 0x01, 0x00, + 0xc8, 0xfe, 0xff, 0xff, 0x00, 0x13, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x29, 0x01, 0x10, 0xb8, 0x12, 0x01, 0x00, 0xe1, 0x0e, 0x00, 0x10, + 0x64, 0x9f, 0x08, 0x00, 0x48, 0x9f, 0x08, 0x00, 0x24, 0xbc, 0x08, 0x00, + 0x38, 0x9f, 0x08, 0x00, 0x24, 0x20, 0x00, 0x40, 0x30, 0x9f, 0x08, 0x00, + 0x1c, 0xa3, 0x08, 0x00, 0x7c, 0x9f, 0x08, 0x00, 0x40, 0x9f, 0x08, 0x00, + 0x68, 0x36, 0x01, 0x00, 0x84, 0x9f, 0x08, 0x00, 0x80, 0x9f, 0x08, 0x00, + 0x28, 0x9f, 0x08, 0x00, 0x4c, 0x9f, 0x08, 0x00, 0xb6, 0xfc, 0x05, 0x00, + 0x1c, 0x9d, 0x08, 0x00, 0x0b, 0x4a, 0x12, 0x78, 0x0a, 0x2a, 0x11, 0xd1, + 0x0a, 0x4a, 0x09, 0x02, 0x38, 0xb1, 0x10, 0x68, 0x88, 0x43, 0x10, 0x60, + 0x08, 0x48, 0x02, 0x88, 0x22, 0xea, 0x01, 0x01, 0x05, 0xe0, 0x10, 0x68, + 0x08, 0x43, 0x10, 0x60, 0x04, 0x48, 0x02, 0x88, 0x11, 0x43, 0x01, 0x80, + 0x70, 0x47, 0x00, 0xbf, 0x8c, 0x01, 0x01, 0x00, 0x04, 0x08, 0x00, 0x40, + 0x26, 0x21, 0x01, 0x00, 0x01, 0x68, 0x02, 0x4a, 0x11, 0x60, 0xff, 0xf7, + 0xfb, 0xbd, 0x00, 0xbf, 0x0c, 0xdb, 0x05, 0x00, 0x06, 0x48, 0x07, 0x49, + 0x01, 0x60, 0x07, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x08, 0x49, + 0x01, 0x60, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0x68, 0x9f, 0x08, 0x00, 0x29, 0x2b, 0x05, 0x00, 0x04, 0x8e, 0x08, 0x00, + 0x79, 0x2a, 0x05, 0x00, 0xbc, 0x12, 0x01, 0x00, 0x65, 0x2b, 0x05, 0x00, + 0x88, 0x8e, 0x08, 0x00, 0x81, 0x2f, 0x05, 0x00, 0x42, 0xf6, 0x39, 0x5c, + 0xc1, 0xf2, 0x01, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x42, 0xf6, 0xbd, 0x6c, + 0xc1, 0xf2, 0x01, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x43, 0xf2, 0x01, 0x2c, + 0xc1, 0xf2, 0x01, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4d, 0xf2, 0xc9, 0x2c, + 0xc1, 0xf2, 0x02, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x2d, 0xe9, 0xf0, 0x41, + 0x24, 0x48, 0x00, 0x78, 0x08, 0xb1, 0xbd, 0xe8, 0xf0, 0x81, 0x89, 0x4c, + 0x20, 0x68, 0xa0, 0xf5, 0x20, 0x50, 0x20, 0x60, 0x00, 0xf0, 0x3c, 0xf9, + 0xdf, 0xf8, 0x80, 0x80, 0x1e, 0x4d, 0x41, 0x4f, 0x98, 0xf8, 0xc3, 0x11, + 0x28, 0x68, 0xc1, 0xeb, 0x01, 0x11, 0xa0, 0xeb, 0x41, 0x12, 0x49, 0x01, + 0xb2, 0xf5, 0x00, 0x2f, 0x1d, 0xd9, 0x42, 0x1a, 0x4f, 0xf4, 0xda, 0x63, + 0x18, 0x4e, 0x38, 0x60, 0xa2, 0xf5, 0x00, 0x22, 0xb2, 0xfb, 0xf3, 0xf2, + 0x96, 0xf8, 0x11, 0x65, 0x01, 0x32, 0xd2, 0xb2, 0xb2, 0x42, 0x38, 0xbf, + 0x16, 0x46, 0x16, 0xfb, 0x03, 0x11, 0x41, 0x1a, 0xb1, 0xf5, 0x00, 0x2f, + 0x29, 0x60, 0x79, 0x60, 0x09, 0xd9, 0x00, 0x20, 0xc7, 0x21, 0xcd, 0xf7, + 0xc7, 0xff, 0x29, 0x68, 0x03, 0xe0, 0x41, 0x1a, 0x29, 0x60, 0xc7, 0xe9, + 0x00, 0x01, 0x98, 0xf8, 0x7f, 0x01, 0xa1, 0xeb, 0x00, 0x22, 0x20, 0x68, + 0xc7, 0xe9, 0x02, 0x12, 0x2a, 0x60, 0x11, 0x1a, 0xbd, 0xe8, 0xf0, 0x41, + 0x00, 0xf0, 0x65, 0xb9, 0x70, 0xc0, 0x01, 0x00, 0x74, 0xc0, 0x01, 0x00, + 0xe8, 0x65, 0x08, 0x00, 0x8c, 0x7e, 0x08, 0x00, 0x10, 0xb5, 0x3a, 0x4a, + 0x01, 0x46, 0x10, 0x78, 0x28, 0xb1, 0x39, 0x48, 0x72, 0xb6, 0x03, 0x68, + 0x5b, 0x00, 0x01, 0x33, 0x03, 0x60, 0x1a, 0x4b, 0x07, 0x31, 0x21, 0xf0, + 0x07, 0x01, 0xd3, 0xe9, 0x00, 0x40, 0x01, 0x44, 0xa1, 0x42, 0x94, 0xbf, + 0x59, 0x60, 0x00, 0x20, 0x11, 0x78, 0x31, 0xb1, 0x2f, 0x49, 0x0a, 0x68, + 0x52, 0x08, 0x0a, 0x60, 0x09, 0x68, 0x81, 0xf3, 0x10, 0x88, 0x10, 0xbd, + 0x10, 0xb5, 0x2a, 0x4a, 0x01, 0x46, 0x10, 0x78, 0x28, 0xb1, 0x29, 0x48, + 0x72, 0xb6, 0x03, 0x68, 0x5b, 0x00, 0x01, 0x33, 0x03, 0x60, 0x0a, 0x4b, + 0x07, 0x31, 0x21, 0xf0, 0x07, 0x01, 0xd3, 0xe9, 0x02, 0x40, 0x01, 0x44, + 0xa1, 0x42, 0x94, 0xbf, 0xd9, 0x60, 0x00, 0x20, 0x11, 0x78, 0x31, 0xb1, + 0x1f, 0x49, 0x0a, 0x68, 0x52, 0x08, 0x0a, 0x60, 0x09, 0x68, 0x81, 0xf3, + 0x10, 0x88, 0x10, 0xbd, 0xc0, 0xfc, 0x05, 0x00, 0x10, 0xb5, 0x19, 0x4c, + 0x01, 0x46, 0x20, 0x78, 0x28, 0xb1, 0x18, 0x48, 0x72, 0xb6, 0x02, 0x68, + 0x52, 0x00, 0x01, 0x32, 0x02, 0x60, 0x3c, 0x48, 0x00, 0x68, 0x00, 0xf0, + 0x2d, 0xf9, 0x21, 0x78, 0x31, 0xb1, 0x12, 0x49, 0x0a, 0x68, 0x52, 0x08, + 0x0a, 0x60, 0x09, 0x68, 0x81, 0xf3, 0x10, 0x88, 0x10, 0xbd, 0x00, 0xbf, + 0x10, 0xb5, 0x0c, 0x4c, 0x01, 0x46, 0x20, 0x78, 0x28, 0xb1, 0x0b, 0x48, + 0x72, 0xb6, 0x02, 0x68, 0x52, 0x00, 0x01, 0x32, 0x02, 0x60, 0x2f, 0x48, + 0x00, 0x68, 0x00, 0xf0, 0xd1, 0xf9, 0x20, 0x78, 0x30, 0xb1, 0x05, 0x48, + 0x01, 0x68, 0x49, 0x08, 0x01, 0x60, 0x00, 0x68, 0x80, 0xf3, 0x10, 0x88, + 0x10, 0xbd, 0x00, 0xbf, 0xde, 0xb8, 0x01, 0x00, 0x24, 0x36, 0x01, 0x00, + 0x2d, 0xe9, 0xf0, 0x41, 0x86, 0xb0, 0x24, 0x48, 0x01, 0xa9, 0x01, 0x22, + 0x00, 0x68, 0x00, 0xf0, 0x2d, 0xfa, 0x01, 0xad, 0xdf, 0xf8, 0x84, 0x80, + 0x04, 0x98, 0x21, 0x4c, 0x26, 0xcd, 0x8e, 0x1a, 0xd8, 0xf8, 0x00, 0x20, + 0x05, 0x99, 0xaa, 0x42, 0x03, 0xd1, 0x1e, 0x4a, 0x12, 0x68, 0xb2, 0x42, + 0x0f, 0xd0, 0xc4, 0xe9, 0x00, 0x61, 0xc4, 0xe9, 0x02, 0x50, 0x1b, 0x48, + 0x18, 0x4a, 0x00, 0x21, 0x10, 0x23, 0x07, 0x68, 0x40, 0xf2, 0x0c, 0x70, + 0xb8, 0x47, 0x16, 0x48, 0xc8, 0xf8, 0x00, 0x50, 0x06, 0x60, 0x16, 0x4d, + 0x16, 0x4e, 0x28, 0x68, 0x31, 0x68, 0x81, 0x42, 0x02, 0xd0, 0x15, 0x49, + 0x09, 0x68, 0x05, 0xe0, 0x13, 0x49, 0x14, 0x4a, 0x09, 0x68, 0x12, 0x68, + 0x8a, 0x42, 0x0f, 0xd0, 0x42, 0x1a, 0x07, 0xc4, 0x0c, 0x48, 0x00, 0x21, + 0x0c, 0x23, 0x09, 0x4a, 0x04, 0x68, 0x40, 0xf2, 0x0b, 0x70, 0xa0, 0x47, + 0x28, 0x68, 0x0c, 0x49, 0x30, 0x60, 0x0a, 0x48, 0x00, 0x68, 0x08, 0x60, + 0x06, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0xbf, 0x78, 0xc0, 0x01, 0x00, + 0x8c, 0xc0, 0x01, 0x00, 0x8c, 0x34, 0x01, 0x00, 0x90, 0xc0, 0x01, 0x00, + 0x78, 0x9b, 0x08, 0x00, 0x30, 0x36, 0x01, 0x00, 0x94, 0xc0, 0x01, 0x00, + 0x2c, 0x36, 0x01, 0x00, 0x98, 0xc0, 0x01, 0x00, 0x06, 0x48, 0x07, 0x49, + 0x01, 0x60, 0x07, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x08, 0x49, + 0x01, 0x60, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0xdc, 0x9b, 0x08, 0x00, 0x29, 0x31, 0x05, 0x00, 0xd8, 0x9d, 0x08, 0x00, + 0xfd, 0x2f, 0x05, 0x00, 0xe0, 0x9b, 0x08, 0x00, 0x5d, 0x31, 0x05, 0x00, + 0x8c, 0x8e, 0x08, 0x00, 0x99, 0x31, 0x05, 0x00, 0x4c, 0xf6, 0x21, 0x1c, + 0xc1, 0xf2, 0x11, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0xb0, 0xb5, 0x05, 0x46, + 0xc0, 0x68, 0x0c, 0x46, 0x88, 0x42, 0x04, 0xd1, 0x00, 0x20, 0xa8, 0x21, + 0xcd, 0xf7, 0xa6, 0xfe, 0xe8, 0x68, 0x20, 0xb9, 0x00, 0x20, 0xa9, 0x21, + 0xcd, 0xf7, 0xa0, 0xfe, 0xe8, 0x68, 0x80, 0xb1, 0x05, 0x46, 0x80, 0x88, + 0x68, 0xb1, 0x05, 0xeb, 0x80, 0x00, 0xa0, 0x42, 0xf7, 0xd1, 0x81, 0x88, + 0x00, 0x29, 0x0f, 0xbf, 0x00, 0x20, 0x00, 0xeb, 0x81, 0x00, 0x40, 0x1b, + 0x80, 0x08, 0xa8, 0x80, 0x04, 0xe0, 0x00, 0x20, 0xd2, 0x21, 0x00, 0x25, + 0xcd, 0xf7, 0x88, 0xfe, 0x28, 0x46, 0xb0, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, + 0xc7, 0x68, 0x0c, 0x46, 0x80, 0x46, 0x9f, 0xb1, 0xa7, 0x42, 0x15, 0xd2, + 0xb8, 0x88, 0x3e, 0x46, 0x78, 0xb1, 0x01, 0xb2, 0xb1, 0xf1, 0xff, 0x3f, + 0x04, 0xdc, 0x00, 0x20, 0xf4, 0x21, 0xcd, 0xf7, 0x73, 0xfe, 0xb0, 0x88, + 0x06, 0xeb, 0x80, 0x07, 0xa7, 0x42, 0xef, 0xd3, 0x01, 0x25, 0x05, 0xe0, + 0x00, 0x26, 0x00, 0x27, 0x00, 0x25, 0x01, 0xe0, 0x01, 0x25, 0x00, 0x26, + 0xa6, 0x42, 0x18, 0xbf, 0xa7, 0x42, 0x03, 0xd1, 0x00, 0x20, 0xff, 0x21, + 0xcd, 0xf7, 0x5e, 0xfe, 0x1e, 0xb1, 0xa0, 0x1b, 0x80, 0x08, 0xb0, 0x80, + 0x01, 0xe0, 0xc8, 0xf8, 0x0c, 0x40, 0x15, 0xb1, 0x38, 0x1b, 0x80, 0x08, + 0x00, 0xe0, 0x00, 0x20, 0xa0, 0x80, 0xbd, 0xe8, 0xf0, 0x81, 0xb0, 0xb5, + 0x38, 0xb1, 0x19, 0x29, 0x05, 0xd3, 0x04, 0x46, 0x80, 0x07, 0x4f, 0xf0, + 0x00, 0x00, 0x02, 0xd0, 0xb0, 0xbd, 0x00, 0x20, 0xb0, 0xbd, 0xa1, 0xf1, + 0x10, 0x05, 0xb0, 0xeb, 0x55, 0x4f, 0xf7, 0xd1, 0x20, 0x46, 0x18, 0x21, + 0xcf, 0xf7, 0xe0, 0xff, 0xa8, 0x08, 0x00, 0x21, 0x24, 0xf8, 0x10, 0x0f, + 0x60, 0x80, 0x04, 0xeb, 0x80, 0x00, 0xa1, 0x80, 0x44, 0xe9, 0x02, 0x04, + 0x01, 0x20, 0xb0, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x80, 0x46, 0xc8, 0x1c, + 0x00, 0x24, 0xb4, 0xeb, 0x90, 0x0f, 0x63, 0xd0, 0x59, 0x49, 0x88, 0x42, + 0x5f, 0xd8, 0xd8, 0xf8, 0x0c, 0x60, 0x00, 0x2e, 0x5b, 0xd0, 0x34, 0x46, + 0x85, 0x08, 0x34, 0xf8, 0x04, 0x0f, 0x18, 0xb3, 0x00, 0x27, 0xb6, 0xf9, + 0x02, 0x10, 0xb3, 0x46, 0xb1, 0xf1, 0xff, 0x3f, 0x05, 0xdc, 0x00, 0x20, + 0x40, 0xf2, 0x6f, 0x11, 0xcd, 0xf7, 0x0e, 0xfe, 0x20, 0x88, 0x00, 0xb2, + 0xb0, 0xf1, 0xff, 0x3f, 0x04, 0xdc, 0x00, 0x20, 0x4f, 0xf4, 0xb9, 0x71, + 0xcd, 0xf7, 0x04, 0xfe, 0xbb, 0xf8, 0x02, 0x00, 0x85, 0x42, 0x0c, 0xd3, + 0x20, 0x88, 0x5f, 0x46, 0x0b, 0xeb, 0x80, 0x06, 0x34, 0x46, 0x34, 0xf8, + 0x04, 0x0f, 0x00, 0x28, 0xdd, 0xd1, 0x04, 0xe0, 0x4f, 0xf0, 0x00, 0x0b, + 0x01, 0xe0, 0x5e, 0x46, 0xbb, 0x46, 0xb6, 0xf8, 0x02, 0x90, 0x4d, 0x45, + 0x29, 0xd2, 0x01, 0x35, 0xa9, 0xeb, 0x05, 0x0a, 0x1f, 0xfa, 0x8a, 0xf1, + 0x02, 0x29, 0x2d, 0xd3, 0x45, 0xf4, 0x00, 0x40, 0x06, 0xeb, 0x85, 0x07, + 0x26, 0xf8, 0x25, 0x50, 0x89, 0x46, 0x70, 0x80, 0x20, 0x88, 0xa7, 0xf8, + 0x02, 0xa0, 0x00, 0x28, 0x18, 0xbf, 0x40, 0x1b, 0xb8, 0x80, 0xbb, 0xf1, + 0x00, 0x0f, 0x29, 0xd0, 0xbb, 0xf8, 0x04, 0x00, 0x28, 0x44, 0xab, 0xf8, + 0x04, 0x00, 0x80, 0xb2, 0x0b, 0xeb, 0x80, 0x00, 0xb8, 0x42, 0x2b, 0xd0, + 0x00, 0x20, 0x40, 0xf2, 0xab, 0x11, 0xcd, 0xf7, 0xc5, 0xfd, 0x49, 0x46, + 0x24, 0xe0, 0x00, 0x24, 0xa0, 0x07, 0x04, 0xd0, 0x00, 0x20, 0x40, 0xf2, + 0xf5, 0x11, 0xcd, 0xf7, 0xbb, 0xfd, 0x20, 0x46, 0xbd, 0xe8, 0xf8, 0x8f, + 0x49, 0xf4, 0x00, 0x40, 0xbb, 0xf1, 0x00, 0x0f, 0x70, 0x80, 0x20, 0x88, + 0x1e, 0xd0, 0x58, 0xb3, 0x06, 0xeb, 0x80, 0x00, 0xa0, 0xeb, 0x0b, 0x00, + 0x80, 0x08, 0x26, 0xe0, 0xd8, 0xf8, 0x0c, 0x00, 0xb0, 0x42, 0x05, 0xd0, + 0x00, 0x20, 0x4f, 0xf4, 0xce, 0x71, 0xcd, 0xf7, 0xa1, 0xfd, 0x49, 0x46, + 0xc8, 0xf8, 0x0c, 0x70, 0x07, 0xeb, 0x81, 0x00, 0xd8, 0xf8, 0x08, 0x10, + 0xa9, 0x46, 0x81, 0x42, 0x0c, 0xbf, 0xa8, 0xf8, 0x10, 0xa0, 0xa0, 0xf8, + 0x00, 0xa0, 0x14, 0xe0, 0x80, 0xb1, 0x01, 0xb2, 0xb1, 0xf1, 0xff, 0x3f, + 0x05, 0xdc, 0x00, 0x20, 0x40, 0xf2, 0xcd, 0x11, 0xcd, 0xf7, 0x88, 0xfd, + 0x20, 0x88, 0x06, 0xeb, 0x80, 0x00, 0x04, 0xe0, 0x00, 0x20, 0xab, 0xf8, + 0x04, 0x00, 0x02, 0xe0, 0x00, 0x20, 0xc8, 0xf8, 0x0c, 0x00, 0xd8, 0xe9, + 0x00, 0x01, 0x48, 0x44, 0xc8, 0xf8, 0x00, 0x00, 0x81, 0x42, 0x38, 0xbf, + 0xc8, 0xf8, 0x04, 0x00, 0xb0, 0xe7, 0x00, 0xbf, 0xfb, 0xff, 0x01, 0x00, + 0x70, 0xb5, 0x04, 0x46, 0x14, 0x30, 0x88, 0x42, 0x07, 0xd8, 0xa2, 0x68, + 0x8a, 0x42, 0x04, 0xd9, 0x31, 0xf9, 0x02, 0x3c, 0xb3, 0xf1, 0xff, 0x3f, + 0x00, 0xdd, 0x70, 0xbd, 0x25, 0x68, 0x6f, 0xf3, 0xdf, 0x33, 0x26, 0x46, + 0x00, 0x20, 0x08, 0x80, 0x21, 0xf8, 0x02, 0x3c, 0xed, 0x1a, 0x46, 0xf8, + 0x10, 0x5b, 0x0d, 0x1f, 0xb5, 0x42, 0x0c, 0xd0, 0x28, 0x88, 0xa5, 0xeb, + 0x80, 0x01, 0xb1, 0xf9, 0x02, 0x00, 0x00, 0x28, 0x04, 0xd4, 0x18, 0x44, + 0x0d, 0x46, 0x48, 0x80, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x6b, 0x88, + 0x19, 0x46, 0x6f, 0xf3, 0xdf, 0x31, 0x05, 0xeb, 0x81, 0x01, 0x8a, 0x42, + 0x0c, 0xd9, 0xb1, 0xf9, 0x02, 0x20, 0x00, 0x2a, 0x08, 0xd4, 0x1a, 0x44, + 0x6a, 0x80, 0x8a, 0x88, 0x00, 0x2a, 0x18, 0xbf, 0x1a, 0x44, 0xaa, 0x80, + 0x80, 0xb1, 0x01, 0x20, 0x69, 0x88, 0xa3, 0x68, 0x05, 0xeb, 0x81, 0x02, + 0x93, 0x42, 0x0c, 0xbf, 0x31, 0x80, 0x11, 0x80, 0x00, 0x28, 0xc4, 0xd1, + 0x20, 0x46, 0x29, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0xff, 0xf7, 0x9c, 0xbe, + 0xe0, 0x68, 0x88, 0x42, 0x10, 0xd0, 0x20, 0x46, 0xff, 0xf7, 0x6c, 0xfe, + 0x29, 0x1a, 0x8a, 0x08, 0x82, 0x80, 0x0d, 0x4a, 0x11, 0x40, 0x08, 0x44, + 0x85, 0x42, 0xe0, 0xd0, 0x00, 0x20, 0x40, 0xf2, 0x63, 0x21, 0xcd, 0xf7, + 0x0f, 0xfd, 0xda, 0xe7, 0x88, 0x88, 0x58, 0xb1, 0x01, 0xeb, 0x80, 0x00, + 0x91, 0xb2, 0x05, 0xeb, 0x81, 0x01, 0x88, 0x42, 0x04, 0xd0, 0x00, 0x20, + 0x40, 0xf2, 0x56, 0x21, 0xcd, 0xf7, 0x00, 0xfd, 0xe5, 0x60, 0xca, 0xe7, + 0xfc, 0xff, 0x03, 0x00, 0x70, 0xb5, 0x03, 0x46, 0x00, 0x20, 0x41, 0xb3, + 0xc1, 0xe9, 0x03, 0x00, 0x03, 0xf1, 0x10, 0x00, 0xd3, 0xe9, 0x00, 0x45, + 0x9b, 0x68, 0x4f, 0xea, 0x84, 0x04, 0xa3, 0xeb, 0x00, 0x06, 0x4c, 0x60, + 0x4f, 0xea, 0x85, 0x04, 0x0e, 0x60, 0x8c, 0x60, 0xb2, 0xb1, 0x00, 0x22, + 0x83, 0x42, 0x11, 0xd9, 0x00, 0x24, 0xb0, 0xf9, 0x02, 0x50, 0x00, 0x2d, + 0x06, 0xd4, 0x01, 0x34, 0xae, 0xb2, 0xcc, 0x60, 0xb2, 0x42, 0x3c, 0xbf, + 0x0e, 0x61, 0x32, 0x46, 0x6f, 0xf3, 0xdf, 0x35, 0x00, 0xeb, 0x85, 0x00, + 0x83, 0x42, 0xee, 0xd8, 0x90, 0x00, 0x08, 0x61, 0x01, 0x20, 0x70, 0xbd, + 0x00, 0x22, 0x00, 0xf0, 0x09, 0xb8, 0x00, 0xbf, 0x01, 0x48, 0x02, 0x49, + 0x01, 0x60, 0x70, 0x47, 0x84, 0xd4, 0x08, 0x00, 0x61, 0x36, 0x05, 0x00, + 0x42, 0xf2, 0x9d, 0x5c, 0xc1, 0xf2, 0x11, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x70, 0xb5, 0x04, 0x46, 0x22, 0x48, 0x15, 0x46, 0x03, 0x26, 0x02, 0x68, + 0x03, 0x20, 0x90, 0x47, 0x20, 0x48, 0x01, 0x68, 0x03, 0x20, 0x88, 0x47, + 0x1f, 0x48, 0x81, 0x2d, 0x1a, 0xd0, 0x01, 0x2d, 0x2d, 0xd1, 0xd0, 0xf8, + 0x14, 0x11, 0x03, 0x22, 0x62, 0xf3, 0x07, 0x11, 0xc0, 0xf8, 0x14, 0x11, + 0xd0, 0xf8, 0x18, 0x11, 0x62, 0xf3, 0x07, 0x11, 0xc0, 0xf8, 0x18, 0x11, + 0xd0, 0xf8, 0xf4, 0x11, 0x41, 0xf0, 0x20, 0x01, 0xc0, 0xf8, 0xf4, 0x11, + 0x01, 0x21, 0xc0, 0xf8, 0x80, 0x10, 0xc0, 0xf8, 0x84, 0x40, 0x14, 0xe0, + 0xd0, 0xf8, 0x0c, 0x11, 0x66, 0xf3, 0x07, 0x11, 0xc0, 0xf8, 0x0c, 0x11, + 0xd0, 0xf8, 0x10, 0x11, 0x66, 0xf3, 0x07, 0x11, 0xc0, 0xf8, 0x10, 0x11, + 0xd0, 0xf8, 0xf4, 0x11, 0x41, 0xf0, 0x02, 0x01, 0xc0, 0xf8, 0xf4, 0x11, + 0x01, 0x21, 0x01, 0x60, 0x84, 0x60, 0x01, 0x21, 0x00, 0x22, 0xc0, 0xf8, + 0xec, 0x11, 0xc0, 0xf8, 0xf0, 0x21, 0xc0, 0xf8, 0x6c, 0x11, 0x70, 0xbd, + 0xac, 0x9c, 0x08, 0x00, 0xb0, 0x9c, 0x08, 0x00, 0x14, 0x21, 0x00, 0x40, + 0x70, 0x47, 0x00, 0x00, 0xb0, 0xb5, 0x05, 0x4c, 0x25, 0x68, 0x23, 0x68, + 0x23, 0xf4, 0x7c, 0x13, 0x23, 0x60, 0x00, 0xf0, 0x05, 0xf8, 0x25, 0x60, + 0xb0, 0xbd, 0x00, 0xbf, 0x04, 0x00, 0x21, 0x40, 0x45, 0xf2, 0x61, 0x0c, + 0xc1, 0xf2, 0x11, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x03, 0x49, 0x09, 0x68, + 0x01, 0xb9, 0x03, 0x49, 0x01, 0xeb, 0x80, 0x00, 0x70, 0x47, 0x00, 0xbf, + 0xd8, 0xab, 0x01, 0x00, 0x48, 0xd4, 0x05, 0x00, 0x01, 0x48, 0x02, 0x49, + 0x01, 0x60, 0x70, 0x47, 0x90, 0xf3, 0x08, 0x00, 0x4d, 0x37, 0x05, 0x00, + 0x2d, 0xe9, 0xf0, 0x47, 0xdf, 0xf8, 0xb4, 0xa0, 0x80, 0x46, 0x0c, 0x46, + 0x0b, 0x26, 0xba, 0xf8, 0xc4, 0x00, 0xf1, 0xb2, 0x20, 0xfa, 0x01, 0xf1, + 0xc9, 0x07, 0x03, 0xd1, 0x01, 0x3e, 0x31, 0x06, 0xf7, 0xd1, 0x00, 0x26, + 0x00, 0x27, 0x20, 0xfa, 0x07, 0xf1, 0xc9, 0x07, 0x03, 0xd1, 0x01, 0x37, + 0x0b, 0x2f, 0xf8, 0xd1, 0x0b, 0x27, 0xf5, 0xb2, 0x5f, 0xfa, 0x87, 0xf9, + 0xa9, 0x45, 0x03, 0xd9, 0x00, 0x20, 0x5a, 0x21, 0xd3, 0xf7, 0x82, 0xfa, + 0xb8, 0xf1, 0x01, 0x0f, 0x14, 0xd0, 0xb8, 0xf1, 0x00, 0x0f, 0x18, 0xd1, + 0xa5, 0x42, 0x30, 0x46, 0x16, 0xd9, 0xa1, 0x45, 0x11, 0xd8, 0xba, 0xf8, + 0xc4, 0x10, 0x20, 0x46, 0xc2, 0xb2, 0x21, 0xfa, 0x02, 0xf2, 0xd2, 0x07, + 0x0c, 0xd1, 0x01, 0x38, 0xc2, 0xb2, 0x4a, 0x45, 0xf6, 0xd2, 0x07, 0xe0, + 0xa1, 0x45, 0x38, 0x46, 0x04, 0xd2, 0xa5, 0x42, 0x0d, 0xd2, 0x20, 0x46, + 0x00, 0xe0, 0x00, 0x20, 0xc1, 0xb2, 0x8d, 0x42, 0x28, 0xbf, 0x06, 0x46, + 0xf0, 0xb2, 0x81, 0x45, 0x38, 0xbf, 0x37, 0x46, 0xf8, 0xb2, 0xbd, 0xe8, + 0xf0, 0x87, 0xba, 0xf8, 0xc4, 0x10, 0x70, 0x1c, 0x22, 0x46, 0x21, 0xfa, + 0x04, 0xf3, 0xdb, 0x07, 0xe9, 0xd1, 0x53, 0x1c, 0xd2, 0xb2, 0x01, 0x34, + 0xaa, 0x42, 0x1a, 0x46, 0xf5, 0xd1, 0xe5, 0xe7, 0x8c, 0x7e, 0x08, 0x00, + 0x10, 0xb5, 0x00, 0xf0, 0x2d, 0xf8, 0x0c, 0x4c, 0x5a, 0x21, 0x20, 0x46, + 0xcf, 0xf7, 0x82, 0xfd, 0x04, 0xf1, 0x0a, 0x00, 0x00, 0x21, 0x4f, 0xf6, + 0x80, 0x72, 0x00, 0x23, 0x04, 0x46, 0x01, 0x33, 0x24, 0xf8, 0x02, 0x2b, + 0x04, 0x2b, 0xfa, 0xd1, 0x01, 0x31, 0x12, 0x30, 0x05, 0x29, 0xf4, 0xd1, + 0x02, 0x48, 0x00, 0x21, 0xc1, 0x72, 0x10, 0xbd, 0xd8, 0xdb, 0x05, 0x00, + 0x48, 0xdc, 0x05, 0x00, 0x03, 0x48, 0x04, 0x49, 0x01, 0x60, 0x04, 0x48, + 0x04, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, 0x08, 0x8e, 0x08, 0x00, + 0x35, 0x38, 0x05, 0x00, 0x50, 0xfb, 0x08, 0x00, 0x75, 0x37, 0x05, 0x00, + 0x46, 0xf6, 0x9f, 0x5c, 0xc1, 0xf2, 0x12, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x10, 0xb5, 0x0a, 0x4b, 0x42, 0xf6, 0x0b, 0x34, 0x1c, 0x60, 0x09, 0x4b, + 0x4f, 0xf0, 0x06, 0x04, 0x1c, 0x60, 0x08, 0x4b, 0x19, 0x60, 0x3a, 0xb1, + 0x07, 0x4b, 0x00, 0x21, 0x1c, 0x68, 0x01, 0x31, 0x91, 0x42, 0x20, 0xf8, + 0x02, 0x4b, 0xf9, 0xd1, 0x10, 0xbd, 0x00, 0xbf, 0x00, 0x08, 0x00, 0x40, + 0x10, 0xa0, 0x23, 0x40, 0xa8, 0x01, 0x23, 0x40, 0x08, 0x08, 0x00, 0x40, + 0x02, 0x48, 0x00, 0x68, 0x00, 0x28, 0x18, 0xbf, 0x01, 0x20, 0x70, 0x47, + 0xf8, 0x35, 0x01, 0x00, 0x01, 0x78, 0x01, 0x29, 0x06, 0xd1, 0x40, 0x78, + 0xc0, 0x07, 0x0c, 0xbf, 0x01, 0x21, 0x00, 0x21, 0x01, 0x48, 0x01, 0x70, + 0x70, 0x47, 0x00, 0xbf, 0x5c, 0xd4, 0x05, 0x00, 0xf8, 0xb5, 0x92, 0x4f, + 0x04, 0x46, 0x10, 0x4e, 0x38, 0x78, 0x06, 0xeb, 0x80, 0x00, 0x80, 0x78, + 0xa0, 0x42, 0x18, 0xbf, 0xf8, 0xbd, 0x0d, 0x46, 0x04, 0x20, 0x21, 0x46, + 0xd4, 0xf7, 0xe0, 0xfc, 0x38, 0x78, 0x3d, 0xb1, 0x36, 0xf8, 0x20, 0x10, + 0x01, 0x31, 0x26, 0xf8, 0x20, 0x10, 0x06, 0xeb, 0x80, 0x01, 0xcd, 0x70, + 0x06, 0xeb, 0x80, 0x00, 0xff, 0x21, 0x81, 0x70, 0x05, 0x20, 0x21, 0x46, + 0xbd, 0xe8, 0xf8, 0x40, 0xd4, 0xf7, 0xcc, 0xbc, 0x54, 0xd4, 0x05, 0x00, + 0x2d, 0xe9, 0xf0, 0x4f, 0x8b, 0xb0, 0x02, 0x90, 0x01, 0x20, 0x00, 0xf0, + 0x19, 0xf9, 0x7b, 0x4b, 0x79, 0x4f, 0x9a, 0x46, 0xe8, 0xb1, 0xdf, 0xf8, + 0xe8, 0x81, 0x00, 0x24, 0x0d, 0xf1, 0x14, 0x09, 0x0d, 0xf1, 0x24, 0x0b, + 0x03, 0xad, 0x07, 0xae, 0x38, 0x68, 0x98, 0xf8, 0x00, 0x10, 0x49, 0xf8, + 0x21, 0x00, 0x18, 0x68, 0x4b, 0xf8, 0x21, 0x00, 0x38, 0x6d, 0x45, 0xf8, + 0x21, 0x00, 0x18, 0x6d, 0x46, 0xf8, 0x21, 0x00, 0xe0, 0xb2, 0x00, 0xf0, + 0xfb, 0xf8, 0x53, 0x46, 0x01, 0x3c, 0x00, 0x28, 0xea, 0xd1, 0x02, 0x98, + 0x08, 0xb1, 0x03, 0x28, 0x33, 0xd1, 0x6a, 0x4a, 0x92, 0xf8, 0x5a, 0x11, + 0x09, 0x07, 0x13, 0xd4, 0x92, 0xf8, 0x9c, 0x13, 0x11, 0xb9, 0x92, 0xf8, + 0x9d, 0x13, 0x69, 0xb1, 0x65, 0x4c, 0x66, 0x4a, 0x61, 0x6b, 0x62, 0xf3, + 0x1f, 0x31, 0x61, 0x63, 0x21, 0x68, 0x41, 0xf0, 0x01, 0x01, 0x21, 0x60, + 0x61, 0x68, 0x41, 0xf0, 0x00, 0x41, 0x61, 0x60, 0x08, 0xb1, 0x03, 0x28, + 0x17, 0xd1, 0x5f, 0x4d, 0x5f, 0x49, 0x60, 0x4a, 0x60, 0x4b, 0x61, 0x4c, + 0xc5, 0xe9, 0x01, 0x43, 0xc5, 0xe9, 0x03, 0x21, 0x04, 0x21, 0x53, 0x46, + 0x29, 0x70, 0x21, 0x68, 0x45, 0xf8, 0xf4, 0x1f, 0x01, 0x21, 0x2c, 0x1d, + 0x54, 0xf8, 0xf0, 0x2c, 0x01, 0x31, 0x04, 0x29, 0x12, 0x68, 0x04, 0xc4, + 0xf8, 0xd1, 0x1e, 0x46, 0x06, 0xf0, 0xd8, 0xfb, 0x56, 0x48, 0xbe, 0x4b, + 0x40, 0xf2, 0x1f, 0x32, 0x01, 0x68, 0x93, 0xf8, 0xd2, 0x41, 0x93, 0xf8, + 0xd3, 0x51, 0x44, 0xea, 0x05, 0x24, 0x91, 0x43, 0x22, 0x40, 0x11, 0x44, + 0x01, 0x60, 0x03, 0xf2, 0xcd, 0x10, 0x01, 0x90, 0x01, 0x20, 0x00, 0xf0, + 0xa7, 0xf8, 0x00, 0xb3, 0x5a, 0x4c, 0x3d, 0x46, 0x00, 0x27, 0x0d, 0xf1, + 0x14, 0x0a, 0x0d, 0xf1, 0x24, 0x0b, 0x0d, 0xf1, 0x0c, 0x08, 0x0d, 0xf1, + 0x1c, 0x09, 0x20, 0x78, 0x5a, 0xf8, 0x20, 0x00, 0x28, 0x60, 0x20, 0x78, + 0x5b, 0xf8, 0x20, 0x00, 0x30, 0x60, 0x20, 0x78, 0x58, 0xf8, 0x20, 0x00, + 0x28, 0x65, 0x20, 0x78, 0x59, 0xf8, 0x20, 0x00, 0x30, 0x65, 0xf8, 0xb2, + 0x00, 0xf0, 0x88, 0xf8, 0x01, 0x3f, 0x00, 0x28, 0xe9, 0xd1, 0x02, 0x9c, + 0x0c, 0xb1, 0x01, 0x2c, 0x02, 0xd1, 0x20, 0x46, 0x00, 0xf0, 0x90, 0xf8, + 0x01, 0x9e, 0x9d, 0x49, 0x30, 0x78, 0x4d, 0x1d, 0x00, 0x28, 0x4d, 0xd0, + 0x01, 0x20, 0x28, 0x70, 0x28, 0x78, 0x00, 0xf0, 0xdb, 0xf8, 0x28, 0x78, + 0x00, 0xf0, 0x38, 0xf9, 0x01, 0x2c, 0x15, 0xd1, 0x96, 0xf8, 0x68, 0x00, + 0x40, 0x07, 0x11, 0xd5, 0x00, 0x20, 0x00, 0x24, 0x00, 0xf0, 0xce, 0xf8, + 0x00, 0x20, 0x00, 0xf0, 0x2b, 0xf9, 0x00, 0x20, 0x00, 0xf0, 0x60, 0xf9, + 0x29, 0x48, 0x6c, 0x70, 0x2c, 0x70, 0x00, 0x68, 0x80, 0x47, 0x28, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x27, 0x48, 0x00, 0x68, 0x80, 0x47, 0x30, 0xbb, + 0x26, 0x48, 0x01, 0x68, 0x21, 0xf0, 0x70, 0x41, 0x01, 0x60, 0x41, 0x68, + 0x21, 0xf0, 0x40, 0x41, 0x41, 0x60, 0x23, 0x48, 0xc1, 0x69, 0x21, 0xf4, + 0xc0, 0x61, 0xc1, 0x61, 0x01, 0x68, 0x21, 0xf4, 0x40, 0x71, 0x01, 0x60, + 0x1f, 0x49, 0x0a, 0x68, 0x22, 0xf0, 0x70, 0x42, 0x0a, 0x60, 0x4a, 0x68, + 0x22, 0xf0, 0x40, 0x42, 0x4a, 0x60, 0xc1, 0x69, 0x21, 0xf4, 0xc0, 0x71, + 0xc1, 0x61, 0x41, 0x6a, 0x21, 0xf4, 0x40, 0x71, 0x41, 0x62, 0x01, 0x20, + 0xfe, 0x21, 0xcf, 0xf7, 0x87, 0xfe, 0x0b, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x02, 0x2c, 0xb1, 0xd0, 0x00, 0x28, 0xb5, 0xd0, 0xae, 0xe7, 0x00, 0xbf, + 0x50, 0x10, 0x21, 0x40, 0x38, 0x20, 0x21, 0x40, 0x74, 0x87, 0x08, 0x00, + 0x50, 0xec, 0x01, 0x00, 0x84, 0x48, 0x05, 0x30, 0x94, 0x52, 0x0a, 0x00, + 0xd0, 0xfc, 0x05, 0x00, 0x90, 0x78, 0x23, 0x40, 0x94, 0x78, 0x23, 0x40, + 0xc0, 0x78, 0x03, 0x40, 0xc4, 0x78, 0x03, 0x40, 0xdc, 0xf0, 0x00, 0x30, + 0x68, 0xfc, 0x08, 0x00, 0x84, 0xfe, 0x08, 0x00, 0x90, 0xe5, 0x08, 0x00, + 0x28, 0xd8, 0x05, 0x30, 0x5c, 0xc0, 0x05, 0x30, 0x28, 0xf0, 0x05, 0x30, + 0x01, 0x28, 0x84, 0xbf, 0x00, 0x20, 0x70, 0x47, 0x04, 0x49, 0x0a, 0x68, + 0x22, 0xf0, 0x01, 0x02, 0x02, 0x43, 0x0a, 0x60, 0x02, 0x49, 0x08, 0x70, + 0x01, 0x20, 0x70, 0x47, 0x04, 0x10, 0x00, 0x40, 0x74, 0x87, 0x08, 0x00, + 0xf8, 0xb5, 0x27, 0x4d, 0x05, 0xf1, 0x1e, 0x04, 0x10, 0xb3, 0x01, 0x28, + 0x44, 0xd1, 0x00, 0x26, 0x00, 0x27, 0x28, 0x46, 0x08, 0x21, 0x22, 0x46, + 0x08, 0x23, 0x2e, 0x72, 0xcd, 0xf7, 0x24, 0xfa, 0x01, 0x37, 0x0a, 0x35, + 0x03, 0x2f, 0xf4, 0xd1, 0x20, 0x88, 0x4d, 0x49, 0x1d, 0x4a, 0xa3, 0x79, + 0xa1, 0xf8, 0x7c, 0x06, 0x60, 0x88, 0x81, 0xf8, 0xf6, 0x3e, 0xa2, 0xf8, + 0xb0, 0x07, 0x1a, 0x4a, 0x90, 0x80, 0x20, 0x79, 0x62, 0x79, 0x81, 0xf8, + 0xca, 0x01, 0x81, 0xf8, 0xc9, 0x21, 0x23, 0xe0, 0x43, 0x4d, 0x14, 0x4e, + 0x4f, 0xf0, 0x00, 0x0c, 0x00, 0x27, 0xb5, 0xf8, 0x7c, 0x06, 0x41, 0x06, + 0x44, 0xbf, 0x40, 0xf4, 0x00, 0x70, 0xa5, 0xf8, 0x7c, 0x06, 0x0d, 0x49, + 0x95, 0xf8, 0xf6, 0x2e, 0x95, 0xf8, 0xc9, 0x31, 0x95, 0xf8, 0xca, 0x51, + 0xb6, 0xf8, 0xb0, 0x67, 0x04, 0x31, 0x01, 0x37, 0x8a, 0x70, 0x4b, 0x70, + 0x0d, 0x70, 0x21, 0xf8, 0x02, 0x6c, 0x21, 0xf8, 0x04, 0x0c, 0x81, 0xf8, + 0x04, 0xc0, 0x0a, 0x31, 0x04, 0x2f, 0xf2, 0xd1, 0x01, 0x20, 0x20, 0x72, + 0xf8, 0xbd, 0x00, 0xbf, 0xbc, 0xfe, 0x05, 0x00, 0x8c, 0x7e, 0x08, 0x00, + 0x8c, 0x32, 0x06, 0x00, 0x70, 0xb5, 0x28, 0x4b, 0x29, 0x4a, 0x28, 0x49, + 0x01, 0x28, 0x02, 0xf1, 0x08, 0x04, 0x5d, 0x68, 0x27, 0x4a, 0x01, 0xf1, + 0x03, 0x01, 0x1e, 0xd1, 0x45, 0xf0, 0x01, 0x00, 0x58, 0x60, 0x18, 0x68, + 0x40, 0xf0, 0x08, 0x00, 0x18, 0x60, 0x50, 0x68, 0x40, 0xf0, 0x38, 0x00, + 0x50, 0x60, 0x50, 0x68, 0x20, 0xf0, 0x07, 0x00, 0x50, 0x60, 0x10, 0x68, + 0x40, 0xf0, 0x08, 0x00, 0x10, 0x60, 0x10, 0x68, 0x20, 0xf0, 0x40, 0x00, + 0x10, 0x60, 0x48, 0x78, 0x28, 0xb3, 0x08, 0x78, 0x1b, 0x49, 0x09, 0x68, + 0x88, 0x47, 0x00, 0x20, 0x24, 0xe0, 0x17, 0x48, 0x90, 0xf8, 0xcd, 0x61, + 0x90, 0xf8, 0xce, 0x01, 0x66, 0xf3, 0x01, 0x05, 0xc0, 0x08, 0x5d, 0x60, + 0x1d, 0x68, 0x60, 0xf3, 0xc4, 0x05, 0x1d, 0x60, 0x50, 0x68, 0x20, 0xf0, + 0x38, 0x00, 0x50, 0x60, 0x50, 0x68, 0x40, 0xf0, 0x07, 0x00, 0x50, 0x60, + 0x10, 0x68, 0x20, 0xf0, 0x08, 0x00, 0x10, 0x60, 0x10, 0x68, 0x40, 0xf0, + 0x40, 0x00, 0x10, 0x60, 0x48, 0x78, 0x00, 0x28, 0xd9, 0xd0, 0x08, 0x78, + 0x07, 0x49, 0x09, 0x68, 0x88, 0x47, 0x01, 0x20, 0x20, 0x70, 0x70, 0xbd, + 0x94, 0xc0, 0x05, 0x30, 0xad, 0x2f, 0x06, 0x00, 0x48, 0xdc, 0x05, 0x00, + 0x08, 0xd6, 0x05, 0x30, 0x00, 0x69, 0x08, 0x00, 0x08, 0xff, 0x08, 0x00, + 0x0c, 0xff, 0x08, 0x00, 0x11, 0x49, 0x01, 0x28, 0x11, 0xd1, 0x4f, 0xf0, + 0x80, 0x50, 0x08, 0x60, 0x12, 0x48, 0x08, 0x61, 0x12, 0x48, 0xc8, 0x64, + 0x12, 0x48, 0x08, 0x65, 0x12, 0x48, 0x48, 0x65, 0x12, 0x48, 0x88, 0x66, + 0x4a, 0xf2, 0xcf, 0x00, 0xc8, 0x66, 0x11, 0x48, 0x0c, 0xe0, 0x08, 0x4a, + 0x00, 0x20, 0x08, 0x60, 0x08, 0x61, 0xca, 0x64, 0x06, 0x4a, 0x08, 0x65, + 0x4a, 0x65, 0x06, 0x4a, 0x8a, 0x66, 0xc8, 0x66, 0x45, 0xf2, 0x6b, 0x00, + 0x08, 0x67, 0x70, 0x47, 0xd8, 0xc8, 0x23, 0x40, 0x5f, 0xd9, 0x0f, 0x00, + 0x36, 0xff, 0x0f, 0x00, 0x34, 0x31, 0x02, 0x00, 0x02, 0x00, 0x00, 0x03, + 0xc1, 0x87, 0x0e, 0x00, 0xd8, 0xfc, 0x0f, 0x00, 0x4c, 0xb1, 0x0f, 0x00, + 0xd5, 0xb2, 0x06, 0x00, 0x17, 0x1f, 0x03, 0x00, 0x2d, 0xe9, 0xfe, 0x4f, + 0x01, 0x28, 0x02, 0x90, 0x40, 0xf0, 0xce, 0x80, 0xdf, 0xf8, 0x48, 0x93, + 0xd0, 0x49, 0x99, 0xf8, 0x00, 0x00, 0xc8, 0x71, 0x49, 0x79, 0x01, 0x29, + 0x14, 0xd0, 0xcf, 0x4a, 0x00, 0x21, 0x01, 0xeb, 0x41, 0x03, 0x00, 0x24, + 0x02, 0xeb, 0x83, 0x03, 0x03, 0xf5, 0xca, 0x73, 0x1d, 0x78, 0x01, 0x34, + 0x0b, 0x2c, 0x05, 0x44, 0x03, 0xf8, 0x01, 0x5b, 0xf8, 0xd1, 0x01, 0x31, + 0x04, 0x29, 0xee, 0xd1, 0x00, 0xf0, 0xa4, 0xf9, 0x00, 0xf0, 0xc2, 0xf9, + 0xdf, 0xf8, 0x10, 0x83, 0x98, 0xf8, 0x00, 0x00, 0xe8, 0xb1, 0xdf, 0xf8, + 0x0c, 0xb3, 0x00, 0x27, 0x4f, 0xf0, 0x01, 0x0a, 0x00, 0x24, 0x5b, 0xf8, + 0x24, 0x50, 0x8d, 0xb1, 0x95, 0xf8, 0x74, 0x60, 0x28, 0x46, 0x85, 0xf8, + 0x9e, 0xa0, 0xc5, 0xf8, 0xa0, 0x70, 0xa5, 0xf8, 0x92, 0x70, 0xf1, 0xf7, + 0x9f, 0xfa, 0x28, 0x46, 0x80, 0x21, 0x32, 0x46, 0xd2, 0xf7, 0x9e, 0xfa, + 0x98, 0xf8, 0x00, 0x00, 0x01, 0x34, 0x84, 0x42, 0xe7, 0xd3, 0xb6, 0x48, + 0x00, 0x78, 0x00, 0x28, 0x56, 0xd0, 0xb5, 0x4e, 0xdf, 0xf8, 0xe0, 0xb2, + 0x00, 0x24, 0x4f, 0xf0, 0x00, 0x08, 0xd6, 0xf8, 0x00, 0xa0, 0xba, 0xf1, + 0x00, 0x0f, 0x46, 0xd0, 0x01, 0x20, 0x9a, 0xf8, 0x74, 0x10, 0xaa, 0xf8, + 0x92, 0x40, 0xca, 0xf8, 0xa0, 0x40, 0x8a, 0xf8, 0x9e, 0x00, 0x99, 0xf8, + 0x02, 0x00, 0x81, 0x42, 0x18, 0xd9, 0x8a, 0xf8, 0x74, 0x00, 0xa9, 0x48, + 0x01, 0x68, 0x9a, 0xf8, 0x35, 0x01, 0x88, 0x47, 0x9a, 0xf8, 0x74, 0x00, + 0x9a, 0xf8, 0x35, 0x11, 0xa5, 0x4b, 0x00, 0x22, 0xc3, 0xe9, 0x00, 0x10, + 0xa4, 0x48, 0x01, 0x21, 0x07, 0x68, 0x08, 0x20, 0x00, 0x90, 0x40, 0xf2, + 0x13, 0x20, 0xb8, 0x47, 0x99, 0xf8, 0x02, 0x00, 0x0a, 0xf5, 0x6f, 0x71, + 0x00, 0x22, 0x0b, 0x78, 0x01, 0x32, 0x83, 0x42, 0x88, 0xbf, 0x08, 0x70, + 0x08, 0x31, 0x05, 0x2a, 0xf7, 0xd1, 0x4d, 0x46, 0x0a, 0xf1, 0x78, 0x07, + 0x4f, 0xf0, 0x00, 0x09, 0x9a, 0xf8, 0x74, 0x00, 0xdb, 0xf8, 0x00, 0x20, + 0x5f, 0xfa, 0x89, 0xf1, 0x90, 0x47, 0x27, 0xf8, 0x19, 0x00, 0x09, 0xf1, + 0x01, 0x09, 0xb9, 0xf1, 0x04, 0x0f, 0xf1, 0xd1, 0x8c, 0x48, 0xa9, 0x46, + 0x00, 0x78, 0x08, 0xf1, 0x01, 0x08, 0x04, 0x36, 0x80, 0x45, 0xae, 0xd3, + 0xdf, 0xf8, 0x38, 0x82, 0x98, 0xf8, 0x00, 0x00, 0x48, 0xb3, 0x8d, 0x4e, + 0xdf, 0xf8, 0x34, 0xb2, 0x00, 0x25, 0x4f, 0xf0, 0x01, 0x0a, 0x00, 0x27, + 0x56, 0xf8, 0x27, 0x40, 0xe4, 0xb1, 0x99, 0xf8, 0x02, 0x20, 0x94, 0xf8, + 0x40, 0x01, 0x94, 0xf8, 0x4a, 0x11, 0x84, 0xf8, 0xdc, 0xa1, 0xa4, 0xf8, + 0xd0, 0x51, 0xc4, 0xf8, 0xe0, 0x51, 0x90, 0x42, 0x84, 0xbf, 0x84, 0xf8, + 0x40, 0x21, 0x10, 0x46, 0x05, 0x29, 0x4f, 0xf0, 0x03, 0x01, 0x38, 0xbf, + 0x02, 0x21, 0xdb, 0xf8, 0x00, 0x20, 0x90, 0x47, 0x84, 0xf8, 0x41, 0x01, + 0x98, 0xf8, 0x00, 0x00, 0x01, 0x37, 0x87, 0x42, 0xdc, 0xd3, 0xcf, 0xe0, + 0x6a, 0x48, 0x00, 0x21, 0xdf, 0xf8, 0xa8, 0xb1, 0xc1, 0x71, 0x40, 0x79, + 0xb8, 0xb1, 0x9b, 0xf8, 0x00, 0x00, 0xf6, 0x4a, 0x00, 0x21, 0x01, 0xeb, + 0x41, 0x03, 0x00, 0x24, 0x02, 0xeb, 0x83, 0x03, 0x03, 0xf5, 0xca, 0x73, + 0x1d, 0x78, 0x01, 0x34, 0x0b, 0x2c, 0xa5, 0xeb, 0x00, 0x05, 0x03, 0xf8, + 0x01, 0x5b, 0xf7, 0xd1, 0x01, 0x31, 0x04, 0x29, 0xed, 0xd1, 0x00, 0xf0, + 0x1f, 0xf9, 0x00, 0xf0, 0x5d, 0xf9, 0xdf, 0xf8, 0x74, 0x91, 0x99, 0xf8, + 0x00, 0x00, 0x28, 0xb3, 0x5b, 0x4f, 0x5c, 0x4c, 0x4f, 0xf0, 0x00, 0x08, + 0x4f, 0xf0, 0x00, 0x0a, 0x57, 0xf8, 0x2a, 0x50, 0xc5, 0xb1, 0x94, 0xf8, + 0xca, 0x01, 0x95, 0xf8, 0x74, 0x60, 0x85, 0xf8, 0x9e, 0x80, 0x85, 0xf8, + 0x92, 0x00, 0x9b, 0xf8, 0x02, 0x00, 0x86, 0x42, 0x04, 0xbf, 0x0b, 0x20, + 0x85, 0xf8, 0x74, 0x00, 0x28, 0x46, 0xf1, 0xf7, 0xc9, 0xf9, 0x28, 0x46, + 0x80, 0x21, 0x32, 0x46, 0xd2, 0xf7, 0xc8, 0xf9, 0x99, 0xf8, 0x00, 0x00, + 0x0a, 0xf1, 0x01, 0x0a, 0x82, 0x45, 0xdf, 0xd3, 0x4a, 0x48, 0x00, 0x78, + 0x00, 0x28, 0x51, 0xd0, 0x49, 0x4c, 0xdf, 0xf8, 0x34, 0x81, 0x0b, 0x26, + 0x4f, 0xf0, 0x00, 0x09, 0xd4, 0xf8, 0x00, 0xa0, 0xba, 0xf1, 0x00, 0x0f, + 0x41, 0xd0, 0x00, 0x20, 0x9a, 0xf8, 0x74, 0x10, 0x8a, 0xf8, 0x9e, 0x00, + 0x3f, 0x48, 0x90, 0xf8, 0xca, 0x01, 0x8a, 0xf8, 0x92, 0x00, 0x9b, 0xf8, + 0x02, 0x00, 0x81, 0x42, 0x18, 0xd1, 0x3e, 0x48, 0x8a, 0xf8, 0x74, 0x60, + 0x01, 0x68, 0x9a, 0xf8, 0x35, 0x01, 0x88, 0x47, 0x9a, 0xf8, 0x74, 0x00, + 0x9a, 0xf8, 0x35, 0x11, 0x39, 0x4b, 0x00, 0x22, 0xc3, 0xe9, 0x00, 0x10, + 0xc0, 0x48, 0x01, 0x21, 0x05, 0x68, 0x08, 0x20, 0x00, 0x90, 0x40, 0xf2, + 0x13, 0x20, 0xa8, 0x47, 0x9b, 0xf8, 0x02, 0x00, 0x0a, 0xf5, 0x6f, 0x71, + 0x00, 0x22, 0x0b, 0x78, 0x01, 0x32, 0x83, 0x42, 0x08, 0xbf, 0x0e, 0x70, + 0x08, 0x31, 0x05, 0x2a, 0xf7, 0xd1, 0x0a, 0xf1, 0x78, 0x07, 0x00, 0x25, + 0x9a, 0xf8, 0x74, 0x00, 0xd8, 0xf8, 0x00, 0x20, 0xe9, 0xb2, 0x90, 0x47, + 0x27, 0xf8, 0x15, 0x00, 0x01, 0x35, 0x04, 0x2d, 0xf4, 0xd1, 0x23, 0x48, + 0x00, 0x78, 0x09, 0xf1, 0x01, 0x09, 0x04, 0x34, 0x81, 0x45, 0xb3, 0xd3, + 0xdf, 0xf8, 0x94, 0x90, 0x99, 0xf8, 0x00, 0x00, 0x40, 0xb3, 0x24, 0x4e, + 0xdf, 0xf8, 0x6c, 0xa0, 0x23, 0x4d, 0x4f, 0xf0, 0x00, 0x08, 0x00, 0x24, + 0x56, 0xf8, 0x24, 0x70, 0xdf, 0xb1, 0x9a, 0xf8, 0xca, 0x01, 0x9b, 0xf8, + 0x02, 0x20, 0x97, 0xf8, 0x4a, 0x11, 0x87, 0xf8, 0xdc, 0x81, 0x87, 0xf8, + 0xd0, 0x01, 0x97, 0xf8, 0x40, 0x01, 0x90, 0x42, 0x04, 0xbf, 0x0b, 0x20, + 0x87, 0xf8, 0x40, 0x01, 0x05, 0x29, 0x4f, 0xf0, 0x03, 0x01, 0x38, 0xbf, + 0x02, 0x21, 0x2a, 0x68, 0x90, 0x47, 0x87, 0xf8, 0x41, 0x01, 0x99, 0xf8, + 0x00, 0x00, 0x01, 0x34, 0x84, 0x42, 0xdd, 0xd3, 0x02, 0x98, 0xbd, 0xe8, + 0xfe, 0x4f, 0xd5, 0xf7, 0x6b, 0xbf, 0x00, 0xbf, 0x48, 0xdc, 0x05, 0x00, + 0xad, 0x2f, 0x06, 0x00, 0x8c, 0x7e, 0x08, 0x00, 0x5c, 0x34, 0x01, 0x00, + 0x10, 0x61, 0x01, 0x00, 0x00, 0x69, 0x08, 0x00, 0x53, 0x34, 0x01, 0x00, + 0xb8, 0x57, 0x01, 0x00, 0x54, 0x9c, 0x08, 0x00, 0x8c, 0x34, 0x01, 0x00, + 0xa0, 0xa0, 0x08, 0x00, 0x38, 0x9c, 0x08, 0x00, 0xd4, 0x58, 0x01, 0x00, + 0x14, 0x58, 0x01, 0x00, 0x34, 0x9c, 0x08, 0x00, 0x7c, 0xb5, 0x50, 0x4e, + 0x00, 0x25, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0xb0, 0x79, 0xcd, 0xe9, + 0x00, 0x50, 0x02, 0x20, 0x00, 0xf0, 0xfc, 0xf8, 0x3b, 0x48, 0x05, 0x21, + 0x05, 0x23, 0x00, 0xf1, 0x0a, 0x04, 0x3a, 0x48, 0x22, 0x46, 0xcc, 0xf7, + 0x69, 0xff, 0xb0, 0x78, 0x21, 0x78, 0x01, 0x35, 0x81, 0x42, 0x28, 0xbf, + 0x01, 0x46, 0x04, 0xf8, 0x01, 0x1b, 0x05, 0x2d, 0xf6, 0xd1, 0x7c, 0xbd, + 0xb0, 0xb5, 0x40, 0x4c, 0x41, 0x4d, 0xa1, 0x78, 0x28, 0x78, 0x88, 0x42, + 0x07, 0xd9, 0x3e, 0x4a, 0x10, 0x70, 0x0f, 0x48, 0x02, 0x68, 0x00, 0x20, + 0x90, 0x47, 0xa1, 0x78, 0x28, 0x70, 0x3c, 0x4d, 0x28, 0x78, 0x88, 0x42, + 0x07, 0xd9, 0x38, 0x4a, 0x50, 0x70, 0x09, 0x48, 0x02, 0x68, 0x00, 0x20, + 0x90, 0x47, 0xa1, 0x78, 0x28, 0x70, 0x37, 0x4c, 0x20, 0x78, 0x88, 0x42, + 0x06, 0xd9, 0x32, 0x4a, 0x90, 0x70, 0x03, 0x48, 0x02, 0x68, 0x00, 0x20, + 0x90, 0x47, 0x20, 0x70, 0xb0, 0xbd, 0x00, 0xbf, 0x50, 0xfb, 0x08, 0x00, + 0x80, 0xb5, 0x02, 0x20, 0x00, 0xf0, 0x5e, 0xf8, 0x1a, 0x48, 0x1b, 0x4a, + 0x05, 0x21, 0x05, 0x23, 0x0a, 0x30, 0xcc, 0xf7, 0x29, 0xff, 0x56, 0x48, + 0xb0, 0xf8, 0xb0, 0x17, 0x49, 0xb3, 0x90, 0xf8, 0xf9, 0x12, 0x16, 0x48, + 0x02, 0x68, 0x61, 0xf3, 0x00, 0x02, 0x02, 0x60, 0x4a, 0x08, 0x03, 0x68, + 0x62, 0xf3, 0x41, 0x03, 0x8a, 0x08, 0x03, 0x60, 0x03, 0x68, 0x62, 0xf3, + 0x82, 0x03, 0xca, 0x08, 0x03, 0x60, 0x03, 0x68, 0x62, 0xf3, 0xc3, 0x03, + 0x0a, 0x09, 0x03, 0x60, 0x43, 0x68, 0x62, 0xf3, 0x00, 0x03, 0x4a, 0x09, + 0x43, 0x60, 0x43, 0x68, 0x62, 0xf3, 0x41, 0x03, 0x8a, 0x09, 0xc9, 0x09, + 0x43, 0x60, 0x43, 0x68, 0x62, 0xf3, 0x82, 0x03, 0x43, 0x60, 0x42, 0x68, + 0x61, 0xf3, 0xc3, 0x02, 0x42, 0x60, 0x80, 0xbd, 0xcc, 0x2c, 0x06, 0x00, + 0xb7, 0xfe, 0x05, 0x00, 0x64, 0x50, 0x00, 0x40, 0x0b, 0x48, 0x81, 0x78, + 0x0b, 0x48, 0x02, 0x78, 0x8a, 0x42, 0x84, 0xbf, 0x0a, 0x4b, 0x1a, 0x70, + 0x42, 0x78, 0x8a, 0x42, 0x84, 0xbf, 0x09, 0x4b, 0x1a, 0x70, 0x82, 0x78, + 0x8a, 0x42, 0x84, 0xbf, 0x07, 0x49, 0x0a, 0x70, 0x00, 0x21, 0x81, 0x70, + 0x41, 0x70, 0x01, 0x70, 0x70, 0x47, 0x00, 0xbf, 0xad, 0x2f, 0x06, 0x00, + 0xb4, 0xfe, 0x05, 0x00, 0x6a, 0x34, 0x01, 0x00, 0x6c, 0x34, 0x01, 0x00, + 0x6d, 0x34, 0x01, 0x00, 0x03, 0x28, 0x14, 0xd2, 0x4f, 0x49, 0x00, 0xeb, + 0x80, 0x00, 0x72, 0xb6, 0x0a, 0x68, 0x52, 0x00, 0x01, 0x32, 0x0a, 0x60, + 0x4a, 0x4a, 0x02, 0xeb, 0x40, 0x00, 0x00, 0x22, 0x02, 0x72, 0x08, 0x68, + 0x40, 0x08, 0x08, 0x60, 0x08, 0x68, 0x80, 0xf3, 0x10, 0x88, 0x00, 0xf0, + 0x05, 0xb8, 0x00, 0x20, 0x42, 0xf2, 0x68, 0x61, 0xd2, 0xf7, 0x06, 0xbd, + 0xbc, 0xb5, 0x41, 0x4b, 0x00, 0x20, 0x19, 0x7a, 0x51, 0xb9, 0x01, 0x30, + 0x0a, 0x33, 0x04, 0x28, 0xf9, 0xd1, 0x00, 0x20, 0x42, 0xf2, 0x8b, 0x61, + 0xbd, 0xe8, 0xbc, 0x40, 0xd2, 0xf7, 0xf6, 0xbc, 0x3a, 0x48, 0xa0, 0x4a, + 0x13, 0x4c, 0x72, 0xb6, 0x01, 0x68, 0x49, 0x00, 0x01, 0x31, 0x01, 0x60, + 0x19, 0x88, 0x9d, 0x79, 0xa2, 0xf8, 0x7c, 0x16, 0x59, 0x88, 0x82, 0xf8, + 0xf6, 0x5e, 0xa4, 0xf8, 0xb0, 0x17, 0x0d, 0x4c, 0xa1, 0x80, 0x19, 0x79, + 0x5c, 0x79, 0x82, 0xf8, 0xca, 0x11, 0x82, 0xf8, 0xc9, 0x41, 0x00, 0x22, + 0x01, 0x68, 0x49, 0x08, 0x01, 0x60, 0x01, 0x21, 0x00, 0x68, 0x80, 0xf3, + 0x10, 0x88, 0x06, 0x48, 0x04, 0x68, 0x08, 0x20, 0x00, 0x90, 0x40, 0xf2, + 0xfe, 0x70, 0xa0, 0x47, 0xbc, 0xbd, 0x00, 0xbf, 0x8c, 0x7e, 0x08, 0x00, + 0x8c, 0x32, 0x06, 0x00, 0xa0, 0xa0, 0x08, 0x00, 0x04, 0x28, 0x21, 0xd2, + 0xf0, 0xb5, 0xdf, 0xf8, 0x80, 0xe0, 0xdd, 0xe9, 0x05, 0xc7, 0x00, 0xeb, + 0x80, 0x04, 0x02, 0x28, 0x72, 0xb6, 0x0e, 0xeb, 0x44, 0x05, 0x4f, 0xf0, + 0x01, 0x04, 0x2c, 0x72, 0x1a, 0x4c, 0x26, 0x68, 0x4f, 0xea, 0x46, 0x06, + 0x06, 0xf1, 0x01, 0x06, 0x26, 0x60, 0x10, 0xd0, 0x01, 0x28, 0x18, 0xd0, + 0xe8, 0xb9, 0x00, 0xeb, 0x80, 0x00, 0x29, 0x80, 0x0e, 0xeb, 0x40, 0x00, + 0x80, 0xf8, 0x05, 0xc0, 0x03, 0x71, 0x14, 0xe0, 0x00, 0x20, 0x42, 0xf2, + 0x3f, 0x61, 0xd2, 0xf7, 0x9d, 0xbc, 0x00, 0xeb, 0x80, 0x00, 0x29, 0x80, + 0x0e, 0xeb, 0x40, 0x00, 0x87, 0x71, 0x80, 0xf8, 0x05, 0xc0, 0x03, 0x71, + 0x04, 0xe0, 0x00, 0xeb, 0x80, 0x00, 0x29, 0x80, 0x0e, 0xeb, 0x40, 0x00, + 0x42, 0x80, 0x20, 0x68, 0x40, 0x08, 0x20, 0x60, 0x20, 0x68, 0x80, 0xf3, + 0x10, 0x88, 0xbd, 0xe8, 0xf0, 0x40, 0xff, 0xf7, 0x7d, 0xbf, 0x00, 0xbf, + 0xbc, 0xfe, 0x05, 0x00, 0x24, 0x36, 0x01, 0x00, 0x10, 0xb5, 0x05, 0xf0, + 0x07, 0xff, 0x63, 0x48, 0xb0, 0xf8, 0x2a, 0x03, 0xc0, 0x06, 0x21, 0xd5, + 0x12, 0x4a, 0x11, 0x48, 0x41, 0x69, 0xb2, 0xf8, 0x5c, 0x20, 0x8a, 0x42, + 0x1a, 0xd2, 0x10, 0x49, 0x10, 0x4b, 0x0a, 0x68, 0x1c, 0x78, 0x04, 0x5d, + 0x64, 0xf3, 0x18, 0x62, 0x0a, 0x60, 0x1a, 0x78, 0x02, 0x44, 0x54, 0x79, + 0xd2, 0x7b, 0x52, 0x06, 0x42, 0xea, 0x04, 0x62, 0x4c, 0x68, 0x12, 0x0e, + 0x62, 0xf3, 0x1d, 0x64, 0x4c, 0x60, 0x8a, 0x68, 0x1b, 0x78, 0x18, 0x44, + 0x80, 0x7a, 0x60, 0xf3, 0x18, 0x62, 0x8a, 0x60, 0x10, 0xbd, 0x00, 0xbf, + 0xe4, 0x2d, 0x06, 0x00, 0x50, 0xec, 0x01, 0x00, 0x00, 0xf9, 0x05, 0x30, + 0xb4, 0xe9, 0x01, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, 0x42, 0x48, 0x43, 0x49, + 0x43, 0x4e, 0x45, 0x4a, 0x45, 0x4c, 0x00, 0x25, 0x46, 0x4f, 0x00, 0x68, + 0x00, 0xf0, 0x02, 0x00, 0x08, 0x60, 0x40, 0x49, 0x30, 0x68, 0x08, 0x60, + 0xd6, 0xf8, 0xe0, 0x01, 0x48, 0x60, 0x10, 0x68, 0xe5, 0x76, 0x65, 0x70, + 0x84, 0xf8, 0x4f, 0x50, 0x84, 0xf8, 0x35, 0x50, 0xa5, 0x76, 0x25, 0x70, + 0x88, 0x60, 0x3b, 0x48, 0x83, 0x46, 0x00, 0x68, 0xc8, 0x60, 0x97, 0xf8, + 0x34, 0x02, 0x10, 0xf0, 0x1e, 0x0f, 0x40, 0xd0, 0x38, 0x48, 0x92, 0x46, + 0x00, 0x68, 0x80, 0x47, 0x05, 0x46, 0xd0, 0xbb, 0xdf, 0xf8, 0xd8, 0x80, + 0x04, 0x20, 0x07, 0xf5, 0x0d, 0x75, 0xd8, 0xf8, 0x00, 0x10, 0x88, 0x47, + 0x28, 0x68, 0xdf, 0xf8, 0xcc, 0x90, 0x5f, 0x46, 0x81, 0x07, 0x0b, 0xd5, + 0xd9, 0xf8, 0x04, 0x00, 0x00, 0x21, 0x38, 0x60, 0xd9, 0xf8, 0x0c, 0x00, + 0x30, 0x60, 0x2e, 0x48, 0x02, 0x68, 0x00, 0x20, 0x90, 0x47, 0x28, 0x68, + 0x41, 0x07, 0x0c, 0xd5, 0xd9, 0xf8, 0x00, 0x00, 0x01, 0x21, 0x38, 0x60, + 0xd9, 0xf8, 0x08, 0x00, 0xc6, 0xf8, 0xe0, 0x01, 0x26, 0x48, 0x02, 0x68, + 0x00, 0x20, 0x90, 0x47, 0x28, 0x68, 0xc0, 0x06, 0x0a, 0xd5, 0x24, 0x48, + 0x01, 0x68, 0x39, 0x60, 0x01, 0x21, 0x40, 0x68, 0xca, 0xf8, 0x00, 0x00, + 0x1f, 0x48, 0x02, 0x68, 0x01, 0x20, 0x90, 0x47, 0xd8, 0xf8, 0x00, 0x10, + 0x00, 0x20, 0x00, 0x25, 0x88, 0x47, 0x1d, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x1c, 0x48, 0x00, 0x78, 0xff, 0x28, 0x01, 0xd0, 0x05, 0x28, 0x13, 0xd1, + 0x1a, 0x48, 0x01, 0x68, 0x68, 0x20, 0x88, 0x47, 0x70, 0xb1, 0x68, 0x21, + 0x22, 0x46, 0x68, 0x23, 0x06, 0x46, 0xcc, 0xf7, 0x7f, 0xfd, 0x16, 0x48, + 0x31, 0x46, 0x68, 0x22, 0x03, 0x68, 0x05, 0x20, 0x98, 0x47, 0x30, 0x46, + 0xd2, 0xf7, 0xe4, 0xfb, 0x28, 0x46, 0xbd, 0xe8, 0xf8, 0x8f, 0x00, 0xbf, + 0x48, 0x80, 0x22, 0x40, 0x0c, 0xe7, 0x01, 0x00, 0x58, 0xd6, 0x05, 0x30, + 0x10, 0xe7, 0x01, 0x00, 0x38, 0xf0, 0x05, 0x30, 0x58, 0xe2, 0x01, 0x00, + 0x78, 0xc0, 0x05, 0x30, 0x00, 0x69, 0x08, 0x00, 0x84, 0x9a, 0x08, 0x00, + 0xc0, 0xbd, 0x08, 0x00, 0x74, 0x32, 0x06, 0x00, 0xc4, 0xbd, 0x08, 0x00, + 0x84, 0x32, 0x06, 0x00, 0x8c, 0xbd, 0x08, 0x00, 0x64, 0x8d, 0x08, 0x00, + 0xd4, 0x9b, 0x08, 0x00, 0xe4, 0x9b, 0x08, 0x00, 0x0d, 0x48, 0x01, 0x21, + 0x81, 0x71, 0x01, 0x70, 0x0c, 0x49, 0xb1, 0xf8, 0x00, 0x21, 0x91, 0xf8, + 0xfc, 0x30, 0x6f, 0xf3, 0x5f, 0x22, 0x03, 0xf0, 0x7f, 0x03, 0x82, 0x80, + 0x91, 0xf8, 0xf4, 0x20, 0xb1, 0xf8, 0xf8, 0x10, 0xc3, 0x70, 0x6f, 0xf3, + 0x5f, 0x21, 0x41, 0x81, 0x02, 0xf0, 0x7f, 0x01, 0x41, 0x72, 0x05, 0xf0, + 0x17, 0xbe, 0x00, 0xbf, 0x90, 0xe4, 0x01, 0x00, 0xd0, 0xfc, 0x05, 0x00, + 0x2d, 0xe9, 0xf0, 0x4f, 0x87, 0xb0, 0xdf, 0xf8, 0x18, 0x4a, 0xdf, 0xf8, + 0x18, 0xba, 0x07, 0x46, 0x01, 0x20, 0x48, 0x21, 0x84, 0xf8, 0x4d, 0x06, + 0x58, 0x46, 0xce, 0xf7, 0xb5, 0xfe, 0xdb, 0x4e, 0x04, 0xf2, 0x4c, 0x68, + 0xdf, 0xf8, 0x04, 0x4a, 0xd6, 0xf8, 0x00, 0xa0, 0x20, 0x78, 0x01, 0x28, + 0x18, 0xbf, 0x03, 0x2f, 0x40, 0xf0, 0xd5, 0x83, 0x00, 0xf0, 0x68, 0xfd, + 0x20, 0x78, 0x01, 0x28, 0x04, 0xbf, 0x01, 0x2f, 0xff, 0xf7, 0xbc, 0xff, + 0xdf, 0xf8, 0xe4, 0x19, 0x00, 0x20, 0x00, 0x22, 0x01, 0x97, 0x88, 0x71, + 0x08, 0x70, 0xdf, 0xf8, 0xdc, 0x19, 0x40, 0x31, 0x01, 0x32, 0x08, 0x70, + 0x01, 0xf8, 0x40, 0x0c, 0x04, 0x31, 0x10, 0x2a, 0xf8, 0xd1, 0xdf, 0xf8, + 0xcc, 0x09, 0x00, 0x24, 0x01, 0x68, 0x00, 0x20, 0x88, 0x47, 0xdf, 0xf8, + 0xc4, 0x09, 0x01, 0x68, 0x00, 0x20, 0x88, 0x47, 0xdf, 0xf8, 0xbc, 0x09, + 0x00, 0x21, 0x00, 0x22, 0xff, 0x23, 0x05, 0x68, 0x00, 0x20, 0xa8, 0x47, + 0xdf, 0xf8, 0xb0, 0x09, 0x09, 0x21, 0x6f, 0xf0, 0x7e, 0x02, 0x03, 0x68, + 0xff, 0x20, 0x98, 0x47, 0xdf, 0xf8, 0xa4, 0x09, 0x09, 0x21, 0x6f, 0xf0, + 0x7e, 0x02, 0x03, 0x68, 0xff, 0x20, 0x98, 0x47, 0xdf, 0xf8, 0x98, 0x09, + 0x01, 0x68, 0x00, 0x20, 0x88, 0x47, 0xdf, 0xf8, 0x94, 0x09, 0x00, 0x68, + 0x80, 0x47, 0xdf, 0xf8, 0x90, 0x09, 0x01, 0x68, 0x40, 0xf2, 0x2e, 0x50, + 0x88, 0x47, 0xdf, 0xf8, 0x88, 0x09, 0xdf, 0xf8, 0x8c, 0x99, 0x04, 0x60, + 0xdf, 0xf8, 0x80, 0x09, 0x09, 0xf8, 0x02, 0x4f, 0x89, 0xf8, 0x01, 0x40, + 0x84, 0x70, 0xdf, 0xf8, 0x7c, 0x09, 0x34, 0x68, 0x00, 0x68, 0x80, 0x47, + 0x28, 0xb9, 0xdf, 0xf8, 0x64, 0x19, 0x08, 0x68, 0x40, 0xf0, 0x01, 0x00, + 0x08, 0x60, 0x30, 0x68, 0x00, 0x1b, 0xcb, 0xf8, 0x18, 0x00, 0xdf, 0xf8, + 0x60, 0x09, 0x34, 0x68, 0x00, 0x68, 0x80, 0x47, 0x28, 0xb9, 0xdf, 0xf8, + 0x44, 0x19, 0x08, 0x68, 0x40, 0xf0, 0x04, 0x00, 0x08, 0x60, 0xcd, 0xf8, + 0x0c, 0x80, 0x30, 0x68, 0x00, 0x1b, 0xcb, 0xf8, 0x1c, 0x00, 0xdf, 0xf8, + 0x40, 0x09, 0x34, 0x68, 0x00, 0x68, 0x80, 0x47, 0x28, 0xb9, 0xdf, 0xf8, + 0x20, 0x19, 0x08, 0x68, 0x40, 0xf0, 0x08, 0x00, 0x08, 0x60, 0x30, 0x68, + 0x00, 0x1b, 0xcb, 0xf8, 0x20, 0x00, 0xdf, 0xf8, 0x24, 0x09, 0x00, 0xf5, + 0x37, 0x71, 0x11, 0xf9, 0x08, 0x0f, 0x00, 0x28, 0x05, 0x91, 0x2d, 0xd4, + 0x05, 0x98, 0xc0, 0x7a, 0xc1, 0x07, 0x14, 0xd0, 0x8a, 0x4c, 0x21, 0x68, + 0x49, 0x05, 0x10, 0xd4, 0xdf, 0xf8, 0x08, 0x09, 0xdf, 0xf8, 0x00, 0x69, + 0x19, 0x25, 0x47, 0x1c, 0x28, 0x06, 0x06, 0xd0, 0x30, 0x88, 0x02, 0x38, + 0xb8, 0x47, 0x20, 0x68, 0x01, 0x3d, 0x40, 0x05, 0xf6, 0xd5, 0x05, 0x98, + 0xc0, 0x7a, 0x80, 0x07, 0x12, 0xd5, 0x80, 0x4c, 0x20, 0x68, 0x40, 0x05, + 0x0e, 0xd4, 0xdf, 0xf8, 0xdc, 0x08, 0xdf, 0xf8, 0xd4, 0x68, 0x19, 0x25, + 0x47, 0x1c, 0x28, 0x06, 0x06, 0xd0, 0x30, 0x88, 0x02, 0x38, 0xb8, 0x47, + 0x20, 0x68, 0x01, 0x3d, 0x40, 0x05, 0xf6, 0xd5, 0xdf, 0xf8, 0xc0, 0x08, + 0xcd, 0xf8, 0x08, 0xa0, 0x00, 0x68, 0x80, 0x47, 0xdf, 0xf8, 0xb8, 0x08, + 0x00, 0x68, 0x80, 0x47, 0xdf, 0xf8, 0xb4, 0x08, 0x00, 0x68, 0x80, 0x47, + 0x6d, 0x4d, 0xdf, 0xf8, 0xb0, 0x08, 0x2c, 0x68, 0x00, 0x68, 0x80, 0x47, + 0x28, 0xb9, 0xdf, 0xf8, 0x74, 0x18, 0x08, 0x68, 0x40, 0xf4, 0x80, 0x70, + 0x08, 0x60, 0x28, 0x68, 0xdf, 0xf8, 0x98, 0x68, 0xdf, 0xf8, 0x98, 0x88, + 0x00, 0x27, 0x00, 0x1b, 0x00, 0x24, 0xcb, 0xf8, 0x04, 0x00, 0xd5, 0xf8, + 0x00, 0xa0, 0x00, 0x25, 0x30, 0x68, 0x80, 0x47, 0x38, 0xb1, 0x98, 0xf8, + 0x00, 0x00, 0x02, 0x28, 0x01, 0xd1, 0x01, 0x2c, 0x0d, 0xd9, 0x01, 0x37, + 0x13, 0xe0, 0xdf, 0xf8, 0x38, 0x18, 0x08, 0x68, 0x40, 0xf4, 0x00, 0x70, + 0x08, 0x60, 0x98, 0xf8, 0x00, 0x00, 0x02, 0x28, 0x1f, 0xd1, 0x01, 0x2c, + 0x1d, 0xd8, 0x99, 0xf8, 0x01, 0x00, 0x88, 0xf8, 0x00, 0x50, 0x01, 0x34, + 0x01, 0x30, 0x89, 0xf8, 0x01, 0x00, 0x03, 0x2f, 0xde, 0xd3, 0x01, 0x20, + 0xcd, 0xf7, 0xe4, 0xfd, 0xdf, 0xf8, 0xe8, 0x07, 0x01, 0x68, 0x01, 0x20, + 0x88, 0x47, 0x01, 0x20, 0x05, 0xf0, 0xe8, 0xfc, 0xdf, 0xf8, 0x30, 0x08, + 0x00, 0x68, 0x80, 0x47, 0x00, 0x20, 0x40, 0xf2, 0xd6, 0x51, 0xcc, 0xf7, + 0xe5, 0xfb, 0x46, 0x49, 0x08, 0x68, 0xa0, 0xeb, 0x0a, 0x00, 0xcb, 0xf8, + 0x24, 0x00, 0x08, 0x68, 0x60, 0x21, 0x04, 0x90, 0xdf, 0xf8, 0x10, 0x08, + 0xcf, 0xf7, 0x32, 0xfa, 0x05, 0x98, 0xdf, 0xf8, 0x0c, 0xb8, 0x00, 0x27, + 0x00, 0x26, 0x00, 0x24, 0x90, 0xf8, 0x60, 0x03, 0xc0, 0x07, 0x4f, 0xf0, + 0x02, 0x00, 0x08, 0xbf, 0x01, 0x20, 0x00, 0xeb, 0x40, 0x05, 0x06, 0x90, + 0xdb, 0xf8, 0x00, 0x00, 0x80, 0x47, 0xa0, 0xb9, 0xdf, 0xf8, 0xa0, 0x17, + 0x04, 0xf1, 0x01, 0x0a, 0x08, 0x68, 0x40, 0xf0, 0x10, 0x00, 0x08, 0x60, + 0x06, 0x99, 0x5f, 0xfa, 0x8a, 0xf0, 0x81, 0x42, 0x06, 0xd1, 0x98, 0xf8, + 0x00, 0x00, 0x02, 0x28, 0x37, 0xd1, 0x01, 0x2e, 0x08, 0xd9, 0x34, 0xe0, + 0x54, 0x46, 0x98, 0xf8, 0x00, 0x00, 0x02, 0x28, 0x17, 0xd1, 0x01, 0x2e, + 0x15, 0xd8, 0xa2, 0x46, 0x00, 0x20, 0x60, 0x21, 0x88, 0xf8, 0x00, 0x00, + 0x99, 0xf8, 0x01, 0x00, 0x01, 0x30, 0x89, 0xf8, 0x01, 0x00, 0xdf, 0xf8, + 0x98, 0x07, 0xcf, 0xf7, 0xf5, 0xf9, 0x5f, 0xfa, 0x8a, 0xf4, 0x01, 0x36, + 0x00, 0x2c, 0x18, 0xbf, 0xaa, 0xf1, 0x01, 0x04, 0x00, 0xe0, 0x01, 0x37, + 0xf8, 0xb2, 0x85, 0x42, 0xc6, 0xd8, 0x01, 0x20, 0xcd, 0xf7, 0x7a, 0xfd, + 0xdf, 0xf8, 0x14, 0x07, 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, 0x01, 0x20, + 0x05, 0xf0, 0x7e, 0xfc, 0xdf, 0xf8, 0x5c, 0x07, 0x00, 0x68, 0x80, 0x47, + 0x00, 0x20, 0x40, 0xf2, 0x13, 0x61, 0xcc, 0xf7, 0x7b, 0xfb, 0x05, 0x98, + 0x90, 0xf8, 0x60, 0x03, 0xc0, 0x07, 0x03, 0xd0, 0xdf, 0xf8, 0x4c, 0x07, + 0x00, 0x68, 0x80, 0x47, 0x0c, 0x49, 0xdf, 0xf8, 0xc8, 0xb6, 0xdf, 0xf8, + 0x44, 0x67, 0x00, 0x25, 0x00, 0x27, 0x00, 0x24, 0x08, 0x68, 0x04, 0x9a, + 0x80, 0x1a, 0xcb, 0xf8, 0x0c, 0x00, 0xd1, 0xf8, 0x00, 0xa0, 0x30, 0x68, + 0x80, 0x47, 0x68, 0xb1, 0x98, 0xf8, 0x00, 0x00, 0x02, 0x28, 0x01, 0xd1, + 0x01, 0x2c, 0x13, 0xd9, 0x01, 0x37, 0x19, 0xe0, 0x24, 0x20, 0x00, 0x40, + 0x14, 0xd6, 0x05, 0x30, 0x14, 0xee, 0x05, 0x30, 0xdf, 0xf8, 0xbc, 0x16, + 0x08, 0x68, 0x40, 0xf0, 0x40, 0x00, 0x08, 0x60, 0x98, 0xf8, 0x00, 0x00, + 0x02, 0x28, 0x1f, 0xd1, 0x01, 0x2c, 0x1d, 0xd8, 0x99, 0xf8, 0x01, 0x00, + 0x88, 0xf8, 0x00, 0x50, 0x01, 0x34, 0x01, 0x30, 0x89, 0xf8, 0x01, 0x00, + 0x03, 0x2f, 0xd8, 0xd3, 0x01, 0x20, 0xcd, 0xf7, 0x27, 0xfd, 0xdf, 0xf8, + 0x70, 0x06, 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, 0x01, 0x20, 0x05, 0xf0, + 0x2b, 0xfc, 0xdf, 0xf8, 0xb8, 0x06, 0x00, 0x68, 0x80, 0x47, 0x00, 0x20, + 0x40, 0xf2, 0x4d, 0x61, 0xcc, 0xf7, 0x28, 0xfb, 0xc2, 0x49, 0xdf, 0xf8, + 0xb8, 0x66, 0x08, 0x68, 0xa0, 0xeb, 0x0a, 0x00, 0xcb, 0xf8, 0x28, 0x00, + 0x30, 0x46, 0xd1, 0xf8, 0x00, 0xa0, 0xc0, 0x21, 0xcf, 0xf7, 0x74, 0xf9, + 0xdf, 0xf8, 0xa0, 0x56, 0x00, 0x24, 0x00, 0x27, 0x4f, 0xf0, 0x00, 0x0b, + 0x28, 0x68, 0x80, 0x47, 0x40, 0xb1, 0x98, 0xf8, 0x00, 0x00, 0x02, 0x28, + 0x02, 0xd1, 0xbb, 0xf1, 0x01, 0x0f, 0x0e, 0xd9, 0x01, 0x37, 0x19, 0xe0, + 0xdf, 0xf8, 0x28, 0x16, 0x08, 0x68, 0x40, 0xf0, 0x20, 0x00, 0x08, 0x60, + 0x98, 0xf8, 0x00, 0x00, 0x02, 0x28, 0x25, 0xd1, 0xbb, 0xf1, 0x01, 0x0f, + 0x22, 0xd8, 0x99, 0xf8, 0x01, 0x00, 0xc0, 0x21, 0x88, 0xf8, 0x00, 0x40, + 0x01, 0x30, 0x89, 0xf8, 0x01, 0x00, 0x30, 0x46, 0xcf, 0xf7, 0x4a, 0xf9, + 0x0b, 0xf1, 0x01, 0x0b, 0x03, 0x2f, 0xd7, 0xd3, 0x01, 0x20, 0xcd, 0xf7, + 0xd7, 0xfc, 0xdf, 0xf8, 0xd0, 0x05, 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, + 0x01, 0x20, 0x05, 0xf0, 0xdb, 0xfb, 0xdf, 0xf8, 0x18, 0x06, 0x00, 0x68, + 0x80, 0x47, 0x00, 0x20, 0x40, 0xf2, 0x85, 0x61, 0xcc, 0xf7, 0xd8, 0xfa, + 0x9a, 0x49, 0xdf, 0xf8, 0x94, 0xb5, 0xdf, 0xf8, 0x1c, 0x66, 0x00, 0x25, + 0x00, 0x27, 0x00, 0x24, 0x08, 0x68, 0xa0, 0xeb, 0x0a, 0x00, 0xcb, 0xf8, + 0x2c, 0x00, 0xd1, 0xf8, 0x00, 0xa0, 0x30, 0x68, 0x80, 0x47, 0x38, 0xb1, + 0x98, 0xf8, 0x00, 0x00, 0x02, 0x28, 0x01, 0xd1, 0x01, 0x2c, 0x0d, 0xd9, + 0x01, 0x37, 0x13, 0xe0, 0xdf, 0xf8, 0x94, 0x15, 0x08, 0x68, 0x40, 0xf0, + 0x80, 0x00, 0x08, 0x60, 0x98, 0xf8, 0x00, 0x00, 0x02, 0x28, 0x1f, 0xd1, + 0x01, 0x2c, 0x1d, 0xd8, 0x99, 0xf8, 0x01, 0x00, 0x88, 0xf8, 0x00, 0x50, + 0x01, 0x34, 0x01, 0x30, 0x89, 0xf8, 0x01, 0x00, 0x03, 0x2f, 0xde, 0xd3, + 0x01, 0x20, 0xcd, 0xf7, 0x93, 0xfc, 0xdf, 0xf8, 0x48, 0x05, 0x01, 0x68, + 0x01, 0x20, 0x88, 0x47, 0x01, 0x20, 0x05, 0xf0, 0x97, 0xfb, 0xdf, 0xf8, + 0x90, 0x05, 0x00, 0x68, 0x80, 0x47, 0x00, 0x20, 0x40, 0xf2, 0xbd, 0x61, + 0xcc, 0xf7, 0x94, 0xfa, 0x78, 0x49, 0xdf, 0xf8, 0x9c, 0x65, 0x00, 0x25, + 0x00, 0x27, 0x00, 0x24, 0x08, 0x68, 0xa0, 0xeb, 0x0a, 0x00, 0xcb, 0xf8, + 0x30, 0x00, 0xd1, 0xf8, 0x00, 0xa0, 0x30, 0x68, 0x80, 0x47, 0x38, 0xb1, + 0x98, 0xf8, 0x00, 0x00, 0x02, 0x28, 0x01, 0xd1, 0x01, 0x2c, 0x0d, 0xd9, + 0x01, 0x37, 0x13, 0xe0, 0xdf, 0xf8, 0x10, 0x15, 0x08, 0x68, 0x40, 0xf0, + 0x02, 0x00, 0x08, 0x60, 0x98, 0xf8, 0x00, 0x00, 0x02, 0x28, 0x1f, 0xd1, + 0x01, 0x2c, 0x1d, 0xd8, 0x99, 0xf8, 0x01, 0x00, 0x88, 0xf8, 0x00, 0x50, + 0x01, 0x34, 0x01, 0x30, 0x89, 0xf8, 0x01, 0x00, 0x03, 0x2f, 0xde, 0xd3, + 0x01, 0x20, 0xcd, 0xf7, 0x51, 0xfc, 0xdf, 0xf8, 0xc4, 0x04, 0x01, 0x68, + 0x01, 0x20, 0x88, 0x47, 0x01, 0x20, 0x05, 0xf0, 0x55, 0xfb, 0xdf, 0xf8, + 0x0c, 0x05, 0x00, 0x68, 0x80, 0x47, 0x00, 0x20, 0x40, 0xf2, 0xf2, 0x61, + 0xcc, 0xf7, 0x52, 0xfa, 0x57, 0x4d, 0x28, 0x68, 0xa0, 0xeb, 0x0a, 0x00, + 0xcb, 0xf8, 0x14, 0x00, 0xdf, 0xf8, 0x10, 0x05, 0x2c, 0x68, 0x00, 0x68, + 0x80, 0x47, 0x28, 0x68, 0x00, 0x1b, 0xcb, 0xf8, 0x34, 0x00, 0x05, 0xf0, + 0xb5, 0xff, 0xdf, 0xf8, 0x00, 0x05, 0xd5, 0xf8, 0x00, 0xa0, 0x60, 0x21, + 0xce, 0xf7, 0xe0, 0xfb, 0xdf, 0xf8, 0xf4, 0x54, 0x00, 0x24, 0x00, 0x27, + 0x00, 0x26, 0x28, 0x68, 0x80, 0x47, 0x38, 0xb1, 0x98, 0xf8, 0x00, 0x00, + 0x02, 0x28, 0x01, 0xd1, 0x01, 0x2e, 0x0d, 0xd9, 0x01, 0x37, 0x13, 0xe0, + 0xdf, 0xf8, 0x6c, 0x14, 0x08, 0x68, 0x40, 0xf4, 0x80, 0x50, 0x08, 0x60, + 0x98, 0xf8, 0x00, 0x00, 0x02, 0x28, 0x22, 0xd1, 0x01, 0x2e, 0x20, 0xd8, + 0x99, 0xf8, 0x01, 0x00, 0x88, 0xf8, 0x00, 0x40, 0x01, 0x36, 0x01, 0x30, + 0x89, 0xf8, 0x01, 0x00, 0x03, 0x2f, 0xde, 0xd3, 0x01, 0x20, 0x00, 0xf0, + 0xc3, 0xfa, 0x01, 0x20, 0xcd, 0xf7, 0xfc, 0xfb, 0xdf, 0xf8, 0x18, 0x04, + 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, 0x01, 0x20, 0x05, 0xf0, 0x00, 0xfb, + 0xdf, 0xf8, 0x60, 0x04, 0x00, 0x68, 0x80, 0x47, 0x00, 0x20, 0x40, 0xf2, + 0x44, 0x71, 0xcc, 0xf7, 0xfd, 0xf9, 0x2d, 0x49, 0xdf, 0xf8, 0x7c, 0x64, + 0x00, 0x25, 0x00, 0x27, 0x00, 0x24, 0x08, 0x68, 0xa0, 0xeb, 0x0a, 0x00, + 0xcb, 0xf8, 0x08, 0x00, 0xd1, 0xf8, 0x00, 0xa0, 0x30, 0x68, 0x80, 0x47, + 0x38, 0xb1, 0x98, 0xf8, 0x00, 0x00, 0x02, 0x28, 0x01, 0xd1, 0x01, 0x2c, + 0x0d, 0xd9, 0x01, 0x37, 0x13, 0xe0, 0xdf, 0xf8, 0xe4, 0x13, 0x08, 0x68, + 0x40, 0xf4, 0x00, 0x60, 0x08, 0x60, 0x98, 0xf8, 0x00, 0x00, 0x02, 0x28, + 0x1f, 0xd1, 0x01, 0x2c, 0x1d, 0xd8, 0x99, 0xf8, 0x01, 0x00, 0x88, 0xf8, + 0x00, 0x50, 0x01, 0x34, 0x01, 0x30, 0x89, 0xf8, 0x01, 0x00, 0x03, 0x2f, + 0xde, 0xd3, 0x01, 0x20, 0xcd, 0xf7, 0xba, 0xfb, 0xdf, 0xf8, 0x94, 0x03, + 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, 0x01, 0x20, 0x05, 0xf0, 0xbe, 0xfa, + 0xdf, 0xf8, 0xdc, 0x03, 0x00, 0x68, 0x80, 0x47, 0x00, 0x20, 0x4f, 0xf4, + 0xef, 0x61, 0xcc, 0xf7, 0xbb, 0xf9, 0xd8, 0x49, 0xdf, 0xf8, 0xfc, 0x63, + 0x00, 0x25, 0x00, 0x27, 0x00, 0x24, 0x08, 0x68, 0xa0, 0xeb, 0x0a, 0x00, + 0xcb, 0xf8, 0x38, 0x00, 0xd1, 0xf8, 0x00, 0xa0, 0x30, 0x68, 0x80, 0x47, + 0x50, 0xb1, 0x98, 0xf8, 0x00, 0x00, 0x02, 0x28, 0x01, 0xd1, 0x01, 0x2c, + 0x0f, 0xd9, 0x01, 0x37, 0x15, 0xe0, 0x00, 0xbf, 0x24, 0x20, 0x00, 0x40, + 0xd6, 0x49, 0x08, 0x68, 0x40, 0xf4, 0x80, 0x60, 0x08, 0x60, 0x98, 0xf8, + 0x00, 0x00, 0x02, 0x28, 0x1d, 0xd1, 0x01, 0x2c, 0x1b, 0xd8, 0x99, 0xf8, + 0x01, 0x00, 0x88, 0xf8, 0x00, 0x50, 0x01, 0x34, 0x01, 0x30, 0x89, 0xf8, + 0x01, 0x00, 0x03, 0x2f, 0xdc, 0xd3, 0x01, 0x20, 0xcd, 0xf7, 0x76, 0xfb, + 0xc3, 0x48, 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, 0x01, 0x20, 0x05, 0xf0, + 0x7b, 0xfa, 0xd6, 0x48, 0x00, 0x68, 0x80, 0x47, 0x00, 0x20, 0x40, 0xf2, + 0xac, 0x71, 0xcc, 0xf7, 0x79, 0xf9, 0xb7, 0x49, 0x08, 0x68, 0xa0, 0xeb, + 0x0a, 0x00, 0xcb, 0xf8, 0x3c, 0x00, 0xdd, 0x48, 0xd1, 0xf8, 0x00, 0xa0, + 0x00, 0x78, 0x01, 0x28, 0x03, 0xd0, 0xdb, 0x48, 0x00, 0x78, 0x01, 0x28, + 0x3d, 0xd1, 0xda, 0x48, 0xda, 0x4d, 0x40, 0xf2, 0x01, 0x11, 0x4f, 0xf0, + 0x00, 0x0b, 0x00, 0x27, 0x00, 0x24, 0xa0, 0xf8, 0xb4, 0x12, 0x28, 0x68, + 0x80, 0x47, 0x06, 0x46, 0x20, 0xb3, 0x98, 0xf8, 0x00, 0x00, 0x02, 0x28, + 0x0a, 0xd1, 0x01, 0x2c, 0x08, 0xd8, 0x99, 0xf8, 0x01, 0x00, 0x88, 0xf8, + 0x00, 0xb0, 0x01, 0x34, 0x01, 0x30, 0x89, 0xf8, 0x01, 0x00, 0x00, 0xe0, + 0x01, 0x37, 0x03, 0x2f, 0xe9, 0xd3, 0x01, 0x20, 0xcd, 0xf7, 0x34, 0xfb, + 0xa2, 0x48, 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, 0x01, 0x20, 0x05, 0xf0, + 0x39, 0xfa, 0xb5, 0x48, 0x00, 0x68, 0x80, 0x47, 0x00, 0x20, 0x40, 0xf2, + 0xe4, 0x71, 0xcc, 0xf7, 0x37, 0xf9, 0x02, 0xe0, 0xc2, 0x48, 0x00, 0x68, + 0x80, 0x47, 0xc2, 0x48, 0xdf, 0xf8, 0x48, 0xb2, 0x01, 0x21, 0x01, 0x70, + 0x05, 0xe0, 0x00, 0x26, 0xac, 0xe0, 0xbb, 0x48, 0x00, 0x26, 0xa0, 0xf8, + 0xb4, 0x62, 0x8e, 0x4c, 0x00, 0x25, 0x20, 0x68, 0xa0, 0xeb, 0x0a, 0x00, + 0xcb, 0xf8, 0x44, 0x00, 0x00, 0x20, 0xcd, 0xf7, 0x0b, 0xfb, 0xa4, 0x48, + 0x00, 0x68, 0x80, 0x47, 0xd4, 0xf8, 0x00, 0xb0, 0xb5, 0x4f, 0x00, 0x24, + 0x4f, 0xf0, 0x00, 0x0a, 0x38, 0x68, 0x80, 0x47, 0x40, 0xb1, 0x98, 0xf8, + 0x00, 0x00, 0x02, 0x28, 0x02, 0xd1, 0xba, 0xf1, 0x01, 0x0f, 0x0d, 0xd9, + 0x01, 0x34, 0x14, 0xe0, 0x8a, 0x49, 0x08, 0x68, 0x40, 0xf4, 0x00, 0x50, + 0x08, 0x60, 0x98, 0xf8, 0x00, 0x00, 0x02, 0x28, 0x1f, 0xd1, 0xba, 0xf1, + 0x01, 0x0f, 0x1c, 0xd8, 0x99, 0xf8, 0x01, 0x00, 0x88, 0xf8, 0x00, 0x50, + 0x0a, 0xf1, 0x01, 0x0a, 0x01, 0x30, 0x89, 0xf8, 0x01, 0x00, 0x03, 0x2c, + 0xdc, 0xd3, 0x01, 0x20, 0xcd, 0xf7, 0xdc, 0xfa, 0x76, 0x48, 0x01, 0x68, + 0x01, 0x20, 0x88, 0x47, 0x01, 0x20, 0x05, 0xf0, 0xe1, 0xf9, 0x89, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x00, 0x20, 0x40, 0xf6, 0x33, 0x01, 0xcc, 0xf7, + 0xdf, 0xf8, 0xec, 0x4c, 0x68, 0x49, 0x20, 0x68, 0xa0, 0xeb, 0x0b, 0x00, + 0x08, 0x64, 0x82, 0x48, 0x00, 0x68, 0x80, 0x47, 0x20, 0x68, 0x95, 0x4f, + 0x4f, 0xf0, 0x00, 0x0b, 0x00, 0x24, 0x00, 0x25, 0x06, 0x90, 0x38, 0x68, + 0x80, 0x47, 0x38, 0xb1, 0x98, 0xf8, 0x00, 0x00, 0x02, 0x28, 0x01, 0xd1, + 0x01, 0x2d, 0x0c, 0xd9, 0x01, 0x34, 0x12, 0xe0, 0x68, 0x49, 0x08, 0x68, + 0x40, 0xf4, 0x80, 0x40, 0x08, 0x60, 0x98, 0xf8, 0x00, 0x00, 0x02, 0x28, + 0x22, 0xd1, 0x01, 0x2d, 0x20, 0xd8, 0x99, 0xf8, 0x01, 0x00, 0x88, 0xf8, + 0x00, 0xb0, 0x01, 0x35, 0x01, 0x30, 0x89, 0xf8, 0x01, 0x00, 0x03, 0x2c, + 0xdf, 0xd3, 0x83, 0x48, 0x90, 0xf8, 0x73, 0x01, 0xcd, 0xf7, 0x98, 0xfa, + 0x54, 0x4d, 0x01, 0x20, 0x01, 0x26, 0x29, 0x68, 0x88, 0x47, 0xdf, 0xf8, + 0xa0, 0xa1, 0xda, 0xf8, 0x00, 0x00, 0x80, 0x47, 0xdd, 0xf8, 0x0c, 0x80, + 0xdf, 0xf8, 0x20, 0xb1, 0xdd, 0xe9, 0x01, 0x79, 0x48, 0x4c, 0x09, 0xe0, + 0xdd, 0xf8, 0x0c, 0x80, 0xdf, 0xf8, 0x10, 0xb1, 0xdd, 0xe9, 0x01, 0x79, + 0x44, 0x4c, 0x48, 0x4d, 0xdf, 0xf8, 0x74, 0xa1, 0xc3, 0x48, 0x00, 0x68, + 0x06, 0x99, 0x40, 0x1a, 0x29, 0x68, 0xcb, 0xf8, 0x10, 0x00, 0x01, 0x20, + 0x88, 0x47, 0xda, 0xf8, 0x00, 0x00, 0x80, 0x47, 0x6d, 0x48, 0x00, 0x68, + 0x80, 0x47, 0xca, 0x46, 0x00, 0x20, 0x4f, 0xf0, 0x00, 0x09, 0xcd, 0xf7, + 0x67, 0xfa, 0x44, 0x48, 0x04, 0x21, 0x00, 0x22, 0x00, 0x23, 0x81, 0x70, + 0x3a, 0x48, 0x00, 0x21, 0x05, 0x68, 0x00, 0x20, 0xa8, 0x47, 0x39, 0x48, + 0x00, 0x21, 0x6f, 0xf0, 0x7e, 0x02, 0x03, 0x68, 0x00, 0x20, 0x98, 0x47, + 0x36, 0x48, 0x00, 0x21, 0x6f, 0xf0, 0x7e, 0x02, 0x03, 0x68, 0x00, 0x20, + 0x98, 0x47, 0x03, 0x2f, 0x84, 0xf8, 0x00, 0x90, 0x02, 0xd0, 0x5c, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x30, 0x46, 0x05, 0xf0, 0x51, 0xf9, 0x5a, 0x48, + 0x00, 0x68, 0x80, 0x47, 0xa6, 0x48, 0x23, 0x4a, 0x00, 0x21, 0x48, 0x23, + 0x00, 0x68, 0xa0, 0xeb, 0x0a, 0x00, 0xcb, 0xf8, 0x00, 0x00, 0x55, 0x48, + 0x05, 0x68, 0x40, 0xf2, 0x35, 0x70, 0xa8, 0x47, 0x98, 0xf8, 0x00, 0x00, + 0x88, 0xf8, 0x01, 0x90, 0x01, 0x28, 0x2d, 0xd1, 0x50, 0x48, 0x01, 0x68, + 0x41, 0xf0, 0x70, 0x41, 0x01, 0x60, 0x41, 0x68, 0x41, 0xf0, 0x40, 0x41, + 0x41, 0x60, 0x4d, 0x48, 0xc1, 0x69, 0x41, 0xf4, 0xc0, 0x61, 0xc1, 0x61, + 0x01, 0x68, 0x41, 0xf4, 0x40, 0x71, 0x01, 0x60, 0x49, 0x49, 0x0a, 0x68, + 0x42, 0xf0, 0x70, 0x42, 0x0a, 0x60, 0x4a, 0x68, 0x42, 0xf0, 0x40, 0x42, + 0x4a, 0x60, 0xc1, 0x69, 0x41, 0xf4, 0xc0, 0x71, 0xc1, 0x61, 0x41, 0x6a, + 0x41, 0xf4, 0x40, 0x71, 0x41, 0x62, 0x01, 0x20, 0x03, 0x21, 0xce, 0xf7, + 0x3f, 0xfc, 0x01, 0x20, 0x03, 0x21, 0xcc, 0xf7, 0x0f, 0xff, 0x00, 0x20, + 0x88, 0xf8, 0x00, 0x00, 0x00, 0x20, 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x64, 0xd4, 0x05, 0x00, 0xe4, 0xfe, 0x05, 0x00, 0x24, 0x20, 0x00, 0x40, + 0xa6, 0x58, 0x01, 0x00, 0x90, 0xe4, 0x01, 0x00, 0xf0, 0xe2, 0x01, 0x00, + 0x9c, 0xfd, 0x08, 0x00, 0x88, 0xe5, 0x08, 0x00, 0x04, 0x99, 0x08, 0x00, + 0x48, 0x97, 0x08, 0x00, 0x4c, 0x97, 0x08, 0x00, 0x40, 0xbc, 0x08, 0x00, + 0x54, 0xbc, 0x08, 0x00, 0x4c, 0xfd, 0x08, 0x00, 0x98, 0xe9, 0x01, 0x00, + 0x74, 0x2a, 0x01, 0x00, 0x9c, 0xe9, 0x01, 0x00, 0x50, 0xfd, 0x08, 0x00, + 0x44, 0xbc, 0x08, 0x00, 0x54, 0xfd, 0x08, 0x00, 0x00, 0x69, 0x08, 0x00, + 0x34, 0xec, 0x01, 0x00, 0x40, 0xec, 0x01, 0x00, 0x3c, 0xfc, 0x08, 0x00, + 0x50, 0xbc, 0x08, 0x00, 0x34, 0xbc, 0x08, 0x00, 0x58, 0xfd, 0x08, 0x00, + 0x5c, 0xfd, 0x08, 0x00, 0x60, 0x14, 0x01, 0x00, 0x60, 0xfd, 0x08, 0x00, + 0x30, 0xe4, 0x01, 0x00, 0x64, 0xfd, 0x08, 0x00, 0x68, 0xfd, 0x08, 0x00, + 0x6c, 0xfd, 0x08, 0x00, 0x70, 0xe3, 0x01, 0x00, 0x70, 0xfd, 0x08, 0x00, + 0x74, 0xfd, 0x08, 0x00, 0x78, 0xfd, 0x08, 0x00, 0x4c, 0xbc, 0x08, 0x00, + 0x58, 0xe1, 0x01, 0x00, 0x7c, 0xfd, 0x08, 0x00, 0x80, 0xfd, 0x08, 0x00, + 0x84, 0xfd, 0x08, 0x00, 0xa8, 0x58, 0x01, 0x00, 0xa9, 0x58, 0x01, 0x00, + 0x98, 0xca, 0x01, 0x00, 0x84, 0x9a, 0x08, 0x00, 0x98, 0xfd, 0x08, 0x00, + 0xa7, 0x58, 0x01, 0x00, 0x88, 0xfd, 0x08, 0x00, 0x8c, 0xfd, 0x08, 0x00, + 0x8c, 0x7e, 0x08, 0x00, 0x24, 0xbc, 0x08, 0x00, 0xa4, 0xfd, 0x08, 0x00, + 0x90, 0xfd, 0x08, 0x00, 0x78, 0x9b, 0x08, 0x00, 0x28, 0xd8, 0x05, 0x30, + 0x5c, 0xc0, 0x05, 0x30, 0x28, 0xf0, 0x05, 0x30, 0x10, 0xb5, 0x1f, 0x48, + 0x90, 0xf8, 0xef, 0x12, 0xca, 0x07, 0x02, 0xd1, 0x1d, 0x4a, 0x00, 0x23, + 0x16, 0xe0, 0x1c, 0x4a, 0x44, 0xf2, 0x24, 0x14, 0x13, 0x68, 0x23, 0x43, + 0x13, 0x60, 0x90, 0xf9, 0xe4, 0x22, 0x00, 0x2a, 0x0d, 0xd4, 0x18, 0x4a, + 0x13, 0x68, 0x43, 0xf0, 0x02, 0x03, 0x13, 0x60, 0x16, 0x4a, 0x13, 0x68, + 0x23, 0xf0, 0x30, 0x03, 0x13, 0x60, 0x13, 0x68, 0x43, 0xf0, 0x30, 0x03, + 0x13, 0x60, 0x89, 0x07, 0x02, 0xd4, 0x12, 0x48, 0x00, 0x21, 0x16, 0xe0, + 0x10, 0x49, 0x44, 0xf2, 0x24, 0x13, 0x0a, 0x68, 0x1a, 0x43, 0x0a, 0x60, + 0x90, 0xf9, 0xe4, 0x02, 0x00, 0x28, 0x0d, 0xd4, 0x09, 0x48, 0x01, 0x68, + 0x41, 0xf0, 0x02, 0x01, 0x01, 0x60, 0x08, 0x48, 0x01, 0x68, 0x21, 0xf0, + 0xc0, 0x01, 0x01, 0x60, 0x01, 0x68, 0x41, 0xf0, 0xc0, 0x01, 0x01, 0x60, + 0x10, 0xbd, 0x00, 0xbf, 0x00, 0x69, 0x08, 0x00, 0x10, 0xd6, 0x05, 0x30, + 0x48, 0x80, 0x02, 0x40, 0x54, 0xc0, 0x05, 0x30, 0x10, 0xee, 0x05, 0x30, + 0x00, 0x28, 0x41, 0xd0, 0xf8, 0xb5, 0x21, 0x4c, 0x41, 0xf2, 0x3c, 0x01, + 0x20, 0x46, 0xce, 0xf7, 0xeb, 0xf8, 0x1f, 0x48, 0x41, 0xf2, 0x34, 0x02, + 0x1e, 0x4e, 0x04, 0xf6, 0x1c, 0x03, 0x00, 0x25, 0x01, 0x68, 0xa1, 0x50, + 0x41, 0xf2, 0x14, 0x01, 0x1b, 0x4a, 0x21, 0x44, 0x9e, 0x50, 0x01, 0x35, + 0x80, 0xce, 0xff, 0x2d, 0x80, 0xc3, 0xf9, 0xd1, 0xff, 0x23, 0x18, 0x4e, + 0x00, 0x25, 0x84, 0xf8, 0x20, 0x30, 0x04, 0xf6, 0x18, 0x43, 0x9e, 0x50, + 0x01, 0x35, 0x80, 0xce, 0xff, 0x2d, 0x80, 0xc3, 0xf9, 0xd1, 0x13, 0x4a, + 0x8a, 0x60, 0x12, 0x68, 0xca, 0x60, 0x12, 0x4a, 0x0a, 0x60, 0x12, 0x68, + 0x4a, 0x60, 0x11, 0x4a, 0x0a, 0x61, 0x13, 0x68, 0x4b, 0x61, 0x02, 0xf5, + 0x20, 0x63, 0x8b, 0x61, 0xd2, 0xf8, 0x00, 0x2a, 0xca, 0x61, 0xff, 0x22, + 0x84, 0xf8, 0x21, 0x20, 0x00, 0x68, 0x0a, 0x6a, 0x80, 0x1a, 0x48, 0x62, + 0xbd, 0xe8, 0xf8, 0x40, 0x70, 0x47, 0x00, 0xbf, 0x2c, 0xff, 0x05, 0x00, + 0x24, 0x20, 0x00, 0x40, 0x04, 0xd2, 0x00, 0x40, 0x08, 0xf8, 0xff, 0xff, + 0x04, 0xdc, 0x00, 0x40, 0x04, 0x0e, 0x03, 0x40, 0x00, 0x0e, 0x23, 0x40, + 0x00, 0x72, 0x23, 0x40, 0x2d, 0xe9, 0xf0, 0x47, 0x82, 0x46, 0x54, 0x48, + 0xdf, 0xf8, 0x50, 0x81, 0x0c, 0x46, 0x06, 0x68, 0xd8, 0xf8, 0x00, 0x10, + 0x43, 0x20, 0x88, 0x47, 0x51, 0x4a, 0x00, 0x21, 0x51, 0x4f, 0x10, 0x68, + 0x00, 0xf0, 0x0f, 0x00, 0x01, 0x38, 0x02, 0x28, 0x38, 0xbf, 0x01, 0x21, + 0x87, 0xf8, 0xc2, 0x12, 0x4c, 0xb1, 0xc6, 0xf3, 0x80, 0x70, 0xba, 0xf1, + 0x01, 0x0f, 0x14, 0xbf, 0x4a, 0x49, 0x4b, 0x49, 0x09, 0x68, 0x09, 0x0c, + 0x06, 0xe0, 0xba, 0xf1, 0x01, 0x0f, 0x14, 0xbf, 0x46, 0x49, 0x47, 0x49, + 0xf0, 0x0f, 0x09, 0x68, 0x70, 0xb3, 0x01, 0xf0, 0x0f, 0x06, 0x21, 0x46, + 0x15, 0x46, 0x30, 0x46, 0x05, 0xf0, 0x80, 0xf9, 0x01, 0x28, 0x25, 0xd1, + 0x41, 0x48, 0x29, 0x46, 0x07, 0xf5, 0x2f, 0x79, 0x27, 0x44, 0x00, 0x68, + 0x29, 0x68, 0x89, 0xf8, 0x03, 0x10, 0x87, 0xf8, 0xb8, 0x62, 0x07, 0xf5, + 0x2e, 0x76, 0xec, 0xb1, 0x81, 0x03, 0x54, 0xbf, 0x00, 0xf0, 0x7f, 0x00, + 0xc0, 0xf3, 0x05, 0x20, 0x87, 0xf8, 0xbc, 0x02, 0x38, 0x49, 0x37, 0x48, + 0x0a, 0x68, 0x20, 0x44, 0xc2, 0xf3, 0x00, 0x62, 0x80, 0xf8, 0xa0, 0x20, + 0x09, 0x68, 0x80, 0xf8, 0xa2, 0x10, 0x34, 0x48, 0x00, 0x68, 0x87, 0xf8, + 0xc0, 0x02, 0x1b, 0xe0, 0xd8, 0xf8, 0x00, 0x10, 0x44, 0x20, 0xbd, 0xe8, + 0xf0, 0x47, 0x08, 0x47, 0xc1, 0x03, 0x54, 0xbf, 0x00, 0xf0, 0x7f, 0x00, + 0xc0, 0xf3, 0x05, 0x20, 0x89, 0xf8, 0x00, 0x00, 0x28, 0x4a, 0x2b, 0x48, + 0x01, 0x68, 0xc1, 0xf3, 0x00, 0x61, 0x82, 0xf8, 0xa0, 0x10, 0x00, 0x68, + 0x82, 0xf8, 0xa2, 0x00, 0x27, 0x48, 0x00, 0x68, 0x89, 0xf8, 0x04, 0x00, + 0xfe, 0xf7, 0xf0, 0xfa, 0x28, 0xb1, 0xd4, 0x48, 0x90, 0xf8, 0xe4, 0x02, + 0x00, 0xf0, 0x0f, 0x00, 0x02, 0xe0, 0xd2, 0x48, 0x20, 0x44, 0x40, 0x7b, + 0xd0, 0x4b, 0x04, 0xeb, 0x84, 0x02, 0x31, 0x78, 0xba, 0xf1, 0x00, 0x0f, + 0x03, 0xeb, 0x82, 0x12, 0x02, 0xeb, 0x40, 0x10, 0x08, 0x44, 0x14, 0xbf, + 0x00, 0xf5, 0x3b, 0x70, 0x00, 0xf5, 0x37, 0x70, 0x97, 0xf8, 0xc0, 0x12, + 0x00, 0x78, 0x08, 0x1a, 0x99, 0xf8, 0x06, 0x10, 0x89, 0xf8, 0x09, 0x00, + 0x40, 0xb2, 0x01, 0x29, 0xc2, 0x49, 0x14, 0xbf, 0x91, 0xf8, 0x11, 0x13, + 0x91, 0xf8, 0x12, 0x13, 0x49, 0x42, 0x88, 0x42, 0xb4, 0xda, 0x0a, 0x48, + 0x00, 0x21, 0x20, 0x44, 0x80, 0xf8, 0xa0, 0x10, 0xae, 0xe7, 0x00, 0xbf, + 0x10, 0xc0, 0x05, 0x30, 0x00, 0x9d, 0x08, 0x00, 0x20, 0x00, 0x23, 0x40, + 0x98, 0xca, 0x01, 0x00, 0x24, 0x20, 0x21, 0x40, 0x40, 0x10, 0x21, 0x40, + 0x14, 0xc0, 0x05, 0x30, 0xd8, 0x21, 0x06, 0x00, 0x08, 0x54, 0x05, 0x30, + 0x70, 0x7a, 0x23, 0x40, 0x08, 0x50, 0x05, 0x30, 0x90, 0x71, 0x23, 0x40, + 0xf8, 0xb5, 0xfe, 0xf7, 0xa1, 0xfa, 0x40, 0xb1, 0xac, 0x48, 0xad, 0x49, + 0x90, 0xf8, 0xe4, 0x02, 0x00, 0xf0, 0x0f, 0x00, 0x01, 0xf8, 0x0d, 0x0f, + 0x48, 0x70, 0x04, 0xf0, 0x25, 0xff, 0x21, 0x48, 0x40, 0x79, 0x01, 0x28, + 0x2f, 0xd1, 0xad, 0x48, 0x00, 0x21, 0xae, 0x4a, 0x20, 0x4b, 0xa0, 0xf8, + 0xb4, 0x12, 0xa3, 0x48, 0x40, 0x7b, 0x02, 0xeb, 0x40, 0x10, 0x42, 0x1c, + 0x12, 0xf8, 0x01, 0x4c, 0x15, 0x78, 0x56, 0x78, 0x97, 0x78, 0x01, 0x31, + 0x04, 0x32, 0x03, 0x29, 0x44, 0xea, 0x05, 0x24, 0x44, 0xea, 0x06, 0x44, + 0x44, 0xea, 0x07, 0x64, 0x10, 0xc3, 0xef, 0xd1, 0x15, 0x4a, 0x00, 0x21, + 0x00, 0x23, 0x44, 0x18, 0x01, 0x33, 0x25, 0x7c, 0x66, 0x7c, 0xa7, 0x7c, + 0xe4, 0x7c, 0x03, 0x2b, 0x45, 0xea, 0x06, 0x25, 0x45, 0xea, 0x07, 0x45, + 0x45, 0xea, 0x04, 0x64, 0x54, 0x50, 0x01, 0xf1, 0x04, 0x01, 0xee, 0xd1, + 0xf8, 0xbd, 0x08, 0x48, 0x00, 0x78, 0x01, 0x28, 0x03, 0xd0, 0x07, 0x48, + 0x00, 0x78, 0x01, 0x28, 0xf6, 0xd1, 0x91, 0x48, 0x40, 0xf2, 0x01, 0x11, + 0xa0, 0xf8, 0xb4, 0x12, 0xf8, 0xbd, 0x00, 0xbf, 0x48, 0xdc, 0x05, 0x00, + 0xa8, 0x58, 0x01, 0x00, 0xa9, 0x58, 0x01, 0x00, 0xc0, 0xe2, 0x01, 0x00, + 0xd8, 0xe2, 0x01, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, 0x93, 0xb0, 0x7f, 0x4b, + 0x7f, 0x4d, 0x86, 0x4c, 0x4f, 0xf0, 0x00, 0x08, 0xb3, 0xf8, 0x06, 0x03, + 0x29, 0x46, 0x08, 0x95, 0x93, 0xf8, 0x04, 0x23, 0x93, 0xf8, 0x03, 0x13, + 0x25, 0xf8, 0x04, 0x0f, 0x93, 0xf8, 0xdc, 0x02, 0x93, 0xf8, 0x05, 0x33, + 0xa9, 0x70, 0xea, 0x70, 0x0c, 0x95, 0x00, 0xf0, 0x80, 0x00, 0x2b, 0x71, + 0x68, 0x71, 0x74, 0x48, 0x07, 0x90, 0x74, 0x48, 0x06, 0x90, 0x74, 0x48, + 0x05, 0x90, 0x74, 0x48, 0x04, 0x90, 0xb8, 0xf1, 0x07, 0x0f, 0x03, 0xd3, + 0xb8, 0xf1, 0x0c, 0x0f, 0x40, 0x46, 0x00, 0xd3, 0x07, 0x20, 0xc1, 0x1f, + 0x69, 0x48, 0x00, 0x22, 0xcd, 0xf8, 0x28, 0x80, 0x08, 0x44, 0x00, 0xf2, + 0xe6, 0x20, 0xcd, 0xe9, 0x01, 0x01, 0x48, 0x00, 0x03, 0x90, 0x64, 0x48, + 0x03, 0x99, 0xb0, 0xf8, 0xde, 0x02, 0xc8, 0x40, 0x00, 0xf0, 0x03, 0x00, + 0x41, 0x1e, 0x02, 0x29, 0x06, 0xd2, 0x65, 0x49, 0x02, 0xeb, 0x82, 0x00, + 0x08, 0x44, 0x02, 0x99, 0x47, 0x56, 0x05, 0xe0, 0x03, 0x28, 0x12, 0xbf, + 0x00, 0x27, 0x01, 0x98, 0x90, 0xf9, 0x00, 0x70, 0x08, 0x99, 0x02, 0xeb, + 0x82, 0x00, 0x4f, 0xf0, 0x00, 0x0b, 0x4f, 0xf0, 0x00, 0x0a, 0x09, 0x92, + 0x01, 0xeb, 0x80, 0x11, 0x0b, 0x91, 0x04, 0x99, 0x01, 0xeb, 0xc0, 0x11, + 0x10, 0x91, 0x05, 0x99, 0x01, 0xeb, 0xc0, 0x11, 0x0f, 0x91, 0x06, 0x99, + 0x01, 0xeb, 0xc0, 0x11, 0x0e, 0x91, 0x07, 0x99, 0x01, 0xeb, 0xc0, 0x10, + 0x0d, 0x90, 0x4b, 0x48, 0x00, 0xf2, 0x1d, 0x39, 0x0c, 0x98, 0x80, 0x78, + 0x80, 0x45, 0x08, 0xd9, 0xb8, 0xf1, 0x0b, 0x0f, 0x48, 0x46, 0x05, 0xd8, + 0x45, 0x48, 0x50, 0x44, 0x00, 0xf2, 0x13, 0x30, 0x00, 0xe0, 0x48, 0x46, + 0x0d, 0x9d, 0x49, 0x4a, 0x55, 0xf8, 0x1b, 0x10, 0xc1, 0xf3, 0x44, 0x31, + 0x90, 0xf9, 0x00, 0x00, 0x13, 0x68, 0x12, 0xaa, 0x38, 0x1a, 0x80, 0x00, + 0x98, 0x47, 0x06, 0x46, 0x0f, 0x98, 0x10, 0x9a, 0x12, 0x99, 0xb8, 0xf1, + 0x0b, 0x0f, 0xa4, 0xf8, 0xee, 0x62, 0x50, 0xf8, 0x1b, 0x00, 0x84, 0xf8, + 0xf0, 0x12, 0x42, 0xf8, 0x1b, 0x00, 0x55, 0xf8, 0x1b, 0x00, 0x0e, 0x9a, + 0x20, 0xf4, 0x78, 0x30, 0x40, 0xea, 0x41, 0x30, 0x42, 0xf8, 0x1b, 0x00, + 0x2a, 0xd8, 0x0b, 0x98, 0xdf, 0xf8, 0xe0, 0x80, 0x3c, 0x46, 0x11, 0xaf, + 0x31, 0x46, 0x3a, 0x46, 0x00, 0xeb, 0x0b, 0x05, 0xd8, 0xf8, 0x00, 0x30, + 0x95, 0xf8, 0x5c, 0x00, 0x98, 0x47, 0x95, 0xf8, 0x5c, 0x10, 0x9d, 0xf8, + 0x44, 0x20, 0x95, 0xf8, 0x6c, 0x00, 0xd8, 0xf8, 0x00, 0x30, 0x11, 0x44, + 0x3a, 0x46, 0x27, 0x46, 0x85, 0xf8, 0x5c, 0x10, 0x85, 0xf8, 0xdc, 0x12, + 0x31, 0x46, 0x98, 0x47, 0x95, 0xf8, 0x6c, 0x00, 0x9d, 0xf8, 0x44, 0x10, + 0xdd, 0xf8, 0x28, 0x80, 0x25, 0x4c, 0x08, 0x44, 0x85, 0xf8, 0xec, 0x02, + 0x85, 0xf8, 0x6c, 0x00, 0x0a, 0xf1, 0x01, 0x0a, 0x09, 0xf1, 0x01, 0x09, + 0x0b, 0xf1, 0x20, 0x0b, 0xba, 0xf1, 0x0a, 0x0f, 0x98, 0xd1, 0x09, 0x98, + 0x01, 0x22, 0x00, 0x28, 0x3f, 0xf4, 0x5f, 0xaf, 0x08, 0x98, 0x08, 0xf1, + 0x01, 0x08, 0xb8, 0xf1, 0x10, 0x0f, 0x00, 0xf1, 0x01, 0x00, 0x08, 0x90, + 0x04, 0x98, 0x00, 0xf1, 0x04, 0x00, 0x04, 0x90, 0x05, 0x98, 0x00, 0xf1, + 0x04, 0x00, 0x05, 0x90, 0x06, 0x98, 0x00, 0xf1, 0x04, 0x00, 0x06, 0x90, + 0x07, 0x98, 0x00, 0xf1, 0x04, 0x00, 0x07, 0x90, 0x7f, 0xf4, 0x31, 0xaf, + 0x0c, 0x98, 0x4f, 0xf4, 0xa0, 0x71, 0x4f, 0xf4, 0xa0, 0x73, 0x00, 0xf5, + 0x36, 0x72, 0x0d, 0x48, 0xcb, 0xf7, 0xec, 0xfc, 0x13, 0xb0, 0xbd, 0xe8, + 0xf0, 0x8f, 0x00, 0xbf, 0x00, 0x69, 0x08, 0x00, 0xf0, 0xd1, 0x01, 0x00, + 0x58, 0xd7, 0x01, 0x00, 0x58, 0xdc, 0x01, 0x00, 0xb4, 0x10, 0x06, 0x00, + 0xb4, 0x15, 0x06, 0x00, 0xa8, 0x10, 0x06, 0x00, 0xac, 0xfb, 0x08, 0x00, + 0x98, 0xca, 0x01, 0x00, 0xb0, 0xfb, 0x08, 0x00, 0x68, 0x0f, 0x06, 0x00, + 0x2d, 0xe9, 0xf0, 0x4f, 0x9f, 0xb0, 0xdf, 0xf8, 0xa4, 0x14, 0x00, 0x20, + 0xcd, 0xe9, 0x1d, 0x00, 0x91, 0xf8, 0xca, 0x02, 0x80, 0x07, 0x00, 0xf1, + 0x45, 0x82, 0xdf, 0xf8, 0x94, 0x04, 0x01, 0xf5, 0x25, 0x78, 0x01, 0x68, + 0x41, 0x20, 0x88, 0x47, 0x1d, 0xa8, 0xdf, 0xf8, 0x80, 0x14, 0xcd, 0xf8, + 0x60, 0x80, 0x04, 0x30, 0x15, 0x90, 0xdf, 0xf8, 0x7c, 0x04, 0x04, 0x30, + 0x12, 0x90, 0xdf, 0xf8, 0x78, 0x04, 0xc4, 0x30, 0x11, 0x90, 0x09, 0x20, + 0x1a, 0x90, 0x05, 0x20, 0x14, 0x90, 0x00, 0x20, 0x06, 0x90, 0x00, 0x20, + 0x0c, 0x18, 0x07, 0x46, 0x94, 0xf8, 0xbc, 0x02, 0x90, 0xb1, 0x94, 0xf8, + 0xb4, 0x02, 0x78, 0xb1, 0x94, 0xf8, 0xb6, 0x02, 0xa8, 0xb1, 0xfe, 0xf7, + 0xf9, 0xf8, 0x50, 0xb1, 0xdf, 0xf8, 0x50, 0x04, 0x90, 0xf8, 0xe4, 0x02, + 0x00, 0xf0, 0x0f, 0x00, 0x06, 0x90, 0x1a, 0x90, 0x14, 0x90, 0x08, 0xe0, + 0xe8, 0xe1, 0xdf, 0xf8, 0x2c, 0x04, 0x38, 0x44, 0x41, 0x7b, 0x08, 0x46, + 0x06, 0x91, 0x1a, 0x91, 0x14, 0x91, 0x04, 0xf5, 0x2d, 0x70, 0x01, 0x90, + 0x12, 0x98, 0x40, 0x78, 0x0f, 0x28, 0x00, 0xf2, 0x88, 0x81, 0x04, 0xf5, + 0x2f, 0x71, 0x00, 0x2f, 0x07, 0xeb, 0x87, 0x02, 0x0c, 0x91, 0xd4, 0x49, + 0x04, 0xbf, 0x4d, 0xf2, 0x14, 0x61, 0xc3, 0xf2, 0x05, 0x01, 0x0b, 0x91, + 0xd1, 0x49, 0x04, 0xbf, 0x4c, 0xf2, 0xa4, 0x01, 0xc3, 0xf2, 0x05, 0x01, + 0x0a, 0x91, 0xcf, 0x49, 0x04, 0xbf, 0x47, 0xf2, 0x1c, 0x11, 0xc4, 0xf2, + 0x23, 0x01, 0x04, 0x91, 0xcc, 0x49, 0x04, 0xbf, 0x47, 0xf2, 0x2c, 0x11, + 0xc4, 0xf2, 0x23, 0x01, 0x05, 0x91, 0x06, 0x9b, 0x09, 0x92, 0x0d, 0x94, + 0x16, 0x97, 0xdf, 0xf8, 0xb8, 0x13, 0x01, 0xeb, 0x42, 0x01, 0x03, 0x91, + 0x04, 0xf5, 0x30, 0x71, 0x08, 0x91, 0xdf, 0xf8, 0xc4, 0x13, 0x39, 0x44, + 0xa2, 0x31, 0x07, 0x91, 0x91, 0x01, 0x12, 0x9a, 0x01, 0xeb, 0x43, 0x11, + 0x01, 0x44, 0x11, 0x44, 0x01, 0xf5, 0x3a, 0x71, 0x13, 0x91, 0x59, 0x1e, + 0x02, 0x91, 0x05, 0x46, 0x0b, 0x28, 0x11, 0x98, 0x8c, 0xbf, 0x80, 0x78, + 0x00, 0x88, 0xe8, 0x40, 0xc0, 0x07, 0x00, 0xf0, 0x36, 0x81, 0x12, 0x98, + 0x40, 0x78, 0x10, 0xb1, 0x0b, 0x2d, 0x00, 0xf2, 0x30, 0x81, 0x12, 0x98, + 0x00, 0x78, 0x85, 0x42, 0x02, 0xd3, 0x0c, 0x2d, 0x2e, 0x46, 0x00, 0xd3, + 0x06, 0x46, 0x30, 0x46, 0x39, 0x46, 0x04, 0xf0, 0xcd, 0xfe, 0x00, 0x28, + 0x00, 0xf0, 0x21, 0x81, 0x1a, 0x98, 0x06, 0x99, 0x81, 0x42, 0x00, 0xf3, + 0x1c, 0x81, 0x03, 0x99, 0x06, 0xeb, 0x86, 0x00, 0xdd, 0xf8, 0x4c, 0x90, + 0x02, 0x9c, 0xdd, 0xf8, 0x18, 0xa0, 0x01, 0xeb, 0x80, 0x00, 0x10, 0x90, + 0xca, 0x48, 0x00, 0xeb, 0x46, 0x00, 0x38, 0x44, 0x00, 0xf5, 0x25, 0x70, + 0x17, 0x90, 0xf0, 0x1f, 0x0f, 0x90, 0x06, 0xf0, 0xfc, 0x00, 0x0e, 0x90, + 0xcc, 0x48, 0xa3, 0x46, 0x01, 0x34, 0x39, 0x46, 0x22, 0x46, 0x03, 0x68, + 0x30, 0x46, 0x98, 0x47, 0x80, 0x00, 0x0b, 0x2d, 0x1c, 0x94, 0x1b, 0x90, + 0x38, 0xd8, 0x19, 0xf8, 0x10, 0x1c, 0xc6, 0x4f, 0x1b, 0x9c, 0x1d, 0xaa, + 0x19, 0x91, 0xc5, 0x49, 0x19, 0xf8, 0x07, 0x00, 0x0b, 0x68, 0x21, 0x46, + 0x98, 0x47, 0xdf, 0xf8, 0xfc, 0x82, 0x9d, 0xf8, 0x74, 0x10, 0x15, 0x9a, + 0x48, 0xf8, 0xa4, 0x0f, 0x19, 0xf8, 0x07, 0x00, 0xbe, 0x4f, 0x08, 0x44, + 0xbc, 0x49, 0x09, 0xf8, 0x10, 0x0c, 0x19, 0xf8, 0x07, 0x00, 0x0b, 0x68, + 0x21, 0x46, 0x98, 0x47, 0xc8, 0xf8, 0x04, 0x00, 0x9d, 0xf8, 0x78, 0x10, + 0xdd, 0xf8, 0x60, 0x80, 0x1c, 0x9c, 0x19, 0xf8, 0x07, 0x00, 0x16, 0x9f, + 0x08, 0x44, 0x17, 0x99, 0x89, 0xf8, 0x00, 0x00, 0x09, 0x78, 0x01, 0x29, + 0x08, 0xd1, 0x19, 0x99, 0xc0, 0xb2, 0x81, 0x42, 0x04, 0xd0, 0x10, 0x98, + 0x58, 0x44, 0x41, 0x7d, 0x80, 0xf8, 0x55, 0x11, 0x98, 0xf9, 0x3a, 0x00, + 0x87, 0x42, 0x15, 0xd1, 0x98, 0xf9, 0x39, 0x00, 0x86, 0x42, 0x11, 0xd1, + 0x14, 0x98, 0x82, 0x45, 0x0e, 0xd1, 0x98, 0xf8, 0x3b, 0xc0, 0xbc, 0xf1, + 0x00, 0x0f, 0x11, 0xd0, 0x9d, 0x48, 0x83, 0x46, 0x00, 0xf1, 0x60, 0x08, + 0x00, 0xf1, 0x50, 0x0e, 0x00, 0xf1, 0x10, 0x04, 0x05, 0x98, 0x10, 0xe0, + 0x1a, 0x98, 0x09, 0xf1, 0x20, 0x09, 0x0a, 0xf1, 0x01, 0x0a, 0x84, 0x42, + 0x98, 0xdb, 0x9c, 0xe0, 0x95, 0x48, 0x83, 0x46, 0x00, 0xf1, 0x64, 0x08, + 0x00, 0xf1, 0x54, 0x0e, 0x00, 0xf1, 0x14, 0x04, 0x04, 0x98, 0x0e, 0x99, + 0x08, 0x58, 0x18, 0x9b, 0x19, 0x46, 0x02, 0x0e, 0x01, 0xf8, 0x3c, 0x0f, + 0xca, 0x70, 0x02, 0x0c, 0x00, 0x0a, 0x8a, 0x70, 0x83, 0xf8, 0x3d, 0x00, + 0x19, 0x46, 0x20, 0x68, 0x0a, 0x24, 0x01, 0xf8, 0x44, 0x0f, 0x02, 0x0e, + 0xca, 0x70, 0x02, 0x0c, 0x00, 0x0a, 0x8a, 0x70, 0x83, 0xf8, 0x45, 0x00, + 0x19, 0x46, 0xd8, 0xf8, 0x00, 0x00, 0x98, 0x46, 0x01, 0xf8, 0x48, 0x0f, + 0x02, 0x0e, 0xca, 0x70, 0x02, 0x0c, 0x00, 0x0a, 0x8a, 0x70, 0x83, 0xf8, + 0x49, 0x00, 0x19, 0x46, 0xdb, 0xf8, 0x00, 0x00, 0x01, 0xf8, 0x4c, 0x0f, + 0x02, 0x0e, 0xca, 0x70, 0x02, 0x0c, 0x00, 0x0a, 0x8a, 0x70, 0x83, 0xf8, + 0x4d, 0x00, 0x19, 0x46, 0xde, 0xf8, 0x00, 0x00, 0x01, 0xf8, 0x50, 0x0f, + 0x02, 0x0e, 0xca, 0x70, 0x02, 0x0c, 0x00, 0x0a, 0x83, 0xf8, 0x51, 0x00, + 0x0a, 0x98, 0x8a, 0x70, 0x19, 0x46, 0x73, 0x4b, 0x50, 0xf8, 0x26, 0x00, + 0x01, 0xf8, 0x40, 0x0f, 0x02, 0x0e, 0xca, 0x70, 0x02, 0x0c, 0x00, 0x0a, + 0x48, 0x70, 0x0b, 0x98, 0x8a, 0x70, 0x00, 0x68, 0x08, 0x75, 0xc0, 0xf3, + 0x00, 0x20, 0x1b, 0x9a, 0x48, 0x75, 0x0c, 0x98, 0x00, 0x78, 0x0a, 0x76, + 0x12, 0x0a, 0x4a, 0x76, 0x0f, 0x9a, 0x02, 0x38, 0x03, 0xeb, 0x42, 0x12, + 0x90, 0xfb, 0xf4, 0xf0, 0x09, 0x9c, 0x02, 0xeb, 0x07, 0x12, 0x32, 0xf8, + 0x10, 0x00, 0x1d, 0xaa, 0x88, 0x75, 0x00, 0x0a, 0xc8, 0x75, 0x11, 0xf8, + 0x0f, 0x0c, 0xc8, 0x77, 0x07, 0x98, 0x00, 0x78, 0x81, 0xf8, 0x22, 0x00, + 0x4f, 0xfa, 0x8c, 0xf0, 0x52, 0xf8, 0x20, 0x20, 0x4a, 0x77, 0x03, 0xeb, + 0x80, 0x02, 0x14, 0x9b, 0xd2, 0xf8, 0xa4, 0x20, 0x81, 0xf8, 0x23, 0x30, + 0x8a, 0x77, 0x08, 0x9a, 0x12, 0x78, 0x81, 0xf8, 0x20, 0x20, 0x4f, 0x4a, + 0x02, 0xeb, 0x84, 0x12, 0x02, 0xeb, 0x43, 0x12, 0x02, 0xeb, 0x00, 0x10, + 0x30, 0x44, 0x90, 0xf8, 0xdc, 0x02, 0x40, 0x42, 0x81, 0xf8, 0x21, 0x00, + 0x52, 0x48, 0x28, 0x21, 0x02, 0x68, 0x45, 0x48, 0x00, 0xf5, 0x34, 0x70, + 0x90, 0x47, 0x1c, 0x9c, 0x5a, 0xe7, 0x13, 0x98, 0x0d, 0x9c, 0x0f, 0x2d, + 0x00, 0xf1, 0x01, 0x00, 0x13, 0x90, 0x05, 0xf1, 0x01, 0x00, 0xff, 0xf4, + 0xb6, 0xae, 0x11, 0x98, 0x49, 0x49, 0x00, 0x88, 0x09, 0x68, 0x88, 0x47, + 0x9f, 0x49, 0x0a, 0x78, 0x32, 0xbb, 0x01, 0x99, 0x09, 0x78, 0x01, 0x29, + 0x22, 0xd1, 0x12, 0x99, 0x09, 0x78, 0x0b, 0x29, 0x3f, 0xd8, 0x11, 0x9b, + 0x08, 0xeb, 0x07, 0x02, 0x1b, 0x88, 0x23, 0xfa, 0x01, 0xf4, 0xe4, 0x07, + 0x37, 0xd0, 0x12, 0xf8, 0x11, 0x40, 0x01, 0x2c, 0x33, 0xd1, 0x81, 0x42, + 0x02, 0xd1, 0x01, 0x9d, 0x00, 0x24, 0x2c, 0x70, 0x4c, 0x1c, 0x0b, 0x29, + 0x21, 0x46, 0xee, 0xd3, 0x29, 0xe0, 0x00, 0xbf, 0x14, 0xee, 0x05, 0x30, + 0xe4, 0xc0, 0x05, 0x30, 0x04, 0x7a, 0x23, 0x40, 0x10, 0x7a, 0x23, 0x40, + 0x04, 0xf2, 0xb6, 0x21, 0x0b, 0x78, 0xe3, 0xb9, 0x01, 0x2a, 0x1a, 0xd1, + 0x01, 0x9a, 0x12, 0x78, 0xba, 0xb1, 0x12, 0x9a, 0x12, 0x78, 0x0b, 0x2a, + 0x13, 0xd8, 0x11, 0x9c, 0x08, 0xeb, 0x07, 0x03, 0x24, 0x88, 0x24, 0xfa, + 0x02, 0xf5, 0xed, 0x07, 0x0b, 0xd0, 0x13, 0xf8, 0x12, 0x50, 0x01, 0x2d, + 0x07, 0xd1, 0x82, 0x42, 0x04, 0xbf, 0x01, 0x25, 0x0d, 0x70, 0x55, 0x1c, + 0x0b, 0x2a, 0x2a, 0x46, 0xef, 0xd3, 0x15, 0x49, 0x01, 0x20, 0x00, 0x2f, + 0x3f, 0xf4, 0xfa, 0xad, 0xb8, 0xf8, 0x36, 0x00, 0x40, 0x07, 0x19, 0xd5, + 0x1e, 0x48, 0x01, 0x78, 0x91, 0xb1, 0x1e, 0x4c, 0x72, 0xb6, 0x21, 0x68, + 0x49, 0x00, 0x01, 0x31, 0x21, 0x60, 0xa0, 0x21, 0x05, 0x78, 0x12, 0x48, + 0xcd, 0xf7, 0x24, 0xfc, 0x55, 0xb1, 0x20, 0x68, 0x40, 0x08, 0x20, 0x60, + 0x20, 0x68, 0x80, 0xf3, 0x10, 0x88, 0x03, 0xe0, 0x0c, 0x48, 0xa0, 0x21, + 0xcd, 0xf7, 0x18, 0xfc, 0x04, 0x48, 0x01, 0x68, 0x42, 0x20, 0x88, 0x47, + 0x1f, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0xbf, 0x98, 0xca, 0x01, 0x00, + 0x00, 0x9d, 0x08, 0x00, 0xf0, 0xd1, 0x01, 0x00, 0x8c, 0x7e, 0x08, 0x00, + 0x40, 0x10, 0x21, 0x40, 0x24, 0x20, 0x21, 0x40, 0x00, 0x69, 0x08, 0x00, + 0xd8, 0x21, 0x06, 0x00, 0xa4, 0xfb, 0x08, 0x00, 0x70, 0xfd, 0xff, 0xff, + 0xb0, 0xfb, 0x08, 0x00, 0x80, 0xfd, 0xff, 0xff, 0xa8, 0xfb, 0x08, 0x00, + 0xa0, 0xfb, 0x08, 0x00, 0xde, 0xb8, 0x01, 0x00, 0x24, 0x36, 0x01, 0x00, + 0xb0, 0xb5, 0x04, 0xf0, 0x4d, 0xfb, 0x0e, 0x4d, 0x0e, 0x4c, 0x05, 0x21, + 0x05, 0x23, 0x6a, 0x1d, 0x20, 0x46, 0xcb, 0xf7, 0x51, 0xfa, 0x60, 0x1d, + 0x05, 0xf1, 0x0f, 0x02, 0x05, 0x21, 0x05, 0x23, 0xcb, 0xf7, 0x4a, 0xfa, + 0x08, 0x48, 0x00, 0x68, 0x6f, 0xf3, 0x9f, 0x20, 0x45, 0x28, 0x06, 0xd1, + 0x20, 0x79, 0x61, 0x7a, 0x1c, 0x30, 0x20, 0x71, 0x01, 0xf1, 0x11, 0x00, + 0x60, 0x72, 0xb0, 0xbd, 0x0d, 0x13, 0x01, 0x00, 0xa8, 0x10, 0x06, 0x00, + 0x80, 0x70, 0x00, 0x30, 0x41, 0x48, 0x00, 0x78, 0x01, 0x28, 0x18, 0xbf, + 0x70, 0x47, 0x01, 0x48, 0x00, 0x68, 0x00, 0x47, 0xe4, 0xfb, 0x08, 0x00, + 0xf8, 0xb5, 0x04, 0x46, 0x00, 0x78, 0x01, 0x28, 0x05, 0xd1, 0x37, 0x48, + 0x00, 0x68, 0x00, 0x01, 0x11, 0xd4, 0x36, 0x48, 0x04, 0xe0, 0x32, 0x48, + 0x00, 0x68, 0x00, 0x05, 0x0b, 0xd4, 0x31, 0x48, 0x01, 0x68, 0x00, 0x68, + 0x49, 0xb2, 0x00, 0xb2, 0xb1, 0xf1, 0xff, 0x3f, 0x04, 0xdd, 0x00, 0x28, + 0x05, 0xd5, 0x01, 0x25, 0x04, 0xe0, 0x4b, 0xe0, 0xb0, 0xf1, 0xff, 0x3f, + 0x49, 0xdd, 0x00, 0x25, 0xfd, 0xf7, 0x68, 0xfe, 0x08, 0xb1, 0x2a, 0x48, + 0x00, 0xe0, 0x2a, 0x48, 0x00, 0x78, 0x40, 0xb1, 0x29, 0x49, 0x20, 0x78, + 0x0a, 0x68, 0x29, 0x46, 0x90, 0x47, 0x28, 0x48, 0x01, 0x68, 0x28, 0x46, + 0x88, 0x47, 0x27, 0x48, 0x90, 0xf8, 0x5f, 0x00, 0x01, 0x28, 0x31, 0xd1, + 0x25, 0x48, 0x00, 0xeb, 0x45, 0x07, 0xd3, 0xf7, 0x07, 0xff, 0x06, 0x46, + 0x20, 0x78, 0x7f, 0x8b, 0xb8, 0xb9, 0xd4, 0xf7, 0x1b, 0xfb, 0x06, 0x46, + 0x20, 0x48, 0x21, 0x49, 0x00, 0x78, 0x00, 0xeb, 0x00, 0x10, 0x01, 0xeb, + 0xc0, 0x00, 0x1f, 0x49, 0x00, 0x69, 0x09, 0x68, 0x88, 0x42, 0x07, 0xd0, + 0x1d, 0x49, 0x09, 0x68, 0x88, 0x42, 0x03, 0xd0, 0x1c, 0x49, 0x09, 0x68, + 0x88, 0x42, 0x00, 0xd1, 0x76, 0x00, 0x38, 0xb2, 0x04, 0x21, 0x90, 0xfb, + 0xf1, 0xf0, 0x29, 0x46, 0x47, 0xb2, 0x30, 0x46, 0x3a, 0x46, 0xd4, 0xf7, + 0x09, 0xfb, 0x22, 0x78, 0x30, 0x46, 0x39, 0x46, 0xbd, 0xe8, 0xf8, 0x40, + 0xd3, 0xf7, 0xf0, 0xbe, 0xf8, 0xbd, 0x07, 0x48, 0x41, 0x78, 0x4d, 0x1e, + 0x18, 0xbf, 0x01, 0x25, 0x45, 0x70, 0xaf, 0xe7, 0xcc, 0x20, 0x21, 0x40, + 0x38, 0x20, 0x21, 0x40, 0xec, 0x10, 0x21, 0x40, 0x50, 0x10, 0x21, 0x40, + 0x5c, 0xd4, 0x05, 0x00, 0xa9, 0x58, 0x01, 0x00, 0xe8, 0xfb, 0x08, 0x00, + 0x14, 0xfc, 0x08, 0x00, 0xd0, 0xe2, 0x05, 0x00, 0x1c, 0x1f, 0x01, 0x00, + 0x74, 0x87, 0x08, 0x00, 0xfc, 0x6d, 0x01, 0x00, 0x54, 0xb7, 0x08, 0x00, + 0x58, 0xb7, 0x08, 0x00, 0x0c, 0xe4, 0x08, 0x00, 0xf8, 0xb5, 0x00, 0xf0, + 0x0f, 0x06, 0x15, 0x46, 0x0c, 0x46, 0x07, 0x46, 0x07, 0x2e, 0x0e, 0xd3, + 0x0b, 0x2e, 0x0c, 0xd8, 0xa9, 0x49, 0x6f, 0xf0, 0x0d, 0x00, 0x00, 0xeb, + 0x46, 0x00, 0xb1, 0xf8, 0xde, 0x22, 0x22, 0xfa, 0x00, 0xf0, 0x00, 0xf0, + 0x03, 0x00, 0x81, 0xf8, 0xe5, 0x02, 0x21, 0x48, 0x01, 0x68, 0x28, 0x46, + 0x88, 0x47, 0xa1, 0x49, 0x91, 0xf8, 0xf6, 0x1e, 0xca, 0x07, 0x02, 0xd1, + 0x47, 0xf6, 0xff, 0x72, 0x09, 0xe0, 0x44, 0xf0, 0x02, 0x02, 0x03, 0x2a, + 0x1a, 0xbf, 0x47, 0xf6, 0xff, 0x72, 0x42, 0xea, 0x41, 0x32, 0x4f, 0xf6, + 0xff, 0x72, 0x4f, 0xf6, 0xdf, 0x73, 0x43, 0xea, 0x40, 0x10, 0x38, 0x40, + 0x10, 0x40, 0x07, 0xb2, 0x00, 0x2f, 0x01, 0xd4, 0x48, 0x06, 0x14, 0xd5, + 0x48, 0x06, 0x07, 0xd4, 0x10, 0x48, 0x31, 0x46, 0x02, 0x68, 0x28, 0x46, + 0x90, 0x47, 0x20, 0xb1, 0x01, 0x2c, 0x04, 0xd1, 0x4f, 0xf4, 0x80, 0x40, + 0x06, 0xe0, 0x00, 0x20, 0x04, 0xe0, 0xe0, 0x1e, 0xb0, 0xfa, 0x80, 0xf0, + 0x40, 0x09, 0x80, 0x03, 0x07, 0x43, 0x44, 0xf0, 0x02, 0x00, 0x03, 0x28, + 0x06, 0x48, 0x14, 0xbf, 0x4f, 0xf4, 0xc0, 0x41, 0x00, 0x21, 0x01, 0x60, + 0x04, 0x48, 0x01, 0x60, 0xb8, 0xb2, 0xf8, 0xbd, 0x00, 0xfc, 0x08, 0x00, + 0xe0, 0xfb, 0x08, 0x00, 0x34, 0xc0, 0x05, 0x30, 0x4c, 0xc0, 0x05, 0x30, + 0x02, 0x48, 0x00, 0x21, 0x01, 0x60, 0x02, 0x48, 0x01, 0x60, 0x70, 0x47, + 0x10, 0xd6, 0x05, 0x30, 0x10, 0xee, 0x05, 0x30, 0x05, 0x48, 0x02, 0x22, + 0x01, 0x68, 0x62, 0xf3, 0x9f, 0x71, 0x01, 0x60, 0x41, 0x6a, 0x62, 0xf3, + 0x9f, 0x71, 0x41, 0x62, 0x70, 0x47, 0x00, 0xbf, 0x5c, 0xc0, 0x05, 0x30, + 0x2d, 0xe9, 0xf8, 0x43, 0x70, 0x48, 0x42, 0x4d, 0x90, 0xf8, 0xef, 0x22, + 0x00, 0xf5, 0x37, 0x79, 0xd0, 0x07, 0x10, 0xd0, 0x3f, 0x48, 0x01, 0x68, + 0x49, 0x05, 0x5c, 0xbf, 0x99, 0xf8, 0x00, 0x10, 0x5f, 0xea, 0x01, 0x71, + 0x07, 0xd5, 0x00, 0x68, 0x6f, 0xf3, 0x5f, 0x20, 0x18, 0xb1, 0x29, 0x88, + 0x08, 0x44, 0x01, 0x21, 0x01, 0xe0, 0x00, 0x21, 0x00, 0x20, 0x92, 0x07, + 0x11, 0xd5, 0x36, 0x4a, 0x13, 0x68, 0x5b, 0x05, 0x5c, 0xbf, 0x99, 0xf8, + 0x00, 0x30, 0x5f, 0xea, 0x03, 0x73, 0x08, 0xd5, 0x12, 0x68, 0x6f, 0xf3, + 0x5f, 0x22, 0x22, 0xb1, 0x6b, 0x88, 0x01, 0x27, 0x03, 0xeb, 0x02, 0x08, + 0x02, 0xe0, 0x00, 0x27, 0x4f, 0xf0, 0x00, 0x08, 0x59, 0xb1, 0xe9, 0x7b, + 0x59, 0xb1, 0x2b, 0x4c, 0x99, 0xf8, 0x10, 0x20, 0x99, 0xf8, 0x11, 0x30, + 0x69, 0x8a, 0x00, 0xb2, 0x24, 0x68, 0xa0, 0x47, 0x04, 0xe0, 0x00, 0x24, + 0x10, 0xe0, 0x01, 0x21, 0xc0, 0x00, 0xe9, 0x73, 0x04, 0x21, 0x68, 0x82, + 0xec, 0x7a, 0x11, 0xfa, 0x80, 0xf0, 0x22, 0x49, 0xc0, 0x08, 0x0a, 0x68, + 0x00, 0x21, 0x90, 0x47, 0xe8, 0x7a, 0x24, 0x1a, 0x18, 0xbf, 0x01, 0x24, + 0xff, 0xb1, 0x28, 0x7c, 0x50, 0xb1, 0x1b, 0x48, 0x99, 0xf8, 0x10, 0x20, + 0x99, 0xf8, 0x11, 0x30, 0xa9, 0x8a, 0x07, 0x68, 0x0f, 0xfa, 0x88, 0xf0, + 0xb8, 0x47, 0x03, 0xe0, 0x01, 0x20, 0x28, 0x74, 0x4f, 0xea, 0xc8, 0x00, + 0x04, 0x21, 0xa8, 0x82, 0x2f, 0x7b, 0x01, 0x26, 0x11, 0xfa, 0x80, 0xf0, + 0x11, 0x49, 0xc0, 0x08, 0x0a, 0x68, 0x01, 0x21, 0x90, 0x47, 0x28, 0x7b, + 0x87, 0x42, 0x18, 0xbf, 0x34, 0x46, 0x99, 0xf8, 0x13, 0x00, 0x02, 0x28, + 0x06, 0xd0, 0x01, 0x28, 0x08, 0xd1, 0xe8, 0x7a, 0x69, 0x7b, 0x28, 0x73, + 0xa9, 0x73, 0x03, 0xe0, 0x28, 0x7b, 0xa9, 0x7b, 0xe8, 0x72, 0x69, 0x73, + 0x20, 0x46, 0xbd, 0xe8, 0xf8, 0x83, 0x00, 0xbf, 0xf0, 0xd1, 0x01, 0x00, + 0x14, 0xd6, 0x05, 0x30, 0x14, 0xee, 0x05, 0x30, 0x74, 0xfe, 0x08, 0x00, + 0x78, 0xfe, 0x08, 0x00, 0x80, 0xb5, 0x04, 0xf0, 0x89, 0xf9, 0x27, 0x48, + 0x90, 0xf8, 0xca, 0x01, 0x00, 0x28, 0x18, 0xbf, 0x01, 0x20, 0x00, 0xf0, + 0x0d, 0xf8, 0xff, 0xf7, 0xdb, 0xf8, 0x05, 0xf0, 0xbb, 0xf8, 0x00, 0xf0, + 0x37, 0xf8, 0x04, 0xf0, 0xbd, 0xfd, 0xbd, 0xe8, 0x80, 0x40, 0x04, 0xf0, + 0xab, 0xbd, 0x00, 0xbf, 0xf0, 0xb5, 0x1c, 0x49, 0x91, 0xf8, 0xd8, 0x12, + 0x89, 0x07, 0x23, 0xd5, 0x00, 0xeb, 0x40, 0x00, 0x11, 0x4b, 0x12, 0x4c, + 0x00, 0x22, 0x00, 0xf1, 0x6c, 0x01, 0x04, 0xeb, 0x40, 0x06, 0x65, 0x5c, + 0x01, 0x32, 0x01, 0x31, 0x01, 0x30, 0xb6, 0xf8, 0x60, 0x70, 0x03, 0x2a, + 0x6f, 0xf3, 0x5f, 0x27, 0x47, 0xea, 0x45, 0x25, 0x5f, 0x69, 0x6f, 0xf3, + 0x10, 0x07, 0x3d, 0x44, 0x5d, 0x61, 0x1d, 0x68, 0xb6, 0xf8, 0x48, 0x50, + 0xb6, 0xf8, 0x54, 0x60, 0x46, 0xea, 0x05, 0x45, 0x1d, 0x60, 0x03, 0xf1, + 0x04, 0x03, 0xe2, 0xd1, 0xf0, 0xbd, 0x00, 0xbf, 0x24, 0x0e, 0x03, 0x40, + 0xb4, 0x1a, 0x06, 0x00, 0x04, 0x48, 0x05, 0x49, 0x90, 0xf8, 0xd2, 0x0f, + 0x0a, 0x68, 0x60, 0xf3, 0x04, 0x02, 0x0a, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0x00, 0x69, 0x08, 0x00, 0x00, 0x0e, 0x23, 0x40, 0x2d, 0xe9, 0xf0, 0x4f, + 0x91, 0xb0, 0xdf, 0xf8, 0xc8, 0x04, 0x00, 0xf2, 0x3c, 0x6b, 0x1b, 0xf9, + 0x02, 0x0f, 0x9b, 0xf9, 0x01, 0x10, 0x00, 0x28, 0x00, 0xd5, 0x40, 0x42, + 0x01, 0x44, 0xe2, 0x48, 0xdf, 0xf8, 0xb0, 0x54, 0x02, 0x91, 0x00, 0xea, + 0x41, 0x04, 0xdb, 0xf8, 0x32, 0x00, 0x29, 0x68, 0x06, 0x90, 0x20, 0x46, + 0x88, 0x47, 0x29, 0x68, 0x82, 0x46, 0x20, 0x46, 0x03, 0x94, 0x88, 0x47, + 0xba, 0xf1, 0x00, 0x0f, 0x00, 0xf0, 0x28, 0x82, 0x05, 0x46, 0x00, 0x28, + 0x00, 0xf0, 0x24, 0x82, 0xdf, 0xf8, 0x7c, 0x04, 0x90, 0xf8, 0x36, 0x02, + 0x80, 0x07, 0x00, 0xf0, 0x2c, 0x82, 0xdf, 0xf8, 0x78, 0x04, 0x2c, 0x46, + 0x9b, 0xf8, 0x03, 0x50, 0x01, 0x68, 0x00, 0x20, 0x88, 0x47, 0xdf, 0xf8, + 0x6c, 0x04, 0x00, 0x68, 0x80, 0x47, 0xdf, 0xf8, 0x68, 0x04, 0x0c, 0x94, + 0x01, 0x24, 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, 0xdf, 0xf8, 0x5c, 0x04, + 0x00, 0x68, 0x80, 0x47, 0xdf, 0xf8, 0x58, 0x04, 0x01, 0x68, 0x01, 0x20, + 0x88, 0x47, 0xdf, 0xf8, 0x54, 0x04, 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, + 0x03, 0x99, 0x65, 0x20, 0x01, 0x2d, 0xc1, 0x4f, 0x00, 0xeb, 0x41, 0x00, + 0xdf, 0xf8, 0x40, 0x14, 0x07, 0x90, 0x98, 0xbf, 0x25, 0x46, 0x06, 0x98, + 0x0a, 0x95, 0xcd, 0xf8, 0x24, 0xa0, 0x0c, 0x9d, 0x00, 0xf0, 0x0f, 0x00, + 0x01, 0x90, 0xdf, 0xf8, 0x40, 0x04, 0x01, 0x30, 0x00, 0x90, 0x00, 0x20, + 0x0f, 0x90, 0xdf, 0xf8, 0x20, 0x04, 0x08, 0x91, 0x00, 0x68, 0x80, 0x47, + 0xdf, 0xf8, 0x18, 0x24, 0x80, 0x46, 0xb8, 0xf1, 0x00, 0x0f, 0x10, 0x78, + 0x00, 0xf1, 0x01, 0x01, 0x11, 0x70, 0xdf, 0xf8, 0x0c, 0x14, 0x02, 0xd0, + 0x03, 0x22, 0x0a, 0x54, 0x6b, 0xe1, 0x04, 0x22, 0x00, 0x23, 0x0a, 0x54, + 0xdf, 0xf8, 0xfc, 0x03, 0x06, 0x9a, 0x04, 0x68, 0x0f, 0x98, 0x5f, 0xfa, + 0x80, 0xf9, 0x01, 0x20, 0x49, 0x46, 0xa0, 0x47, 0xdf, 0xf8, 0xb8, 0x03, + 0xb0, 0xf8, 0x4e, 0x02, 0x28, 0xb1, 0xdf, 0xf8, 0xe4, 0x13, 0x09, 0x88, + 0x48, 0x43, 0x02, 0x38, 0x00, 0xe0, 0x00, 0x20, 0x00, 0x99, 0x88, 0x47, + 0x00, 0x21, 0x00, 0x20, 0x4f, 0xf0, 0x00, 0x08, 0x39, 0x60, 0x0e, 0x90, + 0xc7, 0xf8, 0xe0, 0x11, 0x00, 0x20, 0x00, 0x21, 0x0d, 0x90, 0x9b, 0xf9, + 0x01, 0x00, 0x9b, 0xf9, 0x00, 0x50, 0x0b, 0x91, 0x85, 0x42, 0x4d, 0xda, + 0x6e, 0x00, 0x00, 0x24, 0x0f, 0x98, 0x00, 0x28, 0x40, 0xf6, 0xfe, 0x70, + 0x00, 0xea, 0x06, 0x00, 0x1f, 0xbf, 0xd7, 0xf8, 0xe0, 0x11, 0x40, 0xf6, + 0xff, 0x72, 0x91, 0x43, 0x08, 0x44, 0x11, 0xbf, 0xc7, 0xf8, 0xe0, 0x01, + 0x39, 0x68, 0x40, 0xf6, 0xff, 0x72, 0x91, 0x43, 0x04, 0xbf, 0x08, 0x44, + 0x38, 0x60, 0xdf, 0xf8, 0x84, 0x03, 0x10, 0xa9, 0x4a, 0x46, 0x03, 0x68, + 0x0d, 0xf1, 0x42, 0x00, 0x98, 0x47, 0xd8, 0x4a, 0x80, 0x46, 0xb8, 0xf1, + 0x00, 0x0f, 0x10, 0x78, 0x00, 0xf1, 0x01, 0x01, 0x11, 0x70, 0xd5, 0x49, + 0x2b, 0xd1, 0x05, 0x22, 0x0a, 0x54, 0xbd, 0xf8, 0x42, 0x00, 0x40, 0xf3, + 0x0c, 0x01, 0xc0, 0x04, 0xad, 0xf8, 0x42, 0x10, 0x9b, 0xf8, 0x0c, 0x10, + 0xc1, 0xeb, 0xe0, 0x40, 0x00, 0x28, 0x00, 0xd5, 0x40, 0x42, 0x0e, 0x99, + 0x29, 0xb1, 0x3a, 0xf9, 0x14, 0x10, 0x08, 0x44, 0x02, 0x21, 0x90, 0xfb, + 0xf1, 0xf0, 0x2a, 0xf8, 0x14, 0x00, 0x01, 0x34, 0x02, 0x36, 0x9b, 0xf9, + 0x01, 0x00, 0x29, 0x19, 0x81, 0x42, 0xb5, 0xdb, 0xc0, 0xb2, 0x03, 0xe0, + 0x00, 0x24, 0xb8, 0xf1, 0x00, 0x0f, 0x08, 0xd1, 0x01, 0x21, 0x4f, 0xf0, + 0x00, 0x08, 0x0e, 0x91, 0x03, 0xe0, 0x06, 0x22, 0x0a, 0x54, 0x9b, 0xf8, + 0x01, 0x00, 0x00, 0x21, 0x40, 0xb2, 0x39, 0x60, 0xc7, 0xf8, 0xe0, 0x11, + 0x9b, 0xf9, 0x00, 0xa0, 0x82, 0x45, 0x52, 0xda, 0x4f, 0xea, 0x4a, 0x46, + 0x00, 0x25, 0x0f, 0x98, 0x4a, 0x46, 0x00, 0x28, 0xb9, 0x48, 0x00, 0xea, + 0x06, 0x00, 0x1f, 0xbf, 0xd7, 0xf8, 0xe0, 0x11, 0x6f, 0xf3, 0x1b, 0x41, + 0x08, 0x44, 0xc7, 0xf8, 0xe0, 0x01, 0x01, 0xbf, 0x39, 0x68, 0x6f, 0xf3, + 0x1b, 0x41, 0x08, 0x44, 0x38, 0x60, 0xb0, 0x48, 0x10, 0xa9, 0x03, 0x68, + 0x0d, 0xf1, 0x42, 0x00, 0x98, 0x47, 0xa8, 0x4a, 0x80, 0x46, 0xb8, 0xf1, + 0x00, 0x0f, 0x10, 0x78, 0x00, 0xf1, 0x01, 0x01, 0x11, 0x70, 0xa5, 0x49, + 0x37, 0xd1, 0x05, 0x22, 0x0a, 0x54, 0xbd, 0xf8, 0x42, 0x00, 0x40, 0xf3, + 0x0c, 0x01, 0xc0, 0x04, 0xad, 0xf8, 0x42, 0x10, 0x9b, 0xf8, 0x0c, 0x10, + 0xc1, 0xeb, 0xe0, 0x40, 0x00, 0x28, 0x00, 0xd5, 0x40, 0x42, 0x0d, 0x99, + 0x49, 0xb1, 0x0c, 0x9a, 0x32, 0xf9, 0x15, 0x10, 0x08, 0x44, 0x02, 0x21, + 0x90, 0xfb, 0xf1, 0xf0, 0x22, 0xf8, 0x15, 0x00, 0x02, 0xe0, 0x0c, 0x99, + 0x21, 0xf8, 0x15, 0x00, 0x01, 0x35, 0x9b, 0xf9, 0x01, 0x10, 0x06, 0xf5, + 0x00, 0x36, 0x0a, 0xeb, 0x05, 0x00, 0x88, 0x42, 0xb3, 0xdb, 0xdd, 0xf8, + 0x24, 0xa0, 0x0b, 0x99, 0x06, 0xe0, 0xdd, 0xf8, 0x24, 0xa0, 0x0b, 0x99, + 0x00, 0x25, 0xb8, 0xf1, 0x00, 0x0f, 0x09, 0xd1, 0x01, 0x20, 0x4f, 0xf0, + 0x00, 0x08, 0x0d, 0x90, 0x04, 0xe0, 0x07, 0x22, 0xdd, 0xf8, 0x24, 0xa0, + 0x0a, 0x54, 0x0b, 0x99, 0x00, 0x20, 0x01, 0x31, 0x38, 0x60, 0xc7, 0xf8, + 0xe0, 0x01, 0x0a, 0x98, 0x81, 0x42, 0xff, 0xf4, 0x28, 0xaf, 0x87, 0x4e, + 0xe1, 0xb2, 0x50, 0x46, 0x01, 0x22, 0x33, 0x68, 0x98, 0x47, 0x33, 0x68, + 0x0c, 0x9e, 0x0b, 0x90, 0xe9, 0xb2, 0x01, 0x22, 0x30, 0x46, 0x98, 0x47, + 0x05, 0x90, 0x0b, 0x98, 0xa1, 0xb2, 0xc2, 0xb2, 0x7f, 0x48, 0x03, 0x68, + 0x50, 0x46, 0x98, 0x47, 0x04, 0x90, 0x7d, 0x48, 0x05, 0x9c, 0xa9, 0xb2, + 0x03, 0x68, 0xe2, 0xb2, 0x30, 0x46, 0x98, 0x47, 0x9b, 0xf8, 0x00, 0x10, + 0x0b, 0x9b, 0x04, 0x9a, 0x01, 0xeb, 0x03, 0x0e, 0x64, 0x4b, 0x01, 0xeb, + 0x04, 0x0c, 0x08, 0x99, 0x00, 0x24, 0xb3, 0xf8, 0x3c, 0x36, 0x23, 0xfa, + 0x04, 0xf5, 0xed, 0x07, 0x34, 0xd0, 0x11, 0xf8, 0x24, 0x50, 0x05, 0x2d, + 0x30, 0xd0, 0x0e, 0x9d, 0x4d, 0xb1, 0x04, 0x2a, 0x01, 0xf8, 0x24, 0x20, + 0x01, 0xd0, 0x02, 0x2a, 0x06, 0xd1, 0x01, 0xeb, 0x84, 0x05, 0x00, 0x26, + 0x07, 0xe0, 0x4f, 0xf0, 0x01, 0x08, 0x05, 0xe0, 0x01, 0xeb, 0x84, 0x05, + 0xae, 0x78, 0xa6, 0xeb, 0x0e, 0x06, 0xae, 0x70, 0x0d, 0x9d, 0x5d, 0xb1, + 0x90, 0x42, 0x88, 0xbf, 0x01, 0xf8, 0x24, 0x00, 0x04, 0x28, 0x01, 0xd0, + 0x02, 0x28, 0x0b, 0xd1, 0x01, 0xeb, 0x84, 0x05, 0x00, 0x26, 0x0c, 0xe0, + 0x4f, 0xf0, 0x01, 0x08, 0x0a, 0xe0, 0x00, 0xbf, 0xfe, 0xff, 0x01, 0x00, + 0xa0, 0x78, 0x03, 0x40, 0x01, 0xeb, 0x84, 0x05, 0xee, 0x78, 0xa6, 0xeb, + 0x0c, 0x06, 0xee, 0x70, 0x01, 0x34, 0x0c, 0x2c, 0xc3, 0xd1, 0x4f, 0x48, + 0x06, 0x9a, 0x49, 0x46, 0x00, 0x23, 0x04, 0x68, 0x00, 0x20, 0xa0, 0x47, + 0x0c, 0x9d, 0x52, 0x48, 0x00, 0x78, 0xff, 0x28, 0x01, 0xd0, 0x02, 0x28, + 0x34, 0xd1, 0x3d, 0x48, 0x01, 0x68, 0x07, 0x98, 0x88, 0x47, 0x78, 0xb3, + 0x81, 0x46, 0x60, 0x20, 0x40, 0x4a, 0x4c, 0x4d, 0x60, 0x21, 0x60, 0x23, + 0x89, 0xf8, 0x02, 0x00, 0x01, 0x98, 0x89, 0xf8, 0x01, 0x00, 0x0f, 0x98, + 0x89, 0xf8, 0x00, 0x00, 0x09, 0xf1, 0x03, 0x00, 0xa8, 0x47, 0x03, 0x9e, + 0x02, 0x9d, 0x44, 0x4c, 0x09, 0xf1, 0x64, 0x00, 0x52, 0x46, 0x0e, 0x90, + 0x31, 0x46, 0x33, 0x46, 0x89, 0xf8, 0x63, 0x50, 0xa0, 0x47, 0x0e, 0x98, + 0x3e, 0x4c, 0x31, 0x46, 0x33, 0x46, 0x30, 0x44, 0x00, 0xf8, 0x01, 0x5b, + 0x0c, 0x9d, 0x2a, 0x46, 0xa0, 0x47, 0x3b, 0x48, 0x07, 0x9a, 0x49, 0x46, + 0x03, 0x68, 0x02, 0x20, 0x98, 0x47, 0x48, 0x46, 0xd0, 0xf7, 0x86, 0xfc, + 0x0f, 0x98, 0x08, 0x99, 0x01, 0x30, 0x30, 0x31, 0x02, 0x28, 0x0f, 0x90, + 0x7f, 0xf4, 0x3d, 0xae, 0x33, 0x48, 0x00, 0x68, 0x80, 0x47, 0x20, 0x48, + 0x01, 0x68, 0x00, 0x20, 0x88, 0x47, 0x21, 0x48, 0x01, 0x68, 0x00, 0x20, + 0x88, 0x47, 0x1e, 0x48, 0x01, 0x68, 0x00, 0x20, 0x88, 0x47, 0xb8, 0xf1, + 0x00, 0x0f, 0x09, 0xd1, 0x1e, 0x4a, 0x1f, 0x4b, 0x08, 0x21, 0x10, 0x78, + 0x19, 0x54, 0x01, 0x30, 0x10, 0x70, 0x16, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x26, 0x48, 0x00, 0x68, 0x80, 0x47, 0x10, 0xe0, 0x00, 0x20, 0x40, 0xf6, + 0x26, 0x61, 0xd0, 0xf7, 0x3b, 0xfc, 0x15, 0x48, 0x15, 0x4a, 0x4f, 0xf0, + 0x01, 0x08, 0x01, 0x78, 0x02, 0xf8, 0x01, 0x80, 0x01, 0x31, 0x01, 0x70, + 0x07, 0xe0, 0x4f, 0xf0, 0x00, 0x08, 0x50, 0x46, 0xd0, 0xf7, 0x4a, 0xfc, + 0x28, 0x46, 0xd0, 0xf7, 0x47, 0xfc, 0x5f, 0xfa, 0x88, 0xf0, 0x11, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0x69, 0x08, 0x00, 0xd4, 0x9b, 0x08, 0x00, + 0xd0, 0xfc, 0x08, 0x00, 0x04, 0xfd, 0x08, 0x00, 0x14, 0xfd, 0x08, 0x00, + 0x80, 0xbd, 0x08, 0x00, 0x18, 0xfd, 0x08, 0x00, 0x0c, 0xfd, 0x08, 0x00, + 0x30, 0xe4, 0x01, 0x00, 0x84, 0x9a, 0x08, 0x00, 0x28, 0x1b, 0x06, 0x00, + 0x29, 0x1b, 0x06, 0x00, 0xd8, 0xfc, 0x08, 0x00, 0x34, 0xec, 0x01, 0x00, + 0x40, 0xec, 0x01, 0x00, 0xfc, 0xfc, 0x08, 0x00, 0x00, 0x00, 0xfe, 0x0f, + 0x28, 0xfd, 0x08, 0x00, 0x2c, 0xfd, 0x08, 0x00, 0x64, 0x8d, 0x08, 0x00, + 0x4d, 0xcd, 0x11, 0x10, 0xe4, 0x9b, 0x08, 0x00, 0x30, 0xfd, 0x08, 0x00, + 0xdc, 0xfc, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, 0x89, 0xb0, 0x07, 0x46, + 0x00, 0x20, 0x90, 0x46, 0x8b, 0x46, 0xcd, 0xe9, 0x07, 0x00, 0xcd, 0xe9, + 0x05, 0x00, 0x80, 0x48, 0x00, 0x78, 0xc0, 0x07, 0x06, 0xd0, 0xbb, 0xf1, + 0x00, 0x0f, 0x03, 0xd1, 0x7d, 0x48, 0x00, 0x21, 0xa0, 0xf8, 0xb4, 0x12, + 0xb8, 0x06, 0x44, 0xbf, 0x07, 0xf0, 0x03, 0x00, 0x80, 0xf0, 0x0f, 0x07, + 0x3e, 0x46, 0x78, 0xb2, 0x0c, 0x28, 0x03, 0xdb, 0x3e, 0x46, 0x10, 0x28, + 0xb8, 0xbf, 0x10, 0x3e, 0x75, 0x48, 0xdf, 0xf8, 0xd8, 0x91, 0x03, 0xaa, + 0x00, 0xeb, 0x4b, 0x10, 0x99, 0xf9, 0x07, 0x10, 0x30, 0xf8, 0x17, 0x00, + 0x08, 0x44, 0x59, 0x46, 0x0f, 0xfa, 0x80, 0xfa, 0x70, 0x48, 0x03, 0x68, + 0x50, 0x46, 0x98, 0x47, 0x6f, 0x48, 0xdb, 0x4c, 0x01, 0x68, 0x94, 0xf8, + 0xca, 0x51, 0x01, 0x20, 0x88, 0x47, 0x28, 0xb1, 0x99, 0xf8, 0x05, 0x00, + 0xb0, 0xfa, 0x80, 0xf0, 0x40, 0x09, 0x00, 0xe0, 0x00, 0x20, 0x94, 0xf8, + 0xd4, 0x1d, 0x59, 0xb1, 0x94, 0xf8, 0xf3, 0x2d, 0x73, 0xb2, 0x00, 0x21, + 0x93, 0x42, 0x06, 0xdb, 0xb4, 0xf9, 0xe4, 0x2d, 0x92, 0x45, 0xa8, 0xbf, + 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0xbb, 0xf1, 0x02, 0x0f, 0x16, 0xd1, + 0x5f, 0x4a, 0x60, 0x4b, 0x12, 0x78, 0x02, 0xeb, 0x02, 0x12, 0x03, 0xeb, + 0xc2, 0x02, 0x12, 0x69, 0x12, 0x7f, 0x63, 0x2a, 0x0b, 0xd3, 0x66, 0x2a, + 0x07, 0xd3, 0x6c, 0x2a, 0x05, 0xd0, 0x73, 0x2a, 0x05, 0xd3, 0x78, 0x2a, + 0x01, 0xd3, 0xa0, 0x2a, 0x01, 0xd1, 0x99, 0xf8, 0x03, 0x50, 0x00, 0x2d, + 0x51, 0xd0, 0x01, 0x2d, 0x44, 0xd1, 0x00, 0x28, 0x4d, 0xd0, 0x53, 0x48, + 0x05, 0xa9, 0x5a, 0x46, 0x00, 0x23, 0x01, 0x25, 0x0c, 0x31, 0x04, 0x68, + 0xbd, 0xf9, 0x0e, 0x00, 0x00, 0x91, 0x01, 0x21, 0xa0, 0x47, 0xbd, 0xf9, + 0x0e, 0x10, 0xbd, 0xf9, 0x20, 0x20, 0x51, 0x1a, 0x21, 0xea, 0xe1, 0x71, + 0x8d, 0xf8, 0x19, 0x10, 0x49, 0x49, 0x0a, 0x68, 0x59, 0x46, 0x90, 0x47, + 0x48, 0x49, 0x80, 0xb2, 0x01, 0x22, 0x0b, 0x68, 0x59, 0x46, 0x98, 0x47, + 0x46, 0x49, 0x91, 0xf8, 0x71, 0x11, 0xc1, 0xb1, 0x45, 0x49, 0x9d, 0xf8, + 0x19, 0x20, 0x4f, 0xf4, 0x00, 0x43, 0x51, 0xf8, 0x28, 0x10, 0x62, 0xf3, + 0x0c, 0x23, 0x0b, 0x60, 0xa4, 0x49, 0x4f, 0xf6, 0xff, 0x73, 0x51, 0xf8, + 0x28, 0x10, 0x0a, 0x68, 0xc2, 0xea, 0x00, 0x42, 0x6f, 0xf3, 0xdf, 0x30, + 0x0a, 0x60, 0x0a, 0x68, 0x9a, 0x43, 0x10, 0x44, 0x08, 0x60, 0x9d, 0xf8, + 0x19, 0x00, 0xbd, 0xf8, 0x20, 0x10, 0x8d, 0xf8, 0x15, 0x50, 0x48, 0xe0, + 0x48, 0xb1, 0x41, 0xb1, 0x03, 0xaa, 0x05, 0xab, 0x50, 0x46, 0x39, 0x46, + 0xcd, 0xe9, 0x00, 0xb8, 0x05, 0xf0, 0xb8, 0xfd, 0x40, 0xe0, 0x2c, 0x48, + 0x05, 0xa9, 0x5a, 0x46, 0x00, 0x23, 0x0a, 0x31, 0x04, 0x68, 0xbd, 0xf9, + 0x0c, 0x00, 0x00, 0x91, 0x00, 0x21, 0xa0, 0x47, 0xbd, 0xf9, 0x0c, 0x10, + 0xbd, 0xf9, 0x1e, 0x20, 0x51, 0x1a, 0x21, 0xea, 0xe1, 0x71, 0x8d, 0xf8, + 0x18, 0x10, 0x23, 0x49, 0x0a, 0x68, 0x59, 0x46, 0x90, 0x47, 0x22, 0x49, + 0x80, 0xb2, 0x00, 0x22, 0x0b, 0x68, 0x59, 0x46, 0x98, 0x47, 0x20, 0x49, + 0x91, 0xf8, 0x71, 0x11, 0xa1, 0xb1, 0x1f, 0x49, 0x9d, 0xf8, 0x18, 0x30, + 0x04, 0x22, 0x51, 0xf8, 0x28, 0x10, 0x62, 0xf3, 0x5f, 0x13, 0x0b, 0x60, + 0x7e, 0x49, 0x4f, 0xf6, 0xff, 0x73, 0x51, 0xf8, 0x28, 0x10, 0x0a, 0x68, + 0x9a, 0x43, 0x10, 0x44, 0x08, 0x60, 0x08, 0x68, 0x80, 0xb2, 0x08, 0x60, + 0x01, 0x20, 0xbd, 0xf8, 0x1e, 0x10, 0x8d, 0xf8, 0x14, 0x00, 0x9d, 0xf8, + 0x18, 0x00, 0x08, 0x1a, 0xad, 0xf8, 0x22, 0x00, 0x10, 0x48, 0x59, 0x46, + 0x02, 0x68, 0x05, 0xa8, 0x90, 0x47, 0x09, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x8c, 0x32, 0x06, 0x00, 0x98, 0xca, 0x01, 0x00, 0xb2, 0xd0, 0x01, 0x00, + 0x48, 0xdc, 0x05, 0x00, 0x98, 0xbd, 0x08, 0x00, 0xcc, 0xbd, 0x08, 0x00, + 0x74, 0x87, 0x08, 0x00, 0xfc, 0x6d, 0x01, 0x00, 0x68, 0xbd, 0x08, 0x00, + 0x9c, 0xbd, 0x08, 0x00, 0xa0, 0xbd, 0x08, 0x00, 0x8c, 0x7e, 0x08, 0x00, + 0xc8, 0x15, 0x01, 0x10, 0xa4, 0xbd, 0x08, 0x00, 0xfe, 0xb5, 0x35, 0x4c, + 0x0a, 0x46, 0x00, 0x26, 0xe1, 0x8b, 0x94, 0xf8, 0x22, 0x30, 0x94, 0xf8, + 0x23, 0x50, 0x00, 0x24, 0x17, 0x06, 0x09, 0xd0, 0x02, 0xf0, 0x01, 0x07, + 0x01, 0x34, 0xd2, 0xb2, 0x3e, 0x44, 0xe7, 0xb2, 0x52, 0x08, 0x08, 0x2f, + 0xf4, 0xd1, 0x08, 0x24, 0xf2, 0xb2, 0x02, 0x2a, 0x05, 0xd0, 0x01, 0x2a, + 0x41, 0xd1, 0x21, 0xf0, 0x01, 0x01, 0x65, 0x1e, 0x02, 0xe0, 0x41, 0xf0, + 0x01, 0x01, 0x00, 0x25, 0x00, 0x22, 0x00, 0x24, 0x06, 0x06, 0x09, 0xd0, + 0x00, 0xf0, 0x01, 0x06, 0x01, 0x34, 0xc0, 0xb2, 0x32, 0x44, 0xe6, 0xb2, + 0x40, 0x08, 0x08, 0x2e, 0xf4, 0xd1, 0x08, 0x24, 0xd0, 0xb2, 0x02, 0x28, + 0x02, 0xd0, 0x01, 0x28, 0x27, 0xd1, 0x62, 0x1e, 0x1b, 0x48, 0x1c, 0x4c, + 0x00, 0x23, 0x04, 0x30, 0x50, 0xf8, 0x04, 0x6c, 0x8e, 0xb1, 0x07, 0x78, + 0x47, 0xf0, 0x02, 0x07, 0x03, 0x2f, 0x0c, 0xd1, 0x72, 0xb6, 0x27, 0x68, + 0x7f, 0x00, 0x01, 0x37, 0x27, 0x60, 0x86, 0xf8, 0x92, 0x20, 0x26, 0x68, + 0x76, 0x08, 0x26, 0x60, 0x26, 0x68, 0x86, 0xf3, 0x10, 0x88, 0x01, 0x33, + 0x0c, 0x30, 0x17, 0x2b, 0xe6, 0xd1, 0x00, 0x24, 0xe8, 0xb2, 0xd3, 0xb2, + 0x00, 0x22, 0xcd, 0xe9, 0x00, 0x04, 0x00, 0x20, 0xfd, 0xf7, 0xaa, 0xfd, + 0x0b, 0xe0, 0x00, 0x20, 0xea, 0xb2, 0xcd, 0xe9, 0x00, 0x20, 0x00, 0x20, + 0x00, 0x22, 0xfd, 0xf7, 0xa1, 0xfd, 0x06, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x12, 0x24, 0x20, 0x46, 0xfe, 0xbd, 0x00, 0xbf, 0xbc, 0xfe, 0x05, 0x00, + 0xe8, 0x72, 0x01, 0x00, 0x24, 0x36, 0x01, 0x00, 0xa0, 0xd7, 0x08, 0x00, + 0x00, 0x20, 0xfd, 0xf7, 0x33, 0xbd, 0x00, 0xbf, 0xb0, 0xb5, 0x24, 0x4c, + 0x00, 0x25, 0x25, 0x60, 0x98, 0xb1, 0xd3, 0xb1, 0x22, 0x48, 0x01, 0x29, + 0x40, 0x68, 0x03, 0x68, 0x9b, 0xb2, 0x1d, 0xd1, 0x43, 0xea, 0x02, 0x41, + 0x4f, 0xf4, 0x80, 0x42, 0x41, 0xf0, 0x00, 0x41, 0x01, 0x60, 0x01, 0x68, + 0x62, 0xf3, 0x0f, 0x01, 0x01, 0x60, 0xa0, 0x6a, 0x0d, 0xe0, 0x1e, 0x48, + 0xa5, 0x61, 0xa5, 0x62, 0x00, 0x68, 0x80, 0x47, 0x1c, 0x48, 0x05, 0x60, + 0xb0, 0xbd, 0x22, 0xf4, 0x80, 0x40, 0x01, 0x29, 0xa0, 0x61, 0xa0, 0x6a, + 0x0a, 0xd1, 0x40, 0xf4, 0x00, 0x40, 0x09, 0xe0, 0x03, 0x60, 0x01, 0x68, + 0xc2, 0xea, 0x01, 0x01, 0x41, 0xf4, 0x40, 0x41, 0x01, 0x60, 0xa0, 0x6a, + 0x40, 0xf0, 0x80, 0x00, 0xa0, 0x62, 0x0c, 0x48, 0x01, 0x21, 0x00, 0x22, + 0x90, 0xf8, 0x5a, 0x02, 0x02, 0x30, 0x61, 0xf3, 0x1f, 0x20, 0x09, 0x49, + 0x08, 0x60, 0x09, 0x48, 0x00, 0x21, 0x03, 0x68, 0x05, 0x20, 0x98, 0x47, + 0x07, 0x48, 0x00, 0x68, 0x80, 0x47, 0x0b, 0x20, 0x20, 0x60, 0xb0, 0xbd, + 0x60, 0x20, 0x01, 0x40, 0xd8, 0x15, 0x01, 0x10, 0x00, 0x69, 0x08, 0x00, + 0x74, 0x20, 0x21, 0x40, 0x0c, 0x99, 0x08, 0x00, 0x14, 0xa1, 0x08, 0x00, + 0xf4, 0xd6, 0x08, 0x00, 0x04, 0x28, 0x21, 0x40, 0xfe, 0xb5, 0x03, 0x46, + 0x14, 0x46, 0x00, 0x20, 0x0a, 0x46, 0x99, 0x42, 0xad, 0xf8, 0x0a, 0x00, + 0x20, 0xd9, 0xd8, 0x07, 0x59, 0x08, 0x00, 0x23, 0x00, 0x26, 0xd0, 0xf7, + 0x39, 0xfa, 0x23, 0x4f, 0x0f, 0x22, 0x0f, 0x23, 0x00, 0x92, 0x1f, 0x22, + 0x3d, 0x68, 0xa8, 0x47, 0x05, 0x46, 0x00, 0xb2, 0x0d, 0xf1, 0x0a, 0x01, + 0x03, 0xf0, 0x8e, 0xfc, 0xa8, 0xbb, 0xbd, 0xf8, 0x0a, 0x20, 0x00, 0x20, + 0x4f, 0xf0, 0x80, 0x41, 0x00, 0x23, 0xd0, 0xf7, 0x23, 0xfa, 0x3e, 0x68, + 0x10, 0x22, 0x00, 0x92, 0x2f, 0x22, 0x1d, 0xe0, 0x20, 0xd2, 0xd0, 0x07, + 0x51, 0x08, 0x1a, 0x46, 0x00, 0x23, 0x00, 0x26, 0xd0, 0xf7, 0x16, 0xfa, + 0x11, 0x4a, 0x0f, 0x23, 0x15, 0x68, 0x0f, 0x22, 0x00, 0x92, 0x1f, 0x22, + 0xa8, 0x47, 0x05, 0x46, 0x00, 0xb2, 0x0d, 0xf1, 0x0a, 0x01, 0x03, 0xf0, + 0x6b, 0xfc, 0x90, 0xb9, 0x0b, 0x48, 0x10, 0x21, 0x0f, 0x22, 0x00, 0x91, + 0x00, 0x21, 0x06, 0x68, 0xbd, 0xf8, 0x0a, 0x00, 0x0f, 0x23, 0xb0, 0x47, + 0x20, 0x80, 0x00, 0xe0, 0x00, 0x25, 0x2c, 0x48, 0xbd, 0xf8, 0x0a, 0x10, + 0x01, 0x26, 0x45, 0x84, 0x81, 0x84, 0x30, 0x46, 0xfe, 0xbd, 0x00, 0xbf, + 0xc0, 0xfb, 0x08, 0x00, 0xc8, 0xfb, 0x08, 0x00, 0x2d, 0xe9, 0xfc, 0x47, + 0x4f, 0xf4, 0x00, 0x45, 0x98, 0x46, 0x92, 0x46, 0x0f, 0x46, 0x06, 0x46, + 0x88, 0x42, 0xad, 0xf8, 0x02, 0x50, 0x09, 0xd0, 0x0d, 0xf1, 0x02, 0x02, + 0x30, 0x46, 0x39, 0x46, 0xff, 0xf7, 0x94, 0xff, 0x01, 0x28, 0x34, 0xd1, + 0xbd, 0xf8, 0x02, 0x50, 0x1b, 0x48, 0xdf, 0xf8, 0x68, 0x90, 0x0d, 0xf1, + 0x06, 0x03, 0x39, 0x46, 0x32, 0x46, 0x04, 0x68, 0x50, 0x46, 0xa9, 0xf8, + 0x1e, 0x50, 0xa0, 0x47, 0x01, 0x28, 0x24, 0xd1, 0x15, 0x49, 0xbd, 0xf9, + 0x06, 0x00, 0x09, 0xf1, 0x14, 0x04, 0x0a, 0x68, 0x01, 0xa9, 0x20, 0x81, + 0x90, 0x47, 0x01, 0x28, 0x19, 0xd1, 0x11, 0x48, 0xbd, 0xf8, 0x04, 0x10, + 0x0a, 0x9e, 0x02, 0x68, 0x28, 0x46, 0xa1, 0x81, 0x90, 0x47, 0xa8, 0xf8, + 0x00, 0x00, 0x0d, 0x48, 0xbd, 0xf8, 0x04, 0x10, 0x02, 0x68, 0xbd, 0xf9, + 0x06, 0x00, 0x90, 0x47, 0x30, 0x70, 0xb8, 0xf8, 0x00, 0x00, 0x20, 0x80, + 0x30, 0x78, 0xa0, 0x70, 0x00, 0x20, 0xbd, 0xe8, 0xfc, 0x87, 0x01, 0x20, + 0xbd, 0xe8, 0xfc, 0x87, 0x28, 0x1d, 0x06, 0x00, 0x58, 0xfe, 0x08, 0x00, + 0x60, 0xfe, 0x08, 0x00, 0x64, 0xfe, 0x08, 0x00, 0x68, 0xfe, 0x08, 0x00, + 0x68, 0xb1, 0x01, 0x28, 0x16, 0xd1, 0x0c, 0x48, 0x01, 0x22, 0x01, 0x68, + 0x62, 0xf3, 0x01, 0x01, 0x14, 0x22, 0x01, 0x60, 0xd0, 0xf8, 0x24, 0x11, + 0x62, 0xf3, 0x8b, 0x11, 0x08, 0xe0, 0x06, 0x48, 0x01, 0x68, 0x21, 0xf0, + 0x03, 0x01, 0x01, 0x60, 0xd0, 0xf8, 0x24, 0x11, 0x21, 0xf4, 0x7c, 0x61, + 0xc0, 0xf8, 0x24, 0x11, 0x70, 0x47, 0x00, 0xbf, 0x1c, 0x00, 0x03, 0x40, + 0x2d, 0xe9, 0xf0, 0x4f, 0x8f, 0xb0, 0x9b, 0x4e, 0x96, 0xf8, 0xd8, 0x02, + 0x80, 0x07, 0x02, 0xd4, 0x4f, 0xf0, 0x00, 0x08, 0x28, 0xe1, 0x98, 0x4d, + 0x01, 0x20, 0x00, 0x21, 0x00, 0x24, 0x2a, 0x68, 0x90, 0x47, 0x2a, 0x68, + 0x01, 0x20, 0x01, 0x21, 0x90, 0x47, 0xc6, 0x48, 0x6f, 0xf0, 0x01, 0x01, + 0x00, 0x88, 0x00, 0xeb, 0x80, 0x00, 0x01, 0xeb, 0x40, 0x00, 0xc3, 0x49, + 0x01, 0xf1, 0x01, 0x0b, 0xd8, 0x47, 0x8e, 0x48, 0x01, 0x68, 0x00, 0x20, + 0x88, 0x47, 0x8d, 0x48, 0x0c, 0x22, 0x8d, 0x4f, 0x01, 0x68, 0x62, 0xf3, + 0x8a, 0x11, 0x01, 0x60, 0x38, 0x46, 0x74, 0x21, 0xcc, 0xf7, 0x40, 0xfc, + 0x07, 0xf1, 0x66, 0x00, 0x4f, 0xf4, 0x80, 0x71, 0x01, 0x34, 0x01, 0x80, + 0x20, 0xf8, 0x06, 0x1c, 0x02, 0x30, 0x03, 0x2c, 0xf8, 0xd1, 0xff, 0xf7, + 0x55, 0xfa, 0x83, 0x49, 0x83, 0x4c, 0xdf, 0xf8, 0x14, 0x82, 0x6c, 0x27, + 0x4f, 0xf0, 0x30, 0x0a, 0x2a, 0x22, 0x4f, 0xf0, 0x00, 0x09, 0x60, 0x58, + 0xcd, 0xf8, 0x18, 0xb0, 0x04, 0x90, 0x00, 0x20, 0x09, 0x90, 0x60, 0x58, + 0x62, 0xf3, 0x0f, 0x20, 0x60, 0x50, 0x01, 0x20, 0xff, 0xf7, 0x8e, 0xff, + 0xd8, 0xf8, 0x00, 0x00, 0x80, 0x47, 0x00, 0x28, 0x40, 0xf0, 0xde, 0x80, + 0xcd, 0xf8, 0x2c, 0xa0, 0xcd, 0xe9, 0x01, 0x9a, 0x03, 0x97, 0xba, 0x46, + 0xdd, 0xf8, 0x18, 0xb0, 0x9f, 0x4f, 0xdf, 0xf8, 0xd4, 0x81, 0x00, 0x20, + 0x09, 0x21, 0x32, 0x25, 0xcd, 0xe9, 0x07, 0x0a, 0x70, 0x48, 0x0a, 0x91, + 0x00, 0x24, 0x02, 0x68, 0xc8, 0xb2, 0x00, 0x21, 0x90, 0x47, 0xd8, 0xf8, + 0x00, 0x10, 0x82, 0x46, 0x01, 0x20, 0x88, 0x47, 0x01, 0x20, 0x00, 0xf0, + 0xd9, 0xf8, 0x38, 0x88, 0x68, 0x43, 0x02, 0x38, 0xd8, 0x47, 0x09, 0x98, + 0x52, 0x46, 0x01, 0x23, 0xc5, 0xb2, 0x01, 0x20, 0x29, 0x46, 0xff, 0xf7, + 0x53, 0xfe, 0x41, 0xf2, 0x78, 0x50, 0x30, 0x5a, 0x10, 0xb1, 0x39, 0x88, + 0x48, 0x43, 0x84, 0x1e, 0x20, 0x46, 0xd8, 0x47, 0x0e, 0xa8, 0x0c, 0xa9, + 0x0d, 0xaa, 0x00, 0xf0, 0xcf, 0xf8, 0x00, 0x28, 0x40, 0xf0, 0x8e, 0x80, + 0x05, 0x95, 0x55, 0x4d, 0x05, 0xeb, 0x09, 0x08, 0x08, 0xf1, 0x48, 0x00, + 0x08, 0xf1, 0x54, 0x01, 0x00, 0xf0, 0xc2, 0xf9, 0xdf, 0xf8, 0x4c, 0xb1, + 0x28, 0x21, 0x58, 0x46, 0xcc, 0xf7, 0xca, 0xfb, 0x0c, 0x98, 0x40, 0xf3, + 0x16, 0x04, 0x0b, 0x99, 0x0e, 0x9e, 0x0d, 0x9f, 0xcb, 0xf8, 0x18, 0xa0, + 0x0c, 0x94, 0x6c, 0x50, 0x29, 0x44, 0x41, 0xf8, 0x30, 0x6c, 0x09, 0x99, + 0x8b, 0xf8, 0x00, 0x10, 0x0a, 0x99, 0xa1, 0xf1, 0x09, 0x01, 0x8b, 0xf8, + 0x17, 0x10, 0xcb, 0xe9, 0x01, 0x67, 0xcb, 0xe9, 0x03, 0x04, 0x05, 0xeb, + 0x49, 0x00, 0x87, 0x61, 0x06, 0xb1, 0x27, 0xb9, 0x00, 0x20, 0x41, 0xf2, + 0x3d, 0x31, 0xca, 0xf7, 0x01, 0xfa, 0x43, 0x49, 0x3b, 0x48, 0xdd, 0xf8, + 0x20, 0xa0, 0x08, 0xf1, 0x60, 0x03, 0x22, 0x46, 0x50, 0x44, 0x0d, 0x68, + 0x39, 0x46, 0x00, 0x90, 0x30, 0x46, 0xa8, 0x47, 0xdf, 0xf8, 0xec, 0xb0, + 0x00, 0x28, 0x4c, 0xd1, 0xdb, 0xf8, 0x00, 0x10, 0x00, 0x20, 0xd8, 0x46, + 0x88, 0x47, 0xb9, 0x4c, 0x60, 0x4f, 0x32, 0x25, 0x20, 0x68, 0x20, 0xf0, + 0x70, 0x00, 0x20, 0x60, 0x38, 0x88, 0xdd, 0xf8, 0x18, 0xb0, 0x68, 0x43, + 0x02, 0x38, 0xd8, 0x47, 0xb4, 0x48, 0x00, 0x26, 0x06, 0x60, 0xb4, 0x48, + 0x06, 0x60, 0xb4, 0x48, 0x06, 0x60, 0xb4, 0x48, 0x00, 0x68, 0x80, 0x47, + 0xb3, 0x48, 0x09, 0xf1, 0x02, 0x09, 0x0a, 0xf1, 0x01, 0x0a, 0x06, 0x60, + 0xef, 0x4e, 0x0b, 0x98, 0x0a, 0x99, 0x04, 0x30, 0x01, 0x31, 0x0b, 0x90, + 0x07, 0x98, 0x01, 0x30, 0x03, 0x28, 0x7f, 0xf4, 0x61, 0xaf, 0x04, 0x99, + 0x01, 0x20, 0x00, 0xf0, 0x15, 0xf9, 0x09, 0x98, 0xdd, 0xf8, 0x08, 0xa0, + 0xdd, 0xf8, 0x04, 0x90, 0x03, 0x9f, 0xa7, 0x49, 0xdf, 0xf8, 0x6c, 0x80, + 0x2a, 0x22, 0x01, 0x30, 0x0a, 0xf1, 0x0c, 0x0a, 0x09, 0xf1, 0x06, 0x09, + 0x03, 0x37, 0x02, 0x28, 0x09, 0x90, 0x7f, 0xf4, 0x2e, 0xaf, 0x96, 0xf8, + 0xca, 0x01, 0xff, 0xf7, 0x3f, 0xf9, 0xe3, 0xe6, 0x80, 0x46, 0x28, 0x46, + 0x01, 0xe0, 0x80, 0x46, 0x05, 0x98, 0x00, 0xf0, 0x7b, 0xf8, 0x93, 0x49, + 0x08, 0x68, 0x20, 0xf0, 0x70, 0x00, 0x08, 0x60, 0x04, 0x99, 0x00, 0x20, + 0x00, 0xf0, 0xec, 0xf8, 0x40, 0x46, 0x0f, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x80, 0x46, 0xf5, 0xe7, 0x00, 0x69, 0x08, 0x00, 0x34, 0xfe, 0x08, 0x00, + 0xd0, 0xfc, 0x08, 0x00, 0x48, 0x0e, 0x23, 0x40, 0xb4, 0x1a, 0x06, 0x00, + 0x00, 0xf2, 0xff, 0xff, 0x04, 0x0e, 0x03, 0x40, 0x28, 0x1d, 0x06, 0x00, + 0x84, 0x9a, 0x08, 0x00, 0x9c, 0xbd, 0x08, 0x00, 0x70, 0xfc, 0x08, 0x00, + 0xb8, 0xbd, 0x08, 0x00, 0x7f, 0x4a, 0x6f, 0xf0, 0x70, 0x01, 0x01, 0x28, + 0x08, 0xbf, 0x6f, 0xf0, 0xf0, 0x01, 0x01, 0x28, 0x13, 0x68, 0x01, 0xea, + 0x03, 0x01, 0x08, 0xbf, 0x41, 0xf0, 0xe0, 0x01, 0x11, 0x60, 0x70, 0x47, + 0x2d, 0xe9, 0xfe, 0x4f, 0x82, 0x46, 0x1d, 0x48, 0xba, 0x4e, 0xdf, 0xf8, + 0x74, 0x80, 0x00, 0x24, 0x41, 0xf2, 0x76, 0x55, 0x41, 0xf2, 0x74, 0x5b, + 0xcd, 0xe9, 0x01, 0x21, 0x81, 0x46, 0x19, 0x48, 0x47, 0x1c, 0x70, 0x5b, + 0xe1, 0xb2, 0x88, 0x42, 0x24, 0xd9, 0x36, 0xf8, 0x0b, 0x00, 0x20, 0xb1, + 0xb8, 0xf8, 0x00, 0x10, 0x48, 0x43, 0x02, 0x38, 0x00, 0xe0, 0x00, 0x20, + 0xb8, 0x47, 0x48, 0x46, 0x01, 0x34, 0xd9, 0xf8, 0x08, 0x00, 0x00, 0x02, + 0xeb, 0xd5, 0xd9, 0xf8, 0x00, 0x00, 0x6f, 0xf3, 0x9f, 0x50, 0xca, 0xf8, + 0x00, 0x00, 0xd9, 0xf8, 0x04, 0x00, 0x01, 0x99, 0x6f, 0xf3, 0x9f, 0x50, + 0x08, 0x60, 0xd9, 0xf8, 0x08, 0x00, 0x02, 0x99, 0x6f, 0xf3, 0xdf, 0x50, + 0x08, 0x60, 0x00, 0x20, 0xbd, 0xe8, 0xfe, 0x8f, 0x01, 0x20, 0xbd, 0xe8, + 0xfe, 0x8f, 0x00, 0xbf, 0x54, 0x0e, 0x03, 0x40, 0x34, 0xec, 0x01, 0x00, + 0x40, 0xec, 0x01, 0x00, 0xf8, 0xb5, 0x34, 0x4d, 0x34, 0x4e, 0x04, 0x46, + 0x1d, 0x21, 0x0a, 0x22, 0x28, 0x46, 0xb0, 0x47, 0x05, 0xf1, 0x14, 0x00, + 0x21, 0x21, 0x0a, 0x22, 0xb0, 0x47, 0x05, 0xf1, 0x28, 0x00, 0x24, 0x21, + 0x0a, 0x22, 0xb0, 0x47, 0x05, 0xf1, 0x3c, 0x00, 0x28, 0x21, 0x0a, 0x22, + 0xb0, 0x47, 0x05, 0xf1, 0x50, 0x00, 0x2d, 0x21, 0x0a, 0x22, 0xb0, 0x47, + 0x05, 0xf1, 0x64, 0x00, 0x5c, 0xb1, 0x56, 0x21, 0x0a, 0x22, 0xb0, 0x47, + 0x05, 0xf1, 0x78, 0x00, 0x5c, 0x21, 0x0a, 0x22, 0xb0, 0x47, 0x05, 0xf1, + 0x8c, 0x00, 0x5f, 0x21, 0x0a, 0xe0, 0x4a, 0x21, 0x0a, 0x22, 0xb0, 0x47, + 0x05, 0xf1, 0x78, 0x00, 0x50, 0x21, 0x0a, 0x22, 0xb0, 0x47, 0x05, 0xf1, + 0x8c, 0x00, 0x53, 0x21, 0x0a, 0x22, 0xb0, 0x47, 0x1a, 0x4a, 0x05, 0xf1, + 0xa0, 0x00, 0x00, 0x21, 0x08, 0xca, 0x01, 0x31, 0x69, 0x29, 0x08, 0xc0, + 0xfa, 0xd1, 0x17, 0x4e, 0x01, 0x20, 0x31, 0x68, 0x88, 0x47, 0x16, 0x4f, + 0x01, 0x20, 0x39, 0x68, 0x88, 0x47, 0x15, 0x4d, 0x41, 0xf2, 0x3c, 0x01, + 0x28, 0x46, 0xcc, 0xf7, 0x7b, 0xfa, 0x13, 0x4a, 0x05, 0xeb, 0x44, 0x00, + 0x01, 0x1d, 0x13, 0x68, 0x22, 0x46, 0x98, 0x47, 0x10, 0x4b, 0x05, 0xeb, + 0x84, 0x02, 0x02, 0xf1, 0x08, 0x00, 0x02, 0xf1, 0x18, 0x01, 0x10, 0x32, + 0x1d, 0x68, 0x23, 0x46, 0xa8, 0x47, 0x39, 0x68, 0x00, 0x20, 0x88, 0x47, + 0x31, 0x68, 0x00, 0x20, 0xbd, 0xe8, 0xf8, 0x40, 0x08, 0x47, 0x00, 0xbf, + 0x50, 0x1d, 0x06, 0x00, 0xa1, 0x38, 0x05, 0x00, 0x00, 0xc0, 0x05, 0x30, + 0x14, 0xfd, 0x08, 0x00, 0x0c, 0xfd, 0x08, 0x00, 0x2c, 0xff, 0x05, 0x00, + 0xfc, 0xfc, 0x08, 0x00, 0x30, 0xfe, 0x08, 0x00, 0x70, 0xb5, 0x18, 0x4d, + 0x0c, 0x46, 0x50, 0xb1, 0x00, 0x20, 0xff, 0xf7, 0xbb, 0xfd, 0x16, 0x48, + 0x01, 0x68, 0x00, 0x20, 0x88, 0x47, 0x28, 0x68, 0x20, 0xf0, 0x80, 0x00, + 0x16, 0xe0, 0x13, 0x48, 0x00, 0x26, 0x06, 0x60, 0x12, 0x48, 0x06, 0x60, + 0x12, 0x48, 0x06, 0x60, 0x12, 0x48, 0x00, 0x68, 0x80, 0x47, 0x12, 0x48, + 0x06, 0x60, 0x00, 0x20, 0xff, 0xf7, 0xa4, 0xfd, 0x0a, 0x48, 0x01, 0x68, + 0x00, 0x20, 0x88, 0x47, 0x2e, 0x60, 0x28, 0x68, 0x40, 0xf0, 0x80, 0x00, + 0x28, 0x60, 0x0c, 0x48, 0x22, 0x0a, 0x29, 0x58, 0x62, 0xf3, 0x0f, 0x21, + 0x29, 0x50, 0xca, 0x48, 0x00, 0x68, 0xbd, 0xe8, 0x70, 0x40, 0x00, 0x47, + 0x04, 0x0e, 0x03, 0x40, 0x70, 0xfc, 0x08, 0x00, 0x60, 0x20, 0x01, 0x40, + 0x78, 0x20, 0x01, 0x40, 0x88, 0x20, 0x01, 0x40, 0xf4, 0xd6, 0x08, 0x00, + 0x04, 0x28, 0x21, 0x40, 0x00, 0xf2, 0xff, 0xff, 0x03, 0x4a, 0x13, 0x68, + 0x1b, 0x0c, 0x03, 0x80, 0x10, 0x68, 0x08, 0x80, 0x70, 0x47, 0x00, 0xbf, + 0x50, 0x0e, 0x03, 0x40, 0x00, 0xb1, 0x70, 0x47, 0x08, 0x48, 0x36, 0x49, + 0xd0, 0xf8, 0x34, 0x22, 0xd1, 0xf8, 0x34, 0x32, 0x93, 0x42, 0x05, 0xd1, + 0xd0, 0xf8, 0xd8, 0x02, 0xd1, 0xf8, 0xd8, 0x12, 0x81, 0x42, 0xf0, 0xd0, + 0x02, 0x48, 0x01, 0x21, 0x01, 0x70, 0x70, 0x47, 0x98, 0x62, 0x00, 0x10, + 0xa6, 0x58, 0x01, 0x00, 0x70, 0xb5, 0x2a, 0x49, 0x00, 0x22, 0x01, 0x24, + 0x00, 0x25, 0x00, 0x23, 0x09, 0x68, 0x21, 0xfa, 0x05, 0xf6, 0x01, 0x35, + 0xf6, 0x07, 0x1c, 0xbf, 0x04, 0xfa, 0x02, 0xf6, 0x33, 0x43, 0x02, 0x32, + 0x10, 0x2d, 0xf4, 0xd1, 0x22, 0x49, 0x4f, 0xf4, 0x00, 0x65, 0xd1, 0xf8, + 0x34, 0x22, 0xd4, 0x07, 0x05, 0xea, 0x92, 0x45, 0x1f, 0x4c, 0x04, 0xbf, + 0xa0, 0x24, 0xc0, 0xf2, 0x8a, 0x04, 0x23, 0x43, 0x12, 0xf4, 0x40, 0x3f, + 0x4f, 0xf4, 0x00, 0x54, 0x18, 0xbf, 0x43, 0xf4, 0x00, 0x73, 0x04, 0xea, + 0x52, 0x14, 0x2c, 0x44, 0x23, 0x43, 0x14, 0x03, 0x58, 0xbf, 0x5f, 0xea, + 0xc2, 0x24, 0x01, 0xd5, 0x43, 0xf4, 0x00, 0x43, 0x14, 0x4c, 0x12, 0xf0, + 0x1e, 0x0f, 0x25, 0x78, 0xa6, 0x78, 0xe4, 0x78, 0xc4, 0x70, 0x4f, 0xf4, + 0x00, 0x14, 0x05, 0x70, 0x86, 0x70, 0x18, 0xbf, 0x43, 0xf0, 0x08, 0x03, + 0x04, 0xea, 0x52, 0x22, 0x1a, 0x43, 0xd1, 0xf8, 0xd8, 0x32, 0x91, 0xf8, + 0xf6, 0x1e, 0x03, 0xf0, 0x02, 0x04, 0x03, 0xf0, 0x01, 0x03, 0x01, 0xf0, + 0x01, 0x01, 0x42, 0xea, 0x04, 0x62, 0x42, 0xea, 0x43, 0x72, 0x42, 0xea, + 0xc1, 0x61, 0x41, 0x60, 0x70, 0xbd, 0x00, 0xbf, 0x98, 0xe9, 0x01, 0x00, + 0x00, 0x69, 0x08, 0x00, 0xa2, 0x00, 0x8a, 0x00, 0x9c, 0xe9, 0x01, 0x00, + 0xb0, 0xb5, 0x05, 0x46, 0x12, 0x48, 0x0c, 0x46, 0x01, 0x68, 0x20, 0x46, + 0x88, 0x47, 0x7d, 0x48, 0x41, 0x6b, 0x21, 0xf0, 0x3f, 0x11, 0x45, 0xb1, + 0x0e, 0x4a, 0x52, 0xf8, 0x24, 0x20, 0x02, 0xf0, 0x3f, 0x12, 0x11, 0x43, + 0x41, 0x63, 0x78, 0x49, 0x07, 0xe0, 0x0b, 0x4a, 0x52, 0xf8, 0x24, 0x20, + 0x02, 0xf0, 0x3f, 0x12, 0x11, 0x43, 0x41, 0x63, 0x75, 0x49, 0x0a, 0x68, + 0x42, 0xf4, 0x70, 0x52, 0x0a, 0x60, 0x01, 0x22, 0x01, 0x68, 0x62, 0xf3, + 0x05, 0x11, 0x01, 0x60, 0xb0, 0xbd, 0x00, 0xbf, 0xd0, 0xfc, 0x08, 0x00, + 0xac, 0xa2, 0x05, 0x00, 0xa4, 0xa2, 0x05, 0x00, 0xf0, 0xb5, 0x00, 0x28, + 0x04, 0x46, 0x05, 0x46, 0x67, 0x4e, 0x1c, 0xbf, 0x03, 0x24, 0x01, 0x25, + 0x6b, 0x00, 0x89, 0xb3, 0xf1, 0x6c, 0x46, 0x4a, 0x00, 0x28, 0x01, 0xf0, + 0xfc, 0x21, 0x18, 0xbf, 0x11, 0x43, 0xf1, 0x64, 0x30, 0x68, 0x01, 0x21, + 0x61, 0xf3, 0x05, 0x10, 0x41, 0x49, 0x30, 0x60, 0x18, 0x01, 0x41, 0x4e, + 0xd1, 0xf8, 0xf4, 0x21, 0x40, 0xea, 0x83, 0x10, 0x22, 0xf0, 0xf0, 0x02, + 0x10, 0x44, 0xc1, 0xf8, 0xf4, 0x01, 0x43, 0xea, 0x84, 0x40, 0x0a, 0x68, + 0x40, 0xea, 0x83, 0x70, 0x32, 0x40, 0x10, 0x43, 0x08, 0x60, 0x39, 0x49, + 0x45, 0xea, 0x04, 0x30, 0x38, 0x4c, 0x40, 0xea, 0xc3, 0x30, 0x0a, 0x68, + 0x22, 0x40, 0x10, 0x43, 0x08, 0x60, 0x08, 0x69, 0x20, 0xf0, 0xc0, 0x70, + 0x40, 0xea, 0xc3, 0x50, 0x08, 0x61, 0xf0, 0xbd, 0x99, 0x01, 0x96, 0x46, + 0x31, 0x4a, 0x00, 0x28, 0x31, 0x4f, 0x01, 0xf1, 0xa0, 0x51, 0x08, 0xbf, + 0x99, 0x01, 0x41, 0xea, 0x03, 0x1c, 0x00, 0x28, 0x4f, 0xea, 0x84, 0x70, + 0x91, 0x69, 0x01, 0xea, 0x07, 0x01, 0x61, 0x44, 0x94, 0x46, 0x91, 0x61, + 0x2a, 0x49, 0x0f, 0x68, 0x27, 0xf0, 0x01, 0x07, 0x2f, 0x44, 0x0f, 0x60, + 0x28, 0x4f, 0xf1, 0x6c, 0x01, 0xf0, 0xfc, 0x21, 0x18, 0xbf, 0x39, 0x43, + 0xbe, 0xf1, 0x00, 0x0f, 0xf1, 0x64, 0x0a, 0xd0, 0x40, 0xea, 0x44, 0x60, + 0x40, 0xea, 0xc4, 0x50, 0x40, 0xea, 0x84, 0x40, 0x40, 0xea, 0x83, 0x20, + 0x40, 0xea, 0x03, 0x20, 0x09, 0xe0, 0x40, 0xea, 0x43, 0x60, 0x40, 0xea, + 0xc3, 0x50, 0x40, 0xea, 0x84, 0x40, 0x40, 0xea, 0x84, 0x20, 0x40, 0xea, + 0x04, 0x20, 0xdc, 0xf8, 0x0c, 0x10, 0x19, 0x4a, 0x11, 0x40, 0x19, 0x4a, + 0x10, 0x40, 0x18, 0x43, 0x08, 0x44, 0xcc, 0xf8, 0x0c, 0x00, 0x17, 0x48, + 0x01, 0x69, 0x21, 0xf0, 0xc0, 0x71, 0x41, 0xea, 0xc3, 0x51, 0x01, 0x61, + 0xdc, 0xf8, 0x00, 0x10, 0x21, 0xf0, 0x01, 0x01, 0x29, 0x44, 0xcc, 0xf8, + 0x00, 0x10, 0x45, 0xea, 0x04, 0x31, 0x41, 0xea, 0xc3, 0x31, 0x02, 0x68, + 0x06, 0x4b, 0x1a, 0x40, 0x11, 0x43, 0x01, 0x60, 0xf0, 0xbd, 0x00, 0xbf, + 0xff, 0x00, 0x8a, 0x00, 0x24, 0xee, 0x05, 0x30, 0xfc, 0xff, 0xf3, 0x3f, + 0x10, 0xe2, 0x05, 0x30, 0xfe, 0x4f, 0xfe, 0xff, 0x18, 0xd6, 0x05, 0x30, + 0x0f, 0xff, 0xff, 0xe0, 0x98, 0xc0, 0x05, 0x30, 0xff, 0x00, 0x45, 0x00, + 0xfc, 0xf0, 0x73, 0x38, 0x03, 0x0f, 0x8c, 0xc7, 0x10, 0xca, 0x05, 0x30, + 0x10, 0xb5, 0x04, 0x46, 0x0f, 0x48, 0x00, 0x68, 0x80, 0x47, 0x0f, 0x48, + 0x01, 0x22, 0x41, 0x6b, 0x21, 0xf0, 0x3f, 0x11, 0x41, 0x63, 0x01, 0x68, + 0x62, 0xf3, 0x05, 0x11, 0x01, 0x60, 0x2c, 0xb1, 0x0a, 0x48, 0x0b, 0x4a, + 0x01, 0x68, 0xd2, 0xf8, 0x2c, 0x21, 0x04, 0xe0, 0x09, 0x48, 0x08, 0x4a, + 0x01, 0x68, 0xd2, 0xf8, 0x28, 0x21, 0x21, 0xf0, 0x3f, 0x11, 0x02, 0xf0, + 0x3f, 0x12, 0x11, 0x44, 0x01, 0x60, 0x10, 0xbd, 0xdc, 0xfc, 0x08, 0x00, + 0x00, 0xc0, 0x00, 0x40, 0x28, 0xee, 0x05, 0x30, 0x28, 0xe5, 0x01, 0x00, + 0x28, 0xd6, 0x05, 0x30, 0xf0, 0xb5, 0x02, 0x28, 0x14, 0xd0, 0x01, 0x28, + 0x18, 0xd1, 0xfb, 0x48, 0x77, 0x4a, 0x90, 0xf8, 0x90, 0x32, 0x90, 0xf8, + 0x91, 0x42, 0x55, 0x68, 0x00, 0xf5, 0x1f, 0x70, 0x64, 0xf3, 0x43, 0x05, + 0x55, 0x60, 0x54, 0x68, 0x63, 0xf3, 0x47, 0x14, 0x54, 0x60, 0x59, 0xb1, + 0x70, 0x4b, 0x0a, 0xe0, 0x6d, 0x48, 0x01, 0x68, 0x21, 0xf4, 0x58, 0x71, + 0x60, 0x31, 0xd2, 0xe0, 0x00, 0x29, 0x6f, 0xd0, 0x6b, 0x48, 0x6e, 0xe0, + 0x6b, 0x4b, 0x1c, 0x68, 0x40, 0xf2, 0xf3, 0x35, 0x00, 0x29, 0x6e, 0x49, + 0x24, 0xea, 0x05, 0x04, 0x04, 0xf1, 0x03, 0x04, 0x1c, 0x60, 0x67, 0x4c, + 0xd2, 0xf8, 0xec, 0x33, 0x05, 0x78, 0x86, 0x7b, 0xc7, 0x7b, 0x04, 0xea, + 0x03, 0x04, 0x05, 0xf0, 0x1f, 0x05, 0x03, 0x7c, 0x44, 0xea, 0x05, 0x24, + 0x4f, 0xf0, 0x01, 0x05, 0x04, 0xf1, 0x80, 0x74, 0xc2, 0xf8, 0xec, 0x43, + 0x5e, 0x4a, 0x14, 0x6b, 0x65, 0xf3, 0x01, 0x04, 0x14, 0x63, 0x44, 0x88, + 0x6f, 0xf3, 0xdf, 0x34, 0x44, 0xea, 0x06, 0x45, 0x16, 0x68, 0x5a, 0x4c, + 0x06, 0xea, 0x04, 0x06, 0x35, 0x44, 0x15, 0x60, 0x85, 0x88, 0x56, 0x68, + 0x6f, 0xf3, 0xdf, 0x35, 0x06, 0xea, 0x04, 0x06, 0x45, 0xea, 0x07, 0x45, + 0x35, 0x44, 0x55, 0x60, 0xc5, 0x88, 0x6f, 0xf3, 0xdf, 0x35, 0x45, 0xea, + 0x03, 0x43, 0xd5, 0x68, 0x05, 0xea, 0x04, 0x05, 0x2b, 0x44, 0xd3, 0x60, + 0x05, 0x89, 0x43, 0x7c, 0x6f, 0xf3, 0xdf, 0x35, 0x45, 0xea, 0x03, 0x43, + 0x15, 0x69, 0x05, 0xea, 0x04, 0x05, 0x2b, 0x44, 0x13, 0x61, 0x53, 0x69, + 0x03, 0xea, 0x04, 0x03, 0x84, 0x7c, 0x40, 0x89, 0x6f, 0xf3, 0xdf, 0x30, + 0x40, 0xea, 0x04, 0x40, 0x18, 0x44, 0x50, 0x61, 0x3c, 0x48, 0x02, 0x68, + 0x22, 0xf4, 0x58, 0x72, 0x02, 0xf5, 0x18, 0x72, 0x02, 0x60, 0x40, 0x4a, + 0x04, 0xbf, 0x00, 0x22, 0xc0, 0xf2, 0x01, 0x42, 0x04, 0xbf, 0x4f, 0xf6, + 0xff, 0x71, 0xcf, 0xf6, 0xfc, 0x31, 0x83, 0x68, 0x19, 0x40, 0x11, 0x43, + 0x81, 0x60, 0xf0, 0xbd, 0x34, 0x48, 0x01, 0x68, 0x40, 0xf2, 0xf3, 0x32, + 0x39, 0x4c, 0x91, 0x43, 0x32, 0x4a, 0x03, 0x31, 0x01, 0x60, 0x36, 0x48, + 0x03, 0x21, 0x01, 0x60, 0xdf, 0x48, 0xd0, 0xf8, 0xec, 0x13, 0x0a, 0x40, + 0xd5, 0x49, 0xd1, 0xf8, 0x04, 0x31, 0x23, 0x40, 0x1a, 0x44, 0xc0, 0xf8, + 0xec, 0x23, 0xd9, 0x4a, 0x13, 0x6b, 0xd1, 0xf8, 0x08, 0x41, 0x5b, 0x08, + 0x63, 0xf3, 0x5f, 0x04, 0x28, 0x4b, 0x14, 0x63, 0x14, 0x68, 0xd1, 0xf8, + 0x0c, 0x61, 0x04, 0xea, 0x03, 0x05, 0x2a, 0x4c, 0x26, 0x40, 0x35, 0x44, + 0x15, 0x60, 0x55, 0x68, 0xd1, 0xf8, 0x10, 0x61, 0x1d, 0x40, 0x26, 0x40, + 0x35, 0x44, 0x55, 0x60, 0xd5, 0x68, 0xd1, 0xf8, 0x14, 0x61, 0x1d, 0x40, + 0x26, 0x40, 0x35, 0x44, 0xd5, 0x60, 0x15, 0x69, 0xd1, 0xf8, 0x18, 0x61, + 0x1d, 0x40, 0x26, 0x40, 0x35, 0x44, 0x15, 0x61, 0x55, 0x69, 0x2b, 0x40, + 0xd1, 0xf8, 0x1c, 0x51, 0x2c, 0x40, 0x23, 0x44, 0x53, 0x61, 0x0f, 0x4a, + 0x13, 0x68, 0xd1, 0xf8, 0xfc, 0x40, 0x23, 0xf4, 0x58, 0x73, 0x04, 0xf4, + 0x58, 0x74, 0x23, 0x44, 0x13, 0x60, 0x02, 0x68, 0xd1, 0xf8, 0x00, 0x31, + 0x1b, 0x0a, 0x63, 0xf3, 0x08, 0x22, 0x02, 0x60, 0x42, 0x68, 0xd1, 0xf8, + 0x30, 0x11, 0x22, 0xf0, 0xee, 0x02, 0x01, 0xf0, 0xee, 0x01, 0x11, 0x44, + 0x41, 0x60, 0x0e, 0x48, 0x00, 0x21, 0x01, 0x60, 0xf0, 0xbd, 0x00, 0xbf, + 0x00, 0xc0, 0x03, 0x40, 0x14, 0xc4, 0x03, 0x40, 0x28, 0xf9, 0x03, 0x40, + 0x28, 0xf5, 0x03, 0x40, 0xfa, 0xe0, 0xff, 0xfe, 0x18, 0xc8, 0x03, 0x40, + 0x00, 0x80, 0x00, 0xff, 0x00, 0x00, 0x01, 0x0c, 0xff, 0xff, 0xfc, 0xf3, + 0x94, 0x1f, 0x06, 0x00, 0x05, 0x1f, 0x00, 0x01, 0xff, 0x7f, 0xff, 0x00, + 0x08, 0xc0, 0x03, 0x40, 0xb0, 0xb5, 0x0d, 0x46, 0x04, 0x46, 0x02, 0xf0, + 0xe3, 0xfe, 0x0b, 0x48, 0x2d, 0xb1, 0x41, 0x68, 0x01, 0x22, 0x62, 0xf3, + 0x01, 0x01, 0x41, 0x60, 0x05, 0xe0, 0x08, 0x49, 0x01, 0x23, 0x0a, 0x68, + 0x63, 0xf3, 0x01, 0x02, 0x0a, 0x60, 0x04, 0xb1, 0xb0, 0xbd, 0x00, 0x21, + 0xc0, 0xf8, 0x14, 0x12, 0x41, 0x60, 0x01, 0x60, 0xb0, 0xbd, 0x00, 0xbf, + 0x20, 0xec, 0x05, 0x30, 0x24, 0xd4, 0x05, 0x30, 0xb0, 0xb5, 0x29, 0x48, + 0x00, 0x22, 0x00, 0x23, 0x0c, 0x46, 0x05, 0x68, 0x00, 0x20, 0xa8, 0x47, + 0x26, 0x48, 0x21, 0x46, 0x02, 0x68, 0x00, 0x20, 0x90, 0x47, 0x25, 0x48, + 0x21, 0x46, 0x02, 0x68, 0x00, 0x20, 0x90, 0x47, 0x00, 0x20, 0x21, 0x46, + 0x00, 0x22, 0xff, 0xf7, 0xdf, 0xfd, 0x21, 0x48, 0x21, 0x46, 0x02, 0x68, + 0x00, 0x20, 0x90, 0x47, 0x1f, 0x48, 0x21, 0x46, 0x02, 0x68, 0x00, 0x20, + 0x90, 0x47, 0x1e, 0x48, 0x21, 0x46, 0x00, 0x22, 0x03, 0x68, 0x00, 0x20, + 0x98, 0x47, 0x2c, 0xb1, 0xe3, 0x48, 0x7a, 0x4a, 0x01, 0x68, 0xd2, 0xf8, + 0x24, 0x21, 0x04, 0xe0, 0xe2, 0x48, 0x77, 0x4a, 0x01, 0x68, 0xd2, 0xf8, + 0x20, 0x21, 0xd2, 0x08, 0x62, 0xf3, 0xc5, 0x01, 0x01, 0x60, 0x73, 0x48, + 0x75, 0x49, 0xd0, 0xf8, 0x34, 0x01, 0x08, 0x60, 0x20, 0x46, 0xff, 0xf7, + 0x67, 0xfe, 0x10, 0x48, 0x00, 0x78, 0xff, 0x28, 0x01, 0xd0, 0x04, 0x28, + 0x0c, 0xd1, 0x0e, 0x4c, 0x21, 0x68, 0x49, 0xb1, 0x0d, 0x48, 0xdc, 0x22, + 0x03, 0x68, 0x04, 0x20, 0x98, 0x47, 0x20, 0x68, 0xcf, 0xf7, 0xe0, 0xfb, + 0x00, 0x20, 0x20, 0x60, 0xb0, 0xbd, 0x00, 0xbf, 0xd8, 0xfc, 0x08, 0x00, + 0xec, 0xfc, 0x08, 0x00, 0xd4, 0xfc, 0x08, 0x00, 0xe4, 0xfc, 0x08, 0x00, + 0xf0, 0xfc, 0x08, 0x00, 0xe8, 0xfc, 0x08, 0x00, 0x64, 0x8d, 0x08, 0x00, + 0x20, 0xe7, 0x01, 0x00, 0xe4, 0x9b, 0x08, 0x00, 0x2d, 0xe9, 0xfe, 0x4f, + 0x31, 0x4c, 0xcd, 0xe9, 0x01, 0x12, 0x06, 0x46, 0x00, 0x20, 0x9b, 0x46, + 0x00, 0x25, 0x21, 0x68, 0x88, 0x47, 0x21, 0x68, 0x01, 0x20, 0x88, 0x47, + 0x2c, 0x48, 0x2d, 0x4c, 0xdf, 0xf8, 0xb4, 0x90, 0x6f, 0xf0, 0x01, 0x08, + 0x00, 0xf5, 0x2b, 0x77, 0x2b, 0x48, 0x00, 0xf1, 0x01, 0x0a, 0x64, 0x2d, + 0x24, 0xd0, 0xb9, 0xf8, 0x00, 0x00, 0x00, 0xeb, 0x80, 0x00, 0x08, 0xeb, + 0x40, 0x00, 0xd0, 0x47, 0x38, 0x78, 0xc0, 0x07, 0x1c, 0xd1, 0x20, 0x68, + 0x01, 0x35, 0x80, 0x05, 0xef, 0xd5, 0x23, 0x4f, 0xbb, 0xf1, 0x00, 0x0f, + 0x1d, 0xd0, 0x22, 0x48, 0x22, 0x49, 0x00, 0x68, 0x38, 0x40, 0x30, 0x60, + 0x07, 0xf5, 0x80, 0x00, 0x09, 0x68, 0x01, 0x9c, 0x08, 0x40, 0x1f, 0x49, + 0x20, 0x60, 0x0a, 0x68, 0x17, 0x21, 0x90, 0x47, 0x20, 0x60, 0x1d, 0x48, + 0x00, 0x68, 0x19, 0xe0, 0x01, 0x24, 0x1b, 0xe0, 0x78, 0x78, 0xb9, 0x78, + 0xfa, 0x78, 0x30, 0x60, 0x02, 0x98, 0x01, 0x60, 0x01, 0x98, 0x02, 0x60, + 0x11, 0xe0, 0xe0, 0x68, 0x38, 0x40, 0x30, 0x60, 0x07, 0xf5, 0x80, 0x00, + 0x61, 0x69, 0x01, 0x9d, 0x08, 0x40, 0x11, 0x49, 0x28, 0x60, 0x0a, 0x68, + 0x17, 0x21, 0x90, 0x47, 0x28, 0x60, 0x20, 0x69, 0x02, 0x99, 0x38, 0x40, + 0x08, 0x60, 0x00, 0x24, 0x03, 0x48, 0x01, 0x68, 0x00, 0x20, 0x88, 0x47, + 0x20, 0x46, 0xbd, 0xe8, 0xfe, 0x8f, 0x00, 0xbf, 0x0c, 0xfe, 0x08, 0x00, + 0x00, 0x69, 0x08, 0x00, 0x18, 0xc4, 0x23, 0x40, 0x34, 0xec, 0x01, 0x00, + 0x40, 0xec, 0x01, 0x00, 0xff, 0xff, 0x3f, 0x00, 0x04, 0xcc, 0x23, 0x40, + 0x0c, 0xcc, 0x23, 0x40, 0x10, 0xfe, 0x08, 0x00, 0x08, 0xcc, 0x23, 0x40, + 0x2d, 0xe9, 0xf0, 0x4f, 0x1d, 0x48, 0x20, 0x4b, 0x24, 0x4d, 0x87, 0x4a, + 0x21, 0x4f, 0x84, 0x4c, 0x1c, 0x49, 0x1f, 0x4e, 0x43, 0x64, 0x20, 0x4b, + 0xab, 0x46, 0x01, 0xf5, 0xa0, 0x4e, 0x01, 0xf1, 0x08, 0x08, 0x03, 0xf1, + 0x14, 0x09, 0x03, 0xf1, 0x10, 0x0a, 0x03, 0xf1, 0x0c, 0x05, 0x03, 0xf1, + 0x30, 0x0c, 0xc0, 0xe9, 0x09, 0x5a, 0xc0, 0xe9, 0x0b, 0x92, 0x14, 0x4a, + 0xc0, 0xe9, 0x0d, 0x47, 0x04, 0x1d, 0xc6, 0x63, 0x02, 0x64, 0x84, 0xe8, + 0x02, 0x41, 0x0d, 0x4c, 0x1a, 0x1d, 0xc0, 0xf8, 0x10, 0xb0, 0xc0, 0xe9, + 0x05, 0x4c, 0xc0, 0xe9, 0x07, 0x32, 0x11, 0x22, 0x02, 0x70, 0x09, 0x68, + 0x40, 0xf8, 0xf4, 0x1f, 0x01, 0x21, 0x04, 0x30, 0x50, 0xf8, 0xf0, 0x2c, + 0x01, 0x31, 0x11, 0x29, 0x12, 0x68, 0x04, 0xc0, 0xf8, 0xd1, 0xbd, 0xe8, + 0xf0, 0x8f, 0x00, 0xbf, 0x28, 0xe5, 0x01, 0x00, 0x00, 0xc8, 0x03, 0x40, + 0x00, 0x70, 0x03, 0x40, 0x98, 0xc0, 0x05, 0x30, 0x18, 0xc4, 0x03, 0x40, + 0x28, 0xee, 0x05, 0x30, 0x28, 0xd6, 0x05, 0x30, 0x18, 0xc8, 0x03, 0x40, + 0x14, 0xc4, 0x03, 0x40, 0x2d, 0xe9, 0xfc, 0x47, 0x1d, 0x46, 0x83, 0x1a, + 0x89, 0x46, 0x17, 0x18, 0x03, 0xf0, 0x00, 0x41, 0x3e, 0x46, 0x41, 0xea, + 0x53, 0x01, 0x4f, 0xea, 0xc3, 0x73, 0x08, 0xbf, 0x01, 0x26, 0x32, 0x46, + 0x18, 0x46, 0x00, 0x23, 0x02, 0xf0, 0x8a, 0xfd, 0xdf, 0xf8, 0x3c, 0x80, + 0x4f, 0xf0, 0x20, 0x0a, 0x1f, 0x22, 0x1f, 0x23, 0xcd, 0xf8, 0x00, 0xa0, + 0xd8, 0xf8, 0x00, 0x40, 0xa0, 0x47, 0x28, 0x60, 0x00, 0x20, 0x49, 0x46, + 0x32, 0x46, 0x00, 0x23, 0x02, 0xf0, 0x78, 0xfd, 0xd8, 0xf8, 0x00, 0x40, + 0x20, 0x22, 0x20, 0x23, 0xcd, 0xf8, 0x00, 0xa0, 0xa0, 0x47, 0x0a, 0x99, + 0x08, 0x60, 0xb7, 0xfa, 0x87, 0xf0, 0x40, 0x09, 0xbd, 0xe8, 0xfc, 0x87, + 0x94, 0xfb, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, 0xa1, 0xb0, 0x4f, 0xf4, + 0x80, 0x70, 0x00, 0x21, 0xad, 0xf8, 0x76, 0x00, 0x4f, 0xf4, 0x00, 0x40, + 0x8d, 0xf8, 0x75, 0x10, 0xad, 0xf8, 0x70, 0x10, 0xad, 0xf8, 0x72, 0x00, + 0xdf, 0xf8, 0xfc, 0x05, 0xb0, 0xf8, 0x56, 0x12, 0xd0, 0xf8, 0x78, 0x82, + 0x0d, 0x91, 0xd0, 0xf8, 0x34, 0x12, 0x0a, 0x03, 0x58, 0xbf, 0x5f, 0xea, + 0xc1, 0x21, 0x40, 0xf1, 0xec, 0x82, 0x00, 0xf5, 0x0d, 0x70, 0x0e, 0x90, + 0xdf, 0xf8, 0xdc, 0x05, 0x00, 0x68, 0x80, 0x47, 0x0d, 0x98, 0xdf, 0xf8, + 0xd8, 0x35, 0xdf, 0xf8, 0xe4, 0x55, 0xdf, 0xf8, 0x18, 0x66, 0x4f, 0xf4, + 0x80, 0x72, 0x4f, 0xf0, 0x04, 0x0a, 0x00, 0x24, 0x00, 0x27, 0x40, 0x42, + 0x0c, 0x90, 0x13, 0xa8, 0x00, 0xf1, 0x0c, 0x01, 0x08, 0x91, 0x00, 0xf1, + 0x08, 0x01, 0x04, 0x30, 0x09, 0x90, 0xdf, 0xf8, 0xdc, 0x05, 0x07, 0x91, + 0x01, 0x30, 0x0a, 0x90, 0x00, 0x20, 0x05, 0x90, 0x0e, 0x98, 0x00, 0x68, + 0x01, 0x03, 0x02, 0xd4, 0x00, 0x2c, 0x00, 0xf0, 0xb4, 0x82, 0xc0, 0x02, + 0x02, 0xd4, 0x01, 0x2c, 0x00, 0xf0, 0xbc, 0x82, 0x04, 0xeb, 0x44, 0x00, + 0x13, 0xf8, 0x10, 0x10, 0x21, 0xb1, 0x03, 0xeb, 0x40, 0x00, 0x82, 0x88, + 0xc0, 0x78, 0x05, 0x90, 0x4f, 0xf0, 0x00, 0x09, 0x03, 0x92, 0x04, 0x94, + 0xdf, 0xf8, 0x6c, 0x05, 0xcd, 0xf8, 0x2c, 0x90, 0x00, 0x78, 0xff, 0x28, + 0x01, 0xd0, 0x04, 0x28, 0x1e, 0xd1, 0xdf, 0xf8, 0x60, 0x05, 0x00, 0x68, + 0x50, 0xb9, 0xdf, 0xf8, 0x5c, 0x05, 0x01, 0x68, 0xdc, 0x20, 0x88, 0x47, + 0xdf, 0xf8, 0x4c, 0x15, 0xdd, 0xf8, 0x2c, 0x90, 0x08, 0x60, 0x78, 0xb1, + 0xdc, 0x21, 0xcc, 0xf7, 0x2b, 0xfa, 0xdf, 0xf8, 0x3c, 0x15, 0xdd, 0xf8, + 0x2c, 0x90, 0x09, 0x68, 0x4f, 0xea, 0x19, 0x20, 0xc8, 0x70, 0x20, 0x0a, + 0x81, 0xf8, 0x02, 0x90, 0x0c, 0x70, 0x48, 0x70, 0x24, 0xb1, 0x01, 0x49, + 0x06, 0xe0, 0x00, 0xbf, 0x0c, 0xee, 0x05, 0x30, 0x00, 0x49, 0x01, 0xe0, + 0x0c, 0xd6, 0x05, 0x30, 0x08, 0x68, 0x5f, 0xfa, 0x84, 0xfb, 0x6a, 0xf3, + 0xc5, 0x00, 0x08, 0x60, 0x58, 0x46, 0x2a, 0x68, 0x5f, 0xfa, 0x89, 0xf5, + 0x29, 0x46, 0x90, 0x47, 0xdf, 0xf8, 0x00, 0x05, 0x59, 0x46, 0x02, 0x68, + 0x01, 0x20, 0x90, 0x47, 0x01, 0x20, 0x59, 0x46, 0x2a, 0x46, 0xff, 0xf7, + 0xe9, 0xfb, 0xdf, 0xf8, 0xf0, 0x04, 0x59, 0x46, 0x02, 0x68, 0x01, 0x20, + 0x90, 0x47, 0xdf, 0xf8, 0xe8, 0x04, 0x59, 0x46, 0x2a, 0x46, 0x03, 0x68, + 0x01, 0x20, 0x98, 0x47, 0xdf, 0xf8, 0xdc, 0x04, 0x00, 0x68, 0x80, 0x47, + 0x00, 0x28, 0x40, 0xf0, 0x49, 0x82, 0x1f, 0xfa, 0x89, 0xf0, 0xb2, 0x46, + 0x0e, 0x9e, 0x00, 0x23, 0x00, 0x25, 0x01, 0x28, 0xdf, 0xf8, 0xc8, 0x04, + 0x31, 0x6c, 0x08, 0xbf, 0x88, 0x46, 0x42, 0x46, 0x04, 0x68, 0x01, 0x20, + 0x59, 0x46, 0xa0, 0x47, 0x70, 0x8b, 0x20, 0xb1, 0xdf, 0xf8, 0xb4, 0x14, + 0x09, 0x88, 0x48, 0x43, 0x85, 0x1e, 0x0a, 0x99, 0x28, 0x46, 0x88, 0x47, + 0xdf, 0xf8, 0xac, 0x04, 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, 0xdf, 0xf8, + 0xa8, 0x04, 0x1f, 0xa9, 0x1e, 0xaa, 0x5b, 0x46, 0x04, 0x68, 0x20, 0xa8, + 0xa0, 0x47, 0x00, 0x28, 0x40, 0xf0, 0x1e, 0x82, 0x09, 0x9b, 0xdd, 0xe9, + 0x1e, 0x21, 0x20, 0x98, 0x56, 0x46, 0x00, 0x93, 0x13, 0xab, 0xff, 0xf7, + 0xdb, 0xfe, 0x00, 0x28, 0x40, 0xf0, 0x12, 0x82, 0xdf, 0xf8, 0x44, 0x04, + 0x00, 0x78, 0xff, 0x28, 0x01, 0xd0, 0x04, 0x28, 0x3a, 0xd1, 0xdf, 0xf8, + 0x3c, 0x04, 0x00, 0x68, 0xb0, 0xb3, 0xdd, 0xe9, 0x13, 0x21, 0x20, 0x9b, + 0x1e, 0x9c, 0x1f, 0x9d, 0x00, 0xf8, 0x20, 0x1f, 0x1e, 0x0e, 0x00, 0xf8, + 0x1c, 0x3d, 0x00, 0xf8, 0x08, 0x4f, 0x00, 0xf8, 0x04, 0x5d, 0x00, 0xf8, + 0x14, 0x2f, 0x00, 0xf8, 0x15, 0x6c, 0x1e, 0x0c, 0x1b, 0x0a, 0x00, 0xf8, + 0x17, 0x3c, 0x23, 0x0e, 0x00, 0xf8, 0x16, 0x6c, 0x56, 0x46, 0x00, 0xf8, + 0x0d, 0x3c, 0x23, 0x0c, 0x00, 0xf8, 0x0e, 0x3c, 0x23, 0x0a, 0x00, 0xf8, + 0x0f, 0x3c, 0x2b, 0x0e, 0x00, 0xf8, 0x11, 0x3c, 0x2b, 0x0c, 0x00, 0xf8, + 0x12, 0x3c, 0x2b, 0x0a, 0x00, 0xf8, 0x13, 0x3c, 0x13, 0x0e, 0xc3, 0x70, + 0x13, 0x0c, 0x12, 0x0a, 0x42, 0x70, 0x0a, 0x0e, 0x83, 0x70, 0xc2, 0x71, + 0x0a, 0x0c, 0x09, 0x0a, 0x82, 0x71, 0x41, 0x71, 0xdf, 0xf8, 0xf8, 0x03, + 0x59, 0x46, 0x02, 0x68, 0x01, 0x20, 0x90, 0x47, 0xdf, 0xf8, 0xe8, 0x03, + 0x1f, 0xa9, 0x1e, 0xaa, 0x5b, 0x46, 0x04, 0x68, 0x20, 0xa8, 0xa0, 0x47, + 0x00, 0x28, 0x40, 0xf0, 0xbf, 0x81, 0xdf, 0xf8, 0xd0, 0x03, 0x01, 0x68, + 0x00, 0x20, 0x88, 0x47, 0x08, 0x9b, 0xdd, 0xe9, 0x1e, 0x21, 0x20, 0x98, + 0x00, 0x93, 0x07, 0x9b, 0xff, 0xf7, 0x78, 0xfe, 0x00, 0x28, 0x40, 0xf0, + 0xaf, 0x81, 0xe0, 0x48, 0xcd, 0xf8, 0x18, 0x80, 0x00, 0x78, 0xff, 0x28, + 0x01, 0xd0, 0x04, 0x28, 0x33, 0xd1, 0xdd, 0x48, 0x00, 0x68, 0x80, 0xb3, + 0xdd, 0xe9, 0x15, 0x21, 0x20, 0x9b, 0x1e, 0x9c, 0x1f, 0x9d, 0x00, 0xf8, + 0x28, 0x1f, 0x1e, 0x0e, 0x00, 0xf8, 0x04, 0x2d, 0x00, 0xf8, 0x14, 0x3d, + 0x00, 0xf8, 0x08, 0x4f, 0x00, 0xf8, 0x04, 0x5d, 0x00, 0xf8, 0x01, 0x6c, + 0x1e, 0x0c, 0x1b, 0x0a, 0x00, 0xf8, 0x03, 0x3c, 0x23, 0x0e, 0x00, 0xf8, + 0x02, 0x6c, 0x56, 0x46, 0xc3, 0x71, 0x23, 0x0c, 0x83, 0x71, 0x23, 0x0a, + 0x43, 0x71, 0x2b, 0x0e, 0xc3, 0x70, 0x2b, 0x0c, 0x83, 0x70, 0x2b, 0x0a, + 0x43, 0x70, 0x13, 0x0e, 0xc3, 0x74, 0x13, 0x0c, 0x12, 0x0a, 0x42, 0x74, + 0x0a, 0x0e, 0x83, 0x74, 0xc2, 0x75, 0x0a, 0x0c, 0x09, 0x0a, 0x82, 0x75, + 0x41, 0x75, 0xc6, 0x48, 0x59, 0x46, 0x02, 0x68, 0x02, 0x20, 0x90, 0x47, + 0xc4, 0x48, 0x59, 0x46, 0x02, 0x68, 0x02, 0x20, 0x90, 0x47, 0xcc, 0x48, + 0x59, 0x46, 0x02, 0x68, 0x02, 0x20, 0x90, 0x47, 0x0e, 0x98, 0x90, 0xf8, + 0x62, 0x00, 0x00, 0x28, 0x00, 0xf0, 0xfe, 0x80, 0x4f, 0xf0, 0x00, 0x09, + 0xc6, 0x48, 0x9d, 0xf9, 0x75, 0x10, 0x00, 0x22, 0x5b, 0x46, 0x04, 0x68, + 0xbd, 0xf8, 0x76, 0x00, 0xa0, 0x47, 0xc0, 0x48, 0x59, 0x46, 0x02, 0x68, + 0x00, 0x20, 0x90, 0x47, 0x0d, 0x98, 0x34, 0x68, 0x0d, 0xf1, 0x6a, 0x01, + 0x1a, 0xaa, 0x5b, 0x46, 0x05, 0xb2, 0x28, 0x46, 0xa0, 0x47, 0x00, 0x28, + 0x40, 0xf0, 0x42, 0x81, 0xbd, 0xf8, 0x6a, 0x00, 0x0d, 0xf1, 0x66, 0x01, + 0x19, 0xaa, 0x5b, 0x46, 0x40, 0xf3, 0x0c, 0x00, 0xad, 0xf8, 0x6a, 0x00, + 0xbd, 0xf8, 0x68, 0x00, 0x40, 0xf3, 0x0c, 0x00, 0x34, 0x68, 0xad, 0xf8, + 0x68, 0x00, 0x0c, 0x98, 0x0f, 0xfa, 0x80, 0xf8, 0x40, 0x46, 0xa0, 0x47, + 0x00, 0x28, 0x40, 0xf0, 0x29, 0x81, 0xbd, 0xf8, 0x66, 0x10, 0x41, 0xf3, + 0x0c, 0x00, 0xbd, 0xf8, 0x64, 0x40, 0xc9, 0x04, 0xad, 0xf8, 0x66, 0x00, + 0x44, 0xf3, 0x0c, 0x03, 0xe6, 0x04, 0xbd, 0xf8, 0x68, 0x40, 0xbd, 0xf8, + 0x6a, 0x20, 0xad, 0xf8, 0x64, 0x30, 0xa4, 0xeb, 0xe6, 0x47, 0x93, 0x4e, + 0xa2, 0xeb, 0xe1, 0x41, 0xad, 0xf8, 0x5c, 0x10, 0xad, 0xf8, 0x5e, 0x70, + 0x36, 0x78, 0xff, 0x2e, 0x01, 0xd0, 0x04, 0x2e, 0x20, 0xd1, 0x8e, 0x4e, + 0x36, 0x68, 0xee, 0xb1, 0x86, 0xf8, 0x34, 0x30, 0x86, 0xf8, 0x2e, 0x20, + 0x1b, 0x0a, 0x12, 0x0a, 0x86, 0xf8, 0x3e, 0x10, 0x86, 0xf8, 0x32, 0x00, + 0x09, 0x0a, 0x00, 0x0a, 0x86, 0xf8, 0x30, 0x40, 0x86, 0xf8, 0x40, 0x70, + 0x86, 0xf8, 0x35, 0x30, 0x23, 0x0a, 0x86, 0xf8, 0x2f, 0x20, 0x3a, 0x0a, + 0x86, 0xf8, 0x3f, 0x10, 0x86, 0xf8, 0x33, 0x00, 0x86, 0xf8, 0x31, 0x30, + 0x86, 0xf8, 0x41, 0x20, 0x8a, 0x48, 0x59, 0x46, 0x02, 0x68, 0x01, 0x20, + 0x90, 0x47, 0xda, 0xf8, 0x00, 0x40, 0x28, 0x46, 0x0d, 0xf1, 0x6a, 0x01, + 0x1a, 0xaa, 0x5b, 0x46, 0x56, 0x46, 0xa0, 0x47, 0x00, 0x28, 0x40, 0xf0, + 0xd7, 0x80, 0xbd, 0xf8, 0x6a, 0x00, 0x0d, 0xf1, 0x66, 0x01, 0x19, 0xaa, + 0x5b, 0x46, 0x40, 0xf3, 0x0c, 0x00, 0xad, 0xf8, 0x6a, 0x00, 0xbd, 0xf8, + 0x68, 0x00, 0x40, 0xf3, 0x0c, 0x00, 0x34, 0x68, 0xad, 0xf8, 0x68, 0x00, + 0x40, 0x46, 0xa0, 0x47, 0x00, 0x28, 0x40, 0xf0, 0xc1, 0x80, 0xbd, 0xf8, + 0x66, 0x10, 0x68, 0x4e, 0x41, 0xf3, 0x0c, 0x00, 0xbd, 0xf8, 0x64, 0x40, + 0xc9, 0x04, 0xad, 0xf8, 0x66, 0x00, 0x44, 0xf3, 0x0c, 0x03, 0xbd, 0xf8, + 0x6a, 0x20, 0xe5, 0x04, 0xbd, 0xf8, 0x68, 0x40, 0x36, 0x78, 0xad, 0xf8, + 0x64, 0x30, 0xa2, 0xeb, 0xe1, 0x41, 0xa4, 0xeb, 0xe5, 0x45, 0xff, 0x2e, + 0xad, 0xf8, 0x60, 0x10, 0xad, 0xf8, 0x62, 0x50, 0x01, 0xd0, 0x04, 0x2e, + 0x20, 0xd1, 0x5a, 0x4e, 0x36, 0x68, 0xee, 0xb1, 0x86, 0xf8, 0x3c, 0x30, + 0x86, 0xf8, 0x36, 0x20, 0x1b, 0x0a, 0x12, 0x0a, 0x86, 0xf8, 0x42, 0x10, + 0x86, 0xf8, 0x3a, 0x00, 0x09, 0x0a, 0x00, 0x0a, 0x86, 0xf8, 0x38, 0x40, + 0x86, 0xf8, 0x44, 0x50, 0x86, 0xf8, 0x3d, 0x30, 0x23, 0x0a, 0x86, 0xf8, + 0x37, 0x20, 0x2a, 0x0a, 0x86, 0xf8, 0x43, 0x10, 0x86, 0xf8, 0x3b, 0x00, + 0x86, 0xf8, 0x39, 0x30, 0x86, 0xf8, 0x45, 0x20, 0x00, 0x20, 0x0f, 0xa9, + 0xcd, 0xe9, 0x11, 0x00, 0xcd, 0xe9, 0x0f, 0x00, 0x57, 0x48, 0x02, 0x68, + 0x13, 0xa8, 0x90, 0x47, 0x00, 0x28, 0x73, 0xd1, 0x55, 0x48, 0x11, 0x99, + 0x0d, 0xf1, 0x76, 0x02, 0x0d, 0xf1, 0x75, 0x03, 0x04, 0x68, 0x0f, 0x98, + 0xa0, 0x47, 0x00, 0x28, 0x68, 0xd1, 0x0e, 0x98, 0x09, 0xf1, 0x01, 0x09, + 0x56, 0x46, 0x90, 0xf8, 0x62, 0x00, 0x81, 0x45, 0xff, 0xf4, 0x04, 0xaf, + 0x0b, 0x98, 0x00, 0x04, 0x15, 0xd0, 0x47, 0x48, 0x9d, 0xf9, 0x75, 0x10, + 0x00, 0x22, 0x5b, 0x46, 0x00, 0x27, 0x04, 0x68, 0xbd, 0xf8, 0x76, 0x00, + 0xa0, 0x47, 0x3a, 0x48, 0x59, 0x46, 0x02, 0x68, 0x01, 0x20, 0x90, 0x47, + 0xdd, 0xf8, 0x2c, 0x90, 0xdd, 0xf8, 0x18, 0x80, 0x30, 0x4d, 0x04, 0x9c, + 0x36, 0xe0, 0x0e, 0x98, 0x90, 0xf8, 0x60, 0x00, 0x30, 0xb3, 0x3e, 0x48, + 0x12, 0x99, 0x0d, 0xf1, 0x72, 0x02, 0x1c, 0xab, 0x04, 0x68, 0x10, 0x98, + 0xa0, 0x47, 0xdd, 0xf8, 0x18, 0x80, 0x28, 0x4d, 0x04, 0x9c, 0x07, 0x46, + 0xe8, 0xb9, 0x38, 0x48, 0x05, 0x99, 0xbd, 0xf9, 0x70, 0x30, 0xbd, 0xf8, + 0x72, 0x20, 0x07, 0x68, 0x1b, 0xa8, 0x49, 0xb2, 0x00, 0x90, 0x0d, 0xf1, + 0x6f, 0x00, 0x01, 0x90, 0x03, 0x98, 0x80, 0xb2, 0xb8, 0x47, 0x31, 0x48, + 0x9d, 0xf9, 0x6f, 0x10, 0x5a, 0x46, 0x03, 0x68, 0xbd, 0xf8, 0x6c, 0x00, + 0x98, 0x47, 0x03, 0xe0, 0xdd, 0xf8, 0x18, 0x80, 0x18, 0x4d, 0x04, 0x9c, + 0x00, 0x27, 0x1c, 0x48, 0x59, 0x46, 0x02, 0x68, 0x00, 0x20, 0x90, 0x47, + 0xdd, 0xf8, 0x2c, 0x90, 0x4f, 0xf0, 0x04, 0x0a, 0x09, 0xf1, 0x01, 0x09, + 0x1f, 0xfa, 0x89, 0xf0, 0x02, 0x28, 0x7f, 0xf4, 0x61, 0xad, 0x03, 0x9a, + 0x0a, 0x4b, 0x01, 0x34, 0x02, 0x2c, 0x7f, 0xf4, 0x41, 0xad, 0x07, 0xe0, + 0x07, 0x46, 0x10, 0x48, 0x59, 0x46, 0x02, 0x68, 0x00, 0x20, 0x90, 0x47, + 0x00, 0xe0, 0x00, 0x27, 0xf8, 0xb2, 0x21, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x00, 0x69, 0x08, 0x00, 0xcc, 0xfc, 0x08, 0x00, 0x90, 0xe4, 0x01, 0x00, + 0x64, 0x8d, 0x08, 0x00, 0x20, 0xe7, 0x01, 0x00, 0xd4, 0x9b, 0x08, 0x00, + 0x2c, 0xfe, 0x08, 0x00, 0xd4, 0xfc, 0x08, 0x00, 0xe4, 0xfc, 0x08, 0x00, + 0xe8, 0xfc, 0x08, 0x00, 0x84, 0x9a, 0x08, 0x00, 0x34, 0xfe, 0x08, 0x00, + 0xd8, 0xfc, 0x08, 0x00, 0x34, 0xec, 0x01, 0x00, 0x40, 0xec, 0x01, 0x00, + 0x08, 0xfe, 0x08, 0x00, 0x30, 0xfe, 0x08, 0x00, 0xec, 0xfc, 0x08, 0x00, + 0xf0, 0xfc, 0x08, 0x00, 0x3c, 0xfe, 0x08, 0x00, 0x40, 0xfe, 0x08, 0x00, + 0x44, 0xfe, 0x08, 0x00, 0x48, 0xfe, 0x08, 0x00, 0xf4, 0xfc, 0x08, 0x00, + 0xf8, 0xfc, 0x08, 0x00, 0x28, 0xfe, 0x08, 0x00, 0xf0, 0xb5, 0xc0, 0x48, + 0x90, 0xf8, 0xd7, 0x1d, 0x01, 0x29, 0x3c, 0xd1, 0x41, 0xf2, 0xca, 0x0c, + 0x10, 0xf8, 0x0c, 0x20, 0xba, 0xb3, 0x1c, 0x4b, 0x1c, 0x4c, 0x00, 0x22, + 0x04, 0xeb, 0x82, 0x05, 0x1e, 0x68, 0x2d, 0x6a, 0x56, 0xf8, 0x22, 0x70, + 0x69, 0x08, 0x61, 0xf3, 0x41, 0x07, 0x46, 0xf8, 0x22, 0x70, 0xaf, 0x08, + 0x19, 0x68, 0x51, 0xf8, 0x22, 0x60, 0x67, 0xf3, 0x82, 0x06, 0x2f, 0x09, + 0x41, 0xf8, 0x22, 0x60, 0x19, 0x68, 0x51, 0xf8, 0x22, 0x60, 0x67, 0xf3, + 0x07, 0x16, 0x2f, 0x0c, 0x41, 0xf8, 0x22, 0x60, 0x2e, 0x0a, 0xad, 0x0f, + 0x19, 0x68, 0x01, 0xeb, 0x82, 0x01, 0x4e, 0x70, 0x19, 0x68, 0x51, 0xf8, + 0x22, 0x60, 0x67, 0xf3, 0x1d, 0x46, 0x41, 0xf8, 0x22, 0x60, 0x19, 0x68, + 0x51, 0xf8, 0x22, 0x60, 0x65, 0xf3, 0x9f, 0x76, 0x41, 0xf8, 0x22, 0x60, + 0x01, 0x32, 0x10, 0xf8, 0x0c, 0x10, 0x8a, 0x42, 0xca, 0xd3, 0xf0, 0xbd, + 0x24, 0xe5, 0x01, 0x00, 0xfc, 0x2d, 0x06, 0x00, 0x70, 0xb5, 0x28, 0x49, + 0x0b, 0x68, 0x03, 0xeb, 0x80, 0x04, 0x33, 0xf8, 0x20, 0x20, 0x65, 0x88, + 0x42, 0xea, 0x05, 0x45, 0x24, 0x4a, 0x02, 0xeb, 0x80, 0x02, 0x52, 0x68, + 0x62, 0xf3, 0x00, 0x05, 0x23, 0xf8, 0x20, 0x50, 0x2b, 0x0c, 0x63, 0x80, + 0x0b, 0x68, 0x03, 0xeb, 0x80, 0x05, 0x33, 0xf8, 0x20, 0x40, 0x6e, 0x88, + 0x44, 0xea, 0x06, 0x44, 0x16, 0x09, 0x66, 0xf3, 0x06, 0x14, 0x23, 0xf8, + 0x20, 0x40, 0x23, 0x0c, 0x6b, 0x80, 0x0b, 0x68, 0x03, 0xeb, 0x80, 0x05, + 0x33, 0xf8, 0x20, 0x40, 0x6e, 0x88, 0x44, 0xea, 0x06, 0x44, 0x16, 0x0a, + 0x66, 0xf3, 0x0d, 0x24, 0x23, 0xf8, 0x20, 0x40, 0x23, 0x0c, 0x6b, 0x80, + 0x0b, 0x68, 0x03, 0xeb, 0x80, 0x05, 0x33, 0xf8, 0x20, 0x40, 0x6e, 0x88, + 0x44, 0xea, 0x06, 0x44, 0x16, 0x0c, 0x12, 0x0e, 0x66, 0xf3, 0x15, 0x44, + 0x23, 0xf8, 0x20, 0x40, 0x23, 0x0c, 0x6b, 0x80, 0x09, 0x68, 0x01, 0xeb, + 0x80, 0x04, 0x31, 0xf8, 0x20, 0x30, 0x65, 0x88, 0x43, 0xea, 0x05, 0x43, + 0x62, 0xf3, 0x1d, 0x63, 0x21, 0xf8, 0x20, 0x30, 0x18, 0x0c, 0x60, 0x80, + 0x70, 0xbd, 0x00, 0xbf, 0x98, 0x1f, 0x06, 0x00, 0x9c, 0x2e, 0x06, 0x00, + 0x2d, 0xe9, 0xf8, 0x4f, 0xd4, 0x4e, 0x05, 0x46, 0x89, 0x46, 0x70, 0x78, + 0x00, 0x28, 0x00, 0xf0, 0x80, 0x80, 0xd2, 0x4f, 0xdf, 0xf8, 0xa8, 0xb1, + 0x4f, 0xf0, 0x00, 0x08, 0x0f, 0x24, 0x4f, 0xf0, 0x00, 0x0a, 0x4f, 0xfa, + 0x8a, 0xf0, 0xff, 0xf7, 0x95, 0xff, 0x38, 0x68, 0x30, 0xf8, 0x28, 0x10, + 0x00, 0xeb, 0x88, 0x00, 0x40, 0x88, 0x41, 0xea, 0x00, 0x42, 0xc2, 0xf3, + 0x05, 0x40, 0x6b, 0x68, 0x33, 0xf8, 0x20, 0x10, 0xc2, 0xf3, 0x05, 0x20, + 0xd2, 0x07, 0x33, 0xf8, 0x20, 0x00, 0x05, 0xd1, 0x5c, 0x4a, 0x00, 0xb2, + 0x09, 0xb2, 0x12, 0x68, 0x90, 0x47, 0x05, 0xe0, 0xdb, 0xf8, 0x00, 0x20, + 0x00, 0xb2, 0x09, 0xb2, 0x90, 0x47, 0x28, 0x80, 0x39, 0x68, 0x31, 0xf8, + 0x28, 0x20, 0x01, 0xeb, 0x88, 0x01, 0x49, 0x88, 0x42, 0xea, 0x01, 0x42, + 0xc2, 0xf3, 0x05, 0x61, 0xc2, 0xf3, 0x02, 0x12, 0xdf, 0xe8, 0x02, 0xf0, + 0x0c, 0x15, 0x04, 0x04, 0x1d, 0x25, 0x2d, 0x36, 0x0f, 0x29, 0x28, 0xbf, + 0x21, 0x46, 0x09, 0xeb, 0x41, 0x01, 0xa1, 0xf8, 0xe4, 0x00, 0x32, 0xe0, + 0x32, 0x78, 0x91, 0x42, 0x28, 0xbf, 0x51, 0x1e, 0x6a, 0x68, 0x89, 0xb2, + 0x22, 0xf8, 0x21, 0x00, 0x29, 0xe0, 0x00, 0x29, 0x18, 0xbf, 0x01, 0x21, + 0xd9, 0xf8, 0x00, 0x20, 0x22, 0xf8, 0x11, 0x00, 0x21, 0xe0, 0x0f, 0x29, + 0x28, 0xbf, 0x21, 0x46, 0x09, 0xeb, 0x41, 0x01, 0xa1, 0xf8, 0xa4, 0x00, + 0x19, 0xe0, 0x0f, 0x29, 0x28, 0xbf, 0x21, 0x46, 0x09, 0xeb, 0x41, 0x01, + 0xa1, 0xf8, 0xc4, 0x00, 0x11, 0xe0, 0x27, 0x29, 0x4f, 0xf0, 0x27, 0x02, + 0x28, 0xbf, 0x11, 0x46, 0x09, 0xeb, 0x41, 0x01, 0x88, 0x80, 0x08, 0xe0, + 0x27, 0x29, 0x4f, 0xf0, 0x27, 0x02, 0x28, 0xbf, 0x11, 0x46, 0x09, 0xeb, + 0x41, 0x01, 0xa1, 0xf8, 0x54, 0x00, 0x0a, 0xf1, 0x01, 0x0a, 0x70, 0x78, + 0x4f, 0xfa, 0x8a, 0xf8, 0x80, 0x45, 0xff, 0xf6, 0x88, 0xaf, 0xdf, 0xf8, + 0xb4, 0x80, 0x98, 0xf8, 0xd7, 0x0d, 0x01, 0x28, 0x27, 0xd1, 0x41, 0xf2, + 0x2c, 0x10, 0xdf, 0xf8, 0xa0, 0xa0, 0x09, 0xf1, 0xa4, 0x05, 0x00, 0x24, + 0x08, 0xeb, 0x00, 0x06, 0x85, 0x48, 0x00, 0xf1, 0xc0, 0x07, 0x36, 0xf9, + 0x20, 0x1c, 0xb5, 0xf9, 0x00, 0x00, 0xda, 0xf8, 0x00, 0xb0, 0xd8, 0x47, + 0xd9, 0xf8, 0x00, 0x10, 0xb1, 0xf9, 0x02, 0x10, 0xd8, 0x47, 0x27, 0xf8, + 0x20, 0x0c, 0xda, 0xf8, 0x00, 0x20, 0xb6, 0xf9, 0x00, 0x10, 0xb5, 0xf9, + 0x20, 0x00, 0x90, 0x47, 0x01, 0x34, 0x38, 0x80, 0x02, 0x36, 0x02, 0x37, + 0x02, 0x35, 0x10, 0x2c, 0xe3, 0xd1, 0x41, 0xf2, 0x9c, 0x10, 0x09, 0xf1, + 0x54, 0x07, 0xdf, 0xf8, 0x4c, 0x90, 0x00, 0x24, 0x08, 0xeb, 0x00, 0x05, + 0xdf, 0xf8, 0x48, 0x80, 0x08, 0xf1, 0x50, 0x06, 0x35, 0xf9, 0x50, 0x1c, + 0x37, 0xf9, 0x50, 0x0c, 0xd9, 0xf8, 0x00, 0x20, 0x90, 0x47, 0x26, 0xf8, + 0x50, 0x0c, 0xd9, 0xf8, 0x00, 0x20, 0xb5, 0xf9, 0x00, 0x10, 0xb7, 0xf9, + 0x00, 0x00, 0x90, 0x47, 0x01, 0x34, 0x30, 0x80, 0x02, 0x35, 0x02, 0x36, + 0x02, 0x37, 0x28, 0x2c, 0xe8, 0xd1, 0x01, 0x20, 0x88, 0xf8, 0x20, 0x01, + 0xbd, 0xe8, 0xf8, 0x8f, 0x6c, 0xfe, 0x08, 0x00, 0x70, 0xfe, 0x08, 0x00, + 0x00, 0x69, 0x08, 0x00, 0x90, 0xcf, 0x01, 0x00, 0x70, 0xb5, 0x17, 0x48, + 0x00, 0x78, 0xff, 0x28, 0x01, 0xd0, 0x0c, 0x28, 0x27, 0xd1, 0x5e, 0x48, + 0x00, 0x78, 0x86, 0x00, 0x4f, 0xf4, 0x91, 0x70, 0x50, 0xfa, 0x86, 0xf4, + 0x58, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0xd8, 0xb1, 0x05, 0x46, + 0x54, 0x48, 0xf6, 0xb2, 0x21, 0x46, 0x33, 0x46, 0x42, 0x68, 0x28, 0x46, + 0xc8, 0xf7, 0x76, 0xff, 0x4f, 0x4a, 0xa8, 0x19, 0x4f, 0xf4, 0x91, 0x71, + 0x4f, 0xf4, 0x91, 0x73, 0xc8, 0xf7, 0x6e, 0xff, 0x06, 0x48, 0x29, 0x46, + 0x22, 0x46, 0x03, 0x68, 0x0c, 0x20, 0x98, 0x47, 0x28, 0x46, 0xbd, 0xe8, + 0x70, 0x40, 0xce, 0xf7, 0xd1, 0xbd, 0x70, 0xbd, 0x64, 0x8d, 0x08, 0x00, + 0xe4, 0x9b, 0x08, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, 0x9d, 0x4f, 0xdf, 0xf8, + 0x08, 0xb1, 0x00, 0x24, 0x97, 0xf8, 0xd8, 0x02, 0x8b, 0xf8, 0x20, 0x41, + 0xc0, 0x07, 0x77, 0xd0, 0x41, 0xf2, 0xca, 0x00, 0x3e, 0x4e, 0x3d, 0x4d, + 0x38, 0x5c, 0x31, 0x68, 0xc5, 0xe9, 0x00, 0x44, 0x80, 0x00, 0x88, 0x47, + 0xdf, 0xf8, 0xec, 0xa0, 0x3b, 0x4c, 0x31, 0x68, 0xca, 0xf8, 0x00, 0x00, + 0x60, 0x78, 0x80, 0x00, 0x88, 0x47, 0xdf, 0xf8, 0xe4, 0x90, 0x31, 0x68, + 0xc9, 0xf8, 0x00, 0x00, 0x20, 0x78, 0x80, 0x00, 0x88, 0x47, 0x31, 0x68, + 0x68, 0x60, 0x04, 0x20, 0x88, 0x47, 0xdf, 0xf8, 0xd0, 0x80, 0x01, 0x46, + 0xc8, 0xf8, 0x00, 0x00, 0x68, 0x68, 0xd8, 0xb3, 0xda, 0xf8, 0x00, 0x20, + 0xc2, 0xb3, 0xd9, 0xf8, 0x00, 0x20, 0xaa, 0xb3, 0xa1, 0xb3, 0x21, 0x78, + 0x89, 0x00, 0xcb, 0xf7, 0x69, 0xfd, 0x41, 0xf2, 0xca, 0x06, 0xb8, 0x5d, + 0x81, 0x00, 0xda, 0xf8, 0x00, 0x00, 0xcb, 0xf7, 0x61, 0xfd, 0xff, 0xf7, + 0xff, 0xfd, 0x27, 0x48, 0x00, 0x68, 0x80, 0x47, 0x26, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x26, 0x48, 0x00, 0x68, 0x80, 0x47, 0x04, 0x46, 0xb8, 0xb9, + 0x24, 0x4b, 0xba, 0x5d, 0x69, 0x68, 0xda, 0xf8, 0x00, 0x00, 0x1b, 0x68, + 0x98, 0x47, 0x04, 0x46, 0x01, 0x28, 0x03, 0xd1, 0x16, 0x48, 0x1b, 0x49, + 0xff, 0xf7, 0x84, 0xfe, 0x1e, 0x48, 0x14, 0x49, 0x9b, 0xf8, 0x20, 0x61, + 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0xb6, 0xfa, 0x86, 0xf0, 0x44, 0x09, + 0x1a, 0x48, 0x00, 0x68, 0x80, 0x47, 0x00, 0xe0, 0x01, 0x24, 0xff, 0xf7, + 0x5b, 0xff, 0xda, 0xf8, 0x00, 0x00, 0x08, 0xb1, 0xce, 0xf7, 0x56, 0xfd, + 0xd9, 0xf8, 0x00, 0x00, 0x08, 0xb1, 0xce, 0xf7, 0x51, 0xfd, 0x68, 0x68, + 0x08, 0xb1, 0xce, 0xf7, 0x4d, 0xfd, 0xd8, 0xf8, 0x00, 0x00, 0x08, 0xb1, + 0xce, 0xf7, 0x48, 0xfd, 0x20, 0x46, 0xbd, 0xe8, 0xf8, 0x8f, 0x00, 0xbf, + 0x90, 0xcf, 0x01, 0x00, 0x1c, 0xe5, 0x01, 0x00, 0xd4, 0x9b, 0x08, 0x00, + 0x24, 0xe5, 0x01, 0x00, 0x9c, 0x2e, 0x06, 0x00, 0x98, 0x1f, 0x06, 0x00, + 0x9c, 0x1f, 0x06, 0x00, 0xe8, 0xfd, 0x08, 0x00, 0xe4, 0xfd, 0x08, 0x00, + 0x84, 0x9a, 0x08, 0x00, 0xf0, 0xfd, 0x08, 0x00, 0xdc, 0xfd, 0x08, 0x00, + 0xec, 0xfd, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x41, 0x01, 0xf0, 0xca, 0xff, + 0x4b, 0x4d, 0x04, 0x46, 0x95, 0xf8, 0xdc, 0x02, 0x80, 0x07, 0x21, 0xd5, + 0x12, 0x49, 0xd5, 0xf8, 0xc4, 0x0d, 0xdf, 0xf8, 0x4c, 0x80, 0x11, 0x4f, + 0x01, 0xf1, 0x48, 0x06, 0xd8, 0xf8, 0x00, 0x20, 0x31, 0x18, 0x30, 0x5c, + 0x49, 0x78, 0x40, 0xea, 0x01, 0x20, 0x09, 0x21, 0x38, 0x80, 0x00, 0xb2, + 0x90, 0x47, 0x38, 0x80, 0xd5, 0xf8, 0xc8, 0x0d, 0xd8, 0xf8, 0x00, 0x20, + 0x31, 0x18, 0x30, 0x5c, 0x49, 0x78, 0x40, 0xea, 0x01, 0x20, 0x09, 0x21, + 0x78, 0x80, 0x00, 0xb2, 0x90, 0x47, 0x78, 0x80, 0x20, 0x46, 0xbd, 0xe8, + 0xf0, 0x81, 0x00, 0xbf, 0x50, 0xec, 0x01, 0x00, 0xf0, 0xd1, 0x01, 0x00, + 0x10, 0xfe, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, 0x89, 0xb0, 0x31, 0x48, + 0xdf, 0xf8, 0xc8, 0xb0, 0x32, 0x4f, 0x33, 0x4e, 0xdf, 0xf8, 0xcc, 0x80, + 0x00, 0x21, 0x08, 0xac, 0x00, 0xf5, 0x04, 0x60, 0x04, 0x90, 0x2c, 0x48, + 0x03, 0x90, 0x00, 0x20, 0x02, 0x91, 0xcd, 0xe9, 0x00, 0x7b, 0xdd, 0xe9, + 0x03, 0xa9, 0x00, 0x25, 0x07, 0x90, 0xcd, 0xe9, 0x05, 0xb7, 0x5a, 0xf8, + 0x04, 0x0b, 0x59, 0xf8, 0x04, 0x1b, 0x33, 0x68, 0x22, 0x46, 0xcb, 0xf8, + 0x00, 0x00, 0x98, 0xf9, 0xbe, 0x02, 0x39, 0x60, 0xc1, 0xf3, 0x44, 0x31, + 0x80, 0x00, 0x98, 0x47, 0x38, 0x68, 0x08, 0x99, 0x33, 0x68, 0x22, 0x46, + 0x20, 0xf4, 0x78, 0x30, 0x40, 0xea, 0x41, 0x30, 0xdb, 0xf8, 0x00, 0x10, + 0x01, 0xc7, 0x98, 0xf9, 0xbe, 0x02, 0xc1, 0xf3, 0x44, 0x31, 0x80, 0x00, + 0x98, 0x47, 0xdb, 0xf8, 0x00, 0x00, 0x08, 0x99, 0x01, 0x35, 0x10, 0x2d, + 0x20, 0xf4, 0x78, 0x30, 0x40, 0xea, 0x41, 0x30, 0x4b, 0xf8, 0x04, 0x0b, + 0xd3, 0xd1, 0x07, 0x98, 0x06, 0x9f, 0xdd, 0xf8, 0x14, 0xb0, 0x01, 0x30, + 0x40, 0x37, 0x0b, 0xf1, 0x40, 0x0b, 0x0a, 0x28, 0xc3, 0xd1, 0x0b, 0x48, + 0x02, 0x99, 0x00, 0x9f, 0xdd, 0xf8, 0x04, 0xb0, 0x40, 0x30, 0x01, 0x31, + 0x07, 0xf5, 0x20, 0x77, 0x0b, 0xf5, 0x20, 0x7b, 0x03, 0x90, 0x04, 0x48, + 0x02, 0x29, 0x00, 0xf5, 0x08, 0x60, 0x04, 0x90, 0xad, 0xd1, 0x09, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0x69, 0x08, 0x00, 0x20, 0x2f, 0x06, 0x00, + 0xb4, 0x10, 0x06, 0x00, 0x58, 0xd7, 0x01, 0x00, 0xac, 0xfb, 0x08, 0x00, + 0x98, 0xca, 0x01, 0x00, 0x04, 0x48, 0x00, 0x68, 0x00, 0xf0, 0x0f, 0x00, + 0x41, 0x1e, 0x00, 0x20, 0x02, 0x29, 0x38, 0xbf, 0x01, 0x20, 0x70, 0x47, + 0x20, 0x00, 0x23, 0x40, 0x2d, 0xe9, 0xf8, 0x4f, 0xdf, 0xf8, 0xc4, 0x74, + 0xdf, 0xf8, 0xc4, 0x14, 0xa2, 0x4c, 0x00, 0x28, 0x07, 0xf5, 0x31, 0x78, + 0x01, 0xf1, 0xd5, 0x09, 0x69, 0xd0, 0x4f, 0xf0, 0x01, 0x0a, 0xff, 0xf7, + 0xe3, 0xff, 0xdf, 0xf8, 0xb8, 0x14, 0xdf, 0xf8, 0xb8, 0x54, 0x00, 0x28, + 0xdf, 0xf8, 0xb8, 0x64, 0x4f, 0xf0, 0x10, 0x02, 0x08, 0xbf, 0x0d, 0x46, + 0xdf, 0xf8, 0xa8, 0x14, 0x33, 0x68, 0x11, 0xf8, 0x0d, 0x0f, 0x4c, 0x78, + 0x94, 0x49, 0x05, 0xeb, 0x80, 0x10, 0x8b, 0x46, 0xa4, 0x31, 0x98, 0x47, + 0x05, 0xeb, 0x84, 0x10, 0x33, 0x68, 0x0b, 0xf1, 0xe4, 0x01, 0x10, 0x22, + 0x00, 0xf5, 0x20, 0x70, 0x98, 0x47, 0x8e, 0x4c, 0x33, 0x68, 0x07, 0xf6, + 0xc4, 0x40, 0x05, 0x22, 0x04, 0xf1, 0x24, 0x01, 0x98, 0x47, 0x8b, 0x4d, + 0x33, 0x68, 0x07, 0xf6, 0x14, 0x50, 0x05, 0x22, 0x05, 0xf1, 0x24, 0x01, + 0x98, 0x47, 0x33, 0x68, 0x07, 0xf6, 0xd8, 0x40, 0x04, 0xf1, 0x3c, 0x01, + 0x05, 0x22, 0x98, 0x47, 0x33, 0x68, 0x07, 0xf6, 0x28, 0x50, 0x05, 0xf1, + 0x3c, 0x01, 0x05, 0x22, 0x98, 0x47, 0x33, 0x68, 0x07, 0xf6, 0xec, 0x40, + 0x04, 0xf1, 0x54, 0x01, 0x05, 0x22, 0x98, 0x47, 0x33, 0x68, 0x07, 0xf6, + 0x3c, 0x50, 0x05, 0xf1, 0x54, 0x01, 0x05, 0x22, 0x98, 0x47, 0x33, 0x68, + 0x07, 0xf5, 0x50, 0x60, 0x04, 0xf1, 0x6c, 0x01, 0x05, 0x22, 0x98, 0x47, + 0x33, 0x68, 0x07, 0xf5, 0x55, 0x60, 0x05, 0xf1, 0x6c, 0x01, 0x05, 0x22, + 0x98, 0x47, 0xd7, 0xf8, 0x64, 0x0d, 0xba, 0xf1, 0x00, 0x0f, 0x20, 0x60, + 0xd7, 0xf8, 0x68, 0x0d, 0x28, 0x60, 0x0c, 0xd0, 0x6b, 0x4c, 0x01, 0x26, + 0x10, 0xe0, 0xd8, 0xf8, 0x00, 0x00, 0x00, 0x28, 0x00, 0xf0, 0xe8, 0x81, + 0xc1, 0x07, 0x05, 0xd0, 0x4f, 0xf0, 0x00, 0x0a, 0x8d, 0xe7, 0xd8, 0xf8, + 0x00, 0x00, 0x64, 0x4c, 0x81, 0x07, 0x40, 0xf1, 0xcd, 0x80, 0x00, 0x26, + 0xd7, 0xf8, 0xc8, 0x08, 0xdf, 0xf8, 0xd0, 0x53, 0x04, 0xf1, 0x20, 0x01, + 0x03, 0x22, 0xe0, 0x61, 0xd7, 0xf8, 0xc0, 0x08, 0x20, 0x60, 0xd7, 0xf8, + 0xc4, 0x08, 0xa0, 0x61, 0xd7, 0xf8, 0xd8, 0x08, 0xc4, 0xf8, 0x9c, 0x00, + 0x07, 0xf6, 0xcc, 0x00, 0x2b, 0x68, 0x98, 0x47, 0x00, 0x2e, 0x00, 0xf0, + 0xb1, 0x80, 0xea, 0x4e, 0x2b, 0x68, 0x07, 0xf6, 0x0c, 0x10, 0x20, 0x22, + 0x06, 0xf1, 0x18, 0x01, 0x98, 0x47, 0xe1, 0x49, 0x2b, 0x68, 0x07, 0xf6, + 0x34, 0x40, 0x20, 0x22, 0x8b, 0x46, 0x01, 0xf5, 0x84, 0x61, 0x98, 0x47, + 0x2b, 0x68, 0x07, 0xf6, 0x8c, 0x10, 0x04, 0xf5, 0x00, 0x61, 0x02, 0x22, + 0x98, 0x47, 0x2b, 0x68, 0x07, 0xf6, 0x94, 0x10, 0x31, 0x46, 0x02, 0x22, + 0x98, 0x47, 0x2b, 0x68, 0x07, 0xf6, 0xb4, 0x40, 0x0b, 0xf5, 0x80, 0x61, + 0x02, 0x22, 0x98, 0x47, 0x2b, 0x68, 0x07, 0xf6, 0xbc, 0x40, 0x0b, 0xf5, + 0x81, 0x61, 0x02, 0x22, 0x98, 0x47, 0x2b, 0x68, 0x07, 0xf6, 0x9c, 0x10, + 0x06, 0xf5, 0x0d, 0x71, 0x04, 0x22, 0x98, 0x47, 0xd1, 0x4c, 0x2b, 0x68, + 0x07, 0xf5, 0x22, 0x60, 0x04, 0x22, 0x21, 0x46, 0x98, 0x47, 0x2b, 0x68, + 0x07, 0xf6, 0xac, 0x10, 0x06, 0xf5, 0x11, 0x71, 0x10, 0x22, 0x98, 0x47, + 0x2b, 0x68, 0x07, 0xf5, 0x23, 0x60, 0x04, 0xf1, 0x10, 0x01, 0x10, 0x22, + 0x98, 0x47, 0x2b, 0x68, 0x07, 0xf6, 0xec, 0x10, 0x06, 0xf5, 0x83, 0x61, + 0x04, 0x22, 0x98, 0x47, 0x2b, 0x68, 0x07, 0xf5, 0x27, 0x60, 0x04, 0xf5, + 0xf2, 0x71, 0x04, 0x22, 0x98, 0x47, 0x2b, 0x68, 0x07, 0xf6, 0xfc, 0x10, + 0x06, 0xf5, 0x85, 0x61, 0x04, 0x22, 0x98, 0x47, 0x2b, 0x68, 0x07, 0xf5, + 0x28, 0x60, 0x04, 0xf5, 0xfa, 0x71, 0x04, 0x22, 0x98, 0x47, 0x2b, 0x68, + 0x07, 0xf6, 0x0c, 0x20, 0x06, 0xf5, 0xfc, 0x71, 0x03, 0x22, 0x98, 0x47, + 0x2b, 0x68, 0x07, 0xf6, 0x18, 0x20, 0x06, 0xf5, 0x7e, 0x71, 0x02, 0x22, + 0x98, 0x47, 0x2b, 0x68, 0x07, 0xf5, 0x29, 0x60, 0x0b, 0xf5, 0xc0, 0x61, + 0x03, 0x22, 0x98, 0x47, 0x2b, 0x68, 0x07, 0xf6, 0x9c, 0x20, 0x04, 0xf5, + 0xe2, 0x71, 0x02, 0x22, 0x98, 0x47, 0x2b, 0x68, 0x07, 0xf6, 0xa4, 0x20, + 0x06, 0xf5, 0x21, 0x71, 0x10, 0x22, 0x98, 0x47, 0x2b, 0x68, 0x07, 0xf6, + 0x44, 0x30, 0x04, 0xf1, 0x50, 0x01, 0x10, 0x22, 0x98, 0x47, 0x2b, 0x68, + 0x07, 0xf6, 0xe4, 0x20, 0x06, 0xf5, 0x31, 0x71, 0x10, 0x22, 0x98, 0x47, + 0x2b, 0x68, 0x07, 0xf6, 0x84, 0x30, 0x04, 0xf1, 0x90, 0x01, 0x10, 0x22, + 0x98, 0x47, 0x2b, 0x68, 0x07, 0xf6, 0x24, 0x30, 0x06, 0xf5, 0x41, 0x71, + 0x08, 0x22, 0x98, 0x47, 0x2b, 0x68, 0x07, 0xf6, 0xc4, 0x30, 0x04, 0xf1, + 0xd0, 0x01, 0x08, 0x22, 0x98, 0x47, 0xea, 0xe0, 0x00, 0xc0, 0x05, 0x30, + 0x00, 0xdc, 0x05, 0x30, 0x00, 0xf4, 0x05, 0x30, 0xd8, 0xf8, 0x00, 0x00, + 0x90, 0x4e, 0x01, 0x07, 0x12, 0xd5, 0x8e, 0x4c, 0x07, 0xf6, 0x0c, 0x10, + 0x06, 0xf1, 0x18, 0x01, 0x20, 0x22, 0x23, 0x68, 0x98, 0x47, 0x86, 0x49, + 0x23, 0x68, 0x84, 0x4c, 0x07, 0xf6, 0x34, 0x40, 0x20, 0x22, 0x01, 0xf5, + 0x84, 0x61, 0x98, 0x47, 0xd8, 0xf8, 0x00, 0x00, 0xc1, 0x06, 0x1f, 0xd5, + 0x21, 0x46, 0x83, 0x4c, 0x07, 0xf6, 0x8c, 0x10, 0x02, 0x22, 0x01, 0xf5, + 0x00, 0x61, 0x23, 0x68, 0x98, 0x47, 0x23, 0x68, 0x07, 0xf6, 0x94, 0x10, + 0x31, 0x46, 0x02, 0x22, 0x98, 0x47, 0x78, 0x4d, 0x23, 0x68, 0x07, 0xf6, + 0xb4, 0x40, 0x02, 0x22, 0x05, 0xf5, 0x80, 0x61, 0x98, 0x47, 0x23, 0x68, + 0x07, 0xf6, 0xbc, 0x40, 0x05, 0xf5, 0x81, 0x61, 0x02, 0x22, 0x98, 0x47, + 0xd8, 0xf8, 0x00, 0x00, 0x75, 0x4d, 0x81, 0x06, 0x0f, 0xd5, 0x72, 0x4c, + 0x07, 0xf6, 0x9c, 0x10, 0x06, 0xf5, 0x0d, 0x71, 0x04, 0x22, 0x23, 0x68, + 0x98, 0x47, 0x23, 0x68, 0x07, 0xf5, 0x22, 0x60, 0x29, 0x46, 0x04, 0x22, + 0x98, 0x47, 0xd8, 0xf8, 0x00, 0x00, 0x41, 0x06, 0x10, 0xd5, 0x69, 0x4c, + 0x07, 0xf6, 0xac, 0x10, 0x06, 0xf5, 0x11, 0x71, 0x10, 0x22, 0x23, 0x68, + 0x98, 0x47, 0x23, 0x68, 0x07, 0xf5, 0x23, 0x60, 0x05, 0xf1, 0x10, 0x01, + 0x10, 0x22, 0x98, 0x47, 0xd8, 0xf8, 0x00, 0x00, 0x41, 0xb2, 0xb1, 0xf1, + 0xff, 0x3f, 0x10, 0xdc, 0x5e, 0x4c, 0x07, 0xf6, 0xec, 0x10, 0x06, 0xf5, + 0x83, 0x61, 0x04, 0x22, 0x23, 0x68, 0x98, 0x47, 0x23, 0x68, 0x07, 0xf5, + 0x27, 0x60, 0x05, 0xf5, 0xf2, 0x71, 0x04, 0x22, 0x98, 0x47, 0xd8, 0xf8, + 0x00, 0x00, 0xc1, 0x05, 0x10, 0xd5, 0x55, 0x4c, 0x07, 0xf6, 0xfc, 0x10, + 0x06, 0xf5, 0x85, 0x61, 0x04, 0x22, 0x23, 0x68, 0x98, 0x47, 0x23, 0x68, + 0x07, 0xf5, 0x28, 0x60, 0x05, 0xf5, 0xfa, 0x71, 0x04, 0x22, 0x98, 0x47, + 0xd8, 0xf8, 0x00, 0x00, 0x81, 0x05, 0x1f, 0xd5, 0x4b, 0x4c, 0x07, 0xf6, + 0x0c, 0x20, 0x06, 0xf5, 0xfc, 0x71, 0x03, 0x22, 0x23, 0x68, 0x98, 0x47, + 0x23, 0x68, 0x07, 0xf6, 0x18, 0x20, 0x06, 0xf5, 0x7e, 0x71, 0x02, 0x22, + 0x98, 0x47, 0x40, 0x49, 0x23, 0x68, 0x07, 0xf5, 0x29, 0x60, 0x03, 0x22, + 0x01, 0xf5, 0xc0, 0x61, 0x98, 0x47, 0x23, 0x68, 0x07, 0xf6, 0x9c, 0x20, + 0x05, 0xf5, 0xe2, 0x71, 0x02, 0x22, 0x98, 0x47, 0xd8, 0xf8, 0x00, 0x00, + 0x41, 0x05, 0x10, 0xd5, 0x3a, 0x4c, 0x07, 0xf6, 0xa4, 0x20, 0x06, 0xf5, + 0x21, 0x71, 0x10, 0x22, 0x23, 0x68, 0x98, 0x47, 0x23, 0x68, 0x07, 0xf6, + 0x44, 0x30, 0x05, 0xf1, 0x50, 0x01, 0x10, 0x22, 0x98, 0x47, 0xd8, 0xf8, + 0x00, 0x00, 0x01, 0x05, 0x10, 0xd5, 0x31, 0x4c, 0x07, 0xf6, 0xe4, 0x20, + 0x06, 0xf5, 0x31, 0x71, 0x10, 0x22, 0x23, 0x68, 0x98, 0x47, 0x23, 0x68, + 0x07, 0xf6, 0x84, 0x30, 0x05, 0xf1, 0x90, 0x01, 0x10, 0x22, 0x98, 0x47, + 0xd8, 0xf8, 0x00, 0x00, 0xc0, 0x04, 0x0e, 0xd5, 0x27, 0x4c, 0x07, 0xf6, + 0x24, 0x30, 0x06, 0xf5, 0x41, 0x71, 0x08, 0x22, 0x23, 0x68, 0x98, 0x47, + 0x23, 0x68, 0x07, 0xf6, 0xc4, 0x30, 0x05, 0xf1, 0xd0, 0x01, 0x08, 0x22, + 0x98, 0x47, 0x99, 0xf8, 0x00, 0x00, 0x00, 0x07, 0x2c, 0xd5, 0xd9, 0xf8, + 0x03, 0x10, 0x20, 0x48, 0x01, 0x60, 0xd9, 0xf8, 0x07, 0x10, 0x81, 0x60, + 0xd9, 0xf8, 0x0b, 0x10, 0xc1, 0x60, 0x81, 0x6a, 0xd9, 0xf8, 0x0f, 0x20, + 0x09, 0x09, 0x61, 0xf3, 0x1f, 0x12, 0x82, 0x62, 0x41, 0x6b, 0xd9, 0xf8, + 0x13, 0x20, 0x09, 0x09, 0x61, 0xf3, 0x1f, 0x12, 0x42, 0x63, 0xc1, 0x6a, + 0xd9, 0xf8, 0x17, 0x20, 0x61, 0xf3, 0x13, 0x02, 0xc2, 0x62, 0xd9, 0xf8, + 0x1b, 0x10, 0x01, 0x63, 0x81, 0x6b, 0xd9, 0xf8, 0x1f, 0x20, 0x61, 0xf3, + 0x13, 0x02, 0x82, 0x63, 0xd9, 0xf8, 0x23, 0x10, 0xc1, 0x63, 0xd9, 0xf8, + 0x27, 0x10, 0x01, 0x66, 0xbd, 0xe8, 0xf8, 0x8f, 0x00, 0x69, 0x08, 0x00, + 0x8c, 0x7e, 0x08, 0x00, 0x00, 0xc0, 0x05, 0x30, 0x00, 0xdc, 0x05, 0x30, + 0x58, 0xdc, 0x01, 0x00, 0xb4, 0x15, 0x06, 0x00, 0xf0, 0xd1, 0x01, 0x00, + 0x88, 0xfe, 0x08, 0x00, 0x08, 0xc8, 0x05, 0x30, 0x3c, 0xe2, 0x05, 0x30, + 0x00, 0x43, 0x05, 0x30, 0x2d, 0xe9, 0xfe, 0x4f, 0x4a, 0x48, 0x01, 0x68, + 0x30, 0x20, 0x88, 0x47, 0x00, 0x28, 0x77, 0xd0, 0xdf, 0xf8, 0x20, 0x81, + 0x04, 0x46, 0xdf, 0xf8, 0x20, 0x91, 0x98, 0xf8, 0x00, 0x00, 0x09, 0xeb, + 0x80, 0x00, 0x81, 0x78, 0x00, 0x20, 0xcf, 0xf7, 0xdb, 0xfc, 0x98, 0xf8, + 0x00, 0x00, 0x09, 0xeb, 0x80, 0x03, 0xd9, 0x78, 0x51, 0xb1, 0x41, 0x48, + 0x00, 0x21, 0x00, 0x22, 0x05, 0x68, 0x04, 0x20, 0x00, 0x90, 0x4f, 0xf4, + 0xe6, 0x60, 0xa8, 0x47, 0x98, 0xf8, 0x00, 0x00, 0x09, 0xeb, 0x80, 0x00, + 0x81, 0x78, 0xff, 0x29, 0x10, 0xd0, 0x01, 0x20, 0xcf, 0xf7, 0xc2, 0xfc, + 0x98, 0xf8, 0x00, 0x00, 0x00, 0x21, 0x09, 0xeb, 0x80, 0x00, 0x80, 0x78, + 0xcf, 0xf7, 0x90, 0xfc, 0x98, 0xf8, 0x00, 0x00, 0xff, 0x21, 0x09, 0xeb, + 0x80, 0x00, 0x81, 0x70, 0xff, 0xf7, 0x3a, 0xfd, 0x30, 0x49, 0xdf, 0xf8, + 0xc4, 0xb0, 0x4f, 0xf0, 0x00, 0x0a, 0x31, 0x4f, 0x00, 0x28, 0x20, 0x46, + 0x4f, 0xf0, 0x10, 0x03, 0x11, 0xf8, 0x0d, 0x2f, 0xdb, 0xf8, 0x00, 0x60, + 0x4d, 0x78, 0x2b, 0x49, 0xcd, 0xe9, 0x00, 0xaa, 0x08, 0xbf, 0x0f, 0x46, + 0x07, 0xeb, 0x82, 0x11, 0x29, 0x4a, 0xb0, 0x47, 0xdb, 0xf8, 0x00, 0x60, + 0x07, 0xeb, 0x85, 0x10, 0x27, 0x4a, 0x10, 0x23, 0xcd, 0xe9, 0x00, 0xaa, + 0x00, 0xf5, 0x20, 0x71, 0x04, 0xf1, 0x18, 0x00, 0xb0, 0x47, 0x24, 0x48, + 0x02, 0x21, 0x00, 0x22, 0x03, 0x68, 0x20, 0x46, 0x98, 0x47, 0x05, 0x46, + 0xff, 0x28, 0x1b, 0xd0, 0x20, 0x48, 0x4f, 0xf0, 0x01, 0x11, 0x00, 0x22, + 0x03, 0x68, 0x1f, 0x48, 0x06, 0x68, 0x28, 0x46, 0xb0, 0x47, 0x98, 0xf8, + 0x00, 0x00, 0x09, 0xeb, 0x80, 0x00, 0x80, 0xf8, 0x03, 0xa0, 0x85, 0x70, + 0x20, 0x46, 0xce, 0xf7, 0x7b, 0xf9, 0x0f, 0xe0, 0x00, 0x20, 0x41, 0xf6, + 0x1d, 0x51, 0x03, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, 0xce, 0xf7, 0x54, 0xb9, + 0x20, 0x46, 0xce, 0xf7, 0x6f, 0xf9, 0x00, 0x20, 0x41, 0xf6, 0x5f, 0x51, + 0xce, 0xf7, 0x4c, 0xf9, 0x03, 0x20, 0x29, 0x46, 0x03, 0xb0, 0xbd, 0xe8, + 0xf0, 0x4f, 0xcf, 0xf7, 0x59, 0xbc, 0x00, 0xbf, 0x4c, 0x9c, 0x08, 0x00, + 0x74, 0x87, 0x08, 0x00, 0x54, 0xd4, 0x05, 0x00, 0xa0, 0xa0, 0x08, 0x00, + 0xf0, 0xd1, 0x01, 0x00, 0x14, 0xf4, 0x08, 0x00, 0x58, 0xdc, 0x01, 0x00, + 0xb4, 0x15, 0x06, 0x00, 0xa4, 0xc0, 0x05, 0x30, 0xe4, 0xc0, 0x05, 0x30, + 0x10, 0xf4, 0x08, 0x00, 0x18, 0xf4, 0x08, 0x00, 0x0c, 0xf4, 0x08, 0x00, + 0x7d, 0x4a, 0x92, 0xf8, 0x64, 0x21, 0x52, 0x06, 0x23, 0xd5, 0xea, 0x4a, + 0x01, 0x29, 0x12, 0x78, 0x05, 0xd1, 0x11, 0x49, 0x5c, 0x23, 0x12, 0xfb, + 0x03, 0x11, 0x52, 0x31, 0x03, 0xe0, 0x0d, 0x49, 0x01, 0xeb, 0x42, 0x11, + 0x1d, 0x31, 0x09, 0x78, 0x31, 0xb1, 0x00, 0x28, 0x18, 0xbf, 0x01, 0x20, + 0x41, 0x01, 0x4f, 0xf0, 0x20, 0x10, 0x05, 0xe0, 0x00, 0x28, 0x18, 0xbf, + 0x01, 0x20, 0x01, 0x01, 0x4f, 0xf0, 0x10, 0x10, 0x05, 0x4a, 0x01, 0x40, + 0x13, 0x68, 0x23, 0xea, 0x00, 0x00, 0x08, 0x43, 0x10, 0x60, 0x70, 0x47, + 0xe0, 0x58, 0x01, 0x00, 0x44, 0x4f, 0x01, 0x00, 0x4c, 0xc0, 0x00, 0x40, + 0x64, 0x48, 0x90, 0xf8, 0x3e, 0x16, 0x3c, 0x48, 0x01, 0x29, 0x06, 0xd1, + 0x9a, 0x49, 0x49, 0x79, 0x01, 0x29, 0x02, 0xd1, 0x76, 0x49, 0xc9, 0x79, + 0xc9, 0xb1, 0x5f, 0x49, 0x08, 0x22, 0x91, 0xf9, 0x64, 0x11, 0x02, 0xea, + 0x91, 0x02, 0x00, 0x29, 0x4f, 0xf0, 0x01, 0x01, 0x48, 0xbf, 0x02, 0x21, + 0x11, 0x44, 0x02, 0x6d, 0x22, 0xf0, 0x0b, 0x02, 0x0a, 0x44, 0x02, 0x65, + 0x02, 0x68, 0x22, 0xf0, 0x0b, 0x02, 0x11, 0x44, 0x01, 0x60, 0x01, 0x20, + 0x01, 0x21, 0xff, 0xf7, 0xa9, 0xbf, 0x52, 0x49, 0x91, 0xf8, 0x64, 0x11, + 0xc1, 0xf3, 0xc1, 0x01, 0x02, 0x6d, 0x22, 0xf0, 0x0b, 0x02, 0x0a, 0x44, + 0x02, 0x65, 0x02, 0x68, 0x22, 0xf0, 0x0b, 0x02, 0x11, 0x44, 0x01, 0x60, + 0x70, 0x47, 0x00, 0xbf, 0x49, 0x48, 0x90, 0xf8, 0x64, 0x11, 0x88, 0x07, + 0x05, 0xd4, 0x08, 0x20, 0x00, 0xea, 0x91, 0x02, 0xc1, 0xf3, 0x80, 0x10, + 0x01, 0xe0, 0x00, 0x22, 0x00, 0x20, 0xc1, 0xf3, 0xc1, 0x01, 0x11, 0x43, + 0x19, 0x4a, 0x13, 0x6d, 0x23, 0xf0, 0x0b, 0x03, 0x0b, 0x43, 0x13, 0x65, + 0x13, 0x68, 0x23, 0xf0, 0x0b, 0x03, 0x19, 0x43, 0x11, 0x60, 0x01, 0x21, + 0xff, 0xf7, 0x7a, 0xbf, 0x3a, 0x48, 0x90, 0xf8, 0x64, 0x01, 0x40, 0x07, + 0x48, 0xbf, 0xff, 0xf7, 0xa3, 0xbf, 0x70, 0x47, 0x36, 0x48, 0x90, 0xf8, + 0x64, 0x11, 0x48, 0x07, 0x05, 0xd4, 0x08, 0x20, 0x00, 0xea, 0x91, 0x02, + 0xc1, 0xf3, 0x80, 0x10, 0x01, 0xe0, 0x00, 0x22, 0x00, 0x20, 0xc1, 0xf3, + 0xc1, 0x01, 0x11, 0x43, 0x06, 0x4a, 0x13, 0x6d, 0x23, 0xf0, 0x0b, 0x03, + 0x0b, 0x43, 0x13, 0x65, 0x13, 0x68, 0x23, 0xf0, 0x0b, 0x03, 0x19, 0x43, + 0x11, 0x60, 0x01, 0x21, 0xff, 0xf7, 0x54, 0xbf, 0x54, 0x10, 0x21, 0x40, + 0x25, 0x49, 0x91, 0xf8, 0x3e, 0x16, 0x01, 0x29, 0x06, 0xd1, 0x5c, 0x49, + 0x49, 0x79, 0x01, 0x29, 0x02, 0xd1, 0x38, 0x49, 0xc9, 0x79, 0x00, 0xe0, + 0x01, 0x21, 0x01, 0x28, 0x1d, 0xd1, 0xe1, 0xb1, 0x1e, 0x48, 0x90, 0xf8, + 0x64, 0x01, 0xc1, 0x07, 0x08, 0xbf, 0x70, 0x47, 0x08, 0x21, 0x01, 0xea, + 0x90, 0x01, 0x40, 0xb2, 0x00, 0x28, 0x4f, 0xf0, 0x01, 0x00, 0x48, 0xbf, + 0x02, 0x20, 0x08, 0x44, 0x17, 0x49, 0x0a, 0x68, 0x22, 0xf0, 0x0b, 0x02, + 0x02, 0x44, 0x0a, 0x60, 0x0a, 0x6d, 0x22, 0xf0, 0x0b, 0x02, 0x10, 0x44, + 0x08, 0x65, 0x01, 0x20, 0x1a, 0xe0, 0x10, 0x48, 0x90, 0xf8, 0x64, 0x11, + 0xc8, 0x07, 0x05, 0xd1, 0x08, 0x20, 0x00, 0xea, 0x91, 0x02, 0xc1, 0xf3, + 0x80, 0x10, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x22, 0xc1, 0xf3, 0xc1, 0x01, + 0x11, 0x43, 0x09, 0x4a, 0x13, 0x68, 0x23, 0xf0, 0x0b, 0x03, 0x0b, 0x43, + 0x13, 0x60, 0x13, 0x6d, 0x23, 0xf0, 0x0b, 0x03, 0x19, 0x43, 0x11, 0x65, + 0x00, 0x21, 0xff, 0xf7, 0x07, 0xbf, 0x00, 0xbf, 0x64, 0xd4, 0x05, 0x00, + 0xe8, 0x65, 0x08, 0x00, 0x3c, 0x20, 0x21, 0x40, 0x35, 0x48, 0x80, 0x79, + 0x70, 0x47, 0x00, 0xbf, 0x80, 0xb5, 0xc8, 0x4a, 0x92, 0xf8, 0x35, 0x22, + 0x52, 0x07, 0x5c, 0xbf, 0x0c, 0x20, 0x80, 0xbd, 0x01, 0x28, 0x08, 0xbf, + 0x01, 0x29, 0x13, 0xd0, 0x2d, 0x49, 0x8a, 0x79, 0x0a, 0xb1, 0x17, 0x20, + 0x80, 0xbd, 0x4a, 0x79, 0x82, 0x42, 0x09, 0xd0, 0x01, 0x20, 0x88, 0x71, + 0x06, 0x49, 0x05, 0x48, 0x4a, 0x78, 0x06, 0x49, 0x00, 0x68, 0x09, 0x79, + 0xf6, 0xf7, 0x7a, 0xfe, 0x00, 0x20, 0x80, 0xbd, 0x12, 0x20, 0x80, 0xbd, + 0x88, 0xe9, 0x08, 0x00, 0xad, 0x2f, 0x06, 0x00, 0x4c, 0xd7, 0x01, 0x00, + 0x2d, 0xe9, 0xf8, 0x43, 0x1d, 0x4d, 0x1e, 0x4e, 0xdf, 0xf8, 0x78, 0x90, + 0x1e, 0x4f, 0x4f, 0xf0, 0x00, 0x08, 0x28, 0x68, 0x78, 0xb3, 0x41, 0x05, + 0x1b, 0xd5, 0x70, 0x79, 0xb0, 0xfa, 0x80, 0xf0, 0x44, 0x09, 0x20, 0x46, + 0xfa, 0xf7, 0xbc, 0xff, 0x20, 0x46, 0xfb, 0xf7, 0x19, 0xf8, 0x20, 0x46, + 0xfb, 0xf7, 0x4e, 0xf8, 0x28, 0x68, 0x86, 0xf8, 0x06, 0x80, 0x74, 0x71, + 0x20, 0xf4, 0x80, 0x60, 0x28, 0x60, 0xd9, 0xf8, 0x00, 0x00, 0x80, 0x47, + 0x38, 0x68, 0x80, 0x47, 0xc8, 0xf7, 0xa6, 0xfe, 0x28, 0x68, 0xb0, 0xf1, + 0xff, 0x3f, 0xdd, 0xdc, 0x0c, 0x48, 0x00, 0x68, 0x80, 0x47, 0x02, 0xf0, + 0xaf, 0xf9, 0x20, 0xb1, 0x0a, 0x48, 0x00, 0x68, 0xbd, 0xe8, 0xf8, 0x43, + 0x00, 0x47, 0x28, 0x68, 0x20, 0xf0, 0x00, 0x40, 0x28, 0x60, 0xbd, 0xe8, + 0xf8, 0x83, 0x00, 0xbf, 0x54, 0xd7, 0x01, 0x00, 0x48, 0xdc, 0x05, 0x00, + 0x68, 0xfc, 0x08, 0x00, 0x84, 0xfe, 0x08, 0x00, 0x40, 0xfc, 0x08, 0x00, + 0x44, 0xfc, 0x08, 0x00, 0x7c, 0xb5, 0x31, 0x49, 0x31, 0x4a, 0x09, 0x78, + 0xc1, 0xeb, 0x41, 0x11, 0x02, 0xeb, 0xc1, 0x03, 0xdc, 0x68, 0x14, 0xb1, + 0x04, 0xf1, 0x44, 0x01, 0x0a, 0xe0, 0x52, 0xf8, 0x31, 0x20, 0x99, 0x68, + 0x1a, 0xb1, 0x21, 0xb9, 0x02, 0xf2, 0x35, 0x11, 0x02, 0xe0, 0x00, 0x29, + 0x4a, 0xd0, 0xb9, 0x31, 0x27, 0x4a, 0x00, 0x28, 0x27, 0x4c, 0x29, 0x4b, + 0x04, 0xbf, 0x49, 0xf2, 0xf8, 0x52, 0xc4, 0xf2, 0x23, 0x02, 0x09, 0x78, + 0x00, 0x28, 0x12, 0x68, 0xa1, 0x80, 0x22, 0x60, 0x22, 0x4a, 0x22, 0xf8, + 0x31, 0x10, 0x04, 0xbf, 0x42, 0xf2, 0x34, 0x03, 0xc4, 0xf2, 0x21, 0x03, + 0x1b, 0x68, 0x13, 0xf0, 0x01, 0x00, 0xa0, 0x71, 0x12, 0xd1, 0xc3, 0xf3, + 0x40, 0x03, 0x83, 0xf0, 0x01, 0x05, 0x23, 0x72, 0xe5, 0x71, 0x23, 0xb9, + 0x02, 0xeb, 0xc1, 0x05, 0xae, 0x88, 0x01, 0x36, 0xae, 0x80, 0x6b, 0xb1, + 0x02, 0xeb, 0xc1, 0x01, 0xca, 0x88, 0x01, 0x32, 0xca, 0x80, 0x07, 0xe0, + 0x02, 0xeb, 0xc1, 0x01, 0x01, 0x23, 0x4a, 0x88, 0xe3, 0x71, 0x23, 0x72, + 0x01, 0x32, 0x4a, 0x80, 0x61, 0x7a, 0x88, 0x42, 0x10, 0xd0, 0x67, 0x49, + 0xb1, 0xf8, 0x7c, 0x16, 0x09, 0x05, 0x0a, 0xd5, 0x9d, 0x48, 0x09, 0x4b, + 0x01, 0x21, 0x00, 0x22, 0x05, 0x68, 0x0c, 0x20, 0x00, 0x90, 0x40, 0xf2, + 0x32, 0x70, 0xa8, 0x47, 0xa0, 0x79, 0x60, 0x72, 0x7c, 0xbd, 0x00, 0xbf, + 0x74, 0x87, 0x08, 0x00, 0x0c, 0x6f, 0x01, 0x00, 0xfc, 0x95, 0x23, 0x40, + 0xc0, 0x20, 0x06, 0x00, 0x80, 0xfa, 0x05, 0x00, 0x88, 0x10, 0x21, 0x40, + 0xf8, 0xb5, 0x54, 0x48, 0x00, 0x78, 0x10, 0xb1, 0x53, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x53, 0x48, 0xc2, 0x7a, 0x05, 0x2a, 0x02, 0xd3, 0x5c, 0x49, + 0x00, 0x20, 0x06, 0xe0, 0x0a, 0x30, 0x83, 0x78, 0x05, 0x2b, 0x06, 0xd3, + 0x58, 0x49, 0x00, 0x20, 0x1a, 0x46, 0xbd, 0xe8, 0xf8, 0x40, 0xe6, 0xf7, + 0x4b, 0xb8, 0xdf, 0xf8, 0x2c, 0xc1, 0x4b, 0x4d, 0x4b, 0x4e, 0x00, 0x24, + 0x62, 0x44, 0x0c, 0xf5, 0xac, 0x63, 0x92, 0xf9, 0xac, 0x24, 0x12, 0x03, + 0x1f, 0x68, 0x01, 0x34, 0x08, 0x2c, 0x07, 0xf4, 0x70, 0x41, 0x11, 0x44, + 0x4f, 0xea, 0x11, 0x31, 0x61, 0xf3, 0x0f, 0x37, 0xaf, 0x51, 0x80, 0xcb, + 0x61, 0xf3, 0x0f, 0x37, 0x80, 0xc5, 0xef, 0xd1, 0x81, 0x78, 0x40, 0x4d, + 0x0c, 0xf2, 0x64, 0x73, 0x00, 0x24, 0x61, 0x44, 0x91, 0xf9, 0xac, 0x14, + 0x0a, 0x03, 0x02, 0xcb, 0x01, 0x34, 0x08, 0x2c, 0x01, 0xf4, 0x70, 0x46, + 0x16, 0x44, 0x4f, 0xea, 0x16, 0x36, 0x66, 0xf3, 0x0f, 0x31, 0x02, 0xc5, + 0xf3, 0xd1, 0x41, 0x78, 0xdc, 0xf8, 0xc8, 0x45, 0x0c, 0xf2, 0xb6, 0x43, + 0x43, 0xf6, 0x3f, 0x0e, 0x5a, 0x56, 0x04, 0xf0, 0x38, 0x05, 0x04, 0xf0, + 0x07, 0x07, 0x04, 0xf4, 0x60, 0x54, 0x05, 0xeb, 0xc2, 0x02, 0x0c, 0xf2, + 0xbb, 0x45, 0x6e, 0x56, 0x3e, 0x44, 0x2d, 0x4f, 0x32, 0x43, 0x0c, 0xf2, + 0xb1, 0x46, 0x71, 0x5c, 0x04, 0xeb, 0xc1, 0x21, 0x3c, 0x68, 0x11, 0x43, + 0x29, 0x4a, 0x01, 0xea, 0x0e, 0x01, 0x14, 0x40, 0x21, 0x44, 0x39, 0x60, + 0x81, 0x78, 0xdc, 0xf8, 0xcc, 0x47, 0x5b, 0x56, 0x04, 0xf0, 0x38, 0x07, + 0x6d, 0x56, 0x71, 0x5c, 0x07, 0xeb, 0xc3, 0x03, 0x04, 0xf0, 0x07, 0x07, + 0x04, 0xf4, 0x60, 0x54, 0x3d, 0x44, 0x04, 0xeb, 0xc1, 0x21, 0x2b, 0x43, + 0x1f, 0x4d, 0x19, 0x43, 0x1d, 0x4b, 0x01, 0xea, 0x0e, 0x01, 0x1c, 0x68, + 0x22, 0x40, 0x11, 0x44, 0x19, 0x60, 0x00, 0x21, 0x01, 0x70, 0x28, 0x78, + 0xff, 0x28, 0x01, 0xd0, 0x07, 0x28, 0x19, 0xd1, 0x18, 0x48, 0x01, 0x68, + 0x40, 0xf2, 0x5c, 0x50, 0x88, 0x47, 0x98, 0xb1, 0x0c, 0x4a, 0x40, 0xf2, + 0x5c, 0x51, 0x40, 0xf2, 0x5c, 0x53, 0x04, 0x46, 0xc8, 0xf7, 0x58, 0xf8, + 0x12, 0x48, 0x21, 0x46, 0x40, 0xf2, 0x5c, 0x52, 0x03, 0x68, 0x28, 0x78, + 0x98, 0x47, 0x20, 0x46, 0xbd, 0xe8, 0xf8, 0x40, 0xcd, 0xf7, 0xba, 0xbe, + 0xf8, 0xbd, 0x00, 0xbf, 0xa7, 0x58, 0x01, 0x00, 0x68, 0xfc, 0x08, 0x00, + 0xf0, 0xd1, 0x01, 0x00, 0x00, 0x69, 0x08, 0x00, 0x40, 0xd8, 0x05, 0x30, + 0x20, 0xfe, 0xff, 0xff, 0x40, 0xf0, 0x05, 0x30, 0x00, 0xd6, 0x05, 0x30, + 0xc0, 0xc7, 0xff, 0xff, 0x00, 0xee, 0x05, 0x30, 0x64, 0x8d, 0x08, 0x00, + 0xd4, 0x9b, 0x08, 0x00, 0xe4, 0x9b, 0x08, 0x00, 0xb4, 0xa2, 0x05, 0x00, + 0x2d, 0xe9, 0xfc, 0x47, 0x68, 0xb3, 0x27, 0x49, 0xc8, 0x6c, 0x8a, 0x46, + 0x40, 0xf0, 0x00, 0x40, 0xc8, 0x64, 0x25, 0x48, 0x00, 0xf5, 0x05, 0x75, + 0x35, 0xf8, 0xea, 0x0f, 0xc8, 0xb1, 0x24, 0x48, 0xdf, 0xf8, 0x88, 0x80, + 0x00, 0x26, 0x6f, 0xf0, 0x01, 0x09, 0x64, 0x24, 0x47, 0x1c, 0x50, 0x46, + 0xda, 0xf8, 0x50, 0x00, 0xb0, 0xf1, 0xff, 0x3f, 0x1e, 0xdd, 0xb8, 0xf8, + 0x00, 0x00, 0x00, 0xeb, 0x80, 0x00, 0x09, 0xeb, 0x40, 0x00, 0xb8, 0x47, + 0x28, 0x88, 0x01, 0x36, 0x60, 0x43, 0x86, 0x42, 0xed, 0xd3, 0xda, 0xf8, + 0x4c, 0x10, 0x00, 0x20, 0xb1, 0xf1, 0xff, 0x3f, 0x16, 0xdd, 0xbd, 0xe8, + 0xfc, 0x87, 0x10, 0x48, 0x01, 0x22, 0x01, 0x68, 0x01, 0xf0, 0x7f, 0x41, + 0x01, 0x60, 0xc1, 0x6c, 0x62, 0xf3, 0x9f, 0x71, 0xc1, 0x64, 0x06, 0xe0, + 0xda, 0xf8, 0x00, 0x00, 0x0d, 0x49, 0x61, 0xf3, 0x17, 0x00, 0xca, 0xf8, + 0x00, 0x00, 0x00, 0x20, 0xbd, 0xe8, 0xfc, 0x87, 0x0a, 0x49, 0x00, 0x90, + 0x40, 0xf2, 0x31, 0x70, 0x06, 0x22, 0x00, 0x23, 0x0c, 0x68, 0x00, 0x21, + 0xa0, 0x47, 0x01, 0x20, 0xbd, 0xe8, 0xfc, 0x87, 0xc0, 0x43, 0x05, 0x30, + 0x8c, 0x7e, 0x08, 0x00, 0x34, 0xec, 0x01, 0x00, 0x40, 0xec, 0x01, 0x00, + 0xff, 0xaa, 0xfa, 0x00, 0xa0, 0xa0, 0x08, 0x00, 0x70, 0xb5, 0x14, 0x46, + 0x0d, 0x46, 0x01, 0xf0, 0xe3, 0xf8, 0x41, 0x48, 0x90, 0xf8, 0x5f, 0x10, + 0x79, 0xb1, 0xb4, 0xf9, 0x00, 0x10, 0xb0, 0xf9, 0x58, 0x30, 0xb4, 0xf9, + 0x02, 0x20, 0x99, 0x42, 0xb8, 0xbf, 0x0b, 0x46, 0x23, 0x80, 0xb0, 0xf9, + 0x5a, 0x00, 0x82, 0x42, 0xb8, 0xbf, 0x10, 0x46, 0x60, 0x80, 0x38, 0x48, + 0x90, 0xf8, 0x34, 0x02, 0x01, 0x28, 0x1a, 0xd1, 0x36, 0x48, 0x90, 0xf8, + 0x54, 0x06, 0x7f, 0x28, 0x15, 0xd0, 0xb4, 0xf9, 0x04, 0x30, 0xb4, 0xf9, + 0x00, 0x10, 0xb4, 0xf9, 0x02, 0x20, 0x86, 0x00, 0xb3, 0xeb, 0x80, 0x0f, + 0xa8, 0xbf, 0x33, 0x46, 0xa3, 0x80, 0xb1, 0xeb, 0x80, 0x0f, 0xa8, 0xbf, + 0x31, 0x46, 0x21, 0x80, 0xb2, 0xeb, 0x80, 0x0f, 0xb8, 0xbf, 0x16, 0x46, + 0x66, 0x80, 0x2a, 0x48, 0x40, 0x79, 0x01, 0x28, 0x16, 0xd1, 0x2a, 0x49, + 0x28, 0x48, 0xb4, 0xf9, 0x00, 0x30, 0xb4, 0xf9, 0x02, 0x60, 0x89, 0x78, + 0x00, 0xeb, 0x45, 0x10, 0x30, 0xf9, 0x11, 0x20, 0x00, 0xeb, 0x41, 0x00, + 0x93, 0x42, 0xb8, 0xbf, 0x1a, 0x46, 0x22, 0x80, 0xb0, 0xf9, 0x80, 0x00, + 0x86, 0x42, 0xb8, 0xbf, 0x30, 0x46, 0x60, 0x80, 0x1f, 0x48, 0x03, 0x2d, + 0x05, 0xd1, 0xb0, 0xf8, 0x48, 0x10, 0x03, 0x25, 0x09, 0x07, 0x58, 0xbf, + 0x01, 0x25, 0x01, 0x21, 0x02, 0x88, 0xa9, 0x40, 0x11, 0x42, 0x09, 0xd0, + 0x00, 0xeb, 0x45, 0x02, 0xb4, 0xf9, 0x00, 0x30, 0xb2, 0xf9, 0x0a, 0x20, + 0x93, 0x42, 0xb8, 0xbf, 0x1a, 0x46, 0x22, 0x80, 0x42, 0x8a, 0x11, 0x42, + 0x09, 0xd0, 0x00, 0xeb, 0x45, 0x02, 0xb4, 0xf9, 0x02, 0x30, 0xb2, 0xf9, + 0x1c, 0x20, 0x93, 0x42, 0xb8, 0xbf, 0x1a, 0x46, 0x62, 0x80, 0xb0, 0xf8, + 0x48, 0x20, 0x11, 0x42, 0x09, 0xd0, 0x00, 0xeb, 0x45, 0x00, 0xb4, 0xf9, + 0x04, 0x10, 0xb0, 0xf9, 0x52, 0x00, 0x81, 0x42, 0xb8, 0xbf, 0x08, 0x46, + 0xa0, 0x80, 0x70, 0xbd, 0xd0, 0xe2, 0x05, 0x00, 0x38, 0x21, 0x01, 0x00, + 0x64, 0xd4, 0x05, 0x00, 0x48, 0xdc, 0x05, 0x00, 0xb2, 0xd0, 0x01, 0x00, + 0xad, 0x2f, 0x06, 0x00, 0xd8, 0xdb, 0x05, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, + 0x87, 0xb0, 0x72, 0x4e, 0xdf, 0xf8, 0xc8, 0xa1, 0x72, 0x4f, 0x0c, 0x22, + 0x0a, 0xf2, 0xdc, 0x55, 0x33, 0x68, 0x07, 0xf1, 0x60, 0x01, 0x28, 0x46, + 0x98, 0x47, 0x0a, 0xf2, 0x0c, 0x69, 0x07, 0xf1, 0x90, 0x04, 0x33, 0x68, + 0x0c, 0x22, 0x48, 0x46, 0x21, 0x46, 0x98, 0x47, 0x33, 0x68, 0x07, 0xf5, + 0x07, 0x71, 0x28, 0x46, 0x0c, 0x22, 0x98, 0x47, 0x07, 0xf5, 0x13, 0x78, + 0x33, 0x68, 0x48, 0x46, 0x0c, 0x22, 0x41, 0x46, 0x98, 0x47, 0x64, 0x4d, + 0x33, 0x68, 0x0a, 0xf5, 0xfc, 0x60, 0x0c, 0x22, 0x05, 0xf1, 0x38, 0x01, + 0x98, 0x47, 0x05, 0xf1, 0x68, 0x0b, 0x33, 0x68, 0x0a, 0xf5, 0x01, 0x60, + 0x0c, 0x22, 0x59, 0x46, 0x04, 0x90, 0x98, 0x47, 0xda, 0xf8, 0x34, 0x02, + 0x81, 0x07, 0x5b, 0x49, 0x37, 0xd5, 0xcd, 0xf8, 0x18, 0xb0, 0xdf, 0xf8, + 0x68, 0xb1, 0x01, 0xf1, 0x1c, 0x05, 0x4f, 0xf0, 0x00, 0x0a, 0x4e, 0x46, + 0x53, 0x4b, 0x55, 0x48, 0x56, 0xf8, 0x30, 0x2c, 0x15, 0xf8, 0x1a, 0x1c, + 0xdb, 0xf8, 0x00, 0x70, 0x00, 0x93, 0x4f, 0xf0, 0x40, 0x43, 0x00, 0x78, + 0x01, 0x93, 0x1e, 0x23, 0x02, 0x93, 0xa4, 0xf1, 0x30, 0x03, 0xb8, 0x47, + 0x4a, 0x4b, 0x4c, 0x48, 0x32, 0x68, 0x29, 0x78, 0xdb, 0xf8, 0x00, 0x70, + 0x04, 0x33, 0x80, 0x7e, 0x00, 0x93, 0x4f, 0xf0, 0x40, 0x43, 0x01, 0x93, + 0x1e, 0x23, 0x02, 0x93, 0x23, 0x46, 0xb8, 0x47, 0x0a, 0xf1, 0x01, 0x0a, + 0x04, 0x34, 0x01, 0x35, 0x04, 0x36, 0xba, 0xf1, 0x0c, 0x0f, 0xd5, 0xd1, + 0x3d, 0x48, 0xdd, 0xf8, 0x18, 0xb0, 0xd0, 0xf8, 0x34, 0x02, 0x41, 0x07, + 0x39, 0xd5, 0xdf, 0xf8, 0xf4, 0xa0, 0x3a, 0x48, 0x3c, 0x4e, 0x00, 0x25, + 0x0a, 0xf1, 0x28, 0x04, 0xdf, 0xf8, 0xe4, 0xa0, 0x00, 0xf5, 0xf2, 0x71, + 0x00, 0xf5, 0xf4, 0x70, 0x06, 0x91, 0x05, 0x90, 0x06, 0x9b, 0x59, 0xf8, + 0x30, 0x2c, 0x14, 0xf8, 0x1a, 0x1c, 0x9a, 0xf8, 0x01, 0x00, 0x37, 0x68, + 0x00, 0x93, 0x4f, 0xf0, 0x40, 0x43, 0x01, 0x93, 0x1e, 0x23, 0x02, 0x93, + 0xa8, 0xf1, 0x30, 0x03, 0xb8, 0x47, 0x05, 0x9b, 0xd9, 0xf8, 0x00, 0x20, + 0x21, 0x78, 0x9a, 0xf8, 0x1b, 0x00, 0x37, 0x68, 0x00, 0x93, 0x4f, 0xf0, + 0x40, 0x43, 0x01, 0x93, 0x1e, 0x23, 0x02, 0x93, 0x43, 0x46, 0xb8, 0x47, + 0x01, 0x35, 0x08, 0xf1, 0x04, 0x08, 0x01, 0x34, 0x09, 0xf1, 0x04, 0x09, + 0x0c, 0x2d, 0xd7, 0xd1, 0xdf, 0x48, 0xd0, 0xf8, 0x34, 0x02, 0x1f, 0x4b, + 0xdd, 0xf8, 0x10, 0xa0, 0xc0, 0x06, 0x30, 0xd5, 0x1d, 0x49, 0x1d, 0x4f, + 0xdf, 0xf8, 0x74, 0x80, 0x00, 0x25, 0x4f, 0xf0, 0x40, 0x49, 0x01, 0xf1, + 0x5c, 0x04, 0x19, 0x1d, 0x06, 0x91, 0xcd, 0xe9, 0x00, 0x39, 0x1e, 0x23, + 0x5a, 0xf8, 0x30, 0x2c, 0x14, 0xf8, 0x1a, 0x1c, 0x97, 0xf8, 0x35, 0x00, + 0xd8, 0xf8, 0x00, 0x60, 0x02, 0x93, 0xab, 0xf1, 0x30, 0x03, 0xb0, 0x47, + 0x06, 0x9b, 0xda, 0xf8, 0x00, 0x20, 0x21, 0x78, 0x97, 0xf8, 0x4f, 0x00, + 0xd8, 0xf8, 0x00, 0x60, 0xcd, 0xe9, 0x00, 0x39, 0x1e, 0x23, 0x02, 0x93, + 0x5b, 0x46, 0xb0, 0x47, 0x01, 0x35, 0x08, 0x4b, 0x0b, 0xf1, 0x04, 0x0b, + 0x01, 0x34, 0x0a, 0xf1, 0x04, 0x0a, 0x0c, 0x2d, 0xd9, 0xd1, 0x07, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0x88, 0xfe, 0x08, 0x00, 0x00, 0x69, 0x08, 0x00, + 0x44, 0xd6, 0x05, 0x30, 0x28, 0xf0, 0x05, 0x30, 0x58, 0xe2, 0x01, 0x00, + 0x8c, 0xfe, 0x08, 0x00, 0x10, 0xb5, 0x14, 0x46, 0x00, 0xf0, 0x60, 0xff, + 0x03, 0x49, 0x04, 0xeb, 0x44, 0x00, 0x01, 0x22, 0x01, 0xf8, 0x10, 0x20, + 0x10, 0xbd, 0x00, 0xbf, 0x90, 0xe4, 0x01, 0x00, 0xbc, 0xb5, 0x04, 0x46, + 0x10, 0x48, 0x0d, 0x46, 0x01, 0xa9, 0x02, 0x68, 0x28, 0x46, 0x90, 0x47, + 0x1e, 0x2d, 0x04, 0xd3, 0x00, 0x20, 0x42, 0xf2, 0x12, 0x31, 0xc7, 0xf7, + 0x17, 0xfe, 0x0b, 0x49, 0x05, 0xeb, 0x05, 0x10, 0x01, 0x9a, 0x01, 0xeb, + 0x80, 0x00, 0x00, 0x21, 0x25, 0x88, 0x63, 0x88, 0x01, 0x31, 0x0c, 0x34, + 0x11, 0x29, 0x6f, 0xf3, 0x1f, 0x35, 0x63, 0xf3, 0x17, 0x35, 0x20, 0xc2, + 0x20, 0xc0, 0xf3, 0xd1, 0xbc, 0xbd, 0x00, 0xbf, 0xc4, 0xfc, 0x08, 0x00, + 0xc4, 0x22, 0x06, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, 0x91, 0xb0, 0x9f, 0x48, + 0x90, 0xf8, 0x37, 0x12, 0x49, 0x06, 0x01, 0xd4, 0x00, 0x24, 0x32, 0xe1, + 0x9c, 0x4a, 0x00, 0xf5, 0x0d, 0x75, 0x9c, 0x4b, 0x01, 0x21, 0x10, 0x78, + 0x19, 0x54, 0x01, 0x30, 0x9a, 0x49, 0x10, 0x70, 0xc0, 0xb2, 0xff, 0x28, + 0x04, 0xbf, 0x00, 0x20, 0x10, 0x70, 0x05, 0xaa, 0x00, 0x20, 0x08, 0xc9, + 0x01, 0x30, 0x0c, 0x28, 0x1b, 0x68, 0x08, 0xc2, 0xf9, 0xd1, 0x94, 0x49, + 0x96, 0x4e, 0xdf, 0xf8, 0x48, 0x82, 0xdf, 0xf8, 0x58, 0x92, 0x08, 0x68, + 0x40, 0xf0, 0x00, 0x70, 0x08, 0x60, 0x90, 0x49, 0xb5, 0xf8, 0x94, 0x00, + 0x01, 0xea, 0x80, 0x50, 0xb5, 0xf8, 0x96, 0x10, 0x40, 0xea, 0x41, 0x30, + 0x01, 0x90, 0x8f, 0x48, 0x00, 0xf1, 0x01, 0x0b, 0x00, 0x20, 0x02, 0x90, + 0x00, 0x20, 0x04, 0x90, 0x30, 0x68, 0x80, 0x47, 0x04, 0x46, 0x00, 0x28, + 0x40, 0xf0, 0xbf, 0x80, 0x80, 0x49, 0x81, 0x4a, 0x03, 0x23, 0x08, 0x78, + 0x13, 0x54, 0x01, 0x30, 0x08, 0x70, 0xc0, 0xb2, 0xff, 0x28, 0x04, 0xbf, + 0x00, 0x20, 0x08, 0x70, 0x04, 0x9c, 0x04, 0xeb, 0x44, 0x0c, 0x00, 0x2c, + 0x08, 0xeb, 0xcc, 0x01, 0x58, 0xf8, 0x3c, 0xa0, 0xd1, 0xe9, 0x03, 0xe6, + 0xd1, 0xe9, 0x01, 0x32, 0x37, 0x68, 0x01, 0x98, 0x6f, 0xf3, 0x5e, 0x37, + 0x47, 0xea, 0x00, 0x07, 0x4f, 0xf0, 0xe0, 0x00, 0x37, 0x60, 0x75, 0x4f, + 0x1e, 0x68, 0x60, 0xf3, 0x1f, 0x66, 0x1e, 0x60, 0x4f, 0xf0, 0xcc, 0x03, + 0x08, 0xbf, 0x33, 0x23, 0x7e, 0x68, 0x43, 0xea, 0x06, 0x03, 0x4f, 0xf0, + 0x0e, 0x06, 0x7b, 0x60, 0x4f, 0xf0, 0xe0, 0x03, 0x08, 0xbf, 0xb0, 0x23, + 0x00, 0x2c, 0x08, 0xbf, 0x0b, 0x26, 0x02, 0x98, 0x00, 0x28, 0x08, 0xbf, + 0x0a, 0x26, 0x33, 0x44, 0x3b, 0x60, 0x4f, 0xf4, 0x4c, 0x53, 0x00, 0x2c, + 0x4e, 0x69, 0x08, 0xbf, 0x4f, 0xf4, 0x4c, 0x43, 0x3b, 0x62, 0x00, 0x27, + 0x13, 0x68, 0x43, 0xf4, 0x40, 0x53, 0x13, 0x60, 0xde, 0xf8, 0x00, 0x20, + 0xcd, 0xf8, 0x0c, 0xe0, 0x42, 0xf0, 0x10, 0x02, 0xce, 0xf8, 0x00, 0x20, + 0x03, 0x99, 0x08, 0x68, 0x20, 0xf0, 0x0f, 0x00, 0x38, 0x43, 0x08, 0x60, + 0x30, 0x68, 0x40, 0xf4, 0x00, 0x30, 0x30, 0x60, 0xda, 0xf8, 0x00, 0x00, + 0x40, 0x00, 0x13, 0xd4, 0x01, 0x20, 0x80, 0x46, 0xb5, 0xf8, 0x98, 0x00, + 0xa8, 0xf1, 0x01, 0x01, 0x89, 0xb2, 0x81, 0x42, 0x0c, 0xd2, 0xb9, 0xf8, + 0x00, 0x00, 0x02, 0x38, 0xd8, 0x47, 0xda, 0xf8, 0x00, 0x10, 0x08, 0xf1, + 0x01, 0x00, 0x49, 0x00, 0xed, 0xd5, 0x01, 0xe0, 0x4f, 0xf0, 0x00, 0x08, + 0xb5, 0xf8, 0x98, 0x00, 0x1f, 0xfa, 0x88, 0xf1, 0x81, 0x42, 0x30, 0xd2, + 0x42, 0x4a, 0x43, 0x4b, 0x04, 0x24, 0x11, 0x78, 0x5c, 0x54, 0x01, 0x31, + 0x11, 0x70, 0xc9, 0xb2, 0xff, 0x29, 0x04, 0xbf, 0x00, 0x21, 0x11, 0x70, + 0xb9, 0xf8, 0x00, 0x10, 0x48, 0x43, 0x02, 0x38, 0xd8, 0x47, 0xda, 0xf8, + 0x00, 0x00, 0x42, 0x4b, 0xc0, 0xf3, 0x46, 0x50, 0xda, 0xf8, 0x00, 0x10, + 0xc1, 0xf3, 0x04, 0x41, 0x02, 0x9a, 0x00, 0x2a, 0x04, 0x9a, 0x02, 0xeb, + 0x82, 0x02, 0x03, 0xeb, 0x02, 0x12, 0x1d, 0xbf, 0x02, 0xeb, 0x87, 0x02, + 0xd1, 0x63, 0x90, 0x62, 0x42, 0xf8, 0x27, 0x00, 0x04, 0xbf, 0x02, 0xeb, + 0x87, 0x00, 0x41, 0x61, 0x01, 0x37, 0x05, 0x2f, 0xa6, 0xd1, 0x00, 0x24, + 0x0e, 0xe0, 0x03, 0xf0, 0x31, 0xf8, 0x29, 0x49, 0x29, 0x4a, 0x05, 0x23, + 0x08, 0x78, 0x13, 0x54, 0x01, 0x30, 0x08, 0x70, 0xc0, 0xb2, 0xff, 0x28, + 0x01, 0xd1, 0x00, 0x20, 0x08, 0x70, 0x01, 0x24, 0xdf, 0xf8, 0x90, 0x80, + 0x27, 0x4e, 0x04, 0x98, 0x01, 0x30, 0x02, 0x28, 0x04, 0x90, 0x7f, 0xf4, + 0x35, 0xaf, 0x02, 0x98, 0x01, 0x30, 0x02, 0x28, 0x02, 0x90, 0x7f, 0xf4, + 0x2d, 0xaf, 0x14, 0xb9, 0x24, 0x48, 0x00, 0x68, 0x80, 0x47, 0x24, 0x4e, + 0x30, 0x78, 0xff, 0x28, 0x01, 0xd0, 0x0d, 0x28, 0x13, 0xd1, 0x22, 0x48, + 0x01, 0x68, 0xa0, 0x20, 0x88, 0x47, 0x70, 0xb1, 0x1c, 0x4a, 0xa0, 0x21, + 0xa0, 0x23, 0x05, 0x46, 0xc7, 0xf7, 0xee, 0xfc, 0x1d, 0x48, 0x29, 0x46, + 0xa0, 0x22, 0x03, 0x68, 0x30, 0x78, 0x98, 0x47, 0x28, 0x46, 0xcd, 0xf7, + 0x53, 0xfb, 0x11, 0x49, 0x00, 0x20, 0x48, 0x60, 0x08, 0x60, 0x08, 0x62, + 0x05, 0xa9, 0x01, 0x30, 0x58, 0xf8, 0x04, 0x2b, 0x08, 0xc9, 0x0c, 0x28, + 0x13, 0x60, 0xf8, 0xd1, 0x08, 0x49, 0x08, 0x68, 0x40, 0xf0, 0x00, 0x70, + 0x08, 0x60, 0x20, 0x46, 0x11, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0xbf, + 0x00, 0x69, 0x08, 0x00, 0xcc, 0x20, 0x06, 0x00, 0xcd, 0x20, 0x06, 0x00, + 0xe8, 0xa2, 0x05, 0x00, 0x80, 0x54, 0x05, 0x30, 0x00, 0x00, 0xc0, 0x7f, + 0x54, 0xc0, 0x05, 0x30, 0x84, 0x9a, 0x08, 0x00, 0x34, 0xec, 0x01, 0x00, + 0x40, 0xec, 0x01, 0x00, 0xb8, 0xe1, 0x01, 0x00, 0x90, 0xbd, 0x08, 0x00, + 0x64, 0x8d, 0x08, 0x00, 0xd4, 0x9b, 0x08, 0x00, 0xe4, 0x9b, 0x08, 0x00, + 0x95, 0x49, 0x89, 0x79, 0x21, 0xb1, 0x03, 0x49, 0x0a, 0x68, 0x42, 0xf4, + 0x80, 0x62, 0x0a, 0x60, 0x00, 0xf0, 0xca, 0xbd, 0x54, 0xd7, 0x01, 0x00, + 0x2d, 0xe9, 0xf0, 0x47, 0x8e, 0x48, 0x90, 0xf8, 0x05, 0x90, 0xb9, 0xf1, + 0x01, 0x0f, 0x0c, 0xd0, 0xb9, 0xf1, 0x00, 0x0f, 0x40, 0xf0, 0x0d, 0x81, + 0x8b, 0x4b, 0x41, 0xf2, 0xb0, 0x31, 0x03, 0xeb, 0x01, 0x08, 0x41, 0xf2, + 0xec, 0x11, 0x5e, 0x18, 0x02, 0xe0, 0x86, 0x4e, 0x4f, 0xf0, 0x00, 0x08, + 0xdf, 0xf8, 0x14, 0xc2, 0x86, 0x4d, 0x85, 0x4a, 0x9c, 0xf8, 0xc6, 0x12, + 0x0c, 0xf5, 0x31, 0x7e, 0xaa, 0x46, 0x09, 0x07, 0x06, 0xd4, 0xb9, 0xf1, + 0x01, 0x0f, 0x3b, 0xd0, 0xb9, 0xf1, 0x00, 0x0f, 0x2f, 0xd0, 0x3b, 0xe0, + 0x05, 0xf5, 0x18, 0x77, 0x00, 0x23, 0x5c, 0x1c, 0x10, 0x46, 0xb9, 0xf1, + 0x00, 0x0f, 0x36, 0xf8, 0x14, 0x10, 0x02, 0xea, 0x01, 0x41, 0x36, 0xf8, + 0x13, 0x20, 0x6f, 0xf3, 0x9f, 0x32, 0x11, 0x44, 0x29, 0x60, 0x09, 0xd1, + 0x38, 0xf8, 0x14, 0x10, 0x38, 0xf8, 0x13, 0x20, 0x00, 0xea, 0x01, 0x41, + 0x6f, 0xf3, 0x9f, 0x32, 0x11, 0x44, 0x02, 0xc7, 0x99, 0x1c, 0x02, 0x46, + 0x04, 0x35, 0xcb, 0xb2, 0x42, 0x2b, 0xe0, 0xd3, 0xb6, 0xf8, 0x84, 0x10, + 0xb9, 0xf1, 0x01, 0x0f, 0x29, 0x60, 0x11, 0xd0, 0xb9, 0xf1, 0x00, 0x0f, + 0x55, 0x46, 0x0f, 0xd1, 0xb8, 0xf8, 0x84, 0x10, 0x39, 0x60, 0x41, 0xf2, + 0x36, 0x41, 0x0c, 0xeb, 0x01, 0x08, 0x41, 0xf2, 0x72, 0x21, 0x0c, 0xeb, + 0x01, 0x06, 0x03, 0xe0, 0x63, 0x4e, 0x01, 0xe0, 0x62, 0x4e, 0x55, 0x46, + 0xde, 0xf8, 0x00, 0x30, 0xd9, 0x02, 0x03, 0xd4, 0xb9, 0xf1, 0x00, 0x0f, + 0x6e, 0xd1, 0x2f, 0xe0, 0x05, 0xf5, 0x3a, 0x77, 0x05, 0xf1, 0x88, 0x03, + 0x00, 0x25, 0x6c, 0x1c, 0x10, 0x46, 0xb9, 0xf1, 0x00, 0x0f, 0x36, 0xf8, + 0x14, 0x10, 0x02, 0xea, 0x01, 0x41, 0x36, 0xf8, 0x15, 0x20, 0x6f, 0xf3, + 0x9f, 0x32, 0x11, 0x44, 0x19, 0x60, 0x09, 0xd1, 0x38, 0xf8, 0x14, 0x10, + 0x38, 0xf8, 0x15, 0x20, 0x00, 0xea, 0x01, 0x41, 0x6f, 0xf3, 0x9f, 0x32, + 0x11, 0x44, 0x02, 0xc7, 0xa9, 0x1c, 0x02, 0x46, 0x04, 0x33, 0xcd, 0xb2, + 0x42, 0x2d, 0xe0, 0xd3, 0xb6, 0xf8, 0x84, 0x10, 0xb9, 0xf1, 0x00, 0x0f, + 0x19, 0x60, 0x42, 0xd1, 0xb8, 0xf8, 0x84, 0x10, 0x55, 0x46, 0x39, 0x60, + 0xde, 0xf8, 0x00, 0x30, 0x99, 0x02, 0x41, 0xd5, 0x28, 0x46, 0x14, 0x46, + 0x41, 0xf2, 0xbe, 0x41, 0x6f, 0xf0, 0x01, 0x06, 0x00, 0xf5, 0x5c, 0x72, + 0x00, 0xf5, 0x88, 0x73, 0x40, 0x48, 0x0c, 0xeb, 0x01, 0x05, 0x80, 0x46, + 0x3f, 0x48, 0x41, 0x46, 0x07, 0x46, 0x02, 0x36, 0x35, 0xf8, 0x08, 0x10, + 0x2f, 0x5a, 0x3a, 0x2e, 0x04, 0xea, 0x01, 0x41, 0x6f, 0xf3, 0x9f, 0x37, + 0x39, 0x44, 0x02, 0xc3, 0x29, 0x88, 0x35, 0xf8, 0x02, 0x7c, 0x05, 0xf1, + 0x04, 0x05, 0x04, 0xea, 0x01, 0x41, 0x6f, 0xf3, 0x9f, 0x37, 0x39, 0x44, + 0x02, 0xc2, 0xe6, 0xd3, 0x41, 0xf2, 0x70, 0x31, 0x3c, 0xf8, 0x01, 0x10, + 0x19, 0x60, 0x41, 0xf2, 0x34, 0x51, 0x3c, 0xf8, 0x01, 0x10, 0x11, 0x60, + 0x41, 0xf2, 0xbc, 0x41, 0x22, 0x46, 0x0c, 0xeb, 0x01, 0x08, 0x41, 0xf2, + 0xf8, 0x21, 0x0c, 0xeb, 0x01, 0x06, 0x55, 0x46, 0xb9, 0xf1, 0x01, 0x0f, + 0x0b, 0xd0, 0xb9, 0xf1, 0x00, 0x0f, 0x09, 0xd1, 0x41, 0xf2, 0x36, 0x51, + 0x0c, 0xeb, 0x01, 0x08, 0x41, 0xf2, 0x72, 0x31, 0x0c, 0xeb, 0x01, 0x06, + 0x00, 0xe0, 0x22, 0x4e, 0x9e, 0xf8, 0x02, 0x10, 0x49, 0x06, 0x28, 0xd5, + 0x05, 0xf5, 0x7b, 0x74, 0x05, 0xf5, 0xc6, 0x73, 0x00, 0x25, 0x6f, 0x1c, + 0x10, 0x46, 0xb9, 0xf1, 0x00, 0x0f, 0x36, 0xf8, 0x17, 0x10, 0x02, 0xea, + 0x01, 0x41, 0x36, 0xf8, 0x15, 0x20, 0x6f, 0xf3, 0x9f, 0x32, 0x11, 0x44, + 0x19, 0x60, 0x09, 0xd1, 0x38, 0xf8, 0x17, 0x10, 0x38, 0xf8, 0x15, 0x20, + 0x00, 0xea, 0x01, 0x41, 0x6f, 0xf3, 0x9f, 0x32, 0x11, 0x44, 0x02, 0xc4, + 0xa9, 0x1c, 0x02, 0x46, 0x04, 0x33, 0xcd, 0xb2, 0x1e, 0x2d, 0xe0, 0xd3, + 0xb1, 0x8f, 0xb9, 0xf1, 0x00, 0x0f, 0x19, 0x60, 0x01, 0xd0, 0xbd, 0xe8, + 0xf0, 0x87, 0xb8, 0xf8, 0x3c, 0x00, 0x20, 0x60, 0xbd, 0xe8, 0xf0, 0x87, + 0x48, 0xdc, 0x05, 0x00, 0xb8, 0x2f, 0x06, 0x00, 0x00, 0x69, 0x08, 0x00, + 0x00, 0x00, 0xff, 0x3f, 0x00, 0xe1, 0x00, 0x40, 0x3e, 0x30, 0x06, 0x00, + 0x3c, 0xfe, 0xff, 0xff, 0x3a, 0xfe, 0xff, 0xff, 0xc4, 0x30, 0x06, 0x00, + 0xb0, 0xb5, 0x0d, 0x4a, 0x58, 0xb1, 0x0d, 0x4d, 0xd2, 0xf8, 0x00, 0x34, + 0x40, 0xf2, 0xf3, 0x34, 0x2d, 0x68, 0xa3, 0x43, 0x2c, 0x40, 0x23, 0x44, + 0xc2, 0xf8, 0x00, 0x34, 0x08, 0xe0, 0x07, 0x4d, 0x13, 0x68, 0x40, 0xf2, + 0xf3, 0x34, 0x2d, 0x68, 0xa3, 0x43, 0x2c, 0x40, 0x23, 0x44, 0x13, 0x60, + 0xbd, 0xe8, 0xb0, 0x40, 0x00, 0xf0, 0x80, 0xbc, 0x28, 0xf5, 0x03, 0x40, + 0x94, 0x1f, 0x06, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, 0x87, 0xb0, 0x03, 0x2a, + 0x01, 0xd9, 0x00, 0x20, 0xe5, 0xe0, 0x0d, 0x46, 0x73, 0x49, 0x14, 0x46, + 0x0a, 0x68, 0x22, 0xf0, 0x01, 0x02, 0x0a, 0x60, 0x71, 0x49, 0x0a, 0x68, + 0x02, 0x21, 0x90, 0x47, 0x70, 0x49, 0x5d, 0xb1, 0x0a, 0x68, 0x00, 0xf4, + 0xfc, 0x52, 0x42, 0xea, 0x00, 0x40, 0x08, 0x60, 0x08, 0x69, 0x40, 0xf4, + 0x00, 0x40, 0x20, 0xf0, 0x80, 0x00, 0x06, 0xe0, 0x0a, 0x68, 0x08, 0x60, + 0x08, 0x69, 0x48, 0xf2, 0x80, 0x02, 0x90, 0x43, 0x80, 0x30, 0x67, 0x4d, + 0x08, 0x61, 0x00, 0x26, 0x40, 0xf2, 0xff, 0x30, 0xee, 0x4f, 0xdf, 0xf8, + 0x98, 0xa1, 0x02, 0x21, 0xc5, 0xf8, 0xb4, 0x60, 0xc5, 0xf8, 0xc4, 0x60, + 0x2e, 0x60, 0x2e, 0x65, 0xc5, 0xf8, 0xb0, 0x00, 0x5f, 0x48, 0xc5, 0xf8, + 0xc0, 0x00, 0x38, 0x78, 0x00, 0xeb, 0x80, 0x00, 0x0a, 0xeb, 0x40, 0x10, + 0x80, 0xf8, 0x54, 0x10, 0x5c, 0x48, 0xcd, 0xe9, 0x01, 0x00, 0x5c, 0x48, + 0x01, 0x68, 0x01, 0xa8, 0x88, 0x47, 0x38, 0x78, 0xdf, 0xf8, 0x68, 0x81, + 0x4f, 0xf0, 0x5c, 0x09, 0x01, 0x99, 0x10, 0xfb, 0x09, 0x80, 0x81, 0x60, + 0xc5, 0xf8, 0xcc, 0x12, 0x56, 0x48, 0x57, 0x49, 0xc5, 0xf8, 0xac, 0x62, + 0x00, 0x5d, 0x09, 0x68, 0x88, 0x47, 0x55, 0x48, 0x00, 0x21, 0x00, 0x22, + 0x06, 0x23, 0x00, 0x96, 0x4f, 0xf0, 0x06, 0x0b, 0x04, 0x68, 0x02, 0x20, + 0xa0, 0x47, 0x51, 0x4c, 0x51, 0x4a, 0x06, 0x21, 0x06, 0x23, 0x20, 0x68, + 0x00, 0xf2, 0x3f, 0x10, 0xc7, 0xf7, 0xe4, 0xfa, 0x38, 0x78, 0x23, 0x68, + 0x00, 0xeb, 0x80, 0x00, 0x03, 0xf2, 0x3f, 0x13, 0x0a, 0xeb, 0x40, 0x10, + 0x90, 0xf8, 0x54, 0x10, 0x50, 0xf8, 0x21, 0x20, 0x6b, 0xf3, 0x9f, 0x52, + 0x40, 0xf8, 0x21, 0x20, 0x90, 0xf8, 0x54, 0x10, 0x4a, 0x1c, 0x80, 0xf8, + 0x54, 0x20, 0x50, 0xf8, 0x21, 0x20, 0x63, 0xf3, 0x15, 0x02, 0x40, 0xf8, + 0x21, 0x20, 0xd5, 0xf8, 0xd0, 0x02, 0x20, 0xf4, 0x7c, 0x50, 0xc5, 0xf8, + 0xd0, 0x02, 0x38, 0x78, 0x00, 0xeb, 0x80, 0x00, 0x0a, 0xeb, 0x40, 0x10, + 0x90, 0xf8, 0x54, 0x10, 0x50, 0xf8, 0x21, 0x20, 0x6f, 0xf3, 0x9f, 0x52, + 0x40, 0xf8, 0x21, 0x20, 0x90, 0xf8, 0x54, 0x10, 0x50, 0xf8, 0x21, 0x20, + 0x6f, 0xf3, 0x15, 0x02, 0x40, 0xf8, 0x21, 0x20, 0x90, 0xf8, 0x54, 0x00, + 0x0e, 0x28, 0x04, 0xd3, 0x00, 0x20, 0x40, 0xf2, 0x3e, 0x51, 0xc7, 0xf7, + 0x93, 0xfa, 0x2f, 0x49, 0x6e, 0x60, 0x6e, 0x65, 0xae, 0x60, 0xae, 0x65, + 0x2e, 0x4c, 0x38, 0x78, 0x0a, 0x78, 0x4b, 0x78, 0x89, 0x78, 0x10, 0xfb, + 0x09, 0x80, 0x42, 0xea, 0x03, 0x22, 0x42, 0xea, 0x01, 0x41, 0x2a, 0x4a, + 0x41, 0x60, 0x4f, 0xf0, 0x01, 0x10, 0x69, 0x61, 0x28, 0x60, 0x57, 0x1c, + 0xd5, 0xf8, 0xbc, 0x10, 0xd5, 0xf8, 0xcc, 0x00, 0x49, 0x00, 0x04, 0xd5, + 0x00, 0xf4, 0xa0, 0x40, 0xb0, 0xf5, 0xa0, 0x4f, 0x0f, 0xd0, 0x20, 0x88, + 0x02, 0x38, 0xb8, 0x47, 0xd5, 0xf8, 0xbc, 0x10, 0x01, 0x36, 0xd5, 0xf8, + 0xcc, 0x00, 0xb6, 0xf5, 0xfa, 0x7f, 0xed, 0xd1, 0x19, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x00, 0x20, 0x03, 0xe0, 0x17, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x01, 0x20, 0x18, 0x49, 0x09, 0x78, 0x31, 0xb9, 0xd5, 0xf8, 0xbc, 0x10, + 0x16, 0x4a, 0x11, 0x60, 0xd5, 0xf8, 0xcc, 0x10, 0x51, 0x60, 0x07, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0x04, 0x10, 0x00, 0x40, 0x9c, 0xbd, 0x08, 0x00, + 0x40, 0x10, 0x01, 0x40, 0x20, 0x10, 0x21, 0x40, 0xf3, 0xf3, 0xff, 0x1f, + 0xbc, 0x65, 0x01, 0x00, 0xd6, 0xbe, 0x89, 0x8e, 0x18, 0x8f, 0x08, 0x00, + 0x44, 0x4f, 0x01, 0x00, 0x18, 0xa3, 0x05, 0x00, 0xac, 0xb9, 0x08, 0x00, + 0x58, 0xbd, 0x08, 0x00, 0xdc, 0x35, 0x01, 0x00, 0x8e, 0x58, 0x01, 0x00, + 0x08, 0x32, 0x0a, 0x10, 0x18, 0xbb, 0x08, 0x00, 0x34, 0xec, 0x01, 0x00, + 0x40, 0xec, 0x01, 0x00, 0x88, 0x22, 0x06, 0x00, 0xcc, 0x21, 0x06, 0x00, + 0xb0, 0xb5, 0x04, 0x46, 0x68, 0xb1, 0x03, 0x2c, 0x0b, 0xd0, 0x01, 0x2c, + 0x14, 0xd1, 0x38, 0x48, 0x00, 0x68, 0x80, 0x47, 0x32, 0x48, 0x00, 0x68, + 0x80, 0x47, 0x32, 0x48, 0x00, 0x68, 0x80, 0x47, 0x0a, 0xe0, 0x2f, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x2e, 0x48, 0x00, 0x68, 0x80, 0x47, 0x2c, 0xb1, + 0x03, 0x2c, 0x01, 0xd1, 0x00, 0x25, 0x02, 0xe0, 0x00, 0x25, 0x0a, 0xe0, + 0x01, 0x25, 0x2a, 0x48, 0x00, 0x68, 0x80, 0x47, 0xa9, 0x48, 0x29, 0x49, + 0x90, 0xf8, 0xc4, 0x02, 0x00, 0xf0, 0x04, 0x00, 0x08, 0x70, 0x28, 0x48, + 0x00, 0x78, 0x10, 0xb1, 0x27, 0x48, 0x01, 0x21, 0x01, 0x70, 0xa3, 0x48, + 0x90, 0xf8, 0xf6, 0x0e, 0xc0, 0x07, 0x09, 0xd0, 0x2d, 0xb9, 0x03, 0x2c, + 0x03, 0xd0, 0x22, 0x48, 0x00, 0x78, 0x01, 0x28, 0x08, 0xd1, 0x21, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x03, 0x2c, 0x03, 0xd1, 0x1f, 0x48, 0x01, 0x68, + 0x00, 0x20, 0x88, 0x47, 0x1e, 0x48, 0xf4, 0x30, 0x10, 0xf8, 0x0e, 0x1f, + 0x21, 0xb3, 0x1d, 0x49, 0x42, 0x78, 0x0b, 0x68, 0x23, 0xf0, 0xff, 0x03, + 0x1a, 0x44, 0x0a, 0x60, 0x02, 0x89, 0x43, 0x88, 0x4d, 0x68, 0x43, 0xea, + 0x02, 0x43, 0x18, 0x4a, 0x03, 0xea, 0x02, 0x04, 0x17, 0x4b, 0x1d, 0x40, + 0x2c, 0x44, 0x4c, 0x60, 0x44, 0x89, 0x85, 0x88, 0x45, 0xea, 0x04, 0x44, + 0x8d, 0x68, 0x14, 0x40, 0x1d, 0x40, 0x2c, 0x44, 0x8c, 0x60, 0x84, 0x89, + 0xc0, 0x88, 0x40, 0xea, 0x04, 0x40, 0x10, 0x40, 0xca, 0x68, 0x1a, 0x40, + 0x10, 0x44, 0xc8, 0x60, 0xb0, 0xbd, 0x00, 0xbf, 0x24, 0xbc, 0x08, 0x00, + 0x30, 0xbc, 0x08, 0x00, 0x3c, 0xbc, 0x08, 0x00, 0xa7, 0x58, 0x01, 0x00, + 0x38, 0xbc, 0x08, 0x00, 0x64, 0x8d, 0x08, 0x00, 0xa6, 0x58, 0x01, 0x00, + 0x2c, 0xbc, 0x08, 0x00, 0x40, 0xbc, 0x08, 0x00, 0xe8, 0x65, 0x08, 0x00, + 0x50, 0x94, 0x23, 0x40, 0xff, 0x07, 0xff, 0x3f, 0x00, 0xf8, 0x00, 0xc0, + 0x10, 0xb5, 0x75, 0x4a, 0xb2, 0xf8, 0x7c, 0x26, 0xd3, 0x07, 0x36, 0xd0, + 0x2f, 0x4b, 0x5b, 0x78, 0x9b, 0xb3, 0x80, 0x28, 0x14, 0xd1, 0x2e, 0x4b, + 0x2e, 0x4c, 0x1b, 0x78, 0x03, 0xeb, 0x03, 0x13, 0x54, 0xf8, 0x33, 0x30, + 0x63, 0xb1, 0x93, 0xf8, 0x3e, 0x33, 0xdb, 0x07, 0x08, 0xd0, 0x53, 0x06, + 0x58, 0xbf, 0x5f, 0xea, 0x82, 0x63, 0x03, 0xd5, 0x27, 0x4b, 0x1b, 0x78, + 0x00, 0x2b, 0x41, 0xd0, 0x02, 0x42, 0x01, 0xd1, 0x93, 0x06, 0x02, 0xd5, + 0x23, 0x4b, 0x1b, 0x78, 0x2b, 0xb1, 0x53, 0x05, 0x13, 0xd5, 0x21, 0x4b, + 0x1b, 0x78, 0x01, 0x2b, 0x0f, 0xd1, 0x02, 0x28, 0x1c, 0xd0, 0x04, 0x28, + 0x27, 0xd0, 0x20, 0x28, 0x12, 0xd0, 0x40, 0x28, 0x10, 0xd0, 0xb0, 0xf5, + 0x00, 0x7f, 0x0d, 0xd0, 0xb0, 0xf5, 0x80, 0x7f, 0x26, 0xd0, 0x80, 0x28, + 0x24, 0xd0, 0x1b, 0x4c, 0x00, 0x20, 0x21, 0x68, 0x88, 0x47, 0x21, 0x68, + 0x01, 0x20, 0xbd, 0xe8, 0x10, 0x40, 0x08, 0x47, 0x13, 0x48, 0x02, 0x68, + 0x08, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x10, 0x47, 0x11, 0x48, 0x00, 0x68, + 0x80, 0x07, 0x04, 0xd0, 0xd0, 0x06, 0x58, 0xbf, 0x5f, 0xea, 0x82, 0x60, + 0x0f, 0xd5, 0x0c, 0x48, 0x01, 0x68, 0x00, 0x20, 0xe9, 0xe7, 0x0c, 0x48, + 0x00, 0x68, 0x80, 0x07, 0x04, 0xd0, 0xd0, 0x06, 0x58, 0xbf, 0x5f, 0xea, + 0x82, 0x60, 0x02, 0xd5, 0x05, 0x48, 0x01, 0x68, 0xdc, 0xe7, 0x10, 0xbd, + 0x3c, 0x88, 0x01, 0x00, 0x74, 0x87, 0x08, 0x00, 0xfc, 0x6d, 0x01, 0x00, + 0x08, 0x72, 0x01, 0x00, 0x6c, 0xe3, 0x08, 0x00, 0x3c, 0x20, 0x21, 0x40, + 0xa4, 0x10, 0x21, 0x40, 0x70, 0xe3, 0x08, 0x00, 0x1f, 0xb5, 0x14, 0x46, + 0x08, 0x9a, 0x02, 0x92, 0x07, 0x9a, 0x01, 0x92, 0x06, 0x9a, 0x00, 0x92, + 0x22, 0x46, 0x00, 0xf0, 0x5f, 0xfa, 0x10, 0xf1, 0x80, 0x01, 0x0b, 0xd1, + 0x06, 0x49, 0x91, 0xf8, 0x3e, 0x16, 0x01, 0x29, 0x06, 0xd1, 0x05, 0x48, + 0x40, 0x79, 0x01, 0x28, 0x18, 0xbf, 0x6f, 0xf0, 0x7f, 0x04, 0x60, 0xb2, + 0x04, 0xb0, 0x10, 0xbd, 0x64, 0xd4, 0x05, 0x00, 0x48, 0xdc, 0x05, 0x00, + 0xf3, 0x48, 0x00, 0x68, 0x00, 0x47, 0x00, 0xbf, 0x80, 0xb5, 0x00, 0xf0, + 0x49, 0xfa, 0x08, 0x48, 0x01, 0x68, 0x21, 0xf0, 0x01, 0x01, 0x01, 0x60, + 0x80, 0xbd, 0x00, 0xbf, 0x80, 0xb5, 0x00, 0xf0, 0x45, 0xfa, 0x03, 0x48, + 0x01, 0x68, 0x41, 0xf0, 0x01, 0x01, 0x01, 0x60, 0x80, 0xbd, 0x00, 0xbf, + 0x08, 0x00, 0x00, 0x40, 0x2d, 0xe9, 0xf0, 0x41, 0x1c, 0x48, 0x90, 0xf8, + 0xf6, 0x1e, 0xc9, 0x07, 0x08, 0xd0, 0xd0, 0xf8, 0x34, 0x02, 0xb0, 0xf1, + 0xff, 0x3f, 0x03, 0xdc, 0x18, 0x48, 0x90, 0xf8, 0x35, 0x10, 0x19, 0xb1, + 0x00, 0x24, 0x20, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x15, 0x4e, 0xdf, 0xf8, + 0x58, 0x80, 0x16, 0x4f, 0x00, 0xf1, 0x33, 0x05, 0x28, 0x78, 0x00, 0x28, + 0xf2, 0xd0, 0x30, 0x68, 0x80, 0x47, 0xc0, 0xb9, 0x28, 0x78, 0x69, 0x78, + 0x47, 0x28, 0x03, 0xd3, 0x46, 0x31, 0x46, 0x38, 0x69, 0x70, 0x02, 0xe0, + 0x08, 0x44, 0x68, 0x70, 0x00, 0x20, 0x28, 0x70, 0xd8, 0xf8, 0x00, 0x00, + 0x80, 0x47, 0x00, 0x20, 0x00, 0x24, 0xc8, 0xf7, 0xa9, 0xfa, 0x38, 0x68, + 0x80, 0x47, 0xa8, 0x78, 0x00, 0x28, 0xe1, 0xd0, 0xd7, 0xe7, 0x04, 0x46, + 0xd5, 0xe7, 0x00, 0xbf, 0x00, 0x69, 0x08, 0x00, 0x8c, 0x22, 0x06, 0x00, + 0x84, 0x9a, 0x08, 0x00, 0x34, 0xfc, 0x08, 0x00, 0x60, 0xfd, 0x08, 0x00, + 0x55, 0x48, 0x56, 0x49, 0x01, 0x60, 0x56, 0x48, 0x56, 0x49, 0x01, 0x60, + 0x56, 0x48, 0x57, 0x49, 0x01, 0x60, 0x57, 0x48, 0x57, 0x49, 0x01, 0x60, + 0x57, 0x48, 0x58, 0x49, 0x01, 0x60, 0x58, 0x48, 0x58, 0x49, 0x01, 0x60, + 0x58, 0x48, 0x59, 0x49, 0x01, 0x60, 0x59, 0x48, 0x59, 0x49, 0x01, 0x60, + 0x59, 0x48, 0x5a, 0x49, 0x01, 0x60, 0x5a, 0x48, 0x5a, 0x49, 0x01, 0x60, + 0x5a, 0x48, 0x5b, 0x49, 0x01, 0x60, 0x5b, 0x48, 0x5b, 0x49, 0x01, 0x60, + 0x5b, 0x48, 0x5c, 0x49, 0x01, 0x60, 0x5c, 0x48, 0x5c, 0x49, 0x01, 0x60, + 0x5c, 0x48, 0x5d, 0x49, 0x01, 0x60, 0x5d, 0x48, 0x5d, 0x49, 0x01, 0x60, + 0x5d, 0x48, 0x5e, 0x49, 0x01, 0x60, 0x5e, 0x48, 0x5e, 0x49, 0x01, 0x60, + 0x5e, 0x48, 0x5f, 0x49, 0x01, 0x60, 0x5f, 0x48, 0x5f, 0x49, 0x01, 0x60, + 0x5f, 0x48, 0x60, 0x49, 0x01, 0x60, 0x60, 0x48, 0x60, 0x49, 0x01, 0x60, + 0x60, 0x48, 0x61, 0x49, 0x01, 0x60, 0x61, 0x48, 0x61, 0x49, 0x01, 0x60, + 0x61, 0x48, 0x62, 0x49, 0x01, 0x60, 0x62, 0x48, 0x62, 0x49, 0x01, 0x60, + 0x62, 0x48, 0x63, 0x49, 0x01, 0x60, 0x63, 0x48, 0x63, 0x49, 0x01, 0x60, + 0x63, 0x48, 0x64, 0x49, 0x01, 0x60, 0x64, 0x48, 0x64, 0x49, 0x01, 0x60, + 0x64, 0x48, 0x65, 0x49, 0x01, 0x60, 0x65, 0x48, 0x65, 0x49, 0x01, 0x60, + 0x65, 0x48, 0x66, 0x49, 0x01, 0x60, 0x66, 0x48, 0x66, 0x49, 0x01, 0x60, + 0x66, 0x48, 0x67, 0x49, 0x01, 0x60, 0x67, 0x48, 0x67, 0x49, 0x01, 0x60, + 0x67, 0x48, 0x68, 0x49, 0x01, 0x60, 0x68, 0x48, 0x68, 0x49, 0x01, 0x60, + 0x68, 0x48, 0x69, 0x49, 0x01, 0x60, 0x69, 0x48, 0x69, 0x49, 0x01, 0x60, + 0x69, 0x48, 0x6a, 0x49, 0x01, 0x60, 0x6a, 0x48, 0x6a, 0x49, 0x01, 0x60, + 0x6a, 0x48, 0x6b, 0x49, 0x01, 0x60, 0x6b, 0x48, 0x6b, 0x49, 0x01, 0x60, + 0x6b, 0x48, 0x6c, 0x49, 0x01, 0x60, 0x6c, 0x48, 0x6c, 0x49, 0x01, 0x60, + 0x6c, 0x48, 0x6d, 0x49, 0x01, 0x60, 0x6d, 0x48, 0x6d, 0x49, 0x01, 0x60, + 0x6d, 0x48, 0x6e, 0x49, 0x01, 0x60, 0x6e, 0x48, 0x6e, 0x49, 0x01, 0x60, + 0x6e, 0x48, 0x6f, 0x49, 0x01, 0x60, 0x6f, 0x48, 0x6f, 0x49, 0x01, 0x60, + 0x6f, 0x48, 0x70, 0x49, 0x01, 0x60, 0x70, 0x48, 0x70, 0x49, 0x01, 0x60, + 0x70, 0x48, 0x71, 0x49, 0x01, 0x60, 0x71, 0x48, 0x71, 0x49, 0x01, 0x60, + 0x71, 0x48, 0x72, 0x49, 0x01, 0x60, 0x70, 0x47, 0x50, 0x14, 0x01, 0x00, + 0x85, 0xb0, 0x05, 0x00, 0x88, 0xfd, 0x08, 0x00, 0x21, 0x9e, 0x05, 0x00, + 0x60, 0xfc, 0x08, 0x00, 0xc5, 0x8c, 0x05, 0x00, 0x78, 0xfd, 0x08, 0x00, + 0x2d, 0x44, 0x05, 0x00, 0x14, 0x8e, 0x08, 0x00, 0x55, 0x39, 0x05, 0x00, + 0xa4, 0xca, 0x08, 0x00, 0xc1, 0x45, 0x05, 0x00, 0xe8, 0xfb, 0x08, 0x00, + 0x0d, 0x52, 0x05, 0x00, 0xcc, 0xfd, 0x08, 0x00, 0x4d, 0x54, 0x05, 0x00, + 0xe4, 0xfb, 0x08, 0x00, 0x7d, 0x56, 0x05, 0x00, 0xc0, 0xfd, 0x08, 0x00, + 0x69, 0x5b, 0x05, 0x00, 0x8c, 0xb7, 0x08, 0x00, 0xc9, 0x5b, 0x05, 0x00, + 0xf8, 0xfb, 0x08, 0x00, 0xb5, 0x5b, 0x05, 0x00, 0xa0, 0xbd, 0x08, 0x00, + 0xe5, 0x5c, 0x05, 0x00, 0x3c, 0xfc, 0x08, 0x00, 0xd9, 0x5d, 0x05, 0x00, + 0x98, 0xfe, 0x08, 0x00, 0xfd, 0x5e, 0x05, 0x00, 0x64, 0xfd, 0x08, 0x00, + 0xa9, 0x5f, 0x05, 0x00, 0x6c, 0xa1, 0x08, 0x00, 0xd9, 0x64, 0x05, 0x00, + 0x84, 0xfc, 0x08, 0x00, 0x29, 0x67, 0x05, 0x00, 0x7c, 0xfd, 0x08, 0x00, + 0x69, 0x6a, 0x05, 0x00, 0x80, 0xfe, 0x08, 0x00, 0xc5, 0x43, 0x05, 0x00, + 0xa4, 0xd7, 0x08, 0x00, 0x41, 0x6f, 0x05, 0x00, 0x74, 0xfd, 0x08, 0x00, + 0x69, 0x77, 0x05, 0x00, 0x34, 0xfe, 0x08, 0x00, 0x9d, 0x74, 0x05, 0x00, + 0x2c, 0xfe, 0x08, 0x00, 0x2d, 0x70, 0x05, 0x00, 0xe4, 0xfc, 0x08, 0x00, + 0x41, 0x72, 0x05, 0x00, 0x30, 0xfe, 0x08, 0x00, 0x69, 0x75, 0x05, 0x00, + 0xe0, 0xfd, 0x08, 0x00, 0xfd, 0x80, 0x05, 0x00, 0xd4, 0xfd, 0x08, 0x00, + 0xf1, 0x7d, 0x05, 0x00, 0x8c, 0xfd, 0x08, 0x00, 0x65, 0x81, 0x05, 0x00, + 0xe8, 0xfc, 0x08, 0x00, 0x5d, 0x74, 0x05, 0x00, 0xcc, 0xfc, 0x08, 0x00, + 0x5d, 0x76, 0x05, 0x00, 0x50, 0xfd, 0x08, 0x00, 0xa9, 0x82, 0x05, 0x00, + 0xc8, 0xfd, 0x08, 0x00, 0x15, 0x83, 0x05, 0x00, 0x40, 0xbc, 0x08, 0x00, + 0x11, 0x84, 0x05, 0x00, 0x94, 0xfd, 0x08, 0x00, 0x09, 0x89, 0x05, 0x00, + 0x68, 0xd2, 0x08, 0x00, 0x59, 0x8d, 0x05, 0x00, 0xb8, 0xbd, 0x08, 0x00, + 0x81, 0x69, 0x05, 0x00, 0x50, 0xbc, 0x08, 0x00, 0x39, 0x8e, 0x05, 0x00, + 0xa8, 0xfd, 0x08, 0x00, 0xc5, 0x8f, 0x05, 0x00, 0x98, 0xbd, 0x08, 0x00, + 0x81, 0x90, 0x05, 0x00, 0x90, 0xfe, 0x08, 0x00, 0x95, 0x53, 0x05, 0x00, + 0x18, 0xf4, 0x08, 0x00, 0x09, 0x39, 0x05, 0x00, 0x8c, 0xbd, 0x08, 0x00, + 0xad, 0x91, 0x05, 0x00, 0x28, 0xfe, 0x08, 0x00, 0x95, 0x93, 0x05, 0x00, + 0x88, 0xcd, 0x08, 0x00, 0xb1, 0x93, 0x05, 0x00, 0x84, 0xfd, 0x08, 0x00, + 0x01, 0x94, 0x05, 0x00, 0x88, 0xe9, 0x08, 0x00, 0xc1, 0x96, 0x05, 0x00, + 0x84, 0xfe, 0x08, 0x00, 0xd9, 0x96, 0x05, 0x00, 0x88, 0xbd, 0x08, 0x00, + 0x3d, 0x99, 0x05, 0x00, 0xfc, 0xfb, 0x08, 0x00, 0x7d, 0x99, 0x05, 0x00, + 0xa4, 0xfe, 0x08, 0x00, 0xad, 0x9b, 0x05, 0x00, 0xf8, 0xb9, 0x08, 0x00, + 0xc1, 0x9c, 0x05, 0x00, 0x1c, 0xb8, 0x08, 0x00, 0xad, 0x9d, 0x05, 0x00, + 0xa0, 0xd7, 0x08, 0x00, 0x11, 0x68, 0x05, 0x00, 0x70, 0xa1, 0x08, 0x00, + 0xed, 0x9d, 0x05, 0x00, 0x00, 0xfe, 0x08, 0x00, 0xf5, 0x9d, 0x05, 0x00, + 0x04, 0xfe, 0x08, 0x00, 0x09, 0x9e, 0x05, 0x00, 0x48, 0xf6, 0x7b, 0x7c, + 0xc1, 0xf2, 0x00, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4a, 0xf2, 0x77, 0x3c, + 0xc1, 0xf2, 0x00, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x49, 0xf6, 0xb5, 0x7c, + 0xc1, 0xf2, 0x00, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4e, 0xf6, 0x41, 0x1c, + 0xc1, 0xf2, 0x0f, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x49, 0xf6, 0x7d, 0x4c, + 0xc1, 0xf2, 0x00, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x48, 0xf6, 0xfd, 0x1c, + 0xc1, 0xf2, 0x00, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x49, 0xf2, 0x59, 0x5c, + 0xc1, 0xf2, 0x00, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4a, 0xf6, 0xe5, 0x4c, + 0xc1, 0xf2, 0x01, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4d, 0xf6, 0x27, 0x5c, + 0xc1, 0xf2, 0x00, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4b, 0xf6, 0x45, 0x0c, + 0xc1, 0xf2, 0x12, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4f, 0xf6, 0x97, 0x5c, + 0xc1, 0xf2, 0x00, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4a, 0xf6, 0x5d, 0x2c, + 0xc1, 0xf2, 0x00, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x4a, 0xf2, 0x2d, 0x0c, + 0xc1, 0xf2, 0x00, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x47, 0xf6, 0x95, 0x6c, + 0xc1, 0xf2, 0x00, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x49, 0xf6, 0xe9, 0x5c, + 0xc1, 0xf2, 0x00, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x48, 0xf6, 0xcb, 0x5c, + 0xc1, 0xf2, 0x00, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x40, 0xf2, 0x1d, 0x2c, + 0xc1, 0xf2, 0x01, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x40, 0xf2, 0xc5, 0x1c, + 0xc1, 0xf2, 0x01, 0x0c, 0x60, 0x47, 0xfe, 0xde, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, + 0x50, 0x46, 0x41, 0x4c, 0x5f, 0x52, 0x4d, 0x5f, 0x48, 0x57, 0x5f, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x5f, 0x54, 0x65, 0x6d, 0x70, 0x43, 0x61, 0x6c, + 0x5f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x73, 0x3a, 0x20, + 0x77, 0x72, 0x6f, 0x6e, 0x67, 0x20, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3a, + 0x00, 0x00, 0x00, 0x00, 0xe4, 0x50, 0x05, 0x30, 0xcc, 0x50, 0x05, 0x30, + 0x98, 0x50, 0x05, 0x30, 0x1c, 0xdc, 0x05, 0x30, 0x44, 0x50, 0x05, 0x30, + 0x80, 0x50, 0x05, 0x30, 0xe4, 0x54, 0x05, 0x30, 0xcc, 0x54, 0x05, 0x30, + 0x98, 0x54, 0x05, 0x30, 0x1c, 0xf4, 0x05, 0x30, 0x44, 0x54, 0x05, 0x30, + 0x80, 0x54, 0x05, 0x30, 0x25, 0x26, 0x27, 0x00, 0x2d, 0xe9, 0xf8, 0x43, + 0x37, 0x4a, 0x00, 0x26, 0x8a, 0x4c, 0x8c, 0x4d, 0x72, 0xb6, 0x27, 0x18, + 0x11, 0x68, 0x49, 0x00, 0x01, 0x31, 0x11, 0x60, 0x8a, 0x49, 0x0b, 0x18, + 0x93, 0xf8, 0xa0, 0x10, 0x83, 0xf8, 0xa0, 0x60, 0x93, 0xf8, 0xa2, 0xe0, + 0x13, 0x68, 0x5b, 0x08, 0x13, 0x60, 0x97, 0xf8, 0xb8, 0x32, 0x97, 0xf8, + 0xbc, 0x92, 0x94, 0xf8, 0xc2, 0xc2, 0x94, 0xf8, 0xc5, 0x82, 0x12, 0x68, + 0x82, 0xf3, 0x10, 0x88, 0x07, 0xf5, 0x2f, 0x72, 0x2d, 0x79, 0xab, 0x42, + 0x07, 0xd3, 0x0b, 0x2b, 0x05, 0xd8, 0x21, 0xb1, 0x11, 0x78, 0x02, 0x29, + 0x01, 0xd3, 0x51, 0x29, 0x08, 0xd3, 0x07, 0xf5, 0x2e, 0x70, 0x16, 0x70, + 0x87, 0xf8, 0xc0, 0x62, 0x06, 0x70, 0x00, 0x20, 0xbd, 0xe8, 0xf8, 0x83, + 0x1d, 0x49, 0xa9, 0xf1, 0x02, 0x02, 0x14, 0x25, 0xde, 0x1f, 0xb2, 0xfb, + 0xf5, 0xf2, 0x01, 0xeb, 0x80, 0x01, 0x89, 0x56, 0xd2, 0x4a, 0x02, 0xeb, + 0x00, 0x22, 0x00, 0xeb, 0x80, 0x00, 0x12, 0xf8, 0x0e, 0x20, 0x11, 0x44, + 0x15, 0x4a, 0x02, 0x44, 0x32, 0x44, 0x92, 0xf9, 0xd8, 0x20, 0x89, 0x18, + 0x03, 0xd4, 0xff, 0x29, 0xa8, 0xbf, 0xff, 0x21, 0x00, 0xe0, 0x00, 0x21, + 0xc6, 0x4a, 0x02, 0xeb, 0x40, 0x00, 0x0c, 0xeb, 0x8c, 0x02, 0x10, 0x44, + 0x80, 0x57, 0x01, 0xeb, 0x40, 0x00, 0x0c, 0x49, 0x0a, 0x68, 0x09, 0x21, + 0x90, 0x47, 0x0b, 0x49, 0x89, 0x5d, 0x40, 0x1a, 0x94, 0xf9, 0xbe, 0x12, + 0x41, 0xfa, 0x88, 0xf1, 0x00, 0xeb, 0x41, 0x00, 0x5d, 0x49, 0x0a, 0x68, + 0x01, 0x21, 0xbd, 0xe8, 0xf8, 0x43, 0x10, 0x47, 0x24, 0x36, 0x01, 0x00, + 0x05, 0x13, 0x01, 0x00, 0x00, 0x2d, 0x06, 0x00, 0xd8, 0xfb, 0x08, 0x00, + 0x44, 0x14, 0x01, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, 0xdf, 0xf8, 0x34, 0x91, + 0x04, 0x46, 0x21, 0x46, 0x09, 0xeb, 0x00, 0x07, 0x97, 0xf8, 0xb8, 0x52, + 0x28, 0x46, 0x00, 0xf0, 0xa1, 0xf8, 0x78, 0xb3, 0xdf, 0xf8, 0x20, 0x81, + 0x45, 0x20, 0xd8, 0xf8, 0x00, 0x10, 0x88, 0x47, 0xdf, 0xf8, 0x18, 0xa1, + 0x9a, 0xf8, 0x09, 0x00, 0x10, 0xb1, 0x45, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x6d, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x97, 0xf8, 0xbc, 0x12, + 0x00, 0x29, 0x72, 0xd0, 0x02, 0x39, 0x0a, 0x22, 0x91, 0xfb, 0xf2, 0xf1, + 0x3e, 0x4a, 0x02, 0xeb, 0x45, 0x12, 0x02, 0xeb, 0x04, 0x1b, 0x0b, 0xeb, + 0x41, 0x01, 0xa1, 0xf1, 0xe0, 0x06, 0xb9, 0xf8, 0xca, 0x12, 0xc9, 0x07, + 0x0a, 0xd1, 0x76, 0x49, 0x38, 0x4f, 0x8a, 0x78, 0xcb, 0x78, 0xb6, 0xf9, + 0x00, 0x10, 0x3f, 0x68, 0xb8, 0x47, 0x02, 0xe0, 0xbd, 0xe8, 0xf8, 0x8f, + 0x40, 0x00, 0x30, 0x80, 0xf9, 0xf7, 0x20, 0xfa, 0x28, 0xb1, 0x32, 0x48, + 0x90, 0xf8, 0xe4, 0x02, 0x00, 0xf0, 0x0f, 0x06, 0x02, 0xe0, 0x0a, 0xeb, + 0x04, 0x00, 0x46, 0x7b, 0xab, 0xf1, 0xe0, 0x02, 0x00, 0x21, 0x00, 0x23, + 0x00, 0x20, 0x32, 0xf8, 0x02, 0x7b, 0x01, 0x33, 0x00, 0x2f, 0x18, 0xbf, + 0x01, 0x31, 0x00, 0xfa, 0x87, 0xf0, 0x08, 0x2b, 0xf5, 0xd1, 0x09, 0xb1, + 0x90, 0xfb, 0xf1, 0xf0, 0x25, 0x49, 0x0a, 0x68, 0x01, 0x21, 0x90, 0x47, + 0xe9, 0x49, 0x08, 0x60, 0x09, 0xeb, 0x45, 0x01, 0x21, 0x44, 0x91, 0xf8, + 0x94, 0x12, 0x01, 0x29, 0x0b, 0xd1, 0xe6, 0x49, 0x91, 0xf8, 0x0f, 0x13, + 0x88, 0x42, 0x0d, 0xda, 0x4a, 0x42, 0x00, 0x21, 0x90, 0x42, 0xd8, 0xbf, + 0x4f, 0xf0, 0xff, 0x31, 0x07, 0xe0, 0x40, 0x49, 0x22, 0x46, 0x33, 0x46, + 0x0f, 0x68, 0x29, 0x46, 0xb8, 0x47, 0x16, 0xe0, 0x01, 0x21, 0x05, 0xeb, + 0x85, 0x00, 0x04, 0xeb, 0x84, 0x02, 0x09, 0xeb, 0x80, 0x00, 0x00, 0xeb, + 0x42, 0x00, 0x30, 0x44, 0x90, 0xf9, 0x54, 0x21, 0x11, 0x44, 0x7f, 0x29, + 0x01, 0xdd, 0x7f, 0x21, 0x04, 0xe0, 0x11, 0xf1, 0x80, 0x0f, 0xd8, 0xbf, + 0x6f, 0xf0, 0x7f, 0x01, 0x01, 0x75, 0xd8, 0xf8, 0x00, 0x10, 0x46, 0x20, + 0xbd, 0xe8, 0xf8, 0x4f, 0x08, 0x47, 0x00, 0xbf, 0x98, 0xca, 0x01, 0x00, + 0x00, 0x9d, 0x08, 0x00, 0xf0, 0xd1, 0x01, 0x00, 0xf0, 0xfb, 0x08, 0x00, + 0xd8, 0x21, 0x06, 0x00, 0x10, 0xfc, 0x08, 0x00, 0x00, 0x69, 0x08, 0x00, + 0xd4, 0xfb, 0x08, 0x00, 0x23, 0x4a, 0x12, 0x79, 0x82, 0x42, 0x16, 0xdc, + 0x0b, 0x28, 0x14, 0xd8, 0x0b, 0x4a, 0x11, 0x44, 0x91, 0xf8, 0xb4, 0x12, + 0x01, 0x29, 0x0e, 0xd1, 0x6f, 0xf0, 0x0d, 0x01, 0x01, 0xeb, 0x40, 0x00, + 0xbd, 0x49, 0xb1, 0xf8, 0xde, 0x12, 0x21, 0xfa, 0x00, 0xf0, 0x01, 0x21, + 0x00, 0xf0, 0x02, 0x00, 0x81, 0xea, 0x50, 0x00, 0x70, 0x47, 0x00, 0x20, + 0x70, 0x47, 0x00, 0xbf, 0x98, 0xca, 0x01, 0x00, 0xf8, 0xb5, 0x05, 0x46, + 0xf1, 0x48, 0x47, 0x18, 0x97, 0xf8, 0xb4, 0x02, 0x01, 0x28, 0x1d, 0xd1, + 0x0f, 0x4e, 0x0c, 0x46, 0x70, 0x7a, 0x10, 0xb1, 0xeb, 0x48, 0x00, 0x68, + 0x80, 0x47, 0xac, 0x48, 0x21, 0x46, 0x02, 0x68, 0x01, 0x20, 0x90, 0x47, + 0x0a, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x97, 0xf8, 0xbc, 0x12, + 0x51, 0xb1, 0x31, 0x19, 0x22, 0x46, 0x4b, 0x7b, 0x06, 0x49, 0xd1, 0xf8, + 0x00, 0xc0, 0x29, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x40, 0x60, 0x47, + 0xf8, 0xbd, 0x00, 0xbf, 0xf0, 0xd1, 0x01, 0x00, 0x04, 0xfc, 0x08, 0x00, + 0x08, 0xfc, 0x08, 0x00, 0x70, 0xb5, 0xdb, 0x4d, 0x96, 0x4c, 0x0a, 0x26, + 0x15, 0x44, 0x04, 0xeb, 0x41, 0x14, 0x95, 0xf8, 0xbc, 0x52, 0x04, 0xeb, + 0x02, 0x14, 0x02, 0x3d, 0x95, 0xfb, 0xf6, 0xf5, 0x04, 0xeb, 0x45, 0x04, + 0x45, 0x00, 0x24, 0xf8, 0xe0, 0x5c, 0xbd, 0xe8, 0x70, 0x40, 0x00, 0xf0, + 0x17, 0xba, 0x00, 0xbf, 0x80, 0xb5, 0x8b, 0x48, 0xac, 0x21, 0xc8, 0xf7, + 0x81, 0xfe, 0x04, 0x48, 0xcc, 0x49, 0x40, 0x78, 0xa1, 0xf8, 0xca, 0x02, + 0xbd, 0xe8, 0x80, 0x40, 0x00, 0xf0, 0x0e, 0xba, 0x8c, 0x32, 0x06, 0x00, + 0xf0, 0xb5, 0x8a, 0x48, 0x90, 0xf8, 0x29, 0x13, 0x02, 0x29, 0x24, 0xd1, + 0x1e, 0x49, 0x1f, 0x4a, 0x1f, 0x4c, 0x00, 0x23, 0x02, 0x25, 0x0a, 0x31, + 0x0a, 0x32, 0x11, 0xf9, 0x0a, 0x6c, 0x12, 0xf9, 0x0a, 0x7c, 0x01, 0x33, + 0x05, 0x2b, 0xa6, 0x5d, 0xc6, 0xeb, 0x47, 0x06, 0x92, 0xf9, 0x00, 0x70, + 0x02, 0xf1, 0x01, 0x02, 0x96, 0xfb, 0xf5, 0xf6, 0x01, 0xf8, 0x0a, 0x6c, + 0x91, 0xf9, 0x00, 0x60, 0x26, 0x44, 0x96, 0xf8, 0x00, 0x61, 0xc6, 0xeb, + 0x47, 0x06, 0x96, 0xfb, 0xf5, 0xf6, 0x0e, 0x70, 0x01, 0xf1, 0x01, 0x01, + 0xe1, 0xd1, 0x0c, 0x49, 0x00, 0xf5, 0x58, 0x60, 0x00, 0x22, 0x0f, 0x31, + 0x11, 0xf8, 0x0f, 0x3c, 0x05, 0x78, 0x86, 0x7a, 0x11, 0xf8, 0x05, 0x4c, + 0x01, 0x32, 0x01, 0x30, 0x05, 0x2a, 0x2b, 0x44, 0x01, 0xf8, 0x0a, 0x3c, + 0x06, 0xeb, 0x04, 0x03, 0x0b, 0x70, 0x01, 0xf1, 0x01, 0x01, 0xed, 0xd1, + 0xf0, 0xbd, 0x00, 0xbf, 0x0d, 0x13, 0x01, 0x00, 0x21, 0x14, 0x01, 0x00, + 0x90, 0xcd, 0x01, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, 0x8f, 0xb0, 0x0d, 0x90, + 0xa0, 0x48, 0x89, 0x46, 0x0c, 0x92, 0xb0, 0xf8, 0xca, 0x12, 0xc1, 0xf3, + 0xc4, 0x01, 0x00, 0x29, 0x0b, 0x91, 0x00, 0xf0, 0xac, 0x80, 0x0d, 0x9d, + 0x18, 0x21, 0x01, 0xea, 0xc5, 0x02, 0xff, 0x21, 0x91, 0x40, 0x0a, 0x92, + 0x09, 0x91, 0xc9, 0x43, 0x08, 0x91, 0x05, 0xeb, 0x85, 0x01, 0x00, 0xeb, + 0x81, 0x00, 0x09, 0xeb, 0x89, 0x01, 0x00, 0xeb, 0x41, 0x00, 0x18, 0x44, + 0x00, 0xf5, 0xaa, 0x72, 0x00, 0xf1, 0x14, 0x04, 0x05, 0xf0, 0xfc, 0x00, + 0x07, 0x92, 0xaa, 0x4a, 0x02, 0x90, 0x00, 0x20, 0x01, 0x94, 0x02, 0xeb, + 0x81, 0x11, 0x01, 0xeb, 0x43, 0x11, 0x29, 0x44, 0x01, 0xf5, 0x3b, 0x72, + 0x06, 0x92, 0x01, 0xf1, 0x6c, 0x02, 0x05, 0x92, 0x01, 0xf5, 0x37, 0x72, + 0x5c, 0x31, 0x04, 0x92, 0x03, 0x91, 0x01, 0x21, 0xdd, 0xe9, 0x04, 0xba, + 0x00, 0x06, 0x78, 0xd1, 0x0e, 0x46, 0x94, 0xf9, 0x00, 0x10, 0xb9, 0x48, + 0x03, 0x9d, 0x0d, 0xf1, 0x38, 0x08, 0x42, 0x46, 0x8c, 0x00, 0x03, 0x68, + 0x28, 0x78, 0x21, 0x46, 0x98, 0x47, 0x29, 0x78, 0x9d, 0xf8, 0x38, 0x20, + 0x4f, 0x46, 0xdf, 0xf8, 0xd4, 0x90, 0x11, 0x44, 0x49, 0xf8, 0xa4, 0x0f, + 0x9a, 0xf8, 0x00, 0x00, 0x42, 0x46, 0x8b, 0xf8, 0x00, 0x10, 0xad, 0x49, + 0x0b, 0x68, 0x21, 0x46, 0x98, 0x47, 0xc9, 0xf8, 0x04, 0x00, 0x9a, 0xf8, + 0x00, 0x00, 0x9d, 0xf8, 0x38, 0x10, 0x0a, 0x9a, 0xb9, 0x46, 0x08, 0x44, + 0x06, 0x99, 0x08, 0x70, 0x9b, 0xf8, 0x00, 0x10, 0xc0, 0xb2, 0x00, 0xfa, + 0x02, 0xf0, 0x01, 0xfa, 0x02, 0xf1, 0x5f, 0xb1, 0x02, 0x9d, 0x25, 0x4f, + 0x09, 0x9b, 0xea, 0x59, 0x08, 0x9c, 0x19, 0x40, 0x18, 0x40, 0x22, 0x40, + 0x11, 0x43, 0x22, 0x4a, 0xe9, 0x51, 0x0c, 0xe0, 0x21, 0x4a, 0x02, 0x9d, + 0x09, 0x9b, 0x94, 0x46, 0xaa, 0x58, 0x08, 0x9c, 0x19, 0x40, 0x18, 0x40, + 0x22, 0x40, 0x11, 0x43, 0x1d, 0x4a, 0x45, 0xf8, 0x0c, 0x10, 0xa9, 0x58, + 0x21, 0x40, 0x08, 0x43, 0xa8, 0x50, 0x01, 0x9c, 0x07, 0x99, 0x0c, 0x9a, + 0x20, 0x78, 0x08, 0x70, 0x58, 0x48, 0x49, 0x46, 0x03, 0x68, 0x0d, 0x98, + 0x98, 0x47, 0x80, 0xb1, 0x15, 0x48, 0x49, 0x46, 0x02, 0x68, 0x01, 0x20, + 0x90, 0x47, 0x7d, 0x48, 0x01, 0x68, 0x48, 0x46, 0x88, 0x47, 0x13, 0x49, + 0x11, 0x48, 0x91, 0xf8, 0x0f, 0x13, 0x00, 0x68, 0x4a, 0x42, 0x90, 0x42, + 0x01, 0xda, 0x00, 0x20, 0x04, 0xe0, 0x88, 0x42, 0x4f, 0xf0, 0x00, 0x00, + 0xd8, 0xbf, 0x01, 0x20, 0x0b, 0x9b, 0xf2, 0xb2, 0x71, 0x1c, 0x93, 0x42, + 0x3f, 0xf6, 0x86, 0xaf, 0xff, 0xe7, 0x0f, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0xd8, 0x21, 0x06, 0x00, 0x04, 0x7a, 0x23, 0x40, 0x10, 0x7a, 0x23, 0x40, + 0x1c, 0x71, 0x23, 0x40, 0x2c, 0x71, 0x23, 0x40, 0xe8, 0xfb, 0x08, 0x00, + 0x84, 0x22, 0x06, 0x00, 0x00, 0x69, 0x08, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, + 0x36, 0x48, 0x00, 0x78, 0x00, 0x28, 0x66, 0xd0, 0xdf, 0xf8, 0xd4, 0x90, + 0x01, 0x20, 0x89, 0xf8, 0x00, 0x00, 0x34, 0x48, 0x01, 0x68, 0x01, 0x20, + 0x88, 0x47, 0x33, 0x48, 0x00, 0x68, 0x80, 0x47, 0x32, 0x48, 0x00, 0x24, + 0x00, 0xf2, 0xc6, 0x27, 0x99, 0xf8, 0x00, 0x00, 0x00, 0x28, 0x43, 0xd0, + 0x4a, 0x48, 0x90, 0xf8, 0x04, 0xa0, 0xba, 0xf1, 0x0b, 0x0f, 0x3a, 0xd8, + 0x47, 0x48, 0x20, 0x44, 0x00, 0xf1, 0x0d, 0x08, 0x78, 0x88, 0x20, 0xfa, + 0x0a, 0xf0, 0xc0, 0x07, 0x28, 0xd0, 0x4f, 0xf0, 0x00, 0x0b, 0x38, 0x78, + 0x20, 0xfa, 0x0b, 0xf0, 0xc0, 0x07, 0x18, 0xd0, 0x24, 0x48, 0x5f, 0xfa, + 0x8b, 0xf5, 0x5f, 0xfa, 0x8a, 0xf6, 0x21, 0x46, 0x2a, 0x46, 0x03, 0x68, + 0x30, 0x46, 0x98, 0x47, 0x89, 0xf8, 0x00, 0x00, 0x58, 0xb1, 0x4c, 0x48, + 0x21, 0x46, 0x02, 0x68, 0x30, 0x46, 0x90, 0x47, 0x98, 0xf8, 0x00, 0x30, + 0xe1, 0xb2, 0x30, 0x46, 0x2a, 0x46, 0xff, 0xf7, 0xe9, 0xfe, 0x0b, 0xf1, + 0x01, 0x0b, 0xbb, 0xf1, 0x03, 0x0f, 0x03, 0xd0, 0x99, 0xf8, 0x00, 0x00, + 0x00, 0x28, 0xd8, 0xd1, 0x0a, 0xf1, 0x01, 0x0a, 0xba, 0xf1, 0x0c, 0x0f, + 0x03, 0xd0, 0x99, 0xf8, 0x00, 0x00, 0x00, 0x28, 0xc8, 0xd1, 0x01, 0x34, + 0x02, 0x2c, 0xb7, 0xd1, 0x78, 0x88, 0x18, 0xb1, 0x38, 0x78, 0x08, 0xb1, + 0x01, 0x20, 0xb8, 0x71, 0x0b, 0x48, 0x00, 0x68, 0x80, 0x47, 0x06, 0x48, + 0x01, 0x68, 0x00, 0x20, 0xbd, 0xe8, 0xf8, 0x4f, 0x08, 0x47, 0xbd, 0xe8, + 0xf8, 0x8f, 0x00, 0xbf, 0xa8, 0x58, 0x01, 0x00, 0x88, 0x22, 0x06, 0x00, + 0xf4, 0xfb, 0x08, 0x00, 0xf0, 0xfb, 0x08, 0x00, 0x98, 0xca, 0x01, 0x00, + 0xfc, 0xfb, 0x08, 0x00, 0xe4, 0xfb, 0x08, 0x00, 0x2d, 0xe9, 0xf0, 0x41, + 0x07, 0x46, 0x0c, 0x46, 0x48, 0x42, 0x16, 0x49, 0x90, 0x46, 0x91, 0xf9, + 0x07, 0x20, 0xb0, 0xeb, 0x82, 0x0f, 0x02, 0xdd, 0x90, 0x00, 0x46, 0x42, + 0x08, 0xe0, 0x91, 0xf9, 0x08, 0x10, 0x26, 0x46, 0x00, 0x22, 0xb0, 0xeb, + 0x81, 0x0f, 0xb8, 0xbf, 0xa2, 0xeb, 0x81, 0x06, 0x0d, 0x4d, 0x30, 0x46, + 0x02, 0x21, 0x2a, 0x68, 0x90, 0x47, 0x38, 0x44, 0xb0, 0xf1, 0xff, 0x3f, + 0x03, 0xdd, 0x30, 0x28, 0x04, 0xdb, 0xbc, 0x20, 0x00, 0xe0, 0x00, 0x20, + 0xa0, 0xeb, 0x87, 0x06, 0x2a, 0x68, 0x30, 0x46, 0x02, 0x21, 0x90, 0x47, + 0xc8, 0xf8, 0x00, 0x00, 0xa0, 0x1b, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0xbf, + 0xf0, 0xd1, 0x01, 0x00, 0xd4, 0xfb, 0x08, 0x00, 0x0c, 0x48, 0x0d, 0x49, + 0x01, 0x60, 0x0d, 0x48, 0x0d, 0x49, 0x01, 0x60, 0x0d, 0x48, 0x0e, 0x49, + 0x01, 0x60, 0x0e, 0x48, 0x0e, 0x49, 0x01, 0x60, 0x0e, 0x48, 0x0f, 0x49, + 0x01, 0x60, 0x0f, 0x48, 0x0f, 0x49, 0x01, 0x60, 0x0f, 0x48, 0x10, 0x49, + 0x01, 0x60, 0x10, 0x48, 0x10, 0x49, 0x01, 0x60, 0x70, 0x47, 0x00, 0xbf, + 0x14, 0xfc, 0x08, 0x00, 0x15, 0xa4, 0x05, 0x00, 0x04, 0xfc, 0x08, 0x00, + 0x1d, 0xa3, 0x05, 0x00, 0x0c, 0xfc, 0x08, 0x00, 0xb1, 0xa5, 0x05, 0x00, + 0x08, 0xfc, 0x08, 0x00, 0x0d, 0xa6, 0x05, 0x00, 0xd0, 0xfd, 0x08, 0x00, + 0x3d, 0xa6, 0x05, 0x00, 0x24, 0xfc, 0x08, 0x00, 0x5d, 0xa6, 0x05, 0x00, + 0x98, 0xfd, 0x08, 0x00, 0x8d, 0xa8, 0x05, 0x00, 0xb0, 0xfb, 0x08, 0x00, + 0x89, 0xa9, 0x05, 0x00, 0x47, 0xf6, 0x55, 0x3c, 0xc1, 0xf2, 0x12, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x48, 0xf2, 0x07, 0x1c, 0xc1, 0xf2, 0x12, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x05, 0x48, 0x02, 0x22, 0x01, 0x68, 0x62, 0xf3, + 0x87, 0x11, 0x01, 0x60, 0x01, 0x68, 0x62, 0xf3, 0x09, 0x21, 0x01, 0x60, + 0x70, 0x47, 0x00, 0xbf, 0x38, 0xc0, 0x05, 0x30, 0x10, 0xb5, 0x9c, 0x49, + 0x60, 0x48, 0x91, 0xf8, 0xc7, 0x2f, 0x91, 0xf8, 0xd3, 0x3f, 0x04, 0x68, + 0x63, 0xf3, 0xcd, 0x14, 0x04, 0x60, 0x03, 0x68, 0x62, 0xf3, 0x06, 0x03, + 0x03, 0x60, 0xb1, 0xf8, 0xee, 0x1e, 0xd0, 0xf8, 0x00, 0x3a, 0x01, 0xf0, + 0x7f, 0x02, 0x23, 0xf4, 0x7e, 0x53, 0x09, 0x0a, 0x43, 0xea, 0xc2, 0x12, + 0xc0, 0xf8, 0x00, 0x2a, 0xd0, 0xf8, 0x00, 0x2a, 0x61, 0xf3, 0x06, 0x02, + 0xc0, 0xf8, 0x00, 0x2a, 0x10, 0xbd, 0x00, 0xbf, 0x70, 0xb5, 0x8a, 0x4a, + 0xbb, 0x4b, 0x15, 0x49, 0xb2, 0xf9, 0xf0, 0x2e, 0x58, 0x7b, 0x04, 0x31, + 0x02, 0xf0, 0x0f, 0x04, 0x84, 0x42, 0x09, 0xd2, 0xc2, 0xf3, 0x03, 0x15, + 0x85, 0x42, 0x05, 0xd9, 0x0d, 0x68, 0x47, 0xf6, 0xff, 0x76, 0x35, 0x43, + 0x0d, 0x60, 0x02, 0xe0, 0x01, 0x25, 0x81, 0xf8, 0x2e, 0x50, 0x9b, 0x7b, + 0x9c, 0x42, 0x08, 0xd2, 0xc2, 0xf3, 0x03, 0x12, 0x9a, 0x42, 0x04, 0xd9, + 0x0a, 0x68, 0x07, 0x4c, 0x22, 0x43, 0x0a, 0x60, 0x02, 0xe0, 0x01, 0x22, + 0x81, 0xf8, 0x2e, 0x20, 0x81, 0xf8, 0x2d, 0x30, 0x03, 0x49, 0x81, 0xf8, + 0x28, 0x00, 0x70, 0xbd, 0x8c, 0x22, 0x06, 0x00, 0x00, 0x80, 0xff, 0x3f, + 0xb4, 0xd1, 0x01, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, 0x6f, 0x48, 0x4f, 0xf0, + 0x00, 0x09, 0xeb, 0x46, 0x00, 0x25, 0x00, 0xf6, 0xf8, 0x5a, 0x6c, 0x49, + 0x05, 0xeb, 0xc5, 0x00, 0x02, 0x2d, 0x01, 0xeb, 0xc0, 0x00, 0x8c, 0xbf, + 0x00, 0xf6, 0x64, 0x60, 0x00, 0xf6, 0x3c, 0x60, 0x04, 0x68, 0x4c, 0xb3, + 0x4f, 0xf0, 0x00, 0x08, 0xe0, 0x07, 0x1e, 0xd0, 0x26, 0x48, 0x59, 0x46, + 0x02, 0x68, 0x5f, 0xfa, 0x88, 0xf0, 0x90, 0x47, 0x24, 0x49, 0x08, 0xeb, + 0x08, 0x10, 0x00, 0x9a, 0x53, 0x46, 0x01, 0xeb, 0x80, 0x00, 0x00, 0x21, + 0x02, 0x2d, 0x87, 0xbf, 0x5e, 0x8d, 0x1f, 0x8d, 0x5e, 0x88, 0x1f, 0x88, + 0x01, 0x31, 0x04, 0x33, 0x6f, 0xf3, 0x1f, 0x37, 0x11, 0x29, 0x66, 0xf3, + 0x17, 0x37, 0x80, 0xc2, 0x80, 0xc0, 0xef, 0xd1, 0x00, 0x92, 0x60, 0x08, + 0xb9, 0xeb, 0x54, 0x0f, 0x08, 0xf1, 0x01, 0x08, 0x04, 0x46, 0xd7, 0xd1, + 0x01, 0x35, 0x0a, 0xf1, 0x48, 0x0a, 0x05, 0x2d, 0xc3, 0xd1, 0x4e, 0x4c, + 0x12, 0x48, 0x94, 0xf8, 0xc7, 0x1f, 0x94, 0xf8, 0xd3, 0x2f, 0x03, 0x68, + 0x62, 0xf3, 0xcd, 0x13, 0x03, 0x60, 0x02, 0x68, 0x61, 0xf3, 0x06, 0x02, + 0x02, 0x60, 0xb4, 0xf8, 0xee, 0x1e, 0xd0, 0xf8, 0x00, 0x3a, 0x01, 0xf0, + 0x7f, 0x02, 0x23, 0xf4, 0x7e, 0x53, 0x09, 0x0a, 0x43, 0xea, 0xc2, 0x12, + 0xc0, 0xf8, 0x00, 0x2a, 0xd0, 0xf8, 0x00, 0x2a, 0x61, 0xf3, 0x06, 0x02, + 0xc0, 0xf8, 0x00, 0x2a, 0xbd, 0xe8, 0xf8, 0x8f, 0xc4, 0xfc, 0x08, 0x00, + 0xc4, 0x22, 0x06, 0x00, 0x00, 0x72, 0x23, 0x40, 0x2d, 0xe9, 0xf8, 0x4f, + 0xdf, 0xf8, 0xe0, 0xa0, 0x04, 0x46, 0x00, 0x20, 0x0e, 0x2c, 0x88, 0xbf, + 0x01, 0x20, 0x0a, 0xf5, 0xe4, 0x75, 0x0e, 0x2c, 0x15, 0xf8, 0x02, 0x8f, + 0x28, 0x70, 0x09, 0xd9, 0x28, 0x70, 0x20, 0x46, 0x00, 0xf0, 0xd6, 0xfc, + 0x32, 0x48, 0x00, 0x68, 0x00, 0xf0, 0x0f, 0x00, 0x0f, 0x30, 0x3a, 0xe0, + 0x9a, 0xf8, 0xf2, 0x2e, 0x7a, 0xb3, 0x03, 0x23, 0x05, 0x26, 0x3f, 0x27, + 0xb4, 0xfb, 0xf3, 0xf3, 0xb3, 0xfb, 0xf6, 0xf6, 0x06, 0xeb, 0x86, 0x06, + 0x9b, 0x1b, 0x18, 0x26, 0x07, 0x33, 0x06, 0xea, 0xc3, 0x0e, 0x9a, 0xf8, + 0xda, 0x6f, 0x03, 0xf0, 0x0c, 0x03, 0x07, 0xfa, 0x0e, 0xf7, 0x02, 0xfa, + 0x0e, 0xf2, 0xa6, 0xf1, 0x04, 0x0c, 0x20, 0x4e, 0xbc, 0xf1, 0x0c, 0x0f, + 0x3c, 0xbf, 0x47, 0xf2, 0x1c, 0x16, 0xc4, 0xf2, 0x23, 0x06, 0x56, 0xf8, + 0x03, 0xb0, 0x06, 0xeb, 0x03, 0x09, 0x2b, 0xea, 0x07, 0x0c, 0x07, 0xea, + 0x0b, 0x07, 0x97, 0x42, 0x84, 0xbf, 0xba, 0x1a, 0x4c, 0xea, 0x02, 0x0c, + 0xc9, 0xf8, 0x00, 0xc0, 0xff, 0xe7, 0x28, 0x70, 0x20, 0x46, 0x00, 0xf0, + 0x99, 0xfc, 0x13, 0x48, 0x00, 0x68, 0x00, 0xf0, 0x0f, 0x00, 0xe9, 0x49, + 0xa0, 0x42, 0x01, 0xeb, 0x04, 0x02, 0x13, 0x7b, 0x03, 0xf1, 0x01, 0x03, + 0x13, 0x73, 0x0a, 0xd1, 0x0e, 0x2c, 0x04, 0xd8, 0x9a, 0xf8, 0xf2, 0x0e, + 0x08, 0xb1, 0xc9, 0xf8, 0x00, 0xb0, 0x85, 0xf8, 0x00, 0x80, 0xbd, 0xe8, + 0xf8, 0x8f, 0xc2, 0x4a, 0x01, 0x20, 0xa0, 0x40, 0x53, 0x68, 0x18, 0x43, + 0x50, 0x60, 0xc8, 0x8d, 0x01, 0x30, 0xc8, 0x85, 0xbd, 0xe8, 0xf8, 0x8f, + 0x00, 0x69, 0x08, 0x00, 0x2c, 0x71, 0x23, 0x40, 0x04, 0x72, 0x03, 0x40, + 0x04, 0x7c, 0x03, 0x40, 0xf0, 0xb5, 0xb8, 0x48, 0x01, 0x68, 0x00, 0x29, + 0x54, 0xd0, 0x8a, 0x49, 0x91, 0xf8, 0xf6, 0x2e, 0x92, 0x07, 0x4f, 0xd5, + 0x01, 0xf5, 0x6f, 0x63, 0x27, 0x49, 0x04, 0x7e, 0x01, 0xf1, 0x0d, 0x02, + 0xcd, 0x49, 0x91, 0xf8, 0x32, 0x50, 0x3d, 0xb3, 0x3c, 0xbb, 0xb3, 0xf9, + 0x00, 0x50, 0x14, 0x78, 0xc5, 0xf3, 0x03, 0x26, 0xa6, 0x42, 0x03, 0xd8, + 0xc5, 0xf3, 0x03, 0x37, 0xa7, 0x42, 0x06, 0xd2, 0x57, 0x78, 0xbe, 0x42, + 0x26, 0xd8, 0xc5, 0xf3, 0x03, 0x35, 0xbd, 0x42, 0x22, 0xd3, 0x00, 0x25, + 0xd3, 0xf8, 0xe4, 0x30, 0x81, 0xf8, 0x32, 0x50, 0xd1, 0xe9, 0x00, 0x56, + 0x65, 0xea, 0x03, 0x03, 0x33, 0x43, 0x43, 0x60, 0x01, 0x33, 0x25, 0xd0, + 0x01, 0x23, 0x80, 0xf8, 0x28, 0x40, 0x03, 0x76, 0x50, 0x78, 0x81, 0xf8, + 0x31, 0x00, 0xf0, 0xbd, 0x64, 0xb1, 0xb3, 0xf9, 0x00, 0x30, 0x14, 0x78, + 0x03, 0xf0, 0x0f, 0x05, 0xa5, 0x42, 0x10, 0xd2, 0xc3, 0xf3, 0x03, 0x15, + 0xa5, 0x42, 0x0c, 0xd9, 0x9b, 0xb2, 0x00, 0xe0, 0x1b, 0x88, 0x1b, 0xb2, + 0x52, 0x78, 0x03, 0xf0, 0x0f, 0x04, 0x94, 0x42, 0x03, 0xd2, 0xc3, 0xf3, + 0x03, 0x13, 0x93, 0x42, 0x04, 0xd8, 0x01, 0x22, 0x81, 0xf8, 0x32, 0x20, + 0x00, 0x21, 0x01, 0x76, 0xf0, 0xbd, 0x00, 0xbf, 0xf0, 0xd1, 0x01, 0x00, + 0x70, 0xb5, 0x89, 0x48, 0xa5, 0x4c, 0x00, 0x68, 0x20, 0xb9, 0x5b, 0x48, + 0x90, 0xf8, 0xd1, 0x0f, 0x84, 0xf8, 0x33, 0x00, 0x00, 0xf0, 0x0a, 0xfc, + 0x57, 0x48, 0x13, 0x49, 0x07, 0x23, 0x90, 0xf8, 0xd2, 0x0f, 0x0a, 0x68, + 0x60, 0xf3, 0x04, 0x02, 0x10, 0x48, 0x0a, 0x60, 0x07, 0x21, 0x0f, 0x22, + 0x5c, 0x30, 0x05, 0x68, 0x06, 0x6b, 0x35, 0x43, 0x2d, 0xb2, 0x00, 0x2d, + 0x09, 0xd4, 0xa2, 0xf1, 0x0f, 0x06, 0x01, 0xfa, 0x02, 0xf5, 0x01, 0xfa, + 0x06, 0xf6, 0x35, 0x43, 0x26, 0x68, 0x35, 0x43, 0x25, 0x60, 0x01, 0x33, + 0x04, 0x30, 0x03, 0x32, 0x0c, 0x2b, 0xea, 0xd1, 0x20, 0x68, 0x40, 0xf0, + 0x40, 0x40, 0x20, 0x60, 0x70, 0xbd, 0x00, 0xbf, 0x00, 0x0e, 0x23, 0x40, + 0x8c, 0x7e, 0x08, 0x00, 0xfe, 0xb5, 0x6d, 0x4d, 0x3e, 0x4f, 0x00, 0x20, + 0xcd, 0xe9, 0x01, 0x00, 0x29, 0x68, 0x38, 0x78, 0x91, 0xf8, 0xcc, 0x60, + 0xff, 0x28, 0x01, 0xd0, 0x09, 0x28, 0x04, 0xd1, 0x00, 0x20, 0x00, 0x21, + 0x00, 0x22, 0x00, 0xf0, 0x79, 0xf8, 0x00, 0xf0, 0xcd, 0xf8, 0x20, 0xb3, + 0x35, 0x48, 0x01, 0xa9, 0x02, 0x68, 0x02, 0xa8, 0x90, 0x47, 0x38, 0x78, + 0xff, 0x28, 0x01, 0xd0, 0x09, 0x28, 0x04, 0xd1, 0xdd, 0xe9, 0x01, 0x21, + 0x01, 0x20, 0x00, 0xf0, 0x67, 0xf8, 0x2f, 0x48, 0x00, 0xf6, 0xf8, 0x54, + 0x14, 0xf8, 0xfe, 0x0f, 0x00, 0x07, 0x11, 0xd5, 0x28, 0x6a, 0x08, 0xb9, + 0x69, 0x6a, 0x69, 0xb1, 0x02, 0x99, 0x81, 0x42, 0x0a, 0xd9, 0x68, 0x6a, + 0x01, 0x99, 0x81, 0x42, 0x06, 0xd9, 0x6f, 0x48, 0x81, 0x8d, 0x01, 0x31, + 0x81, 0x85, 0x01, 0x20, 0x00, 0x24, 0x22, 0xe0, 0xdd, 0xe9, 0x01, 0x01, + 0xd4, 0xf8, 0xd2, 0x20, 0x91, 0x42, 0xc5, 0xe9, 0x08, 0x10, 0x05, 0xd2, + 0xd4, 0xf8, 0xd6, 0x10, 0x88, 0x42, 0x01, 0xd2, 0x01, 0x24, 0x09, 0xe0, + 0x1c, 0x48, 0x00, 0x68, 0x80, 0x47, 0x94, 0xf8, 0xda, 0x00, 0x10, 0xb1, + 0x1a, 0x48, 0x00, 0x68, 0x80, 0x47, 0x00, 0x24, 0x38, 0x78, 0xff, 0x28, + 0x01, 0xd0, 0x09, 0x28, 0x04, 0xd1, 0x02, 0x20, 0x21, 0x46, 0x22, 0x46, + 0x00, 0xf0, 0x2c, 0xf8, 0x20, 0x46, 0x14, 0x49, 0x72, 0xb6, 0x0a, 0x68, + 0x4f, 0xea, 0x42, 0x02, 0x02, 0xf1, 0x01, 0x02, 0x0a, 0x60, 0x44, 0xb1, + 0x01, 0x22, 0x6b, 0x68, 0xb2, 0x40, 0x1a, 0x43, 0x6a, 0x60, 0x01, 0x32, + 0x04, 0xbf, 0x00, 0x22, 0x2a, 0x76, 0x02, 0x22, 0x00, 0x28, 0x08, 0xbf, + 0x04, 0x22, 0x2a, 0x72, 0x08, 0x68, 0x40, 0x08, 0x08, 0x60, 0x08, 0x68, + 0x80, 0xf3, 0x10, 0x88, 0xfe, 0xbd, 0x00, 0xbf, 0x64, 0x8d, 0x08, 0x00, + 0x54, 0xfc, 0x08, 0x00, 0x00, 0x69, 0x08, 0x00, 0x58, 0xfc, 0x08, 0x00, + 0x5c, 0xfc, 0x08, 0x00, 0x24, 0x36, 0x01, 0x00, 0x2d, 0xe9, 0xf8, 0x43, + 0x07, 0x46, 0xeb, 0x48, 0x0e, 0x46, 0x90, 0x46, 0x01, 0x68, 0x4f, 0xf4, + 0x9c, 0x70, 0x88, 0x47, 0x18, 0xb3, 0x04, 0x46, 0x38, 0x20, 0xdf, 0xf8, + 0x84, 0x90, 0x21, 0x4d, 0x2c, 0x21, 0x2c, 0x23, 0xe0, 0x70, 0xd0, 0x20, + 0x27, 0x70, 0xa0, 0x70, 0x2c, 0x20, 0x4a, 0x46, 0x60, 0x70, 0x20, 0x1d, + 0xa8, 0x47, 0xd9, 0xf8, 0x00, 0x20, 0x04, 0xf1, 0x30, 0x00, 0xd0, 0x21, + 0xd0, 0x23, 0xa8, 0x47, 0x33, 0x4a, 0x04, 0xf5, 0x80, 0x70, 0x38, 0x21, + 0x38, 0x23, 0xa8, 0x47, 0x02, 0x2f, 0x06, 0xd0, 0x01, 0x2f, 0x08, 0xbf, + 0xc4, 0xe9, 0x09, 0x68, 0x13, 0xe0, 0xbd, 0xe8, 0xf8, 0x83, 0x04, 0x20, + 0x01, 0x2e, 0x08, 0xbf, 0x02, 0x20, 0xb8, 0xf1, 0x01, 0x0f, 0x20, 0x73, + 0x09, 0xd1, 0xd9, 0xf8, 0x00, 0x00, 0x01, 0x21, 0x90, 0xf8, 0xcc, 0x00, + 0x01, 0xfa, 0x00, 0xf0, 0xa1, 0x68, 0x08, 0x43, 0xa0, 0x60, 0x08, 0x48, + 0x21, 0x46, 0x4f, 0xf4, 0x9c, 0x72, 0x03, 0x68, 0x09, 0x20, 0x98, 0x47, + 0x20, 0x46, 0xbd, 0xe8, 0xf8, 0x43, 0xcb, 0xf7, 0x7d, 0xbe, 0x00, 0xbf, + 0xb4, 0xd1, 0x01, 0x00, 0x4d, 0xcd, 0x11, 0x10, 0xe4, 0x9b, 0x08, 0x00, + 0xf0, 0xb5, 0xdf, 0xf8, 0x60, 0xe0, 0xdf, 0xf8, 0x60, 0xc0, 0xff, 0x21, + 0x00, 0x23, 0x00, 0x26, 0x00, 0x27, 0xde, 0xf8, 0x00, 0x40, 0x8e, 0xf8, + 0x16, 0x10, 0x8c, 0xf8, 0x30, 0x30, 0x04, 0xf1, 0x08, 0x05, 0x2a, 0x68, + 0x8a, 0xb1, 0x06, 0xeb, 0x46, 0x02, 0xff, 0x29, 0x04, 0xbf, 0x8e, 0xf8, + 0x16, 0x30, 0x19, 0x46, 0x8e, 0xf8, 0x17, 0x30, 0x04, 0xeb, 0x82, 0x02, + 0x28, 0x68, 0x92, 0x68, 0x90, 0x42, 0x84, 0xbf, 0x8c, 0xf8, 0x30, 0x30, + 0x1e, 0x46, 0x01, 0x37, 0x0c, 0x35, 0x01, 0x33, 0x11, 0x2f, 0xe6, 0xd1, + 0xef, 0x48, 0x80, 0xf8, 0xf3, 0x6e, 0xb1, 0xf1, 0xff, 0x00, 0x18, 0xbf, + 0x01, 0x20, 0xf0, 0xbd, 0xb4, 0xd1, 0x01, 0x00, 0x8c, 0x22, 0x06, 0x00, + 0x70, 0x47, 0x00, 0xf0, 0xc9, 0xba, 0x00, 0xbf, 0x88, 0x48, 0x00, 0x7e, + 0x00, 0x28, 0x18, 0xbf, 0x01, 0x20, 0x70, 0x47, 0xf8, 0xb5, 0xe4, 0x49, + 0x00, 0x20, 0x00, 0x90, 0x91, 0xf8, 0xf6, 0x0e, 0xc2, 0x07, 0x1d, 0xd0, + 0xd1, 0xf8, 0x34, 0x12, 0x00, 0x29, 0x01, 0xd4, 0x80, 0x07, 0x17, 0xd5, + 0x0c, 0x4e, 0x0d, 0x4f, 0x00, 0x25, 0x6c, 0x46, 0xc5, 0xeb, 0x05, 0x10, + 0x32, 0x68, 0x21, 0x46, 0xc0, 0xb2, 0x90, 0x47, 0x68, 0x42, 0x00, 0x9a, + 0x00, 0x21, 0xc0, 0xb2, 0x07, 0xeb, 0x80, 0x00, 0x08, 0xc8, 0x01, 0x31, + 0xff, 0x29, 0x08, 0xc2, 0xfa, 0xd1, 0x01, 0x35, 0x02, 0x2d, 0xeb, 0xd1, + 0xf8, 0xbd, 0x00, 0xbf, 0xc4, 0xfc, 0x08, 0x00, 0xc4, 0x22, 0x06, 0x00, + 0x2d, 0xe9, 0xf8, 0x4f, 0xcb, 0x4e, 0xdf, 0xf8, 0xb8, 0x91, 0x30, 0x68, + 0x20, 0xf0, 0xc0, 0x00, 0x30, 0x60, 0x30, 0x68, 0x20, 0xf4, 0x40, 0x70, + 0x30, 0x60, 0xd9, 0xf8, 0x00, 0x00, 0x00, 0x28, 0x00, 0xf0, 0x91, 0x80, + 0x67, 0x4c, 0xdf, 0xf8, 0xa0, 0xb1, 0x20, 0x78, 0x60, 0xbb, 0x00, 0xf0, + 0xd1, 0xf8, 0xd9, 0xf8, 0x1c, 0x00, 0x20, 0xb3, 0x7d, 0x48, 0x01, 0x68, + 0xf0, 0x20, 0x88, 0x47, 0xcb, 0xf8, 0x08, 0x00, 0x98, 0xb1, 0x01, 0x25, + 0xf0, 0x21, 0x25, 0x70, 0xc8, 0xf7, 0xbc, 0xfd, 0x00, 0x20, 0x24, 0x21, + 0x89, 0xf8, 0x18, 0x50, 0x8b, 0xf8, 0x36, 0x00, 0xdb, 0xf8, 0x00, 0x00, + 0xc9, 0xf8, 0x04, 0x00, 0x0b, 0xf1, 0x0c, 0x00, 0xc8, 0xf7, 0xfa, 0xf8, + 0x09, 0xe0, 0x01, 0x20, 0x8b, 0xf8, 0x35, 0x00, 0xd9, 0xf8, 0x1c, 0x00, + 0xcb, 0xf7, 0xcc, 0xfd, 0x00, 0x20, 0xc9, 0xf8, 0x1c, 0x00, 0x20, 0x78, + 0x01, 0x28, 0x5e, 0xd1, 0x9b, 0xf8, 0x36, 0x60, 0xab, 0x4d, 0xf0, 0xb2, + 0x3b, 0x28, 0x59, 0xd8, 0x4f, 0xf0, 0x00, 0x0a, 0x55, 0xfa, 0x86, 0xf0, + 0x90, 0xf8, 0x88, 0x4f, 0xff, 0x2c, 0x3b, 0xd0, 0x9b, 0xf8, 0x34, 0x00, + 0xbb, 0xf8, 0x2a, 0x10, 0x81, 0x42, 0x3c, 0xd2, 0xf7, 0xb2, 0x0f, 0x2c, + 0x03, 0xd3, 0x95, 0xf8, 0xce, 0x01, 0x08, 0x28, 0x26, 0xd0, 0xd9, 0xf8, + 0x04, 0x00, 0xe0, 0x40, 0xc0, 0x07, 0x21, 0xd1, 0xdb, 0xf8, 0x08, 0x00, + 0x04, 0xf1, 0x1e, 0x08, 0x4f, 0xf0, 0x01, 0x0a, 0x50, 0xf8, 0x24, 0x10, + 0xc9, 0xf8, 0x20, 0x10, 0x01, 0x21, 0x50, 0xf8, 0x28, 0x00, 0xc9, 0xf8, + 0x24, 0x00, 0x39, 0x48, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0xd9, 0xf8, + 0x20, 0x00, 0xdb, 0xf8, 0x08, 0x10, 0x41, 0xf8, 0x24, 0x00, 0xd9, 0xf8, + 0x24, 0x00, 0x41, 0xf8, 0x28, 0x00, 0xbb, 0xf8, 0x2a, 0x00, 0x01, 0x30, + 0xab, 0xf8, 0x2a, 0x00, 0x78, 0x19, 0x90, 0xf8, 0x89, 0x0f, 0x30, 0x44, + 0x86, 0x1c, 0xf0, 0xb2, 0x3c, 0x28, 0xbd, 0xd3, 0x00, 0x26, 0xba, 0xf1, + 0x00, 0x0f, 0x8b, 0xf8, 0x36, 0x60, 0x02, 0xd1, 0x11, 0xe0, 0x8b, 0xf8, + 0x36, 0x60, 0xba, 0xf1, 0x01, 0x0f, 0xac, 0xd0, 0x9b, 0xf8, 0x35, 0x00, + 0x7e, 0x4e, 0x01, 0x28, 0x0a, 0xd0, 0x9b, 0xf8, 0x33, 0x00, 0x90, 0xbb, + 0x06, 0xe0, 0x30, 0xe0, 0x00, 0x20, 0x8b, 0xf8, 0x36, 0x00, 0x01, 0x20, + 0x8b, 0xf8, 0x35, 0x00, 0x1e, 0x4c, 0x00, 0x20, 0x00, 0x26, 0x2f, 0x18, + 0x97, 0xf8, 0x88, 0x0f, 0xff, 0x28, 0x12, 0xd0, 0xdb, 0xf8, 0x00, 0x10, + 0x21, 0xfa, 0x00, 0xf0, 0xc0, 0x07, 0x05, 0xd1, 0x97, 0xf8, 0x89, 0x0f, + 0x10, 0xb1, 0x21, 0x68, 0xf0, 0xb2, 0x88, 0x47, 0x97, 0xf8, 0x89, 0x0f, + 0x30, 0x44, 0x86, 0x1c, 0xf0, 0xb2, 0x3b, 0x28, 0xe7, 0xd3, 0xdb, 0xf8, + 0x08, 0x00, 0xcb, 0xf7, 0x41, 0xfd, 0xd9, 0xf8, 0x1c, 0x00, 0x00, 0x24, + 0xcb, 0xf8, 0x08, 0x40, 0xcb, 0xf7, 0x3a, 0xfd, 0x64, 0x4e, 0x89, 0xf8, + 0x18, 0x40, 0xc9, 0xf8, 0x1c, 0x40, 0x30, 0x68, 0x02, 0x21, 0x61, 0xf3, + 0x87, 0x10, 0x30, 0x60, 0x30, 0x68, 0x61, 0xf3, 0x09, 0x20, 0x30, 0x60, + 0xbd, 0xe8, 0xf8, 0x8f, 0xb4, 0xd1, 0x01, 0x00, 0xbc, 0x2a, 0x06, 0x00, + 0x8c, 0x22, 0x06, 0x00, 0x48, 0xfc, 0x08, 0x00, 0x4c, 0xfc, 0x08, 0x00, + 0xbc, 0xb5, 0x16, 0x48, 0x01, 0x68, 0x40, 0xf2, 0xfd, 0x30, 0x88, 0x47, + 0x03, 0x46, 0x55, 0x48, 0xc3, 0x61, 0x55, 0x48, 0x90, 0xf8, 0xdb, 0x1f, + 0xb0, 0xf8, 0xd8, 0x0f, 0x71, 0xb1, 0x00, 0x22, 0xb2, 0xeb, 0x90, 0x0f, + 0x09, 0xd0, 0x0e, 0x4c, 0x80, 0x08, 0x01, 0x39, 0x00, 0x22, 0x54, 0xf8, + 0x21, 0x50, 0x01, 0x32, 0x82, 0x42, 0x20, 0xc3, 0xf9, 0xd1, 0xbc, 0xbd, + 0x40, 0xf2, 0xff, 0x11, 0x20, 0xf0, 0x03, 0x00, 0x04, 0x22, 0xad, 0xf8, + 0x06, 0x10, 0x06, 0x49, 0x00, 0x90, 0x0d, 0xf1, 0x06, 0x00, 0x0c, 0x68, + 0x08, 0x21, 0xa0, 0x47, 0xbc, 0xbd, 0x00, 0xbf, 0xd4, 0x9b, 0x08, 0x00, + 0xa0, 0x9f, 0x12, 0x10, 0x34, 0xea, 0x08, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, + 0x3c, 0x4c, 0xdf, 0xf8, 0xf4, 0xa0, 0x20, 0x68, 0x20, 0xf0, 0xc0, 0x00, + 0x20, 0x60, 0x20, 0x68, 0x20, 0xf4, 0x40, 0x70, 0x20, 0x60, 0xda, 0xf8, + 0x00, 0x00, 0x00, 0x28, 0x54, 0xd0, 0xff, 0xf7, 0xb9, 0xff, 0xda, 0xf8, + 0x1c, 0x00, 0x00, 0x28, 0x4e, 0xd0, 0x35, 0x48, 0xdf, 0xf8, 0xcc, 0x90, + 0xa3, 0x46, 0xdf, 0xf8, 0xd0, 0x80, 0x01, 0x78, 0x99, 0xf8, 0xce, 0x41, + 0x01, 0x29, 0x04, 0xd1, 0xda, 0xf8, 0x00, 0x00, 0x90, 0xf8, 0xcc, 0x70, + 0x0d, 0xe0, 0x01, 0x21, 0x00, 0x27, 0x01, 0x70, 0xda, 0xf8, 0x00, 0x00, + 0x24, 0x21, 0x80, 0xf8, 0xcc, 0x70, 0x08, 0xf1, 0x0c, 0x00, 0xc7, 0xf7, + 0xdf, 0xff, 0xca, 0xe9, 0x08, 0x77, 0x1e, 0x26, 0x08, 0x2c, 0x08, 0xbf, + 0x0f, 0x26, 0xbe, 0x42, 0x1b, 0xd9, 0xd8, 0xf8, 0x00, 0xc0, 0x99, 0xf8, + 0xf7, 0xee, 0xda, 0xf8, 0x04, 0x30, 0x01, 0x20, 0x00, 0x24, 0x3a, 0x46, + 0x00, 0xfa, 0x07, 0xf1, 0x0b, 0x42, 0x08, 0xd1, 0x08, 0xeb, 0x07, 0x05, + 0x2d, 0x7b, 0x75, 0x45, 0x03, 0xd2, 0x1c, 0xea, 0x01, 0x0f, 0x02, 0xd1, + 0x1f, 0xe0, 0xca, 0xe9, 0x08, 0x44, 0x01, 0x32, 0xd7, 0xb2, 0xbe, 0x42, + 0xec, 0xd8, 0xbe, 0x42, 0x02, 0xbf, 0x00, 0x20, 0x88, 0xf8, 0x32, 0x00, + 0x8a, 0xf8, 0x18, 0x00, 0xda, 0xf8, 0x1c, 0x00, 0xcb, 0xf7, 0x8a, 0xfc, + 0x00, 0x20, 0x5c, 0x46, 0xca, 0xf8, 0x1c, 0x00, 0x20, 0x68, 0x02, 0x21, + 0x61, 0xf3, 0x87, 0x10, 0x20, 0x60, 0x20, 0x68, 0x61, 0xf3, 0x09, 0x20, + 0x20, 0x60, 0xbd, 0xe8, 0xf8, 0x8f, 0x73, 0x48, 0x01, 0x21, 0x03, 0x68, + 0xd0, 0xb2, 0x98, 0x47, 0xb8, 0xf8, 0x2a, 0x00, 0x01, 0x30, 0xa8, 0xf8, + 0x2a, 0x00, 0xda, 0xe7, 0x38, 0xc0, 0x05, 0x30, 0xb4, 0xd1, 0x01, 0x00, + 0x00, 0x69, 0x08, 0x00, 0xbd, 0x2a, 0x06, 0x00, 0x8c, 0x22, 0x06, 0x00, + 0xb0, 0xb5, 0x02, 0x28, 0x14, 0xd0, 0x01, 0x28, 0x24, 0xd0, 0xa8, 0xbb, + 0x47, 0x48, 0x00, 0xf6, 0xe2, 0x64, 0x99, 0xb3, 0xb4, 0xf9, 0x06, 0x00, + 0xc0, 0xeb, 0x10, 0x20, 0x01, 0x30, 0xc5, 0xb2, 0xed, 0xf7, 0xee, 0xfc, + 0x90, 0xfb, 0xf5, 0xf1, 0x01, 0xfb, 0x15, 0x00, 0xe1, 0x88, 0x4e, 0xe0, + 0x3e, 0x48, 0x00, 0xf6, 0xe2, 0x64, 0x79, 0xb3, 0xb4, 0xf9, 0x0a, 0x00, + 0xc0, 0xeb, 0x10, 0x20, 0x01, 0x30, 0xc5, 0xb2, 0xed, 0xf7, 0xdc, 0xfc, + 0x90, 0xfb, 0xf5, 0xf1, 0x01, 0xfb, 0x15, 0x00, 0x61, 0x89, 0x3c, 0xe0, + 0x35, 0x48, 0x00, 0xf6, 0xe2, 0x64, 0x59, 0xb3, 0xb4, 0xf9, 0x08, 0x00, + 0xc0, 0xeb, 0x10, 0x20, 0x01, 0x30, 0xc5, 0xb2, 0xed, 0xf7, 0xca, 0xfc, + 0x90, 0xfb, 0xf5, 0xf1, 0x01, 0xfb, 0x15, 0x00, 0x21, 0x89, 0x2a, 0xe0, + 0x02, 0x20, 0x29, 0xe0, 0xb4, 0xf9, 0x00, 0x00, 0xc0, 0xeb, 0x10, 0x20, + 0x01, 0x30, 0xc5, 0xb2, 0xed, 0xf7, 0xba, 0xfc, 0x90, 0xfb, 0xf5, 0xf1, + 0x01, 0xfb, 0x15, 0x00, 0x21, 0x88, 0x1a, 0xe0, 0xb4, 0xf9, 0x04, 0x00, + 0xc0, 0xeb, 0x10, 0x20, 0x01, 0x30, 0xc5, 0xb2, 0xed, 0xf7, 0xac, 0xfc, + 0x90, 0xfb, 0xf5, 0xf1, 0x01, 0xfb, 0x15, 0x00, 0xa1, 0x88, 0x0c, 0xe0, + 0xb4, 0xf9, 0x02, 0x00, 0xc0, 0xeb, 0x10, 0x20, 0x01, 0x30, 0xc5, 0xb2, + 0xed, 0xf7, 0x9e, 0xfc, 0x90, 0xfb, 0xf5, 0xf1, 0x01, 0xfb, 0x15, 0x00, + 0x61, 0x88, 0x08, 0x44, 0xc0, 0xb2, 0xb0, 0xbd, 0x10, 0xb5, 0x8a, 0xb0, + 0x00, 0xf0, 0x8a, 0xf8, 0x00, 0x20, 0x08, 0xac, 0xad, 0xf8, 0x24, 0x00, + 0x08, 0x90, 0x0d, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x0c, 0x48, + 0x01, 0xa9, 0x02, 0x68, 0x20, 0x46, 0x90, 0x47, 0x0a, 0x48, 0xdd, 0xe9, + 0x01, 0x12, 0x01, 0x60, 0x09, 0x48, 0x01, 0x21, 0x02, 0x60, 0x09, 0x48, + 0x00, 0x22, 0xb0, 0xf8, 0xd8, 0x0f, 0x20, 0xf0, 0x03, 0x00, 0x00, 0xf0, + 0x73, 0xf8, 0x0a, 0xb0, 0x10, 0xbd, 0x00, 0xbf, 0x04, 0xba, 0x08, 0x00, + 0x98, 0xda, 0x08, 0x00, 0x0c, 0x23, 0x21, 0x40, 0x10, 0x23, 0x21, 0x40, + 0x00, 0x69, 0x08, 0x00, 0x10, 0x48, 0x11, 0x49, 0x01, 0x60, 0x11, 0x48, + 0x11, 0x49, 0x01, 0x60, 0x11, 0x48, 0x12, 0x49, 0x01, 0x60, 0x12, 0x48, + 0x12, 0x49, 0x01, 0x60, 0x12, 0x48, 0x13, 0x49, 0x01, 0x60, 0x13, 0x48, + 0x13, 0x49, 0x01, 0x60, 0x13, 0x48, 0x14, 0x49, 0x01, 0x60, 0x14, 0x48, + 0x14, 0x49, 0x01, 0x60, 0x14, 0x48, 0x15, 0x49, 0x01, 0x60, 0x15, 0x48, + 0x15, 0x49, 0x01, 0x60, 0x15, 0x48, 0x16, 0x49, 0x01, 0x60, 0x70, 0x47, + 0x60, 0xcd, 0x08, 0x00, 0x05, 0xb5, 0x05, 0x00, 0xf4, 0xb9, 0x08, 0x00, + 0x31, 0xb4, 0x05, 0x00, 0x34, 0xfc, 0x08, 0x00, 0xe9, 0xb0, 0x05, 0x00, + 0x40, 0xfc, 0x08, 0x00, 0x25, 0xb3, 0x05, 0x00, 0xe0, 0xfb, 0x08, 0x00, + 0x7f, 0xb0, 0x05, 0x00, 0x2c, 0xbc, 0x08, 0x00, 0x4d, 0xab, 0x05, 0x00, + 0x48, 0xfc, 0x08, 0x00, 0x29, 0xac, 0x05, 0x00, 0x30, 0xbc, 0x08, 0x00, + 0xdd, 0xad, 0x05, 0x00, 0x80, 0xcd, 0x08, 0x00, 0x4d, 0xae, 0x05, 0x00, + 0xdc, 0xfb, 0x08, 0x00, 0x7d, 0xb0, 0x05, 0x00, 0x38, 0xfc, 0x08, 0x00, + 0x21, 0xad, 0x05, 0x00, 0x49, 0xf2, 0xcb, 0x7c, 0xc1, 0xf2, 0x12, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x49, 0xf2, 0xaf, 0x4c, 0xc1, 0xf2, 0x12, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x49, 0xf2, 0xd7, 0x5c, 0xc1, 0xf2, 0x12, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x49, 0xf6, 0x23, 0x5c, 0xc1, 0xf2, 0x12, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x49, 0xf2, 0x85, 0x3c, 0xc1, 0xf2, 0x0a, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x2d, 0xe9, 0xf0, 0x43, 0x27, 0x4c, 0xdd, 0xf8, + 0x1c, 0xc0, 0x4f, 0xf0, 0x0b, 0x0e, 0x04, 0xeb, 0xc1, 0x11, 0x01, 0xeb, + 0x42, 0x19, 0x00, 0x22, 0x0b, 0x21, 0xb9, 0xf8, 0x16, 0x60, 0xb0, 0x46, + 0xb4, 0xb2, 0x7f, 0x2c, 0x07, 0xd0, 0x35, 0xb2, 0x85, 0x42, 0x12, 0xdd, + 0xcf, 0xb2, 0x0c, 0x2f, 0x11, 0xd0, 0xb0, 0x46, 0x8e, 0x46, 0x01, 0x32, + 0x10, 0x2a, 0x29, 0xd0, 0x4c, 0x1e, 0x65, 0xb2, 0x00, 0x2d, 0x48, 0xbf, + 0x01, 0xf1, 0x0f, 0x04, 0x61, 0xb2, 0x39, 0xf8, 0x11, 0x60, 0x21, 0x46, + 0xe6, 0xe7, 0x01, 0x22, 0x00, 0xe0, 0x00, 0x22, 0x02, 0x2b, 0x0f, 0xd0, + 0x01, 0x2b, 0x1b, 0xd0, 0x1f, 0xfa, 0x88, 0xf3, 0x7f, 0x2b, 0x17, 0xd0, + 0x80, 0xb2, 0x84, 0x42, 0x14, 0xd0, 0xc8, 0xb2, 0x0c, 0x38, 0x18, 0xbf, + 0x01, 0x20, 0x10, 0x43, 0x0a, 0xd1, 0x0d, 0xe0, 0x1f, 0xfa, 0x88, 0xf2, + 0x7f, 0x2a, 0x09, 0xd0, 0x0f, 0xfa, 0x88, 0xf3, 0x2a, 0x1a, 0xc0, 0x1a, + 0x90, 0x42, 0x03, 0xda, 0xac, 0xf8, 0x00, 0x80, 0x71, 0x46, 0x01, 0xe0, + 0xac, 0xf8, 0x00, 0x60, 0xc8, 0xb2, 0xbd, 0xe8, 0xf0, 0x83, 0x00, 0xbf, + 0xb2, 0xd0, 0x01, 0x00, 0x7c, 0xb5, 0x0c, 0x46, 0x05, 0x46, 0x00, 0xf0, + 0x31, 0xfe, 0x94, 0xf8, 0x93, 0x00, 0x00, 0x28, 0x3e, 0xd0, 0x94, 0xf8, + 0x35, 0x01, 0x16, 0x28, 0x16, 0xd8, 0x39, 0x49, 0x00, 0xeb, 0x40, 0x02, + 0x51, 0xf8, 0x22, 0x20, 0x82, 0xb1, 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, + 0x80, 0x00, 0x00, 0x79, 0x05, 0x28, 0x01, 0xd0, 0x03, 0x28, 0x07, 0xd1, + 0x32, 0x48, 0x00, 0x68, 0x6f, 0xf3, 0x9f, 0x30, 0xa4, 0xf8, 0x98, 0x00, + 0x30, 0x48, 0x06, 0xe0, 0x9a, 0x48, 0x00, 0x68, 0x6f, 0xf3, 0x9f, 0x30, + 0xa4, 0xf8, 0x98, 0x00, 0x2d, 0x48, 0x00, 0x68, 0x6f, 0xf3, 0x9f, 0x30, + 0xa4, 0xf8, 0x9a, 0x00, 0x6f, 0x48, 0x40, 0x79, 0x01, 0x28, 0x13, 0xd1, + 0x29, 0x48, 0x01, 0xab, 0x00, 0x22, 0x50, 0xf8, 0x25, 0x00, 0x01, 0x68, + 0x8d, 0xf8, 0x04, 0x10, 0x00, 0x21, 0x00, 0x68, 0x00, 0x0a, 0x8d, 0xf8, + 0x05, 0x00, 0xed, 0x48, 0x06, 0x68, 0x02, 0x20, 0x00, 0x90, 0x40, 0xf2, + 0x3b, 0x70, 0xb0, 0x47, 0x1f, 0x4a, 0x94, 0xf8, 0x35, 0x01, 0x1f, 0x49, + 0x52, 0xf8, 0x25, 0x20, 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, 0x40, 0x10, + 0x13, 0x68, 0x83, 0x72, 0x61, 0x4b, 0x94, 0xf8, 0x35, 0x01, 0x12, 0x68, + 0x00, 0xeb, 0x40, 0x00, 0x12, 0x0a, 0x01, 0xeb, 0x40, 0x10, 0xc2, 0x72, + 0x5b, 0x4a, 0x94, 0xf8, 0x35, 0x01, 0x12, 0x78, 0x00, 0xeb, 0x40, 0x00, + 0xc2, 0xeb, 0x42, 0x12, 0x01, 0xeb, 0x40, 0x10, 0x03, 0xeb, 0xc2, 0x02, + 0xd2, 0xf8, 0xcc, 0x30, 0xd2, 0xf8, 0xd4, 0x50, 0x03, 0x72, 0x94, 0xf8, + 0x35, 0x01, 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, 0x40, 0x10, 0x45, 0x72, + 0x94, 0xf8, 0x35, 0x01, 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, 0x40, 0x10, + 0x92, 0xf8, 0xe8, 0x10, 0x01, 0x73, 0x7c, 0xbd, 0xe8, 0x72, 0x01, 0x00, + 0xd0, 0xc2, 0x23, 0x40, 0x10, 0xc3, 0x23, 0x40, 0xf0, 0xc2, 0x23, 0x40, + 0x7c, 0x8c, 0x12, 0x10, 0x54, 0xf1, 0x05, 0x00, 0xfe, 0xb5, 0x04, 0x46, + 0x3f, 0x48, 0x0d, 0x46, 0x11, 0x46, 0x1e, 0x46, 0x2a, 0x46, 0x07, 0x68, + 0xa0, 0x1c, 0x00, 0xf0, 0x83, 0xf8, 0xc8, 0xb1, 0x3b, 0x48, 0x27, 0x61, + 0x40, 0x79, 0x01, 0x28, 0x14, 0xd1, 0xcf, 0x48, 0x02, 0xab, 0x00, 0x22, + 0x50, 0xf8, 0x25, 0x00, 0x01, 0x68, 0x8d, 0xf8, 0x08, 0x10, 0x00, 0x21, + 0x00, 0x68, 0x00, 0x0a, 0x8d, 0xf8, 0x09, 0x00, 0xb8, 0x48, 0xd0, 0xf8, + 0x00, 0xc0, 0x02, 0x20, 0x00, 0x90, 0x40, 0xf2, 0x3b, 0x70, 0xe0, 0x47, + 0x2f, 0x48, 0x21, 0x69, 0x02, 0x68, 0x38, 0x46, 0x90, 0x47, 0xb1, 0x4a, + 0x02, 0xf6, 0xd4, 0x51, 0xd2, 0xf8, 0xec, 0x2d, 0x90, 0x42, 0x03, 0xd8, + 0x22, 0x69, 0x0a, 0xb1, 0x01, 0x22, 0x00, 0xe0, 0x00, 0x22, 0x62, 0x70, + 0x0a, 0x78, 0x32, 0xb1, 0xdc, 0x4a, 0x92, 0xf8, 0x20, 0x21, 0x00, 0x2a, + 0x18, 0xbf, 0x01, 0x22, 0x00, 0xe0, 0x00, 0x22, 0x36, 0xb9, 0x22, 0xb1, + 0x4a, 0x78, 0x00, 0x2a, 0x18, 0xbf, 0x01, 0x22, 0x00, 0xe0, 0x00, 0x22, + 0x4b, 0x69, 0x98, 0x42, 0x01, 0xd2, 0x20, 0x69, 0x20, 0xb9, 0x88, 0x7c, + 0x10, 0xb1, 0x0a, 0xb1, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x20, 0x75, + 0x18, 0x48, 0x01, 0x2d, 0x04, 0xbf, 0x41, 0xf2, 0x8c, 0x00, 0xc4, 0xf2, + 0x21, 0x00, 0x00, 0x68, 0x60, 0x76, 0xa8, 0x48, 0x50, 0xf8, 0x25, 0x00, + 0x01, 0x68, 0xe1, 0x75, 0x13, 0x49, 0x00, 0x68, 0x00, 0x0a, 0x20, 0x76, + 0x10, 0x48, 0x00, 0x78, 0xc0, 0xeb, 0x40, 0x10, 0x01, 0xeb, 0xc0, 0x00, + 0x90, 0xf8, 0xd8, 0x10, 0x11, 0xb1, 0xd0, 0xf8, 0xcc, 0x10, 0x00, 0xe0, + 0x7f, 0x21, 0x61, 0x75, 0x90, 0xf8, 0xd9, 0x10, 0x11, 0xb1, 0xd0, 0xf8, + 0xd4, 0x10, 0x00, 0xe0, 0x7f, 0x21, 0xa1, 0x75, 0x90, 0xf8, 0xe8, 0x00, + 0x60, 0x76, 0xfe, 0xbd, 0x24, 0x20, 0x00, 0x40, 0x48, 0xdc, 0x05, 0x00, + 0xd0, 0xf3, 0x08, 0x00, 0x9c, 0x21, 0x21, 0x40, 0x74, 0x87, 0x08, 0x00, + 0x0c, 0x6f, 0x01, 0x00, 0xf0, 0xb5, 0x91, 0x4b, 0x1c, 0x68, 0xb4, 0xf1, + 0xff, 0x3f, 0x13, 0xdc, 0x8d, 0x4c, 0x4f, 0xf0, 0x7f, 0x47, 0x54, 0xf8, + 0x22, 0x40, 0x25, 0x68, 0x26, 0x68, 0x24, 0x68, 0x07, 0xea, 0x06, 0x46, + 0xb6, 0xeb, 0x05, 0x6f, 0x76, 0x4d, 0xd8, 0xbf, 0x24, 0x0a, 0x64, 0xb2, + 0x95, 0xf9, 0xd8, 0x5d, 0xac, 0x42, 0x01, 0xda, 0x00, 0x20, 0xf0, 0xbd, + 0x11, 0x4c, 0x01, 0x29, 0x4f, 0xf0, 0x40, 0x07, 0x25, 0x46, 0x08, 0xbf, + 0x20, 0x35, 0x1e, 0x68, 0x1b, 0x68, 0x01, 0x29, 0x2d, 0x68, 0x08, 0xbf, + 0x60, 0x27, 0x39, 0x59, 0x6f, 0xf3, 0x9f, 0x35, 0x6f, 0xf3, 0x9f, 0x31, + 0x85, 0x80, 0xc1, 0x80, 0x46, 0xf3, 0x06, 0x61, 0x01, 0x70, 0x43, 0xf3, + 0x0a, 0x31, 0x41, 0x80, 0x05, 0x49, 0x51, 0xf8, 0x22, 0x10, 0x09, 0x68, + 0x01, 0xf0, 0x03, 0x01, 0x01, 0x72, 0x01, 0x20, 0xf0, 0xbd, 0x00, 0xbf, + 0xb0, 0xc2, 0x23, 0x40, 0x84, 0x8c, 0x12, 0x10, 0xf0, 0xb5, 0x87, 0xb0, + 0x0d, 0x46, 0x04, 0x46, 0x01, 0xa8, 0x16, 0x21, 0x16, 0x46, 0xc7, 0xf7, + 0xcd, 0xfc, 0x57, 0x48, 0x57, 0x49, 0x50, 0xf8, 0x26, 0x00, 0x51, 0xf8, + 0x26, 0x10, 0x00, 0x68, 0x0e, 0x68, 0x55, 0x49, 0x91, 0xf8, 0xf4, 0x1d, + 0x00, 0x29, 0x62, 0xd0, 0x71, 0xb2, 0xb1, 0xf1, 0xff, 0x3f, 0x01, 0xdd, + 0x02, 0x21, 0x0b, 0xe0, 0x01, 0x21, 0x8d, 0xf8, 0x0a, 0x10, 0x06, 0xf0, + 0x1f, 0x01, 0x8d, 0xf8, 0x06, 0x10, 0x00, 0xf0, 0x0f, 0x01, 0x8d, 0xf8, + 0x05, 0x10, 0x03, 0x21, 0x32, 0xb2, 0xb2, 0xf1, 0xff, 0x3f, 0x09, 0xdc, + 0x8d, 0xf8, 0x0a, 0x10, 0xc6, 0xf3, 0x04, 0x21, 0x8d, 0xf8, 0x08, 0x10, + 0xc0, 0xf3, 0x03, 0x40, 0x8d, 0xf8, 0x07, 0x00, 0x46, 0xf3, 0x0a, 0x40, + 0xad, 0xf8, 0x0c, 0x00, 0x64, 0xb1, 0x94, 0xf8, 0x35, 0x01, 0x9c, 0x49, + 0x8d, 0xf8, 0x04, 0x00, 0x00, 0xeb, 0x40, 0x00, 0x01, 0xeb, 0x40, 0x10, + 0x04, 0xf1, 0x94, 0x01, 0x08, 0x30, 0x08, 0xe0, 0x2d, 0xb3, 0x95, 0xf8, + 0x44, 0x00, 0x05, 0xf5, 0xe9, 0x71, 0x8d, 0xf8, 0x04, 0x00, 0x05, 0xf2, + 0xe5, 0x10, 0x0a, 0x78, 0x83, 0x78, 0xc7, 0x78, 0x8d, 0xf8, 0x09, 0x20, + 0x4a, 0x88, 0x8d, 0xf8, 0x16, 0x30, 0x8d, 0xf8, 0x17, 0x70, 0xad, 0xf8, + 0x0e, 0x20, 0x8a, 0x88, 0xc9, 0x88, 0xad, 0xf8, 0x12, 0x10, 0x01, 0x79, + 0xad, 0xf8, 0x10, 0x20, 0x42, 0x78, 0x8d, 0xf8, 0x0b, 0x10, 0x01, 0x78, + 0x40, 0x79, 0x8d, 0xf8, 0x15, 0x20, 0x8d, 0xf8, 0x14, 0x10, 0x8d, 0xf8, + 0x18, 0x00, 0x27, 0x48, 0x01, 0xab, 0x01, 0x21, 0x00, 0x22, 0x07, 0x68, + 0x16, 0x20, 0x00, 0x90, 0x40, 0xf2, 0x34, 0x70, 0xb8, 0x47, 0x5c, 0xb1, + 0x94, 0xf8, 0x35, 0x01, 0x7c, 0x49, 0x00, 0xeb, 0x40, 0x00, 0x40, 0x01, + 0x08, 0x58, 0x90, 0xb3, 0x02, 0x30, 0x04, 0xf1, 0x74, 0x01, 0x05, 0xe0, + 0x6d, 0xb3, 0xd5, 0xf8, 0x00, 0x11, 0x05, 0xf5, 0xdd, 0x70, 0x74, 0x31, + 0x0a, 0x78, 0xa2, 0xf1, 0x0b, 0x01, 0x0a, 0x2a, 0x72, 0xb2, 0xb1, 0xfa, + 0x81, 0xf1, 0x4f, 0xea, 0x51, 0x11, 0x4f, 0xea, 0x41, 0x01, 0x08, 0xbf, + 0x01, 0x21, 0xb2, 0xf1, 0xff, 0x3f, 0x07, 0xdd, 0x01, 0xeb, 0x41, 0x01, + 0x00, 0xeb, 0x41, 0x00, 0x81, 0x88, 0x01, 0x31, 0x81, 0x80, 0x10, 0xe0, + 0x32, 0xb2, 0x01, 0xeb, 0x41, 0x01, 0xb2, 0xf1, 0xff, 0x3f, 0xdd, 0xbf, + 0x30, 0xf8, 0x11, 0x20, 0x01, 0x32, 0x20, 0xf8, 0x11, 0x20, 0x00, 0xeb, + 0x41, 0x00, 0xc2, 0xbf, 0x41, 0x88, 0x01, 0x31, 0x41, 0x80, 0x07, 0xb0, + 0xf0, 0xbd, 0x00, 0xbf, 0xd8, 0x15, 0x01, 0x10, 0xc8, 0x15, 0x01, 0x10, + 0x00, 0x69, 0x08, 0x00, 0xa0, 0xa0, 0x08, 0x00, 0x0e, 0x49, 0x0f, 0x4a, + 0x51, 0xf8, 0x20, 0x10, 0x08, 0x68, 0x09, 0x68, 0x12, 0x68, 0xb2, 0xf1, + 0xff, 0x3f, 0xc4, 0xbf, 0x02, 0x20, 0x70, 0x47, 0xc5, 0x4a, 0x41, 0xf3, + 0x07, 0x21, 0x40, 0xb2, 0x92, 0xf9, 0xd8, 0x2d, 0x90, 0x42, 0x04, 0xda, + 0x03, 0x20, 0x91, 0x42, 0xb8, 0xbf, 0x05, 0x20, 0x70, 0x47, 0x01, 0x20, + 0x91, 0x42, 0xb8, 0xbf, 0x04, 0x20, 0x70, 0x47, 0x7c, 0x8c, 0x12, 0x10, + 0x58, 0x95, 0x23, 0x40, 0x2d, 0xe9, 0xf8, 0x4f, 0xdf, 0xf8, 0x74, 0x80, + 0x0d, 0x7a, 0xc4, 0x78, 0x90, 0xf8, 0x06, 0xa0, 0xc0, 0x79, 0x1b, 0x4e, + 0xb1, 0xf9, 0x02, 0xb0, 0xb1, 0xf8, 0x06, 0x90, 0x89, 0x88, 0xd8, 0xf8, + 0x00, 0x30, 0x00, 0x90, 0x30, 0x46, 0x2a, 0x46, 0x98, 0x47, 0xd8, 0xf8, + 0x00, 0x30, 0x07, 0x46, 0x06, 0xf1, 0x50, 0x00, 0x49, 0x46, 0x2a, 0x46, + 0x98, 0x47, 0x07, 0xeb, 0x0b, 0x01, 0x00, 0x2c, 0xa0, 0xeb, 0x01, 0x00, + 0x06, 0xf1, 0xe0, 0x01, 0x08, 0xbf, 0x06, 0xf1, 0xa0, 0x01, 0x00, 0x2c, + 0x31, 0xf9, 0x1a, 0x10, 0x08, 0x44, 0x06, 0xf5, 0x80, 0x71, 0x08, 0xbf, + 0x06, 0xf1, 0xc0, 0x01, 0x00, 0x9a, 0x31, 0xf9, 0x12, 0x10, 0x40, 0x1a, + 0xc1, 0x17, 0x00, 0xeb, 0x51, 0x51, 0x01, 0xf4, 0x78, 0x41, 0x40, 0x1a, + 0x00, 0xb2, 0xbd, 0xe8, 0xf8, 0x8f, 0x00, 0xbf, 0x2c, 0xfc, 0x08, 0x00, + 0x90, 0xcf, 0x01, 0x00, 0x70, 0xb5, 0x8f, 0x4b, 0x04, 0x46, 0x21, 0x48, + 0x5d, 0x1d, 0x21, 0x4b, 0x00, 0x68, 0x1b, 0x78, 0x9b, 0x07, 0x02, 0xd5, + 0x10, 0xf4, 0xfc, 0x4f, 0x0e, 0xd0, 0x28, 0x78, 0x01, 0x28, 0x0f, 0xd0, + 0x1d, 0x48, 0x00, 0x78, 0x01, 0x28, 0x03, 0xd0, 0x1c, 0x48, 0x00, 0x78, + 0x01, 0x28, 0x07, 0xd1, 0x18, 0x48, 0x40, 0xf2, 0x01, 0x13, 0x01, 0xe0, + 0x16, 0x48, 0x00, 0x23, 0xa0, 0xf8, 0xb4, 0x32, 0x94, 0xf8, 0x74, 0x00, + 0x83, 0x06, 0x44, 0xbf, 0x00, 0xf0, 0x03, 0x00, 0x80, 0xf0, 0x0f, 0x00, + 0x28, 0x71, 0x69, 0x71, 0xa8, 0x79, 0x28, 0xb1, 0x94, 0xf8, 0x93, 0x60, + 0x01, 0x20, 0x84, 0xf8, 0x93, 0x00, 0xff, 0xe7, 0x20, 0x46, 0x00, 0xf0, + 0x85, 0xfb, 0x0d, 0x48, 0x01, 0x68, 0x01, 0x20, 0x88, 0x47, 0x94, 0xf8, + 0x35, 0x11, 0x0b, 0x4a, 0x01, 0xeb, 0x41, 0x01, 0x02, 0xeb, 0x41, 0x11, + 0x48, 0x73, 0xa8, 0x79, 0x08, 0xb1, 0x84, 0xf8, 0x93, 0x60, 0x70, 0xbd, + 0x14, 0x23, 0x21, 0x40, 0x8c, 0x32, 0x06, 0x00, 0x98, 0xca, 0x01, 0x00, + 0xa8, 0x58, 0x01, 0x00, 0xa9, 0x58, 0x01, 0x00, 0xcc, 0xbd, 0x08, 0x00, + 0x54, 0xf1, 0x05, 0x00, 0x70, 0xb5, 0x12, 0x4c, 0x94, 0xf8, 0x5f, 0x50, + 0xf5, 0xb1, 0x56, 0x34, 0x25, 0x78, 0x66, 0x78, 0xb5, 0x42, 0x19, 0xd1, + 0x65, 0x88, 0x01, 0x2a, 0x04, 0xd8, 0xa0, 0x88, 0xa5, 0xf1, 0x0c, 0x02, + 0x0c, 0x38, 0x03, 0xe0, 0x2a, 0x1a, 0x18, 0x1a, 0xa3, 0x88, 0x18, 0x44, + 0xb1, 0xf9, 0x00, 0x40, 0x13, 0xb2, 0xb1, 0xf9, 0x02, 0x50, 0x9c, 0x42, + 0xb8, 0xbf, 0x22, 0x46, 0x0a, 0x80, 0x02, 0xb2, 0x95, 0x42, 0xb8, 0xbf, + 0x28, 0x46, 0x48, 0x80, 0x70, 0xbd, 0x00, 0xbf, 0xd0, 0xe2, 0x05, 0x00, + 0xf0, 0xb5, 0x05, 0x46, 0x90, 0xf9, 0x02, 0x40, 0x15, 0x48, 0xb1, 0xf9, + 0x04, 0x60, 0x02, 0x2a, 0xb5, 0xf9, 0x00, 0x50, 0x20, 0x5c, 0x04, 0xd0, + 0x01, 0x2a, 0x04, 0xd0, 0x62, 0xb9, 0xb5, 0x42, 0x04, 0xe0, 0xb5, 0x42, + 0x0f, 0xe0, 0x0c, 0x3d, 0x2f, 0xb2, 0xb7, 0x42, 0xb8, 0xbf, 0x2e, 0x46, + 0xa6, 0xf1, 0x0c, 0x05, 0x2f, 0x46, 0x0a, 0xe0, 0x24, 0xea, 0xe4, 0x77, + 0xff, 0xb2, 0x3f, 0x1a, 0x3d, 0x44, 0x2f, 0xb2, 0xb7, 0x42, 0xb8, 0xbf, + 0x2e, 0x46, 0x37, 0x1a, 0x3d, 0x19, 0xde, 0x81, 0x9d, 0x81, 0x5f, 0x81, + 0x23, 0x46, 0xbd, 0xe8, 0xf0, 0x40, 0xff, 0xf7, 0xa9, 0xbf, 0x00, 0xbf, + 0x10, 0x8c, 0x12, 0x10, 0x2d, 0xe9, 0xf0, 0x47, 0xdf, 0xf8, 0xdc, 0xe0, + 0xdd, 0xe9, 0x08, 0xc9, 0x9e, 0xf9, 0x09, 0x50, 0x0c, 0x2d, 0x03, 0xdb, + 0xb5, 0xf1, 0x10, 0x04, 0xb8, 0xbf, 0x25, 0x46, 0x3b, 0x4c, 0x04, 0xf6, + 0xda, 0x54, 0x49, 0xb1, 0x04, 0xf1, 0x0a, 0x01, 0x94, 0xf9, 0x19, 0xa0, + 0x66, 0x78, 0xa7, 0x7d, 0x94, 0xf8, 0x17, 0x80, 0x0c, 0x46, 0x06, 0xe0, + 0x14, 0xf8, 0x08, 0x7b, 0x4f, 0xf0, 0x00, 0x0a, 0x4f, 0xf0, 0x00, 0x08, + 0x7e, 0x42, 0x28, 0xb1, 0xb4, 0xf9, 0x00, 0x10, 0xb2, 0xf9, 0x00, 0x40, + 0x8c, 0x42, 0x02, 0xda, 0x00, 0x27, 0x00, 0x26, 0x04, 0xe0, 0x69, 0xb2, + 0x8a, 0x45, 0xc4, 0xbf, 0x00, 0x26, 0x00, 0x27, 0x92, 0xf9, 0x02, 0x10, + 0x74, 0xb2, 0xa1, 0x42, 0x02, 0xdd, 0x7d, 0xb2, 0xa9, 0x42, 0x03, 0xdb, + 0x10, 0xb3, 0x9e, 0xf8, 0x0b, 0x00, 0xf8, 0xb1, 0xd0, 0x78, 0xe8, 0xb1, + 0x10, 0x79, 0xd8, 0xb1, 0x40, 0xf2, 0x01, 0x10, 0x19, 0x46, 0x4b, 0x46, + 0xa9, 0xf8, 0x00, 0x00, 0x01, 0x20, 0x89, 0xf8, 0x02, 0x00, 0x92, 0xf9, + 0x02, 0x00, 0xa0, 0xeb, 0x08, 0x00, 0x10, 0xf1, 0x3f, 0x0f, 0xd8, 0xbf, + 0x6f, 0xf0, 0x3e, 0x00, 0x3f, 0x28, 0xa8, 0xbf, 0x3f, 0x20, 0x90, 0x70, + 0x10, 0x46, 0x62, 0x46, 0xbd, 0xe8, 0xf0, 0x47, 0xff, 0xf7, 0x70, 0xbf, + 0xa1, 0x42, 0x09, 0xdd, 0x10, 0x79, 0x38, 0xb1, 0x01, 0x20, 0x89, 0xf8, + 0x01, 0x00, 0x58, 0x88, 0xa9, 0xf8, 0x0c, 0x00, 0xbd, 0xe8, 0xf0, 0x87, + 0x01, 0x20, 0x89, 0xf8, 0x00, 0x00, 0x18, 0x88, 0xa9, 0xf8, 0x0a, 0x00, + 0xbd, 0xe8, 0xf0, 0x87, 0x48, 0xdc, 0x05, 0x00, 0x08, 0x49, 0x91, 0xf8, + 0xf2, 0x1d, 0x59, 0xb1, 0x0c, 0x28, 0x04, 0xbf, 0x0c, 0x20, 0x70, 0x47, + 0x41, 0x1e, 0x4a, 0xb2, 0x00, 0x2a, 0x48, 0xbf, 0x00, 0xf1, 0x0f, 0x01, + 0x48, 0xb2, 0x70, 0x47, 0x0b, 0x20, 0x70, 0x47, 0x00, 0x69, 0x08, 0x00, + 0xf8, 0xb5, 0xd9, 0x4f, 0x04, 0x46, 0x15, 0x46, 0x0e, 0x46, 0x78, 0x7a, + 0xff, 0xf7, 0xe4, 0xff, 0x00, 0x28, 0x11, 0xd4, 0x0f, 0x28, 0x0f, 0xdc, + 0xb9, 0x7a, 0x1f, 0x4a, 0x02, 0xeb, 0x41, 0x11, 0x31, 0xf9, 0x10, 0x20, + 0x01, 0xeb, 0x40, 0x00, 0xb2, 0x42, 0xd8, 0xbf, 0x16, 0x46, 0xb0, 0xf9, + 0x80, 0x00, 0xa8, 0x42, 0xd8, 0xbf, 0x05, 0x46, 0xb9, 0x7a, 0x18, 0x4a, + 0x01, 0x20, 0x00, 0xfa, 0x01, 0xf3, 0x90, 0x8c, 0x03, 0x42, 0x08, 0xd0, + 0x02, 0xeb, 0x41, 0x00, 0x37, 0xb2, 0xb0, 0xf9, 0x2e, 0x00, 0x87, 0x42, + 0xb8, 0xbf, 0x30, 0x46, 0x00, 0xe0, 0x30, 0x46, 0xd6, 0x8e, 0x33, 0x42, + 0x08, 0xd0, 0x02, 0xeb, 0x41, 0x01, 0x2a, 0xb2, 0xb1, 0xf9, 0x40, 0x10, + 0x8a, 0x42, 0xb8, 0xbf, 0x29, 0x46, 0x00, 0xe0, 0x29, 0x46, 0xb4, 0xf9, + 0x0a, 0x30, 0x02, 0xb2, 0x93, 0x42, 0xc6, 0xbf, 0x60, 0x81, 0x01, 0x20, + 0x00, 0x20, 0x0a, 0xb2, 0xb4, 0xf9, 0x0c, 0x30, 0x93, 0x42, 0xc4, 0xbf, + 0xa1, 0x81, 0x01, 0x20, 0xf8, 0xbd, 0x00, 0xbf, 0xb2, 0xd0, 0x01, 0x00, + 0xd8, 0xdb, 0x05, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, 0x8b, 0xb0, 0x80, 0x46, + 0x00, 0x20, 0xdf, 0xf8, 0xbc, 0xb2, 0x9a, 0x46, 0xcd, 0xe9, 0x06, 0x00, + 0xad, 0xf8, 0x2a, 0x00, 0xad, 0xf8, 0x28, 0x00, 0xcd, 0xe9, 0x04, 0x00, + 0x90, 0x06, 0x44, 0xbf, 0x02, 0xf0, 0x03, 0x00, 0x80, 0xf0, 0x0f, 0x02, + 0xad, 0xf8, 0x20, 0x10, 0x4f, 0xf4, 0x7f, 0x40, 0x8b, 0xf8, 0x09, 0x20, + 0x02, 0xaa, 0x8b, 0xf8, 0x0a, 0xa0, 0xad, 0xf8, 0x1a, 0x00, 0xad, 0xf8, + 0x1c, 0x00, 0xa1, 0x48, 0x03, 0x68, 0x08, 0x46, 0x51, 0x46, 0x98, 0x47, + 0xe8, 0x48, 0x00, 0xf6, 0xd4, 0x54, 0x90, 0xf8, 0xd4, 0x0d, 0x18, 0xb1, + 0x98, 0xf8, 0x0c, 0x00, 0x00, 0x28, 0x5b, 0xd0, 0x4f, 0xf0, 0x00, 0x09, + 0x9a, 0x4f, 0x46, 0x46, 0xbd, 0xf8, 0x0c, 0x00, 0x16, 0xf9, 0x02, 0x5f, + 0x39, 0x68, 0xad, 0xf8, 0x1e, 0x00, 0x00, 0x20, 0x8d, 0xf8, 0x22, 0x50, + 0x88, 0x47, 0x39, 0x68, 0x8d, 0xf8, 0x23, 0x00, 0x01, 0x20, 0x88, 0x47, + 0x8d, 0xf8, 0x24, 0x00, 0x16, 0xf8, 0x01, 0x0c, 0x18, 0xb9, 0x9b, 0xf8, + 0x0b, 0x00, 0x00, 0x28, 0x58, 0xd0, 0x94, 0xf9, 0x05, 0x00, 0x85, 0x42, + 0x04, 0xda, 0x40, 0x42, 0x85, 0x42, 0x04, 0xdc, 0x00, 0x20, 0x00, 0xe0, + 0x01, 0x20, 0x88, 0xf8, 0x00, 0x00, 0xa0, 0x78, 0xe8, 0xb1, 0x01, 0x20, + 0x04, 0xa9, 0x08, 0xaa, 0x02, 0xab, 0x8d, 0xf8, 0x13, 0x00, 0xe1, 0x48, + 0x05, 0x68, 0x60, 0x7a, 0xcd, 0xe9, 0x00, 0x01, 0x48, 0x46, 0x00, 0x21, + 0xa8, 0x47, 0xb4, 0xf9, 0x0a, 0x00, 0xbd, 0xf9, 0x1a, 0x10, 0x81, 0x42, + 0x05, 0xdc, 0xb4, 0xf9, 0x0c, 0x00, 0xbd, 0xf9, 0x1c, 0x10, 0x81, 0x42, + 0x03, 0xdd, 0xe0, 0x78, 0x08, 0xb1, 0x00, 0x20, 0x04, 0x90, 0x9d, 0xf8, + 0x13, 0x00, 0x00, 0x28, 0x4d, 0xd1, 0xe0, 0x78, 0x00, 0x28, 0x4a, 0xd0, + 0xd1, 0x48, 0x04, 0xa9, 0x08, 0xaa, 0x02, 0xab, 0x05, 0x68, 0x20, 0x7a, + 0xcd, 0xe9, 0x00, 0x01, 0x48, 0x46, 0x01, 0x21, 0xa8, 0x47, 0x3e, 0xe0, + 0x15, 0x99, 0x6c, 0x48, 0x0a, 0x46, 0x00, 0x29, 0x18, 0xbf, 0x01, 0x22, + 0x90, 0xf8, 0x20, 0x01, 0x00, 0x28, 0x03, 0x46, 0x18, 0xbf, 0x01, 0x23, + 0x02, 0xea, 0x03, 0x09, 0x00, 0x29, 0x95, 0xd1, 0x00, 0x28, 0x93, 0xd0, + 0x94, 0xf8, 0x01, 0x90, 0xb9, 0xf1, 0x00, 0x0f, 0x18, 0xbf, 0x4f, 0xf0, + 0x01, 0x09, 0x8b, 0xe7, 0x98, 0xf8, 0x00, 0x00, 0x70, 0xb1, 0x01, 0x20, + 0xa1, 0x78, 0x8d, 0xf8, 0x11, 0x00, 0xbd, 0xf9, 0x0a, 0x00, 0xad, 0xf8, + 0x1c, 0x00, 0xc1, 0xb1, 0xa3, 0x49, 0x01, 0xeb, 0x4a, 0x11, 0xb1, 0xf9, + 0x96, 0x10, 0x0d, 0xe0, 0x01, 0x20, 0xa1, 0x78, 0x8d, 0xf8, 0x10, 0x00, + 0xbd, 0xf9, 0x08, 0x00, 0xad, 0xf8, 0x1a, 0x00, 0x49, 0xb1, 0x9c, 0x49, + 0x01, 0xeb, 0x4a, 0x11, 0xb1, 0xf9, 0x16, 0x10, 0x88, 0x42, 0xdc, 0xbf, + 0x01, 0x20, 0x8d, 0xf8, 0x13, 0x00, 0x9d, 0xf8, 0x12, 0x00, 0xc0, 0xb1, + 0x95, 0x48, 0xbd, 0xf9, 0x08, 0x10, 0xbd, 0xf9, 0x0a, 0x20, 0x00, 0xeb, + 0x4a, 0x10, 0xb0, 0xf9, 0x16, 0x30, 0xb0, 0xf9, 0x96, 0x00, 0x8b, 0x42, + 0xb8, 0xbf, 0x19, 0x46, 0x90, 0x42, 0xb8, 0xbf, 0x02, 0x46, 0xa4, 0x48, + 0x03, 0x68, 0x04, 0xa8, 0x98, 0x47, 0x9d, 0xf8, 0x10, 0x00, 0x40, 0xb9, + 0x0f, 0xe0, 0x9d, 0xf8, 0x10, 0x00, 0x00, 0x28, 0x71, 0xd0, 0xbd, 0xf8, + 0x08, 0x00, 0xad, 0xf8, 0x1e, 0x00, 0x86, 0x48, 0x04, 0xaa, 0x0d, 0xf1, + 0x2a, 0x03, 0x00, 0x21, 0x04, 0x68, 0x50, 0x46, 0xa0, 0x47, 0x9d, 0xf8, + 0x11, 0x00, 0x70, 0xb1, 0x80, 0x48, 0x04, 0xaa, 0x0a, 0xab, 0x01, 0x21, + 0x04, 0x68, 0x50, 0x46, 0xa0, 0x47, 0x9d, 0xf8, 0x12, 0x00, 0x38, 0xb9, + 0xbd, 0xf8, 0x28, 0x00, 0x6f, 0xf3, 0xdf, 0x30, 0x0f, 0xe0, 0x9d, 0xf8, + 0x12, 0x00, 0x70, 0xb1, 0x04, 0xa8, 0x31, 0x46, 0xff, 0xf7, 0x26, 0xfd, + 0xad, 0xf8, 0x18, 0x00, 0x75, 0x48, 0xbd, 0xf8, 0x28, 0x10, 0x02, 0x68, + 0xbd, 0xf8, 0x2a, 0x00, 0x90, 0x47, 0xad, 0xf8, 0x2a, 0x00, 0x72, 0x48, + 0x90, 0xf8, 0x71, 0x01, 0x88, 0xb3, 0xbd, 0xf8, 0x18, 0x10, 0x70, 0x4a, + 0x9d, 0xf8, 0x14, 0x50, 0x9d, 0xf8, 0x11, 0x30, 0x14, 0x98, 0x9d, 0xf8, + 0x12, 0x40, 0x02, 0xea, 0x01, 0x41, 0x9d, 0xf8, 0x10, 0x20, 0x05, 0xf0, + 0x1f, 0x05, 0x45, 0xea, 0xc2, 0x12, 0x9d, 0xf8, 0x15, 0x50, 0x05, 0xf0, + 0x1f, 0x05, 0x42, 0xea, 0x05, 0x22, 0x42, 0xea, 0xc3, 0x32, 0x11, 0x43, + 0x64, 0x4a, 0x41, 0xea, 0xc4, 0x71, 0x52, 0xf8, 0x20, 0x20, 0x11, 0x60, + 0x62, 0x49, 0x4f, 0xf6, 0xff, 0x72, 0x51, 0xf8, 0x20, 0x00, 0x01, 0x68, + 0x91, 0x43, 0xbd, 0xf8, 0x2a, 0x20, 0x11, 0x44, 0x01, 0x60, 0x01, 0x68, + 0xbd, 0xf8, 0x28, 0x20, 0xc1, 0xea, 0x02, 0x41, 0x01, 0x60, 0x0c, 0x48, + 0x51, 0x46, 0x02, 0x68, 0x04, 0xa8, 0x90, 0x47, 0x9d, 0xf8, 0x24, 0x00, + 0x88, 0xf8, 0x1a, 0x00, 0x0b, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0xbd, 0xf8, + 0x0a, 0x00, 0xad, 0xf8, 0x1e, 0x00, 0x94, 0xe7, 0x48, 0xdc, 0x05, 0x00, + 0x98, 0xbd, 0x08, 0x00, 0x90, 0xcf, 0x01, 0x00, 0xcc, 0xbd, 0x08, 0x00, + 0xa4, 0xbd, 0x08, 0x00, 0x2d, 0xe9, 0xff, 0x41, 0x16, 0x46, 0x43, 0x4a, + 0xdd, 0xf8, 0x28, 0x80, 0x4f, 0xf0, 0x01, 0x0c, 0x4f, 0xf4, 0x7f, 0x45, + 0x1c, 0x46, 0xad, 0xf8, 0x08, 0x00, 0x02, 0xa8, 0x8d, 0xf8, 0x0c, 0xc0, + 0x51, 0x72, 0x82, 0xf8, 0x0a, 0x80, 0x00, 0x21, 0x3b, 0x4a, 0x83, 0xf8, + 0x02, 0xc0, 0xb7, 0x88, 0x19, 0x81, 0x9d, 0x81, 0x40, 0xf2, 0x01, 0x13, + 0xad, 0xf8, 0x06, 0x10, 0xad, 0xf8, 0x04, 0x10, 0x31, 0x46, 0x65, 0x81, + 0x92, 0xf8, 0xe7, 0x2d, 0x23, 0x80, 0x4f, 0xf4, 0x80, 0x73, 0xad, 0xf8, + 0x0a, 0x30, 0x23, 0x46, 0xe7, 0x81, 0xff, 0xf7, 0x5b, 0xfd, 0x30, 0x48, + 0xb6, 0xf9, 0x00, 0x10, 0xb6, 0xf9, 0x02, 0x20, 0x00, 0xeb, 0x48, 0x10, + 0xb0, 0xf9, 0x16, 0x30, 0xb0, 0xf9, 0x96, 0x00, 0x8b, 0x42, 0xb8, 0xbf, + 0x19, 0x46, 0x90, 0x42, 0xb8, 0xbf, 0x02, 0x46, 0x3e, 0x48, 0x03, 0x68, + 0x20, 0x46, 0x98, 0x47, 0x26, 0x4d, 0x0d, 0xf1, 0x06, 0x03, 0x40, 0x46, + 0x00, 0x21, 0x22, 0x46, 0x2e, 0x68, 0xb0, 0x47, 0x2d, 0x68, 0x01, 0xab, + 0x40, 0x46, 0x01, 0x21, 0x22, 0x46, 0xa8, 0x47, 0x20, 0x48, 0xbd, 0xf8, + 0x04, 0x10, 0x02, 0x68, 0xbd, 0xf8, 0x06, 0x00, 0x90, 0x47, 0x1e, 0x49, + 0xad, 0xf8, 0x06, 0x00, 0x91, 0xf8, 0x71, 0x11, 0x49, 0xb3, 0x22, 0x89, + 0x1b, 0x4b, 0x27, 0x79, 0x65, 0x78, 0xa6, 0x78, 0x0b, 0x99, 0x03, 0xea, + 0x02, 0x42, 0x23, 0x78, 0x64, 0x79, 0x07, 0xf0, 0x1f, 0x07, 0x47, 0xea, + 0xc3, 0x13, 0x04, 0xf0, 0x1f, 0x04, 0x43, 0xea, 0x04, 0x23, 0x43, 0xea, + 0xc5, 0x33, 0x1a, 0x43, 0x12, 0x4b, 0x42, 0xea, 0xc6, 0x72, 0x53, 0xf8, + 0x21, 0x30, 0x1a, 0x60, 0x10, 0x4a, 0x4f, 0xf6, 0xff, 0x73, 0x52, 0xf8, + 0x21, 0x10, 0x0a, 0x68, 0x9a, 0x43, 0x10, 0x44, 0x08, 0x60, 0x08, 0x68, + 0xbd, 0xf8, 0x04, 0x20, 0xc0, 0xea, 0x02, 0x40, 0x08, 0x60, 0xbd, 0xe8, + 0xff, 0x81, 0x00, 0xbf, 0x48, 0xdc, 0x05, 0x00, 0x00, 0x69, 0x08, 0x00, + 0xb2, 0xd0, 0x01, 0x00, 0x74, 0xbd, 0x08, 0x00, 0xc8, 0xbd, 0x08, 0x00, + 0x8c, 0x7e, 0x08, 0x00, 0x00, 0x00, 0xff, 0x07, 0xc8, 0x15, 0x01, 0x10, + 0xd8, 0x15, 0x01, 0x10, 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, + 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, 0x09, 0x49, 0x01, 0x60, 0x09, 0x48, + 0x09, 0x49, 0x01, 0x60, 0x09, 0x48, 0x0a, 0x49, 0x01, 0x60, 0x70, 0x47, + 0xfc, 0xbb, 0x08, 0x00, 0xe1, 0xb6, 0x05, 0x00, 0x68, 0xbd, 0x08, 0x00, + 0x39, 0xb6, 0x05, 0x00, 0xa0, 0xa2, 0x08, 0x00, 0xe5, 0xbb, 0x05, 0x00, + 0x6c, 0xbd, 0x08, 0x00, 0x41, 0xbd, 0x05, 0x00, 0x70, 0xbd, 0x08, 0x00, + 0x51, 0xbe, 0x05, 0x00, 0x48, 0xf2, 0xdb, 0x7c, 0xc1, 0xf2, 0x12, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x48, 0xf6, 0xf7, 0x0c, 0xc1, 0xf2, 0x12, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x0b, 0x48, 0x05, 0x49, 0x00, 0x68, 0x08, 0x60, + 0x00, 0xf0, 0x56, 0xb9, 0x02, 0x48, 0x08, 0x49, 0x00, 0x68, 0x08, 0x60, + 0x00, 0xf0, 0x56, 0xb9, 0xc0, 0x2a, 0x06, 0x00, 0x8a, 0x48, 0x04, 0x49, + 0x90, 0xf8, 0x2f, 0x01, 0x0a, 0x68, 0x60, 0xf3, 0x05, 0x02, 0x0a, 0x60, + 0x00, 0xf0, 0x50, 0xb9, 0x0c, 0x90, 0x23, 0x40, 0x70, 0xb5, 0x25, 0x48, + 0x25, 0x4c, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x01, 0x28, 0x42, 0xd1, + 0x23, 0x49, 0x20, 0x68, 0x01, 0x24, 0x40, 0xf6, 0xf8, 0x76, 0x4a, 0x6b, + 0x48, 0x63, 0x41, 0xf2, 0xae, 0x00, 0x7c, 0x4a, 0x10, 0x5c, 0x0b, 0x68, + 0x23, 0xf0, 0xff, 0x03, 0x03, 0x44, 0x0b, 0x60, 0x0b, 0x68, 0x64, 0xf3, + 0x11, 0x23, 0x1b, 0x4c, 0x0b, 0x60, 0x41, 0xf2, 0xad, 0x03, 0xd3, 0x5c, + 0x25, 0x68, 0xb5, 0x43, 0x45, 0xea, 0x03, 0x13, 0x23, 0x60, 0x41, 0xf2, + 0xbc, 0x03, 0xd2, 0x58, 0x52, 0x07, 0x15, 0x4a, 0x13, 0x68, 0x06, 0xd4, + 0x23, 0xf0, 0x02, 0x03, 0x13, 0x60, 0x13, 0x68, 0xc1, 0xf2, 0x00, 0x03, + 0x01, 0xe0, 0x43, 0xf0, 0x02, 0x03, 0x13, 0x60, 0x00, 0x22, 0x10, 0x4b, + 0x4a, 0x61, 0x0e, 0x49, 0x09, 0x78, 0x01, 0xeb, 0x81, 0x01, 0x03, 0xeb, + 0x41, 0x11, 0x01, 0xf8, 0x38, 0x0f, 0x03, 0x20, 0x08, 0x77, 0x01, 0x20, + 0x48, 0x70, 0x0a, 0x48, 0x08, 0x40, 0x00, 0xf5, 0x00, 0x00, 0x41, 0xe9, + 0x0c, 0x02, 0x70, 0xbd, 0xc0, 0xd3, 0x08, 0x00, 0xb8, 0xe9, 0x01, 0x00, + 0xb8, 0x12, 0x21, 0x40, 0x58, 0x00, 0x21, 0x40, 0x90, 0x01, 0x23, 0x40, + 0x74, 0x87, 0x08, 0x00, 0xbc, 0x65, 0x01, 0x00, 0xfc, 0xff, 0x3f, 0x00, + 0x10, 0xb5, 0x04, 0x46, 0x10, 0x48, 0x02, 0x21, 0x02, 0x68, 0xc4, 0xf3, + 0x03, 0x10, 0x90, 0x47, 0x43, 0xf6, 0xdf, 0x71, 0x4f, 0xf6, 0xff, 0x73, + 0x08, 0x40, 0x0c, 0x49, 0xc9, 0x68, 0x0a, 0x68, 0x9a, 0x43, 0x02, 0x44, + 0x0a, 0x60, 0x0a, 0x68, 0xc2, 0xea, 0x00, 0x40, 0xa2, 0x07, 0x08, 0x60, + 0x07, 0x48, 0x4f, 0xf0, 0x00, 0x01, 0x01, 0x60, 0x01, 0x68, 0x4c, 0xbf, + 0x41, 0xf4, 0x00, 0x41, 0x41, 0xf0, 0x80, 0x01, 0x01, 0x60, 0x10, 0xbd, + 0x9c, 0xbd, 0x08, 0x00, 0xd8, 0x15, 0x01, 0x10, 0xa0, 0x10, 0x21, 0x40, + 0x2d, 0xe9, 0xfe, 0x4f, 0x8d, 0xe8, 0x07, 0x00, 0x00, 0xeb, 0x81, 0x00, + 0x24, 0x4e, 0x3e, 0x4f, 0xdf, 0xf8, 0x90, 0x80, 0x4f, 0xf0, 0xff, 0x35, + 0x41, 0xf2, 0xc9, 0x04, 0x00, 0xf1, 0x02, 0x0b, 0x21, 0x48, 0x00, 0xf1, + 0x01, 0x09, 0x38, 0x5d, 0x01, 0x35, 0x85, 0x42, 0x35, 0xd2, 0x30, 0x69, + 0xb0, 0xf1, 0xff, 0x3f, 0x02, 0xdd, 0x4f, 0xf0, 0x00, 0x0a, 0x24, 0xe0, + 0x30, 0x68, 0x02, 0x99, 0x01, 0x29, 0x04, 0xd1, 0xc0, 0xf3, 0xc0, 0x51, + 0x30, 0x68, 0xc0, 0xb2, 0x02, 0xe0, 0xc1, 0x0f, 0x30, 0x68, 0x00, 0x0a, + 0x41, 0xf2, 0xbc, 0x02, 0xba, 0x5c, 0x92, 0x07, 0x08, 0xd5, 0x21, 0xb1, + 0x97, 0xf9, 0xd8, 0x1d, 0x42, 0xb2, 0x8a, 0x42, 0x02, 0xda, 0x4f, 0xf0, + 0x00, 0x0a, 0x08, 0xe0, 0x31, 0x69, 0x4f, 0xf0, 0x01, 0x0a, 0x41, 0xf3, + 0x0a, 0x01, 0xdd, 0xe9, 0x00, 0x32, 0x23, 0xf8, 0x22, 0x10, 0x8b, 0xf8, + 0x00, 0x00, 0xb8, 0xf8, 0x00, 0x00, 0x02, 0x38, 0xc8, 0x47, 0xba, 0xf1, + 0x00, 0x0f, 0xc8, 0xd0, 0x01, 0x20, 0xbd, 0xe8, 0xfe, 0x8f, 0x00, 0x20, + 0xbd, 0xe8, 0xfe, 0x8f, 0x48, 0x95, 0x23, 0x40, 0x34, 0xec, 0x01, 0x00, + 0x40, 0xec, 0x01, 0x00, 0x2d, 0xe9, 0xf0, 0x41, 0xec, 0xf7, 0x6c, 0xfc, + 0x25, 0x24, 0x14, 0x4e, 0x41, 0xf2, 0xb3, 0x08, 0x90, 0xfb, 0xf4, 0xf1, + 0x01, 0xfb, 0x14, 0x00, 0x16, 0xf8, 0x08, 0x10, 0xa9, 0xb1, 0x41, 0xf2, + 0xb4, 0x07, 0x00, 0x22, 0xb3, 0x18, 0xc5, 0xb2, 0xdb, 0x5d, 0xab, 0x42, + 0x03, 0xd0, 0x01, 0x32, 0x8a, 0x42, 0xf7, 0xd3, 0x09, 0xe0, 0xec, 0xf7, + 0x53, 0xfc, 0x90, 0xfb, 0xf4, 0xf1, 0x01, 0xfb, 0x14, 0x00, 0x16, 0xf8, + 0x08, 0x10, 0x00, 0x29, 0xeb, 0xd1, 0x01, 0x21, 0x61, 0xf3, 0x1f, 0x20, + 0x03, 0x49, 0x08, 0x60, 0x03, 0x49, 0x08, 0x60, 0xbd, 0xe8, 0xf0, 0x81, + 0x00, 0x69, 0x08, 0x00, 0x30, 0x10, 0x21, 0x40, 0x80, 0x10, 0x21, 0x40, + 0x0a, 0x48, 0x0b, 0x49, 0x01, 0x60, 0x0b, 0x48, 0x0b, 0x49, 0x01, 0x60, + 0x0b, 0x48, 0x0c, 0x49, 0x01, 0x60, 0x0c, 0x48, 0x0c, 0x49, 0x01, 0x60, + 0x0c, 0x48, 0x0d, 0x49, 0x01, 0x60, 0x0d, 0x48, 0x0d, 0x49, 0x01, 0x60, + 0x0d, 0x48, 0x0e, 0x49, 0x01, 0x60, 0x70, 0x47, 0xe8, 0xfd, 0x08, 0x00, + 0x65, 0xc3, 0x05, 0x00, 0xbc, 0xfe, 0x08, 0x00, 0x81, 0xc3, 0x05, 0x00, + 0xec, 0xfd, 0x08, 0x00, 0x71, 0xc3, 0x05, 0x00, 0xb8, 0xfe, 0x08, 0x00, + 0x99, 0xc3, 0x05, 0x00, 0x44, 0xfd, 0x08, 0x00, 0xa5, 0xc4, 0x05, 0x00, + 0x34, 0xfd, 0x08, 0x00, 0x51, 0xc5, 0x05, 0x00, 0x38, 0xfd, 0x08, 0x00, + 0x51, 0xc4, 0x05, 0x00, 0x41, 0xf6, 0xe3, 0x5c, 0xc1, 0xf2, 0x01, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf6, 0x0b, 0x6c, 0xc1, 0xf2, 0x01, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x41, 0xf6, 0x01, 0x1c, 0xc1, 0xf2, 0x01, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0x0c, 0x90, 0x23, 0x40, 0x70, 0xb5, 0x2c, 0x4d, + 0x2c, 0x4c, 0x2d, 0x4e, 0x0c, 0x21, 0x0c, 0x23, 0x28, 0x46, 0x22, 0x46, + 0xb0, 0x47, 0x05, 0xf1, 0x0c, 0x00, 0x04, 0xf1, 0x40, 0x02, 0x14, 0x21, + 0x14, 0x23, 0xb0, 0x47, 0x05, 0xf1, 0x20, 0x00, 0x04, 0xf1, 0x80, 0x02, + 0x68, 0x21, 0x68, 0x23, 0xb0, 0x47, 0xd4, 0xf8, 0x00, 0x01, 0x04, 0xf5, + 0xa0, 0x72, 0x14, 0x21, 0x14, 0x23, 0xc5, 0xf8, 0x88, 0x00, 0xd4, 0xf8, + 0x04, 0x01, 0xc5, 0xf8, 0x8c, 0x00, 0x05, 0xf1, 0x90, 0x00, 0xb0, 0x47, + 0x05, 0xf1, 0xa4, 0x00, 0x04, 0xf5, 0xc0, 0x72, 0x38, 0x21, 0x38, 0x23, + 0xb0, 0x47, 0x19, 0x4d, 0x04, 0xf5, 0x80, 0x62, 0x0c, 0x21, 0x0c, 0x23, + 0x28, 0x46, 0xb0, 0x47, 0x05, 0xf1, 0x0c, 0x00, 0x04, 0xf5, 0x88, 0x62, + 0x14, 0x21, 0x14, 0x23, 0xb0, 0x47, 0x05, 0xf1, 0x20, 0x00, 0x04, 0xf5, + 0x90, 0x62, 0x68, 0x21, 0x68, 0x23, 0xb0, 0x47, 0xd4, 0xf8, 0x00, 0x05, + 0x0f, 0x4a, 0x14, 0x21, 0x14, 0x23, 0xc5, 0xf8, 0x88, 0x00, 0x0c, 0x48, + 0x00, 0x68, 0xc5, 0xf8, 0x8c, 0x00, 0x05, 0xf1, 0x90, 0x00, 0xb0, 0x47, + 0x0a, 0x4a, 0x05, 0xf1, 0xa4, 0x00, 0x38, 0x21, 0x38, 0x23, 0xb4, 0x46, + 0xbd, 0xe8, 0x70, 0x40, 0x60, 0x47, 0x00, 0xbf, 0xc4, 0x2a, 0x06, 0x00, + 0x00, 0x50, 0x05, 0x30, 0x4d, 0xcd, 0x11, 0x10, 0xa0, 0x2b, 0x06, 0x00, + 0x04, 0x55, 0x05, 0x30, 0x40, 0x55, 0x05, 0x30, 0x80, 0x55, 0x05, 0x30, + 0xb0, 0xb5, 0x10, 0x49, 0x02, 0x68, 0x00, 0x23, 0x04, 0x31, 0x51, 0xf8, + 0x04, 0x4c, 0xa2, 0x42, 0x03, 0xd1, 0x0c, 0x68, 0x45, 0x68, 0xa5, 0x42, + 0x07, 0xd0, 0x01, 0x33, 0x08, 0x31, 0x10, 0x2b, 0xf3, 0xd1, 0x1c, 0x48, + 0x80, 0x68, 0xc0, 0x69, 0xb0, 0xbd, 0x07, 0x48, 0x90, 0xf8, 0xc5, 0x11, + 0x90, 0xf8, 0xc6, 0x21, 0x90, 0xf8, 0xc7, 0x01, 0x41, 0xea, 0x02, 0x21, + 0x41, 0xea, 0x00, 0x40, 0xb0, 0xbd, 0x00, 0xbf, 0xc8, 0xc7, 0x05, 0x00, + 0x00, 0x69, 0x08, 0x00, 0xf8, 0xb5, 0x0c, 0x46, 0x20, 0xb1, 0x21, 0x46, + 0xbd, 0xe8, 0xf8, 0x40, 0x00, 0xf0, 0x26, 0xb8, 0x0c, 0x4d, 0x72, 0xb6, + 0x28, 0x68, 0x40, 0x00, 0x01, 0x30, 0x28, 0x60, 0x0a, 0x48, 0x86, 0x68, + 0x20, 0x46, 0xf7, 0x69, 0xff, 0xf7, 0xc6, 0xff, 0xf0, 0x61, 0x00, 0x20, + 0x21, 0x46, 0x00, 0xf0, 0x15, 0xf8, 0xf7, 0x61, 0x28, 0x68, 0x40, 0x08, + 0x28, 0x60, 0x28, 0x68, 0x80, 0xf3, 0x10, 0x88, 0xf8, 0xbd, 0x00, 0xbf, + 0x24, 0x36, 0x01, 0x00, 0x24, 0x75, 0x12, 0x10, 0x01, 0x48, 0x02, 0x49, + 0x01, 0x60, 0x70, 0x47, 0x64, 0xfb, 0x08, 0x00, 0x61, 0xc7, 0x05, 0x00, + 0x47, 0xf2, 0x99, 0x1c, 0xc1, 0xf2, 0x12, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x42, 0x22, 0xa4, 0x44, 0x4a, 0x64, 0x04, 0x4e, 0xd5, 0x7f, 0x15, 0x54, + 0xb5, 0x8a, 0xaa, 0x4e, 0x6b, 0xbd, 0x03, 0x00, 0x30, 0x42, 0x4a, 0xb1, + 0x6b, 0x8c, 0x63, 0xa4, 0x95, 0x52, 0x4b, 0xb1, 0x97, 0x1e, 0x29, 0x73, + 0x66, 0xac, 0x58, 0xb1, 0x46, 0xa3, 0xf5, 0x7a, 0xbd, 0x40, 0x24, 0xb0, + 0xff, 0xeb, 0x39, 0x63, 0x8c, 0x21, 0xa4, 0xb1, 0x32, 0xd5, 0xa1, 0x4c, + 0x65, 0x28, 0xc3, 0xb1, 0x35, 0xaa, 0x5a, 0x45, 0xa4, 0x23, 0xd3, 0xb1, + 0x06, 0x34, 0xb0, 0xc1, 0x45, 0x3c, 0xe2, 0xb1, 0x72, 0xf9, 0x62, 0xc6, + 0x88, 0x13, 0x27, 0x4e, 0x85, 0xaa, 0x54, 0x35, 0xaa, 0x44, 0x2d, 0x4e, + 0x54, 0x08, 0xc4, 0x76, 0xf9, 0x3c, 0x9c, 0x4e, 0xe5, 0x7b, 0xf2, 0x39, + 0x69, 0x9c, 0xb4, 0x4e, 0x83, 0x98, 0xa4, 0xa1, 0x2d, 0x6d, 0x69, 0x4f, + 0xdc, 0x9d, 0xb3, 0x73, 0xf4, 0x84, 0x9f, 0xb0, 0x70, 0xb5, 0x08, 0x4d, + 0x0e, 0x4e, 0x00, 0x24, 0x28, 0x68, 0xe0, 0x40, 0xc0, 0x07, 0x03, 0xd0, + 0x56, 0xf8, 0x24, 0x00, 0x00, 0xb1, 0x80, 0x47, 0x01, 0x34, 0x0e, 0x2c, + 0x08, 0xbf, 0x70, 0xbd, 0xf2, 0xe7, 0x00, 0xbf, 0x40, 0xf4, 0x00, 0x30, + 0x0d, 0x28, 0x88, 0xbf, 0x70, 0x47, 0x04, 0x4a, 0x42, 0xf8, 0x20, 0x10, + 0x03, 0x48, 0x04, 0x49, 0x02, 0x68, 0x01, 0x20, 0x10, 0x47, 0x00, 0xbf, + 0xb4, 0xeb, 0x01, 0x00, 0xc4, 0x9c, 0x08, 0x00, 0x49, 0xc8, 0x05, 0x00, + 0x70, 0x47, 0x00, 0x00, 0x1b, 0x48, 0xc1, 0x7d, 0x05, 0x29, 0x01, 0xd0, + 0x03, 0x29, 0x0b, 0xd1, 0x41, 0x7f, 0x0d, 0x29, 0x02, 0xd8, 0x18, 0x4a, + 0x2a, 0x23, 0x53, 0x54, 0x81, 0x7f, 0x0d, 0x29, 0x02, 0xd8, 0x15, 0x4a, + 0x29, 0x23, 0x53, 0x54, 0x90, 0xf8, 0xa0, 0x15, 0xd1, 0xb1, 0x90, 0xf8, + 0x9c, 0x05, 0xc0, 0x07, 0x17, 0xd1, 0x10, 0x48, 0x05, 0x22, 0x02, 0x29, + 0x00, 0xf8, 0x04, 0x2f, 0x4f, 0xf0, 0x08, 0x02, 0xc2, 0x70, 0x4f, 0xf0, + 0x07, 0x02, 0x82, 0x70, 0x4f, 0xf0, 0x06, 0x02, 0x42, 0x70, 0x07, 0xd3, + 0x2e, 0x21, 0x01, 0x72, 0x2d, 0x21, 0x41, 0x71, 0x30, 0x21, 0x41, 0x72, + 0x2f, 0x21, 0x81, 0x71, 0x70, 0x47, 0x04, 0x48, 0x0f, 0x21, 0xc1, 0x71, + 0x10, 0x21, 0x01, 0x71, 0x70, 0x47, 0x00, 0xbf, 0x8c, 0x7e, 0x08, 0x00, + 0x80, 0x14, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x46, 0x07, 0x48, 0x01, 0x68, + 0x80, 0x20, 0x88, 0x47, 0x06, 0x48, 0x1c, 0x21, 0x02, 0x68, 0x20, 0x46, + 0x90, 0x47, 0x05, 0x48, 0x4f, 0xf4, 0x66, 0x71, 0x40, 0xf8, 0x24, 0x10, + 0x10, 0xbd, 0x00, 0xbf, 0xc0, 0xfe, 0x08, 0x00, 0xd0, 0xfe, 0x08, 0x00, + 0x00, 0xf4, 0x00, 0x30, 0x30, 0x28, 0x05, 0xd8, 0x08, 0x4a, 0x10, 0x5c, + 0x0e, 0x28, 0x08, 0x70, 0x05, 0xd3, 0x06, 0xe0, 0x32, 0x28, 0x04, 0xd1, + 0x03, 0x48, 0x00, 0x78, 0x08, 0x70, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, + 0x70, 0x47, 0x00, 0xbf, 0x94, 0x32, 0x06, 0x00, 0x4c, 0xeb, 0x01, 0x00, + 0x03, 0x48, 0x04, 0x49, 0x01, 0x60, 0x04, 0x48, 0x04, 0x49, 0x01, 0x60, + 0x70, 0x47, 0x00, 0xbf, 0xf4, 0xfe, 0x08, 0x00, 0x41, 0xc9, 0x05, 0x00, + 0xec, 0xfe, 0x08, 0x00, 0x99, 0xc8, 0x05, 0x00, 0x05, 0x28, 0x0e, 0xd8, + 0xb0, 0xb5, 0x07, 0x4c, 0x00, 0x25, 0x44, 0xf8, 0x20, 0x50, 0x06, 0x4d, + 0x45, 0xf8, 0x20, 0x20, 0x0b, 0x4a, 0x42, 0xf8, 0x20, 0x10, 0x44, 0xf8, + 0x20, 0x30, 0xbd, 0xe8, 0xb0, 0x40, 0x70, 0x47, 0x60, 0x10, 0x00, 0x40, + 0xa0, 0x10, 0x00, 0x40, 0x05, 0x48, 0x00, 0x21, 0x01, 0x64, 0x05, 0x49, + 0xc0, 0xf8, 0x80, 0x10, 0x04, 0x49, 0x01, 0x60, 0x04, 0x21, 0x01, 0x64, + 0x70, 0x47, 0x00, 0xbf, 0x20, 0x10, 0x00, 0x40, 0x60, 0xca, 0x05, 0x00, + 0x7c, 0xb4, 0x12, 0x10, 0x05, 0x48, 0x00, 0x21, 0x01, 0x64, 0x05, 0x49, + 0xc0, 0xf8, 0x80, 0x10, 0x04, 0x49, 0x01, 0x60, 0x08, 0x21, 0x01, 0x64, + 0x70, 0x47, 0x00, 0xbf, 0x24, 0x10, 0x00, 0x40, 0x64, 0xca, 0x05, 0x00, + 0xc8, 0xb4, 0x12, 0x10, 0x05, 0x48, 0x00, 0x21, 0x01, 0x64, 0x05, 0x49, + 0xc0, 0xf8, 0x80, 0x10, 0x04, 0x49, 0x01, 0x60, 0x10, 0x21, 0x01, 0x64, + 0x70, 0x47, 0x00, 0xbf, 0x28, 0x10, 0x00, 0x40, 0x6c, 0xca, 0x05, 0x00, + 0x7c, 0xa0, 0x12, 0x10, 0x05, 0x48, 0x00, 0x21, 0x01, 0x64, 0x05, 0x49, + 0xc0, 0xf8, 0x80, 0x10, 0x04, 0x49, 0x01, 0x60, 0x10, 0x21, 0x01, 0x64, + 0x70, 0x47, 0x00, 0xbf, 0x2c, 0x10, 0x00, 0x40, 0x7c, 0xca, 0x05, 0x00, + 0x4c, 0xa3, 0x12, 0x10, 0x80, 0xb5, 0xff, 0xf7, 0xb5, 0xff, 0xff, 0xf7, + 0xc5, 0xff, 0xff, 0xf7, 0xd5, 0xff, 0xbd, 0xe8, 0x80, 0x40, 0xff, 0xf7, + 0xe3, 0xbf, 0x00, 0x00, 0x70, 0x47, 0x2b, 0xe0, 0x04, 0xb4, 0x0a, 0x46, + 0x02, 0xbc, 0xf9, 0xe0, 0x06, 0xb5, 0x02, 0x4a, 0x11, 0x68, 0x88, 0x47, + 0x06, 0xbd, 0x00, 0x00, 0xdc, 0x9b, 0x08, 0x00, 0x06, 0xb5, 0x02, 0x4a, + 0x11, 0x68, 0x88, 0x47, 0x06, 0xbd, 0x00, 0x00, 0xe0, 0x9b, 0x08, 0x00, + 0x30, 0x32, 0x30, 0x30, 0x38, 0x35, 0x36, 0x37, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0xb5, 0x00, 0xf0, 0x71, 0xf9, 0x2d, 0x48, 0x2d, 0x49, 0x6f, 0xf0, + 0x02, 0x02, 0x03, 0x78, 0x03, 0xeb, 0x03, 0x10, 0x01, 0xeb, 0xc0, 0x00, + 0x90, 0xf8, 0x49, 0x10, 0x02, 0xeb, 0x51, 0x11, 0x02, 0x29, 0x9c, 0xbf, + 0x01, 0x21, 0x80, 0xf8, 0x84, 0x10, 0x90, 0xf8, 0x24, 0x00, 0x25, 0x49, + 0xc8, 0x54, 0xa0, 0xf1, 0x31, 0x05, 0x0a, 0x78, 0x4c, 0x78, 0x01, 0x21, + 0x02, 0x2d, 0x08, 0xd3, 0xa0, 0xf1, 0x63, 0x05, 0x02, 0x2d, 0x04, 0xd3, + 0xa0, 0xf1, 0x33, 0x01, 0xb1, 0xfa, 0x81, 0xf1, 0x49, 0x09, 0x00, 0x2b, + 0x08, 0xbf, 0x22, 0x46, 0xa2, 0xf1, 0x31, 0x04, 0x01, 0x23, 0x02, 0x2c, + 0x0b, 0xd3, 0xa2, 0xf1, 0x63, 0x04, 0x02, 0x2c, 0x07, 0xd3, 0xa2, 0xf1, + 0x33, 0x03, 0xb3, 0xfa, 0x83, 0xf3, 0x4f, 0xea, 0x53, 0x13, 0x02, 0xb9, + 0x70, 0xb1, 0x01, 0xb1, 0x32, 0xb1, 0x0b, 0xb1, 0x20, 0xb1, 0x19, 0xb9, + 0xbd, 0xe8, 0xb0, 0x40, 0xf8, 0xf7, 0xd4, 0xba, 0x10, 0x48, 0x00, 0x21, + 0x01, 0x60, 0x10, 0x48, 0x01, 0x60, 0xb0, 0xbd, 0x26, 0x4c, 0xe4, 0x69, + 0x00, 0x2c, 0xfa, 0xd1, 0x23, 0x4c, 0xe4, 0x69, 0x00, 0x2c, 0xf6, 0xd1, + 0x07, 0x4c, 0x24, 0x68, 0x00, 0x2c, 0xf2, 0xd1, 0x06, 0x4c, 0x24, 0x68, + 0x00, 0x2c, 0xee, 0xd1, 0xdf, 0xe7, 0x00, 0xbf, 0x74, 0x87, 0x08, 0x00, + 0xfc, 0x6d, 0x01, 0x00, 0x7c, 0x2c, 0x06, 0x00, 0x90, 0x01, 0x00, 0x00, + 0xc8, 0x6d, 0x01, 0x00, 0x10, 0xd6, 0x05, 0x30, 0x10, 0xee, 0x05, 0x30, + 0x01, 0x48, 0x00, 0x21, 0xc1, 0x70, 0x70, 0x47, 0x3c, 0x88, 0x01, 0x00, + 0xb0, 0xb5, 0x12, 0x4d, 0x04, 0x46, 0x95, 0xf8, 0x6d, 0x00, 0x58, 0xb1, + 0x11, 0x48, 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x01, 0x28, 0x01, 0xd1, + 0x01, 0x20, 0xb0, 0xbd, 0x0c, 0x48, 0xc0, 0x69, 0x20, 0xb9, 0x10, 0xe0, + 0x0a, 0x48, 0xc0, 0x69, 0x00, 0x28, 0xef, 0xd0, 0x08, 0x48, 0x90, 0xf8, + 0x33, 0x00, 0x40, 0xb9, 0xa8, 0x7d, 0x01, 0x28, 0x05, 0xd1, 0x07, 0x48, + 0x01, 0x68, 0x20, 0x46, 0x88, 0x47, 0x01, 0x28, 0xe8, 0xd0, 0x00, 0x20, + 0xb0, 0xbd, 0x00, 0xbf, 0xc8, 0x5c, 0x01, 0x00, 0x38, 0x5d, 0x01, 0x00, + 0x08, 0xd3, 0x08, 0x00, 0x04, 0xd3, 0x08, 0x00, 0x2d, 0xe9, 0xfe, 0x4f, + 0x04, 0x46, 0x51, 0x48, 0x00, 0x68, 0x80, 0x47, 0xa0, 0x46, 0x06, 0x46, + 0xdf, 0xf8, 0x3c, 0xb1, 0x18, 0xf8, 0x14, 0x0f, 0xdb, 0xf8, 0x00, 0x20, + 0x18, 0xf8, 0x02, 0x1c, 0x47, 0x46, 0x8d, 0xf8, 0x04, 0x00, 0x18, 0xf8, + 0x0b, 0x0c, 0x8d, 0xf8, 0x05, 0x10, 0x17, 0xf8, 0x0c, 0x1d, 0x8d, 0xf8, + 0x07, 0x00, 0x0a, 0x20, 0x8d, 0xf8, 0x06, 0x10, 0x01, 0xa9, 0x90, 0x47, + 0x44, 0x48, 0x00, 0x78, 0x01, 0x28, 0x06, 0xd1, 0x43, 0x49, 0x98, 0xf8, + 0x00, 0x00, 0x09, 0x88, 0x08, 0x43, 0x42, 0x49, 0x08, 0x60, 0x42, 0x48, + 0x00, 0x2e, 0x00, 0xf1, 0x28, 0x05, 0x4b, 0xd0, 0xe9, 0x46, 0x0d, 0xf1, + 0x04, 0x0a, 0xb2, 0x7c, 0x30, 0x7a, 0x71, 0x7a, 0x33, 0x7d, 0x8d, 0xf8, + 0x01, 0x20, 0xdb, 0xf8, 0x00, 0x20, 0x8d, 0xf8, 0x02, 0x00, 0x8d, 0xf8, + 0x03, 0x10, 0x0b, 0x20, 0x49, 0x46, 0x8d, 0xf8, 0x00, 0x30, 0x90, 0x47, + 0xa0, 0x7c, 0xb1, 0x7c, 0x81, 0x42, 0x2d, 0xd9, 0x41, 0xf2, 0x38, 0x30, + 0x51, 0x46, 0x52, 0x46, 0xad, 0xf8, 0x08, 0x00, 0x20, 0x8a, 0x01, 0x38, + 0x01, 0x90, 0x30, 0x48, 0x03, 0x68, 0x38, 0x46, 0x98, 0x47, 0x30, 0x8a, + 0x20, 0xb9, 0xf1, 0x7c, 0x49, 0x07, 0x01, 0xd4, 0xb1, 0x68, 0x0c, 0xe0, + 0xb1, 0x68, 0x01, 0x9a, 0x8b, 0x1a, 0x1b, 0x01, 0x1f, 0xd4, 0x91, 0x42, + 0x04, 0xd1, 0xb2, 0x89, 0xbd, 0xf8, 0x08, 0x30, 0x93, 0x42, 0x18, 0xd8, + 0x10, 0xb9, 0x3a, 0x68, 0x91, 0x42, 0x14, 0xd0, 0x69, 0x68, 0x21, 0xb9, + 0x10, 0xb9, 0xf0, 0x7c, 0x40, 0x07, 0x00, 0xd5, 0x6e, 0x60, 0xf0, 0x7c, + 0x40, 0x07, 0x06, 0xd4, 0x17, 0x48, 0x00, 0x68, 0x80, 0x47, 0x06, 0x46, + 0x00, 0x28, 0xb6, 0xd1, 0x00, 0x26, 0x2e, 0x60, 0x20, 0x46, 0xbd, 0xe8, + 0xfe, 0x8f, 0x27, 0x48, 0x01, 0x68, 0x30, 0x46, 0x88, 0x47, 0x06, 0x46, + 0x80, 0x68, 0x01, 0x99, 0x42, 0x1a, 0x12, 0x01, 0x06, 0xd4, 0x88, 0x42, + 0x0c, 0xd1, 0xb0, 0x89, 0xbd, 0xf8, 0x08, 0x10, 0x81, 0x42, 0x07, 0xd9, + 0x10, 0x48, 0x06, 0xf1, 0x14, 0x01, 0x02, 0x68, 0x0c, 0x20, 0x90, 0x47, + 0x34, 0x46, 0xe3, 0xe7, 0x6e, 0x60, 0x41, 0x46, 0xf0, 0x7c, 0x40, 0x07, + 0x48, 0xbf, 0x2e, 0x60, 0x09, 0x48, 0x02, 0x68, 0x0d, 0x20, 0x90, 0x47, + 0xd8, 0xe7, 0x00, 0xbf, 0xe0, 0xa1, 0x08, 0x00, 0x1c, 0xa1, 0x08, 0x00, + 0x6f, 0x34, 0x01, 0x00, 0x26, 0x21, 0x01, 0x00, 0x04, 0x08, 0x00, 0x40, + 0xfc, 0x70, 0x01, 0x00, 0x48, 0xa1, 0x08, 0x00, 0x98, 0xa1, 0x08, 0x00, + 0x06, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x48, 0x07, 0x49, 0x01, 0x60, + 0x07, 0x48, 0x08, 0x49, 0x01, 0x60, 0x08, 0x48, 0x08, 0x49, 0x01, 0x60, + 0x70, 0x47, 0x00, 0xbf, 0x84, 0xb7, 0x08, 0x00, 0x71, 0xcb, 0x05, 0x00, + 0xd0, 0xa0, 0x08, 0x00, 0x99, 0xca, 0x05, 0x00, 0x98, 0xeb, 0x08, 0x00, + 0x7d, 0xcb, 0x05, 0x00, 0xe8, 0xa1, 0x08, 0x00, 0xd9, 0xcb, 0x05, 0x00, + 0x42, 0xf6, 0x49, 0x4c, 0xc1, 0xf2, 0x10, 0x0c, 0x60, 0x47, 0xfe, 0xde, + 0x70, 0xb5, 0x05, 0x46, 0x80, 0x69, 0x0c, 0x46, 0x00, 0x78, 0x02, 0x28, + 0x13, 0xd1, 0x0e, 0x48, 0x00, 0x68, 0x80, 0x47, 0x01, 0x28, 0x0b, 0xd0, + 0x0c, 0x48, 0xa5, 0xf1, 0xb8, 0x06, 0x01, 0x68, 0x30, 0x46, 0x88, 0x47, + 0x01, 0x28, 0x03, 0xd0, 0x30, 0x6a, 0x08, 0xb9, 0xb0, 0x68, 0x40, 0xb1, + 0x07, 0x48, 0x01, 0x21, 0x01, 0x70, 0x28, 0x46, 0x21, 0x46, 0xbd, 0xe8, + 0x70, 0x40, 0x00, 0xf0, 0x11, 0xb8, 0x03, 0x48, 0x00, 0x21, 0xf5, 0xe7, + 0x74, 0xcf, 0x08, 0x00, 0x4c, 0x9d, 0x08, 0x00, 0x7e, 0x2c, 0x06, 0x00, + 0x01, 0x48, 0x02, 0x49, 0x01, 0x60, 0x70, 0x47, 0xbc, 0xa0, 0x08, 0x00, + 0x8d, 0xcd, 0x05, 0x00, 0x41, 0xf6, 0x09, 0x4c, 0xc1, 0xf2, 0x10, 0x0c, + 0x60, 0x47, 0xfe, 0xde, 0xa5, 0x00, 0x00, 0x00, 0x59, 0x01, 0x00, 0x00, + 0xde, 0x03, 0x00, 0x00, 0x59, 0x01, 0x00, 0x00, 0x59, 0x01, 0x00, 0x00, + 0x59, 0x01, 0x00, 0x00, 0x7c, 0x01, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, + 0xc0, 0x03, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, + 0x96, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, + 0x96, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, + 0x96, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc5, 0x19, 0x02, 0x00, 0xcd, 0x19, 0x02, 0x00, + 0x09, 0x1a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x79, 0x1b, 0x02, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x22, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x48, 0x02, 0x00, 0xb8, 0x4a, 0x02, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb8, 0x4a, 0x02, 0x00, 0x58, 0xe3, 0x01, 0x10, + 0x50, 0x61, 0x74, 0x63, 0x68, 0x20, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x20, 0x50, 0x46, 0x3d, 0x57, 0x43, 0x4e, 0x37, 0x38, 0x35, 0x30, + 0x52, 0x4f, 0x4d, 0x3d, 0x20, 0x30, 0x32, 0x30, 0x30, 0x20, 0x42, 0x55, + 0x49, 0x4c, 0x44, 0x3d, 0x42, 0x54, 0x46, 0x57, 0x2e, 0x48, 0x41, 0x4d, + 0x49, 0x4c, 0x54, 0x4f, 0x4e, 0x2e, 0x32, 0x2e, 0x30, 0x2e, 0x30, 0x2d, + 0x30, 0x30, 0x37, 0x39, 0x39, 0x2d, 0x55, 0x53, 0x42, 0x5f, 0x50, 0x41, + 0x54, 0x43, 0x48, 0x5a, 0x2d, 0x35, 0x00, 0x00, 0x04, 0x00, 0xff, 0x00, + 0x41, 0xe3, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0xc9, 0x5c, 0x02, 0x00, + 0x0a, 0x00, 0xff, 0x00, 0xed, 0xc4, 0x02, 0x00, 0x0c, 0x00, 0xff, 0x01, + 0xc5, 0x64, 0x02, 0x00, 0x17, 0x00, 0xff, 0x00, 0x01, 0x5a, 0x02, 0x00, + 0x19, 0x00, 0xff, 0x02, 0xe9, 0x5c, 0x02, 0x00, 0x1a, 0x00, 0xff, 0x00, + 0x45, 0x5b, 0x02, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x95, 0x5e, 0x02, 0x00, + 0x24, 0x00, 0x02, 0x00, 0x95, 0x5a, 0x02, 0x00, 0x3a, 0x00, 0xff, 0x00, + 0x31, 0x5f, 0x02, 0x00, 0x3b, 0x00, 0xff, 0x00, 0xc1, 0x61, 0x02, 0x00, + 0x51, 0x00, 0xff, 0x00, 0x11, 0xd9, 0x04, 0x00, 0x59, 0x00, 0xff, 0x00, + 0xb1, 0x61, 0x02, 0x00, 0xda, 0x00, 0xff, 0x00, 0x2d, 0x54, 0x02, 0x00, + 0xdd, 0x00, 0xff, 0x00, 0xc1, 0x52, 0x02, 0x00, 0x57, 0x01, 0xff, 0x00, + 0x5d, 0x08, 0x03, 0x00, 0x5e, 0x01, 0xff, 0x00, 0xed, 0xba, 0x04, 0x00, + 0x5f, 0x01, 0xff, 0x00, 0xa9, 0xc5, 0x02, 0x00, 0x70, 0x01, 0xff, 0x00, + 0xb5, 0x0c, 0x03, 0x00, 0x91, 0x01, 0xff, 0x00, 0x5d, 0x6a, 0x02, 0x00, + 0xf1, 0x01, 0xff, 0x00, 0x29, 0x54, 0x02, 0x00, 0xff, 0x03, 0xff, 0x00, + 0x75, 0x5f, 0x02, 0x00, 0x01, 0x02, 0x0f, 0x00, 0x10, 0x00, 0x72, 0x00, + 0x5f, 0x00, 0x4c, 0x00, 0x39, 0x00, 0x26, 0x00, 0x29, 0x1e, 0x14, 0x33, + 0x1e, 0x1e, 0x3d, 0x1e, 0x2d, 0x47, 0x1e, 0x46, 0x51, 0x1e, 0x78, 0x5b, + 0x1c, 0x96, 0x64, 0x1c, 0xfa, 0x00, 0x03, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x02, 0x00, 0x08, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x01, 0x0b, 0x00, + 0x00, 0x02, 0x0e, 0x00, 0x00, 0x10, 0x0f, 0x00, 0x00, 0x20, 0x03, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x10, 0x00, 0x0a, 0x00, 0x00, 0x04, 0x0b, 0x00, + 0x00, 0x08, 0x0e, 0x00, 0x00, 0x40, 0x0f, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x18, 0x00, 0x02, 0x00, 0x75, 0xef, 0x02, 0x00, 0x19, 0x00, 0x03, 0x00, + 0xc1, 0xef, 0x02, 0x00, 0xff, 0xff, 0x07, 0x08, 0x09, 0x08, 0x07, 0x06, + 0x05, 0x06, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbd, 0xf0, 0x03, 0x00, 0x5b, 0x2a, 0x09, 0x10, + 0xd7, 0x2c, 0x09, 0x10, 0x8f, 0x2d, 0x09, 0x10, 0xa5, 0xf1, 0x03, 0x00, + 0x1b, 0x30, 0x09, 0x10, 0x35, 0xf2, 0x03, 0x00, 0x67, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x96, 0x00, 0x03, 0xff, 0x09, 0x74, 0x0d, 0x10, + 0x9b, 0x74, 0x0d, 0x10, 0x11, 0x9e, 0x04, 0x00, 0x69, 0x9e, 0x04, 0x00, + 0xcd, 0x9e, 0x04, 0x00, 0xf3, 0x84, 0x0d, 0x10, 0x91, 0x6a, 0x0f, 0x10, + 0x24, 0x00, 0x00, 0x00, 0x8d, 0xc0, 0x0d, 0x10, 0xfd, 0xaa, 0x04, 0x00, + 0x29, 0xc1, 0x0d, 0x10, 0x0d, 0xab, 0x04, 0x00, 0x3d, 0xc7, 0x0d, 0x10, + 0x1f, 0xc8, 0x0d, 0x10, 0x91, 0x6a, 0x0f, 0x10, 0x23, 0x00, 0x00, 0x00, + 0x46, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0d, 0x00, + 0x66, 0x2b, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x74, 0x2b, + 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x75, 0x2b, 0x06, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x0a, 0x00, 0xc9, 0x24, 0x05, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x0d, 0x00, 0x1c, 0xb1, 0x07, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x42, 0x06, 0x03, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0a, 0x00, + 0xdd, 0x05, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1d, 0x00, 0x92, 0x3c, + 0x0b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x94, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x0a, 0x00, 0xc8, 0x21, 0x07, 0x0a, 0x0b, 0x00, + 0x39, 0x00, 0x03, 0x22, 0x08, 0x09, 0x0b, 0x00, 0x0a, 0x00, 0xbb, 0x22, + 0x06, 0x0a, 0x0b, 0x00, 0x0a, 0x00, 0x61, 0x32, 0x09, 0x09, 0x0b, 0x00, + 0x80, 0xff, 0x80, 0xff, 0x61, 0x4f, 0x11, 0x10, 0x25, 0x37, 0x05, 0x00, + 0x15, 0x51, 0x11, 0x10, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x56, 0x04, 0x71, 0x0b, 0x3e, 0x22, 0x9e, 0x00, + 0xa9, 0xa6, 0x56, 0x1f, 0x25, 0xfa, 0x3e, 0x0e, 0x85, 0x45, 0xab, 0x53, + 0xa7, 0x2b, 0x4b, 0xe6, 0xd7, 0x8f, 0xfe, 0x8e, 0xe4, 0x33, 0x99, 0xbc, + 0xcb, 0x6c, 0x5e, 0xe4 +}; +unsigned int rampatch_usb_00190200_bin_len = 250276; +unsigned char nvm_usb_00190200_bin[] = { + 0x02, 0xfa, 0x24, 0x00, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x42, 0x54, 0x46, 0x57, 0x2e, 0x48, 0x41, 0x4d, + 0x49, 0x4c, 0x54, 0x4f, 0x4e, 0x2e, 0x32, 0x2e, 0x30, 0x2e, 0x30, 0x2d, + 0x30, 0x30, 0x37, 0x39, 0x39, 0x2d, 0x55, 0x53, 0x42, 0x5f, 0x50, 0x41, + 0x54, 0x43, 0x48, 0x5a, 0x2d, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x5a, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xfe, 0x0f, 0xfe, 0xd8, 0x3f, 0x7b, 0x87, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x7d, 0x7f, 0xfc, 0x01, 0x01, + 0x11, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x15, 0x11, 0x22, 0x00, 0x2e, 0x00, 0x16, 0x00, 0x72, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x06, 0xb8, 0x0b, 0x00, 0x00, + 0x06, 0x08, 0x08, 0x20, 0xf4, 0x01, 0xc8, 0x00, 0x0a, 0x00, 0x80, 0x0c, + 0x14, 0x00, 0x10, 0x00, 0x1f, 0x06, 0x14, 0x08, 0x14, 0x04, 0x14, 0x06, + 0x00, 0x10, 0x00, 0x08, 0xd0, 0x02, 0x00, 0x02, 0x68, 0x01, 0x06, 0x16, + 0x08, 0x18, 0x0c, 0x1c, 0x03, 0x01, 0x68, 0x01, 0x12, 0x02, 0x04, 0x06, + 0x28, 0x00, 0x50, 0x00, 0x28, 0x00, 0x50, 0x00, 0x50, 0x00, 0x03, 0x00, + 0x3c, 0x00, 0x28, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x50, 0x00, 0x40, 0x01, + 0x50, 0x00, 0x0a, 0x00, 0x40, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x26, 0x00, + 0x20, 0x00, 0x16, 0x00, 0x00, 0x04, 0x50, 0x00, 0xf0, 0x00, 0x20, 0x00, + 0x02, 0x50, 0x00, 0x05, 0xa0, 0x00, 0x64, 0x5a, 0x46, 0x32, 0x1e, 0x02, + 0x1b, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x02, 0x02, 0x0a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x2c, 0x01, 0x00, 0x10, 0x00, 0x00, 0x14, 0xf4, 0x00, 0x00, + 0x33, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1f, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, + 0x0a, 0x23, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x02, 0x00, 0x00, 0x81, 0x02, 0x00, 0x00, 0x82, 0x02, 0x00, + 0x00, 0x83, 0x02, 0x00, 0x00, 0x84, 0x02, 0x00, 0x00, 0x85, 0x02, 0x00, + 0x00, 0x86, 0x02, 0x00, 0x00, 0x27, 0x03, 0x00, 0x00, 0x28, 0x03, 0x00, + 0x00, 0x29, 0x03, 0x00, 0x00, 0xaa, 0x03, 0x00, 0x00, 0xab, 0x87, 0x00, + 0x00, 0x80, 0x0a, 0x00, 0x00, 0x81, 0x0a, 0x00, 0x00, 0x82, 0x0a, 0x00, + 0x00, 0x83, 0x0a, 0x00, 0x00, 0x84, 0x0a, 0x00, 0x00, 0x85, 0x0a, 0x00, + 0x00, 0x86, 0x0a, 0x00, 0x00, 0x27, 0x0b, 0x00, 0x00, 0x28, 0x0b, 0x00, + 0x00, 0x29, 0x0b, 0x00, 0x00, 0xaa, 0x0b, 0x00, 0x00, 0xab, 0x0f, 0x00, + 0x00, 0x8f, 0x0a, 0x00, 0x00, 0x8e, 0x0a, 0x00, 0x00, 0x8d, 0x0a, 0x00, + 0x00, 0x8c, 0x0a, 0x00, 0x00, 0x0b, 0x0b, 0x0b, 0x02, 0x08, 0x00, 0x00, + 0x0b, 0x00, 0x0b, 0x0b, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x13, + 0x00, 0x24, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x07, 0x00, 0x09, 0x0a, 0x0a, 0x0a, 0x00, 0x00, 0x09, 0x08, + 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0c, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x16, 0x91, 0xa7, + 0x02, 0x00, 0x00, 0x40, 0x66, 0x16, 0x91, 0xa7, 0x02, 0x54, 0x01, 0x00, + 0x00, 0x25, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x01, 0x01, 0x03, 0x03, 0x03, 0x00, 0x03, 0x03, + 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x14, 0x00, + 0x00, 0xef, 0x02, 0x3d, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2b, 0xf4, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x0a, 0x00, 0x26, 0x00, 0x5c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x30, + 0x17, 0x68, 0x09, 0x70, 0x00, 0x01, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3a, 0x08, 0x00, 0x01, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0xc8, 0x03, 0x80, + 0x82, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x08, 0x32, 0x32, 0x00, 0x00, 0x60, 0xea, 0x2c, + 0x01, 0x05, 0x0f, 0x03, 0x00, 0xff, 0x01, 0x00, 0x00, 0x40, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe8, + 0x03, 0x14, 0x14, 0x00, 0x00, 0x27, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xe5, 0xea, 0xef, 0xf4, 0xf9, 0xfe, + 0x03, 0x08, 0x0c, 0x10, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf4, 0x00, 0x2a, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xce, 0xdd, 0xb2, 0x03, 0x00, 0x01, + 0x1f, 0x01, 0x42, 0x01, 0x69, 0x01, 0x95, 0x01, 0xc7, 0x01, 0xfe, 0x01, + 0x3d, 0x02, 0x83, 0x02, 0xd1, 0x02, 0x29, 0x03, 0x00, 0x0a, 0x10, 0x00, + 0x1f, 0x00, 0x3f, 0x00, 0x7f, 0x00, 0xfd, 0x00, 0xf9, 0x01, 0xf1, 0x03, + 0xde, 0x07, 0x00, 0x00, 0x9f, 0x01, 0x03, 0x07, 0x00, 0x00, 0x22, 0x02, + 0x00, 0x02, 0x2c, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf4, 0x01, 0x34, 0x08, 0x00, 0x50, 0xff, 0x58, 0x02, 0x00, + 0x22, 0x00, 0x00, 0x00, 0x00, 0x28, 0xa0, 0x62, 0x03, 0x64, 0x01, 0x01, + 0x0a, 0x00, 0x00, 0x10, 0x00, 0x00, 0xdc, 0x05, 0x28, 0x0a, 0x00, 0xa0, + 0xff, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x90, 0x01, 0x58, 0x02, 0x8f, 0x01, 0x0a, 0x01, 0x00, 0x02, + 0x03, 0x00, 0x02, 0x03, 0x0c, 0x00, 0x03, 0x00, 0x36, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, 0x00, 0xfa, 0x00, + 0x39, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x0a, 0x02, 0x4f, 0x03, 0x0d, 0x01, 0x10, 0x03, 0x05, + 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0xb0, 0x03, 0x06, 0x00, 0x58, 0x02, + 0x03, 0x01, 0x0a, 0x06, 0x10, 0x01, 0x01, 0x0f, 0x0a, 0x05, 0x28, 0x00, + 0x40, 0x1f, 0x0a, 0x03, 0x01, 0x05, 0x0c, 0x01, 0x3c, 0x00, 0xa4, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xfa, 0x02, 0x32, + 0xc0, 0xa3, 0x00, 0x1e, 0xc0, 0xa3, 0x00, 0x0f, 0xc0, 0xa3, 0x00, 0x12, + 0x7f, 0xbe, 0xfe, 0x00, 0x3b, 0xfb, 0xfd, 0x00, 0xba, 0x53, 0xff, 0x00, + 0x6c, 0xac, 0xe6, 0xff, 0x29, 0xea, 0xdf, 0xff, 0x41, 0x73, 0xed, 0xff, + 0x19, 0x94, 0x15, 0x00, 0xcc, 0xcc, 0xcc, 0x00, 0x0e, 0x00, 0x00, 0x10, + 0xf7, 0xb0, 0xfe, 0x00, 0x25, 0xd9, 0xfc, 0x00, 0xf3, 0xbc, 0xff, 0x00, + 0x46, 0xda, 0x19, 0x00, 0x17, 0x0c, 0x28, 0x00, 0xc5, 0x93, 0x0b, 0x00, + 0x24, 0xec, 0xa7, 0xff, 0x66, 0x66, 0x66, 0x00, 0x09, 0x00, 0x00, 0x10, + 0xf7, 0xb0, 0xfe, 0x00, 0x25, 0xd9, 0xfc, 0x00, 0xf3, 0xbc, 0xff, 0x00, + 0x46, 0xda, 0x19, 0x00, 0x17, 0x0c, 0x28, 0x00, 0xc5, 0x93, 0x0b, 0x00, + 0x24, 0xec, 0xa7, 0xff, 0x66, 0x66, 0x66, 0x00, 0x09, 0x00, 0x00, 0x10, + 0x7f, 0xbe, 0xfe, 0x00, 0x3b, 0xfb, 0xfd, 0x00, 0xba, 0x53, 0xff, 0x00, + 0x6c, 0xac, 0xe6, 0xff, 0x29, 0xea, 0xdf, 0xff, 0x41, 0x73, 0xed, 0xff, + 0x19, 0x94, 0x15, 0x00, 0xcd, 0xcc, 0x4c, 0x00, 0x05, 0x00, 0x60, 0x0f, + 0x00, 0x99, 0x99, 0x99, 0x3e, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x59, 0x1f, 0x0f, 0x0f, 0x02, 0x00, + 0x02, 0x01, 0xff, 0xff, 0x01, 0x00, 0xd0, 0x07, 0x00, 0x34, 0x1a, 0x04, + 0xe8, 0x03, 0x07, 0x05, 0x03, 0x03, 0x05, 0x00, 0xf4, 0x01, 0x01, 0x05, + 0xa0, 0x19, 0x20, 0x10, 0x20, 0x1c, 0xe0, 0x2e, 0x30, 0x2a, 0x00, 0x32, + 0x80, 0x25, 0xd4, 0x30, 0x32, 0x1e, 0x64, 0x00, 0x40, 0x00, 0xf8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x0a, + 0x0c, 0x0e, 0x10, 0x40, 0x12, 0x14, 0x16, 0x1e, 0x20, 0x22, 0x24, 0x28, + 0x2e, 0x32, 0x34, 0x38, 0x3a, 0x3c, 0x3e, 0x40, 0x42, 0x44, 0x48, 0x4a, + 0x4c, 0x4e, 0x50, 0x5a, 0x60, 0x66, 0x6e, 0x70, 0x72, 0x74, 0x76, 0x78, + 0x7a, 0xe6, 0x00, 0x13, 0x5e, 0x6b, 0x6b, 0x6b, 0x3e, 0xbe, 0x7b, 0x6d, + 0x7c, 0x7c, 0x7e, 0x46, 0x7a, 0x74, 0x76, 0x7a, 0x78, 0x76, 0x6e, 0x5a, + 0x5a, 0x01, 0x38, 0x00, 0xd0, 0x07, 0xe0, 0x2e, 0x00, 0x00, 0x05, 0x01, + 0x38, 0x00, 0x41, 0x00, 0x10, 0x01, 0x01, 0x04, 0x00, 0x61, 0x3c, 0x30, + 0x30, 0x20, 0x70, 0x30, 0x00, 0x30, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x00, 0x12, 0x12, 0x01, 0xdf, 0xf7, 0xd7, 0xff, 0xff, 0x4f, 0xdd, 0xff, + 0xff, 0x5f, 0xfd, 0x5f, 0x55, 0x5f, 0x7f, 0xd5, 0xd7, 0xd7, 0x7f, 0x55, + 0x57, 0x75, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0xe7, + 0x00, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0xfc, 0xff, 0x07, 0x0f, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x56, 0x05, 0x00, 0x00, 0x01, 0x01, 0x01, 0x18, + 0x30, 0x02, 0x04, 0x07, 0x90, 0x01, 0x60, 0x00, 0x0a, 0xff, 0x64, 0x32, + 0x50, 0x28, 0xdc, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc6, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x01, 0x04, 0x00, 0x02, 0x96, 0x01, 0x32, 0x32, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x55, 0xa9, 0xaa, 0xaa, 0xaa, 0xaa, 0x96, 0xaa, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x15, 0x00, 0x00, 0x8a, 0xaa, 0x02, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x50, 0xc3, 0x00, 0x00, 0x48, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x17, 0xe0, 0xef, 0xff, 0xff, 0xff, 0xff, 0x03, 0x49, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf3, 0x01, 0x00, + 0x31, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x12, 0x30, 0x12, 0x94, 0x44, 0x94, 0x7c, 0x30, + 0x08, 0x02, 0x22, 0x3e, 0x3e, 0x02, 0x1e, 0x44, 0xe2, 0x30, 0x26, 0x54, + 0x1b, 0x1c, 0x9e, 0xff, 0xff, 0x44, 0xd6, 0xff, 0x08, 0x1a, 0x4e, 0x9a, + 0x08, 0x16, 0x4e, 0x9a, 0x30, 0x0c, 0x7c, 0x82, 0x36, 0x86, 0xae, 0x9e, + 0xd0, 0x68, 0x68, 0x68, 0x0c, 0x82, 0x8c, 0x3a, 0xbc, 0xc0, 0xd0, 0xb8, + 0xc8, 0x0e, 0x30, 0xaa, 0x5d, 0xaa, 0x58, 0x22, 0x90, 0x90, 0xcc, 0xda, + 0x12, 0x1e, 0x30, 0x12, 0x1e, 0x0c, 0x40, 0x8c, 0xae, 0xd0, 0x30, 0x04, + 0x48, 0xaa, 0xdc, 0xde, 0xdc, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0xd4, + 0xff, 0x24, 0x62, 0xa4, 0xb8, 0xc4, 0x0a, 0xe0, 0x0a, 0x0d, 0x5e, 0x6e, + 0x6e, 0x74, 0x78, 0x28, 0x2a, 0x2a, 0x2a, 0x2a, 0xa4, 0xc8, 0x50, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x53, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x00, 0x01, 0x03, 0x05, 0x08, 0x01, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x55, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x02, 0xfb, 0x53, 0x21, 0x00, 0x57, + 0x00, 0x5d, 0x00, 0x6a, 0x00, 0x6f, 0x00, 0x01, 0x02, 0x28, 0x23, 0x40, + 0x1f, 0x70, 0x17, 0xa0, 0x0f, 0x0a, 0x02, 0x7f, 0x00, 0x84, 0x03, 0x83, + 0x03, 0x02, 0x1e, 0xde, 0x00, 0x00, 0x00, 0x27, 0x00, 0x07, 0x05, 0x00, + 0x06, 0x05, 0x00, 0x07, 0x05, 0x00, 0x06, 0x05, 0x00, 0x07, 0x04, 0x00, + 0x06, 0x05, 0x00, 0x07, 0x05, 0x00, 0x06, 0x05, 0x00, 0xa9, 0x03, 0xa9, + 0x03, 0xa9, 0x03, 0xa9, 0x03, 0x14, 0x00, 0x68, 0x27, 0x24, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x79, 0x80, 0x20, 0x00, 0x00, 0x00, + 0x64, 0x07, 0x02, 0x00, 0x00, 0x00, 0x04, 0x01, 0xe6, 0x05, 0x00, 0x56, + 0x00, 0x5c, 0x00, 0x65, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x01, 0x64, 0x85, + 0x00, 0x6e, 0x69, 0x5f, 0x55, 0x00, 0x20, 0x30, 0x40, 0x10, 0x02, 0x01, + 0x01, 0x01, 0x02, 0x25, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x40, 0x00, 0x40, + 0x00, 0x78, 0x00, 0x00, 0x00, 0x02, 0x00, 0xf4, 0x01, 0x0a, 0x00, 0x64, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x56, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x02, 0x00, 0x00, 0x80, 0x0f, 0x00, + 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x09, 0x03, + 0x01, 0x04, 0x01, 0x12, 0x01, 0x21, 0x01, 0x2f, 0x01, 0x3e, 0x01, 0x4c, + 0x01, 0x5b, 0x01, 0x69, 0x01, 0x78, 0x01, 0x00, 0x06, 0x14, 0xec, 0x08, + 0x00, 0x0c, 0xf4, 0x08, 0x1f, 0x02, 0x08, 0xf8, 0x02, 0x0c, 0x14, 0x1f, + 0xf9, 0xfa, 0xfc, 0xfe, 0x00, 0x00, 0x02, 0x03, 0x04, 0x05, 0xf9, 0xfa, + 0xfc, 0xfe, 0x00, 0x00, 0x02, 0x03, 0x04, 0x05, 0x02, 0x01, 0x02, 0x0f, + 0x00, 0x40, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x57, 0x00, 0xa0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x58, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x34, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x2a, 0x3b, 0x50, 0x66, 0x78, + 0x80, 0x84, 0x87, 0x8c, 0x90, 0x95, 0x99, 0x9b, 0xa0, 0xa4, 0xa9, 0xad, + 0xb0, 0xb5, 0xb8, 0xbd, 0xc1, 0xc5, 0xc9, 0xcd, 0xd1, 0xd4, 0xd9, 0xdd, + 0xe0, 0x5f, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4f, 0x02, 0x00, 0x00, 0x10, 0x33, 0x73, 0x33, 0x33, 0x07, + 0x01, 0x02, 0x00, 0x01, 0x22, 0xd7, 0x03, 0xec, 0x01, 0xda, 0x00, 0x66, + 0x06, 0x33, 0x13, 0x90, 0x00, 0x00, 0x13, 0x36, 0x00, 0x21, 0x00, 0x07, + 0x40, 0x00, 0x28, 0x00, 0x00, 0x10, 0x01, 0x1e, 0x64, 0x0a, 0x00, 0x72, + 0x01, 0x2b, 0x2b, 0x44, 0x4a, 0x47, 0x45, 0x45, 0x45, 0x43, 0x44, 0x58, + 0x57, 0x55, 0x54, 0x5a, 0x59, 0x25, 0x40, 0x28, 0x28, 0x39, 0x3d, 0x39, + 0x3a, 0x3a, 0x3a, 0x38, 0x39, 0x44, 0x44, 0x43, 0x42, 0x45, 0x45, 0x24, + 0x36, 0x19, 0x48, 0x40, 0x00, 0x20, 0x40, 0x0a, 0x00, 0x72, 0x06, 0x2c, + 0x01, 0x03, 0x40, 0x06, 0x05, 0x00, 0x04, 0x00, 0x00, 0x05, 0x03, 0x01, + 0x01, 0x10, 0x00, 0x10, 0x00, 0x77, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, + 0xc0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x14, 0x35, 0x09, + 0x01, 0x00, 0x00, 0x00, 0x90, 0x32, 0x38, 0x0a, 0x28, 0xff, 0x03, 0x00, + 0x28, 0x00, 0x02, 0x04, 0x03, 0x03, 0x06, 0x00, 0x01, 0x51, 0x32, 0xd0, + 0x0d, 0xb2, 0x26, 0xf2, 0x08, 0x0e, 0x05, 0x84, 0x06, 0x8e, 0x12, 0xdb, + 0x06, 0x5e, 0x01, 0xd6, 0x03, 0xb0, 0x02, 0x2e, 0x00, 0x45, 0x00, 0x67, + 0x00, 0x9a, 0x00, 0xe7, 0x00, 0x14, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0x6f, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x19, 0x13, + 0x00, 0x07, 0x17, 0x12, 0x00, 0x08, 0x15, 0x10, 0x00, 0x09, 0x13, 0x0f, + 0x00, 0x0a, 0x11, 0x0e, 0x00, 0x0b, 0x0f, 0x0c, 0x00, 0x0c, 0x0d, 0x0b, + 0x00, 0x0d, 0x0b, 0x09, 0x00, 0x0e, 0x09, 0x08, 0x00, 0x0f, 0x07, 0x07, + 0x00, 0x10, 0x05, 0x05, 0x00, 0x11, 0x03, 0x04, 0x00, 0x12, 0x01, 0x02, + 0x00, 0x13, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x06, 0x19, 0x13, 0x00, 0x07, 0x17, 0x12, 0x00, 0x08, 0x15, 0x10, + 0x00, 0x09, 0x13, 0x0f, 0x00, 0x0a, 0x11, 0x0e, 0x00, 0x0b, 0x0f, 0x0c, + 0x00, 0x0c, 0x0d, 0x0b, 0x00, 0x0d, 0x0b, 0x09, 0x00, 0x0e, 0x09, 0x08, + 0x00, 0x0f, 0x07, 0x07, 0x00, 0x10, 0x05, 0x05, 0x00, 0x11, 0x03, 0x04, + 0x00, 0x12, 0x01, 0x02, 0x00, 0x13, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x15, 0x00, 0x00, 0x00, 0x71, 0x00, 0xec, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x2a, 0x65, 0x60, 0x40, 0x3e, 0xa1, + 0x60, 0x40, 0x12, 0x21, 0x61, 0x87, 0x21, 0x09, 0x60, 0x8c, 0x41, 0x07, + 0x60, 0x9c, 0x11, 0x01, 0x60, 0xbf, 0x01, 0x01, 0x00, 0xbf, 0x31, 0x01, + 0x00, 0x07, 0x9f, 0x01, 0x00, 0x05, 0x8b, 0x01, 0x00, 0x07, 0x9f, 0x01, + 0x00, 0x0b, 0x9f, 0x02, 0x00, 0x0f, 0x9f, 0x03, 0x00, 0x13, 0x9f, 0x04, + 0x00, 0x17, 0x9f, 0x05, 0x00, 0x1b, 0x9f, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x0f, 0x0e, 0x00, 0x1d, 0x0b, 0x0a, 0x00, 0x1f, 0x0a, 0x08, + 0x00, 0x1f, 0x0a, 0x08, 0x00, 0x18, 0x40, 0x50, 0x0a, 0x04, 0x00, 0x00, + 0x68, 0x1c, 0x00, 0x81, 0x11, 0x06, 0x02, 0x06, 0x00, 0x01, 0x00, 0x00, + 0x60, 0x07, 0x02, 0x48, 0x06, 0x52, 0xc0, 0xc3, 0x02, 0x40, 0x00, 0xff, + 0x00, 0xc7, 0x31, 0x00, 0x00, 0x07, 0x02, 0x88, 0x00, 0x60, 0xc5, 0x02, + 0x00, 0x56, 0xc5, 0x02, 0x00, 0x4a, 0x64, 0x02, 0x00, 0x39, 0x64, 0x02, + 0x00, 0x52, 0x4c, 0x02, 0x00, 0x3e, 0xeb, 0x01, 0x00, 0x21, 0xeb, 0x01, + 0x00, 0x3e, 0x72, 0x01, 0x00, 0x24, 0x72, 0x01, 0x00, 0x32, 0x3a, 0x01, + 0x00, 0x24, 0xb9, 0x00, 0x00, 0x20, 0x99, 0x00, 0x00, 0x60, 0xc5, 0x02, + 0x00, 0x56, 0xc5, 0x02, 0x00, 0x4a, 0x64, 0x02, 0x00, 0x39, 0x64, 0x02, + 0x00, 0x52, 0x4c, 0x02, 0x00, 0x3e, 0xeb, 0x01, 0x00, 0x21, 0xeb, 0x01, + 0x00, 0x3e, 0x72, 0x01, 0x00, 0x24, 0x72, 0x01, 0x00, 0x32, 0x3a, 0x01, + 0x00, 0x24, 0xb9, 0x00, 0x00, 0x20, 0x99, 0x00, 0x00, 0xe4, 0x07, 0x00, + 0x00, 0x05, 0x06, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x20, 0x04, + 0x00, 0x72, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x0f, 0xc0, 0x3f, 0x01, 0x01, 0xff, 0x0f, 0x01, 0x00, 0x07, + 0x08, 0x09, 0x0b, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x10, 0x32, 0x00, + 0x00, 0x43, 0x55, 0x55, 0x55, 0x04, 0x06, 0x08, 0x0a, 0x0e, 0x10, 0x10, + 0x10, 0x0a, 0x0b, 0x0c, 0x0d, 0x01, 0x02, 0x04, 0x05, 0x06, 0x07, 0x07, + 0x08, 0x08, 0x09, 0x0a, 0x0f, 0x86, 0x03, 0x86, 0x03, 0x74, 0x00, 0x24, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x00, 0x1b, + 0x02, 0x05, 0x00, 0xd0, 0x07, 0xfb, 0x03, 0x08, 0x04, 0x10, 0x08, 0x01, + 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x00, 0x60, 0x06, 0x06, 0x00, + 0x00, 0x14, 0x00, 0x01, 0x00, 0x01, 0x16, 0x0f, 0x00, 0x92, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x06, 0x05, + 0x04, 0x02, 0x00, 0x5a, 0x01, 0x30, 0x20, 0x30, 0x20, 0x10, 0x38, 0x01, + 0x01, 0x9a, 0x00, 0x00, 0x00, 0x97, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x01, 0x01, 0x14, + 0xba, 0x05, 0x01, 0x1e, 0x00, 0xff, 0x00, 0x10, 0xff, 0x14, 0x0a, 0x64, + 0x00, 0x03, 0x18, 0xbc, 0x01, 0x09, 0x0f, 0x98, 0x00, 0x7c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x14, 0xe4, 0x00, 0x92, + 0x24, 0x09, 0x00, 0x00, 0x21, 0x54, 0x00, 0x40, 0x60, 0x02, 0x00, 0x40, + 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x18, 0x08, 0x00, 0x00, 0x00, + 0x06, 0x32, 0x00, 0x00, 0x21, 0x54, 0x00, 0x00, 0x08, 0x22, 0x00, 0x40, + 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x18, 0x08, 0x00, 0x00, 0x00, + 0x06, 0x32, 0x00, 0x00, 0x21, 0x54, 0x00, 0x40, 0x02, 0x60, 0x20, 0x40, + 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x18, 0x00, 0x18, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, + 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x00, 0x5d, 0x00, 0x8b, 0x8b, 0x06, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, + 0x00, 0x0d, 0x21, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x07, + 0x22, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x55, 0x23, 0x0b, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x4c, 0x00, 0xff, 0xff, 0x00, 0x84, 0x00, + 0x04, 0x00, 0x00, 0x9a, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x19, 0x32, 0x10, 0x00, 0x19, 0x32, 0x20, 0x00, 0x19, + 0x32, 0x30, 0x00, 0x19, 0x32, 0x40, 0x00, 0x19, 0x32, 0x80, 0x00, 0x19, + 0x32, 0xc0, 0x00, 0x19, 0x32, 0x00, 0x01, 0x19, 0x32, 0x80, 0x01, 0x19, + 0x32, 0x00, 0x02, 0x19, 0x32, 0x00, 0x03, 0x19, 0x32, 0x08, 0x04, 0x19, + 0x32, 0x00, 0x05, 0x19, 0x32, 0x00, 0x06, 0x19, 0x32, 0x80, 0x06, 0x18, + 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x10, 0x04, 0x04, 0x01, 0x10, + 0x0b, 0x04, 0x01, 0x10, 0x0c, 0x24, 0x00, 0x10, 0x24, 0x24, 0x00, 0x10, + 0x28, 0x40, 0x00, 0x10, 0x15, 0x40, 0x00, 0x01, 0x00, 0x14, 0x00, 0x11, + 0x08, 0x08, 0x00, 0x11, 0x32, 0x18, 0x00, 0x12, 0x0c, 0x32, 0x00, 0x00, + 0x07, 0x38, 0x00, 0x00, 0x02, 0x14, 0x00, 0x10, 0x03, 0x14, 0x00, 0x00, + 0x05, 0xb4, 0x00, 0x10, 0x05, 0x28, 0x00, 0x00, 0x28, 0x10, 0x00, 0x00, + 0x04, 0x00, 0x02, 0x00, 0x02, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x01, + 0x0f, 0x18, 0x00, 0x01, 0x04, 0x4c, 0x00, 0x11, 0x05, 0x20, 0x00, 0x11, + 0x14, 0x20, 0x00, 0x11, 0x02, 0x00, 0x00, 0x11, 0x19, 0x00, 0x00, 0x11, + 0x15, 0x00, 0x00, 0x01, 0x0a, 0x33, 0x00, 0x11, 0x10, 0x00, 0x00, 0x02, + 0x08, 0x0c, 0x04, 0x12, 0x08, 0x02, 0x04, 0x11, 0x08, 0x00, 0x00, 0x11, + 0x04, 0x04, 0x01, 0x11, 0x01, 0x04, 0x01, 0x12, 0x10, 0xfb, 0x00, 0x11, + 0x02, 0x28, 0x00, 0x01, 0x02, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, + 0x01, 0x00, 0x04, 0x01, 0x0a, 0xaa, 0x02, 0x00, 0x08, 0xf4, 0x00, 0x10, + 0x08, 0xf4, 0x00, 0x00, 0x04, 0x00, 0x02, 0x10, 0x04, 0x00, 0x02, 0x9b, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x0e, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x48, 0x00, 0x48, + 0x00, 0xff, 0x08, 0x10, 0x10, 0x00, 0xff, 0x0c, 0x02, 0x60, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x9d, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xa1, + 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xf0, 0x0f, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, + 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, + 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, + 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, + 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, + 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x64, 0x00, 0x7c, 0x15, 0x64, 0x00, 0x02, 0x0d, 0x64, 0x00, 0xc4, + 0x09, 0x88, 0x13, 0x64, 0x00, 0xd0, 0x07, 0xa0, 0x0f, 0x40, 0x1f, 0x86, + 0x06, 0x02, 0x0d, 0x40, 0x1f, 0x9e, 0xa1, 0xa8, 0xab, 0xad, 0x00, 0x00, + 0x00, 0x02, 0x01, 0xa2, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x05, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4f, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x64, 0x00, 0x64, 0x00, 0x02, 0x0d, 0x64, 0x00, 0xc4, + 0x09, 0x88, 0x13, 0x64, 0x00, 0xd0, 0x07, 0xa0, 0x0f, 0x40, 0x1f, 0x86, + 0x06, 0x02, 0x0d, 0x40, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x00, 0x7d, 0x01, 0x36, 0x32, 0x00, 0xa8, 0x00, 0x0c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0xad, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x04, 0xb0, 0x00, 0xf4, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x58, 0x00, 0x60, 0x01, 0x20, 0x01, 0x00, 0x01, 0x5c, + 0x00, 0x60, 0x03, 0x60, 0x00, 0x00, 0x05, 0x00, 0x06, 0xfa, 0x80, 0x0b, + 0x00, 0x00, 0x05, 0x00, 0x04, 0xfa, 0x06, 0x12, 0x55, 0x00, 0x05, 0xe0, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x0b, 0x0f, 0x0c, + 0x0f, 0x00, 0x05, 0x04, 0x03, 0x0d, 0x0f, 0x0a, 0x10, 0x00, 0x05, 0x08, + 0x03, 0x17, 0x00, 0x02, 0x11, 0x00, 0x05, 0x00, 0x16, 0xfa, 0x80, 0x0b, + 0x00, 0x00, 0x05, 0x00, 0x14, 0x0a, 0x07, 0x0a, 0x15, 0x00, 0x05, 0x04, + 0x06, 0x12, 0x80, 0x0a, 0x00, 0x00, 0x05, 0x0c, 0x03, 0x01, 0x01, 0x02, + 0x01, 0x00, 0x05, 0x10, 0x03, 0x03, 0x01, 0x00, 0x02, 0x00, 0x05, 0x14, + 0x03, 0x19, 0x00, 0x00, 0x00, 0x00, 0x05, 0x04, 0x16, 0x0a, 0x80, 0x0a, + 0x00, 0x00, 0x05, 0x3c, 0x00, 0x10, 0x00, 0x55, 0x03, 0x00, 0x05, 0x34, + 0x00, 0x02, 0x18, 0x02, 0x37, 0x00, 0x00, 0x78, 0x01, 0x7f, 0x61, 0x15, + 0x04, 0x00, 0x00, 0x7c, 0x01, 0x14, 0x0a, 0x07, 0x00, 0x00, 0x00, 0x74, + 0x01, 0x18, 0x13, 0x08, 0x04, 0x00, 0x0e, 0x14, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x0f, 0x14, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x68, + 0x86, 0x28, 0x60, 0x60, 0x01, 0x00, 0x00, 0x10, 0x91, 0x9a, 0x4b, 0x23, + 0x2c, 0x00, 0x20, 0x18, 0x00, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x08, 0x28, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x09, 0x28, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x15, 0x00, 0x00, 0x98, 0xf9, 0xd7, 0x09, 0x00, 0x1e, 0x20, + 0x00, 0x00, 0x00, 0x40, 0x64, 0x00, 0x27, 0xc8, 0x08, 0xb8, 0x9b, 0x20, + 0x97, 0xb1, 0x00, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x27, 0x20, 0x0c, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x0e, 0x10, 0x00, 0x00, 0xa0, 0x03, 0x00, 0x00, 0x0f, 0x10, + 0x00, 0x00, 0xa0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x20, 0x02, + 0x00, 0x00, 0x00, 0x08, 0x70, 0x00, 0x20, 0x02, 0x00, 0x00, 0x16, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0x00, 0xf0, 0x7f, 0x00, + 0x58, 0x00, 0x17, 0x00, 0x00, 0x00, 0x4c, 0x49, 0x00, 0x00, 0x17, 0x04, + 0x00, 0x00, 0x32, 0xb5, 0x7f, 0x00, 0x17, 0x14, 0x00, 0x14, 0x30, 0x08, + 0xc0, 0x00, 0x17, 0x18, 0x00, 0x18, 0x20, 0x40, 0x82, 0x00, 0x17, 0x1c, + 0x00, 0x00, 0xe0, 0x07, 0xa0, 0x00, 0x17, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x1b, 0x1c, 0x00, 0x20, 0x17, 0x62, 0x03, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x83, 0x00, 0x38, 0x00, 0x1c, 0x80, 0x00, 0x9a, 0xff, 0xaf, + 0x00, 0x00, 0x1c, 0x84, 0x00, 0xba, 0x5e, 0xaf, 0x00, 0x00, 0x27, 0x5c, + 0x11, 0x90, 0x00, 0x74, 0x01, 0x00, 0x27, 0x5c, 0x15, 0x90, 0x00, 0x74, + 0x01, 0x00, 0x17, 0x40, 0x00, 0xf9, 0x34, 0x8d, 0xb0, 0x00, 0x17, 0x44, + 0x00, 0xf9, 0x34, 0x0d, 0x60, 0x00, 0x17, 0x4c, 0x00, 0xf9, 0x34, 0xcd, + 0xf1, 0x00, 0x17, 0x48, 0x00, 0xf9, 0x34, 0xcd, 0xe0, 0x00, 0x02, 0x70, + 0x03, 0x58, 0x00, 0x00, 0x00, 0x00, 0x02, 0x74, 0x03, 0x58, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x78, 0x03, 0x58, 0x00, 0x00, 0x00, 0x00, 0x02, 0x7c, + 0x03, 0x58, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x03, 0x58, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x3c, 0x03, 0x46, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, + 0x04, 0x7a, 0x00, 0x00, 0x00, 0xb2, 0x00, 0xac, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x08, 0x84, + 0x00, 0x05, 0x8b, 0x01, 0x00, 0x00, 0x09, 0x84, 0x00, 0x05, 0x8b, 0x01, + 0x00, 0x00, 0x0b, 0x44, 0x00, 0x40, 0x4e, 0x81, 0x60, 0x00, 0x0b, 0x48, + 0x00, 0x40, 0x12, 0x01, 0x61, 0x00, 0x0b, 0x4c, 0x00, 0x86, 0x21, 0x05, + 0x60, 0x00, 0x0b, 0x54, 0x00, 0x9a, 0x11, 0x01, 0x60, 0x00, 0x02, 0x4c, + 0x01, 0x06, 0x06, 0x0e, 0x60, 0x00, 0x27, 0x6c, 0x11, 0xff, 0x7f, 0xc2, + 0x27, 0x00, 0x27, 0x6c, 0x15, 0xff, 0x7f, 0xc2, 0x27, 0x00, 0x00, 0x14, + 0x91, 0x50, 0x13, 0x0a, 0x05, 0x00, 0x00, 0x0c, 0xf4, 0x14, 0x1e, 0x28, + 0x36, 0x00, 0x00, 0x10, 0xf4, 0x79, 0x1c, 0x14, 0x00, 0x00, 0x00, 0x14, + 0xf4, 0x79, 0x1c, 0x14, 0x00, 0x00, 0x00, 0x0c, 0xc2, 0x42, 0x42, 0x31, + 0x00, 0x00, 0x00, 0x00, 0xf4, 0x18, 0x9c, 0x03, 0x40, 0x00, 0x00, 0x04, + 0xf4, 0x18, 0x9c, 0x03, 0x40, 0x00, 0x02, 0x5c, 0x03, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x08, 0x04, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0c, + 0x04, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x04, 0x7a, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x14, 0x04, 0x6a, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x04, + 0x00, 0x28, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x03, + 0x00, 0x1e, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x32, 0x00, 0x02, + 0x00, 0x19, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x28, 0x00, 0x01, + 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, + 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, + 0x03, 0x64, 0x01, 0x01, 0x00, 0xc5, 0x00, 0xe4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x2a, 0x65, 0x60, 0x40, 0x4e, 0x81, + 0x60, 0x40, 0x12, 0x01, 0x61, 0x86, 0x21, 0x05, 0x60, 0x8c, 0x41, 0x07, + 0x60, 0x9a, 0x11, 0x01, 0x60, 0xbf, 0x01, 0x01, 0x00, 0xbf, 0x31, 0x01, + 0x00, 0x07, 0x9f, 0x01, 0x00, 0x05, 0x8b, 0x01, 0x00, 0x07, 0x9f, 0x01, + 0x00, 0x0b, 0x9f, 0x02, 0x00, 0x0f, 0x9f, 0x03, 0x00, 0x13, 0x9f, 0x04, + 0x00, 0x17, 0x9f, 0x05, 0x00, 0x1b, 0x9f, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x0f, 0x0e, 0x00, 0x1d, 0x0b, 0x0a, 0x00, 0x1f, 0x0a, 0x08, + 0x00, 0x1f, 0x0a, 0x08, 0x00, 0x18, 0x40, 0x50, 0x0a, 0x04, 0x00, 0x00, + 0x68, 0x1c, 0x00, 0x81, 0x11, 0x06, 0x02, 0x06, 0x00, 0x01, 0x00, 0x00, + 0x60, 0x07, 0x02, 0x48, 0x06, 0x52, 0xc0, 0xc3, 0x02, 0x40, 0x05, 0xff, + 0x00, 0xc7, 0x31, 0x00, 0x00, 0x07, 0x02, 0x88, 0x00, 0x60, 0xc5, 0x02, + 0x00, 0x56, 0xc5, 0x02, 0x00, 0x4a, 0x64, 0x02, 0x00, 0x39, 0x64, 0x02, + 0x00, 0x52, 0x4c, 0x02, 0x00, 0x3e, 0xeb, 0x01, 0x00, 0x21, 0xeb, 0x01, + 0x00, 0x3e, 0x72, 0x01, 0x00, 0x24, 0x72, 0x01, 0x00, 0x32, 0x3a, 0x01, + 0x00, 0x24, 0xb9, 0x00, 0x00, 0x20, 0x99, 0x00, 0x00, 0x60, 0xc5, 0x02, + 0x00, 0x56, 0xc5, 0x02, 0x00, 0x4a, 0x64, 0x02, 0x00, 0x39, 0x64, 0x02, + 0x00, 0x52, 0x4c, 0x02, 0x00, 0x3e, 0xeb, 0x01, 0x00, 0x21, 0xeb, 0x01, + 0x00, 0x3e, 0x72, 0x01, 0x00, 0x24, 0x72, 0x01, 0x00, 0x32, 0x3a, 0x01, + 0x00, 0x24, 0xb9, 0x00, 0x00, 0x20, 0x99, 0x00, 0x00, 0xe4, 0x07, 0x00, + 0x00, 0x00, 0x20, 0x04, 0x00, 0xc6, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0xc7, 0x00, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x08, + 0x04, 0xf4, 0x01, 0xcd, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x09, 0xa8, 0xab, 0x2d, 0x19, 0x19, 0x04, 0xa8, + 0x50, 0xfa, 0x14, 0x01, 0x09, 0x05, 0x05, 0x12, 0x08, 0x1e, 0x0f, 0x05, + 0xa9, 0xb1, 0x00, 0x64, 0x00, 0x14, 0x00, 0x0a, 0x00, 0x00, 0x00, 0xce, + 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, + 0x80, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, + 0xd0, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x04, 0x00, 0x00, 0x07, 0x04, 0x08, 0x08, 0x00, 0x0f, 0x00, + 0xa7, 0x18, 0x04, 0x0b, 0x0b, 0x00, 0x0a, 0x00, 0xbf, 0x2a, 0x07, 0x09, + 0x0b, 0x00, 0x0a, 0x00, 0x25, 0x35, 0x09, 0x06, 0x0b, 0x00, 0x0f, 0x00, + 0x03, 0x41, 0x06, 0x08, 0x0b, 0x00, 0x48, 0x00, 0xad, 0x75, 0x08, 0x06, + 0x0b, 0x00, 0x0a, 0x00, 0x5f, 0x04, 0x01, 0x08, 0x0b, 0x00, 0xd1, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x02, 0x78, 0xff, 0x03, 0x00, 0xd3, 0x00, 0xcc, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x05, 0x00, 0x03, 0xc0, + 0x06, 0x00, 0x07, 0xc0, 0x06, 0x00, 0x0b, 0xc0, 0x06, 0x00, 0x0f, 0xc0, + 0x06, 0x00, 0x17, 0xc0, 0x06, 0x00, 0x1f, 0xc0, 0x0a, 0x00, 0x23, 0xc0, + 0x0e, 0x00, 0x27, 0xc0, 0x12, 0x09, 0x2b, 0xc0, 0x9a, 0x11, 0x3f, 0xc0, + 0xbe, 0x19, 0x01, 0xc1, 0x82, 0x24, 0x3f, 0xc0, 0xbe, 0x01, 0x3b, 0xc0, + 0x3a, 0x00, 0x03, 0x60, 0x04, 0x00, 0x03, 0xa0, 0x04, 0x00, 0x03, 0x80, + 0x05, 0x00, 0x03, 0xc0, 0x06, 0x00, 0x07, 0xc0, 0x06, 0x00, 0x0b, 0xc0, + 0x06, 0x00, 0x0f, 0xc0, 0x06, 0x00, 0x17, 0xc0, 0x06, 0x00, 0x1f, 0xc0, + 0x0a, 0x00, 0x23, 0xc0, 0x0e, 0x00, 0x27, 0xc0, 0x12, 0x09, 0x2b, 0xc0, + 0x9a, 0x11, 0x3f, 0xc0, 0xbe, 0x19, 0x01, 0xc1, 0x82, 0x24, 0x3f, 0xc0, + 0xbe, 0x01, 0x3b, 0xc0, 0x3a, 0x00, 0x03, 0x60, 0x04, 0x00, 0x03, 0xa0, + 0x04, 0x00, 0x44, 0x04, 0x00, 0x00, 0xe5, 0x00, 0x00, 0x00, 0x0f, 0x0f, + 0x00, 0x00, 0x00, 0x0d, 0xc0, 0x0b, 0x00, 0x00, 0x48, 0x0b, 0x00, 0x00, + 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x90, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, 0x03, 0x03, + 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x09, 0x02, 0x00, 0x00, 0x0b, 0x02, + 0x00, 0x00, 0x0a, 0x03, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x17, 0x02, + 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x0d, 0x04, 0x00, 0x00, 0x0b, 0x05, + 0x00, 0x00, 0x14, 0x03, 0x00, 0x00, 0x09, 0x07, 0x00, 0x00, 0x0b, 0x06, + 0x00, 0x00, 0x0e, 0x05, 0x00, 0x00, 0x0f, 0x05, 0x00, 0x00, 0x0a, 0x08, + 0x00, 0x00, 0x07, 0x0c, 0x00, 0x00, 0x0f, 0x06, 0x00, 0x00, 0x0c, 0x08, + 0x00, 0x00, 0x1a, 0x04, 0x00, 0x00, 0x0c, 0x09, 0x00, 0x00, 0x0d, 0x09, + 0x00, 0x00, 0x19, 0x05, 0x00, 0x00, 0x16, 0x06, 0x00, 0x00, 0x14, 0x07, + 0x00, 0x00, 0x15, 0x07, 0x00, 0x00, 0x16, 0x07, 0x00, 0x00, 0x1b, 0x06, + 0x00, 0x00, 0x19, 0x07, 0x00, 0x00, 0x1a, 0x07, 0x00, 0x00, 0x1c, 0x07, + 0x00, 0x00, 0x00, 0x49, 0x07, 0x00, 0x27, 0x9d, 0x74, 0x12, 0xc0, 0x8e, + 0xaa, 0x4c, 0xe7, 0x06, 0x00, 0x00, 0xd5, 0x00, 0x84, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x04, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x82, + 0x30, 0x00, 0x71, 0x82, 0x10, 0x00, 0x7d, 0x82, 0x00, 0x00, 0x71, 0x84, + 0x00, 0x00, 0x7d, 0x86, 0x00, 0x00, 0x79, 0x86, 0x00, 0x00, 0x7d, 0x8a, + 0x00, 0x00, 0x7c, 0x8a, 0x00, 0x00, 0x75, 0x8c, 0x00, 0x00, 0x71, 0x8e, + 0x10, 0x00, 0x71, 0xcc, 0x00, 0x00, 0x7d, 0x9a, 0x01, 0x00, 0x75, 0xca, + 0x00, 0x00, 0x7d, 0xf6, 0x00, 0x00, 0x71, 0x96, 0x00, 0x00, 0x71, 0x92, + 0x00, 0x00, 0x23, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x30, 0x0b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0e, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x40, 0x01, 0x80, 0x00, + 0x00, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x84, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x04, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x82, + 0x30, 0x00, 0x71, 0x82, 0x10, 0x00, 0x7d, 0x82, 0x00, 0x00, 0x71, 0x84, + 0x00, 0x00, 0x7d, 0x86, 0x00, 0x00, 0x79, 0x86, 0x00, 0x00, 0x7d, 0x8a, + 0x00, 0x00, 0x7c, 0x8a, 0x00, 0x00, 0x75, 0x8c, 0x00, 0x00, 0x71, 0x8e, + 0x00, 0x00, 0x71, 0xcc, 0x00, 0x00, 0x7d, 0x9a, 0x01, 0x00, 0x75, 0xca, + 0x00, 0x00, 0x7d, 0xf6, 0x00, 0x00, 0x71, 0x96, 0x00, 0x00, 0x71, 0x92, + 0x00, 0x00, 0x28, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x30, 0x0b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0e, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x40, 0x01, 0x80, 0x00, + 0x00, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0xd7, 0x00, 0xa0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x3f, 0x69, 0x02, 0x03, 0x3f, + 0x69, 0x02, 0x03, 0x3f, 0x69, 0x02, 0x03, 0x3f, 0xa9, 0x02, 0x07, 0x3f, + 0xa9, 0x04, 0x0f, 0x3f, 0xa9, 0x02, 0x1f, 0x3f, 0xe9, 0x04, 0x3f, 0x3f, + 0xa9, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x3f, 0xa9, 0x02, 0x3f, 0x3f, 0xe9, 0x02, 0x08, 0x04, + 0x00, 0x00, 0x88, 0x04, 0x00, 0x00, 0x98, 0x04, 0x00, 0x00, 0xa0, 0x04, + 0x00, 0x00, 0xa0, 0x04, 0x00, 0x00, 0x18, 0x04, 0x00, 0x00, 0x28, 0x04, + 0x00, 0x00, 0xc8, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x20, 0x04, + 0x00, 0x00, 0x0a, 0x66, 0x00, 0x00, 0x0b, 0x66, 0x00, 0x00, 0x12, 0x66, + 0x00, 0x00, 0x1c, 0x66, 0x00, 0x00, 0x1e, 0x66, 0x00, 0x00, 0x13, 0x66, + 0x00, 0x00, 0x1d, 0x66, 0x00, 0x00, 0x1f, 0x66, 0x00, 0x00, 0xd8, 0x00, + 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x3f, + 0x69, 0x02, 0x03, 0x3f, 0x69, 0x02, 0x03, 0x3f, 0x69, 0x02, 0x03, 0x3f, + 0xa9, 0x02, 0x07, 0x3f, 0xa9, 0x04, 0x0f, 0x3f, 0xa9, 0x02, 0x1f, 0x3f, + 0xe9, 0x04, 0x3f, 0x3f, 0xa9, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x3f, 0xa9, 0x02, 0x3f, 0x3f, + 0xe9, 0x02, 0x08, 0x04, 0x00, 0x00, 0x88, 0x04, 0x00, 0x00, 0x98, 0x04, + 0x00, 0x00, 0xa0, 0x04, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x00, 0x18, 0x04, + 0x00, 0x00, 0x28, 0x04, 0x00, 0x00, 0xd8, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x04, + 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x0a, 0x66, 0x00, 0x00, 0x0b, 0x66, + 0x00, 0x00, 0x12, 0x66, 0x00, 0x00, 0x1c, 0x66, 0x00, 0x00, 0x1e, 0x66, + 0x00, 0x00, 0x13, 0x66, 0x00, 0x00, 0x1d, 0x66, 0x00, 0x00, 0x1f, 0x66, + 0x00, 0x00, 0xd9, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdb, 0x00, + 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x01, + 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x09, 0x02, + 0x00, 0x00, 0x0b, 0x02, 0x00, 0x00, 0x0a, 0x03, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x17, 0x02, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x0d, 0x04, + 0x00, 0x00, 0x0b, 0x05, 0x00, 0x00, 0x14, 0x03, 0x00, 0x00, 0x09, 0x07, + 0x00, 0x00, 0x0b, 0x06, 0x00, 0x00, 0x0e, 0x05, 0x00, 0x00, 0x0f, 0x05, + 0x00, 0x00, 0x0a, 0x08, 0x00, 0x00, 0x07, 0x0c, 0x00, 0x00, 0x0f, 0x06, + 0x00, 0x00, 0x0c, 0x08, 0x00, 0x00, 0x1a, 0x04, 0x00, 0x00, 0x0c, 0x09, + 0x00, 0x00, 0x0d, 0x09, 0x00, 0x00, 0x19, 0x05, 0x00, 0x00, 0x16, 0x06, + 0x00, 0x00, 0x14, 0x07, 0x00, 0x00, 0x15, 0x07, 0x00, 0x00, 0x16, 0x07, + 0x00, 0x00, 0x1b, 0x06, 0x00, 0x00, 0x19, 0x07, 0x00, 0x00, 0x1a, 0x07, + 0x00, 0x00, 0x1c, 0x07, 0x00, 0x00, 0x00, 0x49, 0x07, 0x00, 0x27, 0x9d, + 0x74, 0x12, 0xc0, 0x8e, 0xaa, 0x4c, 0xe7, 0x06, 0x00, 0x00, 0xdc, 0x00, + 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, + 0x25, 0x00, 0x84, 0x80, 0x1c, 0x00, 0x44, 0x82, 0x18, 0x00, 0x44, 0x86, + 0x18, 0x00, 0x44, 0x8a, 0x18, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, + 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, + 0x10, 0x00, 0xc4, 0x00, 0x25, 0x00, 0x84, 0x00, 0x1d, 0x00, 0x84, 0x80, + 0x14, 0x00, 0x44, 0x82, 0x18, 0x00, 0x44, 0x86, 0x18, 0x00, 0x14, 0x00, + 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, + 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0x84, 0x00, 0x25, 0x00, 0x84, 0x80, + 0x1c, 0x00, 0x44, 0x82, 0x18, 0x00, 0x44, 0x86, 0x18, 0x00, 0x44, 0x8a, + 0x18, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, + 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0xc4, 0x00, + 0x25, 0x00, 0x84, 0x00, 0x1d, 0x00, 0x84, 0x80, 0x14, 0x00, 0x44, 0x82, + 0x18, 0x00, 0x44, 0x86, 0x18, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, + 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, + 0x90, 0xa0, 0xb0, 0x0b, 0x11, 0x1b, 0x2b, 0x45, 0x0b, 0x11, 0x1b, 0x2b, + 0x45, 0xc4, 0xd6, 0xea, 0xf6, 0x00, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xc4, + 0xd6, 0xea, 0xf6, 0x00, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0x20, 0x46, 0x62, + 0x84, 0xaa, 0x00, 0x00, 0xfc, 0xf8, 0x00, 0x00, 0xfc, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x08, 0x10, 0x08, 0x04, 0x02, 0x00, 0x90, 0x01, 0x03, 0x00, 0xde, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x16, 0x00, + 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2c, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x34, 0x00, + 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x80, 0x28, + 0x1e, 0xe2, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x01, 0x00, 0x28, 0x23, 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0x1e, 0x00, + 0x01, 0x0a, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x10, 0x00, 0xe2, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, 0x03, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x38, 0x00, 0x1c, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0xc0, 0x01, 0xe0, 0x00, 0x34, 0x10, + 0x03, 0x00, 0xee, 0x18, 0x00, 0x00, 0x34, 0x10, 0x03, 0x00, 0xee, 0x18, + 0x00, 0x00, 0x28, 0x00, 0x02, 0x0b, 0x0c, 0x3b, 0x3c, 0x50, 0x02, 0x0b, + 0x0c, 0x3b, 0x3c, 0x50, 0x0b, 0x3c, 0x72, 0x54, 0x00, 0x0a, 0x00, 0x06, + 0x88, 0x10, 0xe3, 0x00, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0e, + 0x00, 0x07, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x70, + 0x00, 0x38, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, + 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, + 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, + 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, + 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, + 0x1d, 0x00, 0x10, 0x10, 0xb4, 0x3c, 0x08, 0xcd, 0x02, 0x00, 0xed, 0x16, + 0x00, 0x00, 0x00, 0xc8, 0x14, 0x0b, 0xff, 0xff, 0xff, 0x3f, 0x90, 0x01, + 0x0f, 0x00, 0xe4, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, + 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x93, 0x00, 0x00, 0x00, 0x94, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x93, 0x00, + 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, + 0x1a, 0x00, 0x69, 0x00, 0x1b, 0x00, 0x69, 0x00, 0x1b, 0x00, 0x69, 0x00, + 0x1a, 0x00, 0x69, 0x00, 0x1a, 0x00, 0x60, 0x01, 0x00, 0x00, 0x44, 0x01, + 0x00, 0x00, 0x4c, 0x01, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00, 0x54, 0x01, + 0x00, 0x00, 0x60, 0x01, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, 0x4c, 0x01, + 0x00, 0x00, 0x50, 0x01, 0x00, 0x00, 0x54, 0x01, 0x00, 0x00, 0x80, 0x01, + 0x00, 0x00, 0x64, 0x01, 0x00, 0x00, 0x6c, 0x01, 0x00, 0x00, 0x70, 0x01, + 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, 0xe5, 0x00, 0xa0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x32, 0xaa, 0x02, 0x05, 0x20, + 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xc8, + 0x04, 0x32, 0xa0, 0x00, 0xc0, 0x14, 0xa2, 0x00, 0xc0, 0x14, 0xa0, 0x00, + 0x80, 0x30, 0xa2, 0x00, 0x80, 0x30, 0xb0, 0x00, 0xc0, 0x14, 0xb2, 0x00, + 0xc0, 0x14, 0xb0, 0x00, 0xea, 0x00, 0xb2, 0x00, 0xea, 0x00, 0xb0, 0x00, + 0xea, 0x00, 0xb2, 0x00, 0xea, 0x00, 0xb0, 0x00, 0xea, 0x00, 0xb2, 0x00, + 0xea, 0x00, 0xb0, 0x00, 0xea, 0x00, 0xb2, 0x00, 0xea, 0x00, 0xb0, 0x00, + 0xea, 0x00, 0xb2, 0x00, 0xea, 0x00, 0xb0, 0x00, 0xea, 0x00, 0xb2, 0x00, + 0xea, 0x00, 0xb0, 0x00, 0xea, 0x00, 0xb2, 0x00, 0xea, 0x00, 0xb0, 0x00, + 0xea, 0x00, 0xb2, 0x00, 0xea, 0x00, 0xb0, 0x00, 0xea, 0x00, 0xb2, 0x00, + 0xea, 0x00, 0xb0, 0x00, 0xea, 0x00, 0xb2, 0x00, 0xea, 0x00, 0xb0, 0x00, + 0xea, 0x00, 0xb2, 0x00, 0xea, 0x00, 0xb0, 0x00, 0xea, 0x00, 0xb2, 0x00, + 0xea, 0x00, 0xb0, 0x00, 0xea, 0x00, 0xb2, 0x00, 0xea, 0x00, 0xe6, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x00, 0xa0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x00, + 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc9, 0x04, + 0xcb, 0x04, 0x01, 0x05, 0x03, 0x05, 0x05, 0x05, 0x07, 0x05, 0x09, 0x05, + 0x0b, 0x05, 0x41, 0x05, 0x43, 0x05, 0x45, 0x05, 0x47, 0x05, 0x49, 0x05, + 0x4b, 0x05, 0x81, 0x05, 0x83, 0x05, 0x85, 0x05, 0x87, 0x05, 0x89, 0x05, + 0x80, 0x09, 0x82, 0x09, 0x84, 0x09, 0x86, 0x09, 0x88, 0x09, 0x8a, 0x09, + 0xc1, 0x09, 0xc3, 0x09, 0xc5, 0x09, 0xc7, 0x09, 0xc9, 0x09, 0xcb, 0x09, + 0xc1, 0x0d, 0xc3, 0x0d, 0xc5, 0x0d, 0xc7, 0x0d, 0xc9, 0x0d, 0xcb, 0x0d, + 0xc0, 0x11, 0xc2, 0x11, 0xc4, 0x11, 0xc6, 0x11, 0xc8, 0x11, 0xca, 0x11, + 0xc1, 0x15, 0xc3, 0x15, 0xc5, 0x15, 0xc7, 0x15, 0xc9, 0x15, 0xcb, 0x15, + 0xc4, 0x19, 0xc6, 0x19, 0xc8, 0x19, 0xca, 0x19, 0xcc, 0x19, 0xce, 0x19, + 0xd5, 0x19, 0xd7, 0x19, 0xd9, 0x19, 0xdb, 0x19, 0xdd, 0x19, 0xdf, 0x19, + 0xd3, 0x1d, 0xd5, 0x1d, 0xd7, 0x1d, 0xd9, 0x1d, 0xdb, 0x1d, 0xc6, 0x39, + 0xea, 0x00, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x09, 0x01, 0x0b, 0x01, 0x41, 0x01, 0x43, 0x01, 0x45, 0x01, 0x47, 0x01, + 0x49, 0x01, 0x4b, 0x01, 0x81, 0x01, 0x83, 0x01, 0x85, 0x01, 0x87, 0x01, + 0x89, 0x01, 0x8b, 0x01, 0xc2, 0x01, 0xc4, 0x01, 0xc6, 0x01, 0xc8, 0x01, + 0xca, 0x01, 0xcc, 0x01, 0xd2, 0x01, 0xd4, 0x01, 0xd6, 0x01, 0xd8, 0x01, + 0xda, 0x01, 0xdc, 0x01, 0xd2, 0x05, 0xd4, 0x05, 0xd6, 0x05, 0xd8, 0x05, + 0xda, 0x05, 0xdc, 0x05, 0xd3, 0x09, 0xd5, 0x09, 0xd7, 0x09, 0xd9, 0x09, + 0xdb, 0x09, 0xdd, 0x09, 0xd3, 0x0d, 0xd5, 0x0d, 0xd7, 0x0d, 0xd9, 0x0d, + 0xdb, 0x0d, 0xdd, 0x0d, 0xd2, 0x11, 0xd4, 0x11, 0xd6, 0x11, 0xd8, 0x11, + 0xda, 0x11, 0xdc, 0x11, 0xd3, 0x15, 0xd5, 0x15, 0xd7, 0x15, 0xd9, 0x15, + 0xdb, 0x15, 0xd4, 0x19, 0xd6, 0x19, 0xd8, 0x19, 0xda, 0x19, 0xdc, 0x19, + 0xde, 0x19, 0xa2, 0x31, 0xa4, 0x31, 0xa6, 0x31, 0xa8, 0x31, 0xaa, 0x31, + 0xac, 0x31, 0xeb, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x81, 0x00, 0x83, 0x00, 0x85, 0x00, 0x87, 0x00, 0x89, 0x00, + 0x8b, 0x00, 0x91, 0x00, 0x93, 0x00, 0x95, 0x00, 0x97, 0x00, 0x99, 0x00, + 0x9b, 0x00, 0xa1, 0x00, 0xa3, 0x00, 0xa5, 0x00, 0xa7, 0x00, 0xa9, 0x00, + 0xab, 0x00, 0xe1, 0x00, 0xe3, 0x00, 0xe5, 0x00, 0xe7, 0x00, 0xe9, 0x00, + 0xeb, 0x00, 0x21, 0x01, 0x23, 0x01, 0x25, 0x01, 0x27, 0x01, 0x29, 0x01, + 0x2b, 0x01, 0x61, 0x01, 0x63, 0x01, 0x65, 0x01, 0x67, 0x01, 0x69, 0x01, + 0x6b, 0x01, 0xa1, 0x01, 0xa3, 0x01, 0xa5, 0x01, 0xa7, 0x01, 0xa9, 0x01, + 0xab, 0x01, 0xe1, 0x01, 0xe3, 0x01, 0xe5, 0x01, 0xe7, 0x01, 0xe9, 0x01, + 0xeb, 0x01, 0xed, 0x01, 0xef, 0x01, 0xb2, 0x01, 0xb4, 0x01, 0xb6, 0x01, + 0xb8, 0x01, 0xba, 0x01, 0xf1, 0x01, 0xf3, 0x01, 0xf5, 0x01, 0xf7, 0x01, + 0xf9, 0x01, 0xfb, 0x01, 0xcb, 0x0d, 0xc0, 0x11, 0xc2, 0x11, 0xc4, 0x11, + 0xc6, 0x11, 0xc8, 0x11, 0xca, 0x11, 0xc1, 0x15, 0xc3, 0x15, 0xc5, 0x15, + 0xc7, 0x15, 0xc9, 0x15, 0xcb, 0x15, 0xc4, 0x19, 0xc6, 0x19, 0xc8, 0x19, + 0xca, 0x19, 0xcc, 0x19, 0xce, 0x19, 0xd5, 0x19, 0xd7, 0x19, 0xd9, 0x19, + 0xdb, 0x19, 0xdd, 0x19, 0xdf, 0x19, 0xd3, 0x1d, 0xd5, 0x1d, 0xd7, 0x1d, + 0xd9, 0x1d, 0xdb, 0x1d, 0xdd, 0x1d, 0xec, 0x00, 0x86, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x05, 0x04, 0x05, + 0x06, 0x05, 0x08, 0x05, 0x0a, 0x05, 0x40, 0x05, 0x42, 0x05, 0x44, 0x05, + 0x46, 0x05, 0x48, 0x05, 0x4a, 0x05, 0x80, 0x05, 0x82, 0x05, 0x84, 0x05, + 0x86, 0x05, 0x88, 0x05, 0x8a, 0x05, 0x80, 0x09, 0x82, 0x09, 0x84, 0x09, + 0x86, 0x09, 0x88, 0x09, 0x8a, 0x09, 0xc1, 0x09, 0xc3, 0x09, 0xc5, 0x09, + 0xc7, 0x09, 0xc9, 0x09, 0xcb, 0x09, 0xc1, 0x0d, 0xc3, 0x0d, 0xc5, 0x0d, + 0xc7, 0x0d, 0xc9, 0x0d, 0xcb, 0x0d, 0xc0, 0x11, 0xc2, 0x11, 0xc4, 0x11, + 0xc6, 0x11, 0xc8, 0x11, 0xca, 0x11, 0xc1, 0x15, 0xc3, 0x15, 0xc5, 0x15, + 0xc7, 0x15, 0xc9, 0x15, 0xcb, 0x15, 0xc2, 0x19, 0xc4, 0x19, 0xc6, 0x19, + 0xc8, 0x19, 0xca, 0x19, 0xcc, 0x19, 0xd2, 0x19, 0xd4, 0x19, 0xd6, 0x19, + 0xd8, 0x19, 0xda, 0x19, 0xdc, 0x19, 0xd0, 0x1d, 0xd2, 0x1d, 0xd4, 0x1d, + 0xd6, 0x1d, 0xd8, 0x1d, 0xda, 0x1d, 0xc4, 0x39, 0xed, 0x00, 0x86, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x01, 0x43, 0x01, + 0x45, 0x01, 0x47, 0x01, 0x49, 0x01, 0x4b, 0x01, 0x81, 0x01, 0x83, 0x01, + 0x85, 0x01, 0x87, 0x01, 0x89, 0x01, 0x8b, 0x01, 0xc2, 0x01, 0xc4, 0x01, + 0xc6, 0x01, 0xc8, 0x01, 0xca, 0x01, 0xcc, 0x01, 0xd2, 0x01, 0xd4, 0x01, + 0xd6, 0x01, 0xd8, 0x01, 0xda, 0x01, 0xdc, 0x01, 0xd2, 0x05, 0xd4, 0x05, + 0xd6, 0x05, 0xd8, 0x05, 0xda, 0x05, 0xdc, 0x05, 0xd3, 0x09, 0xd5, 0x09, + 0xd7, 0x09, 0xd9, 0x09, 0xdb, 0x09, 0xdd, 0x09, 0xd3, 0x0d, 0xd5, 0x0d, + 0xd7, 0x0d, 0xd9, 0x0d, 0xdb, 0x0d, 0xdd, 0x0d, 0xd2, 0x11, 0xd4, 0x11, + 0xd6, 0x11, 0xd8, 0x11, 0xda, 0x11, 0xdc, 0x11, 0xd3, 0x15, 0xd5, 0x15, + 0xd7, 0x15, 0xd9, 0x15, 0xdb, 0x15, 0xdd, 0x15, 0xd6, 0x19, 0xd8, 0x19, + 0xda, 0x19, 0xdc, 0x19, 0xde, 0x19, 0xa1, 0x31, 0xa3, 0x31, 0xa5, 0x31, + 0xa7, 0x31, 0xa9, 0x31, 0xab, 0x31, 0xad, 0x31, 0xa4, 0x35, 0xee, 0x00, + 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, + 0x83, 0x00, 0x85, 0x00, 0x87, 0x00, 0x89, 0x00, 0x8b, 0x00, 0x91, 0x00, + 0x93, 0x00, 0x95, 0x00, 0x97, 0x00, 0x99, 0x00, 0x9b, 0x00, 0xa1, 0x00, + 0xa3, 0x00, 0xa5, 0x00, 0xa7, 0x00, 0xa9, 0x00, 0xab, 0x00, 0xe1, 0x00, + 0xe3, 0x00, 0xe5, 0x00, 0xe7, 0x00, 0xe9, 0x00, 0xeb, 0x00, 0x21, 0x01, + 0x23, 0x01, 0x25, 0x01, 0x27, 0x01, 0x29, 0x01, 0x2b, 0x01, 0x61, 0x01, + 0x63, 0x01, 0x65, 0x01, 0x67, 0x01, 0x69, 0x01, 0x6b, 0x01, 0xa1, 0x01, + 0xa3, 0x01, 0xa5, 0x01, 0xa7, 0x01, 0xa9, 0x01, 0xab, 0x01, 0xe1, 0x01, + 0xe3, 0x01, 0xe5, 0x01, 0xe7, 0x01, 0xe9, 0x01, 0xeb, 0x01, 0xed, 0x01, + 0xef, 0x01, 0xb2, 0x01, 0xb4, 0x01, 0xb6, 0x01, 0xb8, 0x01, 0xba, 0x01, + 0xf1, 0x01, 0xf3, 0x01, 0xf5, 0x01, 0xf7, 0x01, 0xf9, 0x01, 0xfb, 0x01, + 0xc0, 0x11, 0xc2, 0x11, 0xc4, 0x11, 0xc6, 0x11, 0xc8, 0x11, 0xca, 0x11, + 0xc1, 0x15, 0xc3, 0x15, 0xc5, 0x15, 0xc7, 0x15, 0xc9, 0x15, 0xcb, 0x15, + 0xc2, 0x19, 0xc4, 0x19, 0xc6, 0x19, 0xc8, 0x19, 0xca, 0x19, 0xcc, 0x19, + 0xd2, 0x19, 0xd4, 0x19, 0xd6, 0x19, 0xd8, 0x19, 0xda, 0x19, 0xdc, 0x19, + 0xd0, 0x1d, 0xd2, 0x1d, 0xd4, 0x1d, 0xd6, 0x1d, 0xd8, 0x1d, 0xda, 0x1d, + 0xda, 0x1d, 0xef, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x00, 0x64, 0x00, 0x96, 0x00, 0xf1, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x0e, + 0x0e, 0x10, 0x10, 0x10, 0x70, 0x17, 0x00, 0x00, 0xf2, 0x00, 0x84, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x05, 0x00, 0x00, + 0x11, 0x00, 0x01, 0x01, 0x71, 0x02, 0x00, 0x26, 0x61, 0x03, 0x01, 0x26, + 0x71, 0x02, 0x00, 0x27, 0x61, 0x03, 0x01, 0x27, 0x91, 0x04, 0x00, 0x00, + 0x91, 0x04, 0x00, 0x00, 0x91, 0x04, 0x00, 0x00, 0x91, 0x04, 0x00, 0x00, + 0x91, 0x04, 0x00, 0x00, 0x91, 0x04, 0x00, 0x00, 0x91, 0x04, 0x00, 0x00, + 0x91, 0x04, 0x00, 0x00, 0x91, 0x04, 0x00, 0x00, 0x91, 0x04, 0x00, 0x00, + 0x91, 0x04, 0x00, 0x00, 0x91, 0x04, 0x00, 0x00, 0x91, 0x04, 0x00, 0x00, + 0x91, 0x04, 0x00, 0x00, 0x91, 0x04, 0x00, 0x00, 0x91, 0x04, 0x00, 0x00, + 0x91, 0x04, 0x00, 0x00, 0x91, 0x04, 0x00, 0x00, 0x91, 0x04, 0x00, 0x00, + 0x91, 0x04, 0x00, 0x00, 0x91, 0x04, 0x00, 0x00, 0x91, 0x04, 0x00, 0x00, + 0x91, 0x04, 0x00, 0x00, 0x91, 0x04, 0x00, 0x00, 0x91, 0x04, 0x00, 0x00, + 0x91, 0x04, 0x00, 0x00, 0x91, 0x04, 0x00, 0x00, 0xf5, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x05, 0x00, + 0x03, 0xc0, 0x06, 0x00, 0x07, 0xc0, 0x06, 0x00, 0x0b, 0xc0, 0x06, 0x00, + 0x0f, 0xc0, 0x06, 0x00, 0x17, 0xc0, 0x06, 0x00, 0x1f, 0xc0, 0x0a, 0x00, + 0x23, 0xc0, 0x0e, 0x00, 0x27, 0xc0, 0x12, 0x09, 0x2b, 0xc0, 0x9a, 0x11, + 0x33, 0xc0, 0x9e, 0x19, 0x01, 0xc1, 0x82, 0x24, 0x3f, 0xc0, 0xbe, 0x01, + 0x3b, 0xc0, 0x3a, 0x00, 0x03, 0x60, 0x04, 0x00, 0x03, 0xa0, 0x04, 0x00, + 0x03, 0x80, 0x05, 0x00, 0x03, 0xc0, 0x06, 0x00, 0x07, 0xc0, 0x06, 0x00, + 0x0b, 0xc0, 0x06, 0x00, 0x0f, 0xc0, 0x06, 0x00, 0x17, 0xc0, 0x06, 0x00, + 0x1f, 0xc0, 0x0a, 0x00, 0x23, 0xc0, 0x0e, 0x00, 0x27, 0xc0, 0x12, 0x09, + 0x2b, 0xc0, 0x9a, 0x11, 0x33, 0xc0, 0x9e, 0x19, 0x01, 0xc1, 0x82, 0x24, + 0x3f, 0xc0, 0xbe, 0x01, 0x3b, 0xc0, 0x3a, 0x00, 0x03, 0x60, 0x04, 0x00, + 0x03, 0xa0, 0x04, 0x00, 0xf6, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x03, 0x09, 0xfe, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0f, 0x0f, + 0x10, 0x00 +}; +unsigned int nvm_usb_00190200_bin_len = 9470; diff --git a/QualcommWireless/Firmware_WCN7850_Wifi.h b/QualcommWireless/Firmware_WCN7850_Wifi.h new file mode 100644 index 0000000..d8c86b4 --- /dev/null +++ b/QualcommWireless/Firmware_WCN7850_Wifi.h @@ -0,0 +1,36 @@ +#ifndef _FIRMWARE_WCN7850_WIFI_H +#define _FIRMWARE_WCN7850_WIFI_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern const uint8_t wcn7850_amss_bin[]; +extern const uint8_t wcn7850_amss_bin_end[]; + +extern const uint8_t wcn7850_board2_bin[]; +extern const uint8_t wcn7850_board2_bin_end[]; + +extern const uint8_t wcn7850_m3_bin[]; +extern const uint8_t wcn7850_m3_bin_end[]; + +static inline size_t get_wcn7850_amss_size(void) { + return (size_t)(wcn7850_amss_bin_end - wcn7850_amss_bin); +} + +static inline size_t get_wcn7850_board2_size(void) { + return (size_t)(wcn7850_board2_bin_end - wcn7850_board2_bin); +} + +static inline size_t get_wcn7850_m3_size(void) { + return (size_t)(wcn7850_m3_bin_end - wcn7850_m3_bin); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/QualcommWireless/Firmware_WCN7850_Wifi.s b/QualcommWireless/Firmware_WCN7850_Wifi.s new file mode 100644 index 0000000..595de1d --- /dev/null +++ b/QualcommWireless/Firmware_WCN7850_Wifi.s @@ -0,0 +1,18 @@ +.section __TEXT,__const +.globl _wcn7850_amss_bin +.globl _wcn7850_amss_bin_end +_wcn7850_amss_bin: + .incbin "/Users/erwan/Documents/QualcommWireless/firmware/amss.bin" +_wcn7850_amss_bin_end: + +.globl _wcn7850_board2_bin +.globl _wcn7850_board2_bin_end +_wcn7850_board2_bin: + .incbin "/Users/erwan/Documents/QualcommWireless/firmware/board-2.bin" +_wcn7850_board2_bin_end: + +.globl _wcn7850_m3_bin +.globl _wcn7850_m3_bin_end +_wcn7850_m3_bin: + .incbin "/Users/erwan/Documents/QualcommWireless/firmware/m3.bin" +_wcn7850_m3_bin_end: diff --git a/QualcommWireless/Info.plist b/QualcommWireless/Info.plist new file mode 100644 index 0000000..6c437f8 --- /dev/null +++ b/QualcommWireless/Info.plist @@ -0,0 +1,84 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + KEXT + CFBundleShortVersionString + 1.0.2 + CFBundleVersion + 1.0.2 + IOKitPersonalities + + QualcommWireless_BT + + CFBundleIdentifier + com.nawrhehe.QualcommWireless + IOClass + QualcommWireless + IOMatchCategory + QualcommWireless + IOProviderClass + IOUSBHostDevice + idVendor + 1161 + idProduct + 57613 + IOProbeScore + 5000 + + QualcommWireless_WiFi + + CFBundleIdentifier + com.nawrhehe.QualcommWireless + IOClass + QualcommWifi + IOMatchCategory + IODefaultMatchCategory + IONameMatch + pci17cb,1107 + IOPCIPrimaryMatch + 0x110717cb + IOProbeScore + 20000 + IOProviderClass + IOPCIDevice + + + OSBundleLibraries + + com.apple.kpi.libkern + 15.0 + com.apple.kpi.iokit + 15.0 + com.apple.kpi.mach + 15.0 + com.apple.iokit.IOUSBHostFamily + 1.2 + com.apple.iokit.IOPCIFamily + 2.9 + com.apple.iokit.IONetworkingFamily + 3.2 + com.apple.iokit.IO80211Family + 1200.12.2b1 + com.apple.iokit.IOSkywalkFamily + 1.0 + com.apple.driver.corecapture + 1.0.0 + com.apple.kpi.bsd + 15.0 + + OSBundleRequired + Root + + diff --git a/QualcommWireless/QualcommWifi.cpp b/QualcommWireless/QualcommWifi.cpp new file mode 100644 index 0000000..57f544d --- /dev/null +++ b/QualcommWireless/QualcommWifi.cpp @@ -0,0 +1,918 @@ +#include "QualcommWifi.hpp" +#include +#include +#include +#include + +#define super IO80211Controller +OSDefineMetaClassAndStructors(QualcommWifi, IO80211Controller) + +bool QualcommWifi::init(OSDictionary *dictionary) { + if (!super::init(dictionary)) { + return false; + } + fPciDevice = nullptr; + fBar0Map = nullptr; + fBar0Virt = nullptr; + fCurrWindow = 0xFFFFFFFF; + fInterruptSource = nullptr; + fNetif = nullptr; + bzero(&fMacAddress, sizeof(fMacAddress)); + fLinkActive = false; + fCurrentChannel = 1; + fLastRssi = -50; + fSsidLen = 0; + bzero(fSsid, sizeof(fSsid)); + bzero(fBssid, sizeof(fBssid)); + fScanInProgress = false; + fDmaBuf = nullptr; + fDmaPhysAddr = 0; + fDmaVirtAddr = nullptr; + fDmaPrepared = false; + return true; +} + +void QualcommWifi::free(void) { + super::free(); +} + +IOService *QualcommWifi::probe(IOService *provider, SInt32 *score) { + return super::probe(provider, score); +} + +UInt32 QualcommWifi::read32(UInt32 offset) { + if (!fBar0Virt || offset >= 0x200000) { + return 0xFFFFFFFF; + } + return OSReadLittleInt32(fBar0Virt, offset); +} + +void QualcommWifi::write32(UInt32 offset, UInt32 value) { + if (!fBar0Virt || offset >= 0x200000) { + return; + } + OSWriteLittleInt32(fBar0Virt, offset, value); +} + +void QualcommWifi::selectWindow(UInt32 offset) { + UInt32 window = (offset >> ATH12K_PCI_WINDOW_SHIFT) & ATH12K_PCI_WINDOW_VALUE_MASK; + if (window != fCurrWindow) { + write32(ATH12K_PCI_WINDOW_REG_ADDRESS, ATH12K_PCI_WINDOW_ENABLE_BIT | window); + (void)read32(ATH12K_PCI_WINDOW_REG_ADDRESS); + fCurrWindow = window; + } +} + +UInt32 QualcommWifi::socRead32(UInt32 offset) { + if (offset < ATH12K_PCI_WINDOW_START) { + return read32(offset); + } + selectWindow(offset); + return read32(ATH12K_PCI_WINDOW_START + (offset & ATH12K_PCI_WINDOW_RANGE_MASK)); +} + +void QualcommWifi::socWrite32(UInt32 offset, UInt32 value) { + if (offset < ATH12K_PCI_WINDOW_START) { + write32(offset, value); + return; + } + selectWindow(offset); + write32(ATH12K_PCI_WINDOW_START + (offset & ATH12K_PCI_WINDOW_RANGE_MASK), value); +} + +// Équivalent de dma_alloc_coherent() avec DMA_BIT_MASK(36) sous Linux +bool QualcommWifi::allocDmaContext(IOByteCount size) { + fDmaBuf = IOBufferMemoryDescriptor::inTaskWithPhysicalMask( + kernel_task, + static_cast(kIODirectionInOut) | static_cast(kIOMemoryPhysicallyContiguous), + size, + ATH12K_DMA_MASK_36BIT_PAGE + ); + + if (!fDmaBuf) { + IOLog("QualcommWifi: Erreur - Impossible d'allouer le descripteur DMA 36-bit.\n"); + return false; + } + + if (fDmaBuf->prepare(kIODirectionInOut) != kIOReturnSuccess) { + IOLog("QualcommWifi: Erreur - Impossible de verrouiller (prepare) les pages DMA.\n"); + OSSafeReleaseNULL(fDmaBuf); + return false; + } + fDmaPrepared = true; + + fDmaVirtAddr = fDmaBuf->getBytesNoCopy(); + IOByteCount segLen = 0; + fDmaPhysAddr = fDmaBuf->getPhysicalSegment(0, &segLen); + + if (!fDmaVirtAddr || !fDmaPhysAddr || segLen < size) { + IOLog("QualcommWifi: Erreur - Segment physique DMA invalide (segLen=%llu).\n", (uint64_t)segLen); + freeDmaContext(); + return false; + } + + // Remise à zéro de la zone DMA (comme kzalloc / dma_alloc_coherent) + bzero(fDmaVirtAddr, size); + + IOLog("QualcommWifi: Tampon DMA 36-bit pret ! Phys: 0x%llx, Taille: %llu octets (Contigu: %llu)\n", + (uint64_t)fDmaPhysAddr, (uint64_t)size, (uint64_t)segLen); + return true; +} + +void QualcommWifi::freeDmaContext(void) { + if (fDmaBuf) { + if (fDmaPrepared) { + fDmaBuf->complete(kIODirectionInOut); + fDmaPrepared = false; + } + OSSafeReleaseNULL(fDmaBuf); + } + fDmaVirtAddr = nullptr; + fDmaPhysAddr = 0; +} + +void QualcommWifi::interruptOccurred(OSObject *owner, IOInterruptEventSource *src, int count) { + IOLog("QualcommWifi: Interruption materielle MSI recue (count=%d) !\n", count); +} + +bool QualcommWifi::loadBhiFirmware(void) { + if (!fBar0Virt || !fPciDevice) { + return false; + } + + UInt32 bhiOff = read32(ATH12K_MHI_BHIOFF); + UInt32 bhieOff = read32(ATH12K_MHI_BHIEOFF); + if (bhiOff == 0xFFFFFFFF || bhiOff >= 0x200000 || bhieOff == 0xFFFFFFFF || bhieOff >= 0x200000) { + IOLog("QualcommWifi: Erreur - BHI/BHIe Offsets invalides (BHI: 0x%08x, BHIe: 0x%08x)\n", bhiOff, bhieOff); + setProperty("BHI_Load_Error", "Invalid_Offsets"); + return false; + } + + // Désactivation d'ASPM PCIe pour stabiliser le transfert firmware (recommandation ath12k) + UInt8 pciCapOffset = 0; + if (fPciDevice->findPCICapability(kIOPCIPCIExpressCapability, &pciCapOffset) && pciCapOffset != 0) { + UInt16 linkCtrl = fPciDevice->configRead16(pciCapOffset + 0x10); + linkCtrl &= ~0x3; // Désactive ASPM L0s / L1 + fPciDevice->configWrite16(pciCapOffset + 0x10, linkCtrl); + IOLog("QualcommWifi: ASPM PCIe désactivé pour stabilité du transfert firmware (LinkCtrl: 0x%04x)\n", linkCtrl); + } + + // Étape 1 : Réinitialisation MHI et effacement des vecteurs BHIe (ath12k_mhi_clear_vector) + write32(bhieOff + ATH12K_BHIE_TXVECDB, 0); + write32(bhieOff + ATH12K_BHIE_TXVECSTATUS, 0); + write32(bhieOff + ATH12K_BHIE_RXVECDB, 0); + write32(bhieOff + ATH12K_BHIE_RXVECSTATUS, 0); + + write32(ATH12K_MHI_MHICTRL, ATH12K_MHICTRL_RESET_MASK); // MHICTRL_RESET + IODelay(10000); // 10 ms + + size_t fwSize = get_wcn7850_amss_size(); + size_t sblSize = 0x80000; // 512 Ko pour le Secondary Boot Loader (SBL) + if (fwSize < sblSize) { + IOLog("QualcommWifi: Erreur - Taille AMSS trop petite (%lu < 512 Ko)\n", fwSize); + return false; + } + + IOLog("QualcommWifi: Initialisation du chargeur FBC 2-étapes (SBL: 512 Ko, Image totale: %lu octets)...\n", fwSize); + + // Étape 2 : Allocation DMA contigu pour l'image AMSS complète + IOBufferMemoryDescriptor *fwDma = IOBufferMemoryDescriptor::inTaskWithPhysicalMask( + kernel_task, + static_cast(kIODirectionInOut) | static_cast(kIOMemoryPhysicallyContiguous), + fwSize, + ATH12K_DMA_MASK_36BIT_PAGE + ); + + if (!fwDma || fwDma->prepare(kIODirectionInOut) != kIOReturnSuccess) { + IOLog("QualcommWifi: Erreur - Echec allocation/prepare DMA AMSS\n"); + setProperty("BHI_Load_Error", "DMA_Alloc_Failed"); + if (fwDma) OSSafeReleaseNULL(fwDma); + return false; + } + + void *virt = fwDma->getBytesNoCopy(); + IOByteCount segLen = 0; + IOPhysicalAddress phys = fwDma->getPhysicalSegment(0, &segLen); + + if (!virt || !phys || segLen < fwSize) { + IOLog("QualcommWifi: Erreur - Segment DMA AMSS incomplet\n"); + fwDma->complete(kIODirectionInOut); + OSSafeReleaseNULL(fwDma); + return false; + } + + memcpy(virt, wcn7850_amss_bin, fwSize); + setProperty("AMSS_DMA_Phys", (uint64_t)phys, 64); + + // Étape 3 : Chargement du SBL (512 Ko) via BHI en mode PBL + write32(bhiOff + ATH12K_BHI_STATUS, 0); + write32(bhiOff + ATH12K_BHI_IMGADDR_LOW, (UInt32)(phys & 0xFFFFFFFF)); + write32(bhiOff + ATH12K_BHI_IMGADDR_HIGH, (UInt32)((phys >> 32) & 0xFFFFFFFF)); + write32(bhiOff + ATH12K_BHI_IMGSIZE, (UInt32)sblSize); + + // Déclenchement de la sonnette PBL avec Session ID = 1 (NON-NUL exigé par PBL) + write32(bhiOff + ATH12K_BHI_IMGTXDB, 0x1); + IOLog("QualcommWifi: Sonnette BHI_IMGTXDB déclenchée (Session ID = 1, SBL 512 Ko)...\n"); + + UInt32 bhiStatus = 0; + UInt32 timeoutMs = 3000; + bool sblSuccess = false; + + while (timeoutMs > 0) { + bhiStatus = read32(bhiOff + ATH12K_BHI_STATUS); + UInt32 state = (bhiStatus & ATH12K_BHI_STATUS_MASK) >> ATH12K_BHI_STATUS_SHIFT; + if (state == ATH12K_BHI_STATUS_SUCCESS) { + sblSuccess = true; + break; + } else if (state == ATH12K_BHI_STATUS_ERROR) { + UInt32 err = read32(bhiOff + ATH12K_BHI_ERRCODE); + IOLog("QualcommWifi: Erreur BHI SBL (code=0x%08x)\n", err); + setProperty("BHI_ErrorCode", err, 32); + break; + } + IODelay(1000); // 1 ms + timeoutMs--; + } + + setProperty("BHI_FinalStatus", bhiStatus, 32); + setProperty("BHI_Status_Raw", bhiStatus, 32); + setProperty("BHI_Status_State", (bhiStatus & ATH12K_BHI_STATUS_MASK) >> ATH12K_BHI_STATUS_SHIFT, 32); + + // Attente de l'exécution du SBL (BHI_EXECENV == 1) et de la disponibilité MHI (READY) + timeoutMs = 2000; + UInt32 ee = 0; + while (timeoutMs > 0) { + ee = read32(bhiOff + ATH12K_BHI_EXECENV); + UInt32 mhiStat = read32(ATH12K_MHI_MHISTATUS); + if (ee == ATH12K_MHI_EE_SBL || ee == ATH12K_MHI_EE_AMSS || (mhiStat & ATH12K_MHISTATUS_READY_MASK)) { + break; + } + IODelay(1000); + timeoutMs--; + } + + setProperty("BHI_ExecEnv_AfterLoad", ee, 32); + setProperty("MHI_Status_After_SBL", read32(ATH12K_MHI_MHISTATUS), 32); + setProperty("MHI_Ctrl_After_SBL", read32(ATH12K_MHI_MHICTRL), 32); + IOLog("QualcommWifi: SBL BHI terminé (Status=0x%08x, State=%u, ExecEnv=0x%x, SBL_Succes=%d)\n", + bhiStatus, (bhiStatus & ATH12K_BHI_STATUS_MASK) >> ATH12K_BHI_STATUS_SHIFT, ee, sblSuccess); + + // Étape 4 : Configuration des contextes MHI MMIO et transition vers M0 (mhi_ready_state_transition selon Linux ath12k) + bool inM0 = false; + bool amssSuccess = false; + uint32_t processedEvents = 0; + + if (sblSuccess && fDmaPhysAddr != 0) { + // Attente de la confirmation READY dans MHISTATUS + timeoutMs = 3000; + while (timeoutMs > 0) { + UInt32 mstat = read32(ATH12K_MHI_MHISTATUS); + if (mstat & ATH12K_MHISTATUS_READY_MASK) { + break; + } + IODelay(1000); + timeoutMs--; + } + + uint64_t chan_ctxt_phys = fDmaPhysAddr + 0x0000; + uint64_t er_ctxt_phys = fDmaPhysAddr + 0x1000; + uint64_t cmd_ctxt_phys = fDmaPhysAddr + 0x2000; + uint64_t cmd_ring_phys = fDmaPhysAddr + 0x3000; + uint64_t er0_ring_phys = fDmaPhysAddr + 0x4000; + uint64_t er1_ring_phys = fDmaPhysAddr + 0x5000; + + uint32_t cmd_ring_len = 64 * sizeof(struct mhi_ring_element); // 1024 octets (64 TREs) + uint32_t er0_ring_len = 32 * sizeof(struct mhi_ring_element); // 512 octets (32 TREs) selon ath12k WCN7850 + uint32_t er1_ring_len = 256 * sizeof(struct mhi_ring_element); // 4096 octets (256 TREs) + + // 1. Initialisation des 64 contextes de canaux (désactivés au départ) + struct mhi_chan_ctxt *chan_ctxt = (struct mhi_chan_ctxt *)((uint8_t *)fDmaVirtAddr + 0x0000); + bzero(chan_ctxt, 64 * sizeof(struct mhi_chan_ctxt)); + + // 2. Initialisation du contexte d'anneau de commandes + struct mhi_cmd_ctxt *cmd_ctxt = (struct mhi_cmd_ctxt *)((uint8_t *)fDmaVirtAddr + 0x2000); + bzero(cmd_ctxt, sizeof(struct mhi_cmd_ctxt)); + cmd_ctxt[0].rbase = OSSwapHostToLittleInt64(cmd_ring_phys); + cmd_ctxt[0].rlen = OSSwapHostToLittleInt64(cmd_ring_len); + cmd_ctxt[0].rp = OSSwapHostToLittleInt64(cmd_ring_phys); + cmd_ctxt[0].wp = OSSwapHostToLittleInt64(cmd_ring_phys); + + // 3. Initialisation des contextes d'anneau d'événements (2 anneaux selon WCN7850 ath12k) + struct mhi_event_ctxt *evCtxt = (struct mhi_event_ctxt *)((uint8_t *)fDmaVirtAddr + 0x1000); + bzero(evCtxt, 2 * sizeof(struct mhi_event_ctxt)); + + // Event Ring 0: CTRL ring, 32 TREs + evCtxt[0].intmod = 0; + evCtxt[0].ertype = OSSwapHostToLittleInt32(1); // MHI_ER_TYPE_VALID + evCtxt[0].msivec = 0; + evCtxt[0].rbase = OSSwapHostToLittleInt64(er0_ring_phys); + evCtxt[0].rlen = OSSwapHostToLittleInt64(er0_ring_len); + evCtxt[0].rp = OSSwapHostToLittleInt64(er0_ring_phys); + evCtxt[0].wp = OSSwapHostToLittleInt64(er0_ring_phys); + + // Event Ring 1: DATA ring, 256 TREs + evCtxt[1].intmod = OSSwapHostToLittleInt32(1); + evCtxt[1].ertype = OSSwapHostToLittleInt32(1); // MHI_ER_TYPE_VALID + evCtxt[1].msivec = 0; + evCtxt[1].rbase = OSSwapHostToLittleInt64(er1_ring_phys); + evCtxt[1].rlen = OSSwapHostToLittleInt64(er1_ring_len); + evCtxt[1].rp = OSSwapHostToLittleInt64(er1_ring_phys); + evCtxt[1].wp = OSSwapHostToLittleInt64(er1_ring_phys); + + bzero((uint8_t *)fDmaVirtAddr + 0x3000, cmd_ring_len); + bzero((uint8_t *)fDmaVirtAddr + 0x4000, er0_ring_len); + bzero((uint8_t *)fDmaVirtAddr + 0x5000, er1_ring_len); + + // 4. Programmation des registres MMIO MHI + write32(ATH12K_MHI_CCABAP_HIGHER, (UInt32)((chan_ctxt_phys >> 32) & 0xFFFFFFFF)); + write32(ATH12K_MHI_CCABAP_LOWER, (UInt32)(chan_ctxt_phys & 0xFFFFFFFF)); + write32(ATH12K_MHI_ECABAP_HIGHER, (UInt32)((er_ctxt_phys >> 32) & 0xFFFFFFFF)); + write32(ATH12K_MHI_ECABAP_LOWER, (UInt32)(er_ctxt_phys & 0xFFFFFFFF)); + write32(ATH12K_MHI_CRCBAP_HIGHER, (UInt32)((cmd_ctxt_phys >> 32) & 0xFFFFFFFF)); + write32(ATH12K_MHI_CRCBAP_LOWER, (UInt32)(cmd_ctxt_phys & 0xFFFFFFFF)); + + // MHICFG (0x10): total_ev_rings = 2, hw_ev_rings = 0 (tous logiciels pour WCN7850) + write32(ATH12K_MHI_MHICFG, (2 << 16) | (0 << 24)); + + write32(ATH12K_MHI_MHICTRLBASE_HIGHER, 0); + write32(ATH12K_MHI_MHICTRLBASE_LOWER, 0); + write32(ATH12K_MHI_MHIDATABASE_HIGHER, 0); + write32(ATH12K_MHI_MHIDATABASE_LOWER, 0); + + write32(ATH12K_MHI_MHICTRLLIMIT_HIGHER, 0x0F); + write32(ATH12K_MHI_MHICTRLLIMIT_LOWER, 0xFFFFFFFF); + write32(ATH12K_MHI_MHIDATALIMIT_HIGHER, 0x0F); + write32(ATH12K_MHI_MHIDATALIMIT_LOWER, 0xFFFFFFFF); + + // 5. Armement des Event Ring Doorbells (ERDB) + // Linux mhi_write_db : écrit d'abord les bits de poids fort (+4), puis les bits de poids faible (+0) ! + uint64_t er0_armed_wp = er0_ring_phys + er0_ring_len - sizeof(struct mhi_ring_element); + evCtxt[0].wp = OSSwapHostToLittleInt64(er0_armed_wp); + + uint64_t er1_armed_wp = er1_ring_phys + er1_ring_len - sizeof(struct mhi_ring_element); + evCtxt[1].wp = OSSwapHostToLittleInt64(er1_armed_wp); + + UInt32 erdbOff = read32(ATH12K_MHI_ERDBOFF); + if (erdbOff != 0 && erdbOff < 0x200000) { + // Sonnette ER0 (erdbOff + 0) + write32(erdbOff + 4, (UInt32)((er0_armed_wp >> 32) & 0xFFFFFFFF)); + write32(erdbOff + 0, (UInt32)(er0_armed_wp & 0xFFFFFFFF)); + + // Sonnette ER1 (erdbOff + 8) + write32(erdbOff + 8 + 4, (UInt32)((er1_armed_wp >> 32) & 0xFFFFFFFF)); + write32(erdbOff + 8 + 0, (UInt32)(er1_armed_wp & 0xFFFFFFFF)); + + IOLog("QualcommWifi: Event Ring Doorbells armées (ER0 @ 0x%08x WP=0x%llx, ER1 @ 0x%08x WP=0x%llx) !\n", + erdbOff, er0_armed_wp, erdbOff + 8, er1_armed_wp); + setProperty("ERDB_Offset", erdbOff, 32); + } + + // 6. Bascule vers l'état M0 + UInt32 mhiCtrlVal = read32(ATH12K_MHI_MHICTRL); + mhiCtrlVal &= ~ATH12K_MHICTRL_MHISTATE_MASK; + mhiCtrlVal |= (ATH12K_MHI_STATE_M0 << ATH12K_MHICTRL_MHISTATE_SHIFT); + write32(ATH12K_MHI_MHICTRL, mhiCtrlVal); + IOLog("QualcommWifi: Transition MHI vers M0 demandée (MHICTRL: 0x%08x)...\n", mhiCtrlVal); + } + + // Étape 5 : Téléversement FBC complet du firmware via BHIe (mhi_download_amss_image sous SBL actif) + const size_t segSize = 0x80000; // Segments de 512 Ko (SZ_512K exigé par ath12k) + int numVecEntries = (int)((fwSize + segSize - 1) / segSize); // 12 segments pour l'image complète + + IOBufferMemoryDescriptor *vecDma = IOBufferMemoryDescriptor::inTaskWithPhysicalMask( + kernel_task, + static_cast(kIODirectionInOut) | static_cast(kIOMemoryPhysicallyContiguous), + numVecEntries * sizeof(struct bhi_vec_entry), + ATH12K_DMA_MASK_36BIT_PAGE + ); + + if (vecDma) { + if (vecDma->prepare(kIODirectionInOut) == kIOReturnSuccess) { + struct bhi_vec_entry *vecTable = (struct bhi_vec_entry *)vecDma->getBytesNoCopy(); + IOByteCount vecLen = 0; + IOPhysicalAddress vecPhys = vecDma->getPhysicalSegment(0, &vecLen); + + if (vecTable && vecPhys) { + size_t curRem = fwSize; + + for (int i = 0; i < numVecEntries; i++) { + size_t chunk = (curRem > segSize) ? segSize : curRem; + vecTable[i].dma_addr = OSSwapHostToLittleInt64((uint64_t)phys + (uint64_t)i * segSize); + vecTable[i].size = OSSwapHostToLittleInt64(chunk); + curRem -= chunk; + } + + IOLog("QualcommWifi: Table vectorielle BHIe FBC prête (%d segments, Phys: 0x%llx). Programmation BHIe...\n", + numVecEntries, (uint64_t)vecPhys); + + write32(bhieOff + ATH12K_BHIE_TXVECADDR_LOW, (UInt32)(vecPhys & 0xFFFFFFFF)); + write32(bhieOff + ATH12K_BHIE_TXVECADDR_HIGH, (UInt32)((vecPhys >> 32) & 0xFFFFFFFF)); + write32(bhieOff + ATH12K_BHIE_TXVECSIZE, (UInt32)(numVecEntries * sizeof(struct bhi_vec_entry))); + write32(bhieOff + ATH12K_BHIE_TXVECSTATUS, 0); + + // Sonnette BHIe avec Sequence ID = 1 + write32(bhieOff + ATH12K_BHIE_TXVECDB, 0x1); + + UInt32 bhieStatus = 0; + timeoutMs = 10000; // 10 secondes pour le transfert DMA complet de 6 Mo + while (timeoutMs > 0) { + bhieStatus = read32(bhieOff + ATH12K_BHIE_TXVECSTATUS); + UInt32 bhieState = (bhieStatus & ATH12K_BHIE_TXVECSTATUS_STATUS_MASK) >> ATH12K_BHIE_TXVECSTATUS_STATUS_SHIFT; + if (bhieState == ATH12K_BHIE_TXVECSTATUS_XFER_COMPL) { + amssSuccess = true; + break; + } + IODelay(1000); + timeoutMs--; + } + + setProperty("BHIE_FinalStatus", bhieStatus, 32); + setProperty("BHIE_Status_Raw", bhieStatus, 32); + setProperty("BHIE_Status_State", (bhieStatus & ATH12K_BHIE_TXVECSTATUS_STATUS_MASK) >> ATH12K_BHIE_TXVECSTATUS_STATUS_SHIFT, 32); + IOLog("QualcommWifi: BHIe DMA terminé (Status=0x%08x) ! Dépouillement des événements MHI...\n", bhieStatus); + + // Étape 6 : Dépouillement des événements MHI émis par SBL / AMSS sur l'anneau 0 + struct mhi_ring_element *erElements = (struct mhi_ring_element *)((uint8_t *)fDmaVirtAddr + 0x4000); + + timeoutMs = 5000; + while (timeoutMs > 0) { + UInt32 mstat = read32(ATH12K_MHI_MHISTATUS); + UInt32 mstate = (mstat & ATH12K_MHISTATUS_MHISTATE_MASK) >> ATH12K_MHISTATUS_MHISTATE_SHIFT; + + while (processedEvents < 32) { + struct mhi_ring_element *el = &erElements[processedEvents]; + UInt32 dw1 = OSSwapLittleToHostInt32(el->dword[1]); + UInt32 dw0 = OSSwapLittleToHostInt32(el->dword[0]); + if (dw1 == 0 && dw0 == 0) { + break; + } + + UInt8 evType = (dw1 >> 16) & 0xFF; + UInt8 evCode = (dw0 >> 24) & 0xFF; + IOLog("QualcommWifi: Événement MHI reçu #%u: Type=0x%02x, Code=0x%02x, PTR=0x%llx\n", + processedEvents, evType, evCode, OSSwapLittleToHostInt64(el->ptr)); + + char evKey[32]; + snprintf(evKey, sizeof(evKey), "MHI_Event_%u_Type", processedEvents); + setProperty(evKey, evType, 8); + snprintf(evKey, sizeof(evKey), "MHI_Event_%u_Code", processedEvents); + setProperty(evKey, evCode, 8); + snprintf(evKey, sizeof(evKey), "MHI_Event_%u_PTR", processedEvents); + setProperty(evKey, OSSwapLittleToHostInt64(el->ptr), 64); + + if (evType == ATH12K_MHI_PKT_TYPE_STATE_CHANGE_EVENT) { + IOLog("QualcommWifi: -> Notification changement d'état MHI: State=%u\n", evCode); + if (evCode == ATH12K_MHI_STATE_M0) { + inM0 = true; + } + } else if (evType == ATH12K_MHI_PKT_TYPE_EE_EVENT) { + IOLog("QualcommWifi: -> Notification environnement d'exécution (EE): 0x%x\n", evCode); + ee = evCode; + if (ee == ATH12K_MHI_EE_AMSS || ee == ATH12K_MHI_EE_WFW) { + amssSuccess = true; + } + } + processedEvents++; + } + + if (mstate == ATH12K_MHI_STATE_M0 || inM0 || ee == ATH12K_MHI_EE_AMSS || ee == ATH12K_MHI_EE_WFW) { + inM0 = true; + IOLog("QualcommWifi: MHI en mode Mission M0 (MHISTATUS: 0x%08x, EE: 0x%x) !\n", mstat, ee); + break; + } + + IODelay(1000); + timeoutMs--; + } + + setProperty("MHI_Events_Processed", processedEvents, 32); + setProperty("MHI_Status_In_M0", read32(ATH12K_MHI_MHISTATUS), 32); + setProperty("MHI_In_M0", inM0); + setProperty("BHI_ExecEnv_Final", ee, 32); + } + + vecDma->complete(kIODirectionInOut); + } + OSSafeReleaseNULL(vecDma); + } + + if (inM0 || ee == ATH12K_MHI_EE_AMSS || ee == ATH12K_MHI_EE_WFW) { + IOLog("QualcommWifi: SUCCÈS MAJEUR ! Firmware WCN7850 actif en mode Mission (ExecEnv=0x%x, M0=%d) !\n", ee, inM0); + setProperty("Driver_Status", "AMSS_Loaded_Success"); + } else if (sblSuccess) { + IOLog("QualcommWifi: SBL actif (ExecEnv=0x%x, BHIe=0x%x)\n", ee, read32(bhieOff + ATH12K_BHIE_TXVECSTATUS)); + setProperty("Driver_Status", "SBL_Loaded_Success"); + } else { + IOLog("QualcommWifi: Échec chargement complet (BHI=0x%x, ExecEnv=0x%x)\n", bhiStatus, ee); + setProperty("Driver_Status", "AMSS_Load_Timeout_Or_Error"); + } + + fwDma->complete(kIODirectionInOut); + OSSafeReleaseNULL(fwDma); + + return (sblSuccess || amssSuccess); +} + +bool QualcommWifi::start(IOService *provider) { + if (!super::start(provider)) { + return false; + } + + fPciDevice = OSDynamicCast(IOPCIDevice, provider); + if (!fPciDevice) { + return false; + } + fPciDevice->retain(); + + if (!fPciDevice->open(this)) { + OSSafeReleaseNULL(fPciDevice); + return false; + } + + UInt16 pciCommand = fPciDevice->configRead16(kIOPCIConfigCommand); + pciCommand |= (kIOPCICommandMemorySpace | kIOPCICommandBusMaster); + fPciDevice->configWrite16(kIOPCIConfigCommand, pciCommand); + + fBar0Map = fPciDevice->mapDeviceMemoryWithRegister(kIOPCIConfigBaseAddress0); + if (!fBar0Map) { + fPciDevice->close(this); + OSSafeReleaseNULL(fPciDevice); + return false; + } + fBar0Virt = (volatile void *)fBar0Map->getVirtualAddress(); + + UInt32 socHwVer = socRead32(TCSR_SOC_HW_VERSION); + UInt32 major = (socHwVer & TCSR_SOC_HW_VERSION_MAJOR_MASK) >> TCSR_SOC_HW_VERSION_MAJOR_SHIFT; + UInt32 minor = (socHwVer & TCSR_SOC_HW_VERSION_MINOR_MASK); + IOLog("QualcommWifi: WCN7850 HW v%u.%u detecte (0x%08x)\n", major, minor, socHwVer); + + setProperty("SoC_Version", socHwVer, 32); + setProperty("SoC_Major", major, 32); + setProperty("SoC_Minor", minor, 32); + + // Lecture des registres de contrôle MHI et pointeurs BHI + UInt32 mhiStatus = read32(ATH12K_MHI_MHISTATUS); + UInt32 mhiCtrl = read32(ATH12K_MHI_MHICTRL); + UInt32 bhiOff = read32(ATH12K_MHI_BHIOFF); + UInt32 bhieOff = read32(ATH12K_MHI_BHIEOFF); + IOLog("QualcommWifi: MHI STATUS=0x%08x, CTRL=0x%08x, BHIOFF=0x%08x, BHIEOFF=0x%08x\n", + mhiStatus, mhiCtrl, bhiOff, bhieOff); + + setProperty("MHI_Status", mhiStatus, 32); + setProperty("MHI_Ctrl", mhiCtrl, 32); + setProperty("BHI_Offset", bhiOff, 32); + setProperty("BHIE_Offset", bhieOff, 32); + + if (bhiOff != 0xFFFFFFFF && bhiOff < 0x200000) { + UInt32 bhiMajor = read32(bhiOff + ATH12K_BHI_BHIVERSION_MAJOR); + UInt32 bhiMinor = read32(bhiOff + ATH12K_BHI_BHIVERSION_MINOR); + UInt32 bhiEe = read32(bhiOff + ATH12K_BHI_EXECENV); + UInt32 bhiStat = read32(bhiOff + ATH12K_BHI_STATUS); + UInt32 bhiSerial = read32(bhiOff + ATH12K_BHI_SERIALNU); + IOLog("QualcommWifi: BHI v%u.%u: ExecEnv=0x%x, Status=0x%x, Serial=0x%08x\n", + bhiMajor, bhiMinor, bhiEe, bhiStat, bhiSerial); + + setProperty("BHI_Major", bhiMajor, 32); + setProperty("BHI_Minor", bhiMinor, 32); + setProperty("BHI_ExecEnv", bhiEe, 32); + setProperty("BHI_Status", bhiStat, 32); + setProperty("BHI_Serial", bhiSerial, 32); + } + + // Allocation du tampon DMA 36-bit pour les anneaux MHI / BHI + if (!allocDmaContext(ATH12K_DMA_TEST_RING_SIZE)) { + OSSafeReleaseNULL(fBar0Map); + fPciDevice->close(this); + OSSafeReleaseNULL(fPciDevice); + return false; + } + + setProperty("DMA_PhysAddr", (uint64_t)fDmaPhysAddr, 64); + setProperty("Driver_Status", "Hardware_Initialized"); + + int msiIndex = -1; + for (int i = 0; ; i++) { + int intrType = 0; + if (fPciDevice->getInterruptType(i, &intrType) != kIOReturnSuccess) { + break; + } + if (intrType & kIOInterruptTypePCIMessaged) { + msiIndex = i; + break; + } + } + + IOWorkLoop *workLoop = getWorkLoop(); + if (msiIndex >= 0 && workLoop) { + fInterruptSource = IOInterruptEventSource::interruptEventSource( + this, &QualcommWifi::interruptOccurred, fPciDevice, msiIndex); + if (fInterruptSource && workLoop->addEventSource(fInterruptSource) == kIOReturnSuccess) { + fInterruptSource->enable(); + IOLog("QualcommWifi: MSI index %d actif.\n", msiIndex); + } + } + + // Chargement du firmware radio AMSS via le protocole BHI + (void)loadBhiFirmware(); + + // Configuration de l'adresse MAC (OUI Qualcomm 00:03:7F + BHI serial) + UInt32 bhiSerial = read32(bhiOff + ATH12K_BHI_SERIALNU); + fMacAddress.bytes[0] = 0x00; + fMacAddress.bytes[1] = 0x03; + fMacAddress.bytes[2] = 0x7F; + fMacAddress.bytes[3] = (bhiSerial >> 16) & 0xFF; + fMacAddress.bytes[4] = (bhiSerial >> 8) & 0xFF; + fMacAddress.bytes[5] = (bhiSerial) & 0xFF; + + IOLog("QualcommWifi: Adresse MAC physique : %02x:%02x:%02x:%02x:%02x:%02x\n", + fMacAddress.bytes[0], fMacAddress.bytes[1], fMacAddress.bytes[2], + fMacAddress.bytes[3], fMacAddress.bytes[4], fMacAddress.bytes[5]); + + // Configuration des propriétés Wi-Fi AirPort pour macOS et airportd + setProperty("IO80211AirPort", true); + setProperty("AirPort", true); + setProperty("IO80211Locale", "ETSI"); + setProperty("IO80211CountryCode", "FR"); + setProperty("IO80211ScanCache", true); + setProperty("IO80211RadioState", (UInt64)1, 32); + + // Configuration et publication des médias supportés (Auto / 1Gbps) + OSDictionary *mediumDict = OSDictionary::withCapacity(1); + if (mediumDict) { + IONetworkMedium *medium = IONetworkMedium::medium(kIOMediumEthernetAuto, 1000000000ULL); + if (medium) { + IONetworkMedium::addMedium(mediumDict, medium); + publishMediumDictionary(mediumDict); + setSelectedMedium(medium); + medium->release(); + } + mediumDict->release(); + } + + // Attachement de l'interface Wi-Fi native (IO80211Interface) + if (attachInterface((IONetworkInterface **)&fNetif, true)) { + IOLog("QualcommWifi: Interface Wi-Fi native (IO80211Interface) attachee avec succes !\n"); + setProperty("Network_Interface_Attached", true); + } else { + IOLog("QualcommWifi: Echec de attachInterface IO80211.\n"); + setProperty("Network_Interface_Attached", false); + } + + registerService(); + return true; +} + +void QualcommWifi::stop(IOService *provider) { + IOLog("QualcommWifi: Arret du pilote, liberation interface reseau, MSI, DMA et BAR0.\n"); + + if (fNetif) { + detachInterface(fNetif); + OSSafeReleaseNULL(fNetif); + } + + IOWorkLoop *workLoop = getWorkLoop(); + if (fInterruptSource) { + fInterruptSource->disable(); + if (workLoop) { + workLoop->removeEventSource(fInterruptSource); + } + OSSafeReleaseNULL(fInterruptSource); + } + + // Déverrouillage et libération du tampon DMA avant la fermeture PCIe + freeDmaContext(); + + fBar0Virt = nullptr; + if (fBar0Map) { + OSSafeReleaseNULL(fBar0Map); + } + + if (fPciDevice) { + fPciDevice->close(this); + OSSafeReleaseNULL(fPciDevice); + } + + super::stop(provider); +} + +IOReturn QualcommWifi::getHardwareAddress(IOEthernetAddress *addrP) { + if (!addrP) return kIOReturnBadArgument; + bcopy(&fMacAddress, addrP, sizeof(IOEthernetAddress)); + return kIOReturnSuccess; +} + +IOReturn QualcommWifi::enable(IONetworkInterface *netif) { + IOLog("QualcommWifi: Interface reseau activee par macOS.\n"); + const IONetworkMedium *medium = getSelectedMedium(); + setLinkStatus(kIONetworkLinkValid | kIONetworkLinkActive, medium); + return kIOReturnSuccess; +} + +IOReturn QualcommWifi::disable(IONetworkInterface *netif) { + IOLog("QualcommWifi: Interface reseau desactivee par macOS.\n"); + setLinkStatus(kIONetworkLinkValid, nullptr); + return kIOReturnSuccess; +} + +UInt32 QualcommWifi::outputPacket(mbuf_t m, void *param) { + if (m) { + freePacket(m); + } + return kIOReturnOutputDropped; +} + +SInt32 QualcommWifi::apple80211Request(unsigned int req_type, int req_val, IO80211Interface* iface, void* req_data) { + switch (req_type) { + case APPLE80211_IOC_CARD_CAPABILITIES: { + apple80211_capability_data *cap = (apple80211_capability_data *)req_data; + if (cap) { + bzero(cap, sizeof(*cap)); + cap->version = APPLE80211_VERSION; + #define SET_CAP(c) (cap->capabilities[(c) / 8] |= (1 << ((c) % 8))) + SET_CAP(APPLE80211_CAP_WEP); + SET_CAP(APPLE80211_CAP_TKIP); + SET_CAP(APPLE80211_CAP_AES_CCM); + SET_CAP(APPLE80211_CAP_WPA1); + SET_CAP(APPLE80211_CAP_WPA2); + SET_CAP(APPLE80211_CAP_WPA); + SET_CAP(APPLE80211_CAP_SHORT_GI_20MHZ); + SET_CAP(APPLE80211_CAP_SHORT_GI_40MHZ); + #undef SET_CAP + return 0; + } + break; + } + case APPLE80211_IOC_STATE: { + apple80211_state_data *state = (apple80211_state_data *)req_data; + if (state) { + state->version = APPLE80211_VERSION; + state->state = fLinkActive ? APPLE80211_S_RUN : APPLE80211_S_INIT; + return 0; + } + break; + } + case APPLE80211_IOC_PHY_MODE: { + apple80211_phymode_data *pm = (apple80211_phymode_data *)req_data; + if (pm) { + pm->version = APPLE80211_VERSION; + pm->phy_mode = APPLE80211_MODE_11AX; + pm->active_phy_mode = APPLE80211_MODE_11AX; + return 0; + } + break; + } + case APPLE80211_IOC_OP_MODE: { + apple80211_opmode_data *om = (apple80211_opmode_data *)req_data; + if (om) { + om->version = APPLE80211_VERSION; + om->op_mode = APPLE80211_M_STA; + return 0; + } + break; + } + case APPLE80211_IOC_CHANNEL: { + apple80211_channel_data *cd = (apple80211_channel_data *)req_data; + if (cd) { + cd->version = APPLE80211_VERSION; + cd->channel.version = APPLE80211_VERSION; + cd->channel.channel = fCurrentChannel > 0 ? fCurrentChannel : 1; + cd->channel.flags = APPLE80211_C_FLAG_2GHZ | APPLE80211_C_FLAG_20MHZ; + return 0; + } + break; + } + case APPLE80211_IOC_RSSI: { + apple80211_rssi_data *rd = (apple80211_rssi_data *)req_data; + if (rd) { + rd->version = APPLE80211_VERSION; + rd->num_radios = 1; + rd->rssi_unit = APPLE80211_UNIT_DBM; + rd->rssi[0] = fLastRssi ? fLastRssi : -50; + rd->aggregate_rssi = rd->rssi[0]; + return 0; + } + break; + } + case APPLE80211_IOC_NOISE: { + apple80211_noise_data *nd = (apple80211_noise_data *)req_data; + if (nd) { + nd->version = APPLE80211_VERSION; + nd->num_radios = 1; + nd->noise_unit = APPLE80211_UNIT_DBM; + nd->noise[0] = -95; + nd->aggregate_noise = -95; + return 0; + } + break; + } + case APPLE80211_IOC_SSID: { + apple80211_ssid_data *sd = (apple80211_ssid_data *)req_data; + if (sd) { + sd->version = APPLE80211_VERSION; + sd->ssid_len = fSsidLen; + memcpy(sd->ssid_bytes, fSsid, fSsidLen); + return 0; + } + break; + } + case APPLE80211_IOC_BSSID: { + apple80211_bssid_data *bd = (apple80211_bssid_data *)req_data; + if (bd) { + bd->version = APPLE80211_VERSION; + memcpy(bd->bssid.octet, fBssid, 6); + return 0; + } + break; + } + case APPLE80211_IOC_RATE: { + apple80211_rate_data *rate = (apple80211_rate_data *)req_data; + if (rate) { + rate->version = APPLE80211_VERSION; + rate->num_radios = 1; + rate->rate[0] = 1200; + return 0; + } + break; + } + case APPLE80211_IOC_SUPPORTED_CHANNELS: { + apple80211_sup_channel_data *sc = (apple80211_sup_channel_data *)req_data; + if (sc) { + sc->version = APPLE80211_VERSION; + static const UInt16 chs[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 149, 153, 157, 161, 165 }; + sc->num_channels = sizeof(chs)/sizeof(chs[0]); + for (int i = 0; i < sc->num_channels; i++) { + sc->supported_channels[i].version = APPLE80211_VERSION; + sc->supported_channels[i].channel = chs[i]; + sc->supported_channels[i].flags = (chs[i] <= 14) ? (APPLE80211_C_FLAG_2GHZ | APPLE80211_C_FLAG_20MHZ) : (APPLE80211_C_FLAG_5GHZ | APPLE80211_C_FLAG_80MHZ); + } + return 0; + } + break; + } + case APPLE80211_IOC_SCAN_REQ: { + IOLog("QualcommWifi: Requete de scan Wi-Fi recue depuis airportd !\n"); + fScanInProgress = true; + return 0; + } + case APPLE80211_IOC_SCAN_RESULT: { + return 0; + } + case APPLE80211_IOC_ASSOCIATE: { + apple80211_assoc_data *assoc = (apple80211_assoc_data *)req_data; + if (assoc) { + IOLog("QualcommWifi: Demande d'association au reseau Wi-Fi : %.*s\n", assoc->ad_ssid_len, assoc->ad_ssid); + fSsidLen = (assoc->ad_ssid_len < APPLE80211_MAX_SSID_LEN) ? assoc->ad_ssid_len : APPLE80211_MAX_SSID_LEN; + memcpy(fSsid, assoc->ad_ssid, fSsidLen); + memcpy(fBssid, assoc->ad_bssid.octet, 6); + fLinkActive = true; + return 0; + } + break; + } + case APPLE80211_IOC_DISASSOCIATE: { + IOLog("QualcommWifi: Deconnexion Wi-Fi demandee par macOS.\n"); + fLinkActive = false; + fSsidLen = 0; + return 0; + } + default: + break; + } + return 0; +} + +SInt32 QualcommWifi::apple80211SkywalkRequest(UInt req_type, int req_val, IO80211SkywalkInterface *iface, void *req_data) { + return apple80211Request(req_type, req_val, nullptr, req_data); +} + +SInt32 QualcommWifi::stopDMA() { + IOLog("QualcommWifi: stopDMA appele.\n"); + return 0; +} + +UInt32 QualcommWifi::hardwareOutputQueueDepth(IO80211Interface *iface) { + return 0; +} + +SInt32 QualcommWifi::performCountryCodeOperation(IO80211Interface *iface, IO80211CountryCodeOp op) { + IOLog("QualcommWifi: performCountryCodeOperation op=%d.\n", op); + return 0; +} + +SInt32 QualcommWifi::enableFeature(IO80211FeatureCode code, void *arg) { + IOLog("QualcommWifi: enableFeature code=%d.\n", code); + return 0; +} + +IOReturn QualcommWifi::enable(IO80211SkywalkInterface *netif) { + IOLog("QualcommWifi: Skywalk Interface activee par macOS.\n"); + fLinkActive = true; + return kIOReturnSuccess; +} + +IOReturn QualcommWifi::disable(IO80211SkywalkInterface *netif) { + IOLog("QualcommWifi: Skywalk Interface desactivee par macOS.\n"); + fLinkActive = false; + return kIOReturnSuccess; +} diff --git a/QualcommWireless/QualcommWifi.hpp b/QualcommWireless/QualcommWifi.hpp new file mode 100644 index 0000000..696e53d --- /dev/null +++ b/QualcommWireless/QualcommWifi.hpp @@ -0,0 +1,255 @@ +#ifndef _QUALCOMMWIFI_HPP +#define _QUALCOMMWIFI_HPP + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + +#include +#include +#include +#include +#include + +// Registres PCIe et constantes de fenêtrage (ath12k/pci.h) +#define ATH12K_PCI_SOC_GLOBAL_RESET 0x3008 +#define ATH12K_PCI_WINDOW_REG_ADDRESS 0x310c +#define ATH12K_PCI_WINDOW_ENABLE_BIT 0x40000000 +#define ATH12K_PCI_WINDOW_START 0x80000 +#define ATH12K_PCI_WINDOW_RANGE_MASK 0x7FFFF +#define ATH12K_PCI_WINDOW_SHIFT 19 +#define ATH12K_PCI_WINDOW_VALUE_MASK 0x3F + +// Registre de révision matérielle du SoC Qualcomm WCN7850 +#define TCSR_SOC_HW_VERSION 0x1B00000 +#define TCSR_SOC_HW_VERSION_MAJOR_MASK 0x0F00 +#define TCSR_SOC_HW_VERSION_MAJOR_SHIFT 8 +#define TCSR_SOC_HW_VERSION_MINOR_MASK 0x00FF + +// Masque DMA 36-bit aligné sur 4 Ko (4096 octets) exigé par WCN7850 +#define ATH12K_DMA_MASK_36BIT_PAGE 0x0000000FFFFFF000ULL +#define ATH12K_DMA_TEST_RING_SIZE 65536 // 64 Ko pour le contexte MHI + +// Registres MHI MMIO (bar0 direct) +#define ATH12K_MHI_MHIREGLEN 0x00 +#define ATH12K_MHI_MHIVER 0x08 +#define ATH12K_MHI_MHICFG 0x10 +#define ATH12K_MHI_CHDBOFF 0x18 +#define ATH12K_MHI_ERDBOFF 0x20 +#define ATH12K_MHI_BHIOFF 0x28 +#define ATH12K_MHI_BHIEOFF 0x2c +#define ATH12K_MHI_DEBUGOFF 0x30 +#define ATH12K_MHI_MHICTRL 0x38 +#define ATH12K_MHI_MHISTATUS 0x48 +#define ATH12K_MHI_CCABAP_LOWER 0x58 +#define ATH12K_MHI_CCABAP_HIGHER 0x5c +#define ATH12K_MHI_ECABAP_LOWER 0x60 +#define ATH12K_MHI_ECABAP_HIGHER 0x64 +#define ATH12K_MHI_CRCBAP_LOWER 0x68 +#define ATH12K_MHI_CRCBAP_HIGHER 0x6c +#define ATH12K_MHI_CRDB_LOWER 0x70 +#define ATH12K_MHI_CRDB_HIGHER 0x74 +#define ATH12K_MHI_MHICTRLBASE_LOWER 0x80 +#define ATH12K_MHI_MHICTRLBASE_HIGHER 0x84 +#define ATH12K_MHI_MHICTRLLIMIT_LOWER 0x88 +#define ATH12K_MHI_MHICTRLLIMIT_HIGHER 0x8c +#define ATH12K_MHI_MHIDATABASE_LOWER 0x98 +#define ATH12K_MHI_MHIDATABASE_HIGHER 0x9c +#define ATH12K_MHI_MHIDATALIMIT_LOWER 0xa0 +#define ATH12K_MHI_MHIDATALIMIT_HIGHER 0xa4 + +// États MHI +#define ATH12K_MHI_STATE_RESET 0x0 +#define ATH12K_MHI_STATE_READY 0x1 +#define ATH12K_MHI_STATE_M0 0x2 +#define ATH12K_MHI_STATE_M1 0x3 +#define ATH12K_MHI_STATE_M2 0x4 +#define ATH12K_MHI_STATE_M3 0x5 + +// Environnements d'exécution MHI (EE) +#define ATH12K_MHI_EE_PBL 0x00 +#define ATH12K_MHI_EE_SBL 0x01 +#define ATH12K_MHI_EE_AMSS 0x02 +#define ATH12K_MHI_EE_RDDM 0x03 +#define ATH12K_MHI_EE_WFW 0x04 + +#define ATH12K_MHISTATUS_READY_MASK 0x00000001 +#define ATH12K_MHICTRL_RESET_MASK 0x00000002 +#define ATH12K_MHICTRL_MHISTATE_SHIFT 8 +#define ATH12K_MHICTRL_MHISTATE_MASK 0x0000FF00 +#define ATH12K_MHISTATUS_MHISTATE_SHIFT 8 +#define ATH12K_MHISTATUS_MHISTATE_MASK 0x0000FF00 +#define ATH12K_MHICFG_NER_MASK 0x00FF0000 +#define ATH12K_MHICFG_NHWER_MASK 0xFF000000 + +// Types de paquets d'événements MHI +#define ATH12K_MHI_PKT_TYPE_STATE_CHANGE_EVENT 0x20 +#define ATH12K_MHI_PKT_TYPE_EE_EVENT 0x40 + +// Registres BHI (Boot Host Interface) +#define ATH12K_BHI_BHIVERSION_MINOR 0x00 +#define ATH12K_BHI_BHIVERSION_MAJOR 0x04 +#define ATH12K_BHI_IMGADDR_LOW 0x08 +#define ATH12K_BHI_IMGADDR_HIGH 0x0c +#define ATH12K_BHI_IMGSIZE 0x10 +#define ATH12K_BHI_IMGTXDB 0x18 +#define ATH12K_BHI_EXECENV 0x28 +#define ATH12K_BHI_STATUS 0x2c +#define ATH12K_BHI_ERRCODE 0x30 +#define ATH12K_BHI_SERIALNU 0x40 + +#define ATH12K_BHI_STATUS_RESET 0x00 +#define ATH12K_BHI_STATUS_MASK 0xC0000000 +#define ATH12K_BHI_STATUS_SHIFT 30 +#define ATH12K_BHI_STATUS_SUCCESS 0x02 +#define ATH12K_BHI_STATUS_ERROR 0x03 + +// Registres BHIe (Boot Host Interface extension) - offsets relatifs à bhieOff (0x224 sur WCN7850) +#define ATH12K_BHIE_MSMSOCID 0x00 +#define ATH12K_BHIE_TXVECADDR_LOW 0x2c +#define ATH12K_BHIE_TXVECADDR_HIGH 0x30 +#define ATH12K_BHIE_TXVECSIZE 0x34 +#define ATH12K_BHIE_TXVECDB 0x3c +#define ATH12K_BHIE_TXVECSTATUS 0x44 +#define ATH12K_BHIE_RXVECADDR_LOW 0x60 +#define ATH12K_BHIE_RXVECADDR_HIGH 0x64 +#define ATH12K_BHIE_RXVECSIZE 0x68 +#define ATH12K_BHIE_RXVECDB 0x70 +#define ATH12K_BHIE_RXVECSTATUS 0x78 + +#define ATH12K_BHIE_TXVECSTATUS_STATUS_MASK 0xC0000000 +#define ATH12K_BHIE_TXVECSTATUS_STATUS_SHIFT 30 +#define ATH12K_BHIE_TXVECSTATUS_XFER_COMPL 0x02 + +struct bhi_vec_entry { + uint64_t dma_addr; + uint64_t size; +} __attribute__((packed)); + +struct mhi_chan_ctxt { + UInt32 chcfg; + UInt32 chtype; + UInt32 erindex; + UInt64 rbase __attribute__((packed, aligned(4))); + UInt64 rlen __attribute__((packed, aligned(4))); + UInt64 rp __attribute__((packed, aligned(4))); + UInt64 wp __attribute__((packed, aligned(4))); +} __attribute__((packed)); + +struct mhi_event_ctxt { + UInt32 intmod; + UInt32 ertype; + UInt32 msivec; + UInt64 rbase __attribute__((packed, aligned(4))); + UInt64 rlen __attribute__((packed, aligned(4))); + UInt64 rp __attribute__((packed, aligned(4))); + UInt64 wp __attribute__((packed, aligned(4))); +} __attribute__((packed)); + +struct mhi_cmd_ctxt { + UInt32 reserved0; + UInt32 reserved1; + UInt32 reserved2; + UInt64 rbase __attribute__((packed, aligned(4))); + UInt64 rlen __attribute__((packed, aligned(4))); + UInt64 rp __attribute__((packed, aligned(4))); + UInt64 wp __attribute__((packed, aligned(4))); +} __attribute__((packed)); + +struct mhi_ring_element { + UInt64 ptr; + UInt32 dword[2]; +} __attribute__((packed)); + +#define MHI_TRE_GET_EV_TYPE(tre) (((tre)->dword[1] >> 16) & 0xFF) +#define MHI_TRE_GET_EV_STATE(tre) (((tre)->dword[0] >> 24) & 0xFF) +#define MHI_TRE_GET_EV_EXECENV(tre) (((tre)->dword[0] >> 24) & 0xFF) + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include "Firmware_WCN7850_Wifi.h" + +class QualcommWifi : public IO80211Controller { + OSDeclareDefaultStructors(QualcommWifi) + +private: + IOPCIDevice *fPciDevice; + IOMemoryMap *fBar0Map; + volatile void *fBar0Virt; + UInt32 fCurrWindow; + + IOInterruptEventSource *fInterruptSource; + IO80211Interface *fNetif; + IOEthernetAddress fMacAddress; + + // État réseau Wi-Fi + bool fLinkActive; + UInt16 fCurrentChannel; + SInt32 fLastRssi; + UInt8 fSsid[APPLE80211_MAX_SSID_LEN]; + UInt32 fSsidLen; + UInt8 fBssid[6]; + bool fScanInProgress; + + // Tampon DMA physiquement contigu + IOBufferMemoryDescriptor *fDmaBuf; + IOPhysicalAddress fDmaPhysAddr; + void *fDmaVirtAddr; + bool fDmaPrepared; + + UInt32 read32(UInt32 offset); + void write32(UInt32 offset, UInt32 value); + + void selectWindow(UInt32 offset); + UInt32 socRead32(UInt32 offset); + void socWrite32(UInt32 offset, UInt32 value); + + bool allocDmaContext(IOByteCount size); + void freeDmaContext(void); + + bool loadBhiFirmware(void); + + static void interruptOccurred(OSObject *owner, IOInterruptEventSource *src, int count); + +public: + virtual bool init(OSDictionary *dictionary = 0) override; + virtual void free(void) override; + virtual IOService *probe(IOService *provider, SInt32 *score) override; + virtual bool start(IOService *provider) override; + virtual void stop(IOService *provider) override; + + // IOEthernetController / IONetworkController interface + virtual IOReturn getHardwareAddress(IOEthernetAddress *addrP) override; + virtual IOReturn enable(IONetworkInterface *netif) override; + virtual IOReturn disable(IONetworkInterface *netif) override; + virtual UInt32 outputPacket(mbuf_t m, void *param) override; + + // IO80211Controller interface + virtual SInt32 apple80211Request(unsigned int req_type, int req_val, IO80211Interface* iface, void* req_data) override; + virtual SInt32 apple80211SkywalkRequest(UInt req_type, int req_val, IO80211SkywalkInterface *iface, void *req_data) override; + virtual SInt32 stopDMA() override; + virtual UInt32 hardwareOutputQueueDepth(IO80211Interface* iface) override; + virtual SInt32 performCountryCodeOperation(IO80211Interface* iface, IO80211CountryCodeOp op) override; + virtual SInt32 enableFeature(IO80211FeatureCode code, void* arg) override; + + // Skywalk interface + virtual IOReturn enable(IO80211SkywalkInterface *netif) override; + virtual IOReturn disable(IO80211SkywalkInterface *netif) override; + + // Compatibilité symboles virtuels IONetworkController sous macOS 15 + virtual void _RESERVEDIONetworkController2() override {} + virtual void _RESERVEDIONetworkController3() override {} + virtual void _RESERVEDIONetworkController4() override {} + virtual void _RESERVEDIONetworkController5() override {} + virtual void _RESERVEDIONetworkController6() override {} + virtual void _RESERVEDIONetworkController7() override {} +}; + +#endif diff --git a/QualcommWireless/QualcommWireless.cpp b/QualcommWireless/QualcommWireless.cpp new file mode 100644 index 0000000..0e9b61a --- /dev/null +++ b/QualcommWireless/QualcommWireless.cpp @@ -0,0 +1,375 @@ +#include "QualcommWireless.hpp" +#include "Firmware_WCN7850.h" + +#include +#include +#include + +#define super IOService +OSDefineMetaClassAndStructors(QualcommWireless, IOService) + +bool QualcommWireless::init(OSDictionary *dictionary) { + if (!super::init(dictionary)) return false; + fDevice = nullptr; + fInterface = nullptr; + fBulkOutPipe = nullptr; + fIntrInPipe = nullptr; + fBulkBuffer = nullptr; + return true; +} + +void QualcommWireless::free(void) { + super::free(); +} + +IOService *QualcommWireless::probe(IOService *provider, SInt32 *score) { + if (!super::probe(provider, score)) return nullptr; + + IOUSBHostDevice *dev = OSDynamicCast(IOUSBHostDevice, provider); + if (!dev) return nullptr; + + const StandardUSB::DeviceDescriptor *desc = dev->getDeviceDescriptor(); + if (!desc) return nullptr; + + UInt16 vid = OSSwapLittleToHostInt16(desc->idVendor); + UInt16 pid = OSSwapLittleToHostInt16(desc->idProduct); + + if (vid == 0x0489 && pid == 0xe10d) { + IOLog("QualcommWireless: Detecte controleur Bluetooth Foxconn/Qualcomm (0x%04x:0x%04x) !\n", vid, pid); + *score += 10000; + return this; + } + + return nullptr; +} + +uint8_t QualcommWireless::checkStatus(void) { + uint8_t status = 0; + uint32_t transferred = 0; + + StandardUSB::DeviceRequest req; + req.bmRequestType = makeDeviceRequestbmRequestType(kRequestDirectionIn, + kRequestTypeVendor, + kRequestRecipientDevice); + req.bRequest = QCA_CHECK_STATUS; + req.wValue = 0; + req.wIndex = 0; + req.wLength = sizeof(status); + + IOReturn kr = fDevice->deviceRequest(this, req, &status, transferred, 2000); + if (kr != kIOReturnSuccess) { + IOLog("QualcommWireless: Erreur checkStatus (0x%08x)\n", kr); + return 0; + } + return status; +} + +bool QualcommWireless::queryTargetVersion(struct qca_version *verOut) { + uint32_t transferred = 0; + + StandardUSB::DeviceRequest req; + req.bmRequestType = makeDeviceRequestbmRequestType(kRequestDirectionIn, + kRequestTypeVendor, + kRequestRecipientDevice); + req.bRequest = QCA_GET_TARGET_VERSION; + req.wValue = 0; + req.wIndex = 0; + req.wLength = sizeof(struct qca_version); + + IOReturn kr = fDevice->deviceRequest(this, req, verOut, transferred, 2000); + if (kr != kIOReturnSuccess || transferred < sizeof(struct qca_version)) { + IOLog("QualcommWireless: Erreur queryTargetVersion (0x%08x, transferred=%u)\n", kr, transferred); + return false; + } + return true; +} + +bool QualcommWireless::downloadFirmware(const uint8_t *data, size_t size, size_t hdrSize) { + if (!fDevice || !fBulkOutPipe || !fBulkBuffer || size < hdrSize) return false; + + // 1. Envoi du header via requête de contrôle vendeur DFU + uint32_t transferred = 0; + StandardUSB::DeviceRequest req; + req.bmRequestType = makeDeviceRequestbmRequestType(kRequestDirectionOut, + kRequestTypeVendor, + kRequestRecipientDevice); + req.bRequest = QCA_DFU_DOWNLOAD; + req.wValue = 0; + req.wIndex = 0; + req.wLength = (uint16_t)hdrSize; + + IOReturn kr = fDevice->deviceRequest(this, req, (void *)data, transferred, 2000); + if (kr != kIOReturnSuccess) { + IOLog("QualcommWireless: Erreur envoi header DFU (0x%08x)\n", kr); + return false; + } + + // Délai de 20ms pour permettre au contrôleur d'activer le mode DFU sur ep2 + IOSleep(20); + + // 2. Envoi du corps par paquets de 4096 octets max sur le pipe Bulk OUT + size_t sent = hdrSize; + size_t remaining = size - hdrSize; + void *bufPtr = fBulkBuffer->getBytesNoCopy(); + + while (remaining > 0) { + uint32_t chunk = (remaining > QCA_DFU_PACKET_LEN) ? QCA_DFU_PACKET_LEN : (uint32_t)remaining; + memcpy(bufPtr, data + sent, chunk); + + uint32_t bytesWritten = 0; + kr = fBulkOutPipe->io(fBulkBuffer, chunk, bytesWritten, 3000); + if (kr != kIOReturnSuccess || bytesWritten != chunk) { + IOLog("QualcommWireless: Erreur io pipe bulk (offset %zu/%zu, kr=0x%08x)\n", sent, size, kr); + return false; + } + + sent += chunk; + remaining -= chunk; + } + + return true; +} + +bool QualcommWireless::sendHciReset(void) { + uint8_t cmd[3] = {0x03, 0x0c, 0x00}; // HCI Reset + uint32_t transferred = 0; + + StandardUSB::DeviceRequest req; + req.bmRequestType = makeDeviceRequestbmRequestType(kRequestDirectionOut, + kRequestTypeClass, + kRequestRecipientInterface); + req.bRequest = 0; + req.wValue = 0; + req.wIndex = 0; + req.wLength = sizeof(cmd); + + IOReturn kr = fDevice->deviceRequest(this, req, cmd, transferred, 2000); + if (kr != kIOReturnSuccess) { + IOLog("QualcommWireless: Erreur envoi HCI Reset (0x%08x)\n", kr); + return false; + } + + if (fIntrInPipe && fBulkBuffer) { + uint32_t bytesRead = 0; + kr = fIntrInPipe->io(fBulkBuffer, 256, bytesRead, 2000); + if (kr == kIOReturnSuccess && bytesRead > 0) { + uint8_t *evt = (uint8_t *)fBulkBuffer->getBytesNoCopy(); + if (evt[0] == 0x0E && evt[5] == 0) { + IOLog("QualcommWireless: HCI Reset acquitte avec succes par le controleur !\n"); + return true; + } + } + } + + return true; +} + +bool QualcommWireless::start(IOService *provider) { + if (!super::start(provider)) return false; + + fDevice = OSDynamicCast(IOUSBHostDevice, provider); + if (!fDevice) return false; + fDevice->retain(); + + if (!fDevice->open(this)) { + IOLog("QualcommWireless: Impossible d'ouvrir le peripherique USB.\n"); + OSSafeReleaseNULL(fDevice); + return false; + } + + // Configuration 1 + IOReturn kr = fDevice->setConfiguration(1); + if (kr != kIOReturnSuccess) { + IOLog("QualcommWireless: Erreur setConfiguration(1) -> 0x%08x\n", kr); + fDevice->close(this); + OSSafeReleaseNULL(fDevice); + return false; + } + + struct qca_version ver; + memset(&ver, 0, sizeof(ver)); + if (queryTargetVersion(&ver)) { + IOLog("QualcommWireless: QCA Version ROM=0x%08x Patch=0x%08x RAM=0x%08x\n", + OSSwapLittleToHostInt32(ver.rom_version), + OSSwapLittleToHostInt32(ver.patch_version), + OSSwapLittleToHostInt32(ver.ram_version)); + } + + uint8_t status = checkStatus(); + IOLog("QualcommWireless: Statut initial QCA: 0x%02x (Patch: %s, Syscfg: %s)\n", + status, (status & 0x80) ? "OUI" : "NON", (status & 0x40) ? "OUI" : "NON"); + + bool needPatch = !(status & 0x80); + bool needNvm = !(status & 0x40); + + if (needPatch || needNvm) { + // Recherche de l'interface 0 (avec réessais si l'énumération est en cours) + for (int retry = 0; retry < 10 && !fInterface; retry++) { + OSIterator *iterator = fDevice->getChildIterator(gIOServicePlane); + if (iterator) { + OSObject *candidate; + while ((candidate = iterator->getNextObject())) { + IOUSBHostInterface *intf = OSDynamicCast(IOUSBHostInterface, candidate); + if (intf && intf->getInterfaceDescriptor() && intf->getInterfaceDescriptor()->bInterfaceNumber == 0) { + fInterface = intf; + fInterface->retain(); + break; + } + } + OSSafeReleaseNULL(iterator); + } + if (!fInterface) { + IOSleep(30); + } + } + + if (!fInterface) { + IOLog("QualcommWireless: Erreur - Interface 0 non trouvee.\n"); + fDevice->close(this); + OSSafeReleaseNULL(fDevice); + return false; + } + + if (!fInterface->open(this)) { + IOLog("QualcommWireless: Impossible d'ouvrir l'interface 0.\n"); + OSSafeReleaseNULL(fInterface); + fDevice->close(this); + OSSafeReleaseNULL(fDevice); + return false; + } + + // Recherche des pipes (Bulk OUT 0x02 et Interrupt IN 0x81) + const StandardUSB::ConfigurationDescriptor *configDescriptor = fInterface->getConfigurationDescriptor(); + const StandardUSB::InterfaceDescriptor *interfaceDescriptor = fInterface->getInterfaceDescriptor(); + const EndpointDescriptor *endpointDescriptor = nullptr; + + while ((endpointDescriptor = StandardUSB::getNextEndpointDescriptor(configDescriptor, interfaceDescriptor, endpointDescriptor))) { + uint8_t epDirection = StandardUSB::getEndpointDirection(endpointDescriptor); + uint8_t epType = StandardUSB::getEndpointType(endpointDescriptor); + uint8_t epAddress = StandardUSB::getEndpointAddress(endpointDescriptor); + + if (epDirection == kEndpointDirectionOut && epType == kEndpointTypeBulk) { + fBulkOutPipe = fInterface->copyPipe(epAddress); + } else if (epDirection == kEndpointDirectionIn && epType == kEndpointTypeInterrupt) { + fIntrInPipe = fInterface->copyPipe(epAddress); + } + } + + fBulkBuffer = fInterface->createIOBuffer(kIODirectionOut, QCA_DFU_PACKET_LEN); + + if (fBulkOutPipe && fBulkBuffer) { + if (needPatch) { + IOLog("QualcommWireless: Televersement du RAMPATCH WCN7850 (%u octets)...\n", rampatch_usb_00190200_bin_len); + if (downloadFirmware(rampatch_usb_00190200_bin, rampatch_usb_00190200_bin_len, 40)) { + IOLog("QualcommWireless: RAMPATCH televerse avec succes !\n"); + } else { + IOLog("QualcommWireless: Echec du televersement RAMPATCH !\n"); + } + } + + status = checkStatus(); + if (needNvm) { + IOLog("QualcommWireless: Televersement du NVM WCN7850 (%u octets)...\n", nvm_usb_00190200_bin_len); + if (downloadFirmware(nvm_usb_00190200_bin, nvm_usb_00190200_bin_len, 4)) { + IOLog("QualcommWireless: NVM televerse avec succes !\n"); + } else { + IOLog("QualcommWireless: Echec du televersement NVM !\n"); + } + IOSleep(100); + } + + sendHciReset(); + + // Délai de stabilisation post-reset (150 ms) pour permettre au processeur Bluetooth + // et aux tampons FIFO USB de re-calibrer leur état avant que bluetoothd n'initialise la pile. + IOSleep(150); + } else { + IOLog("QualcommWireless: Erreur initialisation pipes ou buffer.\n"); + } + + if (fIntrInPipe) { + fIntrInPipe->clearStall(false); + } + if (fBulkOutPipe) { + fBulkOutPipe->clearStall(false); + } + + OSSafeReleaseNULL(fBulkBuffer); + OSSafeReleaseNULL(fBulkOutPipe); + OSSafeReleaseNULL(fIntrInPipe); + + if (fInterface->isOpen(this)) { + fInterface->close(this); + } + OSSafeReleaseNULL(fInterface); + } + + uint8_t finalStatus = checkStatus(); + IOLog("QualcommWireless: Statut FINAL: 0x%02x (Patch: %s, Syscfg: %s) -> Pret pour macOS !\n", + finalStatus, (finalStatus & 0x80) ? "OUI" : "NON", (finalStatus & 0x40) ? "OUI" : "NON"); + + // 1. Propriétés sur le périphérique USB pour bluetoothd (macOS Monterey / Ventura / Sonoma / Sequoia) + // IMPORTANT: Ne JAMAIS nommer "Bluetooth USB Host Controller" sinon Found_USB_Dongle ignore le périphérique. + fDevice->setProperty("USB Product Name", "Qualcomm WCN7850 Bluetooth"); + fDevice->setProperty("USB Vendor Name", "Qualcomm"); + fDevice->setProperty("FirmwareLoaded", true); + fDevice->setProperty("kUSBHostPortType", (uint32_t)255, 32); + fDevice->setProperty("builtin", (uint32_t)1, 32); + + // Spoof idVendor à 0x0a12 (CSR) dans IORegistry pour que bluetoothd le valide dans sa liste + // blanche de dongles tiers et active le chipset générique THIRD_PARTY_DONGLE (HCI Transport: USB). + fDevice->setProperty("idVendor", (uint32_t)0x0a12, 32); + fDevice->setName("Qualcomm WCN7850 Bluetooth"); + + // 2. Propriétés sur le port parent + IOService *hubPort = fDevice->getProvider(); + if (hubPort) { + hubPort->setProperty("USBPortType", (uint32_t)255, 32); + hubPort->setProperty("port-type", (uint32_t)255, 32); + } + + // 3. Injection sur toutes les interfaces enfants (HCI & SCO) + OSIterator *intfIter = fDevice->getChildIterator(gIOServicePlane); + if (intfIter) { + OSObject *candidate; + while ((candidate = intfIter->getNextObject())) { + IOUSBHostInterface *intf = OSDynamicCast(IOUSBHostInterface, candidate); + if (intf) { + intf->setProperty("USB Product Name", "Qualcomm WCN7850 Bluetooth"); + intf->setProperty("USB Vendor Name", "Qualcomm"); + intf->setProperty("idVendor", (uint32_t)0x0a12, 32); + } + } + OSSafeReleaseNULL(intfIter); + } + + // Délai de 100ms avant de relâcher l'accès exclusif pour garantir que bluetoothd + // trouve le contrôleur dans un état parfaitement calme et stabilisé au démarrage. + IOSleep(100); + + // Libération de l'accès exclusif afin que bluetoothd puisse ouvrir le contrôleur + fDevice->close(this); + + registerService(); + return true; +} + +void QualcommWireless::stop(IOService *provider) { + IOLog("QualcommWireless: Arret du service.\n"); + + if (fInterface) { + if (fInterface->isOpen(this)) { + fInterface->close(this); + } + OSSafeReleaseNULL(fInterface); + } + + if (fDevice) { + if (fDevice->isOpen(this)) { + fDevice->close(this); + } + OSSafeReleaseNULL(fDevice); + } + + super::stop(provider); +} diff --git a/QualcommWireless/QualcommWireless.hpp b/QualcommWireless/QualcommWireless.hpp new file mode 100644 index 0000000..9bda298 --- /dev/null +++ b/QualcommWireless/QualcommWireless.hpp @@ -0,0 +1,51 @@ +#ifndef _QUALCOMMWIRELESS_HPP +#define _QUALCOMMWIRELESS_HPP + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + +#include +#include +#include +#include +#include + +#define QCA_GET_TARGET_VERSION 0x09 +#define QCA_CHECK_STATUS 0x05 +#define QCA_DFU_DOWNLOAD 0x01 +#define QCA_DFU_PACKET_LEN 4096 + +struct qca_version { + uint32_t rom_version; + uint32_t patch_version; + uint32_t ram_version; + uint8_t chip_id; + uint8_t platform_id; + uint16_t flag; + uint8_t reserved[4]; +} __attribute__((packed)); + +class QualcommWireless : public IOService { + OSDeclareDefaultStructors(QualcommWireless) + +private: + IOUSBHostDevice *fDevice; + IOUSBHostInterface *fInterface; + IOUSBHostPipe *fBulkOutPipe; + IOUSBHostPipe *fIntrInPipe; + IOBufferMemoryDescriptor *fBulkBuffer; + + uint8_t checkStatus(void); + bool queryTargetVersion(struct qca_version *verOut); + bool downloadFirmware(const uint8_t *data, size_t size, size_t hdrSize); + bool sendHciReset(void); + +public: + virtual bool init(OSDictionary *dictionary = 0) override; + virtual void free(void) override; + virtual IOService *probe(IOService *provider, SInt32 *score) override; + virtual bool start(IOService *provider) override; + virtual void stop(IOService *provider) override; +}; + +#endif diff --git a/QualcommWireless/include/IOKit/80211/Apple80211.h b/QualcommWireless/include/IOKit/80211/Apple80211.h new file mode 100644 index 0000000..f29a815 --- /dev/null +++ b/QualcommWireless/include/IOKit/80211/Apple80211.h @@ -0,0 +1,23 @@ +// +// Apple80211.h +// itlwm +// +// Created by qcwap on 2020/9/4. +// Copyright © 2020 钟先耀. All rights reserved. +// + +#ifndef Apple80211_h +#define Apple80211_h + +#include +#include +#include +#include +#include +#include +#include +#if __IO80211_TARGET >= __MAC_10_15 +#include +#endif + +#endif /* Apple80211_h */ diff --git a/QualcommWireless/include/IOKit/80211/IO80211Controller.h b/QualcommWireless/include/IOKit/80211/IO80211Controller.h new file mode 100644 index 0000000..9b7fd78 --- /dev/null +++ b/QualcommWireless/include/IOKit/80211/IO80211Controller.h @@ -0,0 +1,358 @@ +// +// IO80211Controller.h +// IO80211Family +// + +#ifndef _IO80211CONTROLLER_H +#define _IO80211CONTROLLER_H + +#if defined(KERNEL) && defined(__cplusplus) + +#include +#include + +// This is necessary, because even the latest Xcode does not support properly targeting 11.0. +#ifndef __IO80211_TARGET +#error "Please define __IO80211_TARGET to the requested version" +#endif + +#if VERSION_MAJOR > 8 +#define _MODERN_BPF +#endif + +#include + +#include + +#include +#include + +#include "apple80211_ioctl.h" +#include "IO80211SkywalkInterface.h" +#include "IO80211WorkLoop.h" + +#define AUTH_TIMEOUT 15 // seconds + +/*! @enum LinkSpeed. + @abstract ???. + @discussion ???. + @constant LINK_SPEED_80211A 54 Mbps + @constant LINK_SPEED_80211B 11 Mbps. + @constant LINK_SPEED_80211G 54 Mbps. + */ +enum { + LINK_SPEED_80211A = 54000000ul, // 54 Mbps + LINK_SPEED_80211B = 11000000ul, // 11 Mbps + LINK_SPEED_80211G = 54000000ul, // 54 Mbps + LINK_SPEED_80211N = 300000000ul, // 300 Mbps (MCS index 15, 400ns GI, 40 MHz channel) +}; + +enum IO80211CountryCodeOp +{ + kIO80211CountryCodeReset, // Reset country code to world wide default, and start + // searching for 802.11d beacon +}; +typedef enum IO80211CountryCodeOp IO80211CountryCodeOp; + +enum IO80211SystemPowerState +{ + kIO80211SystemPowerStateUnknown, + kIO80211SystemPowerStateAwake, + kIO80211SystemPowerStateSleeping, +}; +typedef enum IO80211SystemPowerState IO80211SystemPowerState; + +enum IO80211FeatureCode +{ + kIO80211Feature80211n = 1, +}; +typedef enum IO80211FeatureCode IO80211FeatureCode; + + +class IOSkywalkInterface; +class IO80211ScanManager; +enum CCStreamLogLevel +{ + LEVEL_1, +}; + +enum scanSource +{ + SOURCE_1, +}; + +enum joinStatus +{ + STATUS_1, +}; + +class IO80211Controller; +class IO80211Interface; +class IO82110WorkLoop; +class IO80211VirtualInterface; +class IO80211ControllerMonitor; +class CCLogPipe; +class CCIOReporterLogStream; +class CCLogStream; +class IO80211VirtualInterface; +class IO80211RangingManager; +class IO80211FlowQueue; +class IO80211FlowQueueLegacy; +class FlowIdMetadata; +class IOReporter; +extern void IO80211VirtualInterfaceNamerRetain(); + + +struct apple80211_hostap_state; + +struct apple80211_awdl_sync_channel_sequence; +struct ieee80211_ht_capability_ie; +struct apple80211_channel_switch_announcement; +struct apple80211_beacon_period_data; +struct apple80211_power_debug_sub_info; +struct apple80211_stat_report; +struct apple80211_frame_counters; +struct apple80211_leaky_ap_event; +struct apple80211_chip_stats; +struct apple80211_extended_stats; +struct apple80211_ampdu_stat_report; +struct apple80211_btCoex_report; +struct apple80211_cca_report; +class CCPipe; +struct apple80211_lteCoex_report; + +//typedef int scanSource; +//typedef int joinStatus; +//typedef int CCStreamLogLevel; +typedef IOReturn (*IOCTL_FUNC)(IO80211Controller*, IO80211Interface*, IO80211VirtualInterface*, apple80211req*, bool); +extern IOCTL_FUNC gGetHandlerTable[]; +extern IOCTL_FUNC gSetHandlerTable[]; + +class IO80211Controller : public IOEthernetController { + OSDeclareAbstractStructors(IO80211Controller) + +public: + + virtual void free() APPLE_KEXT_OVERRIDE; +#if __IO80211_TARGET <= __MAC_10_15 + virtual bool terminate(unsigned int) APPLE_KEXT_OVERRIDE; +#endif + virtual bool init(OSDictionary *) APPLE_KEXT_OVERRIDE; + virtual IOReturn configureReport(IOReportChannelList *,UInt,void *,void *) APPLE_KEXT_OVERRIDE; + virtual IOReturn updateReport(IOReportChannelList *,UInt,void *,void *) APPLE_KEXT_OVERRIDE; + virtual bool start(IOService *) APPLE_KEXT_OVERRIDE; + virtual void stop(IOService *) APPLE_KEXT_OVERRIDE; + virtual IOService* getProvider(void) const APPLE_KEXT_OVERRIDE { return IOEthernetController::getProvider(); } + virtual IOWorkLoop* getWorkLoop(void) const APPLE_KEXT_OVERRIDE; + virtual const char* stringFromReturn(int) APPLE_KEXT_OVERRIDE; + virtual int errnoFromReturn(int) APPLE_KEXT_OVERRIDE; + virtual IOOutputQueue* getOutputQueue(void) const APPLE_KEXT_OVERRIDE { return NULL; } + virtual bool createWorkLoop(void) APPLE_KEXT_OVERRIDE; + virtual IOReturn enable(IONetworkInterface *) APPLE_KEXT_OVERRIDE; + virtual IOReturn disable(IONetworkInterface *) APPLE_KEXT_OVERRIDE; + virtual bool attachInterface(IONetworkInterface **iface, bool attach = true) APPLE_KEXT_OVERRIDE { return IOEthernetController::attachInterface(iface, attach); } +#if __IO80211_TARGET >= __MAC_10_15 + virtual void detachInterface(IONetworkInterface *iface, bool sync = false) APPLE_KEXT_OVERRIDE { IOEthernetController::detachInterface(iface, sync); } +#endif + virtual IONetworkInterface* createInterface(void) APPLE_KEXT_OVERRIDE { return IOEthernetController::createInterface(); } + virtual bool configureInterface(IONetworkInterface *iface) APPLE_KEXT_OVERRIDE { return IOEthernetController::configureInterface(iface); } +#ifdef __PRIVATE_SPI__ + virtual IOReturn outputStart(IONetworkInterface *,UInt) APPLE_KEXT_OVERRIDE; +#endif + virtual IOReturn getHardwareAddress(IOEthernetAddress *) APPLE_KEXT_OVERRIDE; + virtual void requestPacketTx(void*, UInt) {} + virtual IOReturn getHardwareAddressForInterface(IO80211Interface *,IOEthernetAddress *) { return kIOReturnSuccess; } + virtual void inputMonitorPacket(mbuf_t,UInt,void *,unsigned long) {} + virtual int outputRaw80211Packet(IO80211Interface *,mbuf_t) { return 0; } + virtual int outputActionFrame(IO80211Interface *,mbuf_t) { return 0; } + virtual int bpfOutputPacket(OSObject *,UInt,mbuf_t m) { return 0; } + virtual SInt32 monitorModeSetEnabled(IO80211Interface*, bool, UInt) { return 0; } + virtual IO80211Interface* getNetworkInterface(void) { return NULL; } +#if __IO80211_TARGET >= __MAC_10_15 + virtual IO80211SkywalkInterface* getPrimarySkywalkInterface(void) { return NULL; } +#endif + virtual SInt32 apple80211_ioctl(IO80211Interface *, IO80211VirtualInterface*, ifnet_t,unsigned long,void *) { return 0; } +#if __IO80211_TARGET >= __MAC_10_15 + virtual SInt32 apple80211_ioctl(IO80211SkywalkInterface *,unsigned long,void *) { return 0; } +#endif + virtual SInt32 apple80211_ioctl(IO80211Interface *interface, ifnet_t net,unsigned long id,void *data) { + return apple80211_ioctl(interface, NULL, net, id, data); + } + virtual SInt32 apple80211Request(unsigned int, int, IO80211Interface*, void*) = 0; + virtual SInt32 apple80211VirtualRequest(UInt,int,IO80211VirtualInterface *,void *) { return 0; } +#if __IO80211_TARGET >= __MAC_10_15 + virtual SInt32 apple80211SkywalkRequest(UInt,int,IO80211SkywalkInterface *,void *) { return 0; } +#endif + virtual SInt32 stopDMA() = 0; + virtual UInt32 hardwareOutputQueueDepth(IO80211Interface*) = 0; + virtual SInt32 performCountryCodeOperation(IO80211Interface*, IO80211CountryCodeOp) = 0; + virtual bool useAppleRSNSupplicant(IO80211Interface *) { return false; } + virtual bool useAppleRSNSupplicant(IO80211VirtualInterface *) { return false; } + virtual void dataLinkLayerAttachComplete(IO80211Interface *) {} + virtual SInt32 enableFeature(IO80211FeatureCode, void*) = 0; + virtual SInt32 setVirtualHardwareAddress(IO80211VirtualInterface *,ether_addr *) { return 0; } + virtual SInt32 enableVirtualInterface(IO80211VirtualInterface *) { return 0; } + virtual SInt32 disableVirtualInterface(IO80211VirtualInterface *) { return 0; } + virtual bool requiresExplicitMBufRelease() { + return false; + } + virtual bool flowIdSupported() { + return false; + } + virtual IO80211FlowQueueLegacy* requestFlowQueue(FlowIdMetadata const*) { return NULL; } + virtual void releaseFlowQueue(IO80211FlowQueue *) {} +#if __IO80211_TARGET >= __MAC_10_15 + virtual void getLogPipes(CCPipe**, CCPipe**, CCPipe**) {}; +#endif + virtual IOReturn enablePacketTimestamping(void) { + return kIOReturnUnsupported; + } + virtual IOReturn disablePacketTimestamping(void) { + return kIOReturnUnsupported; + } + virtual UInt32 selfDiagnosticsReport(int,char const*,UInt); + virtual UInt32 getDataQueueDepth(OSObject *); +#if __IO80211_TARGET >= __MAC_11_0 + virtual bool isAssociatedToMovingNetwork(void) { return false; } +#endif + virtual mbuf_flags_t inputPacket(mbuf_t) { return 0; } + virtual SInt32 apple80211_ioctl_get(IO80211Interface *,IO80211VirtualInterface *,ifnet_t,void *) { return 0; } + + +#if __IO80211_TARGET >= __MAC_10_15 + virtual SInt32 apple80211_ioctl_get(IO80211SkywalkInterface *,void *) { return 0; } + virtual SInt32 apple80211_ioctl_set(IO80211Interface *,IO80211VirtualInterface *,IO80211SkywalkInterface *,void *) { return 0; } + virtual SInt32 apple80211_ioctl_set(IO80211SkywalkInterface *,void*) { return 0; } + virtual bool attachInterface(IOSkywalkInterface *,IOService *) { return false; } +#else + virtual SInt32 apple80211_ioctl_set(IO80211Interface *,IO80211VirtualInterface *,ifnet_t,void *) { return 0; } +#endif + + +#if __IO80211_TARGET >= __MAC_11_0 + virtual bool detachInterface(IOSkywalkInterface *, bool) { return false; } +#endif + virtual IO80211VirtualInterface* createVirtualInterface(ether_addr *,UInt) { return NULL; } + virtual bool attachVirtualInterface(IO80211VirtualInterface **,ether_addr *,UInt,bool) { return false; } + virtual bool detachVirtualInterface(IO80211VirtualInterface *,bool) { return false; } +#if __IO80211_TARGET >= __MAC_10_15 + virtual IOReturn enable(IO80211SkywalkInterface *) { return kIOReturnSuccess; } + virtual IOReturn disable(IO80211SkywalkInterface *) { return kIOReturnSuccess; } +#endif + +//public: +// IO80211SkywalkInterface* getInfraInterface(void); +// IO80211ScanManager* getPrimaryInterfaceScanManager(void); +// IO80211ControllerMonitor* getInterfaceMonitor(void); +// IOReturn addReporterLegend(IOService *,IOReporter *,char const*,char const*); +// IOReturn removeReporterFromLegend(IOService *,IOReporter *,char const*,char const*); +// IOReturn unlockIOReporterLegend(void); +// void lockIOReporterLegend(void);// Suspected return type - int +// IOReturn logIOReportLogStreamSubscription(unsigned long long); +// IOReturn addIOReportLogStreamForProvider(IOService *,unsigned long long *); +// IOReturn addSubscriptionForThisReporterFetchedOnTimer(IOReporter *,char const*,char const*,IOService *) ; +// IOReturn addSubscriptionForProviderFetchedOnTimer(IOService *); +// void handleIOReporterTimer(IOTimerEventSource *); +// void setIOReportersStreamFlags(unsigned long long); +// void updateIOReportersStreamFrequency(void); // Suspected return type - int +// void setIOReportersStreamLevel(CCStreamLogLevel); +// void powerChangeGated(OSObject *,void *,void *,void *,void *); +// int copyOut(void const*,unsigned long long,unsigned long); +// SInt32 getASSOCIATE_RESULT(IO80211Interface *,IO80211VirtualInterface *,IO80211SkywalkInterface *,apple80211_assoc_result_data *); +// IOReturn copyIn(unsigned long long,void *,unsigned long); +// void logIOCTL(apple80211req *); +// bool isIOCTLLoggingRestricted(apple80211req *); +// IOReturn setChanNoiseFloorLTE(apple80211_stat_report *,int); +// IOReturn setChanNoiseFloor(apple80211_stat_report *,int); +// IOReturn setChanCCA(apple80211_stat_report *,int); +// IOReturn setChanExtendedCCA(apple80211_stat_report *,apple80211_cca_report *); +// bool setLTECoexstat(apple80211_stat_report *,apple80211_lteCoex_report *); +// bool setBTCoexstat(apple80211_stat_report *,apple80211_btCoex_report *); +// bool setAMPDUstat(apple80211_stat_report *,apple80211_ampdu_stat_report *,apple80211_channel *); +// UInt32 getCountryCode(apple80211_country_code_data *); +// IOReturn setCountryCode(apple80211_country_code_data *); +// bool getInfraExtendedStats(apple80211_extended_stats *); +// bool getChipCounterStats(apple80211_chip_stats *); +// bool setExtendedChipCounterStats(apple80211_stat_report *,void *); +// bool setChipCounterStats(apple80211_stat_report *,apple80211_chip_stats *,apple80211_channel *); +// virtual bool setLeakyAPStats(apple80211_leaky_ap_event *); +// bool setFrameStats(apple80211_stat_report *,apple80211_frame_counters *,apple80211_channel *); +// bool setPowerStats(apple80211_stat_report *,apple80211_power_debug_sub_info *); +// bool getBeaconPeriod(apple80211_beacon_period_data *); + SInt32 apple80211VirtualRequestIoctl(unsigned int,int,IO80211VirtualInterface *,void *); +// bool getBSSIDData(OSObject *,apple80211_bssid_data *); +// bool getSSIDData(apple80211_ssid_data *); +// bool inputInfraPacket(mbuf_t); +// void notifyHostapState(apple80211_hostap_state *); +// bool isAwdlAssistedDiscoveryEnabled(void); +// void joinDone(scanSource,joinStatus); +// void joinStarted(scanSource,joinStatus); +// void handleChannelSwitchAnnouncement(apple80211_channel_switch_announcement *); +// void scanDone(scanSource,int); +// void scanStarted(scanSource,apple80211_scan_data *); +// void printChannels(void); +// void updateInterfaceCoexRiskPct(unsigned long long); +// SInt32 getInfraChannel(apple80211_channel_data *); +// void calculateInterfacesAvaiability(void); // Suspected return type - int +// void setChannelSequenceList(apple80211_awdl_sync_channel_sequence *); // Suspected return type - int +// void setPrimaryInterfaceDatapathState(bool); +// UInt32 getPrimaryInterfaceLinkState(void); +// void setCurrentChannel(apple80211_channel *); // Suspected return type - int +// void setHtCapability(ieee80211_ht_capability_ie *); +// UInt32 getHtCapability(void); +// UInt32 getHtCapabilityLength(void); +// bool io80211isDebuggable(bool* enable); +// void logDebug(unsigned long long,char const*,...); // Suspected return type - int +// void vlogDebug(unsigned long long,char const*,va_list); // Suspected return type - char +// void logDebug(char const*,...); // Suspected return type - int +// bool calculateInterfacesCoex(void); +// void setInfraChannel(apple80211_channel *); +// void configureAntennae(void); + SInt32 apple80211RequestIoctl(unsigned int,int,IO80211Interface *,void *); + UInt32 radioCountForInterface(IO80211Interface *); +// void releaseIOReporters(void); +// bool findAndAttachToFaultReporter(void); +// UInt32 setupControlPathLogging(void); +// IOReturn createIOReporters(IOService *); +// IOReturn powerChangeHandler(void *,void *,unsigned int,IOService *,void *,unsigned long); + + OSMetaClassDeclareReservedUnused( IO80211Controller, 0); + OSMetaClassDeclareReservedUnused( IO80211Controller, 1); + OSMetaClassDeclareReservedUnused( IO80211Controller, 2); + OSMetaClassDeclareReservedUnused( IO80211Controller, 3); + OSMetaClassDeclareReservedUnused( IO80211Controller, 4); + OSMetaClassDeclareReservedUnused( IO80211Controller, 5); + OSMetaClassDeclareReservedUnused( IO80211Controller, 6); + OSMetaClassDeclareReservedUnused( IO80211Controller, 7); + OSMetaClassDeclareReservedUnused( IO80211Controller, 8); + OSMetaClassDeclareReservedUnused( IO80211Controller, 9); + OSMetaClassDeclareReservedUnused( IO80211Controller, 10); + OSMetaClassDeclareReservedUnused( IO80211Controller, 11); + OSMetaClassDeclareReservedUnused( IO80211Controller, 12); + OSMetaClassDeclareReservedUnused( IO80211Controller, 13); + OSMetaClassDeclareReservedUnused( IO80211Controller, 14); + OSMetaClassDeclareReservedUnused( IO80211Controller, 15); + +protected: + uint8_t filler[0x500]; +}; + +// 0x215: 1 byte, length of channel sequence, should be 16 +// 0x21c: channel sequence, should contain 16 elements of length 12, possibly apple80211_channel (but why 16?) +// struct of three ints, last looks like flags, first unused + +/* + void __thiscall +setChannelSequenceList(IO80211Controller *this,apple80211_awdl_sync_channel_sequence *param_1) + +{ + _memcpy(this + 0x210,param_1,400); + calculateInterfacesAvaiability(this); + return; +} +*/ + + +#endif /* defined(KERNEL) && defined(__cplusplus) */ + +#endif /* !_IO80211CONTROLLER_H */ diff --git a/QualcommWireless/include/IOKit/80211/IO80211Interface.h b/QualcommWireless/include/IOKit/80211/IO80211Interface.h new file mode 100644 index 0000000..e2ab249 --- /dev/null +++ b/QualcommWireless/include/IOKit/80211/IO80211Interface.h @@ -0,0 +1,144 @@ +// +// IO80211SkywalkInterface.h +// IO80211Family +// + +#ifndef _IO80211INTERFACE_H +#define _IO80211INTERFACE_H + +/* + * Kernel + */ +#if defined(KERNEL) && defined(__cplusplus) + +#include +#include + +// This is necessary, because even the latest Xcode does not support properly targeting 11.0. +#ifndef __IO80211_TARGET +#error "Please define __IO80211_TARGET to the requested version" +#endif + +#if VERSION_MAJOR > 8 + #define _MODERN_BPF +#endif + +#include +#include +#include + +enum IO80211LinkState +{ + kIO80211NetworkLinkUndefined, // Starting link state when an interface is created + kIO80211NetworkLinkDown, // Interface not capable of transmitting packets + kIO80211NetworkLinkUp, // Interface capable of transmitting packets +}; +typedef enum IO80211LinkState IO80211LinkState; + +/*! @defined kIO80211InterfaceClass + @abstract The name of the IO80211Interface class. + */ +#define kIO80211InterfaceClass "IO80211Interface" + +typedef UInt64 IO80211FlowQueueHash; +class RSNSupplicant; +class IOTimerEventSource; +class IOGatedOutputQueue; +class IO80211Controller; +class IO80211Workloop; +class IO80211ScanManager; +class IO80211PeerManager; +class IO80211FlowQueueDatabase; +class IO80211InterfaceMonitor; +class IO80211AssociationJoinSnapshot; + +struct apple80211_debug_command; +struct apple80211_txstats; +struct apple80211_chip_counters_tx; +struct apple80211_chip_error_counters_tx; +struct apple80211_chip_counters_rx; +struct apple80211_ManagementInformationBasedot11_counters; +struct apple80211_leaky_ap_stats; +struct apple80211_leaky_ap_ssid_metrics; +struct apple80211_interface_availability; +struct apple80211_pmk_cache_data; +struct apple80211_ap_cmp_data; +struct TxPacketRequest; +struct AWSRequest; +struct packet_info_tx; +struct userPrintCtx; + +typedef int apple80211_postMessage_tlv_types; + +class IO80211Interface : public IOEthernetInterface +{ + OSDeclareDefaultStructors( IO80211Interface ); + +public: + virtual void free() APPLE_KEXT_OVERRIDE; + virtual IOReturn configureReport(IOReportChannelList *,uint,void *,void *) APPLE_KEXT_OVERRIDE; + virtual IOReturn updateReport(IOReportChannelList *,uint,void *,void *) APPLE_KEXT_OVERRIDE; + virtual bool terminate(unsigned int) APPLE_KEXT_OVERRIDE; + virtual bool attach(IOService*) APPLE_KEXT_OVERRIDE; + virtual void detach(IOService*) APPLE_KEXT_OVERRIDE; +#if __IO80211_TARGET >= __MAC_10_15 + virtual IOReturn newUserClient(task_t, void*, UInt32 type, OSDictionary*, IOUserClient**) APPLE_KEXT_OVERRIDE; +#endif + virtual const char* stringFromReturn(int) APPLE_KEXT_OVERRIDE; + virtual int errnoFromReturn(int) APPLE_KEXT_OVERRIDE; + virtual bool init(IONetworkController*) APPLE_KEXT_OVERRIDE; + virtual UInt32 inputPacket(mbuf_t packet, + UInt32 length = 0, + IOOptionBits options = 0, + void * param = 0) APPLE_KEXT_OVERRIDE; + virtual bool inputEvent(unsigned int, void*) APPLE_KEXT_OVERRIDE; + virtual SInt32 performCommand(IONetworkController*, unsigned long, void*, void*) APPLE_KEXT_OVERRIDE; + virtual IOReturn attachToDataLinkLayer(IOOptionBits, void*) APPLE_KEXT_OVERRIDE; + virtual void detachFromDataLinkLayer(unsigned int, void*) APPLE_KEXT_OVERRIDE; + + virtual void setPoweredOnByUser(bool); + virtual void setEnabledBySystem(bool); + + virtual bool setLinkState(IO80211LinkState, unsigned int); + virtual bool setLinkState(IO80211LinkState, int, unsigned int); + virtual UInt32 outputPacket(mbuf_t, void*); + + virtual bool setLinkQualityMetric(int); + virtual void handleDebugCmd(apple80211_debug_command*); + OSMetaClassDeclareReservedUnused( IO80211Interface, 0); + OSMetaClassDeclareReservedUnused( IO80211Interface, 1); + OSMetaClassDeclareReservedUnused( IO80211Interface, 2); + OSMetaClassDeclareReservedUnused( IO80211Interface, 3); + OSMetaClassDeclareReservedUnused( IO80211Interface, 4); + OSMetaClassDeclareReservedUnused( IO80211Interface, 5); + OSMetaClassDeclareReservedUnused( IO80211Interface, 6); + OSMetaClassDeclareReservedUnused( IO80211Interface, 7); + OSMetaClassDeclareReservedUnused( IO80211Interface, 8); + OSMetaClassDeclareReservedUnused( IO80211Interface, 9); + OSMetaClassDeclareReservedUnused( IO80211Interface, 10); + OSMetaClassDeclareReservedUnused( IO80211Interface, 11); + OSMetaClassDeclareReservedUnused( IO80211Interface, 12); + OSMetaClassDeclareReservedUnused( IO80211Interface, 13); + OSMetaClassDeclareReservedUnused( IO80211Interface, 14); + OSMetaClassDeclareReservedUnused( IO80211Interface, 15); +public: + IO80211FlowQueue * findOrCreateFlowQueue(IO80211FlowQueueHash); + void dropTxPacket(mbuf_t); + void logDebug(unsigned long long, char const*, ...); + void vlogDebug(unsigned long long, char const*, va_list); + const char * getBSDName(); + bool setLeakyAPStatsMode(unsigned int); + void stopOutputQueues(); + void startOutputQueues(); + bool updateLinkSpeed(); + bool reportDataTransferRatesStatic(void*); + void logDebug(char const*, ...); + void postMessage(unsigned int, void* data = NULL, unsigned long dataLen = 0); +protected: + u_int8_t dat[0x500]; +}; + +#endif /* defined(KERNEL) && defined(__cplusplus) */ + +#endif /* ! _IO80211INTERFACE_H */ + diff --git a/QualcommWireless/include/IOKit/80211/IO80211P2PInterface.h b/QualcommWireless/include/IOKit/80211/IO80211P2PInterface.h new file mode 100644 index 0000000..fbf71c2 --- /dev/null +++ b/QualcommWireless/include/IOKit/80211/IO80211P2PInterface.h @@ -0,0 +1,87 @@ +#ifndef IO80211P2PInterface_h +#define IO80211P2PInterface_h + +#include "IO80211VirtualInterface.h" + +class IO80211P2PInterface : public IO80211VirtualInterface { + OSDeclareDefaultStructors(IO80211P2PInterface) + +public: + virtual void free(void) APPLE_KEXT_OVERRIDE; +#if __IO80211_TARGET >= __MAC_11_0 + virtual bool willTerminate(IOService *,uint) APPLE_KEXT_OVERRIDE; +#endif + virtual IOReturn configureReport(IOReportChannelList *channels, + IOReportConfigureAction action, + void *result, + void *destination) APPLE_KEXT_OVERRIDE; + virtual IOReturn updateReport(IOReportChannelList *channels, + IOReportUpdateAction action, + void *result, + void *destination) APPLE_KEXT_OVERRIDE; + + virtual bool terminate( IOOptionBits options = 0 ) APPLE_KEXT_OVERRIDE; + virtual bool attach(IOService *) APPLE_KEXT_OVERRIDE; + virtual void detach(IOService *) APPLE_KEXT_OVERRIDE; +#if __IO80211_TARGET >= __MAC_10_15 + virtual IOReturn newUserClient(task_t,void *,UInt,OSDictionary *,IOUserClient **) APPLE_KEXT_OVERRIDE; +#endif + virtual const char * stringFromReturn( IOReturn rtn ) APPLE_KEXT_OVERRIDE; + virtual int errnoFromReturn( IOReturn rtn ) APPLE_KEXT_OVERRIDE; + virtual IOReturn powerStateWillChangeTo( + IOPMPowerFlags capabilities, + unsigned long stateNumber, + IOService * whatDevice ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn powerStateDidChangeTo( + IOPMPowerFlags capabilities, + unsigned long stateNumber, + IOService * whatDevice ) APPLE_KEXT_OVERRIDE; + virtual bool init(IO80211Controller *,ether_addr *,uint,char const*) APPLE_KEXT_OVERRIDE; + virtual bool createPeerManager(ether_addr *,IO80211PeerManager **) APPLE_KEXT_OVERRIDE; + virtual UInt getMediumType() APPLE_KEXT_OVERRIDE; + virtual void setLinkState(IO80211LinkState,uint) APPLE_KEXT_OVERRIDE; + virtual bool dequeueOutputPacketsWithServiceClass(uint,IOMbufServiceClass,mbuf_t*,mbuf_t*,UInt *,unsigned long long *) APPLE_KEXT_OVERRIDE; + virtual UInt32 outputPacket (mbuf_t m, void* param) APPLE_KEXT_OVERRIDE; + virtual void setEnabledBySystem(bool) APPLE_KEXT_OVERRIDE; + virtual void handleIoctl(unsigned long,void *) APPLE_KEXT_OVERRIDE; + virtual UInt32 inputPacket(mbuf_t,packet_info_tag *) APPLE_KEXT_OVERRIDE; + virtual IOReturn controllerWillChangePowerState(IO80211Controller *,unsigned long,UInt,IOService *) APPLE_KEXT_OVERRIDE; + virtual IOReturn controllerDidChangePowerState(IO80211Controller *,unsigned long,UInt,IOService *) APPLE_KEXT_OVERRIDE; + virtual bool handleDebugCmd(apple80211_debug_command *) APPLE_KEXT_OVERRIDE; + virtual IOReturn postPeerPresence(ether_addr *,int,int,int,char *) APPLE_KEXT_OVERRIDE; + virtual IOReturn postPeerAbsence(ether_addr *) APPLE_KEXT_OVERRIDE; +#if __IO80211_TARGET >= __MAC_10_15 + virtual IOReturn postPeerPresenceIPv6(ether_addr *,int,int,int,char *,unsigned char *) APPLE_KEXT_OVERRIDE; +#endif + virtual void signalOutputThread() APPLE_KEXT_OVERRIDE; + virtual bool isOutputFlowControlled() APPLE_KEXT_OVERRIDE; + virtual void setOutputFlowControlled() APPLE_KEXT_OVERRIDE; + virtual void clearOutputFlowControlled() APPLE_KEXT_OVERRIDE; + virtual void outputStart(uint) APPLE_KEXT_OVERRIDE; + virtual UInt32 configureAQMOutput() APPLE_KEXT_OVERRIDE; + virtual void setUnitNumber(char const*) APPLE_KEXT_OVERRIDE; + virtual bool initIfnetEparams(ifnet_init_eparams *) APPLE_KEXT_OVERRIDE; + virtual bool attachToBpf() APPLE_KEXT_OVERRIDE; + virtual bool configureIfnet() APPLE_KEXT_OVERRIDE; + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 0); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 1); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 2); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 3); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 4); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 5); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 6); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 7); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 8); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 9); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 10); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 11); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 12); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 13); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 14); + OSMetaClassDeclareReservedUnused( IO80211P2PInterface, 15); +public: + char buf[0x300]; +}; + +#endif /* IO80211P2PInterface_h */ diff --git a/QualcommWireless/include/IOKit/80211/IO80211SkywalkInterface.h b/QualcommWireless/include/IOKit/80211/IO80211SkywalkInterface.h new file mode 100644 index 0000000..82dc191 --- /dev/null +++ b/QualcommWireless/include/IOKit/80211/IO80211SkywalkInterface.h @@ -0,0 +1,27 @@ +// +// IO80211SkywalkInterface.h +// IO80211Family +// +// Created by 钟先耀 on 2019/10/18. +// Copyright © 2019 钟先耀. All rights reserved. +// + +#ifndef _IO80211SKYWALK_H +#define _IO80211SKYWALK_H + +#include +#include + +// This is necessary, because even the latest Xcode does not support properly targeting 11.0. +#ifndef __IO80211_TARGET +#error "Please define __IO80211_TARGET to the requested version" +#endif + +class IO80211SkywalkInterface : IOSkywalkEthernetInterface { + OSDeclareAbstractStructors(IO80211SkywalkInterface) + +public: + +}; + +#endif /* _IO80211SKYWALK_H */ diff --git a/QualcommWireless/include/IOKit/80211/IO80211VirtualInterface.h b/QualcommWireless/include/IOKit/80211/IO80211VirtualInterface.h new file mode 100644 index 0000000..f405498 --- /dev/null +++ b/QualcommWireless/include/IOKit/80211/IO80211VirtualInterface.h @@ -0,0 +1,101 @@ +#ifndef IO80211VirtualInterface_h +#define IO80211VirtualInterface_h + +#include "IO80211Interface.h" +#include "apple_private_spi.h" + +class IO80211PeerManager; + +class IO80211VirtualInterface : public IOService { + OSDeclareDefaultStructors(IO80211VirtualInterface) + +public: + virtual void free(void) APPLE_KEXT_OVERRIDE; +#if __IO80211_TARGET >= __MAC_11_0 + virtual bool willTerminate( IOService * provider, IOOptionBits options ) APPLE_KEXT_OVERRIDE; +#endif + virtual IOReturn configureReport(IOReportChannelList *channels, + IOReportConfigureAction action, + void *result, + void *destination) APPLE_KEXT_OVERRIDE; + virtual IOReturn updateReport(IOReportChannelList *channels, + IOReportUpdateAction action, + void *result, + void *destination) APPLE_KEXT_OVERRIDE; + virtual bool terminate( IOOptionBits options = 0 ) APPLE_KEXT_OVERRIDE; + virtual bool attach(IOService *) APPLE_KEXT_OVERRIDE; + virtual void detach(IOService *) APPLE_KEXT_OVERRIDE; +#if __IO80211_TARGET >= __MAC_10_15 + virtual IOReturn newUserClient(task_t,void *,UInt,OSDictionary *,IOUserClient **) APPLE_KEXT_OVERRIDE; +#endif + virtual const char * stringFromReturn( IOReturn rtn ) APPLE_KEXT_OVERRIDE; + virtual int errnoFromReturn( IOReturn rtn ) APPLE_KEXT_OVERRIDE; + virtual IOReturn powerStateWillChangeTo( + IOPMPowerFlags capabilities, + unsigned long stateNumber, + IOService * whatDevice ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn powerStateDidChangeTo( + IOPMPowerFlags capabilities, + unsigned long stateNumber, + IOService * whatDevice ) APPLE_KEXT_OVERRIDE; + virtual bool init(IO80211Controller *,ether_addr *,uint,char const*); + virtual bool createPeerManager(ether_addr *,IO80211PeerManager **); + virtual UInt getMediumType(); + virtual void setLinkState(IO80211LinkState,uint); + virtual bool dequeueOutputPacketsWithServiceClass(uint,IOMbufServiceClass,mbuf_t*,mbuf_t*,UInt *,unsigned long long *); + virtual UInt32 outputPacket (mbuf_t m, void* param); + virtual void setEnabledBySystem(bool); + virtual void handleIoctl(unsigned long,void *); + virtual UInt32 inputPacket(mbuf_t,packet_info_tag *); + virtual IOReturn controllerWillChangePowerState(IO80211Controller *,unsigned long,UInt,IOService *); + virtual IOReturn controllerDidChangePowerState(IO80211Controller *,unsigned long,UInt,IOService *); + virtual bool handleDebugCmd(apple80211_debug_command *); + virtual IOReturn postPeerPresence(ether_addr *,int,int,int,char *); + virtual IOReturn postPeerAbsence(ether_addr *); +#if __IO80211_TARGET >= __MAC_10_15 + virtual IOReturn postPeerPresenceIPv6(ether_addr *,int,int,int,char *,unsigned char *); +#endif + virtual void signalOutputThread(); + virtual bool isOutputFlowControlled(); + virtual void setOutputFlowControlled(); + virtual void clearOutputFlowControlled(); + virtual void outputStart(uint); + virtual UInt32 configureAQMOutput(); + virtual void setUnitNumber(char const*); + virtual bool initIfnetEparams(ifnet_init_eparams *); + virtual bool attachToBpf(); + virtual bool configureIfnet(); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 0); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 1); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 2); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 3); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 4); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 5); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 6); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 7); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 8); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 9); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 10); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 11); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 12); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 13); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 14); + OSMetaClassDeclareReservedUnused( IO80211VirtualInterface, 15); +public: + + static void startOutputQueues(); + + static void stopOutputQueues(); + + static void postMessage(unsigned int, void* data = NULL, unsigned long dataLen = 0); + + static int getInterfaceRole(); + + const char *getBSDName(); +public: + char buf[0x300]; +}; + + +#endif /* IO80211VirtualInterface_h */ diff --git a/QualcommWireless/include/IOKit/80211/IO80211VirtualInterfaceNamer.h b/QualcommWireless/include/IOKit/80211/IO80211VirtualInterfaceNamer.h new file mode 100644 index 0000000..4327a55 --- /dev/null +++ b/QualcommWireless/include/IOKit/80211/IO80211VirtualInterfaceNamer.h @@ -0,0 +1,64 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + + #ifndef _IO80211VIRTUALINTERFACENAMER_H + #define _IO80211VIRTUALINTERFACENAMER_H + +#include + +class IO80211VirtualInterfaceNamer : public IOService +{ + OSDeclareDefaultStructors(IO80211VirtualInterfaceNamer) + +public: + virtual bool init() APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + + bool arrayContainsUnitNumber( OSArray * array, OSNumber * unitNumber ); + bool markInterfaceUnitUsed( char const * name, UInt32 unitNumber ); + void markInterfaceUnitUnused( char const * name, UInt32 unitNumber ); + UInt32 nextAvailableUnitNumberForName( char const * name, bool markUsed ); + + IORecursiveLock * _lock; + OSDictionary * _interfaceUnits; // all OSArrays +}; + +static IO80211VirtualInterfaceNamer * _interfaceNamer; + +bool IO80211VirtualInterfaceNamerRetain(); +void IO80211VirtualInterfaceNamerRelease(); +bool IO80211VirtualInterfaceNamerMarkInterfaceUnitUsed( char const * name, UInt32 unitNumber ); +void IO80211VirtualInterfaceNamerMarkInterfaceUnitUnused( char const * name, UInt32 unitNumber ); +UInt32 IO80211VirtualInterfaceNamerNextAvailableUnitNumberForName( char const * name, bool markUsed ); + +#endif diff --git a/QualcommWireless/include/IOKit/80211/IO80211WorkLoop.h b/QualcommWireless/include/IOKit/80211/IO80211WorkLoop.h new file mode 100644 index 0000000..bf33bfd --- /dev/null +++ b/QualcommWireless/include/IOKit/80211/IO80211WorkLoop.h @@ -0,0 +1,37 @@ +/* + * IO80211WorkLoop.h + * IO80211Family + * + * Created by Pete on 5/31/06. + * Copyright 2006 Apple Computer, Inc. All rights reserved. + * + */ + +#ifndef _IO80211WORKLOOP_H +#define _IO80211WORKLOOP_H + +#include +#include + +// This is necessary, because even the latest Xcode does not support properly targeting 11.0. +#ifndef __IO80211_TARGET +#error "Please define __IO80211_TARGET to the requested version" +#endif + +class IO80211WorkLoop : public IOWorkLoop +{ + OSDeclareDefaultStructors( IO80211WorkLoop ) + +public: + + static IO80211WorkLoop * workLoop(); + + virtual void openGate() APPLE_KEXT_OVERRIDE; + virtual void closeGate() APPLE_KEXT_OVERRIDE; + virtual int sleepGate( void * event, UInt32 interuptibleType ) APPLE_KEXT_OVERRIDE; + virtual int sleepGateDeadline( void * event, UInt32 interuptibleType, AbsoluteTime deadline ); + virtual void wakeupGate( void * event, bool oneThread ) APPLE_KEXT_OVERRIDE; + +}; + +#endif diff --git a/QualcommWireless/include/IOKit/80211/IOSkywalkEthernetInterface.h b/QualcommWireless/include/IOKit/80211/IOSkywalkEthernetInterface.h new file mode 100644 index 0000000..6670ff6 --- /dev/null +++ b/QualcommWireless/include/IOKit/80211/IOSkywalkEthernetInterface.h @@ -0,0 +1,13 @@ +#ifndef IOSkywalkEthernetInterface_h +#define IOSkywalkEthernetInterface_h + +#include + +class IOSkywalkEthernetInterface : public IOEthernetController { + OSDeclareAbstractStructors( IOSkywalkEthernetInterface ) + +public: + +}; + +#endif /* IOSkywalkEthernetInterface_h */ diff --git a/QualcommWireless/include/IOKit/80211/apple80211_ioctl.h b/QualcommWireless/include/IOKit/80211/apple80211_ioctl.h new file mode 100644 index 0000000..55fb450 --- /dev/null +++ b/QualcommWireless/include/IOKit/80211/apple80211_ioctl.h @@ -0,0 +1,850 @@ +/* + * Copyright (c) 2005 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +#ifndef _APPLE80211_IOCTL_H_ +#define _APPLE80211_IOCTL_H_ + +#include +#include +#include +#include +#include +#include + +// This is necessary, because even the latest Xcode does not support properly targeting 11.0. +#ifndef __IO80211_TARGET +#error "Please define __IO80211_TARGET to the requested version" +#endif + +#include + +struct apple80211req +{ + char req_if_name[IFNAMSIZ]; // 16 bytes + int req_type; // 4 bytes + int req_val; // 4 bytes + u_int32_t req_len; // 4 bytes + void *req_data; // 4 bytes +}; + +#define SIOCSA80211 2150656456 +#define SIOCGA80211 3224398281 + +// req_type + +#define APPLE80211_IOC_SSID 1 // req_type + +#define APPLE80211_IOC_AUTH_TYPE 2 // req_type +#define APPLE80211_AUTH_TYPE_UNICAST 1 // req_val, SIOCGA80211 only +#define APPLE80211_AUTH_TYPE_MULTICAST 2 // req_val, SIOCGA80211 only + +#define APPLE80211_IOC_CIPHER_KEY 3 // req_type +#define APPLE80211_CIPHER_KEY_UNICAST 1 // req_val +#define APPLE80211_CIPHER_KEY_MULICAST 2 // req_val + +#define APPLE80211_IOC_CHANNEL 4 // req_type + +#define APPLE80211_IOC_POWERSAVE 5 // req_type + +#define APPLE80211_IOC_PROTMODE 6 // req_type + +#define APPLE80211_IOC_TXPOWER 7 // req_type +#define APPLE80211_IOC_RATE 8 // req_type +#define APPLE80211_IOC_BSSID 9 // req_type + +#define APPLE80211_IOC_SCAN_REQ 10 // req_type + +#define APPLE80211_IOC_SCAN_RESULT 11 // req_type + +#define APPLE80211_IOC_CARD_CAPABILITIES 12 // req_type + +#define APPLE80211_IOC_STATE 13 // req_type (apple80211_state) +#define APPLE80211_IOC_PHY_MODE 14 // req_type (apple80211_phymode) + +#define APPLE80211_IOC_OP_MODE 15 // req_type (apple80211_opmode) +#define APPLE80211_IOC_RSSI 16 // req_type +#define APPLE80211_IOC_NOISE 17 // req_type + +#define APPLE80211_IOC_INT_MIT 18 +#define APPLE80211_IOC_INT_MIT_OFF 1 // req_val +#define APPLE80211_IOC_INT_MIT_ON 2 // req_val + +// card power +#define APPLE80211_IOC_POWER 19 // req_type + +#define APPLE80211_IOC_ASSOCIATE 20 // req_type +#define APPLE80211_IOC_ASSOCIATE_RESULT 21 // req_type +#define APPLE80211_IOC_DISASSOCIATE 22 // req_type +#define APPLE80211_IOC_STATUS_DEV_NAME 23 // req_type + +#define APPLE80211_IOC_IBSS_MODE 24 // req_type +#define APPLE80211_IOC_IBSS_MODE_START 1 // req_val +#define APPLE80211_IOC_IBSS_MODE_STOP 2 // req_val + +#define APPLE80211_IOC_HOST_AP_MODE 25 // req_type +#define APPLE80211_IOC_HOST_AP_MODE_START 1 // req_val +#define APPLE80211_IOC_HOST_AP_MODE_STOP 2 // req_val + +#define APPLE80211_IOC_AP_MODE 26 // req_type (apple80211_apmode) +#define APPLE80211_IOC_SUPPORTED_CHANNELS 27 // req_type +#define APPLE80211_IOC_LOCALE 28 // req_type +#define APPLE80211_IOC_DEAUTH 29 // req_type +#define APPLE80211_IOC_COUNTERMEASURES 30 // req_type +#define APPLE80211_IOC_FRAG_THRESHOLD 31 // req_type +#define APPLE80211_IOC_RATE_SET 32 // req_type +#define APPLE80211_IOC_SHORT_SLOT 33 // req_type +#define APPLE80211_IOC_MULTICAST_RATE 34 // req_type +#define APPLE80211_IOC_SHORT_RETRY_LIMIT 35 // req_type +#define APPLE80211_IOC_LONG_RETRY_LIMIT 36 // req_type +#define APPLE80211_IOC_TX_ANTENNA 37 // req_type +#define APPLE80211_IOC_RX_ANTENNA 38 // req_type +#define APPLE80211_IOC_ANTENNA_DIVERSITY 39 // req_type +#define APPLE80211_IOC_ROM 40 // req_type +#define APPLE80211_IOC_DTIM_INT 41 // req_type +#define APPLE80211_IOC_STATION_LIST 42 // req_type +#define APPLE80211_IOC_DRIVER_VERSION 43 // req_type +#define APPLE80211_IOC_HARDWARE_VERSION 44 // req_type +#define APPLE80211_IOC_RAND 45 // req_type +#define APPLE80211_IOC_RSN_IE 46 // req_type +#define APPLE80211_IOC_BACKGROUND_SCAN 47 // req_type +#define APPLE80211_IOC_AP_IE_LIST 48 // req_type +#define APPLE80211_IOC_STATS 49 // req_type +#define APPLE80211_IOC_ASSOCIATION_STATUS 50 // req_type +#define APPLE80211_IOC_COUNTRY_CODE 51 // req_type +#define APPLE80211_IOC_DEBUG_FLAGS 52 // req_type +#define APPLE80211_IOC_LAST_RX_PKT_DATA 53 // req_type +#define APPLE80211_IOC_RADIO_INFO 54 // req_type +#define APPLE80211_IOC_GUARD_INTERVAL 55 // req_type +#define APPLE80211_IOC_MIMO_POWERSAVE 56 // req_type +#define APPLE80211_IOC_MCS 57 // req_type +#define APPLE80211_IOC_RIFS 58 // req_type +#define APPLE80211_IOC_LDPC 59 // req_type +#define APPLE80211_IOC_MSDU 60 // req_type +#define APPLE80211_IOC_MPDU 61 // req_type +#define APPLE80211_IOC_BLOCK_ACK 62 // req_type +#define APPLE80211_IOC_PLS 63 // req_type +#define APPLE80211_IOC_PSMP 64 // req_type +#define APPLE80211_IOC_PHY_SUB_MODE 65 // req_type +#define APPLE80211_IOC_MCS_INDEX_SET 66 // req_type +#define APPLE80211_IOC_CACHE_THRESH_BCAST 67 // req_type +#define APPLE80211_IOC_CACHE_THRESH_DIRECT 68 // req_type +#define APPLE80211_IOC_WOW_PARAMETERS 69 // req_type +#define APPLE80211_IOC_WOW_ENABLED 70 // req_type +#define APPLE80211_IOC_40MHZ_INTOLERANT 71 // req_type +#define APPLE80211_IOC_PID_LOCK 72 +#define APPLE80211_IOC_STA_IE_LIST 73 +#define APPLE80211_IOC_STA_AUTHORIZE 74 +#define APPLE80211_IOC_STA_DISASSOCIATE 75 +#define APPLE80211_IOC_STA_DEAUTH 76 +#define APPLE80211_IOC_RSN_CONF 77 +#define APPLE80211_IOC_KEY_RSC 78 +#define APPLE80211_IOC_STA_STATS 79 +#define APPLE80211_IOC_ROAM_THRESH 80 +#define APPLE80211_IOC_VENDOR_DBG_FLAGS 81 +#define APPLE80211_IOC_CACHE_AGE_THRESH 82 +#define APPLE80211_IOC_PMK_CACHE 83 +#define APPLE80211_IOC_LINK_QUAL_EVENT_PARAMS 84 +#define APPLE80211_IOC_IE 85 +#define APPLE80211_IOC_SCAN_REQ_MULTIPLE 86 +#define APPLE80211_IOC_BTCOEX_MODE 87 +#define APPLE80211_IOC_WOW_TEST 88 +#define APPLE80211_IOC_CLEAR_PMK_CACHE 89 +#define APPLE80211_IOC_SCANCACHE_CLEAR 90 +#define APPLE80211_IOC_P2P_ENABLE 91 +#define APPLE80211_IOC_P2P_LISTEN 92 +#define APPLE80211_IOC_P2P_SCAN 93 +#define APPLE80211_IOC_VIRTUAL_IF_CREATE 94 +#define APPLE80211_IOC_VIRTUAL_IF_DELETE 95 +#define APPLE80211_IOC_VIRTUAL_IF_ROLE 96 +#define APPLE80211_IOC_VIRTUAL_IF_PARENT 97 +#define APPLE80211_IOC_P2P_GO_CONF 98 +#define APPLE80211_IOC_P2P_NOA_LIST 99 +#define APPLE80211_IOC_P2P_OPP_PS 100 +#define APPLE80211_IOC_P2P_CT_WINDOW 101 +#define APPLE80211_IOC_BT_COEX_FLAGS 102 +#define APPLE80211_IOC_CURRENT_NETWORK 103 +#define APPLE80211_IOC_BT_POWER 104 +#define APPLE80211_IOC_AVAILABILITY 105 +#define APPLE80211_IOC_RSSI_BOUNDS 106 +#define APPLE80211_IOC_ROAM 107 +#define APPLE80211_IOC_TX_CHAIN_POWER 108 +#define APPLE80211_IOC_CDD_MODE 109 +#define APPLE80211_IOC_LAST_BCAST_SCAN_TIME 110 +#define APPLE80211_IOC_THERMAL_THROTTLING 111 +#define APPLE80211_IOC_FACTORY_MODE 112 +#define APPLE80211_IOC_REASSOCIATE 113 + +#define APPLE80211_IOC_POWER_DEBUG_INFO 115 +#define APPLE80211_IOC_AWDL_SYNC_PARAMS 116 +#define APPLE80211_IOC_AWDL_SYNC_ENABLED 117 +#define APPLE80211_IOC_AWDL_EXTENSION_STATE_MACHINE_PARAMETERS 118 +#define APPLE80211_IOC_AWDL_SERVICE_PARAMS 119 +#define APPLE80211_IOC_AWDL_PEER_SERVICE_REQUEST 120 +#define APPLE80211_IOC_AWDL_ELECTION_ALGORITHM_ENABLED 121 +#define APPLE80211_IOC_AWDL_ELECTION_ID 122 +#define APPLE80211_IOC_AWDL_MAX_TREE_DEPTH 123 +#define APPLE80211_IOC_AWDL_GUARD_TIME 124 +#define APPLE80211_IOC_AWDL_BSSID 125 +#define APPLE80211_IOC_AWDL_ELECTION_METRIC 126 +#define APPLE80211_IOC_AWDL_AVAILABILITY_WINDOW_AP_ALIGNMENT 127 +#define APPLE80211_IOC_AWDL_SYNC_FRAME_AP_BEACON_ALIGNMENT 128 +#define APPLE80211_IOC_AWDL_SYNCHRONIZATION_CHANNEL_SEQUENCE 129 +#define APPLE80211_IOC_PEER_CACHE_MAXIMUM_SIZE 130 +#define APPLE80211_IOC_AWDL_OUI 131 +#define APPLE80211_IOC_AWDL_MASTER_CHANNEL 132 +#define APPLE80211_IOC_AWDL_TOP_MASTER 133 +#define APPLE80211_IOC_AWDL_SYNC_STATE 134 +#define APPLE80211_IOC_AWDL_ELECTION_RSSI_THRESHOLDS 135 +#define APPLE80211_IOC_AWDL_PRESENCE_MODE 136 +#define APPLE80211_IOC_AWDL_ELECTION_MASTER_COUNTS 137 +#define APPLE80211_IOC_AWDL_PERIODIC_SYNC_FRAME_PACKET_LIFETIME 138 +#define APPLE80211_IOC_AWDL_MASTER_MODE_SYNC_FRAME_PERIOD 139 +#define APPLE80211_IOC_AWDL_NON_ELECTION_MASTER_MODE_SYNC_FRAME_PERIOD 140 +#define APPLE80211_IOC_AWDL_EXPLICIT_AVAILABILITY_WINDOW_EXTENSION_OPT_OUT 141 +#define APPLE80211_IOC_AWDL_GET_AWDL_MASTER_DATABASE 142 +#define APPLE80211_IOC_PEER_CACHE_CONTROL 143 +#define APPLE80211_IOC_AWDL_BATTERY_LEVEL 144 +#define APPLE80211_IOC_AWDL_BT_COEX_AW_PROTECTED_PERIOD_LENGTH 145 +#define APPLE80211_IOC_AWDL_BT_COEX_AGREEMENT 146 +#define APPLE80211_IOC_AWDL_BT_COEX_AGREEMENT_ENABLED 147 +#define APPLE80211_IOC_AWDL_STRATEGY 148 +#define APPLE80211_IOC_AWDL_OOB_REQUEST 149 +#define APPLE80211_IOC_AWDL_MAX_NO_MASTER_PERIODS 150 +#define APPLE80211_IOC_AWDL_SYNC_FRAME_TEMPLATE 151 +#define APPLE80211_IOC_LOG_FLAGS 152 +#define APPLE80211_IOC_PEER_STATS 153 +#define APPLE80211_IOC_HT_CAPABILITY 154 +#define APPLE80211_IOC_AWDL_ELECTION_PARAMS 155 +#define APPLE80211_IOC_LINK_CHANGED_EVENT_DATA 156 +#define APPLE80211_IOC_GET_DEBUG_INFO 157 +#define APPLE80211_IOC_AWDL_DEVICE_CAPABILITIES 158 +#define APPLE80211_IOC_AWDL_RSSI_MEASUREMENT_REQUEST 159 +#define APPLE80211_IOC_AWDL_AES_KEY 160 +#define APPLE80211_IOC_AWDL_SCAN_RESERVED_TIME 161 +#define APPLE80211_IOC_AWDL_CTL 162 +#define APPLE80211_IOC_AWDL_SOCIAL_TIME_SLOTS 163 +#define APPLE80211_IOC_AWDL_PEER_TRAFFIC_REGISTRATION 164 +#define APPLE80211_IOC_EXTENDED_STATS 165 +#define APPLE80211_IOC_BEACON_PERIOD 166 +#define APPLE80211_IOC_AWDL_FORCED_ROAM_CONFIG 167 +#define APPLE80211_IOC_AWDL_QUIET 168 +#define APPLE80211_IOC_ACL_POLICY 169 +#define APPLE80211_IOC_ACL_ADD 170 +#define APPLE80211_IOC_ACL_REMOVE 171 +#define APPLE80211_IOC_ACL_FLUSH 172 +#define APPLE80211_IOC_ACL_LIST 173 +#define APPLE80211_IOC_CHAIN_ACK 174 +#define APPLE80211_IOC_DESENSE 175 +#define APPLE80211_IOC_OFFLOAD_SCANNING 176 +#define APPLE80211_IOC_OFFLOAD_RSN 177 +#define APPLE80211_IOC_OFFLOAD_COUNTRY_CODE 178 +#define APPLE80211_IOC_OFFLOAD_KEEPALIVE_L2 179 +#define APPLE80211_IOC_OFFLOAD_ARP_NDP 180 +#define APPLE80211_IOC_VHT_MCS_INDEX_SET 181 +#define APPLE80211_IOC_DWDS 182 +#define APPLE80211_IOC_INTERRUPT_STATS 183 +#define APPLE80211_IOC_INTERRUPT_STATS_RESET 184 +#define APPLE80211_IOC_TIMER_STATS 185 +#define APPLE80211_IOC_TIMER_STATS_RESET 186 +#define APPLE80211_IOC_OFFLOAD_STATS 187 +#define APPLE80211_IOC_OFFLOAD_STATS_RESET 188 +#define APPLE80211_IOC_OFFLOAD_BEACONS 189 +#define APPLE80211_IOC_ROAMING 190 +#define APPLE80211_IOC_OFFLOAD_ARP 191 +#define APPLE80211_IOC_OFFLOAD_NDP 192 +#define APPLE80211_IOC_OFFLOAD_SCAN 193 +#define APPLE80211_IOC_DESENSE_LEVEL 194 +#define APPLE80211_IOC_MCS_VHT 195 +#define APPLE80211_IOC_TX_NSS 196 +#define APPLE80211_IOC_GAS_REQ 197 +#define APPLE80211_IOC_GAS_START 198 +#define APPLE80211_IOC_GAS_SET_PEER 199 +#define APPLE80211_IOC_GAS_RESULTS 200 +#define APPLE80211_IOC_AWDL_BTLE_PEER_INDICATION 201 +#define APPLE80211_IOC_AWDL_BTLE_STATE_PARAMS 202 +#define APPLE80211_IOC_AWDL_PEER_DATABASE 203 +#define APPLE80211_IOC_AWDL_BTLE_ENABLE_SYNC_WITH_PARAMS 204 +#define APPLE80211_IOC_AWDL_SECONDARY_MASTER_CHANNEL 205 +#define APPLE80211_IOC_PHY_STATS 206 +#define APPLE80211_IOC_CHANNELS_INFO 207 +#define APPLE80211_IOC_AWDL_AF_TX_MODE 208 +#define APPLE80211_IOC_ERROR_STRING 209 +#define APPLE80211_IOC_ERROR_NO 210 +#define APPLE80211_IOC_AWDL_PIGGYBACK_SCAN_REQ 211 +#define APPLE80211_IOC_AWDL_PRIVATE_ELECTION_ID 212 +#define APPLE80211_IOC_AWDL_MIN_RATE 213 +#define APPLE80211_IOC_VHT_CAPABILITY 214 +#define APPLE80211_IOC_BGSCAN_CACHE_RESULTS 215 +#define APPLE80211_IOC_ROAM_PROFILE 216 +#define APPLE80211_IOC_AWDL_OPER_MODE 217 +#define APPLE80211_IOC_RESTORE_DEFAULTS 218 +#define APPLE80211_IOC_AWDL_ENCRYPTION_KEYS 219 +#define APPLE80211_IOC_AWDL_ENCRYPTION_TYPE 220 +#define APPLE80211_IOC_BTCOEX_PROFILES 221 +#define APPLE80211_IOC_BTCOEX_CONFIG 222 +#define APPLE80211_IOC_AWDL_STATISTICS 223 +#define APPLE80211_IOC_AWDL_ENABLE_ROAMING 224 +#define APPLE80211_IOC_AWDL_OOB_AUTO_REQUEST 225 +#define APPLE80211_IOC_AWDL_TXCAL_PERIOD 226 +#define APPLE80211_IOC_CHIP_COUNTER_STATS 227 +#define APPLE80211_IOC_DBG_GUARD_TIME_PARAMS 228 +#define APPLE80211_IOC_AWDL_AWDL_ADVERTISERS 229 +#define APPLE80211_IOC_LEAKY_AP_STATS_MODE 230 +#define APPLE80211_IOC_CAPTURE 231 +#define APPLE80211_IOC_LEAKY_AP_STATS 232 +#define APPLE80211_IOC_AWDL_BLOCK_SET_COMMANDS 233 +#define APPLE80211_IOC_LEAKY_AP_AWD_MODE 234 +#define APPLE80211_IOC_BTCOEX_OPTIONS 235 +#define APPLE80211_IOC_FORCE_SYNC_TO_PEER 236 +#define APPLE80211_IOC_COUNTRY_CHANNELS 237 +#define APPLE80211_IOC_PRIVATE_MAC 238 +#define APPLE80211_IOC_RESET_CHIP 239 +#define APPLE80211_IOC_CRASH 240 +#define APPLE80211_IOC_RANGING_ENABLE 241 +#define APPLE80211_IOC_RANGING_START 242 +#define APPLE80211_IOC_RANGING_AUTHENTICATE 243 +#define APPLE80211_IOC_AWDL_PREFERRED_CHANNELS 244 +#define APPLE80211_IOC_LEAKY_AP_SSID_STATS 245 +#define APPLE80211_IOC_AWDL_RSDB_CAPS 246 +#define APPLE80211_IOC_AWDL_DEV_STATS 247 +#define APPLE80211_IOC_LAST_ASSOC_HISTORY 248 +#define APPLE80211_IOC_AWDL_COMMON_CHANNEL 249 +#define APPLE80211_IOC_AWDL_PEERS_INFO 250 +#define APPLE80211_IOC_TKO_PARAMS 251 +#define APPLE80211_IOC_TKO_DUMP 252 +#define APPLE80211_IOC_AWDL_NEARBY_LOG_TRIGGER 253 +#define APPLE80211_IOC_HW_SUPPORTED_CHANNELS 254 +#define APPLE80211_IOC_BTCOEX_PROFILE 255 +#define APPLE80211_IOC_BTCOEX_PROFILE_ACTIVE 256 +#define APPLE80211_IOC_TRAP_INFO 257 +#define APPLE80211_IOC_THERMAL_INDEX 258 +#define APPLE80211_IOC_MAX_NSS_FOR_AP 259 +#define APPLE80211_IOC_BTCOEX_2G_CHAIN_DISABLE 260 +#define APPLE80211_IOC_POWER_BUDGET 261 +#define APPLE80211_IOC_AWDL_DFSP_CONFIG 262 +#define APPLE80211_IOC_AWDL_DFSP_UCSA_CONFIG 263 +#define APPLE80211_IOC_SCAN_BACKOFF_REPORT 264 +#define APPLE80211_IOC_OFFLOAD_TCPKA_ENABLE 265 +#define APPLE80211_IOC_RANGING_CAPS 266 +#define APPLE80211_IOC_PER_CORE_RSSI_REPORT 267 +#define APPLE80211_IOC_NSS 353 + +#define APPLE80211_IOC_CARD_SPECIFIC 0xffffffff // req_type + +// Kernel interface + +// Bump this value when structures change +#define APPLE80211_VERSION 1 + +struct apple80211_ssid_data +{ + u_int32_t version; + u_int32_t ssid_len; + u_int8_t ssid_bytes[APPLE80211_MAX_SSID_LEN]; +}; + +struct apple80211_virt_if_create_data { + uint32_t version; + uint8_t mac[APPLE80211_ADDR_LEN]; + uint16_t unk1; + uint32_t role; + uint8_t bsd_name[15]; +} __attribute__((packed)); + +struct apple80211_virt_if_delete_data { + uint32_t version; + uint8_t bsd_name[15]; +} __attribute__((packed)); + +struct apple80211_ht_capability { + uint32_t version; + uint8_t unk1; + uint8_t unk2; + uint16_t unk3; + uint8_t unk4; + uint8_t unk5[16]; + uint16_t unk6; + uint unk7; + uint8_t unk8; +} __attribute__((packed)); + +struct apple80211_channel_data +{ + u_int32_t version; + struct apple80211_channel channel; +}; + +struct apple80211_bssid_data +{ + u_int32_t version; + struct ether_addr bssid; +}; + +struct apple80211_capability_data +{ + u_int32_t version; + u_int8_t capabilities[11]; +}; + +struct apple80211_state_data +{ + u_int32_t version; + u_int32_t state; +}; + +struct apple80211_rssi_data +{ + u_int32_t version; + u_int32_t num_radios; + u_int32_t rssi_unit; + int32_t rssi[APPLE80211_MAX_RADIO]; // control channel + int32_t aggregate_rssi; // aggregate control channel rssi + int32_t rssi_ext[APPLE80211_MAX_RADIO]; // extension channel rssi + int32_t aggregate_rssi_ext; // aggregate extension channel rssi +}; + +struct apple80211_power_data +{ + u_int32_t version; + u_int32_t num_radios; + u_int32_t power_state[APPLE80211_MAX_RADIO]; +}; + +struct apple80211_assoc_result_data +{ + u_int32_t version; + u_int32_t result; +}; + +struct apple80211_assoc_status_data +{ + u_int32_t version; + u_int32_t status; +}; + +struct apple80211_rate_data +{ + u_int32_t version; + u_int32_t num_radios; + u_int32_t rate[APPLE80211_MAX_RADIO]; +}; + +struct apple80211_status_dev_data +{ + u_int32_t version; + u_int8_t dev_name[MAXPATHLEN]; +}; + +struct apple80211_powersave_data +{ + u_int32_t version; + u_int32_t powersave_level; +}; + +struct apple80211_protmode_data +{ + u_int32_t version; + u_int32_t protmode; + u_int32_t threshold; // bytes +}; + +struct apple80211_txpower_data +{ + u_int32_t version; + u_int32_t txpower_unit; + int32_t txpower; +}; + +struct apple80211_phymode_data +{ + u_int32_t version; + u_int32_t phy_mode; // vector of supported phy modes + u_int32_t active_phy_mode; // current active phy mode +}; + +struct apple80211_opmode_data +{ + u_int32_t version; + u_int32_t op_mode; +}; + +struct apple80211_noise_data +{ + u_int32_t version; + u_int32_t num_radios; + u_int32_t noise_unit; + int32_t noise[APPLE80211_MAX_RADIO]; // control channel + int32_t aggregate_noise; // aggregate control channel noise + int32_t noise_ext[APPLE80211_MAX_RADIO]; // extension channel noise + int32_t aggregate_noise_ext; // aggregate extension channel noise +}; + +struct apple80211_intmit_data +{ + u_int32_t version; + u_int32_t int_mit; +}; + +struct apple80211_authtype_data +{ + u_int32_t version; + u_int32_t authtype_lower; // apple80211_authtype_lower + u_int32_t authtype_upper; // apple80211_authtype_upper +}; + +struct apple80211_sup_channel_data +{ + u_int32_t version; + u_int32_t num_channels; + struct apple80211_channel supported_channels[APPLE80211_MAX_CHANNELS]; +}; + + +struct apple80211_roam_threshold_data +{ + u_int32_t threshold; + u_int32_t count; +}; + +struct apple80211_locale_data +{ + u_int32_t version; + u_int32_t locale; +}; + +struct apple80211_scan_data +{ + u_int32_t version; + u_int32_t bss_type; // apple80211_apmode + struct ether_addr bssid; // target BSSID + u_int32_t ssid_len; // length of the SSID + u_int8_t ssid[APPLE80211_MAX_SSID_LEN]; // direct scan ssid or AirDrop scan ssid like "Air-xxxx" + u_int32_t scan_type; // apple80211_scan_type + u_int32_t phy_mode; // apple80211_phymode vector + u_int16_t dwell_time; // time to spend on each channel (ms) + u_int32_t rest_time; // time between scanning each channel (ms) + u_int32_t num_channels; // 0 if not passing in channels + struct apple80211_channel channels[APPLE80211_MAX_CHANNELS]; // channel list +}; + +struct apple80211_scan_multiple_data +{ + uint32_t version; + uint32_t ap_mode; // apple80211_apmode + uint32_t ssid_count; + apple80211_ssid_data ssids[16]; + uint32_t bssid_count; + ether_addr bssids[16]; + uint32_t scan_type; + uint32_t phy_mode; + uint32_t dwell_time; + uint32_t rest_time; + uint32_t num_channels; + struct apple80211_channel channels[128]; + uint16_t unk_2; +}; + +struct apple80211_link_changed_event_data +{ + bool isLinkDown; // 0 + uint32_t rssi; // 4 + uint16_t snr; // 8 + uint16_t nf; // 10 + char cca; // 12 + bool voluntary; // 16 + uint32_t reason; // 20 +}; + +struct apple80211_apmode_data +{ + u_int32_t version; + u_int32_t apmode; +}; + +struct apple80211_assoc_data +{ + u_int32_t version; + u_int16_t ad_mode; // apple80211_apmode + u_int16_t ad_auth_lower; // apple80211_authtype_lower + u_int16_t ad_auth_upper; // apple80211_authtype_upper + u_int32_t ad_ssid_len; + u_int8_t ad_ssid[ APPLE80211_MAX_SSID_LEN ]; + struct ether_addr ad_bssid; // prefer over ssid if not zeroed + struct apple80211_key ad_key; + uint16_t pad; + u_int8_t ad_rsn_ie[ APPLE80211_MAX_RSN_IE_LEN ]; + u_int32_t ad_flags; // apple80211_assoc_flags +}; + +static_assert(offsetof(apple80211_assoc_data, ad_rsn_ie) == 206, "offsetof(apple80211_assoc_data, ad_rsn_ie)"); + +struct apple80211_deauth_data +{ + u_int32_t version; + u_int32_t deauth_reason; // reason code + struct ether_addr deauth_ea; // BSSID of AP +}; + +struct apple80211_countermeasures_data +{ + u_int32_t version; + u_int32_t enabled; +}; + +struct apple80211_frag_threshold_data +{ + u_int32_t version; + u_int32_t threshold; // bytes +}; + +struct apple80211_rate_set_data +{ + u_int32_t version; + u_int16_t num_rates; + struct apple80211_rate rates[APPLE80211_MAX_RATES]; +}; + +struct apple80211_short_slot_data +{ + u_int32_t version; + u_int8_t mode; +}; + +struct apple80211_retry_limit_data +{ + u_int32_t version; + u_int32_t limit; +}; + +struct apple80211_antenna_data +{ + u_int32_t version; + u_int32_t num_radios; + int32_t antenna_index[APPLE80211_MAX_RADIO]; +}; + +struct apple80211_dtim_int_data +{ + u_int32_t version; + u_int32_t interval; +}; + +struct apple80211_sta_data +{ + u_int32_t version; + u_int32_t num_stations; + struct apple80211_station station_list[APPLE80211_MAX_STATIONS]; +}; + +struct apple80211_version_data +{ + u_int32_t version; + u_int16_t string_len; + char string[APPLE80211_MAX_VERSION_LEN]; +}; + +struct apple80211_rom_data +{ + u_int32_t version; + u_int32_t rom_len; + u_int8_t rom[1]; // variable length +}; + +struct apple80211_rand_data +{ + u_int32_t version; + u_int32_t rand; +}; + +struct apple80211_rsn_ie_data +{ + u_int32_t version; + u_int16_t len; + u_int8_t ie[ APPLE80211_MAX_RSN_IE_LEN ]; +}; + +struct apple80211_ap_ie_data +{ + u_int32_t version; + u_int32_t len; + u_int8_t *ie_data; +}; + +struct apple80211_stats_data +{ + u_int32_t version; + u_int32_t tx_frame_count; + u_int32_t tx_errors; + u_int32_t rx_frame_count; + u_int32_t rx_errors; +}; + +struct apple80211_country_code_data +{ + u_int32_t version; + u_int8_t cc[APPLE80211_MAX_CC_LEN]; +}; + +struct apple80211_last_rx_pkt_data +{ + u_int32_t version; + u_int32_t rate; + int32_t rssi; + u_int32_t num_streams; // number of spatial streams + struct ether_addr sa; // source address +}; + +struct apple80211_radio_info_data +{ + u_int32_t version; + u_int32_t count; // number of rf chains +}; + +struct apple80211_guard_interval_data +{ + u_int32_t version; + u_int32_t interval; // apple80211_guard_interval +}; + +struct apple80211_mcs_data +{ + u_int32_t version; + u_int32_t index; // 0 to APPLE80211_MAX_MCS_INDEX +}; + +struct apple80211_rifs_data +{ + u_int32_t version; + u_int32_t enabled; +}; + +struct apple80211_ldpc_data +{ + u_int32_t version; + u_int32_t enabled; +}; + +struct apple80211_msdu_data +{ + u_int32_t version; + u_int32_t max_length; // 3839 or 7935 bytes +}; + +struct apple80211_mpdu_data +{ + u_int32_t version; + u_int32_t max_factor; // 0 - APPLE80211_MAX_MPDU_FACTOR + u_int32_t max_density; // 0 - APPLE80211_MAX_MPDU_DENSITY +}; + +struct apple80211_block_ack_data +{ + u_int32_t version; + u_int8_t ba_enabled; // block ack enabled + u_int8_t immediate_ba_enabled; // immediate block ack enabled + u_int8_t cbba_enabled; // compressed bitmap block ack enabled + u_int8_t implicit_ba_enabled; // implicit block ack enabled +}; + +struct apple80211_pls_data +{ + u_int32_t version; + u_int32_t enabled; // phy level spoofing enabled +}; + +struct apple80211_psmp_data +{ + u_int32_t version; + u_int32_t enabled; +}; + +struct apple80211_physubmode_data +{ + u_int32_t version; + u_int32_t phy_mode; // one apple80211_phymode + u_int32_t phy_submode; // one apple80211_physubmode + u_int32_t flags; // apple80211_channel_flag vector +}; + +struct apple80211_mcs_index_set_data +{ + u_int32_t version; + u_int8_t mcs_set_map[APPLE80211_MAP_SIZE( APPLE80211_MAX_MCS_INDEX + 1 )]; +}; + +struct apple80211_wow_parameter_data +{ + u_int32_t version; + u_int8_t wake_cond_map[APPLE80211_MAP_SIZE( APPLE80211_MAX_WAKE_COND + 1 )]; + u_int32_t beacon_loss_time; + u_int32_t pattern_count; + struct apple80211_wow_pattern patterns[APPLE80211_MAX_WOW_PATTERNS]; +}; + +struct apple80211_40mhz_intolerant_data +{ + u_int32_t version; + u_int32_t enabled; // bit enabled or not +}; + +struct apple80211_tx_nss_data +{ + uint32_t version; + uint8_t nss; +}; + +struct apple80211_nss_data +{ + uint32_t version; + uint8_t nss; +}; + +struct apple80211_awdl_peer_traffic_registration +{ + uint32_t version; + void *addr; + uint32_t name_len; + char name[152]; + uint32_t active; +} __attribute__((packed)); + +struct apple80211_awdl_election_metric +{ + uint32_t version; + uint32_t metric; +} __attribute__((packed)); + +struct apple80211_awdl_sync_enabled +{ + uint32_t version; + uint32_t unk1; + uint32_t enabled; +} __attribute__((packed)); + +struct apple80211_awdl_sync_frame_template +{ + uint32_t version; + uint32_t payload_len; + void *payload; +} __attribute__((packed)); + +#endif // _APPLE80211_IOCTL_H_ + diff --git a/QualcommWireless/include/IOKit/80211/apple80211_var.h b/QualcommWireless/include/IOKit/80211/apple80211_var.h new file mode 100644 index 0000000..186760b --- /dev/null +++ b/QualcommWireless/include/IOKit/80211/apple80211_var.h @@ -0,0 +1,645 @@ +/* + * Copyright (c) 2005 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _APPLE80211_VAR_H_ +#define _APPLE80211_VAR_H_ + +#include +#include +#include +#include + +// This is necessary, because even the latest Xcode does not support properly targeting 11.0. +#ifndef __IO80211_TARGET +#error "Please define __IO80211_TARGET to the requested version" +#endif + +// Sizes and limits +#define APPLE80211_ADDR_LEN 6 +#define APPLE80211_MAX_RATES 15 +#define APPLE80211_MAX_SSID_LEN 32 +#define APPLE80211_MAX_ANTENNAE 4 +#define APPLE80211_MAX_RADIO 4 +#define APPLE80211_MAX_CHANNELS 64 +#define APPLE80211_MAX_STATIONS 128 +#define APPLE80211_MAX_VERSION_LEN 256 +#define APPLE80211_MAX_ROM_SIZE 32768 // 32 KB +#define APPLE80211_MAX_RSN_IE_LEN 257 // 255 + type and length bytes +#define APPLE80211_MAX_CC_LEN 3 +#define APPLE80211_MAX_MCS_INDEX 76 +#define APPLE80211_MAX_MPDU_FACTOR 3 +#define APPLE80211_MAX_MPDU_DENSITY 7 +#define APPLE80211_MAX_WOW_PAT_LEN 1500 // Max wake on wireless pattern length +#define APPLE80211_MAX_WOW_PATTERNS 12 // Arbitrary..this can change + +#define APPLE80211_MAP_SIZE( _bits ) (roundup( _bits, NBBY )/NBBY) + +enum apple80211_phymode { + APPLE80211_MODE_UNKNOWN = 0, + APPLE80211_MODE_AUTO = 1, // autoselect + APPLE80211_MODE_11A = 2 << (1 - 1), // 5GHz, OFDM + APPLE80211_MODE_11B = 2 << (2 - 1), // 2GHz, CCK + APPLE80211_MODE_11G = 2 << (3 - 1), // 2GHz, OFDM + APPLE80211_MODE_11N = 2 << (4 - 1), // 2GHz/5GHz, OFDM + APPLE80211_MODE_TURBO_A = 2 << (5 - 1), // 5GHz, OFDM, 2x clock + APPLE80211_MODE_TURBO_G = 2 << (6 - 1), // 2GHz, OFDM, 2x clock + APPLE80211_MODE_11AC = 2 << (7 - 1), + APPLE80211_MODE_11AX = 2 << (8 - 1), +}; + +enum apple80211_physubmode { + APPLE80211_SUBMODE_UNKNOWN = 0x0, + APPLE80211_SUBMODE_11N_AUTO = 0x1, // 11n mode determined by AP capabilities + APPLE80211_SUBMODE_11N_LEGACY = 0x2, // legacy + APPLE80211_SUBMODE_11N_LEGACY_DUP = 0x4, // legacy duplicate + APPLE80211_SUBMODE_11N_HT = 0x8, // high throughput + APPLE80211_SUBMODE_11N_HT_DUP = 0x10, // high throughput duplicate + APPLE80211_SUBMODE_11N_GF = 0x20, // green field +}; + +// flags +enum apple80211_opmode { + APPLE80211_M_NONE = 0x0, + APPLE80211_M_STA = 0x1, // infrastructure station + APPLE80211_M_IBSS = 0x2, // IBSS (adhoc) station + APPLE80211_M_AHDEMO = 0x4, // Old lucent compatible adhoc demo + APPLE80211_M_HOSTAP = 0x8, // Software Access Point + APPLE80211_M_MONITOR = 0x10 // Monitor mode +}; + +enum apple80211_apmode { + APPLE80211_AP_MODE_UNKNOWN = 0, + APPLE80211_AP_MODE_IBSS = 1, // IBSS (adhoc) station + APPLE80211_AP_MODE_INFRA = 2, // Access Point + APPLE80211_AP_MODE_ANY = 3, // Any supported mode +}; + +enum apple80211_state { + APPLE80211_S_INIT = 0, // default state + APPLE80211_S_SCAN = 1, // scanning + APPLE80211_S_AUTH = 2, // try to authenticate + APPLE80211_S_ASSOC = 3, // try to assoc + APPLE80211_S_RUN = 4, // associated +}; + +enum apple80211_protmode { + APPLE80211_PROTMODE_OFF = 0, // no protection + APPLE80211_PROTMODE_AUTO = 1, // auto + APPLE80211_PROTMODE_CTS = 2, // CTS to self + APPLE80211_PROTMODE_RTSCTS = 3, // RTS-CTS + APPLE80211_PROTMODE_DUAL_CTS = 4, // dual CTS +}; + +enum apple80211_cipher_type { + APPLE80211_CIPHER_NONE = 0, // open network + APPLE80211_CIPHER_WEP_40 = 1, // 40 bit WEP + APPLE80211_CIPHER_WEP_104 = 2, // 104 bit WEP + APPLE80211_CIPHER_TKIP = 3, // TKIP (WPA) + APPLE80211_CIPHER_AES_OCB = 4, // AES (OCB) + APPLE80211_CIPHER_AES_CCM = 5, // AES (CCM) + APPLE80211_CIPHER_PMK = 6, // PMK + APPLE80211_CIPHER_PMKSA = 7, // PMK obtained from pre-authentication +}; + +enum apple80211_cipher_key_type +{ + APPLE80211_CIPHER_KEY_TYPE_UNICAST = 0, // unicast cipher key + APPLE80211_CIPHER_KEY_TYPE_MULTICAST = 1 // multicast cipher key +}; + +// Low level 802.11 authentication types + +enum apple80211_authtype_lower +{ + APPLE80211_AUTHTYPE_OPEN = 1, // open + APPLE80211_AUTHTYPE_SHARED = 2, // shared key + APPLE80211_AUTHTYPE_CISCO = 3, // cisco net eap +}; + +// Higher level authentication used after 802.11 association complete + +enum apple80211_authtype_upper +{ + APPLE80211_AUTHTYPE_NONE = 0, // No upper auth + APPLE80211_AUTHTYPE_WPA = 1 << 0, // WPA + APPLE80211_AUTHTYPE_WPA_PSK = 1 << 1, // WPA PSK + APPLE80211_AUTHTYPE_WPA2 = 1 << 2, // WPA2 + APPLE80211_AUTHTYPE_WPA2_PSK = 1 << 3, // WPA2 PSK + APPLE80211_AUTHTYPE_LEAP = 1 << 4, // LEAP + APPLE80211_AUTHTYPE_8021X = 1 << 5, // 802.1x + APPLE80211_AUTHTYPE_WPS = 1 << 6, // WiFi Protected Setup + APPLE80211_AUTHTYPE_SHA256_PSK = 1 << 7, + APPLE80211_AUTHTYPE_SHA256_8021X = 1 << 8, + APPLE80211_AUTHTYPE_WPA3_SAE = 1 << 9 +}; + +// Unify association status code and deauth reason codes into a single enum describing +// common error conditions +enum apple80211_associate_result +{ + APPLE80211_RESULT_UNAVAILABLE = 0, // No association/authentication result ready + APPLE80211_RESULT_SUCCESS = 1, // APPLE80211_STATUS_SUCCESS and no deauth + APPLE80211_RESULT_UNSPECIFIED_FAILURE = 2, // APPLE80211_STATUS_UNSPECIFIED_FAILURE + APPLE80211_RESULT_UNSUPPORTED_CAPAPBILITIES = 3, // APPLE80211_STATUS_UNSUPPORTED_CAPABILITIES + APPLE80211_RESULT_REASSOCIATION_DENIED = 4, // APPLE80211_STATUS_REASSOCIATION_DENIED + APPLE80211_RESULT_ASSOCIATION_DENIED = 5, // APPLE80211_STATUS_ASSOCIATION_DENIED + APPLE80211_RESULT_AUTH_ALG_UNSUPPORTED = 6, // APPLE80211_STATUS_AUTH_ALG_UNSUPPORTED + APPLE80211_RESULT_INVALID_AUTH_SEQ_NUM = 7, // APPLE80211_STATUS_INVALID_AUTH_SEQ_NUM + APPLE80211_RESULT_CHALLENGE_FAILURE = 8, // APPLE80211_STATUS_CHALLENGE_FAILURE + APPLE80211_RESULT_TIMEOUT = 9, // APPLE80211_STATUS_TIMEOUT + APPLE80211_RESULT_AP_FULL = 10, // APPLE80211_STATUS_AP_FULL + APPLE80211_RESULT_UNSUPPORTED_RATE_SET = 11, // APPLE80211_STATUS_UNSUPPORTED_RATE_SET + APPLE80211_RESULT_SHORT_SLOT_UNSUPPORTED = 12, // APPLE80211_STATUS_SHORT_SLOT_UNSUPPORTED + APPLE80211_RESULT_DSSS_OFDM_UNSUPPORTED = 13, // APPLE80211_STATUS_DSSS_OFDM_UNSUPPORTED + APPLE80211_RESULT_INVALID_IE = 14, // APPLE80211_STATUS_INVALID_IE + APPLE80211_RESULT_INVALID_GROUP_CIPHER = 15, // APPLE80211_STATUS_INVALID_GROUP_CIPHER + APPLE80211_RESULT_INVALID_PAIRWISE_CIPHER = 16, // APPLE80211_STATUS_INVALID_PAIRWISE_CIPHER + APPLE80211_RESULT_INVALID_AKMP = 17, // APPLE80211_STATUS_INVALID_AKMP + APPLE80211_RESULT_UNSUPPORTED_RSN_VERSION = 18, // APPLE80211_STATUS_UNSUPPORTED_RSN_VERSION + APPLE80211_RESULT_INVALID_RSN_CAPABILITIES = 19, // APPLE80211_STATUS_INVALID_RSN_CAPABILITIES + APPLE80211_RESULT_CIPHER_SUITE_REJECTED = 20, // APPLE80211_STATUS_CIPHER_SUIT_REJECTED + APPLE80211_RESULT_INVALID_PMK = 21, // APPLE80211_REASON_PREV_AUTH_EXPIRED received + APPLE80211_RESULT_SUPPLICANT_TIMEOUT = 22, // RSNSupplicant did not finish handshake + APPLE80211_RESULT_UNKNOWN = 0xffff // Unrecognized error condition +}; + +enum apple80211_link_down_reason +{ + APPLE80211_LINK_DOWN_REASON_INTERNAL_ERROR = 0, + APPLE80211_LINK_DOWN_REASON_BEACONLOST = 1, + APPLE80211_LINK_DOWN_REASON_DEAUTH = 2, + APPLE80211_LINK_DOWN_REASON_INTERNAL_ERROR_2 = 3 +}; + +enum apple80211_unit +{ + APPLE80211_UNIT_DBM = 0, // dBm + APPLE80211_UNIT_MW = 1, // milliwatts + APPLE80211_UNIT_PERCENT = 2, // value expressed as a percentage +}; + +enum apple80211_power_state +{ + APPLE80211_POWER_OFF = 0, // Chain disabled + APPLE80211_POWER_ON = 1, // Chain powered on for tx and rx + APPLE80211_POWER_TX = 2, // Chain powered on for tx only + APPLE80211_POWER_RX = 3, // Chain powered on for rx only +}; + +enum apple80211_locale +{ + APPLE80211_LOCALE_UNKNOWN = 0, + APPLE80211_LOCALE_FCC = 1, + APPLE80211_LOCALE_ETSI = 2, + APPLE80211_LOCALE_JAPAN = 3, + APPLE80211_LOCALE_KOREA = 4, + APPLE80211_LOCALE_APAC = 5, + APPLE80211_LOCALE_ROW = 6, + APPLE80211_LOCALE_INDONESIA = 7 +}; + +enum apple80211_scan_type +{ + APPLE80211_SCAN_TYPE_NONE = 0, + APPLE80211_SCAN_TYPE_ACTIVE = 1, + APPLE80211_SCAN_TYPE_PASSIVE = 2, + APPLE80211_SCAN_TYPE_FAST = 3, // Ok to return cached scan results + APPLE80211_SCAN_TYPE_BACKGROUND = 4, // Initiate background scanning +}; + +enum apple80211_int_mit { + APPLE80211_INT_MIT_OFF = 0, + APPLE80211_INT_MIT_AUTO = 1, +}; + +enum apple80211_channel_flag +{ + APPLE80211_C_FLAG_NONE = 0x0, // no flags + APPLE80211_C_FLAG_10MHZ = 0x1, // 10 MHz wide + APPLE80211_C_FLAG_20MHZ = 0x2, // 20 MHz wide + APPLE80211_C_FLAG_40MHZ = 0x4, // 40 MHz wide + APPLE80211_C_FLAG_2GHZ = 0x8, // 2.4 GHz + APPLE80211_C_FLAG_5GHZ = 0x10, // 5 GHz + APPLE80211_C_FLAG_IBSS = 0x20, // IBSS supported + APPLE80211_C_FLAG_HOST_AP = 0x40, // HOST AP mode supported + APPLE80211_C_FLAG_ACTIVE = 0x80, // active scanning supported + APPLE80211_C_FLAG_DFS = 0x100, // DFS required + APPLE80211_C_FLAG_EXT_ABV = 0x200, // If 40 Mhz, extension channel above. + // If this flag is not set, then the + // extension channel is below. + APPLE80211_C_FLAG_80MHZ = 0x400 // name made up - set if channelWidth == 80 && 5ghz && AC +}; + +enum apple80211_rate_flag +{ + APPLE80211_RATE_FLAG_NONE = 0x0, // no flags + APPLE80211_RATE_FLAG_BASIC = 0x1, // basic rate + APPLE80211_RATE_FLAG_HT = 0x2, // HT rate computed from MCS index +}; + +enum apple80211_short_slot_mode +{ + APPLE80211_SHORT_SLOT_MODE_AUTO = 1, // Default behavior + APPLE80211_SHORT_SLOT_MODE_LONG = 2, // long - short slot timing mode + APPLE80211_SHORT_SLOT_MODE_SHORT = 3, // short - short slot timing mode +}; + +enum apple80211_powersave_mode +{ + // Standard modes + APPLE80211_POWERSAVE_MODE_DISABLED = 0, + APPLE80211_POWERSAVE_MODE_80211 = 1, + APPLE80211_POWERSAVE_MODE_VENDOR = 2, // Vendor specific mode, there should be + // more general apple modes in the future. + // Vendor modes also likely require more info. + // Mimo modes + APPLE80211_POWERSAVE_MODE_MIMO_STATIC = 3, + APPLE80211_POWERSAVE_MODE_MIMO_DYNAMIC = 4, + APPLE80211_POWERSAVE_MODE_MIMO_MIMO = 5, + + // WOW + APPLE80211_POWERSAVE_MODE_WOW = 6, + + // Vendor specific powersave mode, throughput is maximized + APPLE80211_POWERSAVE_MODE_MAX_THROUGHPUT = 7, + + // Vendor specific powersave mode, power savings are maximized, possibly + // at the expense of throughput/latency. + APPLE80211_POWERSAVE_MODE_MAX_POWERSAVE = 8, +}; + +enum apple80211_debug_flag +{ + APPLE80211_DEBUG_FLAG_NONE = 0x0, // No logging + APPLE80211_DEBUG_FLAG_INFORMATIVE = 0x1, // Log "interesting" events + APPLE80211_DEBUG_FLAG_ERROR = 0x2, // Log errors + APPLE80211_DEBUG_FLAG_RSN = 0x4, // Full RSN supplicant logging + APPLE80211_DEBUG_FLAG_SCAN = 0x8, // Scan events and information +}; + +enum apple80211_guard_interval +{ + APPLE80211_GI_SHORT = 400, // ns + APPLE80211_GI_LONG = 800, // ns +}; + +#define APPLE80211_RSC_LEN 8 +#define APPLE80211_KEY_BUFF_LEN 32 + +#define APPLE80211_KEY_FLAG_UNICAST 0x1 +#define APPLE80211_KEY_FLAG_MULTICAST 0x2 +#define APPLE80211_KEY_FLAG_TX 0x4 +#define APPLE80211_KEY_FLAG_RX 0x8 + +struct apple80211_key +{ + u_int32_t version; + u_int32_t key_len; + u_int32_t key_cipher_type; // apple80211_cipher_type + u_int16_t key_flags; + u_int16_t key_index; + u_int8_t key[ APPLE80211_KEY_BUFF_LEN ]; + u_int8_t pad[30]; + u_int32_t key_rsc_len; + u_int8_t key_rsc[ APPLE80211_RSC_LEN ]; // receive sequence counter + struct ether_addr key_ea; // key applies to this bssid + uint wowl_kck_len; + uint8_t wowl_kck_key[16]; + uint wowl_kek_len; + u_int8_t wowl_kek_key[24]; +}; + +// Changing this affects any structure that contains a channel +struct apple80211_channel +{ + u_int32_t version; + u_int32_t channel; // channel number + u_int32_t flags; // apple80211_channel_flag vector +}; + +struct apple80211_rate +{ + u_int32_t version; + u_int32_t rate; // rate mbps + u_int32_t flags; // apple80211_rate_flag vector +}; + +// Probe response capability flags, IEEE 7.3.1.4 +#define APPLE80211_CAPINFO_ESS 0x0001 +#define APPLE80211_CAPINFO_IBSS 0x0002 +#define APPLE80211_CAPINFO_CF_POLLABLE 0x0004 +#define APPLE80211_CAPINFO_CF_POLLREQ 0x0008 +#define APPLE80211_CAPINFO_PRIVACY 0x0010 +#define APPLE80211_CAPINFO_SHORT_PREAMBLE 0x0020 +#define APPLE80211_CAPINFO_PBCC 0x0040 +#define APPLE80211_CAPINFO_AGILITY 0x0080 +// 0x0100, 0x0200 reserved +#define APPLE80211_CAPINFO_SHORT_SLOT_TIME 0x0400 +// 0x0800, 0x1000 reserved +#define APPLE80211_CAPINFO_DSSS_OFDM 0x2000 +// 0x4000, 0x8000 reserved + +// Reason codes IEEE 7.3.1.7 +#define APPLE80211_REASON_UNSPECIFIED 1 +#define APPLE80211_REASON_PREV_AUTH_EXPIRED 2 +#define APPLE80211_REASON_AUTH_LEAVING 3 +#define APPLE80211_REASON_INACTIVE 4 +#define APPLE80211_REASON_AP_OVERLOAD 5 +#define APPLE80211_REASON_NOT_AUTHED 6 +#define APPLE80211_REASON_NOT_ASSOCED 7 +#define APPLE80211_REASON_ASSOC_LEAVING 8 +#define APPLE80211_REASON_ASSOC_NOT_AUTHED 9 +#define APPLE80211_REASON_POWER_CAP 10 +#define APPLE80211_REASON_SUPPORTED_CHANS 11 + +#define APPLE80211_REASON_INVALID_IE 13 +#define APPLE80211_REASON_MIC_FAILURE 14 +#define APPLE80211_REASON_4_WAY_TIMEOUT 15 +#define APPLE80211_REASON_GROUP_KEY_TIMEOUT 16 +#define APPLE80211_REASON_DIFF_IE 17 +#define APPLE80211_REASON_INVALID_GROUP_KEY 18 +#define APPLE80211_REASON_INVALID_PAIR_KEY 19 +#define APPLE80211_REASON_INVALID_AKMP 20 +#define APPLE80211_REASON_UNSUPP_RSN_VER 21 +#define APPLE80211_REASON_INVALID_RSN_CAPS 22 +#define APPLE80211_REASON_8021X_AUTH_FAILED 23 + +// Status codes IEEE 7.3.1.9 +#define APPLE80211_STATUS_SUCCESS 0 +#define APPLE80211_STATUS_UNSPECIFIED_FAILURE 1 +// 2-9 reserved +#define APPLE80211_STATUS_UNSUPPORTED_CAPABILITIES 10 +#define APPLE80211_STATUS_REASSOCIATION_DENIED 11 +#define APPLE80211_STATUS_ASSOCIATION_DENIED 12 +#define APPLE80211_STATUS_AUTH_ALG_UNSUPPORTED 13 +#define APPLE80211_STATUS_INVALID_AUTH_SEQ_NUM 14 +#define APPLE80211_STATUS_CHALLENGE_FAILURE 15 +#define APPLE80211_STATUS_TIMEOUT 16 +#define APPLE80211_STATUS_AP_FULL 17 +#define APPLE80211_STATUS_UNSUPPORTED_RATE_SET 18 +// 22-24 reserved +#define APPLE80211_STATUS_SHORT_SLOT_UNSUPPORTED 25 +#define APPLE80211_STATUS_DSSS_OFDM_UNSUPPORTED 26 +// 27-39 reserved +#define APPLE80211_STATUS_INVALID_IE 40 +#define APPLE80211_STATUS_INVALID_GROUP_CIPHER 41 +#define APPLE80211_STATUS_INVALID_PAIRWISE_CIPHER 42 +#define APPLE80211_STATUS_INVALID_AKMP 43 +#define APPLE80211_STATUS_UNSUPPORTED_RSN_VERSION 44 +#define APPLE80211_STATUS_INVALID_RSN_CAPABILITIES 45 +#define APPLE80211_STATUS_CIPHER_SUITE_REJECTED 46 +// 47 - 65535 reserved +#define APPLE80211_STATUS_UNAVAILABLE 0xffff + +// If mcs index is set to APPLE80211_MCS_INDEX_AUTO, the interface +// should go to auto rate selection, and abandon any previously +// configured static MCS indices +#define APPLE80211_MCS_INDEX_AUTO 0xffffffff + +/* + DSCP TOS/Traffic class values for WME access categories taken from + WiFi WMM Test Plan v 1.3.1 Appendix C. + + TOS/Traffic class field looks like: + + 0 1 2 3 4 5 6 7 + +---+---+---+---+---+---+---+---+ + | DSCP | ECN | + +---+---+---+---+---+---+---+---+ + + These bits are numbered according to rfc 2474, but might be misleading. + It looks like bit 0 is actually the high order bit. + */ + +#define APPLE80211_DSCP_WME_BE 0x00 +#define APPLE80211_DSCP_WME_BK 0x08 +#define APPLE80211_DSCP_WME_VI 0x28 +#define APPLE80211_DSCP_WME_VO 0x38 + +// Access category values set in the mbuf +#define APPLE80211_WME_AC_BE 0 +#define APPLE80211_WME_AC_BK 1 +#define APPLE80211_WME_AC_VI 2 +#define APPLE80211_WME_AC_VO 3 + +// Working within the limitations of the kpi mbuf routines, the receive interface pointer +// is the best place to put this for now since it is not used on the output path. The mbuf +// kpi doesn't allow us to access unused flags, or I would put the WME AC in there like +// everyone else. + +#define APPLE80211_MBUF_SET_WME_AC( m, ac ) mbuf_pkthdr_setrcvif( m, (ifnet_t)ac ) +#define APPLE80211_MBUF_WME_AC( m ) (int)mbuf_pkthdr_rcvif( m ) + +// FIXME: seems that rates array starts at 0x24, immediately after +struct apple80211_scan_result +{ + u_int32_t version; // 0x00 - 0x03 + apple80211_channel asr_channel; // 0x04 - 0x0f + + int16_t asr_unk; // 0x10 - 0x11 + + int16_t asr_noise; // 0x12 - 0x13 + int16_t asr_snr; // 0x14 - 0x15 + int16_t asr_rssi; // 0x16 - 0x17 + int16_t asr_beacon_int; // 0x18 - 0x19 + + int16_t asr_cap; // 0x1a - 0x1b (capabilities) + + u_int8_t asr_bssid[ APPLE80211_ADDR_LEN ]; // 0x1c 0x1d 0x1e 0x1f 0x20 0x21 + u_int8_t asr_nrates; // 0x22 + u_int8_t asr_nr_unk; // 0x23 + u_int32_t asr_rates[ APPLE80211_MAX_RATES ]; // 0x24 - 0x5f + u_int8_t asr_ssid_len; // 0x60 + u_int8_t asr_ssid[ APPLE80211_MAX_SSID_LEN ]; // 0x61 - 0x80 + __attribute__((packed)) __attribute__((aligned(1))) int16_t unk; + uint8_t unk2; + u_int32_t asr_age; // (ms) non-zero for cached scan result // 0x84 + + u_int16_t unk3; + int16_t asr_ie_len; + uint32_t asr_unk3; + void* asr_ie_data; +}; + +struct apple80211_network_data +{ + u_int32_t version; + u_int16_t nd_mode; // apple80211_apmode + u_int16_t nd_auth_lower; // apple80211_authtype_lower + u_int16_t nd_auth_upper; // apple80211_authtype_upper + struct apple80211_channel nd_channel; + u_int32_t nd_ssid_len; + u_int8_t nd_ssid[ APPLE80211_MAX_SSID_LEN ]; + struct apple80211_key nd_key; + u_int32_t nd_ie_len; + void *nd_ie_data; +}; + +#define APPLE80211_NETWORK_DATA_MAX_IE_LEN 1024 + +// As hostap support improves, this will grow +struct apple80211_station +{ + u_int32_t version; + struct ether_addr sta_mac; + int32_t sta_rssi; +}; + +// WOW structures and defines + +struct apple80211_wow_pattern +{ + size_t len; + u_int8_t *pattern; +}; + +enum apple80211_wake_condition +{ + APPLE80211_WAKE_COND_MAGIC_PATTERN = 0, + APPLE80211_WAKE_COND_NET_PATTERN = 1, + APPLE80211_WAKE_COND_DISASSOCIATED = 2, + APPLE80211_WAKE_COND_DEAUTHED = 3, + APPLE80211_WAKE_COND_RETROGRADE_TSF = 4, + APPLE80211_WAKE_COND_BEACON_LOSS = 5, +}; + +#define APPLE80211_MAX_WAKE_COND 5 + +enum apple80211_card_capability +{ + APPLE80211_CAP_WEP = 0, // CAPABILITY: WEP available + APPLE80211_CAP_TKIP = 1, // CAPABILITY: TKIP available + APPLE80211_CAP_AES = 2, // CAPABILITY: AES OCB avail + APPLE80211_CAP_AES_CCM = 3, // CAPABILITY: AES CCM avail + APPLE80211_CAP_CKIP = 4, // CAPABILITY: CKIP available + APPLE80211_CAP_IBSS = 5, // CAPABILITY: IBSS available + APPLE80211_CAP_PMGT = 6, // CAPABILITY: Power mgmt + APPLE80211_CAP_HOSTAP = 7, // CAPABILITY: HOSTAP avail + APPLE80211_CAP_TXPMGT = 8, // CAPABILITY: tx power mgmt + APPLE80211_CAP_SHSLOT = 9, // CAPABILITY: short slottime + APPLE80211_CAP_SHPREAMBLE = 10, // CAPABILITY: short preamble + APPLE80211_CAP_MONITOR = 11, // CAPABILITY: monitor mode + APPLE80211_CAP_TKIPMIC = 12, // CAPABILITY: TKIP MIC avail + APPLE80211_CAP_WPA1 = 13, // CAPABILITY: WPA1 avail + APPLE80211_CAP_WPA2 = 14, // CAPABILITY: WPA2 avail + APPLE80211_CAP_WPA = 15, // CAPABILITY: WPA1+WPA2 avail + APPLE80211_CAP_BURST = 16, // CAPABILITY: frame bursting + APPLE80211_CAP_WME = 17, // CAPABILITY: WME avail + APPLE80211_CAP_SHORT_GI_40MHZ = 18, // CAPABILITY: Short guard interval in 40 MHz + APPLE80211_CAP_SHORT_GI_20MHZ = 19, // CAPABILITY: Short guard interval in 20 MHz + APPLE80211_CAP_WOW = 20, // CAPABILITY: Wake on wireless + APPLE80211_CAP_TSN = 21, // CAPABILITY: WPA with WEP group key +}; +#define APPLE80211_CAP_MAX 63 + +enum apple80211_virtual_interface_type +{ + APPLE80211_VIF_P2P_DEVICE = 1, + APPLE80211_VIF_P2P_CLIENT = 2, + APPLE80211_VIF_P2P_GO = 3, + APPLE80211_VIF_AWDL = 4, + APPLE80211_VIF_SOFT_AP = 5, + + APPLE80211_VIF_MAX +}; + +enum apple80211_assoc_flags { + APPLE80211_ASSOC_F_CLOSED = 1, // flag: scan was directed, needed to remember closed networks +}; + +// Kernel messages + +struct apple80211_status_msg_hdr +{ + u_int32_t msg_type; // type of message + u_int32_t msg_len; // length of data (not including msg_type and msg_len) + + // data follows +}; + +#define APPLE80211_M_MAX_LEN 2048 + +#define APPLE80211_M_POWER_CHANGED 1 +#define APPLE80211_M_SSID_CHANGED 2 +#define APPLE80211_M_BSSID_CHANGED 3 +#define APPLE80211_M_LINK_CHANGED 4 +#define APPLE80211_M_MIC_ERROR_UCAST 5 +#define APPLE80211_M_MIC_ERROR_MCAST 6 +#define APPLE80211_M_INT_MIT_CHANGED 7 +#define APPLE80211_M_MODE_CHANGED 8 +#define APPLE80211_M_ASSOC_DONE 9 +#define APPLE80211_M_SCAN_DONE 10 +#define APPLE80211_M_COUNTRY_CODE_CHANGED 11 +#define APPLE80211_M_STA_ARRIVE 12 +#define APPLE80211_M_STA_LEAVE 13 +#define APPLE80211_M_DECRYPTION_FAILURE 14 +#define APPLE80211_M_SCAN_CACHE_UPDATED 15 +#define APPLE80211_M_INTERNAL_SCAN_DONE 16 +#define APPLE80211_M_LINK_QUALITY 17 +#define APPLE80211_M_IBSS_PEER_ARRIVED 18 +#define APPLE80211_M_IBSS_PEER_LEFT 19 +#define APPLE80211_M_RSN_HANDSHAKE_DONE 20 +#define APPLE80211_M_BT_COEX_CHANGED 21 +#define APPLE80211_M_P2P_PEER_DETECTED 22 +#define APPLE80211_M_P2P_LISTEN_COMPLETE 23 +#define APPLE80211_M_P2P_SCAN_COMPLETE 24 +#define APPLE80211_M_P2P_LISTEN_STARTED 25 +#define APPLE80211_M_P2P_SCAN_STARTED 26 +#define APPLE80211_M_P2P_INTERFACE_CREATED 27 +#define APPLE80211_M_P2P_GROUP_STARTED 28 +#define APPLE80211_M_BGSCAN_NET_DISCOVERED 29 +#define APPLE80211_M_ROAMED 30 +#define APPLE80211_M_ACT_FRM_TX_COMPLETE 31 +#define APPLE80211_M_DEAUTH_RECEIVED 32 +#define APPLE80211_M_DRIVER_AVAILABLE 0x37 +#define APPLE80211_M_LINK_ADDRESS_CHANGED 0x3B +#define APPLE80211_M_ROAM_START 0x46 +#define APPLE80211_M_ROAM_END 0x47 +#define APPLE80211_M_INTERFACE_STATE 0x3A + +#define APPLE80211_M_MAX 0x3A +#define APPLE80211_M_BUFF_SIZE APPLE80211_MAP_SIZE( APPLE80211_M_MAX ) + +// Registry Information +#define APPLE80211_REGKEY_HARDWARE_VERSION "IO80211HardwareVersion" +// #define APPLE80211_REG_FIRMWARE_VERSION "IO80211FirmwareVersion" +#define APPLE80211_REGKEY_DRIVER_VERSION "IO80211DriverVersion" +#define APPLE80211_REGKEY_LOCALE "IO80211Locale" +#define APPLE80211_REGKEY_SSID "IO80211SSID" +#define APPLE80211_REGKEY_CHANNEL "IO80211Channel" +#define APPLE80211_REGKEY_EXT_CHANNEL "IO80211ExtensionChannel" +#define APPLE80211_REGKEY_BAND "IO80211Band" +#define APPLE80211_BAND_2GHZ "2 GHz" +#define APPLE80211_BAND_5GHZ "5 GHz" +#define APPLE80211_REGKEY_COUNTRY_CODE "IO80211CountryCode" + +// Userland messages +#define APPLE80211_M_RSN_AUTH_SUCCESS 254 +#define APPLE80211_M_RSN_AUTH_SUCCESS_TEMPLATE "com.apple.rsn.%s.auth.success" // string is interface name + +#define APPLE80211_M_RSN_AUTH_TIMEOUT 255 +#define APPLE80211_M_RSN_AUTH_TIMEOUT_TEMPLATE "com.apple.rsn.%s.auth.timeout" // string is interface name + +#define APPLE80211_M_RSN_MSG_MAX 2 + +#endif // _APPLE80211_VAR_H_ + diff --git a/QualcommWireless/include/IOKit/80211/apple80211_wps.h b/QualcommWireless/include/IOKit/80211/apple80211_wps.h new file mode 100644 index 0000000..0204b14 --- /dev/null +++ b/QualcommWireless/include/IOKit/80211/apple80211_wps.h @@ -0,0 +1,537 @@ +// +// wps_eap.h +// IO80211Family +// +// Created by Pete on 6/20/06. +// Copyright 2006 Apple Computer, Inc. All rights reserved. +// + +#ifndef _APPLE80211_WPS_H_ +#define _APPLE80211_WPS_H_ + +#include +#include +#include + +// This is necessary, because even the latest Xcode does not support properly targeting 11.0. +#ifndef __IO80211_TARGET +#error "Please define __IO80211_TARGET to the requested version" +#endif + +#define WPS_HANDSHAKE_TIMEOUT 120 /* seconds */ +#define WPS_RETRANSMIT_TIMEOUT 5 +#define WPS_MAX_RETRIES 3 + +#define WPS_IDENTITY_STR "WFA-SimpleConfig-Enrollee-1-0" +#define WPS_IDENTITY_STR_LEN 29 +#define WPS_PERSONALIZATION_STRING "Wi-Fi Easy and Secure Key Derivation" +#define WPS_PERSONALIZATION_STRING_LEN ( sizeof( WPS_PERSONALIZATION_STRING ) - 1 ) +#define WPS_KDF_KEY_BITS 640 + +#define WPS_DISPLAY_PIN_LEN 8 + +#define EAP_TYPE_ID 1 +#define WPS_EAP_METHOD_TYPE 254 + +#define WPS_VENDOR_ID_BYTES 0x00, 0x37, 0x2A +#define WPS_VENDOR_TYPE 0x00000001 + +#define WPS_OP_START 0x01 +#define WPS_OP_ACK 0x02 +#define WPS_OP_NACK 0x03 +#define WPS_OP_MSG 0x04 +#define WPS_OP_DONE 0x05 + +#define WPS_FLAG_MF 0x01 /* more fragments */ +#define WPS_FLAG_LF 0x02 /* length field in use */ + +#define WPS_MAX_MSG_LEN UINT16_MAX /* max frag len, my limit */ + +#define PACKED __attribute__((packed)) + +struct wps_eap_hdr +{ + u_int8_t code; + u_int8_t identifier; + u_int16_t length; + u_int8_t type; + u_int8_t vendor_id[3]; + u_int32_t vendor_type; + u_int8_t op_code; + u_int8_t flags; + u_int16_t msg_length; + // u_int8_t msg[1]; /* data follows */ +} PACKED; + +#define WPS_EAP_HDR_LEN( _whdr ) ( ( _whdr->flags & WPS_FLAG_LF ) ? sizeof( struct wps_eap_hdr ) : sizeof( struct wps_eap_hdr ) - sizeof( u_int16_t ) ) + +// Messages elements + +#define BUF_SIZE_64_BITS 8 +#define BUF_SIZE_128_BITS 16 +#define BUF_SIZE_160_BITS 20 +#define BUF_SIZE_256_BITS 32 +#define BUF_SIZE_512_BITS 64 +#define BUF_SIZE_1024_BITS 128 +#define BUF_SIZE_1536_BITS 192 + +struct wps_msg_elem_hdr +{ + u_int16_t elem_id; + u_int16_t elem_len; +} PACKED; + +#define WPS_ELEM_SET_HEADER( elem, id, len ) (elem)->hdr.elem_id = htons( id ); (elem)->hdr.elem_len = htons( len ) + +struct wps_dev_type +{ + u_int16_t category; + u_int8_t oui[4]; + u_int16_t sub_category; +} PACKED; + +#define WIFI_DEV_TYPE_OUI_BYTES 0x00, 0x50, 0xf2, 0x04 + +#define DEFINE_WPS_ELEMENT( name, param ) \ +typedef struct { \ + struct wps_msg_elem_hdr hdr; \ + param; \ +} PACKED name + + +#define WPS_VERSION 0x10 +DEFINE_WPS_ELEMENT( wps_elem_ap_channel_t, u_int16_t channel ); +DEFINE_WPS_ELEMENT( wps_elem_assoc_state_t, u_int16_t assoc_state ); +DEFINE_WPS_ELEMENT( wps_elem_auth_type_t, u_int16_t auth_type ); +DEFINE_WPS_ELEMENT( wps_elem_auth_type_flags_t, u_int16_t auth_flags ); +#define AUTHENTICATOR_MSG_SIZE ( sizeof( struct wps_msg_elem_hdr ) + 8 ) +DEFINE_WPS_ELEMENT( wps_elem_authenticator_t, u_int8_t authenticator[8] ); +DEFINE_WPS_ELEMENT( wps_elem_config_methods_t, u_int16_t config_methods ); +DEFINE_WPS_ELEMENT( wps_elem_config_error_t, u_int16_t error ); +DEFINE_WPS_ELEMENT( wps_elem_confirm_url4_t, u_int16_t url4[1] ); // <= 64B +DEFINE_WPS_ELEMENT( wps_elem_confirm_url6_t, u_int16_t url6[1] ); // <= 76B +DEFINE_WPS_ELEMENT( wps_elem_conn_type_t, u_int8_t conn_type ); +DEFINE_WPS_ELEMENT( wps_elem_conn_type_flags_t, u_int8_t conn_type_flags ); +DEFINE_WPS_ELEMENT( wps_elem_credential_t, u_int8_t cred[1] ); // <= ??? +DEFINE_WPS_ELEMENT( wps_elem_dev_name_t, u_int8_t dev_name[1] ); // <= 32B +DEFINE_WPS_ELEMENT( wps_elem_dev_pw_id_t, u_int16_t dev_pw_id ); +DEFINE_WPS_ELEMENT( wps_elem_e_hash1_t, u_int8_t e_hash1[BUF_SIZE_256_BITS] ); +DEFINE_WPS_ELEMENT( wps_elem_e_hash2_t, u_int8_t e_hash2[BUF_SIZE_256_BITS] ); +DEFINE_WPS_ELEMENT( wps_elem_e_snonce1_t, u_int8_t e_snonce1[BUF_SIZE_128_BITS] ); +DEFINE_WPS_ELEMENT( wps_elem_e_snonce2_t, u_int8_t e_snonce2[BUF_SIZE_128_BITS] ); +DEFINE_WPS_ELEMENT( wps_elem_ecrypt_settings_t, u_int8_t settings[1] ); // no limit defined +DEFINE_WPS_ELEMENT( wps_elem_encrypt_type_t, u_int16_t encrypt_type ); +DEFINE_WPS_ELEMENT( wps_elem_encrypt_type_flags_t, u_int16_t encrypt_type_flags ); +DEFINE_WPS_ELEMENT( wps_elem_enrl_nonce_t, u_int8_t nonce[BUF_SIZE_128_BITS] ); +DEFINE_WPS_ELEMENT( wps_elem_feature_id_t, u_int32_t feature_id ); +DEFINE_WPS_ELEMENT( wps_elem_identity_t, u_int8_t identity[1] ); // <= 80 +// identity proof? +DEFINE_WPS_ELEMENT( wps_elem_iv_t, u_int8_t iv[BUF_SIZE_256_BITS] ); +DEFINE_WPS_ELEMENT( wps_elem_key_wrap_authenticator_t, u_int8_t key_wrap_authenticator[8] ); +DEFINE_WPS_ELEMENT( wps_elem_key_id_t, u_int8_t key_id[16] ); +DEFINE_WPS_ELEMENT( wps_elem_mac_addr_t, u_int8_t mac[ETHER_ADDR_LEN] ); +DEFINE_WPS_ELEMENT( wps_elem_manufacturer_t, u_int8_t manufacturer[1] ); // <= 64 +DEFINE_WPS_ELEMENT( wps_elem_msg_type_t, u_int8_t msg_type ); +DEFINE_WPS_ELEMENT( wps_elem_model_name_t, u_int8_t model_name[1] ); // <= 32B +DEFINE_WPS_ELEMENT( wps_elem_model_number_t, u_int8_t model_number[1] ); // <= 32B +DEFINE_WPS_ELEMENT( wps_elem_network_index_t, u_int8_t network_index ); +DEFINE_WPS_ELEMENT( wps_elem_network_key_t, u_int8_t network_key[1] ); // <= 64B +DEFINE_WPS_ELEMENT( wps_elem_network_key_index_t, u_int8_t network_key_index ); +DEFINE_WPS_ELEMENT( wps_elem_new_dev_name_t, u_int8_t new_dev_name[1] ); // <= 32B +DEFINE_WPS_ELEMENT( wps_elem_new_pw_t, u_int8_t new_pw[1] ); // <= 64 +// oob device password? +DEFINE_WPS_ELEMENT( wps_elem_os_version_t, u_int32_t os_version ); +DEFINE_WPS_ELEMENT( wps_elem_power_level_t, u_int8_t power_level ); +DEFINE_WPS_ELEMENT( wps_elem_psk_current_t, u_int8_t psk_current ); +DEFINE_WPS_ELEMENT( wps_elem_psk_max_t, u_int8_t psk_max ); +DEFINE_WPS_ELEMENT( wps_elem_public_key_t, u_int8_t key[BUF_SIZE_1536_BITS] ); +DEFINE_WPS_ELEMENT( wps_elem_radio_enabled_t, u_int8_t radio_enabled ); // bool? +DEFINE_WPS_ELEMENT( wps_elem_reboot_t, u_int8_t reboot ); // bool? +DEFINE_WPS_ELEMENT( wps_elem_reg_current_t, u_int8_t reg_current ); +DEFINE_WPS_ELEMENT( wps_elem_reg_established_t, u_int8_t reg_established ); // bool? +DEFINE_WPS_ELEMENT( wps_elem_reg_list_t, u_int8_t reg_list[1] ); // <= 512B +DEFINE_WPS_ELEMENT( wps_elem_reg_max_t, u_int8_t reg_max ); +DEFINE_WPS_ELEMENT( wps_elem_reg_nonce_t, u_int8_t nonce[BUF_SIZE_128_BITS] ); +DEFINE_WPS_ELEMENT( wps_elem_req_type_t, u_int8_t req_type ); +DEFINE_WPS_ELEMENT( wps_elem_resp_type_t, u_int8_t resp_type ); +DEFINE_WPS_ELEMENT( wps_elem_rf_band_t, u_int8_t rf_band ); +DEFINE_WPS_ELEMENT( wps_elem_r_hash1, u_int8_t r_hash1[BUF_SIZE_256_BITS] ); +DEFINE_WPS_ELEMENT( wps_elem_r_hash2, u_int8_t r_hash2[BUF_SIZE_256_BITS] ); +DEFINE_WPS_ELEMENT( wps_elem_r_snonce1, u_int8_t r_snonce1[BUF_SIZE_128_BITS] ); +DEFINE_WPS_ELEMENT( wps_elem_r_snonce2, u_int8_t r_snonce2[BUF_SIZE_128_BITS] ); +DEFINE_WPS_ELEMENT( wps_elem_selected_reg_t, u_int8_t selected_reg ); // bool? +DEFINE_WPS_ELEMENT( wps_elem_serial_number_t, u_int8_t serial_number[1] ); // <= 32B +DEFINE_WPS_ELEMENT( wps_elem_simple_config_state_t, u_int8_t simple_config_state ); +DEFINE_WPS_ELEMENT( wps_elem_ssid_t, u_int8_t ssid[32] ); +DEFINE_WPS_ELEMENT( wps_elem_total_networks_t, u_int8_t total_networks ); +DEFINE_WPS_ELEMENT( wps_elem_uuid_e_t, u_int8_t uuid_e[16] ); +DEFINE_WPS_ELEMENT( wps_elem_uuid_r_t, u_int8_t uuid_r[16] ); +DEFINE_WPS_ELEMENT( wps_elem_vendor_ext_t, u_int8_t vendor_ext[1] ); // <= 1024 +DEFINE_WPS_ELEMENT( wps_elem_version_t, u_int8_t version ); // int? +DEFINE_WPS_ELEMENT( wps_elem_x_509_cert_req_t, u_int8_t cert_req[1] ); // limit? +DEFINE_WPS_ELEMENT( wps_elem_x_509_cert_t, u_int8_t cert[1] ); // limit? +DEFINE_WPS_ELEMENT( wps_elem_eap_id_t, u_int8_t eap_id[1] ); // <= 64 +DEFINE_WPS_ELEMENT( wps_elem_msg_counter_t, u_int8_t msg_counter[8] ); +DEFINE_WPS_ELEMENT( wps_elem_public_key_hash_t, u_int8_t public_key_hash[BUF_SIZE_160_BITS] ); +DEFINE_WPS_ELEMENT( wps_elem_rekey_key_t, u_int8_t rekey_key[32] ); +DEFINE_WPS_ELEMENT( wps_elem_key_lifetime_t, u_int32_t key_lifetime ); +DEFINE_WPS_ELEMENT( wps_elem_permitted_config_methods_t, u_int16_t permitted_config_methods ); +DEFINE_WPS_ELEMENT( wps_elem_sel_reg_config_methods_t, u_int8_t sel_reg_config_methods ); +DEFINE_WPS_ELEMENT( wps_elem_primary_dev_type_t, struct wps_dev_type prime_dev_type ); +DEFINE_WPS_ELEMENT( wps_elem_secondary_dev_type_list_t, u_int8_t secondary_dev_type_list[1] ); // <= 128B +DEFINE_WPS_ELEMENT( wps_elem_portable_dev_t, u_int8_t portable_dev ); // bool? +DEFINE_WPS_ELEMENT( wps_elem_ap_setup_locked_t, u_int8_t ap_setup_locked ); // bool? +DEFINE_WPS_ELEMENT( wps_elem_app_list_t, u_int8_t app_list[1] ); // <= 512B +DEFINE_WPS_ELEMENT( wps_elem_eap_type_t, u_int8_t eap_type[1] ); // <= 8B + +#define WPS_NEXT_ELEMENT( cast, cur_elm, len ) (cast)( (UInt8 *)(cur_elm) + sizeof( struct wps_msg_elem_hdr ) + ntohs( cur_elm->hdr.elem_len ) ); \ +len+=( sizeof( struct wps_msg_elem_hdr ) + ntohs( cur_elm->hdr.elem_len ) ) +#define WPS_NEXT_ELEMENT_IE( cast, cur_elm, len ) (cast)( (UInt8 *)(cur_elm) + sizeof( struct wps_msg_elem_hdr ) + ntohs( cur_elm->hdr.elem_len ) ); \ +len-=( sizeof( struct wps_msg_elem_hdr ) + ntohs( cur_elm->hdr.elem_len ) ); +#define WPS_ELEMENT_IS( elem, id ) ( ntohs( elem->hdr.elem_id ) == id ) +#define WPS_ELEMENT_LEN_VAR( elem ) ( sizeof( struct wps_msg_elem_hdr ) + ntohs( elem->hdr.elem_len ) ) +#define WPS_ELEMENT_LEN_FIXED( fixed ) ( sizeof( struct wps_msg_elem_hdr ) + sizeof( fixed ) ) +#define WPS_ELEMENT_PARAM_LEN( elem ) ( ntohs( elem->hdr.elem_len ) ) + +// Messages +#define WPS_MBUF_GET_MSG_PTR( m, type ) (type *)( (UInt8 *)mbuf_data( m ) + sizeof( struct ether_header ) + sizeof( struct wps_eap_hdr ) ) + +struct wps_msg_nack +{ + wps_elem_version_t version; + wps_elem_msg_type_t msg_type; + wps_elem_enrl_nonce_t enrl_nonce; + wps_elem_reg_nonce_t reg_nonce; + wps_elem_config_error_t error; +}PACKED; + +struct wps_msg_ack +{ + wps_elem_version_t version; + wps_elem_msg_type_t msg_type; + wps_elem_enrl_nonce_t enrl_nonce; + wps_elem_reg_nonce_t reg_nonce; +}PACKED; + +struct wps_msg_done +{ + wps_elem_version_t version; + wps_elem_msg_type_t msg_type; +}; + +// From RFC 3748 section 4.1 for identity +struct wps_identity_msg +{ + u_int8_t code; + u_int8_t id; + u_int16_t length; + u_int8_t type; + // u_int8_t type_data[1]; /* data follows */ +} PACKED; + +#define WPS_EAP_TYPE_IDENTITY 1 + +// Data Element Definitions +#define WPS_ID_AP_CHANNEL 0x1001 +#define WPS_ID_ASSOC_STATE 0x1002 +#define WPS_ID_AUTH_TYPE 0x1003 +#define WPS_ID_AUTH_TYPE_FLAGS 0x1004 +#define WPS_ID_AUTHENTICATOR 0x1005 +#define WPS_ID_CONFIG_METHODS 0x1008 +#define WPS_ID_CONFIG_ERROR 0x1009 +#define WPS_ID_CONF_URL4 0x100A +#define WPS_ID_CONF_URL6 0x100B +#define WPS_ID_CONN_TYPE 0x100C +#define WPS_ID_CONN_TYPE_FLAGS 0x100D +#define WPS_ID_CREDENTIAL 0x100E +#define WPS_ID_DEVICE_NAME 0x1011 +#define WPS_ID_DEVICE_PWD_ID 0x1012 +#define WPS_ID_E_HASH1 0x1014 +#define WPS_ID_E_HASH2 0x1015 +#define WPS_ID_E_SNONCE1 0x1016 +#define WPS_ID_E_SNONCE2 0x1017 +#define WPS_ID_ENCR_SETTINGS 0x1018 +#define WPS_ID_ENCR_TYPE 0x100F +#define WPS_ID_ENCR_TYPE_FLAGS 0x1010 +#define WPS_ID_ENROLLEE_NONCE 0x101A +#define WPS_ID_FEATURE_ID 0x101B +#define WPS_ID_IDENTITY 0x101C +#define WPS_ID_IDENTITY_PROOF 0x101D +#define WPS_ID_INIT_VECTOR 0x104B //this becomes 0x1060 later +//#define WPS_ID_KEY_WRAP_AUTH WPS_ID_AUTHENTICATOR //this becomes 0x101E later +#define WPS_ID_KEY_WRAP_AUTH 0x101E // HH changed for MS beta 2 testing +#define WPS_ID_KEY_IDENTIFIER 0x101F +#define WPS_ID_MAC_ADDR 0x1020 +#define WPS_ID_MANUFACTURER 0x1021 +#define WPS_ID_MSG_TYPE 0x1022 +#define WPS_ID_MODEL_NAME 0x1023 +#define WPS_ID_MODEL_NUMBER 0x1024 +#define WPS_ID_NW_INDEX 0x1026 +#define WPS_ID_NW_KEY 0x1027 +#define WPS_ID_NW_KEY_INDEX 0x1028 +#define WPS_ID_NEW_DEVICE_NAME 0x1029 +#define WPS_ID_NEW_PWD 0x102A +#define WPS_ID_OOB_DEV_PWD 0x102C +#define WPS_ID_OS_VERSION 0x102D +#define WPS_ID_POWER_LEVEL 0x102F +#define WPS_ID_PSK_CURRENT 0x1030 +#define WPS_ID_PSK_MAX 0x1031 +#define WPS_ID_PUBLIC_KEY 0x1032 +#define WPS_ID_RADIO_ENABLED 0x1033 +#define WPS_ID_REBOOT 0x1034 +#define WPS_ID_REGISTRAR_CURRENT 0x1035 +#define WPS_ID_REGISTRAR_ESTBLSHD 0x1036 +#define WPS_ID_REGISTRAR_LIST 0x1037 +#define WPS_ID_REGISTRAR_MAX 0x1038 +#define WPS_ID_REGISTRAR_NONCE 0x1039 +#define WPS_ID_REQ_TYPE 0x103A +#define WPS_ID_RESP_TYPE 0x103B +#define WPS_ID_RF_BAND 0x103C +#define WPS_ID_R_HASH1 0x103D +#define WPS_ID_R_HASH2 0x103E +#define WPS_ID_R_SNONCE1 0x103F +#define WPS_ID_R_SNONCE2 0x1040 +#define WPS_ID_SEL_REGISTRAR 0x1041 +#define WPS_ID_SERIAL_NUM 0x1042 +#define WPS_ID_SC_STATE 0x1044 +#define WPS_ID_SSID 0x1045 +#define WPS_ID_TOT_NETWORKS 0x1046 +#define WPS_ID_UUID_E 0x1047 +#define WPS_ID_UUID_R 0x1048 +#define WPS_ID_VENDOR_EXT 0x1049 +#define WPS_ID_VERSION 0x104A +#define WPS_ID_X509_CERT_REQ 0x104B +#define WPS_ID_X509_CERT 0x104C +#define WPS_ID_EAP_IDENTITY 0x104D +#define WPS_ID_MSG_COUNTER 0x104E +#define WPS_ID_PUBKEY_HASH 0x104F +#define WPS_ID_REKEY_KEY 0x1050 +#define WPS_ID_KEY_LIFETIME 0x1051 +#define WPS_ID_PERM_CFG_METHODS 0x1052 +#define WPS_ID_SEL_REG_CFG_METHODS_ORIGINAL 0x0153 // This was the original val in the spec, we must support both +#define WPS_ID_SEL_REG_CFG_METHODS 0x1053 +#define WPS_ID_PRIM_DEV_TYPE 0x1054 +#define WPS_ID_SEC_DEV_TYPE_LIST 0x1055 +#define WPS_ID_PORTABLE_DEVICE 0x1056 +#define WPS_ID_AP_SETUP_LOCKED 0x1057 +#define WPS_ID_APP_LIST 0x1058 +#define WPS_ID_EAP_TYPE 0x1059 + +// Association states +#define WPS_ASSOC_NOT_ASSOCIATED 0 +#define WPS_ASSOC_CONN_SUCCESS 1 +#define WPS_ASSOC_CONFIG_FAIL 2 +#define WPS_ASSOC_ASSOC_FAIL 3 +#define WPS_ASSOC_IP_FAIL 4 + +// Authentication types +#define WPS_AUTHTYPE_OPEN 0x0001 +#define WPS_AUTHTYPE_WPAPSK 0x0002 +#define WPS_AUTHTYPE_SHARED 0x0004 +#define WPS_AUTHTYPE_WPA 0x0008 +#define WPS_AUTHTYPE_WPA2 0x0010 +#define WPS_AUTHTYPE_WPA2PSK 0x0020 + +// Config methods +#define WPS_CONFMET_USBA 0x0001 +#define WPS_CONFMET_ETHERNET 0x0002 +#define WPS_CONFMET_LABEL 0x0004 +#define WPS_CONFMET_DISPLAY 0x0008 +#define WPS_CONFMET_EXT_NFC_TOK 0x0010 +#define WPS_CONFMET_INT_NFC_TOK 0x0020 +#define WPS_CONFMET_NFC_INTF 0x0040 +#define WPS_CONFMET_PBC 0x0080 +#define WPS_CONFMET_KEYPAD 0x0100 + +// WPS error messages +#define WPS_ERROR_NO_ERROR 0 +#define WPS_ERROR_OOB_INT_READ_ERR 1 +#define WPS_ERROR_DECRYPT_CRC_FAIL 2 +#define WPS_ERROR_CHAN24_NOT_SUPP 3 +#define WPS_ERROR_CHAN50_NOT_SUPP 4 +#define WPS_ERROR_SIGNAL_WEAK 5 +#define WPS_ERROR_NW_AUTH_FAIL 6 +#define WPS_ERROR_NW_ASSOC_FAIL 7 +#define WPS_ERROR_NO_DHCP_RESP 8 +#define WPS_ERROR_FAILED_DHCP_CONF 9 +#define WPS_ERROR_IP_ADDR_CONFLICT 10 +#define WPS_ERROR_FAIL_CONN_REGISTRAR 11 +#define WPS_ERROR_MULTI_PBC_DETECTED 12 +#define WPS_ERROR_ROGUE_SUSPECTED 13 +#define WPS_ERROR_DEVICE_BUSY 14 +#define WPS_ERROR_SETUP_LOCKED 15 +#define WPS_ERROR_MSG_TIMEOUT 16 +#define WPS_ERROR_REG_SESSION_TIMEOUT 17 +#define WPS_ERROR_DEV_PWD_AUTH_FAIL 18 + +#define WPS_ERROR_MAX WPS_ERROR_DEV_PWD_AUTH_FAIL + +// Connection types +#define WPS_CONNTYPE_ESS 0x01 +#define WPS_CONNTYPE_IBSS 0x02 + +// Device password ID +#define WPS_DEVICEPWDID_DEFAULT 0x0000 +#define WPS_DEVICEPWDID_USER_SPEC 0x0001 +#define WPS_DEVICEPWDID_MACHINE_SPEC 0x0002 +#define WPS_DEVICEPWDID_REKEY 0x0003 +#define WPS_DEVICEPWDID_PUSH_BTN 0x0004 +#define WPS_DEVICEPWDID_REG_SPEC 0x0005 + +/* + // Device type + #define WPS_DEVICETYPE_COMPUTER "Computer" + #define WPS_DEVICETYPE_AP "Access_Point" + #define WPS_DEVICETYPE_ROUTER_AP "Router_AP" + #define WPS_DEVICETYPE_PRINTER "Printer" + #define WPS_DEVICETYPE_PRINTER_BRIDGE "Printer_Brigde" + #define WPS_DEVICETYPE_ELECT_PIC_FRAME "Electronic_Picture_Frame" + #define WPS_DEVICETYPE_DIG_AUDIO_RECV "Digital_Audio_Receiver" + #define WPS_DEVICETYPE_WIN_MCE "Windows_Media_Center_Extender" + #define WPS_DEVICETYPE_WIN_MOBILE "Windows_Mobile" + #define WPS_DEVICETYPE_PVR "Personal_Video_Recorder" + #define WPS_DEVICETYPE_VIDEO_STB "Video_STB" + #define WPS_DEVICETYPE_PROJECTOR "Projector" + #define WPS_DEVICETYPE_IP_TV "IP_TV" + #define WPS_DEVICETYPE_DIG_STILL_CAM "Digital_Still_Camera" + #define WPS_DEVICETYPE_PHONE "Phone" + #define WPS_DEVICETYPE_VOID_PHONE "VoIP_Phone" + #define WPS_DEVICETYPE_GAME_CONSOLE "Game_console" + #define WPS_DEVICETYPE_OTHER "Other" + */ + +// Encryption type +#define WPS_ENCRTYPE_NONE 0x0001 +#define WPS_ENCRTYPE_WEP 0x0002 +#define WPS_ENCRTYPE_TKIP 0x0004 +#define WPS_ENCRTYPE_AES 0x0008 + + +// WPS Message Types +#define WPS_ID_BEACON 0x01 +#define WPS_ID_PROBE_REQ 0x02 +#define WPS_ID_PROBE_RESP 0x03 +#define WPS_ID_MESSAGE_M1 0x04 +#define WPS_ID_MESSAGE_M2 0x05 +#define WPS_ID_MESSAGE_M2D 0x06 +#define WPS_ID_MESSAGE_M3 0x07 +#define WPS_ID_MESSAGE_M4 0x08 +#define WPS_ID_MESSAGE_M5 0x09 +#define WPS_ID_MESSAGE_M6 0x0A +#define WPS_ID_MESSAGE_M7 0x0B +#define WPS_ID_MESSAGE_M8 0x0C +#define WPS_ID_MESSAGE_ACK 0x0D +#define WPS_ID_MESSAGE_NACK 0x0E +#define WPS_ID_MESSAGE_DONE 0x0F + +//Device Type categories for primary and secondary device types +#define WPS_DEVICE_TYPE_CAT_COMPUTER 1 +#define WPS_DEVICE_TYPE_CAT_INPUT_DEVICE 2 +#define WPS_DEVICE_TYPE_CAT_PRINTER 3 +#define WPS_DEVICE_TYPE_CAT_CAMERA 4 +#define WPS_DEVICE_TYPE_CAT_STORAGE 5 +#define WPS_DEVICE_TYPE_CAT_NW_INFRA 6 +#define WPS_DEVICE_TYPE_CAT_DISPLAYS 7 +#define WPS_DEVICE_TYPE_CAT_MM_DEVICES 8 +#define WPS_DEVICE_TYPE_CAT_GAME_DEVICES 9 +#define WPS_DEVICE_TYPE_CAT_TELEPHONE 10 + +//Device Type sub categories for primary and secondary device types +#define WPS_DEVICE_TYPE_SUB_CAT_COMP_PC 1 +#define WPS_DEVICE_TYPE_SUB_CAT_COMP_SERVER 2 +#define WPS_DEVICE_TYPE_SUB_CAT_COMP_MEDIA_CTR 3 +#define WPS_DEVICE_TYPE_SUB_CAT_PRTR_PRINTER 1 +#define WPS_DEVICE_TYPE_SUB_CAT_PRTR_SCANNER 2 +#define WPS_DEVICE_TYPE_SUB_CAT_CAM_DGTL_STILL 1 +#define WPS_DEVICE_TYPE_SUB_CAT_STOR_NAS 1 +#define WPS_DEVICE_TYPE_SUB_CAT_NW_AP 1 +#define WPS_DEVICE_TYPE_SUB_CAT_NW_ROUTER 2 +#define WPS_DEVICE_TYPE_SUB_CAT_NW_SWITCH 3 +#define WPS_DEVICE_TYPE_SUB_CAT_DISP_TV 1 +#define WPS_DEVICE_TYPE_SUB_CAT_DISP_PIC_FRAME 2 +#define WPS_DEVICE_TYPE_SUB_CAT_DISP_PROJECTOR 3 +#define WPS_DEVICE_TYPE_SUB_CAT_MM_DAR 1 +#define WPS_DEVICE_TYPE_SUB_CAT_MM_PVR 2 +#define WPS_DEVICE_TYPE_SUB_CAT_MM_MCX 3 +#define WPS_DEVICE_TYPE_SUB_CAT_GAM_XBOX 1 +#define WPS_DEVICE_TYPE_SUB_CAT_GAM_XBOX_360 2 +#define WPS_DEVICE_TYPE_SUB_CAT_GAM_PS 3 +#define WPS_DEVICE_TYPE_SUB_CAT_PHONE_WM 1 + +// Device request/response type +#define WPS_MSGTYPE_ENROLLEE_INFO_ONLY 0x00 +#define WPS_MSGTYPE_ENROLLEE_OPEN_8021X 0x01 +#define WPS_MSGTYPE_REGISTRAR 0x02 +#define WPS_MSGTYPE_AP_WLAN_MGR 0x03 + +// RF Band +#define WPS_RFBAND_24GHZ 0x01 +#define WPS_RFBAND_50GHZ 0x02 + +// Simple Config state +#define WPS_SCSTATE_UNCONFIGURED 0x01 +#define WPS_SCSTATE_CONFIGURED 0x02 + +// State business +#define WPS_RETRY_INTERVAL 5 /* seconds */ +#define WPS_PACKET_TIMEOUT 15 /* seconds */ + +#define WPS_TIMEOUT_SECS 1 + +enum WPSSupplicantState +{ + WPS_S_INIT, + WPS_S_EAPOL_START_TX, + WPS_S_EAPOL_START_RX, + WPS_S_IDENT_REQ_TX, + WPS_S_IDENT_REQ_RX, + WPS_S_IDENT_RESP_TX, + WPS_S_IDENT_RESP_RX, + WPS_S_START_TX, + WPS_S_START_RX, + WPS_S_M1_TX, + WPS_S_M1_RX, + WPS_S_M2_TX, + WPS_S_M2_RX, + WPS_S_M3_TX, + WPS_S_M3_RX, + WPS_S_M4_TX, + WPS_S_M4_RX, + WPS_S_M5_TX, + WPS_S_M5_RX, + WPS_S_M6_TX, + WPS_S_M6_RX, + WPS_S_M7_TX, + WPS_S_M7_RX, + WPS_S_M8_TX, + WPS_S_M8_RX, + WPS_S_DONE_TX, + WPS_S_DONE_RX, + WPS_S_FAIL_TX, + WPS_S_FAIL_RX, + WPS_S_MSG_TIMEOUT, + WPS_S_SESSION_TIMEOUT, +}; +typedef enum WPSSupplicantState WPSSupplicantState; + +// Apple specific error codes + +#define WPSE_NOERR 0 // no error +#define WPSE_ERR -1 // general error code +#define WPSE_PROTO_ERR -2 // Problem with EAPOL handshake +#define WPSE_IE_NOT_PRESENT -3 // No WPS IE present in IE list for ssid +#define WPSE_IE_MALFORMED -4 // WPS IS missing required (for Apple) fields +#define WPSE_SCAN_ERR -5 // Scan failed +#define WPSE_NO_PIN_AT_REG -6 // No PIN configured at registrar +#define WPSE_NO_PIN_AT_CLIENT -7 // No PIN configured at client +#define WPSE_SSID_NOT_FOUND -8 // Scan did not find SSID +#define WPSE_UNSUPPORTED_PW_ID -9 // Registrar reports that it is using an unsupported PW ID +#define WPSE_ASSOC_FAILED -10 // Association attempt failed +#define WPSE_API_REQ -11 // An apple80211 ioctl request failed +#define WPSE_NOMEM -12 // memory error +#define WPSE_WPA_RSN_NOT_SUP -13 // WPA/RSN not supported +#define WPSE_TIMEOUT -14 // EAPOL timed out +#define WPSE_NACKED -15 // NACKED by registrar +#define WPSE_FAIL -16 // unexpected EAP-FAIL received + +#endif /* _APPLE80211_WPS_H_ */ diff --git a/QualcommWireless/include/IOKit/80211/apple_private_spi.h b/QualcommWireless/include/IOKit/80211/apple_private_spi.h new file mode 100644 index 0000000..a644de6 --- /dev/null +++ b/QualcommWireless/include/IOKit/80211/apple_private_spi.h @@ -0,0 +1,74 @@ +/* +* Copyright (c) 1998-2016 Apple Inc. All rights reserved. +* +* @APPLE_OSREFERENCE_LICENSE_HEADER_START@ +* +* This file contains Original Code and/or Modifications of Original Code +* as defined in and that are subject to the Apple Public Source License +* Version 2.0 (the 'License'). You may not use this file except in +* compliance with the License. The rights granted to you under the License +* may not be used to create, or enable the creation or redistribution of, +* unlawful or unlicensed copies of an Apple operating system, or to +* circumvent, violate, or enable the circumvention or violation of, any +* terms of an Apple operating system software license agreement. +* +* Please obtain a copy of the License at +* http://www.opensource.apple.com/apsl/ and read it before using this file. +* +* The Original Code and all software distributed under the License are +* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER +* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, +* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. +* Please see the License for the specific language governing rights and +* limitations under the License. +* +* @APPLE_OSREFERENCE_LICENSE_HEADER_END@ +*/ + +#ifndef apple_private_spi_h +#define apple_private_spi_h + +#ifndef __PRIVATE_SPI__ + +/*! @enum IOMbufServiceClass + @discussion Service class of a mbuf packet. + @constant kIOMbufServiceClassBKSYS Background System-Initiated. + @constant kIOMbufServiceClassBK Background. + @constant kIOMbufServiceClassBE Best Effort. + @constant kIOMbufServiceClassRD Responsive Data. + @constant kIOMbufServiceClassOAM Operations, Administration, and Management. + @constant kIOMbufServiceClassAV Multimedia Audio/Video Streaming. + @constant kIOMbufServiceClassRV Responsive Multimedia Audio/Video. + @constant kIOMbufServiceClassVI Interactive Video. + @constant kIOMbufServiceClassVO Interactive Voice. + @constant kIOMbufServiceClassCTL Network Control. +*/ +enum IOMbufServiceClass { + kIOMbufServiceClassBKSYS = 100, + kIOMbufServiceClassBK = 200, + kIOMbufServiceClassBE = 0, + kIOMbufServiceClassRD = 300, + kIOMbufServiceClassOAM = 400, + kIOMbufServiceClassAV = 500, + kIOMbufServiceClassRV = 600, + kIOMbufServiceClassVI = 700, + kIOMbufServiceClassVO = 800, + kIOMbufServiceClassCTL = 900 +}; + +#endif + +struct packet_info_tag { + +}; + +struct apple80211_debug_command { + +}; + +struct ifnet_init_eparams { + +}; + +#endif /* apple_private_spi_h */ diff --git a/QualcommWireless/include/IOKit/80211/debug.h b/QualcommWireless/include/IOKit/80211/debug.h new file mode 100644 index 0000000..8093704 --- /dev/null +++ b/QualcommWireless/include/IOKit/80211/debug.h @@ -0,0 +1,283 @@ +// +// debug.h +// Black80211_HighSierra +// +// Created by Roman Peshkov on 05/07/2018. +// Copyright © 2018 Roman Peshkov. All rights reserved. +// + +#ifndef debug_h +#define debug_h + +static const char* IOCTL_NAMES[] = { + "UNKNOWN", + "SSID", + "AUTH_TYPE", + "CIPHER_KEY", + "CHANNEL", + "POWERSAVE", + "PROTMODE", + "TXPOWER", + "RATE", + "BSSID", + "SCAN_REQ", + "SCAN_RESULT", + "CARD_CAPABILITIES", + "STATE", + "PHY_MODE", + "OP_MODE", + "RSSI", + "NOISE", + "INT_MIT", + "POWER", + "ASSOCIATE", + "ASSOCIATE_RESULT", + "DISASSOCIATE", + "STATUS_DEV_NAME", + "IBSS_MODE", + "HOST_AP_MODE", + "AP_MODE", + "SUPPORTED_CHANNELS", + "LOCALE", + "DEAUTH", + "COUNTERMEASURES", + "FRAG_THRESHOLD", + "RATE_SET", + "SHORT_SLOT", + "MULTICAST_RATE", + "SHORT_RETRY_LIMIT", + "LONG_RETRY_LIMIT", + "TX_ANTENNA", + "RX_ANTENNA", + "ANTENNA_DIVERSITY", + "ROM", + "DTIM_INT", + "STATION_LIST", + "DRIVER_VERSION", + "HARDWARE_VERSION", + "RAND", + "RSN_IE", + "BACKGROUND_SCAN", + "AP_IE_LIST", + "STATS", + "ASSOCIATION_STATUS", + "COUNTRY_CODE", + "DEBUG_FLAGS", + "LAST_RX_PKT_DATA", + "RADIO_INFO", + "GUARD_INTERVAL", + "MIMO_POWERSAVE", + "MCS", + "RIFS", + "LDPC", + "MSDU", + "MPDU", + "BLOCK_ACK", + "PLS", + "PSMP", + "PHY_SUB_MODE", + "MCS_INDEX_SET", + "CACHE_THRESH_BCAST", + "CACHE_THRESH_DIRECT", + "WOW_PARAMETERS", + "WOW_ENABLED", + "40MHZ_INTOLERANT", + "PID_LOCK", + "STA_IE_LIST", + "STA_AUTHORIZE", + "STA_DISASSOCIATE", + "STA_DEAUTH", + "RSN_CONF", + "KEY_RSC", + "STA_STATS", + "ROAM_THRESH", + "VENDOR_DBG_FLAGS", + "CACHE_AGE_THRESH", + "PMK_CACHE", + "LINK_QUAL_EVENT_PARAMS", + "IE", + "SCAN_REQ_MULTIPLE", + "BTCOEX_MODE", + "WOW_TEST", + "CLEAR_PMK_CACHE", + "SCANCACHE_CLEAR", + "P2P_ENABLE", + "P2P_LISTEN", + "P2P_SCAN", + "VIRTUAL_IF_CREATE", + "VIRTUAL_IF_DELETE", + "VIRTUAL_IF_ROLE", + "VIRTUAL_IF_PARENT", + "P2P_GO_CONF", + "P2P_NOA_LIST", + "P2P_OPP_PS", + "P2P_CT_WINDOW", + "BT_COEX_FLAGS", + "CURRENT_NETWORK", + "BT_POWER", + "AVAILABILITY", + "RSSI_BOUNDS", + "ROAM", + "TX_CHAIN_POWER", + "CDD_MODE", + "LAST_BCAST_SCAN_TIME", + "THERMAL_THROTTLING", + "FACTORY_MODE", + "REASSOCIATE", + "???MISSING???", + "POWER_DEBUG_INFO", + "AWDL_SYNC_PARAMS", + "AWDL_SYNC_ENABLED", + "AWDL_EXTENSION_STATE_MACHINE_PARAMETERS", + "AWDL_SERVICE_PARAMS", + "AWDL_PEER_SERVICE_REQUEST", + "AWDL_ELECTION_ALGORITHM_ENABLED", + "AWDL_ELECTION_ID", + "AWDL_MAX_TREE_DEPTH", + "AWDL_GUARD_TIME", + "AWDL_BSSID", + "AWDL_ELECTION_METRIC", + "AWDL_AVAILABILITY_WINDOW_AP_ALIGNMENT", + "AWDL_SYNC_FRAME_AP_BEACON_ALIGNMENT", + "AWDL_SYNCHRONIZATION_CHANNEL_SEQUENCE", + "PEER_CACHE_MAXIMUM_SIZE", + "AWDL_OUI", + "AWDL_MASTER_CHANNEL", + "AWDL_TOP_MASTER", + "AWDL_SYNC_STATE", + "AWDL_ELECTION_RSSI_THRESHOLDS", + "AWDL_PRESENCE_MODE", + "AWDL_ELECTION_MASTER_COUNTS", + "AWDL_PERIODIC_SYNC_FRAME_PACKET_LIFETIME", + "AWDL_MASTER_MODE_SYNC_FRAME_PERIOD", + "AWDL_NON_ELECTION_MASTER_MODE_SYNC_FRAME_PERIOD", + "AWDL_EXPLICIT_AVAILABILITY_WINDOW_EXTENSION_OPT_OUT", + "AWDL_GET_AWDL_MASTER_DATABASE", + "PEER_CACHE_CONTROL", + "AWDL_BATTERY_LEVEL", + "AWDL_BT_COEX_AW_PROTECTED_PERIOD_LENGTH", + "AWDL_BT_COEX_AGREEMENT", + "AWDL_BT_COEX_AGREEMENT_ENABLED", + "AWDL_STRATEGY", + "AWDL_OOB_REQUEST", + "AWDL_MAX_NO_MASTER_PERIODS", + "AWDL_SYNC_FRAME_TEMPLATE", + "LOG_FLAGS", + "PEER_STATS", + "HT_CAPABILITY", + "AWDL_ELECTION_PARAMS", + "LINK_CHANGED_EVENT_DATA", + "GET_DEBUG_INFO", + "AWDL_DEVICE_CAPABILITIES", + "AWDL_RSSI_MEASUREMENT_REQUEST", + "AWDL_AES_KEY", + "AWDL_SCAN_RESERVED_TIME", + "AWDL_CTL", + "AWDL_SOCIAL_TIME_SLOTS", + "AWDL_PEER_TRAFFIC_REGISTRATION", + "EXTENDED_STATS", + "BEACON_PERIOD", + "AWDL_FORCED_ROAM_CONFIG", + "AWDL_QUIET", + "ACL_POLICY", + "ACL_ADD", + "ACL_REMOVE", + "ACL_FLUSH", + "ACL_LIST", + "CHAIN_ACK", + "DESENSE", + "OFFLOAD_SCANNING", + "OFFLOAD_RSN", + "OFFLOAD_COUNTRY_CODE", + "OFFLOAD_KEEPALIVE_L2", + "OFFLOAD_ARP_NDP", + "VHT_MCS_INDEX_SET", + "DWDS", + "INTERRUPT_STATS", + "INTERRUPT_STATS_RESET", + "TIMER_STATS", + "TIMER_STATS_RESET", + "OFFLOAD_STATS", + "OFFLOAD_STATS_RESET", + "OFFLOAD_BEACONS", + "ROAMING", + "OFFLOAD_ARP", + "OFFLOAD_NDP", + "OFFLOAD_SCAN", + "DESENSE_LEVEL", + "MCS_VHT", + "TX_NSS", + "GAS_REQ", + "GAS_START", + "GAS_SET_PEER", + "GAS_RESULTS", + "AWDL_BTLE_PEER_INDICATION", + "AWDL_BTLE_STATE_PARAMS", + "AWDL_PEER_DATABASE", + "AWDL_BTLE_ENABLE_SYNC_WITH_PARAMS", + "AWDL_SECONDARY_MASTER_CHANNEL", + "PHY_STATS", + "CHANNELS_INFO", + "AWDL_AF_TX_MODE", + "ERROR_STRING", + "ERROR_NO", + "AWDL_PIGGYBACK_SCAN_REQ", + "AWDL_PRIVATE_ELECTION_ID", + "AWDL_MIN_RATE", + "VHT_CAPABILITY", + "BGSCAN_CACHE_RESULTS", + "ROAM_PROFILE", + "AWDL_OPER_MODE", + "RESTORE_DEFAULTS", + "AWDL_ENCRYPTION_KEYS", + "AWDL_ENCRYPTION_TYPE", + "BTCOEX_PROFILES", + "BTCOEX_CONFIG", + "AWDL_STATISTICS", + "AWDL_ENABLE_ROAMING", + "AWDL_OOB_AUTO_REQUEST", + "AWDL_TXCAL_PERIOD", + "CHIP_COUNTER_STATS", + "DBG_GUARD_TIME_PARAMS", + "AWDL_AWDL_ADVERTISERS", + "LEAKY_AP_STATS_MODE", + "CAPTURE", + "LEAKY_AP_STATS", + "AWDL_BLOCK_SET_COMMANDS", + "LEAKY_AP_AWD_MODE", + "BTCOEX_OPTIONS", + "FORCE_SYNC_TO_PEER", + "COUNTRY_CHANNELS", + "PRIVATE_MAC", + "RESET_CHIP", + "CRASH", + "RANGING_ENABLE", + "RANGING_START", + "RANGING_AUTHENTICATE", + "AWDL_PREFERRED_CHANNELS", + "LEAKY_AP_SSID_STATS", + "AWDL_RSDB_CAPS", + "AWDL_DEV_STATS", + "LAST_ASSOC_HISTORY", + "AWDL_COMMON_CHANNEL", + "AWDL_PEERS_INFO", + "TKO_PARAMS", + "TKO_DUMP", + "AWDL_NEARBY_LOG_TRIGGER", + "HW_SUPPORTED_CHANNELS", + "BTCOEX_PROFILE", + "BTCOEX_PROFILE_ACTIVE", + "TRAP_INFO", + "THERMAL_INDEX", + "MAX_NSS_FOR_AP", + "BTCOEX_2G_CHAIN_DISABLE", + "POWER_BUDGET", + "AWDL_DFSP_CONFIG", + "AWDL_DFSP_UCSA_CONFIG", + "SCAN_BACKOFF_REPORT", + "OFFLOAD_TCPKA_ENABLE", + "RANGING_CAPS", + "PER_CORE_RSSI_REPORT", +}; + +#endif /* debug_h */ diff --git a/QualcommWireless/include/IOKit/IOBSD.h b/QualcommWireless/include/IOKit/IOBSD.h new file mode 100644 index 0000000..1359f4b --- /dev/null +++ b/QualcommWireless/include/IOKit/IOBSD.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +#ifndef _IOBSD_H +#define _IOBSD_H + +/* + * bsd-related registry properties + */ + +#define kIOBSDKey "IOBSD" // (BSD subsystem resource) +#define kIOBSDNameKey "BSD Name" // (an OSString) +#define kIOBSDNamesKey "BSD Names" // (an OSDictionary of OSString's, for links) +#define kIOBSDMajorKey "BSD Major" // (an OSNumber) +#define kIOBSDMinorKey "BSD Minor" // (an OSNumber) +#define kIOBSDUnitKey "BSD Unit" // (an OSNumber) + + + +#endif /* !_IOBSD_H */ diff --git a/QualcommWireless/include/IOKit/IOBufferMemoryDescriptor.h b/QualcommWireless/include/IOKit/IOBufferMemoryDescriptor.h new file mode 100644 index 0000000..e95644d --- /dev/null +++ b/QualcommWireless/include/IOKit/IOBufferMemoryDescriptor.h @@ -0,0 +1,314 @@ +/* + * Copyright (c) 1998-2016 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +#ifndef _IOBUFFERMEMORYDESCRIPTOR_H +#define _IOBUFFERMEMORYDESCRIPTOR_H + +#include +#include + +enum { + kIOMemoryPhysicallyContiguous = 0x00000010, + kIOMemoryPageable = 0x00000020, + kIOMemoryPurgeable = 0x00000040, + kIOMemoryHostPhysicallyContiguous = 0x00000080, + kIOMemorySharingTypeMask = 0x000f0000, + kIOMemoryUnshared = 0x00000000, + kIOMemoryKernelUserShared = 0x00010000, + // shared IOMemoryDescriptor options for IOBufferMemoryDescriptor: + kIOBufferDescriptorMemoryFlags = kIOMemoryDirectionMask + | kIOMemoryThreadSafe + | kIOMemoryClearEncrypt + | kIOMemoryMapperNone + | kIOMemoryUseReserve +}; + +#define _IOBUFFERMEMORYDESCRIPTOR_INTASKWITHOPTIONS_ 1 +#define _IOBUFFERMEMORYDESCRIPTOR_HOSTPHYSICALLYCONTIGUOUS_ 1 +#define IOBUFFERMEMORYDESCRIPTOR_SUPPORTS_INTASKWITHOPTIONS_TAGS 1 +/*! + * @class IOBufferMemoryDescriptor + * @abstract Provides a simple memory descriptor that allocates its own buffer memory. + */ + +class IOBufferMemoryDescriptor : public IOGeneralMemoryDescriptor +{ + OSDeclareDefaultStructorsWithDispatch(IOBufferMemoryDescriptor); + +private: +/*! @struct ExpansionData + * @discussion This structure will be used to expand the capablilties of this class in the future. + */ + struct ExpansionData { + IOMemoryMap * map; + }; + +/*! @var reserved + * Reserved for future use. (Internal use only) */ + APPLE_KEXT_WSHADOW_PUSH; + ExpansionData * reserved; + +protected: + void * _buffer; + vm_size_t _capacity; + vm_offset_t _alignment; + IOOptionBits _options; +private: + uintptr_t _internalReserved; + unsigned _internalFlags; + APPLE_KEXT_WSHADOW_POP; + +private: +#ifndef __LP64__ + virtual bool initWithOptions( + IOOptionBits options, + vm_size_t capacity, + vm_offset_t alignment, + task_t inTask) APPLE_KEXT_DEPRECATED; /* use withOptions() instead */ +#endif /* !__LP64__ */ + +public: + virtual bool initWithPhysicalMask( + task_t inTask, + IOOptionBits options, + mach_vm_size_t capacity, + mach_vm_address_t alignment, + mach_vm_address_t physicalMask); + +#ifdef __LP64__ + OSMetaClassDeclareReservedUnused(IOBufferMemoryDescriptor, 0); + OSMetaClassDeclareReservedUnused(IOBufferMemoryDescriptor, 1); +#else /* !__LP64__ */ + OSMetaClassDeclareReservedUsed(IOBufferMemoryDescriptor, 0); + OSMetaClassDeclareReservedUsed(IOBufferMemoryDescriptor, 1); +#endif /* !__LP64__ */ + OSMetaClassDeclareReservedUnused(IOBufferMemoryDescriptor, 2); + OSMetaClassDeclareReservedUnused(IOBufferMemoryDescriptor, 3); + OSMetaClassDeclareReservedUnused(IOBufferMemoryDescriptor, 4); + OSMetaClassDeclareReservedUnused(IOBufferMemoryDescriptor, 5); + OSMetaClassDeclareReservedUnused(IOBufferMemoryDescriptor, 6); + OSMetaClassDeclareReservedUnused(IOBufferMemoryDescriptor, 7); + OSMetaClassDeclareReservedUnused(IOBufferMemoryDescriptor, 8); + OSMetaClassDeclareReservedUnused(IOBufferMemoryDescriptor, 9); + OSMetaClassDeclareReservedUnused(IOBufferMemoryDescriptor, 10); + OSMetaClassDeclareReservedUnused(IOBufferMemoryDescriptor, 11); + OSMetaClassDeclareReservedUnused(IOBufferMemoryDescriptor, 12); + OSMetaClassDeclareReservedUnused(IOBufferMemoryDescriptor, 13); + OSMetaClassDeclareReservedUnused(IOBufferMemoryDescriptor, 14); + OSMetaClassDeclareReservedUnused(IOBufferMemoryDescriptor, 15); + +protected: + virtual void free() APPLE_KEXT_OVERRIDE; + +public: + +/* + * withOptions: + * + * Returns a new IOBufferMemoryDescriptor with a buffer large enough to + * hold capacity bytes. The descriptor's length is initially set to the + * capacity. + */ +#ifndef __LP64__ + virtual bool initWithOptions( IOOptionBits options, + vm_size_t capacity, + vm_offset_t alignment) APPLE_KEXT_DEPRECATED; /* use withOptions() instead */ +#endif /* !__LP64__ */ + + static IOBufferMemoryDescriptor * withCopy( + task_t inTask, + IOOptionBits options, + vm_map_t sourceMap, + mach_vm_address_t source, + mach_vm_size_t size); + + static IOBufferMemoryDescriptor * withOptions( IOOptionBits options, + vm_size_t capacity, + vm_offset_t alignment = 1); + +/*! @function inTaskWithOptions + * @abstract Creates a memory buffer with memory descriptor for that buffer. + * @discussion Added in Mac OS X 10.2, this method allocates a memory buffer with a given size and alignment in the task's address space specified, and returns a memory descriptor instance representing the memory. It is recommended that memory allocated for I/O or sharing via mapping be created via IOBufferMemoryDescriptor. Options passed with the request specify the kind of memory to be allocated - pageablity and sharing are specified with option bits. This function may block and so should not be called from interrupt level or while a simple lock is held. + * @param inTask The task the buffer will be allocated in. + * @param options Options for the allocation:
+ * kIODirectionOut, kIODirectionIn - set the direction of the I/O transfer.
+ * kIOMemoryPhysicallyContiguous - pass to request memory be physically contiguous. This option is heavily discouraged. The request may fail if memory is fragmented, may cause large amounts of paging activity, and may take a very long time to execute.
+ * kIOMemoryPageable - pass to request memory be non-wired - the default for kernel allocated memory is wired.
+ * kIOMemoryPurgeable - pass to request memory that may later have its purgeable state set with IOMemoryDescriptor::setPurgeable. Only supported for kIOMemoryPageable allocations.
+ * kIOMemoryKernelUserShared - pass to request memory that will be mapped into both the kernel and client applications.
+ * kIOMapInhibitCache - allocate memory with inhibited cache setting.
+ * kIOMapWriteThruCache - allocate memory with writethru cache setting.
+ * kIOMapCopybackCache - allocate memory with copyback cache setting.
+ * kIOMapWriteCombineCache - allocate memory with writecombined cache setting. + * @param capacity The number of bytes to allocate. + * @param alignment The minimum required alignment of the buffer in bytes - 1 is the default for no required alignment. For example, pass 256 to get memory allocated at an address with bits 0-7 zero. + * @result Returns an instance of class IOBufferMemoryDescriptor to be released by the caller, which will free the memory desriptor and associated buffer. */ + + static IOBufferMemoryDescriptor * inTaskWithOptions( + task_t inTask, + IOOptionBits options, + vm_size_t capacity, + vm_offset_t alignment = 1); + +/*! @function inTaskWithOptions + * @abstract Creates a memory buffer with memory descriptor for that buffer. + * @discussion Added in Mac OS X 10.2, this method allocates a memory buffer with a given size and alignment in the task's address space specified, and returns a memory descriptor instance representing the memory. It is recommended that memory allocated for I/O or sharing via mapping be created via IOBufferMemoryDescriptor. Options passed with the request specify the kind of memory to be allocated - pageablity and sharing are specified with option bits. This function may block and so should not be called from interrupt level or while a simple lock is held. + * @param inTask The task the buffer will be allocated in. + * @param options Options for the allocation:
+ * kIODirectionOut, kIODirectionIn - set the direction of the I/O transfer.
+ * kIOMemoryPhysicallyContiguous - pass to request memory be physically contiguous. This option is heavily discouraged. The request may fail if memory is fragmented, may cause large amounts of paging activity, and may take a very long time to execute.
+ * kIOMemoryPageable - pass to request memory be non-wired - the default for kernel allocated memory is wired.
+ * kIOMemoryPurgeable - pass to request memory that may later have its purgeable state set with IOMemoryDescriptor::setPurgeable. Only supported for kIOMemoryPageable allocations.
+ * kIOMemoryKernelUserShared - pass to request memory that will be mapped into both the kernel and client applications.
+ * kIOMapInhibitCache - allocate memory with inhibited cache setting.
+ * kIOMapWriteThruCache - allocate memory with writethru cache setting.
+ * kIOMapCopybackCache - allocate memory with copyback cache setting.
+ * kIOMapWriteCombineCache - allocate memory with writecombined cache setting. + * @param capacity The number of bytes to allocate. + * @param alignment The minimum required alignment of the buffer in bytes - 1 is the default for no required alignment. For example, pass 256 to get memory allocated at an address with bits 0-7 zero. + * @param kernTag The kernel memory tag + * @param userTag The user memory tag + * @result Returns an instance of class IOBufferMemoryDescriptor to be released by the caller, which will free the memory desriptor and associated buffer. */ + + static IOBufferMemoryDescriptor * inTaskWithOptions( + task_t inTask, + IOOptionBits options, + vm_size_t capacity, + vm_offset_t alignment, + uint32_t kernTag, + uint32_t userTag); + +/*! @function inTaskWithPhysicalMask + * @abstract Creates a memory buffer with memory descriptor for that buffer. + * @discussion Added in Mac OS X 10.5, this method allocates a memory buffer with a given size and alignment in the task's address space specified, and returns a memory descriptor instance representing the memory. It is recommended that memory allocated for I/O or sharing via mapping be created via IOBufferMemoryDescriptor. Options passed with the request specify the kind of memory to be allocated - pageablity and sharing are specified with option bits. This function may block and so should not be called from interrupt level or while a simple lock is held. + * @param inTask The task the buffer will be mapped in. Pass NULL to create memory unmapped in any task (eg. for use as a DMA buffer). + * @param options Options for the allocation:
+ * kIODirectionOut, kIODirectionIn - set the direction of the I/O transfer.
+ * kIOMemoryPhysicallyContiguous - pass to request memory be physically contiguous. This option is heavily discouraged. The request may fail if memory is fragmented, may cause large amounts of paging activity, and may take a very long time to execute.
+ * kIOMemoryKernelUserShared - pass to request memory that will be mapped into both the kernel and client applications.
+ * kIOMapInhibitCache - allocate memory with inhibited cache setting.
+ * kIOMapWriteThruCache - allocate memory with writethru cache setting.
+ * kIOMapCopybackCache - allocate memory with copyback cache setting.
+ * kIOMapWriteCombineCache - allocate memory with writecombined cache setting. + * @param capacity The number of bytes to allocate. + * @param physicalMask The buffer will be allocated with pages such that physical addresses will only have bits set present in physicalMask. For example, pass 0x00000000FFFFFFFFULL for a buffer to be accessed by hardware that has 32 address bits. + * @result Returns an instance of class IOBufferMemoryDescriptor to be released by the caller, which will free the memory desriptor and associated buffer. */ + + static IOBufferMemoryDescriptor * inTaskWithPhysicalMask( + task_t inTask, + IOOptionBits options, + mach_vm_size_t capacity, + mach_vm_address_t physicalMask); + +/* + * withCapacity: + * + * Returns a new IOBufferMemoryDescriptor with a buffer large enough to + * hold capacity bytes. The descriptor's length is initially set to the + * capacity. + */ + static IOBufferMemoryDescriptor * withCapacity( + vm_size_t capacity, + IODirection withDirection, + bool withContiguousMemory = false); +#ifndef __LP64__ + virtual bool initWithBytes(const void * bytes, + vm_size_t withLength, + IODirection withDirection, + bool withContiguousMemory = false) APPLE_KEXT_DEPRECATED; /* use withBytes() instead */ +#endif /* !__LP64__ */ + +/* + * withBytes: + * + * Returns a new IOBufferMemoryDescriptor preloaded with bytes (copied). + * The descriptor's length and capacity are set to the input buffer's size. + */ + static IOBufferMemoryDescriptor * withBytes( + const void * bytes, + vm_size_t withLength, + IODirection withDirection, + bool withContiguousMemory = false); + +/* + * setLength: + * + * Change the buffer length of the memory descriptor. When a new buffer + * is created, the initial length of the buffer is set to be the same as + * the capacity. The length can be adjusted via setLength for a shorter + * transfer (there is no need to create more buffer descriptors when you + * can reuse an existing one, even for different transfer sizes). Note + * that the specified length must not exceed the capacity of the buffer. + */ + virtual void setLength(vm_size_t length); + +/* + * setDirection: + * + * Change the direction of the transfer. This method allows one to redirect + * the descriptor's transfer direction. This eliminates the need to destroy + * and create new buffers when different transfer directions are needed. + */ + virtual void setDirection(IODirection direction); + +/* + * getCapacity: + * + * Get the buffer capacity + */ + virtual vm_size_t getCapacity() const; + +/* + * getBytesNoCopy: + * + * Return the virtual address of the beginning of the buffer + */ + virtual void *getBytesNoCopy(); + +/* + * getBytesNoCopy: + * + * Return the virtual address of an offset from the beginning of the buffer + */ + virtual void *getBytesNoCopy(vm_size_t start, vm_size_t withLength); + +/* + * appendBytes: + * + * Add some data to the end of the buffer. This method automatically + * maintains the memory descriptor buffer length. Note that appendBytes + * will not copy past the end of the memory descriptor's current capacity. + */ + virtual bool appendBytes(const void *bytes, vm_size_t withLength); + +#ifndef __LP64__ + virtual void * getVirtualSegment(IOByteCount offset, + IOByteCount * length) APPLE_KEXT_OVERRIDE APPLE_KEXT_DEPRECATED; /* use getBytesNoCopy() instead */ +#endif /* !__LP64__ */ +}; + +#endif /* !_IOBUFFERMEMORYDESCRIPTOR_H */ diff --git a/QualcommWireless/include/IOKit/IOCatalogue.h b/QualcommWireless/include/IOKit/IOCatalogue.h new file mode 100644 index 0000000..55035bc --- /dev/null +++ b/QualcommWireless/include/IOKit/IOCatalogue.h @@ -0,0 +1,236 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1998 Apple Inc. All rights reserved. + * + * HISTORY + * + */ + + +#ifndef _IOKIT_IOCATALOGUE_H +#define _IOKIT_IOCATALOGUE_H + +#include +#include +#include +#include +#include +#include + +#include + +class IOService; + +extern const OSSymbol * gIOModuleIdentifierKey; +extern const OSSymbol * gIOModuleIdentifierKernelKey; + + +/*! + * @class IOCatalogue + * @abstract In-kernel database for IOKit driver personalities. + * @discussion The IOCatalogue is a database which contains all IOKit driver personalities. IOService uses this resource when matching devices to their associated drivers. + */ +class IOCatalogue : public OSObject +{ + OSDeclareDefaultStructors(IOCatalogue); + +private: + IORWLock * lock; + SInt32 generation; + OSDictionary * personalities; + OSArray * arrayForPersonality(OSDictionary * dict); + void addPersonality(OSDictionary * dict); + +public: +/*! + * @function initialize + * @abstract Creates and initializes the database object and poputates it with in-kernel driver personalities. + */ + static void initialize( void ); + +/*! + * @function init + * @abstract Initializes the database object. + * @param initArray The initial array of driver personalities to populate the database. + */ + bool init( OSArray * initArray ); + +/*! + * @function free + * @abstract Cleans up the database and deallocates memory allocated at initialization. This is never called in normal operation of the system. + */ + void free( void ) APPLE_KEXT_OVERRIDE; + +/*! + * @function findDrivers + * @abstract This is the primary entry point for IOService. + * @param service The service + * @param generationCount Returns a reference to the generation count of the database. The generation count increases only when personalities are added to the database *and* IOService matching has been initiated. + * @result Returns an ordered set of driver personalities ranked on probe-scores. The ordered set must be released by the receiver. + */ + OSOrderedSet * findDrivers( IOService * service, SInt32 * generationCount ); + +/*! + * @function findDrivers + * @abstract A more general purpose interface which allows one to retreive driver personalities based the intersection of the 'matching' dictionary and the personality's own property list. + * @param matching A dictionary containing only keys and values which are to be used for matching. For example, a matching dictionary containing 'IOProviderClass'='IOPCIDevice' will return all personalities with an IOProviderClass key and a value of IOPCIDevice. + * @param generationCount Returns a reference to the current generation of the database. The generation count increases only when personalities are added to the database *and* IOService matching has been initiated. + * @result Returns an ordered set of driver personalities ranked on probe-scores. The ordered set must be released by the receiver. + */ + OSOrderedSet * findDrivers( OSDictionary * matching, SInt32 * generationCount ); + +/*! + * @function addDrivers + * @abstract Adds an array of driver personalities to the database. + * @param array Array of driver personalities to be added to the database. + * @param doNubMatching Start matching process after personalities have been added. + * @result Returns true if driver personality was added to the database successfully. Failure is due to a memory allocation failure. + */ + bool addDrivers( OSArray * array, bool doNubMatching = true ); + +/*! + * @function removeDrivers + * @abstract Remove driver personalities from the database based on matching information provided. + * @param matching A dictionary whose keys and values are used for matching personalities in the database. For example, a matching dictionary containing a 'IOProviderClass' key with the value 'IOPCIDevice' will remove all personalities which have the key 'IOProviderClass' equal to 'IOPCIDevice'. + * @param doNubMatching Start matching process after personalities have been removed. Matching criteria is based on IOProviderClass of those personalities which were removed. This is to allow drivers which haven't been matched to match against NUB's which were blocked by the previous personalities. + * @result Returns true if personality was removed successfully. Failure is due to a memory allocation failure. + */ + bool removeDrivers( OSDictionary * matching, bool doNubMatching = true ); + +/*! + * @function getGenerationCount + * @abstract Get the current generation count of the database. + */ + SInt32 getGenerationCount( void ) const; + +/*! + * @function isModuleLoaded + * @abstract Reports if a kernel module has been loaded for a particular personality. + * @param driver A driver personality's property list. + * @param kextRef A reference to the kext getting loaded. + * @result Returns true if the associated kernel module has been loaded into the kernel for a particular driver personality on which it depends. + */ + bool isModuleLoaded( OSDictionary * driver, OSObject ** kextRef ) const; + +/*! + * @function moduleHasLoaded + * @abstract Callback function called after a IOKit dependent kernel module is loaded. + * @param name Name of the kernel module. + */ + void moduleHasLoaded( const OSSymbol * name ); + +/*! + * @function moduleHasLoaded + * @abstract Callback function called after a IOKit dependent kernel module is loaded. + * @param name Name of the kernel module. + */ + void moduleHasLoaded( const char * name ); + +/*! + * @function terminateDrivers + * @abstract Terminates all instances of a driver which match the contents of the matching dictionary. Does not unload module. + * @param matching A dictionary whose keys and values are used for matching personalities in the database. For example, a matching dictionary containing a 'IOProviderClass' key with the value 'IOPCIDevice' will cause termination for all instances whose personalities have the key 'IOProviderClass' equal to 'IOPCIDevice'. + */ + IOReturn terminateDrivers( OSDictionary * matching ); + +/*! + * @function terminateDriversForModule + * @abstract Terminates all instances of a driver which depends on a particular module and unloads the module. + * @param moduleName Name of the module which is used to determine which driver instances to terminate and unload. + * @param unload Flag to cause the actual unloading of the module. + */ + IOReturn terminateDriversForModule( OSString * moduleName, bool unload = true); + +/*! + * @function terminateDriversForModule + * @abstract Terminates all instances of a driver which depends on a particular module and unloads the module. + * @param moduleName Name of the module which is used to determine which driver instances to terminate and unload. + * @param unload Flag to cause the actual unloading of the module. + */ + IOReturn terminateDriversForModule( const char * moduleName, bool unload = true); + +/*! + * @function startMatching + * @abstract Restarts IOService matching. + * @param identifier All IOService objects with this bundle indentifier are rematched. + */ + bool startMatching( const OSSymbol * identifier ); + + // deprecated, for bin compat +#if defined(__i386__) || defined(__x86_64__) + bool startMatching( OSDictionary * matching ); +#endif + +/*! + * @function reset + * @abstract Return the Catalogue to its initial state. + * @discussion + * Should only be used by kextd just before it sends all kext personalities down during a rescan. + */ + void reset(void); + +/*! + * @function resetAndAddDrivers + * @abstract Replace personalities in IOCatalog with those provided. + * @discussion + * Resets the catalogue with a new set of drivers, preserving matching originals to keep wired memory usage down. + */ + bool resetAndAddDrivers(OSArray * drivers, bool doNubMatching = true); + +/*! + * @function serialize + * @abstract Serializes the catalog for transport to the user. + * @param s The serializer object. + * @result Returns false if unable to serialize database, most likely due to memory shortage. + */ + virtual bool serialize(OSSerialize * s) const APPLE_KEXT_OVERRIDE; + + bool serializeData(IOOptionBits kind, OSSerialize * s) const; + +/* This stuff is no longer used at all we keep it around for i386 + * binary compatibility only. Symbols are no longer exported. + */ + +private: + +/*! + * @function unloadModule + * @abstract Unloads the reqested module if no driver instances are currently depending on it. + * @param moduleName An OSString containing the name of the module to unload. + */ + IOReturn unloadModule( OSString * moduleName ) const; + + IOReturn _removeDrivers(OSDictionary * matching); +}; + +extern const OSSymbol * gIOClassKey; +extern const OSSymbol * gIOProbeScoreKey; +extern IOCatalogue * gIOCatalogue; + +#endif /* ! _IOKIT_IOCATALOGUE_H */ diff --git a/QualcommWireless/include/IOKit/IOCommand.h b/QualcommWireless/include/IOKit/IOCommand.h new file mode 100644 index 0000000..6cfd848 --- /dev/null +++ b/QualcommWireless/include/IOKit/IOCommand.h @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +/* + * + * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * + * HISTORY + * + * 2001-01-18 gvdl Made the primary queue pointer public, to be used when + * Ownership is clear. + * 11/13/2000 CJS Created IOCommand class and implementation + * + */ + +/*! + * @header IOCommand + * @abstract + * This header contains the IOCommand class definition. + */ + +#ifndef _IOKIT_IO_COMMAND_H_ +#define _IOKIT_IO_COMMAND_H_ + +/* + * Kernel + */ + +#if defined(KERNEL) && defined(__cplusplus) + +#include +#include + +/*! + * @class IOCommand + * @abstract + * This class is an abstract class which represents an I/O command. + * @discussion + * This class is an abstract class which represents an I/O command passed + * from a device driver to a controller. All controller commands (e.g. IOATACommand) + * should inherit from this class. + */ + +class IOCommand : public OSObject +{ + OSDeclareDefaultStructors(IOCommand); + +public: + virtual bool init(void) APPLE_KEXT_OVERRIDE; + +/*! @var fCommandChain + * This variable is used by the current 'owner' to queue the command. During the life cycle of a command it moves through a series of queues. This is the queue pointer for it. Only valid while 'ownership' is clear. For instance a IOCommandPool uses this pointer to maintain its list of free commands. May be manipulated using the kern/queue.h macros */ + queue_chain_t fCommandChain; /* used to queue commands */ +}; + +#endif /* defined(KERNEL) && defined(__cplusplus) */ + +#endif /* _IOKIT_IO_COMMAND_H_ */ diff --git a/QualcommWireless/include/IOKit/IOCommandGate.h b/QualcommWireless/include/IOKit/IOCommandGate.h new file mode 100644 index 0000000..2a1d2f2 --- /dev/null +++ b/QualcommWireless/include/IOKit/IOCommandGate.h @@ -0,0 +1,254 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/*[ + * 1999-8-10 Godfrey van der Linden(gvdl) + * Created. + * ]*/ +/*! @language embedded-c++ */ + +#ifndef _IOKIT_IOCOMMANDGATE_H +#define _IOKIT_IOCOMMANDGATE_H + +#include + +/*! + * @class IOCommandGate : public IOEventSource + * @abstract Single-threaded work loop client request mechanism. + * @discussion An IOCommandGate instance is an extremely lightweight mechanism + * that executes an action on the driver's work loop. Although the code does not + * technically execute on the work loop itself, a single-threaded work loop semantic + * is maintained for this event source using the work loop gate. The command gate + * tests for a potential self dead lock by checking if the runCommand request is + * made from the work loop's thread, it doesn't check for a mutual dead lock though + * where a pair of work loop's dead lock each other. + *

+ * The IOCommandGate is a lighter weight version of the IOCommandQueue and + * should be used in preference. Generally use a command queue whenever you need a + * client to submit a request to a work loop. A typical command gate action would + * check if the hardware is active, if so it will add the request to a pending + * queue internal to the device or the device's family. Otherwise if the hardware + * is inactive then this request can be acted upon immediately. + *

+ * CAUTION: The runAction, runCommand, and attemptCommand functions cannot be called from an interrupt context. + * + */ +class IOCommandGate : public IOEventSource +{ + OSDeclareDefaultStructors(IOCommandGate); + +public: +/*! + * @typedef Action + * @discussion Type and arguments of callout C function that is used when + * a runCommand is executed by a client. Cast to this type when you want a C++ + * member function to be used. Note the arg1 - arg3 parameters are straight pass + * through from the runCommand to the action callout. + * @param owner + * Target of the function, can be used as a refcon. The owner is set + * during initialisation of the IOCommandGate instance. Note if a C++ function + * was specified this parameter is implicitly the first paramter in the target + * member function's parameter list. + * @param arg0 Argument to action from run operation. + * @param arg1 Argument to action from run operation. + * @param arg2 Argument to action from run operation. + * @param arg3 Argument to action from run operation. + */ + typedef IOReturn (*Action)(OSObject *owner, + void *arg0, void *arg1, + void *arg2, void *arg3); + +protected: + +/*! @struct ExpansionData + * @discussion This structure will be used to expand the capablilties of the IOWorkLoop in the future. + */ + struct ExpansionData { }; + +/*! @var reserved + * Reserved for future use. (Internal use only) */ + APPLE_KEXT_WSHADOW_PUSH; + ExpansionData *reserved; + APPLE_KEXT_WSHADOW_POP; + +public: +/*! @function commandGate + * @abstract Factory method to create and initialise an IOCommandGate, See $link init. + * @result Returns a pointer to the new command gate if sucessful, 0 otherwise. */ + static IOCommandGate *commandGate(OSObject *owner, Action action = NULL); + +/*! @function init + * @abstract Class initialiser. + * @discussion Initialiser for IOCommandGate operates only on newly 'newed' + * objects. Shouldn't be used to re-init an existing instance. + * @param owner Owner of this, newly created, instance of the IOCommandGate. This argument will be used as the first parameter in the action callout. + * @param action + * Pointer to a C function that is called whenever a client of the + * IOCommandGate calls runCommand. NB Can be a C++ member function but caller + * must cast the member function to $link IOCommandGate::Action and they will get a + * compiler warning. Defaults to zero, see $link IOEventSource::setAction. + * @result True if inherited classes initialise successfully. */ + virtual bool init(OSObject *owner, Action action = NULL); + +// Superclass overrides + virtual void free() APPLE_KEXT_OVERRIDE; + virtual void setWorkLoop(IOWorkLoop *inWorkLoop) APPLE_KEXT_OVERRIDE; + +/*! @function runCommand + * @abstract Single thread a command with the target work loop. + * @discussion Client function that causes the current action to be called in + * a single threaded manner. Beware the work loop's gate is recursive and command + * gates can cause direct or indirect re-entrancy. When the executing on a + * client's thread runCommand will sleep until the work loop's gate opens for + * execution of client actions, the action is single threaded against all other + * work loop event sources. If the command is disabled the attempt to run a command will be stalled until enable is called. + * @param arg0 Parameter for action of command gate, defaults to 0. + * @param arg1 Parameter for action of command gate, defaults to 0. + * @param arg2 Parameter for action of command gate, defaults to 0. + * @param arg3 Parameter for action of command gate, defaults to 0. + * @result kIOReturnSuccess if successful. kIOReturnAborted if a disabled command gate is free()ed before being reenabled, kIOReturnNoResources if no action available. + */ + virtual IOReturn runCommand(void *arg0 = NULL, void *arg1 = NULL, + void *arg2 = NULL, void *arg3 = NULL); + +/*! @function runAction + * @abstract Single thread a call to an action with the target work loop. + * @discussion Client function that causes the given action to be called in + * a single threaded manner. Beware the work loop's gate is recursive and command + * gates can cause direct or indirect re-entrancy. When the executing on a + * client's thread runAction will sleep until the work loop's gate opens for + * execution of client actions, the action is single threaded against all other + * work loop event sources. If the command is disabled the attempt to run a command will be stalled until enable is called. + * @param action Pointer to function to be executed in the context of the work loop. + * @param arg0 Parameter for action parameter, defaults to 0. + * @param arg1 Parameter for action parameter, defaults to 0. + * @param arg2 Parameter for action parameter, defaults to 0. + * @param arg3 Parameter for action parameter, defaults to 0. + * @result The return value of action if it was called, kIOReturnBadArgument if action is not defined, kIOReturnAborted if a disabled command gate is free()ed before being reenabled. + */ + virtual IOReturn runAction(Action action, + void *arg0 = NULL, void *arg1 = NULL, + void *arg2 = NULL, void *arg3 = NULL); + +#ifdef __BLOCKS__ +/*! @function runActionBlock + * @abstract Single thread a call to an action with the target work loop. + * @discussion Client function that causes the given action to be called in + * a single threaded manner. Beware the work loop's gate is recursive and command + * gates can cause direct or indirect re-entrancy. When the executing on a + * client's thread runAction will sleep until the work loop's gate opens for + * execution of client actions, the action is single threaded against all other + * work loop event sources. If the command is disabled the attempt to run a command will be stalled until enable is called. + * @param action Block to be executed in the context of the work loop. + * @result The return value of action if it was called, kIOReturnBadArgument if action is not defined, kIOReturnAborted if a disabled command gate is free()ed before being reenabled. + */ + IOReturn runActionBlock(ActionBlock action); +#endif /* __BLOCKS__ */ + +/*! @function attemptCommand + * @abstract Single thread a command with the target work loop. + * @discussion Client function that causes the current action to be called in + * a single threaded manner. When the executing on a client's thread attemptCommand will fail if the work loop's gate is closed. + * @param arg0 Parameter for action of command gate, defaults to 0. + * @param arg1 Parameter for action of command gate, defaults to 0. + * @param arg2 Parameter for action of command gate, defaults to 0. + * @param arg3 Parameter for action of command gate, defaults to 0. + * @result kIOReturnSuccess if successful. kIOReturnNotPermitted if this event source is currently disabled, kIOReturnNoResources if no action available, kIOReturnCannotLock if lock attempt fails. + */ + virtual IOReturn attemptCommand(void *arg0 = NULL, void *arg1 = NULL, + void *arg2 = NULL, void *arg3 = NULL); + +/*! @function attemptAction + * @abstract Single thread a call to an action with the target work loop. + * @discussion Client function that causes the given action to be called in + * a single threaded manner. Beware the work loop's gate is recursive and command + * gates can cause direct or indirect re-entrancy. When the executing on a + * client's thread attemptCommand will fail if the work loop's gate is closed. + * @param action Pointer to function to be executed in context of the work loop. + * @param arg0 Parameter for action parameter, defaults to 0. + * @param arg1 Parameter for action parameter, defaults to 0. + * @param arg2 Parameter for action parameter, defaults to 0. + * @param arg3 Parameter for action parameter, defaults to 0. + * @result kIOReturnSuccess if successful. kIOReturnBadArgument if action is not defined, kIOReturnNotPermitted if this event source is currently disabled, kIOReturnCannotLock if lock attempt fails. + * + */ + virtual IOReturn attemptAction(Action action, + void *arg0 = NULL, void *arg1 = NULL, + void *arg2 = NULL, void *arg3 = NULL); + +/*! @function commandSleep + * @abstract Put a thread that is currently holding the command gate to sleep. + * @discussion Put a thread to sleep waiting for an event but release the gate first. If the event occurs then the commandGate is closed before the function returns. If the thread does not hold the gate, panic. + * @param event Pointer to an address. + * @param interruptible THREAD_UNINT, THREAD_INTERRUPTIBLE or THREAD_ABORTSAFE. THREAD_UNINT specifies that the sleep cannot be interrupted by a signal. THREAD_INTERRUPTIBLE specifies that the sleep may be interrupted by a "kill -9" signal. THREAD_ABORTSAFE (the default value) specifies that the sleep may be interrupted by any user signal. + * @result THREAD_AWAKENED - normal wakeup, THREAD_TIMED_OUT - timeout expired, THREAD_INTERRUPTED - interrupted, THREAD_RESTART - restart operation entirely. */ + virtual IOReturn commandSleep(void *event, + UInt32 interruptible = THREAD_ABORTSAFE); + +/*! @function commandWakeup + * @abstract Wakeup one or more threads that are asleep on an event. + * @param event Pointer to an address. + * @param oneThread true to only wake up at most one thread, false otherwise. */ + virtual void commandWakeup(void *event, bool oneThread = false); + +/*! @function disable + * @abstract Disable the command gate + * @discussion When a command gate is disabled all future calls to runAction and runCommand will stall until the gate is enable()d later. This can be used to block client threads when a system sleep is requested. The IOWorkLoop thread itself will never stall, even when making runAction/runCommand calls. This call must be made from a gated context, to clear potential race conditions. */ + virtual void disable() APPLE_KEXT_OVERRIDE; + +/*! @function enable + * @abstract Enable command gate, this will unblock any blocked Commands and Actions. + * @discussion Enable the command gate. The attemptAction/attemptCommand calls will now be enabled and can succeeed. Stalled runCommand/runAction calls will be woken up. */ + virtual void enable() APPLE_KEXT_OVERRIDE; + +/*! @function commandSleep + * @abstract Put a thread that is currently holding the command gate to sleep. + * @discussion Put a thread to sleep waiting for an event but release the gate first. If the event occurs or timeout occurs then the commandGate is closed before the function returns. If the thread does not hold the gate, panic. + * @param event Pointer to an address. + * @param deadline Clock deadline to timeout the sleep. + * @param interruptible THREAD_UNINT, THREAD_INTERRUPTIBLE or THREAD_ABORTSAFE. THREAD_UNINT specifies that the sleep cannot be interrupted by a signal. THREAD_INTERRUPTIBLE specifies that the sleep may be interrupted by a "kill -9" signal. THREAD_ABORTSAFE specifies that the sleep may be interrupted by any user signal. + * @result THREAD_AWAKENED - normal wakeup, THREAD_TIMED_OUT - timeout expired, THREAD_INTERRUPTED - interrupted, THREAD_RESTART - restart operation entirely. */ + virtual IOReturn commandSleep(void *event, + AbsoluteTime deadline, + UInt32 interruptible); + +private: +#if __LP64__ + OSMetaClassDeclareReservedUnused(IOCommandGate, 0); +#else + OSMetaClassDeclareReservedUsed(IOCommandGate, 0); +#endif + OSMetaClassDeclareReservedUnused(IOCommandGate, 1); + OSMetaClassDeclareReservedUnused(IOCommandGate, 2); + OSMetaClassDeclareReservedUnused(IOCommandGate, 3); + OSMetaClassDeclareReservedUnused(IOCommandGate, 4); + OSMetaClassDeclareReservedUnused(IOCommandGate, 5); + OSMetaClassDeclareReservedUnused(IOCommandGate, 6); + OSMetaClassDeclareReservedUnused(IOCommandGate, 7); +}; + +#endif /* !_IOKIT_IOCOMMANDGATE_H */ diff --git a/QualcommWireless/include/IOKit/IOCommandPool.h b/QualcommWireless/include/IOKit/IOCommandPool.h new file mode 100644 index 0000000..ee30bb4 --- /dev/null +++ b/QualcommWireless/include/IOKit/IOCommandPool.h @@ -0,0 +1,230 @@ +/* + * Copyright (c) 2000-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +/* + * + * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * + * HISTORY + * + * 2001-01-17 gvdl Re-implement on IOCommandGate::commandSleep + * 11/13/2000 CJS Created IOCommandPool class and implementation + * + */ + +/*! + * @header IOCommandPool + * @abstract + * This header contains the IOCommandPool class definition. + */ + +#ifndef _IOKIT_IO_COMMAND_POOL_H_ +#define _IOKIT_IO_COMMAND_POOL_H_ + +/* + * Kernel + */ + +#if defined(KERNEL) && defined(__cplusplus) + +#include +#include +#include +#include +#include +#include + +/*! + * @class IOCommandPool + * @abstract Manipulates a pool of commands which inherit from IOCommand. + * @discussion + * The IOCommandPool class is used to manipulate a pool of commands which + * inherit from IOCommand. It includes a factory method to create a pool + * of a certain size. Once the factory method is invoked, the semaphore + * is set to zero. The caller must then put commands in the pool by creating + * the command (via the controller's factory method or a memory allocation) + * and calling the returnCommand method with the newly created command as its + * argument. + */ + +class IOCommandPool : public OSObject +{ + OSDeclareDefaultStructors(IOCommandPool); + + +protected: + + queue_head_t fQueueHead; /* head of the queue of elements available */ + UInt32 fSleepers; /* Count of threads sleeping on this pool */ + IOCommandGate *fSerializer; /* command gate used for serializing pool access */ + +/*! @struct ExpansionData + * @discussion This structure will be used to expand the capablilties of the IOEventSource in the future. + */ + struct ExpansionData { }; + +/*! @var reserved + * Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + +/*! + * @const kIOCommandPoolDefaultSize + * @abstract The default size of any command pool. + * @discussion + * kIOCommandPoolDefaultSize is the default size of any command pool. + * The default size was determined to be the smallest size for which + * a pool makes sense. + */ + + static const UInt32 kIOCommandPoolDefaultSize = 2; + +/* + * Free all of this object's outstanding resources. + */ + + virtual void free(void) APPLE_KEXT_OVERRIDE; + + +public: + +/*! + * @function initWithWorkLoop + * @abstract Primary initializer for an IOCommandPool object. + * @discussion Primary initializer for an IOCommandPool. + * Should probably use IOCommandPool::withWorkLoop() as it is easier to use. + * @param workLoop + * The workloop that this command pool should synchronize with. + * @result Returns true if command pool was successfully initialized. + */ + virtual bool initWithWorkLoop(IOWorkLoop *workLoop); + +/*! + * @function withWorkLoop + * @abstract Primary factory method for the IOCommandPool class + * @discussion + * The withWorkLoop method is what is known as a factory method. It creates + * a new instance of an IOCommandPool and returns a pointer to that object. + * @param inWorkLoop + * The workloop that this command pool should synchronize with. + * @result + * Returns a pointer to an instance of IOCommandPool if successful, + * otherwise NULL. + */ + + static IOCommandPool *withWorkLoop(IOWorkLoop *inWorkLoop); + +/*! + * @function init + * @abstract Should never be used, obsolete. See initWithWorkLoop. + */ + virtual bool init(IOService *inOwner, + IOWorkLoop *inWorkLoop, + UInt32 inSize = kIOCommandPoolDefaultSize); + +/*! + * @function withWorkLoop + * @abstract Should never be used, obsolete. See IOCommandPool::withWorkLoop. + */ + static IOCommandPool *commandPool(IOService *inOwner, + IOWorkLoop *inWorkLoop, + UInt32 inSize = kIOCommandPoolDefaultSize); + + +/*! + * @function getCommand + * @discussion The getCommand method is used to get a pointer to an object of type IOCommand from the pool. + * @param blockForCommand + * If the caller would like to have its thread slept until a command is + * available, it should pass true, else false. + * @result + * If the caller passes true in blockForCommand, getCommand guarantees that + * the result will be a pointer to an IOCommand object from the pool. If + * the caller passes false, s/he is responsible for checking whether a non-NULL + * pointer was returned. + */ + + virtual IOCommand *getCommand(bool blockForCommand = true); + +/*! + * @function returnCommand + * @discussion + * The returnCommand method is used to place an object of type IOCommand + * into the pool, whether it be the first time, or the 1000th time. + * @param command + * The command to place in the pool. + */ + + virtual void returnCommand(IOCommand *command); + +protected: + +/*! + * @function gatedGetCommand + * @discussion + * The gatedGetCommand method is used to serialize the extraction of a + * command from the pool behind a command gate, runAction-ed by getCommand. + * @param command + * A pointer to a pointer to an IOCommand object where the returned + * command will be stored. + * @param blockForCommand + * A bool that indicates whether to block the request until a command + * becomes available. + * @result + * Returns kIOReturnNoResources if no command is available and the client + * doesn't wish to block until one does become available. + * kIOReturnSuccess if the vCommand argument is valid. + */ + virtual IOReturn gatedGetCommand( + LIBKERN_RETURNS_NOT_RETAINED IOCommand **command, bool blockForCommand); + +/*! + * @function gatedReturnCommand + * @discussion + * The gatedReturnCommand method is used to serialize the return of a + * command to the pool behind a command gate, runAction-ed by returnCommand. + * @param command + * A pointer to the IOCommand object to be returned to the pool. + * @result + * Always returns kIOReturnSuccess if the vCommand argument is valid. + */ + virtual IOReturn gatedReturnCommand(IOCommand *command); + +private: + OSMetaClassDeclareReservedUnused(IOCommandPool, 0); + OSMetaClassDeclareReservedUnused(IOCommandPool, 1); + OSMetaClassDeclareReservedUnused(IOCommandPool, 2); + OSMetaClassDeclareReservedUnused(IOCommandPool, 3); + OSMetaClassDeclareReservedUnused(IOCommandPool, 4); + OSMetaClassDeclareReservedUnused(IOCommandPool, 5); + OSMetaClassDeclareReservedUnused(IOCommandPool, 6); + OSMetaClassDeclareReservedUnused(IOCommandPool, 7); +}; + +#endif /* defined(KERNEL) && defined(__cplusplus) */ + +#endif /* _IOKIT_IO_COMMAND_POOL_H_ */ diff --git a/QualcommWireless/include/IOKit/IOConditionLock.h b/QualcommWireless/include/IOKit/IOConditionLock.h new file mode 100644 index 0000000..52dd502 --- /dev/null +++ b/QualcommWireless/include/IOKit/IOConditionLock.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* Copyright (c) 1999 Apple Computer, Inc. All rights reserved. + * Copyright (c) 1994-1996 NeXT Software, Inc. All rights reserved. + */ + +#ifndef _IOKIT_IOCONDITIONLOCK_H +#define _IOKIT_IOCONDITIONLOCK_H + +#include +#include +#include + +#include + +class IOConditionLock : public OSObject +{ + OSDeclareDefaultStructors(IOConditionLock); + +private: + IOLock * cond_interlock; // condition var Simple lock + volatile int condition; + + IOLock * sleep_interlock; // sleep lock Simple lock + unsigned char interruptible; + volatile bool want_lock; + volatile bool waiting; + +public: + static IOConditionLock *withCondition(int condition, bool inIntr = true); + virtual bool initWithCondition(int condition, bool inIntr = true); + virtual void free() APPLE_KEXT_OVERRIDE; + + virtual bool tryLock(); // acquire lock, no waiting + virtual int lock(); // acquire lock (enter critical section) + virtual void unlock(); // release lock (leave critical section) + + virtual bool getInterruptible() const; + virtual int getCondition() const; + virtual int setCondition(int condition); + + virtual int lockWhen(int condition);// acquire lock when condition + virtual void unlockWith(int condition); // set condition & release lock +}; + +#endif /* _IOKIT_IOCONDITIONLOCK_H */ diff --git a/QualcommWireless/include/IOKit/IODMACommand.h b/QualcommWireless/include/IOKit/IODMACommand.h new file mode 100644 index 0000000..2188f95 --- /dev/null +++ b/QualcommWireless/include/IOKit/IODMACommand.h @@ -0,0 +1,649 @@ +/* + * Copyright (c) 2005-2016 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +#ifndef _IODMACOMMAND_H +#define _IODMACOMMAND_H + +#include +#include +#include +class IOMapper; +class IOBufferMemoryDescriptor; + +enum{ + kIODMAMapOptionMapped = 0x00000000, + kIODMAMapOptionBypassed = 0x00000001, + kIODMAMapOptionNonCoherent = 0x00000002, + kIODMAMapOptionUnmapped = 0x00000003, + kIODMAMapOptionTypeMask = 0x0000000f, + + kIODMAMapOptionNoCacheStore = 0x00000010, // Memory in descriptor + kIODMAMapOptionOnChip = 0x00000020,// Indicates DMA is on South Bridge + kIODMAMapOptionIterateOnly = 0x00000040// DMACommand will be used as a cursor only +}; + +/**************************** class IODMACommand ***************************/ + +/*! + * @class IODMACommand + * @abstract A mechanism to convert memory references to I/O bus addresses. + * @discussion The IODMACommand is supersedes the IOMemoryCursor and greatly enhances the functionality and power of it. The command can be specified to output 64 bit physical addresses and also allows driver writers bypass mapping hardware or get addresses suitable for non-snooped DMA. + *

+ * The command is designed to be very easily subclassable. Most driver writers need to associate some DMA operations with their memory descriptor and usually use a C structure for that purpose. This structure is often kept in a linked list. This IODMACommand has built it linkage and can be derived and 'public:' variables added, giving the developer a structure that can associate a memory descriptor with a particular dma command but will also allow the developer to generate that command and keep the state necessary for tracking it. + *

+ * It is envisaged that a pool of IODMACommands will be created at driver initialisation and each command will be kept in an IOCommandPool while not in use. However if developers wishes to maintain their own free lists that is certainly possible. See the and for sample code on manipulating the command's doubly linked list entries. + *

+ * The IODMACommand can be used in a 'weak-linked' manner. To do this you must avoid using any static member functions. Use the, much slower but safe, weakWithSpecification function. On success a dma command instance will be returned. This instance can then be used to clone as many commands as is needed. Remember deriving from this class can not be done weakly, that is no weak subclassing! + */ + +class IODMACommand : public IOCommand +{ + OSDeclareDefaultStructorsWithDispatch(IODMACommand); + + friend class IODMAEventSource; + +public: + +/*! + * @typedef Segment32 + * @discussion A 32 bit I/O bus address/length pair + */ + struct Segment32 { + UInt32 fIOVMAddr, fLength; + }; + +/*! + * @typedef Segment64 + * @discussion A 64 bit I/O bus address/length pair + */ + struct Segment64 { + UInt64 fIOVMAddr, fLength; + }; + +/*! @enum MappingOptions + * @abstract Mapping types to indicate the desired mapper type for translating memory descriptors into I/O DMA Bus addresses. + * @constant kNonCoherent Used by drivers for non-coherent transfers, implies unmapped memmory + * @constant kMapped Allow a driver to define addressing size + * @constant kBypassed Allow drivers to bypass any mapper + * @constant kMaxMappingOptions Internal use only + */ + enum MappingOptions { + kMapped = kIODMAMapOptionMapped, + kBypassed = kIODMAMapOptionBypassed, + kNonCoherent = kIODMAMapOptionNonCoherent, + kUnmapped = kIODMAMapOptionUnmapped, + kTypeMask = kIODMAMapOptionTypeMask, + + kNoCacheStore = kIODMAMapOptionNoCacheStore, // Memory in descriptor + kOnChip = kIODMAMapOptionOnChip, // Indicates DMA is on South Bridge + kIterateOnly = kIODMAMapOptionIterateOnly// DMACommand will be used as a cursor only + }; + + struct SegmentOptions { + uint8_t fStructSize; + uint8_t fNumAddressBits; + uint64_t fMaxSegmentSize; + uint64_t fMaxTransferSize; + uint32_t fAlignment; + uint32_t fAlignmentLength; + uint32_t fAlignmentInternalSegments; + }; + +/*! @enum SynchronizeOptions + * @abstract Options for the synchronize method. + * @constant kForceDoubleBuffer Copy the entire prepared range to a new page aligned buffer. + */ + enum SynchronizeOptions { + kForceDoubleBuffer = 0x01000000 + }; + +/*! + * @typedef SegmentFunction + * @discussion Pointer to a C function that translates a 64 segment and outputs a single desired segment to the array at the requested index. There are a group of pre-implemented SegmentFunctions that may be usefull to the developer below. + * @param segment The 64Bit I/O bus address and length. + * @param segments Base of the output vector of DMA address length pairs. + * @param segmentIndex Index to output 'segment' in the 'segments' array. + * @result Returns true if segment encoding succeeded. false may be returned if the current segment does not fit in an output segment, i.e. a 38bit address wont fit into a 32 encoding. + */ + typedef bool (*SegmentFunction)(IODMACommand *target, + Segment64 segment, + void *segments, + UInt32 segmentIndex); + +// -------------- Preimplemented output functions ---------------- + +/*! @function OutputHost32 + * @abstract Output host natural Segment32 output segment function. + */ + static bool OutputHost32(IODMACommand *target, + Segment64 seg, void *segs, UInt32 ind); + +/*! @defined kIODMACommandOutputHost32 + * @abstract Output host natural Segment32 output segment function. + */ +#define kIODMACommandOutputHost32 (IODMACommand::OutputHost32) + +/*! @function OutputBig32 + * @abstract Output big-endian Segment32 output segment function. + */ + static bool OutputBig32(IODMACommand *target, + Segment64 seg, void *segs, UInt32 ind); + +/*! @defined kIODMACommandOutputBig32 + * @abstract Output big-endian Segment32 output segment function. + */ +#define kIODMACommandOutputBig32 (IODMACommand::OutputBig32) + +/*! @function OutputLittle32 + * @abstract Output little-endian Segment32 output segment function. + */ + static bool OutputLittle32(IODMACommand *target, + Segment64 seg, void *segs, UInt32 ind); + +/*! @defined kIODMACommandOutputLittle32 + * @abstract Output little-endian Segment32 output segment function. + */ +#define kIODMACommandOutputLittle32 (IODMACommand::OutputLittle32) + +/*! @function OutputHost64 + * @abstract Output host natural Segment64 output segment function. + */ + static bool OutputHost64(IODMACommand *target, + Segment64 seg, void *segs, UInt32 ind); + +/*! @defined kIODMACommandOutputHost64 + * @abstract Output host natural Segment64 output segment function. + */ +#define kIODMACommandOutputHost64 (IODMACommand::OutputHost64) + +/*! @function OutputBig64 + * @abstract Output big-endian Segment64 output segment function. + */ + static bool OutputBig64(IODMACommand *target, + Segment64 seg, void *segs, UInt32 ind); + +/*! @defined kIODMACommandOutputBig64 + * @abstract Output big-endian Segment64 output segment function. + */ +#define kIODMACommandOutputBig64 (IODMACommand::OutputBig64) + +/*! @function OutputLittle64 + * @abstract Output little-endian Segment64 output segment function. + */ + static bool OutputLittle64(IODMACommand *target, + Segment64 seg, void *segs, UInt32 ind); + +/*! @defined kIODMACommandOutputLittle64 + * @abstract Output little-endian Segment64 output segment function. + */ +#define kIODMACommandOutputLittle64 (IODMACommand::OutputLittle64) + +/*! @function withSpecification + * @abstract Creates and initializes an IODMACommand in one operation. + * @discussion Factory function to create and initialize an IODMACommand in one operation. + * @param outSegFunc SegmentFunction to call to output one physical segment. A set of nine commonly required segment functions are provided. + * @param numAddressBits Number of bits that the hardware uses on its internal address bus. Typically 32 but may be more on modern hardware. A 0 implies no-restriction other than that implied by the output segment function. + * @param maxSegmentSize Maximum allowable size for one segment. If 0 is passed the maximum segment size is unlimited. + * @param mappingOptions is the type of mapping that is required to translate an IOMemoryDescriptor into the desired number of bits. For instance if your hardware only supports 32 bits but must run on machines with > 4G of RAM some mapping will be required. Number of bits will be specified in numAddressBits, see below.This parameter can take 3 values:- kNonCoherent - used for non-coherent hardware transfers, Mapped - Validate that all I/O bus generated addresses are within the number of addressing bits specified, Bypassed indicates that bypassed addressing is required, this is used when the hardware transferes are into coherent memory but no mapping is required. See also prepare() for failure cases. + * @param maxTransferSize Maximum size of an entire transfer. Defaults to 0 indicating no maximum. + * @param alignment Alignment restriction, in bytes, on I/O bus addresses. Defaults to single byte alignment. + * @param mapper For mapping types kMapped & kBypassed mapper is used to define the hardware that will perform the mapping, defaults to the system mapper. + * @param refCon Reference Constant + * @result Returns a new IODMACommand if successfully created and initialized, 0 otherwise. + */ + static IODMACommand * + withSpecification(SegmentFunction outSegFunc, + UInt8 numAddressBits, + UInt64 maxSegmentSize, + MappingOptions mappingOptions = kMapped, + UInt64 maxTransferSize = 0, + UInt32 alignment = 1, + IOMapper *mapper = NULL, + void *refCon = NULL); + +/*! @function weakWithSpecification + * @abstract Creates and initialises an IODMACommand in one operation if this version of the operating system supports it. + * @discussion Factory function to create and initialise an IODMACommand in one operation. The function allows a developer to 'weak' link with IODMACommand. This function will return kIOReturnUnsupported if the IODMACommand is unavailable. This function is actually fairly slow so it will be better to call it once then clone the successfully create command using cloneCommand (q.v.). + * @param newCommand Output reference variable of the newly created IODMACommand. + * @param outSegFunc SegmentFunction to call to output one physical segment. A set of nine commonly required segment functions are provided. + * @param numAddressBits Number of bits that the hardware uses on its internal address bus. Typically 32 but may be more on modern hardware. A 0 implies no-restriction other than that implied by the output segment function. + * @param maxSegmentSize Maximum allowable size for one segment. Zero is treated as an unlimited segment size. + * @param mapType is the type of mapping that is required to translate an IOMemoryDescriptor into the desired number of bits. For instance if your hardware only supports 32 bits but must run on machines with > 4G of RAM some mapping will be required. Number of bits will be specified in numAddressBits, see below. This parameter can take 3 values:- kNonCoherent - used for non-coherent hardware transfers, Mapped - Validate that all I/O bus generated addresses are within the number of addressing bits specified, Bypassed indicates that bypassed addressing is required, this is used when the hardware transfers are into coherent memory but no mapping is required. See also prepare() for failure cases. + * @param maxTransferSize Maximum size of an entire transfer. Defaults to 0 indicating no maximum. + * @param alignment Alignment restriction, in bytes, on I/O bus addresses. Defaults to single byte alignment. + * @param mapper For mapping types kMapped & kBypassed mapper is used to define the hardware that will perform the mapping, defaults to the system mapper. + * @param refCon Reference Constant + * @result kIOReturnSuccess if everything is OK, otherwise kIOReturnBadArgument if newCommand is NULL, kIOReturnUnsupported if the kernel doesn't export IODMACommand or IOReturnError if the new command fails to init, q.v. initWithSpecification. + */ +// Note that the function has the attribute always_inline. +// The point of this function is to make a call into the kernel +// without generating an undefined symbol. If the client could call +// the code as a function then the goal of no undefined symbols +// would be lost thus defeating the purpose. + static inline IOReturn weakWithSpecification + (IODMACommand **newCommand, + SegmentFunction outSegFunc, + UInt8 numAddressBits, + UInt64 maxSegmentSize, + MappingOptions mapType = kMapped, + UInt64 maxTransferSize = 0, + UInt32 alignment = 1, + IOMapper *mapper = NULL, + void *refCon = NULL) __attribute__((always_inline)); + + static IODMACommand * + withSpecification(SegmentFunction outSegFunc, + const SegmentOptions * segmentOptions, + uint32_t mappingOptions, + IOMapper * mapper, + void * refCon); + + +/*! @function withRefCon + * @abstract Creates and initializes an unspecified IODMACommand. + * @discussion Factory function to create and initialize an unspecified IODMACommand. prepareWithSpecification() must be used to prepare the IODMACommand before use. + * @param refCon Reference Constant + * @result Returns a new IODMACommand if successfully created and initialized, 0 otherwise. + */ + static IODMACommand * withRefCon(void * refCon); + +/*! + * @function cloneCommand + * @abstract Creates a new command based on the specification of the current one. + * @discussion Factory function to create and initialise an IODMACommand in one operation. The current command's specification will be duplicated in the new object, but however none of its state will be duplicated. This means that it is safe to clone a command even if it is currently active and running, however you must be certain that the command to be duplicated does have a valid reference for the duration. + * @result Returns a new IODMACommand if successfully created and initialised, 0 otherwise. + */ + virtual IODMACommand *cloneCommand(void *refCon = NULL); + +/*! @function initWithSpecification + * @abstract Primary initializer for the IODMACommand class. + * @param outSegFunc SegmentFunction to call to output one physical segment. A set of nine commonly required segment functions are provided. + * @param numAddressBits Number of bits that the hardware uses on its internal address bus. Typically 32 but may be more on modern hardware. A 0 implies no-restriction other than that implied by the output segment function. + * @param maxSegmentSize Maximum allowable size for one segment. Defaults to 0 which means any size. + * @param mappingOptions is the type of mapping that is required to translate an IOMemoryDescriptor into the desired number of bits. For instance if your hardware only supports 32 bits but must run on machines with > 4G of RAM some mapping will be required. Number of bits will be specified in numAddressBits, see below.This parameter can take 3 values:- kNonCoherent - used for non-coherent hardware transfers, Mapped - Validate that all I/O bus generated addresses are within the number of addressing bits specified, Bypassed indicates that bypassed addressing is required, this is used when the hardware transferes are into coherent memory but no mapping is required. See also prepare() for failure cases. + * @param maxTransferSize Maximum size of an entire transfer. Defaults to 0 indicating no maximum. + * @param alignment Alignment restriction, in bytes, on I/O bus addresses. Defaults to single byte alignment. + * @param mapper For mapping types kMapped & kBypassed mapper is used to define the hardware that will perform the mapping, defaults to the system mapper. + * @param refCon Reference Constant + * @result Can fail if the mapping type is not recognised, if one of the 3 mandatory parameters are set to 0, if a 32 bit output function is selected when more than 32 bits of address is required or, if kBypassed is requested on a machine that doesn't support bypassing. Returns true otherwise. + */ + virtual bool initWithSpecification( SegmentFunction outSegFunc, + UInt8 numAddressBits, + UInt64 maxSegmentSize, + MappingOptions mappingOptions = kMapped, + UInt64 maxTransferSize = 0, + UInt32 alignment = 1, + IOMapper *mapper = NULL, + void *refCon = NULL); + +/*! @function setMemoryDescriptor + * @abstract Sets and resets the DMACommand's current memory descriptor + * @discussion The DMA command will configure itself based on the information that it finds in the memory descriptor. It looks for things like the direction of the memory descriptor and whether the current memory descriptor is already mapped into some IOMMU. As a programmer convenience it can also prepare the DMA command immediately. See prepare(). Note the IODMACommand is designed to used multiple times with a succession of memory descriptors, making the pooling of commands possible. It is an error though to attempt to reset a currently prepared() DMA command. Warning: This routine may block so never try to autoprepare an IODMACommand while in a gated context, i.e. one of the WorkLoops action call outs. + * @param mem A pointer to the current I/Os memory descriptor. + * @param autoPrepare An optional boolean variable that will call the prepare() function automatically after the memory descriptor is processed. Defaults to true. + * @result Returns kIOReturnSuccess, kIOReturnBusy if currently prepared, kIOReturnNoSpace if the length(mem) >= Maximum Transfer Size or the error codes returned by prepare() (qv). + */ + virtual IOReturn setMemoryDescriptor(const IOMemoryDescriptor *mem, + bool autoPrepare = true); + +/*! @function clearMemoryDescriptor + * @abstract Clears the DMACommand's current memory descriptor + * @discussion completes and invalidates the cache if the DMA command is currently active, copies all data from bounce buffers if necessary and releases all resources acquired during setMemoryDescriptor. + * @param autoComplete An optional boolean variable that will call the complete() function automatically before the memory descriptor is processed. Defaults to true. + */ + virtual IOReturn clearMemoryDescriptor(bool autoComplete = true); + +/*! @function getMemoryDescriptor + * @abstract Get the current memory descriptor + */ + virtual const IOMemoryDescriptor *getMemoryDescriptor() const; + +/*! @function getIOMemoryDescriptor + * @abstract Get the memory descriptor to be used for DMA + */ + IOMemoryDescriptor * getIOMemoryDescriptor() const; + +/*! @function prepare + * @abstract Prepare the memory for an I/O transfer. + * @discussion Allocate the mapping resources neccessary for this transfer, specifying a sub range of the IOMemoryDescriptor that will be the target of the I/O. The complete() method frees these resources. Data may be copied to buffers for kIODirectionOut memory descriptors, depending on hardware mapping resource availabilty or alignment restrictions. It should be noted that the this function may block and should only be called on the clients context, i.e never call this routine while gated; also the call itself is not thread safe though this should be an issue as each IODMACommand is independant. + * @param offset defines the starting offset in the memory descriptor the DMA command will operate on. genIOVMSegments will produce its results based on the offset and length passed to the prepare method. + * @param length defines the ending position in the memory descriptor the DMA command will operate on. genIOVMSegments will produce its results based on the offset and length passed to the prepare method. + * @param flushCache Flush the caches for the memory descriptor and make certain that the memory cycles are complete. Defaults to true for kNonCoherent and is ignored by the other types. + * @param synchronize Copy any buffered data back from the target IOMemoryDescriptor. Defaults to true, if synchronize() is being used to explicitly copy data, passing false may avoid an unneeded copy. + * @result An IOReturn code. */ + + virtual IOReturn prepare(UInt64 offset = 0, UInt64 length = 0, bool flushCache = true, bool synchronize = true); + +/*! @function complete + * @abstract Complete processing of DMA mappings after an I/O transfer is finished. + * @discussion This method should not be called unless a prepare was previously issued; the prepare() and complete() must occur in pairs, before and after an I/O transfer + * @param invalidateCache Invalidate the caches for the memory descriptor. Defaults to true for kNonCoherent and is ignored by the other types. + * @param synchronize Copy any buffered data back to the target IOMemoryDescriptor. Defaults to true, if synchronize() is being used to explicitly copy data, passing false may avoid an unneeded copy. + * @result kIOReturnNotReady if not prepared, kIOReturnSuccess otherwise. */ + + virtual IOReturn complete(bool invalidateCache = true, bool synchronize = true); + +/*! @function synchronize + * @abstract Bring IOMemoryDescriptor and IODMACommand buffers into sync. + * @discussion This method should not be called unless a prepare was previously issued. If needed a caller may synchronize any IODMACommand buffers with the original IOMemoryDescriptor buffers. + * @param options Specifies the direction of the copy: + * kIODirectionOut copy IOMemoryDesciptor memory to any IODMACommand buffers. By default this action takes place automatically at prepare(). + * kIODirectionIn copy any IODMACommand buffers back to the IOMemoryDescriptor. By default this action takes place automatically at complete(). + * kForceDoubleBuffer copy the entire prepared range to a new page aligned buffer. + * @result kIOReturnNotReady if not prepared, kIOReturnBadArgument if invalid options are passed, kIOReturnSuccess otherwise. */ + + virtual IOReturn synchronize(IOOptionBits options); + +/*! @function genIOVMSegments + * @abstract Generates a physical scatter/gather for the current DMA command + * @discussion Generates a list of physical segments from the given memory descriptor, relative to the current position of the descriptor. The constraints that are set during initialisation will be respected. This function maintains the state across multiple calls for efficiency. However the state is discarded if the new offset is not the expected one. + * @param offset input/output parameter, defines the starting and ending offset in the memory descriptor, relative to any offset passed to the prepare() method. + * @param segments Void pointer to base of output physical scatter/gather list. Always passed directly onto the SegmentFunction. + * @param numSegments Input/output parameter Number of segments that can fit in the segment array and returns number of segments generated. + * @result kIOReturnSuccess on success, kIOReturnOverrun if the memory descriptor is exhausted, kIOReturnMessageTooLarge if the output segment function's address bits has insufficient resolution for a segment, kIOReturnNotReady if the DMA command has not be prepared, kIOReturnBadArgument if the DMA command doesn't have a memory descriptor yet or some of the parameters are NULL and kIOReturnNotReady if the DMA command is not prepared. + */ + virtual IOReturn genIOVMSegments(UInt64 *offset, + void *segments, + UInt32 *numSegments); + +private: + virtual UInt64 transfer( IOOptionBits transferOp, UInt64 offset, void * buffer, UInt64 length ); + +public: + +/*! @function writeBytes + * @abstract Copy data to the IODMACommand's buffer from the specified buffer. + * @discussion This method copies data to the IODMACommand's memory at the given offset, from the caller's buffer. The IODMACommand must be prepared, and the offset is relative to the prepared offset. + * @param offset A byte offset into the IODMACommand's memory, relative to the prepared offset. + * @param bytes The caller supplied buffer to copy the data from. + * @param length The length of the data to copy. + * @result The number of bytes copied, zero will be returned if the specified offset is beyond the prepared length of the IODMACommand. */ + + UInt64 writeBytes(UInt64 offset, const void *bytes, UInt64 length); + +/*! @function readBytes + * @abstract Copy data from the IODMACommand's buffer to the specified buffer. + * @discussion This method copies data from the IODMACommand's memory at the given offset, to the caller's buffer. The IODMACommand must be prepared, and the offset is relative to the prepared offset. + * @param offset A byte offset into the IODMACommand's memory, relative to the prepared offset. + * @param bytes The caller supplied buffer to copy the data to. + * @param length The length of the data to copy. + * @result The number of bytes copied, zero will be returned if the specified offset is beyond the prepared length of the IODMACommand. */ + + UInt64 readBytes(UInt64 offset, void *bytes, UInt64 length); + +/*! @function gen32IOVMSegments + * @abstract Helper function for a type checked call to genIOVMSegments(qv), for use with an IODMACommand set up with the output function kIODMACommandOutputHost32, kIODMACommandOutputBig32, or kIODMACommandOutputLittle32. If the output function of the IODMACommand is not a 32 bit function, results will be incorrect. + */ + inline IOReturn + gen32IOVMSegments(UInt64 *offset, + Segment32 *segments, + UInt32 *numSegments) + { + return genIOVMSegments(offset, segments, numSegments); + } + +/*! @function gen64IOVMSegments + * @abstract Helper function for a type checked call to genIOVMSegments(qv), for use with an IODMACommand set up with the output function kIODMACommandOutputHost64, kIODMACommandOutputBig64, or kIODMACommandOutputLittle64. If the output function of the IODMACommand is not a 64 bit function, results will be incorrect. + */ + inline IOReturn + gen64IOVMSegments(UInt64 *offset, + Segment64 *segments, + UInt32 *numSegments) + { + return genIOVMSegments(offset, segments, numSegments); + } + + IOReturn + genIOVMSegments(SegmentFunction segmentFunction, + UInt64 *offsetP, + void *segmentsP, + UInt32 *numSegmentsP); + + virtual void free() APPLE_KEXT_OVERRIDE; + +private: + IOReturn setSpecification(SegmentFunction outSegFunc, + const SegmentOptions * segmentOptions, + uint32_t mappingOptions, + IOMapper * mapper); + + typedef IOReturn (*InternalSegmentFunction)( + void *reference, + IODMACommand *target, + Segment64 segment, + void *segments, + UInt32 segmentIndex); + + IOReturn genIOVMSegments(uint32_t op, + InternalSegmentFunction outSegFunc, + void *reference, + UInt64 *offsetP, + void *segmentsP, + UInt32 *numSegmentsP); + + static IOReturn clientOutputSegment( + void *reference, IODMACommand *target, + Segment64 segment, void *vSegList, UInt32 outSegIndex); + + static IOReturn segmentOp( + void *reference, + IODMACommand *target, + Segment64 segment, + void *segments, + UInt32 segmentIndex); + IOReturn walkAll(UInt8 op); + +public: + +/*! @function prepareWithSpecification + * @abstract Prepare the memory for an I/O transfer with a new specification. + * @discussion Allocate the mapping resources neccessary for this transfer, specifying a sub range of the IOMemoryDescriptor that will be the target of the I/O. The complete() method frees these resources. Data may be copied to buffers for kIODirectionOut memory descriptors, depending on hardware mapping resource availabilty or alignment restrictions. It should be noted that the this function may block and should only be called on the clients context, i.e never call this routine while gated; also the call itself is not thread safe though this should be an issue as each IODMACommand is independant. + * @param outSegFunc SegmentFunction to call to output one physical segment. A set of nine commonly required segment functions are provided. + * @param numAddressBits Number of bits that the hardware uses on its internal address bus. Typically 32 but may be more on modern hardware. A 0 implies no-restriction other than that implied by the output segment function. + * @param maxSegmentSize Maximum allowable size for one segment. Defaults to 0 which means any size. + * @param mappingOptions is the type of mapping that is required to translate an IOMemoryDescriptor into the desired number of bits. For instance if your hardware only supports 32 bits but must run on machines with > 4G of RAM some mapping will be required. Number of bits will be specified in numAddressBits, see below.This parameter can take 3 values:- kNonCoherent - used for non-coherent hardware transfers, Mapped - Validate that all I/O bus generated addresses are within the number of addressing bits specified, Bypassed indicates that bypassed addressing is required, this is used when the hardware transferes are into coherent memory but no mapping is required. See also prepare() for failure cases. + * @param maxTransferSize Maximum size of an entire transfer. Defaults to 0 indicating no maximum. + * @param alignment Alignment restriction, in bytes, on I/O bus addresses. Defaults to single byte alignment. + * @param mapper For mapping types kMapped & kBypassed mapper is used to define the hardware that will perform the mapping, defaults to the system mapper. + * @param offset defines the starting offset in the memory descriptor the DMA command will operate on. genIOVMSegments will produce its results based on the offset and length passed to the prepare method. + * @param length defines the ending position in the memory descriptor the DMA command will operate on. genIOVMSegments will produce its results based on the offset and length passed to the prepare method. + * @param flushCache Flush the caches for the memory descriptor and make certain that the memory cycles are complete. Defaults to true for kNonCoherent and is ignored by the other types. + * @param synchronize Copy any buffered data back from the target IOMemoryDescriptor. Defaults to true, if synchronize() is being used to explicitly copy data, passing false may avoid an unneeded copy. + * @result An IOReturn code. Can fail if the mapping type is not recognised, if one of the 3 mandatory parameters are set to 0, if a 32 bit output function is selected when more than 32 bits of address is required or, if kBypassed is requested on a machine that doesn't support bypassing. + */ + + virtual IOReturn prepareWithSpecification(SegmentFunction outSegFunc, + UInt8 numAddressBits, + UInt64 maxSegmentSize, + MappingOptions mappingOptions = kMapped, + UInt64 maxTransferSize = 0, + UInt32 alignment = 1, + IOMapper *mapper = NULL, + UInt64 offset = 0, + UInt64 length = 0, + bool flushCache = true, + bool synchronize = true); + + static IOReturn transferSegment(void *reference, + IODMACommand *target, + Segment64 segment, + void *segments, + UInt32 segmentIndex); + +/*! @function getPreparedOffsetAndLength + * @abstract Returns the offset and length into the target IOMemoryDescriptor of a prepared IODDMACommand. + * @discussion If successfully prepared, returns the offset and length into the IOMemoryDescriptor. Will fail for an unprepared IODMACommand. + * @param offset returns the starting offset in the memory descriptor the DMA command was prepared with. Pass NULL for don't care. + * @param length returns the length in the memory descriptor the DMA command was prepared with. Pass NULL for don't care. + * @result An IOReturn code. kIOReturnNotReady if the IODMACommand is not prepared. */ + + virtual IOReturn getPreparedOffsetAndLength(UInt64 * offset, UInt64 * length); + + UInt8 getNumAddressBits(void); + UInt32 getAlignment(void); + uint32_t getAlignmentLength(void); + uint32_t getAlignmentInternalSegments(void); + + +/*! @function initWithRefCon + * @abstract Secondary initializer for the IODMACommand class. + * @param refCon Reference Constant + * @result Can fail if super init fails. Returns true otherwise. + */ + + virtual + bool initWithRefCon(void * refCon = NULL); + + virtual + bool initWithSpecification(SegmentFunction outSegFunc, + const SegmentOptions * segmentOptions, + uint32_t mappingOptions, + IOMapper * mapper, + void * refCon); + + virtual + IOReturn prepareWithSpecification(SegmentFunction outSegFunc, + const SegmentOptions * segmentOptions, + uint32_t mappingOptions, + IOMapper * mapper, + uint64_t offset, + uint64_t length, + bool flushCache = true, + bool synchronize = true); + + virtual + IOBufferMemoryDescriptor * createCopyBuffer(IODirection direction, UInt64 length); + +private: + OSMetaClassDeclareReservedUsed(IODMACommand, 0); + OSMetaClassDeclareReservedUsed(IODMACommand, 1); + OSMetaClassDeclareReservedUsed(IODMACommand, 2); + OSMetaClassDeclareReservedUsed(IODMACommand, 3); + OSMetaClassDeclareReservedUsed(IODMACommand, 4); + OSMetaClassDeclareReservedUsed(IODMACommand, 5); + OSMetaClassDeclareReservedUsed(IODMACommand, 6); + OSMetaClassDeclareReservedUnused(IODMACommand, 7); + OSMetaClassDeclareReservedUnused(IODMACommand, 8); + OSMetaClassDeclareReservedUnused(IODMACommand, 9); + OSMetaClassDeclareReservedUnused(IODMACommand, 10); + OSMetaClassDeclareReservedUnused(IODMACommand, 11); + OSMetaClassDeclareReservedUnused(IODMACommand, 12); + OSMetaClassDeclareReservedUnused(IODMACommand, 13); + OSMetaClassDeclareReservedUnused(IODMACommand, 14); + OSMetaClassDeclareReservedUnused(IODMACommand, 15); + +public: +/*! @var fRefCon Reference Constant, client defined publicly avialable */ + void *fRefCon; + +protected: + +/*! @var fMaxSegmentSize Maximum size of one segment in a scatter/gather list */ + UInt64 fMaxSegmentSize; + +/*! @var fMaxTransferSize + * Maximum size of a transfer that this memory cursor is allowed to generate */ + UInt64 fMaxTransferSize; + + UInt32 fAlignMaskLength; + UInt32 fAlignMaskInternalSegments; + +/*! @var fMapper + * Client defined mapper. */ + IOMapper *fMapper; + +/*! @var fMemory + * memory descriptor for current I/O. */ + const IOMemoryDescriptor *fMemory; + +/*! @var fOutSeg The action method called when an event has been delivered */ + SegmentFunction fOutSeg; + +/*! @var fAlignMask + * Alignment restriction mask. */ + UInt32 fAlignMask; + +/*! @var fNumAddressBits + * Number of bits that the hardware can address */ + UInt32 fNumAddressBits; + +/*! @var fNumSegments + * Number of contiguous segments required for the current memory descriptor and desired mapping */ + UInt32 fNumSegments; + +/*! @var fMappingOptions + * What type of I/O virtual address mapping is required for this command */ + uint32_t fMappingOptions; + +/*! @var fActive + * fActive indicates that this DMA command is currently prepared and ready to go */ + UInt32 fActive; + +/*! @var reserved + * Reserved for future use. (Internal use only) */ + struct IODMACommandInternal * reserved; +}; + +IOReturn +IODMACommand:: +weakWithSpecification(IODMACommand **newCommand, + SegmentFunction outSegFunc, + UInt8 numAddressBits, + UInt64 maxSegmentSize, + MappingOptions mapType, + UInt64 maxTransferSize, + UInt32 alignment, + IOMapper *mapper, + void *refCon) +{ + if (!newCommand) { + return kIOReturnBadArgument; + } + + IODMACommand *self = (IODMACommand *) + OSMetaClass::allocClassWithName("IODMACommand"); + if (!self) { + return kIOReturnUnsupported; + } + + IOReturn ret; + bool inited = self-> + initWithSpecification(outSegFunc, + numAddressBits, maxSegmentSize, mapType, + maxTransferSize, alignment, mapper, refCon); + if (inited) { + ret = kIOReturnSuccess; + } else { + self->release(); + self = NULL; + ret = kIOReturnError; + } + + *newCommand = self; + return ret; +}; +#endif /* !_IODMACOMMAND_H */ diff --git a/QualcommWireless/include/IOKit/IODMAController.h b/QualcommWireless/include/IOKit/IODMAController.h new file mode 100644 index 0000000..2d8682c --- /dev/null +++ b/QualcommWireless/include/IOKit/IODMAController.h @@ -0,0 +1,72 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IODMACONTROLLER_H +#define _IOKIT_IODMACONTROLLER_H + +#include +#include +#include + +class IODMAEventSource; + +class IODMAController : public IOService +{ + OSDeclareAbstractStructors(IODMAController); + + friend class IODMAEventSource; + +private: + IOService *_provider; + const OSSymbol *_dmaControllerName; + +protected: + virtual void registerDMAController(IOOptionBits options = 0); + virtual IOReturn initDMAChannel(IOService *provider, IODMAEventSource *dmaES, UInt32 *dmaIndex, UInt32 reqIndex) = 0; + virtual IOReturn startDMACommand(UInt32 dmaIndex, IODMACommand *dmaCommand, IODirection direction, + IOByteCount byteCount = 0, IOByteCount byteOffset = 0) = 0; + virtual IOReturn stopDMACommand(UInt32 dmaIndex, bool flush = false, uint64_t timeout = UINT64_MAX) = 0; + virtual void completeDMACommand(IODMAEventSource *dmaES, IODMACommand *dmaCommand); + virtual void notifyDMACommand(IODMAEventSource *dmaES, IODMACommand *dmaCommand, IOReturn status, IOByteCount actualByteCount, AbsoluteTime timeStamp); + virtual IOReturn queryDMACommand(UInt32 dmaIndex, IODMACommand **dmaCommand, IOByteCount *transferCount, bool waitForIdle = false) = 0; + virtual IOByteCount getFIFODepth(UInt32 dmaIndex, IODirection direction) = 0; + virtual IOReturn setFIFODepth(UInt32 dmaIndex, IOByteCount depth) = 0; + virtual IOByteCount validFIFODepth(UInt32 dmaIndex, IOByteCount depth, IODirection direction) = 0; + virtual IOReturn setFrameSize(UInt32 dmaIndex, UInt8 byteCount) = 0; + virtual IOReturn setDMAConfig(UInt32 dmaIndex, IOService *provider, UInt32 reqIndex) = 0; + virtual bool validDMAConfig(UInt32 dmaIndex, IOService *provider, UInt32 reqIndex) = 0; + +public: + static const OSSymbol *createControllerName(UInt32 phandle); + static IODMAController *getController(IOService *provider, UInt32 dmaIndex); + + virtual bool start(IOService *provider) APPLE_KEXT_OVERRIDE; +}; + + +#endif /* _IOKIT_IODMACONTROLLER_H */ diff --git a/QualcommWireless/include/IOKit/IODMAEventSource.h b/QualcommWireless/include/IOKit/IODMAEventSource.h new file mode 100644 index 0000000..5b26e08 --- /dev/null +++ b/QualcommWireless/include/IOKit/IODMAEventSource.h @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2005 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IODMAEVENTSOURCE_H +#define _IOKIT_IODMAEVENTSOURCE_H + +#include +#include +#include +#include + +class IODMAController; + +class IODMAEventSource : public IOEventSource +{ + OSDeclareDefaultStructors(IODMAEventSource); + + friend class IODMAController; + +public: + typedef void (*Action)(OSObject *owner, IODMAEventSource *dmaES, IODMACommand *dmaCommand, IOReturn status, IOByteCount actualByteCount, AbsoluteTime timeStamp); +#define IODMAEventAction IODMAEventSource::Action + +protected: + virtual void completeDMACommand(IODMACommand *dmaCommand); + virtual void notifyDMACommand(IODMACommand *dmaCommand, IOReturn status, IOByteCount actualByteCount, AbsoluteTime timeStamp); + +public: + static IODMAEventSource *dmaEventSource(OSObject *owner, + IOService *provider, + Action completion = NULL, + Action notification = NULL, + UInt32 dmaIndex = 0); + + virtual IOReturn startDMACommand(IODMACommand *dmaCommand, IODirection direction, IOByteCount byteCount = 0, IOByteCount byteOffset = 0); + virtual IOReturn stopDMACommand(bool flush = false, uint64_t timeout = UINT64_MAX); + + virtual IOReturn queryDMACommand(IODMACommand **dmaCommand, IOByteCount *transferCount, bool waitForIdle = false); + + virtual IOByteCount getFIFODepth(IODirection direction = kIODirectionNone); + virtual IOReturn setFIFODepth(IOByteCount depth); + virtual IOByteCount validFIFODepth(IOByteCount depth, IODirection direction); + + virtual IOReturn setFrameSize(UInt8 byteCount); + + virtual IOReturn setDMAConfig(UInt32 dmaIndex); + virtual bool validDMAConfig(UInt32 dmaIndex); + +private: + IOService *dmaProvider; + IODMAController *dmaController; + UInt32 dmaIndex; + queue_head_t dmaCommandsCompleted; + IOSimpleLock *dmaCommandsCompletedLock; + Action dmaCompletionAction; + Action dmaNotificationAction; + bool dmaSynchBusy; + + virtual bool init(OSObject *owner, + IOService *provider, + Action completion = NULL, + Action notification = NULL, + UInt32 dmaIndex = 0); + virtual bool checkForWork(void) APPLE_KEXT_OVERRIDE; + virtual void free(void) APPLE_KEXT_OVERRIDE; +}; + +#endif /* _IOKIT_IODMAEVENTSOURCE_H */ diff --git a/QualcommWireless/include/IOKit/IODataQueue.h b/QualcommWireless/include/IOKit/IODataQueue.h new file mode 100644 index 0000000..c16d03f --- /dev/null +++ b/QualcommWireless/include/IOKit/IODataQueue.h @@ -0,0 +1,158 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IODATAQUEUE_H +#define _IOKIT_IODATAQUEUE_H + +#ifndef DISABLE_DATAQUEUE_WARNING +#warning "IODataQueue is deprecated due to security issues in its interfaces, please use IOSharedDataQueue instead" +#endif + + +#include +#include +#include +#include + +typedef struct _IODataQueueMemory IODataQueueMemory; +class IOMemoryDescriptor; + +struct _notifyMsg { + mach_msg_header_t h; +}; + + +#ifdef dequeue +#undef dequeue +#endif +#ifdef enqueue +#undef enqueue +#endif + +/*! + * @class IODataQueue : public OSObject + * @abstract A generic queue designed to pass data from the kernel to a user process. + * @discussion The IODataQueue class is designed to allow kernel code to queue data to a user process. IODataQueue objects are designed to be used in a single producer / single consumer situation. As such, there are no locks on the data itself. Because the kernel enqueue and user-space dequeue methods follow a strict set of guidelines, no locks are necessary to maintain the integrity of the data struct. + * + *
Each data entry can be variable sized, but the entire size of the queue data region (including overhead for each entry) must be specified up front. + * + *
In order for the IODataQueue instance to notify the user process that data is available, a notification mach port must be set. When the queue is empty and a new entry is added, a message is sent to the specified port. + * + *
User client code exists in the IOKit framework that facilitates the creation of the receive notification port as well as the listen process for new data available notifications. + * + *
In order to make the data queue memory available to a user process, the method getMemoryDescriptor() must be used to get an IOMemoryDescriptor instance that can be mapped into a user process. Typically, the clientMemoryForType() method on an IOUserClient instance will be used to request the IOMemoryDescriptor and then return it to be mapped into the user process. + */ +#ifndef DISABLE_DATAQUEUE_WARNING +class __attribute__((deprecated)) IODataQueue: public OSObject +#else +class IODataQueue : public OSObject +#endif +{ + OSDeclareDefaultStructors(IODataQueue); + +protected: + IODataQueueMemory * dataQueue; + + void * notifyMsg; + + virtual void free() APPLE_KEXT_OVERRIDE; + +/*! + * @function sendDataAvailableNotification + * @abstract Sends a dataAvailableNotification message to the specified mach port. + * @discussion This method sends a message to the mach port passed to setNotificationPort(). It is used to indicate that data is available in the queue. + */ + virtual void sendDataAvailableNotification(); + +public: +/*! + * @function withCapacity + * @abstract Static method that creates a new IODataQueue instance with the capacity specified in the size parameter. + * @discussion The actual size of the entire data queue memory region (to be shared into a user process) is equal to the capacity plus the IODataQueueMemory overhead. This overhead value can be determined from the DATA_QUEUE_MEMORY_HEADER_SIZE macro in . The size of the data queue memory region must include space for the overhead of each IODataQueueEntry. This entry overhead can be determined from the DATA_QUEUE_ENTRY_HEADER_SIZE macro in .
This method allocates a new IODataQueue instance and then calls initWithCapacity() with the given size parameter. If the initWithCapacity() fails, the new instance is released and zero is returned. + * @param size The size of the data queue memory region. + * @result Returns the newly allocated IODataQueue instance. Zero is returned on failure. + */ + static IODataQueue *withCapacity(UInt32 size); + +/*! + * @function withEntries + * @abstract Static method that creates a new IODataQueue instance with the specified number of entries of the given size. + * @discussion This method will create a new IODataQueue instance with enough capacity for numEntries of entrySize. It does account for the IODataQueueEntry overhead for each entry. Note that the numEntries and entrySize are simply used to determine the data region size. They do not actually restrict the size of number of entries that can be added to the queue.
This method allocates a new IODataQueue instance and then calls initWithEntries() with the given numEntries and entrySize parameters. If the initWithEntries() fails, the new instance is released and zero is returned. + * @param numEntries Number of entries to allocate space for. + * @param entrySize Size of each entry. + * @result Reeturns the newly allocated IODataQueue instance. Zero is returned on failure. + */ + static IODataQueue *withEntries(UInt32 numEntries, UInt32 entrySize); + +/*! + * @function initWithCapacity + * @abstract Initializes an IODataQueue instance with the capacity specified in the size parameter. + * @discussion The actual size of the entire data queue memory region (to be shared into a user process) is equal to the capacity plus the IODataQueueMemory overhead. This overhead value can be determined from the DATA_QUEUE_MEMORY_HEADER_SIZE macro in . The size of the data queue memory region must include space for the overhead of each IODataQueueEntry. This entry overhead can be determined from the DATA_QUEUE_ENTRY_HEADER_SIZE macro in . + * @param size The size of the data queue memory region. + * @result Returns true on success and false on failure. + */ + virtual Boolean initWithCapacity(UInt32 size); + +/*! + * @function initWithEntries + * @abstract Initializes an IODataQueue instance with the specified number of entries of the given size. + * @discussion This method will initialize an IODataQueue instance with enough capacity for numEntries of entrySize. It does account for the IODataQueueEntry overhead for each entry. Note that the numEntries and entrySize are simply used to determine the data region size. They do not actually restrict the size of number of entries that can be added to the queue.
This method allocates a new IODataQueue instance and then calls initWithEntries() with the given numEntries and entrySize parameters. + * @param numEntries Number of entries to allocate space for. + * @param entrySize Size of each entry. + * @result Reeturns true on success and false on failure. + */ + virtual Boolean initWithEntries(UInt32 numEntries, UInt32 entrySize); + +/*! + * @function enqueue + * @abstract Enqueues a new entry on the queue. + * @discussion This method adds a new data entry of dataSize to the queue. It sets the size parameter of the entry pointed to by the tail value and copies the memory pointed to by the data parameter in place in the queue. Once that is done, it moves the tail to the next available location. When attempting to add a new entry towards the end of the queue and there isn't enough space at the end, it wraps back to the beginning.
If the queue is empty when a new entry is added, sendDataAvailableNotification() is called to send a message to the user process that data is now available. + * @param data Pointer to the data to be added to the queue. + * @param dataSize Size of the data pointed to by data. + * @result Returns true on success and false on failure. Typically failure means that the queue is full. + */ + virtual Boolean enqueue(void *data, UInt32 dataSize); + +/*! + * @function setNotificationPort + * @abstract Creates a simple mach message targeting the mach port specified in port. + * @discussion This message is sent when data is added to an empty queue. It is to notify a user process that new data has become available. + * @param port The mach port to target with the notification message. + */ + virtual void setNotificationPort(mach_port_t port); + +/*! + * @function getMemoryDescriptor + * @abstract Returns a memory descriptor covering the IODataQueueMemory region. + * @discussion The IOMemoryDescriptor instance returned by this method is intended to be mapped into a user process. This is the memory region that the IODataQueueClient code operates on. + * @result Returns a newly allocated IOMemoryDescriptor for the IODataQueueMemory region. Returns zero on failure. + */ + virtual IOMemoryDescriptor *getMemoryDescriptor(); +}; + +#endif /* _IOKIT_IODATAQUEUE_H */ diff --git a/QualcommWireless/include/IOKit/IODataQueueShared.h b/QualcommWireless/include/IOKit/IODataQueueShared.h new file mode 100644 index 0000000..0e8c7b4 --- /dev/null +++ b/QualcommWireless/include/IOKit/IODataQueueShared.h @@ -0,0 +1,91 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IODATAQUEUESHARED_H +#define _IOKIT_IODATAQUEUESHARED_H + +#include +#include +#include + +/*! + * @typedef IODataQueueEntry + * @abstract Represents an entry within the data queue + * @discussion This is a variable sized struct. The data field simply represents the start of the data region. The size of the data region is stored in the size field. The whole size of the specific entry is the size of a UInt32 plus the size of the data region. + * @field size The size of the following data region. + * @field data Represents the beginning of the data region. The address of the data field is a pointer to the start of the data region. + */ +typedef struct _IODataQueueEntry { + UInt32 size; + UInt8 data[4]; +} IODataQueueEntry; + +/*! + * @typedef IODataQueueMemory + * @abstract A struct mapping to the header region of a data queue. + * @discussion This struct is variable sized. The struct represents the data queue header information plus a pointer to the actual data queue itself. The size of the struct is the combined size of the header fields (3 * sizeof(UInt32)) plus the actual size of the queue region. This size is stored in the queueSize field. + * @field queueSize The size of the queue region pointed to by the queue field. + * @field head The location of the queue head. This field is represented as a byte offset from the beginning of the queue memory region. + * @field tail The location of the queue tail. This field is represented as a byte offset from the beginning of the queue memory region. + * @field queue Represents the beginning of the queue memory region. The size of the region pointed to by queue is stored in the queueSize field. + */ +typedef struct _IODataQueueMemory { + UInt32 queueSize; + volatile UInt32 head; + volatile UInt32 tail; + IODataQueueEntry queue[1]; +} IODataQueueMemory; + +/*! + * @typedef IODataQueueAppendix + * @abstract A struct mapping to the appendix region of a data queue. + * @discussion This struct is variable sized dependent on the version. The struct represents the data queue appendix information. + * @field version The version of the queue appendix. + * @field msgh Mach message header containing the notification mach port associated with this queue. + */ +typedef struct _IODataQueueAppendix { + UInt32 version; + mach_msg_header_t msgh; +} IODataQueueAppendix; + +/*! + * @defined DATA_QUEUE_ENTRY_HEADER_SIZE Represents the size of the data queue entry header independent of the actual size of the data in the entry. This is the overhead of each entry in the queue. The total size of an entry is equal to this value plus the size stored in the entry's size field (in IODataQueueEntry). + */ +#define DATA_QUEUE_ENTRY_HEADER_SIZE (sizeof(IODataQueueEntry) - 4) + +/*! + * @defined DATA_QUEUE_MEMORY_HEADER_SIZE Represents the size of the data queue memory header independent of the actual size of the queue data itself. The total size of the queue memory is equal to this value plus the size of the queue appendix and the size of the queue data region which is stored in the queueSize field of IODataQueueMeory. + */ +#define DATA_QUEUE_MEMORY_HEADER_SIZE (sizeof(IODataQueueMemory) - sizeof(IODataQueueEntry)) + +/*! + * @defined DATA_QUEUE_MEMORY_APPENDIX_SIZE Represents the size of the data queue memory appendix independent of the actual size of the queue data itself. The total size of the queue memory is equal to this value plus the size of queue header and size of the queue data region which is stored in the queueSize field of IODataQueueMeory. + */ +#define DATA_QUEUE_MEMORY_APPENDIX_SIZE (sizeof(IODataQueueAppendix)) + +#endif /* _IOKIT_IODATAQUEUESHARED_H */ diff --git a/QualcommWireless/include/IOKit/IODeviceMemory.h b/QualcommWireless/include/IOKit/IODeviceMemory.h new file mode 100644 index 0000000..dadc043 --- /dev/null +++ b/QualcommWireless/include/IOKit/IODeviceMemory.h @@ -0,0 +1,98 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1998 Apple Computer, Inc. All rights reserved. + * + * HISTORY + * + */ + +#ifndef _IOKIT_IODEVICEMEMORY_H +#define _IOKIT_IODEVICEMEMORY_H + +#include + +/*! @class IODeviceMemory + * @abstract An IOMemoryDescriptor used for device physical memory ranges. + * @discussion The IODeviceMemory class is a simple subclass of IOMemoryDescriptor that uses its methods to describe a single range of physical memory on a device. IODeviceMemory objects are usually looked up with IOService or IOPCIDevice accessors, and are created by memory-mapped bus families. IODeviceMemory implements only some factory methods in addition to the methods of IOMemoryDescriptor. + */ + +class IODeviceMemory : public IOMemoryDescriptor +{ + OSDeclareDefaultStructors(IODeviceMemory); + +public: + +/*! @struct InitElement + * @field start First physical address in the range. + * @field length Length of the range. + * @field tag 32-bit value not interpreted by IODeviceMemory or IOMemoryDescriptor, for use by the bus family. */ + + struct InitElement { + IOPhysicalAddress start; + IOPhysicalLength length; + IOOptionBits tag; + }; + +/*! @function arrayFromList + * @abstract Constructs an OSArray of IODeviceMemory instances, each describing one physical range, and a tag value. + * @discussion This method creates IODeviceMemory instances for each physical range passed in an IODeviceMemory::InitElement array. Each element consists of a physical address, length and tag value for the IODeviceMemory. The instances are returned as a created OSArray. + * @param list An array of IODeviceMemory::InitElement structures. + * @param count The number of elements in the list. + * @result Returns a created OSArray of IODeviceMemory objects, to be released by the caller, or zero on failure. */ + + static OSArray * arrayFromList( + InitElement list[], + IOItemCount count ); + +/*! @function withRange + * @abstract Constructs an IODeviceMemory instance, describing one physical range. + * @discussion This method creates an IODeviceMemory instance for one physical range passed as a physical address and length. It just calls IOMemoryDescriptor::withPhysicalAddress. + * @param start The physical address of the first byte in the memory. + * @param length The length of memory. + * @result Returns the created IODeviceMemory on success, to be released by the caller, or zero on failure. */ + + static IODeviceMemory * withRange( + IOPhysicalAddress start, + IOPhysicalLength length ); + +/*! @function withSubRange + * @abstract Constructs an IODeviceMemory instance, describing a subset of an existing IODeviceMemory range. + * @discussion This method creates an IODeviceMemory instance for a subset of an existing IODeviceMemory range, passed as a physical address offset and length. It just calls IOMemoryDescriptor::withSubRange. + * @param of The parent IODeviceMemory of which a subrange is to be used for the new descriptor, which will be retained by the subrange IODeviceMemory. + * @param offset A byte offset into the parent's memory. + * @param length The length of the subrange. + * @result Returns the created IODeviceMemory on success, to be released by the caller, or zero on failure. */ + + static IODeviceMemory * withSubRange( + IODeviceMemory * of, + IOPhysicalAddress offset, + IOPhysicalLength length ); +}; + +#endif /* ! _IOKIT_IODEVICEMEMORY_H */ diff --git a/QualcommWireless/include/IOKit/IODeviceTreeSupport.h b/QualcommWireless/include/IOKit/IODeviceTreeSupport.h new file mode 100644 index 0000000..105b86b --- /dev/null +++ b/QualcommWireless/include/IOKit/IODeviceTreeSupport.h @@ -0,0 +1,134 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1998 Apple Computer, Inc. All rights reserved. + * + * HISTORY + * + */ + +#ifndef _IOKIT_IODEVICETREE_H +#define _IOKIT_IODEVICETREE_H + +#include +#include + +class IODeviceMemory; +class IOService; + +extern const IORegistryPlane * gIODTPlane; + +extern const OSSymbol * gIODTPHandleKey; + +extern const OSSymbol * gIODTCompatibleKey; +extern const OSSymbol * gIODTTypeKey; +extern const OSSymbol * gIODTModelKey; +extern const OSSymbol * gIODTTargetTypeKey; + +extern const OSSymbol * gIODTAAPLInterruptsKey; +extern const OSSymbol * gIODTDefaultInterruptController; +extern const OSSymbol * gIODTNWInterruptMappingKey; + +LIBKERN_RETURNS_NOT_RETAINED IORegistryEntry * IODeviceTreeAlloc( void * dtTop ); + + +bool IODTMatchNubWithKeys( IORegistryEntry * nub, + const char * keys ); + +bool IODTCompareNubName( const IORegistryEntry * regEntry, + OSString * name, + LIBKERN_RETURNS_RETAINED_ON_NONZERO OSString ** matchingName ); + +enum { + kIODTRecursive = 0x00000001, + kIODTExclusive = 0x00000002 +}; + +OSCollectionIterator * IODTFindMatchingEntries( IORegistryEntry * from, + IOOptionBits options, const char * keys ); + +typedef SInt32 (*IODTCompareAddressCellFunc) +(UInt32 cellCount, UInt32 left[], UInt32 right[]); + +typedef void (*IODTNVLocationFunc) +(IORegistryEntry * entry, + UInt8 * busNum, UInt8 * deviceNum, UInt8 * functionNum ); + +void IODTSetResolving( IORegistryEntry * regEntry, + IODTCompareAddressCellFunc compareFunc, + IODTNVLocationFunc locationFunc ); + +void IODTGetCellCounts( IORegistryEntry * regEntry, + UInt32 * sizeCount, UInt32 * addressCount); + +bool IODTResolveAddressCell( IORegistryEntry * regEntry, + UInt32 cellsIn[], + IOPhysicalAddress * phys, IOPhysicalLength * len ); + +LIBKERN_RETURNS_NOT_RETAINED OSArray * +IODTResolveAddressing( IORegistryEntry * regEntry, + const char * addressPropertyName, + IODeviceMemory * parent ); + +struct IONVRAMDescriptor { + unsigned int format:4; + unsigned int marker:1; + unsigned int bridgeCount:3; + unsigned int busNum:2; + unsigned int bridgeDevices:6 * 5; + unsigned int functionNum:3; + unsigned int deviceNum:5; +} __attribute__((aligned(2), packed)); + +IOReturn IODTMakeNVDescriptor( IORegistryEntry * regEntry, + IONVRAMDescriptor * hdr ); + +LIBKERN_RETURNS_NOT_RETAINED OSData * +IODTFindSlotName( IORegistryEntry * regEntry, UInt32 deviceNumber ); + +const OSSymbol * IODTInterruptControllerName( + IORegistryEntry * regEntry ); + +bool IODTMapInterrupts( IORegistryEntry * regEntry ); + +enum { + kIODTInterruptShared = 0x00000001 +}; +IOReturn IODTGetInterruptOptions( IORegistryEntry * regEntry, int source, IOOptionBits * options ); + +#ifdef __cplusplus +extern "C" { +#endif + +IOReturn IONDRVLibrariesInitialize( IOService * provider ); + +#ifdef __cplusplus +} +#endif + +#endif /* _IOKIT_IODEVICETREE_H */ diff --git a/QualcommWireless/include/IOKit/IOEventSource.h b/QualcommWireless/include/IOKit/IOEventSource.h new file mode 100644 index 0000000..c57fbfb --- /dev/null +++ b/QualcommWireless/include/IOKit/IOEventSource.h @@ -0,0 +1,285 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1998 Apple Computer, Inc. All rights reserved. + * HISTORY + * 1998-7-13 Godfrey van der Linden(gvdl) + * Created. + * 1998-10-30 Godfrey van der Linden(gvdl) + * Converted to C++ + */ +#ifndef _IOKIT_IOEVENTSOURCE_H +#define _IOKIT_IOEVENTSOURCE_H + +#include + +#include + +#include +#include +#include + +#if IOKITSTATS +#include +#endif + +__BEGIN_DECLS +#include +#include +__END_DECLS + +/*! + * @class IOEventSource : public OSObject + * @abstract Abstract class for all work-loop event sources. + * @discussion The IOEventSource declares the abstract super class that all + * event sources must inherit from if an IOWorkLoop is to receive events from them. + *

+ * An event source can represent any event that should cause the work-loop of a + * device to wake up and perform work. Two examples of event sources are the + * IOInterruptEventSource which delivers interrupt notifications and IOCommandGate + * which delivers command requests. + *

+ * A kernel module can always use the work-loop model for serialising access to + * anything at all. The IOEventSource is used for communicating events to the + * work-loop, and the chain of event sources should be used to walk the possible + * event sources and demultipex them. Note a particular instance of an event + * source may only be a member of 1 linked list chain. If you need to move it + * between chains than make sure it is removed from the original chain before + * attempting to move it. + *

+ * The IOEventSource makes no attempt to maintain the consistency of its internal data across multi-threading. It is assumed that the user of these basic tools will protect the data that these objects represent in some sort of device wide instance lock. For example the IOWorkLoop maintains the event chain by using an IOCommandGate and thus single threading access to its state. + *

+ * All subclasses of IOEventSource that wish to perform work on the work-loop thread are expected to implement the checkForWork() member function. As of Mac OS X, 10.7 (Darwin 11), checkForWork is no longer pure virtual, and should not be overridden if there is no work to be done. + * + *

+ * checkForWork() is the key method in this class. It is called by some work-loop when convienient and is expected to evaluate its internal state and determine if an event has occurred since the last call. In the case of an event having occurred then the instance defined target(owner)/action will be called. The action is stored as an ordinary C function pointer but the first parameter is always the owner. This means that a C++ member function can be used as an action function though this depends on the ABI. + *

+ * Although the eventChainNext variable contains a reference to the next event source in the chain this reference is not retained. The list 'owner' i.e. the client that creates the event, not the work-loop, is expected to retain the source. + */ +class IOEventSource : public OSObject +{ + OSDeclareAbstractStructors(IOEventSource); + friend class IOWorkLoop; +#if IOKITSTATS + friend class IOStatistics; +#endif + +public: +/*! + * @typedef Action + * @discussion Placeholder type for C++ function overloading discrimination. + * As the all event sources require an action and it has to be stored somewhere + * and be of some type, this is that type. + * @param owner + * Target of the function, can be used as a refcon. The owner is set + * during initialisation. Note if a C++ function was specified this parameter + * is implicitly the first paramter in the target member function's parameter list. + */ + typedef void (*Action)(OSObject *owner, ...); + +/*! @defined IOEventSourceAction + * @discussion Backward compatibilty define for the old non-class scoped type definition. See $link IOEventSource::Action */ + #define IOEventSourceAction IOEventSource::Action + +#ifdef __BLOCKS__ + typedef IOReturn (^ActionBlock)(); +#endif /* __BLOCKS__ */ + +protected: +/*! @var eventChainNext + * The next event source in the event chain. nil at end of chain. */ + IOEventSource *eventChainNext; + +/*! @var owner The owner object called when an event has been delivered. */ + OSObject *owner; + +/*! @var action + * The action method called when an event has been delivered */ + + Action action; + +/*! @var enabled + * Is this event source enabled to deliver requests to the work-loop. */ + bool enabled; + + +/*! @var workLoop What is the work-loop for this event source. */ + IOWorkLoop *workLoop; + +/*! @var refcon What ever the client wants to do, see $link setRefcon. */ + void *refcon; + +/*! @struct ExpansionData + * @discussion This structure will be used to expand the capablilties of the IOEventSource in the future. + */ + struct ExpansionData { +#if IOKITSTATS + struct IOEventSourceCounter *counter; +#else + void *iokitstatsReserved; +#endif + }; + +/*! @var reserved + * Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + +/*! @function init + * @abstract Primary initialiser for the IOEventSource class. + * @param owner + * Owner of this instance of an event source. Used as the first parameter + * of the action callout. Owner must be an OSObject. + * @param action + * Pointer to C call out function. Action is a pointer to a C function + * that gets called when this event source has outstanding work. It will usually + * be called by the checkForWork member function. The first parameter of the + * action call out will always be the owner, this allows C++ member functions to + * be used as actions. Defaults to 0. + * @result true if the inherited classes and this instance initialise + * successfully. + */ + virtual bool init(OSObject *owner, IOEventSource::Action action = NULL); + + virtual void free( void ) APPLE_KEXT_OVERRIDE; + +/*! @function checkForWork + * @abstract Virtual member function used by IOWorkLoop for work + * scheduling. + * @discussion This function will be called to request a subclass to check + * its internal state for any work to do and then to call out the owner/action. + * If this event source never performs any work (e.g. IOCommandGate), this + * method should not be overridden. NOTE: This method is no longer declared pure + * virtual. A default implementation is provided in IOEventSource. + * @result Return true if this function needs to be called again before all its outstanding events have been processed. + */ + virtual bool checkForWork(); + +/*! @function setWorkLoop + * @abstract Set'ter for $link workLoop variable. + * @param workLoop + * Target work-loop of this event source instance. A subclass of + * IOWorkLoop that at least reacts to signalWorkAvailable() and onThread functions. + */ + virtual void setWorkLoop(IOWorkLoop *workLoop); + +/*! @function setNext + * @abstract Set'ter for $link eventChainNext variable. + * @param next + * Pointer to another IOEventSource instance. + */ + virtual void setNext(IOEventSource *next); + +/*! @function getNext + * @abstract Get'ter for $link eventChainNext variable. + * @result value of eventChainNext. + */ + virtual IOEventSource *getNext() const; + + +protected: +// Methods to access the IOWorkLoop exported fields + void signalWorkAvailable(); + void openGate(); + void closeGate(); + bool tryCloseGate(); + int sleepGate(void *event, UInt32 type); + int sleepGate(void *event, AbsoluteTime deadline, UInt32 type); + void wakeupGate(void *event, bool oneThread); + +public: +/*! @function setAction + * @abstract Set'ter for $link action variable. + * @param action Pointer to a C function of type IOEventSource::Action. */ + virtual void setAction(IOEventSource::Action action); + +/*! @function getAction + * @abstract Get'ter for $link action variable. + * @result value of action. */ + virtual IOEventSource::Action getAction() const; + +#ifdef __BLOCKS__ +/*! @function setActionBlock + * @abstract Setter for action ivar. The current block is released, & the new block is retained. + * @param block Block pointer of type IOEventSource::ActionBlock. */ + void setActionBlock(ActionBlock block); +/*! @function getActionBlock + * @abstract Getter for action ivar. + * @result Block pointer of type IOEventSource::ActionBlock, if set, or NULL. */ + ActionBlock getActionBlock(ActionBlock) const; +#endif /* __BLOCKS__ */ + +/*! @function setRefcon + * @abstract Setter for refcon ivar. This function will assert if a block action has been set. + * @param refcon Refcon. */ + void setRefcon(void *refcon); +/*! @function getRefcon + * @abstract Getter for refcon ivar. + * @result The refcon. This function will assert if a block action has been set. */ + void * getRefcon() const; + +/*! @function enable + * @abstract Enable event source. + * @discussion A subclass implementation is expected to respect the enabled + * state when checkForWork is called. Calling this function will cause the + * work-loop to be signalled so that a checkForWork is performed. */ + virtual void enable(); + +/*! @function disable + * @abstract Disable event source. + * @discussion A subclass implementation is expected to respect the enabled + * state when checkForWork is called. */ + virtual void disable(); + +/*! @function isEnabled + * @abstract Get'ter for $link enable variable. + * @result true if enabled. */ + virtual bool isEnabled() const; + +/*! @function getWorkLoop + * @abstract Get'ter for $link workLoop variable. + * @result value of workLoop. */ + virtual IOWorkLoop *getWorkLoop() const; + +/*! @function onThread + * @abstract Convenience function for workLoop->onThread. + * @result true if called on the work-loop thread. + */ + virtual bool onThread() const; + +private: + OSMetaClassDeclareReservedUnused(IOEventSource, 0); + OSMetaClassDeclareReservedUnused(IOEventSource, 1); + OSMetaClassDeclareReservedUnused(IOEventSource, 2); + OSMetaClassDeclareReservedUnused(IOEventSource, 3); + OSMetaClassDeclareReservedUnused(IOEventSource, 4); + OSMetaClassDeclareReservedUnused(IOEventSource, 5); + OSMetaClassDeclareReservedUnused(IOEventSource, 6); + OSMetaClassDeclareReservedUnused(IOEventSource, 7); +}; + +#endif /* !_IOKIT_IOEVENTSOURCE_H */ diff --git a/QualcommWireless/include/IOKit/IOFilterInterruptEventSource.h b/QualcommWireless/include/IOKit/IOFilterInterruptEventSource.h new file mode 100644 index 0000000..2719cc1 --- /dev/null +++ b/QualcommWireless/include/IOKit/IOFilterInterruptEventSource.h @@ -0,0 +1,189 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. + * + * HISTORY + * 1999-4-15 Godfrey van der Linden(gvdl) + * Created. + */ +#ifndef _IOKIT_IOFILTERINTERRUPTEVENTSOURCE_H +#define _IOKIT_IOFILTERINTERRUPTEVENTSOURCE_H + +#include + +class IOService; + +/*! @class IOFilterInterruptEventSource : public IOInterruptEventSource + * @abstract Filtering varient of the $link IOInterruptEventSource. + * @discussion An interrupt event source that calls the client to determine if a interrupt event needs to be scheduled on the work loop. A filter interrupt event source call's the client in the primary interrupt context, the client can then interrogate its hardware and determine if the interrupt needs to be processed yet. + *

+ * As the routine is called in the primary interrupt context great care must be taken in the writing of this routine. In general none of the generic IOKit environment is safe to call in this context. We intend this routine to be used by hardware that can interrogate its registers without destroying state. Primarily this variant of event sources will be used by drivers that share interrupts. The filter routine will determine if the interrupt is a real interrupt or a ghost and thus optimise the work thread context switch away. + *

+ * If you are implementing 'SoftDMA' (or pseudo-DMA), you may not want the I/O Kit to automatically start your interrupt handler routine on your work loop when your filter routine returns true. In this case, you may choose to have your filter routine schedule the work on the work loop itself and then return false. If you do this, the interrupt will not be disabled in hardware and you could receive additional primary interrupts before your work loop–level service routine completes. Because this scheme has implications for synchronization between your filter routine and your interrupt service routine, you should avoid doing this unless your driver requires SoftDMA. + *

+ * CAUTION: Called in primary interrupt context, if you need to disable interrupt to guard you registers against an unexpected call then it is better to use a straight IOInterruptEventSource and its secondary interrupt delivery mechanism. + */ +class IOFilterInterruptEventSource : public IOInterruptEventSource +{ + OSDeclareDefaultStructors(IOFilterInterruptEventSource); + +public: +/*! + * @typedef Filter + * @discussion C Function pointer to a routine to call when an interrupt occurs. + * @param owner Pointer to the owning/client instance. + * @param sender Where is the interrupt comming from. + * @result false if this interrupt can be ignored. */ + typedef bool (*Filter)(OSObject *owner, IOFilterInterruptEventSource *sender); + +/*! @defined IOFilterInterruptAction + * @discussion Backward compatibilty define for the old non-class scoped type definition. See $link IOFilterInterruptSource::Filter */ +#define IOFilterInterruptAction IOFilterInterruptEventSource::Filter + +#ifdef __BLOCKS__ + typedef bool (^FilterBlock)(IOFilterInterruptEventSource *sender); +#endif /* __BLOCKS__ */ + +private: +// Hide the superclass initializers + virtual bool init(OSObject *inOwner, + IOInterruptEventSource::Action inAction = NULL, + IOService *inProvider = NULL, + int inIntIndex = 0) APPLE_KEXT_OVERRIDE; + + static IOInterruptEventSource * + interruptEventSource(OSObject *inOwner, + IOInterruptEventSource::Action inAction = NULL, + IOService *inProvider = NULL, + int inIntIndex = 0); + +protected: +/*! @var filterAction Filter callout */ + + Filter filterAction; + +/*! @struct ExpansionData + * @discussion This structure will be used to expand the capablilties of the IOWorkLoop in the future. + */ + struct ExpansionData { }; + +/*! @var reserved + * Reserved for future use. (Internal use only) */ + APPLE_KEXT_WSHADOW_PUSH; + ExpansionData *reserved; + APPLE_KEXT_WSHADOW_POP; + +public: +/*! @function filterInterruptEventSource + * @abstract Factor method to create and initialise an IOFilterInterruptEventSource. See $link init. + * @param owner Owner/client of this event source. + * @param action 'C' Function to call when something happens. + * @param filter 'C' Function to call when interrupt occurs. + * @param provider Service that provides interrupts. + * @param intIndex Defaults to 0. + * @result a new event source if succesful, 0 otherwise. */ + static IOFilterInterruptEventSource * + filterInterruptEventSource(OSObject *owner, + IOInterruptEventSource::Action action, + Filter filter, + IOService *provider, + int intIndex = 0); + +#ifdef __BLOCKS__ +/*! @function filterInterruptEventSource + * @abstract Factor method to create and initialise an IOFilterInterruptEventSource. See $link init. + * @param owner Owner/client of this event source. + * @param provider Service that provides interrupts. + * @param intIndex The index of the interrupt within the provider's interrupt sources. + * @param action Block for the callout routine of this event source. + * @param filter Block to invoke when HW interrupt occurs. + * @result a new event source if succesful, 0 otherwise. */ + static IOFilterInterruptEventSource * + filterInterruptEventSource(OSObject *owner, + IOService *provider, + int intIndex, + IOInterruptEventSource::ActionBlock action, + FilterBlock filter); +#endif /* __BLOCKS__ */ + + +/*! @function init + * @abstract Primary initialiser for the IOFilterInterruptEventSource class. + * @param owner Owner/client of this event source. + * @param action 'C' Function to call when something happens. + * @param filter 'C' Function to call in primary interrupt context. + * @param provider Service that provides interrupts. + * @param intIndex Interrupt source within provider. Defaults to 0. + * @result true if the inherited classes and this instance initialise + * successfully. */ + virtual bool init(OSObject *owner, + IOInterruptEventSource::Action action, + Filter filter, + IOService *provider, + int intIndex = 0); + + virtual void free( void ) APPLE_KEXT_OVERRIDE; + +/*! @function signalInterrupt + * @abstract Cause the work loop to schedule the action. + * @discussion Cause the work loop to schedule the interrupt action even if the filter routine returns 'false'. Note well the interrupting condition MUST be cleared from the hardware otherwise an infinite process interrupt loop will occur. Use this function when SoftDMA is desired. See $link IOFilterInterruptSource::Filter */ + virtual void signalInterrupt(); + +/*! @function getFilterAction + * @abstract Get'ter for filterAction variable. + * @result value of filterAction. */ + virtual Filter getFilterAction() const; + +#ifdef __BLOCKS__ +/*! @function getFilterActionBlock + * @abstract Get'ter for filterAction variable. + * @result value of filterAction. */ + FilterBlock getFilterActionBlock() const; +#endif /* __BLOCKS__ */ + +/*! @function normalInterruptOccurred + * @abstract Override $link IOInterruptEventSource::normalInterruptOccured to make a filter callout. */ + virtual void normalInterruptOccurred(void *self, IOService *prov, int ind) APPLE_KEXT_OVERRIDE; + +/*! @function disableInterruptOccurred + * @abstract Override $link IOInterruptEventSource::disableInterruptOccurred to make a filter callout. */ + virtual void disableInterruptOccurred(void *self, IOService *prov, int ind) APPLE_KEXT_OVERRIDE; + +private: + OSMetaClassDeclareReservedUnused(IOFilterInterruptEventSource, 0); + OSMetaClassDeclareReservedUnused(IOFilterInterruptEventSource, 1); + OSMetaClassDeclareReservedUnused(IOFilterInterruptEventSource, 2); + OSMetaClassDeclareReservedUnused(IOFilterInterruptEventSource, 3); + OSMetaClassDeclareReservedUnused(IOFilterInterruptEventSource, 4); + OSMetaClassDeclareReservedUnused(IOFilterInterruptEventSource, 5); + OSMetaClassDeclareReservedUnused(IOFilterInterruptEventSource, 6); + OSMetaClassDeclareReservedUnused(IOFilterInterruptEventSource, 7); +}; + +#endif /* !_IOKIT_IOFILTERINTERRUPTEVENTSOURCE_H */ diff --git a/QualcommWireless/include/IOKit/IOInterleavedMemoryDescriptor.h b/QualcommWireless/include/IOKit/IOInterleavedMemoryDescriptor.h new file mode 100644 index 0000000..5221ab1 --- /dev/null +++ b/QualcommWireless/include/IOKit/IOInterleavedMemoryDescriptor.h @@ -0,0 +1,122 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef _IOINTERLEAVEDMEMORYDESCRIPTOR_H +#define _IOINTERLEAVEDMEMORYDESCRIPTOR_H + +#include + +/*! @class IOInterleavedMemoryDescriptor : public IOMemoryDescriptor + * @abstract The IOInterleavedMemoryDescriptor object describes a memory area made up of portions of several other IOMemoryDescriptors. + * @discussion The IOInterleavedMemoryDescriptor object represents interleaved ranges of memory, specified as an ordered list of portions of individual IOMemoryDescriptors. The portions are chained end-to-end to make up a single contiguous buffer. */ + +class IOInterleavedMemoryDescriptor : public IOMemoryDescriptor +{ + OSDeclareDefaultStructors(IOInterleavedMemoryDescriptor); + +protected: + + IOByteCount _descriptorCapacity; + UInt32 _descriptorCount; + IOMemoryDescriptor ** _descriptors; + IOByteCount * _descriptorOffsets; + IOByteCount * _descriptorLengths; + bool _descriptorPrepared; + + virtual void free() APPLE_KEXT_OVERRIDE; + +public: + +/*! @function withCapacity + * @abstract Create an IOInterleavedMemoryDescriptor to describe a memory area made up of several other IOMemoryDescriptors. + * @discussion This method creates and initializes an IOInterleavedMemoryDescriptor for memory consisting of portions of a number of other IOMemoryDescriptors, chained end-to-end (in the order they appear in the array) to represent a single contiguous memory buffer. + * @param capacity The maximum number of IOMemoryDescriptors that may be subsequently added to this IOInterleavedMemoryDescriptor. + * @param direction An I/O direction to be associated with the descriptor, which may affect the operation of the prepare and complete methods on some architectures. + * @result The created IOInterleavedMemoryDescriptor on success, to be released by the caller, or zero on failure. */ + + static IOInterleavedMemoryDescriptor * withCapacity( IOByteCount capacity, + IODirection direction); + +/*! @function initWithCapacity + * @abstract Initialize an IOInterleavedMemoryDescriptor to describe a memory area made up of several other IOMemoryDescriptors. + * @discussion This method initializes an IOInterleavedMemoryDescriptor for memory consisting of portions of a number of other IOMemoryDescriptors, chained end-to-end (in the order they appear in the array) to represent a single contiguous memory buffer. + * @param capacity The maximum number of IOMemoryDescriptors that may be subsequently added to this IOInterleavedMemoryDescriptor. + * @param direction An I/O direction to be associated with the descriptor, which may affect the operation of the prepare and complete methods on some architectures. + * @result The created IOInterleavedMemoryDescriptor on success, to be released by the caller, or zero on failure. */ + + virtual bool initWithCapacity( IOByteCount capacity, + IODirection direction ); + +/*! @function clearMemoryDescriptors + * @abstract Clear all of the IOMemoryDescriptors currently contained in and reset the IOInterleavedMemoryDescriptor. + * @discussion Clears each IOMemoryDescriptor by completing (if needed) and releasing. The IOInterleavedMemoryDescriptor is then reset and may accept new descriptors up to the capacity specified when it was created. + * @param direction An I/O direction to be associated with the descriptor, which may affect the operation of the prepare and complete methods on some architectures. */ + + virtual void clearMemoryDescriptors( IODirection direction = kIODirectionNone ); + +/*! @function setMemoryDescriptor + * @abstract Add a portion of an IOMemoryDescriptor to the IOInterleavedMemoryDescriptor. + * @discussion This method adds the portion of an IOMemoryDescriptor described by the offset and length parameters to the end of the IOInterleavedMemoryDescriptor. A single IOMemoryDescriptor may be added as many times as there is room for it. The offset and length must describe a portion entirely within the IOMemoryDescriptor. + * @param descriptor An IOMemoryDescriptor to be added to the IOInterleavedMemoryDescriptor. Its direction must be compatible with that of the IOInterleavedMemoryDescriptor. + * @param offset The offset into the IOMemoryDescriptor of the portion that will be added to the virtualized buffer. + * @param length The length of the portion of the IOMemoryDescriptor to be added to the virtualized buffer. + * @result Returns true the portion was successfully added. */ + + virtual bool setMemoryDescriptor( IOMemoryDescriptor * descriptor, + IOByteCount offset, + IOByteCount length ); + +/*! @function getPhysicalSegment + * @abstract Break a memory descriptor into its physically contiguous segments. + * @discussion This method returns the physical address of the byte at the given offset into the memory, and optionally the length of the physically contiguous segment from that offset. + * @param offset A byte offset into the memory whose physical address to return. + * @param length If non-zero, getPhysicalSegment will store here the length of the physically contiguous segement at the given offset. + * @result A physical address, or zero if the offset is beyond the length of the memory. */ + + virtual addr64_t getPhysicalSegment( IOByteCount offset, + IOByteCount * length, + IOOptionBits options = 0 ) APPLE_KEXT_OVERRIDE; + +/*! @function prepare + * @abstract Prepare the memory for an I/O transfer. + * @discussion This involves paging in the memory, if necessary, and wiring it down for the duration of the transfer. The complete() method completes the processing of the memory after the I/O transfer finishes. This method need not called for non-pageable memory. + * @param forDirection The direction of the I/O to be performed, or kIODirectionNone for the direction specified by the memory descriptor. + * @result An IOReturn code. */ + + virtual IOReturn prepare(IODirection forDirection = kIODirectionNone) APPLE_KEXT_OVERRIDE; + +/*! @function complete + * @abstract Complete processing of the memory after an I/O transfer finishes. + * @discussion This method should not be called unless a prepare was previously issued; the prepare() and complete() must occur in pairs, before and after an I/O transfer involving pageable memory. + * @param forDirection The direction of the I/O just completed, or kIODirectionNone for the direction specified by the memory descriptor. + * @result An IOReturn code. */ + + virtual IOReturn complete(IODirection forDirection = kIODirectionNone) APPLE_KEXT_OVERRIDE; +}; + +#endif /* !_IOINTERLEAVEDMEMORYDESCRIPTOR_H */ diff --git a/QualcommWireless/include/IOKit/IOInterruptController.h b/QualcommWireless/include/IOKit/IOInterruptController.h new file mode 100644 index 0000000..53bdcf5 --- /dev/null +++ b/QualcommWireless/include/IOKit/IOInterruptController.h @@ -0,0 +1,165 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. + * + * DRI: Josh de Cesare + * + */ + + +#ifndef _IOKIT_IOINTERRUPTCONTROLLER_H +#define _IOKIT_IOINTERRUPTCONTROLLER_H + +#include +#include +#include + + +class IOSharedInterruptController; + +struct IOInterruptVector { + volatile char interruptActive; + volatile char interruptDisabledSoft; + volatile char interruptDisabledHard; + volatile char interruptRegistered; + IOLock * interruptLock; + IOService * nub; + int source; + void * target; + IOInterruptHandler handler; + void * refCon; + IOSharedInterruptController *sharedController; +}; + +typedef struct IOInterruptVector IOInterruptVector; + +#if __LP64__ +typedef int32_t IOInterruptVectorNumber; +#else +typedef long IOInterruptVectorNumber; +#endif + +class IOInterruptController : public IOService +{ + OSDeclareAbstractStructors(IOInterruptController); + +protected: + IOInterruptVector *vectors; + IOSimpleLock *controllerLock; + + struct ExpansionData { }; + ExpansionData *ioic_reserved; + +public: + virtual IOReturn registerInterrupt(IOService *nub, int source, + void *target, + IOInterruptHandler handler, + void *refCon); + virtual IOReturn unregisterInterrupt(IOService *nub, int source); + + virtual IOReturn getInterruptType(IOService *nub, int source, + int *interruptType); + + virtual IOReturn enableInterrupt(IOService *nub, int source); + virtual IOReturn disableInterrupt(IOService *nub, int source); + virtual IOReturn causeInterrupt(IOService *nub, int source); + + virtual IOInterruptAction getInterruptHandlerAddress(void); + virtual IOReturn handleInterrupt(void *refCon, IOService *nub, + int source); + +// Methods to be overridden for simplifed interrupt controller subclasses. + + virtual bool vectorCanBeShared(IOInterruptVectorNumber vectorNumber, IOInterruptVector *vector); + virtual void initVector(IOInterruptVectorNumber vectorNumber, IOInterruptVector *vector); + virtual int getVectorType(IOInterruptVectorNumber vectorNumber, IOInterruptVector *vector); + virtual void disableVectorHard(IOInterruptVectorNumber vectorNumber, IOInterruptVector *vector); + virtual void enableVector(IOInterruptVectorNumber vectorNumber, IOInterruptVector *vector); + virtual void causeVector(IOInterruptVectorNumber vectorNumber, IOInterruptVector *vector); + + OSMetaClassDeclareReservedUnused(IOInterruptController, 0); + OSMetaClassDeclareReservedUnused(IOInterruptController, 1); + OSMetaClassDeclareReservedUnused(IOInterruptController, 2); + OSMetaClassDeclareReservedUnused(IOInterruptController, 3); + OSMetaClassDeclareReservedUnused(IOInterruptController, 4); + OSMetaClassDeclareReservedUnused(IOInterruptController, 5); + +public: +// Generic methods (not to be overriden). + + void timeStampSpuriousInterrupt(void); + void timeStampInterruptHandlerStart(IOInterruptVectorNumber vectorNumber, IOInterruptVector *vector); + void timeStampInterruptHandlerEnd(IOInterruptVectorNumber vectorNumber, IOInterruptVector *vector); + +private: + void timeStampInterruptHandlerInternal(bool isStart, IOInterruptVectorNumber vectorNumber, IOInterruptVector *vector); +}; + + +class IOSharedInterruptController : public IOInterruptController +{ + OSDeclareDefaultStructors(IOSharedInterruptController); + +private: + IOService *provider; + int numVectors; + int vectorsRegistered; + int vectorsEnabled; + volatile int controllerDisabled; + bool sourceIsLevel; + + struct ExpansionData { }; + ExpansionData *iosic_reserved __unused; + +public: + virtual IOReturn initInterruptController(IOInterruptController *parentController, OSData *parentSource); + + virtual IOReturn registerInterrupt(IOService *nub, int source, + void *target, + IOInterruptHandler handler, + void *refCon) APPLE_KEXT_OVERRIDE; + virtual IOReturn unregisterInterrupt(IOService *nub, int source) APPLE_KEXT_OVERRIDE; + + virtual IOReturn getInterruptType(IOService *nub, int source, + int *interruptType) APPLE_KEXT_OVERRIDE; + + virtual IOReturn enableInterrupt(IOService *nub, int source) APPLE_KEXT_OVERRIDE; + virtual IOReturn disableInterrupt(IOService *nub, int source) APPLE_KEXT_OVERRIDE; + + virtual IOInterruptAction getInterruptHandlerAddress(void) APPLE_KEXT_OVERRIDE; + virtual IOReturn handleInterrupt(void *refCon, IOService *nub, int source) APPLE_KEXT_OVERRIDE; + + OSMetaClassDeclareReservedUnused(IOSharedInterruptController, 0); + OSMetaClassDeclareReservedUnused(IOSharedInterruptController, 1); + OSMetaClassDeclareReservedUnused(IOSharedInterruptController, 2); + OSMetaClassDeclareReservedUnused(IOSharedInterruptController, 3); +}; + + +#endif /* ! _IOKIT_IOINTERRUPTCONTROLLER_H */ diff --git a/QualcommWireless/include/IOKit/IOInterruptEventSource.h b/QualcommWireless/include/IOKit/IOInterruptEventSource.h new file mode 100644 index 0000000..d18d41e --- /dev/null +++ b/QualcommWireless/include/IOKit/IOInterruptEventSource.h @@ -0,0 +1,260 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1998 Apple Computer, Inc. All rights reserved. + * + * HISTORY + * 1998-7-13 Godfrey van der Linden(gvdl) + * Created. + * 1998-10-30 Godfrey van der Linden(gvdl) + * Converted to C++ + */ + +#ifndef _IOKIT_IOINTERRUPTEVENTSOURCE_H +#define _IOKIT_IOINTERRUPTEVENTSOURCE_H + +#include + +class IOService; + +struct IOInterruptAccountingData; + +/*! @class IOInterruptEventSource : public IOEventSource + * @abstract Event source for interrupt delivery to work-loop based drivers. + * @discussion The IOInterruptEventSource is a generic object that delivers calls interrupt routines in it's client in a guaranteed single-threaded manner. IOInterruptEventSource is part of the IOKit $link IOWorkLoop infrastructure where the semantic that one and only one action method is executing within a work-loops event chain. + *

+ * When the action method is called in the client member function will receive 2 arguments, (IOEventSource *) sender and (int) count, See $link IOInterruptEventSource::Action. Where sender will be reference to the interrupt that occurred and the count will be computed by the difference between the $link producerCount and $link consumerCount. This number may not be reliable as no attempt is made to adjust for around the world type problems but is provided for general information and statistic gathering. + *

+ * In general a client will use the factory member function to create and initialise the event source and then add it to their work-loop. It is the work loop's responsiblity to maintain the new event source in it's event chain. See $link IOWorkLoop. + *

+ * An interrupt event source attaches itself to the given provider's interrupt source at initialisation time. At this time it determines if it is connected to a level or edge triggered interrupt. If the interrupt is an level triggered interrupt the event source automatically disables the interrupt source at primary interrupt time and after it call's the client it automatically reenables the interrupt. This action is fairly expensive but it is 100% safe and defaults sensibly so that the driver writer does not have to implement type dependant interrupt routines. So to repeat, the driver writer does not have to be concerned by the actual underlying interrupt mechanism as the event source hides the complexity. + *

+ * Saying this if the hardware is a multi-device card, for instance a 4 port NIC, where all of the devices are sharing one level triggered interrupt AND it is possible to determine each port's interrupt state non-destructively then the $link IOFilterInterruptEventSource would be a better choice. + *

+ * Warning: All IOInterruptEventSources are created in the disabled state. If you want to actually schedule interrupt delivery do not forget to enable the source. + */ +class IOInterruptEventSource : public IOEventSource +{ + OSDeclareDefaultStructors(IOInterruptEventSource); + +public: +/*! @typedef Action + * @discussion 'C' pointer prototype of functions that are called in a single threaded context when an interrupt occurs. + * @param owner Pointer to client instance. + * @param sender Pointer to generation interrupt event source. + * @param count Number of interrupts seen before delivery. */ + typedef void (*Action)(OSObject *owner, IOInterruptEventSource *sender, int count); + +#ifdef __BLOCKS__ + typedef void (^ActionBlock)(IOInterruptEventSource *sender, int count); +#endif /* __BLOCKS__ */ + +/*! @defined IOInterruptEventAction + * @discussion Backward compatibilty define for the old non-class scoped type definition. See $link IOInterruptEventSource::Action */ +#define IOInterruptEventAction IOInterruptEventSource::Action + +protected: +/*! @var provider IOService that provides interrupts for delivery. */ + IOService *provider; + +/*! @var intIndex */ + int intIndex; + +/*! @var producerCount + * Current count of produced interrupts that have been received. */ + volatile unsigned int producerCount; + +/*! @var consumerCount + * Current count of produced interrupts that the owner has been informed of. */ + unsigned int consumerCount; + +/*! @var autoDisable Do we need to automatically disable the interrupt source when we take an interrupt, i.e. we are level triggered. */ + bool autoDisable; + +/*! @var explicitDisable Has the user expicitly disabled this event source, if so then do not overide their request when returning from the callout */ + bool explicitDisable; + +/*! @struct ExpansionData + * @discussion This structure will be used to expand the capablilties of the IOWorkLoop in the future. + */ + struct ExpansionData { + IOInterruptAccountingData * statistics; + }; + +/*! @var reserved + * Reserved for future use. (Internal use only) */ + APPLE_KEXT_WSHADOW_PUSH; + ExpansionData *reserved; + APPLE_KEXT_WSHADOW_POP; + +/*! @function free + * @abstract Sub-class implementation of free method, disconnects from the interrupt source. */ + virtual void free() APPLE_KEXT_OVERRIDE; + +/*! @function checkForWork + * @abstract Pure Virtual member function used by IOWorkLoop for issueing a client calls. + * @discussion This function called when the work-loop is ready to check for any work to do and then to call out the owner/action. + * @result Return true if this function needs to be called again before all its outstanding events have been processed. */ + virtual bool checkForWork() APPLE_KEXT_OVERRIDE; + +/*! @function setWorkLoop + * @abstract Sub-class implementation of setWorkLoop method. */ + virtual void setWorkLoop(IOWorkLoop *inWorkLoop) APPLE_KEXT_OVERRIDE; + +public: + +/*! @function interruptEventSource + * @abstract Factory function for IOInterruptEventSources creation and initialisation. + * @param owner Owning client of the new event source. + * @param action 'C' Function to call when something happens. + * @param provider IOService that represents the interrupt source. Defaults to 0. When no provider is defined the event source assumes that the client will in some manner call the interruptOccured method explicitly. This will start the ball rolling for safe delivery of asynchronous event's into the driver. + * @param intIndex The index of the interrupt within the provider's interrupt sources. Defaults to 0, i.e. the first interrupt in the provider. + * @result A new interrupt event source if successfully created and initialised, 0 otherwise. */ + static IOInterruptEventSource * + interruptEventSource(OSObject *owner, + Action action, + IOService *provider = NULL, + int intIndex = 0); + + +#ifdef __BLOCKS__ +/*! @function interruptEventSource + * @abstract Factory function for IOInterruptEventSources creation and initialisation. + * @param owner Owning client of the new event source. + * @param provider IOService that represents the interrupt source. When no provider is defined the event source assumes that the client will in some manner call the interruptOccured method explicitly. This will start the ball rolling for safe delivery of asynchronous event's into the driver. + * @param intIndex The index of the interrupt within the provider's interrupt sources. + * @param action Block for the callout routine of this event source.. + * @result A new interrupt event source if successfully created and initialised, 0 otherwise. */ + static IOInterruptEventSource * + interruptEventSource(OSObject *owner, + IOService *provider, + int intIndex, + ActionBlock action); +#endif /* __BLOCKS__ */ + + +/*! @function init + * @abstract Primary initialiser for the IOInterruptEventSource class. + * @param owner Owning client of the new event source. + * @param action 'C' Function to call when something happens. + * @param provider IOService that represents the interrupt source. Defaults to 0. When no provider is defined the event source assumes that the client will in some manner call the interruptOccured method explicitly. This will start the ball rolling for safe delivery of asynchronous event's into the driver. + * @param intIndex The index of the interrupt within the provider's interrupt sources. Defaults to 0, i.e. the first interrupt in the provider. + * @result true if the inherited classes and this instance initialise + * successfully. */ + virtual bool init(OSObject *owner, + Action action, + IOService *provider = NULL, + int intIndex = 0); + +/*! @function enable + * @abstract Enable event source. + * @discussion A subclass implementation is expected to respect the enabled + * state when checkForWork is called. Calling this function will cause the + * work-loop to be signalled so that a checkForWork is performed. */ + virtual void enable() APPLE_KEXT_OVERRIDE; + +/*! @function disable + * @abstract Disable event source. + * @discussion A subclass implementation is expected to respect the enabled + * state when checkForWork is called. */ + virtual void disable() APPLE_KEXT_OVERRIDE; + +/*! @function getProvider + * @abstract Get'ter for $link provider variable. + * @result value of provider. */ + virtual const IOService *getProvider() const; + +/*! @function getIntIndex + * @abstract Get'ter for $link intIndex interrupt index variable. + * @result value of intIndex. */ + virtual int getIntIndex() const; + +/*! @function getAutoDisable + * @abstract Get'ter for $link autoDisable variable. + * @result value of autoDisable. */ + virtual bool getAutoDisable() const; + +/*! @function interruptOccurred + * @abstract Functions that get called by the interrupt controller. See $link IOService::registerInterrupt + * @param nub Where did the interrupt originate from + * @param ind What is this interrupts index within 'nub'. */ + virtual void interruptOccurred(void *, IOService *nub, int ind); + +/*! @function normalInterruptOccurred + * @abstract Functions that get called by the interrupt controller.See $link IOService::registerInterrupt + * @param nub Where did the interrupt originate from + * @param ind What is this interrupts index within 'nub'. */ + virtual void normalInterruptOccurred(void *, IOService *nub, int ind); + +/*! @function disableInterruptOccurred + * @abstract Functions that get called by the interrupt controller.See $link IOService::registerInterrupt + * @param nub Where did the interrupt originate from + * @param ind What is this interrupts index within 'nub'. */ + virtual void disableInterruptOccurred(void *, IOService *nub, int ind); + +/*! @function warmCPU + * @abstract Tries to reduce latency for an interrupt which will be received near a specified time. + * @discussion Warms up a CPU in advance of an interrupt so that the interrupt may be serviced with predictable latency. + * The warm-up is not periodic; callers should call warmCPU once in advance of each interrupt. It is recommended that + * requests be issues in serial (i.e. each after the target for the previous call has elapsed), as there is a systemwide + * cap on the number of outstanding requests. This routine may be disruptive to the system if used with very small intervals + * between requests; it should be used only in cases where interrupt latency is absolutely critical, and tens or hundreds of + * milliseconds between targets is the expected time scale. NOTE: it is not safe to call this method with interrupts disabled. + * @param abstime Time at which interrupt is expected. */ + IOReturn warmCPU(uint64_t abstime); + +/*! @function enablePrimaryInterruptTimestamp + * @abstract Enables collection of mach_absolute_time at primary interrupt. + * @discussion Enables collection of mach_absolute_time at primary interrupt. + * @param enable True to enable timestamp. */ + + void enablePrimaryInterruptTimestamp(bool enable); + +/*! @function getPimaryInterruptTimestamp + * @abstract Returns mach_absolute_time timestamp of primary interrupt. + * @discussion Returns mach_absolute_time timestamp of primary interrupt. + * @result Value of the timestamp. Zero if never interrupted, or -1ULL if timestamp collection has not been enabled. */ + + uint64_t getPimaryInterruptTimestamp(); + +private: + IOReturn registerInterruptHandler(IOService *inProvider, int inIntIndex); + void unregisterInterruptHandler(IOService *inProvider, int inIntIndex); + +private: + OSMetaClassDeclareReservedUnused(IOInterruptEventSource, 0); + OSMetaClassDeclareReservedUnused(IOInterruptEventSource, 1); + OSMetaClassDeclareReservedUnused(IOInterruptEventSource, 2); + OSMetaClassDeclareReservedUnused(IOInterruptEventSource, 3); + OSMetaClassDeclareReservedUnused(IOInterruptEventSource, 4); + OSMetaClassDeclareReservedUnused(IOInterruptEventSource, 5); + OSMetaClassDeclareReservedUnused(IOInterruptEventSource, 6); + OSMetaClassDeclareReservedUnused(IOInterruptEventSource, 7); +}; + +#endif /* !_IOKIT_IOINTERRUPTEVENTSOURCE_H */ diff --git a/QualcommWireless/include/IOKit/IOInterrupts.h b/QualcommWireless/include/IOKit/IOInterrupts.h new file mode 100644 index 0000000..86e737d --- /dev/null +++ b/QualcommWireless/include/IOKit/IOInterrupts.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. + * + * DRI: Josh de Cesare + * + */ + + +#ifndef _IOKIT_IOINTERRUPTS_H +#define _IOKIT_IOINTERRUPTS_H + +#define kIOInterruptTypeEdge (0) +#define kIOInterruptTypeLevel (1) + +#ifdef __cplusplus + +class OSData; +class IOInterruptController; + +struct IOInterruptSource { + IOInterruptController *interruptController; + OSData *vectorData; +}; +typedef struct IOInterruptSource IOInterruptSource; + + + +#endif /* __cplusplus */ + +typedef void (*IOInterruptHandler)(void *target, void *refCon, + void *nub, int source); + +#endif /* ! _IOKIT_IOINTERRUPTS_H */ diff --git a/QualcommWireless/include/IOKit/IOKernelReportStructs.h b/QualcommWireless/include/IOKit/IOKernelReportStructs.h new file mode 100644 index 0000000..162ac55 --- /dev/null +++ b/QualcommWireless/include/IOKit/IOKernelReportStructs.h @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2012-2014 Apple Computer, Inc. All Rights Reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +// Internal data structures to be used by IOReporters and User Space Observers + + +#ifndef _IOKERNELREPORTSTRUCTS_H_ +#define _IOKERNELREPORTSTRUCTS_H_ + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// Drivers participating in IOReporting can advertise channels by +// publishing properties in the I/O Kit registry. Various helper +// mechanisms exist to produce correctly-formatted legends. +// 12836893 tracks advertising channels in user space. +#define kIOReportLegendPublicKey "IOReportLegendPublic" // bool +#define kIOReportLegendKey "IOReportLegend" // arr +#define kIOReportLegendChannelsKey "IOReportChannels" // arr +#define kIOReportLegendGroupNameKey "IOReportGroupName" // str +#define kIOReportLegendSubGroupNameKey "IOReportSubGroupName" // str +#define kIOReportLegendInfoKey "IOReportChannelInfo" // dict +#define kIOReportLegendUnitKey "IOReportChannelUnit" // num +#define kIOReportLegendConfigKey "IOReportChannelConfig" // data +#define kIOReportLegendStateNamesKey "IOReportChannelStateNames" // str[] + +// in an I/O Kit registry legend, a small "array struct" represents a channel +#define kIOReportChannelIDIdx 0 // required +#define kIOReportChannelTypeIdx 1 // required +#define kIOReportChannelNameIdx 2 // optional + +/* Histogram Segment Configuration + * Currently supports 2 types of scaling to compute bucket upper bounds, + * linear or exponential. + * scale_flag = 0 -> linear scale + * 1 -> exponential scale + * upper_bound[n] = (scale_flag) ? pow(base,(n+1)) : base * (n+1); + */ +#define kIOHistogramScaleLinear 0 +#define kIOHistogramScaleExponential 1 +typedef struct { + uint32_t base_bucket_width;// segment[0].bucket[0] = [0, base_width] + uint32_t scale_flag; // bit 0 only in current use (see #defs) + uint32_t segment_idx; // for multiple segments histograms + uint32_t segment_bucket_count;// number of buckets in this segment +} __attribute((packed)) IOHistogramSegmentConfig; + +// "normalized distribution"(FIXME?) internal format (unused?) +typedef struct { + uint64_t samples; + uint64_t mean; + uint64_t variance; + uint64_t reserved; +} __attribute((packed)) IONormDistReportValues; + +#ifdef __cplusplus +} +#endif + +#endif // _IOKERNELREPORTSTRUCTS_H_ diff --git a/QualcommWireless/include/IOKit/IOKitDebug.h b/QualcommWireless/include/IOKit/IOKitDebug.h new file mode 100644 index 0000000..082d1b2 --- /dev/null +++ b/QualcommWireless/include/IOKit/IOKitDebug.h @@ -0,0 +1,227 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOKITDEBUG_H +#define _IOKIT_IOKITDEBUG_H + +#include + + +#ifdef __cplusplus + +#include +#include +#include + +class IOKitDiagnostics : public OSObject +{ + OSDeclareDefaultStructors(IOKitDiagnostics); + +public: + static OSObject * diagnostics( void ); + virtual bool serialize(OSSerialize *s) const APPLE_KEXT_OVERRIDE; +private: + static void updateOffset( OSDictionary * dict, + UInt64 value, const char * name ); +}; + +#endif /* __cplusplus */ + +enum { + // loggage + kIOLogAttach = 0x00000001ULL, + kIOLogProbe = 0x00000002ULL, + kIOLogStart = 0x00000004ULL, + kIOLogRegister = 0x00000008ULL, + kIOLogMatch = 0x00000010ULL, + kIOLogConfig = 0x00000020ULL, + kIOLogYield = 0x00000040ULL, + kIOLogPower = 0x00000080ULL, + kIOLogMapping = 0x00000100ULL, + kIOLogCatalogue = 0x00000200ULL, + kIOLogTracePower = 0x00000400ULL, // Obsolete: Use iotrace=0x00000400ULL to enable now + kIOLogDebugPower = 0x00000800ULL, + kIOLogServiceTree = 0x00001000ULL, + kIOLogDTree = 0x00002000ULL, + kIOLogMemory = 0x00004000ULL, + kIOLogKextMemory = 0x00008000ULL, + kOSLogRegistryMods = 0x00010000ULL,// Log attempts to modify registry collections + kIOLogPMRootDomain = 0x00020000ULL, + kOSRegistryModsMode = 0x00040000ULL,// Change default registry modification handling - panic vs. log +// kIOTraceIOService = 0x00080000ULL, // Obsolete: Use iotrace=0x00080000ULL to enable now + kIOLogHibernate = 0x00100000ULL, + kIOStatistics = 0x04000000ULL, + kIOSleepWakeWdogOff = 0x40000000ULL, + kIOKextSpinDump = 0x80000000ULL, + + // debug aids - change behaviour + kIONoFreeObjects = 0x00100000ULL, +// kIOLogSynchronous = 0x00200000ULL, // IOLog completes synchronously -- obsolete + kIOTracking = 0x00400000ULL, + kIOWaitQuietPanics = 0x00800000ULL, + kIOWaitQuietBeforeRoot = 0x01000000ULL, + kIOTrackingBoot = 0x02000000ULL, + + _kIODebugTopFlag = 0x8000000000000000ULL// force enum to be 64 bits +}; + +enum { + kIOKitDebugUserOptions = 0 + | kIOLogAttach + | kIOLogProbe + | kIOLogStart + | kIOLogRegister + | kIOLogMatch + | kIOLogConfig + | kIOLogYield + | kIOLogPower + | kIOLogMapping + | kIOLogCatalogue + | kIOLogTracePower + | kIOLogDebugPower + | kOSLogRegistryMods + | kIOLogPMRootDomain + | kOSRegistryModsMode + | kIOLogHibernate + | kIOSleepWakeWdogOff + | kIOKextSpinDump + | kIOWaitQuietPanics +}; + +enum { + kIOTraceInterrupts = 0x00000001ULL, // Trace primary interrupts + kIOTraceWorkLoops = 0x00000002ULL, // Trace workloop activity + kIOTraceEventSources = 0x00000004ULL, // Trace non-passive event sources + kIOTraceIntEventSource = 0x00000008ULL, // Trace IOIES and IOFIES sources + kIOTraceCommandGates = 0x00000010ULL, // Trace command gate activity + kIOTraceTimers = 0x00000020ULL, // Trace timer event source activity + + kIOTracePowerMgmt = 0x00000400ULL, // Trace power management changes + + kIOTraceIOService = 0x00080000ULL, // registerService/termination + + kIOTraceCompatBootArgs = kIOTraceIOService | kIOTracePowerMgmt +}; + +enum { + kIODKEnable = 0x00000001ULL, + kIODKLogSetup = 0x00000002ULL, + kIODKLogIPC = 0x00000004ULL, + kIODKLogPM = 0x00000008ULL, + kIODKLogMessages = 0x00000010ULL, + + kIODKDisablePM = 0x000000100ULL, + kIODKDisableDextLaunch = 0x00001000ULL, + kIODKDisableDextTag = 0x00002000ULL, + kIODKDisableCDHashChecking = 0x00004000ULL, + kIODKDisableEntitlementChecking = 0x00008000ULL, +}; + + +extern SInt64 gIOKitDebug; +extern SInt64 gIOKitTrace; +extern SInt64 gIODKDebug; + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +class IORegistryPlane; +#endif + +extern void IOPrintPlane( +#ifdef __cplusplus + const IORegistryPlane * plane +#else + const struct IORegistryPlane * plane +#endif + ); +#ifndef _OSCPPDEBUG_H +extern void OSPrintMemory( void ); +#endif +#define IOPrintMemory OSPrintMemory + + + +#define kIOKitDiagnosticsClientClassName "IOKitDiagnosticsClient" + +enum{ + kIOKitDiagnosticsClientType = 0x99000002 +}; + + +struct IOKitDiagnosticsParameters { + size_t size; + uint64_t value; + uint32_t options; + uint32_t tag; + uint32_t zsize; + uint32_t reserved[8]; +}; +typedef struct IOKitDiagnosticsParameters IOKitDiagnosticsParameters; + +enum{ + kIOTrackingCallSiteBTs = 16, +}; + +struct IOTrackingCallSiteInfo { + uint32_t count; + pid_t addressPID; + mach_vm_address_t address; + mach_vm_size_t size[2]; + pid_t btPID; + mach_vm_address_t bt[2][kIOTrackingCallSiteBTs]; +}; + +#define kIOMallocTrackingName "IOMalloc" +#define kIOWireTrackingName "IOWire" +#define kIOMapTrackingName "IOMap" + + +enum{ + kIOTrackingExcludeNames = 0x00000001, +}; + +enum{ + kIOTrackingGetTracking = 0x00000001, + kIOTrackingGetMappings = 0x00000002, + kIOTrackingResetTracking = 0x00000003, + kIOTrackingStartCapture = 0x00000004, + kIOTrackingStopCapture = 0x00000005, + kIOTrackingSetMinCaptureSize = 0x00000006, + kIOTrackingLeaks = 0x00000007, + kIOTrackingInvalid = 0xFFFFFFFE, +}; + + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* ! _IOKIT_IOKITDEBUG_H */ diff --git a/QualcommWireless/include/IOKit/IOKitDiagnosticsUserClient.h b/QualcommWireless/include/IOKit/IOKitDiagnosticsUserClient.h new file mode 100644 index 0000000..f78c45c --- /dev/null +++ b/QualcommWireless/include/IOKit/IOKitDiagnosticsUserClient.h @@ -0,0 +1,17 @@ +/* * Copyright (c) 2019 Apple Inc. All rights reserved. */ + +#include +#include + + +class IOKitDiagnosticsClient : public IOUserClient +{ + OSDeclareDefaultStructors(IOKitDiagnosticsClient); + +public: + static IOUserClient * withTask(task_t owningTask); + virtual IOReturn clientClose(void) APPLE_KEXT_OVERRIDE; + virtual IOReturn setProperties(OSObject * properties) APPLE_KEXT_OVERRIDE; + virtual IOReturn externalMethod(uint32_t selector, IOExternalMethodArguments * args, + IOExternalMethodDispatch * dispatch, OSObject * target, void * reference) APPLE_KEXT_OVERRIDE; +}; diff --git a/QualcommWireless/include/IOKit/IOKitKeys.h b/QualcommWireless/include/IOKit/IOKitKeys.h new file mode 100644 index 0000000..3b5c96b --- /dev/null +++ b/QualcommWireless/include/IOKit/IOKitKeys.h @@ -0,0 +1,220 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. + * + * Common symbol definitions for IOKit. + * + * HISTORY + * + */ + + +#ifndef _IOKIT_IOKITKEYS_H +#define _IOKIT_IOKITKEYS_H + +// properties found in the registry root +#define kIOKitBuildVersionKey "IOKitBuildVersion" +#define kIOKitDiagnosticsKey "IOKitDiagnostics" +// a dictionary keyed by plane name +#define kIORegistryPlanesKey "IORegistryPlanes" +#define kIOCatalogueKey "IOCatalogue" + +// registry plane names +#define kIOServicePlane "IOService" +#define kIOPowerPlane "IOPower" +#define kIODeviceTreePlane "IODeviceTree" +#define kIOAudioPlane "IOAudio" +#define kIOFireWirePlane "IOFireWire" +#define kIOUSBPlane "IOUSB" + +// registry ID number +#define kIORegistryEntryIDKey "IORegistryEntryID" +// property name to get array of property names +#define kIORegistryEntryPropertyKeysKey "IORegistryEntryPropertyKeys" + +// IOService class name +#define kIOServiceClass "IOService" + +// IOResources class name +#define kIOResourcesClass "IOResources" + +// IOService driver probing property names +#define kIOClassKey "IOClass" +#define kIOProbeScoreKey "IOProbeScore" +#define kIOKitDebugKey "IOKitDebug" + +// Properties to be supported as API +#define kIOSupportedPropertiesKey "IOSupportedProperties" +// Properties writable by dexts +#define kIOUserServicePropertiesKey "IOUserServiceProperties" + + +// IOService matching property names +#define kIOProviderClassKey "IOProviderClass" +#define kIONameMatchKey "IONameMatch" +#define kIOPropertyMatchKey "IOPropertyMatch" +#define kIOPropertyExistsMatchKey "IOPropertyExistsMatch" +#define kIOPathMatchKey "IOPathMatch" +#define kIOLocationMatchKey "IOLocationMatch" +#define kIOParentMatchKey "IOParentMatch" +#define kIOResourceMatchKey "IOResourceMatch" +#define kIOResourceMatchedKey "IOResourceMatched" +#define kIOMatchedServiceCountKey "IOMatchedServiceCountMatch" + +#define kIONameMatchedKey "IONameMatched" + +#define kIOMatchCategoryKey "IOMatchCategory" +#define kIODefaultMatchCategoryKey "IODefaultMatchCategory" + +#define kIOMatchedPersonalityKey "IOMatchedPersonality" +#define kIORematchPersonalityKey "IORematchPersonality" +#define kIORematchCountKey "IORematchCount" +#define kIODEXTMatchCountKey "IODEXTMatchCount" + +// Entitlements to check against dext process +// Property is an array, one or more of which may match, of: +// an array of entitlement strings, all must be present +// Any array can be a single string. +#define kIOServiceDEXTEntitlementsKey "IOServiceDEXTEntitlements" + +// Entitlement required to open dext connection +#define kIODriverKitEntitlementKey "com.apple.developer.driverkit" + +// Entitlements required to open dext IOUserClient +// Property is an array of strings containing CFBundleIdentifiers of service being opened +#define kIODriverKitUserClientEntitlementsKey "com.apple.developer.driverkit.userclient-access" + +// Entitlement of a dext that allows any task to open one of its IOUserClients +#define kIODriverKitUserClientEntitlementAllowAnyKey "com.apple.developer.driverkit.allow-any-userclient-access" + +// Other DriverKit entitlements +#define kIODriverKitUSBTransportEntitlementKey "com.apple.developer.driverkit.transport.usb" +#define kIODriverKitHIDTransportEntitlementKey "com.apple.developer.driverkit.transport.hid" +#define kIODriverKitHIDFamilyDeviceEntitlementKey "com.apple.developer.driverkit.family.hid.device" +#define kIODriverKitHIDFamilyEventServiceEntitlementKey "com.apple.developer.driverkit.family.hid.eventservice" +#define kIODriverKitTransportBuiltinEntitlementKey "com.apple.developer.driverkit.builtin" + + +// When possible, defer matching of this driver until kextd has started. +#define kIOMatchDeferKey "IOMatchDefer" + +// IOService default user client class, for loadable user clients +#define kIOUserClientClassKey "IOUserClientClass" + +// key to find IOMappers +#define kIOMapperIDKey "IOMapperID" + +#define kIOUserClientCrossEndianKey "IOUserClientCrossEndian" +#define kIOUserClientCrossEndianCompatibleKey "IOUserClientCrossEndianCompatible" +#define kIOUserClientSharedInstanceKey "IOUserClientSharedInstance" +// diagnostic string describing the creating task +#define kIOUserClientCreatorKey "IOUserClientCreator" +// the expected cdhash value of the userspace driver executable +#define kIOUserServerCDHashKey "IOUserServerCDHash" + +#define kIOUserUserClientKey "IOUserUserClient" + + +// IOService notification types +#define kIOPublishNotification "IOServicePublish" +#define kIOFirstPublishNotification "IOServiceFirstPublish" +#define kIOMatchedNotification "IOServiceMatched" +#define kIOFirstMatchNotification "IOServiceFirstMatch" +#define kIOTerminatedNotification "IOServiceTerminate" +#define kIOWillTerminateNotification "IOServiceWillTerminate" + +// IOService interest notification types +#define kIOGeneralInterest "IOGeneralInterest" +#define kIOBusyInterest "IOBusyInterest" +#define kIOAppPowerStateInterest "IOAppPowerStateInterest" +#define kIOPriorityPowerStateInterest "IOPriorityPowerStateInterest" + +#define kIOPlatformDeviceMessageKey "IOPlatformDeviceMessage" + +// IOService interest notification types +#define kIOCFPlugInTypesKey "IOCFPlugInTypes" + +// properties found in services that implement command pooling +#define kIOCommandPoolSizeKey "IOCommandPoolSize" // (OSNumber) + +// properties found in services that implement priority +#define kIOMaximumPriorityCountKey "IOMaximumPriorityCount" // (OSNumber) + +// properties found in services that have transfer constraints +#define kIOMaximumBlockCountReadKey "IOMaximumBlockCountRead" // (OSNumber) +#define kIOMaximumBlockCountWriteKey "IOMaximumBlockCountWrite" // (OSNumber) +#define kIOMaximumByteCountReadKey "IOMaximumByteCountRead" // (OSNumber) +#define kIOMaximumByteCountWriteKey "IOMaximumByteCountWrite" // (OSNumber) +#define kIOMaximumSegmentCountReadKey "IOMaximumSegmentCountRead" // (OSNumber) +#define kIOMaximumSegmentCountWriteKey "IOMaximumSegmentCountWrite" // (OSNumber) +#define kIOMaximumSegmentByteCountReadKey "IOMaximumSegmentByteCountRead" // (OSNumber) +#define kIOMaximumSegmentByteCountWriteKey "IOMaximumSegmentByteCountWrite" // (OSNumber) +#define kIOMinimumSegmentAlignmentByteCountKey "IOMinimumSegmentAlignmentByteCount" // (OSNumber) +#define kIOMaximumSegmentAddressableBitCountKey "IOMaximumSegmentAddressableBitCount" // (OSNumber) +#define kIOMinimumSaturationByteCountKey "IOMinimumSaturationByteCount" // (OSNumber) +#define kIOMaximumSwapWriteKey "IOMaximumSwapWrite" // (OSNumber) + +// properties found in services that wish to describe an icon +// +// IOIcon = +// { +// CFBundleIdentifier = "com.example.driver.example"; +// IOBundleResourceFile = "example.icns"; +// }; +// +// where IOBundleResourceFile is the filename of the resource + +#define kIOIconKey "IOIcon" // (OSDictionary) +#define kIOBundleResourceFileKey "IOBundleResourceFile" // (OSString) + +#define kIOBusBadgeKey "IOBusBadge" // (OSDictionary) +#define kIODeviceIconKey "IODeviceIcon" // (OSDictionary) + +// property of root that describes the machine's serial number as a string +#define kIOPlatformSerialNumberKey "IOPlatformSerialNumber" // (OSString) + +// property of root that describes the machine's UUID as a string +#define kIOPlatformUUIDKey "IOPlatformUUID" // (OSString) + +// IODTNVRAM property keys +#define kIONVRAMBootArgsKey "boot-args" +#define kIONVRAMDeletePropertyKey "IONVRAM-DELETE-PROPERTY" +#define kIONVRAMSyncNowPropertyKey "IONVRAM-SYNCNOW-PROPERTY" +#define kIONVRAMActivateCSRConfigPropertyKey "IONVRAM-ARMCSR-PROPERTY" +#define kIODTNVRAMPanicInfoKey "aapl,panic-info" + +// keys for complex boot information +#define kIOBootDeviceKey "IOBootDevice" // dict | array of dicts +#define kIOBootDevicePathKey "IOBootDevicePath" // arch-neutral OSString +#define kIOBootDeviceSizeKey "IOBootDeviceSize" // OSNumber of bytes + +// keys for OS Version information +#define kOSBuildVersionKey "OS Build Version" + +#endif /* ! _IOKIT_IOKITKEYS_H */ diff --git a/QualcommWireless/include/IOKit/IOKitServer.h b/QualcommWireless/include/IOKit/IOKitServer.h new file mode 100644 index 0000000..4b12abf --- /dev/null +++ b/QualcommWireless/include/IOKit/IOKitServer.h @@ -0,0 +1,118 @@ +/* + * Copyright (c) 1998-2011 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1998 Apple Computer, Inc. All rights reserved. + * + * HISTORY + * + */ + +/* + * Internal definitions used between the iokit user library and + * server routines. + */ + +#ifndef _IOKIT_IOKITSERVER_H +#define _IOKIT_IOKITSERVER_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#include +#ifdef __cplusplus +} +#endif + +// IOCatalogueSendData +/*! + * @enum IOCatalogueSendData user-client flags. + * @constant kIOCatalogAddDrivers Signals a call to the addDrivers function in IOCatalogue. + * @constant kIOCatalogAddDriversNoMatch Signals a call to the addDrivers function in IOCatalogue but does not start a matching thread. + * @constant kIOCatalogRemoveDrivers Signals a call to the removeDrivers function in IOCatalogue. + * @constant kIOCatalogRemoveDriversNoMatch Signals a call to the removedrivers function in IOCatalogue but does not start a matching thread. + * @constant kIOCatalogStartMatching Signals the IOCatalogue to start an IOService matching thread. + * @constant kIOCatalogRemoveKernelLinker Deprecated; does nothing. + * @constant kIOCatalogKextdActive Signals the kernel that kextd is running. + * @constant kIOCatalogKextdFinishedLaunching Signals the IOCatalogue that kextd has finished sending it information at startup. + * @constant kIOCatalogResetDrivers Resets the IOCatalogue with a new set of personalities. + * @constant kIOCatalogResetDriversNoMatch Resets the IOCatalogue with a new set of personalities but does not start a matching thread. + */ +enum { + kIOCatalogAddDrivers = 1, + kIOCatalogAddDriversNoMatch, + kIOCatalogRemoveDrivers, + kIOCatalogRemoveDriversNoMatch, + kIOCatalogStartMatching__Removed, + kIOCatalogRemoveKernelLinker__Removed, + kIOCatalogKextdActive, + kIOCatalogKextdFinishedLaunching, + kIOCatalogResetDrivers, + kIOCatalogResetDriversNoMatch +}; + +// IOCatalogueGetData +/*! + * @enum IOCatalogueGetData user-client flags + * @constant kIOCatalogGetContents Returns a snapshot of the database to the caller. + */ +enum { + kIOCatalogGetContents = 1, + kIOCatalogGetModuleDemandList = 2, + kIOCatalogGetCacheMissList = 3, + kIOCatalogGetROMMkextList = 4 +}; + +// IOCatalogueReset +/*! + * @enum IOCatalogueReset user-client flag + * @constant kIOCatalogResetDefault Removes all entries from IOCatalogue except those used for booting the system. + */ +enum { + kIOCatalogResetDefault = 1 +}; + +// IOCatalogueTerminate +/*! + * @enum IOCatalogueTerminate user-client flags. + * @constant kIOCatalogModuleUnload Terminates all services which depend on a particular module and unloads the module. + * @constant kIOCatalogModuleTerminate Terminates all services which depend on a particular module but does not unload the module. + * @constant kIOCatalogServiceTerminate Terminates a particular service by name. + */ +enum { + kIOCatalogModuleUnload = 1, + kIOCatalogModuleTerminate, + kIOCatalogServiceTerminate +}; + + + +#endif /* ! _IOKIT_IOKITSERVER_H */ diff --git a/QualcommWireless/include/IOKit/IOLib.h b/QualcommWireless/include/IOKit/IOLib.h new file mode 100644 index 0000000..9775c1d --- /dev/null +++ b/QualcommWireless/include/IOKit/IOLib.h @@ -0,0 +1,450 @@ +/* + * Copyright (c) 1998-2016 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1998 Apple Computer, Inc. All rights reserved. + * + * HISTORY + * + */ + +#ifndef __IOKIT_IOLIB_H +#define __IOKIT_IOLIB_H + + +#include +#include +#include + +#include + +#include + +#include +#include +#include + +#include + +__BEGIN_DECLS + +#include +#include + +/* + * min/max macros. + */ + +#define min(a, b) ((a) < (b) ? (a) : (b)) +#define max(a, b) ((a) > (b) ? (a) : (b)) + +/* + * These are opaque to the user. + */ +typedef thread_t IOThread; +typedef void (*IOThreadFunc)(void *argument); + +/* + * Memory allocation functions. + */ + +/*! @function IOMalloc + * @abstract Allocates general purpose, wired memory in the kernel map. + * @discussion This is a general purpose utility to allocate memory in the kernel. There are no alignment guarantees given on the returned memory, and alignment may vary depending on the kernel configuration. This function may block and so should not be called from interrupt level or while a simple lock is held. + * @param size Size of the memory requested. + * @result Pointer to the allocated memory, or zero on failure. */ + +void * IOMalloc(vm_size_t size) __attribute__((alloc_size(1))); +void * IOMallocZero(vm_size_t size) __attribute__((alloc_size(1))); + +/*! @function IOFree + * @abstract Frees memory allocated with IOMalloc. + * @discussion This function frees memory allocated with IOMalloc, it may block and so should not be called from interrupt level or while a simple lock is held. + * @param address Pointer to the allocated memory. Must be identical to result + * @of a prior IOMalloc. + * @param size Size of the memory allocated. Must be identical to size of + * @the corresponding IOMalloc */ + +void IOFree(void * address, vm_size_t size); + +/*! @function IOMallocAligned + * @abstract Allocates wired memory in the kernel map, with an alignment restriction. + * @discussion This is a utility to allocate memory in the kernel, with an alignment restriction which is specified as a byte count. This function may block and so should not be called from interrupt level or while a simple lock is held. + * @param size Size of the memory requested. + * @param alignment Byte count of the alignment for the memory. For example, pass 256 to get memory allocated at an address with bit 0-7 zero. + * @result Pointer to the allocated memory, or zero on failure. */ + +void * IOMallocAligned(vm_size_t size, vm_offset_t alignment) __attribute__((alloc_size(1))); + +/*! @function IOFreeAligned + * @abstract Frees memory allocated with IOMallocAligned. + * @discussion This function frees memory allocated with IOMallocAligned, it may block and so should not be called from interrupt level or while a simple lock is held. + * @param address Pointer to the allocated memory. + * @param size Size of the memory allocated. */ + +void IOFreeAligned(void * address, vm_size_t size); + +/*! @function IOMallocContiguous + * @abstract Deprecated - use IOBufferMemoryDescriptor. Allocates wired memory in the kernel map, with an alignment restriction and physically contiguous. + * @discussion This is a utility to allocate memory in the kernel, with an alignment restriction which is specified as a byte count, and will allocate only physically contiguous memory. The request may fail if memory is fragmented, and may cause large amounts of paging activity. This function may block and so should not be called from interrupt level or while a simple lock is held. + * @param size Size of the memory requested. + * @param alignment Byte count of the alignment for the memory. For example, pass 256 to get memory allocated at an address with bits 0-7 zero. + * @param physicalAddress IOMallocContiguous returns the physical address of the allocated memory here, if physicalAddress is a non-zero pointer. The physicalAddress argument is deprecated and should be passed as NULL. To obtain the physical address for a memory buffer, use the IODMACommand class in conjunction with the IOMemoryDescriptor or IOBufferMemoryDescriptor classes. + * @result Virtual address of the allocated memory, or zero on failure. */ + +void * IOMallocContiguous(vm_size_t size, vm_size_t alignment, + IOPhysicalAddress * physicalAddress) __attribute__((deprecated)) __attribute__((alloc_size(1))); + +/*! @function IOFreeContiguous + * @abstract Deprecated - use IOBufferMemoryDescriptor. Frees memory allocated with IOMallocContiguous. + * @discussion This function frees memory allocated with IOMallocContiguous, it may block and so should not be called from interrupt level or while a simple lock is held. + * @param address Virtual address of the allocated memory. + * @param size Size of the memory allocated. */ + +void IOFreeContiguous(void * address, vm_size_t size) __attribute__((deprecated)); + + +/*! @function IOMallocPageable + * @abstract Allocates pageable memory in the kernel map. + * @discussion This is a utility to allocate pageable memory in the kernel. This function may block and so should not be called from interrupt level or while a simple lock is held. + * @param size Size of the memory requested. + * @param alignment Byte count of the alignment for the memory. For example, pass 256 to get memory allocated at an address with bits 0-7 zero. + * @result Pointer to the allocated memory, or zero on failure. */ + +void * IOMallocPageable(vm_size_t size, vm_size_t alignment) __attribute__((alloc_size(1))); + +/*! @function IOFreePageable + * @abstract Frees memory allocated with IOMallocPageable. + * @discussion This function frees memory allocated with IOMallocPageable, it may block and so should not be called from interrupt level or while a simple lock is held. + * @param address Virtual address of the allocated memory. + * @param size Size of the memory allocated. */ + +void IOFreePageable(void * address, vm_size_t size); + +/* + * Typed memory allocation macros. All may block. + */ + +#define IONew(type, count) \ +({ \ + size_t __size; \ + (os_mul_overflow(sizeof(type), (count), &__size) \ + ? ((type *) NULL) \ + : ((type *) IOMalloc(__size))); \ +}) + +#define IONewZero(type, count) \ +({ \ + size_t __size; \ + (os_mul_overflow(sizeof(type), (count), &__size) \ + ? ((type *) NULL) \ + : ((type *) IOMallocZero(__size))); \ +}) + +#define IODelete(ptr, type, count) \ +({ \ + size_t __size; \ + if (!os_mul_overflow(sizeof(type), (count), &__size)) { \ + IOFree(ptr, __size); \ + } \ +}) + +#define IOSafeDeleteNULL(ptr, type, count) \ + do { \ + if (NULL != (ptr)) { \ + IODelete((ptr), type, count); \ + (ptr) = NULL; \ + } \ + } while (0) \ + +///////////////////////////////////////////////////////////////////////////// +// +// +// These functions are now implemented in IOMapper.cpp +// +// +///////////////////////////////////////////////////////////////////////////// + +/*! @function IOMappedRead8 + * @abstract Read one byte from the desired "Physical" IOSpace address. + * @discussion Read one byte from the desired "Physical" IOSpace address. This function allows the developer to read an address returned from any memory descriptor's getPhysicalSegment routine. It can then be used by segmenting a physical page slightly to tag the physical page with its kernel space virtual address. + * @param address The desired address, as returned by IOMemoryDescriptor::getPhysicalSegment. + * @result Data contained at that location */ + +UInt8 IOMappedRead8(IOPhysicalAddress address); + +/*! @function IOMappedRead16 + * @abstract Read two bytes from the desired "Physical" IOSpace address. + * @discussion Read two bytes from the desired "Physical" IOSpace address. This function allows the developer to read an address returned from any memory descriptor's getPhysicalSegment routine. It can then be used by segmenting a physical page slightly to tag the physical page with its kernel space virtual address. + * @param address The desired address, as returned by IOMemoryDescriptor::getPhysicalSegment. + * @result Data contained at that location */ + +UInt16 IOMappedRead16(IOPhysicalAddress address); + +/*! @function IOMappedRead32 + * @abstract Read four bytes from the desired "Physical" IOSpace address. + * @discussion Read four bytes from the desired "Physical" IOSpace address. This function allows the developer to read an address returned from any memory descriptor's getPhysicalSegment routine. It can then be used by segmenting a physical page slightly to tag the physical page with its kernel space virtual address. + * @param address The desired address, as returned by IOMemoryDescriptor::getPhysicalSegment. + * @result Data contained at that location */ + +UInt32 IOMappedRead32(IOPhysicalAddress address); + +/*! @function IOMappedRead64 + * @abstract Read eight bytes from the desired "Physical" IOSpace address. + * @discussion Read eight bytes from the desired "Physical" IOSpace address. This function allows the developer to read an address returned from any memory descriptor's getPhysicalSegment routine. It can then be used by segmenting a physical page slightly to tag the physical page with its kernel space virtual address. + * @param address The desired address, as returned by IOMemoryDescriptor::getPhysicalSegment. + * @result Data contained at that location */ + +UInt64 IOMappedRead64(IOPhysicalAddress address); + +/*! @function IOMappedWrite8 + * @abstract Write one byte to the desired "Physical" IOSpace address. + * @discussion Write one byte to the desired "Physical" IOSpace address. This function allows the developer to write to an address returned from any memory descriptor's getPhysicalSegment routine. + * @param address The desired address, as returned by IOMemoryDescriptor::getPhysicalSegment. + * @param value Data to be writen to the desired location */ + +void IOMappedWrite8(IOPhysicalAddress address, UInt8 value); + +/*! @function IOMappedWrite16 + * @abstract Write two bytes to the desired "Physical" IOSpace address. + * @discussion Write two bytes to the desired "Physical" IOSpace address. This function allows the developer to write to an address returned from any memory descriptor's getPhysicalSegment routine. + * @param address The desired address, as returned by IOMemoryDescriptor::getPhysicalSegment. + * @param value Data to be writen to the desired location */ + +void IOMappedWrite16(IOPhysicalAddress address, UInt16 value); + +/*! @function IOMappedWrite32 + * @abstract Write four bytes to the desired "Physical" IOSpace address. + * @discussion Write four bytes to the desired "Physical" IOSpace address. This function allows the developer to write to an address returned from any memory descriptor's getPhysicalSegment routine. + * @param address The desired address, as returned by IOMemoryDescriptor::getPhysicalSegment. + * @param value Data to be writen to the desired location */ + +void IOMappedWrite32(IOPhysicalAddress address, UInt32 value); + +/*! @function IOMappedWrite64 + * @abstract Write eight bytes to the desired "Physical" IOSpace address. + * @discussion Write eight bytes to the desired "Physical" IOSpace address. This function allows the developer to write to an address returned from any memory descriptor's getPhysicalSegment routine. + * @param address The desired address, as returned by IOMemoryDescriptor::getPhysicalSegment. + * @param value Data to be writen to the desired location */ + +void IOMappedWrite64(IOPhysicalAddress address, UInt64 value); + +/* This function is deprecated. Cache settings may be set for allocated memory with the IOBufferMemoryDescriptor api. */ + +IOReturn IOSetProcessorCacheMode( task_t task, IOVirtualAddress address, + IOByteCount length, IOOptionBits cacheMode ) __attribute__((deprecated)); + +/*! @function IOFlushProcessorCache + * @abstract Flushes the processor cache for mapped memory. + * @discussion This function flushes the processor cache of an already mapped memory range. Note in most cases it is preferable to use IOMemoryDescriptor::prepare and complete to manage cache coherency since they are aware of the architecture's requirements. Flushing the processor cache is not required for coherency in most situations. + * @param task Task the memory is mapped into. + * @param address Virtual address of the memory. + * @param length Length of the range to set. + * @result An IOReturn code. */ + +IOReturn IOFlushProcessorCache( task_t task, IOVirtualAddress address, + IOByteCount length ); + +/*! @function IOThreadSelf + * @abstract Returns the osfmk identifier for the currently running thread. + * @discussion This function returns the current thread (a pointer to the currently active osfmk thread_shuttle). */ + +#define IOThreadSelf() (current_thread()) + +/*! @function IOCreateThread + * @abstract Deprecated function - use kernel_thread_start(). Create a kernel thread. + * @discussion This function creates a kernel thread, and passes the caller supplied argument to the new thread. Warning: the value returned by this function is not 100% reliable. There is a race condition where it is possible that the new thread has already terminated before this call returns. Under that circumstance the IOThread returned will be invalid. In general there is little that can be done with this value except compare it against 0. The thread itself can call IOThreadSelf() 100% reliably and that is the prefered mechanism to manipulate the IOThreads state. + * @param function A C-function pointer where the thread will begin execution. + * @param argument Caller specified data to be passed to the new thread. + * @result An IOThread identifier for the new thread, equivalent to an osfmk thread_t. */ + +IOThread IOCreateThread(IOThreadFunc function, void *argument) __attribute__((deprecated)); + +/*! @function IOExitThread + * @abstract Deprecated function - use thread_terminate(). Terminate execution of current thread. + * @discussion This function destroys the currently running thread, and does not return. */ + +void IOExitThread(void) __attribute__((deprecated)); + +/*! @function IOSleep + * @abstract Sleep the calling thread for a number of milliseconds. + * @discussion This function blocks the calling thread for at least the number of specified milliseconds, giving time to other processes. + * @param milliseconds The integer number of milliseconds to wait. */ + +void IOSleep(unsigned milliseconds); + +/*! @function IOSleepWithLeeway + * @abstract Sleep the calling thread for a number of milliseconds, with a specified leeway the kernel may use for timer coalescing. + * @discussion This function blocks the calling thread for at least the number of specified milliseconds, giving time to other processes. The kernel may also coalesce any timers involved in the delay, using the leeway given as a guideline. + * @param intervalMilliseconds The integer number of milliseconds to wait. + * @param leewayMilliseconds The integer number of milliseconds to use as a timer coalescing guideline. */ + +void IOSleepWithLeeway(unsigned intervalMilliseconds, unsigned leewayMilliseconds); + +/*! @function IODelay + * @abstract Spin delay for a number of microseconds. + * @discussion This function spins to delay for at least the number of specified microseconds. Since the CPU is busy spinning no time is made available to other processes; this method of delay should be used only for short periods. Also, the AbsoluteTime based APIs of kern/clock.h provide finer grained and lower cost delays. + * @param microseconds The integer number of microseconds to spin wait. */ + +void IODelay(unsigned microseconds); + +/*! @function IOPause + * @abstract Spin delay for a number of nanoseconds. + * @discussion This function spins to delay for at least the number of specified nanoseconds. Since the CPU is busy spinning no time is made available to other processes; this method of delay should be used only for short periods. + * @param nanoseconds The integer number of nanoseconds to spin wait. */ + +void IOPause(unsigned nanoseconds); + +/*! @function IOLog + * @abstract Log a message to console in text mode, and /var/log/system.log. + * @discussion This function allows a driver to log diagnostic information to the screen during verbose boots, and to a log file found at /var/log/system.log. IOLog should not be called from interrupt context. + * @param format A printf() style format string (see printf(3) documentation). + */ + +void IOLog(const char *format, ...) +__attribute__((format(printf, 1, 2))); + +/*! @function IOLogv + * @abstract Log a message to console in text mode, and /var/log/system.log. + * @discussion This function allows a driver to log diagnostic information to the screen during verbose boots, and to a log file found at /var/log/system.log. IOLogv should not be called from interrupt context. + * @param format A printf() style format string (see printf(3) documentation). + * @param ap stdarg(3) style variable arguments. */ + +void IOLogv(const char *format, va_list ap) +__attribute__((format(printf, 1, 0))); + +#ifndef _FN_KPRINTF +#define _FN_KPRINTF +void kprintf(const char *format, ...); +#endif +#ifndef _FN_KPRINTF_DECLARED +#define _FN_KPRINTF_DECLARED +#endif + +/* + * Convert a integer constant (typically a #define or enum) to a string + * via an array of IONamedValue. + */ +const char *IOFindNameForValue(int value, + const IONamedValue *namedValueArray); + +/* + * Convert a string to an int via an array of IONamedValue. Returns + * kIOReturnSuccess of string found, else returns kIOReturnBadArgument. + */ +IOReturn IOFindValueForName(const char *string, + const IONamedValue *regValueArray, + int *value); /* RETURNED */ + +/*! @function Debugger + * @abstract Enter the kernel debugger. + * @discussion This function freezes the kernel and enters the builtin debugger. It may not be possible to exit the debugger without a second machine. + * @param reason A C-string to describe why the debugger is being entered. */ + +void Debugger(const char * reason); +#if __LP64__ +#define IOPanic(reason) panic("%s", reason) +#else +void IOPanic(const char *reason) __attribute__((deprecated)) __abortlike; +#endif + +#ifdef __cplusplus +class OSDictionary; +#endif + +#ifdef __cplusplus +OSDictionary * +#else +struct OSDictionary * +#endif +IOBSDNameMatching( const char * name ); + +#ifdef __cplusplus +OSDictionary * +#else +struct OSDictionary * +#endif +IOOFPathMatching( const char * path, char * buf, int maxLen ) __attribute__((deprecated)); + +/* + * Convert between size and a power-of-two alignment. + */ +IOAlignment IOSizeToAlignment(unsigned int size); +unsigned int IOAlignmentToSize(IOAlignment align); + +/* + * Multiply and divide routines for IOFixed datatype. + */ + +static inline IOFixed +IOFixedMultiply(IOFixed a, IOFixed b) +{ + return (IOFixed)((((SInt64) a) * ((SInt64) b)) >> 16); +} + +static inline IOFixed +IOFixedDivide(IOFixed a, IOFixed b) +{ + return (IOFixed)((((SInt64) a) << 16) / ((SInt64) b)); +} + +/* + * IORound and IOTrunc convenience functions, in the spirit + * of vm's round_page() and trunc_page(). + */ +#define IORound(value, multiple) \ + ((((value) + (multiple) - 1) / (multiple)) * (multiple)) + +#define IOTrunc(value, multiple) \ + (((value) / (multiple)) * (multiple)); + + +#if defined(__APPLE_API_OBSOLETE) + +/* The following API is deprecated */ + +/* The API exported by kern/clock.h + * should be used for high resolution timing. */ + +void IOGetTime( mach_timespec_t * clock_time) __attribute__((deprecated)); + +#if !defined(__LP64__) + +#undef eieio +#define eieio() \ + OSSynchronizeIO() + +extern mach_timespec_t IOZeroTvalspec; + +#endif /* !defined(__LP64__) */ + +#endif /* __APPLE_API_OBSOLETE */ + + +__END_DECLS + +#endif /* !__IOKIT_IOLIB_H */ diff --git a/QualcommWireless/include/IOKit/IOLocks.h b/QualcommWireless/include/IOKit/IOLocks.h new file mode 100644 index 0000000..aa4951e --- /dev/null +++ b/QualcommWireless/include/IOKit/IOLocks.h @@ -0,0 +1,440 @@ +/* + * Copyright (c) 1998-2012 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * + */ + +#ifndef __IOKIT_IOLOCKS_H +#define __IOKIT_IOLOCKS_H + + +#include +#include + +#include + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +/*! @var IOLockGroup + * Global lock group used by all IOKit locks. To simplify kext debugging and lock-heat analysis, consider using lck_* locks with a per-driver lock group, as defined in kern/locks.h. + */ +extern lck_grp_t *IOLockGroup; + + +/* + * Mutex lock operations + */ + +#ifdef IOLOCKS_INLINE +typedef lck_mtx_t IOLock; +#else +typedef struct _IOLock IOLock; +#endif /* IOLOCKS_INLINE */ + + +/*! @function IOLockAlloc + * @abstract Allocates and initializes a mutex. + * @discussion Allocates a mutex in general purpose memory, and initializes it. Mutexes are general purpose blocking mutual exclusion locks, supplied by libkern/locks.h. This function may block and so should not be called from interrupt level or while a spin lock is held. IOLocks use the global IOKit lock group, IOLockGroup. To simplify kext debugging and lock-heat analysis, consider using lck_* locks with a per-driver lock group, as defined in kern/locks.h. + * @result Pointer to the allocated lock, or zero on failure. */ + +IOLock * IOLockAlloc( void ); + +/*! @function IOLockFree + * @abstract Frees a mutex. + * @discussion Frees a lock allocated with IOLockAlloc. Mutex should be unlocked with no waiters. + * @param lock Pointer to the allocated lock. */ + +void IOLockFree( IOLock * lock); + +/*! @function IOLockGetMachLock + * @abstract Accessor to a Mach mutex. + * @discussion Accessor to the Mach mutex. + * @param lock Pointer to the allocated lock. */ + +lck_mtx_t * IOLockGetMachLock( IOLock * lock); + +/*! @function IOLockLock + * @abstract Lock a mutex. + * @discussion Lock the mutex. If the lock is held by any thread, block waiting for its unlock. This function may block and so should not be called from interrupt level or while a spin lock is held. Locking the mutex recursively from one thread will result in deadlock. + * @param lock Pointer to the allocated lock. */ + +#ifdef IOLOCKS_INLINE +#define IOLockLock(l) lck_mtx_lock(l) +#else +void IOLockLock( IOLock * lock); +#endif /* !IOLOCKS_INLINE */ + +/*! @function IOLockTryLock + * @abstract Attempt to lock a mutex. + * @discussion Lock the mutex if it is currently unlocked, and return true. If the lock is held by any thread, return false. + * @param lock Pointer to the allocated lock. + * @result True if the mutex was unlocked and is now locked by the caller, otherwise false. */ + +#ifdef IOLOCKS_INLINE +#define IOLockTryLock(l) lck_mtx_try_lock(l) +#else +boolean_t IOLockTryLock( IOLock * lock); +#endif /* !IOLOCKS_INLINE */ + +/*! @function IOLockUnlock + * @abstract Unlock a mutex. + * @discussion Unlock the mutex and wake any blocked waiters. Results are undefined if the caller has not locked the mutex. This function may block and so should not be called from interrupt level or while a spin lock is held. + * @param lock Pointer to the allocated lock. */ + +#ifdef IOLOCKS_INLINE +#define IOLockUnlock(l) lck_mtx_unlock(l) +#else +void IOLockUnlock( IOLock * lock); +#endif /* !IOLOCKS_INLINE */ + +/*! @function IOLockSleep + * @abstract Sleep with mutex unlock and relock + * @discussion Prepare to sleep,unlock the mutex, and re-acquire it on wakeup. Results are undefined if the caller has not locked the mutex. This function may block and so should not be called from interrupt level or while a spin lock is held. + * @param lock Pointer to the locked lock. + * @param event The event to sleep on. Must be non-NULL. + * @param interType How can the sleep be interrupted. + * @result The wait-result value indicating how the thread was awakened.*/ +int IOLockSleep( IOLock * lock, void *event, UInt32 interType) __DARWIN14_ALIAS(IOLockSleep); + +int IOLockSleepDeadline( IOLock * lock, void *event, + AbsoluteTime deadline, UInt32 interType) __DARWIN14_ALIAS(IOLockSleepDeadline); + +void IOLockWakeup(IOLock * lock, void *event, bool oneThread) __DARWIN14_ALIAS(IOLockWakeup); + + +#ifdef __APPLE_API_OBSOLETE + +/* The following API is deprecated */ + +typedef enum { + kIOLockStateUnlocked = 0, + kIOLockStateLocked = 1 +} IOLockState; + +void IOLockInitWithState( IOLock * lock, IOLockState state); +#define IOLockInit( l ) IOLockInitWithState( l, kIOLockStateUnlocked); + +static __inline__ void +IOTakeLock( IOLock * lock) +{ + IOLockLock(lock); +} +static __inline__ boolean_t +IOTryLock( IOLock * lock) +{ + return IOLockTryLock(lock); +} +static __inline__ void +IOUnlock( IOLock * lock) +{ + IOLockUnlock(lock); +} + +#endif /* __APPLE_API_OBSOLETE */ + +/* + * Recursive lock operations + */ + +typedef struct _IORecursiveLock IORecursiveLock; + +/*! @function IORecursiveLockAlloc + * @abstract Allocates and initializes an recursive lock. + * @discussion Allocates a recursive lock in general purpose memory, and initializes it. Recursive locks function identically to mutexes but allow one thread to lock more than once, with balanced unlocks. IORecursiveLocks use the global IOKit lock group, IOLockGroup. To simplify kext debugging and lock-heat analysis, consider using lck_* locks with a per-driver lock group, as defined in kern/locks.h. + * @result Pointer to the allocated lock, or zero on failure. */ + +IORecursiveLock * IORecursiveLockAlloc( void ); + +/*! @function IORecursiveLockFree + * @abstract Frees a recursive lock. + * @discussion Frees a lock allocated with IORecursiveLockAlloc. Lock should be unlocked with no waiters. + * @param lock Pointer to the allocated lock. */ + +void IORecursiveLockFree( IORecursiveLock * lock); + +/*! @function IORecursiveLockGetMachLock + * @abstract Accessor to a Mach mutex. + * @discussion Accessor to the Mach mutex. + * @param lock Pointer to the allocated lock. */ + +lck_mtx_t * IORecursiveLockGetMachLock( IORecursiveLock * lock); + +/*! @function IORecursiveLockLock + * @abstract Lock a recursive lock. + * @discussion Lock the recursive lock. If the lock is held by another thread, block waiting for its unlock. This function may block and so should not be called from interrupt level or while a spin lock is held. The lock may be taken recursively by the same thread, with a balanced number of calls to IORecursiveLockUnlock. + * @param lock Pointer to the allocated lock. */ + +void IORecursiveLockLock( IORecursiveLock * lock); + +/*! @function IORecursiveLockTryLock + * @abstract Attempt to lock a recursive lock. + * @discussion Lock the lock if it is currently unlocked, or held by the calling thread, and return true. If the lock is held by another thread, return false. Successful calls to IORecursiveLockTryLock should be balanced with calls to IORecursiveLockUnlock. + * @param lock Pointer to the allocated lock. + * @result True if the lock is now locked by the caller, otherwise false. */ + +boolean_t IORecursiveLockTryLock( IORecursiveLock * lock); + +/*! @function IORecursiveLockUnlock + * @abstract Unlock a recursive lock. + * @discussion Undo one call to IORecursiveLockLock, if the lock is now unlocked wake any blocked waiters. Results are undefined if the caller does not balance calls to IORecursiveLockLock with IORecursiveLockUnlock. This function may block and so should not be called from interrupt level or while a spin lock is held. + * @param lock Pointer to the allocated lock. */ + +void IORecursiveLockUnlock( IORecursiveLock * lock); + +/*! @function IORecursiveLockHaveLock + * @abstract Check if a recursive lock is held by the calling thread. + * @discussion If the lock is held by the calling thread, return true, otherwise the lock is unlocked, or held by another thread and false is returned. + * @param lock Pointer to the allocated lock. + * @result True if the calling thread holds the lock otherwise false. */ + +boolean_t IORecursiveLockHaveLock( const IORecursiveLock * lock); + +extern int IORecursiveLockSleep( IORecursiveLock *_lock, + void *event, UInt32 interType); +extern int IORecursiveLockSleepDeadline( IORecursiveLock * _lock, void *event, + AbsoluteTime deadline, UInt32 interType); +extern void IORecursiveLockWakeup( IORecursiveLock *_lock, + void *event, bool oneThread); + +/* + * Complex (read/write) lock operations + */ + +#ifdef IOLOCKS_INLINE +typedef lck_rw_t IORWLock; +#else +typedef struct _IORWLock IORWLock; +#endif /* IOLOCKS_INLINE */ + +/*! @function IORWLockAlloc + * @abstract Allocates and initializes a read/write lock. + * @discussion Allocates and initializes a read/write lock in general purpose memory. Read/write locks provide for multiple readers, one exclusive writer, and are supplied by libkern/locks.h. This function may block and so should not be called from interrupt level or while a spin lock is held. IORWLocks use the global IOKit lock group, IOLockGroup. To simplify kext debugging and lock-heat analysis, consider using lck_* locks with a per-driver lock group, as defined in kern/locks.h. + * @result Pointer to the allocated lock, or zero on failure. */ + +IORWLock * IORWLockAlloc( void ); + +/*! @function IORWLockFree + * @abstract Frees a read/write lock. + * @discussion Frees a lock allocated with IORWLockAlloc. Lock should be unlocked with no waiters. + * @param lock Pointer to the allocated lock. */ + +void IORWLockFree( IORWLock * lock); + +/*! @function IORWLockGetMachLock + * @abstract Accessor to a Mach read/write lock. + * @discussion Accessor to the Mach read/write lock. + * @param lock Pointer to the allocated lock. */ + +lck_rw_t * IORWLockGetMachLock( IORWLock * lock); + +/*! @function IORWLockRead + * @abstract Lock a read/write lock for read. + * @discussion Lock the lock for read, allowing multiple readers when there are no writers. If the lock is held for write, block waiting for its unlock. This function may block and so should not be called from interrupt level or while a spin lock is held. Locking the lock recursively from one thread, for read or write, can result in deadlock. + * @param lock Pointer to the allocated lock. */ + +#ifdef IOLOCKS_INLINE +#define IORWLockRead(l) lck_rw_lock_shared(l) +#else +void IORWLockRead(IORWLock * lock); +#endif /* !IOLOCKS_INLINE */ + +/*! @function IORWLockWrite + * @abstract Lock a read/write lock for write. + * @discussion Lock the lock for write, allowing one writer exlusive access. If the lock is held for read or write, block waiting for its unlock. This function may block and so should not be called from interrupt level or while a spin lock is held. Locking the lock recursively from one thread, for read or write, can result in deadlock. + * @param lock Pointer to the allocated lock. */ + +#ifdef IOLOCKS_INLINE +#define IORWLockWrite(l) lck_rw_lock_exclusive(l) +#else +void IORWLockWrite( IORWLock * lock); +#endif /* !IOLOCKS_INLINE */ + +/*! @function IORWLockUnlock + * @abstract Unlock a read/write lock. + * @discussion Undo one call to IORWLockRead or IORWLockWrite. Results are undefined if the caller has not locked the lock. This function may block and so should not be called from interrupt level or while a spin lock is held. + * @param lock Pointer to the allocated lock. */ + +#ifdef IOLOCKS_INLINE +#define IORWLockUnlock(l) lck_rw_done(l) +#else +void IORWLockUnlock( IORWLock * lock); +#endif /* !IOLOCKS_INLINE */ + + +#ifdef __APPLE_API_OBSOLETE + +/* The following API is deprecated */ + +static __inline__ void +IOReadLock( IORWLock * lock) +{ + IORWLockRead(lock); +} +static __inline__ void +IOWriteLock( IORWLock * lock) +{ + IORWLockWrite(lock); +} +static __inline__ void +IORWUnlock( IORWLock * lock) +{ + IORWLockUnlock(lock); +} + +#endif /* __APPLE_API_OBSOLETE */ + + +/* + * Simple locks. Cannot block while holding a simple lock. + */ + +#ifdef IOLOCKS_INLINE +typedef lck_spin_t IOSimpleLock; +#else +typedef struct _IOSimpleLock IOSimpleLock; +#endif /* IOLOCKS_INLINE */ + +/*! @function IOSimpleLockAlloc + * @abstract Allocates and initializes a spin lock. + * @discussion Allocates and initializes a spin lock in general purpose memory. Spin locks provide non-blocking mutual exclusion for synchronization between thread context and interrupt context, or for multiprocessor synchronization, and are supplied by libkern/locks.h. This function may block and so should not be called from interrupt level or while a spin lock is held. IOSimpleLocks use the global IOKit lock group, IOLockGroup. To simplify kext debugging and lock-heat analysis, consider using lck_* locks with a per-driver lock group, as defined in kern/locks.h. + * @result Pointer to the allocated lock, or zero on failure. */ + +IOSimpleLock * IOSimpleLockAlloc( void ); + +/*! @function IOSimpleLockFree + * @abstract Frees a spin lock. + * @discussion Frees a lock allocated with IOSimpleLockAlloc. + * @param lock Pointer to the lock. */ + +void IOSimpleLockFree( IOSimpleLock * lock ); + +/*! @function IOSimpleLockGetMachLock + * @abstract Accessor to a Mach spin lock. + * @discussion Accessor to the Mach spin lock. + * @param lock Pointer to the allocated lock. */ + +lck_spin_t * IOSimpleLockGetMachLock( IOSimpleLock * lock); + +/*! @function IOSimpleLockInit + * @abstract Initialize a spin lock. + * @discussion Initialize a non heap allocated spin lock to the unlocked state. Use this function when your lock is, for example, a member variable. You will need to call IOSimpleLockDestroy when you are finished with the lock to avoid lock group refcount leaks. + * @param lock Pointer to the lock. */ + +void IOSimpleLockInit( IOSimpleLock * lock ); + +/*! @function IOSimpleLockDestroy + * @abstract De-initializes (destroys) a spin lock initialized with IOSimpleLockInit + * @discussion Destroy / De-initialize a non heap allocated spin lock, releasing any system resources such as lock group refcounts. + * @param lock Pointer to the lock. */ + +void IOSimpleLockDestroy( IOSimpleLock * lock ); + +/*! @function IOSimpleLockLock + * @abstract Lock a spin lock. + * @discussion Lock the spin lock. If the lock is held, spin waiting for its unlock. Spin locks disable preemption, cannot be held across any blocking operation, and should be held for very short periods. When used to synchronize between interrupt context and thread context they should be locked with interrupts disabled - IOSimpleLockLockDisableInterrupt() will do both. Locking the lock recursively from one thread will result in deadlock. + * @param lock Pointer to the lock. */ + +#ifdef IOLOCKS_INLINE +#define IOSimpleLockLock(l) lck_spin_lock(l) +#else +void IOSimpleLockLock( IOSimpleLock * lock ); +#endif /* !IOLOCKS_INLINE */ + + +/*! @function IOSimpleLockTryLock + * @abstract Attempt to lock a spin lock. + * @discussion Lock the spin lock if it is currently unlocked, and return true. If the lock is held, return false. Successful calls to IOSimpleLockTryLock should be balanced with calls to IOSimpleLockUnlock. + * @param lock Pointer to the lock. + * @result True if the lock was unlocked and is now locked by the caller, otherwise false. */ + +#ifdef IOLOCKS_INLINE +#define IOSimpleLockTryLock(l) lck_spin_try_lock(l) +#else +boolean_t IOSimpleLockTryLock( IOSimpleLock * lock ); +#endif /* !IOLOCKS_INLINE */ + +/*! @function IOSimpleLockUnlock + * @abstract Unlock a spin lock. + * @discussion Unlock the lock, and restore preemption. Results are undefined if the caller has not locked the lock. + * @param lock Pointer to the lock. */ + +#ifdef IOLOCKS_INLINE +#define IOSimpleLockUnlock(l) lck_spin_unlock(l) +#else +void IOSimpleLockUnlock( IOSimpleLock * lock ); +#endif /* !IOLOCKS_INLINE */ + + +#if __LP64__ +typedef boolean_t IOInterruptState; +#else +typedef long int IOInterruptState; +#endif + +/*! @function IOSimpleLockLockDisableInterrupt + * @abstract Lock a spin lock. + * @discussion Lock the spin lock. If the lock is held, spin waiting for its unlock. Simple locks disable preemption, cannot be held across any blocking operation, and should be held for very short periods. When used to synchronize between interrupt context and thread context they should be locked with interrupts disabled - IOSimpleLockLockDisableInterrupt() will do both. Locking the lock recursively from one thread will result in deadlock. + * @param lock Pointer to the lock. */ + +static __inline__ +IOInterruptState +IOSimpleLockLockDisableInterrupt( IOSimpleLock * lock ) +{ + IOInterruptState state = ml_set_interrupts_enabled( false ); + IOSimpleLockLock( lock ); + return state; +} + +/*! @function IOSimpleLockUnlockEnableInterrupt + * @abstract Unlock a spin lock, and restore interrupt state. + * @discussion Unlock the lock, and restore preemption and interrupts to the state as they were when the lock was taken. Results are undefined if the caller has not locked the lock. + * @param lock Pointer to the lock. + * @param state The interrupt state returned by IOSimpleLockLockDisableInterrupt() */ + +static __inline__ +void +IOSimpleLockUnlockEnableInterrupt( IOSimpleLock * lock, + IOInterruptState state ) +{ + IOSimpleLockUnlock( lock ); + ml_set_interrupts_enabled( state ); +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* !__IOKIT_IOLOCKS_H */ diff --git a/QualcommWireless/include/IOKit/IOMapper.h b/QualcommWireless/include/IOKit/IOMapper.h new file mode 100644 index 0000000..c44c0a6 --- /dev/null +++ b/QualcommWireless/include/IOKit/IOMapper.h @@ -0,0 +1,148 @@ +/* + * Copyright (c) 1998-2016 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef __IOKIT_IOMAPPER_H +#define __IOKIT_IOMAPPER_H + +#include + +__BEGIN_DECLS +#include +#include + +// These are C accessors to the system mapper for non-IOKit clients +ppnum_t IOMapperIOVMAlloc(unsigned pages); +void IOMapperIOVMFree(ppnum_t addr, unsigned pages); +ppnum_t IOMapperInsertPage(ppnum_t addr, unsigned offset, ppnum_t page); + +__END_DECLS + +#if __cplusplus + +#include +#include +#include + +class OSData; + +extern const OSSymbol * gIOMapperIDKey; + +class IOMapper : public IOService +{ + OSDeclareAbstractStructors(IOMapper); + +// Give the platform expert access to setMapperRequired(); + friend class IOPlatformExpert; + friend class IOMemoryDescriptor; + friend class IOGeneralMemoryDescriptor; + +private: + enum SystemMapperState { + kNoMapper = 0, + kUnknown = 1, + kHasMapper = 2, // Any other value is pointer to a live mapper + kWaitMask = 3, + }; +protected: + uint64_t __reserved[8]; + bool fIsSystem; + + static void setMapperRequired(bool hasMapper); + static void waitForSystemMapper(); + + virtual bool initHardware(IOService *provider) = 0; + +public: + virtual bool start(IOService *provider) APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + +// To get access to the system mapper IOMapper::gSystem + static IOMapper *gSystem; + + static void + checkForSystemMapper() + { + if ((uintptr_t) gSystem & kWaitMask) { + waitForSystemMapper(); + } + } + + static IOMapper * copyMapperForDevice(IOService * device); + static IOMapper * copyMapperForDeviceWithIndex(IOService * device, unsigned int index); + +// { subclasses + + virtual uint64_t getPageSize(void) const = 0; + + virtual IOReturn iovmMapMemory(IOMemoryDescriptor * memory, + uint64_t descriptorOffset, + uint64_t length, + uint32_t mapOptions, + const IODMAMapSpecification * mapSpecification, + IODMACommand * dmaCommand, + const IODMAMapPageList * pageList, + uint64_t * mapAddress, + uint64_t * mapLength) = 0; + + virtual IOReturn iovmUnmapMemory(IOMemoryDescriptor * memory, + IODMACommand * dmaCommand, + uint64_t mapAddress, + uint64_t mapLength) = 0; + + virtual IOReturn iovmInsert(uint32_t options, + uint64_t mapAddress, + uint64_t offset, + uint64_t physicalAddress, + uint64_t length) = 0; + + virtual uint64_t mapToPhysicalAddress(uint64_t mappedAddress) = 0; + +// } + +private: + OSMetaClassDeclareReservedUnused(IOMapper, 0); + OSMetaClassDeclareReservedUnused(IOMapper, 1); + OSMetaClassDeclareReservedUnused(IOMapper, 2); + OSMetaClassDeclareReservedUnused(IOMapper, 3); + OSMetaClassDeclareReservedUnused(IOMapper, 4); + OSMetaClassDeclareReservedUnused(IOMapper, 5); + OSMetaClassDeclareReservedUnused(IOMapper, 6); + OSMetaClassDeclareReservedUnused(IOMapper, 7); + OSMetaClassDeclareReservedUnused(IOMapper, 8); + OSMetaClassDeclareReservedUnused(IOMapper, 9); + OSMetaClassDeclareReservedUnused(IOMapper, 10); + OSMetaClassDeclareReservedUnused(IOMapper, 11); + OSMetaClassDeclareReservedUnused(IOMapper, 12); + OSMetaClassDeclareReservedUnused(IOMapper, 13); + OSMetaClassDeclareReservedUnused(IOMapper, 14); + OSMetaClassDeclareReservedUnused(IOMapper, 15); +}; + +#endif /* __cplusplus */ + +#endif /* !__IOKIT_IOMAPPER_H */ diff --git a/QualcommWireless/include/IOKit/IOMemoryCursor.h b/QualcommWireless/include/IOKit/IOMemoryCursor.h new file mode 100644 index 0000000..3b81e6d --- /dev/null +++ b/QualcommWireless/include/IOKit/IOMemoryCursor.h @@ -0,0 +1,383 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +#ifndef _IOMEMORYCURSOR_H +#define _IOMEMORYCURSOR_H + +#include +#include + +class IOMemoryDescriptor; + +/**************************** class IOMemoryCursor ***************************/ + +/*! + * @class IOMemoryCursor + * @abstract A mechanism to convert memory references to physical addresses. + * @discussion The IOMemoryCursor declares the super class that all + * specific memory cursors must inherit from, but a memory cursor can be created without a specific format subclass by just providing a segment function to the initializers. This class does the difficult stuff of dividing a memory descriptor into a physical scatter/gather list appropriate for the target hardware. + *

+ * A driver is expected to create a memory cursor and configure it to the limitations of its DMA hardware; for instance the memory cursor used by the FireWire SBP-2 protocol has a maximum physical segment size of 2^16 - 1 but the actual transfer size is unlimited. Thus it would create a cursor with a maxSegmentSize of 65535 and a maxTransfer size of UINT_MAX. It would also provide a SegmentFunction that can output a pagelist entry. + *

+ * Below is the simplest example of a SegmentFunction:
+ * void IONaturalMemoryCursor::outputSegment(PhysicalSegment segment,
+ * void * outSegments,
+ * UInt32 outSegmentIndex)
+ * {
+ * ((PhysicalSegment *) outSegments)[outSegmentIndex] = segment;
+ * } + * + */ +class IOMemoryCursor : public OSObject +{ + OSDeclareDefaultStructors(IOMemoryCursor); + +public: +/*! + * @typedef PhysicalSegment + * @discussion A physical address/length pair. + */ + struct PhysicalSegment { + IOPhysicalAddress location; + IOPhysicalLength length; + }; + +/*! @defined IOPhysicalSegment + * @discussion Backward compatibility define for the old non-class scoped type definition. See IOMemoryCursor::PhysicalSegment + */ +#define IOPhysicalSegment IOMemoryCursor::PhysicalSegment + +/*! + * @typedef SegmentFunction + * @discussion Pointer to a C function that outputs a single physical segment to an element in the array as defined by the segments and segmentIndex parameters. + * @param segment The physical address and length that is next to be output. + * @param segments Base of the output vector of DMA address length pairs. + * @param segmentIndex Index to output 'segment' in the 'segments' array. + */ + typedef void (*SegmentFunction)(PhysicalSegment segment, + void * segments, + UInt32 segmentIndex); + +/*! @defined OutputSegmentFunc + * @discussion Backward compatibility define for the old non-class scoped type definition. See IOMemoryCursor::SegmentFunction */ +#define OutputSegmentFunc IOMemoryCursor::SegmentFunction + +protected: +/*! @var outSeg The action method called when an event has been delivered */ + SegmentFunction outSeg; + +/*! @var maxSegmentSize Maximum size of one segment in a scatter/gather list */ + IOPhysicalLength maxSegmentSize; + +/*! @var maxTransferSize + * Maximum size of a transfer that this memory cursor is allowed to generate */ + IOPhysicalLength maxTransferSize; + +/*! @var alignMask + * Currently unused. Reserved for automated aligment restriction code. */ + IOPhysicalLength alignMask; + +public: +/*! @function withSpecification + * @abstract Creates and initializes an IOMemoryCursor in one operation. + * @discussion Factory function to create and initialize an IOMemoryCursor in one operation. For more information, see IOMemoryCursor::initWithSpecification. + * @param outSegFunc SegmentFunction to call to output one physical segment. + * @param maxSegmentSize Maximum allowable size for one segment. Defaults to 0. + * @param maxTransferSize Maximum size of an entire transfer. Defaults to 0 indicating no maximum. + * @param alignment Alignment restrictions on output physical addresses. Not currently implemented. Defaults to single byte alignment. + * @result Returns a new memory cursor if successfully created and initialized, 0 otherwise. + */ + static IOMemoryCursor * + withSpecification(SegmentFunction outSegFunc, + IOPhysicalLength maxSegmentSize = 0, + IOPhysicalLength maxTransferSize = 0, + IOPhysicalLength alignment = 1); + +/*! @function initWithSpecification + * @abstract Primary initializer for the IOMemoryCursor class. + * @param outSegFunc SegmentFunction to call to output one physical segment. + * @param maxSegmentSize Maximum allowable size for one segment. Defaults to 0. + * @param maxTransferSize Maximum size of an entire transfer. Defaults to 0 indicating no maximum. + * @param alignment Alignment restrictions on output physical addresses. Not currently implemented. Defaults to single byte alignment. + * @result Returns true if the inherited classes and this instance initialize + * successfully. + */ + virtual bool initWithSpecification(SegmentFunction outSegFunc, + IOPhysicalLength maxSegmentSize = 0, + IOPhysicalLength maxTransferSize = 0, + IOPhysicalLength alignment = 1); + +/*! @function genPhysicalSegments + * @abstract Generates a physical scatter/gather list given a memory descriptor. + * @discussion Generates a list of physical segments from the given memory descriptor, relative to the current position of the descriptor. + * @param descriptor IOMemoryDescriptor that describes the data associated with an I/O request. + * @param fromPosition Starting location of the I/O within a memory descriptor. + * @param segments Void pointer to base of output physical scatter/gather list. Always passed directly onto the SegmentFunction without interpretation by the cursor. + * @param maxSegments Maximum number of segments that can be written to segments array. + * @param maxTransferSize Maximum transfer size is limited to that many bytes, otherwise it defaults to the maximum transfer size specified when the memory cursor was initialized. + * @param transferSize Pointer to an IOByteCount variable that can contain the total size of the transfer being described. Defaults to 0 indicating that no transfer size need be returned. + * @result If the descriptor is exhausted of memory, a zero is returned, otherwise the number of segments that were filled in is returned. + */ + virtual UInt32 genPhysicalSegments( + IOMemoryDescriptor *descriptor, + IOByteCount fromPosition, + void * segments, + UInt32 maxSegments, + UInt32 maxTransferSize = 0, + IOByteCount *transferSize = NULL); +}; + +/************************ class IONaturalMemoryCursor ************************/ + + +/*! + * @class IONaturalMemoryCursor + * @abstract An IOMemoryCursor subclass that outputs a vector of PhysicalSegments in the natural byte orientation for the CPU. + * @discussion The IONaturalMemoryCursor would be used when it is too difficult to safely describe a SegmentFunction that is more appropriate for your hardware. This cursor just outputs an array of PhysicalSegments. + */ +class IONaturalMemoryCursor : public IOMemoryCursor +{ + OSDeclareDefaultStructors(IONaturalMemoryCursor); + +public: +/*! @function outputSegment + * @abstract Outputs the given segment into the output segments array in natural byte order. + * @param segment The physical address and length that is next to be output. + * @param segments Base of the output vector of DMA address length pairs. + * @param segmentIndex Index to output 'segment' in the 'segments' array. + */ + static void outputSegment(PhysicalSegment segment, + void * segments, + UInt32 segmentIndex); + +/*! @defined naturalOutputSegment + * @discussion Backward compatibility define for the old global function definition. See IONaturalMemoryCursor::outputSegment. + */ +#define naturalOutputSegment IONaturalMemoryCursor::outputSegment + +/*! @function withSpecification + * @abstract Creates and initializes an IONaturalMemoryCursor in one operation. + * @discussion Factory function to create and initialize an IONaturalMemoryCursor in one operation. For more information, see IONaturalMemoryCursor::initWithSpecification. + * @param maxSegmentSize Maximum allowable size for one segment. Defaults to 0. + * @param maxTransferSize Maximum size of an entire transfer. Defaults to 0 indicating no maximum. + * @param alignment Alignment restrictions on output physical addresses. Not currently implemented. Defaults to single byte alignment. + * @result Returns a new memory cursor if successfully created and initialized, 0 otherwise. + */ + static IONaturalMemoryCursor * + withSpecification(IOPhysicalLength maxSegmentSize, + IOPhysicalLength maxTransferSize, + IOPhysicalLength alignment = 1); + +/*! @function initWithSpecification + * @abstract Primary initializer for the IONaturalMemoryCursor class. + * @param maxSegmentSize Maximum allowable size for one segment. Defaults to 0. + * @param maxTransferSize Maximum size of an entire transfer. Defaults to 0 indicating no maximum. + * @param alignment Alignment restrictions on output physical addresses. Not currently implemented. Defaults to single byte alignment. + * @result Returns true if the inherited classes and this instance initialize successfully. + */ + virtual bool initWithSpecification(IOPhysicalLength maxSegmentSize, + IOPhysicalLength maxTransferSize, + IOPhysicalLength alignment = 1); + + +/*! @function getPhysicalSegments + * @abstract Generates a CPU natural physical scatter/gather list given a memory descriptor. + * @discussion Generates a list of physical segments from the given memory descriptor, relative to the current position of the descriptor. Wraps IOMemoryCursor::genPhysicalSegments. + * @param descriptor IOMemoryDescriptor that describes the data associated with an I/O request. + * @param fromPosition Starting location of the I/O within a memory descriptor. + * @param segments Pointer to an array of IOMemoryCursor::PhysicalSegments for the output physical scatter/gather list. + * @param maxSegments Maximum number of segments that can be written to segments array. + * @param inMaxTransferSize Maximum transfer size is limited to that many bytes, otherwise it defaults to the maximum transfer size specified when the memory cursor was initialized. + * @param transferSize Pointer to an IOByteCount variable that can contain the total size of the transfer being described. Defaults to 0 indicating that no transfer size need be returned. + * @result If the descriptor is exhausted of memory, a zero is returned, otherwise the number of segments that were filled in is returned. + */ + virtual UInt32 + getPhysicalSegments(IOMemoryDescriptor *descriptor, + IOByteCount fromPosition, + PhysicalSegment *segments, + UInt32 maxSegments, + UInt32 inMaxTransferSize = 0, + IOByteCount *transferSize = NULL) + { + return genPhysicalSegments(descriptor, fromPosition, segments, + maxSegments, inMaxTransferSize, transferSize); + } +}; + +/************************** class IOBigMemoryCursor **************************/ + +/*! + * @class IOBigMemoryCursor + * @abstract An IOMemoryCursor subclass that outputs a vector of PhysicalSegments in the big endian byte order. + * @discussion The IOBigMemoryCursor would be used when the DMA hardware requires a big endian address and length pair. This cursor outputs an array of PhysicalSegments that are encoded in big-endian format. + */ +class IOBigMemoryCursor : public IOMemoryCursor +{ + OSDeclareDefaultStructors(IOBigMemoryCursor); + +public: +/*! @function outputSegment + * @abstract Outputs the given segment into the output segments array in big endian byte order. + * @param segment The physical address and length that is next to be output. + * @param segments Base of the output vector of DMA address length pairs. + * @param segmentIndex Index to output 'segment' in the 'segments' array. + */ + static void outputSegment(PhysicalSegment segment, + void * segments, + UInt32 segmentIndex); + +/*! @defined bigOutputSegment + * @discussion Backward compatibility define for the old global function definition. See IOBigMemoryCursor::outputSegment + */ +#define bigOutputSegment IOBigMemoryCursor::outputSegment + +/*! @function withSpecification + * @abstract Creates and initializes an IOBigMemoryCursor in one operation. + * @discussion Factory function to create and initialize an IOBigMemoryCursor in one operation. See also IOBigMemoryCursor::initWithSpecification. + * @param maxSegmentSize Maximum allowable size for one segment. Defaults to 0. + * @param maxTransferSize Maximum size of an entire transfer. Defaults to 0 indicating no maximum. + * @param alignment Alignment restrictions on output physical addresses. Not currently implemented. Defaults to single byte alignment. + * @result Returns a new memory cursor if successfully created and initialized, 0 otherwise. + */ + static IOBigMemoryCursor * + withSpecification(IOPhysicalLength maxSegmentSize, + IOPhysicalLength maxTransferSize, + IOPhysicalLength alignment = 1); + +/*! @function initWithSpecification + * @abstract Primary initializer for the IOBigMemoryCursor class. + * @param maxSegmentSize Maximum allowable size for one segment. Defaults to 0. + * @param maxTransferSize Maximum size of an entire transfer. Defaults to 0 indicating no maximum. + * @param alignment Alignment restrictions on output physical addresses. Not currently implemented. Defaults to single byte alignment. + * @result Returns true if the inherited classes and this instance initialize + * successfully. + */ + virtual bool initWithSpecification(IOPhysicalLength maxSegmentSize, + IOPhysicalLength maxTransferSize, + IOPhysicalLength alignment = 1); + + +/*! @function getPhysicalSegments + * @abstract Generates a big endian physical scatter/gather list given a memory descriptor. + * @discussion Generates a list of physical segments from the given memory descriptor, relative to the current position of the descriptor. Wraps IOMemoryCursor::genPhysicalSegments. + * @param descriptor IOMemoryDescriptor that describes the data associated with an I/O request. + * @param fromPosition Starting location of the I/O within a memory descriptor. + * @param segments Pointer to an array of IOMemoryCursor::PhysicalSegments for the output physical scatter/gather list. + * @param maxSegments Maximum number of segments that can be written to segments array. + * @param inMaxTransferSize Maximum transfer size is limited to that many bytes, otherwise it defaults to the maximum transfer size specified when the memory cursor was initialized. + * @param transferSize Pointer to an IOByteCount variable that can contain the total size of the transfer being described. Defaults to 0 indicating that no transfer size need be returned. + * @result If the descriptor is exhausted of memory, a zero is returned, otherwise the number of segments that were filled in is returned. + */ + virtual UInt32 + getPhysicalSegments(IOMemoryDescriptor * descriptor, + IOByteCount fromPosition, + PhysicalSegment * segments, + UInt32 maxSegments, + UInt32 inMaxTransferSize = 0, + IOByteCount * transferSize = NULL) + { + return genPhysicalSegments(descriptor, fromPosition, segments, + maxSegments, inMaxTransferSize, transferSize); + } +}; + +/************************* class IOLittleMemoryCursor ************************/ + +/*! + * @class IOLittleMemoryCursor + * @abstract An IOMemoryCursor subclass that outputs a vector of PhysicalSegments in the little endian byte order. + * @discussion The IOLittleMemoryCursor would be used when the DMA hardware requires a little endian address and length pair. This cursor outputs an array of PhysicalSegments that are encoded in little endian format. + */ +class IOLittleMemoryCursor : public IOMemoryCursor +{ + OSDeclareDefaultStructors(IOLittleMemoryCursor); + +public: +/*! @function outputSegment + * @abstract Outputs the given segment into the output segments array in little endian byte order. + * @param segment The physical address and length that is next to be output. + * @param segments Base of the output vector of DMA address length pairs. + * @param segmentIndex Index to output 'segment' in the 'segments' array. + */ + static void outputSegment(PhysicalSegment segment, + void * segments, + UInt32 segmentIndex); + +/*! @defined littleOutputSegment + * @discussion Backward compatibility define for the old global function definition. See also IOLittleMemoryCursor::outputSegment. */ +#define littleOutputSegment IOLittleMemoryCursor::outputSegment + +/*! @function withSpecification + * @abstract Creates and initializes an IOLittleMemoryCursor in one operation. + * @discussion Factory function to create and initialize an IOLittleMemoryCursor in one operation. See also IOLittleMemoryCursor::initWithSpecification. + * @param maxSegmentSize Maximum allowable size for one segment. Defaults to 0. + * @param maxTransferSize Maximum size of an entire transfer. Defaults to 0 indicating no maximum. + * @param alignment Alignment restrictions on output physical addresses. Not currently implemented. Defaults to single byte alignment. + * @result Returns a new memory cursor if successfully created and initialized, 0 otherwise. + */ + static IOLittleMemoryCursor * + withSpecification(IOPhysicalLength maxSegmentSize, + IOPhysicalLength maxTransferSize, + IOPhysicalLength alignment = 1); + +/*! @function initWithSpecification + * @abstract Primary initializer for the IOLittleMemoryCursor class. + * @param maxSegmentSize Maximum allowable size for one segment. Defaults to 0. + * @param maxTransferSize Maximum size of an entire transfer. Defaults to 0 indicating no maximum. + * @param alignment Alignment restrictions on output physical addresses. Not currently implemented. Defaults to single byte alignment. + * @result Returns true if the inherited classes and this instance initialize successfully. + */ + virtual bool initWithSpecification(IOPhysicalLength maxSegmentSize, + IOPhysicalLength maxTransferSize, + IOPhysicalLength alignment = 1); + + +/*! @function getPhysicalSegments + * @abstract Generates a little endian physical scatter/gather list given a memory descriptor. + * @discussion Generates a list of physical segments from the given memory descriptor, relative to the current position of the descriptor. Wraps IOMemoryCursor::genPhysicalSegments. + * @param descriptor IOMemoryDescriptor that describes the data associated with an I/O request. + * @param fromPosition Starting location of the I/O within a memory descriptor. + * @param segments Pointer to an array of IOMemoryCursor::PhysicalSegments for the output physical scatter/gather list. + * @param maxSegments Maximum number of segments that can be written to segments array. + * @param inMaxTransferSize Maximum transfer size is limited to that many bytes, otherwise it defaults to the maximum transfer size specified when the memory cursor was initialized. + * @param transferSize Pointer to an IOByteCount variable that can contain the total size of the transfer being described. Defaults to 0 indicating that no transfer size need be returned. + * @result If the descriptor is exhausted of memory, a zero is returned, otherwise the number of segments that were filled in is returned. + */ + virtual UInt32 + getPhysicalSegments(IOMemoryDescriptor * descriptor, + IOByteCount fromPosition, + PhysicalSegment * segments, + UInt32 maxSegments, + UInt32 inMaxTransferSize = 0, + IOByteCount * transferSize = NULL) + { + return genPhysicalSegments(descriptor, fromPosition, segments, + maxSegments, inMaxTransferSize, transferSize); + } +}; + +#endif /* !_IOMEMORYCURSOR_H */ diff --git a/QualcommWireless/include/IOKit/IOMemoryDescriptor.h b/QualcommWireless/include/IOKit/IOMemoryDescriptor.h new file mode 100644 index 0000000..8f92bd2 --- /dev/null +++ b/QualcommWireless/include/IOKit/IOMemoryDescriptor.h @@ -0,0 +1,1036 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +#ifndef _IOMEMORYDESCRIPTOR_H +#define _IOMEMORYDESCRIPTOR_H + +#include + +#include +#include +#include +#include +#include + +#include + +class IOMemoryMap; +class IOMapper; +class IOService; +class IODMACommand; + +/* + * Direction of transfer, with respect to the described memory. + */ +#ifdef __LP64__ +enum +#else /* !__LP64__ */ +enum IODirection +#endif /* !__LP64__ */ +{ + kIODirectionNone = 0x0,// same as VM_PROT_NONE + kIODirectionIn = 0x1,// User land 'read', same as VM_PROT_READ + kIODirectionOut = 0x2,// User land 'write', same as VM_PROT_WRITE + kIODirectionOutIn = kIODirectionOut | kIODirectionIn, + kIODirectionInOut = kIODirectionIn | kIODirectionOut, + + // these flags are valid for the prepare() method only + kIODirectionPrepareToPhys32 = 0x00000004, + kIODirectionPrepareNoFault = 0x00000008, + kIODirectionPrepareReserved1 = 0x00000010, +#define IODIRECTIONPREPARENONCOHERENTDEFINED 1 + kIODirectionPrepareNonCoherent = 0x00000020, + + // these flags are valid for the complete() method only +#define IODIRECTIONCOMPLETEWITHERRORDEFINED 1 + kIODirectionCompleteWithError = 0x00000040, +#define IODIRECTIONCOMPLETEWITHDATAVALIDDEFINED 1 + kIODirectionCompleteWithDataValid = 0x00000080, +}; + +#ifdef __LP64__ +typedef IOOptionBits IODirection; +#endif /* __LP64__ */ + +/* + * IOOptionBits used in the withOptions variant + */ +enum { + kIOMemoryDirectionMask = 0x00000007, + + kIOMemoryTypeVirtual = 0x00000010, + kIOMemoryTypePhysical = 0x00000020, + kIOMemoryTypeUPL = 0x00000030, + kIOMemoryTypePersistentMD = 0x00000040,// Persistent Memory Descriptor + kIOMemoryTypeUIO = 0x00000050, +#ifdef __LP64__ + kIOMemoryTypeVirtual64 = kIOMemoryTypeVirtual, + kIOMemoryTypePhysical64 = kIOMemoryTypePhysical, +#else /* !__LP64__ */ + kIOMemoryTypeVirtual64 = 0x00000060, + kIOMemoryTypePhysical64 = 0x00000070, +#endif /* !__LP64__ */ + kIOMemoryTypeMask = 0x000000f0, + + kIOMemoryAsReference = 0x00000100, + kIOMemoryBufferPageable = 0x00000400, + kIOMemoryMapperNone = 0x00000800,// Shared with Buffer MD + kIOMemoryHostOnly = 0x00001000,// Never DMA accessible + kIOMemoryPersistent = 0x00010000, + kIOMemoryMapCopyOnWrite = 0x00020000, + kIOMemoryRemote = 0x00040000, + kIOMemoryThreadSafe = 0x00100000,// Shared with Buffer MD + kIOMemoryClearEncrypt = 0x00200000,// Shared with Buffer MD + kIOMemoryUseReserve = 0x00800000,// Shared with Buffer MD +#define IOMEMORYUSERESERVEDEFINED 1 + +}; + +#define kIOMapperSystem ((IOMapper *) NULL) + +enum{ + kIOMemoryLedgerTagDefault = VM_LEDGER_TAG_DEFAULT, + kIOmemoryLedgerTagNetwork = VM_LEDGER_TAG_NETWORK, + kIOMemoryLedgerTagMedia = VM_LEDGER_TAG_MEDIA, + kIOMemoryLedgerTagGraphics = VM_LEDGER_TAG_GRAPHICS, + kIOMemoryLedgerTagNeural = VM_LEDGER_TAG_NEURAL, +}; +enum{ + kIOMemoryLedgerFlagNoFootprint = VM_LEDGER_FLAG_NO_FOOTPRINT, +}; + +enum{ + kIOMemoryPurgeableKeepCurrent = 1, + + kIOMemoryPurgeableNonVolatile = 2, + kIOMemoryPurgeableVolatile = 3, + kIOMemoryPurgeableEmpty = 4, + + // modifiers for kIOMemoryPurgeableVolatile behavior + kIOMemoryPurgeableVolatileGroup0 = VM_VOLATILE_GROUP_0, + kIOMemoryPurgeableVolatileGroup1 = VM_VOLATILE_GROUP_1, + kIOMemoryPurgeableVolatileGroup2 = VM_VOLATILE_GROUP_2, + kIOMemoryPurgeableVolatileGroup3 = VM_VOLATILE_GROUP_3, + kIOMemoryPurgeableVolatileGroup4 = VM_VOLATILE_GROUP_4, + kIOMemoryPurgeableVolatileGroup5 = VM_VOLATILE_GROUP_5, + kIOMemoryPurgeableVolatileGroup6 = VM_VOLATILE_GROUP_6, + kIOMemoryPurgeableVolatileGroup7 = VM_VOLATILE_GROUP_7, + kIOMemoryPurgeableVolatileBehaviorFifo = VM_PURGABLE_BEHAVIOR_FIFO, + kIOMemoryPurgeableVolatileBehaviorLifo = VM_PURGABLE_BEHAVIOR_LIFO, + kIOMemoryPurgeableVolatileOrderingObsolete = VM_PURGABLE_ORDERING_OBSOLETE, + kIOMemoryPurgeableVolatileOrderingNormal = VM_PURGABLE_ORDERING_NORMAL, + kIOMemoryPurgeableFaultOnAccess = VM_PURGABLE_DEBUG_FAULT, +}; +enum{ + kIOMemoryIncoherentIOFlush = 1, + kIOMemoryIncoherentIOStore = 2, + + kIOMemoryClearEncrypted = 50, + kIOMemorySetEncrypted = 51, +}; + +#define IOMEMORYDESCRIPTOR_SUPPORTS_DMACOMMAND 1 + +struct IODMAMapSpecification { + uint64_t alignment; + IOService * device; + uint32_t options; + uint8_t numAddressBits; + uint8_t resvA[3]; + uint32_t resvB[4]; +}; + +struct IODMAMapPageList { + uint32_t pageOffset; + uint32_t pageListCount; + const upl_page_info_t * pageList; +}; + +// mapOptions for iovmMapMemory +enum{ + kIODMAMapReadAccess = 0x00000001, + kIODMAMapWriteAccess = 0x00000002, + kIODMAMapPhysicallyContiguous = 0x00000010, + kIODMAMapDeviceMemory = 0x00000020, + kIODMAMapPagingPath = 0x00000040, + kIODMAMapIdentityMap = 0x00000080, + + kIODMAMapPageListFullyOccupied = 0x00000100, + kIODMAMapFixedAddress = 0x00000200, +}; + + +enum{ + kIOPreparationIDUnprepared = 0, + kIOPreparationIDUnsupported = 1, + kIOPreparationIDAlwaysPrepared = 2, +}; + + + +/*! @class IOMemoryDescriptor : public OSObject + * @abstract An abstract base class defining common methods for describing physical or virtual memory. + * @discussion The IOMemoryDescriptor object represents a buffer or range of memory, specified as one or more physical or virtual address ranges. It contains methods to return the memory's physically contiguous segments (fragments), for use with the IOMemoryCursor, and methods to map the memory into any address space with caching and placed mapping options. */ + +class IOMemoryDescriptor : public OSObject +{ + friend class IOMemoryMap; + friend class IOMultiMemoryDescriptor; + + OSDeclareDefaultStructorsWithDispatch(IOMemoryDescriptor); + +protected: + +/*! @var reserved + * Reserved for future use. (Internal use only) */ + struct IOMemoryDescriptorReserved * reserved; + +protected: + OSSet * _mappings; + IOOptionBits _flags; + + + void * __iomd_reserved5; + uint16_t __iomd_reserved1[4]; + uintptr_t __iomd_reserved2; + + uintptr_t __iomd_reserved3; + uintptr_t __iomd_reserved4; + +#ifndef __LP64__ + IODirection _direction; /* use _flags instead */ +#endif /* !__LP64__ */ + IOByteCount _length; /* length of all ranges */ + IOOptionBits _tag; + +public: + typedef IOOptionBits DMACommandOps; +#ifndef __LP64__ + virtual IOPhysicalAddress getSourceSegment( IOByteCount offset, + IOByteCount * length ) APPLE_KEXT_DEPRECATED; +#endif /* !__LP64__ */ + +/*! @function initWithOptions + * @abstract Master initialiser for all variants of memory descriptors. For a more complete description see IOMemoryDescriptor::withOptions. + * @discussion Note this function can be used to re-init a previously created memory descriptor. + * @result true on success, false on failure. */ + virtual bool initWithOptions(void * buffers, + UInt32 count, + UInt32 offset, + task_t task, + IOOptionBits options, + IOMapper * mapper = kIOMapperSystem); + +#ifndef __LP64__ + virtual addr64_t getPhysicalSegment64( IOByteCount offset, + IOByteCount * length ) APPLE_KEXT_DEPRECATED; /* use getPhysicalSegment() and kIOMemoryMapperNone instead */ +#endif /* !__LP64__ */ + +/*! @function setPurgeable + * @abstract Control the purgeable status of a memory descriptors memory. + * @discussion Buffers may be allocated with the ability to have their purgeable status changed - IOBufferMemoryDescriptor with the kIOMemoryPurgeable option, VM_FLAGS_PURGEABLE may be passed to vm_allocate() in user space to allocate such buffers. The purgeable status of such a buffer may be controlled with setPurgeable(). The process of making a purgeable memory descriptor non-volatile and determining its previous state is atomic - if a purgeable memory descriptor is made nonvolatile and the old state is returned as kIOMemoryPurgeableVolatile, then the memory's previous contents are completely intact and will remain so until the memory is made volatile again. If the old state is returned as kIOMemoryPurgeableEmpty then the memory was reclaimed while it was in a volatile state and its previous contents have been lost. + * @param newState - the desired new purgeable state of the memory:
+ * kIOMemoryPurgeableKeepCurrent - make no changes to the memory's purgeable state.
+ * kIOMemoryPurgeableVolatile - make the memory volatile - the memory may be reclaimed by the VM system without saving its contents to backing store.
+ * kIOMemoryPurgeableNonVolatile - make the memory nonvolatile - the memory is treated as with usual allocations and must be saved to backing store if paged.
+ * kIOMemoryPurgeableEmpty - make the memory volatile, and discard any pages allocated to it. + * @param oldState - if non-NULL, the previous purgeable state of the memory is returned here:
+ * kIOMemoryPurgeableNonVolatile - the memory was nonvolatile.
+ * kIOMemoryPurgeableVolatile - the memory was volatile but its content has not been discarded by the VM system.
+ * kIOMemoryPurgeableEmpty - the memory was volatile and has been discarded by the VM system.
+ * @result An IOReturn code. */ + + virtual IOReturn setPurgeable( IOOptionBits newState, + IOOptionBits * oldState ); + +/*! @function setOwnership + * @abstract Control the ownership of a memory descriptors memory. + * @discussion IOBufferMemoryDescriptor are owned by a specific task. The ownership of such a buffer may be controlled with setOwnership(). + * @param newOwner - the task to be the new owner of the memory. + * @param newLedgerTag - the ledger this memory should be accounted in. + * @param newLedgerOptions - accounting options + * @result An IOReturn code. */ + + IOReturn setOwnership( task_t newOwner, + int newLedgerTag, + IOOptionBits newLedgerOptions ); + +/*! @function getPageCounts + * @abstract Retrieve the number of resident and/or dirty pages encompassed by an IOMemoryDescriptor. + * @discussion This method returns the number of resident and/or dirty pages encompassed by an IOMemoryDescriptor. + * @param residentPageCount - If non-null, a pointer to a byte count that will return the number of resident pages encompassed by this IOMemoryDescriptor. + * @param dirtyPageCount - If non-null, a pointer to a byte count that will return the number of dirty pages encompassed by this IOMemoryDescriptor. + * @result An IOReturn code. */ + + IOReturn getPageCounts( IOByteCount * residentPageCount, + IOByteCount * dirtyPageCount); + +/*! @function performOperation + * @abstract Perform an operation on the memory descriptor's memory. + * @discussion This method performs some operation on a range of the memory descriptor's memory. When a memory descriptor's memory is not mapped, it should be more efficient to use this method than mapping the memory to perform the operation virtually. + * @param options The operation to perform on the memory:
+ * kIOMemoryIncoherentIOFlush - pass this option to store to memory and flush any data in the processor cache for the memory range, with synchronization to ensure the data has passed through all levels of processor cache. It may not be supported on all architectures. This type of flush may be used for non-coherent I/O such as AGP - it is NOT required for PCI coherent operations. The memory descriptor must have been previously prepared.
+ * kIOMemoryIncoherentIOStore - pass this option to store to memory any data in the processor cache for the memory range, with synchronization to ensure the data has passed through all levels of processor cache. It may not be supported on all architectures. This type of flush may be used for non-coherent I/O such as AGP - it is NOT required for PCI coherent operations. The memory descriptor must have been previously prepared. + * @param offset A byte offset into the memory descriptor's memory. + * @param length The length of the data range. + * @result An IOReturn code. */ + + virtual IOReturn performOperation( IOOptionBits options, + IOByteCount offset, IOByteCount length ); + +// Used for dedicated communications for IODMACommand + virtual IOReturn dmaCommandOperation(DMACommandOps op, void *vData, UInt dataSize) const; + +/*! @function getPhysicalSegment + * @abstract Break a memory descriptor into its physically contiguous segments. + * @discussion This method returns the physical address of the byte at the given offset into the memory, and optionally the length of the physically contiguous segment from that offset. + * @param offset A byte offset into the memory whose physical address to return. + * @param length If non-zero, getPhysicalSegment will store here the length of the physically contiguous segement at the given offset. + * @result A physical address, or zero if the offset is beyond the length of the memory. */ + +#ifdef __LP64__ + virtual addr64_t getPhysicalSegment( IOByteCount offset, + IOByteCount * length, + IOOptionBits options = 0 ) = 0; +#else /* !__LP64__ */ + virtual addr64_t getPhysicalSegment( IOByteCount offset, + IOByteCount * length, + IOOptionBits options ); +#endif /* !__LP64__ */ + + virtual uint64_t getPreparationID( void ); + void setPreparationID( void ); + + void setVMTags(uint32_t kernelTag, uint32_t userTag); + uint32_t getVMTag(vm_map_t map); + + +private: + OSMetaClassDeclareReservedUsed(IOMemoryDescriptor, 0); +#ifdef __LP64__ + OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 1); + OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 2); + OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 3); + OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 4); + OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 5); + OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 6); + OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 7); +#else /* !__LP64__ */ + OSMetaClassDeclareReservedUsed(IOMemoryDescriptor, 1); + OSMetaClassDeclareReservedUsed(IOMemoryDescriptor, 2); + OSMetaClassDeclareReservedUsed(IOMemoryDescriptor, 3); + OSMetaClassDeclareReservedUsed(IOMemoryDescriptor, 4); + OSMetaClassDeclareReservedUsed(IOMemoryDescriptor, 5); + OSMetaClassDeclareReservedUsed(IOMemoryDescriptor, 6); + OSMetaClassDeclareReservedUsed(IOMemoryDescriptor, 7); +#endif /* !__LP64__ */ + OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 8); + OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 9); + OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 10); + OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 11); + OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 12); + OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 13); + OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 14); + OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 15); + +protected: + virtual void free(void) APPLE_KEXT_OVERRIDE; +public: + static void initialize( void ); + +public: +/*! @function withAddress + * @abstract Create an IOMemoryDescriptor to describe one virtual range of the kernel task. + * @discussion This method creates and initializes an IOMemoryDescriptor for memory consisting of a single virtual memory range mapped into the kernel map. This memory descriptor needs to be prepared before it can be used to extract data from the memory described. + * @param address The virtual address of the first byte in the memory. + * @param withLength The length of memory. + * @param withDirection An I/O direction to be associated with the descriptor, which may affect the operation of the prepare and complete methods on some architectures. + * @result The created IOMemoryDescriptor on success, to be released by the caller, or zero on failure. */ + + static IOMemoryDescriptor * withAddress(void * address, + IOByteCount withLength, + IODirection withDirection); + +#ifndef __LP64__ + static IOMemoryDescriptor * withAddress(IOVirtualAddress address, + IOByteCount withLength, + IODirection withDirection, + task_t withTask) APPLE_KEXT_DEPRECATED; /* use withAddressRange() and prepare() instead */ +#endif /* !__LP64__ */ + +/*! @function withPhysicalAddress + * @abstract Create an IOMemoryDescriptor to describe one physical range. + * @discussion This method creates and initializes an IOMemoryDescriptor for memory consisting of a single physical memory range. + * @param address The physical address of the first byte in the memory. + * @param withLength The length of memory. + * @param withDirection An I/O direction to be associated with the descriptor, which may affect the operation of the prepare and complete methods on some architectures. + * @result The created IOMemoryDescriptor on success, to be released by the caller, or zero on failure. */ + + static IOMemoryDescriptor * withPhysicalAddress( + IOPhysicalAddress address, + IOByteCount withLength, + IODirection withDirection ); + +#ifndef __LP64__ + static IOMemoryDescriptor * withRanges(IOVirtualRange * ranges, + UInt32 withCount, + IODirection withDirection, + task_t withTask, + bool asReference = false) APPLE_KEXT_DEPRECATED; /* use withAddressRanges() instead */ +#endif /* !__LP64__ */ + +/*! @function withAddressRange + * @abstract Create an IOMemoryDescriptor to describe one virtual range of the specified map. + * @discussion This method creates and initializes an IOMemoryDescriptor for memory consisting of a single virtual memory range mapped into the specified map. This memory descriptor needs to be prepared before it can be used to extract data from the memory described. + * @param address The virtual address of the first byte in the memory. + * @param length The length of memory. + * @param options + * kIOMemoryDirectionMask (options:direction) This nibble indicates the I/O direction to be associated with the descriptor, which may affect the operation of the prepare and complete methods on some architectures. + * @param task The task the virtual ranges are mapped into. Note that unlike IOMemoryDescriptor::withAddress(), kernel_task memory must be explicitly prepared when passed to this api. The task argument may be NULL to specify memory by physical address. + * @result The created IOMemoryDescriptor on success, to be released by the caller, or zero on failure. */ + + static IOMemoryDescriptor * withAddressRange( + mach_vm_address_t address, + mach_vm_size_t length, + IOOptionBits options, + task_t task); + +/*! @function withAddressRanges + * @abstract Create an IOMemoryDescriptor to describe one or more virtual ranges. + * @discussion This method creates and initializes an IOMemoryDescriptor for memory consisting of an array of virtual memory ranges each mapped into a specified source task. This memory descriptor needs to be prepared before it can be used to extract data from the memory described. + * @param ranges An array of IOAddressRange structures which specify the virtual ranges in the specified map which make up the memory to be described. IOAddressRange is the 64bit version of IOVirtualRange. + * @param rangeCount The member count of the ranges array. + * @param options + * kIOMemoryDirectionMask (options:direction) This nibble indicates the I/O direction to be associated with the descriptor, which may affect the operation of the prepare and complete methods on some architectures. + * kIOMemoryAsReference For options:type = Virtual or Physical this indicate that the memory descriptor need not copy the ranges array into local memory. This is an optimisation to try to minimise unnecessary allocations. + * @param task The task each of the virtual ranges are mapped into. Note that unlike IOMemoryDescriptor::withAddress(), kernel_task memory must be explicitly prepared when passed to this api. The task argument may be NULL to specify memory by physical address. + * @result The created IOMemoryDescriptor on success, to be released by the caller, or zero on failure. */ + + static IOMemoryDescriptor * withAddressRanges( + IOAddressRange * ranges, + UInt32 rangeCount, + IOOptionBits options, + task_t task); + +/*! @function withOptions + * @abstract Master initialiser for all variants of memory descriptors. + * @discussion This method creates and initializes an IOMemoryDescriptor for memory it has three main variants: Virtual, Physical & mach UPL. These variants are selected with the options parameter, see below. This memory descriptor needs to be prepared before it can be used to extract data from the memory described. + * + * + * @param buffers A pointer to an array of IOAddressRange when options:type is kIOMemoryTypeVirtual64 or kIOMemoryTypePhysical64 or a 64bit kernel. For type UPL it is a upl_t returned by the mach/memory_object_types.h apis, primarily used internally by the UBC. IOVirtualRanges or IOPhysicalRanges are 32 bit only types for use when options:type is kIOMemoryTypeVirtual or kIOMemoryTypePhysical on 32bit kernels. + * + * @param count options:type = Virtual or Physical count contains a count of the number of entires in the buffers array. For options:type = UPL this field contains a total length. + * + * @param offset Only used when options:type = UPL, in which case this field contains an offset for the memory within the buffers upl. + * + * @param task Only used options:type = Virtual, The task each of the virtual ranges are mapped into. + * + * @param options + * kIOMemoryDirectionMask (options:direction) This nibble indicates the I/O direction to be associated with the descriptor, which may affect the operation of the prepare and complete methods on some architectures. + * kIOMemoryTypeMask (options:type) kIOMemoryTypeVirtual64, kIOMemoryTypeVirtual, kIOMemoryTypePhysical64, kIOMemoryTypePhysical, kIOMemoryTypeUPL Indicates that what type of memory basic memory descriptor to use. This sub-field also controls the interpretation of the buffers, count, offset & task parameters. + * kIOMemoryAsReference For options:type = Virtual or Physical this indicate that the memory descriptor need not copy the ranges array into local memory. This is an optimisation to try to minimise unnecessary allocations. + * kIOMemoryBufferPageable Only used by the IOBufferMemoryDescriptor as an indication that the kernel virtual memory is in fact pageable and we need to use the kernel pageable submap rather than the default map. + * + * @param mapper Which IOMapper should be used to map the in-memory physical addresses into I/O space addresses. Defaults to 0 which indicates that the system mapper is to be used, if present. + * + * @result The created IOMemoryDescriptor on success, to be released by the caller, or zero on failure. */ + + static IOMemoryDescriptor *withOptions(void * buffers, + UInt32 count, + UInt32 offset, + task_t task, + IOOptionBits options, + IOMapper * mapper = kIOMapperSystem); + +#ifndef __LP64__ + static IOMemoryDescriptor * withPhysicalRanges( + IOPhysicalRange * ranges, + UInt32 withCount, + IODirection withDirection, + bool asReference = false) APPLE_KEXT_DEPRECATED; /* use withOptions() and kIOMemoryTypePhysical instead */ +#endif /* !__LP64__ */ + +#ifndef __LP64__ + static IOMemoryDescriptor * withSubRange(IOMemoryDescriptor *of, + IOByteCount offset, + IOByteCount length, + IODirection withDirection) APPLE_KEXT_DEPRECATED; /* use IOSubMemoryDescriptor::withSubRange() and kIOMemoryThreadSafe instead */ +#endif /* !__LP64__ */ + +/*! @function withPersistentMemoryDescriptor + * @abstract Copy constructor that generates a new memory descriptor if the backing memory for the same task's virtual address and length has changed. + * @discussion If the original memory descriptor's address and length is still backed by the same real memory, i.e. the user hasn't deallocated and the reallocated memory at the same address then the original memory descriptor is returned with a additional reference. Otherwise we build a totally new memory descriptor with the same characteristics as the previous one but with a new view of the vm. Note not legal to call this function with anything except an IOGeneralMemoryDescriptor that was created with the kIOMemoryPersistent option. + * @param originalMD The memory descriptor to be duplicated. + * @result Either the original memory descriptor with an additional retain or a new memory descriptor, 0 for a bad original memory descriptor or some other resource shortage. */ + static IOMemoryDescriptor * + withPersistentMemoryDescriptor(IOMemoryDescriptor *originalMD); + +#ifndef __LP64__ +// obsolete initializers +// - initWithOptions is the designated initializer + virtual bool initWithAddress(void * address, + IOByteCount withLength, + IODirection withDirection) APPLE_KEXT_DEPRECATED; /* use initWithOptions() instead */ + virtual bool initWithAddress(IOVirtualAddress address, + IOByteCount withLength, + IODirection withDirection, + task_t withTask) APPLE_KEXT_DEPRECATED; /* use initWithOptions() instead */ + virtual bool initWithPhysicalAddress( + IOPhysicalAddress address, + IOByteCount withLength, + IODirection withDirection ) APPLE_KEXT_DEPRECATED; /* use initWithOptions() instead */ + virtual bool initWithRanges(IOVirtualRange * ranges, + UInt32 withCount, + IODirection withDirection, + task_t withTask, + bool asReference = false) APPLE_KEXT_DEPRECATED; /* use initWithOptions() instead */ + virtual bool initWithPhysicalRanges(IOPhysicalRange * ranges, + UInt32 withCount, + IODirection withDirection, + bool asReference = false) APPLE_KEXT_DEPRECATED; /* use initWithOptions() instead */ +#endif /* __LP64__ */ + +/*! @function getDirection + * @abstract Accessor to get the direction the memory descriptor was created with. + * @discussion This method returns the direction the memory descriptor was created with. + * @result The direction. */ + + virtual IODirection getDirection() const; + +/*! @function getLength + * @abstract Accessor to get the length of the memory descriptor (over all its ranges). + * @discussion This method returns the total length of the memory described by the descriptor, ie. the sum of its ranges' lengths. + * @result The byte count. */ + + virtual IOByteCount getLength() const; + +/*! @function setTag + * @abstract Set the tag for the memory descriptor. + * @discussion This method sets the tag for the memory descriptor. Tag bits are not interpreted by IOMemoryDescriptor. + * @param tag The tag. */ + + virtual void setTag( IOOptionBits tag ); + +/*! @function getTag + * @abstract Accessor to the retrieve the tag for the memory descriptor. + * @discussion This method returns the tag for the memory descriptor. Tag bits are not interpreted by IOMemoryDescriptor. + * @result The tag. */ + + virtual IOOptionBits getTag( void ); + +/*! @function getFlags + * @abstract Accessor to the retrieve the options the memory descriptor was created with. + * @discussion Accessor to the retrieve the options the memory descriptor was created with, and flags with its state. These bits are defined by the kIOMemory* enum. + * @result The flags bitfield. */ + + uint64_t getFlags(void); + +/*! @function readBytes + * @abstract Copy data from the memory descriptor's buffer to the specified buffer. + * @discussion This method copies data from the memory descriptor's memory at the given offset, to the caller's buffer. The memory descriptor MUST have the kIODirectionOut direcction bit set and be prepared. kIODirectionOut means that this memory descriptor will be output to an external device, so readBytes is used to get memory into a local buffer for a PIO transfer to the device. + * @param offset A byte offset into the memory descriptor's memory. + * @param bytes The caller supplied buffer to copy the data to. + * @param withLength The length of the data to copy. + * @result The number of bytes copied, zero will be returned if the specified offset is beyond the length of the descriptor. Development/debug kernel builds will assert if the offset is beyond the length of the descriptor. */ + + virtual IOByteCount readBytes(IOByteCount offset, + void * bytes, IOByteCount withLength); + +/*! @function writeBytes + * @abstract Copy data to the memory descriptor's buffer from the specified buffer. + * @discussion This method copies data to the memory descriptor's memory at the given offset, from the caller's buffer. The memory descriptor MUST have the kIODirectionIn direcction bit set and be prepared. kIODirectionIn means that this memory descriptor will be input from an external device, so writeBytes is used to write memory into the descriptor for PIO drivers. + * @param offset A byte offset into the memory descriptor's memory. + * @param bytes The caller supplied buffer to copy the data from. + * @param withLength The length of the data to copy. + * @result The number of bytes copied, zero will be returned if the specified offset is beyond the length of the descriptor. Development/debug kernel builds will assert if the offset is beyond the length of the descriptor. */ + + virtual IOByteCount writeBytes(IOByteCount offset, + const void * bytes, IOByteCount withLength); + +#ifndef __LP64__ + virtual IOPhysicalAddress getPhysicalSegment(IOByteCount offset, + IOByteCount * length); +#endif /* !__LP64__ */ + +/*! @function getPhysicalAddress + * @abstract Return the physical address of the first byte in the memory. + * @discussion This method returns the physical address of the first byte in the memory. It is most useful on memory known to be physically contiguous. + * @result A physical address. */ + + IOPhysicalAddress getPhysicalAddress(); + +#ifndef __LP64__ + virtual void * getVirtualSegment(IOByteCount offset, + IOByteCount * length) APPLE_KEXT_DEPRECATED; /* use map() and getVirtualAddress() instead */ +#endif /* !__LP64__ */ + +/*! @function prepare + * @abstract Prepare the memory for an I/O transfer. + * @discussion This involves paging in the memory, if necessary, and wiring it down for the duration of the transfer. The complete() method completes the processing of the memory after the I/O transfer finishes. Note that the prepare call is not thread safe and it is expected that the client will more easily be able to guarantee single threading a particular memory descriptor. + * @param forDirection The direction of the I/O just completed, or kIODirectionNone for the direction specified by the memory descriptor. + * @result An IOReturn code. */ + + virtual IOReturn prepare(IODirection forDirection = kIODirectionNone) = 0; + +/*! @function complete + * @abstract Complete processing of the memory after an I/O transfer finishes. + * @discussion This method should not be called unless a prepare was previously issued; the prepare() and complete() must occur in pairs, before and after an I/O transfer involving pageable memory. In 10.3 or greater systems the direction argument to complete is not longer respected. The direction is totally determined at prepare() time. + * @param forDirection DEPRECATED The direction of the I/O just completed, or kIODirectionNone for the direction specified by the memory descriptor. + * @result An IOReturn code. */ + + virtual IOReturn complete(IODirection forDirection = kIODirectionNone) = 0; + +/* + * Mapping functions. + */ + +/*! @function createMappingInTask + * @abstract Maps a IOMemoryDescriptor into a task. + * @discussion This is the general purpose method to map all or part of the memory described by a memory descriptor into a task at any available address, or at a fixed address if possible. Caching & read-only options may be set for the mapping. The mapping is represented as a returned reference to a IOMemoryMap object, which may be shared if the mapping is compatible with an existing mapping of the IOMemoryDescriptor. The IOMemoryMap object returned should be released only when the caller has finished accessing the mapping, as freeing the object destroys the mapping. + * @param intoTask Sets the target task for the mapping. Pass kernel_task for the kernel address space. + * @param atAddress If a placed mapping is requested, atAddress specifies its address, and the kIOMapAnywhere should not be set. Otherwise, atAddress is ignored. + * @param options Mapping options are defined in IOTypes.h,
+ * kIOMapAnywhere should be passed if the mapping can be created anywhere. If not set, the atAddress parameter sets the location of the mapping, if it is available in the target map.
+ * kIOMapDefaultCache to inhibit the cache in I/O areas, kIOMapCopybackCache in general purpose RAM.
+ * kIOMapInhibitCache, kIOMapWriteThruCache, kIOMapCopybackCache to set the appropriate caching.
+ * kIOMapReadOnly to allow only read only accesses to the memory - writes will cause and access fault.
+ * kIOMapReference will only succeed if the mapping already exists, and the IOMemoryMap object is just an extra reference, ie. no new mapping will be created.
+ * kIOMapUnique allows a special kind of mapping to be created that may be used with the IOMemoryMap::redirect() API. These mappings will not be shared as is the default - there will always be a unique mapping created for the caller, not an existing mapping with an extra reference.
+ * kIOMapPrefault will try to prefault the pages corresponding to the mapping. This must not be done on the kernel task, and the memory must have been wired via prepare(). Otherwise, the function will fail.
+ * @param offset Is a beginning offset into the IOMemoryDescriptor's memory where the mapping starts. Zero is the default to map all the memory. + * @param length Is the length of the mapping requested for a subset of the IOMemoryDescriptor. Zero is the default to map all the memory. + * @result A reference to an IOMemoryMap object representing the mapping, which can supply the virtual address of the mapping and other information. The mapping may be shared with multiple callers - multiple maps are avoided if a compatible one exists. The IOMemoryMap object returned should be released only when the caller has finished accessing the mapping, as freeing the object destroys the mapping. The IOMemoryMap instance also retains the IOMemoryDescriptor it maps while it exists. */ + + IOMemoryMap * createMappingInTask( + task_t intoTask, + mach_vm_address_t atAddress, + IOOptionBits options, + mach_vm_size_t offset = 0, + mach_vm_size_t length = 0 ); + +#ifndef __LP64__ + virtual IOMemoryMap * map( + task_t intoTask, + IOVirtualAddress atAddress, + IOOptionBits options, + IOByteCount offset = 0, + IOByteCount length = 0 ) APPLE_KEXT_DEPRECATED;/* use createMappingInTask() instead */ +#endif /* !__LP64__ */ + +/*! @function map + * @abstract Maps a IOMemoryDescriptor into the kernel map. + * @discussion This is a shortcut method to map all the memory described by a memory descriptor into the kernel map at any available address. See the full version of the createMappingInTask method for further details. + * @param options Mapping options as in the full version of the createMappingInTask method, with kIOMapAnywhere assumed. + * @result See the full version of the createMappingInTask method. */ + + virtual IOMemoryMap * map( + IOOptionBits options = 0 ); + +/*! @function setMapping + * @abstract Establishes an already existing mapping. + * @discussion This method tells the IOMemoryDescriptor about a mapping that exists, but was created elsewhere. It allows later callers of the map method to share this externally created mapping. The IOMemoryMap object returned is created to represent it. This method is not commonly needed. + * @param task Address space in which the mapping exists. + * @param mapAddress Virtual address of the mapping. + * @param options Caching and read-only attributes of the mapping. + * @result A IOMemoryMap object created to represent the mapping. */ + + virtual IOMemoryMap * setMapping( + task_t task, + IOVirtualAddress mapAddress, + IOOptionBits options = 0 ); + +// Following methods are private implementation + +#ifdef __LP64__ + virtual +#endif /* __LP64__ */ + IOReturn redirect( task_t safeTask, bool redirect ); + + IOReturn handleFault( + void * _pager, + mach_vm_size_t sourceOffset, + mach_vm_size_t length); + + IOReturn populateDevicePager( + void * pager, + vm_map_t addressMap, + mach_vm_address_t address, + mach_vm_size_t sourceOffset, + mach_vm_size_t length, + IOOptionBits options ); + + virtual IOMemoryMap * makeMapping( + IOMemoryDescriptor * owner, + task_t intoTask, + IOVirtualAddress atAddress, + IOOptionBits options, + IOByteCount offset, + IOByteCount length ); + +protected: + virtual void addMapping( + IOMemoryMap * mapping ); + + virtual void removeMapping( + IOMemoryMap * mapping ); + + virtual IOReturn doMap( + vm_map_t addressMap, + IOVirtualAddress * atAddress, + IOOptionBits options, + IOByteCount sourceOffset = 0, + IOByteCount length = 0 ); + + virtual IOReturn doUnmap( + vm_map_t addressMap, + IOVirtualAddress logical, + IOByteCount length ); +}; + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*! @class IOMemoryMap : public OSObject + * @abstract A class defining common methods for describing a memory mapping. + * @discussion The IOMemoryMap object represents a mapped range of memory, described by a IOMemoryDescriptor. The mapping may be in the kernel or a non-kernel task and has processor cache mode attributes. IOMemoryMap instances are created by IOMemoryDescriptor when it creates mappings in its map method, and returned to the caller. */ + +class IOMemoryMap : public OSObject +{ + OSDeclareDefaultStructorsWithDispatch(IOMemoryMap); + +protected: + virtual void taggedRelease(const void *tag = NULL) const APPLE_KEXT_OVERRIDE; + virtual void free(void) APPLE_KEXT_OVERRIDE; + +public: +/*! @function getVirtualAddress + * @abstract Accessor to the virtual address of the first byte in the mapping. + * @discussion This method returns the virtual address of the first byte in the mapping. Since the IOVirtualAddress is only 32bit in 32bit kernels, the getAddress() method should be used for compatibility with 64bit task mappings. + * @result A virtual address. */ + + virtual IOVirtualAddress getVirtualAddress(void); + +/*! @function getPhysicalSegment + * @abstract Break a mapping into its physically contiguous segments. + * @discussion This method returns the physical address of the byte at the given offset into the mapping, and optionally the length of the physically contiguous segment from that offset. It functions similarly to IOMemoryDescriptor::getPhysicalSegment. + * @param offset A byte offset into the mapping whose physical address to return. + * @param length If non-zero, getPhysicalSegment will store here the length of the physically contiguous segement at the given offset. + * @result A physical address, or zero if the offset is beyond the length of the mapping. */ + +#ifdef __LP64__ + virtual IOPhysicalAddress getPhysicalSegment(IOByteCount offset, + IOByteCount * length, + IOOptionBits options = 0); +#else /* !__LP64__ */ + virtual IOPhysicalAddress getPhysicalSegment(IOByteCount offset, + IOByteCount * length); +#endif /* !__LP64__ */ + +/*! @function getPhysicalAddress + * @abstract Return the physical address of the first byte in the mapping. + * @discussion This method returns the physical address of the first byte in the mapping. It is most useful on mappings known to be physically contiguous. + * @result A physical address. */ + + IOPhysicalAddress getPhysicalAddress(void); + +/*! @function getLength + * @abstract Accessor to the length of the mapping. + * @discussion This method returns the length of the mapping. + * @result A byte count. */ + + virtual IOByteCount getLength(void); + +/*! @function getAddressTask + * @abstract Accessor to the task of the mapping. + * @discussion This method returns the mach task the mapping exists in. + * @result A mach task_t. */ + + virtual task_t getAddressTask(); + +/*! @function getMemoryDescriptor + * @abstract Accessor to the IOMemoryDescriptor the mapping was created from. + * @discussion This method returns the IOMemoryDescriptor the mapping was created from. + * @result An IOMemoryDescriptor reference, which is valid while the IOMemoryMap object is retained. It should not be released by the caller. */ + + virtual IOMemoryDescriptor * getMemoryDescriptor(); + +/*! @function getMapOptions + * @abstract Accessor to the options the mapping was created with. + * @discussion This method returns the options to IOMemoryDescriptor::map the mapping was created with. + * @result Options for the mapping, including cache settings. */ + + virtual IOOptionBits getMapOptions(); + +/*! @function unmap + * @abstract Force the IOMemoryMap to unmap, without destroying the object. + * @discussion IOMemoryMap instances will unmap themselves upon free, ie. when the last client with a reference calls release. This method forces the IOMemoryMap to destroy the mapping it represents, regardless of the number of clients. It is not generally used. + * @result An IOReturn code. */ + + virtual IOReturn unmap(); + + virtual void taskDied(); + +/*! @function redirect + * @abstract Replace the memory mapped in a process with new backing memory. + * @discussion An IOMemoryMap created with the kIOMapUnique option to IOMemoryDescriptor::map() can remapped to a new IOMemoryDescriptor backing object. If the new IOMemoryDescriptor is specified as NULL, client access to the memory map is blocked until a new backing object has been set. By blocking access and copying data, the caller can create atomic copies of the memory while the client is potentially reading or writing the memory. + * @param newBackingMemory The IOMemoryDescriptor that represents the physical memory that is to be now mapped in the virtual range the IOMemoryMap represents. If newBackingMemory is NULL, any access to the mapping will hang (in vm_fault()) until access has been restored by a new call to redirect() with non-NULL newBackingMemory argument. + * @param options Mapping options are defined in IOTypes.h, and are documented in IOMemoryDescriptor::map() + * @param offset As with IOMemoryDescriptor::map(), a beginning offset into the IOMemoryDescriptor's memory where the mapping starts. Zero is the default. + * @result An IOReturn code. */ + +#ifndef __LP64__ +// For 32 bit XNU, there is a 32 bit (IOByteCount) and a 64 bit (mach_vm_size_t) interface; +// for 64 bit, these fall together on the 64 bit one. + virtual IOReturn redirect(IOMemoryDescriptor * newBackingMemory, + IOOptionBits options, + IOByteCount offset = 0); +#endif + virtual IOReturn redirect(IOMemoryDescriptor * newBackingMemory, + IOOptionBits options, + mach_vm_size_t offset = 0); + +#ifdef __LP64__ +/*! @function getAddress + * @abstract Accessor to the virtual address of the first byte in the mapping. + * @discussion This method returns the virtual address of the first byte in the mapping. + * @result A virtual address. */ + inline mach_vm_address_t getAddress() __attribute__((always_inline)); +/*! @function getSize + * @abstract Accessor to the length of the mapping. + * @discussion This method returns the length of the mapping. + * @result A byte count. */ + inline mach_vm_size_t getSize() __attribute__((always_inline)); +#else /* !__LP64__ */ +/*! @function getAddress + * @abstract Accessor to the virtual address of the first byte in the mapping. + * @discussion This method returns the virtual address of the first byte in the mapping. + * @result A virtual address. */ + virtual mach_vm_address_t getAddress(); +/*! @function getSize + * @abstract Accessor to the length of the mapping. + * @discussion This method returns the length of the mapping. + * @result A byte count. */ + virtual mach_vm_size_t getSize(); +#endif /* !__LP64__ */ + + + IOReturn wireRange( + uint32_t options, + mach_vm_size_t offset, + mach_vm_size_t length); + + OSMetaClassDeclareReservedUnused(IOMemoryMap, 0); + OSMetaClassDeclareReservedUnused(IOMemoryMap, 1); + OSMetaClassDeclareReservedUnused(IOMemoryMap, 2); + OSMetaClassDeclareReservedUnused(IOMemoryMap, 3); + OSMetaClassDeclareReservedUnused(IOMemoryMap, 4); + OSMetaClassDeclareReservedUnused(IOMemoryMap, 5); + OSMetaClassDeclareReservedUnused(IOMemoryMap, 6); + OSMetaClassDeclareReservedUnused(IOMemoryMap, 7); +}; + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +// The following classes are private implementation of IOMemoryDescriptor - they +// should not be referenced directly, just through the public API's in the +// IOMemoryDescriptor class. For example, an IOGeneralMemoryDescriptor instance +// might be created by IOMemoryDescriptor::withAddressRange(), but there should be +// no need to reference as anything but a generic IOMemoryDescriptor *. + +class IOGeneralMemoryDescriptor : public IOMemoryDescriptor +{ + OSDeclareDefaultStructors(IOGeneralMemoryDescriptor); + +public: + union Ranges { + IOVirtualRange *v; + IOAddressRange *v64; + IOPhysicalRange *p; + void *uio; + }; +protected: + Ranges _ranges; + unsigned _rangesCount; /* number of address ranges in list */ +#ifndef __LP64__ + bool _rangesIsAllocated;/* is list allocated by us? */ +#endif /* !__LP64__ */ + + task_t _task; /* task where all ranges are mapped to */ + + union { + IOVirtualRange v; + IOPhysicalRange p; + } _singleRange; /* storage space for a single range */ + + unsigned _wireCount; /* number of outstanding wires */ + +#ifndef __LP64__ + uintptr_t _cachedVirtualAddress; + + IOPhysicalAddress _cachedPhysicalAddress; +#endif /* !__LP64__ */ + + bool _initialized; /* has superclass been initialized? */ + +public: + virtual void free() APPLE_KEXT_OVERRIDE; + + virtual IOReturn dmaCommandOperation(DMACommandOps op, void *vData, UInt dataSize) const APPLE_KEXT_OVERRIDE; + + virtual uint64_t getPreparationID( void ) APPLE_KEXT_OVERRIDE; + + +private: + +#ifndef __LP64__ + virtual void setPosition(IOByteCount position); + virtual void mapIntoKernel(unsigned rangeIndex); + virtual void unmapFromKernel(); +#endif /* !__LP64__ */ + +// Internal + OSData * _memoryEntries; + unsigned int _pages; + ppnum_t _highestPage; + uint32_t __iomd_reservedA; + uint32_t __iomd_reservedB; + + IOLock * _prepareLock; + +public: +/* + * IOMemoryDescriptor required methods + */ + +// Master initaliser + virtual bool initWithOptions(void * buffers, + UInt32 count, + UInt32 offset, + task_t task, + IOOptionBits options, + IOMapper * mapper = kIOMapperSystem) APPLE_KEXT_OVERRIDE; + +#ifndef __LP64__ +// Secondary initialisers + virtual bool initWithAddress(void * address, + IOByteCount withLength, + IODirection withDirection) APPLE_KEXT_OVERRIDE APPLE_KEXT_DEPRECATED; + + virtual bool initWithAddress(IOVirtualAddress address, + IOByteCount withLength, + IODirection withDirection, + task_t withTask) APPLE_KEXT_OVERRIDE APPLE_KEXT_DEPRECATED; + + virtual bool initWithPhysicalAddress( + IOPhysicalAddress address, + IOByteCount withLength, + IODirection withDirection ) APPLE_KEXT_OVERRIDE APPLE_KEXT_DEPRECATED; + + virtual bool initWithRanges( IOVirtualRange * ranges, + UInt32 withCount, + IODirection withDirection, + task_t withTask, + bool asReference = false) APPLE_KEXT_OVERRIDE APPLE_KEXT_DEPRECATED; + + virtual bool initWithPhysicalRanges(IOPhysicalRange * ranges, + UInt32 withCount, + IODirection withDirection, + bool asReference = false) APPLE_KEXT_OVERRIDE APPLE_KEXT_DEPRECATED; + + virtual addr64_t getPhysicalSegment64( IOByteCount offset, + IOByteCount * length ) APPLE_KEXT_OVERRIDE APPLE_KEXT_DEPRECATED; + + virtual IOPhysicalAddress getPhysicalSegment(IOByteCount offset, + IOByteCount * length) APPLE_KEXT_OVERRIDE; + + virtual IOPhysicalAddress getSourceSegment(IOByteCount offset, + IOByteCount * length) APPLE_KEXT_OVERRIDE APPLE_KEXT_DEPRECATED; + + virtual void * getVirtualSegment(IOByteCount offset, + IOByteCount * length) APPLE_KEXT_OVERRIDE APPLE_KEXT_DEPRECATED; +#endif /* !__LP64__ */ + + virtual IOReturn setPurgeable( IOOptionBits newState, + IOOptionBits * oldState ) APPLE_KEXT_OVERRIDE; + + IOReturn setOwnership( task_t newOwner, + int newLedgerTag, + IOOptionBits newLedgerOptions ); + + virtual addr64_t getPhysicalSegment( IOByteCount offset, + IOByteCount * length, +#ifdef __LP64__ + IOOptionBits options = 0 ) APPLE_KEXT_OVERRIDE; +#else /* !__LP64__ */ + IOOptionBits options)APPLE_KEXT_OVERRIDE; +#endif /* !__LP64__ */ + + virtual IOReturn prepare(IODirection forDirection = kIODirectionNone) APPLE_KEXT_OVERRIDE; + + virtual IOReturn complete(IODirection forDirection = kIODirectionNone) APPLE_KEXT_OVERRIDE; + + virtual IOReturn doMap( + vm_map_t addressMap, + IOVirtualAddress * atAddress, + IOOptionBits options, + IOByteCount sourceOffset = 0, + IOByteCount length = 0 ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn doUnmap( + vm_map_t addressMap, + IOVirtualAddress logical, + IOByteCount length ) APPLE_KEXT_OVERRIDE; + + virtual bool serialize(OSSerialize *s) const APPLE_KEXT_OVERRIDE; + +// Factory method for cloning a persistent IOMD, see IOMemoryDescriptor + static IOMemoryDescriptor * + withPersistentMemoryDescriptor(IOGeneralMemoryDescriptor *originalMD); +}; + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifdef __LP64__ +mach_vm_address_t +IOMemoryMap::getAddress() +{ + return getVirtualAddress(); +} + +mach_vm_size_t +IOMemoryMap::getSize() +{ + return getLength(); +} +#else /* !__LP64__ */ +#include +#endif /* !__LP64__ */ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +extern boolean_t iokit_iomd_setownership_enabled; + +#endif /* !_IOMEMORYDESCRIPTOR_H */ diff --git a/QualcommWireless/include/IOKit/IOMessage.h b/QualcommWireless/include/IOKit/IOMessage.h new file mode 100644 index 0000000..cdd5393 --- /dev/null +++ b/QualcommWireless/include/IOKit/IOMessage.h @@ -0,0 +1,220 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef __IOKIT_IOMESSAGE_H +#define __IOKIT_IOMESSAGE_H + +#include +#include + +/*! + * @header IOMessage.h + * + * Defines message type constants for several IOKit messaging API's. + * + */ + +typedef UInt32 IOMessage; + +#define iokit_common_msg(message) (UInt32)(sys_iokit|sub_iokit_common|message) +#define iokit_family_msg(sub, message) (UInt32)(sys_iokit|sub|message) + +/*! + * @defined iokit_vendor_specific_msg + * @discussion iokit_vendor_specific_msg passes messages in the sub_iokit_vendor_specific + * subsystem. It can be used to generate messages that are used for private + * communication between vendor specific code with the IOService::message() etc. APIs. + */ +#define iokit_vendor_specific_msg(message) (UInt32)(sys_iokit|sub_iokit_vendor_specific|message) + +#define kIOMessageServiceIsTerminated iokit_common_msg(0x010) +#define kIOMessageServiceIsSuspended iokit_common_msg(0x020) +#define kIOMessageServiceIsResumed iokit_common_msg(0x030) + +#define kIOMessageServiceIsRequestingClose iokit_common_msg(0x100) +#define kIOMessageServiceIsAttemptingOpen iokit_common_msg(0x101) +#define kIOMessageServiceWasClosed iokit_common_msg(0x110) + +#define kIOMessageServiceBusyStateChange iokit_common_msg(0x120) + +#define kIOMessageConsoleSecurityChange iokit_common_msg(0x128) + +#define kIOMessageServicePropertyChange iokit_common_msg(0x130) + +#define kIOMessageCopyClientID iokit_common_msg(0x330) + +#define kIOMessageSystemCapabilityChange iokit_common_msg(0x340) +#define kIOMessageDeviceSignaledWakeup iokit_common_msg(0x350) + + +/*! + * @defined kIOMessageDeviceWillPowerOff + * @discussion Indicates the device is about to move to a lower power state. + * Sent to IOKit interest notification clients of type kIOAppPowerStateInterest + * and kIOGeneralInterest. + */ +#define kIOMessageDeviceWillPowerOff iokit_common_msg(0x210) + +/*! + * @defined kIOMessageDeviceHasPoweredOn + * @discussion Indicates the device has just moved to a higher power state. + * Sent to IOKit interest notification clients of type kIOAppPowerStateInterest + * and kIOGeneralInterest. + */ +#define kIOMessageDeviceHasPoweredOn iokit_common_msg(0x230) + +/*! @group In-kernel system shutdown and restart notifications + */ + +/*! + * @defined kIOMessageSystemWillPowerOff + * @discussion Indicates an imminent system shutdown. Recipients have a limited + * amount of time to respond, otherwise the system will timeout and + * shutdown even without a response. + * Delivered to in-kernel IOKit drivers via IOService::systemWillShutdown(), + * and to clients of registerPrioritySleepWakeInterest(). + * Never delivered to user space notification clients. + */ +#define kIOMessageSystemWillPowerOff iokit_common_msg(0x250) + +/*! + * @defined kIOMessageSystemWillRestart + * @discussion Indicates an imminent system restart. Recipients have a limited + * amount of time to respond, otherwise the system will timeout and + * restart even without a response. + * Delivered to in-kernel IOKit drivers via IOService::systemWillShutdown(), + * and to clients of registerPrioritySleepWakeInterest(). + * Never delivered to user space notification clients. + */ +#define kIOMessageSystemWillRestart iokit_common_msg(0x310) + +/*! + * @defined kIOMessageSystemPagingOff + * @discussion Indicates an imminent system shutdown, paging device now unavailable. + * Recipients have a limited amount of time to respond, otherwise the + * system will timeout and shutdown even without a response. + * Delivered to clients of registerPrioritySleepWakeInterest(). + * Never delivered to user space notification clients. + */ +#define kIOMessageSystemPagingOff iokit_common_msg(0x255) + + +/*! @group System sleep and wake notifications + */ + +/*! + * @defined kIOMessageCanSystemSleep + * @discussion Announces/Requests permission to proceed to system sleep. + * Delivered to in-kernel IOKit drivers via kIOGeneralInterest + * and kIOPriorityPowerStateInterest. + * Delivered to user clients of IORegisterForSystemPower. + */ +#define kIOMessageCanSystemSleep iokit_common_msg(0x270) + +/*! + * @defined kIOMessageSystemWillNotSleep + * @discussion Announces that the system has retracted a previous attempt to sleep; + * it follows kIOMessageCanSystemSleep. + * Delivered to in-kernel IOKit drivers via kIOGeneralInterest + * and kIOPriorityPowerStateInterest. + * Delivered to user clients of IORegisterForSystemPower. + */ +#define kIOMessageSystemWillNotSleep iokit_common_msg(0x290) + +/*! + * @defined kIOMessageSystemWillSleep + * @discussion Announces that sleep is beginning. + * Delivered to in-kernel IOKit drivers via kIOGeneralInterest + * and kIOPriorityPowerStateInterest. + * Delivered to user clients of IORegisterForSystemPower. + */ +#define kIOMessageSystemWillSleep iokit_common_msg(0x280) + +/*! + * @defined kIOMessageSystemWillPowerOn + * @discussion Announces that the system is beginning to power the device tree; most + * devices are unavailable at this point.. + * Delivered to in-kernel IOKit drivers via kIOGeneralInterest + * and kIOPriorityPowerStateInterest. + * Delivered to user clients of IORegisterForSystemPower. + */ +#define kIOMessageSystemWillPowerOn iokit_common_msg(0x320) + +/*! + * @defined kIOMessageSystemHasPoweredOn + * @discussion Announces that the system and its devices have woken up. + * Delivered to in-kernel IOKit drivers via kIOGeneralInterest + * and kIOPriorityPowerStateInterest. + * Delivered to user clients of IORegisterForSystemPower. + */ +#define kIOMessageSystemHasPoweredOn iokit_common_msg(0x300) + +/*! @group Unused and deprecated notifications + */ + +/*! + * @defined kIOMessageCanDevicePowerOff + * @discussion Delivered to kIOAppPowerStateInterest clients of + * devices that implement their own idle timeouts. + * This message type is almost never used. + */ +#define kIOMessageCanDevicePowerOff iokit_common_msg(0x200) + +/*! + * @defined kIOMessageDeviceWillNotPowerOff + * @discussion This IOKit interest notification is largely unused; + * it's not very interesting. + */ +#define kIOMessageDeviceWillNotPowerOff iokit_common_msg(0x220) + +/*! + * @defined kIOMessageSystemWillNotPowerOff + * @deprecated This IOKit message is unused. + */ +#define kIOMessageSystemWillNotPowerOff iokit_common_msg(0x260) + +/*! + * @defined kIOMessageCanSystemPowerOff + * @deprecated This IOKit message is unused. + */ +#define kIOMessageCanSystemPowerOff iokit_common_msg(0x240) + +/*! + * @defined kIOMessageDeviceWillPowerOn + * @discussion IOService power mgt does not send kIOMessageDeviceWillPowerOn. + */ +#define kIOMessageDeviceWillPowerOn iokit_common_msg(0x215) + +/*! + * @defined kIOMessageDeviceHasPoweredOff + * @discussion IOService power mgt does not send kIOMessageDeviceHasPoweredOff. + */ +#define kIOMessageDeviceHasPoweredOff iokit_common_msg(0x225) + + +#endif /* ! __IOKIT_IOMESSAGE_H */ diff --git a/QualcommWireless/include/IOKit/IOMultiMemoryDescriptor.h b/QualcommWireless/include/IOKit/IOMultiMemoryDescriptor.h new file mode 100644 index 0000000..f7ede4a --- /dev/null +++ b/QualcommWireless/include/IOKit/IOMultiMemoryDescriptor.h @@ -0,0 +1,135 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef _IOMULTIMEMORYDESCRIPTOR_H +#define _IOMULTIMEMORYDESCRIPTOR_H + +#include + +/*! @class IOMultiMemoryDescriptor : public IOMemoryDescriptor + * @abstract The IOMultiMemoryDescriptor object describes a memory area made up of several other IOMemoryDescriptors. + * @discussion The IOMultiMemoryDescriptor object represents multiple ranges of memory, specified as an ordered list of IOMemoryDescriptors. The descriptors are chained end-to-end to make up a single contiguous buffer. */ + +class IOMultiMemoryDescriptor : public IOMemoryDescriptor +{ + OSDeclareDefaultStructors(IOMultiMemoryDescriptor); + +protected: + + IOMemoryDescriptor ** _descriptors; + UInt32 _descriptorsCount; + bool _descriptorsIsAllocated; + + virtual void free() APPLE_KEXT_OVERRIDE; + +public: + +/*! @function withDescriptors + * @abstract Create an IOMultiMemoryDescriptor to describe a memory area made up of several other IOMemoryDescriptors. + * @discussion This method creates and initializes an IOMultiMemoryDescriptor for memory consisting of a number of other IOMemoryDescriptors, chained end-to-end (in the order they appear in the array) to represent a single contiguous memory buffer. Passing the descriptor array as a reference will avoid an extra allocation. + * @param descriptors An array of IOMemoryDescriptors which make up the memory to be described. + * @param withCount The object count for the descriptors array. + * @param withDirection An I/O direction to be associated with the descriptor, which may affect the operation of the prepare and complete methods on some architectures. + * @param asReference If false, the IOMultiMemoryDescriptor object will make a copy of the descriptors array, otherwise, the array will be used in situ, avoiding an extra allocation. + * @result The created IOMultiMemoryDescriptor on success, to be released by the caller, or zero on failure. */ + + static IOMultiMemoryDescriptor * withDescriptors( + IOMemoryDescriptor ** descriptors, + UInt32 withCount, + IODirection withDirection, + bool asReference = false ); + +/*! @function withDescriptors + * @abstract Initialize an IOMultiMemoryDescriptor to describe a memory area made up of several other IOMemoryDescriptors. + * @discussion This method initializes an IOMultiMemoryDescriptor for memory consisting of a number of other IOMemoryDescriptors, chained end-to-end (in the order they appear in the array) to represent a single contiguous memory buffer. Passing the descriptor array as a reference will avoid an extra allocation. + * @param descriptors An array of IOMemoryDescriptors which make up the memory to be described. + * @param withCount The object count for the descriptors array. + * @param withDirection An I/O direction to be associated with the descriptor, which may affect the operation of the prepare and complete methods on some architectures. + * @param asReference If false, the IOMultiMemoryDescriptor object will make a copy of the descriptors array, otherwise, the array will be used in situ, avoiding an extra allocation. + * @result The created IOMultiMemoryDescriptor on success, to be released by the caller, or zero on failure. */ + + virtual bool initWithDescriptors( + IOMemoryDescriptor ** descriptors, + UInt32 withCount, + IODirection withDirection, + bool asReference = false ); + +/*! @function getPhysicalSegment + * @abstract Break a memory descriptor into its physically contiguous segments. + * @discussion This method returns the physical address of the byte at the given offset into the memory, and optionally the length of the physically contiguous segment from that offset. + * @param offset A byte offset into the memory whose physical address to return. + * @param length If non-zero, getPhysicalSegment will store here the length of the physically contiguous segement at the given offset. + * @result A physical address, or zero if the offset is beyond the length of the memory. */ + + virtual addr64_t getPhysicalSegment( IOByteCount offset, + IOByteCount * length, + IOOptionBits options = 0 ) APPLE_KEXT_OVERRIDE; + +/*! @function prepare + * @abstract Prepare the memory for an I/O transfer. + * @discussion This involves paging in the memory, if necessary, and wiring it down for the duration of the transfer. The complete() method completes the processing of the memory after the I/O transfer finishes. This method needn't called for non-pageable memory. + * @param forDirection The direction of the I/O just completed, or kIODirectionNone for the direction specified by the memory descriptor. + * @result An IOReturn code. */ + + virtual IOReturn prepare(IODirection forDirection = kIODirectionNone) APPLE_KEXT_OVERRIDE; + +/*! @function complete + * @abstract Complete processing of the memory after an I/O transfer finishes. + * @discussion This method should not be called unless a prepare was previously issued; the prepare() and complete() must occur in pairs, before and after an I/O transfer involving pageable memory. + * @param forDirection The direction of the I/O just completed, or kIODirectionNone for the direction specified by the memory descriptor. + * @result An IOReturn code. */ + + virtual IOReturn complete(IODirection forDirection = kIODirectionNone) APPLE_KEXT_OVERRIDE; + + virtual IOReturn setPurgeable(IOOptionBits newState, IOOptionBits * oldState) APPLE_KEXT_OVERRIDE; + + IOReturn setOwnership(task_t newOwner, int newLedgerTag, IOOptionBits newOptions); + +/*! @function getPageCounts + * @abstract Retrieve the number of resident and/or dirty pages encompassed by an IOMemoryDescriptor. + * @discussion This method returns the number of resident and/or dirty pages encompassed by an IOMemoryDescriptor. + * @param residentPageCount - If non-null, a pointer to a byte count that will return the number of resident pages encompassed by this IOMemoryDescriptor. + * @param dirtyPageCount - If non-null, a pointer to a byte count that will return the number of dirty pages encompassed by this IOMemoryDescriptor. + * @result An IOReturn code. */ + + IOReturn getPageCounts(IOByteCount * residentPageCount, + IOByteCount * dirtyPageCount); + + virtual uint64_t getPreparationID( void ) APPLE_KEXT_OVERRIDE; + +#define IOMULTIMEMORYDESCRIPTOR_SUPPORTS_GETPAGECOUNTS 1 + +private: + virtual IOReturn doMap(vm_map_t addressMap, + IOVirtualAddress * atAddress, + IOOptionBits options, + IOByteCount sourceOffset = 0, + IOByteCount length = 0 ) APPLE_KEXT_OVERRIDE; +}; + +#endif /* !_IOMULTIMEMORYDESCRIPTOR_H */ diff --git a/QualcommWireless/include/IOKit/IONVRAM.h b/QualcommWireless/include/IOKit/IONVRAM.h new file mode 100644 index 0000000..ef2e533 --- /dev/null +++ b/QualcommWireless/include/IOKit/IONVRAM.h @@ -0,0 +1,188 @@ +/* + * Copyright (c) 1998-2006 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2007-2012 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IONVRAM_H +#define _IOKIT_IONVRAM_H + +#ifdef __cplusplus +#include +#include +#include +#include +#endif /* __cplusplus */ + +#define kIODTNVRAMOFPartitionName "common" +#define kIODTNVRAMXPRAMPartitionName "APL,MacOS75" +#define kIODTNVRAMPanicInfoPartitonName "APL,OSXPanic" +#define kIODTNVRAMFreePartitionName "wwwwwwwwwwww" + +#define MIN_SYNC_NOW_INTERVAL 15*60 /* Minimum 15 Minutes interval mandated */ + +enum { + kIODTNVRAMImageSize = 0x2000, + kIODTNVRAMXPRAMSize = 0x0100, + kIODTNVRAMNameRegistrySize = 0x0400 +}; + +enum { + kOFVariableTypeBoolean = 1, + kOFVariableTypeNumber, + kOFVariableTypeString, + kOFVariableTypeData +}; + +enum { + kOFVariablePermRootOnly = 0, + kOFVariablePermUserRead, + kOFVariablePermUserWrite, + kOFVariablePermKernelOnly +}; + +#ifdef __cplusplus + +class IODTNVRAM : public IOService +{ + OSDeclareDefaultStructors(IODTNVRAM); + +private: + IONVRAMController *_nvramController; + const OSSymbol *_registryPropertiesKey; + UInt8 *_nvramImage; + __unused bool _nvramImageDirty; + UInt32 _ofPartitionOffset; + UInt32 _ofPartitionSize; + UInt8 *_ofImage; + __unused bool _ofImageDirty; + OSDictionary *_ofDict; + OSDictionary *_nvramPartitionOffsets; + OSDictionary *_nvramPartitionLengths; + UInt32 _resv0 __unused; + UInt32 _resv1 __unused; + IOLock *_ofLock; + UInt32 _resv2 __unused; + UInt32 _resv3 __unused; + UInt8 *_resv4 __unused; + UInt32 _piPartitionOffset; + UInt32 _piPartitionSize; + UInt8 *_piImage; + bool _systemPaniced; + SInt32 _lastDeviceSync; + bool _freshInterval; + bool _isProxied; + + virtual UInt8 calculatePartitionChecksum(UInt8 *partitionHeader); + virtual IOReturn initOFVariables(void); +public: + virtual IOReturn syncOFVariables(void); +private: + virtual UInt32 getOFVariableType(const OSSymbol *propSymbol) const; + virtual UInt32 getOFVariablePerm(const OSSymbol *propSymbol) const; + virtual bool getOWVariableInfo(UInt32 variableNumber, const OSSymbol **propSymbol, + UInt32 *propType, UInt32 *propOffset); + virtual bool convertPropToObject(UInt8 *propName, UInt32 propNameLength, + UInt8 *propData, UInt32 propDataLength, + LIBKERN_RETURNS_RETAINED const OSSymbol **propSymbol, + LIBKERN_RETURNS_RETAINED OSObject **propObject); + virtual bool convertObjectToProp(UInt8 *buffer, UInt32 *length, + const OSSymbol *propSymbol, OSObject *propObject); + virtual UInt16 generateOWChecksum(UInt8 *buffer); + virtual bool validateOWChecksum(UInt8 *buffer); + virtual void updateOWBootArgs(const OSSymbol *key, OSObject *value); + virtual bool searchNVRAMProperty(struct IONVRAMDescriptor *hdr, + UInt32 *where); + + virtual IOReturn readNVRAMPropertyType0(IORegistryEntry *entry, + const OSSymbol **name, + OSData **value); + virtual IOReturn writeNVRAMPropertyType0(IORegistryEntry *entry, + const OSSymbol *name, + OSData * value); + + virtual OSData *unescapeBytesToData(const UInt8 *bytes, UInt32 length); + virtual OSData *escapeDataToData(OSData * value); + + virtual IOReturn readNVRAMPropertyType1(IORegistryEntry *entry, + const OSSymbol **name, + OSData **value); + virtual IOReturn writeNVRAMPropertyType1(IORegistryEntry *entry, + const OSSymbol *name, + OSData *value); + + void initNVRAMImage(void); + void initProxyData(void); + IOReturn syncVariables(void); + IOReturn setPropertyInternal(const OSSymbol *aKey, OSObject *anObject); + + +public: + virtual bool init(IORegistryEntry *old, const IORegistryPlane *plane) APPLE_KEXT_OVERRIDE; + + virtual void registerNVRAMController(IONVRAMController *nvram); + + virtual void sync(void); + + virtual bool serializeProperties(OSSerialize *s) const APPLE_KEXT_OVERRIDE; + virtual OSObject *copyProperty(const OSSymbol *aKey) const APPLE_KEXT_OVERRIDE; + virtual OSObject *copyProperty(const char *aKey) const APPLE_KEXT_OVERRIDE; + virtual OSObject *getProperty(const OSSymbol *aKey) const APPLE_KEXT_OVERRIDE; + virtual OSObject *getProperty(const char *aKey) const APPLE_KEXT_OVERRIDE; + virtual bool setProperty(const OSSymbol *aKey, OSObject *anObject) APPLE_KEXT_OVERRIDE; + virtual void removeProperty(const OSSymbol *aKey) APPLE_KEXT_OVERRIDE; + virtual IOReturn setProperties(OSObject *properties) APPLE_KEXT_OVERRIDE; + + virtual IOReturn readXPRAM(IOByteCount offset, UInt8 *buffer, + IOByteCount length); + virtual IOReturn writeXPRAM(IOByteCount offset, UInt8 *buffer, + IOByteCount length); + + virtual IOReturn readNVRAMProperty(IORegistryEntry *entry, + const OSSymbol **name, + OSData **value); + virtual IOReturn writeNVRAMProperty(IORegistryEntry *entry, + const OSSymbol *name, + OSData *value); + + virtual OSDictionary *getNVRAMPartitions(void); + + virtual IOReturn readNVRAMPartition(const OSSymbol *partitionID, + IOByteCount offset, UInt8 *buffer, + IOByteCount length); + + virtual IOReturn writeNVRAMPartition(const OSSymbol *partitionID, + IOByteCount offset, UInt8 *buffer, + IOByteCount length); + + virtual IOByteCount savePanicInfo(UInt8 *buffer, IOByteCount length); + virtual bool safeToSync(void); + void syncInternal(bool rateLimit); +}; + +#endif /* __cplusplus */ + +#endif /* !_IOKIT_IONVRAM_H */ diff --git a/QualcommWireless/include/IOKit/IONotifier.h b/QualcommWireless/include/IOKit/IONotifier.h new file mode 100644 index 0000000..3324fc7 --- /dev/null +++ b/QualcommWireless/include/IOKit/IONotifier.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. + * + * HISTORY + * + */ + +#ifndef _IOKIT_IONOTIFIER_H +#define _IOKIT_IONOTIFIER_H + +#include + +/*! @class IONotifier : public OSObject + * @abstract An abstract base class defining common methods for controlling a notification request. + * @discussion IOService notification requests are represented as implementations of the IONotifier object. It defines methods to enable, disable and remove notification requests. These actions are synchronized with invocations of the notification handler, so removing a notification request will guarantee the handler is not being executed. */ + +class IONotifier : public OSObject +{ + OSDeclareAbstractStructors(IONotifier); + +public: + +/*! @function remove + * @abstract Removes the notification request and releases it. + * @discussion Removes the notification request and release it. Since creating an IONotifier instance will leave it with a retain count of one, creating an IONotifier and then removing it will destroy it. This method is synchronous with any handler invocations, so when this method returns its guaranteed the handler will not be in entered. */ + + virtual void remove() = 0; + +/*! @function disable + * @abstract Disables the notification request. + * @discussion Disables the notification request. This method is synchronous with any handler invocations, so when this method returns its guaranteed the handler will not be in entered. + * @result Returns the previous enable state of the IONotifier. */ + + virtual bool disable() = 0; + +/*! @function enable + * @abstract Sets the enable state of the notification request. + * @discussion Restores the enable state of the notification request, given the previous state passed in. + * @param was The enable state of the notifier to restore. */ + + virtual void enable( bool was ) = 0; +}; + +#endif /* ! _IOKIT_IONOTIFIER_H */ diff --git a/QualcommWireless/include/IOKit/IOPlatformExpert.h b/QualcommWireless/include/IOKit/IOPlatformExpert.h new file mode 100644 index 0000000..9fdfd87 --- /dev/null +++ b/QualcommWireless/include/IOKit/IOPlatformExpert.h @@ -0,0 +1,428 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1998 Apple Computer, Inc. All rights reserved. + * + * HISTORY + * + */ + + +#ifndef _IOKIT_IOPLATFORMEXPERT_H +#define _IOKIT_IOPLATFORMEXPERT_H + +#ifdef __cplusplus +#include +#include +#include +#include + +extern "C" { +#endif + +#include + +typedef enum { + kCoprocessorVersionNone = 0x00000000, + kCoprocessorVersion1 = 0x00010000, + kCoprocessorVersion2 = 0x00020000, +} coprocessor_type_t; + + +extern boolean_t PEGetMachineName( char * name, int maxLength ); +extern boolean_t PEGetModelName( char * name, int maxLength ); +extern int PEGetPlatformEpoch( void ); + +enum { + kPEHaltCPU, + kPERestartCPU, + kPEHangCPU, + kPEUPSDelayHaltCPU, + kPEPanicRestartCPU, + kPEPanicSync, + kPEPagingOff, + kPEPanicBegin, + kPEPanicEnd, + kPEPanicDiskShutdown, + kPEPanicRestartCPUNoPanicEndCallouts, + kPEPanicRestartCPUNoCallouts +}; +extern int (*PE_halt_restart)(unsigned int type); +extern int PEHaltRestart(unsigned int type); + + + +// Save the Panic Info. Returns the number of bytes saved. +extern UInt32 PESavePanicInfo(UInt8 *buffer, UInt32 length); +extern void PESavePanicInfoAction(void *buffer, UInt32 offset, UInt32 length); + +/* + * SMC requires that all data is flushed in multiples of 16 bytes at 16 byte + * boundaries. + */ +#define PANIC_FLUSH_BOUNDARY 16 + +extern long PEGetGMTTimeOfDay( void ); +extern void PESetGMTTimeOfDay( long secs ); +extern void PEGetUTCTimeOfDay( clock_sec_t * secs, clock_usec_t * usecs ); +extern void PESetUTCTimeOfDay( clock_sec_t secs, clock_usec_t usecs ); + +/* unless it's a "well-known" property, these will read/write out the value as raw data */ + +extern boolean_t PEWriteNVRAMBooleanProperty(const char *symbol, boolean_t value); +extern boolean_t PEWriteNVRAMProperty(const char *symbol, const void *value, const unsigned int len); +extern boolean_t PEWriteNVRAMPropertyWithCopy(const char *symbol, const void *value, const unsigned int len); + +extern boolean_t PEReadNVRAMProperty(const char *symbol, void *value, unsigned int *len); + +extern boolean_t PERemoveNVRAMProperty(const char *symbol); + +extern coprocessor_type_t PEGetCoprocessorVersion( void ); + +#ifdef __cplusplus +} /* extern "C" */ + +#define kIOPlatformMapperPresentKey "IOPlatformMapperPresent" + + + + +extern OSSymbol * gPlatformInterruptControllerName; + +/* + * IOPlatformSleepAction + * + * Sleep is called after power management has finished all of the power plane + * driver power management notifications and state transitions and has + * committed to sleep, but before the other CPUs are powered off. + * The scheduler is still active. + */ +extern const OSSymbol *gIOPlatformSleepActionKey; + +/* + * IOPlatformWakeAction + * + * Wake is called with the scheduler enabled, but before + * powering on other CPUs, so try to minimize work done in this path to speed + * up wake time. + */ +extern const OSSymbol *gIOPlatformWakeActionKey; + +/* + * IOPlatformQuiesceAction + * + * Quiesce is called after all CPUs are off, scheduling is disabled, + * and the boot CPU is about to pull the plug. + * Mutexes and blocking are disallowed in this context and will panic. + * Do not pass this action to super() (incl. IOService, IOPlatformExpert) + */ +extern const OSSymbol *gIOPlatformQuiesceActionKey; + +/* + * IOPlatformActiveAction + * + * Active is called very early in the wake path before enabling the scheduler + * on the boot CPU. + * Mutexes and blocking are disallowed in this context and will panic. + * Do not pass this action to super() (incl. IOService, IOPlatformExpert) + */ +extern const OSSymbol *gIOPlatformActiveActionKey; + +/* + * IOPlatformHaltRestartAction + * + * Halt/Restart is called after the kernel finishes shutting down the + * system and is ready to power off or reboot. + * + * It is not guaranteed to be called in non-graceful shutdown scenarios. + */ +extern const OSSymbol *gIOPlatformHaltRestartActionKey; + +/* + * IOPlatformPanicAction + * + * Panic is called when the system is panicking before it records a core file + * (if it is configured to do so) + * + * It can be called at any time, in any context, in any state. Don't depend + * on anything being powered on in a useful state. + * + * Mutexes and blocking are disallowed in this context and will fail. + * + * If you hang or panic again in this callout, the panic log may not be recorded, + * leading to the loss of field reports about customer issues. + */ +extern const OSSymbol *gIOPlatformPanicActionKey; + +class IORangeAllocator; +class IONVRAMController; +class IOPMrootDomain; + +class IOPlatformExpert : public IOService +{ + OSDeclareDefaultStructors(IOPlatformExpert); + +private: + long _peBootROMType; + long _peChipSetType; + long _peMachineType; + +protected: + IOPMrootDomain * root; + int _pePMFeatures; + int _pePrivPMFeatures; + int _peNumBatteriesSupported; + OSArray * thePowerTree; + + bool searchingForAdditionalParents; + OSNumber * multipleParentKeyValue; + int numInstancesRegistered; + + struct ExpansionData { }; + ExpansionData *iope_reserved __unused; + + virtual void setBootROMType(long peBootROMType); + virtual void setChipSetType(long peChipSetType); + virtual void setMachineType(long peMachineType); + + virtual bool CheckSubTree(OSArray * inSubTree, IOService * theNub, IOService * theDevice, OSDictionary * theParent); + virtual bool RegisterServiceInTree(IOService * theService, OSDictionary * theTreeNode, OSDictionary * theTreeParentNode, IOService * theProvider); + + virtual void PMInstantiatePowerDomains( void ); + +public: + virtual bool attach( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual bool configure( IOService * provider ); + virtual IOService * createNub( OSDictionary * from ); + + virtual bool compareNubName( const IOService * nub, OSString * name, + OSString ** matched = NULL ) const; + virtual IOReturn getNubResources( IOService * nub ); + + virtual long getBootROMType(void); + virtual long getChipSetType(void); + virtual long getMachineType(void); + + virtual bool getModelName( char * name, int maxLength ); + virtual bool getMachineName( char * name, int maxLength ); + + virtual int haltRestart(unsigned int type); + virtual void sleepKernel(void); + + virtual long getGMTTimeOfDay( void ); + virtual void setGMTTimeOfDay( long secs ); + + virtual IOReturn getConsoleInfo( PE_Video * consoleInfo ); + virtual IOReturn setConsoleInfo( PE_Video * consoleInfo, unsigned int op ); + + virtual void registerNVRAMController( IONVRAMController * nvram ); + + virtual IOReturn registerInterruptController(OSSymbol *name, IOInterruptController *interruptController); + virtual LIBKERN_RETURNS_NOT_RETAINED IOInterruptController * + lookUpInterruptController(OSSymbol *name); + + virtual void setCPUInterruptProperties(IOService *service); + virtual bool atInterruptLevel(void); + + virtual IOReturn callPlatformFunction(const OSSymbol *functionName, + bool waitForFunction, + void *param1, void *param2, + void *param3, void *param4) APPLE_KEXT_OVERRIDE; + + virtual IORangeAllocator * getPhysicalRangeAllocator(void); + + virtual bool platformAdjustService(IOService *service); + + virtual void PMRegisterDevice(IOService * theNub, IOService * theDevice); + virtual void PMLog( const char *, unsigned long, unsigned long, unsigned long ); + + virtual bool hasPMFeature(unsigned long featureMask); + virtual bool hasPrivPMFeature(unsigned long privFeatureMask); + virtual int numBatteriesSupported(void); + + virtual IOByteCount savePanicInfo(UInt8 *buffer, IOByteCount length); + + virtual OSString* createSystemSerialNumberString(OSData* myProperty); + + virtual IOReturn deregisterInterruptController(OSSymbol *name); + + virtual void getUTCTimeOfDay( clock_sec_t * secs, clock_nsec_t * nsecs ); + virtual void setUTCTimeOfDay( clock_sec_t secs, clock_nsec_t nsecs ); + + OSMetaClassDeclareReservedUsed(IOPlatformExpert, 0); + OSMetaClassDeclareReservedUsed(IOPlatformExpert, 1); + OSMetaClassDeclareReservedUsed(IOPlatformExpert, 2); + OSMetaClassDeclareReservedUsed(IOPlatformExpert, 3); + OSMetaClassDeclareReservedUsed(IOPlatformExpert, 4); + OSMetaClassDeclareReservedUnused(IOPlatformExpert, 5); + OSMetaClassDeclareReservedUnused(IOPlatformExpert, 6); + OSMetaClassDeclareReservedUnused(IOPlatformExpert, 7); + OSMetaClassDeclareReservedUnused(IOPlatformExpert, 8); + OSMetaClassDeclareReservedUnused(IOPlatformExpert, 9); + OSMetaClassDeclareReservedUnused(IOPlatformExpert, 10); + OSMetaClassDeclareReservedUnused(IOPlatformExpert, 11); +}; + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +class IODTNVRAM; + +class IODTPlatformExpert : public IOPlatformExpert +{ + OSDeclareAbstractStructors(IODTPlatformExpert); + +private: + IODTNVRAM *dtNVRAM; + + struct ExpansionData { }; + ExpansionData *iodtpe_reserved; + +public: + virtual IOService * probe( IOService * provider, + SInt32 * score ) APPLE_KEXT_OVERRIDE; + virtual bool configure( IOService * provider ) APPLE_KEXT_OVERRIDE; + + virtual void processTopLevel( IORegistryEntry * root ); + virtual const char * deleteList( void ) = 0; + virtual const char * excludeList( void ) = 0; + virtual IOService * createNub( IORegistryEntry * from ); + virtual bool createNubs( IOService * parent, LIBKERN_CONSUMED OSIterator * iter ); + + virtual bool compareNubName( const IOService * nub, OSString * name, + OSString ** matched = NULL ) const APPLE_KEXT_OVERRIDE; + + virtual IOReturn getNubResources( IOService * nub ) APPLE_KEXT_OVERRIDE; + + virtual bool getModelName( char * name, int maxLength ) APPLE_KEXT_OVERRIDE; + virtual bool getMachineName( char * name, int maxLength ) APPLE_KEXT_OVERRIDE; + + virtual void registerNVRAMController( IONVRAMController * nvram ) APPLE_KEXT_OVERRIDE; + + virtual int haltRestart(unsigned int type) APPLE_KEXT_OVERRIDE; + +/* virtual */ IOReturn readXPRAM(IOByteCount offset, UInt8 * buffer, + IOByteCount length); + +/* virtual */ IOReturn writeXPRAM(IOByteCount offset, UInt8 * buffer, + IOByteCount length); + + virtual IOReturn readNVRAMProperty( + IORegistryEntry * entry, + const OSSymbol ** name, OSData ** value ); + + virtual IOReturn writeNVRAMProperty( + IORegistryEntry * entry, + const OSSymbol * name, OSData * value ); + +// This returns a dictionary describing all the NVRAM partitions. +// The keys will be the partitionIDs of the form "0x52,nvram". +// The values will be OSNumbers of the partition's byte count. +/* virtual */ OSDictionary *getNVRAMPartitions(void); + +/* virtual */ IOReturn readNVRAMPartition(const OSSymbol * partitionID, + IOByteCount offset, UInt8 * buffer, + IOByteCount length); + +/* virtual */ IOReturn writeNVRAMPartition(const OSSymbol * partitionID, + IOByteCount offset, UInt8 * buffer, + IOByteCount length); + + virtual IOByteCount savePanicInfo(UInt8 *buffer, IOByteCount length) APPLE_KEXT_OVERRIDE; + virtual OSString* createSystemSerialNumberString(OSData* myProperty) APPLE_KEXT_OVERRIDE; + + OSMetaClassDeclareReservedUnused(IODTPlatformExpert, 0); + OSMetaClassDeclareReservedUnused(IODTPlatformExpert, 1); + OSMetaClassDeclareReservedUnused(IODTPlatformExpert, 2); + OSMetaClassDeclareReservedUnused(IODTPlatformExpert, 3); + OSMetaClassDeclareReservedUnused(IODTPlatformExpert, 4); + OSMetaClassDeclareReservedUnused(IODTPlatformExpert, 5); + OSMetaClassDeclareReservedUnused(IODTPlatformExpert, 6); + OSMetaClassDeclareReservedUnused(IODTPlatformExpert, 7); +}; + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* generic root nub of service tree */ + +class IOPlatformExpertDevice : public IOService +{ + OSDeclareDefaultStructors(IOPlatformExpertDevice); + +private: + IOWorkLoop *workLoop; + + struct ExpansionData { }; + ExpansionData *ioped_reserved __unused; + +public: + virtual bool initWithArgs( void * p1, void * p2, + void * p3, void *p4 ); + virtual bool compareName( OSString * name, OSString ** matched = NULL ) const APPLE_KEXT_OVERRIDE; + + virtual IOWorkLoop *getWorkLoop() const APPLE_KEXT_OVERRIDE; + virtual IOReturn setProperties( OSObject * properties ) APPLE_KEXT_OVERRIDE; + + virtual void free() APPLE_KEXT_OVERRIDE; + + virtual IOReturn newUserClient( task_t owningTask, void * securityID, + UInt32 type, OSDictionary * properties, + IOUserClient ** handler) APPLE_KEXT_OVERRIDE; + + + OSMetaClassDeclareReservedUnused(IOPlatformExpertDevice, 0); + OSMetaClassDeclareReservedUnused(IOPlatformExpertDevice, 1); + OSMetaClassDeclareReservedUnused(IOPlatformExpertDevice, 2); + OSMetaClassDeclareReservedUnused(IOPlatformExpertDevice, 3); +}; + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* generic nub for motherboard devices */ + +class IOPlatformDevice : public IOService +{ + OSDeclareDefaultStructors(IOPlatformDevice); + + struct ExpansionData { }; + ExpansionData *iopd_reserved; + +public: + virtual bool compareName( OSString * name, OSString ** matched = NULL ) const APPLE_KEXT_OVERRIDE; + virtual IOService * matchLocation( IOService * client ) APPLE_KEXT_OVERRIDE; + virtual IOReturn getResources( void ) APPLE_KEXT_OVERRIDE; + + OSMetaClassDeclareReservedUnused(IOPlatformDevice, 0); + OSMetaClassDeclareReservedUnused(IOPlatformDevice, 1); + OSMetaClassDeclareReservedUnused(IOPlatformDevice, 2); + OSMetaClassDeclareReservedUnused(IOPlatformDevice, 3); +}; + +#endif /* __cplusplus */ + +#endif /* ! _IOKIT_IOPLATFORMEXPERT_H */ diff --git a/QualcommWireless/include/IOKit/IORPC.h b/QualcommWireless/include/IOKit/IORPC.h new file mode 100644 index 0000000..bb729c8 --- /dev/null +++ b/QualcommWireless/include/IOKit/IORPC.h @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2018 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + + +#ifndef _IORPC_H +#define _IORPC_H + +#include + + +#include + + +class IOUserServer; + +typedef uint64_t OSObjectRef; + +enum { + kIORPCVersion190615 = (mach_msg_id_t) 0x4da2b68c, + kIORPCVersion190615Reply = (mach_msg_id_t) 0x4da2b68d, + +#if DRIVERKIT_PRIVATE + kIORPCVersion190501 = (mach_msg_id_t) 0xfe316a7a, + kIORPCVersion190501Reply = (mach_msg_id_t) 0xfe316a7b, + + kIORPCVersionCurrent = kIORPCVersion190615, + kIORPCVersionCurrentReply = kIORPCVersion190615Reply +#endif /* DRIVERKIT_PRIVATE */ +}; + +enum{ + kIORPCMessageRemote = 0x00000001, + kIORPCMessageLocalHost = 0x00000002, + kIORPCMessageKernel = 0x00000004, + kIORPCMessageOneway = 0x00000008, + kIORPCMessageObjectRefs = 0x00000010, + kIORPCMessageOnqueue = 0x00000020, + kIORPCMessageError = 0x00000040, + kIORPCMessageSimpleReply = 0x00000080, +}; + +enum{ + kIORPCMessageIDKernel = (1ULL << 63), +}; + +struct IORPCMessageMach { + mach_msg_header_t msgh; + mach_msg_body_t msgh_body; + mach_msg_port_descriptor_t objects[0]; +}; +typedef struct IORPCMessageMach IORPCMessageMach; + +struct IORPCMessage { + uint64_t msgid; + uint64_t flags; + uint64_t objectRefs; + OSObjectRef objects[0]; +}; +typedef struct IORPCMessage IORPCMessage; + +extern "C" IORPCMessage * +IORPCMessageFromMach(IORPCMessageMach * msg, bool reply); + +struct IORPCMessageErrorReturnContent { + IORPCMessage hdr; + kern_return_t result; + uint32_t pad; +}; + +#pragma pack(4) +struct IORPCMessageErrorReturn { + IORPCMessageMach mach; + IORPCMessageErrorReturnContent content; +}; +#pragma pack() + + +class OSMetaClassBase; +struct IORPC; +typedef kern_return_t (*OSDispatchMethod)(OSMetaClassBase * self, const IORPC rpc); + +struct IORPC { + IORPCMessageMach * message; + IORPCMessageMach * reply; + uint32_t sendSize; + uint32_t replySize; +}; +typedef struct IORPC IORPC; + +enum { + kOSClassCanRemote = 0x00000001, +}; + +struct OSClassDescription { + uint32_t descriptionSize; + + char name[96]; + char superName[96]; + + uint32_t methodOptionsSize; + uint32_t methodOptionsOffset; + uint32_t metaMethodOptionsSize; + uint32_t metaMethodOptionsOffset; + uint32_t queueNamesSize; + uint32_t queueNamesOffset; + uint32_t methodNamesSize; + uint32_t methodNamesOffset; + uint32_t metaMethodNamesSize; + uint32_t metaMethodNamesOffset; + + uint64_t flags; + + uint64_t resv1[8]; + + uint64_t methodOptions[0]; + uint64_t metaMethodOptions[0]; + + char dispatchNames[0]; + char methodNames[0]; + char metaMethodNames[0]; +}; + +#endif /* _IORPC_H */ diff --git a/QualcommWireless/include/IOKit/IORangeAllocator.h b/QualcommWireless/include/IOKit/IORangeAllocator.h new file mode 100644 index 0000000..e7b0472 --- /dev/null +++ b/QualcommWireless/include/IOKit/IORangeAllocator.h @@ -0,0 +1,170 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1999 Apple Computer, Inc. + * + * + * HISTORY + * + * sdouglas 05 Nov 99 - created. + */ + +#ifndef _IOKIT_IORANGEALLOCATOR_H +#define _IOKIT_IORANGEALLOCATOR_H + +#include +#include + +typedef IOByteCount IORangeScalar; + +/*! @class IORangeAllocator + * @abstract A utility class to manage allocations from a range. + * @discussion The IORangeAllocator class provides functions for allocating ranges, at a fixed or any offset, and freeing them back to a free list. It is useful for describing ranges of memory or address space without requiring storage in the memory - information describing the free elements is kept elsewhere. Ranges are described by a start offset and a size. IORangeAllocator is optionally protected against multithreaded access. + */ + +class IORangeAllocator : public OSObject { + OSDeclareDefaultStructors(IORangeAllocator); + +protected: + UInt32 numElements; + UInt32 capacity; + UInt32 capacityIncrement; + IORangeScalar defaultAlignmentMask; + IOOptionBits options; + + struct IORangeAllocatorElement * elements; + +private: + virtual bool allocElement( UInt32 index ); + + virtual void deallocElement( UInt32 index ); + +public: + enum { + kLocking = 0x00000001 + }; + +/*! @function init + * @abstract Standard initializer for IORangeAllocator. + * @discussion This method initializes an IORangeAllocator and optionally sets the free list to contain one fragment, from zero to an endOfRange parameter. The capacity in terms of free fragments and locking options are set for the instance. + * @param endOfRange If the free list is to contain an initial fragment, set endOfRange to the last offset in the range, ie. size - 1, to create a free fragment for the range zero to endOfRange inclusive. If zero is passed, the free list will be initialized empty, and can be populated with calls to the deallocate method. + * @param defaultAlignment If this parameter is non-zero it specifies a required alignment for all allocations, for example pass 256 to align allocations on 256 byte boundaries. Zero or one specify unaligned allocations. + * @param capacity Sets the initial size of the free list in number of noncontiguous fragments. This value is also used for the capacityIncrement. + * @param options Pass kLocking if the instance can be used by multiple threads. + * @result Returns true if the instance is successfully initialized, false on failure. */ + + virtual bool init( IORangeScalar endOfRange, + IORangeScalar defaultAlignment, + UInt32 capacity, + IOOptionBits options ); + +/*! @function withRange + * @abstract Standard factory method for IORangeAllocator. + * @discussion This method allocates and initializes an IORangeAllocator and optionally sets the free list to contain one fragment, from zero to an endOfRange parameter. The capacity in terms of free fragments and locking options are set for the instance. + * @param endOfRange If the free list is to contain an initial fragment, set endOfRange to the last offset in the range, ie. size - 1, to create a free fragment for the range zero to endOfRange inclusive. If zero is passed the free list will be initialized empty, and can be populated with calls to the deallocate method. + * @param defaultAlignment If this parameter is non-zero it specifies a required alignment for all allocations, for example pass 256 to align allocations on 256 byte boundaries. Zero or one specify unaligned allocations. + * @param capacity Sets the initial size of the free list in number of non-contiguous fragments. This value is also used for the capacityIncrement. + * @param options Pass kLocking if the instance can be used by multiple threads. + * @result Returns the new IORangeAllocator instance, to be released by the caller, or zero on failure. */ + + static IORangeAllocator * withRange( IORangeScalar endOfRange, + IORangeScalar defaultAlignment = 0, + UInt32 capacity = 0, + IOOptionBits options = 0 ); + + virtual void free() APPLE_KEXT_OVERRIDE; + virtual bool serialize(OSSerialize *s) const APPLE_KEXT_OVERRIDE; + +/*! @function getFragmentCount + * @abstract Accessor to return the number of free fragments in the range. + * @discussion This method returns a count of free fragments. Each fragment describes a non-contiguous free range - deallocations will merge contiguous fragments together. + * @result Returns the count of free fragments. + */ + + virtual UInt32 getFragmentCount( void ); + +/*! @function getFragmentCapacity + * @abstract Accessor to return the number of free fragments in the range. + * @discussion This method returns the current capacity of the free fragment list. + * @result Returns the current capacity of free fragment list. + */ + + virtual UInt32 getFragmentCapacity( void ); + +/*! @function setFragmentCapacityIncrement + * @abstract Sets the count of fragments the free list will increase by when full. + * @discussion This method sets the number of extra fragments the free list will expand to when full. It defaults to the initial capacity. + * @param count The number of fragments to increment the capacity by when the free list is full. + */ + + virtual void setFragmentCapacityIncrement( UInt32 count ); + +/*! @function getFreeCount + * @abstract Totals the sizes of the free fragments. + * @discussion This method returns the total of the sizes of the fragments on the free list. + * @result Returns the total of the free fragments sizes. + */ + + virtual IORangeScalar getFreeCount( void ); + +/*! @function allocate + * @abstract Allocates from the free list, at any offset. + * @discussion This method allocates a range from the free list. The alignment will default to the alignment set when the allocator was created or may be set here. + * @param size The size of the range requested. + * @param result The beginning of the range allocated is returned here on success. + * @param alignment If zero is passed, default to the allocators alignment, otherwise pass an alignment required for the allocation, for example 4096 to page align. + * @result Returns true if the allocation was successful, else false. + */ + + virtual bool allocate( IORangeScalar size, + IORangeScalar * result, + IORangeScalar alignment = 0 ); + +/*! @function allocateRange + * @abstract Allocates from the free list, at a set offset. + * @discussion This method allocates a range from the free list, given a set offset passed in. + * @param start The beginning of the range requested. + * @param size The size of the range requested. + * @result Returns true if the allocation was successful, else false. + */ + + virtual bool allocateRange( IORangeScalar start, + IORangeScalar size ); + +/*! @function deallocate + * @abstract Deallocates a range to the free list. + * @discussion This method deallocates a range to the free list, given a the start offset and length passed in. + * @param start The beginning of the range requested. + * @param size Returns the size of the range requested. + */ + + virtual void deallocate( IORangeScalar start, + IORangeScalar size ); +}; + +#endif /* _IOKIT_IORANGEALLOCATOR_H */ diff --git a/QualcommWireless/include/IOKit/IORegistryEntry.h b/QualcommWireless/include/IOKit/IORegistryEntry.h new file mode 100644 index 0000000..a590e92 --- /dev/null +++ b/QualcommWireless/include/IOKit/IORegistryEntry.h @@ -0,0 +1,955 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1998 Apple Computer, Inc. All rights reserved. + * + * HISTORY + * + */ + + +#ifndef _IOKIT_IOREGISTRYENTRY_H +#define _IOKIT_IOREGISTRYENTRY_H + +#include +#include + + +extern const OSSymbol * gIONameKey; +extern const OSSymbol * gIOLocationKey; +extern const OSSymbol * gIORegistryEntryIDKey; +extern const OSSymbol * gIORegistryEntryPropertyKeysKey; + +class IORegistryEntry; +class IORegistryPlane; +class IORegistryIterator; + +typedef void (*IORegistryEntryApplierFunction)(IORegistryEntry * entry, + void * context); + +enum { + kIORegistryIterateRecursively = 0x00000001, + kIORegistryIterateParents = 0x00000002, +}; + + +/*! @class IORegistryEntry : public OSObject + * @abstract The base class for all objects in the registry. + * @discussion The IORegistryEntry base class provides functions for describing graphs of connected registry entries, each with a dictionary-based property table. Entries may be connected in different planes, with differing topologies. Access to the registry is protected against multiple threads. Inside the kernel planes are specified with plane objects and are published by the creator - IOService exports the gIOServicePlane plane object for example. Non kernel clients specify planes by their name. + */ + +class IORegistryEntry : public OSObject +{ + friend class IORegistryIterator; + + OSDeclareDefaultStructors(IORegistryEntry); + +protected: +/*! @struct ExpansionData + * @discussion This structure will be used to expand the capablilties of this class in the future. + */ + struct ExpansionData; + +/*! @var reserved + * Reserved for future use. (Internal use only) */ + ExpansionData * reserved; + +private: + + OSDictionary * fRegistryTable; + OSDictionary * fPropertyTable; + +public: +/* methods available in Mac OS X 10.1 or later */ + +/*! @function copyProperty + * @abstract Synchronized method to obtain a property from a registry entry or one of its parents (or children) in the hierarchy. Available in Mac OS X 10.1 or later. + * @discussion This method will search for a property, starting first with this registry entry's property table, then iterating recusively through either the parent registry entries or the child registry entries of this entry. Once the first occurrence is found, it will lookup and return the value of the property, using the OSDictionary::getObject semantics. The iteration keeps track of entries that have been recursed into previously to avoid loops. This method is synchronized with other IORegistryEntry accesses to the property table(s). + * @param aKey The property's name as a C-string. + * @param plane The plane to iterate over, eg. gIOServicePlane. + * @param options kIORegistryIterateRecursively may be set to recurse automatically into the registry hierarchy. Without this option, this method degenerates into the standard getProperty() call. kIORegistryIterateParents may be set to iterate the parents of the entry, in place of the children. + * @result The property value found, or zero. A reference on any found property is returned to caller, which should be released. */ + + virtual OSObject * copyProperty( const char * aKey, + const IORegistryPlane * plane, + IOOptionBits options = + kIORegistryIterateRecursively | + kIORegistryIterateParents) const; + +/*! @function copyProperty + * @abstract Synchronized method to obtain a property from a registry entry or one of its parents (or children) in the hierarchy. Available in Mac OS X 10.1 or later. + * @discussion This method will search for a property, starting first with this registry entry's property table, then iterating recusively through either the parent registry entries or the child registry entries of this entry. Once the first occurrence is found, it will lookup and return the value of the property, using the OSDictionary::getObject semantics. The iteration keeps track of entries that have been recursed into previously to avoid loops. This method is synchronized with other IORegistryEntry accesses to the property table(s). + * @param aKey The property's name as an OSString. + * @param plane The plane to iterate over, eg. gIOServicePlane. + * @param options kIORegistryIterateRecursively may be set to recurse automatically into the registry hierarchy. Without this option, this method degenerates into the standard getProperty() call. kIORegistryIterateParents may be set to iterate the parents of the entry, in place of the children. + * @result The property value found, or zero. A reference on any found property is returned to caller, which should be released. */ + + virtual OSObject * copyProperty( const OSString * aKey, + const IORegistryPlane * plane, + IOOptionBits options = + kIORegistryIterateRecursively | + kIORegistryIterateParents) const; + +/*! @function copyProperty + * @abstract Synchronized method to obtain a property from a registry entry or one of its parents (or children) in the hierarchy. Available in Mac OS X 10.1 or later. + * @discussion This method will search for a property, starting first with this registry entry's property table, then iterating recusively through either the parent registry entries or the child registry entries of this entry. Once the first occurrence is found, it will lookup and return the value of the property, using the OSDictionary::getObject semantics. The iteration keeps track of entries that have been recursed into previously to avoid loops. This method is synchronized with other IORegistryEntry accesses to the property table(s). + * @param aKey The property's name as an OSSymbol. + * @param plane The plane to iterate over, eg. gIOServicePlane. + * @param options kIORegistryIterateRecursively may be set to recurse automatically into the registry hierarchy. Without this option, this method degenerates into the standard getProperty() call. kIORegistryIterateParents may be set to iterate the parents of the entry, in place of the children. + * @result The property value found, or zero. A reference on any found property is returned to caller, which should be released. */ + + virtual OSObject * copyProperty( const OSSymbol * aKey, + const IORegistryPlane * plane, + IOOptionBits options = + kIORegistryIterateRecursively | + kIORegistryIterateParents) const; + +/*! @function copyParentEntry + * @abstract Returns an registry entry's first parent entry in a plane. Available in Mac OS X 10.1 or later. + * @discussion This function will return the parent to which a registry entry was first attached. Since the majority of registry entrys have only one provider, this is a useful simplification. + * @param plane The plane object. + * @result Returns the first parent of the registry entry, or zero if the entry is not attached into the registry in that plane. A reference on the entry is returned to caller, which should be released. */ + + virtual IORegistryEntry * copyParentEntry( const IORegistryPlane * plane ) const; + +/*! @function copyChildEntry + * @abstract Returns an registry entry's first child entry in a plane. Available in Mac OS X 10.1 or later. + * @discussion This function will return the child which first attached to a registry entry. + * @param plane The plane object. + * @result Returns the first child of the registry entry, or zero if the entry is not attached into the registry in that plane. A reference on the entry is returned to caller, which should be released. */ + + virtual IORegistryEntry * copyChildEntry( const IORegistryPlane * plane ) const; + +/* method available in Mac OS X 10.4 or later */ +/*! + * @typedef Action + * @discussion Type and arguments of callout C function that is used when + * a runCommand is executed by a client. Cast to this type when you want a C++ + * member function to be used. Note the arg1 - arg3 parameters are passed straight pass through to the action callout. + * @param target + * Target of the function, can be used as a refcon. Note if a C++ function + * was specified, this parameter is implicitly the first parameter in the target + * member function's parameter list. + * @param arg0 Argument to action from run operation. + * @param arg1 Argument to action from run operation. + * @param arg2 Argument to action from run operation. + * @param arg3 Argument to action from run operation. + */ + typedef IOReturn (*Action)(OSObject *target, + void *arg0, void *arg1, + void *arg2, void *arg3); + +/*! @function runPropertyAction + * @abstract Single thread a call to an action w.r.t. the property lock + * @discussion Client function that causes the given action to be called in a manner that syncrhonises with the registry iterators and serialisers. This functin can be used to synchronously manipulate the property table of this nub + * @param action Pointer to function to be executed in work-loop context. + * @param arg0 Parameter for action parameter, defaults to 0. + * @param arg1 Parameter for action parameter, defaults to 0. + * @param arg2 Parameter for action parameter, defaults to 0. + * @param arg3 Parameter for action parameter, defaults to 0. + * @result Returns the value of the Action callout. + */ + virtual IOReturn runPropertyAction(Action action, OSObject *target, + void *arg0 = NULL, void *arg1 = NULL, + void *arg2 = NULL, void *arg3 = NULL); + +#ifdef __BLOCKS__ + typedef IOReturn (^ActionBlock)(void); + IOReturn runPropertyActionBlock(ActionBlock block); +#endif /* __BLOCKS__ */ + +private: +#if __LP64__ + OSMetaClassDeclareReservedUnused(IORegistryEntry, 0); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 1); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 2); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 3); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 4); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 5); +#else + OSMetaClassDeclareReservedUsed(IORegistryEntry, 0); + OSMetaClassDeclareReservedUsed(IORegistryEntry, 1); + OSMetaClassDeclareReservedUsed(IORegistryEntry, 2); + OSMetaClassDeclareReservedUsed(IORegistryEntry, 3); + OSMetaClassDeclareReservedUsed(IORegistryEntry, 4); + OSMetaClassDeclareReservedUsed(IORegistryEntry, 5); +#endif + OSMetaClassDeclareReservedUnused(IORegistryEntry, 6); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 7); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 8); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 9); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 10); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 11); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 12); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 13); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 14); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 15); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 16); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 17); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 18); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 19); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 20); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 21); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 22); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 23); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 24); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 25); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 26); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 27); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 28); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 29); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 30); + OSMetaClassDeclareReservedUnused(IORegistryEntry, 31); + +public: + +/* Registry accessors */ + +/*! @function getRegistryRoot + * @abstract Returns a pointer to the root instance of the registry. + * @discussion This method provides an accessor to the root of the registry for the machine. The root may be passed to a registry iterator when iterating a plane, and contains properties that describe the available planes, and diagnostic information for IOKit. Keys for these properties are in IOKitKeys.h. + * @result A pointer to the IORegistryEntry root instance. It should not be released by the caller. */ + + static IORegistryEntry * getRegistryRoot( void ); + +/*! @function getGenerationCount + * @abstract Returns an generation count for all registry changing operations. + * @discussion This method provides an accessor to the current generation count (or seed) of the registry which changes when any topology change occurs in the registry - this does not include property table changes. It may be used to invalidate any caching of the results from IORegistryEntry methods. + * @result An integer generation count. */ + + static SInt32 getGenerationCount( void ); + +/*! @function getPlane + * @abstract Looks up the plane object by a C-string name. + * @discussion Planes are usually provided as globals by the creator, eg. gIOServicePlane, gIODeviceTreePlane, or gIOAudioPlane, however they may also be looked up by name with this method. + * @result A pointer to the plane object, or zero if no such plane exists. The returned plane should not be released. */ + + static const IORegistryPlane * getPlane( const char * name ); + +/* Registry Entry allocation & init */ + +/*! @function init + * @abstract Standard init method for all IORegistryEntry subclasses. + * @discussion A registry entry must be initialized with this method before it can be used. A property dictionary may passed and will be retained by this method for use as the registry entry's property table, or an empty one will be created. + * @param dictionary A dictionary that will become the registry entry's property table (retaining it), or zero which will cause an empty property table to be created. + * @result true on success, or false on a resource failure. */ + + virtual bool init( OSDictionary * dictionary = NULL ); + +/*! @function free + * @abstract Standard free method for all IORegistryEntry subclasses. + * @discussion This method will release any resources of the entry, in particular its property table. Note that the registry entry must always be detached from the registry before free may be called, and subclasses (namely IOService) will have additional protocols for removing registry entries. free should never need be called directly. */ + + virtual void free( void ) APPLE_KEXT_OVERRIDE; + +/*! @function setPropertyTable + * @abstract Replace a registry entry's property table. + * @discussion This method will release the current property table of a the entry and replace it with another, retaining the new property table. + * @param dict The new dictionary to be used as the entry's property table. */ + + virtual void setPropertyTable( OSDictionary * dict ); + +/* Synchronized property accessors; wrappers to OSDictionary + * plus property creation helpers */ + +/*! @function setProperty + * @abstract Synchronized method to add a property to a registry entry's property table. + * @discussion This method will add or replace a property in a registry entry's property table, using the OSDictionary::setObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table. + * @param aKey The properties name as an OSSymbol. + * @param anObject The property value. + * @result true on success or false on a resource failure. */ + + virtual bool setProperty(const OSSymbol * aKey, + OSObject * anObject); + + +/*! @function setProperty + * @abstract Synchronized method to add a property to a registry entry's property table. + * @discussion This method will add or replace a property in a registry entry's property table, using the OSDictionary::setObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table. + * @param aKey The property's name as an OSString. + * @param anObject The property value. + * @result true on success or false on a resource failure. */ + + virtual bool setProperty(const OSString * aKey, OSObject * anObject); + +/*! @function setProperty + * @abstract Synchronized method to add a property to a registry entry's property table. + * @discussion This method will add or replace a property in a registry entry's property table, using the OSDictionary::setObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table. + * @param aKey The property's name as a C-string. + * @param anObject The property value. + * @result true on success or false on a resource failure. */ + + virtual bool setProperty(const char * aKey, OSObject * anObject); + +/*! @function setProperty + * @abstract Synchronized method to construct and add a OSString property to a registry entry's property table. + * @discussion This method will add or replace a property in a registry entry's property table, using the OSDictionary::setObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table. The property is created as an OSString from the supplied C-string, set in the property table with the given name, and released. + * @param aKey The property's name as a C-string. + * @param aString The property value as a C-string. + * @result true on success or false on a resource failure. */ + + virtual bool setProperty(const char * aKey, const char * aString); + +/*! @function setProperty + * @abstract Synchronized method to construct and add an OSBoolean property to a registry entry's property table. + * @discussion This method will add or replace a property in a registry entry's property table, using the OSDictionary::setObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table. The property is created as an OSBoolean from the supplied value, set in the property table with the given name, and released. + * @param aKey The property's name as a C-string. + * @param aBoolean The property's boolean value. + * @result true on success or false on a resource failure. */ + + virtual bool setProperty(const char * aKey, bool aBoolean); + +/*! @function setProperty + * @abstract Synchronized method to construct and add an OSNumber property to a registry entry's property table. + * @discussion This method will add or replace a property in a registry entry's property table, using the OSDictionary::setObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table. The property is created as an OSNumber from the supplied value and size, set in the property table with the given name, and released. + * @param aKey The property's name as a C-string. + * @param aValue The property's numeric value. + * @param aNumberOfBits The property's size in bits, for OSNumber. + * @result true on success or false on a resource failure. */ + + virtual bool setProperty( const char * aKey, + unsigned long long aValue, + unsigned int aNumberOfBits); + +/*! @function setProperty + * @abstract Synchronized method to construct and add an OSData property to a registry entry's property table. + * @discussion This method will add or replace a property in a registry entry's property table, using the OSDictionary::setObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table. The property is created as an OSData copied from the supplied data and length, set in the property table with the given name, and released. + * @param aKey The property's name as a C-string. + * @param bytes The property's value as a pointer. OSData will copy this data. + * @param length The property's size in bytes, for OSData. + * @result true on success or false on a resource failure. */ + + virtual bool setProperty( const char * aKey, + void * bytes, + unsigned int length); + +/*! @function removeProperty + * @abstract Synchronized method to remove a property from a registry entry's property table. + * @discussion This method will remove a property from a registry entry's property table, using the OSDictionary::removeObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table. + * @param aKey The property's name as an OSSymbol. */ + + virtual void removeProperty( const OSSymbol * aKey); + +/*! @function removeProperty + * @abstract Synchronized method to remove a property from a registry entry's property table. + * @discussion This method will remove a property from a registry entry's property table, using the OSDictionary::removeObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table. + * @param aKey The property's name as an OSString. */ + + virtual void removeProperty( const OSString * aKey); + +/*! @function removeProperty + * @abstract Synchronized method to remove a property from a registry entry's property table. + * @discussion This method will remove a property from a registry entry's property table, using the OSDictionary::removeObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table. + * @param aKey The property's name as a C-string. */ + + virtual void removeProperty( const char * aKey); + +/*! @function getProperty + * @abstract Synchronized method to obtain a property from a registry entry's property table. + * @discussion This method will lookup a property in a registry entry's property table, using the OSDictionary::getObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table. + * @param aKey The property's name as an OSSymbol. + * @result The property value found, or zero. */ + + virtual OSObject * getProperty( const OSSymbol * aKey) const; + +/*! @function getProperty + * @abstract Synchronized method to obtain a property from a registry entry's property table. + * @discussion This method will lookup a property in a registry entry's property table, using the OSDictionary::getObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table. + * @param aKey The property's name as an OSString. + * @result The property value found, or zero. */ + + virtual OSObject * getProperty( const OSString * aKey) const; + +/*! @function getProperty + * @abstract Synchronized method to obtain a property from a registry entry's property table. + * @discussion This method will lookup a property in a registry entry's property table, using the OSDictionary::getObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table. + * @param aKey The property's name as a C-string. + * @result The property value found, or zero. */ + + virtual OSObject * getProperty( const char * aKey) const; + +/*! @function getProperty + * @abstract Synchronized method to obtain a property from a registry entry or one of its parents (or children) in the hierarchy. + * @discussion This method will search for a property, starting first with this registry entry's property table, then iterating recusively through either the parent registry entries or the child registry entries of this entry. Once the first occurrence is found, it will lookup and return the value of the property, using the OSDictionary::getObject semantics. The iteration keeps track of entries that have been recursed into previously to avoid loops. This method is synchronized with other IORegistryEntry accesses to the property table(s). + * @param aKey The property's name as an OSSymbol. + * @param plane The plane to iterate over, eg. gIOServicePlane. + * @param options kIORegistryIterateRecursively may be set to recurse automatically into the registry hierarchy. Without this option, this method degenerates into the standard getProperty() call. kIORegistryIterateParents may be set to iterate the parents of the entry, in place of the children. + * @result The property value found, or zero. */ + + virtual OSObject * getProperty( const OSSymbol * aKey, + const IORegistryPlane * plane, + IOOptionBits options = + kIORegistryIterateRecursively | + kIORegistryIterateParents) const; + +/*! @function getProperty + * @abstract Synchronized method to obtain a property from a registry entry or one of its parents (or children) in the hierarchy. + * @discussion This method will search for a property, starting first with this registry entry's property table, then iterating recusively through either the parent registry entries or the child registry entries of this entry. Once the first occurrence is found, it will lookup and return the value of the property, using the OSDictionary::getObject semantics. The iteration keeps track of entries that have been recursed into previously to avoid loops. This method is synchronized with other IORegistryEntry accesses to the property table(s). + * @param aKey The property's name as an OSString. + * @param plane The plane to iterate over, eg. gIOServicePlane. + * @param options kIORegistryIterateRecursively may be set to recurse automatically into the registry hierarchy. Without this option, this method degenerates into the standard getProperty() call. kIORegistryIterateParents may be set to iterate the parents of the entry, in place of the children. + * @result The property value found, or zero. */ + + virtual OSObject * getProperty( const OSString * aKey, + const IORegistryPlane * plane, + IOOptionBits options = + kIORegistryIterateRecursively | + kIORegistryIterateParents) const; + +/*! @function getProperty + * @abstract Synchronized method to obtain a property from a registry entry or one of its parents (or children) in the hierarchy. + * @discussion This method will search for a property, starting first with this registry entry's property table, then iterating recusively through either the parent registry entries or the child registry entries of this entry. Once the first occurrence is found, it will lookup and return the value of the property, using the OSDictionary::getObject semantics. The iteration keeps track of entries that have been recursed into previously to avoid loops. This method is synchronized with other IORegistryEntry accesses to the property table(s). + * @param aKey The property's name as a C-string. + * @param plane The plane to iterate over, eg. gIOServicePlane. + * @param options kIORegistryIterateRecursively may be set to recurse automatically into the registry hierarchy. Without this option, this method degenerates into the standard getProperty() call. kIORegistryIterateParents may be set to iterate the parents of the entry, in place of the children. + * @result The property value found, or zero. */ + + virtual OSObject * getProperty( const char * aKey, + const IORegistryPlane * plane, + IOOptionBits options = + kIORegistryIterateRecursively | + kIORegistryIterateParents) const; + +/*! @function copyProperty + * @abstract Synchronized method to obtain a property from a registry entry's property table. + * @discussion This method will lookup a property in a registry entry's property table, using the OSDictionary::getObject semantics, and return a reference to the caller. This method is synchronized with other IORegistryEntry accesses to the property table. + * @param aKey The property's name as an OSSymbol. + * @result The property value found, or zero. It should be released by the caller. */ + + virtual OSObject * copyProperty( const OSSymbol * aKey) const; + +/*! @function copyProperty + * @abstract Synchronized method to obtain a property from a registry entry's property table. + * @discussion This method will lookup a property in a registry entry's property table, using the OSDictionary::getObject semantics, and return a reference to the caller. This method is synchronized with other IORegistryEntry accesses to the property table. + * @param aKey The property's name as an OSString. + * @result The property value found, or zero. It should be released by the caller. */ + + virtual OSObject * copyProperty( const OSString * aKey) const; + +/*! @function copyProperty + * @abstract Synchronized method to obtain a property from a registry entry's property table. + * @discussion This method will lookup a property in a registry entry's property table, using the OSDictionary::getObject semantics, and return a reference to the caller. This method is synchronized with other IORegistryEntry accesses to the property table. + * @param aKey The property's name as a C-string. + * @result The property value found, or zero. It should be released by the caller. */ + + virtual OSObject * copyProperty( const char * aKey) const; + +/*! @function dictionaryWithProperties + * @abstract Synchronized method to obtain copy a registry entry's property table. + * @discussion This method will copy a registry entry's property table, using the OSDictionary::withDictionary semantics. This method is synchronized with other IORegistryEntry accesses to the property table. Since OSDictionary will only copy property values by reference, synchronization is not guaranteed to any collection values. + * @result The created dictionary, or zero on a resource value. It should be released by the caller. */ + + virtual OSDictionary * dictionaryWithProperties( void ) const; + +/*! @function serializeProperties + * @abstract Synchronized method to serialize a registry entry's property table. + * @discussion This method will serialize a registry entry's property table, using the OSDictionary::serialize semantics. This method is synchronized with other IORegistryEntry accesses to the property table. Many non-kernel clients of IOKit read information from the registry via properties, and will invoke this method in a registry entry to create a serialization of all the entry's properties, which is then reconstructed in the client's task as a CFDictionary. This method may be intercepted by subclasses to update their properties or implement a different serialization method, though it is usually better to implement such functionality by creating objects in the property table and implementing their serialize methods, avoiding any need to implement serializeProperties. + * @param serialize The OSSerialize instance representing the serialization request. + * @result True on success, false otherwise. */ + + virtual bool serializeProperties( OSSerialize * serialize ) const; + +/* Unsynchronized(!) property table access */ + +/*! @function getPropertyTable + * @abstract Unsynchronized accessor to a registry entry's property table. + * @discussion This method will return a pointer to the live property table as an OSDictionery. Its use is not recommended in most cases, instead use the synchronized accessors and helper functions of IORegistryEntry to access properties. It can only safely be used by one thread, which usually means it can only be used before a registry entry is entered into the registry. + * @result A pointer to the property table as an OSDictionary. The pointer is valid while the registry entry is retained, and should not be released by the caller. */ + +/* inline */ OSDictionary * getPropertyTable( void ) const; +/* { return(fPropertyTable); } */ + +/* Set properties from user level, to be overridden if supported */ + +/*! @function setProperties + * @abstract Optionally supported external method to set properties in a registry entry. + * @discussion This method is not implemented by IORegistryEntry, but is available to kernel and non-kernel clients to set properties in a registry entry. IOUserClient provides connection based, more controlled access to this functionality and may be more appropriate for many uses, since there is no differentiation between clients available to this method. + * @param properties Any OSObject subclass, to be interpreted by the implementing method - for example an OSDictionary, OSData etc. may all be appropriate. + * @result An IOReturn code to be returned to the caller. */ + + virtual IOReturn setProperties( OSObject * properties ); + +/* Topology */ + +/*! @function getParentIterator + * @abstract Returns an iterator over an registry entry's parent entries in a specified plane. + * @param plane The plane object. + * @result Returns an iterator over the parents of the registry entry, or zero if there is a resource failure. The iterator must be released when the iteration is finished. All objects returned by the iteration are retained while the iterator is valid, though they may no longer be attached during the iteration. */ + + virtual OSIterator * getParentIterator( const IORegistryPlane * plane ) + const; + virtual void applyToParents( IORegistryEntryApplierFunction applier, + void * context, + const IORegistryPlane * plane ) const; + +/*! @function getParentEntry + * @abstract Returns an registry entry's first parent entry in a plane. + * @discussion This function will return the parent to which a registry entry was first attached. Since the majority of registry entrys have only one provider, this is a useful simplification. + * @param plane The plane object. + * @result Returns the first parent of the registry entry, or zero if the entry is not attached into the registry in that plane. The parent is retained while the entry is attached, and should not be released by the caller. */ + + virtual IORegistryEntry * getParentEntry( const IORegistryPlane * plane ) const; + +/*! @function getChildIterator + * @abstract Returns an iterator over an registry entry's child entries in a plane. + * @discussion This method creates an iterator which will return each of a registry entry's child entries in a specified plane. + * @param plane The plane object. + * @result Returns an iterator over the children of the entry, or zero if there is a resource failure. The iterator must be released when the iteration is finished. All objects returned by the iteration are retained while the iterator is valid, though they may no longer be attached during the iteration. */ + + virtual OSIterator * getChildIterator( const IORegistryPlane * plane ) + const; + + + virtual void applyToChildren( IORegistryEntryApplierFunction applier, + void * context, + const IORegistryPlane * plane ) const; + +/*! @function getChildEntry + * @abstract Returns an registry entry's first child entry in a plane. + * @discussion This function will return the child which first attached to a registry entry. + * @param plane The plane object. + * @result Returns the first child of the registry entry, or zero if the entry is not attached into the registry in that plane. The child is retained while the entry is attached, and should not be released by the caller. */ + + virtual IORegistryEntry * getChildEntry( const IORegistryPlane * plane ) const; + +/*! @function isChild + * @abstract Determines whether a registry entry is the child of another in a plane. + * @discussion This method called in the parent entry determines if the specified entry is a child, in a plane. Additionally, it can check if the child is the only child of the parent entry. + * @param child The possible child registry entry. + * @param plane The plane object. + * @param onlyChild If true, check also if the child is the only child. + * @result If the child argument is not a child of the registry entry, false is returned. If onlyChild is true and the child is not the only child of the entry, false is returned, otherwise true is returned. */ + + virtual bool isChild( IORegistryEntry * child, + const IORegistryPlane * plane, + bool onlyChild = false ) const; + +/*! @function isParent + * @abstract Determines whether a registry entry is the parent of another in a plane. + * @discussion This method called in the child entry determines if the specified entry is a parent, in a plane. Additionally, it can check if the parent is the only parent of the child entry. + * @param parent The possible parent registry entry. + * @param plane The plane object. + * @param onlyParent If true, check also if the parent is the only parent. + * @result If the parent argument is not a parent of the registry entry, false is returned. If onlyParent is true and the parent is not the only parent of the entry, false is returned, otherwise true is returned. */ + + virtual bool isParent( IORegistryEntry * parent, + const IORegistryPlane * plane, + bool onlyParent = false ) const; + +/*! @function inPlane + * @abstract Determines whether a registry entry is attached in a plane. + * @discussion This method determines if the entry is attached in a plane to any other entry. It can also be used to determine if the entry is a member of any plane. + * @param plane The plane object, 0 indicates any plane. + * @result If the entry has a parent in the given plane or if plane = 0 then if entry has any parent; return true, otherwise false. */ + + virtual bool inPlane( const IORegistryPlane * plane = NULL) const; + +/*! @function getDepth + * @abstract Counts the maximum number of entries between an entry and the registry root, in a plane. + * @discussion This method counts the number of entries between and entry and the registry root, in a plane, for each parent of the entry and returns the maximum value. + * @param plane The plane object. + * @result The maximum number of entries between the entry and the root. Zero is returned if the entry is not attached in the plane. */ + + virtual unsigned int getDepth( const IORegistryPlane * plane ) const; + +/* Attach / detach */ + +/*! @function attachToParent + * @abstract Attaches a entry to a parent entry in a plane. + * @discussion This is the usual method of entering an entry into the registry. It is a no-op and success if the entry is already attached to the parent. Attaching the entry into the registry retains both the child and parent while they are attached. This method will call attachToChild in the parent entry if it is not being called from attachToChild. + * @param parent The registry entry to attach to. + * @param plane The plane object. + * @result true on success, or false on a resource failure, or if the parent is the same as the child. */ + + virtual bool attachToParent( IORegistryEntry * parent, + const IORegistryPlane * plane ); + +/*! @function detachFromParent + * @abstract Detaches an entry from a parent entry in a plane. + * @discussion This is the usual method of removing an entry from the registry. It is a no-op if the entry is not attached to the parent. Detaching the entry will release both the child and parent. This method will call detachFromChild in the parent entry if it is not being called from detachFromChild. + * @param parent The registry entry to detach from. + * @param plane The plane object. */ + + virtual void detachFromParent( IORegistryEntry * parent, + const IORegistryPlane * plane ); + +/*! @function attachToChild + * @abstract Method called in the parent entry when a child attaches. + * @discussion This method is called in the parent entry when a child attaches, to make overrides possible. This method will also call attachToParent in the child entry if it is not being called from attachToParent. It is a no-op and success if the entry is already a child. Attaching the entry into the registry retains both the child and parent while they are attached. + * @param child The registry entry being attached. + * @param plane The plane object. + * @result true on success, or false on a resource failure, or if the parent is the same as the child. */ + + virtual bool attachToChild( IORegistryEntry * child, + const IORegistryPlane * plane ); + +/*! @function detachFromChild + * @abstract Detaches a child entry from its parent in a plane. + * @discussion This method is called in the parent entry when a child detaches, to make overrides possible. It is a no-op if the entry is not a child of the parent. Detaching the entry will release both the child and parent. This method will call detachFromParent in the child entry if it is not being called from detachFromParent. + * @param child The registry entry to detach. + * @param plane The plane object. */ + + virtual void detachFromChild( IORegistryEntry * child, + const IORegistryPlane * plane ); + +/*! @function detachAbove + * @abstract Detaches an entry from all its parent entries in a plane. + * @discussion This method calls detachFromParent in the entry for each of its parent entries in the plane. + * @param plane The plane object. */ + + virtual void detachAbove( const IORegistryPlane * plane ); + +/*! @function detachAll + * @abstract Detaches an entry and all its children recursively in a plane. + * @discussion This method breaks the registry connections for a subtree. detachAbove is called in the entry, and all child entries and their children in the plane. + * @param plane The plane object. */ + + virtual void detachAll( const IORegistryPlane * plane ); + +/* Name, location and path accessors */ + +/*! @function getName + * @abstract Returns the name assigned to the registry entry as a C-string. + * @discussion Entries can be named in a particular plane, or globally. If the entry is named in plane and the plane is specified that name will be returned, otherwise the global name is returned. The global name defaults to the entry's meta class name if it has not been named. + * @param plane The plane object, or zero for the global name. + * @result A C-string name, valid while the entry is retained. */ + + virtual const char * getName( const IORegistryPlane * plane = NULL ) const; + +/*! @function copyName + * @abstract Returns the name assigned to the registry entry as an OSSymbol. + * @discussion Entries can be named in a particular plane, or globally. If the entry is named in plane and the plane is specified that name will be returned, otherwise the global name is returned. The global name defaults to the entry's meta class name if it has not been named. + * @param plane The plane object, or zero for the global name. + * @result A reference to an OSSymbol for the name, which should be released by the caller. */ + + virtual const OSSymbol * copyName( + const IORegistryPlane * plane = NULL ) const; + +/*! @function compareNames + * @abstract Compares the name of the entry with one or more names, and optionally returns the matching name. + * @discussion This method is called during IOService name matching and elsewhere to compare the entry's global name with a list of names, or a single name. A list of names may be passed as any OSCollection of OSStrings, while a single name may be passed an OSString, in the name parameter. compareNames will call the compareName method for each name, for overrides. + * @param name The name or names to compare with as any OSCollection (eg. OSArray, OSSet, OSDictionary) of OSStrings, or a single name may be passed an OSString. + * @param matched If the caller wants the successfully matched name returned, pass a non-zero pointer for the matched parameter and an OSString will be returned here. It should be released by the caller. + * @result True if one of the names compared true with the entry's global name. */ + + virtual bool compareNames( OSObject * name, OSString ** matched = NULL ) const; + +/*! @function compareName + * @abstract Compares the name of the entry with one name, and optionally returns the matching name. + * @discussion This method is called during IOService name matching and elsewhere from the compareNames method. It should be overridden to provide non-standard name matching. + * @param name The name to compare with as an OSString. + * @param matched If the caller wants the successfully matched name returned, pass a non-zero pointer for the matched parameter and an OSString will be returned here. It should be released by the caller. Generally, this will be the same as the name parameter, but may not be if wildcards are used. + * @result True if the name compared true with the entry's global name. */ + + virtual bool compareName( OSString * name, OSString ** matched = NULL ) const; + +/*! @function setName + * @abstract Sets a name for the registry entry, in a particular plane, or globally. + * @discussion Entries can be named in a particular plane, or globally. If the plane is specified the name applies only to that plane, otherwise the global name is set. The global name defaults to the entry's meta class name if it has not been named. + * @param name An OSSymbol which will be retained. + * @param plane The plane object, or zero to set the global name. */ + + virtual void setName( const OSSymbol * name, + const IORegistryPlane * plane = NULL ); + +/*! @function setName + * @abstract Sets a name for the registry entry, in a particular plane, or globally. + * @discussion Entries can be named in a particular plane, or globally. If the plane is specified the name applies only to that plane, otherwise the global name is set. The global name defaults to the entry's meta class name if it has not been named. + * @param name A const C-string name which will be copied. + * @param plane The plane object, or zero to set the global name. */ + + virtual void setName( const char * name, + const IORegistryPlane * plane = NULL ); + +/*! @function getLocation + * @abstract Returns the location string assigned to the registry entry as a C-string. + * @discussion Entries can given a location string in a particular plane, or globally. If the entry has had a location set in a plane and the plane is specified that location string will be returned, otherwise the global location string is returned. If no global location string has been set, zero is returned. + * @param plane The plane object, or zero for the global name. + * @result A C-string location string, valid while the entry is retained, or zero. */ + + virtual const char * getLocation( const IORegistryPlane * plane = NULL ) const; + +/*! @function copyLocation + * @abstract Returns the location string assigned to the registry entry as an OSSymbol. + * @discussion Entries can given a location string in a particular plane, or globally. If the entry has had a location set in a plane and the plane is specified that location string will be returned, otherwise the global location string is returned. If no global location string has been set, zero is returned. + * @param plane The plane object, or zero for the global name. + * @result A reference to an OSSymbol for the location if one exists, which should be released by the caller, or zero. */ + + virtual const OSSymbol * copyLocation( + const IORegistryPlane * plane = NULL ) const; + +/*! @function setLocation + * @abstract Sets a location string for the registry entry, in a particular plane, or globally. + * @discussion Entries can be given a location string in a particular plane, or globally. If the plane is specified the location applies only to that plane, otherwise the global location is set. The location string may be used during path lookups of registry entries, to distinguish between sibling entries with the same name. The default IORegistryEntry parsing of location strings expects a list of hex numbers separated by commas, though subclasses of IORegistryEntry might do their own parsing. + * @param location A C-string location string which will be copied, or an OSSymbol which will be retained. + * @param plane The plane object, or zero to set the global location string. */ + + virtual void setLocation( const OSSymbol * location, + const IORegistryPlane * plane = NULL ); + virtual void setLocation( const char * location, + const IORegistryPlane * plane = NULL ); + +/*! @function getPath + * @abstract Create a path for a registry entry. + * @discussion The path for a registry entry is copied to the caller's buffer. The path describes the entry's attachment in a particular plane, which must be specified. The path begins with the plane name followed by a colon, and then followed by '/' separated path components for each of the entries between the root and the registry entry. Each component is constructed with the getPathComponent method called in each entry. An alias may also exist for the entry, which are described as properties in a registry entry found at /aliases in the plane. If a property value interpreted as a path in a call to IORegistryEntry::fromPath yields the entry, then the property name is used as the entry's path. + * @param path A char buffer allocated by the caller. + * @param length An in/out parameter - the caller sets the length of the buffer available, and getPath returns the total length of the path copied to the buffer. + * @param plane The plane object. + * @result getPath will fail if the entry is not attached in the plane, or if the buffer is not large enough to contain the path. */ + + virtual bool getPath( char * path, int * length, + const IORegistryPlane * plane) const; + +/*! @function getPathComponent + * @abstract Create a path component for a registry entry. + * @discussion Each component of a path created with getPath is created with getPathComponent. The default implementation concatenates the entry's name in the the plane, with the "at" symbol and the location string of the entry in the plane if it has been set. + * @param path A char buffer allocated by the caller. + * @param length An in/out parameter - the caller sets the length of the buffer available, and getPathComponent returns the total length of the path component copied to the buffer. + * @param plane The plane object. + * @result true if the path fits into the supplied buffer or false on a overflow. */ + + virtual bool getPathComponent( char * path, int * length, + const IORegistryPlane * plane ) const; + +/*! @function fromPath + * @abstract Looks up a registry entry by path. + * @discussion This function parses paths to lookup registry entries. The path may begin with the : created by getPath, or the plane may be set by the caller. If there are characters remaining unparsed after an entry has been looked up, this may be considered an invalid lookup, or those characters may be passed back to the caller and the lookup successful. + * @param path A C-string path. + * @param plane The plane to lookup up the path, or zero, in which case the path must begin with the plane name. + * @param residualPath If the path may contain residual characters after the last path component, the residual will be copied back to the caller's residualPath buffer. If there are residual characters and no residual buffer is specified, fromPath will fail. + * @param residualLength An in/out parameter - the caller sets the length of the residual buffer available, and fromPath returns the total length of the residual path copied to the buffer. If there is no residualBuffer (residualPath = 0) then residualLength may be zero also. + * @param fromEntry The lookup will proceed rooted at this entry if non-zero, otherwise it proceeds from the root of the plane. + * @result A retained registry entry is returned on success, or zero on failure. The caller should release the entry. */ + + static IORegistryEntry * fromPath( const char * path, + const IORegistryPlane * plane = NULL, + char * residualPath = NULL, + int * residualLength = NULL, + IORegistryEntry * fromEntry = NULL ); + +/*! @function fromPath + * @abstract Looks up a registry entry by relative path. + * @discussion This function looks up a entry below the called entry by a relative path. It is just a convenience that calls IORegistryEntry::fromPath with this as the fromEntry parameter. + * @param path See IORegistryEntry::fromPath. + * @param plane See IORegistryEntry::fromPath. + * @param residualPath See IORegistryEntry::fromPath. + * @param residualLength See IORegistryEntry::fromPath. + * @result See IORegistryEntry::fromPath. */ + + virtual IORegistryEntry * childFromPath( const char * path, + const IORegistryPlane * plane = NULL, + char * residualPath = NULL, + int * residualLength = NULL ); + +/*! @function dealiasPath + * @abstract Strips any aliases from the head of path and returns the full path. + * @discussion If the path specified begins with an alias found in the /aliases entry, the value of the alias is returned, and a pointer into the passed in path after the alias is passed back to the caller. If an alias is not found, zero is returned and the path parameter is unchanged. + * @param opath An in/out paramter - the caller passes in a pointer to a C-string pointer to a path. If an alias is found, dealiasPath returns a pointer into the path just beyond the end of the alias. + * @param plane A plane object must be specified. + * @result A C-string pointer to the value of the alias if one is found, or zero if not. */ + + static const char * dealiasPath( const char ** opath, + const IORegistryPlane * plane ); + +/*! @function makePlane + * @abstract Constructs an IORegistryPlane object. + * @discussion Most planes in IOKit are created by the OS, although other planes may be created. + * @param name A C-string name for the new plane, to be copied. + * @result A new instance of an IORegistryPlane, or zero on failure. */ + + static const IORegistryPlane * makePlane( const char * name ); + +/*! @abstract Returns an ID for the registry entry that is global to all tasks. + * @discussion The entry ID returned by getRegistryEntryID can be used to identify a registry entry across all tasks. A registry entry may be looked up by its entry ID by creating a matching dictionary with IORegistryEntryIDMatching() in user space, or IOService::registryEntryIDMatching() in the kernel, to be used with the IOKit matching functions. The ID is valid only until the machine reboots. + * @result An ID for the registry entry, assigned when the entry is first attached in the registry. */ + + uint64_t getRegistryEntryID( void ); + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/* * * * * * * * * * * * internals * * * * * * * * * * * */ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + virtual bool init( IORegistryEntry * from, + const IORegistryPlane * inPlane ); + +private: + static LIBKERN_RETURNS_NOT_RETAINED IORegistryEntry * initialize( void ); + + +private: + inline bool arrayMember( OSArray * set, + const IORegistryEntry * member, + unsigned int * index = NULL ) const; + + bool makeLink( IORegistryEntry * to, + unsigned int relation, + const IORegistryPlane * plane ) const; + void breakLink( IORegistryEntry * to, + unsigned int relation, + const IORegistryPlane * plane ) const; + + APPLE_KEXT_COMPATIBILITY_VIRTUAL + OSArray * getParentSetReference( const IORegistryPlane * plane ) + const; + + APPLE_KEXT_COMPATIBILITY_VIRTUAL + OSArray * getChildSetReference( const IORegistryPlane * plane ) + const; + + APPLE_KEXT_COMPATIBILITY_VIRTUAL + IORegistryEntry * getChildFromComponent( const char ** path, + const IORegistryPlane * plane ); + + APPLE_KEXT_COMPATIBILITY_VIRTUAL + LIBKERN_RETURNS_NOT_RETAINED const OSSymbol * hasAlias( + const IORegistryPlane * plane, + char * opath = NULL, int * length = NULL ) const; + + APPLE_KEXT_COMPATIBILITY_VIRTUAL + const char * matchPathLocation( const char * cmp, + const IORegistryPlane * plane ); +}; + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*! @class IORegistryIterator : public OSIterator + * @abstract An iterator over the registry. + * @discussion An iterator that can traverse the children or parents of a registry entry in a plane, and recurse. Access to the registry is protected against multiple threads, but an IORegistryIterator instance is for use by one thread only. */ + +class IORegistryIterator : public OSIterator +{ + OSDeclareAbstractStructors(IORegistryIterator); + +private: + struct IORegCursor { + IORegCursor * next; + IORegistryEntry * current; + OSIterator * iter; + }; + IORegCursor start; + IORegCursor * where; + IORegistryEntry * root; + OSOrderedSet * done; + const IORegistryPlane * plane; + IOOptionBits options; + + virtual void free( void ) APPLE_KEXT_OVERRIDE; + +public: +/*! @function iterateOver + * @abstract Create an iterator rooted at a given registry entry. + * @discussion This method creates an IORegistryIterator that is set up with options to iterate children or parents of a root entry, and to recurse automatically into entries as they are returned, or only when instructed. The iterator object keeps track of entries that have been recursed into previously to avoid loops. + * @param start The root entry to begin the iteration at. + * @param plane A plane object must be specified. + * @param options kIORegistryIterateRecursively may be set to recurse automatically into each entry as it is returned. This option affects the behaviour of the getNextObject method, which is defined in the OSIterator superclass. Other methods will override this behaviour. kIORegistryIterateParents may be set to iterate the parents of each entry, by default the children are iterated. + * @result A created IORegistryIterator instance, to be released by the caller when it has finished with it. */ + + static IORegistryIterator * iterateOver( IORegistryEntry * start, + const IORegistryPlane * plane, + IOOptionBits options = 0 ); + +/*! @function iterateOver + * @abstract Create an iterator rooted at the registry root. + * @discussion This method creates an IORegistryIterator that is set up with options to iterate children of the registry root entry, and to recurse automatically into entries as they are returned, or only when instructed. The iterator object keeps track of entries that have been recursed into previously to avoid loops. + * @param plane A plane object must be specified. + * @param options kIORegistryIterateRecursively may be set to recurse automatically into each entry as it is returned. This option affects the behaviour of the getNextObject method, which is defined in the OSIterator superclass. Other methods will override this behaviour. kIORegistryIterateParents may be set to iterate the parents of each entry, by default the children are iterated. + * @result A created IORegistryIterator instance, to be released by the caller when it has finished with it. */ + + static IORegistryIterator * iterateOver( const IORegistryPlane * plane, + IOOptionBits options = 0 ); + +/*! @function getNextObject + * @abstract Return the next object in the registry iteration. + * @discussion This method calls either getNextObjectFlat or getNextObjectRecursive depending on the options the iterator was created with. This implements the OSIterator defined getNextObject method. The object returned is retained while the iterator is pointing at it (its the current entry), or recursing into it. The caller should not release it. + * @result The next registry entry in the iteration (the current entry), or zero if the iteration has finished at this level of recursion. The entry returned is retained while the iterator is pointing at it (its the current entry), or recursing into it. The caller should not release it. */ + + virtual IORegistryEntry * getNextObject( void ) APPLE_KEXT_OVERRIDE; + +/*! @function getNextObjectFlat + * @abstract Return the next object in the registry iteration, ignoring the kIORegistryIterateRecursively option. + * @discussion This method returns the next child, or parent if the kIORegistryIterateParents option was used to create the iterator, of the current root entry. The object returned is retained while the iterator is pointing at it (its the current entry), or recursing into it. The caller should not release it. + * @result The next registry entry in the iteration (the current entry), or zero if the iteration has finished at this level of recursion, or the iteration is invalid (see isValid). The entry returned is retained while the iterator is pointing at it (its the current entry), or recursing into it. The caller should not release it. */ + + virtual IORegistryEntry * getNextObjectFlat( void ); + +/*! @function getNextObjectRecursive + * @abstract Return the next object in the registry iteration, and enter it. + * @discussion If the iterator has a current entry, and the iterator has not already entered previously, enterEntry is called to recurse into it, ie. make it the new root, and the next child, or parent if the kIORegistryIterateParents option was used to create the iterator, at this new level of recursion is returned. If there is no current entry at this level of recursion, exitEntry is called and the process repeats, until the iteration returns to the entry the iterator was created with and zero is returned. The object returned is retained while the iterator is pointing at it (its the current entry), or recursing into it. The caller should not release it. + * @result The next registry entry in the iteration (the current entry), or zero if its finished, or the iteration is invalid (see isValid). The entry returned is retained while the iterator is pointing at it (its the current entry), or recursing into it. The caller should not release it. */ + + virtual IORegistryEntry * getNextObjectRecursive( void ); + +/*! @function getCurrentEntry + * @abstract Return the current entry in the registry iteration. + * @discussion This method returns the current entry, last returned by getNextObject et al. The object returned is retained while the iterator is pointing at it (its the current entry), or recursing into it. The caller should not release it. If the iteration is no longer valid (see isValid), the current entry is zero. + * @result The current registry entry in the iteration, or zero if the last iteration returned zero, or the iteration is invalid (see isValid). The entry returned is retained while the iterator is pointing at it (its the current entry), or recursing into it. The caller should not release it. */ + + virtual IORegistryEntry * getCurrentEntry( void ); + +/*! @function enterEntry + * @abstract Recurse into the current entry in the registry iteration. + * @discussion This method makes the current entry, ie. the last entry returned by getNextObject et al., the root in a new level of recursion. */ + + virtual void enterEntry( void ); + +/*! @function enterEntry + * @abstract Recurse into the current entry in the registry iteration. + * @discussion This method recurses into an entry as with enterEntry, but also switches from the current plane to a new one set by the caller. + * @param plane The new plane to switch into. */ + + virtual void enterEntry( const IORegistryPlane * plane ); + +/*! @function exitEntry + * @abstract Exits a level of recursion, restoring the current entry. + * @discussion This method undoes an enterEntry, restoring the current entry. If there are no more levels of recursion to exit false is returned, otherwise true is returned. + * @result true if a level of recursion was undone, false if no recursive levels are left in the iteration. */ + + virtual bool exitEntry( void ); + +/*! @function reset + * @abstract Exits all levels of recursion, restoring the iterator to its state at creation. + * @discussion This method exits all levels of recursion, and restores the iterator to its state at creation. */ + + virtual void reset( void ) APPLE_KEXT_OVERRIDE; + +/*! @function isValid + * @abstract Checks that no registry changes have invalidated the iteration. + * @discussion If a registry iteration is invalidated by changes to the registry, it will be made invalid, the currentEntry will be considered zero, and further calls to getNextObject et al. will return zero. The iterator should be reset to restart the iteration when this happens. + * @result false if the iterator has been invalidated by changes to the registry, true otherwise. */ + + virtual bool isValid( void ) APPLE_KEXT_OVERRIDE; + +/*! @function iterateAll + * @abstract Iterates all entries (with getNextObject) and returns a set of all returned entries. + * @discussion This method will reset, then iterate all entries in the iteration (with getNextObject). + * @result A set of entries returned by the iteration. The caller should release the set when it has finished with it. Zero is returned on a resource failure. */ + + virtual OSOrderedSet * iterateAll( void ); +}; + +#endif /* _IOKIT_IOREGISTRYENTRY_H */ diff --git a/QualcommWireless/include/IOKit/IOReportHub.h b/QualcommWireless/include/IOKit/IOReportHub.h new file mode 100644 index 0000000..7cbbd5b --- /dev/null +++ b/QualcommWireless/include/IOKit/IOReportHub.h @@ -0,0 +1,54 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOKIT_IOREPORTHUB_H +#define _IOKIT_IOREPORTHUB_H + +#include +#include + +extern IOReturn _getInterests(OSDictionary *, OSArray **, OSArray **, OSArray **); +extern IOReturn _copyServiceGetChannels(OSArray *, OSArray *, OSArray *, UInt32, IOService **, IOReportChannelList **, OSNumber **); + +class IOReportHub : public IOService +{ + OSDeclareDefaultStructors(IOReportHub) + +public: + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual IOReturn getReportBufferSize( OSDictionary * dict, int * size ); + virtual IOReturn getValues( OSDictionary * dict, IOBufferMemoryDescriptor * buffer ); + IOReturn callConfigureReport(OSDictionary *, UInt32, int *); +}; + +#endif diff --git a/QualcommWireless/include/IOKit/IOReportMacros.h b/QualcommWireless/include/IOKit/IOReportMacros.h new file mode 100644 index 0000000..db8e8ae --- /dev/null +++ b/QualcommWireless/include/IOKit/IOReportMacros.h @@ -0,0 +1,705 @@ +/* + * Copyright (c) 2012-2014 Apple Computer, Inc. All Rights Reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef _IOREPORT_MACROS_H_ +#define _IOREPORT_MACROS_H_ + +#include "IOReportTypes.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef IOREPORT_ABORT +#define IOREPORT_ABORT panic +#endif + +/* + * Background + * + * These macros allow non-I/O Kit software to generate IOReporting + * reports. Clients must prevent concurrent access to any given + * report buffer from multiple threads. + * + * While these macros allow non-I/O Kit software to participate + * in IOReporting, an IOService instance must lend its driver ID, + * respond to the appropriate IOService overrides, and shuttle + * data back and forth. In some cases, it may be useful to have + * the I/O Kit driver initialize the report buffer with the + * appropriate macro. + */ + + +/* ----- Reporting Single Integers (SimpleReport) ----- */ + +/* + * The buffer size required for a SimpleReport. + */ + +#define SIMPLEREPORT_BUFSIZE (sizeof(IOReportElement)) + + +/* + * Initialize a buffer to hold a SimpleReport. + * + * void* buffer - ptr to SIMPLEREPORT_BUFSIZE bytes + * size_t bufSize - sanity check of buffer's size + * uint64_t providerID - registry Entry ID of the reporting service + * uint64_t channelID - the report's channel ID + * IOReportCategories categories - categories of this channel + * + * If the buffer is not of sufficient size, the macro calls IOREPORT_ABORT(). + * If that returns, the buffer is left full of '&'. + */ + +#define SIMPLEREPORT_INIT(buf, bufSize, providerID, channelID, cats) \ +do { \ + memset((buf), '&', (bufSize)); \ + IOReportElement *__elem = (IOReportElement *)(buf); \ + IOSimpleReportValues *__vals; \ + if ((bufSize) >= SIMPLEREPORT_BUFSIZE) { \ + __elem->provider_id = (providerID); \ + __elem->channel_id = (channelID); \ + __elem->channel_type.report_format = kIOReportFormatSimple; \ + __elem->channel_type.reserved = 0; \ + __elem->channel_type.categories = (cats); \ + __elem->channel_type.nelements = 1; \ + __elem->channel_type.element_idx = 0; \ + __elem->timestamp = 0; \ + __vals = (IOSimpleReportValues*)&__elem->values; \ + __vals->simple_value = kIOReportInvalidIntValue; \ + } \ + else { \ + IOREPORT_ABORT("bufSize is smaller than the required size\n"); \ + } \ +} while(0) + + +/* + * Set a SimpleReport to a new value. + * + * void* simp_buf - ptr to memory initialized by SIMPLEREPORT_INIT() + * int64_t new_value - new value for the report + */ + +#define SIMPLEREPORT_SETVALUE(simp_buf, new_value) \ +do { \ + IOReportElement *__elem = (IOReportElement *)(simp_buf); \ + IOSimpleReportValues *__vals; \ + __vals = (IOSimpleReportValues*)&__elem->values; \ + __vals->simple_value = (new_value); \ +} while(0) + + +/* + * Increment the value of a SimpleReport. + * + * void* simp_buf - ptr to memory initialized by SIMPLEREPORT_INIT() + * int64_t increment - amount by which to increment the value + */ +#define SIMPLEREPORT_INCREMENTVALUE(simp_buf, new_value) \ +do { \ + IOReportElement *__elem = (IOReportElement *)(simp_buf); \ + IOSimpleReportValues *__vals; \ + __vals = (IOSimpleReportValues*)&__elem->values; \ + __vals->simple_value += (new_value); \ +} while(0) + + +/* + * Prepare a SimpleReport for + * IOService::updateReport(kIOReportCopyChannelData...) + * + * void* simp_buf - Ptr to memory updated by SIMPLEREPORT_SETVALUE() + * void* ptr2cpy - On return, 'ptr2cpy' points to the memory that needs to be + * copied for kIOReportCopyChannelData. + * size_t size2cpy - On return, 'size2cpy' is set to the size of the report + * data that needs to be copied for kIOReportCopyChannelData. + */ + +#define SIMPLEREPORT_UPDATEPREP(simp_buf, ptr2cpy, size2cpy) \ +do { \ + (ptr2cpy) = (simp_buf); \ + (size2cpy) = sizeof(IOReportElement); \ +} while(0) + + +/* + * Update the result field received as a parameter for + * kIOReportGetDimensions & kIOReportCopyChannelData actions. + * + * IOReportConfigureAction action - configure/updateReport() 'action' param + * void* result - configure/updateReport() 'result' param + */ + +#define SIMPLEREPORT_UPDATERES(action, result) \ +do { \ + if (((action) == kIOReportGetDimensions) || ((action) == kIOReportCopyChannelData)) { \ + int *__nElements = (int *)(result); \ + *__nElements += 1; \ + } \ +} while (0) + + +/* + * Get the 64-bit channel ID of a SimpleReport. + * + * void* simp_buf - ptr to memory initialized by SIMPLEREPORT_INIT() + */ + +#define SIMPLEREPORT_GETCHID(simp_buf) \ + (((IOReportElement *)(simp_buf))->channel_id) + +/* + * Get the IOReportChannelType of a SimpleReport. + * + * void* simp_buf - ptr to memory initialized by SIMPLEREPORT_INIT() + */ + +#define SIMPLEREPORT_GETCHTYPE(simp_buf) \ + (*(uint64_t*)&(((IOReportElement *)(simp_buf))->channel_type)) + + +/* + * Get the integer value of a SimpleReport. + * + * void* simp_buf - memory initialized by SIMPLEREPORT_INIT() + */ + +#define SIMPLEREPORT_GETVALUE(simp_buf) \ + (((IOSimpleReportValues*)&(((IOReportElement*)(simp_buf))->values)) \ + ->simple_value) + + +/* ----- State Machine Reporting (StateReport) ----- */ + +// Internal struct for StateReport +typedef struct { + uint16_t curr_state; + uint64_t update_ts; + IOReportElement elem[]; // Array of elements +} IOStateReportInfo; + +/* + * Determine the size required for a StateReport buffer. + * + * int nstates - number of states to be reported + */ +#define STATEREPORT_BUFSIZE(nstates) \ + (sizeof(IOStateReportInfo) + (nstates) * sizeof(IOReportElement)) + + +/* + * Initialize a StateReport buffer. + * + * int nstates - number of states to be reported + * void* buffer - ptr to STATEREPORT_BUFSIZE(nstates) bytes + * size_t bufSize - sanity check of buffer's size + * uint64_t providerID - registry Entry ID of the reporting service + * uint64_t channelID - ID of this channel, see IOREPORT_MAKEID() + * IOReportCategories categories - categories of this channel + * + * If the buffer is not of sufficient size, the macro invokes IOREPORT_ABORT. + * If that returns, the buffer is left full of '&'. + */ +#define STATEREPORT_INIT(nstates, buf, bufSize, providerID, channelID, cats) \ +do { \ + memset((buf), '&', (bufSize)); \ + IOStateReportInfo *__info = (IOStateReportInfo *)(buf); \ + IOStateReportValues *__rep; \ + IOReportElement *__elem; \ + if ((bufSize) >= STATEREPORT_BUFSIZE(nstates)) { \ + for (unsigned __no = 0; __no < (nstates); __no++) { \ + __elem = &(__info->elem[__no]); \ + __rep = (IOStateReportValues *) &(__elem->values); \ + __elem->provider_id = (providerID); \ + __elem->channel_id = (channelID); \ + __elem->channel_type.report_format = kIOReportFormatState; \ + __elem->channel_type.reserved = 0; \ + __elem->channel_type.categories = (cats); \ + __elem->channel_type.nelements = (nstates); \ + __elem->channel_type.element_idx = __no; \ + __elem->timestamp = 0; \ + __rep->state_id = __no; \ + __rep->intransitions = 0; \ + __rep->upticks = 0; \ + __rep->last_intransition = 0; \ + } \ + __info->curr_state = 0; \ + __info->update_ts = 0; \ + } \ + else { \ + IOREPORT_ABORT("bufSize is smaller than the required size\n"); \ + } \ +} while(0) + +/* + * Initialize the state id field of a state with the specified value. By + * default, STATEREPORT_INIT() initializes the state IDs with the index of + * that state. This macro can be used to provide a more descriptive state id. + * + * void* state_buf - ptr to memory initialized by STATEREPORT_INIT() + * unsigned stateIdx - index of the state, out of bounds -> no-op + * uint64_t stateID - new state id, see IOREPORT_MAKEID() + */ +#define STATEREPORT_SETSTATEID(state_buf, stateIdx, stateID) \ +do { \ + IOStateReportInfo *__info = (IOStateReportInfo *)(state_buf); \ + IOStateReportValues *__rep; \ + if ((stateIdx) < __info->elem[0].channel_type.nelements) { \ + __rep = (IOStateReportValues*) &(__info->elem[(stateIdx)].values); \ + __rep->state_id = (stateID); \ + } \ +} while (0) + + +/* + * Set the state of a StateReport. + * + * void* state_buf - pointer to memory initialized by STATEREPORT_INIT() + * unsigned newStateIdx - index of new state, out of bounds -> no-op + * uint64_t changeTime - time at which the transition occurred + */ +#define STATEREPORT_SETSTATE(state_buf, newStateIdx, changeTime) \ +do { \ + IOStateReportInfo *__info = (IOStateReportInfo *)(state_buf); \ + IOStateReportValues *__rep; \ + if ((newStateIdx) < __info->elem[0].channel_type.nelements ) { \ + __rep = (IOStateReportValues*) &(__info->elem[__info->curr_state].values); \ + if (__info->update_ts) \ + __rep->upticks += (changeTime) - __info->update_ts; \ + __info->elem[(newStateIdx)].timestamp = (changeTime); \ + __rep = (IOStateReportValues*) &(__info->elem[(newStateIdx)].values); \ + __rep->intransitions++; \ + __info->curr_state = (newStateIdx); \ + __info->update_ts = (changeTime); \ + } \ +} while(0) + +/* + * Prepare a StateReport for + * IOService::updateReport(kIOReportCopyChannelData...) + * + * void* state_buf - ptr to memory initialized by STATEREPORT_INIT() + * uint64_t currentTime - current timestamp + * void* ptr2cpy - filled in with pointer to buffer to be copied out + * size_t size2cpy - filled in with the size of the buffer to copy out + */ +#define STATEREPORT_UPDATEPREP(state_buf, currentTime, ptr2cpy, size2cpy) \ +do { \ + IOStateReportInfo *__info = (IOStateReportInfo *)(state_buf); \ + IOReportElement *__elem; \ + IOStateReportValues *__state; \ + (size2cpy) = __info->elem[0].channel_type.nelements * sizeof(IOReportElement); \ + (ptr2cpy) = (void *) &__info->elem[0]; \ + if (__info->update_ts) { \ + __elem = &__info->elem[__info->curr_state]; \ + __state = (IOStateReportValues *)&__elem->values; \ + __elem->timestamp = (currentTime); \ + __state->upticks += (currentTime) - __info->update_ts; \ + __info->update_ts = (currentTime); \ + } \ +} while(0) + +/* + * Update the result field received as a parameter for kIOReportGetDimensions & + * kIOReportCopyChannelData actions. + * + * void* state_buf - memory initialized by STATEREPORT_INIT() + * IOReportConfigureAction action - configure/updateReport() 'action' + * void* result - configure/updateReport() 'result' + */ + +#define STATEREPORT_UPDATERES(state_buf, action, result) \ +do { \ + IOStateReportInfo *__info = (IOStateReportInfo *)(state_buf); \ + IOReportElement *__elem; \ + int *__nElements = (int *)(result); \ + if (((action) == kIOReportGetDimensions) || ((action) == kIOReportCopyChannelData)) { \ + __elem = &(__info->elem[0]); \ + *__nElements += __elem->channel_type.nelements; \ + } \ +} while (0) + + +/* + * Get the 64-bit channel ID of a StateReport. + * + * void* state_buf - ptr to memory initialized by STATEREPORT_INIT() + */ +#define STATEREPORT_GETCHID(state_buf) \ + (((IOStateReportInfo *)(state_buf))->elem[0].channel_id) + +/* + * Get the IOReportChannelType of a StateReport. + * + * void* state_buf - ptr to memory initialized by STATEREPORT_INIT() + */ +#define STATEREPORT_GETCHTYPE(state_buf) \ + (*(uint64_t*)&(((IOStateReportInfo *)(state_buf))->elem[0].channel_type)) + +/* + * Get the number of transitions into a given state. + * + * void* state_buf - ptr to memory initialized by STATEREPORT_INIT() + * unsigned stateIdx - index of state, out of bounds -> kIOReportInvalidValue + * + */ +#define STATEREPORT_GETTRANSITIONS(state_buf, stateIdx) \ + (((stateIdx) < ((IOStateReportInfo *)(state_buf))->elem[0].channel_type.nelements) \ + ? ((IOStateReportValues*)&(((IOStateReportInfo*)(state_buf))->elem[(stateIdx)].values))->intransitions \ + : kIOReportInvalidValue) + +/* + * Get the total number of ticks spent in a given state. + * + * void* state_buf - ptr to memory initialized by STATEREPORT_INIT() + * unsigned stateIdx - index of state, out of bounds -> kIOReportInvalidValue + */ +#define STATEREPORT_GETTICKS(state_buf, stateIdx) \ + (((stateIdx) < ((IOStateReportInfo*)(state_buf))->elem[0].channel_type.nelements) \ + ? ((IOStateReportValues*)&(((IOStateReportInfo*)(state_buf))->elem[(stateIdx)].values))->upticks \ + : kIOReportInvalidValue) + + +/* ----- Reporting an Array of Integers (SimpleArrayReport) ----- */ + +/* + * Determine the buffer size for a SimpleArrayReport. + * + * int nValues - number of values to be reported + */ + +#define SIMPLEARRAY_BUFSIZE(nValues) \ + ((((nValues)/IOR_VALUES_PER_ELEMENT) + (((nValues) % IOR_VALUES_PER_ELEMENT) ? 1:0)) \ + * sizeof(IOReportElement)) + +/* + * Initialize a buffer for use as a SimpleArrayReport. + * + * int nValues - number of elements to be reported + * void* buf - ptr to SIMPLEARRAY_BUFSIZE(nValues) bytes + * size_t bufSize - sanity check of buffer's size + * uint64_t providerID - registry Entry ID of the reporting service + * uint64_t channelID - ID of this channel, see IOREPORT_MAKEID() + * IOReportCategories categories - categories of this channel + * + * If the buffer is not of sufficient size, the macro invokes IOREPORT_ABORT(). + * If that returns, the buffer is left full of '&'. + */ + +#define SIMPLEARRAY_INIT(nValues, buf, bufSize, providerID, channelID, cats) \ +do { \ + memset((buf), '&', (bufSize)); \ + IOSimpleArrayReportValues *__rep; \ + IOReportElement *__elem; \ + uint32_t __nElems = (((nValues) / IOR_VALUES_PER_ELEMENT) + \ + (((nValues) % IOR_VALUES_PER_ELEMENT) ? 1 : 0)); \ + if ((bufSize) >= SIMPLEARRAY_BUFSIZE(nValues)) { \ + for (unsigned __no = 0; __no < __nElems; __no++) { \ + __elem = &(((IOReportElement *)(buf))[__no]); \ + __rep = (IOSimpleArrayReportValues *) &(__elem->values); \ + __elem->provider_id = (providerID); \ + __elem->channel_id = (channelID); \ + __elem->channel_type.report_format = kIOReportFormatSimpleArray; \ + __elem->channel_type.reserved = 0; \ + __elem->channel_type.categories = (cats); \ + __elem->channel_type.nelements = (__nElems); \ + __elem->channel_type.element_idx = __no; \ + __elem->timestamp = 0; \ + __rep->simple_values[0] = kIOReportInvalidIntValue; \ + __rep->simple_values[1] = kIOReportInvalidIntValue; \ + __rep->simple_values[2] = kIOReportInvalidIntValue; \ + __rep->simple_values[3] = kIOReportInvalidIntValue; \ + } \ + } \ + else { \ + IOREPORT_ABORT("bufSize is smaller than the required size\n"); \ + } \ +} while(0) + + +/* SimpleArrayReport helpers */ + + #define __SA_FINDREP(array_buf, idx) \ + IOSimpleArrayReportValues *__rep; \ + IOReportElement *__elem; \ + unsigned __elemIdx = (idx) / IOR_VALUES_PER_ELEMENT; \ + unsigned __valueIdx = (idx) % IOR_VALUES_PER_ELEMENT; \ + __elem = &(((IOReportElement *)(array_buf))[0]); \ + if (__elemIdx < __elem->channel_type.nelements) { \ + __elem = &(((IOReportElement *)(array_buf))[__elemIdx]); \ + __rep = (IOSimpleArrayReportValues *) &(__elem->values); \ + + #define __SA_MAXINDEX(array_buf) \ + ((((IOReportElement*)(array_buf))->channel_type.nelements) \ + * IOR_VALUES_PER_ELEMENT) - 1 + +/* + * Set a value at a specified index in a SimpleArrayReport. + * + * void* array_bufbuf - ptr to memory initialized by SIMPLEARRAY_INIT() + * unsigned idx - array index, out of bounds -> no-op + * uint64_t newValue - new value to be stored at array[idx] + */ +#define SIMPLEARRAY_SETVALUE(array_buf, idx, newValue) \ +do { \ + __SA_FINDREP((array_buf), (idx)) \ + __rep->simple_values[__valueIdx] = (newValue); \ + } \ +} while(0) + +/* + * Increment an array value within a SimpleArrayReport. + * + * void* array_buf - ptr to memory initialized by SIMPLEARRAY_INIT() + * unsigned idx - array index to increment, out of bounds -> no-op + * int64_t value - amount by which to increment array[idx] + */ +#define SIMPLEARRAY_INCREMENTVALUE(array_buf, idx, value) \ +do { \ + __SA_FINDREP((array_buf), (idx)) \ + __rep->simple_values[__valueIdx] += (value); \ + } \ +} while(0) + + +/* + * Prepare a SimpleArrayReport for + * IOService::updateReport(kIOReportCopyChannelData...) + * + * void* array_buf - ptr to memory initialized by SIMPLEARRAY_INIT() + * void* ptr2cpy - filled in with pointer to buffer to be copied out + * size_t size2cpy - filled in with the size of the buffer to copy out + */ + +#define SIMPLEARRAY_UPDATEPREP(array_buf, ptr2cpy, size2cpy) \ +do { \ + IOReportElement *__elem; \ + __elem = &(((IOReportElement *)(array_buf))[0]); \ + (ptr2cpy) = (void *) (array_buf); \ + (size2cpy) = __elem->channel_type.nelements * sizeof(IOReportElement); \ +} while(0) + + +/* + * Update the result field received as a parameter for kIOReportGetDimensions & + * kIOReportCopyChannelData actions. + * + * void* array_buf - memory initialized by SIMPLEARRAY_INIT() + * IOReportConfigureAction action - configure/updateReport() 'action' + * void* result - configure/updateReport() 'result' + */ + +#define SIMPLEARRAY_UPDATERES(array_buf, action, result) \ +do { \ + IOReportElement *__elem; \ + int *__nElements = (int *)(result); \ + __elem = &(((IOReportElement *)(array_buf))[0]); \ + if (((action) == kIOReportGetDimensions) || ((action) == kIOReportCopyChannelData)) { \ + *__nElements += __elem->channel_type.nelements; \ + } \ +} while (0) + + +/* + * Get the 64-bit channel ID of a SimpleArrayReport. + * + * void* array_buf - ptr to memory initialized by SIMPLEARRAY_INIT() + */ +#define SIMPLEARRAY_GETCHID(array_buf) \ + (((IOReportElement *)(array_buf))->channel_id) + + +/* + * Get the IOReportChannelType of a SimpleArrayReport. + * + * void* simp_buf - ptr to memory initialized by SIMPLEREPORT_INIT() + */ +#define SIMPLEARRAY_GETCHTYPE(array_buf) \ + (*(uint64_t*)&(((IOReportElement *)(array_buf))->channel_type)) + +/* + * Get a value from a SimpleArrayReport. + * + * void* array_buf - ptr to memory initialized by SIMPLEARRAY_INIT() + * unsigned idx - index of the value, out of bounds -> kIOReportInvalidValue + */ +#define SIMPLEARRAY_GETVALUE(array_buf, idx) \ + (((idx) > __SA_MAXINDEX(array_buf) || (idx) < 0) ? kIOReportInvalidIntValue : \ + ((IOSimpleArrayReportValues*)&( \ + ((IOReportElement*)(array_buf))[(idx) / IOR_VALUES_PER_ELEMENT].values)) \ + ->simple_values[(idx) % IOR_VALUES_PER_ELEMENT]) + + +/* ----- Histogram Reporting (HistogramReport) ----- */ + +// Internal struct for HistogramReport +typedef struct { + int bucketWidth; + IOReportElement elem[]; // Array of elements +} IOHistReportInfo; + +/* + * Determine the size required for a HistogramReport buffer. + * + * int nbuckets - number of buckets in the histogram + */ +#define HISTREPORT_BUFSIZE(nbuckets) \ + (sizeof(IOHistReportInfo) + ((nbuckets) * sizeof(IOReportElement))) + +/* + * Initialize a HistogramReport buffer. Supports only linear scale histogram. + * + * int nbuckets - number of buckets data is combined into + * uint32_t bucketWidth - size of each bucket + * void* buffer - ptr to HISTREPORT_BUFSIZE(nbuckets) bytes + * size_t bufSize - sanity check of buffer's size + * uint64_t providerID - registry Entry ID of the reporting service + * uint64_t channelID - ID of this channel, see IOREPORT_MAKEID() + * IOReportCategories categories - categories of this channel + * + * If the buffer is not of sufficient size, the macro invokes IOREPORT_ABORT. + * If that returns, the buffer is left full of '&'. + */ +#define HISTREPORT_INIT(nbuckets, bktSize, buf, bufSize, providerID, channelID, cats) \ +do { \ + memset((buf), '&', (bufSize)); \ + IOHistReportInfo *__info = (IOHistReportInfo *)(buf); \ + IOReportElement *__elem; \ + IOHistogramReportValues *__rep; \ + if ((bufSize) >= HISTREPORT_BUFSIZE(nbuckets)) { \ + __info->bucketWidth = (bktSize); \ + for (unsigned __no = 0; __no < (nbuckets); __no++) { \ + __elem = &(__info->elem[__no]); \ + __rep = (IOHistogramReportValues *) &(__elem->values); \ + __elem->provider_id = (providerID); \ + __elem->channel_id = (channelID); \ + __elem->channel_type.report_format = kIOReportFormatHistogram; \ + __elem->channel_type.reserved = 0; \ + __elem->channel_type.categories = (cats); \ + __elem->channel_type.nelements = (nbuckets); \ + __elem->channel_type.element_idx = __no; \ + __elem->timestamp = 0; \ + memset(__rep, '\0', sizeof(IOHistogramReportValues)); \ + } \ + } \ + else { \ + IOREPORT_ABORT("bufSize is smaller than the required size\n"); \ + } \ +} while (0) + +/* + * Update histogram with a new value. + * + * + * void* hist_buf - pointer to memory initialized by HISTREPORT_INIT() + * int64_t value - new value to add to the histogram + */ +#define HISTREPORT_TALLYVALUE(hist_buf, value) \ +do { \ + IOHistReportInfo *__info = (IOHistReportInfo *)(hist_buf); \ + IOReportElement *__elem; \ + IOHistogramReportValues *__rep; \ + for (unsigned __no = 0; __no < __info->elem[0].channel_type.nelements; __no++) { \ + if ((value) <= __info->bucketWidth * (__no+1)) { \ + __elem = &(__info->elem[__no]); \ + __rep = (IOHistogramReportValues *) &(__elem->values); \ + if (__rep->bucket_hits == 0) { \ + __rep->bucket_min = __rep->bucket_max = (value); \ + } \ + else if ((value) < __rep->bucket_min) { \ + __rep->bucket_min = (value); \ + } \ + else if ((value) > __rep->bucket_max) { \ + __rep->bucket_max = (value); \ + } \ + __rep->bucket_sum += (value); \ + __rep->bucket_hits++; \ + break; \ + } \ + } \ +} while (0) + +/* + * Prepare a HistogramReport for + * IOService::updateReport(kIOReportCopyChannelData...) + * + * void* array_buf - ptr to memory initialized by HISTREPORT_INIT() + * void* ptr2cpy - filled in with pointer to buffer to be copied out + * size_t size2cpy - filled in with the size of the buffer to copy out + */ + +#define HISTREPORT_UPDATEPREP(hist_buf, ptr2cpy, size2cpy) \ +do { \ + IOHistReportInfo *__info = (IOHistReportInfo *)(hist_buf); \ + (size2cpy) = __info->elem[0].channel_type.nelements * sizeof(IOReportElement); \ + (ptr2cpy) = (void *) &__info->elem[0]; \ +} while(0) + + +/* + * Update the result field received as a parameter for kIOReportGetDimensions & + * kIOReportCopyChannelData actions. + * + * void* array_buf - memory initialized by HISTREPORT_INIT() + * IOReportConfigureAction action - configure/updateReport() 'action' + * void* result - configure/updateReport() 'result' + */ + +#define HISTREPORT_UPDATERES(hist_buf, action, result) \ +do { \ + IOHistReportInfo *__info = (IOHistReportInfo *)(hist_buf); \ + int *__nElements = (int *)(result); \ + if (((action) == kIOReportGetDimensions) || ((action) == kIOReportCopyChannelData)) { \ + *__nElements += __info->elem[0].channel_type.nelements; \ + } \ +} while (0) + +/* + * Get the 64-bit channel ID of a HistogramReport. + * + * void* hist_buf - ptr to memory initialized by HISTREPORT_INIT() + */ +#define HISTREPORT_GETCHID(hist_buf) \ + (((IOHistReportInfo *)(hist_buf))->elem[0].channel_id) + +/* + * Get the IOReportChannelType of a HistogramReport. + * + * void* hist_buf - ptr to memory initialized by HISTREPORT_INIT() + */ +#define HISTREPORT_GETCHTYPE(hist_buf) \ + (*(uint64_t*)&(((IOHistReportInfo *)(hist_buf))->elem[0].channel_type)) + +#ifdef __cplusplus +} +#endif + +#endif // _IOREPORT_MACROS_H_ diff --git a/QualcommWireless/include/IOKit/IOReportTypes.h b/QualcommWireless/include/IOKit/IOReportTypes.h new file mode 100644 index 0000000..dd81759 --- /dev/null +++ b/QualcommWireless/include/IOKit/IOReportTypes.h @@ -0,0 +1,411 @@ +/* + * Copyright (c) 2012-2014 Apple Computer, Inc. All Rights Reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef _IOREPORT_TYPES_H_ +#define _IOREPORT_TYPES_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define IOR_VALUES_PER_ELEMENT 4 + +/*! @const kIOReportInvalidValue + * @const kIOReportInvalidIntValue + * @abstract cardinal value used to indicate data errors + * + * @discussion + * kIOReportInvalidValue and kIOReportInvalidIntValue have the + * same bit pattern so that clients checking for one or the other + * don't have to worry about getting the signedness right. + */ +#define kIOReportInvalidIntValue INT64_MIN +#define kIOReportInvalidValue (uint64_t)kIOReportInvalidIntValue + +/*! @typedef IOReportCategories + * @abstract encapsulate important, multi-purpose "tags" for channels + * + * @discussion + * IOReportCategories is the type for the .categories field of + * IOReportChanelType. These categories are inteded to empower a + * limited number of clients to retrieve a broad range of channels + * without knowing much about them. They can be OR'd together as + * needed. Groups and subgroups are a more extensible mechanism + * for aggregating channels produced by different drivers. + */ +typedef uint16_t IOReportCategories; +#define kIOReportCategoryPower (1 << 1) // and energy +#define kIOReportCategoryTraffic (1 << 2) // I/O at any level +#define kIOReportCategoryPerformance (1 << 3) // e.g. cycles/byte +#define kIOReportCategoryPeripheral (1 << 4) // not built-in + +#define kIOReportCategoryField (1 << 8) // consider logging + +// future categories TBD +#define kIOReportCategoryDebug (1 << 15) +#define kIOReportInvalidCategory UINT16_MAX + + +// IOReportChannelType.report_format +typedef uint8_t IOReportFormat; +enum { + kIOReportInvalidFormat = 0, + kIOReportFormatSimple = 1, + kIOReportFormatState = 2, + kIOReportFormatHistogram = 3, + kIOReportFormatSimpleArray = 4 +}; + +// simple report values +typedef struct { + int64_t simple_value; + uint64_t reserved1; + uint64_t reserved2; + uint64_t reserved3; +} __attribute((packed)) IOSimpleReportValues; + +// simple value array +typedef struct { + int64_t simple_values[IOR_VALUES_PER_ELEMENT]; +} __attribute((packed)) IOSimpleArrayReportValues; + +// state report values +typedef struct { + uint64_t state_id; // 0..N-1 or 8-char code (see MAKEID()) + uint64_t intransitions; // number of transitions into this state + uint64_t upticks; // ticks spent in state (local timebase) + uint64_t last_intransition;// ticks at last in-transition +} __attribute((packed)) IOStateReportValues; + +// histogram report values +typedef struct { + uint64_t bucket_hits; + int64_t bucket_min; + int64_t bucket_max; + int64_t bucket_sum; +} __attribute((packed)) IOHistogramReportValues; + + + +// configuration actions generally change future behavior +typedef uint32_t IOReportConfigureAction; +enum { + // basics (in common operational order) + kIOReportEnable = 0x01, + kIOReportGetDimensions = 0x02, + kIOReportDisable = 0x00, + + // Enable/disable modifiers + kIOReportNotifyHubOnChange = 0x10, // triggered polling + + kIOReportTraceOnChange = 0x20 // kdebug.h tracing +}; + +// update actions should not have observable side effects +typedef uint32_t IOReportUpdateAction; +enum { + kIOReportCopyChannelData = 1, + kIOReportTraceChannelData = 2 +}; + +typedef struct { + uint8_t report_format; // Histogram, StateResidency, etc. + uint8_t reserved; // must be zero + uint16_t categories; // power, traffic, etc (omnibus obs.) + uint16_t nelements; // internal size of channel + + // only meaningful in the data pipeline + int16_t element_idx; // 0..nelements-1 + // -1..-(nelements) = invalid (13127884) +} __attribute((packed)) IOReportChannelType; + +/*! + * @define IOREPORT_MAKECHID + * @abstract convert up to 8 printable characters into a 64-bit channel ID + * @param - printable chars to be packed into a channel ID + * @result a 64-bit channel ID with an implicit ASCII name + * @discussion A simple example: + * IOREPORT_MAKECHID('H', 'i', ' ', 'w', 'o', 'r', 'l', 'd'); + * will evaluate to 0x686920776f726c64. Any NUL bytes are + * ignored (by libIOReport) for naming purposes, but will + * appear in the channel ID. Using a non-NUL non-printable + * character will disable the implicit name. Putting NUL + * bytes first eliminates trailing zeros when the channel + * ID is printed as hex. For example: + * IORERPORT_MAKECHID('\0','\0','n','x','f','e','r','s'); + * To see the text, use xxd -r -p # not -rp; see 12976241 + */ +#define __IOR_lshiftchr(c, chshift) ((uint64_t)(c) << (8*(chshift))) +#define IOREPORT_MAKEID(A, B, C, D, E, F, G, H) \ + (__IOR_lshiftchr(A, 7) | __IOR_lshiftchr(B, 6) | __IOR_lshiftchr(C, 5) \ + | __IOR_lshiftchr(D, 4) | __IOR_lshiftchr(E, 3) | __IOR_lshiftchr(F, 2) \ + | __IOR_lshiftchr(G, 1) | __IOR_lshiftchr(H, 0)) + +typedef struct { + uint64_t channel_id; + IOReportChannelType channel_type; +} IOReportChannel; + +typedef struct { + uint32_t nchannels; + IOReportChannel channels[]; +} IOReportChannelList; + +typedef struct { + uint64_t provider_id; + IOReportChannel channel; +} IOReportInterest; + +typedef struct { + uint32_t ninterests; + IOReportInterest interests[]; +} IOReportInterestList; + +typedef struct { + uint64_t v[IOR_VALUES_PER_ELEMENT]; +} __attribute((packed)) IOReportElementValues; + +typedef struct { + uint64_t provider_id; + uint64_t channel_id; + IOReportChannelType channel_type; + uint64_t timestamp;// mach_absolute_time() + IOReportElementValues values; +} __attribute((packed)) IOReportElement; + + + +/* + * IOReporting unit type and constants + */ + +// 1. Mechanism + +// Assume encoded units could be stored in binary format: don't +// change existing values. + +typedef uint64_t IOReportUnit; +typedef uint64_t IOReportUnits; // deprecated typo, please switch +#define __IOR_MAKEUNIT(quantity, scale) \ + (((IOReportUnit)quantity << 56) | (uint64_t)scale) +#define IOREPORT_GETUNIT_QUANTITY(unit) \ + ((IOReportQuantity)((uint64_t)unit >> 56) & 0xff) +#define IOREPORT_GETUNIT_SCALE(unit) \ + ((IOReportScaleFactor)unit & 0x00ffffffffffffff) + +// 8b quantity ID | 32b const val + 8b*2^10 + 8b*2^n | 8b cardinal | 8b unused +typedef uint8_t IOReportQuantity; // SI "quantity" is what's measured +typedef uint64_t IOReportScaleFactor; + +// See for a list +// of quantities and their symbols. +enum { + // used by state reports, etc + kIOReportQuantityUndefined = 0, + + kIOReportQuantityTime = 1,// Seconds + kIOReportQuantityPower = 2,// Watts + kIOReportQuantityEnergy = 3,// Joules + kIOReportQuantityCurrent = 4,// Amperes + kIOReportQuantityVoltage = 5,// Volts + kIOReportQuantityCapacitance = 6,// Farad + kIOReportQuantityInductance = 7,// Henry + kIOReportQuantityFrequency = 8,// Hertz + kIOReportQuantityData = 9,// bits/bytes (see scale) + kIOReportQuantityTemperature = 10,// Celsius (not Kelvin :) + + kIOReportQuantityEventCount = 100, + kIOReportQuantityPacketCount = 101, + kIOReportQuantityCPUInstrs = 102 +}; + + +/* A number of units end up with both IEC (2^n) and SI (10^n) scale factors. + * For example, the "MB" of a 1.44 MB floppy or a 1024MHz clock. We + * thus support separate 2^n and 10^n factors. The exponent encoding + * scheme is modeled loosely on single-precision IEEE 754. + */ +#define kIOReportScaleConstMask 0x000000007fffffff // constant ("uint31") +#define kIOReportScaleOneOver (1LL << 31) // 1/constant +#define kIOReportExpBase (-127) // support base^(-n) +#define kIOReportExpZeroOffset -(kIOReportExpBase) // max exponent = 128 +#define kIOReportScaleSIShift 32 // * 10^n +#define kIOReportScaleSIMask 0x000000ff00000000 +#define kIOReportScaleIECShift 40 // * 2^n +#define kIOReportScaleIECMask 0x0000ff0000000000 +#define kIOReportCardinalShift 48 // placeholders +#define kIOReportCardinalMask 0x00ff000000000000 + + +/* + * Scales are described as a factor times unity: + * 1ms = kIOReportScaleMilli * s + * + * A value expressed in a scaled unit can be scaled to unity via + * multiplication by the constant: + * 100ms * kIOReportScaleMilli [1e-3] = 0.1s. + */ + +// SI / decimal +#define kIOReportScalePico ((-12LL + kIOReportExpZeroOffset) \ + << kIOReportScaleSIShift) +#define kIOReportScaleNano ((-9LL + kIOReportExpZeroOffset) \ + << kIOReportScaleSIShift) +#define kIOReportScaleMicro ((-6LL + kIOReportExpZeroOffset) \ + << kIOReportScaleSIShift) +#define kIOReportScaleMilli ((-3LL + kIOReportExpZeroOffset) \ + << kIOReportScaleSIShift) +#define kIOReportScaleUnity 0 // 10^0 = 2^0 = 1 +// unity = 0 is a special case for which we give up exp = -127 +#define kIOReportScaleKilo ((3LL + kIOReportExpZeroOffset) \ + << kIOReportScaleSIShift) +#define kIOReportScaleMega ((6LL + kIOReportExpZeroOffset) \ + << kIOReportScaleSIShift) +#define kIOReportScaleGiga ((9LL + kIOReportExpZeroOffset) \ + << kIOReportScaleSIShift) +#define kIOReportScaleTera ((12LL + kIOReportExpZeroOffset) \ + << kIOReportScaleSIShift) + +// IEC / computer / binary +// It's not clear we'll ever use 2^(-n), but 1..2^~120 should suffice. +#define kIOReportScaleBits kIOReportScaleUnity +#define kIOReportScaleBytes ((3LL + kIOReportExpZeroOffset) \ + << kIOReportScaleIECShift) +// (bytes have to be added to the exponents up front, can't just OR in) +#define kIOReportScaleKibi ((10LL + kIOReportExpZeroOffset) \ + << kIOReportScaleIECShift) +#define kIOReportScaleKiBytes ((13LL + kIOReportExpZeroOffset) \ + << kIOReportScaleIECShift) +#define kIOReportScaleMebi ((20LL + kIOReportExpZeroOffset) \ + << kIOReportScaleIECShift) +#define kIOReportScaleMiBytes ((23LL + kIOReportExpZeroOffset) \ + << kIOReportScaleIECShift) +#define kIOReportScaleGibi ((30LL + kIOReportExpZeroOffset) \ + << kIOReportScaleIECShift) +#define kIOReportScaleGiBytes ((33LL + kIOReportExpZeroOffset) \ + << kIOReportScaleIECShift) +#define kIOReportScaleTebi ((40LL + kIOReportExpZeroOffset) \ + << kIOReportScaleIECShift) +#define kIOReportScaleTiBytes ((43LL + kIOReportExpZeroOffset) \ + << kIOReportScaleIECShift) +// can't encode more than 2^125 (keeping bits & bytes inside -126..128) +// Also, IOReportScaleValue() is currently limited internally by uint64_t. + + +// Cardinal values, to be filled in appropriately. +// Add values in increasing order. +#define kIOReportScaleMachHWTicks (1LL << kIOReportCardinalShift) +#define kIOReportScaleHWPageSize (2LL << kIOReportCardinalShift) + +// page scales: 2 pages * 4ikB/page = 8096 bytes +#define kIOReportScale4KiB (4 | kIOReportScaleKiBytes) +#define kIOReportScale8KiB (8 | kIOReportScaleKiBytes) +#define kIOReportScale16KiB (16 | kIOReportScaleKiBytes) + +// Clock frequency scales (units add seconds). +// 1 GHz ticks are 1 ns: 1000 ticks * 1e-6 = 1e-3s +// This '1' is a no-op for scaling, but allows a custom label. +#define kIOReportScale1GHz (1 | kIOReportScaleNano) +// 24MHz ticks are 1/24 of a microsecond: (1/24 * kIOReportScaleMicro [1e-6])s +// So for example, 240 24Mticks * 1/24 * 1e-6 = .00001s [1e-5]s +#define kIOReportScale24MHz (kIOReportScaleOneOver|24 |kIOReportScaleMicro) + +// --- END: units mechanism + + +// 2. Unit constants +#define kIOReportUnitNone __IOR_MAKEUNIT(kIOReportQuantityUndefined, \ + kIOReportScaleUnity) + +#define kIOReportUnit_s __IOR_MAKEUNIT(kIOReportQuantityTime, \ + kIOReportScaleUnity) +#define kIOReportUnit_ms __IOR_MAKEUNIT(kIOReportQuantityTime, \ + kIOReportScaleMilli) +#define kIOReportUnit_us __IOR_MAKEUNIT(kIOReportQuantityTime, \ + kIOReportScaleMicro) +#define kIOReportUnit_ns __IOR_MAKEUNIT(kIOReportQuantityTime, \ + kIOReportScaleNano) + +#define kIOReportUnit_J __IOR_MAKEUNIT(kIOReportQuantityEnergy, \ + kIOReportScaleUnity) +#define kIOReportUnit_mJ __IOR_MAKEUNIT(kIOReportQuantityEnergy, \ + kIOReportScaleMilli) +#define kIOReportUnit_uJ __IOR_MAKEUNIT(kIOReportQuantityEnergy, \ + kIOReportScaleMicro) +#define kIOReportUnit_nJ __IOR_MAKEUNIT(kIOReportQuantityEnergy, \ + kIOReportScaleNano) +#define kIOReportUnit_pJ __IOR_MAKEUNIT(kIOReportQuantityEnergy, \ + kIOReportScalePico) + +#define kIOReportUnitHWTicks __IOR_MAKEUNIT(kIOReportQuantityTime, \ + kIOReportScaleMachHWTicks) +#define kIOReportUnit24MHzTicks __IOR_MAKEUNIT(kIOReportQuantityTime, \ + kIOReportScale24MHz) +#define kIOReportUnit1GHzTicks __IOR_MAKEUNIT(kIOReportQuantityTime, \ + kIOReportScale1GHz) + +#define kIOReportUnitBits __IOR_MAKEUNIT(kIOReportQuantityData, \ + kIOReportScaleBits) +#define kIOReportUnitBytes __IOR_MAKEUNIT(kIOReportQuantityData, \ + kIOReportScaleBytes) +#define kIOReportUnit_KiB __IOR_MAKEUNIT(kIOReportQuantityData, \ + kIOReportScaleKiBytes) +#define kIOReportUnit_MiB __IOR_MAKEUNIT(kIOReportQuantityData, \ + kIOReportScaleMiBytes) +#define kIOReportUnit_GiB __IOR_MAKEUNIT(kIOReportQuantityData, \ + kIOReportScaleGiBytes) +#define kIOReportUnit_TiB __IOR_MAKEUNIT(kIOReportQuantityData, \ + kIOReportScaleTiBytes) + +#define kIOReportUnitEvents __IOR_MAKEUNIT(kIOReportQuantityEventCount, \ + kIOReportScaleUnity) + +#define kIOReportUnitPackets __IOR_MAKEUNIT(kIOReportQuantityPacketCount, \ + kIOReportScaleUnity) + +#define kIOReportUnitInstrs __IOR_MAKEUNIT(kIOReportQuantityCPUInstrs, \ + kIOReportScaleUnity) +#define kIOReportUnit_KI __IOR_MAKEUNIT(kIOReportQuantityCPUInstrs, \ + kIOReportScaleKilo) +#define kIOReportUnit_MI __IOR_MAKEUNIT(kIOReportQuantityCPUInstrs, \ + kIOReportScaleMega) +#define kIOReportUnit_GI __IOR_MAKEUNIT(kIOReportQuantityCPUInstrs, \ + kIOReportScaleGiga) + +// Please file bugs (xnu | IOReporting) for additional units. + +// --- END: unit constants + + +#ifdef __cplusplus +} +#endif + +#endif // _IOREPORT_TYPES_H_ diff --git a/QualcommWireless/include/IOKit/IOReportUserClient.h b/QualcommWireless/include/IOKit/IOReportUserClient.h new file mode 100644 index 0000000..5aca281 --- /dev/null +++ b/QualcommWireless/include/IOKit/IOReportUserClient.h @@ -0,0 +1,79 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOKIT_IOREPORTUSERCLIENT_H +#define _IOKIT_IOREPORTUSERCLIENT_H + +#include +#include + +class IOReportUserClient : public IOUserClient +{ + OSDeclareDefaultStructors(IOReportUserClient) + +public: +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_5 + virtual IOReturn externalMethod(uint32_t selector, IOExternalMethodArguments * arguments, IOExternalMethodDispatch * dispatch = NULL, OSObject * target = NULL, void * reference = NULL) APPLE_KEXT_OVERRIDE; +#endif + + virtual bool init( OSDictionary * dictionary ) APPLE_KEXT_OVERRIDE; + virtual bool initWithTask( task_t owningTask, void * securityToken, UInt32 type ) APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual bool stop( IOService * provider ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn clientClose() APPLE_KEXT_OVERRIDE; + virtual IOService * getService() APPLE_KEXT_OVERRIDE; + virtual IOReturn clientMemoryForType( UInt32 type, IOOptionBits * options, IOMemoryDescriptor ** memory ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn open( IOOptionBits options ); + virtual IOReturn close(); + + static IOReturn _open( IOReportUserClient *, void *, IOExternalMethodArguments * ); + static IOReturn _close( IOReportUserClient *, void *, IOExternalMethodArguments * ); + static IOReturn goto_configureInterests( IOReportUserClient *, void *, IOExternalMethodArguments * ); + static IOReturn goto_getValues( IOReportUserClient *, void *, IOExternalMethodArguments * ); + IOReturn _configureInterests( IOReportInterestList *, IOByteCount * ); + IOReturn _getInterests( IOByteCount, OSDictionary **, IOBufferMemoryDescriptor ** ); + IOReturn _getValues( IOByteCount ); + +protected: + IOOptionBits mHubOptions; + task_t mOwningTask; + IOReportHub * mHub; + IOLock * mHubLock; + OSArray * mReportDictionaryArray; + OSArray * mSubscriptionBufferArray; +}; + +#endif diff --git a/QualcommWireless/include/IOKit/IOReturn.h b/QualcommWireless/include/IOKit/IOReturn.h new file mode 100644 index 0000000..f0c0d2e --- /dev/null +++ b/QualcommWireless/include/IOKit/IOReturn.h @@ -0,0 +1,158 @@ +/* + * Copyright (c) 1998-2002 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * HISTORY + */ + +/* + * Core IOReturn values. Others may be family defined. + */ + +#ifndef __IOKIT_IORETURN_H +#define __IOKIT_IORETURN_H + +#ifdef __cplusplus +extern "C" { +#endif + + +#include + + +typedef kern_return_t IOReturn; + +#ifndef sys_iokit +#define sys_iokit err_system(0x38) +#endif /* sys_iokit */ +#define sub_iokit_common err_sub(0) +#define sub_iokit_usb err_sub(1) +#define sub_iokit_firewire err_sub(2) +#define sub_iokit_block_storage err_sub(4) +#define sub_iokit_graphics err_sub(5) +#define sub_iokit_networking err_sub(6) +#define sub_iokit_bluetooth err_sub(8) +#define sub_iokit_pmu err_sub(9) +#define sub_iokit_acpi err_sub(10) +#define sub_iokit_smbus err_sub(11) +#define sub_iokit_ahci err_sub(12) +#define sub_iokit_powermanagement err_sub(13) +#define sub_iokit_hidsystem err_sub(14) +#define sub_iokit_scsi err_sub(16) +#define sub_iokit_usbaudio err_sub(17) +#define sub_iokit_wirelesscharging err_sub(18) +//#define sub_iokit_pccard err_sub(21) +#define sub_iokit_thunderbolt err_sub(29) +#define sub_iokit_graphics_acceleration err_sub(30) +#define sub_iokit_keystore err_sub(31) +#define sub_iokit_apfs err_sub(33) +#define sub_iokit_acpiec err_sub(34) +#define sub_iokit_timesync_avb err_sub(35) + +#define sub_iokit_platform err_sub(0x2A) +#define sub_iokit_audio_video err_sub(0x45) +#define sub_iokit_cec err_sub(0x46) +#define sub_iokit_baseband err_sub(0x80) +#define sub_iokit_HDA err_sub(0xFE) +#define sub_iokit_hsic err_sub(0x147) +#define sub_iokit_sdio err_sub(0x174) +#define sub_iokit_wlan err_sub(0x208) +#define sub_iokit_appleembeddedsleepwakehandler err_sub(0x209) +#define sub_iokit_appleppm err_sub(0x20A) + +#define sub_iokit_vendor_specific err_sub(-2) +#define sub_iokit_reserved err_sub(-1) + +#define iokit_common_err(return ) (sys_iokit|sub_iokit_common|return) +#define iokit_family_err(sub, return ) (sys_iokit|sub|return) +#define iokit_vendor_specific_err(return ) (sys_iokit|sub_iokit_vendor_specific|return) + +#define kIOReturnSuccess KERN_SUCCESS // OK +#define kIOReturnError iokit_common_err(0x2bc) // general error +#define kIOReturnNoMemory iokit_common_err(0x2bd) // can't allocate memory +#define kIOReturnNoResources iokit_common_err(0x2be) // resource shortage +#define kIOReturnIPCError iokit_common_err(0x2bf) // error during IPC +#define kIOReturnNoDevice iokit_common_err(0x2c0) // no such device +#define kIOReturnNotPrivileged iokit_common_err(0x2c1) // privilege violation +#define kIOReturnBadArgument iokit_common_err(0x2c2) // invalid argument +#define kIOReturnLockedRead iokit_common_err(0x2c3) // device read locked +#define kIOReturnLockedWrite iokit_common_err(0x2c4) // device write locked +#define kIOReturnExclusiveAccess iokit_common_err(0x2c5) // exclusive access and + // device already open +#define kIOReturnBadMessageID iokit_common_err(0x2c6) // sent/received messages + // had different msg_id +#define kIOReturnUnsupported iokit_common_err(0x2c7) // unsupported function +#define kIOReturnVMError iokit_common_err(0x2c8) // misc. VM failure +#define kIOReturnInternalError iokit_common_err(0x2c9) // internal error +#define kIOReturnIOError iokit_common_err(0x2ca) // General I/O error +//#define kIOReturn???Error iokit_common_err(0x2cb) // ??? +#define kIOReturnCannotLock iokit_common_err(0x2cc) // can't acquire lock +#define kIOReturnNotOpen iokit_common_err(0x2cd) // device not open +#define kIOReturnNotReadable iokit_common_err(0x2ce) // read not supported +#define kIOReturnNotWritable iokit_common_err(0x2cf) // write not supported +#define kIOReturnNotAligned iokit_common_err(0x2d0) // alignment error +#define kIOReturnBadMedia iokit_common_err(0x2d1) // Media Error +#define kIOReturnStillOpen iokit_common_err(0x2d2) // device(s) still open +#define kIOReturnRLDError iokit_common_err(0x2d3) // rld failure +#define kIOReturnDMAError iokit_common_err(0x2d4) // DMA failure +#define kIOReturnBusy iokit_common_err(0x2d5) // Device Busy +#define kIOReturnTimeout iokit_common_err(0x2d6) // I/O Timeout +#define kIOReturnOffline iokit_common_err(0x2d7) // device offline +#define kIOReturnNotReady iokit_common_err(0x2d8) // not ready +#define kIOReturnNotAttached iokit_common_err(0x2d9) // device not attached +#define kIOReturnNoChannels iokit_common_err(0x2da) // no DMA channels left +#define kIOReturnNoSpace iokit_common_err(0x2db) // no space for data +//#define kIOReturn???Error iokit_common_err(0x2dc) // ??? +#define kIOReturnPortExists iokit_common_err(0x2dd) // port already exists +#define kIOReturnCannotWire iokit_common_err(0x2de) // can't wire down + // physical memory +#define kIOReturnNoInterrupt iokit_common_err(0x2df) // no interrupt attached +#define kIOReturnNoFrames iokit_common_err(0x2e0) // no DMA frames enqueued +#define kIOReturnMessageTooLarge iokit_common_err(0x2e1) // oversized msg received + // on interrupt port +#define kIOReturnNotPermitted iokit_common_err(0x2e2) // not permitted +#define kIOReturnNoPower iokit_common_err(0x2e3) // no power to device +#define kIOReturnNoMedia iokit_common_err(0x2e4) // media not present +#define kIOReturnUnformattedMedia iokit_common_err(0x2e5)// media not formatted +#define kIOReturnUnsupportedMode iokit_common_err(0x2e6) // no such mode +#define kIOReturnUnderrun iokit_common_err(0x2e7) // data underrun +#define kIOReturnOverrun iokit_common_err(0x2e8) // data overrun +#define kIOReturnDeviceError iokit_common_err(0x2e9) // the device is not working properly! +#define kIOReturnNoCompletion iokit_common_err(0x2ea) // a completion routine is required +#define kIOReturnAborted iokit_common_err(0x2eb) // operation aborted +#define kIOReturnNoBandwidth iokit_common_err(0x2ec) // bus bandwidth would be exceeded +#define kIOReturnNotResponding iokit_common_err(0x2ed) // device not responding +#define kIOReturnIsoTooOld iokit_common_err(0x2ee) // isochronous I/O request for distant past! +#define kIOReturnIsoTooNew iokit_common_err(0x2ef) // isochronous I/O request for distant future +#define kIOReturnNotFound iokit_common_err(0x2f0) // data was not found +#define kIOReturnInvalid iokit_common_err(0x1) // should never be seen + +#ifdef __cplusplus +} +#endif + +#endif /* ! __IOKIT_IORETURN_H */ diff --git a/QualcommWireless/include/IOKit/IOSMBusController.h b/QualcommWireless/include/IOKit/IOSMBusController.h new file mode 100644 index 0000000..814c73f --- /dev/null +++ b/QualcommWireless/include/IOKit/IOSMBusController.h @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2018 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef RE_APPLE_IOSMBUSCONTROLLER_H +#define RE_APPLE_IOSMBUSCONTROLLER_H + +// This header represents a mostly valid IOSMBusController class implementation useful for our needs. +// Compatible with macOS 10.13.5. Based on PureDarwin header: +// https://raw.githubusercontent.com/PureDarwin/PureDarwin/master/patches/PowerManagement-158.10.9.IOSmbusController.p1.patch + +#include +#include +#include + +// SMBus Status register type +typedef uint8_t IOSMBusStatus; + +// Status Register (SMB_STS) Codes +// See section 12.9.1.1 of ACPI 4.0a specification +enum : IOSMBusStatus { + kIOSMBusStatusOK = 0x00, + kIOSMBusStatusUnknownFailure = 0x07, + kIOSMBusStatusDeviceAddressNotAcknowledged = 0x10, + kIOSMBusStatusDeviceError = 0x11, + kIOSMBusStatusDeviceCommandAccessDenied = 0x12, + kIOSMBusStatusUnknownHostError = 0x13, + kIOSMBusStatusDeviceAccessDenied = 0x17, + kIOSMBusStatusTimeout = 0x18, + kIOSMBusStatusHostUnsupportedProtocol = 0x19, + kIOSMBusStatusBusy = 0x1A, + kIOSMBusStatusPECError = 0x1F, +}; + +// Protocol Register (SMB_PRTCL) Types +// See section 12.9.1.2 of ACPI 4.0a specification +enum { + kIOSMBusProtocolControllerNotInUse = 0x00, + kIOSMBusProtocolReserved = 0x01, + kIOSMBusProtocolWriteQuickCommand = 0x02, + kIOSMBusProtocolReadQuickCommand = 0x03, + kIOSMBusProtocolSendByte = 0x04, + kIOSMBusProtocolReceiveByte = 0x05, + kIOSMBusProtocolWriteByte = 0x06, + kIOSMBusProtocolReadByte = 0x07, + kIOSMBusProtocolWriteWord = 0x08, + kIOSMBusProtocolReadWord = 0x09, + kIOSMBusProtocolWriteBlock = 0x0A, + kIOSMBusProtocolReadBlock = 0x0B, + kIOSMBusProtocolProcessCall = 0x0C, + kIOSMBusProtocolBlockWriteBlockReadProcessCall = 0x0D, + + // Same as above but with (P)acket (E)rror (C)hecking enabled + kIOSMBusProtocolPECControllerNotInUse = 0x80, + kIOSMBusProtocolPECReserved = 0x81, + kIOSMBusProtocolPECWriteQuickCommand = 0x82, + kIOSMBusProtocolPECReadQuickCommand = 0x83, + kIOSMBusProtocolPECSendByte = 0x84, + kIOSMBusProtocolPECReceiveByte = 0x85, + kIOSMBusProtocolPECWriteByte = 0x86, + kIOSMBusProtocolPECReadByte = 0x87, + kIOSMBusProtocolPECWriteWord = 0x88, + kIOSMBusProtocolPECReadWord = 0x89, + kIOSMBusProtocolPECWriteBlock = 0x8A, + kIOSMBusProtocolPECReadBlock = 0x8B, + kIOSMBusProtocolPECProcessCall = 0x8C, + kIOSMBusProtocolPECBlockWriteBlockReadProcessCall = 0x8D, +}; + +// SMBus alarm message type +enum { + kIOMessageSMBusAlarm = iokit_family_msg(sub_iokit_smbus, 0x10), +}; + +static_assert(kIOMessageSMBusAlarm == 0xE002C010, "Invalid kIOMessageSMBusAlarm value"); + +// See section 12.9.1.7 of ACPI 4.0a specification +static constexpr size_t kSMBusAlarmDataSize = 2; + +struct IOSMBusAlarmMessage { + uint8_t fromAddress; + uint8_t data[kSMBusAlarmDataSize]; +}; + +// Maximum size of SMBus Data Register Array (SMB_DATA) +// See section 12.9.1.5 of ACPI 4.0a specification +static constexpr size_t kSMBusMaximumDataSize = 32; + +// Holds data related to a SMBus transaction +// Padding required for 32-bit as 64-bit integers are normally not aligned to 8 bytes +struct IOSMBusTransaction { + uint8_t address; + uint8_t command; + uint8_t protocol; + uint8_t pad1[5]; + uint64_t timeout; + uint32_t sendDataCount; + uint8_t sendData[kSMBusMaximumDataSize]; + IOSMBusStatus status; + uint32_t receiveDataCount; + uint8_t receiveData[kSMBusMaximumDataSize]; + uint32_t pad2; +}; + +static_assert(sizeof(IOSMBusTransaction) == 0x60, "Invalid IOSMBusTransaction size"); +#if defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 5 || __GNUC__ > 3) +static_assert(offsetof(IOSMBusTransaction, timeout) == 0x08, "Invalid IOSMBusTransaction::timeout offset"); +static_assert(offsetof(IOSMBusTransaction, sendDataCount) == 0x10, "Invalid IOSMBusTransaction::sendDataCount offset"); +static_assert(offsetof(IOSMBusTransaction, sendData) == 0x14, "Invalid IOSMBusTransaction::sendData offset"); +static_assert(offsetof(IOSMBusTransaction, receiveDataCount) == 0x38, "Invalid IOSMBusTransaction::receiveDataCount offset"); +static_assert(offsetof(IOSMBusTransaction, receiveData) == 0x3C, "Invalid IOSMBusTransaction::receiveData offset"); +#endif + +// Transaction completion callback +typedef void (*IOSMBusTransactionCompletion)(OSObject *target, void *reference, IOSMBusTransaction *transaction); + +// Transaction request for later execution. +//TODO: complete the fields. +class IOSMBusRequest : public IOCommand { + OSDeclareDefaultStructors(IOSMBusRequest) +public: + queue_chain_t requestChain; + IOSMBusTransaction *transaction; + IOSMBusTransactionCompletion completionHandler; + OSObject *completionHandlerInstance; + void *completionHandlerArgument; + void *unknown[6]; +}; + +static_assert(sizeof(IOSMBusRequest) == (0x10 * sizeof(uintptr_t)), "Invalid IOSMBusRequest size"); // 0x80 on 64-bit + +// Main SMBus controller base class. +class IOACPIPlatformDevice; +class IOSMBusController : public IOService { + OSDeclareDefaultStructors(IOSMBusController) +public: + virtual IOReturn performTransaction(IOSMBusTransaction *transaction, IOSMBusTransactionCompletion completion = 0, + OSObject *target = 0, void *reference = 0); + virtual IOSMBusRequest *createRequest(); + virtual IOSMBusStatus startRequest(IOSMBusRequest *request); + virtual IOSMBusStatus completeRequest(IOSMBusRequest *request); + virtual IOSMBusStatus sendAlarm(IOSMBusAlarmMessage *alarmMessage); + + OSMetaClassDeclareReservedUnused(IOSMBusController, 0); + OSMetaClassDeclareReservedUnused(IOSMBusController, 1); + OSMetaClassDeclareReservedUnused(IOSMBusController, 2); + OSMetaClassDeclareReservedUnused(IOSMBusController, 3); + OSMetaClassDeclareReservedUnused(IOSMBusController, 4); + OSMetaClassDeclareReservedUnused(IOSMBusController, 5); + OSMetaClassDeclareReservedUnused(IOSMBusController, 6); + OSMetaClassDeclareReservedUnused(IOSMBusController, 7); + OSMetaClassDeclareReservedUnused(IOSMBusController, 8); + OSMetaClassDeclareReservedUnused(IOSMBusController, 9); + OSMetaClassDeclareReservedUnused(IOSMBusController, 10); + OSMetaClassDeclareReservedUnused(IOSMBusController, 11); + OSMetaClassDeclareReservedUnused(IOSMBusController, 12); + OSMetaClassDeclareReservedUnused(IOSMBusController, 13); + OSMetaClassDeclareReservedUnused(IOSMBusController, 14); + OSMetaClassDeclareReservedUnused(IOSMBusController, 15); + +public: + //FIXME: This is roughly unknown and incomplete. + void *fPrivateUnknown; + IOCommandGate *fPrivateCommandGate; + queue_chain_t fPrivateCommandQueue; + void *fPrivateUnknown2[5]; +}; + +#if defined(__i386__) +static_assert(sizeof(IOSMBusController) == 0x74, "Invalid 32-bit IOSMBusController size"); +#if defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 5 || __GNUC__ > 3) +static_assert(offsetof(IOSMBusController, fPrivateCommandGate) == 0x54, "Invalid 32-bit IOSMBusController::fCommandGate offset"); +static_assert(offsetof(IOSMBusController, fPrivateCommandQueue) == 0x58, "Invalid 32-bit IOSMBusController::fCommandQueue offset"); +#endif + +#elif defined(__x86_64__) +static_assert(sizeof(IOSMBusController) == 0xD0, "Invalid 64-bit IOSMBusController size"); +#if defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 5 || __GNUC__ > 3) +static_assert(offsetof(IOSMBusController, fPrivateCommandGate) == 0x90, "Invalid 64-bit IOSMBusController::fCommandGate offset"); +static_assert(offsetof(IOSMBusController, fPrivateCommandQueue) == 0x98, "Invalid 64-bit IOSMBusController::fCommandQueue offset"); +#endif + +#else +#error Unsupported arch +#endif + +#endif /* RE_APPLE_IOSMBUSCONTROLLER_H */ diff --git a/QualcommWireless/include/IOKit/IOService.h b/QualcommWireless/include/IOKit/IOService.h new file mode 100644 index 0000000..00d4cee --- /dev/null +++ b/QualcommWireless/include/IOKit/IOService.h @@ -0,0 +1,1907 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1998,1999 Apple Computer, Inc. All rights reserved. + * + * HISTORY + * + */ +/*! + * @header + * This header contains the definition of the IOService class. IOService is the sole direct subclass of IORegistryEntry and is the base class of almost all I/O Kit family superclasses. IOService defines methods that support the life cycle of I/O Kit drivers. For more information on IOService, see {@linkdoc //apple_ref/doc/uid/TP0000011 I/O Kit Fundamentals}. + * + * @seealso //apple_ref/doc/header/IORegistryEntry.h IORegistryEntry + */ + +#ifndef _IOKIT_IOSERVICE_H +#define _IOKIT_IOSERVICE_H + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +extern "C" { +#include +} + +#include + +#ifndef __MAC_OS_X_VERSION_MIN_REQUIRED +#error "Missing macOS target version" +#endif + +#ifndef UINT64_MAX +#define UINT64_MAX 18446744073709551615ULL +#endif + + +enum { + kIODefaultProbeScore = 0 +}; + +// masks for getState() +enum { + kIOServiceInactiveState = 0x00000001, + kIOServiceRegisteredState = 0x00000002, + kIOServiceMatchedState = 0x00000004, + kIOServiceFirstPublishState = 0x00000008, + kIOServiceFirstMatchState = 0x00000010 +}; + +enum { + // options for registerService() + kIOServiceExclusive = 0x00000001, + + // options for terminate() + kIOServiceRequired = 0x00000001, + kIOServiceTerminate = 0x00000004, + kIOServiceTerminateWithRematch = 0x00000010, + + // options for registerService() & terminate() + kIOServiceSynchronous = 0x00000002, + // options for registerService() + kIOServiceAsynchronous = 0x00000008 +}; + +// options for open() +enum { + kIOServiceSeize = 0x00000001, + kIOServiceFamilyOpenOptions = 0xffff0000 +}; + +// options for close() +enum { + kIOServiceFamilyCloseOptions = 0xffff0000 +}; + +typedef void * IONotificationRef; + +extern const IORegistryPlane * gIOServicePlane; +extern const IORegistryPlane * gIOPowerPlane; + +extern const OSSymbol * gIOResourcesKey; +extern const OSSymbol * gIOResourceMatchKey; +extern const OSSymbol * gIOResourceMatchedKey; +extern const OSSymbol * gIOResourceIOKitKey; + +extern const OSSymbol * gIOProviderClassKey; +extern const OSSymbol * gIONameMatchKey; +extern const OSSymbol * gIONameMatchedKey; +extern const OSSymbol * gIOPropertyMatchKey; +extern const OSSymbol * gIOPropertyExistsMatchKey; +extern const OSSymbol * gIOLocationMatchKey; +extern const OSSymbol * gIOParentMatchKey; +extern const OSSymbol * gIOPathMatchKey; +extern const OSSymbol * gIOMatchCategoryKey; +extern const OSSymbol * gIODefaultMatchCategoryKey; +extern const OSSymbol * gIOMatchedServiceCountKey; +extern const OSSymbol * gIOMatchedPersonalityKey; +extern const OSSymbol * gIORematchPersonalityKey; +extern const OSSymbol * gIORematchCountKey; +extern const OSSymbol * gIODEXTMatchCountKey; + +extern const OSSymbol * gIOUserClientClassKey; + +extern const OSSymbol * gIOUserClassKey; +extern const OSSymbol * gIOUserServerClassKey; +extern const OSSymbol * gIOUserServerNameKey; +extern const OSSymbol * gIOUserServerTagKey; +extern const OSSymbol * gIOUserServerCDHashKey; +extern const OSSymbol * gIOUserUserClientKey; + +extern const OSSymbol * gIOKitDebugKey; +extern const OSSymbol * gIOServiceKey; + +extern const OSSymbol * gIOCommandPoolSizeKey; + +extern const OSSymbol * gIOPublishNotification; +extern const OSSymbol * gIOFirstPublishNotification; +extern const OSSymbol * gIOMatchedNotification; +extern const OSSymbol * gIOFirstMatchNotification; +extern const OSSymbol * gIOTerminatedNotification; +extern const OSSymbol * gIOWillTerminateNotification; + +extern const OSSymbol * gIOGeneralInterest; +extern const OSSymbol * gIOBusyInterest; +extern const OSSymbol * gIOOpenInterest; +extern const OSSymbol * gIOAppPowerStateInterest; +extern const OSSymbol * gIOPriorityPowerStateInterest; +extern const OSSymbol * gIOConsoleSecurityInterest; + +extern const OSSymbol * gIODeviceMemoryKey; +extern const OSSymbol * gIOInterruptControllersKey; +extern const OSSymbol * gIOInterruptSpecifiersKey; + +extern const OSSymbol * gIOSupportedPropertiesKey; +extern const OSSymbol * gIOUserServicePropertiesKey; + +extern const OSSymbol * gIOBSDKey; +extern const OSSymbol * gIOBSDNameKey; +extern const OSSymbol * gIOBSDMajorKey; +extern const OSSymbol * gIOBSDMinorKey; +extern const OSSymbol * gIOBSDUnitKey; + +extern const OSSymbol * gIODriverKitEntitlementKey; +extern const OSSymbol * gIOServiceDEXTEntitlementsKey; +extern const OSSymbol * gIODriverKitUserClientEntitlementsKey; +extern const OSSymbol * gIODriverKitUserClientEntitlementAllowAnyKey; +extern const OSSymbol * gIOMatchDeferKey; + +extern SInt32 IOServiceOrdering( const OSMetaClassBase * inObj1, const OSMetaClassBase * inObj2, void * ref ); + +typedef void (*IOInterruptAction)( OSObject * target, void * refCon, + IOService * nub, int source ); + +#ifdef __BLOCKS__ +typedef void (^IOInterruptActionBlock)(IOService * nub, int source); +#endif /* __BLOCKS__ */ + +/*! @typedef IOServiceNotificationHandler + * @param target Reference supplied when the notification was registered. + * @param refCon Reference constant supplied when the notification was registered. + * @param newService The IOService object the notification is delivering. It is retained for the duration of the handler's invocation and doesn't need to be released by the handler. */ + +typedef bool (*IOServiceNotificationHandler)( void * target, void * refCon, + IOService * newService ); + +typedef bool (*IOServiceMatchingNotificationHandler)( void * target, void * refCon, + IOService * newService, + IONotifier * notifier ); + +#ifdef __BLOCKS__ +typedef bool (^IOServiceMatchingNotificationHandlerBlock)(IOService * newService, + IONotifier * notifier ); +#endif /* __BLOCKS__ */ + + +/*! @typedef IOServiceInterestHandler + * @param target Reference supplied when the notification was registered. + * @param refCon Reference constant supplied when the notification was registered. + * @param messageType Type of the message - IOKit defined in IOKit/IOMessage.h or family specific. + * @param provider The IOService object who is delivering the notification. It is retained for the duration of the handler's invocation and doesn't need to be released by the handler. + * @param messageArgument An argument for message, dependent on its type. + * @param argSize Non zero if the argument represents a struct of that size, used when delivering messages outside the kernel. */ + +typedef IOReturn (*IOServiceInterestHandler)( void * target, void * refCon, + UInt32 messageType, IOService * provider, + void * messageArgument, vm_size_t argSize ); + +#ifdef __BLOCKS__ +typedef IOReturn (^IOServiceInterestHandlerBlock)( uint32_t messageType, IOService * provider, + void * messageArgument, size_t argSize ); +#endif /* __BLOCKS__ */ + +typedef void (*IOServiceApplierFunction)(IOService * service, void * context); +typedef void (*OSObjectApplierFunction)(OSObject * object, void * context); + +class IOUserClient; +class IOPlatformExpert; + +/*! @class IOService + * @abstract The base class for most I/O Kit families, devices, and drivers. + * @discussion The IOService base class defines APIs used to publish services, instantiate other services based on the existance of a providing service (ie. driver stacking), destroy a service and its dependent stack, notify interested parties of service state changes, and general utility functions useful across all families. + * + * Types of service are specified with a matching dictionary that describes properties of the service. For example, a matching dictionary might describe any IOUSBDevice (or subclass), an IOUSBDevice with a certain class code, or a IOPCIDevice with a set of matching names or device & vendor IDs. Since the matching dictionary is interpreted by the family which created the service, as well as generically by IOService, the list of properties considered for matching depends on the familiy. + * + * Matching dictionaries are associated with IOService classes by the catalogue, as driver property tables, and also supplied by clients of the notification APIs. + * + * IOService provides matching based on C++ class (via OSMetaClass dynamic casting), registry entry name, a registry path to the service (which includes device tree paths), a name assigned by BSD, or by its location (its point of attachment). + * + *

Driver Instantiation by IOService

+ * + * Drivers are subclasses of IOService, and their availability is managed through the catalogue. They are instantiated based on the publication of an IOService they use (for example, an IOPCIDevice or IOUSBDevice), or when they are added to the catalogue and the IOService(s) they use are already available. + * + * When an IOService (the "provider") is published with the @link registerService registerService@/link method, the matching and probing process begins, which is always single threaded per provider. A list of matching dictionaries from the catalog and installed publish notification requests, that successfully match the IOService, is constructed, with ordering supplied by kIOProbeScoreKey ("IOProbeScore") property in the dictionary, or supplied with the notification. + * + * Each entry in the list is then processed in order - for notifications, the notification is delivered, for driver property tables a lot more happens. + * + * The driver class is instantiated and init() called with its property table. The new driver instance is then attached to the provider, and has its @link probe probe@/link method called with the provider as an argument. The default probe method does nothing but return success, but a driver may implement this method to interrogate the provider to make sure it can work with it. It may also modify its probe score at this time. After probe, the driver is detached and the next in the list is considered (ie. attached, probed, and detached). + * + * When the probing phase is complete, the list consists of successfully probed drivers, in order of their probe score (after adjustment during the @link probe probe@/link call). The list is then divided into categories based on the kIOMatchCategoryKey property ("IOMatchCategory"); drivers without a match category are all considered in one default category. Match categories allow multiple clients of a provider to be attached and started, though the provider may also enforce open/close semantics to gain active access to it. + * + * For each category, the highest scoring driver in that category is attached to the provider, and its @link start start@/link method called. If start is successful, the rest of the drivers in the same match category are discarded, otherwise the next highest scoring driver is started, and so on. + * + * The driver should only consider itself in action when the start method is called, meaning it has been selected for use on the provider, and consuming that particular match category. It should also be prepared to be allocated, probed and freed even if the probe was successful. + * + * After the drivers have all synchronously been started, the installed "matched" notifications that match the registered IOService are delivered. + * + *

Properties used by IOService

+ * + * kIOClassKey, extern const OSSymbol * gIOClassKey, "IOClass" + *
+ *
+ * Class of the driver to instantiate on matching providers. + *
+ *
+ * kIOProviderClassKey, extern const OSSymbol * gIOProviderClassKey, "IOProviderClass" + *
+ *
+ * Class of the provider(s) to be considered for matching, checked with OSDynamicCast so subclasses will also match. + *
+ *
+ * kIOProbeScoreKey, extern const OSSymbol * gIOProbeScoreKey, "IOProbeScore" + *
+ *
+ * The probe score initially used to order multiple matching drivers. + *
+ *
+ * kIOMatchCategoryKey, extern const OSSymbol * gIOMatchCategoryKey, "IOMatchCategory" + *
+ *
+ * A string defining the driver category for matching purposes. All drivers with no IOMatchCategory property are considered to be in the same default category. Only one driver in a category can be started on each provider. + *
+ *
+ * kIONameMatchKey, extern const OSSymbol * gIONameMatchKey, "IONameMatch" + *
+ * A string or collection of strings that match the provider's name. The comparison is implemented with the @link //apple_ref/cpp/instm/IORegistryEntry/compareNames/virtualbool/(OSObject*,OSString**) IORegistryEntry::compareNames@/link method, which supports a single string, or any collection (OSArray, OSSet, OSDictionary etc.) of strings. IOService objects with device tree properties (eg. IOPCIDevice) will also be matched based on that standard's "compatible", "name", "device_type" properties. The matching name will be left in the driver's property table in the kIONameMatchedKey property. + *
+ * Examples + *
+ *  @textblock
+ *   IONameMatch
+ *   pci106b,7
+ *  @/textblock
+ *  
+ * + * For a list of possible matching names, a serialized array of strings should used, eg. + *
+ *  @textblock
+ *   IONameMatch
+ *   
+ *       APPL,happy16
+ *       pci106b,7
+ *   
+ *  @/textblock
+ *  
+ * + *
+ * kIONameMatchedKey, extern const OSSymbol * gIONameMatchedKey, "IONameMatched" + *
+ * The name successfully matched name from the kIONameMatchKey property will be left in the driver's property table as the kIONameMatchedKey property. + *
+ *
+ * kIOPropertyMatchKey, extern const OSSymbol * gIOPropertyMatchKey, "IOPropertyMatch" + *
+ * A dictionary of properties that each must exist in the matching IOService and compare successfully with the isEqualTo method. + * + *
+ *  @textblock
+ *   IOPropertyMatch
+ *   
+ *       APPL,happy16
+ *       APPL,meek8
+ *   
+ *  @/textblock
+ *  
+ * + *
+ * kIOUserClientClassKey, extern const OSSymbol * gIOUserClientClassKey, "IOUserClientClass" + *
+ * The class name that the service will attempt to allocate when a user client connection is requested. First the device nub is queried, then the nub's provider is queried by default. + *
+ *
+ * kIOKitDebugKey, extern const OSSymbol * gIOKitDebugKey, "IOKitDebug" + *
+ * Set some debug flags for logging the driver loading process. Flags are defined in IOKit/IOKitDebug.h, but 65535 works well.*/ + +struct IOInterruptAccountingData; +struct IOInterruptAccountingReporter; +struct OSObjectUserVars; + +class IOService : public IORegistryEntry +{ + OSDeclareDefaultStructorsWithDispatch(IOService); + +protected: +/*! @struct ExpansionData + * @discussion This structure will be used to expand the capablilties of this class in the future. + */ + struct ExpansionData { + uint64_t authorizationID; + /* + * Variables associated with interrupt accounting. Consists of an array + * (that pairs reporters with opaque "statistics" objects), the count for + * the array, and a lock to guard both of the former variables. The lock + * is necessary as IOReporting will not update reports in a manner that is + * synchonized with the service (i.e, on a workloop). + */ + IOLock * interruptStatisticsLock; + IOInterruptAccountingReporter * interruptStatisticsArray; + int interruptStatisticsArrayCount; + + OSObjectUserVars * uvars; + }; + +/*! @var reserved + * Reserved for future use. (Internal use only) */ + APPLE_KEXT_WSHADOW_PUSH; + ExpansionData * reserved; + APPLE_KEXT_WSHADOW_POP; + +private: + IOService * __provider; + SInt32 __providerGeneration; + IOService * __owner; + IOOptionBits __state[2]; + uint64_t __timeBusy; + uint64_t __accumBusy; + IOServicePM * pwrMgt; + +protected: +// TRUE once PMinit has been called + bool initialized; + +public: +// DEPRECATED + void * pm_vars; + +public: +/* methods available in Mac OS X 10.1 or later */ +/*! @function requestTerminate + * @abstract Passes a termination up the stack. + * @discussion When an IOService is made inactive the default behavior is to also make any of its clients that have it as their only provider also inactive, in this way recursing the termination up the driver stack. This method allows an IOService object to override this behavior. Returning true from this method when passed a just terminated provider will cause the client to also be terminated. + * @param provider The terminated provider of this object. + * @param options Options originally passed to terminate, plus kIOServiceRecursing. + * @result true if this object should be terminated now that its provider has been. */ + + virtual bool requestTerminate( IOService * provider, IOOptionBits options ); + +/*! @function willTerminate + * @abstract Passes a termination up the stack. + * @discussion Notification that a provider has been terminated, sent before recursing up the stack, in root-to-leaf order. + * @param provider The terminated provider of this object. + * @param options Options originally passed to terminate. + * @result true. */ + + virtual bool willTerminate( IOService * provider, IOOptionBits options ); + +/*! @function didTerminate + * @abstract Passes a termination up the stack. + * @discussion Notification that a provider has been terminated, sent after recursing up the stack, in leaf-to-root order. + * @param provider The terminated provider of this object. + * @param options Options originally passed to terminate. + * @param defer If there is pending I/O that requires this object to persist, and the provider is not opened by this object set defer to true and call the IOService::didTerminate() implementation when the I/O completes. Otherwise, leave defer set to its default value of false. + * @result true. */ + + virtual bool didTerminate( IOService * provider, IOOptionBits options, bool * defer ); + +/*! @function nextIdleTimeout + * @availability Mac OS X v10.4 and later + * @abstract Allows subclasses to customize idle power management behavior. + * @discussion Returns the next time that the device should idle into its next lower power state. Subclasses may override for custom idle behavior. + * + * A power managed driver might override this method to provide a more sophisticated idle power off algorithm than the one defined by power management. + * @param currentTime The current time + * @param lastActivity The time of last activity on this device + * @param powerState The device's current power state. + * @result Returns the next time the device should idle off (in seconds, relative to the current time). */ + + virtual SInt32 nextIdleTimeout(AbsoluteTime currentTime, + AbsoluteTime lastActivity, unsigned int powerState); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_5 +/*! @function systemWillShutdown + * @availability Mac OS X v10.5 and later + * @abstract Notifies members of the power plane of system shutdown and restart. + * @discussion This function is called for all members of the power plane in leaf-to-root order. If a subclass needs to wait for a pending I/O, then the call to systemWillShutdown should be postponed until the I/O completes. + * + * Any power managed driver (which has called @link joinPMtree joinPMtree@/link to join the power plane) interested in taking action at system shutdown or restart should override this method. + * @param specifier kIOMessageSystemWillPowerOff or kIOMessageSystemWillRestart. */ + + virtual void systemWillShutdown( IOOptionBits specifier ); +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_6 +/*! @function copyClientWithCategory + * @availability Mac OS X v10.6 and later + * @param category An OSSymbol corresponding to an IOMatchCategory matching property. + * @result Returns a reference to the IOService child with the given category. The result should be released by the caller. + */ + + virtual IOService * copyClientWithCategory( const OSSymbol * category ); +#endif + +public: + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_9 + +/*! @function configureReport + * @abstract configure IOReporting channels + * @availability SPI on OS X v10.9 / iOS 7 and later + * + * @param channels - channels to configure + * @param action - enable/disable/size, etc + * @param result - action-specific returned value + * @param destination - action-specific default destination + */ + virtual IOReturn configureReport(IOReportChannelList *channels, + IOReportConfigureAction action, + void *result, + void *destination); + +/*! @function updateReport + * @abstract request current data for the specified channels + * @availability SPI on OS X 10.9 / iOS 7 and later + * + * @param channels - channels to be updated + * @param action - type/style of update + * @param result - returned details about what was updated + * @param destination - destination for this update (action-specific) + */ + virtual IOReturn updateReport(IOReportChannelList *channels, + IOReportUpdateAction action, + void *result, + void *destination); + +#endif + +private: +#if __LP64__ + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_9 + OSMetaClassDeclareReservedUsed(IOService, 0); + OSMetaClassDeclareReservedUsed(IOService, 1); +#else + OSMetaClassDeclareReservedUnused(IOService, 0); + OSMetaClassDeclareReservedUnused(IOService, 1); +#endif + + OSMetaClassDeclareReservedUnused(IOService, 2); + OSMetaClassDeclareReservedUnused(IOService, 3); + OSMetaClassDeclareReservedUnused(IOService, 4); + OSMetaClassDeclareReservedUnused(IOService, 5); + OSMetaClassDeclareReservedUnused(IOService, 6); + OSMetaClassDeclareReservedUnused(IOService, 7); +#else + OSMetaClassDeclareReservedUsed(IOService, 0); + OSMetaClassDeclareReservedUsed(IOService, 1); + OSMetaClassDeclareReservedUsed(IOService, 2); + OSMetaClassDeclareReservedUsed(IOService, 3); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_5 + OSMetaClassDeclareReservedUsed(IOService, 4); +#else + OSMetaClassDeclareReservedUnused(IOService, 4); +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_6 + OSMetaClassDeclareReservedUsed(IOService, 5); +#else + OSMetaClassDeclareReservedUnused(IOService, 5); +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_9 + OSMetaClassDeclareReservedUsed(IOService, 6); + OSMetaClassDeclareReservedUsed(IOService, 7); +#else + OSMetaClassDeclareReservedUnused(IOService, 6); + OSMetaClassDeclareReservedUnused(IOService, 7); +#endif + +#endif + + OSMetaClassDeclareReservedUnused(IOService, 8); + OSMetaClassDeclareReservedUnused(IOService, 9); + OSMetaClassDeclareReservedUnused(IOService, 10); + OSMetaClassDeclareReservedUnused(IOService, 11); + OSMetaClassDeclareReservedUnused(IOService, 12); + OSMetaClassDeclareReservedUnused(IOService, 13); + OSMetaClassDeclareReservedUnused(IOService, 14); + OSMetaClassDeclareReservedUnused(IOService, 15); + OSMetaClassDeclareReservedUnused(IOService, 16); + OSMetaClassDeclareReservedUnused(IOService, 17); + OSMetaClassDeclareReservedUnused(IOService, 18); + OSMetaClassDeclareReservedUnused(IOService, 19); + OSMetaClassDeclareReservedUnused(IOService, 20); + OSMetaClassDeclareReservedUnused(IOService, 21); + OSMetaClassDeclareReservedUnused(IOService, 22); + OSMetaClassDeclareReservedUnused(IOService, 23); + OSMetaClassDeclareReservedUnused(IOService, 24); + OSMetaClassDeclareReservedUnused(IOService, 25); + OSMetaClassDeclareReservedUnused(IOService, 26); + OSMetaClassDeclareReservedUnused(IOService, 27); + OSMetaClassDeclareReservedUnused(IOService, 28); + OSMetaClassDeclareReservedUnused(IOService, 29); + OSMetaClassDeclareReservedUnused(IOService, 30); + OSMetaClassDeclareReservedUnused(IOService, 31); + OSMetaClassDeclareReservedUnused(IOService, 32); + OSMetaClassDeclareReservedUnused(IOService, 33); + OSMetaClassDeclareReservedUnused(IOService, 34); + OSMetaClassDeclareReservedUnused(IOService, 35); + OSMetaClassDeclareReservedUnused(IOService, 36); + OSMetaClassDeclareReservedUnused(IOService, 37); + OSMetaClassDeclareReservedUnused(IOService, 38); + OSMetaClassDeclareReservedUnused(IOService, 39); + OSMetaClassDeclareReservedUnused(IOService, 40); + OSMetaClassDeclareReservedUnused(IOService, 41); + OSMetaClassDeclareReservedUnused(IOService, 42); + OSMetaClassDeclareReservedUnused(IOService, 43); + OSMetaClassDeclareReservedUnused(IOService, 44); + OSMetaClassDeclareReservedUnused(IOService, 45); + OSMetaClassDeclareReservedUnused(IOService, 46); + OSMetaClassDeclareReservedUnused(IOService, 47); + +public: +/*! @function getState + * @abstract Accessor for IOService state bits, not normally needed or used outside IOService. + * @result State bits for the IOService, eg. kIOServiceInactiveState, kIOServiceRegisteredState. */ + + virtual IOOptionBits getState( void ) const; + +/*! @function isInactive + * @abstract Checks if the IOService object has been terminated, and is in the process of being destroyed. + * @discussion When an IOService object is successfully terminated, it is immediately made inactive, which blocks further attach()es, matching or notifications occuring on the object. It remains inactive until the last client closes, and is then finalized and destroyed. + * @result true if the IOService object has been terminated. */ + + bool isInactive( void ) const; + +/* Stack creation */ + +/*! @function registerService + * @abstract Starts the registration process for a newly discovered IOService object. + * @discussion This function allows an IOService subclass to be published and made available to possible clients, by starting the registration process and delivering notifications to registered clients. The object should be completely setup and ready to field requests from clients before registerService is called. + * @param options The default zero options mask is recommended and should be used in most cases. The registration process is usually asynchronous, with possible driver probing and notification occurring some time later. kIOServiceSynchronous may be passed to carry out the matching and notification process for currently registered clients before returning to the caller. */ + + virtual void registerService( IOOptionBits options = 0 ); + +/*! @function probe + * @abstract During an IOService object's instantiation, probes a matched service to see if it can be used. + * @discussion The registration process for an IOService object (the provider) includes instantiating possible driver clients. The probe method is called in the client instance to check the matched service can be used before the driver is considered to be started. Since matching screens many possible providers, in many cases the probe method can be left unimplemented by IOService subclasses. The client is already attached to the provider when probe is called. + * @param provider The registered IOService object that matches a driver personality's matching dictionary. + * @param score Pointer to the current driver's probe score, which is used to order multiple matching drivers in the same match category. It defaults to the value of the IOProbeScore property in the drivers property table, or kIODefaultProbeScore if none is specified. The probe method may alter the score to affect start order. + * @result An IOService instance or zero when the probe is unsuccessful. In almost all cases the value of this is returned on success. If another IOService object is returned, the probed instance is detached and freed, and the returned instance is used in its stead for start. */ + + virtual LIBKERN_RETURNS_NOT_RETAINED IOService * probe( IOService * provider, + SInt32 * score ); + +/*! @function start + * @abstract During an IOService object's instantiation, starts the IOService object that has been selected to run on the provider. + * @discussion The start method of an IOService instance is called by its provider when it has been selected (due to its probe score and match category) as the winning client. The client is already attached to the provider when start is called.
Implementations of start must call start on their superclass at an appropriate point. If an implementation of start has already called super::start but subsequently determines that it will fail, it must call super::stop to balance the prior call to super::start and prevent reference leaks. + * @result true if the start was successful; false otherwise (which will cause the instance to be detached and usually freed). */ + + virtual bool start( IOService * provider ); + +/*! @function stop + * @abstract During an IOService termination, the stop method is called in its clients before they are detached & it is destroyed. + * @discussion The termination process for an IOService (the provider) will call stop in each of its clients, after they have closed the provider if they had it open, or immediately on termination. */ + + virtual void stop( IOService * provider ); + +/* Open / Close */ + +/*! @function open + * @abstract Requests active access to a provider. + * @discussion IOService provides generic open and close semantics to track clients of a provider that have established an active datapath. The use of open and @link close close@/link, and rules regarding ownership are family defined, and defined by the @link handleOpen handleOpen@/link and @link handleClose handleClose@/link methods in the provider. Some families will limit access to a provider based on its open state. + * @param forClient Designates the client of the provider requesting the open. + * @param options Options for the open. The provider family may implement options for open; IOService defines only kIOServiceSeize to request the device be withdrawn from its current owner. + * @param arg Family specific arguments which are ignored by IOService. + * @result true if the open was successful; false otherwise. */ + + virtual bool open( IOService * forClient, + IOOptionBits options = 0, + void * arg = NULL ); + +/*! @function close + * @abstract Releases active access to a provider. + * @discussion IOService provides generic open and close semantics to track clients of a provider that have established an active datapath. The use of @link open open@/link and close, and rules regarding ownership are family defined, and defined by the @link handleOpen handleOpen@/link and @link handleClose handleClose@/link methods in the provider. + * @param forClient Designates the client of the provider requesting the close. + * @param options Options available for the close. The provider family may implement options for close; IOService defines none. */ + + virtual void close( IOService * forClient, + IOOptionBits options = 0 ); + +/*! @function isOpen + * @abstract Determines whether a specific, or any, client has an IOService object open. + * @discussion Returns the open state of an IOService object with respect to the specified client, or when it is open by any client. + * @param forClient If non-zero, isOpen returns the open state for that client. If zero is passed, isOpen returns the open state for all clients. + * @result true if the specific, or any, client has the IOService object open. */ + + virtual bool isOpen( const IOService * forClient = NULL ) const; + +/*! @function handleOpen + * @abstract Controls the open / close behavior of an IOService object (overrideable by subclasses). + * @discussion IOService calls this method in its subclasses in response to the @link open open@/link method, so the subclass may implement the request. The default implementation provides single owner access to an IOService object via open. The object is locked via @link lockForArbitration lockForArbitration@/link before handleOpen is called. + * @param forClient Designates the client of the provider requesting the open. + * @param options Options for the open, may be interpreted by the implementor of handleOpen. + * @result trueif the open was successful; false otherwise. */ + + virtual bool handleOpen( IOService * forClient, + IOOptionBits options, + void * arg ); + +/*! @function handleClose + * @abstract Controls the open / close behavior of an IOService object (overrideable by subclasses). + * @discussion IOService calls this method in its subclasses in response to the @link close close@/link method, so the subclass may implement the request. The default implementation provides single owner access to an IOService object via @link open open@/link. The object is locked via @link lockForArbitration lockForArbitration@/link before handleClose is called. + * @param forClient Designates the client of the provider requesting the close. + * @param options Options for the close, may be interpreted by the implementor of @link handleOpen handleOpen@/link. */ + + virtual void handleClose( IOService * forClient, + IOOptionBits options ); + +/*! @function handleIsOpen + * @abstract Controls the open / close behavior of an IOService object (overrideable by subclasses). + * @discussion IOService calls this method in its subclasses in response to the @link open open@/link method, so the subclass may implement the request. The default implementation provides single owner access to an IOService object via @link open open@/link. The object is locked via @link lockForArbitration lockForArbitration@/link before handleIsOpen is called. + * @param forClient If non-zero, isOpen returns the open state for that client. If zero is passed, isOpen returns the open state for all clients. + * @result true if the specific, or any, client has the IOService object open. */ + + virtual bool handleIsOpen( const IOService * forClient ) const; + +/* Stacking change */ + +/*! @function terminate + * @abstract Makes an IOService object inactive and begins its destruction. + * @discussion Registering an IOService object informs possible clients of its existance and instantiates drivers that may be used with it; terminate involves the opposite process of informing clients that an IOService object is no longer able to be used and will be destroyed. By default, if any client has the service open, terminate fails. If the kIOServiceRequired flag is passed however, terminate will be successful though further progress in the destruction of the IOService object will not proceed until the last client has closed it. The service will be made inactive immediately upon successful termination, and all its clients will be notified via their @link message message@/link method with a message of type kIOMessageServiceIsTerminated. Both these actions take place on the caller's thread. After the IOService object is made inactive, further matching or attach calls will fail on it. Each client has its @link stop stop@/link method called upon their close of an inactive IOService object , or on its termination if they do not have it open. After stop, @link detach detach@/link is called in each client. When all clients have been detached, the @link finalize finalize@/link method is called in the inactive service. The termination process is inherently asynchronous because it will be deferred until all clients have chosen to close. + * @param options In most cases no options are needed. kIOServiceSynchronous may be passed to cause terminate to not return until the service is finalized. */ + + virtual bool terminate( IOOptionBits options = 0 ); + +/*! @function finalize + * @abstract Finalizes the destruction of an IOService object. + * @discussion The finalize method is called in an inactive (ie. terminated) IOService object after the last client has detached. IOService's implementation will call @link stop stop@/link, @link close close@/link, and @link detach detach@/link on each provider. When finalize returns, the object's retain count will have no references generated by IOService's registration process. + * @param options The options passed to the @link terminate terminate@/link method of the IOService object are passed on to finalize. + * @result true. */ + + virtual bool finalize( IOOptionBits options ); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_10 +/*! @function init + * @abstract Initializes generic IOService data structures (expansion data, etc). */ + virtual bool init( OSDictionary * dictionary = NULL ) APPLE_KEXT_OVERRIDE; + +/*! @function init + * @abstract Initializes generic IOService data structures (expansion data, etc). */ + virtual bool init( IORegistryEntry * from, + const IORegistryPlane * inPlane ) APPLE_KEXT_OVERRIDE; +#endif + +/*! @function free + * @abstract Frees data structures that were allocated when power management was initialized on this service. */ + + virtual void free( void ) APPLE_KEXT_OVERRIDE; + +/*! @function lockForArbitration + * @abstract Locks an IOService object against changes in state or ownership. + * @discussion The registration, termination and open / close functions of IOService use lockForArbtration to single-thread access to an IOService object. lockForArbitration grants recursive access to the same thread. + * @param isSuccessRequired If a request for access to an IOService object should be denied if it is terminated, pass false, otherwise pass true. */ + + virtual bool lockForArbitration( bool isSuccessRequired = true ); + +/*! @function unlockForArbitration + * @abstract Unlocks an IOService obkect after a successful @link lockForArbitration lockForArbitration@/link. + * @discussion A thread granted exclusive access to an IOService object should release it with unlockForArbitration. */ + + virtual void unlockForArbitration( void ); + + + +/*! @function terminateClient + * @abstract Passes a termination up the stack. + * @discussion When an IOService object is made inactive the default behavior is to also make any of its clients that have it as their only provider inactive, in this way recursing the termination up the driver stack. This method allows a terminated IOService object to override this behavior. Note the client may also override this behavior by overriding its @link terminate terminate@/link method. + * @param client The client of the terminated provider. + * @param options Options originally passed to @link terminate terminate@/link, plus kIOServiceRecursing. + * @result result of the terminate request on the client. */ + + virtual bool terminateClient( IOService * client, IOOptionBits options ); + +/* Busy state indicates discovery, matching or termination is in progress */ + +/*! @function getBusyState + * @abstract Returns the busyState of an IOService object. + * @discussion Many activities in IOService are asynchronous. When registration, matching, or termination is in progress on an IOService object, its busyState is increased by one. Change in busyState to or from zero also changes the IOService object's provider's busyState by one, which means that an IOService object is marked busy when any of the above activities is ocurring on it or any of its clients. + * @result The busyState value. */ + + virtual UInt32 getBusyState( void ); + +/*! @function adjustBusy + * @abstract Adjusts the busyState of an IOService object. + * @discussion Applies a delta to an IOService object's busyState. A change in the busyState to or from zero will change the IOService object's provider's busyState by one (in the same direction). + * @param delta The delta to be applied to the IOService object's busyState. */ + + virtual void adjustBusy( SInt32 delta ); + + APPLE_KEXT_COMPATIBILITY_VIRTUAL + IOReturn waitQuiet(mach_timespec_t * timeout) + APPLE_KEXT_DEPRECATED; + +/*! @function waitQuiet + * @abstract Waits for an IOService object's busyState to be zero. + * @discussion Blocks the caller until an IOService object is non busy. + * @param timeout The maximum time to wait in nanoseconds. Default is to wait forever. + * @result Returns an error code if Mach synchronization primitives fail, kIOReturnTimeout, or kIOReturnSuccess. */ + + IOReturn waitQuiet(uint64_t timeout = UINT64_MAX); + +/* Matching */ + +/*! @function matchPropertyTable + * @abstract Allows a registered IOService object to implement family specific matching. + * @discussion All matching on an IOService object will call this method to allow a family writer to implement matching in addition to the generic methods provided by IOService. The implementer should examine the matching dictionary passed to see if it contains properties the family understands for matching, and use them to match with the IOService object if so. Note that since matching is also carried out by other parts of the I/O Kit, the matching dictionary may contain properties the family does not understand - these should not be considered matching failures. + * @param table The dictionary of properties to be matched against. + * @param score Pointer to the current driver's probe score, which is used to order multiple matching drivers in the same match category. It defaults to the value of the IOProbeScore property in the drivers property table, or kIODefaultProbeScore if none is specified. + * @result false if the family considers the matching dictionary does not match in properties it understands; true otherwise. */ + + virtual bool matchPropertyTable( OSDictionary * table, + SInt32 * score ); + + virtual bool matchPropertyTable( OSDictionary * table ); + +/*! @function matchLocation + * @abstract Allows a registered IOService object to direct location matching. + * @discussion By default, a location matching property will be applied to an IOService object's provider. This method allows that behavior to be overridden by families. + * @param client The IOService object at which matching is taking place. + * @result Returns the IOService instance to be used for location matching. */ + + virtual LIBKERN_RETURNS_NOT_RETAINED IOService * matchLocation( IOService * client ); + +/* Resource service */ + +/*! @function publishResource + * @abstract Uses the resource service to publish a property. + * @discussion The resource service uses IOService's matching and notification to allow objects to be published and found by any I/O Kit client by a global name. publishResource makes an object available to anyone waiting for it or looking for it in the future. + * @param key An OSSymbol key that globally identifies the object. + * @param value The object to be published. */ + + static void publishResource( const OSSymbol * key, OSObject * value = NULL ); + static void publishUserResource( const OSSymbol * key, OSObject * value = NULL ); + +/*! @function publishResource + * @abstract Uses the resource service to publish a property. + * @discussion The resource service uses IOService object's matching and notification to allow objects to be published and found by any I/O Kit client by a global name. publishResource makes an object available to anyone waiting for it or looking for it in the future. + * @param key A C string key that globally identifies the object. + * @param value The object to be published. */ + + static void publishResource( const char * key, OSObject * value = NULL ); + virtual bool addNeededResource( const char * key ); + +/* Notifications */ + +/*! @function addNotification + * @abstract Deprecated use addMatchingNotification(). Adds a persistant notification handler to be notified of IOService events. + * @discussion IOService will deliver notifications of changes in state of an IOService object to registered clients. The type of notification is specified by a symbol, for example gIOMatchedNotification or gIOTerminatedNotification, and notifications will only include IOService objects that match the supplied matching dictionary. Notifications are ordered by a priority set with addNotification. When the notification is installed, its handler will be called with each of any currently existing IOService objects that are in the correct state (eg. registered) and match the supplied matching dictionary, avoiding races between finding preexisting and new IOService events. The notification request is identified by an instance of an IONotifier object, through which it can be enabled, disabled, or removed. addNotification consumes a retain count on the matching dictionary when the notification is removed. + * @param type An OSSymbol identifying the type of notification and IOService state: + *
gIOPublishNotification Delivered when an IOService object is registered. + *
gIOFirstPublishNotification Delivered when an IOService object is registered, but only once per IOService instance. Some IOService objects may be reregistered when their state is changed. + *
gIOMatchedNotification Delivered when an IOService object has been matched with all client drivers, and they have been probed and started. + *
gIOFirstMatchNotification Delivered when an IOService object has been matched with all client drivers, but only once per IOService instance. Some IOService objects may be reregistered when their state is changed. + *
gIOWillTerminateNotification Delivered after an IOService object has been terminated, during its finalize stage. Delivered after any matching on the service has finished. + *
gIOTerminatedNotification Delivered immediately when an IOService object has been terminated, making it inactive. + * @param matching A matching dictionary to restrict notifications to only matching IOService objects. The dictionary will be released when the notification is removed, consuming the passed-in reference. + * @param handler A C function callback to deliver notifications. + * @param target An instance reference for the callback's use. + * @param ref A reference constant for the callback's use. + * @param priority A constant ordering all notifications of a each type. + * @result An instance of an IONotifier object that can be used to control or destroy the notification request. */ + + static IONotifier * addNotification( + const OSSymbol * type, OSDictionary * matching, + IOServiceNotificationHandler handler, + void * target, void * ref = NULL, + SInt32 priority = 0 ) + APPLE_KEXT_DEPRECATED; + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_6 +/*! @function addMatchingNotification + * @abstract Adds a persistant notification handler to be notified of IOService events. + * @discussion IOService will deliver notifications of changes in state of an IOService object to registered clients. The type of notification is specified by a symbol, for example gIOMatchedNotification or gIOTerminatedNotification, and notifications will only include IOService objects that match the supplied matching dictionary. Notifications are ordered by a priority set with addNotification. When the notification is installed, its handler will be called with each of any currently existing IOService objects that are in the correct state (eg. registered) and match the supplied matching dictionary, avoiding races between finding preexisting and new IOService events. The notification request is identified by an instance of an IONotifier object, through which it can be enabled, disabled, or removed. addMatchingNotification does not consume a reference on the matching dictionary when the notification is removed, unlike addNotification. + * @param type An OSSymbol identifying the type of notification and IOService state: + *
gIOPublishNotification Delivered when an IOService object is registered. + *
gIOFirstPublishNotification Delivered when an IOService object is registered, but only once per IOService instance. Some IOService objects may be reregistered when their state is changed. + *
gIOMatchedNotification Delivered when an IOService object has been matched with all client drivers, and they have been probed and started. + *
gIOFirstMatchNotification Delivered when an IOService object has been matched with all client drivers, but only once per IOService instance. Some IOService objects may be reregistered when their state is changed. + *
gIOWillTerminateNotification Delivered after an IOService object has been terminated, during its finalize stage. Delivered after any matching on the service has finished. + *
gIOTerminatedNotification Delivered immediately when an IOService object has been terminated, making it inactive. + * @param matching A matching dictionary to restrict notifications to only matching IOService objects. The dictionary is retained while the notification is installed. (Differs from addNotification). + * @param handler A C function callback to deliver notifications. + * @param target An instance reference for the callback's use. + * @param ref A reference constant for the callback's use. + * @param priority A constant ordering all notifications of a each type. + * @result An instance of an IONotifier object that can be used to control or destroy the notification request. */ + + static IONotifier * addMatchingNotification( + const OSSymbol * type, OSDictionary * matching, + IOServiceMatchingNotificationHandler handler, + void * target, void * ref = NULL, + SInt32 priority = 0 ); +#endif + + +#ifdef __BLOCKS__ + static IONotifier * addMatchingNotification( + const OSSymbol * type, OSDictionary * matching, + SInt32 priority, + IOServiceMatchingNotificationHandlerBlock handler); +#endif /* __BLOCKS__ */ + +/*! @function waitForService + * @abstract Deprecated use waitForMatchingService(). Waits for a matching to service to be published. + * @discussion Provides a method of waiting for an IOService object matching the supplied matching dictionary to be registered and fully matched. + * @param matching The matching dictionary describing the desired IOService object. waitForService consumes one reference of the matching dictionary. + * @param timeout The maximum time to wait. + * @result A published IOService object matching the supplied dictionary. */ + + static LIBKERN_RETURNS_NOT_RETAINED IOService * waitForService( + LIBKERN_CONSUMED OSDictionary * matching, + mach_timespec_t * timeout = NULL); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_6 +/*! @function waitForMatchingService + * @abstract Waits for a matching to service to be published. + * @discussion Provides a method of waiting for an IOService object matching the supplied matching dictionary to be registered and fully matched. + * @param matching The matching dictionary describing the desired IOService object. (Does not consume a reference of the matching dictionary - differs from waitForService() which does consume a reference on the matching dictionary.) + * @param timeout The maximum time to wait in nanoseconds. Default is to wait forever. + * @result A published IOService object matching the supplied dictionary. waitForMatchingService returns a reference to the IOService which should be released by the caller. (Differs from waitForService() which does not retain the returned object.) */ + + static IOService * waitForMatchingService( OSDictionary * matching, + uint64_t timeout = UINT64_MAX); +#endif + +/*! @function getMatchingServices + * @abstract Finds the set of current published IOService objects matching a matching dictionary. + * @discussion Provides a method of finding the current set of published IOService objects matching the supplied matching dictionary. + * @param matching The matching dictionary describing the desired IOService objects. + * @result An instance of an iterator over a set of IOService objects. To be released by the caller. */ + + static OSIterator * getMatchingServices( OSDictionary * matching ); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_9 +/*! @function copyMatchingService + * @abstract Finds one of the current published IOService objects matching a matching dictionary. + * @discussion Provides a method to find one member of the set of published IOService objects matching the supplied matching dictionary. + * @param matching The matching dictionary describing the desired IOService object. + * @result The IOService object or NULL. To be released by the caller. */ + + static IOService * copyMatchingService( OSDictionary * matching ); +#endif + +public: +/* Helpers to make matching dictionaries for simple cases, + * they add keys to an existing dictionary, or create one. */ + +/*! @function serviceMatching + * @abstract Creates a matching dictionary, or adds matching properties to an existing dictionary, that specify an IOService class match. + * @discussion A very common matching criteria for IOService object is based on its class. serviceMatching creates a matching dictionary that specifies any IOService object of a class, or its subclasses. The class is specified by name, and an existing dictionary may be passed in, in which case the matching properties will be added to that dictionary rather than creating a new one. + * @param className The class name, as a const C string. Class matching is successful on IOService objects of this class or any subclass. + * @param table If zero, serviceMatching creates a matching dictionary and returns a reference to it, otherwise the matching properties are added to the specified dictionary. + * @result The matching dictionary created, or passed in, is returned on success, or zero on failure. */ + + static OSDictionary * serviceMatching( const char * className, + OSDictionary * table = NULL ); + +/*! @function serviceMatching + * @abstract Creates a matching dictionary, or adds matching properties to an existing dictionary, that specify an IOService class match. + * @discussion A very common matching criteria for IOService object is based on its class. serviceMatching creates a matching dictionary that specifies any IOService of a class, or its subclasses. The class is specified by name, and an existing dictionary may be passed in, in which case the matching properties will be added to that dictionary rather than creating a new one. + * @param className The class name, as an OSString (which includes OSSymbol). Class matching is successful on IOService objects of this class or any subclass. + * @param table If zero, serviceMatching creates a matching dictionary and returns a reference to it, otherwise the matching properties are added to the specified dictionary. + * @result The matching dictionary created, or passed in, is returned on success, or zero on failure. */ + + static OSDictionary * serviceMatching( const OSString * className, + OSDictionary * table = NULL ); + +/*! @function nameMatching + * @abstract Creates a matching dictionary, or adds matching properties to an existing dictionary, that specify an IOService name match. + * @discussion A very common matching criteria for IOService object is based on its name. nameMatching creates a matching dictionary that specifies any IOService object which responds successfully to the @link //apple_ref/cpp/instm/IORegistryEntry/compareName/virtualbool/(OSString*,OSString**) IORegistryEntry::compareName@/link method. An existing dictionary may be passed in, in which case the matching properties will be added to that dictionary rather than creating a new one. + * @param name The service's name, as a const C string. Name matching is successful on IOService objects that respond successfully to the IORegistryEntry::compareName method. + * @param table If zero, nameMatching creates a matching dictionary and returns a reference to it, otherwise the matching properties are added to the specified dictionary. + * @result The matching dictionary created, or passed in, is returned on success, or zero on failure. */ + + static OSDictionary * nameMatching( const char * name, + OSDictionary * table = NULL ); + +/*! @function nameMatching + * @abstract Creates a matching dictionary, or adds matching properties to an existing dictionary, that specify an IOService name match. + * @discussion A very common matching criteria for IOService object is based on its name. nameMatching creates a matching dictionary that specifies any IOService object which responds successfully to the @link //apple_ref/cpp/instm/IORegistryEntry/compareName/virtualbool/(OSString*,OSString**) IORegistryEntry::compareName@/link method. An existing dictionary may be passed in, in which case the matching properties will be added to that dictionary rather than creating a new one. + * @param name The service's name, as an OSString (which includes OSSymbol). Name matching is successful on IOService objects that respond successfully to the IORegistryEntry::compareName method. + * @param table If zero, nameMatching creates a matching dictionary and returns a reference to it, otherwise the matching properties are added to the specified dictionary. + * @result The matching dictionary created, or passed in, is returned on success, or zero on failure. */ + + static OSDictionary * nameMatching( const OSString* name, + OSDictionary * table = NULL ); + +/*! @function resourceMatching + * @abstract Creates a matching dictionary, or adds matching properties to an existing dictionary, that specify a resource service match. + * @discussion IOService maintains a resource service IOResources that allows objects to be published and found globally in the I/O Kit based on a name, using the standard IOService matching and notification calls. + * @param name The resource name, as a const C string. Resource matching is successful when an object by that name has been published with the publishResource method. + * @param table If zero, resourceMatching creates a matching dictionary and returns a reference to it, otherwise the matching properties are added to the specified dictionary. + * @result The matching dictionary created, or passed in, is returned on success, or zero on failure. */ + + static OSDictionary * resourceMatching( const char * name, + OSDictionary * table = NULL ); + +/*! @function resourceMatching + * @abstract Creates a matching dictionary, or adds matching properties to an existing dictionary, that specify a resource service match. + * @discussion IOService maintains a resource service IOResources that allows objects to be published and found globally in the I/O Kit based on a name, using the standard IOService matching and notification calls. + * @param name The resource name, as an OSString (which includes OSSymbol). Resource matching is successful when an object by that name has been published with the publishResource method. + * @param table If zero, resourceMatching creates a matching dictionary and returns a reference to it, otherwise the matching properties are added to the specified dictionary. + * @result The matching dictionary created, or passed in, is returned on success, or zero on failure. */ + + static OSDictionary * resourceMatching( const OSString * name, + OSDictionary * table = NULL ); + + +/*! @function propertyMatching + * @abstract Creates a matching dictionary, or adds matching properties to an existing dictionary, that specify an IOService phandle match. + * @discussion TODO A very common matching criteria for IOService is based on its name. nameMatching will create a matching dictionary that specifies any IOService which respond successfully to the IORegistryEntry method compareName. An existing dictionary may be passed in, in which case the matching properties will be added to that dictionary rather than creating a new one. + * @param key The service's phandle, as a const UInt32. PHandle matching is successful on IOService objects that respond successfully to the IORegistryEntry method compareName. + * @param value The service's phandle, as a const UInt32. PHandle matching is successful on IOService's which respond successfully to the IORegistryEntry method compareName. + * @param table If zero, nameMatching will create a matching dictionary and return a reference to it, otherwise the matching properties are added to the specified dictionary. + * @result The matching dictionary created, or passed in, is returned on success, or zero on failure. */ + + static OSDictionary * propertyMatching( const OSSymbol * key, const OSObject * value, + OSDictionary * table = NULL ); + +/*! @function registryEntryIDMatching + * @abstract Creates a matching dictionary, or adds matching properties to an existing dictionary, that specify a IORegistryEntryID match. + * @discussion registryEntryIDMatching creates a matching dictionary that specifies the IOService object with the assigned registry entry ID (returned by IORegistryEntry::getRegistryEntryID()). An existing dictionary may be passed in, in which case the matching properties will be added to that dictionary rather than creating a new one. + * @param entryID The service's ID. Matching is successful on the IOService object that return that ID from the IORegistryEntry::getRegistryEntryID() method. + * @param table If zero, registryEntryIDMatching creates a matching dictionary and returns a reference to it, otherwise the matching properties are added to the specified dictionary. + * @result The matching dictionary created, or passed in, is returned on success, or zero on failure. */ + + static OSDictionary * registryEntryIDMatching( uint64_t entryID, + OSDictionary * table = NULL ); + + +/*! @function addLocation + * @abstract Adds a location matching property to an existing dictionary. + * @discussion This function creates matching properties that specify the location of a IOService object, as an embedded matching dictionary. This matching will be successful on an IOService object that attached to an IOService object which matches this location matching dictionary. + * @param table The matching properties are added to the specified dictionary, which must be non-zero. + * @result The location matching dictionary created is returned on success, or zero on failure. */ + + static OSDictionary * addLocation( OSDictionary * table ); + +/* Helpers for matching dictionaries. */ + +/*! @function compareProperty + * @abstract Compares a property in a matching dictionary with an IOService object's property table. + * @discussion This is a helper function to aid in implementing @link matchPropertyTable matchPropertyTable@/link. If the property specified by key exists in the matching dictionary, it is compared with a property of the same name in the IOService object's property table. The comparison is performed with the isEqualTo method. If the property does not exist in the matching table, success is returned. If the property exists in the matching dictionary but not the IOService property table, failure is returned. + * @param matching The matching dictionary, which must be non-zero. + * @param key The dictionary key specifying the property to be compared, as a C string. + * @result true if the property does not exist in the matching table. If the property exists in the matching dictionary but not the IOService property table, failure is returned. Otherwise the result of calling the property from the matching dictionary's isEqualTo method with the IOService property as an argument is returned. */ + + virtual bool compareProperty( OSDictionary * matching, + const char * key ); +/*! @function compareProperty + * @abstract Compares a property in a matching dictionary with an IOService object's property table. + * @discussion This is a helper function to aid in implementing @link matchPropertyTable matchPropertyTable@/link. If the property specified by key exists in the matching dictionary, it is compared with a property of the same name in the IOService object's property table. The comparison is performed with the isEqualTo method. If the property does not exist in the matching table, success is returned. If the property exists in the matching dictionary but not the IOService property table, failure is returned. + * @param matching The matching dictionary, which must be non-zero. + * @param key The dictionary key specifying the property to be compared, as an OSString (which includes OSSymbol). + * @result true if the property does not exist in the matching table. If the property exists in the matching dictionary but not the IOService property table, failure is returned. Otherwise the result of calling the property from the matching dictionary's isEqualTo method with the IOService property as an argument is returned. */ + + virtual bool compareProperty( OSDictionary * matching, + const OSString * key ); + +/*! @function compareProperties + * @abstract Compares a set of properties in a matching dictionary with an IOService object's property table. + * @discussion This is a helper function to aid in implementing @link matchPropertyTable matchPropertyTable@/link. A collection of dictionary keys specifies properties in a matching dictionary to be compared, with compareProperty, with an IOService object's property table, if compareProperty returns true for each key, success is returned; otherwise failure. + * @param matching The matching dictionary, which must be non-zero. + * @param keys A collection (eg. OSSet, OSArray, OSDictionary) which should contain OSStrings (or OSSymbols) that specify the property keys to be compared. + * @result Success if compareProperty returns true for each key in the collection; otherwise failure. */ + + virtual bool compareProperties( OSDictionary * matching, + OSCollection * keys ); + +/* Client / provider accessors */ + +/*! @function attach + * @abstract Attaches an IOService client to a provider in the I/O Registry. + * @discussion This function called in an IOService client enters the client into the I/O Registry as a child of the provider in the service plane. The provider must be active or the attach will fail. Multiple attach calls to the same provider are no-ops and return success. A client may be attached to multiple providers. Entering an object into the I/O Registry retains both the client and provider until they are detached. + * @param provider The IOService object which will serve as this object's provider. + * @result false if the provider is inactive or on a resource failure; otherwise true. */ + + virtual bool attach( IOService * provider ); + +/*! @function detach + * @abstract Detaches an IOService client from a provider in the I/O Registry. + * @discussion This function called in an IOService client removes the client as a child of the provider in the service plane of the I/O Registry. If the provider is not a parent of the client this is a no-op, otherwise the I/O Registry releases both the client and provider. + * @param provider The IOService object to detach from. */ + + virtual void detach( IOService * provider ); + +/*! @function getProvider + * @abstract Returns an IOService object's primary provider. + * @discussion This function called in an IOService client will return the provider to which it was first attached. Because the majority of IOService objects have only one provider, this is a useful simplification and also supports caching of the provider when the I/O Registry is unchanged. + * @result The first provider of the client, or zero if the IOService object is not attached into the I/O Registry. The provider is retained while the client is attached, and should not be released by the caller. */ + + virtual IOService * getProvider( void ) const; + +/*! @function getWorkLoop + * @abstract Returns the current work loop or provider->getWorkLoop. + * @discussion This function returns a valid work loop that a client can use to add an IOCommandGate to. The intention is that an IOService client has data that needs to be protected but doesn't want to pay the cost of a dedicated thread. This data has to be accessed from a provider's call-out context as well. So to achieve both of these goals the client creates an IOCommandGate to lock access to his data but he registers it with the provider's work loop, i.e. the work loop which will make the completion call-outs. This avoids a potential deadlock because the work loop gate uses a recursive lock, which allows the same lock to be held multiple times by a single thread. + * @result A work loop, either the current work loop or it walks up the @link getProvider getProvider@/link chain calling getWorkLoop. Eventually it will reach a valid work loop-based driver or the root of the I/O tree, where it will return a system-wide work loop. Returns 0 if it fails to find (or create) a work loop.*/ + + virtual IOWorkLoop * getWorkLoop() const; + +/*! @function getProviderIterator + * @abstract Returns an iterator over an IOService object's providers. + * @discussion For those few IOService objects that obtain service from multiple providers, this method supplies an iterator over a client's providers. + * @result An iterator over the providers of the client, or zero if there is a resource failure. The iterator must be released when the iteration is finished. All objects returned by the iteration are retained while the iterator is valid, though they may no longer be attached during the iteration. */ + + virtual OSIterator * getProviderIterator( void ) const; + +/*! @function getOpenProviderIterator + * @abstract Returns an iterator over an client's providers that are currently opened by the client. + * @discussion For those few IOService objects that obtain service from multiple providers, this method supplies an iterator over a client's providers, locking each in turn with @link lockForArbitration lockForArbitration@/link and returning those that have been opened by the client. + * @result An iterator over the providers the client has open, or zero if there is a resource failure. The iterator must be released when the iteration is finished. All objects returned by the iteration are retained while the iterator is valid, and the current entry in the iteration is locked with lockForArbitration, protecting it from state changes. */ + + virtual OSIterator * getOpenProviderIterator( void ) const; + +/*! @function getClient + * @abstract Returns an IOService object's primary client. + * @discussion This function called in an IOService provider will return the first client to attach to it. For IOService objects which have only only one client, this may be a useful simplification. + * @result The first client of the provider, or zero if the IOService object is not attached into the I/O Registry. The client is retained while it is attached, and should not be released by the caller. */ + + virtual IOService * getClient( void ) const; + +/*! @function getClientIterator + * @abstract Returns an iterator over an IOService object's clients. + * @discussion For IOService objects that may have multiple clients, this method supplies an iterator over a provider's clients. + * @result An iterator over the clients of the provider, or zero if there is a resource failure. The iterator must be released when the iteration is finished. All objects returned by the iteration are retained while the iterator is valid, though they may no longer be attached during the iteration. */ + + virtual OSIterator * getClientIterator( void ) const; + +/*! @function getOpenClientIterator + * @abstract Returns an iterator over a provider's clients that currently have opened the provider. + * @discussion For IOService objects that may have multiple clients, this method supplies an iterator over a provider's clients, locking each in turn with @link lockForArbitration lockForArbitration@/link and returning those that have opened the provider. + * @result An iterator over the clients that have opened the provider, or zero if there is a resource failure. The iterator must be released when the iteration is finished. All objects returned by the iteration are retained while the iterator is valid, and the current entry in the iteration is locked with lockForArbitration, protecting it from state changes. */ + + virtual OSIterator * getOpenClientIterator( void ) const; + +/*! @function callPlatformFunction + * @abstract Calls the platform function with the given name. + * @discussion The platform expert or other drivers may implement various functions to control hardware features. callPlatformFunction allows any IOService object to access these functions. Normally callPlatformFunction is called on a service's provider. The provider services the request or passes it to its provider. The system's IOPlatformExpert subclass catches functions it knows about and redirects them into other parts of the service plane. If the IOPlatformExpert subclass cannot execute the function, the base class is called. The IOPlatformExpert base class attempts to find a service to execute the function by looking up the function name in an IOResources name space. A service may publish a service using publishResource(functionName, this). If no service can be found to execute the function an error is returned. + * @param functionName Name of the function to be called. When functionName is a C string, callPlatformFunction converts the C string to an OSSymbol and calls the OSSymbol version of callPlatformFunction. This process can block and should not be used from an interrupt context. + * @param waitForFunction If true, callPlatformFunction will not return until the function has been called. + * @result An IOReturn code; kIOReturnSuccess if the function was successfully executed, kIOReturnUnsupported if a service to execute the function could not be found. Other return codes may be returned by the function.*/ + + virtual IOReturn callPlatformFunction( const OSSymbol * functionName, + bool waitForFunction, + void *param1, void *param2, + void *param3, void *param4 ); + + virtual IOReturn callPlatformFunction( const char * functionName, + bool waitForFunction, + void *param1, void *param2, + void *param3, void *param4 ); + + +/* Some accessors */ + +/*! @function getPlatform + * @abstract Returns a pointer to the platform expert instance for the computer. + * @discussion This method provides an accessor to the platform expert instance for the computer. + * @result A pointer to the IOPlatformExpert instance. It should not be released by the caller. */ + + static IOPlatformExpert * getPlatform( void ); + +/*! @function getPMRootDomain + * @abstract Returns a pointer to the power management root domain instance for the computer. + * @discussion This method provides an accessor to the power management root domain instance for the computer. + * @result A pointer to the power management root domain instance. It should not be released by the caller. */ + + static class IOPMrootDomain * getPMRootDomain( void ); + +/*! @function getServiceRoot + * @abstract Returns a pointer to the root of the service plane. + * @discussion This method provides an accessor to the root of the service plane for the computer. + * @result A pointer to the IOService instance at the root of the service plane. It should not be released by the caller. */ + + static IOService * getServiceRoot( void ); + +/*! @function getResourceService + * @abstract Returns a pointer to the IOResources service. + * @discussion IOService maintains a resource service IOResources that allows objects to be published and found globally in the I/O Kit based on a name, using the standard IOService matching and notification calls. + * @result A pointer to the IOResources instance. It should not be released by the caller. */ + + static IOService * getResourceService( void ); + +/* Allocate resources for a matched service */ + +/*! @function getResources + * @abstract Allocates any needed resources for a published IOService object before clients attach. + * @discussion This method is called during the registration process for an IOService object if there are successful driver matches, before any clients attach. It allows for lazy allocation of resources to an IOService object when a matching driver is found. + * @result An IOReturn code; kIOReturnSuccess is necessary for the IOService object to be successfully used, otherwise the registration process for the object is halted. */ + + virtual IOReturn getResources( void ); + +/* Device memory accessors */ + +/*! @function getDeviceMemoryCount + * @abstract Returns a count of the physical memory ranges available for a device. + * @discussion This method returns the count of physical memory ranges, each represented by an IODeviceMemory instance, that have been allocated for a memory mapped device. + * @result An integer count of the number of ranges available. */ + + virtual IOItemCount getDeviceMemoryCount( void ); + +/*! @function getDeviceMemoryWithIndex + * @abstract Returns an instance of IODeviceMemory representing one of a device's memory mapped ranges. + * @discussion This method returns a pointer to an instance of IODeviceMemory for the physical memory range at the given index for a memory mapped device. + * @param index An index into the array of ranges assigned to the device. + * @result A pointer to an instance of IODeviceMemory, or zero if the index is beyond the count available. The IODeviceMemory is retained by the provider, so is valid while attached, or while any mappings to it exist. It should not be released by the caller. See also @link mapDeviceMemoryWithIndex mapDeviceMemoryWithIndex@/link, which creates a device memory mapping. */ + + virtual IODeviceMemory * getDeviceMemoryWithIndex( unsigned int index ); + +/*! @function mapDeviceMemoryWithIndex + * @abstract Maps a physical range of a device. + * @discussion This method creates a mapping for the IODeviceMemory at the given index, with IODeviceMemory::map(options). The mapping is represented by the returned instance of IOMemoryMap, which should not be released until the mapping is no longer required. + * @param index An index into the array of ranges assigned to the device. + * @result An instance of IOMemoryMap, or zero if the index is beyond the count available. The mapping should be released only when access to it is no longer required. */ + + virtual IOMemoryMap * mapDeviceMemoryWithIndex( unsigned int index, + IOOptionBits options = 0 ); + +/*! @function getDeviceMemory + * @abstract Returns the array of IODeviceMemory objects representing a device's memory mapped ranges. + * @discussion This method returns an array of IODeviceMemory objects representing the physical memory ranges allocated to a memory mapped device. + * @result An OSArray of IODeviceMemory objects, or zero if none are available. The array is retained by the provider, so is valid while attached. */ + + virtual OSArray * getDeviceMemory( void ); + +/*! @function setDeviceMemory + * @abstract Sets the array of IODeviceMemory objects representing a device's memory mapped ranges. + * @discussion This method sets an array of IODeviceMemory objects representing the physical memory ranges allocated to a memory mapped device. + * @param array An OSArray of IODeviceMemory objects, or zero if none are available. The array will be retained by the object. */ + + virtual void setDeviceMemory( OSArray * array ); + +/* Interrupt accessors */ + +/*! @function registerInterrupt + * @abstract Registers a C function interrupt handler for a device supplying interrupts. + * @discussion This method installs a C function interrupt handler to be called at primary interrupt time for a device's interrupt. Only one handler may be installed per interrupt source. IOInterruptEventSource provides a work loop based abstraction for interrupt delivery that may be more appropriate for work loop based drivers. + * @param source The index of the interrupt source in the device. + * @param target An object instance to be passed to the interrupt handler. + * @param handler The C function to be called at primary interrupt time when the interrupt occurs. The handler should process the interrupt by clearing the interrupt, or by disabling the source. + * @param refCon A reference constant for the handler's use. + * @result An IOReturn code.
kIOReturnNoInterrupt is returned if the source is not valid; kIOReturnNoResources is returned if the interrupt already has an installed handler. */ + + virtual IOReturn registerInterrupt(int source, OSObject *target, + IOInterruptAction handler, + void *refCon = NULL); + +#ifdef __BLOCKS__ +/*! @function registerInterrupt + * @abstract Registers a block handler for a device supplying interrupts. + * @discussion This method installs a C function interrupt handler to be called at primary interrupt time for a device's interrupt. Only one handler may be installed per interrupt source. IOInterruptEventSource provides a work loop based abstraction for interrupt delivery that may be more appropriate for work loop based drivers. + * @param source The index of the interrupt source in the device. + * @param target An object instance to be passed to the interrupt handler. + * @param handler The block to be invoked at primary interrupt time when the interrupt occurs. The handler should process the interrupt by clearing the interrupt, or by disabling the source. + * @result An IOReturn code.
kIOReturnNoInterrupt is returned if the source is not valid; kIOReturnNoResources is returned if the interrupt already has an installed handler. */ + + IOReturn registerInterruptBlock(int source, OSObject *target, + IOInterruptActionBlock handler); +#endif /* __BLOCKS__ */ + +/*! @function unregisterInterrupt + * @abstract Removes a C function interrupt handler for a device supplying hardware interrupts. + * @discussion This method removes a C function interrupt handler previously installed with @link registerInterrupt registerInterrupt@/link. + * @param source The index of the interrupt source in the device. + * @result An IOReturn code (kIOReturnNoInterrupt is returned if the source is not valid). */ + + virtual IOReturn unregisterInterrupt(int source); + +/*! @function addInterruptStatistics + * @abstract Adds a statistics object to the IOService for the given interrupt. + * @discussion This method associates a set of statistics and a reporter for those statistics with an interrupt for this IOService, so that we can interrogate the IOService for statistics pertaining to that interrupt. + * @param statistics The IOInterruptAccountingData container we wish to associate the IOService with. + * @param source The index of the interrupt source in the device. */ + IOReturn addInterruptStatistics(IOInterruptAccountingData * statistics, int source); + +/*! @function removeInterruptStatistics + * @abstract Removes any statistics from the IOService for the given interrupt. + * @discussion This method disassociates any IOInterruptAccountingData container we may have for the given interrupt from the IOService; this indicates that the the interrupt target (at the moment, likely an IOInterruptEventSource) is being destroyed. + * @param source The index of the interrupt source in the device. */ + IOReturn removeInterruptStatistics(int source); + +/*! @function getInterruptType + * @abstract Returns the type of interrupt used for a device supplying hardware interrupts. + * @param source The index of the interrupt source in the device. + * @param interruptType The interrupt type for the interrupt source will be stored here by getInterruptType.
kIOInterruptTypeEdge will be returned for edge-trigggered sources.
kIOInterruptTypeLevel will be returned for level-trigggered sources. + * @result An IOReturn code (kIOReturnNoInterrupt is returned if the source is not valid). */ + + virtual IOReturn getInterruptType(int source, int *interruptType); + +/*! @function enableInterrupt + * @abstract Enables a device interrupt. + * @discussion It is the caller's responsiblity to keep track of the enable state of the interrupt source. + * @param source The index of the interrupt source in the device. + * @result An IOReturn code (kIOReturnNoInterrupt is returned if the source is not valid). */ + + virtual IOReturn enableInterrupt(int source); + +/*! @function disableInterrupt + * @abstract Synchronously disables a device interrupt. + * @discussion If the interrupt routine is running, the call will block until the routine completes. It is the caller's responsiblity to keep track of the enable state of the interrupt source. + * @param source The index of the interrupt source in the device. + * @result An IOReturn code (kIOReturnNoInterrupt is returned if the source is not valid). */ + + virtual IOReturn disableInterrupt(int source); + +/*! @function causeInterrupt + * @abstract Causes a device interrupt to occur. + * @discussion Emulates a hardware interrupt, to be called from task level. + * @param source The index of the interrupt source in the device. + * @result An IOReturn code (kIOReturnNoInterrupt is returned if the source is not valid). */ + + virtual IOReturn causeInterrupt(int source); + +/*! @function requestProbe + * @abstract Requests that hardware be re-scanned for devices. + * @discussion For bus families that do not usually detect device addition or removal, this method represents an external request (eg. from a utility application) to rescan and publish or remove found devices. + * @param options Family defined options, not interpreted by IOService. + * @result An IOReturn code. */ + + virtual IOReturn requestProbe( IOOptionBits options ); + +/* Generic API for non-data-path upstream calls */ + +/*! @function message + * @abstract Receives a generic message delivered from an attached provider. + * @discussion A provider may deliver messages via the message method to its clients informing them of state changes, such as kIOMessageServiceIsTerminated or kIOMessageServiceIsSuspended. Certain messages are defined by the I/O Kit in IOMessage.h while others may be family dependent. This method is implemented in the client to receive messages. + * @param type A type defined in IOMessage.h or defined by the provider family. + * @param provider The provider from which the message originates. + * @param argument An argument defined by the provider family, not used by IOService. + * @result An IOReturn code defined by the message type. */ + + virtual IOReturn message( UInt32 type, IOService * provider, + void * argument = NULL ); + +/*! @function messageClient + * @abstract Sends a generic message to an attached client. + * @discussion A provider may deliver messages via the @link message message@/link method to its clients informing them of state changes, such as kIOMessageServiceIsTerminated or kIOMessageServiceIsSuspended. Certain messages are defined by the I/O Kit in IOMessage.h while others may be family dependent. This method may be called in the provider to send a message to the specified client, which may be useful for overrides. + * @param messageType A type defined in IOMessage.h or defined by the provider family. + * @param client A client of the IOService to send the message. + * @param messageArgument An argument defined by the provider family, not used by IOService. + * @param argSize Specifies the size of messageArgument, in bytes. If argSize is non-zero, messageArgument is treated as a pointer to argSize bytes of data. If argSize is 0 (the default), messageArgument is treated as an ordinal and passed by value. + * @result The return code from the client message call. */ + + virtual IOReturn messageClient( UInt32 messageType, OSObject * client, + void * messageArgument = NULL, vm_size_t argSize = 0 ); + +/*! @function messageClients + * @abstract Sends a generic message to all attached clients. + * @discussion A provider may deliver messages via the @link message message@/link method to its clients informing them of state changes, such as kIOMessageServiceIsTerminated or kIOMessageServiceIsSuspended. Certain messages are defined by the I/O Kit in IOMessage.h while others may be family dependent. This method may be called in the provider to send a message to all the attached clients, via the @link messageClient messageClient@/link method. + * @param type A type defined in IOMessage.h or defined by the provider family. + * @param argument An argument defined by the provider family, not used by IOService. + * @param argSize Specifies the size of argument, in bytes. If argSize is non-zero, argument is treated as a pointer to argSize bytes of data. If argSize is 0 (the default), argument is treated as an ordinal and passed by value. + * @result Any non-kIOReturnSuccess return codes returned by the clients, or kIOReturnSuccess if all return kIOReturnSuccess. */ + + virtual IOReturn messageClients( UInt32 type, + void * argument = NULL, vm_size_t argSize = 0 ); + + virtual IONotifier * registerInterest( const OSSymbol * typeOfInterest, + IOServiceInterestHandler handler, + void * target, void * ref = NULL ); + +#ifdef __BLOCKS__ + IONotifier * registerInterest(const OSSymbol * typeOfInterest, + IOServiceInterestHandlerBlock handler); +#endif /* __BLOCKS__ */ + + virtual void applyToProviders( IOServiceApplierFunction applier, + void * context ); + + virtual void applyToClients( IOServiceApplierFunction applier, + void * context ); + + virtual void applyToInterested( const OSSymbol * typeOfInterest, + OSObjectApplierFunction applier, + void * context ); + + virtual IOReturn acknowledgeNotification( IONotificationRef notification, + IOOptionBits response ); + +/* User client create */ + +/*! @function newUserClient + * @abstract Creates a connection for a non kernel client. + * @discussion A non kernel client may request a connection be opened via the @link //apple_ref/c/func/IOServiceOpen IOServiceOpen@/link library function, which will call this method in an IOService object. The rules and capabilities of user level clients are family dependent, and use the functions of the IOUserClient class for support. IOService's implementation returns kIOReturnUnsupported, so any family supporting user clients must implement this method. + * @param owningTask The Mach task of the client thread in the process of opening the user client. Note that in Mac OS X, each process is based on a Mach task and one or more Mach threads. For more information on the composition of a Mach task and its relationship with Mach threads, see {@linkdoc //apple_ref/doc/uid/TP30000905-CH209-TPXREF103 "Tasks and Threads"}. + * @param securityID A token representing the access level for the task. + * @param type A constant specifying the type of connection to be created, specified by the caller of @link //apple_ref/c/func/IOServiceOpen IOServiceOpen@/link and interpreted only by the family. + * @param handler An instance of an IOUserClient object to represent the connection, which will be released when the connection is closed, or zero if the connection was not opened. + * @param properties A dictionary of additional properties for the connection. + * @result A return code to be passed back to the caller of IOServiceOpen. */ + + virtual IOReturn newUserClient( task_t owningTask, void * securityID, + UInt32 type, OSDictionary * properties, + LIBKERN_RETURNS_RETAINED IOUserClient ** handler ); + + virtual IOReturn newUserClient( task_t owningTask, void * securityID, + UInt32 type, + LIBKERN_RETURNS_RETAINED IOUserClient ** handler ); + +/* Return code utilities */ + +/*! @function stringFromReturn + * @abstract Supplies a programmer-friendly string from an IOReturn code. + * @discussion Strings are available for the standard return codes in IOReturn.h in IOService, while subclasses may implement this method to interpret family dependent return codes. + * @param rtn The IOReturn code. + * @result A pointer to a constant string, or zero if the return code is unknown. */ + + virtual const char * stringFromReturn( IOReturn rtn ); + +/*! @function errnoFromReturn + * @abstract Translates an IOReturn code to a BSD errno. + * @discussion BSD defines its own return codes for its functions in sys/errno.h, and I/O Kit families may need to supply compliant results in BSD shims. Results are available for the standard return codes in IOReturn.h in IOService, while subclasses may implement this method to interpret family dependent return codes. + * @param rtn The IOReturn code. + * @result The BSD errno or EIO if unknown. */ + + virtual int errnoFromReturn( IOReturn rtn ); + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/* * * * * * * * * * end of IOService API * * * * * * * */ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* for IOInterruptController implementors */ + + int _numInterruptSources; + IOInterruptSource *_interruptSources; + +/* overrides */ + virtual bool serializeProperties( OSSerialize * s ) const APPLE_KEXT_OVERRIDE; + + void requireMaxBusStall(UInt32 ns); + void requireMaxInterruptDelay(uint32_t ns); + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/* * * * * * * * * * * * Internals * * * * * * * * * * * */ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + +private: + APPLE_KEXT_COMPATIBILITY_VIRTUAL + bool checkResources( void ); + APPLE_KEXT_COMPATIBILITY_VIRTUAL + bool checkResource( OSObject * matching ); + + APPLE_KEXT_COMPATIBILITY_VIRTUAL + void probeCandidates( OSOrderedSet * matches ); + APPLE_KEXT_COMPATIBILITY_VIRTUAL + bool startCandidate( IOService * candidate ); + +public: + APPLE_KEXT_COMPATIBILITY_VIRTUAL + IOService * getClientWithCategory( const OSSymbol * category ) + APPLE_KEXT_DEPRECATED; +// copyClientWithCategory is the public replacement + +private: + APPLE_KEXT_COMPATIBILITY_VIRTUAL + bool passiveMatch( OSDictionary * matching, bool changesOK = false); + APPLE_KEXT_COMPATIBILITY_VIRTUAL + void startMatching( IOOptionBits options = 0 ); + APPLE_KEXT_COMPATIBILITY_VIRTUAL + void doServiceMatch( IOOptionBits options ); + APPLE_KEXT_COMPATIBILITY_VIRTUAL + void doServiceTerminate( IOOptionBits options ); + +private: + + bool matchPassive(OSDictionary * table, uint32_t options); + bool matchInternal(OSDictionary * table, uint32_t options, unsigned int * did); + static bool instanceMatch(const OSObject * entry, void * context); + + static OSObject * copyExistingServices( OSDictionary * matching, + IOOptionBits inState, IOOptionBits options = 0 ); + + static IONotifier * setNotification( + const OSSymbol * type, OSDictionary * matching, + IOServiceMatchingNotificationHandler handler, + void * target, void * ref, + SInt32 priority = 0 ); + + static IONotifier * doInstallNotification( + const OSSymbol * type, OSDictionary * matching, + IOServiceMatchingNotificationHandler handler, + void * target, void * ref, + SInt32 priority, OSIterator ** existing ); + + static bool syncNotificationHandler( void * target, void * ref, + IOService * newService, IONotifier * notifier ); + + APPLE_KEXT_COMPATIBILITY_VIRTUAL + void deliverNotification( const OSSymbol * type, + IOOptionBits orNewState, IOOptionBits andNewState ); + + OSArray * copyNotifiers(const OSSymbol * type, + IOOptionBits orNewState, IOOptionBits andNewState); + + bool invokeNotifiers(OSArray * willSend[]); + bool invokeNotifier( class _IOServiceNotifier * notify ); + + APPLE_KEXT_COMPATIBILITY_VIRTUAL + void unregisterAllInterest( void ); + + APPLE_KEXT_COMPATIBILITY_VIRTUAL + IOReturn waitForState( UInt32 mask, UInt32 value, + mach_timespec_t * timeout = NULL ); + + IOReturn waitForState( UInt32 mask, UInt32 value, uint64_t timeout ); + + UInt32 _adjustBusy( SInt32 delta ); + + bool terminatePhase1( IOOptionBits options = 0 ); + void scheduleTerminatePhase2( IOOptionBits options = 0 ); + void scheduleStop( IOService * provider ); + + static void waitToBecomeTerminateThread( void ); + static void __attribute__((__noreturn__)) terminateThread( void * arg, wait_result_t unused ); + static void terminateWorker( IOOptionBits options ); + static void actionWillTerminate( IOService * victim, IOOptionBits options, + OSArray * doPhase2List, bool, void * ); + static void actionDidTerminate( IOService * victim, IOOptionBits options, + void *, void *, void *); + + static void actionWillStop( IOService * victim, IOOptionBits options, + void *, void *, void *); + static void actionDidStop( IOService * victim, IOOptionBits options, + void *, void *, void *); + + static void actionFinalize( IOService * victim, IOOptionBits options, + void *, void *, void *); + static void actionStop( IOService * client, IOService * provider, + void *, void *, void *); + + APPLE_KEXT_COMPATIBILITY_VIRTUAL + IOReturn resolveInterrupt(IOService *nub, int source); + APPLE_KEXT_COMPATIBILITY_VIRTUAL + IOReturn lookupInterrupt( + int source, bool resolve, + LIBKERN_RETURNS_NOT_RETAINED IOInterruptController * + *interruptController); + + +/* power management */ +public: + +/*! @function PMinit + * @abstract Initializes power management for a driver. + * @discussion PMinit allocates and initializes the power management instance variables, and it should be called before accessing those variables or calling the power management methods. This method should be called inside the driver's start routine and must be paired with a call to @link PMstop PMstop@/link. + * Most calls to PMinit are followed by calls to @link joinPMtree joinPMtree@/link and @link registerPowerDriver registerPowerDriver@/link. */ + + virtual void PMinit( void ); + +/*! @function PMstop + * @abstract Stop power managing the driver. + * @discussion Removes the driver from the power plane and stop its power management. This method is synchronous against any power management method invocations (e.g. setPowerState or setAggressiveness), so when this method returns it is guaranteed those power management methods will not be entered. Driver should not call any power management methods after this call. + * Calling PMstop cleans up for the three power management initialization calls: @link PMinit PMinit@/link, @link joinPMtree joinPMtree@/link, and @link registerPowerDriver registerPowerDriver@/link. */ + + virtual void PMstop( void ); + +/*! @function joinPMtree + * @abstract Joins the driver into the power plane of the I/O Registry. + * @discussion A driver uses this method to call its nub when initializing (usually in its start routine after calling @link PMinit PMinit@/link), to be attached into the power management hierarchy (i.e., the power plane). A driver usually calls this method on the driver for the device that provides it power (this is frequently the nub). + * Before this call returns, the caller will probably be called at @link setPowerParent setPowerParent@/link and @link setAggressiveness setAggressiveness@/link and possibly at @link addPowerChild addPowerChild@/link as it is added to the hierarchy. This method may be overridden by a nub subclass. + * @param driver The driver to be added to the power plane, usually this. */ + + virtual void joinPMtree( IOService * driver ); + +/*! @function registerPowerDriver + * @abstract Registers a set of power states that the driver supports. + * @discussion A driver defines its array of supported power states with power management in its power management initialization (its start routine). If successful, power management will call the driver to instruct it to change its power state through @link setPowerState setPowerState@/link. + * Most drivers do not need to override registerPowerDriver. A nub may override registerPowerDriver if it needs to arrange its children in the power plane differently than the default placement, but this is uncommon. + * @param controllingDriver A pointer to the calling driver, usually this. + * @param powerStates A driver-defined array of power states that the driver and device support. Power states are defined in pwr_mgt/IOPMpowerState.h. + * @param numberOfStates The number of power states in the array. + * @result IOPMNoErr. All errors are logged via kprintf. */ + + virtual IOReturn registerPowerDriver( + IOService * controllingDriver, + IOPMPowerState * powerStates, + unsigned long numberOfStates ); + +/*! @function registerInterestedDriver + * @abstract Allows an IOService object to register interest in the changing power state of a power-managed IOService object. + * @discussion Call registerInterestedDriver on the IOService object you are interested in receiving power state messages from, and pass a pointer to the interested driver (this) as an argument. + * The interested driver is retained until the power interest is removed by calling deRegisterInterestedDriver. + * The interested driver should override @link powerStateWillChangeTo powerStateWillChangeTo@/link and @link powerStateDidChangeTo powerStateDidChangeTo@/link to receive these power change messages. + * Interested drivers must acknowledge power changes in powerStateWillChangeTo or powerStateDidChangeTo, either via return value or later calls to @link acknowledgePowerChange acknowledgePowerChange@/link. + * @param theDriver The driver of interest adds this pointer to the list of interested drivers. It informs drivers on this list before and after the power change. + * @result Flags describing the capability of the device in its current power state. If the current power state is not yet defined, zero is returned (this is the case when the driver is not yet in the power domain hierarchy or hasn't fully registered with power management yet). */ + + APPLE_KEXT_COMPATIBILITY_VIRTUAL + IOPMPowerFlags registerInterestedDriver( IOService * theDriver ); + +/*! @function deRegisterInterestedDriver + * @abstract De-registers power state interest from a previous call to registerInterestedDriver. + * @discussion The retain from registerInterestedDriver is released. This method is synchronous against any powerStateWillChangeTo or powerStateDidChangeTo call targeting the interested driver, so when this method returns it is guaranteed those interest handlers will not be entered. + * Most drivers do not need to override deRegisterInterestedDriver. + * @param theDriver The interested driver previously passed into @link registerInterestedDriver registerInterestedDriver@/link. + * @result A return code that can be ignored by the caller. */ + + APPLE_KEXT_COMPATIBILITY_VIRTUAL + IOReturn deRegisterInterestedDriver( IOService * theDriver ); + +/*! @function acknowledgePowerChange + * @abstract Acknowledges an in-progress power state change. + * @discussion When power management informs an interested object (via @link powerStateWillChangeTo powerStateWillChangeTo@/link or @link powerStateDidChangeTo powerStateDidChangeTo@/link), the object can return an immediate acknowledgement via a return code, or it may return an indication that it will acknowledge later by calling acknowledgePowerChange. + * Interested objects are those that have registered as interested drivers, as well as power plane children of the power changing driver. A driver that calls @link registerInterestedDriver registerInterestedDriver@/link must call acknowledgePowerChange, or use an immediate acknowledgement return from powerStateWillChangeTo or powerStateDidChangeTo. + * @param whichDriver A pointer to the calling driver. The called object tracks all interested parties to ensure that all have acknowledged the power state change. + * @result IOPMNoErr. */ + + APPLE_KEXT_COMPATIBILITY_VIRTUAL + IOReturn acknowledgePowerChange( IOService * whichDriver ); + +/*! @function acknowledgeSetPowerState +* @abstract Acknowledges the belated completion of a driver's setPowerState power state change. +* @discussion After power management instructs a driver to change its state via @link setPowerState setPowerState@/link, that driver must acknowledge the change when its device has completed its transition. The acknowledgement may be immediate, via a return code from setPowerState, or delayed, via this call to acknowledgeSetPowerState. +* Any driver that does not return kIOPMAckImplied from its setPowerState implementation must later call acknowledgeSetPowerState. +* @result IOPMNoErr. */ + + APPLE_KEXT_COMPATIBILITY_VIRTUAL + IOReturn acknowledgeSetPowerState( void ); + +/*! @function requestPowerDomainState + * @abstract Tells a driver to adjust its power state. + * @discussion This call is handled internally by power management. It is not intended to be overridden or called by drivers. */ + + virtual IOReturn requestPowerDomainState( + IOPMPowerFlags desiredState, + IOPowerConnection * whichChild, + unsigned long specificationFlags ); + +/*! @function makeUsable + * @abstract Requests that a device become usable. + * @discussion This method is called when some client of a device (or the device's own driver) is asking for the device to become usable. Power management responds by telling the object upon which this method is called to change to its highest power state. + * makeUsable is implemented using @link changePowerStateToPriv changePowerStateToPriv@/link. Subsequent requests for lower power, such as from changePowerStateToPriv, will pre-empt this request. + * @result A return code that can be ignored by the caller. */ + + APPLE_KEXT_COMPATIBILITY_VIRTUAL + IOReturn makeUsable( void ); + +/*! @function temporaryPowerClampOn + * @abstract A driver calls this method to hold itself in the highest power state until it has children. + * @discussion Use temporaryPowerClampOn to hold your driver in its highest power state while waiting for child devices to attach. After children have attached, the clamp is released and the device's power state is controlled by the children's requirements. + * @result A return code that can be ignored by the caller. */ + + APPLE_KEXT_COMPATIBILITY_VIRTUAL + IOReturn temporaryPowerClampOn( void ); + +/*! @function changePowerStateTo + * @abstract Sets a driver's power state. + * @discussion This function is one of several that are used to set a driver's power state. In most circumstances, however, you should call @link changePowerStateToPriv changePowerStateToPriv@/link instead. + * Calls to changePowerStateTo, changePowerStateToPriv, and a driver's power children all affect the power state of a driver. For legacy design reasons, they have overlapping functionality. Although you should call changePowerStateToPriv to change your device's power state, you might need to call changePowerStateTo in the following circumstances: + *
  • If a driver will be using changePowerStateToPriv to change its power state, it should call changePowerStateTo(0) in its start routine to eliminate the influence changePowerStateTo has on power state calculations. + *
  • Call changePowerStateTo in conjunction with @link setIdleTimerPeriod setIdleTimerPeriod@/link and @link activityTickle activityTickle@/link to idle a driver into a low power state. For a driver with 3 power states, for example, changePowerStateTo(1) sets a minimum level of power state 1, such that the idle timer period may not set your device's power any lower than state 1.
+ * @param ordinal The number of the desired power state in the power state array. + * @result A return code that can be ignored by the caller. */ + + APPLE_KEXT_COMPATIBILITY_VIRTUAL + IOReturn changePowerStateTo( unsigned long ordinal ); + +/*! @function currentCapability + * @abstract Finds out the capability of a device's current power state. + * @result A copy of the capabilityFlags field for the current power state in the power state array. */ + + APPLE_KEXT_COMPATIBILITY_VIRTUAL + IOPMPowerFlags currentCapability( void ); + +/*! @function currentPowerConsumption + * @abstract Finds out the current power consumption of a device. + * @discussion Most Mac OS X power managed drivers do not report their power consumption via the staticPower field. Thus this call will not accurately reflect power consumption for most drivers. + * @result A copy of the staticPower field for the current power state in the power state array. */ + + APPLE_KEXT_COMPATIBILITY_VIRTUAL + unsigned long currentPowerConsumption( void ); + +/*! @function activityTickle + * @abstract Informs power management when a power-managed device is in use, so that power management can track when it is idle and adjust its power state accordingly. + * @discussion The activityTickle method is provided for objects in the system (or for the driver itself) to tell a driver that its device is being used. + * The IOService superclass can manage idleness determination with a simple idle timer mechanism and this activityTickle call. To start this up, the driver calls its superclass's setIdleTimerPeriod. This starts a timer for the time interval specified in the call. When the timer expires, the superclass checks to see if there has been any activity since the last timer expiration. (It checks to see if activityTickle has been called). If there has been activity, it restarts the timer, and this process continues. When the timer expires, and there has been no device activity, the superclass lowers the device power state to the next lower state. This can continue until the device is in state zero. + * After the device has been powered down by at least one power state, a subsequent call to activityTickle causes the device to be switched to a higher state required for the activity. + * If the driver is managing the idleness determination totally on its own, the value of the type parameter should be kIOPMSubclassPolicy, and the driver should override the activityTickle method. The superclass IOService implementation of activityTickle does nothing with the kIOPMSubclassPolicy argument. + * @param type When type is kIOPMSubclassPolicy, activityTickle is not handled in IOService and should be intercepted by the subclass. When type is kIOPMSuperclassPolicy1, an activity flag is set and the device state is checked. If the device has been powered down, it is powered up again. + * @param stateNumber When type is kIOPMSuperclassPolicy1, stateNumber contains the desired power state ordinal for the activity. If the device is in a lower state, the superclass will switch it to this state. This is for devices that can handle some accesses in lower power states; the device is powered up only as far as it needs to be for the activity. + * @result When type is kIOPMSuperclassPolicy1, the superclass returns true if the device is currently in the state specified by stateNumber. If the device is in a lower state and must be powered up, the superclass returns false; in this case the superclass will initiate a power change to power the device up. */ + + virtual bool activityTickle( + unsigned long type, + unsigned long stateNumber = 0 ); + +/*! @function setAggressiveness + * @abstract Broadcasts an aggressiveness factor from the parent of a driver to the driver. + * @discussion Implement setAggressiveness to receive a notification when an "aggressiveness Aggressiveness factors are a loose set of power management variables that contain values for system sleep timeout, display sleep timeout, whether the system is on battery or AC, and other power management features. There are several aggressiveness factors that can be broadcast and a driver may take action on whichever factors apply to it. + * A driver that has joined the power plane via @link joinPMtree joinPMtree@/link will receive setAgressiveness calls when aggressiveness factors change. + * A driver may override this call if it needs to do something with the new factor (such as change its idle timeout). If overridden, the driver must call its superclass's setAgressiveness method in its own setAgressiveness implementation. + * Most drivers do not need to implement setAgressiveness. + * @param type The aggressiveness factor type, such as kPMMinutesToDim, kPMMinutesToSpinDown, kPMMinutesToSleep, and kPMPowerSource. (Aggressiveness factors are defined in pwr_mgt/IOPM.h.) + * @param newLevel The aggressiveness factor's new value. + * @result IOPMNoErr. */ + + virtual IOReturn setAggressiveness( + unsigned long type, + unsigned long newLevel ); + +/*! @function getAggressiveness + * @abstract Returns the current aggressiveness value for the given type. + * @param type The aggressiveness factor to query. + * @param currentLevel Upon successful return, contains the value of aggressiveness factor type. + * @result kIOReturnSuccess upon success; an I/O Kit error code otherwise. */ + + virtual IOReturn getAggressiveness( + unsigned long type, + unsigned long * currentLevel ); + +#ifndef __LP64__ +/*! @function systemWake + * @abstract Tells every driver in the power plane that the system is waking up. + * @discussion This call is handled internally by power management. It is not intended to be overridden or called by drivers. */ + + virtual IOReturn systemWake( void ) + APPLE_KEXT_DEPRECATED; + +/*! @function temperatureCriticalForZone + * @abstract Alerts a driver to a critical temperature in some thermal zone. + * @discussion This call is unused by power management. It is not intended to be called or overridden. */ + + virtual IOReturn temperatureCriticalForZone( IOService * whichZone ) + APPLE_KEXT_DEPRECATED; + +/*! @function youAreRoot + * @abstract Informs power management which IOService object is the power plane root. + * @discussion This call is handled internally by power management. It is not intended to be overridden or called by drivers. */ + + virtual IOReturn youAreRoot( void ) + APPLE_KEXT_DEPRECATED; + +/*! @function setPowerParent + * @abstract This call is handled internally by power management. It is not intended to be overridden or called by drivers. */ + + virtual IOReturn setPowerParent( + IOPowerConnection * parent, + bool stateKnown, + IOPMPowerFlags currentState ) + APPLE_KEXT_DEPRECATED; +#endif /* !__LP64__ */ + +/*! @function addPowerChild + * @abstract Informs a driver that it has a new child. + * @discussion The Platform Expert uses this method to call a driver and introduce it to a new child. This call is handled internally by power management. It is not intended to be overridden or called by drivers. + * @param theChild A pointer to the child IOService object. */ + + virtual IOReturn addPowerChild( IOService * theChild ); + +/*! @function removePowerChild + * @abstract Informs a power managed driver that one of its power plane childen is disappearing. + * @discussion This call is handled internally by power management. It is not intended to be overridden or called by drivers. */ + + virtual IOReturn removePowerChild( IOPowerConnection * theChild ); + +#ifndef __LP64__ +/*! @function command_received + * @discussion This call is handled internally by power management. It is not intended to be overridden or called by drivers. */ + + virtual void command_received( void *, void *, void *, void * ); +#endif + +/*! @function start_PM_idle_timer + * @discussion This call is handled internally by power management. It is not intended to be overridden or called by drivers. */ + + APPLE_KEXT_COMPATIBILITY_VIRTUAL + void start_PM_idle_timer( void ); + +#ifndef __LP64__ +/*! @function PM_idle_timer_expiration + * @discussion This call is handled internally by power management. It is not intended to be overridden or called by drivers. */ + + virtual void PM_idle_timer_expiration( void ) + APPLE_KEXT_DEPRECATED; + +/*! @function PM_Clamp_Timer_Expired + * @discussion This call is handled internally by power management. It is not intended to be overridden or called by drivers. */ + + virtual void PM_Clamp_Timer_Expired( void ) + APPLE_KEXT_DEPRECATED; +#endif + +/*! @function setIdleTimerPeriod + * @abstract Sets or changes the idle timer period. + * @discussion A driver using the idleness determination provided by IOService calls its superclass with this method to set or change the idle timer period. See @link activityTickle activityTickle@/link for a description of this type of idleness determination. + * @param period The desired idle timer period in seconds. + * @result kIOReturnSuccess upon success; an I/O Kit error code otherwise. */ + + virtual IOReturn setIdleTimerPeriod( unsigned long period ); + +#ifndef __LP64__ +/*! @function getPMworkloop + * @abstract Returns a pointer to the system-wide power management work loop. + * @availability Deprecated in Mac OS X version 10.6. + * @discussion Most drivers should create their own work loops to synchronize their code; drivers should not run arbitrary code on the power management work loop. */ + + virtual IOWorkLoop * getPMworkloop( void ) + APPLE_KEXT_DEPRECATED; +#endif + +/*! @function getPowerState + * @abstract Determines a device's power state. + * @discussion A device's "current power state" is updated at the end of each power state transition (e.g. transition from state 1 to state 0, or state 0 to state 2). This transition includes the time spent powering on or off any power plane children. Thus, if a child calls getPowerState on its power parent during system wake from sleep, the call will return the index to the device's off state rather than its on state. + * @result The current power state's index into the device's power state array. */ + + UInt32 getPowerState( void ); + +/*! @function setPowerState + * @abstract Requests a power managed driver to change the power state of its device. + * @discussion A power managed driver must override setPowerState to take part in system power management. After a driver is registered with power management, the system uses setPowerState to power the device off and on for system sleep and wake. + * Calls to @link PMinit PMinit@/link and @link registerPowerDriver registerPowerDriver@/link enable power management to change a device's power state using setPowerState. setPowerState is called in a clean and separate thread context. + * @param powerStateOrdinal The number in the power state array of the state the driver is being instructed to switch to. + * @param whatDevice A pointer to the power management object which registered to manage power for this device. In most cases, whatDevice will be equal to your driver's own this pointer. + * @result The driver must return IOPMAckImplied if it has complied with the request when it returns. Otherwise if it has started the process of changing power state but not finished it, the driver should return a number of microseconds which is an upper limit of the time it will need to finish. Then, when it has completed the power switch, it should call @link acknowledgeSetPowerState acknowledgeSetPowerState@/link. */ + + virtual IOReturn setPowerState( + unsigned long powerStateOrdinal, + IOService * whatDevice ); + +#ifndef __LP64__ +/*! @function clampPowerOn + * @abstract Deprecated. Do not use. */ + + virtual void clampPowerOn( unsigned long duration ); +#endif + +/*! @function maxCapabilityForDomainState + * @abstract Determines a driver's highest power state possible for a given power domain state. + * @discussion This happens when the power domain is changing state and power management needs to determine which state the device is capable of in the new domain state. + * Most drivers do not need to implement this method, and can rely upon the default IOService implementation. The IOService implementation scans the power state array looking for the highest state whose inputPowerRequirement field exactly matches the value of the domainState parameter. If more intelligent determination is required, the driver itself should implement the method and override the superclass's implementation. + * @param domainState Flags that describe the character of "domain power"; they represent the outputPowerCharacter field of a state in the power domain's power state array. + * @result A state number. */ + + virtual unsigned long maxCapabilityForDomainState( IOPMPowerFlags domainState ); + +/*! @function initialPowerStateForDomainState + * @abstract Determines which power state a device is in, given the current power domain state. + * @discussion Power management calls this method once, when the driver is initializing power management. + * Most drivers do not need to implement this method, and can rely upon the default IOService implementation. The IOService implementation scans the power state array looking for the highest state whose inputPowerRequirement field exactly matches the value of the domainState parameter. If more intelligent determination is required, the power managed driver should implement the method and override the superclass's implementation. + * @param domainState Flags that describe the character of "domain power"; they represent the outputPowerCharacter field of a state in the power domain's power state array. + * @result A state number. */ + + virtual unsigned long initialPowerStateForDomainState( IOPMPowerFlags domainState ); + +/*! @function powerStateForDomainState + * @abstract Determines what power state the device would be in for a given power domain state. + * @discussion This call is unused by power management. Drivers should override initialPowerStateForDomainState and/or maxCapabilityForDomainState instead to change the default mapping of domain state to driver power state. + * @param domainState Flags that describe the character of "domain power"; they represent the outputPowerCharacter field of a state in the power domain's power state array. + * @result A state number. */ + + virtual unsigned long powerStateForDomainState( IOPMPowerFlags domainState ); + +/*! @function powerStateWillChangeTo + * @abstract Informs interested parties that a device is about to change its power state. + * @discussion Power management informs interested parties that a device is about to change to a different power state. Interested parties are those that have registered for this notification via @link registerInterestedDriver registerInterestedDriver@/link. If you have called registerInterestedDriver on a power managed driver, you must implement powerStateWillChangeTo and @link powerStateDidChangeTo powerStateDidChangeTo@/link to receive the notifications. + * powerStateWillChangeTo is called in a clean and separate thread context. powerStateWillChangeTo is called before a power state transition takes place; powerStateDidChangeTo is called after the transition has completed. + * @param capabilities Flags that describe the capability of the device in the new power state (they come from the capabilityFlags field of the new state in the power state array). + * @param stateNumber The number of the state in the state array that the device is switching to. + * @param whatDevice A pointer to the driver that is changing. It can be used by a driver that is receiving power state change notifications for multiple devices to distinguish between them. + * @result The driver returns IOPMAckImplied if it has prepared for the power change when it returns. If it has started preparing but not finished, it should return a number of microseconds which is an upper limit of the time it will need to finish preparing. Then, when it has completed its preparations, it should call @link acknowledgePowerChange acknowledgePowerChange@/link. */ + + virtual IOReturn powerStateWillChangeTo( + IOPMPowerFlags capabilities, + unsigned long stateNumber, + IOService * whatDevice ); + +/*! @function powerStateDidChangeTo + * @abstract Informs interested parties that a device has changed to a different power state. + * @discussion Power management informs interested parties that a device has changed to a different power state. Interested parties are those that have registered for this notification via @link registerInterestedDriver registerInterestedDriver@/link. If you have called registerInterestedDriver on a power managed driver, you must implemnt @link powerStateWillChangeTo powerStateWillChangeTo@/link and powerStateDidChangeTo to receive the notifications. + * powerStateDidChangeTo is called in a clean and separate thread context. powerStateWillChangeTo is called before a power state transition takes place; powerStateDidChangeTo is called after the transition has completed. + * @param capabilities Flags that describe the capability of the device in the new power state (they come from the capabilityFlags field of the new state in the power state array). + * @param stateNumber The number of the state in the state array that the device is switching to. + * @param whatDevice A pointer to the driver that is changing. It can be used by a driver that is receiving power state change notifications for multiple devices to distinguish between them. + * @result The driver returns IOPMAckImplied if it has prepared for the power change when it returns. If it has started preparing but not finished, it should return a number of microseconds which is an upper limit of the time it will need to finish preparing. Then, when it has completed its preparations, it should call @link acknowledgePowerChange acknowledgePowerChange@/link. */ + + virtual IOReturn powerStateDidChangeTo( + IOPMPowerFlags capabilities, + unsigned long stateNumber, + IOService * whatDevice ); + +#ifndef __LP64__ +/*! @function didYouWakeSystem + * @abstract Asks a driver if its device is the one that just woke the system from sleep. + * @availability Deprecated in Mac OS X version 10.6. + * @discussion Power management calls a power managed driver with this method to ask if its device is the one that just woke the system from sleep. If a device is capable of waking the system from sleep, its driver should implement didYouWakeSystem and return true if its device was responsible for waking the system. + * @result true if the driver's device woke the system and false otherwise. */ + + virtual bool didYouWakeSystem( void ) + APPLE_KEXT_DEPRECATED; + +/*! @function newTemperature + * @abstract Tells a power managed driver that the temperature in the thermal zone has changed. + * @discussion This call is unused by power management. It is not intended to be called or overridden. */ + + virtual IOReturn newTemperature( long currentTemp, IOService * whichZone ) + APPLE_KEXT_DEPRECATED; +#endif + + virtual bool askChangeDown( unsigned long ); + virtual bool tellChangeDown( unsigned long ); + virtual void tellNoChangeDown( unsigned long ); + virtual void tellChangeUp( unsigned long ); + virtual IOReturn allowPowerChange( unsigned long refcon ); + virtual IOReturn cancelPowerChange( unsigned long refcon ); + +protected: +/*! @function changePowerStateToPriv + * @abstract Tells a driver's superclass to change the power state of its device. + * @discussion A driver uses this method to tell its superclass to change the power state of the device. This is the recommended way to change the power state of a device. + * Three things affect driver power state: @link changePowerStateTo changePowerStateTo@/link, changePowerStateToPriv, and the desires of the driver's power plane children. Power management puts the device into the maximum state governed by those three entities. + * Drivers may eliminate the influence of the changePowerStateTo method on power state one of two ways. See @link powerOverrideOnPriv powerOverrideOnPriv@/link to ignore the method's influence, or call changePowerStateTo(0) in the driver's start routine to remove the changePowerStateTo method's power request. + * @param ordinal The number of the desired power state in the power state array. + * @result A return code that can be ignored by the caller. */ +public: + IOReturn changePowerStateToPriv( unsigned long ordinal ); + +/*! @function powerOverrideOnPriv + * @abstract Allows a driver to ignore its children's power management requests and only use changePowerStateToPriv to define its own power state. + * @discussion Power management normally keeps a device at the highest state required by its requests via @link changePowerStateTo changePowerStateTo@/link, @link changePowerStateToPriv changePowerStateToPriv@/link, and its children. However, a driver may ensure a lower power state than otherwise required by itself and its children using powerOverrideOnPriv. When the override is on, power management keeps the device's power state in the state specified by changePowerStateToPriv. Turning on the override will initiate a power change if the driver's changePowerStateToPriv desired power state is different from the maximum of the changePowerStateTo desired power state and the children's desires. + * @result A return code that can be ignored by the caller. */ + + IOReturn powerOverrideOnPriv( void ); + +/*! @function powerOverrideOffPriv + * @abstract Allows a driver to disable a power override. + * @discussion When a driver has enabled an override via @link powerOverrideOnPriv powerOverrideOnPriv@/link, it can disable it again by calling this method in its superclass. Disabling the override reverts to the default algorithm for determining a device's power state. The superclass will now keep the device at the highest state required by changePowerStateTo, changePowerStateToPriv, and its children. Turning off the override will initiate a power change if the driver's desired power state is different from the maximum of the power managed driver's desire and the children's desires. + * @result A return code that can be ignored by the caller. */ + + IOReturn powerOverrideOffPriv( void ); + +/*! @function powerChangeDone + * @abstract Tells a driver when a power state change is complete. + * @discussion Power management uses this method to inform a driver when a power change is completely done, when all interested parties have acknowledged the @link powerStateDidChangeTo powerStateDidChangeTo@/link call. The default implementation of this method is null; the method is meant to be overridden by subclassed power managed drivers. A driver should use this method to find out if a power change it initiated is complete. + * @param stateNumber The number of the state in the state array that the device has switched from. */ + + virtual void powerChangeDone( unsigned long stateNumber ); +}; + +#endif /* ! _IOKIT_IOSERVICE_H */ diff --git a/QualcommWireless/include/IOKit/IOServicePM.h b/QualcommWireless/include/IOKit/IOServicePM.h new file mode 100644 index 0000000..e4a928f --- /dev/null +++ b/QualcommWireless/include/IOKit/IOServicePM.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOSERVICEPM_H +#define _IOKIT_IOSERVICEPM_H + +#include + +class IOService; +class IOServicePM; +class IOPowerConnection; +class IOWorkLoop; +class IOCommandGate; +class IOTimerEventSource; +class IOPlatformExpert; + +#endif /* !_IOKIT_IOSERVICEPM_H */ diff --git a/QualcommWireless/include/IOKit/IOSharedDataQueue.h b/QualcommWireless/include/IOKit/IOSharedDataQueue.h new file mode 100644 index 0000000..f4cd156 --- /dev/null +++ b/QualcommWireless/include/IOKit/IOSharedDataQueue.h @@ -0,0 +1,160 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOSHAREDDATAQUEUE_H +#define _IOKIT_IOSHAREDDATAQUEUE_H + +#define DISABLE_DATAQUEUE_WARNING /* IODataQueue is deprecated, please use IOSharedDataQueue instead */ + +#include + +#undef DISABLE_DATAQUEUE_WARNING + +typedef struct _IODataQueueEntry IODataQueueEntry; + +/*! + * @class IOSharedDataQueue : public IODataQueue + * @abstract A generic queue designed to pass data both from the kernel to a user process and from a user process to the kernel. + * @discussion The IOSharedDataQueue class is designed to also allow a user process to queue data to kernel code. IOSharedDataQueue objects are designed to be used in a single producer / single consumer situation. As such, there are no locks on the data itself. Because the kernel enqueue and user-space dequeue methods follow a strict set of guidelines, no locks are necessary to maintain the integrity of the data struct. + * + *
Each data entry can be variable sized, but the entire size of the queue data region (including overhead for each entry) must be specified up front. + * + *
In order for the IODataQueue instance to notify the user process that data is available, a notification mach port must be set. When the queue is empty and a new entry is added, a message is sent to the specified port. + * + *
In order to make the data queue memory available to a user process, the method getMemoryDescriptor() must be used to get an IOMemoryDescriptor instance that can be mapped into a user process. Typically, the clientMemoryForType() method on an IOUserClient instance will be used to request the IOMemoryDescriptor and then return it to be mapped into the user process. + */ +class IOSharedDataQueue : public IODataQueue +{ + OSDeclareDefaultStructors(IOSharedDataQueue); + + struct ExpansionData { + UInt32 queueSize; + }; +/*! @var reserved + * Reserved for future use. (Internal use only) */ + ExpansionData * _reserved; + +protected: + virtual void free() APPLE_KEXT_OVERRIDE; + +/*! + * @function getQueueSize + * @abstract Returns the size of the data queue. + * @discussion Use this method to access the size of the data queue. Do not access the value of size directly, as it can get modified from userspace and is not reliable. + * @result Returns the size of the data queue, or zero in case of failure. + */ + UInt32 getQueueSize(); + +/*! + * @function setQueueSize + * @abstract Stores the value of the size of the data queue. + * @discussion Use this method to store the value of the size of the data queue. Do not access the value of size directly, as it can get modified from userspace and is not reliable. + * @param size The size of the data queue. + * @result Returns true in case of success, false otherwise. + */ + Boolean setQueueSize(UInt32 size); + +public: +/*! + * @function withCapacity + * @abstract Static method that creates a new IOSharedDataQueue instance with the capacity specified in the size parameter. + * @discussion The actual size of the entire data queue memory region (to be shared into a user process) is equal to the capacity plus the IODataQueueMemory overhead. This overhead value can be determined from the DATA_QUEUE_MEMORY_HEADER_SIZE macro in . The size of the data queue memory region must include space for the overhead of each IODataQueueEntry. This entry overhead can be determined from the DATA_QUEUE_ENTRY_HEADER_SIZE macro in .
This method allocates a new IODataQueue instance and then calls initWithCapacity() with the given size parameter. If the initWithCapacity() fails, the new instance is released and zero is returned. + * @param size The size of the data queue memory region. + * @result Returns the newly allocated IOSharedDataQueue instance. Zero is returned on failure. + */ + static IOSharedDataQueue *withCapacity(UInt32 size); + +/*! + * @function withEntries + * @abstract Static method that creates a new IOSharedDataQueue instance with the specified number of entries of the given size. + * @discussion This method will create a new IOSharedDataQueue instance with enough capacity for numEntries of entrySize. It does account for the IODataQueueEntry overhead for each entry. Note that the numEntries and entrySize are simply used to determine the data region size. They do not actually restrict the size of number of entries that can be added to the queue.
This method allocates a new IODataQueue instance and then calls initWithEntries() with the given numEntries and entrySize parameters. If the initWithEntries() fails, the new instance is released and zero is returned. + * @param numEntries Number of entries to allocate space for. + * @param entrySize Size of each entry. + * @result Reeturns the newly allocated IOSharedDataQueue instance. Zero is returned on failure. + */ + static IOSharedDataQueue *withEntries(UInt32 numEntries, UInt32 entrySize); + +/*! + * @function initWithCapacity + * @abstract Initializes an IOSharedDataQueue instance with the capacity specified in the size parameter. + * @discussion The actual size of the entire data queue memory region (to be shared into a user process) is equal to the capacity plus the IODataQueueMemory overhead. This overhead value can be determined from the DATA_QUEUE_MEMORY_HEADER_SIZE and DATA_QUEUE_MEMORY_APPENDIX_SIZE macro in . The size of the data queue memory region must include space for the overhead of each IODataQueueEntry. This entry overhead can be determined from the DATA_QUEUE_ENTRY_HEADER_SIZE macro in . + * @param size The size of the data queue memory region. + * @result Returns true on success and false on failure. + */ + virtual Boolean initWithCapacity(UInt32 size) APPLE_KEXT_OVERRIDE; + +/*! + * @function getMemoryDescriptor + * @abstract Returns a memory descriptor covering the IODataQueueMemory region. + * @discussion The IOMemoryDescriptor instance returned by this method is intended to be mapped into a user process. This is the memory region that the IODataQueueClient code operates on. + * @result Returns a newly allocated IOMemoryDescriptor for the IODataQueueMemory region. Returns zero on failure. + */ + virtual IOMemoryDescriptor *getMemoryDescriptor() APPLE_KEXT_OVERRIDE; + +/*! + * @function peek + * @abstract Used to peek at the next entry on the queue. + * @discussion This function can be used to look at the next entry which allows the entry to be received without having to copy it with dequeue. In order to do this, call peek to get the entry. Then call dequeue with a NULL data pointer. That will cause the head to be moved to the next entry, but no memory to be copied. + * @result Returns a pointer to the next IODataQueueEntry if one is available. 0 (NULL) is returned if the queue is empty. + */ + virtual IODataQueueEntry * peek(); + +/*! + * @function dequeue + * @abstract Dequeues the next available entry on the queue and copies it into the given data pointer. + * @discussion This function will dequeue the next available entry on the queue. If a data pointer is provided, it will copy the data into the memory region if there is enough space available as specified in the dataSize parameter. If no data pointer is provided, it will simply move the head value past the current entry. + * @param data A pointer to the data memory region in which to copy the next entry data on the queue. If this parameter is 0 (NULL), it will simply move to the next entry. + * @param dataSize A pointer to the size of the data parameter. On return, this contains the size of the actual entry data - even if the original size was not large enough. + * @result Returns true on success and false on failure. Typically failure means that the queue is empty. + */ + virtual Boolean dequeue(void *data, UInt32 *dataSize); + +/*! + * @function enqueue + * @abstract Enqueues a new entry on the queue. + * @discussion This method adds a new data entry of dataSize to the queue. It sets the size parameter of the entry pointed to by the tail value and copies the memory pointed to by the data parameter in place in the queue. Once that is done, it moves the tail to the next available location. When attempting to add a new entry towards the end of the queue and there isn't enough space at the end, it wraps back to the beginning.
If the queue is empty when a new entry is added, sendDataAvailableNotification() is called to send a message to the user process that data is now available. + * @param data Pointer to the data to be added to the queue. + * @param dataSize Size of the data pointed to by data. + * @result Returns true on success and false on failure. Typically failure means that the queue is full. + */ + virtual Boolean enqueue(void *data, UInt32 dataSize) APPLE_KEXT_OVERRIDE; + + +#if APPLE_KEXT_VTABLE_PADDING + OSMetaClassDeclareReservedUnused(IOSharedDataQueue, 0); + OSMetaClassDeclareReservedUnused(IOSharedDataQueue, 1); + OSMetaClassDeclareReservedUnused(IOSharedDataQueue, 2); + OSMetaClassDeclareReservedUnused(IOSharedDataQueue, 3); + OSMetaClassDeclareReservedUnused(IOSharedDataQueue, 4); + OSMetaClassDeclareReservedUnused(IOSharedDataQueue, 5); + OSMetaClassDeclareReservedUnused(IOSharedDataQueue, 6); + OSMetaClassDeclareReservedUnused(IOSharedDataQueue, 7); +#endif +}; + +#endif /* _IOKIT_IOSHAREDDATAQUEUE_H */ diff --git a/QualcommWireless/include/IOKit/IOSharedLock.h b/QualcommWireless/include/IOKit/IOSharedLock.h new file mode 100644 index 0000000..306b406 --- /dev/null +++ b/QualcommWireless/include/IOKit/IOSharedLock.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 1998-2010 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOSHAREDLOCK_H +#define _IOKIT_IOSHAREDLOCK_H + +#include + +#define IOSharedLockData OSSpinLock +#define ev_lock_data_t OSSpinLock + +#define ev_unlock(l) OSSpinLockUnlock(l) +#define ev_try_lock(l) OSSpinLockTry(l) + +#endif /* ! _IOKIT_IOSHAREDLOCK_H */ diff --git a/QualcommWireless/include/IOKit/IOSubMemoryDescriptor.h b/QualcommWireless/include/IOKit/IOSubMemoryDescriptor.h new file mode 100644 index 0000000..42b10d9 --- /dev/null +++ b/QualcommWireless/include/IOKit/IOSubMemoryDescriptor.h @@ -0,0 +1,123 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef _IOSUBMEMORYDESCRIPTOR_H +#define _IOSUBMEMORYDESCRIPTOR_H + +#include + +/*! @class IOSubMemoryDescriptor : public IOMemoryDescriptor + * @abstract The IOSubMemoryDescriptor object describes a memory area made up of a portion of another IOMemoryDescriptor. + * @discussion The IOSubMemoryDescriptor object represents a subrange of memory, specified as a portion of another IOMemoryDescriptor. */ + +class IOSubMemoryDescriptor : public IOMemoryDescriptor +{ + OSDeclareDefaultStructors(IOSubMemoryDescriptor); + +protected: + IOMemoryDescriptor * _parent; + IOByteCount _start; + + virtual void free() APPLE_KEXT_OVERRIDE; + +public: +/*! @function withSubRange + * @abstract Create an IOMemoryDescriptor to describe a subrange of an existing descriptor. + * @discussion This method creates and initializes an IOMemoryDescriptor for memory consisting of a subrange of the specified memory descriptor. The parent memory descriptor is retained by the new descriptor. + * @param of The parent IOMemoryDescriptor of which a subrange is to be used for the new descriptor, which will be retained by the subrange IOMemoryDescriptor. + * @param offset A byte offset into the parent memory descriptor's memory. + * @param length The length of the subrange. + * @param options + * kIOMemoryDirectionMask (options:direction) This nibble indicates the I/O direction to be associated with the descriptor, which may affect the operation of the prepare and complete methods on some architectures. + * @result The created IOMemoryDescriptor on success, to be released by the caller, or zero on failure. */ + + static IOSubMemoryDescriptor * withSubRange(IOMemoryDescriptor *of, + IOByteCount offset, + IOByteCount length, + IOOptionBits options); + +/* + * Initialize or reinitialize an IOSubMemoryDescriptor to describe + * a subrange of an existing descriptor. + * + * An IOSubMemoryDescriptor can be re-used by calling initSubRange + * again on an existing instance -- note that this behavior is not + * commonly supported in other IOKit classes, although it is here. + */ + virtual bool initSubRange( IOMemoryDescriptor * parent, + IOByteCount offset, IOByteCount length, + IODirection withDirection ); + +/* + * IOMemoryDescriptor required methods + */ + + virtual addr64_t getPhysicalSegment( IOByteCount offset, + IOByteCount * length, + IOOptionBits options = 0 ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn prepare(IODirection forDirection = kIODirectionNone) APPLE_KEXT_OVERRIDE; + + virtual IOReturn complete(IODirection forDirection = kIODirectionNone) APPLE_KEXT_OVERRIDE; + +#ifdef __LP64__ + virtual IOReturn redirect( task_t safeTask, bool redirect ) APPLE_KEXT_OVERRIDE; +#else + IOReturn redirect( task_t safeTask, bool redirect ); +#endif /* __LP64__ */ + + virtual IOReturn setPurgeable( IOOptionBits newState, + IOOptionBits * oldState ) APPLE_KEXT_OVERRIDE; + + IOReturn setOwnership( task_t newOwner, + int newLedgerTag, + IOOptionBits newLedgerOptions ); + +// support map() on kIOMemoryTypeVirtual without prepare() + virtual IOMemoryMap * makeMapping( + IOMemoryDescriptor * owner, + task_t intoTask, + IOVirtualAddress atAddress, + IOOptionBits options, + IOByteCount offset, + IOByteCount length ) APPLE_KEXT_OVERRIDE; + + virtual uint64_t getPreparationID( void ) APPLE_KEXT_OVERRIDE; + +/*! @function getPageCounts + * @abstract Retrieve the number of resident and/or dirty pages encompassed by an IOMemoryDescriptor. + * @discussion This method returns the number of resident and/or dirty pages encompassed by an IOMemoryDescriptor. + * @param residentPageCount - If non-null, a pointer to a byte count that will return the number of resident pages encompassed by this IOMemoryDescriptor. + * @param dirtyPageCount - If non-null, a pointer to a byte count that will return the number of dirty pages encompassed by this IOMemoryDescriptor. + * @result An IOReturn code. */ + + IOReturn getPageCounts(IOByteCount * residentPageCount, + IOByteCount * dirtyPageCount); +}; + +#endif /* !_IOSUBMEMORYDESCRIPTOR_H */ diff --git a/QualcommWireless/include/IOKit/IOTimeStamp.h b/QualcommWireless/include/IOKit/IOTimeStamp.h new file mode 100644 index 0000000..95d0819 --- /dev/null +++ b/QualcommWireless/include/IOKit/IOTimeStamp.h @@ -0,0 +1,210 @@ +/* + * Copyright (c) 1998-2010 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +#ifndef IOKIT_IOTIMESTAMP_H +#define IOKIT_IOTIMESTAMP_H + +#include + +static inline void +IOTimeStampStartConstant(unsigned int csc, + uintptr_t a = 0, uintptr_t b = 0, + uintptr_t c = 0, uintptr_t d = 0) +{ + KERNEL_DEBUG_CONSTANT(((uint32_t)csc) | DBG_FUNC_START, a, b, c, d, 0); +} + +static inline void +IOTimeStampEndConstant(uintptr_t csc, + uintptr_t a = 0, uintptr_t b = 0, + uintptr_t c = 0, uintptr_t d = 0) +{ + KERNEL_DEBUG_CONSTANT(((uint32_t)csc) | DBG_FUNC_END, a, b, c, d, 0); +} + +static inline void +IOTimeStampConstant(uintptr_t csc, + uintptr_t a = 0, uintptr_t b = 0, + uintptr_t c = 0, uintptr_t d = 0) +{ + KERNEL_DEBUG_CONSTANT(((uint32_t)csc) | DBG_FUNC_NONE, a, b, c, d, 0); +} + +#if KDEBUG + +static inline void +IOTimeStampStart(uintptr_t csc, + uintptr_t a = 0, uintptr_t b = 0, + uintptr_t c = 0, uintptr_t d = 0) +{ + KERNEL_DEBUG(((uint32_t)csc) | DBG_FUNC_START, a, b, c, d, 0); +} + +static inline void +IOTimeStampEnd(uintptr_t csc, + uintptr_t a = 0, uintptr_t b = 0, + uintptr_t c = 0, uintptr_t d = 0) +{ + KERNEL_DEBUG(((uint32_t)csc) | DBG_FUNC_END, a, b, c, d, 0); +} + +static inline void +IOTimeStamp(uintptr_t csc, + uintptr_t a = 0, uintptr_t b = 0, + uintptr_t c = 0, uintptr_t d = 0) +{ + KERNEL_DEBUG(((uint32_t)csc) | DBG_FUNC_NONE, a, b, c, d, 0); +} + +#endif /* KDEBUG */ + +#define IODBG_STORAGE(code) (KDBG_CODE(DBG_IOKIT, DBG_IOSTORAGE, code)) +#define IODBG_NETWORK(code) (KDBG_CODE(DBG_IOKIT, DBG_IONETWORK, code)) +#define IODBG_KEYBOARD(code) (KDBG_CODE(DBG_IOKIT, DBG_IOKEYBOARD, code)) +#define IODBG_HID(code) (KDBG_CODE(DBG_IOKIT, DBG_IOHID, code)) +#define IODBG_AUDIO(code) (KDBG_CODE(DBG_IOKIT, DBG_IOAUDIO, code)) +#define IODBG_SERIAL(code) (KDBG_CODE(DBG_IOKIT, DBG_IOSERIAL, code)) +#define IODBG_TTY(code) (KDBG_CODE(DBG_IOKIT, DBG_IOTTY, code)) +#define IODBG_SAM(code) (KDBG_CODE(DBG_IOKIT, DBG_IOSAM, code)) +#define IODBG_PARALLELATA(code) (KDBG_CODE(DBG_IOKIT, DBG_IOPARALLELATA, code)) +#define IODBG_PARALLELSCSI(code) (KDBG_CODE(DBG_IOKIT, DBG_IOPARALLELSCSI, code)) +#define IODBG_SATA(code) (KDBG_CODE(DBG_IOKIT, DBG_IOSATA, code)) +#define IODBG_SAS(code) (KDBG_CODE(DBG_IOKIT, DBG_IOSAS, code)) +#define IODBG_FIBRECHANNEL(code) (KDBG_CODE(DBG_IOKIT, DBG_IOFIBRECHANNEL, code)) +#define IODBG_USB(code) (KDBG_CODE(DBG_IOKIT, DBG_IOUSB, code)) +#define IODBG_BLUETOOTH(code) (KDBG_CODE(DBG_IOKIT, DBG_IOBLUETOOTH, code)) +#define IODBG_FIREWIRE(code) (KDBG_CODE(DBG_IOKIT, DBG_IOFIREWIRE, code)) +#define IODBG_INFINIBAND(code) (KDBG_CODE(DBG_IOKIT, DBG_IOINFINIBAND, code)) + + +/* Backwards compatibility */ +#define IODBG_DISK(code) IODBG_STORAGE(code) +#define IODBG_POINTING(code) IODBG_HID(code) + + +/* IOKit infrastructure subclasses */ +#define IODBG_INTC(code) (KDBG_CODE(DBG_IOKIT, DBG_IOINTC, code)) +#define IODBG_WORKLOOP(code) (KDBG_CODE(DBG_IOKIT, DBG_IOWORKLOOP, code)) +#define IODBG_INTES(code) (KDBG_CODE(DBG_IOKIT, DBG_IOINTES, code)) +#define IODBG_TIMES(code) (KDBG_CODE(DBG_IOKIT, DBG_IOCLKES, code)) +#define IODBG_CMDQ(code) (KDBG_CODE(DBG_IOKIT, DBG_IOCMDQ, code)) +#define IODBG_MCURS(code) (KDBG_CODE(DBG_IOKIT, DBG_IOMCURS, code)) +#define IODBG_MDESC(code) (KDBG_CODE(DBG_IOKIT, DBG_IOMDESC, code)) +#define IODBG_POWER(code) (KDBG_CODE(DBG_IOKIT, DBG_IOPOWER, code)) +#define IODBG_IOSERVICE(code) (KDBG_CODE(DBG_IOKIT, DBG_IOSERVICE, code)) +#define IODBG_IOREGISTRY(code) (KDBG_CODE(DBG_IOKIT, DBG_IOREGISTRY, code)) + +/* IOKit specific codes - within each subclass */ + +/* DBG_IOKIT/DBG_IODISK codes */ + +/* DBG_IOKIT/DBG_IONETWORK codes */ + +/* DBG_IOKIT/DBG_IOKEYBOARD codes */ + +/* DBG_IOKIT/DBG_IOHID codes */ + +/* DBG_IOKIT/DBG_IOAUDIO codes */ + +/* DBG_IOKIT/DBG_IOSERIAL codes */ + +/* DBG_IOKIT/DBG_IOTTY codes */ + +/* DBG_IOKIT/DBG_IOINTC codes */ +#define IOINTC_HANDLER 1 /* 0x05000004 */ +#define IOINTC_SPURIOUS 2 /* 0x05000008 */ + +/* DBG_IOKIT/DBG_IOWORKLOOP codes */ +#define IOWL_CLIENT 1 /* 0x05010004 */ +#define IOWL_WORK 2 /* 0x05010008 */ + +/* DBG_IOKIT/DBG_IOINTES codes */ +#define IOINTES_CLIENT 1 /* 0x05020004 */ +#define IOINTES_LAT 2 /* 0x05020008 */ +#define IOINTES_SEMA 3 /* 0x0502000c */ +#define IOINTES_INTCTXT 4 /* 0x05020010 */ +#define IOINTES_INTFLTR 5 /* 0x05020014 */ +#define IOINTES_ACTION 6 /* 0x05020018 */ +#define IOINTES_FILTER 7 /* 0x0502001c */ + +/* DBG_IOKIT/DBG_IOTIMES codes */ +#define IOTIMES_CLIENT 1 /* 0x05030004 */ +#define IOTIMES_LAT 2 /* 0x05030008 */ +#define IOTIMES_SEMA 3 /* 0x0503000c */ +#define IOTIMES_ACTION 4 /* 0x05030010 */ + +/* DBG_IOKIT/DBG_IOCMDQ codes */ +#define IOCMDQ_CLIENT 1 /* 0x05040004 */ +#define IOCMDQ_LAT 2 /* 0x05040008 */ +#define IOCMDQ_SEMA 3 /* 0x0504000c */ +#define IOCMDQ_PSEMA 4 /* 0x05040010 */ +#define IOCMDQ_PLOCK 5 /* 0x05040014 */ +#define IOCMDQ_ACTION 6 /* 0x05040018 */ + +/* DBG_IOKIT/DBG_IOMCURS codes */ + +/* DBG_IOKIT/DBG_IOMDESC codes */ + +/* DBG_IOKIT/DBG_IOPOWER codes */ +// See IOKit/pwr_mgt/IOPMlog.h for the power management codes + +/* DBG_IOKIT/DBG_IOSERVICE codes */ +#define IOSERVICE_BUSY 1 /* 0x05080004 */ +#define IOSERVICE_NONBUSY 2 /* 0x05080008 */ +#define IOSERVICE_MODULESTALL 3 /* 0x0508000C */ +#define IOSERVICE_MODULEUNSTALL 4 /* 0x05080010 */ + +#define IOSERVICE_TERMINATE_PHASE1 5 /* 0x05080014 */ +#define IOSERVICE_TERMINATE_REQUEST_OK 6 /* 0x05080018 */ +#define IOSERVICE_TERMINATE_REQUEST_FAIL 7 /* 0x0508001C */ +#define IOSERVICE_TERMINATE_SCHEDULE_STOP 8 /* 0x05080020 */ +#define IOSERVICE_TERMINATE_SCHEDULE_FINALIZE 9 /* 0x05080024 */ +#define IOSERVICE_TERMINATE_WILL 10 /* 0x05080028 */ +#define IOSERVICE_TERMINATE_DID 11 /* 0x0508002C */ +#define IOSERVICE_TERMINATE_DID_DEFER 12 /* 0x05080030 */ +#define IOSERVICE_TERMINATE_FINALIZE 13 /* 0x05080034 */ +#define IOSERVICE_TERMINATE_STOP 14 /* 0x05080038 */ +#define IOSERVICE_TERMINATE_STOP_NOP 15 /* 0x0508003C */ +#define IOSERVICE_TERMINATE_STOP_DEFER 16 /* 0x05080040 */ +#define IOSERVICE_TERMINATE_DONE 17 /* 0x05080044 */ + +#define IOSERVICE_KEXTD_ALIVE 18 /* 0x05080048 */ +#define IOSERVICE_KEXTD_READY 19 /* 0x0508004C */ +#define IOSERVICE_REGISTRY_QUIET 20 /* 0x05080050 */ + +#define IOSERVICE_TERM_SET_INACTIVE 21 /* 0x05080054 */ +#define IOSERVICE_TERM_SCHED_PHASE2 22 /* 0x05080058 */ +#define IOSERVICE_TERM_START_PHASE2 23 /* 0x0508005C */ +#define IOSERVICE_TERM_TRY_PHASE2 24 /* 0x05080060 */ +#define IOSERVICE_TERM_UC_DEFER 25 /* 0x05080064 */ +#define IOSERVICE_DETACH 26 /* 0x05080068 */ + +/* DBG_IOKIT/DBG_IOREGISTRY codes */ +#define IOREGISTRYENTRY_NAME_STRING 1 /* 0x05090004 */ +#define IOREGISTRYENTRY_NAME 2 /* 0x05090008 */ + +#endif /* ! IOKIT_IOTIMESTAMP_H */ diff --git a/QualcommWireless/include/IOKit/IOTimerEventSource.h b/QualcommWireless/include/IOKit/IOTimerEventSource.h new file mode 100644 index 0000000..e4dddac --- /dev/null +++ b/QualcommWireless/include/IOKit/IOTimerEventSource.h @@ -0,0 +1,325 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. + * + * IOTimerEventSource.h + * + * HISTORY + * 2-Feb-1999 Joe Liu (jliu) created. + * + */ + +#ifndef _IOTIMEREVENTSOURCE +#define _IOTIMEREVENTSOURCE + +#include + +__BEGIN_DECLS +#include +__END_DECLS + +#include +#include + +/*! + * @enum IOTimerEventSource constructor options + * @abstract Constants defining behavior of the IOTimerEventSource. + * @constant kIOTimerEventSourceOptionsPriorityHigh Importance above everything but realtime. + * Thread calls allocated with this priority execute at extremely high priority, + * above everything but realtime threads. They are generally executed in serial. + * Though they may execute concurrently under some circumstances, no fan-out is implied. + * These work items should do very small amounts of work or risk disrupting system + * responsiveness. + * @constant kIOTimerEventSourceOptionsPriorityKernelHigh Importance higher than most kernel + * threads. + * @constant kIOTimerEventSourceOptionsPriorityKernel Importance similar to that of normal kernel + * threads. + * @constant kIOTimerEventSourceOptionsPriorityUser Importance similar to that of normal user threads. + * @constant kIOTimerEventSourceOptionsPriorityLow Very low importance. + * @constant kIOTimerEventSourceOptionsPriorityWorkLoop Run the callout on the thread of the IOWorkLoop + * the event source has been added to. + * @constant kIOTimerEventSourceOptionsAllowReenter Allow the callout to be rescheduled and potentially + * re-entered, if the IOWorkLoop lock has been released (eg. with commandSleep) during its invocation. + * @constant kIOTimerEventSourceOptionsDefault Recommended default options. + */ +enum{ + kIOTimerEventSourceOptionsPriorityMask = 0x000000ff, + kIOTimerEventSourceOptionsPriorityHigh = 0x00000000, + kIOTimerEventSourceOptionsPriorityKernelHigh = 0x00000001, + kIOTimerEventSourceOptionsPriorityKernel = 0x00000002, + kIOTimerEventSourceOptionsPriorityUser = 0x00000003, + kIOTimerEventSourceOptionsPriorityLow = 0x00000004, + kIOTimerEventSourceOptionsPriorityWorkLoop = 0x000000ff, + + kIOTimerEventSourceOptionsAllowReenter = 0x00000100, + + kIOTimerEventSourceOptionsDefault = kIOTimerEventSourceOptionsPriorityKernelHigh +}; + +#define IOTIMEREVENTSOURCEOPTIONS_DEFINED 1 + +/*! + * @enum IOTimerEventSource setTimeout/wakeAtTime options + * @abstract Constants defining behavior of a scheduled call from IOTimerEventSource. + * @constant kIOTimeOptionsWithLeeway Use the leeway parameter to the call. + * @constant kIOTimeOptionsContinuous Use mach_continuous_time() to generate the callback. + */ +enum{ + kIOTimeOptionsWithLeeway = 0x00000020, + kIOTimeOptionsContinuous = 0x00000100, +}; + +/*! + * @class IOTimerEventSource : public IOEventSource + * @abstract Time based event source mechanism. + * @discussion An event source that implements a simple timer. A timeout handler is called once the timeout period expires. This timeout handler will be called by the work-loop that this event source is attached to. + *

+ * Usually a timer event source will be used to implement a timeout. In general when a driver makes a request it will need to setup a call to keep track of when the I/O doesn't complete. This class is designed to make that somewhat easier. + *

+ * Remember the system doesn't guarantee the accuracy of the callout. It is possible that a higher priority thread is running which will delay the execution of the action routine. In fact the thread will be made runable at the exact requested time, within the accuracy of the CPU's decrementer based interrupt, but the scheduler will then control execution. + */ + +class IOTimerEventSource : public IOEventSource +{ + OSDeclareDefaultStructors(IOTimerEventSource); + +protected: +/*! @var calloutEntry thread_call entry for preregistered thread callouts */ + void *calloutEntry; + +/*! @var abstime time to wake up next, see enable. */ + AbsoluteTime abstime; + +/*! @struct ExpansionData + * @discussion This structure is private to the IOTimerEventSource implementation. + */ + struct ExpansionData { + SInt32 calloutGeneration; + SInt32 calloutGenerationSignaled; + IOWorkLoop * workLoop; + }; + +/*! @var reserved + * Reserved for future use. (Internal use only) */ + APPLE_KEXT_WSHADOW_PUSH; + ExpansionData *reserved; + APPLE_KEXT_WSHADOW_POP; + +/*! @function timeout + * @abstract Function that routes the call from the OS' timeout mechanism into a work-loop context. + * @discussion timeout will normally not be called nor overridden by a subclass. If the event source is enabled then close the work-loop's gate and call the action routine. + * @param self This argument will be cast to an IOTimerEventSource. */ + static void timeout(void *self); + +/*! @function setTimeoutFunc + * @abstract Set's timeout as the function of calloutEntry. + * @discussion IOTimerEventSource is based upon the kern/thread_call.h APIs currently. This function allocates the calloutEntry member variable by using thread_call_allocate(timeout, this). If you need to write your own subclass of IOTimerEventSource you probably should override this method to allocate an entry that points to your own timeout routine. */ + virtual void setTimeoutFunc(); + +/*! @function free + * @abstract Sub-class implementation of free method, frees calloutEntry */ + virtual void free() APPLE_KEXT_OVERRIDE; + + virtual void setWorkLoop(IOWorkLoop *workLoop) APPLE_KEXT_OVERRIDE; + +public: + +/*! @typedef Action + * @discussion 'C' Function pointer defining the callout routine of this event source. + * @param owner Owning target object. Note by a startling coincidence the first parameter in a C callout is currently used to define the target of a C++ member function. + * @param sender The object that timed out. */ + typedef void (*Action)(OSObject *owner, IOTimerEventSource *sender); + +#ifdef __BLOCKS__ + typedef void (^ActionBlock)(IOTimerEventSource *sender); +#endif /* __BLOCKS__ */ + + static IOTimerEventSource * + timerEventSource(OSObject *owner, Action action = NULL); + +/*! @function timerEventSource + * @abstract Allocates and returns an initialized timer instance. + * @param options Mask of kIOTimerEventSourceOptions* options. + * @param owner The object that that will be passed to the Action callback. + * @param action 'C' Function pointer for the callout routine of this event source. + */ + static IOTimerEventSource * + timerEventSource(uint32_t options, OSObject *owner, Action action = NULL); + +#ifdef __BLOCKS__ +/*! @function timerEventSource + * @abstract Allocates and returns an initialized timer instance. + * @param options Mask of kIOTimerEventSourceOptions* options. + * @param inOwner The object that that will be passed to the Action callback. + * @param action Block for the callout routine of this event source. + */ + static IOTimerEventSource * + timerEventSource(uint32_t options, OSObject *inOwner, ActionBlock action); +#endif /* __BLOCKS__ */ + + +/*! @function init + * @abstract Initializes the timer with an owner, and a handler to call when the timeout expires. + */ + virtual bool init(OSObject *owner, Action action = NULL); + +/*! @function enable + * @abstract Enables a call to the action. + * @discussion Allows the action function to be called. If the timer event source was disabled while a call was outstanding and the call wasn't cancelled then it will be rescheduled. So a disable/enable pair will disable calls from this event source. */ + virtual void enable() APPLE_KEXT_OVERRIDE; + +/*! @function disable + * @abstract Disable a timed callout. + * @discussion When disable returns the action will not be called until the next time enable(qv) is called. */ + virtual void disable() APPLE_KEXT_OVERRIDE; + +/*! @function checkForWork + * @abstract Pure Virtual member function used by IOWorkLoop for issuing a client calls. + * @discussion This function called when the work-loop is ready to check for any work to do and then to call out the owner/action. + * @result Return true if this function needs to be called again before all its outstanding events have been processed. */ + virtual bool checkForWork() APPLE_KEXT_OVERRIDE; + +/*! @function setTimeoutTicks + * @abstract Setup a callback at after the delay in scheduler ticks. See wakeAtTime(AbsoluteTime). + * @param ticks Delay from now to wake up, in scheduler ticks, whatever that may be. + * @result kIOReturnSuccess if everything is fine, kIOReturnNoResources if action hasn't been declared. */ + virtual IOReturn setTimeoutTicks(UInt32 ticks); + +/*! @function setTimeoutMS + * @abstract Setup a callback at after the delay in milliseconds. See wakeAtTime(AbsoluteTime). + * @param ms Delay from now to wake up, time in milliseconds. + * @result kIOReturnSuccess if everything is fine, kIOReturnNoResources if action hasn't been declared. */ + virtual IOReturn setTimeoutMS(UInt32 ms); + +/*! @function setTimeoutUS + * @abstract Setup a callback at after the delay in microseconds. See wakeAtTime(AbsoluteTime). + * @param us Delay from now to wake up, time in microseconds. + * @result kIOReturnSuccess if everything is fine, kIOReturnNoResources if action hasn't been declared. */ + virtual IOReturn setTimeoutUS(UInt32 us); + +/*! @function setTimeout + * @abstract Setup a callback at after the delay in some unit. See wakeAtTime(AbsoluteTime). + * @param interval Delay from now to wake up in some defined unit. + * @param scale_factor Define the unit of interval, default to nanoseconds. + * @result kIOReturnSuccess if everything is fine, kIOReturnNoResources if action hasn't been declared. */ + virtual IOReturn setTimeout(UInt32 interval, + UInt32 scale_factor = kNanosecondScale); + +#if !defined(__LP64__) + virtual IOReturn setTimeout(mach_timespec_t interval) + APPLE_KEXT_DEPRECATED; +#endif + +/*! @function setTimeout + * @abstract Setup a callback at after the delay in decrementer ticks. See wakeAtTime(AbsoluteTime). + * @param interval Delay from now to wake up in decrementer ticks. + * @result kIOReturnSuccess if everything is fine, kIOReturnNoResources if action hasn't been declared. */ + virtual IOReturn setTimeout(AbsoluteTime interval); + +/*! @function wakeAtTimeTicks + * @abstract Setup a callback at this absolute time. See wakeAtTime(AbsoluteTime). + * @param ticks Time to wake up in scheduler quantums, whatever that is? + * @result kIOReturnSuccess if everything is fine, kIOReturnNoResources if action hasn't been declared. */ + virtual IOReturn wakeAtTimeTicks(UInt32 ticks); + +/*! @function wakeAtTimeMS + * @abstract Setup a callback at this absolute time. See wakeAtTime(AbsoluteTime). + * @param ms Time to wake up in milliseconds. + * @result kIOReturnSuccess if everything is fine, kIOReturnNoResources if action hasn't been declared. */ + virtual IOReturn wakeAtTimeMS(UInt32 ms); + +/*! @function wakeAtTimeUS + * @abstract Setup a callback at this absolute time. See wakeAtTime(AbsoluteTime). + * @param us Time to wake up in microseconds. + * @result kIOReturnSuccess if everything is fine, kIOReturnNoResources if action hasn't been declared. */ + virtual IOReturn wakeAtTimeUS(UInt32 us); + +/*! @function wakeAtTime + * @abstract Setup a callback at this absolute time. See wakeAtTime(AbsoluteTime). + * @param abstime Time to wake up in some unit. + * @param scale_factor Define the unit of abstime, default to nanoseconds. + * @result kIOReturnSuccess if everything is fine, kIOReturnNoResources if action hasn't been declared. */ + virtual IOReturn wakeAtTime(UInt32 abstime, + UInt32 scale_factor = kNanosecondScale); + +#if !defined(__LP64__) + virtual IOReturn wakeAtTime(mach_timespec_t abstime) + APPLE_KEXT_DEPRECATED; +#endif + +/*! @function wakeAtTime + * @abstract Setup a callback at this absolute time. + * @discussion Starts the timer, which will expire at abstime. After it expires, the timer will call the 'action' registered in the init() function. This timer is not periodic, a further call is needed to reset and restart the timer after it expires. + * @param abstime Absolute Time when to wake up, counted in 'decrementer' units and starts at zero when system boots. + * @result kIOReturnSuccess if everything is fine, kIOReturnNoResources if action hasn't been declared by init or IOEventSource::setAction (qqv). */ + virtual IOReturn wakeAtTime(AbsoluteTime abstime); + +/*! @function cancelTimeout + * @abstract Disable any outstanding calls to this event source. + * @discussion Clear down any oustanding calls. By the time this function completes it is guaranteed that the action will not be called again. */ + virtual void cancelTimeout(); + +/*! @function init + * @abstract Initializes the timer with an owner, and a handler to call when the timeout expires. + */ + virtual bool init(uint32_t options, OSObject *inOwner, Action inAction); + +/*! @function setTimeout + * @abstract Setup a callback at after the delay in decrementer ticks. See wakeAtTime(AbsoluteTime). + * @param options see kIOTimeOptionsWithLeeway and kIOTimeOptionsContinuous + * @param interval Delay from now to wake up in decrementer ticks. + * @param leeway Allowable leeway to wake time, if the kIOTimeOptionsWithLeeway option is set + * @result kIOReturnSuccess if everything is fine, kIOReturnNoResources if action hasn't been declared. */ + virtual IOReturn setTimeout(uint32_t options, AbsoluteTime interval, AbsoluteTime leeway); + +/*! @function wakeAtTime + * @abstract Setup a callback at this absolute time. + * @discussion Starts the timer, which will expire at abstime. After it expires, the timer will call the 'action' registered in the init() function. This timer is not periodic, a further call is needed to reset and restart the timer after it expires. + * @param options see kIOTimeOptionsWithLeeway and kIOTimeOptionsContinuous + * @param abstime Absolute Time when to wake up, counted in 'decrementer' units and starts at zero when system boots. + * @param leeway Allowable leeway to wake time, if the kIOTimeOptionsWithLeeway option is set + * @result kIOReturnSuccess if everything is fine, kIOReturnNoResources if action hasn't been declared by init or IOEventSource::setAction (qqv). */ + virtual IOReturn wakeAtTime(uint32_t options, AbsoluteTime abstime, AbsoluteTime leeway); + +private: + static void timeoutAndRelease(void *self, void *c); + static void timeoutSignaled(void *self, void *c); + +private: + OSMetaClassDeclareReservedUsed(IOTimerEventSource, 0); + OSMetaClassDeclareReservedUsed(IOTimerEventSource, 1); + OSMetaClassDeclareReservedUsed(IOTimerEventSource, 2); + OSMetaClassDeclareReservedUnused(IOTimerEventSource, 3); + OSMetaClassDeclareReservedUnused(IOTimerEventSource, 4); + OSMetaClassDeclareReservedUnused(IOTimerEventSource, 5); + OSMetaClassDeclareReservedUnused(IOTimerEventSource, 6); + OSMetaClassDeclareReservedUnused(IOTimerEventSource, 7); +}; + +#endif /* !_IOTIMEREVENTSOURCE */ diff --git a/QualcommWireless/include/IOKit/IOTypes.h b/QualcommWireless/include/IOKit/IOTypes.h new file mode 100644 index 0000000..22f8942 --- /dev/null +++ b/QualcommWireless/include/IOKit/IOTypes.h @@ -0,0 +1,250 @@ +/* + * Copyright (c) 1998-2012 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +#ifndef __IOKIT_IOTYPES_H +#define __IOKIT_IOTYPES_H + + +#ifndef IOKIT +#define IOKIT 1 +#endif /* !IOKIT */ + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef NULL +#if defined (__cplusplus) +#if __cplusplus >= 201103L +#define NULL nullptr +#else +#define NULL 0 +#endif +#else +#define NULL ((void *)0) +#endif +#endif + +/* + * Simple data types. + */ +#include +#include + +#include + +typedef UInt32 IOOptionBits; +typedef SInt32 IOFixed; +typedef UInt32 IOVersion; +typedef UInt32 IOItemCount; +typedef UInt32 IOCacheMode; + +typedef UInt32 IOByteCount32; +typedef UInt64 IOByteCount64; + +typedef UInt32 IOPhysicalAddress32; +typedef UInt64 IOPhysicalAddress64; +typedef UInt32 IOPhysicalLength32; +typedef UInt64 IOPhysicalLength64; + +#if !defined(__arm__) && !defined(__i386__) +typedef mach_vm_address_t IOVirtualAddress; +#else +typedef vm_address_t IOVirtualAddress; +#endif + +#if !defined(__arm__) && !defined(__i386__) && !(defined(__x86_64__) && !defined(KERNEL)) && !(defined(__arm64__) && !defined(__LP64__)) +typedef IOByteCount64 IOByteCount; +#else +typedef IOByteCount32 IOByteCount; +#endif + +typedef IOVirtualAddress IOLogicalAddress; + +#if !defined(__arm__) && !defined(__i386__) && !(defined(__x86_64__) && !defined(KERNEL)) + +typedef IOPhysicalAddress64 IOPhysicalAddress; +typedef IOPhysicalLength64 IOPhysicalLength; +#define IOPhysical32( hi, lo ) ((UInt64) lo + ((UInt64)(hi) << 32)) +#define IOPhysSize 64 + +#else + +typedef IOPhysicalAddress32 IOPhysicalAddress; +typedef IOPhysicalLength32 IOPhysicalLength; +#define IOPhysical32( hi, lo ) (lo) +#define IOPhysSize 32 + +#endif + + +typedef struct{ + IOPhysicalAddress address; + IOByteCount length; +} IOPhysicalRange; + +typedef struct{ + IOVirtualAddress address; + IOByteCount length; +} IOVirtualRange; + +#if !defined(__arm__) && !defined(__i386__) +typedef IOVirtualRange IOAddressRange; +#else +typedef struct{ + mach_vm_address_t address; + mach_vm_size_t length; +} IOAddressRange; +#endif + +/* + * Map between #defined or enum'd constants and text description. + */ +typedef struct { + int value; + const char *name; +} IONamedValue; + + +/* + * Memory alignment -- specified as a power of two. + */ +typedef unsigned int IOAlignment; + +#define IO_NULL_VM_TASK ((vm_task_t)0) + + +/* + * Pull in machine specific stuff. + */ + +//#include + +#ifndef MACH_KERNEL + +#ifndef __IOKIT_PORTS_DEFINED__ +#define __IOKIT_PORTS_DEFINED__ +#ifdef __cplusplus +class OSObject; +typedef OSObject * io_object_t; +#else +typedef struct OSObject * io_object_t; +#endif +#endif /* __IOKIT_PORTS_DEFINED__ */ + +#include + +typedef io_object_t io_connect_t; +typedef io_object_t io_enumerator_t; +typedef io_object_t io_iterator_t; +typedef io_object_t io_registry_entry_t; +typedef io_object_t io_service_t; +typedef io_object_t uext_object_t; + +#define IO_OBJECT_NULL ((io_object_t) 0) + +#endif /* MACH_KERNEL */ + +// IOConnectMapMemory memoryTypes +enum { + kIODefaultMemoryType = 0 +}; + +enum { + kIODefaultCache = 0, + kIOInhibitCache = 1, + kIOWriteThruCache = 2, + kIOCopybackCache = 3, + kIOWriteCombineCache = 4, + kIOCopybackInnerCache = 5, + kIOPostedWrite = 6, + kIORealTimeCache = 7, + kIOPostedReordered = 8, + kIOPostedCombinedReordered = 9, +}; + +// IOMemory mapping options +enum { + kIOMapAnywhere = 0x00000001, + + kIOMapCacheMask = 0x00000f00, + kIOMapCacheShift = 8, + kIOMapDefaultCache = kIODefaultCache << kIOMapCacheShift, + kIOMapInhibitCache = kIOInhibitCache << kIOMapCacheShift, + kIOMapWriteThruCache = kIOWriteThruCache << kIOMapCacheShift, + kIOMapCopybackCache = kIOCopybackCache << kIOMapCacheShift, + kIOMapWriteCombineCache = kIOWriteCombineCache << kIOMapCacheShift, + kIOMapCopybackInnerCache = kIOCopybackInnerCache << kIOMapCacheShift, + kIOMapPostedWrite = kIOPostedWrite << kIOMapCacheShift, + kIOMapRealTimeCache = kIORealTimeCache << kIOMapCacheShift, + kIOMapPostedReordered = kIOPostedReordered << kIOMapCacheShift, + kIOMapPostedCombinedReordered = kIOPostedCombinedReordered << kIOMapCacheShift, + + kIOMapUserOptionsMask = 0x00000fff, + + kIOMapReadOnly = 0x00001000, + + kIOMapStatic = 0x01000000, + kIOMapReference = 0x02000000, + kIOMapUnique = 0x04000000, + kIOMapPrefault = 0x10000000, + kIOMapOverwrite = 0x20000000 +}; + +/*! @enum Scale Factors + * @discussion Used when a scale_factor parameter is required to define a unit of time. + * @constant kNanosecondScale Scale factor for nanosecond based times. + * @constant kMicrosecondScale Scale factor for microsecond based times. + * @constant kMillisecondScale Scale factor for millisecond based times. + * @constant kTickScale Scale factor for the standard (100Hz) tick. + * @constant kSecondScale Scale factor for second based times. */ + +enum { + kNanosecondScale = 1, + kMicrosecondScale = 1000, + kMillisecondScale = 1000 * 1000, + kSecondScale = 1000 * 1000 * 1000, + kTickScale = (kSecondScale / 100) +}; + +enum { + kIOConnectMethodVarOutputSize = -3 +}; + +/* compatibility types */ + + +#ifdef __cplusplus +} +#endif + + +#endif /* ! __IOKIT_IOTYPES_H */ diff --git a/QualcommWireless/include/IOKit/IOUserClient.h b/QualcommWireless/include/IOKit/IOUserClient.h new file mode 100644 index 0000000..4deedea --- /dev/null +++ b/QualcommWireless/include/IOKit/IOUserClient.h @@ -0,0 +1,440 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +/* + * Changes to this API are expected. + */ + +#ifndef _IOKIT_IOUSERCLIENT_H +#define _IOKIT_IOUSERCLIENT_H + +#include +#include +#include +#include + +#if IOKITSTATS +#include +#endif + +#define _IOUSERCLIENT_SENDASYNCRESULT64WITHOPTIONS_ 1 + +enum { + kIOUCTypeMask = 0x0000000f, + kIOUCScalarIScalarO = 0, + kIOUCScalarIStructO = 2, + kIOUCStructIStructO = 3, + kIOUCScalarIStructI = 4, + + kIOUCForegroundOnly = 0x00000010, +}; + +/*! @enum + * @abstract Constant to denote a variable length structure argument to IOUserClient. + * @constant kIOUCVariableStructureSize Use in the structures IOExternalMethod, IOExternalAsyncMethod, IOExternalMethodDispatch to specify the size of the structure is variable. + */ +enum { + kIOUCVariableStructureSize = 0xffffffff +}; + + +typedef IOReturn (IOService::*IOMethod)(void * p1, void * p2, void * p3, + void * p4, void * p5, void * p6 ); + +typedef IOReturn (IOService::*IOAsyncMethod)(OSAsyncReference asyncRef, + void * p1, void * p2, void * p3, + void * p4, void * p5, void * p6 ); + +typedef IOReturn (IOService::*IOTrap)(void * p1, void * p2, void * p3, + void * p4, void * p5, void * p6 ); + +typedef IOReturn (*IOMethodACID32)(IOService * svc, void * p1, void * p2, void * p3, + void * p4, void * p5, void * p6 ); + +typedef IOReturn (*IOAsyncMethodACID32)(IOService * svc, OSAsyncReference asyncRef, + void * p1, void * p2, void * p3, + void * p4, void * p5, void * p6 ); + +typedef IOReturn (*IOTrapACID32)(IOService * svc, void * p1, void * p2, void * p3, + void * p4, void * p5, void * p6 ); + +// +// When building for i386, clang does not emit code that is compatible with GCC-built code for the below structs. +// The below struct modifications are workarounds to have the correct positioning of the function pointer. +// +// padding must be set to kIOExternalMethodACIDClangPadding +// +#if (defined(__i386__) && defined(__clang__)) +#define kIOExternalMethodACID32Padding 0xFFFF0000 +#endif + +struct IOExternalMethod { + IOService * object; +#if (defined(__i386__) && defined(__clang__)) + uint32_t padding; + IOMethodACID32 func; +#else + IOMethod func; +#endif + IOOptionBits flags; + IOByteCount count0; + IOByteCount count1; +}; + +struct IOExternalAsyncMethod { + IOService * object; +#if (defined(__i386__) && defined(__clang__)) + uint32_t padding; + IOAsyncMethodACID32 func; +#else + IOAsyncMethod func; +#endif + IOOptionBits flags; + IOByteCount count0; + IOByteCount count1; +}; + +struct IOExternalTrap { + IOService * object; +#if (defined(__i386__) && defined(__clang__)) + uint32_t padding; + IOTrapACID32 func; +#else + IOTrap func; +#endif +}; + +enum { + kIOUserNotifyMaxMessageSize = 64 +}; + +enum { + kIOUserNotifyOptionCanDrop = 0x1 /* Fail if queue is full, rather than infinitely queuing. */ +}; + +// keys for clientHasPrivilege +#define kIOClientPrivilegeAdministrator "root" +#define kIOClientPrivilegeLocalUser "local" +#define kIOClientPrivilegeForeground "foreground" + +/*! @enum + * @abstract Constants to specify the maximum number of scalar arguments in the IOExternalMethodArguments structure. These constants are documentary since the scalarInputCount, scalarOutputCount fields reflect the actual number passed. + * @constant kIOExternalMethodScalarInputCountMax The maximum number of scalars able to passed on input. + * @constant kIOExternalMethodScalarOutputCountMax The maximum number of scalars able to passed on output. + */ +enum { + kIOExternalMethodScalarInputCountMax = 16, + kIOExternalMethodScalarOutputCountMax = 16, +}; + + +struct IOExternalMethodArguments { + uint32_t version; + + uint32_t selector; + + mach_port_t asyncWakePort; + io_user_reference_t * asyncReference; + uint32_t asyncReferenceCount; + + const uint64_t * scalarInput; + uint32_t scalarInputCount; + + const void * structureInput; + uint32_t structureInputSize; + + IOMemoryDescriptor * structureInputDescriptor; + + uint64_t * scalarOutput; + uint32_t scalarOutputCount; + + void * structureOutput; + uint32_t structureOutputSize; + + IOMemoryDescriptor * structureOutputDescriptor; + uint32_t structureOutputDescriptorSize; + + uint32_t __reservedA; + + OSObject ** structureVariableOutputData; + + uint32_t __reserved[30]; +}; + +typedef IOReturn (*IOExternalMethodAction)(OSObject * target, void * reference, + IOExternalMethodArguments * arguments); +struct IOExternalMethodDispatch { + IOExternalMethodAction function; + uint32_t checkScalarInputCount; + uint32_t checkStructureInputSize; + uint32_t checkScalarOutputCount; + uint32_t checkStructureOutputSize; +}; + +enum { +#define IO_EXTERNAL_METHOD_ARGUMENTS_CURRENT_VERSION 2 + kIOExternalMethodArgumentsCurrentVersion = IO_EXTERNAL_METHOD_ARGUMENTS_CURRENT_VERSION +}; + + +/*! + * @class IOUserClient + * @abstract Provides a basis for communication between client applications and I/O Kit objects. + */ + +class IOUserClient : public IOService +{ + OSDeclareAbstractStructorsWithDispatch(IOUserClient); +#if IOKITSTATS + friend class IOStatistics; +#endif + +protected: +/*! @struct ExpansionData + * @discussion This structure will be used to expand the capablilties of this class in the future. + */ + struct ExpansionData { +#if IOKITSTATS + IOUserClientCounter *counter; +#else + void *iokitstatsReserved; +#endif + }; + +/*! @var reserved + * Reserved for future use. (Internal use only) + */ + APPLE_KEXT_WSHADOW_PUSH; + ExpansionData * reserved; + APPLE_KEXT_WSHADOW_POP; + + bool reserve(); + +private: + void * __reserved[9]; + +public: +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_5 + MIG_SERVER_ROUTINE virtual IOReturn + externalMethod(uint32_t selector, IOExternalMethodArguments *arguments, + IOExternalMethodDispatch *dispatch = NULL, + OSObject *target = NULL, void *reference = NULL); +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_6 + MIG_SERVER_ROUTINE virtual IOReturn registerNotificationPort( + mach_port_t port, UInt32 type, io_user_reference_t refCon); +#endif + +private: +#if __LP64__ + + OSMetaClassDeclareReservedUnused(IOUserClient, 0); + OSMetaClassDeclareReservedUnused(IOUserClient, 1); + +#else + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_5 + OSMetaClassDeclareReservedUsed(IOUserClient, 0); +#else + OSMetaClassDeclareReservedUnused(IOUserClient, 0); +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_6 + OSMetaClassDeclareReservedUsed(IOUserClient, 1); +#else + OSMetaClassDeclareReservedUnused(IOUserClient, 1); +#endif + +#endif + OSMetaClassDeclareReservedUnused(IOUserClient, 2); + OSMetaClassDeclareReservedUnused(IOUserClient, 3); + OSMetaClassDeclareReservedUnused(IOUserClient, 4); + OSMetaClassDeclareReservedUnused(IOUserClient, 5); + OSMetaClassDeclareReservedUnused(IOUserClient, 6); + OSMetaClassDeclareReservedUnused(IOUserClient, 7); + OSMetaClassDeclareReservedUnused(IOUserClient, 8); + OSMetaClassDeclareReservedUnused(IOUserClient, 9); + OSMetaClassDeclareReservedUnused(IOUserClient, 10); + OSMetaClassDeclareReservedUnused(IOUserClient, 11); + OSMetaClassDeclareReservedUnused(IOUserClient, 12); + OSMetaClassDeclareReservedUnused(IOUserClient, 13); + OSMetaClassDeclareReservedUnused(IOUserClient, 14); + OSMetaClassDeclareReservedUnused(IOUserClient, 15); + + +protected: + static IOReturn sendAsyncResult(OSAsyncReference reference, + IOReturn result, void *args[], UInt32 numArgs); + static void setAsyncReference(OSAsyncReference asyncRef, + mach_port_t wakePort, + void *callback, void *refcon); + + static IOReturn sendAsyncResult64(OSAsyncReference64 reference, + IOReturn result, io_user_reference_t args[], UInt32 numArgs); + +/*! + * @function sendAsyncResult64WithOptions + * @abstract Send a notification as with sendAsyncResult, but with finite queueing. + * @discussion IOUserClient::sendAsyncResult64() will infitely queue messages if the client + * is not processing them in a timely fashion. This variant will not, for simple + * handling of situations where clients may be expected to stop processing messages. + */ + static IOReturn sendAsyncResult64WithOptions(OSAsyncReference64 reference, + IOReturn result, io_user_reference_t args[], UInt32 numArgs, + IOOptionBits options); + + static void setAsyncReference64(OSAsyncReference64 asyncRef, + mach_port_t wakePort, + mach_vm_address_t callback, io_user_reference_t refcon); + + static void setAsyncReference64(OSAsyncReference64 asyncRef, + mach_port_t wakePort, + mach_vm_address_t callback, io_user_reference_t refcon, + task_t task); + +public: + + static IOReturn clientHasAuthorization( task_t task, + IOService * service ); + + static IOReturn clientHasPrivilege( void * securityToken, + const char * privilegeName ); + + static OSObject * copyClientEntitlement( task_t task, + const char * entitlement ); + + static OSDictionary * copyClientEntitlements(task_t task); + +/*! + * @function releaseAsyncReference64 + * @abstract Release the mach_port_t reference held within the OSAsyncReference64 structure. + * @discussion The OSAsyncReference64 structure passed to async methods holds a reference to the wakeup mach port, which should be released to balance each async method call. Behavior is undefined if these calls are not correctly balanced. + * @param reference The reference passed to the subclass IOAsyncMethod, or externalMethod() in the IOExternalMethodArguments.asyncReference field. + * @result A return code. + */ + static IOReturn releaseAsyncReference64(OSAsyncReference64 reference); +/*! + * @function releaseNotificationPort + * @abstract Release the mach_port_t passed to registerNotificationPort(). + * @discussion The mach_port_t passed to the registerNotificationPort() methods should be released to balance each call to registerNotificationPort(). Behavior is undefined if these calls are not correctly balanced. + * @param port The mach_port_t argument previously passed to the subclass implementation of registerNotificationPort(). + * @result A return code. + */ + static IOReturn releaseNotificationPort(mach_port_t port); + + virtual bool init() APPLE_KEXT_OVERRIDE; + virtual bool init( OSDictionary * dictionary ) APPLE_KEXT_OVERRIDE; +// Currently ignores the all args, just passes up to IOService::init() + virtual bool initWithTask( + task_t owningTask, void * securityToken, UInt32 type, + OSDictionary * properties); + + virtual bool initWithTask( + task_t owningTask, void * securityToken, UInt32 type); + + virtual void free() APPLE_KEXT_OVERRIDE; + + virtual IOReturn clientClose( void ); + virtual IOReturn clientDied( void ); + + virtual IOService * getService( void ); + + MIG_SERVER_ROUTINE virtual IOReturn registerNotificationPort( + mach_port_t port, UInt32 type, UInt32 refCon ); + + MIG_SERVER_ROUTINE virtual IOReturn getNotificationSemaphore( UInt32 notification_type, + semaphore_t * semaphore ); + + virtual IOReturn connectClient( IOUserClient * client ); + +// memory will be released by user client when last map is destroyed + virtual IOReturn clientMemoryForType( UInt32 type, + IOOptionBits * options, + IOMemoryDescriptor ** memory ); + +#if !__LP64__ +private: + APPLE_KEXT_COMPATIBILITY_VIRTUAL + IOMemoryMap * mapClientMemory( IOOptionBits type, + task_t task, + IOOptionBits mapFlags = kIOMapAnywhere, + IOVirtualAddress atAddress = 0 ); +#endif + + static IOReturn _sendAsyncResult64(OSAsyncReference64 reference, + IOReturn result, io_user_reference_t args[], UInt32 numArgs, IOOptionBits options); +public: + +/*! + * @function removeMappingForDescriptor + * Remove the first mapping created from the memory descriptor returned by clientMemoryForType() from IOUserClient's list of mappings. If such a mapping exists, it is retained and the reference currently held by IOUserClient is returned to the caller. + * @param memory The memory descriptor instance previously returned by the implementation of clientMemoryForType(). + * @result A reference to the first IOMemoryMap instance found in the list of mappings created by IOUserClient from that passed memory descriptor is returned, or zero if none exist. The caller should release this reference. + */ + IOMemoryMap * removeMappingForDescriptor(IOMemoryDescriptor * memory); + +/*! + * @function exportObjectToClient + * Make an arbitrary OSObject available to the client task. + * @param task The task. + * @param obj The object we want to export to the client. + * @param clientObj Returned value is the client's port name. + */ + virtual IOReturn exportObjectToClient(task_t task, + OSObject *obj, io_object_t *clientObj); + + +// Old methods for accessing method vector backward compatiblility only + virtual IOExternalMethod * + getExternalMethodForIndex( UInt32 index ) + APPLE_KEXT_DEPRECATED; + virtual IOExternalAsyncMethod * + getExternalAsyncMethodForIndex( UInt32 index ) + APPLE_KEXT_DEPRECATED; + +// Methods for accessing method vector. + virtual IOExternalMethod * + getTargetAndMethodForIndex( + LIBKERN_RETURNS_NOT_RETAINED IOService ** targetP, UInt32 index ); + virtual IOExternalAsyncMethod * + getAsyncTargetAndMethodForIndex( + LIBKERN_RETURNS_NOT_RETAINED IOService ** targetP, UInt32 index ); + +// Methods for accessing trap vector - old and new style + virtual IOExternalTrap * + getExternalTrapForIndex( UInt32 index ) + APPLE_KEXT_DEPRECATED; + + virtual IOExternalTrap * + getTargetAndTrapForIndex( + LIBKERN_RETURNS_NOT_RETAINED IOService **targetP, UInt32 index ); +}; + + +#endif /* ! _IOKIT_IOUSERCLIENT_H */ diff --git a/QualcommWireless/include/IOKit/IOUserServer.h b/QualcommWireless/include/IOKit/IOUserServer.h new file mode 100644 index 0000000..66003db --- /dev/null +++ b/QualcommWireless/include/IOKit/IOUserServer.h @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + + +#ifndef _IOUSERSERVER_H +#define _IOUSERSERVER_H + +#include + +#define kIOUserClassKey "IOUserClass" +#define kIOUserServerClassKey "IOUserServer" +#define kIOUserServerNameKey "IOUserServerName" +#define kIOUserServerTagKey "IOUserServerTag" +// the expected cdhash value of the userspace driver executable +#define kIOUserServerCDHashKey "IOUserServerCDHash" + +#if DRIVERKIT_PRIVATE + +enum{ + kIOKitUserServerClientType = 0x99000003, +}; + +enum{ + kIOUserServerMethodRegisterClass = 0x0001000, + kIOUserServerMethodStart = 0x0001001, + kIOUserServerMethodRegister = 0x0001002, +}; + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +class OSObject; + +#define OSObject_Instantiate_ID 0x0000000100000001ULL + +enum { + kOSObjectRPCRemote = 0x00000001, + kOSObjectRPCKernel = 0x00000002, +}; + +struct OSObject_Instantiate_Msg_Content { + IORPCMessage __hdr; + OSObjectRef __object; +}; + +struct OSObject_Instantiate_Rpl_Content { + IORPCMessage __hdr; + kern_return_t __result; + uint32_t __pad; + uint64_t flags; + char classname[64]; + uint64_t methods[0]; +}; + +#pragma pack(4) +struct OSObject_Instantiate_Msg { + IORPCMessageMach mach; + mach_msg_port_descriptor_t __object__descriptor; + OSObject_Instantiate_Msg_Content content; +}; +struct OSObject_Instantiate_Rpl { + IORPCMessageMach mach; + OSObject_Instantiate_Rpl_Content content; +}; +#pragma pack() + +typedef uint64_t IOTrapMessageBuffer[256]; + +#endif /* DRIVERKIT_PRIVATE */ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#endif /* _IOUSERSERVER_H */ diff --git a/QualcommWireless/include/IOKit/IOWorkLoop.h b/QualcommWireless/include/IOKit/IOWorkLoop.h new file mode 100644 index 0000000..f0dd49b --- /dev/null +++ b/QualcommWireless/include/IOKit/IOWorkLoop.h @@ -0,0 +1,361 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef __IOKIT_IOWORKLOOP_H +#define __IOKIT_IOWORKLOOP_H + +#include +#include +#include +#include + +#include + +#if IOKITSTATS +#include +#endif + +class IOEventSource; +class IOTimerEventSource; +class IOCommandGate; + +/*! @class IOWorkLoop + * @discussion An IOWorkLoop is a thread of control that is intended to be used to provide single threaded access to hardware. This class has no knowledge of the nature and type of the events that it marshals and forwards. When a device driver successfully starts (see IOService::start), it is expected to create the event sources it will need to receive events. Then a work loop is initialized and the events are added to the work loop for monitoring. In general this set up will be automated by the family superclass of the specific device. + *

+ * The thread main method walks the event source linked list and messages each one requesting a work check. At this point each event source is expected to notify its registered owner that the event has occurred. After each event has been walked and each indicates that another loop isn't required (by setting the 'more' flag to false) the thread will go to sleep on a signaling semaphore. + *

+ * When an event source is registered with a work loop it is informed of the semaphore to use to wake up the loop. + */ + +class IOWorkLoop : public OSObject +{ + OSDeclareDefaultStructors(IOWorkLoop); + +public: +/*! + * @typedef Action + * @discussion Type and arguments of callout C function that is used when + * a runCommand is executed by a client. Cast to this type when you want a C++ + * member function to be used. Note the arg1 - arg3 parameters are straight pass + * through from the runCommand to the action callout. + * @param target + * Target of the function, can be used as a refcon. Note if a C++ function + * was specified, this parameter is implicitly the first parameter in the target + * member function's parameter list. + * @param arg0 Argument to action from run operation. + * @param arg1 Argument to action from run operation. + * @param arg2 Argument to action from run operation. + * @param arg3 Argument to action from run operation. + */ + typedef IOReturn (*Action)(OSObject *target, + void *arg0, void *arg1, + void *arg2, void *arg3); + +#ifdef __BLOCKS__ + typedef IOReturn (^ActionBlock)(); +#endif /* __BLOCKS__ */ + + enum { + kPreciousStack = 0x00000001, + kTimeLockPanics = 0x00000002, + }; + +private: +/*! @function threadMainContinuation + * @abstract Static function that calls the threadMain function. + */ + static void threadMainContinuation(IOWorkLoop *self); + +/*! @function eventSourcePerformsWork + * @abstract Checks if the event source passed in overrides checkForWork() to perform any work. + * IOWorkLoop uses this to determine if the event source should be polled in runEventSources() or not. + * @param inEventSource The event source to check. + */ + bool eventSourcePerformsWork(IOEventSource *inEventSource); + +protected: + +/*! @typedef maintCommandEnum + * @discussion Enumeration of commands that _maintCommand can deal with. + * @constant mAddEvent Used to tag a Remove event source command. + * @constant mRemoveEvent Used to tag a Remove event source command. + */ + typedef enum { mAddEvent, mRemoveEvent } maintCommandEnum; + +/*! @var gateLock + * Mutual exclusion lock that is used by close and open Gate functions. + * This is a recursive lock, which allows multiple layers of code to share a single IOWorkLoop without deadlock. This is common in IOKit since threads of execution tend to follow the service plane in the IORegistry, and multiple objects along the call path may acquire the gate for the same (shared) workloop. + */ + IORecursiveLock *gateLock; + +/*! @var eventChain + * Pointer to first event source in linked list. + */ + IOEventSource *eventChain; + +/*! @var controlG + * Internal control gate to maintain event system. + */ + IOCommandGate *controlG; + +/*! @var workToDoLock + * The spin lock that is used to guard the 'workToDo' variable. + */ + IOSimpleLock *workToDoLock; + +/*! @var workThread + * Work loop thread. + */ + IOThread workThread; + +/*! @var workToDo + * Used to to indicate that an interrupt has fired and needs to be processed. + */ + volatile bool workToDo; + +/*! @var loopRestart + * Set if an event chain has been changed and the system has to be rechecked from start. (Internal use only) + */ + bool loopRestart; + +/*! @struct ExpansionData + * @discussion This structure will be used to expand the capablilties of the IOWorkLoop in the future. + */ + struct ExpansionData { + IOOptionBits options; + IOEventSource *passiveEventChain; +#if IOKITSTATS + struct IOWorkLoopCounter *counter; +#else + void *iokitstatsReserved; +#endif + uint64_t lockInterval; + uint64_t lockTime; + }; + +/*! @var reserved + * Reserved for future use. (Internal use only) + */ + ExpansionData *reserved; + +/*! @function _maintRequest + * @abstract Synchronous implementation of addEventSource and removeEventSource functions. + * @discussion This function implements the commands as defined in the maintCommandEnum. It can be subclassed but it isn't an external API in the usual sense. A subclass implementation of _maintRequest would be called synchronously with respect to the work loop and it should be implemented in the usual way that an ioctl would be. + * @return kIOReturnUnsupported if the command given is not implemented, kIOReturnSuccess otherwise. + */ + virtual IOReturn _maintRequest(void *command, void *data, void *, void *); + +/*! @function free + * @discussion Mandatory free of the object independent of the current retain count. If the work loop is running, this method will not return until the thread has successfully terminated. Each event source in the chain will be released and the working semaphore will be destroyed. + *

+ * If the client has some outstanding requests on an event they will never be informed of completion. If an external thread is blocked on any of the event sources they will be awakened with a KERN_INTERUPTED status. + */ + virtual void free() APPLE_KEXT_OVERRIDE; + +/*! @function threadMain + * @discussion Work loop threads main function. This function consists of 3 + * loops: the outermost loop is the semaphore clear and wait loop, the middle + * loop terminates when there is no more work, and the inside loop walks the + * event list calling the checkForWork method in each event source. If an + * event source has more work to do, it can set the more flag and the middle + * loop will repeat. When no more work is outstanding the outermost will + * sleep until an event is signalled. + */ + virtual void threadMain(); + +public: + +/*! @function workLoop + * @abstract Factory member function to construct and intialize a work loop. + * @result Returns a workLoop instance if constructed successfully, 0 otherwise. + */ + static IOWorkLoop *workLoop(); + +/*! @function workLoopWithOptions(IOOptionBits options) + * @abstract Factory member function to constuct and intialize a work loop. + * @param options Options - kPreciousStack to avoid stack deallocation on paging path. + * @result Returns a workLoop instance if constructed successfully, 0 otherwise. + */ + static IOWorkLoop *workLoopWithOptions(IOOptionBits options); + +/*! @function init + * @discussion Initializes an instance of the workloop. This method creates and initializes the signaling semaphore, the controller gate lock, and spawns the thread that will continue executing. + * @result Returns true if initialized successfully, false otherwise. + */ + virtual bool init() APPLE_KEXT_OVERRIDE; + +/*! @function getThread + * @abstract Gets the workThread. + * @result Returns workThread. + */ + virtual IOThread getThread() const; + +/*! @function onThread + * @abstract Is the current execution context on the work thread? + * @result Returns true if IOThreadSelf() == workThread. + */ + virtual bool onThread() const; + +/*! @function inGate + * @abstract Is the current execution context holding the work-loop's gate? + * @result Returns true if IOThreadSelf() is gate holder. + */ + virtual bool inGate() const; + +/*! @function addEventSource + * @discussion Add an event source to be monitored by the work loop. This function does not return until the work loop has acknowledged the arrival of the new event source. When a new event has been added the threadMain will always restart its loop and check all outstanding events. The event source is retained by the work loop. + * @param newEvent Pointer to IOEventSource subclass to add. + * @result Always returns kIOReturnSuccess. + */ + virtual IOReturn addEventSource(IOEventSource *newEvent); + +/*! @function removeEventSource + * @discussion Remove an event source from the work loop. This function does not return until the work loop has acknowledged the removal of the event source. When an event has been removed the threadMain will always restart its loop and check all outstanding events. The event source will be released before return. + * @param toRemove Pointer to IOEventSource subclass to remove. + * @result Returns kIOReturnSuccess if successful, kIOReturnBadArgument if toRemove couldn't be found. + */ + virtual IOReturn removeEventSource(IOEventSource *toRemove); + +/*! @function enableAllEventSources + * @abstract Calls enable() in all event sources. + * @discussion For all event sources in eventChain, call enable() function. See IOEventSource::enable(). + */ + virtual void enableAllEventSources() const; + +/*! @function disableAllEventSources + * @abstract Calls disable() in all event sources. + * @discussion For all event sources in eventChain, call disable() function. See IOEventSource::disable(). + */ + virtual void disableAllEventSources() const; + +/*! @function enableAllInterrupts + * @abstract Calls enable() in all interrupt event sources. + * @discussion For all event sources (ES) for which OSDynamicCast(IOInterruptEventSource, ES) is valid, in eventChain call enable() function. See IOEventSource::enable(). + */ + virtual void enableAllInterrupts() const; + +/*! @function disableAllInterrupts + * @abstract Calls disable() in all interrupt event sources. + * @discussion For all event sources (ES) for which OSDynamicCast(IOInterruptEventSource, ES) is valid, in eventChain call disable() function. See IOEventSource::disable(). + */ + virtual void disableAllInterrupts() const; + + +protected: +// Internal APIs used by event sources to control the thread + friend class IOEventSource; + friend class IOTimerEventSource; + friend class IOCommandGate; +#if IOKITSTATS + friend class IOStatistics; +#endif + virtual void signalWorkAvailable(); + virtual void openGate(); + virtual void closeGate(); + virtual bool tryCloseGate(); + virtual int sleepGate(void *event, UInt32 interuptibleType); + virtual void wakeupGate(void *event, bool oneThread); + +public: +/* methods available in Mac OS X 10.1 or later */ + +/*! @function runAction + * @abstract Single thread a call to an action with the work-loop. + * @discussion Client function that causes the given action to be called in a single threaded manner. Beware: the work-loop's gate is recursive and runAction can cause direct or indirect re-entrancy. When executing on a client's thread, runAction will sleep until the work-loop's gate opens for execution of client actions, the action is single threaded against all other work-loop event sources. + * @param action Pointer to function to be executed in work-loop context. + * @param arg0 Parameter for action parameter, defaults to 0. + * @param arg1 Parameter for action parameter, defaults to 0. + * @param arg2 Parameter for action parameter, defaults to 0. + * @param arg3 Parameter for action parameter, defaults to 0. + * @result Returns the value of the Action callout. + */ + virtual IOReturn runAction(Action action, OSObject *target, + void *arg0 = NULL, void *arg1 = NULL, + void *arg2 = NULL, void *arg3 = NULL); + +#ifdef __BLOCKS__ +/*! @function runAction + * @abstract Single thread a call to an action with the work-loop. + * @discussion Client function that causes the given action to be called in a single threaded manner. Beware: the work-loop's gate is recursive and runAction can cause direct or indirect re-entrancy. When executing on a client's thread, runAction will sleep until the work-loop's gate opens for execution of client actions, the action is single threaded against all other work-loop event sources. + * @param action Block to be executed in work-loop context. + * @result Returns the result of the action block. + */ + IOReturn runActionBlock(ActionBlock action); +#endif /* __BLOCKS__ */ + +/*! @function runEventSources + * @discussion Consists of the inner 2 loops of the threadMain function(qv). + * The outer loop terminates when there is no more work, and the inside loop + * walks the event list calling the checkForWork method in each event source. + * If an event source has more work to do, it can set the more flag and the + * outer loop will repeat. + *

+ * This function can be used to clear a priority inversion between the normal + * workloop thread and multimedia's real time threads. The problem is that + * the interrupt action routine is often held off by high priority threads. + * So if they want to get their data now they will have to call us and ask if + * any data is available. The multi-media user client will arrange for this + * function to be called, which causes any pending interrupts to be processed + * and the completion routines called. By the time the function returns all + * outstanding work will have been completed at the real time threads + * priority. + * + * @result Return false if the work loop is shutting down, true otherwise. + */ + virtual bool runEventSources(); + +/*! @function setMaximumLockTime + * @discussion For diagnostics use in DEVELOPMENT kernels, set a time interval which if the work loop lock is held for this time or greater, IOWorkLoop will panic or log a backtrace. + * @param interval An absolute time interval, eg. created with clock_interval_to_absolutetime_interval(). + * @param options Pass IOWorkLoop::kTimeLockPanics to panic when the time is exceeded, otherwise a log will be generated with OSReportWithBacktrace(). + */ + void setMaximumLockTime(uint64_t interval, uint32_t options); + +protected: +// Internal APIs used by event sources to control the thread + virtual int sleepGate(void *event, AbsoluteTime deadline, UInt32 interuptibleType); + + +protected: +#if __LP64__ + OSMetaClassDeclareReservedUnused(IOWorkLoop, 0); + OSMetaClassDeclareReservedUnused(IOWorkLoop, 1); + OSMetaClassDeclareReservedUnused(IOWorkLoop, 2); +#else + OSMetaClassDeclareReservedUsed(IOWorkLoop, 0); + OSMetaClassDeclareReservedUsed(IOWorkLoop, 1); + OSMetaClassDeclareReservedUsed(IOWorkLoop, 2); +#endif + OSMetaClassDeclareReservedUnused(IOWorkLoop, 3); + OSMetaClassDeclareReservedUnused(IOWorkLoop, 4); + OSMetaClassDeclareReservedUnused(IOWorkLoop, 5); + OSMetaClassDeclareReservedUnused(IOWorkLoop, 6); + OSMetaClassDeclareReservedUnused(IOWorkLoop, 7); +}; + +#endif /* !__IOKIT_IOWORKLOOP_H */ diff --git a/QualcommWireless/include/IOKit/OSMessageNotification.h b/QualcommWireless/include/IOKit/OSMessageNotification.h new file mode 100644 index 0000000..42f1bc8 --- /dev/null +++ b/QualcommWireless/include/IOKit/OSMessageNotification.h @@ -0,0 +1,162 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. + * + * HISTORY + * + */ + +#ifndef __OS_OSMESSAGENOTIFICATION_H +#define __OS_OSMESSAGENOTIFICATION_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +enum { + kFirstIOKitNotificationType = 100, + kIOServicePublishNotificationType = 100, + kIOServiceMatchedNotificationType = 101, + kIOServiceTerminatedNotificationType = 102, + kIOAsyncCompletionNotificationType = 150, + kIOServiceMessageNotificationType = 160, + kLastIOKitNotificationType = 199, + + // reserved bits + kIOKitNoticationTypeMask = 0x00000FFF, + kIOKitNoticationTypeSizeAdjShift = 30, + kIOKitNoticationMsgSizeMask = 3, +}; + +enum { + kOSNotificationMessageID = 53, + kOSAsyncCompleteMessageID = 57, + kMaxAsyncArgs = 16 +}; + +enum { + kIOAsyncReservedIndex = 0, + kIOAsyncReservedCount, + + kIOAsyncCalloutFuncIndex = kIOAsyncReservedCount, + kIOAsyncCalloutRefconIndex, + kIOAsyncCalloutCount, + + kIOMatchingCalloutFuncIndex = kIOAsyncReservedCount, + kIOMatchingCalloutRefconIndex, + kIOMatchingCalloutCount, + + kIOInterestCalloutFuncIndex = kIOAsyncReservedCount, + kIOInterestCalloutRefconIndex, + kIOInterestCalloutServiceIndex, + kIOInterestCalloutCount +}; + + + +// -------------- +enum { + kOSAsyncRef64Count = 8, + kOSAsyncRef64Size = kOSAsyncRef64Count * ((int) sizeof(io_user_reference_t)) +}; +typedef io_user_reference_t OSAsyncReference64[kOSAsyncRef64Count]; + +struct OSNotificationHeader64 { + mach_msg_size_t size; /* content size */ + natural_t type; + OSAsyncReference64 reference; + +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) + unsigned char content[]; +#else + unsigned char content[0]; +#endif +}; + +#pragma pack(4) +struct IOServiceInterestContent64 { + natural_t messageType; + io_user_reference_t messageArgument[1]; +}; +#pragma pack() +// -------------- + +#if !KERNEL_USER32 + +enum { + kOSAsyncRefCount = 8, + kOSAsyncRefSize = 32 +}; +typedef natural_t OSAsyncReference[kOSAsyncRefCount]; + +struct OSNotificationHeader { + mach_msg_size_t size; /* content size */ + natural_t type; + OSAsyncReference reference; + +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) + unsigned char content[]; +#else + unsigned char content[0]; +#endif +}; + +#pragma pack(4) +struct IOServiceInterestContent { + natural_t messageType; + void * messageArgument[1]; +}; +#pragma pack() + +#endif /* KERNEL_USER32 */ + +struct IOAsyncCompletionContent { + IOReturn result; +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) + void * args[] __attribute__ ((packed)); +#else + void * args[0] __attribute__ ((packed)); +#endif +}; + +#ifndef __cplusplus +typedef struct OSNotificationHeader OSNotificationHeader; +typedef struct IOServiceInterestContent IOServiceInterestContent; +typedef struct IOAsyncCompletionContent IOAsyncCompletionContent; +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __OS_OSMESSAGENOTIFICATION_H */ diff --git a/QualcommWireless/include/IOKit/acpi/IOACPIPlatformDevice.h b/QualcommWireless/include/IOKit/acpi/IOACPIPlatformDevice.h new file mode 100644 index 0000000..b521a30 --- /dev/null +++ b/QualcommWireless/include/IOKit/acpi/IOACPIPlatformDevice.h @@ -0,0 +1,254 @@ +/* + * Copyright (c) 2003-2005 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOACPIPLATFORMDEVICE_H +#define _IOKIT_IOACPIPLATFORMDEVICE_H + +#include +#include +#include + +class IOACPIPlatformExpert; + +class IOACPIPlatformDevice : public IOPlatformDevice +{ + OSDeclareDefaultStructors( IOACPIPlatformDevice ) + +protected: + void * _deviceHandle; + UInt32 _deviceType; + UInt32 _powerFlags; + UInt32 * _powerStateFlags; + UInt32 _sleepPowerState; + IOService * _acpiParent; + IOACPIPlatformExpert * _platform; + + /* + * This structure will be used to expand the capablilties + * of the class in the future. + */ + struct ExpansionData { }; + + /* + * Reserved for future use. (Internal use only) + */ + ExpansionData * reserved; + + virtual bool initACPIPowerManagement( IOService * powerParent ); + virtual void stopACPIPowerManagement( IOService * powerParent ); + +public: + virtual bool init( IOService * platform, + void * handle, + OSDictionary * properties ); + + virtual void free( void ) APPLE_KEXT_OVERRIDE; + + virtual bool attachToParent( IORegistryEntry * parent, + const IORegistryPlane * plane ) APPLE_KEXT_OVERRIDE; + + virtual void detachFromParent( IORegistryEntry * parent, + const IORegistryPlane * plane ) APPLE_KEXT_OVERRIDE; + + virtual bool getPathComponent( char * path, int * length, + const IORegistryPlane * plane ) const APPLE_KEXT_OVERRIDE; + + virtual bool compareName( OSString * name, + OSString ** matched ) const APPLE_KEXT_OVERRIDE; + + virtual IOReturn getResources( void ) APPLE_KEXT_OVERRIDE; + + virtual void * getDeviceHandle( void ) const; + + virtual UInt32 getDeviceStatus( void ) const; + + enum { + kTypeDevice = 0, + kTypeProcessor = 1, + kTypePowerResource = 2 + }; + + virtual UInt32 getDeviceType( void ) const; + + virtual void setDeviceType( UInt32 deviceType ); + + // Method (object) evaluation + + virtual IOReturn validateObject( const OSSymbol * objectName ); + + virtual IOReturn validateObject( const char * objectName ); + + virtual IOReturn evaluateObject( const OSSymbol * objectName, + OSObject ** result = 0, + OSObject * params[] = 0, + IOItemCount paramCount = 0, + IOOptionBits options = 0 ); + + virtual IOReturn evaluateObject( const char * objectName, + OSObject ** result = 0, + OSObject * params[] = 0, + IOItemCount paramCount = 0, + IOOptionBits options = 0 ); + + virtual IOReturn evaluateInteger( const OSSymbol * objectName, + UInt32 * resultInt32, + OSObject * params[] = 0, + IOItemCount paramCount = 0, + IOOptionBits options = 0 ); + + virtual IOReturn evaluateInteger( const char * objectName, + UInt32 * resultInt32, + OSObject * params[] = 0, + IOItemCount paramCount = 0, + IOOptionBits options = 0 ); + + virtual IOReturn evaluateInteger( const OSSymbol * objectName, + UInt64 * resultInt64, + OSObject * params[] = 0, + IOItemCount paramCount = 0, + IOOptionBits options = 0 ); + + virtual IOReturn evaluateInteger( const char * objectName, + UInt64 * resultInt64, + OSObject * params[] = 0, + IOItemCount paramCount = 0, + IOOptionBits options = 0 ); + + // ACPI table access + + virtual const OSData * getACPITableData( const char * tableName, + UInt32 tableInstance = 0 ) const; + + // Map ACPI event to interrupt event source index + + virtual SInt32 installInterruptForFixedEvent( UInt32 fixedEvent ); + + virtual SInt32 installInterruptForGPE( UInt32 gpeNumber, + void * gpeBlockDevice = 0, + IOOptionBits options = 0 ); + + // ACPI global lock acquire/release + + virtual IOReturn acquireGlobalLock( UInt32 * lockToken, + const mach_timespec_t * timeout = 0 ); + + virtual void releaseGlobalLock( UInt32 lockToken ); + + // Address space handler registration + + virtual IOReturn registerAddressSpaceHandler( + IOACPIAddressSpaceID spaceID, + IOACPIAddressSpaceHandler handler, + void * context, + IOOptionBits options = 0 ); + + virtual void unregisterAddressSpaceHandler( + IOACPIAddressSpaceID spaceID, + IOACPIAddressSpaceHandler handler, + IOOptionBits options = 0 ); + + // Address space access + + virtual IOReturn readAddressSpace( UInt64 * value, + IOACPIAddressSpaceID spaceID, + IOACPIAddress address, + UInt32 bitWidth, + UInt32 bitOffset = 0, + IOOptionBits options = 0 ); + + virtual IOReturn writeAddressSpace( UInt64 value, + IOACPIAddressSpaceID spaceID, + IOACPIAddress address, + UInt32 bitWidth, + UInt32 bitOffset = 0, + IOOptionBits options = 0 ); + + // Power management + + virtual bool hasSystemWakeCapability( void ) const; + + virtual IOReturn setSystemWakeCapabilityEnable( bool enable ); + + virtual bool hasACPIPowerStateSupport( UInt32 powerState ) const; + + virtual IOReturn setACPIPowerManagementEnable( + bool enable, + UInt32 powerState = kIOACPIDevicePowerStateD3, + IOOptionBits options = 0 ); + + virtual IOReturn setPowerState( unsigned long powerState, + IOService * whatDevice ) APPLE_KEXT_OVERRIDE; + + // I/O space helpers + + virtual void ioWrite32( UInt16 offset, UInt32 value, + IOMemoryMap * map = 0 ); + + virtual void ioWrite16( UInt16 offset, UInt16 value, + IOMemoryMap * map = 0 ); + + virtual void ioWrite8( UInt16 offset, UInt8 value, + IOMemoryMap * map = 0 ); + + virtual UInt32 ioRead32( UInt16 offset, IOMemoryMap * map = 0 ); + + virtual UInt16 ioRead16( UInt16 offset, IOMemoryMap * map = 0 ); + + virtual UInt8 ioRead8( UInt16 offset, IOMemoryMap * map = 0 ); + + // vtable padding + + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 0 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 1 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 2 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 3 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 4 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 5 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 6 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 7 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 8 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 9 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 10 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 11 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 12 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 13 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 14 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 15 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 16 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 17 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 18 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 19 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 20 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 21 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 22 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 23 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 24 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 25 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 26 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 27 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 28 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 29 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 30 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformDevice, 31 ); +}; + +#endif /* !_IOKIT_IOACPIPLATFORMDEVICE_H */ diff --git a/QualcommWireless/include/IOKit/acpi/IOACPIPlatformExpert.h b/QualcommWireless/include/IOKit/acpi/IOACPIPlatformExpert.h new file mode 100644 index 0000000..3abbb39 --- /dev/null +++ b/QualcommWireless/include/IOKit/acpi/IOACPIPlatformExpert.h @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2003-2005 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOACPIPLATFORMEXPERT_H +#define _IOKIT_IOACPIPLATFORMEXPERT_H + +#include // superclass +#include // children + +class IOACPIPlatformExpert : public IODTPlatformExpert +{ + OSDeclareAbstractStructors( IOACPIPlatformExpert ) + + friend class IOACPIPlatformDevice; + +protected: + /*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties + of the class in the future. + */ + struct ExpansionData { }; + + /*! @var reserved + Reserved for future use. (Internal use only) + */ + ExpansionData * reserved; + +public: + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + +protected: + // Map ACPI event to interrupt event source index + + virtual SInt32 installDeviceInterruptForFixedEvent( + IOService * device, + UInt32 fixedEvent ) = 0; + + virtual SInt32 installDeviceInterruptForGPE( + IOService * device, + UInt32 gpeNumber, + void * gpeBlockDevice, + IOOptionBits options ) = 0; + + // ACPI global lock acquisition + + virtual IOReturn acquireGlobalLock( IOService * client, + UInt32 * lockToken, + const mach_timespec_t * timeout ) = 0; + + virtual void releaseGlobalLock( IOService * client, + UInt32 lockToken ) = 0; + + // ACPI method and object evaluation + + virtual IOReturn validateObject( IOACPIPlatformDevice * device, + const OSSymbol * objectName ) = 0; + + virtual IOReturn validateObject( IOACPIPlatformDevice * device, + const char * objectName ); + + virtual IOReturn evaluateObject( IOACPIPlatformDevice * device, + const OSSymbol * objectName, + OSObject ** result, + OSObject * params[], + IOItemCount paramCount, + IOOptionBits options ) = 0; + + virtual IOReturn evaluateObject( IOACPIPlatformDevice * device, + const char * objectName, + OSObject ** result, + OSObject * params[], + IOItemCount paramCount, + IOOptionBits options ); + + // ACPI table + + virtual const OSData * getACPITableData( + const char * tableName, + UInt32 tableInstance ) = 0; + + // Address space handler + + virtual IOReturn registerAddressSpaceHandler( + IOACPIPlatformDevice * device, + IOACPIAddressSpaceID spaceID, + IOACPIAddressSpaceHandler handler, + void * context, + IOOptionBits options ) = 0; + + virtual void unregisterAddressSpaceHandler( + IOACPIPlatformDevice * device, + IOACPIAddressSpaceID spaceID, + IOACPIAddressSpaceHandler handler, + IOOptionBits options ) = 0; + + // Address space read/write + + virtual IOReturn readAddressSpace( UInt64 * value, + IOACPIAddressSpaceID spaceID, + IOACPIAddress address, + UInt32 bitWidth, + UInt32 bitOffset, + IOOptionBits options ) = 0; + + virtual IOReturn writeAddressSpace( UInt64 value, + IOACPIAddressSpaceID spaceID, + IOACPIAddress address, + UInt32 bitWidth, + UInt32 bitOffset, + IOOptionBits options ) = 0; + + // Device power management + + virtual IOReturn setDevicePowerState( IOACPIPlatformDevice * device, + UInt32 powerState ) = 0; + + virtual IOReturn getDevicePowerState( IOACPIPlatformDevice * device, + UInt32 * powerState ) = 0; + + virtual IOReturn setDeviceWakeEnable( IOACPIPlatformDevice * device, + bool enable ) = 0; + + // vtable padding + + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 0 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 1 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 2 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 3 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 4 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 5 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 6 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 7 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 8 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 9 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 10 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 11 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 12 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 13 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 14 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 15 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 16 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 17 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 18 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 19 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 20 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 21 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 22 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 23 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 24 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 25 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 26 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 27 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 28 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 29 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 30 ); + OSMetaClassDeclareReservedUnused( IOACPIPlatformExpert, 31 ); +}; + +#endif /* !_IOKIT_IOACPIPLATFORMEXPERT_H */ diff --git a/QualcommWireless/include/IOKit/acpi/IOACPITypes.h b/QualcommWireless/include/IOKit/acpi/IOACPITypes.h new file mode 100644 index 0000000..4e36211 --- /dev/null +++ b/QualcommWireless/include/IOKit/acpi/IOACPITypes.h @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2003-2005 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef __IOKIT_IOACPITYPES_H +#define __IOKIT_IOACPITYPES_H + +#include + +extern const IORegistryPlane * gIOACPIPlane; +extern const OSSymbol * gIOACPIHardwareIDKey; +extern const OSSymbol * gIOACPIUniqueIDKey; +extern const OSSymbol * gIOACPIAddressKey; +extern const OSSymbol * gIOACPIDeviceStatusKey; + +#define kIOACPIInterruptTypeValid (1 << 1) +#pragma pack(1) + +struct IOACPIAddressSpaceDescriptor { + UInt32 resourceType; + UInt32 generalFlags; + UInt32 typeSpecificFlags; + UInt32 reserved1; + UInt64 granularity; + UInt64 minAddressRange; + UInt64 maxAddressRange; + UInt64 translationOffset; + UInt64 addressLength; + UInt64 reserved2; + UInt64 reserved3; + UInt64 reserved4; +}; + +enum { + kIOACPIMemoryRange = 0, + kIOACPIIORange = 1, + kIOACPIBusNumberRange = 2 +}; + +typedef UInt32 IOACPIAddressSpaceID; + +enum { + kIOACPIAddressSpaceIDSystemMemory = 0, + kIOACPIAddressSpaceIDSystemIO = 1, + kIOACPIAddressSpaceIDPCIConfiguration = 2, + kIOACPIAddressSpaceIDEmbeddedController = 3, + kIOACPIAddressSpaceIDSMBus = 4 +}; + +/* + * Address space operation + */ +enum { + kIOACPIAddressSpaceOpRead = 0, + kIOACPIAddressSpaceOpWrite = 1 +}; + +/* + * 64-bit ACPI address + */ +union IOACPIAddress { + UInt64 addr64; + struct { + unsigned int offset :16; + unsigned int function :3; + unsigned int device :5; + unsigned int bus :8; + unsigned int segment :16; + unsigned int reserved :16; + } pci; +}; + +/* + * Address space handler + */ +typedef IOReturn (*IOACPIAddressSpaceHandler)( UInt32 operation, + IOACPIAddress address, + UInt64 * value, + UInt32 bitWidth, + UInt32 bitOffset, + void * context ); + +/* + * ACPI fixed event types + */ +enum { + kIOACPIFixedEventPMTimer = 0, + kIOACPIFixedEventPowerButton = 2, + kIOACPIFixedEventSleepButton = 3, + kIOACPIFixedEventRealTimeClock = 4 +}; + +#pragma pack() + +/* + * FIXME: Move to xnu/iokit to reserve the ACPI family code. + */ +#ifndef sub_iokit_acpi +#define sub_iokit_acpi err_sub(10) +#endif + +/* + * ACPI notify message sent to all clients and interested parties. + * The notify code can be read from the argument as an UInt32. + */ +#define kIOACPIMessageDeviceNotification iokit_family_msg(sub_iokit_acpi, 0x10) + +/* + * ACPI device power states + */ +enum { + kIOACPIDevicePowerStateD0 = 0, + kIOACPIDevicePowerStateD1 = 1, + kIOACPIDevicePowerStateD2 = 2, + kIOACPIDevicePowerStateD3 = 3, + kIOACPIDevicePowerStateCount = 4 +}; + +#endif /* !__IOKIT_IOACPITYPES_H */ diff --git a/QualcommWireless/include/IOKit/assert.h b/QualcommWireless/include/IOKit/assert.h new file mode 100644 index 0000000..cb02129 --- /dev/null +++ b/QualcommWireless/include/IOKit/assert.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef _IO_ASSERT_H_ +#define _IO_ASSERT_H_ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if IOASSERT +#undef MACH_ASSERT +#define MACH_ASSERT 1 +#endif +#include + +#ifdef __cplusplus +} +#endif + + +#if(!defined(OSCompileAssert)) +# define OSCompileAssert( TEST ) \ + extern int OSCompileAssertFailed[ ( TEST ) ? 1 : -1 ] __unused; +#endif + +#endif /* _IO_ASSERT_H_ */ diff --git a/QualcommWireless/include/IOKit/ata/ATADeviceNub.h b/QualcommWireless/include/IOKit/ata/ATADeviceNub.h new file mode 100644 index 0000000..db14182 --- /dev/null +++ b/QualcommWireless/include/IOKit/ata/ATADeviceNub.h @@ -0,0 +1,164 @@ +/* + * Copyright (c) 1998-2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/*! + @header ATADeviceNub.h + @abstract A concrete implementation of IOATADevice. + */ + +#ifndef _ATADEVICENUB_H +#define _ATADEVICENUB_H + +#include +#include "IOATATypes.h" +#include "IOATADevice.h" +#include "IOATAController.h" + +#include "IOATABusCommand.h" + + +/*! +@class ATADeviceNub +@abstract ATADeviceNub is a concrete implementation of IOATADevice. +@discussion clients of IOATA (disk drivers) should use the interface presented +by IOATADevice. Concrete nubs are private to the IOATA family and +specific subclasses of IOATADevice are instantiated by controller +drivers to provide the abstract interface to clients. + +*/ +class ATADeviceNub : public IOATADevice +{ + OSDeclareDefaultStructors(ATADeviceNub); + +public: + + /*!@function ataDeviceNub + @abstract static creator function - used by IOATAControllers to create nubs. + */ + static ATADeviceNub* ataDeviceNub( IOATAController* provider, ataUnitID unit, ataDeviceType devType); + + /*!@function attach + @abstract override of IOService method. + */ + virtual bool attach(IOService* provider ); + + + // overrides from IOATADevice to provide actual client interface + + + /*!@function executeCommand + @abstract Submit IO requests + */ + virtual IOReturn executeCommand(IOATACommand* command); + + // create and destroy IOATACommands + /*!@function allocCommand + @abstract create command objects for clients. + */ + virtual IOATACommand* allocCommand( void ); + + /*!@function freeCommand + @abstract Clients use this method to dispose of command objects. + */ + virtual void freeCommand( IOATACommand* inCommand); + + +protected: + + /*!@function init + @abstract used after creating the nub. + */ + virtual bool init(IOATAController* provider, ataUnitID unit, ataDeviceType devType); + + /*!@function publishProperties + @abstract publish the nub's properties in the device tree. + */ + virtual void publishProperties( void ); + + /*!@function publishBusProperties + @abstract puts info about this device's bus capability in the device tree. + */ + virtual void publishBusProperties(void); + + /*!@function publishVendorProperties + @abstract will be deprecated. + */ + virtual void publishVendorProperties( void ); + + /*!@function getDeviceID + @abstract get the unit id of this drive (0 or 1) + */ + virtual IOReturn getDeviceID(void); + + /*!@function MyATACallback + @abstract to be deprecated. + */ + static void MyATACallback(IOATACommand* command ); + + /*!@function processCallback + @abstract to be deprecated. + */ + void processCallback(IOATACommand* command ); + + /*!@function swapBytes16 + @abstract to be deprecated. + */ + void swapBytes16( UInt8* dataBuffer, IOByteCount length); + + UInt8* buffer; + +protected: +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the ATADeviceNub in the future. + */ + struct ExpansionData { }; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + +private: + OSMetaClassDeclareReservedUnused(ATADeviceNub, 0); + OSMetaClassDeclareReservedUnused(ATADeviceNub, 1); + OSMetaClassDeclareReservedUnused(ATADeviceNub, 2); + OSMetaClassDeclareReservedUnused(ATADeviceNub, 3); + OSMetaClassDeclareReservedUnused(ATADeviceNub, 4); + OSMetaClassDeclareReservedUnused(ATADeviceNub, 5); + OSMetaClassDeclareReservedUnused(ATADeviceNub, 6); + OSMetaClassDeclareReservedUnused(ATADeviceNub, 7); + OSMetaClassDeclareReservedUnused(ATADeviceNub, 8); + OSMetaClassDeclareReservedUnused(ATADeviceNub, 9); + OSMetaClassDeclareReservedUnused(ATADeviceNub, 10); + OSMetaClassDeclareReservedUnused(ATADeviceNub, 11); + OSMetaClassDeclareReservedUnused(ATADeviceNub, 12); + OSMetaClassDeclareReservedUnused(ATADeviceNub, 13); + OSMetaClassDeclareReservedUnused(ATADeviceNub, 14); + OSMetaClassDeclareReservedUnused(ATADeviceNub, 15); + OSMetaClassDeclareReservedUnused(ATADeviceNub, 16); + OSMetaClassDeclareReservedUnused(ATADeviceNub, 17); + OSMetaClassDeclareReservedUnused(ATADeviceNub, 18); + OSMetaClassDeclareReservedUnused(ATADeviceNub, 19); + OSMetaClassDeclareReservedUnused(ATADeviceNub, 20); + +}; + +#endif /* !_IOATABUSNUB_H */ diff --git a/QualcommWireless/include/IOKit/ata/ATATimerEventSource.h b/QualcommWireless/include/IOKit/ata/ATATimerEventSource.h new file mode 100644 index 0000000..c6afe36 --- /dev/null +++ b/QualcommWireless/include/IOKit/ata/ATATimerEventSource.h @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2001-2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _ATATIMEREVENTSOURCE_H +#define _ATATIMEREVENTSOURCE_H + + +#include +#include +#include +#include +#include +#include + + +/*! +@class ATATimerEventSource + +@discussion +Extend the timer event source to allow checking for timer expiration +from behind the workloop. +*/ + +class ATATimerEventSource : public IOTimerEventSource +{ + OSDeclareDefaultStructors(ATATimerEventSource); + + public: + + /*!@function ataTimerEventSource + @abstract allocate an instance of this type. + */ + static ATATimerEventSource * + ataTimerEventSource(OSObject *owner, Action action = 0); + + /*!@function hasTimedOut + @abstract returns true if the timer has expired since the last enable/disable or setTimeout() or wakeAtTime() call. + */ + virtual bool hasTimedOut( void ); + + // override to initialize the time out flag. + /*!@function + @abstract + */ + virtual bool init(OSObject *owner, Action action = 0); + + /*!@function enable + @abstract overrides in order to set/clear the timed out flag + */ + virtual void enable(); + + /*!@function disable + @abstract overrides in order to set/clear the timed out flag + */ + virtual void disable(); + + /*!@function wakeAtTime + @abstract overrides in order to set/clear the timed out flag + */ + virtual IOReturn wakeAtTime(UnsignedWide abstime); + + /*!@function cancelTimeout + @abstract overrides in order to set/clear the timed out flag + */ + virtual void cancelTimeout(); + +protected: + + enum{ kTimedOutTrue = 'true', + kTimedOutFalse = 'fals' + }; + + UInt32 hasExpired; + + + /*!@function myTimeout + @abstract my timeout function which sets the timedOut flag atomically. + */ + static void myTimeout(void *self); + + /*!@function setTimeoutFunc + @abstract override to install my timeout function instead of the super's. + */ + virtual void setTimeoutFunc(); + + /*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the IOWorkLoop in the future. + */ + struct ExpansionData { }; + + /*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + +private: + OSMetaClassDeclareReservedUnused(ATATimerEventSource, 0); + OSMetaClassDeclareReservedUnused(ATATimerEventSource, 1); + OSMetaClassDeclareReservedUnused(ATATimerEventSource, 2); + OSMetaClassDeclareReservedUnused(ATATimerEventSource, 3); + OSMetaClassDeclareReservedUnused(ATATimerEventSource, 4); + OSMetaClassDeclareReservedUnused(ATATimerEventSource, 5); + OSMetaClassDeclareReservedUnused(ATATimerEventSource, 6); + OSMetaClassDeclareReservedUnused(ATATimerEventSource, 7); + +}; + + +#endif /*_ATATIMEREVENTSOURCE_H*/ diff --git a/QualcommWireless/include/IOKit/ata/IOATABusCommand.h b/QualcommWireless/include/IOKit/ata/IOATABusCommand.h new file mode 100644 index 0000000..94b3bca --- /dev/null +++ b/QualcommWireless/include/IOKit/ata/IOATABusCommand.h @@ -0,0 +1,250 @@ +/* + * Copyright (c) 1998-2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/* + * + * IOATABusCommand.h + * + */ + +#ifndef _IOATABUSCOMMAND_H +#define _IOATABUSCOMMAND_H + +#include +#include "IOATATypes.h" +#include "IOATACommand.h" + + +class IOSyncer; + + +/*! + +@class IOATABusCommand + +@discussion ATA Device (disk) drivers should use the superclass, IOATACommand +and may not derive or use any subclass of IOATACommand. + +IOATABusCommand is the subclass of IOATACommand used by +IOATAControllers. Controller classes may override this class to +provide additional fields as their needs dictate or may use this +as a concrete class if it is sufficient. + +IOATAControllers are always paired with specific IOATADevices +and each specific subclass of IOATADevice is in turn the factory method +for IOATACommands for use by disk drivers. + +In this manner, mass-storage device drivers (disk drivers, clients of +ATA bus controllers) see only the generalized interface of IOATADevice +and the generalized interface of IOATACommand. This provides isolation +from specific bus details for disk drivers and offers flexibility to +controllers to add per-command fields and state variables for their own +internal use. + +*/ + +class IOATABusCommand : public IOATACommand { + + OSDeclareDefaultStructors( IOATABusCommand ); + + public: + + // data items for use by IOATAController + + /*! @var queueChain queue header for use by IOATAController. */ + queue_chain_t queueChain; + + /*! @var state state-semaphore for use by IOATAController */ + UInt32 state; + + /*! @var syncer IOSyncer for use by IOATAController */ + IOSyncer* syncer; + + + + /*!@function allocateCmd + @abstract factory method to create an instance of this class used by subclasses of IOATADevice + */ + static IOATABusCommand* allocateCmd(void); + + /*!@function zeroCommand + @abstract set to blank state, call prior to re-use of this object + */ + virtual void zeroCommand(void); + + /*!@function getOpcode + @abstract return the command opcode + */ + virtual ataOpcode getOpcode( void ); + + /*!@function getFlags + @abstract return the flags for this command. + */ + virtual ataFlags getFlags ( void ); + + /*!@function getRegMask + @abstract get the register mask for desired regs + */ + virtual ataRegMask getRegMask( void ); + + /*!@function getUnit + @abstract return the unit id (0 master, 1 slave) + */ + virtual ataUnitID getUnit( void ); + + /*!@function getTimeoutMS + @abstract return the timeout value for this command + */ + virtual UInt32 getTimeoutMS (void ); + + /*!@function setResult + @abstract set the result code + */ + virtual void setResult( IOReturn ); + + /*!@function getCallbackPtr + @abstract return the callback pointer + */ + virtual IOATACompletionFunction* getCallbackPtr (void ); + + + /*!@function executeCallback + @abstract call the completion callback function + */ + virtual void executeCallback(void); + + /*!@function getTaskFilePtr + @abstract return the taskfile structure pointer. + */ + virtual ataTaskFile* getTaskFilePtr(void); + + /*!@function getPacketSize + @abstract return the size of atapi packet if any. + */ + virtual UInt16 getPacketSize(void); + + /*!@function getPacketData + @abstract return pointer to the array of packet data. + */ + virtual UInt16* getPacketData(void); + + /*!@function getTransferChunkSize + @abstract number of bytes between interrupts. + */ + virtual IOByteCount getTransferChunkSize(void); + + /*!@function setActualTransfer + @abstract set the byte count of bytes actually transferred. + */ + virtual void setActualTransfer ( IOByteCount bytesTransferred ); + + /*!@function getBuffer + @abstract get pointer to the memory descriptor for this transaction + */ + virtual IOMemoryDescriptor* getBuffer ( void); + + /*!@function getPosition + @abstract the position within the memory buffer for the transaction. + */ + virtual IOByteCount getPosition (void); + + /*!@function getByteCount + @abstract return the byte count for this transaction to transfer. + */ + virtual IOByteCount getByteCount (void); + + /*!@function setCommandInUse + @abstract mark the command as being in progress. + */ + virtual void setCommandInUse( bool inUse = true); + + + protected: + + // + /*!@function init + @abstract Zeroes all data, returns false if allocation fails. protected. + */ + virtual bool init(); + +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the IOWorkLoop in the future. + */ + struct ExpansionData { }; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + +private: + OSMetaClassDeclareReservedUnused(IOATABusCommand, 0); + OSMetaClassDeclareReservedUnused(IOATABusCommand, 1); + OSMetaClassDeclareReservedUnused(IOATABusCommand, 2); + OSMetaClassDeclareReservedUnused(IOATABusCommand, 3); + OSMetaClassDeclareReservedUnused(IOATABusCommand, 4); + OSMetaClassDeclareReservedUnused(IOATABusCommand, 5); + OSMetaClassDeclareReservedUnused(IOATABusCommand, 6); + OSMetaClassDeclareReservedUnused(IOATABusCommand, 7); + OSMetaClassDeclareReservedUnused(IOATABusCommand, 8); + OSMetaClassDeclareReservedUnused(IOATABusCommand, 9); + OSMetaClassDeclareReservedUnused(IOATABusCommand, 10); + OSMetaClassDeclareReservedUnused(IOATABusCommand, 11); + OSMetaClassDeclareReservedUnused(IOATABusCommand, 12); + OSMetaClassDeclareReservedUnused(IOATABusCommand, 13); + OSMetaClassDeclareReservedUnused(IOATABusCommand, 14); + OSMetaClassDeclareReservedUnused(IOATABusCommand, 15); + OSMetaClassDeclareReservedUnused(IOATABusCommand, 16); + OSMetaClassDeclareReservedUnused(IOATABusCommand, 17); + OSMetaClassDeclareReservedUnused(IOATABusCommand, 18); + OSMetaClassDeclareReservedUnused(IOATABusCommand, 19); + OSMetaClassDeclareReservedUnused(IOATABusCommand, 20); +}; + +#include + +class IOATABusCommand64 : public IOATABusCommand +{ + + OSDeclareDefaultStructors( IOATABusCommand64 ); + + public: + + // new features + static IOATABusCommand64* allocateCmd32(void); + virtual IODMACommand* GetDMACommand( void ); + + + + // overrides for IODMACommand setup + virtual void zeroCommand(void); + virtual void setBuffer ( IOMemoryDescriptor* inDesc); + virtual void setCommandInUse( bool inUse = true); + virtual void executeCallback(void); + + + protected: + IODMACommand* _dmaCmd; + virtual bool init(); + virtual void free(); +}; + +#endif /*_IOATABUSCOMMAND_H*/ diff --git a/QualcommWireless/include/IOKit/ata/IOATABusInfo.h b/QualcommWireless/include/IOKit/ata/IOATABusInfo.h new file mode 100644 index 0000000..6faec4c --- /dev/null +++ b/QualcommWireless/include/IOKit/ata/IOATABusInfo.h @@ -0,0 +1,219 @@ +/* + * Copyright (c) 2000-2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#ifndef _IOATABUSINFO_H +#define _IOATABUSINFO_H + +#include +#include +#include "IOATATypes.h" + +/*! +@class IOATABusInfo +@discussion used to indicate the capabilities of the bus the device is connected to, PIO and DMA modes supported, etc. +*/ + +class IOATABusInfo : public OSObject +{ + OSDeclareDefaultStructors( IOATABusInfo ); + + public: + + /*!@function atabusinfo + @abstract factory method + */ + static IOATABusInfo* atabusinfo(void); + + /*!@function zeroData + @abstract set this object to a blank state. + */ + virtual void zeroData(void); + + // Used by clients of ATAControllers to find out about the bus + // capability. + + /*!@function getSocketType + @abstract returns the socket type, internal fixed, media-bay, PC-Card + Used by clients of ATAControllers to find out about the bus + */ + ataSocketType getSocketType( void ); + + /*!@function getPIOModes + @abstract returns the bit-significant map of PIO mode(s) supported on the bus. + Used by clients of ATAControllers to find out about the bus. + */ + UInt8 getPIOModes( void ); + + /*!@function getDMAModes + @abstract bit-significant map of DMA mode(s) supported on the bus. + Used by clients of ATAControllers to find out about the bus. + */ + UInt8 getDMAModes( void ); + + /*!@function getUltraModes + @abstract bit-significant map of Ultra mode(s) supported on the bus. + Used by clients of ATAControllers to find out about the bus. + */ + UInt8 getUltraModes( void ); + + /*!@function getUnits + @abstract How many devices are present on bus. + Used by clients of ATAControllers to find out about the bus. + */ + UInt8 getUnits( void ); + + /*!@function supportsDMA + @abstract True = DMA supported on bus - inferred by looking at the DMA mode bits. + Used by clients of ATAControllers to find out about the bus. + */ + bool supportsDMA( void ); + + /*!@function supportsExtendedLBA + @abstract Supports 48-bit LBA if true. + Used by clients of ATAControllers to find out about the bus. + */ + bool supportsExtendedLBA( void ); + + /*!@function maxBlocksExtended + @abstract The maximum number of 512-byte blocks this controller supports + in a single Extended LBA transfer. Some controllers may be limited to less than + the maximum sector count allowed under extended LBA protocol. + */ + UInt16 maxBlocksExtended(void); + + /*!@function supportsOverlapped + @abstract Supports overlapped packet feature set if true. + Used by clients of ATAControllers to find out about the bus. + */ + bool supportsOverlapped( void ); + + /*!@function supportsDMAQueued + @abstract Supports DMA Queued Feature set if true. + Used by clients of ATAControllers to find out about the bus. + */ + bool supportsDMAQueued( void ); + + + // Used by ATAControllers to generate an information object. + // Would not be used by disk device drivers normally. + // Bus controllers should set these items everytime. + + /*!@function setSocketType + @abstract internal fixed, media-bay, PC-Card. Set by ATAControllers. + */ + void setSocketType( ataSocketType inSocketType ); + + /*!@function setPIOModes + @abstract Bit significant map of supported transfer modes. Set by ATAControllers. + */ + void setPIOModes( UInt8 inModeBitMap); + + /*!@function setDMAModes + @abstract Bit significant map of supported transfer modes. Set by ATAControllers. + */ + void setDMAModes( UInt8 inModeBitMap ); + + /*!@function setUltraModes + @abstract Bit significant map of supported transfer modes. Set by ATAControllers. + */ + void setUltraModes( UInt8 inModeBitMap ); + + /*!@function setUnits + @abstract set to indicate how many devices are on this bus. Set by ATAControllers. + */ + void setUnits( UInt8 inNumUnits ); + + // Optional bus protocols some busses may support + /*!@function setExtendedLBA + @abstract Set true for supports 48-bit LBA. Set by ATAControllers. + */ + void setExtendedLBA( bool inState ); + + /*!function setMaxBlocksExtended + @abstract value set by controllers to indicate the maximum number of blocks + allowed in a single transfer of data. Some dma engines may not be capable of supporting the full + 16-bit worth of sector count allowed under 48 bit extended LBA. Default is 256 blocks, same as + standard ATA. + */ + void setMaxBlocksExtended( UInt16 inMaxBlocks); + + /*!@function setOverlapped + @abstract Set true for supports overlapped packet feature set. Set by ATAControllers. + */ + void setOverlapped( bool inState); + + /*!@function setDMAQueued + @abstract Set true if supports DMA Queued Feature. Set by ATAControllers. + */ + void setDMAQueued( bool inState); // + + protected: + + UInt8 _PIOModes; /* PIO modes supported (bit-significant) */ + UInt8 _MultiDMAModes; /* <--: Multiword DMA modes supported (b-sig) */ + UInt8 _UltraDMAModes; /* <--: Ultra DMA modes supported (b-sig) */ + bool _ExtendedLBA; /* <--: Suppports 48-bit LBA protocol */ + bool _Overlapped; /* <--: Supports overlapped packet feature set */ + bool _DMAQueued; /* <--: Supports DMA Queued Feature set */ + ataSocketType _SocketType; /* <--: Indicates bus is fixed internal, removable media-bay, removable PC-Card or unknown type */ + UInt8 _numUnits; /* <--: How many devices on this bus */ + UInt16 _maxBlocksExtended; + + protected: +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the IOWorkLoop in the future. + */ + struct ExpansionData { }; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + + virtual bool init(); + +private: + OSMetaClassDeclareReservedUnused(IOATABusInfo, 0); + OSMetaClassDeclareReservedUnused(IOATABusInfo, 1); + OSMetaClassDeclareReservedUnused(IOATABusInfo, 2); + OSMetaClassDeclareReservedUnused(IOATABusInfo, 3); + OSMetaClassDeclareReservedUnused(IOATABusInfo, 4); + OSMetaClassDeclareReservedUnused(IOATABusInfo, 5); + OSMetaClassDeclareReservedUnused(IOATABusInfo, 6); + OSMetaClassDeclareReservedUnused(IOATABusInfo, 7); + OSMetaClassDeclareReservedUnused(IOATABusInfo, 8); + OSMetaClassDeclareReservedUnused(IOATABusInfo, 9); + OSMetaClassDeclareReservedUnused(IOATABusInfo, 10); + OSMetaClassDeclareReservedUnused(IOATABusInfo, 11); + OSMetaClassDeclareReservedUnused(IOATABusInfo, 12); + OSMetaClassDeclareReservedUnused(IOATABusInfo, 13); + OSMetaClassDeclareReservedUnused(IOATABusInfo, 14); + OSMetaClassDeclareReservedUnused(IOATABusInfo, 15); + OSMetaClassDeclareReservedUnused(IOATABusInfo, 16); + OSMetaClassDeclareReservedUnused(IOATABusInfo, 17); + OSMetaClassDeclareReservedUnused(IOATABusInfo, 18); + OSMetaClassDeclareReservedUnused(IOATABusInfo, 19); + OSMetaClassDeclareReservedUnused(IOATABusInfo, 20); +}; + + +#endif /* !_IOATABUSINFO_H */ diff --git a/QualcommWireless/include/IOKit/ata/IOATACommand.h b/QualcommWireless/include/IOKit/ata/IOATACommand.h new file mode 100644 index 0000000..773f28a --- /dev/null +++ b/QualcommWireless/include/IOKit/ata/IOATACommand.h @@ -0,0 +1,478 @@ +/* + * Copyright (c) 1998-2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/* + * + * IOATACommand.h + * + */ + +#ifndef _IOATACOMMAND_H +#define _IOATACOMMAND_H + +#include +#include +#include +#include +#include "IOATATypes.h" + + +class IOExtendedLBA; +class IOATACommand; + + +/*! @typedef IOATACompletionFunction callback function for ATA disk devices. +*/ +typedef void (IOATACompletionFunction)(IOATACommand* command ); + + +/*! +@class IOATACommand + +@discussion +Command structure superclass, created and freed only by IOATADevice objects +populated by disk device drivers with command parameters +then submitted for operation to their IOATADevice provider for execution. + +IOATACommand is a virtual class, a concrete subclass contains the methods and fields needed +by IOATAControllers. Subclasses may be specific to particular controller hardware. +Disk device drivers will only have visibility to this interface and may not subclass this object. +Disk device drivers should instead make use of the void* refcon field which the controllers will not +touch +*/ + +class IOATACommand : public IOCommand { + + OSDeclareAbstractStructors( IOATACommand ); + + public: + + /*!@function zeroCommand + @abstract set to blank state, MUST call prior to re-use of this object + */ + virtual void zeroCommand(void); + + /*!@function setOpcode + @abstract command opcode as defined in IOATATypes. + */ + virtual void setOpcode( ataOpcode inCode); + + /*!@function setFlags + @abstract set the flags for this command, as defined in IOATATypes. + */ + virtual void setFlags( UInt32 inFlags); + + /*!@function setUnit + @abstract set the unit number for this command. + */ + virtual void setUnit( ataUnitID inUnit); + + /*!@function setTimeoutMS + @abstract how long to allow this command to complete, in milliseconds, once issued to + the hardware. if the time period expires, this command will return with a timeout error. + */ + virtual void setTimeoutMS( UInt32 inMs); + + /*!@function setCallbackPtr + @abstract set the function pointer to call when this command completes. + */ + virtual void setCallbackPtr (IOATACompletionFunction* inCompletion); + + /*!@function setRegMask + @abstract used when accessing registers or reading registers on an error result. Mask is defined + in IOATATypes.h + */ + virtual void setRegMask( ataRegMask mask); + + // memory information + // Since ATA hardware is limited in the amount of bytes + // that can be transfered in a command, the disk driver shall supply + // a seperate offset and byte count per transfer. + // the offset may be any amount. The byte count must be a multiple of the + // sector size of the device, ie, N * 512 bytes for ata hard drives. + /*!@function setBuffer + @abstract set the IIOMemoryDescriptor for this transaction. + */ + virtual void setBuffer ( IOMemoryDescriptor* inDesc); + + /*!@function setPosition + @abstract used to set an offset into the memory descriptor for this transfer. + */ + virtual void setPosition (IOByteCount fromPosition); + + /*!@function setByteCount + @abstract set the byte count for this transaction. Should agree with the device command and the + memory descriptor in use. + */ + virtual void setByteCount (IOByteCount numBytes); + + /*!@function setTransferChunkSize + @abstract set the size of transfer between intervening interrupts. necessary when doing PIO Read/Write Multiple, etc. so the controller knows when to expect an interrupt during multi-sector data transfers. + */ + virtual void setTransferChunkSize( IOByteCount chunk = kATADefaultSectorSize); + + /*!@function setFeatures + @abstract Taskfile access. Registers are named in accordance with ATA Standards conventions + */ + virtual void setFeatures( UInt8 in); + + /*!@function getErrorReg + @abstract Taskfile access. Registers are named in accordance with ATA Standards conventions + */ + virtual UInt8 getErrorReg (void ); + + /*!@function setSectorCount + @abstract Taskfile access. Registers are named in accordance with ATA Standards conventions + */ + virtual void setSectorCount( UInt8 in); + + /*!@function getSectorCount + @abstract Taskfile access. Registers are named in accordance with ATA Standards conventions + */ + virtual UInt8 getSectorCount (void ); + + /*!@function setSectorNumber + @abstract Taskfile access. Registers are named in accordance with ATA Standards conventions + */ + virtual void setSectorNumber( UInt8 in); + + /*!@function getSectorNumber + @abstract Taskfile access. Registers are named in accordance with ATA Standards conventions + */ + virtual UInt8 getSectorNumber (void ); + + /*!@function setCylLo + @abstract Taskfile access. Registers are named in accordance with ATA Standards conventions + */ + virtual void setCylLo ( UInt8 in); + + /*!@function getCylLo + @abstract Taskfile access. Registers are named in accordance with ATA Standards conventions + */ + virtual UInt8 getCylLo (void ); + + /*!@function setCylHi + @abstract Taskfile access. Registers are named in accordance with ATA Standards conventions + */ + virtual void setCylHi( UInt8 in); + + /*!@function getCylHi + @abstract Taskfile access. Registers are named in accordance with ATA Standards conventions + */ + virtual UInt8 getCylHi (void ); + + /*!@function setDevice_Head + @abstract Taskfile access. Registers are named in accordance with ATA Standards conventions + */ + virtual void setDevice_Head( UInt8 in); + + /*!@function getDevice_Head + @abstract Taskfile access. Registers are named in accordance with ATA Standards conventions + */ + virtual UInt8 getDevice_Head (void ); + + /*!@function setCommand + @abstract Taskfile access. Registers are named in accordance with ATA Standards conventions + */ + virtual void setCommand ( UInt8 in); + + /*!@function getStatus + @abstract Taskfile access. Registers are named in accordance with ATA Standards conventions + */ + virtual UInt8 getStatus (void ); + + /*!@function setLBA28 + @abstract convenience method that sets the taskfile registers into a 28-bit LBA address, with unit selected and LBA bit set. return err if param out of range, return kIOSuccess (kATANoErr) = 0 on return if successful + */ + virtual IOReturn setLBA28( UInt32 lba, ataUnitID inUnit); + + /*!@function setPacketCommand + @abstract ATAPI command packet max size is 16 bytes. Makes deep copy of data. + */ + virtual IOReturn setPacketCommand( UInt16 packetSizeBytes, UInt8* command); + + // the following registers are only accessed by register access + // commands. Not by normal command dispatch where they are handled + // by the controller. + + // not part of task file params. not written to device when sending commands. + virtual void setDataReg ( UInt16 in); + virtual UInt16 getDataReg (void ); + + // not part of taskfile. Not usually used except by controller. + virtual void setControl ( UInt8 in); + virtual UInt8 getAltStatus (void ); + + // return values + /*!@function getResult + @abstract IOReturn value of the result of this command. ATA family errors are defined in IOATATypes.h + */ + virtual IOReturn getResult (void); + + /*!@function getBuffer + @abstract the IOMemoryDescriptor used in this transaction. + */ + virtual IOMemoryDescriptor* getBuffer ( void ); + + /*!@function getActualTransfer + @abstract The byte count on the ending result, as best as can be determined by the controller. May be zero, but partial transfer may have occurred on error in some cases. + */ + virtual IOByteCount getActualTransfer ( void ); + + /*!@function getEndStatusReg + @abstract the value of the status register on the end of the command. + */ + virtual UInt8 getEndStatusReg (void); // always returned + + /*!@function getEndErrorReg + @abstract If the error bit was set in the status register, the value of the error register is returned at the end of a command. + */ + virtual UInt8 getEndErrorReg( void ); + + /*!@function getCommandInUse + @abstract returns true if IOATAController is still in control of the command. + */ + virtual bool getCommandInUse( void ); // returns true if IOATAController is using the command. + + // for use by disk drivers, clients of IOATADevice only. + // IOATADevice and IOATAControllers shall not use this field in any manner + /*!@var refCon + @abstract for use by disk drivers, clients of IOATADevice only. IOATADevice and IOATAControllers shall not use this field in any manner. + */ + void* refCon; + + /*!@var refCon2 + @abstract for use by disk drivers, clients of IOATADevice only. IOATADevice and IOATAControllers shall not use this field in any manner. + */ + void* refCon2; + + protected: + // < return from ATA controllers to disk drivers + // > sent to ATA controllers from disk drivers + ataOpcode _opCode; // > Command code for the controller. + UInt32 _flags; // > Flags for this command + ataRegisterImage _taskFile; // <> Taskfile + data and control registers. + ATAPICmdPacket _packet; // > ATAPI packet + ataUnitID _unit; // > Unit number + UInt32 _timeoutMS; // > timeout command in ms. + IOMemoryDescriptor* _desc; // > Buffer for data may be nil if command transfer no data + IOByteCount _position; // > Position within the descriptor for this command + IOByteCount _byteCount; // > How many bytes to transfer. + IOByteCount _logicalChunkSize; // > How many bytes between intervening interrupts (R/W Multiple) + ataRegMask _regMask; // > Which registers to write or read for reg access commands + IOATACompletionFunction* _callback; // > if nil, command is synchronous + + IOReturn _result; // < result + IOByteCount _actualByteCount; // < actual bytes transfered. + UInt8 _status; // < Status register at end of command + UInt8 _errReg; // < Error register at end of command if error bit set. + bool _inUse; // < true while IOATAController has possesion of the command + + + virtual bool init(); +protected: +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the IOWorkLoop in the future. + */ + struct ExpansionData {IOExtendedLBA* extLBA; }; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *fExpansionData; + + // overrides + virtual void free(); + + +private: + OSMetaClassDeclareReservedUsed(IOATACommand, 0); // set end result + OSMetaClassDeclareReservedUsed(IOATACommand, 1); // get extendedLBAPtr + OSMetaClassDeclareReservedUnused(IOATACommand, 2); + OSMetaClassDeclareReservedUnused(IOATACommand, 3); + OSMetaClassDeclareReservedUnused(IOATACommand, 4); + OSMetaClassDeclareReservedUnused(IOATACommand, 5); + OSMetaClassDeclareReservedUnused(IOATACommand, 6); + OSMetaClassDeclareReservedUnused(IOATACommand, 7); + OSMetaClassDeclareReservedUnused(IOATACommand, 8); + OSMetaClassDeclareReservedUnused(IOATACommand, 9); + OSMetaClassDeclareReservedUnused(IOATACommand, 10); + OSMetaClassDeclareReservedUnused(IOATACommand, 11); + OSMetaClassDeclareReservedUnused(IOATACommand, 12); + OSMetaClassDeclareReservedUnused(IOATACommand, 13); + OSMetaClassDeclareReservedUnused(IOATACommand, 14); + OSMetaClassDeclareReservedUnused(IOATACommand, 15); + OSMetaClassDeclareReservedUnused(IOATACommand, 16); + OSMetaClassDeclareReservedUnused(IOATACommand, 17); + OSMetaClassDeclareReservedUnused(IOATACommand, 18); + OSMetaClassDeclareReservedUnused(IOATACommand, 19); + OSMetaClassDeclareReservedUnused(IOATACommand, 20); + +public: + virtual void setEndResult(UInt8 inStatus, UInt8 endError ); + virtual IOExtendedLBA* getExtendedLBA(void); + + +}; + + +/*! +@class IOExtendedLBA + +@discussion +If 48-bit LBAs are supported, IOExtendedLBA is used to represent a 48-bit LBA. +The driver examines the ATA identify data to determine if 48-bit addressing is +supported. +*/ + +class IOExtendedLBA : public OSObject +{ + OSDeclareDefaultStructors( IOExtendedLBA ); + + public: + static IOExtendedLBA* createIOExtendedLBA(IOATACommand* owner); + + // terminology as established in ATA/ATAPI-6. + // for the extended LBA address + + /*!@function setLBALow16 + @abstract convenience method that sets the lower 16 bits of a 48-bit LBA + */ + virtual void setLBALow16( UInt16 lbaLow); + + /*!@function getLBALow16 + @abstract convenience method that gets the lower 16 bits of a 48-bit LBA + */ + virtual UInt16 getLBALow16 (void); + + /*!@function setLBAMid16 + @abstract convenience method that sets the middle 16 bits of a 48-bit LBA + */ + virtual void setLBAMid16 (UInt16 lbaMid); + + /*!@function getLBAMid16 + @abstract convenience method that gets the middle 16 bits of a 48-bit LBA + */ + virtual UInt16 getLBAMid16( void ); + + /*!@function setLBAHigh16 + @abstract convenience method that sets the high 16 bits of a 48-bit LBA + */ + virtual void setLBAHigh16( UInt16 lbaHigh ); + + /*!@function getLBAHigh16 + @abstract convenience method that gets the high 16 bits of a 48-bit LBA + */ + virtual UInt16 getLBAHigh16( void ); + + /*!@function setSectorCount16 + @abstract Taskfile access. Registers are named in accordance with ATA Standards conventions + */ + virtual void setSectorCount16( UInt16 sectorCount ); + + /*!@function getSectorCount16 + @abstract Taskfile access. Registers are named in accordance with ATA Standards conventions + */ + virtual UInt16 getSectorCount16( void ); + + /*!@function setFeatures16 + @abstract Taskfile access. Registers are named in accordance with ATA Standards conventions + */ + virtual void setFeatures16( UInt16 features ); + + /*!@function getFeatures16 + @abstract Taskfile access. Registers are named in accordance with ATA Standards conventions + */ + virtual UInt16 getFeatures16( void ); + + /*!@function setDevice + @abstract Taskfile access. Registers are named in accordance with ATA Standards conventions + */ + virtual void setDevice( UInt8 inDevice ); + + /*!@function getDevice + @abstract Taskfile access. Registers are named in accordance with ATA Standards conventions + */ + virtual UInt8 getDevice( void ); + + /*!@function setCommand + @abstract Taskfile access. Registers are named in accordance with ATA Standards conventions + */ + virtual void setCommand( UInt8 inCommand ); + + /*!@function getCommand + @abstract Taskfile access. Registers are named in accordance with ATA Standards conventions + */ + virtual UInt8 getCommand( void ); + + /*!@function setExtendedLBA + @abstract convenience method that sets the taskfile registers into a 48-bit LBA address, along with sector count, and unit selected and LBA bit set + */ + virtual void setExtendedLBA( UInt32 inLBAHi, UInt32 inLBALo, ataUnitID inUnit, UInt16 extendedCount, UInt8 extendedCommand); + + /*!@function getExtendedLBA + @abstract convenience method that gets a 48-bit LBA + */ + virtual void getExtendedLBA( UInt32* outLBAHi, UInt32* outLBALo ); + + /*!@function zeroData + @abstract convenience method that zeros out the lba, sector count, features, device, and command member variables + */ + virtual void zeroData(void); + + /*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties in the future. + */ + struct ExpansionData { }; + + /*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + + + protected: + + IOATACommand* owner; + UInt16 lbaLow; + UInt16 lbaMid; + UInt16 lbaHigh; + UInt16 sectorCount; + UInt16 features; + UInt16 device; + UInt16 command; + + private: + OSMetaClassDeclareReservedUnused(IOExtendedLBA, 0); + OSMetaClassDeclareReservedUnused(IOExtendedLBA, 1); + OSMetaClassDeclareReservedUnused(IOExtendedLBA, 2); + OSMetaClassDeclareReservedUnused(IOExtendedLBA, 3); + OSMetaClassDeclareReservedUnused(IOExtendedLBA, 4); + OSMetaClassDeclareReservedUnused(IOExtendedLBA, 5); + OSMetaClassDeclareReservedUnused(IOExtendedLBA, 6); + OSMetaClassDeclareReservedUnused(IOExtendedLBA, 7); + OSMetaClassDeclareReservedUnused(IOExtendedLBA, 8); + OSMetaClassDeclareReservedUnused(IOExtendedLBA, 9); + OSMetaClassDeclareReservedUnused(IOExtendedLBA, 10); + + +}; + +#endif diff --git a/QualcommWireless/include/IOKit/ata/IOATAController.h b/QualcommWireless/include/IOKit/ata/IOATAController.h new file mode 100644 index 0000000..3758941 --- /dev/null +++ b/QualcommWireless/include/IOKit/ata/IOATAController.h @@ -0,0 +1,314 @@ +/* + * Copyright (c) 1998-2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#ifndef _IOATACONTROLLER_H +#define _IOATACONTROLLER_H + +#include +#include +#include +#include +#include +#include "ATATimerEventSource.h" + +class IOATADevice; +class IOATABusCommand; +class IOATABusInfo; +class IOATADevConfig; + +/*! @class IOATAController + @abstract The base class for ata controller family. Provides the interface common to all ata bus controllers. + @discussion Subclasses of IOATAController implement drivers for specific bus hardware. Disk devices are clients of + IOATAController and communicate via the IOATABusNub instantiated for each device discovered by the specific IOATAController + subclass when it probes hardware. Via the nub, the ATA Controller provides standard information about bus capability, accepts + requests for transfer mode configuration (timing), accepts requests for IO and bus operations, notifies the device driver about + bus events which may affect the device, such as soft-resets or device removal (ie, media-bay and PC-card) and removal of queued + IO requests which have not been dispatched into the hardware. + + @discussion The header doc for this class is incomplete. The source however is heavily commented and should be consulted until + such time as complete header doc is available. +*/ + + + +class IOATAController : public IOService +{ + OSDeclareDefaultStructors(IOATAController); + +public: + + + /*--- Common ATA Controller Interface ---*/ + // find out bus capability + virtual IOReturn provideBusInfo( IOATABusInfo* infoOut); + + // set and get bus timing configuration for a specific unit + virtual IOReturn selectConfig( IOATADevConfig* configRequest, UInt32 unitNumber); + virtual IOReturn getConfig( IOATADevConfig* configRequest, UInt32 unitNumber); + + // The main call puts something on the work loop + virtual IOReturn executeCommand( IOATADevice* nub, IOATABusCommand* cmd); + + + + /*-- Power Management ---*/ + + // TBD + + + /*--- Overrides from IOService ---*/ + virtual bool init(OSDictionary * properties); + + virtual IOService* probe( IOService* provider, SInt32* score ); + virtual bool start( IOService* provider ); + + +protected: + + enum { + kBusFree = 'free', // bus is available + kBusBusy = 'busy', // bus is busy with request + kQueueOpen = '!lck', // queue is not locked + kQueueLocked = 'LOCK', // queue is frozen and not + kImmediateLocked = '!Imd', // immediate commands may not be processed + kImmediateOK = 'Immd' // immediate commands allowed. + }; + + /* Transaction State indicator definition - indicates what action is next*/ + enum transState { + kATAInitial = 0x00, // in queue + kATAStarted = 0x01, // issue taskfile + kATAPICmd = 0x02, // issue packet + kATADataTx = 0x03, // data transfer phase + kATAStatus = 0x04, // read status + kATAComplete = 0x05, // io complete + kATADone = 0x06 // completion callout called + }; + + struct ataDevInfo { + ataDeviceType type; // ata, atapi, unknown + atapiConfig packetSend; // slow DRQ, IRQ, or fast DRQ for packet + }; + + + struct ataDoubleBuffer + { + IOPhysicalAddress physicalBuffer; + IOLogicalAddress logicalBuffer; + IOByteCount bufferSize; + + }; + + + IOService* _provider; + IOWorkLoop* _workLoop; + IOCommandGate* _cmdGate; + ATATimerEventSource* _timer; + queue_head_t _commandQueue; + IOATABusCommand* _currentCommand; + UInt32 _busState; + UInt32 _queueState; + UInt32 _immediateGate; + ataUnitID _selectedUnit; + ataDevInfo _devInfo[2]; + IOATADevice* _nub[2]; + ataDoubleBuffer _doubleBuffer; + + IOATARegPtr8 _tfFeatureReg; + IOATARegPtr8 _tfSCountReg; + IOATARegPtr8 _tfSectorNReg; + IOATARegPtr8 _tfCylLoReg; + IOATARegPtr8 _tfCylHiReg; + IOATARegPtr8 _tfSDHReg; + IOATARegPtr8 _tfStatusCmdReg; + IOATARegPtr16 _tfDataReg; + IOATARegPtr8 _tfAltSDevCReg; + + + // false if couldn't allocate the per-bus double buffer. + // controllers should provide implementation where needed + // for DMA hardware compatibility. The default method provides + // a 4K buffer for PIO since MemoryDescriptors do not by default have + // logical addresses in the kernel space. + virtual bool allocateDoubleBuffer( void ); + + // perform 2-byte endian swap. Only useful on PIO transfers and identify data + virtual void swapBytes16( UInt8* dataBuffer, IOByteCount length); + +/*! @function handleCommand + @abstract Called by executeCommand() to handle the client command + from the workloop context. + @param command The command code. + @param param1 Command parameter. + @param param2 Command parameter. + @param param3 Command parameter. + @result kIOReturnSuccess on success, or an error code otherwise. */ + + virtual IOReturn handleCommand( void * command, + void * param1 = 0, + void * param2 = 0, + void * param3 = 0); + + +/*! @function busCanDispatch + @abstract answers whether the bus is in state such that the next command + can be dispatched. + @result true - bus is free to issue commands. false - bus cannot issue + commands at this time. */ + virtual bool busCanDispatch( void ); + + +/*! @function dispatchNext + @abstract Causes the command at the front of the queue to dequeue, made the + current command and begin execution. + @result noErr indicates successful dispatch. */ + virtual IOReturn dispatchNext( void ); + + // sets the result code, free's the bus state, dispatch next command and execute completion + virtual void completeIO( IOReturn commandResult ); + + // Command queue handlers. + virtual IOReturn enqueueCommand( IOATABusCommand* command); + virtual IOATABusCommand* dequeueFirstCommand( void ); + + // event notifier for clients + virtual void executeEventCallouts( ataEventCode event, ataUnitID unit); + + // default handler for device interrupts. + virtual IOReturn handleDeviceInterrupt( void ); + + + // timer functions + // starts the timeout on the current command + virtual IOReturn startTimer( UInt32 inMS); + //disable and clear a running timer. + virtual void stopTimer( void ); + // called when a timeout occurs. + virtual void handleTimeout( void ); + // true if the timer has expired + virtual bool checkTimeout( void ); + + // handle IO opcodes + virtual IOReturn handleExecIO( void ); + virtual IOReturn handleRegAccess( void ); + virtual IOReturn handleBusReset(void); + virtual IOReturn handleQueueFlush( void ); + + // various protocol phases + virtual IOReturn asyncData(void); + virtual IOReturn asyncStatus(void); + virtual IOReturn asyncIO(void); + virtual IOReturn asyncCommand(void); + virtual IOReturn synchronousIO(void); + + // hardware access + virtual IOReturn selectDevice( ataUnitID unit ); + virtual IOReturn issueCommand( void ); + virtual IOReturn writePacket( void ); + virtual IOReturn softResetBus( bool doATAPI = false ); + + virtual IOReturn startDMA( void ); + virtual IOReturn stopDMA( void ); + + virtual bool ATAPISlaveExists( void ); + virtual UInt32 scanForDrives( void ); + + virtual bool waitForU8Status (UInt8 mask, UInt8 value); + + virtual IOByteCount readATAPIByteCount( void ); + virtual void handleOverrun( IOByteCount length); + virtual IOReturn registerAccess(bool isWrite); + + // PIO data transfers + virtual IOReturn txDataIn (IOLogicalAddress buf, IOByteCount length); + virtual IOReturn txDataOut (IOLogicalAddress buf, IOByteCount length); + + virtual IOATAController::transState determineATAPIState(void); + + // device should set the controller to the config for this device + virtual void selectIOTiming( ataUnitID unit ); + + // subclasses MUST implement this function in order to initialize + // the pointers to the ATA task file registers during start() time. + virtual bool configureTFPointers(void); + + // convert a bit-significant indicator to a numeric value. + virtual UInt16 bitSigToNumeric( UInt16 binary); + + // for 48 bit register reading and writing + UInt16 readExtRegister( IOATARegPtr8 inRegister ); + void writeExtRegister( IOATARegPtr8 inRegister, UInt16 inValue ); + + // overrides + virtual void free(); + +private: + + // used called by the commandgate in executeCommand. + static void executeCommandAction(OSObject * owner, + void * arg0, + void * arg1, + void * arg2, + void * arg3); + + // callout used by the timer to indicate the timeout failure. + static void timeoutOccured( OSObject *owner, + IOTimerEventSource *sender); + +protected: +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the IOATAController in the future. + */ + typedef struct ExpansionData + { + IOBufferMemoryDescriptor* _doubleBufferDesc; + } ExpansionData; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + +private: + OSMetaClassDeclareReservedUnused(IOATAController, 0); + OSMetaClassDeclareReservedUnused(IOATAController, 1); + OSMetaClassDeclareReservedUnused(IOATAController, 2); + OSMetaClassDeclareReservedUnused(IOATAController, 3); + OSMetaClassDeclareReservedUnused(IOATAController, 4); + OSMetaClassDeclareReservedUnused(IOATAController, 5); + OSMetaClassDeclareReservedUnused(IOATAController, 6); + OSMetaClassDeclareReservedUnused(IOATAController, 7); + OSMetaClassDeclareReservedUnused(IOATAController, 8); + OSMetaClassDeclareReservedUnused(IOATAController, 9); + OSMetaClassDeclareReservedUnused(IOATAController, 10); + OSMetaClassDeclareReservedUnused(IOATAController, 11); + OSMetaClassDeclareReservedUnused(IOATAController, 12); + OSMetaClassDeclareReservedUnused(IOATAController, 13); + OSMetaClassDeclareReservedUnused(IOATAController, 14); + OSMetaClassDeclareReservedUnused(IOATAController, 15); + OSMetaClassDeclareReservedUnused(IOATAController, 16); + OSMetaClassDeclareReservedUnused(IOATAController, 17); + OSMetaClassDeclareReservedUnused(IOATAController, 18); + OSMetaClassDeclareReservedUnused(IOATAController, 19); + OSMetaClassDeclareReservedUnused(IOATAController, 20); +}; +#endif /* !_IOATACONTROLLER_H */ diff --git a/QualcommWireless/include/IOKit/ata/IOATADevConfig.h b/QualcommWireless/include/IOKit/ata/IOATADevConfig.h new file mode 100644 index 0000000..e5714c3 --- /dev/null +++ b/QualcommWireless/include/IOKit/ata/IOATADevConfig.h @@ -0,0 +1,239 @@ +/* + * Copyright (c) 2000-2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#ifndef _IOATADEVCONFIG_H +#define _IOATADEVCONFIG_H + +#include +#include +#include "IOATATypes.h" +#include "IOATABusInfo.h" + + +/*! + @class IOATADevConfig + @abstract used for configuring and communicating the desired transfer modes of a device. + A disk driver would typically use this object in conjunction with the 512-bytes of identification + data from the drive and the IOATABusInfo object for the bus it is connected to. + This object will determine the best matching transfer speeds available. + the device driver will then send a series of Set Features commands to configure the drive + and this object to the bus through the IOATADevice nub in order to configure the optimum transfer mode. + The driver for the disk drive may choose to populate this object with whatever transfer mode + desired, in the event that a different mode is required. + @discussion usually use the initWithBestSelection to make a best mode match. + The Mode accessors use bit significance to indicate a selected mode or supported modes(s) + ie, 00000001b indicates Mode-0, 00000010b indicates mode 1, etc. + Selected mode is indicated by a single set bit. No bit set indicates no mode in that class is selected. + ie, a bus will support multiple possible modes, but will only have one mode selected at that time. + +*/ + +class IOATADevConfig : public OSObject { + + OSDeclareDefaultStructors( IOATADevConfig ); + + public: + + /*!@function atadevconfig + @abstract static creator function. + */ + static IOATADevConfig* atadevconfig(void); + + /*!@function initWithBestSelection + @abstract Handy initializer: pass the 512-byte result of the Identify Device or + Identify Packet Device in endian-order for your platform (byte-swapped on PPC) + and the IOATABusInfo object for the bus. The object will initialize all fields + and select the best transfer modes that match on bus and device. + If the return value was 0 (success or noErr), then a matching mode is supported. + Examine the PIO and UDMA/DMA fields and to generate the apropriate SET FEATURES + parameters for your drive and send this initialised object to the IOATAController + when requesting a speed configuration. + failure means no supported transfer modes matched between bus and device info. + + @param identifyData 512 bytes of data obtained from the device via IDENTIFY DEVICE or IDENTIFY PACKET DEVICE command. + @param busInfo pointer to an IOATAbusInfo object obtained from a previous atanub->provideBusInfo() call. + @result kIOSuccess (0) when a matching transfer mode is available between the device and controller. + */ + IOReturn initWithBestSelection( const UInt16* identifyData, IOATABusInfo* busInfo); + + // intitialize with the 512 byte data from an ATA device identify command + IOReturn assignFromData( const UInt16* identifyData ); + + /*!@function setPacketConfig + @param packetConfig + @abstract For ATAPI devices, if the device asserts interrupt after the Packet Command when it is ready to accept the packet, set this value to true (mostly older devices). If the device accepts the packet only by asserting DRQ bit in status, then set this value false. Tells the bus controller whether to wait for packet acceptance or set pending interrupt. + */ + void setPacketConfig ( atapiConfig packetConfig); + + /*!@function getPacketConfig + @result atapiConfig as defined in IOATATypes.h + */ + atapiConfig getPacketConfig( void ); + + // The following Mode accessors use bit significance to indicate a selected mode or supported modes(s) + // ie, 00000001b indicates Mode-0, 00000010b indicates mode 1, etc. + // Selected mode is indicated by a single set bit. No bit set indicates no mode in that class is selected. + // ie, a bus will support multiple possible modes, but will only have one mode selected at that time. + + /*!@function setPIOMode + @param inModeBitMap bit-significant map of PIO mode + */ + void setPIOMode( UInt8 inModeBitMap); // bit-significant map of PIO mode(s) + + /*!@function getPIOMode + @result bit-significant map of PIO mode + */ + UInt8 getPIOMode( void ); + + /*!@function setDMAMode + @param inModeBitMap bit-significant map of DMA mode + */ + void setDMAMode( UInt8 inModeBitMap ); // bit-significant map of DMA mode(s) + + /*!@function getDMAMode + @result bit-significant map of DMA mode + */ + UInt8 getDMAMode( void ); + + /*!@function setUltraMode + @param inModeBitMap bit-significant map of Ultra mode + */ + void setUltraMode( UInt8 inModeBitMap ); // bit-significant map of Ultra mode(s) + + /*!@function getUltraMode + @result bit-significant map of Ultra mode + */ + UInt8 getUltraMode( void ); + + // The following cycle time accessors report cycle times in nanoseconds. + // A device requesting a mode should also request a cycle time as reported in the device's identification page. + // A bus controller will configure the bus not to exceed (go faster than) the minimum time requested. + // When a bus controller reports a mode configuration, the cycle time indicates the busses contract not to go + // faster than. However an actual cycle time may be slower than the indicated time. + /*!@function setPIOCycleTime + @param inNS PIO cycle time in nanoseconds. + */ + void setPIOCycleTime( UInt16 inNS ); + + /*!@function getPIOCycleTime + @result reported PIO CycleTime in nanoseconds. + */ + UInt16 getPIOCycleTime( void ); + + /*!@function setDMACycleTime + @param inNS reported multiword DMA Cycle time in nanoseconds. + */ + void setDMACycleTime( UInt16 inNS ); + + /*!@function getDMACycleTime + @result Reported multiword DMA cycle time in nanoseconds. + */ + UInt16 getDMACycleTime( void ); + + // Ultra ATA defines cycle times a device must meet to comply with standards. + // No cycle time field is needed. + + // convert bit-significant to numeric value + /*!@function bitSigToNumeric + @abstract converts a bit-significant field to a numerical value. Note that a bit field of 0x00 has no defined result. + @param binary the bit significant field. + @result the numerical value of the highest bit set in the field. + */ + virtual UInt8 bitSigToNumeric( UInt16 binary); + + + protected: + + atapiConfig _atapiIRQForPacket; // enum for bits 5 and 6 of word zero of + // the identify packet device info data for PACKET devices ONLY. + // shift word-0 5-bits left, mask 0x03 and these enums apply. + // values are: + + // kATAPIDRQSlow = 0x00 - wait up to 3MS for packet on DRQ + // kATAPIIRQPacket = 0x01, - device asserts IRQ for packet + // kATAPIDRQFast = 0x10, - packet on DRQ within 50us + // kATAPIUnknown = 0x11 - reserved as of ATA/ATAPI-5 + + + + + UInt8 _ataPIOMode; /* <->: PIO Mode Timing class bit-significant */ + UInt16 _ataPIOCycleTime; /* <->: Cycle time in ns for PIO mode */ + UInt8 _ataMultiDMAMode; /* <->: Multiple Word DMA Timing Class bit-significant*/ + UInt16 _ataMultiCycleTime; /* <->: Cycle time in ns for Multiword DMA mode */ + UInt8 _ataUltraDMAMode; /* <->: Ultra DMA timing class bit-significant */ + + IOReturn _AssignPIOData( const UInt16* identifyData); + IOReturn _AssignDMAData(const UInt16* identifyData); + IOReturn _AssignUltraData(const UInt16* identifyData); + UInt8 _MostSignificantBit( UInt8 inByte); + + + virtual bool init(); +protected: +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the IOWorkLoop in the future. + */ + struct ExpansionData { }; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + +private: + OSMetaClassDeclareReservedUnused(IOATADevConfig, 0); + OSMetaClassDeclareReservedUnused(IOATADevConfig, 1); + OSMetaClassDeclareReservedUnused(IOATADevConfig, 2); + OSMetaClassDeclareReservedUnused(IOATADevConfig, 3); + OSMetaClassDeclareReservedUnused(IOATADevConfig, 4); + OSMetaClassDeclareReservedUnused(IOATADevConfig, 5); + OSMetaClassDeclareReservedUnused(IOATADevConfig, 6); + OSMetaClassDeclareReservedUnused(IOATADevConfig, 7); + OSMetaClassDeclareReservedUnused(IOATADevConfig, 8); + OSMetaClassDeclareReservedUnused(IOATADevConfig, 9); + OSMetaClassDeclareReservedUnused(IOATADevConfig, 10); + OSMetaClassDeclareReservedUnused(IOATADevConfig, 11); + OSMetaClassDeclareReservedUnused(IOATADevConfig, 12); + OSMetaClassDeclareReservedUnused(IOATADevConfig, 13); + OSMetaClassDeclareReservedUnused(IOATADevConfig, 14); + OSMetaClassDeclareReservedUnused(IOATADevConfig, 15); + OSMetaClassDeclareReservedUnused(IOATADevConfig, 16); + OSMetaClassDeclareReservedUnused(IOATADevConfig, 17); + OSMetaClassDeclareReservedUnused(IOATADevConfig, 18); + OSMetaClassDeclareReservedUnused(IOATADevConfig, 19); + OSMetaClassDeclareReservedUnused(IOATADevConfig, 20); + +public: + +//some static utility functions to parse the identify data for feature support + + static bool sDriveSupports48BitLBA( const UInt16* identifyData ); + static UInt32 sDriveExtendedLBASize( UInt32* lbaHi, UInt32* lbaLo, const UInt16* identifyData); // result returned is same as lbaLo. + +}; + + +// header doc info goes here. I find putting it within the delcarations more confusing than putting it all in the bottom of the header. + + +#endif /* !_IOATADEVCONFIG_H */ diff --git a/QualcommWireless/include/IOKit/ata/IOATADevice.h b/QualcommWireless/include/IOKit/ata/IOATADevice.h new file mode 100644 index 0000000..78be513 --- /dev/null +++ b/QualcommWireless/include/IOKit/ata/IOATADevice.h @@ -0,0 +1,179 @@ +/* + * Copyright (c) 1998-2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * IOATADevice.h + * + * This object implements a relay to an ATA Bus where a drive is attached. + */ + + +#ifndef _IOATADEVICE_H +#define _IOATADEVICE_H + +#include +#include +#include "IOATATypes.h" +#include "IOATACommand.h" +#include "IOATABusInfo.h" +#include "IOATADevConfig.h" + +class IOATAController; + + +/*! + @class IOATADevice + @abstract This object implements a relay to an ATA Bus where a drive is attached. + @discussion IOATADevice is the superclass which represents a particular device attached to a particular IOATAController (bus). IOATADevice is the provider for ATA mass-storage device drivers.IOATADevice is the factory for all IOATACommand objects and is responsible for creating and freeing IOATACommands. IOATAControllers will create an instance of IOATADevice for each device physically connected to the ata bus. IOATADevice is virtual and specific subclass should be implemented for particular types of IOATAController. In this manner, controller-specifc IOATACommands may be paired with the proper type of controller. +*/ + +class IOATADevice : public IOService +{ + OSDeclareDefaultStructors(IOATADevice); + +public: + + // + /*!@function getUnitID + @abstract Determine whether this device is number 0 or 1 (ie, master/slave) + @result ataUnitID - 0 or 1. + */ + virtual ataUnitID getUnitID( void ); + + // + /*!@function getDeviceType + @abstract Find out what kind of device this nub is (ata or atapi) + @result ataDeviceType as defined in IOATATypes.h + */ + virtual ataDeviceType getDeviceType( void ); + + // + /*!@function provideBusInfo + @abstract Find out the bus capability so the client can choose the features to set and commands to run. + @param getInfo a pointer to a valid IOATABusInfo object. + @result kIOSuccess (0) and the getInfo object will be filled out by the bus controller with information about the bus. + */ + virtual IOReturn provideBusInfo( IOATABusInfo* getInfo); + + // + /*!@function selectConfig + @abstract Tell the bus what speed to use for your device. + @param configRequest pointer to a valid and initialized IOATADevConfig object. + @result kIOSuccess (0) if the configuration was succesfully selected. + @discussion This should only be called once during a disk drivers start method before registering its availability, and must be called prior to issuing any data IO transactions. + */ + virtual IOReturn selectConfig( IOATADevConfig* configRequest); + + // + /*!@function provideConfig + @abstract Find out what speed the bus has configured for this unit. + @param configRequest pointer to a valid IOATADevConfig object. + @result kIOSuccess (0) on successful completion and configRequest will contain the configuration information. + */ + virtual IOReturn provideConfig( IOATADevConfig* configRequest); + + // Submit IO requests + /*! + @function executeCommand + @abstract Submit IO requests + @param command pointer to a valid IOATACommand with the command to be executed. + @result kIOSuccess (0) if the command was successfully queued in the controller. + */ + virtual IOReturn executeCommand(IOATACommand* command); + + // create and destroy IOATACommands + /*! + @function allocCommand + @abstract create IOATACommands. Device drivers should allocate command objects only through this method. + @result null if allocation failed. Retain count is one. + */ + virtual IOATACommand* allocCommand( void ); + + /*! + @function freeCommand + @abstract release a command object that is no longer needed. Do not free an object in use and do not release the object anymore times than you have retained it. + @param inCommand the command to be released. + */ + virtual void freeCommand( IOATACommand* inCommand); + + // matching stuff for IOBSDInit and so on. + /*!@function matchPropertyTable + @abstract matching stuff for IOBSDInit and so on. + */ + virtual bool matchPropertyTable(OSDictionary * table); + + /*!@function matchLocation + @abstract matching stuff for IOBSDInit and so on. + */ + virtual IOService* matchLocation(IOService * client); + + /*!@function matchPropertyTable + @abstract matching stuff for IOBSDInit and so on. + */ + virtual bool matchPropertyTable(OSDictionary * table, SInt32 * score); + + // called by controllers when they need to send a message to client drivers. + /*! + @function notifyEvent + @abstract called by controllers when they need to send a message to client (disk) drivers. + */ + virtual void notifyEvent( UInt32 event ); + + +protected: + IOATAController* _provider; + ataUnitID _unitNumber; // 0 - master, 1 - slave, -1 = not Valid + ataDeviceType _deviceType; // ata, atapi, unknown +protected: +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the IOWorkLoop in the future. + */ + struct ExpansionData { }; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + +private: + OSMetaClassDeclareReservedUnused(IOATADevice, 0); + OSMetaClassDeclareReservedUnused(IOATADevice, 1); + OSMetaClassDeclareReservedUnused(IOATADevice, 2); + OSMetaClassDeclareReservedUnused(IOATADevice, 3); + OSMetaClassDeclareReservedUnused(IOATADevice, 4); + OSMetaClassDeclareReservedUnused(IOATADevice, 5); + OSMetaClassDeclareReservedUnused(IOATADevice, 6); + OSMetaClassDeclareReservedUnused(IOATADevice, 7); + OSMetaClassDeclareReservedUnused(IOATADevice, 8); + OSMetaClassDeclareReservedUnused(IOATADevice, 9); + OSMetaClassDeclareReservedUnused(IOATADevice, 10); + OSMetaClassDeclareReservedUnused(IOATADevice, 11); + OSMetaClassDeclareReservedUnused(IOATADevice, 12); + OSMetaClassDeclareReservedUnused(IOATADevice, 13); + OSMetaClassDeclareReservedUnused(IOATADevice, 14); + OSMetaClassDeclareReservedUnused(IOATADevice, 15); + OSMetaClassDeclareReservedUnused(IOATADevice, 16); + OSMetaClassDeclareReservedUnused(IOATADevice, 17); + OSMetaClassDeclareReservedUnused(IOATADevice, 18); + OSMetaClassDeclareReservedUnused(IOATADevice, 19); + OSMetaClassDeclareReservedUnused(IOATADevice, 20); +}; + +#endif /* !_IOATABUSNUB_H */ diff --git a/QualcommWireless/include/IOKit/ata/IOATARegI386.h b/QualcommWireless/include/IOKit/ata/IOATARegI386.h new file mode 100644 index 0000000..73016ba --- /dev/null +++ b/QualcommWireless/include/IOKit/ata/IOATARegI386.h @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2000-2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOATAREGI386_H +#define _IOATAREGI386_H + +#include + +/* + * IOATAReg: ATA register abstract base class. + */ +#define DefineIOATAReg(w) \ +class IOATAReg##w : public OSObject \ +{ \ + OSDeclareAbstractStructors( IOATAReg##w ) \ + \ +public: \ + virtual void operator = (UInt##w rhs) = 0; \ + virtual operator UInt##w() const = 0; \ +} + +DefineIOATAReg( 8 ); +DefineIOATAReg( 16 ); +DefineIOATAReg( 32 ); + +typedef IOATAReg8 * IOATARegPtr8; +typedef IOATAReg16 * IOATARegPtr16; +typedef IOATAReg32 * IOATARegPtr32; + +#define IOATARegPtr8Cast(x) (x) + +/* + * IOATAIOReg: I/O mapped ATA registers. + */ +#define DefineIOATAIOReg(w) \ +class IOATAIOReg##w : public IOATAReg##w \ +{ \ + OSDeclareDefaultStructors( IOATAIOReg##w ) \ + \ +protected: \ + UInt16 _address; \ + \ +public: \ + static IOATAIOReg##w * withAddress( UInt16 address ); \ + \ + virtual bool initWithAddress( UInt16 address ); \ + virtual UInt16 getAddress() const; \ + \ + virtual void operator = (UInt##w rhs); \ + virtual operator UInt##w() const; \ +} + +DefineIOATAIOReg( 8 ); +DefineIOATAIOReg( 16 ); +DefineIOATAIOReg( 32 ); + +#endif /* !_IOATAREGI386_H */ diff --git a/QualcommWireless/include/IOKit/ata/IOATATypes.h b/QualcommWireless/include/IOKit/ata/IOATATypes.h new file mode 100644 index 0000000..a3be9dc --- /dev/null +++ b/QualcommWireless/include/IOKit/ata/IOATATypes.h @@ -0,0 +1,393 @@ +/* + * Copyright (c) 2000-2008 Apple, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#ifndef _IOATATYPES_H +#define _IOATATYPES_H + +#include + + +/*! + +@header IOATAtypes.h +@discussion contains various definitions and constants for use in the IOATAFamily and clients. Header Doc is incomplete at this point, but file is heavily commented. + +*/ +// property strings +#define kATADevPropertyKey "ata device type" +#define kATATypeATAString "ata" +#define kATATypeATAPIString "atapi" +#define kATATypeUnknownString "unknown" + +#define kATAVendorPropertyKey "device model" +#define kATARevisionPropertyKey "device revision" +#define kATASerialNumPropertyKey "device serial" + +#define kATAUnitNumberKey "unit number" + +#define kATASocketKey "socket type" +#define kATAInternalSocketString "internal" +#define kATAMediaBaySocketString "media-bay" +#define kATAPCCardSocketString "pccard" +#define kATAInternalSATAString "serial-ata" +#define kATASATABayString "sata-bay" +#define kATAInternalSATA2 "serial-ata-2" +#define kATASATA2BayString "sata-2-bay" +#define kATAUnkownSocketString "unknown" + +#define kATANotifyOnChangeKey "media-notify" + +// allows for porting to non-memory-mapped IO systems, such as x86. +// for such a platform, create a class and overload the assignment operators +// so that the correct IO operation is performed and define the type for that architecture port. +#ifdef __ppc__ +#define IOATARegPtr8 volatile UInt8* +#define IOATARegPtr16 volatile UInt16* +#define IOATARegPtr32 volatile UInt32* +#define IOATARegPtr8Cast(x) ((IOATARegPtr8)(x)) +#elif defined( __i386__ ) || defined( __x86_64__ ) +#include +#else +#error Unknown machine architecture +#endif + +enum ataSocketType{ + + kUnknownSocket = 0, + kInternalATASocket, + kMediaBaySocket , + kPCCardSocket, + kInternalSATA, + kSATABay, + kInternalSATA2, + kSATA2Bay + +} ; + + +enum ataDeviceType { + + kUnknownATADeviceType = 0, + kATADeviceType, + kATAPIDeviceType + +} ; + +// enum for bits 5 and 6 of word zero of +// the identify packet device info data. +// shift word-0 5-bits left, mask 0x03 and these enums apply. +enum atapiConfig { + + kATAPIDRQSlow = 0x00, + kATAPIIRQPacket = 0x01, + kATAPIDRQFast = 0x10, + kATAPIUnknown = 0x11 + +}; + + +enum ataUnitID { + + kATAInvalidDeviceID = -1, + kATADevice0DeviceID = 0, /* aka, Master. Device 0 is the correct terminology */ + kATADevice1DeviceID = 1 /* aka, Slave. Device 1 is the correct terminology */ + +} ; + +enum { + + kATADefaultSectorSize = 512 +}; + +/* Task file definition *** Error Register *** */ +enum { + bATABadBlock = 7, /* bit number of bad block error bit*/ + bATAUncorrectable = 6, /* bit number of uncorrectable error bit*/ + bATAMediaChanged = 5, /* bit number of media changed indicator*/ + bATAIDNotFound = 4, /* bit number of ID not found error bit*/ + bATAMediaChangeReq = 3, /* bit number of media changed request*/ + bATACommandAborted = 2, /* bit number of command abort bit*/ + bATATrack0NotFound = 1, /* bit number of track not found*/ + bATAAddressNotFound = 0, /* bit number of address mark not found*/ + mATABadBlock = 1 << bATABadBlock, /* Bad Block Detected*/ + mATAUncorrectable = 1 << bATAUncorrectable, /* Uncorrectable Data Error*/ + mATAMediaChanged = 1 << bATAMediaChanged, /* Media Changed Indicator (for removable)*/ + mATAIDNotFound = 1 << bATAIDNotFound, /* ID Not Found*/ + mATAMediaChangeReq = 1 << bATAMediaChangeReq, /* Media Change Requested (NOT IMPLEMENTED)*/ + mATACommandAborted = 1 << bATACommandAborted, /* Aborted Command*/ + mATATrack0NotFound = 1 << bATATrack0NotFound, /* Track 0 Not Found*/ + mATAAddressNotFound = 1 << bATAAddressNotFound /* Address Mark Not Found*/ +}; + +/* Task file definition *** Features register *** */ +enum { + bATAPIuseDMA = 0, /* bit number of useDMA bit (ATAPI)*/ + mATAPIuseDMA = 1 << bATAPIuseDMA +}; + +/* Task file definition *** ataTFSDH Register *** */ +enum { + mATAHeadNumber = 0x0F, /* Head Number (bits 0-3) */ + mATASectorSize = 0xA0, /* bit 7=1; bit 5 = 01 (512 sector size) */ + mATADriveSelect = 0x10, /* Drive (0 = master, 1 = slave) */ + mATALBASelect = 0x40 /* LBA mode bit (0 = chs, 1 = LBA)*/ +}; + +/* Task file definition *** Status Register *** */ +enum { + bATABusy = 7, /* bit number of BSY bit*/ + bATADriveReady = 6, /* bit number of drive ready bit*/ + bATAWriteFault = 5, /* bit number of write fault bit*/ + bATASeekComplete = 4, /* bit number of seek complete bit*/ + bATADataRequest = 3, /* bit number of data request bit*/ + bATADataCorrected = 2, /* bit number of data corrected bit*/ + bATAIndex = 1, /* bit number of index mark*/ + bATAError = 0, /* bit number of error bit*/ + mATABusy = 1 << bATABusy, /* Unit is busy*/ + mATADriveReady = 1 << bATADriveReady, /* Unit is ready*/ + mATAWriteFault = 1 << bATAWriteFault, /* Unit has a write fault condition*/ + mATASeekComplete = 1 << bATASeekComplete, /* Unit seek complete*/ + mATADataRequest = 1 << bATADataRequest, /* Unit data request*/ + mATADataCorrected = 1 << bATADataCorrected, /* Data corrected*/ + mATAIndex = 1 << bATAIndex, /* Index mark - NOT USED*/ + mATAError = 1 << bATAError /* Error condition - see error register*/ +}; + +/* Task file definition *** Device Control Register *** */ +enum { + bATADCROne = 3, /* bit number of always one bit*/ + bATADCRReset = 2, /* bit number of reset bit*/ + bATADCRnIntEnable = 1, /* bit number of interrupt disable*/ + mATADCROne = 1 << bATADCROne, /* always one bit*/ + mATADCRReset = 1 << bATADCRReset, /* Reset (1 = reset)*/ + mATADCRnIntEnable = 1 << bATADCRnIntEnable /* Interrupt Disable(0 = enabled)*/ +}; + + +/* 'ataRegMask' field of the ataRegAccess definition*/ +enum ataRegMask{ + + bATAAltSDevCValid = 14, /* bit number of alternate status/device cntrl valid bit*/ + bATAStatusCmdValid = 7, /* bit number of status/command valid bit*/ + bATASDHValid = 6, /* bit number of ataTFSDH valid bit*/ + bATACylinderHiValid = 5, /* bit number of cylinder high valid bit*/ + bATACylinderLoValid = 4, /* bit number of cylinder low valid bit*/ + bATASectorNumValid = 3, /* bit number of sector number valid bit*/ + bATASectorCntValid = 2, /* bit number of sector count valid bit*/ + bATAErrFeaturesValid = 1, /* bit number of error/features valid bit*/ + bATADataValid = 0, /* bit number of data valid bit*/ + mATAAltSDevCValid = 1 << bATAAltSDevCValid, /* alternate status/device control valid*/ + mATAStatusCmdValid = 1 << bATAStatusCmdValid, /* status/command valid*/ + mATASDHValid = 1 << bATASDHValid, /* ataTFSDH valid*/ + mATACylinderHiValid = 1 << bATACylinderHiValid, /* cylinder high valid*/ + mATACylinderLoValid = 1 << bATACylinderLoValid, /* cylinder low valid*/ + mATASectorNumValid = 1 << bATASectorNumValid, /* sector number valid*/ + mATASectorCntValid = 1 << bATASectorCntValid, /* sector count valid*/ + mATAErrFeaturesValid = 1 << bATAErrFeaturesValid, /* error/features valid*/ + mATADataValid = 1 << bATADataValid /* data valid*/ + +} ; + + +enum ataFlags{ + bATAFlagQuiesce = 20, + bATAFlagNoIRQ = 19, /* bit Number of no IRQ protocol flag*/ + bATAFlag48BitLBA = 18, + bATAFlagDMAQueued = 17, + bATAFlagOverlapped = 16, + bATAFlagUseConfigSpeed = 15, /* bit number of use configured speed flag*/ + bATAFlagByteSwap = 14, /* bit number of byte swap flag*/ + bATAFlagIORead = 13, /* bit number of I/O read flag*/ + bATAFlagIOWrite = 12, /* bit number of I/O write flag*/ + bATAFlagTFAccessResult = 8, /* bit number of get register results on command completion.*/ + bATAFlagUseDMA = 7, /* bit number of use DMA flag*/ + bATAFlagProtocolATAPI = 5, /* bit number of ATAPI protocol*/ + bATAFlagImmediate = 1, /* bit number of immediate flag */ + bATAFlagTFAccess = 0, /* bit number of TF access */ + + mATAFlagQuiesce = 1 << bATAFlagQuiesce, + mATAFlagUseNoIRQ = 1 << bATAFlagNoIRQ, /* Special purpose! Avoid using! No-IRQ, polled synchronous protocol valid only for PIO commands*/ + mATAFlag48BitLBA = 1 << bATAFlag48BitLBA, /* Use 48 bit extended LBA protocol on this command. Requires support from the controller.*/ + mATAFlagDMAQueued = 1 << bATAFlagDMAQueued, /* Use tagged dma queuing protocol on this command. Requires support from the controller.*/ + mATAFlagOverlapped = 1 << bATAFlagOverlapped, /* Use overllaped protocol on this command. Requires support from the controller.*/ + mATAFlagUseConfigSpeed = 1 << bATAFlagUseConfigSpeed, /* Use the configured interface speed = true. False = use default PIO (slow) speed. valid only for PIO commands*/ + mATAFlagByteSwap = 1 << bATAFlagByteSwap, /* Swap data bytes (read - after; write - before)*/ + mATAFlagIORead = 1 << bATAFlagIORead, /* Read (in) operation*/ + mATAFlagIOWrite = 1 << bATAFlagIOWrite, /* Write (out) operation*/ + mATAFlagTFAccessResult = 1 << bATAFlagTFAccessResult, /* get contents of TaskFile registers indicated in TFMask on command completion, even if no error*/ + mATAFlagUseDMA = 1 << bATAFlagUseDMA, + mATAFlagProtocolATAPI = 1 << bATAFlagProtocolATAPI, /* ATAPI protocol indicator*/ + mATAFlagImmediate = 1 << bATAFlagImmediate, /* Put command at head of queue */ + mATAFlagTFAccess = 1 << bATAFlagTFAccess, /* Return Taskfile on error status*/ + +} ; + +/* The Function codes sent to controllers*/ +enum ataOpcode { + + kATANoOp = 0, + kATAFnExecIO , /* Execute ATA I/O */ + kATAPIFnExecIO, /* ATAPI I/O */ + kATAFnRegAccess , /* Register Access */ + + kATAFnQFlush , /* I/O Queue flush requests for your unit number */ + kATAFnBusReset /* Reset ATA bus */ + +} ; + + +/* The ATA Event codes */ +/* sent when calling the device driver's event handler*/ +enum ataEventCode { + kATANullEvent = 0x00, /* Just kidding -- nothing happened*/ + kATAOnlineEvent = 0x01, /* An ATA device has come online*/ + kATAOfflineEvent = 0x02, /* An ATA device has gone offline*/ + kATARemovedEvent = 0x03, /* An ATA device has been removed from the bus*/ + kATAResetEvent = 0x04, /* Someone gave a hard reset to the drive*/ + kATAOfflineRequest = 0x05, /* Someone requesting to offline the drive*/ + kATAEjectRequest = 0x06, /* Someone requesting to eject the drive*/ + kATAPIResetEvent = 0x07, /* Someone gave a ATAPI reset to the drive*/ + kATAReservedEvent = 0x80 /* RESERVED*/ +}; + + +// These need to be combined with a new enumeration of the current ATA/ATAPI command set. +// Some opcodes are of interest to ATA controllers, since they imply special protocols +// or handling. Device Reset, Execute Device Diagnostics have subtle side effects that +// controllers need to be aware of, so we snoop for those commands being issued. +// the rest are here for informational purposes. + +// BUG make new enum for all current ATA commands. + +enum { + kSOFTRESET = 0x008, // ATAPI Soft Reset command + kPACKET = 0x0A0, // ATAPI Packet command + kID_DRIVE = 0x0A1 // ATAPI Identify drive command +}; +/* ATA Command Opcode definition*/ +enum { + kATAcmdWORetry = 0x01, /* Without I/O retry option*/ + kATAcmdNOP = 0x0000, /* NOP operation - media detect*/ + kATAcmdRecal = 0x0010, /* Recalibrate command */ + kATAcmdRead = 0x0020, /* Read command */ + kATAcmdReadLong = 0x0022, /* Read Long command*/ + kATAcmdReadExtended = 0x0024, /* Read Extended (with retries)*/ + kATAcmdReadDMAExtended = 0x0025, /* Read DMA Extended (with retries)*/ + kATAcmdWrite = 0x0030, /* Write command */ + kATAcmdWriteLong = 0x0032, /* Write Long*/ + kATAcmdWriteExtended = 0x0034, /* Write Extended (with retries)*/ + kATAcmdWriteDMAExtended = 0x0035, /* Write DMA Extended (with retries)*/ + kATAcmdWriteVerify = 0x003C, /* Write verify*/ + kATAcmdReadVerify = 0x0040, /* Read Verify command */ + kATAcmdFormatTrack = 0x0050, /* Format Track command */ + kATAcmdSeek = 0x0070, /* Seek command */ + kATAcmdDiagnostic = 0x0090, /* Drive Diagnostic command */ + kATAcmdInitDrive = 0x0091, /* Init drive parameters command */ + kATAcmdReadMultiple = 0x00C4, /* Read multiple*/ + kATAcmdWriteMultiple = 0x00C5, /* Write multiple*/ + kATAcmdSetRWMultiple = 0x00C6, /* Set Multiple for Read/Write Multiple*/ + kATAcmdReadDMA = 0x00C8, /* Read DMA (with retries)*/ + kATAcmdWriteDMA = 0x00CA, /* Write DMA (with retries)*/ + kATAcmdMCAcknowledge = 0x00DB, /* Acknowledge media change - removable*/ + kATAcmdDoorLock = 0x00DE, /* Door lock*/ + kATAcmdDoorUnlock = 0x00DF, /* Door unlock*/ + kATAcmdStandbyImmed = 0x00E0, /* Standby Immediate*/ + kATAcmdIdleImmed = 0x00E1, /* Idle Immediate*/ + kATAcmdStandby = 0x00E2, /* Standby*/ + kATAcmdIdle = 0x00E3, /* Idle*/ + kATAcmdReadBuffer = 0x00E4, /* Read sector buffer command */ + kATAcmdCheckPowerMode = 0x00E5, /* Check power mode command <04/04/94>*/ + kATAcmdSleep = 0x00E6, /* Sleep*/ + kATAcmdFlushCache = 0x00E7, /* Flush Cache */ + kATAcmdWriteBuffer = 0x00E8, /* Write sector buffer command */ + kATAcmdWriteSame = 0x00E9, /* Write same data to multiple sectors*/ + kATAcmdFlushCacheExtended = 0x00EA, /* Flush Cache Extended */ + kATAcmdDriveIdentify = 0x00EC, /* Identify Drive command */ + kATAcmdMediaEject = 0x00ED, /* Media Eject*/ + kATAcmdSetFeatures = 0x00EF /* Set Features*/ +}; + +/* Set feature command opcodes*/ +enum { + kATAEnableWriteCache = 0x02, /* Enable write cache*/ + kATASetTransferMode = 0x03, /* Set transfer mode*/ + kATAEnableAPM = 0x05, /* Enable Advanced Power Management*/ + kATASetPIOMode = 0x08, /* PIO Flow Control Tx Mode bit*/ + kATADisableWriteCache = 0x82, /* disable write cache*/ + kATAEnableReadAhead = 0xAA /* Read look-ahead enable*/ +}; + +// revisit the opcode enumerations. + +////////////////////// + + +/* task file for ata */ +typedef struct ataTaskFile { + + UInt8 ataTFFeatures; /* <-> Error(R) or ataTFFeatures(W) register image */ + UInt8 ataTFCount; /* <-> Sector count/remaining */ + UInt8 ataTFSector; /* <-> Sector start/finish */ + UInt8 ataTFCylLo; /* <-> ataTFCylLo */ + UInt8 ataTFCylHigh; /* <-> ataTFCylHigh */ + UInt8 ataTFSDH; /* <-> ataTFSDH register image*/ + UInt8 ataTFCommand; /* <-> Status(R) or Command(W) register image */ + +} ataTaskFile; + + +typedef struct ataRegisterImage { + + ataTaskFile taskFile; + UInt16 ataDataRegister; /* <-> Data register. */ + UInt8 ataAltSDevCReg; /* <->: Alternate status(R) or Device Control(W) register image*/ + +} ataRegisterImage ; + + +typedef struct ATAPICmdPacket{ + + UInt16 atapiPacketSize; /* Size of command packet in bytes */ + UInt16 atapiCommandByte[8]; /* The command packet itself*/ + +}ATAPICmdPacket; + + + +// Error and result codes: TBD +enum { + kATAErrUnknownType = -1, + kATANoErr = 0, + kATAQueueEmpty = 1, + kATAUnknownOpcode, + kATATimeoutErr, + kATAInvalidDevID, + kATAErrDevBusy, + kATAModeNotSupported, + kATADevIntNoCmd, + kATADeviceError, + kATADMAErr +}; + + +#endif /* !_IOATATYPES_H */ diff --git a/QualcommWireless/include/IOKit/ata/IOPCIATA.h b/QualcommWireless/include/IOKit/ata/IOPCIATA.h new file mode 100644 index 0000000..62067b2 --- /dev/null +++ b/QualcommWireless/include/IOKit/ata/IOPCIATA.h @@ -0,0 +1,200 @@ +/* + * Copyright (c) 1998-2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _DRV_PCI_ATA_H +#define _DRV_PCI_ATA_H + +#include +#include +#include "IOATAController.h" +#include +#include + +#include + +/*! @class IOPCIATA + @abstract The base class for PCI-IDE ata controller family. + @discussion class defining the common elements of bus-mastering PCI ATA controllers which meet or at least loosely follow the pci bus mastering pci-ide controller spec. Header doc is incomplete, but source is heavily commented. + +*/ + + + +class IOPCIATA : public IOATAController +{ + OSDeclareDefaultStructors(IOPCIATA); + +public: + + /*--- Overrides from IOATAController ---*/ + virtual bool init(OSDictionary * properties); + virtual bool start( IOService* provider ); + +protected: + + // The DMA states: not in use, in use and running with additional passes needed, + // in use on final pass, transfer complete, and failure + enum ATADMAState + { + // DMA state flags + kATADMAInactive, + kATADMAStarting, + kATADMAActive, + kATADMAStatus, + kATADMAComplete, + kATADMAError, + + }; + + enum { + // PRD flags + kLast_PRD = 0x8000, + kContinue_PRD = 0, + + }; + + + enum { + mBMCmdStartOutput = 0x01, // start engine to transfer from memory to device. + mBMCmdStartInput = (1 << 3 ) | 0x01, // start engine to transfer from device to memory + mBMCmdStop = 0x00, // halt engine. + }; + + enum { + // bus master status register definitions. + bBMStatusSimplex = 7, // 0 = simultaneous transactions allowed. 1 = primary and secondary busses may not be active at same time. + bBMStatusDrv1 = 6, // 1 = device 1 and bus are already configured by some other software/firmware + bBMStatusDrv0 = 5, // 1 = device 0 and bus are already configured by some other software/firmware + bBMStatusInt = 2, // 1 = device has asserted INTRQ and all data is flushed to/from memory. + bBMStatusError = 1, // 1 = an error in the DMA has occured. Software clears by writing 1 to this bit. + bBMStatusActive = 0, // 1 = DMA engine is active. + }; + + enum{ + + mBMStatusSimplex = 1 << 7, + mBMStatusDrv1 = 1 << 6, + mBMStatusDrv0 = 1 << 5, + mBMStatusInt = 1 << 2, + mBMStatusError = 1 << 1, + mBMStatusActive = 1 + }; + + // the physical region descriptor used for the dma engine. + struct PRD + { + UInt32 bufferPtr; // address + UInt16 byteCount; // 16 bit byte count where 0x0000 = 64K + UInt16 flags; // 0 in flags means contine, 0x80 means stop + }; + + + // descendants of this class MUST initialize these values + // prior to activating any DMA command. + IOATARegPtr8 _bmCommandReg; + IOATARegPtr8 _bmStatusReg; + IOATARegPtr32 _bmPRDAddresReg; + + // semaphore for DMA state + UInt32 _dmaState; + + // table of PRD descriptors + PRD* _prdTable; + IOPhysicalAddress _prdTablePhysical; + + IONaturalMemoryCursor* _DMACursor; + + // override from IOATAController + // activate the DMA engine as per the current command + virtual IOReturn startDMA( void ); + + // override from IOATAController + // safely halt the DMA engine regardless of state + virtual IOReturn stopDMA( void ); + + // allocate memory for the PRD descriptors. + virtual bool allocDMAChannel(void); + + // fill CC with stop commands. + virtual void initATADMAChains (PRD* descPtr); + + // fill out a PRD, respecting endianess + virtual void setPRD(UInt8 *bffr, UInt16 count, PRD *tableElement, UInt16 end); + + // setup the CC with IO commands + virtual IOReturn createChannelCommands(void); + + // deallocate memory for the DMA engine + virtual bool freeDMAChannel(void); + + // clean up on device interrupt + virtual IOReturn handleDeviceInterrupt(void); + + // activate the DMA engine + virtual void activateDMAEngine(void); + + // shutdown the DMA engine + virtual void stopDMAEngine(void); + + // safely suspend the DMA engine + virtual void shutDownATADMA (void); + + // overrides + virtual void free(); +protected: +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the IOPCIATA class in the future. + */ + typedef struct ExpansionData + { + IOBufferMemoryDescriptor* _prdBuffer; + } ExpansionData; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + +private: + OSMetaClassDeclareReservedUnused(IOPCIATA, 0); + OSMetaClassDeclareReservedUnused(IOPCIATA, 1); + OSMetaClassDeclareReservedUnused(IOPCIATA, 2); + OSMetaClassDeclareReservedUnused(IOPCIATA, 3); + OSMetaClassDeclareReservedUnused(IOPCIATA, 4); + OSMetaClassDeclareReservedUnused(IOPCIATA, 5); + OSMetaClassDeclareReservedUnused(IOPCIATA, 6); + OSMetaClassDeclareReservedUnused(IOPCIATA, 7); + OSMetaClassDeclareReservedUnused(IOPCIATA, 8); + OSMetaClassDeclareReservedUnused(IOPCIATA, 9); + OSMetaClassDeclareReservedUnused(IOPCIATA, 10); + OSMetaClassDeclareReservedUnused(IOPCIATA, 11); + OSMetaClassDeclareReservedUnused(IOPCIATA, 12); + OSMetaClassDeclareReservedUnused(IOPCIATA, 13); + OSMetaClassDeclareReservedUnused(IOPCIATA, 14); + OSMetaClassDeclareReservedUnused(IOPCIATA, 15); + OSMetaClassDeclareReservedUnused(IOPCIATA, 16); + OSMetaClassDeclareReservedUnused(IOPCIATA, 17); + OSMetaClassDeclareReservedUnused(IOPCIATA, 18); + OSMetaClassDeclareReservedUnused(IOPCIATA, 19); + OSMetaClassDeclareReservedUnused(IOPCIATA, 20); +}; + +#endif // _DRV_PCI_ATA_H diff --git a/QualcommWireless/include/IOKit/audio/BigNum128.h b/QualcommWireless/include/IOKit/audio/BigNum128.h new file mode 100644 index 0000000..ebeaba9 --- /dev/null +++ b/QualcommWireless/include/IOKit/audio/BigNum128.h @@ -0,0 +1,154 @@ +/* + * Copyright (c) 1998-2012 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef __BIGNUM128_H__ +#define __BIGNUM128_H__ + +#include +#include + +class U128 +{ +public: + U128(uint64_t _lo = 0) : lo(_lo), hi(0) { }; + U128(uint64_t _hi, uint64_t _lo) : lo(_lo), hi(_hi) { }; + inline bool operator==( const U128 &A ) const { return ( A.hi == hi ) && ( A.lo == lo ); } + inline bool operator>( const U128 &A ) const { return ( ( A.hi > hi ) || ( ( A.hi == hi ) && ( A.lo > lo ) ) ); } + inline bool operator<( const U128 &A ) const { return !( ( A.hi > hi ) || ( ( A.hi == hi ) && ( A.lo > lo ) ) ); } + + U128 operator++( int ) + { + if ( ++lo==0 ) + hi++; + + return *this; + } + + U128 operator--( int ) + { + if ( 0 == lo-- ) + { + hi--; + } + return *this; + } + + U128& operator=( const U128 &A ) + { + hi = A.hi; + lo = A.lo; + + return *this; + } + + U128 operator+( const U128 &A ) const + { + U128 result(A.hi + hi, A.lo + lo); + + if ( ( result.lo < A.lo ) || ( result.lo < lo ) ) + { + result.hi++; + } + + return result; + } + + U128& operator+=( const U128 &A ) + { + U128 result(A.hi + hi, A.lo + lo); + + if ( ( result.lo < A.lo ) || ( result.lo < lo ) ) + { + result.hi++; + } + + *this = result; + + return *this; + } + + friend U128 operator-( const U128 &A, const U128 &B ) // assumes A >= B + { + U128 C = A; + + C.hi -= B.hi; + C.lo -= B.lo; + + if ( C.lo > A.lo ) // borrow ? + { + C.hi--; + } + + return C; + } + + + friend U128 operator<<( const U128& A, int n ) + { + U128 res = A; + + while ( n-- ) + { + res.hi <<= 1; + res.hi |= ( ( res.lo & MSB64 ) ? 1 : 0 ); + res.lo <<= 1; + } + + return res; + } + + friend U128 operator>>( const U128& A, int n ) + { + U128 res = A; + + while ( n-- ) + { + res.lo >>= 1; + res.lo |= ( ( res.hi & 0x1 ) ? MSB64 : 0 ); + res.hi >>= 1; + } + + return res; + } + +public: + +#ifdef __BIG_ENDIAN__ + uint64_t hi; + uint64_t lo; +#else + uint64_t lo; + uint64_t hi; +#endif + +private: + enum { MSB64 = 0x8000000000000000ULL }; +}; + +extern U128 UInt64mult(const uint64_t A, const uint64_t B); + +#endif //__BIGNUM128_H__ + + + + + diff --git a/QualcommWireless/include/IOKit/audio/IOAudioBlitterLibDispatch.h b/QualcommWireless/include/IOKit/audio/IOAudioBlitterLibDispatch.h new file mode 100644 index 0000000..08293e2 --- /dev/null +++ b/QualcommWireless/include/IOKit/audio/IOAudioBlitterLibDispatch.h @@ -0,0 +1,235 @@ +/* Copyright: © Copyright 2011 Apple Computer, Inc. All rights reserved. + + Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. + ("Apple") in consideration of your agreement to the following terms, and your + use, installation, modification or redistribution of this Apple software + constitutes acceptance of these terms. If you do not agree with these terms, + please do not use, install, modify or redistribute this Apple software. + + In consideration of your agreement to abide by the following terms, and subject + to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs + copyrights in this original Apple software (the "Apple Software"), to use, + reproduce, modify and redistribute the Apple Software, with or without + modifications, in source and/or binary forms; provided that if you redistribute + the Apple Software in its entirety and without modifications, you must retain + this notice and the following text and disclaimers in all such redistributions of + the Apple Software. Neither the name, trademarks, service marks or logos of + Apple Computer, Inc. may be used to endorse or promote products derived from the + Apple Software without specific prior written permission from Apple. Except as + expressly stated in this notice, no other rights or licenses, express or implied, + are granted by Apple herein, including but not limited to any patent rights that + may be infringed by your derivative works or by other works in which the Apple + Software may be incorporated. + + The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED + WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN + COMBINATION WITH YOUR PRODUCTS. + + IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION + OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT + (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +/*! + * @header IOAudioBlitterLibDispatch + */ + +#ifndef __IOAudioBlitterLibDispatch_h__ +#define __IOAudioBlitterLibDispatch_h__ + +#include + + +#pragma mark - +#pragma mark Alternate names + +// Alternate names for the functions below: these explicitly specify the endianness of the integer format instead of "native"/"swap" +#if TARGET_RT_BIG_ENDIAN +#define IOAF_BEInt16ToFloat32 IOAF_NativeInt16ToFloat32 +#define IOAF_LEInt16ToFloat32 IOAF_SwapInt16ToFloat32 +#define IOAF_BEInt24ToFloat32 IOAF_NativeInt24ToFloat32 +#define IOAF_LEInt24ToFloat32 IOAF_SwapInt24ToFloat32 +#define IOAF_BEInt32ToFloat32 IOAF_NativeInt32ToFloat32 +#define IOAF_LEInt32ToFloat32 IOAF_SwapInt32ToFloat32 + +#define IOAF_Float32ToBEInt16 IOAF_Float32ToNativeInt16 +#define IOAF_Float32ToLEInt16 IOAF_Float32ToSwapInt16 +#define IOAF_Float32ToBEInt24 IOAF_Float32ToNativeInt24 +#define IOAF_Float32ToLEInt24 IOAF_Float32ToSwapInt24 +#define IOAF_Float32ToBEInt32 IOAF_Float32ToNativeInt32 +#define IOAF_Float32ToLEInt32 IOAF_Float32ToSwapInt32 +#else +#define IOAF_LEInt16ToFloat32 IOAF_NativeInt16ToFloat32 +#define IOAF_BEInt16ToFloat32 IOAF_SwapInt16ToFloat32 +#define IOAF_LEInt24ToFloat32 IOAF_NativeInt24ToFloat32 +#define IOAF_BEInt24ToFloat32 IOAF_SwapInt24ToFloat32 +#define IOAF_LEInt32ToFloat32 IOAF_NativeInt32ToFloat32 +#define IOAF_BEInt32ToFloat32 IOAF_SwapInt32ToFloat32 + +#define IOAF_Float32ToLEInt16 IOAF_Float32ToNativeInt16 +#define IOAF_Float32ToBEInt16 IOAF_Float32ToSwapInt16 +#define IOAF_Float32ToLEInt24 IOAF_Float32ToNativeInt24 +#define IOAF_Float32ToBEInt24 IOAF_Float32ToSwapInt24 +#define IOAF_Float32ToLEInt32 IOAF_Float32ToNativeInt32 +#define IOAF_Float32ToBEInt32 IOAF_Float32ToSwapInt32 +#endif + +/*! + * @typedef Float32 + * @abstract Convenience type that represent a 32-bit floating point number + */ +typedef float Float32; + +/*! + * @typedef Float64 + * @abstract Convenience type that represent a 64-bit floating point number + */ +typedef double Float64; + +#ifndef __OPEN_SOURCE__ +/*! + * @function IOAF_Int8ToFloat32 + * @abstract Converts 8-bit integer float to 32-bit float + * @param src Pointer to the data to convert + * @param dest Pointer to the converted data + * @param count The number of items to convert + */ +extern void IOAF_Int8ToFloat32( const SInt8 *src, Float32 *dest, unsigned int count ); +#endif + +/*! + * @function IOAF_NativeInt16ToFloat32 + * @abstract Converts native 16-bit integer float to 32-bit float + * @param src Pointer to the data to convert + * @param dest Pointer to the converted data + * @param count The number of items to convert + */ +extern void IOAF_NativeInt16ToFloat32( const SInt16 *src, Float32 *dest, unsigned int count ); + +/*! + * @function IOAF_SwapInt16ToFloat32 + * @abstract Converts non-native 16-bit integer float to 32-bit float + * @param src Pointer to the data to convert + * @param dest Pointer to the converted data + * @param count The number of items to convert + */ +extern void IOAF_SwapInt16ToFloat32( const SInt16 *src, Float32 *dest, unsigned int count ); + +/*! + * @function IOAF_NativeInt24ToFloat32 + * @abstract Converts native 24-bit integer float to 32-bit float + * @param src Pointer to the data to convert + * @param dest Pointer to the converted data + * @param count The number of items to convert + */ +extern void IOAF_NativeInt24ToFloat32( const UInt8 *src, Float32 *dest, unsigned int count ); + +/*! + * @function IOAF_SwapInt24ToFloat32 + * @abstract Converts non-native 24-bit integer float to 32-bit float + * @param src Pointer to the data to convert + * @param dest Pointer to the converted data + * @param count The number of items to convert + */ +extern void IOAF_SwapInt24ToFloat32( const UInt8 *src, Float32 *dest, unsigned int count ); + +/*! + * @function IOAF_NativeInt32ToFloat32 + * @abstract Converts native 32-bit integer float to 32-bit float + * @param src Pointer to the data to convert + * @param dest Pointer to the converted data + * @param count The number of items to convert + */ +extern void IOAF_NativeInt32ToFloat32( const SInt32 *src, Float32 *dest, unsigned int count ); + +/*! + * @function IOAF_SwapInt32ToFloat32 + * @abstract Converts non-native 32-bit integer float to 32-bit float + * @param src Pointer to the data to convert + * @param dest Pointer to the converted data + * @param count The number of items to convert + */ +extern void IOAF_SwapInt32ToFloat32( const SInt32 *src, Float32 *dest, unsigned int count ); + +#ifndef __OPEN_SOURCE__ +/*! + * @function IOAF_Float32ToInt8 + * @abstract Converts 32-bit floating point to 8-bit integer + * @param src Pointer to the data to convert + * @param dest Pointer to the converted data + * @param count The number of items to convert + */ +extern void IOAF_Float32ToInt8( const Float32 *src, SInt8 *dest, unsigned int count ); +#endif + +/*! + * @function IOAF_Float32ToNativeInt16 + * @abstract Converts 32-bit floating point to native 16-bit integer + * @param src Pointer to the data to convert + * @param dest Pointer to the converted data + * @param count The number of items to convert + */ +extern void IOAF_Float32ToNativeInt16( const Float32 *src, SInt16 *dest, unsigned int count ); + +/*! + * @function IOAF_Float32ToSwapInt16 + * @abstract Converts 32-bit floating point to non-native 16-bit integer + * @param src Pointer to the data to convert + * @param dest Pointer to the converted data + * @param count The number of items to convert + */ +extern void IOAF_Float32ToSwapInt16( const Float32 *src, SInt16 *dest, unsigned int count ); + +/*! + * @function IOAF_Float32ToNativeInt24 + * @abstract Converts 32-bit floating point to native 24-bit integer + * @param src Pointer to the data to convert + * @param dest Pointer to the converted data + * @param count The number of items to convert + */ +extern void IOAF_Float32ToNativeInt24( const Float32 *src, UInt8 *dest, unsigned int count ); + +/*! + * @function IOAF_Float32ToSwapInt24 + * @abstract Converts 32-bit floating point to non-native 24-bit integer + * @param src Pointer to the data to convert + * @param dest Pointer to the converted data + * @param count The number of items to convert + */ +extern void IOAF_Float32ToSwapInt24( const Float32 *src, UInt8 *dest, unsigned int count ); + +/*! + * @function IOAF_Float32ToNativeInt32 + * @abstract Converts 32-bit floating point to native 32-bit integer + * @param src Pointer to the data to convert + * @param dest Pointer to the converted data + * @param count The number of items to convert + */ +extern void IOAF_Float32ToNativeInt32( const Float32 *src, SInt32 *dest, unsigned int count ); + +/*! + * @function IOAF_Float32ToSwapInt32 + * @abstract Converts 32-bit floating point to non-native 32-bit integer + * @param src Pointer to the data to convert + * @param dest Pointer to the converted data + * @param count The number of items to convert + */ +extern void IOAF_Float32ToSwapInt32( const Float32 *src, SInt32 *dest, unsigned int count ); + +/*! + * @function IOAF_bcopy_WriteCombine + * @abstract An efficient bcopy from "write combine" memory to regular memory. It is safe to assume that all memory has been copied when the function has completed + * @param src Pointer to the data to convert + * @param dest Pointer to the converted data + * @param count The number of items to convert + */ +extern void IOAF_bcopy_WriteCombine(const void *src, void *dest, unsigned int count ); + +#endif // __IOAudioBlitterLibDispatch_h__ diff --git a/QualcommWireless/include/IOKit/audio/IOAudioControl.h b/QualcommWireless/include/IOKit/audio/IOAudioControl.h new file mode 100644 index 0000000..3063cfc --- /dev/null +++ b/QualcommWireless/include/IOKit/audio/IOAudioControl.h @@ -0,0 +1,600 @@ +/* + * Copyright (c) 1998-2014 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOAUDIOCONTROL_H +#define _IOKIT_IOAUDIOCONTROL_H + +#include +#include +#ifndef IOAUDIOFAMILY_SELF_BUILD +#include +#else +#include "IOAudioEngine.h" +#endif + +class IOAudioPort; +class OSDictionary; +class OSSet; +class IOAudioUserClient; +class IOAudioControlUserClient; +class IOWorkLoop; +class IOCommandGate; + +/*! + * @class IOAudioControl + * @abstract Represents any controllable attribute of an IOAudioDevice. + * @discussion An IOAudioControl instance may belong to one IOAudioPort. Additionally, it may associated + * with an IOAudioEngine as a default control for that IOAudioEngine. + * + * When its value changes, it sends a notification to the CoreAudio.framework (HAL). It also makes a call + * to the ValueChangeHandler. + * + * The base IOAudioControl class contains a type, a value and a channel ID representing the channel(s) which + * the control acts on. It may also contain a readable format for the name of the channel as well as a + * control ID that can be used to identify unique controls. Additionally it may contain a subType and a usage. + * Each type has its own set of possible subTypes. There currently four different control types defined: + * kIOAudioControlTypeLevel, kIOAudioControlTypeToggle, kIOAudioControlTypeSelector. + * Each one is represented by a subclass of IOAudioControl: IOAudioLevelControl, IOAudioToggleControl, + * IOAudioSelectorControl. The level control defines a range of allowed values and has + * a defined subtype of kIOAudioLevelControlSubTypeVolume used to define a volume control. The toggle control + * allows for a boolean value and has a defined subtype kIOAudioToggleControlSubTypeMute for a mute control. The + * selector control has a list of allowed selections with a value and description for each allowed selection and + * has the following sub types: kIOAudioSelectorControlSubTypeOutput for an output selector and + * kIOAudioSelectorControlSubTypeInput for an input selector. See the subclass documentation for a more + * complete description of each + * + * There are enums for default channel ID values and common channel names in IOAudioTypes.h. The channel ID + * values are prefixed with 'kIOAudioControlChannelID' and the common channel names are prefixed with + * 'kIOAudioControlChannelName'. All of the attributes of the IOAudioControl are stored in the registry. + * The key used for each attribute is defined in IOAudioTypes.h with the define matching the following + * pattern: 'kIOAudioControlKey'. For example: kIOAudioControlChannelIDKey. + * + * In addition to the existing defined control types, drivers can define their own as well for other purposes. + * + * Changes to the IOAudioControl's value made by the CoreAudio.framework are done through the IORegistry. + * When the CoreAudio.framework initiates a value change, the control receives a setProperties() message. + * The setProperties() implementation looks for the property 'IOAudioControlValue' and if present, calls + * setValue() on the driver's IOWorkLoop with the new value. The setValue() function first checks to see + * if the new value is different. If so, it calls performValueChange() to call through to the driver + * to make the change in the hardware. If that call succeeds the value is changed and the new value is set + * in the registry. Additionally notifications are sent to all clients that have registered for them. + */ +class IOAudioControl : public IOService +{ + friend class IOAudioPort; + friend class IOAudioDevice; + friend class IOAudioEngine; + + OSDeclareDefaultStructors(IOAudioControl) + +public: + + /*! + * @typedef IntValueChangeHandler + * @abstract Handler function used to make a notification when a value is to be changed. + * @param target Reference supplied when the handler was registered. + * @param audioControl The IOAudioControl that is changing. + * @param oldValue The old value of the control. + * @param newValue The new value the control is being changed to. + * @result Must return kIOReturnSuccess when the hardware is successfully updated. + */ + typedef IOReturn (*IntValueChangeHandler)(OSObject *target, IOAudioControl *audioControl, SInt32 oldValue, SInt32 newValue ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + typedef IOReturn (*DataValueChangeHandler)(OSObject *target, IOAudioControl *audioControl, const void *oldData, UInt32 oldDataSize, const void *newData, UInt32 newDataSize ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + typedef IOReturn (*ObjectValueChangeHandler)(OSObject *target, IOAudioControl *audioControl, OSObject *oldValue, OSObject *newValue ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + +protected: + /*! @var workLoop + The IOWorkLoop for the audio driver - shared from the IOAudioDevice. + */ + IOWorkLoop *workLoop; + /*! @var commandGate + The IOCommandGate for this control - attached to the driver's IOWorkLoop. + */ + IOCommandGate *commandGate; + + /*! @var isStarted + Internal state keeping track of when the IOAudioControl has been started. + */ + bool isStarted; + + /*! @var controlID + An optional identifier that can be used to identify the control. + */ + UInt32 controlID; + /*! @var channelID + The ID of the channel this control affects - may be kIOAudioControlChannelIDAll if it represents all channels. + */ + UInt32 channelID; + + UInt32 type; + UInt32 subType; + UInt32 usage; + + OSObject *value; + + typedef enum { + kIntValueChangeHandler, + kDataValueChangeHandler, + kObjectValueChangeHandler + } ValueChangeHandlerType; + + ValueChangeHandlerType valueChangeHandlerType; + + union { + IntValueChangeHandler intHandler; + DataValueChangeHandler dataHandler; + ObjectValueChangeHandler objectHandler; + } valueChangeHandler; + + OSObject *valueChangeTarget; + + /*! @var clients + A list of user clients that have requested value change notifications. + */ + OSSet *userClients; + +protected: + struct ExpansionData { + IOAudioEngine * providerEngine; + OSArray * notificationQueue; + UInt32 commandGateStatus; // + SInt32 commandGateUsage; // + }; + + ExpansionData *reserved; + +public: + // OSMetaClassDeclareReservedUsed(IOAudioControl, 0); + virtual void sendChangeNotification(UInt32 notificationType ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + // OSMetaClassDeclareReservedUsed(IOAudioControl, 1); + /*! + * @function setReadOnlyFlag + * @abstract Call this function to say that a control is read only. + * This call cannot be undone, so if a control is only temporarily unsetable, + * do not use this call but instead return an error from the control handler. + */ + virtual void setReadOnlyFlag( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + // OSMetaClassDeclareReservedUsed(IOAudioControl, 2); + virtual void sendQueuedNotifications(void ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + // OSMetaClassDeclareReservedUsed(IOAudioControl, 3); + /*! + * @function createUserClient + * @abstract Creates a new IOAudioControlUserClient instance. + * @discussion This function is called by newUserClient() to create a new IOAudioControlUserClient instance. This function may be overridden by subclasses that need to add functionality + * to the IOAudioControlUserClient. In that case, they must subclass IOAudioControlUserClient + * and return a new, initialized instance of that subclass. + * A derived class that requires overriding of createUserClient should override the version with the properties + * parameter for Intel targets, and without the properties parameter for PPC targets. The #if __i386__ directive + * can be used to select between the two behaviors. + * @param task The task requesting the new user client. + * @param securityID Optional security paramater passed in by the client - ignored. + * @param type Optional user client type passed in by the client. + * @param newUserClient The IOAudioControlUserClient * must be stored in this param on a successful + * completion. + * @param properties A dictionary of additional properties for the connection. + * @result Returns kIOReturnSuccess on success. + */ + virtual IOReturn createUserClient(task_t task, void *securityID, UInt32 taskType, IOAudioControlUserClient **newUserClient, OSDictionary *properties) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + +private: + OSMetaClassDeclareReservedUsed(IOAudioControl, 0); + OSMetaClassDeclareReservedUsed(IOAudioControl, 1); + OSMetaClassDeclareReservedUsed(IOAudioControl, 2); + OSMetaClassDeclareReservedUsed(IOAudioControl, 3); + + OSMetaClassDeclareReservedUnused(IOAudioControl, 4); + OSMetaClassDeclareReservedUnused(IOAudioControl, 5); + OSMetaClassDeclareReservedUnused(IOAudioControl, 6); + OSMetaClassDeclareReservedUnused(IOAudioControl, 7); + OSMetaClassDeclareReservedUnused(IOAudioControl, 8); + OSMetaClassDeclareReservedUnused(IOAudioControl, 9); + OSMetaClassDeclareReservedUnused(IOAudioControl, 10); + OSMetaClassDeclareReservedUnused(IOAudioControl, 11); + OSMetaClassDeclareReservedUnused(IOAudioControl, 12); + OSMetaClassDeclareReservedUnused(IOAudioControl, 13); + OSMetaClassDeclareReservedUnused(IOAudioControl, 14); + OSMetaClassDeclareReservedUnused(IOAudioControl, 15); + OSMetaClassDeclareReservedUnused(IOAudioControl, 16); + OSMetaClassDeclareReservedUnused(IOAudioControl, 17); + OSMetaClassDeclareReservedUnused(IOAudioControl, 18); + OSMetaClassDeclareReservedUnused(IOAudioControl, 19); + OSMetaClassDeclareReservedUnused(IOAudioControl, 20); + OSMetaClassDeclareReservedUnused(IOAudioControl, 21); + OSMetaClassDeclareReservedUnused(IOAudioControl, 22); + OSMetaClassDeclareReservedUnused(IOAudioControl, 23); + +public: + + /*! + * @function withAttributes + * @abstract Static function that allocates a new IOAudioControl with the given attributes. + * @param type The type of the control. Common, known types are defined in IOAudioTypes.h. They currently + * consist of kIOAudioControlTypeLevel, kIOAudioControlTypeToggle, kIOAudioControlTypeSelector. + * @param channelID The ID of the channel(s) that the control acts on. Common IDs are located in IOAudioTypes.h. + * @param channelName An optional name for the channel. Common names are located in IOAudioDefines.h. Any name not + * defined in IOAudioDefines.h must be localized in order to be properly displayed in multiple languages. + * @param cntrlID An optional ID for the control that can be used to uniquely identify controls + * @param subType An optional subType specific to the given type + * @param usage An optional value specifying how the control will be used. Currently defined usages are kIOAudioControlUsageInput, + * kIOAudioControlUsageOutput and kIOAudioControlUsagePassThru. This value is used when a control is set as a default control + * on an IOAudioEngine. + * @result Returns a newly allocated and initialized IOAudioControl. + */ + static IOAudioControl *withAttributes(UInt32 type, + OSObject *initialValue, + UInt32 channelID, + const char *channelName = 0, + UInt32 cntrlID = 0, + UInt32 subType = 0, + UInt32 usage = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10 ; + + /*! + * @function init + * @abstract Initializes a newly allocated IOAudioControl with the given attributes. + * @param type The type of the control. Common, known types are defined in IOAudioTypes.h. They currently + * consist of kIOAudioControlTypeLevel, kIOAudioControlTypeToggle, kIOAudioControlTypeSelector. + * @param channelID The ID of the channel(s) that the control acts on. Common IDs are located in IOAudioTypes.h. + * @param channelName An optional name for the channel. Common names are located in IOAudioDefines.h. Any name not + * defined in IOAudioDefines.h must be localized in order to be properly displayed in multiple languages. + * @param cntrlID An optional ID for the control that can be used to uniquely identify controls + * @param subType An optional subType specific to the given type + * @param usage An optional value specifying how the control will be used. Currently defined usages are kIOAudioControlUsageInput, + * kIOAudioControlUsageOutput and kIOAudioControlUsagePassThru. This value is used when a control is set as a default control + * on an IOAudioEngine. + * @param properties Standard property list passed to the init() function of any new IOService. This dictionary + * gets stored in the registry entry for this instance. + * @result Returns true on success. + */ + virtual bool init(UInt32 type, + OSObject *initialValue, + UInt32 channelID, + const char *channelName = 0, + UInt32 cntrlID = 0, + UInt32 subType = 0, + UInt32 usage = 0, + OSDictionary *properties = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10 ; + + /*! + * @function free + * @abstract Frees all of the resources allocated by the IOAudioControl. + * @discussion Do not call this directly. This is called automatically by the system when the instance's + * refcount goes to 0. To decrement the refcount, call release() on the object. + */ + virtual void free( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function start + * @abstract Starts a newly created IOAudioControl. + * @discussion This is called automatically by IOAudioPort when addAudioControl() is called or by IOAudioEngine + * when addDefaultAudioControl() is called. It will only be called by the first call to either addAudioControl() or + * addDefaultAudioControl(). + * @param provider The IOAudioPort or IOAudioEngine that owns this control. + * @result Returns true on success. + */ + virtual bool start(IOService *provider) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual bool attachAndStart(IOService *provider) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function getIsStarted + * @abstract Returns true after start() has been called. + * @discussion Used by IOAudioPort and IOAudioEngine to decide if the control needs to be started. + */ + virtual bool getIsStarted() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function stop + * @abstract Stops the control when the provider is going away. + * @param provider The IOAudioPort or IOAudioEngine that owns this control. + */ + virtual void stop(IOService *provider) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function getWorkLoop + * @abstract Returns the IOWorkLoop for the whole audio driver. + */ + virtual IOWorkLoop *getWorkLoop() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function getCommandGate + * @abstract Returns the IOCommandGate for this IOAudioControl. + */ + virtual IOCommandGate *getCommandGate() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10 ; + + /*! + * @function newUserClient + * @abstract Creates a new user client object for this IOAudioControl instance. + * @discussion This is called automatically by I/O Kit when a user process opens a connection to this + * IOAudioControl. This is typically done when the user process needs to register for value change + * notifications. This implementation allocates a new IOAudioControlUserClient object. There is no + * need to call this directly. + * A derived class that requires overriding of newUserClient should override the version with the properties + * parameter for Intel targets, and without the properties parameter for PPC targets. The #if __i386__ directive + * can be used to select between the two behaviors. + * @param task The task requesting the new user client. + * @param securityID Optional security paramater passed in by the client - ignored. + * @param type Optional user client type passed in by the client - 0 for the default user client type. + * @param handler The new IOUserClient * must be stored in this param on a successful completion. + * @param properties A dictionary of additional properties for the connection. + * @result Returns kIOReturnSuccess on success. May also result kIOReturnError or kIOReturnNoMemory. + */ + virtual IOReturn newUserClient(task_t task, void *securityID, UInt32 type, IOUserClient **handler) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn newUserClient(task_t task, void *securityID, UInt32 type, OSDictionary *properties, IOUserClient **handler) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function createUserClient + * @abstract Creates a new IOAudioControlUserClient instance. + * @discussion This function is called by newUserClient() to create a new IOAudioControlUserClient instance. This function may be overridden by subclasses that need to add functionality + * to the IOAudioControlUserClient. In that case, they must subclass IOAudioControlUserClient + * and return a new, initialized instance of that subclass. + * A derived class that requires overriding of createUserClient should override the version with the properties + * parameter for Intel targets, and without the properties parameter for PPC targets. The #if __i386__ directive + * can be used to select between the two behaviors. + * @param task The task requesting the new user client. + * @param securityID Optional security paramater passed in by the client - ignored. + * @param type Optional user client type passed in by the client. + * @param newUserClient The IOAudioControlUserClient * must be stored in this param on a successful + * completion. + * @result Returns kIOReturnSuccess on success. + */ + virtual IOReturn createUserClient(task_t task, void *securityID, UInt32 type, IOAudioControlUserClient **newUserClient) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10 ; + + /*! + * @function clientClosed + * @abstract Called automatically by the IOAudioControlUserClient when a user client closes its + * connection to the control. + * @param client The user client object that has disconnected. + */ + virtual void clientClosed(IOAudioControlUserClient *client) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function setProperties + * @abstract Changes a property of this IOService. + * @discussion This is called when the user client changes a property of this + * IOAudioControl. In this case it is used to change the value. This function + * looks for that property and then calls setValue() through the IOCommandGate and + * setValueAction(). + * @param properties An OSDictionary containing the properties to change. + * @result Returns kIOReturnSuccess on success. + */ + virtual IOReturn setProperties(OSObject *properties) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void setValueChangeHandler(IntValueChangeHandler intValueChangeHandler, OSObject *target) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void setValueChangeHandler(DataValueChangeHandler dataValueChangeHandler, OSObject *target) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void setValueChangeHandler(ObjectValueChangeHandler objectValueChangeHandler, OSObject *target) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void setValueChangeTarget(OSObject *target) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function flushValue + * @abstract Forces the control to be flushed out to the hardware. + * @discussion This function calls performValueChange() directly with the current value of the IOAudioControl. + * @result Returns the result of performValueChange() - kIOReturnSuccess on success. + */ + virtual IOReturn flushValue() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function setValueAction + * @abstract IOCommandGate Action which calls setValue() while holding the IOCommandGate. + * @discussion This is needed to allow setValue() to be called on the IOWorkLoop. + * @param owner The owner of the IOCommandGate (the IOAudioControl in this case). + * @param arg1 The new value for the IOAudioControl. + * @result Returns the result of setValue() - kIOReturnSuccess on success. + */ + static IOReturn setValueAction(OSObject *owner, void *arg1, void *arg2, void *arg3, void *arg4) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + static IOReturn _setValueAction(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; // + + /*! + * @function setValue + * @abstract Sets the value for this control. + * @discussion When the control's value is changed, a call is made to performValueChange(). If that call + * succeeds, the value is set and sendValueChangeNotification() is called to send a notification to the + * user clients. This function must be called on the IOWorkLoop. + * @param newValue The new value for this control. + * @result Returns kIOReturnSuccess if the value is successfully set. + */ + virtual IOReturn setValue(OSObject *newValue ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOReturn setValue(SInt32 intValue ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function hardwareValueChanged + * @abstract Updates the value for this control and sends out the value changed notification. + * @discussion This is designed to be called by the driver when it detects that the hardware's value has + * changed without driver intervention (e.g. when an external event causes the change). The difference between + * hardwareValueChanged() and setValue() is that hardwareValueChanged() doesn't call performValueChange() which + * sends a message back to the driver to cause it to change the hardware with the new value. This function must + * be called on the IOWorkLoop. + * @param newValue The new value for this control. + * @result Returns kIOReturnSuccess if the value is successfully updated. + */ + virtual IOReturn hardwareValueChanged(OSObject *newValue ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function getValue + * @abstract Returns the current value of the control. + */ + virtual OSObject *getValue( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual SInt32 getIntValue( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual const void *getDataBytes( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual UInt32 getDataLength( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function getControlID + * @abstract Returns the control ID for the control. + */ + virtual UInt32 getControlID( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function getChannelID + * @abstract Returns the channel ID for the control. + */ + virtual UInt32 getChannelID( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual UInt32 getType( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual UInt32 getSubType( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual UInt32 getUsage( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void setCoreAudioPropertyID(UInt32 propertyID ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + void setWorkLoop(IOWorkLoop *wl ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + +protected: + /*! + * @function sendValueChangeNotification + * @abstract Called when the value has changed for the control. + * @discussion This function sends out the value change notification to the user clients. + */ + virtual void sendValueChangeNotification( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function setChannelName + * @abstract Called at init time to set the channel name for this IOAudioControl. + */ + virtual void setChannelName(const char *channelName ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function setChannelID + * @abstract Called at init time to set the channel ID for this IOAudioControl. + */ + virtual void setChannelID(UInt32 newChannelID ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void setChannelNumber(SInt32 channelNumber ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function setSubType + * @abstract Called at init time to set the control subType. + */ + virtual void setType(UInt32 type ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function setType + * @abstract Called at init time to set the control type. + */ + virtual void setSubType(UInt32 subType ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function setUsage + * @abstract Called at init time to set the control usage. + */ + virtual void setUsage(UInt32 usage ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function setControlID + * @abstract Sets the controlID for this control. + * @discussion The control ID is an optional attribute that can be used to track IOAudioControls. A typical + * use is for the IOAudioDevice to assign a unique controlID to each control that it creates and then + * do a switch statement on the id of the control when it gets an audioControlValueChanged() notification. + * Typically the control ID is set when the object is created and doesn't need to be called again. + * @param cntrlID The control ID for the control. + */ + virtual void setControlID(UInt32 cntrlID ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function validateValue + * @abstract Called by setValue() to verify that the value is valid. + * @param newValue The new value to be verified. + * @result Returns kIOReturnSuccess if the value is valid. + */ + virtual IOReturn validateValue(OSObject *newValue ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function updateValue + * @abstract Called by setValue() in order to update the value and the registry. + * @discussion It also calls + * sendValueChangedNotification() to send notifications to the user clients. + * @param newValue The new value to b updated. + * @result Returns kIOReturnSuccess if the value is successfully updated. + */ + virtual IOReturn updateValue(OSObject *newValue ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOReturn _setValue(OSObject *newValue ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function performValueChange + * @abstract Called by setValue() to make the call to the valueChangeHandler + * to update the hardware. + * @result Returns the result of the handler call (or kIOReturnError on an error). + */ + virtual IOReturn performValueChange(OSObject *newValue ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function addUserClientAction + * @abstract IOCommandGate Action which calls addUserClient() while holding the IOCommandGate. + * @discussion This is needed to allow addUserClient() to be called on the IOWorkLoop. + * @param owner The owner of the IOCommandGate (the IOAudioControl in this case). + * @param arg1 The IOAudioControlUserClient to be added. + * @result Returns the result of addUserClient() - kIOReturnSuccess on success. + */ + static IOReturn addUserClientAction(OSObject *owner, void *arg1, void *arg2, void *arg3, void *arg4 ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + static IOReturn _addUserClientAction(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3 ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; // + + /*! + * @function removeUserClientAction + * @abstract IOCommandGate Action which calls removeUserClient() while holding the IOCommandGate. + * @discussion This is needed to allow removeUserClient() to be called on the IOWorkLoop. + * @param owner The owner of the IOCommandGate (the IOAudioControl in this case). + * @param arg1 The IOAudioControlUserClient to be removed. + * @result Returns the result of removeUserClient() - kIOReturnSuccess on success. + */ + static IOReturn removeUserClientAction(OSObject *owner, void *arg1, void *arg2, void *arg3, void *arg4 ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + static IOReturn _removeUserClientAction(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3 ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; // + + /*! + * @function detachUserClientsAction + */ + static IOReturn detachUserClientsAction(OSObject *owner, void *arg1, void *arg2, void *arg3, void *arg4 ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function addUserClient + * @abstract Called on the IOWorkLoop to add a new IOAudioControlUserClient. + * @discussion There is no need to call this directly. It is called on the workLoop + * by newUserClient() through addUserClientAction(). + * @param newUserClient The IOAudioControlUserClientto be added. + * @result Returns kIOReturnSuccess on success. + */ + virtual IOReturn addUserClient(IOAudioControlUserClient *newUserClient ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function removeUserClient + * @abstract Called on the IOWorkLoop to remove an IOAudioControlUserClient. + * @discussion This is called on the IOWorkLoop by clientClosed() through + * removeUserClientAction() when the user client is going away. It should + * not be called directly. + * @param userClient The IOAudioControlUserClient to be removed. + * @result Returns kIOReturnSuccess on success. + */ + virtual IOReturn removeUserClient(IOAudioControlUserClient *userClient ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOReturn detachUserClients( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + static void setCommandGateUsage(IOAudioControl *control, bool increment ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; // + +}; + +#endif /* _IOKIT_IOAUDIOCONTROL_H */ + diff --git a/QualcommWireless/include/IOKit/audio/IOAudioControlUserClient.h b/QualcommWireless/include/IOKit/audio/IOAudioControlUserClient.h new file mode 100644 index 0000000..c4afaf8 --- /dev/null +++ b/QualcommWireless/include/IOKit/audio/IOAudioControlUserClient.h @@ -0,0 +1,91 @@ +/* + * Copyright (c) 1998-2014 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOAUDIOCONTROLUSERCLIENT_H +#define _IOKIT_IOAUDIOCONTROLUSERCLIENT_H + +#include +#include + +#ifndef IOAUDIOFAMILY_SELF_BUILD +#include +#else +#include "IOAudioTypes.h" +#endif + +class IOAudioControl; + +class IOAudioControlUserClient : public IOUserClient +{ + OSDeclareDefaultStructors(IOAudioControlUserClient) + +protected: + task_t clientTask; + IOAudioControl * audioControl; + IOAudioNotificationMessage * notificationMessage; + + virtual IOReturn clientClose( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn clientDied( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + +protected: + struct ExpansionData { }; + + ExpansionData *reserved; + +public: + virtual void sendChangeNotification(UInt32 notificationType ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioControlUserClient, 1); + virtual bool initWithAudioControl(IOAudioControl *control, task_t owningTask, void *securityID, UInt32 type, OSDictionary *properties ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + +private: + OSMetaClassDeclareReservedUsed(IOAudioControlUserClient, 0); + OSMetaClassDeclareReservedUsed(IOAudioControlUserClient, 1); + + OSMetaClassDeclareReservedUnused(IOAudioControlUserClient, 2); + OSMetaClassDeclareReservedUnused(IOAudioControlUserClient, 3); + OSMetaClassDeclareReservedUnused(IOAudioControlUserClient, 4); + OSMetaClassDeclareReservedUnused(IOAudioControlUserClient, 5); + OSMetaClassDeclareReservedUnused(IOAudioControlUserClient, 6); + OSMetaClassDeclareReservedUnused(IOAudioControlUserClient, 7); + OSMetaClassDeclareReservedUnused(IOAudioControlUserClient, 8); + OSMetaClassDeclareReservedUnused(IOAudioControlUserClient, 9); + OSMetaClassDeclareReservedUnused(IOAudioControlUserClient, 10); + OSMetaClassDeclareReservedUnused(IOAudioControlUserClient, 11); + OSMetaClassDeclareReservedUnused(IOAudioControlUserClient, 12); + OSMetaClassDeclareReservedUnused(IOAudioControlUserClient, 13); + OSMetaClassDeclareReservedUnused(IOAudioControlUserClient, 14); + OSMetaClassDeclareReservedUnused(IOAudioControlUserClient, 15); + +public: + static IOAudioControlUserClient *withAudioControl(IOAudioControl *control, task_t clientTask, void *securityID, UInt32 type ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + static IOAudioControlUserClient *withAudioControl(IOAudioControl *control, task_t clientTask, void *securityID, UInt32 type, OSDictionary *properties ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual bool initWithAudioControl(IOAudioControl *control, task_t owningTask, void *securityID, UInt32 type ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void free( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOReturn registerNotificationPort(mach_port_t port, UInt32 type, UInt32 refCon ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void sendValueChangeNotification( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; +}; + +#endif /* _IOKIT_IOAUDIOCONTROLUSERCLIENT_H */ diff --git a/QualcommWireless/include/IOKit/audio/IOAudioDebug.h b/QualcommWireless/include/IOKit/audio/IOAudioDebug.h new file mode 100644 index 0000000..e9a728c --- /dev/null +++ b/QualcommWireless/include/IOKit/audio/IOAudioDebug.h @@ -0,0 +1,85 @@ +/* + * Copyright (c) 1998-2014 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOAUDIODEBUG_H +#define _IOAUDIODEBUG_H + +#include +#include + + +#ifdef DEBUG + #define DEBUG_LEVEL 4 // + //#define DEBUG_USE_FIRELOG 1 + #define DEBUG_USE_FIREWIRE_KPRINTF 1 + + #ifdef DEBUG_USE_FIRELOG + #include + #define audioDebugIOLog( level, message... ) \ + do {FireLog( message ); FireLog("\n");} while (0) + #define audioErrorIOLog( message... ) \ + do { FireLog( message ); FireLog("\n"); IOLog( message );} while (0) + #endif + + #ifdef DEBUG_USE_IOUSBLOG + #include + #define audioDebugIOLog( level, message... ) \ + do {USBLog( level, message );} while (0) + #define audioErrorIOLog( level, message... ) \ + do { USBLog( DEBUG_LEVEL_BETA, message ); IOLog( message );} while (0) + #endif + + #ifdef DEBUG_USE_FIREWIRE_KPRINTF + #define audioDebugIOLog( level, message... ) \ + do { if (level <= DEBUG_LEVEL) kprintf( message );} while (0) + #define audioErrorIOLog( message... ) \ + do { kprintf( message ); IOLog( message );} while (0) + #endif + + #ifdef assert + #undef assert + + #define AssertionMessage( cond, file, line ) \ + "assert \"" #cond "\" failed in " #file " at line " #line + + #define AssertionFailed( cond, file, line ) \ + panic(AssertionMessage( cond, file, line )); + + #define assert( cond ) \ + if( !(cond) ) { \ + AssertionFailed( cond, __FILE__, __LINE__ ) \ + } + #endif +#else + #define DEBUG_LEVEL 3 + + #include + #define audioDebugIOLog( level, message... ) \ + do { if ( __builtin_expect(level <= DEBUG_LEVEL, 0) ) { os_log( OS_LOG_DEFAULT, message ); } } while (0) + + #define audioErrorIOLog( message... ) \ + do { os_log_error( OS_LOG_DEFAULT, message ); IOLog( message );} while (0) + +#endif + + +#endif /* _IOAUDIODEBUG_H */ diff --git a/QualcommWireless/include/IOKit/audio/IOAudioDefines.h b/QualcommWireless/include/IOKit/audio/IOAudioDefines.h new file mode 100644 index 0000000..0f8f617 --- /dev/null +++ b/QualcommWireless/include/IOKit/audio/IOAudioDefines.h @@ -0,0 +1,478 @@ +/* + * Copyright (c) 1998-2013 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOAUDIODEFINES_H +#define _IOAUDIODEFINES_H + +#define kIOAudioDeviceClassName "IOAudioDevice" +#define kIOAudioEngineClassName "IOAudioEngine" +#define kIOAudioStreamClassName "IOAudioStream" +#define kIOAudioPortClassName "IOAudioPort" +#define kIOAudioControlClassName "IOAudioControl" + +/*! + * @defined kIOAudioSampleRateKey + * @abstract The key in the IORegistry for the IOAudioEngine sample rate attribute + * @discussion This value is represented as an integer in samples per second. + */ +#define kIOAudioSampleRateKey "IOAudioSampleRate" + +#define kIOAudioSampleRateWholeNumberKey "IOAudioSampleRateWholeNumber" +#define kIOAudioSampleRateFractionKey "IOAudioSampleRateFraction" + + + +/****** + * + * IOAudioDevice defines + * + *****/ + + +/*! + * @defined kIOAudioDeviceNameKey + * @abstract The key in the IORegistry for the IOAudioDevice name attribute. + */ +#define kIOAudioDeviceNameKey "IOAudioDeviceName" + +#define kIOAudioDeviceShortNameKey "IOAudioDeviceShortName" + +/*! + * @defined kIOAudioDeviceManufacturerNameKey + * @abstract The key in the IORegistry for the IOAudioDevice manufacturer name attribute. + */ +#define kIOAudioDeviceManufacturerNameKey "IOAudioDeviceManufacturerName" + +#define kIOAudioDeviceLocalizedBundleKey "IOAudioDeviceLocalizedBundle" + +#define kIOAudioDeviceTransportTypeKey "IOAudioDeviceTransportType" + +#define kIOAudioDeviceConfigurationAppKey "IOAudioDeviceConfigurationApplication" + +#define kIOAudioDeviceCanBeDefaults "IOAudioDeviceCanBeDefaults" + +#define kIOAudioDeviceModelIDKey "IOAudioDeviceModelID" + + +/*! + * @defined kIOAudioDeviceIconName + * @abstract The key in the IORegistry for the IOAudioDevice icon name attribute. + */ +#define kIOAudioDeviceIconNameKey "IOAudioDeviceIconName" + +#define kIOAudioDeviceIconTypeKey "IOAudioDeviceIconType" + +#define kIOAudioDeviceIconSubDirKey "IOAudioDeviceIconSubDir" + +/***** + * + * IOAudioEngine defines + * + *****/ + + + /*! + * @defined kIOAudioEngineStateKey + * @abstract The key in the IORegistry for the IOAudioEngine state atrribute + * @discussion The value for this key may be one of: "Running", "Stopped" or "Paused". Currently the "Paused" + * state is unimplemented. + */ +#define kIOAudioEngineStateKey "IOAudioEngineState" + +/*! + * @defined kIOAudioEngineOutputSampleLatencyKey + * @abstract The key in the IORegistry for the IOAudioEngine output sample latency key + * @discussion + */ +#define kIOAudioEngineOutputSampleLatencyKey "IOAudioEngineOutputSampleLatency" + +/*! + * @defined kIOAudioStreamSampleLatencyKey + * @abstract The key in the IORegistry for the IOAudioStream output sample latency key + * @discussion Tells the HAL how much latency is on a particular stream. If two streams + * on the same engine have different latencies (e.g. one is analog, one is digital), then + * set this property on both streams to inform the HAL of the latency differences. Alternately, + * you can set the engine latency, and just include the latency additional to that for the particular + * stream. The HAL will add the engine and stream latency numbers together to get the total latency. + */ +#define kIOAudioStreamSampleLatencyKey "IOAudioStreamSampleLatency" + +#define kIOAudioEngineInputSampleLatencyKey "IOAudioEngineInputSampleLatency" + +#define kIOAudioEngineSampleOffsetKey "IOAudioEngineSampleOffset" + +#define kIOAudioEngineInputSampleOffsetKey "IOAudioEngineInputSampleOffset" + +#define kIOAudioEngineNumSampleFramesPerBufferKey "IOAudioEngineNumSampleFramesPerBuffer" + +#define kIOAudioEngineCoreAudioPlugInKey "IOAudioEngineCoreAudioPlugIn" + +#define kIOAudioEngineNumActiveUserClientsKey "IOAudioEngineNumActiveUserClients" + +#define kIOAudioEngineUserClientActiveKey "IOAudioEngineUserClientActive" + +#define kIOAudioEngineGlobalUniqueIDKey "IOAudioEngineGlobalUniqueID" + +#define kIOAudioEngineDescriptionKey "IOAudioEngineDescription" + +#define kIOAudioEngineClockIsStableKey "IOAudioEngineClockIsStable" + +#define kIOAudioEngineClockDomainKey "IOAudioEngineClockDomain" + +#define kIOAudioEngineIsHiddenKey "IOAudioEngineIsHidden" + +#define kIOAudioEngineOutputAutoRouteKey "NoAutoRoute" +/*! + * @defined kIOAudioEngineFullChannelNamesKey + * @abstract The key in the IORegistry for the IOAudioEngine's dictionary of fully constructed names for each channel keyed by the device channel + * @discussion + */ +#define kIOAudioEngineFullChannelNamesKey "IOAudioEngineChannelNames" + +/*! + * @defined kIOAudioEngineFullChannelCategoryNamesKey + * @abstract The key in the IORegistry for the IOAudioEngine's dictionary of category names for each channel keyed by the device channel + * @discussion + */ +#define kIOAudioEngineFullChannelCategoryNamesKey "IOAudioEngineChannelCategoryNames" + +/*! + * @defined kIOAudioEngineFullChannelNamesKey + * @abstract The key in the IORegistry for the IOAudioEngine's dictionary of number names for each channel keyed by the device channel + * @discussion + */ +#define kIOAudioEngineFullChannelNumberNamesKey "IOAudioEngineChannelNumberNames" + +#define kIOAudioEngineFullChannelNameKeyInputFormat "InputChannel%u" + +#define kIOAudioEngineFullChannelNameKeyOutputFormat "OutputChannel%u" + +#define kIOAudioEngineFlavorKey "IOAudioEngineFlavor" + +#define kIOAudioEngineAlwaysLoadCoreAudioPlugInKey "IOAudioEngineAlwaysLoadCoreAudioPlugIn" + +/*! + * @defined kIOAudioEngineInputChannelLayoutKey + * @abstract The key in the IORegistry for the IOAudioEngine's dictionary describes an array of OSNumber data that describe the spatial position of each channel. See IOAudioTypes.h. + * @discussion + */ + +#ifndef __OPEN_SOURCE__ +// +#endif +#define kIOAudioEngineInputChannelLayoutKey "IOAudioEngineInputChannelLayout" + +/*! + * @defined kIOAudioEngineOutputChannelLayoutKey + * @abstract The key in the IORegistry for the IOAudioEngine's dictionary describes an array of OSNumber data that describe the spatial position of each channel. See IOAudioTypes.h. + * @discussion + */ + +#ifndef __OPEN_SOURCE__ +// +#endif +#define kIOAudioEngineOutputChannelLayoutKey "IOAudioEngineOutputChannelLayout" + +/*! + * @defined kIOAudioEngineDisableClockBoundsCheck + * @abstract The key in the IORegistry for the IOAudioEngine's dictionary implemented as an OSBoolean that is used to disable the bounds checking on timestamps being passed to the HAL. + * @discussion By using this key and setting the value to true the driver is asserting that it guarantees that all zero timestamps passed to the HAL increment appropriately at the + correct period. This key is used to disable the HAL test that the timestamp is within 1ms of the current time, so that a driver may pass a timestamp that is more than + 1ms in the future. This may be useful when a timestamp is based on a large DMA read/write which encompasses the wrap point but occurs many samples before the end of that point. + */ +#define kIOAudioEngineDisableClockBoundsCheck "IOAudioEngineDisableClockBoundsCheck" + +/***** + * + * IOAudioStream defines + * + *****/ + + +#define kIOAudioStreamIDKey "IOAudioStreamID" +#define kIOAudioStreamDescriptionKey "IOAudioStreamDescription" +#define kIOAudioStreamNumClientsKey "IOAudioStreamNumClients" + +/*! + * @defined kIOAudioStreamDirectionKey + * @abstract The key in the IORegistry for the IOAudioStream direction attribute. + * @discussion The value for this key may be either "Output" or "Input". + */ +#define kIOAudioStreamDirectionKey "IOAudioStreamDirection" + +#define kIOAudioStreamStartingChannelIDKey "IOAudioStreamStartingChannelID" +#define kIOAudioStreamStartingChannelNumberKey "IOAudioStreamStartingChannelNumber" +#define kIOAudioStreamAvailableKey "IOAudioStreamAvailable" + +#define kIOAudioStreamFormatKey "IOAudioStreamFormat" +#define kIOAudioStreamAvailableFormatsKey "IOAudioStreamAvailableFormats" + +#define kIOAudioStreamNumChannelsKey "IOAudioStreamNumChannels" +#define kIOAudioStreamSampleFormatKey "IOAudioStreamSampleFormat" + +#define kIOAudioStreamNumericRepresentationKey "IOAudioStreamNumericRepresentation" + +#define kIOAudioStreamFormatFlagsKey "IOAudioStreamFormatFlags" +#define kIOAudioStreamFramesPerPacketKey "IOAudioStreamFramesPerPacket" +#define kIOAudioStreamBytesPerPacketKey "IOAudioStreamBytesPerPacket" + + +#define kIOAudioStreamBitDepthKey "IOAudioStreamBitDepth" +#define kIOAudioStreamBitWidthKey "IOAudioStreamBitWidth" + +#define kIOAudioStreamAlignmentKey "IOAudioStreamAlignment" + +#define kIOAudioStreamByteOrderKey "IOAudioStreamByteOrder" + +#define kIOAudioStreamIsMixableKey "IOAudioStreamIsMixable" + +#define kIOAudioStreamMinimumSampleRateKey "IOAudioStreamMinimumSampleRate" +#define kIOAudioStreamMaximumSampleRateKey "IOAudioStreamMaximumSampleRate" + +#define kIOAudioStreamDriverTagKey "IOAudioStreamDriverTag" + +#define kIOAudioStreamTerminalTypeKey "IOAudioStreamTerminalType" + +/***** + * + * IOAudioPort defines + * + *****/ + + + /*! + * @defined kIOAudioPortTypeKey + * @abstract The key in the IORegistry for the IOAudioPort type attribute. + * @discussion This is a driver-defined text attribute that may contain any type. + * Common types are defined as: "Speaker", "Headphones", "Microphone", "CD", "Line", "Digital", "Mixer", "PassThru". + */ +#define kIOAudioPortTypeKey "IOAudioPortType" + +/*! + * @defined kIOAudioPortSubTypeKey + * @abstract The key in the IORegistry for the IOAudioPort subtype attribute. + * @discussion The IOAudioPort subtype is a driver-defined text attribute designed to complement the type + * attribute. + */ +#define kIOAudioPortSubTypeKey "IOAudioPortSubType" + +/*! + * @defined kIOAudioPortNameKey + * @abstract The key in the IORegistry for the IOAudioPort name attribute. + */ +#define kIOAudioPortNameKey "IOAudioPortName" + + + +/***** + * + * IOAudioControl defines + * + *****/ + + + /*! + * @defined kIOAudioControlTypeKey + * @abstract The key in the IORegistry for the IOAudioCntrol type attribute. + * @discussion The value of this text attribute may be defined by the driver, however system-defined + * types recognized by the upper-level software are "Level", "Mute", "Selector". + */ +#define kIOAudioControlTypeKey "IOAudioControlType" + +#define kIOAudioControlSubTypeKey "IOAudioControlSubType" + +#define kIOAudioControlUsageKey "IOAudioControlUsage" + +#define kIOAudioControlIDKey "IOAudioControlID" + +/*! + * @defined kIOAudioControlChannelIDKey + * @abstract The key in the IORegistry for the IOAudioControl channel ID attribute + * @discussion The value for this key is an integer which may be driver defined. Default values for + * common channel types are provided in the following defines. + */ +#define kIOAudioControlChannelIDKey "IOAudioControlChannelID" + +#define kIOAudioControlChannelNumberKey "IOAudioControlChannelNumber" + +#define kIOAudioControlCoreAudioPropertyIDKey "IOAudioControlCoreAudioPropertyID" +/*! + * @defined kIOAudioControlChannelNameKey + * @abstract The key in the IORegistry for the IOAudioControl name attribute. + * @discussion This name should be a human-readable name for the channel(s) represented by the port. + * *** NOTE *** We really need to make all of the human-readable attributes that have potential to + * be used in a GUI localizable. There will need to be localized strings in the kext bundle matching + * the text. + */ +#define kIOAudioControlChannelNameKey "IOAudioControlChannelName" + +/*! + * @defined kIOAudioControlChannelNameAll + * @abstract The value for the kIOAudioControlChannelNameKey in the IORegistry representing + * the channel name for all channels. + */ +#define kIOAudioControlChannelNameAll "All Channels" + +/*! + * @defined kIOAudioControlChannelNameLeft + * @abstract The value for the kIOAudioControlChannelNameKey in the IORegistry representing + * the channel name for the left channel. + */ +#define kIOAudioControlChannelNameLeft "Left" + +/*! + * @defined kIOAudioControlChannelNameRight + * @abstract The value for the kIOAudioControlChannelNameKey in the IORegistry representing + * the channel name for the right channel. + */ +#define kIOAudioControlChannelNameRight "Right" + +/*! + * @defined kIOAudioControlChannelNameCenter + * @abstract The value for the kIOAudioControlChannelNameKey in the IORegistry representing + * the channel name for the center channel. + */ +#define kIOAudioControlChannelNameCenter "Center" + +/*! + * @defined kIOAudioControlChannelNameLeftRear + * @abstract The value for the kIOAudioControlChannelNameKey in the IORegistry representing + * the channel name for the left rear channel. + */ +#define kIOAudioControlChannelNameLeftRear "LeftRear" + +/*! + * @defined kIOAudioControlChannelNameRightRear + * @abstract The value for the kIOAudioControlChannelNameKey in the IORegistry representing + * the channel name for the right rear channel. + */ +#define kIOAudioControlChannelNameRightRear "RightRear" + +/*! + * @defined kIOAudioControlChannelNameSub + * @abstract The value for the kIOAudioControlChannelNameKey in the IORegistry representing + * the channel name for the sub/LFE channel. + */ +#define kIOAudioControlChannelNameSub "Sub" + +/*! + * @defined kIOAudioControlChannelNameFrontLeftCenter + * @abstract The value for the kIOAudioControlChannelNameKey in the IORegistry representing + * the channel name for the FrontLeftCenter channel. + */ +#define kIOAudioControlChannelNameFrontLeftCenter "FrontLeftCenter" + +/*! + * @defined kIOAudioControlChannelNameFrontRightCenter + * @abstract The value for the kIOAudioControlChannelNameKey in the IORegistry representing + * the channel name for the FrontRightCenter channel. + */ +#define kIOAudioControlChannelNameFrontRightCenter "FrontRightCenter" + +/*! + * @defined kIOAudioControlChannelNameRearCenter + * @abstract The value for the kIOAudioControlChannelNameKey in the IORegistry representing + * the channel name for the RearCenter channel. + */ +#define kIOAudioControlChannelNameRearCenter "RearCenter" + +/*! + * @defined kIOAudioControlChannelNameSurroundLeft + * @abstract The value for the kIOAudioControlChannelNameKey in the IORegistry representing + * the channel name for the SurroundLeft channel. + */ +#define kIOAudioControlChannelNameSurroundLeft "SurroundLeft" + +/*! + * @defined kIOAudioControlChannelNameSurroundRight + * @abstract The value for the kIOAudioControlChannelNameKey in the IORegistry representing + * the channel name for the SurroundRight channel. + */ +#define kIOAudioControlChannelNameSurroundRight "SurroundRight" + + +/*! + * @defined kIOAudioControlValueKey + * @abstract The key in the IORegistry for the IOAudioControl value attribute. + * @discussion The value returned by this key is a 32-bit integer representing the current value of the IOAudioControl. + */ +#define kIOAudioControlValueKey "IOAudioControlValue" + +/*! + * @defined kIOAudioControlValueIsReadOnlyKey + * @abstract The key in the IORegistry for the IOAudioControl value-is-read-only attribute. + * @discussion The value returned by this key is a 32-bit integer but the value doesn't have any direct meaning. + * Instead, the presence of this key indicates that the value for the control is read-only + */ +#define kIOAudioControlValueIsReadOnlyKey "IOAudioControlValueIsReadOnly" + +/*! + * @defined kIOAudioLevelControlMinValueKey + * @abstract The key in the IORegistry for the IOAudioControl minimum value attribute. + * @discussion The value returned by this key is a 32-bit integer representing the minimum value for the IOAudioControl. + * This is currently only valid for Level controls or other driver-defined controls that have a minimum and maximum + * value. + */ +#define kIOAudioLevelControlMinValueKey "IOAudioLevelControlMinValue" + +/*! + * @defined kIOAudioLevelControlMaxValueKey + * @abstract The key in the IORegistry for the IOAudioControl maximum value attribute. + * @discussion The value returned by this key is a 32-bit integer representing the maximum value for the IOAudioControl. + * This is currently only valid for Level controls or other driver-defined controls that have a minimum and maximum + * value. + */ +#define kIOAudioLevelControlMaxValueKey "IOAudioLevelControlMaxValue" + +/*! + * @defined kIOAudioLevelControlMinDBKey + * @abstract The key in the IORgistry for the IOAudioControl minimum db value attribute. + * @discussion The value returned by this key is a fixed point value in 16.16 format represented as a 32-bit + * integer. It represents the minimum value in db for the IOAudioControl. This value matches the minimum + * value attribute. This is currently valid for Level controls or other driver-defined controls that have a + * minimum and maximum db value. + */ +#define kIOAudioLevelControlMinDBKey "IOAudioLevelControlMinDB" + +/*! + * @defined kIOAudioLevelControlMaxDBKey + * @abstract The key in the IORgistry for the IOAudioControl maximum db value attribute. + * @discussion The value returned by this key is a fixed point value in 16.16 format represented as a 32-bit + * integer. It represents the maximum value in db for the IOAudioControl. This value matches the maximum + * value attribute. This is currently valid for Level controls or other driver-defined controls that have a + * minimum and maximum db value. + */ +#define kIOAudioLevelControlMaxDBKey "IOAudioLevelControlMaxDB" + +#define kIOAudioLevelControlRangesKey "IOAudioLevelControlRanges" + +#define kIOAudioLevelControlUseLinearScale "IOAudioLevelControlUseLinearScale" + +#define kIOAudioSelectorControlAvailableSelectionsKey "IOAudioSelectorControlAvailableSelections" +#define kIOAudioSelectorControlSelectionValueKey "IOAudioSelectorControlSelectionValue" +#define kIOAudioSelectorControlSelectionDescriptionKey "IOAudioSelectorControlSelectionDescriptionKey" +#define kIOAudioSelectorControlTransportValueKey "IOAudioSelectorControlTransportValue" // + +#define kIOAudioSelectorControlClockSourceKey "IOAudioSelectorControlClockSourceKey" + + +#endif /* _IOAUDIODEFINES_H */ diff --git a/QualcommWireless/include/IOKit/audio/IOAudioDevice.h b/QualcommWireless/include/IOKit/audio/IOAudioDevice.h new file mode 100644 index 0000000..8e73e5b --- /dev/null +++ b/QualcommWireless/include/IOKit/audio/IOAudioDevice.h @@ -0,0 +1,771 @@ +/* + * Copyright (c) 1998-2014 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/*! + * @header IOAudioDevice + */ + +#ifndef _IOKIT_IOAUDIODEVICE_H +#define _IOKIT_IOAUDIODEVICE_H + +#include +#include + +#ifndef IOAUDIOFAMILY_SELF_BUILD +#include +#include +#else +#include "IOAudioTypes.h" +#include "IOAudioStream.h" +#endif + +class IOAudioEngine; +class IOAudioStream; +class IOAudioPort; +class IOAudioControl; +class OSDictionary; +class OSSet; +class OSArray; +class IOTimerEventSource; +class IOCommandGate; + +/*! + * @enum IOAudioDevicePowerState + * @abstract Identifies the power state of the audio device + * @discussion A newly created IOAudioDevices defaults to the idle state. + * @constant kIOAudioDeviceSleep State set when the system is going to sleep + * @constant kIOAudioDeviceIdle State when the system is awake but none of the IOAudioEngines are in use + * @constant kIOAudioDeviceActive State when one ore more IOAudioEngines are in use. This state transition must complete before the system will begin playing audio. + */ +typedef enum _IOAudioDevicePowerState { + kIOAudioDeviceSleep = 0, // When sleeping + kIOAudioDeviceIdle = 1, // When no audio engines running + kIOAudioDeviceActive = 2 // audio engines running +} IOAudioDevicePowerState; + +/*! + * @class IOAudioDevice + * @abstract Abstract base class for a single piece of audio hardware. The IOAudioDevice provides + * the central coordination point for an audio driver. + * @discussion An audio driver is required to subclass IOAudioDevice in order to provide + * working audio to the system. A single driver instance will contain a single instance of the + * driver's IOAudioDevice subclass. The subclass is responsible for mapping all hardware device + * resources from the service provider nub. It must control access to the hardware so that the + * hardware doesn't get into an inconsistent state. It is possible that different threads may make + * requests of the hardware at the same time. The IOAudioDevice superclass provides an IOWorkLoop + * and IOCommandGate on the IOWorkLoop through which all hardware accesses may be synchronized. + * All entry points to all parts of the driver controlled by the IOAudioFamily will be synchronized + * through this one IOWorkLoop. + * + * The IOAudioDevice subclass is responsible for creating the rest of the pieces of the driver. + * It must identify and create all IOAudioEngines that are not automatically created by the system + * (i.e. those that are not matched and instantiated by IOKit directly). + * + * The IOAudioDevice subclass must enumerate and create all IOAudioControls to match + * the device capabilities. + * + * It must also execute control value chages when requested by the system (i.e. volume adjustments). + * + * In order to allow sleep and wake to work on the system, the IOAudioDevice subclass is responsible + * for performing the necessary actions to sleep and wake its hardware (and restore necessary state + * on wake). + * + * The IOAudioDevice class provides timer services that allow different elements in the audio driver + * to receive timer notifications as needed. These services were designed with the idea that most + * timed events in a typical audio driver need to be done at least as often as a certain interval. + * Further, it is designed with the idea that being called more often than the specified interval + * doesn't hurt anything - and in fact may help. With this in mind, the timer services provided + * by the IOAudioDevice class allow different targets to register for timer callbacks at least as + * often as the specified interval. The actual interval will be the smallest of the intervals of + * all of the callbacks. This way, we avoid the overhead of having many timers in a single audio + * device. As an example, each output IOAudioEngine has a timer to run the erase head. It doesn't hurt + * to have the erase head run more often. Also, a typical IOAudioDevice subclass may need to run a timer + * to check for device state changes (e.g. jack insertions). + * + * There are a number of strings passed from the driver to the CoreAudio.framework and then into + * applications. All of those strings should be localized by the driver. In order to do that + * the kext bundle should have localized string files following the Mac OS X localization + * instructions. The IOAudioDevice should contain a property with the name of the bundle/kext + * that contains the localized string resources. To do that, the driver's personality in + * the bundle resources could have a property named 'IOAudioDeviceLocalizedBundle' with the path + * of the bundle/kext relative to '/System/Library/Extensions'. It could also be set by the + * IOAudioDevice subclass in its initHardware() function. To do so, call + * setProperty(kIOAudioDeviceLocalizedBundleKey, "Driver.kext"). + * + * In a typical driver, the IOAudioDevice subclass will implement initHardware() to perform the + * hardware initialization and driver construction. Within that initialization it must create at + * least one IOAudioEngine instance and activate it. In order to activate a new IOAudioEngine + * activateAudioEngine() should be called for each one. It must create the IOAudioControls + * matching the hardware capabilities to allow the system to set volume, mute and input selection. + * To add those controls to the driver, each control should be attached to the IOAudioEngine to + * which it applies by calling addDefaultAudioControl() on the IOAudioEngine. + * During initialization it should also call setDeviceName(), setDeviceShortName() and + * setManufacturerName() with localized strings representing each of the attributes. + * + * If the driver is to work properly after sleep/wake, it must implement performPowerStateChange() + * and deal with the sleep and wake transitions. It may also deal with the idle state transitions + * to turn off device power when it isn't in use (especially useful for devices attached to a + * portable running on battery power). + */ + +#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED + #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 101000 + #warning IOAudioDevice is deprecated use instead. + #endif +#endif + +class IOAudioDevice : public IOService +{ + friend class IOAudioEngine; + + OSDeclareDefaultStructors(IOAudioDevice) + +protected: + /*! @var workLoop The IOWorkLoop for the driver - this is shared with the other objects in the driver */ + IOWorkLoop *workLoop; + /*! @var commandGate The IOCommandGate for this IOAudioDevice. It is attached to workLoop */ + IOCommandGate *commandGate; + /*! @var timerEventSource An IOTimerEventSource attached to workLoop used for the timer services */ + IOTimerEventSource *timerEventSource; + + /*! @var duringStartup State variable set to true while the driver is starting up and false all other times */ + bool duringStartup; + /*! @var familyManagePower Set to true if the family is supposed to manage power - this is the default state. It can be changed early in the initialization process with a call to setFamilyManagePower(). */ + bool familyManagePower; + /*! @var asyncPowerStateChangeInProgress Set to true while an asynchronous power change is pending and false all other times. */ + bool asyncPowerStateChangeInProgress; + + /*! @var numRunningAudioEngines The number of running IOAudioEngines. This is used to maintain idle vs active power state. */ + UInt32 numRunningAudioEngines; + + /*! @var currentPowerState Used to track the existing power state - can be fetched by calling getPowerState() */ + IOAudioDevicePowerState currentPowerState; + /*! @var pendingPowerState If a power state change is in progress, this represents the pending power state. All other times this is the same as the currentPowerState. */ + IOAudioDevicePowerState pendingPowerState; + + /*! @var audioEngines The set of IOAudioEngine objects vended by the IOAudioDevice. */ + OSArray * audioEngines; + /*! @var timerEvents + * @abstract The set of timer events in use by the device. + * @discussion The key for the dictionary is the target of the event. This means that a single target may + * have only a single event associated with it. + */ + OSDictionary * timerEvents; + /*! @var audioPorts The set of IOAudioPort objects associated with the IOAudioDevice */ + OSSet * audioPorts; + + /*! @var minimumInterval The smallest timer interval requested by all timer event targets. */ + AbsoluteTime minimumInterval; + /*! @var previousTimerFire The time of the last timer event. + * @discussion This is used to schedule the next timer event. + */ + AbsoluteTime previousTimerFire; + +public: + /*! @var gIOAudioPlane + * A static IORegistryPlane representing the new IOAudioPlane that the IOAudioFamily uses + * to represent the signal chain of the device. + */ + static const IORegistryPlane *gIOAudioPlane; + +protected: + struct ExpansionData { + unsigned long long idleSleepDelayTime; + IOTimerEventSource * idleTimer; + }; + + ExpansionData *reserved; + +public: + static void idleAudioSleepHandlerTimer(OSObject *owner, IOTimerEventSource *sender ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn setAggressiveness(unsigned long type, unsigned long newLevel ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + // OSMetaClassDeclareReservedUsed(IOAudioDevice, 0); + virtual void setDeviceTransportType(const UInt32 transportType ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + // OSMetaClassDeclareReservedUsed(IOAudioDevice, 1); + /*! + * @function setIdleAudioSleepTime + * @abstract This function is to be called by a driver that doesn't want to be told about the audio + * going idle immediately, but at some point in the future. + * @discussion This is useful if the device will want to power down its hardware into an idle sleep + * state, but doesn't want to do that unless audio hasn't been used for a while. Calling this function + * immediately changes the idle sleep timer and queues it up if the idle is different from the previous + * idle time. The idle time defaults to 0, which means be called immediately (backwards compatible with + * previous versions of IOAudioFamily). A value of 0xffffffffffffffffULL means don't ever tell the + * driver about going idle. + * @param sleepDelay The amount of time, in nanoseconds, before the hardware should be told to go idle. + */ + virtual void setIdleAudioSleepTime(unsigned long long sleepDelay ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + // OSMetaClassDeclareReservedUsed(IOAudioDevice, 2); + virtual void scheduleIdleAudioSleep(void ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + // OSMetaClassDeclareReservedUsed(IOAudioDevice, 3); + /*! + * @function setConfigurationApplicationBundle + * @abstract This function is to be called if an external configuration application is available to set + * which application to launch. + * @discussion This is useful for device drivers that are too complex to be represented by the Sound Preferences + * panel. The bundle ID is a more flexible way of specifying where the application is than a hard coded path. + * @param bundleID The bundle ID of the application to be launched by the HAL for configuration of the device and its engine(s). + */ + virtual void setConfigurationApplicationBundle(const char *bundleID ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + // OSMetaClassDeclareReservedUsed(IOAudioDevice, 4); + /*! + * @function setDeviceCanBeDefault + * @abstract This function is to be called to tell CoreAudio if this device shouldn't be a default device. + * @discussion This is useful for device drivers that don't want to be a default device. Can be called with + * kIOAudioDeviceCanBeDefaultNothing to prevent CoreAudio from allowing this device to be any default device, or it + * can be called with any combination of kIOAudioDeviceCanBeDefaultInput, kIOAudioDeviceCanBeDefaultOutput, or + * kIOAudioDeviceCanBeSystemOutput. The default is + * (kIOAudioDeviceCanBeDefaultInput | kIOAudioDeviceCanBeDefaultOutput | kIOAudioDeviceCanBeSystemOutput). + * @param defaultsFlags The flags to instruct CoreAudio to allow this device to be only the indicated default devices. + */ + virtual void setDeviceCanBeDefault(UInt32 defaultsFlags ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + // OSMetaClassDeclareReservedUsed(IOAudioDevice, 5); + virtual void setDeviceModelName(const char * modelName ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + +private: + OSMetaClassDeclareReservedUsed(IOAudioDevice, 0); + OSMetaClassDeclareReservedUsed(IOAudioDevice, 1); + OSMetaClassDeclareReservedUsed(IOAudioDevice, 2); + OSMetaClassDeclareReservedUsed(IOAudioDevice, 3); + OSMetaClassDeclareReservedUsed(IOAudioDevice, 4); + OSMetaClassDeclareReservedUsed(IOAudioDevice, 5); + + OSMetaClassDeclareReservedUnused(IOAudioDevice, 6); + OSMetaClassDeclareReservedUnused(IOAudioDevice, 7); + OSMetaClassDeclareReservedUnused(IOAudioDevice, 8); + OSMetaClassDeclareReservedUnused(IOAudioDevice, 9); + OSMetaClassDeclareReservedUnused(IOAudioDevice, 10); + OSMetaClassDeclareReservedUnused(IOAudioDevice, 11); + OSMetaClassDeclareReservedUnused(IOAudioDevice, 12); + OSMetaClassDeclareReservedUnused(IOAudioDevice, 13); + OSMetaClassDeclareReservedUnused(IOAudioDevice, 14); + OSMetaClassDeclareReservedUnused(IOAudioDevice, 15); + OSMetaClassDeclareReservedUnused(IOAudioDevice, 16); + OSMetaClassDeclareReservedUnused(IOAudioDevice, 17); + OSMetaClassDeclareReservedUnused(IOAudioDevice, 18); + OSMetaClassDeclareReservedUnused(IOAudioDevice, 19); + OSMetaClassDeclareReservedUnused(IOAudioDevice, 20); + OSMetaClassDeclareReservedUnused(IOAudioDevice, 21); + OSMetaClassDeclareReservedUnused(IOAudioDevice, 22); + OSMetaClassDeclareReservedUnused(IOAudioDevice, 23); + OSMetaClassDeclareReservedUnused(IOAudioDevice, 24); + OSMetaClassDeclareReservedUnused(IOAudioDevice, 25); + OSMetaClassDeclareReservedUnused(IOAudioDevice, 26); + OSMetaClassDeclareReservedUnused(IOAudioDevice, 27); + OSMetaClassDeclareReservedUnused(IOAudioDevice, 28); + OSMetaClassDeclareReservedUnused(IOAudioDevice, 29); + OSMetaClassDeclareReservedUnused(IOAudioDevice, 30); + OSMetaClassDeclareReservedUnused(IOAudioDevice, 31); + + +public: + // Initialization + + /*! + * @function init + * @abstract Initialize a newly created instance of IOAudioDevice. + * @discussion This implementation initializes all of the data structures and variables used by the + * IOAudioDevice. The currentPowerState and pendingPowerState variables are set to kIOAudioDeviceIdle. + * A subclass that overrides this method must call the superclass' implementation. + * @param properties + * An OSDictionary of the device properties that gets passed to super::init and set + * in the IORegistry. + * @result true if initialization was successful + */ + virtual bool init(OSDictionary *properties ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function free + * @abstract Frees resources used by the IOAudioDevice instance + * @discussion This method will deactivate all audio audio engines and release the audioEngines OSSet. + * It will also deactivate all of the audio ports and release the audioPorts OSSet. It will release + * the timerEvents OSDictionary as well as cancel any outstanding timer callbacks. It will clean up + * all of the event sources and the workLoop. + * + * Do not call this directly. This is called automatically by the system when the instance's + * refcount goes to 0. To decrement the refcount, call release() on the object. + */ + + virtual void free( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function start + * @abstract This function is called automatically by the system to tell the driver to start vending + * services to the rest of the system. + * @discussion The start() implementation in IOAudioDevice starts by calling start() on its superclass. + * It then calls initHardware() which the subclass should override to properly initialize itself and + * the hardware. If that call succeeds, it sets up power management if the family is supposed to + * manage power (checking the familyManagePower variable). Then finally it calls registerService() + * to make the IOAudioDevice visible in the IORegistry. + * @param provider + * This is the service provider nub that provides access to the hardware resources. + * @result Returns true on success + */ + virtual bool start(IOService *provider ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function stop + * @abstract This is responsible for stopping the device after the system is done with it (or + * if the device is removed from the system). + * @discussion The IOAudioDevice implentation of stop() disables the timer services, deactivates + * all of the audio audio engines and audio ports and stops power management of the device. + * The audio engine and port deactivation causes all of the audio engines to get stopped and + * all of the audio engine and port resources and objects to be released. A subclass' implementation + * may could shut down hardware here if necessary. If this function is overridden by a subclass, + * the superclass' implementation must be called. + * @param provider + * The service provider nub for the device. + */ + virtual void stop(IOService *provider ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual bool willTerminate(IOService *provider, IOOptionBits options ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function initHardware + * @abstract This function is called by start() to provide a convenient place for the subclass to + * perform its initialization. + * @discussion In a typical implementation, a driver would implementation this function and perform + * a number of tasks. Those include mapping hardware resources, initializing the hardware to a known + * state, creating the IOAudioEngines, IOAudioControls and IOAudioStreams. Additionally it + * should also call setDeviceName(), setDeviceShortName(), setManufacturerName(). Upon return of + * this function, the device should be ready to begin vending services to the system. + * @param provider + * The service provider nub for the device. + * @result This function should return true on a successful initialization. + */ + virtual bool initHardware(IOService *provider ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function setDeviceName + * @abstract Sets the name of the device + * @discussion This method should be called during initialization or startup. It should + * be set by the time initHardware() completes. The device name is used by the + * CoreAudio.framework to identify the particular piece of hardware. This string should + * should be localized by the driver. + */ + virtual void setDeviceName(const char *deviceName ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function setDeviceShortName + * @abstract Sets the short name of the device + * @discussion The short name is a shorter representation of the device name. It may be used + * by applications when the device name is too long. It should be set by the time initHardware() + * completes. The string should be localized by the driver. + */ + virtual void setDeviceShortName(const char *shortName ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function setManufacturerName + * @abstract Sets the manufacturer name of the device + * @discussion This method should be called during initialization or startup. This should be + * called by the time initHardware() completes. The string should be localized by the driver. + */ + virtual void setManufacturerName(const char *manufacturerName ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + + // IOWorkLoop, IOCommandGate management + + /*! + * @function getWorkLoop + * @abstract Returns the IOWorkLoop for the driver + * @discussion The IOWorkLoop is used to synchronized all critical aspects of the driver. This + * includes all entry points to the driver as well as power management. + */ + virtual IOWorkLoop *getWorkLoop() const AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function getCommandGate + * @abstract Returns the IOCommandGate for this IOAudioDevice + * @discussion This IOCommandGate allows calls into this IOAudioDevice to be synchronized on + * the IOWorkLoop. + */ + virtual IOCommandGate *getCommandGate() const AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + + // IOAudioEngine management + + /*! + * @function activateAudioEngine + * @abstract This simply calls activateAudioEngine(IOAudioEngine *audioEngine, + * bool shouldStartAudioEngine) with a value of true for shouldStartAudioEngine. + * @param audioEngine + * The IOAudioEngine instance to be activated. It is treated as a newly + * allocated instance. + * @result Returns true if the audio engine was successfully activated. + */ + virtual IOReturn activateAudioEngine(IOAudioEngine *audioEngine ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function activateAudioEngine + * @abstract This is called to add a new IOAudioEngine object to the IOAudioDevice. + * @discussion Once the IOAudioEngine has been activated by this function, it is ready + * to begin moving audio data. This should be called either during the subclass' initHardware() + * implementation for each IOAudioEngine the device creates. Or it should be called by + * the IOAudioEngine itself if the audio engine was automatically created by IOKit's matching + * process. The system won't be able to properly track and control IOAudioEngines if + * they are not activated though this function. + * This implementation will retain the IOAudioEngine while it maintains control of it. + * When the audio engine is deactivated, the IOAudioEngine will be released. If the + * IOAudioDevice subclass is passing a newly instantiated IOAudioEngine, it will need to release + * the audio engine after it has been activated. This will insure that the refCount on the audio engine + * is correct when it gets deactivated when the driver is stopped. That allows the audio engine to be + * freed when it is no longer needed. + * @param audioEngine + * The IOAudioEngine instance to be activated. + * @param shouldStartAudioEngine + * If true, the audio engine is treated as a newly allocated IOAudioEngine + * instance and is appropriately attached and started according to IOKit convention. If it is false + * it is assumed that some other process (possibly the IOKit matching process) has started the + * IOAudioEngine and will skip that step. + * @result Returns true if the audio engine was successfully activated. + */ + virtual IOReturn activateAudioEngine(IOAudioEngine *audioEngine, bool shouldStartAudioEngine ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function deactivateAllAudioEngines + * @abstract Deactivates all of the audio engines in the device. + * @discussion This is called by the stop() and free() methods in IOAudioDevice to completely + * shut down all audio engines as the driver is being shut down. + */ + virtual void deactivateAllAudioEngines( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + + // Power management + + /*! + * @function setFamilyManagePower + * @abstract Called set whether or not the family should manage the device power throught the + * IOService power management APIs. + * @discussion The default behavior is for the family to manage power. It is only necessary to + * call this function if the driver does not want the family to manage power. It is not + * recommended that this function be called because it makes power management much more + * difficult for the driver. If this function is to be called, it must be called before + * initHardware() completes. Immediately after initHardware() is called by start(), + * the power management system is initialized if the family is to manage power. + * @param manage Set to false if it is not desired that the family does the power management + */ + virtual void setFamilyManagePower(bool manage ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function setPowerState + * @abstract Called by the power management system in IOService when the power state of this + * service needs to change. + * @discussion The default implementation of IOAudioDevice sets up two power states for IOService + * to use. State 0 is sleep and state 1 is wake. This function should not be called directly. + * It is only supposed to be used by the IOService power management services. + * @param powerStateOrdinal + * The number of the power state as defined by the IOAudioDevice - + * 0 for sleep, 1 for wake. + * @param device The power management policy maker. + * @result Returns kIOPMAckImplied (0) when the power state change is complete. Otherwise the an + * upper bound on the number of microseconds until the state change is complete is returned. + */ + virtual IOReturn setPowerState(unsigned long powerStateOrdinal, IOService *device ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function setPowerStateAction + * @abstract IOCommandGate Action which calls protectedSetPowerState() while holding the IOCommandGate + * @discussion This is needed to allow protectedSetPowerState() to be called on the IOWorkLoop + * @param owner The owner of the IOCommandGate (the IOAudioDevice in this case) + * @param arg1 The powerStateOrdinal to be passed to protectedSetPowerState() + * @param arg2 The device to be passed to protectedSetPowerState() + * @result Returns the result of protectedSetPowerState() + */ + static IOReturn setPowerStateAction(OSObject *owner, void *arg1, void *arg2, void *arg3, void *arg4 ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + static IOReturn _setPowerStateAction(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3 ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; // + + /*! + * @function protectedSetPowerState + * @abstract Called by setPowerStateAction() to deal with a power state change from the IOService + * power management facility. + * @discussion This function is responsible for performing the necessary sleep and wake tasks + * when the system is sleeping or waking. If an outstanding power state change is in progress, + * it will wait until the state changes has completed. While sleeping, all audio engines are + * stopped before calling initiatePowerStateChange() to call performPowerStateChange() to let + * the driver deal with the sleep request. When waking, it determines if the device should be + * idle or active and continues to call initiatePowerStateChange(). If initiatePowerStateChange() + * indicates that the power state change is occuring asynchronously, it returns the number of + * microseconds. This function must be called on the IOWorkLoop, but should not be called + * directly. + * @param powerStateOrdinal Param passed to setPowerState() - 0 for sleep, 1 for wake + * @param device Param passed to setPowerState - the device initiating the power state change + * @result Returns 0 if the power state change is complete - the number of microseconds until + * complete if its asynchronous. + */ + virtual IOReturn protectedSetPowerState(unsigned long powerStateOrdinal, IOService *device ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function performPowerStateChange + * @abstract This function is called by the IOAudioDevice when a power state change is needed. + * @discussion In order to deal with power state changes, a subclass must override this function. + * Any combination of old and new power states may be passed to this function. If work is to + * be performed while transitioning to sleep, check for a newPowerState of kIOAudioDeviceSleep. + * If work is to be performed while transitioning from sleep, check for an oldPowerState of + * kIOAudioDeviceSleep. A power state of kIOAudioDeviceIdle means the system is awake, but + * no clients are currently playing or recording audio (i.e. no IOAudioEngines are active). + * A power state of kIOAudioDeviceActive means that at least one IOAudioEngine is active. + * It is possible for a power state change to be performed synchronously or asynchronously. + * In the case of a synchronous power state change, simple leave microsecondsUntilComplete + * alone and return kIOReturnSuccess. If an asynchronous power state change is needed the + * driver should do whatever needed to schedule another thread to finish the state change + * and set the microsecondsUntilComplete to an upper bound on the amount of time it will + * take to complete the power state change. Then when the power state change is complete, + * a call must be made to completePowerStateChange(). During an asynchronous power state + * change, the current power state will remain the same as before the transition began, + * and the pendingPowerState is set to the new power state that will be set when the + * change is complete. + * @param oldPowerState The power state before the power state change + * @param newPowerState The power state being transitioned to + * @param microsecondsUntilComplete + * A pointer to a value representing an upper bound on + * the number of microseconds to complete an asynchronous power state change. It points + * to a value of zero at the start and if it remains zero, the state change is complete + * upon a successful return from the function. + * @result Returns kIOReturnSuccess on a successful completion + */ + virtual IOReturn performPowerStateChange(IOAudioDevicePowerState oldPowerState, + IOAudioDevicePowerState newPowerState, + UInt32 *microsecondsUntilComplete ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function completePowerStateChange + * @abstract Called when a power state change is complete + * @discussion In the case of an asynchronous power state change, a subclass is responsible + * for calling this function. It is safe to call this function if not on the IOWorkLoop. + * This function calls protectedCompletePowerStateChange() through the IOCommandGate and + * completePowerStateChangeAction(). If the call is already on the IOWorkLoop, it is safe + * to call protectedCompletePowerStateChange() directly. + * @result Returns kIOReturnSuccess on a successful completion + */ + virtual IOReturn completePowerStateChange( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function completePowerStateChangeAction + * @abstract IOCommandGate Action which calls protectedCompletePowerStateChange() while holding the + * IOCommandGate. + * @discussion This is needed to allow protectedCompletePowerStateChange() to be called on the IOWorkLoop. + * @param owner The owner of the IOCommandGate (the IOAudioDevice in this case) + * @result Returns the result of protectedCompletePowerStateChange() + */ + static IOReturn completePowerStateChangeAction(OSObject *owner, void *arg1, void *arg2, void *arg3, void *arg4 ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function protectedCompletePowerStateChange + * @abstract Called on the IOWorkLoop when a power state change is complete. + * @discussion This function does the work to complete a power state change (both synchronous and + * asynchronous). If the system is waking from sleep, the timer system is restarted and the + * audio engines are resumed. If this was called as a result of an asynchronous power state changed + * it makes the IOService power management call acknowledgePowerChange() and resets the + * asyncPowerStateChangeInProgress variable. Finally it sets the currentPowerState to the + * pendingPowerState. This function must be called on the IOWorkLoop. If a subclass is not + * on the IOWorkLoop (e.g. holding the IOCommandGate), call completePowerStateChange() instead. + * @result Returns kIOReturnSuccess on success + */ + virtual IOReturn protectedCompletePowerStateChange( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function getPowerState + * @abstract Returns the current power state (the old power state if a change is in progress). + * @result The current power state + */ + virtual IOAudioDevicePowerState getPowerState( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function getPendingPowerState + * @abstract Returns the pending power state if a state change is in progress. Otherwise it + * returns the current power state change. + * @result The pending power state + */ + virtual IOAudioDevicePowerState getPendingPowerState( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function waitForPendingPowerStateChange + * @abstract Called internally to wait until a pending power state change is complete. + * @discussion This is only used by internal functions to wait during pending power + * state changes. It is used to prevent multiple power state changes at the same time. + * This function must be called while holding the IOCommandGate. If an asynchronous + * power state change is in progress this function will block until the state change + * if complete. Once complete, it will return while still holding the IOCommandGate. + */ + virtual void waitForPendingPowerStateChange( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function initiatePowerStateChange + * @abstract Called internally to execute a power state change + * @discussion This function must be called on the IOWorkLoop. It calls performPowerStateChange() + * to let the driver process the state change. If the state change is completed synchronously + * by the driver (subclass) it calls protectedCompletePowerStateChange(). If done asynchronously + * it returns the microsecondsUntilComplete that was set by performPowerStateChange(). This + * function should not be called directly. + * @param microsecondsUntilComplete + * Pointer to the microsecondsUntilComplete that should be set + * by performPowerStateChange if an asynchronous power state change was started. + * @result Returns kIOReturnSuccess on success + */ + virtual IOReturn initiatePowerStateChange(UInt32 *microsecondsUntilComplete = NULL ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + + // IOAudioControl management + + /*! + * @function flushAudioControls + * @abstract Forces each IOAudioControl in the driver to have its value flushed out to the hardware. + * That will cause either the IOAudioControl's ValueChangeHandler to be called. + * @discussion This can be used to force the hardware to get updated with the current value + * of each control. It may be useful during wake for example. + */ + virtual void flushAudioControls( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + + // Timer services + + /*! + * @typedef TimerEvent + * @abstract Generic timer event callback for IOAudioDevice timer targets + * @discussion TimerEvent callback function takes two arguments; the target of + * the timer event and the IOAudioDevice sending the event. + * @param target The target of the timer event - passed in when the timer event was registered + * @param audioDevice The IOAudioDevice sending the event + */ + typedef void (*TimerEvent)(OSObject *target, IOAudioDevice *audioDevice ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function addTimerEvent + * @abstract Adds a TimerEvent callback for the given target called at least as often + * as specified in interval. + * @discussion The frequency of the timer event callbacks will be the smallest interval + * specified by all targets. Only one interval and callback may be specified per target. + * If a addTimerEvent is called twice with the same target, the second one overrides the + * first. There is currently a bug triggered if the first call had the smallest interval. + * In that case, that smallest interval would still be used. + * @param target This parameter is the target object of the TimerEvent. + * @param event The callback function called each time the timer fires. + * @param interval The callback will be called at least this often. + * @result Returns kIOReturnSuccess if the timer event was successfully added. + */ + virtual IOReturn addTimerEvent(OSObject *target, TimerEvent event, AbsoluteTime interval ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function removeTimerEvent + * @abstract Removes the timer event for the given target. + * @discussion If the interval for the target to be removed is the smallest interval, + * the timer interval is recalculated based on the remaining targets. The next fire + * time is readjusted based on the new interval compared to the last fire time. + * @param target The target whose timer event will be removed. + */ + virtual void removeTimerEvent(OSObject *target ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function removeAllTimerEvents + * @abstract Removes all timer events and stops the timer + * @discussion Called during teardown of the driver + */ + virtual void removeAllTimerEvents( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + + // IOAudioPort management + + /*! + * @function attachAudioPort + * @abstract Adds the port to the IOAudioDevice's list of ports and attaches the port to its parent + * and attaches the child to the port. + * @discussion This function provides the functionality to represent the device's signal chain in the + * IOAudioPlane in the IORegistry. An IOAudioPort's parent(s) are before it in the signal chain + * and its children are after it. This method may be called multiple times for a single IOAudioPort. + * This is necessary when there are many children or parents. Once a relationship is made, it is not + * necessary to make the reverse relationship. A NULL value may be passed in for either the parent + * or child or both. + * The IOAudioPort passed in should be a newly allocated IOAudioPort instance. This function will + * appropriately attach and start the port object. NOTE: It is not necessary to use IOAudioPorts + * in a fully functional audio driver. + * @param port The newly created IOAudioPort instance to be activated. + * @param parent A parent IOAudioPort or IOAudioEngine of the given port. + * @param child A child IOAudioPort or IOAudioEngine of the given port. + * @result Returns true when the port has been successfully added and attached. + */ + virtual IOReturn attachAudioPort(IOAudioPort *port, IORegistryEntry *parent, IORegistryEntry *child ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function detachAllAudioPorts + * @abstract Deactivates all of the ports in the device. + * @discussion This is called by the stop() and free() methods in IOAudioDevice to completely + * shut down all ports as the driver is being shut down. + */ + virtual void detachAllAudioPorts( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + +protected: + /*! + * @function timerFired + * @abstract Internal static function called when the timer fires. + * @discussion This function simply calls dispatchTimerEvents() on the IOAudioDevice to do just that. + * @param target The IOAudioDevice instance that initiated the timer callback. + * @param sender The IOTimerEventSources calling this callback + */ + static void timerFired(OSObject *target, IOTimerEventSource *sender ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function dispatchTimerEvents + * @abstract Called by timerFired() to cause the timer event callbacks to be called. + * @discussion This method iterates through all of the timer event targets and calls + * the callback on each. Unless the force flag is set to true, the timer events will + * only be dispatched if the power state is not kIOAudioDeviceSleep. This prevents + * unexpected timer firings while making wake->sleep->wake transitions. This function must + * be called on the IOWorkLoop. + * @param force + * A bool param to allow the timer events to be dispatched even if the + * device is in the kIOAudioDeviceSleep power state. + */ + virtual void dispatchTimerEvents(bool force ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function audioEngineStarting + * @abstract Called by IOAudioEngine when it is starting up + * @discussion This should only be called while on the IOWorkLoop. It is not intended to be called + * directly. It is called when an IOAudioEngine is starting up to allow the IOAudioDevice + * to keep track of running audio engines and change the power state from kIOAudioDeviceIdle to + * kIOAudioDeviceActive when the first audio engine starts up. If the state change is done + * asynchronously, it waits for the state change to complete. This is to ensure that the + * system doesn't start playing audio until the IOAudioDevice has completed its transition + * to kIOAudioDeviceActive. + */ + virtual void audioEngineStarting( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function audioEngineStopped + * @abstract Called by IOAudioEngine when it has stopped + * @discussion This should only be called while on the IOWorkLoop. It is not intended to be called + * directly. It is called when an IOAudioEngine has stopped to allow the IOAudioDevice + * to keep track of running audio engines and change the power state from kIOAudioDeviceActive + * to kIOAudioDeviceIdle when the last audio engine stops. If the state change is done + * asynchronously, it waits for the state change to complete. + */ + virtual void audioEngineStopped( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + +}; + +#endif /* _IOKIT_IOAUDIODEVICE_H */ diff --git a/QualcommWireless/include/IOKit/audio/IOAudioEngine.h b/QualcommWireless/include/IOKit/audio/IOAudioEngine.h new file mode 100644 index 0000000..29015ce --- /dev/null +++ b/QualcommWireless/include/IOKit/audio/IOAudioEngine.h @@ -0,0 +1,878 @@ +/* + * Copyright (c) 1998-2014 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/*! + * @header IOAudioEngine + */ + +#ifndef _IOKIT_IOAUDIOENGINE_H +#define _IOKIT_IOAUDIOENGINE_H + +#include +#include + +#ifndef IOAUDIOFAMILY_SELF_BUILD +#include +#else +#include "IOAudioTypes.h" +#endif +#include + +class OSDictionary; +class OSCollection; +class OSOrderedSet; +class IOAudioEngineUserClient; +class IOAudioDevice; +class IOAudioStream; +class IOAudioControl; +class IOCommandGate; + +#define IOAUDIOENGINE_DEFAULT_NUM_ERASES_PER_BUFFER 4 + +/*! + * @typedef IOAudioEnginePosition + * @abstract Represents a position in an audio audio engine. + * @discussion This position is based on the sample frame within a + * loop around the sample buffer, and the loop count which starts at 0 when the audio engine + * begins playback. + * @field fSampleFrame The sample frame within the buffer - starts at 0. + * @field fLoopCount The number of times the ring buffer has looped. + */ +typedef struct { + UInt32 fSampleFrame; + UInt32 fLoopCount; +} IOAudioEnginePosition; + +#define CMP_IOAUDIOENGINEPOSITION(p1, p2) \ + (((p1)->fLoopCount > (p2)->fLoopCount) ? 1 : \ + ((p1)->fLoopCount == (p2)->fLoopCount) && ((p1)->fSampleFrame > (p2)->fSampleFrame) ? 1 : \ + ((p1)->fLoopCount == (p2)->fLoopCount) && ((p1)->fSampleFrame == (p2)->fSampleFrame) ? 0 : -1) + +#define IOAUDIOENGINEPOSITION_IS_ZERO(p1) (((p1)->fLoopCount == 0) && ((p1)->fSampleFrame == 0)) + +/*! + * @class IOAudioEngine + * @abstract Abstract base class for a single audio audio / I/O engine. + * @discussion An IOAudioEngine is defined by a single I/O engine to transfer data to + * or from one or more sample buffers. Each sample buffer is represented by a single IOAudioStream + * instance. A single IOAudioEngine must contain at least one IOAudioStream, but has no upper + * limit on the number of IOAudioStreams it may contain. An IOAudioEngine instance may contain + * both input and output IOAudioStreams. + * + * An audio driver must subclass IOAudioEngine in order to provide certain services. An + * IOAudioEngine subclass must start and stop the I/O engine when requested. The I/O + * engine should be continuously running and loop around from end to beginning. While the audio + * engine is running, it must take a timestamp as the sample buffer(s) wrap around and start at + * the beginning. The CoreAudio.framework uses the timestamp to calculate the exact position of + * the audio engine. An IOAudioEngine subclass must implement getCurrentSampleFrame() to provide + * a sample position on demand. Finally, an IOAudioEngine subclass must provide clipping and + * format conversion routines to go to/from the CoreAudio.framework's native float format. + * + * If multiple stream formats or sample rates are allowed, the IOAudioEngine + * subclass must provide support for changing the hardware when a format or sample rate is + * changed. + * + * There are several attributes associated with a single IOAudioEngine: + * + * The IOAudioEngine superclass provides a shared status buffer that contains all of the dynamic pieces + * of information about the audio engine (type IOAudioEngineStatus). It runs an erase process on + * all of the output streams. The erase head is used to zero out the mix and sample buffers after + * the samples have been played. Additionally, the IOAudioEngine superclass handles the + * communication with the CoreAudio.framework and makes the decision to start and stop the + * audio engine when it detects it is in use. + * + * In order for an audio device to play back or record sound, an IOAudioEngine subclass must be created. + * The subclass must initialize all of the necessary hardware resources to prepare for starting the + * audio I/O engine. It typically will perform these tasks in the initHardware() method. A subclass + * may also implement a stop() method which is called as the driver is being torn down. This is + * typically called in preparation of removing the device from the system for removable devices. + * + * In addition to initializing the necessary hardware, there are a number of other tasks an + * IOAudioEngine must do during initHardware(). It must create the necessary IOAudioStream objects + * to match the device capabilities. Each IOAudioStream must be added using addAudioStream(). It + * also should create the IOAudioControls needed to control the various attributes of the audio engine: + * output volume, mute, input gain, input selection, analog passthru. To do that, addDefaultAudioControl() + * should be called with each IOAudioControl to be attached to the IOAudioEngine. In order to provide + * for proper synchronization, the latency of the audio engine should be specified with setSampleLatency(). + * This value represents the latency between the timestamp taken at the beginning of the buffer and + * when the audio is actually played (or recorded) by the device. If a device is block based or if + * there is a need to keep the CoreAudio.framework a certain number of samples ahead of (or behind for + * input) the I/O head, that value should be specified using setSampleOffset(). If this is not specified + * the CoreAudio.framework may attempt to get as close to the I/O head as possible. + * + * The following fields in the shared IOAudioEngineStatus struct must be maintained by the subclass + * implementation: + *
+ *    fCurrentLoopCount - the number of times the sample buffer has wrapped around to the beginning
+ *    fLastLoopTime - timestamp of the most recent time that the I/O engine looped back to the 
+ *  beginning of the sample buffer
+ *  
+ * It is critically important that the fLastLoopTime field be as accurate as possible. It is + * the basis for the entire timer and synchronization mechanism used by the audio system. + * + * At init time, the IOAudioEngine subclass must call setNumSampleFramesPerBuffer() to indicate how large + * each of the sample buffers are (measured in sample frames). Within a single IOAudioEngine, all sample + * buffers must be the same size and be running at the same sample rate. If different buffers/streams can + * be run at different rates, separate IOAudioEngines should be used. The IOAudioEngine subclass must + * also call setSampleRate() at init time to indicate the starting sample rate of the device. + * + */ + +#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED + #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 101000 + #warning IOAudioEngine is deprecated use instead. + #endif +#endif + +class IOAudioEngine : public IOService +{ + OSDeclareAbstractStructors(IOAudioEngine) + + friend class IOAudioEngineUserClient; + friend class IOAudioDevice; + friend class IOAudioStream; + +public: + /*! @var gSampleRateWholeNumberKey */ + static const OSSymbol *gSampleRateWholeNumberKey; + /*! @var gSampleRateFractionKey */ + static const OSSymbol *gSampleRateFractionKey; + + /*! @var numSampleFramesPerBuffer */ + UInt32 numSampleFramesPerBuffer; + + /*! @var sampleRate + * The current sample rate of the audio engine in samples per second. */ + IOAudioSampleRate sampleRate; + + /*! @var numErasesPerBuffer + * The number of times the erase head get scheduled to run for each + * cycle of the audio engine. */ + UInt32 numErasesPerBuffer; + /*! @var runEraseHead + * Set to true if the erase head is to run when the audio engine is running. This is the case if there are any output streams. */ + bool runEraseHead; + + /*! @var audioEngineStopPosition + * When all clients have disconnected, this is set to one buffer length past the + * current audio engine position at the time. Then when the stop position is reached, the audio engine + * is stopped */ + IOAudioEnginePosition audioEngineStopPosition; + + /*! @var isRegistered + * Internal state variable to keep track or whether registerService() has been called. */ + bool isRegistered; + /*! @var configurationChangeInProgress + * Set to true after beginConfigurationChange() and false upon a + * subsequent call to completeConfigurationChange() or cancelConfigurationChange(). */ + bool configurationChangeInProgress; + + /*! @var state + * The current state of the IOAudioEngine - running, stopped, paused. */ + IOAudioEngineState state; + + /*! @var status + * Status struct shared with the CoreAudio.framework. */ + IOAudioEngineStatus * status; + + /*! @var audioDevice + * The IOAudioDevice instance to which the IOAudioEngine belongs. */ + IOAudioDevice * audioDevice; + + /*! @var workLoop + * The IOWorkLoop for the audio driver - shared with the IOAudioDevice. */ + IOWorkLoop *workLoop; + /*! @var commandGate + * The IOCommandGate for this audio engine - attached to the driver's IOWorkLoop. */ + IOCommandGate *commandGate; + + /*! @var inputStreams + * An OSSet of all of the input IOAudioStreams attached to this IOAudioEngine. */ + OSOrderedSet *inputStreams; + UInt32 maxNumInputChannels; + /*! @var outputStreams + * An OSSet of all of the output IOAudioStreams attached to this IOAudioEngine. */ + OSOrderedSet *outputStreams; + UInt32 maxNumOutputChannels; + /*! @var userClients + * An OSSet of all of the currently connected user clients. */ + OSSet *userClients; + /*! @var defaultAudioControls + * All of the IOAudioControls that affect this audio engine. */ + OSSet *defaultAudioControls; + + /*! @var numActiveUserClients + * A total of the active user clients - those that are currently playing or + * recording audio. */ + UInt32 numActiveUserClients; + UInt32 sampleOffset; // used for input and output if inputSampleOffset is not set, if inputSampleOffset is set used as output only + + UInt32 index; + bool duringStartup; + +protected: + + /*! + * @var deviceStartedAudioEngine + * Used by the IOAudioDevice to determine responsibility for shutting + * the audio engine down when it is no longer needed. + */ + bool deviceStartedAudioEngine; + +protected: + struct ExpansionData { + UInt32 pauseCount; + IOBufferMemoryDescriptor *statusDescriptor; + IOBufferMemoryDescriptor *bytesInInputBufferArrayDescriptor; + IOBufferMemoryDescriptor *bytesInOutputBufferArrayDescriptor; + UInt32 mixClipOverhead; + OSArray *streams; + UInt32 inputSampleOffset; + UInt32 commandGateStatus; // + SInt32 commandGateUsage; // + }; + + ExpansionData *reserved; + +// static UInt32 sInstanceCount; + +public: + // OSMetaClassDeclareReservedUsed(IOAudioEngine, 0 ); + virtual IOReturn performFormatChange(IOAudioStream *audioStream, const IOAudioStreamFormat *newFormat, const IOAudioStreamFormatExtension *formatExtension, const IOAudioSampleRate *newSampleRate ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioEngine, 1 ); + virtual IOBufferMemoryDescriptor * getStatusDescriptor( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioEngine, 2 ); + virtual IOReturn getNearestStartTime(IOAudioStream *audioStream, IOAudioTimeStamp *ioTimeStamp, bool isInput ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioEngine, 3); + virtual IOBufferMemoryDescriptor * getBytesInInputBufferArrayDescriptor( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioEngine, 4); + virtual IOBufferMemoryDescriptor * getBytesInOutputBufferArrayDescriptor( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioEngine, 5); + /*! + * @function eraseOutputSamples + * @abstract This function allows for the actual erasing of the mix and sample buffer to be overridden by + * a child class. + * @param mixBuf Pointer to the IOAudioFamily allocated mix buffer. + * @param sampleBuf Pointer to the child class' sample buffer. + * @param firstSampleFrame Index to the first sample frame to erase. + * @param numSampleFrames Number of sample frames to erase. + * @param streamFormat Format of the data to be erased. + * @param audioStream Pointer to stream object that corresponds to the sample buffer being erased. + * @result Must return kIOReturnSuccess if the samples have been erased. + */ + virtual IOReturn eraseOutputSamples(const void *mixBuf, void *sampleBuf, UInt32 firstSampleFrame, UInt32 numSampleFrames, const IOAudioStreamFormat *streamFormat, IOAudioStream *audioStream ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioEngine, 6); + /*! + * @function setClockIsStable + * @abstract This function sets a flag that CoreAudio uses to select its sample rate tracking algorithm. Set + * this to TRUE unless that results in dropped audio. If the driver is experiencing unexplained dropouts + * setting this FALSE might help. + * @param clockIsStable TRUE tells CoreAudio to use an agressive PLL to quickly lock to the engine's sample rate + * while FALSE tells CoreAudio to adjust more slowly to perceived sample rate changes that might just be the + * result of an unstable clock. + */ + virtual void setClockIsStable(bool clockIsStable ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + // OSMetaClassDeclareReservedUsed(IOAudioEngine, 7); + /*! + * @function setMixClipOverhead + * @abstract Used to tell IOAudioFamily when the watchdog timer must fire by. + * @discussion setMixClipOverhead allows an audio engine to tell IOAudioFamily how much time + * an engine will take to mix and clip its samples, in percent. + * The default value is 10, meaning 10%. This will cause IOAudioFamily to make + * the watchdog timer fire when there is just over 10% of the time to complete + * a buffer set left (e.g. 51 samples when the HAL is using a buffer size of 512 + * samples). + * @param newMixClipOverhead How much time per buffer should be made available for the + * mix and clip routines to run. Valid values are 1 through 99, inclusive. + * @result return no error + */ + virtual void setMixClipOverhead(UInt32 newMixClipOverhead ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + // OSMetaClassDeclareReservedUsed(IOAudioEngine, 8); + /*! + * @function setClockDomain + * @abstract Sets a property that CoreAudio uses to determine how devices are synchronized. If an audio device can tell that it is + * synchronized to another engine, it should set this value to that engine's clock domain. If an audio device can be a clock master, it may publish + * its own clock domain for other devices to use. + * @param clockDomain is the unique ID of another engine that this engine realizes it is synchronized to, use the default value kIOAudioNewClockDomain + * to have IOAudioEngine create a unique clock domain. + */ + virtual void setClockDomain(UInt32 clockDomain = kIOAudioNewClockDomain ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + // OSMetaClassDeclareReservedUsed(IOAudioEngine, 9); + /*! + * @function convertInputSamplesVBR + * @abstract Override this method if you want to return a different number of sample frames than was requested. + */ + virtual IOReturn convertInputSamplesVBR(const void *sampleBuf, void *destBuf, UInt32 firstSampleFrame, UInt32 &numSampleFrames, const IOAudioStreamFormat *streamFormat, IOAudioStream *audioStream ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + // OSMetaClassDeclareReservedUsed(IOAudioEngine, 10); + /*! + * @function setInputSampleOffset + * @abstract set the offset CoreAudio will read from off the current read pointer + * @param numSamples size of offset in sample + */ + virtual void setInputSampleOffset(UInt32 numSamples ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + // OSMetaClassDeclareReservedUsed(IOAudioEngine, 11); + /*! + * @function setOutputSampleOffset + * @abstract set the offset CoreAudio will write at off the current write pointer + * @param numSamples size of offset in sample + */ + virtual void setOutputSampleOffset(UInt32 numSamples ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + +protected: + + // OSMetaClassDeclareReservedUsed(IOAudioEngine, 12); + virtual IOReturn createUserClient(task_t task, void *securityID, UInt32 type, IOAudioEngineUserClient **newUserClient, OSDictionary *properties ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + +public: + + // OSMetaClassDeclareReservedUsed(IOAudioEngine, 13); + /*! + * @function setAttributeForConnection + * @abstract Generic method to set some attribute of the audio engine, specific to one connection. + * @discussion IOAudioEngine subclasses may implement this method to allow arbitrary attribute/value pairs to be set, specific to one connection. + * @param attribute Defines the attribute to be set. + * @param value The new value for the attribute. + * @result an IOReturn code. + */ + + virtual IOReturn setAttributeForConnection( SInt32 connectIndex, UInt32 attribute, uintptr_t value ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + // OSMetaClassDeclareReservedUsed(IOAudioEngine, 14); + /*! @function getAttributeForConnection + * @abstract Generic method to retrieve some attribute of the audio engine, specific to one connection. + * @discussion IOAudioEngine subclasses may implement this method to allow arbitrary attribute/value pairs to be returned, specific to one connection. + * @param attribute Defines the attribute to be returned. Some defined attributes are:
+ * @param value Returns the value for the attribute. + * @result an IOReturn code. + */ + + virtual IOReturn getAttributeForConnection( SInt32 connectIndex, UInt32 attribute, uintptr_t * value ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + +private: + OSMetaClassDeclareReservedUsed(IOAudioEngine, 0); + OSMetaClassDeclareReservedUsed(IOAudioEngine, 1); + OSMetaClassDeclareReservedUsed(IOAudioEngine, 2); + OSMetaClassDeclareReservedUsed(IOAudioEngine, 3); + OSMetaClassDeclareReservedUsed(IOAudioEngine, 4); + OSMetaClassDeclareReservedUsed(IOAudioEngine, 5); + OSMetaClassDeclareReservedUsed(IOAudioEngine, 6); + OSMetaClassDeclareReservedUsed(IOAudioEngine, 7); + OSMetaClassDeclareReservedUsed(IOAudioEngine, 8); + OSMetaClassDeclareReservedUsed(IOAudioEngine, 9); + OSMetaClassDeclareReservedUsed(IOAudioEngine, 10); + OSMetaClassDeclareReservedUsed(IOAudioEngine, 11); + OSMetaClassDeclareReservedUsed(IOAudioEngine, 12); + OSMetaClassDeclareReservedUsed(IOAudioEngine, 13); + OSMetaClassDeclareReservedUsed(IOAudioEngine, 14); + + OSMetaClassDeclareReservedUnused(IOAudioEngine, 15); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 16); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 17); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 18); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 19); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 20); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 21); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 22); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 23); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 24); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 25); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 26); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 27); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 28); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 29); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 30); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 31); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 32); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 33); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 34); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 35); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 36); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 37); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 38); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 39); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 40); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 41); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 42); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 43); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 44); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 45); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 46); + OSMetaClassDeclareReservedUnused(IOAudioEngine, 47); + +public: + /*! + * @function createDictionaryFromSampleRate + * @abstract Generates a dictionary matching the given sample rate. + * @discussion This is an internal routine used to generate a dictionary matching the given sample rate. It is used to generate a sample rate dictionary for the I/O Registry - used by the + * CoreAudio.framework. + * @result Returns the newly create OSDictionary. + */ + static OSDictionary *createDictionaryFromSampleRate(const IOAudioSampleRate *sampleRate, OSDictionary *rateDict = 0 ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function createSampleRateFromDictionary + * @abstract Generates a sample rate from an OSDictionary. + * @discussion This is an internal routine used to generate a sample rate from an OSDictionary. It is used to generate a sample rate give a new OSDictionary from the IORegistry - coming + * from the CoreAudio.framework. + * @result Returns the sample rate. + */ + static IOAudioSampleRate *createSampleRateFromDictionary(const OSDictionary *rateDict, IOAudioSampleRate *sampleRate = 0 ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function init + * @abstract Performs initialization of a newly allocated IOAudioEngine. + * @discussion This function is responsible for initialization of all of the general attributes of + * a new IOAudioEngine. It initializes instance variables to their default + * values and allocates the shared status buffer. Subclasses will likely want to override this method + * and do all of their common initialization in their implementation. They do need to be sure to call + * IOAudioEngine's implementation of init and pay attention to the return value. + * @param properties The default properties for the IOAudioEngine. + * @result Returns true if initialization was successful. + */ + virtual bool init(OSDictionary *properties ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function free + * @abstract Frees all of the resources allocated by the IOAudioEngine. + * @discussion Do not call this directly. This is called automatically by the system when the instance's + * refcount goes to 0. To decrement the refcount, call release() on the object. + */ + virtual void free( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function getWorkLoop + * @abstract Returns the IOWorkLoop for the driver. + */ + virtual IOWorkLoop *getWorkLoop() const; + + /*! + * @function getCommandGate + * @abstract Returns the IOCommandGate for this IOAudioEngine. + */ + virtual IOCommandGate *getCommandGate() const; + + /*! + * @function start + * @abstract A simple cover function for start(IOService *, IOAudioDevice *) that assumes the provider + * is the IOAudioDevice. + * @discussion Subclasses will want to override start(IOService *, IOAudioDevice *) rather than this + * one. + * @param provider The service provider for the IOAudioEngine (the IOAudioDevice in this case). + * @result Returns true if the IOAudioEngine was successfully started. + */ + virtual bool start(IOService *provider ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function start + * @abstract Standard IOKit start() routine called to start an IOService. + * @discussion This function is called in order to prepare the IOAudioEngine for use. It does NOT + * mean that the audio I/O engine itself should be started. This implementation gets the IOWorkLoop + * from the IOAudioDevice and allocates an IOCommandGate. Finally it calls initHardware() in which + * all of the subclass-specific device initialization should be done. Upon return from initHardware() + * all IOAudioStreams should be created and added to the audio engine. Also, all IOAudioControls + * for this IOAudioEngine should be created and attached. + * @param provider The service provider for the IOAudioEngine. + * @param device The IOAudioDevice to which this IOAudioEngine belongs. + * @result Returns true if the service was successfully started. + */ + virtual bool start(IOService *provider, IOAudioDevice *device ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function initHardware + * @abstract This function is called by start() to provide a convenient place for the subclass to + * perform its hardware initialization. + * @discussion Upon return from this function, all IOAudioStreams and IOAudioControls should be created + * and the audio engine should be ready to be started when a client requests that playback begin. + * @function provider The service provider numb for this audio engine - typically the IOAudioDevice. + * @result Returns true if the hardware was successfully initialized. + */ + virtual bool initHardware(IOService *provider ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function stop + * @abstract Stops the service and prepares for the driver to be terminated. + * @discussion This function is called before the driver is terminated and usually means that the device + * has been removed from the system. + * @param provider The service provider for the IOAudioEngine. + */ + virtual void stop(IOService *provider ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function registerService + * @abstract Called when this audio engine is ready to begin vending services. + * @discussion This function is called by IOAudioDevice::activateAudioEngine() once the audio engine + * has been fully initialized and is ready to begin audio playback. + * @param options + */ + virtual void registerService(IOOptionBits options = 0 ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void setAudioDevice(IOAudioDevice *device ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void setIndex(UInt32 index ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void setDescription(const char *description ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function newUserClient + * @abstract Requests a new user client object for this service. + * @discussion This function is called automatically by I/O Kit when a user process attempts + * to connect to this service. It allocates a new IOAudioEngineUserClient object and increments + * the number of connections for this audio engine. If this is the first user client for this IOAudioEngine, + * it calls startAudioEngine(). There is no need to call this function directly. + * A derived class that requires overriding of newUserClient should override the version with the properties + * parameter for Intel targets, and without the properties parameter for PPC targets. The #if __i386__ directive + * can be used to select between the two behaviors. + * @param task The task requesting the new user client. + * @param securityID Optional security paramater passed in by the client - ignored. + * @param type Optional user client type passed in by the client - ignored. + * @param handler The new IOUserClient * must be stored in this param on a successful completion. + * @param properties A dictionary of additional properties for the connection. + * @result Returns kIOReturnSuccess on success. May also result kIOReturnError or kIOReturnNoMemory. + */ + virtual IOReturn newUserClient(task_t task, void *securityID, UInt32 type, IOUserClient **handler ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn newUserClient(task_t task, void *securityID, UInt32 type, OSDictionary *properties, IOUserClient **handler ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function addAudioStream + * @abstract Adds an IOAudioStream to the audio engine. + * @discussion This function is called by the driver to add an IOAudioStream to the audio engine. This must be called at least once to make sure the audio engine has at least one IOAudioStream. + * @param stream The IOAudioStream to be added. + * @result Returns kIOReturnSuccess if the stream was successfully added. + */ + virtual IOReturn addAudioStream(IOAudioStream *stream ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOAudioStream *getAudioStream(IOAudioStreamDirection direction, UInt32 channelID ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void lockAllStreams( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void unlockAllStreams( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void updateChannelNumbers( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function resetStatusBuffer + * @abstract Resets the status buffer to its default values. + * @discussion This is called during startAudioEngine() and resumeAudioEngine() to clear out the status buffer + * in preparation of starting up the I/O engine. There is no need to call this directly. + */ + virtual void resetStatusBuffer( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function clearAllSampleBuffers + * @abstract Zeros out all of the sample and mix buffers associated with the IOAudioEngine + * @discussion This is called during resumeAudioEngine() since the audio engine gets started back at the + * beginning of the sample buffer. + */ + virtual void clearAllSampleBuffers( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function getCurrentSampleFrame + * @abstract Gets the current sample frame from the IOAudioEngine subclass. + * @result + */ + virtual UInt32 getCurrentSampleFrame() = 0; + + /*! + * @function startAudioEngine + * @abstract Starts the audio I/O engine. + * @discussion This method is called automatically when the audio engine is placed into use the first time. + * This must be overridden by the subclass. No call to the superclass's implementation is + * necessary. The subclass's implementation must start up the audio I/O engine. This includes any audio + * engine that needs to be started as well as any interrupts that need to be enabled. Upon successfully + * starting the engine, the subclass's implementation must call setState(kIOAudioEngineRunning). If + * it has also checked the state using getState() earlier in the implementation, the stateLock must be + * acquired for the entire initialization process (using IORecursiveLockLock(stateLock) and + * IORecursiveLockUnlock(stateLock)) to ensure that the state remains consistent. See the general class + * comments for an example. + * @result Must return kIOReturnSuccess on a successful start of the engine. + */ + virtual IOReturn startAudioEngine( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function stopAudioEngine + * @abstract Stops the audio I/O engine. + * @discussion This method is called automatically when the last client disconnects from this audio engine. + * It must be overridden by the subclass. No call to the superclass's implementation is necessary. + * The subclass's implementation must stop the audio I/O engine. The audio engine (if it exists) should + * be stopped and any interrupts disabled. Upon successfully stopping the engine, the subclass must call + * setState(kAudioEngineStopped). If it has also checked the state using getState() earlier in the + * implementation, the stateLock must be acquired for the entire initialization process (using + * IORecursiveLockLock(stateLock) and IORecursiveLockUnlock(stateLock)) to ensure that the state remains + * consistent. + * @result Must return kIOReturnSuccess on a successful stop of the engine. + */ + virtual IOReturn stopAudioEngine( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn pauseAudioEngine( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn resumeAudioEngine( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function performAudioEngineStart + * @abstract Called to start the audio I/O engine + * @discussion This method is called by startAudioEngine(). This must be overridden by the subclass. + * No call to the superclass' implementation is necessary. The subclass' implementation must start up the + * audio I/O engine. This includes any audio engine that needs to be started as well as any interrupts + * that need to be enabled. + * @result Must return kIOReturnSuccess on a successful start of the engine. + */ + virtual IOReturn performAudioEngineStart( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function performAudioEngineStop + * @abstract Called to stop the audio I/O engine + * @discussion This method is called by stopAudioEngine() and pauseAudioEngine. + * This must be overridden by the subclass. No call to the superclass' implementation is + * necessary. The subclass' implementation must stop the audio I/O engine. This includes any audio + * engine that needs to be stopped as well as any interrupts that need to be disabled. + * @result Must return kIOReturnSuccess on a successful stop of the engine. + */ + virtual IOReturn performAudioEngineStop( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function getState + * @abstract Returns the current state of the IOAudioEngine. + * @discussion If this method is called in preparation for calling setState(), the stateLock must + * be acquired before the first call to getState() and held until after the last call to setState(). + * Be careful not to return from the code acquiring the lock while the lock is being held. That + * will cause a deadlock situation. + * @result The current state of the IOAudioEngine: kIOAudioEngineRunning, kIOAudioEngineStopped. + */ + virtual IOAudioEngineState getState( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function getSampleRate + * @abstract Returns the sample rate of the IOAudioEngine in samples per second. + */ + virtual const IOAudioSampleRate *getSampleRate( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOReturn hardwareSampleRateChanged(const IOAudioSampleRate *sampleRate ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function getRunEraseHead + * @abstract Returns true if the audio engine will run the erase head when the audio engine is running. + */ + virtual bool getRunEraseHead( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function getStatus + * @abstract Returns a pointer to the shared status buffer. + */ + virtual const IOAudioEngineStatus *getStatus( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function timerCallback + * @abstract A static method used as a callback for the IOAudioDevice timer services. + * @discussion This method implements the IOAudioDevice::TimerEvent type. + * @param arg1 The IOAudioEngine that is the target of the event. + * @param device The IOAudioDevice that sent the timer event. + */ + static void timerCallback(OSObject *arg1, IOAudioDevice *device ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function timerFired + * @abstract Indicates the timer has fired. + * @discussion This method is called by timerCallback to indicate the timer has fired. This method calls performErase() and performFlush() to do erase head processing and + * audio engine flushing each time the timer event fires. + */ + virtual void timerFired( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function getTimerInterval + * @abstract Gets the timer interval for use by the timer event. + * @discussion This method is called each time the timer event is enabled through addTimer(). The default + * implementation is set to return a value such that the timer event runs n times each cycle of the audio + * engine through the sample buffer. The value n is stored as the instance variable: numErasesPerBuffer. + * The default value of numErasesPerBuffer is set to IOAUDIOENGINE_DEFAULT_NUM_ERASES_PER_BUFFER which is 4. + * A subclass may change the value of numErasesPerBuffer or override getTimerInterval. If it is overridden, + * the subclass should call the superclass's implementation, compare its interval with the superclass's and + * return the smaller of the two. + * @result Returns the interval for the timer event. + */ + virtual AbsoluteTime getTimerInterval( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function performErase + * @abstract Performs erase head processing. + * @discussion This method is called automatically each time the timer event fires and erases the sample + * buffer and mix buffer from the previous location up to the current location of the audio engine. + */ + virtual void performErase( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function performFlush + * @abstract Performs the flush operation. + * @discussion This method is called automatically each time the timer event fires. It stops the audio engine + * if there are no more clients and the audio engine is passed the latest flush ending position. + */ + virtual void performFlush( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void stopEngineAtPosition(IOAudioEnginePosition *endingPosition ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOReturn mixOutputSamples(const void *sourceBuf, void *mixBuf, UInt32 firstSampleFrame, UInt32 numSampleFrames, const IOAudioStreamFormat *streamFormat, IOAudioStream *audioStream ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn clipOutputSamples(const void *mixBuf, void *sampleBuf, UInt32 firstSampleFrame, UInt32 numSampleFrames, const IOAudioStreamFormat *streamFormat, IOAudioStream *audioStream ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void resetClipPosition(IOAudioStream *audioStream, UInt32 clipSampleFrame ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn convertInputSamples(const void *sampleBuf, void *destBuf, UInt32 firstSampleFrame, UInt32 numSampleFrames, const IOAudioStreamFormat *streamFormat, IOAudioStream *audioStream ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void takeTimeStamp(bool incrementLoopCount = true, AbsoluteTime *timestamp = NULL ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn getLoopCountAndTimeStamp(UInt32 *loopCount, AbsoluteTime *timestamp ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOReturn calculateSampleTimeout(AbsoluteTime *sampleInterval, UInt32 numSampleFrames, IOAudioEnginePosition *startingPosition, AbsoluteTime *wakeupTime ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOReturn performFormatChange(IOAudioStream *audioStream, const IOAudioStreamFormat *newFormat, const IOAudioSampleRate *newSampleRate ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void beginConfigurationChange( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void completeConfigurationChange( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void cancelConfigurationChange( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOReturn addDefaultAudioControl(IOAudioControl *defaultAudioControl ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn removeDefaultAudioControl(IOAudioControl *defaultAudioControl ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void removeAllDefaultAudioControls( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual OSString *getGlobalUniqueID( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual OSString *getLocalUniqueID( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + +protected: + + /*! + * @function initKeys + * @abstract Generates the OSSymbols with the keys. + * @discussion Do not call this directly. This is an internal initialization routine. + */ + static void initKeys( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void setNumSampleFramesPerBuffer(UInt32 numSampleFrames ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual UInt32 getNumSampleFramesPerBuffer( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function setState + * @abstract Indicates that the audio engine is in the specified state. + * @discussion This method simply sets the internal state of the audio engine to the specified state. It does not + * affect a change to the state. It does however keep other internal state-related attributes consistent. + * For example, it enables or disables the timer as needed when the state changes to running or stopped. + * @param newState The state the audio engine is in. + * @result Returns the old state. + */ + virtual IOAudioEngineState setState(IOAudioEngineState newState ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function setSampleRate + * @abstract Records the sample rate of the audio engine. + * @discussion This method must be called during initialization of a new audio engine to record the audio engine's + * initial sample rate. It also is intended to be used to record changes to the sample rate during use. + * Currently changing sample rates after the audio engine has been started is not supported. + * It may require that the sample buffers be re-sized. This will be available in an upcoming release. + * @param newSampleRate The sample rate of the audio engine in samples per second. + */ + virtual void setSampleRate(const IOAudioSampleRate *newSampleRate ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function setSampleLatency + * @abstract Sets the sample latency for the audio engine. + * @discussion The sample latency represents the number of samples ahead of the playback head + * that it is safe to write into the sample buffer. The audio device API will never write + * closer to the playback head than the number of samples specified. For input audio engines + * the number of samples is behind the record head. + */ + virtual void setSampleLatency(UInt32 numSamples ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void setOutputSampleLatency(UInt32 numSamples ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void setInputSampleLatency(UInt32 numSamples ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void setSampleOffset(UInt32 numSamples ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function setRunEraseHead + * @abstract Tells the audio engine whether or not to run the erase head. + * @discussion By default, output audio engines run the erase head and input audio engines do not. This method can + * be called after setDirection() is called in order to change the default behavior. + * @param runEraseHead The audio engine will run the erase head if this value is true. + */ + virtual void setRunEraseHead(bool runEraseHead ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function clientClosed + * @abstract Called automatically when a user client closes its connection to the audio engine. + * @discussion This method decrements the number of connections to the audio engine and if they reach + * zero, the audio engine is called with a call to stopAudioEngine(). This method should not be called directly. + * @param client The user client that has disconnected. + */ + virtual void clientClosed(IOAudioEngineUserClient *client ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function addTimer + * @abstract Enables the timer event for the audio engine. + * @discussion There is a timer event needed by the IOAudioEngine for processing the erase head + * and performing flushing operations. When the timer fires, the method timerFired() is ultimately + * called which in turn calls performErase() and performFlush(). This is called automatically + * to enable the timer event for this audio engine. It is called by setState() when the audio engine state + * is set to kIOAudioEngineRunning. When the timer is no longer needed, removeTimer() is called. + * There is no need to call this directly. + */ + virtual void addTimer( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function removeTimer + * @abstract Disables the timer event for the audio engine. + * @discussion This method is called automatically to disable the timer event for this audio engine. + * There is need to call it directly. This method is called by setState() when the audio engine state + * is changed from kIOAudioEngineRunning to one of the stopped states. + */ + virtual void removeTimer( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void sendFormatChangeNotification(IOAudioStream *audioStream ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void sendNotification(UInt32 notificationType ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOReturn createUserClient(task_t task, void *securityID, UInt32 type, IOAudioEngineUserClient **newUserClient ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + static IOReturn _addUserClientAction(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3 ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; // + static IOReturn addUserClientAction(OSObject *owner, void *arg1, void *arg2, void *arg3, void *arg4 ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + static IOReturn _removeUserClientAction(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3 ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; // + static IOReturn removeUserClientAction(OSObject *owner, void *arg1, void *arg2, void *arg3, void *arg4 ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + static IOReturn detachUserClientsAction(OSObject *owner, void *arg1, void *arg2, void *arg3, void *arg4 ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOReturn addUserClient(IOAudioEngineUserClient *newUserClient ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn removeUserClient(IOAudioEngineUserClient *userClient ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn detachUserClients( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOReturn startClient(IOAudioEngineUserClient *userClient ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn stopClient(IOAudioEngineUserClient *userClient ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOReturn incrementActiveUserClients( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn decrementActiveUserClients( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void detachAudioStreams( ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + void setWorkLoopOnAllAudioControls(IOWorkLoop *wl ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + static inline void lockStreamForIO(IOAudioStream *stream ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + static inline void unlockStreamForIO(IOAudioStream *stream ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + // These aren't virtual by design + UInt32 getNextStreamID(IOAudioStream * newStream ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + IOAudioStream * getStreamForID(UInt32 streamID ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + IOReturn waitForEngineResume ( void ); // + + static void setCommandGateUsage(IOAudioEngine *engine, bool increment ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; // + +}; + +#endif /* _IOKIT_IOAUDIOENGINE_H */ diff --git a/QualcommWireless/include/IOKit/audio/IOAudioEngineUserClient.h b/QualcommWireless/include/IOKit/audio/IOAudioEngineUserClient.h new file mode 100644 index 0000000..e8a80ef --- /dev/null +++ b/QualcommWireless/include/IOKit/audio/IOAudioEngineUserClient.h @@ -0,0 +1,287 @@ +/* + * Copyright (c) 1998-2014 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOAUDIOENGINEUSERCLIENT_H +#define _IOKIT_IOAUDIOENGINEUSERCLIENT_H + +#include +#include + +#ifndef IOAUDIOFAMILY_SELF_BUILD +#include +#include +#else +#include "IOAudioEngine.h" +#include "IOAudioTypes.h" +#endif +#include + +class IOAudioEngine; +class IOAudioStream; +class IOMemoryDescriptor; +class IOCommandGate; +class IOWorkLoop; + +class IOAudioEngineUserClient; +class IOAudioClientBufferSet; +struct IOAudioFormatNotification; + + +#define kDriverHelper_DriverHostEntitlement "com.apple.private.audio.driver-host" // XXX copied from AudioHAL/DriverHelper/DriverHelper.h + +typedef struct IOAudioClientBuffer +{ + IOAudioEngineUserClient *userClient; + IOAudioStream *audioStream; + void *sourceBuffer; + IOMemoryDescriptor *sourceBufferDescriptor; + IOMemoryMap *sourceBufferMap; + void *unmappedSourceBuffer; + UInt32 numSampleFrames; + UInt32 numChannels; + IOAudioEnginePosition mixedPosition; + struct IOAudioClientBuffer *mNextBuffer32; + struct IOAudioClientBuffer *nextClip; + struct IOAudioClientBuffer *previousClip; + struct IOAudioClientBuffer *nextClient; + IOAudioBufferDataDescriptor *bufferDataDescriptor; +} IOAudioClientBuffer; + +/* IOAudioClientBuffer64 added for binary compatibility with old PPC drivers covered by */ +typedef struct IOAudioClientBuffer64 +{ + IOAudioClientBuffer mAudioClientBuffer32; + mach_vm_address_t mUnmappedSourceBuffer64; + struct IOAudioClientBuffer64 *mNextBuffer64; +} IOAudioClientBuffer64; + +typedef struct IOAudioClientBufferExtendedInfo +{ + // Added stuff for registerClientParameterBuffer + UInt32 bufferSetID; + void *paramBuffer; + IOMemoryDescriptor *paramBufferDescriptor; + IOMemoryMap *paramBufferMap; + void *unmappedParamBuffer; + struct IOAudioClientBufferExtendedInfo *mNextExtended; +} IOAudioClientBufferExtendedInfo; + +/* IOAudioClientBufferExtendedInfo64 added for binary compatibility with old PPC drivers covered by */ +typedef struct IOAudioClientBufferExtendedInfo64 +{ + IOAudioClientBufferExtendedInfo mAudioClientBufferExtended32; + mach_vm_address_t mUnmappedParamBuffer64; + struct IOAudioClientBufferExtendedInfo64 *mNextExtended64; +} IOAudioClientBufferExtendedInfo64; + + +class IOAudioEngineUserClient : public IOUserClient +{ + OSDeclareDefaultStructors(IOAudioEngineUserClient) + + friend class IOAudioEngine; + friend class IOAudioClientBufferSet; + friend class IOAudioStream; + +protected: + IOAudioEngine *audioEngine; + + IOWorkLoop *workLoop; + IOCommandGate *commandGate; + + IOExternalMethod old_methods[5]; // It's size can't be changed for binary compatibility reasons, no longer used. + IOExternalTrap trap; + + task_t clientTask; + UInt32 numSampleFrames; // Never used... + + IOAudioClientBufferSet *clientBufferSetList; + IORecursiveLock *clientBufferLock; + + IOAudioNotificationMessage *notificationMessage; + + bool online; + +protected: + struct ExpansionData { + IOAudioClientBufferExtendedInfo64 *extendedInfo; + UInt32 classicMode; + UInt32 commandGateStatus; // + SInt32 commandGateUsage; // + UInt32 connectionID; + }; + +// START + ExpansionData *reserved; + +public: + virtual IOReturn externalMethod( uint32_t selector, IOExternalMethodArguments * arguments, IOExternalMethodDispatch * dispatch, + OSObject * target, void * reference) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // New code added here... + // OSMetaClassDeclareReservedUsed(IOAudioEngineUserClient, 0); + virtual IOReturn registerClientParameterBuffer (void * parameterBuffer, UInt32 bufferSetID) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; // unused function + // OSMetaClassDeclareReservedUsed(IOAudioEngineUserClient, 1); + virtual IOAudioClientBufferExtendedInfo * findExtendedInfo(UInt32 bufferSetID) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioEngineUserClient, 2); + virtual IOReturn getNearestStartTime(IOAudioStream *audioStream, IOAudioTimeStamp *ioTimeStamp, UInt32 isInput) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioEngineUserClient, 3); + virtual IOReturn getClientNearestStartTime(IOAudioStream *audioStream, IOAudioTimeStamp *ioTimeStamp, UInt32 isInput) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioEngineUserClient, 4); + virtual IOReturn safeRegisterClientBuffer(UInt32 audioStreamIndex, void * sourceBuffer, UInt32 bufSizeInBytes, UInt32 bufferSetID) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioEngineUserClient, 5); + virtual bool initWithAudioEngine(IOAudioEngine *engine, task_t task, void *securityToken, UInt32 type, OSDictionary *properties) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioEngineUserClient, 6); + virtual IOReturn safeRegisterClientBuffer64(UInt32 audioStreamIndex, mach_vm_address_t * sourceBuffer, UInt32 bufSizeInBytes, UInt32 bufferSetID) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioEngineUserClient, 7); + virtual IOReturn registerClientBuffer64(IOAudioStream *audioStream, mach_vm_address_t sourceBuffer, UInt32 bufSizeInBytes, UInt32 bufferSetID) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioEngineUserClient, 8); + virtual IOReturn registerBuffer64(IOAudioStream *audioStream, mach_vm_address_t sourceBuffer, UInt32 bufSizeInBytes, UInt32 bufferSetID) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioEngineUserClient, 9); + virtual IOReturn unregisterBuffer64(mach_vm_address_t sourceBuffer, UInt32 bufferSetID) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioEngineUserClient, 10); + virtual IOReturn unregisterClientBuffer64(mach_vm_address_t * sourceBuffer, UInt32 bufferSetID) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioEngineUserClient, 11); + virtual IOAudioClientBufferExtendedInfo64 * findExtendedInfo64(UInt32 bufferSetID) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + + +private: + OSMetaClassDeclareReservedUsed(IOAudioEngineUserClient, 0); + OSMetaClassDeclareReservedUsed(IOAudioEngineUserClient, 1); + OSMetaClassDeclareReservedUsed(IOAudioEngineUserClient, 2); + OSMetaClassDeclareReservedUsed(IOAudioEngineUserClient, 3); + OSMetaClassDeclareReservedUsed(IOAudioEngineUserClient, 4); + OSMetaClassDeclareReservedUsed(IOAudioEngineUserClient, 5); + OSMetaClassDeclareReservedUsed(IOAudioEngineUserClient, 6); + OSMetaClassDeclareReservedUsed(IOAudioEngineUserClient, 7); + OSMetaClassDeclareReservedUsed(IOAudioEngineUserClient, 8); + OSMetaClassDeclareReservedUsed(IOAudioEngineUserClient, 9); + OSMetaClassDeclareReservedUsed(IOAudioEngineUserClient, 10); + OSMetaClassDeclareReservedUsed(IOAudioEngineUserClient, 11); + + + OSMetaClassDeclareReservedUnused(IOAudioEngineUserClient, 12); + OSMetaClassDeclareReservedUnused(IOAudioEngineUserClient, 13); + OSMetaClassDeclareReservedUnused(IOAudioEngineUserClient, 14); + OSMetaClassDeclareReservedUnused(IOAudioEngineUserClient, 15); + OSMetaClassDeclareReservedUnused(IOAudioEngineUserClient, 16); + OSMetaClassDeclareReservedUnused(IOAudioEngineUserClient, 17); + OSMetaClassDeclareReservedUnused(IOAudioEngineUserClient, 18); + OSMetaClassDeclareReservedUnused(IOAudioEngineUserClient, 19); + OSMetaClassDeclareReservedUnused(IOAudioEngineUserClient, 20); + OSMetaClassDeclareReservedUnused(IOAudioEngineUserClient, 21); + OSMetaClassDeclareReservedUnused(IOAudioEngineUserClient, 22); + OSMetaClassDeclareReservedUnused(IOAudioEngineUserClient, 23); + OSMetaClassDeclareReservedUnused(IOAudioEngineUserClient, 24); + OSMetaClassDeclareReservedUnused(IOAudioEngineUserClient, 25); + OSMetaClassDeclareReservedUnused(IOAudioEngineUserClient, 26); + OSMetaClassDeclareReservedUnused(IOAudioEngineUserClient, 27); + OSMetaClassDeclareReservedUnused(IOAudioEngineUserClient, 28); + OSMetaClassDeclareReservedUnused(IOAudioEngineUserClient, 29); + OSMetaClassDeclareReservedUnused(IOAudioEngineUserClient, 30); + OSMetaClassDeclareReservedUnused(IOAudioEngineUserClient, 31); + +protected: + virtual IOReturn clientClose() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn clientDied() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + static IOReturn _closeClientAction(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; // + static IOReturn closeClientAction(OSObject *owner, void *arg1, void *arg2, void *arg3, void *arg4) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn closeClient() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + + virtual IOReturn clientMemoryForType(UInt32 type, UInt32 *flags, IOMemoryDescriptor **memory) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOExternalMethod *getExternalMethodForIndex(UInt32 index) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOExternalTrap *getExternalTrapForIndex(UInt32 index) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn registerNotificationPort(mach_port_t port, UInt32 type, UInt32 refCon) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + static IOReturn _registerNotificationAction(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; // + static IOReturn registerNotificationAction(OSObject *owner, void *arg1, void *arg2, void *arg3, void *arg4) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn registerNotification(mach_port_t port, UInt32 refCon) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void setOnline(bool newOnline) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOReturn performClientOutput(UInt32 firstSampleFrame, UInt32 loopCount, IOAudioClientBufferSet *bufferSet, UInt32 sampleIntervalHi, UInt32 sampleIntervalLo) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn performClientInput(UInt32 firstSampleFrame, IOAudioClientBufferSet *bufferSet) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void performWatchdogOutput(IOAudioClientBufferSet *clientBufferSet, UInt32 generationCount) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void lockBuffers() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void unlockBuffers() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + static void setCommandGateUsage(IOAudioEngineUserClient *userClient, bool increment) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; // + +public: + + static IOAudioEngineUserClient *withAudioEngine(IOAudioEngine *engine, task_t clientTask, void *securityToken, UInt32 type) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + static IOAudioEngineUserClient *withAudioEngine(IOAudioEngine *engine, task_t clientTask, void *securityToken, UInt32 type, OSDictionary *properties) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual bool initWithAudioEngine(IOAudioEngine *engine, task_t task, void *securityToken, UInt32 type) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void free() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void freeClientBufferSetList() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void freeClientBuffer(IOAudioClientBuffer64 *clientBuffer) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void stop(IOService *provider) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual bool isOnline() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOReturn registerBuffer(IOAudioStream *audioStream, void* sourceBuffer, UInt32 bufSizeInBytes, UInt32 bufferSetID) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn unregisterBuffer( void * sourceBuffer, UInt32 bufferSetID) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + static IOReturn _registerBufferAction(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; // + static IOReturn registerBufferAction(OSObject *owner, void *arg1, void *arg2, void *arg3, void *arg4) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + static IOReturn _unregisterBufferAction(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; // + static IOReturn unregisterBufferAction(OSObject *owner, void *arg1, void *arg2, void *arg3, void *arg4) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOReturn registerClientBuffer(IOAudioStream *audioStream, void * sourceBuffer, UInt32 bufSizeInBytes, UInt32 bufferSetID) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn unregisterClientBuffer(void * sourceBuffer, UInt32 bufferSetID) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + static IOReturn _getNearestStartTimeAction(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; // + static IOReturn getNearestStartTimeAction(OSObject *owner, void *arg1, void *arg2, void *arg3, void *arg4) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOAudioClientBufferSet *findBufferSet(UInt32 bufferSetID) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void removeBufferSet(IOAudioClientBufferSet *bufferSet) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOReturn getConnectionID(UInt32 *connectionID) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOReturn clientStart() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn clientStop() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + static IOReturn _startClientAction(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; // + static IOReturn startClientAction(OSObject *owner, void *arg1, void *arg2, void *arg3, void *arg4) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + static IOReturn _stopClientAction(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; // + static IOReturn stopClientAction(OSObject *owner, void *arg1, void *arg2, void *arg3, void *arg4) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOReturn startClient() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn stopClient() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOReturn performClientIO(UInt32 firstSampleFrame, UInt32 loopCount, bool inputIO, UInt32 bufferSetID, UInt32 sampleIntervalHi, UInt32 sampleIntervalLo) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void sendFormatChangeNotification(IOAudioStream *audioStream) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn sendNotification(UInt32 notificationType) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + +}; + +// END + + +#endif /* _IOKIT_IOAUDIOENGINEUSERCLIENT_H */ diff --git a/QualcommWireless/include/IOKit/audio/IOAudioLevelControl.h b/QualcommWireless/include/IOKit/audio/IOAudioLevelControl.h new file mode 100644 index 0000000..2209594 --- /dev/null +++ b/QualcommWireless/include/IOKit/audio/IOAudioLevelControl.h @@ -0,0 +1,207 @@ +/* + * Copyright (c) 1998-2014 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOAUDIOLEVELCONTROL_H +#define _IOKIT_IOAUDIOLEVELCONTROL_H + +#include + +#ifndef IOAUDIOFAMILY_SELF_BUILD +#include +#else +#include "IOAudioControl.h" +#endif + +class OSArray; + +/*! + * @class IOAudioLevelControl + * @abstract + * @discussion + */ + +class IOAudioLevelControl : public IOAudioControl +{ + OSDeclareDefaultStructors(IOAudioLevelControl) + +protected: + SInt32 minValue; + SInt32 maxValue; + IOFixed minDB; + IOFixed maxDB; + + OSArray *ranges; + +protected: + struct ExpansionData { }; + + ExpansionData *reserved; + +public: + static IOAudioLevelControl *createPassThruVolumeControl (SInt32 initialValue, + SInt32 minValue, + SInt32 maxValue, + IOFixed minDB, + IOFixed maxDB, + UInt32 channelID, + const char *channelName, + UInt32 cntrlID) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + // OSMetaClassDefineReservedUnused(IOAudioLevelControl, 0); + /*! + * @function setLinearScale + * @abstract This function tells CoreAudio if it should apply a curve to the scaler representation of the volume. + * @param useLinearScale TRUE instructs CoreAudio to not apply a curve to the scaler representation of the volume, + * FALSE instructs CoreAudio to apply a curve, which is CoreAudio's default behavior. + */ + virtual void setLinearScale(bool useLinearScale) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + +private: + OSMetaClassDeclareReservedUsed(IOAudioLevelControl, 0); + + OSMetaClassDeclareReservedUnused(IOAudioLevelControl, 1); + OSMetaClassDeclareReservedUnused(IOAudioLevelControl, 2); + OSMetaClassDeclareReservedUnused(IOAudioLevelControl, 3); + OSMetaClassDeclareReservedUnused(IOAudioLevelControl, 4); + OSMetaClassDeclareReservedUnused(IOAudioLevelControl, 5); + OSMetaClassDeclareReservedUnused(IOAudioLevelControl, 6); + OSMetaClassDeclareReservedUnused(IOAudioLevelControl, 7); + OSMetaClassDeclareReservedUnused(IOAudioLevelControl, 8); + OSMetaClassDeclareReservedUnused(IOAudioLevelControl, 9); + OSMetaClassDeclareReservedUnused(IOAudioLevelControl, 10); + OSMetaClassDeclareReservedUnused(IOAudioLevelControl, 11); + OSMetaClassDeclareReservedUnused(IOAudioLevelControl, 12); + OSMetaClassDeclareReservedUnused(IOAudioLevelControl, 13); + OSMetaClassDeclareReservedUnused(IOAudioLevelControl, 14); + OSMetaClassDeclareReservedUnused(IOAudioLevelControl, 15); + +public: + /*! + * @function create + * @abstract Allocates a new level control with the given attributes + * @param initialValue The initial value of the control + * @param minValue The lowest possible value the control may have + * @param maxValue The highest possible value the control may have + * @param minDB A fixed point representation of the db value matching minValue + * @param maxDB A fixed point representation of the db value matching maxValue + * @param channelID The ID of the channel(s) that the control acts on. Common IDs are located in IOAudioTypes.h. + * @param channelName An optional name for the channel. Common names are located in IOAudioTypes.h. + * @param cntrlID An optional ID for the control that can be used to uniquely identify controls. + * @result Returns a newly allocted and initialized level IOAudioControl + */ + static IOAudioLevelControl *create(SInt32 initialValue, + SInt32 minValue, + SInt32 maxValue, + IOFixed minDB, + IOFixed maxDB, + UInt32 channelID, + const char *channelName = 0, + UInt32 cntrlID = 0, + UInt32 subType = 0, + UInt32 usage = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + static IOAudioLevelControl *createVolumeControl(SInt32 initialValue, + SInt32 minValue, + SInt32 maxValue, + IOFixed minDB, + IOFixed maxDB, + UInt32 channelID, + const char *channelName = 0, + UInt32 cntrlID = 0, + UInt32 usage = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function init + * @abstract Initializes a newly allocated IOAudioLevelControl with the given attributes + * @param initialValue The initial value of the control + * @param minValue The lowest possible value the control may have + * @param maxValue The highest possible value the control may have + * @param minDB A fixed point representation of the db value matching minValue + * @param maxDB A fixed point representation of the db value matching maxValue + * @param channelID The ID of the channel(s) that the control acts on. Common IDs are located in IOAudioTypes.h. + * @param channelName An optional name for the channel. Common names are located in IOAudioTypes.h. + * @param cntrlID An optional ID for the control that can be used to uniquely identify controls. + * @param properties Standard property list passed to the init() function of any new IOService. This dictionary + * gets stored in the registry entry for this service. + * @result Returns true on success + */ + virtual bool init(SInt32 initialValue, + SInt32 minValue, + SInt32 maxValue, + IOFixed minDB, + IOFixed maxDB, + UInt32 channelID, + const char *channelName = 0, + UInt32 cntrlID = 0, + UInt32 subType = 0, + UInt32 usage = 0, + OSDictionary *properties = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void free() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function setMinValue + * @abstract Sets the minimum value the control may have + * @param minValue The minimum value for the control + */ + virtual void setMinValue(SInt32 minValue) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual SInt32 getMinValue() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function setMaxValue + * @abstract Sets the maximum value the control may have + * @param maxValue The maximum value for the control + */ + virtual void setMaxValue(SInt32 maxValue) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual SInt32 getMaxValue() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function setMinDB + * @abstract Sets the minimum value in db that the control may have + * @discussion This value is represented as an IOFixed value which is a fixed point number. The IOFixed + * type is a 16.16 fixed point value. + * @param minDB The minimum value in db for the control + */ + virtual void setMinDB(IOFixed minDB) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOFixed getMinDB() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function setMaxDB + * @abstract Sets the maximum value in db that the control may have + * @discussion This value is represented as an IOFixed value which is a fixed point number. The IOFixed + * type is a 16.16 fixed point value. + * @param maxDB The maximum value in db for the control + */ + virtual void setMaxDB(IOFixed maxDB) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOFixed getMaxDB() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOReturn addRange(SInt32 minValue, SInt32 maxValue, IOFixed minDB, IOFixed maxDB) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn addNegativeInfinity(SInt32 negativeInfinityValue) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOReturn validateValue(OSObject *newValue) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; +}; + +#endif /* _IOKIT_IOAUDIOLEVELCONTROL_H */ diff --git a/QualcommWireless/include/IOKit/audio/IOAudioPort.h b/QualcommWireless/include/IOKit/audio/IOAudioPort.h new file mode 100644 index 0000000..a8be7ac --- /dev/null +++ b/QualcommWireless/include/IOKit/audio/IOAudioPort.h @@ -0,0 +1,185 @@ +/* + * Copyright (c) 1998-2014 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOAUDIOPORT_H +#define _IOKIT_IOAUDIOPORT_H + +#include +#include + +class IOAudioDevice; +class IOAudioControl; +class OSDictionary; + +/*! + * @class IOAudioPort + * @abstract Represents a logical or physical port or functional unit in an audio device. + * @discussion An IOAudioPort represents an element in the signal chain in the audio device. It may contain + * one or more controls (represented by IOAudioControl) by which different attributes of the port may be + * represented and adjusted. + * + * IOAudioPort objects are connected up in the IORegistry in the IOAudioPlane to represent the signal chain of + * the device. They may be connected to other IOAudioPorts as well as IOAudioEngines to indicate they either + * feed into or are fed by one of the audio engines (i.e. they provide input to or take output from the computer). + */ +class IOAudioPort : public IOService +{ + friend class IOAudioDevice; + + OSDeclareDefaultStructors(IOAudioPort) + +public: + /* @var audioDevice The IOAudioDevice that this IOAudioPort belongs to. */ + IOAudioDevice * audioDevice; + /* @var audioControls A set containg all of the IOAudioControl instances that belong to the port. */ + OSSet * audioControls; + bool isRegistered; + +protected: + struct ExpansionData { }; + + ExpansionData *reserved; + +private: + OSMetaClassDeclareReservedUnused(IOAudioPort, 0); + OSMetaClassDeclareReservedUnused(IOAudioPort, 1); + OSMetaClassDeclareReservedUnused(IOAudioPort, 2); + OSMetaClassDeclareReservedUnused(IOAudioPort, 3); + OSMetaClassDeclareReservedUnused(IOAudioPort, 4); + OSMetaClassDeclareReservedUnused(IOAudioPort, 5); + OSMetaClassDeclareReservedUnused(IOAudioPort, 6); + OSMetaClassDeclareReservedUnused(IOAudioPort, 7); + OSMetaClassDeclareReservedUnused(IOAudioPort, 8); + OSMetaClassDeclareReservedUnused(IOAudioPort, 9); + OSMetaClassDeclareReservedUnused(IOAudioPort, 10); + OSMetaClassDeclareReservedUnused(IOAudioPort, 11); + OSMetaClassDeclareReservedUnused(IOAudioPort, 12); + OSMetaClassDeclareReservedUnused(IOAudioPort, 13); + OSMetaClassDeclareReservedUnused(IOAudioPort, 14); + OSMetaClassDeclareReservedUnused(IOAudioPort, 15); + OSMetaClassDeclareReservedUnused(IOAudioPort, 16); + OSMetaClassDeclareReservedUnused(IOAudioPort, 17); + OSMetaClassDeclareReservedUnused(IOAudioPort, 18); + OSMetaClassDeclareReservedUnused(IOAudioPort, 19); + OSMetaClassDeclareReservedUnused(IOAudioPort, 20); + OSMetaClassDeclareReservedUnused(IOAudioPort, 21); + OSMetaClassDeclareReservedUnused(IOAudioPort, 22); + OSMetaClassDeclareReservedUnused(IOAudioPort, 23); + OSMetaClassDeclareReservedUnused(IOAudioPort, 24); + OSMetaClassDeclareReservedUnused(IOAudioPort, 25); + OSMetaClassDeclareReservedUnused(IOAudioPort, 26); + OSMetaClassDeclareReservedUnused(IOAudioPort, 27); + OSMetaClassDeclareReservedUnused(IOAudioPort, 28); + OSMetaClassDeclareReservedUnused(IOAudioPort, 29); + OSMetaClassDeclareReservedUnused(IOAudioPort, 30); + OSMetaClassDeclareReservedUnused(IOAudioPort, 31); + +public: + /*! + * @function withAttributes + * @abstract Allocates a new IOAudioPort instance with the given attributes + * @discussion This static method allocates a new IOAudioPort and calls initWithAttributes() on it with + * the parameters passed in to it. + * @param portType A readable string representing the type of port. Common port types are defined in + * IOAudioTypes.h and are prefixed with 'kIOAudioPortType'. Please provide feedback if there are + * other common port types that should be included. + * @param portName A readable string representing the name of the port. For example: 'Internal Speaker', + * 'Line Out'. This field is optional, but useful for providing information to the application/user. + * @param subType Developer defined readable string representing a subtype for the port. (optional) + * @param properties Standard property list passed to the init of any new IOService. This dictionary + * gets stored in the registry for this instance. (optional) + * @result Returns the newly allocated and initialized IOAudioPort instance. + */ + static IOAudioPort *withAttributes(UInt32 portType, const char *portName = 0, UInt32 subType = 0, OSDictionary *properties = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function initWithAttributes + * @abstract Initializes a newly allocated IOAudioPort instance with the given attributes + * @discussion The properties parameter is passed on the superclass' init(). The portType, subType + * and properties parameters are optional, however portType is recommended. + * @param portType A readable string representing the type of port. Common port types are defined in + * IOAudioTypes.h and are prefixed with 'kIOAudioPortType'. Please provide feedback if there are + * other common port types that should be included. + * @param portName A readable string representing the name of the port. For example: 'Internal Speaker', + * 'Line Out'. This field is optional, but useful for providing information to the application/user. + * @param subType Developer defined readable string representing a subtype for the port. (optional) + * @param properties Standard property list passed to the init of any new IOService. This dictionary + * gets stored in the registry for this instance. (optional) + * @result Returns true on success. + */ + virtual bool initWithAttributes(UInt32 portType, const char *portName = 0, UInt32 subType = 0, OSDictionary *properties = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function free + * @abstract Frees all of the resources allocated by the IOAudioPort. + * @discussion Do not call this directly. This is called automatically by the system when the instance's + * refcount goes to 0. To decrement the refcount, call release() on the object. + */ + virtual void free() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function start + * @abstract Called to start a newly created IOAudioPort. + * @discussion This is called automatically by IOAudioDevice when attachAudioPort() is called. + * @param provider The IOAudioDevice that owns this port + * @result Returns true on success + */ + virtual bool start(IOService *provider) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function stop + * @abstract Called when the IOAudioDevice is stopping when it is no longer available. + * @discussion This method calls deactivateAudioControls() to shut down all of the controls associated with + * this port. + * @param provider The IOAudioDevice that owns this port + */ + virtual void stop(IOService *provider) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void registerService(IOOptionBits options = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOAudioDevice *getAudioDevice() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function addAudioControl + * @abstract Adds a newly created IOAudioControl instance to the port. + * @discussion This method is responsible for starting the new IOAudioControl and adding it to the internal + * audioControls array. + * @param control A newly created IOAudioControl instance that should belong to this port. + * @result Returns true on successfully staring the IOAudioControl. + */ + virtual IOReturn addAudioControl(IOAudioControl *control) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function deactivateAudioControls + * @abstract Called to shut down all of the audio controls for this port. + * @discussion This will stop all of the audio controls and release them so that the instances may be + * freed. This is called from the free() method. + */ + virtual void deactivateAudioControls() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + +protected: + virtual void setType(UInt32 portType) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void setSubType(UInt32 subType) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void setName(const char *name) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; +}; + +#endif /* _IOKIT_IOAUDIOPORT_H */ diff --git a/QualcommWireless/include/IOKit/audio/IOAudioSelectorControl.h b/QualcommWireless/include/IOKit/audio/IOAudioSelectorControl.h new file mode 100644 index 0000000..94f553f --- /dev/null +++ b/QualcommWireless/include/IOKit/audio/IOAudioSelectorControl.h @@ -0,0 +1,127 @@ +/* + * Copyright (c) 1998-2014 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOAUDIOSELECTORCONTROL_H +#define _IOKIT_IOAUDIOSELECTORCONTROL_H + +#include + +#ifndef IOAUDIOFAMILY_SELF_BUILD +#include +#else +#include "IOAudioControl.h" +#endif + +class OSString; +class OSArray; + +class IOAudioSelectorControl : public IOAudioControl +{ + OSDeclareDefaultStructors(IOAudioSelectorControl) + +protected: + + OSArray *availableSelections; + +protected: + struct ExpansionData { }; + + ExpansionData *reserved; + +public: + static IOAudioSelectorControl *createOutputSelector(SInt32 initialValue, + UInt32 channelID, + const char *channelName = 0, + UInt32 cntrlID = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + static IOAudioSelectorControl *createOutputClockSelector(SInt32 initialValue, + UInt32 channelID, + UInt32 clockSource, + const char *channelName = 0, + UInt32 cntrlID = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + static IOAudioSelectorControl *createInputClockSelector(SInt32 initialValue, + UInt32 channelID, + UInt32 clockSource, + const char *channelName = 0, + UInt32 cntrlID = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + // OSMetaClassDeclareReservedUsed(IOAudioSelectorControl, 0); + virtual IOReturn removeAvailableSelection(SInt32 selectionValue) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioSelectorControl, 1); + virtual IOReturn replaceAvailableSelection(SInt32 selectionValue, const char *selectionDescription) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioSelectorControl, 2); + virtual IOReturn replaceAvailableSelection(SInt32 selectionValue, OSString *selectionDescription) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioSelectorControl, 3); + virtual IOReturn addAvailableSelection(SInt32 selectionValue, OSString *selectionDescription, const char* pszName, OSObject* tag) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; // + +private: + OSMetaClassDeclareReservedUsed(IOAudioSelectorControl, 0); + OSMetaClassDeclareReservedUsed(IOAudioSelectorControl, 1); + OSMetaClassDeclareReservedUsed(IOAudioSelectorControl, 2); + OSMetaClassDeclareReservedUsed(IOAudioSelectorControl, 3); // + + OSMetaClassDeclareReservedUnused(IOAudioSelectorControl, 4); // + + OSMetaClassDeclareReservedUnused(IOAudioSelectorControl, 5); // + OSMetaClassDeclareReservedUnused(IOAudioSelectorControl, 6); + OSMetaClassDeclareReservedUnused(IOAudioSelectorControl, 7); + OSMetaClassDeclareReservedUnused(IOAudioSelectorControl, 8); + OSMetaClassDeclareReservedUnused(IOAudioSelectorControl, 9); + OSMetaClassDeclareReservedUnused(IOAudioSelectorControl, 10); + OSMetaClassDeclareReservedUnused(IOAudioSelectorControl, 11); + OSMetaClassDeclareReservedUnused(IOAudioSelectorControl, 12); + OSMetaClassDeclareReservedUnused(IOAudioSelectorControl, 13); + OSMetaClassDeclareReservedUnused(IOAudioSelectorControl, 14); + OSMetaClassDeclareReservedUnused(IOAudioSelectorControl, 15); + +public: + static IOAudioSelectorControl *create(SInt32 initialValue, + UInt32 channelID, + const char *channelName = 0, + UInt32 cntrlID = 0, + UInt32 subType = 0, + UInt32 usage = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + static IOAudioSelectorControl *createInputSelector(SInt32 initialValue, + UInt32 channelID, + const char *channelName = 0, + UInt32 cntrlID = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual bool init(SInt32 initialValue, + UInt32 channelID, + const char *channelName = 0, + UInt32 cntrlID = 0, + UInt32 subType = 0, + UInt32 usage = 0, + OSDictionary *properties = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void free() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOReturn addAvailableSelection(SInt32 selectionValue, const char *selectionDescription) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn addAvailableSelection(SInt32 selectionValue, OSString *selectionDescription) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual bool valueExists(SInt32 selectorValue) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOReturn validateValue(OSObject *newValue) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + +}; + +#endif /* _IOKIT_IOAUDIOSELECTORCONTROL_H */ diff --git a/QualcommWireless/include/IOKit/audio/IOAudioStream.h b/QualcommWireless/include/IOKit/audio/IOAudioStream.h new file mode 100644 index 0000000..aa2fd9b --- /dev/null +++ b/QualcommWireless/include/IOKit/audio/IOAudioStream.h @@ -0,0 +1,307 @@ +/* + * Copyright (c) 1998-2014 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOAUDIOSTREAM_H +#define _IOKIT_IOAUDIOSTREAM_H + +#include +#include + +#ifndef IOAUDIOFAMILY_SELF_BUILD +#include +#include +#else +#include "IOAudioEngine.h" +#include "IOAudioTypes.h" +#endif + +class OSSymbol; +class OSArray; +class OSDictionary; +class OSSet; + +class IOCommandGate; +class IOAudioControl; + +struct IOAudioClientBuffer; +struct IOAudioStreamFormatDesc; + +/*! + * @class IOAudioStream + * @abstract This class wraps a single sample buffer in an audio driver. + * @discussion An IOAudioStream represents one hardware sample buffer as well as the direction + * of that buffer, the mix buffer that multiple clients mix into as well as a list of + * all of the formats to which this buffer can be set. + * + * When an IOAudioEngine is created during init time in the driver, an IOAudioStream must be + * created for each sample buffer in the device. Typically, the sample buffer will be interleaved + * (or single channel), as a non-interleaved buffer should be divided into multiple single-channel + * buffers (and multiple IOAudioStreams). + * + * Additionally, when an IOAudioStream is created it must have all of the possible formats (and + * allowed sample rates for each format) set and must have the currently set format specified + * (addAvailableFormat() and setFormat()). + */ + +class IOAudioStream : public IOService +{ + OSDeclareDefaultStructors(IOAudioStream) + + friend class IOAudioEngine; + friend class IOAudioEngineUserClient; + +public: + + typedef IOReturn (*AudioIOFunction)(const void *mixBuf, void *sampleBuf, UInt32 firstSampleFrame, UInt32 numSampleFrames, const IOAudioStreamFormat *streamFormat, IOAudioStream *audioStream) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + static const OSSymbol *gDirectionKey; + static const OSSymbol *gNumChannelsKey; + static const OSSymbol *gSampleFormatKey; + static const OSSymbol *gNumericRepresentationKey; + static const OSSymbol *gBitDepthKey; + static const OSSymbol *gBitWidthKey; + static const OSSymbol *gAlignmentKey; + static const OSSymbol *gByteOrderKey; + static const OSSymbol *gIsMixableKey; + static const OSSymbol *gDriverTagKey; + static const OSSymbol *gMinimumSampleRateKey; + static const OSSymbol *gMaximumSampleRateKey; + + static void initKeys() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + static OSDictionary *createDictionaryFromFormat(const IOAudioStreamFormat *streamFormat, const IOAudioStreamFormatExtension *formatExtension, OSDictionary *formatDict = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + static IOAudioStreamFormat *createFormatFromDictionary(const OSDictionary *formatDict, IOAudioStreamFormat *streamFormat = 0, IOAudioStreamFormatExtension *formatExtension = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + IOAudioEngine *audioEngine; + IOWorkLoop *workLoop; + IOCommandGate *commandGate; + IORecursiveLock *streamIOLock; + + UInt32 numClients; + + IOAudioStreamDirection direction; + + IOAudioStreamFormat format; + IOAudioStreamFormatDesc *availableFormats; + OSArray *availableFormatDictionaries; + UInt32 numAvailableFormats; + + UInt32 startingChannelID; + UInt32 maxNumChannels; + + void *sampleBuffer; + UInt32 sampleBufferSize; + + void *mixBuffer; + UInt32 mixBufferSize; + bool streamAllocatedMixBuffer; + + AudioIOFunction *audioIOFunctions; + UInt32 numIOFunctions; + + bool streamAvailable; + + OSSet *defaultAudioControls; + + IOAudioEnginePosition startingPosition; + IOAudioEnginePosition clippedPosition; + + IOAudioClientBuffer *clientBufferListStart; + IOAudioClientBuffer *clientBufferListEnd; + + IOAudioClientBuffer *userClientList; + +protected: + + enum { + kErrorLogClipMoreThanOneBufferAhead = 0, + kErrorLogClipMoreThanOneBufferAheadPart2, + kErrorLogClipPositionIsOff, + kErrorLogAlreadyClipped, + kErrorLogClipBuffersAreNULL, + kErrorLogClipReturnsAnError, + kErrorLogNumberOfCounters, // needs to be after the last counter + kErrorLogDumpCounters = 0xFFFF + }; + + struct ExpansionData { + IOAudioStreamFormatExtension streamFormatExtension; + UInt32 mSampleFramesReadByEngine; + IOReturn mClipOutputStatus; + unsigned int mStreamErrorCounts[kErrorLogNumberOfCounters]; + bool mStreamErrorCountsUpdated; + }; + + ExpansionData *reserved; + +public: +// New code added here: + // OSMetaClassDeclareReservedUsed(IOAudioStream, 0); + virtual const IOAudioStreamFormatExtension *getFormatExtension() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioStream, 1); + virtual IOReturn setFormat(const IOAudioStreamFormat *streamFormat, const IOAudioStreamFormatExtension *formatExtension, bool callDriver = true) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioStream, 2); + virtual IOReturn setFormat(const IOAudioStreamFormat *streamFormat, const IOAudioStreamFormatExtension *formatExtension, OSDictionary *formatDict, bool callDriver = true) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioStream, 3); + virtual void addAvailableFormat(const IOAudioStreamFormat *streamFormat, const IOAudioStreamFormatExtension *formatExtension, const IOAudioSampleRate *minRate, const IOAudioSampleRate *maxRate, const AudioIOFunction *ioFunctionList = NULL, UInt32 numFunctions = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioStream, 4); + virtual void addAvailableFormat(const IOAudioStreamFormat *streamFormat, const IOAudioStreamFormatExtension *formatExtension, const IOAudioSampleRate *minRate, const IOAudioSampleRate *maxRate, AudioIOFunction ioFunction) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioStream, 5); + virtual bool validateFormat(IOAudioStreamFormat *streamFormat, IOAudioStreamFormatExtension *formatExtension, IOAudioStreamFormatDesc *formatDesc) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioStream, 6); + virtual void setTerminalType(const UInt32 terminalType) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioStream, 7); + virtual IOReturn mixOutputSamples(const void *sourceBuf, void *mixBuf, UInt32 firstSampleFrame, UInt32 numSampleFrames, const IOAudioStreamFormat *streamFormat, IOAudioStream *audioStream) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioStream, 8); + virtual void setSampleLatency(UInt32 numSamples) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioStream, 9); + virtual bool validateFormat(IOAudioStreamFormat *streamFormat, IOAudioStreamFormatExtension *formatExtension, IOAudioStreamFormatDesc *formatDesc, const IOAudioSampleRate *sampleRate) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioStream, 10); + virtual UInt32 getNumSampleFramesRead() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + // OSMetaClassDeclareReservedUsed(IOAudioStream, 11); + virtual void setDefaultNumSampleFramesRead(UInt32) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + +private: + OSMetaClassDeclareReservedUsed(IOAudioStream, 0); + OSMetaClassDeclareReservedUsed(IOAudioStream, 1); + OSMetaClassDeclareReservedUsed(IOAudioStream, 2); + OSMetaClassDeclareReservedUsed(IOAudioStream, 3); + OSMetaClassDeclareReservedUsed(IOAudioStream, 4); + OSMetaClassDeclareReservedUsed(IOAudioStream, 5); + OSMetaClassDeclareReservedUsed(IOAudioStream, 6); + OSMetaClassDeclareReservedUsed(IOAudioStream, 7); + OSMetaClassDeclareReservedUsed(IOAudioStream, 8); + OSMetaClassDeclareReservedUsed(IOAudioStream, 9); + OSMetaClassDeclareReservedUsed(IOAudioStream, 10); + OSMetaClassDeclareReservedUsed(IOAudioStream, 11); + + OSMetaClassDeclareReservedUnused(IOAudioStream, 12); + OSMetaClassDeclareReservedUnused(IOAudioStream, 13); + OSMetaClassDeclareReservedUnused(IOAudioStream, 14); + OSMetaClassDeclareReservedUnused(IOAudioStream, 15); + OSMetaClassDeclareReservedUnused(IOAudioStream, 16); + OSMetaClassDeclareReservedUnused(IOAudioStream, 17); + OSMetaClassDeclareReservedUnused(IOAudioStream, 18); + OSMetaClassDeclareReservedUnused(IOAudioStream, 19); + OSMetaClassDeclareReservedUnused(IOAudioStream, 20); + OSMetaClassDeclareReservedUnused(IOAudioStream, 21); + OSMetaClassDeclareReservedUnused(IOAudioStream, 22); + OSMetaClassDeclareReservedUnused(IOAudioStream, 23); + OSMetaClassDeclareReservedUnused(IOAudioStream, 24); + OSMetaClassDeclareReservedUnused(IOAudioStream, 25); + OSMetaClassDeclareReservedUnused(IOAudioStream, 26); + OSMetaClassDeclareReservedUnused(IOAudioStream, 27); + OSMetaClassDeclareReservedUnused(IOAudioStream, 28); + OSMetaClassDeclareReservedUnused(IOAudioStream, 29); + OSMetaClassDeclareReservedUnused(IOAudioStream, 30); + OSMetaClassDeclareReservedUnused(IOAudioStream, 31); + OSMetaClassDeclareReservedUnused(IOAudioStream, 32); + OSMetaClassDeclareReservedUnused(IOAudioStream, 33); + OSMetaClassDeclareReservedUnused(IOAudioStream, 34); + OSMetaClassDeclareReservedUnused(IOAudioStream, 35); + OSMetaClassDeclareReservedUnused(IOAudioStream, 36); + OSMetaClassDeclareReservedUnused(IOAudioStream, 37); + OSMetaClassDeclareReservedUnused(IOAudioStream, 38); + OSMetaClassDeclareReservedUnused(IOAudioStream, 39); + OSMetaClassDeclareReservedUnused(IOAudioStream, 40); + OSMetaClassDeclareReservedUnused(IOAudioStream, 41); + OSMetaClassDeclareReservedUnused(IOAudioStream, 42); + OSMetaClassDeclareReservedUnused(IOAudioStream, 43); + OSMetaClassDeclareReservedUnused(IOAudioStream, 44); + OSMetaClassDeclareReservedUnused(IOAudioStream, 45); + OSMetaClassDeclareReservedUnused(IOAudioStream, 46); + OSMetaClassDeclareReservedUnused(IOAudioStream, 47); + +public: + virtual bool initWithAudioEngine(IOAudioEngine *engine, IOAudioStreamDirection dir, UInt32 startChannelID, const char *streamDescription = NULL, OSDictionary *properties = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void free() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void stop(IOService *provider) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOWorkLoop *getWorkLoop() const; + + virtual IOReturn setProperties(OSObject *properties) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOAudioStreamDirection getDirection() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void setSampleBuffer(void *buffer, UInt32 size) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void *getSampleBuffer() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual UInt32 getSampleBufferSize() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void setMixBuffer(void *buffer, UInt32 size) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void *getMixBuffer() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual UInt32 getMixBufferSize() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void numSampleFramesPerBufferChanged() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void clearSampleBuffer() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void setIOFunction(AudioIOFunction ioFunction) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void setIOFunctionList(const AudioIOFunction *ioFunctionList, UInt32 numFunctions) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual const IOAudioStreamFormat *getFormat() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + static IOReturn setFormatAction(OSObject *owner, void *arg1, void *arg2, void *arg3, void *arg4) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + static IOReturn _setFormatAction(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; // + virtual IOReturn setFormat(const IOAudioStreamFormat *streamFormat, bool callDriver = true) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn setFormat(OSDictionary *formatDict) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn setFormat(const IOAudioStreamFormat *streamFormat, OSDictionary *formatDict, bool callDriver = true) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn hardwareFormatChanged(const IOAudioStreamFormat *streamFormat) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void addAvailableFormat(const IOAudioStreamFormat *streamFormat, const IOAudioSampleRate *minRate, const IOAudioSampleRate *maxRate, const AudioIOFunction *ioFunctionList = NULL, UInt32 numFunctions = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void addAvailableFormat(const IOAudioStreamFormat *streamFormat, const IOAudioSampleRate *minRate, const IOAudioSampleRate *maxRate, AudioIOFunction ioFunction) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void clearAvailableFormats() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual bool validateFormat(IOAudioStreamFormat *streamFormat, IOAudioStreamFormatDesc *formatDesc) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual UInt32 getStartingChannelID() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual UInt32 getMaxNumChannels() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void setStreamAvailable(bool available) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual bool getStreamAvailable() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOReturn addDefaultAudioControl(IOAudioControl *defaultAudioControl) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void removeDefaultAudioControls() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + +protected: + virtual void lockStreamForIO() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void unlockStreamForIO() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void updateNumClients() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn addClient(IOAudioClientBuffer *clientBuffer) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void removeClient(IOAudioClientBuffer *clientBuffer) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual UInt32 getNumClients() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual IOReturn processOutputSamples(IOAudioClientBuffer *clientBuffer, UInt32 firstSampleFrame, UInt32 loopCount, bool samplesAvailable) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual IOReturn readInputSamples(IOAudioClientBuffer *clientBuffer, UInt32 firstSampleFrame) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void resetClipInfo() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void clipIfNecessary() AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + virtual void clipOutputSamples(UInt32 startingSampleFrame, UInt32 numSampleFrames) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + virtual void setStartingChannelNumber(UInt32 channelNumber) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + +private: + virtual void setDirection(IOAudioStreamDirection dir) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + void safeLogError(int error , long unsigned int arg1 , long unsigned int arg2 , long unsigned int arg3 , long unsigned int arg4 , void* arg5, void* arg6) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + +}; + +#endif /* _IOKIT_IOAUDIOSTREAM_H */ diff --git a/QualcommWireless/include/IOKit/audio/IOAudioTimeIntervalFilter.h b/QualcommWireless/include/IOKit/audio/IOAudioTimeIntervalFilter.h new file mode 100644 index 0000000..4f2e045 --- /dev/null +++ b/QualcommWireless/include/IOKit/audio/IOAudioTimeIntervalFilter.h @@ -0,0 +1,245 @@ +/* + * Copyright (c) 1998-2014 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOAUDIOTIMEINTERVALFILTER_H +#define _IOAUDIOTIMEINTERVALFILTER_H + +#include "BigNum128.h" + +/*! + @class IOAudioTimeIntervalFilter + @abstract An abstract class that provides a filtered timeline based on snapshots from jittery time captures + */ +class IOAudioTimeIntervalFilter : public OSObject +{ + OSDeclareAbstractStructors(IOAudioTimeIntervalFilter) + +public: + /*! + @function reInitialiseFilter + @abstract Restart a new timeline sequence, with a new expected interval spacing + @param expectedInterval Expected interval of time captures. Pass zero to use the results from previous runs. + @param multiIntervalCount Count of multiple intervals to return from getMultiIntervalTime. + */ + virtual IOReturn reInitialiseFilter(uint32_t expectedInterval = 0, uint32_t multiIntervalCount = 1 ); + + /*! + * @function free + * @abstract Frees all of the resources allocated by the IOAudioTimeIntervalFilter. + * @discussion Do not call this directly. This is called automatically by the system when the instance's + * refcount goes to 0. To decrement the refcount, call release() on the object. + */ + virtual void free(); + + + + /*! + @function newTimePosition + @abstract Pass in the raw measured time position + @param rawSnapshot The raw time position. These should be approximately occurring every ExpectedInterval + @result A filtered time position + */ + + virtual AbsoluteTime newTimePosition(AbsoluteTime rawSnapshot); + + /*! + @function getMultiIntervalTime + @abstract Return the time between the last MultiIntervalCount intervals of the filtered timeline + @result Return the time between the last MultiIntervalCount intervals of the filtered timeline + */ + virtual uint64_t getMultiIntervalTime(void); + + + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilter, 0 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilter, 1 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilter, 2 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilter, 3 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilter, 4 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilter, 5 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilter, 6 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilter, 7 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilter, 8 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilter, 9 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilter, 10 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilter, 11 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilter, 12 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilter, 13 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilter, 14 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilter, 15 ); + +protected: + /* */ + struct ExpansionData + { + }; + + ExpansionData *reserved; + + /*! + @function initFilter + @abstract Construct a new instance of the TimeFilter class + @param ExpectedInterval Expected interval of time captures + @param MultiIntervalCount Optionally calculate the count between ExpectedInterval + */ + virtual bool initFilter(uint32_t expectedInterval, uint32_t multiIntervalCount = 1); + + /*! + @function calculateNewTimePosition + @abstract abstract method to calculate the new time position based on the raw snapshot + @param rawSnapshot Raw filter value + @result filtered time value + */ + virtual uint64_t calculateNewTimePosition(uint64_t rawSnapshot) = 0; + + inline int decCircularBufferPosition(int n, int dec = 1) { return (n + mMultiIntervalCount - dec) % mMultiIntervalCount; } + inline int incCircularBufferPosition(int n, int inc = 1) { return (n + mMultiIntervalCount + inc) % mMultiIntervalCount; } + + uint32_t mExpectedInterval; + uint32_t mMultiIntervalCount; + + uint64_t* mIntervalTimeHistory; + + /*! + * @var mIntervalTimeHistoryPointer + * Points to the next time interval to be updated + */ + int mIntervalTimeHistoryPointer; + + /*! + * @var mFilterCount + * How many times the filter has been called since re-init + */ + uint64_t mFilterCount; + + IOLock* timeIntervalLock; +}; + + + +/*! + @class IOAudioTimeIntervalFilterIIR + @abstract A concrete IOAudioTimeIntervalFilter class that provides an IIR-based filtered timeline based on snapshots from jittery time captures + */ + +class IOAudioTimeIntervalFilterIIR : public IOAudioTimeIntervalFilter +{ + OSDeclareDefaultStructors(IOAudioTimeIntervalFilterIIR) + +public: + /*! + @function initFilter + @abstract Construct a new instance of the IIR TimeFilter class + @param ExpectedInterval Expected interval of time captures + @param MultiIntervalCount Optionally calculate the count between ExpectedInterval + @param filterCoef IIR filter coefficient. Increase this number for more aggressive smoothing + */ + virtual bool initFilter(uint32_t expectedInterval, uint32_t multiIntervalCount = 1, uint16_t filterCoef = 4); + + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterIIR, 0 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterIIR, 1 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterIIR, 2 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterIIR, 3 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterIIR, 4 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterIIR, 5 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterIIR, 6 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterIIR, 7 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterIIR, 8 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterIIR, 9 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterIIR, 10 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterIIR, 11 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterIIR, 12 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterIIR, 13 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterIIR, 14 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterIIR, 15 ); + +protected: + virtual void IIR(U128* filterVal, U128 input, int shiftAmount); + virtual uint64_t calculateNewTimePosition(uint64_t rawSnapshot); + + U128 mFilteredSnapshot; + U128 mFilteredOffset; + uint16_t mIIRCoef; +}; + + + +/*! + @class IOAudioTimeIntervalFilterFIR + @abstract A concrete IOAudioTimeIntervalFilter class that provides an FIR-based filtered timeline based on snapshots from jittery time captures + */ + +class IOAudioTimeIntervalFilterFIR : public IOAudioTimeIntervalFilter +{ + OSDeclareDefaultStructors(IOAudioTimeIntervalFilterFIR) + +public: + /*! + @function initFilter + @abstract Construct a new instance of the IIR TimeFilter class + @param ExpectedInterval Expected interval of time captures + @param MultiIntervalCount Optionally calculate the count between ExpectedInterval + */ + virtual bool initFilter(uint32_t expectedInterval, uint32_t multiIntervalCount = 1); + + /*! + * @function free + * @abstract Frees all of the resources allocated by the IOAudioTimeIntervalFilter. + * @discussion Do not call this directly. This is called automatically by the system when the instance's + * refcount goes to 0. To decrement the refcount, call release() on the object. + */ + virtual void free(); + + IOReturn reInitialiseFilter(uint32_t expectedInterval = 0, uint32_t multiIntervalCount = 1 ); + + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterFIR, 0 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterFIR, 1 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterFIR, 2 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterFIR, 3 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterFIR, 4 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterFIR, 5 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterFIR, 6 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterFIR, 7 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterFIR, 8 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterFIR, 9 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterFIR, 10 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterFIR, 11 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterFIR, 12 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterFIR, 13 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterFIR, 14 ); + OSMetaClassDeclareReservedUnused (IOAudioTimeIntervalFilterFIR, 15 ); +protected: + + virtual uint64_t calculateNewTimePosition(uint64_t rawSnapshot); + virtual IOReturn setNewFilter(uint32_t numCoeffs, const uint64_t* filterCoefficients, uint32_t scale); + + U128 FIR(uint64_t *history, uint64_t input); + + uint64_t* mCoeffs; + uint64_t* mDataOffsetHistory; + uint64_t* mDataHistory; + uint32_t mNumCoeffs; + uint32_t mFilterScale; + uint32_t mFilterWritePointer; +}; + +#endif // _IOAUDIOTIMEINTERVALFILTER_H + diff --git a/QualcommWireless/include/IOKit/audio/IOAudioToggleControl.h b/QualcommWireless/include/IOKit/audio/IOAudioToggleControl.h new file mode 100644 index 0000000..a840013 --- /dev/null +++ b/QualcommWireless/include/IOKit/audio/IOAudioToggleControl.h @@ -0,0 +1,123 @@ +/* + * Copyright (c) 1998-2014 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOAUDIOTOGGLECONTROL_H +#define _IOKIT_IOAUDIOTOGGLECONTROL_H + +#include + +#ifndef IOAUDIOFAMILY_SELF_BUILD +#include +#else +#include "IOAudioControl.h" +#endif + +/*! + * @class IOAudioToggleControl + */ + +class IOAudioToggleControl : public IOAudioControl +{ + OSDeclareDefaultStructors(IOAudioToggleControl) + +protected: + struct ExpansionData { }; + + ExpansionData *reserved; + +// New code added here +public: + /*! + * @function createPassThruMuteControl + * @abstract Allocates a new pass through mute control with the given attributes + * @param initialValue The initial value of the control + * @param channelID The ID of the channel(s) that the control acts on. Common IDs are located in IOAudioTypes.h. + * @param channelName An optional name for the channel. Common names are located in IOAudioPort.h. + * @param cntrlID An optional ID for the control that can be used to uniquely identify controls + * @result Returns a newly allocated and initialized mute IOAudioControl + */ + static IOAudioToggleControl *createPassThruMuteControl (bool initialValue, + UInt32 channelID, + const char *channelName, + UInt32 cntrlID) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + +private: + OSMetaClassDeclareReservedUnused(IOAudioToggleControl, 0); + OSMetaClassDeclareReservedUnused(IOAudioToggleControl, 1); + OSMetaClassDeclareReservedUnused(IOAudioToggleControl, 2); + OSMetaClassDeclareReservedUnused(IOAudioToggleControl, 3); + OSMetaClassDeclareReservedUnused(IOAudioToggleControl, 4); + OSMetaClassDeclareReservedUnused(IOAudioToggleControl, 5); + OSMetaClassDeclareReservedUnused(IOAudioToggleControl, 6); + OSMetaClassDeclareReservedUnused(IOAudioToggleControl, 7); + OSMetaClassDeclareReservedUnused(IOAudioToggleControl, 8); + OSMetaClassDeclareReservedUnused(IOAudioToggleControl, 9); + OSMetaClassDeclareReservedUnused(IOAudioToggleControl, 10); + OSMetaClassDeclareReservedUnused(IOAudioToggleControl, 11); + OSMetaClassDeclareReservedUnused(IOAudioToggleControl, 12); + OSMetaClassDeclareReservedUnused(IOAudioToggleControl, 13); + OSMetaClassDeclareReservedUnused(IOAudioToggleControl, 14); + OSMetaClassDeclareReservedUnused(IOAudioToggleControl, 15); + +public: + /*! + * @function create + * @abstract Allocates a new mute control with the given attributes + * @param initialValue The initial value of the control + * @param channelID The ID of the channel(s) that the control acts on. Common IDs are located in IOAudioTypes.h. + * @param channelName An optional name for the channel. Common names are located in IOAudioPort.h. + * @param cntrlID An optional ID for the control that can be used to uniquely identify controls + * @result Returns a newly allocated and initialized mute IOAudioControl + */ + static IOAudioToggleControl *create(bool initialValue, + UInt32 channelID, + const char *channelName = 0, + UInt32 cntrlID = 0, + UInt32 subType = 0, + UInt32 usage = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + static IOAudioToggleControl *createMuteControl(bool initialValue, + UInt32 channelID, + const char *channelName = 0, + UInt32 cntrlID = 0, + UInt32 usage = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + + /*! + * @function init + * @abstract Initializes a newly allocated IOAudioToggleControl with the given attributes + * @param initialValue The initial value of the control + * @param channelID The ID of the channel(s) that the control acts on. Common IDs are located in IOAudioTypes.h. + * @param channelName An optional name for the channel. Common names are located in IOAudioPort.h. + * @param cntrlID An optional ID for the control that can be used to uniquely identify controls + * @result Returns truen on success + */ + virtual bool init(bool initialValue, + UInt32 channelID, + const char *channelName = 0, + UInt32 cntrlID = 0, + UInt32 subType = 0, + UInt32 usage = 0, + OSDictionary *properties = 0) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10; + +}; + +#endif /* _IOKIT_IOAUDIOTOGGLECONTROL_H */ diff --git a/QualcommWireless/include/IOKit/audio/IOAudioTypes.h b/QualcommWireless/include/IOKit/audio/IOAudioTypes.h new file mode 100644 index 0000000..bf60ddb --- /dev/null +++ b/QualcommWireless/include/IOKit/audio/IOAudioTypes.h @@ -0,0 +1,675 @@ +/* + * Copyright (c) 1998-2013 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOAUDIOTYPES_H +#define _IOKIT_IOAUDIOTYPES_H + +#include +#include + + +/*! + * @enum IOAudioEngineMemory + * @abstract Used to identify the type of memory requested by a client process to be mapped into its process space + * @discussion This is the parameter to the type field of IOMapMemory when called on an IOAudioEngine. This is + * only intended for use by the Audio Device API library. + * @constant kIOAudioSampleBuffer This requests the IOAudioEngine's sample buffer + * @constant kIOAudioStatusBuffer This requests the IOAudioEngine's status buffer. It's type is IOAudioEngineStatus. + * @constant kIOAudioMixBuffer This requests the IOAudioEngine's mix buffer +*/ +typedef enum _IOAudioEngineMemory { + kIOAudioStatusBuffer = 0, + kIOAudioSampleBuffer = 1, + kIOAudioMixBuffer = 2, + kIOAudioBytesInInputBuffer = 3, + kIOAudioBytesInOutputBuffer = 4 +} IOAudioEngineMemory; + +/*! + * @enum IOAudioEngineCalls + * @abstract The set of constants passed to IOAudioEngineUserClient::getExternalMethodForIndex() when making calls + * from the IOAudioFamily user client code. + */ +typedef enum _IOAudioEngineCalls { + kIOAudioEngineCallRegisterClientBuffer = 0, + kIOAudioEngineCallUnregisterClientBuffer = 1, + kIOAudioEngineCallGetConnectionID = 2, + kIOAudioEngineCallStart = 3, + kIOAudioEngineCallStop = 4, + kIOAudioEngineCallGetNearestStartTime = 5 +} IOAudioEngineCalls; + +/*! @defined kIOAudioEngineNumCalls The number of elements in the IOAudioEngineCalls enum. */ +#define kIOAudioEngineNumCalls 6 + +typedef enum _IOAudioEngineTraps { + kIOAudioEngineTrapPerformClientIO = 0 +} IOAudioEngineTraps; + +typedef enum _IOAudioEngineNotifications { + kIOAudioEngineAllNotifications = 0, + kIOAudioEngineStreamFormatChangeNotification = 1, + kIOAudioEngineChangeNotification = 2, + kIOAudioEngineStartedNotification = 3, + kIOAudioEngineStoppedNotification = 4, + kIOAudioEnginePausedNotification = 5, + kIOAudioEngineResumedNotification = 6 +} IOAudioEngineNotifications; + +/*! + * @enum IOAudioEngineState + * @abstract Represents the state of an IOAudioEngine + * @constant kIOAudioEngineRunning The IOAudioEngine is currently running - it is transferring data to or + * from the device. + * @constant kIOAudioEngineStopped The IOAudioEngine is currently stopped - no activity is occurring. + */ + +typedef enum _IOAudioEngineState { + kIOAudioEngineStopped = 0, + kIOAudioEngineRunning = 1, + kIOAudioEnginePaused = 2, + kIOAudioEngineResumed = 3 +} IOAudioEngineState; + + +/*! + * @typedef IOAudioEngineStatus + * @abstract Shared-memory structure giving audio engine status + * @discussion + * @field fVersion Indicates version of this structure + * @field fCurrentLoopCount Number of times around the ring buffer since the audio engine started + * @field fLastLoopTime Timestamp of the last time the ring buffer wrapped + * @field fEraseHeadSampleFrame Location of the erase head in sample frames - erased up to but not + * including the given sample frame + */ + +typedef struct _IOAudioEngineStatus { + UInt32 fVersion; + volatile UInt32 fCurrentLoopCount; + volatile AbsoluteTime fLastLoopTime; + volatile UInt32 fEraseHeadSampleFrame; +} IOAudioEngineStatus; + +#define kIOAudioEngineCurrentStatusStructVersion 2 + +typedef struct _IOAudioStreamFormat { + UInt32 fNumChannels; + UInt32 fSampleFormat; + UInt32 fNumericRepresentation; + UInt8 fBitDepth; + UInt8 fBitWidth; + UInt8 fAlignment; + UInt8 fByteOrder; + UInt8 fIsMixable; + UInt32 fDriverTag; +} IOAudioStreamFormat; + +#define kFormatExtensionInvalidVersion 0 +#define kFormatExtensionCurrentVersion 1 + +typedef struct _IOAudioStreamFormatExtension { + UInt32 fVersion; + UInt32 fFlags; + UInt32 fFramesPerPacket; + UInt32 fBytesPerPacket; +} IOAudioStreamFormatExtension; + +typedef struct _IOAudioBufferDataDescriptor { + UInt32 fActualDataByteSize; + UInt32 fActualNumSampleFrames; + UInt32 fTotalDataByteSize; + UInt32 fNominalDataByteSize; + UInt8 fData[1]; +} IOAudioBufferDataDescriptor; + +#define kStreamDataDescriptorInvalidVersion 0 +#define kStreamDataDescriptorCurrentVersion 1 + +typedef struct _IOAudioStreamDataDescriptor { + UInt32 fVersion; + UInt32 fNumberOfStreams; + UInt32 fStreamLength[1]; // Array with fNumberOfStreams number of entries +} IOAudioStreamDataDescriptor; + +typedef struct _IOAudioSampleIntervalDescriptor { + UInt32 sampleIntervalHi; + UInt32 sampleIntervalLo; +} IOAudioSampleIntervalDescriptor; + +/*! + @struct SMPTETime + @abstract A structure for holding a SMPTE time. + @field fSubframes + The number of subframes in the full message. + @field fSubframeDivisor + The number of subframes per frame (typically 80). + @field fCounter + The total number of messages received. + @field fType + The kind of SMPTE time using the SMPTE time type constants. + @field fFlags + A set of flags that indicate the SMPTE state. + @field fHours + The number of hourse in the full message. + @field fMinutes + The number of minutes in the full message. + @field fSeconds + The number of seconds in the full message. + @field fFrames + The number of frames in the full message. +*/ +typedef struct _IOAudioSMPTETime +{ + SInt16 fSubframes; + SInt16 fSubframeDivisor; + UInt32 fCounter; + UInt32 fType; + UInt32 fFlags; + SInt16 fHours; + SInt16 fMinutes; + SInt16 fSeconds; + SInt16 fFrames; + +} IOAudioSMPTETime; + +// constants describing SMPTE types (taken from the MTC spec), +enum +{ + kIOAudioSMPTETimeType24 = 0, + kIOAudioSMPTETimeType25 = 1, + kIOAudioSMPTETimeType30Drop = 2, + kIOAudioSMPTETimeType30 = 3, + kIOAudioSMPTETimeType2997 = 4, + kIOAudioSMPTETimeType2997Drop = 5, + kIOAudioSMPTETimeType60 = 6, + kIOAudioSMPTETimeType5994 = 7, + kIOAudioSMPTETimeType60Drop = 8, + kIOAudioSMPTETimeType5994Drop = 9, + kIOAudioSMPTETimeType50 = 10, + kIOAudioSMPTETimeType2398 = 11 +}; + +// flags describing a SMPTE time stamp +enum +{ + kIOAudioSMPTETimeValid = (1L << 0), // the full time is valid + kIOAudioSMPTETimeRunning = (1L << 1) // time is running +}; + +// A struct for encapsulating the parts of a time stamp. The flags +// say which fields are valid. +typedef struct _IOAudioTimeStamp +{ + UInt64 fSampleTime; // the absolute sample time, was a Float64 + UInt64 fHostTime; // the host's root timebase's time + UInt64 fRateScalar; // the system rate scalar, was a Float64 + UInt64 fWordClockTime; // the word clock time + IOAudioSMPTETime fSMPTETime; // the SMPTE time + UInt32 fFlags; // the flags indicate which fields are valid + UInt32 fReserved; // reserved, pads the structure out to force 8 byte alignment +} IOAudioTimeStamp; + +// flags for the AudioTimeStamp sturcture +enum +{ + kIOAudioTimeStampSampleTimeValid = (1L << 0), + kIOAudioTimeStampHostTimeValid = (1L << 1), + kIOAudioTimeStampRateScalarValid = (1L << 2), + kIOAudioTimeStampWordClockTimeValid = (1L << 3), + kIOAudioTimeStampSMPTETimeValid = (1L << 4) +}; + +// Some commonly used combinations of timestamp flags +enum +{ + kIOAudioTimeStampSampleHostTimeValid = (kIOAudioTimeStampSampleTimeValid | kIOAudioTimeStampHostTimeValid) +}; + +/*! +* @enum IOAudioStreamDirection + * @abstract Represents the direction of an IOAudioStream + * @constant kIOAudioStreamDirectionOutput Output buffer + * @constant kIOAudioStreamDirectionInput Input buffer + */ + +typedef enum _IOAudioStreamDirection { + kIOAudioStreamDirectionOutput = 0, + kIOAudioStreamDirectionInput = 1 +} IOAudioStreamDirection; + +enum { + kIOAudioDeviceCanBeDefaultNothing = 0, + kIOAudioDeviceCanBeDefaultInput = (1L << 0), + kIOAudioDeviceCanBeDefaultOutput = (1L << 1), + kIOAudioDeviceCanBeSystemOutput = (1L << 2) +}; + +/*! + * @defined kIOAudioEngineDefaultMixBufferSampleSize + */ + +#define kIOAudioEngineDefaultMixBufferSampleSize sizeof(float) + +/* The following are for use only by the IOKit.framework audio family code */ + +/*! + * @enum IOAudioControlCalls + * @abstract The set of constants passed to IOAudioControlUserClient::getExternalMethodForIndex() when making calls + * from the IOAudioFamily user client code. + * @constant kIOAudioControlCallSetValue Used to set the value of an IOAudioControl. + * @constant kIOAudioControlCallGetValue Used to get the value of an IOAudioControl. + */ +typedef enum _IOAudioControlCalls { + kIOAudioControlCallSetValue = 0, + kIOAudioControlCallGetValue = 1 +} IOAudioControlCalls; + +/*! @defined kIOAudioControlNumCalls The number of elements in the IOAudioControlCalls enum. */ +#define kIOAudioControlNumCalls 2 + +/*! + * @enum IOAudioControlNotifications + * @abstract The set of constants passed in the type field of IOAudioControlUserClient::registerNotificaitonPort(). + * @constant kIOAudioControlValueChangeNotification Used to request value change notifications. + * @constant kIOAudioControlRangeChangeNotification Used to request range change notifications. + */ +typedef enum _IOAudioControlNotifications { + kIOAudioControlValueChangeNotification = 0, + kIOAudioControlRangeChangeNotification = 1 +} IOAudioControlNotifications; + +/*! + * @struct IOAudioNotificationMessage + * @abstract Used in the mach message for IOAudio notifications. + * @field messageHeader Standard mach message header + * @field ref The param passed to registerNotificationPort() in refCon. + */ +typedef struct _IOAudioNotificationMessage { + mach_msg_header_t messageHeader; + UInt32 type; + UInt32 ref; + void * sender; +} IOAudioNotificationMessage; + +typedef struct _IOAudioSampleRate { + UInt32 whole; + UInt32 fraction; +} IOAudioSampleRate; + +#define kNoIdleAudioPowerDown 0xffffffffffffffffULL + +enum { + kIOAudioPortTypeOutput = 'outp', + kIOAudioPortTypeInput = 'inpt', + kIOAudioPortTypeMixer = 'mixr', + kIOAudioPortTypePassThru = 'pass', + kIOAudioPortTypeProcessing = 'proc' +}; + +enum { + kIOAudioOutputPortSubTypeInternalSpeaker = 'ispk', + kIOAudioOutputPortSubTypeExternalSpeaker = 'espk', + kIOAudioOutputPortSubTypeHeadphones = 'hdpn', + kIOAudioOutputPortSubTypeLine = 'line', + kIOAudioOutputPortSubTypeSPDIF = 'spdf', + + kIOAudioInputPortSubTypeInternalMicrophone = 'imic', + kIOAudioInputPortSubTypeExternalMicrophone = 'emic', + kIOAudioInputPortSubTypeCD = 'cd ', + kIOAudioInputPortSubTypeLine = 'line', + kIOAudioInputPortSubTypeSPDIF = 'spdf' +}; + +enum { + kIOAudioControlTypeLevel = 'levl', + kIOAudioControlTypeToggle = 'togl', + kIOAudioControlTypeJack = 'jack', + kIOAudioControlTypeSelector = 'slct' +}; + +// Added kIOAudioToggleControlSubTypePhantomPower, kIOAudioToggleControlSubTypePhaseInvert & +// kIOAudioSelectorControlSubTypeChannelHighPassFilter +enum { + kIOAudioLevelControlSubTypeVolume = 'vlme', + kIOAudioLevelControlSubTypeLFEVolume = 'subv', + kIOAudioLevelControlSubTypePRAMVolume = 'pram', + kIOAudioToggleControlSubTypeMute = 'mute', + kIOAudioToggleControlSubTypeSolo = 'solo', + kIOAudioToggleControlSubTypeLFEMute = 'subm', + kIOAudioToggleControlSubTypeiSubAttach = 'atch', + kIOAudioToggleControlSubTypePhantomPower = 'phan', + kIOAudioToggleControlSubTypePhaseInvert = 'phsi', + kIOAudioSelectorControlSubTypeOutput = 'outp', + kIOAudioSelectorControlSubTypeInput = 'inpt', + kIOAudioSelectorControlSubTypeClockSource = 'clck', + kIOAudioSelectorControlSubTypeDestination = 'dest', + kIOAudioSelectorControlSubTypeChannelNominalLineLevel = 'nlev', + kIOAudioSelectorControlSubTypeChannelLevelPlus4dBu = '4dbu', + kIOAudioSelectorControlSubTypeChannelLevelMinus10dBV = '10db', + kIOAudioSelectorControlSubTypeChannelLevelMinus20dBV = '20db', + kIOAudioSelectorControlSubTypeChannelLevelMicLevel = 'micl', + kIOAudioSelectorControlSubTypeChannelLevelInstrumentLevel = 'istl', + kIOAudioSelectorControlSubTypeChannelHighPassFilter = 'hipf' +}; + +enum { + kIOAudioControlUsageOutput = 'outp', + kIOAudioControlUsageInput = 'inpt', + kIOAudioControlUsagePassThru = 'pass', + kIOAudioControlUsageCoreAudioProperty = 'prop' +}; + +enum { + kIOAudioControlChannelNumberInactive = -1, + kIOAudioControlChannelIDAll = 0, + kIOAudioControlChannelIDDefaultLeft = 1, + kIOAudioControlChannelIDDefaultRight = 2, + kIOAudioControlChannelIDDefaultCenter = 3, + kIOAudioControlChannelIDDefaultLeftRear = 4, + kIOAudioControlChannelIDDefaultRightRear = 5, + kIOAudioControlChannelIDDefaultSub = 6, + kIOAudioControlChannelIDDefaultFrontLeftCenter = 7, + kIOAudioControlChannelIDDefaultFrontRightCenter = 8, + kIOAudioControlChannelIDDefaultRearCenter = 9, + kIOAudioControlChannelIDDefaultSurroundLeft = 10, + kIOAudioControlChannelIDDefaultSurroundRight = 11 +}; + +enum { + kIOAudioSelectorControlSelectionValueNone = 'none', + + // Output-specific selection IDs + kIOAudioSelectorControlSelectionValueInternalSpeaker = 'ispk', + kIOAudioSelectorControlSelectionValueExternalSpeaker = 'espk', + kIOAudioSelectorControlSelectionValueHeadphones = 'hdpn', + + // Input-specific selection IDs + kIOAudioSelectorControlSelectionValueInternalMicrophone = 'imic', + kIOAudioSelectorControlSelectionValueExternalMicrophone = 'emic', + kIOAudioSelectorControlSelectionValueCD = 'cd ', + + // Common selection IDs + kIOAudioSelectorControlSelectionValueLine = 'line', + kIOAudioSelectorControlSelectionValueSPDIF = 'spdf' +}; + +enum { + kIOAudioStreamSampleFormatLinearPCM = 'lpcm', + kIOAudioStreamSampleFormatIEEEFloat = 'ieee', + kIOAudioStreamSampleFormatALaw = 'alaw', + kIOAudioStreamSampleFormatMuLaw = 'ulaw', + kIOAudioStreamSampleFormatMPEG = 'mpeg', + kIOAudioStreamSampleFormatAC3 = 'ac-3', + kIOAudioStreamSampleFormat1937AC3 = 'cac3', + kIOAudioStreamSampleFormat1937MPEG1 = 'mpg1', + kIOAudioStreamSampleFormat1937MPEG2 = 'mpg2', + kIOAudioStreamSampleFormatTimeCode = 'time' // a stream of IOAudioTimeStamp structures that capture any incoming time code information +}; + +enum { + kIOAudioStreamNumericRepresentationSignedInt = 'sint', + kIOAudioStreamNumericRepresentationUnsignedInt = 'uint', + kIOAudioStreamNumericRepresentationIEEE754Float = 'flot' +}; + +enum { + kIOAudioClockSelectorTypeInternal = 'int ', + kIOAudioClockSelectorTypeExternal = 'ext ', + kIOAudioClockSelectorTypeAESEBU = 'asbu', + kIOAudioClockSelectorTypeTOSLink = 'tosl', + kIOAudioClockSelectorTypeSPDIF = 'spdf', + kIOAudioClockSelectorTypeADATOptical = 'adto', + kIOAudioClockSelectorTypeADAT9Pin = 'adt9', + kIOAudioClockSelectorTypeSMPTE = 'smpt', + kIOAudioClockSelectorTypeVideo = 'vdeo', + kIOAudioClockSelectorTypeControl = 'cnrl', + kIOAudioClockSelectorTypeOther = 'othr', +}; + +enum { + kIOAudioStreamAlignmentLowByte = 0, + kIOAudioStreamAlignmentHighByte = 1 +}; + +enum { + kIOAudioStreamByteOrderBigEndian = 0, + kIOAudioStreamByteOrderLittleEndian = 1 +}; + +enum { + kIOAudioLevelControlNegativeInfinity = 0xffffffff +}; + +enum { +#ifndef __OPEN_SOURCE__ + kIOAudioBuiltInSystemClockDomain = 0x737973, +#endif + kIOAudioNewClockDomain = 0xffffffff +}; + +// Device connection types +#ifndef __OPEN_SOURCE__ +// Added kIOAudioDeviceTransportTypeDisplayPort +#endif +enum { + kIOAudioDeviceTransportTypeBuiltIn = 'bltn', + kIOAudioDeviceTransportTypePCI = 'pci ', + kIOAudioDeviceTransportTypeUSB = 'usb ', + kIOAudioDeviceTransportTypeFireWire = '1394', + kIOAudioDeviceTransportTypeNetwork = 'ntwk', + kIOAudioDeviceTransportTypeWireless = 'wrls', + kIOAudioDeviceTransportTypeOther = 'othr', + kIOAudioDeviceTransportTypeBluetooth = 'blue', + kIOAudioDeviceTransportTypeVirtual = 'virt', + kIOAudioDeviceTransportTypeDisplayPort = 'dprt', + kIOAudioDeviceTransportTypeHdmi = 'hdmi', + kIOAudioDeviceTransportTypeAVB = 'eavb', // + kIOAudioDeviceTransportTypeThunderbolt = 'thun' // +}; + +// types that go nowhere +enum { + OUTPUT_NULL = 0x0100, + INPUT_NULL = 0x0101 +}; + +// Input terminal types +enum { + INPUT_UNDEFINED = 0x0200, + INPUT_MICROPHONE = 0x0201, + INPUT_DESKTOP_MICROPHONE = 0x0202, + INPUT_PERSONAL_MICROPHONE = 0x0203, + INPUT_OMNIDIRECTIONAL_MICROPHONE = 0x0204, + INPUT_MICROPHONE_ARRAY = 0x0205, + INPUT_PROCESSING_MICROPHONE_ARRAY = 0x0206, + INPUT_MODEM_AUDIO = 0x207 +}; + +// Output terminal types +enum { + OUTPUT_UNDEFINED = 0x0300, + OUTPUT_SPEAKER = 0x0301, + OUTPUT_HEADPHONES = 0x0302, + OUTPUT_HEAD_MOUNTED_DISPLAY_AUDIO = 0x0303, + OUTPUT_DESKTOP_SPEAKER = 0x0304, + OUTPUT_ROOM_SPEAKER = 0x0305, + OUTPUT_COMMUNICATION_SPEAKER = 0x0306, + OUTPUT_LOW_FREQUENCY_EFFECTS_SPEAKER = 0x0307 +}; + +// Bi-directional terminal types +enum { + BIDIRECTIONAL_UNDEFINED = 0x0400, + BIDIRECTIONAL_HANDSET = 0x0401, + BIDIRECTIONAL_HEADSET = 0x0402, + BIDIRECTIONAL_SPEAKERPHONE_NO_ECHO_REDX = 0x0403, + BIDIRECTIONAL_ECHO_SUPPRESSING_SPEAKERPHONE = 0x0404, + BIDIRECTIONAL_ECHO_CANCELING_SPEAKERPHONE = 0x0405 +}; + +// Telephony terminal types +enum { + TELEPHONY_UNDEFINED = 0x0500, + TELEPHONY_PHONE_LINE = 0x0501, + TELEPHONY_TELEPHONE = 0x0502, + TELEPHONY_DOWN_LINE_PHONE = 0x0503 +}; + +// External terminal types +enum { + EXTERNAL_UNDEFINED = 0x0600, + EXTERNAL_ANALOG_CONNECTOR = 0x0601, + EXTERNAL_DIGITAL_AUDIO_INTERFACE = 0x0602, + EXTERNAL_LINE_CONNECTOR = 0x0603, + EXTERNAL_LEGACY_AUDIO_CONNECTOR = 0x0604, + EXTERNAL_SPDIF_INTERFACE = 0x0605, + EXTERNAL_1394_DA_STREAM = 0x0606, + EXTERNAL_1394_DV_STREAM_SOUNDTRACK = 0x0607, + EXTERNAL_ADAT = 0x0608, + EXTERNAL_TDIF = 0x0609, + EXTERNAL_MADI = 0x060A +}; + +// Embedded terminal types +enum { + EMBEDDED_UNDEFINED = 0x0700, + EMBEDDED_LEVEL_CALIBRATION_NOISE_SOURCE = 0x0701, + EMBEDDED_EQUALIZATION_NOISE = 0x0702, + EMBEDDED_CD_PLAYER = 0x0703, + EMBEDDED_DAT = 0x0704, + EMBEDDED_DCC = 0x0705, + EMBEDDED_MINIDISK = 0x0706, + EMBEDDED_ANALOG_TAPE = 0x0707, + EMBEDDED_PHONOGRAPH = 0x0708, + EMBEDDED_VCR_AUDIO = 0x0709, + EMBEDDED_VIDEO_DISC_AUDIO = 0x070A, + EMBEDDED_DVD_AUDIO = 0x070B, + EMBEDDED_TV_TUNER_AUDIO = 0x070C, + EMBEDDED_SATELLITE_RECEIVER_AUDIO = 0x070D, + EMBEDDED_CABLE_TUNER_AUDIO = 0x070E, + EMBEDDED_DSS_AUDIO = 0x070F, + EMBEDDED_RADIO_RECEIVER = 0x0710, + EMBEDDED_RADIO_TRANSMITTER = 0x0711, + EMBEDDED_MULTITRACK_RECORDER = 0x0712, + EMBEDDED_SYNTHESIZER = 0x0713 +}; + +// Processing terminal types +enum { + PROCESSOR_UNDEFINED = 0x0800, + PROCESSOR_GENERAL = 0x0801 +}; + +// Channel spatial position types + +#ifndef __OPEN_SOURCE__ +// NOTE: the following are derived from CoreAudioTypes.h +#endif + +#define kIOAudioChannelLabel_Discrete_field_ba 16 +enum { + kIOAudioChannelLabel_Unknown = 0xFFFFFFFF, // unknown or unspecified other use + kIOAudioChannelLabel_Unused = 0, // channel is present, but has no intended use or destination + kIOAudioChannelLabel_UseCoordinates = 100, // channel is described by the mCoordinates fields. + + kIOAudioChannelLabel_Left = 1, + kIOAudioChannelLabel_Right = 2, + kIOAudioChannelLabel_Center = 3, + kIOAudioChannelLabel_LFEScreen = 4, + kIOAudioChannelLabel_LeftSurround = 5, // WAVE: "Back Left" + kIOAudioChannelLabel_RightSurround = 6, // WAVE: "Back Right" + kIOAudioChannelLabel_LeftCenter = 7, + kIOAudioChannelLabel_RightCenter = 8, + kIOAudioChannelLabel_CenterSurround = 9, // WAVE: "Back Center" or plain "Rear Surround" + kIOAudioChannelLabel_LeftSurroundDirect = 10, // WAVE: "Side Left" + kIOAudioChannelLabel_RightSurroundDirect = 11, // WAVE: "Side Right" + kIOAudioChannelLabel_TopCenterSurround = 12, + kIOAudioChannelLabel_VerticalHeightLeft = 13, // WAVE: "Top Front Left" + kIOAudioChannelLabel_VerticalHeightCenter = 14, // WAVE: "Top Front Center" + kIOAudioChannelLabel_VerticalHeightRight = 15, // WAVE: "Top Front Right" + + kIOAudioChannelLabel_TopBackLeft = 16, + kIOAudioChannelLabel_TopBackCenter = 17, + kIOAudioChannelLabel_TopBackRight = 18, + + kIOAudioChannelLabel_RearSurroundLeft = 33, + kIOAudioChannelLabel_RearSurroundRight = 34, + kIOAudioChannelLabel_LeftWide = 35, + kIOAudioChannelLabel_RightWide = 36, + kIOAudioChannelLabel_LFE2 = 37, + kIOAudioChannelLabel_LeftTotal = 38, // matrix encoded 4 channels + kIOAudioChannelLabel_RightTotal = 39, // matrix encoded 4 channels + kIOAudioChannelLabel_HearingImpaired = 40, + kIOAudioChannelLabel_Narration = 41, + kIOAudioChannelLabel_Mono = 42, + kIOAudioChannelLabel_DialogCentricMix = 43, + + kIOAudioChannelLabel_CenterSurroundDirect = 44, // back center, non diffuse + + kIOAudioChannelLabel_Haptic = 45, + + // first order ambisonic channels + kIOAudioChannelLabel_Ambisonic_W = 200, + kIOAudioChannelLabel_Ambisonic_X = 201, + kIOAudioChannelLabel_Ambisonic_Y = 202, + kIOAudioChannelLabel_Ambisonic_Z = 203, + + // Mid/Side Recording + kIOAudioChannelLabel_MS_Mid = 204, + kIOAudioChannelLabel_MS_Side = 205, + + // X-Y Recording + kIOAudioChannelLabel_XY_X = 206, + kIOAudioChannelLabel_XY_Y = 207, + + // other + kIOAudioChannelLabel_HeadphonesLeft = 301, + kIOAudioChannelLabel_HeadphonesRight = 302, + kIOAudioChannelLabel_ClickTrack = 304, + kIOAudioChannelLabel_ForeignLanguage = 305, + + // generic discrete channel + kIOAudioChannelLabel_Discrete = 400, + + // numbered discrete channel + kIOAudioChannelLabel_Discrete_0 = ( 1 << kIOAudioChannelLabel_Discrete_field_ba ) | 0, + kIOAudioChannelLabel_Discrete_1 = ( 1 << kIOAudioChannelLabel_Discrete_field_ba ) | 1, + kIOAudioChannelLabel_Discrete_2 = ( 1 << kIOAudioChannelLabel_Discrete_field_ba ) | 2, + kIOAudioChannelLabel_Discrete_3 = ( 1 << kIOAudioChannelLabel_Discrete_field_ba ) | 3, + kIOAudioChannelLabel_Discrete_4 = ( 1 << kIOAudioChannelLabel_Discrete_field_ba ) | 4, + kIOAudioChannelLabel_Discrete_5 = ( 1 << kIOAudioChannelLabel_Discrete_field_ba ) | 5, + kIOAudioChannelLabel_Discrete_6 = ( 1 << kIOAudioChannelLabel_Discrete_field_ba ) | 6, + kIOAudioChannelLabel_Discrete_7 = ( 1 << kIOAudioChannelLabel_Discrete_field_ba ) | 7, + kIOAudioChannelLabel_Discrete_8 = ( 1 << kIOAudioChannelLabel_Discrete_field_ba ) | 8, + kIOAudioChannelLabel_Discrete_9 = ( 1 << kIOAudioChannelLabel_Discrete_field_ba ) | 9, + kIOAudioChannelLabel_Discrete_10 = ( 1 << kIOAudioChannelLabel_Discrete_field_ba ) | 10, + kIOAudioChannelLabel_Discrete_11 = ( 1 << kIOAudioChannelLabel_Discrete_field_ba ) | 11, + kIOAudioChannelLabel_Discrete_12 = ( 1 << kIOAudioChannelLabel_Discrete_field_ba ) | 12, + kIOAudioChannelLabel_Discrete_13 = ( 1 << kIOAudioChannelLabel_Discrete_field_ba ) | 13, + kIOAudioChannelLabel_Discrete_14 = ( 1 << kIOAudioChannelLabel_Discrete_field_ba ) | 14, + kIOAudioChannelLabel_Discrete_15 = ( 1 << kIOAudioChannelLabel_Discrete_field_ba ) | 15, + kIOAudioChannelLabel_Discrete_65535 = ( 1 << kIOAudioChannelLabel_Discrete_field_ba ) | 65535 +}; + + + +#endif /* _IOKIT_IOAUDIOTYPES_H */ diff --git a/QualcommWireless/include/IOKit/avc/IOFireWireAVCCommand.h b/QualcommWireless/include/IOKit/avc/IOFireWireAVCCommand.h new file mode 100644 index 0000000..ff9850d --- /dev/null +++ b/QualcommWireless/include/IOKit/avc/IOFireWireAVCCommand.h @@ -0,0 +1,94 @@ +/* + * Copyright (c) 1998-2001 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +#ifndef _IOKIT_IOFireWireAVCCommand_H +#define _IOKIT_IOFireWireAVCCommand_H + +#include + +/*! @class IOFireWireAVCCommand +*/ +class IOFireWireAVCCommand : public IOFWCommand +{ + OSDeclareDefaultStructors(IOFireWireAVCCommand) + +protected: + IOFWCommand *fWriteCmd; + IOMemoryDescriptor *fMem; + const UInt8 *fCommand; + + UInt32 fCmdLen; + UInt8 *fResponse; + UInt32 *fResponseLen; + int fCurRetries; + int fMaxRetries; + + UInt32 fWriteGen; + UInt16 fWriteNodeID; + bool bypassRobustCommandResponseMatching; + +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + struct ExpansionData { + bool fStarted; + bool fSyncWakeupSignaled; + }; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *fIOFireWireAVCCommandExpansion; + + static void writeDone(void *refcon, IOReturn status, IOFireWireNub *device, IOFWCommand *fwCmd); + + virtual IOReturn complete(IOReturn status); + virtual IOReturn execute(); + virtual void free(); + +public: + virtual bool init(IOFireWireNub *device, const UInt8 * command, UInt32 cmdLen, + UInt8 * response, UInt32 * responseLen); + virtual IOReturn reinit(IOFireWireNub *device, const UInt8 * command, UInt32 cmdLen, + UInt8 * response, UInt32 * responseLen); + + static IOFireWireAVCCommand *withNub(IOFireWireNub *device, const UInt8 * command, UInt32 cmdLen, + UInt8 * response, UInt32 * responseLen); + + static IOFireWireAVCCommand *withNub(IOFireWireNub *device, UInt32 generation, + const UInt8 * command, UInt32 cmdLen, UInt8 * response, UInt32 * responseLen); + + virtual UInt32 handleResponse(UInt16 nodeID, UInt32 len, const void *buf); + + virtual IOReturn resetInterimTimeout(); + + virtual UInt32 handleResponseWithSimpleMatching(UInt16 nodeID, UInt32 len, const void *buf); + + virtual IOReturn submit(bool queue = false); + +private: + OSMetaClassDeclareReservedUsed(IOFireWireAVCCommand, 0); + OSMetaClassDeclareReservedUnused(IOFireWireAVCCommand, 1); + OSMetaClassDeclareReservedUnused(IOFireWireAVCCommand, 2); + OSMetaClassDeclareReservedUnused(IOFireWireAVCCommand, 3); +}; + +#endif // _IOKIT_IOFireWireAVCCommand_H + diff --git a/QualcommWireless/include/IOKit/avc/IOFireWireAVCConsts.h b/QualcommWireless/include/IOKit/avc/IOFireWireAVCConsts.h new file mode 100644 index 0000000..ae7a12c --- /dev/null +++ b/QualcommWireless/include/IOKit/avc/IOFireWireAVCConsts.h @@ -0,0 +1,259 @@ +/* + * Copyright (c) 1998-2001 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +#ifndef _IOKIT_IOFIREWIREAVCCONSTS_H +#define _IOKIT_IOFIREWIREAVCCONSTS_H + +// Fields of AVC frame +typedef enum { + kAVCCommandResponse = 0, + kAVCAddress = 1, + kAVCOpcode = 2, + kAVCOperand0 = 3, + kAVCOperand1 = 4, + kAVCOperand2 = 5, + kAVCOperand3 = 6, + kAVCOperand4 = 7, + kAVCOperand5 = 8, + kAVCOperand6 = 9, + kAVCOperand7 = 10, + kAVCOperand8 = 11 +} IOAVCFrameFields; + +// Command/Response values +typedef enum { + kAVCControlCommand = 0x00, + kAVCStatusInquiryCommand = 0x01, + kAVCSpecificInquiryCommand = 0x02, + kAVCNotifyCommand = 0x03, + kAVCGeneralInquiryCommand = 0x04, + kAVCNotImplementedStatus = 0x08, + kAVCAcceptedStatus = 0x09, + kAVCRejectedStatus = 0x0a, + kAVCInTransitionStatus = 0x0b, + kAVCImplementedStatus = 0x0c, + kAVCChangedStatus = 0x0d, + kAVCInterimStatus = 0x0f +} IOAVCCommandResponse; + +// Opcodes +typedef enum { + + // Unit commands + kAVCPlugInfoOpcode = 0x02, + kAVCOutputPlugSignalFormatOpcode = 0x18, + kAVCInputPlugSignalFormatOpcode = 0x19, + kAVCUnitInfoOpcode = 0x30, + kAVCSubunitInfoOpcode = 0x31, + kAVCConnectionsOpcode = 0x22, + kAVCConnectOpcode = 0x24, + kAVCDisconnectOpcode = 0x25, + kAVCPowerOpcode = 0xB2, + kAVCSignalSourceOpcode = 0x1A, + + // Vendor dependent commands + kAVCVendorDependentOpcode = 0x00, + + // Subunit commands + kAVCOutputSignalModeOpcode = 0x78, + kAVCInputSignalModeOpcode = 0x79, + kAVCSignalModeSD525_60 = 0x00, + kAVCSignalModeSDL525_60 = 0x04, + kAVCSignalModeHD1125_60 = 0x08, + kAVCSignalModeSD625_50 = 0x80, + kAVCSignalModeSDL625_50 = 0x84, + kAVCSignalModeHD1250_50 = 0x88, + kAVCSignalModeDVCPro525_60 = 0x78, + kAVCSignalModeDVCPro625_50 = 0xf8, + + kAVCSignalModeDummyOperand = 0xff, + kAVCSignalModeMask_50 = 0x80, + kAVCSignalModeMask_STYPE = 0x7c, + kAVCSignalModeMask_SDL = 0x04, + kAVCSignalModeMask_DVCPro25 = 0x78 + +} IOAVCOpcodes; + +// Unit/Subunit types +typedef enum { + kAVCVideoMonitor = 0x00, + kAVCAudio = 0x01, + kAVCPrinter = 0x02, + kAVCDiskRecorder = 0x03, + kAVCTapeRecorder = 0x04, + kAVCTuner = 0x05, + kAVCVideoCamera = 0x07, + kAVCCameraStorage = 0x0b, + kAVCVendorUnique = 0x1c, + kAVCNumSubUnitTypes = 0x20 +} IOAVCUnitTypes; + +#define kAVCAllOpcodes 0xFF +#define kAVCAllSubunitsAndUnit 0xEE +#define kAVCMaxNumPlugs 31 +#define kAVCAnyAvailableIsochPlug 0x7F +#define kAVCAnyAvailableExternalPlug 0xFF +#define kAVCAnyAvailableSubunitPlug 0xFF +#define kAVCMultiplePlugs 0xFD +#define kAVCInvalidPlug 0xFE + + +#define IOAVCAddress(type, id) (((type) << 3) | (id)) +#define kAVCUnitAddress 0xff +#define IOAVCType(address) ((address) >> 3) +#define IOAVCId(address) ((address) & 0x7) + +// Macros for Plug Control Register field manipulation + +// Master control registers +#define kIOFWPCRDataRate FWBitRange(0,1) +#define kIOFWPCRDataRatePhase FWBitRangePhase(0,1) +#define kIOFWPCRExtension FWBitRange(8,15) +#define kIOFWPCRExtensionPhase FWBitRangePhase(8,15) +#define kIOFWPCRNumPlugs FWBitRange(27,31) +#define kIOFWPCRNumPlugsPhase FWBitRangePhase(27,31) + +// master output register +#define kIOFWPCRBroadcastBase FWBitRange(2,7) +#define kIOFWPCRBroadcastBasePhase FWBitRangePhase(2,7) + +// plug registers +#define kIOFWPCROnline FWBitRange(0,0) +#define kIOFWPCROnlinePhase FWBitRangePhase(0,0) +#define kIOFWPCRBroadcast FWBitRange(1,1) +#define kIOFWPCRBroadcastPhase FWBitRangePhase(1,1) +#define kIOFWPCRP2PCount FWBitRange(2,7) +#define kIOFWPCRP2PCountPhase FWBitRangePhase(2,7) +#define kIOFWPCRChannel FWBitRange(10,15) +#define kIOFWPCRChannelPhase FWBitRangePhase(10,15) + +// Extra fields for output plug registers +#define kIOFWPCROutputDataRate FWBitRange(16,17) +#define kIOFWPCROutputDataRatePhase FWBitRangePhase(16,17) +#define kIOFWPCROutputOverhead FWBitRange(18,21) +#define kIOFWPCROutputOverheadPhase FWBitRangePhase(18,21) +#define kIOFWPCROutputPayload FWBitRange(22,31) +#define kIOFWPCROutputPayloadPhase FWBitRangePhase(22,31) + +// async plug numbers + +enum +{ + kFWAVCAsyncPlug0 = 0xa0, + kFWAVCAsyncPlug1 = 0xa1, + kFWAVCAsyncPlug2 = 0xa2, + kFWAVCAsyncPlug3 = 0xa3, + kFWAVCAsyncPlug4 = 0xa4, + kFWAVCAsyncPlug5 = 0xa5, + kFWAVCAsyncPlug6 = 0xa6, + kFWAVCAsyncPlug7 = 0xa7, + kFWAVCAsyncPlug8 = 0xa8, + kFWAVCAsyncPlug9 = 0xa9, + kFWAVCAsyncPlug10 = 0xa1, + kFWAVCAsyncPlug11 = 0xab, + kFWAVCAsyncPlug12 = 0xac, + kFWAVCAsyncPlug13 = 0xad, + kFWAVCAsyncPlug14 = 0xae, + kFWAVCAsyncPlug15 = 0xaf, + kFWAVCAsyncPlug16 = 0xb0, + kFWAVCAsyncPlug17 = 0xb1, + kFWAVCAsyncPlug18 = 0xb2, + kFWAVCAsyncPlug19 = 0xb3, + kFWAVCAsyncPlug20 = 0xb4, + kFWAVCAsyncPlug21 = 0xb5, + kFWAVCAsyncPlug22 = 0xb6, + kFWAVCAsyncPlug23 = 0xb7, + kFWAVCAsyncPlug24 = 0xb8, + kFWAVCAsyncPlug25 = 0xb9, + kFWAVCAsyncPlug26 = 0xba, + kFWAVCAsyncPlug27 = 0xbb, + kFWAVCAsyncPlug28 = 0xbc, + kFWAVCAsyncPlug29 = 0xbd, + kFWAVCAsyncPlug30 = 0xbe, + kFWAVCAsyncPlugAny = 0xbf +}; + +enum +{ + kFWAVCStateBusSuspended = 0, + kFWAVCStateBusResumed = 1, + kFWAVCStatePlugReconnected = 2, + kFWAVCStatePlugDisconnected = 3, + kFWAVCStateDeviceRemoved = 4 +}; + +enum +{ + kFWAVCConsumerMode_MORE = 1, + kFWAVCConsumerMode_LAST = 4, + kFWAVCConsumerMode_LESS = 5, + kFWAVCConsumerMode_JUNK = 6, + kFWAVCConsumerMode_LOST = 7 +}; + +enum +{ + kFWAVCProducerMode_SEND = 5, + kFWAVCProducerMode_TOSS = 7 +}; + + +typedef enum +{ + IOFWAVCPlugSubunitSourceType, + IOFWAVCPlugSubunitDestType, + IOFWAVCPlugIsochInputType, + IOFWAVCPlugIsochOutputType, + IOFWAVCPlugAsynchInputType, + IOFWAVCPlugAsynchOutputType, + IOFWAVCPlugExternalInputType, + IOFWAVCPlugExternalOutputType +} IOFWAVCPlugTypes; + +typedef enum +{ + kIOFWAVCSubunitPlugMsgConnected, + kIOFWAVCSubunitPlugMsgDisconnected, + kIOFWAVCSubunitPlugMsgConnectedPlugModified, + kIOFWAVCSubunitPlugMsgSignalFormatModified +} IOFWAVCSubunitPlugMessages; + +// Some plug signal formats +#define kAVCPlugSignalFormatNTSCDV 0x80000000 +#define kAVCPlugSignalFormatPalDV 0x80800000 +#define kAVCPlugSignalFormatMPEGTS 0xA0000000 + +// Possible states of an AVCAsynchronousCommand +typedef enum +{ + kAVCAsyncCommandStatePendingRequest, + kAVCAsyncCommandStateRequestSent, + kAVCAsyncCommandStateRequestFailed, + kAVCAsyncCommandStateWaitingForResponse, + kAVCAsyncCommandStateReceivedInterimResponse, + kAVCAsyncCommandStateReceivedFinalResponse, + kAVCAsyncCommandStateTimeOutBeforeResponse, + kAVCAsyncCommandStateBusReset, + kAVCAsyncCommandStateOutOfMemory, + kAVCAsyncCommandStateCanceled +} IOFWAVCAsyncCommandState; + +#endif // _IOKIT_IOFIREWIREAVCCONSTS_H diff --git a/QualcommWireless/include/IOKit/avc/IOFireWireAVCRequestSpace.h b/QualcommWireless/include/IOKit/avc/IOFireWireAVCRequestSpace.h new file mode 100644 index 0000000..c02797f --- /dev/null +++ b/QualcommWireless/include/IOKit/avc/IOFireWireAVCRequestSpace.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2001 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * + * IOFireWirePCRSpace.h + * + * Class to multiplex access to the FCP request address. + */ +#ifndef _IOKIT_IOFIREWIREAVCREQUESTSPACE_H +#define _IOKIT_IOFIREWIREAVCREQUESTSPACE_H + +#endif /* _IOKIT_IOFIREWIREAVCREQUESTSPACE_H */ diff --git a/QualcommWireless/include/IOKit/avc/IOFireWireAVCTargetSpace.h b/QualcommWireless/include/IOKit/avc/IOFireWireAVCTargetSpace.h new file mode 100644 index 0000000..4f3cdb0 --- /dev/null +++ b/QualcommWireless/include/IOKit/avc/IOFireWireAVCTargetSpace.h @@ -0,0 +1,297 @@ +/* + * Copyright (c) 2003 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/* + * + * IOFireWireAVCTargetSpace.h + * + * Class to centralize the AVC Target mode support + * + */ + +#ifndef _IOKIT_IOFIREWIREAVCTARGETSPACE_H +#define _IOKIT_IOFIREWIREAVCTARGETSPACE_H + +#include +#include + +#include +#include +#include +#include + +class IOFireWireAVCProtocolUserClient; +class AVCCommandHandlerInfo; +class AVCSubunitInfo; + +typedef void (*IOFireWireAVCTargetCommandHandlerCallback)(const AVCCommandHandlerInfo *pCmdInfo, + UInt32 generation, + UInt16 nodeID, + const void *command, + UInt32 cmdLen, + IOFWSpeed &speed, + UInt32 handlerSearchIndex); + +typedef void (*IOFireWireAVCSubunitPlugHandlerCallback)(const AVCSubunitInfo *pSubunitInfo, + IOFWAVCSubunitPlugMessages plugMessage, + IOFWAVCPlugTypes plugType, + UInt32 plugNum, + UInt32 messageParams, + UInt32 generation, + UInt16 nodeID); + +/*! +@class AVCCommandHandlerInfo +@abstract internal class to manage installed command handlers +*/ +class AVCCommandHandlerInfo : public OSObject +{ + OSDeclareDefaultStructors(AVCCommandHandlerInfo) +public: + IOFireWireAVCProtocolUserClient * userClient; + IOFireWireAVCTargetCommandHandlerCallback callBack; + OSAsyncReference64 asyncRef; + UInt32 subUnitTypeAndID; + UInt32 opCode; + uint64_t userCallBack; + uint64_t userRefCon; +}; + +typedef struct _AVCSubunitPlugRecord +{ + UInt32 plugSignalFormat; + UInt32 connectionCount; +}AVCSubunitPlugRecord; + +/*! +@class AVCSubunitInfo +@abstract internal class to manage installed subunits +*/ +class AVCSubunitInfo : public OSObject +{ + OSDeclareDefaultStructors(AVCSubunitInfo) + bool init(); + void free(); +public: + static AVCSubunitInfo *create(); + IOFireWireAVCProtocolUserClient * userClient; + IOFireWireAVCSubunitPlugHandlerCallback callBack; + OSAsyncReference64 asyncRef; + UInt32 subunitTypeAndID; + UInt32 numSourcePlugs; + UInt32 numDestPlugs; + uint64_t userCallBack; + uint64_t userRefCon; + AVCSubunitPlugRecord *sourcePlugRecords; + AVCSubunitPlugRecord *destPlugRecords; +}; + +typedef struct _AVCUnitPlugRecord +{ + UInt32 connectionCount; +}AVCUnitPlugRecord; + +typedef struct _AVCUnitPlugs +{ + UInt32 numIsochInPlugs; + UInt32 numIsochOutPlugs; + UInt32 numExternalInPlugs; + UInt32 numExternalOutPlugs; + AVCUnitPlugRecord isochInPlugRecord[kAVCMaxNumPlugs]; + AVCUnitPlugRecord isochOutPlugRecord[kAVCMaxNumPlugs]; + AVCUnitPlugRecord externalInPlugRecord[kAVCMaxNumPlugs]; + AVCUnitPlugRecord externalOutPlugRecord[kAVCMaxNumPlugs]; +}AVCUnitPlugs; + +/*! +@class UCInfo +@abstract internal class to manage multiple protocol user clients +*/ +class UCInfo : public OSObject +{ + OSDeclareDefaultStructors(UCInfo) +public: + IOFireWireAVCProtocolUserClient *fUserClient; +}; + +/*! +@class AVCConnectionRecord +@abstract internal class to manage AVC connections +*/ +class AVCConnectionRecord : public OSObject +{ + OSDeclareDefaultStructors(AVCConnectionRecord) +public: + UInt32 sourceSubunitTypeAndID; + IOFWAVCPlugTypes sourcePlugType; + UInt32 sourcePlugNum; + UInt32 destSubunitTypeAndID; + IOFWAVCPlugTypes destPlugType; + UInt32 destPlugNum; + bool lockConnection; + bool permConnection; +}; + +/*! +@class IOFireWireAVCTargetSpace +@abstract object to centralize the AVC Target mode support +*/ +class IOFireWireAVCTargetSpace : public IOFWPseudoAddressSpace +{ + OSDeclareDefaultStructors(IOFireWireAVCTargetSpace) + +protected: + UInt32 fBuf[512]; + UInt32 fActivations; + IOFireWireController *fController; + IOLocalConfigDirectory * fAVCLocalConfigDirectory; + OSArray * fUserClients; + OSArray * fCommandHandlers; + OSArray * fSubunits; + OSArray * fConnectionRecords; + AVCUnitPlugs fUnitPlugs; + IORecursiveLock * fLock; + + /*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + struct ExpansionData { }; + + /*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + + virtual UInt32 doWrite(UInt16 nodeID, IOFWSpeed &speed, FWAddress addr, UInt32 len, + const void *buf, IOFWRequestRefCon refcon); + + + IOReturn targetSendAVCResponse(UInt32 generation, UInt16 nodeID, IOBufferMemoryDescriptor *pBufMemDesc, UInt32 size); + + // Internal AVC Target Command Handlers + IOReturn handleUnitInfoCommand(UInt16 nodeID, UInt32 generation, const char *buf, UInt32 len); + IOReturn handleSubUnitInfoCommand(UInt16 nodeID, UInt32 generation, const char *buf, UInt32 len); + IOReturn handlePlugInfoCommand(UInt16 nodeID, UInt32 generation, const char *buf, UInt32 len); + IOReturn handlePowerCommand(UInt16 nodeID, UInt32 generation, const char *buf, UInt32 len); + IOReturn handleConnectCommand(UInt16 nodeID, UInt32 generation, const char *buf, UInt32 len); + IOReturn handleDisconnectCommand(UInt16 nodeID, UInt32 generation, const char *buf, UInt32 len); + IOReturn handleInputPlugSignalFormatCommand(UInt16 nodeID, UInt32 generation, const char *buf, UInt32 len); + IOReturn handleOutputPlugSignalFormatCommand(UInt16 nodeID, UInt32 generation, const char *buf, UInt32 len); + IOReturn handleConnectionsCommand(UInt16 nodeID, UInt32 generation, const char *buf, UInt32 len); + IOReturn handleSignalSourceCommand(UInt16 nodeID, UInt32 generation, const char *buf, UInt32 len); + + UInt32 subUnitOfTypeCount(UInt32 type); + AVCSubunitInfo *getSubunitInfo(UInt32 subunitTypeAndID); + bool canConnectDestPlug(UInt32 destSubunitTypeAndID, + IOFWAVCPlugTypes destPlugType, + UInt32 *destPlugNum); + +public: + + // Activate/Deactivate Functions + virtual IOReturn activateWithUserClient(IOFireWireAVCProtocolUserClient *userClient); + virtual void deactivateWithUserClient(IOFireWireAVCProtocolUserClient *userClient); + + /*! + @function init + @abstract initializes the IOFireWireAVCTargetSpace object + */ + virtual bool init(IOFireWireController *controller); + + /*! + @function getAVCTargetSpace + @abstract returns the IOFireWireAVCTargetSpace object for the given FireWire bus + @param bus The FireWire bus + */ + static IOFireWireAVCTargetSpace *getAVCTargetSpace(IOFireWireController *controller); + + /*! + @function publishAVCUnitDirectory + @abstract Creates a local AVC Unit directory if it doesn't already exist + */ + virtual IOReturn publishAVCUnitDirectory(void); + + virtual IOReturn installAVCCommandHandler(IOFireWireAVCProtocolUserClient *userClient, + IOFireWireAVCTargetCommandHandlerCallback callBack, + OSAsyncReference64 asyncRef, + UInt32 subUnitTypeAndID, + UInt32 opCode, + uint64_t userCallBack, + uint64_t userRefCon); + + virtual IOReturn addSubunit(IOFireWireAVCProtocolUserClient *userClient, + IOFireWireAVCSubunitPlugHandlerCallback callBack, + OSAsyncReference64 asyncRef, + UInt32 subunitType, + UInt32 numSourcePlugs, + UInt32 numDestPlugs, + uint64_t userCallBack, + uint64_t userRefCon, + UInt32 *subUnitID); + + virtual IOReturn setSubunitPlugSignalFormat(IOFireWireAVCProtocolUserClient *userClient, + UInt32 subunitTypeAndID, + IOFWAVCPlugTypes plugType, + UInt32 plugNum, + UInt32 signalFormat); + + virtual IOReturn getSubunitPlugSignalFormat(IOFireWireAVCProtocolUserClient *userClient, + UInt32 subunitTypeAndID, + IOFWAVCPlugTypes plugType, + UInt32 plugNum, + UInt32 *pSignalFormat); + + virtual IOReturn connectTargetPlugs(IOFireWireAVCProtocolUserClient *userClient, + AVCConnectTargetPlugsInParams *inParams, + AVCConnectTargetPlugsOutParams *outParams); + + virtual IOReturn disconnectTargetPlugs(IOFireWireAVCProtocolUserClient *userClient, + UInt32 sourceSubunitTypeAndID, + IOFWAVCPlugTypes sourcePlugType, + UInt32 sourcePlugNum, + UInt32 destSubunitTypeAndID, + IOFWAVCPlugTypes destPlugType, + UInt32 destPlugNum); + + virtual IOReturn getTargetPlugConnection(IOFireWireAVCProtocolUserClient *userClient, + AVCGetTargetPlugConnectionInParams *inParams, + AVCGetTargetPlugConnectionOutParams *outParams); + + virtual IOReturn findAVCRequestHandler(IOFireWireAVCProtocolUserClient *userClient, + UInt32 generation, + UInt16 nodeID, + IOFWSpeed speed, + UInt32 handlerSearchIndex, + const char *pCmdBuf, + UInt32 cmdLen); + + virtual void pcrModified(IOFWAVCPlugTypes plugType, + UInt32 plugNum, + UInt32 newValue); + +private: + OSMetaClassDeclareReservedUnused(IOFireWireAVCTargetSpace, 0); + OSMetaClassDeclareReservedUnused(IOFireWireAVCTargetSpace, 1); + OSMetaClassDeclareReservedUnused(IOFireWireAVCTargetSpace, 2); + OSMetaClassDeclareReservedUnused(IOFireWireAVCTargetSpace, 3); +}; + +#endif /*_IOKIT_IOFIREWIREAVCTARGETSPACE_H */ \ No newline at end of file diff --git a/QualcommWireless/include/IOKit/avc/IOFireWireAVCUnit.h b/QualcommWireless/include/IOKit/avc/IOFireWireAVCUnit.h new file mode 100644 index 0000000..0abf1cd --- /dev/null +++ b/QualcommWireless/include/IOKit/avc/IOFireWireAVCUnit.h @@ -0,0 +1,408 @@ +/* + * Copyright (c) 1998-2001 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOFIREWIREAVCUNIT_H +#define _IOKIT_IOFIREWIREAVCUNIT_H + +#include +#include +#include +#include +#include + +extern const OSSymbol *gIOAVCUnitType; + +class IOFireWireNub; +class IOFireWireAVCCommand; +class IOFireWirePCRSpace; +class IOFireWireAVCUnit; +class IOFireWireAVCSubUnit; +class IOFireWireAVCAsynchronousCommand; +class IOFireWireAVCNub; + +// The callback prototype for AVC Asynchronous Commands +typedef void (*IOFireWireAVCAsynchronousCommandCallback)(void *pRefCon, IOFireWireAVCAsynchronousCommand *pCommandObject); + +const UInt16 kIOFWAVCAsyncCmdFreed = 0xdead; + +/*! +@class IOFireWireAVCAsynchronousCommand +*/ +class IOFireWireAVCAsynchronousCommand : public IOCommand +{ + OSDeclareDefaultStructors(IOFireWireAVCAsynchronousCommand) + void free(void); + + friend class IOFireWireAVCUnit; + +protected: + /*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + struct ExpansionData { }; + + /*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + +public: + IOReturn init(const UInt8 * command, UInt32 len, IOFireWireAVCAsynchronousCommandCallback completionCallback, void *pClientRefCon); + IOReturn submit(IOFireWireAVCNub *pAVCNub); + IOReturn cancel(void); + IOReturn reinit(const UInt8 * command, UInt32 cmdLen); + + // This function returns true if this command is currently waiting for a response + bool isPending(void); + + IOFWAVCAsyncCommandState cmdState; + void *pRefCon; + UInt8 *pCommandBuf; + UInt32 cmdLen; + UInt8 *pInterimResponseBuf; + UInt32 interimResponseLen; + UInt8 *pFinalResponseBuf; + UInt32 finalResponseLen; + +protected: + IOFireWireAVCAsynchronousCommandCallback fCallback; + IOFireWireAVCUnit *fAVCUnit; + IOMemoryDescriptor *fMem; + IOFWCommand *fWriteCmd; + IOFWDelayCommand *fDelayCmd; + UInt16 fWriteNodeID; + UInt32 fWriteGen; + +private: + OSMetaClassDeclareReservedUnused(IOFireWireAVCAsynchronousCommand, 0); + OSMetaClassDeclareReservedUnused(IOFireWireAVCAsynchronousCommand, 1); + OSMetaClassDeclareReservedUnused(IOFireWireAVCAsynchronousCommand, 2); + OSMetaClassDeclareReservedUnused(IOFireWireAVCAsynchronousCommand, 3); +}; + +/*! + @class IOFireWireAVCNub + @abstract nub for AVC devices +*/ +class IOFireWireAVCNub : public IOService +{ + OSDeclareDefaultStructors(IOFireWireAVCNub) + +protected: + IOFireWireNub * fDevice; + +public: + // execute AVC command +/*! + @function AVCCommand + @abstract Sends an AVC command to the device and stores the response. + @param command Pointer to command to send. + @param cmdLen Length of the command. + @param response Pointer to place to store the response. + @param responseLen Pointer to response length - initialize to the size of the buffer pointed to by response, + updated to the number of bytes returned by the device. +*/ + virtual IOReturn AVCCommand(const UInt8 * command, UInt32 cmdLen, UInt8 * response, UInt32 *responseLen) = 0; + +/*! + @function AVCCommandInGeneration + @abstract Sends an AVC command to the device and stores the response. The command must complete in the specified + FireWire bus generation otherwise kIOFireWireBusReset is returned. + @param generation The bus generation that the command must execute in. + @param command Pointer to command to send. + @param cmdLen Length of the command. + @param response Pointer to place to store the response. + @param responseLen Pointer to response length - initialize to the size of the buffer pointed to by response, + updated to the number of bytes returned by the device. +*/ + virtual IOReturn AVCCommandInGeneration(UInt32 generation, + const UInt8 * command, UInt32 cmdLen, UInt8 * response, UInt32 *responseLen) = 0; + +/*! + @function getDevice + @abstract Returns the FireWire device nub that is this object's provider . +*/ + IOFireWireNub* getDevice() const + {return fDevice;}; + +/*! + @function updateAVCCommandTimeout + @abstract By default, AVCCommands timeout 10 seconds after receiving an Interim response. + This function resets the timeout of the current command to 10 seconds from the current time. + Call this repeatedly for AVC commands that take a very long time to execute to prevent premature + timeout. +*/ + virtual IOReturn updateAVCCommandTimeout() = 0; + +private: + OSMetaClassDeclareReservedUsed(IOFireWireAVCNub, 0); + OSMetaClassDeclareReservedUnused(IOFireWireAVCNub, 1); + OSMetaClassDeclareReservedUnused(IOFireWireAVCNub, 2); + OSMetaClassDeclareReservedUnused(IOFireWireAVCNub, 3); +}; + +/*! + @class IOFireWireAVCUnit + @abstract nub for AVC devices +*/ +class IOFireWireAVCUnit : public IOFireWireAVCNub +{ + OSDeclareDefaultStructors(IOFireWireAVCUnit) + + friend class IOFireWireAVCAsynchronousCommand; + +protected: + IOFWPseudoAddressSpace *fFCPResponseSpace; + IOLock *avcLock; + IOFireWireAVCCommand *fCommand; + + UInt8 fSubUnitCount[kAVCNumSubUnitTypes]; + + bool fStarted; + IOLock *cmdLock; + +/*! @struct ExpansionData + @discussion This structure is used to expand the capablilties of the class in a binary compatible way + */ + struct ExpansionData + { + OSArray * fAVCAsyncCommands; + IOFireWireController *fControl; + bool enableRobustAVCCommandResponseMatching; + }; + +/*! @var fIOFireWireAVCUnitExpansion + */ + ExpansionData *fIOFireWireAVCUnitExpansion; + + static UInt32 AVCResponse(void *refcon, UInt16 nodeID, IOFWSpeed &speed, + FWAddress addr, UInt32 len, const void *buf, IOFWRequestRefCon requestRefcon); + + static void rescanSubUnits(void *arg); + + virtual void free(void); + + virtual void updateSubUnits(bool firstTime); + + static void AVCAsynchRequestWriteDone(void *refcon, IOReturn status, IOFireWireNub *device, IOFWCommand *fwCmd); + static void AVCAsynchDelayDone(void *refcon, IOReturn status, IOFireWireBus *bus, IOFWBusCommand *fwCmd); + +public: + // IOService overrides + virtual bool start(IOService *provider); + virtual IOReturn message(UInt32 type, IOService *provider, void *argument); + virtual IOReturn setProperties (OSObject * properties ); + +/*! @function handleOpen + @abstract Overrideable method to control the open / close behaviour of an IOService. + @discussion See IOService for discussion. + @param forClient Designates the client of the provider requesting the open. + @param options Options for the open, may be interpreted by the implementor of handleOpen. + @result Return true if the open was successful, false otherwise. +*/ + + virtual bool handleOpen( IOService * forClient, + IOOptionBits options, + void * arg ); +/*! + @function handleClose + @abstract Overrideable method to control the open / close behaviour of an IOService. + @discussion See IOService for discussion. + @param forClient Designates the client of the provider requesting the close. + @param options Options for the close, may be interpreted by the implementor of handleOpen. +*/ + + virtual void handleClose( IOService * forClient, + IOOptionBits options ); + + +/*! + @function matchPropertyTable + @abstract Matching language support + Match on the following properties of the unit: + Vendor_ID + GUID + Unit_Type + and available sub-units, match if the device has at least the requested number of a sub-unit type: + AVCSubUnit_0 -> AVCSubUnit_1f +*/ + virtual bool matchPropertyTable(OSDictionary * table); + + // execute AVC command +/*! + @function AVCCommand + @abstract Sends an AVC command to the device and stores the response. + @param command Pointer to command to send. + @param cmdLen Length of the command. + @param response Pointer to place to store the response. + @param responseLen Pointer to response length - initialize to the size of the buffer pointed to by response, + updated to the number of bytes returned by the device. +*/ + virtual IOReturn AVCCommand(const UInt8 * command, UInt32 cmdLen, UInt8 * response, UInt32 *responseLen); + +/*! + @function AVCCommandInGeneration + @abstract Sends an AVC command to the device and stores the response. The command must complete in the specified + FireWire bus generation otherwise kIOFireWireBusReset is returned. + @param generation The bus generation that the command must execute in. + @param command Pointer to command to send. + @param cmdLen Length of the command. + @param response Pointer to place to store the response. + @param responseLen Pointer to response length - initialize to the size of the buffer pointed to by response, + updated to the number of bytes returned by the device. +*/ + virtual IOReturn AVCCommandInGeneration(UInt32 generation, + const UInt8 * command, UInt32 cmdLen, UInt8 * response, UInt32 *responseLen); + +/*! + @function updateAVCCommandTimeout + @abstract By default, AVCCommands timeout 10 seconds after receiving an Interim response. + This function resets the timeout of the current command to 10 seconds from the current time. + Call this repeatedly for AVC commands that take a very long time to execute to prevent premature + timeout. +*/ + virtual IOReturn updateAVCCommandTimeout(); + +protected: + UInt32 indexOfAVCAsynchronousCommandObject(IOFireWireAVCAsynchronousCommand *pCommandObject); + void removeAVCAsynchronousCommandObjectAtIndex(UInt32 index); + + void lockAVCAsynchronousCommandLock(); + + void unlockAVCAsynchronousCommandLock(); + + bool available(); + +private: + + OSMetaClassDeclareReservedUnused(IOFireWireAVCUnit, 0); + OSMetaClassDeclareReservedUnused(IOFireWireAVCUnit, 1); + OSMetaClassDeclareReservedUnused(IOFireWireAVCUnit, 2); + OSMetaClassDeclareReservedUnused(IOFireWireAVCUnit, 3); + +}; + +/*! + @class IOFireWireAVCSubUnit + @abstract nub for sub unit of AVC devices. Just for matching, calls the AVC unit for all functions. +*/ +class IOFireWireAVCSubUnit : public IOFireWireAVCNub +{ + OSDeclareDefaultStructors(IOFireWireAVCSubUnit) + + friend class IOFireWireAVCAsynchronousCommand; + +protected: + IOFireWireAVCUnit *fAVCUnit; + +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + struct ExpansionData { }; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + +public: + virtual bool init(OSDictionary *propTable, IOFireWireAVCUnit *provider); + + // IOService overrides + virtual IOReturn message(UInt32 type, IOService *provider, void *argument); + +/*! @function handleOpen + @abstract Overrideable method to control the open / close behaviour of an IOService. + @discussion See IOService for discussion. + @param forClient Designates the client of the provider requesting the open. + @param options Options for the open, may be interpreted by the implementor of handleOpen. + @result Return true if the open was successful, false otherwise. +*/ + + virtual bool handleOpen( IOService * forClient, + IOOptionBits options, + void * arg ); +/*! + @function handleClose + @abstract Overrideable method to control the open / close behaviour of an IOService. + @discussion See IOService for discussion. + @param forClient Designates the client of the provider requesting the close. + @param options Options for the close, may be interpreted by the implementor of handleOpen. +*/ + + virtual void handleClose( IOService * forClient, + IOOptionBits options ); + + +/*! + @function matchPropertyTable + @abstract Matching language support + Match on the following properties of the sub unit: + Vendor_ID + GUID + SubUnit_Type +*/ + virtual bool matchPropertyTable(OSDictionary * table); + + // execute AVC command +/*! + @function AVCCommand + @abstract Sends an AVC command to the device and stores the response. + @param command Pointer to command to send. + @param cmdLen Length of the command. + @param response Pointer to place to store the response. + @param responseLen Pointer to response length - initialize to the size of the buffer pointed to by response, + updated to the number of bytes returned by the device. +*/ + virtual IOReturn AVCCommand(const UInt8 * command, UInt32 cmdLen, UInt8 * response, UInt32 *responseLen); + +/*! + @function AVCCommandInGeneration + @abstract Sends an AVC command to the device and stores the response. The command must complete in the specified + FireWire bus generation otherwise kIOFireWireBusReset is returned. + @param generation The bus generation that the command must execute in. + @param command Pointer to command to send. + @param cmdLen Length of the command. + @param response Pointer to place to store the response. + @param responseLen Pointer to response length - initialize to the size of the buffer pointed to by response, + updated to the number of bytes returned by the device. +*/ + virtual IOReturn AVCCommandInGeneration(UInt32 generation, + const UInt8 * command, UInt32 cmdLen, UInt8 * response, UInt32 *responseLen); + +/*! + @function updateAVCCommandTimeout + @abstract By default, AVCCommands timeout 10 seconds after receiving an Interim response. + This function resets the timeout of the current command to 10 seconds from the current time. + Call this repeatedly for AVC commands that take a very long time to execute to prevent premature + timeout. +*/ + virtual IOReturn updateAVCCommandTimeout(); + +private: + OSMetaClassDeclareReservedUnused(IOFireWireAVCSubUnit, 0); + OSMetaClassDeclareReservedUnused(IOFireWireAVCSubUnit, 1); + OSMetaClassDeclareReservedUnused(IOFireWireAVCSubUnit, 2); + OSMetaClassDeclareReservedUnused(IOFireWireAVCSubUnit, 3); + +}; + +#endif // _IOKIT_IOFIREWIREAVCUNIT_H + diff --git a/QualcommWireless/include/IOKit/avc/IOFireWireAVCUserClientCommon.h b/QualcommWireless/include/IOKit/avc/IOFireWireAVCUserClientCommon.h new file mode 100644 index 0000000..cecf812 --- /dev/null +++ b/QualcommWireless/include/IOKit/avc/IOFireWireAVCUserClientCommon.h @@ -0,0 +1,124 @@ +/* + * Copyright (c) 1998-2001 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOFIREWIREAVCUSERCLIENTCOMMON_H_ +#define _IOKIT_IOFIREWIREAVCUSERCLIENTCOMMON_H_ + +#include + +#define kIOFireWireAVCLibConnection 13 + +enum IOFWAVCUserClientCommandCodes { + kIOFWAVCUserClientOpen, // kIOUCScalarIScalarO 0,0 + kIOFWAVCUserClientClose, // kIOUCScalarIScalarO 0,0 + kIOFWAVCUserClientOpenWithSessionRef, // kIOUCScalarIScalarO 1,0 + kIOFWAVCUserClientGetSessionRef, // kIOUCScalarIScalarO 0,1 + kIOFWAVCUserClientAVCCommand, // kIOUCStructIStructO -1,-1 + kIOFWAVCUserClientAVCCommandInGen, // kIOUCStructIStructO -1,-1 + kIOFWAVCUserClientUpdateAVCCommandTimeout, // kIOUCScalarIScalarO 0,0 + kIOFWAVCUserClientMakeP2PInputConnection, // KIOUCScalarIScalarO 1, 0 + kIOFWAVCUserClientBreakP2PInputConnection, // KIOUCScalarIScalarO 1, 0 + kIOFWAVCUserClientMakeP2POutputConnection, // KIOUCScalarIScalarO 1, 0 + kIOFWAVCUserClientBreakP2POutputConnection, // KIOUCScalarIScalarO 1, 0 + kIOFWAVCUserClientCreateAsyncAVCCommand, // kIOUCStructIStructO -1,-1 + kIOFWAVCUserClientSubmitAsyncAVCCommand, // kIOUCScalarIScalarO 1, 0 + kIOFWAVCUserClientCancelAsyncAVCCommand, // kIOUCScalarIScalarO 1, 0 + kIOFWAVCUserClientReleaseAsyncAVCCommand, // kIOUCScalarIScalarO 1, 0 + kIOFWAVCUserClientReinitAsyncAVCCommand, // // kIOUCScalarIStructI 1, -1 + kIOFWAVCUserClientNumCommands +}; + +enum IOFWAVCUserClientAsyncCommandCodes { + kIOFWAVCUserClientInstallAsyncAVCCommandCallback = kIOFWAVCUserClientNumCommands, // kIOUCScalarIScalarO 1, 1 + kIOFWAVCUserClientNumAsyncCommands +}; + + +enum IOFWAVCProtocolUserClientCommandCodes { + kIOFWAVCProtocolUserClientSendAVCResponse, // kIOUCScalarIStructI 2, -1 + kIOFWAVCProtocolUserClientFreeInputPlug, // kIOUCScalarIScalarO 1, 0 + kIOFWAVCProtocolUserClientReadInputPlug, // kIOUCScalarIScalarO 1, 1 + kIOFWAVCProtocolUserClientUpdateInputPlug, // kIOUCScalarIScalarO 3, 0 + kIOFWAVCProtocolUserClientFreeOutputPlug, // kIOUCScalarIScalarO 1, 0 + kIOFWAVCProtocolUserClientReadOutputPlug, // kIOUCScalarIScalarO 1, 1 + kIOFWAVCProtocolUserClientUpdateOutputPlug, // kIOUCScalarIScalarO 3, 0 + kIOFWAVCProtocolUserClientReadOutputMasterPlug, // kIOUCScalarIScalarO 0, 1 + kIOFWAVCProtocolUserClientUpdateOutputMasterPlug, // kIOUCScalarIScalarO 2, 0 + kIOFWAVCProtocolUserClientReadInputMasterPlug, // kIOUCScalarIScalarO 0, 1 + kIOFWAVCProtocolUserClientUpdateInputMasterPlug, // kIOUCScalarIScalarO 2, 0 + kIOFWAVCProtocolUserClientPublishAVCUnitDirectory, // kIOUCScalarIScalarO 0, 0 + kIOFWAVCProtocolUserClientSetSubunitPlugSignalFormat, // kIOUCScalarIScalarO 4, 0 + kIOFWAVCProtocolUserClientGetSubunitPlugSignalFormat, // kIOUCScalarIScalarO 3, 1 + kIOFWAVCProtocolUserClientConnectTargetPlugs, // kIOUCStructIStructO + kIOFWAVCProtocolUserClientDisconnectTargetPlugs, // kIOUCScalarIScalarO 6, 0 + kIOFWAVCProtocolUserClientGetTargetPlugConnection, // kIOUCStructIStructO + kIOFWAVCProtocolUserClientAVCRequestNotHandled, // kIOUCScalarIStructI 4, -1 + kIOFWAVCProtocolUserClientNumCommands +}; + +enum IOFWAVCProtocolUserClientAsyncCommandCodes { + kIOFWAVCProtocolUserClientSetAVCRequestCallback = kIOFWAVCProtocolUserClientNumCommands, // kIOUCScalarIScalarO 2, 0 + kIOFWAVCProtocolUserClientAllocateInputPlug, // kIOUCScalarIScalarO 1, 1 + kIOFWAVCProtocolUserClientAllocateOutputPlug, // kIOUCScalarIScalarO 1, 1 + kIOFWAVCProtocolUserClientInstallAVCCommandHandler, // kIOUCScalarIScalarO 4, 0 + kIOFWAVCProtocolUserClientAddSubunit, // kIOUCScalarIScalarO 5, 1 + kIOFWAVCProtocolUserClientNumAsyncCommands +}; + +typedef struct _AVCConnectTargetPlugsInParams +{ + UInt32 sourceSubunitTypeAndID; + IOFWAVCPlugTypes sourcePlugType; + UInt32 sourcePlugNum; + UInt32 destSubunitTypeAndID; + IOFWAVCPlugTypes destPlugType; + UInt32 destPlugNum; + Boolean lockConnection; + Boolean permConnection; +}AVCConnectTargetPlugsInParams; + +typedef struct _AVCConnectTargetPlugsOutParams +{ + UInt32 sourcePlugNum; + UInt32 destPlugNum; +}AVCConnectTargetPlugsOutParams; + +typedef struct _AVCGetTargetPlugConnectionInParams +{ + UInt32 subunitTypeAndID; + IOFWAVCPlugTypes plugType; + UInt32 plugNum; +}AVCGetTargetPlugConnectionInParams; + +typedef struct _AVCGetTargetPlugConnectionOutParams +{ + UInt32 connectedSubunitTypeAndID; + IOFWAVCPlugTypes connectedPlugType; + UInt32 connectedPlugNum; + Boolean lockConnection; + Boolean permConnection; +}AVCGetTargetPlugConnectionOutParams; + +#define kAsyncCmdSharedBufInterimRespOffset 0 +#define kAsyncCmdSharedBufFinalRespOffset 512 + +#endif // _IOKIT_IOFIREWIREAVCUSERCLIENTCOMMON_H_ \ No newline at end of file diff --git a/QualcommWireless/include/IOKit/avc/IOFireWirePCRSpace.h b/QualcommWireless/include/IOKit/avc/IOFireWirePCRSpace.h new file mode 100644 index 0000000..9f31176 --- /dev/null +++ b/QualcommWireless/include/IOKit/avc/IOFireWirePCRSpace.h @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2001 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * + * IOFireWirePCRSpace.h + * + * Class to multiplex access to the PCR addresses. + */ +#ifndef _IOKIT_IOFIREWIREPCRSPACE_H +#define _IOKIT_IOFIREWIREPCRSPACE_H + +#include +#include + +/*! + @typedef IOFireWirePCRCallback + @abstract Callback called after a successful lock transaction to a plug. + @param refcon refcon supplied to the IOFireWireFCPSpace when a client is registered + @param nodeID is the node originating the request + @param plugNo is the plug number + @param oldVal is the value the plug used to contain + @param newVal is the quad written into the plug + + */ +typedef void (*IOFireWirePCRCallback)(void *refcon, UInt16 nodeID, UInt32 plug, UInt32 oldVal, UInt32 newVal); + +class IOFireWireBus; + +/*! + @class IOFireWirePCRSpace + @abstract object to multiplex users of the PCR plug registers +*/ +class IOFireWirePCRSpace : public IOFWPseudoAddressSpace +{ + OSDeclareDefaultStructors(IOFireWirePCRSpace) + +protected: + struct Client { + IOFireWirePCRCallback func; + void * refcon; + }; + UInt32 fBuf[64]; + + Client fClients[64]; + UInt32 fActivations; + IOFireWireAVCTargetSpace * fAVCTargetSpace; + IONotifier *fNotifier; + +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + struct ExpansionData { }; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + + // Override to notify client of each plug seperately + virtual UInt32 doWrite(UInt16 nodeID, IOFWSpeed &speed, FWAddress addr, UInt32 len, + const void *buf, IOFWRequestRefCon refcon); + + virtual IOReturn allocatePlug(void *refcon, IOFireWirePCRCallback func, UInt32 &plug, Client* head); + virtual void freePlug(UInt32 plug, Client* head); + virtual UInt32 readPlug(UInt32 plug); + virtual IOReturn updatePlug(UInt32 plug, UInt32 oldVal, UInt32 newVal); + +public: + + // Override to handle multiple activations (one per client) + virtual IOReturn activate(); + virtual void deactivate(); + +/*! + @function init + @abstract initializes the IOFireWirePCRSpace object +*/ + virtual bool init(IOFireWireBus *bus); +/*! + @function getPCRAddressSpace + @abstract returns the IOFireWirePCRSpace object for the given FireWire bus + @param bus The FireWire bus +*/ + static IOFireWirePCRSpace *getPCRAddressSpace(IOFireWireBus *bus); +/*! + @function allocateInputPlug + @abstract allocates an input plug. + @param refcon arbitrary value passed back as first argument of callback. + @param func callback function when a successful lock transaction to the plug has been performed + @param plug set to the plug number if a plug is successfully allocated +*/ + virtual IOReturn allocateInputPlug(void *refcon, IOFireWirePCRCallback func, UInt32 &plug); +/*! + @function freeInputPlug + @abstract deallocates an input plug. + @param plug value returned by allocateInputPlug. +*/ + virtual void freeInputPlug(UInt32 plug); +/*! + @function readInputPlug + @abstract returns the current value of an input plug. + @param plug value returned by allocateInputPlug. +*/ + virtual UInt32 readInputPlug(UInt32 plug); +/*! + @function updateInputPlug + @abstract updates the value of an input plug (simulating a lock transaction). + @param plug value returned by allocateInputPlug. + @param oldVal value returned by readInputPlug. + @param newVal new value to store in plug if it's current value is oldVal. +*/ + virtual IOReturn updateInputPlug(UInt32 plug, UInt32 oldVal, UInt32 newVal); +/*! + @function allocateOutputPlug + @abstract allocates an output plug. + @param refcon arbitrary value passed back as first argument of callback. + @param func callback function when a successful lock transaction to the plug has been performed + @param plug set to the plug number if a plug is successfully allocated +*/ + virtual IOReturn allocateOutputPlug(void *refcon, IOFireWirePCRCallback func, UInt32 &plug); +/*! + @function freeOutputPlug + @abstract deallocates an output plug. + @param plug value returned by allocateOutputPlug. +*/ + virtual void freeOutputPlug(UInt32 plug); +/*! + @function readOutputPlug + @abstract returns the current value of an output plug. + @param plug value returned by allocateOutputPlug. +*/ + virtual UInt32 readOutputPlug(UInt32 plug); +/*! + @function updateOutputPlug + @abstract updates the value of an output plug (simulating a lock transaction). + @param plug value returned by allocateOutputPlug. + @param oldVal value returned by readOutputPlug. + @param newVal new value to store in plug if it's current value is oldVal. +*/ + virtual IOReturn updateOutputPlug(UInt32 plug, UInt32 oldVal, UInt32 newVal); +/*! + @function readOutputMasterPlug + @abstract returns the current value of the output master plug. +*/ + virtual UInt32 readOutputMasterPlug(); +/*! + @function updateOutputMasterPlug + @abstract updates the value of the master output plug (simulating a lock transaction). + @param oldVal value returned by readOutputMasterPlug. + @param newVal new value to store in plug if it's current value is oldVal. +*/ + virtual IOReturn updateOutputMasterPlug(UInt32 oldVal, UInt32 newVal); +/*! + @function readInputMasterPlug + @abstract returns the current value of the input master plug. +*/ + virtual UInt32 readInputMasterPlug(); +/*! + @function updateInputMasterPlug + @abstract updates the value of the master input plug (simulating a lock transaction). + @param oldVal value returned by readInputMasterPlug. + @param newVal new value to store in plug if it's current value is oldVal. +*/ + virtual IOReturn updateInputMasterPlug(UInt32 oldVal, UInt32 newVal); + + /*! + @function setAVCTargetSpacePointer + */ + virtual void setAVCTargetSpacePointer(IOFireWireAVCTargetSpace *pAVCTargetSpace); + + /*! + @function clearAllP2PConnections + */ + virtual void clearAllP2PConnections(void); + +private: + OSMetaClassDeclareReservedUnused(IOFireWirePCRSpace, 0); + OSMetaClassDeclareReservedUnused(IOFireWirePCRSpace, 1); + OSMetaClassDeclareReservedUnused(IOFireWirePCRSpace, 2); + OSMetaClassDeclareReservedUnused(IOFireWirePCRSpace, 3); + +}; + +#endif /* _IOKIT_IOFIREWIREPCRSPACE_H */ diff --git a/QualcommWireless/include/IOKit/battery/AppleSmartBatteryCommands.h b/QualcommWireless/include/IOKit/battery/AppleSmartBatteryCommands.h new file mode 100644 index 0000000..83e4535 --- /dev/null +++ b/QualcommWireless/include/IOKit/battery/AppleSmartBatteryCommands.h @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2018 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef RE_APPLE_APPLESMARTBATTERYCOMMANDS_H +#define RE_APPLE_APPLESMARTBATTERYCOMMANDS_H + +/* SMBus Device addresses */ +enum { + kSMBusAppleDoublerAddr = 0xd, + kSMBusBatteryAddr = 0xb, + kSMBusManagerAddr = 0xa, + kSMBusChargerAddr = 0x9 +}; + +/* System Manager Commands */ +/* Smart Battery System Manager spec - rev 1.1 */ +/* Section 5 SBSM Interface */ +enum { + kMStateCmd = 0x01, + kMStateContCmd = 0x02 +}; + +/* SBSM BatterySystemState bitfields */ +/* Smart Battery System Manager spec - rev 1.1 */ +/* Section 5.1 */ +enum { + kMChargingBatt_A_Bit = 0x0010, + kMPresentBatt_A_Bit = 0x0001 +}; + +/* SBSM BatterySystemStateCont bitfields */ +/* Smart Battery System Manager spec - rev 1.1 */ +/* Section 5.2 */ +enum { + kMACPresentBit = 0x0001, + kMPowerNotGoodBit = 0x0002, + kMCalibrateBit = 0x0040, +}; + +/* Smart Battery Commands */ +/* Smart Battery Data Specification - rev 1.1 */ +/* Section 5.1 SMBus Host to Smart Battery Messages */ + +/* kBManufactureDateCmd + * Date is published in a bitfield per the Smart Battery Data spec rev 1.1 + * in section 5.1.26 + * Bits 0...4 => day (value 1-31; 5 bits) + * Bits 5...8 => month (value 1-12; 4 bits) + * Bits 9...15 => years since 1980 (value 0-127; 7 bits) + * + * Custom commands not specific to 'Smart Battery Data spec' are defined + * with lower 16-bits set to 0. + */ +enum { + kBManufacturerAccessCmd = 0x00, // READ/WRITE WORD + kBRemainingCapacityAlarmCmd = 0x01, // READ/WRITE WORD, not used by Apple + kBRemainingTimeAlarmCmd = 0x02, // READ/WRITE WORD, not used by Apple + kBTemperatureCmd = 0x08, // READ WORD + kBVoltageCmd = 0x09, // READ WORD aka B0AV + kBCurrentCmd = 0x0a, // READ WORD aka B0AC + kBAverageCurrentCmd = 0x0b, // READ WORD + kBMaxErrorCmd = 0x0c, // READ WORD + kBRemainingCapacityCmd = 0x0f, // READ WORD aka B0RM + kBFullChargeCapacityCmd = 0x10, // READ WORD aka B0FC + kBRunTimeToEmptyCmd = 0x11, // READ WORD + kBAverageTimeToEmptyCmd = 0x12, // READ WORD + kBAverageTimeToFullCmd = 0x13, // READ WORD aka B0TF + kBChargingCurrentCmd = 0x14, // READ/WRITE WORD + kBBatteryStatusCmd = 0x16, // READ WORD aka B0St + kBCycleCountCmd = 0x17, // READ WORD aka B0CT + kBDesignCapacityCmd = 0x18, // READ WORD + kBManufactureDateCmd = 0x1b, // READ WORD + kBSerialNumberCmd = 0x1c, // READ WORD + kBManufacturerNameCmd = 0x20, // READ BLOCK + kBDeviceNameCmd = 0x21, // READ BLOCK + kBManufacturerDataCmd = 0x23, // READ BLOCK + kBReadCellVoltage4Cmd = 0x3c, // READ WORD aka NOOP, should be BC4V (bug?) + kBReadCellVoltage3Cmd = 0x3d, // READ WORD BC3V + kBReadCellVoltage2Cmd = 0x3e, // READ WORD BC2V + kBReadCellVoltage1Cmd = 0x3f, // READ WORD BC1V + kBManufacturerInfoCmd = 0x70, // READ BLOCK + kBDesignCycleCount9CCmd = 0x9C, // READ WORD + kBPackReserveCmd = 0x8B, // READ WORD +}; + +/* Smart Battery Extended Registers */ +/* bq20z90-V110 + bq29330 Chipset Technical Reference Manual */ +/* TI Literature SLUU264 */ +enum { + kBExtendedPFStatusCmd = 0x53, // READ WORD aka B0PS + kBExtendedOperationStatusCmd = 0x54 // READ WORD aka B0OS +}; + +/* Apple Hardware Serial Number */ +enum { + kBAppleHardwareSerialCmd = 0x76 // READ BLOCK +}; + +/* Smart Battery Status Message Bits */ +/* Smart Battery Data Specification - rev 1.1 */ +/* Section 5.4 page 42 */ +enum { + kBOverChargedAlarmBit = 0x8000, + kBTerminateChargeAlarmBit = 0x4000, + kBOverTempAlarmBit = 0x1000, + kBTerminateDischargeAlarmBit = 0x0800, + kBRemainingCapacityAlarmBit = 0x0200, + kBRemainingTimeAlarmBit = 0x0100, + kBInitializedStatusBit = 0x0080, + kBDischargingStatusBit = 0x0040, + kBFullyChargedStatusBit = 0x0020, + kBFullyDischargedStatusBit = 0x0010 +}; + +/* message command for battery status refresh */ +/* word in big endian, second byte respresents battery presence */ +enum { + kBMessageStatusCmd = 0x0A +}; + +/* default value used for kBReadCellVoltage1Cmd and keys BC1V/BC2V/BC3V */ +static constexpr uint16_t defaultBatteryCellVoltage = 16000; + +#endif /* RE_APPLE_APPLESMARTBATTERYCOMMANDS_H */ diff --git a/QualcommWireless/include/IOKit/bluetooth/AppleCSRBluetoothHostController.h b/QualcommWireless/include/IOKit/bluetooth/AppleCSRBluetoothHostController.h new file mode 100644 index 0000000..b436588 --- /dev/null +++ b/QualcommWireless/include/IOKit/bluetooth/AppleCSRBluetoothHostController.h @@ -0,0 +1,86 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _APPLE_APPLECSRBLUETOOTHHOSTCONTROLLER_H +#define _APPLE_APPLECSRBLUETOOTHHOSTCONTROLLER_H + +#include + +class AppleCSRBluetoothHostController : public CSRBluetoothHostController +{ + OSDeclareDefaultStructors(AppleCSRBluetoothHostController) + +public: + virtual bool init(IOBluetoothHCIController * family, IOBluetoothHostControllerTransport * transport) APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + + virtual IOReturn CleanUpBeforeTransportTerminate(IOBluetoothHostControllerTransport * transport) APPLE_KEXT_OVERRIDE; + virtual IOReturn setPropertiesWL(OSObject * properties) APPLE_KEXT_OVERRIDE; + virtual bool GetCompleteCodeForCommand(BluetoothHCICommandOpCode inOpCode, BluetoothHCIEventCode * outEventCode) APPLE_KEXT_OVERRIDE; + virtual bool SetHCIRequestRequireEvents(UInt16, IOBluetoothHCIRequest * request) APPLE_KEXT_OVERRIDE; + virtual bool NeedToIncreaseInactivityTime() APPLE_KEXT_OVERRIDE; + + OSMetaClassDeclareReservedUnused(AppleCSRBluetoothHostController, 0); + OSMetaClassDeclareReservedUnused(AppleCSRBluetoothHostController, 1); + OSMetaClassDeclareReservedUnused(AppleCSRBluetoothHostController, 2); + OSMetaClassDeclareReservedUnused(AppleCSRBluetoothHostController, 3); + OSMetaClassDeclareReservedUnused(AppleCSRBluetoothHostController, 4); + OSMetaClassDeclareReservedUnused(AppleCSRBluetoothHostController, 5); + OSMetaClassDeclareReservedUnused(AppleCSRBluetoothHostController, 6); + OSMetaClassDeclareReservedUnused(AppleCSRBluetoothHostController, 7); + OSMetaClassDeclareReservedUnused(AppleCSRBluetoothHostController, 8); + OSMetaClassDeclareReservedUnused(AppleCSRBluetoothHostController, 9); + OSMetaClassDeclareReservedUnused(AppleCSRBluetoothHostController, 10); + OSMetaClassDeclareReservedUnused(AppleCSRBluetoothHostController, 11); + OSMetaClassDeclareReservedUnused(AppleCSRBluetoothHostController, 12); + OSMetaClassDeclareReservedUnused(AppleCSRBluetoothHostController, 13); + OSMetaClassDeclareReservedUnused(AppleCSRBluetoothHostController, 14); + OSMetaClassDeclareReservedUnused(AppleCSRBluetoothHostController, 15); + OSMetaClassDeclareReservedUnused(AppleCSRBluetoothHostController, 16); + OSMetaClassDeclareReservedUnused(AppleCSRBluetoothHostController, 17); + OSMetaClassDeclareReservedUnused(AppleCSRBluetoothHostController, 18); + OSMetaClassDeclareReservedUnused(AppleCSRBluetoothHostController, 19); + OSMetaClassDeclareReservedUnused(AppleCSRBluetoothHostController, 20); + OSMetaClassDeclareReservedUnused(AppleCSRBluetoothHostController, 21); + OSMetaClassDeclareReservedUnused(AppleCSRBluetoothHostController, 22); + OSMetaClassDeclareReservedUnused(AppleCSRBluetoothHostController, 23); + +protected: + struct ExpansionData + { + void * mRefCon; + }; + ExpansionData * mExpansionData; +}; + +#endif diff --git a/QualcommWireless/include/IOKit/bluetooth/Bluetooth.h b/QualcommWireless/include/IOKit/bluetooth/Bluetooth.h new file mode 100644 index 0000000..ae31787 --- /dev/null +++ b/QualcommWireless/include/IOKit/bluetooth/Bluetooth.h @@ -0,0 +1,2955 @@ +/* + * Copyright (c) 2021 Apple Inc. All rights reserved. + * Copyright (c) 2021 cjiang. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/*! + * @header Bluetooth.h + * This header contains public interfaces for Bluetooth technology used by IOBluetooth. + */ + +#pragma once + +#ifdef KERNEL +#import +#else +#import +#import +#endif + +#import +#import + +#include + +#ifndef __MAC_OS_X_VERSION_MIN_REQUIRED +#error "Missing macOS target version" +#endif + +#ifdef __cplusplus +#define IOBLUETOOTH_EXPORT extern "C" +#else +#define IOBLUETOOTH_EXPORT extern +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if 0 +#pragma mark === Baseband === +#endif + +typedef uint16_t BluetoothConnectionHandle; // Upper 4 bits are reserved. +typedef uint8_t BluetoothLMPHandle; +enum +{ + kBluetoothConnectionHandleNone = 0xffff +}; + +typedef uint8_t BluetoothReasonCode; +typedef uint8_t BluetoothEncryptionEnable; +enum +{ + kBluetoothEncryptionEnableOff = 0x00, + kBluetoothEncryptionEnableOn = 0x01, + + kBluetoothEncryptionEnableBREDRE0 = 0x01, + kBluetoothEncryptionEnableLEAESCCM = 0x01, + kBluetoothEncryptionEnableBREDRAESCCM = 0x02 +}; + +typedef uint8_t BluetoothKeyFlag; +enum +{ + kBluetoothKeyFlagSemiPermanent = 0x00, + kBluetoothKeyFlagTemporary = 0x01 +}; + +typedef uint8_t BluetoothKeyType; +enum +{ + kBluetoothKeyTypeCombination = 0x00, + kBluetoothKeyTypeLocalUnit = 0x01, + kBluetoothKeyTypeRemoteUnit = 0x02, + kBluetoothKeyTypeDebugCombination = 0x03, + kBluetoothKeyTypeUnauthenticatedCombination = 0x04, + kBluetoothKeyTypeAuthenticatedCombination = 0x05, + kBluetoothKeyTypeChangedCombination = 0x06, + kBluetoothKeyTypeUnauthenticatedCombinationP256 = 0x07, + kBluetoothKeyTypeAuthenticatedCombinationP256 = 0x08 +}; + +// Packet types (Bluetooth spec section 7.1.5 - Create Connection) + +typedef uint16_t BluetoothPacketType; +enum +{ + kBluetoothPacketTypeReserved1 = 0x0001, + kBluetoothPacketType2DH1Omit = 0x0002, // Masks OUT this packet type + kBluetoothPacketType3DH1Omit = 0x0004, // Masks OUT this packet type + + kBluetoothPacketTypeDM1 = 0x0008, + kBluetoothPacketTypeDH1 = 0x0010, + kBluetoothPacketTypeHV1 = 0x0020, // Reserved + kBluetoothPacketTypeHV2 = 0x0040, // Reserved + kBluetoothPacketTypeHV3 = 0x0080, // Reserved + kBluetoothPacketTypeDV = 0x0100, // Reserved + kBluetoothPacketType2DH3Omit = 0x0100, // Masks OUT this packet type + kBluetoothPacketType3DH3Omit = 0x0200, // Masks OUT this packet type + kBluetoothPacketTypeAUX = 0x0200, // Deprecated + + kBluetoothPacketTypeDM3 = 0x0400, + kBluetoothPacketTypeDH3 = 0x0800, + + kBluetoothPacketType2DH5Omit = 0x1000, // Masks OUT this packet type + kBluetoothPacketType3DM5Omit = 0x2000, // Masks OUT this packet type + + kBluetoothPacketTypeDM5 = 0x4000, + kBluetoothPacketTypeDH5 = 0x8000, + + kBluetoothPacketTypeEnd +}; + +// Setup Synchronous Packet types (Bluetooth 2.1 spec section 7.1.26 - Setup Synchronous Command) + +enum +{ + kBluetoothSynchronousConnectionPacketTypeNone = 0x0000, + kBluetoothSynchronousConnectionPacketTypeHV1 = 0x0001, + kBluetoothSynchronousConnectionPacketTypeHV2 = 0x0002, + kBluetoothSynchronousConnectionPacketTypeHV3 = 0x0004, + kBluetoothSynchronousConnectionPacketTypeEV3 = 0x0008, + kBluetoothSynchronousConnectionPacketTypeEV4 = 0x0010, + kBluetoothSynchronousConnectionPacketTypeEV5 = 0x0020, + + // masking out certain types: + + kBluetoothSynchronousConnectionPacketType2EV3Omit = 0x0040, + kBluetoothSynchronousConnectionPacketType3EV3Omit = 0x0080, + kBluetoothSynchronousConnectionPacketType2EV5Omit = 0x0100, + kBluetoothSynchronousConnectionPacketType3EV5Omit = 0x0200, + + kBluetoothSynchronousConnectionPacketTypeFutureUse = 0xFC00, + + kBluetoothSynchronousConnectionPacketTypeAll = 0xFFFF, + + kBluetoothSynchronousConnectionPacketTypeEnd +}; + +// LAP/Inquiry Access Codes + +typedef uint32_t BluetoothLAP; +enum +{ + kBluetoothGeneralInquiryAccessCodeIndex = 0, // General/Unlimited Inquiry Access Code (GIAC) + kBluetoothGeneralInquiryAccessCodeLAPValue = 0x9E8B33, // General/Unlimited Inquiry Access Code (GIAC) + + kBluetoothLimitedInquiryAccessCodeIndex = 1, // Limited Dedicated Inquiry Access Code (LIAC) + kBluetoothLimitedInquiryAccessCodeLAPValue = 0x9E8B00, // Limited Dedicated Inquiry Access Code (LIAC) + + // All other access codes are reserved for future use (indices 2-63, LAP values 0x9E8B01-0x9E8B32 and 0x9E8B34-0x9E8B3F). + + kBluetoothLimitedInquiryAccessCodeEnd +}; + +// PageScanRepetitionMode + +typedef uint8_t BluetoothPageScanRepetitionMode; +enum +{ + kBluetoothPageScanRepetitionModeR0 = 0x00, + kBluetoothPageScanRepetitionModeR1 = 0x01, + kBluetoothPageScanRepetitionModeR2 = 0x02 + + // All other values are reserved for future use. +}; + +// PageScanPeriodMode + +typedef uint8_t BluetoothPageScanPeriodMode; +enum +{ + kBluetoothPageScanPeriodModeP0 = 0x00, + kBluetoothPageScanPeriodModeP1 = 0x01, + kBluetoothPageScanPeriodModeP2 = 0x02 + + // All other values are reserved for future use. +}; + +// PageScanMode + +typedef uint8_t BluetoothPageScanMode; +enum +{ + kBluetoothPageScanModeMandatory = 0x00, + kBluetoothPageScanModeOptional1 = 0x01, + kBluetoothPageScanModeOptional2 = 0x02, + kBluetoothPageScanModeOptional3 = 0x03 + + // All other values are reserved for future use. +}; + +// PageScanType + +typedef uint8_t BluetoothHCIPageScanType; +enum BluetoothHCIPageScanTypes +{ + kBluetoothHCIPageScanTypeStandard = 0x00, + kBluetoothHCIPageScanTypeInterlaced = 0x01, + + kBluetoothHCIPageScanTypeReservedStart = 0x02, + kBluetoothHCIPageScanTypeReservedEnd = 0xFF +}; + +// Erroneous Data Reporting +typedef uint8_t BluetoothHCIErroneousDataReporting; +enum +{ + kBluetoothHCIErroneousDataReportingDisabled = 0x00, + kBluetoothHCIErroneousDataReportingEnabled = 0x01, + + kBluetoothHCIErroneousDataReportingReservedStart = 0x02, + kBluetoothHCIErroneousDataReportingReservedEnd = 0xFF +}; + +#if 0 +#pragma mark - +#pragma mark === Devices === +#endif + +typedef struct BluetoothDeviceAddress +{ + uint8_t data[6]; +} BluetoothDeviceAddress; + +typedef struct BluetoothKey +{ + uint8_t data[16]; +} BluetoothKey; + +typedef struct BluetoothIRK +{ + uint8_t data[16]; +} BluetoothIRK; + +typedef struct BluetoothPINCode +{ + uint8_t data[16]; // PIN codes may be up to 128 bits. +} BluetoothPINCode; + +// Physical layout of the "class of device/service" field (see Bluetooth Assigned Numbers section 1.2): +// +// 2 2 2 2 1 1 1 1 1 1 1 1 1 1 +// 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 <- Bit Transmission Order +// +---------------+---------------+---------------+ +// | octet 3 | octet 2 | octet 1 | <- Octet Transmission Order +// +---------------+---------------+---------------+ +// <------ 11 bits ----->< 5 bits ><- 6 bits -> +// +---------------------+---------+-----------+-+-+ +// | Service Classes | Major | Minor | | | +// +-+-+-+-+-+-+-+-+-+-+-+ Device | Device |0|0| +// | | | | | | | |*|*|*| | Class | Class | | | +// +-+-+-+-+-+-+-+-+-+-+-+---------+-----------+-+-+ +// | | | | | | | | | +// | | | | | | | + Limited Discoverable +- Format Type +// | | | | | | +- Networking +// | | | | | +- Rendering +// | | | | +- Capturing +// | | | +- Object Transfer +// | | +- Audio +// | +- Telephony +// +- Information + +typedef uint32_t BluetoothClassOfDevice; + +#define BluetoothGetDeviceClassMajor(inCOD) ((inCOD & 0x00001F00) >> 8) +#define BluetoothGetDeviceClassMinor(inCOD) ((inCOD & 0x000000FC) >> 2) +#define BluetoothGetServiceClassMajor(inCOD) ((inCOD & 0x00FFE000) >> 13) +#define BluetoothMakeClassOfDevice(inServiceClassMajor, inDeviceClassMajor, inDeviceClassMinor) \ + (((inServiceClassMajor << 13) & 0x00FFE000) | ((inDeviceClassMajor << 8) & 0x00001F00) | ((inDeviceClassMinor << 2) & 0x000000FC)) + +/// +/// Major Service Classes (11-bit value - bits 13-23 of Device/Service field) +/// + +typedef uint32_t BluetoothServiceClassMajor; +// Service Class Major enum in BluetoothAssignedNumbers.h + +/// +/// Major Device Classes (5-bit value - bits 8-12 of Device/Service field) +/// + +typedef uint32_t BluetoothDeviceClassMajor; +// Device Class Major enum in BluetoothAssignedNumbers.h + +/// +/// Minor Device Classes (6-bit value - bits 2-7 of Device/Service field) +/// + +typedef uint32_t BluetoothDeviceClassMinor; +// Device Class Minor enum in BluetoothAssignedNumbers.h + +// Misc Device Types + +enum +{ + kBluetoothDeviceNameMaxLength = 248 +}; + +typedef uint8_t BluetoothDeviceName[kBluetoothDeviceNameMaxLength]; // Max 248 bytes of UTF-8 encoded Unicode. +typedef uint16_t BluetoothClockOffset; // Bits 14-0 come from bits 16-2 of CLKslav-CLKmaster. +typedef uint8_t BluetoothRole; // +typedef uint8_t BluetoothAllowRoleSwitch; // 0x00-0x01 valid, 0x02-0xFF reserved. +enum +{ + kBluetoothDontAllowRoleSwitch = 0x00, + kBluetoothAllowRoleSwitch = 0x01 +}; + +enum +{ + kBluetoothRoleBecomeMaster = 0x00, + kBluetoothRoleRemainSlave = 0x01 +}; + +typedef struct BluetoothSetEventMask +{ + uint8_t data[8]; +} BluetoothSetEventMask; + +typedef uint8_t BluetoothPINType; + +#if 0 +#pragma mark - +#pragma mark === L2CAP === +#endif + +//=========================================================================================================================== +// Logical Link Control and Adaptation Protocol (L2CAP) +//=========================================================================================================================== + +// ACL Packet values (Bluetooth L2CAP spec section 1). + +enum +{ + kBluetoothL2CAPMaxPacketSize = 65535, // Max number of data bytes in an L2CAP packet. + + kBluetoothACLLogicalChannelReserved = 0, // [00] Reserved for future use + kBluetoothACLLogicalChannelL2CAPContinue = 1, // [01] Continuation of L2CAP packet. + kBluetoothACLLogicalChannelL2CAPStart = 2, // [10] Start of L2CAP packet. + kBluetoothACLLogicalChannelLMP = 3 // [11] Link Manager Protocol packet. +}; + +// Channel Identifiers (Bluetooth L2CAP spec section 2.1). + +typedef uint16_t BluetoothL2CAPChannelID; +enum +{ + kBluetoothL2CAPChannelNull = 0x0000, // Illegal, should not be used + kBluetoothL2CAPChannelSignalling = 0x0001, // L2CAP signalling channel + kBluetoothL2CAPChannelConnectionLessData = 0x0002, // L2CAP connection less data + kBluetoothL2CAPChannelAMPManagerProtocol = 0x0003, // AMP Manager Protocol + kBluetoothL2CAPChannelAttributeProtocol = 0x0004, + kBluetoothL2CAPChannelLESignalling = 0x0005, + kBluetoothL2CAPChannelSecurityManager = 0x0006, + kBluetoothL2CAPChannelBREDRSecurityManager = 0x0007, + // Range 0x0008 to 0x003E reserved for future use. + kBluetoothL2CAPChannelReservedStart = 0x0008, + kBluetoothL2CAPChannelLEAP = 0x002A, + kBluetoothL2CAPChannelLEAS = 0x002B, + kBluetoothL2CAPChannelMagicPairing = 0x0030, + kBluetoothL2CAPChannelMagnet = 0x003A, + kBluetoothL2CAPChannelReservedEnd = 0x003E, + + kBluetoothL2CAPChannelAMPTestManager = 0x003F, + + // Range 0x0040 to 0xFFFF are dynamically allocated. + kBluetoothL2CAPChannelDynamicStart = 0x0040, + kBluetoothL2CAPChannelDynamicEnd = 0xffff, + kBluetoothL2CAPChannelEnd = 0xffff +}; + +typedef BluetoothL2CAPChannelID BluetoothL2CAPGroupID; + +// Protocol/Service Multiplexor (PSM) values (Bluetooth L2CAP spec section 5.2). + +typedef uint16_t BluetoothL2CAPPSM; +// PSM enum in BluetoothAssignedNumbers.h + +// Command Codes + +typedef enum +{ + kBluetoothL2CAPCommandCodeReserved = 0x00, + kBluetoothL2CAPCommandCodeCommandReject = 0x01, + kBluetoothL2CAPCommandCodeConnectionRequest = 0x02, + kBluetoothL2CAPCommandCodeConnectionResponse = 0x03, + kBluetoothL2CAPCommandCodeConfigureRequest = 0x04, + kBluetoothL2CAPCommandCodeConfigureResponse = 0x05, + kBluetoothL2CAPCommandCodeDisconnectionRequest = 0x06, + kBluetoothL2CAPCommandCodeDisconnectionResponse = 0x07, + kBluetoothL2CAPCommandCodeEchoRequest = 0x08, + kBluetoothL2CAPCommandCodeEchoResponse = 0x09, + kBluetoothL2CAPCommandCodeInformationRequest = 0x0A, + kBluetoothL2CAPCommandCodeInformationResponse = 0x0B, + kBluetoothL2CAPCommandCodeCreateChannelRequest = 0x0C, + kBluetoothL2CAPCommandCodeCreateChannelResponse = 0x0D, + kBluetoothL2CAPCommandCodeMoveChannelRequest = 0x0E, + kBluetoothL2CAPCommandCodeMoveChannelResponse = 0x0F, + kBluetoothL2CAPCommandCodeMoveChannelConfirmation = 0x10, + kBluetoothL2CAPCommandCodeMoveChannelConfirmationResponse = 0x11, + kBluetoothL2CAPCommandCodeConnectionParameterUpdateRequest = 0x12, + kBluetoothL2CAPCommandCodeConnectionParameterUpdateResponse = 0x13, + kBluetoothL2CAPCommandCodeLECreditBasedConnectionRequest = 0x14, + kBluetoothL2CAPCommandCodeLECreditBasedConnectionResponse = 0x15, + kBluetoothL2CAPCommandCodeLEFlowControlCredit = 0x16 +} BluetoothL2CAPCommandCode; + +// Command Reject + +typedef enum +{ + kBluetoothL2CAPCommandRejectReasonCommandNotUnderstood = 0x0000, + kBluetoothL2CAPCommandRejectReasonSignallingMTUExceeded = 0x0001, + kBluetoothL2CAPCommandRejectReasonInvalidCIDInRequest = 0x0002 +} BluetoothL2CAPCommandRejectReason; + +typedef uint16_t BluetoothL2CAPMTU; +typedef uint16_t BluetoothL2CAPLinkTimeout; +typedef uint16_t BluetoothL2CAPFlushTimeout; +enum +{ + kBluetoothL2CAPFlushTimeoutUseExisting = 0x0000, + kBluetoothL2CAPFlushTimeoutImmediate = 0x0001, + kBluetoothL2CAPFlushTimeoutForever = 0xFFFF, + + kBluetoothL2CAPFlushTimeoutEnd +}; + +typedef struct BluetoothL2CAPQualityOfServiceOptions +{ + uint8_t flags; + uint8_t serviceType; + uint32_t tokenRate; + uint32_t tokenBucketSize; + uint32_t peakBandwidth; + uint32_t latency; + uint32_t delayVariation; +} BluetoothL2CAPQualityOfServiceOptions; + +typedef struct BluetoothL2CAPRetransmissionAndFlowControlOptions +{ + uint8_t flags; + uint8_t txWindowSize; + uint8_t maxTransmit; + uint16_t retransmissionTimeout; + uint16_t monitorTimeout; + uint16_t maxPDUPayloadSize; +} BluetoothL2CAPRetransmissionAndFlowControlOptions; + +typedef enum BluetoothL2CAPSegmentationAndReassembly +{ + kBluetoothL2CAPSegmentationAndReassemblyUnsegmentedSDU = 0x00, + kBluetoothL2CAPSegmentationAndReassemblyStartOfSDU = 0x01, + kBluetoothL2CAPSegmentationAndReassemblyEndOfSDU = 0x02, + kBluetoothL2CAPSegmentationAndReassemblyContinuationOfSDU = 0x03 +} BluetoothL2CAPSegmentationAndReassembly; + +enum +{ + kBluetoothL2CAPInfoTypeMaxConnectionlessMTUSize = 0x0001 +}; + +// Packets + +enum +{ + kBluetoothL2CAPPacketHeaderSize = 4 +}; + +typedef uint16_t BluetoothL2CAPByteCount; +typedef uint8_t BluetoothL2CAPCommandID; +typedef uint16_t BluetoothL2CAPCommandByteCount; + +typedef enum +{ + kBluetoothL2CAPConnectionResultSuccessful = 0x0000, + kBluetoothL2CAPConnectionResultPending = 0x0001, + kBluetoothL2CAPConnectionResultRefusedPSMNotSupported = 0x0002, + kBluetoothL2CAPConnectionResultRefusedSecurityBlock = 0x0003, + kBluetoothL2CAPConnectionResultRefusedNoResources = 0x0004, + kBluetoothL2CAPConnectionResultRefusedReserved = 0x0005, + kBluetoothL2CAPConnectionResultRefusedInvalidSourceCID = 0x0006, + kBluetoothL2CAPConnectionResultRefusedSourceCIDAlreadyAllocated = 0x0007 +} BluetoothL2CAPConnectionResult; + +typedef enum +{ + kBluetoothL2CAPConnectionStatusNoInfoAvailable = 0x0000, + kBluetoothL2CAPConnectionStatusAuthenticationPending = 0x0001, + kBluetoothL2CAPConnectionStatusAuthorizationPending = 0x0002 +} BluetoothL2CAPConnectionStatus; + +typedef enum +{ + kBluetoothL2CAPConfigurationResultSuccess = 0x0000, + kBluetoothL2CAPConfigurationResultUnacceptableParams = 0x0001, + kBluetoothL2CAPConfigurationResultRejected = 0x0002, + kBluetoothL2CAPConfigurationResultUnknownOptions = 0x0003 +} BluetoothL2CAPConfigurationResult; + +typedef enum +{ + kBluetoothL2CAPConfigurationOptionMTU = 0x01, + kBluetoothL2CAPConfigurationOptionFlushTimeout = 0x02, + kBluetoothL2CAPConfigurationOptionQoS = 0x03, + kBluetoothL2CAPConfigurationOptionRetransmissionAndFlowControl = 0x04, + kBluetoothL2CAPConfigurationOptionFrameCheckSequence = 0x05, + kBluetoothL2CAPConfigurationOptionExtendedFlowSpecification = 0x06, + kBluetoothL2CAPConfigurationOptionExtendedWindowSize = 0x07 +} BluetoothL2CAPConfigurationOption; + +enum +{ + kBluetoothL2CAPConfigurationOptionMTULength = 2, + kBluetoothL2CAPConfigurationOptionFlushTimeoutLength = 2, + kBluetoothL2CAPConfigurationOptionQoSLength = 22, + kBluetoothL2CAPConfigurationOptionRetransmissionAndFlowControlLength = 9 +}; + +typedef enum +{ + kBluetoothL2CAPConfigurationBasicL2CAPModeFlag = 0x00, + kBluetoothL2CAPConfigurationRetransmissionModeFlag = 0x01, + kBluetoothL2CAPConfigurationFlowControlModeFlag = 0x02, + kBluetoothL2CAPConfigurationEnhancedRetransmissionMode = 0x03, + kBluetoothL2CAPConfigurationStreamingMode = 0x04 +} BluetoothL2CAPConfigurationRetransmissionAndFlowControlFlags; + +typedef enum +{ + kBluetoothL2CAPInformationTypeConnectionlessMTU = 0x0001, + kBluetoothL2CAPInformationTypeExtendedFeatures = 0x0002, + kBluetoothL2CAPInformationTypeFixedChannelsSupported = 0x0003 +} BluetoothL2CAPInformationType; + +typedef enum +{ + kBluetoothL2CAPInformationResultSuccess = 0x0000, + kBluetoothL2CAPInformationResultNotSupported = 0x0001 +} BluetoothL2CAPInformationResult; + +typedef enum +{ + kBluetoothL2CAPInformationNoExtendedFeatures = 0x00000000, + kBluetoothL2CAPInformationFlowControlMode = 0x00000001, + kBluetoothL2CAPInformationRetransmissionMode = 0x00000002, + kBluetoothL2CAPInformationBidirectionalQoS = 0x00000004, + kBluetoothL2CAPInformationEnhancedRetransmissionMode = 0x00000008, + kBluetoothL2CAPInformationStreamingMode = 0x00000010, + kBluetoothL2CAPInformationFCSOption = 0x00000020, + kBluetoothL2CAPInformationExtendedFlowSpecification = 0x00000040, + kBluetoothL2CAPInformationFixedChannels = 0x00000080, + kBluetoothL2CAPInformationExtendedWindowSize = 0x00000100, + kBluetoothL2CAPUnicastConnectionlessDataReception = 0x00000200 +} BluetoothL2CAPInformationExtendedFeaturesMask; + +typedef enum BluetoothL2CAPQoSType +{ + kBluetoothL2CAPQoSTypeNoTraffic = 0x00, + kBluetoothL2CAPQoSTypeBestEffort = 0x01, + kBluetoothL2CAPQoSTypeGuaranteed = 0x02 +} BluetoothL2CAPQoSType; + +typedef enum BluetoothL2CAPSupervisoryFuctionType +{ + kBluetoothL2CAPSupervisoryFuctionTypeReceiverReady = 0x0, + kBluetoothL2CAPSupervisoryFuctionTypeReject = 0x1, + kBluetoothL2CAPSupervisoryFuctionTypeReceiverNotReady = 0x2, + kBluetoothL2CAPSupervisoryFuctionTypeSelectiveReject = 0x3 +} BluetoothL2CAPSupervisoryFuctionType; + +enum +{ + kBluetoothLETXTimeMin = 0x0148, // 328 us / 41 octets / 27 (0x1B) byte PDU + kBluetoothLETXTimeDefault = 0x0148, // 328 us + kBluetoothLETXTimeMax = 0x0848, // 2120 us / 265 octets / 251 (0xFB) byte PDU + kBluetoothLETXOctetsMin = 0x001b, // 27 bytes pre-LE DPLE size + kBluetoothLETXOctetsDefault = 0x001b, // 27 bytes + kBluetoothLETXOctetsMax = 0x00fb, // 251 bytes 4.2 LE DPLE feature +}; + +enum +{ + // kBluetoothL2CAPMTULowEnergyDefault = 0x0080, // 128 bytes - DPLE feature + kBluetoothL2CAPMTULowEnergyDefault = kBluetoothLETXOctetsMin, // 27 bytes + kBluetoothL2CAPMTULowEnergyMax = kBluetoothLETXOctetsMax, // 251 bytes + kBluetoothL2CAPMTUMinimum = 0x0030, // 48 bytes + kBluetoothL2CAPMTUDefault = 0x03F9, // 11.10.08 - dropped back to 1017 from 1021 (don't aggravate the 3DH5 problem between CSR<->BRCM just yet) + kBluetoothL2CAPMTUMaximum = 0xffff, + kBluetoothL2CAPMTUStart = 0x7fff, + kBluetoothL2CAPMTUSIG = 0x0030, // 48 bytes + kBluetoothL2CAPFlushTimeoutDefault = kBluetoothL2CAPFlushTimeoutForever, // 0xffff + kBluetoothL2CAPQoSFlagsDefault = 0, + kBluetoothL2CAPQoSTypeDefault = kBluetoothL2CAPQoSTypeBestEffort, // 0x01 + kBluetoothL2CAPQoSTokenRateDefault = 0x00000000, + kBluetoothL2CAPQoSTokenBucketSizeDefault = 0x00000000, + kBluetoothL2CAPQoSPeakBandwidthDefault = 0x00000000, + kBluetoothL2CAPQoSLatencyDefault = 0xffffffff, + kBluetoothL2CAPQoSDelayVariationDefault = 0xffffffff +}; + +enum +{ + kBluetoothLEMaxTXTimeMin = 0x0148, + kBluetoothLEMaxTXTimeDefault = kBluetoothL2CAPMTULowEnergyDefault, + kBluetoothLEMaxTXTimeMax = 0x0848, + kBluetoothLEMaxTXOctetsMin = 0x001b, // 27 bytes + kBluetoothLEMaxTXOctetsDefault = 0x0080, // 128 bytes - DPLE feature + kBluetoothLEMaxTXOctetsMax = 0x00fb // 251 bytes - DPLE feature +}; + +#pragma mark === LE Security Manager === + +#define kBluetoothLESMPTimeout 30 + +#define kBluetoothLESMPMinEncryptionKeySize 7 +#define kBluetoothLESMPMaxEncryptionKeySize 16 + +enum BluetoothLESecurityManagerKeyDistributionFormat +{ + kBluetoothLESecurityManagerEncryptionKey = (1 << 0L), // LTK, EDIV, RAND + kBluetoothLESecurityManagerIDKey = (1 << 1L), // IRK + kBluetoothLESecurityManagerSignKey = (1 << 2L), // CSRK + kBluetoothLESecurityManagerLinkKey = (1 << 3L), // LinkKey +}; + +typedef enum BluetoothLESecurityManagerCommandCode +{ + kBluetoothLESecurityManagerCommandCodeReserved = 0x00, + kBluetoothLESecurityManagerCommandCodePairingRequest = 0x01, + kBluetoothLESecurityManagerCommandCodePairingResponse = 0x02, + kBluetoothLESecurityManagerCommandCodePairingConfirm = 0x03, + kBluetoothLESecurityManagerCommandCodePairingRandom = 0x04, + kBluetoothLESecurityManagerCommandCodePairingFailed = 0x05, + kBluetoothLESecurityManagerCommandCodeEncryptionInfo = 0x06, + kBluetoothLESecurityManagerCommandCodeMasterIdentification = 0x07, + kBluetoothLESecurityManagerCommandCodeIdentityInfo = 0x08, + kBluetoothLESecurityManagerCommandCodeIdentityAddressInfo = 0x09, + kBluetoothLESecurityManagerCommandCodeSigningInfo = 0x0A, + kBluetoothLESecurityManagerCommandCodeSecurityRequest = 0x0B, + kBluetoothLESecurityManagerCommandCodePairingPublicKey = 0x0C, + kBluetoothLESecurityManagerCommandCodePairingDHKeyCheck = 0x0D, + kBluetoothLESecurityManagerCommandCodePairingKeypressNotification = 0x0E, + + // 0x0F - 0xFF reserved + kBluetoothLESecurityManagerCommandCodeReservedStart = 0x0F, + kBluetoothLESecurityManagerCommandCodeReservedEnd = 0xFF +} BluetoothLESecurityManagerCommandCode; + +typedef enum BluetoothLESecurityManagerUserInputCapability +{ + kBluetoothLESecurityManagerUserInputCapabilityNoInput = 0x01, + kBluetoothLESecurityManagerUserInputCapabilityYesNo = 0x02, + kBluetoothLESecurityManagerUserInputCapabilityKeyboard = 0x03 +} BluetoothLESecurityManagerUserInputCapability; + +typedef enum BluetoothLESecurityManagerUserOutputCapability +{ + kBluetoothLESecurityManagerUserOutputCapabilityNoOutput = 0x01, + kBluetoothLESecurityManagerUserOutputCapabilityNumericOutput = 0x02 +} BluetoothLESecurityManagerUserOutputCapability; + +typedef enum BluetoothLESecurityManagerIOCapability +{ + kBluetoothLESecurityManagerIOCapabilityDisplayOnly = 0x00, + kBluetoothLESecurityManagerIOCapabilityDisplayYesNo = 0x01, + kBluetoothLESecurityManagerIOCapabilityKeyboardOnly = 0x02, + kBluetoothLESecurityManagerIOCapabilityNoInputNoOutput = 0x03, + kBluetoothLESecurityManagerIOCapabilityKeyboardDisplay = 0x04, + + // 0x05 - 0xFF reserved + kBluetoothLESecurityManagerIOCapabilityReservedStart = 0x05, + kBluetoothLESecurityManagerIOCapabilityReservedEnd = 0xFF +} BluetoothLESecurityManagerIOCapability; + +typedef enum BluetoothLESecurityManagerOOBData +{ + kBluetoothLESecurityManagerOOBAuthenticationDataNotPresent = 0x00, + kBluetoothLESecurityManagerOOBAuthenticationDataPresent = 0x01, + + // 0x02 - 0xFF reserved + kBluetoothLESecurityManagerOOBDataReservedStart = 0x02, + kBluetoothLESecurityManagerOOBDataReservedEnd = 0xFF +} BluetoothLESecurityManagerOOBData; + +enum +{ + kBluetoothLESecurityManagerNoBonding = 0, // [00] + kBluetoothLESecurityManagerBonding = 1, // [01] + kBluetoothLESecurityManagerReservedStart = 2, // [10] + kBluetoothLESecurityManagerReservedEnd = 3 // [11] +}; + +typedef enum BluetoothLESecurityManagerPairingFailedReasonCode +{ + kBluetoothLESecurityManagerReasonCodeReserved = 0x00, + kBluetoothLESecurityManagerReasonCodePasskeyEntryFailed = 0x01, + kBluetoothLESecurityManagerReasonCodeOOBNotAvailbale = 0x02, + kBluetoothLESecurityManagerReasonCodeAuthenticationRequirements = 0x03, + kBluetoothLESecurityManagerReasonCodeConfirmValueFailed = 0x04, + kBluetoothLESecurityManagerReasonCodePairingNotSupported = 0x05, + kBluetoothLESecurityManagerReasonCodeEncryptionKeySize = 0x06, + kBluetoothLESecurityManagerReasonCodeCommandNotSupported = 0x07, + kBluetoothLESecurityManagerReasonCodeUnspecifiedReason = 0x08, + kBluetoothLESecurityManagerReasonCodeRepeatedAttempts = 0x09, + kBluetoothLESecurityManagerReasonCodeInvalidParameters = 0x0A, + kBluetoothLESecurityManagerReasonCodeDHKeyCheckFailed = 0x0B, + kBluetoothLESecurityManagerReasonCodeNumericComparisonFailed = 0x0C, + kBluetoothLESecurityManagerReasonCodeBREDRPairingInProgress = 0x0D, + kBluetoothLESecurityManagerReasonCodeCrossTransportKeyDerivationGenerationNotAllowed = 0x0E, + + kBluetoothLESecurityManagerReasonCodeReservedStart = 0x0F, + kBluetoothLESecurityManagerReasonCodeReservedEnd = 0xFF +} BluetoothLESecurityManagerPairingFailedReasonCode; + +typedef enum BluetoothLESecurityManagerKeypressNotificationType +{ + kBluetoothLESecurityManagerNotificationTypePasskeyEntryStarted = 0, + kBluetoothLESecurityManagerNotificationTypePasskeyDigitEntered = 1, + kBluetoothLESecurityManagerNotificationTypePasskeyDigitErased = 2, + kBluetoothLESecurityManagerNotificationTypePasskeyCleared = 3, + kBluetoothLESecurityManagerNotificationTypePasskeyEntryCompleted = 4, + + kBluetoothLESecurityManagerNotificationTypeReservedStart = 5, + kBluetoothLESecurityManagerNotificationTypeReservedEnd = 255 +} BluetoothLESecurityManagerKeypressNotificationType; + +#pragma mark === AMP Manager === +typedef enum BluetoothAMPManagerCode +{ + kBluetoothAMPManagerCodeReserved = 0x00, + kBluetoothAMPManagerCodeAMPCommandReject = 0x01, + kBluetoothAMPManagerCodeAMPDiscoverRequest = 0x02, + kBluetoothAMPManagerCodeAMPDiscoverResponse = 0x03, + kBluetoothAMPManagerCodeAMPChangeNotify = 0x04, + kBluetoothAMPManagerCodeAMPChangeResponse = 0x05, + kBluetoothAMPManagerCodeAMPGetInfoRequest = 0x06, + kBluetoothAMPManagerCodeAMPGetInfoResponse = 0x07, + kBluetoothAMPManagerCodeAMPGetAssocRequest = 0x08, + kBluetoothAMPManagerCodeAMPGetAssocResponse = 0x09, + kBluetoothAMPManagerCodeAMPCreatePhysicalLinkRequest = 0x0A, + kBluetoothAMPManagerCodeAMPCreatePhysicalLinkResponse = 0x0B, + kBluetoothAMPManagerCodeAMPDisconnectPhysicalLinkRequest = 0x0C, + kBluetoothAMPManagerCodeAMPDisconnectPhysicalLinkResponse = 0x0D +} BluetoothAMPManagerCode; + +typedef enum BluetoothAMPCommandRejectReason +{ + kBluetoothAMPManagerCommandRejectReasonCommandNotRecognized = 0x0000 +} BluetoothAMPCommandRejectReason; + +typedef enum BluetoothAMPDiscoverResponseControllerStatus +{ + kBluetoothAMPManagerDiscoverResponseControllerStatusPoweredDown = 0x00, + kBluetoothAMPManagerDiscoverResponseControllerStatusBluetoothOnly = 0x01, + kBluetoothAMPManagerDiscoverResponseControllerStatusNoCapacity = 0x02, + kBluetoothAMPManagerDiscoverResponseControllerStatusLowCapacity = 0x03, + kBluetoothAMPManagerDiscoverResponseControllerStatusMediumCapacity = 0x04, + kBluetoothAMPManagerDiscoverResponseControllerStatusHighCapacity = 0x05, + kBluetoothAMPManagerDiscoverResponseControllerStatusFullCapacity = 0x06 +} BluetoothAMPDiscoverResponseControllerStatus; + +typedef enum BluetoothAMPGetInfoResponseStatus +{ + kBluetoothAMPManagerGetInfoResponseSuccess = 0x00, + kBluetoothAMPManagerGetInfoResponseInvalidControllerID = 0x01 +} BluetoothAMPGetInfoResponseStatus; + +typedef enum BluetoothAMPGetAssocResponseStatus +{ + kBluetoothAMPManagerGetAssocResponseSuccess = 0x00, + kBluetoothAMPManagerGetAssocResponseInvalidControllerID = 0x01 +} BluetoothAMPGetAssocResponseStatus; + +typedef enum BluetoothAMPCreatePhysicalLinkResponseStatus +{ + kBluetoothAMPManagerCreatePhysicalLinkResponseSuccess = 0x00, + kBluetoothAMPManagerCreatePhysicalLinkResponseInvalidControllerID = 0x01, + kBluetoothAMPManagerCreatePhysicalLinkResponseUnableToStartLinkCreation = 0x02, + kBluetoothAMPManagerCreatePhysicalLinkResponseCollisionOccurred = 0x03, + kBluetoothAMPManagerCreatePhysicalLinkResponseAMPDisconnectedPhysicalLinkRequestReceived = 0x04, + kBluetoothAMPManagerCreatePhysicalLinkResponsePhysicalLinkAlreadyExists = 0x05, + kBluetoothAMPManagerCreatePhysicalLinkResponseSecurityViolation = 0x06 +} BluetoothAMPCreatePhysicalLinkResponseStatus; + +typedef enum BluetoothAMPDisconnectPhysicalLinkResponseStatus +{ + kBluetoothAMPManagerDisconnectPhysicalLinkResponseSuccess = 0x00, + kBluetoothAMPManagerDisconnectPhysicalLinkResponseInvalidControllerID = 0x01, + kBluetoothAMPManagerDisconnectPhysicalLinkResponseNoPhysicalLink = 0x02 +} BluetoothAMPDisconnectPhysicalLinkResponseStatus; + +#if 0 +#pragma mark - +#pragma mark === HCI === +#endif + +//=========================================================================================================================== +// Host Controller Interface (HCI) +//=========================================================================================================================== + +// HCI Command Packet +// ------------------ +// +// 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// +--------------------------------+---------------+--------------+ +// | OpCode | | | +// +--------------------+-----------| Param Length | Params... | +// | OCF | OGF | | | +// +--------------------+-----------+---------------+--------------+ +// | | +// | Params... | +// | | +// +---------------------------------------------------------------+ + +// Commands + +typedef uint8_t BluetoothHCICommandOpCodeGroup; +typedef uint16_t BluetoothHCICommandOpCodeCommand; +typedef uint16_t BluetoothHCICommandOpCode; +typedef uint32_t BluetoothHCIVendorCommandSelector; + +#define BluetoothHCIMakeCommandOpCode(GROUP, CMD) ((((GROUP)&0x003F) << 10) | ((CMD)&0x03FF)) +#define BluetoothHCIMakeCommandOpCodeEndianSwap(GROUP, CMD) CFSwapInt16HostToLittle(BluetoothHCIMakeCommandOpCode(GROUP, CMD)) +#define BluetoothHCIMakeCommandOpCodeHostOrder(GROUP, CMD) OSSwapLittleToHostConstInt16((((GROUP)&0x003F) << 10) | ((CMD)&0x03FF)) + +#define BluetoothHCIExtractCommandOpCodeGroup(OPCODE) (((OPCODE) >> 10) & 0x003F) +#define BluetoothHCIExtractCommandOpCodeCommand(OPCODE) ((OPCODE)&0x03FF) + +enum +{ + // Command Group: NoOp + + kBluetoothHCIOpCodeNoOp = 0, + kBluetoothHCICommandGroupNoOp = 0x00, + kBluetoothHCICommandNoOp = 0x0000, + + // Command Group: Link Control + + kBluetoothHCICommandGroupLinkControl = 0x01, + kBluetoothHCICommandInquiry = 0x0001, + kBluetoothHCICommandInquiryCancel = 0x0002, + kBluetoothHCICommandPeriodicInquiryMode = 0x0003, + kBluetoothHCICommandExitPeriodicInquiryMode = 0x0004, + kBluetoothHCICommandCreateConnection = 0x0005, + kBluetoothHCICommandDisconnect = 0x0006, + kBluetoothHCICommandAddSCOConnection = 0x0007, // DEPRECATED + kBluetoothHCICommandCreateConnectionCancel = 0x0008, + kBluetoothHCICommandAcceptConnectionRequest = 0x0009, + kBluetoothHCICommandRejectConnectionRequest = 0x000A, + kBluetoothHCICommandLinkKeyRequestReply = 0x000B, + kBluetoothHCICommandLinkKeyRequestNegativeReply = 0x000C, + kBluetoothHCICommandPINCodeRequestReply = 0x000D, + kBluetoothHCICommandPINCodeRequestNegativeReply = 0x000E, + kBluetoothHCICommandChangeConnectionPacketType = 0x000F, + kBluetoothHCICommandAuthenticationRequested = 0x0011, + kBluetoothHCICommandSetConnectionEncryption = 0x0013, + kBluetoothHCICommandChangeConnectionLinkKey = 0x0015, + kBluetoothHCICommandMasterLinkKey = 0x0017, + kBluetoothHCICommandRemoteNameRequest = 0x0019, + kBluetoothHCICommandReadRemoteSupportedFeatures = 0x001B, + kBluetoothHCICommandReadRemoteExtendedFeatures = 0x001C, + kBluetoothHCICommandReadRemoteVersionInformation = 0x001D, + kBluetoothHCICommandReadClockOffset = 0x001F, + kBluetoothHCICommandRemoteNameRequestCancel = 0x001A, + kBluetoothHCICommandReadLMPHandle = 0x0020, + kBluetoothHCICommandSetupSynchronousConnection = 0x0028, + kBluetoothHCICommandAcceptSynchronousConnectionRequest = 0x0029, + kBluetoothHCICommandRejectSynchronousConnectionRequest = 0x002A, + kBluetoothHCICommandIOCapabilityRequestReply = 0x002B, + kBluetoothHCICommandUserConfirmationRequestReply = 0x002C, + kBluetoothHCICommandUserConfirmationRequestNegativeReply = 0x002D, + kBluetoothHCICommandUserPasskeyRequestReply = 0x002E, + kBluetoothHCICommandUserPasskeyRequestNegativeReply = 0x002F, + kBluetoothHCICommandRemoteOOBDataRequestReply = 0x0030, + kBluetoothHCICommandRemoteOOBDataRequestNegativeReply = 0x0033, + kBluetoothHCICommandIOCapabilityRequestNegativeReply = 0x0034, + kBluetoothHCICommandEnhancedSetupSynchronousConnection = 0x003D, + kBluetoothHCICommandEnhancedAcceptSynchronousConnectionRequest = 0x003E, + kBluetoothHCICommandTruncatedPage = 0x003F, + kBluetoothHCICommandTruncatedPageCancel = 0x0040, + kBluetoothHCICommandSetConnectionlessSlaveBroadcast = 0x0041, + kBluetoothHCICommandSetConnectionlessSlaveBroadcastReceive = 0x0042, + kBluetoothHCICommandStartSynchronizationTrain = 0x0043, + kBluetoothHCICommandReceiveSynchronizationTrain = 0x0044, + kBluetoothHCICommandRemoteOOBExtendedDataRequestReply = 0x0045, + + // Command Group: Link Policy + + kBluetoothHCICommandGroupLinkPolicy = 0x02, + kBluetoothHCICommandHoldMode = 0x0001, + kBluetoothHCICommandSniffMode = 0x0003, + kBluetoothHCICommandExitSniffMode = 0x0004, + kBluetoothHCICommandParkMode = 0x0005, + kBluetoothHCICommandExitParkMode = 0x0006, + kBluetoothHCICommandQoSSetup = 0x0007, + kBluetoothHCICommandRoleDiscovery = 0x0009, + kBluetoothHCICommandSwitchRole = 0x000B, + kBluetoothHCICommandReadLinkPolicySettings = 0x000C, + kBluetoothHCICommandWriteLinkPolicySettings = 0x000D, + kBluetoothHCICommandReadDefaultLinkPolicySettings = 0x000E, + kBluetoothHCICommandWriteDefaultLinkPolicySettings = 0x000F, + kBluetoothHCICommandFlowSpecification = 0x0010, + kBluetoothHCICommandSniffSubrating = 0x0011, + kBluetoothHCICommandAcceptSniffRequest = 0x0031, + kBluetoothHCICommandRejectSniffRequest = 0x0032, + + // Command Group: Host Controller & Baseband + + kBluetoothHCICommandGroupHostController = 0x03, + kBluetoothHCICommandSetEventMask = 0x0001, + kBluetoothHCICommandReset = 0x0003, + kBluetoothHCICommandSetEventFilter = 0x0005, + kBluetoothHCICommandFlush = 0x0008, + kBluetoothHCICommandReadPINType = 0x0009, + kBluetoothHCICommandWritePINType = 0x000A, + kBluetoothHCICommandCreateNewUnitKey = 0x000B, + kBluetoothHCICommandReadStoredLinkKey = 0x000D, + kBluetoothHCICommandWriteStoredLinkKey = 0x0011, + kBluetoothHCICommandDeleteStoredLinkKey = 0x0012, + kBluetoothHCICommandChangeLocalName = 0x0013, + kBluetoothHCICommandReadLocalName = 0x0014, + kBluetoothHCICommandReadConnectionAcceptTimeout = 0x0015, + kBluetoothHCICommandWriteConnectionAcceptTimeout = 0x0016, + kBluetoothHCICommandReadPageTimeout = 0x0017, + kBluetoothHCICommandWritePageTimeout = 0x0018, + kBluetoothHCICommandReadScanEnable = 0x0019, + kBluetoothHCICommandWriteScanEnable = 0x001A, + kBluetoothHCICommandReadPageScanActivity = 0x001B, + kBluetoothHCICommandWritePageScanActivity = 0x001C, + kBluetoothHCICommandReadInquiryScanActivity = 0x001D, + kBluetoothHCICommandWriteInquiryScanActivity = 0x001E, + kBluetoothHCICommandReadAuthenticationEnable = 0x001F, + kBluetoothHCICommandWriteAuthenticationEnable = 0x0020, + kBluetoothHCICommandReadEncryptionMode = 0x0021, // DEPRECATED + kBluetoothHCICommandWriteEncryptionMode = 0x0022, // DEPRECATED + kBluetoothHCICommandReadClassOfDevice = 0x0023, + kBluetoothHCICommandWriteClassOfDevice = 0x0024, + kBluetoothHCICommandReadVoiceSetting = 0x0025, + kBluetoothHCICommandWriteVoiceSetting = 0x0026, + kBluetoothHCICommandReadAutomaticFlushTimeout = 0x0027, + kBluetoothHCICommandWriteAutomaticFlushTimeout = 0x0028, + kBluetoothHCICommandReadNumberOfBroadcastRetransmissions = 0x0029, + kBluetoothHCICommandWriteNumberOfBroadcastRetransmissions = 0x002A, + kBluetoothHCICommandReadHoldModeActivity = 0x002B, + kBluetoothHCICommandWriteHoldModeActivity = 0x002C, + kBluetoothHCICommandReadTransmitPowerLevel = 0x002D, + kBluetoothHCICommandReadSCOFlowControlEnable = 0x002E, + kBluetoothHCICommandWriteSCOFlowControlEnable = 0x002F, + kBluetoothHCICommandSetHostControllerToHostFlowControl = 0x0031, + kBluetoothHCICommandHostBufferSize = 0x0033, + kBluetoothHCICommandHostNumberOfCompletedPackets = 0x0035, + kBluetoothHCICommandReadLinkSupervisionTimeout = 0x0036, + kBluetoothHCICommandWriteLinkSupervisionTimeout = 0x0037, + kBluetoothHCICommandReadNumberOfSupportedIAC = 0x0038, + kBluetoothHCICommandReadCurrentIACLAP = 0x0039, + kBluetoothHCICommandWriteCurrentIACLAP = 0x003A, + kBluetoothHCICommandReadPageScanPeriodMode = 0x003B, // DEPRECATED + kBluetoothHCICommandWritePageScanPeriodMode = 0x003C, // DEPRECATED + kBluetoothHCICommandReadPageScanMode = 0x003D, // DEPRECATED + kBluetoothHCICommandWritePageScanMode = 0x003E, // DEPRECATED + kBluetoothHCICommandSetAFHClassification = 0x003F, + kBluetoothHCICommandReadInquiryScanType = 0x0042, + kBluetoothHCICommandWriteInquiryScanType = 0x0043, + kBluetoothHCICommandReadInquiryMode = 0x0044, + kBluetoothHCICommandWriteInquiryMode = 0x0045, + kBluetoothHCICommandReadPageScanType = 0x0046, + kBluetoothHCICommandWritePageScanType = 0x0047, + kBluetoothHCICommandReadAFHChannelAssessmentMode = 0x0048, + kBluetoothHCICommandWriteAFHChannelAssessmentMode = 0x0049, + kBluetoothHCICommandReadExtendedInquiryResponse = 0x0051, + kBluetoothHCICommandWriteExtendedInquiryResponse = 0x0052, + kBluetoothHCICommandRefreshEncryptionKey = 0x0053, + kBluetoothHCICommandReadSimplePairingMode = 0x0055, + kBluetoothHCICommandWriteSimplePairingMode = 0x0056, + kBluetoothHCICommandReadLocalOOBData = 0x0057, + kBluetoothHCICommandReadInquiryResponseTransmitPower = 0x0058, + kBluetoothHCICommandWriteInquiryResponseTransmitPower = 0x0059, + kBluetoothHCICommandSendKeypressNotification = 0x0060, + kBluetoothHCICommandReadDefaultErroneousDataReporting = 0x005A, + kBluetoothHCICommandWriteDefaultErroneousDataReporting = 0x005B, + kBluetoothHCICommandEnhancedFlush = 0x005F, + kBluetoothHCICommandReadLogicalLinkAcceptTimeout = 0x0061, + kBluetoothHCICommandWriteLogicalLinkAcceptTimeout = 0x0062, + kBluetoothHCICommandSetEventMaskPageTwo = 0x0063, + kBluetoothHCICommandReadLocationData = 0x0064, + kBluetoothHCICommandWriteLocationData = 0x0065, + kBluetoothHCICommandReadFlowControlMode = 0x0066, + kBluetoothHCICommandWriteFlowControlMode = 0x0067, + kBluetoothHCICommandReadEnhancedTransmitPowerLevel = 0x0068, + kBluetoothHCICommandReadBestEffortFlushTimeout = 0x0069, + kBluetoothHCICommandWriteBestEffortFlushTimeout = 0x006A, + kBluetoothHCICommandShortRangeMode = 0x006B, + kBluetoothHCICommandReadLEHostSupported = 0x006C, + kBluetoothHCICommandWriteLEHostSupported = 0x006D, + kBluetoothHCICommandSetMWSChannelParameters = 0x006E, + kBluetoothHCICommandSetExternalFrameConfiguration = 0x006F, + kBluetoothHCICommandSetMWSSignaling = 0x0070, + kBluetoothHCICommandSetMWSTransportLayer = 0x0071, + kBluetoothHCICommandSetMWSScanFrequencyTable = 0x0072, + kBluetoothHCICommandSetMWSPATTERNConfiguration = 0x0073, + kBluetoothHCICommandSetReservedLTADDR = 0x0074, + kBluetoothHCICommandDeleteReservedLTADDR = 0x0075, + kBluetoothHCICommandSetConnectionlessSlaveBroadcastData = 0x0076, + kBluetoothHCICommandReadSynchronizationTrainParameters = 0x0077, + kBluetoothHCICommandWriteSynchronizationTrainParameters = 0x0078, + kBluetoothHCICommandReadSecureConnectionsHostSupport = 0x0079, + kBluetoothHCICommandWriteSecureConnectionsHostSupport = 0x007A, + kBluetoothHCICommandReadAuthenticatedPayloadTimeout = 0x007B, + kBluetoothHCICommandWriteAuthenticatedPayloadTimeout = 0x007C, + kBluetoothHCICommandReadLocalOOBExtendedData = 0x007D, + kBluetoothHCICommandReadExtendedPageTimeout = 0x007E, + kBluetoothHCICommandWriteExtendedPageTimeout = 0x007F, + kBluetoothHCICommandReadExtendedInquiryLength = 0x0080, + kBluetoothHCICommandWriteExtendedInquiryLength = 0x0081, + + // Command Group: Informational + + kBluetoothHCICommandGroupInformational = 0x04, + kBluetoothHCICommandReadLocalVersionInformation = 0x0001, + kBluetoothHCICommandReadLocalSupportedCommands = 0x0002, + kBluetoothHCICommandReadLocalSupportedFeatures = 0x0003, + kBluetoothHCICommandReadLocalExtendedFeatures = 0x0004, + kBluetoothHCICommandReadBufferSize = 0x0005, + kBluetoothHCICommandReadCountryCode = 0x0007, // DEPRECATED + kBluetoothHCICommandReadDeviceAddress = 0x0009, + kBluetoothHCICommandReadDataBlockSize = 0x000A, + kBluetoothHCICommandReadLocalSupportedCodecs = 0x000B, + + // Command Group: Status + + kBluetoothHCICommandGroupStatus = 0x05, + kBluetoothHCICommandReadFailedContactCounter = 0x0001, + kBluetoothHCICommandResetFailedContactCounter = 0x0002, + kBluetoothHCICommandGetLinkQuality = 0x0003, + kBluetoothHCICommandReadRSSI = 0x0005, + kBluetoothHCICommandReadAFHMappings = 0x0006, + kBluetoothHCICommandReadClock = 0x0007, + kBluetoothHCICommandReadEncryptionKeySize = 0x0008, + kBluetoothHCICommandReadLocalAMPInfo = 0x0009, + kBluetoothHCICommandReadLocalAMPASSOC = 0x000A, + kBluetoothHCICommandWriteRemoteAMPASSOC = 0x000B, + kBluetoothHCICommandGetMWSTransportLayerConfiguration = 0x000C, + kBluetoothHCICommandSetTriggeredClockCapture = 0x000D, + + // Command Group: Testing + + kBluetoothHCICommandGroupTesting = 0x06, + kBluetoothHCICommandReadLoopbackMode = 0x0001, + kBluetoothHCICommandWriteLoopbackMode = 0x0002, + kBluetoothHCICommandEnableDeviceUnderTestMode = 0x0003, + kBluetoothHCICommandWriteSimplePairingDebugMode = 0x0004, + kBluetoothHCICommandEnableAMPReceiverReports = 0x0007, + kBluetoothHCICommandAMPTestEnd = 0x0008, + kBluetoothHCICommandAMPTest = 0x0009, + + // Command Group: Low Energy + + kBluetoothHCICommandGroupLowEnergy = 0x08, + kBluetoothHCICommandLESetEventMask = 0x0001, + kBluetoothHCICommandLEReadBufferSize = 0x0002, + kBluetoothHCICommandLEReadLocalSupportedFeatures = 0x0003, + kBluetoothHCICommandLESetRandomAddress = 0x0005, + kBluetoothHCICommandLESetAdvertisingParameters = 0x0006, + kBluetoothHCICommandLEReadAdvertisingChannelTxPower = 0x0007, + kBluetoothHCICommandLESetAdvertisingData = 0x0008, + kBluetoothHCICommandLESetScanResponseData = 0x0009, + kBluetoothHCICommandLESetAdvertiseEnable = 0x000A, + kBluetoothHCICommandLESetScanParameters = 0x000B, + kBluetoothHCICommandLESetScanEnable = 0x000C, + kBluetoothHCICommandLECreateConnection = 0x000D, + kBluetoothHCICommandLECreateConnectionCancel = 0x000E, + kBluetoothHCICommandLEReadWhiteListSize = 0x000F, + kBluetoothHCICommandLEClearWhiteList = 0x0010, + kBluetoothHCICommandLEAddDeviceToWhiteList = 0x0011, + kBluetoothHCICommandLERemoveDeviceFromWhiteList = 0x0012, + kBluetoothHCICommandLEConnectionUpdate = 0x0013, + kBluetoothHCICommandLESetHostChannelClassification = 0x0014, + kBluetoothHCICommandLEReadChannelMap = 0x0015, + kBluetoothHCICommandLEReadRemoteUsedFeatures = 0x0016, + kBluetoothHCICommandLEEncrypt = 0x0017, + kBluetoothHCICommandLERand = 0x0018, + kBluetoothHCICommandLEStartEncryption = 0x0019, + kBluetoothHCICommandLELongTermKeyRequestReply = 0x001A, + kBluetoothHCICommandLELongTermKeyRequestNegativeReply = 0x001B, + kBluetoothHCICommandLEReadSupportedStates = 0x001C, + kBluetoothHCICommandLEReceiverTest = 0x001D, + kBluetoothHCICommandLETransmitterTest = 0x001E, + kBluetoothHCICommandLETestEnd = 0x001F, + kBluetoothHCICommandLERemoteConnectionParameterRequestReply = 0x0020, + kBluetoothHCICommandLERemoteConnectionParameterRequestNegativeReply = 0x0021, + kBluetoothHCICommandLESetDataLength = 0x0022, + kBluetoothHCICommandLEReadSuggestedDefaultDataLength = 0x0023, + kBluetoothHCICommandLEWriteSuggestedDefaultDataLength = 0x0024, + kBluetoothHCICommandLEReadLocalP256PublicKey = 0x0025, + kBluetoothHCICommandLEGenerateDHKey = 0x0026, + kBluetoothHCICommandLEAddDeviceToResolvingList = 0x0027, + kBluetoothHCICommandLERemoveDeviceFromResolvingList = 0x0028, + kBluetoothHCICommandLEClearResolvingList = 0x0029, + kBluetoothHCICommandLEReadResolvingListSize = 0x002A, + kBluetoothHCICommandLEReadPeerResolvableAddress = 0x002B, + kBluetoothHCICommandLEReadLocalResolvableAddress = 0x002C, + kBluetoothHCICommandLESetAddressResolutionEnable = 0x002D, + kBluetoothHCICommandLESetResolvablePrivateAddressTimeout = 0x002E, + kBluetoothHCICommandLEReadMaximumDataLength = 0x002F, + kBluetoothHCICommandLEReadPhy = 0x0030, + kBluetoothHCICommandLESetDefaultPhy = 0x0031, + kBluetoothHCICommandLESetPhy = 0x0032, + kBluetoothHCICommandLEEnhancedReceiverTest = 0x0033, + kBluetoothHCICommandLEEnhancedTransmitterTest = 0x0034, + kBluetoothHCICommandLESetAdvertisingSetRandomAddress = 0x0035, + kBluetoothHCICommandLESetExtendedAdvertisingParameters = 0x0036, + kBluetoothHCICommandLESetExtendedAdvertisingData = 0x0037, + kBluetoothHCICommandLESetExtendedScanResponseData = 0x0038, + kBluetoothHCICommandLESetExtendedAdvertisingEnableCommand = 0x0039, + kBluetoothHCICommandLEReadMaximumAdvertisingDataLength = 0x003A, + kBluetoothHCICommandLEReadNumberofSupportedAdvertisingSets = 0x003B, + kBluetoothHCICommandLERemoveAdvertisingSet = 0x003C, + kBluetoothHCICommandLEClearAdvertisingSets = 0x003D, + kBluetoothHCICommandLESetPeriodicAdvertisingParameters = 0x003E, + kBluetoothHCICommandLESetPeriodicAdvertisingData = 0x003F, + kBluetoothHCICommandLESetPeriodicAdvertisingEnable = 0x0040, + kBluetoothHCICommandLESetExtendedScanParameters = 0x0041, + kBluetoothHCICommandLESetExtendedScanEnable = 0x0042, + kBluetoothHCICommandLEExtendedCreateConnection = 0x0043, + kBluetoothHCICommandLEPeriodicAdvertisingCreateSync = 0x0044, + kBluetoothHCICommandLEPeriodicAdvertisingCreateSyncCancel = 0x0045, + kBluetoothHCICommandLEPeriodicAdvertisingTerminateSync = 0x0046, + kBluetoothHCICommandLEAddDeviceToPeriodicAdvertiserList = 0x0047, + kBluetoothHCICommandLERemoveDeviceFromPeriodicAdvertiserList = 0x0048, + kBluetoothHCICommandLEClearPeriodicAdvertiserList = 0x0049, + kBluetoothHCICommandLEReadPeriodicAdvertiserListSize = 0x004A, + kBluetoothHCICommandLEReadTransmitPower = 0x004B, + kBluetoothHCICommandLEReadRFPathCompensation = 0x004C, + kBluetoothHCICommandLEWriteRFPathCompensation = 0x004D, + kBluetoothHCICommandLESetPrivacyMode = 0x004E, + + // Command Group: Logo Testing (no commands yet) + + kBluetoothHCICommandGroupLogoTesting = 0x3E, + + // Command Group: Vendor Specific + kBluetoothHCICommandGroupVendorSpecific = 0x3F, + + kBluetoothHCICommandGroupMax = 0x40, + kBluetoothHCICommandMax = 0x03FF +}; + +// HCI Data Types + +typedef uint8_t BluetoothHCIQoSFlags; +typedef uint8_t BluetoothHCIParamByteCount; +typedef uint16_t BluetoothHCIACLDataByteCount; +typedef uint8_t BluetoothHCISCODataByteCount; +typedef uint8_t BluetoothHCIInquiryLength; +typedef uint8_t BluetoothHCIResponseCount; +typedef uint8_t BluetoothHCICountryCode; +typedef uint16_t BluetoothHCIModeInterval; +typedef uint16_t BluetoothHCISniffAttemptCount; +typedef uint16_t BluetoothHCISniffTimeout; +typedef uint16_t BluetoothHCIParkModeBeaconInterval; + +typedef uint8_t BluetoothMaxSlots; +typedef uint16_t BluetoothManufacturerName; +typedef uint8_t BluetoothLMPVersion; +typedef uint16_t BluetoothLMPSubversion; + +typedef uint8_t BluetoothHCIConnectionMode; +enum BluetoothHCIConnectionModes +{ + kConnectionActiveMode = 0, + kConnectionHoldMode = 1, + kConnectionSniffMode = 2, + kConnectionParkMode = 3, + kConnectionModeReservedForFutureUse = 4 +}; + +typedef struct BluetoothHCISupportedCommands +{ + uint8_t data[64]; +} BluetoothHCISupportedCommands; + +typedef struct BluetoothHCISupportedFeatures +{ + uint8_t data[8]; +} BluetoothHCISupportedFeatures; + +typedef struct BluetoothHCISupportedFeatures BluetoothHCILESupportedFeatures; +typedef struct BluetoothHCISupportedFeatures BluetoothHCILEUsedFeatures; + +typedef uint8_t BluetoothHCIPageNumber; + +typedef struct BluetoothHCIExtendedFeaturesInfo +{ + BluetoothHCIPageNumber page; + BluetoothHCIPageNumber maxPage; + uint8_t data[8]; +} BluetoothHCIExtendedFeaturesInfo; + +enum BluetoothLEFeatureBits +{ + kBluetoothLEFeatureLEEncryption = (1 << 0L), + kBluetoothLEFeatureConnectionParamsRequestProcedure = (1 << 1L), + kBluetoothLEFeatureExtendedRejectIndication = (1 << 2L), + kBluetoothLEFeatureSlaveInitiatedFeaturesExchange = (1 << 3L), + kBluetoothLEFeatureLEPing = (1 << 4L), + kBluetoothLEFeatureLEDataPacketLengthExtension = (1 << 5L), + kBluetoothLEFeatureLLPrivacy = (1 << 6L), + kBluetoothLEFeatureExtendedScannerFilterPolicies = (1 << 7L) + // Three other bytes are RFU +}; + +enum BluetoothFeatureBits +{ + // Byte 0 of the support features data structure. + + kBluetoothFeatureThreeSlotPackets = (1 << 0L), + kBluetoothFeatureFiveSlotPackets = (1 << 1L), + kBluetoothFeatureEncryption = (1 << 2L), + kBluetoothFeatureSlotOffset = (1 << 3L), + kBluetoothFeatureTimingAccuracy = (1 << 4L), + kBluetoothFeatureSwitchRoles = (1 << 5L), + kBluetoothFeatureHoldMode = (1 << 6L), + kBluetoothFeatureSniffMode = (1 << 7L), + + // Byte 1 of the support features data structure. + + kBluetoothFeatureParkMode = (1 << 0L), + kBluetoothFeatureRSSI = (1 << 1L), + kBluetoothFeaturePowerControlRequests = (1 << 1L), + kBluetoothFeatureChannelQuality = (1 << 2L), + kBluetoothFeatureSCOLink = (1 << 3L), + kBluetoothFeatureHV2Packets = (1 << 4L), + kBluetoothFeatureHV3Packets = (1 << 5L), + kBluetoothFeatureULawLog = (1 << 6L), + kBluetoothFeatureALawLog = (1 << 7L), + + // Byte 2 of the support features data structure. + + kBluetoothFeatureCVSD = (1 << 0L), + kBluetoothFeaturePagingScheme = (1 << 1L), + kBluetoothFeaturePowerControl = (1 << 2L), + kBluetoothFeatureTransparentSCOData = (1 << 3L), + kBluetoothFeatureFlowControlLagBit0 = (1 << 4L), + kBluetoothFeatureFlowControlLagBit1 = (1 << 5L), + kBluetoothFeatureFlowControlLagBit2 = (1 << 6L), + kBluetoothFeatureBroadcastEncryption = (1 << 7L), + + // Byte 3 of the support features data structure. + + kBluetoothFeatureScatterMode = (1 << 0L), + kBluetoothFeatureEnhancedDataRateACL2MbpsMode = (1 << 1L), + kBluetoothFeatureEnhancedDataRateACL3MbpsMode = (1 << 2L), + kBluetoothFeatureEnhancedInquiryScan = (1 << 3L), + kBluetoothFeatureInterlacedInquiryScan = (1 << 4L), + kBluetoothFeatureInterlacedPageScan = (1 << 5L), + kBluetoothFeatureRSSIWithInquiryResult = (1 << 6L), + kBluetoothFeatureExtendedSCOLink = (1 << 7L), + + // Byte 4 of the support features data structure. + + kBluetoothFeatureEV4Packets = (1 << 0L), + kBluetoothFeatureEV5Packets = (1 << 1L), + kBluetoothFeatureAbsenceMasks = (1 << 2L), + kBluetoothFeatureAFHCapableSlave = (1 << 3L), + kBluetoothFeatureAFHClassificationSlave = (1 << 4L), + kBluetoothFeatureAliasAuhentication = (1 << 5L), + kBluetoothFeatureLESupportedController = (1 << 6L), + kBluetoothFeature3SlotEnhancedDataRateACLPackets = (1 << 7L), + + // Byte 5 of the support features data structure. + + kBluetoothFeature5SlotEnhancedDataRateACLPackets = (1 << 0L), // 2.0 version of this header had this at the wrong bit location + kBluetoothFeatureSniffSubrating = (1 << 1L), + kBluetoothFeaturePauseEncryption = (1 << 2L), + kBluetoothFeatureAFHCapableMaster = (1 << 3L), + kBluetoothFeatureAFHClassificationMaster = (1 << 4L), + kBluetoothFeatureEnhancedDataRateeSCO2MbpsMode = (1 << 5L), + kBluetoothFeatureEnhancedDataRateeSCO3MbpsMode = (1 << 6L), + kBluetoothFeature3SlotEnhancedDataRateeSCOPackets = (1 << 7L), + + // Byte 6 of the support features data structure. + + kBluetoothFeatureExtendedInquiryResponse = (1 << 0L), + kBluetoothFeatureSecureSimplePairing = (1 << 3L), + kBluetoothFeatureEncapsulatedPDU = (1 << 4L), + kBluetoothFeatureErroneousDataReporting = (1 << 5L), + kBluetoothFeatureNonFlushablePacketBoundaryFlag = (1 << 6L), + + // Byte 7 of the support features data structure. + + kBluetoothFeatureLinkSupervisionTimeoutChangedEvent = (1 << 0L), + kBluetoothFeatureInquiryTransmissionPowerLevel = (1 << 1L), + kBluetoothFeatureExtendedFeatures = (1 << 7L), + + // Byte 8 of the support features data structure (extended) page 1 + + kBluetoothExtendedFeatureSimpleSecurePairingHostMode = (1 << 0L), + kBluetoothExtendedFeatureLESupportedHostMode = (1 << 1L), + kBluetoothExtendedFeatureLEAndBREDRToSameDeviceHostMode = (1 << 2L), + KBluetoothExtendedFeatureSecureConnectionsHostMode = (1 << 3L), + + // Byte 16 of supported features data structure (extended) page 2 + + kBluetoothExtendedFeatureSecureConnectionsControllerSupport = (1 << 0L), + kBluetoothExtendedFeaturePing = (1 << 1L), + kBluetoothExtendedFeatureReserved = (1 << 2L), + kBluetoothExtendedFeatureTrainNudging = (1 << 3L), + kBluetoothExtendedFeatureSlotAvailabilityMask = (1 << 4L) +}; + +typedef struct BluetoothEventFilterCondition +{ + uint8_t data[7]; +} BluetoothEventFilterCondition; + +typedef uint16_t BluetoothHCIFailedContactCount; +typedef struct BluetoothHCIFailedContactInfo +{ + BluetoothHCIFailedContactCount count; + BluetoothConnectionHandle handle; +} BluetoothHCIFailedContactInfo; + +typedef SInt8 BluetoothHCIRSSIValue; /* Valid Range: -127 to +20 */ +typedef struct BluetoothHCIRSSIInfo +{ + BluetoothConnectionHandle handle; + BluetoothHCIRSSIValue RSSIValue; +} BluetoothHCIRSSIInfo; + +typedef uint8_t BluetoothHCILinkQuality; +typedef struct BluetoothHCILinkQualityInfo +{ + BluetoothConnectionHandle handle; + BluetoothHCILinkQuality qualityValue; +} BluetoothHCILinkQualityInfo; + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 +typedef uint8_t BluetoothHCIEncryptionKeySize; +typedef struct BluetoothHCIEncryptionKeySizeInfo +{ + BluetoothConnectionHandle handle; + BluetoothHCIEncryptionKeySize keySize; +} BluetoothHCIEncryptionKeySizeInfo; +#endif + +typedef uint8_t BluetoothHCIRole; +typedef struct BluetoothHCIRoleInfo +{ + uint8_t role; + BluetoothConnectionHandle handle; +} BluetoothHCIRoleInfo; + +enum BluetoothHCIRoles +{ + kBluetoothHCIMasterRole = 0x00, + kBluetoothHCISlaveRole = 0x01 +}; + +typedef uint16_t BluetoothHCILinkPolicySettings; +enum BluetoothHCILinkPolicySettingsValues +{ + kDisableAllLMModes = 0x0000, + kEnableMasterSlaveSwitch = 0x0001, + kEnableHoldMode = 0x0002, + kEnableSniffMode = 0x0004, + kEnableParkMode = 0x0008, + kReservedForFutureUse = 0x0010 +}; + +typedef struct BluetoothHCILinkPolicySettingsInfo +{ + BluetoothHCILinkPolicySettings settings; + BluetoothConnectionHandle handle; +} BluetoothHCILinkPolicySettingsInfo; + +typedef struct BluetoothHCIQualityOfServiceSetupParams +{ + uint8_t flags; + uint8_t serviceType; + uint32_t tokenRate; + uint32_t peakBandwidth; + uint32_t latency; + uint32_t delayVariation; +} BluetoothHCIQualityOfServiceSetupParams; + +typedef struct BluetoothHCISetupSynchronousConnectionParams +{ + uint32_t transmitBandwidth; + uint32_t receiveBandwidth; + uint16_t maxLatency; + uint16_t voiceSetting; + uint8_t retransmissionEffort; + uint16_t packetType; +} BluetoothHCISetupSynchronousConnectionParams; + +typedef struct BluetoothHCIAcceptSynchronousConnectionRequestParams +{ + uint32_t transmitBandwidth; + uint32_t receiveBandwidth; + uint16_t maxLatency; + uint16_t contentFormat; + uint8_t retransmissionEffort; + uint16_t packetType; +} BluetoothHCIAcceptSynchronousConnectionRequestParams; + +// Add for EnhancedSetup +typedef struct BluetoothHCIEnhancedSetupSynchronousConnectionParams +{ + uint32_t transmitBandwidth; + uint32_t receiveBandwidth; + uint64_t transmitCodingFormat; + uint64_t receiveCodingFormat; +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + uint16_t transmitCodecFrameSize; + uint16_t receiveCodecFrameSize; + uint32_t inputBandwidth; + uint32_t outputBandwidth; +#else + uint8_t transmitCodecFrameSize; + uint8_t receiveCodecFrameSize; + uint16_t inputBandwidth; + uint16_t outputBandwidth; +#endif + uint64_t inputCodingFormat; + uint64_t outputCodingFormat; + uint16_t inputCodedDataSize; + uint16_t outputCodedDataSize; + uint8_t inputPCMDataFormat; + uint8_t outputPCMDataFormat; + uint8_t inputPCMSamplePayloadMSBPosition; + uint8_t outputPCMSamplePayloadMSBPosition; + uint8_t inputDataPath; + uint8_t outputDataPath; + uint8_t inputTransportUnitSize; + uint8_t outputTransportUnitSize; + uint16_t maxLatency; +#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_14 + uint16_t voiceSetting; + uint8_t retransmissionEffort; +#endif + uint16_t packetType; +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + uint8_t retransmissionEffort; +#endif +} BluetoothHCIEnhancedSetupSynchronousConnectionParams; + +// Add for EnhancedAccept +typedef struct BluetoothHCIEnhancedAcceptSynchronousConnectionRequestParams +{ + uint32_t transmitBandwidth; + uint32_t receiveBandwidth; + uint64_t transmitCodingFormat; + uint64_t receiveCodingFormat; +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + uint16_t transmitCodecFrameSize; + uint16_t receiveCodecFrameSize; + uint32_t inputBandwidth; + uint32_t outputBandwidth; +#else + uint8_t transmitCodecFrameSize; + uint8_t receiveCodecFrameSize; + uint16_t inputBandwidth; + uint16_t outputBandwidth; +#endif + uint64_t inputCodingFormat; + uint64_t outputCodingFormat; + uint16_t inputCodedDataSize; + uint16_t outputCodedDataSize; + uint8_t inputPCMDataFormat; + uint8_t outputPCMDataFormat; + uint8_t inputPCMSamplePayloadMSBPosition; + uint8_t outputPCMSamplePayloadMSBPosition; + uint8_t inputDataPath; + uint8_t outputDataPath; + uint8_t inputTransportUnitSize; + uint8_t outputTransportUnitSize; + uint16_t maxLatency; +#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_14 + uint16_t voiceSetting; + uint8_t retransmissionEffort; +#endif + uint16_t packetType; +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + uint8_t retransmissionEffort; +#endif +} BluetoothHCIEnhancedAcceptSynchronousConnectionRequestParams; + +typedef uint8_t BluetoothHCILoopbackMode; +enum +{ + kBluetoothHCILoopbackModeOff = 0x00, + kBluetoothHCILoopbackModeLocal = 0x01, + kBluetoothHCILoopbackModeRemote = 0x02 +}; + +typedef struct BluetoothReadClockInfo +{ + BluetoothConnectionHandle handle; + uint32_t clock; + uint16_t accuracy; +} BluetoothReadClockInfo; + +typedef struct BluetoothHCIEventFlowSpecificationData +{ + BluetoothConnectionHandle connectionHandle; + uint8_t flags; + uint8_t flowDirection; + uint8_t serviceType; + uint32_t tokenRate; + uint32_t tokenBucketSize; + uint32_t peakBandwidth; + uint32_t accessLatency; +} BluetoothHCIEventFlowSpecificationData; + +typedef uint32_t BluetoothHCIOperationID; +typedef uint32_t BluetoothHCIEventID; +typedef uint32_t BluetoothHCIDataID; +typedef uint32_t BluetoothHCISignalID; +typedef uint32_t BluetoothHCITransportID; +typedef uint32_t BluetoothHCITransportCommandID; +typedef uint32_t BluetoothHCIRequestID; + +// Version Information +typedef struct BluetoothHCIVersionInfo +{ + // Local & Remote information + BluetoothManufacturerName manufacturerName; + BluetoothLMPVersion lmpVersion; + BluetoothLMPSubversion lmpSubVersion; + + // Local information only + uint8_t hciVersion; + uint16_t hciRevision; +} BluetoothHCIVersionInfo; + +// HCI buffer sizes +typedef struct BluetoothHCIBufferSize +{ + uint16_t ACLDataPacketLength; + uint8_t SCODataPacketLength; + uint16_t totalNumACLDataPackets; + uint16_t totalNumSCODataPackets; +} BluetoothHCIBufferSize; + +typedef struct BluetoothHCILEBufferSize +{ + uint16_t ACLDataPacketLength; + uint8_t totalNumACLDataPackets; +} BluetoothHCILEBufferSize; + +// Timeouts +typedef uint16_t BluetoothHCIConnectionAcceptTimeout; +typedef uint16_t BluetoothHCIPageTimeout; +enum BluetoothHCITimeoutValues +{ + kDefaultPageTimeout = 0x2710 +}; + +#define BluetoothGetSlotsFromSeconds(inSeconds) ((inSeconds / .000625)) +#define BluetoothGetSecondsFromSlots(inSlots) ((inSlots * .000625)) + +// Link Keys +typedef uint16_t BluetoothHCINumLinkKeysDeleted; +typedef uint8_t BluetoothHCINumLinkKeysToWrite; +typedef uint8_t BluetoothHCIDeleteStoredLinkKeyFlag; +enum BluetoothHCIDeleteStoredLinkKeyFlags +{ + kDeleteKeyForSpecifiedDeviceOnly = 0x00, + kDeleteAllStoredLinkKeys = 0x01 +}; + +typedef uint8_t BluetoothHCIReadStoredLinkKeysFlag; +enum BluetoothHCIReadStoredLinkKeysFlags +{ + kReturnLinkKeyForSpecifiedDeviceOnly = 0x00, + kReadAllStoredLinkKeys = 0x01 +}; + +typedef struct BluetoothHCIStoredLinkKeysInfo +{ + uint16_t numLinkKeysRead; + uint16_t maxNumLinkKeysAllowedInDevice; +} BluetoothHCIStoredLinkKeysInfo; + +// Page Scan +typedef uint8_t BluetoothHCIPageScanMode; +enum BluetoothHCIPageScanModes +{ + kMandatoryPageScanMode = 0x00, + kOptionalPageScanMode1 = 0x01, + kOptionalPageScanMode2 = 0x02, + kOptionalPageScanMode3 = 0x03 +}; + +typedef uint8_t BluetoothHCIPageScanPeriodMode; +enum BluetoothHCIPageScanPeriodModes +{ + kP0Mode = 0x00, + kP1Mode = 0x01, + kP2Mode = 0x02 +}; + +typedef uint8_t BluetoothHCIPageScanEnableState; +enum BluetoothHCIPageScanEnableStates +{ + kNoScansEnabled = 0x00, + kInquiryScanEnabledPageScanDisabled = 0x01, + kInquiryScanDisabledPageScanEnabled = 0x02, + kInquiryScanEnabledPageScanEnabled = 0x03 +}; + +typedef struct BluetoothHCIScanActivity +{ + uint16_t scanInterval; + uint16_t scanWindow; +} BluetoothHCIScanActivity; + +typedef struct BluetoothHCIInquiryAccessCode +{ + uint8_t data[3]; +} BluetoothHCIInquiryAccessCode; + +typedef uint8_t BluetoothHCIInquiryAccessCodeCount; +typedef struct BluetoothHCICurrentInquiryAccessCodes +{ + BluetoothHCIInquiryAccessCodeCount count; // Number of codes in array. + BluetoothHCIInquiryAccessCode * codes; // Ptr to array of codes. +} BluetoothHCICurrentInquiryAccessCodes; + +enum +{ + kMaximumNumberOfInquiryAccessCodes = 0x40 +}; + +typedef struct BluetoothHCICurrentInquiryAccessCodesForWrite +{ + BluetoothHCIInquiryAccessCodeCount count; // Number of codes in array (Range 0x01 to 0x40) + uint8_t codes[kMaximumNumberOfInquiryAccessCodes * sizeof(BluetoothHCIInquiryAccessCode)]; // Array of bytes (maximum 192 bytes -- 64 * 3). +} BluetoothHCICurrentInquiryAccessCodesForWrite; + +typedef struct BluetoothHCILinkSupervisionTimeout +{ + BluetoothConnectionHandle handle; + uint16_t timeout; +} BluetoothHCILinkSupervisionTimeout; + +typedef uint8_t BluetoothHCIFlowControlState; +enum BluetoothHCISCOFlowControlStates +{ + kSCOFlowControlDisabled = 0x00, + kSCOFlowControlEnabled = 0x01 +}; + +enum BluetoothHCIGeneralFlowControlStates +{ + kHostControllerToHostFlowControlOff = 0x00, + kHCIACLDataPacketsOnHCISCODataPacketsOff = 0x01, + kHCIACLDataPacketsOffHCISCODataPacketsOn = 0x02, + kHCIACLDataPacketsOnHCISCODataPacketsOn = 0x03 +}; + +typedef SInt8 BluetoothHCITransmitPowerLevel; +typedef uint8_t BluetoothHCITransmitPowerLevelType; +enum BluetoothHCITransmitReadPowerLevelTypes +{ + kReadCurrentTransmitPowerLevel = 0x00, + kReadMaximumTransmitPowerLevel = 0x01 +}; + +typedef uint8_t BluetoothHCIAFHChannelAssessmentMode; +enum BluetoothHCIAFHChannelAssessmentModes +{ + kAFHChannelAssessmentModeDisabled = 0x00, + kAFHChannelAssessmentModeEnabled = 0x01 +}; + +typedef struct BluetoothHCITransmitPowerLevelInfo +{ + BluetoothConnectionHandle handle; + BluetoothHCITransmitPowerLevel level; // Range: -70 <= N <= 20 (units are dBm) +} BluetoothHCITransmitPowerLevelInfo; + +typedef uint8_t BluetoothHCINumBroadcastRetransmissions; +typedef uint8_t BluetoothHCIHoldModeActivity; +enum BluetoothHCIHoldModeActivityStates +{ + kMaintainCurrentPowerState = 0x00, + kSuspendPageScan = 0x01, + kSuspendInquiryScan = 0x02, + kSuspendPeriodicInquiries = 0x03 +}; + +typedef uint8_t BluetoothHCIAuthenticationEnable; +enum BluetoothHCIAuthentionEnableModes +{ + kAuthenticationDisabled = 0x00, + kAuthenticationEnabled = 0x01 +}; + +typedef uint8_t BluetoothHCIEncryptionMode; +enum BluetoothHCIEncryptionModes +{ + kEncryptionDisabled = 0x00, // Default. + kEncryptionOnlyForPointToPointPackets = 0x01, + kEncryptionForBothPointToPointAndBroadcastPackets = 0x02 +}; + +typedef uint16_t BluetoothHCIAutomaticFlushTimeout; +typedef struct BluetoothHCIAutomaticFlushTimeoutInfo +{ + BluetoothConnectionHandle handle; + BluetoothHCIAutomaticFlushTimeout timeout; +} BluetoothHCIAutomaticFlushTimeoutInfo; + +enum +{ + kInfoStringMaxLength = 35 +}; + +typedef struct BluetoothTransportInfo +{ + uint32_t productID; + uint32_t vendorID; + uint32_t type; + char productName[kInfoStringMaxLength]; + char vendorName[kInfoStringMaxLength]; + + uint64_t totalDataBytesSent; + uint64_t totalSCOBytesSent; + uint64_t totalDataBytesReceived; + uint64_t totalSCOBytesReceived; +} BluetoothTransportInfo; +typedef BluetoothTransportInfo * BluetoothTransportInfoPtr; + +enum BluetoothTransportTypes +{ + kBluetoothTransportTypeUSB = 0x01, + kBluetoothTransportTypePCCard = 0x02, + kBluetoothTransportTypePCICard = 0x03, + kBluetoothTransportTypeUART = 0x04, + kBluetoothTransportTypePCIe = 0x05 +}; + +// Inquiries +typedef struct BluetoothHCIInquiryResult +{ + BluetoothDeviceAddress deviceAddress; + BluetoothPageScanRepetitionMode pageScanRepetitionMode; + BluetoothHCIPageScanPeriodMode pageScanPeriodMode; + BluetoothHCIPageScanMode pageScanMode; + BluetoothClassOfDevice classOfDevice; + BluetoothClockOffset clockOffset; +} BluetoothHCIInquiryResult; + +enum +{ + kBluetoothHCIInquiryResultsMaxResults = 50 +}; + +typedef struct BluetoothHCIInquiryResults +{ + BluetoothHCIInquiryResult results[kBluetoothHCIInquiryResultsMaxResults]; + IOItemCount count; +} BluetoothHCIInquiryResults; + +// Inquiries with RSSI (v1.2 specification) +typedef struct BluetoothHCIInquiryWithRSSIResult +{ + BluetoothDeviceAddress deviceAddress; + BluetoothPageScanRepetitionMode pageScanRepetitionMode; + uint8_t reserved; + BluetoothClassOfDevice classOfDevice; + BluetoothClockOffset clockOffset; + BluetoothHCIRSSIValue RSSIValue; +} BluetoothHCIInquiryWithRSSIResult; + +typedef struct BluetoothHCIInquiryWithRSSIResults +{ + BluetoothHCIInquiryWithRSSIResult results[kBluetoothHCIInquiryResultsMaxResults]; + IOItemCount count; +} BluetoothHCIInquiryWithRSSIResults; + +// Inquiries with 'Extended Inquiry Response' (v2.1 specification) +typedef uint8_t BluetoothHCIFECRequired; +enum BluetoothHCIFECRequiredValues +{ + kBluetoothHCIFECRequired = 0x00, + kBluetoothHCIFECNotRequired = 0x01 +}; + +typedef uint8_t BluetoothHCIInquiryMode; +enum BluetoothHCIInquiryModes +{ + kBluetoothHCIInquiryModeResultFormatStandard = 0x00, + kBluetoothHCIInquiryModeResultFormatWithRSSI = 0x01, + kBluetoothHCIInquiryModeResultFormatWithRSSIOrExtendedInquiryResultFormat = 0x02 +}; + +typedef uint8_t BluetoothHCIInquiryScanType; +enum BluetoothHCIInquiryScanTypes +{ + kBluetoothHCIInquiryScanTypeStandard = 0x00, + kBluetoothHCIInquiryScanTypeInterlaced = 0x01, + + kBluetoothHCIInquiryScanTypeReservedStart = 0x02, + kBluetoothHCIInquiryScanTypeReservedEnd = 0xFF +}; + +typedef uint8_t BluetoothHCIExtendedInquiryResponseDataType; +/* Extended Inquiry Response [EIR] data, consisting of a sequence of data structures in this format: [length(1byte)][data type(1byte)][data(e.g. device name)] */ +typedef struct BluetoothHCIExtendedInquiryResponse +{ + uint8_t data[240]; +} BluetoothHCIExtendedInquiryResponse; + +typedef struct BluetoothHCIReadExtendedInquiryResponseResults +{ + BluetoothHCIFECRequired outFECRequired; + BluetoothHCIExtendedInquiryResponse extendedInquiryResponse; +} BluetoothHCIReadExtendedInquiryResponseResults; + +typedef struct BluetoothHCIExtendedInquiryResult +{ + uint8_t numberOfReponses; /* always a value of 1 */ + BluetoothDeviceAddress deviceAddress; + BluetoothPageScanRepetitionMode pageScanRepetitionMode; + uint8_t reserved; + BluetoothClassOfDevice classOfDevice; + BluetoothClockOffset clockOffset; + BluetoothHCIRSSIValue RSSIValue; + BluetoothHCIExtendedInquiryResponse extendedInquiryResponse; +} BluetoothHCIExtendedInquiryResult; + +typedef struct BluetoothHCIReadLMPHandleResults +{ + BluetoothConnectionHandle handle; + BluetoothLMPHandle lmpHandle; + uint32_t reserved; +} BluetoothHCIReadLMPHandleResults; + +// 'Simple Pairing' (v2.1 specification) +typedef uint8_t BluetoothHCISimplePairingMode; +enum BluetoothHCISimplePairingModes +{ + kBluetoothHCISimplePairingModeNotSet = 0x00, + kBluetoothHCISimplePairingModeEnabled = 0x01 +}; + +typedef uint8_t BluetoothSimplePairingDebugMode; +enum BluetoothSimplePairingDebugModes +{ + kBluetoothHCISimplePairingDebugModeDisabled = 0x00, + kBluetoothHCISimplePairingDebugModeEnabled = 0x01 +}; + +typedef struct BluetoothHCISimplePairingOOBData +{ + uint8_t data[16]; +} BluetoothHCISimplePairingOOBData; + +typedef struct BluetoothHCIReadLocalOOBDataResults +{ + BluetoothHCISimplePairingOOBData hash; + BluetoothHCISimplePairingOOBData randomizer; +} BluetoothHCIReadLocalOOBDataResults; + +typedef uint8_t BluetoothIOCapability; +enum BluetoothIOCapabilities +{ + kBluetoothCapabilityTypeDisplayOnly = 0x00, + kBluetoothCapabilityTypeDisplayYesNo = 0x01, + kBluetoothCapabilityTypeKeyboardOnly = 0x02, + kBluetoothCapabilityTypeNoInputNoOutput = 0x03 +}; + +typedef uint8_t BluetoothOOBDataPresence; +enum BluetoothOOBDataPresenceValues +{ + kBluetoothOOBAuthenticationDataNotPresent = 0x00, + kBluetoothOOBAuthenticationDataFromRemoteDevicePresent = 0x01 +}; + +typedef uint8_t BluetoothAuthenticationRequirements; +enum BluetoothAuthenticationRequirementsValues +{ + kBluetoothAuthenticationRequirementsMITMProtectionNotRequired = 0x00, /* Numeric comparison with automatic accept allowed */ + kBluetoothAuthenticationRequirementsMITMProtectionRequired = 0x01, /* Refer to BluetoothIOCapabilities to determine authentication procedure */ + kBluetoothAuthenticationRequirementsMITMProtectionNotRequiredNoBonding = 0x00, + kBluetoothAuthenticationRequirementsMITMProtectionRequiredNoBonding = 0x01, + kBluetoothAuthenticationRequirementsMITMProtectionNotRequiredDedicatedBonding = 0x02, + kBluetoothAuthenticationRequirementsMITMProtectionRequiredDedicatedBonding = 0x03, + kBluetoothAuthenticationRequirementsMITMProtectionNotRequiredGeneralBonding = 0x04, + kBluetoothAuthenticationRequirementsMITMProtectionRequiredGeneralBonding = 0x05 +}; + +typedef struct BluetoothIOCapabilityResponse +{ + BluetoothDeviceAddress deviceAddress; + BluetoothIOCapability ioCapability; /* possible values from BluetoothIOCapabilities above */ + BluetoothOOBDataPresence OOBDataPresence; + BluetoothAuthenticationRequirements authenticationRequirements; +} BluetoothIOCapabilityResponse; + +typedef uint32_t BluetoothPasskey; +typedef struct BluetoothUserPasskeyNotification +{ + BluetoothDeviceAddress deviceAddress; + BluetoothPasskey passkey; /* passkey for display. valid values are 000000 - 999999 */ +} BluetoothUserPasskeyNotification; + +typedef uint8_t BluetoothKeypressNotificationType; +enum BluetoothKeypressNotificationTypes +{ + kBluetoothKeypressNotificationTypePasskeyEntryStarted = 0, + kBluetoothKeypressNotificationTypePasskeyDigitEntered = 1, + kBluetoothKeypressNotificationTypePasskeyDigitErased = 2, + kBluetoothKeypressNotificationTypePasskeyCleared = 3, + kBluetoothKeypressNotificationTypePasskeyEntryCompleted = 4 +}; + +typedef struct BluetoothKeypressNotification +{ + BluetoothDeviceAddress deviceAddress; + BluetoothKeypressNotificationType notificationType; +} BluetoothKeypressNotification; + +typedef struct BluetoothRemoteHostSupportedFeaturesNotification +{ + BluetoothDeviceAddress deviceAddress; + BluetoothHCISupportedFeatures hostSupportedFeatures; +} BluetoothRemoteHostSupportedFeaturesNotification; + +typedef SInt8 TransmissionPower; + +typedef struct BluetoothAFHHostChannelClassification +{ + uint8_t data[10]; /* 79 bits meaningful */ +} BluetoothAFHHostChannelClassification; + +typedef uint8_t BluetoothAFHMode; +typedef struct BluetoothAFHResults +{ + BluetoothConnectionHandle handle; + BluetoothAFHMode mode; + uint8_t afhMap[10]; +} BluetoothAFHResults; + +typedef uint32_t BluetoothNumericValue; + +typedef struct BluetoothUserConfirmationRequest +{ + BluetoothDeviceAddress deviceAddress; + BluetoothNumericValue numericValue; /* numeric value for display. valid values are 000000 - 999999 */ +} BluetoothUserConfirmationRequest; + +typedef struct BluetoothHCIEventSimplePairingCompleteResults +{ + BluetoothDeviceAddress deviceAddress; +} BluetoothHCIEventSimplePairingCompleteResults; + +// Packet Sizes +enum +{ + kBluetoothHCICommandPacketHeaderSize = 3, + kBluetoothHCICommandPacketMaxDataSize = 255, + kBluetoothHCIMaxCommandPacketSize = kBluetoothHCICommandPacketHeaderSize + kBluetoothHCICommandPacketMaxDataSize, + + kBluetoothHCIEventPacketHeaderSize = 2, + kBluetoothHCIEventPacketMaxDataSize = 255, + kBluetoothHCIMaxEventPacketSize = kBluetoothHCIEventPacketHeaderSize + kBluetoothHCIEventPacketMaxDataSize, + + kBluetoothHCIDataPacketHeaderSize = 4, + kBluetoothHCIDataPacketMaxDataSize = 65535, + kBluetoothHCIMaxDataPacketSize = kBluetoothHCIDataPacketHeaderSize + kBluetoothHCIDataPacketMaxDataSize +}; + +typedef struct BluetoothHCICommandPacket +{ + BluetoothHCICommandOpCode opCode; + UInt8 dataSize; + UInt8 data[ kBluetoothHCIMaxCommandPacketSize ]; +} BluetoothHCICommandPacket; + +typedef uint8_t BluetoothHCIEventCode; + +typedef struct BluetoothHCIEventPacketHeader +{ + BluetoothHCIEventCode eventCode; + UInt8 dataSize; +} BluetoothHCIEventPacketHeader; + +typedef uint8_t BluetoothLinkType; +enum BluetoothLinkTypes +{ + kBluetoothSCOConnection = 0, + kBluetoothACLConnection = 1, + kBluetoothESCOConnection = 2, + kBluetoothLinkTypeNone = 0xff +}; + +typedef uint16_t BluetoothHCIContentFormat; // 10 bits meaningful + +typedef uint16_t BluetoothHCIVoiceSetting; // 10 bits meaningful +enum +{ + // Input Coding + kBluetoothVoiceSettingInputCodingMask = 0x300, + kBluetoothVoiceSettingInputCodingLinearInputCoding = 0x000, + kBluetoothVoiceSettingInputCodingULawInputCoding = 0x100, + kBluetoothVoiceSettingInputCodingALawInputCoding = 0x200 +}; + +enum +{ + // Input Data Format + kBluetoothVoiceSettingInputDataFormatMask = 0x0C0, + kBluetoothVoiceSettingInputDataFormat1sComplement = 0x000, + kBluetoothVoiceSettingInputDataFormat2sComplement = 0x040, + kBluetoothVoiceSettingInputDataFormatSignMagnitude = 0x080, + kBluetoothVoiceSettingInputDataFormatUnsigned = 0x0C0 +}; + +enum +{ + // Input Sample Size + kBluetoothVoiceSettingInputSampleSizeMask = 0x020, + kBluetoothVoiceSettingInputSampleSize8Bit = 0x000, + kBluetoothVoiceSettingInputSampleSize16Bit = 0x020 +}; + +enum +{ + // Linear PCM Bit Position + kBluetoothVoiceSettingPCMBitPositionMask = 0x01C +}; + +enum +{ + // Air Coding Format + kBluetoothVoiceSettingAirCodingFormatMask = 0x003, + kBluetoothVoiceSettingAirCodingFormatCVSD = 0x000, + kBluetoothVoiceSettingAirCodingFormatULaw = 0x001, + kBluetoothVoiceSettingAirCodingFormatALaw = 0x002, + kBluetoothVoiceSettingAirCodingFormatTransparentData = 0x003 +}; + +typedef uint8_t BluetoothHCISupportedIAC; +typedef uint32_t BluetoothHCITransmitBandwidth; +typedef uint32_t BluetoothHCIReceiveBandwidth; +typedef uint64_t BluetoothHCITransmitCodingFormat; +typedef uint64_t BluetoothHCIReceiveCodingFormat; +typedef uint16_t BluetoothHCITransmitCodecFrameSize; +typedef uint16_t BluetoothHCIReceiveCodecFrameSize; +typedef uint32_t BluetoothHCIInputBandwidth; +typedef uint32_t BluetoothHCIOutputBandwidth; +typedef uint64_t BluetoothHCIInputCodingFormat; +typedef uint64_t BluetoothHCIOutputCodingFormat; +typedef uint16_t BluetoothHCIInputCodedDataSize; +typedef uint16_t BluetoothHCIOutputCodedDataSize; +typedef uint8_t BluetoothHCIInputPCMDataFormat; +typedef uint8_t BluetoothHCIOutputPCMDataFormat; +typedef uint8_t BluetoothHCIInputPCMSamplePayloadMSBPosition; +typedef uint8_t BluetoothHCIOutputPCMSamplePayloadMSBPosition; +typedef uint8_t BluetoothHCIInputDataPath; +typedef uint8_t BluetoothHCIOutputDataPath; +typedef uint8_t BluetoothHCIInputTransportUnitSize; +typedef uint8_t BluetoothHCIOutputTransportUnitSize; +typedef uint16_t BluetoothHCIMaxLatency; +typedef uint8_t BluetoothHCIRetransmissionEffort; +enum BluetoothHCIRetransmissionEffortTypes +{ + kHCIRetransmissionEffortTypeNone = 0x00, + kHCIRetransmissionEffortTypeAtLeastOneAndOptimizeForPower = 0x01, + kHCIRetransmissionEffortTypeAtLeastOneAndOptimizeLinkQuality = 0x02, + kHCIRetransmissionEffortTypeDontCare = 0xFF +}; + +// Setup Synchronous Packet types (Bluetooth 2.1 spec section 7.7.35 - Setup Synchronous Command Complete Event) +typedef uint8_t BluetoothAirMode; +enum +{ + kBluetoothAirModeULawLog = 0x00, + kBluetoothAirModeALawLog = 0x01, + kBluetoothAirModeCVSD = 0x02, + kBluetoothAirModeTransparentData = 0x03 +}; + +typedef struct BluetoothSynchronousConnectionInfo +{ + BluetoothHCITransmitBandwidth transmitBandWidth; + BluetoothHCIReceiveBandwidth receiveBandWidth; + BluetoothHCIMaxLatency maxLatency; + BluetoothHCIVoiceSetting voiceSetting; + BluetoothHCIRetransmissionEffort retransmissionEffort; + BluetoothPacketType packetType; +} BluetoothSynchronousConnectionInfo; + +typedef struct BluetoothEnhancedSynchronousConnectionInfo +{ + BluetoothHCITransmitBandwidth transmitBandWidth; + BluetoothHCIReceiveBandwidth receiveBandWidth; + BluetoothHCITransmitCodingFormat transmitCodingFormat; + BluetoothHCIReceiveCodingFormat receiveCodingFormat; + BluetoothHCITransmitCodecFrameSize transmitCodecFrameSize; + BluetoothHCIReceiveCodecFrameSize receiveCodecFrameSize; + BluetoothHCIInputBandwidth inputBandwidth; + BluetoothHCIOutputBandwidth outputBandwidth; + BluetoothHCIInputCodingFormat inputCodingFormat; + BluetoothHCIOutputCodingFormat outputCodingFormat; + BluetoothHCIInputCodedDataSize inputCodedDataSize; + BluetoothHCIOutputCodedDataSize outputCodedDataSize; + BluetoothHCIInputPCMDataFormat inputPCMDataFormat; + BluetoothHCIOutputPCMDataFormat outputPCMDataFormat; + BluetoothHCIInputPCMSamplePayloadMSBPosition inputPCMSampelPayloadMSBPosition; + BluetoothHCIOutputPCMSamplePayloadMSBPosition outputPCMSampelPayloadMSBPosition; + BluetoothHCIInputDataPath inputDataPath; + BluetoothHCIOutputDataPath outputDataPath; + BluetoothHCIInputTransportUnitSize inputTransportUnitSize; + BluetoothHCIOutputTransportUnitSize outputTransportUnitSize; + BluetoothHCIMaxLatency maxLatency; + BluetoothHCIVoiceSetting voiceSetting; + BluetoothHCIRetransmissionEffort retransmissionEffort; + BluetoothPacketType packetType; +} BluetoothEnhancedSynchronousConnectionInfo; + +typedef struct BluetoothHCIEventSynchronousConnectionCompleteResults +{ + BluetoothConnectionHandle connectionHandle; + BluetoothDeviceAddress deviceAddress; + BluetoothLinkType linkType; + uint8_t transmissionInterval; + uint8_t retransmissionWindow; + uint16_t receivePacketLength; + uint16_t transmitPacketLength; + BluetoothAirMode airMode; +} BluetoothHCIEventSynchronousConnectionCompleteResults; + +typedef struct BluetoothHCIEventSynchronousConnectionChangedResults +{ + BluetoothConnectionHandle connectionHandle; + uint8_t transmissionInterval; + uint8_t retransmissionWindow; + uint16_t receivePacketLength; + uint16_t transmitPacketLength; +} BluetoothHCIEventSynchronousConnectionChangedResults; + +typedef uint8_t BluetoothHCIStatus; +typedef uint8_t BluetoothHCIEventStatus; + +// Events +enum +{ + kBluetoothHCIEventInquiryComplete = 0x01, + kBluetoothHCIEventInquiryResult = 0x02, + kBluetoothHCIEventConnectionComplete = 0x03, + kBluetoothHCIEventConnectionRequest = 0x04, + kBluetoothHCIEventDisconnectionComplete = 0x05, + kBluetoothHCIEventAuthenticationComplete = 0x06, + kBluetoothHCIEventRemoteNameRequestComplete = 0x07, + kBluetoothHCIEventEncryptionChange = 0x08, + kBluetoothHCIEventChangeConnectionLinkKeyComplete = 0x09, + kBluetoothHCIEventMasterLinkKeyComplete = 0x0A, + kBluetoothHCIEventReadRemoteSupportedFeaturesComplete = 0x0B, + kBluetoothHCIEventReadRemoteVersionInformationComplete = 0x0C, + kBluetoothHCIEventQoSSetupComplete = 0x0D, + kBluetoothHCIEventCommandComplete = 0x0E, + kBluetoothHCIEventCommandStatus = 0x0F, + kBluetoothHCIEventHardwareError = 0x10, + kBluetoothHCIEventFlushOccurred = 0x11, + kBluetoothHCIEventRoleChange = 0x12, + kBluetoothHCIEventNumberOfCompletedPackets = 0x13, + kBluetoothHCIEventModeChange = 0x14, + kBluetoothHCIEventReturnLinkKeys = 0x15, + kBluetoothHCIEventPINCodeRequest = 0x16, + kBluetoothHCIEventLinkKeyRequest = 0x17, + kBluetoothHCIEventLinkKeyNotification = 0x18, + kBluetoothHCIEventLoopbackCommand = 0x19, + kBluetoothHCIEventDataBufferOverflow = 0x1A, + kBluetoothHCIEventMaxSlotsChange = 0x1B, + kBluetoothHCIEventReadClockOffsetComplete = 0x1C, + kBluetoothHCIEventConnectionPacketType = 0x1D, + kBluetoothHCIEventQoSViolation = 0x1E, + kBluetoothHCIEventPageScanModeChange = 0x1F, // DEPRECATED + kBluetoothHCIEventPageScanRepetitionModeChange = 0x20, + + // [v1.2] + + kBluetoothHCIEventFlowSpecificationComplete = 0x21, + kBluetoothHCIEventInquiryResultWithRSSI = 0x22, + kBluetoothHCIEventReadRemoteExtendedFeaturesComplete = 0x23, + kBluetoothHCIEventSynchronousConnectionComplete = 0x2C, + kBluetoothHCIEventSynchronousConnectionChanged = 0x2D, + + // [v2.1] + + kBluetoothHCIEventSniffSubrating = 0x2E, + kBluetoothHCIEventExtendedInquiryResult = 0x2F, + kBluetoothHCIEventEncryptionKeyRefreshComplete = 0x30, + kBluetoothHCIEventIOCapabilityRequest = 0x31, + kBluetoothHCIEventIOCapabilityResponse = 0x32, + kBluetoothHCIEventUserConfirmationRequest = 0x33, + kBluetoothHCIEventUserPasskeyRequest = 0x34, + kBluetoothHCIEventRemoteOOBDataRequest = 0x35, + kBluetoothHCIEventSimplePairingComplete = 0x36, + kBluetoothHCIEventLinkSupervisionTimeoutChanged = 0x38, + kBluetoothHCIEventEnhancedFlushComplete = 0x39, + kBluetoothHCIEventUserPasskeyNotification = 0x3B, + kBluetoothHCIEventKeypressNotification = 0x3C, + kBluetoothHCIEventRemoteHostSupportedFeaturesNotification = 0x3D, + + // [v4.0] (All LE Events come through this event, and the first following byte is the subevent + + kBluetoothHCIEventLEMetaEvent = 0x3E, + kBluetoothHCISubEventLEConnectionComplete = 0x01, + kBluetoothHCISubEventLEAdvertisingReport = 0x02, + kBluetoothHCISubEventLEConnectionUpdateComplete = 0x03, + kBluetoothHCISubEventLEReadRemoteUsedFeaturesComplete = 0x04, + kBluetoothHCISubEventLELongTermKeyRequest = 0x05, + kBluetoothHCISubEventLERemoteConnectionParameterRequest = 0x06, + kBluetoothHCISubEventLEDataLengthChange = 0x07, + kBluetoothHCISubEventLEReadLocalP256PublicKeyComplete = 0x08, + kBluetoothHCISubEventLEGenerateDHKeyComplete = 0x09, + kBluetoothHCISubEventLEEnhancedConnectionComplete = 0x0A, + kBluetoothHCISubEventLEDirectAdvertisingReport = 0x0B, + kBluetoothHCISubEventLEPhyUpdateComplete = 0x0C, + kBluetoothHCISubEventLEExtendedAdvertising = 0x0D, + kBluetoothHCISubEventLEPeriodicAdvertisingSyncEstablished = 0x0E, + kBluetoothHCISubEventLEPeriodicAdvertisingReport = 0x0F, + kBluetoothHCISubEventLEPeriodicAdvertisingSyncLost = 0x10, + kBluetoothHCISubEventLEScanTimeout = 0x11, + kBluetoothHCISubEventLEAdvertisingSetTerminated = 0x12, + kBluetoothHCISubEventLEScanRequestReceived = 0x13, + kBluetoothHCISubEventLEChannelSelectionAlgorithm = 0x14, + + // [v3.0] + kBluetoothHCIEventPhysicalLinkComplete = 0x40, + kBluetoothHCIEventChannelSelected = 0x41, + kBluetoothHCIEventDisconnectionPhysicalLinkComplete = 0x42, + kBluetoothHCIEventPhysicalLinkLossEarlyWarning = 0x43, + kBluetoothHCIEventPhysicalLinkRecovery = 0x44, + kBluetoothHCIEventLogicalLinkComplete = 0x45, + kBluetoothHCIEventDisconnectionLogicalLinkComplete = 0x46, + kBluetoothHCIEventFlowSpecModifyComplete = 0x47, + kBluetoothHCIEventNumberOfCompletedDataBlocks = 0x48, + kBluetoothHCIEventShortRangeModeChangeComplete = 0x4C, + kBluetoothHCIEventAMPStatusChange = 0x4D, + kBluetoothHCIEventAMPStartTest = 0x49, + kBluetoothHCIEventAMPTestEnd = 0x4A, + kBluetoothHCIEventAMPReceiverReport = 0x4B, + + kBluetoothHCIEventLogoTesting = 0xFE, + kBluetoothHCIEventVendorSpecific = 0xFF +}; + +// HCI Event Masks + +// Event masks are 8 octets according to the spec. v2.1 introduces some event masks that +// actually exceed 32 bits so the 4 byte enum we had before Bluetooth 2.0 will still work for old +// the masks, but the new masks need to be defined as 64 bits. + +typedef uint64_t BluetoothHCIEventMask; + +enum +{ + kBluetoothHCIEventMaskLEDefault64Bit = 0x000000000000001FLL, + kBluetoothHCIEventMaskDefault64Bit = 0x00001FFFFFFFFFFFLL, + kBluetoothHCIEventMaskAll64Bit = 0xFFFFFFFFFFFFFFFFLL, + + // [v1.2] + kBluetoothHCIEventMaskFlowSpecificationCompleteEvent = 0x0000000100000000LL, + kBluetoothHCIEventMaskInquiryResultWithRSSIEvent = 0x0000000200000000LL, + kBluetoothHCIEventMaskReadRemoteExtendedFeaturesCompleteEvent = 0x0000000400000000LL, + kBluetoothHCIEventMaskSynchronousConnectionCompleteEvent = 0x0000080000000000LL, + kBluetoothHCIEventMaskSynchronousConnectionChangedEvent = 0x0000100000000000LL, + + // [v2.1] + kBluetoothHCIEventMaskSniffSubratingEvent = 0x0000200000000000LL, + kBluetoothHCIEventMaskExtendedInquiryResultEvent = 0x0000400000000000LL, + kBluetoothHCIEventMaskEncryptionChangeEvent = 0x0000000000000080LL, + kBluetoothHCIEventMaskEncryptionKeyRefreshCompleteEvent = 0x0000800000000000LL, + kBluetoothHCIEventMaskLinkSupervisionTimeoutChangedEvent = 0x0080000000000000LL, + kBluetoothHCIEventMaskEnhancedFlushCompleteEvent = 0x0100000000000000LL, + + // [v2.1 Secure Simple Pairing] + kBluetoothHCIEventMaskIOCapabilityRequestEvent = 0x0001000000000000LL, + kBluetoothHCIEventMaskIOCapabilityRequestReplyEvent = 0x0002000000000000LL, + kBluetoothHCIEventMaskUserConfirmationRequestEvent = 0x0004000000000000LL, + kBluetoothHCIEventMaskUserPasskeyRequestEvent = 0x0008000000000000LL, + kBluetoothHCIEventMaskRemoteOOBDataRequestEvent = 0x0010000000000000LL, + kBluetoothHCIEventMaskSimplePairingCompleteEvent = 0x0020000000000000LL, + kBluetoothHCIEvnetMaskLinkSupervisionTimeoutChangedEvent = 0x0080000000000000LL, + kBluetoothHCIEvnetMaskEnhancedFlushCompleteEvent = 0x0100000000000000LL, + kBluetoothHCIEventMaskUserPasskeyNotificationEvent = 0x0400000000000000LL, + kBluetoothHCIEventMaskKeypressNotificationEvent = 0x0800000000000000LL, + kBluetoothHCIEventMaskRemoteHostSupportedFeaturesNotificationEvent = 0x1000000000000000LL, + kBluetoothHCIEventMaskLEMetaEvent = 0x2000000000000000LL, + + kBluetoothHCIEventMaskNone = 0x00000000, + kBluetoothHCIEventMaskInquiryComplete = 0x00000001, + kBluetoothHCIEventMaskInquiryResult = 0x00000002, + kBluetoothHCIEventMaskConnectionComplete = 0x00000004, + kBluetoothHCIEventMaskConnectionRequest = 0x00000008, + kBluetoothHCIEventMaskDisconnectionComplete = 0x00000010, + kBluetoothHCIEventMaskAuthenticationComplete = 0x00000020, + kBluetoothHCIEventMaskRemoteNameRequestComplete = 0x00000040, + kBluetoothHCIEventMaskEncryptionChange = 0x00000080, + kBluetoothHCIEventMaskChangeConnectionLinkKeyComplete = 0x00000100, + kBluetoothHCIEventMaskMasterLinkKeyComplete = 0x00000200, + kBluetoothHCIEventMaskReadRemoteSupportedFeaturesComplete = 0x00000400, + kBluetoothHCIEventMaskReadRemoteVersionInformationComplete = 0x00000800, + kBluetoothHCIEventMaskQoSSetupComplete = 0x00001000, + kBluetoothHCIEventMaskCommandComplete = 0x00002000, + kBluetoothHCIEventMaskCommandStatus = 0x00004000, + kBluetoothHCIEventMaskHardwareError = 0x00008000, + kBluetoothHCIEventMaskFlushOccurred = 0x00010000, + kBluetoothHCIEventMaskRoleChange = 0x00020000, + + kBluetoothHCIEventMaskNumberOfCompletedPackets = 0x00040000, + kBluetoothHCIEventMaskModeChange = 0x00080000, + kBluetoothHCIEventMaskReturnLinkKeys = 0x00100000, + kBluetoothHCIEventMaskPINCodeRequest = 0x00200000, + kBluetoothHCIEventMaskLinkKeyRequest = 0x00400000, + kBluetoothHCIEventMaskLinkKeyNotification = 0x00800000, + kBluetoothHCIEventMaskLoopbackCommand = 0x01000000, + kBluetoothHCIEventMaskDataBufferOverflow = 0x02000000, + kBluetoothHCIEventMaskMaxSlotsChange = 0x04000000, + kBluetoothHCIEventMaskReadClockOffsetComplete = 0x08000000, + kBluetoothHCIEventMaskConnectionPacketTypeChanged = 0x10000000, + kBluetoothHCIEventMaskQoSViolation = 0x20000000, + kBluetoothHCIEventMaskPageScanModeChange = 0x40000000, + kBluetoothHCIEventMaskPageScanRepetitionModeChange = 0x80000000, + + kBluetoothHCIEventMaskAll = 0xFFFFFFFF, + kBluetoothHCIEventMaskDefault = kBluetoothHCIEventMaskAll /* Use kBluetoothHCIEventMaskDefault64Bit above! */ +}; + +// Event results structures. +typedef struct BluetoothHCIEventCommandCompleteResults +{ + uint8_t numCommands; + BluetoothHCICommandOpCode opCode; +} __attribute__((packed)) BluetoothHCIEventCommandCompleteResults; + +typedef struct BluetoothHCIEventConnectionCompleteResults +{ + BluetoothConnectionHandle connectionHandle; + BluetoothDeviceAddress deviceAddress; + BluetoothLinkType linkType; + BluetoothHCIEncryptionMode encryptionMode; +} BluetoothHCIEventConnectionCompleteResults; + +typedef struct BluetoothHCIEventLEConnectionCompleteResults +{ + BluetoothConnectionHandle connectionHandle; + uint8_t role; + uint8_t peerAddressType; + BluetoothDeviceAddress peerAddress; + uint16_t connInterval; + uint16_t connLatency; + uint16_t supervisionTimeout; + uint8_t masterClockAccuracy; +} __attribute__((packed)) BluetoothHCIEventLEConnectionCompleteResults; + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 +typedef struct BluetoothHCIEventLEEnhancedConnectionCompleteResults +{ + BluetoothConnectionHandle connectionHandle; + uint8_t role; + uint8_t peerAddressType; + BluetoothDeviceAddress peerAddress; + BluetoothDeviceAddress localResolvablePrivateAddress; + BluetoothDeviceAddress peerResolvablePrivateAddress; + uint16_t connInterval; + uint16_t connLatency; + uint16_t supervisionTimeout; + uint8_t masterClockAccuracy; +} __attribute__((packed)) BluetoothHCIEventLEEnhancedConnectionCompleteResults; +#endif + +typedef struct BluetoothHCIEventLEConnectionUpdateCompleteResults +{ + BluetoothConnectionHandle connectionHandle; + uint16_t connInterval; + uint16_t connLatency; + uint16_t supervisionTimeout; +} __attribute__((packed)) BluetoothHCIEventLEConnectionUpdateCompleteResults; + +typedef struct BluetoothHCIEventLEReadRemoteUsedFeaturesCompleteResults +{ + BluetoothConnectionHandle connectionHandle; + BluetoothHCISupportedFeatures usedFeatures; +} BluetoothHCIEventLEReadRemoteUsedFeaturesCompleteResults; + +typedef struct BluetoothHCIEventDisconnectionCompleteResults +{ + BluetoothConnectionHandle connectionHandle; + BluetoothReasonCode reason; +} BluetoothHCIEventDisconnectionCompleteResults; + +typedef struct BluetoothHCIEventReadSupportedFeaturesResults +{ + BluetoothConnectionHandle connectionHandle; + BluetoothHCISupportedFeatures supportedFeatures; +} BluetoothHCIEventReadSupportedFeaturesResults; + +typedef struct BluetoothHCIEventReadExtendedFeaturesResults +{ + BluetoothConnectionHandle connectionHandle; + BluetoothHCIExtendedFeaturesInfo supportedFeaturesInfo; +} BluetoothHCIEventReadExtendedFeaturesResults; + +typedef struct BluetoothHCIEventReadRemoteVersionInfoResults +{ + BluetoothConnectionHandle connectionHandle; + BluetoothLMPVersion lmpVersion; + BluetoothManufacturerName manufacturerName; + BluetoothLMPSubversion lmpSubversion; +} BluetoothHCIEventReadRemoteVersionInfoResults; + +typedef struct BluetoothHCIEventRemoteNameRequestResults +{ + BluetoothDeviceAddress deviceAddress; + BluetoothDeviceName deviceName; +} BluetoothHCIEventRemoteNameRequestResults; + +typedef struct BluetoothHCIEventReadClockOffsetResults +{ + BluetoothConnectionHandle connectionHandle; + BluetoothClockOffset clockOffset; +} BluetoothHCIEventReadClockOffsetResults; + +typedef struct BluetoothHCIEventConnectionRequestResults +{ + BluetoothDeviceAddress deviceAddress; + BluetoothClassOfDevice classOfDevice; + BluetoothLinkType linkType; +} BluetoothHCIEventConnectionRequestResults; + +typedef struct BluetoothHCIEventLinkKeyNotificationResults +{ + BluetoothDeviceAddress deviceAddress; + BluetoothKey linkKey; + BluetoothKeyType keyType; +} BluetoothHCIEventLinkKeyNotificationResults; + +typedef struct BluetoothHCIEventMaxSlotsChangeResults +{ + BluetoothConnectionHandle connectionHandle; + BluetoothMaxSlots maxSlots; +} BluetoothHCIEventMaxSlotsChangeResults; + +typedef struct BluetoothHCIEventModeChangeResults +{ + BluetoothConnectionHandle connectionHandle; + BluetoothHCIConnectionMode mode; + BluetoothHCIModeInterval modeInterval; +} BluetoothHCIEventModeChangeResults; + +typedef struct BluetoothHCIEventReturnLinkKeysResults +{ + uint8_t numLinkKeys; + struct + { + BluetoothDeviceAddress deviceAddress; + BluetoothKey linkKey; + } linkKeys[1]; +} BluetoothHCIEventReturnLinkKeysResults; + +typedef struct BluetoothHCIEventAuthenticationCompleteResults +{ + BluetoothConnectionHandle connectionHandle; +} BluetoothHCIEventAuthenticationCompleteResults; + +typedef struct BluetoothHCIEventEncryptionChangeResults +{ + BluetoothConnectionHandle connectionHandle; + BluetoothEncryptionEnable enable; +} BluetoothHCIEventEncryptionChangeResults; + +typedef struct BluetoothHCIEventChangeConnectionLinkKeyCompleteResults +{ + BluetoothConnectionHandle connectionHandle; +} BluetoothHCIEventChangeConnectionLinkKeyCompleteResults; + +typedef struct BluetoothHCIEventMasterLinkKeyCompleteResults +{ + BluetoothConnectionHandle connectionHandle; + BluetoothKeyFlag keyFlag; +} BluetoothHCIEventMasterLinkKeyCompleteResults; + +typedef struct BluetoothHCIEventQoSSetupCompleteResults +{ + BluetoothConnectionHandle connectionHandle; + BluetoothHCIQualityOfServiceSetupParams setupParams; +} BluetoothHCIEventQoSSetupCompleteResults; + +typedef struct BluetoothHCIEventHardwareErrorResults +{ + BluetoothHCIStatus error; +} BluetoothHCIEventHardwareErrorResults; + +typedef struct BluetoothHCIEventFlushOccurredResults +{ + BluetoothConnectionHandle connectionHandle; +} BluetoothHCIEventFlushOccurredResults; + +typedef struct BluetoothHCIEventRoleChangeResults +{ + BluetoothConnectionHandle connectionHandle; + BluetoothDeviceAddress deviceAddress; + BluetoothRole role; +} BluetoothHCIEventRoleChangeResults; + +typedef struct BluetoothHCIEventDataBufferOverflowResults +{ + BluetoothLinkType linkType; +} BluetoothHCIEventDataBufferOverflowResults; + +typedef struct BluetoothHCIEventConnectionPacketTypeResults +{ + BluetoothConnectionHandle connectionHandle; + BluetoothPacketType packetType; +} BluetoothHCIEventConnectionPacketTypeResults; + +typedef struct BluetoothHCIEventReadRemoteSupportedFeaturesResults +{ + BluetoothHCIStatus error; + BluetoothConnectionHandle connectionHandle; + BluetoothHCISupportedFeatures lmpFeatures; +} BluetoothHCIEventReadRemoteSupportedFeaturesResults; + +typedef struct BluetoothHCIEventReadRemoteExtendedFeaturesResults +{ + BluetoothHCIStatus error; + BluetoothConnectionHandle connectionHandle; + BluetoothHCIPageNumber page; + BluetoothHCIPageNumber maxPage; + BluetoothHCISupportedFeatures lmpFeatures; +} BluetoothHCIEventReadRemoteExtendedFeaturesResults; + +typedef struct BluetoothHCIEventQoSViolationResults +{ + BluetoothConnectionHandle connectionHandle; +} BluetoothHCIEventQoSViolationResults; + +typedef struct BluetoothHCIEventPageScanModeChangeResults +{ + BluetoothDeviceAddress deviceAddress; + BluetoothPageScanMode pageScanMode; +} BluetoothHCIEventPageScanModeChangeResults; + +typedef struct BluetoothHCIEventPageScanRepetitionModeChangeResults +{ + BluetoothDeviceAddress deviceAddress; + BluetoothPageScanRepetitionMode pageScanRepetitionMode; +} BluetoothHCIEventPageScanRepetitionModeChangeResults; + +typedef struct BluetoothHCIEventVendorSpecificResults +{ + uint8_t length; + uint8_t data[255]; +} BluetoothHCIEventVendorSpecificResults; + +typedef struct BluetoothHCIEventEncryptionKeyRefreshCompleteResults +{ + BluetoothConnectionHandle connectionHandle; +} BluetoothHCIEventEncryptionKeyRefreshCompleteResults; + +typedef struct BluetoothHCIEventSniffSubratingResults +{ + BluetoothConnectionHandle connectionHandle; + uint16_t maxTransmitLatency; + uint16_t maxReceiveLatency; + uint16_t minRemoteTimeout; + uint16_t minLocalTimeout; +} BluetoothHCIEventSniffSubratingResults; + +// LE Meta Events +typedef struct BluetoothHCIEventLEMetaResults +{ + uint8_t length; + uint8_t data[255]; +} BluetoothHCIEventLEMetaResults; + +typedef struct BluetoothHCIEventLELongTermKeyRequestResults +{ + BluetoothConnectionHandle connectionHandle; + uint8_t randomNumber[8]; + uint16_t ediv; +} BluetoothHCIEventLELongTermKeyRequestResults; + +#define kNoNotifyProc NULL +#define kNoUserRefCon NULL + +typedef struct BluetoothHCIRequestCallbackInfo +{ + mach_vm_address_t userCallback; // Proc to call when async handler is called. + mach_vm_address_t userRefCon; // For user's info. + mach_vm_address_t internalRefCon; // For our purposes. + mach_vm_address_t asyncIDRefCon; // For our aync calls. + mach_vm_address_t reserved; // For the future. Currently Unused. +} BluetoothHCIRequestCallbackInfo; + +// Error codes + +enum +{ + kBluetoothHCIErrorSuccess = 0x00, + kBluetoothHCIErrorUnknownHCICommand = 0x01, + kBluetoothHCIErrorNoConnection = 0x02, + kBluetoothHCIErrorHardwareFailure = 0x03, + kBluetoothHCIErrorPageTimeout = 0x04, + kBluetoothHCIErrorAuthenticationFailure = 0x05, + kBluetoothHCIErrorKeyMissing = 0x06, + kBluetoothHCIErrorMemoryFull = 0x07, + kBluetoothHCIErrorConnectionTimeout = 0x08, + kBluetoothHCIErrorMaxNumberOfConnections = 0x09, + kBluetoothHCIErrorMaxNumberOfSCOConnectionsToADevice = 0x0A, + kBluetoothHCIErrorACLConnectionAlreadyExists = 0x0B, + kBluetoothHCIErrorCommandDisallowed = 0x0C, + kBluetoothHCIErrorHostRejectedLimitedResources = 0x0D, + kBluetoothHCIErrorHostRejectedSecurityReasons = 0x0E, + kBluetoothHCIErrorHostRejectedRemoteDeviceIsPersonal = 0x0F, + kBluetoothHCIErrorHostTimeout = 0x10, + kBluetoothHCIErrorUnsupportedFeatureOrParameterValue = 0x11, + kBluetoothHCIErrorInvalidHCICommandParameters = 0x12, + kBluetoothHCIErrorOtherEndTerminatedConnectionUserEnded = 0x13, + kBluetoothHCIErrorOtherEndTerminatedConnectionLowResources = 0x14, + kBluetoothHCIErrorOtherEndTerminatedConnectionAboutToPowerOff = 0x15, + kBluetoothHCIErrorConnectionTerminatedByLocalHost = 0x16, + kBluetoothHCIErrorRepeatedAttempts = 0x17, + kBluetoothHCIErrorPairingNotAllowed = 0x18, + kBluetoothHCIErrorUnknownLMPPDU = 0x19, + kBluetoothHCIErrorUnsupportedRemoteFeature = 0x1A, + kBluetoothHCIErrorSCOOffsetRejected = 0x1B, + kBluetoothHCIErrorSCOIntervalRejected = 0x1C, + kBluetoothHCIErrorSCOAirModeRejected = 0x1D, + kBluetoothHCIErrorInvalidLMPParameters = 0x1E, + kBluetoothHCIErrorUnspecifiedError = 0x1F, + kBluetoothHCIErrorUnsupportedLMPParameterValue = 0x20, + kBluetoothHCIErrorRoleChangeNotAllowed = 0x21, + kBluetoothHCIErrorLMPResponseTimeout = 0x22, + kBluetoothHCIErrorLMPErrorTransactionCollision = 0x23, + kBluetoothHCIErrorLMPPDUNotAllowed = 0x24, + kBluetoothHCIErrorEncryptionModeNotAcceptable = 0x25, // Added Core Spec, v1.1 + kBluetoothHCIErrorUnitKeyUsed = 0x26, // 1.1 + kBluetoothHCIErrorQoSNotSupported = 0x27, // 1.1 + kBluetoothHCIErrorInstantPassed = 0x28, // 1.1 + kBluetoothHCIErrorPairingWithUnitKeyNotSupported = 0x29, // 1.1 + kBluetoothHCIErrorHostRejectedUnacceptableDeviceAddress = 0x0F, // 2.0+ + kBluetoothHCIErrorDifferentTransactionCollision = 0x2A, // 1.2 + kBluetoothHCIErrorQoSUnacceptableParameter = 0x2C, // 1.2 + kBluetoothHCIErrorQoSRejected = 0x2D, // 1.2 + kBluetoothHCIErrorChannelClassificationNotSupported = 0x2E, // 1.2 + kBluetoothHCIErrorInsufficientSecurity = 0x2F, // 1.2 + kBluetoothHCIErrorParameterOutOfMandatoryRange = 0x30, // 1.2 + kBluetoothHCIErrorRoleSwitchPending = 0x31, // 1.2 + kBluetoothHCIErrorReservedSlotViolation = 0x34, // 1.2 + kBluetoothHCIErrorRoleSwitchFailed = 0x35, // 1.2 + kBluetoothHCIErrorExtendedInquiryResponseTooLarge = 0x36, // 2.1 + kBluetoothHCIErrorSecureSimplePairingNotSupportedByHost = 0x37, // 2.1 + kBluetoothHCIErrorHostBusyPairing = 0x38, + kBluetoothHCIErrorConnectionRejectedDueToNoSuitableChannelFound = 0x39, + kBluetoothHCIErrorControllerBusy = 0x3A, + kBluetoothHCIErrorUnacceptableConnectionInterval = 0x3B, + kBluetoothHCIErrorDirectedAdvertisingTimeout = 0x3C, + kBluetoothHCIErrorConnectionTerminatedDueToMICFailure = 0x3D, + kBluetoothHCIErrorConnectionFailedToBeEstablished = 0x3E, + kBluetoothHCIErrorMACConnectionFailed = 0x3F, + kBluetoothHCIErrorCoarseClockAdjustmentRejected = 0x40, + kBluetoothHCIErrorType0SubmapNotDefined = 0x41, + kBluetoothHCIErrorUnknownAdvertisingIdentifier = 0x42, + kBluetoothHCIErrorLimitReached = 0x43, + kBluetoothHCIErrorOperationCancelledByHost = 0x44, + kBluetoothHCIErrorPacketTooLong = 0x45, + + kBluetoothHCIErrorMax = 0x45 +}; + +enum +{ + kBluetoothSyncHCIRequestTimedOutAfterSent = 0xFF01, + kBluetoothSyncHCIRequestTimedOutWaitingToBeSent = 0xFF02, + kBluetoothControllerTransportInactive = 0xFF03, + kBluetoothControllerTransportSuspended = 0xFF04 +}; + +#if 0 +#pragma mark === HCI Power Mode === +#endif + +//=========================================================================================================================== +// HCI Power Mode +//=========================================================================================================================== + +typedef enum +{ + kBluetoothHCIPowerStateON = 0x01, + kBluetoothHCIPowerStateOFF = 0x00, + kBluetoothHCIPowerStateUnintialized = 0xFF +} BluetoothHCIPowerState; + +enum +{ + kBluetoothHCIErrorPowerIsOFF = (kBluetoothHCIErrorMax + 1) +}; + +#if 0 +#pragma mark === HCI USB Transport === +#endif + +//=========================================================================================================================== +// HCI USB Transport +//=========================================================================================================================== + +//--------------------------------------------------------------------------------------------------------------------------- +/*! @enum BluetoothHCIUSBDeviceMatchingConstants + @abstract Bluetooth USB device matching constants + @constant kBluetoothHCITransportUSBClassCode Wireless Controller + @constant kBluetoothHCITransportUSBSubClassCode RF Controller + @constant kBluetoothHCITransportUSBProtocolCode Bluetooth Programming +*/ + +enum +{ + kBluetoothHCITransportUSBClassCode = 0xE0, + kBluetoothHCITransportUSBSubClassCode = 0x01, + kBluetoothHCITransportUSBProtocolCode = 0x01 +}; + +#if 0 +#pragma mark === TCI - L2CAP === +#endif + +//=========================================================================================================================== +// TCI - L2CAP +//=========================================================================================================================== + +enum +{ + kBluetoothL2CAPTCIEventIDReserved = 0x00, + kBluetoothL2CAPTCIEventIDL2CA_ConnectInd = 0x01, + kBluetoothL2CAPTCIEventIDL2CA_ConfigInd = 0x02, + kBluetoothL2CAPTCIEventIDL2CA_DisconnectInd = 0x03, + kBluetoothL2CAPTCIEventIDL2CA_QoSViolationInd = 0x04, + kBluetoothL2CAPTCIEventIDL2CA_TimeOutInd = 0x05 +}; + +enum +{ + kBluetoothL2CAPTCICommandReserved = 0x0000, + kBluetoothL2CAPTCICommandL2CA_ConnectReq = 0x0001, + kBluetoothL2CAPTCICommandL2CA_DisconnectReq = 0x0002, + kBluetoothL2CAPTCICommandL2CA_ConfigReq = 0x0003, + kBluetoothL2CAPTCICommandL2CA_DisableCLT = 0x0004, + kBluetoothL2CAPTCICommandL2CA_EnableCLT = 0x0005, + kBluetoothL2CAPTCICommandL2CA_GroupCreate = 0x0006, + kBluetoothL2CAPTCICommandL2CA_GroupClose = 0x0007, + kBluetoothL2CAPTCICommandL2CA_GroupAddMember = 0x0008, + kBluetoothL2CAPTCICommandL2CA_GroupRemoveMember = 0x0009, + kBluetoothL2CAPTCICommandL2CA_GroupMembership = 0x000A, + kBluetoothL2CAPTCICommandL2CA_WriteData = 0x000B, + kBluetoothL2CAPTCICommandL2CA_ReadData = 0x000C, + kBluetoothL2CAPTCICommandL2CA_Ping = 0x000D, + kBluetoothL2CAPTCICommandL2CA_GetInfo = 0x000E, + kBluetoothL2CAPTCICommandL2CA_Reserved1 = 0x000F, + kBluetoothL2CAPTCICommandL2CA_Reserved2 = 0x0010, + kBluetoothL2CAPTCICommandL2CA_ConnectResp = 0x0011, + kBluetoothL2CAPTCICommandL2CA_DisconnectResp = 0x0012, + kBluetoothL2CAPTCICommandL2CA_ConfigResp = 0x0013 +}; + +#if 0 +#pragma mark - +#pragma mark === RFCOMM === +#endif + +//=========================================================================================================================== +// RFCOMM +//=========================================================================================================================== +#define kMaxChannelIDPerSide 31 + +typedef uint8_t BluetoothRFCOMMChannelID; + +#define RFCOMM_CHANNEL_ID_IS_VALID(CHANNEL) ((CHANNEL >= 1) && (CHANNEL <= 30)) + +typedef uint16_t BluetoothRFCOMMMTU; + +typedef enum BluetoothRFCOMMParityType +{ + kBluetoothRFCOMMParityTypeNoParity = 0, + kBluetoothRFCOMMParityTypeOddParity, + kBluetoothRFCOMMParityTypeEvenParity, + kBluetoothRFCOMMParityTypeMaxParity +} BluetoothRFCOMMParityType; + +typedef enum BluetoothRFCOMMLineStatus +{ + BluetoothRFCOMMLineStatusNoError = 0, + BluetoothRFCOMMLineStatusOverrunError, + BluetoothRFCOMMLineStatusParityError, + BluetoothRFCOMMLineStatusFramingError +} BluetoothRFCOMMLineStatus; + +#if 0 +#pragma mark - +#pragma mark === SDP === +#endif + +//=========================================================================================================================== +// SDP +//=========================================================================================================================== + +typedef uint8_t BluetoothSDPPDUID; +enum +{ + kBluetoothSDPPDUIDReserved = 0, + kBluetoothSDPPDUIDErrorResponse, + kBluetoothSDPPDUIDServiceSearchRequest, + kBluetoothSDPPDUIDServiceSearchResponse, + kBluetoothSDPPDUIDServiceAttributeRequest, + kBluetoothSDPPDUIDServiceAttributeResponse, + kBluetoothSDPPDUIDServiceSearchAttributeRequest, + kBluetoothSDPPDUIDServiceSearchAttributeResponse +}; + +#define IS_REQUEST_PDU(_pduID) \ + ((_pduID == kBluetoothSDPPDUIDServiceSearchRequest) || (_pduID == kBluetoothSDPPDUIDServiceAttributeRequest) || (_pduID == kBluetoothSDPPDUIDServiceSearchAttributeRequest)) + +#define IS_RESPONSE_PDU(_pduID) \ + ((_pduID == kBluetoothSDPPDUIDErrorResponse) || (_pduID == kBluetoothSDPPDUIDServiceSearchResponse) || (_pduID == kBluetoothSDPPDUIDServiceAttributeResponse) \ + || (_pduID == kBluetoothSDPPDUIDServiceSearchAttributeResponse)) + +typedef uint16_t BluetoothSDPErrorCode; +enum +{ + kBluetoothSDPErrorCodeSuccess = 0x0000, + kBluetoothSDPErrorCodeReserved = 0x0000, + kBluetoothSDPErrorCodeInvalidSDPVersion = 0x0001, + kBluetoothSDPErrorCodeInvalidServiceRecordHandle = 0x0002, + kBluetoothSDPErrorCodeInvalidRequestSyntax = 0x0003, + kBluetoothSDPErrorCodeInvalidPDUSize = 0x0004, + kBluetoothSDPErrorCodeInvalidContinuationState = 0x0005, + kBluetoothSDPErrorCodeInsufficientResources = 0x0006, + + kBluetoothSDPErrorCodeReservedStart = 0x0007, + kBluetoothSDPErrorCodeReservedEnd = 0xFFFF +}; + +typedef uint16_t BluetoothSDPTransactionID; + +typedef uint32_t BluetoothSDPServiceRecordHandle; + +enum +{ + kBluetoothSDPDataElementTypeNil = 0, + kBluetoothSDPDataElementTypeUnsignedInt = 1, + kBluetoothSDPDataElementTypeSignedInt = 2, + kBluetoothSDPDataElementTypeUUID = 3, + kBluetoothSDPDataElementTypeString = 4, + kBluetoothSDPDataElementTypeBoolean = 5, + kBluetoothSDPDataElementTypeDataElementSequence = 6, + kBluetoothSDPDataElementTypeDataElementAlternative = 7, + kBluetoothSDPDataElementTypeURL = 8, + kBluetoothSDPDataElementTypeReservedStart = 9, + kBluetoothSDPDataElementTypeReservedEnd = 31 +}; + +typedef uint16_t BluetoothSDPUUID16; +typedef uint32_t BluetoothSDPUUID32; + +typedef uint8_t BluetoothSDPDataElementTypeDescriptor; +typedef uint8_t BluetoothSDPDataElementSizeDescriptor; + +typedef uint16_t BluetoothSDPServiceAttributeID; + +#if 0 +#pragma mark - +#pragma mark === LE === +#endif + +typedef enum +{ + BluetoothLEScanTypePassive = 0x00, + BluetoothLEScanTypeActive = 0x01 +} BluetoothLEScanType; + +typedef enum +{ + BluetoothLEAddressTypePublic = 0x00, + BluetoothLEAddressTypeRandom = 0x01 +} BluetoothLEAddressType; + +typedef enum +{ + BluetoothLEScanFilterNone = 0x00, + BluetoothLEScanFilterWhitelist = 0x01 +} BluetoothLEScanFilter; + +typedef enum +{ + BluetoothLEScanDisable = 0x00, + BluetoothLEScanEnable = 0x01 +} BluetoothLEScan; + +typedef enum +{ + BluetoothLEConnectionIntervalMin = 0x06, + BluetoothLEConnectionIntervalMax = 0x0C80 +} BluetoothLEConnectionInterval; + +typedef enum +{ + BluetoothLEScanDuplicateFilterDisable = 0x00, + BluetoothLEScanDuplicateFilterEnable = 0x01 +} BluetoothLEScanDuplicateFilter; + +typedef enum +{ + BluetoothLEAdvertisingTypeConnectableUndirected = 0x00, + BluetoothLEAdvertisingTypeConnectableDirected = 0x01, + BluetoothLEAdvertisingTypeDiscoverableUndirected = 0x02, + BluetoothLEAdvertisingTypeNonConnectableUndirected = 0x03, + BluetoothLEAdvertisingTypeScanResponse = 0x04 +} BluetoothLEAdvertisingType; + +#ifdef __cplusplus +} +#endif diff --git a/QualcommWireless/include/IOKit/bluetooth/BluetoothAssignedNumbers.h b/QualcommWireless/include/IOKit/bluetooth/BluetoothAssignedNumbers.h new file mode 100644 index 0000000..0b0778f --- /dev/null +++ b/QualcommWireless/include/IOKit/bluetooth/BluetoothAssignedNumbers.h @@ -0,0 +1,897 @@ +/* + * Copyright (c) 2021 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/*! + * @header BluetoothAssignedNumbers.h + * This header contains assigned numbers for IOBluetooth. + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma mark - +#pragma mark === General === + +/*! + * @enum BluetoothCompanyIdentifers + * @seealso https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers + */ + +enum BluetoothCompanyIdentifers +{ + kBluetoothCompanyIdentiferEricssonTechnologyLicensing = 0, + kBluetoothCompanyIdentiferNokiaMobilePhones = 1, + kBluetoothCompanyIdentiferIntel = 2, + kBluetoothCompanyIdentiferIBM = 3, + kBluetoothCompanyIdentiferToshiba = 4, + kBluetoothCompanyIdentifer3Com = 5, + kBluetoothCompanyIdentiferMicrosoft = 6, + kBluetoothCompanyIdentiferLucent = 7, + kBluetoothCompanyIdentiferMotorola = 8, + kBluetoothCompanyIdentiferInfineonTechnologiesAG = 9, + kBluetoothCompanyIdentiferCambridgeSiliconRadio = 10, + kBluetoothCompanyIdentiferSiliconWave = 11, + kBluetoothCompanyIdentiferDigianswerAS = 12, + kBluetoothCompanyIdentiferTexasInstruments = 13, + kBluetoothCompanyIdentiferParthusTechnologies = 14, + kBluetoothCompanyIdentiferBroadcom = 15, + kBluetoothCompanyIdentiferMitelSemiconductor = 16, + kBluetoothCompanyIdentiferWidcomm = 17, + kBluetoothCompanyIdentiferZeevo = 18, + kBluetoothCompanyIdentiferAtmel = 19, + kBluetoothCompanyIdentiferMistubishiElectric = 20, + kBluetoothCompanyIdentiferRTXTelecom = 21, + kBluetoothCompanyIdentiferKCTechnology = 22, + kBluetoothCompanyIdentiferNewlogic = 23, + kBluetoothCompanyIdentiferTransilica = 24, + kBluetoothCompanyIdentiferRohdeandSchwarz = 25, + kBluetoothCompanyIdentiferTTPCom = 26, + kBluetoothCompanyIdentiferSigniaTechnologies = 27, + kBluetoothCompanyIdentiferConexantSystems = 28, + kBluetoothCompanyIdentiferQualcomm = 29, + kBluetoothCompanyIdentiferInventel = 30, + kBluetoothCompanyIdentiferAVMBerlin = 31, + kBluetoothCompanyIdentiferBandspeed = 32, + kBluetoothCompanyIdentiferMansella = 33, + kBluetoothCompanyIdentiferNEC = 34, + kBluetoothCompanyIdentiferWavePlusTechnology = 35, + kBluetoothCompanyIdentiferAlcatel = 36, + kBluetoothCompanyIdentiferPhilipsSemiconductor = 37, + kBluetoothCompanyIdentiferCTechnologies = 38, + kBluetoothCompanyIdentiferOpenInterface = 39, + kBluetoothCompanyIdentiferRFCMicroDevices = 40, + kBluetoothCompanyIdentiferHitachi = 41, + kBluetoothCompanyIdentiferSymbolTechnologies = 42, + kBluetoothCompanyIdentiferTenovis = 43, + kBluetoothCompanyIdentiferMacronixInternational = 44, + kBluetoothCompanyIdentiferGCTSemiconductor = 45, + kBluetoothCompanyIdentiferNorwoodSystems = 46, + kBluetoothCompanyIdentiferMewTelTechnology = 47, + kBluetoothCompanyIdentiferSTMicroelectronics = 48, + kBluetoothCompanyIdentiferSynopsys = 49, + kBluetoothCompanyIdentiferRedMCommunications = 50, + kBluetoothCompanyIdentiferCommil = 51, + kBluetoothCompanyIdentiferCATC = 52, + kBluetoothCompanyIdentiferEclipse = 53, + kBluetoothCompanyIdentiferRenesasTechnology = 54, + kBluetoothCompanyIdentiferMobilian = 55, + kBluetoothCompanyIdentiferTerax = 56, + kBluetoothCompanyIdentiferIntegratedSystemSolution = 57, + kBluetoothCompanyIdentiferMatsushitaElectricIndustrial = 58, + kBluetoothCompanyIdentiferGennum = 59, + kBluetoothCompanyIdentiferResearchInMotion = 60, + kBluetoothCompanyIdentiferIPextreme = 61, + kBluetoothCompanyIdentiferSystemsAndChips = 62, + kBluetoothCompanyIdentiferBluetoothSIG = 63, + kBluetoothCompanyIdentiferSeikoEpson = 64, + kBluetoothCompanyIdentiferIntegratedSiliconSolution = 65, + kBluetoothCompanyIdentiferCONWISETechnology = 66, + kBluetoothCompanyIdentiferParrotSA = 67, + kBluetoothCompanyIdentiferSocketCommunications = 68, + kBluetoothCompanyIdentiferAtherosCommunications = 69, + kBluetoothCompanyIdentiferMediaTek = 70, + kBluetoothCompanyIdentiferBluegiga = 71, + kBluetoothCompanyIdentiferMarvellTechnologyGroup = 72, + kBluetoothCompanyIdentifer3DSP = 73, + kBluetoothCompanyIdentiferAccelSemiconductor = 74, + kBluetoothCompanyIdentiferContinentialAutomotiveSystems = 75, + kBluetoothCompanyIdentiferApple = 76, + kBluetoothCompanyIdentiferStaccatoCommunications = 77, + kBluetoothCompanyIdentiferAvagoTechnologies = 78, + kBluetoothCompanyIdentiferAPT = 79, + kBluetoothCompanyIdentiferSiRFTechnology = 80, + kBluetoothCompanyIdentiferTZeroTechnologies = 81, + kBluetoothCompanyIdentiferJandM = 82, + kBluetoothCompanyIdentiferFree2Move = 83, + kBluetoothCompanyIdentifer3DiJoy = 84, + kBluetoothCompanyIdentiferPlantronics = 85, + kBluetoothCompanyIdentiferSonyEricssonMobileCommunications = 86, + kBluetoothCompanyIdentiferHarmonInternational = 87, + kBluetoothCompanyIdentiferVisio = 88, + kBluetoothCompanyIdentiferNordicSemiconductor = 89, + kBluetoothCompanyIdentiferEMMicroElectronicMarin = 90, + kBluetoothCompanyIdentiferRalinkTechnology = 91, + kBluetoothCompanyIdentiferBelkinInternational = 92, + kBluetoothCompanyIdentiferRealtekSemiconductor = 93, + kBluetoothCompanyIdentiferStonestreetOne = 94, + kBluetoothCompanyIdentiferWicentric = 95, + kBluetoothCompanyIdentiferRivieraWaves = 96, + kBluetoothCompanyIdentiferRDAMicroelectronics = 97, + kBluetoothCompanyIdentiferGibsonGuitars = 98, + kBluetoothCompanyIdentiferMiCommand = 99, + kBluetoothCompanyIdentiferBandXIInternational = 100, + kBluetoothCompanyIdentiferHewlettPackard = 101, + kBluetoothCompanyIdentifer9SolutionsOy = 102, + kBluetoothCompanyIdentiferGNNetcom = 103, + kBluetoothCompanyIdentiferGeneralMotors = 104, + kBluetoothCompanyIdentiferAAndDEngineering = 105, + kBluetoothCompanyIdentiferMindTree = 106, + kBluetoothCompanyIdentiferPolarElectroOY = 107, + kBluetoothCompanyIdentiferBeautifulEnterprise = 108, + kBluetoothCompanyIdentiferBriarTek = 109, + kBluetoothCompanyIdentiferSummitDataCommunications = 110, + kBluetoothCompanyIdentiferSoundID = 111, + kBluetoothCompanyIdentiferMonster = 112, + kBluetoothCompanyIdentiferConnectBlueAB = 113, + kBluetoothCompanyIdentiferShangHaiSuperSmartElectronics = 114, + kBluetoothCompanyIdentiferGroupSense = 115, + kBluetoothCompanyIdentiferZomm = 116, + kBluetoothCompanyIdentiferSamsungElectronics = 117, + kBluetoothCompanyIdentiferCreativeTechnology = 118, + kBluetoothCompanyIdentiferLairdTechnologies = 119, + kBluetoothCompanyIdentiferNike = 120, + kBluetoothCompanyIdentiferLessWire = 121, + kBluetoothCompanyIdentiferMStarTechnologies = 122, + kBluetoothCompanyIdentiferHanlynnTechnologies = 123, + kBluetoothCompanyIdentiferAAndRCambridge = 124, + kBluetoothCompanyIdentiferSeersTechnology = 125, + kBluetoothCompanyIdentiferSportsTrackingTechnologies = 126, + kBluetoothCompanyIdentiferAutonetMobile = 127, + kBluetoothCompanyIdentiferDeLormePublishingCompany = 128, + kBluetoothCompanyIdentiferWuXiVimicro = 129, + kBluetoothCompanyIdentiferSennheiserCommunications = 130, + kBluetoothCompanyIdentiferTimeKeepingSystems = 131, + kBluetoothCompanyIdentiferLudusHelsinki = 132, + kBluetoothCompanyIdentiferBlueRadios = 133, + kBluetoothCompanyIdentiferEquinux = 134, + kBluetoothCompanyIdentiferGarminInternational = 135, + kBluetoothCompanyIdentiferEcotest = 136, + kBluetoothCompanyIdentiferGNResound = 137, + kBluetoothCompanyIdentiferJawbone = 138, + kBluetoothCompanyIdentiferTopconPositioningSystems = 139, + kBluetoothCompanyIdentiferGimbal = 140, + kBluetoothCompanyIdentiferZscanSoftware = 141, + kBluetoothCompanyIdentiferQuintic = 142, + kBluetoothCompanyIdentiferTelitWirelessSolutions = 143, + kBluetoothCompanyIdentiferFunaiElectric = 144, + kBluetoothCompanyIdentiferAdvancedPANMOBILSystems = 145, + kBluetoothCompanyIdentiferThinkOptics = 146, + kBluetoothCompanyIdentiferUniversalElectriconics = 147, + kBluetoothCompanyIdentiferAirohaTechnology = 148, + kBluetoothCompanyIdentiferNECLightning = 149, + kBluetoothCompanyIdentiferODMTechnology = 150, + kBluetoothCompanyIdentiferConnecteDevice = 151, + kBluetoothCompanyIdentiferZero1TV = 152, + kBluetoothCompanyIdentiferITechDynamicGlobalDistribution = 153, + kBluetoothCompanyIdentiferAlpwise = 154, + kBluetoothCompanyIdentiferJiangsuToppowerAutomotiveElectronics = 155, + kBluetoothCompanyIdentiferColorfy = 156, + kBluetoothCompanyIdentiferGeoforce = 157, + kBluetoothCompanyIdentiferBose = 158, + kBluetoothCompanyIdentiferSuuntoOy = 159, + kBluetoothCompanyIdentiferKensingtonComputerProductsGroup = 160, + kBluetoothCompanyIdentiferSRMedizinelektronik = 161, + kBluetoothCompanyIdentiferVertu = 162, + kBluetoothCompanyIdentiferMetaWatch = 163, + kBluetoothCompanyIdentiferLinak = 164, + kBluetoothCompanyIdentiferOTLDynamics = 165, + kBluetoothCompanyIdentiferPandaOcean = 166, + kBluetoothCompanyIdentiferVisteon = 167, + kBluetoothCompanyIdentiferARPDevicesUnlimited = 168, + kBluetoothCompanyIdentiferMagnetiMarelli = 169, + kBluetoothCompanyIdentiferCaenRFID = 170, + kBluetoothCompanyIdentiferIngenieurSystemgruppeZahn = 171, + kBluetoothCompanyIdentiferGreenThrottleGames = 172, + kBluetoothCompanyIdentiferPeterSystemtechnik = 173, + kBluetoothCompanyIdentiferOmegawave = 174, + kBluetoothCompanyIdentiferCinetix = 175, + kBluetoothCompanyIdentiferPassifSemiconductor = 176, + kBluetoothCompanyIdentiferSarisCyclingGroup = 177, + kBluetoothCompanyIdentiferBekey = 178, + kBluetoothCompanyIdentiferClarinoxTechnologies = 179, + kBluetoothCompanyIdentiferBDETechnology = 180, + kBluetoothCompanyIdentiferSwirlNetworks = 181, + kBluetoothCompanyIdentiferMesoInternational = 182, + kBluetoothCompanyIdentiferTreLab = 183, + kBluetoothCompanyIdentiferQualcommInnovationCenter = 184, + kBluetoothCompanyIdentiferJohnsonControls = 185, + kBluetoothCompanyIdentiferStarkeyLaboratories = 186, + kBluetoothCompanyIdentiferSPowerElectronics = 187, + kBluetoothCompanyIdentiferAceSensor = 188, + kBluetoothCompanyIdentiferAplix = 189, + kBluetoothCompanyIdentiferAAMPofAmerica = 190, + kBluetoothCompanyIdentiferStalmartTechnology = 191, + kBluetoothCompanyIdentiferAMICCOMElectronics = 192, + kBluetoothCompanyIdentiferShenzhenExcelsecuDataTechnology = 193, + kBluetoothCompanyIdentiferGeneq = 194, + kBluetoothCompanyIdentiferAdidas = 195, + kBluetoothCompanyIdentiferLGElectronics = 196, + kBluetoothCompanyIdentiferOnsetComputer = 197, + kBluetoothCompanyIdentiferSelflyBV = 198, + kBluetoothCompanyIdentiferQuupa = 199, + kBluetoothCompanyIdentiferGeLo = 200, + kBluetoothCompanyIdentiferEvluma = 201, + kBluetoothCompanyIdentiferMC10 = 202, + kBluetoothCompanyIdentiferBinauricSE = 203, + kBluetoothCompanyIdentiferBeatsElectronics = 204, + kBluetoothCompanyIdentiferMicrochipTechnology = 205, + kBluetoothCompanyIdentiferElgatoSystems = 206, + kBluetoothCompanyIdentiferARCHOS = 207, + kBluetoothCompanyIdentiferDexcom = 208, + kBluetoothCompanyIdentiferPolarElectroEurope = 209, + kBluetoothCompanyIdentiferDialogSemiconductor = 210, + kBluetoothCompanyIdentiferTaixingbangTechnology = 211, + kBluetoothCompanyIdentiferKawantech = 212, + kBluetoothCompanyIdentiferAustcoCommunicationsSystems = 213, + kBluetoothCompanyIdentiferTimexGroup = 214, + kBluetoothCompanyIdentiferQualcommTechnologies = 215, + kBluetoothCompanyIdentiferQualcommConnectedExperiences = 216, + kBluetoothCompanyIdentiferVoyetraTurtleBeach = 217, + kBluetoothCompanyIdentifertxtrGMBH = 218, + kBluetoothCompanyIdentiferBiosentronics = 219, + kBluetoothCompanyIdentiferProctorAndGamble = 220, + kBluetoothCompanyIdentiferHosiden = 221, + kBluetoothCompanyIdentiferMusik = 222, + kBluetoothCompanyIdentiferMisfitWearables = 223, + kBluetoothCompanyIdentiferGoogle = 224, + kBluetoothCompanyIdentiferDanlers = 225, + kBluetoothCompanyIdentiferSemilink = 226, + kBluetoothCompanyIdentiferInMusicBrands = 227, + kBluetoothCompanyIdentiferLSResearch = 228, + kBluetoothCompanyIdentiferEdenSoftwareConsultants = 229, + kBluetoothCompanyIdentiferFreshtemp = 230, + kBluetoothCompanyIdentiferKSTechnologies = 231, + kBluetoothCompanyIdentiferACTSTechnologies = 232, + kBluetoothCompanyIdentiferVtrackSystems = 233, + kBluetoothCompanyIdentiferNielsenKellerman = 234, + kBluetoothCompanyIdentiferServerTechnology = 235, + kBluetoothCompanyIdentiferBioResearchAssociates = 236, + kBluetoothCompanyIdentiferJollyLogic = 237, + kBluetoothCompanyIdentiferAboveAverageOutcomes = 238, + kBluetoothCompanyIdentiferBitsplitters = 239, + kBluetoothCompanyIdentiferPayPal = 240, + kBluetoothCompanyIdentiferWitronTechnology = 241, + kBluetoothCompanyIdentiferMorseProject = 242, + kBluetoothCompanyIdentiferKentDisplays = 243, + kBluetoothCompanyIdentiferNautilus = 244, + kBluetoothCompanyIdentiferSmartifier = 245, + kBluetoothCompanyIdentiferElcometer = 246, + kBluetoothCompanyIdentiferVSNTechnologies = 247, + kBluetoothCompanyIdentiferAceUni = 248, + kBluetoothCompanyIdentiferStickNFind = 249, + kBluetoothCompanyIdentiferCrystalCode = 250, + kBluetoothCompanyIdentiferKOUKAMM = 251, + kBluetoothCompanyIdentiferDelphi = 252, + kBluetoothCompanyIdentiferValenceTech = 253, + kBluetoothCompanyIdentiferStanleyBlackAndDecker = 254, + kBluetoothCompanyIdentiferTypeProducts = 255, + kBluetoothCompanyIdentiferTomTomInternational = 256, + kBluetoothCompanyIdentiferFuGoo = 257, + kBluetoothCompanyIdentiferKeiser = 258, + kBluetoothCompanyIdentiferBangAndOlufson = 259, + kBluetoothCompanyIdentiferPLUSLocationSystems = 260, + kBluetoothCompanyIdentiferUbiquitousComputingTechnology = 261, + kBluetoothCompanyIdentiferInnovativeYachtterSolutions = 262, + kBluetoothCompanyIdentiferWilliamDemantHolding = 263, + + kBluetoothCompanyIdentiferInteropIdentifier = 65535 +}; + +#pragma mark - +#pragma mark === Baseband === + +// +// Service Class Major +// + +enum +{ + kBluetoothServiceClassMajorLimitedDiscoverableMode = 0x001, // Bit 13 - Limited Discoverable Mode + kBluetoothServiceClassMajorReserved1 = 0x002, // Bit 14 - Reserved for future use. + kBluetoothServiceClassMajorReserved2 = 0x004, // Bit 15 - Reserved for future use. + kBluetoothServiceClassMajorPositioning = 0x008, // Bit 16 - Positioning (Location ID) + kBluetoothServiceClassMajorNetworking = 0x010, // Bit 17 - LAN, Ad hoc, etc... + kBluetoothServiceClassMajorRendering = 0x020, // Bit 18 - Printing, Speaker, etc... + kBluetoothServiceClassMajorCapturing = 0x040, // Bit 19 - Scanner, Microphone, etc... + kBluetoothServiceClassMajorObjectTransfer = 0x080, // Bit 20 - v-Inbox, v-Folder, etc... + kBluetoothServiceClassMajorAudio = 0x100, // Bit 21 - Speaker, Microphone, Headset, etc... + kBluetoothServiceClassMajorTelephony = 0x200, // Bit 22 - Cordless telephony, Modem, Headset, etc... + kBluetoothServiceClassMajorInformation = 0x400, // Bit 23 - Web server, WAP server, etc... + + kBluetoothServiceClassMajorAny = '****', // Pseudo-class - means anything acceptable. + kBluetoothServiceClassMajorNone = 'none', // Pseudo-class - means no matching. + + kBluetoothServiceClassMajorEnd +}; + +// +// Device Class Major +// + +enum +{ + kBluetoothDeviceClassMajorMiscellaneous = 0x00, // [00000] Miscellaneous + kBluetoothDeviceClassMajorComputer = 0x01, // [00001] Desktop, Notebook, PDA, Organizers, etc... + kBluetoothDeviceClassMajorPhone = 0x02, // [00010] Cellular, Cordless, Payphone, Modem, etc... + kBluetoothDeviceClassMajorLANAccessPoint = 0x03, // [00011] LAN Access Point + kBluetoothDeviceClassMajorAudio = 0x04, // [00100] Headset, Speaker, Stereo, etc... + kBluetoothDeviceClassMajorPeripheral = 0x05, // [00101] Mouse, Joystick, Keyboards, etc... + kBluetoothDeviceClassMajorImaging = 0x06, // [00110] Printing, scanner, camera, display, etc... + kBluetoothDeviceClassMajorWearable = 0x07, // [00111] Wearable + kBluetoothDeviceClassMajorToy = 0x08, // [01000] Toy + kBluetoothDeviceClassMajorHealth = 0x09, // [01001] Health devices + kBluetoothDeviceClassMajorUnclassified = 0x1F, // [11111] Specific device code not assigned + + // Range 0x06 to 0x1E Reserved for future use. + + kBluetoothDeviceClassMajorAny = '****', // Pseudo-class - means anything acceptable. + kBluetoothDeviceClassMajorNone = 'none', // Pseudo-class - means no matching. + + kBluetoothDeviceClassMajorEnd +}; + +// +// Device Class Minor +// + +enum +{ + /// + /// Computer Minor Class + /// + + kBluetoothDeviceClassMinorComputerUnclassified = 0x00, // [000000] Specific device code not assigned + kBluetoothDeviceClassMinorComputerDesktopWorkstation = 0x01, // [000001] Desktop workstation + kBluetoothDeviceClassMinorComputerServer = 0x02, // [000010] Server-class computer + kBluetoothDeviceClassMinorComputerLaptop = 0x03, // [000011] Laptop + kBluetoothDeviceClassMinorComputerHandheld = 0x04, // [000100] Handheld PC/PDA (clam shell) + kBluetoothDeviceClassMinorComputerPalmSized = 0x05, // [000101] Palm-sized PC/PDA + kBluetoothDeviceClassMinorComputerWearable = 0x06, // [000110] Wearable computer (watch sized) + + // Range 0x06 to 0x7F Reserved for future use. + + /// + /// Phone Minor Class + /// + + kBluetoothDeviceClassMinorPhoneUnclassified = 0x00, // [000000] Specific device code not assigned + kBluetoothDeviceClassMinorPhoneCellular = 0x01, // [000001] Cellular + kBluetoothDeviceClassMinorPhoneCordless = 0x02, // [000010] Cordless + kBluetoothDeviceClassMinorPhoneSmartPhone = 0x03, // [000011] Smart phone + kBluetoothDeviceClassMinorPhoneWiredModemOrVoiceGateway = 0x04, // [000100] Wired modem or voice gateway + kBluetoothDeviceClassMinorPhoneCommonISDNAccess = 0x05, // [000101] Common ISDN Access + + // Range 0x05 to 0x7F Reserved for future use. + + /// + /// LAN Access Point Minor Class + /// + + // See the Bluetooth specification for LAN Access Point minor classes, which are broken into bits 5-7 for utilization and bits 2-4 for class. + + /// + /// Audio Minor Class + /// + + kBluetoothDeviceClassMinorAudioUnclassified = 0x00, // [000000] Specific device code not assigned + kBluetoothDeviceClassMinorAudioHeadset = 0x01, // [000001] Device conforms to the Headset profile + kBluetoothDeviceClassMinorAudioHandsFree = 0x02, // [000010] Hands-free + kBluetoothDeviceClassMinorAudioReserved1 = 0x03, // [000011] Reserved + kBluetoothDeviceClassMinorAudioMicrophone = 0x04, // [000100] Microphone + kBluetoothDeviceClassMinorAudioLoudspeaker = 0x05, // [000101] Loudspeaker + kBluetoothDeviceClassMinorAudioHeadphones = 0x06, // [000110] Headphones + kBluetoothDeviceClassMinorAudioPortable = 0x07, // [000111] Portable Audio + kBluetoothDeviceClassMinorAudioCar = 0x08, // [001000] Car Audio + kBluetoothDeviceClassMinorAudioSetTopBox = 0x09, // [001001] Set-top box + kBluetoothDeviceClassMinorAudioHiFi = 0x0a, // [001010] HiFi Audio Device + kBluetoothDeviceClassMinorAudioVCR = 0x0b, // [001011] VCR + kBluetoothDeviceClassMinorAudioVideoCamera = 0x0c, // [001100] Video Camera + kBluetoothDeviceClassMinorAudioCamcorder = 0x0d, // [001101] Camcorder + kBluetoothDeviceClassMinorAudioVideoMonitor = 0x0e, // [001110] Video Monitor + kBluetoothDeviceClassMinorAudioVideoDisplayAndLoudspeaker = 0x0f, // [001111] Video Display and Loudspeaker + kBluetoothDeviceClassMinorAudioVideoConferencing = 0x10, // [010000] Video Conferencing + kBluetoothDeviceClassMinorAudioReserved2 = 0x11, // [010001] Reserved + kBluetoothDeviceClassMinorAudioGamingToy = 0x12, // [010010] Gaming/Toy + + // Range 0x13 to 0x7F Reserved for future use. + + /// + /// Peripheral Minor Class + /// + + // Peripheral1 subclass is bits 7 & 6 + + kBluetoothDeviceClassMinorPeripheral1Keyboard = 0x10, // [01XXXX] Keyboard + kBluetoothDeviceClassMinorPeripheral1Pointing = 0x20, // [10XXXX] Pointing device + kBluetoothDeviceClassMinorPeripheral1Combo = 0x30, // [11XXXX] Combo keyboard/pointing device + + // Peripheral2 subclass is bits 5-2 + + kBluetoothDeviceClassMinorPeripheral2Unclassified = 0x00, // [XX0000] Uncategorized device + kBluetoothDeviceClassMinorPeripheral2Joystick = 0x01, // [XX0001] Joystick + kBluetoothDeviceClassMinorPeripheral2Gamepad = 0x02, // [XX0010] Gamepad + kBluetoothDeviceClassMinorPeripheral2RemoteControl = 0x03, // [XX0011] Remote control + kBluetoothDeviceClassMinorPeripheral2SensingDevice = 0x04, // [XX0100] Sensing device + kBluetoothDeviceClassMinorPeripheral2DigitizerTablet = 0x05, // [XX0101] Digitizer Tablet + kBluetoothDeviceClassMinorPeripheral2CardReader = 0x06, // [XX0110] Card Reader + kBluetoothDeviceClassMinorPeripheral2DigitalPen = 0x07, // [XX0111] Digital Pen + kBluetoothDeviceClassMinorPeripheral2HandheldScanner = 0x08, // [XX1000] Handheld scanner for bar-codes, RFID, etc. + kBluetoothDeviceClassMinorPeripheral2GesturalInputDevice = 0x09, // [XX1001] Handheld gestural input device (e.g., "wand" form factor) + + kBluetoothDeviceClassMinorPeripheral2AnyPointing = 'poin', // Anything under MinorPeripheral1Pointing + + // Range 0x05 to 0x0f reserved for future use + + /// + /// Imaging Minor Class + /// + + // Imaging1 subclass is bits 7 - 4 + + kBluetoothDeviceClassMinorImaging1Display = 0x04, // [XXX1XX] Display + kBluetoothDeviceClassMinorImaging1Camera = 0x08, // [XX1XXX] Camera + kBluetoothDeviceClassMinorImaging1Scanner = 0x10, // [X1XXXX] Scanner + kBluetoothDeviceClassMinorImaging1Printer = 0x20, // [1XXXXX] Printer + + // Imaging2 subclass is bits 3 - 2 + + kBluetoothDeviceClassMinorImaging2Unclassified = 0x00, // [XXXX00] Uncategorized, default + + // Range 0x01 - 0x03 reserved for future use + + /// + /// Wearable Minor Class + /// + + kBluetoothDeviceClassMinorWearableWristWatch = 0x01, // [000001] Watch + kBluetoothDeviceClassMinorWearablePager = 0x02, // [000010] Pager + kBluetoothDeviceClassMinorWearableJacket = 0x03, // [000011] Jacket + kBluetoothDeviceClassMinorWearableHelmet = 0x04, // [000100] Helmet + kBluetoothDeviceClassMinorWearableGlasses = 0x05, // [000101] Glasses + + /// + /// Toy Minor Class + /// + + kBluetoothDeviceClassMinorToyRobot = 0x01, // [000001] Robot + kBluetoothDeviceClassMinorToyVehicle = 0x02, // [000010] Vehicle + kBluetoothDeviceClassMinorToyDollActionFigure = 0x03, // [000011] Doll / Action Figure + kBluetoothDeviceClassMinorToyController = 0x04, // [000100] Controller + kBluetoothDeviceClassMinorToyGame = 0x05, // [000101] Game + + /// + /// Health Minor Class + /// + + kBluetoothDeviceClassMinorHealthUndefined = 0x00, // [000000] Undefined + kBluetoothDeviceClassMinorHealthBloodPressureMonitor = 0x01, // [000001] Blood Pressure Monitor + kBluetoothDeviceClassMinorHealthThermometer = 0x02, // [000010] Thermometer + kBluetoothDeviceClassMinorHealthScale = 0x03, // [000011] Scale + kBluetoothDeviceClassMinorHealthGlucoseMeter = 0x04, // [000100] Glucose Meter + kBluetoothDeviceClassMinorHealthPulseOximeter = 0x05, // [000101] Pulse Oximeter + kBluetoothDeviceClassMinorHealthHeartRateMonitor = 0x06, // [000111] Heart Rate Monitor + kBluetoothDeviceClassMinorHealthDataDisplay = 0x07, // [001000] Display + + /// + /// Misc + /// + + kBluetoothDeviceClassMinorAny = '****', // Pseudo-class - means anything acceptable. + kBluetoothDeviceClassMinorNone = 'none', // Pseudo-class - means no matching. + + kBluetoothDeviceClassMinorEnd +}; + +// Peripheral devices bits 7 & 6 +#define BluetoothCoDMinorPeripheral1(minorClass) (minorClass & 0x30) + +// Peripheral devices bits 5 - 2 +#define BluetoothCoDMinorPeripheral2(minorClass) (minorClass & 0x0f) + +#pragma mark - LE Appearance +enum +{ + kBluetoothGAPAppearanceUnknown = 0, + kBluetoothGAPAppearanceGenericPhone = 64, + kBluetoothGAPAppearanceGenericComputer = 128, + kBluetoothGAPAppearanceGenericWatch = 192, + kBluetoothGAPAppearanceGenericClock = 256, + kBluetoothGAPAppearanceGenericDisplay = 320, + kBluetoothGAPAppearanceGenericRemoteControl = 384, + kBluetoothGAPAppearanceGenericEyeGlasses = 448, + kBluetoothGAPAppearanceGenericTag = 512, + kBluetoothGAPAppearanceGenericKeyring = 576, + kBluetoothGAPAppearanceGenericMediaPlayer = 640, + kBluetoothGAPAppearanceGenericBarcodeScanner = 704, + kBluetoothGAPAppearanceGenericThermometer = 768, + kBluetoothGAPAppearanceGenericHeartrateSensor = 832, + kBluetoothGAPAppearanceGenericBloodPressure = 896, + kBluetoothGAPAppearanceGenericHumanInterfaceDevice = 960, + kBluetoothGAPAppearanceHumanInterfaceDeviceKeyboard = 961, + kBluetoothGAPAppearanceHumanInterfaceDeviceMouse = 962, + kBluetoothGAPAppearanceHumanInterfaceDeviceJoystick = 963, + kBluetoothGAPAppearanceHumanInterfaceDeviceGamepad = 964, + kBluetoothGAPAppearanceHumanInterfaceDeviceDigitizerTablet = 965, + kBluetoothGAPAppearanceHumanInterfaceDeviceCardReader = 966, + kBluetoothGAPAppearanceHumanInterfaceDeviceDigitalPen = 967, + kBluetoothGAPAppearanceHumanInterfaceDeviceBarcodeScanner = 968, + kBluetoothGAPAppearanceGenericGlucoseMeter = 1024, + kBluetoothGAPAppearanceGenericRunningWalkingSensor = 1088, + kBluetoothGAPAppearanceGenericCycling = 1152 +}; + +#pragma mark - +#pragma mark === L2CAP === + +enum +{ + kBluetoothL2CAPPSMSDP = 0x0001, + kBluetoothL2CAPPSMRFCOMM = 0x0003, + kBluetoothL2CAPPSMTCS_BIN = 0x0005, // Telephony Control Specifictation / TCS Binary + kBluetoothL2CAPPSMTCS_BIN_Cordless = 0x0007, // Telephony Control Specifictation / TCS Binary + kBluetoothL2CAPPSMBNEP = 0x000F, // Bluetooth Network Encapsulation Protocol + kBluetoothL2CAPPSMHIDControl = 0x0011, // HID profile - control interface + kBluetoothL2CAPPSMHIDInterrupt = 0x0013, // HID profile - interrupt interface + kBluetoothL2CAPPSMAVCTP = 0x0017, // Audio/Video Control Transport Protocol + kBluetoothL2CAPPSMAVDTP = 0x0019, // Audio/Video Distribution Transport Protocol + kBluetoothL2CAPPSMAVCTP_Browsing = 0x001B, // AVTCP (AVRCP) Browsing + kBluetoothL2CAPPSMUID_C_Plane = 0x001D, // Unrestricted Digital Information Profile (UDI) + kBluetoothL2CAPPSMATT = 0x001F, // Attribute Protocol + + // Range < 0x1000 reserved. + kBluetoothL2CAPPSMReservedStart = 0x0001, + kBluetoothL2CAPPSMReservedEnd = 0x1000, + + // Range 0x1001-0xFFFF dynamically assigned. + kBluetoothL2CAPPSMDynamicStart = 0x1001, + // AACP + kBluetoothL2CAPPSMAACP = 0x1001, + kBluetoothL2CAPPSMD2D = 0x100F, + kBluetoothL2CAPPSMDynamicEnd = 0xFFFF, + + kBluetoothL2CAPPSMNone = 0x0000 +}; + +#pragma mark - +#pragma mark === SDP === + +enum +{ + // General + + kBluetoothSDPUUID16Base = 0x0000, // 00000000-0000-1000-8000-00805f9b34fb + + // Protocols + + kBluetoothSDPUUID16SDP = 0x0001, // 00000001-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16UDP = 0x0002, // 00000002-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16RFCOMM = 0x0003, // 00000003-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16TCP = 0x0004, // 00000004-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16TCSBIN = 0x0005, // 00000005-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16TCSAT = 0x0006, // 00000006-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16ATT = 0x0007, + kBluetoothSDPUUID16OBEX = 0x0008, // 00000008-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16IP = 0x0009, // 00000009-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16FTP = 0x000A, // 0000000A-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16HTTP = 0x000C, // 0000000C-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16WSP = 0x000E, // 0000000E-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16BNEP = 0x000F, + kBluetoothSDPUUID16UPNP = 0x0010, + kBluetoothSDPUUID16HIDP = 0x0011, + kBluetoothSDPUUID16HardcopyControlChannel = 0x0012, + kBluetoothSDPUUID16HardcopyDataChannel = 0x0014, + kBluetoothSDPUUID16HardcopyNotification = 0x0016, + kBluetoothSDPUUID16AVCTP = 0x0017, + kBluetoothSDPUUID16AVDTP = 0x0019, + kBluetoothSDPUUID16CMPT = 0x001B, + kBluetoothSDPUUID16UDI_C_Plane = 0x001D, + kBluetoothSDPUUID16MCAPControlChannel = 0x001E, + kBluetoothSDPUUID16MCAPDataChannel = 0x001F, + kBluetoothSDPUUID16L2CAP = 0x0100 // 00000100-0000-1000-8000-00805f9b34fb +}; + +enum SDPServiceClasses +{ + kBluetoothSDPUUID16ServiceClassServiceDiscoveryServer = 0x1000, // 00001000-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16ServiceClassBrowseGroupDescriptor = 0x1001, // 00001001-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16ServiceClassPublicBrowseGroup = 0x1002, // 00001002-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16ServiceClassSerialPort = 0x1101, // 00001101-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16ServiceClassLANAccessUsingPPP = 0x1102, // 00001102-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16ServiceClassDialupNetworking = 0x1103, // 00001103-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16ServiceClassIrMCSync = 0x1104, // 00001104-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16ServiceClassOBEXObjectPush = 0x1105, // 00001105-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16ServiceClassOBEXFileTransfer = 0x1106, // 00001106-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16ServiceClassIrMCSyncCommand = 0x1107, // 00001107-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16ServiceClassHeadset = 0x1108, // 00001108-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16ServiceClassCordlessTelephony = 0x1109, // 00001109-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16ServiceClassAudioSource = 0x110A, + kBluetoothSDPUUID16ServiceClassAudioSink = 0x110B, + kBluetoothSDPUUID16ServiceClassAVRemoteControlTarget = 0x110C, + kBluetoothSDPUUID16ServiceClassAdvancedAudioDistribution = 0x110D, + kBluetoothSDPUUID16ServiceClassAVRemoteControl = 0x110E, + kBluetoothSDPUUID16ServiceClassAVRemoteControlController = 0x110F, + kBluetoothSDPUUID16ServiceClassIntercom = 0x1110, // 00001110-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16ServiceClassFax = 0x1111, // 00001111-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16ServiceClassHeadsetAudioGateway = 0x1112, // 00001112-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16ServiceClassWAP = 0x1113, + kBluetoothSDPUUID16ServiceClassWAPClient = 0x1114, + kBluetoothSDPUUID16ServiceClassPANU = 0x1115, + kBluetoothSDPUUID16ServiceClassNAP = 0x1116, + kBluetoothSDPUUID16ServiceClassGN = 0x1117, + kBluetoothSDPUUID16ServiceClassDirectPrinting = 0x1118, + kBluetoothSDPUUID16ServiceClassReferencePrinting = 0x1119, + kBluetoothSDPUUID16ServiceClassImaging = 0x111A, + kBluetoothSDPUUID16ServiceClassImagingResponder = 0x111B, + kBluetoothSDPUUID16ServiceClassImagingAutomaticArchive = 0x111C, + kBluetoothSDPUUID16ServiceClassImagingReferencedObjects = 0x111D, + kBluetoothSDPUUID16ServiceClassHandsFree = 0x111E, + kBluetoothSDPUUID16ServiceClassHandsFreeAudioGateway = 0x111F, + kBluetoothSDPUUID16ServiceClassDirectPrintingReferenceObjectsService = 0x1120, + kBluetoothSDPUUID16ServiceClassReflectedUI = 0x1121, + kBluetoothSDPUUID16ServiceClassBasicPrinting = 0x1122, + kBluetoothSDPUUID16ServiceClassPrintingStatus = 0x1123, + kBluetoothSDPUUID16ServiceClassHumanInterfaceDeviceService = 0x1124, + kBluetoothSDPUUID16ServiceClassHardcopyCableReplacement = 0x1125, + kBluetoothSDPUUID16ServiceClassHCR_Print = 0x1126, + kBluetoothSDPUUID16ServiceClassHCR_Scan = 0x1127, + kBluetoothSDPUUID16ServiceClassCommonISDNAccess = 0x1128, + kBluetoothSDPUUID16ServiceClassVideoConferencingGW = 0x1129, + kBluetoothSDPUUID16ServiceClassUDI_MT = 0x112A, + kBluetoothSDPUUID16ServiceClassUDI_TA = 0x112B, + kBluetoothSDPUUID16ServiceClassAudioVideo = 0x112C, + kBluetoothSDPUUID16ServiceClassSIM_Access = 0x112D, + kBluetoothSDPUUID16ServiceClassPhonebookAccess_PCE = 0x112E, + kBluetoothSDPUUID16ServiceClassPhonebookAccess_PSE = 0x112F, + kBluetoothSDPUUID16ServiceClassPhonebookAccess = 0x1130, + kBluetoothSDPUUID16ServiceClassHeadset_HS = 0x1131, + kBluetoothSDPUUID16ServiceClassMessageAccessServer = 0x1132, + kBluetoothSDPUUID16ServiceClassMessageNotificationServer = 0x1133, + kBluetoothSDPUUID16ServiceClassMessageAccessProfile = 0x1134, + kBluetoothSDPUUID16ServiceClassGlobalNavigationSatelliteSystem = 0x1135, + kBluetoothSDPUUID16ServiceClassGlobalNavigationSatelliteSystemServer = 0x1136, + kBluetoothSDPUUID16ServiceClassPnPInformation = 0x1200, // 00001200-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16ServiceClassGenericNetworking = 0x1201, // 00001201-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16ServiceClassGenericFileTransfer = 0x1202, // 00001202-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16ServiceClassGenericAudio = 0x1203, // 00001203-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16ServiceClassGenericTelephony = 0x1204, // 00001204-0000-1000-8000-00805f9b34fb + kBluetoothSDPUUID16ServiceClassVideoSource = 0x1303, + kBluetoothSDPUUID16ServiceClassVideoSink = 0x1304, + kBluetoothSDPUUID16ServiceClassVideoDistribution = 0x1305, + kBluetoothSDPUUID16ServiceClassHealthDevice = 0x1400, + kBluetoothSDPUUID16ServiceClassHealthDeviceSource = 0x1401, + kBluetoothSDPUUID16ServiceClassHealthDeviceSink = 0x1402, + kBluetoothSDPUUID16ServiceClassGATT = 0x1801 +}; + +enum SDPAttributeIdentifierCodes +{ + kBluetoothSDPAttributeIdentifierServiceRecordHandle = 0x0000, + kBluetoothSDPAttributeIdentifierServiceClassIDList = 0x0001, + kBluetoothSDPAttributeIdentifierServiceRecordState = 0x0002, + kBluetoothSDPAttributeIdentifierServiceID = 0x0003, + kBluetoothSDPAttributeIdentifierProtocolDescriptorList = 0x0004, + kBluetoothSDPAttributeIdentifierBrowseGroupList = 0x0005, + kBluetoothSDPAttributeIdentifierLanguageBaseAttributeIDList = 0x0006, + kBluetoothSDPAttributeIdentifierServiceInfoTimeToLive = 0x0007, + kBluetoothSDPAttributeIdentifierServiceAvailability = 0x0008, + kBluetoothSDPAttributeIdentifierBluetoothProfileDescriptorList = 0x0009, + kBluetoothSDPAttributeIdentifierDocumentationURL = 0x000A, + kBluetoothSDPAttributeIdentifierClientExecutableURL = 0x000B, + kBluetoothSDPAttributeIdentifierIconURL = 0x000C, + kBluetoothSDPAttributeIdentifierAdditionalProtocolsDescriptorList = 0x000D, + + // Service Discovery Server + kBluetoothSDPAttributeIdentifierVersionNumberList = 0x0200, + kBluetoothSDPAttributeIdentifierServiceDatabaseState = 0x0201, + + // Browse Group Descriptor + kBluetoothSDPAttributeIdentifierGroupID = 0x0200, + + // PAN + kBluetoothSDPAttributeIdentifierIPSubnet = 0x0200, + + // HID Required Type Notes + kBluetoothSDPAttributeIdentifierHIDReleaseNumber = 0x0200, // O uint16 + kBluetoothSDPAttributeIdentifierHIDParserVersion = 0x0201, // M uint16 + kBluetoothSDPAttributeIdentifierHIDDeviceSubclass = 0x0202, // M uint8 Should match the low order 8 bits of CoD unless a combo device + kBluetoothSDPAttributeIdentifierHIDCountryCode = 0x0203, // M uint8 + kBluetoothSDPAttributeIdentifierHIDVirtualCable = 0x0204, // M bool + kBluetoothSDPAttributeIdentifierHIDReconnectInitiate = 0x0205, // M bool + kBluetoothSDPAttributeIdentifierHIDDescriptorList = 0x0206, // M sequence Layout is defined in Section 6.2 of the HID Specification + kBluetoothSDPAttributeIdentifierHIDLangIDBaseList = 0x0207, // M sequence + kBluetoothSDPAttributeIdentifierHIDSDPDisable = 0x0208, // O bool + kBluetoothSDPAttributeIdentifierHIDBatteryPower = 0x0209, // O bool + kBluetoothSDPAttributeIdentifierHIDRemoteWake = 0x020A, // O bool + kBluetoothSDPAttributeIdentifierHIDProfileVersion = 0x020B, // M uint16 + kBluetoothSDPAttributeIdentifierHIDSupervisionTimeout = 0x020C, // O uint16 Default to 5 seconds or longer if not defined + kBluetoothSDPAttributeIdentifierHIDNormallyConnectable = 0x020D, // O bool + kBluetoothSDPAttributeIdentifierHIDBootDevice = 0x020E, // M bool Only defined for mice and keyboards as of HID 1.0 + kBluetoothSDPAttributeIdentifierHIDSSRHostMaxLatency = 0x020F, // O uint16 + kBluetoothSDPAttributeIdentifierHIDSSRHostMinTimeout = 0x0210, // O uint16 + + kBluetoothSDPAttributeIdentifierServiceVersion = 0x0300, + kBluetoothSDPAttributeIdentifierExternalNetwork = 0x0301, // Cordless telephony + kBluetoothSDPAttributeIdentifierNetwork = 0x0301, // Handsfree Profile (HFP) + kBluetoothSDPAttributeIdentifierSupportedDataStoresList = 0x0301, // Sync Profile + kBluetoothSDPAttributeIdentifierFaxClass1Support = 0x0302, // Fax Profile + kBluetoothSDPAttributeIdentifierRemoteAudioVolumeControl = 0x0302, // GAP??? + kBluetoothSDPAttributeIdentifierFaxClass2_0Support = 0x0303, + kBluetoothSDPAttributeIdentifierSupporterFormatsList = 0x0303, + kBluetoothSDPAttributeIdentifierFaxClass2Support = 0x0304, + kBluetoothSDPAttributeIdentifierAudioFeedbackSupport = 0x0305, + kBluetoothSDPAttributeIdentifierNetworkAddress = 0x0306, // WAP + kBluetoothSDPAttributeIdentifierWAPGateway = 0x0307, // WAP + kBluetoothSDPAttributeIdentifierHomepageURL = 0x0308, // WAP + kBluetoothSDPAttributeIdentifierWAPStackType = 0x0309, // WAP + kBluetoothSDPAttributeIdentifierSecurityDescription = 0x030A, // PAN + kBluetoothSDPAttributeIdentifierNetAccessType = 0x030B, // PAN + kBluetoothSDPAttributeIdentifierMaxNetAccessRate = 0x030C, // PAN + kBluetoothSDPAttributeIdentifierSupportedCapabilities = 0x0310, // Imaging + kBluetoothSDPAttributeIdentifierSupportedFeatures = 0x0311, // Imaging & HFP + kBluetoothSDPAttributeIdentifierSupportedFunctions = 0x0312, // Imaging + kBluetoothSDPAttributeIdentifierTotalImagingDataCapacity = 0x0313, // Imaging + + kBluetoothSDPAttributeIdentifierServiceName = 0x0000, /* +language base offset */ + kBluetoothSDPAttributeIdentifierServiceDescription = 0x0001, /* +language base offset */ + kBluetoothSDPAttributeIdentifierProviderName = 0x0002 /* +language base offset */ +}; + +enum SDPAttributeDeviceIdentificationRecord +{ + // DeviceID v1.3 Required Type Section Notes + kBluetoothSDPAttributeDeviceIdentifierServiceDescription = 0x0001, // O string - + kBluetoothSDPAttributeDeviceIdentifierDocumentationURL = 0x000A, // O url - + kBluetoothSDPAttributeDeviceIdentifierClientExecutableURL = 0x000B, // O url - + kBluetoothSDPAttributeDeviceIdentifierSpecificationID = 0x0200, // M uint16 5.1 + kBluetoothSDPAttributeDeviceIdentifierVendorID = 0x0201, // M uint16 5.2 + kBluetoothSDPAttributeDeviceIdentifierProductID = 0x0202, // M uint16 5.3 + kBluetoothSDPAttributeDeviceIdentifierVersion = 0x0203, // M uint16 5.4 + kBluetoothSDPAttributeDeviceIdentifierPrimaryRecord = 0x0204, // M bool 5.5 + kBluetoothSDPAttributeDeviceIdentifierVendorIDSource = 0x0205, // M uint16 5.6 + kBluetoothSDPAttributeDeviceIdentifierReservedRangeStart = 0x0206, + kBluetoothSDPAttributeDeviceIdentifierReservedRangeEnd = 0x02FF + +}; + +enum ProtocolParameters +{ + kBluetoothSDPProtocolParameterL2CAPPSM = 1, + kBluetoothSDPProtocolParameterRFCOMMChannel = 1, + kBluetoothSDPProtocolParameterTCPPort = 1, + kBluetoothSDPProtocolParameterUDPPort = 1, + kBluetoothSDPProtocolParameterBNEPVersion = 1, + kBluetoothSDPProtocolParameterBNEPSupportedNetworkPacketTypeList = 2 +}; + +/*! + * @enum BluetoothHCIExtendedInquiryResponseDataTypes + * @brief Inquiries with 'Extended Inquiry Response' + * @seealso Bluetooth v2.1 specification + */ + +enum BluetoothHCIExtendedInquiryResponseDataTypes +{ + kBluetoothHCIExtendedInquiryResponseDataTypeFlags = 0x01, + kBluetoothHCIExtendedInquiryResponseDataType16BitServiceClassUUIDsWithMoreAvailable = 0x02, + kBluetoothHCIExtendedInquiryResponseDataType16BitServiceClassUUIDsCompleteList = 0x03, + kBluetoothHCIExtendedInquiryResponseDataType32BitServiceClassUUIDsWithMoreAvailable = 0x04, + kBluetoothHCIExtendedInquiryResponseDataType32BitServiceClassUUIDsCompleteList = 0x05, + kBluetoothHCIExtendedInquiryResponseDataType128BitServiceClassUUIDsWithMoreAvailable = 0x06, + kBluetoothHCIExtendedInquiryResponseDataType128BitServiceClassUUIDsCompleteList = 0x07, + kBluetoothHCIExtendedInquiryResponseDataTypeShortenedLocalName = 0x08, + kBluetoothHCIExtendedInquiryResponseDataTypeCompleteLocalName = 0x09, + kBluetoothHCIExtendedInquiryResponseDataTypeTransmitPowerLevel = 0x0A, + kBluetoothHCIExtendedInquiryResponseDataTypeSSPOOBClassOfDevice = 0x0D, + kBluetoothHCIExtendedInquiryResponseDataTypeSSPOOBSimplePairingHashC = 0x0E, + kBluetoothHCIExtendedInquiryResponseDataTypeSSPOOBSimplePairingRandomizerR = 0x0F, + kBluetoothHCIExtendedInquiryResponseDataTypeDeviceID = 0x10, + kBluetoothHCIExtendedInquiryResponseDataTypeSecurityManagerTKValue = 0x10, + kBluetoothHCIExtendedInquiryResponseDataTypeSecurityManagerOOBFlags = 0x11, + kBluetoothHCIExtendedInquiryResponseDataTypeSlaveConnectionIntervalRange = 0x12, + kBluetoothHCIExtendedInquiryResponseDataTypeServiceSolicitation16BitUUIDs = 0x14, + kBluetoothHCIExtendedInquiryResponseDataTypeServiceSolicitation128BitUUIDs = 0x15, + kBluetoothHCIExtendedInquiryResponseDataTypeServiceData = 0x16, + kBluetoothHCIExtendedInquiryResponseDataTypePublicTargetAddress = 0x17, + kBluetoothHCIExtendedInquiryResponseDataTypeRandomTargetAddress = 0x18, + kBluetoothHCIExtendedInquiryResponseDataTypeAppearance = 0x19, + kBluetoothHCIExtendedInquiryResponseDataTypeAdvertisingInterval = 0x1A, + kBluetoothHCIExtendedInquiryResponseDataTypeLEBluetoothDeviceAddress = 0x1B, + kBluetoothHCIExtendedInquiryResponseDataTypeLERole = 0x1C, + kBluetoothHCIExtendedInquiryResponseDataTypeSimplePairingHash = 0x1D, + kBluetoothHCIExtendedInquiryResponseDataTypeSimplePairingRandomizer = 0x1E, + kBluetoothHCIExtendedInquiryResponseDataTypeServiceSolicitation32BitUUIDs = 0x1F, + kBluetoothHCIExtendedInquiryResponseDataTypeServiceData32BitUUID = 0x20, + kBluetoothHCIExtendedInquiryResponseDataTypeServiceData128BitUUID = 0x21, + kBluetoothHCIExtendedInquiryResponseDataTypeSecureConnectionsConfirmationValue = 0x22, + kBluetoothHCIExtendedInquiryResponseDataTypeSecureConnectionsRandomValue = 0x23, + kBluetoothHCIExtendedInquiryResponseDataTypeURI = 0x24, + kBluetoothHCIExtendedInquiryResponseDataTypeIndoorPositioning = 0x25, + kBluetoothHCIExtendedInquiryResponseDataTypeTransportDiscoveryData = 0x26, + kBluetoothHCIExtendedInquiryResponseDataType3DInformationData = 0x3D, + kBluetoothHCIExtendedInquiryResponseDataTypeManufacturerSpecificData = 0xFF +}; + +/*! + * @enum BluetoothHCIVersions + * @seealso https://www.bluetooth.com/specifications/assigned-numbers/host-controller-interface + */ + +typedef enum BluetoothHCIVersions +{ + kBluetoothHCIVersionCoreSpecification1_0b = 0x00, + kBluetoothHCIVersionCoreSpecification1_1 = 0x01, + kBluetoothHCIVersionCoreSpecification1_2 = 0x02, + kBluetoothHCIVersionCoreSpecification2_0EDR = 0x03, + kBluetoothHCIVersionCoreSpecification2_1EDR = 0x04, + kBluetoothHCIVersionCoreSpecification3_0HS = 0x05, + kBluetoothHCIVersionCoreSpecification4_0 = 0x06, + kBluetoothHCIVersionCoreSpecification4_1 = 0x07, + kBluetoothHCIVersionCoreSpecification4_2 = 0x08, + kBluetoothHCIVersionCoreSpecification5_0 = 0x09, + kBluetoothHCIVersionCoreSpecification5_1 = 0x0A, + kBluetoothHCIVersionCoreSpecification5_2 = 0x0B, + kBluetoothHCIVersionCoreSpecification5_3 = 0x0C +} BluetoothHCIVersions; + +/*! + * @enum BluetoothLMPVersions + * @seealso https://www.bluetooth.com/specifications/assigned-numbers/link-manager + */ + +typedef enum BluetoothLMPVersions +{ + kBluetoothLMPVersionCoreSpecification1_0b = 0x00, + kBluetoothLMPVersionCoreSpecification1_1 = 0x01, + kBluetoothLMPVersionCoreSpecification1_2 = 0x02, + kBluetoothLMPVersionCoreSpecification2_0EDR = 0x03, + kBluetoothLMPVersionCoreSpecification2_1EDR = 0x04, + kBluetoothLMPVersionCoreSpecification3_0HS = 0x05, + kBluetoothLMPVersionCoreSpecification4_0 = 0x06, + kBluetoothLMPVersionCoreSpecification4_1 = 0x07, + kBluetoothLMPVersionCoreSpecification4_2 = 0x08, + kBluetoothLMPVersionCoreSpecification5_0 = 0x09, + kBluetoothLMPVersionCoreSpecification5_1 = 0x0A, + kBluetoothLMPVersionCoreSpecification5_2 = 0x0B, + kBluetoothLMPVersionCoreSpecification5_3 = 0x0C +} BluetoothLMPVersions; + +#ifdef __cplusplus +} +#endif diff --git a/QualcommWireless/include/IOKit/bluetooth/CSRBluetoothHostController.h b/QualcommWireless/include/IOKit/bluetooth/CSRBluetoothHostController.h new file mode 100644 index 0000000..6372431 --- /dev/null +++ b/QualcommWireless/include/IOKit/bluetooth/CSRBluetoothHostController.h @@ -0,0 +1,88 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOKIT_CSRBLUETOOTHHOSTCONTROLLER_H +#define _IOKIT_CSRBLUETOOTHHOSTCONTROLLER_H + +#include + +class CSRBluetoothHostController : public IOBluetoothHostController +{ + OSDeclareDefaultStructors(CSRBluetoothHostController) + +public: + virtual bool init(IOBluetoothHCIController * family, IOBluetoothHostControllerTransport * transport) APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + virtual bool InitializeController(); +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + virtual IOReturn SetupController(bool * hardReset) APPLE_KEXT_OVERRIDE; +#else + virtual IOReturn SetupController() APPLE_KEXT_OVERRIDE; +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + virtual IOReturn GetOpCodeAndEventCode(UInt8 * inDataPtr, UInt32 inDataSize, BluetoothHCICommandOpCode * outOpCode, BluetoothHCIEventCode * eventCode, BluetoothHCIEventStatus * outStatus, UInt8 *, BluetoothDeviceAddress * outDeviceAddress, BluetoothConnectionHandle * outConnectionHandle, bool *) APPLE_KEXT_OVERRIDE; +#else + virtual IOReturn GetOpCodeAndEventCode(UInt8 * inDataPtr, BluetoothHCICommandOpCode * outOpCode, BluetoothHCIEventCode * eventCode, BluetoothHCIEventStatus * outStatus, UInt8 *, BluetoothDeviceAddress * outDeviceAddress, BluetoothConnectionHandle * outConnectionHandle) APPLE_KEXT_OVERRIDE; +#endif + virtual void ProcessEventDataWL(UInt8 * inDataPtr, UInt32 inDataSize, UInt32 sequenceNumber) APPLE_KEXT_OVERRIDE; + + virtual IOReturn TransportRadioPowerOff(BluetoothHCICommandOpCode opCode, char * processName, int processID, IOBluetoothHCIRequest * request) APPLE_KEXT_OVERRIDE; + + OSMetaClassDeclareReservedUnused(CSRBluetoothHostController, 0); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostController, 1); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostController, 2); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostController, 3); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostController, 4); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostController, 5); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostController, 6); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostController, 7); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostController, 8); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostController, 9); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostController, 10); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostController, 11); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostController, 12); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostController, 13); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostController, 14); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostController, 15); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostController, 16); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostController, 17); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostController, 18); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostController, 19); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostController, 20); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostController, 21); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostController, 22); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostController, 23); +}; + +#endif diff --git a/QualcommWireless/include/IOKit/bluetooth/IOBluetoothACPIMethods.h b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothACPIMethods.h new file mode 100644 index 0000000..b3e81da --- /dev/null +++ b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothACPIMethods.h @@ -0,0 +1,125 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +/*! + * @header IOBluetoothACPIMethods.h + * This header contains the definition of the IOBluetoothACPIMethods class. + */ + +#ifndef _IOKIT_IOBLUETOOTHACPIMETHODS_H +#define _IOKIT_IOBLUETOOTHACPIMETHODS_H + +#include +#include + +class IOBluetoothHCIController; +class IOACPIPlatformDevice; + +class IOBluetoothACPIMethods : public IOService +{ + OSDeclareDefaultStructors(IOBluetoothACPIMethods) + + friend class IOBluetoothHCIController; + friend class IOBluetoothHostControllerTransport; + +public: + bool init(IOService * provider); + virtual void free() APPLE_KEXT_OVERRIDE; + virtual bool start(IOService * provider) APPLE_KEXT_OVERRIDE; + virtual void stop(IOService * provider) APPLE_KEXT_OVERRIDE; + + /*! @function SetBluetoothFamily + * @abstract Sets the mBluetoothFamily member variable. + * @param controller mBluetoothFamily is set to this IOBluetoothHCIController instance. */ + + virtual void SetBluetoothFamily(IOBluetoothHCIController * controller); + + virtual void CheckSpecialGPIO(); + virtual IOReturn SetBTRS(); + virtual IOReturn SetBTPU(); + virtual IOReturn SetBTPD(); + virtual IOReturn SetBTRB(bool, bool *); + virtual IOReturn SetBTLP(bool); + + /*! @function ResetMethodIsAvailable + * @abstract Determines if the Bluetooth ACPI reset method (BTRS) is available. + * @discussion This function is implemented by returning mResetMethodAvailable. + * @result mResetMethodAvailable is returned. */ + + virtual bool ResetMethodIsAvailable(); + + /*! @function ROMBootMethodIsAvailable + * @abstract Determines if the Bluetooth ACPI ROM boot method (BTRB) is available. + * @discussion This function is implemented by returning mROMBootMethodAvailable. + * @result mROMBootMethodAvailable is returned. */ + + virtual bool ROMBootMethodIsAvailable(); + + /*! @function PowerUpMethodIsAvailable + * @abstract Determines if the Bluetooth ACPI power up method (BTPU) is available. + * @discussion This function is implemented by returning mPowerUpMethodAvailable. + * @result mPowerUpMethodAvailable is returned. */ + + virtual bool PowerUpMethodIsAvailable(); + + /*! @function PowerUpMethodIsAvailable + * @abstract Determines if the Bluetooth ACPI power down method (BTPD) is available. + * @discussion This function is implemented by returning mPowerDownMethodAvailable. + * @result mPowerDownMethodAvailable is returned. */ + + virtual bool PowerDownMethodIsAvailable(); + + /*! @function LowPowerMethodIsAvailable + * @abstract Determines if the Bluetooth ACPI low power method (BTLP) is available. + * @discussion This function is implemented by returning mLowPowerMethodAvailable. + * @result mLowPowerMethodAvailable is returned. */ + + virtual bool LowPowerMethodIsAvailable(); + + virtual UInt32 GetCurrentTime(); + + virtual void ConvertErrorCodeToString(UInt32 errorCode, char * outStringLong, char * outStringShort); + +protected: + IOBluetoothHCIController * mBluetoothFamily; // 136 + IOACPIPlatformDevice * mACPIDevice; // 144 + IOService * mProvider; // 152 + + bool mResetMethodAvailable; // 160 BTRS + bool mROMBootMethodAvailable; // 161 BTRB + bool mPowerUpMethodAvailable; // 162 BTPU + bool mPowerDownMethodAvailable; // 163 BTPD + bool mLowPowerMethodAvailable; // 164 BTLP + os_log_t mInternalOSLogObject; // 168 +}; + +#endif diff --git a/QualcommWireless/include/IOKit/bluetooth/IOBluetoothDataQueue.h b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothDataQueue.h new file mode 100644 index 0000000..4623523 --- /dev/null +++ b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothDataQueue.h @@ -0,0 +1,82 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOKIT_IOBLUETOOTHDATAQUEUE_H +#define _IOKIT_IOBLUETOOTHDATAQUEUE_H + +#include +#include + +#ifdef enqueue +#undef enqueue +#endif + +/*! + * @class IOBluetoothDataQueue : public IOSharedDataQueue + * @abstract A generic data queue providing utilities specific to the IOBluetoothFamily. + * @discussion The IOBluetoothDataQueue is a subclass of IOSharedDataQueue that provides some functions that would be used by other IOBluetoothFamily classes. It should be used and only used in this + * family. + */ + +class IOBluetoothDataQueue : public IOSharedDataQueue +{ + OSDeclareDefaultStructors(IOBluetoothDataQueue) + +public: + static IOBluetoothDataQueue * withCapacity(UInt32 size); + static IOBluetoothDataQueue * withEntries(UInt32 numEntries, UInt32 entrySize); + static IOBluetoothDataQueue * withBuffer(void * buffer, UInt32 size); + static IOBluetoothDataQueue * withClientBuffer(mach_vm_address_t address, UInt32 length, task_t task); + + virtual void free() APPLE_KEXT_OVERRIDE; + virtual void sendDataAvailableNotification() APPLE_KEXT_OVERRIDE; + virtual void setNotificationPort(mach_port_t port) APPLE_KEXT_OVERRIDE; + virtual bool setQueueSize(UInt32 size, bool isWithBuffer); + virtual bool initWithCapacity(UInt32 size) APPLE_KEXT_OVERRIDE; + virtual bool initWithBuffer(void * buffer, UInt32 size); + virtual bool initWithClientBuffer(mach_vm_address_t address, UInt32 length, task_t task); + virtual bool enqueue(void * data, UInt32 dataSize) APPLE_KEXT_OVERRIDE; + virtual UInt32 numberOfFreeBlocks(UInt64 offset); + virtual UInt32 freeSpaceInQueue(); + virtual void setDataQueueOwnerName(char * name); + +protected: + bool mInitializedWithBuffer; // 40, determines if the data queue should be freed + char mDataQueueOwnerName[0x30]; // 41 + IOMemoryMap * mMemoryMap; // 96 + IOMemoryDescriptor * mMemoryDescriptor; // 104 + bool mInitializedWithClientBuffer; // 112, will setTag(3) in free if it is true, set to true in initWithClientBuffer + UInt32 mNotifyMsgSize; // 116 +}; + +#endif diff --git a/QualcommWireless/include/IOKit/bluetooth/IOBluetoothHCIController.h b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothHCIController.h new file mode 100644 index 0000000..ce54dde --- /dev/null +++ b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothHCIController.h @@ -0,0 +1,500 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOKIT_IOBLUETOOTHHCICONTROLLER_H +#define _IOKIT_IOBLUETOOTHHCICONTROLLER_H + +#include +#include +#include +#include + +#include + +#ifndef __MAC_OS_X_VERSION_MIN_REQUIRED +#error "Missing macOS target version" +#endif + +class IOACPIPlatformDevice; +class IOWorkQueue; +class IODisplayWrangler; +class IOBluetoothACPIMethods; +class IOBluetoothPacketLogger; +class IOBluetoothHCIPacketLogUserClient; +class IOBluetoothHostController; +class IOBluetoothHostControllerTransport; +class IOBluetoothHostControllerUSBTransport; +class IOBluetoothHostControllerUARTTransport; + +struct BluetoothHardwareListType +{ + IOBluetoothHostControllerTransport * mBluetoothTransport; // 0 + IOBluetoothHostController * mBluetoothHostController; // 8 + bool mFoundWithTransport; // 16 + bool mCreated; // 17 + bool unknown3; // 18 + UInt8 mHardResetCounter; // 19 + UInt8 unknown4; // 20 + BluetoothHardwareListType * mNextHardware; // 24 + BluetoothHardwareListType * mPreviousHardware; // 32 +}; + +struct HCIEventNotificationListener +{ + task_t owningTask; + mach_port_t port; + void * refCon; + UInt64 unknown; // All set to 1 +}; + +#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_15 +struct BluetoothPacketLogData +{ + UInt32 creationTime; + UInt32 packetSize; + UInt8 packetType; +}; +#endif + +IOBLUETOOTH_EXPORT UInt32 IOBluetoothRingBufferRead(UInt32 *, void * outBuffer, UInt32, UInt32); +IOBLUETOOTH_EXPORT UInt32 IOBluetoothRingBufferReadAtOffset(UInt32 *, void *, UInt32, IOByteCount offset, UInt32); +IOBLUETOOTH_EXPORT UInt32 IOBluetoothRingBufferWrite(UInt32 *, void *, UInt32, UInt32); +IOBLUETOOTH_EXPORT UInt32 IOBluetoothRingBufferWriteAtOffset(UInt32 *, void *, UInt32, IOByteCount offset, UInt32); + +extern bool SearchForTransportEventTimeOutOccurred(OSObject * owner, IOTimerEventSource * timer); +extern void FullWakeTimeOutOccurred(OSObject * owner, IOTimerEventSource * timer); +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_11_0 +extern void RecoveryTimeOutOccurred(OSObject * owner, IOTimerEventSource * timer); +#endif + +class IOBluetoothHCIController : public IOService +{ + OSDeclareDefaultStructors(IOBluetoothHCIController) + + friend class IOBluetoothHostController; + friend class IOBluetoothHostControllerTransport; + friend class IOBluetoothHostControllerUSBTransport; + friend class IOBluetoothHostControllerUARTTransport; + +public: + virtual bool init(OSDictionary * dictionary = NULL) APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + virtual bool start(IOService * provider) APPLE_KEXT_OVERRIDE; + virtual void stop(IOService * provider) APPLE_KEXT_OVERRIDE; + static IOReturn stopAction(OSObject * owner, void * arg0, void * arg1, void * arg2, void * arg3); + virtual IOReturn stopWL(IOService * provider); + virtual bool terminate(IOOptionBits options = 0) APPLE_KEXT_OVERRIDE; + static IOReturn terminateAction(OSObject * owner, void * arg0, void * arg1, void * arg2, void * arg3); + virtual IOReturn terminateWL(IOOptionBits options = 0); + + virtual IOReturn newUserClient(task_t owningTask, void * securityID, UInt32 type, LIBKERN_RETURNS_RETAINED IOUserClient ** handler) APPLE_KEXT_OVERRIDE; +#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_15 + virtual IOReturn AddPacketLogUserClient(IOBluetoothHCIPacketLogUserClient * client); +#endif + virtual IOReturn AddCommandUserClient(void * userClient); + virtual void DetachUserClients(); + + virtual IOReturn setProperties(OSObject * properties) APPLE_KEXT_OVERRIDE; + static IOReturn setPropertiesAction(OSObject *, void *, void *, void *, void *); + virtual IOReturn setPropertiesWL(OSObject * properties); + virtual bool ValidProperty(OSSymbol *); + + virtual void terminateServiceNubs(); + virtual bool terminateServiceNubsComplete(); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + static void USBHardResetEntry(OSObject * owner); + static bool PacketLoggerPublishNotificationHandler(void *, void *, IOService *, IONotifier *); + static bool HandlePacketLoggerPublishNotification(void *, IOService *); +#else + static void HardwareResetEntry(OSObject * owner); +#endif + static bool DisplayManagerPublishNotificationHandler(void *, void *, IOService *, IONotifier *); + static bool HandleDisplayManagerPublishNotification(void *, IOService *); + static bool ExternalDisplayTerminateNotificationHandler(void *, void *, IOService *, IONotifier *); + static bool HandleExternalDisplayTerminateNotification(void *, IOService *); + static bool ExternalDisplayPublishNotificationHandler(void *, void *, IOService *, IONotifier *); + static bool HandleExternalDisplayPublishNotification(void *, IOService *); + static bool staticBluetoothTransportGoesAway(void *, void *, IOService *, IONotifier *); + static bool staticBluetoothTransportShowsUp(void *, void *, IOService *, IONotifier *); + + virtual IOReturn AddHCIEventNotification(task_t inOwningTask, mach_port_t inPort, void * refCon); + virtual IOReturn RemoveHCIEventNotification(task_t inOwningTask); + + virtual bool GetNvramPacketLoggerBufferSize(UInt32 *); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_11_0 + virtual bool NeedToWaitForControllerToShowUp(); +#endif + + virtual IOWorkLoop * getWorkLoop() const APPLE_KEXT_OVERRIDE; + virtual IOCommandGate * getCommandGate() const; + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + virtual IOWorkLoop * getUSBHardResetWorkLoop() const; + virtual IOCommandGate * getUSBHardResetCommandGate() const; +#else + virtual bool PacketLogFillBufferedData(IOBluetoothHCIPacketLogUserClient * client); + virtual void PacketLogSetBufferEmptiedFlag(); + virtual void PacketLogClientClosed(IOBluetoothHCIPacketLogUserClient * client); +#endif + virtual void LogPacket(UInt8 packetType, void * packetData, size_t packetSize); +#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_15 + static IOReturn LogPacketAction(OSObject * owner, void * arg0, void * arg1, void * arg2, void * arg3, void * arg4, void * arg5); + virtual void LogPacketData(UInt8 packetType, void * packetData, size_t packetSize); +#endif + + virtual bool shouldOverrideExistingController(IOBluetoothHCIController *, BluetoothHardwareListType *); + virtual IOReturn SwitchToSelectedHostController(UInt32 locationID); + + static IOReturn ProcessBluetoothTransportGoesAwayAction(IOBluetoothHCIController *, UInt8 *, UInt32); + virtual IOReturn ProcessBluetoothTransportGoesAwayActionWL(IOBluetoothHostControllerTransport *); + static IOReturn ProcessBluetoothTransportShowsUpAction(IOBluetoothHCIController *, UInt8 *, UInt32); + virtual IOReturn ProcessBluetoothTransportShowsUpActionWL(IOBluetoothHostControllerTransport *); + + virtual IOReturn SetBluetoothTransportTerminateState(IOBluetoothHostControllerTransport *, UInt8); + virtual IOReturn GetControllerDeviceAddress(IOBluetoothHostController *, BluetoothDeviceAddress *); + + virtual BluetoothHardwareListType * FindFirstBluetoothHardwareHasTransport(); + virtual BluetoothHardwareListType * FindBluetoothHardware(BluetoothDeviceAddress *); + virtual BluetoothHardwareListType * FindBluetoothHardware(UInt16 vendorID, UInt16 productID, UInt32 locationID); + virtual BluetoothHardwareListType * FindBluetoothHardware(IOBluetoothHostController *); + virtual BluetoothHardwareListType * FindBluetoothHardware(IOBluetoothHostControllerTransport *); + virtual BluetoothHardwareListType * FindBluetoothHardware(BluetoothHardwareListType *); + virtual BluetoothHardwareListType * FindBluetoothHardware(UInt32); + + virtual BluetoothHardwareListType * FindInternalBluetoothController(); + + virtual IOReturn AddBluetoothHardware(BluetoothHardwareListType *); + virtual IOReturn RemoveBluetoothHardware(BluetoothHardwareListType *, bool); + virtual IOReturn SwitchBluetoothHardware(BluetoothHardwareListType *); + virtual void PrintBluetoothHardwareList(bool); + + virtual void SearchForTransportEventTimeOutHandler(); + virtual bool WriteActiveControllerInfoToNVRAM(UInt16 productID, UInt16 vendorID, UInt8 * deviceAddress, UInt32 locationID, UInt16 activeConnections); + virtual bool ReadActiveControllerInfoFromNVRAM(UInt16 * productID, UInt16 * vendorID, UInt8 * deviceAddress, UInt32 * locationID, UInt16 * activeConnections); + virtual IOReturn UpdateNVRAMControllerInfo(); + virtual bool WriteInternalControllerInfoToNVRAM(UInt16, UInt16, UInt8 *, UInt32); + virtual bool ReadInternalControllerInfoFromNVRAM(UInt16 *, UInt16 *, UInt8 *, UInt32 *); + virtual IOReturn CreateBluetoothHostControllerObject(BluetoothHardwareListType *); + virtual IOReturn RemoveBluetoothHostControllerObject(BluetoothHardwareListType *); + virtual IOReturn DisableBluetoothHostControllerObject(BluetoothHardwareListType *); + virtual IOReturn EnableBluetoothHostControllerObject(BluetoothHardwareListType *); + + virtual void WakeUpDisplay(); + virtual void FullWakeTimeOutHandler(); + virtual IOReturn StartFullWakeTimer(); + virtual void CancelFullWakeTimer(); + + virtual bool IsTBFCSupported(); + virtual bool IsAnyDevicesTBFCPageCapable(); + virtual bool SupportDeepIdle(); + virtual bool isSystemPortable(); + virtual void SetIdlePolicy(void *, bool); + virtual bool BluetoothRemoteWakeEnabled(); + virtual bool G3StandbySleepWithFileVaultOn(); + + virtual bool SetActiveControllerInfoToPropertyList(UInt16 productID, UInt16 vendorID, UInt8 * deviceAddress, UInt32 locationID, UInt16 activeConnections); + virtual bool AllControllersFinishedSettingUp(); + virtual IOReturn FamilyCommandSleep(void * event, UInt32 milliseconds, char * calledByFunction, bool panicMachine); + virtual UInt32 GetCurrentTime(); + virtual UInt32 ConvertAddressToUInt32(void *); + virtual bool ActiveControllerOnline(); + virtual bool SpecialWakeReason(); + + virtual bool setProperty(const OSSymbol * aKey, OSObject * anObject) APPLE_KEXT_OVERRIDE; + virtual bool setProperty(const OSString * aKey, OSObject * anObject) APPLE_KEXT_OVERRIDE; + virtual bool setProperty(const char * aKey, OSObject * anObject) APPLE_KEXT_OVERRIDE; + virtual bool setProperty(const char * aKey, const char * aString) APPLE_KEXT_OVERRIDE; + virtual bool setProperty(const char * aKey, bool aBoolean) APPLE_KEXT_OVERRIDE; + virtual bool setProperty(const char * aKey, unsigned long long aValue, unsigned int aNumberOfBits) APPLE_KEXT_OVERRIDE; + virtual bool setProperty(const char * aKey, void * bytes, unsigned int length) APPLE_KEXT_OVERRIDE; + + virtual bool SetBluetoothFamilyProperty(const OSSymbol * aKey, OSObject * anObject); + virtual bool SetBluetoothFamilyProperty(const OSString * aKey, OSObject * anObject); + virtual bool SetBluetoothFamilyProperty(const char * aKey, OSObject * anObject); + virtual bool SetBluetoothFamilyProperty(const char * aKey, const char * aString); + virtual bool SetBluetoothFamilyProperty(const char * aKey, bool aBoolean); + virtual bool SetBluetoothFamilyProperty(const char * aKey, unsigned long long aValue, unsigned int aNumberOfBits); + virtual bool SetBluetoothFamilyProperty(const char * aKey, void * bytes, unsigned int length); + + virtual bool UpdateActiveControllerProperties(char *); +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + virtual UInt32 GetNextBluetoothObjectID(); + virtual IOReturn FreeBluetoothObjectID(UInt32); + virtual void CheckACPIMethodsAvailabilities(); +#else + virtual void CheckSpecialGPIO(); + virtual IOReturn SetBTRS(); + virtual IOReturn SetBTPU(); + virtual IOReturn SetBTPD(); + virtual IOReturn SetBTRB(bool); + virtual IOReturn SetBTLP(bool); +#endif + virtual IOReturn CallRegisterService(); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + virtual bool ReachHardResetLimit(IOBluetoothHostController *); + virtual void IncrementHardResetCounter(IOBluetoothHostController *); + virtual void ResetHardResetCounter(IOBluetoothHostController *); + virtual UInt8 GetHardResetCounter(IOBluetoothHostController *); + + virtual IOReturn USBHardReset(); + static IOReturn USBHardResetAction(OSObject * owner, void * arg0, void * arg1, void * arg2, void * arg3); + virtual void USBHardResetWL(); +#else + virtual IOReturn PerformHardwareReset(); + static IOReturn HardwareResetAction(OSObject * owner, void * arg0, void * arg1, void * arg2, void * arg3); + virtual void HardwareResetWL(); +#endif + virtual void ReleaseAllHardResetObjects(); +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + virtual bool FindBroadcomUSBHostDevice(); + virtual bool USBBluetoothModuleWithROMBootCapability(); + virtual IOReturn RecoverX238EModule(BluetoothHardwareListType *); +#else + virtual bool FindBroadcomUSBHostController(); +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_11_0 + virtual void RecoveryTimeOutHandler(); + virtual IOReturn StartRecoveryTimer(); + virtual void CancelRecoveryTimer(); +#endif + + virtual IOReturn DumpStats(); + virtual void BeginSignPost(); + virtual void EndSignPost(); + + virtual void ConvertErrorCodeToString(UInt32 errorCode, char * outStringLong, char * outStringShort); + virtual void ConvertOpCodeToString(UInt16 opCode, char * outString); + virtual void ConvertEventCodeToString(UInt8 eventCode, char * outString); + virtual void ConvertVendorSpecificEventCodeToString(UInt8 eventCode, char * outString); + virtual void ConvertEventStatusToString(UInt8 eventStatus, char * outString); + + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 0); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 1); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 2); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 3); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 4); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 5); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 6); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 7); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 8); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 9); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 10); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 11); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 12); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 13); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 14); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 15); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 16); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 17); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 18); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 19); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 20); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 21); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 22); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 23); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 24); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 25); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 26); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 27); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 28); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 29); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 30); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 31); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 32); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 33); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 34); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 35); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 36); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 37); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 38); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 39); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 40); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 41); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 42); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 43); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 44); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 45); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 46); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 47); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 48); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 49); + OSMetaClassDeclareReservedUnused(IOBluetoothHCIController, 50); + +public: + IOWorkLoop * mWorkLoop; // 136 + IOCommandGate * mCommandGate; // 144 +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + IOWorkLoop * mUSBHardResetWorkLoop; // 152 + IOCommandGate * mUSBHardResetCommandGate; // 160 +#else + OSSet * mPacketLoggerUserClientSet; /// 152 +#endif + OSSet * mCommandUserClientSet; // 168 + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + IOBluetoothPacketLogger * mPacketLogger; // 176 + IONotifier * mPacketLoggerPublishNotifier; // 184 +#else + BluetoothPacketLogData * mPacketLogBuffer; /// 168 + UInt32 mPacketLogBufferSize; /// 176 + OSArray * mLogPackets; /// 184 + UInt32 mMaxNumberOfPreStoredPackets; /// 192 + UInt32 mLogPacketIndex; /// 196 + UInt32 mPacketLogFillDataIndex; /// 200 + bool mNewPacketLogUserClient; /// 204 + bool mPacketLogBufferEmptied; /// 205 +#endif + + IODisplayWrangler * mDisplayManager; // 192 + IONotifier * mDisplayManagerPublishNotifier; // 200 + IONotifier * mExternalDisplayPublishNotifier; // 208 + IONotifier * mExternalDisplayTerminateNotifier; // 216 + + bool mSearchForTransportEventTimerHasTimeout; // 224 + IOTimerEventSource * mSearchForTransportEventTimer; // 232 + bool mFullWakeWithAppleExternalDisplay; // 240 + bool mExternalDisplayPublished; // 241 + + HCIEventNotificationListener * mHCIEventListenersList; // 248 + IOByteCount mHCIEventListenersListSize; // 256 + bool mDebugMode; // 264 + + IOWorkQueue * mFamilyWorkQueue; // 272 + IOWorkQueue * mExternalControllerWorkQueue; // 280 +#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_15 + IOWorkQueue * mLogPacketWorkQueue; /// 304 +#endif + + BluetoothHardwareListType * mBluetoothHardwareListHead; // 288 + BluetoothHardwareListType * mBluetoothHardwareListTail; // 296 + BluetoothHardwareListType * mActiveBluetoothHardware; // 304 + BluetoothHardwareListType * mActiveControllerBluetoothHardware; // 312 + BluetoothHardwareListType * mActiveTransportBluetoothHardware; // 320 + + IONotifier * mBluetoothTransportShowsUpNotifier; // 328 + IONotifier * mBluetoothTransportGoesAwayNotifier; // 336 + bool mReceivedTransportNotification; // 344 + + UInt16 mActiveControllerProductID; // 346 + UInt16 mActiveControllerVendorID; // 348 + BluetoothDeviceAddress mActiveControllerAddress; // 350 + UInt32 mActiveControllerLocationID; // 356 + UInt16 mActiveControllerActiveConnections; // 360 + bool mActiveControllerValid; // 362 + + UInt16 mInternalControllerProductID; // 364 + UInt16 mInternalControllerVendorID; // 366 + BluetoothDeviceAddress mInternalControllerAddress; // 368 + UInt32 mInternalControllerLocationID; // 376 + bool mInternalControllerValid; // 380 + + bool mControllersFinishedSettingUp; // 381 + bool __reserved; // 382, never used + bool mSwitchingHostController; // 383 + bool mNVRAMControllerInfoUpdated; // 384 + UInt32 mCheckACPIMethodsAvailabilitiesCallTime; // 388 + bool mUserClientsAttached; // 392 + IOOptionBits mTransportPowerStateOptions; // 396 + UInt16 mNumCommandSleepsInWorkLoop; // 400, +1 when commandSleep is called in FamilyCommandSleep and -1 when it's done + + UInt32 mActivityTickleCallTime; // 404 + IOTimerEventSource * mFullWakeTimer; // 408 + bool mFullWakeTimerHasTimeout; // 416 + bool mFullWakeTimerStarted; // 417 + bool mSignPostSupported; // 418 + bool mSignPostStarted; // 419 + + os_log_t mInternalOSLogObject; // 424 + bool mCanPowerOn; // 432 + +#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_14 + IOACPIPlatformDevice * mACPIDevice; /// 464 + bool SupportBTRS; /// 472 + bool SupportBTRB; /// 473 + bool mSupportBTPU; /// 474 + bool mSupportBTPD; /// 475 + bool mSupportBTLP; /// 476 +#endif + + bool mBootFromROM; // 433 + bool mBTGPIOResult; // 434, BTRB result + bool mRegisterServiceCalled; // 435 + + thread_call_t mHardResetThreadCall; // 440 + UInt32 mUSBHardResetWLCallTime; // 448 + + bool mTestNotRespondingHardReset; // 452 + bool mTestHCICommandTimeoutHardReset; // 453 +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + bool unknown1; // 454, see DispatchHardwareResetTest + bool mTestNoHardResetWhenSleepCommandTimeout; // 455 + bool mTestHCICommandTimeoutWhenWake; // 456 + bool unknown2; // 457 +#endif + UInt8 mNumHardResetRetries; // 458 + IOBluetoothHostControllerUSBTransport * mHardResetUSBTransport; // 464 + IOUSBHostDevice * mHardResetUSBHostDevice; // 472 + IOUSBHostDevice * mHardResetUSBHub; // 480 + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + IOBluetoothACPIMethods * mACPIMethods; // 488 +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_11_0 + IOTimerEventSource * mRecoveryTimer; // 496 + bool mRecoveryTimerHasTimeout; // 504 +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + UInt16 mCurrentBluetoothObjectID; // 506 + bool mBluetoothObjects[0xFFFF]; // 508 + IOLock * mBluetoothObjectsLock; // 66048 + UInt8 mNumHCIEventListeners; // 66056 +#endif +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + bool mNotTriedToRecoverX238EModule; // 66057 +#endif + + struct ExpansionData + { + void * mUnusedPointer1; + void * mUnusedPointer2; + }; + ExpansionData * mExpansionData; // 66064 +}; + +#endif diff --git a/QualcommWireless/include/IOKit/bluetooth/IOBluetoothHCIRequest.h b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothHCIRequest.h new file mode 100644 index 0000000..d391141 --- /dev/null +++ b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothHCIRequest.h @@ -0,0 +1,176 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef __IOKIT_IOBLUETOOTHHCIREQUEST_H +#define __IOKIT_IOBLUETOOTHHCIREQUEST_H + +#include +#include +#include +#include +#import + +// Forward declaration to avoid the need to include IOBluetoothHCIUserLibShared.h +typedef struct BluetoothHCINotificationMessage BluetoothHCINotificationMessage; + +enum +{ + kMaxHCIBufferLength = 512 +}; + +typedef UInt8 BluetoothHCIRequestState; + +/*! @enum BluetoothHCIRequestStates + @abstract States of Bluetooth HCI Requests + @constant kHCIRequestStateIdle Doing nothing - neither waiting nor busy. usually waiting for deletion. + @constant kHCIRequestStateWaiting On the wait queue - request has not been processed in any way. + @constant kHCIRequestStateBusy On the busy queue - request is sent and is currently processing +*/ + +enum BluetoothHCIRequestStates +{ + kHCIRequestStateIdle = 0, + kHCIRequestStateWaiting = 1, + kHCIRequestStateBusy = 2, + kHCIRequestStateEnd +}; + +IOBLUETOOTH_EXPORT IOReturn ParseHCIEvent(UInt8 * inData, UInt32 inDataSize, UInt8 * outData, UInt32 * outDataSize, UInt8 * outStatus); +IOBLUETOOTH_EXPORT IOReturn DecodeHCICommandResult(UInt16 opCode, UInt8 * inData, UInt32 inDataSize, UInt8 * outData, UInt32 * outDataSize, UInt8 * outStatus); +IOBLUETOOTH_EXPORT IOReturn ParseLinkControlGroupCommand(UInt16 ocf, UInt8 * inData, UInt32 inDataSize, UInt8 * outData, UInt32 * outDataSize, UInt8 * outStatus); +IOBLUETOOTH_EXPORT IOReturn ParseLinkPolicyGroupCommand(UInt16 ocf, UInt8 * inData, UInt32 inDataSize, UInt8 * outData, UInt32 * outDataSize, UInt8 * outStatus); +IOBLUETOOTH_EXPORT IOReturn ParseHostControllerGroupCommand(UInt16 ocf, UInt8 * inData, UInt32 inDataSize, UInt8 * outData, UInt32 * outDataSize, UInt8 * outStatus); +IOBLUETOOTH_EXPORT IOReturn ParseInformationalGroupCommand(UInt16 ocf, UInt8 * inData, UInt32 inDataSize, UInt8 * outData, UInt32 * outDataSize, UInt8 * outStatus); +IOBLUETOOTH_EXPORT IOReturn ParseStatusGroupCommand(UInt16 ocf, UInt8 * inData, UInt32 inDataSize, UInt8 * outData, UInt32 * outDataSize, UInt8 * outStatus); +IOBLUETOOTH_EXPORT IOReturn ParseTestingGroupCommand(UInt16 ocf, UInt8 * inData, UInt32 inDataSize, UInt8 * outData, UInt32 * outDataSize, UInt8 * outStatus); +IOBLUETOOTH_EXPORT IOReturn ParseVendorSpecificCommand(UInt16 ocf, UInt8 * inData, UInt32 inDataSize, UInt8 * outData, UInt32 * outDataSize, UInt8 * outStatus); + +class IOBluetoothHCIRequest : public OSObject +{ + OSDeclareDefaultStructors(IOBluetoothHCIRequest) + +public: + static IOBluetoothHCIRequest * Create(IOCommandGate * commandGate, IOBluetoothHostController * hostController, bool async = true, UInt32 timeout = 5, UInt32 controlFlags = 0); + static IOReturn Dispose(IOBluetoothHCIRequest * inObject); + IOReturn DisposeRequest(); + + bool init(IOCommandGate * commandGate, IOBluetoothHostController * hostController); + void InitializeRequest(); + virtual void free() APPLE_KEXT_OVERRIDE; + virtual void retain() const APPLE_KEXT_OVERRIDE; + void RetainRequest(char * name); + virtual void release() const APPLE_KEXT_OVERRIDE; + void ReleaseRequest(char * name); + + const char * RequestDescription(const char * name); + + IOReturn Start(); // Called when a request is started on a transport + void Complete(); // Called when a request is completed on a transport + + void SetState(BluetoothHCIRequestState inState); + + void SetCallbackInfo(BluetoothHCIRequestCallbackInfo * inInfo); + void SetCallbackInfoToZero(); + + void SetResultsDataSize(IOByteCount inCount); + void SetResultsBufferPtrAndSize(UInt8 * resultsBuffer, IOByteCount inSize); + void CopyDataIntoResultsPtr(UInt8 * inDataPtr, IOByteCount inSize); + UInt8 * GetResultsBuffer(); + IOByteCount GetResultsBufferSize(); + + BluetoothHCICommandOpCode GetCommandOpCode(); + + void StartTimer(); + + static void timerFired(OSObject * owner, IOTimerEventSource * sender); + void handleTimeout(); + + UInt32 GetCurrentTime(); + void SetStartTimeForDelete(); + + bool CompareDeviceAddress(const BluetoothDeviceAddress * inDeviceAddress); + +protected: + UInt8 mPrivateResultsBuffer[kMaxHCIBufferLength * 4]; // Just in case they didn't give a results ptr. 12 + IOByteCount mPrivateResultsSize; // Result size. 2064 + BluetoothHCITransportID mTransportID; // Transport ID to use for this request. 2072 + +public: + BluetoothHCIRequestState mState; // Busy, waiting, idle. 2076 + bool mAsyncNotify; // 2077 + task_t mOwningTaskID; // 2080 + BluetoothHCIRequestCallbackInfo mCallbackInfo; // When this request is complete, call this. 2088 + BluetoothHCICommandOpCode mOpCode; // 2128 + BluetoothDeviceAddress mDeviceAddress; // 2130 + BluetoothConnectionHandle mConnectionHandle; // 2136 + BluetoothHCINotificationMessage * mNotificationMessage; // 2144 + IOByteCount mNotificationMessageSize; // 2152 + + IOBluetoothHCIRequest * mNextBusy; // Points to next request element on busy queue. 2160 + IOBluetoothHCIRequest * mNextWait; // Points to next request element on wait queue. 2168 + IOBluetoothHCIRequest * mNextAllocated; // Points to next allocated request element. 2176 + IOBluetoothHCIRequest * mPreviousAllocated; // Points to next allocated request element. 2184 + BluetoothHCIRequestID mID; // For internal identification. 2192 + UInt8 mCommandBuffer[kMaxHCIBufferLength]; // Built-up HCI Command to send to the transport. 2196 + IOByteCount mCommandBufferSize; // Size of command buffer. 2712 + + UInt8 * mResultsPtr; // Result ptr, provided by object creator. 2720 + IOByteCount mResultsSize; // Result size. 2728 + + IOCommandGate * mCommandGate; // 2736 + IOTimerEventSource * mTimer; // 2744 + IOBluetoothHostController * mHostController; // 2752 + + IOReturn mStatus; // Success/failure code of request. 2760 + UInt32 mTimeout; // Timeout for request to complete, in milliseconds. 2764 + UInt32 mOriginalTimeout; // 2768 + UInt32 mControlFlags; // 2772 + int mPID; // Creating Task 2776 + bool mHCIRequestDeleteWasCalled; // Fixed rdar://problem/7044168 2780 + UInt32 mStartTimeForDelete; // 2784 + + // Require and Receive Events + + bool unknown; // 2788 + UInt32 mExpectedEvent; // 2792 + UInt8 mNumberOfExpectedExplicitCompleteEvents; // 2796 + UInt32 mExpectedExplicitCompleteEvents[5]; // 2800 + + UInt32 mReceivedEvent; // 2820 + UInt8 mExplictCompleteEvent; // 2824 + UInt32 mNumberOfPossibleIntermediateEvents; // 2828 + UInt32 mPossibleIntermediateEvents[5]; // 2832 + UInt32 mReceivedIntermediateEvents[5]; // 2852 +}; + +#endif diff --git a/QualcommWireless/include/IOKit/bluetooth/IOBluetoothHIDDriver.h b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothHIDDriver.h new file mode 100644 index 0000000..b27f7fa --- /dev/null +++ b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothHIDDriver.h @@ -0,0 +1,296 @@ +/* + * Copyright (c) 2021 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/*! + * @header IOBluetoothHIDDriver.h + * This header contains the definition of the IOBluetoothHIDDriver class, which is the driver for generic Bluetooth HID devices. It is a direct subclass of IOHIDDevice. + */ + +#ifndef _IOKIT_IOBLUETOOTHHIDDRIVER_H +#define _IOKIT_IOBLUETOOTHHIDDRIVER_H + +#import +#import + +#import + +#define kBSKernelMonitor2Notification 'bsk2' + +class IOTimerEventSource; +class IOWorkLoop; + +class IOBluetoothL2CAPChannel; +class IOBluetoothDevice; +class IOWorkQueue; + +class IOBluetoothHIDDriver : public IOHIDDevice +{ + OSDeclareDefaultStructors(IOBluetoothHIDDriver) + +protected: + IOWorkLoop * _workLoop; + IOCommandGate * _commandGate; + + IOWorkQueue * _desyncWorkQueue; + + IOBluetoothL2CAPChannel * _controlChannel; + IOBluetoothL2CAPChannel * _interruptChannel; + + IOBluetoothDevice * _device; + + IOMemoryDescriptor * _memDescriptor; + IOMemoryDescriptor * _getReportDescriptor; + IONotifier * _interruptOpenNotification; + IOTimerEventSource * _timer; + IONotifier * _sleepWakeNotifier; + + bool _deviceReady; + + UInt8 _expectedReportID; + UInt8 _expectedReportType; + UInt8 _handshake; + + OSDictionary * _deviceProperties; + + UInt16 _vendorIDSource; + UInt16 _vendorID; + UInt16 _productID; + UInt16 _deviceVersion; + uint32_t _classOfDevice; + UInt16 _countryCode; + + BluetoothDeviceAddress _deviceAddress; + char _deviceAddressString[20]; + + uint32_t _outstandingIO; + bool _sendOutstanding; + + // Debug / Behavior Modifiers + UInt8 _verboseLevel; + bool _logPackets; + bool _decodePackets; + bool _logOutstandingIO; + bool _suppressDisconnectNotifications; + bool _suppressSetProtocol; + bool _driverIsAwake; + bool _reservedFlag4; + UInt8 _reservedByte; + + struct ExpansionData + { + OSArray * _sendQueue; + + uint8_t * interruptBuffer; + uint32_t interruptBufferUsed; + + uint8_t * controlBuffer; + uint32_t controlBufferUsed; + + uint8_t deviceSupportsSuspend; + + uint32_t getReportTimeoutMS; + uint32_t setReportTimeoutMS; + + uint32_t outstandingMemoryBlockCount; + bool waitingForMemoryBlockCount; + + IOPMrootDomain * fRootDomain; + IOPMDriverAssertionID fNoDeepSleepAssertionId; + + bool mCommandGateCreated; + bool mCommandGateAdded; + bool mControlChannelRetained; + bool mWorkLoopRetained; + + bool mCloseDownServicesCalled; + + bool mGotNoDeepSleepAssertionID; + + OSString * disconnectionNotificationString; + OSString * connectionNotificationString; + + IOTimerEventSource * deviceConnectTimer; + + bool mNeedToDropData; + + UInt32 mWakeTime; + + UInt32 mDriverLoadTime; + + IOTimerEventSource * mReadyToSleepTimer; + + bool mHandleStopBeingCalled; + + bool mHandleStartCompleted; + + bool mHIDSuspendSent; + + IOReturn mExitHIDSuspendResult; + }; + ExpansionData * _expansionData; + +public: + // Standard IOService Methods + virtual IOService * probe(IOService * provider, SInt32 * score) APPLE_KEXT_OVERRIDE; + virtual bool init(OSDictionary * properties) APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + virtual bool willTerminate(IOService * provider, IOOptionBits options) APPLE_KEXT_OVERRIDE; + + // Starting & Stopping + virtual bool handleStart(IOService * provider) APPLE_KEXT_OVERRIDE; + virtual void handleStop(IOService * provider) APPLE_KEXT_OVERRIDE; + virtual void deviceReady(); + virtual void closeDownServices(); + + // Power Management + virtual void handleSleep(); + virtual void handleWake(); + virtual void handleShutdown(); // Does nothing + virtual void handleRestart(); // Does nothing + + // HID Properties + virtual OSString * newTransportString() const APPLE_KEXT_OVERRIDE; + virtual OSString * newManufacturerString() const APPLE_KEXT_OVERRIDE; + virtual OSString * newProductString() const APPLE_KEXT_OVERRIDE; + virtual OSNumber * newVendorIDSourceNumber() const APPLE_KEXT_OVERRIDE; + virtual OSNumber * newVendorIDNumber() const APPLE_KEXT_OVERRIDE; + virtual OSNumber * newProductIDNumber() const APPLE_KEXT_OVERRIDE; + virtual OSNumber * newVersionNumber() const APPLE_KEXT_OVERRIDE; + virtual IOReturn newReportDescriptor(IOMemoryDescriptor ** descriptor) const APPLE_KEXT_OVERRIDE; + virtual OSString * newSerialNumberString() const APPLE_KEXT_OVERRIDE; + virtual OSNumber * newLocationIDNumber() const APPLE_KEXT_OVERRIDE; + virtual OSNumber * newCountryCodeNumber() const APPLE_KEXT_OVERRIDE; + virtual OSNumber * newReportIntervalNumber() const APPLE_KEXT_OVERRIDE; + + // Main UserLand Entry Points + virtual IOReturn getReport(IOMemoryDescriptor * report, IOHIDReportType reportType, IOOptionBits options = 0) APPLE_KEXT_OVERRIDE; + virtual IOReturn setReport(IOMemoryDescriptor * report, IOHIDReportType reportType, IOOptionBits options = 0) APPLE_KEXT_OVERRIDE; + virtual IOReturn setProperties(OSObject * properties) APPLE_KEXT_OVERRIDE; + + // General IO + virtual IOReturn sendData(IOBluetoothL2CAPChannel * theChannel, void * theData, IOByteCount theSize); + virtual void processControlData(UInt8 * buffer, UInt16 length); + virtual void processInterruptData(UInt8 * buffer, UInt16 length); + virtual IOReturn waitForData(IOMemoryDescriptor * report, UInt8 btReportType, UInt8 reportID); + virtual IOReturn waitForHandshake(); + + // HID Transaction Methods + virtual IOReturn hidControl(UInt8 controlOperation); + virtual int getProtocol(); + virtual IOReturn setProtocol(UInt8 protocol); + virtual int getIdle(); + virtual IOReturn setIdle(UInt8 idleRate); + + // Device Introspection + virtual bool isKeyboard(); + virtual bool isMouse(); + + // Misc + virtual IOReturn setPowerState(unsigned long powerStateOrdinal, IOService * whatDevice) APPLE_KEXT_OVERRIDE; + virtual IOReturn createCommandGate(IOService * provider); + virtual IOReturn getDeviceProperties(IOService * provider); + virtual bool readDeviceName(); + + // Command Gate Actions + static IOReturn staticCloseDownServicesAction(OSObject * owner, void * arg1, void * arg2, void * arg3, void * arg4); + static IOReturn staticSendToAction(OSObject * owner, void * theChannel, void * theData, void * theSize, void *); + static IOReturn staticPrepControlChannelAction(OSObject * owner, void * arg1, void * arg2, void * arg3, void * arg4); + static IOReturn staticInterruptChannelOpeningAction(OSObject * owner, void * newService, void * arg2, void * arg3, void * arg4); + static IOReturn staticWillTerminateAction(OSObject * owner, void * arg1, void * arg2, void * arg3, void * arg4); + + // Work Loop Methods + virtual void closeDownServicesWL(); + virtual IOReturn prepInterruptChannelWL(); + virtual IOReturn getReportWL(IOMemoryDescriptor * report, IOHIDReportType reportType, IOOptionBits options); + virtual IOReturn setReportWL(IOMemoryDescriptor * report, IOHIDReportType reportType, IOOptionBits options); + virtual IOReturn processCommandWL(OSString * command, OSNumber * commandParameter); + virtual IOReturn getDevicePropertiesWL(IOService * provider); + virtual IOReturn interruptChannelOpeningWL(IOBluetoothL2CAPChannel * theChannel); + + // Timeout Handler + static void deviceConnectTimerFired(OSObject * owner, IOTimerEventSource * sender); + static void timerFired(OSObject * owner, IOTimerEventSource * sender); + virtual void handleTimeout(); + + // IO Counting + virtual void incrementOutstandingIO(); + virtual void decrementOutstandingIO(); + + // ReadyToSleepTimeout Handler + static void ReadyToSleepTimerFired(OSObject * owner, IOTimerEventSource * sender); + +private: + // Lazy Interrupt Channel Methods + static bool interruptChannelOpeningCallback(void * me, void * ignoreMe, IOService * newService, IONotifier * notifier); + static IOReturn powerStateHandler(void * target, void * refCon, UInt32 messageType, IOService * service, void * messageArgument, vm_size_t argSize); + +public: + OSMetaClassDeclareReservedUsed(IOBluetoothHIDDriver, 0); + virtual void sendDeviceDisconnectNotifications(); + + OSMetaClassDeclareReservedUsed(IOBluetoothHIDDriver, 1); + virtual IOReturn setPowerStateWL(unsigned long powerStateOrdinal, IOService * whatDevice); + + OSMetaClassDeclareReservedUsed(IOBluetoothHIDDriver, 2); + virtual void sendDeviceConnectNotifications(); + + OSMetaClassDeclareReservedUsed(IOBluetoothHIDDriver, 3); + virtual void decrementOutstandingMemoryBlockCount(); + + OSMetaClassDeclareReservedUsed(IOBluetoothHIDDriver, 4); + virtual IOReturn willTerminateWL(); + + OSMetaClassDeclareReservedUsed(IOBluetoothHIDDriver, 5); + virtual void messageClientsWithString(UInt32 type, OSString * message); + + OSMetaClassDeclareReservedUsed(IOBluetoothHIDDriver, 6); + virtual void waitForInterruptChannel(); + + OSMetaClassDeclareReservedUsed(IOBluetoothHIDDriver, 7); + virtual void handleStopWL(IOService * provider); + + OSMetaClassDeclareReservedUsed(IOBluetoothHIDDriver, 8); + virtual UInt32 GetCurrentTime(); + + OSMetaClassDeclareReservedUsed(IOBluetoothHIDDriver, 9); + virtual void handleReadyToSleepTimerFired(); + + OSMetaClassDeclareReservedUsed(IOBluetoothHIDDriver, 10); + virtual IOReturn HIDCommandSleep(void * event, UInt32 milliseconds, char * calledByFunction, bool panicMachine); + + OSMetaClassDeclareReservedUnused(IOBluetoothHIDDriver, 11); + OSMetaClassDeclareReservedUnused(IOBluetoothHIDDriver, 12); + OSMetaClassDeclareReservedUnused(IOBluetoothHIDDriver, 13); + OSMetaClassDeclareReservedUnused(IOBluetoothHIDDriver, 14); + OSMetaClassDeclareReservedUnused(IOBluetoothHIDDriver, 15); + OSMetaClassDeclareReservedUnused(IOBluetoothHIDDriver, 16); + OSMetaClassDeclareReservedUnused(IOBluetoothHIDDriver, 17); + OSMetaClassDeclareReservedUnused(IOBluetoothHIDDriver, 18); + OSMetaClassDeclareReservedUnused(IOBluetoothHIDDriver, 19); +}; + +#endif diff --git a/QualcommWireless/include/IOKit/bluetooth/IOBluetoothHIDDriverTypes.h b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothHIDDriverTypes.h new file mode 100644 index 0000000..43f5f48 --- /dev/null +++ b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothHIDDriverTypes.h @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2021 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/*! + * @header IOBluetoothHIDDriverTypes.h + * This header contains enumerations for IOBluetoothHIDDriver. + */ + +#pragma once + +// Vendor ID Sources +enum +{ + kVendorIDSourceBluetoothSIG = 0x1, + kVendorIDSourceUSBIF = 0x2 +}; + +// Bluetooth HID Transaction Headers +enum +{ + kBluetoothHIDTransactionHandshakeHeader = 0x00, + kBluetoothHIDTransactionHIDControlHeader = 0x10, + kBluetoothHIDTransactionGetReportHeader = 0x40, + kBluetoothHIDTransactionSetReportHeader = 0x50, + kBluetoothHIDTransactionGetProtocolHeader = 0x60, + kBluetoothHIDTransactionSetProtocolHeader = 0x70, + kBluetoothHIDTransactionGetIdleHeader = 0x80, + kBluetoothHIDTransactionSetIdleHeader = 0x90, + kBluetoothHIDTransactionDataHeader = 0xA0, + kBluetoothHIDTransactionDatcHeader = 0xB0 +}; + +// Handshake Types +enum +{ + kBluetoothHandshakeTypeSuccessful = 0x0, + kBluetoothHandshakeTypeNotReady = 0x1, + kBluetoothHandshakeTypeInvalidReportID = 0x2, + kBluetoothHandshakeTypeUnsupportedRequest = 0x3, + kBluetoothHandshakeTypeInvalidParameter = 0x4, + kBluetoothHandshakeTypeErrorUnknown = 0xD, + kBluetoothHandshakeTypeErrorFatal = 0xF +}; + +// HID Control Types +enum +{ + kBluetoothHIDControlTypeNoOperation = 0x0, + kBluetoothHIDControlTypeHardReset = 0x1, + kBluetoothHIDControlTypeSoftRest = 0x2, + kBluetoothHIDControlTypeSuspend = 0x3, + kBluetoothHIDControlTypeExitSuspend = 0x4, + kBluetoothHIDControlTypeVCUnplug = 0x5 +}; + +// Report Types +enum +{ + kBluetoothReportTypeReserved = 0x0, + kBluetoothReportTypeOther = 0x0, + kBluetoothReportTypeInput = 0x1, + kBluetoothReportTypeOutput = 0x2, + kBluetoothReportTypeFeature = 0x3 +}; + +// Protocol Types +enum +{ + kBluetoothProtocolTypeBoot = 0x0, + kBluetoothProtocolTypeReport = 0x1 +}; diff --git a/QualcommWireless/include/IOKit/bluetooth/IOBluetoothHostController.h b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothHostController.h new file mode 100644 index 0000000..ee94d0a --- /dev/null +++ b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothHostController.h @@ -0,0 +1,1089 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOKIT_IOBLUETOOTHHOSTCONTROLLER_H +#define _IOKIT_IOBLUETOOTHHOSTCONTROLLER_H + +#include +#include +#include +#include +#include + +#include + +#ifndef __MAC_OS_X_VERSION_MIN_REQUIRED +#error "Missing macOS target version" +#endif + +class IOBluetoothHostControllerUserClient; +class IOBluetoothHostControllerTransport; +class IOBluetoothHCIController; +class IOBluetoothHCIRequest; +class IOWorkQueue; +class IOReportLegend; +class IOStateReporter; +class IOSimpleReporter; +class IOBluetoothDevice; +class IOBluetoothInactivityTimerEventSource; +class IOBluetoothACLMemoryDescriptor; +class IOBluetoothSCOMemoryDescriptorRetainer; + +struct BluetoothDeviceReporter; +struct BluetoothBroadcomBFCReconnectData; +struct BluetoothBroadcomBFCParams; +struct BluetoothBroadcomBFCRemoteBPCSFeatures; +struct BluetoothBroadcomLocalFirmwareInfo; +struct BluetoothBroadcomSetEventMask; +struct BluetoothBroadcomBFCConnectionTBFCSuspendedInfo; +struct BluetoothBroadcomVerboseConfigVersionInfo; + +enum +{ + kRadioPowerInitialState = 0, + kRadioPoweringOff = 1, + kRadioPoweringOn = 2, + kRadioPoweredOff = 3, + kRadioPoweredOn = 4, + kRadioPowerError = 5 +}; + +typedef uint16_t DevicePublishNotificationStateType; +enum DevicePublishNotificationStateTypes +{ + kHasNotRegisteredForDevicePublishNotification = 0x0001, + kHasRegisteredForDevicePublishNotification = 0x0002, + kDevicePublishNotificationCalled = 0x0004, + kDevicePublishNotificationProcessed = 0x0008 +}; + +typedef UInt32 HCIDataHandlerType; +enum HCIDataHandlerTypes +{ + kTransportDataTypeHCIEvents, + kTransportDataTypeACL, + kTransportDataTypeSCO +}; + +typedef struct HearingDeviceListType +{ + BluetoothDeviceAddress mDeviceAddress; + bool mRemoveDeviceCalled; + DevicePublishNotificationStateType mDevicePublishNotificationState; + HearingDeviceListType * mNextDevice; + HearingDeviceListType * mPreviousDevice; +} HearingDeviceListType; + +typedef struct LEDeviceListType +{ + BluetoothConnectionHandle mConnectionHandle; + bool unknown; + LEDeviceListType * mNextDevice; + LEDeviceListType * mPreviousDevice; +} BluetoothLEDevice; + +struct BluetoothHCIACLPacket +{ + IOMemoryDescriptor * descriptor; + IOBluetoothDevice * device; + BluetoothHCIACLPacket * nextPacket; +}; + +IOBLUETOOTH_EXPORT long PackData( void * inBuffer, UInt32 inDataSize, const char * inFormat, ... ); +IOBLUETOOTH_EXPORT long PackDataList( void * inBuffer, UInt32 inDataSize, const char * inFormat, va_list inArgs ); +IOBLUETOOTH_EXPORT long UnpackData( IOByteCount inBufferSize, const void * inBuffer, const char * inFormat, ... ); +IOBLUETOOTH_EXPORT long UnpackDataList( IOByteCount inBufferSize, const void * inBuffer, const char * inFormat, va_list inArgs ); + +class IOBluetoothHostController : public IOService +{ + OSDeclareDefaultStructors(IOBluetoothHostController) + + typedef IOReturn (*IOBluetoothIncomingDataAction)(IOBluetoothHostController * hostController, UInt8 * inDataPtr, UInt32 inDataSize, UInt32 inSequenceNumber); + + friend class IOBluetoothHCIRequest; + friend class IOBluetoothHCIController; + friend class IOBluetoothHostControllerTransport; + friend class IOBluetoothHostControllerUSBTransport; + friend class IOBluetoothHostControllerUARTTransport; + +public: + virtual IOReturn newUserClient(task_t owningTask, void * securityID, UInt32 type, IOUserClient ** handler) APPLE_KEXT_OVERRIDE; + virtual IOReturn AddUserClient(void *); + virtual void DetachUserClients(); + + virtual bool InitializeVariables(IOBluetoothHostControllerTransport * transport); + virtual bool init(IOBluetoothHCIController * family, IOBluetoothHostControllerTransport * transport); + virtual void free() APPLE_KEXT_OVERRIDE; + + virtual bool SetVariables(); + virtual void Enable(IOBluetoothHostControllerTransport * transport); + virtual void Disable(); + virtual void StopAndFreeVariables(); + + virtual bool start(IOService * provider) APPLE_KEXT_OVERRIDE; + virtual void stop(IOService * provider) APPLE_KEXT_OVERRIDE; + static IOReturn stopAction(OSObject * owner, void * arg1, void * arg2, void * arg3, void * arg4); + virtual IOReturn stopWL(IOService * provider); + + virtual bool terminate(IOOptionBits options = 0) APPLE_KEXT_OVERRIDE; + static IOReturn terminateAction(OSObject * owner, void * arg1, void * arg2, void * arg3, void * arg4); + virtual IOReturn terminateWL(IOOptionBits options = 0); + + virtual IOReturn setProperties(OSObject * properties) APPLE_KEXT_OVERRIDE; + static IOReturn setPropertiesAction(OSObject * owner, void * arg1, void * arg2, void * arg3, void * arg4); + virtual IOReturn setPropertiesWL(OSObject * properties); + + virtual bool setProperty(const OSSymbol * aKey, OSObject * anObject) APPLE_KEXT_OVERRIDE; + virtual bool setProperty(const OSString * aKey, OSObject * anObject) APPLE_KEXT_OVERRIDE; + virtual bool setProperty(const char * aKey, OSObject * anObject) APPLE_KEXT_OVERRIDE; + virtual bool setProperty(const char * aKey, const char * aString) APPLE_KEXT_OVERRIDE; + virtual bool setProperty(const char * aKey, bool aBoolean) APPLE_KEXT_OVERRIDE; + virtual bool setProperty(const char * aKey, unsigned long long aValue, unsigned int aNumberOfBits) APPLE_KEXT_OVERRIDE; + virtual bool setProperty(const char * aKey, void * bytes, unsigned int length) APPLE_KEXT_OVERRIDE; + + virtual bool SetBluetoothControllerProperty(const OSSymbol * aKey, OSObject * anObject); + virtual bool SetBluetoothControllerProperty(const OSString * aKey, OSObject * anObject); + virtual bool SetBluetoothControllerProperty(const char * aKey, OSObject * anObject); + virtual bool SetBluetoothControllerProperty(const char * aKey, const char * aString); + virtual bool SetBluetoothControllerProperty(const char * aKey, bool aBoolean); + virtual bool SetBluetoothControllerProperty(const char * aKey, unsigned long long aValue, unsigned int aNumberOfBits); + virtual bool SetBluetoothControllerProperty(const char * aKey, void * bytes, unsigned int length); + + virtual IOWorkLoop * getWorkLoop() const APPLE_KEXT_OVERRIDE; + virtual IOCommandGate * getCommandGate() const; + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + virtual void BroadcastEventNotification(BluetoothHCIRequestID inID, BluetoothHCIEventCode inEventCode, IOReturn eventStatus, UInt8 * inDataToSendPtr, IOByteCount inDataSize, BluetoothHCICommandOpCode inOpCode, bool, UInt8); + virtual void BroadcastNotification(UInt32 type, IOBluetoothHCIControllerConfigState oldState, IOBluetoothHCIControllerConfigState newState); +#else + virtual void BroadcastEventNotification(BluetoothHCIRequestID inID, BluetoothHCIEventCode inEventCode, IOReturn eventStatus, UInt8 * inDataToSendPtr, IOByteCount inDataSize, BluetoothHCICommandOpCode inOpCode); + virtual void BroadcastConfigStateChangeNotification(IOBluetoothHCIControllerConfigState oldState, IOBluetoothHCIControllerConfigState newState); + virtual void BroadcastWoBTReconnectionNotification(); + virtual void BroadcastCommandTimeoutNotification(); + virtual void BroadcastUSBPipeStallNotification(); +#endif + + virtual void WaitForBluetoothd(); + virtual void FoundBluetoothd(); + + virtual IOBluetoothHCIControllerFeatureFlags GetControllerFeatureFlags(); + virtual bool SetControllerFeatureFlags(IOBluetoothHCIControllerFeatureFlags featureFlags); + virtual void setConfigState(IOBluetoothHCIControllerConfigState configState); + + virtual bool InitializeController(); +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + virtual IOReturn SetupController(bool *); +#else + virtual IOReturn SetupController(); +#endif +#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_15 + virtual IOReturn CallSetupController(); +#endif + virtual IOReturn SetupGeneralController(); + virtual IOReturn SetupCommonHardware(); + virtual bool ControllerSetupIsComplete(); + virtual void ControllerSetupComplete(int); + virtual void BluetoothHostControllerSetupCompleted(); + virtual bool InitializeHostControllerVariables(bool); + virtual IOReturn CallInitializeHostControllerVariables(); + virtual void CompleteInitializeHostControllerVariables(); + + virtual IOReturn configureReport(IOReportChannelList * channels, IOReportConfigureAction action, void * result, void * destination) APPLE_KEXT_OVERRIDE; + virtual IOReturn updateReport(IOReportChannelList * channels, IOReportConfigureAction action, void * result, void * destination) APPLE_KEXT_OVERRIDE; + + virtual bool CreatePowerReporters(); + virtual IOReturn UpdatePowerReports(IOBluetoothHCIControllerInternalPowerState powerState); + virtual IOReturn CallCreateDeviceReporter(IOBluetoothDevice * device); + static IOReturn CreateDeviceReporterAction(OSObject * owner, void * arg1, void * arg2, void * arg3, void * arg4, void * arg5, void * arg6); + virtual IOReturn CreateDeviceReporter(IOBluetoothDevice * device); + virtual BluetoothDeviceReporter * FindDeviceReporter(const BluetoothDeviceAddress * address); + virtual IOReturn ConvertClassOfDeviceToDeviceType(UInt32, bool, UInt16 *, char *, UInt64 *, char *, UInt8 *); + virtual IOReturn AddDeviceReporter(BluetoothDeviceReporter * reporter); + virtual IOReturn RemoveDeviceReporter(IOBluetoothDevice * device); + virtual IOReturn UpdateDeviceReporter(IOBluetoothDevice * device, bool); + virtual IOReturn GetDeviceCounterForName(UInt16, char *, char *, UInt8 *); + virtual void PrintDeviceReporterList(); + virtual void UpdateLESetAdvertisingDataReporter(IOBluetoothHCIRequest * request); + virtual IOReturn SetupPowerStateReporter(); + + virtual void DesyncIncomingData(IOBluetoothIncomingDataAction action, UInt8 * inDataPtr, UInt32 inDataSize); +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_11_0 + static void DesyncIncomingDataAction(IOBluetoothHostController * hostController, void * action, void * inDataPtr, UInt32 inDataSize, UInt32 sequenceNumber); +#else + static void DesyncIncomingDataAction(IOBluetoothHostController * hostController, IOBluetoothIncomingDataAction action, void * inDataPtr, UInt32 inDataSize, UInt32 sequenceNumber); +#endif + virtual void SynchronizePacketSequence(UInt32 sequenceNumber); + virtual void SynchronizeSCOPacketSequence(UInt32 sequenceNumber); + + virtual IOBluetoothDevice * FindDeviceWithHandle(BluetoothConnectionHandle inConnectionHandle); + virtual IOBluetoothDevice * FindDeviceWithSCOHandle(BluetoothConnectionHandle inConnectionHandle); +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + virtual IOBluetoothDevice * FindDeviceWithAddress(const BluetoothDeviceAddress * inDeviceAddress, bool all); +#else + virtual IOBluetoothDevice * FindDeviceWithAddress(const BluetoothDeviceAddress * inDeviceAddress); +#endif + + virtual HearingDeviceListType * FindHearingDeviceWithAddress(const BluetoothDeviceAddress * inDeviceAddress); + virtual IOReturn AddHearingDevice(IOBluetoothDevice * inDevice); + virtual IOReturn RemoveHearingDevice(IOBluetoothDevice * inDevice, bool all); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + virtual LEDeviceListType * FindLEDeviceWithConnectionHandle(BluetoothConnectionHandle inConnectionHandle); + virtual IOReturn AddLEDevice(BluetoothConnectionHandle inConnectionHandle); + virtual IOReturn RemoveLEDevice(BluetoothConnectionHandle inConnectionHandle, bool all); +#endif + + virtual IOReturn AddDevice(IOBluetoothDevice * inDevice); + virtual IOReturn RemoveDevice(IOBluetoothDevice * inDevice); +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + virtual void PrintDeviceList(); +#endif + + virtual IOReturn SetDevicePublishNotificationState(const BluetoothDeviceAddress *, UInt16); + virtual UInt16 GetDevicePublishNotificationState(const BluetoothDeviceAddress *); + virtual IOReturn CreateDeviceFromLEConnectionResults(BluetoothHCIEventLEConnectionCompleteResults * connectionResults); + virtual IOReturn CreateDeviceFromConnectionResults(BluetoothHCIEventConnectionCompleteResults * connectionResults); + virtual IOReturn CreateDeviceFromConnectionResults(BluetoothHCIEventConnectionCompleteResults * connectionResults, bool isInitiator); + virtual IOReturn DestroyDeviceWithDisconnectionResults(BluetoothHCIEventDisconnectionCompleteResults * disconnectionResults); + virtual IOReturn DestroyDevice(IOBluetoothDevice * inDevice); + virtual IOReturn DestroyAllDevices(); + + virtual bool terminateServiceNubs(); + virtual bool terminateServiceNubsComplete(); + + virtual void FlushDeviceACLPackets(IOBluetoothDevice * inDevice); + virtual void SaveNumOutstandingACLPackets(); + virtual void DecrementIdleTimerActivityCount(UInt16); + virtual void IncrementIdleTimerActivityCount(); + virtual void DecrementOutstandingACLPackets(UInt16, UInt16, UInt16, UInt16, UInt16, UInt16); + + virtual void ProcessFlushOccurredEvent(BluetoothHCIEventFlushOccurredResults * inFlushResults); + virtual void ProcessNumberOfCompletedPacketsEvent(UInt8 *); + virtual void ProcessHCIControllerResetEvent(); + + virtual IOReturn DispatchIncomingACLData(UInt8 * inDataPtr, UInt32 inDataSize); + virtual IOReturn DispatchIncomingSCOData(UInt8 * inDataPtr, UInt32 inDataSize, UInt32 inMissingData, AbsoluteTime inTimestamp); + virtual IOBluetoothDevice * OpenDeviceConnection(const BluetoothDeviceAddress * inDeviceAddress); + static IOReturn OpenDeviceConnectionAction(OSObject * owner, void * arg1, void * arg2, void * arg3, void * arg4); + virtual IOBluetoothDevice * OpenDeviceConnectionWL(const BluetoothDeviceAddress * inDeviceAddress, UInt16, bool); + virtual IOReturn SendACLData(IOMemoryDescriptor * memDescriptor); + static void ACLPacketTimerFired(OSObject * owner, IOTimerEventSource * timerEventSource); + virtual IOReturn SendACLPacket(IOBluetoothACLMemoryDescriptor * memDescriptor, IOBluetoothDevice * inTargetDevice = NULL); + virtual IOReturn TransferACLPacketToHW(IOMemoryDescriptor * memDescriptor); + virtual void handleACLPacketTimeout(IOBluetoothACLMemoryDescriptor *); + virtual IOReturn setUnackQueueCompletionCalled(void *); + static IOReturn setUnackQueueCompletionCalledAction(OSObject * onwer, void * arg1, void * arg2, void * arg3, void * arg4, void * arg5, void * arg6); + + virtual IOReturn SetACLPacketCompletion(void *); + virtual IOReturn EnqueuePacket(IOMemoryDescriptor * memDescriptor, IOBluetoothDevice * inTargetDevice); + virtual IOReturn DequeuePacket(UInt16, UInt16, UInt16, UInt16, UInt16, UInt16); + virtual IOReturn RemovePacket(IOBluetoothACLMemoryDescriptor *); + virtual UInt32 RemoveAllPacketsBelongingTo(IOBluetoothDevice *); // returns number of packets removed + virtual IOReturn AdjustACLQueuesLimits(IOBluetoothDevice *); + virtual IOReturn AdjustACLQueuesAllowance(IOBluetoothDevice *, bool); + static IOReturn AdjustACLQueuesAllowanceAction(OSObject * owner, void * arg1, void * arg2, void * arg3, void * arg4, void * arg5, void * arg6); + virtual char * CreateACLQueueDebugString(char *, UInt16); + virtual void SendSCOCompleted(IOBluetoothSCOMemoryDescriptorRetainer *, AbsoluteTime timestamp); + static IOReturn SendSCOCompletedAction(OSObject * owner, void * arg1, void * arg2, void * arg3, void * arg4, void * arg5, void * arg6); + virtual IOReturn SendSCOData(IOMemoryDescriptor *, IOBluetoothSCOMemoryDescriptorRetainer *, int); + virtual IOReturn SendSCOData(IOMemoryDescriptor *); + static void SCOPacketTimerFired(OSObject * owner, IOTimerEventSource * timerEventSource); + virtual void handleSCOPacketTimeout(IOBluetoothSCOMemoryDescriptorRetainer *); + + virtual void SetNumSCOConnections(UInt8, UInt32); + virtual IOReturn ToggleSCOConnection(); + virtual IOReturn ToggleeSCOEV3Connection(); + virtual IOReturn ToggleeSCOEV4Connection(); + virtual IOReturn ToggleeSCOEV5Connection(); + + virtual UInt16 getSynchronousConnectionPacketTypeProperty(); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + virtual bool NeedToSetupController(); + static IOReturn NeedToSetupControllerAction(IOBluetoothHostController * target); + virtual bool FullWake(char * calledByFunction); +#endif + + virtual void ProcessLMPData(UInt8 * data, UInt32 dataSize); + static IOReturn ProcessLMPDataAction(IOBluetoothHostController * hostController, UInt8 * data, UInt32 dataSize); + virtual void ProcessLMPDataWL(UInt8 * data, UInt32 dataSize); + + virtual void ProcessACLData(UInt8 * data, UInt32 dataSize); + static IOReturn ProcessACLDataAction(IOBluetoothHostController * hostController, UInt8 * incomingDataPtr, UInt32 inDataSize, UInt32 inSequenceNumber); + virtual void ProcessACLDataWL(UInt8 * data, UInt32 dataSize, UInt32 sequenceNumber); + + virtual void ProcessSCOData(UInt8 * data, UInt32 dataSize, UInt32 inMissingData, AbsoluteTime inTimestamp, Boolean copyData); + static IOReturn ProcessSCODataAction(IOBluetoothHostController * hostController, UInt8 * incomingDataPtr, UInt32 inDataSize, UInt32 inMissingData, AbsoluteTime * inTimestamp, Boolean inCopyData); + virtual void ProcessSCODataWL(UInt8 * data, UInt32 dataSize, UInt32 inMissingData, AbsoluteTime inTimestamp, Boolean copyData); + + virtual void ProcessEventData(UInt8 * inDataPtr, UInt32 inDataSize); + static IOReturn ProcessEventDataAction(IOBluetoothHostController * hostController, UInt8 * incomingDataPtr, UInt32 inDataSize, UInt32 inSequenceNumber); + virtual void ProcessEventDataWL(UInt8 * inDataPtr, UInt32 inDataSize, UInt32 sequenceNumber); + virtual void NotifyDataClientsForEventData(IOBluetoothHCIRequest * hciRequest, UInt32, UInt8 *); + + virtual bool GetCompleteCodeForCommand(BluetoothHCICommandOpCode inOpCode, BluetoothHCIEventCode * outEventCode); +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + virtual IOReturn GetOpCodeAndEventCode(UInt8 * inDataPtr, UInt32 inDataSize, BluetoothHCICommandOpCode * outOpCode, BluetoothHCIEventCode * eventCode, BluetoothHCIEventStatus * outStatus, UInt8 *, BluetoothDeviceAddress * outDeviceAddress, BluetoothConnectionHandle * outConnectionHandle, bool *); +#else + virtual IOReturn GetOpCodeAndEventCode(UInt8 * inDataPtr, BluetoothHCICommandOpCode * outOpCode, BluetoothHCIEventCode * eventCode, BluetoothHCIEventStatus * outStatus, UInt8 *, BluetoothDeviceAddress * outDeviceAddress, BluetoothConnectionHandle * outConnectionHandle); +#endif + + virtual IOReturn FindConnectionCompleteType(BluetoothDeviceAddress * inDeviceAddress, BluetoothHCICommandOpCode * outOpCode); + virtual IOReturn FindSynchronousConnectionCompleteType(BluetoothDeviceAddress * inDeviceAddress, BluetoothHCICommandOpCode * outOpCode); + + virtual IOReturn HandleSpecialOpcodes(BluetoothHCICommandOpCode opCode); + virtual IOReturn HCIRequestCreate(BluetoothHCIRequestID * outRequestID, bool inDoAsyncNotify = false, UInt32 inTimeout = 5000, BluetoothHCIRequestCallbackInfo * inCallbackInfo = NULL, task_t inTaskID = NULL, UInt32 inControlFlags = 0); + virtual IOReturn HCIRequestDelete(task_t inTask, BluetoothHCIRequestID inID); + virtual IOReturn LookupRequest(BluetoothHCIRequestID inID, IOBluetoothHCIRequest ** outRequestPtr); + virtual IOReturn PrepareRequestForNewCommand(BluetoothHCIRequestID inID, const BluetoothDeviceAddress * inDeviceAddress, BluetoothConnectionHandle inConnectionHandle); + virtual IOReturn DisposeRequestsForTaskID(task_t inTaskID); + virtual IOReturn CleanUpOrphanedHCIRequest(); + virtual void CleanUpExpiredHCIRequest(); + virtual bool HCIRequestQueuesAreEmpty(); + virtual void RemoveAllHCIRequestBelongsToThisDevice(IOBluetoothDevice * thisDevice); + virtual bool HCIRequestIsSynchronous(UInt32, bool *); + + virtual bool SetHCIRequestRequireEvents(UInt16, IOBluetoothHCIRequest * request); + virtual bool SetHCIRequestReceivedEvents(UInt8, IOBluetoothHCIRequest * request); + virtual void ValidateHCIRequestReceivedEvents(UInt8, IOBluetoothHCIRequest * request); + + virtual IOReturn SendHCIRequestFormatted(BluetoothHCIRequestID inID, BluetoothHCICommandOpCode inOpCode, IOByteCount outResultsSize, void * outResultsPtr, const char * inFormat, ...); + virtual IOReturn SendRawHCICommand(BluetoothHCIRequestID inID, char * buffer, IOByteCount bufferSize, UInt8 * outResultsPtr, IOByteCount outResultsSize); + virtual IOReturn ProcessWaitingRequests(bool); + virtual IOReturn SendingRequest(IOBluetoothHCIRequest * requestPtr); + virtual IOReturn SendHCIRequestToTransport(UInt8 *, IOByteCount); + + virtual IOReturn EnqueueRequestForController(IOBluetoothHCIRequest * requestPtr); + virtual IOReturn EnqueueRequest(IOBluetoothHCIRequest * inRequestPtr); + virtual IOReturn DequeueRequest(IOBluetoothHCIRequest * inRequestPtr); + virtual IOReturn FindQueuedRequest(BluetoothHCICommandOpCode opCode, BluetoothDeviceAddress * inDeviceAddress, BluetoothConnectionHandle inConnectionHandle, Boolean inUseAttributes, + IOBluetoothHCIRequest ** outRequestPtr); + virtual IOReturn EnqueueWaitRequest(IOBluetoothHCIRequest * inRequestPtr); + virtual IOReturn DequeueWaitRequest(IOBluetoothHCIRequest * inRequestPtr); + virtual IOReturn FindQueuedWaitRequest(BluetoothHCICommandOpCode opCode, IOBluetoothHCIRequest ** outRequestPtr); + virtual IOReturn AbortRequest(IOBluetoothHCIRequest * inRequestPtr); + virtual IOReturn AbortRequestAndSetTime(IOBluetoothHCIRequest *); + virtual IOReturn KillAllPendingRequests(bool destroy, bool includeIdleRequests); + virtual IOReturn CallKillAllPendingRequests(bool destroy, bool includeIdleRequests); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_11_0 + virtual IOReturn IncrementHCICommandTimeOutCounter(UInt16 inOpCode); +#else + virtual IOReturn IncrementHCICommandTimeOutCounter(); +#endif + virtual void ResetHCICommandTimeOutCounter(); + + virtual void IncrementActiveConnections(); + virtual void DecrementActiveConnections(); + virtual void ActiveConnectionsInProgress(); + virtual void AllConnectionsGone(); + virtual void MergeChannelDescription(OSDictionary * destination, OSDictionary * source); + virtual void RemoveChannelRestrictions(OSDictionary * toChange, OSDictionary * removeRule, const char * key); + virtual bool IsAllowedDevice(OSDictionary * description, IOBluetoothDevice * device); + virtual void RemoveAllRules(); + + virtual OSDictionary * GetIncomingL2CAPChannelDescription(OSNumber * psmNumber); + virtual IOReturn AddAllowedIncomingL2CAPChannel(OSDictionary * channelDescription); + virtual void RemoveAllowedIncomingL2CAPChannel(OSObject * channelID); + + virtual void AddAllowedIncomingL2CAPChannel(BluetoothL2CAPPSM incomingPSM); + virtual void AddAllowedIncomingL2CAPChannel(OSNumber * psmNumber); + virtual void RemoveAllowedIncomingL2CAPChannel(BluetoothL2CAPPSM incomingPSM); + + virtual OSDictionary * GetIncomingRFCOMMChannelDescription(OSNumber * channelIDNumber); + virtual IOReturn AddAllowedIncomingRFCOMMChannel(OSDictionary * channelDescription); + virtual void AddAllowedIncomingRFCOMMChannel(BluetoothRFCOMMChannelID incomingChannelID); + virtual void AddAllowedIncomingRFCOMMChannel(OSNumber * channelIDNumber); + virtual void AddSecureIncomingRFCOMMChannel(BluetoothRFCOMMChannelID incomingChannelID); + virtual void AddSecureIncomingRFCOMMChannel(OSNumber * channelIDNumber); + virtual void RemoveAllowedIncomingRFCOMMChannel(OSObject * channelID); + virtual void RemoveAllowedIncomingRFCOMMChannel(BluetoothRFCOMMChannelID incomingChannelID); + virtual bool IsSecureIncomingRFCOMMChannel(BluetoothRFCOMMChannelID incomingChannelID); +#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_15 + virtual bool IsSecureIncomingRFCOMMChannel(OSNumber * incomingChannelID); + virtual void SetEnabledIncomingRFCOMMChannel(OSNumber * incomingChannelID, bool ShouldBeEnabled); +#endif + virtual void SetEnabledIncomingRFCOMMChannel(BluetoothRFCOMMChannelID incomingChannelID, bool ShouldBeEnabled); + + virtual bool IsAllowedIncomingL2CAPChannelForDevice(BluetoothL2CAPPSM incomingPSM, IOBluetoothDevice * device); + virtual bool IsAllowedIncomingRFCOMMChannelForDevice(BluetoothRFCOMMChannelID incomingChannelID, IOBluetoothDevice * device); + + static void idleTimerFired(OSObject * owner, IOTimerEventSource * timerEventSource); + virtual void StartIdleTimer(uint32_t milliseconds); + virtual void StopIdleTimer(); + virtual void EvaluateHighPriorityConnections(); + virtual void handleIdleTimeout(); + virtual IOReturn CallCancelTimeoutForIdleTimer(); + virtual IOReturn CallUpdateTimerForIdleTimer(); + virtual IOReturn CallResetTimerForIdleTimer(); + virtual IOReturn EnableIdleTimer(); + virtual IOReturn DisableIdleTimer(); + virtual void ChangeIdleTimerTime(char * calledByFunction, UInt32 newTime); + virtual IOReturn SetIdleTimerValue(UInt32 value); + virtual IOReturn SetIdleTimerValueInNVRAM(UInt32 value); + virtual IOReturn ClearIdleTimerValueInNVRAM(); + virtual void WriteIdleTimerValueToNVRAM(); + virtual void ReadIdleTimerValueFromNVRAM(); + virtual void RemoveIdleTimerValueInNVRAM(); + + virtual bool SetTransportIdlePolicyValue(); + virtual void WaitForAllDevicesToGetReadyToBeDestroyed(); + + virtual bool UpdatePowerStateProperty(IOBluetoothHCIControllerInternalPowerState powerState, bool); + virtual IOReturn RequestPowerStateChange(IOBluetoothHCIControllerInternalPowerState newPowerState, char *); + virtual IOReturn RequestPowerStateChangeFromUserSpace(IOBluetoothHCIControllerInternalPowerState newPowerState); + virtual bool Power_State_Change_In_Progress(); + virtual bool Power_State_Is_Off(); + virtual bool Is_Powering_Down(); + virtual IOBluetoothHCIControllerInternalPowerState GetControllerPowerState(); + virtual IOReturn GetTransportCurrentPowerState(IOBluetoothHCIControllerInternalPowerState * outPowerState); + virtual IOReturn GetTransportPendingPowerState(IOBluetoothHCIControllerInternalPowerState * outPowerState); + virtual IOReturn ChangeTransportPowerStateTo(unsigned long ordinal, bool willWait, IOBluetoothHCIControllerInternalPowerState powerState, char * name); + virtual IOReturn WaitForTransportPowerStateChange(IOBluetoothHCIControllerInternalPowerState, char *); + virtual bool SystemReadyForSleep(); + virtual void SetChangingPowerState(bool); + virtual void SetControllerPowerOptions(IOBluetoothHCIControllerPowerOptions inPowerOptions); + virtual IOBluetoothHCIControllerPowerOptions GetControllerPowerOptions(); + virtual void TransportIsReady(bool); + virtual void TransportIsGoingAway(); + virtual IOReturn ChangeControllerStateForRestart(); + virtual IOReturn CleanUpForPoweringOff(); + virtual IOReturn CleanUpBeforeTransportTerminate(IOBluetoothHostControllerTransport * transport); + virtual void SetVendorSpecificEventMask(bool); + virtual IOReturn CleanUpForCompletePowerChangeFromSleepToOn(); + virtual IOReturn CleanupForPowerChangeFromOnToSleep(bool, UInt32 *); + + virtual IOReturn PerformTaskForPowerManagementCalls(IOOptionBits options); + virtual IOReturn disableHIDEmulation(); + virtual IOReturn SetHIDEmulation(UInt32, bool); + virtual IOReturn CallSetHIDEmulation(); + virtual bool ModuleIsInUHEMode(bool *); + virtual IOReturn TransportRadioPowerOff(BluetoothHCICommandOpCode opCode, char * processName, int processID, IOBluetoothHCIRequest * request); + virtual IOReturn GetTransportRadioPowerState(UInt8 *); + virtual IOReturn SetTransportRadioPowerState(UInt8); + virtual IOReturn CallPowerRadio(bool); + virtual IOReturn SendBFCSetParams(UInt8, UInt8, UInt8); + virtual bool SetMaxPowerForConnection(UInt32, UInt8, UInt16); + virtual IOReturn WriteDeviceAddress(BluetoothHCIRequestID inID, BluetoothDeviceAddress * inAddress); + virtual IOReturn WriteLocalSupportedFeatures(UInt32, void *); + virtual IOReturn WriteBufferSize(); + virtual IOReturn DisableScan(); +#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_15 + virtual IOReturn EnableScan(); +#endif +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_11_0 + virtual IOReturn CallBluetoothHCIReset(bool, char *); +#else + virtual IOReturn CallBluetoothHCIReset(bool); +#endif + + virtual IOReturn IgnoreUSBReset(bool); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + virtual IOReturn HardResetController(UInt16); +#else + virtual IOReturn BluetoothResetDevice(UInt16); + virtual IOReturn BluetoothResetController(); + virtual IOReturn BluetoothResetHub(); + virtual IOReturn DoReset(); +#endif + virtual bool WillResetModule(); +#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_15 + virtual void ResetHardResetCounter(); +#endif +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_11_0 + static IOReturn HardResetControllerAction(OSObject * target, UInt16); + virtual IOReturn EnqueueHardResetControllerAction(UInt16); +#endif + virtual IOReturn ResetTransportHardwareStatus(); + virtual IOReturn GetTransportHardwareStatus(UInt32 *); + virtual void TransportTerminating(IOBluetoothHostControllerTransport *); +#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_15 + virtual IOReturn ForceHardwareReset(); +#endif + virtual IOReturn GetTransportInfo(BluetoothTransportInfo *); + virtual bool SupportWoBT(); + virtual bool IsTBFCSupported(); + virtual bool IsAnyDevicesTBFCPageCapable(); + virtual bool SupportDeepIdle(); + virtual IOReturn SetIdlePolicy(bool); + virtual bool BluetoothRemoteWakeEnabled(); + virtual bool FileVaultIsTurnedOn(); + virtual IOReturn ControllerCommandSleep(void *, UInt32, char *, bool); + + virtual UInt32 ConvertAddressToUInt32(void * inAddress); + virtual IOReturn UpdateFirmware(UInt32); + virtual bool NeedToIncreaseInactivityTime(); + virtual void DisableControllerWorkQueue(); + virtual void DoNotTickleDisplay(); + virtual IOReturn ValidSleepTypeFromPowerManager(UInt32 *); + virtual IOReturn ToggleLMPLogging(); + virtual IOReturn SetupLighthouse(); + virtual IOReturn SetLighthouseControl(UInt8); + virtual IOReturn SetLighthouseParameters(UInt16, UInt16, UInt16, UInt8, UInt8, SInt8, UInt8); + virtual IOReturn SetLighthouseDebugQuery(UInt8); + virtual void WakeUpLEConnectionCompleteOutOfSequenceThread(); +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + virtual IOReturn RecoverX238EModule(); +#endif +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_11_0 + virtual void SetControllerSleepMode(); +#endif + + virtual void TakeAHexDump(const void * inData, UInt32 inDataSize); + virtual void PrintAllHCIRequests(); + virtual void PrintDeviceListAddress(); + virtual void PrintClassVariablesContent(); + virtual os_log_t CreateOSLogObject(); + virtual BluetoothHCIRequestID GetMaxRequestID(); // return 500 +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + virtual IOReturn TestLEAdvertisingReportEvent(UInt8); +#endif +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + virtual bool IsClassicSecureConnectionsSupported(); +#endif + + virtual IOReturn BluetoothHCIInquiry(BluetoothHCIRequestID inID, BluetoothLAP inLAP, BluetoothHCIInquiryLength inInquiryLength, BluetoothHCIResponseCount inMaxResponseCount, + BluetoothHCIInquiryResults * outResults); + virtual IOReturn BluetoothHCIInquiryCancel(BluetoothHCIRequestID inID); + virtual IOReturn BluetoothHCIPeriodicInquiryMode(BluetoothHCIRequestID inID, BluetoothHCIInquiryLength inMaxPeriodLength, BluetoothHCIInquiryLength inMinPeriodLength, BluetoothLAP inLAP, + BluetoothHCIInquiryLength inInquiryLength, BluetoothHCIResponseCount inMaxResponses, BluetoothHCIInquiryResults * outResults); + virtual IOReturn BluetoothHCIExitPeriodicInquiryMode(BluetoothHCIRequestID inID); + virtual IOReturn BluetoothHCICreateConnection(BluetoothHCIRequestID inID, const BluetoothDeviceAddress * inAddressPtr, BluetoothPacketType inPacketType, + BluetoothPageScanRepetitionMode inPageScanRepetitionMode, BluetoothPageScanMode inPageScanMode, BluetoothClockOffset inClockOffset, + BluetoothAllowRoleSwitch inAllowRoleSwitch, BluetoothHCIEventConnectionCompleteResults * outConnectionHandle); + virtual IOReturn BluetoothHCIDisconnect(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle, BluetoothReasonCode inReason, + BluetoothHCIEventDisconnectionCompleteResults * outResults); + virtual IOReturn BluetoothHCIAddSCOConnection(BluetoothHCIRequestID inID, BluetoothConnectionHandle inACLConnectionHandle, BluetoothPacketType inPacketType); + virtual IOReturn BluetoothHCIAcceptConnectionRequest(BluetoothHCIRequestID inID, const BluetoothDeviceAddress * inAddressPtr, BluetoothRole inRole); + virtual IOReturn BluetoothHCIRejectConnectionRequest(BluetoothHCIRequestID inID, const BluetoothDeviceAddress * inAddressPtr, BluetoothReasonCode inReason); + virtual IOReturn BluetoothHCILinkKeyRequestReply(BluetoothHCIRequestID inID, const BluetoothDeviceAddress * inAddressPtr, const BluetoothKey * inKeyPtr, BluetoothDeviceAddress * outAddress); + virtual IOReturn BluetoothHCILinkKeyRequestNegativeReply(BluetoothHCIRequestID inID, const BluetoothDeviceAddress * inAddressPtr, BluetoothDeviceAddress * outAddress); + virtual IOReturn BluetoothHCIPINCodeRequestReply(BluetoothHCIRequestID inID, const BluetoothDeviceAddress * inAddressPtr, IOByteCount inPINCodeSize, const BluetoothPINCode * inPINCode, + BluetoothDeviceAddress * outAddress); + virtual IOReturn BluetoothHCIPINCodeRequestNegativeReply(BluetoothHCIRequestID inID, const BluetoothDeviceAddress * inAddressPtr, BluetoothDeviceAddress * outAddress); + virtual IOReturn BluetoothHCIChangeConnectionPacketType(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle, BluetoothPacketType inPacketType); + virtual IOReturn BluetoothHCIAuthenticationRequested(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle); + virtual IOReturn BluetoothHCISetEncryptionEnable(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle, BluetoothEncryptionEnable inEncryptionEnable); + virtual IOReturn BluetoothHCIChangeConnectionLinkKey(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle); + virtual IOReturn BluetoothHCIMasterLinkKey(BluetoothHCIRequestID inID, BluetoothKeyFlag inKeyFlag); + virtual IOReturn BluetoothHCIRemoteNameRequest(BluetoothHCIRequestID inID, const BluetoothDeviceAddress * inAddressPtr, BluetoothPageScanRepetitionMode inPageScanRepetitionMode, + BluetoothPageScanMode inPageScanMode, BluetoothClockOffset inClockOffset, BluetoothHCIEventRemoteNameRequestResults * outName); + virtual IOReturn BluetoothHCIReadRemoteSupportedFeatures(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle, + BluetoothHCIEventReadRemoteSupportedFeaturesResults * outFeatures); + virtual IOReturn BluetoothHCIReadRemoteExtendedFeatures(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle, BluetoothHCIExtendedInquiryResponseDataType inDataType, + BluetoothHCIEventReadRemoteExtendedFeaturesResults * outFeatures); + virtual IOReturn BluetoothHCIReadRemoteVersionInformation(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle, BluetoothHCIEventReadRemoteVersionInfoResults * outVersionInfo); + virtual IOReturn BluetoothHCIReadClockOffset(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle, BluetoothClockOffset * outClockOffset); + + virtual IOReturn BluetoothHCIIOCapabilityRequestReply(BluetoothHCIRequestID inID, const BluetoothDeviceAddress * inAddressPtr, UInt8, UInt8, UInt8); + virtual IOReturn BluetoothHCIUserConfirmationRequestReply(BluetoothHCIRequestID inID, const BluetoothDeviceAddress * inAddressPtr); + virtual IOReturn BluetoothHCIUserConfirmationRequestNegativeReply(BluetoothHCIRequestID inID, const BluetoothDeviceAddress * inAddressPtr); + virtual IOReturn BluetoothHCIUserPasskeyRequestReply(BluetoothHCIRequestID inID, const BluetoothDeviceAddress * inAddressPtr, UInt32); + virtual IOReturn BluetoothHCIUserPasskeyRequestNegativeReply(BluetoothHCIRequestID inID, const BluetoothDeviceAddress * inAddressPtr); + virtual IOReturn BluetoothHCIRemoteOOBDataRequestReply(BluetoothHCIRequestID inID, const BluetoothDeviceAddress * inAddressPtr, BluetoothHCISimplePairingOOBData *, + BluetoothHCISimplePairingOOBData *); + virtual IOReturn BluetoothHCIRemoteOOBDataRequestNegativeReply(BluetoothHCIRequestID inID, const BluetoothDeviceAddress * inAddressPtr); + virtual IOReturn BluetoothHCIIOCapabilityRequestNegativeReply(BluetoothHCIRequestID inID, const BluetoothDeviceAddress * inAddressPtr, UInt8); + virtual IOReturn BluetoothHCISetupSynchronousConnection(BluetoothHCIRequestID inID, BluetoothConnectionHandle inHandle, BluetoothHCISetupSynchronousConnectionParams * inParams); + virtual IOReturn BluetoothHCIAcceptSynchronousConnectionRequest(BluetoothHCIRequestID inID, const BluetoothDeviceAddress * inAddressPtr, BluetoothHCIAcceptSynchronousConnectionRequestParams *); + virtual IOReturn BluetoothHCIRejectSynchronousConnectionRequest(BluetoothHCIRequestID inID, const BluetoothDeviceAddress * inAddressPtr, UInt8); + virtual IOReturn BluetoothHCIEnhancedSetupSynchronousConnection(BluetoothHCIRequestID inID, BluetoothConnectionHandle inHandle, BluetoothHCIEnhancedSetupSynchronousConnectionParams * inParams); + virtual IOReturn BluetoothHCIEnhancedAcceptSynchronousConnectionRequest(BluetoothHCIRequestID inID, const BluetoothDeviceAddress * inAddressPtr, + BluetoothHCIEnhancedAcceptSynchronousConnectionRequestParams *); + + virtual IOReturn BluetoothHCIHoldMode(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle, BluetoothHCIModeInterval inHoldModeMaxInterval, + BluetoothHCIModeInterval inHoldModeMinInterval); + virtual IOReturn BluetoothHCISniffMode(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle, BluetoothHCIModeInterval inSniffModeMaxInterval, + BluetoothHCIModeInterval inSniffModeMinInterval, BluetoothHCISniffAttemptCount inSniffAttemptCount, BluetoothHCISniffTimeout inSniffModeTimeout); + virtual IOReturn BluetoothHCIExitSniffMode(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle); + virtual IOReturn BluetoothHCIParkMode(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle, BluetoothHCIParkModeBeaconInterval inMaxInterval, + BluetoothHCIParkModeBeaconInterval inMinInterval); + virtual IOReturn BluetoothHCIExitParkMode(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle); + virtual IOReturn BluetoothHCIQualityOfServiceSetup(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle, BluetoothHCIQualityOfServiceSetupParams * inSetupPtr); + virtual IOReturn BluetoothHCIRoleDiscovery(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle, BluetoothHCIRoleInfo * outRoleInfo); + virtual IOReturn BluetoothHCISwitchRole(BluetoothHCIRequestID inID, BluetoothDeviceAddress * inAddressPtr, BluetoothHCIRole inNewRole); + virtual IOReturn BluetoothHCIReadLinkPolicySettings(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle, BluetoothHCILinkPolicySettingsInfo * outSettingsInfo); + virtual IOReturn BluetoothHCIReadDefaultLinkPolicySettings(BluetoothHCIRequestID inID, BluetoothHCILinkPolicySettingsInfo * outSettingsInfo); + virtual IOReturn BluetoothHCIWriteLinkPolicySettings(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle, BluetoothHCILinkPolicySettings inSettings, + BluetoothConnectionHandle * outConnectionHandle); + virtual IOReturn BluetoothHCIWriteDefaultLinkPolicySettings(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle); + virtual IOReturn BluetoothHCISniffSubrating(BluetoothHCIRequestID inID, UInt16, UInt16, UInt16, UInt16, UInt16 *); + virtual IOReturn BluetoothHCIFlowSpecification(BluetoothHCIRequestID inID, BluetoothHCIEventFlowSpecificationData *, BluetoothHCIEventFlowSpecificationData *); + virtual IOReturn BluetoothHCISetEventMask(BluetoothHCIRequestID inID, BluetoothSetEventMask * inMask); + virtual IOReturn BluetoothHCILESetEventMask(BluetoothHCIRequestID inID, BluetoothSetEventMask * inMask); + virtual IOReturn BluetoothHCILEReadBufferSize(BluetoothHCIRequestID inID, BluetoothHCILEBufferSize * outSize); + virtual IOReturn BluetoothHCILESetScanEnable(BluetoothHCIRequestID inID, UInt8, UInt8); + virtual IOReturn BluetoothHCILESetAdvertiseEnable(BluetoothHCIRequestID inID, UInt8); + virtual IOReturn BluetoothHCILEReadLocalSupportedFeatures(BluetoothHCIRequestID inID, BluetoothHCISupportedFeatures * outFeatures); + virtual IOReturn BluetoothHCILEReadRemoteUsedFeatures(BluetoothHCIRequestID inID, UInt16, BluetoothHCISupportedFeatures * outFeatures); +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_11_0 + virtual IOReturn BluetoothHCIReset(BluetoothHCIRequestID inID, char * name); +#else + virtual IOReturn BluetoothHCIReset(BluetoothHCIRequestID inID); +#endif + virtual IOReturn BluetoothHCISetEventFilter(BluetoothHCIRequestID inID, UInt8, UInt8, BluetoothEventFilterCondition *); + virtual IOReturn BluetoothHCIFlush(BluetoothHCIRequestID inID, BluetoothConnectionHandle inHandle); + virtual IOReturn BluetoothHCIReadPINType(BluetoothHCIRequestID inID, BluetoothPINType * outType); + virtual IOReturn BluetoothHCIWritePINType(BluetoothHCIRequestID inID, BluetoothPINType inType); + + virtual IOReturn BluetoothHCICreateNewUnitKey(BluetoothHCIRequestID inID); + virtual IOReturn BluetoothHCIReadStoredLinkKey(BluetoothHCIRequestID inID, BluetoothDeviceAddress * targetDevice, BluetoothHCIReadStoredLinkKeysFlag * inFlags, + BluetoothHCIStoredLinkKeysInfo * outKeysInfo); + virtual IOReturn BluetoothHCIWriteStoredLinkKey(BluetoothHCIRequestID inID, IOItemCount inNumKeysToWrite, BluetoothDeviceAddress inDeviceAddresses[], BluetoothKey inLinkKeys[], + BluetoothHCINumLinkKeysToWrite * outNumKeysWritten); + virtual IOReturn BluetoothHCIDeleteStoredLinkKey(BluetoothHCIRequestID inID, BluetoothDeviceAddress * targetDevice, BluetoothHCIDeleteStoredLinkKeyFlag * inFlag, + BluetoothHCINumLinkKeysDeleted * outNumDeleted); + + virtual IOReturn BluetoothHCIChangeLocalName(BluetoothHCIRequestID inID, BluetoothDeviceName newName); + virtual IOReturn BluetoothHCIReadLocalName(BluetoothHCIRequestID inID, BluetoothDeviceName name); + virtual IOReturn BluetoothHCIReadConnectionAcceptTimeout(BluetoothHCIRequestID inID, BluetoothHCIConnectionAcceptTimeout * outTimeout); + virtual IOReturn BluetoothHCIWriteConnectionAcceptTimeout(BluetoothHCIRequestID inID, BluetoothHCIConnectionAcceptTimeout inTimeout); + virtual IOReturn BluetoothHCIReadPageTimeout(BluetoothHCIRequestID inID, BluetoothHCIPageTimeout * outDataPtr); + virtual IOReturn BluetoothHCIWritePageTimeout(BluetoothHCIRequestID inID, BluetoothHCIPageTimeout inTimeout); + virtual IOReturn BluetoothHCIReadScanEnable(BluetoothHCIRequestID inID, BluetoothHCIPageScanEnableState * outState); +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + virtual IOReturn BluetoothHCIWriteScanEnable(BluetoothHCIRequestID inID, BluetoothHCIPageScanEnableState inState, bool); +#else + virtual IOReturn BluetoothHCIWriteScanEnable(BluetoothHCIRequestID inID, BluetoothHCIPageScanEnableState inState); +#endif + virtual IOReturn BluetoothHCIReadPageScanActivity(BluetoothHCIRequestID inID, BluetoothHCIScanActivity * outActivityInfo); + virtual IOReturn BluetoothHCIWritePageScanActivity(BluetoothHCIRequestID inID, BluetoothHCIScanActivity * inActivityInfo); + virtual IOReturn BluetoothHCIReadInquiryScanActivity(BluetoothHCIRequestID inID, BluetoothHCIScanActivity * outActivityInfo); + virtual IOReturn BluetoothHCIWriteInquiryScanActivity(BluetoothHCIRequestID inID, BluetoothHCIScanActivity * inActivityInfo); + virtual IOReturn BluetoothHCIReadAuthenticationEnable(BluetoothHCIRequestID inID, BluetoothHCIAuthenticationEnable * outAuthenticationState); + virtual IOReturn BluetoothHCIWriteAuthenticationEnable(BluetoothHCIRequestID inID, BluetoothHCIAuthenticationEnable inAuthenticationState); + + virtual IOReturn BluetoothHCIReadEncryptionMode(BluetoothHCIRequestID inID, BluetoothHCIEncryptionMode * outEncryptionState); + virtual IOReturn BluetoothHCIWriteEncryptionMode(BluetoothHCIRequestID inID, BluetoothHCIEncryptionMode inEncryptionMode); + virtual IOReturn BluetoothHCIReadClassOfDevice(BluetoothHCIRequestID inID, BluetoothClassOfDevice * outClassOfDevice); + virtual IOReturn BluetoothHCIWriteClassOfDevice(BluetoothHCIRequestID inID, BluetoothClassOfDevice inClassOfDevice); + virtual IOReturn BluetoothHCIReadVoiceSetting(BluetoothHCIRequestID inID, BluetoothHCIVoiceSetting * outVoiceSetting); + virtual IOReturn BluetoothHCIWriteVoiceSetting(BluetoothHCIRequestID inID, BluetoothHCIVoiceSetting inVoiceSetting); + virtual IOReturn BluetoothHCIReadAutomaticFlushTimeout(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle, + BluetoothHCIAutomaticFlushTimeoutInfo * outAutomaticFlushTimeoutInfo); + virtual IOReturn BluetoothHCIWriteAutomaticFlushTimeout(BluetoothHCIRequestID inID, BluetoothHCIAutomaticFlushTimeoutInfo * inAutomaticFlushTimeoutInfo, + BluetoothConnectionHandle * outConnectionHandle); + virtual IOReturn BluetoothHCIReadNumBroadcastRetransmissions(BluetoothHCIRequestID inID, BluetoothHCINumBroadcastRetransmissions * outNumRetrans); + virtual IOReturn BluetoothHCIWriteNumBroadcastRetransmissions(BluetoothHCIRequestID inID, BluetoothHCINumBroadcastRetransmissions inNumRetrans); + virtual IOReturn BluetoothHCIReadHoldModeActivity(BluetoothHCIRequestID inID, BluetoothHCIHoldModeActivity * outState); + virtual IOReturn BluetoothHCIWriteHoldModeActivity(BluetoothHCIRequestID inID, BluetoothHCIHoldModeActivity inState); + virtual IOReturn BluetoothHCIReadTransmitPowerLevel(BluetoothHCIRequestID inID, BluetoothConnectionHandle inHandle, BluetoothHCITransmitPowerLevelType inType, + BluetoothHCITransmitPowerLevelInfo * outLevelInfo); + virtual IOReturn BluetoothHCIReadSCOFlowControlEnable(BluetoothHCIRequestID inID, BluetoothHCIFlowControlState * outState); + virtual IOReturn BluetoothHCIWriteSCOFlowControlEnable(BluetoothHCIRequestID inID, BluetoothHCIFlowControlState inState); + virtual IOReturn BluetoothHCISetHostControllerToHostFlowControl(BluetoothHCIRequestID inID, BluetoothHCIFlowControlState inState); + virtual IOReturn BluetoothHCIHostBufferSize(BluetoothHCIRequestID inID, BluetoothHCIBufferSize * inSize); + virtual IOReturn BluetoothHCIHostNumberOfCompletedPackets(BluetoothHCIRequestID inID, UInt8, UInt16 *, UInt16 *); + virtual IOReturn BluetoothHCIReadLinkSupervisionTimeout(BluetoothHCIRequestID inID, BluetoothConnectionHandle inHandle, BluetoothHCILinkSupervisionTimeout * outInfo); + virtual IOReturn BluetoothHCIWriteLinkSupervisionTimeout(BluetoothHCIRequestID inID, BluetoothHCILinkSupervisionTimeout * inInfo, BluetoothConnectionHandle * outHandle); + virtual IOReturn BluetoothHCIReadNumberOfSupportedIAC(BluetoothHCIRequestID inID, BluetoothHCISupportedIAC * outNumSupported); + virtual IOReturn BluetoothHCIReadCurrentIACLAP(BluetoothHCIRequestID inID, BluetoothHCICurrentInquiryAccessCodes * inAccessCodes); + virtual IOReturn BluetoothHCIWriteCurrentIACLAP(BluetoothHCIRequestID inID, BluetoothHCICurrentInquiryAccessCodesForWrite * inAccessCodes); + virtual IOReturn BluetoothHCIReadPageScanPeriodMode(BluetoothHCIRequestID inID, BluetoothHCIPageScanPeriodMode * outMode); + virtual IOReturn BluetoothHCIWritePageScanPeriodMode(BluetoothHCIRequestID inID, BluetoothHCIPageScanPeriodMode inMode); + virtual IOReturn BluetoothHCIReadPageScanMode(BluetoothHCIRequestID inID, BluetoothHCIPageScanMode * outMode); + virtual IOReturn BluetoothHCIWritePageScanMode(BluetoothHCIRequestID inID, BluetoothHCIPageScanMode inMode); + + virtual IOReturn BluetoothHCIEnhancedFlush(BluetoothHCIRequestID inID, UInt16, UInt8, UInt16 *); + virtual IOReturn BluetoothHCIReadExtendedInquiryResponse(BluetoothHCIRequestID inID, BluetoothHCIReadExtendedInquiryResponseResults *); + virtual IOReturn BluetoothHCIWriteExtendedInquiryResponse(BluetoothHCIRequestID inID, UInt8, BluetoothHCIExtendedInquiryResponse *); + virtual IOReturn BluetoothHCIRefreshEncryptionKey(BluetoothHCIRequestID inID, UInt16, BluetoothHCIEventEncryptionKeyRefreshCompleteResults *); + virtual IOReturn BluetoothHCIReadInquiryMode(BluetoothHCIRequestID inID, BluetoothHCIInquiryMode *); + virtual IOReturn BluetoothHCIWriteInquiryMode(BluetoothHCIRequestID inID, BluetoothHCIInquiryMode); + virtual IOReturn BluetoothHCIReadSimplePairingMode(BluetoothHCIRequestID inID, BluetoothHCISimplePairingMode *); + virtual IOReturn BluetoothHCIWriteSimplePairingMode(BluetoothHCIRequestID inID, BluetoothHCISimplePairingMode); + virtual IOReturn BluetoothHCIReadLocalOOBData(BluetoothHCIRequestID inID, BluetoothHCIReadLocalOOBDataResults *); + virtual IOReturn BluetoothHCIReadInquiryResponseTransmitPower(BluetoothHCIRequestID inID, BluetoothHCITransmitPowerLevel *); + virtual IOReturn BluetoothHCIWriteInquiryResponseTransmitPower(BluetoothHCIRequestID inID, BluetoothHCITransmitPowerLevel); + virtual IOReturn BluetoothHCISendKeypressNotification(BluetoothHCIRequestID inID, const BluetoothDeviceAddress * inAddressPtr, UInt8); + virtual IOReturn BluetoothHCIReadDefaultErroneousDataReporting(BluetoothHCIRequestID inID, BluetoothHCIErroneousDataReporting *); + virtual IOReturn BluetoothHCIWriteDefaultErroneousDataReporting(BluetoothHCIRequestID inID, BluetoothHCIErroneousDataReporting); + virtual IOReturn BluetoothHCIReadAFHChannelAssessmentMode(BluetoothHCIRequestID inID, BluetoothHCIAFHChannelAssessmentMode *); + virtual IOReturn BluetoothHCIWriteAFHChannelAssessmentMode(BluetoothHCIRequestID inID, BluetoothHCIAFHChannelAssessmentMode); + virtual IOReturn BluetoothHCISetAFHHostChannelClassification(BluetoothHCIRequestID inID, BluetoothAFHHostChannelClassification *); + virtual IOReturn BluetoothHCIReadInquiryScanType(BluetoothHCIRequestID inID, BluetoothHCIInquiryScanType *); + virtual IOReturn BluetoothHCIWriteInquiryScanType(BluetoothHCIRequestID inID, BluetoothHCIInquiryScanType); + virtual IOReturn BluetoothHCIReadPageScanType(BluetoothHCIRequestID inID, BluetoothHCIPageScanType *); + virtual IOReturn BluetoothHCIWritePageScanType(BluetoothHCIRequestID inID, BluetoothHCIPageScanType); + + virtual IOReturn BluetoothHCIReadLocalVersionInformation(BluetoothHCIRequestID inID, BluetoothHCIVersionInfo * outVersionInfo); + virtual IOReturn BluetoothHCIReadLocalSupportedCommands(BluetoothHCIRequestID inID, BluetoothHCISupportedCommands * outCommands); + virtual IOReturn BluetoothHCIReadLocalSupportedFeatures(BluetoothHCIRequestID inID, BluetoothHCISupportedFeatures * outFeatures); + virtual IOReturn BluetoothHCIReadLocalExtendedFeatures(BluetoothHCIRequestID inID, UInt8, BluetoothHCIExtendedFeaturesInfo * outFeatures); + virtual IOReturn BluetoothHCIReadBufferSize(BluetoothHCIRequestID inID, BluetoothHCIBufferSize * outSize); + virtual IOReturn BluetoothHCIReadCountryCode(BluetoothHCIRequestID inID, BluetoothHCICountryCode * outCountryCode); + virtual IOReturn BluetoothHCIReadDeviceAddress(BluetoothHCIRequestID inID, BluetoothDeviceAddress * outAddress); + virtual IOReturn BluetoothHCIReadFailedContactCounter(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle, BluetoothHCIFailedContactInfo * outFailedContactCount); + virtual IOReturn BluetoothHCIResetFailedContactCounter(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle); + virtual IOReturn BluetoothHCIGetLinkQuality(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle, BluetoothHCILinkQualityInfo * outLinkQualityInfo); + virtual IOReturn BluetoothHCIReadRSSI(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle, BluetoothHCIRSSIInfo * outRSSIInfo); + virtual IOReturn BluetoothHCIReadAFHChannelMap(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle, BluetoothAFHResults * outAFHResults); + virtual IOReturn BluetoothHCIReadClock(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle, UInt8, BluetoothReadClockInfo * outClockInfo); +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + virtual IOReturn BluetoothHCIReadEncryptionKeySize(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle, BluetoothHCIEncryptionKeySizeInfo * outEncryptionKeySizeInfo); +#endif + virtual IOReturn BluetoothHCICreateConnectionCancel(BluetoothHCIRequestID inID, const BluetoothDeviceAddress *, BluetoothDeviceAddress *); + virtual IOReturn BluetoothHCIRemoteNameRequestCancel(BluetoothHCIRequestID inID, const BluetoothDeviceAddress *, BluetoothDeviceAddress *); + virtual IOReturn BluetoothHCIReadLMPHandle(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle, BluetoothHCIReadLMPHandleResults * outLMPHandleResults); + + virtual IOReturn BluetoothHCIReadLoopbackMode(BluetoothHCIRequestID inID, BluetoothHCILoopbackMode * inLoopbackMode); + virtual IOReturn BluetoothHCIWriteLoopbackMode(BluetoothHCIRequestID inID, BluetoothHCILoopbackMode inLoopbackMode); + virtual IOReturn BluetoothHCIEnableDeviceUnderTestMode(BluetoothHCIRequestID inID); + virtual IOReturn BluetoothHCIWriteSimplePairingDebugMode(BluetoothHCIRequestID inID, BluetoothSimplePairingDebugMode inSimplePairingDebugMode); + + virtual IOReturn VendorCommand(BluetoothHCIRequestID inID, BluetoothHCIVendorCommandSelector inSelector, UInt8 * inCommandData, IOByteCount inCommandDataSize, IOByteCount outBufferSize, + UInt8 * outBuffer); + + virtual IOReturn BluetoothHCIBroadcomReadRawRSSI(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle, BluetoothHCIRSSIInfo * outRSSIInfo); + virtual IOReturn BluetoothHCIBroadcomBFCSuspend(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle); + virtual IOReturn BluetoothHCIBroadcomBFCResume(BluetoothHCIRequestID inID, BluetoothConnectionHandle inConnectionHandle, const BluetoothDeviceAddress * inAddressPtr, + BluetoothBroadcomBFCReconnectData *); + virtual IOReturn BluetoothHCIBroadcomBFCReadParams(UInt32, BluetoothBroadcomBFCParams *); + virtual IOReturn BluetoothHCIBroadcomBFCSetParams(UInt32, BluetoothBroadcomBFCParams *); + virtual IOReturn BluetoothHCIBroadcomSetTransmitPower(UInt32, UInt16, SInt8); + virtual IOReturn BluetoothHCIBroadcomBFCReadRemoteBPCSFeatures(UInt32, UInt16, BluetoothBroadcomBFCRemoteBPCSFeatures *); + virtual IOReturn BluetoothHCIBroadcomBFCWriteScanEnable(UInt32, UInt8); + virtual IOReturn BluetoothHCIBroadcomBFCCreateConnection(UInt32, const BluetoothDeviceAddress *, UInt16, BluetoothHCIEventConnectionCompleteResults *); + virtual IOReturn BluetoothHCIBroadcomSetEventMask(UInt32, BluetoothBroadcomSetEventMask *); + virtual IOReturn BluetoothHCIBroadcomReadLocalFirmwareInfo(UInt32, UInt8, BluetoothBroadcomLocalFirmwareInfo *); + virtual IOReturn BluetoothHCIBroadcomBFCReadScanEnable(UInt32, UInt8 *); + virtual IOReturn BluetoothHCIBroadcomBFCIsConnectionTBFCSuspended(UInt32, UInt16, BluetoothBroadcomBFCConnectionTBFCSuspendedInfo *); + virtual IOReturn BluetoothHCIBroadcomSetUSBAutoResume(UInt32, UInt16); + virtual IOReturn BluetoothHCIBroadcomChangeLNAGainCoexsECI(UInt32, UInt8); + virtual IOReturn BluetoothHCIBroadcomTurnOFFDynamicPowerControl(UInt32, UInt8, const BluetoothDeviceAddress *); + virtual IOReturn BluetoothHCIBroadcomIncreaseDecreasePowerLevel(UInt32, const BluetoothDeviceAddress *, UInt8); + virtual IOReturn BluetoothHCIBroadcomARMMemoryPoke(UInt32, UInt32, UInt32, UInt8 *); + virtual IOReturn BluetoothHCIBroadcomARMMemoryPeek(UInt32, UInt32, UInt8 *); + virtual IOReturn BluetoothHCIBroadcomUARTSetSleepmodeParam(UInt32, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt32, UInt8); + virtual IOReturn BluetoothHCIBroadcomReadVerboseConfigVersionInfo(UInt32, BluetoothBroadcomVerboseConfigVersionInfo *); + virtual IOReturn BluetoothHCIBroadcomGetBasicRateACLConnectionStats(); + virtual IOReturn BluetoothHCIBroadcomResetBasicRateACLConnectionStats(); + virtual IOReturn BluetoothHCIBroadcomGetEDRACLConnectionStats(); + virtual IOReturn BluetoothHCIBroadcomIgnoreUSBReset(UInt32, UInt8, UInt8 *); + virtual IOReturn BluetoothHCIBroadcomLighthouseControl(UInt32, UInt8); + virtual IOReturn BluetoothHCIBroadcomLighthouseSetParameters(UInt32, UInt16, UInt16, UInt16, UInt8, UInt8, SInt8, UInt8); + virtual IOReturn BluetoothHCIBroadcomLighthouseDebugQuery(UInt32, UInt8); +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + virtual IOReturn BluetoothHCIBroadcomMasterSkipSniffMode(UInt16, UInt8, UInt8, UInt16, UInt16); + virtual IOReturn BluetoothHCIBroadcomLoadPwrRegulatoryFile(UInt8 *, UInt8); +#endif +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_11_0 + virtual IOReturn BluetoothWriteLocalAddressFromRegistry(); +#endif + +private: + static bool windowServerDidAppear(void * target, void * refCon, IOService * newService, IONotifier * notifier); + static IOReturn windowServerDidAppearAction(OSObject * owner, void * arg0, void * arg1, void * arg2, void * arg3, void * arg4, void * arg5); + + OSMetaClassDeclareReservedUnused(IOBluetoothHostController, 0); + OSMetaClassDeclareReservedUnused(IOBluetoothHostController, 1); + OSMetaClassDeclareReservedUnused(IOBluetoothHostController, 2); + OSMetaClassDeclareReservedUnused(IOBluetoothHostController, 3); + OSMetaClassDeclareReservedUnused(IOBluetoothHostController, 4); + OSMetaClassDeclareReservedUnused(IOBluetoothHostController, 5); + OSMetaClassDeclareReservedUnused(IOBluetoothHostController, 6); + OSMetaClassDeclareReservedUnused(IOBluetoothHostController, 7); + OSMetaClassDeclareReservedUnused(IOBluetoothHostController, 8); + OSMetaClassDeclareReservedUnused(IOBluetoothHostController, 9); + OSMetaClassDeclareReservedUnused(IOBluetoothHostController, 10); + OSMetaClassDeclareReservedUnused(IOBluetoothHostController, 11); + OSMetaClassDeclareReservedUnused(IOBluetoothHostController, 12); + OSMetaClassDeclareReservedUnused(IOBluetoothHostController, 13); + OSMetaClassDeclareReservedUnused(IOBluetoothHostController, 14); + OSMetaClassDeclareReservedUnused(IOBluetoothHostController, 15); + OSMetaClassDeclareReservedUnused(IOBluetoothHostController, 16); + OSMetaClassDeclareReservedUnused(IOBluetoothHostController, 17); + OSMetaClassDeclareReservedUnused(IOBluetoothHostController, 18); + OSMetaClassDeclareReservedUnused(IOBluetoothHostController, 19); + OSMetaClassDeclareReservedUnused(IOBluetoothHostController, 20); + OSMetaClassDeclareReservedUnused(IOBluetoothHostController, 21); + OSMetaClassDeclareReservedUnused(IOBluetoothHostController, 22); + OSMetaClassDeclareReservedUnused(IOBluetoothHostController, 23); + +public: + OSSet * mReporterSet; // 136 + IOReportLegend * mReportLegend; // 144 + IOStateReporter * mPowerStateReporter; // 152 + BluetoothDeviceReporter ** mDeviceReporterList; // 160 + BluetoothDeviceReporter * mActiveDeviceReporter; // 168 + IOSimpleReporter * mAppleBTLEAdvertisingReporter; // 176 + IOSimpleReporter * mLESetAdvertisingDataReporter; // 184 + IONotifier * mWindowServerNotifier; // 192 + IOWorkLoop * mWorkLoop; // 200 + IOCommandGate * mCommandGate; // 208 + IOBluetoothHCIRequest * mBusyQueueHead; // 216 + IOBluetoothHCIRequest * mWaitQueueHead; // 224 + IOBluetoothHCIRequest ** mHCIRequestList; // 232 + IOByteCount mHCIRequestListSize; // 240 + BluetoothHCIRequestID mCurrentRequestID; // 248 + + IOBluetoothDevice * mDeviceListHead; // 256 + UInt8 * mEventDataBuffer; // 264, size is 2048 + IOByteCount mEventDataBufferSize; // 272 + UInt8 mNumberOfLowPriorityDevice; // 280 + UInt8 mNumberOfMidPriorityDevice; // 281 + UInt8 mNumberOfHighPriorityDevice; // 282 + UInt8 mNumberOfLowPriorityLEDevice; // 283 + UInt8 mNumberOfMidPriorityLEDevice; // 284 + UInt8 mNumberOfHighPriorityLEDevice; // 285 + BluetoothHCIBufferSize mACLSCOBufferSize; // 286 + BluetoothHCILEBufferSize mLEACLBufferSize; // 294 + + UInt16 mPreviousNumberOfOutstandingLowPriorityACLPackets; // 298 + UInt16 mPreviousNumberOfOutstandingMidPriorityACLPackets; // 300 + UInt16 mPreviousNumberOfOutstandingHighPriorityACLPackets; // 302 + UInt16 mTotalNumberOfPreviousOutstandingACLPackets; // 304, never used + + UInt16 mNumberOfOutstandingLowPriorityACLPackets; // 306 + UInt16 mNumberOfOutstandingMidPriorityACLPackets; // 308 + UInt16 mNumberOfOutstandingHighPriorityACLPackets; // 310 + UInt16 mTotalNumberOfOutstandingACLPackets; // 312 + + UInt32 mNumberOfLowPriorityACLPacketsInQueue; // 316 + UInt32 mNumberOfMidPriorityACLPacketsInQueue; // 320 + UInt32 mNumberOfHighPriorityACLPacketsInQueue; // 324 + UInt32 mTotalNumberOfACLPacketsInAllQueues; // 328 + + UInt16 mNumberOfAllowedLowPriorityACLDataPackets; // 332 + UInt16 mNumberOfAllowedMidPriorityACLDataPackets; // 334 + UInt16 mNumberOfAllowedHighPriorityACLDataPackets; // 336 + + BluetoothHCIACLPacket * mHighPriorityACLPacketsHead; // 344 + BluetoothHCIACLPacket * mHighPriorityACLPacketsTail; // 352 + BluetoothHCIACLPacket * mMidriorityACLPacketsHead; // 360 + BluetoothHCIACLPacket * mMidPriorityACLPacketsTail; // 368 + BluetoothHCIACLPacket * mLowPriorityACLPacketsHead; // 376 + BluetoothHCIACLPacket * mLowPriorityACLPacketsTail; // 384 + + UInt16 mPreviousNumberOfOutstandingLowPriorityLEACLPackets; // 392 + UInt16 mPreviousNumberOfOutstandingMidPriorityLEACLPackets; // 394 + UInt16 mPreviousNumberOfOutstandingHighPriorityLEACLPackets; // 396 + UInt16 mPreviousTotalNumberOfOutstandingLEACLPackets; // 398 + + UInt16 mNumberOfOutstandingLowPriorityLEACLPackets; // 400 + UInt16 mNumberOfOutstandingMidPriorityLEACLPackets; // 402 + UInt16 mNumberOfOutstandingHighPriorityLEACLPackets; // 404 + UInt16 mTotalNumberOfOutstandingLEACLPackets; // 406 + + UInt32 mNumberOfLowPriorityLEACLPacketsInQueue; // 408 + UInt32 mNumberOfMidPriorityLEACLPacketsInQueue; // 412 + UInt32 mNumberOfHighPriorityLEACLPacketsInQueue; // 416 + UInt32 mTotalNumberOfLEACLPacketsInAllQueues; // 420 + + UInt16 mNumberOfAllowedLowPriorityLEACLDataPackets; // 424 + UInt16 mNumberOfAllowedMidPriorityLEACLDataPackets; // 426 + UInt16 mNumberOfAllowedHighPriorityLEACLDataPackets; // 428 + + BluetoothHCIACLPacket * mHighPriorityLEACLPacketsHead; // 432 + BluetoothHCIACLPacket * mHighPriorityLEACLPacketsTail; // 440 + BluetoothHCIACLPacket * mMidriorityLEACLPacketsHead; // 448 + BluetoothHCIACLPacket * mMidPriorityLEACLPacketsTail; // 456 + BluetoothHCIACLPacket * mLowPriorityLEACLPacketsHead; // 464 + BluetoothHCIACLPacket * mLowPriorityLEACLPacketsTail; // 472 + + OSArray * mAllowedIncomingL2CAPChannels; // 480 + UInt32 mDesyncIncomingDataCounter; // 488 + UInt32 mCurrentlyExecutingSequenceNumber; // 492 + OSArray * mAllowedIncomingRFCOMMChannels; // 496 + IOBluetoothHCIControllerConfigState mPreviousControllerConfigState; // 504 + UInt32 unknown2; // 508 + UInt32 unknown3; // 512 + UInt16 unknown4; // 516 + bool unknown5; // 518 + UInt8 * mSCOPacketBuffer; // 520 + UInt16 mNumBufferedSCOBytes; // 528 + AbsoluteTime mBufferedSCOPacketTimestamp; // 536 + IOBluetoothInactivityTimerEventSource * mIdleTimer; // 544 + UInt32 mNumSCODataInQueue; // 552 + UInt32 mCurrentlyExecutingSCOSequenceNumber; // 556 + bool mNeedToCleanUpWaitForAckQueue; // 560 + UInt16 mSynchronousConnectionPacketType; // 562 + + HearingDeviceListType * mConnectedHearingDeviceListHead; // 568 + HearingDeviceListType * mConnectedHearingDeviceListTail; // 576 + + BluetoothHCISetupSynchronousConnectionParams mSetupSynchronousConnectionParams; // 584 + BluetoothConnectionHandle mSetupSynchronousConnectionHandle; // 600 + IOBluetoothDevice * mSetupSynchronousConnectionDevice; // 608 + BluetoothDeviceAddress * mSetupSynchronousConnectionDeviceAddress; // 616 + + BluetoothHCIEnhancedSetupSynchronousConnectionParams mEnhancedSetupSynchronousConnectionParams; // 624 + BluetoothConnectionHandle mEnhancedSetupSynchronousConnectionHandle; // 704 + IOBluetoothDevice * mEnhancedSetupSynchronousConnectionDevice; // 712 + BluetoothDeviceAddress * mEnhancedSetupSynchronousConnectionDeviceAddress; // 720 + + IOByteCount mTotalDataBytesSent; // 728 + IOByteCount mTotalDataBytesReceived; // 736 + IOByteCount mTotalSCOBytesReceived; // 744 + bool mKillAllPendingRequestsCalled; // 752 + bool mScanEnabled; // 753 + uint8_t __reserved0[6]; // 754 + + BluetoothSetEventMask mSetEventMask; // 760 + BluetoothSetEventMask mPreviousSetEventMask; // 768 + BluetoothSetEventMask mLESetEventMask; // 776 + BluetoothSetEventMask mPreviousLESetEventMask; // 784 + bool mLESetAdvertisingEnabled; // 792 + bool mLESetScanEnabled; // 793 + + OSSet * mHostControllerClients; // 800 +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + LEDeviceListType * mLEDeviceListHead; // 808 + LEDeviceListType * mLEDeviceListTail; // 816 +#endif + IOBluetoothHCIController * mBluetoothFamily; // 824 + IOBluetoothHostControllerTransport * mBluetoothTransport; // 832 + IOWorkQueue * mControllerWorkQueue; // 840 + IOWorkQueue * mReporterWorkQueue; // 848 + UInt16 __reserved1; // 856 + UInt16 mVendorID; // 858 + UInt16 mProductID; // 860 + + UInt32 mLocationID; // 864 + BluetoothDeviceAddress mDeviceAddress; // 868 + bool mBuiltIn; // 874 + bool mHostControllerVariablesInitialized; // 875 + bool mControllerSetupIsComplete; // 876 + bool mTransportIsReady; // 877 + bool mTransportIsGoingAway; // 878 + UInt8 mControllerSetupState; // 879 + UInt16 mActiveControllerType; // 880 + UInt8 unknown6; // 882 + UInt8 unknown7; // 883 + UInt8 unknown8; // 884 + bool mNeedToWaitForPowerStateChangeToOn; // 885 + bool mSupportNewIdlePolicy; // 886 + bool mSupportPowerOff; // 887 + bool mSupportConcurrentCreateConnection; // 888 + UInt8 mNumberOfTimedOutHCICommands; // 889 + UInt32 mTransportSleepType; // 892 + + bool mCanDoHardReset; // 896 + bool mTransportPowerOn; // 897 + + IOBluetoothHCIControllerPowerOptions mControllerPowerOptions; // 900 + IOBluetoothHCIControllerConfigState mControllerConfigState; // 904 + IOBluetoothHCIControllerFeatureFlags mControllerFeatureFlags; // 908 + UInt8 mNumberOfCommandsAllowedByHardware; // 912 + bool mWaitingForACLPackets; // 913 + UInt8 mNumSCOConnections; // 914 + UInt64 mTotalSCOBytesSent; // 920 + UInt16 mActiveConnections; // 928 + UInt8 mNextNewSynchronousConnectionType; // 930 + + bool mNeedToGetCurrentUSBIsochFrameNumber; // 931 + UInt16 unknown9; // 932, setted to 256 + UInt16 mMaxPower; // 934 + UInt16 unknownb; // 936 + UInt16 unknownc; // 938 + BluetoothHCIVersionInfo mLocalVersionInfo; // 940 + + UInt32 mVendorCommandSelector; // 952 + UInt8 mNumConfiguredHIDDevices; // 956 + UInt8 unknownd; // 957 + bool mSupportWoBT; // 958 + bool unknowne; // 959 + + UInt32 unknownf; // 960 + UInt8 unknown10; // 964 + UInt8 unknown11; // 965 + UInt8 unknown12; // 966 + UInt8 unknown13; // 967 + bool mIgnoreUSBResetCmdSent; // 968 + UInt8 unknown14; // 969 + bool mSupportDeepIdle; // 970 + UInt8 unknown15; // 971 + bool mWaitingForCompletedHCICommandsToSleep; // 972 calls transport completepowerstatechange + + int64_t mAppleBTLEAdvertisingReport[15]; // 976 + int64_t mTotalNumberofBTLEAdvertisingReportsReceived; // 1096 + int64_t mTotalNumberOfTimesBluetoothIdleTimerExpired; // 1104 + bool mPowerReportersCreated; // 1112 + int64_t mLESetAdvertisingData[15]; // 1120 + int64_t mTotalNumberOfLESetAdvertisingDataCommandSent; // 1240 + + // Idle timer + bool mIdleTimerDisabled; // 1248 + bool mPowerStateChanging; // 1249 + bool mHandlingIdleTimeout; // 1250 + UInt32 mPendingIdleTimerValue; // 1252 + UInt32 mIdleTimerValue; // 1256 + bool mIdleTimerValueSet; // 1260 + UInt32 mIdleTimerTime; // 1264, the one functions actually use + UInt32 mNVRAMIdleTimerValue; // 1268 + bool mSetNVRAMIdleTimerValue; // 1272 + bool mClearNVRAMIdleTimerValue; // 1273 + UInt32 mTransportIdleTimerValue; // 1276 + bool mSupportIdleTimer; // 1280 + + bool mUpdatingFirmware; // 1281 + bool mPendingRequestsState; // 1282, processing = 1, kill = 0 + bool mLEConnectionCompleteOutOfSequence; // 1283 + UInt16 mControllerOutstandingCalls; // 1284 + bool mSystemNotReadyForSleep; // 1286 + bool mSupportDPLE; // 1287 + os_log_t mInternalOSLogObject; // 1288 + bool mAutoResumeSet; // 1296 + bool mACLPacketCausedFullWake; // 1297 +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_11_0 + bool mHardResetPerformed; // 1298 +#endif + UInt32 mHardResetCounter; // 1300 +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_11_0 + bool mHardResetDuringBoot; // 1304 + bool mSupportLighthouseFeature; // 1305 + bool mSendExitHIDSuspendPacket; // 1306 + UInt8 mAllowedNumberOfTimedOutHCICommands; // 1307 + UInt32 mCreateLEDeviceCallTime; // 1308 + bool mBluetoothdNotFound; // 1312 +#else + bool mHardResetPerformed; /// 1304 +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + UInt32 mCreateLEDeviceCallTime; /// 1308 + bool mHardResetDuringBoot; /// 1312 +#endif +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + bool mSupportLighthouseFeature; /// 1313 + bool mSendExitHIDSuspendPacket; /// 1314 +#endif +#endif + + struct ExpansionData + { + void * refCon; + }; + ExpansionData * mIOBluetoothHostControllerExpansionData; // 1320 +}; + +#endif diff --git a/QualcommWireless/include/IOKit/bluetooth/IOBluetoothInactivityTimerEventSource.h b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothInactivityTimerEventSource.h new file mode 100644 index 0000000..3b57af3 --- /dev/null +++ b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothInactivityTimerEventSource.h @@ -0,0 +1,88 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOKIT_IOBLUETOOTHINACTIVITYTIMEREVENTSOURCE_H +#define _IOKIT_IOBLUETOOTHINACTIVITYTIMEREVENTSOURCE_H + +#include + +class IOBluetoothInactivityTimerEventSource : public IOTimerEventSource +{ + OSDeclareDefaultStructors(IOBluetoothInactivityTimerEventSource) + +public: + virtual void updateTimer(); + virtual void handleTimer(OSObject * owner); + + static IOBluetoothInactivityTimerEventSource * createWithTimeoutInterval(AbsoluteTime interval, OSObject * owner, Action action = NULL); + static IOBluetoothInactivityTimerEventSource * createWithTimeoutIntervalMS(UInt32 ms, OSObject * owner, Action action = NULL); + static IOBluetoothInactivityTimerEventSource * createWithTimeoutIntervalUS(UInt32 us, OSObject * owner, Action action = NULL); + + /*! @function init + * @abstract Initializes the timer with an owner, and a handler to call when the timeout expires. + * @discussion This functions starts by calling IOTimerEventSource::init() with IOBluetoothInactivityTimerEventSource::timerFired as its timeout handler. Afterwards, it initializes + * mActivityCount to 0 and sets mTimeoutHandler to the parameter action. + * @param owner The owner of the timer. + * @param action A handler to call when the timeout expires. + * @result A true is returned on success and a false is returned on failure. + */ + + virtual bool init(OSObject * owner, Action action = NULL) APPLE_KEXT_OVERRIDE; + virtual bool initWithTimeoutInterval(AbsoluteTime interval, OSObject * owner, Action action = NULL); + virtual bool initWithTimeoutIntervalMS(UInt32 ms, OSObject * owner, Action action = NULL); + virtual bool initWithTimeoutIntervalUS(UInt32 us, OSObject * owner, Action action = NULL); + + static void timerFired(OSObject * owner, IOBluetoothInactivityTimerEventSource * sender); + virtual IOReturn setTimeout(AbsoluteTime interval) APPLE_KEXT_OVERRIDE; + virtual void cancelTimeout() APPLE_KEXT_OVERRIDE; + + virtual IOReturn setTimeoutInterval(AbsoluteTime interval); + virtual IOReturn setTimeoutIntervalMS(UInt32 ms); + virtual IOReturn setTimeoutIntervalUS(UInt32 us); + virtual AbsoluteTime getTimeoutInterval(); + virtual UInt32 getTimeoutIntervalMS(); + virtual UInt32 getTimeoutIntervalUS(); + + virtual void incrementActivityCount(); + virtual void decrementActivityCount(); + virtual UInt32 getActivityCount(); + + virtual IOReturn resetTimer(); + +protected: + AbsoluteTime mTimeoutInterval; // 96 + UInt32 mActivityCount; // 104 + Action mTimeoutHandler; // 112 +}; + +#endif diff --git a/QualcommWireless/include/IOKit/bluetooth/IOBluetoothInternal.h b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothInternal.h new file mode 100644 index 0000000..51a6ae3 --- /dev/null +++ b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothInternal.h @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2021 Apple Inc. All rights reserved. + * Copyright (c) 2021 cjiang. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/*! + * @header IOBluetoothInternal.h + * This header contains internal types and macros needed by public IOBluetooth kernel APIs. + */ + +#pragma once + +typedef enum IOBluetoothHCIControllerConfigState +{ + kIOBluetoothHCIControllerConfigStateOnline, // Controller is configured and ready for clients + kIOBluetoothHCIControllerConfigStateKernelSetupPending, // New controller - kernel setup in progress + kIOBluetoothHCIControllerConfigStateDaemonSetupPending, // New controller - daemon setup in progress + kIOBluetoothHCIControllerConfigStateDaemonSetupComplete, // New controller - daemon setup complete + kIOBluetoothHCIControllerConfigStateResetPending, // HCI reset has been issued + kIOBluetoothHCIControllerConfigStateKernelPostResetSetupPending, // HCI reset complete - kernel setup in progress + kIOBluetoothHCIControllerConfigStateDaemonPostResetSetupPending, // HCI reset complete - daemon setup in progress + kIOBluetoothHCIControllerConfigStateDaemonPostResetSetupComplete, // HCI reset complete - daemon setup complete + kIOBluetoothHCIControllerConfigStateUninitialized +} IOBluetoothHCIControllerConfigState; + +typedef UInt32 IOBluetoothHCIControllerPowerOptions; +enum +{ + kIOBluetoothHCIControllerPowerOptionPowerOffSupported = 0x00000001, + kIOBluetoothHCIControllerPowerOptionWakeFromExistingConnectionSupported = 0x00000002, + kIOBluetoothHCIControllerPowerOptionWakeFromNewConnectionSupported = 0x00000004, + kIOBluetoothHCIControllerPowerOptionIdleWithConnectionSupported = 0x00000008, + kIOBluetoothHCIControllerPowerOptionIdleWhenInternalPower = 0x00000010 +}; + +enum IOBluetoothHCIControllerSleepOptions +{ + kIOBluetoothHCIControllerAllowWakeFromExistingConnection = 0x00000001, + kIOBluetoothHCIControllerAllowWakeFromNewConnection = 0x00000002, + kIOBluetoothHCIControllerTemporaryOnFromIdle = 0x00000004 +}; + +#define HCI_CONTROLLER_POWER_OFF_SUPPORTED(_controllerPowerOptions) \ + ((_controllerPowerOptions & kIOBluetoothHCIControllerPowerOptionPowerOffSupported) == kIOBluetoothHCIControllerPowerOptionPowerOffSupported) +#define HCI_CONTROLLER_SLEEP_SUPPORTED(_controllerPowerOptions) \ + ((_controllerPowerOptions & (kIOBluetoothHCIControllerPowerOptionWakeFromExistingConnectionSupported | kIOBluetoothHCIControllerPowerOptionWakeFromNewConnectionSupported))) + +typedef enum IOBluetoothHCIControllerInternalPowerState +{ + kIOBluetoothHCIControllerInternalPowerStateOff = 0, + kIOBluetoothHCIControllerInternalPowerStateOn = 1, + kIOBluetoothHCIControllerInternalPowerStateSleep = 2, + kIOBluetoothHCIControllerInternalPowerStateIdle = 3 +} IOBluetoothHCIControllerInternalPowerState; + +enum IOBluetoothHCIControllerPowerStateOrdinal +{ + kIOBluetoothHCIControllerPowerStateOrdinalOff = 0, + kIOBluetoothHCIControllerPowerStateOrdinalIdle = 1, + kIOBluetoothHCIControllerPowerStateOrdinalOn = 2, + kIOBluetoothHCIControllerPowerStateOrdinalCount +}; + +typedef UInt32 IOBluetoothHCIControllerFeatureFlags; +enum +{ + kIOBluetoothHCIControllerFeatureFlagVendorCommandFlowControl = 0x00000001, + kIOBluetoothHCIControllerFeatureFlagSCOSupported = 0x00000002, + kIOBluetoothHCIControllerFeatureFlagSerializeCommands = 0x10000000 +}; + +typedef struct IOBluetoothHCIUnifiedInquiryResult +{ + BluetoothHCIInquiryResult originalInquiryResult; + + /*! @var eventCode + * This value should be kBluetoothHCIEventInquiryResult, kBluetoothHCIEventInquiryResultWithRSSI, or kBluetoothHCIEventExtendedInquiryResult. */ + + BluetoothHCIEventCode eventCode; + + /*! @var extendedInquiryResponse + * This value should be kBluetoothHCIEventExtendedInquiryResult only. */ + + BluetoothHCIExtendedInquiryResponse extendedInquiryResponse; + + UInt8 reserved; + + /*! @var RSSIValue + * This value should be kBluetoothHCIEventExtendedInquiryResult or kBluetoothHCIEventInquiryResultWithRSSI only. */ + + BluetoothHCIRSSIValue RSSIValue; +} IOBluetoothHCIUnifiedInquiryResult; + +enum BluetoothHCIExtendedInquiryResponseDataTypesAppleSpecificInfo +{ + kBluetoothHCIExtendedInquiryResponseDataTypeAppleSpecificInfoReserved = 0x00, + kBluetoothHCIExtendedInquiryResponseDataTypeAppleSpecificInfoModelIdentifier = 0x01, /* UTF8String char data */ + kBluetoothHCIExtendedInquiryResponseDataTypeAppleSpecificInfoThirdPartyAdvertising = 0x02, +}; + +#define REQUIRE(err) os_log(OS_LOG_DEFAULT, "REQUIRE failure: %s - file: %s:%d\n", err, __FILE__, __LINE__) +#define CHECK(err) os_log(OS_LOG_DEFAULT, "CHECK failure: %s - file: %s:%d\n", err, __FILE__, __LINE__) +#define REQUIRE_NO_ERR(err) os_log(OS_LOG_DEFAULT, "REQUIRE_NO_ERR failure: 0x%x - file: %s:%d\n", err, __FILE__, __LINE__) + +#define BluetoothFamilyLogPacket(family, type, format, ...) do { \ + _Static_assert(__builtin_constant_p(format), "format string must be constant"); \ + char * _pkt_log = (char *) IOMalloc(0x1FF); \ + if ( _pkt_log ) { \ + bzero(_pkt_log, 0x1FF); \ + snprintf(_pkt_log, 0x1FF, format, ##__VA_ARGS__); \ + if (family) { \ + family->LogPacket(type, _pkt_log, strlen(_pkt_log)); } \ + IOFree(_pkt_log, 0x1FF); \ + } \ + __asm__(""); /* avoid tailcall */ \ +} while (0) + +#define OSLogAndLogPacket(log, family, type, format, ...) do { \ + os_log(log, format, ##__VA_ARGS__); \ + BluetoothFamilyLogPacket(family, type, format, ##__VA_ARGS__); \ +} while (0) diff --git a/QualcommWireless/include/IOKit/bluetooth/IOBluetoothMemoryBlock.h b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothMemoryBlock.h new file mode 100644 index 0000000..40715b9 --- /dev/null +++ b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothMemoryBlock.h @@ -0,0 +1,294 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOKIT_IOBLUETOOTHMEMORYBLOCK_H +#define _IOKIT_IOBLUETOOTHMEMORYBLOCK_H + +#include +#include +#include + +class IOBluetoothMemoryBlock : public OSObject +{ + OSDeclareDefaultStructors(IOBluetoothMemoryBlock) + + typedef void (*IOBluetoothMemoryBlockCallBack)(IOBluetoothMemoryBlock * target, IOOptionBits options, UInt64 arg0, UInt64 arg1, UInt64 arg2, UInt64 arg3, UInt64 arg4); + +public: + static IOBluetoothMemoryBlock * withAddress(void * address, IOByteCount withLength, IODirection withDirection); + static IOBluetoothMemoryBlock * withCapacity(IOByteCount capacity, IODirection direction); + static IOBluetoothMemoryBlock * withSubBlock(IOBluetoothMemoryBlock * subBlock, IODirection direction); + + virtual bool initWithAddress(void * address, IOByteCount withLength, IODirection withDirection); + virtual bool initWithCapacity(IOByteCount capacity, IODirection direction); + virtual bool initWithSubBlock(IOBluetoothMemoryBlock * subBlock, IODirection direction); + + virtual bool init() APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + + virtual IOByteCount readBytes(IOByteCount offset, void * bytes, IOByteCount length); + virtual IOByteCount writeBytes(IOByteCount offset, const void * bytes, IOByteCount length); + virtual IODirection getDirection(); + virtual IOByteCount getLength(); + + virtual IOReturn appendBlock(IOBluetoothMemoryBlock * block); + virtual IOBluetoothMemoryBlock * getBlock(); + + virtual IOReturn setCallBack(IOBluetoothMemoryBlockCallBack callBack, UInt64 data1, UInt64 data2, UInt64 data3, UInt64 data4, UInt64 data5); + virtual bool sent(IOOptionBits status); + virtual bool hasCallBack(); + virtual IOOptionBits packetSentStatus(); + +protected: + void * mBytes; // 16 + IOByteCount mBytesLength; // 24 + bool mIsWithCapacity; // 32 + IOBluetoothMemoryBlock * mSubBlock; // 40 + IODirection mDirection; // 48 + IOBluetoothMemoryBlockCallBack mCallBack; // 56 + UInt64 mCallBackArgs[5]; // 64 + IOOptionBits mPacketSentStatus; // 104 +}; + +class IOBluetoothL2CAPMemoryBlock : public IOBluetoothMemoryBlock +{ + OSDeclareDefaultStructors(IOBluetoothL2CAPMemoryBlock) + +public: + static IOBluetoothL2CAPMemoryBlock * withAddress(void * address, IOByteCount withLength, IODirection withDirection); + static IOBluetoothL2CAPMemoryBlock * withCapacity(IOByteCount capacity, IODirection direction); + static IOBluetoothL2CAPMemoryBlock * withSubBlock(IOBluetoothMemoryBlock * subBlock, IODirection direction); + + virtual bool init() APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + + virtual IOByteCount readBytes(IOByteCount offset, void * bytes, IOByteCount length) APPLE_KEXT_OVERRIDE; + virtual IOByteCount writeBytes(IOByteCount offset, const void * bytes, IOByteCount length) APPLE_KEXT_OVERRIDE; + virtual IOByteCount getLength() APPLE_KEXT_OVERRIDE; + + virtual BluetoothL2CAPChannelID readChannelID(); + virtual void writeChannelID(BluetoothL2CAPChannelID channelID); + +protected: + BluetoothL2CAPChannelID mChannelID; // 108 +}; + +extern UInt16 IOBluetoothL2CAPFCS(UInt16, UInt8); + +class IOBluetoothL2CAPSupervisoryFrameMemoryBlock : public IOBluetoothL2CAPMemoryBlock +{ + OSDeclareDefaultStructors(IOBluetoothL2CAPSupervisoryFrameMemoryBlock) + + typedef UInt8 SupervisoryFunctionMask; + +public: + static IOBluetoothL2CAPSupervisoryFrameMemoryBlock * withDirection(IODirection direction); + + virtual bool init() APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + + virtual bool sent(IOOptionBits status) APPLE_KEXT_OVERRIDE; + virtual bool hasCallBack() APPLE_KEXT_OVERRIDE; + + virtual IOByteCount readBytes(IOByteCount offset, void * bytes, IOByteCount length) APPLE_KEXT_OVERRIDE; + virtual IOByteCount writeBytes(IOByteCount offset, void * bytes, IOByteCount length); + virtual IOByteCount getLength() APPLE_KEXT_OVERRIDE; + + UInt8 getSupervisoryFunctionMask(UInt16); + virtual UInt8 getSupervisoryFunctionMask(); + virtual UInt8 setSupervisoryFunctionMask(SupervisoryFunctionMask mask); + + bool getRetransmissionDisableBit(UInt16); + virtual bool getRetransmissionDisableBit(); + virtual UInt8 setRetransmissionDisableBit(bool); + + UInt8 getReceiveSequenceNumber(UInt16); + virtual UInt8 getReceiveSequenceNumber(); + virtual UInt8 setReceiveSequenceNumber(UInt8); + + virtual IOReturn readFCS(UInt16 *); + virtual IOReturn writeFCS(UInt16); + +protected: + UInt16 mStandardControlField; // 110 + UInt16 mFrameCheckSequence; // 112 +}; + +class IOBluetoothL2CAPInformationFrameMemoryBlock : public IOBluetoothL2CAPSupervisoryFrameMemoryBlock +{ + OSDeclareDefaultStructors(IOBluetoothL2CAPInformationFrameMemoryBlock) + + typedef UInt16 SegmentationAndReassemblyMask; + +public: + static IOBluetoothL2CAPInformationFrameMemoryBlock * withDataFromBlock(IOBluetoothL2CAPInformationFrameMemoryBlock * block, IOByteCount offset, IOByteCount size, IODirection direction); + virtual bool initWithDataFromBlock(IOBluetoothL2CAPInformationFrameMemoryBlock * block, IOByteCount offset, IOByteCount size, IODirection direction); + + virtual bool init() APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + + virtual UInt64 readBytes(IOByteCount offset, void * bytes, IOByteCount length) APPLE_KEXT_OVERRIDE; + virtual UInt64 writeBytes(IOByteCount offset, void * bytes, IOByteCount length) APPLE_KEXT_OVERRIDE; + virtual UInt64 getLength() APPLE_KEXT_OVERRIDE; + virtual IOBluetoothMemoryBlock * getBlock() APPLE_KEXT_OVERRIDE; + + virtual bool sent(IOOptionBits status) APPLE_KEXT_OVERRIDE; + virtual bool hasCallBack() APPLE_KEXT_OVERRIDE; + + UInt16 getSegmentationMask(UInt16); + virtual UInt16 getSegmentationMask(); + virtual UInt16 setSegmentationMask(SegmentationAndReassemblyMask); + UInt16 getTransmitSequenceNumber(UInt16); + virtual UInt16 getTransmitSequenceNumber(); + virtual UInt16 setTransmitSequenceNumber(UInt8); + virtual UInt16 getSDU(); + virtual int setSDU(UInt16); + virtual UInt16 getPayload(); + virtual int acked(int); + +protected: + UInt16 mInfoPacketOffset; // 114 + UInt16 mInfoPacketSize; // 116 + UInt16 mSDU; // 118 +}; + +class IOBluetoothRFCOMMMemoryBlock : public IOBluetoothMemoryBlock +{ + OSDeclareDefaultStructors(IOBluetoothRFCOMMMemoryBlock) + +public: + static IOBluetoothRFCOMMMemoryBlock * withAddress(void * address, IOByteCount withLength, IODirection withDirection); + static IOBluetoothRFCOMMMemoryBlock * withCapacity(IOByteCount capacity, IODirection direction); + static IOBluetoothRFCOMMMemoryBlock * withSubBlock(IOBluetoothMemoryBlock * subBlock, IODirection direction); + virtual bool init() APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + + virtual UInt64 readBytes(UInt64 offset, void * bytes, UInt64 length) APPLE_KEXT_OVERRIDE; + virtual UInt64 getLength() APPLE_KEXT_OVERRIDE; + virtual UInt64 getLogicalLength(); + + virtual UInt8 readAddressByte(); + virtual void writeAddressByte(UInt8 whatByte); + virtual UInt8 readControlByte(); + virtual void writeControlByte(UInt8 whatByte); + virtual UInt8 readFCFByte(); + virtual void writeFCFByte(UInt8 whatByte); + virtual UInt8 readHeaderBytes(void * bytes, UInt64 length); + virtual UInt64 writeBytes(UInt64 offset, void * bytes, UInt64 length); + +protected: + UInt8 mAddressByte; // 108 + UInt8 mControlByte; // 109 + UInt16 mHeaderBytes; // 110 + UInt8 mHeaderBytesSize; // 112 + UInt8 mFCFByte; // 113 +}; + +class IOBluetoothACLMemoryDescriptor : public IOGeneralMemoryDescriptor +{ + OSDeclareDefaultStructors(IOBluetoothACLMemoryDescriptor) + +public: + static IOBluetoothACLMemoryDescriptor * withL2CAPMemoryBlock(IOBluetoothL2CAPMemoryBlock * block, UInt64, UInt64 withOffset, UInt16, IOOptionBits options, bool asReference = false); + + virtual bool initWithAddress(void * address, IOByteCount withLength, IODirection withDirection); + virtual bool initWithAddress(IOVirtualAddress address, IOByteCount withLength, IODirection withDirection, task_t withTask); + virtual bool initWithPhysicalAddress(IOPhysicalAddress address, IOByteCount withLength, IODirection withDirection); + virtual bool initWithPhysicalRanges(IOPhysicalRange * ranges, UInt32 withCount, IODirection withDirection, bool asReference = false); + virtual bool initWithRanges(IOVirtualRange * ranges, UInt32 withCount, IODirection withDirection, task_t withTask, bool asReference = false); + virtual bool initWithL2CAPMemoryBlock(IOBluetoothL2CAPMemoryBlock * block, UInt64, UInt64 withOffset, UInt16, IOOptionBits options, bool asReference = false); + virtual void free() APPLE_KEXT_OVERRIDE; + + virtual IOByteCount readBytes(IOByteCount offset, void * bytes, IOByteCount withLength) APPLE_KEXT_OVERRIDE; + virtual IOByteCount writeBytes(IOByteCount offset, const void * bytes, IOByteCount withLength) APPLE_KEXT_OVERRIDE; + virtual IOReturn prepare(IODirection forDirection = kIODirectionNone) APPLE_KEXT_OVERRIDE; + virtual IOReturn complete(IODirection forDirection = kIODirectionNone) APPLE_KEXT_OVERRIDE; + + virtual IOByteCount getLength() const APPLE_KEXT_OVERRIDE; + virtual IOByteCount getPayloadLength(); + virtual bool sent(IOOptionBits status); + virtual int packetSentStatus(); + virtual bool hasCallBack(); + virtual BluetoothConnectionHandle getConnectionHandle(); + virtual void setPacketSentStatusToInvalid(); + + bool prepareHCIBlock(); + +protected: + IOBluetoothMemoryBlock * mBlock; // 176 + IOByteCount mBuffersOffset; // 184 + IOByteCount mLength; // 192 + BluetoothConnectionHandle mConnectionHandle; // 200 + UInt16 mHeaderBytes; // 202 + UInt32 unknown1; // 204 + bool mAsReference; // 208 + IOOptionBits mPacketSentStatus; // 212 + void * mData; // 216 + IOByteCount mDataSize; // 224 + uint64_t reserved1[2]; // 232 + uint16_t reserved2; // 248 + uint8_t reserved3; // 250 +}; + +class IOBluetoothMemoryDescriptorRetainer : public OSObject +{ + OSDeclareDefaultStructors(IOBluetoothMemoryDescriptorRetainer) + + struct MemoryDescriptorCallBack + { + IOMemoryDescriptor * buffer; + void * data; + void * owner; + IOTimerEventSource * timer; + }; + +public: + virtual bool init() APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + + MemoryDescriptorCallBack mMemoryDescriptorCallBack; // 16 +}; + +class IOBluetoothSCOMemoryDescriptorRetainer : public IOBluetoothMemoryDescriptorRetainer +{ + OSDeclareDefaultStructors(IOBluetoothSCOMemoryDescriptorRetainer) + +public: + virtual bool init() APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + +protected: + MemoryDescriptorCallBack mSCOMemoryDescriptorCallBack; // 48 +}; + +#endif diff --git a/QualcommWireless/include/IOKit/bluetooth/IOBluetoothMemoryBlockQueue.h b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothMemoryBlockQueue.h new file mode 100644 index 0000000..651d289 --- /dev/null +++ b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothMemoryBlockQueue.h @@ -0,0 +1,106 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +/*! + * @header IOBluetoothMemoryBlockQueue.h + * This header contains the definition of the IOBluetoothMemoryBlockQueue instance. + */ + +#ifndef _IOKIT_IOBLUETOOTHMEMORYBLOCKQUEUE_H +#define _IOKIT_IOBLUETOOTHMEMORYBLOCKQUEUE_H + +class IOBluetoothMemoryBlock; + +struct IOBluetoothMemoryBlockQueueNode +{ + IOBluetoothMemoryBlock * block; + IOBluetoothMemoryBlockQueueNode * next; + bool completionCalled; +}; + +class IOBluetoothMemoryBlockQueue : public OSObject +{ + OSDeclareDefaultStructors(IOBluetoothMemoryBlockQueue) + +public: + virtual bool init() APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + + /*! @function queueIsEmpty + * @abstract Determines if the queue is empty. + * @discussion The queue would be counted as empty if mHeadNode is NULL and mNumEntriesInQueue is 0. + * @result If the queue is empty, the result would be true. Otherwise, it would be false. */ + + virtual bool queueIsEmpty(); + + /*! @function enqueueBlock + * @abstract Adds a new memory block to the tail of the queue. + * @discussion This function adopts the same approach of enqueuing an object as any other queue, but it is not done directly. The block is to be placed into an + * IOBluetoothMemoryBlockQueueNode, which will instead be enqueued. If the function is successfully executed, mNumEntriesInQueue would increment. + * @param block The memory block to enqueue. + * @result An IOReturn indicating whether the operation was successful. */ + + virtual IOReturn enqueueBlock(IOBluetoothMemoryBlock * block); + + /*! @function peekNextBlock + * @abstract Derives the memory block at the head of the queue. + * @result The memory block of mHeadNode. If it does not exist, NULL will be returned. */ + + virtual IOBluetoothMemoryBlock * peekNextBlock(); + + /*! @function enqueueBlock + * @abstract Removes the memory block at the head of the queue. + * @discussion If the queue is not empty, this function will remove mHeadNode by releasing it and moving the next entry to its address. If the function is successfully executed, + * mNumEntriesInQueue would decrement. + * @result The IOBluetoothMemoryBlock that is in the entry dequeued. If nothing is dequeued, it would be NULL. */ + + virtual IOBluetoothMemoryBlock * dequeueBlock(); + + /*! @function flushQueue + * @abstract Removes all entries from the queue. + * @discussion This functions continuously calls dequeueBlock() until there are no more entries left. + * @param releaseBlock If this parameter is true, the IOBluetoothMemoryBlock instances in the entries dequeued will be released. Vice versa.*/ + + virtual void flushQueue(bool releaseBlock); + virtual UInt32 numberOfEntriesInQueue(); + virtual IOReturn setCompletionCalled(IOBluetoothMemoryBlock * block); + virtual bool completionRoutineIsCalled(); + virtual IOReturn removeBlock(IOBluetoothMemoryBlock * block); + virtual void printQueue(); + +protected: + IOBluetoothMemoryBlockQueueNode * mHeadNode; // 16 + IOBluetoothMemoryBlockQueueNode * mTailNode; // 24 + UInt32 mNumEntriesInQueue; // 32 +}; + +#endif diff --git a/QualcommWireless/include/IOKit/bluetooth/IOBluetoothObject.h b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothObject.h new file mode 100644 index 0000000..6572544 --- /dev/null +++ b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothObject.h @@ -0,0 +1,156 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +/*! + * @header IOBluetoothObject.h + * This header contains the definition of the IOBluetoothObject class, a base for many classes, mostly channels, in the IOBluetoothFamily. + */ + +#ifndef _IOKIT_IOBLUETOOTHOBJECT_H +#define _IOKIT_IOBLUETOOTHOBJECT_H + +#include +#include +#include + +class IOBluetoothHCIController; + +/*! + * @class IOBluetoothObject : public IOService + * @abstract An abstract class representing an object in the IOBluetoothFamily. + * @discussion The IOBluetoothObject is the base for a lot of IOBluetooth classes due to its abstractness. Each IOBluetoothObject has a specific object ID, which could be obtained from the family. One + * of its most significant features is to provide handle pending IOs. + */ + +class IOBluetoothObject : public IOService +{ + OSDeclareDefaultStructors(IOBluetoothObject) + +public: + virtual bool start(IOService * provider) APPLE_KEXT_OVERRIDE; + + virtual void free() APPLE_KEXT_OVERRIDE; + + virtual bool terminate(IOOptionBits options = 0) APPLE_KEXT_OVERRIDE; + + /*! @function willTerminate + * @abstract Passes a termination up the stack. + * @discussion Retains and releases the class per se, runs staticPerformTerminate from the command gate, and calls IOService::willTerminate(). + * @param provider The terminated provider of this object. + * @param options Options originally passed to terminate. + * @result An boolean indicating whether the operation was successful. */ + + virtual bool willTerminate(IOService * provider, IOOptionBits options) APPLE_KEXT_OVERRIDE; + + /*! @function performTerminate + * @abstract Use the command gate to sleep all pending IOs. + * @result For now, this function always returns kIOReturnSuccess. */ + + virtual IOReturn performTerminate(); + + /*! @function staticPerformTerminate + * @abstract Static version of performTerminate, implemented by converting owner to an IOBluetoothObject and calling performTerminate from there. + * @param owner The function's provider that will be converted to an IOBluetoothObject. + * @param arg0 Argument to action from run operation. + * @param arg1 Argument to action from run operation. + * @param arg2 Argument to action from run operation. + * @param arg3 Argument to action from run operation. + * @result An IOReturn indicating whether the operation was successful. */ + + static IOReturn staticPerformTerminate(OSObject * owner, void * arg0, void * arg1, void * arg2, void * arg3); + + /*! @function getWorkLoop + * @abstract Returns the current work loop. + * @result The current work loop, specifically mWorkLoop. */ + + virtual IOWorkLoop * getWorkLoop() const APPLE_KEXT_OVERRIDE; + + /*! @function getCommandGate + * @abstract Returns the current command gate. + * @result The current command gate, specifically mCommandGate. */ + + virtual IOCommandGate * getCommandGate() const; + + /*! @function incrementNumberOfPendingIO + * @abstract Increments the number of pending IOs by 1. + * @discussion This function would increment mNumPendingIO by 1 only if the workLoop is inGate() and the integer is within the range of an UInt32. + * @result An IOReturn indicating whether the operation was successful. */ + + virtual IOReturn incrementNumberOfPendingIO(); + + /*! @function decrementNumberOfPendingIO + * @abstract Decrements the number of pending IOs by 1. + * @discussion This function would decrement mNumPendingIO by 1 only if the workLoop is inGate() and the integer is within the range of an UInt32. If there are no pending IOs left after the + * decrement, it would call commandWakeup() to wakeup the threads. + * @result An IOReturn indicating whether the operation was successful. */ + + virtual IOReturn decrementNumberOfPendingIO(); + + /*! @function pendingIO + * @abstract Returns the number of attached pending IOs. + * @result The current number of pending IOs, specifically mNumPendingIO. */ + + virtual UInt32 pendingIO() const; + +protected: + /*! @var mWorkLoop + * The work loop of this class. For now, mCommandGate is the only event source that will be added. + * Offset: 136. */ + IOWorkLoop * mWorkLoop; + + /*! @var mWorkLoop + * The command gate of this class. + * Offset: 144. */ + IOCommandGate * mCommandGate; + + /*! @var mNumPendingIO + * This integer records to number of attached pending IOs. It could be obtained through pendingIO(). + * Offset: 152. */ + UInt32 mNumPendingIO; + + /*! @var mTerminateMask + * This unsigned char is used to mark if the class has been terminated. The second bit is set to true when termiante() is called. + * Offset: 156. */ + UInt8 mTerminateMask; + + /*! @var mBluetoothObjectID + * This integer records the BluetoothObjectID of this class, derived from mBluetoothFamily. + * Offset: 160. */ + UInt32 mBluetoothObjectID; + + /*! @var mBluetoothFamily + * A IOBluetoothHCIController that helps the class with several bluetooth-specific operations. + * Offset: 168. */ + IOBluetoothHCIController * mBluetoothFamily; +}; + +#endif diff --git a/QualcommWireless/include/IOKit/bluetooth/IOBluetoothTimerEventSource.h b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothTimerEventSource.h new file mode 100644 index 0000000..8080cbe --- /dev/null +++ b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothTimerEventSource.h @@ -0,0 +1,77 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOKIT_IOBLUETOOTHTIMEREVENTSOURCE_H +#define _IOKIT_IOBLUETOOTHTIMEREVENTSOURCE_H + +#include + +struct IOBluetoothTimer +{ + AbsoluteTime abstime; // 0 + UInt32 index; // 8 + void * refcon; // 16 + bool enabled; // 24 + IOBluetoothTimer * timerChainNext; // 32 +}; + +class IOBluetoothTimerEventSource : public IOTimerEventSource +{ + OSDeclareDefaultStructors(IOBluetoothTimerEventSource) + +public: + static IOBluetoothTimerEventSource * timerEventSource(OSObject * owner, Action action = NULL); + + static void timerAction(OSObject * owner, IOBluetoothTimerEventSource * sender); + virtual void timerFired(IOBluetoothTimerEventSource * sender); + virtual bool init(OSObject * owner, Action action = NULL) APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + virtual bool addTimer(AbsoluteTime abstime, UInt32 index, void * refcon); + virtual bool removeTimer(UInt32 index); + virtual bool removeAllTimers(); + + virtual IOReturn setTimeoutMS(UInt32, UInt32, void *); + virtual IOReturn setTimeoutUS(UInt32, UInt32, void *); + virtual IOReturn setTimeout(UInt32, UInt32, UInt32, void *); + virtual IOReturn setTimeout(AbsoluteTime abstime, UInt32, void *); + virtual void cancelTimeout(UInt32); + virtual void cancelTimeout() APPLE_KEXT_OVERRIDE; + +protected: + IOBluetoothTimer * mCurrentTimer; // 96 + OSObject * mOwner; // 104 + Action mTimeoutHandler; // 112 + IOBluetoothTimer * mFiringTimer; // 120 +}; + +#endif diff --git a/QualcommWireless/include/IOKit/bluetooth/IOBluetoothTypes.h b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothTypes.h new file mode 100644 index 0000000..e352d5b --- /dev/null +++ b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothTypes.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2021 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/*! + * @header IOBluetoothTypes.h + * This header defines IOReturn values specific to IOBluetooth. + */ + +#pragma once + +#import + +// Error returns +#ifndef sub_iokit_bluetooth +#define sub_iokit_bluetooth err_sub(8) +#endif + +#define iokit_bluetooth_err(return ) (sys_iokit | sub_iokit_bluetooth | return ) + +#define kIOBluetoothDeviceResetError iokit_bluetooth_err(1) // Device reset interrupted pending operation +#define kIOBluetoothConnectionAlreadyExists iokit_bluetooth_err(2) // Attempting to open a connection that already exists +#define kIOBluetoothNoHCIController iokit_bluetooth_err(3) // No HCI controller is present +#define kIOBluetoothHCIPowerStatesNotSupported iokit_bluetooth_err(4) // HCI controller does not support changing power states diff --git a/QualcommWireless/include/IOKit/bluetooth/IOBluetoothWorkLoop.h b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothWorkLoop.h new file mode 100644 index 0000000..9a82e4f --- /dev/null +++ b/QualcommWireless/include/IOKit/bluetooth/IOBluetoothWorkLoop.h @@ -0,0 +1,124 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +/*! + * @header IOBluetoothWorkLoop.h + * This header contains the definitions of the IOBluetoothLocalUtilityEventSource and IOBluetoothWorkLoop classes. + */ + +#ifndef _IOKIT_IOBLUETOOTHWORKLOOP_H +#define _IOKIT_IOBLUETOOTHWORKLOOP_H + +#include +#include + +/*! + * @class IOBluetoothLocalUtilityEventSource : public IOEventSource + * @abstract An event source providing utilities specific to the IOBluetooth family. + * @discussion The IOBluetoothLocalUtilityEventSource expands the functionality of its super class, IOEventSource, by implementing the functions closeGateOn() and openGateOn(), as well as a factory + * member function for organized construction of itself. This event source should be used and only used in the IOBluetooth family. + */ + +class IOBluetoothLocalUtilityEventSource : public IOEventSource +{ + OSDeclareDefaultStructors(IOBluetoothLocalUtilityEventSource) + +public: + /*! @function ioBluetoothLocalUtilityEventSource + * @abstract Factory member function to constuct and intialize an IOBluetoothLocalUtilityEventSource. + * @result Returns a IOBluetoothLocalUtilityEventSource instance if constructed successfully, 0 otherwise. + */ + + static IOBluetoothLocalUtilityEventSource * ioBluetoothLocalUtilityEventSource(); + + /*! @function checkForWork + * @abstract Virtual member function used by IOWorkLoop for work scheduling. + * @discussion This function overrides IOEventSource::checkForWork() so that it does nothing. + * @result Returns false. + */ + + virtual bool checkForWork() APPLE_KEXT_OVERRIDE; + + /*! @function closeGateOn + * @abstract Closes gate and sets the work loop. + * @discussion This function calls IOEventSource::setWorkLoop() and then IOEventSource::closeGate(). + * @param workLoop The parameter used in IOEventSource::setWorkLoop(). */ + + virtual void closeGateOn(IOWorkLoop * workLoop); + + /*! @function openGateOn + * @abstract Opens gate and sets the work loop. + * @discussion This function calls IOEventSource::setWorkLoop() and then IOEventSource::openGate(). + * @param workLoop The parameter used in IOEventSource::setWorkLoop(). */ + + virtual void openGateOn(IOWorkLoop * workLoop); +}; + +/*! + * @class IOBluetoothWorkLoop : public IOWorkLoop + * @abstract A work loop instance providing functions used exclusively by the IOBluetooth family. + * @discussion The IOBluetoothWorkLoop provides the functions handoffFrom() and returnTo(), which could help with linking between different work loops, a feature that could be used by the + * IOBluetoothFamily. This class also contains a factory member function for organized construction of itself. This work loop should be used and only used in the IOBluetooth family. + */ + +class IOBluetoothWorkLoop : public IOWorkLoop +{ + OSDeclareDefaultStructors(IOBluetoothWorkLoop) + +public: + /*! @function workLoop + * @abstract Factory member function to construct and intialize an IOBluetoothWorkLoop. + * @result Returns a IOBluetoothWorkLoop instance if constructed successfully, 0 otherwise. + */ + + static IOBluetoothWorkLoop * workLoop(); + + /*! @function handoffFrom + * @abstract Handoffs from a work loop instance. + * @discussion This function will first check if workLoop is inGate(). Then, it calls openGateOn(workLoop) using an IOBluetoothLocalUtilityEventSource instance and closeGate() on this. + * @param workLoop A work loop instance. + * @result An IOReturn indicating whether the operation is successful. + */ + + virtual IOReturn handoffFrom(IOWorkLoop * workLoop); + + /*! @function returnTo + * @abstract Returns to a work loop instance. + * @discussion This function will first check if workLoop is inGate(). Then, it calls openGate() on this and closeGateOn(workLoop) using an IOBluetoothLocalUtilityEventSource instance. + * @param workLoop A work loop instance. + * @result An IOReturn indicating whether the operation is successful. + */ + + virtual IOReturn returnTo(IOWorkLoop * workLoop); +}; + +#endif diff --git a/QualcommWireless/include/IOKit/bluetooth/IOWorkQueue.h b/QualcommWireless/include/IOKit/bluetooth/IOWorkQueue.h new file mode 100644 index 0000000..56d4fbe --- /dev/null +++ b/QualcommWireless/include/IOKit/bluetooth/IOWorkQueue.h @@ -0,0 +1,159 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOKIT_IOWORKQUEUE_H +#define _IOKIT_IOWORKQUEUE_H + +#include +#include + +/*! @class IOWorkQueue : public IOEventSource + * @abstract A circular queue that contains IOWorkQueueCall instances as its entries. + * @discussion ??? + */ + +class IOWorkQueue : public IOEventSource +{ + OSDeclareDefaultStructors(IOWorkQueue) + + typedef IOReturn (*Action)(OSObject * owner, void * arg0, void * arg1, void * arg2, void * arg3, void * arg4, void * arg5); + + // TO-DO: Make this clear + typedef int IOWorkQueueOperationMode; + enum IOWorkQueueOperationModes + { + kIOWorkQueueOperationModeWorkAvailable = 0, + kIOWorkQueueOperationModeWorkNotAvailable = 1, + kIOWorkQueueOperationModeCount + }; + + struct IOWorkQueueCall + { + Action action; // 0 + void * arg0; // 8 + void * arg1; // 16 + void * arg2; // 24 + void * arg3; // 32 + void * arg4; // 40 + void * arg5; // 48 + + IOWorkQueueCall * nextCall; // 56 + IOWorkQueueCall * previousCall; // 64 + }; + +public: + virtual void unusedCall002(IOWorkQueueCall **, IOWorkQueueCall **, IOWorkQueueCall *); + virtual void unusedCall003(IOWorkQueueCall **, IOWorkQueueCall **); + + virtual void enqueueWorkCall(IOWorkQueueCall *); + virtual IOWorkQueueCall * dequeueWorkCall(); + + virtual void unusedCall000(IOWorkQueueCall *); + virtual void unusedCall001(); + + virtual bool checkForWork() APPLE_KEXT_OVERRIDE; + virtual IOReturn executeWorkCall(IOWorkQueueCall *); + + virtual void processWorkCallFromSeparateThread(IOWorkQueueCall *); + virtual void processWorkCallFromSeparateThreadWL(); + static void * ThreadCallMain(void *, wait_result_t); + + virtual void unusedCall004(IOWorkQueueCall *); + + static IOWorkQueue * withCapacity(OSObject * owner, UInt32 size, IOWorkQueueOperationMode mode, bool isDebug, char * workQueueName); + virtual bool initWithCapacity(OSObject * owner, UInt32 size, IOWorkQueueOperationMode mode, bool isDebug, char * workQueueName); + + virtual void free() APPLE_KEXT_OVERRIDE; + + virtual IOReturn enqueueAction(Action action, void * arg0, void * arg1, void * arg2, void * arg3, void * arg4, void * arg5); + + virtual void setCountedActionLimit(UInt32 limit); + virtual bool allDoneProcessing(); + virtual void setEnqueueEnable(bool enabled); + virtual void removeAllEntries(); + virtual void disable() APPLE_KEXT_OVERRIDE; + virtual void disableWL(); + + OSMetaClassDeclareReservedUnused(IOWorkQueue, 0); + OSMetaClassDeclareReservedUnused(IOWorkQueue, 1); + OSMetaClassDeclareReservedUnused(IOWorkQueue, 2); + OSMetaClassDeclareReservedUnused(IOWorkQueue, 3); + OSMetaClassDeclareReservedUnused(IOWorkQueue, 4); + OSMetaClassDeclareReservedUnused(IOWorkQueue, 5); + OSMetaClassDeclareReservedUnused(IOWorkQueue, 6); + OSMetaClassDeclareReservedUnused(IOWorkQueue, 7); + OSMetaClassDeclareReservedUnused(IOWorkQueue, 8); + OSMetaClassDeclareReservedUnused(IOWorkQueue, 9); + OSMetaClassDeclareReservedUnused(IOWorkQueue, 10); + OSMetaClassDeclareReservedUnused(IOWorkQueue, 11); + OSMetaClassDeclareReservedUnused(IOWorkQueue, 12); + OSMetaClassDeclareReservedUnused(IOWorkQueue, 13); + OSMetaClassDeclareReservedUnused(IOWorkQueue, 14); + OSMetaClassDeclareReservedUnused(IOWorkQueue, 15); + OSMetaClassDeclareReservedUnused(IOWorkQueue, 16); + OSMetaClassDeclareReservedUnused(IOWorkQueue, 17); + OSMetaClassDeclareReservedUnused(IOWorkQueue, 18); + OSMetaClassDeclareReservedUnused(IOWorkQueue, 19); + +protected: + IOWorkQueueCall * mWorkQueueHeadCall; // 72 + IOWorkQueueCall * mWorkQueueTailCall; // 80 + IOSimpleLock * mWorkQueueCallSimpleLock; // 88 + + struct ExpansionData + { + IOWorkLoop * eWorkLoop; // 0 + IOCommandGate * eCommandGate; // 8 + bool eStop; // 16 + IOThread eThread[20]; // 24 + uint8_t eThreadLimit[20]; // 184 + }; + ExpansionData * mExpansionData; // 96 + +#define eWorkLoop IOWorkQueue::mExpansionData->eWorkLoop +#define eCommandGate IOWorkQueue::mExpansionData->eCommandGate +#define eStop IOWorkQueue::mExpansionData->eStop +#define eThread IOWorkQueue::mExpansionData->eThread +#define eThreadLimit IOWorkQueue::mExpansionData->eThreadLimit + + void * mUnusedPointer; // 104 + + IOWorkQueueOperationMode mOperationMode; // 112 + SInt32 mThreadCounter; // 116 + UInt32 mCountedActionLimit; // 120 + bool mDebug; // 124 + bool mEnqueueEnabled; // 125 + char mWorkQueueName[0x64]; // 126 +}; + +#endif diff --git a/QualcommWireless/include/IOKit/bluetooth/serial/IOBluetoothSerialClient.h b/QualcommWireless/include/IOKit/bluetooth/serial/IOBluetoothSerialClient.h new file mode 100644 index 0000000..dddb2a7 --- /dev/null +++ b/QualcommWireless/include/IOKit/bluetooth/serial/IOBluetoothSerialClient.h @@ -0,0 +1,263 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOKIT_IOBLUETOOTHSERIALCLIENT_H +#define _IOKIT_IOBLUETOOTHSERIALCLIENT_H + +#include +#include +#include +#include + +class IOBluetoothRFCOMMChannel; +class IOBluetoothSerialManager; + +enum ParityType +{ + NoParity = 0, + OddParity, + EvenParity, + MaxParity +}; + +#define kDefaultBaudRate 9600 +#define kMaxBaudRate 3000000 +#define kMaxCircularBufferSize 4096 + +typedef struct CirQueue +{ + UInt8 * Start; + UInt8 * End; + UInt8 * NextChar; + UInt8 * LastChar; + IOByteCount Size; + IOByteCount InQueue; + IOLock * InUse; +} CirQueue; + +typedef enum QueueStatus +{ + queueNoError = 0, + queueFull, + queueEmpty, + queueMaxStatus +} QueueStatus; + +QueueStatus InitQueue(CirQueue * Queue, UInt8 * Buffer, size_t Size); +QueueStatus CloseQueue(CirQueue * Queue); +size_t AddtoQueue(CirQueue * Queue, UInt8 * Buffer, size_t Size); +size_t FreeSpaceinQueue(CirQueue * Queue); +QueueStatus PrivateAddBytetoQueue(CirQueue * Queue, char Value); +size_t GetSingleBlockPointer(CirQueue * Queue, size_t MaxSize, UInt8 ** Pointer); +size_t ConsiderThisBlockRead(CirQueue * Queue, UInt8 * Buffer, size_t Size); + +size_t FillBlockWithQueue(CirQueue * Queue, IOBluetoothMemoryBlock * Block); +size_t RemovefromQueue(CirQueue * Queue, UInt8 * Buffer, size_t Size); +QueueStatus PrivateGetBytetoQueue(CirQueue * Queue, UInt8 * Value); +size_t UsedSpaceinQueue(CirQueue * Queue); +size_t GetQueueSize(CirQueue * Queue); +QueueStatus AddBytetoQueue(CirQueue * Queue, char Value); +QueueStatus GetBytetoQueue(CirQueue * Queue, UInt8 * Value); +QueueStatus GetQueueStatus(CirQueue * Queue); + +typedef struct BufferMarks +{ + UInt32 BufferSize; + UInt32 HighWater; + UInt32 LowWater; + bool OverRun; +} BufferMarks; + +typedef struct Stats_t +{ + UInt32 ints; + UInt32 txInts; + UInt32 rxInts; + UInt32 mdmInts; + UInt32 txChars; + UInt32 rxChars; +} Stats_t; + +typedef struct PortInfo_t +{ + UInt32 Instance; // 0 + const UInt8 * PortName; // 8 + UInt32 State; // 16 + UInt32 WatchStateMask; // 20 + IOSimpleLock * WatchLock; // 24 + IOSimpleLock * serialRequestLock; // 32 + + // queue control structures: + CirQueue RX; // 40 + CirQueue TX; // 96 + + BufferMarks RXStats; // 152 + BufferMarks TXStats; // 168 + + // dbdma memory control + IOLock * IODBDMARxLock; // 184 + IOLock * IODBDMATrLock; // 192 + + // UART configuration info: + UInt32 Base; // 200 + UInt32 CharLength; // 204 + UInt32 StopBits; // 208 + UInt32 TXParity; // 212 + UInt32 RXParity; // 216 + UInt32 BreakLength; // 220 + UInt32 BaudRate; // 224 + UInt16 DLRimage; // 228 + UInt8 LCRimage; // 230 + UInt8 FCRimage; // 231 + UInt8 IERmask; // 232 + UInt8 RBRmask; // 233 + UInt32 MasterClock; // 236 + bool MinLatency; // 237 + bool WaitingForTXIdle; // 238 + bool JustDoneInterrupt; // 239 + bool PCMCIA; // 240 + bool PCMCIAYanked; // 241 + + // flow control state & configuration: + UInt8 XONchar; // 242 + UInt8 XOFFchar; // 243 + UInt32 SWspecial[8]; // 244 + UInt32 FlowControl; // 276 notify-on-delta & auto_control + UInt32 FlowControlState; // 280 + int RXOstate; // receive state 284 + int TXOstate; // transmit state if any Flow Control is received 288 + + UInt8 xOffSent; // 292 + + // Globals in the Copeland Version + UInt32 GlobalRecvChars; // 296 + UInt32 OverRunChars; // 300 + + // callout entries: + IOThread FrameTOEntry; // 304 + IOThread DataLatTOEntry; // 312 + IOThread DelayTOEntry; // 320 + IOThread HeartBeatTOEntry; // 328 + mach_timespec FrameInterval; // 336 + mach_timespec DataLatInterval; // 344 + mach_timespec CharLatInterval; // 352 + mach_timespec HeartBeatInterval; // 360 + + // Statistics + Stats_t Stats; // 368 + bool AreTransmitting; // 392 + bool GotTXInterrupt; // 393 + + IOBluetoothSerialManager * mProvider; // 400 + IOBluetoothRFCOMMChannel * mRFCOMMChannel; // 408 + IOLock * mTransmitLock; // 416 + bool mBlockConsideredRead; // 424 + thread_call_t mSetUpTransmitThreadCall; // 432 + bool mNeedToSendBlock; // 440 +} PortInfo_t; + +class IOBluetoothSerialClientModemStreamSync : public IOModemSerialStreamSync +{ + OSDeclareDefaultStructors(IOBluetoothSerialClientModemStreamSync) + +public: + virtual bool compareName(OSString * name, OSString ** matched = NULL) const APPLE_KEXT_OVERRIDE; +}; + +class IOBluetoothSerialClientSerialStreamSync : public IORS232SerialStreamSync +{ + OSDeclareDefaultStructors(IOBluetoothSerialClientSerialStreamSync) + +public: + virtual bool compareName(OSString * name, OSString ** matched = NULL) const APPLE_KEXT_OVERRIDE; +}; + +class IOBluetoothSerialClient : public IOSerialDriverSync +{ + OSDeclareDefaultStructors(IOBluetoothSerialClient) + +public: + static void serialSignalsCallBack(IOService * provider, int); + + virtual void free() APPLE_KEXT_OVERRIDE; + virtual bool requestTerminate(IOService * provider, IOOptionBits options) APPLE_KEXT_OVERRIDE; + + virtual IOService * probe(IOService * provider, SInt32 * score) APPLE_KEXT_OVERRIDE; + virtual bool start(IOService * provider) APPLE_KEXT_OVERRIDE; + virtual void stop(IOService * provider) APPLE_KEXT_OVERRIDE; + virtual bool attach(IOService * provider) APPLE_KEXT_OVERRIDE; + virtual void detach(IOService * provider) APPLE_KEXT_OVERRIDE; + + static void changeState(PortInfo_t * port, UInt32 state, UInt32 mask); + static void dataInFunction(IOService * target, UInt16, void *); + static UInt32 readPortState(PortInfo_t * port); + static void CheckQueues(PortInfo_t * port); + static bool BlockIsGone(IOBluetoothMemoryBlock * block, int, UInt64, UInt64, UInt64, UInt64, UInt64); + static bool SendNextBlock(PortInfo_t * port); + static bool SetUpTransmit(void * port, void * refCon); + static void detachRFCOMMLink(PortInfo_t * port); + + static void SetStructureDefaults(PortInfo_t * port, bool init); + bool createSerialStream(); + + static bool allocateRingBuffer(CirQueue * Queue, size_t BufferSize); + static void freeRingBuffer(CirQueue * Queue); + + virtual IOReturn acquirePort(bool sleep, void * refCon) APPLE_KEXT_OVERRIDE; + virtual IOReturn releasePort(void * refCon) APPLE_KEXT_OVERRIDE; + virtual IOReturn setState(UInt32 state, UInt32 mask, void * refCon) APPLE_KEXT_OVERRIDE; + virtual UInt32 getState(void * refCon) APPLE_KEXT_OVERRIDE; + virtual IOReturn watchState(UInt32 * state, UInt32 mask, void * refCon) APPLE_KEXT_OVERRIDE; + static IOReturn watchState(PortInfo_t * port, UInt32 * state, UInt32 mask); + virtual UInt32 nextEvent(void * refCon) APPLE_KEXT_OVERRIDE; + virtual IOReturn executeEvent(UInt32 event, UInt32 data, void * refCon) APPLE_KEXT_OVERRIDE; + static IOReturn executeEvent(PortInfo_t *, UInt32 event, UInt32 data, UInt32 * oldState, UInt32 * newState); + virtual IOReturn requestEvent(UInt32 event, UInt32 * data, void * refCon) APPLE_KEXT_OVERRIDE; + virtual IOReturn enqueueEvent(UInt32 event, UInt32 data, bool sleep, void * refCon) APPLE_KEXT_OVERRIDE; + virtual IOReturn dequeueEvent(UInt32 * event, UInt32 * data, bool sleep, void * refCon) APPLE_KEXT_OVERRIDE; + virtual IOReturn enqueueData(UInt8 * buffer, UInt32 size, UInt32 * count, bool sleep, void * refCon) APPLE_KEXT_OVERRIDE; + virtual IOReturn dequeueData(UInt8 * buffer, UInt32 size, UInt32 * count, UInt32 min, void * refCon) APPLE_KEXT_OVERRIDE; + + static IOReturn activatePort(PortInfo_t * port); + static void deactivatePort(PortInfo_t * port); + + static void dataLatTOHandler(PortInfo_t * port); + static void frameTOHandler(PortInfo_t * port); + static void delayTOHandler(PortInfo_t * port); + static void heartBeatTOHandler(PortInfo_t * port); + +protected: + PortInfo_t mSerialPort; // 136 +}; + +#endif diff --git a/QualcommWireless/include/IOKit/bluetooth/serial/IOBluetoothSerialManager.h b/QualcommWireless/include/IOKit/bluetooth/serial/IOBluetoothSerialManager.h new file mode 100644 index 0000000..6d3be15 --- /dev/null +++ b/QualcommWireless/include/IOKit/bluetooth/serial/IOBluetoothSerialManager.h @@ -0,0 +1,138 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOKIT_IOBLUETOOTHSERIALMANAGER_H +#define _IOKIT_IOBLUETOOTHSERIALMANAGER_H + +#include +#include +#include + +class IOBluetoothRFCOMMChannel; +class IOBluetoothL2CAPChannel; +class IOBluetoothHCIController; +class IOBluetoothRFCOMMConnection; + +class IOBluetoothSerialManager : public IOService +{ + OSDeclareDefaultStructors(IOBluetoothSerialManager) + + typedef struct SecurityParameters + { + bool authenticationRequired; + UInt8 encryptionType; + } SecurityParameters; + +protected: + static bool staticChannelGoesAway(void * target, void * refCon, IOService * newService, IONotifier * notifier); + static bool staticNewChannelShowsUp(void * target, void * refCon, IOService * newService, IONotifier * notifier); + static void newRFCOMMChannelMain(void *, void *); + static IOReturn staticNewChannelShowsUpAction(OSObject *, void *, void *, void *, void *); + static bool staticHCIControllerGoesAway(void * target, void * refCon, IOService * newService, IONotifier * notifier); + static void byeHCIControllerMain(void *, void *); + static IOReturn staticHCIControllerGoesAwayAction(OSObject *, void *, void *, void *, void *); + static bool staticHCIControllerShowsUp(void * target, void * refCon, IOService * newService, IONotifier * notifier); + static void newHCIControllerMain(void *, void *); + static IOReturn staticHCIControllerShowsUpAction(OSObject *, void *, void *, void *, void *); + static bool staticControllerTransportGoesAway(void * target, void * refCon, IOService * newService, IONotifier * notifier); + static bool staticControllerTransportShowsUp(void * target, void * refCon, IOService * newService, IONotifier * notifier); + static IOReturn staticOpenForClient(OSObject * target, void *, void *, void *, void *); + static IOReturn staticOpenL2CAPChannel(OSObject *, void *, void *, void *, void *); + static IOReturn staticCloseDeviceForService(OSObject *, void *, void *, void *, void *); + + virtual IOReturn protectedSetProperties(OSDictionary * dictionary); + virtual IOReturn protectedNewChannelShowsUp(IOBluetoothRFCOMMChannel * channel); + virtual IOReturn protectedHCIControllerGoesAway(IOBluetoothHCIController * controller); + virtual IOReturn protectedHCIControllerShowsUp(IOBluetoothHCIController * controller); + virtual IOReturn protectedOpenL2CAPChannel(BluetoothDeviceAddress * deviceAddress, SecurityParameters * params, UInt16, IOBluetoothL2CAPChannel ** outChannel); + virtual IOReturn protectedOpenChannelForClient(IOBluetoothSerialClient * client); + virtual IOReturn protectedCloseDeviceForService(IOService * service); + +public: + virtual bool init(OSDictionary * dictionary = NULL) APPLE_KEXT_OVERRIDE; + virtual bool start(IOService * provider) APPLE_KEXT_OVERRIDE; + virtual void stop(IOService * provider) APPLE_KEXT_OVERRIDE; + virtual IOReturn setProperties(OSObject * properties) APPLE_KEXT_OVERRIDE; + + virtual IOReturn capture(IOBluetoothRFCOMMConnection *, IOBluetoothSerialClient *); + virtual bool localRemovePort(OSString *); + virtual IOBluetoothSerialClient * localFindPort(OSString *); + virtual bool channelBelongsTo(IOBluetoothRFCOMMChannel *, UInt8 *); + virtual bool setProperties(OSDictionary * dictionary, IOBluetoothSerialClient *); + virtual bool copyProperty(const OSSymbol *, OSDictionary *, IOService *); + virtual bool handleSerialDictionary(OSDictionary *); + virtual bool terminateSerial(OSObject *); + virtual IOReturn addToAllowedPorts(IOBluetoothSerialClient *, bool); + IOReturn removeFromAllowedPorts(IOBluetoothSerialClient *); + virtual IOReturn openChannelForClient(IOBluetoothSerialClient *); + virtual bool closeChannelForClient(IOBluetoothSerialClient *); + virtual IOReturn closeDeviceForClientRFCOMM(IOBluetoothRFCOMMChannel *); + virtual bool serialMustReturnWithConnection(IOBluetoothSerialClient *); + virtual UInt8 serialAttachesToChannel(IOBluetoothSerialClient *); + + virtual bool serialNeedsBDAddress(IOBluetoothSerialClient *, BluetoothDeviceAddress *); + virtual bool serialIsEnabled(IOBluetoothSerialClient *); + virtual IOCommandGate * getBluetoothCommandGate() const; + +protected: + OSSymbol * mBTName; // 136 + OSSymbol * mBTTTYName; // 144 + OSSymbol * mBTPSM; // 152 + OSSymbol * mBTRFCOMMChannel; // 160 + OSSymbol * mBTAddress; // 168 + OSSymbol * mBTAuthenticationRequired; // 176 + OSSymbol * mBTEncryptionType; // 184 + OSSymbol * mBTSerialConnectionType; // 192 + OSSymbol * mBTEanbledState; // 200 + + IONotifier * mChInNotification; // 208 + IONotifier * mChOutNotification; // 216 + thread_call_t mNewChThreadCall; // 224 + IONotifier * mHCIInNotification; // 232 + IONotifier * mHCIOutNotification; // 240 + IONotifier * mTransportInNotification; // 248 + IONotifier * mTransportOutNotification; // 256 + thread_call_t mNewHCIThreadCall; // 264 + thread_call_t mByeHCIThreadCall; // 272 + IOWorkLoop * mWorkLoop; // 280 + IOCommandGate * mCommandGate; // 288 + IOWorkLoop * mBluetoothWorkLoop; // 296, workLoop of IOBluetoothHCIController + IOCommandGate * mBluetoothCommandGate; // 304 + IOBluetoothHCIController * mHCIController; // 312 + uint8_t __reserved; // 320, never used + IOBluetoothRFCOMMConnection * mRFCOMMConnection; // 328 + IOBluetoothL2CAPChannel * mL2CAPChannel; // 336 + bool mHasControllerTransport; // 344 +}; + +#endif diff --git a/QualcommWireless/include/IOKit/bluetooth/transport/CSRBluetoothHostControllerUSBTransport.h b/QualcommWireless/include/IOKit/bluetooth/transport/CSRBluetoothHostControllerUSBTransport.h new file mode 100644 index 0000000..2e33141 --- /dev/null +++ b/QualcommWireless/include/IOKit/bluetooth/transport/CSRBluetoothHostControllerUSBTransport.h @@ -0,0 +1,72 @@ +/* + * Released under "The GNU General Public License (GPL-2.0)" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _IOKIT_CSRBLUETOOTHHOSTCONTROLLERUSBTRANSPORT_H +#define _IOKIT_CSRBLUETOOTHHOSTCONTROLLERUSBTRANSPORT_H + +#include + +class CSRBluetoothHostControllerUSBTransport : public IOBluetoothHostControllerUSBTransport +{ + OSDeclareDefaultStructors(CSRBluetoothHostControllerUSBTransport) + +public: + virtual bool init(OSDictionary * dictionary = NULL) APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + virtual IOService * probe(IOService * provider, SInt32 * score) APPLE_KEXT_OVERRIDE; + virtual bool start(IOService * provider) APPLE_KEXT_OVERRIDE; + virtual bool InitializeTransportWL(IOService * provider); + virtual void systemWillShutdownWL(IOOptionBits options, void * parameter); + + OSMetaClassDeclareReservedUnused(CSRBluetoothHostControllerUSBTransport, 0); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostControllerUSBTransport, 1); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostControllerUSBTransport, 2); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostControllerUSBTransport, 3); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostControllerUSBTransport, 4); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostControllerUSBTransport, 5); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostControllerUSBTransport, 6); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostControllerUSBTransport, 7); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostControllerUSBTransport, 8); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostControllerUSBTransport, 9); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostControllerUSBTransport, 10); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostControllerUSBTransport, 11); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostControllerUSBTransport, 12); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostControllerUSBTransport, 13); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostControllerUSBTransport, 14); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostControllerUSBTransport, 15); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostControllerUSBTransport, 16); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostControllerUSBTransport, 17); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostControllerUSBTransport, 18); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostControllerUSBTransport, 19); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostControllerUSBTransport, 20); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostControllerUSBTransport, 21); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostControllerUSBTransport, 22); + OSMetaClassDeclareReservedUnused(CSRBluetoothHostControllerUSBTransport, 23); + +protected: + struct ExpansionData + { + void * mRefCon; + }; + ExpansionData * mExpansionData; +} + +#endif diff --git a/QualcommWireless/include/IOKit/bluetooth/transport/IOBluetoothHostControllerTransport.h b/QualcommWireless/include/IOKit/bluetooth/transport/IOBluetoothHostControllerTransport.h new file mode 100644 index 0000000..db10020 --- /dev/null +++ b/QualcommWireless/include/IOKit/bluetooth/transport/IOBluetoothHostControllerTransport.h @@ -0,0 +1,341 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +/*! + * @header + * This header contains the definition of the IOBluetoothHostControllerTransport class, a subclass of IOService that serves as the base class for all the various transports in the IOBluetoothFamily. + * + */ + +#ifndef _IOKIT_IOBLUETOOTHHOSTCONTROLLERTRANSPORT_H +#define _IOKIT_IOBLUETOOTHHOSTCONTROLLERTRANSPORT_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef __MAC_OS_X_VERSION_MIN_REQUIRED +#error "Missing macOS target version" +#endif + +extern void BluetoothSleepTimeOutOccurred(OSObject * owner, IOTimerEventSource * sender); + +static const char * gInternalPowerStateString[7] = { "OFF", "ON", "SLEEP", "IDLE", "OFF", "IDLE", "ON" }; +static const char * gOrdinalPowerStateString[3] = { "OFF", "IDLE", "ON" }; +static const char * gPowerManagerSleepTypeString[9] = { "kIOPMSleepTypeInvalid", "kIOPMSleepTypeAbortedSleep", "kIOPMSleepTypeNormalSleep", "kIOPMSleepTypeSafeSleep", "kIOPMSleepTypeHibernate", "kIOPMSleepTypeStandby", "kIOPMSleepTypePowerOff", "kIOPMSleepTypeDeepIdle", "kIOPMSleepTypeLast" }; +static const char * gPowerManagerSleepTypeShortString[9] = { "SleepTypeInvalid", "SleepTypeAbortedSleep", "SleepTypeNormalSleep", "SleepTypeSafeSleep", "SleepTypeHibernate", "SleepTypeStandby", "SleepTypePowerOff", "SleepTypeDeepIdle", "SleepTypeLast" }; + +extern const IORegistryPlane * gIODTPlane; + +/*! @class IOBluetoothHostControllerTransport + * @abstract The base class for IOBluetoothFamily transports. + * @discussion ??? + * + */ + +class IOBluetoothHostControllerTransport : public IOService +{ + OSDeclareAbstractStructors(IOBluetoothHostControllerTransport) + + friend class IOBluetoothHCIController; + friend class IOBluetoothHostController; + +public: + /*! @function init + * @abstract Initializes member variables of IOBluetoothHostControllerTransport. + @discussion This function calls CreateOSLogObject() to create mInternalOSLogObject, sets the initial value for various members of the class, calls GetNVRAMSettingForSwitchBehavior() to set up + mSwitchBehavior, and creates the ExpansionData. It calls super::init() at the end to initialize its inherited members. + * @result Result of IOService::init(). */ + + virtual bool init(OSDictionary * dictionary = NULL) APPLE_KEXT_OVERRIDE; + + /*! @function free + * @abstract Frees data structures that were allocated the class was initialized. */ + + virtual void free() APPLE_KEXT_OVERRIDE; + + /*! @function probe + * @abstract Probes a matched device to see if it can be used. + * @discussion Aside from running probe() of the super class, this function would check the SkipIOBluetoothHostControllerUSBTransport property in the gIODTPlane. If it exists, the function will + * terminate returning NULL as Bluetooth USB Transport should be skipped. + * @param provider The registered IOService object that matches a driver personality's matching dictionary. + * @param score The driver's probe score. + * @result If SkipIOBluetoothHostControllerUSBTransport does not exist, the result of IOService::probe() would be returned. Otherwise, the result would be NULL. */ + + virtual IOService * probe(IOService * provider, SInt32 * score) APPLE_KEXT_OVERRIDE; + + virtual bool start(IOService * provider) APPLE_KEXT_OVERRIDE; + virtual void stop(IOService * provider) APPLE_KEXT_OVERRIDE; + + virtual IOWorkLoop * getWorkLoop() const APPLE_KEXT_OVERRIDE; + virtual IOCommandGate * getCommandGate() const; + virtual bool setTransportWorkLoop(void *, IOWorkLoop * inWorkLoop); + + virtual bool terminate(IOOptionBits options = 0) APPLE_KEXT_OVERRIDE; + static IOReturn terminateAction(OSObject * owner, void * arg1, void * arg2, void * arg3, void * arg4); + virtual bool terminateWL(IOOptionBits options = 0); + + virtual bool InitializeTransport(); + static IOReturn InitializeTransportAction(OSObject * owner, void * arg1, void * arg2, void * arg3, void * arg4); + virtual bool InitializeTransportWL(IOService * provider); + + virtual OSObject * getPropertyFromTransport(const OSSymbol * aKey); + virtual OSObject * getPropertyFromTransport(const OSString * aKey); + virtual OSObject * getPropertyFromTransport(const char * aKey); + + virtual IOReturn SetRemoteWakeUp(bool); + virtual IOReturn DoDeviceReset(UInt16); + + virtual void AbortPipesAndClose(bool, bool); + virtual bool HostSupportsSleepOnUSB(); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + virtual bool StartLMPLogging(); +#endif + virtual bool StartLMPLoggingBulkPipeRead(); + virtual bool StartInterruptPipeRead(); + virtual bool StopInterruptPipeRead(); + virtual bool StartBulkPipeRead(); + virtual bool StopBulkPipeRead(); + + virtual IOReturn TransportBulkOutWrite(void *); + virtual IOReturn TransportIsochOutWrite(void *, void *, IOOptionBits); + virtual IOReturn TransportSendSCOData(void *); + virtual IOReturn TransportLMPLoggingBulkOutWrite(UInt8, UInt8); + + virtual IOReturn SendHCIRequest(UInt8 * buffer, IOByteCount size); + virtual void UpdateSCOConnections(UInt8, UInt32); + virtual IOReturn ToggleLMPLogging(UInt8 *); + + virtual IOReturn CallConfigPM(); + virtual bool ConfigurePM(IOService * policyMaker); + + virtual unsigned long maxCapabilityForDomainState(IOPMPowerFlags domainState) APPLE_KEXT_OVERRIDE; + virtual unsigned long initialPowerStateForDomainState(IOPMPowerFlags domainState) APPLE_KEXT_OVERRIDE; + + virtual IOReturn setPowerState(unsigned long powerStateOrdinal, IOService * whatDevice) APPLE_KEXT_OVERRIDE; + static IOReturn setPowerStateAction(OSObject * owner, void * arg1, void * arg2, void * arg3, void * arg4); + virtual IOReturn setPowerStateWL(unsigned long powerStateOrdinal, IOService * whatDevice); + + virtual IOReturn RequestTransportPowerStateChange(IOBluetoothHCIControllerInternalPowerState powerState, char * name); + virtual IOReturn WaitForControllerPowerState(IOBluetoothHCIControllerInternalPowerState powerState, char *); + virtual IOReturn WaitForControllerPowerStateWithTimeout(IOBluetoothHCIControllerInternalPowerState powerState, uint32_t timeout, char *, bool); + virtual void CompletePowerStateChange(char *); + virtual IOReturn ProcessPowerStateChangeAfterResumed(char *); + + virtual IOReturn setAggressiveness(unsigned long type, unsigned long newLevel) APPLE_KEXT_OVERRIDE; +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + static IOReturn setAggressivenessAction(OSObject * owner, void * arg1, void * arg2, void * arg3, void * arg4); + virtual bool setAggressivenessWL(unsigned long type, unsigned long newLevel); +#endif + + virtual IOReturn powerStateWillChangeTo(IOPMPowerFlags capabilities, unsigned long stateNumber, IOService * whatDevice) APPLE_KEXT_OVERRIDE; + static IOReturn powerStateWillChangeToAction(OSObject * owner, void * arg1, void * arg2, void * arg3, void * arg4); + virtual IOReturn powerStateWillChangeToWL(IOOptionBits options, void *); + + virtual void systemWillShutdown(IOOptionBits specifier) APPLE_KEXT_OVERRIDE; + static IOReturn systemWillShutdownAction(OSObject * owner, void * arg1, void * arg2, void * arg3, void * arg4); + virtual void systemWillShutdownWL(IOOptionBits options, void *); + + virtual IOBluetoothHCIControllerInternalPowerState GetCurrentPowerState(); + virtual IOBluetoothHCIControllerInternalPowerState GetPendingPowerState(); + + virtual IOReturn ChangeTransportPowerStateFromIdleToOn(char * name); + virtual IOReturn ChangeTransportPowerState(unsigned long ordinal, bool willWait, IOBluetoothHCIControllerInternalPowerState powerState, char * name); + virtual IOReturn WaitForControllerPowerStateChange(IOBluetoothHCIControllerInternalPowerState, char *); + + virtual IOReturn WakeupSleepingPowerStateThread(); + virtual bool ControllerSupportWoBT(); + virtual UInt16 GetControllerVendorID(); + virtual UInt16 GetControllerProductID(); + + virtual UInt8 GetRadioPowerState(); + virtual void SetRadioPowerState(UInt8 powerState); + + virtual bool GetNVRAMSettingForSwitchBehavior(); + virtual UInt32 GetControllerLocationID(); + virtual bool GetBuiltIn(); + virtual bool GetSupportPowerOff(); + virtual bool IsHardwareInitialized(); + virtual UInt32 GetHardwareStatus(); + virtual void ResetHardwareStatus(); + virtual UInt32 ConvertAddressToUInt32(void * address); + virtual void SetActiveController(bool); + virtual void ResetBluetoothDevice(); + virtual IOReturn TransportCommandSleep(void *, UInt32, char *, bool); + virtual void ReadyToGo(bool oneThread); + virtual bool TerminateCalled(); + virtual void GetInfo(void * outInfo); + virtual IOReturn CallPowerManagerChangePowerStateTo(unsigned long ordinal, char *); + virtual UInt16 GetControllerTransportType(); + virtual bool SupportNewIdlePolicy(); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + virtual void CheckACPIMethodsAvailabilities(); +#else + virtual void CheckSpecialGPIO(); +#endif + virtual IOReturn SetBTRS(); + virtual IOReturn SetBTPU(); + virtual IOReturn SetBTPD(); + virtual IOReturn SetBTRB(bool); + virtual IOReturn SetBTLP(bool); + + virtual void NewSCOConnection(); + + virtual void retain() const APPLE_KEXT_OVERRIDE; + virtual void release() const APPLE_KEXT_OVERRIDE; + virtual void RetainTransport(char *); + virtual void ReleaseTransport(char *); + + virtual IOReturn SetIdlePolicyValue(uint32_t idleTimeoutMs); + virtual bool TransportWillReEnumerate(); + virtual void ConvertPowerFlagsToString(IOPMPowerFlags, char *); + virtual void SetupTransportSCOParameters(); + virtual void DestroyTransportSCOParameters(); + virtual bool WaitForSystemReadyForSleep(char *); + virtual IOReturn StartBluetoothSleepTimer(); + virtual void CancelBluetoothSleepTimer(); +#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_15 + virtual bool StopAllReads(); +#endif + virtual os_log_t CreateOSLogObject(); + + virtual IOReturn setProperties(OSObject * properties) APPLE_KEXT_OVERRIDE; + static IOReturn setPropertiesAction(OSObject * owner, void * arg1, void * arg2, void * arg3, void * arg4); + virtual IOReturn setPropertiesWL(OSObject * properties); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + virtual IOReturn HardReset(); +#else + virtual IOReturn PerformHardReset(); +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_11_0 + virtual void DumpTransportProviderState(); +#endif + + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerTransport, 0); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerTransport, 1); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerTransport, 2); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerTransport, 3); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerTransport, 4); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerTransport, 5); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerTransport, 6); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerTransport, 7); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerTransport, 8); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerTransport, 9); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerTransport, 10); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerTransport, 11); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerTransport, 12); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerTransport, 13); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerTransport, 14); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerTransport, 15); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerTransport, 16); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerTransport, 17); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerTransport, 18); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerTransport, 19); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerTransport, 20); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerTransport, 21); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerTransport, 22); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerTransport, 23); + +public: + IOBluetoothHCIController * mBluetoothFamily; // 136 + IOBluetoothHostController * mBluetoothController; // 144 + IOService * mProvider; // 152 + IOWorkLoop * mWorkLoop; // 160 + IOCommandGate * mCommandGate; // 168 +#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_15 + IOWorkQueue * mTransportWorkQueue; ///176 +#endif + UInt16 mControllerVendorType; // 176 + + bool mUSBControllerSupportsSuspend; // 178 + UInt8 mTerminateState; // 179 + bool mLMPLoggingEnabled; // 180 + bool mSystemOnTheWayToSleep; // 181 + uint8_t reserved2; // 182 + uint8_t reserved3; // 183 + bool mConfiguredPM; // 184 + UInt32 mSwitchBehavior; // 188 + bool mHardwareInitialized; // 192 + UInt32 mHardwareStatus; // 196 + UInt32 mTerminateCounter; // 200 + bool mLMPLoggingAvailable; // 204 + void * mRefCon; // 208 + + IOBluetoothHCIControllerInternalPowerState mCurrentInternalPowerState; // 216 + IOBluetoothHCIControllerInternalPowerState mPendingInternalPowerState; // 220 + + UInt16 mConrollerTransportType; // 224 + bool mSupportNewIdlePolicy; // 226 + bool mBuiltIn; // 227 + UInt32 mLocationID; // 228 + bool mSupportPowerOff; // 232 + UInt32 mSleepType; // 236 + bool mIsControllerActive; // 240 + uint8_t reserved4; // 241 + UInt32 unknown111; // 244 + UInt8 mAlreadyOff; // 248 + UInt8 reserved6; // 249 + bool mSupportWoBT; // 250 + UInt8 mCurrentPMMethod; // 251 + UInt64 mTransportCounter; // 256, retain/released in Retain/ReleaseTransport + UInt16 mTransportOutstandingCalls; // 264 + bool reserved7; // 266 + IOTimerEventSource * mBluetoothSleepTimerEventSource; // 272 + bool mBluetoothSleepTimerStarted; // 280 + os_log_t mInternalOSLogObject; // 288 + bool mBootFromROM; // 296 + UInt16 mUARTProductID; // 298 +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + IOBluetoothACPIMethods * mACPIMethods; // 304 +#endif +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + bool reserved10; // 312 +#endif + + struct ExpansionData + { + UInt16 reserved; + }; + ExpansionData * mExpansionData; // 320 +}; + +#endif diff --git a/QualcommWireless/include/IOKit/bluetooth/transport/IOBluetoothHostControllerUARTTransport.h b/QualcommWireless/include/IOKit/bluetooth/transport/IOBluetoothHostControllerUARTTransport.h new file mode 100644 index 0000000..57a4dd7 --- /dev/null +++ b/QualcommWireless/include/IOKit/bluetooth/transport/IOBluetoothHostControllerUARTTransport.h @@ -0,0 +1,143 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOKIT_IOBLUETOOTHHOSTCONTROLLERUARTTRANSPORT_H +#define _IOKIT_IOBLUETOOTHHOSTCONTROLLERUARTTRANSPORT_H + +#include +#include +#include + +#ifndef __MAC_OS_X_VERSION_MIN_REQUIRED +#error "Missing macOS target version" +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 +extern void TimeOutHandler(OSObject * owner, IOTimerEventSource * sender); +#endif + +enum BluetoothUARTPacketTypes +{ + kBluetoothUARTPacketTypeHCIRequest = 1, + kBluetoothUARTPacketTypeBulk = 2, + kBluetoothUARTPacketTypeIsoch = 3, + kBluetoothUARTPacketTypeEvent = 4, + kBluetoothUARTPacketTypeLMP = 7 +}; + +class IOBluetoothHostControllerUARTTransport : public IOBluetoothHostControllerTransport +{ + OSDeclareAbstractStructors(IOBluetoothHostControllerUARTTransport) + +public: + virtual bool init(OSDictionary * dictionary = NULL) APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + virtual IOService * probe(IOService * provider, SInt32 * score) APPLE_KEXT_OVERRIDE; + virtual bool start(IOService * provider) APPLE_KEXT_OVERRIDE; + virtual void stop(IOService * provider) APPLE_KEXT_OVERRIDE; +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + virtual bool terminateWL(IOOptionBits options = 0) APPLE_KEXT_OVERRIDE; +#else + virtual bool terminate(IOOptionBits options = 0) APPLE_KEXT_OVERRIDE; +#endif + virtual bool ConfigurePM(IOService * policyMaker) APPLE_KEXT_OVERRIDE; + virtual IOReturn setPowerStateWL(unsigned long powerStateOrdinal, IOService * whatDevice) APPLE_KEXT_OVERRIDE; + virtual void CompletePowerStateChange(char *) APPLE_KEXT_OVERRIDE; + virtual IOReturn powerStateWillChangeToWL(IOOptionBits options, void *) APPLE_KEXT_OVERRIDE; + virtual IOReturn RequestTransportPowerStateChange(IOBluetoothHCIControllerInternalPowerState powerState, char *) APPLE_KEXT_OVERRIDE; + virtual void systemWillShutdownWL(IOOptionBits options, void *) APPLE_KEXT_OVERRIDE; + + virtual UInt16 GetControllerVendorID() APPLE_KEXT_OVERRIDE; + virtual UInt16 GetControllerProductID() APPLE_KEXT_OVERRIDE; + + virtual IOReturn SendHCIRequest(UInt8 * data, IOByteCount size) APPLE_KEXT_OVERRIDE; + virtual IOReturn TransportBulkOutWrite(void * data) APPLE_KEXT_OVERRIDE; + virtual IOReturn TransportIsochOutWrite(void * data, void * retainer, IOOptionBits options) APPLE_KEXT_OVERRIDE; + virtual IOReturn TransportSendSCOData(void *) APPLE_KEXT_OVERRIDE; + + virtual IOReturn SendUART(UInt8 * data, UInt32 size); + static IOReturn StaticProcessACLSCOEventData(void * data, int size); + virtual IOReturn ProcessACLSCOEventData(); + virtual void GetInfo(void * outInfo) APPLE_KEXT_OVERRIDE; +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + virtual IOReturn AcquirePort(bool); +#else + virtual IOReturn AcquirePort(); +#endif + virtual IOReturn ReleasePort(); +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + virtual IOReturn WaitForReceiveToBeReady(bool); +#else + virtual IOReturn WaitForReceiveToBeReady(); +#endif + virtual void NewSCOConnection() APPLE_KEXT_OVERRIDE; + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + virtual IOReturn SetLMPLogging(); + virtual bool StartLMPLogging() APPLE_KEXT_OVERRIDE; + virtual bool StopLMPLogging(); +#endif + virtual IOReturn ToggleLMPLogging(UInt8 *) APPLE_KEXT_OVERRIDE; + + virtual IOReturn DoDeviceReset(UInt16) APPLE_KEXT_OVERRIDE; +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + virtual IOReturn DequeueDataInterruptEventGated(IOInterruptEventSource * sender, int count); +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_11_0 + virtual void DumpTransportProviderState() APPLE_KEXT_OVERRIDE; +#endif + +protected: + UInt8 * mDataToSend; // 328, the UART packet sent through SendUART() + UInt8 * mDataReceived; // 336, obtained from mProvider->DequeueData() + IORS232SerialStreamSync * mProvider; // 344 + void * mIsochOutWriteRetainer; // 352, second param of TransportIsochOutWrite + bool mReadyToReceive; // 360 + UInt32 mIsochOutWriteCounter; // 364 + bool mPowerStateChangeInProgress; // 368 + bool mSkipBluetoothFirmwareBoot; // 369 +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + IOWorkLoop * mUARTTransportWorkLoop; // 376 + IOInterruptEventSource::Action mDequeueDataInterruptEventAction; // 384 + IOInterruptEventSource * mDequeueDataInterruptEvent; // 392 + IOWorkLoop * mUARTTransportTimerWorkLoop; // 400 + IOCommandGate * mUARTTransportTimerCommandGate; // 408 + IOTimerEventSource * mUARTTransportTimer; // 416 + bool mUARTTransportTimerHasTimeout; // 424 + UInt32 mSlowEnqueueData; // 428 + UInt32 mLongestEnqueueDataCallMicroseconds; // 432 +#endif +}; + +#endif diff --git a/QualcommWireless/include/IOKit/bluetooth/transport/IOBluetoothHostControllerUSBTransport.h b/QualcommWireless/include/IOKit/bluetooth/transport/IOBluetoothHostControllerUSBTransport.h new file mode 100644 index 0000000..1de4c7b --- /dev/null +++ b/QualcommWireless/include/IOKit/bluetooth/transport/IOBluetoothHostControllerUSBTransport.h @@ -0,0 +1,287 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOKIT_IOBLUETOOTHHOSTCONTROLLERUSBTRANSPORT_H +#define _IOKIT_IOBLUETOOTHHOSTCONTROLLERUSBTRANSPORT_H + +#include +#include +#include + +extern const IORegistryPlane * gIODTPlane; +extern const IORegistryPlane * gIOServicePlane; +extern const OSSymbol * gIOGeneralInterest; + +class IOBluetoothMemoryDescriptorRetainer; + +class IOBluetoothHostControllerUSBTransport : public IOBluetoothHostControllerTransport +{ + OSDeclareAbstractStructors(IOBluetoothHostControllerUSBTransport) + + friend class IOBluetoothHostController; + +public: + virtual bool init(OSDictionary * dictionary = NULL) APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + virtual IOService * probe(IOService * provider, SInt32 * score) APPLE_KEXT_OVERRIDE; + virtual bool start(IOService * provider) APPLE_KEXT_OVERRIDE; + virtual void stop(IOService * provider) APPLE_KEXT_OVERRIDE; + virtual bool terminateWL(IOOptionBits options = 0) APPLE_KEXT_OVERRIDE; + virtual bool InitializeTransportWL(IOService * provider) APPLE_KEXT_OVERRIDE; + + virtual IOReturn SetRemoteWakeUp(bool) APPLE_KEXT_OVERRIDE; + virtual IOReturn DoDeviceReset(UInt16) APPLE_KEXT_OVERRIDE; + + virtual void AbortPipesAndClose(bool stop, bool release) APPLE_KEXT_OVERRIDE; + virtual bool HostSupportsSleepOnUSB() APPLE_KEXT_OVERRIDE; + + virtual bool ConfigurePM(IOService * provider) APPLE_KEXT_OVERRIDE; + virtual unsigned long maxCapabilityForDomainState(IOPMPowerFlags domainState) APPLE_KEXT_OVERRIDE; + virtual unsigned long initialPowerStateForDomainState(IOPMPowerFlags domainState) APPLE_KEXT_OVERRIDE; +#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_14 + virtual IOReturn setAggressiveness(unsigned long type, unsigned long newLevel) APPLE_KEXT_OVERRIDE; +#endif + virtual IOReturn setPowerStateWL(unsigned long powerStateOrdinal, IOService * whatDevice) APPLE_KEXT_OVERRIDE; + virtual IOReturn RequestTransportPowerStateChange(IOBluetoothHCIControllerInternalPowerState powerState, char * calledByFunction) APPLE_KEXT_OVERRIDE; + virtual void CompletePowerStateChange(char *) APPLE_KEXT_OVERRIDE; + virtual IOReturn ProcessPowerStateChangeAfterResumed(char *) APPLE_KEXT_OVERRIDE; + virtual IOReturn powerStateWillChangeTo(IOPMPowerFlags capabilities, unsigned long stateNumber, IOService * whatDevice) APPLE_KEXT_OVERRIDE; + virtual IOReturn powerStateWillChangeToWL(IOOptionBits options, void *) APPLE_KEXT_OVERRIDE; + virtual void systemWillShutdownWL(IOOptionBits options, void *) APPLE_KEXT_OVERRIDE; + + virtual bool ControllerSupportWoBT() APPLE_KEXT_OVERRIDE; + virtual UInt16 GetControllerVendorID() APPLE_KEXT_OVERRIDE; + virtual UInt16 GetControllerProductID() APPLE_KEXT_OVERRIDE; + virtual UInt8 GetRadioPowerState() APPLE_KEXT_OVERRIDE; + virtual void SetRadioPowerState(UInt8 state) APPLE_KEXT_OVERRIDE; + virtual void ResetBluetoothDevice() APPLE_KEXT_OVERRIDE; + virtual void GetInfo(void * outInfo) APPLE_KEXT_OVERRIDE; + static IOReturn SetIdlePolicyValueAction(OSObject * owner, void * arg1, void * arg2, void * arg3, void * arg4); + virtual IOReturn SetIdlePolicyValue(uint32_t idleTimeoutMs) APPLE_KEXT_OVERRIDE; + virtual bool TransportWillReEnumerate() APPLE_KEXT_OVERRIDE; + + static IOReturn MessageReceiver(void * target, void * refCon, UInt32 messageType, IOService * provider, void * messageArgument, vm_size_t argSize); + virtual IOReturn HandleMessage(UInt32 messageType, IOService * provider, void * messageArgument, vm_size_t argSize); + static IOReturn HandleMessageAction(OSObject * owner, void * arg0, void * arg1, void * arg2, void * arg3, void * arg4, void * arg5); + + virtual IOReturn SendHCIRequest(UInt8 * buffer, IOByteCount size) APPLE_KEXT_OVERRIDE; + static void DeviceRequestCompleteHandler(void * owner, void * parameter, IOReturn status, uint32_t bytesTransferred); + static IOReturn DeviceRequestCompleteAction(OSObject * owner, void * arg1, void * arg2, void * arg3, void * arg4, void * arg5, void * arg6); + + virtual void UpdateSCOConnections(UInt8, UInt32) APPLE_KEXT_OVERRIDE; + virtual void SetupTransportSCOParameters() APPLE_KEXT_OVERRIDE; + virtual void DestroyTransportSCOParameters() APPLE_KEXT_OVERRIDE; + + virtual bool ConfigureDevice(); + virtual UInt8 GetInterfaceNumber(IOUSBHostInterface * interface); + virtual IOUSBHostInterface * FindNextInterface(IOUSBHostInterface *, UInt16, UInt16, UInt16, UInt16); + virtual IOUSBHostPipe * FindNextPipe(IOUSBHostInterface *, UInt8 type, UInt8 direction, UInt16 * maxPacketSize); + virtual bool FindInterfaces(); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + virtual bool StartLMPLogging() APPLE_KEXT_OVERRIDE; +#endif + virtual bool StartLMPLoggingBulkPipeRead() APPLE_KEXT_OVERRIDE; + virtual IOReturn ToggleLMPLogging(UInt8 *) APPLE_KEXT_OVERRIDE; + virtual IOReturn TransportLMPLoggingBulkOutWrite(UInt8, UInt8) APPLE_KEXT_OVERRIDE; + + virtual bool StartInterruptPipeRead() APPLE_KEXT_OVERRIDE; + virtual bool StopInterruptPipeRead() APPLE_KEXT_OVERRIDE; + static void InterruptReadHandler(void * owner, void * parameter, IOReturn status, uint32_t bytesTransferred); + + virtual bool StartBulkPipeRead() APPLE_KEXT_OVERRIDE; + virtual bool StopBulkPipeRead() APPLE_KEXT_OVERRIDE; + static void BulkInReadHandler(void * owner, void * parameter, IOReturn status, uint32_t bytesTransferred); + + virtual bool StartIsochPipeRead(); + virtual bool StopIsochPipeRead(); + static void IsochInReadHandler(void * owner, void * parameter, IOReturn status, IOUSBHostIsochronousFrame * frameList); + virtual void ResetIsocFrames(IOUSBHostIsochronousFrame * isocFrames, UInt32 numberOfFrames); + + virtual bool StopAllPipes(); + virtual bool StartAllPipes(); +#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_15 + virtual bool StopAllReads() APPLE_KEXT_OVERRIDE; +#endif + + virtual void WaitForAllIOsToBeAborted(); + virtual void ReceiveInterruptData(void * data, UInt32 dataSize, bool); + + virtual IOReturn TransportBulkOutWrite(void * buffer) APPLE_KEXT_OVERRIDE; + virtual IOReturn BulkOutWrite(IOMemoryDescriptor *); + static void BulkOutWriteCompleteHandler(void * owner, void * parameter, IOReturn status, uint32_t bytesTransferred); + static IOReturn BulkOutWriteCompleteAction(OSObject * onwer, void * arg1, void * arg2, void * arg3, void * arg4, void * arg5, void * arg6); + virtual void HandleBulkOutWriteTimeout(IOBluetoothMemoryDescriptorRetainer *); + static void BulkOutWriteTimerFired(OSObject * target, IOTimerEventSource * sender); + + virtual void HandleIsochData(void *, int, IOUSBHostIsochronousFrame *); + virtual IOReturn TransportIsochOutWrite(void * memDescriptor, void *, IOOptionBits) APPLE_KEXT_OVERRIDE; + virtual IOReturn IsochOutWrite(IOMemoryDescriptor * memDescriptor, IOBluetoothSCOMemoryDescriptorRetainer *, int); + static void IsochOutWriteCompleteHandler(void * owner, void * parameter, IOReturn status, IOUSBHostIsochronousFrame * frameList); + + virtual void LogData(void * data, UInt64, IOByteCount size); + virtual bool USBControllerSupportsSuspend(); + + virtual bool SystemGoingToSleep(); + virtual IOReturn PrepareControllerForSleep(); + virtual bool PrepareControllerWakeFromSleep(); + virtual bool PrepareControllerForPowerOff(bool); + virtual bool PrepareControllerForPowerOn(); + virtual bool SystemWakeCausedByBluetooth(); + + virtual IOReturn ProcessG3StandByWake(); + virtual IOReturn ReConfigure(); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + virtual bool NeedToTurnOnUSBDebug(); +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + virtual IOReturn HardReset() APPLE_KEXT_OVERRIDE; +#else + virtual IOReturn PerformHardReset() APPLE_KEXT_OVERRIDE; +#endif + +private: + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerUSBTransport, 0); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerUSBTransport, 1); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerUSBTransport, 2); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerUSBTransport, 3); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerUSBTransport, 4); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerUSBTransport, 5); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerUSBTransport, 6); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerUSBTransport, 7); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerUSBTransport, 8); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerUSBTransport, 9); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerUSBTransport, 10); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerUSBTransport, 11); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerUSBTransport, 12); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerUSBTransport, 13); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerUSBTransport, 14); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerUSBTransport, 15); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerUSBTransport, 16); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerUSBTransport, 17); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerUSBTransport, 18); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerUSBTransport, 19); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerUSBTransport, 20); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerUSBTransport, 21); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerUSBTransport, 22); + OSMetaClassDeclareReservedUnused(IOBluetoothHostControllerUSBTransport, 23); + +protected: + IOUSBHostDevice * mBluetoothUSBHostDevice; // 328 + IOUSBHostDevice * mBluetoothUSBHub; // 336 + UInt16 mActiveDeviceRequestIOCount; // 344 + UInt16 mVendorID; // 346 + UInt16 mProductID; // 348 + + IOUSBHostInterface * mInterface; // 352 + IOUSBHostInterface * mIsochInterface; // 360 + UInt8 mInterfaceNumber; // 368 + UInt8 mIsochInterfaceNumber; // 369 + + uint8_t mEmptyInterruptReadData[1021]; // 370, an empty buffer used to determine if the buffer stored in mInterruptReadDataBuffer is empty + IOUSBHostPipe * mInterruptPipe; // 1392 + Descriptor * mInterruptDescriptor; // 1400 + IOBufferMemoryDescriptor * mInterruptReadDataBuffer; // 1408 + IOUSBHostCompletion mInterruptCompletion; // 1416 (size = 24) + bool mInterruptPipeStarted; // 1440 + UInt16 mInterruptPipeOutstandingIOCount; // 1442 + + IOUSBHostPipe * mBulkInPipe; // 1448 + Descriptor * mBulkInDescriptor; // 1456 + IOBufferMemoryDescriptor * mBulkInReadDataBuffer; // 1464 + IOUSBHostCompletion mBulkInCompletion; // 1472, 24 + bool mBulkInPipeStarted; // 1496 + UInt16 mBulkInPipeOutstandingIOCount; // 1498 + + IOUSBHostPipe * mBulkOutPipe; // 1504 + IOUSBHostCompletion mBulkOutCompletion; // 1512 + 24 + + IOUSBHostPipe * mIsochInPipe; // 1536 + IOBufferMemoryDescriptor ** mIsochInReadDataBufferList; // 1544, contains 2 IOBufferMemoryDescriptor + int mIsochInReadDataBufferStates[2]; // 1552 + IOUSBHostIsochronousCompletion * mIsochInCompletionRoutineList; // 1560 + UInt32 mIsochInPipeNumReads; // 1568 + bool mIsochInReadsComplete; // 1572 + IOUSBHostIsochronousFrame * mIsochInFrames; // 1576 + UInt64 mIsochInFrameNumber; // 1584 + vm_size_t mIsochInReadDataBufferLength; // 1592 + UInt32 mIsochInPipeNumFrames; // 1596 + UInt32 mIsochInFrameNumRequestedBytes; // 1600, The number of bytes requested to transfer for this frame + + UInt32 mIsochOutFrameNumRequestedBytes; // 1604 + IOUSBHostPipe * mIsochOutPipe; // 1608 + IOUSBHostIsochronousCompletion mIsochOutCompletion; // 1616 + 24 + IOUSBHostIsochronousFrame * mIsochOutFrames; // 1640 + UInt32 mIsochOutPipeNumFrames; // 1648 + UInt64 mIsochOutFrameNumber; // 1656 + + UInt32 mPreviousIsochOutPipeNumFrames; // 1664 + UInt8 mInterruptReadNumRetries; // 1668 + UInt8 mBulkInReadNumRetries; // 1669 + IONotifier * mMessageReceiverNotifier; // 1672 + UInt64 mPreviousIsochOutFrameNumber; // 1680 + + UInt8 * mInterruptData; // 1688 + UInt8 mInterruptDataLength; // 1696 + UInt32 mInterruptDataPosition; // 1700 + UInt16 mStopInterruptPipeReadCounter; // 1704 + + bool mInterfaceFound; // 1706 + bool mIsochInterfaceFound; // 1707 + bool unknown1; // 1708 + uint8_t __reserved1; // 1709 + bool isServiceRegistered; // 1710 + bool unknown2; // 1711 + UInt8 mHardResetState; // 1712 + bool __reserved2; // 1713 + bool mMatchedOnInterface; // 1714 + UInt32 mInterruptSleepMs; // 1716 + bool mAbortPipesAndCloseCalled; // 1720 + bool mPreviousEventIsSpecial; // 1721 + bool mIOClassIsAppleUSBXHCIPCI; // 1722 + bool mStopAllPipesCalled; // 1723 + bool unknown5; // 1724 pm state + bool unknown6; // 1725 pm state + bool mHostDeviceStarted; // 1726 + bool mHubStarted; // 1727 + + struct ExpansionData + { + void * mRefCon; + }; + ExpansionData * mExpansionData; // 1728 +}; + +#endif diff --git a/QualcommWireless/include/IOKit/firewire/IOConfigDirectory.h b/QualcommWireless/include/IOKit/firewire/IOConfigDirectory.h new file mode 100644 index 0000000..d72ed21 --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOConfigDirectory.h @@ -0,0 +1,182 @@ +/* + * Copyright (c) 1998-2002 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef __IOCONFIGDIRECTORY_H__ +#define __IOCONFIGDIRECTORY_H__ + +#include +#include + +#include + +class OSData; +class OSString; +class OSIterator; +class IOFireWireDevice; + +/*! @class IOConfigDirectory +*/ +class IOConfigDirectory : public OSObject +{ + OSDeclareAbstractStructors(IOConfigDirectory); + +protected: + int fStart; // Offset into ROM of start of this dir + int fType; // Directory type + int fNumEntries; // In directory + +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + struct ExpansionData { }; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + + virtual bool initWithOffset(int start, int type); + + virtual const UInt32 *getBase() = 0; + virtual IOReturn createIterator(UInt32 testVal, UInt32 testMask, + OSIterator *&iterator); + virtual IOConfigDirectory *getSubDir(int start, int type) = 0; + +public: + /*! + @function update + makes sure that the ROM has at least the specified capacity, + and that the ROM is uptodate from its start to at least the + specified quadlet offset. + @result kIOReturnSuccess if the specified offset is now + accessable at romBase[offset]. + */ + virtual IOReturn update(UInt32 offset, const UInt32 *&romBase) = 0; + + /*! + @function getKeyType + Gets the data type for the specified key + @param type on return, set to the data type + @result kIOReturnSuccess if the key exists in the dictionary + */ + virtual IOReturn getKeyType(int key, IOConfigKeyType &type); + /*! + @function getKeyValue + Gets the value for the specified key, in a variety of forms. + @param value on return, set to the data type + @param text if non-zero, on return points to the + string description of the field, or NULL if no text found. + @result kIOReturnSuccess if the key exists in the dictionary + and is of a type appropriate for the value parameter + @param value reference to variable to store the entry's value + */ + virtual IOReturn getKeyValue(int key, UInt32 &value, OSString** text = NULL); + virtual IOReturn getKeyValue(int key, OSData *&value, + OSString** text = NULL); + virtual IOReturn getKeyValue(int key, IOConfigDirectory *&value, + OSString** text = NULL); + virtual IOReturn getKeyOffset(int key, FWAddress &value, + OSString** text = NULL); + + + /*! + @function getIndexType + Gets the data type for entry at the specified index + @param type on return, set to the data type + @result kIOReturnSuccess if the index exists in the dictionary + */ + virtual IOReturn getIndexType(int index, IOConfigKeyType &type); + /*! + @function getIndexKey + Gets the key for entry at the specified index + @param key on return, set to the key + @result kIOReturnSuccess if the index exists in the dictionary + */ + virtual IOReturn getIndexKey(int index, int &key); + + /*! + @function getIndexValue + Gets the value at the specified index of the directory, + in a variety of forms. + @param type on return, set to the data type + @result kIOReturnSuccess if the index exists in the dictionary + and is of a type appropriate for the value parameter + @param value reference to variable to store the entry's value + */ + virtual IOReturn getIndexValue(int index, UInt32 &value); + virtual IOReturn getIndexValue(int index, OSData *&value); + virtual IOReturn getIndexValue(int index, OSString *&value); + virtual IOReturn getIndexValue(int index, IOConfigDirectory *&value); + virtual IOReturn getIndexOffset(int index, FWAddress &value); + virtual IOReturn getIndexOffset(int index, UInt32 &value); + + /*! + @function getIndexEntry + Gets the entry at the specified index of the directory, + as a raw UInt32. + @param entry on return, set to the entry value + @result kIOReturnSuccess if the index exists in the dictionary + @param value reference to variable to store the entry's value + */ + virtual IOReturn getIndexEntry(int index, UInt32 &value); + + /*! + @function getSubdirectories + Creates an iterator over the subdirectories of the directory. + @param iterator on return, set to point to an OSIterator + @result kIOReturnSuccess if the iterator could be created + */ + virtual IOReturn getSubdirectories(OSIterator *&iterator); + + /*! + @function getKeySubdirectories + Creates an iterator over subdirectories of a given type of the directory. + @param key type of subdirectory to iterate over + @param iterator on return, set to point to an OSIterator + @result kIOReturnSuccess if the iterator could be created + */ + virtual IOReturn getKeySubdirectories(int key, OSIterator *&iterator); + + int getType() const; + + int getNumEntries() const; + +protected: + + virtual const UInt32 * lockData( void ) = 0; + virtual void unlockData( void ) = 0; + virtual IOReturn updateROMCache( UInt32 offset, UInt32 length ) = 0; + virtual IOReturn checkROMState( void ) = 0; + +private: + OSMetaClassDeclareReservedUnused(IOConfigDirectory, 0); + OSMetaClassDeclareReservedUnused(IOConfigDirectory, 1); + OSMetaClassDeclareReservedUnused(IOConfigDirectory, 2); + OSMetaClassDeclareReservedUnused(IOConfigDirectory, 3); + OSMetaClassDeclareReservedUnused(IOConfigDirectory, 4); + OSMetaClassDeclareReservedUnused(IOConfigDirectory, 5); + OSMetaClassDeclareReservedUnused(IOConfigDirectory, 6); + OSMetaClassDeclareReservedUnused(IOConfigDirectory, 7); + OSMetaClassDeclareReservedUnused(IOConfigDirectory, 8); + +}; + +#endif /* __IOCONFIGDIRECTORY_H__ */ diff --git a/QualcommWireless/include/IOKit/firewire/IOFWAddressSpace.h b/QualcommWireless/include/IOKit/firewire/IOFWAddressSpace.h new file mode 100644 index 0000000..7ad6764 --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFWAddressSpace.h @@ -0,0 +1,331 @@ +/* + * Copyright (c) 1998-2002 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/* + * + * IOFWAddressSpace.h + * + * Classes which describe addresses in the local node which are accessable to other nodes + * via firewire asynchronous read/write/lock requests. + */ + +#ifndef _IOKIT_IOFWADDRESSSPACE_H +#define _IOKIT_IOFWADDRESSSPACE_H + +#include +#include + +class IOFireWireDevice; +class IOFireWireBus; +class IOFireWireController; + +typedef void * IOFWRequestRefCon; + +/*! @function FWWriteCallback + @abstract Callback called when a write request packet is received for + a 'virtual' firewire address. + @param device is the node originating the request + @param speed is the FireWire speed of the request, update it if you need to control + the speed of the reply, otherwise the response will be the same speed. + @param addr is the address the device is requesting to write to + @param len is the number of bytes to write + @param buf contains the packet data + @param requestRefcon refcon Can be queried for extra info about the request, + using IOFireWireController::isLockRequest(), isQuadRequest() + @result return: + kFWResponseComplete = 0, OK + kFWResponseConflictError = 4, Resource conflict, may retry + kFWResponseDataError = 5, Data not available + kFWResponseTypeError = 6, Operation not supported + kFWResponseAddressError = 7 Address not valid in target device */ +typedef UInt32 (*FWWriteCallback)(void *refcon, UInt16 nodeID, IOFWSpeed &speed, + FWAddress addr, UInt32 len, const void *buf, IOFWRequestRefCon requestRefcon); + +/*! @function FWReadCallback + @abstract Callback called when a read request packet is received for + a 'virtual' firewire address. + @param nodeID is the node originating the request + @param speed is the FireWire speed of the request, update it if you need to control + the speed of the reply, otherwise the response will be the same speed. + @param addr is the address the device is requesting to read from + @param len is the number of bytes to read + @param buf contains the packet data + @param offset on return points to the offset into *buf of the packet data + @param requestRefcon refcon to pass back if sending a delayed response. Also can be queried + for extra info about the request + @result return: + kFWResponsePending = -1, Pseudo response, real response sent later. + kFWResponseComplete = 0, OK! + kFWResponseConflictError = 4, Resource conflict, may retry + kFWResponseDataError = 5, Data not available + kFWResponseTypeError = 6, Operation not supported + kFWResponseAddressError = 7 Address not valid in target device + + A return of kFWResponsePending should be followed at some later time by a call to + IOFireWireController::asyncReadResponse */ +typedef UInt32 (*FWReadCallback)(void *refcon, UInt16 nodeID, IOFWSpeed &speed, + FWAddress addr, UInt32 len, IOMemoryDescriptor **buf, + IOByteCount * offset, IOFWRequestRefCon requestRefcon); + +class IOFWAddressSpace; + +#pragma mark - + +/*! @class IOFWAddressSpaceAux + @discussion An IOFWAddressSpaceAux is for internal use only. You should never subclass IOFWAddressSpaceAux +*/ + +class IOFWAddressSpaceAux : public OSObject +{ + OSDeclareDefaultStructors(IOFWAddressSpaceAux) + + friend class IOFWAddressSpace; + +protected: + + IOFWAddressSpace * fPrimary; + IOFireWireController * fControl; + + OSSet * fTrustedNodeSet; + OSIterator * fTrustedNodeSetIterator; + + bool fExclusive; + + /*! + @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + + struct ExpansionData { }; + + /*! + @var reserved + Reserved for future use. (Internal use only) + */ + + ExpansionData * reserved; + + virtual bool init( IOFWAddressSpace * primary ); + virtual void free(); + + virtual bool isTrustedNode( UInt16 nodeID ); + virtual void addTrustedNode( IOFireWireDevice * device ); + virtual void removeTrustedNode( IOFireWireDevice * device ); + virtual void removeAllTrustedNodes( void ); + + bool isExclusive( void ); + void setExclusive( bool exclusive ); + + virtual bool intersects( IOFWAddressSpace * space ); + +private: + OSMetaClassDeclareReservedUsed(IOFWAddressSpaceAux, 0); + OSMetaClassDeclareReservedUnused(IOFWAddressSpaceAux, 1); + OSMetaClassDeclareReservedUnused(IOFWAddressSpaceAux, 2); + OSMetaClassDeclareReservedUnused(IOFWAddressSpaceAux, 3); + OSMetaClassDeclareReservedUnused(IOFWAddressSpaceAux, 4); + OSMetaClassDeclareReservedUnused(IOFWAddressSpaceAux, 5); + OSMetaClassDeclareReservedUnused(IOFWAddressSpaceAux, 6); + OSMetaClassDeclareReservedUnused(IOFWAddressSpaceAux, 7); + OSMetaClassDeclareReservedUnused(IOFWAddressSpaceAux, 8); + OSMetaClassDeclareReservedUnused(IOFWAddressSpaceAux, 9); + +}; + +#pragma mark - + +/* + * Base class for FireWire address space objects + */ + +/*! + @class IOFWAddressSpace +*/ + +class IOFWAddressSpace : public OSObject +{ + OSDeclareAbstractStructors(IOFWAddressSpace) + + friend class IOFWAddressSpaceAux; + +protected: + + IOFireWireController *fControl; + + /*! + @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + + struct ExpansionData + { + IOFWAddressSpaceAux * fAuxiliary; + }; + + /*! + @var reserved + Reserved for future use. (Internal use only) + */ + + ExpansionData * fIOFWAddressSpaceExpansion; + + virtual bool init(IOFireWireBus *bus); + virtual void free(); + +public: + + /*! @function doRead + @abstract An abstract method for processing an address space read request + @param nodeID FireWire Read from nodeID. + @param speed at this 'speed'. + @param addr with FireWire address 'addr'. + @param len read 'len' bytes from nodeID. + @param buf points to a memory descriptor containing the packet data. + @param offset start from this 'offset' in 'buf'. + @param refcon Can be queried for extra info about the request. + @result UIn32 returns kFWResponseComplete on success */ + virtual UInt32 doRead(UInt16 nodeID, IOFWSpeed &speed, FWAddress addr, UInt32 len, + IOMemoryDescriptor **buf, IOByteCount * offset, + IOFWRequestRefCon refcon) = 0; + + /*! @function doWrite + @abstract An abstract method for processing an address space write request + @param nodeID FireWire Write to nodeID. + @param speed at this 'speed'. + @param addr with FireWire address 'addr'. + @param len write 'len' bytes to nodeID. + @param buf obtain bytes from location given by 'buf'. + @param refcon Can be queried for extra info about the request. + @result UIn32 returns kFWResponseComplete on success */ + virtual UInt32 doWrite(UInt16 nodeID, IOFWSpeed &speed, FWAddress addr, UInt32 len, + const void *buf, IOFWRequestRefCon refcon) = 0; + + /*! @function doLock + @abstract A method for processing a lock request. + @param nodeID FireWire Lock request for nodeID. + @param speed at this 'speed'. + @param addr with FireWire address 'addr'. + @param inlen 'inlen' bytes to use. + @param newVal new value to write at 'addr' location . + @param outLen 'outLen' bytes for result. + @param oldVal old value read from 'addr' location. + @param extType Type like kFWExtendedTCodeCompareSwap. + @param refcon Can be queried for extra info about the request. + @result UIn32 returns kFWResponseComplete on success */ + virtual UInt32 doLock(UInt16 nodeID, IOFWSpeed &speed, FWAddress addr, UInt32 inlen, + const UInt32 *newVal, UInt32 &outLen, UInt32 *oldVal, + UInt32 extType, IOFWRequestRefCon refcon); + + /*! @function activate + @abstract Address space is ready for handling requests. + @result IOReturn + */ + virtual IOReturn activate(); + + /*! @function deactivate + @abstract Address space request handler is disabled. + @result none + */ + virtual void deactivate(); + + /*! @function contains + @abstract returns number of bytes starting at addr in this space + @result 0 if it doesn't contain the address + */ + virtual UInt32 contains(FWAddress addr); + + /*! @function isTrustedNode + @abstract returns true if the node is added as a trusted node + @param nodeID is the nodeID to verify whether its trusted. + @result false if nodeID is not trusted + */ + inline bool isTrustedNode( UInt16 nodeID ) + { return fIOFWAddressSpaceExpansion->fAuxiliary->isTrustedNode( nodeID ); } + + /*! @function addTrustedNode + @abstract Add a trusted node. + @param device object pointing to a FireWire node on the bus. + @result none + */ + inline void addTrustedNode( IOFireWireDevice * device ) + { fIOFWAddressSpaceExpansion->fAuxiliary->addTrustedNode( device ); } + + /*! @function removeTrustedNode + @abstract Remove a trusted node. + @param device object pointing to a FireWire node on the bus. + @result none + */ + inline void removeTrustedNode( IOFireWireDevice * device ) + { fIOFWAddressSpaceExpansion->fAuxiliary->removeTrustedNode( device ); } + + /*! @function removeAllTrustedNodes + @abstract Remove all trusted nodes. + @result none + */ + inline void removeAllTrustedNodes( void ) + { fIOFWAddressSpaceExpansion->fAuxiliary->removeAllTrustedNodes(); } + + /*! @function isExclusive + @abstract Checks if an address space wants exclusive control of its address range + @result True if the address space is marked exclusive false otherwise + */ + + inline bool isExclusive( void ) + { return fIOFWAddressSpaceExpansion->fAuxiliary->isExclusive(); } + + /*! @function setExclusive + @abstract Sets if this address space requires exclusive control of its address range. Exclusivity should be set before an address space is activated. + @param exclusive True if address space should be exclusive, false otherwise + @result none + */ + + inline void setExclusive( bool exclusive ) + { fIOFWAddressSpaceExpansion->fAuxiliary->setExclusive( exclusive ); } + + /*! @function intersects + @abstract Checks this address space intersects with the given address range. Currently only supports IOFWPsuedoAddressSpaces. + @param space An address space to compare against + @result True if the address spaces intersect false otherwise + */ + + inline bool intersects( IOFWAddressSpace * space ) + { return fIOFWAddressSpaceExpansion->fAuxiliary->intersects( space ); } + + +protected: + + virtual IOFWAddressSpaceAux * createAuxiliary( void ); + +private: + OSMetaClassDeclareReservedUsed(IOFWAddressSpace, 0); + OSMetaClassDeclareReservedUsed(IOFWAddressSpace, 1); + +}; + +// the physical and psuedo address space classes used to be defined here +// for backwards compatibility, we pull them in now. the ifdefs surrounding +// the content of the header files ensures we do not multiply include a header. + +#include +#include + +#endif /* _IOKIT_IOFWADDRESSSPACE */ diff --git a/QualcommWireless/include/IOKit/firewire/IOFWAsyncStreamListener.h b/QualcommWireless/include/IOKit/firewire/IOFWAsyncStreamListener.h new file mode 100644 index 0000000..025b591 --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFWAsyncStreamListener.h @@ -0,0 +1,132 @@ +/* + * Copyright (c) 1998-2001 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +#ifndef _IOKIT_IOFWASYNCSTREAMLISTENER_H +#define _IOKIT_IOFWASYNCSTREAMLISTENER_H + +#include +#include +#include +#include + +class IOFWAsyncStreamReceiver; +class IOFWAsyncStreamReceivePort; + +/*! @class IOFWAsyncStreamListener +*/ +class IOFWAsyncStreamListener : public OSObject +{ + OSDeclareDefaultStructors(IOFWAsyncStreamListener) + +friend class IOFWAsyncStreamReceiver; +friend class IOFireWireController; + +public: + +/*! @function initAll + @abstract Creates an AsyncStream client for an Isoch channel. + @param control Points to IOFireWireController. + @param channel Isoch channel for listening. + @param proc Callback on packet reception. + @param obj Client's callback object. + @result returns true on success, else false. */ + bool initAll( IOFireWireController *control, UInt32 channel, FWAsyncStreamReceiveCallback proc, void *refcon ); + +/*! @function setListenerHandler + @abstract Set the callback that should be called to handle incoming async stream packets + @param inReceiver The callback to set. + @result Returns the callback that was previously set or nil for none.*/ + const FWAsyncStreamReceiveCallback setListenerHandler( FWAsyncStreamReceiveCallback inReceiver ); + +/*! @function TurnOffNotification + @abstract Turns off client callback notification. + @result none. */ + inline void TurnOffNotification() { fNotify = false; }; + +/*! @function TurnOnNotification + @abstract Turns on client callback notification. + @result none. */ + inline void TurnOnNotification() { fNotify = true; }; + +/*! @function IsNotificationOn + @abstract checks the notification state. + @result true if ON, else false */ + inline bool IsNotificationOn() { return fNotify; }; + +/*! @function setFlags + @abstract set flags for the listener. + @param flags indicate performance metrics. + @result none. */ + void setFlags( UInt32 flags ); + +/*! @function getFlags + @abstract get the flags of listener. + @param none. + @result flags. */ + UInt32 getFlags(); + +/*! @function getRefCon + @abstract get the refcon specific to this listener. + @param none. + @result fRefCon refcon passed during initialization. */ + inline void* getRefCon() { return fRefCon; }; + +/*! @function getOverrunCounter + @abstract get overrun counter from the DCL program. + @param none. + @result returns the counter value. */ + UInt32 getOverrunCounter(); + +protected: + + FWAsyncStreamReceiveCallback fClientProc; + void *fRefCon; + IOFWAsyncStreamReceiver *fReceiver; + bool fNotify; + UInt32 fFlags; + IOFireWireController *fControl; + +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + struct ExpansionData { }; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + + virtual void free(void) APPLE_KEXT_OVERRIDE; + +private: +/*! function getReceiver + abstract Returns the Async Stream receiver object which tracks multiple + IOFWAsyncStreamListeners for the same Isoc channel. */ + inline IOFWAsyncStreamReceiver *getReceiver() { return fReceiver; }; + +/*! function invokeClients + abstract Invokes client's callback function with fRefCon. */ + void invokeClients( UInt8 *buffer ); + + OSMetaClassDeclareReservedUnused(IOFWAsyncStreamListener, 0); + OSMetaClassDeclareReservedUnused(IOFWAsyncStreamListener, 1); +}; +#endif // _IOKIT_IOFWASYNCSTREAMLISTENER_H + diff --git a/QualcommWireless/include/IOKit/firewire/IOFWCommand.h b/QualcommWireless/include/IOKit/firewire/IOFWCommand.h new file mode 100644 index 0000000..fdf85b5 --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFWCommand.h @@ -0,0 +1,977 @@ +/* + * Copyright (c) 1998-2002 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * + * IOFWCommand.h + * + */ +#ifndef _IOKIT_IOFWCOMMAND_H +#define _IOKIT_IOFWCOMMAND_H + +#include +#include + +#include + +#include + +#define kFWCmdDefaultRetries 3 +#define kFWCmdZeroRetries 0 +#define kFWCmdReducedRetries 2 +#define kFWCmdIncreasedRetries 6 + +class IOMemoryDescriptor; +class IOSyncer; +class IOFireWireBus; +class IOFireWireController; +class IOFireWireNub; +class IOFWAddressSpace; // Description of chunk of local FW address space +class IOFWCommand; +class IOFWBusCommand; +class IOFWAsyncStreamCommand; +class IOCommandGate; +class IOFWAsyncPHYCommand; + +struct AsyncPendingTrans; + +// Struct for head of command queue +/*! + @struct IOFWCmdQ + @abstract Structure for head of a queue of IOFWCommands + @field fHead Points to the head of the queue, or NULL if queue is empty + @field fTail Points to the tail of the queue, or NULL if queue is empty + @function headChanged called when head command is changed, or the command + itself changes state. +*/ + +struct IOFWCmdQ +{ + IOFWCommand *fHead; + IOFWCommand *fTail; + bool executeQueue(bool all); + virtual void headChanged(IOFWCommand *oldHead); + + virtual ~IOFWCmdQ() {} + + void checkProgress( void ); +}; + +// Callback when device command completes asynchronously +typedef void (*FWDeviceCallback)(void *refcon, IOReturn status, IOFireWireNub *device, IOFWCommand *fwCmd); + +// Callback when bus command completes asynchronously +typedef void (*FWBusCallback)(void *refcon, IOReturn status, IOFireWireBus *bus, IOFWBusCommand *fwCmd); + +// Callback when async stream command completes asynchronously +typedef void (*FWAsyncStreamCallback)(void *refcon, IOReturn status, IOFireWireBus *bus, IOFWAsyncStreamCommand *fwCmd); + +// Callback when async stream command completes asynchronously +typedef void (*FWAsyncPHYCallback)(void *refcon, IOReturn status, IOFireWireBus *bus, IOFWAsyncPHYCommand *fwCmd ); + +// Callback when async stream packet is received +typedef void (*FWAsyncStreamReceiveCallback)(void *refcon, const void *buf); + +#pragma mark - + +/* + * Base class for FireWire commands + */ +/*! @class IOFWCommand +*/ +class IOFWCommand : public IOCommand +{ + OSDeclareAbstractStructors(IOFWCommand) + +protected: + IOReturn fStatus; + IOFireWireController *fControl; + IOFWCommand * fQueuePrev; + IOFWCommand * fQueueNext; + IOFWCmdQ * fQueue; + UInt32 fTimeout; // How long (in microsecs) after execute() to timeout + AbsoluteTime fDeadline; // Time after which this command has timed out. + IOFWSyncer * fSyncWakeup; + UInt8 fSync; + UInt8 fCancelOnReset; + UInt8 spare[2]; + +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + struct MemberVariables + { + void * fFWIMRefCon; + IOReturn fCompletionStatus; + bool fSubmitTimeLatched; + AbsoluteTime fSubmitTime; + bool fFlush; + }; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + MemberVariables * fMembers; + + virtual IOReturn complete(IOReturn status); + virtual void updateTimer(); + virtual IOReturn startExecution(); + + /* + * Execute the FWCommand immediately + * must be called with the workloop gate closed + */ + virtual IOReturn execute() = 0; + +public: + + virtual bool initWithController(IOFireWireController *control); + virtual void free( void ); + + IOReturn getStatus() const { return fStatus; }; + + /* + * Submit the FWCommand. + * if queue is false the command's execute() + * method will be called on the caller's thread, otherwise + * the command wil be queued for execution on the work loop thread. + */ + virtual IOReturn submit(bool queue = false); + + /* + * Cancel command, causes it to complete with given status + */ + virtual IOReturn cancel(IOReturn reason); + + /*! + @function setHead + inserts a command at the head of a queue. + @param queue queue command is being added to + */ + virtual void setHead(IOFWCmdQ &queue); + /*! + @function insertAfter + inserts a command after the specified one. + @param prev command to insert after + @param queue queue command is being added to + */ + virtual void insertAfter(IOFWCommand &prev); + + /*! + @function removeFromQ + Removes command from current queue. + */ + virtual void removeFromQ(); + + IOFWCommand *getPrevious() const + { return fQueuePrev; }; + IOFWCommand *getNext() const + { return fQueueNext; }; + const AbsoluteTime &getDeadline() const + { return fDeadline; }; + + bool cancelOnReset() const + { return fCancelOnReset; }; + + bool Busy() const + { return fStatus == kIOReturnBusy || fStatus == kIOFireWirePending;}; + + void setTimeout( UInt32 timeout ) + { fTimeout = timeout; }; + + friend class IOFWCmdQ; + + void * getFWIMRefCon( void ) + { + return fMembers->fFWIMRefCon; + } + + void setFWIMRefCon( void * refcon ) + { + fMembers->fFWIMRefCon = refcon; + } + + void setFlush( bool flush ) + { + fMembers->fFlush = flush; + } + + virtual IOReturn checkProgress( void ); + +private: + OSMetaClassDeclareReservedUsed(IOFWCommand, 0); + OSMetaClassDeclareReservedUnused(IOFWCommand, 1); + +}; + +#pragma mark - + +/* + * Bus control commands + */ +/*! @class IOFWBusCommand +*/ +class IOFWBusCommand : public IOFWCommand +{ + OSDeclareAbstractStructors(IOFWBusCommand) + +protected: + FWBusCallback fComplete; + void * fRefCon; + +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + struct ExpansionData { }; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + + virtual IOReturn complete(IOReturn status); + + virtual bool initWithController(IOFireWireController *control, + FWBusCallback completion=NULL, void *refcon=NULL); + virtual IOReturn reinit(FWBusCallback completion, void *refcon); + +private: + OSMetaClassDeclareReservedUnused(IOFWBusCommand, 0); + +}; + +#pragma mark - + +/* + * Command to execute some code after a specified delay (in microseconds) + * All it does is timeout after the specified delay, hence calling the completion + * callback. + */ +/*! @class IOFWDelayCommand +*/ +class IOFWDelayCommand : public IOFWBusCommand +{ + OSDeclareDefaultStructors(IOFWDelayCommand) + +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + struct ExpansionData { }; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + +protected: + virtual IOReturn execute(); + +public: + virtual bool initWithDelay(IOFireWireController *control, UInt32 uSecs, + FWBusCallback completion, void *refcon); + virtual IOReturn reinit(UInt32 uSecs, FWBusCallback completion, void *refcon); + +private: + OSMetaClassDeclareReservedUnused(IOFWDelayCommand, 0); + +}; + +/* + * Send an async request to a device + */ +class IOFWUserReadQuadletCommand ; +class IOFWUserWriteCommand ; + +#pragma mark - + +/*! @class IOFWAsyncCommand +*/ +class IOFWAsyncCommand : public IOFWCommand +{ + OSDeclareAbstractStructors(IOFWAsyncCommand) + +protected: + IOFireWireNub * fDevice; + FWDeviceCallback fComplete; + void * fRefCon; + IOMemoryDescriptor *fMemDesc; + AsyncPendingTrans * fTrans; + UInt32 fAddressHi; + UInt32 fAddressLo; + IOByteCount fBytesTransferred; + int fSize; + int fSpeed; + int fMaxPack; + int fCurRetries; + int fMaxRetries; + UInt32 fGeneration; // bus topology fNodeID is valid for. + UInt16 fNodeID; + bool fFailOnReset; + bool fWrite; + + typedef struct + { + // some of our subclasses didn't have room for expansion data, so + // we've reserved space for their use here. + + void * fSubclassMembers; + int fMaxSpeed; + int fAckCode; + UInt32 fResponseCode; + UInt32 fFastRetryCount; + int fResponseSpeed; + bool fForceBlockRequests; + } + MemberVariables; + + MemberVariables * fMembers; + + virtual IOReturn complete(IOReturn status); + virtual bool initWithController(IOFireWireController *control); + virtual bool initAll(IOFireWireNub *device, FWAddress devAddress, + IOMemoryDescriptor *hostMem, + FWDeviceCallback completion, void *refcon, bool failOnReset); + virtual bool initAll(IOFireWireController *control, + UInt32 generation, FWAddress devAddress, + IOMemoryDescriptor *hostMem, + FWDeviceCallback completion, void *refcon); + virtual void free( void ); + virtual IOReturn reinit(FWAddress devAddress, IOMemoryDescriptor *hostMem, + FWDeviceCallback completion, void *refcon, bool failOnReset); + virtual IOReturn reinit(UInt32 generation, FWAddress devAddress, IOMemoryDescriptor *hostMem, + FWDeviceCallback completion, void *refcon); + bool createMemberVariables( void ); + void destroyMemberVariables( void ); +public: + // Utility for setting generation on newly created command + virtual void setGeneration(UInt32 generation) + { fGeneration = generation; } + + // To be called by IOFireWireController and derived classes. + virtual void gotPacket(int rcode, const void* data, int size) = 0; + virtual void gotAck(int ackCode); + + // update nodeID/generation after bus reset, from the device object + IOReturn updateGeneration(); + // explicitly update nodeID/generation after bus reset + IOReturn updateNodeID(UInt32 generation, UInt16 nodeID); + + // Generally useful stuff + IOByteCount getBytesTransferred() const + { return fBytesTransferred; }; + + FWAddress getAddress() const + { return FWAddress(fAddressHi, fAddressLo, fNodeID); } + + bool failOnReset() const + { return fFailOnReset; } + + IOFireWireNub * getDevice() const + { return fDevice; } + + /*! + @function setMaxPacket + Sets the maximum size for block transfers used by the command. + The command is initialized to use the maximum packet size calculated from the device's + PHY speed, bus info block and the bus topology. + Call this method before calling submit(). + @param maxBytes Maximum packet size in bytes. If the maxsize is 4 then quadlet transfers will be used. + */ + IOReturn setMaxPacket(UInt32 maxBytes) + { + if(fStatus == kIOReturnBusy || fStatus == kIOFireWirePending) + return fStatus; + fMaxPack = maxBytes; + return kIOReturnSuccess; + } + + void setMaxSpeed( int speed ); + + void setAckCode( int ack ); + int getAckCode( void ); + + void setRetries( int retries); + int getMaxRetries( void ); + + void setResponseCode( UInt32 rcode ); + UInt32 getResponseCode( void ) const; + + void setFastRetryCount( UInt32 count ) + { fMembers->fFastRetryCount = count; }; + + UInt32 getFastRetryCount( void ) + { return fMembers->fFastRetryCount; }; + + void setResponseSpeed( int speed ) + { fMembers->fResponseSpeed = speed; }; + + int getResponseSpeed( void ) + { return fMembers->fResponseSpeed; }; + + // forces even 4 byte transactions to be block requests + void setForceBlockRequests( bool enabled ) + { fMembers->fForceBlockRequests = enabled; } + + virtual IOReturn checkProgress( void ); + +private: + OSMetaClassDeclareReservedUnused(IOFWAsyncCommand, 0); + OSMetaClassDeclareReservedUnused(IOFWAsyncCommand, 1); + OSMetaClassDeclareReservedUnused(IOFWAsyncCommand, 2); + OSMetaClassDeclareReservedUnused(IOFWAsyncCommand, 3); + +}; + +#pragma mark - + +/* + * Concrete async requests - read, write and hordes of read/modify/write + */ +class IOFWReadCommand : public IOFWAsyncCommand +{ + OSDeclareDefaultStructors(IOFWReadCommand) + +protected: + + virtual void gotPacket(int rcode, const void* data, int size); + + virtual IOReturn execute(); + +public: + virtual bool initAll(IOFireWireNub *device, FWAddress devAddress, + IOMemoryDescriptor *hostMem, + FWDeviceCallback completion, void *refcon, bool failOnReset); + virtual bool initAll(IOFireWireController *control, + UInt32 generation, FWAddress devAddress, + IOMemoryDescriptor *hostMem, + FWDeviceCallback completion, void *refcon); + virtual IOReturn reinit(FWAddress devAddress, IOMemoryDescriptor *hostMem, + FWDeviceCallback completion=NULL, void *refcon=NULL, + bool failOnReset=false); + virtual IOReturn reinit(UInt32 generation, FWAddress devAddress, IOMemoryDescriptor *hostMem, + FWDeviceCallback completion=NULL, void *refcon=NULL); + +private: + OSMetaClassDeclareReservedUnused(IOFWReadCommand, 0); + OSMetaClassDeclareReservedUnused(IOFWReadCommand, 1); +}; + +#pragma mark - + +/*! + @class IOFWReadQuadCommand + @discussion An easier to use version of IOFWReadCommand for use when the data to be transferred + is an integer number of quads. + Note that block read requests will be used for transfers greater than one quad unless setMaxPacket(4) + is called. +*/ + +class IOFWReadQuadCommand : public IOFWAsyncCommand +{ + OSDeclareDefaultStructors(IOFWReadQuadCommand) + +protected: + + UInt32 * fQuads; + + typedef struct + { + bool fPingTime; + } + MemberVariables; + + bool createMemberVariables( void ); + void destroyMemberVariables( void ); + virtual void free( void ); + + virtual void gotPacket(int rcode, const void* data, int size); + + virtual IOReturn execute(); + +public: + virtual bool initAll(IOFireWireNub *device, FWAddress devAddress, + UInt32 *quads, int numQuads, + FWDeviceCallback completion, void *refcon, bool failOnReset); + + virtual bool initAll(IOFireWireController *control, + UInt32 generation, FWAddress devAddress, + UInt32 *quads, int numQuads, + FWDeviceCallback completion, void *refcon); + + virtual IOReturn reinit(FWAddress devAddress, UInt32 *quads, int numQuads, + FWDeviceCallback completion=NULL, void *refcon=NULL, + bool failOnReset=false); + + virtual IOReturn reinit(UInt32 generation, FWAddress devAddress, UInt32 *quads, int numQuads, + FWDeviceCallback completion=NULL, void *refcon=NULL); + + void setPingTime( bool state ) + { ((MemberVariables*)fMembers->fSubclassMembers)->fPingTime = state; }; + +private: + OSMetaClassDeclareReservedUnused(IOFWReadQuadCommand, 0); + OSMetaClassDeclareReservedUnused(IOFWReadQuadCommand, 1); +}; + +#pragma mark - + +class IOFWWriteCommand : public IOFWAsyncCommand +{ + + OSDeclareDefaultStructors(IOFWWriteCommand) + +protected: + + int fPackSize; + + typedef struct + { + bool fDeferredNotify; + bool fFastRetryOnBusy; + } + MemberVariables; + + virtual IOReturn execute(); + + virtual void gotPacket( int rcode, const void* data, int size ); + + bool createMemberVariables( void ); + void destroyMemberVariables( void ); + +public: + + virtual bool initWithController(IOFireWireController *control); + virtual bool initAll( IOFireWireNub * device, + FWAddress devAddress, + IOMemoryDescriptor * hostMem, + FWDeviceCallback completion, + void * refcon, + bool failOnReset ); + + virtual bool initAll( IOFireWireController * control, + UInt32 generation, + FWAddress devAddress, + IOMemoryDescriptor * hostMem, + FWDeviceCallback completion, + void * refcon ); + virtual void free( void ); + + virtual IOReturn reinit( FWAddress devAddress, + IOMemoryDescriptor * hostMem, + FWDeviceCallback completion = NULL, + void * refcon = NULL, + bool failOnReset = false ); + + virtual IOReturn reinit( UInt32 generation, + FWAddress devAddress, + IOMemoryDescriptor * hostMem, + FWDeviceCallback completion = NULL, + void * refcon = NULL ); + + void setDeferredNotify( bool state ) + { ((MemberVariables*)fMembers->fSubclassMembers)->fDeferredNotify = state; }; + + void setFastRetryOnBusy( bool state ) + { ((MemberVariables*)fMembers->fSubclassMembers)->fFastRetryOnBusy = state; }; + +private: + + OSMetaClassDeclareReservedUnused(IOFWWriteCommand, 0); + OSMetaClassDeclareReservedUnused(IOFWWriteCommand, 1); + +}; + +#pragma mark - + +/*! + @class IOFWWriteQuadCommand + @discussion An easier to use version of IOFWWriteCommand for use when the data to be transferred + is small and an integer number of quads. + Note that block read requests will be used for transfers greater than one quad unless setMaxPacket(4) + is called. + kMaxWriteQuads is the largest legal number of quads that this object can be asked to transfer + (the data is copied into an internal buffer in init() and reinit()). +*/ + +class IOFWWriteQuadCommand : public IOFWAsyncCommand +{ + + OSDeclareDefaultStructors(IOFWWriteQuadCommand) + +public: + + enum + { + kMaxWriteQuads = 8 + }; + +protected: + + UInt32 fQuads[kMaxWriteQuads]; + UInt32 * fQPtr; + int fPackSize; + + typedef struct + { + bool fDeferredNotify; + IOMemoryDescriptor * fMemory; + } + MemberVariables; + + virtual void gotPacket( int rcode, const void* data, int size ); + + virtual IOReturn execute(); + + bool createMemberVariables( void ); + void destroyMemberVariables( void ); + +public: + virtual bool initWithController(IOFireWireController *control); + + virtual bool initAll( IOFireWireNub * device, + FWAddress devAddress, + UInt32 * quads, + int numQuads, + FWDeviceCallback completion, + void * refcon, + bool failOnReset ); + + virtual bool initAll( IOFireWireController * control, + UInt32 generation, + FWAddress devAddress, + UInt32 * quads, + int numQuads, + FWDeviceCallback completion, + void * refcon ); + + virtual void free( void ); + + virtual IOReturn reinit( FWAddress devAddress, + UInt32 * quads, + int numQuads, + FWDeviceCallback completion = NULL, + void * refcon = NULL, + bool failOnReset = false ); + + virtual IOReturn reinit( UInt32 generation, + FWAddress devAddress, + UInt32 * quads, + int numQuads, + FWDeviceCallback completion = NULL, + void * refcon = NULL ); + +protected: + + void setQuads( UInt32 * quads, int numQuads ); + bool createMemoryDescriptor( void ); + void destroyMemoryDescriptor( void ); + +public: + + void setDeferredNotify( bool state ) + { ((MemberVariables*)fMembers->fSubclassMembers)->fDeferredNotify = state; }; + +private: + + OSMetaClassDeclareReservedUnused(IOFWWriteQuadCommand, 0); + OSMetaClassDeclareReservedUnused(IOFWWriteQuadCommand, 1); + +}; + +/* + * May need more parameters for some of these, + * and/or derive from a base Lock transaction command + */ + +#pragma mark - + +/*! @class IOFWCompareAndSwapCommand +*/ +class IOFWCompareAndSwapCommand : public IOFWAsyncCommand +{ + OSDeclareDefaultStructors(IOFWCompareAndSwapCommand) + +protected: + UInt32 fInputVals[4]; + UInt32 fOldVal[2]; + + typedef struct + { + IOMemoryDescriptor * fMemory; + } + MemberVariables; + + MemberVariables * fMembers; + + virtual void gotPacket(int rcode, const void* data, int size); + + virtual IOReturn execute(); + +public: + // Compare to cmpVal, and if equal replace with newVal. + // Size = 1 for 32 bit operation (one quad), 2 for 64 bit (two quads) + virtual bool initWithController(IOFireWireController *control); + virtual bool initAll(IOFireWireNub *device, FWAddress devAddress, + const UInt32 *cmpVal, const UInt32 *newVal, int size, + FWDeviceCallback completion, void *refcon, bool failOnReset); + virtual bool initAll(IOFireWireController *control, + UInt32 generation, FWAddress devAddress, + const UInt32 *cmpVal, const UInt32 *newVal, int size, + FWDeviceCallback completion, void *refcon); + + virtual IOReturn reinit(FWAddress devAddress, const UInt32 *cmpVal, const UInt32 *newVal, int size, + FWDeviceCallback completion=NULL, void *refcon=NULL, bool failOnReset=false); + virtual IOReturn reinit(UInt32 generation, FWAddress devAddress, + const UInt32 *cmpVal, const UInt32 *newVal, int size, + FWDeviceCallback completion=NULL, void *refcon=NULL); + + // sets oldVal to the old value returned by the device, and + // returns true if it was the expected value, ie. the lock succeeded + virtual bool locked(UInt32 *oldVal); + + virtual void free( void ); + +protected: + + bool createMemberVariables( void ); + void destroyMemberVariables( void ); + + void setInputVals( const UInt32 * cmpVal, const UInt32 * newVal, int size ); + + bool createMemoryDescriptor( void ); + void destroyMemoryDescriptor( void ); + +private: + OSMetaClassDeclareReservedUnused(IOFWCompareAndSwapCommand, 0); + OSMetaClassDeclareReservedUnused(IOFWCompareAndSwapCommand, 1); + OSMetaClassDeclareReservedUnused(IOFWCompareAndSwapCommand, 2); + OSMetaClassDeclareReservedUnused(IOFWCompareAndSwapCommand, 3); + +}; + +/* + * Send an async stream packet + */ + +#pragma mark - + +/*! @class IOFWAsyncStreamCommand +*/ +class IOFWAsyncStreamCommand : public IOFWCommand +{ + // temporary for debugging: + friend class IOFireWireUserClient ; + + OSDeclareDefaultStructors(IOFWAsyncStreamCommand) + +protected: + FWAsyncStreamCallback fComplete; + void * fRefCon; + IOMemoryDescriptor * fMemDesc; + int fSpeed; + int fSize; + int fCurRetries; + int fMaxRetries; + int fChannel; + int fSyncBits; + int fTag; + UInt32 fGeneration; // bus topology fNodeID is valid for. + bool fFailOnReset; + + typedef struct + { } + MemberVariables; + + MemberVariables * fMembers; + + virtual IOReturn complete( + IOReturn status); + + // To be called by IOFireWireController and derived classes. + virtual IOReturn execute(); + +public: + + virtual bool initAll( + IOFireWireController * control, + UInt32 generation, + UInt32 channel, + UInt32 sync, + UInt32 tag, + IOMemoryDescriptor * hostMem, + UInt32 size, + int speed, + FWAsyncStreamCallback completion, + void * refcon); + + virtual void free( void ); + + virtual IOReturn reinit( UInt32 generation, + UInt32 channel, + UInt32 sync, + UInt32 tag, + IOMemoryDescriptor * hostMem, + UInt32 size, + int speed, + FWAsyncStreamCallback completion, + void * refcon); + + virtual void gotAck( + int ackCode); + // Utility for setting generation on newly created command + virtual void setGeneration( + UInt32 generation) + { fGeneration = generation; } + + + // update nodeID/generation after bus reset, from the device object + IOReturn updateGeneration(); + + bool failOnReset() const + { return fFailOnReset; } + +private: + OSMetaClassDeclareReservedUnused(IOFWAsyncStreamCommand, 0); + OSMetaClassDeclareReservedUnused(IOFWAsyncStreamCommand, 1); + +public: + virtual bool initAll( + IOFireWireController * control, + UInt32 generation, + UInt32 channel, + UInt32 sync, + UInt32 tag, + IOMemoryDescriptor * hostMem, + UInt32 size, + int speed, + FWAsyncStreamCallback completion, + void * refcon, + bool failOnReset ); + + + virtual IOReturn reinit( + UInt32 generation, + UInt32 channel, + UInt32 sync, + UInt32 tag, + IOMemoryDescriptor * hostMem, + UInt32 size, + int speed, + FWAsyncStreamCallback completion, + void * refcon, + bool failOnReset); + + +}; + +/* + * Send an async PHY packet + */ + +#pragma mark - + +/*! @class IOFWAsyncPHYCommand +*/ +class IOFWAsyncPHYCommand : public IOFWCommand +{ + // temporary for debugging: + friend class IOFireWireUserClient; + + OSDeclareDefaultStructors( IOFWAsyncPHYCommand ) + +protected: + AsyncPendingTrans * fTrans; + FWAsyncPHYCallback fComplete; + void * fRefCon; + int fCurRetries; + int fMaxRetries; + UInt32 fGeneration; + bool fFailOnReset; + UInt32 fData1; + UInt32 fData2; + int fAckCode; + UInt32 fResponseCode; + + typedef struct + { } + MemberVariables; + + MemberVariables * fMembers; + + virtual IOReturn complete( + IOReturn status ); + + // To be called by IOFireWireController and derived classes. + virtual IOReturn execute(); + + void setResponseCode( UInt32 rcode ); + void setAckCode( int ack ); + +public: + + virtual bool initAll( + IOFireWireController * control, + UInt32 generation, + UInt32 data1, + UInt32 data2, + FWAsyncPHYCallback completion, + void * refcon, + bool failOnReset ); + virtual void free( void ); + + virtual IOReturn reinit( UInt32 generation, + UInt32 data1, + UInt32 data2, + FWAsyncPHYCallback completion, + void * refcon, + bool failOnReset ); + + virtual void gotAck( + int ackCode ); + + // Utility for setting generation on newly created command + virtual void setGeneration( + UInt32 generation ) + { fGeneration = generation; } + + + // update nodeID/generation after bus reset, from the device object + IOReturn updateGeneration(); + + bool failOnReset() const + { return fFailOnReset; } + + + virtual void gotPacket( int rcode ); + + int getAckCode( void ); + UInt32 getResponseCode( void ) const; + + void setRetries( int retries); +private: + OSMetaClassDeclareReservedUnused(IOFWAsyncPHYCommand, 0); + OSMetaClassDeclareReservedUnused(IOFWAsyncPHYCommand, 1); + OSMetaClassDeclareReservedUnused(IOFWAsyncPHYCommand, 2); + OSMetaClassDeclareReservedUnused(IOFWAsyncPHYCommand, 3); + OSMetaClassDeclareReservedUnused(IOFWAsyncPHYCommand, 4); + OSMetaClassDeclareReservedUnused(IOFWAsyncPHYCommand, 5); + OSMetaClassDeclareReservedUnused(IOFWAsyncPHYCommand, 6); + OSMetaClassDeclareReservedUnused(IOFWAsyncPHYCommand, 7); +}; + +#endif /* _IOKIT_IOFWCOMMAND_H */ diff --git a/QualcommWireless/include/IOKit/firewire/IOFWDCL.h b/QualcommWireless/include/IOKit/firewire/IOFWDCL.h new file mode 100644 index 0000000..719e243 --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFWDCL.h @@ -0,0 +1,343 @@ +/* +* IOFWDCL.h +* IOFireWireFamily +* +* Created by Niels on Fri Feb 21 2003. +* Copyright (c) 2003 Apple Computer, Inc. All rights reserved. +* +* $Log: not supported by cvs2svn $ +* Revision 1.19 2007/03/14 01:01:12 collin +* *** empty log message *** +* +* Revision 1.18 2007/01/26 23:42:19 ayanowit +* another fix for nuDCL rosetta mode +* +* Revision 1.17 2006/08/16 01:41:41 collin +* *** empty log message *** +* +* Revision 1.16 2006/03/09 22:26:46 niels +* fix 4466075 +* +* Revision 1.15 2006/03/09 22:20:14 niels +* fix 4466075 +* +* Revision 1.14 2006/03/09 21:40:44 niels +* fix 4466075 +* +* Revision 1.13 2006/02/09 00:21:50 niels +* merge chardonnay branch to tot +* +* Revision 1.12.4.1 2005/08/06 01:31:31 collin +* *** empty log message *** +* +* Revision 1.12 2005/02/18 03:19:03 niels +* fix isight +* +* Revision 1.11 2004/04/19 21:51:49 niels +* *** empty log message *** +* +* Revision 1.10 2004/03/25 00:00:23 niels +* fix panic allocating large physical address spaces +* +* Revision 1.9 2003/10/31 02:40:58 niels +* *** empty log message *** +* +* Revision 1.8 2003/08/26 05:11:21 niels +* *** empty log message *** +* +* Revision 1.7 2003/08/25 08:39:15 niels +* *** empty log message *** +* +* Revision 1.6 2003/08/18 23:18:14 niels +* *** empty log message *** +* +* Revision 1.5 2003/08/08 22:30:32 niels +* *** empty log message *** +* +* Revision 1.4 2003/07/30 05:22:14 niels +* *** empty log message *** +* +* Revision 1.3 2003/07/29 22:49:22 niels +* *** empty log message *** +* +* Revision 1.2 2003/07/21 06:52:58 niels +* merge isoch to TOT +* +* Revision 1.1.2.5 2003/07/18 00:17:41 niels +* *** empty log message *** +* +* Revision 1.1.2.4 2003/07/14 22:08:53 niels +* *** empty log message *** +* +* Revision 1.1.2.3 2003/07/11 18:15:33 niels +* *** empty log message *** +* +* Revision 1.1.2.2 2003/07/03 22:10:24 niels +* fix iidc/dv rcv +* +* Revision 1.1.2.1 2003/07/01 20:54:06 niels +* isoch merge +* +*/ + +#import + +#import +#import +#import + +class IODCLProgram ; +class OSIterator ; +class IOFireWireLink ; +class IOMemoryMap ; + +/*! @class IOFWDCL +*/ + +class IOFWDCL : public OSObject +{ + OSDeclareAbstractStructors( IOFWDCL ) ; + + public: + + typedef void (*Callback)( void * refcon ) ; + + enum + { + kDynamic = BIT(1)//kNuDCLDynamic, + ,kUpdateBeforeCallback = BIT(2)//kNuDCLUpdateBeforeCallback + ,kUser = BIT(18) // kNuDCLUser + ,kBigEndianUpdates = BIT(19) // NOTE: Don't change this without making similar change to IOFireWireLib's NuDCL::Export(...)! + } ; + + class InternalData + { + public: + + IOFWDCL * lastBranch ; + } ; + + protected: + + IOFWDCL* fBranch ; + Callback fCallback ; + volatile UInt32 * fTimeStampPtr ; + UInt32 fRangeCount ; + IOVirtualRange * fRanges ; + OSSet* fUpdateList ; + OSIterator * fUpdateIterator ; + volatile UInt32 * fUserStatusPtr ; + void* fRefcon ; + UInt32 fFlags ; + + InternalData * fLoLevel ; + + public: + + // + // IOFWDCL public API: + // + + virtual bool initWithRanges ( + OSSet * updateSet, + unsigned rangesCount = 0, + IOVirtualRange ranges [] = NULL ) ; + + void setBranch( IOFWDCL* branch ) ; + IOFWDCL* getBranch() const ; + void setTimeStampPtr ( UInt32* timeStampPtr ) ; + UInt32* getTimeStampPtr () const ; + void setCallback( Callback callback ) ; + Callback getCallback() const ; + void setStatusPtr( UInt32* statusPtr ) ; + UInt32* getStatusPtr() const ; + void setRefcon( void * refcon ) ; + void * getRefcon() const ; + const OSSet* getUpdateList() const ; + + virtual IOReturn addRange ( IOVirtualRange& range ) ; + virtual IOReturn setRanges ( UInt32 numRanges, IOVirtualRange ranges[] ) ; + virtual UInt32 getRanges( UInt32 maxRanges, IOVirtualRange ranges[] ) const ; + virtual UInt32 countRanges() ; + virtual IOReturn getSpan( IOVirtualRange& result ) const ; + virtual IOByteCount getSize() const ; + IOReturn appendUpdateList( IOFWDCL* updateDCL ) ; + IOReturn setUpdateList( OSSet* updateList ) ; + void emptyUpdateList() ; + void setFlags( UInt32 flags ) ; + UInt32 getFlags() const ; + + + virtual void update() = 0 ; + + // OSObject + + virtual void free (void) APPLE_KEXT_OVERRIDE; + + public: + + // + // internal use only; please don't use... + // + + virtual IOReturn compile( IODCLProgram & , bool & ) = 0 ; + virtual void link () = 0 ; + + OSMetaClassDeclareReservedUnused ( IOFWDCL, 4 ) ; // used to be relink() + + public : + virtual bool interrupt( bool &, IOFWDCL * & ) = 0 ; + virtual void finalize ( IODCLProgram & ) ; + virtual IOReturn importUserDCL ( + UInt8 * data, + IOByteCount & dataSize, + IOMemoryMap * bufferMap, + const OSArray * dcl ) ; + + protected : + + friend class IOFWDCLFriend ; + + public : + + // dump DCL info... + virtual void debug() ; + + public: + + // + // internal use only; please don't use... + // + + virtual bool checkForInterrupt() = 0 ; + + OSMetaClassDeclareReservedUsed ( IOFWDCL, 0 ) ; + OSMetaClassDeclareReservedUnused ( IOFWDCL, 1 ) ; + OSMetaClassDeclareReservedUnused ( IOFWDCL, 2 ) ; + OSMetaClassDeclareReservedUnused ( IOFWDCL, 3 ) ; +// OSMetaClassDeclareReservedUnused ( ***, 4 ) ; // used above + +} ; + +#pragma mark - + +/*! @class IOFWReceiveDCL +*/ + +class IOFWReceiveDCL : public IOFWDCL +{ + OSDeclareAbstractStructors( IOFWReceiveDCL ) + + protected : + + UInt8 fHeaderBytes ; + bool fWait ; + + public: + + // me + virtual bool initWithParams( + OSSet * updateSet, + UInt8 headerBytes, + unsigned rangesCount, + IOVirtualRange ranges [] ) ; + IOReturn setWaitControl( bool wait ) ; + + public : + + // internal use only: + virtual IOReturn importUserDCL ( + UInt8 * data, + IOByteCount & dataSize, + IOMemoryMap * bufferMap, + const OSArray * dcl ) APPLE_KEXT_OVERRIDE; + + protected : + + virtual void debug(void) APPLE_KEXT_OVERRIDE; + +} ; + +#pragma mark - + +/*! @class IOFWSendDCL +*/ + +class IOFWSendDCL : public IOFWDCL +{ + OSDeclareAbstractStructors( IOFWSendDCL ) + + protected: + + UInt32 * fUserHeaderPtr ; // pointer to 2 quadlets containing isoch header for this packet + UInt32 * fUserHeaderMaskPtr ; // pointer to 2 quadlets; used to mask header quadlets + IOFWDCL * fSkipBranchDCL ; + Callback fSkipCallback ; + void * fSkipRefcon ; + UInt8 fSync ; + UInt8 fTag ; + + public: + + // OSObject + virtual void free(void) APPLE_KEXT_OVERRIDE; + + // IOFWDCL + virtual IOReturn addRange ( IOVirtualRange& range ) APPLE_KEXT_OVERRIDE; + virtual IOReturn setRanges ( UInt32 numRanges, IOVirtualRange ranges[] ) APPLE_KEXT_OVERRIDE; + + // me + virtual bool initWithParams( OSSet * updateSet, + unsigned rangesCount = 0, + IOVirtualRange ranges [] = NULL, + UInt8 sync = 0, + UInt8 tag = 0 ) ; + + void setUserHeaderPtr( UInt32* userHeaderPtr, UInt32 * maskPtr ) ; + UInt32 * getUserHeaderPtr() ; + UInt32 * getUserHeaderMask() ; + void setSkipBranch( IOFWDCL * skipBranchDCL ) ; + IOFWDCL * getSkipBranch() const ; + void setSkipCallback( Callback callback ) ; + Callback getSkipCallback() const ; + void setSkipRefcon( void * refcon = 0 ) ; + void * getSkipRefcon() const ; + void setSync( UInt8 sync ) ; + UInt8 getSync() const ; + void setTag( UInt8 tag ) ; + UInt8 getTag() const ; + + public : + + // internal use only: + virtual IOReturn importUserDCL ( + UInt8 * data, + IOByteCount & dataSize, + IOMemoryMap * bufferMap, + const OSArray * dcl ) APPLE_KEXT_OVERRIDE; + protected : + + virtual void debug(void) APPLE_KEXT_OVERRIDE; +} ; + +#pragma mark - + +/*! @class IOFWSkipCycleDCL +*/ + +class IOFWSkipCycleDCL : public IOFWDCL +{ + OSDeclareAbstractStructors( IOFWSkipCycleDCL ) + + public: + + virtual bool init(void) APPLE_KEXT_OVERRIDE; + + virtual IOReturn addRange ( IOVirtualRange& range ) APPLE_KEXT_OVERRIDE; + virtual IOReturn setRanges ( UInt32 numRanges, IOVirtualRange ranges[] ) APPLE_KEXT_OVERRIDE; + virtual IOReturn getSpan( IOVirtualRange& result ) ; + + protected : + + virtual void debug(void) APPLE_KEXT_OVERRIDE; +} ; diff --git a/QualcommWireless/include/IOKit/firewire/IOFWDCLPool.h b/QualcommWireless/include/IOKit/firewire/IOFWDCLPool.h new file mode 100644 index 0000000..66fbf38 --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFWDCLPool.h @@ -0,0 +1,157 @@ +/* + * IOFWNuDCLPool.h + * IOFireWireFamily + * + * Created by Niels on Fri Mar 07 2003. + * Copyright (c) 2003 Apple Computer, Inc. All rights reserved. + * + * $Log: not supported by cvs2svn $ + * Revision 1.14 2008/03/03 23:31:42 ayanowit + * another gcc-42 fix. + * + * Revision 1.13 2007/01/26 20:52:31 ayanowit + * changes to user-space isoch stuff to support 64-bit apps. + * + * Revision 1.12 2006/02/09 00:21:50 niels + * merge chardonnay branch to tot + * + * Revision 1.11 2005/04/12 20:09:13 niels + * fix memory leak importing NuDCL programs from user space + * + * Revision 1.10.20.2 2006/01/31 04:49:50 collin + * *** empty log message *** + * + * Revision 1.10 2003/11/07 21:24:28 niels + * *** empty log message *** + * + * Revision 1.9 2003/11/07 21:01:18 niels + * *** empty log message *** + * + * Revision 1.8 2003/08/25 08:39:15 niels + * *** empty log message *** + * + * Revision 1.7 2003/08/22 18:15:16 niels + * *** empty log message *** + * + * Revision 1.6 2003/08/15 04:36:55 niels + * *** empty log message *** + * + * Revision 1.5 2003/07/30 05:22:14 niels + * *** empty log message *** + * + * Revision 1.4 2003/07/21 08:48:20 niels + * *** empty log message *** + * + * Revision 1.3 2003/07/21 07:52:13 niels + * *** empty log message *** + * + * Revision 1.2 2003/07/21 06:52:58 niels + * merge isoch to TOT + * + * Revision 1.1.2.3 2003/07/11 18:15:34 niels + * *** empty log message *** + * + * Revision 1.1.2.2 2003/07/09 21:24:00 niels + * *** empty log message *** + * + * Revision 1.1.2.1 2003/07/01 20:54:06 niels + * isoch merge + * + */ + +#import +#import +#import + +class IOFireWireLink ; +class IOFWDCL ; +class IOFWReceiveDCL ; +class IOFWSendDCL ; +class IOFWSkipCycleDCL ; +class IOFireWireUserClient ; +class IOMemoryDescriptor ; +class IOMemoryMap ; +class OSSet; + +/*! @class IOFWDCLPool + @discussion You should never subclass IOFWDCLPool +*/ + +class IOFWDCLPool : public OSObject +{ + OSDeclareAbstractStructors( IOFWDCLPool ) + + friend class IOFireWireUserClient ; + friend class IOFWUserLocalIsochPort ; + + protected: + + class Expansion* fReserved ; // for class expansion + + IOFireWireLink * fLink ; + UInt8 fCurrentTag ; + UInt8 fCurrentSync ; + OSArray* fProgram ; + DCLNuDCLLeader fLeader ; + + public: + + // OSObject + + virtual void free(void) APPLE_KEXT_OVERRIDE; + + // me + + virtual bool initWithLink ( IOFireWireLink& link, UInt32 capacity ) ; + + virtual void setCurrentTagAndSync ( UInt8 tag, UInt8 sync ) ; + + virtual IOFWReceiveDCL* appendReceiveDCL ( + OSSet * updateSet, + UInt8 headerBytes, + UInt32 rangesCount, + IOVirtualRange ranges[] ) ; + virtual IOFWSendDCL* appendSendDCL ( + OSSet * updateSet, + UInt32 rangesCount, + IOVirtualRange ranges[] ) ; + virtual IOFWSkipCycleDCL* appendSkipCycleDCL () ; + virtual const OSArray * getProgramRef () const ; + + protected : + + IOReturn importUserProgram ( + IOMemoryDescriptor * userExportDesc, + unsigned bufferRangeCount, + IOAddressRange bufferRanges[], + IOMemoryMap * bufferMap ) ; + IOReturn importUserDCL( + IOFWDCL * dcl, + void * importData, + IOByteCount & dataSize, + IOMemoryMap * bufferMap ) ; + + + protected : + + virtual IOFWReceiveDCL * allocReceiveDCL () = 0 ; + virtual IOFWSendDCL * allocSendDCL () = 0 ; + virtual IOFWSkipCycleDCL * allocSkipCycleDCL () = 0 ; + + private : + + void appendDCL( IOFWDCL * dcl ) ; + + public : + + DCLCommand * getProgram() ; + + OSMetaClassDeclareReservedUnused ( IOFWDCLPool, 0); + OSMetaClassDeclareReservedUnused ( IOFWDCLPool, 1); + OSMetaClassDeclareReservedUnused ( IOFWDCLPool, 2); + OSMetaClassDeclareReservedUnused ( IOFWDCLPool, 3); + OSMetaClassDeclareReservedUnused ( IOFWDCLPool, 4); + OSMetaClassDeclareReservedUnused ( IOFWDCLPool, 5); + OSMetaClassDeclareReservedUnused ( IOFWDCLPool, 6); + OSMetaClassDeclareReservedUnused ( IOFWDCLPool, 7); +} ; diff --git a/QualcommWireless/include/IOKit/firewire/IOFWDCLProgram.h b/QualcommWireless/include/IOKit/firewire/IOFWDCLProgram.h new file mode 100644 index 0000000..144622c --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFWDCLProgram.h @@ -0,0 +1,134 @@ +/* + * Copyright (c) 1998-2002 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1999-2002 Apple Computer, Inc. All rights reserved. + * + * HISTORY + * + */ + + +#ifndef _IOKIT_IOFWDCLPROGRAM_H +#define _IOKIT_IOFWDCLPROGRAM_H + +#include +#include +#include +#include + +/*! @class IODCLProgram +*/ +class IODCLProgram : public OSObject +{ + OSDeclareAbstractStructors(IODCLProgram) + + private : + + void * reserved0 ;//fDCLTaskToKernel; + void * reserved1 ;//fDataTaskToKernel; + void * reserved2 ;//fDataBase; + void * reserved3 ;// IOMemoryDescriptor * fDCLDesc; + IOMemoryMap * fBufferMem ; + void * reserved5 ;// IOMemoryCursor * fDataCursor; + + protected: + + /*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + struct ExpansionData + { + IOFWIsochResourceFlags resourceFlags ; + IODMACommand * fDMACommand; + }; + + /*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData * fExpansionData ; + + public : + + virtual void setIsochResourceFlags ( IOFWIsochResourceFlags flags ) ; // formerly getPhysicalSegs() + IOFWIsochResourceFlags getIsochResourceFlags () const ; + + protected: + + virtual void free (void) APPLE_KEXT_OVERRIDE; + + public: + + virtual bool init ( IOFireWireBus::DCLTaskInfo * info = NULL ) ; + virtual IOReturn allocateHW ( + IOFWSpeed speed, + UInt32 chan) = 0; + virtual IOReturn releaseHW () = 0; + virtual IOReturn compile ( + IOFWSpeed speed, + UInt32 chan) = 0; + virtual IOReturn notify ( + IOFWDCLNotificationType notificationType, + DCLCommand ** dclCommandList, + UInt32 numDCLCommands ) = 0; + virtual IOReturn start () = 0; + virtual void stop () = 0; + virtual IOReturn pause (); + virtual IOReturn resume (); + + virtual void setForceStopProc( + IOFWIsochChannel::ForceStopNotificationProc proc, + void * refCon, + IOFWIsochChannel * channel ) ; + protected : + + void generateBufferMap( DCLCommand * program ) ; + IOReturn virtualToPhysical( + IOVirtualRange ranges[], + unsigned rangeCount, + IOMemoryCursor::IOPhysicalSegment outSegments[], + unsigned & outPhysicalSegmentCount, + unsigned maxSegments ) ; + + public : + + IOMemoryMap * getBufferMap() const ; + + public : + + // close/open isoch workloop gate... + // clients should not need to call these. + virtual void closeGate() = 0 ; + virtual void openGate() = 0 ; + + virtual IOReturn synchronizeWithIO() = 0 ; + + private: + + OSMetaClassDeclareReservedUsed(IODCLProgram, 0); + OSMetaClassDeclareReservedUsed(IODCLProgram, 1); + OSMetaClassDeclareReservedUnused(IODCLProgram, 2); + OSMetaClassDeclareReservedUnused(IODCLProgram, 3); + OSMetaClassDeclareReservedUnused(IODCLProgram, 4); + +}; + +#endif /* ! _IOKIT_IOFWDCLPROGRAM_H */ + diff --git a/QualcommWireless/include/IOKit/firewire/IOFWDCLTranslator.h b/QualcommWireless/include/IOKit/firewire/IOFWDCLTranslator.h new file mode 100644 index 0000000..e02067c --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFWDCLTranslator.h @@ -0,0 +1,114 @@ +/* + * Copyright (c) 1998-2002 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1999-2002 Apple Computer, Inc. All rights reserved. + * + * A DCL program to interpret (in software) a program that's too complicated + * for the DMA engine. + * + * HISTORY + * + */ + + +#ifndef _IOKIT_IOFWDCLTRANSLATOR_H +#define _IOKIT_IOFWDCLTRANSLATOR_H + +#include +#include + + +/*! @class IODCLTranslator +*/ + +class IODCLTranslator : public IODCLProgram +{ + OSDeclareAbstractStructors(IODCLTranslator) + +protected: + enum + { + kNumPingPongs = 2, + kNumPacketsPerPingPong = 500, + kMaxIsochPacketSize = 1000, + kPingPongBufferSize = kNumPingPongs * kNumPacketsPerPingPong * kMaxIsochPacketSize + }; + + // Opcodes and buffer for pingpong program + DCLLabel fStartLabel; + DCLTransferPacket fTransfers[kNumPingPongs*kNumPacketsPerPingPong]; + DCLCallProc fCalls[kNumPingPongs]; + DCLJump fJumpToStart; + UInt8 fBuffer[kPingPongBufferSize]; + + IODCLProgram * fHWProgram; // Hardware program executing our opcodes + DCLCommand* fToInterpret; // The commands to interpret + DCLCommand* fCurrentDCLCommand; // Current command to interpret + int fPingCount; // Are we pinging or ponging? + UInt32 fPacketHeader; + + static void ListeningDCLPingPongProc(DCLCommand* pDCLCommand); + static void TalkingDCLPingPongProc(DCLCommand* pDCLCommand); + +public: + virtual bool init(DCLCommand* toInterpret); + virtual IOReturn allocateHW(IOFWSpeed speed, UInt32 chan); + virtual IOReturn releaseHW(); + virtual IOReturn notify(IOFWDCLNotificationType notificationType, + DCLCommand** dclCommandList, UInt32 numDCLCommands); + virtual void stop(); + + DCLCommand* getTranslatorOpcodes(); + void setHWProgram(IODCLProgram *program); +}; + +/*! @class IODCLTranslateTalk +*/ + +class IODCLTranslateTalk : public IODCLTranslator +{ + OSDeclareDefaultStructors(IODCLTranslateTalk) + +protected: + +public: + virtual IOReturn compile(IOFWSpeed speed, UInt32 chan); + virtual IOReturn start(); + +}; + +/*! @class IODCLTranslateListen +*/ + +class IODCLTranslateListen : public IODCLTranslator +{ + OSDeclareDefaultStructors(IODCLTranslateListen) + +protected: + +public: + virtual IOReturn compile(IOFWSpeed speed, UInt32 chan); + virtual IOReturn start(); + +}; +#endif /* ! _IOKIT_IOFWDCLPROGRAM_H */ + diff --git a/QualcommWireless/include/IOKit/firewire/IOFWIsochChannel.h b/QualcommWireless/include/IOKit/firewire/IOFWIsochChannel.h new file mode 100644 index 0000000..4bbd6c8 --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFWIsochChannel.h @@ -0,0 +1,132 @@ +/* + * Copyright (c) 1998-2002 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1999-2002 Apple Computer, Inc. All rights reserved. + * + * HISTORY + * + */ + + +#ifndef _IOKIT_IOFWISOCHCHANNEL_H +#define _IOKIT_IOFWISOCHCHANNEL_H + +#include +#include + +enum +{ + kFWIsochChannelUnknownCondition = 0, + kFWIsochChannelNotEnoughBandwidth = 1, + kFWIsochChannelChannelNotAvailable = 2 +}; + +class IOFireWireController; +class IOFWIsochChannel; +class IOFWIsochPort; +class OSSet; +class IOFWReadQuadCommand; +class IOFWCompareAndSwapCommand; + +/*! @class IOFWIsochChannel +*/ +class IOFWIsochChannel : public OSObject +{ + OSDeclareDefaultStructors(IOFWIsochChannel) + + public: + + typedef IOReturn (ForceStopNotificationProc)(void* refCon, IOFWIsochChannel* channel, UInt32 stopCondition ); + +protected: + IOFireWireController * fControl; + ForceStopNotificationProc* fStopProc; + void * fStopRefCon; + IOFWIsochPort * fTalker; + OSSet * fListeners; + bool fDoIRM; + UInt32 fBandwidth; // Allocation units used + UInt32 fPacketSize; + IOFWSpeed fPrefSpeed; + IOFWSpeed fSpeed; // Actual speed used + UInt32 fChannel; // Actual channel used + IOFWReadQuadCommand * fReadCmd; + IOFWCompareAndSwapCommand * fLockCmd; + UInt32 fGeneration; // When bandwidth was allocated + + IOLock * fLock; + +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + struct ExpansionData { }; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + + static void threadFunc( void * arg ); + + virtual IOReturn updateBandwidth(bool claim); + virtual void reallocBandwidth( UInt32 generation ); + virtual void free(); + +public: + // Called from IOFireWireController + virtual bool init( IOFireWireController *control, bool doIRM, UInt32 packetSize, + IOFWSpeed prefSpeed, ForceStopNotificationProc* stopProc, + void *stopRefCon ); + virtual void handleBusReset(); + + // Called by clients + virtual IOReturn setTalker(IOFWIsochPort *talker); + virtual IOReturn addListener(IOFWIsochPort *listener); + + virtual IOReturn allocateChannel(); + virtual IOReturn releaseChannel(); + virtual IOReturn start(); + virtual IOReturn stop(); + +protected: + // handles IRM and channel determination and allocation. + // called by both user and kernel isoch channels + IOReturn allocateChannelBegin( IOFWSpeed speed, UInt64 allowedChans, UInt32 * channel = NULL ) ; + + // handles IRM and channel allocation. + // called by both user and kernel isoch channels + IOReturn releaseChannelComplete() ; + + IOReturn checkMemoryInRange( IOMemoryDescriptor * memory ); + +private: + OSMetaClassDeclareReservedUnused(IOFWIsochChannel, 0); + OSMetaClassDeclareReservedUnused(IOFWIsochChannel, 1); + OSMetaClassDeclareReservedUnused(IOFWIsochChannel, 2); + OSMetaClassDeclareReservedUnused(IOFWIsochChannel, 3); + +}; + +typedef IOFWIsochChannel::ForceStopNotificationProc FWIsochChannelForceStopNotificationProc ; +typedef IOFWIsochChannel::ForceStopNotificationProc* FWIsochChannelForceStopNotificationProcPtr ; + +#endif /* ! _IOKIT_IOFWISOCHCHANNEL_H */ + diff --git a/QualcommWireless/include/IOKit/firewire/IOFWIsochPort.h b/QualcommWireless/include/IOKit/firewire/IOFWIsochPort.h new file mode 100644 index 0000000..793c5e9 --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFWIsochPort.h @@ -0,0 +1,66 @@ +/* + * Copyright (c) 1998-2002 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1999-2002 Apple Computer, Inc. All rights reserved. + * + * IOFWIsochPort is an abstract object that represents hardware on the bus + * (locally or remotely) that sends or receives isochronous packets. + * Local ports are implemented by the local device driver, + * Remote ports are implemented by the driver for the remote device. + * + * HISTORY + * + */ + + +#ifndef _IOKIT_IOFWISOCHPORT_H +#define _IOKIT_IOFWISOCHPORT_H + +#include +#include + +/*! @class IOFWIsochPort +*/ + +class IOFWIsochPort : public OSObject +{ + OSDeclareAbstractStructors(IOFWIsochPort) + +public: + // Return maximum speed and channels supported + // (bit n set = chan n supported) + virtual IOReturn getSupported(IOFWSpeed &maxSpeed, UInt64 &chanSupported) = 0; + + // Allocate hardware resources for port + virtual IOReturn allocatePort(IOFWSpeed speed, UInt32 chan) = 0; + virtual IOReturn releasePort() = 0; // Free hardware resources + virtual IOReturn start() = 0; // Start port processing packets + virtual IOReturn stop() = 0; // Stop processing packets + +private: + OSMetaClassDeclareReservedUnused(IOFWIsochPort, 0); + OSMetaClassDeclareReservedUnused(IOFWIsochPort, 1); + +}; + +#endif /* ! _IOKIT_IOFWISOCHPORT_H */ + diff --git a/QualcommWireless/include/IOKit/firewire/IOFWLocalIsochPort.h b/QualcommWireless/include/IOKit/firewire/IOFWLocalIsochPort.h new file mode 100644 index 0000000..d98bff0 --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFWLocalIsochPort.h @@ -0,0 +1,132 @@ +/* + * Copyright (c) 1998-2002 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1999-2002 Apple Computer, Inc. All rights reserved. + * + * IOFWIsochPort is an abstract object that represents hardware on the bus + * (locally or remotely) that sends or receives isochronous packets. + * Local ports are implemented by the local device driver, + * Remote ports are implemented by the driver for the remote device. + * + * HISTORY + * + * $Log: not supported by cvs2svn $ + * Revision 1.9 2003/08/30 00:16:44 collin + * *** empty log message *** + * + * Revision 1.8 2003/08/15 04:36:55 niels + * *** empty log message *** + * + * Revision 1.7 2003/07/29 22:49:22 niels + * *** empty log message *** + * + * Revision 1.6 2003/07/21 06:52:58 niels + * merge isoch to TOT + * + * Revision 1.5.14.1 2003/07/01 20:54:07 niels + * isoch merge + * + */ + + +#ifndef _IOKIT_IOFWLOCALISOCHPORT_H +#define _IOKIT_IOFWLOCALISOCHPORT_H + +#import +#import + +class IOFireWireController; +class IODCLProgram; + +/*! @class IOFWLocalIsochPort +*/ +class IOFWLocalIsochPort : public IOFWIsochPort +{ + OSDeclareDefaultStructors(IOFWLocalIsochPort) + + protected: + + IOFireWireController * fControl; + IODCLProgram * fProgram; + + /*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + struct ExpansionData + { + } ; + + ExpansionData * fExpansion ; + + protected : + + virtual void free ( void ) APPLE_KEXT_OVERRIDE; + + public: + + virtual bool init ( + IODCLProgram * program, + IOFireWireController * control ) ; + + // Return maximum speed and channels supported + // (bit n set = chan n supported) + virtual IOReturn getSupported ( + IOFWSpeed & maxSpeed, + UInt64 & chanSupported ) APPLE_KEXT_OVERRIDE; + + // Allocate hardware resources for port + virtual IOReturn allocatePort ( + IOFWSpeed speed, + UInt32 chan ) APPLE_KEXT_OVERRIDE; + virtual IOReturn releasePort ( void ) APPLE_KEXT_OVERRIDE; // Free hardware resources + virtual IOReturn start ( void ) APPLE_KEXT_OVERRIDE; // Start port processing packets + virtual IOReturn stop ( void ) APPLE_KEXT_OVERRIDE; // Stop processing packets + + /*! @function notify + @abstract Informs hardware of a change to the DCL program. + @param notificationType Type of change. + @param dclCommandList List of DCL commands that have been changed. + @param numDCLCommands Number of commands in list. + @result IOKit error code. */ + virtual IOReturn notify( + IOFWDCLNotificationType notificationType, + DCLCommand ** dclCommandList, + UInt32 numDCLCommands ) ; + static void printDCLProgram ( + const DCLCommand * dcl, + UInt32 count = 0, + void (*printFN)( const char *format, ...) = NULL, + unsigned lineDelayMS = 0 ) ; + IOReturn setIsochResourceFlags ( + IOFWIsochResourceFlags flags ) ; + IODCLProgram * getProgramRef() const ; + + IOReturn synchronizeWithIO() ; + + private: + + OSMetaClassDeclareReservedUnused ( IOFWLocalIsochPort, 0 ) ; + OSMetaClassDeclareReservedUnused ( IOFWLocalIsochPort, 1 ) ; +}; + +#endif /* ! _IOKIT_IOFWLOCALISOCHPORT_H */ + diff --git a/QualcommWireless/include/IOKit/firewire/IOFWPHYPacketListener.h b/QualcommWireless/include/IOKit/firewire/IOFWPHYPacketListener.h new file mode 100644 index 0000000..ea2c6ff --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFWPHYPacketListener.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2007 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOFWPHYPACKETLISTENER_H_ +#define _IOFWPHYPACKETLISTENER_H_ + +#include + +class IOFireWireController; + +// Callback when phy packet is received +typedef void (*FWPHYPacketCallback)( void *refcon, UInt32 data1, UInt32 data2 ); + +/*! @class IOFWPHYPacketListener +*/ + +class IOFWPHYPacketListener : public OSObject +{ + OSDeclareDefaultStructors( IOFWPHYPacketListener ); + + friend class IOFireWireController; + +protected: + + IOFireWireController * fControl; + FWPHYPacketCallback fCallback; + void * fRefCon; + + static IOFWPHYPacketListener * createWithController( IOFireWireController * controller ); + + virtual bool initWithController( IOFireWireController * control ); + virtual void free( void ); + +public: + + virtual IOReturn activate( void ); + virtual void deactivate( void ); + + virtual void setCallback( FWPHYPacketCallback callback ); + virtual void setRefCon( void * refcon ); + virtual void * getRefCon( void ); + +protected: + virtual void processPHYPacket( UInt32 data1, UInt32 data2 ); + + OSMetaClassDeclareReservedUnused( IOFWPHYPacketListener, 0 ); + OSMetaClassDeclareReservedUnused( IOFWPHYPacketListener, 1 ); + OSMetaClassDeclareReservedUnused( IOFWPHYPacketListener, 2 ); + OSMetaClassDeclareReservedUnused( IOFWPHYPacketListener, 3 ); + OSMetaClassDeclareReservedUnused( IOFWPHYPacketListener, 4 ); + OSMetaClassDeclareReservedUnused( IOFWPHYPacketListener, 5 ); + OSMetaClassDeclareReservedUnused( IOFWPHYPacketListener, 6 ); + OSMetaClassDeclareReservedUnused( IOFWPHYPacketListener, 7 ); + OSMetaClassDeclareReservedUnused( IOFWPHYPacketListener, 8 ); + OSMetaClassDeclareReservedUnused( IOFWPHYPacketListener, 9 ); +}; + +#endif \ No newline at end of file diff --git a/QualcommWireless/include/IOKit/firewire/IOFWPhysicalAddressSpace.h b/QualcommWireless/include/IOKit/firewire/IOFWPhysicalAddressSpace.h new file mode 100644 index 0000000..b1944f4 --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFWPhysicalAddressSpace.h @@ -0,0 +1,263 @@ +/* + * Copyright (c) 1998-2002 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOFWPHYSICALADDRESSSPACE_H +#define _IOKIT_IOFWPHYSICALADDRESSSPACE_H + +#include +#include + +/* + * Direct physical memory <-> FireWire address. + * Accesses to these addresses may be handled automatically by the + * hardware without notification. + * + * The 64 bit FireWire address of (32 bit) physical addr xxxx:xxxx is hostNode:0000:xxxx:xxxx + */ + +class IOFWPhysicalAddressSpace; + +struct FWSegment +{ + FWAddress address; + UInt32 length; +}; + +#pragma mark - + +/*! + @class IOFWPhysicalAddressSpaceAux +*/ + +class IOFWPhysicalAddressSpaceAux : public IOFWAddressSpaceAux +{ + OSDeclareDefaultStructors(IOFWPhysicalAddressSpaceAux) + + friend class IOFWAddressSpace; + friend class IOFWPhysicalAddressSpace; + +protected: + + /*! + @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + + struct ExpansionData { }; + + /*! + @var reserved + Reserved for future use. (Internal use only) + */ + + ExpansionData *reserved; + + IODMACommand * fDMACommand; + bool fDMACommandPrepared; + +public: + virtual bool init( IOFWAddressSpace * primary ); + virtual void free(); + + void setDMACommand( IODMACommand * dma_command ); + IODMACommand * getDMACommand( void ); + UInt64 getPhysicalSegment( UInt64 offset, UInt64 * length ); + + IOReturn prepare( void ); + IOReturn synchronize( IOOptionBits options ); + IOReturn complete( void ); + + bool isPrepared( void ); + + IOReturn getSegments( UInt64 * offset, FWSegment * fw_segments, UInt32 * num_segments ); + +private: + OSMetaClassDeclareReservedUnused(IOFWPhysicalAddressSpaceAux, 0); + OSMetaClassDeclareReservedUnused(IOFWPhysicalAddressSpaceAux, 1); + OSMetaClassDeclareReservedUnused(IOFWPhysicalAddressSpaceAux, 2); + OSMetaClassDeclareReservedUnused(IOFWPhysicalAddressSpaceAux, 3); + OSMetaClassDeclareReservedUnused(IOFWPhysicalAddressSpaceAux, 4); + OSMetaClassDeclareReservedUnused(IOFWPhysicalAddressSpaceAux, 5); + OSMetaClassDeclareReservedUnused(IOFWPhysicalAddressSpaceAux, 6); + OSMetaClassDeclareReservedUnused(IOFWPhysicalAddressSpaceAux, 7); + OSMetaClassDeclareReservedUnused(IOFWPhysicalAddressSpaceAux, 8); + OSMetaClassDeclareReservedUnused(IOFWPhysicalAddressSpaceAux, 9); + +}; + +#pragma mark - + +/*! + @class IOFWPhysicalAddressSpace +*/ + +class IOFWPhysicalAddressSpace : public IOFWAddressSpace +{ + OSDeclareDefaultStructors(IOFWPhysicalAddressSpace) + + friend class IOFWPhysicalAddressSpaceAux; + +protected: + + IOMemoryDescriptor * fMem; // unused + vm_size_t fLen; // unused + + virtual void free(); + +public: + +/*! @function init + @abstract Initialize physical address space. + @param bus Points to IOFireWireBus object. + @result returns true if success, else false */ + virtual bool init( IOFireWireBus * bus ); + +/*! @function initWithDesc + @abstract Initialize physical address space with IOMemoryDescriptor. + @param bus Points to IOFireWireBus object. + @param mem Points to IOMemoryDescriptor. + @result returns true if success, else false */ + virtual bool initWithDesc(IOFireWireBus *bus, + IOMemoryDescriptor *mem); + +/*! @function doRead + @abstract A method for processing an address space read request + @param nodeID FireWire Read from nodeID. + @param speed at this 'speed'. + @param addr with FireWire address 'addr'. + @param len read 'len' bytes from nodeID. + @param buf points to a memory descriptor containing the packet data. + @param offset start from this 'offset' in 'buf'. + @param refcon Can be queried for extra info about the request. + @result UIn32 returns kFWResponseComplete on success */ + virtual UInt32 doRead(UInt16 nodeID, IOFWSpeed &speed, FWAddress addr, UInt32 len, + IOMemoryDescriptor **buf, IOByteCount * offset, + IOFWRequestRefCon refcon); + +/*! @function doWrite + @abstract A method for processing an address space write request + @param nodeID FireWire Write to nodeID. + @param speed at this 'speed'. + @param addr with FireWire address 'addr'. + @param len write 'len' bytes to nodeID. + @param buf obtain bytes from location given by 'buf'. + @param reqrefcon Can be queried for extra info about the request. + @result UIn32 returns kFWResponseComplete on success */ + virtual UInt32 doWrite(UInt16 nodeID, IOFWSpeed &speed, FWAddress addr, UInt32 len, + const void *buf, IOFWRequestRefCon refcon); + +/*! @function getMemoryDescriptor + @abstract Gets the memory descriptor, which is associated to this + PhysicalAddressSpace. + @param none. + @result returns the IOMemoryDescriptor */ + IOMemoryDescriptor * getMemoryDescriptor( void ); + +/*! @function setMemoryDescriptor + @abstract Sets the memory descriptor, which will be associated to this + PhysicalAddressSpace. + @param none. + @result returns the IOMemoryDescriptor */ + IOReturn setMemoryDescriptor( IOMemoryDescriptor * descriptor ); + +/*! @function getLength + @abstract Get the length of the memory backed by PhysicalAddressSpace. + @param none. + @result returns the length */ + UInt64 getLength( void ); + +/*! @function setDMACommand + @abstract Set the DMACommand for this PhysicalAddressSpace. + @param dma_command Points to IODMACommand object. + @result none */ + inline void setDMACommand( IODMACommand * dma_command ) + { ((IOFWPhysicalAddressSpaceAux*)fIOFWAddressSpaceExpansion->fAuxiliary)->setDMACommand( dma_command ); }; + +/*! @function getDMACommand + @abstract Get the DMACommand from this PhysicalAddressSpace. + @param none. + @result return previously assigned IODMACommand, null if not initialized */ + inline IODMACommand * getDMACommand( void ) + { return ((IOFWPhysicalAddressSpaceAux*)fIOFWAddressSpaceExpansion->fAuxiliary)->getDMACommand(); }; + +/*! @function initWithDMACommand + @abstract Initialize physical address space with IODMACommand. + @param bus Points to IOFireWireBus object. + @param command Points to IODMACommand. + @result returns true if success, else false */ + virtual bool initWithDMACommand( IOFireWireBus * control, IODMACommand * command ); + +/*! @function prepare + @abstract Prepare the IODMACommand used by this PhysicalAddressSpace. + @param none. + @result returns kIOReturnSuccess on success */ + inline IOReturn prepare( void ) + { return ((IOFWPhysicalAddressSpaceAux*)fIOFWAddressSpaceExpansion->fAuxiliary)->prepare(); }; + +/*! @function synchronize + @abstract synchronize the IODMACommand used by this PhysicalAddressSpace. + @param none. + @result returns kIOReturnSuccess on success */ + inline IOReturn synchronize( IOOptionBits options ) + { return ((IOFWPhysicalAddressSpaceAux*)fIOFWAddressSpaceExpansion->fAuxiliary)->synchronize( options ); }; + +/*! @function complete + @abstract complete the IODMACommand used by this PhysicalAddressSpace. + @param none. + @result returns kIOReturnSuccess on success */ + inline IOReturn complete( void ) + { return ((IOFWPhysicalAddressSpaceAux*)fIOFWAddressSpaceExpansion->fAuxiliary)->complete(); }; + +/*! @function isPrepared + @abstract Inspects whether the IODMACommand was prepared in this PhysicalAddressSpace. + @param none. + @result returns true if prepared, else false */ + inline bool isPrepared( void ) + { return ((IOFWPhysicalAddressSpaceAux*)fIOFWAddressSpaceExpansion->fAuxiliary)->isPrepared(); }; + +/*! @function getSegments + @abstract Returns the scatter gather list of memory segments from the IODMACommand + used in this PhysicalAddressSpace. + @param offset input/output parameter, defines the starting and ending offset in the memory + descriptor, relative to any offset passed to the prepare() method. + FWSegment Points to an array of memory segments. + num_segments Size of the FWSegment array. + @result returns kIOReturnSuccess on success */ + inline IOReturn getSegments( UInt64 * offset, FWSegment * fw_segments, UInt32 * num_segments ) + { return ((IOFWPhysicalAddressSpaceAux*)fIOFWAddressSpaceExpansion->fAuxiliary)->getSegments( offset, fw_segments, num_segments ); }; + +/*! @function checkMemoryInRange + @abstract Validates the IOMemoryDescriptor, which is used to initialize the PhysicalAddressSpace. + @param memory Points to a valid IOMemoryDescriptor. + @result returns kIOReturnSuccess on success */ + IOReturn checkMemoryInRange( IOMemoryDescriptor * memory ); + +protected: + + UInt64 getPhysicalSegment( UInt64 offset, UInt64 * length ) + { return ((IOFWPhysicalAddressSpaceAux*)fIOFWAddressSpaceExpansion->fAuxiliary)->getPhysicalSegment( offset, length); }; + + virtual IOFWAddressSpaceAux * createAuxiliary( void ); + +}; + +#endif diff --git a/QualcommWireless/include/IOKit/firewire/IOFWPseudoAddressSpace.h b/QualcommWireless/include/IOKit/firewire/IOFWPseudoAddressSpace.h new file mode 100644 index 0000000..02c2c30 --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFWPseudoAddressSpace.h @@ -0,0 +1,370 @@ +/* + * Copyright (c) 1998-2002 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOFWPSEUDOADDRESSSPACE_H +#define _IOKIT_IOFWPSEUDOADDRESSSPACE_H + +#include + +/* + * If installed, this callback is invoked for drivers which + * would like to coalesce incoming writes and do batch processing + * of incoming block write packets. + * This callback can be installed by calling setARxReqIntCompleteHandler + * method in IOFWPseudoAddressSpace object. + */ +typedef void (*IOFWARxReqIntCompleteHandler)( void * refcon ); + +/* + * Pseudo firewire addresses usually represent emulated registers of some kind. + * Accesses to these addresses will result in the owner being notified. + * + * Virtual addresses should not have zero as the top 16 bits of the 48 bit local address, + * since that may look like a physical address to hardware (eg. OHCI). + * if reader is NULL then reads will not be allowed. + * if writer is NULL then writes will not be allowed. + * if either is NULL then lock requests will not be allowed. + * refcon is passed back as the first argument of read and write callbacks. + */ + +class IOFWPseudoAddressSpace; + +#pragma mark - + +/*! + @class IOFWPseudoAddressSpaceAux +*/ + +class IOFWPseudoAddressSpaceAux : public IOFWAddressSpaceAux +{ + OSDeclareDefaultStructors(IOFWPseudoAddressSpaceAux) + + friend class IOFWAddressSpace; + friend class IOFWPseudoAddressSpace; + friend class IOFireWireController; + +protected: + + struct MemberVariables + { + IOFWARxReqIntCompleteHandler fARxReqIntCompleteHandler; + void * fARxReqIntCompleteHandlerRefcon; + }; + + MemberVariables * fMembers; + +public: + + virtual bool init( IOFWAddressSpace * primary ); + virtual void free(); + +protected: + + bool createMemberVariables( void ); + void destroyMemberVariables( void ); + + virtual void handleARxReqIntComplete(); + +public: + +/*! @function setARxReqIntCompleteHandler + @abstract Installs a callback to receive notification, when FWIM has completed + ARxReqInt processing and no incoming packets are left in the queue. + @param refcon Client's callback object. + @param handler Client callback to be invoked, at the end of interrupt processing. + @result none. */ + virtual void setARxReqIntCompleteHandler( void * refcon, IOFWARxReqIntCompleteHandler handler ); + + virtual bool intersects( IOFWAddressSpace * space ); + +private: + + OSMetaClassDeclareReservedUsed(IOFWPseudoAddressSpaceAux, 0); + OSMetaClassDeclareReservedUsed(IOFWPseudoAddressSpaceAux, 1); + OSMetaClassDeclareReservedUnused(IOFWPseudoAddressSpaceAux, 2); + OSMetaClassDeclareReservedUnused(IOFWPseudoAddressSpaceAux, 3); + OSMetaClassDeclareReservedUnused(IOFWPseudoAddressSpaceAux, 4); + OSMetaClassDeclareReservedUnused(IOFWPseudoAddressSpaceAux, 5); + OSMetaClassDeclareReservedUnused(IOFWPseudoAddressSpaceAux, 6); + OSMetaClassDeclareReservedUnused(IOFWPseudoAddressSpaceAux, 7); + OSMetaClassDeclareReservedUnused(IOFWPseudoAddressSpaceAux, 8); + OSMetaClassDeclareReservedUnused(IOFWPseudoAddressSpaceAux, 9); + +}; + +/*! + @class IOFWPseudoAddressSpace +*/ + +class IOFWPseudoAddressSpace : public IOFWAddressSpace +{ + OSDeclareDefaultStructors(IOFWPseudoAddressSpace) + + friend class IOFWPseudoAddressSpaceAux; + friend class IOFireWireController; + +protected: + + IOMemoryDescriptor* fDesc; + void * fRefCon; + FWReadCallback fReader; + FWWriteCallback fWriter; + FWAddress fBase; + UInt32 fLen; + +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + struct ExpansionData { }; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + + static OSData * allocatedAddresses; // unused + + virtual void free(); + +public: + +/*! @function simpleReader + @abstract A method for processing an address space read request + @param refcon Client's callback object. + @param nodeID FireWire Read from nodeID. + @param speed at this 'speed'. + @param addr with FireWire address 'addr'. + @param len read 'len' bytes from nodeID. + @param buf points to a memory descriptor containing the packet data. + @param offset start from this 'offset' in 'buf'. + @param reqrefcon Can be queried for extra info about the request. + @result UIn32 returns kFWResponseComplete on success */ + static UInt32 simpleReader( + void* refcon, + UInt16 nodeID, + IOFWSpeed & speed, + FWAddress addr, + UInt32 len, + IOMemoryDescriptor** buf, + IOByteCount* offset, + IOFWRequestRefCon reqrefcon); + +/*! @function simpleWriter + @abstract A method for processing an address space write request + @param refcon Client's callback object. + @param nodeID FireWire Write to nodeID. + @param speed at this 'speed'. + @param addr with FireWire address 'addr'. + @param len write 'len' bytes to nodeID. + @param buf obtain bytes from location given by 'buf'. + @param reqrefcon Can be queried for extra info about the request. + @result UIn32 returns kFWResponseComplete on success */ + static UInt32 simpleWriter( + void* refcon, + UInt16 nodeID, + IOFWSpeed& speed, + FWAddress addr, + UInt32 len, + const void* buf, + IOFWRequestRefCon reqrefcon); +protected: + + // Get a unique address range + IOReturn allocateAddress( + FWAddress* addr, + UInt32 len); + // free address + void freeAddress( + FWAddress addr, + UInt32 len); + +public: + + static IOFWPseudoAddressSpace* readWrite( + FWAddress addr, + UInt32 len, + FWReadCallback reader, + FWWriteCallback writer, + void* refcon); + +/*! @function simpleRead + @abstract Create an address space object to handle read-only memory (eg. the local ROM) + handles everything itself + @param bus Points to IOFireWireBus object. + @param addr Points to starting address for the Pseudo Address Space. + @param len Length of the Pseudo Address Space. + @param data The virtual address of the first byte in the memory. + @result returns valid IOFWPseudoAddressSpace on success, null on failure */ + static IOFWPseudoAddressSpace* simpleRead( + IOFireWireBus* bus, + FWAddress* addr, + UInt32 len, + const void* data); + +/*! @function simpleReadFixed + @abstract Create an address space object to handle fixed read-only memory (eg. the local ROM) + handles everything itself + @param bus Points to IOFireWireBus object. + @param addr Points to starting address for the Pseudo Address Space. + @param len Length of the Pseudo Address Space. + @param data The virtual address of the first byte in the memory. + @result returns valid IOFWPseudoAddressSpace on success, null on failure */ + static IOFWPseudoAddressSpace* simpleReadFixed( + IOFireWireBus* bus, + FWAddress addr, + UInt32 len, + const void* data); + +/*! @function simpleRW + @abstract Create an address space object to handle r/w memory + handles everything itself + @param bus Points to IOFireWireBus object. + @param addr Points to starting address for the Pseudo Address Space. + @param len Length of the Pseudo Address Space. + @param data The virtual address of the first byte in the memory. + @result returns valid IOFWPseudoAddressSpace on success, null on failure */ + static IOFWPseudoAddressSpace* simpleRW( + IOFireWireBus* bus, + FWAddress* addr, + UInt32 len, + void * data); + +/*! @function simpleRW + @abstract Create an address space object to handle r/w memory + handles everything itself + @param bus Points to IOFireWireBus object. + @param addr Points to starting address for the Pseudo Address Space. + @param data The virtual address of the first byte in the memory. + @result returns valid IOFWPseudoAddressSpace on success, null on failure */ + static IOFWPseudoAddressSpace* simpleRW( + IOFireWireBus* bus, + FWAddress* addr, + IOMemoryDescriptor * data); + +/*! @function initAll + @abstract Initialize an address space object to handle r/w memory + @param bus Points to IOFireWireBus object. + @param addr Points to starting address for the Pseudo Address Space. + @param len Length of the Pseudo Address Space. + @param reader Callback handler for incoming Read. + @param writer Callback handler for incoming Write. + @param refcon Client's callback object. + @result returns true on success, false on failure */ + virtual bool initAll( + IOFireWireBus* bus, + FWAddress* addr, + UInt32 len, + FWReadCallback reader, + FWWriteCallback writer, + void* refcon); + +/*! @function initFixed + @abstract Initialize a fixed address space at top of kCSRRegisterSpaceBaseAddressHi + @param bus Points to IOFireWireBus object. + @param addr Points to starting address for the Pseudo Address Space. + @param reader Callback handler for incoming Read. + @param writer Callback handler for incoming Write. + @param refcon Client's callback object. + @result returns true on success, false on failure */ + virtual bool initFixed( + IOFireWireBus* bus, + FWAddress addr, + UInt32 len, + FWReadCallback reader, + FWWriteCallback writer, + void* refcon); + +/*! @function doRead + @abstract A method for processing an address space read request + @param nodeID FireWire Read from nodeID. + @param speed at this 'speed'. + @param addr with FireWire address 'addr'. + @param len read 'len' bytes from nodeID. + @param buf points to a memory descriptor containing the packet data. + @param offset start from this 'offset' in 'buf'. + @param reqrefcon Can be queried for extra info about the request. + @result UIn32 returns kFWResponseComplete on success */ + virtual UInt32 doRead( + UInt16 nodeID, + IOFWSpeed & speed, + FWAddress addr, + UInt32 len, + IOMemoryDescriptor ** buf, + IOByteCount * offset, + IOFWRequestRefCon reqrefcon); +/*! @function doWrite + @abstract A method for processing an address space write request + @param nodeID FireWire Write to nodeID. + @param speed at this 'speed'. + @param addr with FireWire address 'addr'. + @param len write 'len' bytes to nodeID. + @param buf obtain bytes from location given by 'buf'. + @param reqrefcon Can be queried for extra info about the request. + @result UIn32 returns kFWResponseComplete on success */ + virtual UInt32 doWrite( + UInt16 nodeID, + IOFWSpeed& speed, + FWAddress addr, + UInt32 len, + const void* buf, + IOFWRequestRefCon reqrefcon); + +/*! @function contains + @abstract returns number of bytes starting at addr in this space + @result 0 if it doesn't contain the address + */ + virtual UInt32 contains(FWAddress addr); + +/*! @function simpleRWFixed + @abstract Create a Read/Write fixed address space at top of kCSRRegisterSpaceBaseAddressHi. + @param control Points to IOFireWireBus object. + @param addr Points to starting address for the Pseudo Address Space. + @param len Length of the address range. + @param data The virtual address of the first byte in the memory. + @result returns valid IOFWPseudoAddressSpace on success, null on failure */ + static IOFWPseudoAddressSpace * simpleRWFixed( IOFireWireBus *control, FWAddress addr, UInt32 len, const void *data ); + +protected: + + virtual IOFWAddressSpaceAux * createAuxiliary( void ); + +protected: + inline void handleARxReqIntComplete( void ) + { ((IOFWPseudoAddressSpaceAux*)fIOFWAddressSpaceExpansion->fAuxiliary)->handleARxReqIntComplete(); } + +public: +/*! @function setARxReqIntCompleteHandler + @abstract Installs a callback to receive notification, when FWIM has completed + ARxReqInt processing and no incoming packets are left in the queue. + @param refcon Client's callback object. + @param handler Client callback to be invoked, at the end of interrupt processing. + @result none. */ + inline void setARxReqIntCompleteHandler( void * refcon, IOFWARxReqIntCompleteHandler handler ) + { ((IOFWPseudoAddressSpaceAux*)fIOFWAddressSpaceExpansion->fAuxiliary)->setARxReqIntCompleteHandler( refcon, handler ); } + +private: + + OSMetaClassDeclareReservedUnused(IOFWPseudoAddressSpace, 0); + OSMetaClassDeclareReservedUnused(IOFWPseudoAddressSpace, 1); + +}; + +#endif diff --git a/QualcommWireless/include/IOKit/firewire/IOFWRegs.h b/QualcommWireless/include/IOKit/firewire/IOFWRegs.h new file mode 100644 index 0000000..01c09cc --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFWRegs.h @@ -0,0 +1,73 @@ +/* +* Copyright (c) 1998-2002 Apple Computer, Inc. All rights reserved. +* +* @APPLE_LICENSE_HEADER_START@ +* +* The contents of this file constitute Original Code as defined in and +* are subject to the Apple Public Source License Version 1.1 (the +* "License"). You may not use this file except in compliance with the +* License. Please obtain a copy of the License at +* http://www.apple.com/publicsource and read it before using this file. +* +* This Original Code and all software distributed under the License are +* distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER +* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, +* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the +* License for the specific language governing rights and limitations +* under the License. +* +* @APPLE_LICENSE_HEADER_END@ +*/ +/* + File: IOFWRegs.h + + Copyright: © 1996-1999 by Apple Computer, Inc., all rights reserved. + +*/ + +#ifndef __IOFWREGS_H__ +#define __IOFWREGS_H__ + +#include + +#ifndef NEW_ERROR_CODES + +// +// (!) The following error codes are obsolete... +// Please use the error codes defined in IOFireWireFamilyCommon.h +// + +enum { + inUseErr = -4160, // Item already in use + notFoundErr = -4161, // Item not found + timeoutErr = -4162, // Something timed out + busReconfiguredErr = -4163, // Bus was reconfigured + invalidIDTypeErr = -4166, // Given ID is of an invalid type for the requested operation. + alreadyRegisteredErr = -4168, // Item has already been registered. + disconnectedErr = -4169, // Target of request has been disconnected. + retryExceededErr = -4170, // Retry limit was exceeded. + addressRangeErr = -4171, // Address is not in range. + addressAlignmentErr = -4172, // Address is not of proper alignment. + + multipleTalkerErr = -4180, // Tried to install multiple talkers + channelActiveErr = -4181, // Operation not permitted when channel is active + noListenerOrTalkerErr = -4182, // Every isochronous channel must have one talker and at least + // one listener + noChannelsAvailableErr = -4183, // No supported isochronous channels are available + channelNotAvailableErr = -4184, // Required channel was not available. + invalidIsochPortIDErr = -4185, // An isochronous port ID is invalid. + invalidFWReferenceTypeErr = -4186, // Operation does not support type of given reference ID + separateBusErr = -4187, // Two or more entities are on two or more busses and cannot be associated with eachother. + badSelfIDsErr = -4188, // Received self IDs are bad. + +//zzz Do we own these next ID numbers? + cableVoltageTooLowErr = -4190, // Cable power below device's minimum voltage + cablePowerInsufficientErr = -4191 // Can't grant power request at this time +}; + + +#endif //NEW_ERROR_CODES + +#endif /* __IOFWREGS_H */ + diff --git a/QualcommWireless/include/IOKit/firewire/IOFWSimpleContiguousPhysicalAddressSpace.h b/QualcommWireless/include/IOKit/firewire/IOFWSimpleContiguousPhysicalAddressSpace.h new file mode 100644 index 0000000..606a9b2 --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFWSimpleContiguousPhysicalAddressSpace.h @@ -0,0 +1,66 @@ +/* + * Copyright (c) 1998-2006 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOFWSIMPLECONTIGUOUSPHYSICALADDRESSSPACE_H_ +#define _IOFWSIMPLECONTIGUOUSPHYSICALADDRESSSPACE_H_ + +#include + +/*! @class IOFWSimpleContiguousPhysicalAddressSpace +*/ + +class IOFWSimpleContiguousPhysicalAddressSpace : public IOFWSimplePhysicalAddressSpace +{ + OSDeclareDefaultStructors( IOFWSimpleContiguousPhysicalAddressSpace ) + +private: + + void * fSimpleContigPhysSpaceMembers; + + IOReturn cachePhysicalAddress( void ); + +protected: + virtual bool createMemberVariables( void ); + virtual void destroyMemberVariables( void ); + +public: + + virtual bool init( IOFireWireBus * control, vm_size_t size, IODirection direction ); + virtual void free( void ); + + FWAddress getFWAddress( void ); + +private: + OSMetaClassDeclareReservedUnused(IOFWSimpleContiguousPhysicalAddressSpace, 0); + OSMetaClassDeclareReservedUnused(IOFWSimpleContiguousPhysicalAddressSpace, 1); + OSMetaClassDeclareReservedUnused(IOFWSimpleContiguousPhysicalAddressSpace, 2); + OSMetaClassDeclareReservedUnused(IOFWSimpleContiguousPhysicalAddressSpace, 3); + OSMetaClassDeclareReservedUnused(IOFWSimpleContiguousPhysicalAddressSpace, 4); + OSMetaClassDeclareReservedUnused(IOFWSimpleContiguousPhysicalAddressSpace, 5); + OSMetaClassDeclareReservedUnused(IOFWSimpleContiguousPhysicalAddressSpace, 6); + OSMetaClassDeclareReservedUnused(IOFWSimpleContiguousPhysicalAddressSpace, 7); + OSMetaClassDeclareReservedUnused(IOFWSimpleContiguousPhysicalAddressSpace, 8); + OSMetaClassDeclareReservedUnused(IOFWSimpleContiguousPhysicalAddressSpace, 9); + +}; + +#endif diff --git a/QualcommWireless/include/IOKit/firewire/IOFWSimplePhysicalAddressSpace.h b/QualcommWireless/include/IOKit/firewire/IOFWSimplePhysicalAddressSpace.h new file mode 100644 index 0000000..83a76a4 --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFWSimplePhysicalAddressSpace.h @@ -0,0 +1,70 @@ +/* + * Copyright (c) 1998-2006 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOFWSIMPLEPHYSICALADDRESSSPACE_H_ +#define _IOFWSIMPLEPHYSICALADDRESSSPACE_H_ + +#include +#include +#include +#include + +/*! @class IOFWSimplePhysicalAddressSpace +*/ + +class IOFWSimplePhysicalAddressSpace : public IOFWPhysicalAddressSpace +{ + OSDeclareDefaultStructors( IOFWSimplePhysicalAddressSpace ) + +private: + + void * fSimplePhysSpaceMembers; + + IOReturn allocateMemory( void ); + void deallocateMemory( void ); + +protected: + virtual bool createMemberVariables( void ); + virtual void destroyMemberVariables( void ); + +public: + + virtual bool init( IOFireWireBus * control, vm_size_t size, IODirection direction, bool contiguous = false ); + virtual void free( void ); + + IOVirtualAddress getVirtualAddress( void ); + +private: + OSMetaClassDeclareReservedUnused(IOFWSimplePhysicalAddressSpace, 0); + OSMetaClassDeclareReservedUnused(IOFWSimplePhysicalAddressSpace, 1); + OSMetaClassDeclareReservedUnused(IOFWSimplePhysicalAddressSpace, 2); + OSMetaClassDeclareReservedUnused(IOFWSimplePhysicalAddressSpace, 3); + OSMetaClassDeclareReservedUnused(IOFWSimplePhysicalAddressSpace, 4); + OSMetaClassDeclareReservedUnused(IOFWSimplePhysicalAddressSpace, 5); + OSMetaClassDeclareReservedUnused(IOFWSimplePhysicalAddressSpace, 6); + OSMetaClassDeclareReservedUnused(IOFWSimplePhysicalAddressSpace, 7); + OSMetaClassDeclareReservedUnused(IOFWSimplePhysicalAddressSpace, 8); + OSMetaClassDeclareReservedUnused(IOFWSimplePhysicalAddressSpace, 9); + +}; + +#endif diff --git a/QualcommWireless/include/IOKit/firewire/IOFWSyncer.h b/QualcommWireless/include/IOKit/firewire/IOFWSyncer.h new file mode 100644 index 0000000..0fa497f --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFWSyncer.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 1998-2007 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOFWSYNCER_H +#define _IOFWSYNCER_H + +#include +#include +#include + +class IOFWSyncer : public OSObject +{ + OSDeclareDefaultStructors(IOFWSyncer) + +private: + // The spin lock that is used to guard the 'threadMustStop' variable. + IOSimpleLock *guardLock; + volatile bool threadMustStop; + IOReturn fResult; + virtual void free(); + virtual void privateSignal(); + +public: + + static IOFWSyncer * create(bool twoRetains = true); + + virtual bool init(bool twoRetains); + virtual void reinit(); + virtual IOReturn wait(bool autoRelease = true); + virtual void signal(IOReturn res = kIOReturnSuccess, + bool autoRelease = true); +}; + +#endif /* !_IOFWSYNCER */ + diff --git a/QualcommWireless/include/IOKit/firewire/IOFWUserObjectExporter.h b/QualcommWireless/include/IOKit/firewire/IOFWUserObjectExporter.h new file mode 100644 index 0000000..d6890ac --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFWUserObjectExporter.h @@ -0,0 +1,95 @@ +/* + * Copyright (c) 1998-2008 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/*! @class IOFWUserObjectExporter + @discussion An IOFWUserObjectExporter is for internal use only. You should never subclass IOFWUserObjectExporter +*/ + + namespace IOFireWireLib + { + typedef UInt32 UserObjectHandle; + } + +#ifdef KERNEL + + class IOFWUserObjectExporter : public OSObject + { + OSDeclareDefaultStructors (IOFWUserObjectExporter ) + + public : + + typedef void (*CleanupFunction)( const OSObject * obj ); + typedef void (*CleanupFunctionWithExporter)( const OSObject * obj, IOFWUserObjectExporter * ); + + private : + + unsigned fCapacity; + unsigned fObjectCount; + const OSObject ** fObjects; + CleanupFunctionWithExporter * fCleanupFunctions; + IOLock * fLock; + OSObject * fOwner; + + public : + + static IOFWUserObjectExporter * createWithOwner( OSObject * owner ); + bool initWithOwner( OSObject * owner ); + + virtual bool init(void) APPLE_KEXT_OVERRIDE; + + virtual void free (void) APPLE_KEXT_OVERRIDE; + virtual bool serialize ( OSSerialize * s ) const APPLE_KEXT_OVERRIDE; + + // me + IOReturn addObject ( OSObject * obj, CleanupFunction cleanup, IOFireWireLib::UserObjectHandle * outHandle ); + void removeObject ( IOFireWireLib::UserObjectHandle handle ); + + // the returned object is retained! This is for thread safety.. if someone else released + // the object from the pool after you got it, you be in for Trouble + // Release the returned value when you're done!! + const OSObject * lookupObject ( IOFireWireLib::UserObjectHandle handle ) const; + const OSObject * lookupObjectForType( IOFireWireLib::UserObjectHandle handle, const OSMetaClass * toType ) const; + void removeAllObjects (); + + void lock () const; + void unlock () const; + + OSObject * getOwner() const; + + const IOFireWireLib::UserObjectHandle lookupHandle ( OSObject * object ) const; + + // don't subclass, but just in case someone does... + + private: + + OSMetaClassDeclareReservedUnused(IOFWUserObjectExporter, 0); + OSMetaClassDeclareReservedUnused(IOFWUserObjectExporter, 1); + OSMetaClassDeclareReservedUnused(IOFWUserObjectExporter, 2); + OSMetaClassDeclareReservedUnused(IOFWUserObjectExporter, 3); + OSMetaClassDeclareReservedUnused(IOFWUserObjectExporter, 4); + OSMetaClassDeclareReservedUnused(IOFWUserObjectExporter, 5); + OSMetaClassDeclareReservedUnused(IOFWUserObjectExporter, 6); + OSMetaClassDeclareReservedUnused(IOFWUserObjectExporter, 7); + + }; + +#endif diff --git a/QualcommWireless/include/IOKit/firewire/IOFWUtils.h b/QualcommWireless/include/IOKit/firewire/IOFWUtils.h new file mode 100644 index 0000000..1a0ffc3 --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFWUtils.h @@ -0,0 +1,32 @@ +/* + * IOFWUtils.h + * IOFireWireFamily + * + * Created by Niels on Fri Aug 16 2002. + * Copyright (c) 2002 Apple Computer, Inc. All rights reserved. + * + */ + +#import + +//////////////////////////////////////////////////////////////////////////////// +// +// Useful FireWire utility functions. +// + +#ifdef __cplusplus +extern "C" { +#endif + +UInt16 FWComputeCRC16(const UInt32 *pQuads, UInt32 numQuads); +UInt16 FWUpdateCRC16(UInt16 crc16, UInt32 quad); + +UInt32 AddFWCycleTimeToFWCycleTime( UInt32 cycleTime1, UInt32 cycleTime2 ); +UInt32 SubtractFWCycleTimeFromFWCycleTime( UInt32 cycleTime1, UInt32 cycleTime2); + +void IOFWGetAbsoluteTime( AbsoluteTime * result ); + +#ifdef __cplusplus +} +#endif + diff --git a/QualcommWireless/include/IOKit/firewire/IOFireWireBus.h b/QualcommWireless/include/IOKit/firewire/IOFireWireBus.h new file mode 100644 index 0000000..053bfe4 --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFireWireBus.h @@ -0,0 +1,373 @@ +/* + * Copyright (c) 1998-2002 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1999-2002 Apple Computer, Inc. All rights reserved. + * + * HISTORY + * + */ + + +#ifndef _IOKIT_IOFIREWIREBUS_H +#define _IOKIT_IOFIREWIREBUS_H + +#include +#include +#include +#include +#include + +extern const OSSymbol *gFireWireROM; +extern const OSSymbol *gFireWireNodeID; +extern const OSSymbol *gFireWireSelfIDs; +extern const OSSymbol *gFireWireSpeed; +extern const OSSymbol *gFireWireUnit_Spec_ID; +extern const OSSymbol *gFireWireUnit_SW_Version; +extern const OSSymbol *gFireWireVendor_ID; +extern const OSSymbol *gFireWire_GUID; +extern const OSSymbol *gFireWireVendor_Name; +extern const OSSymbol *gFireWireProduct_Name; +extern const OSSymbol *gFireWireModel_ID; +extern const OSSymbol *gFireWireTDM; + +class IOFireWireDevice; +class IOLocalConfigDirectory; +class IOFWLocalIsochPort; +class IOFireWirePowerManager; +class IOFireWireBus; +class IOFWDCLPool; +class IOFWSimpleContiguousPhysicalAddressSpace; +class IOFWSimplePhysicalAddressSpace; +class IOFWUserObjectExporter; + +#pragma mark - + +/*! + @class IOFireWireBusAux +*/ + +class IOFireWireBusAux : public OSObject +{ + OSDeclareAbstractStructors(IOFireWireBusAux) + + friend class IOFireWireBus; + + protected: + + /*! + @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + + struct ExpansionData { }; + + /*! + @var reserved + Reserved for future use. (Internal use only) + */ + + ExpansionData * reserved; + + public : + + virtual IOFWDCLPool * createDCLPool ( unsigned capacity ) const = 0 ; + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 32); + virtual UInt8 getMaxRec( void ) = 0; + + virtual UInt64 getFireWirePhysicalAddressMask( void ) = 0; + virtual UInt32 getFireWirePhysicalAddressBits( void ) = 0; + virtual UInt64 getFireWirePhysicalBufferMask( void ) = 0; + virtual UInt32 getFireWirePhysicalBufferBits( void ) = 0; + + virtual IOFWSimpleContiguousPhysicalAddressSpace * createSimpleContiguousPhysicalAddressSpace( vm_size_t size, IODirection direction ) = 0; + virtual IOFWSimplePhysicalAddressSpace * createSimplePhysicalAddressSpace( vm_size_t size, IODirection direction ) = 0; + + virtual IOFWUserObjectExporter * getSessionRefExporter( void ) = 0; + + private: + OSMetaClassDeclareReservedUsed(IOFireWireBusAux, 0); + OSMetaClassDeclareReservedUsed(IOFireWireBusAux, 1); + OSMetaClassDeclareReservedUsed(IOFireWireBusAux, 2); + OSMetaClassDeclareReservedUsed(IOFireWireBusAux, 3); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 4); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 5); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 6); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 7); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 8); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 9); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 10); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 11); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 12); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 13); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 14); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 15); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 16); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 17); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 18); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 19); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 20); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 21); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 22); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 23); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 24); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 25); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 26); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 27); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 28); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 29); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 30); + OSMetaClassDeclareReservedUnused(IOFireWireBusAux, 31); + +}; + +#pragma mark - + +/*! + @class IOFireWireBus + @abstract IOFireWireBus is a public class the provides access to + general FireWire functionality... +*/ + +class IOFireWireBus : public IOService +{ + OSDeclareAbstractStructors(IOFireWireBus) + +public: + + struct DCLTaskInfoAux + { + unsigned version ; + union // u + { + struct // v0 + { + IOMemoryMap * bufferMemoryMap ; // This field required to get physical addresses to program DMA. + // If NULL, we try to make the map ourselves. + // If you created a buffer memory descriptor + // for your program's buffers, just call map() on it + // and pass the returned object here... + } v0 ; + + struct // v1 + { + IOMemoryMap * bufferMemoryMap ; // same as 'bufferMemoryMap' from version 0, above. + + IOWorkLoop * workloop ; // A workloop on which to run callbacks for this port.. + // Can be NULL to use FireWire isochronous workloop... + // The workloop will be retained by the program object. + } v1 ; + + struct + { + IOMemoryMap * bufferMemoryMap ; // same as 'bufferMemoryMap' from version 0, above. + + IOWorkLoop * workloop ; // A workloop on which to run callbacks for this port.. + // Can be NULL to use FireWire isochronous workloop... + // The workloop will be retained by the program object. + IOFWIsochPortOptions options ; // extra options + } v2 ; + } u ; + } ; + + // this struct has been redefined for our next generation isochronous architecture, + // but is backwards compatible with the old definition.. This means we should + // be safe when an old-style driver is loaded.. + // To use DCLTaskInfo (see createLocalIsochPort) make sure all 'unused' fields are set to 0 or NULL + // and that auxInfo points to a valid DCLTaskInfoAux struct, defined above. + + struct DCLTaskInfo + { + task_t unused0 ; + vm_address_t unused1 ; + UInt32 unused2 ; + vm_address_t unused3 ; + UInt32 unused4 ; + void (*unused5)(void) ; + DCLTaskInfoAux * auxInfo ; // Refcon for user call + } ; + + static const IORegistryPlane * gIOFireWirePlane; + + IOFireWireBusAux * fAuxiliary; + + // Create an Isochronous Channel object + virtual IOFWIsochChannel *createIsochChannel( + bool doIRM, UInt32 bandwidth, IOFWSpeed prefSpeed, + IOFWIsochChannel::ForceStopNotificationProc stopProc=NULL, + void *stopRefCon=NULL) = 0; + + /*! @function createLocalIsochPort + @abstract Create a local isochronous port to run the given DCL program + @param talking Pass true to create a talker port; pass false to create a listener port. + @param opcodes A pointer to your DCL program (linked list of DCLCommand structs) + To use an IOFWDCL/IOFWDCLPool program, pass the DCLCommand returned by + IOFWDCLPool::getProgram(). + @param info (Optional) Pointer to DCLTaskInfo struct containing additional + configuration information. If you have an IOMemoryMap for your DCL program data buffers, + pass it here. You can also pass an IOWorkLoop if you want to use your own + workloop to handle callbacks for the created port object. + @param startEvent Specifies a bus condition on which the port should start receiving/sending packets + Must be kFWDCLImmediateEvent, kFWDCLCycleEvent, or kFWDCLSyBitsEvent. + Pass kFWDCLImmediateEvent to start without waiting when start() is called. Pass kFWDCLCycleEvent + to start() transmitting at a specified bus cycle time. Pass kFWDCLSyBitsEvent (receive only) + to start receiving packets once an isochronous packet with a specified sync field arrives. + @param startState Pass the value for the desired start condition, as specified by 'startEvent' + kFWDCLImmediateEvent: set to 0 + kFWDCLCycleEvent: the cycle timer value on which to start processing packets. For talker + ports, This value will be masked by 'startMask' and packet processing will be begin on the + next cycle whose lowest bits match the masked value. For listener ports, pass a 15-bit value + containg to the low order two bits of cycleSeconds and the 13-bit cycleCount on which to start + processing packets. + kFWDCLSyBitsEvent: The value of the sync field on which to start receive packets. The value will be masked + by 'startMask'. For DCLCommand based isoch ports, processing will begin on the first received packet + that has an isochronous header sync field matching 'startState'. For IOFWDCL/IOFWDCLPool based + ports, processing will pause on each IOFWDCL that has wait set to true until a packet that has + an isochronous header sync field matching 'startState' is received. + @result Returns an IOFWLocalIsochPort on success.*/ + virtual IOFWLocalIsochPort *createLocalIsochPort(bool talking, + DCLCommand *opcodes, DCLTaskInfo *info = 0, + UInt32 startEvent = 0, UInt32 startState = 0, UInt32 startMask = 0) = 0; + + virtual IOReturn getCycleTime(UInt32 &cycleTime) = 0; + virtual IOReturn getBusCycleTime(UInt32 &busTime, UInt32 &cycleTime) = 0; + + // Methods to manipulate the local Config ROM + virtual IOReturn AddUnitDirectory(IOLocalConfigDirectory *unitDir) = 0; + virtual IOReturn RemoveUnitDirectory(IOLocalConfigDirectory *unitDir) = 0; + + // Cause a bus reset + virtual IOReturn resetBus() = 0; + + // Convert a firewire nodeID into the IOFireWireDevice for it + virtual IOFireWireDevice * nodeIDtoDevice(UInt32 generation, UInt16 nodeID) = 0; + + // Execute specified function on workloop after specified delay + // Returned command is for delay, call it's cancel() function to cancel timeout. + virtual IOFWDelayCommand * createDelayedCmd(UInt32 uSecDelay, FWBusCallback func, void *refcon) = 0; + + virtual IOFWPhysicalAddressSpace *createPhysicalAddressSpace(IOMemoryDescriptor *mem) = 0; + virtual IOFWPseudoAddressSpace *createPseudoAddressSpace(FWAddress *addr, UInt32 len, + FWReadCallback reader, FWWriteCallback writer, void *refcon) = 0; + + + // Extract info about the async request + virtual bool isLockRequest(IOFWRequestRefCon refcon) = 0; + virtual bool isQuadRequest(IOFWRequestRefCon refcon) = 0; + virtual UInt32 getExtendedTCode(IOFWRequestRefCon refcon) = 0; + + // How big (as a power of two) can packets sent to/received from the node be? + virtual int maxPackLog ( bool forSend, UInt16 nodeAddress) const = 0; + + // How big (as a power of two) can packets sent from A to B be? + virtual int maxPackLog ( UInt16 nodeA, UInt16 nodeB) const = 0; + + // Force given node to be root (via root holdoff Phy packet) + virtual IOReturn makeRoot ( UInt32 generation, UInt16 nodeID) = 0; + + // Create address space at fixed address in initial register space + virtual IOFWPseudoAddressSpace * createInitialAddressSpace ( UInt32 addressLo, UInt32 len, + FWReadCallback reader, FWWriteCallback writer, void *refcon) = 0; + + // Get address space object for given address, if any + virtual IOFWAddressSpace * getAddressSpace(FWAddress address) = 0; + + // Extract info about the async request - was the request ack'ed complete already? + virtual bool isCompleteRequest(IOFWRequestRefCon refcon) = 0; + + virtual IOFWAsyncStreamCommand * createAsyncStreamCommand( UInt32 generation, + UInt32 channel, UInt32 sync, UInt32 tag, IOMemoryDescriptor *hostMem, + UInt32 size, int speed,FWAsyncStreamCallback completion=NULL, void *refcon=NULL) = 0; + virtual UInt32 hopCount(UInt16 nodeAAddress, UInt16 nodeBAddress ) = 0; + virtual UInt32 hopCount(UInt16 nodeAAddress ) = 0; + virtual IOFireWirePowerManager * getBusPowerManager( void ) = 0; + +protected: + + virtual IOFireWireBusAux * createAuxiliary( void ) = 0; + + public : + + inline IOFWDCLPool * createDCLPool ( UInt32 capacity = 0 ) { return fAuxiliary->createDCLPool ( capacity ) ; } + inline UInt8 getMaxRec( void ) { return fAuxiliary->getMaxRec(); } + + // get the physical addressing limitations for this controller + + // returns the physical mask for memory addressable by the bus and this controller's DMA engine + // intended for use with IOBufferMemoryDescriptor::inTaskWithPhysicalMask() + // all current hardware is 32 bit --- currently returns 0x00000000FFFFFFFF + // this API is intended for allocating physical buffers. + // it will not return more than 48 bits so that buffer addresses can be turned into FWAddresses + inline UInt64 getFireWirePhysicalAddressMask( void ) + { return fAuxiliary->getFireWirePhysicalAddressMask(); } + + // returns a count of the maximum addressing bits supported by the bus and this controller + // intended for use with IODMACommand::withSpecification() + // all current hardware is 32 bit --- currently returns 32 + // this API is intended for allocating physical buffers. + // it will not return more than 48 bits so that buffer addresses can be turned into FWAddresses + inline UInt32 getFireWirePhysicalAddressBits( void ) + { return fAuxiliary->getFireWirePhysicalAddressBits(); } + + // returns the physical mask for memory addressable by this controller's DMA engine + // intended for use with IOBufferMemoryDescriptor::inTaskWithPhysicalMask() + // all current hardware is 32 bit --- currently returns 0x00000000FFFFFFFF + // this API is to allocate isoch and other buffers that don't need to be addressable by the bus + // it may someday return as high 64 bits + inline UInt64 getFireWirePhysicalBufferMask( void ) + { return fAuxiliary->getFireWirePhysicalBufferMask(); } + + // returns a count of the maximum addressing bits supported by this controller + // intended for use with IODMACommand::withSpecification() + // all current hardware is 32 bit --- currently returns 32 + // this API is to allocate isoch and other buffers that don't need to be addressable by the bus + // it may someday return as high 64 bits + inline UInt32 getFireWirePhysicalBufferBits( void ) + { return fAuxiliary->getFireWirePhysicalBufferBits(); } + + inline IOFWSimpleContiguousPhysicalAddressSpace * createSimpleContiguousPhysicalAddressSpace( vm_size_t size, IODirection direction ) + { return fAuxiliary->createSimpleContiguousPhysicalAddressSpace( size, direction ); } + + inline IOFWSimplePhysicalAddressSpace * createSimplePhysicalAddressSpace( vm_size_t size, IODirection direction ) + { return fAuxiliary->createSimplePhysicalAddressSpace( size, direction ); } + + virtual IOFWAsyncStreamCommand * createAsyncStreamCommand( UInt32 generation, + UInt32 channel, UInt32 sync, UInt32 tag, IOMemoryDescriptor *hostMem, + UInt32 size, int speed,FWAsyncStreamCallback completion, void *refcon, bool failOnReset) = 0; + + inline IOFWUserObjectExporter * getSessionRefExporter( void ) + { return fAuxiliary->getSessionRefExporter(); } + + private: + + OSMetaClassDeclareReservedUsed(IOFireWireBus, 0); + OSMetaClassDeclareReservedUsed(IOFireWireBus, 1); + OSMetaClassDeclareReservedUsed(IOFireWireBus, 2); + OSMetaClassDeclareReservedUsed(IOFireWireBus, 3); + OSMetaClassDeclareReservedUsed(IOFireWireBus, 4); + OSMetaClassDeclareReservedUsed(IOFireWireBus, 5); + OSMetaClassDeclareReservedUsed(IOFireWireBus, 6); + OSMetaClassDeclareReservedUsed(IOFireWireBus, 7); + +}; + +#endif /* ! _IOKIT_IOFIREWIREBUS_H */ + diff --git a/QualcommWireless/include/IOKit/firewire/IOFireWireController.h b/QualcommWireless/include/IOKit/firewire/IOFireWireController.h new file mode 100644 index 0000000..44f73c2 --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFireWireController.h @@ -0,0 +1,1098 @@ +/* + * Copyright (c) 1998-2002 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1999-2002 Apple Computer, Inc. All rights reserved. + * + * HISTORY + * + */ + +#ifndef _IOKIT_IOFIREWIRECONTROLLER_H +#define _IOKIT_IOFIREWIRECONTROLLER_H + +#ifndef FIREWIREPRIVATE +#warning Please do not include this file. Include IOFireWireBus.h instead. +#endif + +#include +#include +#include +#include +#include +#include + +class OSData; +class IOWorkLoop; +class IOEventSource; +class IOFWQEventSource; +class IOTimerEventSource; +class IOMemoryDescriptor; +class IOFireWireController; +class IOFWAddressSpace; +class IOFWPseudoAddressSpace; +class IOFireWireNub; +class IOFireWireDevice; +class IOFireWireDeviceAux; +class IOFireWireUnit; +class IODCLProgram; +class IOLocalConfigDirectory; +class IOFireWireLink; +class IOFireWireSBP2ORB; +class IOFireWireSBP2Login; +class IOFireWireROMCache; +class IOFireWireLocalNode; +class IOFWWorkLoop; +class IOFireWireIRM; +class IOFireWirePowerManager; +class IOFWSimplePhysicalAddressSpace; +class IOFWSimpleContiguousPhysicalAddressSpace; +class IOFWAsyncStreamReceiver; +class IOFWAsyncStreamListener; +class IOFWUserVectorCommand; +class IOFWAsyncPHYCommand; +class IOFWPHYPacketListener; +class IOFWUserPHYPacketListener; +class IOFireWireUserClient; + +#if FIRELOGCORE +class IOFireLog; +class IOFireLogPublisher; +#endif + +const UInt32 kMaxWaitForValidSelfID = 20; // Still invalid SelfID after 20 retries + +// Phy packet defs. + +enum +{ + kFWPhyPacketID = FWBitRange (0, 1), + kFWPhyPacketIDPhase = FWBitRangePhase (0, 1), + + kFWPhyPacketPhyID = FWBitRange (2, 7), + kFWPhyPacketPhyIDPhase = FWBitRangePhase (2, 7) +}; + +enum +{ + kSelfIDPacketSize = 8, + kMaxSelfIDs = 4 // SelfID 0,1,3,8 +}; + +enum +{ + kFWConfigurationPacketID = 0, + kFWLinkOnPacketID = 1, + kFWSelfIDPacketID = 2 +}; + +enum +{ + kFWPhyConfigurationR = FW_BIT(8), + kFWPhyConfigurationT = FW_BIT(9), + kFWPhyConfigurationGapCnt = FWBitRange (10, 15), + kFWPhyConfigurationGapCntPhase = FWBitRangePhase (10, 15) +}; + +enum +{ + kFWSelfIDPortStatusChild = 3, + kFWSelfIDPortStatusParent = 2, + kFWSelfIDPortStatusNotConnected = 1, + kFWSelfIDPortStatusNotPresent = 0, + + kFWSelfIDNoPower = 0, + kFWSelfIDSelfPowered15W = 1, + kFWSelfIDSelfPowered30W = 2, + kFWSelfIDSelfPowered45W = 3, + kFWSelfIDBusPowered1W = 4, + kFWSelfIDBusPowered3W = 5, + kFWSelfIDBusPowered6W = 6, + kFWSelfIDBusPowered10W = 7, + + kFWSelfIDPhyID = kFWPhyPacketPhyID,//zzz do we need or want this? + kFWSelfIDPhyIDPhase = kFWPhyPacketPhyIDPhase, + kFWSelfIDM = FW_BIT(31), + + kFWSelfID0L = FW_BIT(9), + kFWSelfID0GapCnt = FWBitRange (10, 15), + kFWSelfID0GapCntPhase = FWBitRangePhase (10, 15), + kFWSelfID0SP = FWBitRange (16, 17), + kFWSelfID0SPPhase = FWBitRangePhase (16, 17), + kFWSelfID0Del = FWBitRange (18, 19), + kFWSelfID0DelPhase = FWBitRangePhase (18, 19), + kFWSelfID0C = FW_BIT(20), + kFWSelfID0Pwr = FWBitRange (21, 23), + kFWSelfID0PwrPhase = FWBitRangePhase (21, 23), + kFWSelfID0P0 = FWBitRange (24, 25), + kFWSelfID0P0Phase = FWBitRangePhase (24, 25), + kFWSelfID0P1 = FWBitRange (26, 27), + kFWSelfID0P1Phase = FWBitRangePhase (26, 27), + kFWSelfID0P2 = FWBitRange (28, 29), + kFWSelfID0P2Phase = FWBitRangePhase (28, 29), + kFWSelfID0I = FW_BIT(30), + + kFWSelfIDPacketType = FW_BIT(8), + kFWSelfIDNN = FWBitRange (9, 11), + kFWSelfIDNNPhase = FWBitRangePhase (9, 11), + kFWSelfIDNPa = FWBitRange (14, 15), + kFWSelfIDNPaPhase = FWBitRangePhase (14, 15), + kFWSelfIDNPb = FWBitRange (16, 17), + kFWSelfIDNPbPhase = FWBitRangePhase (16, 17), + kFWSelfIDNPc = FWBitRange (18, 19), + kFWSelfIDNPcPhase = FWBitRangePhase (18, 19), + kFWSelfIDNPd = FWBitRange (20, 21), + kFWSelfIDNPdPhase = FWBitRangePhase (20, 21), + kFWSelfIDNPe = FWBitRange (22, 23), + kFWSelfIDNPePhase = FWBitRangePhase (22, 23), + kFWSelfIDNPf = FWBitRange (24, 25), + kFWSelfIDNPfPhase = FWBitRangePhase (24, 25), + kFWSelfIDNPg = FWBitRange (26, 27), + kFWSelfIDNPgPhase = FWBitRangePhase (26, 27), + kFWSelfIDNPh = FWBitRange (28, 29), + kFWSelfIDNPhPhase = FWBitRangePhase (28, 29), + kFWSelfIDMore = FW_BIT(31) +}; + +// Primary packet defs. +enum +{ + kFWPacketTCode = FWBitRange (24, 27), + kFWPacketTCodePhase = FWBitRangePhase (24, 27) +}; + + +enum +{ + kFWAsynchSpd = FWBitRange (14, 15), + kFWAsynchSpdPhase = FWBitRangePhase (14, 15), + + kFWAsynchTLabel = FWBitRange (16, 21), + kFWAsynchTLabelPhase = FWBitRangePhase (16, 21), + kFWAsynchTTotal = ((0xffffffff & kFWAsynchTLabel) >> kFWAsynchTLabelPhase)+1, + kFWAsynchRt = FWBitRange (22, 23), + kFWAsynchRtPhase = FWBitRangePhase (22, 23), + kFWAsynchNew = 0, + kFWAsynchRetryA = 2, + kTIAsycnhRetryB = 3, + + kFWAsynchPriority = FWBitRange (28, 31), + kFWAsynchPriorityPhase = FWBitRangePhase (28, 31), + + kFWAsynchDestinationID = FWBitRange (0, 15), + kFWAsynchDestinationIDPhase = FWBitRangePhase (0, 15), + + kFWAsynchSourceID = FWBitRange (0, 15), + kFWAsynchSourceIDPhase = FWBitRangePhase (0, 15), + + kFWAsynchDestinationOffsetHigh = FWBitRange (16, 31), + kFWAsynchDestinationOffsetHighPhase = FWBitRangePhase (16, 31), + + kFWAsynchDestinationOffsetLow = FWBitRange (0, 31), + kFWAsynchDestinationOffsetLowPhase = FWBitRangePhase (0, 31), + + kFWAsynchDataLength = FWBitRange (0, 15), + kFWAsynchDataLengthPhase = FWBitRangePhase (0, 15), + + kFWAsynchExtendedTCode = FWBitRange (16, 31), + kFWAsynchExtendedTCodePhase = FWBitRangePhase (16, 31), + + kFWAsynchAckSent = FWBitRange (28, 31), + kFWAsynchAckSentPhase = FWBitRangePhase (28, 31), + + kFWAsynchRCode = FWBitRange (16, 19), + kFWAsynchRCodePhase = FWBitRangePhase (16, 19) +}; + +enum +{ + kFWTCodeWriteQuadlet = 0, + kFWTCodeWriteBlock = 1, + kFWTCodeWriteResponse = 2, + kFWTCodeReadQuadlet = 4, + kFWTCodeReadBlock = 5, + kFWTCodeReadQuadletResponse = 6, + kFWTCodeReadBlockResponse = 7, + kFWTCodeCycleStart = 8, + kFWTCodeLock = 9, + kFWTCodeIsochronousBlock = 10, + kFWTCodeLockResponse = 11, + kFWTCodePHYPacket = 14 +}; + +enum +{ + kFWExtendedTCodeMaskSwap = 1, + kFWExtendedTCodeCompareSwap = 2, + kFWExtendedTCodeFetchAdd = 3, + kFWExtendedTCodeLittleAdd = 4, + kFWExtendedTCodeBoundedAdd = 5, + kFWExtendedTCodeWrapAdd = 6, + kFWExtendedTCodeVendorDependent = 7 +}; + +// debug boot-arg constants +enum +{ + kFWDebugIgnoreNodeNone = 0xFFFFFFFF +}; + +struct AsyncPendingTrans { + IOFWAsyncCommand * fHandler; + IOFWCommand * fAltHandler; + int fTCode; + bool fInUse; +}; + +struct IOFWNodeScan { + IOFireWireController * fControl; + FWAddress fAddr; + UInt32 fBuf[5]; // Enough for bus info block + UInt32 * fSelfIDs; + int fNumSelfIDs; + int fROMSize; + int fRead; + IOFWReadQuadCommand * fCmd; + IOFWCompareAndSwapCommand * fLockCmd; + UInt32 generation; + UInt32 fIRMBitBucketOld; + UInt32 fIRMBitBucketNew; + bool fIRMisBad; + bool speedChecking; + bool fContenderNeedsChecking; + bool fIRMCheckingRead; + bool fIRMCheckingLock; + int fRetriesBumped; + bool fMustNotBeRoot; +}; + + +typedef struct IOFWDuplicateGUIDStruct IOFWDuplicateGUIDRec; +struct IOFWDuplicateGUIDStruct + { + IOFWDuplicateGUIDRec * fNextGUID; + CSRNodeUniqueID fGUID; + UInt32 fLastGenSeen; +}; + + +// IOFireWireDuplicateGUIDList +// +// A little class for keeping track of GUIDs which where we have observed 2 nodes with +// the same GUID + +class IOFireWireDuplicateGUIDList : public OSObject +{ + OSDeclareDefaultStructors(IOFireWireDuplicateGUIDList); + +private: + IOFWDuplicateGUIDRec * fFirstGUID; + +protected: + virtual void free(void) APPLE_KEXT_OVERRIDE; + +public: + + static IOFireWireDuplicateGUIDList * create( void ); + + void addDuplicateGUID( CSRNodeUniqueID guid, UInt32 gen ); + void removeDuplicateGUID( CSRNodeUniqueID guid ); + + bool findDuplicateGUID( CSRNodeUniqueID guid, UInt32 gen ); + +}; + +#define kMaxPendingTransfers kFWAsynchTTotal + +class IOFireWireController; + +#pragma mark - + +/*! + @class IOFireWireControllerAux +*/ + +class IOFireWireControllerAux : public IOFireWireBusAux +{ + OSDeclareDefaultStructors(IOFireWireControllerAux) + + friend class IOFireWireController; + +protected: + + IOFireWireController * fPrimary; + + UInt8 fMaxRec; + + UInt8 fPadding; + UInt16 fPadding2; + + IOFWUserObjectExporter * fSessionRefExporter; + + /*! + @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + + struct ExpansionData { }; + + /*! + @var reserved + Reserved for future use. (Internal use only) + */ + + ExpansionData * reserved; + + virtual bool init ( + IOFireWireController * primary ); + virtual void free (void) APPLE_KEXT_OVERRIDE; + virtual IOFWDCLPool * createDCLPool ( unsigned capacity ) const APPLE_KEXT_OVERRIDE; + virtual UInt8 getMaxRec( void ) APPLE_KEXT_OVERRIDE; + + virtual UInt64 getFireWirePhysicalAddressMask( void ) APPLE_KEXT_OVERRIDE; + virtual UInt32 getFireWirePhysicalAddressBits( void ) APPLE_KEXT_OVERRIDE; + virtual UInt64 getFireWirePhysicalBufferMask( void ) APPLE_KEXT_OVERRIDE; + virtual UInt32 getFireWirePhysicalBufferBits( void ) APPLE_KEXT_OVERRIDE; + + virtual IOFWSimpleContiguousPhysicalAddressSpace * createSimpleContiguousPhysicalAddressSpace( vm_size_t size, IODirection direction ) APPLE_KEXT_OVERRIDE; + virtual IOFWSimplePhysicalAddressSpace * createSimplePhysicalAddressSpace( vm_size_t size, IODirection direction ) APPLE_KEXT_OVERRIDE; + + virtual IOFWUserObjectExporter * getSessionRefExporter( void ) APPLE_KEXT_OVERRIDE; + +private: + OSMetaClassDeclareReservedUnused(IOFireWireControllerAux, 0); + OSMetaClassDeclareReservedUnused(IOFireWireControllerAux, 1); + OSMetaClassDeclareReservedUnused(IOFireWireControllerAux, 2); + OSMetaClassDeclareReservedUnused(IOFireWireControllerAux, 3); + OSMetaClassDeclareReservedUnused(IOFireWireControllerAux, 4); + OSMetaClassDeclareReservedUnused(IOFireWireControllerAux, 5); + OSMetaClassDeclareReservedUnused(IOFireWireControllerAux, 6); + OSMetaClassDeclareReservedUnused(IOFireWireControllerAux, 7); + +}; + + +#pragma mark - + +/*! @class IOFireWireController +*/ +class IOFireWireController : public IOFireWireBus +{ + OSDeclareAbstractStructors(IOFireWireController) + +protected: + enum busState { + kStarting = 0, + kAsleep, // Link off, zzzzzz + kWaitingBusReset, + kWaitingSelfIDs, // Bus has been reset, no selfIDs yet + kWaitingScan, // Got selfIDs, waiting a bit before hitting lame devices + kScanning, // Reading node ROMs + kWaitingPrune, // Read all ROMs, pausing before pruning missing devices + kRunning, // Normal happy state, + kWaitingBusResetStart // bus reset is desired, but not yet sent to the fwim + }; + + enum ResetState + { + kResetStateResetting, + kResetStateDisabled, + kResetStateArbitrated + }; + + enum + { + kDisablePhysicalAccess = (1 << 0) + }; + + struct timeoutQ: public IOFWCmdQ + { + IOTimerEventSource *fTimer; + virtual void headChanged(IOFWCommand *oldHead); + void busReset(); + }; + + struct pendingQ: public IOFWCmdQ + { + IOFWQEventSource *fSource; + virtual void headChanged(IOFWCommand *oldHead); + }; + + friend class IOFireWireLink; + friend class IOFireWireDevice; + friend class IOFireWireDeviceAux; + friend class IOFWAddressSpace; + friend class IOFWAddressSpaceAux; + friend class IOFWPseudoAddressSpace; + friend class IOFireWireSBP2ORB; + friend class IOFireWireSBP2Login; + friend class IOFWLocalIsochPort; + friend class IOFWCommand; + friend class IOFireWireUnit; + friend class IOFireWirePCRSpace; + friend class IOFireWireROMCache; + friend class IOFWAsyncStreamCommand; + friend class IOFireWireAVCLocalUnit; + friend class IOFireWireAVCUnit; + friend class IOFireWireAVCCommand; + friend class IOFireWirePowerManager; + friend class IOFWWriteQuadCommand; + friend class IOFWWriteCommand; + friend class IOFWCompareAndSwapCommand; + friend class IOFWAsyncCommand; + friend class IOFireWireAVCTargetSpace; + friend class AppleFWOHCI; + friend class IOFireWireNub; + friend class IOFWAsyncStreamListener; + friend class IOFireWireLocalNode; + friend class IOFireWireIRMAllocation; + friend class IOFWUserVectorCommand; + friend class IOFWAsyncPHYCommand; + friend class IOFWUserPHYPacketListener; + friend class IOFWAsyncStreamReceiver; + friend class IOFireWireUserClient; + +#if FIRELOGCORE + friend class IOFireLog; +#endif + + IOFireWireLink * fFWIM; + IOFWWorkLoop * fWorkLoop; + IOTimerEventSource * fTimer; + OSSet * fLocalAddresses; // Collection of local adress spaces + OSIterator * fSpaceIterator; // Iterator over local addr spaces + + OSSet * fAllocatedChannels; // Need to be informed of bus resets + OSIterator * fAllocChannelIterator; // Iterator over channels + + OSSet * fIRMAllocations; // Need to be informed of bus resets + OSIterator * fIRMAllocationsIterator; // Iterator over channels + OSSet * fIRMAllocationsAllocated; // Need to be informed of bus resets + + // Bus management variables (although we aren't a FireWire Bus Manager...) + AbsoluteTime fResetTime; // Time of last reset + UInt32 fBusGeneration; // ID of current bus topology. + UInt16 fLocalNodeID; // ID of local node, ie. this computer + UInt16 fRootNodeID; // ID of root, ie. highest node id in use. + UInt16 fIRMNodeID; // ID of Isochronous resource manager, or kFWBadNodeID + bool fBusMgr; // true if at least one node is bus manager capable + IORegistryEntry * fNodes[kFWMaxNodesPerBus]; // FireWire nodes on this bus + UInt32 * fNodeIDs[kFWMaxNodesPerBus+1]; // Pointer to SelfID list for each node + // +1 so we know how many selfIDs the last node has + + UInt32 fGapCount; // What we think the gap count should be + //UInt8 fSpeedCodes[(kFWMaxNodesPerBus+1)*kFWMaxNodesPerBus]; + UInt8 fSpeedVector[((kFWMaxNodesPerBus+1)*kFWMaxNodesPerBus)/2]; + // Max speed between two nodes + busState fBusState; // Which state are we in? + int fNumROMReads; // Number of device ROMs we are still reading + // SelfIDs + int fNumSelfIDs; // Total number of SelfID packets + UInt32 fSelfIDs[kMaxSelfIDs*kFWMaxNodesPerBus]; + + // The local device's Config ROM + UInt32 fROMHeader[5]; // More or less fixed header and bus info block + IOLocalConfigDirectory * fRootDir; // Local Config ROM root directory. + + // log base 2 of maximum packet size the FWIM can send/receive + // Normally calculated from bus info block. + int fMaxSendLog; + int fMaxRecvLog; + + IOFWAddressSpace * fROMAddrSpace; + IOMemoryDescriptor * fBadReadResponse; // Send back easily identified bad data to out of range addrs. + + // Array for outstanding requests (up to 64) + AsyncPendingTrans fTrans[kMaxPendingTransfers]; + int fLastTrans; + + // queue for executing commands that may timeout + timeoutQ fTimeoutQ; + + // queue for commands that can't execute yet + pendingQ fPendingQ; + + // queue for async commands interrupted by bus reset + IOFWCmdQ fAfterResetHandledQ; + + // Command to change bus state after a delay. + IOFWDelayCommand * fDelayedStateChangeCmd; + bool fDelayedStateChangeCmdNeedAbort; + + UInt32 fDelayedPhyPacket; + bool fBusResetScheduled; + ResetState fBusResetState; + IOFWDelayCommand * fBusResetStateChangeCmd; + UInt32 fBusResetDisabledCount; + +#if FIRELOGCORE + IOFireLogPublisher * fFireLogPublisher; +#else + void * fFireLogPublisher; +#endif + + OSData * fAllocatedAddresses; + + UInt32 fDevicePruneDelay; + + IOFWPhysicalAccessMode fPhysicalAccessMode; + IOFWSecurityMode fSecurityMode; + IONotifier * fKeyswitchNotifier; + + IOFireWireIRM * fIRM; + IOFireWirePowerManager * fBusPowerManager; + + bool fGapCountMismatch; + + bool fUseHalfSizePackets; + bool fRequestedHalfSizePackets; + + IOFWNodeScan * fScans[kFWMaxNodesPerBus]; + IOFireWireDuplicateGUIDList * fGUIDDups; + + bool fDelegateCycleMaster; + bool fBadIRMsKnown; + + UInt32 fPreviousGap; + + UInt32 fOutOfTLabels; + UInt32 fOutOfTLabels10S; + UInt32 fOutOfTLabelsThreshold; + +#ifdef LEGACY_SHUTDOWN + IONotifier * fPowerEventNotifier; +#endif + + bool fStarted; + + UInt32 fIOCriticalSectionCount; + UInt32 fHubPort; + UInt32 fDebugIgnoreNode; + + OSSet * fLocalAsyncStreamReceivers; + OSIterator * fAsyncStreamReceiverIterator; + + bool fInstantiated; + + IOReturn fStartStatus; + UInt32 fWaitingForSelfID; + + UInt32 fForcedRootNodeID; + bool fNodeMustBeRootFlag; + bool fNodeMustNotBeRootFlag; + + UInt32 fForcedGapCount; + bool fForcedGapFlag; + + OSSet * fPHYPacketListeners; + OSIterator * fPHYPacketListenersIterator; + + bool fDSLimited; + + IONotifier * fConsoleLockNotifier; + IOFireWireLocalNode * fLocalNode; + +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + struct ExpansionData { }; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + + static void clockTick(OSObject *, IOTimerEventSource *); + static void readROMGlue(void *refcon, IOReturn status, + IOFireWireNub *device, IOFWCommand *fwCmd); + static void delayedStateChange(void *refcon, IOReturn status, + IOFireWireBus *bus, IOFWBusCommand *fwCmd); + + virtual void processBusReset(); + virtual void processSelfIDs(UInt32 *IDs, int numIDs, UInt32 *ownIDs, int numOwnIDs); + virtual void processTimeout(IOTimerEventSource *src); + virtual void processRcvPacket( UInt32 *data, int numQuads, IOFWSpeed speed ); + virtual void processWriteRequest(UInt16 sourceID, UInt32 tlabel, + UInt32 *hdr, void *buf, int len, IOFWSpeed speed); + virtual void processLockRequest(UInt16 sourceID, UInt32 tlabel, + UInt32 *hdr, void *buf, int len, IOFWSpeed speed); + + // Process read from a local address, return rcode + virtual UInt32 doReadSpace(UInt16 nodeID, IOFWSpeed &speed, FWAddress addr, UInt32 len, + IOMemoryDescriptor **buf, IOByteCount * offset, IODMACommand **dma_command, + IOFWRequestRefCon refcon); + + // Process write to a local address, return rcode + virtual UInt32 doWriteSpace(UInt16 nodeID, IOFWSpeed &speed, FWAddress addr, UInt32 len, + const void *buf, IOFWRequestRefCon refcon); + + // Process lock to a local address, return rcode + UInt32 doLockSpace(UInt16 nodeID, IOFWSpeed &speed, FWAddress addr, UInt32 inlen, + const UInt32 *newVal, UInt32 &outLen, UInt32 *oldVal, + UInt32 extType, IOFWRequestRefCon refcon); + + virtual void updatePlane(); + virtual void startBusScan(); + + // Called when all devices on bus have been examined + virtual void finishedBusScan(); + + virtual void buildTopology(bool doFWPlane); + + virtual void readDeviceROM(IOFWNodeScan *refCon, IOReturn status); + + virtual IOReturn UpdateROM(); + virtual IOReturn allocAddress(IOFWAddressSpace *space); + virtual void freeAddress(IOFWAddressSpace *space); + + IOFireWireBusAux * createAuxiliary( void ) APPLE_KEXT_OVERRIDE; + +public: + + // Initialization + virtual bool init(IOFireWireLink *fwim); + virtual void free(void) APPLE_KEXT_OVERRIDE; + virtual bool start(IOService *provider) APPLE_KEXT_OVERRIDE; + virtual void stop( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual bool finalize( IOOptionBits options ) APPLE_KEXT_OVERRIDE; + virtual bool requestTerminate( IOService * provider, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + + // Power management + virtual IOReturn setPowerState ( unsigned long powerStateOrdinal, IOService* whatDevice ) APPLE_KEXT_OVERRIDE; + + // Implement IOService::getWorkLoop + virtual IOWorkLoop *getWorkLoop() const APPLE_KEXT_OVERRIDE; + + // Allocate struct for tracking a transaction + virtual AsyncPendingTrans *allocTrans(IOFWAsyncCommand *cmd=NULL); + virtual void freeTrans(AsyncPendingTrans *trans); + + // Really public methods + + virtual IOReturn getCycleTime(UInt32 &cycleTime) APPLE_KEXT_OVERRIDE; + virtual IOReturn getBusCycleTime(UInt32 &busTime, UInt32 &cycleTime) APPLE_KEXT_OVERRIDE; + + // Methods to manipulate the local Config ROM + virtual IOReturn AddUnitDirectory(IOLocalConfigDirectory *unitDir) APPLE_KEXT_OVERRIDE; + virtual IOReturn RemoveUnitDirectory(IOLocalConfigDirectory *unitDir) APPLE_KEXT_OVERRIDE; + + // Cause a bus reset + virtual IOReturn resetBus(void) APPLE_KEXT_OVERRIDE; + + // Send async request packets + virtual IOReturn asyncRead( UInt32 generation, + UInt16 nodeID, + UInt16 addrHi, + UInt32 addrLo, + int speed, + int label, + int size, + IOFWAsyncCommand * cmd ); + + virtual IOReturn asyncWrite( UInt32 generation, + UInt16 nodeID, + UInt16 addrHi, + UInt32 addrLo, + int speed, + int label, + IOMemoryDescriptor * buf, + IOByteCount offset, + int size, + IOFWAsyncCommand * cmd ); + + /* DEPRECATED */ virtual IOReturn asyncWrite( UInt32 generation, + /* DEPRECATED */ UInt16 nodeID, + /* DEPRECATED */ UInt16 addrHi, + /* DEPRECATED */ UInt32 addrLo, + /* DEPRECATED */ int speed, + /* DEPRECATED */ int label, + /* DEPRECATED */ void * data, + /* DEPRECATED */ int size, + /* DEPRECATED */ IOFWAsyncCommand * cmd ); + + /* DEPRECATED */ virtual IOReturn asyncLock( UInt32 generation, + /* DEPRECATED */ UInt16 nodeID, + /* DEPRECATED */ UInt16 addrHi, + /* DEPRECATED */ UInt32 addrLo, + /* DEPRECATED */ int speed, + /* DEPRECATED */ int label, + /* DEPRECATED */ int type, + /* DEPRECATED */ void * data, + /* DEPRECATED */ int size, + /* DEPRECATED */ IOFWAsyncCommand * cmd); + + + // Send async read response packets + // useful for pseudo address spaces that require servicing outside the FireWire work loop. + virtual IOReturn asyncReadResponse( UInt32 generation, + UInt16 nodeID, + int speed, + IOMemoryDescriptor * buf, + IOByteCount offset, + int len, + IOFWRequestRefCon refcon ); + + virtual IOReturn asyncLockResponse( UInt32 generation, + UInt16 nodeID, + int speed, + IOMemoryDescriptor * buf, + IOByteCount offset, + int len, + IOFWRequestRefCon refcon ); + + // Try to fix whatever might have caused the other device to not respond + virtual IOReturn handleAsyncTimeout(IOFWAsyncCommand *cmd); + + // Convert a firewire nodeID into the IOFireWireDevice for it + virtual IOFireWireDevice * nodeIDtoDevice(UInt32 generation, UInt16 nodeID) APPLE_KEXT_OVERRIDE; + + // Add/remove a channel from the list informed of bus resets + virtual void addAllocatedChannel(IOFWIsochChannel *channel); + virtual void removeAllocatedChannel(IOFWIsochChannel *channel); + + // Add/remove a IRM allocation from the list informed of bus resets + virtual void addIRMAllocation(IOFireWireIRMAllocation *irmAllocation); + virtual void removeIRMAllocation(IOFireWireIRMAllocation *irmAllocation); + + // Create an Isochronous Channel object + // doIRM = true => allocate channel and bandwith in Isochronous Resource Manager + // packetSize packet size (in bytes), used to calculate bandwidth needed. + virtual IOFWIsochChannel *createIsochChannel( + bool doIRM, UInt32 packetSize, IOFWSpeed prefSpeed, + FWIsochChannelForceStopNotificationProc stopProc=NULL, + void *stopRefCon=NULL) APPLE_KEXT_OVERRIDE; + + // Create a local isochronous port to run the given DCL program + // if task is 0, the DCL program is for the kernel task, + // otherwise all DCL pointers are valid in the specified task. + // opcodes is also pointer valid in the specified task. + virtual IOFWLocalIsochPort *createLocalIsochPort(bool talking, + DCLCommand* opcodes, DCLTaskInfo *info = 0, + UInt32 startEvent = 0, UInt32 startState = 0, UInt32 startMask = 0) APPLE_KEXT_OVERRIDE; + + // Execute specified function on workloop after specified delay + // Returned command is for delay, call it's cancel() function to cancel timeout. + virtual IOFWDelayCommand * createDelayedCmd(UInt32 uSecDelay, FWBusCallback func, void *refcon) APPLE_KEXT_OVERRIDE; + + virtual IOFWPhysicalAddressSpace *createPhysicalAddressSpace(IOMemoryDescriptor *mem) APPLE_KEXT_OVERRIDE; + virtual IOFWPseudoAddressSpace *createPseudoAddressSpace(FWAddress *addr, UInt32 len, + FWReadCallback reader, FWWriteCallback writer, void *refcon) APPLE_KEXT_OVERRIDE; + + // Extract info about the async request + virtual bool isLockRequest(IOFWRequestRefCon refcon) APPLE_KEXT_OVERRIDE; + virtual bool isQuadRequest(IOFWRequestRefCon refcon) APPLE_KEXT_OVERRIDE; + virtual UInt32 getExtendedTCode(IOFWRequestRefCon refcon) APPLE_KEXT_OVERRIDE; + + // Inline accessors for protected member variables + IOFWCmdQ &getTimeoutQ(); + IOFWCmdQ &getPendingQ(); + IOFWCmdQ &getAfterResetHandledQ(); + IOFireWireLink * getLink() const; + + IOLocalConfigDirectory *getRootDir() const; + bool checkGeneration(UInt32 gen) const; + UInt32 getGeneration() const; + UInt16 getLocalNodeID() const; + IOReturn getIRMNodeID(UInt32 &generation, UInt16 &id); + + const AbsoluteTime * getResetTime() const; + + IOFWSpeed FWSpeed(UInt16 nodeAddress) const; + IOFWSpeed FWSpeed(UInt16 nodeA, UInt16 nodeB) const; + + // How big (as a power of two) can packets sent to/received from the node be? + virtual int maxPackLog(bool forSend, UInt16 nodeAddress) const APPLE_KEXT_OVERRIDE; + + // How big (as a power of two) can packets sent from A to B be? + virtual int maxPackLog(UInt16 nodeA, UInt16 nodeB) const APPLE_KEXT_OVERRIDE; + + // Force given node to be root (via root holdoff Phy packet) + virtual IOReturn makeRoot(UInt32 generation, UInt16 nodeID) APPLE_KEXT_OVERRIDE; + + virtual IOFWPseudoAddressSpace *createInitialAddressSpace(UInt32 addressLo, UInt32 len, + FWReadCallback reader, FWWriteCallback writer, void *refcon) APPLE_KEXT_OVERRIDE; + + virtual IOFWAddressSpace *getAddressSpace(FWAddress address) APPLE_KEXT_OVERRIDE; + + // Extract info about the async request - was the request ack'ed complete already? + virtual bool isCompleteRequest(IOFWRequestRefCon refcon) APPLE_KEXT_OVERRIDE; + + // Are we currently scanning the bus? + bool scanningBus() const; + +protected: + + void openGate(); + void closeGate(); + +protected: + virtual void doBusReset( void ); + static void resetStateChange( void *refcon, IOReturn status, + IOFireWireBus *bus, IOFWBusCommand *fwCmd); + +public: + virtual IOReturn disableSoftwareBusResets( void ); + virtual void enableSoftwareBusResets( void ); + + virtual IOFWAsyncStreamCommand * createAsyncStreamCommand( UInt32 generation, + UInt32 channel, UInt32 sync, UInt32 tag, IOMemoryDescriptor *hostMem, + UInt32 size, int speed,FWAsyncStreamCallback completion, void *refcon) APPLE_KEXT_OVERRIDE; + + virtual IOReturn asyncStreamWrite(UInt32 generation, + int speed, int tag, int sync, int channel, + IOMemoryDescriptor *buf, IOByteCount offset, + int size, IOFWAsyncStreamCommand *cmd); + +protected: + bool inGate(); + + virtual IOReturn allocatePseudoAddress(FWAddress *addr, UInt32 lenDummy); + virtual void freePseudoAddress(FWAddress addr, UInt32 lenDummy); + + virtual IORegistryEntry * createDummyRegistryEntry( IOFWNodeScan *scan ); + + static IOFireWireLocalNode * getLocalNode(IOFireWireController *control); + + virtual void setPhysicalAccessMode( IOFWPhysicalAccessMode mode ); + virtual IOFWPhysicalAccessMode getPhysicalAccessMode( void ); + virtual void physicalAccessProcessBusReset( void ); + virtual void setNodeIDPhysicalFilter( UInt16 nodeID, bool state ); + + virtual void initSecurity( void ); + virtual void freeSecurity( void ); + static bool serverKeyswitchCallback( void * target, void * refCon, IOService * service, IONotifier * notifier ); + virtual void setSecurityMode( IOFWSecurityMode mode ); + virtual IOFWSecurityMode getSecurityMode( void ); + + virtual IOReturn createTimeoutQ( void ); + virtual void destroyTimeoutQ( void ); + virtual IOReturn createPendingQ( void ); + virtual void destroyPendingQ( void ); + + virtual UInt32 countNodeIDChildren( UInt16 nodeID, int hub_port = 0, int * hubChildRemainder = NULL, bool * hubParentFlag = NULL ); + +public: + virtual UInt32 hopCount(UInt16 nodeAAddress, UInt16 nodeBAddress ) APPLE_KEXT_OVERRIDE; + virtual UInt32 hopCount(UInt16 nodeAAddress ) APPLE_KEXT_OVERRIDE; + + virtual IOFireWirePowerManager * getBusPowerManager( void ) APPLE_KEXT_OVERRIDE; + +protected: + virtual void handleARxReqIntComplete(); + + virtual IOReturn asyncLock( UInt32 generation, + UInt16 nodeID, + UInt16 addrHi, + UInt32 addrLo, + int speed, + int label, + int type, + IOMemoryDescriptor * buf, + IOByteCount offset, + int size, + IOFWAsyncCommand * cmd ); + + virtual IOReturn asyncWrite( UInt32 generation, + UInt16 nodeID, + UInt16 addrHi, + UInt32 addrLo, + int speed, + int label, + IOMemoryDescriptor * buf, + IOByteCount offset, + int size, + IOFWAsyncCommand * cmd, + IOFWWriteFlags flags ); + +protected: + bool delayedStateCommandInUse() const; + void enterBusResetDisabledState( ); + + virtual UInt32 getPortNumberFromIndex( UInt16 index ); + + virtual bool checkForDuplicateGUID(IOFWNodeScan *scan, CSRNodeUniqueID *currentGUIDs ); + virtual void updateDevice(IOFWNodeScan *scan ); + virtual bool AssignCycleMaster(); + +public: + + IOReturn clipMaxRec2K(Boolean clipMaxRec ); + void setNodeSpeed( UInt16 nodeAddress, IOFWSpeed speed ); + void useHalfSizePackets( void ); + void disablePhyPortOnSleepForNodeID( UInt32 nodeID ); + + IOReturn handleAsyncCompletion( IOFWCommand *cmd, IOReturn status ); + void processCycle64Int(); + +#ifdef LEGACY_SHUTDOWN + static IOReturn systemShutDownHandler( void * target, void * refCon, + UInt32 messageType, IOService * service, + void * messageArgument, vm_size_t argSize ); +#else + virtual void systemWillShutdown( IOOptionBits specifier ) APPLE_KEXT_OVERRIDE; +#endif + + IOReturn beginIOCriticalSection( void ); + void endIOCriticalSection( void ); + +protected: + IOReturn poweredStart( void ); + void setNodeSpeed( UInt16 nodeA, UInt16 nodeB, UInt8 speed ); + void setNodeSpeed( UInt16 nodeAddress, UInt8 speed ); + +public: + bool isPhysicalAccessEnabledForNodeID( UInt16 nodeID ); + + // Allocate IRM bandwidth if the specified generation is the current FireWire generation. + IOReturn allocateIRMBandwidthInGeneration(UInt32 bandwidthUnits, UInt32 generation) ; + + // Release IRM bandwidth if the specified generation is the current FireWire generation. + IOReturn releaseIRMBandwidthInGeneration(UInt32 bandwidthUnits, UInt32 generation) ; + + // Allocate IRM channel if the specified generation is the current FireWire generation. + IOReturn allocateIRMChannelInGeneration(UInt8 isochChannel, UInt32 generation) ; + + // Release IRM channel if the specified generation is the current FireWire generation. + IOReturn releaseIRMChannelInGeneration(UInt8 isochChannel, UInt32 generation) ; + + // Create an IOFireWireIRMAllocation object which can be used to allocate isoch resources that are automatically reallocated after bus-resets! + IOFireWireIRMAllocation *createIRMAllocation(Boolean releaseIRMResourcesOnFree = true, + IOFireWireIRMAllocation::AllocationLostNotificationProc allocationLostProc = NULL, + void *pLostNotificationProcRefCon = NULL); + + IOFWAsyncStreamListener *createAsyncStreamListener( UInt32 channel, FWAsyncStreamReceiveCallback proc, void *refcon ); + + void removeAsyncStreamListener( IOFWAsyncStreamListener *listener ); + + IOFWSpeed getBroadcastSpeed(){ return FWSpeed( fLocalNodeID ); }; + +private: + + IOFWAsyncStreamReceiver *allocAsyncStreamReceiver( UInt32 channel, FWAsyncStreamReceiveCallback proc, void *refcon ); + + IOFWAsyncStreamReceiver *getAsyncStreamReceiver( UInt32 channel ); + + void freeAllAsyncStreamReceiver(); + + void activateAsyncStreamReceivers(); + + void deactivateAsyncStreamReceivers(); + +protected: + IOService *findKeyswitchDevice( void ); + void suspendBus( void ); + +public: + virtual IOReturn asyncRead( UInt32 generation, + UInt16 nodeID, + UInt16 addrHi, + UInt32 addrLo, + int speed, + int label, + int size, + IOFWAsyncCommand * cmd, + IOFWReadFlags flags ); + + void checkProgress( void ); + + void terminateDevice( IOFireWireDevice * device ); + + void nodeMustBeRoot( UInt32 nodeID ); + + void nodeMustNotBeRoot( UInt32 nodeID ); + + void setGapCount( UInt32 gapCount ); + + IOReturn asyncPHYPacket( UInt32 generation, + UInt32 data, + UInt32 data2, + IOFWAsyncPHYCommand * cmd ); + + IOFWAsyncPHYCommand * createAsyncPHYCommand( UInt32 generation, + UInt32 data1, + UInt32 data2, + FWAsyncPHYCallback completion, + void * refcon, + bool failOnReset ); + +private: + AsyncPendingTrans * allocTrans( IOFWAsyncCommand * cmd, IOFWCommand * altcmd ); + +public: + + IOReturn activatePHYPacketListener( IOFWPHYPacketListener * listener ); + void deactivatePHYPacketListener( IOFWPHYPacketListener * listener ); + + IOFWPHYPacketListener * createPHYPacketListener( FWPHYPacketCallback proc, void * refcon ); + +private: + void processPHYPacket( UInt32 data1, UInt32 data2 ); + void enterLoggingMode( void ); + +public: + IOReturn getCycleTimeAndUpTime( UInt32 &cycleTime, UInt64 &uptime ); + +protected: + void removeAsyncStreamReceiver( IOFWAsyncStreamReceiver *receiver ); + +public: + + // Create a multi-isoch-receive listener + IOFireWireMultiIsochReceiveListener * createMultiIsochReceiveListener(UInt32 channel, + FWMultiIsochReceiveListenerCallback callback, + void *pCallbackRefCon, + FWMultiIsochReceiveListenerParams *pListenerParams = NULL); + + // Activate a multi-isoch-receive listener + IOReturn activateMultiIsochReceiveListener(IOFireWireMultiIsochReceiveListener *pListener); + + // Deactivate a multi-isoch-receive listener + IOReturn deactivateMultiIsochReceiveListener(IOFireWireMultiIsochReceiveListener *pListener); + + // Call for client to specify he is done with a multi-isoch receiver isoch packet + void clientDoneWithMultiIsochReceivePacket(IOFireWireMultiIsochReceivePacket *pPacket); + +public: + virtual IOFWAsyncStreamCommand * createAsyncStreamCommand( UInt32 generation, + UInt32 channel, UInt32 sync, UInt32 tag, IOMemoryDescriptor *hostMem, + UInt32 size, int speed,FWAsyncStreamCallback completion, void *refcon, bool failOnReset) APPLE_KEXT_OVERRIDE; + +private: + void addToIRMAllocationSet(IOFireWireIRMAllocation *anObject); + void removeFromIRMAllocationSet(IOFireWireIRMAllocation *anObject); + + static IOReturn consoleLockInterestHandler( void * target, void * refCon, + UInt32 messageType, IOService * provider, + void * messageArgument, vm_size_t argSize ); + +protected: + OSMetaClassDeclareReservedUnused(IOFireWireController, 0); + OSMetaClassDeclareReservedUnused(IOFireWireController, 1); + OSMetaClassDeclareReservedUnused(IOFireWireController, 2); + OSMetaClassDeclareReservedUnused(IOFireWireController, 3); + OSMetaClassDeclareReservedUnused(IOFireWireController, 4); + OSMetaClassDeclareReservedUnused(IOFireWireController, 5); + OSMetaClassDeclareReservedUnused(IOFireWireController, 6); + OSMetaClassDeclareReservedUnused(IOFireWireController, 7); + OSMetaClassDeclareReservedUnused(IOFireWireController, 8); + +}; + +#endif /* ! _IOKIT_IOFIREWIRECONTROLLER_H */ diff --git a/QualcommWireless/include/IOKit/firewire/IOFireWireDevice.h b/QualcommWireless/include/IOKit/firewire/IOFireWireDevice.h new file mode 100644 index 0000000..9bf07f4 --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFireWireDevice.h @@ -0,0 +1,289 @@ +/* + * Copyright (c) 1998-2002 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + /*! @header + This header contains the definition of the IOFireWireDevice and IOFireWireDeviceAux classes. + An IOFireWireDevice object represents a FireWire device in the I/O Registry. + It is strongly recommended that you write applications that access FireWire devices rather than in-kernel device drivers. + For more information on how to do this, see {@linkdoc //apple_ref/doc/uid/TP40000969 FireWire Device Interface Guide}. + @indexgroup FireWire + */ +#ifndef _IOKIT_IOFIREWIREDEVICE_H +#define _IOKIT_IOFIREWIREDEVICE_H + +#include + +class IOFireWireROMCache; + +struct IOFWNodeScan; +struct RomScan; + +class IOFireWireDevice; + +#pragma mark - + +/*! @class IOFireWireDeviceAux + @discussion An IOFireWireDeviceAux is for internal use only. You should never subclass IOFireWireDeviceAux +*/ + +class IOFireWireDeviceAux : public IOFireWireNubAux +{ + OSDeclareDefaultStructors(IOFireWireDeviceAux) + + friend class IOFireWireDevice; + +protected: + + UInt32 fUnitCount; + IOFWSpeed fMaxSpeed; + OSSet * fOpenUnitSet; + AbsoluteTime fResumeTime; + + /*! + @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + + struct ExpansionData { }; + + /*! + @var reserved + Reserved for future use. (Internal use only) + */ + + ExpansionData * reserved; + + virtual bool init( IOFireWireDevice * primary ); + + virtual void free(void) APPLE_KEXT_OVERRIDE; + + virtual bool isTerminated( void ); + + virtual void setTerminationState( TerminationState state ) APPLE_KEXT_OVERRIDE; + + void setMaxSpeed( IOFWSpeed speed ); + + void setUnitCount( UInt32 count ); + + UInt32 getUnitCount( void ); + + bool isPhysicalAccessEnabled( void ) APPLE_KEXT_OVERRIDE; + + virtual IOFWSimpleContiguousPhysicalAddressSpace * createSimpleContiguousPhysicalAddressSpace( vm_size_t size, IODirection direction ) APPLE_KEXT_OVERRIDE; + + virtual IOFWSimplePhysicalAddressSpace * createSimplePhysicalAddressSpace( vm_size_t size, IODirection direction ) APPLE_KEXT_OVERRIDE; + + OSSet * getOpenUnitSet() const; + + void latchResumeTime( void ); + + AbsoluteTime getResumeTime( void ); + +private: + OSMetaClassDeclareReservedUnused(IOFireWireDeviceAux, 0); + OSMetaClassDeclareReservedUnused(IOFireWireDeviceAux, 1); + OSMetaClassDeclareReservedUnused(IOFireWireDeviceAux, 2); + OSMetaClassDeclareReservedUnused(IOFireWireDeviceAux, 3); +}; + +#pragma mark - +/*! @class IOFireWireDevice + @abstract Represents a FireWire device. + @discussion The FireWire family tries to read the configuration ROM of each device on the FireWire bus. For each device that responds with + its bus information block, the FireWire family publishes an IOFireWireDevice object in the I/O Registry. An + IOFireWireDevice object keeps track of the device's node ID, copies config ROM properties into the object's property + list, and scans the config ROM for unit directories, publishing an IOFireWireUnit object for each unit directory it finds. +*/ + +class IOFireWireDevice : public IOFireWireNub +{ + OSDeclareDefaultStructors(IOFireWireDevice) + + friend class IOFireWireController; + friend class IOFireWireDeviceAux; + +protected: + + enum RegistrationState + { + kDeviceRegistered, + kDeviceNeedsRegisterService, + kDeviceNotRegistered + }; + + IOFireWireROMCache *fDeviceROM; + bool fOpenFromDevice; + UInt32 fOpenFromUnitCount; + UInt32 fROMGeneration; + IORecursiveLock *fROMLock; + RegistrationState fRegistrationState; + UInt32 fROMReadRetry; + +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + struct ExpansionData { }; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + + static void readROMDirGlue(void *refcon, IOReturn status, + IOFireWireNub *device, IOFWCommand *fwCmd); + static void readROMThreadFunc(void *arg); + + static void terminateDevice(void *arg); + + void processROM(RomScan *romScan); + + virtual void free(); + +public: + virtual IOReturn message( UInt32 type, IOService * provider, void * argument ) APPLE_KEXT_OVERRIDE; + + virtual bool handleOpen( IOService * forClient, IOOptionBits options, void * arg ) APPLE_KEXT_OVERRIDE; + + virtual void handleClose( IOService * forClient, IOOptionBits options ); + + virtual bool handleIsOpen( const IOService * forClient ) const APPLE_KEXT_OVERRIDE; + +protected: + virtual IOReturn cacheROM(OSData *rom, UInt32 offset, const UInt32 *&romBase); + + virtual const UInt32 * getROMBase(); + + virtual void setNodeROM(UInt32 generation, UInt16 localNodeID, const IOFWNodeScan *info); + +public: + virtual bool matchPropertyTable(OSDictionary * table) APPLE_KEXT_OVERRIDE; + + /*! @function init + @abstract Initializes the nub. + @param propTable Property table passed to the standard nub initialization. + @param scan Pointer to the node scan structure. + @result Returns true if initialization was successful; false otherwise. + */ + virtual bool init(OSDictionary * propTable, const IOFWNodeScan *scan); + + virtual bool attach(IOService * provider ) APPLE_KEXT_OVERRIDE; + + virtual bool finalize( IOOptionBits options ) APPLE_KEXT_OVERRIDE; + + /*! @function setNodeFlags + @abstract Sets the node's characteristics. + @param flags Refer to "node flags" in IOFireWireFamilyCommon.h. + */ + virtual void setNodeFlags( UInt32 flags ) APPLE_KEXT_OVERRIDE; + + /*! @function clearNodeFlags + @abstract Resets the node's characteristics. + @param flags Refer to "node flags" in IOFireWireFamilyCommon.h. + */ + virtual void clearNodeFlags( UInt32 flags ) APPLE_KEXT_OVERRIDE; + + /*! @function getNodeFlags + @abstract Retrieves the node's characteristics. + @param flags Refer to "node flags" in IOFireWireFamilyCommon.h. + @result UInt32 The flags set for a particular node. + */ + virtual UInt32 getNodeFlags( void ) APPLE_KEXT_OVERRIDE; + +protected: + virtual IOReturn configureNode( void ); + +public: + /*! @function createPhysicalAddressSpace + @abstract Creates local physical FireWire address spaces for the device to access. + @param mem Memory area allocated to back the physical access by Link hardware. + @result A valid IOFWPhysicalAddressSpace object on success; NULL on failure. + */ + virtual IOFWPhysicalAddressSpace *createPhysicalAddressSpace(IOMemoryDescriptor *mem) APPLE_KEXT_OVERRIDE; + + /*! @function createPseudoAddressSpace + @abstract Creates local pseudo FireWire address spaces for the device to access. + @param addr The FireWire address that is mapped to the pseudo address access. + @param len Size of the address space to allocate. + @param reader Read callback, when the device reads from this address space. + @param writer Write callback, when the device writes to this address space. + @param refcon Client's callback object returned during reader/writer callbacks. + @result A valid IOFWPseudoAddressSpace object on success; NULL on failure. + */ + virtual IOFWPseudoAddressSpace *createPseudoAddressSpace(FWAddress *addr, UInt32 len, + FWReadCallback reader, FWWriteCallback writer, void *refcon) APPLE_KEXT_OVERRIDE; + +protected: + virtual IOReturn readRootDirectory( IOConfigDirectory * directory, OSDictionary * propTable ); + + virtual IOReturn processRootDirectory( OSDictionary * propTable ); + + virtual IOReturn readUnitDirectories( IOConfigDirectory * directory, OSSet * unitInfo ); + + virtual IOReturn processUnitDirectories( OSSet * unitSet ); + + virtual void setRegistrationState( RegistrationState fRegistrationState ); + + virtual void preprocessDirectories( OSDictionary * rootPropTable, OSSet * unitSet ); + + virtual void configurePhysicalFilter( void ); + +protected: + virtual IOFireWireNubAux * createAuxiliary( void ) APPLE_KEXT_OVERRIDE; + +public: + inline bool isTerminated( void ) + { return ((IOFireWireDeviceAux*)fAuxiliary)->isTerminated(); } + + /*! @function setMaxSpeed + @abstract Sets the maximum speed for this node. + @param speed Maximum speed. Refer to "bus speed numbers" in IOFireWireFamilyCommon.h. + */ + inline void setMaxSpeed( IOFWSpeed speed ) + { ((IOFireWireDeviceAux*)fAuxiliary)->setMaxSpeed( speed ); } + +protected: + inline void setUnitCount( UInt32 count ) + { ((IOFireWireDeviceAux*)fAuxiliary)->setUnitCount( count ); } + + inline OSSet * getOpenUnitSet( void ) const + { return ((IOFireWireDeviceAux*)fAuxiliary)->getOpenUnitSet(); } + +public: + /*! @function getUnitCount + @abstract Returns number of units attached to this device. + @result UInt32 The number of units attached to this device. + */ + inline UInt32 getUnitCount( void ) + { return ((IOFireWireDeviceAux*)fAuxiliary)->getUnitCount(); } + +protected: + inline AbsoluteTime getResumeTime( void ) + { return ((IOFireWireDeviceAux*)fAuxiliary)->getResumeTime(); } + + inline void latchResumeTime( void ) + { ((IOFireWireDeviceAux*)fAuxiliary)->latchResumeTime(); } + +private: + OSMetaClassDeclareReservedUnused(IOFireWireDevice, 0); + OSMetaClassDeclareReservedUnused(IOFireWireDevice, 1); + +}; + +#endif /* ! _IOKIT_IOFIREWIREDEVICE_H */ diff --git a/QualcommWireless/include/IOKit/firewire/IOFireWireFamilyCommon.h b/QualcommWireless/include/IOKit/firewire/IOFireWireFamilyCommon.h new file mode 100644 index 0000000..702759f --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFireWireFamilyCommon.h @@ -0,0 +1,1232 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * IOFireWireFamilyCommon.h + * IOFireWireUserClient/IOFireWireFamily + * + * Created by NWG on Fri Apr 28 2000. + * Copyright (c) 2000-2001 Apple Computer, Inc. All rights reserved. + * + */ +/* + $Log: not supported by cvs2svn $ + Revision 1.78 2008/05/08 02:33:22 collin + more K64 + + Revision 1.77 2008/04/24 00:01:39 collin + more K640 + + Revision 1.76 2007/12/05 04:52:08 collin + integrate chex workaround + + Revision 1.75 2007/08/31 20:29:06 collin + fixed 5437835 + + Revision 1.74 2007/04/24 21:40:23 arulchan + headerdoc changes + + Revision 1.73 2007/04/24 21:28:24 arulchan + changes for headerdoc + + Revision 1.72 2007/04/13 19:37:01 calderon + Integrated FireWireKPrintf implemented + + Revision 1.71 2007/03/14 18:41:43 collin + *** empty log message *** + + Revision 1.70 2007/02/28 23:10:13 ayanowit + Another IRMAllocation fix. + + Revision 1.69 2007/02/20 01:25:28 collin + *** empty log message *** + + Revision 1.68 2007/02/17 00:26:51 collin + *** empty log message *** + + Revision 1.67 2007/02/15 19:42:07 ayanowit + For 4369537, eliminated support for legacy DCL SendPacketWithHeader, since it didn't work anyway, and NuDCL does support it. + + Revision 1.66 2007/02/15 01:23:39 arulchan + changes in AssignCycleMaster + + Revision 1.65 2007/02/09 04:44:06 collin + *** empty log message *** + + Revision 1.64 2007/01/26 20:52:31 ayanowit + changes to user-space isoch stuff to support 64-bit apps. + + Revision 1.63 2007/01/16 01:41:02 gecko1 + 4159728 Add improved async lock based check for bad IRMs + + Revision 1.62 2007/01/15 23:29:05 arulchan + Fixed Skipped Packet Handler Notifications + + Revision 1.61 2007/01/12 22:15:14 arulchan + Added flag kIOFWEnableBeingRoot + + Revision 1.60 2007/01/10 22:14:44 calderon + Fixed 4046607 Propagate vendor/model from IIDC UnitDepedantInfoDir + Fixed some null termination shinanigans in getIndexValue(string) + + Revision 1.59 2007/01/08 18:47:19 ayanowit + More 64-bit changes for isoch. + + Revision 1.58 2006/07/07 20:18:25 calderon + 4227201: SpeedMap and HopCount table reductions. + + Revision 1.57 2006/04/03 21:29:48 collin + *** empty log message *** + + Revision 1.56 2006/02/09 00:21:51 niels + merge chardonnay branch to tot + + Revision 1.55.4.1 2005/08/06 01:31:31 collin + *** empty log message *** + + Revision 1.55 2005/03/12 03:27:51 collin + *** empty log message *** + + Revision 1.54 2005/01/12 06:34:53 collin + *** empty log message *** + + Revision 1.53 2004/05/04 22:52:19 niels + *** empty log message *** + + Revision 1.52 2004/03/26 01:42:53 gecko1 + Add code to disable any port directly connected to an iPod when we go to sleep. + + Revision 1.51 2004/03/05 00:33:59 calderon + Fixed 3570909 - FireWire - iokit_fw_errs should be defined in hex + All decimal #define errors in header changed to hex + + Revision 1.50 2003/11/07 21:01:18 niels + Revision 1.49 2003/10/21 01:16:41 collin + Revision 1.48 2003/10/17 00:25:24 collin + Revision 1.47 2003/10/15 02:19:45 collin + Revision 1.46 2003/07/22 10:49:47 niels + Revision 1.45 2003/07/21 06:52:59 niels + merge isoch to TOT + + Revision 1.44.4.5 2003/07/21 06:44:44 niels + Revision 1.44.4.4 2003/07/18 00:17:42 niels + Revision 1.44.4.3 2003/07/14 22:08:53 niels + Revision 1.44.4.2 2003/07/09 21:24:01 niels + Revision 1.44.4.1 2003/07/01 20:54:07 niels + isoch merge + + Revision 1.44 2003/03/17 01:05:22 collin + Revision 1.43 2003/03/07 01:26:06 collin + Revision 1.42 2003/02/19 22:33:17 niels + add skip cycle DCL + + Revision 1.41 2003/02/18 00:14:01 collin + Revision 1.40 2003/02/17 21:47:52 collin + Revision 1.39 2002/12/05 19:08:37 niels + remove trailing commas from enums in IOFireWireFamilyCommon.h + + Revision 1.38 2002/11/01 20:45:57 collin + add enhanced IRM with support for the BROADCAST_CHANNEL register + + Revision 1.37 2002/10/01 02:40:27 collin + security mode support + + Revision 1.36 2002/09/25 21:17:14 collin + fix headers again. + + Revision 1.35 2002/09/25 00:27:23 niels + flip your world upside-down + + Revision 1.34 2002/09/12 22:41:53 niels + add GetIRMNodeID() to user client + +*/ + +/*! @header IOFireWireFamilyCommon.h +This file contains useful definitions for working with FireWire +in the kernel and in user space +*/ + +#ifndef __IOFireWireFamilyCommon_H__ +#define __IOFireWireFamilyCommon_H__ + +#ifdef KERNEL +#ifndef __IOKIT_IOTYPES_H + #include +#endif +#else +#include +#endif + +//#define LEGACY_SHUTDOWN + +#define FW_OLD_DCL_DEFS +#define FW_OLD_BIT_DEFS + +// ================================================================= +// bit ranges and fields +// ================================================================= +#pragma mark - +#pragma mark BITS + +// FireWire bit defs. + +#define BIT(x) ( 1 << (x) ) +#define FW_BIT(x) ( 1 << (31 - (x) ) ) + +#define FWBitRange(start, end) \ +( \ + ((((UInt32) 0xFFFFFFFF) << (start)) >> \ + ((start) + (31 - (end)))) << \ + (31 - (end)) \ +) + +#define FWBitRangePhase(start, end) \ + (31 - (end)) + +#define BitRange(start, end) \ +( \ + ((((UInt32) 0xFFFFFFFF) << (31 - (end))) >> \ + ((31 - (end)) + (start))) << \ + (start) \ +) + + +#define BitRangePhase(start, end) \ + (start) + +// ================================================================= +// FireWire messages & errors +// ================================================================= +#pragma mark - +#pragma mark MESSAGES AND ERRORS + +#define iokit_fw_err(return) (sys_iokit|sub_iokit_firewire|return) + +// e0008010 -> 0xe000801f Response codes from response packets + +// Base of Response error codes +#define kIOFireWireResponseBase iokit_fw_err(0x10) + +// e0008020 -- Bus reset during command execution (current bus generation does +// not match that specified in command.) +#define kIOFireWireBusReset (kIOFireWireResponseBase+kFWResponseBusResetError) + +// e0008001 -- Can't find requested entry in ROM +#define kIOConfigNoEntry iokit_fw_err(0x1) + +// e0008002 -- In pending queue waiting to execute +#define kIOFireWirePending iokit_fw_err(0x2) + +// e0008003 -- Last DCL callback of program (internal use) +#define kIOFireWireLastDCLToken iokit_fw_err(0x3) + +// e0008004 +#define kIOFireWireConfigROMInvalid iokit_fw_err(0x4) + +// e0008005 +#define kIOFireWireAlreadyRegistered iokit_fw_err(0x5) + +// e0008006 +#define kIOFireWireMultipleTalkers iokit_fw_err(0x6) + +// e0008007 +#define kIOFireWireChannelActive iokit_fw_err(0x7) + +// e0008008 +#define kIOFireWireNoListenerOrTalker iokit_fw_err(0x8) + +// e0008009 +#define kIOFireWireNoChannels iokit_fw_err(0x9) + +// e000800A +#define kIOFireWireChannelNotAvailable iokit_fw_err(0xA) + +// e000800B +#define kIOFireWireSeparateBus iokit_fw_err(0xB) + +// e000800C +#define kIOFireWireBadSelfIDs iokit_fw_err(0xC) + +// e000800D +#define kIOFireWireLowCableVoltage iokit_fw_err(0xD) + +// e000800E +#define kIOFireWireInsufficientPower iokit_fw_err(0xE) + +// e000800f +#define kIOFireWireOutOfTLabels iokit_fw_err(0xF) + +// NOTE: errors 16Ñ31 used for address space response codes.. (see above) + +// e0008101 +#define kIOFireWireBogusDCLProgram iokit_fw_err(0x101) + +// e0008102 +#define kIOFireWireTalkingAndListening iokit_fw_err(0x102) + +// e0008103 +#define kIOFireWireHardwareSlept iokit_fw_err(0x103) + +// e0008104 // let's resume here... + +// e0008104 -- In the middle of completing +#define kIOFireWireCompleting iokit_fw_err(0x104) + +// e0008105 -- Invalid Response Length +#define kIOFireWireInvalidResponseLength iokit_fw_err(0x105) + +// e0008106 -- Isoch Bandwidth Not Available +#define kIOFireWireIsochBandwidthNotAvailable iokit_fw_err(0x106) + + +// e00087d0 +#define kIOFWMessageServiceIsRequestingClose (UInt32)iokit_fw_err(0x7D0) +#define kIOFWMessagePowerStateChanged (UInt32)iokit_fw_err(0x7D1) +#define kIOFWMessageTopologyChanged (UInt32)iokit_fw_err(0x7D2) +// ================================================================= +// Pseudo address space response codes +// ================================================================= +#pragma mark - +#pragma mark PSEDUO ADDRESS SPACE RESPONSE CODES +enum +{ + kFWResponseComplete = 0, // OK! + kFWResponseConflictError = 4, // Resource conflict, may retry + kFWResponseDataError = 5, // Data not available + kFWResponseTypeError = 6, // Operation not supported + kFWResponseAddressError = 7, // Address not valid in target device + kFWResponseBusResetError = 16, // Pseudo response generated locally + kFWResponsePending = 17 // Pseudo response, real response sent later. +}; + +// +// Pseudo address space response codes +// +enum +{ + kFWAckTimeout = -1, // Pseudo ack generated locally + kFWAckComplete = 1, + kFWAckPending = 2, + kFWAckBusyX = 4, + kFWAckBusyA = 5, + kFWAckBusyB = 6, + kFWAckDataError = 13, + kFWAckTypeError = 14 +}; + +// ================================================================= +// FireWire bus speed numbers +// ================================================================= +#pragma mark - +#pragma mark BUS SPEED NUMBERS + +typedef enum +{ + kFWSpeed100MBit = 0, + kFWSpeed200MBit = 1, + kFWSpeed400MBit = 2, + kFWSpeed800MBit = 3, + kFWSpeedReserved = 3, // In all cases, 1394B Devices report this speed, + // each port of the PHY could be different + + kFWSpeedUnknownMask = 0x80, // If speed was reserved and we haven't probed it further + + kFWSpeedMaximum = 0x7FFFFFFF, + kFWSpeedInvalid = 0x80000000 +} IOFWSpeed; + +// ================================================================= +// FWAddress +// ================================================================= +#pragma mark - +#pragma mark FWADDRESS +// +// The venerable FWAddress structure. This is the standard +// struct to use for passing FireWire addresses. +// + +typedef struct FWAddressStruct +{ + UInt16 nodeID; // bus/node + UInt16 addressHi; // Top 16 bits of node address. + UInt32 addressLo; // Bottom 32 bits of node address + + // + // Useful C++ only constructors + // + #ifdef __cplusplus + FWAddressStruct(const FWAddressStruct & a): + nodeID(a.nodeID), addressHi(a.addressHi), addressLo(a.addressLo) {}; + FWAddressStruct(UInt16 h=0xdead, UInt32 l=0xcafebabe) : + nodeID(0), addressHi(h), addressLo(l) {}; + FWAddressStruct(UInt16 h, UInt32 l, UInt16 n) : + nodeID(n), addressHi(h), addressLo(l) {}; + #endif +} FWAddress, *FWAddressPtr ; + +// ================================================================= +// Config ROM +// ================================================================= +#pragma mark - +#pragma mark CONFIG ROM + +// +// CSR bit defs. +// + +#define CSR_BIT(x) FW_BIT(x) + +#define CSRBitRange(start, end) \ +( \ + ((((UInt32) 0xFFFFFFFF) << (start)) >> \ + ((start) + (31 - (end)))) << \ + (31 - (end)) \ +) + +#define CSRBitRangePhase(start, end) \ + (31 - end) + +// +// Key types. +// + +typedef enum +{ + kConfigImmediateKeyType = 0, + kConfigOffsetKeyType = 1, + kConfigLeafKeyType = 2, + kConfigDirectoryKeyType = 3, + kInvalidConfigROMEntryType = 0xff +} IOConfigKeyType; + +// +// Key values. +// + +enum +{ + kConfigTextualDescriptorKey = 0x01, + kConfigBusDependentInfoKey = 0x02, + kConfigModuleVendorIdKey = 0x03, + kConfigModuleHwVersionKey = 0x04, + kConfigModuleSpecIdKey = 0x05, + kConfigModuleSwVersionKey = 0x06, + kConfigModuleDependentInfoKey = 0x07, + kConfigNodeVendorIdKey = 0x08, + kConfigNodeHwVersionKey = 0x09, + kConfigNodeSpecIdKey = 0x0A, + kConfigNodeSwVersionKey = 0x0B, + kConfigNodeCapabilitiesKey = 0x0C, + kConfigNodeUniqueIdKey = 0x0D, + kConfigNodeUnitsExtentKey = 0x0E, + kConfigNodeMemoryExtentKey = 0x0F, + kConfigNodeDependentInfoKey = 0x10, + kConfigUnitDirectoryKey = 0x11, + kConfigUnitSpecIdKey = 0x12, + kConfigUnitSwVersionKey = 0x13, + kConfigUnitDependentInfoKey = 0x14, + kConfigUnitLocationKey = 0x15, + kConfigUnitPollMaskKey = 0x16, + kConfigModelIdKey = 0x17, + kConfigGenerationKey = 0x38, // Apple-specific + + kConfigRootDirectoryKey = 0xffff // Not a real key +}; + +enum +{ + kConfigSBP2LUN = 0x14, + kConfigSBP2Revision = 0x21, + kConfigSBP2MAO = 0x54 +}; + +// Core CSR registers. +enum +{ + kCSRStateUnitDepend = CSRBitRange(0, 15), + kCSRStateUnitDependPhase = CSRBitRangePhase(0, 15), + + kCSRStateBusDepend = CSRBitRange(16, 23), + kCSRStateBusDependPhase = CSRBitRangePhase(16, 23), + + kCSRStateLost = CSR_BIT(24), + kCSRStateDReq = CSR_BIT(25), + kCSRStateELog = CSR_BIT(27), + kCSRStateAtn = CSR_BIT(28), + kCSRStateOff = CSR_BIT(29), + + kCSRStateState = CSRBitRange(30, 31), + kCSRStateStatePhase = CSRBitRangePhase(30, 31), + kCSRStateStateRunning = 0, + kCSRStateStateInitializing = 1, + kCSRStateStateTesting = 2, + kCSRStateStateDead = 3 +}; + +// Config ROM entry bit locations. + +enum +{ + kConfigBusInfoBlockLength = CSRBitRange (0, 7), + kConfigBusInfoBlockLengthPhase = CSRBitRangePhase (0, 7), + + kConfigROMCRCLength = CSRBitRange (8, 15), + kConfigROMCRCLengthPhase = CSRBitRangePhase (8, 15), + + kConfigROMCRCValue = CSRBitRange (16, 31), + kConfigROMCRCValuePhase = CSRBitRangePhase (16, 31), + + kConfigEntryKeyType = CSRBitRange (0, 1), + kConfigEntryKeyTypePhase = CSRBitRangePhase (0, 1), + + kConfigEntryKeyValue = CSRBitRange (2, 7), + kConfigEntryKeyValuePhase = CSRBitRangePhase (2, 7), + + kConfigEntryValue = CSRBitRange (8, 31), + kConfigEntryValuePhase = CSRBitRangePhase (8, 31), + + kConfigLeafDirLength = CSRBitRange (0, 15), + kConfigLeafDirLengthPhase = CSRBitRangePhase (0, 15), + + kConfigLeafDirCRC = CSRBitRange (16, 31), + kConfigLeafDirCRCPhase = CSRBitRangePhase (16, 31) +}; + +// +// Key types. +// +typedef enum +{ + kCSRImmediateKeyType = 0, + kCSROffsetKeyType = 1, + kCSRLeafKeyType = 2, + kCSRDirectoryKeyType = 3, + kInvalidCSRROMEntryType = 0xff +} IOCSRKeyType; + +// CSR 64-bit fixed address defs. + +enum +{ + kCSRNodeID = CSRBitRange (0, 15), + kCSRNodeIDPhase = CSRBitRangePhase (0, 15), + + kCSRInitialMemorySpaceBaseAddressHi = 0x00000000, + kCSRInitialMemorySpaceBaseAddressLo = 0x00000000, + + kCSRPrivateSpaceBaseAddressHi = 0x0000FFFF, + kCSRPrivateSpaceBaseAddressLo = 0xE0000000, + + kCSRRegisterSpaceBaseAddressHi = 0x0000FFFF, + kCSRRegisterSpaceBaseAddressLo = 0xF0000000, + + kCSRCoreRegistersBaseAddress = kCSRRegisterSpaceBaseAddressLo, + kCSRStateClearAddress = kCSRCoreRegistersBaseAddress + 0x0000, + kCSRStateSetAddress = kCSRCoreRegistersBaseAddress + 0x0004, + kCSRNodeIDsAddress = kCSRCoreRegistersBaseAddress + 0x0008, + kCSRResetStartAddress = kCSRCoreRegistersBaseAddress + 0x000C, + kCSRIndirectAddressAddress = kCSRCoreRegistersBaseAddress + 0x0010, + kCSRIndirectDataAddress = kCSRCoreRegistersBaseAddress + 0x0014, + kCSRSplitTimeoutHiAddress = kCSRCoreRegistersBaseAddress + 0x0018, + kCSRSplitTimeoutLoAddress = kCSRCoreRegistersBaseAddress + 0x001C, + kCSRArgumentHiAddress = kCSRCoreRegistersBaseAddress + 0x0020, + kCSRArgumentLoAddress = kCSRCoreRegistersBaseAddress + 0x0024, + kCSRTestStartAddress = kCSRCoreRegistersBaseAddress + 0x0028, + kCSRTestStatusAddress = kCSRCoreRegistersBaseAddress + 0x002C, + kCSRUnitsBaseHiAddress = kCSRCoreRegistersBaseAddress + 0x0030, + kCSRUnitsBaseLoAddress = kCSRCoreRegistersBaseAddress + 0x0034, + kCSRUnitsBoundHiAddress = kCSRCoreRegistersBaseAddress + 0x0038, + kCSRUnitsBoundLoAddress = kCSRCoreRegistersBaseAddress + 0x003C, + kCSRMemoryBaseHiAddress = kCSRCoreRegistersBaseAddress + 0x0040, + kCSRMemoryBaseLoAddress = kCSRCoreRegistersBaseAddress + 0x0044, + kCSRMemoryBoundHiAddress = kCSRCoreRegistersBaseAddress + 0x0048, + kCSRMemoryBoundLoAddress = kCSRCoreRegistersBaseAddress + 0x004C, + kCSRInterruptTargetAddress = kCSRCoreRegistersBaseAddress + 0x0050, + kCSRInterruptMaskAddress = kCSRCoreRegistersBaseAddress + 0x0054, + kCSRClockValueHiAddress = kCSRCoreRegistersBaseAddress + 0x0058, + kCSRClockValueMidAddress = kCSRCoreRegistersBaseAddress + 0x005C, + kCSRClockTickPeriodMidAddress = kCSRCoreRegistersBaseAddress + 0x0060, + kCSRClockTickPeriodLoAddress = kCSRCoreRegistersBaseAddress + 0x0064, + kCSRClockStrobeArrivedHiAddress = kCSRCoreRegistersBaseAddress + 0x0068, + kCSRClockStrobeArrivedMidAddress = kCSRCoreRegistersBaseAddress + 0x006C, + kCSRClockInfo0Address = kCSRCoreRegistersBaseAddress + 0x0070, + kCSRClockInfo1Address = kCSRCoreRegistersBaseAddress + 0x0074, + kCSRClockInfo2Address = kCSRCoreRegistersBaseAddress + 0x0078, + kCSRClockInfo3Address = kCSRCoreRegistersBaseAddress + 0x007C, + kCSRMessageRequestAddress = kCSRCoreRegistersBaseAddress + 0x0080, + kCSRMessageResponseAddress = kCSRCoreRegistersBaseAddress + 0x00C0, + kCSRErrorLogBufferAddress = kCSRCoreRegistersBaseAddress + 0x0180, + + kCSRBusDependentRegistersBaseAddress = kCSRRegisterSpaceBaseAddressLo + 0x0200, + kCSRBusyTimeout = kCSRRegisterSpaceBaseAddressLo + 0x0210, + kCSRBusManagerID = kCSRRegisterSpaceBaseAddressLo + 0x021C, + kCSRBandwidthAvailable = kCSRRegisterSpaceBaseAddressLo + 0x0220, + kCSRChannelsAvailable31_0 = kCSRRegisterSpaceBaseAddressLo + 0x0224, + kCSRChannelsAvailable63_32 = kCSRRegisterSpaceBaseAddressLo + 0x0228, + kCSRBroadcastChannel = kCSRRegisterSpaceBaseAddressLo + 0x0234, + + kConfigROMBaseAddress = kCSRRegisterSpaceBaseAddressLo + 0x0400, + kConfigBIBHeaderAddress = kConfigROMBaseAddress, + kConfigBIBBusNameAddress = kConfigROMBaseAddress + 4, + + kPCRBaseAddress = kCSRRegisterSpaceBaseAddressLo + 0x900, + kFCPCommandAddress = kCSRRegisterSpaceBaseAddressLo + 0xb00, + kFCPResponseAddress = kCSRRegisterSpaceBaseAddressLo + 0xd00 +}; + +// from figure 10-7 of 1394a +#define kBroadcastChannelInitialValues 0x8000001f +#define kBroadcastChannelValidMask 0x40000000 + +// CSR defined 64 bit unique ID. + +typedef UInt64 CSRNodeUniqueID; + +// FireWire core CSR registers. + +enum +{ + kFWCSRStateGone = FW_BIT(16), + kFWCSRStateLinkOff = FW_BIT(22), + kFWCSRStateCMstr = FW_BIT(23) +}; + +// FireWire bus/nodeID address defs. + +enum +{ + kFWAddressBusID = FWBitRange (16, 25) << kCSRNodeIDPhase, + kFWAddressBusIDPhase = FWBitRangePhase (16, 25) + kCSRNodeIDPhase, + + kFWAddressNodeID = FWBitRange (26, 31) << kCSRNodeIDPhase, + kFWAddressNodeIDPhase = FWBitRangePhase (26, 31) + kCSRNodeIDPhase, + + kFWLocalBusID = 1023, + kFWBroadcastNodeID = 63, + kFWBadNodeID = 0xffff, + + kFWLocalBusAddress = kFWLocalBusID << kFWAddressBusIDPhase, + kFWBroadcastAddress = kFWBroadcastNodeID << kFWAddressNodeIDPhase +}; + +#define FWNodeBaseAddress(busID, nodeID) \ +( \ + (busID << kFWAddressBusIDPhase) | \ + (nodeID << kFWAddressNodeIDPhase) \ +) + +#define FWNodeRegisterSpaceBaseAddressHi(busID, nodeID) \ +( \ + FWNodeBaseAddress (busID, nodeID) | \ + kCSRRegisterSpaceBaseAddressHi \ +) + +// FireWire CSR bus info block defs. + +enum +{ + kFWBIBHeaderAddress = kConfigBIBHeaderAddress, + kFWBIBBusNameAddress = kConfigBIBBusNameAddress, + kFWBIBNodeCapabilitiesAddress = kConfigROMBaseAddress + 8, + kFWBIBNodeUniqueIDHiAddress = kConfigROMBaseAddress + 12, + kFWBIBNodeUniqueIDLoAddress = kConfigROMBaseAddress + 16, + + kFWBIBBusName = 0x31333934, //'1394' + + kFWBIBIrmc = FW_BIT(0), + kFWBIBCmc = FW_BIT(1), + kFWBIBIsc = FW_BIT(2), + kFWBIBBmc = FW_BIT(3), + kFWBIBCycClkAcc = FWBitRange (8, 15), + kFWBIBCycClkAccPhase = FWBitRangePhase (8, 15), + kFWBIBMaxRec = FWBitRange (16, 19), + kFWBIBMaxRecPhase = FWBitRangePhase (16, 19), + kFWBIBMaxROM = FWBitRange (20, 21), + kFWBIBMaxROMPhase = FWBitRangePhase (20, 21), + kFWBIBGeneration = FWBitRange (24, 27), + kFWBIBGenerationPhase = FWBitRangePhase (24, 27), + kFWBIBLinkSpeed = FWBitRange (29, 31), + kFWBIBLinkSpeedPhase = FWBitRangePhase (29, 31) +}; + +enum +{ + kConfigUnitSpecAppleA27 = 0x000a27, + kConfigUnitSpec1394TA1 = 0x00a02d, + + kConfigUnitSWVersMacintosh10 = 10, + kConfigUnitSWVersIIDC100 = 0x000100, + kConfigUnitSWVersIIDC101 = 0x000101, + kConfigUnitSWVersIIDC102 = 0x000102 +}; + + +// ================================================================= +// Isoch defines +// ================================================================= +#pragma mark - +#pragma mark ISOCH + +enum +{ + kFWIsochDataLength = FWBitRange (0, 15), + kFWIsochDataLengthPhase = FWBitRangePhase (0, 15), + + kFWIsochTag = FWBitRange (16, 17), + kFWIsochTagPhase = FWBitRangePhase (16, 17), + + kFWIsochChanNum = FWBitRange (18, 23), + kFWIsochChanNumPhase = FWBitRangePhase (18, 23), + + kFWIsochTCode = FWBitRange (24, 27), + kFWIsochTCodePhase = FWBitRangePhase (24, 27), + + kFWIsochSy = FWBitRange (28, 31), + kFWIsochSyPhase = FWBitRangePhase (28, 31) +}; + +#define CHAN_BIT(x) (((UInt64)1) << (63 - (x)) +#define CHAN_MASK(x) (~CHAN_BIT(X)) + +typedef enum +{ + kFWNeverMultiMode = 0, + kFWAllowMultiMode, + kFWSuggestMultiMode, + kFWAlwaysMultiMode, + + kFWDefaultIsochResourceFlags = kFWNeverMultiMode +} IOFWIsochResourceFlags ; + +enum +{ + kFWIsochChannelDefaultFlags = 0, + kFWIsochChannelDoNotResumeOnWake = BIT(1) +} ; + +typedef enum +{ + kFWIsochPortDefaultOptions = 0, + kFWIsochPortUseSeparateKernelThread = BIT(1), + kFWIsochEnableRobustness = BIT(2), + kFWIsochBigEndianUpdates = BIT(3), // private + kFWIsochRequireLastContext = BIT(4), // private +} IOFWIsochPortOptions ; + +// ================================================================= +// DCL opcode defs. +// ================================================================= +#pragma mark - +#pragma mark DCL OPCODES + +enum +{ + kFWDCLImmediateEvent = 0, + kFWDCLCycleEvent = 1, + kFWDCLSyBitsEvent = 2 +}; + +typedef enum +{ + kFWDCLInvalidNotification = 0 + , kFWDCLUpdateNotification = 1 + , kFWDCLModifyNotification = 2 + , kFWNuDCLModifyNotification = 3 + , kFWNuDCLModifyJumpNotification = 4 + , kFWNuDCLUpdateNotification = 5 +} IOFWDCLNotificationType ; + +enum +{ + kFWDCLOpDynamicFlag = BIT(16), + kFWDCLOpVendorDefinedFlag = BIT(17), + kFWDCLOpFlagMask = BitRange (16, 31), + kFWDCLOpFlagPhase = BitRangePhase (16, 31) +}; + +enum +{ + kDCLInvalidOp = 0, + kDCLSendPacketStartOp = 1, + //kDCLSendPacketWithHeaderStartOp = 2, // Deprecated legacy DCL opcode! Use NuDCL instead! + kDCLSendPacketOp = 3, + kDCLSendBufferOp = 4, // obsolete - do not use + kDCLReceivePacketStartOp = 5, + kDCLReceivePacketOp = 6, + kDCLReceiveBufferOp = 7, // obsolete - do not use + kDCLCallProcOp = 8, + kDCLLabelOp = 9, + kDCLJumpOp = 10, + kDCLSetTagSyncBitsOp = 11, + kDCLUpdateDCLListOp = 12, + kDCLTimeStampOp = 13, + kDCLPtrTimeStampOp = 14, + kDCLSkipCycleOp = 15, + + kDCLNuDCLLeaderOp = 20 // compilerData field contains NuDCLRef to start of NuDCL + // program. + // Should not need to use this directly. +}; + +#ifdef FW_OLD_DCL_DEFS + +//typedef struct DCLCommandStruct ; +//typedef void (DCLCallCommandProc)(DCLCommandStruct* command); + +#else + +//typedef struct DCLCommand ; +//typedef void (DCLCallCommandProc)(DCLCommand* command); + +#endif + +// ================================================================= +// DCL structs +// ================================================================= +#pragma mark - +#pragma mark DCL + +#ifdef __LP64__ +typedef void* DCLCallProcDataType; +#else +typedef UInt32 DCLCallProcDataType; +#endif + +#ifdef KERNEL + #ifdef __LP64__ + typedef void* DCLCompilerDataType; + #else + typedef UInt32 DCLCompilerDataType; + #endif +#else + typedef UInt32 DCLCompilerDataType; +#endif + +typedef struct DCLCommandStruct +{ + struct DCLCommandStruct * pNextDCLCommand; // Next DCL command. + DCLCompilerDataType compilerData; // Data for use by DCL compiler. + UInt32 opcode; // DCL opcode. + UInt32 operands[1]; // DCL operands (size varies) +} DCLCommand; + +typedef void (DCLCallCommandProc)(DCLCommand * command); + +typedef struct DCLTransferPacketStruct +{ + DCLCommand * pNextDCLCommand; // Next DCL command. + DCLCompilerDataType compilerData; // Data for use by DCL compiler. + UInt32 opcode; // DCL opcode. + void * buffer; // Packet buffer. + UInt32 size; // Buffer size. +} DCLTransferPacket ; + +typedef struct DCLTransferBufferStruct +{ + DCLCommand * pNextDCLCommand; // Next DCL command. + DCLCompilerDataType compilerData; // Data for use by DCL compiler. + UInt32 opcode; // DCL opcode. + void * buffer; // Buffer. + UInt32 size; // Buffer size. + UInt16 packetSize; // Size of packets to send. + UInt16 reserved; + UInt32 bufferOffset; // Current offset into buffer. +} DCLTransferBuffer ; + +typedef struct DCLCallProcStruct +{ + DCLCommand * pNextDCLCommand; // Next DCL command. + DCLCompilerDataType compilerData; // Data for use by DCL compiler. + UInt32 opcode; // DCL opcode. + DCLCallCommandProc * proc; // Procedure to call. + DCLCallProcDataType procData; // Data for use by called procedure. +} DCLCallProc; + +typedef struct DCLLabelStruct +{ + DCLCommand * pNextDCLCommand; // Next DCL command. + DCLCompilerDataType compilerData; // Data for use by DCL compiler. + UInt32 opcode; // DCL opcode. +} DCLLabel; + +typedef struct DCLJumpStruct +{ + DCLCommand * pNextDCLCommand; // Next DCL command. + DCLCompilerDataType compilerData; // Data for use by DCL compiler. + UInt32 opcode; // DCL opcode. + DCLLabel * pJumpDCLLabel; // DCL label to jump to. +} DCLJump; + +typedef struct DCLSetTagSyncBitsStruct +{ + DCLCommand * pNextDCLCommand; // Next DCL command. + DCLCompilerDataType compilerData; // Data for use by DCL compiler. + UInt32 opcode; // DCL opcode. + UInt16 tagBits; // Tag bits for following packets. + UInt16 syncBits; // Sync bits for following packets. +} DCLSetTagSyncBits; + +typedef struct DCLUpdateDCLListStruct +{ + DCLCommand * pNextDCLCommand; // Next DCL command. + DCLCompilerDataType compilerData; // Data for use by DCL compiler. + UInt32 opcode; // DCL opcode. + DCLCommand ** dclCommandList; // List of DCL commands to update. + UInt32 numDCLCommands; // Number of DCL commands in list. +} DCLUpdateDCLList; + +typedef struct DCLTimeStampStruct +{ + DCLCommand * pNextDCLCommand; // Next DCL command. + DCLCompilerDataType compilerData; // Data for use by DCL compiler. + UInt32 opcode; // DCL opcode. + UInt32 timeStamp; // Time stamp. +} DCLTimeStamp; + +typedef struct DCLPtrTimeStampStruct +{ + DCLCommand * pNextDCLCommand; // Next DCL command. + DCLCompilerDataType compilerData; // Data for use by DCL compiler. + UInt32 opcode; // DCL opcode. + UInt32 * timeStampPtr; // Where to store the time stamp. +} DCLPtrTimeStamp ; + +typedef struct +{ + DCLCommand * pNextDCLCommand ; // unused - always NULL + DCLCompilerDataType compilerData; // Data for use by DCL compiler. + UInt32 opcode ; // must be kDCLNuDCLLeaderOp + void* program ; // NuDCL program here... +} DCLNuDCLLeader ; + +#ifdef FW_OLD_DCL_DEFS + +// should not use these... + +typedef DCLCommand* DCLCommandPtr ; +typedef DCLTransferBuffer* DCLTransferBufferPtr ; +typedef DCLTransferPacket* DCLTransferPacketPtr ; +typedef DCLCallProc* DCLCallProcPtr ; +typedef DCLLabel* DCLLabelPtr ; +typedef DCLJump* DCLJumpPtr ; +typedef DCLSetTagSyncBits* DCLSetTagSyncBitsPtr ; +typedef DCLUpdateDCLList* DCLUpdateDCLListPtr ; +typedef DCLTimeStamp* DCLTimeStampPtr ; +typedef DCLPtrTimeStamp* DCLPtrTimeStampPtr ; +typedef DCLCallCommandProc* DCLCallCommandProcPtr ; + +#endif + + +// ================================================================= +// User-Lib Export DCL structs - Thses structus are used to pass +// a user-created legacy DCL program down into kernel space. These +// structs allow support for both 32-bit and 64-bit user-space clients. +// These structs should only be used internally. They are not for +// clients to create DCL programs with. +// ================================================================= + +typedef struct UserExportDCLCommandStruct +{ + mach_vm_address_t pClientDCLStruct; // A pointer to the client's DCL struct + mach_vm_address_t pNextDCLCommand; // Next DCL command. + uint64_t compilerData; // Data for use by DCL compiler. + UInt32 opcode; // DCL opcode. + UInt32 operands[1]; // DCL operands (size varies) +} __attribute__ ((packed)) UserExportDCLCommand; + +typedef void (UserExportDCLCallCommandProc)(UserExportDCLCommand * command); + +typedef struct UserExportDCLTransferPacketStruct +{ + mach_vm_address_t pClientDCLStruct; // A pointer to the client's DCL struct + mach_vm_address_t pNextDCLCommand; // Next DCL command. + uint64_t compilerData; // Data for use by DCL compiler. + UInt32 opcode; // DCL opcode. + mach_vm_address_t buffer; // Packet buffer. + UInt32 size; // Buffer size. +} __attribute__ ((packed)) UserExportDCLTransferPacket ; + +typedef struct UserExportDCLTransferBufferStruct +{ + mach_vm_address_t pClientDCLStruct; // A pointer to the client's DCL struct + mach_vm_address_t pNextDCLCommand; // Next DCL command. + uint64_t compilerData; // Data for use by DCL compiler. + UInt32 opcode; // DCL opcode. + mach_vm_address_t buffer; // Buffer. + UInt32 size; // Buffer size. + UInt16 packetSize; // Size of packets to send. + UInt16 reserved; + UInt32 bufferOffset; // Current offset into buffer. +} __attribute__ ((packed)) UserExportDCLTransferBuffer ; + +typedef struct UserExportDCLCallProcStruct +{ + mach_vm_address_t pClientDCLStruct; // A pointer to the client's DCL struct + mach_vm_address_t pNextDCLCommand; // Next DCL command. + uint64_t compilerData; // Data for use by DCL compiler. + UInt32 opcode; // DCL opcode. + mach_vm_address_t proc; // Procedure to call. + uint64_t procData; // Data for use by called procedure. +} __attribute__ ((packed)) UserExportDCLCallProc; + +typedef struct UserExportDCLLabelStruct +{ + mach_vm_address_t pClientDCLStruct; // A pointer to the client's DCL struct + mach_vm_address_t pNextDCLCommand; // Next DCL command. + uint64_t compilerData; // Data for use by DCL compiler. + UInt32 opcode; // DCL opcode. +} __attribute__ ((packed)) UserExportDCLLabel; + +typedef struct UserExportDCLJumpStruct +{ + mach_vm_address_t pClientDCLStruct; // A pointer to the client's DCL struct + mach_vm_address_t pNextDCLCommand; // Next DCL command. + uint64_t compilerData; // Data for use by DCL compiler. + UInt32 opcode; // DCL opcode. + mach_vm_address_t pJumpDCLLabel; // DCL label to jump to. +} __attribute__ ((packed)) UserExportDCLJump; + +typedef struct UserExportDCLSetTagSyncBitsStruct +{ + mach_vm_address_t pClientDCLStruct; // A pointer to the client's DCL struct + mach_vm_address_t pNextDCLCommand; // Next DCL command. + uint64_t compilerData; // Data for use by DCL compiler. + UInt32 opcode; // DCL opcode. + UInt16 tagBits; // Tag bits for following packets. + UInt16 syncBits; // Sync bits for following packets. +} __attribute__ ((packed)) UserExportDCLSetTagSyncBits; + +typedef struct UserExportDCLUpdateDCLListStruct +{ + mach_vm_address_t pClientDCLStruct; // A pointer to the client's DCL struct + mach_vm_address_t pNextDCLCommand; // Next DCL command. + uint64_t compilerData; // Data for use by DCL compiler. + UInt32 opcode; // DCL opcode. + mach_vm_address_t dclCommandList; // List of DCL commands to update. + UInt32 numDCLCommands; // Number of DCL commands in list. +} __attribute__ ((packed)) UserExportDCLUpdateDCLList; + +typedef struct UserExportDCLTimeStampStruct +{ + mach_vm_address_t pClientDCLStruct; // A pointer to the client's DCL struct + mach_vm_address_t pNextDCLCommand; // Next DCL command. + uint64_t compilerData; // Data for use by DCL compiler. + UInt32 opcode; // DCL opcode. + UInt32 timeStamp; // Time stamp. +} __attribute__ ((packed)) UserExportDCLTimeStamp; + +typedef struct UserExportDCLPtrTimeStampStruct +{ + mach_vm_address_t pClientDCLStruct; // A pointer to the client's DCL struct + mach_vm_address_t pNextDCLCommand; // Next DCL command. + uint64_t compilerData; // Data for use by DCL compiler. + UInt32 opcode; // DCL opcode. + mach_vm_address_t timeStampPtr; // Where to store the time stamp. +} __attribute__ ((packed)) UserExportDCLPtrTimeStamp ; + +typedef struct +{ + mach_vm_address_t pClientDCLStruct; // A pointer to the client's DCL struct + mach_vm_address_t pNextDCLCommand ; // unused - always NULL + uint64_t compilerData; // Data for use by DCL compiler. + UInt32 opcode ; // must be kDCLNuDCLLeaderOp + mach_vm_address_t program ; // NuDCL program here... +} __attribute__ ((packed)) UserExportDCLNuDCLLeader ; + + +// ================================================================= +// NuDCL +// ================================================================= +#pragma mark - +#pragma mark NUDCL + +typedef struct __NuDCL * NuDCLRef ; +typedef NuDCLRef NuDCLSendPacketRef ; +typedef NuDCLRef NuDCLSkipCycleRef ; +typedef NuDCLRef NuDCLReceivePacketRef ; + +typedef void (*NuDCLCallback)( void* refcon, NuDCLRef dcl ); + +typedef enum +{ + kNuDCLDynamic = BIT( 1 ), + kNuDCLUpdateBeforeCallback = BIT( 2 ) + +} NuDCLFlags ; + +// ================================================================= +// Miscellaneous +// ================================================================= +#pragma mark - +#pragma mark MISCELLANEOUS + +typedef void* FWClientCommandID ; + +typedef struct IOFireWireSessionRefOpaqueStuct* IOFireWireSessionRef ; + +// +// bus management constants. +// + +enum +{ + kFWBusManagerArbitrationTimeoutDuration = 625 // durationMillisecond +}; + +// +// bus characteristics. +// + +enum +{ + kFWMaxBusses = 1023, + kFWMaxNodesPerBus = 63, + kFWMaxNodeHops = 16 +}; + +/*! @enum NodeFlags + + @abstract Flags that specify characteristics of the FireWire device node. + + @constant kIOFWDisablePhysicalAccess Disable physical memory access + + @constant kIOFWDisableAllPhysicalAccess Disable all physical memory access + + @constant kIOFWEnableRetryOnAckD Enable retry on Ack D + + @constant kIOFWLimitAsyncPacketSize Limit async packet size + + @constant kIOFWDisablePhyOnSleep Disable Phy, when machine is in Sleep mode + + @constant kIOFWMustBeRoot Attempt to make this device root, There is no guarentee Mac OS will succeed in making the device + root. + + @constant kIOFWMustNotBeRoot Attempt to prevent this device from being root, There is no guarentee Mac OS will succeed in preventing the device + from being root. + + @constant kIOFWMustHaveGap63 Attempt to ensure the gap count is 63, when this device is on the bus. Gap 63 reduces bus performance significantly, + so this flag should be used only when absolutely necessary. There is no guarentee Mac OS will succeed in forcing + the gap count to 63. +*/ +enum +{ + kIOFWDisablePhysicalAccess = (1 << 0), + kIOFWDisableAllPhysicalAccess = (1 << 1), + kIOFWEnableRetryOnAckD = (1 << 2), + kIOFWLimitAsyncPacketSize = (1 << 3), + kIOFWDisablePhyOnSleep = (1 << 4), + kIOFWMustBeRoot = (1 << 5), + kIOFWMustNotBeRoot = (1 << 6), + kIOFWMustHaveGap63 = (1 << 7) +}; + +// +// write flags +// + +enum IOFWWriteFlags +{ + kIOFWWriteFlagsNone = 0x00000000, + kIOFWWriteFlagsDeferredNotify = 0x00000001, + kIOFWWriteFastRetryOnBusy = 0x00000002, + kIOFWWriteBlockRequest = 0x00000004, // force a block request +}; + +// +// read flags +// + +enum IOFWReadFlags +{ + kIOFWReadFlagsNone = 0x00000000, + kIOFWReadBlockRequest = 0x00000004, // force a block request + kIOFWReadPingTime = 0x00000008 // ping time +}; + +// +// security modes +// + +enum IOFWSecurityMode +{ + kIOFWSecurityModeNormal = 0, + kIOFWSecurityModeSecure = 1, + kIOFWSecurityModeSecurePermanent = 2 +}; + +// +// physical access settings +// + +enum IOFWPhysicalAccessMode +{ + kIOFWPhysicalAccessEnabled = 0, + kIOFWPhysicalAccessDisabled = 1, + kIOFWPhysicalAccessDisabledForGeneration = 2 +}; + +enum +{ + kIOFWSpecID_AAPL = 0xa27, + kIOFWSWVers_KPF = 0x40 +}; + +// old style bit defs +#ifdef FW_OLD_BIT_DEFS + + #define kBit0 BIT(0) + #define kBit1 BIT(1) + #define kBit2 BIT(2) + #define kBit3 BIT(3) + #define kBit4 BIT(4) + #define kBit5 BIT(5) + #define kBit6 BIT(6) + #define kBit7 BIT(7) + #define kBit8 BIT(8) + #define kBit9 BIT(9) + #define kBit10 BIT(10) + #define kBit11 BIT(11) + #define kBit12 BIT(12) + #define kBit13 BIT(13) + #define kBit14 BIT(14) + #define kBit15 BIT(15) + #define kBit16 BIT(16) + #define kBit17 BIT(17) + #define kBit18 BIT(18) + #define kBit19 BIT(19) + #define kBit20 BIT(20) + #define kBit21 BIT(21) + #define kBit22 BIT(22) + #define kBit23 BIT(23) + #define kBit24 BIT(24) + #define kBit25 BIT(25) + #define kBit26 BIT(26) + #define kBit27 BIT(27) + #define kBit28 BIT(28) + #define kBit29 BIT(29) + #define kBit30 BIT(30) + #define kBit31 BIT(31) + +#endif + +#endif //__IOFireWireFamilyCommon_H__ diff --git a/QualcommWireless/include/IOKit/firewire/IOFireWireIRMAllocation.h b/QualcommWireless/include/IOKit/firewire/IOFireWireIRMAllocation.h new file mode 100644 index 0000000..c67986c --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFireWireIRMAllocation.h @@ -0,0 +1,116 @@ +/* + * Copyright (c) 1998-2006 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOFIREWIREIRMALLOCATION_H +#define _IOKIT_IOFIREWIREIRMALLOCATION_H + +#include + +class IOFireWireController; + +//#include +//#include + +/*! @class IOFireWireIRMAllocation +*/ + +class IOFireWireIRMAllocation : public OSObject +{ + friend class IOFireWireController; + + OSDeclareDefaultStructors(IOFireWireIRMAllocation) + +public: + + // Prototype for the callback if reallocation after bus-reset is unsuccessful. + typedef IOReturn (*AllocationLostNotificationProc)(void* refCon, class IOFireWireIRMAllocation* allocation); + + // Initialize the IRM allocation object. + virtual bool init( IOFireWireController * control, + Boolean releaseIRMResourcesOnFree = true, + AllocationLostNotificationProc allocationLostProc = NULL, + void *pLostProcRefCon = NULL); + + // Specify whether of not the IRM resources should automatically + // be released when freeing this allocation object. + virtual void setReleaseIRMResourcesOnFree(Boolean doRelease); + + // Use the IRMAllocation object to allocate isoch resources + virtual IOReturn allocateIsochResources(UInt8 isochChannel, UInt32 bandwidthUnits); + + // Free isoch resources previously allocated with a call to allocateIsochResources + virtual IOReturn deallocateIsochResources(void); + + // Returns true if isoch resources are currently allocated, and if true, the allocated channel, and amount of isoch bandwidth. + virtual Boolean areIsochResourcesAllocated(UInt8 *pAllocatedIsochChannel, UInt32 *pAllocatedBandwidthUnits); + + // Get the refcon + virtual void * GetRefCon(void); + virtual void SetRefCon(void* refCon); + + // Override the base-class release function for special processing + virtual void release() const; + +protected: + + /*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + struct ExpansionData { }; + + /*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + + // Free the allocation object (and release IRM resources if needed) + virtual void free( void ); + + // Controller will call this to notify about bus-reset complete. + virtual void handleBusReset(UInt32 generation); + + virtual void failedToRealloc(void); + virtual UInt32 getAllocationGeneration(void); + static void threadFunc( void * arg ); + +private: + + AllocationLostNotificationProc fAllocationLostProc; + void *fLostProcRefCon; + Boolean fReleaseIRMResourcesOnFree; + UInt8 fIsochChannel; + UInt32 fBandwidthUnits; + UInt32 fAllocationGeneration; + IORecursiveLock *fLock ; + IOFireWireController *fControl; + Boolean isAllocated; + + OSMetaClassDeclareReservedUnused(IOFireWireIRMAllocation, 0); + OSMetaClassDeclareReservedUnused(IOFireWireIRMAllocation, 1); + OSMetaClassDeclareReservedUnused(IOFireWireIRMAllocation, 2); + OSMetaClassDeclareReservedUnused(IOFireWireIRMAllocation, 3); + OSMetaClassDeclareReservedUnused(IOFireWireIRMAllocation, 4); + OSMetaClassDeclareReservedUnused(IOFireWireIRMAllocation, 5); + OSMetaClassDeclareReservedUnused(IOFireWireIRMAllocation, 6); + OSMetaClassDeclareReservedUnused(IOFireWireIRMAllocation, 7); +}; + +#endif // _IOKIT_IOFIREWIREIRMALLOCATION_H diff --git a/QualcommWireless/include/IOKit/firewire/IOFireWireLocalNode.h b/QualcommWireless/include/IOKit/firewire/IOFireWireLocalNode.h new file mode 100644 index 0000000..8906da3 --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFireWireLocalNode.h @@ -0,0 +1,140 @@ +/* + * IOFireWireLocalNode.h + * IOFireWireFamily + * + * Created by Niels on Fri Aug 16 2002. + * Copyright (c) 2002 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + $Log: not supported by cvs2svn $ + Revision 1.7 2008/11/14 00:17:12 arulchan + fix for rdar://5939334 + + Revision 1.6 2005/02/18 22:56:53 gecko1 + 3958781 Q45C EVT: FireWire ASP reporter says port speed is 800 Mb/sec + + Revision 1.5 2003/02/20 02:00:12 collin + *** empty log message *** + + Revision 1.4 2003/02/17 21:47:53 collin + *** empty log message *** + + Revision 1.3 2002/10/18 23:29:44 collin + fix includes, fix cast which fails on new compiler + + Revision 1.2 2002/09/25 00:27:24 niels + flip your world upside-down + +*/ + +// public +#import + +class IOFireWireLocalNode; + +#pragma mark - + +/*! + @class IOFireWireLocalNodeAux +*/ + +class IOFireWireLocalNodeAux : public IOFireWireNubAux +{ + OSDeclareDefaultStructors(IOFireWireLocalNodeAux) + + friend class IOFireWireLocalNode; + +protected: + + /*! + @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + + struct ExpansionData { }; + + /*! + @var reserved + Reserved for future use. (Internal use only) + */ + + ExpansionData * reserved; + + virtual bool init( IOFireWireLocalNode * primary ); + virtual void free(void) APPLE_KEXT_OVERRIDE; + +private: + OSMetaClassDeclareReservedUnused(IOFireWireLocalNodeAux, 0); + OSMetaClassDeclareReservedUnused(IOFireWireLocalNodeAux, 1); + OSMetaClassDeclareReservedUnused(IOFireWireLocalNodeAux, 2); + OSMetaClassDeclareReservedUnused(IOFireWireLocalNodeAux, 3); + +}; + +#pragma mark - + +/*! @class IOFireWireLocalNode +*/ + +class IOFireWireLocalNode : public IOFireWireNub +{ + OSDeclareDefaultStructors(IOFireWireLocalNode) + + friend class IOFireWireLocalNodeAux; + + /*------------------Useful info about device (also available in the registry)--------*/ +protected: + + /*-----------Methods provided to FireWire device clients-------------*/ +public: + + // Set up properties affected by bus reset + virtual void setNodeProperties(UInt32 generation, UInt16 nodeID, UInt32 *selfIDs, int numIDs, IOFWSpeed maxSpeed ); + + /* + * Standard nub initialization + */ + virtual bool init(OSDictionary * propTable) APPLE_KEXT_OVERRIDE; + virtual bool attach(IOService * provider ) APPLE_KEXT_OVERRIDE; + + virtual void handleClose( IOService * forClient, + IOOptionBits options ) APPLE_KEXT_OVERRIDE; + virtual bool handleOpen( IOService * forClient, + IOOptionBits options, + void * arg ) APPLE_KEXT_OVERRIDE; + virtual bool handleIsOpen( const IOService * forClient ) const APPLE_KEXT_OVERRIDE; + + /* + * Trick method to create protocol user clients + */ + virtual IOReturn setProperties( OSObject * properties ) APPLE_KEXT_OVERRIDE; + +protected: + + virtual IOFireWireNubAux * createAuxiliary( void ) APPLE_KEXT_OVERRIDE; + +public: + virtual IOReturn message( UInt32 type, IOService * provider, void * argument ) APPLE_KEXT_OVERRIDE; + virtual void free(void) APPLE_KEXT_OVERRIDE; + +protected: + OSSet * fOpenClients; +}; diff --git a/QualcommWireless/include/IOKit/firewire/IOFireWireMultiIsochReceive.h b/QualcommWireless/include/IOKit/firewire/IOFireWireMultiIsochReceive.h new file mode 100644 index 0000000..e003660 --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFireWireMultiIsochReceive.h @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2008 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOFIREWIREMULTIISOCHRECEIVE_H_ +#define _IOKIT_IOFIREWIREMULTIISOCHRECEIVE_H_ + +class IOFireWireMultiIsochReceiveListener; +class IOFireWireMultiIsochReceivePacket; +class IOFireWireController; + +typedef IOReturn (*FWMultiIsochReceiveListenerCallback)(void *refcon, IOFireWireMultiIsochReceivePacket *pPacket); + +// These are the parameters clients can set which help us to optimize the mult-isoch-receiver +// polling interval, and memory resources +typedef struct FWMultiIsochReceiveListenerParamsStruct + { + // How much latency, from when the packet arrives to when the client is notified, can the client tolerate. + UInt32 maxLatencyInFireWireCycles; + + // In bits per second, the expected bit-rate of the incoming stream + UInt32 expectedStreamBitRate; + + // How long does the client expect to hold onto packets objects before returning them back to the receiver + UInt32 clientPacketReturnLatencyInFireWireCycles; + }FWMultiIsochReceiveListenerParams; + +/*! @class IOFireWireMultiIsochReceiveListener +*/ + +class IOFireWireMultiIsochReceiveListener : public OSObject + { + friend class IOFireWireLink; + + protected: + OSDeclareDefaultStructors(IOFireWireMultiIsochReceiveListener) + bool init(IOFireWireController *fwController, + UInt32 receiveChannel, + FWMultiIsochReceiveListenerCallback callback, + void *pCallbackRefCon, + FWMultiIsochReceiveListenerParams *pListenerParams); + void free(); + public: + static IOFireWireMultiIsochReceiveListener *create(IOFireWireController *fwController, + UInt32 channel, + FWMultiIsochReceiveListenerCallback callback, + void *pCallbackRefCon, + FWMultiIsochReceiveListenerParams *pListenerParams); + + // Call this to activate the listener + IOReturn Activate(); + + // Call this to deactivate the listener + IOReturn Deactivate(); + + // Call this to modify the callback/refcon pointers. Only call this when not activated! + IOReturn SetCallback(FWMultiIsochReceiveListenerCallback callback, + void *pCallbackRefCon); + + // Accessors + inline UInt32 getReceiveChannel(void) {return fChannel;}; + inline FWMultiIsochReceiveListenerCallback getCallback(void){return fClientCallback;}; + inline void * getRefCon(void){return fClientCallbackRefCon;}; + inline bool getActivatedState(void) {return fActivated;}; + + protected: + IOFireWireController *fControl; + UInt32 fChannel; + FWMultiIsochReceiveListenerCallback fClientCallback; + void *fClientCallbackRefCon; + bool fActivated; + FWMultiIsochReceiveListenerParams *fListenerParams; + }; + +#define kMaxRangesPerMultiIsochReceivePacket 6 + +/*! @class IOFireWireMultiIsochReceivePacket +*/ + +class IOFireWireMultiIsochReceivePacket : public OSObject + { + OSDeclareDefaultStructors(IOFireWireMultiIsochReceivePacket) + bool init(IOFireWireController *fwController); + void free(); + public: + static IOFireWireMultiIsochReceivePacket *create(IOFireWireController *fwController); + + // The clients who are passed this packet by the + // multi-isoch receiver calling their callback + // MUST call clientDone() on this packet to + // return it back for reuse! + void clientDone(void); + + UInt32 isochChannel(void); + UInt32 packetReceiveTime(void); + + UInt32 isochPayloadSize(void); // The size of just the isoch payload, not including header/trailer quads. + inline UInt32 isochPacketSize(void) {return isochPayloadSize()+8; }; // The size of the packet, including header/trailer quads. + + // This returns a memory descriptor to the client. The client must call complete(), and release() on the + // memory descriptor when done. + IOMemoryDescriptor *createMemoryDescriptorForRanges(void); + + // These should be treated as read-only by clients, + // as should the data contained in these buffers! + IOAddressRange ranges[kMaxRangesPerMultiIsochReceivePacket] ; + UInt32 numRanges; + + // These should be treated private for clients! + // Messing with them will screw up the bookkeepping + // in the Multi-Isoch Receiver! + UInt32 numClientReferences; + void* elements[kMaxRangesPerMultiIsochReceivePacket]; + + protected: + IOFireWireController *fControl; + }; + +#endif \ No newline at end of file diff --git a/QualcommWireless/include/IOKit/firewire/IOFireWireNub.h b/QualcommWireless/include/IOKit/firewire/IOFireWireNub.h new file mode 100644 index 0000000..39762ce --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFireWireNub.h @@ -0,0 +1,293 @@ +/* + * Copyright (c) 1998-2002 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * + * IOFireWireNub.h + * + * + * Note: IOFWCommand(s) are allocated by methods in this class. + * The remaining methods to setup and submit IOFWCommands are defined in + * IOFWCommand.h + */ +#ifndef _IOKIT_IOFIREWIRENUB_H +#define _IOKIT_IOFIREWIRENUB_H + +// public +#include +#include +#include + +class IOFireWireController; +class IOFireWireBus; +class IOConfigDirectory; +class IOFireWireNub; +class IOFireWireDevice; +class IOFireWireUnit; +class IOFWSimplePhysicalAddressSpace; +class IOFWSimpleContiguousPhysicalAddressSpace; + +enum TerminationState +{ + kNotTerminated = 0, + kNeedsTermination, + kTerminated +}; + +#pragma mark - + +/*! + @class IOFireWireNubAux +*/ + +class IOFireWireNubAux : public OSObject +{ + OSDeclareDefaultStructors(IOFireWireNubAux) + + friend class IOFireWireNub; + +protected: + + IOFireWireNub * fPrimary; + TerminationState fTerminationState; + + /*! + @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + + struct ExpansionData { }; + + /*! + @var reserved + Reserved for future use. (Internal use only) + */ + + ExpansionData * reserved; + + virtual bool init( IOFireWireNub * primary ); + virtual void free(void) APPLE_KEXT_OVERRIDE; + + virtual UInt32 hopCount( IOFireWireNub * nub ); + virtual UInt32 hopCount( void ); + + virtual TerminationState getTerminationState( void ); + virtual void setTerminationState( TerminationState state ); + + virtual bool isPhysicalAccessEnabled( void ); + + virtual IOFWSimpleContiguousPhysicalAddressSpace * createSimpleContiguousPhysicalAddressSpace( vm_size_t size, IODirection direction ); + + virtual IOFWSimplePhysicalAddressSpace * createSimplePhysicalAddressSpace( vm_size_t size, IODirection direction ); + +private: + OSMetaClassDeclareReservedUnused(IOFireWireNubAux, 0); + OSMetaClassDeclareReservedUnused(IOFireWireNubAux, 1); + OSMetaClassDeclareReservedUnused(IOFireWireNubAux, 2); + OSMetaClassDeclareReservedUnused(IOFireWireNubAux, 3); + OSMetaClassDeclareReservedUnused(IOFireWireNubAux, 4); + OSMetaClassDeclareReservedUnused(IOFireWireNubAux, 5); + OSMetaClassDeclareReservedUnused(IOFireWireNubAux, 6); + OSMetaClassDeclareReservedUnused(IOFireWireNubAux, 7); + OSMetaClassDeclareReservedUnused(IOFireWireNubAux, 8); + OSMetaClassDeclareReservedUnused(IOFireWireNubAux, 9); + OSMetaClassDeclareReservedUnused(IOFireWireNubAux, 10); + OSMetaClassDeclareReservedUnused(IOFireWireNubAux, 11); + OSMetaClassDeclareReservedUnused(IOFireWireNubAux, 12); + OSMetaClassDeclareReservedUnused(IOFireWireNubAux, 13); + OSMetaClassDeclareReservedUnused(IOFireWireNubAux, 14); + OSMetaClassDeclareReservedUnused(IOFireWireNubAux, 15); + +}; + +#pragma mark - + +/*! @class IOFireWireNub +*/ +class IOFireWireNub : public IOService +{ + OSDeclareAbstractStructors(IOFireWireNub) + + friend class IOFireWireController; + friend class IOFireWireNubAux; + friend class IOFireWireDeviceAux; + friend class IOFireWireUnitAux; + friend class IOFireWireDevice; + friend class IOFireWireUnit; + +/*------------------Useful info about device (also available in the registry)--------*/ +protected: + int fDeviceSpeed; // Max supported by device + int fCommsSpeed; // Max speed this node can communicate with device + UInt16 fNodeID; // Current node ID (could change after bus reset!) + UInt16 fLocalNodeID; // ID of the local node (could change after bus reset!) + UInt32 fGeneration; // ID Of bus topology that fNodeID is valid for. + CSRNodeUniqueID fUniqueID; // Device's globally unique ID (never changes) + mach_timespec_t fAsyncTimeout; // Guesstimate of how long to wait for response + // from device when making async requests + // Different values for quad/block transfers? + // OS8 FW has 40/100 mSec. + + int fMaxReadPackLog; + int fMaxWritePackLog; + int fMaxReadROMPackLog; + + IOFireWireController *fControl; + IOConfigDirectory *fDirectory; + + UInt32 fNodeFlags; + + OSSet * fConfigDirectorySet; + + IOFireWireNubAux * fAuxiliary; + +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + struct ExpansionData { }; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + + virtual void free(void) APPLE_KEXT_OVERRIDE; + +/*------------------Methods provided to FireWire device clients-----------------------*/ +public: + + // Get nodeID and bus generation info + IOReturn getNodeIDGeneration(UInt32 &generation, UInt16 &nodeID, UInt16 &localID) const; + IOReturn getNodeIDGeneration(UInt32 &generation, UInt16 &nodeID) const; + + // How fast can this system talk to the node? + virtual IOFWSpeed FWSpeed() const; + + // How fast can this node talk to another node? + virtual IOFWSpeed FWSpeed(const IOFireWireNub *dst) const; + + // How big (as a power of two) can packets sent to/received from the node be? + virtual int maxPackLog(bool forSend) const; + + // How big (as a power of two) can packets sent to/received from a specified address in the node be? + virtual int maxPackLog(bool forSend, FWAddress address) const; + + // How big (as a power of two) can packets sent from this node to dst node/received from dst be? + virtual int maxPackLog(bool forSend, const IOFireWireNub *dst) const; + + // Set maximum packet size nub can handle + virtual void setMaxPackLog(bool forSend, bool forROM, int maxPackLog); + + /* + * Create various FireWire commands to send to the device + */ + virtual IOFWReadCommand *createReadCommand(FWAddress devAddress, IOMemoryDescriptor *hostMem, + FWDeviceCallback completion=NULL, void *refcon=NULL, + bool failOnReset=false); + virtual IOFWReadQuadCommand *createReadQuadCommand(FWAddress devAddress, UInt32 *quads, int numQuads, + FWDeviceCallback completion=NULL, void *refcon=NULL, + bool failOnReset=false); + + virtual IOFWWriteCommand *createWriteCommand(FWAddress devAddress, IOMemoryDescriptor *hostMem, + FWDeviceCallback completion=NULL, void *refcon=NULL, + bool failOnReset=false); + virtual IOFWWriteQuadCommand *createWriteQuadCommand(FWAddress devAddress, UInt32 *quads, int numQuads, + FWDeviceCallback completion=NULL, void *refcon=NULL, + bool failOnReset=false); + + // size is 1 for 32 bit compare, 2 for 64 bit. + virtual IOFWCompareAndSwapCommand *createCompareAndSwapCommand(FWAddress devAddress, + const UInt32 *cmpVal, const UInt32 *newVal, int size, + FWDeviceCallback completion=NULL, void *refcon=NULL, + bool failOnReset=false); + /* + * Create local FireWire address spaces for the device to access + */ + virtual IOFWPhysicalAddressSpace *createPhysicalAddressSpace(IOMemoryDescriptor *mem); + virtual IOFWPseudoAddressSpace *createPseudoAddressSpace(FWAddress *addr, UInt32 len, + FWReadCallback reader, FWWriteCallback writer, void *refcon); + + /* + * Get Config directory for nub + * Device nub directory is root directory, Unit nub directory is Unit directory. + * + * Depricated use getConfigDirectoryRef + * + */ + + virtual IOReturn getConfigDirectory(IOConfigDirectory *&dir); + + /* + * Get bus for nub + */ + IOFireWireBus * getBus() const; + + IOFireWireController * getController() const; + + const CSRNodeUniqueID &getUniqueID() const; + + /* + * Standard nub initialization + */ + virtual bool init(OSDictionary * propTable) APPLE_KEXT_OVERRIDE; + + virtual void setNodeFlags( UInt32 flags ); + virtual UInt32 getNodeFlags( void ); + virtual void clearNodeFlags( UInt32 flags ); + + virtual IOReturn setConfigDirectory( IOConfigDirectory *directory ); + + virtual IOReturn getConfigDirectoryRef( IOConfigDirectory *&dir ); + + inline UInt32 hopCount( IOFireWireNub * nub ) + { return fAuxiliary->hopCount( nub ); } + + inline UInt32 hopCount( void ) + { return fAuxiliary->hopCount(); } + + inline TerminationState getTerminationState( void ) + { return fAuxiliary->getTerminationState(); } + +protected: + inline void setTerminationState( TerminationState state ) + { fAuxiliary->setTerminationState( state ); } + + virtual IOFireWireNubAux * createAuxiliary( void ); + +public: + + inline bool isPhysicalAccessEnabled( void ) + { return fAuxiliary->isPhysicalAccessEnabled(); } + + inline IOFWSimpleContiguousPhysicalAddressSpace * createSimpleContiguousPhysicalAddressSpace( vm_size_t size, IODirection direction ) + { return fAuxiliary->createSimpleContiguousPhysicalAddressSpace( size, direction ); } + + inline IOFWSimplePhysicalAddressSpace * createSimplePhysicalAddressSpace( vm_size_t size, IODirection direction ) + { return fAuxiliary->createSimplePhysicalAddressSpace( size, direction ); } + +private: + OSMetaClassDeclareReservedUsed(IOFireWireNub, 0); + OSMetaClassDeclareReservedUsed(IOFireWireNub, 1); + OSMetaClassDeclareReservedUnused(IOFireWireNub, 2); + OSMetaClassDeclareReservedUnused(IOFireWireNub, 3); + +}; + +#endif /* ! _IOKIT_IOFIREWIRENUB_H */ diff --git a/QualcommWireless/include/IOKit/firewire/IOFireWirePowerManager.h b/QualcommWireless/include/IOKit/firewire/IOFireWirePowerManager.h new file mode 100644 index 0000000..e0a141a --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFireWirePowerManager.h @@ -0,0 +1,78 @@ +/* + * Copyright (c) 1998-2002 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOFIREWIREPOWERMANAGER_H +#define _IOKIT_IOFIREWIREPOWERMANAGER_H + +#include + +#include +#include + +class IOFireWireController; + +/*! @class IOFireWirePowerManager +*/ + +class IOFireWirePowerManager : public OSObject +{ + OSDeclareAbstractStructors(IOFireWirePowerManager); + +protected: + +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + struct ExpansionData { }; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + + IOFireWireController * fControl; + + UInt32 fMaximumDeciwatts; + UInt32 fAllocatedDeciwatts; + +public: + static IOFireWirePowerManager * createWithController( IOFireWireController * controller ); + + virtual bool initWithController( IOFireWireController * controller ); + + virtual void setMaximumDeciwatts( UInt32 deciwatts ); + virtual IOReturn allocateDeciwatts( UInt32 deciwatts ); + virtual void deallocateDeciwatts( UInt32 deciwatts ); + +private: + OSMetaClassDeclareReservedUnused(IOFireWirePowerManager, 0); + OSMetaClassDeclareReservedUnused(IOFireWirePowerManager, 1); + OSMetaClassDeclareReservedUnused(IOFireWirePowerManager, 2); + OSMetaClassDeclareReservedUnused(IOFireWirePowerManager, 3); + OSMetaClassDeclareReservedUnused(IOFireWirePowerManager, 4); + OSMetaClassDeclareReservedUnused(IOFireWirePowerManager, 5); + OSMetaClassDeclareReservedUnused(IOFireWirePowerManager, 6); + OSMetaClassDeclareReservedUnused(IOFireWirePowerManager, 7); + OSMetaClassDeclareReservedUnused(IOFireWirePowerManager, 8); + OSMetaClassDeclareReservedUnused(IOFireWirePowerManager, 9); +}; + +#endif \ No newline at end of file diff --git a/QualcommWireless/include/IOKit/firewire/IOFireWireUnit.h b/QualcommWireless/include/IOKit/firewire/IOFireWireUnit.h new file mode 100644 index 0000000..6509b94 --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOFireWireUnit.h @@ -0,0 +1,167 @@ +/* + * Copyright (c) 1998-2002 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * + * IOFireWireUnit.h + * + * + */ +#ifndef _IOKIT_IOFIREWIREUNIT_H +#define _IOKIT_IOFIREWIREUNIT_H + +// public +#include + +class IOFireWireDevice; +class IOFireWireUnit; + +#pragma mark - + +/*! + @class IOFireWireUnitAux +*/ + +class IOFireWireUnitAux : public IOFireWireNubAux +{ + OSDeclareDefaultStructors(IOFireWireUnitAux) + + friend class IOFireWireUnit; + +protected: + + /*! + @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + + struct ExpansionData { }; + + /*! + @var reserved + Reserved for future use. (Internal use only) + */ + + ExpansionData * reserved; + + virtual bool init( IOFireWireUnit * primary ); + virtual void free(); + + virtual bool isPhysicalAccessEnabled( void ); + + virtual IOFWSimpleContiguousPhysicalAddressSpace * createSimpleContiguousPhysicalAddressSpace( vm_size_t size, IODirection direction ); + + virtual IOFWSimplePhysicalAddressSpace * createSimplePhysicalAddressSpace( vm_size_t size, IODirection direction ); + +private: + OSMetaClassDeclareReservedUnused(IOFireWireUnitAux, 0); + OSMetaClassDeclareReservedUnused(IOFireWireUnitAux, 1); + OSMetaClassDeclareReservedUnused(IOFireWireUnitAux, 2); + OSMetaClassDeclareReservedUnused(IOFireWireUnitAux, 3); + +}; + +#pragma mark - + +/*! @class IOFireWireUnit +*/ +class IOFireWireUnit : public IOFireWireNub +{ + OSDeclareDefaultStructors(IOFireWireUnit) + + friend class IOFireWireUnitAux; + friend class IOFireWireDevice; + +protected: + IOFireWireDevice *fDevice; // The device unit is part of + +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + struct ExpansionData { }; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + +/*------------------Methods provided to FireWire device clients-----------------------*/ +public: + + virtual bool init(OSDictionary *propTable, IOConfigDirectory *directory); + + /* + * Standard nub initialization + */ + virtual bool attach(IOService * provider ); + virtual void free(); + + /* + * Matching language support + * Match on the following properties of the unit: + * Vendor_ID + * GUID + * Unit_Spec_ID + * Unit_SW_Version + */ + virtual bool matchPropertyTable(OSDictionary * table); + + + virtual IOReturn message( UInt32 type, IOService * provider, void * argument ); + + // Override handleOpen() and handleClose() to pass on to device + virtual bool handleOpen( IOService * forClient, + IOOptionBits options, + void * arg ); + + virtual void handleClose( IOService * forClient, + IOOptionBits options ); + + virtual void setNodeFlags( UInt32 flags ); + virtual void clearNodeFlags( UInt32 flags ); + virtual UInt32 getNodeFlags( void ); + + virtual IOReturn setConfigDirectory( IOConfigDirectory *directory ); + + /* + * Create local FireWire address spaces for the device to access + */ + virtual IOFWPhysicalAddressSpace *createPhysicalAddressSpace(IOMemoryDescriptor *mem); + virtual IOFWPseudoAddressSpace *createPseudoAddressSpace(FWAddress *addr, UInt32 len, + FWReadCallback reader, FWWriteCallback writer, void *refcon); + +protected: + + virtual IOFireWireNubAux * createAuxiliary( void ); + +public: + void setMaxSpeed( IOFWSpeed speed ); + +protected: + void terminateUnit( void ); + static void terminateUnitThreadFunc( void * refcon ); + +private: + OSMetaClassDeclareReservedUnused(IOFireWireUnit, 0); + OSMetaClassDeclareReservedUnused(IOFireWireUnit, 1); + +}; + +#endif /* ! _IOKIT_IOFIREWIREDEVICE_H */ diff --git a/QualcommWireless/include/IOKit/firewire/IOLocalConfigDirectory.h b/QualcommWireless/include/IOKit/firewire/IOLocalConfigDirectory.h new file mode 100644 index 0000000..953d5f9 --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IOLocalConfigDirectory.h @@ -0,0 +1,110 @@ +/* +* Copyright (c) 1998-2002 Apple Computer, Inc. All rights reserved. +* +* @APPLE_LICENSE_HEADER_START@ +* +* The contents of this file constitute Original Code as defined in and +* are subject to the Apple Public Source License Version 1.1 (the +* "License"). You may not use this file except in compliance with the +* License. Please obtain a copy of the License at +* http://www.apple.com/publicsource and read it before using this file. +* +* This Original Code and all software distributed under the License are +* distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER +* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, +* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the +* License for the specific language governing rights and limitations +* under the License. +* +* @APPLE_LICENSE_HEADER_END@ +*/ + +#ifndef __IOLOCALCONFIGDIRECTORY_H__ +#define __IOLOCALCONFIGDIRECTORY_H__ + +#include +#include +#include +#include + +class OSArray; +class OSData; +class IOFireWireController; +class IOFWUserObjectExporter ; + +/*! @class IOLocalConfigDirectory +*/ +class IOLocalConfigDirectory : public IOConfigDirectory +{ + friend class IOFireWireController; + friend class IOFireWireUserClient ; + + OSDeclareDefaultStructors(IOLocalConfigDirectory); + +protected: + OSArray *fEntries; // Entries for this directory. + OSData *fROM; // Local ROM, if compiled. + UInt32 fHeader; // Num entries and CRC. + +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + struct ExpansionData { }; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + + virtual bool init(void) APPLE_KEXT_OVERRIDE; + virtual void free(void) APPLE_KEXT_OVERRIDE; + + virtual const UInt32 *getBase(void) APPLE_KEXT_OVERRIDE; + virtual IOConfigDirectory *getSubDir(int start, int type) APPLE_KEXT_OVERRIDE; + +public: + static IOLocalConfigDirectory *create(); + + /*! + @function update + makes sure that the ROM has at least the specified capacity, + and that the ROM is uptodate from its start to at least the + specified quadlet offset. + @result kIOReturnSuccess if the specified offset is now + accessable at romBase[offset]. + */ + virtual IOReturn update(UInt32 offset, const UInt32 *&romBase) APPLE_KEXT_OVERRIDE; + + virtual IOReturn compile(OSData *rom); + + // All flavours of addEntry eat a retain of the desc string + virtual IOReturn addEntry(int key, UInt32 value, OSString *desc = NULL); + virtual IOReturn addEntry(int key, IOLocalConfigDirectory *value, + OSString *desc = NULL); + virtual IOReturn addEntry(int key, OSData *value, OSString *desc = NULL); + virtual IOReturn addEntry(int key, FWAddress value, OSString *desc = NULL); + virtual IOReturn removeSubDir(IOLocalConfigDirectory *value); + const OSArray *getEntries() const; + + virtual IOReturn getIndexValue(int index, IOConfigDirectory *&value) APPLE_KEXT_OVERRIDE; + +protected: + + virtual const UInt32 * lockData( void ) APPLE_KEXT_OVERRIDE; + virtual void unlockData( void ) APPLE_KEXT_OVERRIDE; + virtual IOReturn updateROMCache( UInt32 offset, UInt32 length ) APPLE_KEXT_OVERRIDE; + virtual IOReturn checkROMState( void ) APPLE_KEXT_OVERRIDE; + + // call eats a retain count + virtual IOReturn addEntry(OSString *desc); + + IOReturn incrementGeneration( void ); + static void exporterCleanup( const OSObject * self, IOFWUserObjectExporter * exporter ) ; + +private: + OSMetaClassDeclareReservedUsed(IOLocalConfigDirectory, 0); + OSMetaClassDeclareReservedUnused(IOLocalConfigDirectory, 1); + OSMetaClassDeclareReservedUnused(IOLocalConfigDirectory, 2); +}; + +#endif /* __IOLOCALCONFIGDIRECTORY_H__ */ diff --git a/QualcommWireless/include/IOKit/firewire/IORemoteConfigDirectory.h b/QualcommWireless/include/IOKit/firewire/IORemoteConfigDirectory.h new file mode 100644 index 0000000..f5438ae --- /dev/null +++ b/QualcommWireless/include/IOKit/firewire/IORemoteConfigDirectory.h @@ -0,0 +1,92 @@ +/* + * Copyright (c) 1998-2002 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef __IOREMOTECONFIGDIRECTORY_H__ +#define __IOREMOTECONFIGDIRECTORY_H__ + +#include +#include + +#include +#include + +#include "IOFireWireROMCache.h" + +class OSString; +class OSIterator; +class IOFireWireDevice; + +/*! @class IORemoteConfigDirectory +*/ +class IORemoteConfigDirectory : public IOConfigDirectory +{ + OSDeclareDefaultStructors(IORemoteConfigDirectory); + +protected: + IOFireWireROMCache *fROM; // Our cache of the ROM + +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + struct ExpansionData { }; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + + virtual bool initWithOwnerOffset(IOFireWireROMCache *rom, + int start, int type); + virtual void free(void) APPLE_KEXT_OVERRIDE; + + virtual const UInt32 *getBase(void) APPLE_KEXT_OVERRIDE; + virtual IOConfigDirectory *getSubDir(int start, int type) APPLE_KEXT_OVERRIDE; + +public: + static IOConfigDirectory *withOwnerOffset(IOFireWireROMCache *rom, + int start, int type); + + + /*! + @function update + makes sure that the ROM has at least the specified capacity, + and that the ROM is uptodate from its start to at least the + specified quadlet offset. + @result kIOReturnSuccess if the specified offset is now + accessable at romBase[offset]. + */ + virtual IOReturn update(UInt32 offset, const UInt32 *&romBase) APPLE_KEXT_OVERRIDE; + +protected: + + virtual const UInt32 * lockData( void ) APPLE_KEXT_OVERRIDE; + virtual void unlockData( void ) APPLE_KEXT_OVERRIDE; + virtual IOReturn updateROMCache( UInt32 offset, UInt32 length ) APPLE_KEXT_OVERRIDE; + virtual IOReturn checkROMState( void ) APPLE_KEXT_OVERRIDE; + +private: + OSMetaClassDeclareReservedUnused(IORemoteConfigDirectory, 0); + OSMetaClassDeclareReservedUnused(IORemoteConfigDirectory, 1); + OSMetaClassDeclareReservedUnused(IORemoteConfigDirectory, 2); +}; + + +#endif /* __IOREMOTECONFIGDIRECTORY_H__ */ diff --git a/QualcommWireless/include/IOKit/graphics/GTrace.hpp b/QualcommWireless/include/IOKit/graphics/GTrace.hpp new file mode 100644 index 0000000..5645918 --- /dev/null +++ b/QualcommWireless/include/IOKit/graphics/GTrace.hpp @@ -0,0 +1,392 @@ +// +// GTrace.hpp +// +// Created by bparke on 3/17/17. +// + +#ifndef GTrace_hpp +#define GTrace_hpp + +#include + +#include +#include +#include + +#include "IOKit/graphics/GTraceTypes.hpp" + +// Kernel clients that haven't enabled C++11 yet +#if !GTRACE_ARCHAIC_CPP +#include +#endif + +// TODO: Provide example of GTRACE() macro use. + +// ---------------------------------------------------------------------------- +// Main tracing Macros +// ---------------------------------------------------------------------------- + +// Use this to encode t0, for automatic decoding and start/end pairing +// Function has been moved and renamed, define old macro in terms of new +#define GTFuncTag(i, t, tag) GPACKFUNCTAG(i, t, tag) + +#define GTRACERAW(tracer, t0, a0, t1, a1, t2, a2, t3, a3) do{ \ + if (static_cast(tracer)){ \ + (tracer)->recordToken(__LINE__, \ + MAKEGTRACETAG(t0), MAKEGTRACEARG(a0), \ + MAKEGTRACETAG(t1), MAKEGTRACEARG(a1), \ + MAKEGTRACETAG(t2), MAKEGTRACEARG(a2), \ + MAKEGTRACETAG(t3), MAKEGTRACEARG(a3)); \ + } \ +}while(0) + +// Convenience macro, used when all args are ordinary hex data fields. +#define GTRACERAWNT(tracer, a0, a1, a2, a3) \ + GTRACERAW(tracer, 0, a0, 0, a1, 0, a2, 0, a3) + +#define GTRACE(tracer, fid, ft, t0, a0, t1, a1, t2, a2, t3, a3) \ + GTRACERAW(tracer, GTFuncTag(fid, ft, t0), a0, t1, a1, t2, a2, t3, a3) + +// Convenience macro, used when all as are ordinary hex data fields. +#define GTRACE_NT(tracer, fid, ft, a0, a1, a2, a3) \ + GTRACERAW(tracer, GTFuncTag(fid, ft, 0), a0, 0, a1, 0, a2, 0, a3) + +// GTrace for calls that are slow. The GTRACE_IFSLOW_START records the current +// time, then GTRACE_IFSLOW_END will record an entry if the duration between +// start and end is > the threshold. Note `delayat` is in absolute time units. +#define GTRACE_IFSLOW_START(tracer, fid) do { \ + const uint64_t _gtrace_ ## fid ## _start_ \ + = ((static_cast(tracer)) ? mach_continuous_time() : 0) + +// Matches the do{ from GTRACE_IFSLOW_START, must be in same scope +#define GTRACE_IFSLOW_END(tracer, fid, ft, t0, a0, t1, a1, t2, a2, delayat) \ + if(static_cast(tracer)) { \ + const uint64_t _gtrace_ifslow_now_ = mach_continuous_time(); \ + const uint64_t _gtrace_delta_ \ + = _gtrace_ifslow_now_ - _gtrace_ ## fid ## _start_; \ + if(_gtrace_delta_ > (delayat)) \ + (tracer)->recordToken(__LINE__, GTFuncTag(fid, ft, 0), \ + _gtrace_delta_, t0, a0, t1, a1, t2, a2, \ + _gtrace_ifslow_now_); \ + } \ +}while(0) + +// Create a pair of GTrace records but only record them if the time duration +// was > than the absolute time threshold given in GTRACE_DEFER_END +#define GTRACE_DEFER_START(tracer, t0, a0, t1, a1, t2, a2, t3, a3) \ +do{ \ + const GTraceEntry _gtrace_start_ = (static_cast(tracer)) \ + ? (tracer)->formatToken(__LINE__, t0, a0, t1, a1, t2, a2, t3, a3) \ + : GTraceEntry() + +// Matches the do{ from GTRACE_DEFER_START, must be in same block scope +#define GTRACE_DEFER_END(tracer, t0, a0, t1, a1, t2, a2, t3, a3, delayat) \ + if (static_cast(tracer)) { \ + const uint64_t _gtrace_defer_now_ = mach_continuous_time(); \ + const uint64_t _gtrace_delta_ \ + = _gtrace_defer_now_ - _gtrace_start_.timestamp(); \ + if(_gtrace_delta_ > (delayat)) { \ + (tracer)->recordToken(_gtrace_start_); \ + (tracer)->recordToken(__LINE__, t0, a0, t1, a1, \ + t2, a2, t3, a3, _gtrace_defer_now_); \ + } \ + } \ +}while(0) + +#if GTRACE_IMPL +// Macro used by IOGraphicsFamily internally, not required for third party use. +#define GTRACE_LOG_SYNCH(tracer, t0) do { \ + if (static_cast(tracer)) { \ + const uint32_t __gtrace_log_sync_ind__ = tracer->synchIndex(); \ + tracer->recordToken(__LINE__, \ + MAKEGTRACETAG(t0),static_cast(__gtrace_log_sync_ind__), \ + 0, 0, 0, 0, 0, 0); \ + IOLog("GTrace synchronization point %x\n", __gtrace_log_sync_ind__); \ + } \ +}while(0) +#endif + +class IOMemoryDescriptor; +class IOMemoryMap; +class GTraceBuffer final : public OSObject +{ + OSDeclareFinalStructors(GTraceBuffer); + + using super = OSObject; + +public: + + // sizeP is an in/out variable, size will be <= 16KiB + // The Breadcrumb function callout is a clean context that does not hold a + // lock. + using breadcrumb_func + = IOReturn (*)(void* context, void* buffer, uint16_t* sizeP); + +#if !GTRACE_ARCHAIC_CPP + using shared_type = iog::OSSharedObject; + + /*! + @function make + @abstract Make a shared object of a new GTrace buffer. + @discussion Creates an optimised lockfree algorithm for storing 64byte + records into a ring buffer. This buffer can be dumped by + `iogdiagnose` and then decoded using + /AppleInternal/AppleGraphicsControl/IOGDiagnoseDecode. + + In addition to the ring buffer the client can also provide a + function that will copy up to 16KiB of additional data used by + the client's decode module. It is much better if this func is + LOCKFREE. If the function does not return within 1 second we + may abort the thread reading the data and discard the buffer. + Thus it is a data-looser to stall the fetch thread for too + long. + + The breadcrumb_func is not called with GTraceBuffer locks + held. + @param bufferName: Max 32 byte C string copied into fetch header. + @param decoderName: Max 32 byte C string copied into fetch header, used by + IOGDiagnoseDecode to find a decode module in + /AppleInternal/AppleGraphicsControl/IOGDiagnose_modules directory. + @param lineCount: Number of lines to store in ring buffer. Line count will + be rounded up to a power of two and is bounded by + kGTraceMinimumLineCount and kGTraceMaximumLineCount. + @param bcf: breadcrumb_func. May be null. Function to call when the buffer + is being fetched, to be used by your decode module. See discussion. + @param context: Context to pass to the bcf function. + @result OSSharedObject with the new created buffer. An empty + buffer on failure. + */ + static shared_type make( + const char* decoderName, const char* bufferName, + const uint32_t lineCount, breadcrumb_func bcf, void* context); + + /*! @function destroy + @abstract Destroy a buffer shared object created with make. + @discussion When a client is done with the gtrace buffer use + destroy(iog::move()) to destroy your shared object and + stop further calls to the breadcrumb func. This will destroy your + reference to the buffer. Before completing destruction the breadcrumb + function if any will be called only once and then never called again + after on return. The breadcrumb function is never called with any + internal buffer locks held. The GTraceBuffer guarantees that no + further calls to the breadcrumb function will occur once this call + completes. + + Note it is not necessary to destroy every copy of the shared_type + (OSSharedObject), rather only call destroy when you no + longer wish any further breadcrumb callouts during teardown of your + master objects, essentially it is symetric with make() calls. + @param bso An rvalue reference to the buffer shared object. + */ + static void destroy(shared_type&& bso); +#endif // !GTRACE_ARCHAIC_CPP + +#if GTRACE_ARCHAIC_CPP || GTRACE_IMPL + /*! @function makeArchaicCpp + @abstract Equivalent to make for archaic pre-C++11 projects. See make + for more details. + */ + static GTraceBuffer* makeArchaicCpp( + const char* decoderName, const char* bufferName, + const uint32_t lineCount, breadcrumb_func bcf, void* context) + __attribute__((deprecated ("Use C++11 and GTraceBuffer::make."))); + + /*! @function destroyArchaicCpp + @abstract Equivalent to destroy for archaic pre-C++11 projects. See + destroy for more details. + @discussion Similar to destroy, destroyArchaicCpp releases one reference + on the buffer. Clients must use destroyArchaicCpp once + (mirroring the call to makeArchaicCpp). + */ + static void destroyArchaicCpp(GTraceBuffer *buffer) + __attribute__((deprecated ("Use C++11 and GTraceBuffer::destroy."))); +#endif + + /*! @function formatToken + @abstract Format a token suitable for recording. + @discussion GTrace supports tokenized tracing. formatToken is used to + create a tokenized KTrace style entry suitable for inserting into the + ring buffer. Carefully written for C++ return value optimisation. + @param line The line number associated with the token + @param tag1 An implementation specific tag associated with arg1 + @param tag2 An implementation specific tag associated with arg2 + @param tag3 An implementation specific tag associated with arg3 + @param tag4 An implementation specific tag associated with arg4 + @param arg1 Component/implementation specific value. + @param arg2 Component/implementation specific value. + @param arg3 Component/implementation specific value. + @param arg4 Component/implementation specific value. + @param timestamp Supplied timestamp or current MCT + @result GTraceEntry structure filled in with given data. + */ + GTraceEntry formatToken(const uint16_t line, + const uint64_t tag1, const uint64_t arg1, + const uint64_t tag2, const uint64_t arg2, + const uint64_t tag3, const uint64_t arg3, + const uint64_t tag4, const uint64_t arg4, + const uint64_t timestamp = mach_continuous_time()); + + /*! @function recordToken + @abstract Add token data to token stream. + @discussion recordToken() takes a formatted GTraceEntry and writes it to + the ring buffer. + @param entry a const GTraceEntry reference to be atomically added to token + stream. + */ + void recordToken(const GTraceEntry& entry); + + /*! @function recordToken + @abstract Add the token data to the token stream + @discussion GTrace supports tokenized tracing. recordToken is used to + insert a tokenized KTrace style trace into the trace buffer. + @param line The line number associated with the token + @param tag1 An implementation specific tag associated with arg1 + @param tag2 An implementation specific tag associated with arg2 + @param tag3 An implementation specific tag associated with arg3 + @param tag4 An implementation specific tag associated with arg4 + @param arg1 Component/implementation specific value. + @param arg2 Component/implementation specific value. + @param arg3 Component/implementation specific value. + @param arg4 Component/implementation specific value. + @param timestamp Supplied timestamp or current MCT + */ + void recordToken(const uint16_t line, + const uint64_t tag1, const uint64_t arg1, + const uint64_t tag2, const uint64_t arg2, + const uint64_t tag3, const uint64_t arg3, + const uint64_t tag4, const uint64_t arg4, + const uint64_t timestamp = mach_continuous_time()) + { + recordToken(formatToken( + line, tag1, arg1, tag2, arg2, tag3, arg3, tag4, arg4, timestamp)); + } + +#if GTRACE_IMPL + /*! @function synchIndex + @abstract Publishes the current gtrace token index. + @discussion Used by Decode to synchronize between os_log and GTrace. I + have chosen to share the atomic next index operation though + it may cause decode ambiguity. It is very light weight. + */ + inline uint32_t synchIndex() const { return nextLine(); } + + /*! @function fetch + @abstract + Copies token buffer into provided memory descriptor. + @discussion + Copies the tokens data from the internal buffers into the provided + IOMemoryDescriptor, which must be prepared. Data is copied up to the + buffer size or the internal buffer size (which ever is less). Once the + data is copied a post processing step that obfuscates pointers is run. + @param bso OSSharedObject (i.e. shared_type) of GTraceBuffer + @param outDesc pointer to a prepared memory descriptor. + @result kIOReturnSuccess if the copy was successful, else an error. + */ + static IOReturn fetch(shared_type bso, IOMemoryDescriptor* outDesc); + +#ifndef _OPEN_SOURCE_ + /*! + @function makeUser + @abstract Record a user land gtrace buffer. + @discussion The block of memory provided by the client process will be + copied out in sysdiagnose by the iogdiagnose CLI tool. User buffers do + NOT support breadcrumb functions. However, a client process can + designate a block of the buffer as breadcrumb space, but note no + inter-locking will be provided between recording data into it and + fetch. Destroy buffers in the usual way. + @param bufMD: Block of memory provided by client process. + @param errP: Pointer to a IOReturn return code, only written on failure. + @result OSSharedObject with the new created buffer. An empty + buffer on failure. + */ + static shared_type makeUser(IOMemoryDescriptor *bufMD, IOReturn* errP); + +protected: + IOReturn copyOutUser(iog::OSUniqueObject map) const; +public: +#endif // !_OPEN_SOURCE_ + + + /* Getters for constant header information */ + size_t decoderName(char *name, const int len) const; // truncates + size_t bufferName(char *name, const int len) const; // truncates + uint32_t lineMask() const { return fLineMask; } + uint32_t lineCount() const { return fLineCount; } + uint32_t bufferID() const { return fHeader.fBufferID; } + +protected: + // OSObject overrides + bool init() APPLE_KEXT_OVERRIDE; + void free() APPLE_KEXT_OVERRIDE; + + // Internal functions + // See make() for details on arguments + IOReturn init( + const GTraceHeader& header, IOMemoryDescriptor* userBufferMD, + breadcrumb_func bcf, const void* context); + static shared_type makeFromHeader( + const GTraceHeader& header, IOMemoryDescriptor* userBufferMD, + breadcrumb_func bcf, void* context, IOReturn* errP); + static GTraceHeader buildHeader( + const char* decoderName, const char* bufferName, + const uint32_t count); + + inline uint32_t getNextLine(void) + { return atomic_fetch_add(&fNextLine, 1) & fLineMask; } + + // Complicated const casting because atomic_load will not take a const + // pointer, problem mixing C and C++, but C++ doesn't exist + // in the kernel yet and probably never will as it is deep STL. + inline uint32_t nextLine() const + { return atomic_load(&(const_cast(this)->fNextLine)); } + + IOReturn copyOut( + iog::OSUniqueObject map, OSData* bcData) const; + + // APIs for IODisplayWranglerUserClients.cpp, also used by unit tests + friend class IOGDiagnosticGTraceClient; + + /*! @function fetch + @abstract + Copies the token buffer into the provided memory descriptor. + IOGDiagnosticUserClient interface + @discussion + Copies the tokens data from the internal buffers into the provided + IOMemoryDescriptor, which must be prepared. Data is copied up to the + buffer size or the internal buffer size (which ever is less). Once the + data is copied a post processing step that obfuscates pointers is run. + + Releases buffer if the globally cached OSSharedObject is unique, + that is it has only one outstanding reference AND the complete buffer + was sucessfully copied into outDesc. + @param index Index of buffer in buffer pool cache + @param outDesc pointer to a prepared memory descriptor. + @result kIOReturnSuccess if the copy was successful, else an error. + */ + static IOReturn fetch(const uint32_t index, IOMemoryDescriptor* outDesc); + +private: + // Header that is copied out on demand + GTraceHeader fHeader; + atomic_uint_fast32_t fNextLine; + GTraceEntry* fBuffer; + +#ifndef _OPEN_SOURCE_ + IOMemoryDescriptor* fUserBufferMD; +#endif // !_OPEN_SOURCE_ + + breadcrumb_func fBreadcrumbFunc; + const void* fBCFContext; // Context to be passed to fBreadcrumbFunc + OSData* fBCData; + uint32_t fBCActiveCount; + + uint32_t fLineMask; + uint32_t fLineCount; + bool fWrapped; + + // Workaround for pre-C++11 clients, which can't see OSSharedObject. + shared_type fArchaicCPPSharedObjectHack; +#endif // GTRACE_IMPL +}; + +#endif /* GTrace_h */ diff --git a/QualcommWireless/include/IOKit/graphics/IOAccelClientConnect.h b/QualcommWireless/include/IOKit/graphics/IOAccelClientConnect.h new file mode 100644 index 0000000..1092d73 --- /dev/null +++ b/QualcommWireless/include/IOKit/graphics/IOAccelClientConnect.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOACCEL_CLIENT_CONNECT_H +#define _IOACCEL_CLIENT_CONNECT_H + + +/* +** The IOAccelerator service name +*/ +#define kIOAcceleratorClassName "IOAccelerator" + + +/* +** IOAccelerator public client types. Private client types start with +** kIOAccelNumClientTypes. +*/ +enum eIOAcceleratorClientTypes { + kIOAccelSurfaceClientType, + kIOAccelNumClientTypes, +#ifndef _OPEN_SOURCE_ + kIOAccelSurface2ClientType = 0x20 +#endif /* _OPEN_SOURCE_ */ +}; + + +#endif /* _IOACCEL_CLIENT_CONNECT_H */ + diff --git a/QualcommWireless/include/IOKit/graphics/IOAccelSurfaceConnect.h b/QualcommWireless/include/IOKit/graphics/IOAccelSurfaceConnect.h new file mode 100644 index 0000000..19dfe1b --- /dev/null +++ b/QualcommWireless/include/IOKit/graphics/IOAccelSurfaceConnect.h @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOACCEL_SURFACE_CONNECT_H +#define _IOACCEL_SURFACE_CONNECT_H + +#include +#include + +/* +** Surface visible region in device coordinates. +** +** num_rects: The number of rectangles in the rect array. If num_rects +** is zero the bounds rectangle is used for the visible rectangle. +** If num_rects is zero the surface must be completely contained +** by the device. +** +** bounds: The unclipped surface rectangle in device coords. Extends +** beyond the device bounds if the surface is not totally on +** the device. +** +** rect[]: An array of visible rectangles in device coords. If num_rects +** is non-zero only the region described by these rectangles is +** copied to the frame buffer during a flush operation. +*/ +typedef struct +{ + UInt32 num_rects; + IOAccelBounds bounds; + IOAccelBounds rect[0]; +} IOAccelDeviceRegion; + + +/* +** Determine the size of a region. +*/ +#define IOACCEL_SIZEOF_DEVICE_REGION(_rgn_) (sizeof(IOAccelDeviceRegion) + (_rgn_)->num_rects * sizeof(IOAccelBounds)) + + +/* +** Surface client public memory types. Private memory types start with +** kIOAccelNumSurfaceMemoryTypes. +*/ +enum eIOAccelSurfaceMemoryTypes { + kIOAccelNumSurfaceMemoryTypes +}; + + +/* +** Surface client public methods. Private methods start with +** kIOAccelNumSurfaceMethods. +*/ +enum eIOAccelSurfaceMethods { + kIOAccelSurfaceReadLockOptions, + kIOAccelSurfaceReadUnlockOptions, + kIOAccelSurfaceGetState, + kIOAccelSurfaceWriteLockOptions, + kIOAccelSurfaceWriteUnlockOptions, + kIOAccelSurfaceRead, + kIOAccelSurfaceSetShapeBacking, + + kIOAccelSurfaceSetIDMode, + kIOAccelSurfaceSetScale, + + kIOAccelSurfaceSetShape, + kIOAccelSurfaceFlush, + + kIOAccelSurfaceQueryLock, + + kIOAccelSurfaceReadLock, + kIOAccelSurfaceReadUnlock, + kIOAccelSurfaceWriteLock, + kIOAccelSurfaceWriteUnlock, + + kIOAccelSurfaceControl, + kIOAccelSurfaceSetShapeBackingAndLength, + + kIOAccelNumSurfaceMethods +}; + + +/* +** Option bits for IOAccelCreateSurface and the kIOAccelSurfaceSetIDMode method. +** The color depth field can take any value of the _CGSDepth enumeration. +*/ +typedef enum { + kIOAccelSurfaceModeColorDepth1555 = 0x00000003, + kIOAccelSurfaceModeColorDepth8888 = 0x00000004, +// kIOAccelSurfaceModeColorDepthRGB565 = 0x00000005, + kIOAccelSurfaceModeColorDepthYUV = 0x00000006, + kIOAccelSurfaceModeColorDepthYUV9 = 0x00000007, + kIOAccelSurfaceModeColorDepthYUV12 = 0x00000008, + kIOAccelSurfaceModeColorDepthYUV2 = 0x00000009, + kIOAccelSurfaceModeColorDepthBGRA32 = 0x0000000A, + +// kIOAccelSurfaceModeColorDepthRGBA64 = 0x0000000B, +// kIOAccelSurfaceModeColorDepthRGBAFloat64 = 0x0000000C, +// kIOAccelSurfaceModeColorDepthRGBAFloat128 = 0x0000000D, + +// kIOAccelSurfaceModeColorDepthYUV420 = 0x0000000E, + kIOAccelSurfaceModeColorDepth2101010 = 0x0000000F, + + kIOAccelSurfaceModeColorDepthBits = 0x0000000F, + + kIOAccelSurfaceModeStereoBit = 0x00000010, + kIOAccelSurfaceModeWindowedBit = 0x00000020, + +#ifndef _OPEN_SOURCE_ + kIOAccelSurfaceModeSurface2 = 0x00004000, +#endif /* _OPEN_SOURCE_ */ + kIOAccelSurfaceModeBeamSync = 0x00008000 +} eIOAccelSurfaceModeBits; + + +/* +** Options bits for IOAccelSetSurfaceShape and the kIOAccelSurfaceSetShape method. +*/ +typedef enum { + kIOAccelSurfaceShapeNone = 0x00000000, + kIOAccelSurfaceShapeNonBlockingBit = 0x00000001, + kIOAccelSurfaceShapeNonSimpleBit = 0x00000002, + kIOAccelSurfaceShapeIdentityScaleBit = 0x00000004, + kIOAccelSurfaceShapeFrameSyncBit = 0x00000008, + kIOAccelSurfaceShapeBeamSyncBit = 0x00000010, + kIOAccelSurfaceShapeStaleBackingBit = 0x00000020, + kIOAccelSurfaceShapeAssemblyBit = 0x00000040, + kIOAccelSurfaceShapeWaitEnabledBit = 0x00000080, + + /* wrong name, use kIOAccelSurfaceShapeNonBlockingBit */ + kIOAccelSurfaceShapeBlockingBit = kIOAccelSurfaceShapeNonBlockingBit +} eIOAccelSurfaceShapeBits; + +/* +** Return bits for the kIOAccelSurfaceGetState method. +*/ +typedef enum { + kIOAccelSurfaceStateNone = 0x00000000, + kIOAccelSurfaceStateIdleBit = 0x00000001 +} eIOAccelSurfaceStateBits; + +/* +** Option bits for the kIOAccelSurfaceSetScale method. +*/ +typedef enum { + kIOAccelSurfaceBeamSyncSwaps = 0x00000001, + kIOAccelSurfaceFixedSource = 0x00000002, + + kIOAccelSurfaceFiltering = 0x000000f0, + kIOAccelSurfaceFilterDefault = 0x00000000, + kIOAccelSurfaceFilterNone = 0x00000010, + kIOAccelSurfaceFilterLinear = 0x00000020 + +} eIOAccelSurfaceScaleBits; + +/* +** Option bits for the kIOAccelSurfaceLock methods. +*/ +typedef enum { + kIOAccelSurfaceLockInBacking = 0, + kIOAccelSurfaceLockInAccel = 1, + kIOAccelSurfaceLockInDontCare = 2, + kIOAccelSurfaceLockInMask = 0x00000003 +} eIOAccelSurfaceLockBits; + +#endif /* _IOACCEL_SURFACE_CONNECT_H */ + diff --git a/QualcommWireless/include/IOKit/graphics/IOAccelTypes.h b/QualcommWireless/include/IOKit/graphics/IOAccelTypes.h new file mode 100644 index 0000000..b28ae84 --- /dev/null +++ b/QualcommWireless/include/IOKit/graphics/IOAccelTypes.h @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOACCEL_TYPES_H +#define _IOACCEL_TYPES_H + +#include +#include + +#define IOACCEL_TYPES_REV 12 + +#if !defined(OSTYPES_K64_REV) && !defined(MAC_OS_X_VERSION_10_6) +#define IOACCELTYPES_10_5 1 +#endif + +/* Integer rectangle in device coordinates */ +typedef struct +{ + SInt16 x; + SInt16 y; + SInt16 w; + SInt16 h; +} IOAccelBounds; + +typedef struct +{ + SInt16 w; + SInt16 h; +} IOAccelSize; + +/* Surface information */ + +enum { + kIOAccelVolatileSurface = 0x00000001 +}; + +typedef struct +{ +#if IOACCELTYPES_10_5 + vm_address_t address[4]; +#else + mach_vm_address_t address[4]; +#endif /* IOACCELTYPES_10_5 */ + UInt32 rowBytes; + UInt32 width; + UInt32 height; + UInt32 pixelFormat; + IOOptionBits flags; + IOFixed colorTemperature[4]; + UInt32 typeDependent[4]; +} IOAccelSurfaceInformation; + +typedef struct +{ +#if IOACCELTYPES_10_5 + long x, y, w, h; + void *client_addr; + unsigned long client_row_bytes; +#else + SInt32 x, y, w, h; + mach_vm_address_t client_addr; + UInt32 client_row_bytes; +#endif /* IOACCELTYPES_10_5 */ +} IOAccelSurfaceReadData; + +typedef struct { + IOAccelBounds buffer; + IOAccelSize source; + UInt32 reserved[8]; +} IOAccelSurfaceScaling; + + +typedef SInt32 IOAccelID; + +enum { + kIOAccelPrivateID = 0x00000001 +}; + + +#endif /* _IOACCEL_TYPES_H */ + diff --git a/QualcommWireless/include/IOKit/graphics/IOAccelerator.h b/QualcommWireless/include/IOKit/graphics/IOAccelerator.h new file mode 100644 index 0000000..618d38d --- /dev/null +++ b/QualcommWireless/include/IOKit/graphics/IOAccelerator.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IO_ACCELERATOR_H +#define _IO_ACCELERATOR_H + +#include + +#include + +class IOAccelerator : public IOService +{ + OSDeclareDefaultStructors(IOAccelerator) + +public: + static IOReturn createAccelID(IOOptionBits options, IOAccelID * identifier); + static IOReturn retainAccelID(IOOptionBits options, IOAccelID identifier); + static IOReturn releaseAccelID(IOOptionBits options, IOAccelID identifier); + +}; + + +#endif /* _IO_ACCELERATOR_H */ + diff --git a/QualcommWireless/include/IOKit/graphics/IODisplay.h b/QualcommWireless/include/IOKit/graphics/IODisplay.h new file mode 100644 index 0000000..3ba8e15 --- /dev/null +++ b/QualcommWireless/include/IOKit/graphics/IODisplay.h @@ -0,0 +1,323 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IODISPLAY_H +#define _IOKIT_IODISPLAY_H + +#include +#include + +#include + +#include + +extern const OSSymbol * gIODisplayParametersKey; +extern const OSSymbol * gIODisplayGUIDKey; + +extern const OSSymbol * gIODisplayValueKey; +extern const OSSymbol * gIODisplayMinValueKey; +extern const OSSymbol * gIODisplayMaxValueKey; + +extern const OSSymbol * gIODisplayBrightnessProbeKey; +extern const OSSymbol * gIODisplayLinearBrightnessProbeKey; +extern const OSSymbol * gIODisplayContrastKey; +extern const OSSymbol * gIODisplayBrightnessKey; +extern const OSSymbol * gIODisplayLinearBrightnessKey; +extern const OSSymbol * gIODisplayUsableLinearBrightnessKey; +extern const OSSymbol * gIODisplayBrightnessFadeKey; +extern const OSSymbol * gIODisplayHorizontalPositionKey; +extern const OSSymbol * gIODisplayHorizontalSizeKey; +extern const OSSymbol * gIODisplayVerticalPositionKey; +extern const OSSymbol * gIODisplayVerticalSizeKey; +extern const OSSymbol * gIODisplayTrapezoidKey; +extern const OSSymbol * gIODisplayPincushionKey; +extern const OSSymbol * gIODisplayParallelogramKey; +extern const OSSymbol * gIODisplayRotationKey; +extern const OSSymbol * gIODisplayOverscanKey; +extern const OSSymbol * gIODisplayVideoBestKey; +extern const OSSymbol * gIODisplaySelectedColorModeKey; + +extern const OSSymbol * gIODisplayRedGammaScaleKey; +extern const OSSymbol * gIODisplayGreenGammaScaleKey; +extern const OSSymbol * gIODisplayBlueGammaScaleKey; +extern const OSSymbol * gIODisplayGammaScaleKey; + +extern const OSSymbol * gIODisplayParametersTheatreModeKey; +extern const OSSymbol * gIODisplayParametersTheatreModeWindowKey; + +extern const OSSymbol * gIODisplayMCCSVersionKey; +extern const OSSymbol * gIODisplayTechnologyTypeKey; +extern const OSSymbol * gIODisplayUsageTimeKey; +extern const OSSymbol * gIODisplayFirmwareLevelKey; + +extern const OSSymbol * gIODisplaySpeakerVolumeKey; +extern const OSSymbol * gIODisplaySpeakerSelectKey; +extern const OSSymbol * gIODisplayMicrophoneVolumeKey; +extern const OSSymbol * gIODisplayAmbientLightSensorKey; +extern const OSSymbol * gIODisplayAudioMuteAndScreenBlankKey; +extern const OSSymbol * gIODisplayAudioTrebleKey; +extern const OSSymbol * gIODisplayAudioBassKey; +extern const OSSymbol * gIODisplayAudioBalanceLRKey; +extern const OSSymbol * gIODisplayAudioProcessorModeKey; +extern const OSSymbol * gIODisplayPowerModeKey; +extern const OSSymbol * gIODisplayManufacturerSpecificKey; + +extern const OSSymbol * gIODisplayPowerStateKey; +extern const OSSymbol * gIODisplayControllerIDKey; +extern const OSSymbol * gIODisplayCapabilityStringKey; + +extern const OSSymbol * gIODisplayParametersCommitKey; +extern const OSSymbol * gIODisplayParametersDefaultKey; +extern const OSSymbol * gIODisplayParametersFlushKey; + +extern const OSSymbol * gIODisplayFadeTime1Key; +extern const OSSymbol * gIODisplayFadeTime2Key; +extern const OSSymbol * gIODisplayFadeTime3Key; +extern const OSSymbol * gIODisplayFadeStyleKey; + +extern UInt32 gIODisplayFadeTime1; +extern UInt32 gIODisplayFadeTime2; +extern UInt32 gIODisplayFadeTime3; +extern UInt32 gIODisplayFadeStyle; + +enum { + kIODisplayNumPowerStates = 4, + kIODisplayMaxPowerState = kIODisplayNumPowerStates - 1 +}; + +class IODisplayWrangler; +class IODisplayConnect : public IOService +{ + OSDeclareDefaultStructors(IODisplayConnect) + friend class IODisplayWrangler; + +private: + IOIndex fConnectIndex; + uint64_t fFBRegID; + +protected: +/* Reserved for future use. (Internal use only) */ + struct ExpansionData { }; + +/* Reserved for future use. (Internal use only) */ + ExpansionData * reserved; + + // Support for IODisplayWrangler + virtual bool initWithConnection(const uint64_t fbRegID, + const IOIndex connection); + +public: + // IODisplayConnect interface + virtual IOFramebuffer * getFramebuffer( void ); + virtual IOIndex getConnection( void ); + virtual IOReturn getAttributeForConnection( IOSelect selector, uintptr_t * value ); + virtual IOReturn setAttributeForConnection( IOSelect selector, uintptr_t value ); + virtual void joinPMtree ( IOService * driver ) APPLE_KEXT_OVERRIDE; + +#ifndef _OPEN_SOURCE_ + // Support for IODisplay + static void recordGTraceToken( + const uint16_t line, + const uint16_t tag0, const uint64_t fbRegID, + const uint16_t tag1, const uint64_t arg1, + const uint16_t tag2, const uint64_t arg2, + const uint16_t tag3, const uint64_t arg3); + void recordGTraceToken(const uint16_t line, + const uint16_t fnID, const uint8_t fnType, + const uint16_t tag1, const uint64_t arg1, + const uint16_t tag2, const uint64_t arg2, + const uint16_t tag3, const uint64_t arg3); + inline uint64_t getFBRegistryID() { return fFBRegID; } +#endif // !_OPEN_SOURCE_ +}; + +class IODisplay : public IOService +{ + OSDeclareAbstractStructors(IODisplay) + +public: + static void initialize( void ); + +protected: + // used to query the framebuffer controller + IODisplayConnect * fConnection; + class IODisplayParameterHandler * fParameterHandler; + void * __resv; + IONotifier * fNotifier; + + // pointer to protected instance variables for power management + struct IODisplayPMVars * fDisplayPMVars; + +public: + uintptr_t fWSAADeferState; +protected: + // reserved for future expansion + void * _IODisplay_reserved[31]; + +public: + virtual IOService * probe( IOService * provider, + SInt32 * score ) APPLE_KEXT_OVERRIDE; + + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void stop( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + + virtual IODisplayConnect * getConnection( void ); + + virtual IOReturn getConnectFlagsForDisplayMode( + IODisplayModeID mode, UInt32 * flags ); + + virtual IOReturn getGammaTableByIndex( + UInt32 * channelCount, UInt32 * dataCount, + UInt32 * dataWidth, void ** data ); + + virtual IOReturn readFramebufferEDID( void ); + + virtual IOReturn framebufferEvent( IOFramebuffer * framebuffer, + IOIndex event, void * info ); + // parameter setting + virtual bool setProperty(const OSSymbol* aKey, OSObject* anObject) APPLE_KEXT_OVERRIDE; + virtual bool setProperty(const OSString* aKey, OSObject* anObject) APPLE_KEXT_OVERRIDE; + virtual bool setProperty(const char* aKey, OSObject* anObject) APPLE_KEXT_OVERRIDE; + virtual bool setProperty(const char* aKey, const char* aString) APPLE_KEXT_OVERRIDE; + virtual bool setProperty(const char* aKey, bool aBoolean) APPLE_KEXT_OVERRIDE; + virtual bool setProperty(const char* aKey, unsigned long long aValue, + unsigned int aNumberOfBits) APPLE_KEXT_OVERRIDE; + virtual bool setProperty(const char* aKey, void *bytes, unsigned int length) APPLE_KEXT_OVERRIDE; + + virtual IOReturn setProperties( OSObject * properties ) APPLE_KEXT_OVERRIDE; + virtual bool setForKey( OSDictionary * params, const OSSymbol * key, + SInt32 value, SInt32 min, SInt32 max ); + + static bool addParameter( OSDictionary * params, const OSSymbol * paramName, SInt32 min, SInt32 max ); + static bool setParameter( OSDictionary * params, const OSSymbol * paramName, SInt32 value ); + static OSDictionary * getIntegerRange( OSDictionary * params, const OSSymbol * sym, + SInt32 * value, SInt32 * min, SInt32 * max ); + + // low level set/get + virtual bool doIntegerSet( OSDictionary * params, + const OSSymbol * paramName, UInt32 value ); + virtual bool doDataSet( const OSSymbol * paramName, OSData * value ); + virtual bool doUpdate( void ); + + // power management methods + virtual IOReturn setPowerState( unsigned long, IOService * ) APPLE_KEXT_OVERRIDE; + virtual unsigned long maxCapabilityForDomainState( IOPMPowerFlags ) APPLE_KEXT_OVERRIDE; + virtual unsigned long initialPowerStateForDomainState( IOPMPowerFlags ) APPLE_KEXT_OVERRIDE; + virtual unsigned long powerStateForDomainState( IOPMPowerFlags ) APPLE_KEXT_OVERRIDE; + + // + virtual void initPowerManagement( IOService * provider); + virtual void dropOneLevel( void ); + virtual void makeDisplayUsable( void ); + void setDisplayPowerState(unsigned long state); + +#ifndef _OPEN_SOURCE_ +// GTrace V2 support for IOBacklightDisplay tracing +#define HAS_IBDGTRACETOKEN 1 + void recordGTraceToken(const uint16_t line, + const uint16_t fnID, const uint8_t fnType, + const uint16_t tag1, const uint64_t arg1, + const uint16_t tag2, const uint64_t arg2, + const uint16_t tag3, const uint64_t arg3); +#endif // !_OPEN_SOURCE_ + +private: + OSMetaClassDeclareReservedUnused(IODisplay, 0); + OSMetaClassDeclareReservedUnused(IODisplay, 1); + OSMetaClassDeclareReservedUnused(IODisplay, 2); + OSMetaClassDeclareReservedUnused(IODisplay, 3); + OSMetaClassDeclareReservedUnused(IODisplay, 4); + OSMetaClassDeclareReservedUnused(IODisplay, 5); + OSMetaClassDeclareReservedUnused(IODisplay, 6); + OSMetaClassDeclareReservedUnused(IODisplay, 7); + OSMetaClassDeclareReservedUnused(IODisplay, 8); + OSMetaClassDeclareReservedUnused(IODisplay, 9); + OSMetaClassDeclareReservedUnused(IODisplay, 10); + OSMetaClassDeclareReservedUnused(IODisplay, 11); + OSMetaClassDeclareReservedUnused(IODisplay, 12); + OSMetaClassDeclareReservedUnused(IODisplay, 13); + OSMetaClassDeclareReservedUnused(IODisplay, 14); + OSMetaClassDeclareReservedUnused(IODisplay, 15); + OSMetaClassDeclareReservedUnused(IODisplay, 16); + OSMetaClassDeclareReservedUnused(IODisplay, 17); + OSMetaClassDeclareReservedUnused(IODisplay, 18); + OSMetaClassDeclareReservedUnused(IODisplay, 19); + +private: + static IOReturn _framebufferEvent( OSObject * osobj, void * ref, + IOFramebuffer *framebuffer, IOIndex event, void * info ); + + void searchParameterHandlers(IORegistryEntry * entry); + bool addParameterHandler( IODisplayParameterHandler * parameterHandler ); + bool removeParameterHandler( IODisplayParameterHandler * parameterHandler ); + static bool updateNumber( OSDictionary * params, const OSSymbol * key, SInt32 value ); +}; + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +class IOBacklightDisplay : public IODisplay +{ + OSDeclareDefaultStructors(IOBacklightDisplay) + + OSMetaClassDeclareReservedUnused(IOBacklightDisplay, 0); + OSMetaClassDeclareReservedUnused(IOBacklightDisplay, 1); + OSMetaClassDeclareReservedUnused(IOBacklightDisplay, 2); + OSMetaClassDeclareReservedUnused(IOBacklightDisplay, 3); + OSMetaClassDeclareReservedUnused(IOBacklightDisplay, 4); + OSMetaClassDeclareReservedUnused(IOBacklightDisplay, 5); + OSMetaClassDeclareReservedUnused(IOBacklightDisplay, 6); + OSMetaClassDeclareReservedUnused(IOBacklightDisplay, 7); + OSMetaClassDeclareReservedUnused(IOBacklightDisplay, 8); + OSMetaClassDeclareReservedUnused(IOBacklightDisplay, 9); +}; + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +class IODisplayParameterHandler : public IOService +{ + OSDeclareDefaultStructors(IODisplayParameterHandler) + +public: + virtual bool setDisplay( IODisplay * display ) = 0; + virtual bool doIntegerSet( OSDictionary * params, + const OSSymbol * paramName, UInt32 value ) = 0; + virtual bool doDataSet( const OSSymbol * paramName, OSData * value ) = 0; + virtual bool doUpdate( void ) = 0; + +private: + OSMetaClassDeclareReservedUnused(IODisplayParameterHandler, 0); + OSMetaClassDeclareReservedUnused(IODisplayParameterHandler, 1); + OSMetaClassDeclareReservedUnused(IODisplayParameterHandler, 2); + OSMetaClassDeclareReservedUnused(IODisplayParameterHandler, 3); + OSMetaClassDeclareReservedUnused(IODisplayParameterHandler, 4); + OSMetaClassDeclareReservedUnused(IODisplayParameterHandler, 5); + OSMetaClassDeclareReservedUnused(IODisplayParameterHandler, 6); + OSMetaClassDeclareReservedUnused(IODisplayParameterHandler, 7); + OSMetaClassDeclareReservedUnused(IODisplayParameterHandler, 8); + OSMetaClassDeclareReservedUnused(IODisplayParameterHandler, 9); +}; + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#endif /* ! _IOKIT_IODISPLAY_H */ + diff --git a/QualcommWireless/include/IOKit/graphics/IOFramebuffer.h b/QualcommWireless/include/IOKit/graphics/IOFramebuffer.h new file mode 100644 index 0000000..a12dc63 --- /dev/null +++ b/QualcommWireless/include/IOKit/graphics/IOFramebuffer.h @@ -0,0 +1,1024 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOFRAMEBUFFER_H +#define _IOKIT_IOFRAMEBUFFER_H + +#include +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Woverloaded-virtual" +#include +#pragma clang diagnostic pop +#include + +#include +#include + +#include + +#ifndef __MAC_OS_X_VERSION_MIN_REQUIRED +#error "Missing macOS target version" +#endif + +#define IOFRAMEBUFFER_REV 7 + + +class IOFramebuffer; +class IOBufferMemoryDescriptor; +struct IOFBController; + + +typedef void (*CursorBlitProc)( + IOFramebuffer * inst, + void * shmem, + volatile unsigned char *vramPtr, + unsigned int cursStart, + unsigned int vramRow, + unsigned int cursRow, + int width, + int height ); + +typedef void (*CursorRemoveProc)( + IOFramebuffer * inst, + void * shmem, + volatile unsigned char *vramPtr, + unsigned int vramRow, + int width, + int height ); + + +typedef void * IOFBCursorRef; + +struct IOFBCursorControlCallouts { + IOReturn (*setCursorImage) (void * target, void * ref, + IOHardwareCursorDescriptor * description, IOFBCursorRef cursorImage); + IOReturn (*setCursorState) (void * target, void * ref, + SInt32 x, SInt32 y, bool visible); + UInt32 reserved[30]; +}; +typedef struct IOFBCursorControlCallouts IOFBCursorControlCallouts; + +struct IOFBCursorControlAttribute { + void * inst; + void * ref; + const IOFBCursorControlCallouts * callouts; + UInt32 reserved[29]; +}; +typedef struct IOFBCursorControlAttribute IOFBCursorControlAttribute; + +// clock & data values +enum { + kIODDCLow = 0, + kIODDCHigh = 1, + kIODDCTristate = 2 +}; +// ddcBlockType constants +enum { + // EDID block type. + kIODDCBlockTypeEDID = 0 +}; + +// ddcFlags constants +enum { + // Force a new read of the EDID. + kIODDCForceRead = 0x00000001 +}; + +enum { + kDisabledInterruptState = 0, + kEnabledInterruptState = 1 +}; + +typedef void (*IOFBInterruptProc)( OSObject * target, void * ref ); + + +typedef IOReturn (*IOFramebufferNotificationHandler) + (OSObject * obj, void * ref, + IOFramebuffer * framebuffer, IOIndex event, + void * info); + +// IOFramebufferNotificationHandler events +enum { + kIOFBNotifyDisplayModeWillChange = 1, + kIOFBNotifyDisplayModeDidChange = 2, + + kIOFBNotifyWillSleep = 3, + kIOFBNotifyDidWake = 4, + + kIOFBNotifyDidPowerOff = 5, + kIOFBNotifyWillPowerOn = 6, + + kIOFBNotifyDidSleep = kIOFBNotifyDidPowerOff, + kIOFBNotifyWillWake = kIOFBNotifyWillPowerOn, + + kIOFBNotifyWillPowerOff = 7, + kIOFBNotifyDidPowerOn = 8, + + kIOFBNotifyWillChangeSpeed = 9, + kIOFBNotifyDidChangeSpeed = 10, + + kIOFBNotifyHDACodecWillPowerOn = 11, // since IOGRAPHICSTYPES_REV 68 + kIOFBNotifyHDACodecDidPowerOn = 12, // since IOGRAPHICSTYPES_REV 68 + + kIOFBNotifyHDACodecWillPowerOff = 13, // since IOGRAPHICSTYPES_REV 68 + kIOFBNotifyHDACodecDidPowerOff = 14, // since IOGRAPHICSTYPES_REV 68 + + kIOFBNotifyClamshellChange = 20, + + kIOFBNotifyCaptureChange = 30, + + kIOFBNotifyOnlineChange = 40, + + kIOFBNotifyDisplayDimsChange = 50, + + kIOFBNotifyProbed = 60, + + kIOFBNotifyVRAMReady = 70, + + kIOFBNotifyWillNotify = 80, + kIOFBNotifyDidNotify = 81, + + // IOGraphics needs to send WSAAWillExitDefer and WSAADidExitDefer instead of single message + kIOFBNotifyWSAAWillEnterDefer = 90, // since IOGRAPHICSTYPES_REV 53 + kIOFBNotifyWSAAWillExitDefer = 91, // since IOGRAPHICSTYPES_REV 53 + + kIOFBNotifyWSAADidEnterDefer = 92, // since IOGRAPHICSTYPES_REV 53 + kIOFBNotifyWSAADidExitDefer = 93, // since IOGRAPHICSTYPES_REV 53 + + kIOFBNotifyWSAAEnterDefer = kIOFBNotifyWSAAWillEnterDefer, + kIOFBNotifyWSAAExitDefer = kIOFBNotifyWSAAWillExitDefer, + + kIOFBNotifyTerminated = 100, // since IOGRAPHICSTYPES_REV 49 +}; + +/* + Discussion: addFramebufferNotificationWithOptions + + Clients that want to take advantage of the fine grain IOFramebuffer event notifications must register their framebuffer notification handler with addFramebufferNotificationWithOptions and provide a single kIOFBNotifyGroup ID, one or more kIOFBNotifyEvents and optionally a desired kIOFBNotifyPriority value. If no priority is required, clients must set groupPriority to 0. Clients must not register with any predefined kIOFBNotifyGroup that they do not belong to. kIOFBNotifyGroup values within the range of 0x8000 to 0xFFFF are available for general and third party software use. Where multiple independent software components end up using the same kIOFBNotifyGroup identification numbers, the callout order is determined first by priority and then by registration order. Clients that request a priority that is outside of the range specified by kIOFBNotifyPriority_Min/kIOFBNotifyPriority_Max will be clamped to the range limits. + + Handler invocation by IOGraphics: + + Clients are only called for the kIOFBNotifyEvents that they requested at time of registration. + Multiple clients with the same kIOFBNotifyGroup are called in the order based on the requested priority. + Multiple clients with the same kIOFBNotifyGroup and the same priority are called in a "first registered, first served" order. + IOGraphics will invoke the handlers based on group, then priority, the registration order. The ordering of the group callouts is private and will change as required/desired by Apple. Clients must NOT rely on group callout order to determine system or intercomponent behavior. If there is a strong need to be called before a specific component, please file a radar with the Component of "IOGraphics" and the Version of "all". + + Discussion: addFramebufferNotification + Legacy and existing software that relies upon addFramebufferNotification() will behave as if they had called with the following options: addFramebufferNotificationWithOptions(..., kIOFBNotifyGroupID_Legacy, 0, kIOFBNotifyEvent_All); + Legacy clients are called after kIOFBNotifyGroup IDs within the range of 0x0 to 0x7FFF have been called, but before IDs in the range of 0x8000 to 0xFFFF. + */ + +// addFramebufferNotificationWithOptions event types +enum { + kIOFBNotifyEvent_None = (0ULL << 0), + kIOFBNotifyEvent_DisplayModeChange = (1ULL << 0), + kIOFBNotifyEvent_SleepWake = (1ULL << 1), // Only for events: kIOFBNotifyWillSleep & kIOFBNotifyDidWake + kIOFBNotifyEvent_PowerOnOff = (1ULL << 2), + kIOFBNotifyEvent_ChangeSpeed = (1ULL << 3), + kIOFBNotifyEvent_ClamshellChange = (1ULL << 4), + kIOFBNotifyEvent_CaptureChange = (1ULL << 5), + kIOFBNotifyEvent_OnlineChange = (1ULL << 6), + kIOFBNotifyEvent_DisplayDimsChange = (1ULL << 7), + kIOFBNotifyEvent_Probed = (1ULL << 8), + kIOFBNotifyEvent_VRAMReady = (1ULL << 9), + kIOFBNotifyEvent_Notify = (1ULL << 10), // kIOFBNotifyWillNotify & kIOFBNotifyDidNotify + kIOFBNotifyEvent_WSAADefer = (1ULL << 11), + kIOFBNotifyEvent_Terminated = (1ULL << 12), + kIOFBNotifyEvent_HDACodecPowerOnOff = (1ULL << 13), // since IOFRAMEBUFFER_REV 7 + + kIOFBNotifyEvent_Last = (1ULL << 14), + kIOFBNotifyEvent_All = (kIOFBNotifyEvent_Last - 1) +}; + +enum { + // 0x0 - 0xFF - Private: Reserved for IOGraphics. + kIOFBNotifyGroupID_Legacy = 0x001, + kIOFBNotifyGroupID_IODisplay = 0x010, + + // 0x100 - 0x1FF - Reserved for Apple kernel extensions + kIOFBNotifyGroupID_AppleGraphicsDevicePolicy = 0x100, + kIOFBNotifyGroupID_AppleGraphicsMGPUPowerControl = 0x110, + kIOFBNotifyGroupID_AppleGraphicsMUXControl = 0x120, + kIOFBNotifyGroupID_AppleGraphicsControl = 0x130, + kIOFBNotifyGroupID_AppleGraphicsDisplayPolicy = 0x140, + kIOFBNotifyGroupID_AppleGraphicsPowerManagement = 0x150, + kIOFBNotifyGroupID_AppleHDAController = 0x160, + kIOFBNotifyGroupID_AppleIOAccelDisplayPipe = 0x170, + kIOFBNotifyGroupID_AppleMCCSControl = 0x180, + + // 0x200 - 0x2FF - Reserved for vendor kernel extensions + kIOFBNotifyGroupID_VendorIntel = 0x200, + + // 0x300 - 0x3FF - Reserved for vendor kernel extensions + kIOFBNotifyGroupID_VendorNVIDIA = 0x300, + + // 0x400 - 0x4FF - Reserved for vendor kernel extensions + kIOFBNotifyGroupID_VendorAMD = 0x400, + + // 0x500 - 0x7FFF - Reserved for future use + + // 0x8000+ - Reserved for third party software + kIOFBNotifyGroupID_ThirdParty = 0x8000, + + kIOFBNotifyGroupID_Count = 15 +}; + +// addFramebufferNotificationWithOptions group priority range +enum { + kIOFBNotifyPriority_Min = -32768, + kIOFBNotifyPriority_Max = 32767, +}; + +struct IOFramebufferNotificationNotify +{ + IOIndex event; + void * info; +}; + +enum { + kFBDisplayUsablePowerState = 0x80000000, + kFBDisplayPowerStateMask = 0x0000ffff +}; + +#define kIOFBDependentIDKey "IOFBDependentID" +#define kIOFBDependentIndexKey "IOFBDependentIndex" + +#ifndef _OPEN_SOURCE_ +// GTrace V2 support for AGDC markers +#define HAS_AGDCGTRACETOKEN 1 +extern void agdcGTraceToken( + const IOFramebuffer* fb, const uint16_t line, const bool useController, + const uint16_t fnID, const uint8_t fnType, + const uint16_t tag1, const uint64_t arg1, + const uint16_t tag2, const uint64_t arg2, + const uint16_t tag3, const uint64_t arg3); +#endif // !_OPEN_SOURCE_ + +struct StdFBShmem_t; +class IOFramebufferUserClient; +class IODisplay; + +/*! @class IOFramebuffer : public IOGraphicsDevice + @abstract The base class for graphics devices to be made available as part of the desktop. + @discussion The IOFramebuffer base class defines APIs used to publish a linear framebuffer device. Device driver writers should subclass this class to provide a X native driver. Mac OS X will also utilize 'ndrv' drivers via a subclass of IOFramebuffer IONDRVFramebuffer that does not require device driver writers to provide a X native driver. + + There are no in kernel clients of IOFramebuffer aside from rudimentary console and panic UI supported by the IOFramebuffer class. The IOFramebuffer class provides the IOUserClient implementation to allow the CoreGraphics server to provide the user accessible interface to all displays on a Mac OS X system, and this is further layered underneath application frameworks. Device driver writers should not need any knowledge of this part of the interfaces. Similarly the instance variables of IOFramebuffer are mostly used for cursor rendering which is handled by the IOFramebuffer class, and should be avoided by subclass implementors. Only IOFramebuffer methods with header documentation in this header are designed for subclasses to implement. + + IOFramebuffer provides simple dumb framebuffer operation - accceleration for 2D, 3D and video may be provided by a separate implementation of the IOAccelerator class. +*/ + +class IOFramebuffer : public IOGraphicsDevice +{ + friend class IOFramebufferUserClient; + friend class IOFramebufferSharedUserClient; + friend class IOFramebufferDiagnosticUserClient; + friend class IOFramebufferParameterHandler; + friend class IODisplay; +#ifndef _OPEN_SOURCE_ + friend void agdcGTraceToken( + const IOFramebuffer*, const uint16_t, const bool, const uint16_t, + const uint8_t, const uint16_t, const uint64_t, const uint16_t, + const uint64_t, const uint16_t, const uint64_t); +#endif // !_OPEN_SOURCE_ + + OSDeclareDefaultStructors(IOFramebuffer); + +protected: +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of this class in the future. + */ + struct ExpansionData { }; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData * reserved; + +private: + +protected: + StdFBShmem_t * priv; + int shmemClientVersion; + IOBufferMemoryDescriptor * sharedCursor; + + union { + struct { + /* Mapping tables used in cursor drawing to 5-5-5 displays. */ + unsigned char * _bm34To35SampleTable; + unsigned char * _bm35To34SampleTable; + /* Mapping tables used in cursor drawing to 8-bit RGB displays. */ + unsigned int * _bm256To38SampleTable; + unsigned char * _bm38To256SampleTable; + } t; + UInt8 * tables[ 4 ]; + } colorConvert; + + /* cursor blitting vars */ + CursorBlitProc cursorBlitProc; + CursorRemoveProc cursorRemoveProc; + + IOGSize maxCursorSize; + void * _IOFramebuffer_reservedE[6]; + uint32_t _IOFramebuffer_reservedF; + uint32_t thisNameLen; + const char * thisName; + volatile unsigned char * cursorSave; + unsigned int white; + + IOGPoint nextCursorLoc; + int nextCursorFrame; + SInt32 connectChange; + semaphore_t vblSemaphore; + + /* memory ranges */ + volatile unsigned char * fFrameBuffer; + unsigned int fTotalWidth; + unsigned int rowBytes; + unsigned int bytesPerPixel; + + IOMemoryMap * fVramMap; + IOByteCount fVramMapOffset; + OSArray * userAccessRanges; + unsigned int suspended:1; + unsigned int captured:1; + unsigned int sleepConnectCheck:1; + unsigned int messaged:1; + unsigned int cursorEnable:1; + unsigned int _IOFramebuffer_reservedC:27; + IOFramebuffer * nextDependent; + OSArray * fFBNotifications; + + class IOFramebufferUserClient * fServerConnect; + class IOFramebufferSharedUserClient * fSharedConnect; + + unsigned int opened:1; + unsigned int dead:1; + unsigned int configPending:1; + unsigned int doNotUseServerNotified:1; // Deprecated + unsigned int doNotUseServerState:1; // Deprecated + unsigned int doNotUseServerPendingAck:1;// Deprecated + unsigned int isUsable:1; + unsigned int mirrored:1; + unsigned int pendingPowerState:4; + unsigned int pendingPowerChange:1; + unsigned int pagingState:1; + unsigned int mirrorPrimary:1; + unsigned int mirrorSWCursor:1; + + bool clutValid; + bool currentMono; + bool needCursorService; + bool haveVBLService; + bool haveHWCursor; + bool hwCursorLoaded; + + void * serverMsg; + IOInterruptEventSource * deferredEvents; + + /* Reserved for future expansion. */ + int _IOFramebuffer_reserved[5]; + +private: + struct IOFramebufferPrivate * __private; + +public: +/*! @function doI2CRequest + @abstract Carry out an I2C request. + @discussion IOFramebuffer subclasses may optionally implement this method to perform I2C bus requests on one of the buses they support. Alternatively they may implement the setDDCClock(), setDDCData(), readDDCClock(), readDDCData() methods and respond from getAttributeForConnection() to the kConnectionSupportsLLDDCSense attribute with success, in which case IOFramebuffer::doI2CRequest() will carry out a software implementation of I2C using the low level routines and conforming to the timing constraints passed in the timing parameter. Subclasses may pass timing parameters tuned for the specific bus, otherwise VESA DDC defaults will apply. + @timing event Subclasses may pass timing parameters tuned for the specific bus, otherwise if NULL, VESA DDC defaults will apply. + @param request An IOI2CRequest structure. The request should be carried out synchronously if the completion routine is NULL, otherwise it may optionally be carried out asynchronously. The completion routine should be called if supplied. + @result an IOReturn code. If kIOReturnSuccess, the result of the transaction is returned in the requests result field. +*/ + virtual IOReturn doI2CRequest( UInt32 bus, struct IOI2CBusTiming * timing, struct IOI2CRequest * request ); + OSMetaClassDeclareReservedUsed(IOFramebuffer, 0); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_13 + + /*! @function diagnoseReport + @abstract Provide private diagnostic information. + @discussion Allow vendor implementations to provide diagnostic information when a catastrophic failure has been encounterd. + */ + virtual IOReturn diagnoseReport( void * param1, void * param2, void * param3, void * param4 ); + OSMetaClassDeclareReservedUsed(IOFramebuffer, 1); + +/*! @function setGammaTable + @abstract Set the gamma table to be used by the framebuffer. + @discussion IOFramebuffer subclasses should implement this method to allow a gamma table to be set. + @param channelCount Defines the number of channels in the supplied data. OS X will pass three for separate R, G, B data, or one if the same data should apply to all channels. + @param dataCount The number of data entries per channel. + @param dataWidth The number of bits in each entry. 8 for Mac OS X 10.1 and earlier, 16 for later releases. + @param data The packed array of correction data. Data is passed for the R (or single) channel followed by the G & B channels. Each entry is one or two bytes (if dataWidth > 8). + @param syncToVBL 0 don't sync to VBL, else sync. + @result an IOReturn code. + */ + virtual IOReturn setGammaTable( UInt32 channelCount, UInt32 dataCount, + UInt32 dataWidth, void * data, bool syncToVBL ); + OSMetaClassDeclareReservedUsed(IOFramebuffer, 2); +#else + OSMetaClassDeclareReservedUnused(IOFramebuffer, 1); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 2); +#endif + +private: + + OSMetaClassDeclareReservedUnused(IOFramebuffer, 3); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 4); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 5); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 6); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 7); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 8); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 9); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 10); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 11); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 12); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 13); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 14); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 15); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 16); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 17); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 18); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 19); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 20); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 21); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 22); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 23); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 24); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 25); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 26); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 27); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 28); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 29); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 30); + OSMetaClassDeclareReservedUnused(IOFramebuffer, 31); + + +public: + // IOKit overrides + static void initialize(); + + virtual bool attach( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void stop( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual bool requestTerminate( IOService * provider, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + virtual bool terminate( IOOptionBits options ) APPLE_KEXT_OVERRIDE; + virtual bool willTerminate( IOService * provider, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + virtual bool didTerminate( IOService * provider, IOOptionBits options, bool * defer ) APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + virtual IOWorkLoop * getWorkLoop() const APPLE_KEXT_OVERRIDE; +#ifndef _OPEN_SOURCE_ + virtual IOReturn setProperties(OSObject* properties) APPLE_KEXT_OVERRIDE; +#endif + + IOWorkLoop * getGraphicsSystemWorkLoop() const; + IOWorkLoop * getControllerWorkLoop() const; + + virtual IOReturn requestProbe( IOOptionBits options ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn powerStateWillChangeTo ( IOPMPowerFlags, unsigned long, IOService* ) APPLE_KEXT_OVERRIDE; + virtual IOReturn powerStateDidChangeTo ( IOPMPowerFlags, unsigned long, IOService* ) APPLE_KEXT_OVERRIDE; + virtual IOReturn setPowerState( unsigned long powerStateOrdinal, IOService * device) APPLE_KEXT_OVERRIDE; + virtual IOReturn setAggressiveness( unsigned long type, unsigned long newLevel ) APPLE_KEXT_OVERRIDE; + virtual IOReturn getAggressiveness( unsigned long type, unsigned long * currentLevel ) APPLE_KEXT_OVERRIDE; + virtual IOReturn newUserClient( task_t owningTask, + void * security_id, + UInt32 type, + IOUserClient ** clientH ) APPLE_KEXT_OVERRIDE; + virtual IOReturn callPlatformFunction( const OSSymbol * functionName, + bool waitForFunction, + void *p1, void *p2, + void *p3, void *p4 ) APPLE_KEXT_OVERRIDE; + virtual IOReturn message(UInt32 type, IOService *provider, void *argument = 0) APPLE_KEXT_OVERRIDE; + + virtual void hideCursor( void ) APPLE_KEXT_OVERRIDE; + virtual void showCursor( IOGPoint * cursorLoc, int frame ) APPLE_KEXT_OVERRIDE; + virtual void moveCursor( IOGPoint * cursorLoc, int frame ) APPLE_KEXT_OVERRIDE; + // virtual + void resetCursor( void ); + + virtual void getVBLTime( AbsoluteTime * time, AbsoluteTime * delta ) APPLE_KEXT_OVERRIDE; + + virtual void getBoundingRect ( IOGBounds ** bounds ) APPLE_KEXT_OVERRIDE; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Woverloaded-virtual" + virtual IOReturn open( void ); + + virtual void close( void ); +#pragma clang diagnostic pop + + virtual bool isConsoleDevice( void ); + + virtual IOReturn setupForCurrentConfig( void ); + + virtual bool serializeInfo( OSSerialize * s ); + virtual bool setNumber( OSDictionary * dict, const char * key, + UInt32 number ); + + IONotifier * addFramebufferNotification( + IOFramebufferNotificationHandler handler, + OSObject * obj, void * ref); + +/*! @function getApertureRange + @abstract Return reference to IODeviceMemory object representing memory range of framebuffer. + @discussion IOFramebuffer subclasses must implement this method to describe the memory used by the framebuffer in the current mode. The OS will map this memory range into user space for client access - the range should only include vram memory not hardware registers. + @param aperture The system will only access the aperture kIOFBSystemAperture. + @result an IODeviceMemory instance. A reference will be consumed by the caller for each call of this method - the implementatation should create a new instance of IODeviceMemory for each call, or return one instance with a retain for each call. +*/ + + virtual IODeviceMemory * getApertureRange( IOPixelAperture aperture ) = 0; + +/*! @function getVRAMRange + @abstract Return reference to IODeviceMemory object representing memory range of all the cards vram. + @discussion IOFramebuffer subclasses should implement this method to describe all the vram memory available on the card. The OS will map this memory range into user space for client access - the range should only include vram memory not hardware registers. + @result an IODeviceMemory instance. A reference will be consumed by the caller for each call of this method - the implementatation should create a new instance of IODeviceMemory for each call, or return one instance with a retain for each call. +*/ + + virtual IODeviceMemory * getVRAMRange( void ); + +protected: + +/*! @function handleEvent + @abstract Notify IOFramebuffer superclass code of events. + @discussion IOFramebuffer subclasses should call this IOFramebuffer method on certain power state changes. + @param event The event that has occurred:
+ kIOFBNotifyWillPowerOff call before entering a state other than the maximum.
+ kIOFBNotifyDidPowerOn call after entering the maximum power state.
+ kIOFBNotifyWillPowerOff call before entering a state other than the maximum.
+ kIOFBNotifyDidPowerOn call after entering a state other than the maximum.
+ @param info None of the above events require additional info, pass zero. + @result an IOReturn code, safely ignored. +*/ + + IOReturn handleEvent( IOIndex event, void * info = 0 ); + + + IOReturn deliverFramebufferNotification( + IOIndex event, void * info = 0 ); + +#ifdef IOFRAMEBUFFER_PRIVATE +#include +#endif + +public: +/*! @function enableController + @abstract Perform first time setup of the framebuffer. + @discussion IOFramebuffer subclasses should perform their initialization of the hardware here. The IOService start() method is not called at a time appropriate for this initialization. + @result an IOReturn code. A return other than kIOReturnSuccess will prevent the system from using the device. +*/ + + virtual IOReturn enableController( void ); + +/*! @function getPixelFormats + @abstract List the pixel formats the framebuffer supports. + @discussion IOFramebuffer subclasses must implement this method to return an array of strings representing the possible pixel formats available in the framebuffer. + @result A const char * pointer. The string consists of a concatenation of each pixel format string separated by the NULL character. The commonly supported pixel formats for Mac OS X are defined as IO8BitIndexedPixels, IO16BitDirectPixels, IO32BitDirectPixels. +*/ + + virtual const char * getPixelFormats( void ) = 0; + +/*! @function getDisplayModeCount + @abstract Return the number of display modes the framebuffer supports. + @discussion IOFramebuffer subclasses must implement this method to return a count of the display modes available. This count should change unless a connection change is posted for the device indicated the framebuffer and/or display configuration has changed. + @result A count of the display modes available. +*/ + + virtual IOItemCount getDisplayModeCount( void ) = 0; + +/*! @function getDisplayModes + @abstract Return the number of display modes the framebuffer supports. + @discussion IOFramebuffer subclasses must implement this method to return an array of display mode IDs available for the framebuffer. The IDs are defined by the driver in the range 0x00000001 - 0x7fffffff, and should be constant for a given display mode. + @param allDisplayModes A caller allocated buffer with the size given by the result of getDisplayModeCount(). + @result an IOReturn code. A return other than kIOReturnSuccess will prevent the system from using the device. +*/ + + virtual IOReturn getDisplayModes( IODisplayModeID * allDisplayModes ) = 0; + +/*! @function getInformationForDisplayMode + @abstract Return information about a given display mode. + @discussion IOFramebuffer subclasses must implement this method to return information in the IODisplayModeInformation structure for the display mode with the passed ID. + @param displayMode A display mode ID previously returned by getDisplayModes(). + @param info Pointer to a structure of type IODisplayModeInformation to be filled out by the driver. IODisplayModeInformation is documented in IOGraphicsTypes.h. + @result an IOReturn code. A return other than kIOReturnSuccess will prevent the system from using the device. +*/ + + virtual IOReturn getInformationForDisplayMode( IODisplayModeID displayMode, + IODisplayModeInformation * info ) = 0; + +/*! @function getPixelFormatsForDisplayMode + @abstract Obsolete. + @discussion IOFramebuffer subclasses must implement this method to return zero. + @param displayMode Ignored. + @param depth Ignored. + @result Return zero. +*/ + + virtual UInt64 getPixelFormatsForDisplayMode( IODisplayModeID displayMode, + IOIndex depth ) = 0; + +/*! @function getPixelInformation + @abstract Return information about the framebuffer format for a given display mode and depth. + @discussion IOFramebuffer subclasses must implement this method to return information in the IOPixelInformation structure for the display mode with the passed ID, depth index and aperture. The aperture utilized by the system is always kIOFBSystemAperture. Drivers may define alternative apertures, being a view of the framebuffer in a different pixel format from the default. + @param displayMode A display mode ID previously returned by getDisplayModes(). + @param depth An index from zero to the value of the maxDepthIndex field from the IODisplayModeInformation structure (inclusive). + @param pixelInfo Pointer to a structure of type IOPixelInformation to be filled out by the driver. IOPixelInformation is documented in IOGraphicsTypes.h. + @result an IOReturn code. A return other than kIOReturnSuccess will prevent the system from using the device. +*/ + + virtual IOReturn getPixelInformation( + IODisplayModeID displayMode, IOIndex depth, + IOPixelAperture aperture, IOPixelInformation * pixelInfo ) = 0; + +/*! @function getCurrentDisplayMode + @abstract Return the framebuffers current display mode and depth. + @discussion IOFramebuffer subclasses must implement this method to return the current mode and depth. + @param displayMode A display mode ID representing the current mode. + @param depth An index indicating the depth configuration of the framebuffer. The index should range from zero to the value of the maxDepthIndex field from the IODisplayModeInformation structure for the display mode. + @result an IOReturn code. A return other than kIOReturnSuccess will prevent the system from using the device. +*/ + + virtual IOReturn getCurrentDisplayMode( IODisplayModeID * displayMode, + IOIndex * depth ) = 0; + +/*! @function setCurrentDisplayMode + @abstract Set the framebuffers current display mode and depth. + @discussion IOFramebuffer subclasses should implement this method to set the current mode and depth. Other than at enableController() time, this is the only method that should change the framebuffer format and is synchronized with clients and attached accelerators to make sure access to the device is disallowed during the change. + @param displayMode A display mode ID representing the new mode. + @param depth An index indicating the new depth configuration of the framebuffer. The index should range from zero to the value of the maxDepthIndex field from the IODisplayModeInformation structure for the display mode. + @result an IOReturn code. A return other than kIOReturnSuccess will prevent the system from using the device. +*/ + + virtual IOReturn setDisplayMode( IODisplayModeID displayMode, + IOIndex depth ); + +/*! @function setApertureEnable + @abstract Enable an aperture on the framebuffer (usually unimplemented, no OS usage). + @discussion IOFramebuffer subclasses may implement this method to set enable a non standard aperture. The system does not call this method. + @param aperture A device specific aperture index. + @param enable Device specific mask of options. + @result an IOReturn code. +*/ + + virtual IOReturn setApertureEnable( IOPixelAperture aperture, + IOOptionBits enable ); + +/*! @function setStartupDisplayMode + @abstract Set the framebuffers display mode and depth to be used during boot and at startup. + @discussion IOFramebuffer subclasses should implement this method to set the mode and depth to be used during boot and at startup, to reduce needed mode changes during boot when the display connection type is the same. If possible this mode should also be used by the OpenFirmware driver for the card. + @param displayMode A display mode ID representing the new startup mode. + @param depth An index indicating the new startup depth configuration of the framebuffer. The index should range from zero to the value of the maxDepthIndex field from the IODisplayModeInformation structure for the display mode. + @result an IOReturn code. +*/ + + virtual IOReturn setStartupDisplayMode( IODisplayModeID displayMode, + IOIndex depth ); + +/*! @function getCurrentDisplayMode + @abstract Return the framebuffers display mode and depth to be used during boot and at startup. + @discussion IOFramebuffer subclasses should implement this method to return the current mode and depth. + @param displayMode A display mode ID representing the mode used during startup. + @param depth An index indicating the depth configuration of the framebuffer used during startup. The index should range from zero to the value of the maxDepthIndex field from the IODisplayModeInformation structure for the display mode. + @result an IOReturn code. +*/ + + virtual IOReturn getStartupDisplayMode( IODisplayModeID * displayMode, + IOIndex * depth ); + +/*! @function setCLUTWithEntries + @abstract Set the color lookup table to be used by the framebuffer in indexed modes. + @discussion IOFramebuffer subclasses may implement this method to allow a palette to be set for indexed display modes. It will not be called on framebuffers in direct display modes. + @param colors A pointer to an array of numEntries RGB color entries. + @param index The index of the first entry to set. + @param numEntries The number of entries in the table. + @param options Options controlling the operation.
+ kSetCLUTByValue is set if the index field of each entry should be used to set the table sparsely, otherwise consecutive entries from the index parameter should be set.
+ kSetCLUTImmediately is set if the CLUT set should not be synchronized with the vertical blank, otherwise it should.
+ kSetCLUTWithLuminance is set if the CLUT should be set to a gray value equivalent in luminance to the passed color entry.
+ @result an IOReturn code. +*/ + + virtual IOReturn setCLUTWithEntries( IOColorEntry * colors, UInt32 index, + UInt32 numEntries, IOOptionBits options ); + +/*! @function setGammaTable + @abstract Set the gamma table to be used by the framebuffer. + @discussion IOFramebuffer subclasses should implement this method to allow a gamma table to be set. + @param channelCount Defines the number of channels in the supplied data. OS X will pass three for separate R, G, B data, or one if the same data should apply to all channels. + @param dataCount The number of data entries per channel. + @param dataWidth The number of bits in each entry. 8 for Mac OS X 10.1 and earlier, 16 for later releases. + @param data The packed array of correction data. Data is passed for the R (or single) channel followed by the G & B channels. Each entry is one or two bytes (if dataWidth > 8). + @result an IOReturn code. +*/ + + virtual IOReturn setGammaTable( UInt32 channelCount, UInt32 dataCount, + UInt32 dataWidth, void * data ); + +/*! @function setAttribute + @abstract Generic method to set some attribute of the framebuffer device. + @discussion IOFramebuffer subclasses may implement this method to allow arbitrary attribute/value pairs to be set. + @param attribute Defines the attribute to be set. Some defined attributes are:
+ kIOPowerAttribute The IOFramebuffer class implements most power management (IOService) methods. It calls the subclass to carry out the power management state change with this attribute. When carrying out power state changes, the subclass should call IOFramebuffer::handleEvent for certain changes - set that method for more information. + @param value The new value for the attribute. + @result an IOReturn code. +*/ + + virtual IOReturn setAttribute( IOSelect attribute, uintptr_t value ); + +/*! @function getAttribute + @abstract Generic method to retrieve some attribute of the framebuffer device. + @discussion IOFramebuffer subclasses may implement this method to allow arbitrary attribute/value pairs to be returned. + @param attribute Defines the attribute to be set. Some defined attributes are:
+ kIOHardwareCursorAttribute If the device supports a hardware cursor and implements the setCursorImage() and setCursorState() calls it should return true for this attribute. + @param value Returns the value for the attribute. + @result an IOReturn code. +*/ + + virtual IOReturn getAttribute( IOSelect attribute, uintptr_t * value ); + +/*! @function getTimingInfoForDisplayMode + @abstract Returns a timing description for a display mode. + @discussion IOFramebuffer subclasses should implement this method to return timing information for a display mode. This allows the OS to enable display modes based on its knowledge of the connected display type. Two types of timing information are defined, by Apple defined constant, or by a detailed description of the timing parameters of the mode. + @param displayMode A display mode ID representing the mode to examine. + @param info The driver returns the information for the display mode in this structure.
+ If the mode has an Apple defined constant, such as timingVESA_1024x768_75hz, it should be returned in the appleTimingID field. Otherwise the field should be set to timingInvalid.
+ If the driver is able to supply detailed timing information, it should return it in the detailedInfo.v2 field of the structure, otherwise the driver should clear the kIODetailedTimingValid flag from the flags field.
+ The IODetailedTimingInformationV2 structure is documented in IOGraphicsTypes.h + @result an IOReturn code. A return other than kIOReturnSuccess will prevent the system from using the device. +*/ + + virtual IOReturn getTimingInfoForDisplayMode( + IODisplayModeID displayMode, IOTimingInformation * info ); + +/*! @function validateDetailedTiming + @abstract Reports whether a detailed timing is able to be programmed with the device. + @discussion IOFramebuffer subclasses may implement programmable mode functionality where the OS is able to install modes described by a detailed timing into the driver. + @param description A pointer to a IODetailedTimingInformationV2 structure. The driver should examine this description and change any fields that it cannot implement to reflect its closest possible implementation. + @param descripSize sizeof(IODetailedTimingInformationV2) + @result an IOReturn code. A return other than kIOReturnSuccess will prevent the system from installing the programmable mode. +*/ + + virtual IOReturn validateDetailedTiming( + void * description, IOByteCount descripSize ); + +/*! @function setDetailedTimings + @abstract Installs an array of OS programmed detailed timings to be made available by the driver. + @discussion IOFramebuffer subclasses may implement programmable mode functionality where the OS is able to install modes described by a detailed timing into the driver. The driver needs to add these modes to its internal mode list if it provides this functionality. + @param array An OSArray of OSData objects. Each OSData contains one IODetailedTimingInformationV2 structure. All the data described by the array should be copied or retained by this call until the next invocation of this method. + @result an IOReturn code. A return other than kIOReturnSuccess will prevent the system from installing the programmable modes. +*/ + + virtual IOReturn setDetailedTimings( OSArray * array ); + +/*! @function getConnectionCount + @abstract Reports the number of display connections the device supports, driven from one framebuffer. + @discussion IOFramebuffer subclasses may implement functionality where a single framebuffer drives multiple displays. This is not recommended or fully supported and instead multihead cards should implement multiple instances of IOFramebuffer objects to provide full functionality. + @result A count of the number of display connections reported by the framebuffer. Current versions of OS X only support one connection completely. +*/ + + virtual IOItemCount getConnectionCount( void ); + + +/*! @function setAttributeForConnection + @abstract Generic method to set some attribute of the framebuffer device, specific to one display connection. + @discussion IOFramebuffer subclasses may implement this method to allow arbitrary attribute/value pairs to be set, specific to one display connection. + @param attribute Defines the attribute to be set. Some defined attributes are:
+ kIOCapturedAttribute If the device supports hotplugging displays, it should disable the generation of hot plug interrupts when the attribute kIOCapturedAttribute is set to true. + @param value The new value for the attribute. + @result an IOReturn code. +*/ + + virtual IOReturn setAttributeForConnection( IOIndex connectIndex, + IOSelect attribute, uintptr_t value ); + +/*! @function getAttributeForConnection + @abstract Generic method to retrieve some attribute of the framebuffer device, specific to one display connection. + @discussion IOFramebuffer subclasses may implement this method to allow arbitrary attribute/value pairs to be returned, specific to one display connection. + @param attribute Defines the attribute to be returned. Some defined attributes are:
+ kConnectionSupportsHLDDCSense If the framebuffer supports the DDC methods hasDDCConnect() and getDDCBlock() it should return success (and no value) for this attribute.
+ kConnectionSupportsLLDDCSense If the framebuffer wishes to make use of IOFramebuffer::doI2CRequest software implementation of I2C it should implement the I2C methods setDDCClock(), setDDCData(), readDDCClock(), readDDCData(), and it should return success (and no value) for this attribute.
+ @param value Returns the value for the attribute. + @result an IOReturn code. +*/ + + virtual IOReturn getAttributeForConnection( IOIndex connectIndex, + IOSelect attribute, uintptr_t * value ); + +/*! @function convertCursorImage + @abstract Utility method of IOFramebuffer to convert cursor image to a hardware cursor format. + @discussion IOFramebuffer subclasses may implement hardware cursor functionality, if so they should pass the cursor image given by the setCursorImage() method, with a description of their hardware cursor format, to this helper function to this routine to convert the image to one suitable for the hardware. + @param cursorImage Opaque cursor parameter from the setCursorImage() call. + @param description Describes the cursor format supported by the driver. + @param cursor Structure describing the drivers allocated buffer to receive the converted image. + @result a bool indicating the conversion was successful. +*/ + + virtual bool convertCursorImage( void * cursorImage, + IOHardwareCursorDescriptor * description, + IOHardwareCursorInfo * cursor ); + +/*! @function setCursorImage + @abstract Set a new image for the hardware cursor. + @discussion IOFramebuffer subclasses may implement hardware cursor functionality, if so they should implement this method to change the hardware cursor image. The image should be passed to the convertCursorImage() method with each type of cursor format the hardware supports until success, if all fail the hardware cursor should be hidden and kIOReturnUnsupported returned. + @param cursorImage Opaque cursor description. This should be passed to the convertCursorImage() method to convert to a format specific to the hardware. + @result An IOReturn code. +*/ + + virtual IOReturn setCursorImage( void * cursorImage ); + +/*! @function setCursorState + @abstract Set a new position and visibility for the hardware cursor. + @discussion IOFramebuffer subclasses may implement hardware cursor functionality, if so they should implement this method to change the position and visibility of the cursor. + @param x Left coordinate of the cursor image. A signed value, will be negative if the cursor's hot spot and position place it partly offscreen. + @param y Top coordinate of the cursor image. A signed value, will be negative if the cursor's hot spot and position place it partly offscreen. + @param visible Visible state of the cursor. + @result An IOReturn code. +*/ + + virtual IOReturn setCursorState( SInt32 x, SInt32 y, bool visible ); + +/*! @function flushCursor + @abstract Perform any needed cache flushing after software cursor rendering. + @discussion IOFramebuffer implements software cursor functionality when a hardware cursor is unavailable. Some hardware may need to flush a cache after the processor has finished lifting and dropping the software cursor. +*/ + + virtual void flushCursor( void ); + +/*! @function getAppleSense + @abstract Return display sense information for legacy Apple sensing. + @discussion Hardware that supports simple display sensing, or the classic 3 pin Apple sensing described in Designing Cards and Drivers, should implement this method to return sense information. + @param connectIndex Index of the display connection, from zero to the value of getConnectionCount(). + @param senseType Return zero to indicate legacy Apple sensing. + @param primary Return the value of the primary Apple sense code. + @param extended Return the value of the secondary Apple sense code. + @param displayType Return an Apple defined constant for the type of display sensed. For example, kVGAConnect, kNTSCConnect, kPALConnect etc. + @result An IOReturn code. +*/ + + virtual IOReturn getAppleSense( IOIndex connectIndex, + UInt32 * senseType, + UInt32 * primary, + UInt32 * extended, + UInt32 * displayType ); + +/*! @function connectFlags + @abstract Return display sense information for legacy Apple sensing. + @discussion Hardware that supports simple display sensing, or the classic 3 pin Apple sensing described in Designing Cards and Drivers, should implement this method to return mode flags relative to the sensed display. If this method is unimplemented, all modes have are given the flags kDisplayModeValidFlag | kDisplayModeSafeFlag. + @param connectIndex Index of the display connection, from zero to the value of getConnectionCount(). + @param displayMode A display mode ID. + @param flags Return the flags value for the given mode with the connected display. Flags are:
+ kDisplayModeValidFlag - mode is considered valid for the connected display by the driver. + kDisplayModeSafeFlag - mode is considered safe (not requiring mode change confirmation) for the connected display by the driver. + kDisplayModeDefaultFlag - mode is considered default for the connected display by the driver. + @result An IOReturn code. +*/ + + virtual IOReturn connectFlags( IOIndex connectIndex, + IODisplayModeID displayMode, IOOptionBits * flags ); + + //// IOLowLevelDDCSense + +/*! @function setDDCClock + @abstract Sets the state of the I2C clock line on a bus. + @discussion Framebuffers making use of the IOFramebuffer::doI2CRequest() software implementation of I2C should implement this method to set the state of the I2C clock line on the given bus. Otherwise may be unimplemented. + @param bus Index of the bus. + @param value One of kIODDCLow, kIODDCHigh, kIODDCTristate. +*/ + + virtual void setDDCClock( IOIndex bus, UInt32 value ); + +/*! @function setDDCData + @abstract Sets the state of the I2C data line on a bus. + @discussion Framebuffers making use of the IOFramebuffer::doI2CRequest() software implementation of I2C should implement this method to set the state of the I2C data line on the given bus. Otherwise may be unimplemented. + @param bus Index of the bus. + @param value One of kIODDCLow, kIODDCHigh, kIODDCTristate. +*/ + virtual void setDDCData( IOIndex bus, UInt32 value ); + +/*! @function readDDCClock + @abstract Reads the input state of the I2C clock line on a bus. + @discussion Framebuffers making use of the IOFramebuffer::doI2CRequest() software implementation of I2C should implement this method to return the input state of the I2C clock line on the given bus. Otherwise may be unimplemented. + @param bus Index of the bus. + @result A boolean reflecting the current state of the clock line on the given bus. +*/ + virtual bool readDDCClock( IOIndex bus ); + +/*! @function readDDCData + @abstract Reads the input state of the I2C data line on a bus. + @discussion Framebuffers making use of the IOFramebuffer::doI2CRequest() software implementation of I2C should implement this method to return the input state of the I2C data line on the given bus. Otherwise may be unimplemented. + @param bus Index of the bus. + @result A boolean reflecting the current state of the data line on the given bus. +*/ + virtual bool readDDCData( IOIndex bus ); + + virtual IOReturn enableDDCRaster( bool enable ); + +/*! @function hasDDCConnect + @abstract Return display DDC connect state. + @discussion Hardware that supports DDC/EDID display sensing should implement this method to return true if a DDC display is detected. They should also return success for the connection attribute kConnectionSupportsHLDDCSense (from getAttributeForConnection()). + @param connectIndex Index of the display connection, from zero to the value of getConnectionCount(). + @result True if a DDC display is detected. +*/ + + virtual bool hasDDCConnect( IOIndex connectIndex ); + +/*! @function getDDCBlock + @abstract Return display EDID data. + @discussion Hardware that supports DDC/EDID display sensing should implement this method to return EDID data in 128 byte blocks. + @param connectIndex Index of the display connection, from zero to the value of getConnectionCount(). + @param blockNumber Block number, ranging from one to the number of blocks return by the display. + @param blockType kIODDCBlockTypeEDID will be passed. + @param options No options are currently defined. + @param data Caller allocated buffer to receive the blocks data. + @param length In/out parameter - callers allocated buffer size, driver returns actual size. + @result An IOReturn code. +*/ + + virtual IOReturn getDDCBlock( IOIndex connectIndex, UInt32 blockNumber, + IOSelect blockType, IOOptionBits options, + UInt8 * data, IOByteCount * length ); + +/*! @function registerForInterruptType + @abstract Set callbacks for driver to call on interrupt events. + @discussion The IOFramebuffer class will call its subclasses to set callbacks to be called on interrupt events generated by hardware events. Only two are currently in use - vertical blank interrupts and connection changed interrupts. + @param interruptType One of these constants:
+ kIOFBVBLInterruptType Specifying a vertical blanking interrupt. + kIOFBConnectInterruptType Specify the display connection should be resensed. + @param proc C callback to be called by the driver when the specified event occurs. + @param target Target parameter for the callback proc. + @param ref Ref parameter for the callback proc. + @param interruptRef The subclass should return an opaque reference to the installed interrupt handler, for use with unregisterInterrupt() and setInterruptState(). + @result An IOReturn code. +*/ + + virtual IOReturn registerForInterruptType( IOSelect interruptType, + IOFBInterruptProc proc, OSObject * target, void * ref, + void ** interruptRef ); + +/*! @function unregisterInterrupt + @abstract Remove a callback previously installed by registerForInterruptType(). + @discussion Remove a callback previously installed by registerForInterruptType(). + @param interruptRef The interruptRef returned from the registerForInterruptType call that installed the interrupt. + @result An IOReturn code. +*/ + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Woverloaded-virtual" + virtual IOReturn unregisterInterrupt( void * interruptRef ); +#pragma clang diagnostic pop + +/*! @function unregisterInterrupt + @abstract Enable or disable a callback previously installed by registerForInterruptType(). + @discussion Enable or disable a callback previously installed by registerForInterruptType(). + @param state True or false to enable the callback. + @result An IOReturn code. +*/ + + virtual IOReturn setInterruptState( void * interruptRef, UInt32 state ); + + virtual IOReturn getNotificationSemaphore( IOSelect interruptType, + semaphore_t * semaphore ); + + IOReturn setBackingFramebuffer(const IOPixelInformation * info, + uint32_t bufferCount, + void * mappedAddress[]); + IOReturn switchBackingFramebuffer(uint32_t bufferIndex); + +/* non WL clients apis +*/ + IOReturn setAttributeExt( IOSelect attribute, uintptr_t value ); + + IOReturn getAttributeExt( IOSelect attribute, uintptr_t * value ); + + IOReturn setAttributeForConnectionExt( IOIndex connectIndex, + IOSelect attribute, uintptr_t value ); + + IOReturn getAttributeForConnectionExt( IOIndex connectIndex, + IOSelect attribute, uintptr_t * value ); + + /* New */ + IONotifier * addFramebufferNotificationWithOptions(IOFramebufferNotificationHandler handler, + OSObject * target, void * ref, + IOSelect groupID, IOIndex groupPriority, IOSelect events); + + void resetLimitState(void); + void sendLimitState(const uint32_t line); +}; + +#endif /* ! _IOKIT_IOFRAMEBUFFER_H */ diff --git a/QualcommWireless/include/IOKit/graphics/IOFramebufferShared.h b/QualcommWireless/include/IOKit/graphics/IOFramebufferShared.h new file mode 100644 index 0000000..4034934 --- /dev/null +++ b/QualcommWireless/include/IOKit/graphics/IOFramebufferShared.h @@ -0,0 +1,261 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOFRAMEBUFFERSHARED_H +#define _IOKIT_IOFRAMEBUFFERSHARED_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*! @header IOFramebufferShared +The IOFramebufferShared.h header contains definitions of objects and types shared between a kernel level IOFrameBuffer service and a non-kernel window server. In Mac OS X this structure is used by the CoreGraphics server and IOGraphics Family, and is not available to other clients. IOFramebuffer subclasses and IOFramebuffer clients within the kernel should also not rely on this structure definition and constants. It is public only for use on Darwin based window servers. Cursor and window server state data is exchanged by kernel and non-kernel tasks through a slice of shared memory containing a StdFBShmem_t structure.
+For a non-kernel task to get access to this slice of shared memory, a connection to an IOFramebuffer service must be made. A connection is made with the IOServiceOpen() function described in IOKitLib.h. A connection type of kIOFBServerConnectType or kIOFBSharedConnectType (for read-only access) should be specified. An io_connect_t handle is returned by IOServiceOpen(). This handle must be passed to IOFBCreateSharedCursor() to create the slice of shared memory. Then IOConnectMapMemory() may be called with a memory type of kIOFBCursorMemory to map the shared memory into the non-kernel task. +*/ + +#ifdef KERNEL +// CGS use optional +/*! @defined IOFB_ARBITRARY_SIZE_CURSOR + @discussion When IOFB_ARBITRARY_SIZE_CURSOR is not defined, the maximum cursor size is assumed to be CURSORWIDTH x CURSORHEIGHT and this header file will define a number of structures for storing cursor images accordingly. A non-kernel task may define IOFB_ARBITRARY_SIZE_CURSOR and use cursors up to the size specified when IOFBCreateSharedCursor() was called. In this case appropriate structures for storing cursor images must be defined elsewhere. In the kernel, IOFB_ARBITRARY_SIZE_CURSOR is always defined. +*/ +#define IOFB_ARBITRARY_SIZE_CURSOR +#define IOFB_ARBITRARY_FRAMES_CURSOR 1 +#endif + +#define IOFB_SUPPORTS_XOR_CURSOR +#define IOFB_SUPPORTS_HW_SHIELD +#define IOFB_SUPPORTS_ARBITRARY_FRAMES_CURSOR + +// +// Cursor and Window Server state data, occupying a slice of shared memory +// between the kernel and WindowServer. +// +/*! @enum CursorParameters + @constant kIOFBNumCursorFrames The number of cursor images stored in the StdFBShmem_t structure. + @constant kIOFBNumCursorFramesShift Used with waiting cursors. + @constant kIOFBMaxCursorDepth The maximum cursor pixel depth. +*/ +enum { +#if IOFB_ARBITRARY_FRAMES_CURSOR + kIOFBMainCursorIndex = 0, + kIOFBWaitCursorIndex = 1, + kIOFBNumCursorIndex = 4, +#else + kIOFBNumCursorFrames = 4, + kIOFBNumCursorFramesShift = 2, +#endif + kIOFBMaxCursorDepth = 32, + kIOFBMaxCursorWidth = 256, + kIOFBMaxCursorFrames = 32, +}; + +#ifndef IOFB_ARBITRARY_SIZE_CURSOR + +/*! @defined CURSORWIDTH + @discussion The maximum width of the cursor image in pixels. This is only defined if IOFB_ARBITRARY_SIZE_CURSOR is not defined. +*/ +#define CURSORWIDTH 16 /* width in pixels */ + +/*! @defined CURSORHEIGHT + @discussion The maximum height of the cursor image in pixels. This is only defined if IOFB_ARBITRARY_SIZE_CURSOR is not defined. +*/ +#define CURSORHEIGHT 16 /* height in pixels */ + +/*! @struct bm12Cursor + @abstract Cursor image for 1-bit cursor. + @discussion This structure stores 16 pixel x 16 pixel cursors to be used with 1-bit color depth. This structure is only defined if IOFB_ARBITRARY_SIZE_CURSOR is not defined. + @field image This array contains the cursor images. + @field mask This array contains the cursor mask. + @field save This array stores the pixel values of the region underneath the cursor in its last drawn position. +*/ +struct bm12Cursor { + unsigned int image[4][16]; + unsigned int mask[4][16]; + unsigned int save[16]; +}; + +/*! @struct bm18Cursor + @abstract Cursor image for 8-bit cursor. + @discussion This structure stores 16 pixel x 16 pixel cursors to be used with 8-bit color depth. This structure is only defined if IOFB_ARBITRARY_SIZE_CURSOR is not defined. + @field image This array contains cursor color values, which are converted to displayed colors through the color table. The array is two dimensional and its first index is the cursor frame and the second index is the cursor pixel. + @field mask This array contains the cursor alpha mask. The array is two dimensional with the same indexing as the image. If an alpha mask pixel is 0 and the corresponding image pixel is set to white for the display, then this cursor pixel will invert pixels on the display. + @field save This array stores the color values of the region underneath the cursor in its last drawn position. +*/ +struct bm18Cursor { + unsigned char image[4][256]; + unsigned char mask[4][256]; + unsigned char save[256]; +}; + +/*! @struct bm34Cursor + @abstract Cursor image for 15-bit cursor. + @discussion This structure stores 16 pixel x 16 pixel cursors to be used with 15-bit color depth. This structure is only defined if IOFB_ARBITRARY_SIZE_CURSOR is not defined. + @field image This array defines the cursor color values and transparency. The array is two dimensional and its first index is the cursor frame and the second index is the cursor pixel. A value of 0 means the pixel is transparent. Non-zero values are stored with the red, green, blue, and alpha values encoded with the following masks:
+ red mask = 0xF000
+ blue mask 0x0F00
+ green mask 0x00F0
+ alpha mask = 0x000F
+Note, only 4 bits are allocated for each color component. + @field save This array stores the color values of the region underneath the cursor in its last drawn position. +*/ +struct bm34Cursor { + unsigned short image[4][256]; + unsigned short save[256]; +}; + +/*! @struct bm38Cursor + @abstract Cursor image for 24-bit cursor. + @discussion This structure stores 16 pixel x 16 pixel cursors to be used with 24-bit color depth. This structure is only defined if IOFB_ARBITRARY_SIZE_CURSOR is not defined. + @field image This array defines the cursor color values and transparency. The array is two dimensional and its first index is the cursor frame and the second index is the cursor pixel. The lower 24 bits of a pixel's value contain the RGB color, while the upper 8 bits contain the alpha value. + @field save This array stores the color values of the region underneath the cursor in its last drawn position. +*/ +struct bm38Cursor { + unsigned int image[4][256]; + unsigned int save[256]; +}; + +#endif /* IOFB_ARBITRARY_SIZE_CURSOR */ + +enum { + kIOFBCursorImageNew = 0x01, + kIOFBCursorHWCapable = 0x02 +}; +enum { + kIOFBHardwareCursorActive = 0x01, + kIOFBHardwareCursorInVRAM = 0x02 +}; + +/*! @struct StdFBShmem_t + @discussion This structure contains cursor and window server state data and occupies a slice of shared memory between the kernel and window server. Several elements of this structure are only used in software cursor mode. Unless otherwise indicated, the coordinates in this structure are given in display space. Display space is the coordinate space that encompasses all the screens. The positions of the screens within display space indicate their location relative to each other as the cursor moves between them. If there is only one screen, the screen coordinates and display space coordinates will be the same. + @field cursorSema Semaphore lock for write access to the shared data in this structure. + @field frame The current cursor frame index. + @field cursorShow The cursor is displayed when cursorShow is 0. + @field cursorObscured If this is true, the cursor has been obscured and cursorShow should not be 0. The cursor will be shown again the next time it is moved. + @field shieldFlag When this is set to true the cursor will not be displayed in the region specified by shieldRect. + @field shielded True if the cursor has been hidden because it entered the shielded region. + @field saveRect The region that is saved underneath the cursor in software cursor mode. + @field shieldRect The region that the cursor will not be displayed in if shieldFlag is true. + @field cursorLoc The location of the cursor hot spot. + @field cursorRect The region that the cursor image currently occupies in software cursor mode. + @field oldCursorRect The region that the cursor image occupied the last time the cursor was drawn in software cursor mode. + @field screenBounds The region that the current screen occupies. + @field version Contains kIOFBCurrentShmemVersion so that a user client can ensure it is using the same version of this structure as the kernel. + @field structSize Contains the size of this structure. + @field vblTime The time of the most recent vertical blanking. + @field vblDelta The interval between the two most recent vertical blankings. + @field vblCount A running count of vertical blank interrupts. + @field reservedC Reserved for future use. + @field hardwareCursorCapable True if the hardware is capable of using hardware cursor mode. + @field hardwareCursorActive True if currently using the hardware cursor mode. + @field reservedB Reserved for future use. + @field cursorSize This array contains the cursor sizes indexed by frame. + @field hotSpot This array contains the location of the cursor hot spots indexed by frame. The hot spots coordinates are given relative to the top left corner of the cursor image. + @field cursor A union of structures that define the cursor images. The structure used depends on the framebuffer's bit depth. These structures are defined above. +*/ + +struct StdFBShmem_t { + OSSpinLock cursorSema; + int frame; + char cursorShow; + char cursorObscured; + char shieldFlag; + char shielded; + IOGBounds saveRect; + IOGBounds shieldRect; + IOGPoint cursorLoc; + IOGBounds cursorRect; + IOGBounds oldCursorRect; + IOGBounds screenBounds; + int version; + int structSize; + AbsoluteTime vblTime; + AbsoluteTime vblDelta; + unsigned long long int vblCount; +#if IOFB_ARBITRARY_FRAMES_CURSOR + unsigned long long int vblDrift; + unsigned long long int vblDeltaMeasured; + AbsoluteTime vblDeltaReal; + unsigned int reservedC[22]; +#else + unsigned int reservedC[27]; + unsigned char hardwareCursorFlags[kIOFBNumCursorFrames]; +#endif + unsigned char hardwareCursorCapable; + unsigned char hardwareCursorActive; + unsigned char hardwareCursorShields; + unsigned char reservedB[1]; +#if IOFB_ARBITRARY_FRAMES_CURSOR + IOGSize cursorSize[kIOFBNumCursorIndex]; + IOGPoint hotSpot[kIOFBNumCursorIndex]; +#else + IOGSize cursorSize[kIOFBNumCursorFrames]; + IOGPoint hotSpot[kIOFBNumCursorFrames]; +#endif +#ifndef IOFB_ARBITRARY_SIZE_CURSOR + union { + struct bm12Cursor bw; + struct bm18Cursor bw8; + struct bm34Cursor rgb; + struct bm38Cursor rgb24; + } cursor; +#else /* IOFB_ARBITRARY_SIZE_CURSOR */ + unsigned char cursor[0]; +#endif /* IOFB_ARBITRARY_SIZE_CURSOR */ +}; +#ifndef __cplusplus +typedef volatile struct StdFBShmem_t StdFBShmem_t; +#endif + + +/*! @enum FramebufferConstants + @constant kIOFBCurrentShmemVersion The current version of the slice of shared memory that contains the cursor and window server state data in the StdFBShmem_t structure. + @constant kIOFBCursorMemory The memory type for IOConnectMapMemory() to get a slice of shared memory that contains the StdFBShmem_t structure. +*/ +enum { + // version for IOFBCreateSharedCursor + kIOFBShmemVersionMask = 0x000000ff, + kIOFBTenPtOneShmemVersion = 2, + kIOFBTenPtTwoShmemVersion = 3, + kIOFBCurrentShmemVersion = 2, + + // number of frames in animating cursor (if > kIOFBTenPtTwoShmemVersion) + kIOFBShmemCursorNumFramesMask = 0x00ff0000, + kIOFBShmemCursorNumFramesShift = 16, + + // memory types for IOConnectMapMemory. + kIOFBCursorMemory = 100 +}; + +/*! @defined IOFRAMEBUFFER_CONFORMSTO + @discussion The class name of the framebuffer service. +*/ +#define IOFRAMEBUFFER_CONFORMSTO "IOFramebuffer" + +#ifdef __cplusplus +} +#endif + +#endif /* ! _IOKIT_IOFRAMEBUFFERSHARED_H */ diff --git a/QualcommWireless/include/IOKit/graphics/IOGraphicsDevice.h b/QualcommWireless/include/IOKit/graphics/IOGraphicsDevice.h new file mode 100644 index 0000000..b724d5a --- /dev/null +++ b/QualcommWireless/include/IOKit/graphics/IOGraphicsDevice.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#ifndef _IOKIT_IOGRAPHICSDEVICE_H +#define _IOKIT_IOGRAPHICSDEVICE_H + +#include + +#include + + +class IOGraphicsDevice : public IOService +{ + OSDeclareAbstractStructors(IOGraphicsDevice) + +public: + + virtual void hideCursor( void ) = 0; + virtual void showCursor( IOGPoint * cursorLoc, int frame ) = 0; + virtual void moveCursor( IOGPoint * cursorLoc, int frame ) = 0; + + virtual void getVBLTime( AbsoluteTime * time, AbsoluteTime * delta ) = 0; + + virtual void getBoundingRect ( IOGBounds ** bounds ) = 0; +}; + +#endif /* ! _IOKIT_IOGRAPHICSDEVICE_H */ + diff --git a/QualcommWireless/include/IOKit/graphics/IOGraphicsEngine.h b/QualcommWireless/include/IOKit/graphics/IOGraphicsEngine.h new file mode 100644 index 0000000..8b1ccaa --- /dev/null +++ b/QualcommWireless/include/IOKit/graphics/IOGraphicsEngine.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1998 Apple Computer, Inc. All rights reserved. + * + * HISTORY + * + * 10 Mar 99 sdouglas created. + */ + + +struct IOGraphicsEngineContext { + OSSpinLock contextLock; + IOOptionBits state; + void * owner; + UInt32 version; + IOByteCount structSize; + UInt32 reserved[ 8 ]; +}; +#ifndef __cplusplus +typedef volatile struct IOGraphicsEngineContext IOGraphicsEngineContext; +#endif + +enum { + // memory type for IOMapMemory + kIOGraphicsEngineContext = 100 +}; + +enum { + // version + kIOGraphicsEngineContextVersion = 1 +}; diff --git a/QualcommWireless/include/IOKit/graphics/IOGraphicsInterfaceTypes.h b/QualcommWireless/include/IOKit/graphics/IOGraphicsInterfaceTypes.h new file mode 100644 index 0000000..5b392a7 --- /dev/null +++ b/QualcommWireless/include/IOKit/graphics/IOGraphicsInterfaceTypes.h @@ -0,0 +1,301 @@ +/* + * Copyright (c) 1999-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOGRAPHICSINTERFACETYPES_H +#define _IOKIT_IOGRAPHICSINTERFACETYPES_H + +#include + +#define IO_FOUR_CHAR_CODE(x) (x) + +typedef UInt32 IOFourCharCode; + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#define kCurrentGraphicsInterfaceVersion 1 +#define kCurrentGraphicsInterfaceRevision 2 + + +#ifdef IOGA_COMPAT +typedef SInt32 IOBlitCompletionToken; +#endif + +typedef UInt32 IOBlitType; +enum { + kIOBlitTypeVerbMask = 0x000000ff, + kIOBlitTypeRects = 0, + kIOBlitTypeCopyRects, + kIOBlitTypeLines, + kIOBlitTypeScanlines, + kIOBlitTypeCopyRegion, + + kIOBlitTypeMoveCursor, + kIOBlitTypeShowCursor, + kIOBlitTypeHideCursor, + + kIOBlitTypeMonoExpand = 0x00000100, + kIOBlitTypeColorSpaceConvert = 0x00000200, + kIOBlitTypeScale = 0x00000400, + + kIOBlitTypeSourceKeyColorModeMask = 0x00003000, + kIOBlitTypeDestKeyColorModeMask = 0x0000c000, + kIOBlitTypeSourceKeyColorEqual = 0x00001000, + kIOBlitTypeSourceKeyColorNotEqual = 0x00002000, + kIOBlitTypeDestKeyColorEqual = 0x00004000, + kIOBlitTypeDestKeyColorNotEqual = 0x00008000, + + kIOBlitTypeOperationMask = 0x0fff0000, + kIOBlitTypeOperationShift = 16, + kIOBlitTypeOperationTypeMask = 0x0f000000, + + kIOBlitTypeOperationType0 = 0x00000000, + kIOBlitCopyOperation = 0x00000000 | kIOBlitTypeOperationType0, + kIOBlitOrOperation = 0x00010000 | kIOBlitTypeOperationType0, + kIOBlitXorOperation = 0x00020000 | kIOBlitTypeOperationType0, + kIOBlitBlendOperation = 0x00030000 | kIOBlitTypeOperationType0, + kIOBlitHighlightOperation = 0x00040000 | kIOBlitTypeOperationType0 +}; + +typedef UInt32 IOBlitSourceType; +enum { + kIOBlitSourceDefault = 0x00000000, + kIOBlitSourceFramebuffer = 0x00001000, + kIOBlitSourceMemory = 0x00002000, + kIOBlitSourceOOLMemory = 0x00003000, + kIOBlitSourcePattern = 0x00004000, + kIOBlitSourceOOLPattern = 0x00005000, + kIOBlitSourceSolid = 0x00006000, + kIOBlitSourceCGSSurface = 0x00007000, + kIOBlitSourceIsSame = 0x80000000 +}; + +#ifdef IOGA_COMPAT +typedef IOBlitSourceType IOBlitSourceDestType; +enum { + kIOBlitDestFramebuffer = 0x00000001 +}; +#endif + +typedef struct IOBlitOperationStruct { + UInt32 color0; + UInt32 color1; + SInt32 offsetX; + SInt32 offsetY; + UInt32 sourceKeyColor; + UInt32 destKeyColor; + UInt32 specific[16]; +} IOBlitOperation; + +typedef struct IOBlitRectangleStruct { + SInt32 x; + SInt32 y; + SInt32 width; + SInt32 height; +} IOBlitRectangle; + +typedef struct IOBlitRectanglesStruct { + IOBlitOperation operation; + IOItemCount count; + IOBlitRectangle rects[1]; +} IOBlitRectangles; + +typedef struct IOBlitCopyRectangleStruct { + SInt32 sourceX; + SInt32 sourceY; + SInt32 x; + SInt32 y; + SInt32 width; + SInt32 height; +} IOBlitCopyRectangle; + +typedef struct IOBlitCopyRectanglesStruct { + IOBlitOperation operation; + IOItemCount count; + IOBlitCopyRectangle rects[1]; +} IOBlitCopyRectangles; + + +typedef struct IOBlitCopyRegionStruct { + IOBlitOperation operation; + SInt32 deltaX; + SInt32 deltaY; + IOAccelDeviceRegion * region; +} IOBlitCopyRegion; + + +typedef struct IOBlitVertexStruct { + SInt32 x; + SInt32 y; +} IOBlitVertex; + +typedef struct IOBlitVerticesStruct { + IOBlitOperation operation; + IOItemCount count; + IOBlitVertex vertices[2]; +} IOBlitVertices; + +typedef struct IOBlitScanlinesStruct { + IOBlitOperation operation; + IOItemCount count; + SInt32 y; + SInt32 height; + SInt32 x[2]; +} IOBlitScanlines; + + +typedef struct IOBlitCursorStruct { + IOBlitOperation operation; + IOBlitRectangle rect; +} IOBlitCursor; + +typedef struct _IOBlitMemory * IOBlitMemoryRef; + + +/* Quickdraw.h pixel formats*/ + +enum { + kIO1MonochromePixelFormat = 0x00000001, /* 1 bit indexed*/ + kIO2IndexedPixelFormat = 0x00000002, /* 2 bit indexed*/ + kIO4IndexedPixelFormat = 0x00000004, /* 4 bit indexed*/ + kIO8IndexedPixelFormat = 0x00000008, /* 8 bit indexed*/ + kIO16BE555PixelFormat = 0x00000010, /* 16 bit BE rgb 555 (Mac)*/ + kIO24RGBPixelFormat = 0x00000018, /* 24 bit rgb */ + kIO32ARGBPixelFormat = 0x00000020, /* 32 bit argb (Mac)*/ + kIO1IndexedGrayPixelFormat = 0x00000021, /* 1 bit indexed gray*/ + kIO2IndexedGrayPixelFormat = 0x00000022, /* 2 bit indexed gray*/ + kIO4IndexedGrayPixelFormat = 0x00000024, /* 4 bit indexed gray*/ + kIO8IndexedGrayPixelFormat = 0x00000028 /* 8 bit indexed gray*/ +}; + +enum { + kIO16LE555PixelFormat = IO_FOUR_CHAR_CODE('L555'), /* 16 bit LE rgb 555 (PC)*/ + kIO16LE5551PixelFormat = IO_FOUR_CHAR_CODE('5551'), /* 16 bit LE rgb 5551*/ + kIO16BE565PixelFormat = IO_FOUR_CHAR_CODE('B565'), /* 16 bit BE rgb 565*/ + kIO16LE565PixelFormat = IO_FOUR_CHAR_CODE('L565'), /* 16 bit LE rgb 565*/ + kIO24BGRPixelFormat = IO_FOUR_CHAR_CODE('24BG'), /* 24 bit bgr */ + kIO32BGRAPixelFormat = IO_FOUR_CHAR_CODE('BGRA'), /* 32 bit bgra (Matrox)*/ + kIO32ABGRPixelFormat = IO_FOUR_CHAR_CODE('ABGR'), /* 32 bit abgr */ + kIO32RGBAPixelFormat = IO_FOUR_CHAR_CODE('RGBA'), /* 32 bit rgba */ + kIOYUVSPixelFormat = IO_FOUR_CHAR_CODE('yuvs'), /* YUV 4:2:2 byte ordering 16-unsigned = 'YUY2'*/ + kIOYUVUPixelFormat = IO_FOUR_CHAR_CODE('yuvu'), /* YUV 4:2:2 byte ordering 16-signed*/ + kIOYVU9PixelFormat = IO_FOUR_CHAR_CODE('YVU9'), /* YVU9 Planar 9*/ + kIOYUV411PixelFormat = IO_FOUR_CHAR_CODE('Y411'), /* YUV 4:1:1 Interleaved 16*/ + kIOYVYU422PixelFormat = IO_FOUR_CHAR_CODE('YVYU'), /* YVYU 4:2:2 byte ordering 16*/ + kIOUYVY422PixelFormat = IO_FOUR_CHAR_CODE('UYVY'), /* UYVY 4:2:2 byte ordering 16*/ + kIOYUV211PixelFormat = IO_FOUR_CHAR_CODE('Y211'), /* YUV 2:1:1 Packed 8*/ + kIO2vuyPixelFormat = IO_FOUR_CHAR_CODE('2vuy') /* UYVY 4:2:2 byte ordering 16*/ +}; + +/* Non Quickdraw.h pixel formats*/ +enum { + kIO16LE4444PixelFormat = IO_FOUR_CHAR_CODE('L444'), /* 16 bit LE argb 4444*/ + kIO16BE4444PixelFormat = IO_FOUR_CHAR_CODE('B444'), /* 16 bit BE argb 4444*/ + kIO64BGRAPixelFormat = IO_FOUR_CHAR_CODE('B16I'), /* 64 bit bgra */ + kIO64RGBAFloatPixelFormat = IO_FOUR_CHAR_CODE('B16F'), /* 64 bit rgba */ + kIO128RGBAFloatPixelFormat = IO_FOUR_CHAR_CODE('B32F') /* 128 bit rgba float */ +}; + +enum { + kIOBlitMemoryRequiresHostFlush = 0x00000001 +}; + +typedef struct IOBlitSurfaceStruct { + union { + UInt8 * bytes; + IOBlitMemoryRef ref; + } memory; + IOFourCharCode pixelFormat; + IOBlitRectangle size; + UInt32 rowBytes; + UInt32 byteOffset; + UInt32 * palette; + IOOptionBits accessFlags; + IOBlitMemoryRef interfaceRef; + UInt32 more[14]; +} IOBlitSurface; + +typedef IOBlitSurface IOBlitMemory; + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +enum { + // options for Synchronize + kIOBlitSynchronizeWaitBeamExit = 0x00000001, + kIOBlitSynchronizeFlushHostWrites = 0x00000002 +}; + +enum { + // options for WaitComplete & Flush + kIOBlitWaitContext = 0x00000000, + kIOBlitWaitAll2D = 0x00000001, + kIOBlitWaitGlobal = 0x00000001, + kIOBlitWaitAll = 0x00000002, + kIOBlitWaitCheck = 0x00000080, + kIOBlitFlushWithSwap = 0x00010000 +}; + +enum { + // options for AllocateSurface + kIOBlitHasCGSSurface = 0x00000001, + kIOBlitFixedSource = 0x00000002, + kIOBlitBeamSyncSwaps = 0x00000004, + kIOBlitReferenceSource = 0x00000008 +}; + +enum { + // options for UnlockSurface + kIOBlitUnlockWithSwap = 0x80000000 +}; + +enum { + // options for SetDestination + kIOBlitFramebufferDestination = 0x00000000, + kIOBlitSurfaceDestination = 0x00000001 +}; + + + +enum { + // options for blit procs + kIOBlitBeamSync = 0x00000001, + kIOBlitBeamSyncAlways = 0x00000002, + kIOBlitBeamSyncSpin = 0x00000004, + + kIOBlitAllOptions = 0xffffffff +}; + +enum { + // capabilities + kIOBlitColorSpaceTypes = IO_FOUR_CHAR_CODE('cspc') +}; + + +// keys for IOAccelFindAccelerator() +#define kIOAccelTypesKey "IOAccelTypes" +#define kIOAccelIndexKey "IOAccelIndex" + +#define kIOAccelRevisionKey "IOAccelRevision" + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#endif /* !_IOKIT_IOGRAPHICSINTERFACETYPES_H */ diff --git a/QualcommWireless/include/IOKit/graphics/IOGraphicsTypes.h b/QualcommWireless/include/IOKit/graphics/IOGraphicsTypes.h new file mode 100644 index 0000000..92feacf --- /dev/null +++ b/QualcommWireless/include/IOKit/graphics/IOGraphicsTypes.h @@ -0,0 +1,1722 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOGRAPHICSTYPES_H +#define _IOKIT_IOGRAPHICSTYPES_H + + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define IOGRAPHICSTYPES_REV 71 + +typedef SInt32 IOIndex; +typedef UInt32 IOSelect; +typedef UInt32 IOFixed1616; +typedef UInt32 IODisplayVendorID; +typedef UInt32 IODisplayProductID; + +typedef SInt32 IODisplayModeID; +enum { + // This is the ID given to a programmable timing used at boot time + kIODisplayModeIDBootProgrammable = (IODisplayModeID)0xFFFFFFFB, + // Lowest (unsigned) DisplayModeID reserved by Apple + kIODisplayModeIDReservedBase = (IODisplayModeID)0x80000000 +}; + +enum { + kIOMaxPixelBits = 64 +}; +typedef char IOPixelEncoding[ kIOMaxPixelBits ]; + +// Common Apple pixel formats + +#define IO1BitIndexedPixels "P" +#define IO2BitIndexedPixels "PP" +#define IO4BitIndexedPixels "PPPP" +#define IO8BitIndexedPixels "PPPPPPPP" +#define IO16BitDirectPixels "-RRRRRGGGGGBBBBB" +#define IO32BitDirectPixels "--------RRRRRRRRGGGGGGGGBBBBBBBB" + +#define kIO30BitDirectPixels "--RRRRRRRRRRGGGGGGGGGGBBBBBBBBBB" +#define kIO64BitDirectPixels "-16R16G16B16" + +#define kIO16BitFloatPixels "-16FR16FG16FB16" +#define kIO32BitFloatPixels "-32FR32FG32FB32" + +// other possible pixel formats + +#define IOYUV422Pixels "Y4U2V2" +#define IO8BitOverlayPixels "O8" +// page flipping +#define IOPagedPixels "Page1" + +#define IO_SampleTypeAlpha 'A' +#define IO_SampleTypeSkip '-' + +// Info about a pixel format +enum { + kIOCLUTPixels = 0, + kIOFixedCLUTPixels = 1, + kIORGBDirectPixels = 2, + kIOMonoDirectPixels = 3, + kIOMonoInverseDirectPixels = 4, + kIORGBSignedDirectPixels = 5, + kIORGBSignedFloatingPointPixels = 6 +}; + +/*! + * @struct IOPixelInformation + * @abstract A structure defining the format of a framebuffer. + * @discussion This structure is used by IOFramebuffer to define the format of the pixels. + * @field bytesPerRow The number of bytes per row. + * @field bytesPerPlane Not used. + * @field bitsPerPixel The number of bits per pixel, including unused bits and alpha. + * @field pixelType One of kIOCLUTPixels (indexed pixels with changeable CLUT), kIORGBDirectPixels (direct pixels). + * @field componentCount One for indexed pixels, three for direct pixel formats. + * @field bitsPerComponent Number of bits per component in each pixel. + * @field componentMasks Mask of the bits valid for each component of the pixel - in R, G, B order for direct pixels. + * @field pixelFormat String description of the pixel format - IO32BitDirectPixels, IO16BitDirectPixels etc. + * @field flags None defined - set to zero. + * @field activeWidth Number of pixels visible per row. + * @field activeHeight Number of visible pixel rows. + * @field reserved Set to zero. + */ + +struct IOPixelInformation { + UInt32 bytesPerRow; + UInt32 bytesPerPlane; + UInt32 bitsPerPixel; + UInt32 pixelType; + UInt32 componentCount; + UInt32 bitsPerComponent; + UInt32 componentMasks[ 8 * 2 ]; + IOPixelEncoding pixelFormat; + UInt32 flags; + UInt32 activeWidth; + UInt32 activeHeight; + UInt32 reserved[ 2 ]; +}; +typedef struct IOPixelInformation IOPixelInformation; + +// ID for industry standard display timings +typedef UInt32 IOAppleTimingID; + +/*! + * @struct IODisplayModeInformation + * @abstract A structure defining the format of a framebuffer. + * @discussion This structure is used by IOFramebuffer to define the format of the pixels. + * @field nominalWidth Number of pixels visible per row. + * @field nominalHeight Number of visible pixel rows. + * @field refreshRate Refresh rate in fixed point 16.16. + * @field maxDepthIndex Highest depth index available in this display mode. + * @field flags Flags for the mode, including:
+ * kDisplayModeInterlacedFlag mode is interlaced.
+ * kDisplayModeSimulscanFlag mode is available on multiple display connections.
+ * kDisplayModeNotPresetFlag mode is not a factory preset for the display (geometry may need correction).
+ * kDisplayModeStretchedFlag mode is stretched/distorted to match the display aspect ratio.
+ * @field imageWidth Physical width of active image if known, in millimeters, otherwise zero.
+ * @field imageHeight Physical height of active image if known, in millimeters, otherwise zero.
+ * @field reserved Set to zero. + */ + +struct IODisplayModeInformation { + UInt32 nominalWidth; + UInt32 nominalHeight; + IOFixed1616 refreshRate; + IOIndex maxDepthIndex; + UInt32 flags; + UInt16 imageWidth; + UInt16 imageHeight; + UInt32 reserved[ 3 ]; +}; +typedef struct IODisplayModeInformation IODisplayModeInformation; + +// flags +enum { + kDisplayModeSafetyFlags = 0x00000007, + + kDisplayModeAlwaysShowFlag = 0x00000008, + kDisplayModeNeverShowFlag = 0x00000080, + kDisplayModeNotResizeFlag = 0x00000010, + kDisplayModeRequiresPanFlag = 0x00000020, + + kDisplayModeInterlacedFlag = 0x00000040, + + kDisplayModeSimulscanFlag = 0x00000100, + kDisplayModeBuiltInFlag = 0x00000400, + kDisplayModeNotPresetFlag = 0x00000200, + kDisplayModeStretchedFlag = 0x00000800, + kDisplayModeNotGraphicsQualityFlag = 0x00001000, + kDisplayModeValidateAgainstDisplay = 0x00002000, + kDisplayModeTelevisionFlag = 0x00100000, + kDisplayModeValidForMirroringFlag = 0x00200000, + kDisplayModeAcceleratorBackedFlag = 0x00400000, + kDisplayModeValidForHiResFlag = 0x00800000, + kDisplayModeValidForAirPlayFlag = 0x01000000, + kDisplayModeNativeFlag = 0x02000000 +}; +enum { + kDisplayModeValidFlag = 0x00000001, + kDisplayModeSafeFlag = 0x00000002, + kDisplayModeDefaultFlag = 0x00000004 +}; + +#ifndef KERNEL +// Framebuffer info - obsolete + +struct IOFramebufferInformation { + IOPhysicalAddress baseAddress; + UInt32 activeWidth; + UInt32 activeHeight; + IOByteCount bytesPerRow; + IOByteCount bytesPerPlane; + UInt32 bitsPerPixel; + UInt32 pixelType; + UInt32 flags; + UInt32 reserved[ 4 ]; +}; +typedef struct IOFramebufferInformation IOFramebufferInformation; +#endif + +// flags +enum { + kFramebufferSupportsCopybackCache = 0x00010000, + kFramebufferSupportsWritethruCache = 0x00020000, + kFramebufferSupportsGammaCorrection = 0x00040000, + kFramebufferDisableAltivecAccess = 0x00080000 +}; + +// Aperture is an index into supported pixel formats for a mode & depth +typedef IOIndex IOPixelAperture; +enum { + kIOFBSystemAperture = 0 +}; + +//// CLUTs + +// IOFBSetGamma Sync Types +#define kIOFBSetGammaSyncNotSpecified -1 +#define kIOFBSetGammaSyncNoSync 0 +#define kIOFBSetGammaSyncVerticalBlankSync 1 + +typedef UInt16 IOColorComponent; + +/*! + * @struct IOColorEntry + * @abstract A structure defining one entry of a color lookup table. + * @discussion This structure is used by IOFramebuffer to define an entry of a color lookup table. + * @field index Number of pixels visible per row. + * @field red Value of red component 0-65535. + * @field green Value of green component 0-65535. + * @field blue Value of blue component 0-65535. + */ + +struct IOColorEntry { + UInt16 index; + IOColorComponent red; + IOColorComponent green; + IOColorComponent blue; +}; +typedef struct IOColorEntry IOColorEntry; + +// options (masks) +enum { + kSetCLUTByValue = 0x00000001, // else at index + kSetCLUTImmediately = 0x00000002, // else at VBL + kSetCLUTWithLuminance = 0x00000004 // else RGB +}; + +//// Controller attributes + +enum { + kIOPowerStateAttribute = 'pwrs', + kIOPowerAttribute = 'powr', + kIODriverPowerAttribute = 'dpow', + kIOHardwareCursorAttribute = 'crsr', + + kIOMirrorAttribute = 'mirr', + kIOMirrorDefaultAttribute = 'mrdf', + + kIOCapturedAttribute = 'capd', + + kIOCursorControlAttribute = 'crsc', + + kIOSystemPowerAttribute = 'spwr', + kIOWindowServerActiveAttribute = 'wsrv', + kIOVRAMSaveAttribute = 'vrsv', + kIODeferCLUTSetAttribute = 'vclt', + + kIOClamshellStateAttribute = 'clam', + + kIOFBDisplayPortTrainingAttribute = 'dpta', + + kIOFBDisplayState = 'dstt', + + kIOFBVariableRefreshRate = 'vrr?', + + kIOFBLimitHDCPAttribute = 'hdcp', + kIOFBLimitHDCPStateAttribute = 'sHDC', + + kIOFBStop = 'stop', + + kIOFBRedGammaScaleAttribute = 'gslr', // as of IOGRAPHICSTYPES_REV 54 + kIOFBGreenGammaScaleAttribute = 'gslg', // as of IOGRAPHICSTYPES_REV 54 + kIOFBBlueGammaScaleAttribute = 'gslb', // as of IOGRAPHICSTYPES_REV 54 + + kIOFBHDRMetaDataAttribute = 'hdrm', // as of IOGRAPHICSTYPES_REV 64 + + kIOBuiltinPanelPowerAttribute = 'pnlp', // as of IOGRAPHICSTYPES_REV 71 +}; + +enum { + kIOFBHDCPLimit_AllowAll = 0, + kIOFBHDCPLimit_NoHDCP1x = 1 << 0, + kIOFBHDCPLimit_NoHDCP20Type0 = 1 << 1, + kIOFBHDCPLimit_NoHDCP20Type1 = 1 << 2, // Default case +}; + +// kIOFBHDRMetaDataAttribute +struct IOFBHDRMetaDataV1 +{ + uint16_t displayPrimary_X0; // X coordinate of red primary + uint16_t displayPrimary_Y0; // Y coordinate of red primary + uint16_t displayPrimary_X1; // X coordinate of green primary + uint16_t displayPrimary_Y1; // Y coordinate of green primary + uint16_t displayPrimary_X2; // X coordinate of blue primary + uint16_t displayPrimary_Y2; // Y coordinate of blue primary + uint16_t displayPrimary_X; // X coordinate of white primary + uint16_t displayPrimary_Y; // Y coordinate of white primary + uint16_t desiredLuminance_Max; // Desired max display luminance + uint16_t desiredLuminance_Min; // Desired min display luminance + uint16_t desiredLightLevel_Avg; // Desired max frame-average light level + uint16_t desiredLightLevel_Max; // Desired max light level + + uint64_t __reservedA[5]; // Reserved - set to zero +}; +typedef struct IOFBHDRMetaDataV1 IOFBHDRMetaDataV1; +typedef union { + IOFBHDRMetaDataV1 v1; +} IOFBHDRMetaData; + +// IOGraphics: Implement display state attribute for deteriming display state post wake +// kIOFBDisplayState +enum { + kIOFBDisplayState_AlreadyActive = (1 << 0), + kIOFBDisplayState_RestoredProfile = (1 << 1), + kIOFBDisplayState_PipelineBlack = (1 << 2), + kIOFBDisplayState_Mask = (kIOFBDisplayState_AlreadyActive | + kIOFBDisplayState_RestoredProfile | + kIOFBDisplayState_PipelineBlack) +}; + +// values for kIOWindowServerActiveAttribute +enum { + // States + kIOWSAA_Unaccelerated = 0, // CPU rendering/access only, no GPU access + kIOWSAA_Accelerated = 1, // GPU rendering/access only, no CPU mappings + kIOWSAA_From_Accelerated = 2, // Transitioning from GPU to CPU + kIOWSAA_To_Accelerated = 3, // Transitioning from CPU to GPU + kIOWSAA_Sleep = 4, + kIOWSAA_Hibernate = kIOWSAA_Sleep, + kIOWSAA_DriverOpen = 5, // Reserved + kIOWSAA_StateMask = 0xF, + // Bits + kIOWSAA_Transactional = 0x10, // If this bit is present, transition is to/from transactional operation model. + // These attributes are internal + kIOWSAA_DeferStart = 0x100, + kIOWSAA_DeferEnd = 0x200, + kIOWSAA_NonConsoleDevice = 0x400, // If present, associated FB is non-console. See ERS for further details. + kIOWSAA_Reserved = 0xF0000000 +}; + +// IOFBNS prefix is IOFramebuffer notifyServer +enum { + kIOFBNS_Rendezvous = 0x87654321, // Note sign-bit is 1 here. + + kIOFBNS_MessageMask = 0x0000000f, + kIOFBNS_Sleep = 0x00, + kIOFBNS_Wake = 0x01, + kIOFBNS_Doze = 0x02, +#ifndef _OPEN_SOURCE_ + // IOGraphics: Add 10 second timeout to IODW DIM + // policy. + // Enum of Bitfields for Windows server notification msgh_id, which is a + // integer_t signed type. + kIOFBNS_Dim = 0x03, + kIOFBNS_UnDim = 0x04, +#endif // !_OPEN_SOURCE_ + + // For Wake messages this field contains the current kIOFBDisplayState as + // returned by attribute 'kIOFBDisplayState' + kIOFBNS_DisplayStateMask = 0x00000f00, + kIOFBNS_DisplayStateShift = 8, + + // Message Generation Count, top-bit i.e. sign-bit is always 0 for normal + // messages, see kIOFBNS_Rendezvous is the only exception and it doesn't + // encode a generation count. + kIOFBNS_GenerationMask = 0x7fff0000, + kIOFBNS_GenerationShift = 16, +}; + +// values for kIOMirrorAttribute +enum { + kIOMirrorIsPrimary = 0x80000000, + kIOMirrorHWClipped = 0x40000000, + kIOMirrorIsMirrored = 0x20000000 +}; + +// values for kIOMirrorDefaultAttribute +enum { + kIOMirrorDefault = 0x00000001, + kIOMirrorForced = 0x00000002 +}; + +//// Display mode timing information + +struct IODetailedTimingInformationV1 { + // from EDID defn + UInt32 pixelClock; // Hertz + UInt32 horizontalActive; // pixels + UInt32 horizontalBlanking; // pixels + UInt32 horizontalBorder; // pixels + UInt32 horizontalSyncOffset; // pixels + UInt32 horizontalSyncWidth; // pixels + UInt32 verticalActive; // lines + UInt32 verticalBlanking; // lines + UInt32 verticalBorder; // lines + UInt32 verticalSyncOffset; // lines + UInt32 verticalSyncWidth; // lines +}; +typedef struct IODetailedTimingInformationV1 IODetailedTimingInformationV1; + +/*! + * @struct IODetailedTimingInformationV2 + * @abstract A structure defining the detailed timing information of a display mode. + * @discussion This structure is used by IOFramebuffer to define detailed timing information for a display mode. The VESA EDID document has more information. + * @field __reservedA Set to zero. + * @field horizontalScaledInset If the mode is scaled, sets the number of active pixels to remove the left and right edges in order to display an underscanned image. + * @field verticalScaledInset If the mode is scaled, sets the number of active lines to remove the top and bottom edges in order to display an underscanned image. + * @field scalerFlags If the mode is scaled, + * kIOScaleStretchToFit may be set to allow stretching. + * kIOScaleRotateFlags is mask which may have the value given by kIOScaleRotate90, kIOScaleRotate180, kIOScaleRotate270 to display a rotated framebuffer. + * @field horizontalScaled If the mode is scaled, sets the size of the image before scaling or rotation. + * @field verticalScaled If the mode is scaled, sets the size of the image before scaling or rotation. + * @field signalConfig + * kIOAnalogSetupExpected set if display expects a blank-to-black setup or pedestal. See VESA signal standards.
+ * kIOInterlacedCEATiming set for a CEA style interlaced timing:
+ * Field 1 vertical blanking = half specified vertical blanking lines.
+ * Field 2 vertical blanking = (half vertical blanking lines) + 1 line.
+ * Field 1 vertical offset = half specified vertical sync offset.
+ * Field 2 vertical offset = (half specified vertical sync offset) + 0.5 lines.
+ * @field signalLevels One of:
+ * kIOAnalogSignalLevel_0700_0300 0.700 - 0.300 V p-p.
+ * kIOAnalogSignalLevel_0714_0286 0.714 - 0.286 V p-p.
+ * kIOAnalogSignalLevel_1000_0400 1.000 - 0.400 V p-p.
+ * kIOAnalogSignalLevel_0700_0000 0.700 - 0.000 V p-p.
+ * @field pixelClock Pixel clock frequency in Hz. + * @field minPixelClock Minimum pixel clock frequency in Hz, with error. + * @field maxPixelClock Maximum pixel clock frequency in Hz, with error. + * @field horizontalActive Pixel clocks per line. + * @field horizontalBlanking Blanking clocks per line. + * @field horizontalSyncOffset First clock of horizontal sync. + * @field horizontalSyncPulseWidth Width of horizontal sync. + * @field verticalActive Number of lines per frame. + * @field verticalBlanking Blanking lines per frame. + * @field verticalSyncOffset First line of vertical sync. + * @field verticalSyncPulseWidth Height of vertical sync. + * @field horizontalBorderLeft Number of pixels in left horizontal border. + * @field horizontalBorderRight Number of pixels in right horizontal border. + * @field verticalBorderTop Number of lines in top vertical border. + * @field verticalBorderBottom Number of lines in bottom vertical border. + * @field horizontalSyncConfig kIOSyncPositivePolarity for positive polarity horizontal sync (0 for negative). + * @field horizontalSyncLevel Zero. + * @field verticalSyncConfig kIOSyncPositivePolarity for positive polarity vertical sync (0 for negative). + * @field verticalSyncLevel Zero. + * @field numLinks number of links to be used by a dual link timing, if zero, assume one link. + * @field verticalBlankingExtension maximum number of blanking extension lines that is available. (0 for none). + * @field pixelEncoding 2017 Timing Features - ERS 2-58 (6.3.1) + * @field bitsPerColorComponent 2017 Timing Features - ERS 2-58 (6.3.1) + * @field colorimetry 2017 Timing Features - ERS 2-58 (6.3.1) + * @field dynamicRange 2017 Timing Features - ERS 2-58 (6.3.1) + * @field dscCompressedBitsPerPixel 2018 Timing Features - ERS 2-63 (6.3.1) + * @field dscSliceHeight 2018 Timing Features - ERS 2-63 (6.3.1) + * @field dscSliceWidth 2018 Timing Features - ERS 2-63 (6.3.1) + * @field __reservedB Reserved set to zero. + */ + +struct IODetailedTimingInformationV2 { + + UInt32 __reservedA[3]; // Init to 0 + UInt32 horizontalScaledInset; // pixels + UInt32 verticalScaledInset; // lines + + UInt32 scalerFlags; + UInt32 horizontalScaled; + UInt32 verticalScaled; + + UInt32 signalConfig; + UInt32 signalLevels; + + UInt64 pixelClock; // Hz + + UInt64 minPixelClock; // Hz - With error what is slowest actual clock + UInt64 maxPixelClock; // Hz - With error what is fasted actual clock + + UInt32 horizontalActive; // pixels + UInt32 horizontalBlanking; // pixels + UInt32 horizontalSyncOffset; // pixels + UInt32 horizontalSyncPulseWidth; // pixels + + UInt32 verticalActive; // lines + UInt32 verticalBlanking; // lines + UInt32 verticalSyncOffset; // lines + UInt32 verticalSyncPulseWidth; // lines + + UInt32 horizontalBorderLeft; // pixels + UInt32 horizontalBorderRight; // pixels + UInt32 verticalBorderTop; // lines + UInt32 verticalBorderBottom; // lines + + UInt32 horizontalSyncConfig; + UInt32 horizontalSyncLevel; // Future use (init to 0) + UInt32 verticalSyncConfig; + UInt32 verticalSyncLevel; // Future use (init to 0) + UInt32 numLinks; + + UInt32 verticalBlankingExtension; // lines (AdaptiveSync: 0 for non-AdaptiveSync support) + + UInt16 pixelEncoding; + UInt16 bitsPerColorComponent; + UInt16 colorimetry; + UInt16 dynamicRange; + + UInt16 dscCompressedBitsPerPixel; + UInt16 dscSliceHeight; + UInt16 dscSliceWidth; + UInt16 __reservedB[5]; // Init to 0 +}; +typedef struct IODetailedTimingInformationV2 IODetailedTimingInformationV2; +typedef struct IODetailedTimingInformationV2 IODetailedTimingInformation; + +struct IOTimingInformation { + IOAppleTimingID appleTimingID; // kIOTimingIDXXX const + UInt32 flags; + union { + IODetailedTimingInformationV1 v1; + IODetailedTimingInformationV2 v2; + } detailedInfo; +}; +typedef struct IOTimingInformation IOTimingInformation; + +enum { + // IOTimingInformation flags + kIODetailedTimingValid = 0x80000000, + kIOScalingInfoValid = 0x40000000 +}; + +enum { + // scalerFlags + kIOScaleStretchToFit = 0x00000001, + + kIOScaleRotateFlags = 0x000000f0, + + kIOScaleSwapAxes = 0x00000010, + kIOScaleInvertX = 0x00000020, + kIOScaleInvertY = 0x00000040, + + kIOScaleRotate0 = 0x00000000, + kIOScaleRotate90 = kIOScaleSwapAxes | kIOScaleInvertX, + kIOScaleRotate180 = kIOScaleInvertX | kIOScaleInvertY, + kIOScaleRotate270 = kIOScaleSwapAxes | kIOScaleInvertY +}; + +enum { + kIOPixelEncodingNotSupported = 0x0000, + kIOPixelEncodingRGB444 = 0x0001, + kIOPixelEncodingYCbCr444 = 0x0002, + kIOPixelEncodingYCbCr422 = 0x0004, + kIOPixelEncodingYCbCr420 = 0x0008 +}; + +enum { + kIOBitsPerColorComponentNotSupported = 0x0000, + kIOBitsPerColorComponent6 = 0x0001, + kIOBitsPerColorComponent8 = 0x0002, + kIOBitsPerColorComponent10 = 0x0004, + kIOBitsPerColorComponent12 = 0x0008, + kIOBitsPerColorComponent16 = 0x0010 +}; + +enum { + kIOColorimetryNotSupported = 0x0000, + kIOColorimetryNativeRGB = 0x0001, + kIOColorimetrysRGB = 0x0002, + kIOColorimetryDCIP3 = 0x0004, + kIOColorimetryAdobeRGB = 0x0008, + kIOColorimetryxvYCC = 0x0010, + kIOColorimetryWGRGB = 0x0020, + kIOColorimetryBT601 = 0x0040, + kIOColorimetryBT709 = 0x0080, + kIOColorimetryBT2020 = 0x0100, + kIOColorimetryBT2100 = 0x0200 +}; + +enum { + kIODynamicRangeNotSupported = 0x0000, + kIODynamicRangeSDR = 0x0001, + kIODynamicRangeHDR10 = 0x0002, + kIODynamicRangeDolbyNormalMode = 0x0004, + kIODynamicRangeDolbyTunnelMode = 0x0008, + kIODynamicRangeTraditionalGammaHDR = 0x0010 +}; + +#pragma pack(push, 4) +struct IOFBDisplayModeDescription { + IODisplayModeInformation info; + IOTimingInformation timingInfo; +}; +typedef struct IOFBDisplayModeDescription IOFBDisplayModeDescription; +#pragma pack(pop) + +/*! + * @struct IODisplayTimingRangeV1 + * @abstract A structure defining the limits and attributes of a display or framebuffer. + * @discussion This structure is used to define the limits for modes programmed as detailed timings by the OS. The VESA EDID is useful background information for many of these fields. A data property with this structure under the key kIOFBTimingRangeKey in a framebuffer will allow the OS to program detailed timings that fall within its range. + * @field __reservedA Set to zero. + * @field version Set to zero. + * @field __reservedB Set to zero. + * @field minPixelClock minimum pixel clock frequency in range, in Hz. + * @field minPixelClock maximum pixel clock frequency in range, in Hz. + * @field maxPixelError largest variation between specified and actual pixel clock frequency, in Hz. + * @field supportedSyncFlags mask of supported sync attributes. The following are defined:
+ * kIORangeSupportsSeparateSyncs - digital separate syncs.
+ * kIORangeSupportsSyncOnGreen - sync on green.
+ * kIORangeSupportsCompositeSync - composite sync.
+ * kIORangeSupportsVSyncSerration - vertical sync has serration and equalization pulses.
+ * @field supportedSignalLevels mask of possible signal levels. The following are defined:
+ * kIORangeSupportsSignal_0700_0300 0.700 - 0.300 V p-p.
+ * kIORangeSupportsSignal_0714_0286 0.714 - 0.286 V p-p.
+ * kIORangeSupportsSignal_1000_0400 1.000 - 0.400 V p-p.
+ * kIORangeSupportsSignal_0700_0000 0.700 - 0.000 V p-p.
+ * @field supportedSignalConfigs mask of possible signal configurations. The following are defined:
+ * kIORangeSupportsInterlacedCEATiming Supports CEA style interlaced timing:
+ * Field 1 vertical blanking = specified vertical blanking lines.
+ * Field 2 vertical blanking = vertical blanking lines + 1 line.
+ * Field 1 vertical offset = specified vertical sync offset.
+ * Field 2 vertical offset = specified vertical sync offset + 0.5 lines.
+ * kIORangeSupportsInterlacedCEATimingWithConfirm Supports CEA style interlaced timing, but require a confirm. + * @field minFrameRate minimum frame rate (vertical refresh frequency) in range, in Hz. + * @field maxFrameRate maximum frame rate (vertical refresh frequency) in range, in Hz. + * @field minLineRate minimum line rate (horizontal refresh frequency) in range, in Hz. + * @field maxLineRate maximum line rate (horizontal refresh frequency) in range, in Hz. + * @field maxHorizontalTotal maximum clocks in horizontal line (active + blanking). + * @field maxVerticalTotal maximum lines in vertical frame (active + blanking). + * @field __reservedD Set to zero. + * @field charSizeHorizontalActive horizontalActive must be a multiple of charSizeHorizontalActive. + * @field charSizeHorizontalBlanking horizontalBlanking must be a multiple of charSizeHorizontalBlanking. + * @field charSizeHorizontalSyncOffset horizontalSyncOffset must be a multiple of charSizeHorizontalSyncOffset. + * @field charSizeHorizontalSyncPulse horizontalSyncPulse must be a multiple of charSizeHorizontalSyncPulse. + * @field charSizeVerticalActive verticalActive must be a multiple of charSizeVerticalActive. + * @field charSizeVerticalBlanking verticalBlanking must be a multiple of charSizeVerticalBlanking. + * @field charSizeVerticalSyncOffset verticalSyncOffset must be a multiple of charSizeVerticalSyncOffset. + * @field charSizeVerticalSyncPulse verticalSyncPulse must be a multiple of charSizeVerticalSyncPulse. + * @field charSizeHorizontalBorderLeft horizontalBorderLeft must be a multiple of charSizeHorizontalBorderLeft. + * @field charSizeHorizontalBorderRight horizontalBorderRight must be a multiple of charSizeHorizontalBorderRight. + * @field charSizeVerticalBorderTop verticalBorderTop must be a multiple of charSizeVerticalBorderTop. + * @field charSizeVerticalBorderBottom verticalBorderBottom must be a multiple of charSizeVerticalBorderBottom. + * @field charSizeHorizontalTotal (horizontalActive + horizontalBlanking) must be a multiple of charSizeHorizontalTotal. + * @field charSizeVerticalTotal (verticalActive + verticalBlanking) must be a multiple of charSizeVerticalTotal. + * @field __reservedE Set to zero. + * @field minHorizontalActiveClocks minimum value of horizontalActive. + * @field maxHorizontalActiveClocks maximum value of horizontalActive. + * @field minHorizontalBlankingClocks minimum value of horizontalBlanking. + * @field maxHorizontalBlankingClocks maximum value of horizontalBlanking. + * @field minHorizontalSyncOffsetClocks minimum value of horizontalSyncOffset. + * @field maxHorizontalSyncOffsetClocks maximum value of horizontalSyncOffset. + * @field minHorizontalPulseWidthClocks minimum value of horizontalPulseWidth. + * @field maxHorizontalPulseWidthClocks maximum value of horizontalPulseWidth. + * @field minVerticalActiveClocks minimum value of verticalActive. + * @field maxVerticalActiveClocks maximum value of verticalActive. + * @field minVerticalBlankingClocks minimum value of verticalBlanking. + * @field maxVerticalBlankingClocks maximum value of verticalBlanking. + * @field minVerticalSyncOffsetClocks minimum value of verticalSyncOffset. + * @field maxVerticalSyncOffsetClocks maximum value of verticalSyncOffset. + * @field minVerticalPulseWidthClocks minimum value of verticalPulseWidth. + * @field maxVerticalPulseWidthClocks maximum value of verticalPulseWidth. + * @field minHorizontalBorderLeft minimum value of horizontalBorderLeft. + * @field maxHorizontalBorderLeft maximum value of horizontalBorderLeft. + * @field minHorizontalBorderRight minimum value of horizontalBorderRight. + * @field maxHorizontalBorderRight maximum value of horizontalBorderRight. + * @field minVerticalBorderTop minimum value of verticalBorderTop. + * @field maxVerticalBorderTop maximum value of verticalBorderTop. + * @field minVerticalBorderBottom minimum value of verticalBorderBottom. + * @field maxVerticalBorderBottom maximum value of verticalBorderBottom. + * @field maxNumLinks number of links supported, if zero, 1 link is assumed. + * @field minLink0PixelClock minimum pixel clock for link 0 (kHz). + * @field maxLink0PixelClock maximum pixel clock for link 0 (kHz). + * @field minLink1PixelClock minimum pixel clock for link 1 (kHz). + * @field maxLink1PixelClock maximum pixel clock for link 1 (kHz). + * @field supportedPixelEncoding 2017 Timing Features - ERS 2-58 (6.3.1) + * @field supportedBitsPerColorComponent 2017 Timing Features - ERS 2-58 (6.3.1) + * @field supportedColorimetry 2017 Timing Features - ERS 2-58 (6.3.1) + * @field supportedDynamicRange 2017 Timing Features - ERS 2-58 (6.3.1) + * @field __reservedF Set to zero. + */ + +struct IODisplayTimingRangeV1 +{ + UInt32 __reservedA[2]; // Init to 0 + UInt32 version; // Init to 0 + UInt32 __reservedB[5]; // Init to 0 + + UInt64 minPixelClock; // Min dot clock in Hz + UInt64 maxPixelClock; // Max dot clock in Hz + + UInt32 maxPixelError; // Max dot clock error + UInt32 supportedSyncFlags; + UInt32 supportedSignalLevels; + UInt32 supportedSignalConfigs; + + UInt32 minFrameRate; // Hz + UInt32 maxFrameRate; // Hz + UInt32 minLineRate; // Hz + UInt32 maxLineRate; // Hz + + UInt32 maxHorizontalTotal; // Clocks - Maximum total (active + blanking) + UInt32 maxVerticalTotal; // Clocks - Maximum total (active + blanking) + UInt32 __reservedD[2]; // Init to 0 + + UInt8 charSizeHorizontalActive; + UInt8 charSizeHorizontalBlanking; + UInt8 charSizeHorizontalSyncOffset; + UInt8 charSizeHorizontalSyncPulse; + + UInt8 charSizeVerticalActive; + UInt8 charSizeVerticalBlanking; + UInt8 charSizeVerticalSyncOffset; + UInt8 charSizeVerticalSyncPulse; + + UInt8 charSizeHorizontalBorderLeft; + UInt8 charSizeHorizontalBorderRight; + UInt8 charSizeVerticalBorderTop; + UInt8 charSizeVerticalBorderBottom; + + UInt8 charSizeHorizontalTotal; // Character size for active + blanking + UInt8 charSizeVerticalTotal; // Character size for active + blanking + UInt16 __reservedE; // Reserved (Init to 0) + + UInt32 minHorizontalActiveClocks; + UInt32 maxHorizontalActiveClocks; + UInt32 minHorizontalBlankingClocks; + UInt32 maxHorizontalBlankingClocks; + + UInt32 minHorizontalSyncOffsetClocks; + UInt32 maxHorizontalSyncOffsetClocks; + UInt32 minHorizontalPulseWidthClocks; + UInt32 maxHorizontalPulseWidthClocks; + + UInt32 minVerticalActiveClocks; + UInt32 maxVerticalActiveClocks; + UInt32 minVerticalBlankingClocks; + UInt32 maxVerticalBlankingClocks; + + UInt32 minVerticalSyncOffsetClocks; + UInt32 maxVerticalSyncOffsetClocks; + UInt32 minVerticalPulseWidthClocks; + UInt32 maxVerticalPulseWidthClocks; + + UInt32 minHorizontalBorderLeft; + UInt32 maxHorizontalBorderLeft; + UInt32 minHorizontalBorderRight; + UInt32 maxHorizontalBorderRight; + + UInt32 minVerticalBorderTop; + UInt32 maxVerticalBorderTop; + UInt32 minVerticalBorderBottom; + UInt32 maxVerticalBorderBottom; + UInt32 maxNumLinks; // number of links, if zero, assume link 1 + UInt32 minLink0PixelClock; // min pixel clock for link 0 (kHz) + UInt32 maxLink0PixelClock; // max pixel clock for link 0 (kHz) + UInt32 minLink1PixelClock; // min pixel clock for link 1 (kHz) + UInt32 maxLink1PixelClock; // max pixel clock for link 1 (kHz) + + UInt16 supportedPixelEncoding; + UInt16 supportedBitsPerColorComponent; + UInt16 supportedColorimetryModes; + UInt16 supportedDynamicRangeModes; + + UInt32 __reservedF[1]; // Init to 0 +}; + +typedef struct IODisplayTimingRangeV1 IODisplayTimingRangeV1; +/*! + * @struct IODisplayTimingRangeV2 + * @abstract A structure defining the limits and attributes of DSC capabilities in a framebuffer. + * @discussion This structure is used to define the limits for DSC enabled modes programmed as detailed timings by the OS. The VESA DSC spec is useful background information for many of these fields. + * @field maxBandwidth Maximum permitted bandwidth of the given topology in bits per second. + * @field dscMinSliceHeight Minimum slice Height, in units of line. + * @field dscMaxSliceHeight Maximum slice Height, in units of line. + * @field dscMinSliceWidth Minimum slice width, in units of line. + * @field dscMaxSliceWidth Maximum slice width, in units of line. + * @field dscMinSlicePerLine Minimum slice per Line. + * @field dscMaxSlicePerLine Maximum slice per Line. + * @field dscMinBPC Minimum Bits per component, in units of bits. + * @field dscMaxBPC Maximum Bits per component, in units of bits. + * @field dscMinBPP Minimum target bits/pixel, in bpp. + * @field dscMaxBPP Maximum target bits/pixel, in bpp. + * @field dscVBR VBR mode, 0:disabled 1:enabled. + * @field dscBlockPredEnable DSC BP is user or not, 0: not used, 1: used. + * @field __reservedF Set to zero. + */ +struct IODisplayTimingRangeV2 +{ + UInt32 __reservedA[2]; // Init to 0 + UInt32 version; // Init to 0 + UInt32 __reservedB[5]; // Init to 0 + + UInt64 minPixelClock; // Min dot clock in Hz + UInt64 maxPixelClock; // Max dot clock in Hz + + UInt32 maxPixelError; // Max dot clock error + UInt32 supportedSyncFlags; + UInt32 supportedSignalLevels; + UInt32 supportedSignalConfigs; + + UInt32 minFrameRate; // Hz + UInt32 maxFrameRate; // Hz + UInt32 minLineRate; // Hz + UInt32 maxLineRate; // Hz + + UInt32 maxHorizontalTotal; // Clocks - Maximum total (active + blanking) + UInt32 maxVerticalTotal; // Clocks - Maximum total (active + blanking) + UInt32 __reservedD[2]; // Init to 0 + + UInt8 charSizeHorizontalActive; + UInt8 charSizeHorizontalBlanking; + UInt8 charSizeHorizontalSyncOffset; + UInt8 charSizeHorizontalSyncPulse; + + UInt8 charSizeVerticalActive; + UInt8 charSizeVerticalBlanking; + UInt8 charSizeVerticalSyncOffset; + UInt8 charSizeVerticalSyncPulse; + + UInt8 charSizeHorizontalBorderLeft; + UInt8 charSizeHorizontalBorderRight; + UInt8 charSizeVerticalBorderTop; + UInt8 charSizeVerticalBorderBottom; + + UInt8 charSizeHorizontalTotal; // Character size for active + blanking + UInt8 charSizeVerticalTotal; // Character size for active + blanking + UInt16 __reservedE; // Reserved (Init to 0) + + UInt32 minHorizontalActiveClocks; + UInt32 maxHorizontalActiveClocks; + UInt32 minHorizontalBlankingClocks; + UInt32 maxHorizontalBlankingClocks; + + UInt32 minHorizontalSyncOffsetClocks; + UInt32 maxHorizontalSyncOffsetClocks; + UInt32 minHorizontalPulseWidthClocks; + UInt32 maxHorizontalPulseWidthClocks; + + UInt32 minVerticalActiveClocks; + UInt32 maxVerticalActiveClocks; + UInt32 minVerticalBlankingClocks; + UInt32 maxVerticalBlankingClocks; + + UInt32 minVerticalSyncOffsetClocks; + UInt32 maxVerticalSyncOffsetClocks; + UInt32 minVerticalPulseWidthClocks; + UInt32 maxVerticalPulseWidthClocks; + + UInt32 minHorizontalBorderLeft; + UInt32 maxHorizontalBorderLeft; + UInt32 minHorizontalBorderRight; + UInt32 maxHorizontalBorderRight; + + UInt32 minVerticalBorderTop; + UInt32 maxVerticalBorderTop; + UInt32 minVerticalBorderBottom; + UInt32 maxVerticalBorderBottom; + UInt32 maxNumLinks; // number of links, if zero, assume link 1 + UInt32 minLink0PixelClock; // min pixel clock for link 0 (kHz) + UInt32 maxLink0PixelClock; // max pixel clock for link 0 (kHz) + UInt32 minLink1PixelClock; // min pixel clock for link 1 (kHz) + UInt32 maxLink1PixelClock; // max pixel clock for link 1 (kHz) + + UInt16 supportedPixelEncoding; + UInt16 supportedBitsPerColorComponent; + UInt16 supportedColorimetryModes; + UInt16 supportedDynamicRangeModes; + + UInt32 __reservedF[1]; // Init to 0 + UInt64 maxBandwidth; + UInt32 dscMinSliceHeight; + UInt32 dscMaxSliceHeight; + UInt32 dscMinSliceWidth; + UInt32 dscMaxSliceWidth; + UInt32 dscMinSlicePerLine; + UInt32 dscMaxSlicePerLine; + UInt16 dscMinBPC; + UInt16 dscMaxBPC; + UInt16 dscMinBPP; + UInt16 dscMaxBPP; + UInt8 dscVBR; + UInt8 dscBlockPredEnable; + UInt32 __reservedC[6]; +}; + +typedef struct IODisplayTimingRangeV2 IODisplayTimingRangeV2; + + +typedef struct IODisplayTimingRangeV2 IODisplayTimingRange; + +enum { + // IOTimingRange version + kIOTimingRangeV2 = 0x00000002, + kIOTimingRangeV1 = 0x00000000 +}; + +enum { + // supportedPixelEncoding + kIORangePixelEncodingNotSupported = 0x0000, + kIORangePixelEncodingRGB444 = 0x0001, + kIORangePixelEncodingYCbCr444 = 0x0002, + kIORangePixelEncodingYCbCr422 = 0x0004, + kIORangePixelEncodingYCbCr420 = 0x0008, +}; + +enum { + // supportedBitsPerColorComponent + kIORangeBitsPerColorComponentNotSupported = 0x0000, + kIORangeBitsPerColorComponent6 = 0x0001, + kIORangeBitsPerColorComponent8 = 0x0002, + kIORangeBitsPerColorComponent10 = 0x0004, + kIORangeBitsPerColorComponent12 = 0x0008, + kIORangeBitsPerColorComponent16 = 0x0010, +}; + +enum { + // supportedColorimetry + kIORangeColorimetryNotSupported = 0x0000, + kIORangeColorimetryNativeRGB = 0x0001, + kIORangeColorimetrysRGB = 0x0002, + kIORangeColorimetryDCIP3 = 0x0004, + kIORangeColorimetryAdobeRGB = 0x0008, + kIORangeColorimetryxvYCC = 0x0010, + kIORangeColorimetryWGRGB = 0x0020, + kIORangeColorimetryBT601 = 0x0040, + kIORangeColorimetryBT709 = 0x0080, + kIORangeColorimetryBT2020 = 0x0100, + kIORangeColorimetryBT2100 = 0x0200, +}; + +enum { + // supportedDynamicRange + kIORangeDynamicRangeNotSupported = 0x0000, + kIORangeDynamicRangeSDR = 0x0001, + kIORangeDynamicRangeHDR10 = 0x0002, + kIORangeDynamicRangeDolbyNormalMode = 0x0004, + kIORangeDynamicRangeDolbyTunnelMode = 0x0008, + kIORangeDynamicRangeTraditionalGammaHDR = 0x0010 +}; + +enum { + // supportedSignalLevels + kIORangeSupportsSignal_0700_0300 = 0x00000001, + kIORangeSupportsSignal_0714_0286 = 0x00000002, + kIORangeSupportsSignal_1000_0400 = 0x00000004, + kIORangeSupportsSignal_0700_0000 = 0x00000008 +}; +enum { + // supportedSyncFlags + kIORangeSupportsSeparateSyncs = 0x00000001, + kIORangeSupportsSyncOnGreen = 0x00000002, + kIORangeSupportsCompositeSync = 0x00000004, + kIORangeSupportsVSyncSerration = 0x00000008 +}; +enum { + // supportedSignalConfigs + kIORangeSupportsInterlacedCEATiming = 0x00000004, + kIORangeSupportsInterlacedCEATimingWithConfirm = 0x00000008 +}; + +enum { + // signalConfig + kIODigitalSignal = 0x00000001, + kIOAnalogSetupExpected = 0x00000002, + kIOInterlacedCEATiming = 0x00000004, + kIONTSCTiming = 0x00000008, + kIOPALTiming = 0x00000010, + kIODSCBlockPredEnable = 0x00000020, +}; + +enum { + // signalLevels for analog + kIOAnalogSignalLevel_0700_0300 = 0, + kIOAnalogSignalLevel_0714_0286 = 1, + kIOAnalogSignalLevel_1000_0400 = 2, + kIOAnalogSignalLevel_0700_0000 = 3 +}; + +enum { + // horizontalSyncConfig and verticalSyncConfig + kIOSyncPositivePolarity = 0x00000001 +}; + +/*! + * @struct IODisplayScalerInformation + * @abstract A structure defining the scaling capabilities of a framebuffer. + * @discussion This structure is used to define the limits for modes programmed as detailed timings by the OS. A data property with this structure under the key kIOFBScalerInfoKey in a framebuffer will allow the OS to program detailed timings that are scaled to a displays native resolution. + * @field __reservedA Set to zero. + * @field version Set to zero. + * @field __reservedB Set to zero. + * @field scalerFeatures Mask of scaling features. The following are defined:
+ * kIOScaleStretchOnly If set the framebuffer can only provide stretched scaling with non-square pixels, without borders.
+ * kIOScaleCanUpSamplePixels If set framebuffer can scale up from a smaller number of source pixels to a larger native timing (eg. 640x480 pixels on a 1600x1200 timing).
+ * kIOScaleCanDownSamplePixels If set framebuffer can scale down from a larger number of source pixels to a smaller native timing (eg. 1600x1200 pixels on a 640x480 timing).
+ * kIOScaleCanScaleInterlaced If set framebuffer can scale an interlaced detailed timing.
+ * kIOScaleCanSupportInset If set framebuffer can support scaled modes with non-zero horizontalScaledInset, verticalScaledInset fields.
+ * kIOScaleCanRotate If set framebuffer can support some of the flags in the kIOScaleRotateFlags mask.
+ * kIOScaleCanBorderInsetOnly If set framebuffer can support scaled modes with non-zero horizontalScaledInset, verticalScaledInset fields, but requires the active pixels to be equal in size to the inset area, ie. can do insets with a border versus scaling an image.
+ * @field maxHorizontalPixels Maximum number of horizontal source pixels (horizontalScaled).
+ * @field maxVerticalPixels Maximum number of vertical source pixels (verticalScaled).
+ * @field __reservedC Set to zero. + */ + +struct IODisplayScalerInformation { + UInt32 __reservedA[1]; // Init to 0 + UInt32 version; // Init to 0 + UInt32 __reservedB[2]; // Init to 0 + + IOOptionBits scalerFeatures; + UInt32 maxHorizontalPixels; + UInt32 maxVerticalPixels; + UInt32 __reservedC[5]; // Init to 0 +}; +typedef struct IODisplayScalerInformation IODisplayScalerInformation; + +enum { + /* scalerFeatures */ + kIOScaleStretchOnly = 0x00000001, + kIOScaleCanUpSamplePixels = 0x00000002, + kIOScaleCanDownSamplePixels = 0x00000004, + kIOScaleCanScaleInterlaced = 0x00000008, + kIOScaleCanSupportInset = 0x00000010, + kIOScaleCanRotate = 0x00000020, + kIOScaleCanBorderInsetOnly = 0x00000040 +}; + +//// Connections + +enum { + kOrConnections = 0xffffffe, + kAndConnections = 0xffffffd +}; + +enum { + kConnectionFlags = 'flgs', + kConnectionSyncEnable = 'sync', + kConnectionSyncFlags = 'sycf', + kConnectionSupportsAppleSense = 'asns', + kConnectionSupportsLLDDCSense = 'lddc', + kConnectionSupportsHLDDCSense = 'hddc', + kConnectionEnable = 'enab', + kConnectionCheckEnable = 'cena', + kConnectionProbe = 'prob', + kConnectionIgnore = '\0igr', + kConnectionChanged = 'chng', + kConnectionPower = 'powr', + kConnectionPostWake = 'pwak', + kConnectionDisplayParameterCount = 'pcnt', + kConnectionDisplayParameters = 'parm', + kConnectionOverscan = 'oscn', + kConnectionVideoBest = 'vbst', + + kConnectionRedGammaScale = 'rgsc', + kConnectionGreenGammaScale = 'ggsc', + kConnectionBlueGammaScale = 'bgsc', + kConnectionGammaScale = 'gsc ', + kConnectionFlushParameters = 'flus', + + kConnectionVBLMultiplier = 'vblm', + + kConnectionHandleDisplayPortEvent = 'dpir', + + kConnectionPanelTimingDisable = 'pnlt', + + kConnectionColorMode = 'cyuv', + kConnectionColorModesSupported = 'colr', + kConnectionColorDepthsSupported = ' bpc', + + kConnectionControllerDepthsSupported = '\0grd', + kConnectionControllerColorDepth = '\0dpd', + kConnectionControllerDitherControl = '\0gdc', + + kConnectionDisplayFlags = 'dflg', + + kConnectionEnableAudio = 'aud ', + kConnectionAudioStreaming = 'auds', + + kConnectionStartOfFrameTime = 'soft', // as of IOGRAPHICSTYPES_REV 65 +}; + +// kConnectionFlags values +enum { + kIOConnectionBuiltIn = 0x00000800, + kIOConnectionStereoSync = 0x00008000 +}; + +// kConnectionSyncControl values +enum { + kIOHSyncDisable = 0x00000001, + kIOVSyncDisable = 0x00000002, + kIOCSyncDisable = 0x00000004, + kIONoSeparateSyncControl = 0x00000040, + kIOTriStateSyncs = 0x00000080, + kIOSyncOnBlue = 0x00000008, + kIOSyncOnGreen = 0x00000010, + kIOSyncOnRed = 0x00000020 +}; + +// kConnectionHandleDisplayPortEvent values +enum { + kIODPEventStart = 1, + kIODPEventIdle = 2, + + kIODPEventForceRetrain = 3, + + kIODPEventRemoteControlCommandPending = 256, + kIODPEventAutomatedTestRequest = 257, + kIODPEventContentProtection = 258, + kIODPEventMCCS = 259, + kIODPEventSinkSpecific = 260 +}; + +#define kIODisplayAttributesKey "IODisplayAttributes" + +#define kIODisplaySupportsUnderscanKey "IODisplaySupportsUnderscan" +#define kIODisplaySupportsBasicAudioKey "IODisplaySupportsBasicAudio" +#define kIODisplaySupportsYCbCr444Key "IODisplaySupportsYCbCr444" +#define kIODisplaySupportsYCbCr422Key "IODisplaySupportsYCbCr422" +#define kIODisplaySelectedColorModeKey "cmod" + +enum +{ + kIODisplayColorMode = kConnectionColorMode, +}; + +#if 0 +enum +{ + // kConnectionColorMode attribute + kIODisplayColorModeReserved = 0x00000000, + kIODisplayColorModeRGB = 0x00000001, + kIODisplayColorModeYCbCr422 = 0x00000010, + kIODisplayColorModeYCbCr444 = 0x00000100, + kIODisplayColorModeRGBLimited = 0x00001000, + kIODisplayColorModeAuto = 0x10000000, +}; +#endif + +enum +{ + // kConnectionColorDepthsSupported attribute + kIODisplayRGBColorComponentBitsUnknown = 0x00000000, + kIODisplayRGBColorComponentBits6 = 0x00000001, + kIODisplayRGBColorComponentBits8 = 0x00000002, + kIODisplayRGBColorComponentBits10 = 0x00000004, + kIODisplayRGBColorComponentBits12 = 0x00000008, + kIODisplayRGBColorComponentBits14 = 0x00000010, + kIODisplayRGBColorComponentBits16 = 0x00000020, + + kIODisplayYCbCr444ColorComponentBitsUnknown = 0x00000000, + kIODisplayYCbCr444ColorComponentBits6 = 0x00000100, + kIODisplayYCbCr444ColorComponentBits8 = 0x00000200, + kIODisplayYCbCr444ColorComponentBits10 = 0x00000400, + kIODisplayYCbCr444ColorComponentBits12 = 0x00000800, + kIODisplayYCbCr444ColorComponentBits14 = 0x00001000, + kIODisplayYCbCr444ColorComponentBits16 = 0x00002000, + + kIODisplayYCbCr422ColorComponentBitsUnknown = 0x00000000, + kIODisplayYCbCr422ColorComponentBits6 = 0x00010000, + kIODisplayYCbCr422ColorComponentBits8 = 0x00020000, + kIODisplayYCbCr422ColorComponentBits10 = 0x00040000, + kIODisplayYCbCr422ColorComponentBits12 = 0x00080000, + kIODisplayYCbCr422ColorComponentBits14 = 0x00100000, + kIODisplayYCbCr422ColorComponentBits16 = 0x00200000, +}; + +enum +{ + // kConnectionDitherControl attribute + kIODisplayDitherDisable = 0x00000000, + kIODisplayDitherSpatial = 0x00000001, + kIODisplayDitherTemporal = 0x00000002, + kIODisplayDitherFrameRateControl = 0x00000004, + kIODisplayDitherDefault = 0x00000080, + kIODisplayDitherAll = 0x000000FF, + kIODisplayDitherRGBShift = 0, + kIODisplayDitherYCbCr444Shift = 8, + kIODisplayDitherYCbCr422Shift = 16, +}; + +enum +{ + // kConnectionDisplayFlags attribute + kIODisplayNeedsCEAUnderscan = 0x00000001, +}; + +enum +{ + kIODisplayPowerStateOff = 0, + kIODisplayPowerStateMinUsable = 1, + kIODisplayPowerStateOn = 2, +}; + +#define IO_DISPLAY_CAN_FILL 0x00000040 +#define IO_DISPLAY_CAN_BLIT 0x00000020 + +#define IO_24BPP_TRANSFER_TABLE_SIZE 256 +#define IO_15BPP_TRANSFER_TABLE_SIZE 256 +#define IO_8BPP_TRANSFER_TABLE_SIZE 256 +#define IO_12BPP_TRANSFER_TABLE_SIZE 256 +#define IO_2BPP_TRANSFER_TABLE_SIZE 256 + +#define STDFB_BM256_TO_BM38_MAP_SIZE 256 +#define STDFB_BM38_TO_BM256_MAP_SIZE 256 +#define STDFB_BM38_TO_256_WITH_LOGICAL_SIZE \ + (STDFB_BM38_TO_BM256_MAP_SIZE + (256/sizeof(int))) + +#define STDFB_4BPS_TO_5BPS_MAP_SIZE 16 +#define STDFB_5BPS_TO_4BPS_MAP_SIZE 32 + +enum { + // connection types for IOServiceOpen + kIOFBServerConnectType = 0, + kIOFBSharedConnectType = 1, + kIOGDiagnoseGTraceType = 11452, // On Display Wrangler + kIOGDiagnoseConnectType = 38744, +}; + +enum { + // options for IOServiceRequestProbe() + kIOFBUserRequestProbe = 0x00000001 +}; + +struct IOGPoint { + SInt16 x; + SInt16 y; +}; +typedef struct IOGPoint IOGPoint; + +struct IOGSize { + SInt16 width; + SInt16 height; +}; +typedef struct IOGSize IOGSize; + +struct IOGBounds { + SInt16 minx; + SInt16 maxx; + SInt16 miny; + SInt16 maxy; +}; +typedef struct IOGBounds IOGBounds; + +#ifndef kIODescriptionKey + +#if !defined(__Point__) && !defined(BINTREE_H) && !defined(__MACTYPES__) +#define __Point__ +typedef IOGPoint Point; +#endif + +#if !defined(__Bounds__) && !defined(BINTREE_H) && !defined(__MACTYPES__) +#define __Bounds__ +typedef IOGBounds Bounds; +#endif + +#endif /* !kIODescriptionKey */ + +// cursor description + +enum { + kTransparentEncoding = 0, + kInvertingEncoding +}; + +enum { + kTransparentEncodingShift = (kTransparentEncoding << 1), + kTransparentEncodedPixel = (0x01 << kTransparentEncodingShift), + + kInvertingEncodingShift = (kInvertingEncoding << 1), + kInvertingEncodedPixel = (0x01 << kInvertingEncodingShift) +}; + +enum { + kHardwareCursorDescriptorMajorVersion = 0x0001, + kHardwareCursorDescriptorMinorVersion = 0x0000 +}; + +/*! + * @struct IOHardwareCursorDescriptor + * @abstract A structure defining the format of a hardware cursor. + * @discussion This structure is used by IOFramebuffer to define the format of a hardware cursor. + * @field majorVersion Set to kHardwareCursorDescriptorMajorVersion. + * @field minorVersion Set to kHardwareCursorDescriptorMinorVersion. + * @field height Maximum size of the cursor. + * @field width Maximum size of the cursor. + * @field bitDepth Number bits per pixel, or a QD/QT pixel type, for example kIO8IndexedPixelFormat, kIO32ARGBPixelFormat. + * @field maskBitDepth Unused. + * @field numColors Number of colors for indexed pixel types. + * @field colorEncodings An array pointer specifying the pixel values corresponding to the indices into the color table, for indexed pixel types. + * @field flags None defined, set to zero. + * @field supportedSpecialEncodings Mask of supported special pixel values, eg. kTransparentEncodedPixel, kInvertingEncodedPixel. + * @field specialEncodings Array of pixel values for each supported special encoding. + */ + +struct IOHardwareCursorDescriptor { + UInt16 majorVersion; + UInt16 minorVersion; + UInt32 height; + UInt32 width; + UInt32 bitDepth; // bits per pixel, or a QD/QT pixel type + UInt32 maskBitDepth; // unused + UInt32 numColors; // number of colors in the colorMap. ie. + UInt32 * colorEncodings; + UInt32 flags; + UInt32 supportedSpecialEncodings; + UInt32 specialEncodings[16]; +}; +typedef struct IOHardwareCursorDescriptor IOHardwareCursorDescriptor; + +enum { + kHardwareCursorInfoMajorVersion = 0x0001, + kHardwareCursorInfoMinorVersion = 0x0000 +}; + +/*! + * @struct IOHardwareCursorInfo + * @abstract A structure defining the converted data of a hardware cursor. + * @discussion This structure is used by IOFramebuffer to return the data of a hardware cursor by convertCursorImage() after conversion based on the IOHardwareCursorDescriptor passed to that routine. + * @field majorVersion Set to kHardwareCursorInfoMajorVersion. + * @field minorVersion Set to kHardwareCursorInfoMinorVersion. + * @field cursorHeight The actual size of the cursor is returned. + * @field cursorWidth The actual size of the cursor is returned. + * @field colorMap Pointer to array of IOColorEntry structures, with the number of elements set by the numColors field of the IOHardwareCursorDescriptor. Zero should be passed for direct pixel formats. + * @field hardwareCursorData Buffer to receive the converted cursor data. + * @field cursorHotSpotX Cursor's hotspot. + * @field cursorHotSpotY Cursor's hotspot. + * @field reserved Reserved, set to zero. + */ + +struct IOHardwareCursorInfo { + UInt16 majorVersion; + UInt16 minorVersion; + UInt32 cursorHeight; + UInt32 cursorWidth; + // nil or big enough for hardware's max colors + IOColorEntry * colorMap; + UInt8 * hardwareCursorData; + UInt16 cursorHotSpotX; + UInt16 cursorHotSpotY; + UInt32 reserved[5]; +}; +typedef struct IOHardwareCursorInfo IOHardwareCursorInfo; + +// interrupt types + +enum { + kIOFBVBLInterruptType = 'vbl ', + kIOFBHBLInterruptType = 'hbl ', + kIOFBFrameInterruptType = 'fram', + // Demand to check configuration (Hardware unchanged) + kIOFBConnectInterruptType = 'dci ', + // Demand to rebuild (Hardware has reinitialized on dependent change) + kIOFBChangedInterruptType = 'chng', + // Demand to remove framebuffer (Hardware not available on dependent change -- but must not buserror) + kIOFBOfflineInterruptType = 'remv', + // Notice that hardware is available (after being removed) + kIOFBOnlineInterruptType = 'add ', + // DisplayPort short pulse + kIOFBDisplayPortInterruptType = 'dpir', + // DisplayPort link event + kIOFBDisplayPortLinkChangeInterruptType = 'dplk', + // MCCS + kIOFBMCCSInterruptType = 'mccs', + // early vram notification + kIOFBWakeInterruptType = 'vwak', +}; + +// IOAppleTimingID's +enum { + kIOTimingIDInvalid = 0, /* Not a standard timing */ + kIOTimingIDApple_FixedRateLCD = 42, /* Lump all fixed-rate LCDs into one category.*/ + kIOTimingIDApple_512x384_60hz = 130, /* 512x384 (60 Hz) Rubik timing. */ + kIOTimingIDApple_560x384_60hz = 135, /* 560x384 (60 Hz) Rubik-560 timing. */ + kIOTimingIDApple_640x480_67hz = 140, /* 640x480 (67 Hz) HR timing. */ + kIOTimingIDApple_640x400_67hz = 145, /* 640x400 (67 Hz) HR-400 timing. */ + kIOTimingIDVESA_640x480_60hz = 150, /* 640x480 (60 Hz) VGA timing. */ + kIOTimingIDVESA_640x480_72hz = 152, /* 640x480 (72 Hz) VGA timing. */ + kIOTimingIDVESA_640x480_75hz = 154, /* 640x480 (75 Hz) VGA timing. */ + kIOTimingIDVESA_640x480_85hz = 158, /* 640x480 (85 Hz) VGA timing. */ + kIOTimingIDGTF_640x480_120hz = 159, /* 640x480 (120 Hz) VESA Generalized Timing Formula */ + kIOTimingIDApple_640x870_75hz = 160, /* 640x870 (75 Hz) FPD timing.*/ + kIOTimingIDApple_640x818_75hz = 165, /* 640x818 (75 Hz) FPD-818 timing.*/ + kIOTimingIDApple_832x624_75hz = 170, /* 832x624 (75 Hz) GoldFish timing.*/ + kIOTimingIDVESA_800x600_56hz = 180, /* 800x600 (56 Hz) SVGA timing. */ + kIOTimingIDVESA_800x600_60hz = 182, /* 800x600 (60 Hz) SVGA timing. */ + kIOTimingIDVESA_800x600_72hz = 184, /* 800x600 (72 Hz) SVGA timing. */ + kIOTimingIDVESA_800x600_75hz = 186, /* 800x600 (75 Hz) SVGA timing. */ + kIOTimingIDVESA_800x600_85hz = 188, /* 800x600 (85 Hz) SVGA timing. */ + kIOTimingIDVESA_1024x768_60hz = 190, /* 1024x768 (60 Hz) VESA 1K-60Hz timing. */ + kIOTimingIDVESA_1024x768_70hz = 200, /* 1024x768 (70 Hz) VESA 1K-70Hz timing. */ + kIOTimingIDVESA_1024x768_75hz = 204, /* 1024x768 (75 Hz) VESA 1K-75Hz timing (very similar to kIOTimingIDApple_1024x768_75hz). */ + kIOTimingIDVESA_1024x768_85hz = 208, /* 1024x768 (85 Hz) VESA timing. */ + kIOTimingIDApple_1024x768_75hz = 210, /* 1024x768 (75 Hz) Apple 19" RGB. */ + kIOTimingIDVESA_1152x864_75hz = 215, /* 1152x864 (75 Hz) VESA timing. */ + kIOTimingIDApple_1152x870_75hz = 220, /* 1152x870 (75 Hz) Apple 21" RGB. */ + kIOTimingIDAppleNTSC_ST = 230, /* 512x384 (60 Hz, interlaced, non-convolved). */ + kIOTimingIDAppleNTSC_FF = 232, /* 640x480 (60 Hz, interlaced, non-convolved). */ + kIOTimingIDAppleNTSC_STconv = 234, /* 512x384 (60 Hz, interlaced, convolved). */ + kIOTimingIDAppleNTSC_FFconv = 236, /* 640x480 (60 Hz, interlaced, convolved). */ + kIOTimingIDApplePAL_ST = 238, /* 640x480 (50 Hz, interlaced, non-convolved). */ + kIOTimingIDApplePAL_FF = 240, /* 768x576 (50 Hz, interlaced, non-convolved). */ + kIOTimingIDApplePAL_STconv = 242, /* 640x480 (50 Hz, interlaced, convolved). */ + kIOTimingIDApplePAL_FFconv = 244, /* 768x576 (50 Hz, interlaced, convolved). */ + kIOTimingIDVESA_1280x960_75hz = 250, /* 1280x960 (75 Hz) */ + kIOTimingIDVESA_1280x960_60hz = 252, /* 1280x960 (60 Hz) */ + kIOTimingIDVESA_1280x960_85hz = 254, /* 1280x960 (85 Hz) */ + kIOTimingIDVESA_1280x1024_60hz = 260, /* 1280x1024 (60 Hz) */ + kIOTimingIDVESA_1280x1024_75hz = 262, /* 1280x1024 (75 Hz) */ + kIOTimingIDVESA_1280x1024_85hz = 268, /* 1280x1024 (85 Hz) */ + kIOTimingIDVESA_1600x1200_60hz = 280, /* 1600x1200 (60 Hz) VESA timing. */ + kIOTimingIDVESA_1600x1200_65hz = 282, /* 1600x1200 (65 Hz) VESA timing. */ + kIOTimingIDVESA_1600x1200_70hz = 284, /* 1600x1200 (70 Hz) VESA timing. */ + kIOTimingIDVESA_1600x1200_75hz = 286, /* 1600x1200 (75 Hz) VESA timing (pixel clock is 189.2 Mhz dot clock). */ + kIOTimingIDVESA_1600x1200_80hz = 288, /* 1600x1200 (80 Hz) VESA timing (pixel clock is 216>? Mhz dot clock) - proposed only. */ + kIOTimingIDVESA_1600x1200_85hz = 289, /* 1600x1200 (85 Hz) VESA timing (pixel clock is 229.5 Mhz dot clock). */ + kIOTimingIDVESA_1792x1344_60hz = 296, /* 1792x1344 (60 Hz) VESA timing (204.75 Mhz dot clock). */ + kIOTimingIDVESA_1792x1344_75hz = 298, /* 1792x1344 (75 Hz) VESA timing (261.75 Mhz dot clock). */ + kIOTimingIDVESA_1856x1392_60hz = 300, /* 1856x1392 (60 Hz) VESA timing (218.25 Mhz dot clock). */ + kIOTimingIDVESA_1856x1392_75hz = 302, /* 1856x1392 (75 Hz) VESA timing (288 Mhz dot clock). */ + kIOTimingIDVESA_1920x1440_60hz = 304, /* 1920x1440 (60 Hz) VESA timing (234 Mhz dot clock). */ + kIOTimingIDVESA_1920x1440_75hz = 306, /* 1920x1440 (75 Hz) VESA timing (297 Mhz dot clock). */ + kIOTimingIDSMPTE240M_60hz = 400, /* 60Hz V, 33.75KHz H, interlaced timing, 16:9 aspect, typical resolution of 1920x1035. */ + kIOTimingIDFilmRate_48hz = 410, /* 48Hz V, 25.20KHz H, non-interlaced timing, typical resolution of 640x480. */ + kIOTimingIDSony_1600x1024_76hz = 500, /* 1600x1024 (76 Hz) Sony timing (pixel clock is 170.447 Mhz dot clock). */ + kIOTimingIDSony_1920x1080_60hz = 510, /* 1920x1080 (60 Hz) Sony timing (pixel clock is 159.84 Mhz dot clock). */ + kIOTimingIDSony_1920x1080_72hz = 520, /* 1920x1080 (72 Hz) Sony timing (pixel clock is 216.023 Mhz dot clock). */ + kIOTimingIDSony_1920x1200_76hz = 540, /* 1900x1200 (76 Hz) Sony timing (pixel clock is 243.20 Mhz dot clock). */ + kIOTimingIDApple_0x0_0hz_Offline = 550, /* Indicates that this timing will take the display off-line and remove it from the system. */ + kIOTimingIDVESA_848x480_60hz = 570, /* 848x480 (60 Hz) VESA timing. */ + kIOTimingIDVESA_1360x768_60hz = 590 /* 1360x768 (60 Hz) VESA timing. */ +}; + +// framebuffer property keys + +#define kIOFramebufferInfoKey "IOFramebufferInformation" + +#define kIOFBWidthKey "IOFBWidth" +#define kIOFBHeightKey "IOFBHeight" +#define kIOFBRefreshRateKey "IOFBRefreshRate" +#define kIOFBFlagsKey "IOFBFlags" +#define kIOFBBytesPerRowKey "IOFBBytesPerRow" +#define kIOFBBytesPerPlaneKey "IOFBBytesPerPlane" +#define kIOFBBitsPerPixelKey "IOFBBitsPerPixel" +#define kIOFBComponentCountKey "IOFBComponentCount" +#define kIOFBBitsPerComponentKey "IOFBBitsPerComponent" + +#define kIOFBDetailedTimingsKey "IOFBDetailedTimings" +#define kIOFBTimingRangeKey "IOFBTimingRange" +#define kIOFBScalerInfoKey "IOFBScalerInfo" +#define kIOFBCursorInfoKey "IOFBCursorInfo" +#define kIOFBHDMIDongleROMKey "IOFBHDMIDongleROM" + +#define kIOFBHostAccessFlagsKey "IOFBHostAccessFlags" + +#define kIOFBMemorySizeKey "IOFBMemorySize" + +#define kIOFBNeedsRefreshKey "IOFBNeedsRefresh" + +#define kIOFBProbeOptionsKey "IOFBProbeOptions" + +#define kIOFBGammaWidthKey "IOFBGammaWidth" +#define kIOFBGammaCountKey "IOFBGammaCount" +#define kIOFBCLUTDeferKey "IOFBCLUTDefer" + +#define kIOFBDisplayPortConfigurationDataKey "dpcd-registers" + +// exists on the hibernate progress display device +#ifndef kIOHibernatePreviewActiveKey +#define kIOHibernatePreviewActiveKey "IOHibernatePreviewActive" +// values for kIOHibernatePreviewActiveKey set by driver +enum { + kIOHibernatePreviewActive = 0x00000001, + kIOHibernatePreviewUpdates = 0x00000002 +}; +#endif + +#define kIOHibernateEFIGfxStatusKey "IOHibernateEFIGfxStatus" + +// CFNumber/CFData +#define kIOFBAVSignalTypeKey "av-signal-type" +enum { + kIOFBAVSignalTypeUnknown = 0x00000000, + kIOFBAVSignalTypeVGA = 0x00000001, + kIOFBAVSignalTypeDVI = 0x00000002, + kIOFBAVSignalTypeHDMI = 0x00000008, + kIOFBAVSignalTypeDP = 0x00000010, +}; + +// kIOFBDisplayPortTrainingAttribute data + +struct IOFBDPLinkConfig +{ + uint16_t version; // 8 bit high (major); 8 bit low (minor) + uint8_t bitRate; // same encoding as the spec + uint8_t __reservedA[1]; // reserved set to zero + uint16_t t1Time; // minimum duration of the t1 pattern (microseconds) + uint16_t t2Time; // minimum duration of the t2 pattern + uint16_t t3Time; // minimum duration of the t3 pattern + uint8_t idlePatterns; // minimum number of idle patterns + uint8_t laneCount; // number of lanes in the link + uint8_t voltage; + uint8_t preEmphasis; + uint8_t downspread; + uint8_t scrambler; + uint8_t maxBitRate; // same encoding as the bitRate field + uint8_t maxLaneCount; // an integer + uint8_t maxDownspread; // 0 = Off. 1 = 0.5 + uint8_t __reservedB[9]; // reserved set to zero - fix align and provide 8 bytes of padding. +}; +typedef struct IOFBDPLinkConfig IOFBDPLinkConfig; + +enum +{ + kIOFBBitRateRBR = 0x06, // 1.62 Gbps per lane + kIOFBBitRateHBR = 0x0A, // 2.70 Gbps per lane + kIOFBBitRateHBR2 = 0x14, // 5.40 Gbps per lane +}; + +enum { + kIOFBLinkVoltageLevel0 = 0x00, + kIOFBLinkVoltageLevel1 = 0x01, + kIOFBLinkVoltageLevel2 = 0x02, + kIOFBLinkVoltageLevel3 = 0x03 +}; + +enum +{ + kIOFBLinkPreEmphasisLevel0 = 0x00, + kIOFBLinkPreEmphasisLevel1 = 0x01, + kIOFBLinkPreEmphasisLevel2 = 0x02, + kIOFBLinkPreEmphasisLevel3 = 0x03 +}; + +enum +{ + kIOFBLinkDownspreadNone = 0x0, + kIOFBLinkDownspreadMax = 0x1 +}; + +enum +{ + kIOFBLinkScramblerNormal = 0x0, // for external displays + kIOFBLinkScramblerAlternate = 0x1 // used for eDP +}; + +// diagnostic keys + +#define kIOFBConfigKey "IOFBConfig" +#define kIOFBModesKey "IOFBModes" +#define kIOFBModeIDKey "ID" +#define kIOFBModeDMKey "DM" +#define kIOFBModeTMKey "TM" +#define kIOFBModeAIDKey "AID" +#define kIOFBModeDFKey "DF" +#define kIOFBModePIKey "PI" + +// display property keys + +#define kIODisplayEDIDKey "IODisplayEDID" +#define kIODisplayEDIDOriginalKey "IODisplayEDIDOriginal" +#define kIODisplayLocationKey "IODisplayLocation" // CFString +#define kIODisplayConnectFlagsKey "IODisplayConnectFlags" // CFNumber +#define kIODisplayHasBacklightKey "IODisplayHasBacklight" // CFBoolean +#define kIODisplayIsDigitalKey "IODisplayIsDigital" // CFBoolean +#define kDisplayBundleKey "DisplayBundle" + +#define kAppleDisplayTypeKey "AppleDisplayType" +#define kAppleSenseKey "AppleSense" + +#define kIODisplayMCCSVersionKey "IODisplayMCCSVersion" +#define kIODisplayTechnologyTypeKey "IODisplayTechnologyType" +#define kIODisplayUsageTimeKey "IODisplayUsageTime" +#define kIODisplayFirmwareLevelKey "IODisplayFirmwareLevel" + +enum { + kDisplayVendorIDUnknown = 'unkn', + kDisplayProductIDGeneric = 0x717 +}; + +#define kDisplayVendorID "DisplayVendorID" // CFNumber +#define kDisplayProductID "DisplayProductID" // CFNumber +#define kDisplaySerialNumber "DisplaySerialNumber" // CFNumber +#define kDisplaySerialString "DisplaySerialString" // CFString +#define kDisplayWeekOfManufacture "DisplayWeekManufacture" // CFNumber +#define kDisplayYearOfManufacture "DisplayYearManufacture" // CFNumber + +// CFDictionary of language-locale keys, name values +// eg. "en"="Color LCD", "en-GB"="Colour LCD" +#define kDisplayProductName "DisplayProductName" + +// all CFNumber or CFArray of CFNumber (floats) +#define kDisplayWhitePointX "DisplayWhitePointX" +#define kDisplayWhitePointY "DisplayWhitePointY" +#define kDisplayRedPointX "DisplayRedPointX" +#define kDisplayRedPointY "DisplayRedPointY" +#define kDisplayGreenPointX "DisplayGreenPointX" +#define kDisplayGreenPointY "DisplayGreenPointY" +#define kDisplayBluePointX "DisplayBluePointX" +#define kDisplayBluePointY "DisplayBluePointY" +#define kDisplayWhiteGamma "DisplayWhiteGamma" +#define kDisplayRedGamma "DisplayRedGamma" +#define kDisplayGreenGamma "DisplayGreenGamma" +#define kDisplayBlueGamma "DisplayBlueGamma" + +// Display gamma +#define kDisplayGammaChannels "DisplayGammaChannels" // CFNumber 1 or 3 channel count +#define kDisplayGammaEntryCount "DisplayGammaEntryCount" // CFNumber 1-based count of entries per channel +#define kDisplayGammaEntrySize "DisplayGammaEntrySize" // CFNumber size in bytes of each table entry +#define kDisplayGammaTable "DisplayGammaTable" // CFData + +// CFBoolean +#define kDisplayBrightnessAffectsGamma "DisplayBrightnessAffectsGamma" +#define kDisplayViewAngleAffectsGamma "DisplayViewAngleAffectsGamma" + +// CFData +#define kDisplayCSProfile "DisplayCSProfile" + +// CFNumber +#define kDisplayHorizontalImageSize "DisplayHorizontalImageSize" +#define kDisplayVerticalImageSize "DisplayVerticalImageSize" + +// Pixel description + +// CFBoolean +#define kDisplayFixedPixelFormat "DisplayFixedPixelFormat" + +enum { + kDisplaySubPixelLayoutUndefined = 0x00000000, + kDisplaySubPixelLayoutRGB = 0x00000001, + kDisplaySubPixelLayoutBGR = 0x00000002, + kDisplaySubPixelLayoutQuadGBL = 0x00000003, + kDisplaySubPixelLayoutQuadGBR = 0x00000004, + + kDisplaySubPixelConfigurationUndefined = 0x00000000, + kDisplaySubPixelConfigurationDelta = 0x00000001, + kDisplaySubPixelConfigurationStripe = 0x00000002, + kDisplaySubPixelConfigurationStripeOffset = 0x00000003, + kDisplaySubPixelConfigurationQuad = 0x00000004, + + kDisplaySubPixelShapeUndefined = 0x00000000, + kDisplaySubPixelShapeRound = 0x00000001, + kDisplaySubPixelShapeSquare = 0x00000002, + kDisplaySubPixelShapeRectangular = 0x00000003, + kDisplaySubPixelShapeOval = 0x00000004, + kDisplaySubPixelShapeElliptical = 0x00000005 +}; + +// CFNumbers +#define kDisplaySubPixelLayout "DisplaySubPixelLayout" +#define kDisplaySubPixelConfiguration "DisplaySubPixelConfiguration" +#define kDisplaySubPixelShape "DisplaySubPixelShape" + +#define kIODisplayOverrideMatchingKey "IODisplayOverrideMatching" + +// Display parameters + +#define kIODisplayParametersKey "IODisplayParameters" +#define kIODisplayGUIDKey "IODisplayGUID" + +#define kIODisplayValueKey "value" +#define kIODisplayMinValueKey "min" +#define kIODisplayMaxValueKey "max" + +#define kIODisplayBrightnessProbeKey "brightness-probe" +#define kIODisplayLinearBrightnessProbeKey "linear-brightness-probe" +#define kIODisplayBrightnessKey "brightness" +#define kIODisplayLinearBrightnessKey "linear-brightness" +#define kIODisplayUsableLinearBrightnessKey "usable-linear-brightness" +#define kIODisplayBrightnessFadeKey "brightness-fade" +#define kIODisplayContrastKey "contrast" +#define kIODisplayHorizontalPositionKey "horizontal-position" +#define kIODisplayHorizontalSizeKey "horizontal-size" +#define kIODisplayVerticalPositionKey "vertical-position" +#define kIODisplayVerticalSizeKey "vertical-size" +#define kIODisplayTrapezoidKey "trapezoid" +#define kIODisplayPincushionKey "pincushion" +#define kIODisplayParallelogramKey "parallelogram" +#define kIODisplayRotationKey "rotation" +#define kIODisplayTheatreModeKey "theatre-mode" +#define kIODisplayTheatreModeWindowKey "theatre-mode-window" +#define kIODisplayOverscanKey "oscn" +#define kIODisplayVideoBestKey "vbst" + +#define kIODisplaySpeakerVolumeKey "speaker-volume" +#define kIODisplaySpeakerSelectKey "speaker-select" +#define kIODisplayMicrophoneVolumeKey "microphone-volume" +#define kIODisplayAmbientLightSensorKey "ambient-light-sensor" +#define kIODisplayAudioMuteAndScreenBlankKey "audio-mute-and-screen-blank" +#define kIODisplayAudioTrebleKey "audio-treble" +#define kIODisplayAudioBassKey "audio-bass" +#define kIODisplayAudioBalanceLRKey "audio-balance-LR" +#define kIODisplayAudioProcessorModeKey "audio-processor-mode" +#define kIODisplayPowerModeKey "power-mode" +#define kIODisplayManufacturerSpecificKey "manufacturer-specific" + +#define kIODisplayPowerStateKey "dsyp" + +#define kIODisplayControllerIDKey "IODisplayControllerID" +#define kIODisplayCapabilityStringKey "IODisplayCapabilityString" + +#define kIODisplayRedGammaScaleKey "rgsc" +#define kIODisplayGreenGammaScaleKey "ggsc" +#define kIODisplayBlueGammaScaleKey "bgsc" +#define kIODisplayGammaScaleKey "gsc " + +#define kIODisplayParametersCommitKey "commit" +#define kIODisplayParametersDefaultKey "defaults" +#define kIODisplayParametersFlushKey "flush" + +#ifdef __cplusplus +} +#endif + +#endif /* ! _IOKIT_IOGRAPHICSTYPES_H */ diff --git a/QualcommWireless/include/IOKit/graphics/tl/_config b/QualcommWireless/include/IOKit/graphics/tl/_config new file mode 100644 index 0000000..b1a05dc --- /dev/null +++ b/QualcommWireless/include/IOKit/graphics/tl/_config @@ -0,0 +1,38 @@ +/* vim: set ft=cpp: + * + * Copyright (c) 2018- Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 2.0 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +// No need for versioning yet, no binary compatibilty is really provided by C++ +// anyway. But if the IOG template library becomes part of IOKit we should add +// an inlined versioned namespace. + +#ifndef IOG_TL__CONFIG +#define IOG_TL__CONFIG + +#define _IOG_START_NAMESPACE namespace iog { +#define _IOG_END_NAMESPACE } +#define _VIOG iog + +namespace iog { +} + +#endif // !IOG_TL__CONFIG diff --git a/QualcommWireless/include/IOKit/graphics/tl/iolocks b/QualcommWireless/include/IOKit/graphics/tl/iolocks new file mode 100644 index 0000000..898975d --- /dev/null +++ b/QualcommWireless/include/IOKit/graphics/tl/iolocks @@ -0,0 +1,123 @@ +/* vim: set ft=cpp: + * + * Copyright (c) 2018- Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 2.0 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +// Since IOKit doesn't support stl for good reason, we would like to +// cherry-pick the more useful c++11 and after templates + +#ifndef IOG_TL_IOLOCKS +#define IOG_TL_IOLOCKS + +#include <_config> + +#include +#include + +_IOG_START_NAMESPACE + +// Declare a special type of IOSimpleLock that indicates interrupt blocking +struct IOSimpleLockInterrupt {}; +inline IOSimpleLock* IOSimpleLockCastOperator(IOSimpleLockInterrupt *sli) + { return reinterpret_cast(sli); } +inline IOSimpleLockInterrupt* IOSimpleLockInterruptAlloc() + { return reinterpret_cast(IOSimpleLockAlloc()); } +inline void IOSimpleLockInterruptFree(IOSimpleLockInterrupt* sli) + { return IOSimpleLockFree(IOSimpleLockCastOperator(sli)); } + +namespace locking_primitives { +// Take locks +inline IOInterruptState lock(IOLock* l) + { IOLockLock(l); return 0; } +inline IOInterruptState lock(IORecursiveLock* l) + { IORecursiveLockLock(l); return 0; } +inline IOInterruptState lock(IOSimpleLock* l) + { IOSimpleLockLock(l); return 0; } +inline IOInterruptState lock(IOSimpleLockInterrupt* sli) +{ + auto *sl = reinterpret_cast(sli); + return IOSimpleLockLockDisableInterrupt(sl); +} + +// Release locks +inline void unlock(IOLock* l, IOInterruptState) + { IOLockUnlock(l); } +inline void unlock(IORecursiveLock* l, IOInterruptState) + { IORecursiveLockUnlock(l); } +inline void unlock(IOSimpleLock* l, IOInterruptState) + { IOSimpleLockUnlock(l); } +inline void unlock(IOSimpleLockInterrupt* sli, IOInterruptState is) +{ + auto *sl = reinterpret_cast(sli); + IOSimpleLockUnlockEnableInterrupt(sl, is); +} + +// Lock assertions +// TODO(gvdl): Hack alert, for some reason IOLocks.h doesn't publish the +// assertions out of XNU_KERNEL_PRIVATE. Until it is published I have copy and +// pasted the implementaiton, radar to follow. +inline void assertLocked(IOLock* l) + { LCK_MTX_ASSERT(static_cast(l), LCK_ASSERT_OWNED); } +inline void assertLocked(IORecursiveLock* l) + { assert(IORecursiveLockHaveLock(l)); } +inline void assertLocked(IOSimpleLock* l) + { LCK_SPIN_ASSERT(static_cast(l), LCK_ASSERT_OWNED); } +inline void assertLocked(IOSimpleLockInterrupt* l) + { LCK_SPIN_ASSERT(reinterpret_cast(l), LCK_ASSERT_OWNED); } + +inline void assertUnlocked(IOLock* l) + { LCK_MTX_ASSERT(static_cast(l), LCK_ASSERT_NOTOWNED); } +inline void assertUnlocked(IORecursiveLock* l) + { assert(!IORecursiveLockHaveLock(l)); } +inline void assertUnlocked(IOSimpleLock* l) + { LCK_SPIN_ASSERT(static_cast(l), LCK_ASSERT_NOTOWNED); } +inline void assertUnlocked(IOSimpleLockInterrupt* l) + { LCK_SPIN_ASSERT(reinterpret_cast(l), LCK_ASSERT_NOTOWNED); } +}; // namespace locking_primitives + +// LockGuard works as is with IOLock, IORecursiveLock, IOSimpleLock and the +// above IOSimpleLockInterrupt (which disables interrupts too). +template +class LockGuard { +public: + LockGuard() = delete; + LockGuard(const LockGuard&) = delete; + LockGuard& operator=(const LockGuard&) = delete; + LockGuard& operator=(LockGuard&& other) = delete; + + explicit LockGuard(_L* lock) : fLock(lock) + { + fMostlyUnusedInterruptState = locking_primitives::lock(fLock); + } + ~LockGuard() + { + if (static_cast(fLock)) + locking_primitives::unlock(fLock, fMostlyUnusedInterruptState); + } + LockGuard(LockGuard&& other) : fLock(other.fLock) { other.fLock = 0; } +private: + _L* fLock = nullptr; + IOInterruptState fMostlyUnusedInterruptState = 0; +}; + +_IOG_END_NAMESPACE + +#endif // !IOG_TL_IOLOCKS diff --git a/QualcommWireless/include/IOKit/graphics/tl/osmemory b/QualcommWireless/include/IOKit/graphics/tl/osmemory new file mode 100644 index 0000000..1b486a4 --- /dev/null +++ b/QualcommWireless/include/IOKit/graphics/tl/osmemory @@ -0,0 +1,538 @@ +/* vim: set ft=cpp: + * + * Copyright (c) 2018- Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 2.0 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +// Since IOKit doesn't support stl for good reason, we would like to +// cherry-pick the more useful c++11 and after template. In particular the +// smart pointer stuff. This file is an OSObject specialization of +// std::unique_ptr, std::shared_ptr and std::weak_ptr + +#ifndef IOG_TL_OSMEMORY +#define IOG_TL_OSMEMORY + +#if KERNEL +#include +#include +#else +#include +#endif + +#include <_config> +#include + +#include + +#include + +_IOG_START_NAMESPACE + +template class OSUniqueObject; +template class OSSharedObject; +template class OSWeakObject; + +// std::unique_ptr equivalent +template +class OSUniqueObject +{ +public: + using pointer = _T*; + using element_type = _T; + +private: + pointer fTypedObj = nullptr; + + template friend class OSSharedObject; + + void impl_release() + { + OSSafeReleaseNULL(fTypedObj); + } + + template + OSUniqueObject& impl_opassign(OSUniqueObject<_Y>&& other) + { + if (this != &other) + { + impl_release(); + fTypedObj = other.fTypedObj; + other.fTypedObj = nullptr; + } + return *this; + } + +public: + OSUniqueObject() = default; + ~OSUniqueObject() + { + OSSafeReleaseNULL(fTypedObj); + } + + // Just like std::unique_ptr, takes ownership of p + OSUniqueObject(pointer p) : fTypedObj(p) { } + + explicit OSUniqueObject(nullptr_t /* np */) {} + OSUniqueObject& operator=(nullptr_t /* np */) + { + impl_release(); + return *this; + } + + // Move + OSUniqueObject(OSUniqueObject&& other) : fTypedObj(other.fTypedObj) + { other.fTypedObj = nullptr; } + template + OSUniqueObject(OSUniqueObject<_Y>&& other) : fTypedObj(other.fTypedObj) + { other.fTypedObj = nullptr; } + OSUniqueObject& operator=(OSUniqueObject&& other) + { return impl_opassign(_VIOG::move(other)); } + template + OSUniqueObject& operator=(OSUniqueObject<_Y>&& other) + { return impl_opassign(_VIOG::move(other)); } + + // Copy is illegal + OSUniqueObject(const OSUniqueObject&) = delete; + template + OSUniqueObject(const OSUniqueObject<_Y>& other) = delete; + OSUniqueObject& operator=(const OSUniqueObject& other) = delete; + template + OSUniqueObject& operator=(const OSUniqueObject<_Y>& other) = delete; + + // Member functions + pointer get() const { return fTypedObj; } + pointer operator->() const { return fTypedObj; } + _T& operator*() const { return *fTypedObj; } + operator bool() const { return static_cast(get()); } + void reset(pointer p = nullptr) { *this = OSUniqueObject(p); } + + void swap(OSUniqueObject& other) + { + _VIOG::swap(fTypedObj, other.fTypedObj); + } +}; // OSUniqueObject<_T> + +// OSUniqueObject non member funtions +template +void swap(OSUniqueObject<_T>& lhs, OSUniqueObject<_T>& rhs) { lhs.swap(rhs); } + +// std::unique_ptr performs '==' operations by comparing get(). But that is +// just crazy. If two unique_ptrs are different objects and have the same +// pointer then our uniqueness assumption is violated. +template +bool operator==(const OSUniqueObject<_T>& lhs, const OSUniqueObject<_Y>& rhs) + { return lhs.get() == rhs.get(); } +template +bool operator!=(const OSUniqueObject<_T>& lhs, const OSUniqueObject<_Y>& rhs) + { return !(lhs == rhs); } + +// Null pointer comparison specializations +template +bool operator==(const OSUniqueObject<_T>& lhs, _VIOG::nullptr_t) + { return !static_cast(lhs); } +template +bool operator==(_VIOG::nullptr_t, const OSUniqueObject<_T>& rhs) + { return !static_cast(rhs); } +template +bool operator!=(const OSUniqueObject<_T>& lhs, _VIOG::nullptr_t) + { return static_cast(lhs); } +template +bool operator!=(_VIOG::nullptr_t, const OSUniqueObject<_T>& rhs) + { return static_cast(rhs); } + + +// Shared and Weak object helper class +class _OSSharedWeakCounter +{ + template friend class OSSharedObject; + template friend class OSWeakObject; + + OSObject* fObj; + os_refcnt fUseCount; + os_refcnt fWeakCount; + + explicit _OSSharedWeakCounter(OSObject* obj); + ~_OSSharedWeakCounter(); + + bool retain_shared(); + void release_shared(); + long count_shared() const; + void retain_weak(); + void release_weak(); + + _OSSharedWeakCounter* lock() + { + return retain_shared() ? this : nullptr; + } +}; // class _OSSharedWeakCounter + +// std::shared_ptr equivalent +template +class OSSharedObject +{ +public: + using element_type = _T; + using pointer = _T*; + using weak_type = OSWeakObject<_T>; + +private: + _OSSharedWeakCounter* fControl = nullptr; + pointer fTypedObj = nullptr; + + template friend class OSSharedObject; + template friend class OSWeakObject; + + void impl_zero() + { + fControl = nullptr; + fTypedObj = nullptr; + } + void impl_setme(const OSSharedObject& from) + { + fControl = from.fControl; + fTypedObj = from.fTypedObj; + } + template + void impl_setme(const OSSharedObject<_Y>& from) + { + fControl = from.fControl; + fTypedObj = from.fTypedObj; + } + void impl_saferetain() + { + if (static_cast(fControl)) + fControl->retain_shared(); + } + void impl_saferelease() + { + if (static_cast(fControl)) + fControl->release_shared(); + } + +public: + // Basic constructor destructors + + // Just like std::shared_ptr, takes ownership of p + OSSharedObject(_T* tp) + : fControl(new _OSSharedWeakCounter(tp)), fTypedObj(tp) {} + template + OSSharedObject(_Y* yp) + : fControl(new _OSSharedWeakCounter(yp)), fTypedObj(yp) {} + + OSSharedObject() = default; + ~OSSharedObject() + { + impl_saferelease(); + impl_zero(); + } + + // Move + OSSharedObject(OSSharedObject&& other) + { + impl_setme(other); + other.impl_zero(); + } + template + OSSharedObject(OSSharedObject<_Y>&& other) + { + impl_setme(other); + other.impl_zero(); + } + OSSharedObject& operator=(OSSharedObject&& other) + { + if (this != &other) + { + impl_saferelease(); + impl_setme(other); + other.impl_zero(); + } + return *this; + } + template + OSSharedObject& operator=(OSSharedObject<_Y>&& other) + { + if (this != &other) + { + impl_saferelease(); + impl_setme(other); + other.impl_zero(); + } + return *this; + } + + // Copy + OSSharedObject(const OSSharedObject& other) + { + impl_setme(other); + impl_saferetain(); + } + template + OSSharedObject(const OSSharedObject<_Y>& other) + { + impl_setme(other); + impl_saferetain(); + } + template + OSSharedObject(const OSSharedObject<_Y>& other, element_type* p) + : fControl(other.fControl) // Aliasing copy + { + if (static_cast(fControl)) { + fControl->retain_shared(); + fTypedObj = p; + } + } + OSSharedObject& operator=(const OSSharedObject& other) + { + if (this != &other) + { + impl_saferelease(); + impl_setme(other); + impl_saferetain(); + } + return *this; + } + + template + OSSharedObject& operator=(const OSSharedObject<_Y>& other) + { + if (this != &other) + { + impl_saferelease(); + impl_setme(other); + impl_saferetain(); + } + return *this; + } + + + pointer get() const { return fTypedObj; } + pointer operator->() const { return fTypedObj; } + _T& operator*() const { return *fTypedObj; } + operator bool() const { return static_cast(get()); } + void reset() { *this = OSSharedObject(); }; + long use_count() const + { + return static_cast(fControl)? fControl->count_shared() : 0; + } + + void swap(OSSharedObject& other) + { + _VIOG::swap(fControl, other.fControl); + _VIOG::swap(fTypedObj, other.fTypedObj); + } +}; + +// OSSharedObject non member funtions +template +void swap(OSSharedObject<_T>& lhs, OSSharedObject<_T>& rhs) { lhs.swap(rhs); } + +template +OSSharedObject<_T> static_pointer_cast(const OSSharedObject<_Y>& other) +{ + auto p = static_cast::element_type*>( + other.get()); + return OSSharedObject<_T>(other, p); +} + +template +OSSharedObject<_T> dynamic_pointer_cast(const OSSharedObject<_Y>& other) +{ + + auto p = OSDynamicCast(_T, other.get()); + if (static_cast(p)) + return OSSharedObject<_T>(other, p); + else + return OSSharedObject<_T>(); +} + + +template +OSSharedObject<_T> const_pointer_cast(const OSSharedObject<_Y>& other) +{ + auto p = const_cast::element_type*>( + other.get()); + return OSSharedObject<_T>(other, p); +} + +template +OSSharedObject<_T> reinterpret_pointer_cast(const OSSharedObject<_Y>& other) +{ + auto p = reinterpret_cast::element_type*>( + other.get()); + return OSSharedObject<_T>(other, p); +} + +template +bool operator==(const OSSharedObject<_T>& lhs, const OSSharedObject<_Y>& rhs) + { return lhs.get() == rhs.get(); } +template +bool operator!=(const OSSharedObject<_T>& lhs, const OSSharedObject<_Y>& rhs) + { return !(lhs == rhs); } +template +bool operator==(const OSSharedObject<_T>& lhs, _VIOG::nullptr_t) + { return !static_cast(lhs); } +template +bool operator==(_VIOG::nullptr_t, const OSSharedObject<_T>& rhs) + { return !static_cast(rhs); } +template +bool operator!=(const OSSharedObject<_T>& lhs, _VIOG::nullptr_t) + { return static_cast(lhs); } +template +bool operator!=(_VIOG::nullptr_t, const OSSharedObject<_T>& rhs) + { return static_cast(rhs); } + +// std::weak_ptr equivalent +template +class OSWeakObject +{ +public: + using element_type = _T; + +private: + _OSSharedWeakCounter* fControl = nullptr; + _T* fTypedObj = nullptr; + + template friend class OSSharedObject; + template friend class OSWeakObject; + + void impl_zero() + { + fControl = nullptr; + fTypedObj = nullptr; + } + void impl_saferetain() + { + if (static_cast(fControl)) + fControl->retain_weak(); + } + void impl_saferelease() + { + if (static_cast(fControl)) + fControl->release_weak(); + } + +public: + OSWeakObject() = default; + ~OSWeakObject() + { + impl_saferelease(); + impl_zero(); + } + + // Conversion from shared to weak + template + OSWeakObject(const OSSharedObject<_Y>& shared) + : fControl(shared.fControl), fTypedObj(shared.fTypedObj) + { + impl_saferetain(); + } + template + OSWeakObject& operator=(const OSSharedObject<_Y>& shared) + { + if (this != &shared) + { + impl_saferelease(); + fControl = shared.fControl; + fTypedObj = shared.fTypedObj; + impl_saferetain(); + } + return *this; + } + + // Copy + OSWeakObject(const OSWeakObject& other) + : fControl(other.fControl), fTypedObj(other.fTypedObj) + { + impl_saferetain(); + } + template + OSWeakObject(const OSWeakObject<_Y>& other) + : fControl(other.fControl), fTypedObj(other.fTypedObj) + { + impl_saferetain(); + } + OSWeakObject& operator=(const OSWeakObject& other) + { + if (this != &other) + { + impl_saferelease(); + fControl = other.fControl; + fTypedObj = other.fTypedObj; + impl_saferetain(); + } + return *this; + } + + // Move + OSWeakObject(OSWeakObject&& other) + : fControl(other.fControl), fTypedObj(other.fTypedObj) + { + other.impl_zero(); + } + template + OSWeakObject(OSWeakObject<_Y>&& other) + :fControl(other.fControl), fTypedObj(other.fTypedObj) + { + other.impl_zero(); + } + OSWeakObject& operator=(OSWeakObject&& other) + { + if (this != &other) + { + impl_saferelease(); + fControl = other.fControl; + fTypedObj = other.fTypedObj; + other.impl_zero(); + } + return *this; + } + + void reset() { *this = OSWeakObject(); }; + long use_count() const + { + return static_cast(fControl)? fControl->count_shared() : 0; + } + bool expired() const + { + return !static_cast(fControl) || fControl->count_shared() == 0; + } + OSSharedObject<_T> lock() const + { + OSSharedObject<_T> ret; + ret.fControl = static_cast(fControl)? fControl->lock() : nullptr; + if (static_cast(ret.fControl)) + ret.fTypedObj = fTypedObj; + return ret; + } + + void swap(OSWeakObject<_T>& other) + { + _VIOG::swap(fControl, other.fControl); + _VIOG::swap(fTypedObj, other.fTypedObj); + } +}; + +// OSWeakObject non member funtions +template +void swap(OSWeakObject<_T>& lhs, OSWeakObject<_T>& rhs) { lhs.swap(rhs); } + +_IOG_END_NAMESPACE + +#endif // !IOG_TL_OSMEMORY diff --git a/QualcommWireless/include/IOKit/graphics/tl/osutility b/QualcommWireless/include/IOKit/graphics/tl/osutility new file mode 100644 index 0000000..733bdfb --- /dev/null +++ b/QualcommWireless/include/IOKit/graphics/tl/osutility @@ -0,0 +1,74 @@ +/* vim: set ft=cpp: + * + * Copyright (c) 2018- Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 2.0 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +// Darwin kernel type_traits and other stuff + +#ifndef IOG_TL_OSUTILITY +#define IOG_TL_OSUTILITY + +#include <_config> + + +_IOG_START_NAMESPACE + +typedef decltype(nullptr) nullptr_t; + +// Reference removal +template struct remove_reference {typedef _T type;}; +template struct remove_reference<_T&> {typedef _T type;}; +template struct remove_reference<_T&&> {typedef _T type;}; +template +using remove_reference_t = typename remove_reference<_T>::type; + +// Pointer removal +template struct remove_pointer {typedef _T type;}; +template struct remove_pointer<_T*> {typedef _T type;}; +template struct remove_pointer<_T* const> {typedef _T type;}; +template struct remove_pointer<_T* volatile> {typedef _T type;}; +template struct remove_pointer<_T* const volatile> {typedef _T type;}; +template +using remove_pointer_t = typename remove_pointer<_T>::type; + +// Const/Volatile +template struct remove_const {typedef _T type;}; +template struct remove_const {typedef _T type;}; +template struct remove_volatile {typedef _T type;}; +template struct remove_volatile {typedef _T type;}; + +// move +template +inline remove_reference_t<_T>&& move(_T&& _t) +{ + return static_cast&&>(_t); +} + +template void swap(_T& lhs, _T& rhs) +{ + _T tmp; + tmp = _VIOG::move(lhs); + lhs = _VIOG::move(rhs); + rhs = _VIOG::move(tmp); +} + +_IOG_END_NAMESPACE + +#endif /* IOG_TL_OSUTILITY */ diff --git a/QualcommWireless/include/IOKit/hid/AppleHIDUsageTables.h b/QualcommWireless/include/IOKit/hid/AppleHIDUsageTables.h new file mode 100644 index 0000000..03f2757 --- /dev/null +++ b/QualcommWireless/include/IOKit/hid/AppleHIDUsageTables.h @@ -0,0 +1,268 @@ +/* + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +#ifndef _APPLEHIDUSAGETABLES_H +#define _APPLEHIDUSAGETABLES_H + +/* ****************************************************************************************** + * Apple HID Usage Tables + * + * The following constants are Apple Vendor specific usages + * ****************************************************************************************** */ + + +/* Usage Pages */ +enum { + kHIDPage_AppleVendor = 0xFF00, + kHIDPage_AppleVendorKeyboard = 0xFF01, + kHIDPage_AppleVendorMouse = 0xFF02, + kHIDPage_AppleVendorAccelerometer = 0xFF03, + kHIDPage_AppleVendorAmbientLightSensor = 0xFF04, + kHIDPage_AppleVendorTemperatureSensor = 0xFF05, + kHIDPage_AppleVendorHeadset = 0xFF07, + kHIDPage_AppleVendorPowerSensor = 0xFF08, + kHIDPage_AppleVendorSmartCover = 0xFF09, + kHIDPage_AppleVendorPlatinum = 0xFF0A, + kHIDPage_AppleVendorHeartRate = 0xFF0A, + kHIDPage_AppleVendorLisa = 0xFF0B, + kHIDPage_AppleVendorMotion = 0xFF0C, + kHIDPage_AppleVendorBattery = 0xFF0D, + kHIDPage_AppleVendorIRRemote = 0xFF0E, + kHIDPage_AppleVendorDebug = 0xFF0F, + kHIDPage_AppleVendorIRInterface = 0xFF10, + kHIDPage_AppleVendorDFR = 0xFF11, + kHIDPage_AppleVendorDFRBrightness = 0xFF12, + kHIDPage_AppleVendorSenderID = 0xFF13, + kHIDPage_AppleVendorFilteredEvent = 0xFF50, + kHIDPage_AppleVendorMultitouch = 0xFF60, + kHIDPage_AppleVendorDisplay = 0xFF92, + kHIDPage_AppleVendorTopCase = 0x00FF +}; + + +/* AppleVendor Page (0xff00) */ +enum { + kHIDUsage_AppleVendor_TopCase = 0x0001, /* Application Collection */ + kHIDUsage_AppleVendor_Display = 0x0002, /* Application Collection */ + kHIDUsage_AppleVendor_Accelerometer = 0x0003, /* Application Collection */ + kHIDUsage_AppleVendor_AmbientLightSensor = 0x0004, /* Application Collection */ + kHIDUsage_AppleVendor_TemperatureSensor = 0x0005, /* Application Collection */ + kHIDUsage_AppleVendor_Keyboard = 0x0006, /* Application Collection */ + kHIDUsage_AppleVendor_Headset = 0x0007, /* Application Collection */ + kHIDUsage_AppleVendor_ProximitySensor = 0x0008, /* Application Collection */ + kHIDUsage_AppleVendor_Gyro = 0x0009, /* Application Collection */ + kHIDUsage_AppleVendor_Compass = 0x000A, /* Application Collection */ + kHIDUsage_AppleVendor_DeviceManagement = 0x000B, /* Application Collection */ + kHIDUsage_AppleVendor_Trackpad = 0x000C, /* Application Collection */ + kHIDUsage_AppleVendor_TopCaseReserved = 0x000D, /* Application Collection */ + kHIDUsage_AppleVendor_Motion = 0x000E, /* Application Collection */ + kHIDUsage_AppleVendor_KeyboardBacklight = 0x000F, /* Application Collection */ + kHIDUsage_AppleVendor_DeviceMotionLite = 0x0010, /* Application Collection */ + kHIDUsage_AppleVendor_Force = 0x0011, /* Application Collection */ + kHIDUsage_AppleVendor_BluetoothRadio = 0x0012, /* Application Collection */ + kHIDUsage_AppleVendor_Orb = 0x0013, /* Application Collection */ + kHIDUsage_AppleVendor_AccessoryBattery = 0x0014, /* Application Collection Use kHIDUsage_PD_PeripheralDevice */ + kHIDUsage_AppleVendor_Humidity = 0x0015, /* Application Collection */ + kHIDUsage_AppleVendor_DFR = 0x0016, /* Application Collection */ + kHIDUsage_AppleVendor_NXEvent = 0x0017, /* Application Collection */ + kHIDUsage_AppleVendor_NXEvent_Translated = 0x0018, /* Application Collection */ + kHIDUsage_AppleVendor_NXEvent_Diagnostic = 0x0019, /* Application Collection */ + kHIDUsage_AppleVendor_Homer = 0x0020, /* Application Collection */ + kHIDUsage_AppleVendor_Color = 0x0021, /* Dynamic Value */ + kHIDUsage_AppleVendor_Accessibility = 0x0022, /* Application Collection */ + kHIDUsage_AppleVendor_Message = 0x0023, /* Application Collection */ + kHIDUsage_AppleVendor_Luna = 0x0024, /* Application Collection */ + kHIDUsage_AppleVendor_Payload = 0x0025, /* Application Collection */ + kHIDUsage_AppleVendor_Perf = 0x0026, /* Application Collection */ + kHIDUsage_AppleVendor_Gallium = 0x0027, /* Application Collection */ + kHIDUsage_AppleVendor_HIDRelay = 0x0028, /* Application Collection */ + kHIDUsage_AppleVendor_SmartCover = 0x0029 /* Application Collection */ +}; + + +/* AppleVendor Keyboard Page (0xff01) */ +enum { + kHIDUsage_AppleVendorKeyboard_Spotlight = 0x0001, + kHIDUsage_AppleVendorKeyboard_Dashboard = 0x0002, + kHIDUsage_AppleVendorKeyboard_Function = 0x0003, + kHIDUsage_AppleVendorKeyboard_Launchpad = 0x0004, + kHIDUsage_AppleVendorKeyboard_Reserved = 0x000A, + kHIDUsage_AppleVendorKeyboard_CapsLockDelayEnable = 0x000B, + kHIDUsage_AppleVendorKeyboard_PowerState = 0x000C, + kHIDUsage_AppleVendorKeyboard_Expose_All = 0x0010, + kHIDUsage_AppleVendorKeyboard_Expose_Desktop = 0x0011, + kHIDUsage_AppleVendorKeyboard_Brightness_Up = 0x0020, + kHIDUsage_AppleVendorKeyboard_Brightness_Down = 0x0021, + kHIDUsage_AppleVendorKeyboard_Language = 0x0030, + + /* Synthesized Keyboard Events */ + kHIDUsage_AppleVendorKeyboard_WillReset = 0x0040, + kHIDUsage_AppleVendorKeyboard_Reset = 0x0041, + kHIDUsage_AppleVendorKeyboard_WillFactoryReset = 0x0042, + kHIDUsage_AppleVendorKeyboard_AccessibilityToggle = 0x0043, +}; + +/* AppleVendor Page Headset (0xff07) */ +enum +{ + kHIDUsage_AV_Headset_Availability = 0x0001 +}; + +/* AppleVendor Power Page (0xff08) */ +enum { + kHIDUsage_AppleVendorPowerSensor_Power = 0x0001, + kHIDUsage_AppleVendorPowerSensor_Current = 0x0002, + kHIDUsage_AppleVendorPowerSensor_Voltage = 0x0003, +}; + +/* AppleVendor Smart Cover Page (0xff09) */ +enum { + kHIDUsage_AppleVendorSmartCover_Open = 0x0001, + kHIDUsage_AppleVendorSmartCover_Flap1 = 0x0002, + kHIDUsage_AppleVendorSmartCover_Flap2 = 0x0003, + kHIDUsage_AppleVendorSmartCover_Flap3 = 0x0004, + kHIDUsage_AppleVendorSmartCover_Attach = 0x0010, + kHIDUsage_AppleVendorSmartCover_StateUnknown= 0x0020, +}; + +/* AppleVendor Platinum - Heart Rate (0xff0A) */ +enum { + kHIDUsage_AppleVendorPlatinum_Lutetium = 0x0003, + kHIDUsage_AppleVendorHeartRate_HR = 0x0001, + kHIDUsage_AppleVendorHeartRate_BGHR = 0x0003, + kHIDUsage_AppleVendorHeartRate_Erbium = 0x0010, +}; + +/* AppleVendor Motion (0xff0C) */ +enum { + kHIDUsage_AppleVendorMotion_Motion = 0x0001, + kHIDUsage_AppleVendorMotion_Activity = 0x0002, + kHIDUsage_AppleVendorMotion_Gesture = 0x0003, + kHIDUsage_AppleVendorMotion_DeviceMotion = 0x0004, + kHIDUsage_AppleVendorMotion_DeviceMotion6 = 0x0005, + kHIDUsage_AppleVendorMotion_Orientation = 0x0006, + kHIDUsage_AppleVendorMotion_DeviceMotion3 = 0x0007, + kHIDUsage_AppleVendorMotion_DeviceMotion10 = 0x0008 +}; + +/* AppleVendor Battery (0xff0D) */ +enum { + kHIDUsage_AppleVendorBattery_RawCapacity = 0x0001, + kHIDUsage_AppleVendorBattery_NominalChargeCapacity = 0x0002, + kHIDUsage_AppleVendorBattery_CumulativeCurrent = 0x0003, +}; + +/* AppleVendor IR Remote (0xff0E) */ +enum { + kHIDUsage_AppleVendorIRRemote_Pair = 0x0001, + kHIDUsage_AppleVendorIRRemote_Unpair = 0x0002, + kHIDUsage_AppleVendorIRRemote_LowBattery = 0x0003, + kHIDUsage_AppleVendorIRRemote_BTLEDiscoveryMode = 0x0004, +}; + +/* AppleVendor Debug (0xff0F) */ +enum { + kHIDUsage_AppleVendorDebug_Screenshot = 0x0001, + kHIDUsage_AppleVendorDebug_Stackshot = 0x0002, + kHIDUsage_AppleVendorDebug_SendLogs = 0x0003, + kHIDUsage_AppleVendorDebug_BlackScreenRecover = 0x0004, +}; + +/* AppleVendor IR Interface (0xff10) */ +enum { + kHIDUsage_AppleVendorIRInterface_IRCommand = 0x0001, + kHIDUsage_AppleVendorIRInterface_IRTimings = 0x0002, +}; + +/* AppleVendor Multitouch Page (0xff60) */ +enum { + kHIDUsage_AppleVendorMultitouch_PowerOff = 0x0001, + kHIDUsage_AppleVendorMultitouch_DeviceReady = 0x0002, + kHIDUsage_AppleVendorMultitouch_ExternalMessage = 0x0003, + kHIDUsage_AppleVendorMultitouch_WillPowerOn = 0x0004, + kHIDUsage_AppleVendorMultitouch_TouchCancel = 0x0005, + kHIDUsage_AppleVendorMultitouch_RawFrame = 0x0006, +}; + +/* AppleVendor Page Top Case (0x00ff) */ +enum +{ + kHIDUsage_AV_TopCase_KeyboardFn = 0x0003, + kHIDUsage_AV_TopCase_BrightnessUp = 0x0004, + kHIDUsage_AV_TopCase_KeyboardLayoutSwitch = 0x0004, // use in output report on DFR virtual keyboard + kHIDUsage_AV_TopCase_BrightnessDown = 0x0005, + kHIDUsage_AV_TopCase_VideoMirror = 0x0006, + kHIDUsage_AV_TopCase_IlluminationToggle = 0x0007, + kHIDUsage_AV_TopCase_IlluminationUp = 0x0008, + kHIDUsage_AV_TopCase_IlluminationDown = 0x0009, + kHIDUsage_AV_TopCase_ClamshellLatched = 0x000A, + kHIDUsage_AV_TopCase_Reserved_MouseData = 0x00C0 +}; + +/* AppleVendor DFR (0xff11) */ +enum { + kHIDUsage_AppleVendorDFR_TouchTimestamp = 0x0001, + kHIDUsage_AppleVendorDFR_TouchGenerationCount = 0x0002, + kHIDUsage_AppleVendorDFR_EventRoutingData = 0x0003 +}; + +/* AppleVendor DFR Brightness (0xff12) */ +enum { + kHIDUsage_AppleVendorDFRBrightness_DFRBrightnes = 0x0001, /* Application Collection */ + + kHIDUsage_AppleVendorDFRBrightness_Update = 0x0010, + kHIDUsage_AppleVendorDFRBrightness_Absolute = 0x0011, + kHIDUsage_AppleVendorDFRBrightness_Relative = 0x0012, + kHIDUsage_AppleVendorDFRBrightness_RampLength = 0x0013, + + kHIDUsage_AppleVendorDFRBrightness_DimmingStepOptions = 0x0020, + kHIDUsage_AppleVendorDFRBrightness_DimmingStep = 0x0021, + kHIDUsage_AppleVendorDFRBrightness_DimmingStepRampLength = 0x0022, + kHIDUsage_AppleVendorDFRBrightness_DimmingStepFactor = 0x0023, + + kHIDUsage_AppleVendorDFRBrightness_DisplayState = 0x0031, + kHIDUsage_AppleVendorDFRBrightness_DisplaySateRampLength = 0x0032, + + kHIDUsage_AppleVendorDFRBrightness_Version = 0x0040, + kHIDUsage_AppleVendorDFRBrightness_AutoBrightness = 0x0041, + kHIDUsage_AppleVendorDFRBrightness_MinNits = 0x0042, + kHIDUsage_AppleVendorDFRBrightness_MaxNits = 0x0043, + kHIDUsage_AppleVendorDFRBrightness_CurveType = 0x0044, + kHIDUsage_AppleVendorDFRBrightness_CurvePointCount = 0x0045, + kHIDUsage_AppleVendorDFRBrightness_CurveUpdateRampLength = 0x0046, + kHIDUsage_AppleVendorDFRBrightness_CurveIlluminanceCoordinates = 0x0047, + kHIDUsage_AppleVendorDFRBrightness_CurveLuminanceCoordinates = 0x0048, + + kHIDUsage_AppleVendorDFRBrightness_DFRBurninCounterUpdate = 0x0050, + kHIDUsage_AppleVendorDFRBrightness_DFRBurninCounterValue = 0x0051, +}; + +/* AppleVendor Sender ID (0xff13) */ +enum { + /* Transports */ + kHIDUsage_AppleVendorSenderID_IR = 0x0001, + kHIDUsage_AppleVendorSenderID_CEC = 0x0002, + + /* Applications */ + kHIDUsage_AppleVendorSenderID_MediaRemote = 0x0010, +}; +#endif /* _APPLEHIDUSAGETABLES_H */ diff --git a/QualcommWireless/include/IOKit/hid/IOHIDDevice.h b/QualcommWireless/include/IOKit/hid/IOHIDDevice.h new file mode 100644 index 0000000..fcd6710 --- /dev/null +++ b/QualcommWireless/include/IOKit/hid/IOHIDDevice.h @@ -0,0 +1,799 @@ +/* + * + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_HID_IOHIDDEVICE_H +#define _IOKIT_HID_IOHIDDEVICE_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef __MAC_OS_X_VERSION_MIN_REQUIRED +#error "Missing macOS target version" +#endif + +class IOHIDSystem; +class IOHIDPointing; +class IOHIDKeyboard; +class IOHIDConsumer; +class IOHIDElementPrivate; +class IOHIDEventQueue; +class IOHIDInterface; +class IOHIDDeviceShim; +struct IOHIDReportHandler; +class IOHIDAsyncReportQueue; +class IOHIDDeviceElementContainer; + + +/*! @class IOHIDDevice : public IOService + @abstract IOHIDDevice defines a Human Interface Device (HID) object, + which will interact with the HID Manager by publishing static properties + in the registry, and also by reporting HID events through shared memory. + IOHIDDevice is an abstract class that must be subclassed to support a + specific type of HID devices, such as USB HID class devices. +
+ Since most HID devices are expected to be USB devices, IOHIDDevice + uses the USB HID specification to define the format of the report + descriptor, and also reports that are used to communicate with the + hardware via some intervening transport layer. However, there is no + mandate that the transport layer must be restricted to USB. A subclass + may be created to support legacy ADB joysticks, and issue packets on + the ADB bus and translate those packets to USB reports, and vice versa. + IOHIDDevice does not care how those reports are generated or consumed + by the physical device, as long as the reports abide to the USB + specification. */ + +class IOHIDDevice : public IOService +{ + OSDeclareDefaultStructorsWithDispatch ( IOHIDDevice ) + + friend class IOHIDLibUserClient; + friend class IOHIDDeviceShim; + friend class IOHIDInterface; + +private: + OSArray * _elementArray; + UInt32 _dataElementIndex; + IORecursiveLock * _elementLock; + IOHIDReportHandler * _reportHandlers; // unused + IOBufferMemoryDescriptor * _elementValuesDescriptor; // unused + bool _readyForInputReports; + UInt32 _reportCount; + UInt32 _maxInputReportSize; + UInt32 _maxOutputReportSize; + UInt32 _maxFeatureReportSize; + + struct ExpansionData { + OSSet * clientSet; + IOService * seizedClient; + AbsoluteTime eventDeadline; + bool performTickle; + bool performWakeTickle; + OSArray * interfaceNubs; + OSArray * hierarchElements; + OSArray * interfaceElementArrays; + IOHIDAsyncReportQueue * asyncReportQueue; + IOWorkLoop * workLoop; + IOEventSource * eventSource; + IONotifier * deviceNotify; + IOHIDDeviceElementContainer *elementContainer; + }; + /*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData * _reserved; + + void setupResolution(); + + // HID report descriptor parsing support. + + bool linkToParent( const OSArray * array, + UInt32 parentIndex, + UInt32 childIndex ); + + bool createCollectionElements( HIDPreparsedDataRef parseData, + OSArray * array, + UInt32 maxCount ); + + bool createValueElements( HIDPreparsedDataRef parseData, + OSArray * array, + UInt32 hidReportType, + IOHIDElementType elementType, + UInt32 maxCount ); + + bool createButtonElements( HIDPreparsedDataRef parseData, + OSArray * array, + UInt32 hidReportType, + IOHIDElementType elementType, + UInt32 maxCount ); + + bool createReportHandlerElements( HIDPreparsedDataRef parseData); + + bool getReportCountAndSizes( HIDPreparsedDataRef parseData ); + + bool setReportSize( UInt8 reportID, + IOHIDReportType reportType, + UInt32 bits ); + + IOReturn createElementHierarchy( HIDPreparsedDataRef parseData ); + + IOReturn parseReportDescriptor( IOMemoryDescriptor * report, + IOOptionBits options = 0 ); + + IOBufferMemoryDescriptor * createMemoryForElementValues(); + + OSNumber * newPrimaryUsageNumber(UInt32 interfaceIdx) const; + + OSNumber * newPrimaryUsagePageNumber(UInt32 interfaceIdx) const; + + OSArray * newDeviceUsagePairs(OSArray * elements, UInt32 start); + + static bool _publishDeviceNotificationHandler(void * target, + void * refCon, + IOService * newService, + IONotifier * notifier ); + +protected: + +/*! @function free + @abstract Free the IOHIDDevice object. + @discussion Release all resources that were previously allocated, + then call super::free() to propagate the call to our superclass. */ + + virtual void free() APPLE_KEXT_OVERRIDE; + +/*! @function handleOpen + @abstract Handle a client open on the interface. + @discussion This method is called by IOService::open() with the + arbitration lock held, and must return true to accept the client open. + This method will in turn call handleClientOpen() to qualify the client + requesting the open. + @param client The client object that requested the open. + @param options Options passed to IOService::open(). + @param argument Argument passed to IOService::open(). + @result true to accept the client open, false otherwise. */ + + virtual bool handleOpen(IOService * client, + IOOptionBits options, + void * argument) APPLE_KEXT_OVERRIDE; + +/*! @function handleClose + @abstract Handle a client close on the interface. + @discussion This method is called by IOService::close() with the + arbitration lock held. This method will in turn call handleClientClose() + to notify interested subclasses about the client close. If this represents + the last close, then the interface will also close the controller before + this method returns. The controllerWillClose() method will be called before + closing the controller. Subclasses should not override this method. + @param client The client object that requested the close. + @param options Options passed to IOService::close(). */ + + virtual void handleClose(IOService * client, IOOptionBits options) APPLE_KEXT_OVERRIDE; + +/*! @function handleIsOpen + @abstract Query whether a client has an open on the interface. + @discussion This method is always called by IOService with the + arbitration lock held. Subclasses should not override this method. + @result true if the specified client, or any client if none (0) is + specified, presently has an open on this object. */ + + virtual bool handleIsOpen(const IOService * client) const APPLE_KEXT_OVERRIDE; + +/*! @function handleStart + @abstract Prepare the hardware and driver to support I/O operations. + @discussion IOHIDDevice will call this method from start() before + any I/O operations are issued to the concrete subclass. Methods + such as newReportDescriptor() are only called after handleStart() + has returned true. A subclass that overrides this method should + begin its implementation by calling the version in super, and + then check the return value. + @param provider The provider argument passed to start(). + @result True on success, or false otherwise. Returning false will + cause start() to fail and return false. */ + + virtual bool handleStart( IOService * provider ); + +/*! @function handleStop + @abstract Quiesce the hardware and stop the driver. + @discussion IOHIDDevice will call this method from stop() to + signal that the hardware should be quiesced and the driver stopped. + A subclass that overrides this method should end its implementation + by calling the version in super. + @param provider The provider argument passed to stop(). */ + + virtual void handleStop( IOService * provider ); + +/*! @function newUserClient + @abstract Handle a request to create a connection for a non kernel + client. + @discussion Create a new IOUserClient, or a subclass of IOUserClient, + to service a connection to a non kernel client. This implementation + will simply call the implementation in IOService to handle the call. + @param owningTask The mach task requesting the connection. + @param security_id A token representing the access level for the task. + @param type A constant specifying the type of connection to be created. + @param properties A dictionary of additional properties for the connection. + @param handler The IOUserClient object returned. + @result The return from IOService::newUserClient() is returned. */ + + virtual IOReturn newUserClient( task_t owningTask, + void * security_id, + UInt32 type, + OSDictionary * properties, + IOUserClient ** handler ) APPLE_KEXT_OVERRIDE; + IOReturn newUserClientInternal(task_t owningTask, + void * security_id, + OSDictionary * properties, + IOUserClient ** handler ); + +/*! @function publishProperties + @abstract Publish HID properties to the I/O Kit registry. + @discussion Called by the start() method to fetch and publish all + HID properties to the I/O Kit registry. These properties will allow + the HID Manager to identify all HID device(s) in the system, by + iterating through objects that are subclasses of IOHIDDevice, and + then fetch their published property values. The implementation in + IOHIDDevice will call methods to get each individual HID property, + and subclasses will not normally need to override this method. + @param provider The provider argument passed to start(). + @result True to indicate that all properties were discovered and + published to the registry, false otherwise. Returning false will + cause start() to fail and return false. */ + + virtual bool publishProperties( IOService * provider ); + +public: + +/*! @function init + @abstract Initialize an IOHIDDevice object. + @discussion Prime the IOHIDDevice object and prepare it to support + a probe() or a start() call. This implementation will simply call + super::init(). + @param dictionary A dictionary associated with this IOHIDDevice + instance. + @result True on sucess, or false otherwise. */ + + virtual bool init( OSDictionary * dictionary = 0 ) APPLE_KEXT_OVERRIDE; + +/*! @function start + @abstract Start up the driver using the given provider. + @discussion IOHIDDevice will allocate resources, then call handleStart() + before fetching the report descriptor through newReportDescriptor(), and + publishing HID properties to the registry. Before returning true to + indicate success, registerService() is called to trigger client matching. + Subclasses are recommended to override handleStart(). + @param provider The provider that the driver was matched to, and selected + to run with. + @result True on success, or false otherwise. */ + + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + +/*! @function stop + @abstract Called by a provider (during its termination) before detaching + all its clients. + @discussion IOHIDDevice will call handleStop(), then release allocated + resources. Subclasses are recommended to override handleStop(). + @param provider The provider that the driver was started on. */ + + virtual void stop( IOService * provider ) APPLE_KEXT_OVERRIDE; + +/*! @function matchPropertyTable + @abstract Called by the provider during a match + @discussion Compare the properties in the supplied table to this + object's properties. + @param table The property table that this device will match against +*/ + + virtual bool matchPropertyTable(OSDictionary * table, SInt32 * score) APPLE_KEXT_OVERRIDE; + +/*! @function message + @abstract Receives messages delivered from an attached provider. + @discussion Handles the kIOMessageDeviceSignaledWakeup message + from a provider identifying the IOHIDDevice as the wakeup source. + @param type A type defined in IOMessage.h. + @param provider The provider from which the message originates. + @param argument An argument defined by the message type. + @result An IOReturn code defined by the message type. +*/ + + virtual IOReturn message( UInt32 type, IOService * provider, void * argument = 0 ) APPLE_KEXT_OVERRIDE; + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_11_0 + using IOService::setProperty; +/*! @function setProperty + @abstract Synchronized method to add a property to an IOHIDDevice's property table. + @discussion This method will add or replace a property in a registry entry's property table, using the OSDictionary::setObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table. + @param aKey The properties name as an OSSymbol. + @param anObject The property value. + @result true on success or false on a resource failure. */ + + virtual bool setProperty( const OSSymbol * aKey, OSObject * anObject) APPLE_KEXT_OVERRIDE; +#endif + +/*! @function newTransportString + @abstract Returns a string object that describes the transport + layer used by the HID device. + @result A string object. The caller must decrement the retain count + on the object returned. */ + + virtual OSString * newTransportString() const; + +/*! @function newManufacturerString + @abstract Returns a string object that describes the manufacturer + of the HID device. + @result A string object. The caller must decrement the retain count + on the object returned. */ + + virtual OSString * newManufacturerString() const; + +/*! @function newProductString + @abstract Returns a string object that describes the product + of the HID device. + @result A string object. The caller must decrement the retain count + on the object returned. */ + + virtual OSString * newProductString() const; + +/*! @function newVendorIDNumber + @abstract Returns a number object that describes the vendor ID + of the HID device. + @result A number object. The caller must decrement the retain count + on the object returned. */ + + virtual OSNumber * newVendorIDNumber() const; + +/*! @function newProductIDNumber + @abstract Returns a number object that describes the product ID + of the HID device. + @result A number object. The caller must decrement the retain count + on the object returned. */ + + virtual OSNumber * newProductIDNumber() const; + +/*! @function newVersionNumber + @abstract Returns a number object that describes the version number + of the HID device. + @result A number object. The caller must decrement the retain count + on the object returned. */ + + virtual OSNumber * newVersionNumber() const; + +// *** THIS HAS BEEN DEPRECATED. PLEASE USE newSerialNumberString *** +/*! @function newSerialNumber + @abstract THIS HAS BEEN DEPRECATED. PLEASE USE newSerialNumberString. + @result A number object. The caller must decrement the retain count + on the object returned. */ + + virtual OSNumber * newSerialNumber() const; + +/*! @function newPrimaryUsageNumber + @abstract Returns a number object that describes the primary usage + of the HID device. + @result A number object. The caller must decrement the retain count + on the object returned. */ + + virtual OSNumber * newPrimaryUsageNumber() const; + +/*! @function newPrimaryUsagePageNumber + @abstract Returns a number object that describes the primary usage + page of the HID device. + @result A number object. The caller must decrement the retain count + on the object returned. */ + + virtual OSNumber * newPrimaryUsagePageNumber() const; + +/*! @function newReportDescriptor + @abstract Create and return a new memory descriptor that describes the + report descriptor for the HID device. + @discussion A subclass must override this pure virtual function, and + return a memory descriptor that describes the HID report descriptor as + defined by the USB Device Class Definition for Human Interface Devices + Version 1.1 specification. + @param descriptor Pointer to the memory descriptor returned. This + memory descriptor will be released by the caller. + @result kIOReturnSuccess on success, or an error return otherwise. */ + + virtual IOReturn newReportDescriptor( + IOMemoryDescriptor ** descriptor ) const = 0; + +/*! @function handleReport + @abstract Handle an asynchronous report received from the HID device. + @param report A memory descriptor that describes the report. + @param reportType The type of report. + @param options Options to specify the request. No options are + currently defined, and the default value is 0. + @result kIOReturnSuccess on success, or an error return otherwise. */ + + virtual IOReturn handleReport( + IOMemoryDescriptor * report, + IOHIDReportType reportType = kIOHIDReportTypeInput, + IOOptionBits options = 0 ); + +/*! @function getReport + @abstract Get a report from the HID device. + @discussion A completion parameter may be added in the future. + @param report A memory descriptor that describes the memory to store + the report read from the HID device. + @param reportType The report type. + @param options The lower 8 bits will represent the Report ID. The + other 24 bits are options to specify the request. + @result kIOReturnSuccess on success, or an error return otherwise. */ + + virtual IOReturn getReport( IOMemoryDescriptor * report, + IOHIDReportType reportType, + IOOptionBits options ); + +/*! @function setReport + @abstract Send a report to the HID device. + @discussion A completion parameter may be added in the future. + @param report A memory descriptor that describes the report to send + to the HID device. + @param reportType The report type. + @param options The lower 8 bits will represent the Report ID. The + other 24 bits are options to specify the request. + @result kIOReturnSuccess on success, or an error return otherwise. */ + + virtual IOReturn setReport( IOMemoryDescriptor * report, + IOHIDReportType reportType, + IOOptionBits options = 0 ); + +/*! @function getMemoryWithCurrentElementValues + @abstract Get a reference to a memory descriptor that describes the + memory block containing the current HID element values. + @discussion Each HID element that can contribute to an input, output, + or feature report, is assigned an area of memory from a common memory + block allocated by IOHIDDevice. Each element will use its assigned + memory area to store its current value, defined by an IOHIDElementValue + structure. The memory described by the memory descriptor may be mapped + to user space to allow the HID Manager to poll the current element + value without the cost of a user-kernel transition. Subclasses should + not override this method. + @result A reference to a memory descriptor that describes the current + element values, or 0 to indicate a resource shortage. */ + + virtual IOMemoryDescriptor * getMemoryWithCurrentElementValues() const; + +/*! @function registerElement + @abstract A registration function called by a HID element to register + itself, and also to obtain an unique cookie identifier + (unique per device, not unique system-wide). + @discussion An internal data type, an IOHIDElementPrivate, is created to + represent each HID element discovered by parsing the HID report + descriptor. Each element created will call this method to register + itself with its owner (IOHIDDevice), and also to obtain an element + cookie that is used by HID Manager to specify and identify the element. + Subclasses should not override this method. + @param element The element that is requesting registration with its + owner. + @param cookie Pointer to the returned cookie assigned to this element. + @result True on success, or false otherwise. */ + + virtual bool registerElement( IOHIDElementPrivate * element, + IOHIDElementCookie * cookie ); + +/*! @function startEventDelivery + @abstract Start delivering events from a HID element to the event + queue specified. + @discussion Clients of IOHIDDevice may create an IOHIDEventQueue, and + then call this method to register for delivery of events generated by + one or more HID elements to that event queue. Subclasses should not + override this method. + @param queue The event queue that is interested in receiving events + generated by the HID element specified. The retain count on the queue + will be incremented by one. + @param cookie The cookie for a HID element published by the HID device. + @param options Options to specify the request. No options are currently + defined, and the default value is zero. + @result kIOReturnSuccess on success, or kIOReturnBadArgument if the + queue or the cookie argument specified is invalid, or kIOReturnNoMemory + if a resource shortage was encountered. */ + + virtual IOReturn startEventDelivery( IOHIDEventQueue * queue, + IOHIDElementCookie cookie, + IOOptionBits options = 0 ); + +/*! @function stopEventDelivery + @abstract Stop delivering events from one or more HID elements to the + event queue specified. + @discussion Clients that called startEventDelivery() must eventually + call this method to stop event delivery to its queue from one or more + HID elements. + @param queue The event queue that no longer wishes to receive events + generated by the HID element specified. + @param cookie The cookie for a HID element published by the HID device. + The default value of zero indicates that the queue should be removed from + the event dispatch list of all HID elements published by the HID device. + Subclasses should not override this method. + @result kIOReturnSuccess if the queue was removed from the event dispatch + list for one or more HID elements, or kIOReturnBadArgument if the queue + or the cookie argument specified is invalid, or kIOReturnNotFound if the + queue was not found. */ + + virtual IOReturn stopEventDelivery( IOHIDEventQueue * queue, + IOHIDElementCookie cookie = 0 ); + +/*! @function checkEventDelivery + @abstract Check whether events from a HID element will be delivered to + the event queue specified. + @param queue The event queue. + @param cookie The cookie for a HID element published by the HID device. + @param isActive Pointer to the return value that is set to true if events + generated by the HID element will be delivered to the queue, or false + otherwise. This return value is set only if kIOReturnSuccess is + returned. + @result kIOReturnSuccess on success, or kIOReturnBadArgument if one or + more of the arguments provided are invalid. */ + + virtual IOReturn checkEventDelivery( IOHIDEventQueue * queue, + IOHIDElementCookie cookie, + bool * isActive ); + +/*! @function updateElementValues + @abstract Updates element values from a HID device via getReport. + @discussion A completion parameter may be added in the future. + @param cookies A list of element cookies who's values need to be + set on the device. + @param cookieCount The number of element cookies. + @result kIOReturnSuccess on success, or an error return otherwise. */ + OSMetaClassDeclareReservedUsed(IOHIDDevice, 0); + virtual IOReturn updateElementValues(IOHIDElementCookie * cookies, UInt32 cookieCount = 1); + +/*! @function postElementValues + @abstract Posts element values to a HID device via setReport. + @discussion A completion parameter may be added in the future. + @param cookies A list of element cookies who's values need to be + set on the device. + @param cookieCount The number of element cookies. + @result kIOReturnSuccess on success, or an error return otherwise. */ + OSMetaClassDeclareReservedUsed(IOHIDDevice, 1); + virtual IOReturn postElementValues(IOHIDElementCookie * cookies, UInt32 cookieCount = 1); + +/*! @function newSerialNumberString + @abstract Returns a string object that describes the serial number + of the HID device. + @result A number object. The caller must decrement the retain count + on the object returned. */ + OSMetaClassDeclareReservedUsed(IOHIDDevice, 2); + virtual OSString * newSerialNumberString() const; + +/*! @function newLocationIDNumber + @abstract Returns a number object that describes the location ID + of the HID device. + @result A number object. The caller must decrement the retain count + on the object returned. */ + OSMetaClassDeclareReservedUsed(IOHIDDevice, 3); + virtual OSNumber * newLocationIDNumber() const; + +/*! @function getReport + @abstract Get a report from the HID device. + @discussion A completion parameter may be added in the future. + @param report A memory descriptor that describes the memory to store + the report read from the HID device. + @param reportType The report type. + @param options The lower 8 bits will represent the Report ID. The + other 24 bits are options to specify the request. + @param completionTimeout Specifies an amount of time (in ms) after which + the command will be aborted if the entire command has not been completed. + @param completion Function to call when request completes. If omitted then + getReport() executes synchronously, blocking until the request is complete. + @result kIOReturnSuccess on success, or an error return otherwise. */ + + OSMetaClassDeclareReservedUsed(IOHIDDevice, 4); + virtual IOReturn getReport( IOMemoryDescriptor * report, + IOHIDReportType reportType, + IOOptionBits options, + UInt32 completionTimeout, + IOHIDCompletion * completion = 0); + +/*! @function setReport + @abstract Send a report to the HID device. + @discussion A completion parameter may be added in the future. + @param report A memory descriptor that describes the report to send + to the HID device. + @param reportType The report type. + @param options The lower 8 bits will represent the Report ID. The + other 24 bits are options to specify the request. + @param completionTimeout Specifies an amount of time (in ms) after which + the command will be aborted if the entire command has not been completed. + @param completion Function to call when request completes. If omitted then + setReport() executes synchronously, blocking until the request is complete. + @result kIOReturnSuccess on success, or an error return otherwise. */ + + OSMetaClassDeclareReservedUsed(IOHIDDevice, 5); + virtual IOReturn setReport( IOMemoryDescriptor * report, + IOHIDReportType reportType, + IOOptionBits options, + UInt32 completionTimeout, + IOHIDCompletion * completion = 0); + +/*! @function newVendorIDSourceNumber + @abstract Returns a number object that describes the vendor ID + source of the HID device. + @result A number object. The caller must decrement the retain count + on the object returned. */ + OSMetaClassDeclareReservedUsed(IOHIDDevice, 6); + virtual OSNumber * newVendorIDSourceNumber() const; + +/*! @function newCountryCodeNumber + @abstract Returns a number object that describes the country code + of the HID device. + @result A number object. The caller must decrement the retain count + on the object returned. */ + OSMetaClassDeclareReservedUsed(IOHIDDevice, 7); + virtual OSNumber * newCountryCodeNumber() const; + + +/*! @function handleReportWithTime + @abstract Handle an asynchronous report received from the HID device. + @param timeStamp The timestamp of report. + @param report A memory descriptor that describes the report. + @param reportType The type of report. Currently, only + kIOHIDReportTypeInput report type is handled. + @param options Options to specify the request. No options are + currently defined, and the default value is 0. + @result kIOReturnSuccess on success, or an error return otherwise. */ + + OSMetaClassDeclareReservedUsed(IOHIDDevice, 8); + virtual IOReturn handleReportWithTime( + AbsoluteTime timeStamp, + IOMemoryDescriptor * report, + IOHIDReportType reportType = kIOHIDReportTypeInput, + IOOptionBits options = 0); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_5 + +/*! @function newReportInterval + @abstract Returns a number object that describes the actual polling + interval of the HID device in microseconds. + @result A number object. The caller must decrement the retain count + on the object returned. */ + OSMetaClassDeclareReservedUsed(IOHIDDevice, 9); + virtual OSNumber * newReportIntervalNumber() const; + +#else + + OSMetaClassDeclareReservedUnused(IOHIDDevice, 9); + +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_8 + + OSMetaClassDeclareReservedUsed(IOHIDDevice, 10); + virtual IOReturn handleReportWithTimeAsync( + AbsoluteTime timeStamp, + IOMemoryDescriptor * report, + IOHIDReportType reportType, + IOOptionBits options, + UInt32 completionTimeout, + IOHIDCompletion * completion); + +#else + + OSMetaClassDeclareReservedUnused(IOHIDDevice, 10); + +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_9 + +/*! @function newDeviceUsagePairs + @abstract Returns an array of usage dictionaries. IOHIDDevice creates + create this from the actual report descriptor, and that should be the base + for any subclass override. + @result A number object. The caller must decrement the retain count + on the object returned. */ + OSMetaClassDeclareReservedUsed(IOHIDDevice, 11); + virtual OSArray * newDeviceUsagePairs(); + +#else + + OSMetaClassDeclareReservedUnused(IOHIDDevice, 11); + +#endif + +protected: + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + + /*! @function createInterface + @abstract Creates an IOHIDInterface nub for the device to attach to. + @discussion Will create multiple interfaces, if applicable and support is + enabled. + @result true on success, false otherwise. */ + OSMetaClassDeclareReservedUsed(IOHIDDevice, 12); + virtual bool createInterface(IOOptionBits options = 0); + + /*! @function destroyInterface + @abstract Destroys the IOHIDInterface nub attached to the device. + @discussion This method will destroy all interfaces if multiple were + created. */ + OSMetaClassDeclareReservedUsed(IOHIDDevice, 13); + virtual void destroyInterface(IOOptionBits options = 0); + +#else + + OSMetaClassDeclareReservedUnused(IOHIDDevice, 12); + OSMetaClassDeclareReservedUnused(IOHIDDevice, 13); + +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + + /*! @function conformsTo + @abstract Checks if a device conforms to a certain usage page/usage. + @discussion Iterates through the usages returned from newDeviceUsagePairs + function and checks for matching usages. + @result true if the device conforms to the specified usage page/usage. */ + OSMetaClassDeclareReservedUsed(IOHIDDevice, 14); + virtual bool conformsTo(UInt32 usagePage, UInt32 usage); + + /*! @function completeReport + @abstract complete reports for DriverKit drivers + @discussion This method only used by DriverKit driver + created. */ + OSMetaClassDeclareReservedUsed(IOHIDDevice, 15); + virtual void completeReport(OSAction * action, IOReturn status, uint32_t actualByteCount); + +#else + + OSMetaClassDeclareReservedUnused(IOHIDDevice, 14); + OSMetaClassDeclareReservedUnused(IOHIDDevice, 15); + +#endif + + OSMetaClassDeclareReservedUnused(IOHIDDevice, 16); + OSMetaClassDeclareReservedUnused(IOHIDDevice, 17); + OSMetaClassDeclareReservedUnused(IOHIDDevice, 18); + OSMetaClassDeclareReservedUnused(IOHIDDevice, 19); + OSMetaClassDeclareReservedUnused(IOHIDDevice, 20); + OSMetaClassDeclareReservedUnused(IOHIDDevice, 21); + OSMetaClassDeclareReservedUnused(IOHIDDevice, 22); + OSMetaClassDeclareReservedUnused(IOHIDDevice, 23); + OSMetaClassDeclareReservedUnused(IOHIDDevice, 24); + OSMetaClassDeclareReservedUnused(IOHIDDevice, 25); + OSMetaClassDeclareReservedUnused(IOHIDDevice, 26); + OSMetaClassDeclareReservedUnused(IOHIDDevice, 27); + OSMetaClassDeclareReservedUnused(IOHIDDevice, 28); + OSMetaClassDeclareReservedUnused(IOHIDDevice, 29); + OSMetaClassDeclareReservedUnused(IOHIDDevice, 30); + OSMetaClassDeclareReservedUnused(IOHIDDevice, 31); + OSMetaClassDeclareReservedUnused(IOHIDDevice, 32); + OSMetaClassDeclareReservedUnused(IOHIDDevice, 33); + OSMetaClassDeclareReservedUnused(IOHIDDevice, 34); + OSMetaClassDeclareReservedUnused(IOHIDDevice, 35); + OSMetaClassDeclareReservedUnused(IOHIDDevice, 36); + OSMetaClassDeclareReservedUnused(IOHIDDevice, 37); + OSMetaClassDeclareReservedUnused(IOHIDDevice, 38); + OSMetaClassDeclareReservedUnused(IOHIDDevice, 39); + OSMetaClassDeclareReservedUnused(IOHIDDevice, 40); + +}; + +#endif /* !_IOKIT_HID_IOHIDDEVICE_H */ diff --git a/QualcommWireless/include/IOKit/hid/IOHIDDeviceKeys.h b/QualcommWireless/include/IOKit/hid/IOHIDDeviceKeys.h new file mode 100644 index 0000000..77030c4 --- /dev/null +++ b/QualcommWireless/include/IOKit/hid/IOHIDDeviceKeys.h @@ -0,0 +1,228 @@ +/* + * + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 2019 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef IOHIDDeviceKeys_h +#define IOHIDDeviceKeys_h + +/*! + * @define kIOHIDTransportKey + * + * @abstract + * Number property that describes the transport of the device. + */ +#define kIOHIDTransportKey "Transport" + +/*! + * @define kIOHIDVendorIDKey + * + * @abstract + * Number property that describes the vendor ID of the device. + */ +#define kIOHIDVendorIDKey "VendorID" + +/*! + * @define kIOHIDProductIDKey + * + * @abstract + * Number property that describes the product ID of the device. + */ +#define kIOHIDProductIDKey "ProductID" + +/*! + * @define kIOHIDVersionNumberKey + * + * @abstract + * Number property that describes the version number of the device. + */ +#define kIOHIDVersionNumberKey "VersionNumber" + +/*! + * @define kIOHIDManufacturerKey + * + * @abstract + * String property that describes the manufacturer of the device. + */ +#define kIOHIDManufacturerKey "Manufacturer" + +/*! + * @define kIOHIDProductKey + * + * @abstract + * String property that describes the product of the device. + */ +#define kIOHIDProductKey "Product" + +/*! + * @define kIOHIDSerialNumberKey + * + * @abstract + * String property that describes the serial number of the device. + */ +#define kIOHIDSerialNumberKey "SerialNumber" + +/*! + * @define kIOHIDCountryCodeKey + * + * @abstract + * Number property that describes the country code of the device. + */ +#define kIOHIDCountryCodeKey "CountryCode" + +/*! + * @define kIOHIDLocationIDKey + * + * @abstract + * Number property that describes the location ID of the device. + */ +#define kIOHIDLocationIDKey "LocationID" + +/*! + * @define kIOHIDDeviceUsagePairsKey + * + * @abstract + * Array property that describes the top level usages of the device. The array + * will have dictionaries of usage pages/usages of each top level collection + * that exists on the device. + */ +#define kIOHIDDeviceUsagePairsKey "DeviceUsagePairs" + +/*! + * @define kIOHIDDeviceUsageKey + * + * @abstract + * Number property used in the device usage pairs array above. Describes a + * usage of the device. + */ +#define kIOHIDDeviceUsageKey "DeviceUsage" + +/*! + * @define kIOHIDDeviceUsagePageKey + * + * @abstract + * Number property used in the device usage pairs array above. Describes a + * usage page of the device. + */ +#define kIOHIDDeviceUsagePageKey "DeviceUsagePage" + +/*! + * @define kIOHIDPrimaryUsageKey + * + * @abstract + * Number property that describes the primary usage page of the device. + */ +#define kIOHIDPrimaryUsageKey "PrimaryUsage" + +/*! + * @define kIOHIDPrimaryUsagePageKey + * + * @abstract + * Number property that describes the primary usage of the device. + */ +#define kIOHIDPrimaryUsagePageKey "PrimaryUsagePage" + +/*! + * @define kIOHIDMaxInputReportSizeKey + * + * @abstract + * Number property that describes the max input report size of the device. This + * is derived from the report descriptor data provided in the + * kIOHIDReportDescriptorKey key. + */ +#define kIOHIDMaxInputReportSizeKey "MaxInputReportSize" + +/*! + * @define kIOHIDMaxOutputReportSizeKey + * + * @abstract + * Number property that describes the max output report size of the device. This + * is derived from the report descriptor data provided in the + * kIOHIDReportDescriptorKey key. + */ +#define kIOHIDMaxOutputReportSizeKey "MaxOutputReportSize" + +/*! + * @define kIOHIDMaxFeatureReportSizeKey + * + * @abstract + * Number property that describes the max feature report size of the device. + * This is derived from the report descriptor data provided in the + * kIOHIDReportDescriptorKey key. + */ +#define kIOHIDMaxFeatureReportSizeKey "MaxFeatureReportSize" + +/*! + * @define kIOHIDReportIntervalKey + * + * @abstract + * Number property set on the device from a client that describes the interval in us + * at which the client wishes to receive reports. It is up to the device to + * determine how to handle this key, if it chooses to do so. + */ +#define kIOHIDReportIntervalKey "ReportInterval" + +/*! + * @define kIOHIDBatchIntervalKey + * + * @abstract + * Number property set on the device from a client that describes the interval + * at which the client wishes to receive batched reports. It is up to the device + * to determine how to handle this key, if it chooses to do so. + */ +#define kIOHIDBatchIntervalKey "BatchInterval" + +/*! + * @define kIOHIDRequestTimeoutKey + * + * @abstract + * Number property that describes the request timeout in us for get/setReport calls. + * It is up to the device to determine how to handle this key, if it chooses to + * do so. + */ +#define kIOHIDRequestTimeoutKey "RequestTimeout" + +/*! + * @define kIOHIDReportDescriptorKey + * + * @abstract + * Data property that describes the report descriptor of the device. + */ +#define kIOHIDReportDescriptorKey "ReportDescriptor" + +/*! + * @define kIOHIDBuiltInKey + * + * @abstract + * Number property that describes if the device is built in. + */ +#define kIOHIDBuiltInKey "Built-In" + +/*! + * @define kIOHIDPhysicalDeviceUniqueIDKey + * + * @abstract + * String property that describes a unique identifier of the device. + */ +#define kIOHIDPhysicalDeviceUniqueIDKey "PhysicalDeviceUniqueID" + +#endif /* IOHIDDeviceKeys_h */ diff --git a/QualcommWireless/include/IOKit/hid/IOHIDDeviceTypes.h b/QualcommWireless/include/IOKit/hid/IOHIDDeviceTypes.h new file mode 100644 index 0000000..73cc226 --- /dev/null +++ b/QualcommWireless/include/IOKit/hid/IOHIDDeviceTypes.h @@ -0,0 +1,294 @@ +/* + * + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 2019 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef IOHIDDeviceTypes_h +#define IOHIDDeviceTypes_h + +#include + +#if TARGET_OS_DRIVERKIT +#include +#include +#else +#include +#include +#endif // TARGET_OS_DRIVERKIT + +/*! + * @typedef IOHIDReportType + * + * @abstract + * Describes different type of HID reports. + */ +enum IOHIDReportType { + kIOHIDReportTypeInput = 0, + kIOHIDReportTypeOutput, + kIOHIDReportTypeFeature, + kIOHIDReportTypeCount +}; +typedef enum IOHIDReportType IOHIDReportType; + +/*! + * @typedef IOHIDElementCommitDirection + * + * @abstract + * Commit direction passed in to the commit() function of an IOHIDElement. + * + * @field kIOHIDElementCommitDirectionIn + * Passing in kIOHIDElementCommitDirectionIn will issue a getReport call to the + * device, and the element will be updated with the value retrieved by the + * device. The value can be accessed via the getValue() or getDataValue() + * functions. + * + * @field kIOHIDElementCommitDirectionOut + * Passing in kIOHIDElementCommitDirectionOut will issue a setReport call to the + * device. Before issuing this call, the desired value should be set on the + * element with the setValue() or setDataValue() functions. + */ +typedef enum { + kIOHIDElementCommitDirectionIn, + kIOHIDElementCommitDirectionOut +} IOHIDElementCommitDirection; + +/*! + * @typedef IOHIDElementCookie + * + * @abstract + * Abstract data type used as a unique identifier for an element. + */ +#ifdef __LP64__ +typedef uint32_t IOHIDElementCookie; +#else +typedef void * IOHIDElementCookie; +#endif + +/*! + * @typedef IOHIDElementType + * + * @abstract + * Describes different types of HID elements. + * + * @discussion + * Used by the IOHIDFamily to identify the type of element processed. + * Represented by the key kIOHIDElementTypeKey in the dictionary describing the + * element. + * + * @field kIOHIDElementTypeInput_Misc + * Misc input data field or varying size. + * + * @field kIOHIDElementTypeInput_Button + * One bit input data field. + * + * @field kIOHIDElementTypeInput_Axis + * Input data field used to represent an axis. + * + * @field kIOHIDElementTypeInput_ScanCodes + * Input data field used to represent a scan code or usage selector. + * + * @field kIOHIDElementTypeInput_NULL + * Input data field used to represent the end of an input report when receiving + * input elements. + * + * @field kIOHIDElementTypeOutput + * Used to represent an output data field in a report. + * + * @field kIOHIDElementTypeFeature + * Describes input and output elements not intended for consumption by the end + * user. + * + * @field kIOHIDElementTypeCollection + * Element used to identify a relationship between two or more elements. + */ +enum IOHIDElementType { + kIOHIDElementTypeInput_Misc = 1, + kIOHIDElementTypeInput_Button = 2, + kIOHIDElementTypeInput_Axis = 3, + kIOHIDElementTypeInput_ScanCodes = 4, + kIOHIDElementTypeInput_NULL = 5, + kIOHIDElementTypeOutput = 129, + kIOHIDElementTypeFeature = 257, + kIOHIDElementTypeCollection = 513 +}; +typedef enum IOHIDElementType IOHIDElementType; + +enum { + kIOHIDElementFlagsConstantMask = 0x0001, + kIOHIDElementFlagsVariableMask = 0x0002, + kIOHIDElementFlagsRelativeMask = 0x0004, + kIOHIDElementFlagsWrapMask = 0x0008, + kIOHIDElementFlagsNonLinearMask = 0x0010, + kIOHIDElementFlagsNoPreferredMask = 0x0020, + kIOHIDElementFlagsNullStateMask = 0x0040, + kIOHIDElementFlagsVolativeMask = 0x0080, + kIOHIDElementFlagsBufferedByteMask = 0x0100 +}; +typedef uint32_t IOHIDElementFlags; + +/*! + * @typedef IOHIDElementCollectionType + * + * @abstract + * Describes different types of HID collections. + * + * @discussion + * Collections identify a relationship between two or more elements. + * + * @field kIOHIDElementCollectionTypePhysical + * Used for a set of data items that represent data points collected at one + * geometric point. + * + * @field kIOHIDElementCollectionTypeApplication + * Identifies item groups serving different purposes in a single device. + * + * @field kIOHIDElementCollectionTypeLogical + * Used when a set of data items form a composite data structure. + * + * @field kIOHIDElementCollectionTypeReport + * Wraps all the fields in a report. + * + * @field kIOHIDElementCollectionTypeNamedArray + * Contains an array of selector usages. + * + * @field kIOHIDElementCollectionTypeUsageSwitch + * Modifies the meaning of the usage it contains. + * + * @field kIOHIDElementCollectionTypeUsageModifier + * Modifies the meaning of the usage attached to the encompassing collection. + */ +enum IOHIDElementCollectionType{ + kIOHIDElementCollectionTypePhysical = 0x00, + kIOHIDElementCollectionTypeApplication, + kIOHIDElementCollectionTypeLogical, + kIOHIDElementCollectionTypeReport, + kIOHIDElementCollectionTypeNamedArray, + kIOHIDElementCollectionTypeUsageSwitch, + kIOHIDElementCollectionTypeUsageModifier +}; +typedef enum IOHIDElementCollectionType IOHIDElementCollectionType; + +/*! + * @typedef IOHIDValueScaleType + * + * @abstract + * Describes different types of scaling that can be performed on element values. + * + * @field kIOHIDValueScaleTypeCalibrated + * Type for value that is scaled with respect to the calibration properties. + * + * @field kIOHIDValueScaleTypePhysical + * Type for value that is scaled with respect to the physical min and physical + * max of the element. + * + * @field kIOHIDValueScaleTypeExponent + * Type for value that is scaled with respect to the element's unit exponent. + */ +enum { + kIOHIDValueScaleTypeCalibrated, + kIOHIDValueScaleTypePhysical, + kIOHIDValueScaleTypeExponent +}; +typedef uint32_t IOHIDValueScaleType; + +/*! + * @typedef IOHIDValueOptions + * + * @abstract + * Describes options for gathering element values. + * + * @field kIOHIDValueOptionsFlagRelativeSimple + * Compares against previous value + */ +enum { + kIOHIDValueOptionsFlagRelativeSimple = (1<<0), + kIOHIDValueOptionsFlagPrevious = (1<<1), + kIOHIDValueOptionsUpdateElementValues = (1<<2) +}; +typedef uint32_t IOHIDValueOptions; + +/*! + * @typedef IOHIDCompletionAction + * + * @abstract Function called when set/get report completes + * + * @param target + * The target specified in the IOHIDCompletion struct. + * + * @param parameter + * The parameter specified in the IOHIDCompletion struct. + * + * @param status + * Completion status + */ +typedef void (*IOHIDCompletionAction)(void *target, + void *parameter, + IOReturn status, + uint32_t bufferSizeRemaining); + +/*! + * @typedef IOHIDCompletion + * + * @abstract + * Struct spefifying action to perform when set/get report completes. + * + * @var target + * The target to pass to the action function. + * + * @var action + * The function to call. + * + * @var parameter + * The parameter to pass to the action function. + */ +typedef struct IOHIDCompletion { + void *target; + IOHIDCompletionAction action; + void *parameter; +} IOHIDCompletion; + +/*! + * @abstract + * Option bits for IOHIDDevice::handleReport, IOHIDDevice::getReport, and + * IOHIDDevice::setReport + * + * @field kIOHIDReportOptionNotInterrupt + * Tells method that the report passed was not interrupt driven. + */ +enum +{ + kIOHIDReportOptionNotInterrupt = 0x100, + kIOHIDReportOptionVariableSize = 0x200 +}; + +/*! + * @typedef HIDReportCommandType + * + * @abstract + * Type of the report command for DriverKit driver + */ +typedef enum { + kIOHIDReportCommandSetReport, + kIOHIDReportCommandGetReport +} HIDReportCommandType; + +#endif /* IOHIDDeviceTypes_h */ diff --git a/QualcommWireless/include/IOKit/hid/IOHIDElement.h b/QualcommWireless/include/IOKit/hid/IOHIDElement.h new file mode 100644 index 0000000..fa3ecec --- /dev/null +++ b/QualcommWireless/include/IOKit/hid/IOHIDElement.h @@ -0,0 +1,121 @@ +/* + * + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_HID_IOHIDELEMENT_H +#define _IOKIT_HID_IOHIDELEMENT_H + +#include +#include +#include + +//=========================================================================== +// An object that describes a single HID element. + +class IOHIDElement : public OSCollection +{ + OSDeclareAbstractStructors( IOHIDElement ) + + /* Internal use only */ + struct ExpansionData { + }; + ExpansionData * _reserved; + + +public: + + virtual IOHIDElementCookie getCookie() = 0; + virtual IOHIDElement * getParentElement() = 0; + virtual OSArray * getChildElements() = 0; + virtual IOHIDElementType getType() = 0; + virtual IOHIDElementCollectionType getCollectionType() = 0; + virtual UInt32 getUsagePage() = 0; + virtual UInt32 getUsage() = 0; + virtual UInt32 getLogicalMin() = 0; + virtual UInt32 getLogicalMax() = 0; + virtual UInt32 getPhysicalMin() = 0; + virtual UInt32 getPhysicalMax() = 0; + virtual UInt32 getUnitExponent() = 0; + virtual UInt32 getUnit() = 0; + virtual UInt32 getReportSize() = 0; + virtual UInt32 getReportCount() = 0; + virtual UInt32 getReportID() = 0; + virtual UInt32 getFlags() = 0; + virtual AbsoluteTime getTimeStamp() = 0; + virtual UInt32 getValue() = 0; + virtual OSData * getDataValue() = 0; + virtual void setValue(UInt32 value) = 0; + virtual void setDataValue(OSData * value) = 0; + + OSMetaClassDeclareReservedUsed(IOHIDElement, 0); + virtual bool conformsTo(UInt32 usagePage, UInt32 usage=0) = 0; + + OSMetaClassDeclareReservedUsed(IOHIDElement, 1); + virtual void setCalibration(UInt32 min=0, UInt32 max=0, UInt32 saturationMin=0, UInt32 saturationMax=0, UInt32 deadZoneMin=0, UInt32 deadZoneMax=0, IOFixed granularity=0) = 0; + + OSMetaClassDeclareReservedUsed(IOHIDElement, 2); + virtual UInt32 getScaledValue(IOHIDValueScaleType type=kIOHIDValueScaleTypePhysical) = 0; + + OSMetaClassDeclareReservedUsed(IOHIDElement, 3); + virtual IOFixed getScaledFixedValue(IOHIDValueScaleType type=kIOHIDValueScaleTypePhysical) = 0; + + OSMetaClassDeclareReservedUsed(IOHIDElement, 4); + virtual UInt32 getValue(IOOptionBits options) = 0; + + OSMetaClassDeclareReservedUsed(IOHIDElement, 5); + virtual OSData * getDataValue(IOOptionBits options) = 0; + + OSMetaClassDeclareReservedUsed(IOHIDElement, 6); + virtual boolean_t isVariableSize() = 0; + + OSMetaClassDeclareReservedUsed(IOHIDElement, 7); + virtual IOFixed getScaledFixedValue(IOHIDValueScaleType type, IOOptionBits options) = 0; + + OSMetaClassDeclareReservedUnused(IOHIDElement, 8); + OSMetaClassDeclareReservedUnused(IOHIDElement, 9); + OSMetaClassDeclareReservedUnused(IOHIDElement, 10); + OSMetaClassDeclareReservedUnused(IOHIDElement, 11); + OSMetaClassDeclareReservedUnused(IOHIDElement, 12); + OSMetaClassDeclareReservedUnused(IOHIDElement, 13); + OSMetaClassDeclareReservedUnused(IOHIDElement, 14); + OSMetaClassDeclareReservedUnused(IOHIDElement, 15); + OSMetaClassDeclareReservedUnused(IOHIDElement, 16); + OSMetaClassDeclareReservedUnused(IOHIDElement, 17); + OSMetaClassDeclareReservedUnused(IOHIDElement, 18); + OSMetaClassDeclareReservedUnused(IOHIDElement, 19); + OSMetaClassDeclareReservedUnused(IOHIDElement, 20); + OSMetaClassDeclareReservedUnused(IOHIDElement, 21); + OSMetaClassDeclareReservedUnused(IOHIDElement, 22); + OSMetaClassDeclareReservedUnused(IOHIDElement, 23); + OSMetaClassDeclareReservedUnused(IOHIDElement, 24); + OSMetaClassDeclareReservedUnused(IOHIDElement, 25); + OSMetaClassDeclareReservedUnused(IOHIDElement, 26); + OSMetaClassDeclareReservedUnused(IOHIDElement, 27); + OSMetaClassDeclareReservedUnused(IOHIDElement, 28); + OSMetaClassDeclareReservedUnused(IOHIDElement, 29); + OSMetaClassDeclareReservedUnused(IOHIDElement, 30); + OSMetaClassDeclareReservedUnused(IOHIDElement, 31); + +}; + +#endif /* !_IOKIT_HID_IOHIDELEMENT_H */ diff --git a/QualcommWireless/include/IOKit/hid/IOHIDEvent.h b/QualcommWireless/include/IOKit/hid/IOHIDEvent.h new file mode 100644 index 0000000..45aefe8 --- /dev/null +++ b/QualcommWireless/include/IOKit/hid/IOHIDEvent.h @@ -0,0 +1,464 @@ +/* + * + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +#ifndef _IOKIT_IOHIDEVENT_H +#define _IOKIT_IOHIDEVENT_H + +#include +#include +#if KERNEL +#include +#include +#include +#endif /*KERNEL*/ +#include +#include + +#if TARGET_OS_OSX +#include +#endif /*TARGET_OS_OSX*/ + +#ifndef __MAC_OS_X_VERSION_MIN_REQUIRED +#error "Missing macOS target version" +#endif + +#define ALIGNED_DATA_SIZE(data_size,align_size) ((((data_size - 1) / align_size) + 1) * align_size) + +typedef struct IOHIDEventData IOHIDEventData; + +class IOHIDEvent : public OSObject +{ + OSDeclareAbstractStructors( IOHIDEvent ) + + IOHIDEventData * _data; + OSArray * _children; + IOHIDEvent * _parent; + size_t _capacity; + AbsoluteTime _timeStamp; + UInt64 _senderID; + uint64_t _typeMask; + IOOptionBits _options; + UInt32 _eventCount; + + bool initWithCapacity(IOByteCount capacity); + bool initWithType(IOHIDEventType type, IOByteCount additionalCapacity=0); + bool initWithTypeTimeStamp(IOHIDEventType type, AbsoluteTime timeStamp, IOOptionBits options = 0, IOByteCount additionalCapacity=0); + IOByteCount getLength(UInt32 * eventCount); + IOByteCount appendBytes(UInt8 * bytes, IOByteCount withLength); + + static IOHIDEvent * _axisEvent ( IOHIDEventType type, + AbsoluteTime timeStamp, + IOFixed x, + IOFixed y, + IOFixed z, + IOOptionBits options = 0); + + static IOHIDEvent * _motionEvent ( IOHIDEventType type, + AbsoluteTime timeStamp, + IOFixed x, + IOFixed y, + IOFixed z, + uint32_t motionType = 0, + uint32_t motionSubType = 0, + UInt32 sequence = 0, + IOOptionBits options = 0); + +public: + static IOHIDEvent * withBytes( const void * bytes, + IOByteCount size); + + static IOHIDEvent * withType( IOHIDEventType type = kIOHIDEventTypeNULL, + IOOptionBits options = 0); + + static IOHIDEvent * keyboardEvent( + AbsoluteTime timeStamp, + UInt32 usagePage, + UInt32 usage, + Boolean down, + IOOptionBits options = 0); + + static IOHIDEvent * keyboardEvent( + AbsoluteTime timeStamp, + UInt32 usagePage, + UInt32 usage, + Boolean down, + UInt8 pressCount, + Boolean longPress, + UInt8 clickSpeed, + IOOptionBits options = 0); + + + static IOHIDEvent * translationEvent ( + AbsoluteTime timeStamp, + IOFixed x, + IOFixed y, + IOFixed z, + IOOptionBits options = 0); + + static IOHIDEvent * scrollEventWithFixed ( + AbsoluteTime timeStamp, + IOFixed x, + IOFixed y, + IOFixed z, + IOOptionBits options = 0); + + static IOHIDEvent * scrollEvent ( + AbsoluteTime timeStamp, + SInt32 x, + SInt32 y, + SInt32 z, + IOOptionBits options = 0); + + static IOHIDEvent * zoomEvent ( + AbsoluteTime timeStamp, + IOFixed x, + IOFixed y, + IOFixed z, + IOOptionBits options = 0); + + static IOHIDEvent * accelerometerEvent ( + AbsoluteTime timeStamp, + IOFixed x, + IOFixed y, + IOFixed z, + IOHIDMotionType type = 0, + IOHIDMotionPath subType = 0, + UInt32 sequence = 0, + IOOptionBits options = 0); + + static IOHIDEvent * gyroEvent ( AbsoluteTime timeStamp, + IOFixed x, + IOFixed y, + IOFixed z, + IOHIDMotionType type = 0, + IOHIDMotionPath subType = 0, + UInt32 sequence = 0, + IOOptionBits options = 0); + + static IOHIDEvent * compassEvent ( + AbsoluteTime timeStamp, + IOFixed x, + IOFixed y, + IOFixed z, + IOHIDMotionType type = 0, + IOHIDMotionPath subType = 0, + UInt32 sequence = 0, + IOOptionBits options = 0); + + static IOHIDEvent * buttonEvent ( + AbsoluteTime timeStamp, + UInt32 mask, + UInt8 number, + bool state, + IOOptionBits options = 0); + + static IOHIDEvent * buttonEvent ( + AbsoluteTime timeStamp, + UInt32 mask, + UInt8 number, + IOFixed pressure, + IOOptionBits options = 0); + + static IOHIDEvent * ambientLightSensorEvent ( + AbsoluteTime timeStamp, + UInt32 level, + UInt32 channel0 = 0, + UInt32 channel1 = 0, + UInt32 channel2 = 0, + UInt32 channel3 = 0, + IOOptionBits options = 0); + + static IOHIDEvent * ambientLightSensorEvent( + AbsoluteTime timeStamp, + UInt32 level, + UInt8 colorSpace, + IOHIDDouble colorComponent0, + IOHIDDouble colorComponent1, + IOHIDDouble colorComponent2, + IOOptionBits options); + + static IOHIDEvent * proximityEvent ( + AbsoluteTime timeStamp, + IOHIDProximityDetectionMask mask, + UInt32 level, + IOOptionBits options = 0); + + static IOHIDEvent * temperatureEvent ( + AbsoluteTime timeStamp, + IOFixed temperature, + IOOptionBits options = 0); + + + static IOHIDEvent * relativePointerEventWithFixed( + AbsoluteTime timeStamp, + IOFixed x, + IOFixed y, + IOFixed z, + UInt32 buttonState, + UInt32 oldButtonState = 0, + IOOptionBits options = 0); + + static IOHIDEvent * relativePointerEvent( + AbsoluteTime timeStamp, + SInt32 x, + SInt32 y, + SInt32 z, + UInt32 buttonState, + UInt32 oldButtonState = 0, + IOOptionBits options = 0); + + static IOHIDEvent * absolutePointerEvent( + AbsoluteTime timeStamp, + IOFixed x, + IOFixed y, + IOFixed z, + UInt32 buttonState, + UInt32 oldButtonState = 0, + IOOptionBits options = 0); + + static IOHIDEvent * multiAxisPointerEvent( + AbsoluteTime timeStamp, + IOFixed x, + IOFixed y, + IOFixed z, + IOFixed rX, + IOFixed rY, + IOFixed rZ, + UInt32 buttonState, + UInt32 oldButtonState = 0, + IOOptionBits options = 0); + + static IOHIDEvent * digitizerEvent( + AbsoluteTime timeStamp, + UInt32 transducerID, + IOHIDDigitizerTransducerType type, + bool inRange, + UInt32 buttonState, + IOFixed x, + IOFixed y, + IOFixed z = 0, + IOFixed tipPressure = 0, + IOFixed auxPressure = 0, + IOFixed twist = 0, + IOOptionBits options = 0 ); + + static IOHIDEvent * digitizerEventWithTiltOrientation( + AbsoluteTime timeStamp, + UInt32 transducerID, + IOHIDDigitizerTransducerType type, + bool inRange, + UInt32 buttonState, + IOFixed x, + IOFixed y, + IOFixed z = 0, + IOFixed tipPressure = 0, + IOFixed auxPressure = 0, + IOFixed twist = 0, + IOFixed xTilt = 0, + IOFixed yTilt = 0, + IOOptionBits options = 0 ); + + static IOHIDEvent * digitizerEventWithPolarOrientation( + AbsoluteTime timeStamp, + UInt32 transducerID, + IOHIDDigitizerTransducerType type, + bool inRange, + UInt32 buttonState, + IOFixed x, + IOFixed y, + IOFixed z = 0, + IOFixed tipPressure = 0, + IOFixed auxPressure = 0, + IOFixed twist = 0, + IOFixed altitude = 0, + IOFixed azimuth = 0, + IOOptionBits options = 0 ); + + static IOHIDEvent * digitizerEventWithPolarOrientation( + AbsoluteTime timeStamp, + UInt32 transducerID, + IOHIDDigitizerTransducerType type, + bool inRange, + UInt32 buttonState, + IOFixed x, + IOFixed y, + IOFixed z = 0, + IOFixed tipPressure = 0, + IOFixed auxPressure = 0, + IOFixed twist = 0, + IOFixed altitude = 0, + IOFixed azimuth = 0, + IOFixed quality = 0, + IOFixed density = 0, + IOOptionBits options = 0 ); + + static IOHIDEvent * digitizerEventWithPolarOrientation( + AbsoluteTime timeStamp, + UInt32 transducerID, + IOHIDDigitizerTransducerType type, + bool inRange, + UInt32 buttonState, + IOFixed x, + IOFixed y, + IOFixed z = 0, + IOFixed tipPressure = 0, + IOFixed auxPressure = 0, + IOFixed twist = 0, + IOFixed altitude = 0, + IOFixed azimuth = 0, + IOFixed quality = 0, + IOFixed density = 0, + IOFixed majorRadius = 6<<16, + IOFixed minorRadius = 6<<16, + IOOptionBits options = 0 ); + + static IOHIDEvent * digitizerEventWithQualityOrientation( + AbsoluteTime timeStamp, + UInt32 transducerID, + IOHIDDigitizerTransducerType type, + bool inRange, + UInt32 buttonState, + IOFixed x, + IOFixed y, + IOFixed z = 0, + IOFixed tipPressure = 0, + IOFixed auxPressure = 0, + IOFixed twist = 0, + IOFixed quality = 0, + IOFixed density = 0, + IOFixed irregularity = 0, + IOFixed majorRadius = 6<<16, + IOFixed minorRadius = 6<<16, + IOOptionBits options = 0 ); + + static IOHIDEvent * powerEvent( + AbsoluteTime timeStamp, + int64_t measurement, + IOHIDPowerType powerType, + IOHIDPowerSubType powerSubType = 0, + IOOptionBits options = 0); + + static IOHIDEvent * vendorDefinedEvent( + AbsoluteTime timeStamp, + UInt32 usagePage, + UInt32 usage, + UInt32 version, + UInt8 * data, + UInt32 length, + IOOptionBits options = 0); + + static IOHIDEvent * biometricEvent(AbsoluteTime timeStamp, IOFixed level, IOHIDBiometricEventType eventType, IOOptionBits options=0); + + static IOHIDEvent * biometricEvent(AbsoluteTime timeStamp, IOFixed level, IOHIDBiometricEventType eventType, UInt32 usagePage, UInt32 usage, UInt8 tapCount, IOOptionBits options=0); + + static IOHIDEvent * atmosphericPressureEvent(AbsoluteTime timeStamp, IOFixed level, UInt32 sequence=0, IOOptionBits options=0); + + static IOHIDEvent * unicodeEvent(AbsoluteTime timeStamp, UInt8 * payload, UInt32 length, IOHIDUnicodeEncodingType encoding, IOFixed quality, IOOptionBits options); + + static IOHIDEvent * standardGameControllerEvent( + AbsoluteTime timeStamp, + IOFixed dpadUp, + IOFixed dpadDown, + IOFixed dpadLeft, + IOFixed dpadRight, + IOFixed faceX, + IOFixed faceY, + IOFixed faceA, + IOFixed faceB, + IOFixed shoulderL, + IOFixed shoulderR, + IOOptionBits options = 0); + + static IOHIDEvent * extendedGameControllerEvent( + AbsoluteTime timeStamp, + IOFixed dpadUp, + IOFixed dpadDown, + IOFixed dpadLeft, + IOFixed dpadRight, + IOFixed faceX, + IOFixed faceY, + IOFixed faceA, + IOFixed faceB, + IOFixed shoulderL1, + IOFixed shoulderR1, + IOFixed shoulderL2, + IOFixed shoulderR2, + IOFixed joystickX, + IOFixed joystickY, + IOFixed joystickZ, + IOFixed joystickRz, + IOOptionBits options = 0); + + + static IOHIDEvent * orientationEvent(AbsoluteTime timeStamp, UInt32 orientationType, IOOptionBits options = 0); + + static IOHIDEvent * humidityEvent(AbsoluteTime timeStamp, IOFixed rh, UInt32 sequence=0, IOOptionBits options=0); + + static IOHIDEvent * brightnessEvent(AbsoluteTime timeStamp, IOFixed currentBrightness, IOFixed targetBrightness, UInt64 transitionTime, IOOptionBits options = 0); + + static IOHIDEvent * genericGestureEvent(AbsoluteTime timeStamp, IOHIDGenericGestureType gestureType, IOOptionBits options = 0); + + virtual void appendChild(IOHIDEvent *childEvent); + OSArray* getChildren(); + + virtual AbsoluteTime getTimeStamp(); + virtual void setTimeStamp(AbsoluteTime timeStamp); + + virtual IOHIDEventType getType(); + virtual void setType(IOHIDEventType type); + + virtual IOHIDEventPhaseBits getPhase(); + virtual void setPhase(IOHIDEventPhaseBits phase); + + virtual IOHIDEvent * getEvent(IOHIDEventType type, IOOptionBits options = 0); + + virtual SInt32 getIntegerValue( + IOHIDEventField key, IOOptionBits options = 0); + virtual void setIntegerValue( + IOHIDEventField key, SInt32 value, IOOptionBits options = 0); + + virtual IOFixed getFixedValue(IOHIDEventField key, IOOptionBits options = 0); + virtual void setFixedValue(IOHIDEventField key, IOFixed value, IOOptionBits options = 0); + + virtual UInt8 * getDataValue(IOHIDEventField key, IOOptionBits options = 0); + + virtual void free(void) APPLE_KEXT_OVERRIDE; + + virtual size_t getLength(); + virtual IOByteCount readBytes(void *bytes, IOByteCount withLength); +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + virtual OSData *createBytes(); +#endif + + virtual void setSenderID(uint64_t senderID); + + virtual uint64_t getLatency(uint32_t scaleFactor); + + virtual IOHIDDouble getDoubleValue( IOHIDEventField key, IOOptionBits options); + virtual void setDoubleValue( IOHIDEventField key, IOHIDDouble value, IOOptionBits options); + + inline IOOptionBits getOptions() { return _options; }; + +}; + +#endif /* _IOKIT_IOHIDEVENT_H */ diff --git a/QualcommWireless/include/IOKit/hid/IOHIDEventDriver.h b/QualcommWireless/include/IOKit/hid/IOHIDEventDriver.h new file mode 100644 index 0000000..09de75f --- /dev/null +++ b/QualcommWireless/include/IOKit/hid/IOHIDEventDriver.h @@ -0,0 +1,385 @@ +/* + * + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_HID_IOHIDEVENTDRIVER_H +#define _IOKIT_HID_IOHIDEVENTDRIVER_H + +#include +#include +#include +#include +#include +#include + +class DigitizerTransducer; +class EventElementCollection; +class IOHIDEvent; + +/*! @class IOHIDEventDriver : public IOHIDEventService + @abstract + @discussion +*/ +class IOHIDEventDriver : public IOHIDEventService +{ + OSDeclareDefaultStructors( IOHIDEventDriver ) + +private: + IOHIDInterface * _interface; + void * _reservedVoid[3] __unused; + + OSArray * _supportedElements; + + UInt32 _bootSupport; + bool _multipleReports; + bool _authenticatedDevice; + bool _reservedBool __unused; + UInt32 _reservedUInt32 __unused; + bool _reservedBool1 __unused; + + + struct ExpansionData { + SInt32 absoluteAxisRemovalPercentage; + SInt32 preferredAxisRemovalPercentage; + + struct { + OSArray * elements; + } led; + + struct { + OSArray * elements; + } scroll; + + struct { + OSArray * elements; + bool disabled; + } relative; + + struct { + OSArray * elements; + OSArray * blessedUsagePairs; + UInt8 bootMouseData[4]; + bool appleVendorSupported; + IOHIDElement * keyboardPower; + } keyboard; + + struct { + IOHIDElement * deviceModeElement; + OSArray * transducers; + IOHIDElement * touchCancelElement; + bool native; + bool collectionDispatch; + IOFixed centroidX; + IOFixed centroidY; + IOHIDElement * relativeScanTime; + IOHIDElement * surfaceSwitch; + IOHIDElement * reportRate; + } digitizer; + + struct { + OSArray * elements; + + UInt32 capable; + UInt32 sendingReportID; + IOFixed axis[6]; + UInt32 buttonState; + IOOptionBits options; + bool disabled; + } multiAxis; + + struct { + IOHIDElement * gestureStateElement; + OSArray * legacyElements; + OSArray * gesturesCandidates; + } unicode; + + struct { + bool extended; + bool formFitting; + OSArray * elements; + UInt32 capable; + UInt32 sendingReportID; + + struct { + IOFixed up; + IOFixed down; + IOFixed left; + IOFixed right; + } dpad; + + struct { + IOFixed x; + IOFixed y; + IOFixed a; + IOFixed b; + }face; + + struct { + IOFixed x; + IOFixed y; + IOFixed z; + IOFixed rz; + } joystick; + + struct { + IOFixed l1; + IOFixed l2; + IOFixed r1; + IOFixed r2; + } shoulder; + + struct { + unsigned int left; + unsigned int right; + } thumbstick; + + } gameController; + + struct { + OSArray * childElements; + OSArray * primaryElements; + OSArray * pendingEvents; + } vendorMessage; + + struct { + OSArray * elements; + } biometric; + + struct { + OSArray * elements; + } accel; + + struct { + OSArray * elements; + } gyro; + + struct { + OSArray * elements; + } compass; + + struct { + OSArray * elements; + } temperature; + + struct { + IOHIDElement * reportInterval; + IOHIDElement * maxFIFOEvents; + IOHIDElement * reportLatency; + IOHIDElement * sniffControl; + } sensorProperty; + + struct { + OSArray * cmElements; + OSArray * tiltElements; + } orientation; + + UInt64 lastReportTime; + + IOWorkLoop * workLoop; + IOCommandGate * commandGate; + }; + + ExpansionData * _reserved; + + bool getBlessedUsagePairs(); + bool parseElements(OSArray * elementArray, UInt32 bootProtocol); + bool parseRelativeElement(IOHIDElement * element); + bool parseMultiAxisElement(IOHIDElement * element); + bool parseGameControllerElement(IOHIDElement * element); + bool parseDigitizerElement(IOHIDElement * element); + bool parseDigitizerTransducerElement(IOHIDElement * element, IOHIDElement * parent=NULL); + bool parseScrollElement(IOHIDElement * element); + bool parseLEDElement(IOHIDElement * element); + bool parseKeyboardElement(IOHIDElement * element); + bool parseUnicodeElement(IOHIDElement * element); + bool parseLegacyUnicodeElement(IOHIDElement * element); + bool parseGestureUnicodeElement(IOHIDElement * element); + bool parseVendorMessageElement(IOHIDElement * element); + bool parseBiometricElement(IOHIDElement * element); + bool parseAccelElement(IOHIDElement * element); + bool parseGyroElement(IOHIDElement * element); + bool parseCompassElement(IOHIDElement * element); + bool parseTemperatureElement(IOHIDElement * element); + bool parseSensorPropertyElement(IOHIDElement * element); + bool parseDeviceOrientationElement(IOHIDElement * element); + + void processDigitizerElements(); + void processMultiAxisElements(); + void processGameControllerElements(); + void processUnicodeElements(); + + void setRelativeProperties(); + void setDigitizerProperties(); + void setGameControllerProperties(); + void setMultiAxisProperties(); + void setScrollProperties(); + void setLEDProperties(); + void setKeyboardProperties(); + void setUnicodeProperties(); + void setAccelerationProperties(); + void setVendorMessageProperties(); + void setBiometricProperties(); + void setAccelProperties(); + void setGyroProperties(); + void setCompassProperties(); + void setTemperatureProperties(); + void setSensorProperties(); + void setDeviceOrientationProperties(); + void setSurfaceDimensions(); + + UInt32 checkGameControllerElement(IOHIDElement * element); + UInt32 checkMultiAxisElement(IOHIDElement * element); + + static void calibrateJustifiedPreferredStateElement(IOHIDElement * element, SInt32 removalPercentage); + static void calibrateCenteredPreferredStateElement(IOHIDElement * element, SInt32 removalPercentage); + + void handleBootPointingReport(AbsoluteTime timeStamp, IOMemoryDescriptor * report, UInt32 reportID); + void handleRelativeReport(AbsoluteTime timeStamp, UInt32 reportID); + void handleGameControllerReport(AbsoluteTime timeStamp, UInt32 reportID); + void handleMultiAxisPointerReport(AbsoluteTime timeStamp, UInt32 reportID); + void handleDigitizerCollectionReport(AbsoluteTime timeStamp, UInt32 reportID); + void handleDigitizerReport(AbsoluteTime timeStamp, UInt32 reportID); + IOHIDEvent* handleDigitizerTransducerReport(DigitizerTransducer * transducer, AbsoluteTime timeStamp, UInt32 reportID); + void handleScrollReport(AbsoluteTime timeStamp, UInt32 reportID); + void handleKeboardReport(AbsoluteTime timeStamp, UInt32 reportID); + void handleUnicodeReport(AbsoluteTime timeStamp, UInt32 reportID); + void handleUnicodeLegacyReport(AbsoluteTime timeStamp, UInt32 reportID); + void handleUnicodeGestureReport(AbsoluteTime timeStamp, UInt32 reportID); + IOHIDEvent * handleUnicodeGestureCandidateReport(EventElementCollection * candidate, AbsoluteTime timeStamp, UInt32 reportID); + + void handleVendorMessageReport(AbsoluteTime timeStamp, IOMemoryDescriptor * report, UInt32 reportID, int phase); + void handleBiometricReport(AbsoluteTime timeStamp, UInt32 reportID); + void handleAccelReport(AbsoluteTime timeStamp, UInt32 reportID); + void handleGyroReport(AbsoluteTime timeStamp, UInt32 reportID); + void handleCompassReport(AbsoluteTime timeStamp, UInt32 reportID); + void handleTemperatureReport(AbsoluteTime timeStamp, UInt32 reportID); + void handleDeviceOrientationReport(AbsoluteTime timeStamp, UInt32 reportID); + + bool serializeCharacterGestureState(void * ref, OSSerialize * serializer); + bool conformTo (UInt32 usagePage, UInt32 usage); + IOHIDEvent* createDigitizerTransducerEventForReport(DigitizerTransducer * transducer, AbsoluteTime timeStamp, UInt32 reportID); + bool serializeDebugState(void * ref, OSSerialize * serializer); + +protected: + + virtual void free(void) APPLE_KEXT_OVERRIDE; + + virtual OSArray * getReportElements(void) APPLE_KEXT_OVERRIDE; + + virtual bool handleStart( IOService * provider ) APPLE_KEXT_OVERRIDE; + + virtual void handleStop( IOService * provider ) APPLE_KEXT_OVERRIDE; + + virtual void handleInterruptReport ( + AbsoluteTime timeStamp, + IOMemoryDescriptor * report, + IOHIDReportType reportType, + UInt32 reportID); + + virtual OSString * getTransport (void) APPLE_KEXT_OVERRIDE; + + virtual UInt32 getLocationID (void) APPLE_KEXT_OVERRIDE; + + virtual UInt32 getVendorID (void) APPLE_KEXT_OVERRIDE; + + virtual UInt32 getVendorIDSource (void) APPLE_KEXT_OVERRIDE; + + virtual UInt32 getProductID (void) APPLE_KEXT_OVERRIDE; + + virtual UInt32 getVersion (void) APPLE_KEXT_OVERRIDE; + + virtual UInt32 getCountryCode (void) APPLE_KEXT_OVERRIDE; + + virtual OSString * getManufacturer (void) APPLE_KEXT_OVERRIDE; + + virtual OSString * getProduct (void) APPLE_KEXT_OVERRIDE; + + virtual OSString * getSerialNumber (void) APPLE_KEXT_OVERRIDE; + + virtual IOReturn setElementValue ( + UInt32 usagePage, + UInt32 usage, + UInt32 value ) APPLE_KEXT_OVERRIDE; + + virtual UInt32 getElementValue ( + UInt32 usagePage, + UInt32 usage ) APPLE_KEXT_OVERRIDE; + + virtual void dispatchEvent(IOHIDEvent * event, IOOptionBits options=0) APPLE_KEXT_OVERRIDE; + +public: + + + virtual bool init( OSDictionary * dictionary = 0 ) APPLE_KEXT_OVERRIDE; + + virtual bool didTerminate( + IOService * provider, + IOOptionBits options, + bool * defer ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn setProperties( OSObject * properties ) APPLE_KEXT_OVERRIDE; + + virtual IOHIDEvent * copyEvent( + IOHIDEventType type, + IOHIDEvent * matching = 0, + IOOptionBits options = 0) APPLE_KEXT_OVERRIDE; + + virtual IOHIDEvent *copyMatchingEvent(OSDictionary *matching) APPLE_KEXT_OVERRIDE; + + + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 0); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 1); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 2); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 3); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 4); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 5); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 6); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 7); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 8); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 9); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 10); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 11); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 12); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 13); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 14); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 15); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 16); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 17); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 18); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 19); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 20); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 21); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 22); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 23); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 24); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 25); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 26); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 27); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 28); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 29); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 30); + OSMetaClassDeclareReservedUnused(IOHIDEventDriver, 31); + +}; + +#endif /* !_IOKIT_HID_IOHIDEVENTDRIVER_H */ diff --git a/QualcommWireless/include/IOKit/hid/IOHIDEventFieldDefs.h b/QualcommWireless/include/IOKit/hid/IOHIDEventFieldDefs.h new file mode 100644 index 0000000..32aeaa5 --- /dev/null +++ b/QualcommWireless/include/IOKit/hid/IOHIDEventFieldDefs.h @@ -0,0 +1,316 @@ +/* +* +* @APPLE_LICENSE_HEADER_START@ +* +* Copyright (c) 2017 Apple Computer, Inc. All Rights Reserved. +* +* This file contains Original Code and/or Modifications of Original Code +* as defined in and that are subject to the Apple Public Source License +* Version 2.0 (the 'License'). You may not use this file except in +* compliance with the License. Please obtain a copy of the License at +* http://www.opensource.apple.com/apsl/ and read it before using this +* file. +* +* The Original Code and all software distributed under the License are +* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER +* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, +* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. +* Please see the License for the specific language governing rights and +* limitations under the License. +* +* @APPLE_LICENSE_HEADER_END@ +*/ + +// +// DO NOT EDIT THIS FILE. IT IS AUTO-GENERATED +// + +#ifndef _IOHIDEVENTFIELDDEFS_H +#define _IOHIDEVENTFIELDDEFS_H + +#define kIOHIDEventFieldVendorDefinedBase IOHIDEventFieldBase(kIOHIDEventTypeVendorDefined) +static const IOHIDEventField kIOHIDEventFieldVendorDefinedDataLength = (kIOHIDEventFieldVendorDefinedBase | 3); +static const IOHIDEventField kIOHIDEventFieldVendorDefinedVersion = (kIOHIDEventFieldVendorDefinedBase | 2); +static const IOHIDEventField kIOHIDEventFieldVendorDefinedUsage = (kIOHIDEventFieldVendorDefinedBase | 1); +static const IOHIDEventField kIOHIDEventFieldVendorDefinedData = (kIOHIDEventFieldVendorDefinedBase | 4); +static const IOHIDEventField kIOHIDEventFieldVendorDefinedUsagePage = (kIOHIDEventFieldVendorDefinedBase | 0); + +#define kIOHIDEventFieldScaleBase IOHIDEventFieldBase(kIOHIDEventTypeScale) +static const IOHIDEventField kIOHIDEventFieldScaleZ = (kIOHIDEventFieldScaleBase | 2); +static const IOHIDEventField kIOHIDEventFieldScaleX = (kIOHIDEventFieldScaleBase | 0); +static const IOHIDEventField kIOHIDEventFieldScaleY = (kIOHIDEventFieldScaleBase | 1); + +#define kIOHIDEventFieldSymbolicHotKeyBase IOHIDEventFieldBase(kIOHIDEventTypeSymbolicHotKey) +static const IOHIDEventField kIOHIDEventFieldSymbolicHotKeyValue = (kIOHIDEventFieldSymbolicHotKeyBase | 0); +static const IOHIDEventField kIOHIDEventFieldSymbolicHotKeyIsCGSEvent = (kIOHIDEventFieldSymbolicHotKeyBase | 1); + +#define kIOHIDEventFieldTemperatureBase IOHIDEventFieldBase(kIOHIDEventTypeTemperature) +static const IOHIDEventField kIOHIDEventFieldTemperatureLevel = (kIOHIDEventFieldTemperatureBase | 0); + +#define kIOHIDEventFieldAccelerometerBase IOHIDEventFieldBase(kIOHIDEventTypeAccelerometer) +static const IOHIDEventField kIOHIDEventFieldAccelerometerY = (kIOHIDEventFieldAccelerometerBase | 1); +static const IOHIDEventField kIOHIDEventFieldAccelerometerX = (kIOHIDEventFieldAccelerometerBase | 0); +static const IOHIDEventField kIOHIDEventFieldAccelerometerZ = (kIOHIDEventFieldAccelerometerBase | 2); +static const IOHIDEventField kIOHIDEventFieldAccelerometerType = (kIOHIDEventFieldAccelerometerBase | 3); +static const IOHIDEventField kIOHIDEventFieldAccelerometerSubType = (kIOHIDEventFieldAccelerometerBase | 4); +static const IOHIDEventField kIOHIDEventFieldAccelerometerSequence = (kIOHIDEventFieldAccelerometerBase | 5); + +#define kIOHIDEventFieldProgressBase IOHIDEventFieldBase(kIOHIDEventTypeProgress) +static const IOHIDEventField kIOHIDEventFieldProgressLevel = (kIOHIDEventFieldProgressBase | 1); +static const IOHIDEventField kIOHIDEventFieldProgressEventType = (kIOHIDEventFieldProgressBase | 0); + +#define kIOHIDEventFieldGenericGestureBase IOHIDEventFieldBase(kIOHIDEventTypeGenericGesture) +static const IOHIDEventField kIOHIDEventFieldGenericGestureTypeTapCount = (kIOHIDEventFieldGenericGestureBase | 1); +static const IOHIDEventField kIOHIDEventFieldGenericGestureType = (kIOHIDEventFieldGenericGestureBase | 0); +static const IOHIDEventField kIOHIDEventFieldGenericGestureTypeSwipeProgress = (kIOHIDEventFieldGenericGestureBase | 2); + +#define kIOHIDEventFieldNULLBase IOHIDEventFieldBase(kIOHIDEventTypeNULL) +static const IOHIDEventField kIOHIDEventFieldIsRelative = (kIOHIDEventFieldNULLBase | 0); +static const IOHIDEventField kIOHIDEventFieldIsCenterOrigin = (kIOHIDEventFieldNULLBase | 3); +static const IOHIDEventField kIOHIDEventFieldIsBuiltIn = (kIOHIDEventFieldNULLBase | 4); +static const IOHIDEventField kIOHIDEventFieldIsPixelUnits = (kIOHIDEventFieldNULLBase | 2); +static const IOHIDEventField kIOHIDEventFieldIsCollection = (kIOHIDEventFieldNULLBase | 1); + +#define kIOHIDEventFieldAmbientLightSensorBase IOHIDEventFieldBase(kIOHIDEventTypeAmbientLightSensor) +static const IOHIDEventField kIOHIDEventFieldAmbientLightColorSpace = (kIOHIDEventFieldAmbientLightSensorBase | 6); +static const IOHIDEventField kIOHIDEventFieldAmbientLightColorComponent2 = (kIOHIDEventFieldAmbientLightSensorBase | 9); +static const IOHIDEventField kIOHIDEventFieldAmbientLightColorComponent1 = (kIOHIDEventFieldAmbientLightSensorBase | 8); +static const IOHIDEventField kIOHIDEventFieldAmbientLightColorComponent0 = (kIOHIDEventFieldAmbientLightSensorBase | 7); +static const IOHIDEventField kIOHIDEventFieldAmbientLightSensorRawChannel0 = (kIOHIDEventFieldAmbientLightSensorBase | 1); +static const IOHIDEventField kIOHIDEventFieldAmbientLightSensorRawChannel1 = (kIOHIDEventFieldAmbientLightSensorBase | 2); +static const IOHIDEventField kIOHIDEventFieldAmbientLightSensorRawChannel2 = (kIOHIDEventFieldAmbientLightSensorBase | 3); +static const IOHIDEventField kIOHIDEventFieldAmbientLightSensorRawChannel3 = (kIOHIDEventFieldAmbientLightSensorBase | 4); +static const IOHIDEventField kIOHIDEventFieldAmbientLightSensorLevel = (kIOHIDEventFieldAmbientLightSensorBase | 0); +static const IOHIDEventField kIOHIDEventFieldAmbientLightSensorIlluminance = (kIOHIDEventFieldAmbientLightSensorBase | 11); +static const IOHIDEventField kIOHIDEventFieldAmbientLightDisplayBrightnessChanged = (kIOHIDEventFieldAmbientLightSensorBase | 5); +static const IOHIDEventField kIOHIDEventFieldAmbientLightSensorColorTemperature = (kIOHIDEventFieldAmbientLightSensorBase | 10); + +#define kIOHIDEventFieldPowerBase IOHIDEventFieldBase(kIOHIDEventTypePower) +static const IOHIDEventField kIOHIDEventFieldPowerType = (kIOHIDEventFieldPowerBase | 1); +static const IOHIDEventField kIOHIDEventFieldPowerSubType = (kIOHIDEventFieldPowerBase | 2); +static const IOHIDEventField kIOHIDEventFieldPowerMeasurement = (kIOHIDEventFieldPowerBase | 0); + +#define kIOHIDEventFieldForceBase IOHIDEventFieldBase(kIOHIDEventTypeForce) +static const IOHIDEventField kIOHIDEventFieldForceStagePressure = (kIOHIDEventFieldForceBase | 3); +static const IOHIDEventField kIOHIDEventFieldForceStage = (kIOHIDEventFieldForceBase | 2); +static const IOHIDEventField kIOHIDEventFieldForceProgress = (kIOHIDEventFieldForceBase | 1); +static const IOHIDEventField kIOHIDEventFieldForceBehavior = (kIOHIDEventFieldForceBase | 0); + +#define kIOHIDEventFieldMotionGestureBase IOHIDEventFieldBase(kIOHIDEventTypeMotionGesture) +static const IOHIDEventField kIOHIDEventFieldMotionGestureProgress = (kIOHIDEventFieldMotionGestureBase | 1); +static const IOHIDEventField kIOHIDEventFieldMotionGestureGestureType = (kIOHIDEventFieldMotionGestureBase | 0); + +#define kIOHIDEventFieldGameControllerBase IOHIDEventFieldBase(kIOHIDEventTypeGameController) +static const IOHIDEventField kIOHIDEventFieldGameControllerJoyStickAxisX = (kIOHIDEventFieldGameControllerBase | 13); +static const IOHIDEventField kIOHIDEventFieldGameControllerJoyStickAxisY = (kIOHIDEventFieldGameControllerBase | 14); +static const IOHIDEventField kIOHIDEventFieldGameControllerType = (kIOHIDEventFieldGameControllerBase | 0); +static const IOHIDEventField kIOHIDEventFieldGameControllerDirectionPadRight = (kIOHIDEventFieldGameControllerBase | 4); +static const IOHIDEventField kIOHIDEventFieldGameControllerShoulderButtonR1 = (kIOHIDEventFieldGameControllerBase | 10); +static const IOHIDEventField kIOHIDEventFieldGameControllerFaceButtonA = (kIOHIDEventFieldGameControllerBase | 5); +static const IOHIDEventField kIOHIDEventFieldGameControllerFaceButtonB = (kIOHIDEventFieldGameControllerBase | 6); +static const IOHIDEventField kIOHIDEventFieldGameControllerDirectionPadLeft = (kIOHIDEventFieldGameControllerBase | 3); +static const IOHIDEventField kIOHIDEventFieldGameControllerThumbstickButtonRight = (kIOHIDEventFieldGameControllerBase | 18); +static const IOHIDEventField kIOHIDEventFieldGameControllerDirectionPadDown = (kIOHIDEventFieldGameControllerBase | 2); +static const IOHIDEventField kIOHIDEventFieldGameControllerThumbstickButtonLeft = (kIOHIDEventFieldGameControllerBase | 17); +static const IOHIDEventField kIOHIDEventFieldGameControllerJoyStickAxisZ = (kIOHIDEventFieldGameControllerBase | 15); +static const IOHIDEventField kIOHIDEventFieldGameControllerShoulderButtonR2 = (kIOHIDEventFieldGameControllerBase | 12); +static const IOHIDEventField kIOHIDEventFieldGameControllerFaceButtonY = (kIOHIDEventFieldGameControllerBase | 8); +static const IOHIDEventField kIOHIDEventFieldGameControllerShoulderButtonL2 = (kIOHIDEventFieldGameControllerBase | 11); +static const IOHIDEventField kIOHIDEventFieldGameControllerJoyStickAxisRz = (kIOHIDEventFieldGameControllerBase | 16); +static const IOHIDEventField kIOHIDEventFieldGameControllerShoulderButtonL1 = (kIOHIDEventFieldGameControllerBase | 9); +static const IOHIDEventField kIOHIDEventFieldGameControllerFaceButtonX = (kIOHIDEventFieldGameControllerBase | 7); +static const IOHIDEventField kIOHIDEventFieldGameControllerDirectionPadUp = (kIOHIDEventFieldGameControllerBase | 1); + +#define kIOHIDEventFieldTranslationBase IOHIDEventFieldBase(kIOHIDEventTypeTranslation) +static const IOHIDEventField kIOHIDEventFieldTranslationY = (kIOHIDEventFieldTranslationBase | 1); +static const IOHIDEventField kIOHIDEventFieldTranslationX = (kIOHIDEventFieldTranslationBase | 0); +static const IOHIDEventField kIOHIDEventFieldTranslationZ = (kIOHIDEventFieldTranslationBase | 2); + +#define kIOHIDEventFieldDigitizerBase IOHIDEventFieldBase(kIOHIDEventTypeDigitizer) +static const IOHIDEventField kIOHIDEventFieldDigitizerType = (kIOHIDEventFieldDigitizerBase | 4); +static const IOHIDEventField kIOHIDEventFieldDigitizerChildEventMask = (kIOHIDEventFieldDigitizerBase | 24); +static const IOHIDEventField kIOHIDEventFieldDigitizerAuxiliaryPressure = (kIOHIDEventFieldDigitizerBase | 11); +static const IOHIDEventField kIOHIDEventFieldDigitizerQualityRadiiAccuracy = (kIOHIDEventFieldDigitizerBase | 26); +static const IOHIDEventField kIOHIDEventFieldDigitizerQuality = (kIOHIDEventFieldDigitizerBase | 17); +static const IOHIDEventField kIOHIDEventFieldDigitizerMinorRadius = (kIOHIDEventFieldDigitizerBase | 21); +static const IOHIDEventField kIOHIDEventFieldDigitizerEventMask = (kIOHIDEventFieldDigitizerBase | 7); +static const IOHIDEventField kIOHIDEventFieldDigitizerGenerationCount = (kIOHIDEventFieldDigitizerBase | 27); +static const IOHIDEventField kIOHIDEventFieldDigitizerIndex = (kIOHIDEventFieldDigitizerBase | 5); +static const IOHIDEventField kIOHIDEventFieldDigitizerTouch = (kIOHIDEventFieldDigitizerBase | 9); +static const IOHIDEventField kIOHIDEventFieldDigitizerAzimuth = (kIOHIDEventFieldDigitizerBase | 16); +static const IOHIDEventField kIOHIDEventFieldDigitizerTiltX = (kIOHIDEventFieldDigitizerBase | 13); +static const IOHIDEventField kIOHIDEventFieldDigitizerTiltY = (kIOHIDEventFieldDigitizerBase | 14); +static const IOHIDEventField kIOHIDEventFieldDigitizerRange = (kIOHIDEventFieldDigitizerBase | 8); +static const IOHIDEventField kIOHIDEventFieldDigitizerPressure = (kIOHIDEventFieldDigitizerBase | 10); +static const IOHIDEventField kIOHIDEventFieldDigitizerCollection = (kIOHIDEventFieldDigitizerBase | 22); +static const IOHIDEventField kIOHIDEventFieldDigitizerAltitude = (kIOHIDEventFieldDigitizerBase | 15); +static const IOHIDEventField kIOHIDEventFieldDigitizerDensity = (kIOHIDEventFieldDigitizerBase | 18); +static const IOHIDEventField kIOHIDEventFieldDigitizerOrientationType = (kIOHIDEventFieldDigitizerBase | 31); +static const IOHIDEventField kIOHIDEventFieldDigitizerY = (kIOHIDEventFieldDigitizerBase | 1); +static const IOHIDEventField kIOHIDEventFieldDigitizerWillUpdateMask = (kIOHIDEventFieldDigitizerBase | 28); +static const IOHIDEventField kIOHIDEventFieldDigitizerIdentity = (kIOHIDEventFieldDigitizerBase | 6); +static const IOHIDEventField kIOHIDEventFieldDigitizerTwist = (kIOHIDEventFieldDigitizerBase | 12); +static const IOHIDEventField kIOHIDEventFieldDigitizerX = (kIOHIDEventFieldDigitizerBase | 0); +static const IOHIDEventField kIOHIDEventFieldDigitizerIsDisplayIntegrated = (kIOHIDEventFieldDigitizerBase | 25); +static const IOHIDEventField kIOHIDEventFieldDigitizerZ = (kIOHIDEventFieldDigitizerBase | 2); +static const IOHIDEventField kIOHIDEventFieldDigitizerMajorRadius = (kIOHIDEventFieldDigitizerBase | 20); +static const IOHIDEventField kIOHIDEventFieldDigitizerButtonMask = (kIOHIDEventFieldDigitizerBase | 3); +static const IOHIDEventField kIOHIDEventFieldDigitizerIrregularity = (kIOHIDEventFieldDigitizerBase | 19); +static const IOHIDEventField kIOHIDEventFieldDigitizerDidUpdateMask = (kIOHIDEventFieldDigitizerBase | 29); + +#define kIOHIDEventFieldCompassBase IOHIDEventFieldBase(kIOHIDEventTypeCompass) +static const IOHIDEventField kIOHIDEventFieldCompassType = (kIOHIDEventFieldCompassBase | 3); +static const IOHIDEventField kIOHIDEventFieldCompassZ = (kIOHIDEventFieldCompassBase | 2); +static const IOHIDEventField kIOHIDEventFieldCompassX = (kIOHIDEventFieldCompassBase | 0); +static const IOHIDEventField kIOHIDEventFieldCompassY = (kIOHIDEventFieldCompassBase | 1); +static const IOHIDEventField kIOHIDEventFieldCompassSubType = (kIOHIDEventFieldCompassBase | 4); +static const IOHIDEventField kIOHIDEventFieldCompassSequence = (kIOHIDEventFieldCompassBase | 5); + +#define kIOHIDEventFieldRotationBase IOHIDEventFieldBase(kIOHIDEventTypeRotation) +static const IOHIDEventField kIOHIDEventFieldRotationY = (kIOHIDEventFieldRotationBase | 1); +static const IOHIDEventField kIOHIDEventFieldRotationX = (kIOHIDEventFieldRotationBase | 0); +static const IOHIDEventField kIOHIDEventFieldRotationZ = (kIOHIDEventFieldRotationBase | 2); + +#define kIOHIDEventFieldMotionActivityBase IOHIDEventFieldBase(kIOHIDEventTypeMotionActivity) +static const IOHIDEventField kIOHIDEventFieldMotionActivityConfidence = (kIOHIDEventFieldMotionActivityBase | 1); +static const IOHIDEventField kIOHIDEventFieldMotionActivityActivityType = (kIOHIDEventFieldMotionActivityBase | 0); + +#define kIOHIDEventFieldMultiAxisPointerBase IOHIDEventFieldBase(kIOHIDEventTypeMultiAxisPointer) +static const IOHIDEventField kIOHIDEventFieldMultiAxisPointerRy = (kIOHIDEventFieldMultiAxisPointerBase | 4); +static const IOHIDEventField kIOHIDEventFieldMultiAxisPointerRx = (kIOHIDEventFieldMultiAxisPointerBase | 3); +static const IOHIDEventField kIOHIDEventFieldMultiAxisPointerRz = (kIOHIDEventFieldMultiAxisPointerBase | 5); +static const IOHIDEventField kIOHIDEventFieldMultiAxisPointerButtonMask = (kIOHIDEventFieldMultiAxisPointerBase | 6); +static const IOHIDEventField kIOHIDEventFieldMultiAxisPointerZ = (kIOHIDEventFieldMultiAxisPointerBase | 2); +static const IOHIDEventField kIOHIDEventFieldMultiAxisPointerX = (kIOHIDEventFieldMultiAxisPointerBase | 0); +static const IOHIDEventField kIOHIDEventFieldMultiAxisPointerY = (kIOHIDEventFieldMultiAxisPointerBase | 1); + +#define kIOHIDEventFieldBrightnessBase IOHIDEventFieldBase(kIOHIDEventTypeBrightness) +static const IOHIDEventField kIOHIDEventFieldTargetBrightness = (kIOHIDEventFieldBrightnessBase | 1); +static const IOHIDEventField kIOHIDEventFieldCurrentBrightness = (kIOHIDEventFieldBrightnessBase | 0); +static const IOHIDEventField kIOHIDEventFieldTransitionTime = (kIOHIDEventFieldBrightnessBase | 2); + +#define kIOHIDEventFieldGyroBase IOHIDEventFieldBase(kIOHIDEventTypeGyro) +static const IOHIDEventField kIOHIDEventFieldGyroX = (kIOHIDEventFieldGyroBase | 0); +static const IOHIDEventField kIOHIDEventFieldGyroY = (kIOHIDEventFieldGyroBase | 1); +static const IOHIDEventField kIOHIDEventFieldGyroZ = (kIOHIDEventFieldGyroBase | 2); +static const IOHIDEventField kIOHIDEventFieldGyroSubType = (kIOHIDEventFieldGyroBase | 4); +static const IOHIDEventField kIOHIDEventFieldGyroSequence = (kIOHIDEventFieldGyroBase | 5); +static const IOHIDEventField kIOHIDEventFieldGyroType = (kIOHIDEventFieldGyroBase | 3); + +#define kIOHIDEventFieldButtonBase IOHIDEventFieldBase(kIOHIDEventTypeButton) +static const IOHIDEventField kIOHIDEventFieldButtonPressure = (kIOHIDEventFieldButtonBase | 3); +static const IOHIDEventField kIOHIDEventFieldButtonClickCount = (kIOHIDEventFieldButtonBase | 2); +static const IOHIDEventField kIOHIDEventFieldButtonMask = (kIOHIDEventFieldButtonBase | 0); +static const IOHIDEventField kIOHIDEventFieldButtonState = (kIOHIDEventFieldButtonBase | 4); +static const IOHIDEventField kIOHIDEventFieldButtonNumber = (kIOHIDEventFieldButtonBase | 1); + +#define kIOHIDEventFieldNavigationSwipeBase IOHIDEventFieldBase(kIOHIDEventTypeNavigationSwipe) +static const IOHIDEventField kIOHIDEventFieldNavigationSwipeFlavor = (kIOHIDEventFieldNavigationSwipeBase | 5); +static const IOHIDEventField kIOHIDEventFieldNavigationSwipeProgress = (kIOHIDEventFieldNavigationSwipeBase | 2); +static const IOHIDEventField kIOHIDEventFieldNavigationSwipeMask = (kIOHIDEventFieldNavigationSwipeBase | 0); +static const IOHIDEventField kIOHIDEventFieldNavigationSwipeMotion = (kIOHIDEventFieldNavigationSwipeBase | 1); +static const IOHIDEventField kIOHIDEventFieldNavigationSwipePositionY = (kIOHIDEventFieldNavigationSwipeBase | 4); +static const IOHIDEventField kIOHIDEventFieldNavigationSwipePositionX = (kIOHIDEventFieldNavigationSwipeBase | 3); +static const IOHIDEventField kIOHIDEventFieldNavigationSwipePositionZ = (kIOHIDEventFieldNavigationSwipeBase | 6); + +#define kIOHIDEventFieldAtmosphericPressureBase IOHIDEventFieldBase(kIOHIDEventTypeAtmosphericPressure) +static const IOHIDEventField kIOHIDEventFieldAtmosphericPressureLevel = (kIOHIDEventFieldAtmosphericPressureBase | 0); +static const IOHIDEventField kIOHIDEventFieldAtmosphericSequence = (kIOHIDEventFieldAtmosphericPressureBase | 1); + +#define kIOHIDEventFieldHumidityBase IOHIDEventFieldBase(kIOHIDEventTypeHumidity) +static const IOHIDEventField kIOHIDEventFieldHumiditySequence = (kIOHIDEventFieldHumidityBase | 1); +static const IOHIDEventField kIOHIDEventFieldHumidityRH = (kIOHIDEventFieldHumidityBase | 0); + +#define kIOHIDEventFieldVelocityBase IOHIDEventFieldBase(kIOHIDEventTypeVelocity) +static const IOHIDEventField kIOHIDEventFieldVelocityX = (kIOHIDEventFieldVelocityBase | 0); +static const IOHIDEventField kIOHIDEventFieldVelocityY = (kIOHIDEventFieldVelocityBase | 1); +static const IOHIDEventField kIOHIDEventFieldVelocityZ = (kIOHIDEventFieldVelocityBase | 2); + +#define kIOHIDEventFieldScrollBase IOHIDEventFieldBase(kIOHIDEventTypeScroll) +static const IOHIDEventField kIOHIDEventFieldScrollIsPixels = (kIOHIDEventFieldScrollBase | 3); +static const IOHIDEventField kIOHIDEventFieldScrollX = (kIOHIDEventFieldScrollBase | 0); +static const IOHIDEventField kIOHIDEventFieldScrollY = (kIOHIDEventFieldScrollBase | 1); +static const IOHIDEventField kIOHIDEventFieldScrollZ = (kIOHIDEventFieldScrollBase | 2); + +#define kIOHIDEventFieldBiometricBase IOHIDEventFieldBase(kIOHIDEventTypeBiometric) +static const IOHIDEventField kIOHIDEventFieldBiometricEventType = (kIOHIDEventFieldBiometricBase | 0); +static const IOHIDEventField kIOHIDEventFieldBiometricUsage = (kIOHIDEventFieldBiometricBase | 3); +static const IOHIDEventField kIOHIDEventFieldBiometricLevel = (kIOHIDEventFieldBiometricBase | 1); +static const IOHIDEventField kIOHIDEventFieldBiometricTapCount = (kIOHIDEventFieldBiometricBase | 4); +static const IOHIDEventField kIOHIDEventFieldBiometricUsagePage = (kIOHIDEventFieldBiometricBase | 2); + +#define kIOHIDEventFieldBoundaryScrollBase IOHIDEventFieldBase(kIOHIDEventTypeBoundaryScroll) +static const IOHIDEventField kIOHIDEventFieldBoundaryScrollProgress = (kIOHIDEventFieldBoundaryScrollBase | 2); +static const IOHIDEventField kIOHIDEventFieldBoundaryScrollFlavor = (kIOHIDEventFieldBoundaryScrollBase | 5); +static const IOHIDEventField kIOHIDEventFieldBoundaryScrollPositionY = (kIOHIDEventFieldBoundaryScrollBase | 4); +static const IOHIDEventField kIOHIDEventFieldBoundaryScrollPositionX = (kIOHIDEventFieldBoundaryScrollBase | 3); +static const IOHIDEventField kIOHIDEventFieldBoundaryScrollMask = (kIOHIDEventFieldBoundaryScrollBase | 0); +static const IOHIDEventField kIOHIDEventFieldBoundaryScrollMotion = (kIOHIDEventFieldBoundaryScrollBase | 1); + +#define kIOHIDEventFieldLEDBase IOHIDEventFieldBase(kIOHIDEventTypeLED) +static const IOHIDEventField kIOHIDEventFieldLEDMask = (kIOHIDEventFieldLEDBase | 0); +static const IOHIDEventField kIOHIDEventFieldLEDState = (kIOHIDEventFieldLEDBase | 2); +static const IOHIDEventField kIOHIDEventFieldLEDNumber = (kIOHIDEventFieldLEDBase | 1); + +#define kIOHIDEventFieldOrientationBase IOHIDEventFieldBase(kIOHIDEventTypeOrientation) +static const IOHIDEventField kIOHIDEventFieldOrientationOrientationType = (kIOHIDEventFieldOrientationBase | 3); +static const IOHIDEventField kIOHIDEventFieldOrientationTiltZ = (kIOHIDEventFieldOrientationBase | 7); +static const IOHIDEventField kIOHIDEventFieldOrientationTiltY = (kIOHIDEventFieldOrientationBase | 6); +static const IOHIDEventField kIOHIDEventFieldOrientationTiltX = (kIOHIDEventFieldOrientationBase | 5); +static const IOHIDEventField kIOHIDEventFieldOrientationAzimuth = (kIOHIDEventFieldOrientationBase | 1); +static const IOHIDEventField kIOHIDEventFieldOrientationQuatZ = (kIOHIDEventFieldOrientationBase | 11); +static const IOHIDEventField kIOHIDEventFieldOrientationQuatY = (kIOHIDEventFieldOrientationBase | 10); +static const IOHIDEventField kIOHIDEventFieldOrientationQuatX = (kIOHIDEventFieldOrientationBase | 9); +static const IOHIDEventField kIOHIDEventFieldOrientationQuatW = (kIOHIDEventFieldOrientationBase | 8); +static const IOHIDEventField kIOHIDEventFieldOrientationDeviceOrientationUsage = (kIOHIDEventFieldOrientationBase | 4); +static const IOHIDEventField kIOHIDEventFieldOrientationAltitude = (kIOHIDEventFieldOrientationBase | 2); +static const IOHIDEventField kIOHIDEventFieldOrientationRadius = (kIOHIDEventFieldOrientationBase | 0); + +#define kIOHIDEventFieldProximityBase IOHIDEventFieldBase(kIOHIDEventTypeProximity) +static const IOHIDEventField kIOHIDEventFieldProximityLevel = (kIOHIDEventFieldProximityBase | 1); +static const IOHIDEventField kIOHIDEventFieldProximityDetectionMask = (kIOHIDEventFieldProximityBase | 0); + +#define kIOHIDEventFieldFluidTouchGestureBase IOHIDEventFieldBase(kIOHIDEventTypeFluidTouchGesture) +static const IOHIDEventField kIOHIDEventFieldFluidTouchGesturePositionY = (kIOHIDEventFieldFluidTouchGestureBase | 4); +static const IOHIDEventField kIOHIDEventFieldFluidTouchGesturePositionX = (kIOHIDEventFieldFluidTouchGestureBase | 3); +static const IOHIDEventField kIOHIDEventFieldFluidTouchGestureMask = (kIOHIDEventFieldFluidTouchGestureBase | 0); +static const IOHIDEventField kIOHIDEventFieldFluidTouchGestureProgress = (kIOHIDEventFieldFluidTouchGestureBase | 2); +static const IOHIDEventField kIOHIDEventFieldFluidTouchGestureMotion = (kIOHIDEventFieldFluidTouchGestureBase | 1); +static const IOHIDEventField kIOHIDEventFieldFluidTouchGestureFlavor = (kIOHIDEventFieldFluidTouchGestureBase | 5); + +#define kIOHIDEventFieldDockSwipeBase IOHIDEventFieldBase(kIOHIDEventTypeDockSwipe) +static const IOHIDEventField kIOHIDEventFieldDockSwipeProgress = (kIOHIDEventFieldDockSwipeBase | 2); +static const IOHIDEventField kIOHIDEventFieldDockSwipeMask = (kIOHIDEventFieldDockSwipeBase | 0); +static const IOHIDEventField kIOHIDEventFieldDockSwipeMotion = (kIOHIDEventFieldDockSwipeBase | 1); +static const IOHIDEventField kIOHIDEventFieldDockSwipeFlavor = (kIOHIDEventFieldDockSwipeBase | 5); +static const IOHIDEventField kIOHIDEventFieldDockSwipePositionX = (kIOHIDEventFieldDockSwipeBase | 3); +static const IOHIDEventField kIOHIDEventFieldDockSwipePositionY = (kIOHIDEventFieldDockSwipeBase | 4); +static const IOHIDEventField kIOHIDEventFieldDockSwipePositionZ = (kIOHIDEventFieldDockSwipeBase | 6); + +#define kIOHIDEventFieldUnicodeBase IOHIDEventFieldBase(kIOHIDEventTypeUnicode) +static const IOHIDEventField kIOHIDEventFieldUnicodePayload = (kIOHIDEventFieldUnicodeBase | 3); +static const IOHIDEventField kIOHIDEventFieldUnicodeLength = (kIOHIDEventFieldUnicodeBase | 2); +static const IOHIDEventField kIOHIDEventFieldUnicodeQuality = (kIOHIDEventFieldUnicodeBase | 1); +static const IOHIDEventField kIOHIDEventFieldUnicodeEncoding = (kIOHIDEventFieldUnicodeBase | 0); + +#define kIOHIDEventFieldKeyboardBase IOHIDEventFieldBase(kIOHIDEventTypeKeyboard) +static const IOHIDEventField kIOHIDEventFieldKeyboardStickyKeyPhase = (kIOHIDEventFieldKeyboardBase | 9); +static const IOHIDEventField kIOHIDEventFieldKeyboardStickyKeyToggle = (kIOHIDEventFieldKeyboardBase | 10); +static const IOHIDEventField kIOHIDEventFieldKeyboardMouseKeyToggle = (kIOHIDEventFieldKeyboardBase | 8); +static const IOHIDEventField kIOHIDEventFieldKeyboardClickSpeed = (kIOHIDEventFieldKeyboardBase | 6); +static const IOHIDEventField kIOHIDEventFieldKeyboardPressCount = (kIOHIDEventFieldKeyboardBase | 4); +static const IOHIDEventField kIOHIDEventFieldKeyboardLongPress = (kIOHIDEventFieldKeyboardBase | 5); +static const IOHIDEventField kIOHIDEventFieldKeyboardUsagePage = (kIOHIDEventFieldKeyboardBase | 0); +static const IOHIDEventField kIOHIDEventFieldKeyboardSlowKeyPhase = (kIOHIDEventFieldKeyboardBase | 7); +static const IOHIDEventField kIOHIDEventFieldKeyboardDown = (kIOHIDEventFieldKeyboardBase | 2); +static const IOHIDEventField kIOHIDEventFieldKeyboardRepeat = (kIOHIDEventFieldKeyboardBase | 3); +static const IOHIDEventField kIOHIDEventFieldKeyboardUsage = (kIOHIDEventFieldKeyboardBase | 1); + +#define kIOHIDEventFieldPointerBase IOHIDEventFieldBase(kIOHIDEventTypePointer) +static const IOHIDEventField kIOHIDEventFieldPointerZ = (kIOHIDEventFieldPointerBase | 2); +static const IOHIDEventField kIOHIDEventFieldPointerY = (kIOHIDEventFieldPointerBase | 1); +static const IOHIDEventField kIOHIDEventFieldPointerX = (kIOHIDEventFieldPointerBase | 0); +static const IOHIDEventField kIOHIDEventFieldPointerButtonMask = (kIOHIDEventFieldPointerBase | 3); + +#endif diff --git a/QualcommWireless/include/IOKit/hid/IOHIDEventService.h b/QualcommWireless/include/IOKit/hid/IOHIDEventService.h new file mode 100644 index 0000000..2230924 --- /dev/null +++ b/QualcommWireless/include/IOKit/hid/IOHIDEventService.h @@ -0,0 +1,980 @@ +/* + * + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 1999-2009 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_HID_IOHIDEVENTSERVICE_H +#define _IOKIT_HID_IOHIDEVENTSERVICE_H + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#if TARGET_OS_IPHONE +#include +#endif +#include + +#include + +#ifndef __MAC_OS_X_VERSION_MIN_REQUIRED +#error "Missing macOS target version" +#endif +enum +{ + kHIDDispatchOptionPointerNoAcceleration = 0x01, + kHIDDispatchOptionPointerDisplayIntegrated = 0x02, + kHIDDispatchOptionPointerAffixToScreen = kHIDDispatchOptionPointerDisplayIntegrated, + kHIDDispatchOptionPointerAbsolutToRelative = 0x04 +}; + +enum +{ + kHIDDispatchOptionScrollNoAcceleration = (1<<0), + + kHIDDispatchOptionScrollMomentumAny = 0x00e, + kHIDDispatchOptionScrollMomentumContinue = (1<<1), + kHIDDispatchOptionScrollMomentumStart = (1<<2), + kHIDDispatchOptionScrollMomentumEnd = (1<<3), + + kHIDDispatchOptionPhaseAny = 0xff0, + kHIDDispatchOptionPhaseBegan = (1<<4), + kHIDDispatchOptionPhaseChanged = (1<<5), + kHIDDispatchOptionPhaseEnded = (1<<6), + kHIDDispatchOptionPhaseCanceled = (1<<7), + kHIDDispatchOptionPhaseMayBegin = (1<<11), + + kHIDDispatchOptionDeliveryNotificationForce = (1<<12), + kHIDDispatchOptionDeliveryNotificationSuppress = (1<<13) +}; + +enum +{ + kHIDDispatchOptionKeyboardNoRepeat = (1<<0) +}; + + +class IOHIDEventService; +class IOHIDPointing; +class IOHIDKeyboard; +class IOHIDConsumer; +struct TransducerData; +class IOHIDEvent; +class IOBufferMemoryDescriptor; + +#ifndef _IOKIT_HID_IOHIDEVENTTYPES_H +typedef uint32_t IOHIDEventType; +typedef uint32_t IOHIDBiometricEventType; +#endif + +struct KeyValueMask { + Key key; + uint32_t mask; +}; + +typedef void (*DebugKeyActionProc) (IOHIDEventService *self, void * parameter); +struct DebugKeyAction { + uint32_t mask; + DebugKeyActionProc action; + void* parameter; +}; + + +/*! @class IOHIDEventService : public IOService + @abstract + @discussion + */ +class IOHIDEventService : public IOService +{ + OSDeclareDefaultStructorsWithDispatch( IOHIDEventService ) + + friend class IOHIDPointing; + friend class IOHIDKeyboard; + friend class IOHIDConsumer; + friend class AppleEmbeddedKeyboard; + friend class IOHIDEventServiceUserClient; + friend class IOHIDEventServiceFastPathUserClient; + +private: + IOHIDKeyboard * _keyboardNub; + IOHIDPointing * _pointingNub; //unused, keep to maintain layout + IOHIDConsumer * _consumerNub; + + IOLock * _clientDictLock; + IORecursiveLock * _nubLock; + + void * _reserved0; + + bool _readyForInputReports; + + struct ExpansionData { + IOService * provider; + IOWorkLoop * workLoop; + OSArray * deviceUsagePairs; + IOCommandGate * commandGate; + + OSDictionary * clientDict; + IOBufferMemoryDescriptor *eventMemory; + IOLock *eventMemLock; + + struct { + UInt32 deviceID; + bool range; + bool touch; + SInt32 x; + SInt32 y; + SInt32 z; + } digitizer; + + struct { + +#if TARGET_OS_IPHONE + struct { + UInt32 startMask; + UInt32 mask; + UInt32 nmiHoldMask; + UInt32 nmiDelay; + UInt32 nmiTriplePressMask; + UInt32 nmiPressCount; + UInt64 nmiStartTime; + IOTimerEventSource * nmiTimer; + UInt32 stackshotHeld; + IOTimerEventSource * stackshotTimer; + } debug; + bool swapISO; +#else + Key pressedKeys[10]; + UInt32 pressedKeysMask; +#endif + bool appleVendorSupported; + } keyboard; + + struct { + IOFixed x; + IOFixed y; + IOFixed z; + IOFixed rX; + IOFixed rY; + IOFixed rZ; + UInt32 buttonState; + IOOptionBits options; + IOTimerEventSource * timer; + } multiAxis; + + struct { + UInt32 buttonState; + } relativePointer; + +#if TARGET_OS_OSX + + struct { + UInt32 buttonState; + } absolutePointer; +#ifdef POINTING_SHIM_SUPPORT + int pointingShim; +#endif + int keyboardShim; +#endif + UInt32 debugMask; + }; + +#if TARGET_OS_OSX + static KeyValueMask keyMonitorTable[]; + static DebugKeyAction debugKeyActionTable[]; +#endif + + ExpansionData * _reserved; + +#ifdef POINTING_SHIM_SUPPORT + IOHIDPointing * newPointingShim ( + UInt32 buttonCount = 1, + IOFixed pointerResolution = (400 << 16), + IOFixed scrollResolution = 0, + IOOptionBits options = 0 ); +#endif + + IOHIDKeyboard * newKeyboardShim ( + UInt32 supportedModifiers = 0, + IOOptionBits options = 0 ); + + IOHIDConsumer * newConsumerShim ( IOOptionBits options = 0 ); + + void parseSupportedElements ( + OSArray * elementArray, + UInt32 bootProtocol ); + + void processTabletElement ( IOHIDElement * element ); + + IOFixed determineResolution ( IOHIDElement * element ); + +#if TARGET_OS_IPHONE + void debuggerTimerCallback(IOTimerEventSource *sender); + + void triggerDebugger(); + + void stackshotTimerCallback(IOTimerEventSource *sender); +#endif + + void multiAxisTimerCallback(IOTimerEventSource *sender); + + void calculateStandardType(); + bool supportsHeadset(OSArray *elements); + +protected: + + virtual void free(void) APPLE_KEXT_OVERRIDE; + +/*! @function handleOpen + @abstract Handle a client open on the interface. + @discussion This method is called by IOService::open() with the + arbitration lock held, and must return true to accept the client open. + This method will in turn call handleClientOpen() to qualify the client + requesting the open. + @param client The client object that requested the open. + @param options Options passed to IOService::open(). + @param argument Argument passed to IOService::open(). + @result true to accept the client open, false otherwise. */ + + virtual bool handleOpen(IOService * client, + IOOptionBits options, + void * argument) APPLE_KEXT_OVERRIDE; + +/*! @function handleClose + @abstract Handle a client close on the interface. + @discussion This method is called by IOService::close() with the + arbitration lock held. This method will in turn call handleClientClose() + to notify interested subclasses about the client close. If this represents + the last close, then the interface will also close the controller before + this method returns. The controllerWillClose() method will be called before + closing the controller. Subclasses should not override this method. + @param client The client object that requested the close. + @param options Options passed to IOService::close(). */ + + virtual void handleClose(IOService * client, IOOptionBits options) APPLE_KEXT_OVERRIDE; + +/*! @function handleIsOpen + @abstract Query whether a client has an open on the interface. + @discussion This method is always called by IOService with the + arbitration lock held. Subclasses should not override this method. + @result true if the specified client, or any client if none (0) is + specified, presently has an open on this object. */ + + virtual bool handleIsOpen(const IOService * client) const APPLE_KEXT_OVERRIDE; + +/*! @function handleStart + @abstract Prepare the hardware and driver to support I/O operations. + @discussion IOHIDEventService will call this method from start() before + any I/O operations are issued to the concrete subclass. Methods + such as getReportElements() are only called after handleStart() + has returned true. A subclass that overrides this method should + begin its implementation by calling the version in super, and + then check the return value. + @param provider The provider argument passed to start(). + @result True on success, or false otherwise. Returning false will + cause start() to fail and return false. */ + + virtual bool handleStart( IOService * provider ); + +/*! @function handleStop + @abstract Quiesce the hardware and stop the driver. + @discussion IOHIDEventService will call this method from stop() to + signal that the hardware should be quiesced and the driver stopped. + A subclass that overrides this method should end its implementation + by calling the version in super. + @param provider The provider argument passed to stop(). */ + + virtual void handleStop( IOService * provider ); + + virtual OSString * getTransport (); + virtual UInt32 getLocationID (); + virtual UInt32 getVendorID (); + virtual UInt32 getVendorIDSource (); + virtual UInt32 getProductID (); + virtual UInt32 getVersion (); + virtual UInt32 getCountryCode (); + virtual OSString * getManufacturer (); + virtual OSString * getProduct (); + virtual OSString * getSerialNumber (); + + virtual OSArray * getReportElements(); + + virtual IOReturn setElementValue ( + UInt32 usagePage, + UInt32 usage, + UInt32 value ); + + virtual UInt32 getElementValue ( + UInt32 usagePage, + UInt32 usage ); + + virtual void dispatchKeyboardEvent( + AbsoluteTime timeStamp, + UInt32 usagePage, + UInt32 usage, + UInt32 value, + IOOptionBits options = 0 ); + + virtual void dispatchRelativePointerEvent( + AbsoluteTime timeStamp, + SInt32 dx, + SInt32 dy, + UInt32 buttonState, + IOOptionBits options = 0 ); + + void dispatchRelativePointerEventWithFixed( + AbsoluteTime timeStamp, + IOFixed dx, + IOFixed dy, + UInt32 buttonState, + IOOptionBits options = 0 ); + + + virtual void dispatchAbsolutePointerEvent( + AbsoluteTime timeStamp, + SInt32 x, + SInt32 y, + IOGBounds * bounds, + UInt32 buttonState, + bool inRange, + SInt32 tipPressure, + SInt32 tipPressureMin, + SInt32 tipPressureMax, + IOOptionBits options = 0 ); + + virtual void dispatchScrollWheelEvent( + AbsoluteTime timeStamp, + SInt32 deltaAxis1, + SInt32 deltaAxis2, + SInt32 deltaAxis3, + IOOptionBits options = 0 ); + + void dispatchScrollWheelEventWithFixed( + AbsoluteTime timeStamp, + IOFixed deltaAxis1, + IOFixed deltaAxis2, + IOFixed deltaAxis3, + IOOptionBits options = 0 ); + + virtual void dispatchTabletPointerEvent( + AbsoluteTime timeStamp, + UInt32 transducerID, + SInt32 x, + SInt32 y, + SInt32 z, + IOGBounds * bounds, + UInt32 buttonState, + SInt32 tipPressure, + SInt32 tipPressureMin, + SInt32 tipPressureMax, + SInt32 barrelPressure, + SInt32 barrelPressureMin, + SInt32 barrelPressureMax, + SInt32 tiltX, + SInt32 tiltY, + UInt32 twist, + IOOptionBits options = 0 ); + + virtual void dispatchTabletProximityEvent( + AbsoluteTime timeStamp, + UInt32 transducerID, + bool inRange, + bool invert, + UInt32 vendorTransducerUniqueID = 0, + UInt32 vendorTransducerSerialNumber = 0, + IOOptionBits options = 0 ); + +public: + bool readyForReports(); + + virtual bool init(OSDictionary * properties = 0) APPLE_KEXT_OVERRIDE; + + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + + virtual void stop( IOService * provider ) APPLE_KEXT_OVERRIDE; + + virtual bool matchPropertyTable(OSDictionary * table, SInt32 * score) APPLE_KEXT_OVERRIDE; + + virtual IOReturn setSystemProperties( OSDictionary * properties ); + + virtual IOReturn setProperties( OSObject * properties ) APPLE_KEXT_OVERRIDE; + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_12 + virtual IOReturn newUserClient( + task_t owningTask, + void * securityID, + UInt32 type, + OSDictionary * properties, + IOUserClient ** handler ) APPLE_KEXT_OVERRIDE; +#endif + +protected: + OSMetaClassDeclareReservedUsed(IOHIDEventService, 0); + virtual OSArray * getDeviceUsagePairs(); + + + OSMetaClassDeclareReservedUsed(IOHIDEventService, 1); + virtual UInt32 getReportInterval(); + + OSMetaClassDeclareReservedUsed(IOHIDEventService, 2); + enum { + kMultiAxisOptionRotationForTranslation = (1<<0), + kMultiAxisOptionZForScroll = (1<<1) + }; +/*! + @function dispatchMultiAxisPointerEvent + @abstract Dispatch multi-axis pointer event + @discussion This is meant to be used with joysticks or multi-axis pointer devices such as those with + with 6 degrees of freedom. This function will generate related relative pointer and scroll + event associated with movement. + @param timeStamp AbsoluteTime representing origination of event + @param buttonState Button mask where bit0 is the primary button, bit1 secondary and so forth + @param x Absolute location of pointer along the x-axis from -1.0 to 1.0 in 16:16 fixed point. + @param y Absolute location of pointer along the y-axis from -1.0 to 1.0 in 16:16 fixed point. + @param z Absolute location of pointer along the z-axis from -1.0 to 1.0 in 16:16 fixed point. + @param rX Absolute rotation of pointer around the x-axis from -1.0 to 1.0 in 16:16 fixed point. + @param rY Absolute rotation of pointer around the y-axis from -1.0 to 1.0 in 16:16 fixed point. + @param rZ Absolute rotation of pointer around the z-axis from -1.0 to 1.0 in 16:16 fixed point. + @param options Additional options to be used when dispatching event such as leveraging rotational + axis for translation or using the z axis for vertical scrolling. +*/ + virtual void dispatchMultiAxisPointerEvent( + AbsoluteTime timeStamp, + UInt32 buttonState, + IOFixed x, + IOFixed y, + IOFixed z, + IOFixed rX = 0, + IOFixed rY = 0, + IOFixed rZ = 0, + IOOptionBits options = 0 ); + + enum { + kDigitizerInvert = (1<<0), + + kDigitizerCapabilityButtons = (1<<16), + kDigitizerCapabilityPressure = (1<<16), + kDigitizerCapabilityTangentialPressure = (1<<16), + kDigitizerCapabilityZ = (1<<16), + kDigitizerCapabilityTiltX = (1<<16), + kDigitizerCapabilityTiltY = (1<<16), + kDigitizerCapabilityTwist = (1<<16), + }; + + enum { + kDigitizerTransducerTypeStylus = 0, + kDigitizerTransducerTypePuck, + kDigitizerTransducerTypeFinger, + kDigitizerTransducerTypeHand + }; + typedef UInt32 DigitizerTransducerType; + +/*! + @function dispatchDigitizerEvent + @abstract Dispatch tablet events without orientation + @discussion This is meant to be used with transducers without any orientation. + @param timeStamp AbsoluteTime representing origination of event + @param ID ID of the transducer generating the event + @param type Type of the transducer generating the event + @param inRange Details whether the transducer is in promitity to digitizer surface + @param buttonState Button mask where bit0 is the primary button, bit1 secondary and so forth + @param x Absolute location of transducer along the x-axis from 0.0 to 1.0 in + 16:16 fixed point. + @param y Absolute location of transducer along the y-axis from 0.0 to 1.0 in + 16:16 fixed point. + @param z Absolute location of transducer along the z-axis from 0.0 to 1.0 in + 16:16 fixed point. This is typically used to determine the distance + between the transducer and surface + @param tipPressure Absolute pressure exerted on surface by tip from 0.0 to 1.0 in 16:16 + fixed point. + @param auxPressure Absolute pressure exerted on transducer from 0.0 to 1.0 in 16:16 fixed point. + @param options Additional options to be used when dispatching event. +*/ + OSMetaClassDeclareReservedUsed(IOHIDEventService, 3); + virtual void dispatchDigitizerEvent( + AbsoluteTime timeStamp, + UInt32 transducerID, + DigitizerTransducerType type, + bool inRange, + UInt32 buttonState, + IOFixed x, + IOFixed y, + IOFixed z = 0, + IOFixed tipPressure = 0, + IOFixed auxPressure = 0, + IOFixed twist = 0, + IOOptionBits options = 0 ); + +/*! + @function dispatchDigitizerEventWithTiltOrientation + @abstract Dispatch tablet events with tilt orientation + @discussion This is meant to be used with transducers that leverage tilt orientation + @param timeStamp AbsoluteTime representing origination of event + @param ID ID of the transducer generating the event + @param type Type of the transducer generating the event + @param inRange Details whether the transducer is in promitity to digitizer surface + @param buttonState Button mask where bit0 is the primary button, bit1 secondary and so forth + @param x Absolute location of transducer along the x-axis from 0.0 to 1.0 in + 16:16 fixed point. + @param y Absolute location of transducer along the y-axis from 0.0 to 1.0 in + 16:16 fixed point. + @param z Absolute location of transducer along the z-axis from 0.0 to 1.0 in + 16:16 fixed point. This is typically used to determine the distance + between the transducer and surface + @param tipPressure Absolute pressure exerted on surface by tip from 0.0 to 1.0 in 16:16 + fixed point. + @param auxPressure Absolute pressure exerted on transducer from 0.0 to 1.0 in 16:16 fixed point. + @param twist Absolute clockwise rotation along the transducer's major axis from 0.0 to + 360.0 degrees in 16:16 fixed point. + @param tiltX Absolute plane angle between the Y-Z plane and the plane containing the + transducer axis and the Y axis. A positive X tilt is to the right. Value is + represented in degrees from -90.0 to 90.0 in 16:16 fixed point. + @param tiltY Absolute plane angle between the X-Z plane and the plane containing the + transducer axis and the X axis. A positive Y tilt is towards the user. Value + is represented in degrees from -90.0 to 90.0 in 16:16 fixed point. + @param options Additional options to be used when dispatching event. +*/ + OSMetaClassDeclareReservedUsed(IOHIDEventService, 4); + virtual void dispatchDigitizerEventWithTiltOrientation( + AbsoluteTime timeStamp, + UInt32 ID, + DigitizerTransducerType type, + bool inRange, + UInt32 buttonState, + IOFixed x, + IOFixed y, + IOFixed z = 0, + IOFixed tipPressure = 0, // 0.0-1.0 in 16:16 fixed + IOFixed auxPressure = 0, // 0.0-1.0 in 16:16 fixed + IOFixed twist = 0, + IOFixed tiltX = 0, + IOFixed tiltY = 0, + IOOptionBits options = 0 ); + +/*! + @function dispatchDigitizerEventWithPolarOrientation + @abstract Dispatch tablet events with polar orientation + @discussion This is meant to be used with transducers that leverage polar orientation + @param timeStamp AbsoluteTime representing origination of event + @param ID ID of the transducer generating the event + @param type Type of the transducer generating the event + @param inRange Details whether the transducer is in promitity to digitizer surface + @param buttonState Button mask where bit0 is the primary button, bit1 secondary and so forth + @param x Absolute location of transducer along the x-axis from 0.0 to 1.0 in + 16:16 fixed point. + @param y Absolute location of transducer along the y-axis from 0.0 to 1.0 in + 16:16 fixed point. + @param z Absolute location of transducer along the z-axis from 0.0 to 1.0 in + 16:16 fixed point. This is typically used to determine the distance + between the transducer and surface + @param tipPressure Absolute pressure exerted on surface by tip from 0.0 to 1.0 in 16:16 + fixed point. + @param auxPressure Absolute pressure exerted on transducer from 0.0 to 1.0 in 16:16 fixed point. + @param twist Absolute clockwise rotation along the transducer's major axis from 0.0 to + 360.0 degrees in 16:16 fixed point. + @param altitude Specifies angle with the X-Y plane thorugh a signed, semicircular range. + Positive values specify an angle downward and toward the positive Z axis. + Value is represented in degrees from -180.0 to 180.0 in 16:16 fixed point. + @param azimuth Counter clockwise rotation of the cursor around the Z-axis through a full + circular range. Value is represented in degrees from 0.0 to 360.0 in 16:16 + fixed point. + @param options Additional options to be used when dispatching event. +*/ + OSMetaClassDeclareReservedUsed(IOHIDEventService, 5); + virtual void dispatchDigitizerEventWithPolarOrientation( + AbsoluteTime timeStamp, + UInt32 transducerID, + DigitizerTransducerType type, + bool inRange, + UInt32 buttonState, + IOFixed x, + IOFixed y, + IOFixed z = 0, + IOFixed tipPressure = 0, // 0.0-1.0 in 16:16 fixed + IOFixed tanPressure = 0, // 0.0-1.0 in 16:16 fixed + IOFixed twist = 0, + IOFixed altitude = 0, + IOFixed azimuth = 0, + IOOptionBits options = 0 ); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_10 + /*! + @function dispatchUnicodeEvent + @abstract Dispatch unicode events + @discussion The HID specificiation provides a means to dispatch unicode characters from HID + compliant devices. The original method was to leverage the unicode page to deliver UTF-16 LE + characters by way of a usage page selector. + @param timeStamp AbsoluteTime representing origination of event + @param length Length of unicode payload + @param payload character payload + @param quality A fixed point value from 0.0 to 1.0 that represents that quality/confidence of the event. + @param options Additional options to be used when dispatching event. + */ + OSMetaClassDeclareReservedUsed(IOHIDEventService, 6); + enum { + kUnicodeEncodingTypeUTF8 = 0, + kUnicodeEncodingTypeUTF16LE, + kUnicodeEncodingTypeUTF16BE, + kUnicodeEncodingTypeUTF32LE, + kUnicodeEncodingTypeUTF32BE, + }; + typedef UInt32 UnicodeEncodingType; + + virtual void dispatchUnicodeEvent( + AbsoluteTime timeStamp, + UInt8 * payload, + UInt32 length, + UnicodeEncodingType encoding = kUnicodeEncodingTypeUTF16LE, + IOFixed quality = (1<<16), + IOOptionBits options = 0); + + +#else + OSMetaClassDeclareReservedUnused(IOHIDEventService, 6); +#endif + +private: + enum { + kDigitizerOrientationTypeTilt = 0, + kDigitizerOrientationTypePolar, + kDigitizerOrientationTypeQuality + }; + typedef UInt32 DigitizerOrientationType; + + void dispatchDigitizerEventWithOrientation( + AbsoluteTime timeStamp, + UInt32 transducerID, + DigitizerTransducerType type, + bool inRange, + UInt32 buttonState, + IOFixed x, + IOFixed y, + IOFixed z = 0, + IOFixed tipPressure = 0, + IOFixed auxPressure = 0, + IOFixed twist = 0, + DigitizerOrientationType orientationType = kDigitizerOrientationTypeTilt, + IOFixed * orientationParams = NULL, + UInt32 orientationParamCount = 0, + IOOptionBits options = 0 ); + + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_12 +public: + typedef void (*Action)(OSObject *target, OSObject * sender, void *context, OSObject *event, IOOptionBits options); + + OSMetaClassDeclareReservedUsed(IOHIDEventService, 7); + virtual bool open( + IOService * client, + IOOptionBits options, + void * context, + Action action); + +protected: + OSMetaClassDeclareReservedUsed(IOHIDEventService, 8); + virtual void dispatchEvent(IOHIDEvent * event, IOOptionBits options=0); + + OSMetaClassDeclareReservedUsed(IOHIDEventService, 9); + virtual UInt32 getPrimaryUsagePage(); + + OSMetaClassDeclareReservedUsed(IOHIDEventService, 10); + virtual UInt32 getPrimaryUsage(); + +#if TARGET_OS_OSX + static void debugActionSysdiagnose(IOHIDEventService* self, void *parameter); + static void debugActionNMI(IOHIDEventService* self, void *parameter); +#endif + +public: + OSMetaClassDeclareReservedUsed(IOHIDEventService, 11); + virtual IOHIDEvent * copyEvent( + IOHIDEventType type, + IOHIDEvent * matching = 0, + IOOptionBits options = 0); + +protected: + /*! + @function dispatchStandardGameControllerEvent + @abstract Dispatch standard game controller event + @discussion This is meant to dispatch a conforming standard game controller event that includes the + following: Direction Pad, Face Buttons, and Left and Right Shoulder Buttons. + @param timeStamp AbsoluteTime representing origination of event + @param dpadUp Direction pad up with a fixed value between 0.0 and 1.0 + @param dpadDown Direction pad down with a fixed value between 0.0 and 1.0 + @param dpadLeft Direction pad left with a fixed value between 0.0 and 1.0 + @param dpadRight Direction pad right with a fixed value between 0.0 and 1.0 + @param faceX Face button X with a fixed value between 0.0 and 1.0 + @param faceY Face button Y with a fixed value between 0.0 and 1.0 + @param faceA Face button A with a fixed value between 0.0 and 1.0 + @param faceB Face button B with a fixed value between 0.0 and 1.0 + @param shoulderL Left shoulder button with a fixed value between 0.0 and 1.0 + @param shoulderR Right shoulder button with a fixed value between 0.0 and 1.0 + @param options Additional options to be defined. + */ + OSMetaClassDeclareReservedUsed(IOHIDEventService, 12); + virtual void dispatchStandardGameControllerEvent( + AbsoluteTime timeStamp, + IOFixed dpadUp, + IOFixed dpadDown, + IOFixed dpadLeft, + IOFixed dpadRight, + IOFixed faceX, + IOFixed faceY, + IOFixed faceA, + IOFixed faceB, + IOFixed shoulderL, + IOFixed shoulderR, + IOOptionBits options = 0 ); + + /*! + @function dispatchExtendedGameControllerEvent + @abstract Dispatch extended game controller event + @discussion This is meant to dispatch a conforming extended game controller event that includes the + following: Direction Pad, Face Buttons, Left and Right Joysticks and 2 Left and 2 Right Shoulder Buttons. + @param timeStamp AbsoluteTime representing origination of event + @param dpadUp Direction pad up with a fixed value between 0.0 and 1.0 + @param dpadDown Direction pad down with a fixed value between 0.0 and 1.0 + @param dpadLeft Direction pad left with a fixed value between 0.0 and 1.0 + @param dpadRight Direction pad right with a fixed value between 0.0 and 1.0 + @param faceX Face button X with a fixed value between 0.0 and 1.0 + @param faceY Face button Y with a fixed value between 0.0 and 1.0 + @param faceA Face button A with a fixed value between 0.0 and 1.0 + @param faceB Face button B with a fixed value between 0.0 and 1.0 + @param shoulderL1 Top left shoulder button with a fixed value between 0.0 and 1.0 + @param shoulderR1 Top right shoulder button with a fixed value between 0.0 and 1.0 + @param shoulderL2 Bottom left shoulder button with a fixed value between 0.0 and 1.0 + @param shoulderR2 Bottom right shoulder button with a fixed value between 0.0 and 1.0 + @param joystickX Joystick X axis with a fixed value between -1.0 and 1.0 + @param joystickY Joystick Y axis with a fixed value between -1.0 and 1.0 + @param joystickZ Joystick Z axis with a fixed value between -1.0 and 1.0 + @param joystickRz Joystick Rz axis with a fixed value between -1.0 and 1.0 + @param options Additional options to be defined. + */ + OSMetaClassDeclareReservedUsed(IOHIDEventService, 13); + virtual void dispatchExtendedGameControllerEvent( + AbsoluteTime timeStamp, + IOFixed dpadUp, + IOFixed dpadDown, + IOFixed dpadLeft, + IOFixed dpadRight, + IOFixed faceX, + IOFixed faceY, + IOFixed faceA, + IOFixed faceB, + IOFixed shoulderL1, + IOFixed shoulderR1, + IOFixed shoulderL2, + IOFixed shoulderR2, + IOFixed joystickX, + IOFixed joystickY, + IOFixed joystickZ, + IOFixed joystickRz, + IOOptionBits options = 0 ); + + +#else +protected: + OSMetaClassDeclareReservedUnused(IOHIDEventService, 7); + OSMetaClassDeclareReservedUnused(IOHIDEventService, 8); + OSMetaClassDeclareReservedUnused(IOHIDEventService, 9); + OSMetaClassDeclareReservedUnused(IOHIDEventService, 10); + OSMetaClassDeclareReservedUnused(IOHIDEventService, 11); + OSMetaClassDeclareReservedUnused(IOHIDEventService, 12); + OSMetaClassDeclareReservedUnused(IOHIDEventService, 13); +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_12 + /*! + @function dispatchBiometricEvent + @abstract Dispatch biometric event + @param timeStamp AbsoluteTime representing origination of event. + @param level Float value from 0 - 1.0 detailing the current level. + @param eventType The type of biometric event. + @param options Additional options to be defined. + */ + OSMetaClassDeclareReservedUsed(IOHIDEventService, 14); + virtual void dispatchBiometricEvent( + AbsoluteTime timeStamp, + IOFixed level, + IOHIDBiometricEventType eventType, + IOOptionBits options = 0); +#else + OSMetaClassDeclareReservedUnused(IOHIDEventService, 14); +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_13 + /*! + @function copyEventForClient + @abstract Copy event/events for client + @dicussion function called NOT on service workloop. It is guaranteed that function call will not occur once service closed by this client + @param copySpec Event copy spec (If copySpec is an OSData object, physical copy needs to be made if callee intends to retain data) + @param options options + @param clientContext client identifier + */ + OSMetaClassDeclareReservedUsed(IOHIDEventService, 15); + virtual IOHIDEvent * copyEventForClient (OSObject * copySpec, IOOptionBits options, void * clientContext); + + /*! + @function copyPropertyForClient + @abstract Copy property for client + @dicussion function called on service workloop + @param aKey property key + @param clientContext client identifier + */ + OSMetaClassDeclareReservedUsed(IOHIDEventService, 16); + virtual OSObject * copyPropertyForClient (const char * aKey, void * clientContext) const; + + /*! + @function setPropertiesForClient + @abstract Set properties for client + @dicussion function called on service workloop + @param properties properties object + @param clientContext client identifier + */ + OSMetaClassDeclareReservedUsed(IOHIDEventService, 17); + virtual IOReturn setPropertiesForClient (OSObject * properties, void * clientContext); + + /*! + @function openForClient + @abstract open service for client + @dicussion function called on service workloop + @param client client service + @param options options + @param property client property + @param clientContext client identifier should be provided by callee, will be used for all subsequent ...Client calls. It is safe to release memory associated with parameter at close + */ + OSMetaClassDeclareReservedUsed(IOHIDEventService, 18); + virtual bool openForClient (IOService * client, IOOptionBits options, OSDictionary *property, void ** clientContext); + + /*! + @function closeForClient + @abstract close service for client + @param clientContext client identifier + @param options options + */ + OSMetaClassDeclareReservedUsed(IOHIDEventService, 19); + virtual void closeForClient(IOService *client, void *context, IOOptionBits options = 0); +#else + OSMetaClassDeclareReservedUnused(IOHIDEventService, 15); + OSMetaClassDeclareReservedUnused(IOHIDEventService, 16); + OSMetaClassDeclareReservedUnused(IOHIDEventService, 17); + OSMetaClassDeclareReservedUnused(IOHIDEventService, 18); + OSMetaClassDeclareReservedUnused(IOHIDEventService, 19); +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + /*! + @function dispatchExtendedGameControllerEvent + @abstract Dispatch extended game controller event + @discussion This is meant to dispatch a conforming extended game controller event that includes the + following: Direction Pad, Face Buttons, Left and Right Joysticks and 2 Left and 2 Right Shoulder Buttons. + @param timeStamp AbsoluteTime representing origination of event + @param dpadUp Direction pad up with a fixed value between 0.0 and 1.0 + @param dpadDown Direction pad down with a fixed value between 0.0 and 1.0 + @param dpadLeft Direction pad left with a fixed value between 0.0 and 1.0 + @param dpadRight Direction pad right with a fixed value between 0.0 and 1.0 + @param faceX Face button X with a fixed value between 0.0 and 1.0 + @param faceY Face button Y with a fixed value between 0.0 and 1.0 + @param faceA Face button A with a fixed value between 0.0 and 1.0 + @param faceB Face button B with a fixed value between 0.0 and 1.0 + @param shoulderL1 Top left shoulder button with a fixed value between 0.0 and 1.0 + @param shoulderR1 Top right shoulder button with a fixed value between 0.0 and 1.0 + @param shoulderL2 Bottom left shoulder button with a fixed value between 0.0 and 1.0 + @param shoulderR2 Bottom right shoulder button with a fixed value between 0.0 and 1.0 + @param joystickX Joystick X axis with a fixed value between -1.0 and 1.0 + @param joystickY Joystick Y axis with a fixed value between -1.0 and 1.0 + @param joystickZ Joystick Z axis with a fixed value between -1.0 and 1.0 + @param joystickRz Joystick Rz axis with a fixed value between -1.0 and 1.0 + @param thumbstickButtonLeft Joystick left thumbstick button with boolean value true/false for button down/up + @param thumbstickButtonRight Joystick right thumbstick button with boolean value true/false for button down/up + @param options Additional options to be defined. + */ + OSMetaClassDeclareReservedUsed(IOHIDEventService, 20); + virtual void dispatchExtendedGameControllerEventWithThumbstickButtons( + AbsoluteTime timeStamp, + IOFixed dpadUp, + IOFixed dpadDown, + IOFixed dpadLeft, + IOFixed dpadRight, + IOFixed faceX, + IOFixed faceY, + IOFixed faceA, + IOFixed faceB, + IOFixed shoulderL1, + IOFixed shoulderR1, + IOFixed shoulderL2, + IOFixed shoulderR2, + IOFixed joystickX, + IOFixed joystickY, + IOFixed joystickZ, + IOFixed joystickRz, + boolean_t thumbstickButtonLeft, + boolean_t thumbstickButtonRight, + IOOptionBits options = 0 ); +#else + OSMetaClassDeclareReservedUnused(IOHIDEventService, 20); +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + OSMetaClassDeclareReservedUsed(IOHIDEventService, 21); + virtual IOHIDEvent *copyMatchingEvent(OSDictionary *matching); +#else + OSMetaClassDeclareReservedUnused(IOHIDEventService, 21); +#endif + + OSMetaClassDeclareReservedUnused(IOHIDEventService, 22); + OSMetaClassDeclareReservedUnused(IOHIDEventService, 23); + OSMetaClassDeclareReservedUnused(IOHIDEventService, 24); + OSMetaClassDeclareReservedUnused(IOHIDEventService, 25); + OSMetaClassDeclareReservedUnused(IOHIDEventService, 26); + OSMetaClassDeclareReservedUnused(IOHIDEventService, 27); + OSMetaClassDeclareReservedUnused(IOHIDEventService, 28); + OSMetaClassDeclareReservedUnused(IOHIDEventService, 29); + OSMetaClassDeclareReservedUnused(IOHIDEventService, 30); + OSMetaClassDeclareReservedUnused(IOHIDEventService, 31); + +public: +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_12 + virtual void close( IOService * forClient, IOOptionBits options = 0 ) APPLE_KEXT_OVERRIDE; +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15 + /*! @function message + @abstract Receives messages delivered from an attached provider. + @discussion Handles the kIOMessageDeviceSignaledWakeup message + from a provider identifying the IOHIDDevice as the wakeup source. + @param type A type defined in IOMessage.h. + @param provider The provider from which the message originates. + @param argument An argument defined by the message type. + @result An IOReturn code defined by the message type. + */ + + virtual IOReturn message(UInt32 type, IOService * provider, void * argument) APPLE_KEXT_OVERRIDE; +#endif +}; + +#endif /* !_IOKIT_HID_IOHIDEVENTSERVICE_H */ diff --git a/QualcommWireless/include/IOKit/hid/IOHIDEventServiceKeys.h b/QualcommWireless/include/IOKit/hid/IOHIDEventServiceKeys.h new file mode 100644 index 0000000..595c458 --- /dev/null +++ b/QualcommWireless/include/IOKit/hid/IOHIDEventServiceKeys.h @@ -0,0 +1,132 @@ +/* + * + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 2019 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef IOHIDEventServiceKeys_h +#define IOHIDEventServiceKeys_h + +/*! + * @define kIOHIDPointerAccelerationKey + * + * @abstract + * Number property that contains the pointer acceleration value. + */ +#define kIOHIDPointerAccelerationKey "HIDPointerAcceleration" + +/*! + * @define kIOHIDPointerAccelerationTypeKey + * + * @abstract + * String property containing the type of acceleration for pointer. + * Supported types are: + * kIOHIDPointerAccelerationKey + * kIOHIDMouseScrollAccelerationKey + * kIOHIDTrackpadAccelerationType + */ +#define kIOHIDPointerAccelerationTypeKey "HIDPointerAccelerationType" + +/*! + * @define kIOHIDMouseScrollAccelerationKey + * + * @abstract + * Number property that contains the mouse scroll acceleration value. + */ +#define kIOHIDMouseScrollAccelerationKey "HIDMouseScrollAcceleration" + +/*! + * @define kIOHIDMouseAccelerationTypeKey + * + * @abstract + * Number property that contains the mouse acceleration value. + */ +#define kIOHIDMouseAccelerationTypeKey "HIDMouseAcceleration" + +/*! + * @define kIOHIDScrollAccelerationKey + * + * @abstract + * Number property that contains the scroll acceleration value. + */ +#define kIOHIDScrollAccelerationKey "HIDScrollAcceleration" + +/*! + * @define kIOHIDScrollAccelerationTypeKey + * + * @abstract + * Number property containing the type of acceleration for scroll. + * Supported types are: + * kIOHIDMouseScrollAccelerationKey + * kIOHIDTrackpadScrollAccelerationKey + */ +#define kIOHIDScrollAccelerationTypeKey "HIDScrollAccelerationType" + +/*! + * @define kIOHIDDigitizerTipThresholdKey + * + * @abstract + * Number property that describes the threshold percentage for when the tip + * pressure of a digitizer stylus should change from hovering to dragging. + * + * @discussion + * If a digitizer stylus supports the kHIDUsage_Dig_TipPressure (0x30) usage, + * the service may optionally publish this key to describe the value at which + * the pressure should change the pointer behavior from hovering to dragging. + * The value is a percentage from 0 to 100, where 100 percent is equal to the + * logical max that the stylus dispatches. If no value is provided, the default + * value of 75 will be used. + */ +#define kIOHIDDigitizerTipThresholdKey "DigitizerTipThreshold" + +/*! + * @define kIOHIDSurfaceDimensionsKey + * + * @abstract + * Dictionary property published on a service that describes the surface + * dimensions for services that publish absolute X/Y values, such as digitizer + * and pointer devices. The dictionary will contain the kIOHIDWidthKey and + * kIOHIDHeightKey keys described below. Value is in millimeter represented + * as IOFixed. + */ +#define kIOHIDSurfaceDimensionsKey "SurfaceDimensions" + +/*! + * @define kIOHIDWidthKey + * + * @abstract + * Number property used in the surface dimensions dictionary described above. + * Default value represents the physical max - physical min of the absolute + * X value. + */ +#define kIOHIDWidthKey "Width" + +/*! + * @define kIOHIDHeightKey + * + * @abstract + * Number property used in the surface dimensions dictionary described above. + * Default value represents the physical max - physical min of the absolute + * Y value. + */ +#define kIOHIDHeightKey "Height" + +#endif /* IOHIDDeviceTypes_h */ diff --git a/QualcommWireless/include/IOKit/hid/IOHIDEventServiceKeys_Private.h b/QualcommWireless/include/IOKit/hid/IOHIDEventServiceKeys_Private.h new file mode 100644 index 0000000..eb71209 --- /dev/null +++ b/QualcommWireless/include/IOKit/hid/IOHIDEventServiceKeys_Private.h @@ -0,0 +1,60 @@ +/* + * + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 2019 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef IOHIDEventServiceKeys_Private_h +#define IOHIDEventServiceKeys_Private_h + + +/*! + * @define kIOHIDMaxEventSizeKey + * + * @abstract + * Number property that describes the max event size in bytes that the event + * service will dispatch. If this property is not provided, the default max + * size will be set to 4096 bytes. + */ +#define kIOHIDMaxEventSizeKey "MaxEventSize" + +/*! + * @define kIOHIDMaxReportSizeKey + * + * @abstract + * Number property that describes the max report size in bytes that the device + * will dispatch. If this property is not provided, the + * kIOHIDMaxInputReportSizeKey key will be used. + */ +#define kIOHIDMaxReportSizeKey "MaxReportSize" + +/*! + * @define kIOHIDReportPoolSizeKey + * + * @abstract + * Number property that describes the amount of report buffers that should + * be created for handling reports. If this property is not provided, the + * default value of 1 will be used. + */ +#define kIOHIDReportPoolSizeKey "ReportPoolSize" + + +#endif /* IOHIDEventServiceKeys_Private_h */ diff --git a/QualcommWireless/include/IOKit/hid/IOHIDEventServiceTypes.h b/QualcommWireless/include/IOKit/hid/IOHIDEventServiceTypes.h new file mode 100644 index 0000000..94d7ed9 --- /dev/null +++ b/QualcommWireless/include/IOKit/hid/IOHIDEventServiceTypes.h @@ -0,0 +1,74 @@ +/* + * + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 2019 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef IOHIDEventServiceTypes_h +#define IOHIDEventServiceTypes_h + +/*! + * @typedef IOHIDKeyboardEventOptions + * + * @abstract + * Keyboard event options passed in to dispatchKeyboardEvent function in + * IOHIDEventService. + * + * @field kIOHIDKeyboardEventOptionsNoKeyRepeat + * Default behavior for keyboard events is to repeat keys if the key has been + * held down for a certain amount of time defined in system preferences. Pass + * in this option to not apply key repeat logic to this event. + */ +typedef enum { + kIOHIDKeyboardEventOptionsNoKeyRepeat = (1 << 8), +} IOHIDKeyboardEventOptions; + +/*! + * @typedef IOHIDPointerEventOptions + * + * @abstract + * Pointer event options passed in to dispatch(Relative/Absolute)PointerEvent + * function in IOHIDEventService. + * + * @field kIOHIDPointerEventOptionsNoAcceleration + * Pointer events are subject to an acceleration algorithm. Pass in this option + * if you do not wish to have acceleration logic applied to the pointer event. + */ +typedef enum { + kIOHIDPointerEventOptionsNoAcceleration = (1 << 8), +} IOHIDPointerEventOptions; + +/*! + * @typedef IOHIDScrollEventOptions + * + * @abstract + * Scroll event options passed in to dispatchScrollEvent function in + * IOHIDEventService. + * + * @field kIOHIDScrollEventOptionsNoAcceleration + * Scroll events are subject to an acceleration algorithm. Pass in this option + * if you do not wish to have acceleration logic applied to the scroll event. + */ +typedef enum { + kIOHIDScrollEventOptionsNoAcceleration = (1 << 8), +} IOHIDScrollEventOptions; + +#endif /* IOHIDEventServiceTypes_h */ diff --git a/QualcommWireless/include/IOKit/hid/IOHIDEventTypes.h b/QualcommWireless/include/IOKit/hid/IOHIDEventTypes.h new file mode 100644 index 0000000..9f37f49 --- /dev/null +++ b/QualcommWireless/include/IOKit/hid/IOHIDEventTypes.h @@ -0,0 +1,723 @@ +/* + * + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOHIDEVENTTYPES_H +#define _IOKIT_IOHIDEVENTTYPES_H /* { */ + +#include + +#if TARGET_OS_DRIVERKIT +#include +#else +#include +#endif + +#define IOHIDEventTypeMask(type) (1LL< +#else +#include +#endif + +enum { + kIOHIDGenericGestureTypeTap = 0, + kIOHIDGenericGestureTypeSwipe +}; + +enum { + kIOHIDDigitizerOrientationTypeTilt = 0, + kIOHIDDigitizerOrientationTypePolar, + kIOHIDDigitizerOrientationTypeQuality +}; + +enum { + kIOHIDEventFieldMultiAxisPointerButtonNumber = kIOHIDEventFieldButtonNumber, + kIOHIDEventFieldMultiAxisPointerButtonClickCount = kIOHIDEventFieldButtonClickCount, + kIOHIDEventFieldMultiAxisPointerButtonPressure = kIOHIDEventFieldButtonPressure +}; + +enum { + kIOHIDEventFieldPointerButtonNumber = kIOHIDEventFieldButtonNumber, + kIOHIDEventFieldPointerButtonClickCount = kIOHIDEventFieldButtonClickCount, + kIOHIDEventFieldPointerButtonPressure = kIOHIDEventFieldButtonPressure +}; + +/* DEPRECATED: use pointer field */ +enum { + kIOHIDEventFieldMouseX = kIOHIDEventFieldPointerX, + kIOHIDEventFieldMouseY = kIOHIDEventFieldPointerY, + kIOHIDEventFieldMouseZ = kIOHIDEventFieldPointerZ, + kIOHIDEventFieldMouseButtonMask = kIOHIDEventFieldPointerButtonMask, + kIOHIDEventFieldMouseNumber = kIOHIDEventFieldPointerButtonNumber, + kIOHIDEventFieldMouseClickCount = kIOHIDEventFieldPointerButtonClickCount, + kIOHIDEventFieldMousePressure = kIOHIDEventFieldPointerButtonPressure +}; + +/* DEPRECATED: misspelled */ +enum { + kIOHIDEventFieldNavagationSwipeFlavor = kIOHIDEventFieldNavigationSwipeFlavor +}; + +enum { + kIOHIDEventFieldForceLean = kIOHIDEventFieldForceStagePressure, + kIOHIDEventFieldForceTransitionProgress = kIOHIDEventFieldForceProgress +}; + +enum { + kIOHIDEventFieldDigitizerEstimatedMask = (kIOHIDEventFieldDigitizerBase | 30) +}; + +/*! + @typedef IOHIDMotionType + @abstract Type of Motion event triggered. + @constant kIOHIDMotionTypeNormal + @constant kIOHIDMotionTypeShake + */ +enum { + kIOHIDMotionTypeNormal = 0, + kIOHIDMotionTypeShake = 1, + kIOHIDMotionTypePath = 2 +}; +typedef uint32_t IOHIDMotionType; + +/*! + @typedef IOHIDMotionPath + @abstract Type of Motion Path event triggered. + @constant IOHIDMotionPathStart + @constant IOHIDMotionPathEnd + */ +enum { + kIOHIDMotionPathStart = 0, + kIOHIDMotionPathEnd = 1, +}; +typedef uint32_t IOHIDMotionPath; + +// Legacy +enum { + kIOHIDAccelerometerTypeNormal = kIOHIDMotionTypeNormal, + kIOHIDAccelerometerTypeShake = kIOHIDMotionTypeShake, + kIOHIDGyroTypeNormal = kIOHIDMotionTypeNormal, + kIOHIDGyroTypeShake = kIOHIDMotionTypeShake, +}; + +typedef IOHIDMotionType IOHIDAccelerometerType; +typedef IOHIDMotionPath IOHIDAccelerometerSubType; + + +typedef IOHIDMotionType IOHIDGyroType; +typedef IOHIDMotionPath IOHIDGyroSubType; + + +typedef IOHIDMotionType IOHIDCompassType; +typedef IOHIDMotionPath IOHIDCompassSubType; + + +enum { + kIOHIDKeyboardLongPress = 1, + kIOHIDKeyboardLongPressBit = 0, + kIOHIDKeyboardLongPressMask = (kIOHIDKeyboardLongPress << kIOHIDKeyboardLongPressBit), +}; + +enum { + kIOHIDKeyboardClickSpeedNone = 0, + kIOHIDKeyboardClickSpeedSlow = 1, + kIOHIDKeyboardClickSpeedNormal = 2, + kIOHIDKeyboardClickSpeedFast = 3, + kIOHIDKeyboardClickSpeedStartBit = 1, + kIOHIDKeyboardClickSpeedMask = (0x3 << kIOHIDKeyboardClickSpeedStartBit), +}; + +enum { + kIOHIDKeyboardSlowKeyNone = 0, + kIOHIDKeyboardSlowKeyPhaseStart = 1, + kIOHIDKeyboardSlowKeyPhaseAbort = 2, + kIOHIDKeyboardSlowKeyOn = 3, + kIOHIDKeyboardSlowKeyPhaseBit = 3, + kIOHIDKeyboardSlowKeyPhaseMask = (0x3 << kIOHIDKeyboardSlowKeyPhaseBit), +}; + +enum { + kIOHIDKeyboardMouseKeyToggle = 1, + kIOHIDKeyboardMouseKeyToggleBit = 5, + kIOHIDKeyboardMouseKeyToggleMask = (1 << kIOHIDKeyboardMouseKeyToggleBit), +}; + + +/*! + @typedef IOHIDPowerType + @abstract Type of Power event triggered. + @constant kIOHIDPowerTypePower + @constant kIOHIDPowerTypeCurrent + @constant kIOHIDPowerTypeVoltage + */ +enum { + kIOHIDPowerTypePower = 0, + kIOHIDPowerTypeCurrent = 1, + kIOHIDPowerTypeVoltage = 2 +}; +typedef uint32_t IOHIDPowerType; + +/*! + @typedef IOHIDPowerSubType + @abstract Reserved + @constant kIOHIDPowerSubTypeNormal + @constant kIOHIDPowerSubTypeCumulative + */ +enum { + kIOHIDPowerSubTypeNormal = 0, + kIOHIDPowerSubTypeCumulative +}; +typedef uint32_t IOHIDPowerSubType; + + +/*! + @typedef IOHIDBiometricEventType + @abstract Type of biometric event triggered. + @constant kIOHIDBiometricEventTypeHumanProximity + @constant kIOHIDBiometricEventTypeHumanTouch + @constant kIOHIDBiometricEventTypeHumanForce + @constant kIOHIDBiometricEventTypeHumanPresence + */ +enum { + kIOHIDBiometricEventTypeHumanProximity = 0, + kIOHIDBiometricEventTypeHumanTouch, + kIOHIDBiometricEventTypeHumanForce, + kIOHIDBiometricEventTypeHumanPresence +}; + +typedef uint32_t IOHIDBiometricEventType; + + + + + +enum { + kIOHIDUnicodeEncodingTypeUTF8, + kIOHIDUnicodeEncodingTypeUTF16LE, + kIOHIDUnicodeEncodingTypeUTF16BE, + kIOHIDUnicodeEncodingTypeUTF32LE, + kIOHIDUnicodeEncodingTypeUTF32BE, +}; +typedef uint32_t IOHIDUnicodeEncodingType; + + +/*! + @typedef IOHIDMotionActivityEventType + @abstract Type of motion activity event triggered. + @constant kIOHIDMotionActivityEventTypeUnknown + @constant kIOHIDMotionActivityEventTypeStatic + @constant kIOHIDMotionActivityEventTypeMoving + @constant kIOHIDMotionActivityEventTypeSemiStationary + @constant kIOHIDMotionActivityEventTypeWalking + @constant kIOHIDMotionActivityEventTypeRunning + @constant kIOHIDMotionActivityEventTypeCycling + @constant kIOHIDMotionActivityEventTypeInVehicleStatic + @constant kIOHIDMotionActivityEventTypeDriving + */ +enum { + kIOHIDMotionActivityEventTypeUnknown = 0, + kIOHIDMotionActivityEventTypeStatic, + kIOHIDMotionActivityEventTypeMoving, + kIOHIDMotionActivityEventTypeSemiStationary, + kIOHIDMotionActivityEventTypeWalking, + kIOHIDMotionActivityEventTypeRunning, + kIOHIDMotionActivityEventTypeCycling, + kIOHIDMotionActivityEventTypeInVehicleStatic, + kIOHIDMotionActivityEventTypeDriving, +}; + +typedef uint32_t IOHIDMotionActivityEventType; + + +/*! + @typedef IOHIDMotionGestureEventType + @abstract Type of motion gesture event triggered. + @constant kIOHIDMotionGestureEventTypeUnknown + @constant kIOHIDMotionGestureEventTypeRaiseToListen + @constant kIOHIDMotionGestureEventTypeRaiseToLook +*/ +enum { + kIOHIDMotionGestureEventTypeUnknown = 0, + kIOHIDMotionGestureEventTypeRaiseToListen, + kIOHIDMotionGestureEventTypeRaiseToLook, +}; + + +/*! + @typedef IOHIDSwipeMask + @abstract Mask detailing the type of swipe detected. + @constant kIOHIDSwipeUp + @constant kIOHIDSwipeDown + @constant kIOHIDSwipeLeft + @constant kIOHIDSwipeRight +*/ +enum { + kIOHIDSwipeNone = 0, + kIOHIDSwipeUp = 1<<0, + kIOHIDSwipeDown = 1<<1, + kIOHIDSwipeLeft = 1<<2, + kIOHIDSwipeRight = 1<<3, + kIOHIDScaleExpand = 1<<4, + kIOHIDScaleContract = 1<<5, + kIOHIDRotateCW = 1<<6, + kIOHIDRotateCCW = 1<<7, +}; +typedef uint32_t IOHIDSwipeMask; + +/*! + @typedef IOHIDGestureMotion + @abstract Motion gestures + @constant kIOHIDGestureMotionNone + @constant kIOHIDGestureMotionHorizontalX + @constant kIOHIDGestureMotionVerticalY + @constant kIOHIDGestureMotionScale + @constant kIOHIDGestureMotionRotate + @constant kIOHIDGestureMotionTap + @constant kIOHIDGestureMotionDoubleTap + @constant kIOHIDGestureMotionFromLeftEdge + @constant kIOHIDGestureMotionOffLeftEdge + @constant kIOHIDGestureMotionFromRightEdge + @constant kIOHIDGestureMotionOffRightEdge + @constant kIOHIDGestureMotionFromTopEdge + @constant kIOHIDGestureMotionOffTopEdge + @constant kIOHIDGestureMotionFromBottomEdge + @constant kIOHIDGestureMotionOffBottomEdge +*/ +enum { + kIOHIDGestureMotionNone, + kIOHIDGestureMotionHorizontalX, + kIOHIDGestureMotionVerticalY, + kIOHIDGestureMotionScale, + kIOHIDGestureMotionRotate, + kIOHIDGestureMotionTap, + kIOHIDGestureMotionDoubleTap, + kIOHIDGestureMotionFromLeftEdge, + kIOHIDGestureMotionOffLeftEdge, + kIOHIDGestureMotionFromRightEdge, + kIOHIDGestureMotionOffRightEdge, + kIOHIDGestureMotionFromTopEdge, + kIOHIDGestureMotionOffTopEdge, + kIOHIDGestureMotionFromBottomEdge, + kIOHIDGestureMotionOffBottomEdge, +}; +typedef uint16_t IOHIDGestureMotion; + +/*! + @typedef IOHIDGestureFlavor + @abstract Gesture flavours + @constant kIOHIDGestureFlavorNone + @constant kIOHIDGestureFlavorNotificationCenterPrimary + @constant kIOHIDGestureFlavorNotificationCenterSecondary + @constant kIOHIDGestureFlavorDockPrimary + @constant kIOHIDGestureFlavorDockSecondary + @constant kIOHIDGestureFlavorNavagationPrimary + @constant kIOHIDGestureFlavorNavagationSecondary + @constant kIOHIDGestureFlavorControlCenterPrimary + @constant kIOHIDGestureFlavorControlCenterSecondary +*/ +enum { + kIOHIDGestureFlavorNone, + kIOHIDGestureFlavorNotificationCenterPrimary, + kIOHIDGestureFlavorNotificationCenterSecondary, + kIOHIDGestureFlavorDockPrimary, + kIOHIDGestureFlavorDockSecondary, + kIOHIDGestureFlavorNavagationPrimary, + kIOHIDGestureFlavorNavagationSecondary, + kIOHIDGestureFlavorControlCenterPrimary, + kIOHIDGestureFlavorControlCenterSecondary, +}; +typedef uint16_t IOHIDGestureFlavor; + +/*! + @typedef IOHIDProximityDetectionMask + @abstract Proximity mask detailing the inputs that were detected. + @constant kIOHIDProximityDetectionLargeBodyContact + @constant kIOHIDProximityDetectionLargeBodyFarField + @constant kIOHIDProximityDetectionIrregularObjects + @constant kIOHIDProximityDetectionEdgeStraddling + @constant kIOHIDProximityDetectionFlatFingerClasp + @constant kIOHIDProximityDetectionFingerTouch + @constant kIOHIDProximityDetectionReceiver + @constant kIOHIDProximityDetectionSmallObjectsHovering + @constant kIOHIDProximityDetectionReceiverCrude + @constant kIOHIDProximityDetectionReceiverMonitoring +*/ +enum { + kIOHIDProximityDetectionLargeBodyContact = 1<<0, + kIOHIDProximityDetectionLargeBodyFarField = 1<<1, + kIOHIDProximityDetectionIrregularObjects = 1<<2, + kIOHIDProximityDetectionEdgeStraddling = 1<<3, + kIOHIDProximityDetectionFlatFingerClasp = 1<<4, + kIOHIDProximityDetectionFingerTouch = 1<<5, + kIOHIDProximityDetectionReceiver = 1<<6, + kIOHIDProximityDetectionSmallObjectsHovering = 1<<7, + kIOHIDProximityDetectionReceiverCrude = 1<<8, + kIOHIDProximityDetectionReceiverMonitoring = 1<<9 +}; +typedef uint32_t IOHIDProximityDetectionMask; + +/*! + @typedef IOHIDDigitizerType + @abstract The type of digitizer path initiating an event. + @constant kIOHIDDigitizerTransducerTypeStylus + @constant kIOHIDDigitizerTransducerTypePuck + @constant kIOHIDDigitizerTransducerTypeFinger + @constant kIOHIDDigitizerTransducerTypeHand +*/ +enum { + kIOHIDDigitizerTransducerTypeStylus = 0, + kIOHIDDigitizerTransducerTypePuck, + kIOHIDDigitizerTransducerTypeFinger, + kIOHIDDigitizerTransducerTypeHand +}; +typedef uint32_t IOHIDDigitizerTransducerType; + +/*! + @typedef IOHIDDigitizerEventMask + @abstract Event mask detailing the events being dispatched by a digitizer. + @discussion It is possible for digitizer events to contain child digitizer events, effectively, behaving as collections. + In the collection case, the child event mask field referrence by kIOHIDEventFieldDigitizerChildEventMask will detail the + cumulative event state of the child digitizer events. +
+ Please Note: + If you append a child digitizer event to a parent digitizer event, appropriate state will be transfered on to the parent. + @constant kIOHIDDigitizerEventRange Issued when the range state has changed. + @constant kIOHIDDigitizerEventTouch Issued when the touch state has changed. + @constant kIOHIDDigitizerEventPosition Issued when the position has changed. + @constant kIOHIDDigitizerEventStop Issued when motion has achieved a state of calculated non-movement. + @constant kIOHIDDigitizerEventPeak Issues when new maximum values have been detected. + @constant kIOHIDDigitizerEventIdentity Issued when the identity has changed. + @constant kIOHIDDigitizerEventAttribute Issued when an attribute has changed. + @constant kIOHIDDigitizerEventCancel + @constant kIOHIDDigitizerEventResting + @constant kIOHIDDigitizerEventFromEdgeFlat Issued when a digitizer approaches from the edge with flattened presentation + @constant kIOHIDDigitizerEventFromEdgeTip Issued when a digitizer approaches from the edge with standard (i.e. un-flattened) presentation. + @constant kIOHIDDigitizerEventFromCorner Issued when a digitizer approaches from a corner + @constant kIOHIDDigitizerEventSwipePending Issued to indicate that an edge swipe is pending + @constant kIOHIDDigitizerEventFromEdgeForcePending Issued to indicate that edge press is pending + @constant kIOHIDDigitizerEventFromEdgeForceActive Issued to indicate that edge press is active + @constant kIOHIDDigitizerEventUpSwipe Issued when an up swipe has been detected. + @constant kIOHIDDigitizerEventDownSwipe Issued when an down swipe has been detected. + @constant kIOHIDDigitizerEventLeftSwipe Issued when an left swipe has been detected. + @constant kIOHIDDigitizerEventRightSwipe Issued when an right swipe has been detected. + @constant kIOHIDDigitizerEventSwipeMask Mask used to gather swipe events. +*/ +enum { + kIOHIDDigitizerEventRange = 1<<0, + kIOHIDDigitizerEventTouch = 1<<1, + kIOHIDDigitizerEventPosition = 1<<2, + kIOHIDDigitizerEventStop = 1<<3, + kIOHIDDigitizerEventPeak = 1<<4, + kIOHIDDigitizerEventIdentity = 1<<5, + kIOHIDDigitizerEventAttribute = 1<<6, + kIOHIDDigitizerEventCancel = 1<<7, + kIOHIDDigitizerEventStart = 1<<8, + kIOHIDDigitizerEventResting = 1<<9, + kIOHIDDigitizerEventFromEdgeFlat = 1<<10, + kIOHIDDigitizerEventFromEdgeTip = 1<<11, + kIOHIDDigitizerEventFromCorner = 1<<12, + kIOHIDDigitizerEventSwipePending = 1<<13, + kIOHIDDigitizerEventFromEdgeForcePending = 1<<14, + kIOHIDDigitizerEventFromEdgeForceActive = 1<<15, + kIOHIDDigitizerEventTap = 1<<17, + kIOHIDDigitizerEventSwipeLocked = 1<<18, + kIOHIDDigitizerEventSwipeUp = 1<<24, + kIOHIDDigitizerEventSwipeDown = 1<<25, + kIOHIDDigitizerEventSwipeLeft = 1<<26, + kIOHIDDigitizerEventSwipeRight = 1<<27, + kIOHIDDigitizerEventEstimatedAltitude = 1<<28, + kIOHIDDigitizerEventEstimatedAzimuth = 1<<29, + kIOHIDDigitizerEventEstimatedPressure = 1<<30, + kIOHIDDigitizerEventSwipeMask = 0xF<<24, +}; +typedef uint32_t IOHIDDigitizerEventMask; + +/*! + @typedef IOHIDDigitizerEventUpdateMask + @abstract Bit mask detailing the fields that have or will change in a digitizer event +*/ +enum { + kIOHIDDigitizerEventUpdateXMask = 1< +#include +#include +#include +#include + +class IOHIDDevice; +class IOBufferMemoryDescriptor; +class OSAction; + +/*! @class IOHIDInterface : public IOService + @abstract In kernel interface to a HID device. +*/ + +class IOHIDInterface : public IOService +{ + OSDeclareDefaultStructorsWithDispatch( IOHIDInterface ) + +public: + + /*! @typedef IOHIDInterface::InterruptReportAction + @abstract Callback to handle an asynchronous report received from + the HID device. + @discussion This callback is set when calling IOHIDInterface::open. + @param target Pointer to your data object. + @param timestamp Time when the report was delivered. + @param report A memory descriptor that describes the report. + @param type The type of report. + @param reportID The ID of the report. + @param refcon void * pointer to more data. + */ + typedef void (*InterruptReportAction)( + OSObject * target, + AbsoluteTime timestamp, + IOMemoryDescriptor * report, + IOHIDReportType type, + UInt32 reportID, + void * refcon); + + /*! + @typedef IOHIDInterface::CompletionAction + @discussion Function called when HID I/O completes. + @param target Pointer to your data object. + @param refcon void * pointer to more data. + @param status Completion status. + @param bufferSizeRemaining Bytes left to be transferred. + */ + + typedef void (*CompletionAction)( + OSObject * target, + void * refcon, + IOReturn status, + UInt32 bufferSizeRemaining); + +private: + IOHIDDevice * _owner; + OSArray * _elementArray; + InterruptReportAction _interruptAction; + void * _interruptRefCon; + OSObject * _interruptTarget; + OSString * _transportString; + OSString * _manufacturerString; + OSString * _productString; + OSString * _serialNumberString; + UInt32 _locationID; + UInt32 _vendorID; + UInt32 _vendorIDSource; + UInt32 _productID; + UInt32 _version; + UInt32 _countryCode; + IOByteCount _maxReportSize[kIOHIDReportTypeCount]; + + struct ExpansionData { + UInt32 reportInterval; + OSAction *reportAction; + IOWorkLoop *workLoop; + IOCommandGate *commandGate; + OSArray *deviceElements; + OSSet *reportPool; + bool opened; + bool sleeping; + }; + + /*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData * _reserved; + + bool openGated(IOService *forClient, IOOptionBits options, OSAction *action); + void handleReportGated(AbsoluteTime timestamp, + IOMemoryDescriptor *report, + IOHIDReportType type, + UInt32 reportID, + void *ctx); + IOReturn addReportToPoolGated(IOMemoryDescriptor *report); + +protected: + + void HandleReportPrivate(AbsoluteTime timestamp, + IOMemoryDescriptor * report, + IOHIDReportType type, + UInt32 reportID, + void * ctx); + + + /*! + @function free + @abstract Free the IOHIDInterface object. + @discussion Release all resources that were previously allocated, + then call super::free() to propagate the call to our superclass. + */ + + virtual void free() APPLE_KEXT_OVERRIDE; + +public: + + static IOHIDInterface * withElements ( OSArray * elements ); + + /*! + @function init + @abstract Initialize an IOHIDInterface object. + @discussion Prime the IOHIDInterface object and prepare it to support + a probe() or a start() call. This implementation will simply call + super::init(). + @param dictionary A dictionary associated with this IOHIDInterface + instance. + @result True on sucess, or false otherwise. + */ + + virtual bool init( OSDictionary * dictionary = 0 ) APPLE_KEXT_OVERRIDE; + + /*! + @function start + @abstract Start up the driver using the given provider. + @discussion IOHIDInterface will allocate resources. Before returning true + to indicate success, registerService() is called to trigger client matching. + @param provider The provider that the driver was matched to, and selected + to run with. + @result True on success, or false otherwise. + */ + + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + + + virtual void stop( IOService * provider ) APPLE_KEXT_OVERRIDE; + /*! + @function matchPropertyTable + @abstract Called by the provider during a match + @discussion Compare the properties in the supplied table to this + object's properties. + @param table The property table that this device will match against + */ + + virtual bool matchPropertyTable( + OSDictionary * table, + SInt32 * score) APPLE_KEXT_OVERRIDE; + + virtual bool open ( + IOService * client, + IOOptionBits options, + InterruptReportAction action, + void * refCon); + + virtual void close( + IOService * client, + IOOptionBits options = 0 ) APPLE_KEXT_OVERRIDE; + + using IOService::setProperty; + virtual bool setProperty( const OSSymbol * aKey, OSObject * anObject) APPLE_KEXT_OVERRIDE; + + virtual OSString * getTransport (); + virtual UInt32 getLocationID (); + virtual UInt32 getVendorID (); + virtual UInt32 getVendorIDSource (); + virtual UInt32 getProductID (); + virtual UInt32 getVersion (); + virtual UInt32 getCountryCode (); + virtual OSString * getManufacturer (); + virtual OSString * getProduct (); + virtual OSString * getSerialNumber (); + virtual IOByteCount getMaxReportSize (IOHIDReportType type); + + virtual OSArray * createMatchingElements ( + OSDictionary * matching = 0, + IOOptionBits options = 0); + + virtual void handleReport ( + AbsoluteTime timeStamp, + IOMemoryDescriptor * report, + IOHIDReportType reportType, + UInt32 reportID, + IOOptionBits options = 0); + + virtual IOReturn setReport ( + IOMemoryDescriptor * report, + IOHIDReportType reportType, + UInt32 reportID = 0, + IOOptionBits options = 0); + + virtual IOReturn getReport ( + IOMemoryDescriptor * report, + IOHIDReportType reportType, + UInt32 reportID = 0, + IOOptionBits options = 0); + + virtual IOReturn setReport ( + IOMemoryDescriptor * report, + IOHIDReportType reportType, + UInt32 reportID, + IOOptionBits options, + UInt32 completionTimeout, + CompletionAction * completion = 0); + + virtual IOReturn getReport ( + IOMemoryDescriptor * report, + IOHIDReportType reportType, + UInt32 reportID, + IOOptionBits options, + UInt32 completionTimeout, + CompletionAction * completion = 0); + virtual IOReturn message( + UInt32 type, + IOService * provider, + void * argument = NULL) APPLE_KEXT_OVERRIDE; + + OSMetaClassDeclareReservedUsed(IOHIDInterface, 0); + virtual UInt32 getReportInterval (); + + OSMetaClassDeclareReservedUnused(IOHIDInterface, 1); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 2); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 3); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 4); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 5); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 6); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 7); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 8); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 9); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 10); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 11); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 12); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 13); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 14); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 15); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 16); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 17); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 18); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 19); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 20); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 21); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 22); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 23); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 24); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 25); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 26); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 27); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 28); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 29); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 30); + OSMetaClassDeclareReservedUnused(IOHIDInterface, 31); +}; + +#endif /* !_IOKIT_HID_IOHIDINTERFACE_H */ diff --git a/QualcommWireless/include/IOKit/hid/IOHIDKeys.h b/QualcommWireless/include/IOKit/hid/IOHIDKeys.h new file mode 100644 index 0000000..203b5c0 --- /dev/null +++ b/QualcommWireless/include/IOKit/hid/IOHIDKeys.h @@ -0,0 +1,375 @@ +/* + * + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_HID_IOHIDKEYS_H_ +#define _IOKIT_HID_IOHIDKEYS_H_ + +#include +#include +#include +#include +#include +#include +#include + +__BEGIN_DECLS + +/* The following keys are used to search the IORegistry for HID related services +*/ + +/* This is used to find HID Devices in the IORegistry */ +#define kIOHIDDeviceKey "IOHIDDevice" + +/*! + @defined HID Device Property Keys + @abstract Keys that represent properties of a paticular device. + @discussion Keys that represent properties of a paticular device. Can be added + to your matching dictionary when refining searches for HID devices. +

+ Please note:
+ kIOHIDPrimaryUsageKey and kIOHIDPrimaryUsagePageKey are no longer + rich enough to describe a device's capabilities. Take, for example, a + device that describes both a keyboard and a mouse in the same descriptor. + The previous behavior was to only describe the keyboard behavior with the + primary usage and usage page. Needless to say, this would sometimes cause + a program interested in mice to skip this device when matching. +
+ Thus we have added 3 + additional keys: +
    +
  • kIOHIDDeviceUsageKey
  • +
  • kIOHIDDeviceUsagePageKey
  • +
  • kIOHIDDeviceUsagePairsKey
  • +
+ kIOHIDDeviceUsagePairsKey is used to represent an array of dictionaries containing + key/value pairs referenced by kIOHIDDeviceUsageKey and kIOHIDDeviceUsagePageKey. + These usage pairs describe all application type collections (behaviors) defined + by the device. +

+ An application intersted in only matching on one criteria would only add the + kIOHIDDeviceUsageKey and kIOHIDDeviceUsagePageKey keys to the matching dictionary. + If it is interested in a device that has multiple behaviors, the application would + instead add an array or dictionaries referenced by kIOHIDDeviceUsagePairsKey to his + matching dictionary. +*/ +#define kIOHIDVendorIDSourceKey "VendorIDSource" +#define kIOHIDStandardTypeKey "StandardType" +#define kIOHIDSampleIntervalKey "SampleInterval" +#define kIOHIDResetKey "Reset" +#define kIOHIDKeyboardLanguageKey "KeyboardLanguage" +#define kIOHIDAltHandlerIdKey "alt_handler_id" +#define kIOHIDDisplayIntegratedKey "DisplayIntegrated" +#define kIOHIDProductIDMaskKey "ProductIDMask" +#define kIOHIDProductIDArrayKey "ProductIDArray" +#define kIOHIDPowerOnDelayNSKey "HIDPowerOnDelayNS" +#define kIOHIDCategoryKey "Category" +#define kIOHIDMaxResponseLatencyKey "MaxResponseLatency" +#define kIOHIDUniqueIDKey "UniqueID" +#define kIOHIDModelNumberKey "ModelNumber" + + +#define kIOHIDTransportUSBValue "USB" +#define kIOHIDTransportBluetoothValue "Bluetooth" +#define kIOHIDTransportBluetoothLowEnergyValue "BluetoothLowEnergy" +#define kIOHIDTransportAIDBValue "AID" +#define kIOHIDTransportI2CValue "I2C" +#define kIOHIDTransportSPIValue "SPI" +#define kIOHIDTransportSerialValue "Serial" +#define kIOHIDTransportIAPValue "iAP" +#define kIOHIDTransportAirPlayValue "AirPlay" +#define kIOHIDTransportSPUValue "SPU" +#define kIOHIDTransportBTAACPValue "BT-AACP" + + +#define kIOHIDCategoryAutomotiveValue "Automotive" + +/*! + @define kIOHIDElementKey + @abstract Keys that represents an element property. + @discussion Property for a HID Device or element dictionary. + Elements can be heirarchical, so they can contain other elements. +*/ +#define kIOHIDElementKey "Elements" + +/*! + @defined HID Element Dictionary Keys + @abstract Keys that represent properties of a particular elements. + @discussion These keys can also be added to a matching dictionary + when searching for elements via copyMatchingElements. +*/ +#define kIOHIDElementCookieKey "ElementCookie" +#define kIOHIDElementTypeKey "Type" +#define kIOHIDElementCollectionTypeKey "CollectionType" +#define kIOHIDElementUsageKey "Usage" +#define kIOHIDElementUsagePageKey "UsagePage" +#define kIOHIDElementMinKey "Min" +#define kIOHIDElementMaxKey "Max" +#define kIOHIDElementScaledMinKey "ScaledMin" +#define kIOHIDElementScaledMaxKey "ScaledMax" +#define kIOHIDElementSizeKey "Size" +#define kIOHIDElementReportSizeKey "ReportSize" +#define kIOHIDElementReportCountKey "ReportCount" +#define kIOHIDElementReportIDKey "ReportID" +#define kIOHIDElementIsArrayKey "IsArray" +#define kIOHIDElementIsRelativeKey "IsRelative" +#define kIOHIDElementIsWrappingKey "IsWrapping" +#define kIOHIDElementIsNonLinearKey "IsNonLinear" +#define kIOHIDElementHasPreferredStateKey "HasPreferredState" +#define kIOHIDElementHasNullStateKey "HasNullState" +#define kIOHIDElementFlagsKey "Flags" +#define kIOHIDElementUnitKey "Unit" +#define kIOHIDElementUnitExponentKey "UnitExponent" +#define kIOHIDElementNameKey "Name" +#define kIOHIDElementValueLocationKey "ValueLocation" +#define kIOHIDElementDuplicateIndexKey "DuplicateIndex" +#define kIOHIDElementParentCollectionKey "ParentCollection" +#define kIOHIDElementVariableSizeKey "VariableSize" + +#ifndef __ppc__ + #define kIOHIDElementVendorSpecificKey "VendorSpecific" +#else + #define kIOHIDElementVendorSpecificKey "VendorSpecifc" +#endif + +/*! + @defined HID Element Match Keys + @abstract Keys used for matching particular elements. + @discussion These keys should only be used with a matching + dictionary when searching for elements via copyMatchingElements. +*/ +#define kIOHIDElementCookieMinKey "ElementCookieMin" +#define kIOHIDElementCookieMaxKey "ElementCookieMax" +#define kIOHIDElementUsageMinKey "UsageMin" +#define kIOHIDElementUsageMaxKey "UsageMax" + +/*! + @defined kIOHIDElementCalibrationMinKey + @abstract The minimum bounds for a calibrated value. +*/ +#define kIOHIDElementCalibrationMinKey "CalibrationMin" + +/*! + @defined kIOHIDElementCalibrationMaxKey + @abstract The maximum bounds for a calibrated value. +*/ +#define kIOHIDElementCalibrationMaxKey "CalibrationMax" + +/*! + @defined kIOHIDElementCalibrationSaturationMinKey + @abstract The mininum tolerance to be used when calibrating a logical element value. + @discussion The saturation property is used to allow for slight differences in the minimum and maximum value returned by an element. +*/ +#define kIOHIDElementCalibrationSaturationMinKey "CalibrationSaturationMin" + +/*! + @defined kIOHIDElementCalibrationSaturationMaxKey + @abstract The maximum tolerance to be used when calibrating a logical element value. + @discussion The saturation property is used to allow for slight differences in the minimum and maximum value returned by an element. +*/ +#define kIOHIDElementCalibrationSaturationMaxKey "CalibrationSaturationMax" + +/*! + @defined kIOHIDElementCalibrationDeadZoneMinKey + @abstract The minimum bounds near the midpoint of a logical value in which the value is ignored. + @discussion The dead zone property is used to allow for slight differences in the idle value returned by an element. +*/ +#define kIOHIDElementCalibrationDeadZoneMinKey "CalibrationDeadZoneMin" + +/*! + @defined kIOHIDElementCalibrationDeadZoneMinKey + @abstract The maximum bounds near the midpoint of a logical value in which the value is ignored. + @discussion The dead zone property is used to allow for slight differences in the idle value returned by an element. +*/ +#define kIOHIDElementCalibrationDeadZoneMaxKey "CalibrationDeadZoneMax" + +/*! + @defined kIOHIDElementCalibrationGranularityKey + @abstract The scale or level of detail returned in a calibrated element value. + @discussion Values are rounded off such that if granularity=0.1, values after calibration are 0, 0.1, 0.2, 0.3, etc. +*/ +#define kIOHIDElementCalibrationGranularityKey "CalibrationGranularity" + +/*! + @defined kIOHIDKeyboardSupportsEscKey + @abstract Describe if keyboard device supports esc key. + @discussion Keyboard devices having full HID keyboard descriptor can specify if esc key is actually supported or not. For new macs with TouchBar this is ideal scenario where keyboard descriptor by defaultspecifies presence of esc key but through given property client can check if key is present or not + */ +#define kIOHIDKeyboardSupportsEscKey "HIDKeyboardSupportsEscKey" + +/*! + @typedef IOHIDOptionsType + @abstract Options for opening a device via IOHIDLib. + @constant kIOHIDOptionsTypeNone Default option. + @constant kIOHIDOptionsTypeSeizeDevice Used to open exclusive + communication with the device. This will prevent the system + and other clients from receiving events from the device. +*/ +enum { + kIOHIDOptionsTypeNone = 0x00, + kIOHIDOptionsTypeSeizeDevice = 0x01 +}; +typedef uint32_t IOHIDOptionsType; + + +/*! + @typedef IOHIDQueueOptionsType + @abstract Options for creating a queue via IOHIDLib. + @constant kIOHIDQueueOptionsTypeNone Default option. + @constant kIOHIDQueueOptionsTypeEnqueueAll Force the IOHIDQueue + to enqueue all events, relative or absolute, regardless of change. +*/ +enum { + kIOHIDQueueOptionsTypeNone = 0x00, + kIOHIDQueueOptionsTypeEnqueueAll = 0x01 +}; +typedef uint32_t IOHIDQueueOptionsType; + +/*! + @typedef IOHIDStandardType + @abstract Type to define what industrial standard the device is referencing. + @constant kIOHIDStandardTypeANSI ANSI. + @constant kIOHIDStandardTypeISO ISO. + @constant kIOHIDStandardTypeJIS JIS. + @constant kIOHIDStandardTypeUnspecified. +*/ +enum { + kIOHIDStandardTypeANSI = 0x0, + kIOHIDStandardTypeISO = 0x1, + kIOHIDStandardTypeJIS = 0x2, + kIOHIDStandardTypeUnspecified = 0xFFFFFFFF, +}; +typedef uint32_t IOHIDStandardType; + +#define kIOHIDDigitizerGestureCharacterStateKey "DigitizerCharacterGestureState" + +/* + * kIOHIDSystemButtonPressedDuringDarkBoot - Used to message that a wake button was pressed during dark boot + */ +#define kIOHIDSystemButtonPressedDuringDarkBoot iokit_family_msg(sub_iokit_hidsystem, 7) + +/*! + @defined IOHIDKeyboard Keys + @abstract Keys that represent parameters of keyboards. + @discussion Legacy IOHIDKeyboard keys, formerly in IOHIDPrivateKeys. See IOHIDServiceKeys.h for the new keys. + */ +#define kIOHIDKeyboardCapsLockDelay "CapsLockDelay" +#define kIOHIDKeyboardEjectDelay "EjectDelay" + +/*! + @defined kFnFunctionUsageMapKey + @abstract top row key remapping for consumer usages + @discussion string of comma separated uint64_t value representing (usagePage<<32) | usage pairs + + */ +#define kFnFunctionUsageMapKey "FnFunctionUsageMap" + +/*! + @defined kFnKeyboardUsageMapKey + @abstract top row key reampping for consumer usages + @discussion string of comma separated uint64_t value representing (usagePage<<32) | usage pairs + + */ +#define kFnKeyboardUsageMapKey "FnKeyboardUsageMap" + +#define kNumLockKeyboardUsageMapKey "NumLockKeyboardUsageMap" + +#define kKeyboardUsageMapKey "KeyboardUsageMap" + +/*! + @defined kIOHIDDeviceOpenedByEventSystemKey + @abstract Property set when corresponding event service object opened by HID event system + @discussion boolean value + + */ +#define kIOHIDDeviceOpenedByEventSystemKey "DeviceOpenedByEventSystem" + +/*! + * @define kIOHIDDeviceSuspendKey + * + * @abstract + * Boolean property set on a user space IOHIDDeviceRef to suspend report delivery + * to registered callbacks. + * + * @discussion + * When set to true, the callbacks registered via the following API will not be invoked: + * IOHIDDeviceRegisterInputReportCallback + * IOHIDDeviceRegisterInputReportWithTimeStampCallback + * IOHIDDeviceRegisterInputValueCallback + * To resume report delivery, this property should be set to false. + */ +#define kIOHIDDeviceSuspendKey "IOHIDDeviceSuspend" + + + +/*! + @defined kIOHIDSensorPropertyReportIntervalKey + @abstract Property to get or set the Report Interval in us of supported sensor devices + @discussion Corresponds to kHIDUsage_Snsr_Property_ReportInterval in a sensor device's + descriptor. + */ +#define kIOHIDSensorPropertyReportIntervalKey kIOHIDReportIntervalKey + +/*! + @defined kIOHIDSensorPropertySampleIntervalKey + @abstract Property to get or set the Sample Interval in us of supported sensor devices + @discussion Corresponds to kHIDUsage_Snsr_Property_SamplingRate in a sensor device's + descriptor. + */ +#define kIOHIDSensorPropertySampleIntervalKey kIOHIDSampleIntervalKey + +/*! + @defined kIOHIDSensorPropertyBatchIntervalKey + @abstract Property to get or set the Batch Interval / Report Latency in us of supported sensor devices + @discussion Corresponds to kHIDUsage_Snsr_Property_ReportLatency in a sensor device's + descriptor. + */ +#define kIOHIDSensorPropertyBatchIntervalKey kIOHIDBatchIntervalKey + +/*! + @defined kIOHIDSensorPropertyReportLatencyKey + @abstract Alias of kIOHIDSensorPropertyBatchIntervalKey + */ +#define kIOHIDSensorPropertyReportLatencyKey kIOHIDSensorPropertyBatchIntervalKey + +/*! + @defined kIOHIDSensorPropertyMaxFIFOEventsKey + @abstract Property to get or set the maximum FIFO event queue size of supported sensor devices + @discussion Corresponds to kHIDUsage_Snsr_Property_MaxFIFOEvents in a sensor device's + descriptor. + */ +#define kIOHIDSensorPropertyMaxFIFOEventsKey "MaxFIFOEvents" + +/*! + @defined kIOHIDDigitizerSurfaceSwitchKey + @abstract Property to turn on / of surface digitizer contact reporting + @discussion To allow for better power management, a host may wish to indicate what it would like a touchpad digitizer to not report surface digitizer contacts by clearing this + flag. By default, upon cold‐boot/power cycle, touchpads that support reporting surface + contacts shall do so by default. +*/ + +#define kIOHIDDigitizerSurfaceSwitchKey "DigitizerSurfaceSwitch" + +__END_DECLS + +#endif /* !_IOKIT_HID_IOHIDKEYS_H_ */ diff --git a/QualcommWireless/include/IOKit/hid/IOHIDPrivateKeys.h b/QualcommWireless/include/IOKit/hid/IOHIDPrivateKeys.h new file mode 100644 index 0000000..939411e --- /dev/null +++ b/QualcommWireless/include/IOKit/hid/IOHIDPrivateKeys.h @@ -0,0 +1,242 @@ +/* + * + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 1999-2009 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_HID_IOHIDPRIVATEKEYS_H_ +#define _IOKIT_HID_IOHIDPRIVATEKEYS_H_ + +#include +#include +#include +#include + +__BEGIN_DECLS + +/*! + @defined HID Device Property Keys + @abstract Keys that represent properties of a paticular device. + @discussion Keys that represent properties of a paticular element. Can be added + to your matching dictionary when refining searches for HID devices. +*/ +#define kIOHIDInputReportElementsKey "InputReportElements" + +#define kIOHIDReportModeKey "ReportMode" + +typedef enum { + kIOHIDReportModeTypeNormal = 0, + kIOHIDReportModeTypeFiltered +} IOHIDReportModeType; + +/* Following table is used to convert Apple USB keyboard IDs into a numbering + scheme that can be combined with ADB handler IDs for both Cocoa and Carbon */ +enum { + kgestUSBUnknownANSIkd = 3, /* Unknown ANSI keyboard */ + kgestUSBGenericANSIkd = 40, /* Generic ANSI keyboard */ + kgestUSBGenericISOkd = 41, /* Generic ANSI keyboard */ + kgestUSBGenericJISkd = 42, /* Generic ANSI keyboard */ + + kgestUSBCosmoANSIKbd = 198, /* (0xC6) Gestalt Cosmo USB Domestic (ANSI) Keyboard */ + kprodUSBCosmoANSIKbd = 0x201, // The actual USB product ID in hardware + kgestUSBCosmoISOKbd = 199, /* (0xC7) Cosmo USB International (ISO) Keyboard */ + kprodUSBCosmoISOKbd = 0x202, + kgestUSBCosmoJISKbd = 200, /* (0xC8) Cosmo USB Japanese (JIS) Keyboard */ + kprodUSBCosmoJISKbd = 0x203, + kgestUSBAndyANSIKbd = 204, /* (0xCC) Andy USB Keyboard Domestic (ANSI) Keyboard */ + kprodUSBAndyANSIKbd = 0x204, + kgestUSBAndyISOKbd = 205, /* (0xCD) Andy USB Keyboard International (ISO) Keyboard */ + kprodUSBAndyISOKbd = 0x205, + kgestUSBAndyJISKbd = 206, /* (0xCE) Andy USB Keyboard Japanese (JIS) Keyboard */ + kprodUSBAndyJISKbd = 0x206, + + kgestQ6ANSIKbd = 31, /* (031) Apple Q6 Keyboard Domestic (ANSI) Keyboard */ + kprodQ6ANSIKbd = 0x208, + kgestQ6ISOKbd = 32, /* (32) Apple Q6 Keyboard International (ISO) Keyboard */ + kprodQ6ISOKbd = 0x209, + kgestQ6JISKbd = 33, /* (33) Apple Q6 Keyboard Japanese (JIS) Keyboard */ + kprodQ6JISKbd = 0x20a, + + kgestQ30ANSIKbd = 34, /* (34) Apple Q30 Keyboard Domestic (ANSI) Keyboard */ + kprodQ30ANSIKbd = 0x20b, + kgestQ30ISOKbd = 35, /* (35) Apple Q30 Keyboard International (ISO) Keyboard */ + kprodQ30ISOKbd = 0x20c, + kgestQ30JISKbd = 36, /* (36) Apple Q30 Keyboard Japanese (JIS) Keyboard */ + kprodQ30JISKbd = 0x20d, + + kgestFountainANSIKbd = 37, /* (37) Apple Fountain Keyboard Domestic (ANSI) Keyboard */ + kprodFountainANSIKbd = 0x20e, + kgestFountainISOKbd = 38, /* (38) Apple Fountain Keyboard International (ISO) Keyboard */ + kprodFountainISOKbd = 0x20f, + kgestFountainJISKbd = 39, /* (39) Apple Fountain Keyboard Japanese (JIS) Keyboard */ + kprodFountainJISKbd = 0x210, + + kgestSantaANSIKbd = 37, /* (37) Apple Santa Keyboard Domestic (ANSI) Keyboard */ + kprodSantaANSIKbd = 0x211, + kgestSantaISOKbd = 38, /* (38) Apple Santa Keyboard International (ISO) Keyboard */ + kprodSantaISOKbd = 0x212, + kgestSantaJISKbd = 39, /* (39) Apple Santa Keyboard Japanese (JIS) Keyboard */ + kprodSantaJISKbd = 0x213, + + kgestM89ISOKbd = 47, /* (47) Apple M89 Wired (ISO) Keyboard */ + kgestM90ISOKbd = 44 /* (44) Apple M90 Wireless (ISO) Keyboard */ +}; + +/*! + @defined kIOHIDLogLevelKey + @abstract Level of detailed logging generated by device driver. + @discussion The values should match level used in syslog and asl. +*/ + +#define kIOHIDLogLevelKey "LogLevel" + +typedef enum { + kIOHIDLogLevelTypeEmergency = 0, + kIOHIDLogLevelTypeAlert, + kIOHIDLogLevelTypeCritical, + kIOHIDLogLevelTypeError, + kIOHIDLogLevelTypeWarning, + kIOHIDLogLevelTypeNotice, + kIOHIDLogLevelTypeInfo, + kIOHIDLogLevelTypeDebug, + kIOHIDLogLevelTypeTrace +} IOHIDLogLevelType; + +/*! + @defined kIOHIDTraceConfigKey + @abstract enable/configure ktrace signposts + @discussion property should be set on event system +*/ + +#define kIOHIDDebugConfigKey "HIDDebug" + +enum { + kIOHIDDebugTraceWithKTrace = 0x1, + kIOHIDDebugTraceWithOsLog = 0x2, + kIOHIDDebugTraceUserDevice = 0x4, + kIOHIDDebugTraceEventSystem = 0x8, + kIOHIDDebugPerfEvent = 0x10, +}; + +/*! + @defined kIOHIDPerfKey + @abstract tag events with perf event + @discussion perf event will be added as child to top level event +*/ + +#define kIOHIDPerfEventKey "PerfEvent" + + +/*! + @defined HID Element Dictionary Keys + @abstract Keys that represent properties of a particular elements. + @discussion These keys can also be added to a matching dictionary + when searching for elements via copyMatchingElements. +*/ +#define kIOHIDElementCollectionCookieKey "CollectionCookie" + +#define kIOHIDAbsoluteAxisBoundsRemovalPercentage "AbsoluteAxisBoundsRemovalPercentage" + +#define kIOHIDEventServiceQueueSize "QueueSize" +#define kIOHIDAltSenderIdKey "alt_sender_id" + +/*! + * @define kIOHIDMaxReportBufferCountKey + * @abstract Number property published on an IOHIDDevice that contains the + * report buffer count. + * @discussion HID devices can have the concept of a report buffer, wherein + * reports can be enqueued and dispatched in quick succession. + * A report buffer count can be published to help determine the + * correct queue size that will be able to handle incoming report + * rates. The queue size is determined by report buffer count + * multiplied by the report buffer's entry size (see + * kIOHIDReportBufferEntrySizeKey below). + */ +#define kIOHIDMaxReportBufferCountKey "MaxReportBufferCount" + +/*! + * @define kIOHIDReportBufferEntrySizeKey + * @abstract Number property published on an IOHIDDevice that contains + * the report buffer's entry size. + * @discussion Used in conjunction with kIOHIDMaxReportBufferCountKey. + * This key describes the entry size of the reports (in bytes) + * in the report buffer. The queue size is determined by the + * report buffer's report count multiplied by the entry size. + */ +#define kIOHIDReportBufferEntrySizeKey "ReportBufferEntrySize" + +#define kIOHIDAppleVendorSupported "AppleVendorSupported" + +#define kIOHIDSetButtonPropertiesKey "SetButtonProperties" +#define kIOHIDSetButtonPriorityKey "SetButtonPriority" +#define kIOHIDSetButtonDelayKey "SetButtonDelay" +#define kIOHIDSetButtonLoggingKey "SetButtonLogging" + +#define kIOHIDSetDoubleClickTimeoutKey "SetDoubleClickTimeout" + +#define kIOHIDSupportsGlobeKeyKey "SupportsGlobeKey" + +#define kIOHIDCompatibilityInterface "HIDCompatibilityInterface" + +#define kIOHIDAuthenticatedDeviceKey "Authenticated" + + +/*! + @typedef IOHIDGameControllerType + @abstract Describes support game controller types. + @constant kIOHIDGameControllerTypeStandard Standard game controller. + @constant kIOHIDGameControllerTypeExtended Extended game controller. + */ +enum { + kIOHIDGameControllerTypeStandard, + kIOHIDGameControllerTypeExtended +}; +typedef uint32_t IOHIDGameControllerType; + +#define kIOHIDGameControllerTypeKey "GameControllerType" + +#define kIOHIDGameControllerFormFittingKey "GameControllerFormFitting" + + +#define kIOHIDFastPathHasEntitlementKey "FastPathHasEntitlement" + + +/*! + @typedef IOHIDHomeButtonType + @abstract Integer value that describes the type of home/menu button on the device. + @discussion For use with MobileGestalt key kMGQHomeButtonType. This query is + applicable to standard iOS. Use with other platforms or nonstandard + iOS devices could have unexpected results. + @constant kIOHIDHomeButtonTypeMechanical Mechanical home button. + @constant kIOHIDHomeButtonTypeSSHB "Solid-state" virtual home button. + @constant kIOHIDHomeButtonTypeNone No home button - e.g. on-screen virtual home bar. + */ +typedef enum { + kIOHIDHomeButtonTypeMechanical = 0, + kIOHIDHomeButtonTypeSSHB = 1, + kIOHIDHomeButtonTypeNone = 2 +} IOHIDHomeButtonType; + + + +__END_DECLS + +#endif /* !_IOKIT_HID_IOHIDPRIVATEKEYS_H_ */ diff --git a/QualcommWireless/include/IOKit/hid/IOHIDProperties.h b/QualcommWireless/include/IOKit/hid/IOHIDProperties.h new file mode 100644 index 0000000..c172dff --- /dev/null +++ b/QualcommWireless/include/IOKit/hid/IOHIDProperties.h @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2016 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef IOHIDProperties_h +#define IOHIDProperties_h + +#include + +/*! + * @define kIOHIDMouseAccelerationType + * + * @abstract CFNumber that contains the mouse acceleration value. + */ +#define kIOHIDMouseAccelerationType "HIDMouseAcceleration" + +/*! + * @define kIOHIDPointerButtonMode + * + * @abstract CFNumber containing the current pointer button mode. + * See IOHIDButtonModes enumerator for possible modes. + */ +#define kIOHIDPointerButtonMode "HIDPointerButtonMode" +#define kIOHIDPointerButtonModeKey kIOHIDPointerButtonMode + +/*! + * @define kIOHIDUserUsageMapKey + * + * @abstract CFArray of dictionaries that contain user defined key mappings. + */ +#define kIOHIDUserKeyUsageMapKey "UserKeyMapping" + +/*! + * @define kIOHIDKeyboardCapsLockDelayOverride + * + * @abstract CFNumber containing the delay (in ms) before the caps lock key is activated. + */ +#define kIOHIDKeyboardCapsLockDelayOverride "CapsLockDelayOverride" +#define kIOHIDKeyboardCapsLockDelayOverrideKey kIOHIDKeyboardCapsLockDelayOverride + +/*! + * @define kIOHIDServiceEjectDelayKey + * + * @abstract CFNumber containing the delay (in ms) before the eject key is activated. + */ +#define kIOHIDServiceEjectDelayKey "EjectDelay" + +/*! + * @define kIOHIDServiceInitialKeyRepeatDelayKey + * + * @abstract CFNumber containing the delay (in ns) before the initial key repeat. + * If value is 0, there are no repeats. + */ +#define kIOHIDServiceInitialKeyRepeatDelayKey "HIDInitialKeyRepeat" + +/*! + * @define kIOHIDServiceKeyRepeatDelayKey + * + * @abstract CFNumber containing the delay (in ns) for subsequent key repeats. + * If value is 0, there are no repeats (including initial). + */ +#define kIOHIDServiceKeyRepeatDelayKey "HIDKeyRepeat" + +/*! + * @define kIOHIDIdleTimeMicrosecondsKey + * + * @abstract CFNumber containing the HID idle time in microseconds. + */ +#define kIOHIDIdleTimeMicrosecondsKey "HIDIdleTimeMicroseconds" + +/*! + * @define kIOHIDServiceCapsLockStateKey + * + * @abstract CFBoolean for setting/getting the caps lock state of the + * service. The caps lock LED will be updated to reflect the state. + */ +#define kIOHIDServiceCapsLockStateKey "HIDCapsLockState" + +#endif /* IOHIDProperties_h */ diff --git a/QualcommWireless/include/IOKit/hid/IOHIDUsageTables.h b/QualcommWireless/include/IOKit/hid/IOHIDUsageTables.h new file mode 100644 index 0000000..77db996 --- /dev/null +++ b/QualcommWireless/include/IOKit/hid/IOHIDUsageTables.h @@ -0,0 +1,2591 @@ +/* + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +#ifndef _IOHIDUSAGETABLES_H +#define _IOHIDUSAGETABLES_H + +/* ****************************************************************************************** + * HID Usage Tables + * + * The following constants are from the USB 'HID Usage Tables' specification, revision 1.1rc3 + * ****************************************************************************************** */ + + +/* Usage Pages */ +enum +{ + kHIDPage_Undefined = 0x00, + kHIDPage_GenericDesktop = 0x01, + kHIDPage_Simulation = 0x02, + kHIDPage_VR = 0x03, + kHIDPage_Sport = 0x04, + kHIDPage_Game = 0x05, + kHIDPage_GenericDeviceControls = 0x06, + kHIDPage_KeyboardOrKeypad = 0x07, /* USB Device Class Definition for Human Interface Devices (HID). Note: the usage type for all key codes is Selector (Sel). */ + kHIDPage_LEDs = 0x08, + kHIDPage_Button = 0x09, + kHIDPage_Ordinal = 0x0A, + kHIDPage_Telephony = 0x0B, + kHIDPage_Consumer = 0x0C, + kHIDPage_Digitizer = 0x0D, + /* Reserved 0x0E */ + kHIDPage_PID = 0x0F, /* USB Physical Interface Device definitions for force feedback and related devices. */ + kHIDPage_Unicode = 0x10, + /* Reserved 0x11 - 0x13 */ + kHIDPage_AlphanumericDisplay = 0x14, + /* Reserved 0x15 - 0x1F */ + kHIDPage_Sensor = 0x20, + /* Reserved 0x21 - 0x7f */ + kHIDPage_Monitor = 0x80, + kHIDPage_MonitorEnumerated = 0x81, + kHIDPage_MonitorVirtual = 0x82, + kHIDPage_MonitorReserved = 0x83, + /* Power 0x84 - 0x87 USB Device Class Definition for Power Devices */ + kHIDPage_PowerDevice = 0x84, /* Power Device Page */ + kHIDPage_BatterySystem = 0x85, /* Battery System Page */ + kHIDPage_PowerReserved = 0x86, + kHIDPage_PowerReserved2 = 0x87, + /* Reserved 0x88 - 0x8B */ + kHIDPage_BarCodeScanner = 0x8C, /* (Point of Sale) USB Device Class Definition for Bar Code Scanner Devices */ + kHIDPage_WeighingDevice = 0x8D, /* (Point of Sale) USB Device Class Definition for Weighing Devices */ + kHIDPage_Scale = 0x8D, /* (Point of Sale) USB Device Class Definition for Scale Devices */ + kHIDPage_MagneticStripeReader = 0x8E, + /* ReservedPointofSalepages 0x8F */ + kHIDPage_CameraControl = 0x90, /* USB Device Class Definition for Image Class Devices */ + kHIDPage_Arcade = 0x91, /* OAAF Definitions for arcade and coinop related Devices */ + /* Reserved 0x92 - 0xFEFF */ + /* VendorDefined 0xFF00 - 0xFFFF */ + kHIDPage_VendorDefinedStart = 0xFF00 +}; + +/* Undefined Usage for all usage pages */ +enum +{ + kHIDUsage_Undefined = 0x00 +}; + +/* GenericDesktop Page (0x01) */ +enum +{ + kHIDUsage_GD_Pointer = 0x01, /* Physical Collection */ + kHIDUsage_GD_Mouse = 0x02, /* Application Collection */ + /* 0x03 Reserved */ + kHIDUsage_GD_Joystick = 0x04, /* Application Collection */ + kHIDUsage_GD_GamePad = 0x05, /* Application Collection */ + kHIDUsage_GD_Keyboard = 0x06, /* Application Collection */ + kHIDUsage_GD_Keypad = 0x07, /* Application Collection */ + kHIDUsage_GD_MultiAxisController = 0x08, /* Application Collection */ + kHIDUsage_GD_TabletPCSystemControls = 0x09, /* Application Collection */ + kHIDUsage_GD_AssistiveControl = 0x0A, /* Application Collection */ + kHIDUsage_GD_SpatialController = 0x0F, /* Application Collection */ + kHIDUsage_GD_AssistiveControlCompatible = 0x10, /* Application Collection */ + /* 0x0B - 0x2F Reserved */ + kHIDUsage_GD_X = 0x30, /* Dynamic Value */ + kHIDUsage_GD_Y = 0x31, /* Dynamic Value */ + kHIDUsage_GD_Z = 0x32, /* Dynamic Value */ + kHIDUsage_GD_Rx = 0x33, /* Dynamic Value */ + kHIDUsage_GD_Ry = 0x34, /* Dynamic Value */ + kHIDUsage_GD_Rz = 0x35, /* Dynamic Value */ + kHIDUsage_GD_Slider = 0x36, /* Dynamic Value */ + kHIDUsage_GD_Dial = 0x37, /* Dynamic Value */ + kHIDUsage_GD_Wheel = 0x38, /* Dynamic Value */ + kHIDUsage_GD_Hatswitch = 0x39, /* Dynamic Value */ + kHIDUsage_GD_CountedBuffer = 0x3A, /* Logical Collection */ + kHIDUsage_GD_ByteCount = 0x3B, /* Dynamic Value */ + kHIDUsage_GD_MotionWakeup = 0x3C, /* One-Shot Control */ + kHIDUsage_GD_Start = 0x3D, /* On/Off Control */ + kHIDUsage_GD_Select = 0x3E, /* On/Off Control */ + /* 0x3F Reserved */ + kHIDUsage_GD_Vx = 0x40, /* Dynamic Value */ + kHIDUsage_GD_Vy = 0x41, /* Dynamic Value */ + kHIDUsage_GD_Vz = 0x42, /* Dynamic Value */ + kHIDUsage_GD_Vbrx = 0x43, /* Dynamic Value */ + kHIDUsage_GD_Vbry = 0x44, /* Dynamic Value */ + kHIDUsage_GD_Vbrz = 0x45, /* Dynamic Value */ + kHIDUsage_GD_Vno = 0x46, /* Dynamic Value */ + /* 0x47 - 0x7F Reserved */ + kHIDUsage_GD_SystemControl = 0x80, /* Application Collection */ + kHIDUsage_GD_SystemPowerDown = 0x81, /* One-Shot Control */ + kHIDUsage_GD_SystemSleep = 0x82, /* One-Shot Control */ + kHIDUsage_GD_SystemWakeUp = 0x83, /* One-Shot Control */ + kHIDUsage_GD_SystemContextMenu = 0x84, /* One-Shot Control */ + kHIDUsage_GD_SystemMainMenu = 0x85, /* One-Shot Control */ + kHIDUsage_GD_SystemAppMenu = 0x86, /* One-Shot Control */ + kHIDUsage_GD_SystemMenuHelp = 0x87, /* One-Shot Control */ + kHIDUsage_GD_SystemMenuExit = 0x88, /* One-Shot Control */ + kHIDUsage_GD_SystemMenuSelect = 0x89, /* Selector */ + kHIDUsage_GD_SystemMenu = kHIDUsage_GD_SystemMenuSelect, /* Selector */ + kHIDUsage_GD_SystemMenuRight = 0x8A, /* Re-Trigger Control */ + kHIDUsage_GD_SystemMenuLeft = 0x8B, /* Re-Trigger Control */ + kHIDUsage_GD_SystemMenuUp = 0x8C, /* Re-Trigger Control */ + kHIDUsage_GD_SystemMenuDown = 0x8D, /* Re-Trigger Control */ + /* 0x8E - 0x8F Reserved */ + kHIDUsage_GD_DPadUp = 0x90, /* On/Off Control */ + kHIDUsage_GD_DPadDown = 0x91, /* On/Off Control */ + kHIDUsage_GD_DPadRight = 0x92, /* On/Off Control */ + kHIDUsage_GD_DPadLeft = 0x93, /* On/Off Control */ + kHIDUsage_GD_IndexTrigger = 0x94, /* On/Off Control */ + kHIDUsage_GD_PalmTrigger = 0x95, /* On/Off Control */ + kHIDUsage_GD_Thumbstick = 0x96, /* On/Off Control */ + /* 0x94 - 0xFFFF Reserved */ + kHIDUsage_GD_Reserved = 0xFFFF +}; + +/* Simulation Page (0x02) */ +/* This section provides detailed descriptions of the usages employed by simulation devices. */ +enum +{ + kHIDUsage_Sim_FlightSimulationDevice = 0x01, /* Application Collection */ + kHIDUsage_Sim_AutomobileSimulationDevice = 0x02, /* Application Collection */ + kHIDUsage_Sim_TankSimulationDevice = 0x03, /* Application Collection */ + kHIDUsage_Sim_SpaceshipSimulationDevice = 0x04, /* Application Collection */ + kHIDUsage_Sim_SubmarineSimulationDevice = 0x05, /* Application Collection */ + kHIDUsage_Sim_SailingSimulationDevice = 0x06, /* Application Collection */ + kHIDUsage_Sim_MotorcycleSimulationDevice = 0x07, /* Application Collection */ + kHIDUsage_Sim_SportsSimulationDevice = 0x08, /* Application Collection */ + kHIDUsage_Sim_AirplaneSimulationDevice = 0x09, /* Application Collection */ + kHIDUsage_Sim_HelicopterSimulationDevice = 0x0A, /* Application Collection */ + kHIDUsage_Sim_MagicCarpetSimulationDevice = 0x0B, /* Application Collection */ + kHIDUsage_Sim_BicycleSimulationDevice = 0x0C, /* Application Collection */ + /* 0x0D - 0x1F Reserved */ + kHIDUsage_Sim_FlightControlStick = 0x20, /* Application Collection */ + kHIDUsage_Sim_FlightStick = 0x21, /* Application Collection */ + kHIDUsage_Sim_CyclicControl = 0x22, /* Physical Collection */ + kHIDUsage_Sim_CyclicTrim = 0x23, /* Physical Collection */ + kHIDUsage_Sim_FlightYoke = 0x24, /* Application Collection */ + kHIDUsage_Sim_TrackControl = 0x25, /* Physical Collection */ + /* 0x26 - 0xAF Reserved */ + kHIDUsage_Sim_Aileron = 0xB0, /* Dynamic Value */ + kHIDUsage_Sim_AileronTrim = 0xB1, /* Dynamic Value */ + kHIDUsage_Sim_AntiTorqueControl = 0xB2, /* Dynamic Value */ + kHIDUsage_Sim_AutopilotEnable = 0xB3, /* On/Off Control */ + kHIDUsage_Sim_ChaffRelease = 0xB4, /* One-Shot Control */ + kHIDUsage_Sim_CollectiveControl = 0xB5, /* Dynamic Value */ + kHIDUsage_Sim_DiveBrake = 0xB6, /* Dynamic Value */ + kHIDUsage_Sim_ElectronicCountermeasures = 0xB7, /* On/Off Control */ + kHIDUsage_Sim_Elevator = 0xB8, /* Dynamic Value */ + kHIDUsage_Sim_ElevatorTrim = 0xB9, /* Dynamic Value */ + kHIDUsage_Sim_Rudder = 0xBA, /* Dynamic Value */ + kHIDUsage_Sim_Throttle = 0xBB, /* Dynamic Value */ + kHIDUsage_Sim_FlightCommunications = 0xBC, /* On/Off Control */ + kHIDUsage_Sim_FlareRelease = 0xBD, /* One-Shot Control */ + kHIDUsage_Sim_LandingGear = 0xBE, /* On/Off Control */ + kHIDUsage_Sim_ToeBrake = 0xBF, /* Dynamic Value */ + kHIDUsage_Sim_Trigger = 0xC0, /* Momentary Control */ + kHIDUsage_Sim_WeaponsArm = 0xC1, /* On/Off Control */ + kHIDUsage_Sim_Weapons = 0xC2, /* Selector */ + kHIDUsage_Sim_WingFlaps = 0xC3, /* Dynamic Value */ + kHIDUsage_Sim_Accelerator = 0xC4, /* Dynamic Value */ + kHIDUsage_Sim_Brake = 0xC5, /* Dynamic Value */ + kHIDUsage_Sim_Clutch = 0xC6, /* Dynamic Value */ + kHIDUsage_Sim_Shifter = 0xC7, /* Dynamic Value */ + kHIDUsage_Sim_Steering = 0xC8, /* Dynamic Value */ + kHIDUsage_Sim_TurretDirection = 0xC9, /* Dynamic Value */ + kHIDUsage_Sim_BarrelElevation = 0xCA, /* Dynamic Value */ + kHIDUsage_Sim_DivePlane = 0xCB, /* Dynamic Value */ + kHIDUsage_Sim_Ballast = 0xCC, /* Dynamic Value */ + kHIDUsage_Sim_BicycleCrank = 0xCD, /* Dynamic Value */ + kHIDUsage_Sim_HandleBars = 0xCE, /* Dynamic Value */ + kHIDUsage_Sim_FrontBrake = 0xCF, /* Dynamic Value */ + kHIDUsage_Sim_RearBrake = 0xD0, /* Dynamic Value */ + /* 0xD1 - 0xFFFF Reserved */ + kHIDUsage_Sim_Reserved = 0xFFFF +}; + +/* VR Page (0x03) */ +/* Virtual Reality controls depend on designators to identify the individual controls. Most of the following are */ +/* usages are applied to the collections of entities that comprise the actual device. */ +enum +{ + kHIDUsage_VR_Belt = 0x01, /* Application Collection */ + kHIDUsage_VR_BodySuit = 0x02, /* Application Collection */ + kHIDUsage_VR_Flexor = 0x03, /* Physical Collection */ + kHIDUsage_VR_Glove = 0x04, /* Application Collection */ + kHIDUsage_VR_HeadTracker = 0x05, /* Physical Collection */ + kHIDUsage_VR_HeadMountedDisplay = 0x06, /* Application Collection */ + kHIDUsage_VR_HandTracker = 0x07, /* Application Collection */ + kHIDUsage_VR_Oculometer = 0x08, /* Application Collection */ + kHIDUsage_VR_Vest = 0x09, /* Application Collection */ + kHIDUsage_VR_AnimatronicDevice = 0x0A, /* Application Collection */ + /* 0x0B - 0x1F Reserved */ + kHIDUsage_VR_StereoEnable = 0x20, /* On/Off Control */ + kHIDUsage_VR_DisplayEnable = 0x21, /* On/Off Control */ + /* 0x22 - 0xFFFF Reserved */ + kHIDUsage_VR_Reserved = 0xFFFF +}; + +/* Sport Page (0x04) */ +enum +{ + kHIDUsage_Sprt_BaseballBat = 0x01, /* Application Collection */ + kHIDUsage_Sprt_GolfClub = 0x02, /* Application Collection */ + kHIDUsage_Sprt_RowingMachine = 0x03, /* Application Collection */ + kHIDUsage_Sprt_Treadmill = 0x04, /* Application Collection */ + /* 0x05 - 0x2F Reserved */ + kHIDUsage_Sprt_Oar = 0x30, /* Dynamic Value */ + kHIDUsage_Sprt_Slope = 0x31, /* Dynamic Value */ + kHIDUsage_Sprt_Rate = 0x32, /* Dynamic Value */ + kHIDUsage_Sprt_StickSpeed = 0x33, /* Dynamic Value */ + kHIDUsage_Sprt_StickFaceAngle = 0x34, /* Dynamic Value */ + kHIDUsage_Sprt_StickHeelOrToe = 0x35, /* Dynamic Value */ + kHIDUsage_Sprt_StickFollowThrough = 0x36, /* Dynamic Value */ + kHIDUsage_Sprt_StickTempo = 0x37, /* Dynamic Value */ + kHIDUsage_Sprt_StickType = 0x38, /* Named Array */ + kHIDUsage_Sprt_StickHeight = 0x39, /* Dynamic Value */ + /* 0x3A - 0x4F Reserved */ + kHIDUsage_Sprt_Putter = 0x50, /* Selector */ + kHIDUsage_Sprt_1Iron = 0x51, /* Selector */ + kHIDUsage_Sprt_2Iron = 0x52, /* Selector */ + kHIDUsage_Sprt_3Iron = 0x53, /* Selector */ + kHIDUsage_Sprt_4Iron = 0x54, /* Selector */ + kHIDUsage_Sprt_5Iron = 0x55, /* Selector */ + kHIDUsage_Sprt_6Iron = 0x56, /* Selector */ + kHIDUsage_Sprt_7Iron = 0x57, /* Selector */ + kHIDUsage_Sprt_8Iron = 0x58, /* Selector */ + kHIDUsage_Sprt_9Iron = 0x59, /* Selector */ + kHIDUsage_Sprt_10Iron = 0x5A, /* Selector */ + kHIDUsage_Sprt_11Iron = 0x5B, /* Selector */ + kHIDUsage_Sprt_SandWedge = 0x5C, /* Selector */ + kHIDUsage_Sprt_LoftWedge = 0x5D, /* Selector */ + kHIDUsage_Sprt_PowerWedge = 0x5E, /* Selector */ + kHIDUsage_Sprt_1Wood = 0x5F, /* Selector */ + kHIDUsage_Sprt_3Wood = 0x60, /* Selector */ + kHIDUsage_Sprt_5Wood = 0x61, /* Selector */ + kHIDUsage_Sprt_7Wood = 0x62, /* Selector */ + kHIDUsage_Sprt_9Wood = 0x63, /* Selector */ + /* 0x64 - 0xFFFF Reserved */ + kHIDUsage_Sprt_Reserved = 0xFFFF +}; + +/* Game Page (0x05) */ +enum +{ + kHIDUsage_Game_3DGameController = 0x01, /* Application Collection */ + kHIDUsage_Game_PinballDevice = 0x02, /* Application Collection */ + kHIDUsage_Game_GunDevice = 0x03, /* Application Collection */ + /* 0x04 - 0x1F Reserved */ + kHIDUsage_Game_PointofView = 0x20, /* Physical Collection */ + kHIDUsage_Game_TurnRightOrLeft = 0x21, /* Dynamic Value */ + kHIDUsage_Game_PitchUpOrDown = 0x22, /* Dynamic Value */ + kHIDUsage_Game_RollRightOrLeft = 0x23, /* Dynamic Value */ + kHIDUsage_Game_MoveRightOrLeft = 0x24, /* Dynamic Value */ + kHIDUsage_Game_MoveForwardOrBackward = 0x25, /* Dynamic Value */ + kHIDUsage_Game_MoveUpOrDown = 0x26, /* Dynamic Value */ + kHIDUsage_Game_LeanRightOrLeft = 0x27, /* Dynamic Value */ + kHIDUsage_Game_LeanForwardOrBackward = 0x28, /* Dynamic Value */ + kHIDUsage_Game_HeightOfPOV = 0x29, /* Dynamic Value */ + kHIDUsage_Game_Flipper = 0x2A, /* Momentary Control */ + kHIDUsage_Game_SecondaryFlipper = 0x2B, /* Momentary Control */ + kHIDUsage_Game_Bump = 0x2C, /* Momentary Control */ + kHIDUsage_Game_NewGame = 0x2D, /* One-Shot Control */ + kHIDUsage_Game_ShootBall = 0x2E, /* One-Shot Control */ + kHIDUsage_Game_Player = 0x2F, /* One-Shot Control */ + kHIDUsage_Game_GunBolt = 0x30, /* On/Off Control */ + kHIDUsage_Game_GunClip = 0x31, /* On/Off Control */ + kHIDUsage_Game_Gun = 0x32, /* Selector */ + kHIDUsage_Game_GunSingleShot = 0x33, /* Selector */ + kHIDUsage_Game_GunBurst = 0x34, /* Selector */ + kHIDUsage_Game_GunAutomatic = 0x35, /* Selector */ + kHIDUsage_Game_GunSafety = 0x36, /* On/Off Control */ + kHIDUsage_Game_GamepadFireOrJump = 0x37, /* Logical Collection */ + kHIDUsage_Game_GamepadTrigger = 0x39, /* Logical Collection */ + kHIDUsage_Game_GamepadFormFitting_Compatibility = 0x39, /* Static Flag */ + kHIDUsage_Game_GamepadFormFitting = 0x3A, /* Static Flag */ + /* 0x3A - 0xFFFF Reserved */ + kHIDUsage_Game_Reserved = 0xFFFF +}; + +/* Generic Device Controls (0x0g) */ +enum +{ + kHIDUsage_GenDevControls_BackgroundControls = 0x01, /* Application Collection */ +}; + +/* KeyboardOrKeypad Page (0x07) */ +/* This section is the Usage Page for key codes to be used in implementing a USB keyboard. A Boot Keyboard (84-, 101- or 104-key) should at a minimum support all associated usage codes as indicated in the ÒBootÓ */ +/* column below. */ +/* The usage type of all key codes is Selectors (Sel), except for the modifier keys Keyboard Left Control (0x224) to Keyboard Right GUI (0x231) which are Dynamic Flags (DV). */ +/* Note: A general note on Usages and languages: Due to the variation of keyboards from language to language, it is not feasible to specify exact key mappings for every language. Where this list is not specific for a key function in a language, the closest equivalent key position should be used, so that a keyboard may be modified for a different language by simply printing different keycaps. One example is the Y key on a North American keyboard. In Germany this is typically Z. Rather than changing the keyboard firmware to put the Z Usage into that place in the descriptor list, the vendor should use the Y Usage on both the North American and German keyboards. This continues to be the existing practice in the industry, in order to minimize the number of changes to the electronics to accommodate otherlanguages. */ +enum +{ + kHIDUsage_KeyboardErrorRollOver = 0x01, /* ErrorRollOver */ + kHIDUsage_KeyboardPOSTFail = 0x02, /* POSTFail */ + kHIDUsage_KeyboardErrorUndefined = 0x03, /* ErrorUndefined */ + kHIDUsage_KeyboardA = 0x04, /* a or A */ + kHIDUsage_KeyboardB = 0x05, /* b or B */ + kHIDUsage_KeyboardC = 0x06, /* c or C */ + kHIDUsage_KeyboardD = 0x07, /* d or D */ + kHIDUsage_KeyboardE = 0x08, /* e or E */ + kHIDUsage_KeyboardF = 0x09, /* f or F */ + kHIDUsage_KeyboardG = 0x0A, /* g or G */ + kHIDUsage_KeyboardH = 0x0B, /* h or H */ + kHIDUsage_KeyboardI = 0x0C, /* i or I */ + kHIDUsage_KeyboardJ = 0x0D, /* j or J */ + kHIDUsage_KeyboardK = 0x0E, /* k or K */ + kHIDUsage_KeyboardL = 0x0F, /* l or L */ + kHIDUsage_KeyboardM = 0x10, /* m or M */ + kHIDUsage_KeyboardN = 0x11, /* n or N */ + kHIDUsage_KeyboardO = 0x12, /* o or O */ + kHIDUsage_KeyboardP = 0x13, /* p or P */ + kHIDUsage_KeyboardQ = 0x14, /* q or Q */ + kHIDUsage_KeyboardR = 0x15, /* r or R */ + kHIDUsage_KeyboardS = 0x16, /* s or S */ + kHIDUsage_KeyboardT = 0x17, /* t or T */ + kHIDUsage_KeyboardU = 0x18, /* u or U */ + kHIDUsage_KeyboardV = 0x19, /* v or V */ + kHIDUsage_KeyboardW = 0x1A, /* w or W */ + kHIDUsage_KeyboardX = 0x1B, /* x or X */ + kHIDUsage_KeyboardY = 0x1C, /* y or Y */ + kHIDUsage_KeyboardZ = 0x1D, /* z or Z */ + kHIDUsage_Keyboard1 = 0x1E, /* 1 or ! */ + kHIDUsage_Keyboard2 = 0x1F, /* 2 or @ */ + kHIDUsage_Keyboard3 = 0x20, /* 3 or # */ + kHIDUsage_Keyboard4 = 0x21, /* 4 or $ */ + kHIDUsage_Keyboard5 = 0x22, /* 5 or % */ + kHIDUsage_Keyboard6 = 0x23, /* 6 or ^ */ + kHIDUsage_Keyboard7 = 0x24, /* 7 or & */ + kHIDUsage_Keyboard8 = 0x25, /* 8 or * */ + kHIDUsage_Keyboard9 = 0x26, /* 9 or ( */ + kHIDUsage_Keyboard0 = 0x27, /* 0 or ) */ + kHIDUsage_KeyboardReturnOrEnter = 0x28, /* Return (Enter) */ + kHIDUsage_KeyboardEscape = 0x29, /* Escape */ + kHIDUsage_KeyboardDeleteOrBackspace = 0x2A, /* Delete (Backspace) */ + kHIDUsage_KeyboardTab = 0x2B, /* Tab */ + kHIDUsage_KeyboardSpacebar = 0x2C, /* Spacebar */ + kHIDUsage_KeyboardHyphen = 0x2D, /* - or _ */ + kHIDUsage_KeyboardEqualSign = 0x2E, /* = or + */ + kHIDUsage_KeyboardOpenBracket = 0x2F, /* [ or { */ + kHIDUsage_KeyboardCloseBracket = 0x30, /* ] or } */ + kHIDUsage_KeyboardBackslash = 0x31, /* \ or | */ + kHIDUsage_KeyboardNonUSPound = 0x32, /* Non-US # or _ */ + kHIDUsage_KeyboardSemicolon = 0x33, /* ; or : */ + kHIDUsage_KeyboardQuote = 0x34, /* ' or " */ + kHIDUsage_KeyboardGraveAccentAndTilde = 0x35, /* Grave Accent and Tilde */ + kHIDUsage_KeyboardComma = 0x36, /* , or < */ + kHIDUsage_KeyboardPeriod = 0x37, /* . or > */ + kHIDUsage_KeyboardSlash = 0x38, /* / or ? */ + kHIDUsage_KeyboardCapsLock = 0x39, /* Caps Lock */ + kHIDUsage_KeyboardF1 = 0x3A, /* F1 */ + kHIDUsage_KeyboardF2 = 0x3B, /* F2 */ + kHIDUsage_KeyboardF3 = 0x3C, /* F3 */ + kHIDUsage_KeyboardF4 = 0x3D, /* F4 */ + kHIDUsage_KeyboardF5 = 0x3E, /* F5 */ + kHIDUsage_KeyboardF6 = 0x3F, /* F6 */ + kHIDUsage_KeyboardF7 = 0x40, /* F7 */ + kHIDUsage_KeyboardF8 = 0x41, /* F8 */ + kHIDUsage_KeyboardF9 = 0x42, /* F9 */ + kHIDUsage_KeyboardF10 = 0x43, /* F10 */ + kHIDUsage_KeyboardF11 = 0x44, /* F11 */ + kHIDUsage_KeyboardF12 = 0x45, /* F12 */ + kHIDUsage_KeyboardPrintScreen = 0x46, /* Print Screen */ + kHIDUsage_KeyboardScrollLock = 0x47, /* Scroll Lock */ + kHIDUsage_KeyboardPause = 0x48, /* Pause */ + kHIDUsage_KeyboardInsert = 0x49, /* Insert */ + kHIDUsage_KeyboardHome = 0x4A, /* Home */ + kHIDUsage_KeyboardPageUp = 0x4B, /* Page Up */ + kHIDUsage_KeyboardDeleteForward = 0x4C, /* Delete Forward */ + kHIDUsage_KeyboardEnd = 0x4D, /* End */ + kHIDUsage_KeyboardPageDown = 0x4E, /* Page Down */ + kHIDUsage_KeyboardRightArrow = 0x4F, /* Right Arrow */ + kHIDUsage_KeyboardLeftArrow = 0x50, /* Left Arrow */ + kHIDUsage_KeyboardDownArrow = 0x51, /* Down Arrow */ + kHIDUsage_KeyboardUpArrow = 0x52, /* Up Arrow */ + kHIDUsage_KeypadNumLock = 0x53, /* Keypad NumLock or Clear */ + kHIDUsage_KeypadSlash = 0x54, /* Keypad / */ + kHIDUsage_KeypadAsterisk = 0x55, /* Keypad * */ + kHIDUsage_KeypadHyphen = 0x56, /* Keypad - */ + kHIDUsage_KeypadPlus = 0x57, /* Keypad + */ + kHIDUsage_KeypadEnter = 0x58, /* Keypad Enter */ + kHIDUsage_Keypad1 = 0x59, /* Keypad 1 or End */ + kHIDUsage_Keypad2 = 0x5A, /* Keypad 2 or Down Arrow */ + kHIDUsage_Keypad3 = 0x5B, /* Keypad 3 or Page Down */ + kHIDUsage_Keypad4 = 0x5C, /* Keypad 4 or Left Arrow */ + kHIDUsage_Keypad5 = 0x5D, /* Keypad 5 */ + kHIDUsage_Keypad6 = 0x5E, /* Keypad 6 or Right Arrow */ + kHIDUsage_Keypad7 = 0x5F, /* Keypad 7 or Home */ + kHIDUsage_Keypad8 = 0x60, /* Keypad 8 or Up Arrow */ + kHIDUsage_Keypad9 = 0x61, /* Keypad 9 or Page Up */ + kHIDUsage_Keypad0 = 0x62, /* Keypad 0 or Insert */ + kHIDUsage_KeypadPeriod = 0x63, /* Keypad . or Delete */ + kHIDUsage_KeyboardNonUSBackslash = 0x64, /* Non-US \ or | */ + kHIDUsage_KeyboardApplication = 0x65, /* Application */ + kHIDUsage_KeyboardPower = 0x66, /* Power */ + kHIDUsage_KeypadEqualSign = 0x67, /* Keypad = */ + kHIDUsage_KeyboardF13 = 0x68, /* F13 */ + kHIDUsage_KeyboardF14 = 0x69, /* F14 */ + kHIDUsage_KeyboardF15 = 0x6A, /* F15 */ + kHIDUsage_KeyboardF16 = 0x6B, /* F16 */ + kHIDUsage_KeyboardF17 = 0x6C, /* F17 */ + kHIDUsage_KeyboardF18 = 0x6D, /* F18 */ + kHIDUsage_KeyboardF19 = 0x6E, /* F19 */ + kHIDUsage_KeyboardF20 = 0x6F, /* F20 */ + kHIDUsage_KeyboardF21 = 0x70, /* F21 */ + kHIDUsage_KeyboardF22 = 0x71, /* F22 */ + kHIDUsage_KeyboardF23 = 0x72, /* F23 */ + kHIDUsage_KeyboardF24 = 0x73, /* F24 */ + kHIDUsage_KeyboardExecute = 0x74, /* Execute */ + kHIDUsage_KeyboardHelp = 0x75, /* Help */ + kHIDUsage_KeyboardMenu = 0x76, /* Menu */ + kHIDUsage_KeyboardSelect = 0x77, /* Select */ + kHIDUsage_KeyboardStop = 0x78, /* Stop */ + kHIDUsage_KeyboardAgain = 0x79, /* Again */ + kHIDUsage_KeyboardUndo = 0x7A, /* Undo */ + kHIDUsage_KeyboardCut = 0x7B, /* Cut */ + kHIDUsage_KeyboardCopy = 0x7C, /* Copy */ + kHIDUsage_KeyboardPaste = 0x7D, /* Paste */ + kHIDUsage_KeyboardFind = 0x7E, /* Find */ + kHIDUsage_KeyboardMute = 0x7F, /* Mute */ + kHIDUsage_KeyboardVolumeUp = 0x80, /* Volume Up */ + kHIDUsage_KeyboardVolumeDown = 0x81, /* Volume Down */ + kHIDUsage_KeyboardLockingCapsLock = 0x82, /* Locking Caps Lock */ + kHIDUsage_KeyboardLockingNumLock = 0x83, /* Locking Num Lock */ + kHIDUsage_KeyboardLockingScrollLock = 0x84, /* Locking Scroll Lock */ + kHIDUsage_KeypadComma = 0x85, /* Keypad Comma */ + kHIDUsage_KeypadEqualSignAS400 = 0x86, /* Keypad Equal Sign for AS/400 */ + kHIDUsage_KeyboardInternational1 = 0x87, /* International1 */ + kHIDUsage_KeyboardInternational2 = 0x88, /* International2 */ + kHIDUsage_KeyboardInternational3 = 0x89, /* International3 */ + kHIDUsage_KeyboardInternational4 = 0x8A, /* International4 */ + kHIDUsage_KeyboardInternational5 = 0x8B, /* International5 */ + kHIDUsage_KeyboardInternational6 = 0x8C, /* International6 */ + kHIDUsage_KeyboardInternational7 = 0x8D, /* International7 */ + kHIDUsage_KeyboardInternational8 = 0x8E, /* International8 */ + kHIDUsage_KeyboardInternational9 = 0x8F, /* International9 */ + kHIDUsage_KeyboardLANG1 = 0x90, /* LANG1 */ + kHIDUsage_KeyboardLANG2 = 0x91, /* LANG2 */ + kHIDUsage_KeyboardLANG3 = 0x92, /* LANG3 */ + kHIDUsage_KeyboardLANG4 = 0x93, /* LANG4 */ + kHIDUsage_KeyboardLANG5 = 0x94, /* LANG5 */ + kHIDUsage_KeyboardLANG6 = 0x95, /* LANG6 */ + kHIDUsage_KeyboardLANG7 = 0x96, /* LANG7 */ + kHIDUsage_KeyboardLANG8 = 0x97, /* LANG8 */ + kHIDUsage_KeyboardLANG9 = 0x98, /* LANG9 */ + kHIDUsage_KeyboardAlternateErase = 0x99, /* AlternateErase */ + kHIDUsage_KeyboardSysReqOrAttention = 0x9A, /* SysReq/Attention */ + kHIDUsage_KeyboardCancel = 0x9B, /* Cancel */ + kHIDUsage_KeyboardClear = 0x9C, /* Clear */ + kHIDUsage_KeyboardPrior = 0x9D, /* Prior */ + kHIDUsage_KeyboardReturn = 0x9E, /* Return */ + kHIDUsage_KeyboardSeparator = 0x9F, /* Separator */ + kHIDUsage_KeyboardOut = 0xA0, /* Out */ + kHIDUsage_KeyboardOper = 0xA1, /* Oper */ + kHIDUsage_KeyboardClearOrAgain = 0xA2, /* Clear/Again */ + kHIDUsage_KeyboardCrSelOrProps = 0xA3, /* CrSel/Props */ + kHIDUsage_KeyboardExSel = 0xA4, /* ExSel */ + /* 0xA5-0xDF Reserved */ + kHIDUsage_KeyboardLeftControl = 0xE0, /* Left Control */ + kHIDUsage_KeyboardLeftShift = 0xE1, /* Left Shift */ + kHIDUsage_KeyboardLeftAlt = 0xE2, /* Left Alt */ + kHIDUsage_KeyboardLeftGUI = 0xE3, /* Left GUI */ + kHIDUsage_KeyboardRightControl = 0xE4, /* Right Control */ + kHIDUsage_KeyboardRightShift = 0xE5, /* Right Shift */ + kHIDUsage_KeyboardRightAlt = 0xE6, /* Right Alt */ + kHIDUsage_KeyboardRightGUI = 0xE7, /* Right GUI */ + /* 0xE8-0xFFFF Reserved */ + kHIDUsage_Keyboard_Reserved = 0xFFFF +}; + +/* LEDs Page (0x08) */ +/* An LED or indicator is implemented as an On/Off Control (OOF) using the ÒSingle button toggleÓ mode, where a value of 1 will turn on the indicator, and a value of 0 will turn it off. The exceptions are described below. */ +enum +{ + kHIDUsage_LED_NumLock = 0x01, /* On/Off Control */ + kHIDUsage_LED_CapsLock = 0x02, /* On/Off Control */ + kHIDUsage_LED_ScrollLock = 0x03, /* On/Off Control */ + kHIDUsage_LED_Compose = 0x04, /* On/Off Control */ + kHIDUsage_LED_Kana = 0x05, /* On/Off Control */ + kHIDUsage_LED_Power = 0x06, /* On/Off Control */ + kHIDUsage_LED_Shift = 0x07, /* On/Off Control */ + kHIDUsage_LED_DoNotDisturb = 0x08, /* On/Off Control */ + kHIDUsage_LED_Mute = 0x09, /* On/Off Control */ + kHIDUsage_LED_ToneEnable = 0x0A, /* On/Off Control */ + kHIDUsage_LED_HighCutFilter = 0x0B, /* On/Off Control */ + kHIDUsage_LED_LowCutFilter = 0x0C, /* On/Off Control */ + kHIDUsage_LED_EqualizerEnable = 0x0D, /* On/Off Control */ + kHIDUsage_LED_SoundFieldOn = 0x0E, /* On/Off Control */ + kHIDUsage_LED_SurroundOn = 0x0F, /* On/Off Control */ + kHIDUsage_LED_Repeat = 0x10, /* On/Off Control */ + kHIDUsage_LED_Stereo = 0x11, /* On/Off Control */ + kHIDUsage_LED_SamplingRateDetect = 0x12, /* On/Off Control */ + kHIDUsage_LED_Spinning = 0x13, /* On/Off Control */ + kHIDUsage_LED_CAV = 0x14, /* On/Off Control */ + kHIDUsage_LED_CLV = 0x15, /* On/Off Control */ + kHIDUsage_LED_RecordingFormatDetect = 0x16, /* On/Off Control */ + kHIDUsage_LED_OffHook = 0x17, /* On/Off Control */ + kHIDUsage_LED_Ring = 0x18, /* On/Off Control */ + kHIDUsage_LED_MessageWaiting = 0x19, /* On/Off Control */ + kHIDUsage_LED_DataMode = 0x1A, /* On/Off Control */ + kHIDUsage_LED_BatteryOperation = 0x1B, /* On/Off Control */ + kHIDUsage_LED_BatteryOK = 0x1C, /* On/Off Control */ + kHIDUsage_LED_BatteryLow = 0x1D, /* On/Off Control */ + kHIDUsage_LED_Speaker = 0x1E, /* On/Off Control */ + kHIDUsage_LED_HeadSet = 0x1F, /* On/Off Control */ + kHIDUsage_LED_Hold = 0x20, /* On/Off Control */ + kHIDUsage_LED_Microphone = 0x21, /* On/Off Control */ + kHIDUsage_LED_Coverage = 0x22, /* On/Off Control */ + kHIDUsage_LED_NightMode = 0x23, /* On/Off Control */ + kHIDUsage_LED_SendCalls = 0x24, /* On/Off Control */ + kHIDUsage_LED_CallPickup = 0x25, /* On/Off Control */ + kHIDUsage_LED_Conference = 0x26, /* On/Off Control */ + kHIDUsage_LED_StandBy = 0x27, /* On/Off Control */ + kHIDUsage_LED_CameraOn = 0x28, /* On/Off Control */ + kHIDUsage_LED_CameraOff = 0x29, /* On/Off Control */ + kHIDUsage_LED_OnLine = 0x2A, /* On/Off Control */ + kHIDUsage_LED_OffLine = 0x2B, /* On/Off Control */ + kHIDUsage_LED_Busy = 0x2C, /* On/Off Control */ + kHIDUsage_LED_Ready = 0x2D, /* On/Off Control */ + kHIDUsage_LED_PaperOut = 0x2E, /* On/Off Control */ + kHIDUsage_LED_PaperJam = 0x2F, /* On/Off Control */ + kHIDUsage_LED_Remote = 0x30, /* On/Off Control */ + kHIDUsage_LED_Forward = 0x31, /* On/Off Control */ + kHIDUsage_LED_Reverse = 0x32, /* On/Off Control */ + kHIDUsage_LED_Stop = 0x33, /* On/Off Control */ + kHIDUsage_LED_Rewind = 0x34, /* On/Off Control */ + kHIDUsage_LED_FastForward = 0x35, /* On/Off Control */ + kHIDUsage_LED_Play = 0x36, /* On/Off Control */ + kHIDUsage_LED_Pause = 0x37, /* On/Off Control */ + kHIDUsage_LED_Record = 0x38, /* On/Off Control */ + kHIDUsage_LED_Error = 0x39, /* On/Off Control */ + kHIDUsage_LED_Usage = 0x3A, /* Selector */ + kHIDUsage_LED_UsageInUseIndicator = 0x3B, /* Usage Switch */ + kHIDUsage_LED_UsageMultiModeIndicator = 0x3C, /* Usage Modifier */ + kHIDUsage_LED_IndicatorOn = 0x3D, /* Selector */ + kHIDUsage_LED_IndicatorFlash = 0x3E, /* Selector */ + kHIDUsage_LED_IndicatorSlowBlink = 0x3F, /* Selector */ + kHIDUsage_LED_IndicatorFastBlink = 0x40, /* Selector */ + kHIDUsage_LED_IndicatorOff = 0x41, /* Selector */ + kHIDUsage_LED_FlashOnTime = 0x42, /* Dynamic Value */ + kHIDUsage_LED_SlowBlinkOnTime = 0x43, /* Dynamic Value */ + kHIDUsage_LED_SlowBlinkOffTime = 0x44, /* Dynamic Value */ + kHIDUsage_LED_FastBlinkOnTime = 0x45, /* Dynamic Value */ + kHIDUsage_LED_FastBlinkOffTime = 0x46, /* Dynamic Value */ + kHIDUsage_LED_UsageIndicatorColor = 0x47, /* Usage Modifier */ + kHIDUsage_LED_IndicatorRed = 0x48, /* Selector */ + kHIDUsage_LED_IndicatorGreen = 0x49, /* Selector */ + kHIDUsage_LED_IndicatorAmber = 0x4A, /* Selector */ + kHIDUsage_LED_GenericIndicator = 0x4B, /* On/Off Control */ + kHIDUsage_LED_SystemSuspend = 0x4C, /* On/Off Control */ + kHIDUsage_LED_ExternalPowerConnected = 0x4D, /* On/Off Control */ + kHIDUsage_LED_PlayerIndicator = 0x4E, /* Collection Logical */ + kHIDUsage_LED_Player1 = 0x4F, /* Selector */ + kHIDUsage_LED_Player2 = 0x50, /* Selector */ + kHIDUsage_LED_Player3 = 0x51, /* Selector */ + kHIDUsage_LED_Player4 = 0x52, /* Selector */ + kHIDUsage_LED_Player5 = 0x53, /* Selector */ + kHIDUsage_LED_Player6 = 0x54, /* Selector */ + kHIDUsage_LED_Player7 = 0x55, /* Selector */ + kHIDUsage_LED_Player8 = 0x56, /* Selector */ + /* 0x4E - 0xFFFF Reserved */ + kHIDUsage_LED_Reserved = 0xFFFF +}; + +/* Button Page (0x09) */ +/* The Button page is the first place an application should look for user selection controls. System graphical user interfaces typically employ a pointer and a set of hierarchical selectors to select, move and otherwise manipulate their environment. For these purposes the following assignment of significance can be applied to the Button usages: */ +/* ¥ Button 1, Primary Button. Used for object selecting, dragging, and double click activation. On MacOS, this is the only button. Microsoft operating systems call this a logical left button, because it */ +/* is not necessarily physically located on the left of the pointing device. */ +/* ¥ Button 2, Secondary Button. Used by newer graphical user interfaces to browse object properties. Exposed by systems to applications that typically assign application-specific functionality. */ +/* ¥ Button 3, Tertiary Button. Optional control. Exposed to applications, but seldom assigned functionality due to prevalence of two- and one-button devices. */ +/* ¥ Buttons 4 -55. As the button number increases, its significance as a selector decreases. */ +/* In many ways the assignment of button numbers is similar to the assignment of Effort in Physical descriptors. Button 1 would be used to define the button a finger rests on when the hand is in the Òat restÓ position, that is, virtually no effort is required by the user to activate the button. Button values increment as the finger has to stretch to reach a control. See Section 6.2.3, ÒPhysical Descriptors,Ó in the HID Specification for methods of further qualifying buttons. */ +enum +{ + kHIDUsage_Button_1 = 0x01, /* (primary/trigger) */ + kHIDUsage_Button_2 = 0x02, /* (secondary) */ + kHIDUsage_Button_3 = 0x03, /* (tertiary) */ + kHIDUsage_Button_4 = 0x04, /* 4th button */ + kHIDUsage_Button_5 = 0x05, /* (5th button) */ + kHIDUsage_Button_6 = 0x06, /* (6th button) */ + kHIDUsage_Button_7 = 0x07, /* (7th button) */ + kHIDUsage_Button_8 = 0x08, /* (8th button) */ + kHIDUsage_Button_9 = 0x09, /* (9th button) */ + kHIDUsage_Button_10 = 0x0a, /* (10th button) */ + kHIDUsage_Button_11 = 0x0b, /* (11th button) */ + kHIDUsage_Button_12 = 0x0c, /* (12th button) */ + kHIDUsage_Button_13 = 0x0d, /* (13th button) */ + kHIDUsage_Button_14 = 0x0e, /* (14th button) */ + kHIDUsage_Button_15 = 0x0f, /* (15th button) */ + kHIDUsage_Button_16 = 0x10, /* (16th button) */ + kHIDUsage_Button_17 = 0x11, /* (17th button) */ + kHIDUsage_Button_18 = 0x12, /* (18th button) */ + kHIDUsage_Button_19 = 0x13, /* (19th button) */ + kHIDUsage_Button_20 = 0x14, /* (20th button) */ + kHIDUsage_Button_21 = 0x15, /* (21st button) */ + kHIDUsage_Button_22 = 0x16, /* (22nd button) */ + kHIDUsage_Button_23 = 0x17, /* (23rd button) */ + kHIDUsage_Button_24 = 0x18, /* (24th button) */ + kHIDUsage_Button_25 = 0x19, /* (25th button) */ + kHIDUsage_Button_26 = 0x1a, /* (26th button) */ + kHIDUsage_Button_27 = 0x1b, /* (27th button) */ + kHIDUsage_Button_28 = 0x1c, /* (28th button) */ + kHIDUsage_Button_29 = 0x1d, /* (29th button) */ + kHIDUsage_Button_30 = 0x1e, /* (30th button) */ + kHIDUsage_Button_31 = 0x1f, /* (31st button) */ + kHIDUsage_Button_32 = 0x20, /* (32nd button) */ + kHIDUsage_Button_33 = 0x21, /* (33rd button) */ + kHIDUsage_Button_34 = 0x22, /* (34th button) */ + kHIDUsage_Button_35 = 0x23, /* (35th button) */ + kHIDUsage_Button_36 = 0x24, /* (36th button) */ + kHIDUsage_Button_37 = 0x25, /* (37th button) */ + kHIDUsage_Button_38 = 0x26, /* (38th button) */ + kHIDUsage_Button_39 = 0x27, /* (39th button) */ + kHIDUsage_Button_40 = 0x28, /* (40th button) */ + kHIDUsage_Button_41 = 0x29, /* (41st button) */ + kHIDUsage_Button_42 = 0x2a, /* (42nd button) */ + kHIDUsage_Button_43 = 0x2b, /* (43rd button) */ + kHIDUsage_Button_44 = 0x2c, /* (44th button) */ + kHIDUsage_Button_45 = 0x2d, /* (45th button) */ + kHIDUsage_Button_46 = 0x2e, /* (46th button) */ + kHIDUsage_Button_47 = 0x2f, /* (47th button) */ + kHIDUsage_Button_48 = 0x30, /* (48th button) */ + kHIDUsage_Button_49 = 0x31, /* (49th button) */ + kHIDUsage_Button_50 = 0x32, /* (50th button) */ + kHIDUsage_Button_51 = 0x33, /* (51st button) */ + kHIDUsage_Button_52 = 0x34, /* (52nd button) */ + kHIDUsage_Button_53 = 0x35, /* (53rd button) */ + kHIDUsage_Button_54 = 0x36, /* (54th button) */ + kHIDUsage_Button_55 = 0x37, /* (55th button) */ + kHIDUsage_Button_56 = 0x38, /* (56th button) */ + kHIDUsage_Button_57 = 0x39, /* (57th button) */ + kHIDUsage_Button_58 = 0x3a, /* (58th button) */ + kHIDUsage_Button_59 = 0x3b, /* (59th button) */ + kHIDUsage_Button_60 = 0x3c, /* (60th button) */ + kHIDUsage_Button_61 = 0x3d, /* (61st button) */ + kHIDUsage_Button_62 = 0x3e, /* (62nd button) */ + kHIDUsage_Button_63 = 0x3f, /* (63rd button) */ + kHIDUsage_Button_64 = 0x40, /* (64th button) */ + kHIDUsage_Button_65 = 0x41, /* (65th button) */ + kHIDUsage_Button_66 = 0x42, /* (66th button) */ + kHIDUsage_Button_67 = 0x43, /* (67th button) */ + kHIDUsage_Button_68 = 0x44, /* (68th button) */ + kHIDUsage_Button_69 = 0x45, /* (69th button) */ + kHIDUsage_Button_70 = 0x46, /* (70th button) */ + kHIDUsage_Button_71 = 0x47, /* (71st button) */ + kHIDUsage_Button_72 = 0x48, /* (72nd button) */ + kHIDUsage_Button_73 = 0x49, /* (73rd button) */ + kHIDUsage_Button_74 = 0x4a, /* (74th button) */ + kHIDUsage_Button_75 = 0x4b, /* (75th button) */ + kHIDUsage_Button_76 = 0x4c, /* (76th button) */ + kHIDUsage_Button_77 = 0x4d, /* (77th button) */ + kHIDUsage_Button_78 = 0x4e, /* (78th button) */ + kHIDUsage_Button_79 = 0x4f, /* (79th button) */ + kHIDUsage_Button_80 = 0x50, /* (80th button) */ + kHIDUsage_Button_81 = 0x51, /* (81st button) */ + kHIDUsage_Button_82 = 0x52, /* (82nd button) */ + kHIDUsage_Button_83 = 0x53, /* (83rd button) */ + kHIDUsage_Button_84 = 0x54, /* (84th button) */ + kHIDUsage_Button_85 = 0x55, /* (85th button) */ + kHIDUsage_Button_86 = 0x56, /* (86th button) */ + kHIDUsage_Button_87 = 0x57, /* (87th button) */ + kHIDUsage_Button_88 = 0x58, /* (88th button) */ + kHIDUsage_Button_89 = 0x59, /* (89th button) */ + kHIDUsage_Button_90 = 0x5a, /* (90th button) */ + kHIDUsage_Button_91 = 0x5b, /* (91st button) */ + kHIDUsage_Button_92 = 0x5c, /* (92nd button) */ + kHIDUsage_Button_93 = 0x5d, /* (93rd button) */ + kHIDUsage_Button_94 = 0x5e, /* (94th button) */ + kHIDUsage_Button_95 = 0x5f, /* (95th button) */ + kHIDUsage_Button_96 = 0x60, /* (96th button) */ + kHIDUsage_Button_97 = 0x61, /* (97th button) */ + kHIDUsage_Button_98 = 0x62, /* (98th button) */ + kHIDUsage_Button_99 = 0x63, /* (99th button) */ + kHIDUsage_Button_100 = 0x64, /* (100th button) */ + kHIDUsage_Button_101 = 0x65, /* (101st button) */ + kHIDUsage_Button_102 = 0x66, /* (102nd button) */ + kHIDUsage_Button_103 = 0x67, /* (103rd button) */ + kHIDUsage_Button_104 = 0x68, /* (104th button) */ + kHIDUsage_Button_105 = 0x69, /* (105th button) */ + kHIDUsage_Button_106 = 0x6a, /* (106th button) */ + kHIDUsage_Button_107 = 0x6b, /* (107th button) */ + kHIDUsage_Button_108 = 0x6c, /* (108th button) */ + kHIDUsage_Button_109 = 0x6d, /* (109th button) */ + kHIDUsage_Button_110 = 0x6e, /* (110th button) */ + kHIDUsage_Button_111 = 0x6f, /* (111th button) */ + kHIDUsage_Button_112 = 0x70, /* (112th button) */ + kHIDUsage_Button_113 = 0x71, /* (113th button) */ + kHIDUsage_Button_114 = 0x72, /* (114th button) */ + kHIDUsage_Button_115 = 0x73, /* (115th button) */ + kHIDUsage_Button_116 = 0x74, /* (116th button) */ + kHIDUsage_Button_117 = 0x75, /* (117th button) */ + kHIDUsage_Button_118 = 0x76, /* (118th button) */ + kHIDUsage_Button_119 = 0x77, /* (119th button) */ + kHIDUsage_Button_120 = 0x78, /* (120th button) */ + kHIDUsage_Button_121 = 0x79, /* (121st button) */ + kHIDUsage_Button_122 = 0x7a, /* (122nd button) */ + kHIDUsage_Button_123 = 0x7b, /* (123rd button) */ + kHIDUsage_Button_124 = 0x7c, /* (124th button) */ + kHIDUsage_Button_125 = 0x7d, /* (125th button) */ + kHIDUsage_Button_126 = 0x7e, /* (126th button) */ + kHIDUsage_Button_127 = 0x7f, /* (127th button) */ + kHIDUsage_Button_128 = 0x80, /* (128th button) */ + kHIDUsage_Button_129 = 0x81, /* (129th button) */ + kHIDUsage_Button_130 = 0x82, /* (130th button) */ + kHIDUsage_Button_131 = 0x83, /* (131st button) */ + kHIDUsage_Button_132 = 0x84, /* (132nd button) */ + kHIDUsage_Button_133 = 0x85, /* (133rd button) */ + kHIDUsage_Button_134 = 0x86, /* (134th button) */ + kHIDUsage_Button_135 = 0x87, /* (135th button) */ + kHIDUsage_Button_136 = 0x88, /* (136th button) */ + kHIDUsage_Button_137 = 0x89, /* (137th button) */ + kHIDUsage_Button_138 = 0x8a, /* (138th button) */ + kHIDUsage_Button_139 = 0x8b, /* (139th button) */ + kHIDUsage_Button_140 = 0x8c, /* (140th button) */ + kHIDUsage_Button_141 = 0x8d, /* (141st button) */ + kHIDUsage_Button_142 = 0x8e, /* (142nd button) */ + kHIDUsage_Button_143 = 0x8f, /* (143rd button) */ + kHIDUsage_Button_144 = 0x90, /* (144th button) */ + kHIDUsage_Button_145 = 0x91, /* (145th button) */ + kHIDUsage_Button_146 = 0x92, /* (146th button) */ + kHIDUsage_Button_147 = 0x93, /* (147th button) */ + kHIDUsage_Button_148 = 0x94, /* (148th button) */ + kHIDUsage_Button_149 = 0x95, /* (149th button) */ + kHIDUsage_Button_150 = 0x96, /* (150th button) */ + kHIDUsage_Button_151 = 0x97, /* (151st button) */ + kHIDUsage_Button_152 = 0x98, /* (152nd button) */ + kHIDUsage_Button_153 = 0x99, /* (153rd button) */ + kHIDUsage_Button_154 = 0x9a, /* (154th button) */ + kHIDUsage_Button_155 = 0x9b, /* (155th button) */ + kHIDUsage_Button_156 = 0x9c, /* (156th button) */ + kHIDUsage_Button_157 = 0x9d, /* (157th button) */ + kHIDUsage_Button_158 = 0x9e, /* (158th button) */ + kHIDUsage_Button_159 = 0x9f, /* (159th button) */ + kHIDUsage_Button_160 = 0xa0, /* (160th button) */ + kHIDUsage_Button_161 = 0xa1, /* (161st button) */ + kHIDUsage_Button_162 = 0xa2, /* (162nd button) */ + kHIDUsage_Button_163 = 0xa3, /* (163rd button) */ + kHIDUsage_Button_164 = 0xa4, /* (164th button) */ + kHIDUsage_Button_165 = 0xa5, /* (165th button) */ + kHIDUsage_Button_166 = 0xa6, /* (166th button) */ + kHIDUsage_Button_167 = 0xa7, /* (167th button) */ + kHIDUsage_Button_168 = 0xa8, /* (168th button) */ + kHIDUsage_Button_169 = 0xa9, /* (169th button) */ + kHIDUsage_Button_170 = 0xaa, /* (170th button) */ + kHIDUsage_Button_171 = 0xab, /* (171st button) */ + kHIDUsage_Button_172 = 0xac, /* (172nd button) */ + kHIDUsage_Button_173 = 0xad, /* (173rd button) */ + kHIDUsage_Button_174 = 0xae, /* (174th button) */ + kHIDUsage_Button_175 = 0xaf, /* (175th button) */ + kHIDUsage_Button_176 = 0xb0, /* (176th button) */ + kHIDUsage_Button_177 = 0xb1, /* (177th button) */ + kHIDUsage_Button_178 = 0xb2, /* (178th button) */ + kHIDUsage_Button_179 = 0xb3, /* (179th button) */ + kHIDUsage_Button_180 = 0xb4, /* (180th button) */ + kHIDUsage_Button_181 = 0xb5, /* (181st button) */ + kHIDUsage_Button_182 = 0xb6, /* (182nd button) */ + kHIDUsage_Button_183 = 0xb7, /* (183rd button) */ + kHIDUsage_Button_184 = 0xb8, /* (184th button) */ + kHIDUsage_Button_185 = 0xb9, /* (185th button) */ + kHIDUsage_Button_186 = 0xba, /* (186th button) */ + kHIDUsage_Button_187 = 0xbb, /* (187th button) */ + kHIDUsage_Button_188 = 0xbc, /* (188th button) */ + kHIDUsage_Button_189 = 0xbd, /* (189th button) */ + kHIDUsage_Button_190 = 0xbe, /* (190th button) */ + kHIDUsage_Button_191 = 0xbf, /* (191st button) */ + kHIDUsage_Button_192 = 0xc0, /* (192nd button) */ + kHIDUsage_Button_193 = 0xc1, /* (193rd button) */ + kHIDUsage_Button_194 = 0xc2, /* (194th button) */ + kHIDUsage_Button_195 = 0xc3, /* (195th button) */ + kHIDUsage_Button_196 = 0xc4, /* (196th button) */ + kHIDUsage_Button_197 = 0xc5, /* (197th button) */ + kHIDUsage_Button_198 = 0xc6, /* (198th button) */ + kHIDUsage_Button_199 = 0xc7, /* (199th button) */ + kHIDUsage_Button_200 = 0xc8, /* (200th button) */ + kHIDUsage_Button_201 = 0xc9, /* (201st button) */ + kHIDUsage_Button_202 = 0xca, /* (202nd button) */ + kHIDUsage_Button_203 = 0xcb, /* (203rd button) */ + kHIDUsage_Button_204 = 0xcc, /* (204th button) */ + kHIDUsage_Button_205 = 0xcd, /* (205th button) */ + kHIDUsage_Button_206 = 0xce, /* (206th button) */ + kHIDUsage_Button_207 = 0xcf, /* (207th button) */ + kHIDUsage_Button_208 = 0xd0, /* (208th button) */ + kHIDUsage_Button_209 = 0xd1, /* (209th button) */ + kHIDUsage_Button_210 = 0xd2, /* (210th button) */ + kHIDUsage_Button_211 = 0xd3, /* (211th button) */ + kHIDUsage_Button_212 = 0xd4, /* (212th button) */ + kHIDUsage_Button_213 = 0xd5, /* (213th button) */ + kHIDUsage_Button_214 = 0xd6, /* (214th button) */ + kHIDUsage_Button_215 = 0xd7, /* (215th button) */ + kHIDUsage_Button_216 = 0xd8, /* (216th button) */ + kHIDUsage_Button_217 = 0xd9, /* (217th button) */ + kHIDUsage_Button_218 = 0xda, /* (218th button) */ + kHIDUsage_Button_219 = 0xdb, /* (219th button) */ + kHIDUsage_Button_220 = 0xdc, /* (220th button) */ + kHIDUsage_Button_221 = 0xdd, /* (221st button) */ + kHIDUsage_Button_222 = 0xde, /* (222nd button) */ + kHIDUsage_Button_223 = 0xdf, /* (223rd button) */ + kHIDUsage_Button_224 = 0xe0, /* (224th button) */ + kHIDUsage_Button_225 = 0xe1, /* (225th button) */ + kHIDUsage_Button_226 = 0xe2, /* (226th button) */ + kHIDUsage_Button_227 = 0xe3, /* (227th button) */ + kHIDUsage_Button_228 = 0xe4, /* (228th button) */ + kHIDUsage_Button_229 = 0xe5, /* (229th button) */ + kHIDUsage_Button_230 = 0xe6, /* (230th button) */ + kHIDUsage_Button_231 = 0xe7, /* (231st button) */ + kHIDUsage_Button_232 = 0xe8, /* (232nd button) */ + kHIDUsage_Button_233 = 0xe9, /* (233rd button) */ + kHIDUsage_Button_234 = 0xea, /* (234th button) */ + kHIDUsage_Button_235 = 0xeb, /* (235th button) */ + kHIDUsage_Button_236 = 0xec, /* (236th button) */ + kHIDUsage_Button_237 = 0xed, /* (237th button) */ + kHIDUsage_Button_238 = 0xee, /* (238th button) */ + kHIDUsage_Button_239 = 0xef, /* (239th button) */ + kHIDUsage_Button_240 = 0xf0, /* (240th button) */ + kHIDUsage_Button_241 = 0xf1, /* (241st button) */ + kHIDUsage_Button_242 = 0xf2, /* (242nd button) */ + kHIDUsage_Button_243 = 0xf3, /* (243rd button) */ + kHIDUsage_Button_244 = 0xf4, /* (244th button) */ + kHIDUsage_Button_245 = 0xf5, /* (245th button) */ + kHIDUsage_Button_246 = 0xf6, /* (246th button) */ + kHIDUsage_Button_247 = 0xf7, /* (247th button) */ + kHIDUsage_Button_248 = 0xf8, /* (248th button) */ + kHIDUsage_Button_249 = 0xf9, /* (249th button) */ + kHIDUsage_Button_250 = 0xfa, /* (250th button) */ + kHIDUsage_Button_251 = 0xfb, /* (251st button) */ + kHIDUsage_Button_252 = 0xfc, /* (252nd button) */ + kHIDUsage_Button_253 = 0xfd, /* (253rd button) */ + kHIDUsage_Button_254 = 0xfe, /* (254th button) */ + kHIDUsage_Button_255 = 0xff, /* (255th button) */ + /* ... */ + kHIDUsage_Button_65535 = 0xFFFF +}; + +/* Ordinal Page (0x0A) */ +/* The Ordinal page allows multiple instances of a control or sets of controls to be declared without requiring individual enumeration in the native usage page. For example, it is not necessary to declare usages of Pointer 1, Pointer 2, and so forth on the Generic Desktop page. When parsed, the ordinal instance number is, in essence, concatenated to the usages attached to the encompassing collection to create Pointer 1, Pointer 2, and so forth. */ +/* For an example, see Section A.5, ÒMultiple Instances of a Control,Ó in Appendix A, ÒUsage Examples.Ó By convention, an Ordinal collection is placed inside the collection for which it is declaring multiple instances. */ +/* Instances do not have to be identical. */ +enum +{ + /* 0x00 Reserved */ + kHIDUsage_Ord_Instance1 = 0x01, /* Usage Modifier */ + kHIDUsage_Ord_Instance2 = 0x02, /* Usage Modifier */ + kHIDUsage_Ord_Instance3 = 0x03, /* Usage Modifier */ + kHIDUsage_Ord_Instance4 = 0x04, /* Usage Modifier */ + kHIDUsage_Ord_Instance65535 = 0xFFFF /* Usage Modifier */ +}; + +/* Telephony Page (0x0B) */ +/* This usage page defines the keytop and control usages for telephony devices. */ +/* Indicators on a phone are handled by wrapping them in LED: Usage In Use Indicator and LED: Usage Selected Indicator usages. For example, a message-indicator LED would be identified by a Telephony: Message usage declared as a Feature or Output in a LED: Usage In Use Indicator collection. */ +/* See Section 14, ÒConsumer Page (0x0C),Ó for audio volume and tone controls. */ +enum +{ + kHIDUsage_Tfon_Phone = 0x01, /* Application Collection */ + kHIDUsage_Tfon_AnsweringMachine = 0x02, /* Application Collection */ + kHIDUsage_Tfon_MessageControls = 0x03, /* Logical Collection */ + kHIDUsage_Tfon_Handset = 0x04, /* Logical Collection */ + kHIDUsage_Tfon_Headset = 0x05, /* Logical Collection */ + kHIDUsage_Tfon_TelephonyKeyPad = 0x06, /* Named Array */ + kHIDUsage_Tfon_ProgrammableButton = 0x07, /* Named Array */ + /* 0x08 - 0x1F Reserved */ + kHIDUsage_Tfon_HookSwitch = 0x20, /* On/Off Control */ + kHIDUsage_Tfon_Flash = 0x21, /* Momentary Control */ + kHIDUsage_Tfon_Feature = 0x22, /* One-Shot Control */ + kHIDUsage_Tfon_Hold = 0x23, /* On/Off Control */ + kHIDUsage_Tfon_Redial = 0x24, /* One-Shot Control */ + kHIDUsage_Tfon_Transfer = 0x25, /* One-Shot Control */ + kHIDUsage_Tfon_Drop = 0x26, /* One-Shot Control */ + kHIDUsage_Tfon_Park = 0x27, /* On/Off Control */ + kHIDUsage_Tfon_ForwardCalls = 0x28, /* On/Off Control */ + kHIDUsage_Tfon_AlternateFunction = 0x29, /* Momentary Control */ + kHIDUsage_Tfon_Line = 0x2A, /* One-Shot Control */ + kHIDUsage_Tfon_SpeakerPhone = 0x2B, /* On/Off Control */ + kHIDUsage_Tfon_Conference = 0x2C, /* On/Off Control */ + kHIDUsage_Tfon_RingEnable = 0x2D, /* On/Off Control */ + kHIDUsage_Tfon_Ring = 0x2E, /* Selector */ + kHIDUsage_Tfon_PhoneMute = 0x2F, /* On/Off Control */ + kHIDUsage_Tfon_CallerID = 0x30, /* Momentary Control */ + /* 0x31 - 0x4F Reserved */ + kHIDUsage_Tfon_SpeedDial = 0x50, /* One-Shot Control */ + kHIDUsage_Tfon_StoreNumber = 0x51, /* One-Shot Control */ + kHIDUsage_Tfon_RecallNumber = 0x52, /* One-Shot Control */ + kHIDUsage_Tfon_PhoneDirectory = 0x53, /* On/Off Control */ + /* 0x54 - 0x6F Reserved */ + kHIDUsage_Tfon_VoiceMail = 0x70, /* On/Off Control */ + kHIDUsage_Tfon_ScreenCalls = 0x71, /* On/Off Control */ + kHIDUsage_Tfon_DoNotDisturb = 0x72, /* On/Off Control */ + kHIDUsage_Tfon_Message = 0x73, /* One-Shot Control */ + kHIDUsage_Tfon_AnswerOnOrOff = 0x74, /* On/Off Control */ + /* 0x75 - 0x8F Reserved */ + kHIDUsage_Tfon_InsideDialTone = 0x90, /* Momentary Control */ + kHIDUsage_Tfon_OutsideDialTone = 0x91, /* Momentary Control */ + kHIDUsage_Tfon_InsideRingTone = 0x92, /* Momentary Control */ + kHIDUsage_Tfon_OutsideRingTone = 0x93, /* Momentary Control */ + kHIDUsage_Tfon_PriorityRingTone = 0x94, /* Momentary Control */ + kHIDUsage_Tfon_InsideRingback = 0x95, /* Momentary Control */ + kHIDUsage_Tfon_PriorityRingback = 0x96, /* Momentary Control */ + kHIDUsage_Tfon_LineBusyTone = 0x97, /* Momentary Control */ + kHIDUsage_Tfon_ReorderTone = 0x98, /* Momentary Control */ + kHIDUsage_Tfon_CallWaitingTone = 0x99, /* Momentary Control */ + kHIDUsage_Tfon_ConfirmationTone1 = 0x9A, /* Momentary Control */ + kHIDUsage_Tfon_ConfirmationTone2 = 0x9B, /* Momentary Control */ + kHIDUsage_Tfon_TonesOff = 0x9C, /* On/Off Control */ + kHIDUsage_Tfon_OutsideRingback = 0x9D, /* Momentary Control */ + /* 0x9E - 0xAF Reserved */ + kHIDUsage_Tfon_PhoneKey0 = 0xB0, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKey1 = 0xB1, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKey2 = 0xB2, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKey3 = 0xB3, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKey4 = 0xB4, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKey5 = 0xB5, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKey6 = 0xB6, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKey7 = 0xB7, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKey8 = 0xB8, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKey9 = 0xB9, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKeyStar = 0xBA, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKeyPound = 0xBB, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKeyA = 0xBC, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKeyB = 0xBD, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKeyC = 0xBE, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKeyD = 0xBF, /* Selector/One-Shot Control */ + /* 0xC0 - 0xFFFF Reserved */ + kHIDUsage_TFon_Reserved = 0xFFFF +}; + +/* Consumer Page (0x0C) */ +/* All controls on the Consumer page are application-specific. That is, they affect a specific device, not the system as a whole. */ +enum +{ + kHIDUsage_Csmr_ConsumerControl = 0x01, /* Application Collection */ + kHIDUsage_Csmr_NumericKeyPad = 0x02, /* Named Array */ + kHIDUsage_Csmr_ProgrammableButtons = 0x03, /* Named Array */ + kHIDUsage_Csmr_Microphone = 0x04, /* Application Collection */ + kHIDUsage_Csmr_Headphone = 0x05, /* Application Collection */ + kHIDUsage_Csmr_GraphicEqualizer = 0x06, /* Application Collection */ + /* 0x07 - 0x1F Reserved */ + kHIDUsage_Csmr_Plus10 = 0x20, /* One-Shot Control */ + kHIDUsage_Csmr_Plus100 = 0x21, /* One-Shot Control */ + kHIDUsage_Csmr_AMOrPM = 0x22, /* One-Shot Control */ + /* 0x23 - 0x3F Reserved */ + kHIDUsage_Csmr_Power = 0x30, /* On/Off Control */ + kHIDUsage_Csmr_Reset = 0x31, /* One-Shot Control */ + kHIDUsage_Csmr_Sleep = 0x32, /* One-Shot Control */ + kHIDUsage_Csmr_SleepAfter = 0x33, /* One-Shot Control */ + kHIDUsage_Csmr_SleepMode = 0x34, /* Re-Trigger Control */ + kHIDUsage_Csmr_Illumination = 0x35, /* On/Off Control */ + kHIDUsage_Csmr_FunctionButtons = 0x36, /* Named Array */ + /* 0x37 - 0x3F Reserved */ + kHIDUsage_Csmr_Menu = 0x40, /* On/Off Control */ + kHIDUsage_Csmr_MenuPick = 0x41, /* One-Shot Control */ + kHIDUsage_Csmr_MenuUp = 0x42, /* One-Shot Control */ + kHIDUsage_Csmr_MenuDown = 0x43, /* One-Shot Control */ + kHIDUsage_Csmr_MenuLeft = 0x44, /* One-Shot Control */ + kHIDUsage_Csmr_MenuRight = 0x45, /* One-Shot Control */ + kHIDUsage_Csmr_MenuEscape = 0x46, /* One-Shot Control */ + kHIDUsage_Csmr_MenuValueIncrease = 0x47, /* One-Shot Control */ + kHIDUsage_Csmr_MenuValueDecrease = 0x48, /* One-Shot Control */ + /* 0x49 - 0x5F Reserved */ + kHIDUsage_Csmr_DataOnScreen = 0x60, /* On/Off Control */ + kHIDUsage_Csmr_ClosedCaption = 0x61, /* On/Off Control */ + kHIDUsage_Csmr_ClosedCaptionSelect = 0x62, /* Selector */ + kHIDUsage_Csmr_VCROrTV = 0x63, /* On/Off Control */ + kHIDUsage_Csmr_BroadcastMode = 0x64, /* One-Shot Control */ + kHIDUsage_Csmr_Snapshot = 0x65, /* One-Shot Control */ + kHIDUsage_Csmr_Still = 0x66, /* One-Shot Control */ + kHIDUsage_Csmr_PictureInPictureToggle = 0x67, /* One-Shot Control */ + kHIDUsage_Csmr_PictureInPictureSwap = 0x68, /* One-Shot Control */ + kHIDUsage_Csmr_RedMenuButton = 0x69, /* Momentary Control */ + kHIDUsage_Csmr_GreenMenuButton = 0x6A, /* Momentary Control */ + kHIDUsage_Csmr_BlueMenuButton = 0x6B, /* Momentary Control */ + kHIDUsage_Csmr_YellowMenuButton = 0x6C, /* Momentary Control */ + kHIDUsage_Csmr_Aspect = 0x6D, /* One-shot Control */ + kHIDUsage_Csmr_3DModeSelect = 0x6E, /* One-shot Control */ + kHIDUsage_Csmr_DisplayBrightnessIncrement = 0x6F, /* Re-Trigger Control */ + kHIDUsage_Csmr_DisplayBrightnessDecrement = 0x70, /* Re-Trigger Control */ + kHIDUsage_Csmr_DisplayBrightness = 0x71, /* Logical Collection */ + kHIDUsage_Csmr_DisplayBacklightToggle = 0x72, /* One Shot Control */ + kHIDUsage_Csmr_DisplayBrightnessMinimum = 0x73, /* One Shot Control */ + kHIDUsage_Csmr_DisplayBrightnessMaximum = 0x74, /* One Shot Control */ + kHIDUsage_Csmr_DisplayBrightnessSetAutoBrightness = 0x75, /* On Off Control */ + kHIDUsage_Csmr_KeyboardBrightnessIncrement = 0x79, /* Re-Trigger Control */ + kHIDUsage_Csmr_KeyboardBrightnessDecrement = 0x7A, /* Re-Trigger Control */ + /* 0x7B - 0x7F Reserved */ + kHIDUsage_Csmr_Selection = 0x80, /* Named Array */ + kHIDUsage_Csmr_Assign = 0x81, /* Selector */ + kHIDUsage_Csmr_ModeStep = 0x82, /* One-Shot Control */ + kHIDUsage_Csmr_RecallLast = 0x83, /* One-Shot Control */ + kHIDUsage_Csmr_EnterChannel = 0x84, /* One-Shot Control */ + kHIDUsage_Csmr_OrderMovie = 0x85, /* One-Shot Control */ + kHIDUsage_Csmr_Channel = 0x86, /* Linear Control */ + kHIDUsage_Csmr_MediaSelection = 0x87, /* Selector */ + kHIDUsage_Csmr_MediaSelectComputer = 0x88, /* Selector */ + kHIDUsage_Csmr_MediaSelectTV = 0x89, /* Selector */ + kHIDUsage_Csmr_MediaSelectWWW = 0x8A, /* Selector */ + kHIDUsage_Csmr_MediaSelectDVD = 0x8B, /* Selector */ + kHIDUsage_Csmr_MediaSelectTelephone = 0x8C, /* Selector */ + kHIDUsage_Csmr_MediaSelectProgramGuide = 0x8D, /* Selector */ + kHIDUsage_Csmr_MediaSelectVideoPhone = 0x8E, /* Selector */ + kHIDUsage_Csmr_MediaSelectGames = 0x8F, /* Selector */ + kHIDUsage_Csmr_MediaSelectMessages = 0x90, /* Selector */ + kHIDUsage_Csmr_MediaSelectCD = 0x91, /* Selector */ + kHIDUsage_Csmr_MediaSelectVCR = 0x92, /* Selector */ + kHIDUsage_Csmr_MediaSelectTuner = 0x93, /* Selector */ + kHIDUsage_Csmr_Quit = 0x94, /* One-Shot Control */ + kHIDUsage_Csmr_Help = 0x95, /* On/Off Control */ + kHIDUsage_Csmr_MediaSelectTape = 0x96, /* Selector */ + kHIDUsage_Csmr_MediaSelectCable = 0x97, /* Selector */ + kHIDUsage_Csmr_MediaSelectSatellite = 0x98, /* Selector */ + kHIDUsage_Csmr_MediaSelectSecurity = 0x99, /* Selector */ + kHIDUsage_Csmr_MediaSelectHome = 0x9A, /* Selector */ + kHIDUsage_Csmr_MediaSelectCall = 0x9B, /* Selector */ + kHIDUsage_Csmr_ChannelIncrement = 0x9C, /* One-Shot Control */ + kHIDUsage_Csmr_ChannelDecrement = 0x9D, /* One-Shot Control */ + kHIDUsage_Csmr_Media = 0x9E, /* Selector */ + /* 0x9F Reserved */ + kHIDUsage_Csmr_VCRPlus = 0xA0, /* One-Shot Control */ + kHIDUsage_Csmr_Once = 0xA1, /* One-Shot Control */ + kHIDUsage_Csmr_Daily = 0xA2, /* One-Shot Control */ + kHIDUsage_Csmr_Weekly = 0xA3, /* One-Shot Control */ + kHIDUsage_Csmr_Monthly = 0xA4, /* One-Shot Control */ + /* 0xA5 - 0xAF Reserved */ + kHIDUsage_Csmr_Play = 0xB0, /* On/Off Control */ + kHIDUsage_Csmr_Pause = 0xB1, /* On/Off Control */ + kHIDUsage_Csmr_Record = 0xB2, /* On/Off Control */ + kHIDUsage_Csmr_FastForward = 0xB3, /* On/Off Control */ + kHIDUsage_Csmr_Rewind = 0xB4, /* On/Off Control */ + kHIDUsage_Csmr_ScanNextTrack = 0xB5, /* One-Shot Control */ + kHIDUsage_Csmr_ScanPreviousTrack = 0xB6, /* One-Shot Control */ + kHIDUsage_Csmr_Stop = 0xB7, /* One-Shot Control */ + kHIDUsage_Csmr_Eject = 0xB8, /* One-Shot Control */ + kHIDUsage_Csmr_RandomPlay = 0xB9, /* On/Off Control */ + kHIDUsage_Csmr_SelectDisc = 0xBA, /* Named Array */ + kHIDUsage_Csmr_EnterDisc = 0xBB, /* Momentary Control */ + kHIDUsage_Csmr_Repeat = 0xBC, /* One-Shot Control */ + kHIDUsage_Csmr_Tracking = 0xBD, /* Linear Control */ + kHIDUsage_Csmr_TrackNormal = 0xBE, /* One-Shot Control */ + kHIDUsage_Csmr_SlowTracking = 0xBF, /* Linear Control */ + kHIDUsage_Csmr_FrameForward = 0xC0, /* Re-Trigger Control */ + kHIDUsage_Csmr_FrameBack = 0xC1, /* Re-Trigger Control */ + kHIDUsage_Csmr_Mark = 0xC2, /* One-Shot Control */ + kHIDUsage_Csmr_ClearMark = 0xC3, /* One-Shot Control */ + kHIDUsage_Csmr_RepeatFromMark = 0xC4, /* On/Off Control */ + kHIDUsage_Csmr_ReturnToMark = 0xC5, /* One-Shot Control */ + kHIDUsage_Csmr_SearchMarkForward = 0xC6, /* One-Shot Control */ + kHIDUsage_Csmr_SearchMarkBackwards = 0xC7, /* One-Shot Control */ + kHIDUsage_Csmr_CounterReset = 0xC8, /* One-Shot Control */ + kHIDUsage_Csmr_ShowCounter = 0xC9, /* One-Shot Control */ + kHIDUsage_Csmr_TrackingIncrement = 0xCA, /* Re-Trigger Control */ + kHIDUsage_Csmr_TrackingDecrement = 0xCB, /* Re-Trigger Control */ + kHIDUsage_Csmr_StopOrEject = 0xCC, /* One-Shot Control */ + kHIDUsage_Csmr_PlayOrPause = 0xCD, /* One-Shot Control */ + kHIDUsage_Csmr_PlayOrSkip = 0xCE, /* One-Shot Control */ + kHIDUsage_Csmr_VoiceCommand = 0xCF, /* One-Shot Control */ + /* 0xCF - 0xDF Reserved */ + kHIDUsage_Csmr_Volume = 0xE0, /* Linear Control */ + kHIDUsage_Csmr_Balance = 0xE1, /* Linear Control */ + kHIDUsage_Csmr_Mute = 0xE2, /* On/Off Control */ + kHIDUsage_Csmr_Bass = 0xE3, /* Linear Control */ + kHIDUsage_Csmr_Treble = 0xE4, /* Linear Control */ + kHIDUsage_Csmr_BassBoost = 0xE5, /* On/Off Control */ + kHIDUsage_Csmr_SurroundMode = 0xE6, /* One-Shot Control */ + kHIDUsage_Csmr_Loudness = 0xE7, /* On/Off Control */ + kHIDUsage_Csmr_MPX = 0xE8, /* On/Off Control */ + kHIDUsage_Csmr_VolumeIncrement = 0xE9, /* Re-Trigger Control */ + kHIDUsage_Csmr_VolumeDecrement = 0xEA, /* Re-Trigger Control */ + /* 0xEB - 0xEF Reserved */ + kHIDUsage_Csmr_Speed = 0xF0, /* Selector */ + kHIDUsage_Csmr_PlaybackSpeed = 0xF1, /* Named Array */ + kHIDUsage_Csmr_StandardPlay = 0xF2, /* Selector */ + kHIDUsage_Csmr_LongPlay = 0xF3, /* Selector */ + kHIDUsage_Csmr_ExtendedPlay = 0xF4, /* Selector */ + kHIDUsage_Csmr_Slow = 0xF5, /* One-Shot Control */ + /* 0xF6 - 0xFF Reserved */ + kHIDUsage_Csmr_FanEnable = 0x100, /* On/Off Control */ + kHIDUsage_Csmr_FanSpeed = 0x101, /* Linear Control */ + kHIDUsage_Csmr_LightEnable = 0x102, /* On/Off Control */ + kHIDUsage_Csmr_LightIlluminationLevel = 0x103, /* Linear Control */ + kHIDUsage_Csmr_ClimateControlEnable = 0x104, /* On/Off Control */ + kHIDUsage_Csmr_RoomTemperature = 0x105, /* Linear Control */ + kHIDUsage_Csmr_SecurityEnable = 0x106, /* On/Off Control */ + kHIDUsage_Csmr_FireAlarm = 0x107, /* One-Shot Control */ + kHIDUsage_Csmr_PoliceAlarm = 0x108, /* One-Shot Control */ + kHIDUsage_Csmr_Proximity = 0x109, /* Linear Control */ + kHIDUsage_Csmr_Motion = 0x10A, /* One-Shot Control */ + kHIDUsage_Csmr_DuressAlarm = 0x10B, /* One-Shot Control */ + kHIDUsage_Csmr_HoldupAlarm = 0x10C, /* One-Shot Control */ + kHIDUsage_Csmr_MedicalAlarm = 0x10D, /* One-Shot Control */ + /* 0x10E - 0x14F Reserved */ + kHIDUsage_Csmr_BalanceRight = 0x150, /* Re-Trigger Control */ + kHIDUsage_Csmr_BalanceLeft = 0x151, /* Re-Trigger Control */ + kHIDUsage_Csmr_BassIncrement = 0x152, /* Re-Trigger Control */ + kHIDUsage_Csmr_BassDecrement = 0x153, /* Re-Trigger Control */ + kHIDUsage_Csmr_TrebleIncrement = 0x154, /* Re-Trigger Control */ + kHIDUsage_Csmr_TrebleDecrement = 0x155, /* Re-Trigger Control */ + /* 0x156 - 0x15F Reserved */ + kHIDUsage_Csmr_SpeakerSystem = 0x160, /* Logical Collection */ + kHIDUsage_Csmr_ChannelLeft = 0x161, /* Logical Collection */ + kHIDUsage_Csmr_ChannelRight = 0x162, /* Logical Collection */ + kHIDUsage_Csmr_ChannelCenter = 0x163, /* Logical Collection */ + kHIDUsage_Csmr_ChannelFront = 0x164, /* Logical Collection */ + kHIDUsage_Csmr_ChannelCenterFront = 0x165, /* Logical Collection */ + kHIDUsage_Csmr_ChannelSide = 0x166, /* Logical Collection */ + kHIDUsage_Csmr_ChannelSurround = 0x167, /* Logical Collection */ + kHIDUsage_Csmr_ChannelLowFrequencyEnhancement = 0x168, /* Logical Collection */ + kHIDUsage_Csmr_ChannelTop = 0x169, /* Logical Collection */ + kHIDUsage_Csmr_ChannelUnknown = 0x16A, /* Logical Collection */ + /* 0x16B - 0x16F Reserved */ + kHIDUsage_Csmr_SubChannel = 0x170, /* Linear Control */ + kHIDUsage_Csmr_SubChannelIncrement = 0x171, /* One-Shot Control */ + kHIDUsage_Csmr_SubChannelDecrement = 0x172, /* One-Shot Control */ + kHIDUsage_Csmr_AlternateAudioIncrement = 0x173, /* One-Shot Control */ + kHIDUsage_Csmr_AlternateAudioDecrement = 0x174, /* One-Shot Control */ + /* 0x175 - 0x17F Reserved */ + kHIDUsage_Csmr_ApplicationLaunchButtons = 0x180, /* Named Array */ + kHIDUsage_Csmr_ALLaunchButtonConfigurationTool = 0x181, /* Selector */ + kHIDUsage_Csmr_ALProgrammableButtonConfiguration = 0x182, /* Selector */ + kHIDUsage_Csmr_ALConsumerControlConfiguration = 0x183, /* Selector */ + kHIDUsage_Csmr_ALWordProcessor = 0x184, /* Selector */ + kHIDUsage_Csmr_ALTextEditor = 0x185, /* Selector */ + kHIDUsage_Csmr_ALSpreadsheet = 0x186, /* Selector */ + kHIDUsage_Csmr_ALGraphicsEditor = 0x187, /* Selector */ + kHIDUsage_Csmr_ALPresentationApp = 0x188, /* Selector */ + kHIDUsage_Csmr_ALDatabaseApp = 0x189, /* Selector */ + kHIDUsage_Csmr_ALEmailReader = 0x18A, /* Selector */ + kHIDUsage_Csmr_ALNewsreader = 0x18B, /* Selector */ + kHIDUsage_Csmr_ALVoicemail = 0x18C, /* Selector */ + kHIDUsage_Csmr_ALContactsOrAddressBook = 0x18D, /* Selector */ + kHIDUsage_Csmr_ALCalendarOrSchedule = 0x18E, /* Selector */ + kHIDUsage_Csmr_ALTaskOrProjectManager = 0x18F, /* Selector */ + kHIDUsage_Csmr_ALLogOrJournalOrTimecard = 0x190, /* Selector */ + kHIDUsage_Csmr_ALCheckbookOrFinance = 0x191, /* Selector */ + kHIDUsage_Csmr_ALCalculator = 0x192, /* Selector */ + kHIDUsage_Csmr_ALAOrVCaptureOrPlayback = 0x193, /* Selector */ + kHIDUsage_Csmr_ALLocalMachineBrowser = 0x194, /* Selector */ + kHIDUsage_Csmr_ALLANOrWANBrowser = 0x195, /* Selector */ + kHIDUsage_Csmr_ALInternetBrowser = 0x196, /* Selector */ + kHIDUsage_Csmr_ALRemoteNetworkingOrISPConnect = 0x197, /* Selector */ + kHIDUsage_Csmr_ALNetworkConference = 0x198, /* Selector */ + kHIDUsage_Csmr_ALNetworkChat = 0x199, /* Selector */ + kHIDUsage_Csmr_ALTelephonyOrDialer = 0x19A, /* Selector */ + kHIDUsage_Csmr_ALLogon = 0x19B, /* Selector */ + kHIDUsage_Csmr_ALLogoff = 0x19C, /* Selector */ + kHIDUsage_Csmr_ALLogonOrLogoff = 0x19D, /* Selector */ + kHIDUsage_Csmr_ALTerminalLockOrScreensaver = 0x19E, /* Selector */ + kHIDUsage_Csmr_ALControlPanel = 0x19F, /* Selector */ + kHIDUsage_Csmr_ALCommandLineProcessorOrRun = 0x1A0, /* Selector */ + kHIDUsage_Csmr_ALProcessOrTaskManager = 0x1A1, /* Selector */ + kHIDUsage_Csmr_AL = 0x1A2, /* Selector */ + kHIDUsage_Csmr_ALNextTaskOrApplication = 0x1A3, /* Selector */ + kHIDUsage_Csmr_ALPreviousTaskOrApplication = 0x1A4, /* Selector */ + kHIDUsage_Csmr_ALPreemptiveHaltTaskOrApplication = 0x1A5, /* Selector */ + kHIDUsage_Csmr_ALIntegratedHelpCenter = 0x1A6, /* Selector */ + kHIDUsage_Csmr_ALDocuments = 0x1A7, /* Selector */ + kHIDUsage_Csmr_ALThesaurus = 0x1A8, /* Selector */ + kHIDUsage_Csmr_ALDictionary = 0x1A9, /* Selector */ + kHIDUsage_Csmr_ALDesktop = 0x1AA, /* Selector */ + kHIDUsage_Csmr_ALSpellCheck = 0x1AB, /* Selector */ + kHIDUsage_Csmr_ALGrammerCheck = 0x1AC, /* Selector */ + kHIDUsage_Csmr_ALWirelessStatus = 0x1AD, /* Selector */ + kHIDUsage_Csmr_ALKeyboardLayout = 0x1AE, /* Selector */ + kHIDUsage_Csmr_ALVirusProtection = 0x1AF, /* Selector */ + kHIDUsage_Csmr_ALEncryption = 0x1B0, /* Selector */ + kHIDUsage_Csmr_ALScreenSaver = 0x1B1, /* Selector */ + kHIDUsage_Csmr_ALAlarms = 0x1B2, /* Selector */ + kHIDUsage_Csmr_ALClock = 0x1B3, /* Selector */ + kHIDUsage_Csmr_ALFileBrowser = 0x1B4, /* Selector */ + kHIDUsage_Csmr_ALPowerStatus = 0x1B5, /* Selector */ + kHIDUsage_Csmr_ALImageBrowser = 0x1B6, /* Selector */ + kHIDUsage_Csmr_ALAudioBrowser = 0x1B7, /* Selector */ + kHIDUsage_Csmr_ALMovieBrowser = 0x1B8, /* Selector */ + kHIDUsage_Csmr_ALDigitalRightsManager = 0x1B9, /* Selector */ + kHIDUsage_Csmr_ALDigitalWallet = 0x1BA, /* Selector */ + /* 0x1BB Reserved */ + kHIDUsage_Csmr_ALInstantMessaging = 0x1BC, /* Selector */ + kHIDUsage_Csmr_ALOEMFeatureBrowser = 0x1BD, /* Selector */ + kHIDUsage_Csmr_ALOEMHelp = 0x1BE, /* Selector */ + kHIDUsage_Csmr_ALOnlineCommunity = 0x1BF, /* Selector */ + kHIDUsage_Csmr_ALEntertainmentContentBrowser = 0x1C0, /* Selector */ + kHIDUsage_Csmr_ALOnlineShoppingBrowswer = 0x1C1, /* Selector */ + kHIDUsage_Csmr_ALSmartCardInformationOrHelp = 0x1C2, /* Selector */ + kHIDUsage_Csmr_ALMarketMonitorOrFinanceBrowser = 0x1C3, /* Selector */ + kHIDUsage_Csmr_ALCustomizedCorporateNewsBrowser = 0x1C4, /* Selector */ + kHIDUsage_Csmr_ALOnlineActivityBrowswer= 0x1C5, /* Selector */ + kHIDUsage_Csmr_ALResearchOrSearchBrowswer = 0x1C6, /* Selector */ + kHIDUsage_Csmr_ALAudioPlayer= 0x1C7, /* Selector */ + kHIDUsage_Csmr_ALNavigation = 0x1C8, /* Selector */ + /* 0x1C9 - 0x1FF Reserved */ + kHIDUsage_Csmr_GenericGUIApplicationControls = 0x200, /* Named Array */ + kHIDUsage_Csmr_ACNew = 0x201, /* Selector */ + kHIDUsage_Csmr_ACOpen = 0x202, /* Selector */ + kHIDUsage_Csmr_ACClose = 0x203, /* Selector */ + kHIDUsage_Csmr_ACExit = 0x204, /* Selector */ + kHIDUsage_Csmr_ACMaximize = 0x205, /* Selector */ + kHIDUsage_Csmr_ACMinimize = 0x206, /* Selector */ + kHIDUsage_Csmr_ACSave = 0x207, /* Selector */ + kHIDUsage_Csmr_ACPrint = 0x208, /* Selector */ + kHIDUsage_Csmr_ACProperties = 0x209, /* Selector */ + kHIDUsage_Csmr_ACUndo = 0x21A, /* Selector */ + kHIDUsage_Csmr_ACCopy = 0x21B, /* Selector */ + kHIDUsage_Csmr_ACCut = 0x21C, /* Selector */ + kHIDUsage_Csmr_ACPaste = 0x21D, /* Selector */ + kHIDUsage_Csmr_AC = 0x21E, /* Selector */ + kHIDUsage_Csmr_ACFind = 0x21F, /* Selector */ + kHIDUsage_Csmr_ACFindandReplace = 0x220, /* Selector */ + kHIDUsage_Csmr_ACSearch = 0x221, /* Selector */ + kHIDUsage_Csmr_ACGoTo = 0x222, /* Selector */ + kHIDUsage_Csmr_ACHome = 0x223, /* Selector */ + kHIDUsage_Csmr_ACBack = 0x224, /* Selector */ + kHIDUsage_Csmr_ACForward = 0x225, /* Selector */ + kHIDUsage_Csmr_ACStop = 0x226, /* Selector */ + kHIDUsage_Csmr_ACRefresh = 0x227, /* Selector */ + kHIDUsage_Csmr_ACPreviousLink = 0x228, /* Selector */ + kHIDUsage_Csmr_ACNextLink = 0x229, /* Selector */ + kHIDUsage_Csmr_ACBookmarks = 0x22A, /* Selector */ + kHIDUsage_Csmr_ACHistory = 0x22B, /* Selector */ + kHIDUsage_Csmr_ACSubscriptions = 0x22C, /* Selector */ + kHIDUsage_Csmr_ACZoomIn = 0x22D, /* Selector */ + kHIDUsage_Csmr_ACZoomOut = 0x22E, /* Selector */ + kHIDUsage_Csmr_ACZoom = 0x22F, /* Selector */ + kHIDUsage_Csmr_ACFullScreenView = 0x230, /* Selector */ + kHIDUsage_Csmr_ACNormalView = 0x231, /* Selector */ + kHIDUsage_Csmr_ACViewToggle = 0x232, /* Selector */ + kHIDUsage_Csmr_ACScrollUp = 0x233, /* Selector */ + kHIDUsage_Csmr_ACScrollDown = 0x234, /* Selector */ + kHIDUsage_Csmr_ACScroll = 0x235, /* Selector */ + kHIDUsage_Csmr_ACPanLeft = 0x236, /* Selector */ + kHIDUsage_Csmr_ACPanRight = 0x237, /* Selector */ + kHIDUsage_Csmr_ACPan = 0x238, /* Selector */ + kHIDUsage_Csmr_ACNewWindow = 0x239, /* Selector */ + kHIDUsage_Csmr_ACTileHorizontally = 0x23A, /* Selector */ + kHIDUsage_Csmr_ACTileVertically = 0x23B, /* Selector */ + kHIDUsage_Csmr_ACFormat = 0x23C, /* Selector */ + kHIDUsage_Csmr_ACEdit = 0x23D, /* Selector */ + kHIDUsage_Csmr_ACBold = 0x23E, /* Selector */ + kHIDUsage_Csmr_ACItalics = 0x23F, /* Selector */ + kHIDUsage_Csmr_ACUnderline = 0x240, /* Selector */ + kHIDUsage_Csmr_ACStrikethrough = 0x241, /* Selector */ + kHIDUsage_Csmr_ACSubscript = 0x242, /* Selector */ + kHIDUsage_Csmr_ACSuperscript = 0x243, /* Selector */ + kHIDUsage_Csmr_ACAllCaps = 0x244, /* Selector */ + kHIDUsage_Csmr_ACRotate = 0x245, /* Selector */ + kHIDUsage_Csmr_ACResize = 0x246, /* Selector */ + kHIDUsage_Csmr_ACFlipHorizontal = 0x247, /* Selector */ + kHIDUsage_Csmr_ACFlipVertical = 0x248, /* Selector */ + kHIDUsage_Csmr_ACMirrorHorizontal = 0x249, /* Selector */ + kHIDUsage_Csmr_ACMirrorVertical = 0x24A, /* Selector */ + kHIDUsage_Csmr_ACFontSelect = 0x24B, /* Selector */ + kHIDUsage_Csmr_ACFontColor = 0x24C, /* Selector */ + kHIDUsage_Csmr_ACFontSize = 0x24D, /* Selector */ + kHIDUsage_Csmr_ACJustifyLeft = 0x24E, /* Selector */ + kHIDUsage_Csmr_ACJustifyCenterH = 0x24F, /* Selector */ + kHIDUsage_Csmr_ACJustifyRight = 0x250, /* Selector */ + kHIDUsage_Csmr_ACJustifyBlockH = 0x251, /* Selector */ + kHIDUsage_Csmr_ACJustifyTop = 0x252, /* Selector */ + kHIDUsage_Csmr_ACJustifyCenterV = 0x253, /* Selector */ + kHIDUsage_Csmr_ACJustifyBottom = 0x254, /* Selector */ + kHIDUsage_Csmr_ACJustifyBlockV = 0x255, /* Selector */ + kHIDUsage_Csmr_ACIndentyDecrease = 0x256, /* Selector */ + kHIDUsage_Csmr_ACIndentyIncrease = 0x257, /* Selector */ + kHIDUsage_Csmr_ACNumberedList = 0x258, /* Selector */ + kHIDUsage_Csmr_ACRestartNumbering = 0x259, /* Selector */ + kHIDUsage_Csmr_ACBulletedList = 0x25A, /* Selector */ + kHIDUsage_Csmr_ACPromote = 0x25B, /* Selector */ + kHIDUsage_Csmr_ACDemote = 0x25C, /* Selector */ + kHIDUsage_Csmr_ACYes = 0x25D, /* Selector */ + kHIDUsage_Csmr_ACNo = 0x25E, /* Selector */ + kHIDUsage_Csmr_ACCancel = 0x25F, /* Selector */ + kHIDUsage_Csmr_ACCatalog = 0x260, /* Selector */ + kHIDUsage_Csmr_ACBuyOrCheckout = 0x261, /* Selector */ + kHIDUsage_Csmr_ACAddToCart = 0x262, /* Selector */ + kHIDUsage_Csmr_ACExpand = 0x263, /* Selector */ + kHIDUsage_Csmr_ACExpandAll = 0x264, /* Selector */ + kHIDUsage_Csmr_ACCollapse = 0x265, /* Selector */ + kHIDUsage_Csmr_ACCollapseAll = 0x266, /* Selector */ + kHIDUsage_Csmr_ACPrintPreview = 0x267, /* Selector */ + kHIDUsage_Csmr_ACPasteSpecial = 0x268, /* Selector */ + kHIDUsage_Csmr_ACInsertMode = 0x269, /* Selector */ + kHIDUsage_Csmr_ACDelete = 0x26A, /* Selector */ + kHIDUsage_Csmr_ACLock = 0x26B, /* Selector */ + kHIDUsage_Csmr_ACUnlock = 0x26C, /* Selector */ + kHIDUsage_Csmr_ACProtect = 0x26D, /* Selector */ + kHIDUsage_Csmr_ACUnprotect = 0x26E, /* Selector */ + kHIDUsage_Csmr_ACAttachComment = 0x26F, /* Selector */ + kHIDUsage_Csmr_ACDetachComment = 0x270, /* Selector */ + kHIDUsage_Csmr_ACViewComment = 0x271, /* Selector */ + kHIDUsage_Csmr_ACSelectWord = 0x272, /* Selector */ + kHIDUsage_Csmr_ACSelectSentence = 0x273, /* Selector */ + kHIDUsage_Csmr_ACSelectParagraph = 0x274, /* Selector */ + kHIDUsage_Csmr_ACSelectColumn = 0x275, /* Selector */ + kHIDUsage_Csmr_ACSelectRow = 0x276, /* Selector */ + kHIDUsage_Csmr_ACSelectTable = 0x277, /* Selector */ + kHIDUsage_Csmr_ACSelectObject = 0x278, /* Selector */ + kHIDUsage_Csmr_ACRedoOrRepeat = 0x279, /* Selector */ + kHIDUsage_Csmr_ACSort = 0x27A, /* Selector */ + kHIDUsage_Csmr_ACSortAscending = 0x27B, /* Selector */ + kHIDUsage_Csmr_ACSortDescending = 0x27C, /* Selector */ + kHIDUsage_Csmr_ACFilter = 0x27D, /* Selector */ + kHIDUsage_Csmr_ACSetClock = 0x27E, /* Selector */ + kHIDUsage_Csmr_ACViewClock = 0x27F, /* Selector */ + kHIDUsage_Csmr_ACSelectTimeZone = 0x280, /* Selector */ + kHIDUsage_Csmr_ACEditTimeZones = 0x281, /* Selector */ + kHIDUsage_Csmr_ACSetAlarm = 0x282, /* Selector */ + kHIDUsage_Csmr_ACClearAlarm = 0x283, /* Selector */ + kHIDUsage_Csmr_ACSnoozeAlarm = 0x284, /* Selector */ + kHIDUsage_Csmr_ACResetAlarm = 0x285, /* Selector */ + kHIDUsage_Csmr_ACSynchronize = 0x286, /* Selector */ + kHIDUsage_Csmr_ACSendOrReceive = 0x287, /* Selector */ + kHIDUsage_Csmr_ACSendTo = 0x288, /* Selector */ + kHIDUsage_Csmr_ACReply = 0x289, /* Selector */ + kHIDUsage_Csmr_ACReplyAll = 0x28A, /* Selector */ + kHIDUsage_Csmr_ACForwardMessage = 0x28B, /* Selector */ + kHIDUsage_Csmr_ACSend = 0x28C, /* Selector */ + kHIDUsage_Csmr_ACAttachFile = 0x28D, /* Selector */ + kHIDUsage_Csmr_ACUpload = 0x28E, /* Selector */ + kHIDUsage_Csmr_ACDownload = 0x28F, /* Selector */ + kHIDUsage_Csmr_ACSetBorders = 0x290, /* Selector */ + kHIDUsage_Csmr_ACInsertRow = 0x291, /* Selector */ + kHIDUsage_Csmr_ACInsertColumn = 0x292, /* Selector */ + kHIDUsage_Csmr_ACInsertFile = 0x293, /* Selector */ + kHIDUsage_Csmr_ACInsertPicture = 0x294, /* Selector */ + kHIDUsage_Csmr_ACInsertObject = 0x295, /* Selector */ + kHIDUsage_Csmr_ACInsertSymbol = 0x296, /* Selector */ + kHIDUsage_Csmr_ACSaveAndClose = 0x297, /* Selector */ + kHIDUsage_Csmr_ACRename = 0x298, /* Selector */ + kHIDUsage_Csmr_ACMerge = 0x299, /* Selector */ + kHIDUsage_Csmr_ACSplit = 0x29A, /* Selector */ + kHIDUsage_Csmr_ACDistributeH = 0x29B, /* Selector */ + kHIDUsage_Csmr_ACDistributeV = 0x29C, /* Selector */ + kHIDUsage_Csmr_ACKeyboardLayoutSelect = 0x29D, /* One-Shot Control */ + kHIDUsage_Csmr_ACNavigationGuidance = 0x29E, /* Selector */ + kHIDUsage_Csmr_ACDesktopShowAllWindows = 0x29F, /* Selector */ + kHIDUsage_Csmr_ACDesktopShowAllApplications = 0x2A0, /* Selector */ + /* 0x2A1 - 0xFFFF Reserved */ + kHIDUsage_Csmr_Reserved = 0xFFFF +}; + +/* Digitizer Page (0x0D) */ +/* This section provides detailed descriptions of the usages employed by Digitizer Devices. */ +enum +{ + kHIDUsage_Dig_Digitizer = 0x01, /* Application Collection */ + kHIDUsage_Dig_Pen = 0x02, /* Application Collection */ + kHIDUsage_Dig_LightPen = 0x03, /* Application Collection */ + kHIDUsage_Dig_TouchScreen = 0x04, /* Application Collection */ + kHIDUsage_Dig_TouchPad = 0x05, /* Application Collection */ + kHIDUsage_Dig_WhiteBoard = 0x06, /* Application Collection */ + kHIDUsage_Dig_CoordinateMeasuringMachine = 0x07, /* Application Collection */ + kHIDUsage_Dig_3DDigitizer = 0x08, /* Application Collection */ + kHIDUsage_Dig_StereoPlotter = 0x09, /* Application Collection */ + kHIDUsage_Dig_ArticulatedArm = 0x0A, /* Application Collection */ + kHIDUsage_Dig_Armature = 0x0B, /* Application Collection */ + kHIDUsage_Dig_MultiplePointDigitizer = 0x0C, /* Application Collection */ + kHIDUsage_Dig_FreeSpaceWand = 0x0D, /* Application Collection */ + kHIDUsage_Dig_DeviceConfiguration = 0x0E, /* Application Collection */ + /* 0x0F - 0x1F Reserved */ + kHIDUsage_Dig_Stylus = 0x20, /* Logical Collection */ + kHIDUsage_Dig_Puck = 0x21, /* Logical Collection */ + kHIDUsage_Dig_Finger = 0x22, /* Logical Collection */ + kHIDUsage_Dig_DeviceSettings = 0x23, /* Logical Collection */ + kHIDUsage_Dig_GestureCharacter = 0x24, /* Logical Collection */ + /* 0x25 - 0x2F Reserved */ + kHIDUsage_Dig_TipPressure = 0x30, /* Dynamic Value */ + kHIDUsage_Dig_BarrelPressure = 0x31, /* Dynamic Value */ + kHIDUsage_Dig_InRange = 0x32, /* Momentary Control */ + kHIDUsage_Dig_Touch = 0x33, /* Momentary Control */ + kHIDUsage_Dig_Untouch = 0x34, /* One-Shot Control */ + kHIDUsage_Dig_Tap = 0x35, /* One-Shot Control */ + kHIDUsage_Dig_Quality = 0x36, /* Dynamic Value */ + kHIDUsage_Dig_DataValid = 0x37, /* Momentary Control */ + kHIDUsage_Dig_TransducerIndex = 0x38, /* Dynamic Value */ + kHIDUsage_Dig_TabletFunctionKeys = 0x39, /* Logical Collection */ + kHIDUsage_Dig_ProgramChangeKeys = 0x3A, /* Logical Collection */ + kHIDUsage_Dig_BatteryStrength = 0x3B, /* Dynamic Value */ + kHIDUsage_Dig_Invert = 0x3C, /* Momentary Control */ + kHIDUsage_Dig_XTilt = 0x3D, /* Dynamic Value */ + kHIDUsage_Dig_YTilt = 0x3E, /* Dynamic Value */ + kHIDUsage_Dig_Azimuth = 0x3F, /* Dynamic Value */ + kHIDUsage_Dig_Altitude = 0x40, /* Dynamic Value */ + kHIDUsage_Dig_Twist = 0x41, /* Dynamic Value */ + kHIDUsage_Dig_TipSwitch = 0x42, /* Momentary Control */ + kHIDUsage_Dig_SecondaryTipSwitch = 0x43, /* Momentary Control */ + kHIDUsage_Dig_BarrelSwitch = 0x44, /* Momentary Control */ + kHIDUsage_Dig_Eraser = 0x45, /* Momentary Control */ + kHIDUsage_Dig_TabletPick = 0x46, /* Momentary Control */ + kHIDUsage_Dig_TouchValid = 0x47, /* Momentary Control */ + kHIDUsage_Dig_Width = 0x48, /* Dynamic Value */ + kHIDUsage_Dig_Height = 0x49, /* Dynamic Value */ + /* 0x4A - 0x50 Reserved */ + kHIDUsage_Dig_ContactIdentifier = 0x51, /* Dynamic Value */ + kHIDUsage_Dig_DeviceMode = 0x52, /* Dynamic Value */ + kHIDUsage_Dig_DeviceIdentifier = 0x53, /* Dynamic Value */ + kHIDUsage_Dig_ContactCount = 0x54, /* Dynamic Value */ + kHIDUsage_Dig_ContactCountMaximum = 0x55, /* Static Value */ + kHIDUsage_Dig_RelativeScanTime = 0x56, /* Dynamic Value */ + kHIDUsage_Dig_SurfaceSwitch = 0x57, /* Dynamic Flag */ + + /* 0x56 - 0x5F Reserved */ + kHIDUsage_Dig_GestureCharacterEnable = 0x60, /* Dynamic Flag */ + kHIDUsage_Dig_GestureCharacterQuality = 0x61, /* Dynamic Value */ + kHIDUsage_Dig_GestureCharacterDataLength = 0x62, /* Dynamic Value */ + kHIDUsage_Dig_GestureCharacterData = 0x63, /* Buffered Bytes */ + kHIDUsage_Dig_GestureCharacterEncoding = 0x64, /* Named Array */ + kHIDUsage_Dig_GestureCharacterEncodingUTF8 = 0x65, /* Selector */ + kHIDUsage_Dig_GestureCharacterEncodingUTF16LE = 0x66, /* Selector */ + kHIDUsage_Dig_GestureCharacterEncodingUTF16BE = 0x67, /* Selector */ + kHIDUsage_Dig_GestureCharacterEncodingUTF32LE = 0x68, /* Selector */ + kHIDUsage_Dig_GestureCharacterEncodingUTF32BE = 0x69, /* Selector */ + + kHIDUsage_Dig_ReportRate = 0xA1, /* Dynamic Value */ + + /* 0x70 - 0xFFFF Reserved */ + kHIDUsage_Dig_Reserved = 0xFFFF +}; + +/* Physical Interface Device Page (0x0F) */ +/* This section provides detailed descriptions of the usages employed by Power Devices. */ +enum +{ + kHIDUsage_PID_PhysicalInterfaceDevice = 0x01, /* CA - A collection of PID usages */ + /* 0x02 - 0x1F Reserved */ + kHIDUsage_PID_Normal = 0x20, /* DV - A force applied perpendicular to the surface of an object */ + kHIDUsage_PID_SetEffectReport = 0x21, /* XXX */ + kHIDUsage_PID_EffectBlockIndex = 0x22, /* XXX */ + kHIDUsage_PID_ParamBlockOffset = 0x23, /* XXX */ + kHIDUsage_PID_ROM_Flag = 0x24, /* XXX */ + kHIDUsage_PID_EffectType = 0x25, /* XXX */ + kHIDUsage_PID_ET_ConstantForce = 0x26, /* XXX */ + kHIDUsage_PID_ET_Ramp = 0x27, /* XXX */ + kHIDUsage_PID_ET_CustomForceData = 0x28, /* XXX */ + /* 0x29 - 0x2F Reserved */ + kHIDUsage_PID_ET_Square = 0x30, /* XXX */ + kHIDUsage_PID_ET_Sine = 0x31, /* XXX */ + kHIDUsage_PID_ET_Triangle = 0x32, /* XXX */ + kHIDUsage_PID_ET_SawtoothUp = 0x33, /* XXX */ + kHIDUsage_PID_ET_SawtoothDown = 0x34, /* XXX */ + /* 0x35 - 0x3F Reserved */ + kHIDUsage_PID_ET_Spring = 0x40, /* XXX */ + kHIDUsage_PID_ET_Damper = 0x41, /* XXX */ + kHIDUsage_PID_ET_Inertia = 0x42, /* XXX */ + kHIDUsage_PID_ET_Friction = 0x43, /* XXX */ + /* 0x44 - 0x4F Reserved */ + kHIDUsage_PID_Duration = 0x50, /* XXX */ + kHIDUsage_PID_SamplePeriod = 0x51, /* XXX */ + kHIDUsage_PID_Gain = 0x52, /* XXX */ + kHIDUsage_PID_TriggerButton = 0x53, /* XXX */ + kHIDUsage_PID_TriggerRepeatInterval = 0x54, /* XXX */ + kHIDUsage_PID_AxesEnable = 0x55, /* XXX */ + kHIDUsage_PID_DirectionEnable = 0x56, /* XXX */ + kHIDUsage_PID_Direction = 0x57, /* XXX */ + kHIDUsage_PID_TypeSpecificBlockOffset = 0x58, /* XXX */ + kHIDUsage_PID_BlockType = 0x59, /* XXX */ + kHIDUsage_PID_SetEnvelopeReport = 0x5A, /* XXX */ + kHIDUsage_PID_AttackLevel = 0x5B, /* XXX */ + kHIDUsage_PID_AttackTime = 0x5C, /* XXX */ + kHIDUsage_PID_FadeLevel = 0x5D, /* XXX */ + kHIDUsage_PID_FadeTime = 0x5E, /* XXX */ + kHIDUsage_PID_SetConditionReport = 0x5F, /* XXX */ + + kHIDUsage_PID_CP_Offset = 0x60, /* XXX */ + kHIDUsage_PID_PositiveCoefficient = 0x61, /* XXX */ + kHIDUsage_PID_NegativeCoefficient = 0x62, /* XXX */ + kHIDUsage_PID_PositiveSaturation = 0x63, /* XXX */ + kHIDUsage_PID_NegativeSaturation = 0x64, /* XXX */ + kHIDUsage_PID_DeadBand = 0x65, /* XXX */ + kHIDUsage_PID_DownloadForceSample = 0x66, /* XXX */ + kHIDUsage_PID_IsochCustomForceEnable = 0x67, /* XXX */ + kHIDUsage_PID_CustomForceDataReport = 0x68, /* XXX */ + kHIDUsage_PID_CustomForceData = 0x69, /* XXX */ + kHIDUsage_PID_CustomForceVendorDefinedData = 0x6A, /* XXX */ + kHIDUsage_PID_SetCustomForceReport = 0x6B, /* XXX */ + kHIDUsage_PID_CustomForceDataOffset = 0x6C, /* XXX */ + kHIDUsage_PID_SampleCount = 0x6D, /* XXX */ + kHIDUsage_PID_SetPeriodicReport = 0x6E, /* XXX */ + kHIDUsage_PID_Offset = 0x6F, /* XXX */ + + kHIDUsage_PID_Magnitude = 0x70, /* XXX */ + kHIDUsage_PID_Phase = 0x71, /* XXX */ + kHIDUsage_PID_Period = 0x72, /* XXX */ + kHIDUsage_PID_SetConstantForceReport = 0x73, /* XXX */ + kHIDUsage_PID_SetRampForceReport = 0x74, /* XXX */ + kHIDUsage_PID_RampStart = 0x75, /* XXX */ + kHIDUsage_PID_RampEnd = 0x76, /* XXX */ + kHIDUsage_PID_EffectOperationReport = 0x77, /* XXX */ + kHIDUsage_PID_EffectOperation = 0x78, /* XXX */ + kHIDUsage_PID_OpEffectStart = 0x79, /* XXX */ + kHIDUsage_PID_OpEffectStartSolo = 0x7A, /* XXX */ + kHIDUsage_PID_OpEffectStop = 0x7B, /* XXX */ + kHIDUsage_PID_LoopCount = 0x7C, /* XXX */ + kHIDUsage_PID_DeviceGainReport = 0x7D, /* XXX */ + kHIDUsage_PID_DeviceGain = 0x7E, /* XXX */ + kHIDUsage_PID_PoolReport = 0x7F, /* XXX */ + + kHIDUsage_PID_RAM_PoolSize = 0x80, /* XXX */ + kHIDUsage_PID_ROM_PoolSize = 0x81, /* XXX */ + kHIDUsage_PID_ROM_EffectBlockCount = 0x82, /* XXX */ + kHIDUsage_PID_SimultaneousEffectsMax = 0x83, /* XXX */ + kHIDUsage_PID_PoolAlignment = 0x84, /* XXX */ + kHIDUsage_PID_PoolMoveReport = 0x85, /* XXX */ + kHIDUsage_PID_MoveSource = 0x86, /* XXX */ + kHIDUsage_PID_MoveDestination = 0x87, /* XXX */ + kHIDUsage_PID_MoveLength = 0x88, /* XXX */ + kHIDUsage_PID_BlockLoadReport = 0x89, /* XXX */ + /* 0x8A Reserved */ + kHIDUsage_PID_BlockLoadStatus = 0x8B, /* XXX */ + kHIDUsage_PID_BlockLoadSuccess = 0x8C, /* XXX */ + kHIDUsage_PID_BlockLoadFull = 0x8D, /* XXX */ + kHIDUsage_PID_BlockLoadError = 0x8E, /* XXX */ + kHIDUsage_PID_BlockHandle = 0x8F, /* XXX */ + + kHIDUsage_PID_BlockFreeReport = 0x90, /* XXX */ + kHIDUsage_PID_TypeSpecificBlockHandle = 0x91, /* XXX */ + kHIDUsage_PID_StateReport = 0x92, /* XXX */ + /* 0x93 Reserved */ + kHIDUsage_PID_EffectPlaying = 0x94, /* XXX */ + kHIDUsage_PID_DeviceControlReport = 0x95, /* XXX */ + kHIDUsage_PID_DeviceControl = 0x96, /* XXX */ + kHIDUsage_PID_DC_EnableActuators = 0x97, /* XXX */ + kHIDUsage_PID_DC_DisableActuators = 0x98, /* XXX */ + kHIDUsage_PID_DC_StopAllEffects = 0x99, /* XXX */ + kHIDUsage_PID_DC_DeviceReset = 0x9A, /* XXX */ + kHIDUsage_PID_DC_DevicePause = 0x9B, /* XXX */ + kHIDUsage_PID_DC_DeviceContinue = 0x9C, /* XXX */ + /* 0x9d - 0x9E Reserved */ + kHIDUsage_PID_DevicePaused = 0x9F, /* XXX */ + + kHIDUsage_PID_ActuatorsEnabled = 0xA0, /* XXX */ + /* 0xA1 - 0xA3 Reserved */ + kHIDUsage_PID_SafetySwitch = 0xA4, /* XXX */ + kHIDUsage_PID_ActuatorOverrideSwitch = 0xA5, /* XXX */ + kHIDUsage_PID_ActuatorPower = 0xA6, /* XXX */ + kHIDUsage_PID_StartDelay = 0xA7, /* XXX */ + kHIDUsage_PID_ParameterBlockSize = 0xA8, /* XXX */ + kHIDUsage_PID_DeviceManagedPool = 0xA9, /* XXX */ + kHIDUsage_PID_SharedParameterBlocks = 0xAA, /* XXX */ + kHIDUsage_PID_CreateNewEffectReport = 0xAB, /* XXX */ + kHIDUsage_PID_RAM_PoolAvailable = 0xAC, /* XXX */ + /* 0xAD - 0xFFFF Reserved */ + kHIDUsage_PID_Reserved = 0xFFFF +}; + +/* AlphanumericDisplay Page (0x14) */ +/* The Alphanumeric Display page is intended for use by simple alphanumeric displays that are used on consumer devices. */ +enum +{ + kHIDUsage_AD_AlphanumericDisplay = 0x01, /* Application Collection */ + /* 0x02 - 0x1F Reserved */ + kHIDUsage_AD_DisplayAttributesReport = 0x20, /* Logical Collection */ + kHIDUsage_AD_ASCIICharacterSet = 0x21, /* Static Flag */ + kHIDUsage_AD_DataReadBack = 0x22, /* Static Flag */ + kHIDUsage_AD_FontReadBack = 0x23, /* Static Flag */ + kHIDUsage_AD_DisplayControlReport = 0x24, /* Logical Collection */ + kHIDUsage_AD_ClearDisplay = 0x25, /* Dynamic Flag */ + kHIDUsage_AD_DisplayEnable = 0x26, /* Dynamic Flag */ + kHIDUsage_AD_ScreenSaverDelay = 0x27, /* Static Value */ + kHIDUsage_AD_ScreenSaverEnable = 0x28, /* Dynamic Flag */ + kHIDUsage_AD_VerticalScroll = 0x29, /* Static Flag */ + kHIDUsage_AD_HorizontalScroll = 0x2A, /* Static Flag */ + kHIDUsage_AD_CharacterReport = 0x2B, /* Logical Collection */ + kHIDUsage_AD_DisplayData = 0x2C, /* Dynamic Value */ + kHIDUsage_AD_DisplayStatus = 0x2D, /* Logical Collection */ + kHIDUsage_AD_StatNotReady = 0x2E, /* Selector */ + kHIDUsage_AD_StatReady = 0x2F, /* Selector */ + kHIDUsage_AD_ErrNotaloadablecharacter = 0x30, /* Selector */ + kHIDUsage_AD_ErrFontdatacannotberead = 0x31, /* Selector */ + kHIDUsage_AD_CursorPositionReport = 0x32, /* Logical Collection */ + kHIDUsage_AD_Row = 0x33, /* Dynamic Value */ + kHIDUsage_AD_Column = 0x34, /* Dynamic Value */ + kHIDUsage_AD_Rows = 0x35, /* Static Value */ + kHIDUsage_AD_Columns = 0x36, /* Static Value */ + kHIDUsage_AD_CursorPixelPositioning = 0x37, /* Static Flag */ + kHIDUsage_AD_CursorMode = 0x38, /* Dynamic Flag */ + kHIDUsage_AD_CursorEnable = 0x39, /* Dynamic Flag */ + kHIDUsage_AD_CursorBlink = 0x3A, /* Dynamic Flag */ + kHIDUsage_AD_FontReport = 0x3B, /* Logical Collection */ + kHIDUsage_AD_FontData = 0x3C, /* Buffered Byte */ + kHIDUsage_AD_CharacterWidth = 0x3D, /* Static Value */ + kHIDUsage_AD_CharacterHeight = 0x3E, /* Static Value */ + kHIDUsage_AD_CharacterSpacingHorizontal = 0x3F, /* Static Value */ + kHIDUsage_AD_CharacterSpacingVertical = 0x40, /* Static Value */ + kHIDUsage_AD_UnicodeCharacterSet = 0x41, /* Static Flag */ + /* 0x42 - 0xFFFF Reserved */ + kHIDUsage_AD_Reserved = 0xFFFF +}; + +/* Sensor Page (0x20) */ +/* The Sensor page is intended for use by devices that capture biometric, electrical, environmental, light, location, mechanical, motion, orientation, scanner, etc events. */ +enum +{ + kHIDUsage_Snsr_Undefined = 0x00, + kHIDUsage_Snsr_Sensor = 0x01, /* Application/Physical Collection */ + /* 0x02 - 0x0F Reserved */ + kHIDUsage_Snsr_Biometric = 0x10, /* Application/Physical Collection */ + kHIDUsage_Snsr_Biometric_HumanPresence = 0x11, /* Application/Physical Collection */ + kHIDUsage_Snsr_Biometric_HumanProximity = 0x12, /* Application/Physical Collection */ + kHIDUsage_Snsr_Biometric_HumanTouch = 0x13, /* Application/Physical Collection */ + /* 0x14 - 0x1F Reserved */ + kHIDUsage_Snsr_Electrical = 0x20, /* Application/Physical Collection */ + kHIDUsage_Snsr_Electrical_Capacitance = 0x21, /* Application/Physical Collection */ + kHIDUsage_Snsr_Electrical_Current = 0x22, /* Application/Physical Collection */ + kHIDUsage_Snsr_Electrical_Power = 0x23, /* Application/Physical Collection */ + kHIDUsage_Snsr_Electrical_Inductance = 0x24, /* Application/Physical Collection */ + kHIDUsage_Snsr_Electrical_Resistance = 0x25, /* Application/Physical Collection */ + kHIDUsage_Snsr_Electrical_Voltage = 0x26, /* Application/Physical Collection */ + kHIDUsage_Snsr_Electrical_Potentiometer = 0x27, /* Application/Physical Collection */ + kHIDUsage_Snsr_Electrical_Frequency = 0x28, /* Application/Physical Collection */ + kHIDUsage_Snsr_Electrical_Period = 0x29, /* Application/Physical Collection */ + /* 0x2A - 0x2F Reserved */ + kHIDUsage_Snsr_Environmental = 0x30, /* Application/Physical Collection */ + kHIDUsage_Snsr_Environmental_AtmosphericPressure = 0x31, /* Application/Physical Collection */ + kHIDUsage_Snsr_Environmental_Humidity = 0x32, /* Application/Physical Collection */ + kHIDUsage_Snsr_Environmental_Temperature = 0x33, /* Application/Physical Collection */ + kHIDUsage_Snsr_Environmental_WindDirection = 0x34, /* Application/Physical Collection */ + kHIDUsage_Snsr_Environmental_WindSpeed = 0x35, /* Application/Physical Collection */ + /* 0x36 - 0x3F Reserved */ + kHIDUsage_Snsr_Light = 0x40, /* Application/Physical Collection */ + kHIDUsage_Snsr_Light_AmbientLight = 0x41, /* Application/Physical Collection */ + kHIDUsage_Snsr_Light_ConsumerInfrared = 0x42, /* Application/Physical Collection */ + /* 0x43 - 0x4F Reserved */ + kHIDUsage_Snsr_Location = 0x50, /* Application/Physical Collection */ + kHIDUsage_Snsr_Location_Broadcast = 0x51, /* Application/Physical Collection */ + kHIDUsage_Snsr_Location_DeadReckoning = 0x52, /* Application/Physical Collection */ + kHIDUsage_Snsr_Location_GPS = 0x53, /* Application/Physical Collection */ + kHIDUsage_Snsr_Location_Lookup = 0x54, /* Application/Physical Collection */ + kHIDUsage_Snsr_Location_Other = 0x55, /* Application/Physical Collection */ + kHIDUsage_Snsr_Location_Static = 0x56, /* Application/Physical Collection */ + kHIDUsage_Snsr_Location_Triangulation = 0x57, /* Application/Physical Collection */ + /* 0x58 - 0x5F Reserved */ + kHIDUsage_Snsr_Mechanical = 0x60, /* Application/Physical Collection */ + kHIDUsage_Snsr_Mechanical_BooleanSwitch = 0x61, /* Application/Physical Collection */ + kHIDUsage_Snsr_Mechanical_BooleanSwitchArray = 0x62, /* Application/Physical Collection */ + kHIDUsage_Snsr_Mechanical_MultivalueSwitch = 0x63, /* Application/Physical Collection */ + kHIDUsage_Snsr_Mechanical_Force = 0x64, /* Application/Physical Collection */ + kHIDUsage_Snsr_Mechanical_Pressure = 0x65, /* Application/Physical Collection */ + kHIDUsage_Snsr_Mechanical_Strain = 0x66, /* Application/Physical Collection */ + kHIDUsage_Snsr_Mechanical_Weight = 0x67, /* Application/Physical Collection */ + kHIDUsage_Snsr_Mechanical_HapticVibrator = 0x68, /* Application/Physical Collection */ + kHIDUsage_Snsr_Mechanical_HallEffectSwitch = 0x69, /* Application/Physical Collection */ + /* 0x6A - 0x6F Reserved */ + kHIDUsage_Snsr_Motion = 0x70, /* Application/Physical Collection */ + kHIDUsage_Snsr_Motion_Accelerometer1D = 0x71, /* Application/Physical Collection */ + kHIDUsage_Snsr_Motion_Accelerometer2D = 0x72, /* Application/Physical Collection */ + kHIDUsage_Snsr_Motion_Accelerometer3D = 0x73, /* Application/Physical Collection */ + kHIDUsage_Snsr_Motion_Gyrometer1D = 0x74, /* Application/Physical Collection */ + kHIDUsage_Snsr_Motion_Gyrometer2D = 0x75, /* Application/Physical Collection */ + kHIDUsage_Snsr_Motion_Gyrometer3D = 0x76, /* Application/Physical Collection */ + kHIDUsage_Snsr_Motion_MotionDetector = 0x77, /* Application/Physical Collection */ + kHIDUsage_Snsr_Motion_Speedometer = 0x78, /* Application/Physical Collection */ + kHIDUsage_Snsr_Motion_Accelerometer = 0x79, /* Application/Physical Collection */ + kHIDUsage_Snsr_Motion_Gyrometer = 0x7A, /* Application/Physical Collection */ + /* 0x7B - 0x7F Reserved */ + kHIDUsage_Snsr_Orientation = 0x80, /* Application/Physical Collection */ + kHIDUsage_Snsr_Orientation_Compass1D = 0x81, /* Application/Physical Collection */ + kHIDUsage_Snsr_Orientation_Compass2D = 0x82, /* Application/Physical Collection */ + kHIDUsage_Snsr_Orientation_Compass3D = 0x83, /* Application/Physical Collection */ + kHIDUsage_Snsr_Orientation_Inclinometer1D = 0x84, /* Application/Physical Collection */ + kHIDUsage_Snsr_Orientation_Inclinometer2D = 0x85, /* Application/Physical Collection */ + kHIDUsage_Snsr_Orientation_Inclinometer3D = 0x86, /* Application/Physical Collection */ + kHIDUsage_Snsr_Orientation_Distance1D = 0x87, /* Application/Physical Collection */ + kHIDUsage_Snsr_Orientation_Distance2D = 0x88, /* Application/Physical Collection */ + kHIDUsage_Snsr_Orientation_Distance3D = 0x89, /* Application/Physical Collection */ + kHIDUsage_Snsr_Orientation_DeviceOrientation = 0x8A, /* Application/Physical Collection */ + kHIDUsage_Snsr_Orientation_CompassD = 0x8B, /* Application/Physical Collection */ + kHIDUsage_Snsr_Orientation_InclinometerD = 0x8C, /* Application/Physical Collection */ + kHIDUsage_Snsr_Orientation_DistanceD = 0x8D, /* Application/Physical Collection */ + /* 0x8E - 0x8F Reserved */ + kHIDUsage_Snsr_Scanner = 0x90, /* Application/Physical Collection */ + kHIDUsage_Snsr_Scanner_Barcode = 0x91, /* Application/Physical Collection */ + kHIDUsage_Snsr_Scanner_RFID = 0x92, /* Application/Physical Collection */ + kHIDUsage_Snsr_Scanner_NFC = 0x93, /* Application/Physical Collection */ + /* 0x94 - 0x9F Reserved */ + kHIDUsage_Snsr_Time = 0xA0, /* Application/Physical Collection */ + kHIDUsage_Snsr_Time_AlarmTimer = 0xA1, /* Application/Physical Collection */ + kHIDUsage_Snsr_Time_RealTimeClock = 0xA2, /* Application/Physical Collection */ + /* 0xA3 - 0xDF Reserved */ + kHIDUsage_Snsr_Other = 0xE0, /* Application/Physical Collection */ + kHIDUsage_Snsr_Other_Custom = 0xE1, /* Application/Physical Collection */ + kHIDUsage_Snsr_Other_Generic = 0xE2, /* Application/Physical Collection */ + kHIDUsage_Snsr_Other_GenericEnumerator = 0xE3, /* Application/Physical Collection */ + /* 0xE4 - 0xEF Reserved */ + /* 0xF0 - 0xFF Vendor Reserved */ + + /* Common Sensor Type Data Fields */ + + /* Usage Switches used in conjunction with other Data Usages. The value of the modifier is OR-ed in to the upper nibble of the 16bit Data Usage. */ + kHIDUsage_Snsr_Modifier_None = 0x0, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_ChangeSensitivityAbsolute = 0x1, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_Max = 0x2, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_Min = 0x3, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_Accuracy = 0x4, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_Resolution = 0x5, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_ThresholdHigh = 0x6, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_ThresholdLow = 0x7, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_CalibrationOffset = 0x8, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_CalibrationMultiplier = 0x9, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_ReportInterval = 0xA, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_FrequencyMax = 0xB, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_PeriodMax = 0xC, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_ChangeSensitivityPercentRange = 0xD, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_ChangeSensitivityPercentRelative = 0xE, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_VendorDefined = 0xF, /* Data Field Usage Switch */ + + /* Event Usages */ + kHIDUsage_Snsr_Event = 0x0200, + kHIDUsage_Snsr_Event_SensorState = 0x0201, + kHIDUsage_Snsr_Event_SensorEvent = 0x0202, + /* 0x0203 - 0x02FF Event Reserved */ + + kHIDUsage_Snsr_Event_SensorState_Undefined = 0x0800, + kHIDUsage_Snsr_Event_SensorState_Ready = 0x0801, + kHIDUsage_Snsr_Event_SensorState_NotAvailable = 0x0802, + kHIDUsage_Snsr_Event_SensorState_NoData = 0x0803, + kHIDUsage_Snsr_Event_SensorState_Initializing = 0x0804, + kHIDUsage_Snsr_Event_SensorState_AccessDenied = 0x0805, + kHIDUsage_Snsr_Event_SensorState_Error = 0x0806, + /* 0x0807 - 0x080F Reserved */ + + kHIDUsage_Snsr_Event_SensorEvent_Unknown = 0x0810, + kHIDUsage_Snsr_Event_SensorEvent_StateChanged = 0x0811, + kHIDUsage_Snsr_Event_SensorEvent_PropertyChanged = 0x0812, + kHIDUsage_Snsr_Event_SensorEvent_DataUpdated = 0x0813, + kHIDUsage_Snsr_Event_SensorEvent_PollResponse = 0x0814, + kHIDUsage_Snsr_Event_SensorEvent_ChangeSensitivity = 0x0815, + kHIDUsage_Snsr_Event_SensorEvent_RangeMaxReached = 0x0816, + kHIDUsage_Snsr_Event_SensorEvent_RangeMinReached = 0x0817, + kHIDUsage_Snsr_Event_SensorEvent_HighThresholdCrossUp = 0x0818, + kHIDUsage_Snsr_Event_SensorEvent_HighThresholdCrossDown = 0x0819, + kHIDUsage_Snsr_Event_SensorEvent_LowThresholdCrossUp = 0x081A, + kHIDUsage_Snsr_Event_SensorEvent_LowThresholdCrossDown = 0x081B, + kHIDUsage_Snsr_Event_SensorEvent_ZeroThresholdCrossUp = 0x081C, + kHIDUsage_Snsr_Event_SensorEvent_ZeroThresholdCrossDown = 0x081D, + kHIDUsage_Snsr_Event_SensorEvent_PeriodExceeded = 0x081E, + kHIDUsage_Snsr_Event_SensorEvent_FrequencyExceeded = 0x081F, + kHIDUsage_Snsr_Event_SensorEvent_ComplexTrigger = 0x0820, + /* 0x0821 - 0x082F Reserved */ + + /* Property Usages */ + kHIDUsage_Snsr_Property = 0x0300, + kHIDUsage_Snsr_Property_FriendlyName = 0x0301, + kHIDUsage_Snsr_Property_PersistentUniqueID = 0x0302, + kHIDUsage_Snsr_Property_SensorStatus = 0x0303, + kHIDUsage_Snsr_Property_MinimumReportInterval = 0x0304, + kHIDUsage_Snsr_Property_Manufacturer = 0x0305, + kHIDUsage_Snsr_Property_Model = 0x0306, + kHIDUsage_Snsr_Property_SerialNumber = 0x0307, + kHIDUsage_Snsr_Property_Description = 0x0308, + kHIDUsage_Snsr_Property_ConnectionType = 0x0309, + kHIDUsage_Snsr_Property_DevicePath = 0x030A, + kHIDUsage_Snsr_Property_HardwareRevision = 0x030B, + kHIDUsage_Snsr_Property_FirmwareVersion = 0x030C, + kHIDUsage_Snsr_Property_ReleaseData = 0x030D, + kHIDUsage_Snsr_Property_ReportInterval = 0x030E, + kHIDUsage_Snsr_Property_ChangeSensitivityAbsolute = 0x030F, + kHIDUsage_Snsr_Property_ChangeSensitivityPercentRange = 0x0310, + kHIDUsage_Snsr_Property_ChangeSensitivityPercentRelative = 0x0311, + kHIDUsage_Snsr_Property_Accuracy = 0x0312, + kHIDUsage_Snsr_Property_Resolution = 0x0313, + kHIDUsage_Snsr_Property_Maximum = 0x0314, + kHIDUsage_Snsr_Property_Minimum = 0x0315, + kHIDUsage_Snsr_Property_ReportingState = 0x0316, + kHIDUsage_Snsr_Property_SamplingRate = 0x0317, + kHIDUsage_Snsr_Property_ResponseCurve = 0x0318, + kHIDUsage_Snsr_Property_PowerState = 0x0319, + kHIDUsage_Snsr_Property_MaxFIFOEvents = 0x031A, + kHIDUsage_Snsr_Property_ReportLatency = 0x031B, + + /* 0x031C - 0x03FF Reserved */ + + kHIDUsage_Snsr_Property_ConnectionType_Integrated = 0x0830, + kHIDUsage_Snsr_Property_ConnectionType_Attached = 0x0831, + kHIDUsage_Snsr_Property_ConnectionType_External = 0x0832, + /* 0x0833 - 0x083F Reserved */ + kHIDUsage_Snsr_Property_ReportingState_NoEvents = 0x0840, + kHIDUsage_Snsr_Property_ReportingState_AllEvents = 0x0841, + kHIDUsage_Snsr_Property_ReportingState_ThresholdEvents = 0x0842, + kHIDUsage_Snsr_Property_ReportingState_WakeNoEvents = 0x0843, + kHIDUsage_Snsr_Property_ReportingState_WakeAllEvents = 0x0844, + kHIDUsage_Snsr_Property_ReportingState_WakeThresholdEvents = 0x0845, + /* 0x0846 - 0x084F Reserved */ + kHIDUsage_Snsr_Property_PowerState_Undefined = 0x0850, + kHIDUsage_Snsr_Property_PowerState_D0_FullPower = 0x0851, + kHIDUsage_Snsr_Property_PowerState_D1_LowPower = 0x0852, + kHIDUsage_Snsr_Property_PowerState_D2_Standby = 0x0853, + kHIDUsage_Snsr_Property_PowerState_D3_Sleep = 0x0854, + kHIDUsage_Snsr_Property_PowerState_D4_PowerOff = 0x0855, + /* 0x0855 - 0x085F Reserved */ + kHIDUsage_Snsr_Light_Illuminance = 0x04D1, + + /* Specific Sensor Type Data Fields */ + + /* Location Sensor Data Fields */ + kHIDUsage_Snsr_Data_Location = 0x0400, + kHIDUsage_Snsr_Data_Location_Reserved = 0x0401, + kHIDUsage_Snsr_Data_Location_AltitudeAntennaSeaLevel = 0x0402, + kHIDUsage_Snsr_Data_Location_DifferentialReferenceStationID = 0x0403, + kHIDUsage_Snsr_Data_Location_AltitudeEllipsoidError = 0x0404, + kHIDUsage_Snsr_Data_Location_AltitudeEllipsoid = 0x0405, + kHIDUsage_Snsr_Data_Location_AltitudeSeaLevelError = 0x0406, + kHIDUsage_Snsr_Data_Location_AltitudeSeaLevel = 0x0407, + kHIDUsage_Snsr_Data_Location_DifferentialGPSDataAge = 0x0408, + kHIDUsage_Snsr_Data_Location_ErrorRadius = 0x0409, + + kHIDUsage_Snsr_Data_Location_FixQuality = 0x040A, + kHIDUsage_Snsr_Data_Location_FixQualityNoFix = 0x0870, + kHIDUsage_Snsr_Data_Location_FixQualityGPS = 0x0871, + kHIDUsage_Snsr_Data_Location_FixQualityDGPS = 0x0872, + + kHIDUsage_Snsr_Data_Location_FixType = 0x040B, + kHIDUsage_Snsr_Data_Location_FixTypeNoFix = 0x0880, + kHIDUsage_Snsr_Data_Location_FixTypeGPSSPSMode = 0x0881, + kHIDUsage_Snsr_Data_Location_FixTypeDGPSSPSMode = 0x0882, + kHIDUsage_Snsr_Data_Location_FixTypeGPSPPSMode = 0x0883, + kHIDUsage_Snsr_Data_Location_FixTypeRealTimeKinematic = 0x0884, + kHIDUsage_Snsr_Data_Location_FixTypeFloatRTK = 0x0885, + kHIDUsage_Snsr_Data_Location_FixTypeEstimated = 0x0886, + kHIDUsage_Snsr_Data_Location_FixTypeManualInputMode = 0x0887, + kHIDUsage_Snsr_Data_Location_FixTypeSimulatorMode = 0x0888, + + kHIDUsage_Snsr_Data_Location_GeoidalSeparation = 0x040C, + + kHIDUsage_Snsr_Data_Location_GPSOperationMode = 0x040D, + kHIDUsage_Snsr_Data_Location_GPSOperationModeManual = 0x0890, + kHIDUsage_Snsr_Data_Location_GPSOperationModeAutomatic = 0x0891, + + kHIDUsage_Snsr_Data_Location_GPSSelectionMode = 0x040E, + kHIDUsage_Snsr_Data_Location_GPSSelectionModeAutonomous = 0x08A0, + kHIDUsage_Snsr_Data_Location_GPSSelectionModeDGPS = 0x08A1, + kHIDUsage_Snsr_Data_Location_GPSSelectionModeEstimated = 0x08A2, + kHIDUsage_Snsr_Data_Location_GPSSelectionModeManualInput = 0x08A3, + kHIDUsage_Snsr_Data_Location_GPSSelectionModeSimulator = 0x08A4, + kHIDUsage_Snsr_Data_Location_GPSSelectionModeDataNotValid = 0x08A5, + + kHIDUsage_Snsr_Data_Location_GPSStatus = 0x040F, + kHIDUsage_Snsr_Data_Location_GPSStatusDataValid = 0x08B0, + kHIDUsage_Snsr_Data_Location_GPSStatusDataNotValid = 0x08B1, + + kHIDUsage_Snsr_Data_Location_PositionDilutionOfPrecision = 0x0410, + kHIDUsage_Snsr_Data_Location_HorizontalDilutionOfPrecision = 0x0411, + kHIDUsage_Snsr_Data_Location_VerticalDilutionOfPrecision = 0x0412, + kHIDUsage_Snsr_Data_Location_Latitude = 0x0413, + kHIDUsage_Snsr_Data_Location_Longitude = 0x0414, + kHIDUsage_Snsr_Data_Location_TrueHeading = 0x0415, + kHIDUsage_Snsr_Data_Location_MagneticHeading = 0x0416, + kHIDUsage_Snsr_Data_Location_MagneticVariation = 0x0417, + kHIDUsage_Snsr_Data_Location_Speed = 0x0418, + kHIDUsage_Snsr_Data_Location_SatellitesInView = 0x0419, + kHIDUsage_Snsr_Data_Location_SatellitesInViewAzimuth = 0x041A, + kHIDUsage_Snsr_Data_Location_SatellitesInViewElevation = 0x041B, + kHIDUsage_Snsr_Data_Location_SatellitesInViewIDs = 0x041C, + kHIDUsage_Snsr_Data_Location_SatellitesInViewPRNs = 0x041D, + kHIDUsage_Snsr_Data_Location_SatellitesInViewSNRatios = 0x041E, + kHIDUsage_Snsr_Data_Location_SatellitesUsedCount = 0x041F, + kHIDUsage_Snsr_Data_Location_SatellitesUsedPRNs = 0x0420, + kHIDUsage_Snsr_Data_Location_NMEASentence = 0x0421, + kHIDUsage_Snsr_Data_Location_AddressLine1 = 0x0422, + kHIDUsage_Snsr_Data_Location_AddressLine2 = 0x0423, + kHIDUsage_Snsr_Data_Location_City = 0x0424, + kHIDUsage_Snsr_Data_Location_StateOrProvince = 0x0425, + kHIDUsage_Snsr_Data_Location_CountryOrRegion = 0x0426, + kHIDUsage_Snsr_Data_Location_PostalCode = 0x0427, + /* 0x0428 - 0x0429 Reserved */ + + /* Location Sensor Properties */ + kHIDUsage_Snsr_Property_Location = 0x042A, + kHIDUsage_Snsr_Property_Location_DesiredAccuracy = 0x042B, + kHIDUsage_Snsr_Property_Location_AccuracyDefault = 0x0860, + kHIDUsage_Snsr_Property_Location_AccuracyHigh = 0x0861, + kHIDUsage_Snsr_Property_Location_AccuracyMedium = 0x0862, + kHIDUsage_Snsr_Property_Location_AccuracyLow = 0x0863, + /* 0x042C - 0x042F Reserved */ + + /* Environmental Sensor Data Fields */ + kHIDUsage_Snsr_Data_Environmental = 0x0430, + kHIDUsage_Snsr_Data_Environmental_AtmosphericPressure = 0x0431, + kHIDUsage_Snsr_Data_Environmental_Reserved = 0x0432, + kHIDUsage_Snsr_Data_Environmental_RelativeHumidity = 0x0433, + kHIDUsage_Snsr_Data_Environmental_Temperature = 0x0434, + kHIDUsage_Snsr_Data_Environmental_WindDirection = 0x0435, + kHIDUsage_Snsr_Data_Environmental_WindSpeed = 0x0436, + /* 0x0437 - 0x043F Reserved */ + + /* Environmental Sensor Properties */ + kHIDUsage_Snsr_Property_Environmental = 0x0440, + kHIDUsage_Snsr_Property_Environmental_ReferencePressure = 0x0441, + /* 0x0442 - 0x044F Reserved */ + + /* Motion Sensor Data Fields */ + kHIDUsage_Snsr_Data_Motion = 0x0450, + kHIDUsage_Snsr_Data_Motion_State = 0x0451, + kHIDUsage_Snsr_Data_Motion_Acceleration = 0x0452, + kHIDUsage_Snsr_Data_Motion_AccelerationAxisX = 0x0453, + kHIDUsage_Snsr_Data_Motion_AccelerationAxisY = 0x0454, + kHIDUsage_Snsr_Data_Motion_AccelerationAxisZ = 0x0455, + kHIDUsage_Snsr_Data_Motion_AngularVelocity = 0x0456, + kHIDUsage_Snsr_Data_Motion_AngularVelocityXAxis = 0x0457, + kHIDUsage_Snsr_Data_Motion_AngularVelocityYAxis = 0x0458, + kHIDUsage_Snsr_Data_Motion_AngularVelocityZAxis = 0x0459, + kHIDUsage_Snsr_Data_Motion_AngularPosition = 0x045A, + kHIDUsage_Snsr_Data_Motion_AngularPositionXAxis = 0x045B, + kHIDUsage_Snsr_Data_Motion_AngularPositionYAxis = 0x045C, + kHIDUsage_Snsr_Data_Motion_AngularPositionZAxis = 0x045D, + kHIDUsage_Snsr_Data_Motion_Speed = 0x045E, + kHIDUsage_Snsr_Data_Motion_Intensity = 0x045F, + /* 0x0460 - 0x046F Reserved */ + + /* Orientation Sensor Data Fields */ + kHIDUsage_Snsr_Data_Orientation = 0x0470, + kHIDUsage_Snsr_Data_Orientation_Heading = 0x0471, + kHIDUsage_Snsr_Data_Orientation_HeadingXAxis = 0x0472, + kHIDUsage_Snsr_Data_Orientation_HeadingYAxis = 0x0473, + kHIDUsage_Snsr_Data_Orientation_HeadingZAxis = 0x0474, + kHIDUsage_Snsr_Data_Orientation_HeadingCompensatedMagneticNorth = 0x0475, + kHIDUsage_Snsr_Data_Orientation_HeadingCompensatedTrueNorth = 0x0476, + kHIDUsage_Snsr_Data_Orientation_HeadingMagneticNorth = 0x0477, + kHIDUsage_Snsr_Data_Orientation_HeadingTrueNorth = 0x0478, + kHIDUsage_Snsr_Data_Orientation_Distance = 0x0479, + kHIDUsage_Snsr_Data_Orientation_DistanceXAxis = 0x047A, + kHIDUsage_Snsr_Data_Orientation_DistanceYAxis = 0x047B, + kHIDUsage_Snsr_Data_Orientation_DistanceZAxis = 0x047C, + kHIDUsage_Snsr_Data_Orientation_DistanceOutOfRange = 0x047D, + kHIDUsage_Snsr_Data_Orientation_Tilt = 0x047E, + kHIDUsage_Snsr_Data_Orientation_TiltXAxis = 0x047F, + kHIDUsage_Snsr_Data_Orientation_TiltYAxis = 0x0480, + kHIDUsage_Snsr_Data_Orientation_TiltZAxis = 0x0481, + kHIDUsage_Snsr_Data_Orientation_RotationMatrix = 0x0482, + kHIDUsage_Snsr_Data_Orientation_Quaternion = 0x0483, + kHIDUsage_Snsr_Data_Orientation_MagneticFlux = 0x0484, + kHIDUsage_Snsr_Data_Orientation_MagneticFluxXAxis = 0x0485, + kHIDUsage_Snsr_Data_Orientation_MagneticFluxYAxis = 0x0486, + kHIDUsage_Snsr_Data_Orientation_MagneticFluxZAxis = 0x0487, + /* 0x0488 - 0x048F Reserved */ + + /* Mechanical Sensor Data Field */ + kHIDUsage_Snsr_Data_Mechanical = 0x0490, + kHIDUsage_Snsr_Data_Mechanical_BooleanSwitchState = 0x0491, + kHIDUsage_Snsr_Data_Mechanical_BooleanSwitchArrayStates = 0x0492, + kHIDUsage_Snsr_Data_Mechanical_MultivalueSwitchValue = 0x0493, + kHIDUsage_Snsr_Data_Mechanical_Force = 0x0494, + kHIDUsage_Snsr_Data_Mechanical_AbsolutePressure = 0x0495, + kHIDUsage_Snsr_Data_Mechanical_GaugePressure = 0x0496, + kHIDUsage_Snsr_Data_Mechanical_Strain = 0x0497, + kHIDUsage_Snsr_Data_Mechanical_Weight = 0x0498, + /* 0x0499 - 0x49F Reserved */ + + /* Mechanical Sensor Properties */ + kHIDUsage_Snsr_Property_Mechanical = 0x04A0, + kHIDUsage_Snsr_Property_Mechanical_VibrationState = 0x04A1, + kHIDUsage_Snsr_Property_Mechanical_ForwardVibrationSpeed = 0x04A2, + kHIDUsage_Snsr_Property_Mechanical_BackwardVibrationSpeed = 0x04A3, + /* 0x04A4 - 0x04AF Reserved */ + + /* Biometric Sensor Data Fields */ + kHIDUsage_Snsr_Data_Biometric = 0x04B0, + kHIDUsage_Snsr_Data_Biometric_HumanPresence = 0x04B1, + kHIDUsage_Snsr_Data_Biometric_HumanProximityRange = 0x04B2, + kHIDUsage_Snsr_Data_Biometric_HumanProximityOutOfRange = 0x04B3, + kHIDUsage_Snsr_Data_Biometric_HumanTouchState = 0x04B4, + /* 0x04B5 - 0x04CF Reserved */ + + /* Light Sensor Data Fields */ + kHIDUsage_Snsr_Data_Light = 0x04D0, + kHIDUsage_Snsr_Data_Light_Illuminance = 0x04D1, + kHIDUsage_Snsr_Data_Light_ColorTemperature = 0x04D2, + kHIDUsage_Snsr_Data_Light_Chromaticity = 0x04D3, + kHIDUsage_Snsr_Data_Light_ChromaticityX = 0x04D4, + kHIDUsage_Snsr_Data_Light_ChromaticityY = 0x04D5, + kHIDUsage_Snsr_Data_Light_ConsumerIRSentenceReceive = 0x04D6, + /* 0x04D7 - 0x04DF Reserved */ + + /* Light Sensor Properties */ + kHIDUsage_Snsr_Property_Light = 0x04E0, + kHIDUsage_Snsr_Property_Light_ConsumerIRSentenceSend = 0x04E1, + /* 0x04E2 - 0x04EF Reserved */ + + /* Scanner Sensor Data Fields */ + kHIDUsage_Snsr_Data_Scanner = 0x04F0, + kHIDUsage_Snsr_Data_Scanner_RFIDTag40Bit = 0x04F1, + kHIDUsage_Snsr_Data_Scanner_NFCSentenceReceive = 0x04F2, + /* 0x04F3 - 0x04F7 Reserved */ + + /* Scanner Sensor Properties */ + kHIDUsage_Snsr_Property_Scanner = 0x04F8, + kHIDUsage_Snsr_Property_Scanner_NFCSentenceSend = 0x0F49, + /* 0x04FA - 0x04FF Reserved */ + + /* Electrical Sensor Data Fields */ + kHIDUsage_Snsr_Data_Electrical = 0x0500, + kHIDUsage_Snsr_Data_Electrical_Capacitance = 0x0501, + kHIDUsage_Snsr_Data_Electrical_Current = 0x0502, + kHIDUsage_Snsr_Data_Electrical_ElectricalPower = 0x0503, + kHIDUsage_Snsr_Data_Electrical_Inductance = 0x0504, + kHIDUsage_Snsr_Data_Electrical_Resistance = 0x0505, + kHIDUsage_Snsr_Data_Electrical_Voltage = 0x0506, + kHIDUsage_Snsr_Data_Electrical_Frequency = 0x0507, + kHIDUsage_Snsr_Data_Electrical_Period = 0x0508, + kHIDUsage_Snsr_Data_Electrical_PercentOfRange = 0x0509, + /* 0x050A - 0x051F Reserved */ + + /* Time Sensor Data Fields */ + kHIDUsage_Snsr_Data_Time = 0x0520, + kHIDUsage_Snsr_Data_Time_Year = 0x0521, + kHIDUsage_Snsr_Data_Time_Month = 0x0522, + kHIDUsage_Snsr_Data_Time_Day = 0x0523, + + kHIDUsage_Snsr_Data_Time_DayOfWeek = 0x0524, + kHIDUsage_Snsr_Data_Time_DayOfWeekSunday = 0x08C0, + kHIDUsage_Snsr_Data_Time_DayOfWeekMonday = 0x08C1, + kHIDUsage_Snsr_Data_Time_DayOfWeekTuesday = 0x08C2, + kHIDUsage_Snsr_Data_Time_DayOfWeekWednesday = 0x08C3, + kHIDUsage_Snsr_Data_Time_DayOfWeekThursday = 0x08C4, + kHIDUsage_Snsr_Data_Time_DayOfWeekFriday = 0x08C5, + kHIDUsage_Snsr_Data_Time_DayOfWeekSaturday = 0x08C6, + + kHIDUsage_Snsr_Data_Time_Hour = 0x0525, + kHIDUsage_Snsr_Data_Time_Minute = 0x0526, + kHIDUsage_Snsr_Data_Time_Second = 0x0527, + kHIDUsage_Snsr_Data_Time_Millisecond = 0x0528, + kHIDUsage_Snsr_Data_Time_Timestamp = 0x0529, + kHIDUsage_Snsr_Data_Time_JulianDayOfYear = 0x052A, + /* 0x052B - 0x052F Reserved */ + + /* Time Sensor Properties */ + kHIDUsage_Snsr_Property_Time = 0x0530, + kHIDUsage_Snsr_Property_Time_TimeZoneOffsetFromUTC = 0x0531, + kHIDUsage_Snsr_Property_Time_TimeZoneName = 0x0532, + kHIDUsage_Snsr_Property_Time_DaylightSavingsTimeObserved = 0x0533, + kHIDUsage_Snsr_Property_Time_TimeTrimAdjustment = 0x0534, + kHIDUsage_Snsr_Property_Time_ArmAlarm = 0x0535, + /* 0x0536 - 0x053F Reserved */ + + /* Custom Sensor Data Fields */ + kHIDUsage_Snsr_Data_Custom = 0x0540, + kHIDUsage_Snsr_Data_Custom_Usage = 0x0541, + kHIDUsage_Snsr_Data_Custom_BooleanArray = 0x0542, + kHIDUsage_Snsr_Data_Custom_Value = 0x0543, + kHIDUsage_Snsr_Data_Custom_Value1 = 0x0544, + kHIDUsage_Snsr_Data_Custom_Value2 = 0x0545, + kHIDUsage_Snsr_Data_Custom_Value3 = 0x0546, + kHIDUsage_Snsr_Data_Custom_Value4 = 0x0547, + kHIDUsage_Snsr_Data_Custom_Value5 = 0x0548, + kHIDUsage_Snsr_Data_Custom_Value6 = 0x0549, + /* 0x054A - 0x055F Reserved */ +}; + +/* Power Device Page (0x84) */ +/* This section provides detailed descriptions of the usages employed by Power Devices. */ +enum +{ + + kHIDUsage_PD_Undefined = 0x00, /* Power Device Undefined Usage */ + kHIDUsage_PD_iName = 0x01, /* CL- Power Device Name Index */ + kHIDUsage_PD_PresentStatus = 0x02, /* CL- Power Device Present Status */ + kHIDUsage_PD_ChangedStatus = 0x03, /* CA- Power Device Changed Status */ + kHIDUsage_PD_UPS = 0x04, /* CA- Uninterruptible Power Supply */ + kHIDUsage_PD_PowerSupply = 0x05, /* CA- Power Supply */ + kHIDUsage_PD_PeripheralDevice = 0x06, /* CA- Perpheral Device */ + /* Reserved 0x07 - 0x0F */ + kHIDUsage_PD_BatterySystem = 0x10, /* CP- Battery System power module */ + kHIDUsage_PD_BatterySystemID = 0x11, /* SV IF- Battery System ID */ + kHIDUsage_PD_Battery = 0x12, /* CP- Battery */ + kHIDUsage_PD_BatteryID = 0x13, /* SV IF- Battery ID */ + kHIDUsage_PD_Charger = 0x14, /* CP- Charger */ + kHIDUsage_PD_ChargerID = 0x15, /* SV IF- Charger ID */ + kHIDUsage_PD_PowerConverter = 0x16, /* CP- Power Converter power module */ + kHIDUsage_PD_PowerConverterID = 0x17, /* SV IF- Power Converter ID */ + kHIDUsage_PD_OutletSystem = 0x18, /* CP- Outlet System power module */ + kHIDUsage_PD_OutletSystemID = 0x19, /* SV IF-Outlet System ID */ + kHIDUsage_PD_Input = 0x1A, /* CP- Power Device Input */ + kHIDUsage_PD_InputID = 0x1B, /* SV IF- Power Device Input ID */ + kHIDUsage_PD_Output = 0x1C, /* CP- Power Device Output */ + kHIDUsage_PD_OutputID = 0x1D, /* SV IF- Power Device Output ID */ + kHIDUsage_PD_Flow = 0x1E, /* CP- Power Device Flow */ + kHIDUsage_PD_FlowID = 0x1F, /* Item IF- Power Device Flow ID */ + kHIDUsage_PD_Outlet = 0x20, /* CP- Power Device Outlet */ + kHIDUsage_PD_OutletID = 0x21, /* SV IF- Power Device Outlet ID */ + kHIDUsage_PD_Gang = 0x22, /* CL/CP- Power Device Gang */ + kHIDUsage_PD_GangID = 0x23, /* SV IF- Power Device Gang ID */ + kHIDUsage_PD_PowerSummary = 0x24, /* CL/CP- Power Device Power Summary */ + kHIDUsage_PD_PowerSummaryID = 0x25, /* SV IF- Power Device Power Summary ID */ + /* Reserved 0x26 - 0x2F */ + kHIDUsage_PD_Voltage = 0x30, /* DV IF- Power Device Voltage */ + kHIDUsage_PD_Current = 0x31, /* DV IF- Power Device Current */ + kHIDUsage_PD_Frequency = 0x32, /* DV IF- Power Device Frequency */ + kHIDUsage_PD_ApparentPower = 0x33, /* DV IF- Power Device Apparent Power */ + kHIDUsage_PD_ActivePower = 0x34, /* DV IF- Power Device RMS Power */ + kHIDUsage_PD_PercentLoad = 0x35, /* DV IF- Power Device Percent Load */ + kHIDUsage_PD_Temperature = 0x36, /* DV IF- Power Device Temperature */ + kHIDUsage_PD_Humidity = 0x37, /* DV IF- Power Device Humidity */ + kHIDUsage_PD_BadCount = 0x38, /* DV IF- Power Device Bad Condition Count */ + /* Reserved 0x39 - 0x3F */ + kHIDUsage_PD_ConfigVoltage = 0x40, /* SV/DV F- Power Device Nominal Voltage */ + kHIDUsage_PD_ConfigCurrent = 0x41, /* SV/DV F- Power Device Nominal Current */ + kHIDUsage_PD_ConfigFrequency = 0x42, /* SV/DV F- Power Device Nominal Frequency */ + kHIDUsage_PD_ConfigApparentPower = 0x43, /* SV/DV F- Power Device Nominal Apparent Power */ + kHIDUsage_PD_ConfigActivePower = 0x44, /* SV/DV F- Power Device Nominal RMS Power */ + kHIDUsage_PD_ConfigPercentLoad = 0x45, /* SV/DV F- Power Device Nominal Percent Load */ + kHIDUsage_PD_ConfigTemperature = 0x46, /* SV/DV F- Power Device Nominal Temperature */ + kHIDUsage_PD_ConfigHumidity = 0x47, /* SV/DV F- Power Device Nominal Humidity */ + /* Reserved 0x48 - 0x4F */ + kHIDUsage_PD_SwitchOnControl = 0x50, /* DV F- Power Device Switch On Control */ + kHIDUsage_PD_SwitchOffControl = 0x51, /* DV F- Power Device Switch Off Control */ + kHIDUsage_PD_ToggleControl = 0x52, /* DV F- Power Device Toogle Sequence Control */ + kHIDUsage_PD_LowVoltageTransfer = 0x53, /* DV F- Power Device Min Transfer Voltage */ + kHIDUsage_PD_HighVoltageTransfer = 0x54, /* DV F- Power Device Max Transfer Voltage */ + kHIDUsage_PD_DelayBeforeReboot = 0x55, /* DV F- Power Device Delay Before Reboot */ + kHIDUsage_PD_DelayBeforeStartup = 0x56, /* DV F- Power Device Delay Before Startup */ + kHIDUsage_PD_DelayBeforeShutdown = 0x57, /* DV F- Power Device Delay Before Shutdown */ + kHIDUsage_PD_Test = 0x58, /* DV F- Power Device Test Request/Result */ + kHIDUsage_PD_ModuleReset = 0x59, /* DV F- Power Device Reset Request/Result */ + kHIDUsage_PD_AudibleAlarmControl = 0x5A, /* DV F- Power Device Audible Alarm Control */ + /* Reserved 0x5B - 0x5F */ + kHIDUsage_PD_Present = 0x60, /* DV IOF- Power Device Present */ + kHIDUsage_PD_Good = 0x61, /* DV IOF- Power Device Good */ + kHIDUsage_PD_InternalFailure = 0x62, /* DV IOF- Power Device Internal Failure */ + kHIDUsage_PD_VoltageOutOfRange = 0x63, /* DV IOF- Power Device Voltage Out Of Range */ + kHIDUsage_PD_FrequencyOutOfRange = 0x64, /* DV IOF- Power Device Frequency Out Of Range */ + kHIDUsage_PD_Overload = 0x65, /* DV IOF- Power Device Overload */ + kHIDUsage_PD_OverCharged = 0x66, /* DV IOF- Power Device Over Charged */ + kHIDUsage_PD_OverTemperature = 0x67, /* DV IOF- Power Device Over Temperature */ + kHIDUsage_PD_ShutdownRequested = 0x68, /* DV IOF- Power Device Shutdown Requested */ + kHIDUsage_PD_ShutdownImminent = 0x69, /* DV IOF- Power Device Shutdown Imminent */ + /* Reserved 0x6A */ + kHIDUsage_PD_SwitchOnOff = 0x6B, /* DV IOF- Power Device On/Off Switch Status */ + kHIDUsage_PD_Switchable = 0x6C, /* DV IOF- Power Device Switchable */ + kHIDUsage_PD_Used = 0x6D, /* DV IOF- Power Device Used */ + kHIDUsage_PD_Boost = 0x6E, /* DV IOF- Power Device Boosted */ + kHIDUsage_PD_Buck = 0x6F, /* DV IOF- Power Device Bucked */ + kHIDUsage_PD_Initialized = 0x70, /* DV IOF- Power Device Initialized */ + kHIDUsage_PD_Tested = 0x71, /* DV IOF- Power Device Tested */ + kHIDUsage_PD_AwaitingPower = 0x72, /* DV IOF- Power Device Awaiting Power */ + kHIDUsage_PD_CommunicationLost = 0x73, /* DV IOF- Power Device Communication Lost */ + /* Reserved 0x74 - 0xFC */ + kHIDUsage_PD_iManufacturer = 0xFD, /* SV F- Power Device Manufacturer String Index */ + kHIDUsage_PD_iProduct = 0xFE, /* SV F- Power Device Product String Index */ + kHIDUsage_PD_iserialNumber = 0xFF /* SV F- Power Device Serial Number String Index */ +}; + +/* Battery System Page (x85) */ +/* This section provides detailed descriptions of the usages employed by Battery Systems. */ +enum +{ + kHIDUsage_BS_Undefined = 0x00, /* Battery System Undefined */ + kHIDUsage_BS_SMBBatteryMode = 0x01, /* CL - SMB Mode */ + kHIDUsage_BS_SMBBatteryStatus = 0x02, /* CL - SMB Status */ + kHIDUsage_BS_SMBAlarmWarning = 0x03, /* CL - SMB Alarm Warning */ + kHIDUsage_BS_SMBChargerMode = 0x04, /* CL - SMB Charger Mode */ + kHIDUsage_BS_SMBChargerStatus = 0x05, /* CL - SMB Charger Status */ + kHIDUsage_BS_SMBChargerSpecInfo = 0x06, /* CL - SMB Charger Extended Status */ + kHIDUsage_BS_SMBSelectorState = 0x07, /* CL - SMB Selector State */ + kHIDUsage_BS_SMBSelectorPresets = 0x08, /* CL - SMB Selector Presets */ + kHIDUsage_BS_SMBSelectorInfo = 0x09, /* CL - SMB Selector Info */ + /* Reserved 0x0A - 0x0F */ + kHIDUsage_BS_OptionalMfgFunction1 = 0x10, /* DV F - Battery System Optional SMB Mfg Function 1 */ + kHIDUsage_BS_OptionalMfgFunction2 = 0x11, /* DV F - Battery System Optional SMB Mfg Function 2 */ + kHIDUsage_BS_OptionalMfgFunction3 = 0x12, /* DV F - Battery System Optional SMB Mfg Function 3 */ + kHIDUsage_BS_OptionalMfgFunction4 = 0x13, /* DV F - Battery System Optional SMB Mfg Function 4 */ + kHIDUsage_BS_OptionalMfgFunction5 = 0x14, /* DV F - Battery System Optional SMB Mfg Function 5 */ + kHIDUsage_BS_ConnectionToSMBus = 0x15, /* DF F - Battery System Connection To System Management Bus */ + kHIDUsage_BS_OutputConnection = 0x16, /* DF F - Battery System Output Connection Status */ + kHIDUsage_BS_ChargerConnection = 0x17, /* DF F - Battery System Charger Connection */ + kHIDUsage_BS_BatteryInsertion = 0x18, /* DF F - Battery System Battery Insertion */ + kHIDUsage_BS_Usenext = 0x19, /* DF F - Battery System Use Next */ + kHIDUsage_BS_OKToUse = 0x1A, /* DF F - Battery System OK To Use */ + kHIDUsage_BS_BatterySupported = 0x1B, /* DF F - Battery System Battery Supported */ + kHIDUsage_BS_SelectorRevision = 0x1C, /* DF F - Battery System Selector Revision */ + kHIDUsage_BS_ChargingIndicator = 0x1D, /* DF F - Battery System Charging Indicator */ + /* Reserved 0x1E - 0x27 */ + kHIDUsage_BS_ManufacturerAccess = 0x28, /* DV F - Battery System Manufacturer Access */ + kHIDUsage_BS_RemainingCapacityLimit = 0x29, /* DV F - Battery System Remaining Capacity Limit */ + kHIDUsage_BS_RemainingTimeLimit = 0x2A, /* DV F - Battery System Remaining Time Limit */ + kHIDUsage_BS_AtRate = 0x2B, /* DV F - Battery System At Rate... */ + kHIDUsage_BS_CapacityMode = 0x2C, /* DV F - Battery System Capacity Mode */ + kHIDUsage_BS_BroadcastToCharger = 0x2D, /* DV F - Battery System Broadcast To Charger */ + kHIDUsage_BS_PrimaryBattery = 0x2E, /* DV F - Battery System Primary Battery */ + kHIDUsage_BS_ChargeController = 0x2F, /* DV F - Battery System Charge Controller */ + /* Reserved 0x30 - 0x3F */ + kHIDUsage_BS_TerminateCharge = 0x40, /* DF IOF - Battery System Terminate Charge */ + kHIDUsage_BS_TerminateDischarge = 0x41, /* DF IOF - Battery System Terminate Discharge */ + kHIDUsage_BS_BelowRemainingCapacityLimit = 0x42, /* DF IOF - Battery System Below Remaining Capacity Limit */ + kHIDUsage_BS_RemainingTimeLimitExpired = 0x43, /* DF IOF - Battery System Remaining Time Limit Expired */ + kHIDUsage_BS_Charging = 0x44, /* DF IOF - Battery System Charging */ + kHIDUsage_BS_Discharging = 0x45, /* DV IOF - Battery System Discharging */ + kHIDUsage_BS_FullyCharged = 0x46, /* DF IOF - Battery System Fully Charged */ + kHIDUsage_BS_FullyDischarged = 0x47, /* DV IOF - Battery System Fully Discharged */ + kHIDUsage_BS_ConditioningFlag = 0x48, /* DV IOF - Battery System Conditioning Flag */ + kHIDUsage_BS_AtRateOK = 0x49, /* DV IOF - Battery System At Rate OK */ + kHIDUsage_BS_SMBErrorCode = 0x4A, /* DF IOF - Battery System SMB Error Code */ + kHIDUsage_BS_NeedReplacement = 0x4B, /* DF IOF - Battery System Need Replacement */ + /* Reserved 0x4C - 0x5F */ + kHIDUsage_BS_AtRateTimeToFull = 0x60, /* DV IF - Battery System At Rate Time To Full */ + kHIDUsage_BS_AtRateTimeToEmpty = 0x61, /* DV IF - Battery System At Rate Time To Empty */ + kHIDUsage_BS_AverageCurrent = 0x62, /* DV IF - Battery System Average Current */ + kHIDUsage_BS_Maxerror = 0x63, /* DV IF - Battery System Max Error */ + kHIDUsage_BS_RelativeStateOfCharge = 0x64, /* DV IF - Battery System Relative State Of Charge */ + kHIDUsage_BS_AbsoluteStateOfCharge = 0x65, /* DV IF - Battery System Absolute State Of Charge */ + kHIDUsage_BS_RemainingCapacity = 0x66, /* DV IF - Battery System Remaining Capacity */ + kHIDUsage_BS_FullChargeCapacity = 0x67, /* DV IF - Battery System Full Charge Capacity */ + kHIDUsage_BS_RunTimeToEmpty = 0x68, /* DV IF - Battery System Run Time To Empty */ + kHIDUsage_BS_AverageTimeToEmpty = 0x69, /* DV IF - Battery System Average Time To Empty */ + kHIDUsage_BS_AverageTimeToFull = 0x6A, /* DV IF - Battery System Average Time To Full */ + kHIDUsage_BS_CycleCount = 0x6B, /* DV IF - Battery System Cycle Count */ + /* Reserved 0x6C - 0x7F */ + kHIDUsage_BS_BattPackModelLevel = 0x80, /* SV F - Battery System Batt Pack Model Level */ + kHIDUsage_BS_InternalChargeController = 0x81, /* SF F - Battery System Internal Charge Controller */ + kHIDUsage_BS_PrimaryBatterySupport = 0x82, /* SF F - Battery System Primary Battery Support */ + kHIDUsage_BS_DesignCapacity = 0x83, /* SV F - Battery System Design Capacity */ + kHIDUsage_BS_SpecificationInfo = 0x84, /* SV F - Battery System Specification Info */ + kHIDUsage_BS_ManufacturerDate = 0x85, /* SV F - Battery System Manufacturer Date */ + kHIDUsage_BS_SerialNumber = 0x86, /* SV F - Battery System Serial Number */ + kHIDUsage_BS_iManufacturerName = 0x87, /* SV F - Battery System Manufacturer Name Index */ + kHIDUsage_BS_iDevicename = 0x88, /* SV F - Battery System Device Name Index */ + kHIDUsage_BS_iDeviceChemistry = 0x89, /* SV F - Battery System Device Chemistry Index */ + kHIDUsage_BS_ManufacturerData = 0x8A, /* SV F - Battery System Manufacturer Data */ + kHIDUsage_BS_Rechargable = 0x8B, /* SV F - Battery System Rechargable */ + kHIDUsage_BS_WarningCapacityLimit = 0x8C, /* SV F - Battery System Warning Capacity Limit */ + kHIDUsage_BS_CapacityGranularity1 = 0x8D, /* SV F - Battery System Capacity Granularity 1 */ + kHIDUsage_BS_CapacityGranularity2 = 0x8E, /* SV F - Battery System Capacity Granularity 2 */ + kHIDUsage_BS_iOEMInformation = 0x8F, /* SV F - Battery System OEM Information Index */ + /* Reserved 0x90 - 0xBF */ + kHIDUsage_BS_InhibitCharge = 0xC0, /* DF IOF - Battery System Inhibit Charge */ + kHIDUsage_BS_EnablePolling = 0xC1, /* DF IOF - Battery System Enable Polling */ + kHIDUsage_BS_ResetToZero = 0xC2, /* DF IOF - Battery System Reset To Zero */ + /* Reserved 0xC3 - 0xCF */ + kHIDUsage_BS_ACPresent = 0xD0, /* DF IOF - Battery System AC Present */ + kHIDUsage_BS_BatteryPresent = 0xD1, /* DF IOF - Battery System Battery Present */ + kHIDUsage_BS_PowerFail = 0xD2, /* DF IOF - Battery System Power Fail */ + kHIDUsage_BS_AlarmInhibited = 0xD3, /* DF IOF - Battery System Alarm Inhibited */ + kHIDUsage_BS_ThermistorUnderRange = 0xD4, /* DF IOF - Battery System Thermistor Under Range */ + kHIDUsage_BS_ThermistorHot = 0xD5, /* DF IOF - Battery System Thermistor Hot */ + kHIDUsage_BS_ThermistorCold = 0xD6, /* DF IOF - Battery System Thermistor Cold */ + kHIDUsage_BS_ThermistorOverRange = 0xD7, /* DF IOF - Battery System Thermistor Over Range */ + kHIDUsage_BS_VoltageOutOfRange = 0xD8, /* DF IOF - Battery System Voltage Out Of Range */ + kHIDUsage_BS_CurrentOutOfRange = 0xD9, /* DF IOF - Battery System Current Out Of Range */ + kHIDUsage_BS_CurrentNotRegulated = 0xDA, /* DF IOF - Battery System Current Not Regulated */ + kHIDUsage_BS_VoltageNotRegulated = 0xDB, /* DF IOF - Battery System Voltage Not Regulated */ + kHIDUsage_BS_MasterMode = 0xDC, /* DF IOF - Battery System Master Mode */ + /* Reserved 0xDD - 0xEF */ + kHIDUsage_BS_ChargerSelectorSupport = 0xF0, /* SF F- Battery System Charger Support Selector */ + kHIDUsage_BS_ChargerSpec = 0xF1, /* SF F- Battery System Charger Specification */ + kHIDUsage_BS_Level2 = 0xF2, /* SF F- Battery System Charger Level 2 */ + kHIDUsage_BS_Level3 = 0xF3 /* SF F- Battery System Charger Level 3 */ + /* Reserved 0xF2 - 0xFF */ +}; + +/* Bar Code Scanner Page (0x8C) */ +/* This section provides detailed descriptions of the usages employed by Bar Code Scanner Devices. */ +enum +{ + kHIDUsage_BCS_Undefined = 0x00, /* Bar Code Scanner Undefined Usage */ + kHIDUsage_BCS_BadgeReader = 0x01, /* CA - Bar Code Badge Reader */ + kHIDUsage_BCS_BarCodeScanner = 0x02, /* CA -Bar Code Scanner */ + kHIDUsage_BCS_DumbBarCodeScanner = 0x03, /* CA -Dumb Bar Code Scanner Usage */ + kHIDUsage_BCS_CordlessScannerBase = 0x04, /* CA -Cordless Base Usage */ + kHIDUsage_BCS_BarCodeScannerCradle = 0x05, /* CA -Bar Code Scanner Cradle Usage */ + /* Reserved 0x06 - 0x0F */ + kHIDUsage_BCS_AttributeReport = 0x10, /* CL - Attribute Report */ + kHIDUsage_BCS_SettingsReport = 0x11, /* CL - Settings Report */ + kHIDUsage_BCS_ScannedDataReport = 0x12, /* CL - Scanned Data Report */ + kHIDUsage_BCS_RawScannedDataReport = 0x13, /* CL - Raw Scanned Data Report */ + kHIDUsage_BCS_TriggerReport = 0x14, /* CL - Trigger Report */ + kHIDUsage_BCS_StatusReport = 0x15, /* CL - Status Report */ + kHIDUsage_BCS_UPC_EANControlReport = 0x16, /* CL - UPC/EAN Control Report */ + kHIDUsage_BCS_EAN2_3LabelControlReport = 0x17, /* CL - EAN 2/3 Label Control Report */ + kHIDUsage_BCS_Code39ControlReport = 0x18, /* CL - Code 39 Control Report */ + kHIDUsage_BCS_Interleaved2of5ControlReport = 0x19, /* CL - Interleaved 2 of 5 Control Report */ + kHIDUsage_BCS_Standard2of5ControlReport = 0x1A, /* CL - Standard 2 of 5 Control Report */ + kHIDUsage_BCS_MSIPlesseyControlReport = 0x1B, /* CL - MSI Plessey Control Report */ + kHIDUsage_BCS_CodabarControlReport = 0x1C, /* CL - Codabar Control Report */ + kHIDUsage_BCS_Code128ControlReport = 0x1D, /* CL - Code 128 Control Report */ + kHIDUsage_BCS_Misc1DControlReport = 0x1E, /* CL - Misc 1D Control Report */ + kHIDUsage_BCS_2DControlReport = 0x1F, /* CL - 2D Control Report */ + /* Reserved 0x20 - 0x2F */ + kHIDUsage_BCS_Aiming_PointerMide = 0x30, /* SF - Aiming Pointer Mode */ + kHIDUsage_BCS_BarCodePresentSensor = 0x31, /* SF - Bar Code Present Sensor */ + kHIDUsage_BCS_Class1ALaser = 0x32, /* SF - Class 1A Laser */ + kHIDUsage_BCS_Class2Laser = 0x33, /* SF - Class 2 Laser */ + kHIDUsage_BCS_HeaterPresent = 0x34, /* SF - Heater Present */ + kHIDUsage_BCS_ContactScanner = 0x35, /* SF - Contact Scanner */ + kHIDUsage_BCS_ElectronicArticleSurveillanceNotification = 0x36, /* SF - Electronic Article Surveillance Notification */ + kHIDUsage_BCS_ConstantElectronicArticleSurveillance = 0x37, /* SF - Constant Electronic Article Surveillance */ + kHIDUsage_BCS_ErrorIndication = 0x38, /* SF - Error Indication */ + kHIDUsage_BCS_FixedBeeper = 0x39, /* SF - Fixed Beeper */ + kHIDUsage_BCS_GoodDecodeIndication = 0x3A, /* SF - Good Decode Indication */ + kHIDUsage_BCS_HandsFreeScanning = 0x3B, /* SF - Hands Free Scanning */ + kHIDUsage_BCS_IntrinsicallySafe = 0x3C, /* SF - Intrinsically Safe */ + kHIDUsage_BCS_KlasseEinsLaser = 0x3D, /* SF - Klasse Eins Laser */ + kHIDUsage_BCS_LongRangeScanner = 0x3E, /* SF - Long Range Scanner */ + kHIDUsage_BCS_MirrorSpeedControl = 0x3F, /* SF - Mirror Speed Control */ + kHIDUsage_BCS_NotOnFileIndication = 0x40, /* SF - Not On File Indication */ + kHIDUsage_BCS_ProgrammableBeeper = 0x41, /* SF - Programmable Beeper */ + kHIDUsage_BCS_Triggerless = 0x42, /* SF - Triggerless */ + kHIDUsage_BCS_Wand = 0x43, /* SF - Wand */ + kHIDUsage_BCS_WaterResistant = 0x44, /* SF - Water Resistant */ + kHIDUsage_BCS_MultiRangeScanner = 0x45, /* SF - Multi-Range Scanner */ + kHIDUsage_BCS_ProximitySensor = 0x46, /* SF - Proximity Sensor */ + /* Reserved 0x47 - 0x4C */ + kHIDUsage_BCS_FragmentDecoding = 0x4D, /* DF - Fragment Decoding */ + kHIDUsage_BCS_ScannerReadConfidence = 0x4E, /* DV - Scanner Read Confidence */ + kHIDUsage_BCS_DataPrefix = 0x4F, /* NAry - Data Prefix */ + kHIDUsage_BCS_PrefixAIMI = 0x50, /* SEL - Prefix AIMI */ + kHIDUsage_BCS_PrefixNone = 0x51, /* SEL - Prefix None */ + kHIDUsage_BCS_PrefixProprietary = 0x52, /* SEL - Prefix Proprietary */ + /* Reserved 0x53 - 0x54 */ + kHIDUsage_BCS_ActiveTime = 0x55, /* DV - Active Time */ + kHIDUsage_BCS_AimingLaserPattern = 0x56, /* DF - Aiming Laser Pattern */ + kHIDUsage_BCS_BarCodePresent = 0x57, /* OOC - Bar Code Present */ + kHIDUsage_BCS_BeeperState = 0x58, /* OOC - Beeper State */ + kHIDUsage_BCS_LaserOnTime = 0x59, /* DV - Laser On Time */ + kHIDUsage_BCS_LaserState = 0x5A, /* OOC - Laser State */ + kHIDUsage_BCS_LockoutTime = 0x5B, /* DV - Lockout Time */ + kHIDUsage_BCS_MotorState = 0x5C, /* OOC - Motor State */ + kHIDUsage_BCS_MotorTimeout = 0x5D, /* DV - Motor Timeout */ + kHIDUsage_BCS_PowerOnResetScanner = 0x5E, /* DF - Power On Reset Scanner */ + kHIDUsage_BCS_PreventReadOfBarcodes = 0x5F, /* DF - Prevent Read of Barcodes */ + kHIDUsage_BCS_InitiateBarcodeRead = 0x60, /* DF - Initiate Barcode Read */ + kHIDUsage_BCS_TriggerState = 0x61, /* DF - Trigger State */ + kHIDUsage_BCS_TriggerMode = 0x62, /* NAry - Trigger Mode */ + kHIDUsage_BCS_TriggerModeBlinkingLaserOn = 0x63, /* SEL - Trigger Mode Blinking Laser On */ + kHIDUsage_BCS_TriggerModeContinuousLaserOn = 0x64, /* SEL - Trigger Mode Continuous Laser On */ + kHIDUsage_BCS_TriggerModeLaserOnWhilePulled = 0x65, /* SEL - Trigger Mode Laser on while Pulled */ + kHIDUsage_BCS_TriggerModeLaserStaysOnAfterTriggerRelease = 0x66, /* SEL - Trigger Mode Laser stays on after Trigger Release */ + /* Reserved 0x67 - 0x6C */ + kHIDUsage_BCS_CommitParametersToNVM = 0x6D, /* DF - Commit Parameters to NVM */ + kHIDUsage_BCS_ParameterScanning = 0x6E, /* DF - Parameter Scanning */ + kHIDUsage_BCS_ParametersChanged = 0x6F, /* OOC - Parameters Changed */ + kHIDUsage_BCS_SetParameterDefaultValues = 0x70, /* DF - Set parameter default values */ + /* Reserved 0x71 - 0x74 */ + kHIDUsage_BCS_ScannerInCradle = 0x75, /* OOC - Scanner In Cradle */ + kHIDUsage_BCS_ScannerInRange = 0x76, /* OOC - Scanner In Range */ + /* Reserved 0x77 - 0x79 */ + kHIDUsage_BCS_AimDuration = 0x7A, /* DV - Aim Duration */ + kHIDUsage_BCS_GoodReadLampDuration = 0x7B, /* DV - Good Read Lamp Duration */ + kHIDUsage_BCS_GoodReadLampIntensity = 0x7C, /* DV - Good Read Lamp Intensity */ + kHIDUsage_BCS_GoodReadLED = 0x7D, /* DF - Good Read LED */ + kHIDUsage_BCS_GoodReadToneFrequency = 0x7E, /* DV - Good Read Tone Frequency*/ + kHIDUsage_BCS_GoodReadToneLength = 0x7F, /* DV - Good Read Tone Length */ + kHIDUsage_BCS_GoodReadToneVolume = 0x80, /* DV - Good Read Tone Volume */ + /* Reserved 0x81 */ + kHIDUsage_BCS_NoReadMessage = 0x82, /* DF - No Read Message */ + kHIDUsage_BCS_NotOnFileVolume = 0x83, /* DV - Not on File Volume */ + kHIDUsage_BCS_PowerupBeep = 0x84, /* DF - Powerup Beep */ + kHIDUsage_BCS_SoundErrorBeep = 0x85, /* DF - Sound Error Beep */ + kHIDUsage_BCS_SoundGoodReadBeep = 0x86, /* DF - Sound Good Read Beep */ + kHIDUsage_BCS_SoundNotOnFileBeep = 0x87, /* DF - Sound Not On File Beep */ + kHIDUsage_BCS_GoodReadWhenToWrite = 0x88, /* NArry - Good Read When to Write */ + kHIDUsage_BCS_GRWTIAfterDecode = 0x89, /* SEL - GRWTI After Decode */ + kHIDUsage_BCS_GRWTIBeep_LampAfterTransmit = 0x8A, /* SEL - GRWTI Beep/Lamp after transmit */ + kHIDUsage_BCS_GRWTINoBeep_LampUseAtAll = 0x8B, /* SEL - GRWTI No Beep/Lamp at all */ + /* Reserved 0x8C - 0x90 */ + kHIDUsage_BCS_BooklandEAN = 0x91, /* DF - Bookland EAN */ + kHIDUsage_BCS_ConvertEAN8To13Type = 0x92, /* DF - Convert EAN 8 to 13 Type */ + kHIDUsage_BCS_ConvertUPCAToEAN_13 = 0x93, /* DF - Convert UPC A to EAN-13 */ + kHIDUsage_BCS_ConvertUPC_EToA = 0x94, /* DF - Convert UPC-E to A */ + kHIDUsage_BCS_EAN_13 = 0x95, /* DF - EAN-13 */ + kHIDUsage_BCS_EAN_8 = 0x96, /* DF - EAN_8 */ + kHIDUsage_BCS_EAN_99_128_Mandatory = 0x97, /* DF - EAN-99 128_Mandatory */ + kHIDUsage_BCS_EAN_99_P5_128_Optional = 0x98, /* DF - EAN-99 P5/128_Optional */ + /* Reserved 0x99 */ + kHIDUsage_BCS_UPC_EAN = 0x9A, /* DF - UPC/EAN */ + kHIDUsage_BCS_UPC_EANCouponCode = 0x9B, /* DF - UPC/EAN Coupon Code */ + kHIDUsage_BCS_UPC_EANPeriodicals = 0x9C, /* DV - UPC/EAN Periodicals */ + kHIDUsage_BCS_UPC_A = 0x9D, /* DF - UPC-A */ + kHIDUsage_BCS_UPC_AWith128Mandatory = 0x9E, /* DF - UPC-A with 128 Mandatory */ + kHIDUsage_BCS_UPC_AWith128Optical = 0x9F, /* DF - UPC-A with 128 Optical */ + kHIDUsage_BCS_UPC_AWithP5Optional = 0xA0, /* DF - UPC-A with P5 Optional */ + kHIDUsage_BCS_UPC_E = 0xA1, /* DF - UPC-E */ + kHIDUsage_BCS_UPC_E1 = 0xA2, /* DF - UPC-E1 */ + /* Reserved 0xA3 - 0xA8 */ + kHIDUsage_BCS_Periodical = 0xA9, /* NArry - Periodical */ + kHIDUsage_BCS_PeriodicalAutoDiscriminatePlus2 = 0xAA,/* SEL - Periodical Auto-Discriminate + 2 */ + kHIDUsage_BCS_PeriodicalOnlyDecodeWithPlus2 = 0xAB, /* SEL - Periodical Only Decode with + 2 */ + kHIDUsage_BCS_PeriodicalIgnorePlus2 = 0xAC, /* SEL - Periodical Ignore + 2 */ + kHIDUsage_BCS_PeriodicalAutoDiscriminatePlus5 = 0xAD,/* SEL - Periodical Auto-Discriminate + 5 */ + kHIDUsage_BCS_PeriodicalOnlyDecodeWithPlus5 = 0xAE, /* SEL - Periodical Only Decode with + 5 */ + kHIDUsage_BCS_PeriodicalIgnorePlus5 = 0xAF, /* SEL - Periodical Ignore + 5 */ + kHIDUsage_BCS_Check = 0xB0, /* NArry - Check */ + kHIDUsage_BCS_CheckDisablePrice = 0xB1, /* SEL - Check Disable Price */ + kHIDUsage_BCS_CheckEnable4DigitPrice = 0xB2, /* SEL - Check Enable 4 digit Price */ + kHIDUsage_BCS_CheckEnable5DigitPrice = 0xB3, /* SEL - Check Enable 5 digit Price */ + kHIDUsage_BCS_CheckEnableEuropean4DigitPrice = 0xB4,/* SEL - Check Enable European 4 digit Price */ + kHIDUsage_BCS_CheckEnableEuropean5DigitPrice = 0xB5,/* SEL - Check Enable European 5 digit Price */ + /* Reserved 0xB6 */ + kHIDUsage_BCS_EANTwoLabel = 0xB7, /* DF - EAN Two Label */ + kHIDUsage_BCS_EANThreeLabel = 0xB8, /* DF - EAN Thread Label */ + kHIDUsage_BCS_EAN8FlagDigit1 = 0xB9, /* DV - EAN 8 Flag Digit 1 */ + kHIDUsage_BCS_EAN8FlagDigit2 = 0xBA, /* DV - EAN 8 Flag Digit 2 */ + kHIDUsage_BCS_EAN8FlagDigit3 = 0xBB, /* DV - EAN 8 Flag Digit 3 */ + kHIDUsage_BCS_EAN13FlagDigit1 = 0xBC, /* DV - EAN 13 Flag Digit 1 */ + kHIDUsage_BCS_EAN13FlagDigit2 = 0xBD, /* DV - EAN 13 Flag Digit 2 */ + kHIDUsage_BCS_EAN13FlagDigit3 = 0xBE, /* DV - EAN 13 Flag Digit 3 */ + kHIDUsage_BCS_AddEAN2_3LabelDefinition = 0xBF, /* DF - Add EAN 2/3 Label Definition */ + kHIDUsage_BCS_ClearAllEAN2_3LabelDefinitions = 0xC0,/* DF - Clear all EAN 2/3 Label Definitions */ + /* Reserved 0xC1 - 0xC2 */ + kHIDUsage_BCS_Codabar = 0xC3, /* DF - Codabar */ + kHIDUsage_BCS_Code128 = 0xC4, /* DF - Code 128 */ + /* Reserved 0xC5 - 0xC6 */ + kHIDUsage_BCS_Code39 = 0xC7, /* DF - Code 39 */ + kHIDUsage_BCS_Code93 = 0xC8, /* DF - Code 93 */ + kHIDUsage_BCS_FullASCIIConversion = 0xC9, /* DF - Full ASCII Conversion */ + kHIDUsage_BCS_Interleaved2of5 = 0xCA, /* DF - Interleaved 2 of 5 */ + kHIDUsage_BCS_ItalianPharmacyCode = 0xCB, /* DF - Italian Pharmacy Code */ + kHIDUsage_BCS_MSI_Plessey = 0xCC, /* DF - MSI/Plessey */ + kHIDUsage_BCS_Standard2of5IATA = 0xCD, /* DF - Standard 2 of 5 IATA */ + kHIDUsage_BCS_Standard2of5 = 0xCE, /* DF - Standard 2 of 5 */ + /* Reserved 0xCF - 0xD2 */ + kHIDUsage_BCS_TransmitStart_Stop = 0xD3, /* DF - Transmit Start/Stop */ + kHIDUsage_BCS_TriOptic = 0xD4, /* DF - Tri-Optic */ + kHIDUsage_BCS_UCC_EAN_128 = 0xD5, /* DF - UCC/EAN-128 */ + kHIDUsage_BCS_CheckDigit = 0xD6, /* NArry - Check Digit */ + kHIDUsage_BCS_CheckDigitDisable = 0xD7, /* SEL - Check Digit Disable */ + kHIDUsage_BCS_CheckDigitEnableInterleaved2of5OPCC = 0xD8, /* SEL - Check Digit Enable Interleaved 2 of 5 OPCC */ + kHIDUsage_BCS_CheckDigitEnableInterleaved2of5USS = 0xD9, /* SEL - Check Digit Enable Interleaved 2 of 5 USS */ + kHIDUsage_BCS_CheckDigitEnableStandard2of5OPCC = 0xD8, /* SEL - Check Digit Enable Standard 2 of 5 OPCC */ + kHIDUsage_BCS_CheckDigitEnableStandard2of5USS = 0xD9, /* SEL - Check Digit Enable Standard 2 of 5 USS */ + kHIDUsage_BCS_CheckDigitEnableOneMSIPlessey = 0xDC, /* SEL - Check Digit Enable One MSI Plessey */ + kHIDUsage_BCS_CheckDigitEnableTwoMSIPlessey = 0xDD, /* SEL - Check Digit Enable Two MSI Plessey */ + kHIDUsage_BCS_CheckDigitCodabarEnable = 0xDE, /* SEL - Check Digit Codabar Enable */ + kHIDUsage_BCS_CheckDigitCode99Enable = 0xDF, /* SEL - Check Digit Code 99 Enable */ + /* Reserved 0xE0 - 0xEF */ + kHIDUsage_BCS_TransmitCheckDigit = 0xF0, /* NArry - Transmit Check Digit */ + kHIDUsage_BCS_DisableCheckDigitTransmit = 0xF1, /* SEL - Disable Check Digit Transmit */ + kHIDUsage_BCS_EnableCheckDigitTransmit = 0xF2, /* SEL - Enable Check Digit Transmit */ + /* Reserved 0xF3 - 0xFA */ + kHIDUsage_BCS_SymbologyIdentifier1 = 0xFB, /* DV - Symbology Identifier 1 */ + kHIDUsage_BCS_SymbologyIdentifier2 = 0xFC, /* DV - Symbology Identifier 2 */ + kHIDUsage_BCS_SymbologyIdentifier3 = 0xFD, /* DV - Symbology Identifier 3 */ + kHIDUsage_BCS_DecodedData = 0xFE, /* DV - Decoded Data */ + kHIDUsage_BCS_DecodeDataContinued = 0xFF, /* DF - Decode Data Continued */ + kHIDUsage_BCS_BarSpaceData = 0x100, /* DV - Bar Space Data */ + kHIDUsage_BCS_ScannerDataAccuracy = 0x101, /* DV - Scanner Data Accuracy */ + kHIDUsage_BCS_RawDataPolarity = 0x102, /* NArry - Raw Data Polarity */ + kHIDUsage_BCS_PolarityInvertedBarCode = 0x103, /* SEL - Polarity Inverted Bar Code */ + kHIDUsage_BCS_PolarityNormalBarCode = 0x103, /* SEL - Polarity Normal Bar Code */ + /* Reserved 0x105 */ + kHIDUsage_BCS_MinimumLengthToDecode = 0x106, /* DV - Minimum Length to Decode */ + kHIDUsage_BCS_MaximumLengthToDecode = 0x107, /* DV - Maximum Length to Decode */ + kHIDUsage_BCS_FirstDiscreteLengthToDecode = 0x108, /* DV - First Discrete Length to Decode */ + kHIDUsage_BCS_SecondDiscreteLengthToDecode = 0x109, /* DV - Second Discrete Length to Decode */ + kHIDUsage_BCS_DataLengthMethod = 0x10A, /* NArry - Data Length Method */ + kHIDUsage_BCS_DLMethodReadAny = 0x10B, /* DF - DL Method Read any */ + kHIDUsage_BCS_DLMethodCheckInRange = 0x10C, /* DF - DL Method Check in Range */ + kHIDUsage_BCS_DLMethodCheckForDiscrete = 0x10D, /* DF - DL Method Check for Discrete */ + /* Reserved 0x10E - 0x10F */ + kHIDUsage_BCS_AztecCode = 0x110, /* DF - Aztec Code */ + kHIDUsage_BCS_BC412 = 0x111, /* DF - BC412 */ + kHIDUsage_BCS_ChannelCode = 0x112, /* DF - Channel Code */ + kHIDUsage_BCS_Code16 = 0x113, /* DF - Code 16 */ + kHIDUsage_BCS_Code32 = 0x114, /* DF - Code 32 */ + kHIDUsage_BCS_Code49 = 0x115, /* DF - Code 49 */ + kHIDUsage_BCS_CodeOne = 0x116, /* DF - Code One */ + kHIDUsage_BCS_Colorcode = 0x117, /* DF - Colorcode */ + kHIDUsage_BCS_DataMatrix = 0x118, /* DF - Data Matrix */ + kHIDUsage_BCS_MaxiCode = 0x119, /* DF - MaxiCode */ + kHIDUsage_BCS_MicroPDF = 0x11A, /* DF - MicroPDF */ + kHIDUsage_BCS_PDF_417 = 0x11B, /* DF - PDF-417 */ + kHIDUsage_BCS_PosiCode = 0x11C, /* DF - PosiCode */ + kHIDUsage_BCS_QRCode = 0x11D, /* DF - QR Code */ + kHIDUsage_BCS_SuperCode = 0x11E, /* DF - SuperCode */ + kHIDUsage_BCS_UltraCode = 0x11F, /* DF - UltraCode */ + kHIDUsage_BCS_USB_5_SlugCode = 0x120, /* DF - USD-5 (Slug Code) */ + kHIDUsage_BCS_VeriCode = 0x121 /* DF - VeriCode */ + /* Reserved 0x122 - 0xFFFF */ +}; + +/* Weighing Devices Page (0x8D) */ +/* This section provides detailed descriptions of the usages employed by Weighing Devices. */ +enum +{ + kHIDUsage_WD_Undefined = 0x00, /* Weighing Device Undefined Usage */ + kHIDUsage_WD_WeighingDevice = 0x01, /* CA - Weighing Device */ + /* Reserved 0x02 - 0x1F */ + kHIDUsage_WD_ScaleScaleDevice = 0x20, /* CL - Scale Device */ + kHIDUsage_WD_ScaleScaleClassIMetricCL = 0x21, /* CL - Scale Class I Metric */ + kHIDUsage_WD_ScaleScaleClassIMetric = 0x22, /* SEL - Scale Class I Metric */ + kHIDUsage_WD_ScaleScaleClassIIMetric = 0x23, /* SEL - Scale Class II Metric */ + kHIDUsage_WD_ScaleScaleClassIIIMetric = 0x24, /* SEL - Scale Class III Metric */ + kHIDUsage_WD_ScaleScaleClassIIILMetric = 0x25, /* SEL - Scale Class IIIL Metric */ + kHIDUsage_WD_ScaleScaleClassIVMetric = 0x26, /* SEL - Scale Class IV Metric */ + kHIDUsage_WD_ScaleScaleClassIIIEnglish = 0x27, /* SEL - Scale Class III English */ + kHIDUsage_WD_ScaleScaleClassIIILEnglish = 0x28, /* SEL - Scale Class IIIL English */ + kHIDUsage_WD_ScaleScaleClassIVEnglish = 0x29, /* SEL - Scale Class IV English */ + kHIDUsage_WD_ScaleScaleClassGeneric = 0x2A, /* SEL - Scale Class Generic */ + /* Reserved 0x2B - 0x2F */ + kHIDUsage_WD_ScaleAtrributeReport = 0x30, /* CL - Scale Attribute Report */ + kHIDUsage_WD_ScaleControlReport = 0x31, /* CL - Scale Control Report */ + kHIDUsage_WD_ScaleDataReport = 0x32, /* CL - Scale Data Report */ + kHIDUsage_WD_ScaleStatusReport = 0x33, /* CL - Scale Status Report */ + kHIDUsage_WD_ScaleWeightLimitReport = 0x34, /* CL - Scale Weight Limit Report */ + kHIDUsage_WD_ScaleStatisticsReport = 0x35, /* CL - Scale Statistics Report */ + /* Reserved 0x36 - 0x3F */ + kHIDUsage_WD_DataWeight = 0x40, /* DV - Data Weight */ + kHIDUsage_WD_DataScaling = 0x41, /* DV - Data Scaling */ + /* Reserved 0x42 - 0x4F */ + kHIDUsage_WD_WeightUnit = 0x50, /* CL - Weight Unit */ + kHIDUsage_WD_WeightUnitMilligram = 0x51, /* SEL - Weight Unit Milligram */ + kHIDUsage_WD_WeightUnitGram = 0x52, /* SEL - Weight Unit Gram */ + kHIDUsage_WD_WeightUnitKilogram = 0x53, /* SEL - Weight Unit Kilogram */ + kHIDUsage_WD_WeightUnitCarats = 0x54, /* SEL - Weight Unit Carats */ + kHIDUsage_WD_WeightUnitTaels = 0x55, /* SEL - Weight Unit Taels */ + kHIDUsage_WD_WeightUnitGrains = 0x56, /* SEL - Weight Unit Grains */ + kHIDUsage_WD_WeightUnitPennyweights = 0x57, /* SEL - Weight Unit Pennyweights */ + kHIDUsage_WD_WeightUnitMetricTon = 0x58, /* SEL - Weight Unit Metric Ton */ + kHIDUsage_WD_WeightUnitAvoirTon = 0x59, /* SEL - Weight Unit Avoir Ton */ + kHIDUsage_WD_WeightUnitTroyOunce = 0x5A, /* SEL - Weight Unit Troy Ounce */ + kHIDUsage_WD_WeightUnitOunce = 0x5B, /* SEL - Weight Unit Ounce */ + kHIDUsage_WD_WeightUnitPound = 0x5C, /* SEL - Weight Unit Pound */ + /* Reserved 0x5D - 0x5F */ + kHIDUsage_WD_CalibrationCount = 0x60, /* DV - Calibration Count */ + kHIDUsage_WD_RezeroCount = 0x61, /* DV - Re-Zero Count*/ + /* Reserved 0x62 - 0x6F */ + kHIDUsage_WD_ScaleStatus = 0x70, /* CL - Scale Status */ + kHIDUsage_WD_ScaleStatusFault = 0x71, /* SEL - Scale Status Fault */ + kHIDUsage_WD_ScaleStatusStableAtZero = 0x72, /* SEL - Scale Status Stable at Center of Zero */ + kHIDUsage_WD_ScaleStatusInMotion = 0x73, /* SEL - Scale Status In Motion */ + kHIDUsage_WD_ScaleStatusWeightStable = 0x74, /* SEL - Scale Status Weight Stable */ + kHIDUsage_WD_ScaleStatusUnderZero = 0x75, /* SEL - Scale Status Under Zero */ + kHIDUsage_WD_ScaleStatusOverWeightLimit = 0x76, /* SEL - Scale Status Over Weight Limit */ + kHIDUsage_WD_ScaleStatusRequiresCalibration = 0x77, /* SEL - Scale Status Requires Calibration */ + kHIDUsage_WD_ScaleStatusRequiresRezeroing = 0x78, /* SEL - Scale Status Requires Re-zeroing */ + /* Reserved 0x79 - 0x7F */ + kHIDUsage_WD_ZeroScale = 0x80, /* OOC - Zero Scale */ + kHIDUsage_WD_EnforcedZeroReturn = 0x81 /* OOC - Enforced Zero Return */ + /* Reserved 0x82 - 0xFFFF */ + +}; + +/* Magnetic Stripe Reader Page (0x8E) */ +/* This section provides detailed descriptions of the usages employed by Magnetic Stripe Reader Devices. */ +enum +{ + kHIDUsage_MSR_Undefined = 0x00, /* MagStripe Undefined Usage */ + kHIDUsage_MSR_DeviceReadOnly = 0x01, /* CA - MSR Device Read-Only */ + /* Reserved 0x02 - 0x10 */ + kHIDUsage_MSR_Track1Length = 0x11, /* SF, DF, SEL - Track 1 Length */ + kHIDUsage_MSR_Track2Length = 0x12, /* SF, DF, SEL - Track 2 Length */ + kHIDUsage_MSR_Track3Length = 0x13, /* SF, DF, SEL - Track 3 Length */ + kHIDUsage_MSR_TrackJISLength = 0x14, /* SF, DF, SEL - Track JIS Length */ + /* Reserved 0x15 - 0x1F */ + kHIDUsage_MSR_TrackData = 0x20, /* SF, DF, SEL - Track Data */ + kHIDUsage_MSR_Track1Data = 0x21, /* SF, DF, SEL - Track 1 Data */ + kHIDUsage_MSR_Track2Data = 0x22, /* SF, DF, SEL - Track 2 Data */ + kHIDUsage_MSR_Track3Data = 0x23, /* SF, DF, SEL - Track 3 Data */ + kHIDUsage_MSR_TrackJISData = 0x24 /* SF, DF, SEL - Track JIS Data */ + /* Reserved 0x25 - 0xFFFF */ +}; + +/* Camera Control Page (0x90) */ +enum +{ + kHIDUsage_CC_Undefined = 0x00, /* Camera Control Undefined Usage */ + /* Reserved 0x01 - 0x1F */ + kHIDUsage_CC_Autofocus = 0x20, /* One-Shot Control */ + kHIDUsage_CC_Shutter = 0x21, /* One-Shot Control */ +}; + +#endif /* _IOHIDUSAGETABLES_H */ diff --git a/QualcommWireless/include/IOKit/hid/IOHIDUtility.h b/QualcommWireless/include/IOKit/hid/IOHIDUtility.h new file mode 100644 index 0000000..fbb4e2b --- /dev/null +++ b/QualcommWireless/include/IOKit/hid/IOHIDUtility.h @@ -0,0 +1,81 @@ +/* + * + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 2016 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef IOHIDUtility_h +#define IOHIDUtility_h + +#include +#include + +enum { + kKeyMaskCtrl = 0x0001, + kKeyMaskShift = 0x0002, + kKeyMaskAlt = 0x0004, + kKeyMaskCommand = 0x0008, + kKeyMaskPeriod = 0x0010, + kKeyMaskComma = 0x0020, + kKeyMaskSlash = 0x0040, + kKeyMaskEsc = 0x0080, + kKeyMaskFn = 0x0100, + kKeyMaskUnknown = 0x80000000 +}; + +struct Key { + uint64_t _value; + bool _modified; + Key ():_value(0), _modified(false){} + Key (uint32_t usagePage, uint32_t usage):_value(((uint64_t)usagePage << 32) | usage), _modified(false) {} + Key (uint32_t usagePage, uint32_t usage, bool modified):_value(((uint64_t)usagePage << 32) | usage), _modified(modified) {} + Key (uint64_t usageAndUsagePage): _value (usageAndUsagePage), _modified(false) {} + friend bool operator==(const Key &lhs, const Key &rhs) { + return (lhs._value == rhs._value); + } + friend bool operator<(const Key &lhs, const Key &rhs) { + return (lhs._value < rhs._value); + } + uint32_t usage () const {return ((uint32_t*)&_value)[0];} + uint32_t usagePage () const {return((uint32_t*)&_value)[1];} + bool isValid () const {return _value != 0;} + bool isModifier () const; + bool isTopRow () const { + bool result = false; + if ((usagePage() == kHIDPage_KeyboardOrKeypad) && + (((usage() >= kHIDUsage_Keyboard1) && (usage() <= kHIDUsage_Keyboard0)) || + (usage() == kHIDUsage_KeyboardHyphen) || + (usage() == kHIDUsage_KeyboardEqualSign) || + (usage() == kHIDUsage_KeyboardGraveAccentAndTilde) || + (usage() == kHIDUsage_KeyboardDeleteOrBackspace))) { + result = true; + } + return result; + } + +}; + +struct KeyAttribute { + uint32_t _flags; + KeyAttribute (uint32_t flags = 0):_flags(flags) {}; +}; + +#endif /* IOHIDUtility_h */ diff --git a/QualcommWireless/include/IOKit/hidsystem/IOHIDDescriptorParser.h b/QualcommWireless/include/IOKit/hidsystem/IOHIDDescriptorParser.h new file mode 100644 index 0000000..0c16bd5 --- /dev/null +++ b/QualcommWireless/include/IOKit/hidsystem/IOHIDDescriptorParser.h @@ -0,0 +1,996 @@ +/* + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 1999-2012 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +#ifndef __IOHIDDescriptorParser__ +#define __IOHIDDescriptorParser__ + +#define __iohid_deprecated(_msg) + +#if RTKIT +#include +#include +#include + +typedef uint8_t UInt8; +typedef int8_t Int8; +typedef uint32_t UInt32; +typedef int32_t SInt32; +typedef uint32_t IOByteCount; +typedef bool Boolean; +typedef SInt32 OSStatus; +typedef size_t vm_size_t; + +#else + +#include + +#if TARGET_OS_DRIVERKIT +#include +#include +#include + +typedef uint8_t UInt8; +typedef int8_t Int8; +typedef uint32_t UInt32; +typedef int32_t SInt32; +typedef unsigned char Boolean; +typedef SInt32 OSStatus; +typedef size_t vm_size_t; + +#else +#include +#endif + +#if __has_include() + #include +#endif + +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* End missing types and enums */ + + + +#if __has_include() + #include +#elif __has_include() + #include +#else +enum +{ + kHIDSuccess = 0, + +/* HID assigned error numbers are -13949 .. -13900 */ + kHIDBaseError = -13950, + + kHIDNullStateErr, + kHIDBufferTooSmallErr, + kHIDValueOutOfRangeErr, + kHIDUsageNotFoundErr, + kHIDNotValueArrayErr, + kHIDInvalidPreparsedDataErr, + kHIDIncompatibleReportErr, + kHIDBadLogPhysValuesErr, + kHIDInvalidReportTypeErr, + kHIDInvalidReportLengthErr, + kHIDNullPointerErr, + kHIDBadParameterErr, + kHIDNotEnoughMemoryErr, + kHIDEndOfDescriptorErr, + kHIDUsagePageZeroErr, + kHIDBadLogicalMinimumErr, + kHIDBadLogicalMaximumErr, + kHIDInvertedLogicalRangeErr, + kHIDInvertedPhysicalRangeErr, + kHIDUnmatchedUsageRangeErr, + kHIDInvertedUsageRangeErr, + kHIDUnmatchedStringRangeErr, + kHIDUnmatchedDesignatorRangeErr, + kHIDReportSizeZeroErr, + kHIDReportCountZeroErr, + kHIDReportIDZeroErr, + kHIDInvalidRangePageErr, + + // + // HID device driver errors + // + + kHIDDeviceNotReady = -13910, // The device is still initializing, try again later + kHIDVersionIncompatibleErr, +}; +#endif +// types of HID reports (input, output, feature) +enum +{ + kHIDInputReport = 1, + kHIDOutputReport, + kHIDFeatureReport, + kHIDUnknownReport = 255 +}; + +// flags passed to HIDOpenReportDescriptor +enum +{ + kHIDFlag_StrictErrorChecking = 0x00000001 +}; + +typedef UInt32 HIDReportType; +typedef UInt32 HIDUsage; + +typedef void *HIDPreparsedDataRef; + +/*! + @typedef HIDUsageAndPage + @abstract The HIDUsageAndPage data structure is used by HID clients when obtaining status of buttons to hold the usage page and usage of a button that is down. + @discussion Clients use the HIDUSageAndPage structure with the HIDGetButtonsEx function to obtain both the usage page and usage identifiers of each button that is down. + @field usage Specifies the usage identifier within the usage page specified by usagePage of a button that is down. + @field usagePage Specifies the usage page identifier of a button that is down. + */ +struct HIDUsageAndPage +{ + HIDUsage usage; + HIDUsage usagePage; +}; +typedef struct HIDUsageAndPage HIDUsageAndPage, *HIDUsageAndPagePtr; + +/*! + @typedef HIDCaps + @abstract The HIDCaps data structure is used by HID clients to hold the capabilities of a HID device. + @discussion This structure holds the parsed capabilities and data maximums returned for a device by the HIDGetCaps function. + @field usage Specifies the specific class of functionality that this device provides. This value is dependent and specific to the value provided in the usagePage field. For example, a keyboard could have a usagePage of kHIDUsagePage_Generic and a usage of kHIDUsage_Generic_Keyboard. + @field usagePage Specifies the usage page identifier for this top level collection. + @field inputReportByteLength Specifies the maximum length, in bytes, of an input report for this device, including the report ID which is unilaterally prepended to the device data. + @field outputReportByteLength Specifies the maximum length, in bytes, of an output report for this device, including the report ID which is unilaterally prepended to the device data. + @field featureReportByteLength Specifies the maximum length, in bytes, of a feature report for this device, including the report ID which is unilaterally prepended to the device data. + @field numberCollectionNodes Specifies the number of HIDCollectionNode structures that are returned for this top level collection by the HIDGetConnectionNodes function. + @field numberInputButtonCaps Specifies the number of input buttons. + @field numberInputValueCaps Specifies the number of input values. + @field numberOutputButtonCaps Specifies the number of output buttons. + @field numberOutputValueCaps Specifies the number of output values + @field numberFeatureButtonCaps Specifies the number of feature buttons. + @field numberFeatureValueCaps Specifies the number of feature values. + */ +struct HIDCaps +{ + HIDUsage usage; + HIDUsage usagePage; + IOByteCount inputReportByteLength; + IOByteCount outputReportByteLength; + IOByteCount featureReportByteLength; + UInt32 numberCollectionNodes; + UInt32 numberInputButtonCaps; + UInt32 numberInputValueCaps; + UInt32 numberOutputButtonCaps; + UInt32 numberOutputValueCaps; + UInt32 numberFeatureButtonCaps; + UInt32 numberFeatureValueCaps; +}; +typedef struct HIDCaps HIDCaps, * HIDCapsPtr; + +struct HIDCapabilities { + HIDUsage usage; + HIDUsage usagePage; + IOByteCount inputReportByteLength; + IOByteCount outputReportByteLength; + IOByteCount featureReportByteLength; + UInt32 numberCollectionNodes; + UInt32 numberInputButtonCaps; + UInt32 numberInputValueCaps; + UInt32 numberOutputButtonCaps; + UInt32 numberOutputValueCaps; + UInt32 numberFeatureButtonCaps; + UInt32 numberFeatureValueCaps; +}; +typedef struct HIDCapabilities HIDCapabilities, * HIDCapabilitiesPtr; + + +struct HIDCollectionNode +{ + HIDUsage collectionUsage; + HIDUsage collectionUsagePage; + UInt32 parent; + UInt32 numberOfChildren; + UInt32 nextSibling; + UInt32 firstChild; +}; +typedef struct HIDCollectionNode HIDCollectionNode, * HIDCollectionNodePtr; + +struct HIDButtonCaps +{ + HIDUsage usagePage; + UInt32 reportID; + UInt32 bitField; + UInt32 collection; + HIDUsage collectionUsage; + HIDUsage collectionUsagePage; + Boolean isRange; + Boolean isStringRange; + Boolean isDesignatorRange; + Boolean isAbsolute; + SInt32 startBit; // Added esb 9-29-99 + + union + { + struct + { + HIDUsage usageMin; + HIDUsage usageMax; + UInt32 stringMin; + UInt32 stringMax; + UInt32 designatorMin; + UInt32 designatorMax; + } range; + struct + { + HIDUsage usage; + HIDUsage reserved1; + UInt32 stringIndex; + UInt32 reserved2; + UInt32 designatorIndex; + UInt32 reserved3; + } notRange; + } u; +}; +typedef struct HIDButtonCaps HIDButtonCaps, * HIDButtonCapsPtr; + +struct HIDButtonCapabilities +{ + HIDUsage usagePage; + UInt32 reportID; + UInt32 bitField; + UInt32 collection; + HIDUsage collectionUsage; + HIDUsage collectionUsagePage; + Boolean isRange; + Boolean isStringRange; + Boolean isDesignatorRange; + Boolean isAbsolute; + + SInt32 unitExponent; // Added KH 1/25/01 + SInt32 units; // Added KH 1/25/01 +// UInt32 reserved; // Not added KH 1/25/01 + SInt32 startBit; // Added esb 9-29-99 + UInt32 pbVersion; // Added KH 1/25/01 + + union + { + struct + { + HIDUsage usageMin; + HIDUsage usageMax; + UInt32 stringMin; + UInt32 stringMax; + UInt32 designatorMin; + UInt32 designatorMax; + } range; + struct + { + HIDUsage usage; + HIDUsage reserved1; + UInt32 stringIndex; + UInt32 reserved2; + UInt32 designatorIndex; + UInt32 reserved3; + } notRange; + } u; +}; +typedef struct HIDButtonCapabilities HIDButtonCapabilities, * HIDButtonCapabilitiesPtr; + +struct HIDValueCaps +{ + HIDUsage usagePage; + UInt32 reportID; + UInt32 bitField; + UInt32 collection; + HIDUsage collectionUsage; + HIDUsage collectionUsagePage; + + Boolean isRange; + Boolean isStringRange; + Boolean isDesignatorRange; + Boolean isAbsolute; + + UInt32 startBit; // Added by esb 9-28-99 + UInt32 bitSize; + UInt32 reportCount; + + SInt32 logicalMin; + SInt32 logicalMax; + SInt32 physicalMin; + SInt32 physicalMax; + + union + { + struct + { + HIDUsage usageMin; + HIDUsage usageMax; + UInt32 stringMin; + UInt32 stringMax; + UInt32 designatorMin; + UInt32 designatorMax; + } range; + struct + { + HIDUsage usage; + HIDUsage reserved1; + UInt32 stringIndex; + UInt32 reserved2; + UInt32 designatorIndex; + UInt32 reserved3; + } notRange; + } u; +}; +typedef struct HIDValueCaps HIDValueCaps, * HIDValueCapsPtr; + +struct HIDValueCapabilities +{ + HIDUsage usagePage; + UInt32 reportID; + UInt32 bitField; + UInt32 collection; + HIDUsage collectionUsage; + HIDUsage collectionUsagePage; + + Boolean isRange; + Boolean isStringRange; + Boolean isDesignatorRange; + Boolean isAbsolute; + + UInt32 bitSize; + UInt32 reportCount; + + SInt32 logicalMin; + SInt32 logicalMax; + SInt32 physicalMin; + SInt32 physicalMax; + + SInt32 unitExponent; // Added KH 1/25/01 + SInt32 units; // Added KH 1/25/01 +// UInt32 reserved; // Not added KH 1/25/01 + SInt32 startBit; // Added esb 9-29-99 // Moved here KH 1/25/01 + UInt32 pbVersion; // Added KH 1/25/01 + + union + { + struct + { + HIDUsage usageMin; + HIDUsage usageMax; + UInt32 stringMin; + UInt32 stringMax; + UInt32 designatorMin; + UInt32 designatorMax; + } range; + struct + { + HIDUsage usage; + HIDUsage reserved1; + UInt32 stringIndex; + UInt32 reserved2; + UInt32 designatorIndex; + UInt32 reserved3; + } notRange; + } u; +}; +typedef struct HIDValueCapabilities HIDValueCapabilities, * HIDValueCapabilitiesPtr; + +/*! + @function HIDOpenReportDescriptor + @abstract The HIDOpenReportDescriptor function allocates the memory the parser needs to handle the given report descriptor, and then parses the report descriptor. + @discussion When the parsed information is no longer needed, clients should call the HIDCloseReportDescriptor function. + @param hidReportDescriptor Contains a pointer to the actual HID report descriptor from the USB device's firmware + @param descriptorLength The length of the HID report descriptor + @param preparsedDataRef Preparsed data reference to be used for subsequent function calls + @param flags Flags for this runction are kHIDFlag_StrictErrorChecking = 0x00000001 + @result OSStatus Returns an error code if an error was encountered or noErr on success. + */ + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDOpenReportDescriptor (void * hidReportDescriptor, + IOByteCount descriptorLength, + HIDPreparsedDataRef * preparsedDataRef, + UInt32 flags); + +/*! + @function HIDCloseReportDescriptor + @abstract Disposes of the memory the parser allocated for the HIDOpenReportDescriptor function. + @param preparsedDataRef Preparsed data reference for the report that is returned by the HIDOpenReportDescriptor function. After making a call to the HIDCloseReportDescriptor function, the preparsedDataRef is invalid and should not be used. + @result OSStatus Returns an error code if an error was encountered or noErr on success. + */ + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDCloseReportDescriptor (HIDPreparsedDataRef preparsedDataRef); + +/*! + @function HIDGetButtonCaps + @abstract Returns the button capabilities structures for a HID device based on the given preparsed data. + @param reportType Specifies the type of report for which to retrieve the scaled value. This parameter must be one of the following: kHIDInputReport, kHIDOutputReport, or kHIDFeatureReport + @param buttonCaps Points to a caller-allocated buffer that will contain, on return, an array of HIDButtonCaps structures. The structures contain information for all buttons that meet the search criteria + @param buttonCapsSize Contains the size of the buttonCaps array passed in to the function and is set to the number of elements actually placed in the array after the call completes. + @param preparsedDataRef Preparsed data reference for the report that is retuned by the HIDOpenReportDescriptor function + @result OSStatus Returns an error code if an error was encountered or noErr on success. + */ + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDGetButtonCaps (HIDReportType reportType, + HIDButtonCapsPtr buttonCaps, + UInt32 * buttonCapsSize, + HIDPreparsedDataRef preparsedDataRef); + +/*! + @function HIDGetButtonCapabilities + @abstract Returns the button capabilities structures for a HID device based on the given preparsed data. + @param reportType Specifies the type of report for which to retrieve the scaled value. This parameter must be one of the following: kHIDInputReport, kHIDOutputReport, or kHIDFeatureReport + @param buttonCaps Points to a caller-allocated buffer that will contain, on return, an array of HIDButtonCapabilities structures. The structures contain information for all buttons that meet the search criteria + @param buttonCapsSize Contains the size of the buttonCaps array passed in to the function and is set to the number of elements actually placed in the array after the call completes. + @param preparsedDataRef Preparsed data reference for the report that is retuned by the HIDOpenReportDescriptor function + @result OSStatus Returns an error code if an error was encountered or noErr on success. + */ + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDGetButtonCapabilities (HIDReportType reportType, + HIDButtonCapabilitiesPtr buttonCaps, + UInt32 * buttonCapsSize, + HIDPreparsedDataRef preparsedDataRef); + +/*! + @function HIDGetCaps + @abstract Returns the capabilities of a HID device based on the given preparsed data. + @param preparsedDataRef Preparsed data reference for the report that is retuned by the HIDOpenReportDescriptor function + @param capabilities Points to a caller allocated buffer, that upon return contains the parsed capability information for this HID device. + @result OSStatus Returns an error code if an error was encountered or noErr on success. + */ + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDGetCaps (HIDPreparsedDataRef preparsedDataRef, + HIDCapsPtr capabilities); + +/*! + @function HIDGetCapabilities + @abstract Returns the capabilities of a HID device based on the given preparsed data. + @param preparsedDataRef Preparsed data reference for the report that is retuned by the HIDOpenReportDescriptor function + @param capabilities Points to a caller allocated buffer, that upon return contains the parsed capability information for this HID device. + @result OSStatus Returns an error code if an error was encountered or noErr on success. + */ + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDGetCapabilities (HIDPreparsedDataRef preparsedDataRef, + HIDCapabilitiesPtr capabilities); + +/*! + @function HIDGetCollectionNodes + @abstract Returns an array of HIDCollectionNode structures that describe the relationships and layout of the link collections within this top level collection. + @discussion The length of the buffer required, in array elements, for an entire collection node array is found in the HIDCaps structure member numberCollectionNodes. You obtain the HIDCaps information by calling the HIDGetCaps function. For information on the relationships of link collections described by the data returned from this routine, see the descripton of the HIDCollectionNode structure. + @param collectionNodes Points to a caller-allocated array of HIDCollectionNode structures in which this routine returns an entry for each collection within the top level collection. A collection is a group of corresponding HID descriptors containing input, output, and feature items that have some common relationship to one another. For example, a pointer collection contains items for x and y position data, and button data. + @param collectionNodesSize On input, specifies the length in array elements of the buffer provided at collectionNodes. On output, this parameter is set to the number of entries in the collectionNodes array that were initialized. + @param preparsedDataRef Preparsed data reference for the report that is retuned by the HIDOpenReportDescriptor function + @result OSStatus Returns an error code if an error was encountered or noErr on success. + */ + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDGetCollectionNodes (HIDCollectionNodePtr collectionNodes, + UInt32 * collectionNodesSize, + HIDPreparsedDataRef preparsedDataRef); + +/*! + @function HIDGetScaledUsageValue + @abstract The HIDGetScaledUsageValue function returns the capabilities for all buttons for a given top level collection. + @discussion Clients who which to obtain all capabilities for a usage that contains multiple data items for a single usage that corresponds to a HID byte array, must call the HIDGetUsageValueArray function. + @param reportType Specifies the type of report for which to retrieve the scaled value. This parameter must be one of the following: kHIDInputReport, kHIDOutputReport, or kHIDFeatureReport. + @param usagePage Specifies the usage page of the value to be retrieved. + @param collection Optionally specifies the link collection identifier of the value to be retrieved. + @param usage Specifies the usage of the scaled value to be retrieved. + @param usageValue Points to a variable, that on return from this routine holds the scaled value retrieved from the device report. + @param preparsedDataRef Preparsed data reference for the report that is retuned by the HIDOpenReportDescriptor function + @param report Points to the caller-allocated buffer that contains the device report data + @param reportLength Specifies the length, in bytes, of the report data provided at report + @result OSStatus Returns an error code if an error was encountered or noErr on success. + */ + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDGetScaledUsageValue (HIDReportType reportType, + HIDUsage usagePage, + UInt32 collection, + HIDUsage usage, + SInt32 * usageValue, + HIDPreparsedDataRef preparsedDataRef, + void * report, + IOByteCount reportLength); + +/*! + @function HIDGetSpecificButtonCaps + @abstract Retrieves the capabilities for all buttons in a specific type of report that meet the search criteria. + @discussion The HIDGetSpecificButtonCaps function retrieves capability data for buttons that meet a given search criteria, as opposed to the HIDGetButtonCaps function which returns the capability data for all buttons on the device. Calling this routine specifying zero for usagePage, usage and collection is equivalent to calling the HIDGetButtonCaps function. + @param reportType Specifies the type of report for which to retrieve the button capabilities. This parameter must be one of the following: kHIDInputReport, kHIDOutputReport, or kHIDFeatureReport. + @param usagePage Specifies a usage page identifier to use as a search criteria. If this parameter is non-zero, then only buttons that specify this usage page will be retrieved. + @param collection Specifies a link collection identifier to use as a search criteria. If this parameter is non-zero, then only buttons that are part of the specified link collection are retrieved. + @param usage Specifies a usage identifier to use as a search criteria. If this parameter is non-zero, then only buttons that match the value specified are retrieved. + @param buttonCaps Points to a caller-allocated buffer that will contain, on return, an array of HIDButtonCaps structures. The structures contain information for all buttons that meet the search criteria. + @param buttonCapsSize On input, specifies the length, in array elements, of the buffer provided in the buttonCaps parameter. On output, this parameter is set to the actual number of elements that were returned by the function call, in the buffer provided in the buttonCaps parameter, if the routine completed without error. The correct length necessary to retrieve the button capabilities can be found in the capability data returned for the device by the HIDGetCaps function. + @param preparsedDataRef Preparsed data reference for the report that is retuned by the HIDOpenReportDescriptor function + @result OSStatus Returns an error code if an error was encountered or noErr on success. + */ + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDGetSpecificButtonCaps (HIDReportType reportType, + HIDUsage usagePage, + UInt32 collection, + HIDUsage usage, + HIDButtonCapsPtr buttonCaps, + UInt32 * buttonCapsSize, + HIDPreparsedDataRef preparsedDataRef); + +/*! + @function HIDGetSpecificButtonCapabilities + @abstract Retrieves the capabilities for all buttons in a specific type of report that meet the search criteria. + @discussion The HIDGetSpecificButtonCapabilities function retrieves capability data for buttons that meet a given search criteria, as opposed to the HIDGetButtonCapabilities function which returns the capability data for all buttons on the device. Calling this routine specifying zero for usagePage, usage and collection is equivalent to calling the HIDGetButtonCapabilities function. + @param reportType Specifies the type of report for which to retrieve the button capabilities. This parameter must be one of the following: kHIDInputReport, kHIDOutputReport, or kHIDFeatureReport. + @param usagePage Specifies a usage page identifier to use as a search criteria. If this parameter is non-zero, then only buttons that specify this usage page will be retrieved. + @param collection Specifies a link collection identifier to use as a search criteria. If this parameter is non-zero, then only buttons that are part of the specified link collection are retrieved. + @param usage Specifies a usage identifier to use as a search criteria. If this parameter is non-zero, then only buttons that match the value specified are retrieved. + @param buttonCaps Points to a caller-allocated buffer that will contain, on return, an array of HIDButtonCapabilities structures. The structures contain information for all buttons that meet the search criteria. + @param buttonCapsSize On input, specifies the length, in array elements, of the buffer provided in the buttonCaps parameter. On output, this parameter is set to the actual number of elements that were returned by the function call, in the buffer provided in the buttonCaps parameter, if the routine completed without error. The correct length necessary to retrieve the button capabilities can be found in the capability data returned for the device by the HIDGetCaps function. + @param preparsedDataRef Preparsed data reference for the report that is retuned by the HIDOpenReportDescriptor function + @result OSStatus Returns an error code if an error was encountered or noErr on success. + */ + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDGetSpecificButtonCapabilities (HIDReportType reportType, + HIDUsage usagePage, + UInt32 collection, + HIDUsage usage, + HIDButtonCapabilitiesPtr buttonCaps, + UInt32 * buttonCapsSize, + HIDPreparsedDataRef preparsedDataRef); + +/*! + @function HIDGetSpecificValueCaps + @abstract Retrieves the capabilities for all values in a specific type of report that meet the search criteria. + @discussion The HIDGetSpecificValueCaps function retrieves capability data for values that meet given search criteria, as opposed to the HIDGetValueCaps function, which returns the capability data for all values on the device. Calling this routine with a value of zero for usagePage, usage and collection parameters is equivalent to calling the HIDGetValueCaps function. + @param reportType Specifies the type of report for which to retrieve the value capabilities. This parameter must be one of the following: kHIDInputReport, kHIDOutputReport or kHIDFeatureReport. + @param usagePage Specifies a usage page identifier to use as a search criteria. If this parameter is non-zero, then only values that specify this usage page will be retrieved. + @param collection Specifies a link collection identifier to use as a search criteria. If this parameter is non-zero, then only values that are part of this link collection will be retrieved. + @param usage Specifies a usage identifier to use as a search criteria. If this parameter is non-zero, then only values that specify this usage will be retrieved. + @param valueCaps Points to a caller-allocated buffer that will contain, on return, an array of HIDValueCaps structures that contain information for all values that meet the search criteria. + @param valueCapsSize Specifies the length on input, in array elements, of the buffer provided in the valueCaps parameter. On output, this parameter is set to the actual number of elements that were returned by this function call, in the buffer provided in the valueCaps parameter, if the routine completed without error. The correct length necessary to retrieve the value capabilities can be found in the capability data returned for the device from the HIDGetCaps function. + @param preparsedDataRef Preparsed data reference for the report that is retuned by the HIDOpenReportDescriptor function + @result OSStatus Returns an error code if an error was encountered or noErr on success. + */ + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDGetSpecificValueCaps (HIDReportType reportType, + HIDUsage usagePage, + UInt32 collection, + HIDUsage usage, + HIDValueCapsPtr valueCaps, + UInt32 * valueCapsSize, + HIDPreparsedDataRef preparsedDataRef); + +/*! + @function HIDGetSpecificValueCapabilities + @abstract Retrieves the capabilities for all values in a specific type of report that meet the search criteria. + @discussion The HIDGetSpecificValueCapabilities function retrieves capability data for values that meet given search criteria, as opposed to the HIDGetValueCapabilities function, which returns the capability data for all values on the device. Calling this routine with a value of zero for usagePage, usage and collection parameters is equivalent to calling the HIDGetValueCapabilities function. + @param reportType Specifies the type of report for which to retrieve the value capabilities. This parameter must be one of the following: kHIDInputReport, kHIDOutputReport or kHIDFeatureReport. + @param usagePage Specifies a usage page identifier to use as a search criteria. If this parameter is non-zero, then only values that specify this usage page will be retrieved. + @param collection Specifies a link collection identifier to use as a search criteria. If this parameter is non-zero, then only values that are part of this link collection will be retrieved. + @param usage Specifies a usage identifier to use as a search criteria. If this parameter is non-zero, then only values that specify this usage will be retrieved. + @param valueCaps Points to a caller-allocated buffer that will contain, on return, an array of HIDValueCapabilities structures that contain information for all values that meet the search criteria. + @param valueCapsSize Specifies the length on input, in array elements, of the buffer provided in the valueCaps parameter. On output, this parameter is set to the actual number of elements that were returned by this function call, in the buffer provided in the valueCaps parameter, if the routine completed without error. The correct length necessary to retrieve the value capabilities can be found in the capability data returned for the device from the HIDGetCaps function. + @param preparsedDataRef Preparsed data reference for the report that is retuned by the HIDOpenReportDescriptor function + @result OSStatus Returns an error code if an error was encountered or noErr on success. + */ + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDGetSpecificValueCapabilities (HIDReportType reportType, + HIDUsage usagePage, + UInt32 collection, + HIDUsage usage, + HIDValueCapabilitiesPtr valueCaps, + UInt32 * valueCapsSize, + HIDPreparsedDataRef preparsedDataRef); + +/*! + @function HIDGetButtonsOnPage + @abstract Retrieves the button stat information for buttons on a specified usage page. + @param reportType Specifies the type of report, provided in the report parameter, from which to retrieve the buttons. This parameter must be one of the following: kHIDInputReport, kHIDOutputReport or kHIDFeatureReport. + @param usagePage Specifies the usage page of the buttons for which to retrieve the current state. + @param collection Optionally specifies the link collection identifier used to retrieve only specific button states. If this value is non-zero, only the buttons that are part of the given collection are returned. + @param usageList On return, points to a caller-allocated buffer that contains the usages of all the buttons that are perssed and belong to the usage page specified in the usagePage parameter. + @param usageListSize Is the size, in array elements, of the buffer provided in the usageList parameter. On return, this parameter contains the number of button states that were set by this routine. If the error kHIDBufferTooSmallErr was returned, this parameter contains the number of array elements required to hold all button data requested. The maximum number of buttons that can ever be returned for a given type of report can be obtained by calling the HIDMaxUsageListLength function. + @param preparsedDataRef Preparsed data reference for the report that is retuned by the HIDOpenReportDescriptor function + @param report Points to the caller-allocated buffer that contains the device report data + @param reportLength Specifies the size, in bytes, of the report data provided in the report parameter + @result OSStatus Returns an error code if an error was encountered or noErr on success. + */ + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDGetButtonsOnPage (HIDReportType reportType, + HIDUsage usagePage, + UInt32 collection, + HIDUsage * usageList, + UInt32 * usageListSize, + HIDPreparsedDataRef preparsedDataRef, + void * report, + IOByteCount reportLength); + +/*! + @function HIDGetButtons + @abstract The HIDGetButtons function takes a report from a HID device and gets the current state of the buttons in that report. + @param reportType Specifies the type of report, provided in the report parameter, from which to retrieve the buttons. This parameter must be one of the following: kHIDInputReport, kHIDOutputReport or kHIDFeatureReport + @param collection Optionally specifies the link collection identifier used to retrieve only specific button states. If this value is non-zero, only the buttons that are part of the given collection are returned. + @param usageList On return, points to a caller-allocated buffer that contains the usages of all the buttons that are pressed. + @param usageListSize Is the size, in array elements, of the buffer provided in the usageList parameter. On return, this parameter contains the number of button states that were set by this routine. If the error kHIDBufferToSmallErr was returned, this parameter contains the number of array elements required to hold all button data requested. The maximum number of buttons that can ever be returned for a given type of report can be obtained by calling the HIDMaxUsageListLength function. + @param preparsedDataRef Preparsed data reference for the report that is retuned by the HIDOpenReportDescriptor function + @param report Points to the caller-allocated buffer that contains the device report data. + @param reportLength Specifies the length, in bytes, of the report data provided in the report parameter. + @result OSStatus Returns an error code if an error was encountered or noErr on success. + */ + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDGetButtons (HIDReportType reportType, + UInt32 collection, + HIDUsageAndPagePtr usageList, + UInt32 * usageListSize, + HIDPreparsedDataRef preparsedDataRef, + void * report, + IOByteCount reportLength); + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDGetNextButtonInfo (HIDReportType reportType, + HIDUsage usagePage, + HIDUsage usage, + UInt32 * collection, + UInt8 * reportID, + HIDPreparsedDataRef preparsedDataRef); + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDGetNextUsageValueInfo (HIDReportType reportType, + HIDUsage usagePage, + HIDUsage usage, + UInt32 * collection, + UInt8 * reportID, + HIDPreparsedDataRef preparsedDataRef); + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDGetReportLength (HIDReportType reportType, + UInt8 reportID, + IOByteCount *reportLength, + HIDPreparsedDataRef preparsedDataRef); + +/*! + @function HIDGetUsageValue + @abstract The HIDGetUsageValue function returns a value from a device data report given a selected search criteria. + @discussion The HIDGetUsageValue function does not sign the value. To have the sign bit automatically applied, use the HIDGetScaledUsageValue function instead. For manually assigning the sign bit, the position of the sign bit can be found in the HIDValueCaps structure for this value. Clients who wish to obtain all data for a usage that contains multiple data items for a single usage, corresponding to a HID byte array, must call the HIDGetUsageValueArray function instead. + @param reportType Specifies the type of report, provided in report, from which to retrieve the value. This parameter must be one of the following: kHIDInputReport, kHIDOutputReport, or kHIDFeatureReport. + @param usagePage Specifies the usage page of the value to retrieve. + @param collection Optionally specifies the link collection identifier of the value to be retrieved. + @param usage Specifies the usage of the value to be retrieved. + @param usageValue Points to a variable, that on return from this routine holds the value retrieved from the device report. + @param preparsedDataRef Preparsed data reference for the report that is retuned by the HIDOpenReportDescriptor function + @param report Points to the caller-allocated buffer that contains the device report data. + @param reportLength Specifies the size, in bytes, of the report data provided in the report parameter. + @result OSStatus Returns an error code if an error was encountered or noErr on success. + */ + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDGetUsageValue (HIDReportType reportType, + HIDUsage usagePage, + UInt32 collection, + HIDUsage usage, + SInt32 * usageValue, + HIDPreparsedDataRef preparsedDataRef, + void * report, + IOByteCount reportLength); + +/*! + @function HIDGetUsageValueArray + @abstract The HIDGetUsageValueArray function returns a value from a device data report given a selected search criteria. + @discussion When the HIDGetUsageValueArray function retrieves the data, it fills in the buffer in little-endian order beginning with the least significant bit of the data for this usage. The data is filled in without regard to byte alignment and is shifted such that the least significant bit is placed as the 1st bit of the given buffer. + @param reportType Specifies the type of report, provided in report, from which to retrieve the value. This parameter must be one of the following: kHIDInputReport, kHIDOutputReport, or kHIDFeatureReport. + @param usagePage Specifies the usage page of the data to be retrieved. + @param collection Optionally specifies the link collection identifier of the data to be retrieved. + @param usage Specifies the usage identifier of the value to be retrieved. + @param usageValueBuffer Points to a caller-allocated buffer that contains, on output, the data from the device. The correct length for this buffer can be found by multiplying the reportCount and bitSize fields of the HIDValueCaps structure for the value and rounding the resulting value up to the nearest byte. + @param usageValueBufferSize Specifies the size, in bytes, of the buffer in the usageValueBuffer parameter. + @param preparsedDataRef Preparsed data reference for the report that is retuned by the HIDOpenReportDescriptor function + @param report Points to the caller-allocated buffer that contains the device report data. + @param reportLength Specifies the size, in bytes, of the report data provided in report. + @result OSStatus Returns an error code if an error was encountered or noErr on success. + */ + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDGetUsageValueArray (HIDReportType reportType, + HIDUsage usagePage, + UInt32 collection, + HIDUsage usage, + UInt8 * usageValueBuffer, + IOByteCount usageValueBufferSize, + HIDPreparsedDataRef preparsedDataRef, + void * report, + IOByteCount reportLength); + +/*! + @function HIDGetValueCaps + @abstract The HIDGetValueCaps function retrieves the capabilities for all values for a specified top level collection. + @discussion The HIDGetValueCaps function retrieves the capability data for all values in a top level collection without regard for the usage, usage page or collection of the value. To retrieve value capabilities for a specific usage, usage page or collection, use the HIDGetSpecificValueCaps function. + @param reportType Specifies the type of report for which to retrieve the value capabilities. This parameter must be one of the following: kHIDInputReport, kHIDOutputReport, or kHIDFeatureReport. + @param valueCaps On return, points to a caller-allocated buffer that contains an array of HIDValueCaps structures containing information for all values in the top level collection. + @param valueCapsSize On input, specifies the size in array elements of the buffer provided in the valueCaps parameter. On output, this parameter is set to the actual number of elements that were returned in the buffer provided in the valueCaps parameter, if the function completed without error. The correct length necessary to retrieve the value capabilities can be found in the capability data returned for the device by the HIDGetCaps function. + @param preparsedDataRef Preparsed data reference for the report that is retuned by the HIDOpenReportDescriptor function + @result OSStatus Returns an error code if an error was encountered or noErr on success. + */ + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDGetValueCaps (HIDReportType reportType, + HIDValueCapsPtr valueCaps, + UInt32 * valueCapsSize, + HIDPreparsedDataRef preparsedDataRef); + +/*! + @function HIDGetValueCapabilities + @abstract The HIDGetValueCapabilities function retrieves the capabilities for all values for a specified top level collection. + @discussion The HIDGetValueCapabilities function retrieves the capability data for all values in a top level collection without regard for the usage, usage page or collection of the value. To retrieve value capabilities for a specific usage, usage page or collection, use the HIDGetSpecificValueCapabilities function. + @param reportType Specifies the type of report for which to retrieve the value capabilities. This parameter must be one of the following: kHIDInputReport, kHIDOutputReport, or kHIDFeatureReport. + @param valueCaps On return, points to a caller-allocated buffer that contains an array of HIDValueCapabilities structures containing information for all values in the top level collection. + @param valueCapsSize On input, specifies the size in array elements of the buffer provided in the valueCaps parameter. On output, this parameter is set to the actual number of elements that were returned in the buffer provided in the valueCaps parameter, if the function completed without error. The correct length necessary to retrieve the value capabilities can be found in the capability data returned for the device by the HIDGetCapabilities function. + @param preparsedDataRef Preparsed data reference for the report that is retuned by the HIDOpenReportDescriptor function + @result OSStatus Returns an error code if an error was encountered or noErr on success. + */ + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDGetValueCapabilities (HIDReportType reportType, + HIDValueCapabilitiesPtr valueCaps, + UInt32 * valueCapsSize, + HIDPreparsedDataRef preparsedDataRef); + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDInitReport (HIDReportType reportType, + UInt8 reportID, + HIDPreparsedDataRef preparsedDataRef, + void * report, + IOByteCount reportLength); + +/*! + @function HIDMaxUsageListLength + @abstract The HIDMaxUsageListLength function returns the maximum number of buttons that can be returned from a given report type for the top level collection. + @param reportType Specifies the type of report for which to get a maximum usage count. This parameter must be one of the following: kHIDInputReport, kHIDOutputReport, or kHIDFeatureReport. + @param usagePage Optionally specifies the usage page identifier to use as a search criteria. If this parameter is zero, the function returns the number of buttons for the entire top-level collection regardless of the actual value of the usage page. + @param preparsedDataRef Preparsed data reference for the report that is retuned by the HIDOpenReportDescriptor function + @result OSStatus Returns an error code if an error was encountered or noErr on success. + */ + +__iohid_deprecated("Use DriverKit") +extern +UInt32 +HIDMaxUsageListLength (HIDReportType reportType, + HIDUsage usagePage, + HIDPreparsedDataRef preparsedDataRef); + +/*! + @function HIDSetScaledUsageValue + @abstract The HIDSetScaledUsageValue function takes a signed physical (scaled) number and converts it to the logical, or device representation and inserts it in a given report. + @discussion The HIDSetScaledUsageValue function automatically handles the setting of the signed bit in the data to be sent to the device. + @param reportType Specifies the type of report. This parameter must be one of the following: kHIDInputReport, kHIDOutputReport, or kHIDFeatureReport. + @param usagePage Specifies the usage page identifier of the value to be set in the report. + @param collection Optionally specifies the link collection identifier to distinguish between values that have the same usage page and usage identifiers. If this parameter is zero, it will be ignored. + @param usage Specifies the usage identifier of the value to be set in the report. + @param usageValue Specifies the physical, or scaled, value to be set in the value for the given report. + @param preparsedDataRef Preparsed data reference for the report that is retuned by the HIDOpenReportDescriptor function + @param report Points to the caller-allocated buffer that contains the device report data. + @param reportLength Specifies the length, in bytes of the report data specified in the report parameter. + @result OSStatus Returns an error code if an error was encountered or noErr on success. + */ + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDSetScaledUsageValue (HIDReportType reportType, + HIDUsage usagePage, + UInt32 collection, + HIDUsage usage, + SInt32 usageValue, + HIDPreparsedDataRef preparsedDataRef, + void * report, + IOByteCount reportLength); + +/*! + @function HIDSetButtons + @abstract The HIDSetButtons function takes a report from a HID device and returns the current state of the buttons in that report. + @param reportType Specifies the type of repor. This parameter must be one of the following: kHIDInputReport, kHIDOutputReport, or kHIDFeatureReport. + @param usagePage Specifies the usage page identifier of the value to be set in the report. + @param collection Optionally specifies the link collection identifier to distinguish between buttons. If this parameter is zero, it is ignored. + @param usageList Points to a caller-allocated buffer that contains an array of button data to be set in the report in the report parameter. + @param usageListSize Specifies the size, in array elements, of the buffer provided in the usageList parameter. If an error is returned by a call to this function, the usageListLength parameter contains the location in the array provided in the usageList parameter where the error was encountered. All array entries encountered prior to the error location were successfully set in the report provided in the report parameter. + @param preparsedDataRef Preparsed data reference for the report that is retuned by the HIDOpenReportDescriptor function + @param report Points to the caller-allocated buffer that contains the device report data. + @param reportLength Specifies the size, in bytes, of the report data provided in the report parameter. + @result OSStatus Returns an error code if an error was encountered or noErr on success. + */ + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDSetButtons (HIDReportType reportType, + HIDUsage usagePage, + UInt32 collection, + HIDUsage * usageList, + UInt32 * usageListSize, + HIDPreparsedDataRef preparsedDataRef, + void * report, + IOByteCount reportLength); + +/*! + @function HIDSetUsageValue + @abstract The HIDSetUsageValue function sets a value in a give report. + @discussion The HIDSetUsageVlaue function does not automatically handle the sign bit. Clients must either manually set the sign bit, at the position provided in the HIDValueCaps structure for this value, or call the HIDSetScaledUsageValue function. + @param reportType Specifies the type of report. This parameter must be one of the following: kHIDInputReport, kHIDOutputReport, or kHIDFeatureReport. + @param usagePage Specifies the usage page identifier of the value to be set in the report. + @param collection Optionally specifies the link collection identifier to distinguish between values that have the same usage page and usage identifiers. If this parameter is zero, it is ignored. + @param usage Specifies the usage identifier of the value to be set in the report. + @param usageValue Specifies the data that is to be set in the value for the given report. + @param preparsedDataRef Preparsed data reference for the report that is retuned by the HIDOpenReportDescriptor function + @param report Points to the caller-allocated buffer that contains the device report data. + @param reportLength Specifies the size, in bytes, of the report data provided in the report parameter. + @result OSStatus Returns an error code if an error was encountered or noErr on success. + */ + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDSetUsageValue (HIDReportType reportType, + HIDUsage usagePage, + UInt32 collection, + HIDUsage usage, + SInt32 usageValue, + HIDPreparsedDataRef preparsedDataRef, + void * report, + IOByteCount reportLength); + +/*! + @function HIDSetUsageValueArray + @abstract The HIDSetUsageValueArray function sets an array of values in a given report. + @discussion The HIDSetUsageValue function does not automatically handle the sign bit. Clients must either manually set the sign bit, at the position provided in the HIDValueCaps structure for this value, or call the HIDSetScaledUsageValue function. + @param reportType Specifies the type of report. This parameter must be one of the following: kHIDInputReport, kHIDOutputReport, or kHIDFeatureReport. + @param usagePage Specifies the usage page identifier of the value to be set in the report. + @param collection Optionally specifies the link collection identifier to distinguish between values that have the same usage page and usage identifiers. If this parameter is zero, it is ignored. + @param usage Specifies the usage identifier of the value to be set in the report. + @param usageValueBuffer Points to a caller-allocated buffer that contains, on output, the data from the device. The correct length for this buffer can be found by multiplying the reportCount and bitSize fields of the HIDValueCaps structure for this value and rounding the resulting value up to the nearest byte. + @param usageValueBufferLength Specifies the size, in bytes, of the buffer in the usageValueBuffer parameter. + @param preparsedDataRef Preparsed data reference for the report that is retuned by the HIDOpenReportDescriptor function + @param report Points to the caller-allocated buffer that contains the device report data. + @param reportLength Specifies the size, in bytes, of the report data provided in the report parameter. + @result OSStatus Returns an error code if an error was encountered or noErr on success. + */ + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDSetUsageValueArray (HIDReportType reportType, + HIDUsage usagePage, + UInt32 collection, + HIDUsage usage, + UInt8 * usageValueBuffer, + IOByteCount usageValueBufferLength, + HIDPreparsedDataRef preparsedDataRef, + void * report, + IOByteCount reportLength); + +/*! + @function HIDUsageListDifference + @abstract The HIDUsageListDifference function compares and provides the differences between two lists of buttons. + @param previousUsageList Points to the older button list to be used for comparison. + @param currentUsageList Points to the newer button list to be used for comparison. + @param breakUsageList On return, points to a caller-allocated buffer that contains the buttons set in the older list, specified in the previousUsageList parameter, but not set in the new list, specified in the currentUsageList parameter. + @param makeUsageList On return, points to a caller-allocated buffer that contains the buttons set in the new list, specified in the currentUsageList parameter, but not set in the old list, specified in the previousUsageList parameter. + @param usageListsSize Specifies the length, in array elements, of the buffers provided in the currentUsageList and previousUssageList parameters. + @result OSStatus Returns an error code if an error was encountered or noErr on success. + */ + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDUsageListDifference (HIDUsage * previousUsageList, + HIDUsage * currentUsageList, + HIDUsage * breakUsageList, + HIDUsage * makeUsageList, + UInt32 usageListsSize); + +/*! + @function HIDSetButton + @abstract The HIDSetButton function takes a report from a HID device and sets the current state of the specified button in that report. + @param reportType Specifies the type of report. This parameter must be one of the following: kHIDInputReport, kHIDOutputReport, or kHIDFeatureReport. + @param usagePage Specifies the usage page identifier of the value to be set in the report. + @param collection Optionally specifies the link collection identifier to distinguish between buttons. If this parameter is zero, it is ignored. + @param usage Points to a caller-allocated buffer that contains the button data to be set in the report in the report parameter. + @param preparsedDataRef Preparsed data reference for the report that is retuned by the HIDOpenReportDescriptor function + @param report Points to the caller-allocated buffer that contains the device report data. + @param reportLength Specifies the size, in bytes, of the report data provided in the report parameter. + @result OSStatus Returns an error code if an error was encountered or noErr on success. + */ + +__iohid_deprecated("Use DriverKit") +extern +OSStatus +HIDSetButton (HIDReportType reportType, + HIDUsage usagePage, + UInt32 collection, + HIDUsage usage, + HIDPreparsedDataRef preparsedDataRef, + void * report, + IOByteCount reportLength); + + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/QualcommWireless/include/IOKit/hidsystem/IOHIDParameter.h b/QualcommWireless/include/IOKit/hidsystem/IOHIDParameter.h new file mode 100644 index 0000000..c805123 --- /dev/null +++ b/QualcommWireless/include/IOKit/hidsystem/IOHIDParameter.h @@ -0,0 +1,349 @@ +/* + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* Copyright (c) 1992 NeXT Computer, Inc. All rights reserved. + * + * evsio.h - Get/Set parameter calls for Event Status Driver. + * + * CAUTION: Developers should stick to the API exported in + * to guarantee + * binary compatability of their applications in future + * releases. + * + * HISTORY + * 22 May 1992 Mike Paquette at NeXT + * Created. + */ +#ifndef _DEV_EVSIO_H +#define _DEV_EVSIO_H + +/* Public type definitions. */ +#include +#include +#include + +/* + * Identify this driver as one that uses the new driverkit and messaging API + */ +#ifndef _NeXT_MACH_EVENT_DRIVER_ +#define _NeXT_MACH_EVENT_DRIVER_ (1) +#endif /* !_NeXT_MACH_EVENT_DRIVER_ */ + +/* * */ + +#define kIOHIDKindKey "HIDKind" +#define kIOHIDInterfaceIDKey "HIDInterfaceID" +#define kIOHIDSubinterfaceIDKey "HIDSubinterfaceID" +#define kIOHIDOriginalSubinterfaceIDKey "HIDOriginalSubinterfaceID" + +#define kIOHIDParametersKey "HIDParameters" + +#define kIOHIDVirtualHIDevice "HIDVirtualDevice" + +#define kIOHIDKeyRepeatKey "HIDKeyRepeat" +#define kIOHIDInitialKeyRepeatKey "HIDInitialKeyRepeat" +#define kIOHIDKeyMappingKey "HIDKeyMapping" +#define kIOHIDResetKeyboardKey "HIDResetKeyboard" + +#define kIOHIDKeyboardModifierMappingPairsKey "HIDKeyboardModifierMappingPairs" +#define kIOHIDKeyboardModifierMappingSrcKey "HIDKeyboardModifierMappingSrc" +#define kIOHIDKeyboardModifierMappingDstKey "HIDKeyboardModifierMappingDst" + +#define kIOHIDKeyboardCapsLockDoesLockKey "HIDKeyboardCapsLockDoesLock" +#define kIOHIDKeyboardSupportsF12EjectKey "HIDKeyboardSupportsF12Eject" +#define kIOHIDKeyboardSupportedModifiersKey "HIDKeyboardSupportedModifiers" +#define kIOHIDKeyboardGlobalModifiersKey "HIDKeyboardGlobalModifiers" + + +//read only property that specify usage of clobal modifiers +// Bit[0] - Report modifiers to the service by setting kIOHIDKeyboardGlobalModifiersKey with global modifiers +// Bit[1] - Update/translate events from service taking global modifiers state in consideration +#define kIOHIDServiceGlobalModifiersUsageKey "HIDServiceGlobalModifiersUsage" + + +#define kIOHIDPointerResolutionKey "HIDPointerResolution" +#define kIOHIDResetPointerKey "HIDResetPointer" +#define kIOHIDPointerConvertAbsoluteKey "HIDPointerConvertAbsolute" +#define kIOHIDPointerContactToMoveKey "HIDPointerContactToMove" +#define kIOHIDPointerPressureToClickKey "HIDPointerPressureToClick" +#define kIOHIDPointerButtonCountKey "HIDPointerButtonCount" + +#define kIOHIDPointerAccelerationSettingsKey "HIDPointerAccelerationSettings" +#define kIOHIDPointerAccelerationTableKey "HIDPointerAccelerationTable" + +// velocity for pointer acceleration +#define kIOHIDPointerAccelerationMultiplierKey "HIDPointerAccelerationMultiplier" + + +#define kIOHIDScrollResetKey "HIDScrollReset" +#define kIOHIDScrollResolutionKey "HIDScrollResolution" +#define kIOHIDScrollReportRateKey "HIDScrollReportRate" +#define kIOHIDScrollAccelerationTableKey "HIDScrollAccelerationTable" + +#define kIOHIDScrollResolutionXKey "HIDScrollResolutionX" +#define kIOHIDScrollResolutionYKey "HIDScrollResolutionY" +#define kIOHIDScrollResolutionZKey "HIDScrollResolutionZ" + +#define kIOHIDScrollAccelerationTableXKey "HIDScrollAccelerationTableX" +#define kIOHIDScrollAccelerationTableYKey "HIDScrollAccelerationTableY" +#define kIOHIDScrollAccelerationTableZKey "HIDScrollAccelerationTableZ" + +#define kIOHIDScrollMouseButtonKey "HIDScrollMouseButton" + +#define kIOHIDScrollZoomModifierMaskKey "HIDScrollZoomModifierMask" + +#define kIOHIDTrackpadScrollAccelerationKey "HIDTrackpadScrollAcceleration" + +#define kIOHIDTrackpadAccelerationType "HIDTrackpadAcceleration" + +#define kIOHIDClickTimeKey "HIDClickTime" +#define kIOHIDClickSpaceKey "HIDClickSpace" + +#define kIOHIDWaitCursorFrameIntervalKey "HIDWaitCursorFrameInterval" + +#define kIOHIDAutoDimThresholdKey "HIDAutoDimThreshold" +#define kIOHIDAutoDimStateKey "HIDAutoDimState" +#define kIOHIDAutoDimTimeKey "HIDAutoDimTime" +#define kIOHIDIdleTimeKey "HIDIdleTime" + +#define kIOHIDBrightnessKey "HIDBrightness" +#define kIOHIDAutoDimBrightnessKey "HIDAutoDimBrightness" + +#define kIOHIDFKeyModeKey "HIDFKeyMode" + +// if kIOHIDStickyKeysDisabledKey is 1, then all sticky keys functionality +// is completely turned off. Multiple shifts will have no effect. +#define kIOHIDStickyKeysDisabledKey "HIDStickyKeysDisabled" + +// if kIOHIDStickyKeysOnKey is 1 then a depressed modifier will stay down +// until a non-modifer key is pressed (or sticky keys is turned off) +#define kIOHIDStickyKeysOnKey "HIDStickyKeysOn" + +// if kIOHIDStickyKeysShiftTogglesKey is 1, then a sequence of five +// shift keys in sequence will toggle sticky keys on or off +#define kIOHIDStickyKeysShiftTogglesKey "HIDStickyKeysShiftToggles" + +// +// +#define kIOHIDResetStickyKeyNotification "HIDResetStickyKeyNotification" + +// if kIOHIDMouseKeysOptionTogglesKey is 1, then a sequence of five +// option keys in sequence will toggle mouse keys on or off +#define kIOHIDMouseKeysOptionTogglesKey "HIDMouseKeysOptionToggles" + +// kIOHIDSlowKeysDelayKey represents the delay used for slow keys. +// if kIOHIDSlowKeysDelayKey is 0, then slow keys off +#define kIOHIDSlowKeysDelayKey "HIDSlowKeysDelay" + +#define kIOHIDF12EjectDelayKey "HIDF12EjectDelay" + +#define kIOHIDMouseKeysOnKey "HIDMouseKeysOn" + +#define kIOHIDUseKeyswitchKey "HIDUseKeyswitch" + +#define kIOHIDDisallowRemappingOfPrimaryClickKey "HIDDisallowRemappingOfPrimaryClick" +#define kIOHIDMouseKeysEnablesVirtualNumPadKey "HIDMouseKeysEnablesVirtualNumPad" + +#define kIOHIDResetLEDsKey "HIDResetLEDs" + +// Parametric Acceleration Keys +#define kHIDAccelParametricCurvesKey "HIDAccelCurves" +#define kHIDPointerReportRateKey "HIDPointerReportRate" +#define kHIDTrackingAccelParametricCurvesKey "HIDTrackingAccelCurves" +#define kHIDScrollAccelParametricCurvesKey "HIDScrollAccelCurves" +#define kHIDAccelParametricCurvesDebugKey "HIDAccelCurvesDebug" +#define kHIDScrollAccelParametricCurvesDebugKey "HIDScrollAccelCurvesDebug" +#define kHIDAccelGainLinearKey "HIDAccelGainLinear" +#define kHIDAccelGainParabolicKey "HIDAccelGainParabolic" +#define kHIDAccelGainCubicKey "HIDAccelGainCubic" +#define kHIDAccelGainQuarticKey "HIDAccelGainQuartic" +#define kHIDAccelTangentSpeedLinearKey "HIDAccelTangentSpeedLinear" +#define kHIDAccelTangentSpeedParabolicRootKey "HIDAccelTangentSpeedParabolicRoot" +#define kHIDAccelTangentSpeedCubicRootKey "HIDAccelTangentSpeedCubicRoot" +#define kHIDAccelTangentSpeedQuarticRootKey "HIDAccelTangentSpeedQuarticRoot" +#define kHIDAccelIndexKey "HIDAccelIndex" + +// Scroll Count Keys +#define kIOHIDScrollCountMaxTimeDeltaBetweenKey "HIDScrollCountMaxTimeDeltaBetween" +#define kIOHIDScrollCountMaxTimeDeltaToSustainKey "HIDScrollCountMaxTimeDeltaToSustain" +#define kIOHIDScrollCountMinDeltaToStartKey "HIDScrollCountMinDeltaToStart" +#define kIOHIDScrollCountMinDeltaToSustainKey "HIDScrollCountMinDeltaToSustain" +#define kIOHIDScrollCountIgnoreMomentumScrollsKey "HIDScrollCountIgnoreMomentumScrolls" +#define kIOHIDScrollCountMouseCanResetKey "HIDScrollCountMouseCanReset" +#define kIOHIDScrollCountMaxKey "HIDScrollCountMax" +#define kIOHIDScrollCountAccelerationFactorKey "HIDScrollCountAccelerationFactor" +#define kIOHIDScrollCountZeroKey "HIDScrollCountZero" +#define kIOHIDScrollCountBootDefaultKey "HIDScrollCountBootDefault" +#define kIOHIDScrollCountResetKey "HIDScrollCountReset" + +// HIDSystem Property Key + +// Mark user activity state on HID System +#define kIOHIDActivityUserIdleKey "IOHIDActivityUserIdle" + +// the following values are used in kIOHIDPointerButtonMode +typedef enum { + kIOHIDButtonMode_BothLeftClicks = 0, + kIOHIDButtonMode_ReverseLeftRightClicks = 1, + kIOHIDButtonMode_EnableRightClick = 2 +} IOHIDButtonModes; + +#ifdef _undef +#define EVS_PREFIX "Evs_" /* All EVS calls start with this string */ + +/* WaitCursor-related ioctls */ + +#define EVSIOSWT "Evs_SetWaitThreshold" +#define EVSIOSWT_SIZE EVS_PACKED_TIME_SIZE + +#define EVSIOSWS "Evs_SetWaitSustain" +#define EVSIOSWS_SIZE EVS_PACKED_TIME_SIZE + +#define EVSIOSWFI "Evs_SetWaitFrameInterval" +#define EVSIOSWFI_SIZE EVS_PACKED_TIME_SIZE + +#define EVSIOCWINFO "Evs_CurrentWaitCursorInfo" +#define EVSIOCWINFO_THRESH 0 +#define EVSIOCWINFO_SUSTAIN (EVSIOCWINFO_THRESH + EVS_PACKED_TIME_SIZE) +#define EVSIOCWINFO_FINTERVAL (EVSIOCWINFO_SUSTAIN + EVS_PACKED_TIME_SIZE) +#define EVSIOCWINFO_SIZE (EVSIOCWINFO_FINTERVAL + EVS_PACKED_TIME_SIZE) +#endif + +#define EVS_PACKED_TIME_SIZE (sizeof(UInt64) / sizeof( unsigned int)) + +/* Device control ioctls. Levels specified may be in the range 0 - 64. */ + +#define EVSIOSB kIOHIDBrightnessKey +#define EVSIOSB_SIZE 1 + +#define EVSIOSADB kIOHIDAutoDimBrightnessKey +#define EVSIOSADB_SIZE 1 + +#ifdef _undef +#define EVSIOSA "Evs_SetAttenuation" +#define EVIOSA_SIZE 1 + +#define EVSIO_DCTLINFO "Evs_DeviceControlInfo" +typedef enum { + EVSIO_DCTLINFO_BRIGHT, + EVSIO_DCTLINFO_ATTEN, + EVSIO_DCTLINFO_AUTODIMBRIGHT +} evsio_DCTLINFOIndices; +#define EVSIO_DCTLINFO_SIZE (EVSIO_DCTLINFO_AUTODIMBRIGHT + 1) +#endif + +/* + * Device status request + */ +#define EVSIOINFO NX_EVS_DEVICE_INFO + + +/* Keyboard-related ioctls - implemented within Event Sources */ + +#define EVSIOSKR kIOHIDKeyRepeatKey +#define EVSIOSKR_SIZE EVS_PACKED_TIME_SIZE + +#define EVSIOSIKR kIOHIDInitialKeyRepeatKey +#define EVSIOSIKR_SIZE EVS_PACKED_TIME_SIZE + +#define EVSIORKBD kIOHIDResetKeyboardKey +#define EVSIORKBD_SIZE 1 + +#define EVSIOCKR_SIZE EVS_PACKED_TIME_SIZE + +#define EVSIOCKML kIOHIDKeyMappingKey +#define EVSIOCKML_SIZE 1 + +/* The following two tokens are for use with the get/set character routines. */ +#define EVSIOSKM kIOHIDKeyMappingKey +#define EVSIOSKM_SIZE 4096 + +#define EVSIOCKM kIOHIDKeyMappingKey +#define EVSIOCKM_SIZE 4096 + +/* Mouse-related ioctls - implemented within Event Sources */ + +#define EVSIOSMS kIOHIDPointerAccelerationKey +#define EVSIOSMS_SIZE (1) + +#define EVSIOCMS kIOHIDPointerAccelerationKey +#define EVSIOCMS_SIZE (1) + +#ifdef _undef +#define EVSIOSMH "Evs_SetMouseHandedness" +#define EVSIOSMH_SIZE 1 // value from NXMouseButton enum + +#define EVSIOCMH "Evs_CurrentMouseHandedness" +#define EVSIOCMH_SIZE 1 +#endif + +/* Generic pointer device controls, implemented by the Event Driver. */ +#define EVSIOSCT kIOHIDClickTimeKey +#define EVSIOSCT_SIZE EVS_PACKED_TIME_SIZE + +#define EVSIOSCS kIOHIDClickSpaceKey +typedef enum { + EVSIOSCS_X, + EVSIOSCS_Y +} evsioEVSIOSCSIndices; +#define EVSIOSCS_SIZE (EVSIOSCS_Y + 1) + +#define EVSIOSADT kIOHIDAutoDimThresholdKey +#define EVSIOSADT_SIZE EVS_PACKED_TIME_SIZE + +#define EVSIOSADS kIOHIDAutoDimStateKey +#define EVSIOSADS_SIZE 1 + +#define EVSIORMS kIOHIDResetPointerKey +#define EVSIORMS_SIZE 1 + +#define EVSIOCCT kIOHIDClickTimeKey +#define EVSIOCCT_SIZE EVS_PACKED_TIME_SIZE + +#define EVSIOCADT kIOHIDAutoDimThresholdKey +#define EVSIOCADT_SIZE EVS_PACKED_TIME_SIZE + +#define EVSIOGDADT kIOHIDAutoDimTimeKey +#define EVSIOGDADT_SIZE EVS_PACKED_TIME_SIZE + +#define EVSIOIDLE kIOHIDIdleTimeKey +#define EVSIOIDLE_SIZE EVS_PACKED_TIME_SIZE + +#define EVSIOCCS kIOHIDClickSpaceKey +typedef enum { + EVSIOCCS_X, + EVSIOCCS_Y +} evsioEVSIOCCSIndices; +#define EVSIOCCS_SIZE (EVSIOCCS_Y + 1) + +#define EVSIOCADS kIOHIDAutoDimStateKey +#define EVSIOCADS_SIZE 1 + +enum { + // Selectors for IOHIDGetModifierLockState and IOHIDSetModifierLockState + kIOHIDCapsLockState = 0x00000001, + kIOHIDNumLockState = 0x00000002, + kIOHIDActivityUserIdle = 0x00000003, + kIOHIDActivityDisplayOn = 0x00000004, +}; + +#endif /* !_DEV_EVSIO_H */ diff --git a/QualcommWireless/include/IOKit/hidsystem/IOHIDShared.h b/QualcommWireless/include/IOKit/hidsystem/IOHIDShared.h new file mode 100644 index 0000000..7ac20b1 --- /dev/null +++ b/QualcommWireless/include/IOKit/hidsystem/IOHIDShared.h @@ -0,0 +1,291 @@ +/* + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 1999-2011 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _DEV_EVIO_H +#define _DEV_EVIO_H + +#include + +__BEGIN_DECLS + +#if KERNEL +#include +#else /* !KERNEL */ +#include +#include +#endif /* KERNEL */ + +#include +#include +#include +#include + +/* + * Identify this driver as one that uses the new driverkit and messaging API + */ +#ifndef _NeXT_MACH_EVENT_DRIVER_ +#define _NeXT_MACH_EVENT_DRIVER_ (1) +#endif /* _NeXT_MACH_EVENT_DRIVER_ */ + + +/* Pressure Constants */ +#define MINPRESSURE EV_MINPRESSURE +#define MAXPRESSURE EV_MAXPRESSURE + +#define LLEQSIZE 240 /* Entries in low-level event queue */ + +typedef struct _NXEQElStruct { + int next; /* Slot of lleq for next event */ + OSSpinLock sema; /* Is high-level code reading this event now? */ + NXEvent event; /* The event itself */ +} NXEQElement; + +/****************************************************************************** + SHARED MEMORY OVERVIEW + + PERSPECTIVE + The ev driver and PostScript share at least one page of wired memory. + This memory contains the low-level event queue which ev deposits events + into and PostScript reads events from. Also, this memory contains other + important data such as wait cursor state and some general cursor state. + This memory is critical for speed. That is, we avoid having to make + system calls for common operations. + + SHARED MEMORY REGIONS + There are currently three "regions" or "zones" delineated within this + shared memory. The first zone is the EvOffsets structure. This structure + contains two offsets from the beginning of shared memory. The first offset + is to the second zone, EvGlobals. The second offset is to the third + zone, private shmem for drivers. + + INITIALIZATION OF SHARED MEMORY + When the WindowServer starts up, it finds all screens that will be active. + It then opens the ev driver and calls the EVIOSSCR ioctl repeatedly for + each screen in use. This lets the ev driver set up the evScreen array + and fill in each element. This ioctl also returns to PostScript a running + total shared memory size with which to allocate. PostScript then allocates + a region of memory this size and calls evmmap to "map in" this shared + region. Evmmap initializes and fills in the EvOffsets and EvGlobals. + Next the WindowServer calls each screen in turn to register itself with + the ev driver in the same sequence as presented to EVIOSSCR. Each screen + driver calls ev_register_screen() which among other things allocates a + part of the private shmem (of the third shared memory zone) for the driver. + + DEBUGGING NOTES + You can easily display and set this shared memory from kgdb, but usually + cannot do so from within PostScript. Gdb (or some weird interaction + between gdb and the os) chokes on this shmem. So if you read or write + this area of memory, copy-on-write will occur and you'll get a completely + new page for PostScript. This will render the shared memory scheme + useless and you will have to restart PostScript. It was my understanding + that before, we were able to "read" this area from PS, but not write to + it (the idea behind copy-on-WRITE). However, this seems to be broken + in 2.0. We think this is a kernel bug. +******************************************************************************/ + +typedef volatile struct _evOffsets { + int evGlobalsOffset; /* Offset to EvGlobals structure */ + int evShmemOffset; /* Offset to private shmem regions */ +} EvOffsets; + +/****************************************************************************** + EvGlobals + This structures defines the portion of the events driver data structure + that is exported to the PostScript server. It contains the event queue + which is in memory shared between the driver and the PostScript server. + All the variables necessary to read and process events from the queue are + contained here. +******************************************************************************/ + +typedef volatile struct _evGlobals { + OSSpinLock cursorSema; /* set to disable periodic code */ + int eNum; /* Unique id for mouse events */ + int buttons; /* State of the mouse buttons 1==down, 0==up */ + int eventFlags; /* The current value of event.flags */ + int VertRetraceClock; /* The current value of event.time */ + IOGPoint cursorLoc; /* The current location of the cursor, in desktop coordinates */ + int frame; /* current cursor frame */ + IOGBounds workBounds; /* bounding box of all screens */ + IOGBounds mouseRect; /* Rect for mouse-exited events */ + int version; /* for run time checks */ + int structSize; /* for run time checks */ + int lastFrame; + /* The current location of the cursor, 24.8 bit fixed point format */ + IOFixedPoint32 screenCursorFixed; /* in Screen coordinates */ + IOFixedPoint32 desktopCursorFixed;/* in Desktop coordinates */ + unsigned int reservedA[27]; + + unsigned reserved:25; + unsigned updateCursorPositionFromFixed:1; /* if this is set, IOHIDSystem will take any cursor position updates from desktopCursorFixed instead of cursorLoc */ + unsigned logCursorUpdates:1; /* log cursor updates */ + unsigned wantPressure:1; /* pressure in current mouseRect? */ + unsigned wantPrecision:1; /* precise coordinates in current mouseRect? */ + unsigned dontWantCoalesce:1; /* coalesce within the current mouseRect? */ + unsigned dontCoalesce:1; /* actual flag which determines coalescing */ + unsigned mouseRectValid:1; /* If nonzero, post a mouse-exited whenever mouse outside mouseRect. */ + int movedMask; /* This contains an event mask for the three events MOUSEMOVED, + LMOUSEDRAGGED, and RMOUSEDRAGGED. It says whether driver should + generate those events. */ + OSSpinLock waitCursorSema; /* protects wait cursor fields */ + int AALastEventSent; /* timestamp for wait cursor */ + int AALastEventConsumed; /* timestamp for wait cursor */ + int waitCursorUp; /* Is wait cursor up? */ + char ctxtTimedOut; /* Has wait cursor timer expired? */ + char waitCursorEnabled; /* Play wait cursor game (per ctxt)? */ + char globalWaitCursorEnabled; /* Play wait cursor game (global)? */ + int waitThreshold; /* time before wait cursor appears */ + + int LLEHead; /* The next event to be read */ + int LLETail; /* Where the next event will go */ + int LLELast; /* The last event entered */ + NXEQElement lleq[LLEQSIZE]; /* The event queue itself */ +} EvGlobals; + +/* These evio structs are used in various calls supported by the ev driver. */ + +struct evioLLEvent { + int setCursor; + int type; + IOGPoint location; + NXEventData data; + int setFlags; + int flags; +}; + +typedef struct evioLLEvent _NXLLEvent; + +#ifdef mach3xxx + +/* + * On a keypress of a VOL UP or VOL DOWN key, we send a message to the + * sound server to notify it of the volume change. The message includes + * a flag to indicate which key was pressed, and the machine independant + * flag bits to indicate which modifier keys were pressed. + */ + +struct evioSpecialKeyMsg +{ + msg_header_t Head; + msg_type_t keyType; + int key; // special key number, from bsd/dev/ev_keymap.h + msg_type_t directionType; + int direction; // NX_KEYDOWN, NX_KEYUP from event.h + msg_type_t flagsType; + int flags; // device independant flags from event.h + msg_type_t levelType; + int level; // EV_AUDIO_MIN_VOLUME to EV_AUDIO_MAX_VOLUME +}; +#else +struct evioSpecialKeyMsg +{ + mach_msg_header_t Head; + int key; // special key number, from bsd/dev/ev_keymap.h + int direction; // NX_KEYDOWN, NX_KEYUP from event.h + int flags; // device independant flags from event.h + int level; // EV_AUDIO_MIN_VOLUME to EV_AUDIO_MAX_VOLUME +}; +#endif + +#define EV_SPECIAL_KEY_MSG_ID (('S'<<24) | ('k'<<16) | ('e'<<8) | ('y')) +typedef struct evioSpecialKeyMsg *evioSpecialKeyMsg_t; + +/* + * Volume ranges + */ +#define EV_AUDIO_MIN_VOLUME 0 +#define EV_AUDIO_MAX_VOLUME 64 + +#define kIOHIDSystemClass "IOHIDSystem" +#define kIOHIKeyboardClass "IOHIKeyboard" +#define kIOHIPointingClass "IOHIPointing" + +#define IOHIDSYSTEM_CONFORMSTO kIOHIDSystemClass + +enum { + kIOHIDEventNotification = 0, +}; +#define kIOHIDCurrentShmemVersion 4 +#define kIOHIDLastCompatibleShmemVersion 3 + +enum { + kIOHIDServerConnectType = 0, + kIOHIDParamConnectType = 1, + kIOHIDEventSystemConnectType = 3, +}; + +enum { + kIOHIDGlobalMemory = 0 +}; + +enum { + kIOHIDEventQueueTypeKernel = 0, + kIOHIDEventQueueTypeUser = 1 +}; + +#ifdef KERNEL +typedef UInt16 (*MasterVolumeUpdate)(void); +typedef bool (*MasterMuteUpdate)(void); + +typedef struct { + MasterVolumeUpdate incrementMasterVolume; + MasterVolumeUpdate decrementMasterVolume; + MasterMuteUpdate toggleMasterMute; +} MasterAudioFunctions; + +extern MasterAudioFunctions *masterAudioFunctions; +#endif + +#ifndef KERNEL +#ifndef _IOKIT_IOHIDLIB_H +#include +#endif +#endif /* !KERNEL */ + + + +enum { + /*! + @defined kIOHIDOpenedByEventSystem + @abstract option passed to open for IOHIDInterface if opened by IOHIDEventDriver + */ + kIOHIDOpenedByEventSystem = 0x10000, + /*! + @defined kIOHIDOpenedByFastPathClient + @abstract option passed to open for IOHIDEventService if opened by fast path client + */ + kIOHIDOpenedByFastPathClient = 0x20000 +}; + +// iokit_vendor_specific_msg(1) unused + +/*! + @defined kIOHIDMessageRelayServiceInterfaceActive + @abstract message from IOHIDDevice to indicate that the IOHIDRelayService's USB interface is active. + */ + +#define kIOHIDMessageRelayServiceInterfaceActive iokit_vendor_specific_msg(2) + +__END_DECLS + + +#endif /* !_DEV_EVIO_H */ diff --git a/QualcommWireless/include/IOKit/hidsystem/IOHIDSystem.h b/QualcommWireless/include/IOKit/hidsystem/IOHIDSystem.h new file mode 100644 index 0000000..83616a0 --- /dev/null +++ b/QualcommWireless/include/IOKit/hidsystem/IOHIDSystem.h @@ -0,0 +1,615 @@ +/* + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 1999-2009 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* Copyright (c) 1992 NeXT Computer, Inc. All rights reserved. + * + * EventDriver.h - Exported Interface Event Driver object. + * + * The EventDriver is a pseudo-device driver. + * + * HISTORY + * 19 Mar 1992 Mike Paquette at NeXT + * Created. + * 4 Aug 1993 Erik Kay at NeXT + * API cleanup + */ + +#ifndef _IOHIDSYSTEM_H +#define _IOHIDSYSTEM_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "IOHIDWorkLoop.h" +#if TARGET_OS_IPHONE +class IOGraphicsDevice; +#else +#include +#endif +#include +#include +#include +#include +#include +#include /* For NX_NUM_SCANNED_SPECIALKEYS */ + +// The following messages should be unique across the entire system +#ifndef sub_iokit_hidsystem +#define sub_iokit_hidsystem err_sub(14) +#endif + +#define kIOHIDSystem508MouseClickMessage iokit_family_msg(sub_iokit_hidsystem, 1) +#define kIOHIDSystemDeviceSeizeRequestMessage iokit_family_msg(sub_iokit_hidsystem, 2) +#define kIOHIDSystem508SpecialKeyDownMessage iokit_family_msg(sub_iokit_hidsystem, 3) +// 4 is used by IOHIDSecurePrompt +#define kIOHIDSystemActivityTickle iokit_family_msg(sub_iokit_hidsystem, 5) +#define kIOHIDSystemUserHidActivity iokit_family_msg(sub_iokit_hidsystem, 6) + +class IOHistogramReporter; +class IOHIDKeyboardDevice; +class IOHIDPointingDevice; +class IOHIDEvent; +class IOFixedPoint64; + +class IOHIDSystem : public IOService +{ + OSDeclareDefaultStructors(IOHIDSystem); + + friend class IOHIDUserClient; + friend class IOHIDParamUserClient; + friend class IOHIDEventSystemUserClient; + +private: + IOHIDWorkLoop *workLoop; + IOTimerEventSource *periodicES; + IOInterruptEventSource *keyboardEQES; + IOCommandGate *cmdGate; + IONotifier *publishNotify; + void *eventMsg; // Msg to be sent to Window Server. + void *stackShotMsg; // Msg to be sent to Stack Shot. + + // Shared memory area information + IOBufferMemoryDescriptor * globalMemory; + uintptr_t shmem_addr; // kernel address of shared memory + vm_size_t shmem_size; // size of shared memory + + // Pointers to structures which occupy the shared memory area. + volatile EvGlobals *evg; // Pointer to EvGlobals (shmem) + // Internal variables related to the shared memory area + int lleqSize; // # of entries in low-level queue + // FIXME: why is this ivar lleqSize an ivar? {Dan] + + // Screens list + vm_size_t evScreenSize; // Byte size of evScreen array + void *evScreen; // array of screens known to driver + int screens; // running total of allocated screens + UInt32 cursorScreens; // bit mask of screens with cursor present + UInt32 cursorPinScreen;// a screen to pin against + IOGBounds cursorPin; // Range to which cursor is pinned + // while on this screen. + IOGBounds workSpace; // IOGBounds of full workspace. + // Event Status state - This includes things like event timestamps, + // time til screen dim, and related things manipulated through the + // Event Status API. + // + struct ExpansionData; + ExpansionData *_privateData; + + IOGPoint clickLoc; // location of last mouse click + IOGPoint clickSpaceThresh;// max mouse delta to be a doubleclick + +// int clickState; // Current click state + + bool evOpenCalled; // Has the driver been opened? + bool evInitialized; // Has the first-open-only initialization run? + bool evStateChanging; // Is the event system state changing. + bool eventsOpen; // Boolean: has evmmap been called yet? + bool cursorStarted; // periodic events running? + bool cursorEnabled; // cursor positioning ok? + bool cursorCoupled; // cursor positioning on pointer moves ok? + bool cursorPinned; // cursor positioning on pointer moves ok? + + uint64_t lastUndimEvent; + + struct SetFixedMouseLocData { + uint64_t origTs; + uint64_t callTs; + int32_t x; + int32_t y; + int32_t pid; + } __attribute__((packed)); + + struct Diags { + /* Cursor actions slower than this are tracked for diagnostics */ + static const uint32_t SLOW_CURSOR_MS = 20; + + typedef enum { + kCursorActionShow = 0, + kCursorActionHide, + kCursorActionMove, + + kCursorActionCount + } CursorAction; + + static const char * cursorStrings[kCursorActionCount]; + + uint64_t cursorWorkloopTime; + uint64_t lastActionTimes[kCursorActionCount]; + uint8_t lastCursorActionsMask; + + IOHistogramReporter * cursorTotalHistReporter; + IOHistogramReporter * cursorGraphicsHistReporter; + + } _diags; + + IOService *displayManager; // points to display manager + IOPMPowerFlags displayState; + + + IOService * rootDomain; + AbsoluteTime displayStateChangeDeadline; + AbsoluteTime displaySleepWakeupDeadline; + UInt32 powerState; + + OSDictionary * savedParameters; // keep user settings + + UInt32 maxWaitCursorFrame; // animation frames + UInt32 firstWaitCursorFrame; // + + IOHIDPointingDevice * _hidPointingDevice; + IOHIDKeyboardDevice * _hidKeyboardDevice; + + OSObject * lastSender; + + + bool setParamPropertiesInProgress; + + OSSet * dataQueueSet; + + +private: + + + virtual IOReturn powerStateDidChangeTo( IOPMPowerFlags, unsigned long, IOService * ) APPLE_KEXT_OVERRIDE; + static IOReturn powerStateHandler( void *target, void *refCon, + UInt32 messageType, IOService *service, void *messageArgument, vm_size_t argSize ); + void updatePowerState(UInt32 messageType); + + /* Resets */ + void _setScrollCountParameters(OSDictionary *newSettings = NULL); + + /* Initialize the shared memory area */ + void initShmem(bool clean); + /* Dispatch low level events through shared memory to the WindowServer */ + void postEvent( int what, + /* at */ IOFixedPoint64 * location, + /* atTime */ AbsoluteTime ts, + /* withData */NXEventData * myData, + /* sender */ OSObject * sender = 0, + /* pid */ UInt32 extPID = 0, + /* processKEQ*/bool processKEQ = true, + /* options*/ UInt32 options = 0 + ); + /* Dispatch mechanisms for screen state changes */ + void evDispatch( + /* command */ EvCmd evcmd); + + OSDictionary * createFilteredParamPropertiesForService(IOService * service, OSDictionary * dict); + + static void _periodicEvents(IOHIDSystem * self, + IOTimerEventSource *timer); + + static void doProcessKeyboardEQ(IOHIDSystem * self); + static void processKeyboardEQ(IOHIDSystem * self, AbsoluteTime * deadline = 0); + + void doProcessNotifications(); + + bool genericNotificationHandler(void * ref, IOService * newService, IONotifier * notifier ); + + static bool handlePublishNotification( void * target, IOService * newService ); + static bool handleTerminationNotification( void * target, IOService * newService ); + + static void makeNumberParamProperty( OSDictionary * dict, const char * key, + unsigned long long number, unsigned int bits ); + + static void makeInt32ArrayParamProperty( OSDictionary * dict, const char * key, + UInt32 * array, unsigned int count ); + +/* + * HISTORICAL NOTE: + * The following methods were part of the IOHIDSystem(Input) category; + * the declarations have now been merged directly into this class. + * + * Exported Interface Event Driver object input services. + */ + +private: + // Schedule next periodic run based on current event system state. + void scheduleNextPeriodicEvent(); + // Message invoked to run periodic events. This method runs in the workloop. + void periodicEvents(IOTimerEventSource *timer); + // Start the cursor running. + bool startCursor(); + // Repin cursor location. + bool resetCursor(); + // Wait Cursor machinery. + void showWaitCursor(); + void hideWaitCursor(); + void animateWaitCursor(); + void changeCursor(int frame); + // Return screen number a point lies on. + int pointToScreen(IOGPoint * p); + + inline void showCursor(); + inline void hideCursor(); + inline void moveCursor(); + void enableContinuousCursor(); + void disableContinuousCursor(); + void _onScreenCursorPin(); + + bool registerEventSource(IOService * source); + + // Set abs cursor position. + void setCursorPosition(IOGPoint * newLoc, bool external, OSObject * sender=0); + void _setCursorPosition(bool external = false, bool proximityChange = false, OSObject * sender=0); + + static bool _idleTimeSerializerCallback(void * target, void * ref, OSSerialize *s); + static bool _cursorStateSerializerCallback(void * target, void * ref, OSSerialize *s); + static bool _displaySerializerCallback(void * target, void * ref, OSSerialize *s); + + IOReturn _recordCursorAction(uint64_t origTS, uint64_t entryTS); + + virtual IOReturn configureReport(IOReportChannelList *channels, + IOReportConfigureAction action, + void *result, + void *destination) APPLE_KEXT_OVERRIDE; + virtual IOReturn updateReport(IOReportChannelList *channels, + IOReportUpdateAction action, + void *result, + void *destination) APPLE_KEXT_OVERRIDE; + + void createParameters( void ); + +/* END HISTORICAL NOTE */ + +// void updateUnificationFlags (); + +public: + static IOHIDSystem * instance(); /* Return the current instance of the */ + /* EventDriver, or 0 if none. */ + + virtual bool init(OSDictionary * properties = 0) APPLE_KEXT_OVERRIDE; + virtual IOHIDSystem * probe(IOService * provider, + SInt32 * score) APPLE_KEXT_OVERRIDE; + virtual bool start(IOService * provider) APPLE_KEXT_OVERRIDE; + virtual IOReturn message(UInt32 type, IOService * provider, + void * argument) APPLE_KEXT_OVERRIDE; + virtual void free(void) APPLE_KEXT_OVERRIDE; + virtual bool attach( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void detach( IOService * provider ) APPLE_KEXT_OVERRIDE; + + virtual IOWorkLoop *getWorkLoop(void) const APPLE_KEXT_OVERRIDE; + + virtual IOReturn evOpen(void); + virtual IOReturn evClose(void); + + virtual IOReturn setProperties( OSObject * properties ) APPLE_KEXT_OVERRIDE; + virtual IOReturn setParamProperties(OSDictionary * dict); + + /* Create the shared memory area */ + virtual IOReturn createShmem(void*,void*,void*,void*,void*,void*); + + /* register the IOSharedDataQueue for the new user events */ + virtual IOReturn registerEventQueue(IOSharedDataQueue * queue); + + /* Unregister the IOSharedDataQueue for the new user events */ + virtual IOReturn unregisterEventQueue(IOSharedDataQueue * queue); + +public: + + virtual IOReturn newUserClient(task_t owningTask, + /* withToken */ void * security_id, + /* ofType */ UInt32 type, + /* withProps*/ OSDictionary * properties, + /* client */ IOUserClient ** handler) APPLE_KEXT_OVERRIDE; + +/* + * HISTORICAL NOTE: + * The following methods were part of the IOHIPointingEvents protocol; + * the declarations have now been merged directly into this class. + */ + +public: +/* + * HISTORICAL NOTE: + * The following methods were part of the IOHIKeyboardEvents protocol; + * the declarations have now been merged directly into this class. + */ + +public: + virtual void keyboardEvent(unsigned eventType, + /* flags */ unsigned flags, + /* keyCode */ unsigned key, + /* charCode */ unsigned charCode, + /* charSet */ unsigned charSet, + /* originalCharCode */ unsigned origCharCode, + /* originalCharSet */ unsigned origCharSet, + /* keyboardType */ unsigned keyboardType, + /* repeat */ bool repeat, + /* atTime */ AbsoluteTime ts); + + virtual void keyboardSpecialEvent( unsigned eventType, + /* flags */ unsigned flags, + /* keyCode */ unsigned key, + /* specialty */ unsigned flavor, + /* guid */ UInt64 guid, + /* repeat */ bool repeat, + /* atTime */ AbsoluteTime ts); + + virtual void updateEventFlags(unsigned flags); /* Does not generate events */ + + + + +private: + + static void _keyboardEvent( IOHIDSystem * self, + unsigned eventType, + /* flags */ unsigned flags, + /* keyCode */ unsigned key, + /* charCode */ unsigned charCode, + /* charSet */ unsigned charSet, + /* originalCharCode */ unsigned origCharCode, + /* originalCharSet */ unsigned origCharSet, + /* keyboardType */ unsigned keyboardType, + /* repeat */ bool repeat, + /* atTime */ AbsoluteTime ts, + OSObject * sender, + void * refcon); + + static void _keyboardSpecialEvent(IOHIDSystem * self, + unsigned eventType, + /* flags */ unsigned flags, + /* keyCode */ unsigned key, + /* specialty */ unsigned flavor, + /* guid */ UInt64 guid, + /* repeat */ bool repeat, + /* atTime */ AbsoluteTime ts, + OSObject * sender, + void * refcon); + + static void _updateEventFlags( IOHIDSystem * self, + unsigned flags, + OSObject * sender, + void * refcon); /* Does not generate events */ + + +/* + * HISTORICAL NOTE: + * The following methods were part of the IOUserClient protocol; + * the declarations have now been merged directly into this class. + */ + +public: + + virtual IOReturn setEventsEnable(void*,void*,void*,void*,void*,void*); + virtual IOReturn setCursorEnable(void*,void*,void*,void*,void*,void*); + virtual IOReturn extPostEvent(void*,void*,void*,void*,void*,void*); + virtual IOReturn extSetMouseLocation(void*,void*,void*,void*,void*,void*); + virtual IOReturn extGetButtonEventNum(void*,void*,void*,void*,void*,void*); + + IOReturn extSetBounds(void*,void*,void*,void*,void*,void*); + IOReturn extSetOnScreenBounds(void*,void*,void*,void*,void*,void*); + IOReturn setBounds(IOGBounds * bounds, IOGPoint * screenPoint, bool onScreen); + + IOReturn extGetStateForSelector(void*,void*,void*,void*,void*,void*); + IOReturn extSetStateForSelector(void*,void*,void*,void*,void*,void*); + IOReturn extRegisterVirtualDisplay(void*,void*,void*,void*,void*,void*); + IOReturn extUnregisterVirtualDisplay(void*,void*,void*,void*,void*,void*); + IOReturn extSetVirtualDisplayBounds(void*,void*,void*,void*,void*,void*); + IOReturn extGetUserHidActivityState(void*,void*,void*,void*,void*,void*); + IOReturn setContinuousCursorEnable(void*,void*,void*,void*,void*,void*); +/* + * HISTORICAL NOTE: + * The following methods were part of the IOScreenRegistration protocol; + * the declarations have now been merged directly into this class. + * + * Methods exported by the EventDriver for display systems. + * + * The screenRegister protocol is used by frame buffer drivers to register + * themselves with the Event Driver. These methods are called in response + * to an _IOGetParameterInIntArray() call with "IO_Framebuffer_Register" or + * "IO_Framebuffer_Unregister". + */ + +public: + virtual int registerScreen(IOGraphicsDevice * instance, + /* bounds */ IOGBounds * bp, + /* virtual bounds */ IOGBounds * vbp); +private: + static IOReturn doRegisterScreen(IOHIDSystem *self, IOGraphicsDevice *io_gd, IOGBounds *bp, IOGBounds * vbp, void *arg3); + IOReturn registerScreenGated(IOGraphicsDevice *io_gd, IOGBounds *bp, IOGBounds * vbp, SInt32 *index); +public: + + + virtual void unregisterScreen(int index); + +/* + * HISTORICAL NOTE: + * The following methods were part of the IOWorkspaceBounds protocol; + * the declarations have now been merged directly into this class. + * + * Absolute position input devices and some specialized output devices + * may need to know the bounding rectangle for all attached displays. + * The following method returns a IOGBounds* for the workspace. Please note + * that the bounds are kept as signed values, and that on a multi-display + * system the minx and miny values may very well be negative. + */ + +public: + virtual IOGBounds * workspaceBounds(); + +/* END HISTORICAL NOTES */ + +private: +void keyboardEvent(unsigned eventType, + /* flags */ unsigned flags, + /* keyCode */ unsigned key, + /* charCode */ unsigned charCode, + /* charSet */ unsigned charSet, + /* originalCharCode */ unsigned origCharCode, + /* originalCharSet */ unsigned origCharSet, + /* keyboardType */ unsigned keyboardType, + /* repeat */ bool repeat, + /* atTime */ AbsoluteTime ts, + /* sender */ OSObject * sender); + +void keyboardSpecialEvent( unsigned eventType, + /* flags */ unsigned flags, + /* keyCode */ unsigned key, + /* specialty */ unsigned flavor, + /* guid */ UInt64 guid, + /* repeat */ bool repeat, + /* atTime */ AbsoluteTime ts, + /* sender */ OSObject * sender); + +void updateEventFlags(unsigned flags, OSObject * sender); + + +/* + * COMMAND GATE COMPATIBILITY: + * The following method is part of the work needed to make IOHIDSystem + * compatible with IOCommandGate. The use of IOCommandQueue has been + * deprecated, thus requiring this move. This should allow for less + * context switching as all actions formerly run on the I/O Workloop + * thread, will now be run on the caller thread. The static methods + * will be called from cmdGate->runAction and returns the appropriate + * non-static helper method. Arguments are stored in the void* array, + * args, and are passed through. Since we are returning in the static + * function, gcc3 should translate that to one instruction, thus + * minimizing cost. + */ + +static IOReturn doEvClose (IOHIDSystem *self); + IOReturn evCloseGated (void); + +static IOReturn doUnregisterScreen (IOHIDSystem *self, void * arg0); + IOReturn unregisterScreenGated (int index); + +static IOReturn doSetDisplayBounds (IOHIDSystem *self, void * arg0, void * arg1); + IOReturn setDisplayBoundsGated (UInt32 index, IOGBounds *bounds); + +static IOReturn doCreateShmem (IOHIDSystem *self, void * arg0); + IOReturn createShmemGated (void * p1); + +static IOReturn doRegisterEventQueue (IOHIDSystem *self, void * arg0); + IOReturn registerEventQueueGated (void * p1); + +static IOReturn doUnregisterEventQueue (IOHIDSystem *self, void * arg0); + IOReturn unregisterEventQueueGated (void * p1); + + +static IOReturn doKeyboardEvent (IOHIDSystem *self, void * args); + void keyboardEventGated (unsigned eventType, + unsigned flags, + unsigned key, + unsigned charCode, + unsigned charSet, + unsigned origCharCode, + unsigned origCharSet, + unsigned keyboardType, + bool repeat, + AbsoluteTime ts, + OSObject * sender); + +static IOReturn doKeyboardSpecialEvent (IOHIDSystem *self, void * args); + void keyboardSpecialEventGated ( + unsigned eventType, + unsigned flags, + unsigned key, + unsigned flavor, + UInt64 guid, + bool repeat, + AbsoluteTime ts, + OSObject * sender); + +static IOReturn doUpdateEventFlags (IOHIDSystem *self, void * args); + void updateEventFlagsGated (unsigned flags, OSObject * sender); + +static IOReturn doNewUserClient (IOHIDSystem *self, void * args); + IOReturn newUserClientGated (task_t owningTask, + void * security_id, + UInt32 type, + OSDictionary * properties, + IOUserClient ** handler); + +static IOReturn doSetCursorEnable (IOHIDSystem *self, void * arg0); + IOReturn setCursorEnableGated (void * p1); + +static IOReturn doSetContinuousCursorEnable (IOHIDSystem *self, void * arg0); + IOReturn setContinuousCursorEnableGated (void * p1); + +static IOReturn doExtPostEvent(IOHIDSystem *self, void * arg0, void * arg1, void * arg2, void * arg3); + IOReturn extPostEventGated (void * p1, void * p2, void * p3); + +static IOReturn doExtSetMouseLocation (IOHIDSystem *self, void * args); + IOReturn extSetMouseLocationGated (void * args); + +static IOReturn doExtGetButtonEventNum (IOHIDSystem *self, void * arg0, void * arg1); + IOReturn extGetButtonEventNumGated (void * p1, void * p2); + +static IOReturn doSetParamPropertiesPre (IOHIDSystem *self, void * arg0, void * arg1); + IOReturn setParamPropertiesPreGated (OSDictionary * dict, OSIterator ** pOpenIter); + +static IOReturn doSetParamPropertiesPost (IOHIDSystem *self, void * arg0); + IOReturn setParamPropertiesPostGated (OSDictionary * dict); + + IOReturn updateParamPropertiesGated(IOService * source); + +static IOReturn doExtGetStateForSelector (IOHIDSystem *self, void *p1, void *p2); +static IOReturn doExtSetStateForSelector (IOHIDSystem *self, void *p1, void *p2); + +/* END COMMAND GATE COMPATIBILITY */ + +public: + virtual UInt32 eventFlags(); + virtual void sleepDisplayTickle(); + + virtual void dispatchEvent(IOHIDEvent *event, IOOptionBits options=0); + + void updateHidActivity(); + void hidActivityChecker(); + static void reportUserHidActivity(IOHIDSystem *self, void *args ); + void reportUserHidActivityGated(void *args ); + + static IOReturn getUserHidActivityState(IOHIDSystem *self, void *arg0); + IOReturn getUserHidActivityStateGated(void *state); + +}; + +#endif /* !_IOHIDSYSTEM_H */ diff --git a/QualcommWireless/include/IOKit/hidsystem/IOHIDTypes.h b/QualcommWireless/include/IOKit/hidsystem/IOHIDTypes.h new file mode 100644 index 0000000..c665f9b --- /dev/null +++ b/QualcommWireless/include/IOKit/hidsystem/IOHIDTypes.h @@ -0,0 +1,182 @@ +/* + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/****************************************************************************** + ev_types.h + Data types for the events status driver. + This file contains public API. + mpaque 11Oct91 + + Copyright 1991 NeXT Computer, Inc. + Copyright 1997-2011 Apple, Inc. + + Modified: + +******************************************************************************/ + +#ifndef _DEV_EV_TYPES_H +#define _DEV_EV_TYPES_H + +#include +#include +#include + +// This should be removed, but is being used by others +// IOHIDFamily-355 causes projects to fail to build with 'ev_lock_data_t' does not name a type +#include + +/* Shared memory versions */ +#define EVENT_SYSTEM_VERSION 2 + +/* Maximum length of SetMouseScaling arrays */ +#define NX_MAXMOUSESCALINGS 20 + +typedef struct evsioKeymapping /* Match old struct names in kernel */ +{ + int size; + char *mapping; +} NXKeyMapping; + +typedef struct evsioMouseScaling /* Match old struct names in kernel */ +{ + int numScaleLevels; + short scaleThresholds[NX_MAXMOUSESCALINGS]; + short scaleFactors[NX_MAXMOUSESCALINGS]; +} NXMouseScaling; + +typedef enum { + NX_OneButton, + NX_LeftButton, + NX_RightButton +} NXMouseButton; + +// IOFixedPoint32 is a 24.8 format +typedef struct __IOFixedPoint32 { + int32_t x; + int32_t y; +} IOFixedPoint32; + +/* + * NXEventSystemInfo() information structures. These are designed to + * allow for expansion. + * + * The current implementation of NXEventSystemInfo() uses an ioctl call. + * THIS WILL CHANGE. + */ + +/* + * Generic query max size and typedefs. + * + * The maximum size is selected to support anticipated future extensions + * of request flavors. Certain flavors planned for future releases may + * require roughtly 800 ints to represent. We allow a little extra, in + * case further growth is needed. + */ +typedef int *NXEventSystemInfoType; +#define NX_EVS_INFO_MAX (1024) /* Max array size */ +typedef int NXEventSystemInfoData[NX_EVS_INFO_MAX]; + +/* Event System Devices query */ +#define NX_EVS_DEVICE_MAX 16 + + /* Interface types */ +#define NX_EVS_DEVICE_INTERFACE_OTHER 0 +#define NX_EVS_DEVICE_INTERFACE_NeXT 1 // NeXT custom, in older sys +#define NX_EVS_DEVICE_INTERFACE_ADB 2 // NeXT/fruit keybds/mice +#define NX_EVS_DEVICE_INTERFACE_ACE 3 // For x86 PC keyboards +#define NX_EVS_DEVICE_INTERFACE_SERIAL_ACE 4 // For PC serial mice +#define NX_EVS_DEVICE_INTERFACE_BUS_ACE 5 // For PC bus mice +#define NX_EVS_DEVICE_INTERFACE_HIL 6 // For HIL hp keyboard +#define NX_EVS_DEVICE_INTERFACE_TYPE5 7 // For Sun Type5 keyboard + +/* + * Note! if any new interface types are added above, the following + * definition of the number of interfaces supported must reflect this. + * This is used in the libkeymap project (storemap.c module) which needs + * to be cognizant of the number of new devices coming online + * via support for heterogeneous architecture platforms. + * e.g., PCs, HP's HIL, Sun's Type5 keyboard,... + */ +#define NUM_SUPPORTED_INTERFACES (NX_EVS_DEVICE_INTERFACE_TYPE5 + 1) + // Other, NeXT, ADB, ACE,... + + /* Device types */ +#define NX_EVS_DEVICE_TYPE_OTHER 0 +#define NX_EVS_DEVICE_TYPE_KEYBOARD 1 +#define NX_EVS_DEVICE_TYPE_MOUSE 2 // Relative position devices +#define NX_EVS_DEVICE_TYPE_TABLET 3 // Absolute position devices + +typedef struct { + int interface; /* NeXT, ADB, other */ + int interface_addr; /* Device address on the interface */ + int dev_type; /* Keyboard, mouse, tablet, other */ + int id; /* manufacturer's device handler ID */ +} NXEventSystemDevice; + +typedef struct { + NXEventSystemDevice dev[NX_EVS_DEVICE_MAX]; +} NXEventSystemDeviceList; + +#define __OLD_NX_EVS_DEVICE_INFO 1 +#define NX_EVS_DEVICE_INFO "Evs_EventDeviceInfo" +#define NX_EVS_DEVICE_INFO_COUNT \ + (sizeof (NXEventSystemDeviceList) / sizeof (int)) + +/* + * Types used in evScreen protocol compliant operations. + */ + +typedef enum {EVNOP, EVHIDE, EVSHOW, EVMOVE, EVLEVEL} EvCmd; /* Cursor state */ + +#define EV_SCREEN_MIN_BRIGHTNESS 0 +#define EV_SCREEN_MAX_BRIGHTNESS 64 +/* Scale should lie between MIN_BRIGHTNESS and MAX_BRIGHTNESS */ +#define EV_SCALE_BRIGHTNESS( scale, datum ) \ + ((((UInt32)(datum))*((UInt32)scale)) >> 6) + +/* + * Definition of a tick, as a time in milliseconds. This controls how + * often the event system periodic jobs are run. All actual tick times + * are derived from the nanosecond timer. These values are typically used + * as part of computing mouse velocity for acceleration purposes. + */ +#define EV_TICK_TIME 16 /* 16 milliseconds */ +#define EV_TICKS_PER_SEC (1000/EV_TICK_TIME) /* ~ 62 Hz */ + +/* Mouse Button bits, as passed from an EventSrc to the Event Driver */ +#define EV_RB (0x01) +#define EV_LB (0x04) +#define EV_MOUSEBUTTONMASK (EV_LB | EV_RB) + +/* Tablet Pressure Constants, as passed from an EventSrc to the Event Driver */ +#define EV_MINPRESSURE 0 +#define EV_MAXPRESSURE 255 + +/* Cursor size in pixels */ +#define EV_CURSOR_WIDTH 16 +#define EV_CURSOR_HEIGHT 16 + + +#define kAppleOnboardGUID 0x0610000000000000ULL + +#endif /* !_DEV_EV_TYPES_H */ + diff --git a/QualcommWireless/include/IOKit/hidsystem/IOHIDUsageTables.h b/QualcommWireless/include/IOKit/hidsystem/IOHIDUsageTables.h new file mode 100644 index 0000000..77db996 --- /dev/null +++ b/QualcommWireless/include/IOKit/hidsystem/IOHIDUsageTables.h @@ -0,0 +1,2591 @@ +/* + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +#ifndef _IOHIDUSAGETABLES_H +#define _IOHIDUSAGETABLES_H + +/* ****************************************************************************************** + * HID Usage Tables + * + * The following constants are from the USB 'HID Usage Tables' specification, revision 1.1rc3 + * ****************************************************************************************** */ + + +/* Usage Pages */ +enum +{ + kHIDPage_Undefined = 0x00, + kHIDPage_GenericDesktop = 0x01, + kHIDPage_Simulation = 0x02, + kHIDPage_VR = 0x03, + kHIDPage_Sport = 0x04, + kHIDPage_Game = 0x05, + kHIDPage_GenericDeviceControls = 0x06, + kHIDPage_KeyboardOrKeypad = 0x07, /* USB Device Class Definition for Human Interface Devices (HID). Note: the usage type for all key codes is Selector (Sel). */ + kHIDPage_LEDs = 0x08, + kHIDPage_Button = 0x09, + kHIDPage_Ordinal = 0x0A, + kHIDPage_Telephony = 0x0B, + kHIDPage_Consumer = 0x0C, + kHIDPage_Digitizer = 0x0D, + /* Reserved 0x0E */ + kHIDPage_PID = 0x0F, /* USB Physical Interface Device definitions for force feedback and related devices. */ + kHIDPage_Unicode = 0x10, + /* Reserved 0x11 - 0x13 */ + kHIDPage_AlphanumericDisplay = 0x14, + /* Reserved 0x15 - 0x1F */ + kHIDPage_Sensor = 0x20, + /* Reserved 0x21 - 0x7f */ + kHIDPage_Monitor = 0x80, + kHIDPage_MonitorEnumerated = 0x81, + kHIDPage_MonitorVirtual = 0x82, + kHIDPage_MonitorReserved = 0x83, + /* Power 0x84 - 0x87 USB Device Class Definition for Power Devices */ + kHIDPage_PowerDevice = 0x84, /* Power Device Page */ + kHIDPage_BatterySystem = 0x85, /* Battery System Page */ + kHIDPage_PowerReserved = 0x86, + kHIDPage_PowerReserved2 = 0x87, + /* Reserved 0x88 - 0x8B */ + kHIDPage_BarCodeScanner = 0x8C, /* (Point of Sale) USB Device Class Definition for Bar Code Scanner Devices */ + kHIDPage_WeighingDevice = 0x8D, /* (Point of Sale) USB Device Class Definition for Weighing Devices */ + kHIDPage_Scale = 0x8D, /* (Point of Sale) USB Device Class Definition for Scale Devices */ + kHIDPage_MagneticStripeReader = 0x8E, + /* ReservedPointofSalepages 0x8F */ + kHIDPage_CameraControl = 0x90, /* USB Device Class Definition for Image Class Devices */ + kHIDPage_Arcade = 0x91, /* OAAF Definitions for arcade and coinop related Devices */ + /* Reserved 0x92 - 0xFEFF */ + /* VendorDefined 0xFF00 - 0xFFFF */ + kHIDPage_VendorDefinedStart = 0xFF00 +}; + +/* Undefined Usage for all usage pages */ +enum +{ + kHIDUsage_Undefined = 0x00 +}; + +/* GenericDesktop Page (0x01) */ +enum +{ + kHIDUsage_GD_Pointer = 0x01, /* Physical Collection */ + kHIDUsage_GD_Mouse = 0x02, /* Application Collection */ + /* 0x03 Reserved */ + kHIDUsage_GD_Joystick = 0x04, /* Application Collection */ + kHIDUsage_GD_GamePad = 0x05, /* Application Collection */ + kHIDUsage_GD_Keyboard = 0x06, /* Application Collection */ + kHIDUsage_GD_Keypad = 0x07, /* Application Collection */ + kHIDUsage_GD_MultiAxisController = 0x08, /* Application Collection */ + kHIDUsage_GD_TabletPCSystemControls = 0x09, /* Application Collection */ + kHIDUsage_GD_AssistiveControl = 0x0A, /* Application Collection */ + kHIDUsage_GD_SpatialController = 0x0F, /* Application Collection */ + kHIDUsage_GD_AssistiveControlCompatible = 0x10, /* Application Collection */ + /* 0x0B - 0x2F Reserved */ + kHIDUsage_GD_X = 0x30, /* Dynamic Value */ + kHIDUsage_GD_Y = 0x31, /* Dynamic Value */ + kHIDUsage_GD_Z = 0x32, /* Dynamic Value */ + kHIDUsage_GD_Rx = 0x33, /* Dynamic Value */ + kHIDUsage_GD_Ry = 0x34, /* Dynamic Value */ + kHIDUsage_GD_Rz = 0x35, /* Dynamic Value */ + kHIDUsage_GD_Slider = 0x36, /* Dynamic Value */ + kHIDUsage_GD_Dial = 0x37, /* Dynamic Value */ + kHIDUsage_GD_Wheel = 0x38, /* Dynamic Value */ + kHIDUsage_GD_Hatswitch = 0x39, /* Dynamic Value */ + kHIDUsage_GD_CountedBuffer = 0x3A, /* Logical Collection */ + kHIDUsage_GD_ByteCount = 0x3B, /* Dynamic Value */ + kHIDUsage_GD_MotionWakeup = 0x3C, /* One-Shot Control */ + kHIDUsage_GD_Start = 0x3D, /* On/Off Control */ + kHIDUsage_GD_Select = 0x3E, /* On/Off Control */ + /* 0x3F Reserved */ + kHIDUsage_GD_Vx = 0x40, /* Dynamic Value */ + kHIDUsage_GD_Vy = 0x41, /* Dynamic Value */ + kHIDUsage_GD_Vz = 0x42, /* Dynamic Value */ + kHIDUsage_GD_Vbrx = 0x43, /* Dynamic Value */ + kHIDUsage_GD_Vbry = 0x44, /* Dynamic Value */ + kHIDUsage_GD_Vbrz = 0x45, /* Dynamic Value */ + kHIDUsage_GD_Vno = 0x46, /* Dynamic Value */ + /* 0x47 - 0x7F Reserved */ + kHIDUsage_GD_SystemControl = 0x80, /* Application Collection */ + kHIDUsage_GD_SystemPowerDown = 0x81, /* One-Shot Control */ + kHIDUsage_GD_SystemSleep = 0x82, /* One-Shot Control */ + kHIDUsage_GD_SystemWakeUp = 0x83, /* One-Shot Control */ + kHIDUsage_GD_SystemContextMenu = 0x84, /* One-Shot Control */ + kHIDUsage_GD_SystemMainMenu = 0x85, /* One-Shot Control */ + kHIDUsage_GD_SystemAppMenu = 0x86, /* One-Shot Control */ + kHIDUsage_GD_SystemMenuHelp = 0x87, /* One-Shot Control */ + kHIDUsage_GD_SystemMenuExit = 0x88, /* One-Shot Control */ + kHIDUsage_GD_SystemMenuSelect = 0x89, /* Selector */ + kHIDUsage_GD_SystemMenu = kHIDUsage_GD_SystemMenuSelect, /* Selector */ + kHIDUsage_GD_SystemMenuRight = 0x8A, /* Re-Trigger Control */ + kHIDUsage_GD_SystemMenuLeft = 0x8B, /* Re-Trigger Control */ + kHIDUsage_GD_SystemMenuUp = 0x8C, /* Re-Trigger Control */ + kHIDUsage_GD_SystemMenuDown = 0x8D, /* Re-Trigger Control */ + /* 0x8E - 0x8F Reserved */ + kHIDUsage_GD_DPadUp = 0x90, /* On/Off Control */ + kHIDUsage_GD_DPadDown = 0x91, /* On/Off Control */ + kHIDUsage_GD_DPadRight = 0x92, /* On/Off Control */ + kHIDUsage_GD_DPadLeft = 0x93, /* On/Off Control */ + kHIDUsage_GD_IndexTrigger = 0x94, /* On/Off Control */ + kHIDUsage_GD_PalmTrigger = 0x95, /* On/Off Control */ + kHIDUsage_GD_Thumbstick = 0x96, /* On/Off Control */ + /* 0x94 - 0xFFFF Reserved */ + kHIDUsage_GD_Reserved = 0xFFFF +}; + +/* Simulation Page (0x02) */ +/* This section provides detailed descriptions of the usages employed by simulation devices. */ +enum +{ + kHIDUsage_Sim_FlightSimulationDevice = 0x01, /* Application Collection */ + kHIDUsage_Sim_AutomobileSimulationDevice = 0x02, /* Application Collection */ + kHIDUsage_Sim_TankSimulationDevice = 0x03, /* Application Collection */ + kHIDUsage_Sim_SpaceshipSimulationDevice = 0x04, /* Application Collection */ + kHIDUsage_Sim_SubmarineSimulationDevice = 0x05, /* Application Collection */ + kHIDUsage_Sim_SailingSimulationDevice = 0x06, /* Application Collection */ + kHIDUsage_Sim_MotorcycleSimulationDevice = 0x07, /* Application Collection */ + kHIDUsage_Sim_SportsSimulationDevice = 0x08, /* Application Collection */ + kHIDUsage_Sim_AirplaneSimulationDevice = 0x09, /* Application Collection */ + kHIDUsage_Sim_HelicopterSimulationDevice = 0x0A, /* Application Collection */ + kHIDUsage_Sim_MagicCarpetSimulationDevice = 0x0B, /* Application Collection */ + kHIDUsage_Sim_BicycleSimulationDevice = 0x0C, /* Application Collection */ + /* 0x0D - 0x1F Reserved */ + kHIDUsage_Sim_FlightControlStick = 0x20, /* Application Collection */ + kHIDUsage_Sim_FlightStick = 0x21, /* Application Collection */ + kHIDUsage_Sim_CyclicControl = 0x22, /* Physical Collection */ + kHIDUsage_Sim_CyclicTrim = 0x23, /* Physical Collection */ + kHIDUsage_Sim_FlightYoke = 0x24, /* Application Collection */ + kHIDUsage_Sim_TrackControl = 0x25, /* Physical Collection */ + /* 0x26 - 0xAF Reserved */ + kHIDUsage_Sim_Aileron = 0xB0, /* Dynamic Value */ + kHIDUsage_Sim_AileronTrim = 0xB1, /* Dynamic Value */ + kHIDUsage_Sim_AntiTorqueControl = 0xB2, /* Dynamic Value */ + kHIDUsage_Sim_AutopilotEnable = 0xB3, /* On/Off Control */ + kHIDUsage_Sim_ChaffRelease = 0xB4, /* One-Shot Control */ + kHIDUsage_Sim_CollectiveControl = 0xB5, /* Dynamic Value */ + kHIDUsage_Sim_DiveBrake = 0xB6, /* Dynamic Value */ + kHIDUsage_Sim_ElectronicCountermeasures = 0xB7, /* On/Off Control */ + kHIDUsage_Sim_Elevator = 0xB8, /* Dynamic Value */ + kHIDUsage_Sim_ElevatorTrim = 0xB9, /* Dynamic Value */ + kHIDUsage_Sim_Rudder = 0xBA, /* Dynamic Value */ + kHIDUsage_Sim_Throttle = 0xBB, /* Dynamic Value */ + kHIDUsage_Sim_FlightCommunications = 0xBC, /* On/Off Control */ + kHIDUsage_Sim_FlareRelease = 0xBD, /* One-Shot Control */ + kHIDUsage_Sim_LandingGear = 0xBE, /* On/Off Control */ + kHIDUsage_Sim_ToeBrake = 0xBF, /* Dynamic Value */ + kHIDUsage_Sim_Trigger = 0xC0, /* Momentary Control */ + kHIDUsage_Sim_WeaponsArm = 0xC1, /* On/Off Control */ + kHIDUsage_Sim_Weapons = 0xC2, /* Selector */ + kHIDUsage_Sim_WingFlaps = 0xC3, /* Dynamic Value */ + kHIDUsage_Sim_Accelerator = 0xC4, /* Dynamic Value */ + kHIDUsage_Sim_Brake = 0xC5, /* Dynamic Value */ + kHIDUsage_Sim_Clutch = 0xC6, /* Dynamic Value */ + kHIDUsage_Sim_Shifter = 0xC7, /* Dynamic Value */ + kHIDUsage_Sim_Steering = 0xC8, /* Dynamic Value */ + kHIDUsage_Sim_TurretDirection = 0xC9, /* Dynamic Value */ + kHIDUsage_Sim_BarrelElevation = 0xCA, /* Dynamic Value */ + kHIDUsage_Sim_DivePlane = 0xCB, /* Dynamic Value */ + kHIDUsage_Sim_Ballast = 0xCC, /* Dynamic Value */ + kHIDUsage_Sim_BicycleCrank = 0xCD, /* Dynamic Value */ + kHIDUsage_Sim_HandleBars = 0xCE, /* Dynamic Value */ + kHIDUsage_Sim_FrontBrake = 0xCF, /* Dynamic Value */ + kHIDUsage_Sim_RearBrake = 0xD0, /* Dynamic Value */ + /* 0xD1 - 0xFFFF Reserved */ + kHIDUsage_Sim_Reserved = 0xFFFF +}; + +/* VR Page (0x03) */ +/* Virtual Reality controls depend on designators to identify the individual controls. Most of the following are */ +/* usages are applied to the collections of entities that comprise the actual device. */ +enum +{ + kHIDUsage_VR_Belt = 0x01, /* Application Collection */ + kHIDUsage_VR_BodySuit = 0x02, /* Application Collection */ + kHIDUsage_VR_Flexor = 0x03, /* Physical Collection */ + kHIDUsage_VR_Glove = 0x04, /* Application Collection */ + kHIDUsage_VR_HeadTracker = 0x05, /* Physical Collection */ + kHIDUsage_VR_HeadMountedDisplay = 0x06, /* Application Collection */ + kHIDUsage_VR_HandTracker = 0x07, /* Application Collection */ + kHIDUsage_VR_Oculometer = 0x08, /* Application Collection */ + kHIDUsage_VR_Vest = 0x09, /* Application Collection */ + kHIDUsage_VR_AnimatronicDevice = 0x0A, /* Application Collection */ + /* 0x0B - 0x1F Reserved */ + kHIDUsage_VR_StereoEnable = 0x20, /* On/Off Control */ + kHIDUsage_VR_DisplayEnable = 0x21, /* On/Off Control */ + /* 0x22 - 0xFFFF Reserved */ + kHIDUsage_VR_Reserved = 0xFFFF +}; + +/* Sport Page (0x04) */ +enum +{ + kHIDUsage_Sprt_BaseballBat = 0x01, /* Application Collection */ + kHIDUsage_Sprt_GolfClub = 0x02, /* Application Collection */ + kHIDUsage_Sprt_RowingMachine = 0x03, /* Application Collection */ + kHIDUsage_Sprt_Treadmill = 0x04, /* Application Collection */ + /* 0x05 - 0x2F Reserved */ + kHIDUsage_Sprt_Oar = 0x30, /* Dynamic Value */ + kHIDUsage_Sprt_Slope = 0x31, /* Dynamic Value */ + kHIDUsage_Sprt_Rate = 0x32, /* Dynamic Value */ + kHIDUsage_Sprt_StickSpeed = 0x33, /* Dynamic Value */ + kHIDUsage_Sprt_StickFaceAngle = 0x34, /* Dynamic Value */ + kHIDUsage_Sprt_StickHeelOrToe = 0x35, /* Dynamic Value */ + kHIDUsage_Sprt_StickFollowThrough = 0x36, /* Dynamic Value */ + kHIDUsage_Sprt_StickTempo = 0x37, /* Dynamic Value */ + kHIDUsage_Sprt_StickType = 0x38, /* Named Array */ + kHIDUsage_Sprt_StickHeight = 0x39, /* Dynamic Value */ + /* 0x3A - 0x4F Reserved */ + kHIDUsage_Sprt_Putter = 0x50, /* Selector */ + kHIDUsage_Sprt_1Iron = 0x51, /* Selector */ + kHIDUsage_Sprt_2Iron = 0x52, /* Selector */ + kHIDUsage_Sprt_3Iron = 0x53, /* Selector */ + kHIDUsage_Sprt_4Iron = 0x54, /* Selector */ + kHIDUsage_Sprt_5Iron = 0x55, /* Selector */ + kHIDUsage_Sprt_6Iron = 0x56, /* Selector */ + kHIDUsage_Sprt_7Iron = 0x57, /* Selector */ + kHIDUsage_Sprt_8Iron = 0x58, /* Selector */ + kHIDUsage_Sprt_9Iron = 0x59, /* Selector */ + kHIDUsage_Sprt_10Iron = 0x5A, /* Selector */ + kHIDUsage_Sprt_11Iron = 0x5B, /* Selector */ + kHIDUsage_Sprt_SandWedge = 0x5C, /* Selector */ + kHIDUsage_Sprt_LoftWedge = 0x5D, /* Selector */ + kHIDUsage_Sprt_PowerWedge = 0x5E, /* Selector */ + kHIDUsage_Sprt_1Wood = 0x5F, /* Selector */ + kHIDUsage_Sprt_3Wood = 0x60, /* Selector */ + kHIDUsage_Sprt_5Wood = 0x61, /* Selector */ + kHIDUsage_Sprt_7Wood = 0x62, /* Selector */ + kHIDUsage_Sprt_9Wood = 0x63, /* Selector */ + /* 0x64 - 0xFFFF Reserved */ + kHIDUsage_Sprt_Reserved = 0xFFFF +}; + +/* Game Page (0x05) */ +enum +{ + kHIDUsage_Game_3DGameController = 0x01, /* Application Collection */ + kHIDUsage_Game_PinballDevice = 0x02, /* Application Collection */ + kHIDUsage_Game_GunDevice = 0x03, /* Application Collection */ + /* 0x04 - 0x1F Reserved */ + kHIDUsage_Game_PointofView = 0x20, /* Physical Collection */ + kHIDUsage_Game_TurnRightOrLeft = 0x21, /* Dynamic Value */ + kHIDUsage_Game_PitchUpOrDown = 0x22, /* Dynamic Value */ + kHIDUsage_Game_RollRightOrLeft = 0x23, /* Dynamic Value */ + kHIDUsage_Game_MoveRightOrLeft = 0x24, /* Dynamic Value */ + kHIDUsage_Game_MoveForwardOrBackward = 0x25, /* Dynamic Value */ + kHIDUsage_Game_MoveUpOrDown = 0x26, /* Dynamic Value */ + kHIDUsage_Game_LeanRightOrLeft = 0x27, /* Dynamic Value */ + kHIDUsage_Game_LeanForwardOrBackward = 0x28, /* Dynamic Value */ + kHIDUsage_Game_HeightOfPOV = 0x29, /* Dynamic Value */ + kHIDUsage_Game_Flipper = 0x2A, /* Momentary Control */ + kHIDUsage_Game_SecondaryFlipper = 0x2B, /* Momentary Control */ + kHIDUsage_Game_Bump = 0x2C, /* Momentary Control */ + kHIDUsage_Game_NewGame = 0x2D, /* One-Shot Control */ + kHIDUsage_Game_ShootBall = 0x2E, /* One-Shot Control */ + kHIDUsage_Game_Player = 0x2F, /* One-Shot Control */ + kHIDUsage_Game_GunBolt = 0x30, /* On/Off Control */ + kHIDUsage_Game_GunClip = 0x31, /* On/Off Control */ + kHIDUsage_Game_Gun = 0x32, /* Selector */ + kHIDUsage_Game_GunSingleShot = 0x33, /* Selector */ + kHIDUsage_Game_GunBurst = 0x34, /* Selector */ + kHIDUsage_Game_GunAutomatic = 0x35, /* Selector */ + kHIDUsage_Game_GunSafety = 0x36, /* On/Off Control */ + kHIDUsage_Game_GamepadFireOrJump = 0x37, /* Logical Collection */ + kHIDUsage_Game_GamepadTrigger = 0x39, /* Logical Collection */ + kHIDUsage_Game_GamepadFormFitting_Compatibility = 0x39, /* Static Flag */ + kHIDUsage_Game_GamepadFormFitting = 0x3A, /* Static Flag */ + /* 0x3A - 0xFFFF Reserved */ + kHIDUsage_Game_Reserved = 0xFFFF +}; + +/* Generic Device Controls (0x0g) */ +enum +{ + kHIDUsage_GenDevControls_BackgroundControls = 0x01, /* Application Collection */ +}; + +/* KeyboardOrKeypad Page (0x07) */ +/* This section is the Usage Page for key codes to be used in implementing a USB keyboard. A Boot Keyboard (84-, 101- or 104-key) should at a minimum support all associated usage codes as indicated in the ÒBootÓ */ +/* column below. */ +/* The usage type of all key codes is Selectors (Sel), except for the modifier keys Keyboard Left Control (0x224) to Keyboard Right GUI (0x231) which are Dynamic Flags (DV). */ +/* Note: A general note on Usages and languages: Due to the variation of keyboards from language to language, it is not feasible to specify exact key mappings for every language. Where this list is not specific for a key function in a language, the closest equivalent key position should be used, so that a keyboard may be modified for a different language by simply printing different keycaps. One example is the Y key on a North American keyboard. In Germany this is typically Z. Rather than changing the keyboard firmware to put the Z Usage into that place in the descriptor list, the vendor should use the Y Usage on both the North American and German keyboards. This continues to be the existing practice in the industry, in order to minimize the number of changes to the electronics to accommodate otherlanguages. */ +enum +{ + kHIDUsage_KeyboardErrorRollOver = 0x01, /* ErrorRollOver */ + kHIDUsage_KeyboardPOSTFail = 0x02, /* POSTFail */ + kHIDUsage_KeyboardErrorUndefined = 0x03, /* ErrorUndefined */ + kHIDUsage_KeyboardA = 0x04, /* a or A */ + kHIDUsage_KeyboardB = 0x05, /* b or B */ + kHIDUsage_KeyboardC = 0x06, /* c or C */ + kHIDUsage_KeyboardD = 0x07, /* d or D */ + kHIDUsage_KeyboardE = 0x08, /* e or E */ + kHIDUsage_KeyboardF = 0x09, /* f or F */ + kHIDUsage_KeyboardG = 0x0A, /* g or G */ + kHIDUsage_KeyboardH = 0x0B, /* h or H */ + kHIDUsage_KeyboardI = 0x0C, /* i or I */ + kHIDUsage_KeyboardJ = 0x0D, /* j or J */ + kHIDUsage_KeyboardK = 0x0E, /* k or K */ + kHIDUsage_KeyboardL = 0x0F, /* l or L */ + kHIDUsage_KeyboardM = 0x10, /* m or M */ + kHIDUsage_KeyboardN = 0x11, /* n or N */ + kHIDUsage_KeyboardO = 0x12, /* o or O */ + kHIDUsage_KeyboardP = 0x13, /* p or P */ + kHIDUsage_KeyboardQ = 0x14, /* q or Q */ + kHIDUsage_KeyboardR = 0x15, /* r or R */ + kHIDUsage_KeyboardS = 0x16, /* s or S */ + kHIDUsage_KeyboardT = 0x17, /* t or T */ + kHIDUsage_KeyboardU = 0x18, /* u or U */ + kHIDUsage_KeyboardV = 0x19, /* v or V */ + kHIDUsage_KeyboardW = 0x1A, /* w or W */ + kHIDUsage_KeyboardX = 0x1B, /* x or X */ + kHIDUsage_KeyboardY = 0x1C, /* y or Y */ + kHIDUsage_KeyboardZ = 0x1D, /* z or Z */ + kHIDUsage_Keyboard1 = 0x1E, /* 1 or ! */ + kHIDUsage_Keyboard2 = 0x1F, /* 2 or @ */ + kHIDUsage_Keyboard3 = 0x20, /* 3 or # */ + kHIDUsage_Keyboard4 = 0x21, /* 4 or $ */ + kHIDUsage_Keyboard5 = 0x22, /* 5 or % */ + kHIDUsage_Keyboard6 = 0x23, /* 6 or ^ */ + kHIDUsage_Keyboard7 = 0x24, /* 7 or & */ + kHIDUsage_Keyboard8 = 0x25, /* 8 or * */ + kHIDUsage_Keyboard9 = 0x26, /* 9 or ( */ + kHIDUsage_Keyboard0 = 0x27, /* 0 or ) */ + kHIDUsage_KeyboardReturnOrEnter = 0x28, /* Return (Enter) */ + kHIDUsage_KeyboardEscape = 0x29, /* Escape */ + kHIDUsage_KeyboardDeleteOrBackspace = 0x2A, /* Delete (Backspace) */ + kHIDUsage_KeyboardTab = 0x2B, /* Tab */ + kHIDUsage_KeyboardSpacebar = 0x2C, /* Spacebar */ + kHIDUsage_KeyboardHyphen = 0x2D, /* - or _ */ + kHIDUsage_KeyboardEqualSign = 0x2E, /* = or + */ + kHIDUsage_KeyboardOpenBracket = 0x2F, /* [ or { */ + kHIDUsage_KeyboardCloseBracket = 0x30, /* ] or } */ + kHIDUsage_KeyboardBackslash = 0x31, /* \ or | */ + kHIDUsage_KeyboardNonUSPound = 0x32, /* Non-US # or _ */ + kHIDUsage_KeyboardSemicolon = 0x33, /* ; or : */ + kHIDUsage_KeyboardQuote = 0x34, /* ' or " */ + kHIDUsage_KeyboardGraveAccentAndTilde = 0x35, /* Grave Accent and Tilde */ + kHIDUsage_KeyboardComma = 0x36, /* , or < */ + kHIDUsage_KeyboardPeriod = 0x37, /* . or > */ + kHIDUsage_KeyboardSlash = 0x38, /* / or ? */ + kHIDUsage_KeyboardCapsLock = 0x39, /* Caps Lock */ + kHIDUsage_KeyboardF1 = 0x3A, /* F1 */ + kHIDUsage_KeyboardF2 = 0x3B, /* F2 */ + kHIDUsage_KeyboardF3 = 0x3C, /* F3 */ + kHIDUsage_KeyboardF4 = 0x3D, /* F4 */ + kHIDUsage_KeyboardF5 = 0x3E, /* F5 */ + kHIDUsage_KeyboardF6 = 0x3F, /* F6 */ + kHIDUsage_KeyboardF7 = 0x40, /* F7 */ + kHIDUsage_KeyboardF8 = 0x41, /* F8 */ + kHIDUsage_KeyboardF9 = 0x42, /* F9 */ + kHIDUsage_KeyboardF10 = 0x43, /* F10 */ + kHIDUsage_KeyboardF11 = 0x44, /* F11 */ + kHIDUsage_KeyboardF12 = 0x45, /* F12 */ + kHIDUsage_KeyboardPrintScreen = 0x46, /* Print Screen */ + kHIDUsage_KeyboardScrollLock = 0x47, /* Scroll Lock */ + kHIDUsage_KeyboardPause = 0x48, /* Pause */ + kHIDUsage_KeyboardInsert = 0x49, /* Insert */ + kHIDUsage_KeyboardHome = 0x4A, /* Home */ + kHIDUsage_KeyboardPageUp = 0x4B, /* Page Up */ + kHIDUsage_KeyboardDeleteForward = 0x4C, /* Delete Forward */ + kHIDUsage_KeyboardEnd = 0x4D, /* End */ + kHIDUsage_KeyboardPageDown = 0x4E, /* Page Down */ + kHIDUsage_KeyboardRightArrow = 0x4F, /* Right Arrow */ + kHIDUsage_KeyboardLeftArrow = 0x50, /* Left Arrow */ + kHIDUsage_KeyboardDownArrow = 0x51, /* Down Arrow */ + kHIDUsage_KeyboardUpArrow = 0x52, /* Up Arrow */ + kHIDUsage_KeypadNumLock = 0x53, /* Keypad NumLock or Clear */ + kHIDUsage_KeypadSlash = 0x54, /* Keypad / */ + kHIDUsage_KeypadAsterisk = 0x55, /* Keypad * */ + kHIDUsage_KeypadHyphen = 0x56, /* Keypad - */ + kHIDUsage_KeypadPlus = 0x57, /* Keypad + */ + kHIDUsage_KeypadEnter = 0x58, /* Keypad Enter */ + kHIDUsage_Keypad1 = 0x59, /* Keypad 1 or End */ + kHIDUsage_Keypad2 = 0x5A, /* Keypad 2 or Down Arrow */ + kHIDUsage_Keypad3 = 0x5B, /* Keypad 3 or Page Down */ + kHIDUsage_Keypad4 = 0x5C, /* Keypad 4 or Left Arrow */ + kHIDUsage_Keypad5 = 0x5D, /* Keypad 5 */ + kHIDUsage_Keypad6 = 0x5E, /* Keypad 6 or Right Arrow */ + kHIDUsage_Keypad7 = 0x5F, /* Keypad 7 or Home */ + kHIDUsage_Keypad8 = 0x60, /* Keypad 8 or Up Arrow */ + kHIDUsage_Keypad9 = 0x61, /* Keypad 9 or Page Up */ + kHIDUsage_Keypad0 = 0x62, /* Keypad 0 or Insert */ + kHIDUsage_KeypadPeriod = 0x63, /* Keypad . or Delete */ + kHIDUsage_KeyboardNonUSBackslash = 0x64, /* Non-US \ or | */ + kHIDUsage_KeyboardApplication = 0x65, /* Application */ + kHIDUsage_KeyboardPower = 0x66, /* Power */ + kHIDUsage_KeypadEqualSign = 0x67, /* Keypad = */ + kHIDUsage_KeyboardF13 = 0x68, /* F13 */ + kHIDUsage_KeyboardF14 = 0x69, /* F14 */ + kHIDUsage_KeyboardF15 = 0x6A, /* F15 */ + kHIDUsage_KeyboardF16 = 0x6B, /* F16 */ + kHIDUsage_KeyboardF17 = 0x6C, /* F17 */ + kHIDUsage_KeyboardF18 = 0x6D, /* F18 */ + kHIDUsage_KeyboardF19 = 0x6E, /* F19 */ + kHIDUsage_KeyboardF20 = 0x6F, /* F20 */ + kHIDUsage_KeyboardF21 = 0x70, /* F21 */ + kHIDUsage_KeyboardF22 = 0x71, /* F22 */ + kHIDUsage_KeyboardF23 = 0x72, /* F23 */ + kHIDUsage_KeyboardF24 = 0x73, /* F24 */ + kHIDUsage_KeyboardExecute = 0x74, /* Execute */ + kHIDUsage_KeyboardHelp = 0x75, /* Help */ + kHIDUsage_KeyboardMenu = 0x76, /* Menu */ + kHIDUsage_KeyboardSelect = 0x77, /* Select */ + kHIDUsage_KeyboardStop = 0x78, /* Stop */ + kHIDUsage_KeyboardAgain = 0x79, /* Again */ + kHIDUsage_KeyboardUndo = 0x7A, /* Undo */ + kHIDUsage_KeyboardCut = 0x7B, /* Cut */ + kHIDUsage_KeyboardCopy = 0x7C, /* Copy */ + kHIDUsage_KeyboardPaste = 0x7D, /* Paste */ + kHIDUsage_KeyboardFind = 0x7E, /* Find */ + kHIDUsage_KeyboardMute = 0x7F, /* Mute */ + kHIDUsage_KeyboardVolumeUp = 0x80, /* Volume Up */ + kHIDUsage_KeyboardVolumeDown = 0x81, /* Volume Down */ + kHIDUsage_KeyboardLockingCapsLock = 0x82, /* Locking Caps Lock */ + kHIDUsage_KeyboardLockingNumLock = 0x83, /* Locking Num Lock */ + kHIDUsage_KeyboardLockingScrollLock = 0x84, /* Locking Scroll Lock */ + kHIDUsage_KeypadComma = 0x85, /* Keypad Comma */ + kHIDUsage_KeypadEqualSignAS400 = 0x86, /* Keypad Equal Sign for AS/400 */ + kHIDUsage_KeyboardInternational1 = 0x87, /* International1 */ + kHIDUsage_KeyboardInternational2 = 0x88, /* International2 */ + kHIDUsage_KeyboardInternational3 = 0x89, /* International3 */ + kHIDUsage_KeyboardInternational4 = 0x8A, /* International4 */ + kHIDUsage_KeyboardInternational5 = 0x8B, /* International5 */ + kHIDUsage_KeyboardInternational6 = 0x8C, /* International6 */ + kHIDUsage_KeyboardInternational7 = 0x8D, /* International7 */ + kHIDUsage_KeyboardInternational8 = 0x8E, /* International8 */ + kHIDUsage_KeyboardInternational9 = 0x8F, /* International9 */ + kHIDUsage_KeyboardLANG1 = 0x90, /* LANG1 */ + kHIDUsage_KeyboardLANG2 = 0x91, /* LANG2 */ + kHIDUsage_KeyboardLANG3 = 0x92, /* LANG3 */ + kHIDUsage_KeyboardLANG4 = 0x93, /* LANG4 */ + kHIDUsage_KeyboardLANG5 = 0x94, /* LANG5 */ + kHIDUsage_KeyboardLANG6 = 0x95, /* LANG6 */ + kHIDUsage_KeyboardLANG7 = 0x96, /* LANG7 */ + kHIDUsage_KeyboardLANG8 = 0x97, /* LANG8 */ + kHIDUsage_KeyboardLANG9 = 0x98, /* LANG9 */ + kHIDUsage_KeyboardAlternateErase = 0x99, /* AlternateErase */ + kHIDUsage_KeyboardSysReqOrAttention = 0x9A, /* SysReq/Attention */ + kHIDUsage_KeyboardCancel = 0x9B, /* Cancel */ + kHIDUsage_KeyboardClear = 0x9C, /* Clear */ + kHIDUsage_KeyboardPrior = 0x9D, /* Prior */ + kHIDUsage_KeyboardReturn = 0x9E, /* Return */ + kHIDUsage_KeyboardSeparator = 0x9F, /* Separator */ + kHIDUsage_KeyboardOut = 0xA0, /* Out */ + kHIDUsage_KeyboardOper = 0xA1, /* Oper */ + kHIDUsage_KeyboardClearOrAgain = 0xA2, /* Clear/Again */ + kHIDUsage_KeyboardCrSelOrProps = 0xA3, /* CrSel/Props */ + kHIDUsage_KeyboardExSel = 0xA4, /* ExSel */ + /* 0xA5-0xDF Reserved */ + kHIDUsage_KeyboardLeftControl = 0xE0, /* Left Control */ + kHIDUsage_KeyboardLeftShift = 0xE1, /* Left Shift */ + kHIDUsage_KeyboardLeftAlt = 0xE2, /* Left Alt */ + kHIDUsage_KeyboardLeftGUI = 0xE3, /* Left GUI */ + kHIDUsage_KeyboardRightControl = 0xE4, /* Right Control */ + kHIDUsage_KeyboardRightShift = 0xE5, /* Right Shift */ + kHIDUsage_KeyboardRightAlt = 0xE6, /* Right Alt */ + kHIDUsage_KeyboardRightGUI = 0xE7, /* Right GUI */ + /* 0xE8-0xFFFF Reserved */ + kHIDUsage_Keyboard_Reserved = 0xFFFF +}; + +/* LEDs Page (0x08) */ +/* An LED or indicator is implemented as an On/Off Control (OOF) using the ÒSingle button toggleÓ mode, where a value of 1 will turn on the indicator, and a value of 0 will turn it off. The exceptions are described below. */ +enum +{ + kHIDUsage_LED_NumLock = 0x01, /* On/Off Control */ + kHIDUsage_LED_CapsLock = 0x02, /* On/Off Control */ + kHIDUsage_LED_ScrollLock = 0x03, /* On/Off Control */ + kHIDUsage_LED_Compose = 0x04, /* On/Off Control */ + kHIDUsage_LED_Kana = 0x05, /* On/Off Control */ + kHIDUsage_LED_Power = 0x06, /* On/Off Control */ + kHIDUsage_LED_Shift = 0x07, /* On/Off Control */ + kHIDUsage_LED_DoNotDisturb = 0x08, /* On/Off Control */ + kHIDUsage_LED_Mute = 0x09, /* On/Off Control */ + kHIDUsage_LED_ToneEnable = 0x0A, /* On/Off Control */ + kHIDUsage_LED_HighCutFilter = 0x0B, /* On/Off Control */ + kHIDUsage_LED_LowCutFilter = 0x0C, /* On/Off Control */ + kHIDUsage_LED_EqualizerEnable = 0x0D, /* On/Off Control */ + kHIDUsage_LED_SoundFieldOn = 0x0E, /* On/Off Control */ + kHIDUsage_LED_SurroundOn = 0x0F, /* On/Off Control */ + kHIDUsage_LED_Repeat = 0x10, /* On/Off Control */ + kHIDUsage_LED_Stereo = 0x11, /* On/Off Control */ + kHIDUsage_LED_SamplingRateDetect = 0x12, /* On/Off Control */ + kHIDUsage_LED_Spinning = 0x13, /* On/Off Control */ + kHIDUsage_LED_CAV = 0x14, /* On/Off Control */ + kHIDUsage_LED_CLV = 0x15, /* On/Off Control */ + kHIDUsage_LED_RecordingFormatDetect = 0x16, /* On/Off Control */ + kHIDUsage_LED_OffHook = 0x17, /* On/Off Control */ + kHIDUsage_LED_Ring = 0x18, /* On/Off Control */ + kHIDUsage_LED_MessageWaiting = 0x19, /* On/Off Control */ + kHIDUsage_LED_DataMode = 0x1A, /* On/Off Control */ + kHIDUsage_LED_BatteryOperation = 0x1B, /* On/Off Control */ + kHIDUsage_LED_BatteryOK = 0x1C, /* On/Off Control */ + kHIDUsage_LED_BatteryLow = 0x1D, /* On/Off Control */ + kHIDUsage_LED_Speaker = 0x1E, /* On/Off Control */ + kHIDUsage_LED_HeadSet = 0x1F, /* On/Off Control */ + kHIDUsage_LED_Hold = 0x20, /* On/Off Control */ + kHIDUsage_LED_Microphone = 0x21, /* On/Off Control */ + kHIDUsage_LED_Coverage = 0x22, /* On/Off Control */ + kHIDUsage_LED_NightMode = 0x23, /* On/Off Control */ + kHIDUsage_LED_SendCalls = 0x24, /* On/Off Control */ + kHIDUsage_LED_CallPickup = 0x25, /* On/Off Control */ + kHIDUsage_LED_Conference = 0x26, /* On/Off Control */ + kHIDUsage_LED_StandBy = 0x27, /* On/Off Control */ + kHIDUsage_LED_CameraOn = 0x28, /* On/Off Control */ + kHIDUsage_LED_CameraOff = 0x29, /* On/Off Control */ + kHIDUsage_LED_OnLine = 0x2A, /* On/Off Control */ + kHIDUsage_LED_OffLine = 0x2B, /* On/Off Control */ + kHIDUsage_LED_Busy = 0x2C, /* On/Off Control */ + kHIDUsage_LED_Ready = 0x2D, /* On/Off Control */ + kHIDUsage_LED_PaperOut = 0x2E, /* On/Off Control */ + kHIDUsage_LED_PaperJam = 0x2F, /* On/Off Control */ + kHIDUsage_LED_Remote = 0x30, /* On/Off Control */ + kHIDUsage_LED_Forward = 0x31, /* On/Off Control */ + kHIDUsage_LED_Reverse = 0x32, /* On/Off Control */ + kHIDUsage_LED_Stop = 0x33, /* On/Off Control */ + kHIDUsage_LED_Rewind = 0x34, /* On/Off Control */ + kHIDUsage_LED_FastForward = 0x35, /* On/Off Control */ + kHIDUsage_LED_Play = 0x36, /* On/Off Control */ + kHIDUsage_LED_Pause = 0x37, /* On/Off Control */ + kHIDUsage_LED_Record = 0x38, /* On/Off Control */ + kHIDUsage_LED_Error = 0x39, /* On/Off Control */ + kHIDUsage_LED_Usage = 0x3A, /* Selector */ + kHIDUsage_LED_UsageInUseIndicator = 0x3B, /* Usage Switch */ + kHIDUsage_LED_UsageMultiModeIndicator = 0x3C, /* Usage Modifier */ + kHIDUsage_LED_IndicatorOn = 0x3D, /* Selector */ + kHIDUsage_LED_IndicatorFlash = 0x3E, /* Selector */ + kHIDUsage_LED_IndicatorSlowBlink = 0x3F, /* Selector */ + kHIDUsage_LED_IndicatorFastBlink = 0x40, /* Selector */ + kHIDUsage_LED_IndicatorOff = 0x41, /* Selector */ + kHIDUsage_LED_FlashOnTime = 0x42, /* Dynamic Value */ + kHIDUsage_LED_SlowBlinkOnTime = 0x43, /* Dynamic Value */ + kHIDUsage_LED_SlowBlinkOffTime = 0x44, /* Dynamic Value */ + kHIDUsage_LED_FastBlinkOnTime = 0x45, /* Dynamic Value */ + kHIDUsage_LED_FastBlinkOffTime = 0x46, /* Dynamic Value */ + kHIDUsage_LED_UsageIndicatorColor = 0x47, /* Usage Modifier */ + kHIDUsage_LED_IndicatorRed = 0x48, /* Selector */ + kHIDUsage_LED_IndicatorGreen = 0x49, /* Selector */ + kHIDUsage_LED_IndicatorAmber = 0x4A, /* Selector */ + kHIDUsage_LED_GenericIndicator = 0x4B, /* On/Off Control */ + kHIDUsage_LED_SystemSuspend = 0x4C, /* On/Off Control */ + kHIDUsage_LED_ExternalPowerConnected = 0x4D, /* On/Off Control */ + kHIDUsage_LED_PlayerIndicator = 0x4E, /* Collection Logical */ + kHIDUsage_LED_Player1 = 0x4F, /* Selector */ + kHIDUsage_LED_Player2 = 0x50, /* Selector */ + kHIDUsage_LED_Player3 = 0x51, /* Selector */ + kHIDUsage_LED_Player4 = 0x52, /* Selector */ + kHIDUsage_LED_Player5 = 0x53, /* Selector */ + kHIDUsage_LED_Player6 = 0x54, /* Selector */ + kHIDUsage_LED_Player7 = 0x55, /* Selector */ + kHIDUsage_LED_Player8 = 0x56, /* Selector */ + /* 0x4E - 0xFFFF Reserved */ + kHIDUsage_LED_Reserved = 0xFFFF +}; + +/* Button Page (0x09) */ +/* The Button page is the first place an application should look for user selection controls. System graphical user interfaces typically employ a pointer and a set of hierarchical selectors to select, move and otherwise manipulate their environment. For these purposes the following assignment of significance can be applied to the Button usages: */ +/* ¥ Button 1, Primary Button. Used for object selecting, dragging, and double click activation. On MacOS, this is the only button. Microsoft operating systems call this a logical left button, because it */ +/* is not necessarily physically located on the left of the pointing device. */ +/* ¥ Button 2, Secondary Button. Used by newer graphical user interfaces to browse object properties. Exposed by systems to applications that typically assign application-specific functionality. */ +/* ¥ Button 3, Tertiary Button. Optional control. Exposed to applications, but seldom assigned functionality due to prevalence of two- and one-button devices. */ +/* ¥ Buttons 4 -55. As the button number increases, its significance as a selector decreases. */ +/* In many ways the assignment of button numbers is similar to the assignment of Effort in Physical descriptors. Button 1 would be used to define the button a finger rests on when the hand is in the Òat restÓ position, that is, virtually no effort is required by the user to activate the button. Button values increment as the finger has to stretch to reach a control. See Section 6.2.3, ÒPhysical Descriptors,Ó in the HID Specification for methods of further qualifying buttons. */ +enum +{ + kHIDUsage_Button_1 = 0x01, /* (primary/trigger) */ + kHIDUsage_Button_2 = 0x02, /* (secondary) */ + kHIDUsage_Button_3 = 0x03, /* (tertiary) */ + kHIDUsage_Button_4 = 0x04, /* 4th button */ + kHIDUsage_Button_5 = 0x05, /* (5th button) */ + kHIDUsage_Button_6 = 0x06, /* (6th button) */ + kHIDUsage_Button_7 = 0x07, /* (7th button) */ + kHIDUsage_Button_8 = 0x08, /* (8th button) */ + kHIDUsage_Button_9 = 0x09, /* (9th button) */ + kHIDUsage_Button_10 = 0x0a, /* (10th button) */ + kHIDUsage_Button_11 = 0x0b, /* (11th button) */ + kHIDUsage_Button_12 = 0x0c, /* (12th button) */ + kHIDUsage_Button_13 = 0x0d, /* (13th button) */ + kHIDUsage_Button_14 = 0x0e, /* (14th button) */ + kHIDUsage_Button_15 = 0x0f, /* (15th button) */ + kHIDUsage_Button_16 = 0x10, /* (16th button) */ + kHIDUsage_Button_17 = 0x11, /* (17th button) */ + kHIDUsage_Button_18 = 0x12, /* (18th button) */ + kHIDUsage_Button_19 = 0x13, /* (19th button) */ + kHIDUsage_Button_20 = 0x14, /* (20th button) */ + kHIDUsage_Button_21 = 0x15, /* (21st button) */ + kHIDUsage_Button_22 = 0x16, /* (22nd button) */ + kHIDUsage_Button_23 = 0x17, /* (23rd button) */ + kHIDUsage_Button_24 = 0x18, /* (24th button) */ + kHIDUsage_Button_25 = 0x19, /* (25th button) */ + kHIDUsage_Button_26 = 0x1a, /* (26th button) */ + kHIDUsage_Button_27 = 0x1b, /* (27th button) */ + kHIDUsage_Button_28 = 0x1c, /* (28th button) */ + kHIDUsage_Button_29 = 0x1d, /* (29th button) */ + kHIDUsage_Button_30 = 0x1e, /* (30th button) */ + kHIDUsage_Button_31 = 0x1f, /* (31st button) */ + kHIDUsage_Button_32 = 0x20, /* (32nd button) */ + kHIDUsage_Button_33 = 0x21, /* (33rd button) */ + kHIDUsage_Button_34 = 0x22, /* (34th button) */ + kHIDUsage_Button_35 = 0x23, /* (35th button) */ + kHIDUsage_Button_36 = 0x24, /* (36th button) */ + kHIDUsage_Button_37 = 0x25, /* (37th button) */ + kHIDUsage_Button_38 = 0x26, /* (38th button) */ + kHIDUsage_Button_39 = 0x27, /* (39th button) */ + kHIDUsage_Button_40 = 0x28, /* (40th button) */ + kHIDUsage_Button_41 = 0x29, /* (41st button) */ + kHIDUsage_Button_42 = 0x2a, /* (42nd button) */ + kHIDUsage_Button_43 = 0x2b, /* (43rd button) */ + kHIDUsage_Button_44 = 0x2c, /* (44th button) */ + kHIDUsage_Button_45 = 0x2d, /* (45th button) */ + kHIDUsage_Button_46 = 0x2e, /* (46th button) */ + kHIDUsage_Button_47 = 0x2f, /* (47th button) */ + kHIDUsage_Button_48 = 0x30, /* (48th button) */ + kHIDUsage_Button_49 = 0x31, /* (49th button) */ + kHIDUsage_Button_50 = 0x32, /* (50th button) */ + kHIDUsage_Button_51 = 0x33, /* (51st button) */ + kHIDUsage_Button_52 = 0x34, /* (52nd button) */ + kHIDUsage_Button_53 = 0x35, /* (53rd button) */ + kHIDUsage_Button_54 = 0x36, /* (54th button) */ + kHIDUsage_Button_55 = 0x37, /* (55th button) */ + kHIDUsage_Button_56 = 0x38, /* (56th button) */ + kHIDUsage_Button_57 = 0x39, /* (57th button) */ + kHIDUsage_Button_58 = 0x3a, /* (58th button) */ + kHIDUsage_Button_59 = 0x3b, /* (59th button) */ + kHIDUsage_Button_60 = 0x3c, /* (60th button) */ + kHIDUsage_Button_61 = 0x3d, /* (61st button) */ + kHIDUsage_Button_62 = 0x3e, /* (62nd button) */ + kHIDUsage_Button_63 = 0x3f, /* (63rd button) */ + kHIDUsage_Button_64 = 0x40, /* (64th button) */ + kHIDUsage_Button_65 = 0x41, /* (65th button) */ + kHIDUsage_Button_66 = 0x42, /* (66th button) */ + kHIDUsage_Button_67 = 0x43, /* (67th button) */ + kHIDUsage_Button_68 = 0x44, /* (68th button) */ + kHIDUsage_Button_69 = 0x45, /* (69th button) */ + kHIDUsage_Button_70 = 0x46, /* (70th button) */ + kHIDUsage_Button_71 = 0x47, /* (71st button) */ + kHIDUsage_Button_72 = 0x48, /* (72nd button) */ + kHIDUsage_Button_73 = 0x49, /* (73rd button) */ + kHIDUsage_Button_74 = 0x4a, /* (74th button) */ + kHIDUsage_Button_75 = 0x4b, /* (75th button) */ + kHIDUsage_Button_76 = 0x4c, /* (76th button) */ + kHIDUsage_Button_77 = 0x4d, /* (77th button) */ + kHIDUsage_Button_78 = 0x4e, /* (78th button) */ + kHIDUsage_Button_79 = 0x4f, /* (79th button) */ + kHIDUsage_Button_80 = 0x50, /* (80th button) */ + kHIDUsage_Button_81 = 0x51, /* (81st button) */ + kHIDUsage_Button_82 = 0x52, /* (82nd button) */ + kHIDUsage_Button_83 = 0x53, /* (83rd button) */ + kHIDUsage_Button_84 = 0x54, /* (84th button) */ + kHIDUsage_Button_85 = 0x55, /* (85th button) */ + kHIDUsage_Button_86 = 0x56, /* (86th button) */ + kHIDUsage_Button_87 = 0x57, /* (87th button) */ + kHIDUsage_Button_88 = 0x58, /* (88th button) */ + kHIDUsage_Button_89 = 0x59, /* (89th button) */ + kHIDUsage_Button_90 = 0x5a, /* (90th button) */ + kHIDUsage_Button_91 = 0x5b, /* (91st button) */ + kHIDUsage_Button_92 = 0x5c, /* (92nd button) */ + kHIDUsage_Button_93 = 0x5d, /* (93rd button) */ + kHIDUsage_Button_94 = 0x5e, /* (94th button) */ + kHIDUsage_Button_95 = 0x5f, /* (95th button) */ + kHIDUsage_Button_96 = 0x60, /* (96th button) */ + kHIDUsage_Button_97 = 0x61, /* (97th button) */ + kHIDUsage_Button_98 = 0x62, /* (98th button) */ + kHIDUsage_Button_99 = 0x63, /* (99th button) */ + kHIDUsage_Button_100 = 0x64, /* (100th button) */ + kHIDUsage_Button_101 = 0x65, /* (101st button) */ + kHIDUsage_Button_102 = 0x66, /* (102nd button) */ + kHIDUsage_Button_103 = 0x67, /* (103rd button) */ + kHIDUsage_Button_104 = 0x68, /* (104th button) */ + kHIDUsage_Button_105 = 0x69, /* (105th button) */ + kHIDUsage_Button_106 = 0x6a, /* (106th button) */ + kHIDUsage_Button_107 = 0x6b, /* (107th button) */ + kHIDUsage_Button_108 = 0x6c, /* (108th button) */ + kHIDUsage_Button_109 = 0x6d, /* (109th button) */ + kHIDUsage_Button_110 = 0x6e, /* (110th button) */ + kHIDUsage_Button_111 = 0x6f, /* (111th button) */ + kHIDUsage_Button_112 = 0x70, /* (112th button) */ + kHIDUsage_Button_113 = 0x71, /* (113th button) */ + kHIDUsage_Button_114 = 0x72, /* (114th button) */ + kHIDUsage_Button_115 = 0x73, /* (115th button) */ + kHIDUsage_Button_116 = 0x74, /* (116th button) */ + kHIDUsage_Button_117 = 0x75, /* (117th button) */ + kHIDUsage_Button_118 = 0x76, /* (118th button) */ + kHIDUsage_Button_119 = 0x77, /* (119th button) */ + kHIDUsage_Button_120 = 0x78, /* (120th button) */ + kHIDUsage_Button_121 = 0x79, /* (121st button) */ + kHIDUsage_Button_122 = 0x7a, /* (122nd button) */ + kHIDUsage_Button_123 = 0x7b, /* (123rd button) */ + kHIDUsage_Button_124 = 0x7c, /* (124th button) */ + kHIDUsage_Button_125 = 0x7d, /* (125th button) */ + kHIDUsage_Button_126 = 0x7e, /* (126th button) */ + kHIDUsage_Button_127 = 0x7f, /* (127th button) */ + kHIDUsage_Button_128 = 0x80, /* (128th button) */ + kHIDUsage_Button_129 = 0x81, /* (129th button) */ + kHIDUsage_Button_130 = 0x82, /* (130th button) */ + kHIDUsage_Button_131 = 0x83, /* (131st button) */ + kHIDUsage_Button_132 = 0x84, /* (132nd button) */ + kHIDUsage_Button_133 = 0x85, /* (133rd button) */ + kHIDUsage_Button_134 = 0x86, /* (134th button) */ + kHIDUsage_Button_135 = 0x87, /* (135th button) */ + kHIDUsage_Button_136 = 0x88, /* (136th button) */ + kHIDUsage_Button_137 = 0x89, /* (137th button) */ + kHIDUsage_Button_138 = 0x8a, /* (138th button) */ + kHIDUsage_Button_139 = 0x8b, /* (139th button) */ + kHIDUsage_Button_140 = 0x8c, /* (140th button) */ + kHIDUsage_Button_141 = 0x8d, /* (141st button) */ + kHIDUsage_Button_142 = 0x8e, /* (142nd button) */ + kHIDUsage_Button_143 = 0x8f, /* (143rd button) */ + kHIDUsage_Button_144 = 0x90, /* (144th button) */ + kHIDUsage_Button_145 = 0x91, /* (145th button) */ + kHIDUsage_Button_146 = 0x92, /* (146th button) */ + kHIDUsage_Button_147 = 0x93, /* (147th button) */ + kHIDUsage_Button_148 = 0x94, /* (148th button) */ + kHIDUsage_Button_149 = 0x95, /* (149th button) */ + kHIDUsage_Button_150 = 0x96, /* (150th button) */ + kHIDUsage_Button_151 = 0x97, /* (151st button) */ + kHIDUsage_Button_152 = 0x98, /* (152nd button) */ + kHIDUsage_Button_153 = 0x99, /* (153rd button) */ + kHIDUsage_Button_154 = 0x9a, /* (154th button) */ + kHIDUsage_Button_155 = 0x9b, /* (155th button) */ + kHIDUsage_Button_156 = 0x9c, /* (156th button) */ + kHIDUsage_Button_157 = 0x9d, /* (157th button) */ + kHIDUsage_Button_158 = 0x9e, /* (158th button) */ + kHIDUsage_Button_159 = 0x9f, /* (159th button) */ + kHIDUsage_Button_160 = 0xa0, /* (160th button) */ + kHIDUsage_Button_161 = 0xa1, /* (161st button) */ + kHIDUsage_Button_162 = 0xa2, /* (162nd button) */ + kHIDUsage_Button_163 = 0xa3, /* (163rd button) */ + kHIDUsage_Button_164 = 0xa4, /* (164th button) */ + kHIDUsage_Button_165 = 0xa5, /* (165th button) */ + kHIDUsage_Button_166 = 0xa6, /* (166th button) */ + kHIDUsage_Button_167 = 0xa7, /* (167th button) */ + kHIDUsage_Button_168 = 0xa8, /* (168th button) */ + kHIDUsage_Button_169 = 0xa9, /* (169th button) */ + kHIDUsage_Button_170 = 0xaa, /* (170th button) */ + kHIDUsage_Button_171 = 0xab, /* (171st button) */ + kHIDUsage_Button_172 = 0xac, /* (172nd button) */ + kHIDUsage_Button_173 = 0xad, /* (173rd button) */ + kHIDUsage_Button_174 = 0xae, /* (174th button) */ + kHIDUsage_Button_175 = 0xaf, /* (175th button) */ + kHIDUsage_Button_176 = 0xb0, /* (176th button) */ + kHIDUsage_Button_177 = 0xb1, /* (177th button) */ + kHIDUsage_Button_178 = 0xb2, /* (178th button) */ + kHIDUsage_Button_179 = 0xb3, /* (179th button) */ + kHIDUsage_Button_180 = 0xb4, /* (180th button) */ + kHIDUsage_Button_181 = 0xb5, /* (181st button) */ + kHIDUsage_Button_182 = 0xb6, /* (182nd button) */ + kHIDUsage_Button_183 = 0xb7, /* (183rd button) */ + kHIDUsage_Button_184 = 0xb8, /* (184th button) */ + kHIDUsage_Button_185 = 0xb9, /* (185th button) */ + kHIDUsage_Button_186 = 0xba, /* (186th button) */ + kHIDUsage_Button_187 = 0xbb, /* (187th button) */ + kHIDUsage_Button_188 = 0xbc, /* (188th button) */ + kHIDUsage_Button_189 = 0xbd, /* (189th button) */ + kHIDUsage_Button_190 = 0xbe, /* (190th button) */ + kHIDUsage_Button_191 = 0xbf, /* (191st button) */ + kHIDUsage_Button_192 = 0xc0, /* (192nd button) */ + kHIDUsage_Button_193 = 0xc1, /* (193rd button) */ + kHIDUsage_Button_194 = 0xc2, /* (194th button) */ + kHIDUsage_Button_195 = 0xc3, /* (195th button) */ + kHIDUsage_Button_196 = 0xc4, /* (196th button) */ + kHIDUsage_Button_197 = 0xc5, /* (197th button) */ + kHIDUsage_Button_198 = 0xc6, /* (198th button) */ + kHIDUsage_Button_199 = 0xc7, /* (199th button) */ + kHIDUsage_Button_200 = 0xc8, /* (200th button) */ + kHIDUsage_Button_201 = 0xc9, /* (201st button) */ + kHIDUsage_Button_202 = 0xca, /* (202nd button) */ + kHIDUsage_Button_203 = 0xcb, /* (203rd button) */ + kHIDUsage_Button_204 = 0xcc, /* (204th button) */ + kHIDUsage_Button_205 = 0xcd, /* (205th button) */ + kHIDUsage_Button_206 = 0xce, /* (206th button) */ + kHIDUsage_Button_207 = 0xcf, /* (207th button) */ + kHIDUsage_Button_208 = 0xd0, /* (208th button) */ + kHIDUsage_Button_209 = 0xd1, /* (209th button) */ + kHIDUsage_Button_210 = 0xd2, /* (210th button) */ + kHIDUsage_Button_211 = 0xd3, /* (211th button) */ + kHIDUsage_Button_212 = 0xd4, /* (212th button) */ + kHIDUsage_Button_213 = 0xd5, /* (213th button) */ + kHIDUsage_Button_214 = 0xd6, /* (214th button) */ + kHIDUsage_Button_215 = 0xd7, /* (215th button) */ + kHIDUsage_Button_216 = 0xd8, /* (216th button) */ + kHIDUsage_Button_217 = 0xd9, /* (217th button) */ + kHIDUsage_Button_218 = 0xda, /* (218th button) */ + kHIDUsage_Button_219 = 0xdb, /* (219th button) */ + kHIDUsage_Button_220 = 0xdc, /* (220th button) */ + kHIDUsage_Button_221 = 0xdd, /* (221st button) */ + kHIDUsage_Button_222 = 0xde, /* (222nd button) */ + kHIDUsage_Button_223 = 0xdf, /* (223rd button) */ + kHIDUsage_Button_224 = 0xe0, /* (224th button) */ + kHIDUsage_Button_225 = 0xe1, /* (225th button) */ + kHIDUsage_Button_226 = 0xe2, /* (226th button) */ + kHIDUsage_Button_227 = 0xe3, /* (227th button) */ + kHIDUsage_Button_228 = 0xe4, /* (228th button) */ + kHIDUsage_Button_229 = 0xe5, /* (229th button) */ + kHIDUsage_Button_230 = 0xe6, /* (230th button) */ + kHIDUsage_Button_231 = 0xe7, /* (231st button) */ + kHIDUsage_Button_232 = 0xe8, /* (232nd button) */ + kHIDUsage_Button_233 = 0xe9, /* (233rd button) */ + kHIDUsage_Button_234 = 0xea, /* (234th button) */ + kHIDUsage_Button_235 = 0xeb, /* (235th button) */ + kHIDUsage_Button_236 = 0xec, /* (236th button) */ + kHIDUsage_Button_237 = 0xed, /* (237th button) */ + kHIDUsage_Button_238 = 0xee, /* (238th button) */ + kHIDUsage_Button_239 = 0xef, /* (239th button) */ + kHIDUsage_Button_240 = 0xf0, /* (240th button) */ + kHIDUsage_Button_241 = 0xf1, /* (241st button) */ + kHIDUsage_Button_242 = 0xf2, /* (242nd button) */ + kHIDUsage_Button_243 = 0xf3, /* (243rd button) */ + kHIDUsage_Button_244 = 0xf4, /* (244th button) */ + kHIDUsage_Button_245 = 0xf5, /* (245th button) */ + kHIDUsage_Button_246 = 0xf6, /* (246th button) */ + kHIDUsage_Button_247 = 0xf7, /* (247th button) */ + kHIDUsage_Button_248 = 0xf8, /* (248th button) */ + kHIDUsage_Button_249 = 0xf9, /* (249th button) */ + kHIDUsage_Button_250 = 0xfa, /* (250th button) */ + kHIDUsage_Button_251 = 0xfb, /* (251st button) */ + kHIDUsage_Button_252 = 0xfc, /* (252nd button) */ + kHIDUsage_Button_253 = 0xfd, /* (253rd button) */ + kHIDUsage_Button_254 = 0xfe, /* (254th button) */ + kHIDUsage_Button_255 = 0xff, /* (255th button) */ + /* ... */ + kHIDUsage_Button_65535 = 0xFFFF +}; + +/* Ordinal Page (0x0A) */ +/* The Ordinal page allows multiple instances of a control or sets of controls to be declared without requiring individual enumeration in the native usage page. For example, it is not necessary to declare usages of Pointer 1, Pointer 2, and so forth on the Generic Desktop page. When parsed, the ordinal instance number is, in essence, concatenated to the usages attached to the encompassing collection to create Pointer 1, Pointer 2, and so forth. */ +/* For an example, see Section A.5, ÒMultiple Instances of a Control,Ó in Appendix A, ÒUsage Examples.Ó By convention, an Ordinal collection is placed inside the collection for which it is declaring multiple instances. */ +/* Instances do not have to be identical. */ +enum +{ + /* 0x00 Reserved */ + kHIDUsage_Ord_Instance1 = 0x01, /* Usage Modifier */ + kHIDUsage_Ord_Instance2 = 0x02, /* Usage Modifier */ + kHIDUsage_Ord_Instance3 = 0x03, /* Usage Modifier */ + kHIDUsage_Ord_Instance4 = 0x04, /* Usage Modifier */ + kHIDUsage_Ord_Instance65535 = 0xFFFF /* Usage Modifier */ +}; + +/* Telephony Page (0x0B) */ +/* This usage page defines the keytop and control usages for telephony devices. */ +/* Indicators on a phone are handled by wrapping them in LED: Usage In Use Indicator and LED: Usage Selected Indicator usages. For example, a message-indicator LED would be identified by a Telephony: Message usage declared as a Feature or Output in a LED: Usage In Use Indicator collection. */ +/* See Section 14, ÒConsumer Page (0x0C),Ó for audio volume and tone controls. */ +enum +{ + kHIDUsage_Tfon_Phone = 0x01, /* Application Collection */ + kHIDUsage_Tfon_AnsweringMachine = 0x02, /* Application Collection */ + kHIDUsage_Tfon_MessageControls = 0x03, /* Logical Collection */ + kHIDUsage_Tfon_Handset = 0x04, /* Logical Collection */ + kHIDUsage_Tfon_Headset = 0x05, /* Logical Collection */ + kHIDUsage_Tfon_TelephonyKeyPad = 0x06, /* Named Array */ + kHIDUsage_Tfon_ProgrammableButton = 0x07, /* Named Array */ + /* 0x08 - 0x1F Reserved */ + kHIDUsage_Tfon_HookSwitch = 0x20, /* On/Off Control */ + kHIDUsage_Tfon_Flash = 0x21, /* Momentary Control */ + kHIDUsage_Tfon_Feature = 0x22, /* One-Shot Control */ + kHIDUsage_Tfon_Hold = 0x23, /* On/Off Control */ + kHIDUsage_Tfon_Redial = 0x24, /* One-Shot Control */ + kHIDUsage_Tfon_Transfer = 0x25, /* One-Shot Control */ + kHIDUsage_Tfon_Drop = 0x26, /* One-Shot Control */ + kHIDUsage_Tfon_Park = 0x27, /* On/Off Control */ + kHIDUsage_Tfon_ForwardCalls = 0x28, /* On/Off Control */ + kHIDUsage_Tfon_AlternateFunction = 0x29, /* Momentary Control */ + kHIDUsage_Tfon_Line = 0x2A, /* One-Shot Control */ + kHIDUsage_Tfon_SpeakerPhone = 0x2B, /* On/Off Control */ + kHIDUsage_Tfon_Conference = 0x2C, /* On/Off Control */ + kHIDUsage_Tfon_RingEnable = 0x2D, /* On/Off Control */ + kHIDUsage_Tfon_Ring = 0x2E, /* Selector */ + kHIDUsage_Tfon_PhoneMute = 0x2F, /* On/Off Control */ + kHIDUsage_Tfon_CallerID = 0x30, /* Momentary Control */ + /* 0x31 - 0x4F Reserved */ + kHIDUsage_Tfon_SpeedDial = 0x50, /* One-Shot Control */ + kHIDUsage_Tfon_StoreNumber = 0x51, /* One-Shot Control */ + kHIDUsage_Tfon_RecallNumber = 0x52, /* One-Shot Control */ + kHIDUsage_Tfon_PhoneDirectory = 0x53, /* On/Off Control */ + /* 0x54 - 0x6F Reserved */ + kHIDUsage_Tfon_VoiceMail = 0x70, /* On/Off Control */ + kHIDUsage_Tfon_ScreenCalls = 0x71, /* On/Off Control */ + kHIDUsage_Tfon_DoNotDisturb = 0x72, /* On/Off Control */ + kHIDUsage_Tfon_Message = 0x73, /* One-Shot Control */ + kHIDUsage_Tfon_AnswerOnOrOff = 0x74, /* On/Off Control */ + /* 0x75 - 0x8F Reserved */ + kHIDUsage_Tfon_InsideDialTone = 0x90, /* Momentary Control */ + kHIDUsage_Tfon_OutsideDialTone = 0x91, /* Momentary Control */ + kHIDUsage_Tfon_InsideRingTone = 0x92, /* Momentary Control */ + kHIDUsage_Tfon_OutsideRingTone = 0x93, /* Momentary Control */ + kHIDUsage_Tfon_PriorityRingTone = 0x94, /* Momentary Control */ + kHIDUsage_Tfon_InsideRingback = 0x95, /* Momentary Control */ + kHIDUsage_Tfon_PriorityRingback = 0x96, /* Momentary Control */ + kHIDUsage_Tfon_LineBusyTone = 0x97, /* Momentary Control */ + kHIDUsage_Tfon_ReorderTone = 0x98, /* Momentary Control */ + kHIDUsage_Tfon_CallWaitingTone = 0x99, /* Momentary Control */ + kHIDUsage_Tfon_ConfirmationTone1 = 0x9A, /* Momentary Control */ + kHIDUsage_Tfon_ConfirmationTone2 = 0x9B, /* Momentary Control */ + kHIDUsage_Tfon_TonesOff = 0x9C, /* On/Off Control */ + kHIDUsage_Tfon_OutsideRingback = 0x9D, /* Momentary Control */ + /* 0x9E - 0xAF Reserved */ + kHIDUsage_Tfon_PhoneKey0 = 0xB0, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKey1 = 0xB1, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKey2 = 0xB2, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKey3 = 0xB3, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKey4 = 0xB4, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKey5 = 0xB5, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKey6 = 0xB6, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKey7 = 0xB7, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKey8 = 0xB8, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKey9 = 0xB9, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKeyStar = 0xBA, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKeyPound = 0xBB, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKeyA = 0xBC, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKeyB = 0xBD, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKeyC = 0xBE, /* Selector/One-Shot Control */ + kHIDUsage_Tfon_PhoneKeyD = 0xBF, /* Selector/One-Shot Control */ + /* 0xC0 - 0xFFFF Reserved */ + kHIDUsage_TFon_Reserved = 0xFFFF +}; + +/* Consumer Page (0x0C) */ +/* All controls on the Consumer page are application-specific. That is, they affect a specific device, not the system as a whole. */ +enum +{ + kHIDUsage_Csmr_ConsumerControl = 0x01, /* Application Collection */ + kHIDUsage_Csmr_NumericKeyPad = 0x02, /* Named Array */ + kHIDUsage_Csmr_ProgrammableButtons = 0x03, /* Named Array */ + kHIDUsage_Csmr_Microphone = 0x04, /* Application Collection */ + kHIDUsage_Csmr_Headphone = 0x05, /* Application Collection */ + kHIDUsage_Csmr_GraphicEqualizer = 0x06, /* Application Collection */ + /* 0x07 - 0x1F Reserved */ + kHIDUsage_Csmr_Plus10 = 0x20, /* One-Shot Control */ + kHIDUsage_Csmr_Plus100 = 0x21, /* One-Shot Control */ + kHIDUsage_Csmr_AMOrPM = 0x22, /* One-Shot Control */ + /* 0x23 - 0x3F Reserved */ + kHIDUsage_Csmr_Power = 0x30, /* On/Off Control */ + kHIDUsage_Csmr_Reset = 0x31, /* One-Shot Control */ + kHIDUsage_Csmr_Sleep = 0x32, /* One-Shot Control */ + kHIDUsage_Csmr_SleepAfter = 0x33, /* One-Shot Control */ + kHIDUsage_Csmr_SleepMode = 0x34, /* Re-Trigger Control */ + kHIDUsage_Csmr_Illumination = 0x35, /* On/Off Control */ + kHIDUsage_Csmr_FunctionButtons = 0x36, /* Named Array */ + /* 0x37 - 0x3F Reserved */ + kHIDUsage_Csmr_Menu = 0x40, /* On/Off Control */ + kHIDUsage_Csmr_MenuPick = 0x41, /* One-Shot Control */ + kHIDUsage_Csmr_MenuUp = 0x42, /* One-Shot Control */ + kHIDUsage_Csmr_MenuDown = 0x43, /* One-Shot Control */ + kHIDUsage_Csmr_MenuLeft = 0x44, /* One-Shot Control */ + kHIDUsage_Csmr_MenuRight = 0x45, /* One-Shot Control */ + kHIDUsage_Csmr_MenuEscape = 0x46, /* One-Shot Control */ + kHIDUsage_Csmr_MenuValueIncrease = 0x47, /* One-Shot Control */ + kHIDUsage_Csmr_MenuValueDecrease = 0x48, /* One-Shot Control */ + /* 0x49 - 0x5F Reserved */ + kHIDUsage_Csmr_DataOnScreen = 0x60, /* On/Off Control */ + kHIDUsage_Csmr_ClosedCaption = 0x61, /* On/Off Control */ + kHIDUsage_Csmr_ClosedCaptionSelect = 0x62, /* Selector */ + kHIDUsage_Csmr_VCROrTV = 0x63, /* On/Off Control */ + kHIDUsage_Csmr_BroadcastMode = 0x64, /* One-Shot Control */ + kHIDUsage_Csmr_Snapshot = 0x65, /* One-Shot Control */ + kHIDUsage_Csmr_Still = 0x66, /* One-Shot Control */ + kHIDUsage_Csmr_PictureInPictureToggle = 0x67, /* One-Shot Control */ + kHIDUsage_Csmr_PictureInPictureSwap = 0x68, /* One-Shot Control */ + kHIDUsage_Csmr_RedMenuButton = 0x69, /* Momentary Control */ + kHIDUsage_Csmr_GreenMenuButton = 0x6A, /* Momentary Control */ + kHIDUsage_Csmr_BlueMenuButton = 0x6B, /* Momentary Control */ + kHIDUsage_Csmr_YellowMenuButton = 0x6C, /* Momentary Control */ + kHIDUsage_Csmr_Aspect = 0x6D, /* One-shot Control */ + kHIDUsage_Csmr_3DModeSelect = 0x6E, /* One-shot Control */ + kHIDUsage_Csmr_DisplayBrightnessIncrement = 0x6F, /* Re-Trigger Control */ + kHIDUsage_Csmr_DisplayBrightnessDecrement = 0x70, /* Re-Trigger Control */ + kHIDUsage_Csmr_DisplayBrightness = 0x71, /* Logical Collection */ + kHIDUsage_Csmr_DisplayBacklightToggle = 0x72, /* One Shot Control */ + kHIDUsage_Csmr_DisplayBrightnessMinimum = 0x73, /* One Shot Control */ + kHIDUsage_Csmr_DisplayBrightnessMaximum = 0x74, /* One Shot Control */ + kHIDUsage_Csmr_DisplayBrightnessSetAutoBrightness = 0x75, /* On Off Control */ + kHIDUsage_Csmr_KeyboardBrightnessIncrement = 0x79, /* Re-Trigger Control */ + kHIDUsage_Csmr_KeyboardBrightnessDecrement = 0x7A, /* Re-Trigger Control */ + /* 0x7B - 0x7F Reserved */ + kHIDUsage_Csmr_Selection = 0x80, /* Named Array */ + kHIDUsage_Csmr_Assign = 0x81, /* Selector */ + kHIDUsage_Csmr_ModeStep = 0x82, /* One-Shot Control */ + kHIDUsage_Csmr_RecallLast = 0x83, /* One-Shot Control */ + kHIDUsage_Csmr_EnterChannel = 0x84, /* One-Shot Control */ + kHIDUsage_Csmr_OrderMovie = 0x85, /* One-Shot Control */ + kHIDUsage_Csmr_Channel = 0x86, /* Linear Control */ + kHIDUsage_Csmr_MediaSelection = 0x87, /* Selector */ + kHIDUsage_Csmr_MediaSelectComputer = 0x88, /* Selector */ + kHIDUsage_Csmr_MediaSelectTV = 0x89, /* Selector */ + kHIDUsage_Csmr_MediaSelectWWW = 0x8A, /* Selector */ + kHIDUsage_Csmr_MediaSelectDVD = 0x8B, /* Selector */ + kHIDUsage_Csmr_MediaSelectTelephone = 0x8C, /* Selector */ + kHIDUsage_Csmr_MediaSelectProgramGuide = 0x8D, /* Selector */ + kHIDUsage_Csmr_MediaSelectVideoPhone = 0x8E, /* Selector */ + kHIDUsage_Csmr_MediaSelectGames = 0x8F, /* Selector */ + kHIDUsage_Csmr_MediaSelectMessages = 0x90, /* Selector */ + kHIDUsage_Csmr_MediaSelectCD = 0x91, /* Selector */ + kHIDUsage_Csmr_MediaSelectVCR = 0x92, /* Selector */ + kHIDUsage_Csmr_MediaSelectTuner = 0x93, /* Selector */ + kHIDUsage_Csmr_Quit = 0x94, /* One-Shot Control */ + kHIDUsage_Csmr_Help = 0x95, /* On/Off Control */ + kHIDUsage_Csmr_MediaSelectTape = 0x96, /* Selector */ + kHIDUsage_Csmr_MediaSelectCable = 0x97, /* Selector */ + kHIDUsage_Csmr_MediaSelectSatellite = 0x98, /* Selector */ + kHIDUsage_Csmr_MediaSelectSecurity = 0x99, /* Selector */ + kHIDUsage_Csmr_MediaSelectHome = 0x9A, /* Selector */ + kHIDUsage_Csmr_MediaSelectCall = 0x9B, /* Selector */ + kHIDUsage_Csmr_ChannelIncrement = 0x9C, /* One-Shot Control */ + kHIDUsage_Csmr_ChannelDecrement = 0x9D, /* One-Shot Control */ + kHIDUsage_Csmr_Media = 0x9E, /* Selector */ + /* 0x9F Reserved */ + kHIDUsage_Csmr_VCRPlus = 0xA0, /* One-Shot Control */ + kHIDUsage_Csmr_Once = 0xA1, /* One-Shot Control */ + kHIDUsage_Csmr_Daily = 0xA2, /* One-Shot Control */ + kHIDUsage_Csmr_Weekly = 0xA3, /* One-Shot Control */ + kHIDUsage_Csmr_Monthly = 0xA4, /* One-Shot Control */ + /* 0xA5 - 0xAF Reserved */ + kHIDUsage_Csmr_Play = 0xB0, /* On/Off Control */ + kHIDUsage_Csmr_Pause = 0xB1, /* On/Off Control */ + kHIDUsage_Csmr_Record = 0xB2, /* On/Off Control */ + kHIDUsage_Csmr_FastForward = 0xB3, /* On/Off Control */ + kHIDUsage_Csmr_Rewind = 0xB4, /* On/Off Control */ + kHIDUsage_Csmr_ScanNextTrack = 0xB5, /* One-Shot Control */ + kHIDUsage_Csmr_ScanPreviousTrack = 0xB6, /* One-Shot Control */ + kHIDUsage_Csmr_Stop = 0xB7, /* One-Shot Control */ + kHIDUsage_Csmr_Eject = 0xB8, /* One-Shot Control */ + kHIDUsage_Csmr_RandomPlay = 0xB9, /* On/Off Control */ + kHIDUsage_Csmr_SelectDisc = 0xBA, /* Named Array */ + kHIDUsage_Csmr_EnterDisc = 0xBB, /* Momentary Control */ + kHIDUsage_Csmr_Repeat = 0xBC, /* One-Shot Control */ + kHIDUsage_Csmr_Tracking = 0xBD, /* Linear Control */ + kHIDUsage_Csmr_TrackNormal = 0xBE, /* One-Shot Control */ + kHIDUsage_Csmr_SlowTracking = 0xBF, /* Linear Control */ + kHIDUsage_Csmr_FrameForward = 0xC0, /* Re-Trigger Control */ + kHIDUsage_Csmr_FrameBack = 0xC1, /* Re-Trigger Control */ + kHIDUsage_Csmr_Mark = 0xC2, /* One-Shot Control */ + kHIDUsage_Csmr_ClearMark = 0xC3, /* One-Shot Control */ + kHIDUsage_Csmr_RepeatFromMark = 0xC4, /* On/Off Control */ + kHIDUsage_Csmr_ReturnToMark = 0xC5, /* One-Shot Control */ + kHIDUsage_Csmr_SearchMarkForward = 0xC6, /* One-Shot Control */ + kHIDUsage_Csmr_SearchMarkBackwards = 0xC7, /* One-Shot Control */ + kHIDUsage_Csmr_CounterReset = 0xC8, /* One-Shot Control */ + kHIDUsage_Csmr_ShowCounter = 0xC9, /* One-Shot Control */ + kHIDUsage_Csmr_TrackingIncrement = 0xCA, /* Re-Trigger Control */ + kHIDUsage_Csmr_TrackingDecrement = 0xCB, /* Re-Trigger Control */ + kHIDUsage_Csmr_StopOrEject = 0xCC, /* One-Shot Control */ + kHIDUsage_Csmr_PlayOrPause = 0xCD, /* One-Shot Control */ + kHIDUsage_Csmr_PlayOrSkip = 0xCE, /* One-Shot Control */ + kHIDUsage_Csmr_VoiceCommand = 0xCF, /* One-Shot Control */ + /* 0xCF - 0xDF Reserved */ + kHIDUsage_Csmr_Volume = 0xE0, /* Linear Control */ + kHIDUsage_Csmr_Balance = 0xE1, /* Linear Control */ + kHIDUsage_Csmr_Mute = 0xE2, /* On/Off Control */ + kHIDUsage_Csmr_Bass = 0xE3, /* Linear Control */ + kHIDUsage_Csmr_Treble = 0xE4, /* Linear Control */ + kHIDUsage_Csmr_BassBoost = 0xE5, /* On/Off Control */ + kHIDUsage_Csmr_SurroundMode = 0xE6, /* One-Shot Control */ + kHIDUsage_Csmr_Loudness = 0xE7, /* On/Off Control */ + kHIDUsage_Csmr_MPX = 0xE8, /* On/Off Control */ + kHIDUsage_Csmr_VolumeIncrement = 0xE9, /* Re-Trigger Control */ + kHIDUsage_Csmr_VolumeDecrement = 0xEA, /* Re-Trigger Control */ + /* 0xEB - 0xEF Reserved */ + kHIDUsage_Csmr_Speed = 0xF0, /* Selector */ + kHIDUsage_Csmr_PlaybackSpeed = 0xF1, /* Named Array */ + kHIDUsage_Csmr_StandardPlay = 0xF2, /* Selector */ + kHIDUsage_Csmr_LongPlay = 0xF3, /* Selector */ + kHIDUsage_Csmr_ExtendedPlay = 0xF4, /* Selector */ + kHIDUsage_Csmr_Slow = 0xF5, /* One-Shot Control */ + /* 0xF6 - 0xFF Reserved */ + kHIDUsage_Csmr_FanEnable = 0x100, /* On/Off Control */ + kHIDUsage_Csmr_FanSpeed = 0x101, /* Linear Control */ + kHIDUsage_Csmr_LightEnable = 0x102, /* On/Off Control */ + kHIDUsage_Csmr_LightIlluminationLevel = 0x103, /* Linear Control */ + kHIDUsage_Csmr_ClimateControlEnable = 0x104, /* On/Off Control */ + kHIDUsage_Csmr_RoomTemperature = 0x105, /* Linear Control */ + kHIDUsage_Csmr_SecurityEnable = 0x106, /* On/Off Control */ + kHIDUsage_Csmr_FireAlarm = 0x107, /* One-Shot Control */ + kHIDUsage_Csmr_PoliceAlarm = 0x108, /* One-Shot Control */ + kHIDUsage_Csmr_Proximity = 0x109, /* Linear Control */ + kHIDUsage_Csmr_Motion = 0x10A, /* One-Shot Control */ + kHIDUsage_Csmr_DuressAlarm = 0x10B, /* One-Shot Control */ + kHIDUsage_Csmr_HoldupAlarm = 0x10C, /* One-Shot Control */ + kHIDUsage_Csmr_MedicalAlarm = 0x10D, /* One-Shot Control */ + /* 0x10E - 0x14F Reserved */ + kHIDUsage_Csmr_BalanceRight = 0x150, /* Re-Trigger Control */ + kHIDUsage_Csmr_BalanceLeft = 0x151, /* Re-Trigger Control */ + kHIDUsage_Csmr_BassIncrement = 0x152, /* Re-Trigger Control */ + kHIDUsage_Csmr_BassDecrement = 0x153, /* Re-Trigger Control */ + kHIDUsage_Csmr_TrebleIncrement = 0x154, /* Re-Trigger Control */ + kHIDUsage_Csmr_TrebleDecrement = 0x155, /* Re-Trigger Control */ + /* 0x156 - 0x15F Reserved */ + kHIDUsage_Csmr_SpeakerSystem = 0x160, /* Logical Collection */ + kHIDUsage_Csmr_ChannelLeft = 0x161, /* Logical Collection */ + kHIDUsage_Csmr_ChannelRight = 0x162, /* Logical Collection */ + kHIDUsage_Csmr_ChannelCenter = 0x163, /* Logical Collection */ + kHIDUsage_Csmr_ChannelFront = 0x164, /* Logical Collection */ + kHIDUsage_Csmr_ChannelCenterFront = 0x165, /* Logical Collection */ + kHIDUsage_Csmr_ChannelSide = 0x166, /* Logical Collection */ + kHIDUsage_Csmr_ChannelSurround = 0x167, /* Logical Collection */ + kHIDUsage_Csmr_ChannelLowFrequencyEnhancement = 0x168, /* Logical Collection */ + kHIDUsage_Csmr_ChannelTop = 0x169, /* Logical Collection */ + kHIDUsage_Csmr_ChannelUnknown = 0x16A, /* Logical Collection */ + /* 0x16B - 0x16F Reserved */ + kHIDUsage_Csmr_SubChannel = 0x170, /* Linear Control */ + kHIDUsage_Csmr_SubChannelIncrement = 0x171, /* One-Shot Control */ + kHIDUsage_Csmr_SubChannelDecrement = 0x172, /* One-Shot Control */ + kHIDUsage_Csmr_AlternateAudioIncrement = 0x173, /* One-Shot Control */ + kHIDUsage_Csmr_AlternateAudioDecrement = 0x174, /* One-Shot Control */ + /* 0x175 - 0x17F Reserved */ + kHIDUsage_Csmr_ApplicationLaunchButtons = 0x180, /* Named Array */ + kHIDUsage_Csmr_ALLaunchButtonConfigurationTool = 0x181, /* Selector */ + kHIDUsage_Csmr_ALProgrammableButtonConfiguration = 0x182, /* Selector */ + kHIDUsage_Csmr_ALConsumerControlConfiguration = 0x183, /* Selector */ + kHIDUsage_Csmr_ALWordProcessor = 0x184, /* Selector */ + kHIDUsage_Csmr_ALTextEditor = 0x185, /* Selector */ + kHIDUsage_Csmr_ALSpreadsheet = 0x186, /* Selector */ + kHIDUsage_Csmr_ALGraphicsEditor = 0x187, /* Selector */ + kHIDUsage_Csmr_ALPresentationApp = 0x188, /* Selector */ + kHIDUsage_Csmr_ALDatabaseApp = 0x189, /* Selector */ + kHIDUsage_Csmr_ALEmailReader = 0x18A, /* Selector */ + kHIDUsage_Csmr_ALNewsreader = 0x18B, /* Selector */ + kHIDUsage_Csmr_ALVoicemail = 0x18C, /* Selector */ + kHIDUsage_Csmr_ALContactsOrAddressBook = 0x18D, /* Selector */ + kHIDUsage_Csmr_ALCalendarOrSchedule = 0x18E, /* Selector */ + kHIDUsage_Csmr_ALTaskOrProjectManager = 0x18F, /* Selector */ + kHIDUsage_Csmr_ALLogOrJournalOrTimecard = 0x190, /* Selector */ + kHIDUsage_Csmr_ALCheckbookOrFinance = 0x191, /* Selector */ + kHIDUsage_Csmr_ALCalculator = 0x192, /* Selector */ + kHIDUsage_Csmr_ALAOrVCaptureOrPlayback = 0x193, /* Selector */ + kHIDUsage_Csmr_ALLocalMachineBrowser = 0x194, /* Selector */ + kHIDUsage_Csmr_ALLANOrWANBrowser = 0x195, /* Selector */ + kHIDUsage_Csmr_ALInternetBrowser = 0x196, /* Selector */ + kHIDUsage_Csmr_ALRemoteNetworkingOrISPConnect = 0x197, /* Selector */ + kHIDUsage_Csmr_ALNetworkConference = 0x198, /* Selector */ + kHIDUsage_Csmr_ALNetworkChat = 0x199, /* Selector */ + kHIDUsage_Csmr_ALTelephonyOrDialer = 0x19A, /* Selector */ + kHIDUsage_Csmr_ALLogon = 0x19B, /* Selector */ + kHIDUsage_Csmr_ALLogoff = 0x19C, /* Selector */ + kHIDUsage_Csmr_ALLogonOrLogoff = 0x19D, /* Selector */ + kHIDUsage_Csmr_ALTerminalLockOrScreensaver = 0x19E, /* Selector */ + kHIDUsage_Csmr_ALControlPanel = 0x19F, /* Selector */ + kHIDUsage_Csmr_ALCommandLineProcessorOrRun = 0x1A0, /* Selector */ + kHIDUsage_Csmr_ALProcessOrTaskManager = 0x1A1, /* Selector */ + kHIDUsage_Csmr_AL = 0x1A2, /* Selector */ + kHIDUsage_Csmr_ALNextTaskOrApplication = 0x1A3, /* Selector */ + kHIDUsage_Csmr_ALPreviousTaskOrApplication = 0x1A4, /* Selector */ + kHIDUsage_Csmr_ALPreemptiveHaltTaskOrApplication = 0x1A5, /* Selector */ + kHIDUsage_Csmr_ALIntegratedHelpCenter = 0x1A6, /* Selector */ + kHIDUsage_Csmr_ALDocuments = 0x1A7, /* Selector */ + kHIDUsage_Csmr_ALThesaurus = 0x1A8, /* Selector */ + kHIDUsage_Csmr_ALDictionary = 0x1A9, /* Selector */ + kHIDUsage_Csmr_ALDesktop = 0x1AA, /* Selector */ + kHIDUsage_Csmr_ALSpellCheck = 0x1AB, /* Selector */ + kHIDUsage_Csmr_ALGrammerCheck = 0x1AC, /* Selector */ + kHIDUsage_Csmr_ALWirelessStatus = 0x1AD, /* Selector */ + kHIDUsage_Csmr_ALKeyboardLayout = 0x1AE, /* Selector */ + kHIDUsage_Csmr_ALVirusProtection = 0x1AF, /* Selector */ + kHIDUsage_Csmr_ALEncryption = 0x1B0, /* Selector */ + kHIDUsage_Csmr_ALScreenSaver = 0x1B1, /* Selector */ + kHIDUsage_Csmr_ALAlarms = 0x1B2, /* Selector */ + kHIDUsage_Csmr_ALClock = 0x1B3, /* Selector */ + kHIDUsage_Csmr_ALFileBrowser = 0x1B4, /* Selector */ + kHIDUsage_Csmr_ALPowerStatus = 0x1B5, /* Selector */ + kHIDUsage_Csmr_ALImageBrowser = 0x1B6, /* Selector */ + kHIDUsage_Csmr_ALAudioBrowser = 0x1B7, /* Selector */ + kHIDUsage_Csmr_ALMovieBrowser = 0x1B8, /* Selector */ + kHIDUsage_Csmr_ALDigitalRightsManager = 0x1B9, /* Selector */ + kHIDUsage_Csmr_ALDigitalWallet = 0x1BA, /* Selector */ + /* 0x1BB Reserved */ + kHIDUsage_Csmr_ALInstantMessaging = 0x1BC, /* Selector */ + kHIDUsage_Csmr_ALOEMFeatureBrowser = 0x1BD, /* Selector */ + kHIDUsage_Csmr_ALOEMHelp = 0x1BE, /* Selector */ + kHIDUsage_Csmr_ALOnlineCommunity = 0x1BF, /* Selector */ + kHIDUsage_Csmr_ALEntertainmentContentBrowser = 0x1C0, /* Selector */ + kHIDUsage_Csmr_ALOnlineShoppingBrowswer = 0x1C1, /* Selector */ + kHIDUsage_Csmr_ALSmartCardInformationOrHelp = 0x1C2, /* Selector */ + kHIDUsage_Csmr_ALMarketMonitorOrFinanceBrowser = 0x1C3, /* Selector */ + kHIDUsage_Csmr_ALCustomizedCorporateNewsBrowser = 0x1C4, /* Selector */ + kHIDUsage_Csmr_ALOnlineActivityBrowswer= 0x1C5, /* Selector */ + kHIDUsage_Csmr_ALResearchOrSearchBrowswer = 0x1C6, /* Selector */ + kHIDUsage_Csmr_ALAudioPlayer= 0x1C7, /* Selector */ + kHIDUsage_Csmr_ALNavigation = 0x1C8, /* Selector */ + /* 0x1C9 - 0x1FF Reserved */ + kHIDUsage_Csmr_GenericGUIApplicationControls = 0x200, /* Named Array */ + kHIDUsage_Csmr_ACNew = 0x201, /* Selector */ + kHIDUsage_Csmr_ACOpen = 0x202, /* Selector */ + kHIDUsage_Csmr_ACClose = 0x203, /* Selector */ + kHIDUsage_Csmr_ACExit = 0x204, /* Selector */ + kHIDUsage_Csmr_ACMaximize = 0x205, /* Selector */ + kHIDUsage_Csmr_ACMinimize = 0x206, /* Selector */ + kHIDUsage_Csmr_ACSave = 0x207, /* Selector */ + kHIDUsage_Csmr_ACPrint = 0x208, /* Selector */ + kHIDUsage_Csmr_ACProperties = 0x209, /* Selector */ + kHIDUsage_Csmr_ACUndo = 0x21A, /* Selector */ + kHIDUsage_Csmr_ACCopy = 0x21B, /* Selector */ + kHIDUsage_Csmr_ACCut = 0x21C, /* Selector */ + kHIDUsage_Csmr_ACPaste = 0x21D, /* Selector */ + kHIDUsage_Csmr_AC = 0x21E, /* Selector */ + kHIDUsage_Csmr_ACFind = 0x21F, /* Selector */ + kHIDUsage_Csmr_ACFindandReplace = 0x220, /* Selector */ + kHIDUsage_Csmr_ACSearch = 0x221, /* Selector */ + kHIDUsage_Csmr_ACGoTo = 0x222, /* Selector */ + kHIDUsage_Csmr_ACHome = 0x223, /* Selector */ + kHIDUsage_Csmr_ACBack = 0x224, /* Selector */ + kHIDUsage_Csmr_ACForward = 0x225, /* Selector */ + kHIDUsage_Csmr_ACStop = 0x226, /* Selector */ + kHIDUsage_Csmr_ACRefresh = 0x227, /* Selector */ + kHIDUsage_Csmr_ACPreviousLink = 0x228, /* Selector */ + kHIDUsage_Csmr_ACNextLink = 0x229, /* Selector */ + kHIDUsage_Csmr_ACBookmarks = 0x22A, /* Selector */ + kHIDUsage_Csmr_ACHistory = 0x22B, /* Selector */ + kHIDUsage_Csmr_ACSubscriptions = 0x22C, /* Selector */ + kHIDUsage_Csmr_ACZoomIn = 0x22D, /* Selector */ + kHIDUsage_Csmr_ACZoomOut = 0x22E, /* Selector */ + kHIDUsage_Csmr_ACZoom = 0x22F, /* Selector */ + kHIDUsage_Csmr_ACFullScreenView = 0x230, /* Selector */ + kHIDUsage_Csmr_ACNormalView = 0x231, /* Selector */ + kHIDUsage_Csmr_ACViewToggle = 0x232, /* Selector */ + kHIDUsage_Csmr_ACScrollUp = 0x233, /* Selector */ + kHIDUsage_Csmr_ACScrollDown = 0x234, /* Selector */ + kHIDUsage_Csmr_ACScroll = 0x235, /* Selector */ + kHIDUsage_Csmr_ACPanLeft = 0x236, /* Selector */ + kHIDUsage_Csmr_ACPanRight = 0x237, /* Selector */ + kHIDUsage_Csmr_ACPan = 0x238, /* Selector */ + kHIDUsage_Csmr_ACNewWindow = 0x239, /* Selector */ + kHIDUsage_Csmr_ACTileHorizontally = 0x23A, /* Selector */ + kHIDUsage_Csmr_ACTileVertically = 0x23B, /* Selector */ + kHIDUsage_Csmr_ACFormat = 0x23C, /* Selector */ + kHIDUsage_Csmr_ACEdit = 0x23D, /* Selector */ + kHIDUsage_Csmr_ACBold = 0x23E, /* Selector */ + kHIDUsage_Csmr_ACItalics = 0x23F, /* Selector */ + kHIDUsage_Csmr_ACUnderline = 0x240, /* Selector */ + kHIDUsage_Csmr_ACStrikethrough = 0x241, /* Selector */ + kHIDUsage_Csmr_ACSubscript = 0x242, /* Selector */ + kHIDUsage_Csmr_ACSuperscript = 0x243, /* Selector */ + kHIDUsage_Csmr_ACAllCaps = 0x244, /* Selector */ + kHIDUsage_Csmr_ACRotate = 0x245, /* Selector */ + kHIDUsage_Csmr_ACResize = 0x246, /* Selector */ + kHIDUsage_Csmr_ACFlipHorizontal = 0x247, /* Selector */ + kHIDUsage_Csmr_ACFlipVertical = 0x248, /* Selector */ + kHIDUsage_Csmr_ACMirrorHorizontal = 0x249, /* Selector */ + kHIDUsage_Csmr_ACMirrorVertical = 0x24A, /* Selector */ + kHIDUsage_Csmr_ACFontSelect = 0x24B, /* Selector */ + kHIDUsage_Csmr_ACFontColor = 0x24C, /* Selector */ + kHIDUsage_Csmr_ACFontSize = 0x24D, /* Selector */ + kHIDUsage_Csmr_ACJustifyLeft = 0x24E, /* Selector */ + kHIDUsage_Csmr_ACJustifyCenterH = 0x24F, /* Selector */ + kHIDUsage_Csmr_ACJustifyRight = 0x250, /* Selector */ + kHIDUsage_Csmr_ACJustifyBlockH = 0x251, /* Selector */ + kHIDUsage_Csmr_ACJustifyTop = 0x252, /* Selector */ + kHIDUsage_Csmr_ACJustifyCenterV = 0x253, /* Selector */ + kHIDUsage_Csmr_ACJustifyBottom = 0x254, /* Selector */ + kHIDUsage_Csmr_ACJustifyBlockV = 0x255, /* Selector */ + kHIDUsage_Csmr_ACIndentyDecrease = 0x256, /* Selector */ + kHIDUsage_Csmr_ACIndentyIncrease = 0x257, /* Selector */ + kHIDUsage_Csmr_ACNumberedList = 0x258, /* Selector */ + kHIDUsage_Csmr_ACRestartNumbering = 0x259, /* Selector */ + kHIDUsage_Csmr_ACBulletedList = 0x25A, /* Selector */ + kHIDUsage_Csmr_ACPromote = 0x25B, /* Selector */ + kHIDUsage_Csmr_ACDemote = 0x25C, /* Selector */ + kHIDUsage_Csmr_ACYes = 0x25D, /* Selector */ + kHIDUsage_Csmr_ACNo = 0x25E, /* Selector */ + kHIDUsage_Csmr_ACCancel = 0x25F, /* Selector */ + kHIDUsage_Csmr_ACCatalog = 0x260, /* Selector */ + kHIDUsage_Csmr_ACBuyOrCheckout = 0x261, /* Selector */ + kHIDUsage_Csmr_ACAddToCart = 0x262, /* Selector */ + kHIDUsage_Csmr_ACExpand = 0x263, /* Selector */ + kHIDUsage_Csmr_ACExpandAll = 0x264, /* Selector */ + kHIDUsage_Csmr_ACCollapse = 0x265, /* Selector */ + kHIDUsage_Csmr_ACCollapseAll = 0x266, /* Selector */ + kHIDUsage_Csmr_ACPrintPreview = 0x267, /* Selector */ + kHIDUsage_Csmr_ACPasteSpecial = 0x268, /* Selector */ + kHIDUsage_Csmr_ACInsertMode = 0x269, /* Selector */ + kHIDUsage_Csmr_ACDelete = 0x26A, /* Selector */ + kHIDUsage_Csmr_ACLock = 0x26B, /* Selector */ + kHIDUsage_Csmr_ACUnlock = 0x26C, /* Selector */ + kHIDUsage_Csmr_ACProtect = 0x26D, /* Selector */ + kHIDUsage_Csmr_ACUnprotect = 0x26E, /* Selector */ + kHIDUsage_Csmr_ACAttachComment = 0x26F, /* Selector */ + kHIDUsage_Csmr_ACDetachComment = 0x270, /* Selector */ + kHIDUsage_Csmr_ACViewComment = 0x271, /* Selector */ + kHIDUsage_Csmr_ACSelectWord = 0x272, /* Selector */ + kHIDUsage_Csmr_ACSelectSentence = 0x273, /* Selector */ + kHIDUsage_Csmr_ACSelectParagraph = 0x274, /* Selector */ + kHIDUsage_Csmr_ACSelectColumn = 0x275, /* Selector */ + kHIDUsage_Csmr_ACSelectRow = 0x276, /* Selector */ + kHIDUsage_Csmr_ACSelectTable = 0x277, /* Selector */ + kHIDUsage_Csmr_ACSelectObject = 0x278, /* Selector */ + kHIDUsage_Csmr_ACRedoOrRepeat = 0x279, /* Selector */ + kHIDUsage_Csmr_ACSort = 0x27A, /* Selector */ + kHIDUsage_Csmr_ACSortAscending = 0x27B, /* Selector */ + kHIDUsage_Csmr_ACSortDescending = 0x27C, /* Selector */ + kHIDUsage_Csmr_ACFilter = 0x27D, /* Selector */ + kHIDUsage_Csmr_ACSetClock = 0x27E, /* Selector */ + kHIDUsage_Csmr_ACViewClock = 0x27F, /* Selector */ + kHIDUsage_Csmr_ACSelectTimeZone = 0x280, /* Selector */ + kHIDUsage_Csmr_ACEditTimeZones = 0x281, /* Selector */ + kHIDUsage_Csmr_ACSetAlarm = 0x282, /* Selector */ + kHIDUsage_Csmr_ACClearAlarm = 0x283, /* Selector */ + kHIDUsage_Csmr_ACSnoozeAlarm = 0x284, /* Selector */ + kHIDUsage_Csmr_ACResetAlarm = 0x285, /* Selector */ + kHIDUsage_Csmr_ACSynchronize = 0x286, /* Selector */ + kHIDUsage_Csmr_ACSendOrReceive = 0x287, /* Selector */ + kHIDUsage_Csmr_ACSendTo = 0x288, /* Selector */ + kHIDUsage_Csmr_ACReply = 0x289, /* Selector */ + kHIDUsage_Csmr_ACReplyAll = 0x28A, /* Selector */ + kHIDUsage_Csmr_ACForwardMessage = 0x28B, /* Selector */ + kHIDUsage_Csmr_ACSend = 0x28C, /* Selector */ + kHIDUsage_Csmr_ACAttachFile = 0x28D, /* Selector */ + kHIDUsage_Csmr_ACUpload = 0x28E, /* Selector */ + kHIDUsage_Csmr_ACDownload = 0x28F, /* Selector */ + kHIDUsage_Csmr_ACSetBorders = 0x290, /* Selector */ + kHIDUsage_Csmr_ACInsertRow = 0x291, /* Selector */ + kHIDUsage_Csmr_ACInsertColumn = 0x292, /* Selector */ + kHIDUsage_Csmr_ACInsertFile = 0x293, /* Selector */ + kHIDUsage_Csmr_ACInsertPicture = 0x294, /* Selector */ + kHIDUsage_Csmr_ACInsertObject = 0x295, /* Selector */ + kHIDUsage_Csmr_ACInsertSymbol = 0x296, /* Selector */ + kHIDUsage_Csmr_ACSaveAndClose = 0x297, /* Selector */ + kHIDUsage_Csmr_ACRename = 0x298, /* Selector */ + kHIDUsage_Csmr_ACMerge = 0x299, /* Selector */ + kHIDUsage_Csmr_ACSplit = 0x29A, /* Selector */ + kHIDUsage_Csmr_ACDistributeH = 0x29B, /* Selector */ + kHIDUsage_Csmr_ACDistributeV = 0x29C, /* Selector */ + kHIDUsage_Csmr_ACKeyboardLayoutSelect = 0x29D, /* One-Shot Control */ + kHIDUsage_Csmr_ACNavigationGuidance = 0x29E, /* Selector */ + kHIDUsage_Csmr_ACDesktopShowAllWindows = 0x29F, /* Selector */ + kHIDUsage_Csmr_ACDesktopShowAllApplications = 0x2A0, /* Selector */ + /* 0x2A1 - 0xFFFF Reserved */ + kHIDUsage_Csmr_Reserved = 0xFFFF +}; + +/* Digitizer Page (0x0D) */ +/* This section provides detailed descriptions of the usages employed by Digitizer Devices. */ +enum +{ + kHIDUsage_Dig_Digitizer = 0x01, /* Application Collection */ + kHIDUsage_Dig_Pen = 0x02, /* Application Collection */ + kHIDUsage_Dig_LightPen = 0x03, /* Application Collection */ + kHIDUsage_Dig_TouchScreen = 0x04, /* Application Collection */ + kHIDUsage_Dig_TouchPad = 0x05, /* Application Collection */ + kHIDUsage_Dig_WhiteBoard = 0x06, /* Application Collection */ + kHIDUsage_Dig_CoordinateMeasuringMachine = 0x07, /* Application Collection */ + kHIDUsage_Dig_3DDigitizer = 0x08, /* Application Collection */ + kHIDUsage_Dig_StereoPlotter = 0x09, /* Application Collection */ + kHIDUsage_Dig_ArticulatedArm = 0x0A, /* Application Collection */ + kHIDUsage_Dig_Armature = 0x0B, /* Application Collection */ + kHIDUsage_Dig_MultiplePointDigitizer = 0x0C, /* Application Collection */ + kHIDUsage_Dig_FreeSpaceWand = 0x0D, /* Application Collection */ + kHIDUsage_Dig_DeviceConfiguration = 0x0E, /* Application Collection */ + /* 0x0F - 0x1F Reserved */ + kHIDUsage_Dig_Stylus = 0x20, /* Logical Collection */ + kHIDUsage_Dig_Puck = 0x21, /* Logical Collection */ + kHIDUsage_Dig_Finger = 0x22, /* Logical Collection */ + kHIDUsage_Dig_DeviceSettings = 0x23, /* Logical Collection */ + kHIDUsage_Dig_GestureCharacter = 0x24, /* Logical Collection */ + /* 0x25 - 0x2F Reserved */ + kHIDUsage_Dig_TipPressure = 0x30, /* Dynamic Value */ + kHIDUsage_Dig_BarrelPressure = 0x31, /* Dynamic Value */ + kHIDUsage_Dig_InRange = 0x32, /* Momentary Control */ + kHIDUsage_Dig_Touch = 0x33, /* Momentary Control */ + kHIDUsage_Dig_Untouch = 0x34, /* One-Shot Control */ + kHIDUsage_Dig_Tap = 0x35, /* One-Shot Control */ + kHIDUsage_Dig_Quality = 0x36, /* Dynamic Value */ + kHIDUsage_Dig_DataValid = 0x37, /* Momentary Control */ + kHIDUsage_Dig_TransducerIndex = 0x38, /* Dynamic Value */ + kHIDUsage_Dig_TabletFunctionKeys = 0x39, /* Logical Collection */ + kHIDUsage_Dig_ProgramChangeKeys = 0x3A, /* Logical Collection */ + kHIDUsage_Dig_BatteryStrength = 0x3B, /* Dynamic Value */ + kHIDUsage_Dig_Invert = 0x3C, /* Momentary Control */ + kHIDUsage_Dig_XTilt = 0x3D, /* Dynamic Value */ + kHIDUsage_Dig_YTilt = 0x3E, /* Dynamic Value */ + kHIDUsage_Dig_Azimuth = 0x3F, /* Dynamic Value */ + kHIDUsage_Dig_Altitude = 0x40, /* Dynamic Value */ + kHIDUsage_Dig_Twist = 0x41, /* Dynamic Value */ + kHIDUsage_Dig_TipSwitch = 0x42, /* Momentary Control */ + kHIDUsage_Dig_SecondaryTipSwitch = 0x43, /* Momentary Control */ + kHIDUsage_Dig_BarrelSwitch = 0x44, /* Momentary Control */ + kHIDUsage_Dig_Eraser = 0x45, /* Momentary Control */ + kHIDUsage_Dig_TabletPick = 0x46, /* Momentary Control */ + kHIDUsage_Dig_TouchValid = 0x47, /* Momentary Control */ + kHIDUsage_Dig_Width = 0x48, /* Dynamic Value */ + kHIDUsage_Dig_Height = 0x49, /* Dynamic Value */ + /* 0x4A - 0x50 Reserved */ + kHIDUsage_Dig_ContactIdentifier = 0x51, /* Dynamic Value */ + kHIDUsage_Dig_DeviceMode = 0x52, /* Dynamic Value */ + kHIDUsage_Dig_DeviceIdentifier = 0x53, /* Dynamic Value */ + kHIDUsage_Dig_ContactCount = 0x54, /* Dynamic Value */ + kHIDUsage_Dig_ContactCountMaximum = 0x55, /* Static Value */ + kHIDUsage_Dig_RelativeScanTime = 0x56, /* Dynamic Value */ + kHIDUsage_Dig_SurfaceSwitch = 0x57, /* Dynamic Flag */ + + /* 0x56 - 0x5F Reserved */ + kHIDUsage_Dig_GestureCharacterEnable = 0x60, /* Dynamic Flag */ + kHIDUsage_Dig_GestureCharacterQuality = 0x61, /* Dynamic Value */ + kHIDUsage_Dig_GestureCharacterDataLength = 0x62, /* Dynamic Value */ + kHIDUsage_Dig_GestureCharacterData = 0x63, /* Buffered Bytes */ + kHIDUsage_Dig_GestureCharacterEncoding = 0x64, /* Named Array */ + kHIDUsage_Dig_GestureCharacterEncodingUTF8 = 0x65, /* Selector */ + kHIDUsage_Dig_GestureCharacterEncodingUTF16LE = 0x66, /* Selector */ + kHIDUsage_Dig_GestureCharacterEncodingUTF16BE = 0x67, /* Selector */ + kHIDUsage_Dig_GestureCharacterEncodingUTF32LE = 0x68, /* Selector */ + kHIDUsage_Dig_GestureCharacterEncodingUTF32BE = 0x69, /* Selector */ + + kHIDUsage_Dig_ReportRate = 0xA1, /* Dynamic Value */ + + /* 0x70 - 0xFFFF Reserved */ + kHIDUsage_Dig_Reserved = 0xFFFF +}; + +/* Physical Interface Device Page (0x0F) */ +/* This section provides detailed descriptions of the usages employed by Power Devices. */ +enum +{ + kHIDUsage_PID_PhysicalInterfaceDevice = 0x01, /* CA - A collection of PID usages */ + /* 0x02 - 0x1F Reserved */ + kHIDUsage_PID_Normal = 0x20, /* DV - A force applied perpendicular to the surface of an object */ + kHIDUsage_PID_SetEffectReport = 0x21, /* XXX */ + kHIDUsage_PID_EffectBlockIndex = 0x22, /* XXX */ + kHIDUsage_PID_ParamBlockOffset = 0x23, /* XXX */ + kHIDUsage_PID_ROM_Flag = 0x24, /* XXX */ + kHIDUsage_PID_EffectType = 0x25, /* XXX */ + kHIDUsage_PID_ET_ConstantForce = 0x26, /* XXX */ + kHIDUsage_PID_ET_Ramp = 0x27, /* XXX */ + kHIDUsage_PID_ET_CustomForceData = 0x28, /* XXX */ + /* 0x29 - 0x2F Reserved */ + kHIDUsage_PID_ET_Square = 0x30, /* XXX */ + kHIDUsage_PID_ET_Sine = 0x31, /* XXX */ + kHIDUsage_PID_ET_Triangle = 0x32, /* XXX */ + kHIDUsage_PID_ET_SawtoothUp = 0x33, /* XXX */ + kHIDUsage_PID_ET_SawtoothDown = 0x34, /* XXX */ + /* 0x35 - 0x3F Reserved */ + kHIDUsage_PID_ET_Spring = 0x40, /* XXX */ + kHIDUsage_PID_ET_Damper = 0x41, /* XXX */ + kHIDUsage_PID_ET_Inertia = 0x42, /* XXX */ + kHIDUsage_PID_ET_Friction = 0x43, /* XXX */ + /* 0x44 - 0x4F Reserved */ + kHIDUsage_PID_Duration = 0x50, /* XXX */ + kHIDUsage_PID_SamplePeriod = 0x51, /* XXX */ + kHIDUsage_PID_Gain = 0x52, /* XXX */ + kHIDUsage_PID_TriggerButton = 0x53, /* XXX */ + kHIDUsage_PID_TriggerRepeatInterval = 0x54, /* XXX */ + kHIDUsage_PID_AxesEnable = 0x55, /* XXX */ + kHIDUsage_PID_DirectionEnable = 0x56, /* XXX */ + kHIDUsage_PID_Direction = 0x57, /* XXX */ + kHIDUsage_PID_TypeSpecificBlockOffset = 0x58, /* XXX */ + kHIDUsage_PID_BlockType = 0x59, /* XXX */ + kHIDUsage_PID_SetEnvelopeReport = 0x5A, /* XXX */ + kHIDUsage_PID_AttackLevel = 0x5B, /* XXX */ + kHIDUsage_PID_AttackTime = 0x5C, /* XXX */ + kHIDUsage_PID_FadeLevel = 0x5D, /* XXX */ + kHIDUsage_PID_FadeTime = 0x5E, /* XXX */ + kHIDUsage_PID_SetConditionReport = 0x5F, /* XXX */ + + kHIDUsage_PID_CP_Offset = 0x60, /* XXX */ + kHIDUsage_PID_PositiveCoefficient = 0x61, /* XXX */ + kHIDUsage_PID_NegativeCoefficient = 0x62, /* XXX */ + kHIDUsage_PID_PositiveSaturation = 0x63, /* XXX */ + kHIDUsage_PID_NegativeSaturation = 0x64, /* XXX */ + kHIDUsage_PID_DeadBand = 0x65, /* XXX */ + kHIDUsage_PID_DownloadForceSample = 0x66, /* XXX */ + kHIDUsage_PID_IsochCustomForceEnable = 0x67, /* XXX */ + kHIDUsage_PID_CustomForceDataReport = 0x68, /* XXX */ + kHIDUsage_PID_CustomForceData = 0x69, /* XXX */ + kHIDUsage_PID_CustomForceVendorDefinedData = 0x6A, /* XXX */ + kHIDUsage_PID_SetCustomForceReport = 0x6B, /* XXX */ + kHIDUsage_PID_CustomForceDataOffset = 0x6C, /* XXX */ + kHIDUsage_PID_SampleCount = 0x6D, /* XXX */ + kHIDUsage_PID_SetPeriodicReport = 0x6E, /* XXX */ + kHIDUsage_PID_Offset = 0x6F, /* XXX */ + + kHIDUsage_PID_Magnitude = 0x70, /* XXX */ + kHIDUsage_PID_Phase = 0x71, /* XXX */ + kHIDUsage_PID_Period = 0x72, /* XXX */ + kHIDUsage_PID_SetConstantForceReport = 0x73, /* XXX */ + kHIDUsage_PID_SetRampForceReport = 0x74, /* XXX */ + kHIDUsage_PID_RampStart = 0x75, /* XXX */ + kHIDUsage_PID_RampEnd = 0x76, /* XXX */ + kHIDUsage_PID_EffectOperationReport = 0x77, /* XXX */ + kHIDUsage_PID_EffectOperation = 0x78, /* XXX */ + kHIDUsage_PID_OpEffectStart = 0x79, /* XXX */ + kHIDUsage_PID_OpEffectStartSolo = 0x7A, /* XXX */ + kHIDUsage_PID_OpEffectStop = 0x7B, /* XXX */ + kHIDUsage_PID_LoopCount = 0x7C, /* XXX */ + kHIDUsage_PID_DeviceGainReport = 0x7D, /* XXX */ + kHIDUsage_PID_DeviceGain = 0x7E, /* XXX */ + kHIDUsage_PID_PoolReport = 0x7F, /* XXX */ + + kHIDUsage_PID_RAM_PoolSize = 0x80, /* XXX */ + kHIDUsage_PID_ROM_PoolSize = 0x81, /* XXX */ + kHIDUsage_PID_ROM_EffectBlockCount = 0x82, /* XXX */ + kHIDUsage_PID_SimultaneousEffectsMax = 0x83, /* XXX */ + kHIDUsage_PID_PoolAlignment = 0x84, /* XXX */ + kHIDUsage_PID_PoolMoveReport = 0x85, /* XXX */ + kHIDUsage_PID_MoveSource = 0x86, /* XXX */ + kHIDUsage_PID_MoveDestination = 0x87, /* XXX */ + kHIDUsage_PID_MoveLength = 0x88, /* XXX */ + kHIDUsage_PID_BlockLoadReport = 0x89, /* XXX */ + /* 0x8A Reserved */ + kHIDUsage_PID_BlockLoadStatus = 0x8B, /* XXX */ + kHIDUsage_PID_BlockLoadSuccess = 0x8C, /* XXX */ + kHIDUsage_PID_BlockLoadFull = 0x8D, /* XXX */ + kHIDUsage_PID_BlockLoadError = 0x8E, /* XXX */ + kHIDUsage_PID_BlockHandle = 0x8F, /* XXX */ + + kHIDUsage_PID_BlockFreeReport = 0x90, /* XXX */ + kHIDUsage_PID_TypeSpecificBlockHandle = 0x91, /* XXX */ + kHIDUsage_PID_StateReport = 0x92, /* XXX */ + /* 0x93 Reserved */ + kHIDUsage_PID_EffectPlaying = 0x94, /* XXX */ + kHIDUsage_PID_DeviceControlReport = 0x95, /* XXX */ + kHIDUsage_PID_DeviceControl = 0x96, /* XXX */ + kHIDUsage_PID_DC_EnableActuators = 0x97, /* XXX */ + kHIDUsage_PID_DC_DisableActuators = 0x98, /* XXX */ + kHIDUsage_PID_DC_StopAllEffects = 0x99, /* XXX */ + kHIDUsage_PID_DC_DeviceReset = 0x9A, /* XXX */ + kHIDUsage_PID_DC_DevicePause = 0x9B, /* XXX */ + kHIDUsage_PID_DC_DeviceContinue = 0x9C, /* XXX */ + /* 0x9d - 0x9E Reserved */ + kHIDUsage_PID_DevicePaused = 0x9F, /* XXX */ + + kHIDUsage_PID_ActuatorsEnabled = 0xA0, /* XXX */ + /* 0xA1 - 0xA3 Reserved */ + kHIDUsage_PID_SafetySwitch = 0xA4, /* XXX */ + kHIDUsage_PID_ActuatorOverrideSwitch = 0xA5, /* XXX */ + kHIDUsage_PID_ActuatorPower = 0xA6, /* XXX */ + kHIDUsage_PID_StartDelay = 0xA7, /* XXX */ + kHIDUsage_PID_ParameterBlockSize = 0xA8, /* XXX */ + kHIDUsage_PID_DeviceManagedPool = 0xA9, /* XXX */ + kHIDUsage_PID_SharedParameterBlocks = 0xAA, /* XXX */ + kHIDUsage_PID_CreateNewEffectReport = 0xAB, /* XXX */ + kHIDUsage_PID_RAM_PoolAvailable = 0xAC, /* XXX */ + /* 0xAD - 0xFFFF Reserved */ + kHIDUsage_PID_Reserved = 0xFFFF +}; + +/* AlphanumericDisplay Page (0x14) */ +/* The Alphanumeric Display page is intended for use by simple alphanumeric displays that are used on consumer devices. */ +enum +{ + kHIDUsage_AD_AlphanumericDisplay = 0x01, /* Application Collection */ + /* 0x02 - 0x1F Reserved */ + kHIDUsage_AD_DisplayAttributesReport = 0x20, /* Logical Collection */ + kHIDUsage_AD_ASCIICharacterSet = 0x21, /* Static Flag */ + kHIDUsage_AD_DataReadBack = 0x22, /* Static Flag */ + kHIDUsage_AD_FontReadBack = 0x23, /* Static Flag */ + kHIDUsage_AD_DisplayControlReport = 0x24, /* Logical Collection */ + kHIDUsage_AD_ClearDisplay = 0x25, /* Dynamic Flag */ + kHIDUsage_AD_DisplayEnable = 0x26, /* Dynamic Flag */ + kHIDUsage_AD_ScreenSaverDelay = 0x27, /* Static Value */ + kHIDUsage_AD_ScreenSaverEnable = 0x28, /* Dynamic Flag */ + kHIDUsage_AD_VerticalScroll = 0x29, /* Static Flag */ + kHIDUsage_AD_HorizontalScroll = 0x2A, /* Static Flag */ + kHIDUsage_AD_CharacterReport = 0x2B, /* Logical Collection */ + kHIDUsage_AD_DisplayData = 0x2C, /* Dynamic Value */ + kHIDUsage_AD_DisplayStatus = 0x2D, /* Logical Collection */ + kHIDUsage_AD_StatNotReady = 0x2E, /* Selector */ + kHIDUsage_AD_StatReady = 0x2F, /* Selector */ + kHIDUsage_AD_ErrNotaloadablecharacter = 0x30, /* Selector */ + kHIDUsage_AD_ErrFontdatacannotberead = 0x31, /* Selector */ + kHIDUsage_AD_CursorPositionReport = 0x32, /* Logical Collection */ + kHIDUsage_AD_Row = 0x33, /* Dynamic Value */ + kHIDUsage_AD_Column = 0x34, /* Dynamic Value */ + kHIDUsage_AD_Rows = 0x35, /* Static Value */ + kHIDUsage_AD_Columns = 0x36, /* Static Value */ + kHIDUsage_AD_CursorPixelPositioning = 0x37, /* Static Flag */ + kHIDUsage_AD_CursorMode = 0x38, /* Dynamic Flag */ + kHIDUsage_AD_CursorEnable = 0x39, /* Dynamic Flag */ + kHIDUsage_AD_CursorBlink = 0x3A, /* Dynamic Flag */ + kHIDUsage_AD_FontReport = 0x3B, /* Logical Collection */ + kHIDUsage_AD_FontData = 0x3C, /* Buffered Byte */ + kHIDUsage_AD_CharacterWidth = 0x3D, /* Static Value */ + kHIDUsage_AD_CharacterHeight = 0x3E, /* Static Value */ + kHIDUsage_AD_CharacterSpacingHorizontal = 0x3F, /* Static Value */ + kHIDUsage_AD_CharacterSpacingVertical = 0x40, /* Static Value */ + kHIDUsage_AD_UnicodeCharacterSet = 0x41, /* Static Flag */ + /* 0x42 - 0xFFFF Reserved */ + kHIDUsage_AD_Reserved = 0xFFFF +}; + +/* Sensor Page (0x20) */ +/* The Sensor page is intended for use by devices that capture biometric, electrical, environmental, light, location, mechanical, motion, orientation, scanner, etc events. */ +enum +{ + kHIDUsage_Snsr_Undefined = 0x00, + kHIDUsage_Snsr_Sensor = 0x01, /* Application/Physical Collection */ + /* 0x02 - 0x0F Reserved */ + kHIDUsage_Snsr_Biometric = 0x10, /* Application/Physical Collection */ + kHIDUsage_Snsr_Biometric_HumanPresence = 0x11, /* Application/Physical Collection */ + kHIDUsage_Snsr_Biometric_HumanProximity = 0x12, /* Application/Physical Collection */ + kHIDUsage_Snsr_Biometric_HumanTouch = 0x13, /* Application/Physical Collection */ + /* 0x14 - 0x1F Reserved */ + kHIDUsage_Snsr_Electrical = 0x20, /* Application/Physical Collection */ + kHIDUsage_Snsr_Electrical_Capacitance = 0x21, /* Application/Physical Collection */ + kHIDUsage_Snsr_Electrical_Current = 0x22, /* Application/Physical Collection */ + kHIDUsage_Snsr_Electrical_Power = 0x23, /* Application/Physical Collection */ + kHIDUsage_Snsr_Electrical_Inductance = 0x24, /* Application/Physical Collection */ + kHIDUsage_Snsr_Electrical_Resistance = 0x25, /* Application/Physical Collection */ + kHIDUsage_Snsr_Electrical_Voltage = 0x26, /* Application/Physical Collection */ + kHIDUsage_Snsr_Electrical_Potentiometer = 0x27, /* Application/Physical Collection */ + kHIDUsage_Snsr_Electrical_Frequency = 0x28, /* Application/Physical Collection */ + kHIDUsage_Snsr_Electrical_Period = 0x29, /* Application/Physical Collection */ + /* 0x2A - 0x2F Reserved */ + kHIDUsage_Snsr_Environmental = 0x30, /* Application/Physical Collection */ + kHIDUsage_Snsr_Environmental_AtmosphericPressure = 0x31, /* Application/Physical Collection */ + kHIDUsage_Snsr_Environmental_Humidity = 0x32, /* Application/Physical Collection */ + kHIDUsage_Snsr_Environmental_Temperature = 0x33, /* Application/Physical Collection */ + kHIDUsage_Snsr_Environmental_WindDirection = 0x34, /* Application/Physical Collection */ + kHIDUsage_Snsr_Environmental_WindSpeed = 0x35, /* Application/Physical Collection */ + /* 0x36 - 0x3F Reserved */ + kHIDUsage_Snsr_Light = 0x40, /* Application/Physical Collection */ + kHIDUsage_Snsr_Light_AmbientLight = 0x41, /* Application/Physical Collection */ + kHIDUsage_Snsr_Light_ConsumerInfrared = 0x42, /* Application/Physical Collection */ + /* 0x43 - 0x4F Reserved */ + kHIDUsage_Snsr_Location = 0x50, /* Application/Physical Collection */ + kHIDUsage_Snsr_Location_Broadcast = 0x51, /* Application/Physical Collection */ + kHIDUsage_Snsr_Location_DeadReckoning = 0x52, /* Application/Physical Collection */ + kHIDUsage_Snsr_Location_GPS = 0x53, /* Application/Physical Collection */ + kHIDUsage_Snsr_Location_Lookup = 0x54, /* Application/Physical Collection */ + kHIDUsage_Snsr_Location_Other = 0x55, /* Application/Physical Collection */ + kHIDUsage_Snsr_Location_Static = 0x56, /* Application/Physical Collection */ + kHIDUsage_Snsr_Location_Triangulation = 0x57, /* Application/Physical Collection */ + /* 0x58 - 0x5F Reserved */ + kHIDUsage_Snsr_Mechanical = 0x60, /* Application/Physical Collection */ + kHIDUsage_Snsr_Mechanical_BooleanSwitch = 0x61, /* Application/Physical Collection */ + kHIDUsage_Snsr_Mechanical_BooleanSwitchArray = 0x62, /* Application/Physical Collection */ + kHIDUsage_Snsr_Mechanical_MultivalueSwitch = 0x63, /* Application/Physical Collection */ + kHIDUsage_Snsr_Mechanical_Force = 0x64, /* Application/Physical Collection */ + kHIDUsage_Snsr_Mechanical_Pressure = 0x65, /* Application/Physical Collection */ + kHIDUsage_Snsr_Mechanical_Strain = 0x66, /* Application/Physical Collection */ + kHIDUsage_Snsr_Mechanical_Weight = 0x67, /* Application/Physical Collection */ + kHIDUsage_Snsr_Mechanical_HapticVibrator = 0x68, /* Application/Physical Collection */ + kHIDUsage_Snsr_Mechanical_HallEffectSwitch = 0x69, /* Application/Physical Collection */ + /* 0x6A - 0x6F Reserved */ + kHIDUsage_Snsr_Motion = 0x70, /* Application/Physical Collection */ + kHIDUsage_Snsr_Motion_Accelerometer1D = 0x71, /* Application/Physical Collection */ + kHIDUsage_Snsr_Motion_Accelerometer2D = 0x72, /* Application/Physical Collection */ + kHIDUsage_Snsr_Motion_Accelerometer3D = 0x73, /* Application/Physical Collection */ + kHIDUsage_Snsr_Motion_Gyrometer1D = 0x74, /* Application/Physical Collection */ + kHIDUsage_Snsr_Motion_Gyrometer2D = 0x75, /* Application/Physical Collection */ + kHIDUsage_Snsr_Motion_Gyrometer3D = 0x76, /* Application/Physical Collection */ + kHIDUsage_Snsr_Motion_MotionDetector = 0x77, /* Application/Physical Collection */ + kHIDUsage_Snsr_Motion_Speedometer = 0x78, /* Application/Physical Collection */ + kHIDUsage_Snsr_Motion_Accelerometer = 0x79, /* Application/Physical Collection */ + kHIDUsage_Snsr_Motion_Gyrometer = 0x7A, /* Application/Physical Collection */ + /* 0x7B - 0x7F Reserved */ + kHIDUsage_Snsr_Orientation = 0x80, /* Application/Physical Collection */ + kHIDUsage_Snsr_Orientation_Compass1D = 0x81, /* Application/Physical Collection */ + kHIDUsage_Snsr_Orientation_Compass2D = 0x82, /* Application/Physical Collection */ + kHIDUsage_Snsr_Orientation_Compass3D = 0x83, /* Application/Physical Collection */ + kHIDUsage_Snsr_Orientation_Inclinometer1D = 0x84, /* Application/Physical Collection */ + kHIDUsage_Snsr_Orientation_Inclinometer2D = 0x85, /* Application/Physical Collection */ + kHIDUsage_Snsr_Orientation_Inclinometer3D = 0x86, /* Application/Physical Collection */ + kHIDUsage_Snsr_Orientation_Distance1D = 0x87, /* Application/Physical Collection */ + kHIDUsage_Snsr_Orientation_Distance2D = 0x88, /* Application/Physical Collection */ + kHIDUsage_Snsr_Orientation_Distance3D = 0x89, /* Application/Physical Collection */ + kHIDUsage_Snsr_Orientation_DeviceOrientation = 0x8A, /* Application/Physical Collection */ + kHIDUsage_Snsr_Orientation_CompassD = 0x8B, /* Application/Physical Collection */ + kHIDUsage_Snsr_Orientation_InclinometerD = 0x8C, /* Application/Physical Collection */ + kHIDUsage_Snsr_Orientation_DistanceD = 0x8D, /* Application/Physical Collection */ + /* 0x8E - 0x8F Reserved */ + kHIDUsage_Snsr_Scanner = 0x90, /* Application/Physical Collection */ + kHIDUsage_Snsr_Scanner_Barcode = 0x91, /* Application/Physical Collection */ + kHIDUsage_Snsr_Scanner_RFID = 0x92, /* Application/Physical Collection */ + kHIDUsage_Snsr_Scanner_NFC = 0x93, /* Application/Physical Collection */ + /* 0x94 - 0x9F Reserved */ + kHIDUsage_Snsr_Time = 0xA0, /* Application/Physical Collection */ + kHIDUsage_Snsr_Time_AlarmTimer = 0xA1, /* Application/Physical Collection */ + kHIDUsage_Snsr_Time_RealTimeClock = 0xA2, /* Application/Physical Collection */ + /* 0xA3 - 0xDF Reserved */ + kHIDUsage_Snsr_Other = 0xE0, /* Application/Physical Collection */ + kHIDUsage_Snsr_Other_Custom = 0xE1, /* Application/Physical Collection */ + kHIDUsage_Snsr_Other_Generic = 0xE2, /* Application/Physical Collection */ + kHIDUsage_Snsr_Other_GenericEnumerator = 0xE3, /* Application/Physical Collection */ + /* 0xE4 - 0xEF Reserved */ + /* 0xF0 - 0xFF Vendor Reserved */ + + /* Common Sensor Type Data Fields */ + + /* Usage Switches used in conjunction with other Data Usages. The value of the modifier is OR-ed in to the upper nibble of the 16bit Data Usage. */ + kHIDUsage_Snsr_Modifier_None = 0x0, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_ChangeSensitivityAbsolute = 0x1, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_Max = 0x2, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_Min = 0x3, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_Accuracy = 0x4, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_Resolution = 0x5, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_ThresholdHigh = 0x6, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_ThresholdLow = 0x7, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_CalibrationOffset = 0x8, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_CalibrationMultiplier = 0x9, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_ReportInterval = 0xA, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_FrequencyMax = 0xB, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_PeriodMax = 0xC, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_ChangeSensitivityPercentRange = 0xD, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_ChangeSensitivityPercentRelative = 0xE, /* Data Field Usage Switch */ + kHIDUsage_Snsr_Modifier_VendorDefined = 0xF, /* Data Field Usage Switch */ + + /* Event Usages */ + kHIDUsage_Snsr_Event = 0x0200, + kHIDUsage_Snsr_Event_SensorState = 0x0201, + kHIDUsage_Snsr_Event_SensorEvent = 0x0202, + /* 0x0203 - 0x02FF Event Reserved */ + + kHIDUsage_Snsr_Event_SensorState_Undefined = 0x0800, + kHIDUsage_Snsr_Event_SensorState_Ready = 0x0801, + kHIDUsage_Snsr_Event_SensorState_NotAvailable = 0x0802, + kHIDUsage_Snsr_Event_SensorState_NoData = 0x0803, + kHIDUsage_Snsr_Event_SensorState_Initializing = 0x0804, + kHIDUsage_Snsr_Event_SensorState_AccessDenied = 0x0805, + kHIDUsage_Snsr_Event_SensorState_Error = 0x0806, + /* 0x0807 - 0x080F Reserved */ + + kHIDUsage_Snsr_Event_SensorEvent_Unknown = 0x0810, + kHIDUsage_Snsr_Event_SensorEvent_StateChanged = 0x0811, + kHIDUsage_Snsr_Event_SensorEvent_PropertyChanged = 0x0812, + kHIDUsage_Snsr_Event_SensorEvent_DataUpdated = 0x0813, + kHIDUsage_Snsr_Event_SensorEvent_PollResponse = 0x0814, + kHIDUsage_Snsr_Event_SensorEvent_ChangeSensitivity = 0x0815, + kHIDUsage_Snsr_Event_SensorEvent_RangeMaxReached = 0x0816, + kHIDUsage_Snsr_Event_SensorEvent_RangeMinReached = 0x0817, + kHIDUsage_Snsr_Event_SensorEvent_HighThresholdCrossUp = 0x0818, + kHIDUsage_Snsr_Event_SensorEvent_HighThresholdCrossDown = 0x0819, + kHIDUsage_Snsr_Event_SensorEvent_LowThresholdCrossUp = 0x081A, + kHIDUsage_Snsr_Event_SensorEvent_LowThresholdCrossDown = 0x081B, + kHIDUsage_Snsr_Event_SensorEvent_ZeroThresholdCrossUp = 0x081C, + kHIDUsage_Snsr_Event_SensorEvent_ZeroThresholdCrossDown = 0x081D, + kHIDUsage_Snsr_Event_SensorEvent_PeriodExceeded = 0x081E, + kHIDUsage_Snsr_Event_SensorEvent_FrequencyExceeded = 0x081F, + kHIDUsage_Snsr_Event_SensorEvent_ComplexTrigger = 0x0820, + /* 0x0821 - 0x082F Reserved */ + + /* Property Usages */ + kHIDUsage_Snsr_Property = 0x0300, + kHIDUsage_Snsr_Property_FriendlyName = 0x0301, + kHIDUsage_Snsr_Property_PersistentUniqueID = 0x0302, + kHIDUsage_Snsr_Property_SensorStatus = 0x0303, + kHIDUsage_Snsr_Property_MinimumReportInterval = 0x0304, + kHIDUsage_Snsr_Property_Manufacturer = 0x0305, + kHIDUsage_Snsr_Property_Model = 0x0306, + kHIDUsage_Snsr_Property_SerialNumber = 0x0307, + kHIDUsage_Snsr_Property_Description = 0x0308, + kHIDUsage_Snsr_Property_ConnectionType = 0x0309, + kHIDUsage_Snsr_Property_DevicePath = 0x030A, + kHIDUsage_Snsr_Property_HardwareRevision = 0x030B, + kHIDUsage_Snsr_Property_FirmwareVersion = 0x030C, + kHIDUsage_Snsr_Property_ReleaseData = 0x030D, + kHIDUsage_Snsr_Property_ReportInterval = 0x030E, + kHIDUsage_Snsr_Property_ChangeSensitivityAbsolute = 0x030F, + kHIDUsage_Snsr_Property_ChangeSensitivityPercentRange = 0x0310, + kHIDUsage_Snsr_Property_ChangeSensitivityPercentRelative = 0x0311, + kHIDUsage_Snsr_Property_Accuracy = 0x0312, + kHIDUsage_Snsr_Property_Resolution = 0x0313, + kHIDUsage_Snsr_Property_Maximum = 0x0314, + kHIDUsage_Snsr_Property_Minimum = 0x0315, + kHIDUsage_Snsr_Property_ReportingState = 0x0316, + kHIDUsage_Snsr_Property_SamplingRate = 0x0317, + kHIDUsage_Snsr_Property_ResponseCurve = 0x0318, + kHIDUsage_Snsr_Property_PowerState = 0x0319, + kHIDUsage_Snsr_Property_MaxFIFOEvents = 0x031A, + kHIDUsage_Snsr_Property_ReportLatency = 0x031B, + + /* 0x031C - 0x03FF Reserved */ + + kHIDUsage_Snsr_Property_ConnectionType_Integrated = 0x0830, + kHIDUsage_Snsr_Property_ConnectionType_Attached = 0x0831, + kHIDUsage_Snsr_Property_ConnectionType_External = 0x0832, + /* 0x0833 - 0x083F Reserved */ + kHIDUsage_Snsr_Property_ReportingState_NoEvents = 0x0840, + kHIDUsage_Snsr_Property_ReportingState_AllEvents = 0x0841, + kHIDUsage_Snsr_Property_ReportingState_ThresholdEvents = 0x0842, + kHIDUsage_Snsr_Property_ReportingState_WakeNoEvents = 0x0843, + kHIDUsage_Snsr_Property_ReportingState_WakeAllEvents = 0x0844, + kHIDUsage_Snsr_Property_ReportingState_WakeThresholdEvents = 0x0845, + /* 0x0846 - 0x084F Reserved */ + kHIDUsage_Snsr_Property_PowerState_Undefined = 0x0850, + kHIDUsage_Snsr_Property_PowerState_D0_FullPower = 0x0851, + kHIDUsage_Snsr_Property_PowerState_D1_LowPower = 0x0852, + kHIDUsage_Snsr_Property_PowerState_D2_Standby = 0x0853, + kHIDUsage_Snsr_Property_PowerState_D3_Sleep = 0x0854, + kHIDUsage_Snsr_Property_PowerState_D4_PowerOff = 0x0855, + /* 0x0855 - 0x085F Reserved */ + kHIDUsage_Snsr_Light_Illuminance = 0x04D1, + + /* Specific Sensor Type Data Fields */ + + /* Location Sensor Data Fields */ + kHIDUsage_Snsr_Data_Location = 0x0400, + kHIDUsage_Snsr_Data_Location_Reserved = 0x0401, + kHIDUsage_Snsr_Data_Location_AltitudeAntennaSeaLevel = 0x0402, + kHIDUsage_Snsr_Data_Location_DifferentialReferenceStationID = 0x0403, + kHIDUsage_Snsr_Data_Location_AltitudeEllipsoidError = 0x0404, + kHIDUsage_Snsr_Data_Location_AltitudeEllipsoid = 0x0405, + kHIDUsage_Snsr_Data_Location_AltitudeSeaLevelError = 0x0406, + kHIDUsage_Snsr_Data_Location_AltitudeSeaLevel = 0x0407, + kHIDUsage_Snsr_Data_Location_DifferentialGPSDataAge = 0x0408, + kHIDUsage_Snsr_Data_Location_ErrorRadius = 0x0409, + + kHIDUsage_Snsr_Data_Location_FixQuality = 0x040A, + kHIDUsage_Snsr_Data_Location_FixQualityNoFix = 0x0870, + kHIDUsage_Snsr_Data_Location_FixQualityGPS = 0x0871, + kHIDUsage_Snsr_Data_Location_FixQualityDGPS = 0x0872, + + kHIDUsage_Snsr_Data_Location_FixType = 0x040B, + kHIDUsage_Snsr_Data_Location_FixTypeNoFix = 0x0880, + kHIDUsage_Snsr_Data_Location_FixTypeGPSSPSMode = 0x0881, + kHIDUsage_Snsr_Data_Location_FixTypeDGPSSPSMode = 0x0882, + kHIDUsage_Snsr_Data_Location_FixTypeGPSPPSMode = 0x0883, + kHIDUsage_Snsr_Data_Location_FixTypeRealTimeKinematic = 0x0884, + kHIDUsage_Snsr_Data_Location_FixTypeFloatRTK = 0x0885, + kHIDUsage_Snsr_Data_Location_FixTypeEstimated = 0x0886, + kHIDUsage_Snsr_Data_Location_FixTypeManualInputMode = 0x0887, + kHIDUsage_Snsr_Data_Location_FixTypeSimulatorMode = 0x0888, + + kHIDUsage_Snsr_Data_Location_GeoidalSeparation = 0x040C, + + kHIDUsage_Snsr_Data_Location_GPSOperationMode = 0x040D, + kHIDUsage_Snsr_Data_Location_GPSOperationModeManual = 0x0890, + kHIDUsage_Snsr_Data_Location_GPSOperationModeAutomatic = 0x0891, + + kHIDUsage_Snsr_Data_Location_GPSSelectionMode = 0x040E, + kHIDUsage_Snsr_Data_Location_GPSSelectionModeAutonomous = 0x08A0, + kHIDUsage_Snsr_Data_Location_GPSSelectionModeDGPS = 0x08A1, + kHIDUsage_Snsr_Data_Location_GPSSelectionModeEstimated = 0x08A2, + kHIDUsage_Snsr_Data_Location_GPSSelectionModeManualInput = 0x08A3, + kHIDUsage_Snsr_Data_Location_GPSSelectionModeSimulator = 0x08A4, + kHIDUsage_Snsr_Data_Location_GPSSelectionModeDataNotValid = 0x08A5, + + kHIDUsage_Snsr_Data_Location_GPSStatus = 0x040F, + kHIDUsage_Snsr_Data_Location_GPSStatusDataValid = 0x08B0, + kHIDUsage_Snsr_Data_Location_GPSStatusDataNotValid = 0x08B1, + + kHIDUsage_Snsr_Data_Location_PositionDilutionOfPrecision = 0x0410, + kHIDUsage_Snsr_Data_Location_HorizontalDilutionOfPrecision = 0x0411, + kHIDUsage_Snsr_Data_Location_VerticalDilutionOfPrecision = 0x0412, + kHIDUsage_Snsr_Data_Location_Latitude = 0x0413, + kHIDUsage_Snsr_Data_Location_Longitude = 0x0414, + kHIDUsage_Snsr_Data_Location_TrueHeading = 0x0415, + kHIDUsage_Snsr_Data_Location_MagneticHeading = 0x0416, + kHIDUsage_Snsr_Data_Location_MagneticVariation = 0x0417, + kHIDUsage_Snsr_Data_Location_Speed = 0x0418, + kHIDUsage_Snsr_Data_Location_SatellitesInView = 0x0419, + kHIDUsage_Snsr_Data_Location_SatellitesInViewAzimuth = 0x041A, + kHIDUsage_Snsr_Data_Location_SatellitesInViewElevation = 0x041B, + kHIDUsage_Snsr_Data_Location_SatellitesInViewIDs = 0x041C, + kHIDUsage_Snsr_Data_Location_SatellitesInViewPRNs = 0x041D, + kHIDUsage_Snsr_Data_Location_SatellitesInViewSNRatios = 0x041E, + kHIDUsage_Snsr_Data_Location_SatellitesUsedCount = 0x041F, + kHIDUsage_Snsr_Data_Location_SatellitesUsedPRNs = 0x0420, + kHIDUsage_Snsr_Data_Location_NMEASentence = 0x0421, + kHIDUsage_Snsr_Data_Location_AddressLine1 = 0x0422, + kHIDUsage_Snsr_Data_Location_AddressLine2 = 0x0423, + kHIDUsage_Snsr_Data_Location_City = 0x0424, + kHIDUsage_Snsr_Data_Location_StateOrProvince = 0x0425, + kHIDUsage_Snsr_Data_Location_CountryOrRegion = 0x0426, + kHIDUsage_Snsr_Data_Location_PostalCode = 0x0427, + /* 0x0428 - 0x0429 Reserved */ + + /* Location Sensor Properties */ + kHIDUsage_Snsr_Property_Location = 0x042A, + kHIDUsage_Snsr_Property_Location_DesiredAccuracy = 0x042B, + kHIDUsage_Snsr_Property_Location_AccuracyDefault = 0x0860, + kHIDUsage_Snsr_Property_Location_AccuracyHigh = 0x0861, + kHIDUsage_Snsr_Property_Location_AccuracyMedium = 0x0862, + kHIDUsage_Snsr_Property_Location_AccuracyLow = 0x0863, + /* 0x042C - 0x042F Reserved */ + + /* Environmental Sensor Data Fields */ + kHIDUsage_Snsr_Data_Environmental = 0x0430, + kHIDUsage_Snsr_Data_Environmental_AtmosphericPressure = 0x0431, + kHIDUsage_Snsr_Data_Environmental_Reserved = 0x0432, + kHIDUsage_Snsr_Data_Environmental_RelativeHumidity = 0x0433, + kHIDUsage_Snsr_Data_Environmental_Temperature = 0x0434, + kHIDUsage_Snsr_Data_Environmental_WindDirection = 0x0435, + kHIDUsage_Snsr_Data_Environmental_WindSpeed = 0x0436, + /* 0x0437 - 0x043F Reserved */ + + /* Environmental Sensor Properties */ + kHIDUsage_Snsr_Property_Environmental = 0x0440, + kHIDUsage_Snsr_Property_Environmental_ReferencePressure = 0x0441, + /* 0x0442 - 0x044F Reserved */ + + /* Motion Sensor Data Fields */ + kHIDUsage_Snsr_Data_Motion = 0x0450, + kHIDUsage_Snsr_Data_Motion_State = 0x0451, + kHIDUsage_Snsr_Data_Motion_Acceleration = 0x0452, + kHIDUsage_Snsr_Data_Motion_AccelerationAxisX = 0x0453, + kHIDUsage_Snsr_Data_Motion_AccelerationAxisY = 0x0454, + kHIDUsage_Snsr_Data_Motion_AccelerationAxisZ = 0x0455, + kHIDUsage_Snsr_Data_Motion_AngularVelocity = 0x0456, + kHIDUsage_Snsr_Data_Motion_AngularVelocityXAxis = 0x0457, + kHIDUsage_Snsr_Data_Motion_AngularVelocityYAxis = 0x0458, + kHIDUsage_Snsr_Data_Motion_AngularVelocityZAxis = 0x0459, + kHIDUsage_Snsr_Data_Motion_AngularPosition = 0x045A, + kHIDUsage_Snsr_Data_Motion_AngularPositionXAxis = 0x045B, + kHIDUsage_Snsr_Data_Motion_AngularPositionYAxis = 0x045C, + kHIDUsage_Snsr_Data_Motion_AngularPositionZAxis = 0x045D, + kHIDUsage_Snsr_Data_Motion_Speed = 0x045E, + kHIDUsage_Snsr_Data_Motion_Intensity = 0x045F, + /* 0x0460 - 0x046F Reserved */ + + /* Orientation Sensor Data Fields */ + kHIDUsage_Snsr_Data_Orientation = 0x0470, + kHIDUsage_Snsr_Data_Orientation_Heading = 0x0471, + kHIDUsage_Snsr_Data_Orientation_HeadingXAxis = 0x0472, + kHIDUsage_Snsr_Data_Orientation_HeadingYAxis = 0x0473, + kHIDUsage_Snsr_Data_Orientation_HeadingZAxis = 0x0474, + kHIDUsage_Snsr_Data_Orientation_HeadingCompensatedMagneticNorth = 0x0475, + kHIDUsage_Snsr_Data_Orientation_HeadingCompensatedTrueNorth = 0x0476, + kHIDUsage_Snsr_Data_Orientation_HeadingMagneticNorth = 0x0477, + kHIDUsage_Snsr_Data_Orientation_HeadingTrueNorth = 0x0478, + kHIDUsage_Snsr_Data_Orientation_Distance = 0x0479, + kHIDUsage_Snsr_Data_Orientation_DistanceXAxis = 0x047A, + kHIDUsage_Snsr_Data_Orientation_DistanceYAxis = 0x047B, + kHIDUsage_Snsr_Data_Orientation_DistanceZAxis = 0x047C, + kHIDUsage_Snsr_Data_Orientation_DistanceOutOfRange = 0x047D, + kHIDUsage_Snsr_Data_Orientation_Tilt = 0x047E, + kHIDUsage_Snsr_Data_Orientation_TiltXAxis = 0x047F, + kHIDUsage_Snsr_Data_Orientation_TiltYAxis = 0x0480, + kHIDUsage_Snsr_Data_Orientation_TiltZAxis = 0x0481, + kHIDUsage_Snsr_Data_Orientation_RotationMatrix = 0x0482, + kHIDUsage_Snsr_Data_Orientation_Quaternion = 0x0483, + kHIDUsage_Snsr_Data_Orientation_MagneticFlux = 0x0484, + kHIDUsage_Snsr_Data_Orientation_MagneticFluxXAxis = 0x0485, + kHIDUsage_Snsr_Data_Orientation_MagneticFluxYAxis = 0x0486, + kHIDUsage_Snsr_Data_Orientation_MagneticFluxZAxis = 0x0487, + /* 0x0488 - 0x048F Reserved */ + + /* Mechanical Sensor Data Field */ + kHIDUsage_Snsr_Data_Mechanical = 0x0490, + kHIDUsage_Snsr_Data_Mechanical_BooleanSwitchState = 0x0491, + kHIDUsage_Snsr_Data_Mechanical_BooleanSwitchArrayStates = 0x0492, + kHIDUsage_Snsr_Data_Mechanical_MultivalueSwitchValue = 0x0493, + kHIDUsage_Snsr_Data_Mechanical_Force = 0x0494, + kHIDUsage_Snsr_Data_Mechanical_AbsolutePressure = 0x0495, + kHIDUsage_Snsr_Data_Mechanical_GaugePressure = 0x0496, + kHIDUsage_Snsr_Data_Mechanical_Strain = 0x0497, + kHIDUsage_Snsr_Data_Mechanical_Weight = 0x0498, + /* 0x0499 - 0x49F Reserved */ + + /* Mechanical Sensor Properties */ + kHIDUsage_Snsr_Property_Mechanical = 0x04A0, + kHIDUsage_Snsr_Property_Mechanical_VibrationState = 0x04A1, + kHIDUsage_Snsr_Property_Mechanical_ForwardVibrationSpeed = 0x04A2, + kHIDUsage_Snsr_Property_Mechanical_BackwardVibrationSpeed = 0x04A3, + /* 0x04A4 - 0x04AF Reserved */ + + /* Biometric Sensor Data Fields */ + kHIDUsage_Snsr_Data_Biometric = 0x04B0, + kHIDUsage_Snsr_Data_Biometric_HumanPresence = 0x04B1, + kHIDUsage_Snsr_Data_Biometric_HumanProximityRange = 0x04B2, + kHIDUsage_Snsr_Data_Biometric_HumanProximityOutOfRange = 0x04B3, + kHIDUsage_Snsr_Data_Biometric_HumanTouchState = 0x04B4, + /* 0x04B5 - 0x04CF Reserved */ + + /* Light Sensor Data Fields */ + kHIDUsage_Snsr_Data_Light = 0x04D0, + kHIDUsage_Snsr_Data_Light_Illuminance = 0x04D1, + kHIDUsage_Snsr_Data_Light_ColorTemperature = 0x04D2, + kHIDUsage_Snsr_Data_Light_Chromaticity = 0x04D3, + kHIDUsage_Snsr_Data_Light_ChromaticityX = 0x04D4, + kHIDUsage_Snsr_Data_Light_ChromaticityY = 0x04D5, + kHIDUsage_Snsr_Data_Light_ConsumerIRSentenceReceive = 0x04D6, + /* 0x04D7 - 0x04DF Reserved */ + + /* Light Sensor Properties */ + kHIDUsage_Snsr_Property_Light = 0x04E0, + kHIDUsage_Snsr_Property_Light_ConsumerIRSentenceSend = 0x04E1, + /* 0x04E2 - 0x04EF Reserved */ + + /* Scanner Sensor Data Fields */ + kHIDUsage_Snsr_Data_Scanner = 0x04F0, + kHIDUsage_Snsr_Data_Scanner_RFIDTag40Bit = 0x04F1, + kHIDUsage_Snsr_Data_Scanner_NFCSentenceReceive = 0x04F2, + /* 0x04F3 - 0x04F7 Reserved */ + + /* Scanner Sensor Properties */ + kHIDUsage_Snsr_Property_Scanner = 0x04F8, + kHIDUsage_Snsr_Property_Scanner_NFCSentenceSend = 0x0F49, + /* 0x04FA - 0x04FF Reserved */ + + /* Electrical Sensor Data Fields */ + kHIDUsage_Snsr_Data_Electrical = 0x0500, + kHIDUsage_Snsr_Data_Electrical_Capacitance = 0x0501, + kHIDUsage_Snsr_Data_Electrical_Current = 0x0502, + kHIDUsage_Snsr_Data_Electrical_ElectricalPower = 0x0503, + kHIDUsage_Snsr_Data_Electrical_Inductance = 0x0504, + kHIDUsage_Snsr_Data_Electrical_Resistance = 0x0505, + kHIDUsage_Snsr_Data_Electrical_Voltage = 0x0506, + kHIDUsage_Snsr_Data_Electrical_Frequency = 0x0507, + kHIDUsage_Snsr_Data_Electrical_Period = 0x0508, + kHIDUsage_Snsr_Data_Electrical_PercentOfRange = 0x0509, + /* 0x050A - 0x051F Reserved */ + + /* Time Sensor Data Fields */ + kHIDUsage_Snsr_Data_Time = 0x0520, + kHIDUsage_Snsr_Data_Time_Year = 0x0521, + kHIDUsage_Snsr_Data_Time_Month = 0x0522, + kHIDUsage_Snsr_Data_Time_Day = 0x0523, + + kHIDUsage_Snsr_Data_Time_DayOfWeek = 0x0524, + kHIDUsage_Snsr_Data_Time_DayOfWeekSunday = 0x08C0, + kHIDUsage_Snsr_Data_Time_DayOfWeekMonday = 0x08C1, + kHIDUsage_Snsr_Data_Time_DayOfWeekTuesday = 0x08C2, + kHIDUsage_Snsr_Data_Time_DayOfWeekWednesday = 0x08C3, + kHIDUsage_Snsr_Data_Time_DayOfWeekThursday = 0x08C4, + kHIDUsage_Snsr_Data_Time_DayOfWeekFriday = 0x08C5, + kHIDUsage_Snsr_Data_Time_DayOfWeekSaturday = 0x08C6, + + kHIDUsage_Snsr_Data_Time_Hour = 0x0525, + kHIDUsage_Snsr_Data_Time_Minute = 0x0526, + kHIDUsage_Snsr_Data_Time_Second = 0x0527, + kHIDUsage_Snsr_Data_Time_Millisecond = 0x0528, + kHIDUsage_Snsr_Data_Time_Timestamp = 0x0529, + kHIDUsage_Snsr_Data_Time_JulianDayOfYear = 0x052A, + /* 0x052B - 0x052F Reserved */ + + /* Time Sensor Properties */ + kHIDUsage_Snsr_Property_Time = 0x0530, + kHIDUsage_Snsr_Property_Time_TimeZoneOffsetFromUTC = 0x0531, + kHIDUsage_Snsr_Property_Time_TimeZoneName = 0x0532, + kHIDUsage_Snsr_Property_Time_DaylightSavingsTimeObserved = 0x0533, + kHIDUsage_Snsr_Property_Time_TimeTrimAdjustment = 0x0534, + kHIDUsage_Snsr_Property_Time_ArmAlarm = 0x0535, + /* 0x0536 - 0x053F Reserved */ + + /* Custom Sensor Data Fields */ + kHIDUsage_Snsr_Data_Custom = 0x0540, + kHIDUsage_Snsr_Data_Custom_Usage = 0x0541, + kHIDUsage_Snsr_Data_Custom_BooleanArray = 0x0542, + kHIDUsage_Snsr_Data_Custom_Value = 0x0543, + kHIDUsage_Snsr_Data_Custom_Value1 = 0x0544, + kHIDUsage_Snsr_Data_Custom_Value2 = 0x0545, + kHIDUsage_Snsr_Data_Custom_Value3 = 0x0546, + kHIDUsage_Snsr_Data_Custom_Value4 = 0x0547, + kHIDUsage_Snsr_Data_Custom_Value5 = 0x0548, + kHIDUsage_Snsr_Data_Custom_Value6 = 0x0549, + /* 0x054A - 0x055F Reserved */ +}; + +/* Power Device Page (0x84) */ +/* This section provides detailed descriptions of the usages employed by Power Devices. */ +enum +{ + + kHIDUsage_PD_Undefined = 0x00, /* Power Device Undefined Usage */ + kHIDUsage_PD_iName = 0x01, /* CL- Power Device Name Index */ + kHIDUsage_PD_PresentStatus = 0x02, /* CL- Power Device Present Status */ + kHIDUsage_PD_ChangedStatus = 0x03, /* CA- Power Device Changed Status */ + kHIDUsage_PD_UPS = 0x04, /* CA- Uninterruptible Power Supply */ + kHIDUsage_PD_PowerSupply = 0x05, /* CA- Power Supply */ + kHIDUsage_PD_PeripheralDevice = 0x06, /* CA- Perpheral Device */ + /* Reserved 0x07 - 0x0F */ + kHIDUsage_PD_BatterySystem = 0x10, /* CP- Battery System power module */ + kHIDUsage_PD_BatterySystemID = 0x11, /* SV IF- Battery System ID */ + kHIDUsage_PD_Battery = 0x12, /* CP- Battery */ + kHIDUsage_PD_BatteryID = 0x13, /* SV IF- Battery ID */ + kHIDUsage_PD_Charger = 0x14, /* CP- Charger */ + kHIDUsage_PD_ChargerID = 0x15, /* SV IF- Charger ID */ + kHIDUsage_PD_PowerConverter = 0x16, /* CP- Power Converter power module */ + kHIDUsage_PD_PowerConverterID = 0x17, /* SV IF- Power Converter ID */ + kHIDUsage_PD_OutletSystem = 0x18, /* CP- Outlet System power module */ + kHIDUsage_PD_OutletSystemID = 0x19, /* SV IF-Outlet System ID */ + kHIDUsage_PD_Input = 0x1A, /* CP- Power Device Input */ + kHIDUsage_PD_InputID = 0x1B, /* SV IF- Power Device Input ID */ + kHIDUsage_PD_Output = 0x1C, /* CP- Power Device Output */ + kHIDUsage_PD_OutputID = 0x1D, /* SV IF- Power Device Output ID */ + kHIDUsage_PD_Flow = 0x1E, /* CP- Power Device Flow */ + kHIDUsage_PD_FlowID = 0x1F, /* Item IF- Power Device Flow ID */ + kHIDUsage_PD_Outlet = 0x20, /* CP- Power Device Outlet */ + kHIDUsage_PD_OutletID = 0x21, /* SV IF- Power Device Outlet ID */ + kHIDUsage_PD_Gang = 0x22, /* CL/CP- Power Device Gang */ + kHIDUsage_PD_GangID = 0x23, /* SV IF- Power Device Gang ID */ + kHIDUsage_PD_PowerSummary = 0x24, /* CL/CP- Power Device Power Summary */ + kHIDUsage_PD_PowerSummaryID = 0x25, /* SV IF- Power Device Power Summary ID */ + /* Reserved 0x26 - 0x2F */ + kHIDUsage_PD_Voltage = 0x30, /* DV IF- Power Device Voltage */ + kHIDUsage_PD_Current = 0x31, /* DV IF- Power Device Current */ + kHIDUsage_PD_Frequency = 0x32, /* DV IF- Power Device Frequency */ + kHIDUsage_PD_ApparentPower = 0x33, /* DV IF- Power Device Apparent Power */ + kHIDUsage_PD_ActivePower = 0x34, /* DV IF- Power Device RMS Power */ + kHIDUsage_PD_PercentLoad = 0x35, /* DV IF- Power Device Percent Load */ + kHIDUsage_PD_Temperature = 0x36, /* DV IF- Power Device Temperature */ + kHIDUsage_PD_Humidity = 0x37, /* DV IF- Power Device Humidity */ + kHIDUsage_PD_BadCount = 0x38, /* DV IF- Power Device Bad Condition Count */ + /* Reserved 0x39 - 0x3F */ + kHIDUsage_PD_ConfigVoltage = 0x40, /* SV/DV F- Power Device Nominal Voltage */ + kHIDUsage_PD_ConfigCurrent = 0x41, /* SV/DV F- Power Device Nominal Current */ + kHIDUsage_PD_ConfigFrequency = 0x42, /* SV/DV F- Power Device Nominal Frequency */ + kHIDUsage_PD_ConfigApparentPower = 0x43, /* SV/DV F- Power Device Nominal Apparent Power */ + kHIDUsage_PD_ConfigActivePower = 0x44, /* SV/DV F- Power Device Nominal RMS Power */ + kHIDUsage_PD_ConfigPercentLoad = 0x45, /* SV/DV F- Power Device Nominal Percent Load */ + kHIDUsage_PD_ConfigTemperature = 0x46, /* SV/DV F- Power Device Nominal Temperature */ + kHIDUsage_PD_ConfigHumidity = 0x47, /* SV/DV F- Power Device Nominal Humidity */ + /* Reserved 0x48 - 0x4F */ + kHIDUsage_PD_SwitchOnControl = 0x50, /* DV F- Power Device Switch On Control */ + kHIDUsage_PD_SwitchOffControl = 0x51, /* DV F- Power Device Switch Off Control */ + kHIDUsage_PD_ToggleControl = 0x52, /* DV F- Power Device Toogle Sequence Control */ + kHIDUsage_PD_LowVoltageTransfer = 0x53, /* DV F- Power Device Min Transfer Voltage */ + kHIDUsage_PD_HighVoltageTransfer = 0x54, /* DV F- Power Device Max Transfer Voltage */ + kHIDUsage_PD_DelayBeforeReboot = 0x55, /* DV F- Power Device Delay Before Reboot */ + kHIDUsage_PD_DelayBeforeStartup = 0x56, /* DV F- Power Device Delay Before Startup */ + kHIDUsage_PD_DelayBeforeShutdown = 0x57, /* DV F- Power Device Delay Before Shutdown */ + kHIDUsage_PD_Test = 0x58, /* DV F- Power Device Test Request/Result */ + kHIDUsage_PD_ModuleReset = 0x59, /* DV F- Power Device Reset Request/Result */ + kHIDUsage_PD_AudibleAlarmControl = 0x5A, /* DV F- Power Device Audible Alarm Control */ + /* Reserved 0x5B - 0x5F */ + kHIDUsage_PD_Present = 0x60, /* DV IOF- Power Device Present */ + kHIDUsage_PD_Good = 0x61, /* DV IOF- Power Device Good */ + kHIDUsage_PD_InternalFailure = 0x62, /* DV IOF- Power Device Internal Failure */ + kHIDUsage_PD_VoltageOutOfRange = 0x63, /* DV IOF- Power Device Voltage Out Of Range */ + kHIDUsage_PD_FrequencyOutOfRange = 0x64, /* DV IOF- Power Device Frequency Out Of Range */ + kHIDUsage_PD_Overload = 0x65, /* DV IOF- Power Device Overload */ + kHIDUsage_PD_OverCharged = 0x66, /* DV IOF- Power Device Over Charged */ + kHIDUsage_PD_OverTemperature = 0x67, /* DV IOF- Power Device Over Temperature */ + kHIDUsage_PD_ShutdownRequested = 0x68, /* DV IOF- Power Device Shutdown Requested */ + kHIDUsage_PD_ShutdownImminent = 0x69, /* DV IOF- Power Device Shutdown Imminent */ + /* Reserved 0x6A */ + kHIDUsage_PD_SwitchOnOff = 0x6B, /* DV IOF- Power Device On/Off Switch Status */ + kHIDUsage_PD_Switchable = 0x6C, /* DV IOF- Power Device Switchable */ + kHIDUsage_PD_Used = 0x6D, /* DV IOF- Power Device Used */ + kHIDUsage_PD_Boost = 0x6E, /* DV IOF- Power Device Boosted */ + kHIDUsage_PD_Buck = 0x6F, /* DV IOF- Power Device Bucked */ + kHIDUsage_PD_Initialized = 0x70, /* DV IOF- Power Device Initialized */ + kHIDUsage_PD_Tested = 0x71, /* DV IOF- Power Device Tested */ + kHIDUsage_PD_AwaitingPower = 0x72, /* DV IOF- Power Device Awaiting Power */ + kHIDUsage_PD_CommunicationLost = 0x73, /* DV IOF- Power Device Communication Lost */ + /* Reserved 0x74 - 0xFC */ + kHIDUsage_PD_iManufacturer = 0xFD, /* SV F- Power Device Manufacturer String Index */ + kHIDUsage_PD_iProduct = 0xFE, /* SV F- Power Device Product String Index */ + kHIDUsage_PD_iserialNumber = 0xFF /* SV F- Power Device Serial Number String Index */ +}; + +/* Battery System Page (x85) */ +/* This section provides detailed descriptions of the usages employed by Battery Systems. */ +enum +{ + kHIDUsage_BS_Undefined = 0x00, /* Battery System Undefined */ + kHIDUsage_BS_SMBBatteryMode = 0x01, /* CL - SMB Mode */ + kHIDUsage_BS_SMBBatteryStatus = 0x02, /* CL - SMB Status */ + kHIDUsage_BS_SMBAlarmWarning = 0x03, /* CL - SMB Alarm Warning */ + kHIDUsage_BS_SMBChargerMode = 0x04, /* CL - SMB Charger Mode */ + kHIDUsage_BS_SMBChargerStatus = 0x05, /* CL - SMB Charger Status */ + kHIDUsage_BS_SMBChargerSpecInfo = 0x06, /* CL - SMB Charger Extended Status */ + kHIDUsage_BS_SMBSelectorState = 0x07, /* CL - SMB Selector State */ + kHIDUsage_BS_SMBSelectorPresets = 0x08, /* CL - SMB Selector Presets */ + kHIDUsage_BS_SMBSelectorInfo = 0x09, /* CL - SMB Selector Info */ + /* Reserved 0x0A - 0x0F */ + kHIDUsage_BS_OptionalMfgFunction1 = 0x10, /* DV F - Battery System Optional SMB Mfg Function 1 */ + kHIDUsage_BS_OptionalMfgFunction2 = 0x11, /* DV F - Battery System Optional SMB Mfg Function 2 */ + kHIDUsage_BS_OptionalMfgFunction3 = 0x12, /* DV F - Battery System Optional SMB Mfg Function 3 */ + kHIDUsage_BS_OptionalMfgFunction4 = 0x13, /* DV F - Battery System Optional SMB Mfg Function 4 */ + kHIDUsage_BS_OptionalMfgFunction5 = 0x14, /* DV F - Battery System Optional SMB Mfg Function 5 */ + kHIDUsage_BS_ConnectionToSMBus = 0x15, /* DF F - Battery System Connection To System Management Bus */ + kHIDUsage_BS_OutputConnection = 0x16, /* DF F - Battery System Output Connection Status */ + kHIDUsage_BS_ChargerConnection = 0x17, /* DF F - Battery System Charger Connection */ + kHIDUsage_BS_BatteryInsertion = 0x18, /* DF F - Battery System Battery Insertion */ + kHIDUsage_BS_Usenext = 0x19, /* DF F - Battery System Use Next */ + kHIDUsage_BS_OKToUse = 0x1A, /* DF F - Battery System OK To Use */ + kHIDUsage_BS_BatterySupported = 0x1B, /* DF F - Battery System Battery Supported */ + kHIDUsage_BS_SelectorRevision = 0x1C, /* DF F - Battery System Selector Revision */ + kHIDUsage_BS_ChargingIndicator = 0x1D, /* DF F - Battery System Charging Indicator */ + /* Reserved 0x1E - 0x27 */ + kHIDUsage_BS_ManufacturerAccess = 0x28, /* DV F - Battery System Manufacturer Access */ + kHIDUsage_BS_RemainingCapacityLimit = 0x29, /* DV F - Battery System Remaining Capacity Limit */ + kHIDUsage_BS_RemainingTimeLimit = 0x2A, /* DV F - Battery System Remaining Time Limit */ + kHIDUsage_BS_AtRate = 0x2B, /* DV F - Battery System At Rate... */ + kHIDUsage_BS_CapacityMode = 0x2C, /* DV F - Battery System Capacity Mode */ + kHIDUsage_BS_BroadcastToCharger = 0x2D, /* DV F - Battery System Broadcast To Charger */ + kHIDUsage_BS_PrimaryBattery = 0x2E, /* DV F - Battery System Primary Battery */ + kHIDUsage_BS_ChargeController = 0x2F, /* DV F - Battery System Charge Controller */ + /* Reserved 0x30 - 0x3F */ + kHIDUsage_BS_TerminateCharge = 0x40, /* DF IOF - Battery System Terminate Charge */ + kHIDUsage_BS_TerminateDischarge = 0x41, /* DF IOF - Battery System Terminate Discharge */ + kHIDUsage_BS_BelowRemainingCapacityLimit = 0x42, /* DF IOF - Battery System Below Remaining Capacity Limit */ + kHIDUsage_BS_RemainingTimeLimitExpired = 0x43, /* DF IOF - Battery System Remaining Time Limit Expired */ + kHIDUsage_BS_Charging = 0x44, /* DF IOF - Battery System Charging */ + kHIDUsage_BS_Discharging = 0x45, /* DV IOF - Battery System Discharging */ + kHIDUsage_BS_FullyCharged = 0x46, /* DF IOF - Battery System Fully Charged */ + kHIDUsage_BS_FullyDischarged = 0x47, /* DV IOF - Battery System Fully Discharged */ + kHIDUsage_BS_ConditioningFlag = 0x48, /* DV IOF - Battery System Conditioning Flag */ + kHIDUsage_BS_AtRateOK = 0x49, /* DV IOF - Battery System At Rate OK */ + kHIDUsage_BS_SMBErrorCode = 0x4A, /* DF IOF - Battery System SMB Error Code */ + kHIDUsage_BS_NeedReplacement = 0x4B, /* DF IOF - Battery System Need Replacement */ + /* Reserved 0x4C - 0x5F */ + kHIDUsage_BS_AtRateTimeToFull = 0x60, /* DV IF - Battery System At Rate Time To Full */ + kHIDUsage_BS_AtRateTimeToEmpty = 0x61, /* DV IF - Battery System At Rate Time To Empty */ + kHIDUsage_BS_AverageCurrent = 0x62, /* DV IF - Battery System Average Current */ + kHIDUsage_BS_Maxerror = 0x63, /* DV IF - Battery System Max Error */ + kHIDUsage_BS_RelativeStateOfCharge = 0x64, /* DV IF - Battery System Relative State Of Charge */ + kHIDUsage_BS_AbsoluteStateOfCharge = 0x65, /* DV IF - Battery System Absolute State Of Charge */ + kHIDUsage_BS_RemainingCapacity = 0x66, /* DV IF - Battery System Remaining Capacity */ + kHIDUsage_BS_FullChargeCapacity = 0x67, /* DV IF - Battery System Full Charge Capacity */ + kHIDUsage_BS_RunTimeToEmpty = 0x68, /* DV IF - Battery System Run Time To Empty */ + kHIDUsage_BS_AverageTimeToEmpty = 0x69, /* DV IF - Battery System Average Time To Empty */ + kHIDUsage_BS_AverageTimeToFull = 0x6A, /* DV IF - Battery System Average Time To Full */ + kHIDUsage_BS_CycleCount = 0x6B, /* DV IF - Battery System Cycle Count */ + /* Reserved 0x6C - 0x7F */ + kHIDUsage_BS_BattPackModelLevel = 0x80, /* SV F - Battery System Batt Pack Model Level */ + kHIDUsage_BS_InternalChargeController = 0x81, /* SF F - Battery System Internal Charge Controller */ + kHIDUsage_BS_PrimaryBatterySupport = 0x82, /* SF F - Battery System Primary Battery Support */ + kHIDUsage_BS_DesignCapacity = 0x83, /* SV F - Battery System Design Capacity */ + kHIDUsage_BS_SpecificationInfo = 0x84, /* SV F - Battery System Specification Info */ + kHIDUsage_BS_ManufacturerDate = 0x85, /* SV F - Battery System Manufacturer Date */ + kHIDUsage_BS_SerialNumber = 0x86, /* SV F - Battery System Serial Number */ + kHIDUsage_BS_iManufacturerName = 0x87, /* SV F - Battery System Manufacturer Name Index */ + kHIDUsage_BS_iDevicename = 0x88, /* SV F - Battery System Device Name Index */ + kHIDUsage_BS_iDeviceChemistry = 0x89, /* SV F - Battery System Device Chemistry Index */ + kHIDUsage_BS_ManufacturerData = 0x8A, /* SV F - Battery System Manufacturer Data */ + kHIDUsage_BS_Rechargable = 0x8B, /* SV F - Battery System Rechargable */ + kHIDUsage_BS_WarningCapacityLimit = 0x8C, /* SV F - Battery System Warning Capacity Limit */ + kHIDUsage_BS_CapacityGranularity1 = 0x8D, /* SV F - Battery System Capacity Granularity 1 */ + kHIDUsage_BS_CapacityGranularity2 = 0x8E, /* SV F - Battery System Capacity Granularity 2 */ + kHIDUsage_BS_iOEMInformation = 0x8F, /* SV F - Battery System OEM Information Index */ + /* Reserved 0x90 - 0xBF */ + kHIDUsage_BS_InhibitCharge = 0xC0, /* DF IOF - Battery System Inhibit Charge */ + kHIDUsage_BS_EnablePolling = 0xC1, /* DF IOF - Battery System Enable Polling */ + kHIDUsage_BS_ResetToZero = 0xC2, /* DF IOF - Battery System Reset To Zero */ + /* Reserved 0xC3 - 0xCF */ + kHIDUsage_BS_ACPresent = 0xD0, /* DF IOF - Battery System AC Present */ + kHIDUsage_BS_BatteryPresent = 0xD1, /* DF IOF - Battery System Battery Present */ + kHIDUsage_BS_PowerFail = 0xD2, /* DF IOF - Battery System Power Fail */ + kHIDUsage_BS_AlarmInhibited = 0xD3, /* DF IOF - Battery System Alarm Inhibited */ + kHIDUsage_BS_ThermistorUnderRange = 0xD4, /* DF IOF - Battery System Thermistor Under Range */ + kHIDUsage_BS_ThermistorHot = 0xD5, /* DF IOF - Battery System Thermistor Hot */ + kHIDUsage_BS_ThermistorCold = 0xD6, /* DF IOF - Battery System Thermistor Cold */ + kHIDUsage_BS_ThermistorOverRange = 0xD7, /* DF IOF - Battery System Thermistor Over Range */ + kHIDUsage_BS_VoltageOutOfRange = 0xD8, /* DF IOF - Battery System Voltage Out Of Range */ + kHIDUsage_BS_CurrentOutOfRange = 0xD9, /* DF IOF - Battery System Current Out Of Range */ + kHIDUsage_BS_CurrentNotRegulated = 0xDA, /* DF IOF - Battery System Current Not Regulated */ + kHIDUsage_BS_VoltageNotRegulated = 0xDB, /* DF IOF - Battery System Voltage Not Regulated */ + kHIDUsage_BS_MasterMode = 0xDC, /* DF IOF - Battery System Master Mode */ + /* Reserved 0xDD - 0xEF */ + kHIDUsage_BS_ChargerSelectorSupport = 0xF0, /* SF F- Battery System Charger Support Selector */ + kHIDUsage_BS_ChargerSpec = 0xF1, /* SF F- Battery System Charger Specification */ + kHIDUsage_BS_Level2 = 0xF2, /* SF F- Battery System Charger Level 2 */ + kHIDUsage_BS_Level3 = 0xF3 /* SF F- Battery System Charger Level 3 */ + /* Reserved 0xF2 - 0xFF */ +}; + +/* Bar Code Scanner Page (0x8C) */ +/* This section provides detailed descriptions of the usages employed by Bar Code Scanner Devices. */ +enum +{ + kHIDUsage_BCS_Undefined = 0x00, /* Bar Code Scanner Undefined Usage */ + kHIDUsage_BCS_BadgeReader = 0x01, /* CA - Bar Code Badge Reader */ + kHIDUsage_BCS_BarCodeScanner = 0x02, /* CA -Bar Code Scanner */ + kHIDUsage_BCS_DumbBarCodeScanner = 0x03, /* CA -Dumb Bar Code Scanner Usage */ + kHIDUsage_BCS_CordlessScannerBase = 0x04, /* CA -Cordless Base Usage */ + kHIDUsage_BCS_BarCodeScannerCradle = 0x05, /* CA -Bar Code Scanner Cradle Usage */ + /* Reserved 0x06 - 0x0F */ + kHIDUsage_BCS_AttributeReport = 0x10, /* CL - Attribute Report */ + kHIDUsage_BCS_SettingsReport = 0x11, /* CL - Settings Report */ + kHIDUsage_BCS_ScannedDataReport = 0x12, /* CL - Scanned Data Report */ + kHIDUsage_BCS_RawScannedDataReport = 0x13, /* CL - Raw Scanned Data Report */ + kHIDUsage_BCS_TriggerReport = 0x14, /* CL - Trigger Report */ + kHIDUsage_BCS_StatusReport = 0x15, /* CL - Status Report */ + kHIDUsage_BCS_UPC_EANControlReport = 0x16, /* CL - UPC/EAN Control Report */ + kHIDUsage_BCS_EAN2_3LabelControlReport = 0x17, /* CL - EAN 2/3 Label Control Report */ + kHIDUsage_BCS_Code39ControlReport = 0x18, /* CL - Code 39 Control Report */ + kHIDUsage_BCS_Interleaved2of5ControlReport = 0x19, /* CL - Interleaved 2 of 5 Control Report */ + kHIDUsage_BCS_Standard2of5ControlReport = 0x1A, /* CL - Standard 2 of 5 Control Report */ + kHIDUsage_BCS_MSIPlesseyControlReport = 0x1B, /* CL - MSI Plessey Control Report */ + kHIDUsage_BCS_CodabarControlReport = 0x1C, /* CL - Codabar Control Report */ + kHIDUsage_BCS_Code128ControlReport = 0x1D, /* CL - Code 128 Control Report */ + kHIDUsage_BCS_Misc1DControlReport = 0x1E, /* CL - Misc 1D Control Report */ + kHIDUsage_BCS_2DControlReport = 0x1F, /* CL - 2D Control Report */ + /* Reserved 0x20 - 0x2F */ + kHIDUsage_BCS_Aiming_PointerMide = 0x30, /* SF - Aiming Pointer Mode */ + kHIDUsage_BCS_BarCodePresentSensor = 0x31, /* SF - Bar Code Present Sensor */ + kHIDUsage_BCS_Class1ALaser = 0x32, /* SF - Class 1A Laser */ + kHIDUsage_BCS_Class2Laser = 0x33, /* SF - Class 2 Laser */ + kHIDUsage_BCS_HeaterPresent = 0x34, /* SF - Heater Present */ + kHIDUsage_BCS_ContactScanner = 0x35, /* SF - Contact Scanner */ + kHIDUsage_BCS_ElectronicArticleSurveillanceNotification = 0x36, /* SF - Electronic Article Surveillance Notification */ + kHIDUsage_BCS_ConstantElectronicArticleSurveillance = 0x37, /* SF - Constant Electronic Article Surveillance */ + kHIDUsage_BCS_ErrorIndication = 0x38, /* SF - Error Indication */ + kHIDUsage_BCS_FixedBeeper = 0x39, /* SF - Fixed Beeper */ + kHIDUsage_BCS_GoodDecodeIndication = 0x3A, /* SF - Good Decode Indication */ + kHIDUsage_BCS_HandsFreeScanning = 0x3B, /* SF - Hands Free Scanning */ + kHIDUsage_BCS_IntrinsicallySafe = 0x3C, /* SF - Intrinsically Safe */ + kHIDUsage_BCS_KlasseEinsLaser = 0x3D, /* SF - Klasse Eins Laser */ + kHIDUsage_BCS_LongRangeScanner = 0x3E, /* SF - Long Range Scanner */ + kHIDUsage_BCS_MirrorSpeedControl = 0x3F, /* SF - Mirror Speed Control */ + kHIDUsage_BCS_NotOnFileIndication = 0x40, /* SF - Not On File Indication */ + kHIDUsage_BCS_ProgrammableBeeper = 0x41, /* SF - Programmable Beeper */ + kHIDUsage_BCS_Triggerless = 0x42, /* SF - Triggerless */ + kHIDUsage_BCS_Wand = 0x43, /* SF - Wand */ + kHIDUsage_BCS_WaterResistant = 0x44, /* SF - Water Resistant */ + kHIDUsage_BCS_MultiRangeScanner = 0x45, /* SF - Multi-Range Scanner */ + kHIDUsage_BCS_ProximitySensor = 0x46, /* SF - Proximity Sensor */ + /* Reserved 0x47 - 0x4C */ + kHIDUsage_BCS_FragmentDecoding = 0x4D, /* DF - Fragment Decoding */ + kHIDUsage_BCS_ScannerReadConfidence = 0x4E, /* DV - Scanner Read Confidence */ + kHIDUsage_BCS_DataPrefix = 0x4F, /* NAry - Data Prefix */ + kHIDUsage_BCS_PrefixAIMI = 0x50, /* SEL - Prefix AIMI */ + kHIDUsage_BCS_PrefixNone = 0x51, /* SEL - Prefix None */ + kHIDUsage_BCS_PrefixProprietary = 0x52, /* SEL - Prefix Proprietary */ + /* Reserved 0x53 - 0x54 */ + kHIDUsage_BCS_ActiveTime = 0x55, /* DV - Active Time */ + kHIDUsage_BCS_AimingLaserPattern = 0x56, /* DF - Aiming Laser Pattern */ + kHIDUsage_BCS_BarCodePresent = 0x57, /* OOC - Bar Code Present */ + kHIDUsage_BCS_BeeperState = 0x58, /* OOC - Beeper State */ + kHIDUsage_BCS_LaserOnTime = 0x59, /* DV - Laser On Time */ + kHIDUsage_BCS_LaserState = 0x5A, /* OOC - Laser State */ + kHIDUsage_BCS_LockoutTime = 0x5B, /* DV - Lockout Time */ + kHIDUsage_BCS_MotorState = 0x5C, /* OOC - Motor State */ + kHIDUsage_BCS_MotorTimeout = 0x5D, /* DV - Motor Timeout */ + kHIDUsage_BCS_PowerOnResetScanner = 0x5E, /* DF - Power On Reset Scanner */ + kHIDUsage_BCS_PreventReadOfBarcodes = 0x5F, /* DF - Prevent Read of Barcodes */ + kHIDUsage_BCS_InitiateBarcodeRead = 0x60, /* DF - Initiate Barcode Read */ + kHIDUsage_BCS_TriggerState = 0x61, /* DF - Trigger State */ + kHIDUsage_BCS_TriggerMode = 0x62, /* NAry - Trigger Mode */ + kHIDUsage_BCS_TriggerModeBlinkingLaserOn = 0x63, /* SEL - Trigger Mode Blinking Laser On */ + kHIDUsage_BCS_TriggerModeContinuousLaserOn = 0x64, /* SEL - Trigger Mode Continuous Laser On */ + kHIDUsage_BCS_TriggerModeLaserOnWhilePulled = 0x65, /* SEL - Trigger Mode Laser on while Pulled */ + kHIDUsage_BCS_TriggerModeLaserStaysOnAfterTriggerRelease = 0x66, /* SEL - Trigger Mode Laser stays on after Trigger Release */ + /* Reserved 0x67 - 0x6C */ + kHIDUsage_BCS_CommitParametersToNVM = 0x6D, /* DF - Commit Parameters to NVM */ + kHIDUsage_BCS_ParameterScanning = 0x6E, /* DF - Parameter Scanning */ + kHIDUsage_BCS_ParametersChanged = 0x6F, /* OOC - Parameters Changed */ + kHIDUsage_BCS_SetParameterDefaultValues = 0x70, /* DF - Set parameter default values */ + /* Reserved 0x71 - 0x74 */ + kHIDUsage_BCS_ScannerInCradle = 0x75, /* OOC - Scanner In Cradle */ + kHIDUsage_BCS_ScannerInRange = 0x76, /* OOC - Scanner In Range */ + /* Reserved 0x77 - 0x79 */ + kHIDUsage_BCS_AimDuration = 0x7A, /* DV - Aim Duration */ + kHIDUsage_BCS_GoodReadLampDuration = 0x7B, /* DV - Good Read Lamp Duration */ + kHIDUsage_BCS_GoodReadLampIntensity = 0x7C, /* DV - Good Read Lamp Intensity */ + kHIDUsage_BCS_GoodReadLED = 0x7D, /* DF - Good Read LED */ + kHIDUsage_BCS_GoodReadToneFrequency = 0x7E, /* DV - Good Read Tone Frequency*/ + kHIDUsage_BCS_GoodReadToneLength = 0x7F, /* DV - Good Read Tone Length */ + kHIDUsage_BCS_GoodReadToneVolume = 0x80, /* DV - Good Read Tone Volume */ + /* Reserved 0x81 */ + kHIDUsage_BCS_NoReadMessage = 0x82, /* DF - No Read Message */ + kHIDUsage_BCS_NotOnFileVolume = 0x83, /* DV - Not on File Volume */ + kHIDUsage_BCS_PowerupBeep = 0x84, /* DF - Powerup Beep */ + kHIDUsage_BCS_SoundErrorBeep = 0x85, /* DF - Sound Error Beep */ + kHIDUsage_BCS_SoundGoodReadBeep = 0x86, /* DF - Sound Good Read Beep */ + kHIDUsage_BCS_SoundNotOnFileBeep = 0x87, /* DF - Sound Not On File Beep */ + kHIDUsage_BCS_GoodReadWhenToWrite = 0x88, /* NArry - Good Read When to Write */ + kHIDUsage_BCS_GRWTIAfterDecode = 0x89, /* SEL - GRWTI After Decode */ + kHIDUsage_BCS_GRWTIBeep_LampAfterTransmit = 0x8A, /* SEL - GRWTI Beep/Lamp after transmit */ + kHIDUsage_BCS_GRWTINoBeep_LampUseAtAll = 0x8B, /* SEL - GRWTI No Beep/Lamp at all */ + /* Reserved 0x8C - 0x90 */ + kHIDUsage_BCS_BooklandEAN = 0x91, /* DF - Bookland EAN */ + kHIDUsage_BCS_ConvertEAN8To13Type = 0x92, /* DF - Convert EAN 8 to 13 Type */ + kHIDUsage_BCS_ConvertUPCAToEAN_13 = 0x93, /* DF - Convert UPC A to EAN-13 */ + kHIDUsage_BCS_ConvertUPC_EToA = 0x94, /* DF - Convert UPC-E to A */ + kHIDUsage_BCS_EAN_13 = 0x95, /* DF - EAN-13 */ + kHIDUsage_BCS_EAN_8 = 0x96, /* DF - EAN_8 */ + kHIDUsage_BCS_EAN_99_128_Mandatory = 0x97, /* DF - EAN-99 128_Mandatory */ + kHIDUsage_BCS_EAN_99_P5_128_Optional = 0x98, /* DF - EAN-99 P5/128_Optional */ + /* Reserved 0x99 */ + kHIDUsage_BCS_UPC_EAN = 0x9A, /* DF - UPC/EAN */ + kHIDUsage_BCS_UPC_EANCouponCode = 0x9B, /* DF - UPC/EAN Coupon Code */ + kHIDUsage_BCS_UPC_EANPeriodicals = 0x9C, /* DV - UPC/EAN Periodicals */ + kHIDUsage_BCS_UPC_A = 0x9D, /* DF - UPC-A */ + kHIDUsage_BCS_UPC_AWith128Mandatory = 0x9E, /* DF - UPC-A with 128 Mandatory */ + kHIDUsage_BCS_UPC_AWith128Optical = 0x9F, /* DF - UPC-A with 128 Optical */ + kHIDUsage_BCS_UPC_AWithP5Optional = 0xA0, /* DF - UPC-A with P5 Optional */ + kHIDUsage_BCS_UPC_E = 0xA1, /* DF - UPC-E */ + kHIDUsage_BCS_UPC_E1 = 0xA2, /* DF - UPC-E1 */ + /* Reserved 0xA3 - 0xA8 */ + kHIDUsage_BCS_Periodical = 0xA9, /* NArry - Periodical */ + kHIDUsage_BCS_PeriodicalAutoDiscriminatePlus2 = 0xAA,/* SEL - Periodical Auto-Discriminate + 2 */ + kHIDUsage_BCS_PeriodicalOnlyDecodeWithPlus2 = 0xAB, /* SEL - Periodical Only Decode with + 2 */ + kHIDUsage_BCS_PeriodicalIgnorePlus2 = 0xAC, /* SEL - Periodical Ignore + 2 */ + kHIDUsage_BCS_PeriodicalAutoDiscriminatePlus5 = 0xAD,/* SEL - Periodical Auto-Discriminate + 5 */ + kHIDUsage_BCS_PeriodicalOnlyDecodeWithPlus5 = 0xAE, /* SEL - Periodical Only Decode with + 5 */ + kHIDUsage_BCS_PeriodicalIgnorePlus5 = 0xAF, /* SEL - Periodical Ignore + 5 */ + kHIDUsage_BCS_Check = 0xB0, /* NArry - Check */ + kHIDUsage_BCS_CheckDisablePrice = 0xB1, /* SEL - Check Disable Price */ + kHIDUsage_BCS_CheckEnable4DigitPrice = 0xB2, /* SEL - Check Enable 4 digit Price */ + kHIDUsage_BCS_CheckEnable5DigitPrice = 0xB3, /* SEL - Check Enable 5 digit Price */ + kHIDUsage_BCS_CheckEnableEuropean4DigitPrice = 0xB4,/* SEL - Check Enable European 4 digit Price */ + kHIDUsage_BCS_CheckEnableEuropean5DigitPrice = 0xB5,/* SEL - Check Enable European 5 digit Price */ + /* Reserved 0xB6 */ + kHIDUsage_BCS_EANTwoLabel = 0xB7, /* DF - EAN Two Label */ + kHIDUsage_BCS_EANThreeLabel = 0xB8, /* DF - EAN Thread Label */ + kHIDUsage_BCS_EAN8FlagDigit1 = 0xB9, /* DV - EAN 8 Flag Digit 1 */ + kHIDUsage_BCS_EAN8FlagDigit2 = 0xBA, /* DV - EAN 8 Flag Digit 2 */ + kHIDUsage_BCS_EAN8FlagDigit3 = 0xBB, /* DV - EAN 8 Flag Digit 3 */ + kHIDUsage_BCS_EAN13FlagDigit1 = 0xBC, /* DV - EAN 13 Flag Digit 1 */ + kHIDUsage_BCS_EAN13FlagDigit2 = 0xBD, /* DV - EAN 13 Flag Digit 2 */ + kHIDUsage_BCS_EAN13FlagDigit3 = 0xBE, /* DV - EAN 13 Flag Digit 3 */ + kHIDUsage_BCS_AddEAN2_3LabelDefinition = 0xBF, /* DF - Add EAN 2/3 Label Definition */ + kHIDUsage_BCS_ClearAllEAN2_3LabelDefinitions = 0xC0,/* DF - Clear all EAN 2/3 Label Definitions */ + /* Reserved 0xC1 - 0xC2 */ + kHIDUsage_BCS_Codabar = 0xC3, /* DF - Codabar */ + kHIDUsage_BCS_Code128 = 0xC4, /* DF - Code 128 */ + /* Reserved 0xC5 - 0xC6 */ + kHIDUsage_BCS_Code39 = 0xC7, /* DF - Code 39 */ + kHIDUsage_BCS_Code93 = 0xC8, /* DF - Code 93 */ + kHIDUsage_BCS_FullASCIIConversion = 0xC9, /* DF - Full ASCII Conversion */ + kHIDUsage_BCS_Interleaved2of5 = 0xCA, /* DF - Interleaved 2 of 5 */ + kHIDUsage_BCS_ItalianPharmacyCode = 0xCB, /* DF - Italian Pharmacy Code */ + kHIDUsage_BCS_MSI_Plessey = 0xCC, /* DF - MSI/Plessey */ + kHIDUsage_BCS_Standard2of5IATA = 0xCD, /* DF - Standard 2 of 5 IATA */ + kHIDUsage_BCS_Standard2of5 = 0xCE, /* DF - Standard 2 of 5 */ + /* Reserved 0xCF - 0xD2 */ + kHIDUsage_BCS_TransmitStart_Stop = 0xD3, /* DF - Transmit Start/Stop */ + kHIDUsage_BCS_TriOptic = 0xD4, /* DF - Tri-Optic */ + kHIDUsage_BCS_UCC_EAN_128 = 0xD5, /* DF - UCC/EAN-128 */ + kHIDUsage_BCS_CheckDigit = 0xD6, /* NArry - Check Digit */ + kHIDUsage_BCS_CheckDigitDisable = 0xD7, /* SEL - Check Digit Disable */ + kHIDUsage_BCS_CheckDigitEnableInterleaved2of5OPCC = 0xD8, /* SEL - Check Digit Enable Interleaved 2 of 5 OPCC */ + kHIDUsage_BCS_CheckDigitEnableInterleaved2of5USS = 0xD9, /* SEL - Check Digit Enable Interleaved 2 of 5 USS */ + kHIDUsage_BCS_CheckDigitEnableStandard2of5OPCC = 0xD8, /* SEL - Check Digit Enable Standard 2 of 5 OPCC */ + kHIDUsage_BCS_CheckDigitEnableStandard2of5USS = 0xD9, /* SEL - Check Digit Enable Standard 2 of 5 USS */ + kHIDUsage_BCS_CheckDigitEnableOneMSIPlessey = 0xDC, /* SEL - Check Digit Enable One MSI Plessey */ + kHIDUsage_BCS_CheckDigitEnableTwoMSIPlessey = 0xDD, /* SEL - Check Digit Enable Two MSI Plessey */ + kHIDUsage_BCS_CheckDigitCodabarEnable = 0xDE, /* SEL - Check Digit Codabar Enable */ + kHIDUsage_BCS_CheckDigitCode99Enable = 0xDF, /* SEL - Check Digit Code 99 Enable */ + /* Reserved 0xE0 - 0xEF */ + kHIDUsage_BCS_TransmitCheckDigit = 0xF0, /* NArry - Transmit Check Digit */ + kHIDUsage_BCS_DisableCheckDigitTransmit = 0xF1, /* SEL - Disable Check Digit Transmit */ + kHIDUsage_BCS_EnableCheckDigitTransmit = 0xF2, /* SEL - Enable Check Digit Transmit */ + /* Reserved 0xF3 - 0xFA */ + kHIDUsage_BCS_SymbologyIdentifier1 = 0xFB, /* DV - Symbology Identifier 1 */ + kHIDUsage_BCS_SymbologyIdentifier2 = 0xFC, /* DV - Symbology Identifier 2 */ + kHIDUsage_BCS_SymbologyIdentifier3 = 0xFD, /* DV - Symbology Identifier 3 */ + kHIDUsage_BCS_DecodedData = 0xFE, /* DV - Decoded Data */ + kHIDUsage_BCS_DecodeDataContinued = 0xFF, /* DF - Decode Data Continued */ + kHIDUsage_BCS_BarSpaceData = 0x100, /* DV - Bar Space Data */ + kHIDUsage_BCS_ScannerDataAccuracy = 0x101, /* DV - Scanner Data Accuracy */ + kHIDUsage_BCS_RawDataPolarity = 0x102, /* NArry - Raw Data Polarity */ + kHIDUsage_BCS_PolarityInvertedBarCode = 0x103, /* SEL - Polarity Inverted Bar Code */ + kHIDUsage_BCS_PolarityNormalBarCode = 0x103, /* SEL - Polarity Normal Bar Code */ + /* Reserved 0x105 */ + kHIDUsage_BCS_MinimumLengthToDecode = 0x106, /* DV - Minimum Length to Decode */ + kHIDUsage_BCS_MaximumLengthToDecode = 0x107, /* DV - Maximum Length to Decode */ + kHIDUsage_BCS_FirstDiscreteLengthToDecode = 0x108, /* DV - First Discrete Length to Decode */ + kHIDUsage_BCS_SecondDiscreteLengthToDecode = 0x109, /* DV - Second Discrete Length to Decode */ + kHIDUsage_BCS_DataLengthMethod = 0x10A, /* NArry - Data Length Method */ + kHIDUsage_BCS_DLMethodReadAny = 0x10B, /* DF - DL Method Read any */ + kHIDUsage_BCS_DLMethodCheckInRange = 0x10C, /* DF - DL Method Check in Range */ + kHIDUsage_BCS_DLMethodCheckForDiscrete = 0x10D, /* DF - DL Method Check for Discrete */ + /* Reserved 0x10E - 0x10F */ + kHIDUsage_BCS_AztecCode = 0x110, /* DF - Aztec Code */ + kHIDUsage_BCS_BC412 = 0x111, /* DF - BC412 */ + kHIDUsage_BCS_ChannelCode = 0x112, /* DF - Channel Code */ + kHIDUsage_BCS_Code16 = 0x113, /* DF - Code 16 */ + kHIDUsage_BCS_Code32 = 0x114, /* DF - Code 32 */ + kHIDUsage_BCS_Code49 = 0x115, /* DF - Code 49 */ + kHIDUsage_BCS_CodeOne = 0x116, /* DF - Code One */ + kHIDUsage_BCS_Colorcode = 0x117, /* DF - Colorcode */ + kHIDUsage_BCS_DataMatrix = 0x118, /* DF - Data Matrix */ + kHIDUsage_BCS_MaxiCode = 0x119, /* DF - MaxiCode */ + kHIDUsage_BCS_MicroPDF = 0x11A, /* DF - MicroPDF */ + kHIDUsage_BCS_PDF_417 = 0x11B, /* DF - PDF-417 */ + kHIDUsage_BCS_PosiCode = 0x11C, /* DF - PosiCode */ + kHIDUsage_BCS_QRCode = 0x11D, /* DF - QR Code */ + kHIDUsage_BCS_SuperCode = 0x11E, /* DF - SuperCode */ + kHIDUsage_BCS_UltraCode = 0x11F, /* DF - UltraCode */ + kHIDUsage_BCS_USB_5_SlugCode = 0x120, /* DF - USD-5 (Slug Code) */ + kHIDUsage_BCS_VeriCode = 0x121 /* DF - VeriCode */ + /* Reserved 0x122 - 0xFFFF */ +}; + +/* Weighing Devices Page (0x8D) */ +/* This section provides detailed descriptions of the usages employed by Weighing Devices. */ +enum +{ + kHIDUsage_WD_Undefined = 0x00, /* Weighing Device Undefined Usage */ + kHIDUsage_WD_WeighingDevice = 0x01, /* CA - Weighing Device */ + /* Reserved 0x02 - 0x1F */ + kHIDUsage_WD_ScaleScaleDevice = 0x20, /* CL - Scale Device */ + kHIDUsage_WD_ScaleScaleClassIMetricCL = 0x21, /* CL - Scale Class I Metric */ + kHIDUsage_WD_ScaleScaleClassIMetric = 0x22, /* SEL - Scale Class I Metric */ + kHIDUsage_WD_ScaleScaleClassIIMetric = 0x23, /* SEL - Scale Class II Metric */ + kHIDUsage_WD_ScaleScaleClassIIIMetric = 0x24, /* SEL - Scale Class III Metric */ + kHIDUsage_WD_ScaleScaleClassIIILMetric = 0x25, /* SEL - Scale Class IIIL Metric */ + kHIDUsage_WD_ScaleScaleClassIVMetric = 0x26, /* SEL - Scale Class IV Metric */ + kHIDUsage_WD_ScaleScaleClassIIIEnglish = 0x27, /* SEL - Scale Class III English */ + kHIDUsage_WD_ScaleScaleClassIIILEnglish = 0x28, /* SEL - Scale Class IIIL English */ + kHIDUsage_WD_ScaleScaleClassIVEnglish = 0x29, /* SEL - Scale Class IV English */ + kHIDUsage_WD_ScaleScaleClassGeneric = 0x2A, /* SEL - Scale Class Generic */ + /* Reserved 0x2B - 0x2F */ + kHIDUsage_WD_ScaleAtrributeReport = 0x30, /* CL - Scale Attribute Report */ + kHIDUsage_WD_ScaleControlReport = 0x31, /* CL - Scale Control Report */ + kHIDUsage_WD_ScaleDataReport = 0x32, /* CL - Scale Data Report */ + kHIDUsage_WD_ScaleStatusReport = 0x33, /* CL - Scale Status Report */ + kHIDUsage_WD_ScaleWeightLimitReport = 0x34, /* CL - Scale Weight Limit Report */ + kHIDUsage_WD_ScaleStatisticsReport = 0x35, /* CL - Scale Statistics Report */ + /* Reserved 0x36 - 0x3F */ + kHIDUsage_WD_DataWeight = 0x40, /* DV - Data Weight */ + kHIDUsage_WD_DataScaling = 0x41, /* DV - Data Scaling */ + /* Reserved 0x42 - 0x4F */ + kHIDUsage_WD_WeightUnit = 0x50, /* CL - Weight Unit */ + kHIDUsage_WD_WeightUnitMilligram = 0x51, /* SEL - Weight Unit Milligram */ + kHIDUsage_WD_WeightUnitGram = 0x52, /* SEL - Weight Unit Gram */ + kHIDUsage_WD_WeightUnitKilogram = 0x53, /* SEL - Weight Unit Kilogram */ + kHIDUsage_WD_WeightUnitCarats = 0x54, /* SEL - Weight Unit Carats */ + kHIDUsage_WD_WeightUnitTaels = 0x55, /* SEL - Weight Unit Taels */ + kHIDUsage_WD_WeightUnitGrains = 0x56, /* SEL - Weight Unit Grains */ + kHIDUsage_WD_WeightUnitPennyweights = 0x57, /* SEL - Weight Unit Pennyweights */ + kHIDUsage_WD_WeightUnitMetricTon = 0x58, /* SEL - Weight Unit Metric Ton */ + kHIDUsage_WD_WeightUnitAvoirTon = 0x59, /* SEL - Weight Unit Avoir Ton */ + kHIDUsage_WD_WeightUnitTroyOunce = 0x5A, /* SEL - Weight Unit Troy Ounce */ + kHIDUsage_WD_WeightUnitOunce = 0x5B, /* SEL - Weight Unit Ounce */ + kHIDUsage_WD_WeightUnitPound = 0x5C, /* SEL - Weight Unit Pound */ + /* Reserved 0x5D - 0x5F */ + kHIDUsage_WD_CalibrationCount = 0x60, /* DV - Calibration Count */ + kHIDUsage_WD_RezeroCount = 0x61, /* DV - Re-Zero Count*/ + /* Reserved 0x62 - 0x6F */ + kHIDUsage_WD_ScaleStatus = 0x70, /* CL - Scale Status */ + kHIDUsage_WD_ScaleStatusFault = 0x71, /* SEL - Scale Status Fault */ + kHIDUsage_WD_ScaleStatusStableAtZero = 0x72, /* SEL - Scale Status Stable at Center of Zero */ + kHIDUsage_WD_ScaleStatusInMotion = 0x73, /* SEL - Scale Status In Motion */ + kHIDUsage_WD_ScaleStatusWeightStable = 0x74, /* SEL - Scale Status Weight Stable */ + kHIDUsage_WD_ScaleStatusUnderZero = 0x75, /* SEL - Scale Status Under Zero */ + kHIDUsage_WD_ScaleStatusOverWeightLimit = 0x76, /* SEL - Scale Status Over Weight Limit */ + kHIDUsage_WD_ScaleStatusRequiresCalibration = 0x77, /* SEL - Scale Status Requires Calibration */ + kHIDUsage_WD_ScaleStatusRequiresRezeroing = 0x78, /* SEL - Scale Status Requires Re-zeroing */ + /* Reserved 0x79 - 0x7F */ + kHIDUsage_WD_ZeroScale = 0x80, /* OOC - Zero Scale */ + kHIDUsage_WD_EnforcedZeroReturn = 0x81 /* OOC - Enforced Zero Return */ + /* Reserved 0x82 - 0xFFFF */ + +}; + +/* Magnetic Stripe Reader Page (0x8E) */ +/* This section provides detailed descriptions of the usages employed by Magnetic Stripe Reader Devices. */ +enum +{ + kHIDUsage_MSR_Undefined = 0x00, /* MagStripe Undefined Usage */ + kHIDUsage_MSR_DeviceReadOnly = 0x01, /* CA - MSR Device Read-Only */ + /* Reserved 0x02 - 0x10 */ + kHIDUsage_MSR_Track1Length = 0x11, /* SF, DF, SEL - Track 1 Length */ + kHIDUsage_MSR_Track2Length = 0x12, /* SF, DF, SEL - Track 2 Length */ + kHIDUsage_MSR_Track3Length = 0x13, /* SF, DF, SEL - Track 3 Length */ + kHIDUsage_MSR_TrackJISLength = 0x14, /* SF, DF, SEL - Track JIS Length */ + /* Reserved 0x15 - 0x1F */ + kHIDUsage_MSR_TrackData = 0x20, /* SF, DF, SEL - Track Data */ + kHIDUsage_MSR_Track1Data = 0x21, /* SF, DF, SEL - Track 1 Data */ + kHIDUsage_MSR_Track2Data = 0x22, /* SF, DF, SEL - Track 2 Data */ + kHIDUsage_MSR_Track3Data = 0x23, /* SF, DF, SEL - Track 3 Data */ + kHIDUsage_MSR_TrackJISData = 0x24 /* SF, DF, SEL - Track JIS Data */ + /* Reserved 0x25 - 0xFFFF */ +}; + +/* Camera Control Page (0x90) */ +enum +{ + kHIDUsage_CC_Undefined = 0x00, /* Camera Control Undefined Usage */ + /* Reserved 0x01 - 0x1F */ + kHIDUsage_CC_Autofocus = 0x20, /* One-Shot Control */ + kHIDUsage_CC_Shutter = 0x21, /* One-Shot Control */ +}; + +#endif /* _IOHIDUSAGETABLES_H */ diff --git a/QualcommWireless/include/IOKit/hidsystem/IOHIDWorkLoop.h b/QualcommWireless/include/IOKit/hidsystem/IOHIDWorkLoop.h new file mode 100644 index 0000000..c78f25a --- /dev/null +++ b/QualcommWireless/include/IOKit/hidsystem/IOHIDWorkLoop.h @@ -0,0 +1,22 @@ + +#ifndef _IOKIT_IOHIDWORKLOOP_H +#define _IOKIT_IOHIDWORKLOOP_H + +#include +class IOHIDWorkLoop : public IOWorkLoop +{ + OSDeclareDefaultStructors(IOHIDWorkLoop) + +protected: + lck_grp_t * fLockGroup; + + bool init ( void ) APPLE_KEXT_OVERRIDE; + void free ( void ) APPLE_KEXT_OVERRIDE; + +public: + // Create a workloop + static IOHIDWorkLoop * workLoop(); +}; + +#endif /* ! _IOKIT_IOHIDWORKLOOP_H */ + diff --git a/QualcommWireless/include/IOKit/hidsystem/IOHIDevice.h b/QualcommWireless/include/IOKit/hidsystem/IOHIDevice.h new file mode 100644 index 0000000..b3605b0 --- /dev/null +++ b/QualcommWireless/include/IOKit/hidsystem/IOHIDevice.h @@ -0,0 +1,71 @@ +/* + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 1999-2009 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* Copyright (c) 1992 NeXT Computer, Inc. All rights reserved. + * + * IOHIDevice.h - Common Event Source object class. + * + * HISTORY + * 22 May 1992 Mike Paquette at NeXT + * Created. + * 4 Aug 1993 Erik Kay at NeXT + * API cleanup + * 5 Aug 1993 Erik Kay at NeXT + * added ivar space for future expansion + */ + +#ifndef _IOHIDEVICE_H +#define _IOHIDEVICE_H + +#include +#include + +typedef enum { + kHIUnknownDevice = 0, + kHIKeyboardDevice = 1, + kHIRelativePointingDevice = 2 +} IOHIDKind; + +class IOHIDevice : public IOService +{ + OSDeclareDefaultStructors(IOHIDevice); + +public: + virtual bool init(OSDictionary * properties = 0) APPLE_KEXT_OVERRIDE; + virtual void free(void) APPLE_KEXT_OVERRIDE; + virtual bool start(IOService * provider) APPLE_KEXT_OVERRIDE; + virtual bool open( IOService * forClient, + IOOptionBits options = 0, + void * arg = 0 ) APPLE_KEXT_OVERRIDE; + + virtual UInt32 deviceType(); + virtual IOHIDKind hidKind(); + virtual UInt32 interfaceID(); + virtual bool updateProperties(void); + virtual IOReturn setProperties( OSObject * properties ) APPLE_KEXT_OVERRIDE; + virtual IOReturn setParamProperties(OSDictionary * dict); + virtual UInt64 getGUID(); + + static SInt32 GenerateKey(OSObject *object); +}; + +#endif /* !_IOHIDEVICE_H */ diff --git a/QualcommWireless/include/IOKit/hidsystem/IOHIKeyboard.h b/QualcommWireless/include/IOKit/hidsystem/IOHIKeyboard.h new file mode 100644 index 0000000..0c023ab --- /dev/null +++ b/QualcommWireless/include/IOKit/hidsystem/IOHIKeyboard.h @@ -0,0 +1,273 @@ +/* + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* Copyright (c) 1992 NeXT Computer, Inc. All rights reserved. + * + * EventSrcPCKeyboard.h - PC Keyboard EventSrc subclass definition + * + * HISTORY + * 28 Aug 1992 Joe Pasqua + * Created. + */ + +#ifndef _IOHIKEYBOARD_H +#define _IOHIKEYBOARD_H + +#include +#include + +/* Start Action Definitions */ + +/* + * HISTORICAL NOTE: + * The following entry points were part of the IOHIKeyboardEvents + * protocol. + */ + +typedef void (*KeyboardEventAction)( OSObject * target, + /* eventFlags */ unsigned eventType, + /* flags */ unsigned flags, + /* keyCode */ unsigned key, + /* charCode */ unsigned charCode, + /* charSet */ unsigned charSet, + /* originalCharCode */ unsigned origCharCode, + /* originalCharSet */ unsigned origCharSet, + /* keyboardType */ unsigned keyboardType, + /* repeat */ bool repeat, + /* atTime */ AbsoluteTime ts); + +typedef void (*KeyboardSpecialEventAction)(OSObject * target, + /* eventType */ unsigned eventType, + /* flags */ unsigned flags, + /* keyCode */ unsigned key, + /* specialty */ unsigned flavor, + /* source id */ UInt64 guid, + /* repeat */ bool repeat, + /* atTime */ AbsoluteTime ts); + +typedef void (*UpdateEventFlagsAction)( OSObject * target, + /* flags */ unsigned flags); + +/* Event Callback Definitions */ + +typedef void (*KeyboardEventCallback)( + /* target */ OSObject * target, + /* eventFlags */ unsigned eventType, + /* flags */ unsigned flags, + /* keyCode */ unsigned key, + /* charCode */ unsigned charCode, + /* charSet */ unsigned charSet, + /* originalCharCode */ unsigned origCharCode, + /* originalCharSet */ unsigned origCharSet, + /* keyboardType */ unsigned keyboardType, + /* repeat */ bool repeat, + /* atTime */ AbsoluteTime ts, + /* sender */ OSObject * sender, + /* refcon */ void * refcon); + +typedef void (*KeyboardSpecialEventCallback)( + /* target */ OSObject * target, + /* eventType */ unsigned eventType, + /* flags */ unsigned flags, + /* keyCode */ unsigned key, + /* specialty */ unsigned flavor, + /* source id */ UInt64 guid, + /* repeat */ bool repeat, + /* atTime */ AbsoluteTime ts, + /* sender */ OSObject * sender, + /* refcon */ void * refcon); + +typedef void (*UpdateEventFlagsCallback)( + /* target */ OSObject * target, + /* flags */ unsigned flags, + /* sender */ OSObject * sender, + /* refcon */ void * refcon); + +/* End Action Definitions */ + +/* Default key repeat parameters */ +#define EV_DEFAULTINITIALREPEAT 500000000ULL // 1/2 sec in nanoseconds +#define EV_DEFAULTKEYREPEAT 83333333ULL // 1/12 sec in nanoseconds +#define EV_MINKEYREPEAT 16700000ULL // 1/60 sec + +class IOHIKeyboard : public IOHIDevice +{ + OSDeclareDefaultStructors(IOHIKeyboard); + + friend class IOHIDKeyboardDevice; + friend class IOHIDKeyboardEventDevice; + friend class IOHIDKeyboard; + friend class IOHIDConsumer; + +protected: + IOLock * _deviceLock; // Lock for all device access + IOHIKeyboardMapper * _keyMap; // KeyMap instance + + // The following fields describe the kind of keyboard + UInt32 _interfaceType; + UInt32 _deviceType; + + // The following fields describe the state of the keyboard + UInt32 * _keyState; // kbdBitVector + IOByteCount _keyStateSize; // kbdBitVector allocated size + unsigned _eventFlags; // Current eventFlags + bool _alphaLock; // true means alpha lock is on + bool _numLock; // true means num lock is on + bool _charKeyActive; // true means char gen. key active + + // The following fields are used in performing key repeats + bool _isRepeat; // true means we're generating repeat + unsigned _codeToRepeat; // What we are repeating + bool _calloutPending; // true means we've sched. a callout + AbsoluteTime _lastEventTime; // Time last event was dispatched + AbsoluteTime _downRepeatTime; // Time when we should next repeat + AbsoluteTime _keyRepeat; // Delay between key repeats + AbsoluteTime _initialKeyRepeat; // Delay before initial key repeat + UInt64 _guid; + + OSObject * _keyboardEventTarget; + KeyboardEventAction _keyboardEventAction; + OSObject * _keyboardSpecialEventTarget; + KeyboardSpecialEventAction _keyboardSpecialEventAction; + OSObject * _updateEventFlagsTarget; + UpdateEventFlagsAction _updateEventFlagsAction; + + UInt16 _lastUsagePage; + UInt16 _lastUsage; + +protected: + virtual void dispatchKeyboardEvent(unsigned int keyCode, + /* direction */ bool goingDown, + /* timeStamp */ AbsoluteTime time); + void setLastPageAndUsage(UInt16 usagePage, UInt16 usage); + void getLastPageAndUsage(UInt16 &usagePage, UInt16 &usage); + void clearLastPageAndUsage(); + +public: + virtual bool init(OSDictionary * properties = 0) APPLE_KEXT_OVERRIDE; + virtual bool start(IOService * provider) APPLE_KEXT_OVERRIDE; + virtual void stop(IOService * provider) APPLE_KEXT_OVERRIDE; + virtual void free(void) APPLE_KEXT_OVERRIDE; + + virtual bool open(IOService * client, + IOOptionBits options, + KeyboardEventAction keAction, + KeyboardSpecialEventAction kseAction, + UpdateEventFlagsAction uefAction); + + bool open( IOService * client, + IOOptionBits options, + void *, + KeyboardEventCallback keCallback, + KeyboardSpecialEventCallback kseCallback, + UpdateEventFlagsCallback uefCallback); + + virtual void close(IOService * client, IOOptionBits ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn message( UInt32 type, IOService * provider, + void * argument = 0 ) APPLE_KEXT_OVERRIDE; + + virtual IOHIDKind hidKind( void ) APPLE_KEXT_OVERRIDE; + virtual bool updateProperties( void ) APPLE_KEXT_OVERRIDE; + virtual IOReturn setParamProperties(OSDictionary * dict) APPLE_KEXT_OVERRIDE; + virtual IOReturn setProperties( OSObject * properties ) APPLE_KEXT_OVERRIDE; + + inline bool isRepeat() {return _isRepeat;} + +protected: // for subclasses to implement + virtual const unsigned char * defaultKeymapOfLength(UInt32 * length); + virtual void setAlphaLockFeedback(bool val); + virtual void setNumLockFeedback(bool val); + virtual UInt32 maxKeyCodes(); + + +private: + virtual bool resetKeyboard(); + virtual void scheduleAutoRepeat(); + static void _autoRepeat(void * arg, void *); + virtual void autoRepeat(); + virtual void setRepeat(unsigned eventType, unsigned keyCode); + void setRepeatMode(bool repeat); + static void _createKeyboardNub(thread_call_param_t param0, thread_call_param_t param1); + +/* + * HISTORICAL NOTE: + * The following methods were part of the KeyMapDelegate protocol; + * the declarations have now been merged directly into this class. + */ + +public: + virtual void keyboardEvent(unsigned eventType, + /* flags */ unsigned flags, + /* keyCode */ unsigned keyCode, + /* charCode */ unsigned charCode, + /* charSet */ unsigned charSet, + /* originalCharCode */ unsigned origCharCode, + /* originalCharSet */ unsigned origCharSet); + + virtual void keyboardSpecialEvent(unsigned eventType, + /* flags */ unsigned flags, + /* keyCode */ unsigned keyCode, + /* specialty */ unsigned flavor); + + virtual void updateEventFlags(unsigned flags); // Does not generate events + + virtual unsigned eventFlags(); // Global event flags + virtual unsigned deviceFlags(); // per-device event flags + virtual void setDeviceFlags(unsigned flags); // Set device event flags + virtual bool alphaLock(); // current alpha-lock state + virtual void setAlphaLock(bool val); // Set current alpha-lock state + virtual bool numLock(); + virtual void setNumLock(bool val); + virtual bool charKeyActive(); // Is a character gen. key down? + virtual void setCharKeyActive(bool val); // Note that a char gen key is down. + virtual bool doesKeyLock(unsigned key); //does key lock physically + virtual unsigned getLEDStatus(); //check hardware for LED status + +private: + static void _keyboardEvent( IOHIKeyboard * self, + unsigned eventType, + /* flags */ unsigned flags, + /* keyCode */ unsigned key, + /* charCode */ unsigned charCode, + /* charSet */ unsigned charSet, + /* originalCharCode */ unsigned origCharCode, + /* originalCharSet */ unsigned origCharSet, + /* keyboardType */ unsigned keyboardType, + /* repeat */ bool repeat, + /* atTime */ AbsoluteTime ts); + static void _keyboardSpecialEvent( + IOHIKeyboard * self, + unsigned eventType, + /* flags */ unsigned flags, + /* keyCode */ unsigned key, + /* specialty */ unsigned flavor, + /* guid */ UInt64 guid, + /* repeat */ bool repeat, + /* atTime */ AbsoluteTime ts); + + static void _updateEventFlags( IOHIKeyboard * self, + unsigned flags); /* Does not generate events */ + +}; + +#endif /* !_IOHIKEYBOARD_H */ diff --git a/QualcommWireless/include/IOKit/hidsystem/IOHIKeyboardMapper.h b/QualcommWireless/include/IOKit/hidsystem/IOHIKeyboardMapper.h new file mode 100644 index 0000000..2fd3fdb --- /dev/null +++ b/QualcommWireless/include/IOKit/hidsystem/IOHIKeyboardMapper.h @@ -0,0 +1,247 @@ +/* + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +#ifndef _IOHIKEYBOARDMAPPER_H +#define _IOHIKEYBOARDMAPPER_H + +#include +#include +#include +#include + +class IOHIKeyboard; +class IOHIDSystem; + +/* + * Key ip/down state is tracked in a bit list. Bits are set + * for key-down, and cleared for key-up. The bit vector and macros + * for it's manipulation are defined here. + */ + +typedef UInt32 * kbdBitVector; + +#define EVK_BITS_PER_UNIT 32 +#define EVK_BITS_MASK 31 +#define EVK_BITS_SHIFT 5 // 1<<5 == 32, for cheap divide + +#define EVK_KEYDOWN(n, bits) \ + (bits)[((n)>>EVK_BITS_SHIFT)] |= (1 << ((n) & EVK_BITS_MASK)) + +#define EVK_KEYUP(n, bits) \ + (bits)[((n)>>EVK_BITS_SHIFT)] &= ~(1 << ((n) & EVK_BITS_MASK)) + +#define EVK_IS_KEYDOWN(n, bits) \ + (((bits)[((n)>>EVK_BITS_SHIFT)] & (1 << ((n) & EVK_BITS_MASK))) != 0) + +/* the maximum number of modifier keys sticky keys can hold at once */ +#define kMAX_MODIFIERS 5 + +/* the number of shift keys in a row that must be depressed to toggle state */ +#define kNUM_SHIFTS_TO_ACTIVATE 5 + +/* the number of milliseconds all the shifts must be pressed in - 30 seconds (30000 mS)*/ +#define kDEFAULT_SHIFTEXPIREINTERVAL 30000 + + +// sticky keys state flags +enum +{ + kState_Disabled_Flag = 0x0001, // disabled and will do nothing until this is changed + kState_ShiftActivates_Flag = 0x0002, // the 'on' gesture (5 shifts) will activate + kState_On = 0x0004, // currently on, will hold down modifiers when pressed + kState_On_ModifiersDown = 0x0008, // one or more modifiers being held down + kState_Mask = 0x00FF, // mask for all states +}; + +typedef struct _stickyKeys_ToggleInfo +{ + // size of this allocation + IOByteCount size; + + // which modifier key we are tracking (using NX_WHICHMODMASK) + unsigned toggleModifier; + + // the number of times the modifier must be pressed to toggle + unsigned repetitionsToToggle; + + // how long the user has to press the modifier repetitionsToToggle times + // the default is 30 seconds + AbsoluteTime expireInterval; + + // the number of times the modifier used within the alloted time + unsigned currentCount; + + // the times that the last shift must occer for this one to be used + // this array will actually be of size repetitionsToToggle + AbsoluteTime deadlines[1]; +} StickyKeys_ToggleInfo; + +// Flags for each sticky key modifier +// This will allow for chording of keys +// and for key locking +enum +{ + kModifier_DidPerformModifiy = 0x01, + kModifier_DidKeyUp = 0x02, + kModifier_Locked = 0x04, +}; +typedef struct _stickyKeys_ModifierInfo +{ + UInt8 key; // Key code of the sticky modifier + UInt8 state; // The state of the sticky modifier + UInt8 leftModBit; // System Mod bit of the sticky modifier +} StickyKeys_ModifierInfo; + +class IOHIDKeyboardDevice; + +class IOHIKeyboardMapper : public OSObject +{ + OSDeclareDefaultStructors(IOHIKeyboardMapper); + +private: + IOHIKeyboard * _delegate; // KeyMap delegate + bool _mappingShouldBeFreed; // true if map can be IOFree'd + NXParsedKeyMapping _parsedMapping; // current system-wide keymap + + // binary compatibility padding + struct ExpansionData { + + // This is for sticky keys + kbdBitVector cached_KeyBits; + + UInt32 specialKeyModifierFlags; + + SInt32 modifierSwap_Modifiers[NX_NUMMODIFIERS]; + + unsigned char * cachedAlphaLockModDefs; + }; + ExpansionData * _reserved; // Reserved for future use. (Internal use only) + +public: + static IOHIKeyboardMapper * keyboardMapper( + IOHIKeyboard * delegate, + const UInt8 * mapping, + UInt32 mappingLength, + bool mappingShouldBeFreed ); + + virtual bool init(IOHIKeyboard * delegate, + const UInt8 * mapping, + UInt32 mappingLength, + bool mappingShouldBeFreed); + virtual void free(void) APPLE_KEXT_OVERRIDE; + + virtual const UInt8 * mapping(); + virtual UInt32 mappingLength(); + virtual bool serialize(OSSerialize *s) const APPLE_KEXT_OVERRIDE; + + virtual void translateKeyCode(UInt8 key, bool keyDown, kbdBitVector keyBits); + virtual UInt8 getParsedSpecialKey(UInt8 logical); //retrieve a key from _parsedMapping + + virtual void setKeyboardTarget (IOService * keyboardTarget); + + virtual bool updateProperties (void); + virtual IOReturn setParamProperties (OSDictionary * dict); + + // keyEventPostProcess is called while a lock is not held, so a recursive + // call back into HIKeyboard is possible + virtual void keyEventPostProcess (void); + +private: + static void makeNumberParamProperty( OSDictionary * dict, const char * key, + unsigned long long number, unsigned int bits ); + + + virtual bool parseKeyMapping(const UInt8 * mapping, + UInt32 mappingLength, + NXParsedKeyMapping * parsedMapping) const; + + virtual void calcModBit(int bit, kbdBitVector keyBits); + virtual void doModCalc(int key, kbdBitVector keyBits); + virtual void doCharGen(int keyCode, bool down); + + /* sticky keys functionality */ +private: + // original translateKeyCode + void rawTranslateKeyCode (UInt8 key, bool keyDown, kbdBitVector keyBits); + + // post special keyboard events thru the event system + void postKeyboardSpecialEvent (unsigned subtype, unsigned eventType=NX_SYSDEFINED); + +private: + +private: +public: + OSMetaClassDeclareReservedUsed(IOHIKeyboardMapper, 0); + virtual IOReturn message( UInt32 type, IOService * provider, void * argument = 0 ); + + // binary compatibility padding + OSMetaClassDeclareReservedUnused(IOHIKeyboardMapper, 1); + OSMetaClassDeclareReservedUnused(IOHIKeyboardMapper, 2); + OSMetaClassDeclareReservedUnused(IOHIKeyboardMapper, 3); + OSMetaClassDeclareReservedUnused(IOHIKeyboardMapper, 4); + OSMetaClassDeclareReservedUnused(IOHIKeyboardMapper, 5); + OSMetaClassDeclareReservedUnused(IOHIKeyboardMapper, 6); + OSMetaClassDeclareReservedUnused(IOHIKeyboardMapper, 7); + OSMetaClassDeclareReservedUnused(IOHIKeyboardMapper, 8); + OSMetaClassDeclareReservedUnused(IOHIKeyboardMapper, 9); + OSMetaClassDeclareReservedUnused(IOHIKeyboardMapper, 10); + OSMetaClassDeclareReservedUnused(IOHIKeyboardMapper, 11); + OSMetaClassDeclareReservedUnused(IOHIKeyboardMapper, 12); + OSMetaClassDeclareReservedUnused(IOHIKeyboardMapper, 13); + OSMetaClassDeclareReservedUnused(IOHIKeyboardMapper, 14); + OSMetaClassDeclareReservedUnused(IOHIKeyboardMapper, 15); +}; + +#endif // _IOHIKEYBOARDMAPPER_H + +/* + * HISTORICAL NOTE: + * The "delegate" object had to respond to the following protocol; + * this protocol has since been merged into the IOHIKeyboard class. + * + * @protocol KeyMapDelegate + * + * - keyboardEvent :(unsigned)eventType + * flags :(unsigned)flags + * keyCode :(unsigned)keyCode + * charCode:(unsigned)charCode + * charSet :(unsigned)charSet + * originalCharCode:(unsigned)origCharCode + * originalCharSet:(unsigned)origCharSet; + * + * - keyboardSpecialEvent:(unsigned)eventType + * flags :(unsigned)flags + * keyCode :(unsigned)keyCode + * specialty:(unsigned)flavor; + * + * - updateEventFlags:(unsigned)flags; // Does not generate events + * + * - (unsigned)eventFlags; // Global event flags + * - (unsigned)deviceFlags; // per-device event flags + * - setDeviceFlags:(unsigned)flags; // Set device event flags + * - (bool)alphaLock; // current alpha-lock state + * - setAlphaLock:(bool)val; // Set current alpha-lock state + * - (bool)charKeyActive; // Is a character gen. key down? + * - setCharKeyActive:(bool)val; // Note that a char gen key is down. + * + * @end + */ diff --git a/QualcommWireless/include/IOKit/hidsystem/IOHIPointing.h b/QualcommWireless/include/IOKit/hidsystem/IOHIPointing.h new file mode 100644 index 0000000..22fce3c --- /dev/null +++ b/QualcommWireless/include/IOKit/hidsystem/IOHIPointing.h @@ -0,0 +1,256 @@ +/* + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 1999-2009 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +#ifndef _IOHIPOINTING_H +#define _IOHIPOINTING_H + +#include +#include +#include + +/* Start Action Definitions */ + +/* + * HISTORICAL NOTE: + * The following entry points were part of the IOHIPointingEvents + * protocol. + */ +typedef void (*RelativePointerEventAction)(OSObject * target, + /* buttons */ int buttons, + /* deltaX */ int dx, + /* deltaY */ int dy, + /* atTime */ AbsoluteTime ts); + +typedef void (*AbsolutePointerEventAction)(OSObject * target, + /* buttons */ int buttons, + /* at */ IOGPoint * newLoc, + /* withBounds */ IOGBounds *bounds, + /* inProximity */ bool proximity, + /* withPressure */ int pressure, + /* withAngle */ int stylusAngle, + /* atTime */ AbsoluteTime ts); + +typedef void (*ScrollWheelEventAction)(OSObject * target, + short deltaAxis1, + short deltaAxis2, + short deltaAxis3, + AbsoluteTime ts); + +/* Event Callback Definitions */ + +typedef void (*RelativePointerEventCallback)( + /* target */ OSObject * target, + /* buttons */ int buttons, + /* deltaX */ int dx, + /* deltaY */ int dy, + /* atTime */ AbsoluteTime ts, + /* sender */ OSObject * sender, + /* refcon */ void * refcon); + +typedef void (*AbsolutePointerEventCallback)( + /* target */ OSObject * target, + /* buttons */ int buttons, + /* at */ IOGPoint * newLoc, + /* withBounds */ IOGBounds *bounds, + /* inProximity */ bool proximity, + /* withPressure */ int pressure, + /* withAngle */ int stylusAngle, + /* atTime */ AbsoluteTime ts, + /* sender */ OSObject * sender, + /* refcon */ void * refcon); + +typedef void (*ScrollWheelEventCallback)( + /* target */ OSObject * target, + /* delta1 */ short deltaAxis1, + /* delta2 */ short deltaAxis2, + /* delta3 */ short deltaAxis3, + /* fixedDelta1 */ IOFixed fixedDelta1, + /* fixedDelta2 */ IOFixed fixedDelta2, + /* fixedDelta3 */ IOFixed fixedDelta3, + /* pointDelta1 */ SInt32 pointDelta1, + /* pointDelta2 */ SInt32 pointDelta2, + /* pointDelta3 */ SInt32 pointDelta3, + /* reserved */ SInt32 options, + /* atTime */ AbsoluteTime ts, + /* sender */ OSObject * sender, + /* refcon */ void * refcon); + +/* End Action Definitions */ + +/* Default accel level parameters */ +#define EV_DEFAULTPOINTERACCELLEVEL 0x0000b000 +#define EV_DEFAULTSCROLLACCELLEVEL 0x00005000 + +class IOHIDPointingDevice; +struct ScrollAccelInfo; + +class IOHIPointing : public IOHIDevice +{ + OSDeclareDefaultStructors(IOHIPointing); + + friend class IOHITablet; + friend class IOHIDPointing; + +private: + IOLock * _deviceLock; // Lock for all device access + int _buttonMode; // The "handedness" of the pointer + IOFixed _acceleration; + bool _convertAbsoluteToRelative; + bool _contactToMove; + bool _hadContact; + IOGPoint _previousLocation; + UInt8 _pressureThresholdToClick; // A scale factor of 0 to 255 to determine how much pressure is necessary to generate a primary mouse click - a value of 255 means no click will be generated + void * _scaleSegments; + IOItemCount _scaleSegCount; + IOFixed _fractX; + IOFixed _fractY; + + OSObject * _relativePointerEventTarget; + RelativePointerEventAction _relativePointerEventAction; + OSObject * _absolutePointerEventTarget; + AbsolutePointerEventAction _absolutePointerEventAction; + OSObject * _scrollWheelEventTarget; + ScrollWheelEventAction _scrollWheelEventAction; + + struct ExpansionData; + + ExpansionData * _reserved; + + void setPointingMode(UInt32 accelerateMode); + UInt32 getPointingMode (); + void setScrollType(UInt32 scrollType); + UInt32 getScrollType(); + + void dispatchScrollWheelEventWithAccelInfo( + SInt32 deltaAxis1, + SInt32 deltaAxis2, + SInt32 deltaAxis3, + ScrollAccelInfo * info, + AbsoluteTime ts); + + +protected: + virtual void dispatchRelativePointerEvent(int dx, + int dy, + UInt32 buttonState, + AbsoluteTime ts); + + virtual void dispatchAbsolutePointerEvent(IOGPoint * newLoc, + IOGBounds * bounds, + UInt32 buttonState, + bool proximity, + int pressure, + int pressureMin, + int pressureMax, + int stylusAngle, + AbsoluteTime ts); + + virtual void dispatchScrollWheelEvent(short deltaAxis1, + short deltaAxis2, + short deltaAxis3, + AbsoluteTime ts); + +public: + virtual bool init(OSDictionary * properties = 0) APPLE_KEXT_OVERRIDE; + virtual bool start(IOService * provider) APPLE_KEXT_OVERRIDE; + virtual void free(void) APPLE_KEXT_OVERRIDE; + + virtual bool open(IOService * client, + IOOptionBits options, + RelativePointerEventAction rpeAction, + AbsolutePointerEventAction apeAction, + ScrollWheelEventAction sweAction); + + bool open( IOService * client, + IOOptionBits options, + void *, + RelativePointerEventCallback rpeCallback, + AbsolutePointerEventCallback apeCallback, + ScrollWheelEventCallback sweCallback); + + virtual void close(IOService * client, IOOptionBits ) APPLE_KEXT_OVERRIDE; + virtual IOReturn message( UInt32 type, IOService * provider, + void * argument = 0 ) APPLE_KEXT_OVERRIDE; + + virtual IOHIDKind hidKind(void) APPLE_KEXT_OVERRIDE; + virtual bool updateProperties( void ) APPLE_KEXT_OVERRIDE; + virtual IOReturn setParamProperties( OSDictionary * dict ) APPLE_KEXT_OVERRIDE; + virtual IOReturn powerStateWillChangeTo( IOPMPowerFlags powerFlags, + unsigned long newState, IOService * device) APPLE_KEXT_OVERRIDE; + virtual IOReturn powerStateDidChangeTo( IOPMPowerFlags powerFlags, + unsigned long newState, IOService * device) APPLE_KEXT_OVERRIDE; + +protected: // for subclasses to implement + virtual OSData * copyAccelerationTable(); + virtual IOItemCount buttonCount(); + virtual IOFixed resolution(); + + // RY: Adding method to copy scroll wheel accel table. + // Unfortunately, we don't have any padding, so this + // is going to be non-virtual. + /*virtual*/ OSData * copyScrollAccelerationTable(); + +private: + virtual bool resetPointer(); + virtual void scalePointer(int * dxp, int * dyp); + virtual void setupForAcceleration(IOFixed accl); + + // RY: Adding methods to support scroll wheel accel. + // Unfortunately, we don't have any padding, so these + // are going to be non-virtual. + /*virtual*/ bool resetScroll(); + /*virtual*/ void setupScrollForAcceleration(IOFixed accl); + + // RY: We have to make sure that subclasses that will + // take advantage of this have their defined resolution + // in their property table. + /*virtual*/ IOFixed scrollResolutionForType(SInt32 type=-1); + /*virtual*/ IOFixed scrollReportRate(); + /*virtual*/ OSData * copyScrollAccelerationTableForType(SInt32 type=-1); + +private: + static void _relativePointerEvent( IOHIPointing * self, + int buttons, + /* deltaX */ int dx, + /* deltaY */ int dy, + /* atTime */ AbsoluteTime ts); + + /* Tablet event reporting */ + static void _absolutePointerEvent(IOHIPointing * self, + int buttons, + /* at */ IOGPoint * newLoc, + /* withBounds */ IOGBounds *bounds, + /* inProximity */ bool proximity, + /* withPressure */ int pressure, + /* withAngle */ int stylusAngle, + /* atTime */ AbsoluteTime ts); + + /* Mouse scroll wheel event reporting */ + static void _scrollWheelEvent(IOHIPointing *self, + short deltaAxis1, + short deltaAxis2, + short deltaAxis3, + AbsoluteTime ts); + +}; + +#endif /* !_IOHIPOINTING_H */ diff --git a/QualcommWireless/include/IOKit/hidsystem/IOLLEvent.h b/QualcommWireless/include/IOKit/hidsystem/IOLLEvent.h new file mode 100644 index 0000000..0a72a4e --- /dev/null +++ b/QualcommWireless/include/IOKit/hidsystem/IOLLEvent.h @@ -0,0 +1,586 @@ +/* + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 1999-2009 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/****************************************************************************** + event.h (PostScript side version) + + CONFIDENTIAL + Copyright (c) 1988 NeXT, Inc. as an unpublished work. + All Rights Reserved. + + Created Leo 01Mar88 + + Modified: + 04May88 Leo Final event types and record + 22Aug88 Leo Change short -> int for window, add reserved + 26May90 Ted Added NX_UNDIMMASK to correct triggering of UndoAutoDim + 12Dec91 Mike Brought into sync with dpsclient/event.h, and fixed + the #ifndef interlock with dpsclient/event.h that was + broken during the Great Header Revision. + + The PostScript version of this file differs from the + Window Kit version in that the coordinates here are + ints instead of floats. +******************************************************************************/ + +#ifndef _DEV_EVENT_H +#define _DEV_EVENT_H + +#include +#include +#include + +#ifdef EVENT_H /* Interlock with dpsclient/event.h */ +#if !defined(_NXSIZE_) /* Work around patch for old event.h in Phase 3 projs*/ +#define _NXSIZE_ 1 /* NXCoord, NXPoint, NXSize decl seen */ +#define _NXSize_ NXSize +#endif /* _NXSIZE_ */ +#else /* EVENT_H */ /* Haven't seen dpsclient/event.h, so define away */ +#define EVENT_H + +#ifdef KERNEL +#else /* KERNEL */ + +#if !defined(_NXSIZE_) /* Work around patch for old event.h in Phase 3 projs*/ +#define _NXSIZE_ 1 /* NXCoord, NXPoint, NXSize decl seen */ +typedef float NXCoord; + +typedef struct _NXPoint { /* point */ + NXCoord x, y; +} NXPoint; + +typedef struct _NXSize { /* size */ + NXCoord width, height; +} NXSize; +#define _NXSize_ NXSize /* Correct usage in event_status_driver.h */ +#endif /* _NXSIZE_ */ + +#endif /* KERNEL */ + +/* Event types */ + +#define NX_NULLEVENT 0 /* internal use */ + +/* mouse events */ + +#define NX_LMOUSEDOWN 1 /* left mouse-down event */ +#define NX_LMOUSEUP 2 /* left mouse-up event */ +#define NX_RMOUSEDOWN 3 /* right mouse-down event */ +#define NX_RMOUSEUP 4 /* right mouse-up event */ +#define NX_MOUSEMOVED 5 /* mouse-moved event */ +#define NX_LMOUSEDRAGGED 6 /* left mouse-dragged event */ +#define NX_RMOUSEDRAGGED 7 /* right mouse-dragged event */ +#define NX_MOUSEENTERED 8 /* mouse-entered event */ +#define NX_MOUSEEXITED 9 /* mouse-exited event */ + +/* other mouse events + * + * event.data.mouse.buttonNumber should contain the + * button number (2-31) changing state. + */ +#define NX_OMOUSEDOWN 25 /* other mouse-down event */ +#define NX_OMOUSEUP 26 /* other mouse-up event */ +#define NX_OMOUSEDRAGGED 27 /* other mouse-dragged event */ + +/* keyboard events */ + +#define NX_KEYDOWN 10 /* key-down event */ +#define NX_KEYUP 11 /* key-up event */ +#define NX_FLAGSCHANGED 12 /* flags-changed event */ + +/* composite events */ + +#define NX_KITDEFINED 13 /* application-kit-defined event */ +#define NX_SYSDEFINED 14 /* system-defined event */ +#define NX_APPDEFINED 15 /* application-defined event */ +/* There are additional DPS client defined events past this point. */ + +/* Scroll wheel events */ + +#define NX_SCROLLWHEELMOVED 22 + +/* Zoom events */ +#define NX_ZOOM 28 + +/* tablet events */ + +#define NX_TABLETPOINTER 23 /* for non-mousing transducers */ +#define NX_TABLETPROXIMITY 24 /* for non-mousing transducers */ + +/* event range */ + +#define NX_FIRSTEVENT 0 +#define NX_LASTEVENT 28 +#define NX_NUMPROCS (NX_LASTEVENT-NX_FIRSTEVENT+1) + +/* Event masks */ +#define NX_NULLEVENTMASK (1 << NX_NULLEVENT) /* NULL event */ +#define NX_LMOUSEDOWNMASK (1 << NX_LMOUSEDOWN) /* left mouse-down */ +#define NX_LMOUSEUPMASK (1 << NX_LMOUSEUP) /* left mouse-up */ +#define NX_RMOUSEDOWNMASK (1 << NX_RMOUSEDOWN) /* right mouse-down */ +#define NX_RMOUSEUPMASK (1 << NX_RMOUSEUP) /* right mouse-up */ +#define NX_OMOUSEDOWNMASK (1 << NX_OMOUSEDOWN) /* other mouse-down */ +#define NX_OMOUSEUPMASK (1 << NX_OMOUSEUP) /* other mouse-up */ +#define NX_MOUSEMOVEDMASK (1 << NX_MOUSEMOVED) /* mouse-moved */ +#define NX_LMOUSEDRAGGEDMASK (1 << NX_LMOUSEDRAGGED) /* left-dragged */ +#define NX_RMOUSEDRAGGEDMASK (1 << NX_RMOUSEDRAGGED) /* right-dragged */ +#define NX_OMOUSEDRAGGEDMASK (1 << NX_OMOUSEDRAGGED) /* other-dragged */ +#define NX_MOUSEENTEREDMASK (1 << NX_MOUSEENTERED) /* mouse-entered */ +#define NX_MOUSEEXITEDMASK (1 << NX_MOUSEEXITED) /* mouse-exited */ +#define NX_KEYDOWNMASK (1 << NX_KEYDOWN) /* key-down */ +#define NX_KEYUPMASK (1 << NX_KEYUP) /* key-up */ +#define NX_FLAGSCHANGEDMASK (1 << NX_FLAGSCHANGED) /* flags-changed */ +#define NX_KITDEFINEDMASK (1 << NX_KITDEFINED) /* kit-defined */ +#define NX_SYSDEFINEDMASK (1 << NX_SYSDEFINED) /* system-defined */ +#define NX_APPDEFINEDMASK (1 << NX_APPDEFINED) /* app-defined */ +#define NX_SCROLLWHEELMOVEDMASK (1 << NX_SCROLLWHEELMOVED) /* scroll wheel moved */ +#define NX_ZOOMMASK (1 << NX_ZOOM) /* Zoom */ +#define NX_TABLETPOINTERMASK (1 << NX_TABLETPOINTER) /* tablet pointer moved */ +#define NX_TABLETPROXIMITYMASK (1 << NX_TABLETPROXIMITY) /* tablet pointer proximity */ + +#define EventCodeMask(type) (1 << (type)) +#define NX_ALLEVENTS -1 /* Check for all events */ + +/* sub types for mouse and move events */ + +#define NX_SUBTYPE_DEFAULT 0 +#define NX_SUBTYPE_TABLET_POINT 1 +#define NX_SUBTYPE_TABLET_PROXIMITY 2 +#define NX_SUBTYPE_MOUSE_TOUCH 3 + +/* sub types for system defined events */ + +#define NX_SUBTYPE_POWER_KEY 1 +#define NX_SUBTYPE_AUX_MOUSE_BUTTONS 7 + +/* + * NX_SUBTYPE_AUX_CONTROL_BUTTONS usage + * + * The incoming NXEvent for other mouse button down/up has event.type + * NX_SYSDEFINED and event.data.compound.subtype NX_SUBTYPE_AUX_MOUSE_BUTTONS. + * Within the event.data.compound.misc.L[0] contains bits for all the buttons + * that have changed state, and event.data.compound.misc.L[1] contains the + * current button state as a bitmask, with 1 representing down, and 0 + * representing up. Bit 0 is the left button, bit one is the right button, + * bit 2 is the center button and so forth. + */ +#define NX_SUBTYPE_AUX_CONTROL_BUTTONS 8 + +#define NX_SUBTYPE_EJECT_KEY 10 +#define NX_SUBTYPE_SLEEP_EVENT 11 +#define NX_SUBTYPE_RESTART_EVENT 12 +#define NX_SUBTYPE_SHUTDOWN_EVENT 13 +#define NX_SUBTYPE_MENU 16 +#define NX_SUBTYPE_ACCESSIBILITY 17 + + + +#define NX_SUBTYPE_STICKYKEYS_ON 100 +#define NX_SUBTYPE_STICKYKEYS_OFF 101 +#define NX_SUBTYPE_STICKYKEYS_SHIFT 102 +#define NX_SUBTYPE_STICKYKEYS_CONTROL 103 +#define NX_SUBTYPE_STICKYKEYS_ALTERNATE 104 +#define NX_SUBTYPE_STICKYKEYS_COMMAND 105 +#define NX_SUBTYPE_STICKYKEYS_RELEASE 106 +#define NX_SUBTYPE_STICKYKEYS_TOGGLEMOUSEDRIVING 107 + +// New stickykeys key events +// These were created to send an event describing the +// different state of the modifiers +#define NX_SUBTYPE_STICKYKEYS_SHIFT_DOWN 110 +#define NX_SUBTYPE_STICKYKEYS_CONTROL_DOWN 111 +#define NX_SUBTYPE_STICKYKEYS_ALTERNATE_DOWN 112 +#define NX_SUBTYPE_STICKYKEYS_COMMAND_DOWN 113 +#define NX_SUBTYPE_STICKYKEYS_FN_DOWN 114 + +#define NX_SUBTYPE_STICKYKEYS_SHIFT_LOCK 120 +#define NX_SUBTYPE_STICKYKEYS_CONTROL_LOCK 121 +#define NX_SUBTYPE_STICKYKEYS_ALTERNATE_LOCK 122 +#define NX_SUBTYPE_STICKYKEYS_COMMAND_LOCK 123 +#define NX_SUBTYPE_STICKYKEYS_FN_LOCK 124 + +#define NX_SUBTYPE_STICKYKEYS_SHIFT_UP 130 +#define NX_SUBTYPE_STICKYKEYS_CONTROL_UP 131 +#define NX_SUBTYPE_STICKYKEYS_ALTERNATE_UP 132 +#define NX_SUBTYPE_STICKYKEYS_COMMAND_UP 133 +#define NX_SUBTYPE_STICKYKEYS_FN_UP 134 + + + +// SlowKeys +#define NX_SUBTYPE_SLOWKEYS_START 200 +#define NX_SUBTYPE_SLOWKEYS_ABORT 201 +#define NX_SUBTYPE_SLOWKEYS_END 202 + +// HID Parameter Property Modified +#define NX_SUBTYPE_HIDPARAMETER_MODIFIED 210 + +/* Masks for the bits in event.flags */ + +/* device-independent */ + +#define NX_ALPHASHIFTMASK 0x00010000 +#define NX_SHIFTMASK 0x00020000 +#define NX_CONTROLMASK 0x00040000 +#define NX_ALTERNATEMASK 0x00080000 +#define NX_COMMANDMASK 0x00100000 +#define NX_NUMERICPADMASK 0x00200000 +#define NX_HELPMASK 0x00400000 +#define NX_SECONDARYFNMASK 0x00800000 +#define NX_ALPHASHIFT_STATELESS_MASK 0x01000000 + +/* device-dependent (really?) */ + +#define NX_DEVICELCTLKEYMASK 0x00000001 +#define NX_DEVICELSHIFTKEYMASK 0x00000002 +#define NX_DEVICERSHIFTKEYMASK 0x00000004 +#define NX_DEVICELCMDKEYMASK 0x00000008 +#define NX_DEVICERCMDKEYMASK 0x00000010 +#define NX_DEVICELALTKEYMASK 0x00000020 +#define NX_DEVICERALTKEYMASK 0x00000040 +#define NX_DEVICE_ALPHASHIFT_STATELESS_MASK 0x00000080 +#define NX_DEVICERCTLKEYMASK 0x00002000 + +/* + * Additional reserved bits in event.flags + */ + +#define NX_STYLUSPROXIMITYMASK 0x00000080 /* deprecated */ +#define NX_NONCOALSESCEDMASK 0x00000100 + +/* click state values + * If you have the following events in close succession, the click + * field has the indicated value: + * + * Event Click Value Comments + * mouse-down 1 Not part of any click yet + * mouse-up 1 Aha! A click! + * mouse-down 2 Doing a double-click + * mouse-up 2 It's finished + * mouse-down 3 A triple + * mouse-up 3 + */ + +/* Values for the character set in event.data.key.charSet */ + +#define NX_ASCIISET 0 +#define NX_SYMBOLSET 1 +#define NX_DINGBATSSET 2 + +/* tablet button masks + * Mask bits for the tablet barrel buttons placed in tablet.buttons. + * The buttons field uses adopts the following convention: + * + * Bit Comments + * 0 Left Mouse Button ( kHIDUsage_Button_1 ) + * 1 Right Mouse Button ( kHIDUsage_Button_2 ) + * 2 Middle Mouse Button ( kHIDUsage_Button_3 ) + * 3 4th Mouse Button ( kHIDUsage_Button_4 ) + * ... + * 15 15th Mouse Button + * + * For your convenience, the following mask bits have been defined + * for tablet specific application: + */ + +#define NX_TABLET_BUTTON_PENTIPMASK 0x0001 +#define NX_TABLET_BUTTON_PENLOWERSIDEMASK 0x0002 +#define NX_TABLET_BUTTON_PENUPPERSIDEMASK 0x0004 + + +/* tablet capability masks + * Mask bits for the tablet capabilities field. Use these + * masks with the capabilities field of a proximity event to + * determine what fields in a Tablet Event are valid for this + * device. + */ +#define NX_TABLET_CAPABILITY_DEVICEIDMASK 0x0001 +#define NX_TABLET_CAPABILITY_ABSXMASK 0x0002 +#define NX_TABLET_CAPABILITY_ABSYMASK 0x0004 +#define NX_TABLET_CAPABILITY_VENDOR1MASK 0x0008 +#define NX_TABLET_CAPABILITY_VENDOR2MASK 0x0010 +#define NX_TABLET_CAPABILITY_VENDOR3MASK 0x0020 +#define NX_TABLET_CAPABILITY_BUTTONSMASK 0x0040 +#define NX_TABLET_CAPABILITY_TILTXMASK 0x0080 +#define NX_TABLET_CAPABILITY_TILTYMASK 0x0100 +#define NX_TABLET_CAPABILITY_ABSZMASK 0x0200 +#define NX_TABLET_CAPABILITY_PRESSUREMASK 0x0400 +#define NX_TABLET_CAPABILITY_TANGENTIALPRESSUREMASK 0x0800 +#define NX_TABLET_CAPABILITY_ORIENTINFOMASK 0x1000 +#define NX_TABLET_CAPABILITY_ROTATIONMASK 0x2000 + +/* proximity pointer types + * Value that describes the type of pointing device placed in + * proximity.pointerType. + */ + +#define NX_TABLET_POINTER_UNKNOWN 0 +#define NX_TABLET_POINTER_PEN 1 +#define NX_TABLET_POINTER_CURSOR 2 +#define NX_TABLET_POINTER_ERASER 3 + +/* TabletPointData type: defines the tablet data for points included + * in mouse events created by a tablet driver. + */ + +typedef struct _NXTabletPointData { + SInt32 x; /* absolute x coordinate in tablet space at full tablet resolution */ + SInt32 y; /* absolute y coordinate in tablet space at full tablet resolution */ + SInt32 z; /* absolute z coordinate in tablet space at full tablet resolution */ + UInt16 buttons; /* one bit per button - bit 0 is first button - 1 = closed */ + UInt16 pressure; /* scaled pressure value; MAX=(2^16)-1, MIN=0 */ + struct { /* tilt range is -((2^15)-1) to (2^15)-1 (-32767 to 32767) */ + SInt16 x; /* scaled tilt x value */ + SInt16 y; /* scaled tilt y value */ + } tilt; + UInt16 rotation; /* Fixed-point representation of device rotation in a 10.6 format */ + SInt16 tangentialPressure; /* tangential pressure on the device; same range as tilt */ + UInt16 deviceID; /* system-assigned unique device ID */ + SInt16 vendor1; /* vendor-defined signed 16-bit integer */ + SInt16 vendor2; /* vendor-defined signed 16-bit integer */ + SInt16 vendor3; /* vendor-defined signed 16-bit integer */ +} NXTabletPointData, *NXTabletPointDataPtr; + +/* TabletProximityData type: defines the tablet data for proximity + * events included in mouse events created by a tablet driver. + */ + +typedef struct _NXTabletProximityData { + UInt16 vendorID; /* vendor-defined ID - typically the USB vendor ID */ + UInt16 tabletID; /* vendor-defined tablet ID - typically the USB product ID */ + UInt16 pointerID; /* vendor-defined ID of the specific pointing device */ + UInt16 deviceID; /* system-assigned unique device ID */ + UInt16 systemTabletID; /* system-assigned unique tablet ID */ + UInt16 vendorPointerType; /* vendor-defined pointer type */ + UInt32 pointerSerialNumber; /* vendor-defined serial number */ + UInt64 uniqueID __attribute__ ((packed)); /* vendor-defined unique ID */ + UInt32 capabilityMask; /* capabilities mask of the device */ + UInt8 pointerType; /* type of pointing device */ + UInt8 enterProximity; /* non-zero = entering; zero = leaving */ + SInt16 reserved1; +} NXTabletProximityData, *NXTabletProximityDataPtr; + +/* EventData type: defines the data field of an event */ + +typedef union { + struct { /* For mouse-down and mouse-up events */ + UInt8 subx; /* sub-pixel position for x */ + UInt8 suby; /* sub-pixel position for y */ + SInt16 eventNum; /* unique identifier for this button */ + SInt32 click; /* click state of this event */ + UInt8 pressure; /* pressure value: 0=none, 255=full */ + UInt8 buttonNumber;/* button generating other button event (0-31) */ + UInt8 subType; + UInt8 reserved2; + SInt32 reserved3; + union { + NXTabletPointData point; /* tablet point data */ + NXTabletProximityData proximity; /* tablet proximity data */ + } tablet; + } mouse; + struct { + SInt32 dx; + SInt32 dy; + UInt8 subx; + UInt8 suby; + UInt8 subType; + UInt8 reserved1; + SInt32 reserved2; + union { + NXTabletPointData point; /* tablet point data */ + NXTabletProximityData proximity; /* tablet proximity data */ + } tablet; + } mouseMove; + struct { /* For key-down and key-up events */ + UInt16 origCharSet; /* unmodified character set code */ + SInt16 repeat; /* for key-down: nonzero if really a repeat */ + UInt16 charSet; /* character set code */ + UInt16 charCode; /* character code in that set */ + UInt16 keyCode; /* device-dependent key number */ + UInt16 origCharCode; /* unmodified character code */ + SInt32 reserved1; + UInt32 keyboardType; + SInt32 reserved2; + SInt32 reserved3; + SInt32 reserved4; + SInt32 reserved5[4]; + } key; + struct { /* For mouse-entered and mouse-exited events */ + SInt16 reserved; + SInt16 eventNum; /* unique identifier from mouse down event */ + SInt32 trackingNum; /* unique identifier from settrackingrect */ + SInt32 userData; /* uninterpreted integer from settrackingrect */ + SInt32 reserved1; + SInt32 reserved2; + SInt32 reserved3; + SInt32 reserved4; + SInt32 reserved5; + SInt32 reserved6[4]; + } tracking; + struct { + SInt16 deltaAxis1; + SInt16 deltaAxis2; + SInt16 deltaAxis3; + SInt16 reserved1; + SInt32 fixedDeltaAxis1; + SInt32 fixedDeltaAxis2; + SInt32 fixedDeltaAxis3; + SInt32 pointDeltaAxis1; + SInt32 pointDeltaAxis2; + SInt32 pointDeltaAxis3; + SInt32 reserved8[4]; + } scrollWheel, zoom; + struct { /* For window-changed, sys-defined, and app-defined events */ + SInt16 reserved; + SInt16 subType; /* event subtype for compound events */ + union { + float F[11]; /* for use in compound events */ + SInt32 L[11]; /* for use in compound events */ + SInt16 S[22]; /* for use in compound events */ + char C[44]; /* for use in compound events */ + } misc; + } compound; + struct { + SInt32 x; /* absolute x coordinate in tablet space at full tablet resolution */ + SInt32 y; /* absolute y coordinate in tablet space at full tablet resolution */ + SInt32 z; /* absolute z coordinate in tablet space at full tablet resolution */ + UInt16 buttons; /* one bit per button - bit 0 is first button - 1 = closed */ + UInt16 pressure; /* scaled pressure value; MAX=(2^16)-1, MIN=0 */ + struct { /* tilt range is -((2^15)-1) to (2^15)-1 (-32767 to 32767) */ + SInt16 x; /* scaled tilt x value */ + SInt16 y; /* scaled tilt y value */ + } tilt; + UInt16 rotation; /* Fixed-point representation of device rotation in a 10.6 format */ + SInt16 tangentialPressure; /* tangential pressure on the device; same range as tilt */ + UInt16 deviceID; /* system-assigned unique device ID */ + SInt16 vendor1; /* vendor-defined signed 16-bit integer */ + SInt16 vendor2; /* vendor-defined signed 16-bit integer */ + SInt16 vendor3; /* vendor-defined signed 16-bit integer */ + SInt32 reserved[4]; + } tablet; + struct { + UInt16 vendorID; /* vendor-defined ID - typically the USB vendor ID */ + UInt16 tabletID; /* vendor-defined tablet ID - typically the USB product ID */ + UInt16 pointerID; /* vendor-defined ID of the specific pointing device */ + UInt16 deviceID; /* system-assigned unique device ID */ + UInt16 systemTabletID; /* system-assigned unique tablet ID */ + UInt16 vendorPointerType; /* vendor-defined pointer type */ + UInt32 pointerSerialNumber; /* vendor-defined serial number */ + UInt64 uniqueID __attribute__ ((packed)); /* vendor-defined unique ID */ + UInt32 capabilityMask; /* capabilities mask of the device */ + UInt8 pointerType; /* type of pointing device */ + UInt8 enterProximity; /* non-zero = entering; zero = leaving */ + SInt16 reserved1; + SInt32 reserved2[4]; + } proximity; +} NXEventData; + +/* The current version number of the NXEventData structure. */ + +#define kNXEventDataVersion 2 + +/* Finally! The event record! */ +#ifndef __ppc__ +typedef struct _NXEvent { + SInt32 type; /* An event type from above */ + struct { + SInt32 x, y; /* Base coordinates in window, */ + } location; /* from bottom left */ + UInt64 time __attribute__ ((packed)); /* time since launch */ + SInt32 flags; /* key state flags */ + UInt32 window; /* window number of assigned window */ + UInt64 service_id __attribute__ ((packed)); /* service id */ + SInt32 ext_pid; /* external pid */ + NXEventData data; /* type-dependent data */ +} NXEvent, *NXEventPtr; + +#else + +typedef struct _NXEvent { + SInt32 type; /* An event type from above */ + struct { + SInt32 x, y; /* Base coordinates in window, */ + } location; /* from bottom left */ + UInt64 time __attribute__ ((packed)); /* time since launch */ + SInt32 flags; /* key state flags */ + UInt32 window; /* window number of assigned window */ + NXEventData data; /* type-dependent data */ + UInt64 service_id __attribute__ ((packed)); /* service id */ + SInt32 ext_pid; /* external pid */ +} NXEvent, *NXEventPtr; + +#endif + +/* The current version number of the NXEvent structure. */ + +#define kNXEventVersion 2 + +/* How to pick window(s) for event (for PostEvent) */ +#define NX_NOWINDOW -1 +#define NX_BYTYPE 0 +#define NX_BROADCAST 1 +#define NX_TOPWINDOW 2 +#define NX_FIRSTWINDOW 3 +#define NX_MOUSEWINDOW 4 +#define NX_NEXTWINDOW 5 +#define NX_LASTLEFT 6 +#define NX_LASTRIGHT 7 +#define NX_LASTKEY 8 +#define NX_EXPLICIT 9 +#define NX_TRANSMIT 10 +#define NX_BYPSCONTEXT 11 + +#endif /* EVENT_H */ /* End of defs common with dpsclient/event.h */ + +/* Mask of events that cause the screen to wake up */ +#define NX_WAKEMASK ( NX_KEYDOWNMASK | NX_FLAGSCHANGEDMASK | \ + NX_LMOUSEDOWNMASK | NX_LMOUSEUPMASK | \ + NX_RMOUSEDOWNMASK | NX_RMOUSEUPMASK | \ + NX_OMOUSEDOWNMASK | NX_OMOUSEUPMASK \ + ) + +/* Mask of events that cause screen to undim */ +#define NX_UNDIMMASK ( NX_WAKEMASK | NX_KEYUPMASK | NX_SCROLLWHEELMOVEDMASK | \ + NX_LMOUSEDRAGGEDMASK | NX_RMOUSEDRAGGEDMASK | NX_OMOUSEDRAGGEDMASK | \ + NX_MOUSEMOVEDMASK | NX_MOUSEENTEREDMASK | NX_MOUSEEXITEDMASK | \ + NX_TABLETPOINTERMASK | NX_TABLETPROXIMITYMASK \ + ) + + +#define NX_EVENT_EXTENSION_LOCATION_INVALID 0x1 +#define NX_EVENT_EXTENSION_LOCATION_TYPE_FLOAT 0x2 +#define NX_EVENT_EXTENSION_LOCATION_DEVICE_SCALED 0x4 +#define NX_EVENT_EXTENSION_MOUSE_DELTA_TYPE_FLOAT 0x8 +#define NX_EVENT_EXTENSION_AUDIT_TOKEN 0x10 + +typedef struct _NXEventExtension { + UInt32 flags; + audit_token_t audit; +} NXEventExtension; + +typedef struct _NXEventExt { + NXEvent payload; + NXEventExtension extension; +} NXEventExt; + +#endif /* !_DEV_EVENT_H */ + diff --git a/QualcommWireless/include/IOKit/hidsystem/ev_keymap.h b/QualcommWireless/include/IOKit/hidsystem/ev_keymap.h new file mode 100644 index 0000000..e6db930 --- /dev/null +++ b/QualcommWireless/include/IOKit/hidsystem/ev_keymap.h @@ -0,0 +1,171 @@ +/* + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* Copyright (c) 1992 NeXT Computer, Inc. All rights reserved. + * + * ev_keymap.h + * Defines the structure used for parsing keymappings. These structures + * and definitions are used by event sources in the kernel and by + * applications and utilities which manipulate keymaps. + * + * HISTORY + * 02-Jun-1992 Mike Paquette at NeXT + * Created. + */ + +#ifndef _DEV_EV_KEYMAP_H +#define _DEV_EV_KEYMAP_H + +#define NX_NUMKEYCODES 256 /* Highest key code is 0xff. ADB used to use 0x80 for keydown state, but who the heck uses adb anymore. */ +#define NX_NUMSEQUENCES 128 /* Maximum possible number of sequences */ +#define NX_NUMMODIFIERS 16 /* Maximum number of modifier bits */ +#define NX_BYTE_CODES 0 /* If first short 0, all are bytes (else shorts) */ + +#define NX_WHICHMODMASK 0x0f /* bits out of keyBits for bucky bits */ +#define NX_MODMASK 0x10 /* Bit out of keyBits indicates modifier bit */ +#define NX_CHARGENMASK 0x20 /* bit out of keyBits for char gen */ +#define NX_SPECIALKEYMASK 0x40 /* bit out of keyBits for specialty key */ +#define NX_KEYSTATEMASK 0x80 /* OBSOLETE - DO NOT USE IN NEW DESIGNS */ + +/* + * Special keys currently known to and understood by the system. + * If new specialty keys are invented, extend this list as appropriate. + * The presence of these keys in a particular implementation is not + * guaranteed. + */ +#define NX_NOSPECIALKEY 0xFFFF +#define NX_KEYTYPE_SOUND_UP 0 +#define NX_KEYTYPE_SOUND_DOWN 1 +#define NX_KEYTYPE_BRIGHTNESS_UP 2 +#define NX_KEYTYPE_BRIGHTNESS_DOWN 3 +#define NX_KEYTYPE_CAPS_LOCK 4 +#define NX_KEYTYPE_HELP 5 +#define NX_POWER_KEY 6 +#define NX_KEYTYPE_MUTE 7 +#define NX_UP_ARROW_KEY 8 +#define NX_DOWN_ARROW_KEY 9 +#define NX_KEYTYPE_NUM_LOCK 10 + +#define NX_KEYTYPE_CONTRAST_UP 11 +#define NX_KEYTYPE_CONTRAST_DOWN 12 +#define NX_KEYTYPE_LAUNCH_PANEL 13 +#define NX_KEYTYPE_EJECT 14 +#define NX_KEYTYPE_VIDMIRROR 15 + +#define NX_KEYTYPE_PLAY 16 +#define NX_KEYTYPE_NEXT 17 +#define NX_KEYTYPE_PREVIOUS 18 +#define NX_KEYTYPE_FAST 19 +#define NX_KEYTYPE_REWIND 20 + +#define NX_KEYTYPE_ILLUMINATION_UP 21 +#define NX_KEYTYPE_ILLUMINATION_DOWN 22 +#define NX_KEYTYPE_ILLUMINATION_TOGGLE 23 + +#define NX_NUMSPECIALKEYS 24 /* Maximum number of special keys */ +#define NX_NUM_SCANNED_SPECIALKEYS 24 /* First 24 special keys are */ + /* actively scanned in kernel */ + +#define NX_KEYTYPE_MENU 25 + +/* Mask of special keys that are posted as events */ + +#define NX_SPECIALKEY_POST_MASK \ + ((1 << NX_KEYTYPE_SOUND_UP) | (1 << NX_KEYTYPE_SOUND_DOWN) | \ + (1 << NX_POWER_KEY) | (1 << NX_KEYTYPE_MUTE) | \ + (1 << NX_KEYTYPE_BRIGHTNESS_UP) | (1 << NX_KEYTYPE_BRIGHTNESS_DOWN) | \ + (1 << NX_KEYTYPE_CONTRAST_UP) | (1 << NX_KEYTYPE_CONTRAST_UP) | \ + (1 << NX_KEYTYPE_LAUNCH_PANEL) | (1 << NX_KEYTYPE_EJECT) | \ + (1 << NX_KEYTYPE_VIDMIRROR) | (1 << NX_KEYTYPE_PLAY) | \ + (1 << NX_KEYTYPE_NEXT) | (1 << NX_KEYTYPE_PREVIOUS) | \ + (1 << NX_KEYTYPE_FAST) | (1 << NX_KEYTYPE_REWIND) | \ + (1 << NX_KEYTYPE_ILLUMINATION_UP) | \ + (1 << NX_KEYTYPE_ILLUMINATION_DOWN) | \ + (1 << NX_KEYTYPE_ILLUMINATION_TOGGLE) | 0) + +/* Modifier key indices into modDefs[] */ +#define NX_MODIFIERKEY_ALPHALOCK 0 +#define NX_MODIFIERKEY_SHIFT 1 +#define NX_MODIFIERKEY_CONTROL 2 +#define NX_MODIFIERKEY_ALTERNATE 3 +#define NX_MODIFIERKEY_COMMAND 4 +#define NX_MODIFIERKEY_NUMERICPAD 5 +#define NX_MODIFIERKEY_HELP 6 +#define NX_MODIFIERKEY_SECONDARYFN 7 +#define NX_MODIFIERKEY_NUMLOCK 8 + +/* support for right hand modifier */ +#define NX_MODIFIERKEY_RSHIFT 9 +#define NX_MODIFIERKEY_RCONTROL 10 +#define NX_MODIFIERKEY_RALTERNATE 11 +#define NX_MODIFIERKEY_RCOMMAND 12 + +#define NX_MODIFIERKEY_ALPHALOCK_STATELESS 13 +#define NX_MODIFIERKEY_LAST_KEY 13 + + +typedef struct _NXParsedKeyMapping_ { + /* If nonzero, all numbers are shorts; if zero, all numbers are bytes*/ + short shorts; + + /* + * For each keycode, low order bit says if the key + * generates characters. + * High order bit says if the key is assigned to a modifier bit. + * The second to low order bit gives the current state of the key. + */ + char keyBits[NX_NUMKEYCODES]; + + /* Bit number of highest numbered modifier bit */ + int maxMod; + + /* Pointers to where the list of keys for each modifiers bit begins, + * or NULL. + */ + unsigned char *modDefs[NX_NUMMODIFIERS]; + + /* Key code of highest key deinfed to generate characters */ + int numDefs; + + /* Pointer into the keyMapping where this key's definitions begin */ + unsigned char *keyDefs[NX_NUMKEYCODES]; + + /* number of sequence definitions */ + int numSeqs; + + /* pointers to sequences */ + unsigned char *seqDefs[NX_NUMSEQUENCES]; + + /* Special key definitions */ + int numSpecialKeys; + + /* Special key values, or 0xFFFF if none */ + unsigned short specialKeys[NX_NUMSPECIALKEYS]; + + /* Pointer to the original keymapping string */ + const unsigned char *mapping; + + /* Length of the original string */ + int mappingLen; +} NXParsedKeyMapping; + +#endif /* !_DEV_EV_KEYMAP_H */ diff --git a/QualcommWireless/include/IOKit/i2c/IOI2CInterface.h b/QualcommWireless/include/IOKit/i2c/IOI2CInterface.h new file mode 100644 index 0000000..0a10f74 --- /dev/null +++ b/QualcommWireless/include/IOKit/i2c/IOI2CInterface.h @@ -0,0 +1,262 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOI2CINTERFACE_H +#define _IOKIT_IOI2CINTERFACE_H + +#include /* IOOptionBits */ +#include /* uint32_t */ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +typedef struct IOI2CRequest IOI2CRequest; +typedef struct IOI2CBuffer IOI2CBuffer; + +typedef void (*IOI2CRequestCompletion) (IOI2CRequest * request); + +// IOI2CRequest.sendTransactionType, IOI2CRequest.replyTransactionType +enum { + kIOI2CNoTransactionType = 0, + kIOI2CSimpleTransactionType = 1, + kIOI2CDDCciReplyTransactionType = 2, + kIOI2CCombinedTransactionType = 3, + kIOI2CDisplayPortNativeTransactionType = 4 +}; + +// IOI2CRequest.commFlags +enum { + kIOI2CUseSubAddressCommFlag = 0x00000002 +}; + +/*! + * @struct IOI2CRequest + * @abstract A structure defining an I2C bus transaction. + * @discussion This structure is used to request an I2C transaction consisting of a send (write) to and reply (read) from a device, either of which is optional, to be carried out atomically on an I2C bus. + * @field __reservedA Set to zero. + * @field result The result of the transaction. Common errors are kIOReturnNoDevice if there is no device responding at the given address, kIOReturnUnsupportedMode if the type of transaction is unsupported on the requested bus. + * @field completion A completion routine to be executed when the request completes. If NULL is passed, the request is synchronous, otherwise it may execute asynchronously. + * @field commFlags Flags that modify the I2C transaction type. The following flags are defined:
+ * kIOI2CUseSubAddressCommFlag Transaction includes a subaddress.
+ * @field minReplyDelay Minimum delay as absolute time between send and reply transactions. + * @field sendAddress I2C address to write. + * @field sendSubAddress I2C subaddress to write. + * @field __reservedB Set to zero. + * @field sendTransactionType The following types of transaction are defined for the send part of the request:
+ * kIOI2CNoTransactionType No send transaction to perform.
+ * kIOI2CSimpleTransactionType Simple I2C message.
+ * kIOI2CCombinedTransactionType Combined format I2C R/~W transaction.
+ * @field sendBuffer Pointer to the send buffer. + * @field sendBytes Number of bytes to send. Set to actual bytes sent on completion of the request. + * @field replyAddress I2C Address from which to read. + * @field replySubAddress I2C Address from which to read. + * @field __reservedC Set to zero. + * @field replyTransactionType The following types of transaction are defined for the reply part of the request:
+ * kIOI2CNoTransactionType No reply transaction to perform.
+ * kIOI2CSimpleTransactionType Simple I2C message.
+ * kIOI2CDDCciReplyTransactionType DDC/ci message (with embedded length). See VESA DDC/ci specification.
+ * kIOI2CCombinedTransactionType Combined format I2C R/~W transaction.
+ * @field replyBuffer Pointer to the reply buffer. + * @field replyBytes Max bytes to reply (size of replyBuffer). Set to actual bytes received on completion of the request. + * @field __reservedD Set to zero. + */ + +#pragma pack(push, 4) +struct IOI2CRequest +{ + IOOptionBits sendTransactionType; + IOOptionBits replyTransactionType; + uint32_t sendAddress; + uint32_t replyAddress; + uint8_t sendSubAddress; + uint8_t replySubAddress; + uint8_t __reservedA[2]; + + uint64_t minReplyDelay; + + IOReturn result; + IOOptionBits commFlags; + +#if defined(__LP64__) + uint32_t __padA; +#else + vm_address_t sendBuffer; +#endif + uint32_t sendBytes; + + uint32_t __reservedB[2]; + +#if defined(__LP64__) + uint32_t __padB; +#else + vm_address_t replyBuffer; +#endif + uint32_t replyBytes; + + IOI2CRequestCompletion completion; +#if !defined(__LP64__) + uint32_t __padC[5]; +#else + vm_address_t sendBuffer; + vm_address_t replyBuffer; +#endif + + uint32_t __reservedC[10]; +}; +#pragma pack(pop) + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#define kIOI2CInterfaceClassName "IOI2CInterface" + +#define kIOI2CInterfaceIDKey "IOI2CInterfaceID" +#define kIOI2CBusTypeKey "IOI2CBusType" +#define kIOI2CTransactionTypesKey "IOI2CTransactionTypes" +#define kIOI2CSupportedCommFlagsKey "IOI2CSupportedCommFlags" + +#define kIOFBI2CInterfaceInfoKey "IOFBI2CInterfaceInfo" +#define kIOFBI2CInterfaceIDsKey "IOFBI2CInterfaceIDs" + +// kIOI2CBusTypeKey values +enum { + kIOI2CBusTypeI2C = 1, + kIOI2CBusTypeDisplayPort = 2 +}; + +/*! + * @struct IOI2CBusTiming + * @abstract A structure defining low level timing for an I2C bus. + * @discussion This structure is used to specify timeouts and pulse widths for an I2C bus implementation. + * @field bitTimeout Maximum time a slave can delay (by pulling the clock line low) a single bit response. + * @field byteTimeout Maximum time a slave can delay (by pulling the clock line low) the first bit of a byte response. + * @field acknowledgeTimeout Maximum time to wait for a slave to respond with an ACK after writing a byte. + * @field startTimeout Maximum time to wait for a slave to respond after a start signal. + * @field riseFallTime Time to wait after any change in output signal. + * @field __reservedA Set to zero. + */ + +struct IOI2CBusTiming +{ + AbsoluteTime bitTimeout; + AbsoluteTime byteTimeout; + AbsoluteTime acknowledgeTimeout; + AbsoluteTime startTimeout; + AbsoluteTime holdTime; + AbsoluteTime riseFallTime; + UInt32 __reservedA[8]; +}; +typedef struct IOI2CBusTiming IOI2CBusTiming; + +#ifndef KERNEL + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +// options for IOFBCopyI2CInterfaceForBus() +enum { + kIOI2CBusNumberMask = 0x000000ff +}; + + +/*! @function IOFBGetI2CInterfaceCount + @abstract Returns a count of I2C interfaces available associated with an IOFramebuffer instance. + @discussion Returns a count of I2C interfaces available associated with an IOFramebuffer instance. + @param framebuffer The io_service_t of an IOFramebuffer instance. CoreGraphics will provide this for a CGDisplay with the CGDisplayIOServicePort() call. + @param count Interface count is returned. + @result An IOReturn code. */ + +IOReturn IOFBGetI2CInterfaceCount( io_service_t framebuffer, IOItemCount * count ); + +/*! @function IOFBCopyI2CInterfaceForBus + @abstract Returns an instance of an I2C bus interface, associated with an IOFramebuffer instance / bus index pair. + @discussion Some graphics devices will allow access to an I2C bus routed through a display connector in order to control external devices on that bus. This function returns an instance of an I2C bus interface, associated with an IOFramebuffer instance / bus index pair. The number of I2C buses is available from the IOFBGetI2CInterfaceCount() call. The interface may be used with the IOI2CInterfaceOpen/Close/SendRequest() calls to carry out I2C transactions on that bus. Not all graphics devices support this functionality. + @param bus The zero based index of the bus on the requested framebuffer. + @param interface The interface instance is returned. The caller should release this instance with IOObjectRelease(). + @result An IOReturn code. */ + +IOReturn IOFBCopyI2CInterfaceForBus( io_service_t framebuffer, IOOptionBits bus, io_service_t * interface ); + +typedef struct IOI2CConnect * IOI2CConnectRef; /* struct IOI2CConnect is opaque */ + +IOReturn IOI2CCopyInterfaceForID( CFTypeRef identifier, io_service_t * interface ); + +/*! @function IOI2CInterfaceOpen + @abstract Opens an instance of an I2C bus interface, allowing I2C requests to be made. + @discussion An instance of an I2C bus interface, obtained by IOFBCopyI2CInterfaceForBus, is opened with this function allowing I2C requests to be made. + @param interface An I2C bus interface (see IOFBCopyI2CInterfaceForBus). The interface may be released after this call is made. + @param options Pass kNilOptions. + @param connect The opaque IOI2CConnectRef is returned, for use with IOI2CSendRequest() and IOI2CInterfaceClose(). + @result An IOReturn code. */ + +IOReturn IOI2CInterfaceOpen( io_service_t interface, IOOptionBits options, + IOI2CConnectRef * connect ); + +/*! @function IOI2CInterfaceClose + @abstract Closes an IOI2CConnectRef. + @discussion Frees the resources associated with an IOI2CConnectRef. + @param connect The opaque IOI2CConnectRef returned by IOI2CInterfaceOpen(). + @param options Pass kNilOptions. + @result An IOReturn code. */ + +IOReturn IOI2CInterfaceClose( IOI2CConnectRef connect, IOOptionBits options ); + +/*! @function IOI2CSendRequest + @abstract Carries out the I2C transaction specified by an IOI2CRequest structure. + @discussion Frees the resources associated with an IOI2CConnectRef. + @param connect The opaque IOI2CConnectRef returned by IOI2CInterfaceOpen(). + @param options Pass kNilOptions. + @param request Pass a pointer to a IOI2CRequest structure describing the request. If an asynchronous request (with a non-NULL completion routine) the request structure must be valid for the life of the request. + @result An IOReturn code reflecting only the result of starting the transaction. If the result of IOI2CSendRequest() is kIOReturnSuccess, the I2C transaction result is returned in the result field of the request structure. */ + +IOReturn IOI2CSendRequest( IOI2CConnectRef connect, IOOptionBits options, + IOI2CRequest * request ); + +#else + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*! @class IOI2CInterface + @abstract The base class for an I2C bus interface. + @discussion The IOI2CInterface base class defines an I2C bus interface. Not useful for developers. */ + +class IOI2CInterface : public IOService +{ + OSDeclareDefaultStructors(IOI2CInterface) + +protected: + UInt64 fID; + +public: + IOReturn newUserClient( task_t owningTask, + void * security_id, + UInt32 type, + IOUserClient ** handler ) APPLE_KEXT_OVERRIDE; + + bool registerI2C( UInt64 id ); + + virtual IOReturn startIO( IOI2CRequest * request ) = 0; +}; + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#endif /* KERNEL */ + +#endif /* ! _IOKIT_IOI2CINTERFACE_H */ + diff --git a/QualcommWireless/include/IOKit/ndrvsupport/IOMacOSTypes.h b/QualcommWireless/include/IOKit/ndrvsupport/IOMacOSTypes.h new file mode 100644 index 0000000..61893ee --- /dev/null +++ b/QualcommWireless/include/IOKit/ndrvsupport/IOMacOSTypes.h @@ -0,0 +1,419 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1997 Apple Computer, Inc. + * + * + * HISTORY + * + * sdouglas 22 Oct 97 - first checked in. + * sdouglas 21 July 98 - start IOKit + */ + +/* + File: Types.h + + Contains: Basic Macintosh data types. + + Version: Technology: PowerSurge 1.0.2. + Package: Universal Interfaces 2.1.2 on ETO #20 + + Copyright: � 1984-1995 by Apple Computer, Inc. + All rights reserved. + + Bugs?: If you find a problem with this file, use the Apple Bug Reporter + stack. Include the file and version information (from above) + in the problem description and send to: + Internet: apple.bugs@applelink.apple.com + AppleLink: APPLE.BUGS + +*/ + +#ifndef _IOKIT_IOMACOSTYPES_H +#define _IOKIT_IOMACOSTYPES_H +#ifndef __MACTYPES__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef __LP64__ +#pragma options align=mac68k +#endif + +#ifndef NULL +#if !defined(__cplusplus) && (defined(__SC__) || defined(THINK_C)) +#define NULL ((void *) 0) +#else +#define NULL 0 +#endif +#endif + +enum { + noErr = 0 +}; + +typedef unsigned char Byte; + +typedef signed char SignedByte; + +typedef UInt16 UniChar; + +typedef char *Ptr; + +typedef Ptr *Handle; + +typedef UInt32 Fixed; + +typedef Fixed *FixedPtr; + +typedef UInt32 Fract; + +typedef Fract *FractPtr; + +/* +enum { + false, + true +}; +#if !__option(bool) + #ifndef true + #define true 1 + #endif + #ifndef false + #define false 0 + #endif +#endif + +typedef unsigned char Boolean; +*/ + + +typedef short OSErr; + +typedef unsigned int FourCharCode; + +typedef FourCharCode OSType; + +typedef FourCharCode ResType; + +typedef OSType *OSTypePtr; + +typedef ResType *ResTypePtr; + +struct Rect { + short top; + short left; + short bottom; + short right; +}; +typedef struct Rect Rect; + +typedef Rect *RectPtr; + +// Quickdraw.i + +/* + kVariableLengthArray is used in array bounds to specify a variable length array. + It is ususally used in variable length structs when the last field is an array + of any size. Before ANSI C, we used zero as the bounds of variable length + array, but that is illegal in ANSI C. Example: + + struct FooList + { + short listLength; + Foo elements[kVariableLengthArray]; + }; +*/ + +enum { + kVariableLengthArray = 1 +}; + +/* Numeric version part of 'vers' resource */ +struct NumVersion { + UInt8 majorRev; /*1st part of version number in BCD*/ + UInt8 minorAndBugRev; /*2nd & 3rd part of version number share a byte*/ + UInt8 stage; /*stage code: dev, alpha, beta, final*/ + UInt8 nonRelRev; /*revision level of non-released version*/ +}; +typedef struct NumVersion NumVersion; + +typedef struct OpaqueRef *KernelID; + +typedef UInt8 *BytePtr; + +typedef IOByteCount ByteCount; + +typedef IOItemCount ItemCount; + +typedef void *LogicalAddress; + +#if !defined(__LP64__) +typedef void *PhysicalAddress; +#endif + +typedef UInt32 PBVersion; + +typedef SInt32 Duration; + +#define kInvalidID 0 + +enum { + kNilOptions = 0 +}; + + +typedef unsigned char Str31[32]; + + +/* +From: + File: DriverFamilyMatching.i <18> + Copyright: � 1995-1996 by Apple Computer, Inc., all rights reserved. +*/ + +//############################################## +// Well known properties in the Name Registry +//############################################## + +#define kPropertyName "name" +#define kPropertyCompatible "compatible" +#define kPropertyDriverPtr "driver-ptr" +#define kPropertyDriverDesc "driver-description" +#define kPropertyReg "reg" +#define kPropertyAAPLAddress "AAPL,address" +#define kPropertyMatching "matching" + + +//######################################################### +// Descriptor for Drivers and NDRVs +//######################################################### +/* Driver Typing Information Used to Match Drivers With Devices */ +struct DriverType { + Str31 nameInfoStr; /* Driver Name/Info String*/ + NumVersion version; /* Driver Version Number*/ +}; +typedef struct DriverType DriverType; +typedef DriverType * DriverTypePtr; + +/* OS Runtime Information Used to Setup and Maintain a Driver's Runtime Environment */ +typedef IOOptionBits RuntimeOptions; + + +enum { + kDriverIsLoadedUponDiscovery = 0x00000001, /* auto-load driver when discovered*/ + kDriverIsOpenedUponLoad = 0x00000002, /* auto-open driver when loaded*/ + kDriverIsUnderExpertControl = 0x00000004, /* I/O expert handles loads/opens*/ + kDriverIsConcurrent = 0x00000008, /* supports concurrent requests*/ + kDriverQueuesIOPB = 0x00000010, /* device manager doesn't queue IOPB*/ + kDriverIsLoadedAtBoot = 0x00000020, /* Driver is loaded at the boot time */ + kDriverIsForVirtualDevice = 0x00000040, /* Driver is for a virtual Device */ + kDriverSupportDMSuspendAndResume = 0x00000080 /* Driver supports Device Manager Suspend and Resume command */ +}; + +struct DriverOSRuntime { + RuntimeOptions driverRuntime; /* Options for OS Runtime*/ + Str31 driverName; /* Driver's name to the OS*/ + UInt32 driverDescReserved[8]; /* Reserved area*/ +}; +typedef struct DriverOSRuntime DriverOSRuntime; +typedef DriverOSRuntime * DriverOSRuntimePtr; + +/* OS Service Information Used To Declare What APIs a Driver Supports */ +typedef UInt32 ServiceCount; + +struct DriverServiceInfo { + OSType serviceCategory; /* Service Category Name*/ + OSType serviceType; /* Type within Category*/ + NumVersion serviceVersion; /* Version of service*/ +}; +typedef struct DriverServiceInfo DriverServiceInfo; +typedef DriverServiceInfo * DriverServiceInfoPtr; + +struct DriverOSService { + ServiceCount nServices; /* Number of Services Supported*/ + DriverServiceInfo service[1]; /* The List of Services (at least one)*/ +}; +typedef struct DriverOSService DriverOSService; +typedef DriverOSService * DriverOSServicePtr; + +/* Categories */ + +enum { + kServiceCategoryDisplay = 'disp', /* Display Manager*/ + kServiceCategoryOpenTransport = 'otan', /* Open Transport*/ + kServiceCategoryBlockStorage = 'blok', /* Block Storage*/ + kServiceCategoryNdrvDriver = 'ndrv', /* Generic Native Driver*/ + kServiceCategoryScsiSIM = 'scsi', /* SCSI */ + kServiceCategoryFileManager = 'file', /* File Manager */ + kServiceCategoryIDE = 'ide-', /* ide */ + kServiceCategoryADB = 'adb-', /* adb */ + kServiceCategoryPCI = 'pci-', /* pci bus */ + /* Nu Bus */ + kServiceCategoryDFM = 'dfm-', /* DFM */ + kServiceCategoryMotherBoard = 'mrbd', /* mother Board */ + kServiceCategoryKeyboard = 'kybd', /* Keyboard */ + kServiceCategoryPointing = 'poit', /* Pointing */ + kServiceCategoryRTC = 'rtc-', /* RTC */ + kServiceCategoryNVRAM = 'nram', /* NVRAM */ + kServiceCategorySound = 'sond', /* Sound (1/3/96 MCS) */ + kServiceCategoryPowerMgt = 'pgmt', /* Power Management */ + kServiceCategoryGeneric = 'genr' /* Generic Service Category to receive general Events */ +}; + +/* Ndrv ServiceCategory Types */ +enum { + kNdrvTypeIsGeneric = 'genr', /* generic*/ + kNdrvTypeIsVideo = 'vido', /* video*/ + kNdrvTypeIsBlockStorage = 'blok', /* block storage*/ + kNdrvTypeIsNetworking = 'netw', /* networking*/ + kNdrvTypeIsSerial = 'serl', /* serial*/ + kNdrvTypeIsParallel = 'parl', /* parallel */ + kNdrvTypeIsSound = 'sond', /* sound*/ + kNdrvTypeIsBusBridge = 'brdg' +}; + +typedef UInt32 DriverDescVersion; + +/* The Driver Description */ +enum { + kInitialDriverDescriptor = 0, + kVersionOneDriverDescriptor = 1 +}; + +enum { + kTheDescriptionSignature = 'mtej', + kDriverDescriptionSignature = 'pdes' +}; + + +struct DriverDescription { + OSType driverDescSignature; /* Signature field of this structure*/ + DriverDescVersion driverDescVersion; /* Version of this data structure*/ + DriverType driverType; /* Type of Driver*/ + DriverOSRuntime driverOSRuntimeInfo; /* OS Runtime Requirements of Driver*/ + DriverOSService driverServices; /* Apple Service API Membership*/ +}; +typedef struct DriverDescription DriverDescription; +typedef DriverDescription * DriverDescriptionPtr; + + +#ifndef __LP64__ +#pragma options align=reset +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __MACTYPES__ */ + +#ifndef __QUICKDRAW__ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef __LP64__ +#pragma options align=mac68k +#endif + +struct RGBColor { + unsigned short red; /*magnitude of red component*/ + unsigned short green; /*magnitude of green component*/ + unsigned short blue; /*magnitude of blue component*/ +}; +typedef struct RGBColor RGBColor; +typedef RGBColor *RGBColorPtr; +typedef RGBColorPtr *RGBColorHdl; + +struct ColorSpec { + short value; /*index or other value*/ + RGBColor rgb; /*true color*/ +}; + +typedef struct ColorSpec ColorSpec; +typedef ColorSpec *ColorSpecPtr; + +struct GammaTbl { + short gVersion; /*gamma version number*/ + short gType; /*gamma data type*/ + short gFormulaSize; /*Formula data size*/ + short gChanCnt; /*number of channels of data*/ + short gDataCnt; /*number of values/channel*/ + short gDataWidth; /*bits/corrected value (data packed to next larger byte size)*/ + short gFormulaData[1]; /*data for formulas followed by gamma values*/ +}; +typedef struct GammaTbl GammaTbl; +typedef GammaTbl *GammaTblPtr; + +struct RegEntryID +{ + void * opaque[4]; +}; +typedef struct RegEntryID RegEntryID; +typedef RegEntryID * RegEntryIDPtr; + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +struct IONDRVControlParameters { + UInt8 __reservedA[0x1a]; + UInt16 code; + void * params; + UInt8 __reservedB[0x12]; +}; + +enum { + kIONDRVOpenCommand = 128 + 0, + kIONDRVCloseCommand = 128 + 1, + kIONDRVReadCommand = 128 + 2, + kIONDRVWriteCommand = 128 + 3, + kIONDRVControlCommand = 128 + 4, + kIONDRVStatusCommand = 128 + 5, + kIONDRVKillIOCommand = 128 + 6, + kIONDRVInitializeCommand = 128 + 7, /* init driver and device*/ + kIONDRVFinalizeCommand = 128 + 8, /* shutdown driver and device*/ + kIONDRVReplaceCommand = 128 + 9, /* replace an old driver*/ + kIONDRVSupersededCommand = 128 + 10 /* prepare to be replaced by a new driver*/ +}; +enum { + kIONDRVSynchronousIOCommandKind = 0x00000001, + kIONDRVAsynchronousIOCommandKind = 0x00000002, + kIONDRVImmediateIOCommandKind = 0x00000004 +}; + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef __LP64__ +#pragma options align=reset +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __QUICKDRAW__ */ + +#endif /* _IOKIT_IOMACOSTYPES_H */ diff --git a/QualcommWireless/include/IOKit/ndrvsupport/IOMacOSVideo.h b/QualcommWireless/include/IOKit/ndrvsupport/IOMacOSVideo.h new file mode 100644 index 0000000..795072b --- /dev/null +++ b/QualcommWireless/include/IOKit/ndrvsupport/IOMacOSVideo.h @@ -0,0 +1,1391 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + File: Video.h + + Contains: Video Driver Interfaces. + + Copyright: (c) 1986-2000 by Apple Computer, Inc., all rights reserved + + Bugs?: For bug reports, consult the following page on + the World Wide Web: + + http://developer.apple.com/bugreporter/ + +*/ +#ifndef __IOMACOSVIDEO__ +#define __IOMACOSVIDEO__ + +#define PRAGMA_STRUCT_ALIGN 1 +#define FOUR_CHAR_CODE(x) (x) +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef __LP64__ +#pragma options align=mac68k +#endif + +enum { + mBaseOffset = 1, /*Id of mBaseOffset.*/ + mRowBytes = 2, /*Video sResource parameter Id's */ + mBounds = 3, /*Video sResource parameter Id's */ + mVersion = 4, /*Video sResource parameter Id's */ + mHRes = 5, /*Video sResource parameter Id's */ + mVRes = 6, /*Video sResource parameter Id's */ + mPixelType = 7, /*Video sResource parameter Id's */ + mPixelSize = 8, /*Video sResource parameter Id's */ + mCmpCount = 9, /*Video sResource parameter Id's */ + mCmpSize = 10, /*Video sResource parameter Id's */ + mPlaneBytes = 11, /*Video sResource parameter Id's */ + mVertRefRate = 14, /*Video sResource parameter Id's */ + mVidParams = 1, /*Video parameter block id.*/ + mTable = 2, /*Offset to the table.*/ + mPageCnt = 3, /*Number of pages*/ + mDevType = 4, /*Device Type*/ + oneBitMode = 128, /*Id of OneBitMode Parameter list.*/ + twoBitMode = 129, /*Id of TwoBitMode Parameter list.*/ + fourBitMode = 130, /*Id of FourBitMode Parameter list.*/ + eightBitMode = 131 /*Id of EightBitMode Parameter list.*/ +}; + +enum { + sixteenBitMode = 132, /*Id of SixteenBitMode Parameter list.*/ + thirtyTwoBitMode = 133, /*Id of ThirtyTwoBitMode Parameter list.*/ + firstVidMode = 128, /*The new, better way to do the above. */ + secondVidMode = 129, /* QuickDraw only supports six video */ + thirdVidMode = 130, /* at this time. */ + fourthVidMode = 131, + fifthVidMode = 132, + sixthVidMode = 133, + spGammaDir = 64, + spVidNamesDir = 65 +}; + +typedef UInt32 AVIDType; +typedef AVIDType DisplayIDType; +typedef IODisplayModeID DisplayModeID; +typedef UInt16 DepthMode; +typedef UInt32 VideoDeviceType; +typedef UInt32 GammaTableID; + +/* csTimingFormat values in VDTimingInfo */ +/* look in the declaration rom for timing info */ +enum { + kDeclROMtables = FOUR_CHAR_CODE('decl'), + kDetailedTimingFormat = FOUR_CHAR_CODE('arba') /* Timing is a detailed timing*/ +}; + +/* Size of a block of EDID (Extended Display Identification Data) */ +enum { + kDDCBlockSize = 128 +}; + +/* ddcBlockType constants*/ +enum { + kDDCBlockTypeEDID = 0 /* EDID block type. */ +}; + +/* ddcFlags constants*/ +enum { + kDDCForceReadBit = 0, /* Force a new read of the EDID. */ + kDDCForceReadMask = (1 << kDDCForceReadBit) /* Mask for kddcForceReadBit. */ +}; + + +/* Timing mode constants for Display Manager MultiMode support + Corresponding .h equates are in Video.h + .a equates are in Video.a + .r equates are in DepVideoEqu.r + + The second enum is the old names (for compatibility). + The first enum is the new names. +*/ +enum { + timingInvalid = 0, /* Unknown timing... force user to confirm. */ + timingInvalid_SM_T24 = 8, /* Work around bug in SM Thunder24 card.*/ + timingApple_FixedRateLCD = 42, /* Lump all fixed-rate LCDs into one category.*/ + timingApple_512x384_60hz = 130, /* 512x384 (60 Hz) Rubik timing. */ + timingApple_560x384_60hz = 135, /* 560x384 (60 Hz) Rubik-560 timing. */ + timingApple_640x480_67hz = 140, /* 640x480 (67 Hz) HR timing. */ + timingApple_640x400_67hz = 145, /* 640x400 (67 Hz) HR-400 timing. */ + timingVESA_640x480_60hz = 150, /* 640x480 (60 Hz) VGA timing. */ + timingVESA_640x480_72hz = 152, /* 640x480 (72 Hz) VGA timing. */ + timingVESA_640x480_75hz = 154, /* 640x480 (75 Hz) VGA timing. */ + timingVESA_640x480_85hz = 158, /* 640x480 (85 Hz) VGA timing. */ + timingGTF_640x480_120hz = 159, /* 640x480 (120 Hz) VESA Generalized Timing Formula */ + timingApple_640x870_75hz = 160, /* 640x870 (75 Hz) FPD timing.*/ + timingApple_640x818_75hz = 165, /* 640x818 (75 Hz) FPD-818 timing.*/ + timingApple_832x624_75hz = 170, /* 832x624 (75 Hz) GoldFish timing.*/ + timingVESA_800x600_56hz = 180, /* 800x600 (56 Hz) SVGA timing. */ + timingVESA_800x600_60hz = 182, /* 800x600 (60 Hz) SVGA timing. */ + timingVESA_800x600_72hz = 184, /* 800x600 (72 Hz) SVGA timing. */ + timingVESA_800x600_75hz = 186, /* 800x600 (75 Hz) SVGA timing. */ + timingVESA_800x600_85hz = 188, /* 800x600 (85 Hz) SVGA timing. */ + timingVESA_1024x768_60hz = 190, /* 1024x768 (60 Hz) VESA 1K-60Hz timing. */ + timingVESA_1024x768_70hz = 200, /* 1024x768 (70 Hz) VESA 1K-70Hz timing. */ + timingVESA_1024x768_75hz = 204, /* 1024x768 (75 Hz) VESA 1K-75Hz timing (very similar to timingApple_1024x768_75hz). */ + timingVESA_1024x768_85hz = 208, /* 1024x768 (85 Hz) VESA timing. */ + timingApple_1024x768_75hz = 210, /* 1024x768 (75 Hz) Apple 19" RGB. */ + timingApple_1152x870_75hz = 220, /* 1152x870 (75 Hz) Apple 21" RGB. */ + timingAppleNTSC_ST = 230, /* 512x384 (60 Hz, interlaced, non-convolved). */ + timingAppleNTSC_FF = 232, /* 640x480 (60 Hz, interlaced, non-convolved). */ + timingAppleNTSC_STconv = 234, /* 512x384 (60 Hz, interlaced, convolved). */ + timingAppleNTSC_FFconv = 236, /* 640x480 (60 Hz, interlaced, convolved). */ + timingApplePAL_ST = 238, /* 640x480 (50 Hz, interlaced, non-convolved). */ + timingApplePAL_FF = 240, /* 768x576 (50 Hz, interlaced, non-convolved). */ + timingApplePAL_STconv = 242, /* 640x480 (50 Hz, interlaced, convolved). */ + timingApplePAL_FFconv = 244, /* 768x576 (50 Hz, interlaced, convolved). */ + timingVESA_1280x960_75hz = 250, /* 1280x960 (75 Hz) */ + timingVESA_1280x960_60hz = 252, /* 1280x960 (60 Hz) */ + timingVESA_1280x960_85hz = 254, /* 1280x960 (85 Hz) */ + timingVESA_1280x1024_60hz = 260, /* 1280x1024 (60 Hz) */ + timingVESA_1280x1024_75hz = 262, /* 1280x1024 (75 Hz) */ + timingVESA_1280x1024_85hz = 268, /* 1280x1024 (85 Hz) */ + timingVESA_1600x1200_60hz = 280, /* 1600x1200 (60 Hz) VESA timing. */ + timingVESA_1600x1200_65hz = 282, /* 1600x1200 (65 Hz) VESA timing. */ + timingVESA_1600x1200_70hz = 284, /* 1600x1200 (70 Hz) VESA timing. */ + timingVESA_1600x1200_75hz = 286, /* 1600x1200 (75 Hz) VESA timing (pixel clock is 189.2 Mhz dot clock). */ + timingVESA_1600x1200_80hz = 288, /* 1600x1200 (80 Hz) VESA timing (pixel clock is 216>? Mhz dot clock) - proposed only. */ + timingVESA_1600x1200_85hz = 289, /* 1600x1200 (85 Hz) VESA timing (pixel clock is 229.5 Mhz dot clock). */ + timingVESA_1792x1344_60hz = 296, /* 1792x1344 (60 Hz) VESA timing (204.75 Mhz dot clock). */ + timingVESA_1792x1344_75hz = 298, /* 1792x1344 (75 Hz) VESA timing (261.75 Mhz dot clock). */ + timingVESA_1856x1392_60hz = 300, /* 1856x1392 (60 Hz) VESA timing (218.25 Mhz dot clock). */ + timingVESA_1856x1392_75hz = 302, /* 1856x1392 (75 Hz) VESA timing (288 Mhz dot clock). */ + timingVESA_1920x1440_60hz = 304, /* 1920x1440 (60 Hz) VESA timing (234 Mhz dot clock). */ + timingVESA_1920x1440_75hz = 306, /* 1920x1440 (75 Hz) VESA timing (297 Mhz dot clock). */ + timingSMPTE240M_60hz = 400, /* 60Hz V, 33.75KHz H, interlaced timing, 16:9 aspect, typical resolution of 1920x1035. */ + timingFilmRate_48hz = 410, /* 48Hz V, 25.20KHz H, non-interlaced timing, typical resolution of 640x480. */ + timingSony_1600x1024_76hz = 500, /* 1600x1024 (76 Hz) Sony timing (pixel clock is 170.447 Mhz dot clock). */ + timingSony_1920x1080_60hz = 510, /* 1920x1080 (60 Hz) Sony timing (pixel clock is 159.84 Mhz dot clock). */ + timingSony_1920x1080_72hz = 520, /* 1920x1080 (72 Hz) Sony timing (pixel clock is 216.023 Mhz dot clock). */ + timingSony_1920x1200_76hz = 540, /* 1900x1200 (76 Hz) Sony timing (pixel clock is 243.20 Mhz dot clock). */ + timingApple_0x0_0hz_Offline = 550 /* Indicates that this timing will take the display off-line and remove it from the system. */ +}; + + +/* Deprecated timing names.*/ +enum { + timingApple12 = timingApple_512x384_60hz, + timingApple12x = timingApple_560x384_60hz, + timingApple13 = timingApple_640x480_67hz, + timingApple13x = timingApple_640x400_67hz, + timingAppleVGA = timingVESA_640x480_60hz, + timingApple15 = timingApple_640x870_75hz, + timingApple15x = timingApple_640x818_75hz, + timingApple16 = timingApple_832x624_75hz, + timingAppleSVGA = timingVESA_800x600_56hz, + timingApple1Ka = timingVESA_1024x768_60hz, + timingApple1Kb = timingVESA_1024x768_70hz, + timingApple19 = timingApple_1024x768_75hz, + timingApple21 = timingApple_1152x870_75hz, + timingSony_1900x1200_74hz = 530, /* 1900x1200 (74 Hz) Sony timing (pixel clock is 236.25 Mhz dot clock). */ + timingSony_1900x1200_76hz = timingSony_1920x1200_76hz /* 1900x1200 (76 Hz) Sony timing (pixel clock is 245.48 Mhz dot clock). */ +}; + +/* csConnectFlags values in VDDisplayConnectInfo */ +enum { + kAllModesValid = 0, /* All modes not trimmed by primary init are good close enough to try */ + kAllModesSafe = 1, /* All modes not trimmed by primary init are know to be safe */ + kReportsTagging = 2, /* Can detect tagged displays (to identify smart monitors) */ + kHasDirectConnection = 3, /* True implies that driver can talk directly to device (e.g. serial data link via sense lines) */ + kIsMonoDev = 4, /* Says whether there's an RGB (0) or Monochrome (1) connection. */ + kUncertainConnection = 5, /* There may not be a display (no sense lines?). */ + kTaggingInfoNonStandard = 6, /* Set when csConnectTaggedType/csConnectTaggedData are non-standard (i.e., not the Apple CRT sense codes). */ + kReportsDDCConnection = 7, /* Card can do ddc (set kHasDirectConnect && kHasDDCConnect if you actually found a ddc display). */ + kHasDDCConnection = 8, /* Card has ddc connect now. */ + kConnectionInactive = 9, /* Set when the connection is NOT currently active (generally used in a multiconnection environment). */ + kDependentConnection = 10, /* Set when some ascpect of THIS connection depends on another (will generally be set in a kModeSimulscan environment). */ + kBuiltInConnection = 11, /* Set when connection is KNOWN to be built-in (this is not the same as kHasDirectConnection). */ + kOverrideConnection = 12, /* Set when the reported connection is not the true one, but is one that has been forced through a SetConnection call */ + kFastCheckForDDC = 13, /* Set when all 3 are true: 1) sense codes indicate DDC display could be attached 2) attempted fast check 3) DDC failed */ + kReportsHotPlugging = 14, /* Detects and reports hot pluggging on connector (via VSL also implies DDC will be up to date w/o force read) */ + kStereoSyncConnection = 15 /* Connection supports stereo sync signalling */ +}; + + +/* csDisplayType values in VDDisplayConnectInfo */ +enum { + kUnknownConnect = 1, /* Not sure how we'll use this, but seems like a good idea. */ + kPanelConnect = 2, /* For use with fixed-in-place LCD panels. */ + kPanelTFTConnect = 2, /* Alias for kPanelConnect */ + kFixedModeCRTConnect = 3, /* For use with fixed-mode (i.e., very limited range) displays. */ + kMultiModeCRT1Connect = 4, /* 320x200 maybe, 12" maybe, 13" (default), 16" certain, 19" maybe, 21" maybe */ + kMultiModeCRT2Connect = 5, /* 320x200 maybe, 12" maybe, 13" certain, 16" (default), 19" certain, 21" maybe */ + kMultiModeCRT3Connect = 6, /* 320x200 maybe, 12" maybe, 13" certain, 16" certain, 19" default, 21" certain */ + kMultiModeCRT4Connect = 7, /* Expansion to large multi mode (not yet used) */ + kModelessConnect = 8, /* Expansion to modeless model (not yet used) */ + kFullPageConnect = 9, /* 640x818 (to get 8bpp in 512K case) and 640x870 (these two only) */ + kVGAConnect = 10, /* 640x480 VGA default -- question everything else */ + kNTSCConnect = 11, /* NTSC ST (default), FF, STconv, FFconv */ + kPALConnect = 12, /* PAL ST (default), FF, STconv, FFconv */ + kHRConnect = 13, /* Straight-6 connect -- 640x480 and 640x400 (to get 8bpp in 256K case) (these two only) */ + kPanelFSTNConnect = 14, /* For use with fixed-in-place LCD FSTN (aka "Supertwist") panels */ + kMonoTwoPageConnect = 15, /* 1152x870 Apple color two-page display */ + kColorTwoPageConnect = 16, /* 1152x870 Apple B&W two-page display */ + kColor16Connect = 17, /* 832x624 Apple B&W two-page display */ + kColor19Connect = 18, /* 1024x768 Apple B&W two-page display */ + kGenericCRT = 19, /* Indicates nothing except that connection is CRT in nature. */ + kGenericLCD = 20, /* Indicates nothing except that connection is LCD in nature. */ + kDDCConnect = 21, /* DDC connection, always set kHasDDCConnection */ + kNoConnect = 22 /* No display is connected - load sensing or similar level of hardware detection is assumed (used by resident drivers that support hot plugging when nothing is currently connected) */ +}; + +/* csTimingFlags values in VDTimingInfoRec */ +enum { + kModeValid = 0, /* Says that this mode should NOT be trimmed. */ + kModeSafe = 1, /* This mode does not need confirmation */ + kModeDefault = 2, /* This is the default mode for this type of connection */ + kModeShowNow = 3, /* This mode should always be shown (even though it may require a confirm) */ + kModeNotResize = 4, /* This mode should not be used to resize the display (eg. mode selects a different connector on card) */ + kModeRequiresPan = 5, /* This mode has more pixels than are actually displayed */ + kModeInterlaced = 6, /* This mode is interlaced (single pixel lines look bad). */ + kModeShowNever = 7, /* This mode should not be shown in the user interface. */ + kModeSimulscan = 8, /* Indicates that more than one display connection can be driven from a single framebuffer controller. */ + kModeNotPreset = 9, /* Indicates that the timing is not a factory preset for the current display (geometry may need correction) */ + kModeBuiltIn = 10, /* Indicates that the display mode is for the built-in connect only (on multiconnect devices like the PB 3400) Only the driver is quieried */ + kModeStretched = 11, /* Indicates that the display mode will be stretched/distorted to match the display aspect ratio */ + kModeNotGraphicsQuality = 12, /* Indicates that the display mode is not the highest quality (eg. stretching artifacts). Intended as a hint */ + kModeValidateAgainstDisplay = 13 /* Indicates that this mode should be validated against the display EDID */ +}; + +/* csDepthFlags in VDVideoParametersInfoRec */ +enum { + kDepthDependent = 0, /* Says that this depth mode may cause dependent changes in other framebuffers (and . */ + kDepthDependentMask = (1 << kDepthDependent) /* mask for kDepthDependent */ +}; + +/* csResolutionFlags bit flags for VDResolutionInfoRec */ +enum { + kResolutionHasMultipleDepthSizes = 0 /* Says that this mode has different csHorizontalPixels, csVerticalLines at different depths (usually slightly larger at lower depths) */ +}; + + +enum { + /* Power Mode constants for VDPowerStateRec.powerState. Note the numeric order does not match the power state order */ + kAVPowerOff = 0, /* Power fully off*/ + kAVPowerStandby = 1, + kAVPowerSuspend = 2, + kAVPowerOn = 3, + kHardwareSleep = 128, + kHardwareWake = 129, + kHardwareWakeFromSuspend = 130, + kHardwareWakeToDoze = 131, + kHardwareWakeToDozeFromSuspend = 132, + kHardwarePark = 133, + kHardwareDrive = 134 +}; + +/* Reduced perf level, for GetPowerState, SetPowerState*/ +enum { + kPowerStateReducedPowerMask = 0x00000300, + kPowerStateFullPower = 0x00000000, + kPowerStateReducedPower1 = 0x00000100, + kPowerStateReducedPower2 = 0x00000200, + kPowerStateReducedPower3 = 0x00000300 +}; + +enum { + /* Power Mode masks and bits for VDPowerStateRec.powerFlags. */ + kPowerStateNeedsRefresh = 0, /* When leaving this power mode, a display will need refreshing */ + kPowerStateSleepAwareBit = 1, /* if gestaltPCCardDockingSelectorFix, Docking mgr checks this bit before checking kPowerStateSleepAllowedBit */ + kPowerStateSleepForbiddenBit = 2, /* if kPowerStateSleepAwareBit, Docking mgr checks this bit before sleeping */ + kPowerStateSleepCanPowerOffBit = 3, /* supports power down sleep (ie PCI power off)*/ + kPowerStateSleepNoDPMSBit = 4, /* Bug #2425210. Do not use DPMS with this display.*/ + kPowerStateSleepWaketoDozeBit = 5, /* Supports Wake to Doze */ + kPowerStateSleepWakeNeedsProbeBit = 6, /* Does not sense connection changes on wake */ + + kPowerStateNeedsRefreshMask = (1 << kPowerStateNeedsRefresh), + kPowerStateSleepAwareMask = (1 << kPowerStateSleepAwareBit), + kPowerStateSleepForbiddenMask = (1 << kPowerStateSleepForbiddenBit), + kPowerStateSleepCanPowerOffMask = (1 << kPowerStateSleepCanPowerOffBit), + kPowerStateSleepNoDPMSMask = (1 << kPowerStateSleepNoDPMSBit), + kPowerStateSleepWaketoDozeMask = (1 << kPowerStateSleepWaketoDozeBit), + kPowerStateSleepWakeNeedsProbeMask = (1 << kPowerStateSleepWakeNeedsProbeBit), + + kPowerStateSupportsReducedPower1Bit = 10, + kPowerStateSupportsReducedPower2Bit = 11, + kPowerStateSupportsReducedPower3Bit = 12, + kPowerStateSupportsReducedPower1BitMask = (1 << 10), + kPowerStateSupportsReducedPower2BitMask = (1 << 11), + kPowerStateSupportsReducedPower3BitMask = (1 << 12) +}; + + +enum { + /* Control Codes */ + cscReset = 0, + cscKillIO = 1, + cscSetMode = 2, + cscSetEntries = 3, + cscSetGamma = 4, + cscGrayPage = 5, + cscGrayScreen = 5, + cscSetGray = 6, + cscSetInterrupt = 7, + cscDirectSetEntries = 8, + cscSetDefaultMode = 9, + cscSwitchMode = 10, /* Takes a VDSwitchInfoPtr */ + cscSetSync = 11, /* Takes a VDSyncInfoPtr */ + cscSavePreferredConfiguration = 16, /* Takes a VDSwitchInfoPtr */ + cscSetHardwareCursor = 22, /* Takes a VDSetHardwareCursorPtr */ + cscDrawHardwareCursor = 23, /* Takes a VDDrawHardwareCursorPtr */ + cscSetConvolution = 24, /* Takes a VDConvolutionInfoPtr */ + cscSetPowerState = 25, /* Takes a VDPowerStatePtr */ + cscPrivateControlCall = 26, /* Takes a VDPrivateSelectorDataRec*/ + cscSetMultiConnect = 28, /* From a GDI point of view, this call should be implemented completely in the HAL and not at all in the core.*/ + cscSetClutBehavior = 29, /* Takes a VDClutBehavior */ + cscSetDetailedTiming = 31, /* Takes a VDDetailedTimingPtr */ + cscDoCommunication = 33, /* Takes a VDCommunicationPtr */ + cscProbeConnection = 34, /* Takes nil pointer */ + /* (may generate a kFBConnectInterruptServiceType service interrupt) */ + cscSetScaler = 36, /* Takes a VDScalerPtr */ + cscSetMirror = 37, /* Takes a VDMirrorPtr*/ + cscSetFeatureConfiguration = 38, /* Takes a VDConfigurationPtr*/ + cscUnusedCall = 127 /* This call used to expand the scrn resource. Its imbedded data contains more control info */ +}; + +enum { + /* Status Codes */ + cscGetMode = 2, + cscGetEntries = 3, + cscGetPageCnt = 4, + cscGetPages = 4, /* This is what C&D 2 calls it. */ + cscGetPageBase = 5, + cscGetBaseAddr = 5, /* This is what C&D 2 calls it. */ + cscGetGray = 6, + cscGetInterrupt = 7, + cscGetGamma = 8, + cscGetDefaultMode = 9, + cscGetCurMode = 10, /* Takes a VDSwitchInfoPtr */ + cscGetSync = 11, /* Takes a VDSyncInfoPtr */ + cscGetConnection = 12, /* Return information about the connection to the display */ + cscGetModeTiming = 13, /* Return timing info for a mode */ + cscGetModeBaseAddress = 14, /* Return base address information about a particular mode */ + cscGetScanProc = 15, /* QuickTime scan chasing routine */ + cscGetPreferredConfiguration = 16, /* Takes a VDSwitchInfoPtr */ + cscGetNextResolution = 17, /* Takes a VDResolutionInfoPtr */ + cscGetVideoParameters = 18, /* Takes a VDVideoParametersInfoPtr */ + cscGetGammaInfoList = 20, /* Takes a VDGetGammaListPtr */ + cscRetrieveGammaTable = 21, /* Takes a VDRetrieveGammaPtr */ + cscSupportsHardwareCursor = 22, /* Takes a VDSupportsHardwareCursorPtr */ + cscGetHardwareCursorDrawState = 23, /* Takes a VDHardwareCursorDrawStatePtr */ + cscGetConvolution = 24, /* Takes a VDConvolutionInfoPtr */ + cscGetPowerState = 25, /* Takes a VDPowerStatePtr */ + cscPrivateStatusCall = 26, /* Takes a VDPrivateSelectorDataRec*/ + cscGetDDCBlock = 27, /* Takes a VDDDCBlockRec */ + cscGetMultiConnect = 28, /* From a GDI point of view, this call should be implemented completely in the HAL and not at all in the core.*/ + cscGetClutBehavior = 29, /* Takes a VDClutBehavior */ + cscGetTimingRanges = 30, /* Takes a VDDisplayTimingRangePtr */ + cscGetDetailedTiming = 31, /* Takes a VDDetailedTimingPtr */ + cscGetCommunicationInfo = 32, /* Takes a VDCommunicationInfoPtr */ + cscGetScalerInfo = 35, /* Takes a VDScalerInfoPtr */ + cscGetScaler = 36, /* Takes a VDScalerPtr */ + cscGetMirror = 37, /* Takes a VDMirrorPtr*/ + cscGetFeatureConfiguration = 38, /* Takes a VDConfigurationPtr*/ + cscGetFeatureList = 39 +}; + +/* Bit definitions for the Get/Set Sync call*/ +enum { + kDisableHorizontalSyncBit = 0, + kDisableVerticalSyncBit = 1, + kDisableCompositeSyncBit = 2, + kEnableSyncOnBlue = 3, + kEnableSyncOnGreen = 4, + kEnableSyncOnRed = 5, + kNoSeparateSyncControlBit = 6, + kTriStateSyncBit = 7, + kHorizontalSyncMask = 0x01, + kVerticalSyncMask = 0x02, + kCompositeSyncMask = 0x04, + kDPMSSyncMask = 0x07, + kTriStateSyncMask = 0x80, + kSyncOnBlueMask = 0x08, + kSyncOnGreenMask = 0x10, + kSyncOnRedMask = 0x20, + kSyncOnMask = 0x38 +}; + +enum { + /* Power Mode constants for translating DPMS modes to Get/SetSync calls. */ + kDPMSSyncOn = 0, + kDPMSSyncStandby = 1, + kDPMSSyncSuspend = 2, + kDPMSSyncOff = 7 +}; + +/* Bit definitions for the Get/Set Convolution call*/ +enum { + kConvolved = 0, + kLiveVideoPassThru = 1, + kConvolvedMask = 0x01, + kLiveVideoPassThruMask = 0x02 +}; + + + +struct VPBlock { + UInt32 vpBaseOffset; /*Offset to page zero of video RAM (From minorBaseOS).*/ +#if __LP64__ + UInt32 vpRowBytes; /*Width of each row of video memory.*/ +#else + SInt16 vpRowBytes; /*Width of each row of video memory.*/ +#endif + Rect vpBounds; /*BoundsRect for the video display (gives dimensions).*/ + SInt16 vpVersion; /*PixelMap version number.*/ + SInt16 vpPackType; + UInt32 vpPackSize; + UInt32 vpHRes; /*Horizontal resolution of the device (pixels per inch).*/ + UInt32 vpVRes; /*Vertical resolution of the device (pixels per inch).*/ + SInt16 vpPixelType; /*Defines the pixel type.*/ + SInt16 vpPixelSize; /*Number of bits in pixel.*/ + SInt16 vpCmpCount; /*Number of components in pixel.*/ + SInt16 vpCmpSize; /*Number of bits per component*/ + UInt32 vpPlaneBytes; /*Offset from one plane to the next.*/ +}; +typedef struct VPBlock VPBlock; +typedef VPBlock * VPBlockPtr; + +struct VDEntryRecord { + Ptr csTable; /* pointer to color table entry=value, r,g,b:INTEGER*/ +}; +typedef struct VDEntryRecord VDEntryRecord; + +typedef VDEntryRecord * VDEntRecPtr; +/* Parm block for SetGray control call */ + +struct VDGrayRecord { + Boolean csMode; /*Same as GDDevType value (0=color, 1=mono)*/ + SInt8 filler; +}; +typedef struct VDGrayRecord VDGrayRecord; + +typedef VDGrayRecord * VDGrayPtr; +/* Parm block for SetInterrupt call */ + +struct VDFlagRecord { + SInt8 csMode; + SInt8 filler; +}; +typedef struct VDFlagRecord VDFlagRecord; + +typedef VDFlagRecord * VDFlagRecPtr; +/* Parm block for SetEntries control call */ + +struct VDSetEntryRecord { + ColorSpec * csTable; /*Pointer to an array of color specs*/ + SInt16 csStart; /*Which spec in array to start with, or -1*/ + SInt16 csCount; /*Number of color spec entries to set*/ +}; +typedef struct VDSetEntryRecord VDSetEntryRecord; + +typedef VDSetEntryRecord * VDSetEntryPtr; +/* Parm block for SetGamma control call */ + +struct VDGammaRecord { + Ptr csGTable; /*pointer to gamma table*/ +}; +typedef struct VDGammaRecord VDGammaRecord; + +typedef VDGammaRecord * VDGamRecPtr; + +struct VDSwitchInfoRec { + DepthMode csMode; /* mode depth*/ + DisplayModeID csData; /* functional sResource of mode*/ + UInt16 csPage; /* page to switch in*/ + Ptr csBaseAddr; /* base address of page (return value)*/ + uintptr_t csReserved; /* Reserved (set to 0) */ +}; +typedef struct VDSwitchInfoRec VDSwitchInfoRec; + +typedef VDSwitchInfoRec * VDSwitchInfoPtr; + +struct VDTimingInfoRec { + DisplayModeID csTimingMode; /* timing mode (a la InitGDevice) */ + uintptr_t csTimingReserved; /* reserved */ + UInt32 csTimingFormat; /* what format is the timing info */ + UInt32 csTimingData; /* data supplied by driver */ + UInt32 csTimingFlags; /* mode within device */ +}; +typedef struct VDTimingInfoRec VDTimingInfoRec; + +typedef VDTimingInfoRec * VDTimingInfoPtr; + +struct VDDisplayConnectInfoRec { + UInt16 csDisplayType; /* Type of display connected */ + UInt8 csConnectTaggedType; /* type of tagging */ + UInt8 csConnectTaggedData; /* tagging data */ + UInt32 csConnectFlags; /* tell us about the connection */ + uintptr_t csDisplayComponent; /* if the card has a direct connection to the display, it returns the display component here (FUTURE) */ + uintptr_t csConnectReserved; /* reserved */ +}; +typedef struct VDDisplayConnectInfoRec VDDisplayConnectInfoRec; + +typedef VDDisplayConnectInfoRec * VDDisplayConnectInfoPtr; + +struct VDMultiConnectInfoRec { + UInt32 csDisplayCountOrNumber; /* For GetMultiConnect, returns count n of 1..n connections; otherwise, indicates the ith connection.*/ + VDDisplayConnectInfoRec csConnectInfo; /* Standard VDDisplayConnectionInfo for connection i.*/ +}; +typedef struct VDMultiConnectInfoRec VDMultiConnectInfoRec; + +typedef VDMultiConnectInfoRec * VDMultiConnectInfoPtr; +/* RawSenseCode + This abstract data type is not exactly abstract. Rather, it is merely enumerated constants + for the possible raw sense code values when 'standard' sense code hardware is implemented. + + For 'standard' sense code hardware, the raw sense is obtained as follows: + o Instruct the frame buffer controller NOT to actively drive any of the monitor sense lines + o Read the state of the monitor sense lines 2, 1, and 0. (2 is the MSB, 0 the LSB) + + IMPORTANT Note: + When the 'kTaggingInfoNonStandard' bit of 'csConnectFlags' is FALSE, then these constants + are valid 'csConnectTaggedType' values in 'VDDisplayConnectInfo' + +*/ +typedef UInt8 RawSenseCode; +enum { + kRSCZero = 0, + kRSCOne = 1, + kRSCTwo = 2, + kRSCThree = 3, + kRSCFour = 4, + kRSCFive = 5, + kRSCSix = 6, + kRSCSeven = 7 +}; + + +/* ExtendedSenseCode + This abstract data type is not exactly abstract. Rather, it is merely enumerated constants + for the values which are possible when the extended sense algorithm is applied to hardware + which implements 'standard' sense code hardware. + + For 'standard' sense code hardware, the extended sense code algorithm is as follows: + (Note: as described here, sense line 'A' corresponds to '2', 'B' to '1', and 'C' to '0') + o Drive sense line 'A' low and read the values of 'B' and 'C'. + o Drive sense line 'B' low and read the values of 'A' and 'C'. + o Drive sense line 'C' low and read the values of 'A' and 'B'. + + In this way, a six-bit number of the form BC/AC/AB is generated. + + IMPORTANT Note: + When the 'kTaggingInfoNonStandard' bit of 'csConnectFlags' is FALSE, then these constants + are valid 'csConnectTaggedData' values in 'VDDisplayConnectInfo' + +*/ +typedef UInt8 ExtendedSenseCode; +enum { + kESCZero21Inch = 0x00, /* 21" RGB */ + kESCOnePortraitMono = 0x14, /* Portrait Monochrome */ + kESCTwo12Inch = 0x21, /* 12" RGB */ + kESCThree21InchRadius = 0x31, /* 21" RGB (Radius) */ + kESCThree21InchMonoRadius = 0x34, /* 21" Monochrome (Radius) */ + kESCThree21InchMono = 0x35, /* 21" Monochrome */ + kESCFourNTSC = 0x0A, /* NTSC */ + kESCFivePortrait = 0x1E, /* Portrait RGB */ + kESCSixMSB1 = 0x03, /* MultiScan Band-1 (12" thru 1Six") */ + kESCSixMSB2 = 0x0B, /* MultiScan Band-2 (13" thru 19") */ + kESCSixMSB3 = 0x23, /* MultiScan Band-3 (13" thru 21") */ + kESCSixStandard = 0x2B, /* 13"/14" RGB or 12" Monochrome */ + kESCSevenPAL = 0x00, /* PAL */ + kESCSevenNTSC = 0x14, /* NTSC */ + kESCSevenVGA = 0x17, /* VGA */ + kESCSeven16Inch = 0x2D, /* 16" RGB (GoldFish) */ + kESCSevenPALAlternate = 0x30, /* PAL (Alternate) */ + kESCSeven19Inch = 0x3A, /* Third-Party 19" */ + kESCSevenDDC = 0x3E, /* DDC display */ + kESCSevenNoDisplay = 0x3F /* No display connected */ +}; + +/* DepthMode + This abstract data type is used to to reference RELATIVE pixel depths. + Its definition is largely derived from its past usage, analogous to 'xxxVidMode' + + Bits per pixel DOES NOT directly map to 'DepthMode' For example, on some + graphics hardware, 'kDepthMode1' may represent 1 BPP, whereas on other + hardware, 'kDepthMode1' may represent 8BPP. + + DepthMode IS considered to be ordinal, i.e., operations such as <, >, ==, etc. + behave as expected. The values of the constants which comprise the set are such + that 'kDepthMode4 < kDepthMode6' behaves as expected. +*/ +enum { + kDepthMode1 = 128, + kDepthMode2 = 129, + kDepthMode3 = 130, + kDepthMode4 = 131, + kDepthMode5 = 132, + kDepthMode6 = 133 +}; + +enum { + kFirstDepthMode = 128, /* These constants are obsolete, and just included */ + kSecondDepthMode = 129, /* for clients that have converted to the above */ + kThirdDepthMode = 130, /* kDepthModeXXX constants. */ + kFourthDepthMode = 131, + kFifthDepthMode = 132, + kSixthDepthMode = 133 +}; + + + +struct VDPageInfo { + DepthMode csMode; /* mode within device*/ + DisplayModeID csData; /* data supplied by driver*/ + SInt16 csPage; /* page to switch in*/ + Ptr csBaseAddr; /* base address of page*/ +}; +typedef struct VDPageInfo VDPageInfo; + +typedef VDPageInfo * VDPgInfoPtr; + +struct VDSizeInfo { + SInt16 csHSize; /* desired/returned h size*/ + SInt16 csHPos; /* desired/returned h position*/ + SInt16 csVSize; /* desired/returned v size*/ + SInt16 csVPos; /* desired/returned v position*/ +}; +typedef struct VDSizeInfo VDSizeInfo; + +typedef VDSizeInfo * VDSzInfoPtr; + +struct VDSettings { + SInt16 csParamCnt; /* number of params*/ + SInt16 csBrightMax; /* max brightness*/ + SInt16 csBrightDef; /* default brightness*/ + SInt16 csBrightVal; /* current brightness*/ + SInt16 csCntrstMax; /* max contrast*/ + SInt16 csCntrstDef; /* default contrast*/ + SInt16 csCntrstVal; /* current contrast*/ + SInt16 csTintMax; /* max tint*/ + SInt16 csTintDef; /* default tint*/ + SInt16 csTintVal; /* current tint*/ + SInt16 csHueMax; /* max hue*/ + SInt16 csHueDef; /* default hue*/ + SInt16 csHueVal; /* current hue*/ + SInt16 csHorizDef; /* default horizontal*/ + SInt16 csHorizVal; /* current horizontal*/ + SInt16 csHorizMax; /* max horizontal*/ + SInt16 csVertDef; /* default vertical*/ + SInt16 csVertVal; /* current vertical*/ + SInt16 csVertMax; /* max vertical*/ +}; +typedef struct VDSettings VDSettings; +typedef VDSettings * VDSettingsPtr; + +struct VDDefMode { + UInt8 csID; + SInt8 filler; +}; +typedef struct VDDefMode VDDefMode; +typedef VDDefMode * VDDefModePtr; + +struct VDSyncInfoRec { + UInt8 csMode; + UInt8 csFlags; +}; +typedef struct VDSyncInfoRec VDSyncInfoRec; + +typedef VDSyncInfoRec * VDSyncInfoPtr; +/* + All displayModeID values from 0x80000000 to 0xFFFFFFFF and 0x00 + are reserved for Apple Computer. +*/ +/* Constants for the cscGetNextResolution call */ +enum { + kDisplayModeIDCurrent = 0x00, /* Reference the Current DisplayModeID */ + kDisplayModeIDInvalid = (IODisplayModeID)0xFFFFFFFF, /* A bogus DisplayModeID in all cases */ + kDisplayModeIDFindFirstResolution = (IODisplayModeID)0xFFFFFFFE, /* Used in cscGetNextResolution to reset iterator */ + kDisplayModeIDNoMoreResolutions = (IODisplayModeID)0xFFFFFFFD, /* Used in cscGetNextResolution to indicate End Of List */ + kDisplayModeIDFindFirstProgrammable = (IODisplayModeID)0xFFFFFFFC, /* Used in cscGetNextResolution to find unused programmable timing */ + kDisplayModeIDBootProgrammable = (IODisplayModeID)0xFFFFFFFB, /* This is the ID given at boot time by the OF driver to a programmable timing */ + kDisplayModeIDReservedBase = (IODisplayModeID)0x80000000 /* Lowest (unsigned) DisplayModeID reserved by Apple */ +}; + +/* Constants for the GetGammaInfoList call */ +enum { + kGammaTableIDFindFirst = (GammaTableID)0xFFFFFFFE, /* Get the first gamma table ID */ + kGammaTableIDNoMoreTables = (GammaTableID)0xFFFFFFFD, /* Used to indicate end of list */ + kGammaTableIDSpecific = 0x00 /* Return the info for the given table id */ +}; + +/* Constants for GetMultiConnect call*/ +enum { + kGetConnectionCount = 0xFFFFFFFF, /* Used to get the number of possible connections in a "multi-headed" framebuffer environment.*/ + kActivateConnection = (0 << kConnectionInactive), /* Used for activating a connection (csConnectFlags value).*/ + kDeactivateConnection = (1 << kConnectionInactive) /* Used for deactivating a connection (csConnectFlags value.)*/ +}; + +/* VDCommunicationRec.csBusID values*/ +enum { + kVideoDefaultBus = 0 +}; + + +/* VDCommunicationInfoRec.csBusType values*/ +enum { + kVideoBusTypeInvalid = 0, + kVideoBusTypeI2C = 1, + kVideoBusTypeDisplayPort = 2 +}; + + +/* VDCommunicationRec.csSendType and VDCommunicationRec.csReplyType values*/ +enum { + kVideoNoTransactionType = 0, /* No transaction*/ + kVideoNoTransactionTypeMask = (1 << kVideoNoTransactionType), + kVideoSimpleI2CType = 1, /* Simple I2C message*/ + kVideoSimpleI2CTypeMask = (1 << kVideoSimpleI2CType), + kVideoDDCciReplyType = 2, /* DDC/ci message (with imbedded length)*/ + kVideoDDCciReplyTypeMask = (1 << kVideoDDCciReplyType), + kVideoCombinedI2CType = 3, /* Combined format I2C R/~W transaction*/ + kVideoCombinedI2CTypeMask = (1 << kVideoCombinedI2CType), + kVideoDisplayPortNativeType = 4, /* DisplayPort Native */ + kVideoDisplayPortNativeTypeMask = (1 << kVideoDisplayPortNativeType) +}; + +// VDCommunicationRec.csCommFlags and VDCommunicationInfoRec.csSupportedCommFlags +enum { + kVideoReplyMicroSecDelayBit = 0, /* If bit set, the driver should delay csMinReplyDelay micro seconds between send and receive*/ + kVideoReplyMicroSecDelayMask = (1 << kVideoReplyMicroSecDelayBit), + kVideoUsageAddrSubAddrBit = 1, /* If bit set, the driver understands to use the lower 16 bits of the address field as two 8 bit values (address/subaddress) for the I2C transaction*/ + kVideoUsageAddrSubAddrMask = (1 << kVideoUsageAddrSubAddrBit) +}; + + +struct VDResolutionInfoRec { + DisplayModeID csPreviousDisplayModeID; /* ID of the previous resolution in a chain */ + DisplayModeID csDisplayModeID; /* ID of the next resolution */ + UInt32 csHorizontalPixels; /* # of pixels in a horizontal line at the max depth */ + UInt32 csVerticalLines; /* # of lines in a screen at the max depth */ + Fixed csRefreshRate; /* Vertical Refresh Rate in Hz */ + DepthMode csMaxDepthMode; /* 0x80-based number representing max bit depth */ + UInt32 csResolutionFlags; /* Reserved - flag bits */ + uintptr_t csReserved; /* Reserved */ +}; +typedef struct VDResolutionInfoRec VDResolutionInfoRec; + +typedef VDResolutionInfoRec * VDResolutionInfoPtr; + +struct VDVideoParametersInfoRec { + DisplayModeID csDisplayModeID; /* the ID of the resolution we want info on */ + DepthMode csDepthMode; /* The bit depth we want the info on (0x80 based) */ + VPBlockPtr csVPBlockPtr; /* Pointer to a video parameter block */ + UInt32 csPageCount; /* Number of pages supported by the resolution */ + VideoDeviceType csDeviceType; /* Device Type: Direct, Fixed or CLUT; */ + UInt32 csDepthFlags; /* Flags */ +}; +typedef struct VDVideoParametersInfoRec VDVideoParametersInfoRec; + +typedef VDVideoParametersInfoRec * VDVideoParametersInfoPtr; + +struct VDGammaInfoRec { + GammaTableID csLastGammaID; /* the ID of the previous gamma table */ + GammaTableID csNextGammaID; /* the ID of the next gamma table */ + Ptr csGammaPtr; /* Ptr to a gamma table data */ + uintptr_t csReserved; /* Reserved */ +}; +typedef struct VDGammaInfoRec VDGammaInfoRec; + +typedef VDGammaInfoRec * VDGammaInfoPtr; + +struct VDGetGammaListRec { + GammaTableID csPreviousGammaTableID; /* ID of the previous gamma table */ + GammaTableID csGammaTableID; /* ID of the gamma table following csPreviousDisplayModeID */ + UInt32 csGammaTableSize; /* Size of the gamma table in bytes */ + char * csGammaTableName; /* Gamma table name (c-string) */ +}; +typedef struct VDGetGammaListRec VDGetGammaListRec; + +typedef VDGetGammaListRec * VDGetGammaListPtr; + +struct VDRetrieveGammaRec { + GammaTableID csGammaTableID; /* ID of gamma table to retrieve */ + GammaTbl * csGammaTablePtr; /* Location to copy desired gamma to */ +}; +typedef struct VDRetrieveGammaRec VDRetrieveGammaRec; + +typedef VDRetrieveGammaRec * VDRetrieveGammaPtr; + +struct VDSetHardwareCursorRec { + void * csCursorRef; /* reference to cursor data */ + UInt32 csReserved1; /* reserved for future use */ + UInt32 csReserved2; /* should be ignored */ +}; +typedef struct VDSetHardwareCursorRec VDSetHardwareCursorRec; + +typedef VDSetHardwareCursorRec * VDSetHardwareCursorPtr; + +struct VDDrawHardwareCursorRec { + SInt32 csCursorX; /* x coordinate */ + SInt32 csCursorY; /* y coordinate */ + UInt32 csCursorVisible; /* true if cursor is must be visible */ + UInt32 csReserved1; /* reserved for future use */ + UInt32 csReserved2; /* should be ignored */ +}; +typedef struct VDDrawHardwareCursorRec VDDrawHardwareCursorRec; + +typedef VDDrawHardwareCursorRec * VDDrawHardwareCursorPtr; + +struct VDSupportsHardwareCursorRec { + UInt32 csSupportsHardwareCursor; + /* true if hardware cursor is supported */ + UInt32 csReserved1; /* reserved for future use */ + UInt32 csReserved2; /* must be zero */ +}; +typedef struct VDSupportsHardwareCursorRec VDSupportsHardwareCursorRec; + +typedef VDSupportsHardwareCursorRec * VDSupportsHardwareCursorPtr; + +struct VDHardwareCursorDrawStateRec { + SInt32 csCursorX; /* x coordinate */ + SInt32 csCursorY; /* y coordinate */ + UInt32 csCursorVisible; /* true if cursor is visible */ + UInt32 csCursorSet; /* true if cursor successfully set by last set control call */ + UInt32 csReserved1; /* reserved for future use */ + UInt32 csReserved2; /* must be zero */ +}; +typedef struct VDHardwareCursorDrawStateRec VDHardwareCursorDrawStateRec; + +typedef VDHardwareCursorDrawStateRec * VDHardwareCursorDrawStatePtr; + +struct VDConvolutionInfoRec { + DisplayModeID csDisplayModeID; /* the ID of the resolution we want info on */ + DepthMode csDepthMode; /* The bit depth we want the info on (0x80 based) */ + UInt32 csPage; + UInt32 csFlags; + UInt32 csReserved; +}; +typedef struct VDConvolutionInfoRec VDConvolutionInfoRec; + +typedef VDConvolutionInfoRec * VDConvolutionInfoPtr; + +struct VDPowerStateRec { + UInt32 powerState; + UInt32 powerFlags; + + uintptr_t powerReserved1; + uintptr_t powerReserved2; +}; +typedef struct VDPowerStateRec VDPowerStateRec; + +typedef VDPowerStateRec * VDPowerStatePtr; +/* + Private Data to video drivers. + + In versions of MacOS with multiple address spaces (System 8), the OS + must know the extent of parameters in order to move them between the caller + and driver. The old private-selector model for video drivers does not have + this information so: + + For post-7.x Systems private calls should be implemented using the cscPrivateCall +*/ + +struct VDPrivateSelectorDataRec { + LogicalAddress privateParameters; /* Caller's parameters*/ + ByteCount privateParametersSize; /* Size of data sent from caller to driver*/ + LogicalAddress privateResults; /* Caller's return area. Can be nil, or same as privateParameters.*/ + ByteCount privateResultsSize; /* Size of data driver returns to caller. Can be nil, or same as privateParametersSize.*/ +}; +typedef struct VDPrivateSelectorDataRec VDPrivateSelectorDataRec; + + +struct VDPrivateSelectorRec { + UInt32 reserved; /* Reserved (set to 0). */ + VDPrivateSelectorDataRec data[1]; +}; +typedef struct VDPrivateSelectorRec VDPrivateSelectorRec; + +struct VDDDCBlockRec { + UInt32 ddcBlockNumber; /* Input -- DDC EDID (Extended Display Identification Data) number (1-based) */ + ResType ddcBlockType; /* Input -- DDC block type (EDID/VDIF) */ + UInt32 ddcFlags; /* Input -- DDC Flags*/ + UInt32 ddcReserved; /* Reserved */ + Byte ddcBlockData[128]; /* Output -- DDC EDID/VDIF data (kDDCBlockSize) */ +}; +typedef struct VDDDCBlockRec VDDDCBlockRec; + +typedef VDDDCBlockRec * VDDDCBlockPtr; + +enum { + /* timingSyncConfiguration*/ + kSyncInterlaceMask = (1 << 7), + kSyncAnalogCompositeMask = 0, + kSyncAnalogCompositeSerrateMask = (1 << 2), + kSyncAnalogCompositeRGBSyncMask = (1 << 1), + kSyncAnalogBipolarMask = (1 << 3), + kSyncAnalogBipolarSerrateMask = (1 << 2), + kSyncAnalogBipolarSRGBSyncMask = (1 << 1), + kSyncDigitalCompositeMask = (1 << 4), + kSyncDigitalCompositeSerrateMask = (1 << 2), + kSyncDigitalCompositeMatchHSyncMask = (1 << 2), + kSyncDigitalSeperateMask = (1 << 4) + (1 << 3), + kSyncDigitalVSyncPositiveMask = (1 << 2), + kSyncDigitalHSyncPositiveMask = (1 << 1) +}; + + + + +struct VDDisplayTimingRangeRec { + UInt32 csRangeSize; /* Init to sizeof(VDDisplayTimingRangeRec) */ + UInt32 csRangeType; /* Init to 0 */ + UInt32 csRangeVersion; /* Init to 0 */ + UInt32 csRangeReserved; /* Init to 0 */ + + UInt32 csRangeBlockIndex; /* Requested block (first index is 0)*/ + UInt32 csRangeGroup; /* set to 0 */ + UInt32 csRangeBlockCount; /* # blocks */ + UInt32 csRangeFlags; /* dependent video */ + + UInt64 csMinPixelClock; /* Min dot clock in Hz */ + UInt64 csMaxPixelClock; /* Max dot clock in Hz */ + + UInt32 csMaxPixelError; /* Max dot clock error */ + UInt32 csTimingRangeSyncFlags; + UInt32 csTimingRangeSignalLevels; + UInt32 csTimingRangeSupportedSignalConfigs; + + UInt32 csMinFrameRate; /* Hz */ + UInt32 csMaxFrameRate; /* Hz */ + UInt32 csMinLineRate; /* Hz */ + UInt32 csMaxLineRate; /* Hz */ + + + UInt32 csMaxHorizontalTotal; /* Clocks - Maximum total (active + blanking) */ + UInt32 csMaxVerticalTotal; /* Clocks - Maximum total (active + blanking) */ + UInt32 csMaxTotalReserved1; /* Reserved */ + UInt32 csMaxTotalReserved2; /* Reserved */ + + + + /* Some cards require that some timing elements*/ + /* be multiples of a "character size" (often 8*/ + /* clocks). The "xxxxCharSize" fields document*/ + /* those requirements.*/ + + + UInt8 csCharSizeHorizontalActive; /* Character size */ + UInt8 csCharSizeHorizontalBlanking; /* Character size */ + UInt8 csCharSizeHorizontalSyncOffset; /* Character size */ + UInt8 csCharSizeHorizontalSyncPulse; /* Character size */ + + UInt8 csCharSizeVerticalActive; /* Character size */ + UInt8 csCharSizeVerticalBlanking; /* Character size */ + UInt8 csCharSizeVerticalSyncOffset; /* Character size */ + UInt8 csCharSizeVerticalSyncPulse; /* Character size */ + + UInt8 csCharSizeHorizontalBorderLeft; /* Character size */ + UInt8 csCharSizeHorizontalBorderRight; /* Character size */ + UInt8 csCharSizeVerticalBorderTop; /* Character size */ + UInt8 csCharSizeVerticalBorderBottom; /* Character size */ + + UInt8 csCharSizeHorizontalTotal; /* Character size for active + blanking */ + UInt8 csCharSizeVerticalTotal; /* Character size for active + blanking */ + UInt16 csCharSizeReserved1; /* Reserved (Init to 0) */ + + + UInt32 csMinHorizontalActiveClocks; + UInt32 csMaxHorizontalActiveClocks; + UInt32 csMinHorizontalBlankingClocks; + UInt32 csMaxHorizontalBlankingClocks; + + UInt32 csMinHorizontalSyncOffsetClocks; + UInt32 csMaxHorizontalSyncOffsetClocks; + UInt32 csMinHorizontalPulseWidthClocks; + UInt32 csMaxHorizontalPulseWidthClocks; + + UInt32 csMinVerticalActiveClocks; + UInt32 csMaxVerticalActiveClocks; + UInt32 csMinVerticalBlankingClocks; + UInt32 csMaxVerticalBlankingClocks; + + UInt32 csMinVerticalSyncOffsetClocks; + UInt32 csMaxVerticalSyncOffsetClocks; + UInt32 csMinVerticalPulseWidthClocks; + UInt32 csMaxVerticalPulseWidthClocks; + + + UInt32 csMinHorizontalBorderLeft; + UInt32 csMaxHorizontalBorderLeft; + UInt32 csMinHorizontalBorderRight; + UInt32 csMaxHorizontalBorderRight; + + UInt32 csMinVerticalBorderTop; + UInt32 csMaxVerticalBorderTop; + UInt32 csMinVerticalBorderBottom; + UInt32 csMaxVerticalBorderBottom; + + UInt32 csMaxNumLinks; /* number of links, if zero, assume link 1 */ + UInt32 csMinLink0PixelClock; /* min pixel clock for link 0 (kHz) */ + UInt32 csMaxLink0PixelClock; /* max pixel clock for link 0 (kHz) */ + UInt32 csMinLink1PixelClock; /* min pixel clock for link 1 (kHz) */ + UInt32 csMaxLink1PixelClock; /* max pixel clock for link 1 (kHz) */ + + UInt32 csReserved6; /* Reserved (Init to 0)*/ + UInt32 csReserved7; /* Reserved (Init to 0)*/ + UInt32 csReserved8; /* Reserved (Init to 0)*/ +}; +typedef struct VDDisplayTimingRangeRec VDDisplayTimingRangeRec; + +typedef VDDisplayTimingRangeRec * VDDisplayTimingRangePtr; + +enum { + /* csDisplayModeState*/ + kDMSModeReady = 0, /* Display Mode ID is configured and ready*/ + kDMSModeNotReady = 1, /* Display Mode ID is is being programmed*/ + kDMSModeFree = 2 /* Display Mode ID is not associated with a timing*/ +}; + + +/* Video driver Errors -10930 to -10959 */ +enum { + kTimingChangeRestrictedErr = -10930, + kVideoI2CReplyPendingErr = -10931, + kVideoI2CTransactionErr = -10932, + kVideoI2CBusyErr = -10933, + kVideoI2CTransactionTypeErr = -10934, + kVideoBufferSizeErr = -10935, + kVideoCannotMirrorErr = -10936 +}; + + +enum { + /* csTimingRangeSignalLevels*/ + kRangeSupportsSignal_0700_0300_Bit = 0, + kRangeSupportsSignal_0714_0286_Bit = 1, + kRangeSupportsSignal_1000_0400_Bit = 2, + kRangeSupportsSignal_0700_0000_Bit = 3, + kRangeSupportsSignal_0700_0300_Mask = (1 << kRangeSupportsSignal_0700_0300_Bit), + kRangeSupportsSignal_0714_0286_Mask = (1 << kRangeSupportsSignal_0714_0286_Bit), + kRangeSupportsSignal_1000_0400_Mask = (1 << kRangeSupportsSignal_1000_0400_Bit), + kRangeSupportsSignal_0700_0000_Mask = (1 << kRangeSupportsSignal_0700_0000_Bit) +}; + + +enum { + /* csSignalConfig*/ + kDigitalSignalBit = 0, /* Do not set. Mac OS does not currently support arbitrary digital timings*/ + kAnalogSetupExpectedBit = 1, /* Analog displays - display expects a blank-to-black setup or pedestal. See VESA signal standards.*/ + kInterlacedCEA861SyncModeBit = 2, + + kDigitalSignalMask = (1 << kDigitalSignalBit), + kAnalogSetupExpectedMask = (1 << kAnalogSetupExpectedBit), + kInterlacedCEA861SyncModeMask = (1 << kInterlacedCEA861SyncModeBit) +}; + + +enum { + /* csSignalLevels for analog*/ + kAnalogSignalLevel_0700_0300 = 0, + kAnalogSignalLevel_0714_0286 = 1, + kAnalogSignalLevel_1000_0400 = 2, + kAnalogSignalLevel_0700_0000 = 3 +}; + + +enum { + /* csTimingRangeSyncFlags*/ + kRangeSupportsSeperateSyncsBit = 0, + kRangeSupportsSyncOnGreenBit = 1, + kRangeSupportsCompositeSyncBit = 2, + kRangeSupportsVSyncSerrationBit = 3, + kRangeSupportsSeperateSyncsMask = (1 << kRangeSupportsSeperateSyncsBit), + kRangeSupportsSyncOnGreenMask = (1 << kRangeSupportsSyncOnGreenBit), + kRangeSupportsCompositeSyncMask = (1 << kRangeSupportsCompositeSyncBit), + kRangeSupportsVSyncSerrationMask = (1 << kRangeSupportsVSyncSerrationBit) +}; + + + +enum { + /* csHorizontalSyncConfig and csVerticalSyncConfig*/ + kSyncPositivePolarityBit = 0, /* Digital separate sync polarity for analog interfaces (0 => negative polarity)*/ + kSyncPositivePolarityMask = (1 << kSyncPositivePolarityBit) +}; + + + + +/* For timings with kDetailedTimingFormat.*/ + +struct VDDetailedTimingRec { + UInt32 csTimingSize; /* Init to sizeof(VDDetailedTimingRec)*/ + UInt32 csTimingType; /* Init to 0*/ + UInt32 csTimingVersion; /* Init to 0*/ + UInt32 csTimingReserved; /* Init to 0*/ + + DisplayModeID csDisplayModeID; /* Init to 0*/ + UInt32 csDisplayModeSeed; /* */ + UInt32 csDisplayModeState; /* Display Mode state*/ + UInt32 csDisplayModeAlias; /* Mode to use when programmed.*/ + + UInt32 csSignalConfig; + UInt32 csSignalLevels; + + UInt64 csPixelClock; /* Hz*/ + + UInt64 csMinPixelClock; /* Hz - With error what is slowest actual clock */ + UInt64 csMaxPixelClock; /* Hz - With error what is fasted actual clock */ + + + UInt32 csHorizontalActive; /* Pixels*/ + UInt32 csHorizontalBlanking; /* Pixels*/ + UInt32 csHorizontalSyncOffset; /* Pixels*/ + UInt32 csHorizontalSyncPulseWidth; /* Pixels*/ + + UInt32 csVerticalActive; /* Lines*/ + UInt32 csVerticalBlanking; /* Lines*/ + UInt32 csVerticalSyncOffset; /* Lines*/ + UInt32 csVerticalSyncPulseWidth; /* Lines*/ + + UInt32 csHorizontalBorderLeft; /* Pixels*/ + UInt32 csHorizontalBorderRight; /* Pixels*/ + UInt32 csVerticalBorderTop; /* Lines*/ + UInt32 csVerticalBorderBottom; /* Lines*/ + + UInt32 csHorizontalSyncConfig; + UInt32 csHorizontalSyncLevel; /* Future use (init to 0)*/ + UInt32 csVerticalSyncConfig; + UInt32 csVerticalSyncLevel; /* Future use (init to 0)*/ + + UInt32 csNumLinks; /* number of links, if 0 = assume link - 0 */ + + UInt32 csReserved2; /* Init to 0*/ + UInt32 csReserved3; /* Init to 0*/ + UInt32 csReserved4; /* Init to 0*/ + + UInt32 csReserved5; /* Init to 0*/ + UInt32 csReserved6; /* Init to 0*/ + UInt32 csReserved7; /* Init to 0*/ + UInt32 csReserved8; /* Init to 0*/ +}; +typedef struct VDDetailedTimingRec VDDetailedTimingRec; + +typedef VDDetailedTimingRec * VDDetailedTimingPtr; + +/* csScalerFeatures */ +enum { + kScaleStretchOnlyMask = (1<<0), /* True means the driver cannot add borders to avoid non-square pixels */ + kScaleCanUpSamplePixelsMask = (1<<1), /* True means timings with more active clocks than pixels (ie 640x480 pixels on a 1600x1200 timing) */ + kScaleCanDownSamplePixelsMask = (1<<2), /* True means timings with fewer active clocks than pixels (ie 1600x1200 pixels on a 640x480 timing) */ + kScaleCanScaleInterlacedMask = (1<<3), /* True means can scale an interlaced timing */ + kScaleCanSupportInsetMask = (1<<4), /* True means can scale a timing with insets */ + kScaleCanRotateMask = (1<<5), /* True means can rotate image */ + kScaleCanBorderInsetOnlyMask = (1<<6) /* True means can scale a timing with insets */ +}; + +/* csScalerFlags */ +enum { + kScaleStretchToFitMask = 0x00000001, /* True means the driver should avoid borders and allow non-square pixels */ + + kScaleRotateFlagsMask = 0x000000f0, + + kScaleSwapAxesMask = 0x00000010, + kScaleInvertXMask = 0x00000020, + kScaleInvertYMask = 0x00000040, + + kScaleRotate0Mask = 0x00000000, + kScaleRotate90Mask = kScaleSwapAxesMask | kScaleInvertXMask, + kScaleRotate180Mask = kScaleInvertXMask | kScaleInvertYMask, + kScaleRotate270Mask = kScaleSwapAxesMask | kScaleInvertYMask +}; + +typedef UInt32 VDClutBehavior; +typedef VDClutBehavior * VDClutBehaviorPtr; +enum { + kSetClutAtSetEntries = 0, /* SetEntries behavior is to update clut during SetEntries call*/ + kSetClutAtVBL = 1 /* SetEntries behavior is to upate clut at next vbl*/ +}; + + +struct VDCommunicationRec { + SInt32 csBusID; /* kVideoDefaultBus for single headed cards.*/ + UInt32 csCommFlags; /* Always zero*/ + UInt32 csMinReplyDelay; /* Minimum delay between send and reply transactions (units depend on csCommFlags)*/ + UInt32 csReserved2; /* Always zero*/ + + UInt32 csSendAddress; /* Usually I2C address (eg 0x6E)*/ + UInt32 csSendType; /* See kVideoSimpleI2CType etc.*/ + LogicalAddress csSendBuffer; /* Pointer to the send buffer*/ + ByteCount csSendSize; /* Number of bytes to send*/ + + UInt32 csReplyAddress; /* Address from which to read (eg 0x6F for kVideoDDCciReplyType I2C address)*/ + UInt32 csReplyType; /* See kVideoDDCciReplyType etc.*/ + LogicalAddress csReplyBuffer; /* Pointer to the reply buffer*/ + ByteCount csReplySize; /* Max bytes to reply (size of csReplyBuffer)*/ + + UInt32 csReserved3; + UInt32 csReserved4; + UInt32 csReserved5; /* Always zero*/ + UInt32 csReserved6; /* Always zero*/ +}; +typedef struct VDCommunicationRec VDCommunicationRec; + +typedef VDCommunicationRec * VDCommunicationPtr; + +struct VDCommunicationInfoRec { + SInt32 csBusID; /* kVideoDefaultBus for single headed cards. */ + UInt32 csBusType; /* See kVideoBusI2C etc.*/ + SInt32 csMinBus; /* Minimum bus (usually kVideoDefaultBus). Used to probe additional busses*/ + SInt32 csMaxBus; /* Max bus (usually kVideoDefaultBus). Used to probe additional busses*/ + + UInt32 csSupportedTypes; /* Bit field for first 32 supported transaction types. Eg. 0x07 => support for kVideoNoTransactionType, kVideoSimpleI2CType and kVideoDDCciReplyType.*/ + UInt32 csSupportedCommFlags; /* Return the flags csCommFlags understood by this driver. */ + UInt32 csReserved2; /* Always zero*/ + UInt32 csReserved3; /* Always zero*/ + + UInt32 csReserved4; /* Always zero*/ + UInt32 csReserved5; /* Always zero*/ + UInt32 csReserved6; /* Always zero*/ + UInt32 csReserved7; /* Always zero*/ +}; +typedef struct VDCommunicationInfoRec VDCommunicationInfoRec; + +typedef VDCommunicationInfoRec * VDCommunicationInfoPtr; + + +struct VDScalerRec { + UInt32 csScalerSize; /* Init to sizeof(VDScalerRec) */ + UInt32 csScalerVersion; /* Init to 0 */ + UInt32 csReserved1; /* Init to 0 */ + UInt32 csReserved2; /* Init to 0 */ + + DisplayModeID csDisplayModeID; /* Display Mode ID modified by this call. */ + UInt32 csDisplayModeSeed; /* */ + UInt32 csDisplayModeState; /* Display Mode state */ + UInt32 csReserved3; /* Init to 0 */ + + UInt32 csScalerFlags; /* Init to 0 */ + UInt32 csHorizontalPixels; /* Graphics system addressable pixels */ + UInt32 csVerticalPixels; /* Graphics system addressable lines */ + UInt32 csHorizontalInset; /* Border pixels for underscan */ + UInt32 csVerticalInset; /* Border lines for underscan */ + UInt32 csReserved6; /* Init to 0 */ + UInt32 csReserved7; /* Init to 0 */ + UInt32 csReserved8; /* Init to 0 */ +}; +typedef struct VDScalerRec VDScalerRec; +typedef VDScalerRec *VDScalerPtr; + +struct VDScalerInfoRec { + UInt32 csScalerInfoSize; /* Init to sizeof(VDScalerInfoRec) */ + UInt32 csScalerInfoVersion; /* Init to 0 */ + UInt32 csReserved1; /* Init to 0 */ + UInt32 csReserved2; /* Init to 0 */ + + UInt32 csScalerFeatures; /* Feature flags */ + UInt32 csMaxHorizontalPixels; /* limit to horizontal scaled pixels */ + UInt32 csMaxVerticalPixels; /* limit to vertical scaled pixels */ + UInt32 csReserved3; /* Init to 0 */ + + UInt32 csReserved4; /* Init to 0 */ + UInt32 csReserved5; /* Init to 0 */ + UInt32 csReserved6; /* Init to 0 */ + UInt32 csReserved7; /* Init to 0 */ +}; +typedef struct VDScalerInfoRec VDScalerInfoRec; +typedef VDScalerInfoRec *VDScalerInfoPtr; + +enum { + /* csMirrorFeatures*/ + kMirrorSameDepthOnlyMirrorMask = (1 << 0), /* Commonly true - Mirroring can only be done if the displays are the same bitdepth*/ + kMirrorSameSizeOnlyMirrorMask = (1 << 1), /* Commonly false - Mirroring can only be done if the displays are the same size*/ + kMirrorSameTimingOnlyMirrorMask = (1 << 2), /* Sometimes true - Mirroring can only be done if the displays are the same timing*/ + kMirrorCommonGammaMask = (1 << 3) /* Sometimes true - Only one gamma correction LUT.*/ +}; + +enum { + /* csMirrorSupportedFlags and csMirrorFlags*/ + kMirrorCanMirrorMask = (1 << 0), /* Set means we can HW mirrored right now (uses csMirrorEntryID)*/ + kMirrorAreMirroredMask = (1 << 1), /* Set means we are HW mirrored right now (uses csMirrorEntryID)*/ + kMirrorUnclippedMirrorMask = (1 << 2), /* Set means mirrored displays are not clipped to their intersection*/ + kMirrorHAlignCenterMirrorMask = (1 << 3), /* Set means mirrored displays can/should be centered horizontally*/ + kMirrorVAlignCenterMirrorMask = (1 << 4), /* Set means mirrored displays can/should be centered vertically*/ + kMirrorCanChangePixelFormatMask = (1 << 5), /* Set means mirrored the device should change the pixel format of mirrored displays to allow mirroring.*/ + kMirrorCanChangeTimingMask = (1 << 6), /* Set means mirrored the device should change the timing of mirrored displays to allow mirroring.*/ + kMirrorClippedMirrorMask = (1 << 7) /* Set means mirrored displays are clipped to their intersection (driver handles blacking and base address adjustment)*/ +}; + +struct VDMirrorRec { + UInt32 csMirrorSize; /* Init to sizeof(VDMirrorRec)*/ + UInt32 csMirrorVersion; /* Init to 0*/ + + RegEntryID csMirrorRequestID; /* Input RegEntryID to check for mirroring support and state*/ + RegEntryID csMirrorResultID; /* Output RegEntryID of the next mirrored device*/ + + UInt32 csMirrorFeatures; /* Output summary features of the driver*/ + UInt32 csMirrorSupportedFlags; /* Output configuration options supported by the driver*/ + UInt32 csMirrorFlags; /* Output configuration options active now*/ + UInt32 csReserved1; /* Init to 0*/ + + + UInt32 csReserved2; /* Init to 0*/ + UInt32 csReserved3; /* Init to 0*/ + UInt32 csReserved4; /* Init to 0*/ + UInt32 csReserved5; /* Init to 0*/ +}; +typedef struct VDMirrorRec VDMirrorRec; +typedef VDMirrorRec * VDMirrorPtr; + +struct VDConfigurationRec { + UInt32 csConfigFeature; /* input what feature to config - always input*/ + UInt32 csConfigSupport; /* output support value - always output*/ + uintptr_t csConfigValue; /* input/output feature value - input on Control(), output on Status()*/ + uintptr_t csReserved1; + uintptr_t csReserved2; +}; +typedef struct VDConfigurationRec VDConfigurationRec; +typedef VDConfigurationRec * VDConfigurationPtr; + +enum +{ + kDVIPowerSwitchFeature = (1 << 0), /* Used for csConfigFeature*/ + kDVIPowerSwitchSupportMask = (1 << 0), /* Read-only*/ + kDVIPowerSwitchActiveMask = (1 << 0), /* Read/write for csConfigValue*/ +}; + +struct VDConfigurationFeatureListRec +{ + OSType * csConfigFeatureList; + ItemCount csNumConfigFeatures; + uintptr_t csReserved1; + uintptr_t csReserved2; +}; +typedef struct VDConfigurationFeatureListRec VDConfigurationFeatureListRec; +typedef VDConfigurationFeatureListRec * VDConfigurationFeatureListRecPtr; + + +#ifndef __LP64__ +#pragma options align=reset +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __IOMACOSVIDEO__ */ + diff --git a/QualcommWireless/include/IOKit/ndrvsupport/IONDRVFramebuffer.h b/QualcommWireless/include/IOKit/ndrvsupport/IONDRVFramebuffer.h new file mode 100644 index 0000000..154e146 --- /dev/null +++ b/QualcommWireless/include/IOKit/ndrvsupport/IONDRVFramebuffer.h @@ -0,0 +1,360 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1997-1998 Apple Computer, Inc. + * + * + * HISTORY + * + * sdouglas 22 Oct 97 - first checked in. + * sdouglas 24 Jul 98 - start IOKit. + * sdouglas 15 Dec 98 - cpp. + * + */ + +#ifndef _IOKIT_IONDRVFRAMEBUFFER_H +#define _IOKIT_IONDRVFRAMEBUFFER_H + +#include +#include +#include + +#include + +#ifndef __MAC_OS_X_VERSION_MIN_REQUIRED +#error "Missing macOS target version" +#endif + +#define kIONDRVDisableKey "AAPL,disable-ndrv" + +class IONDRVFramebuffer : public IOFramebuffer +{ + OSDeclareDefaultStructors(IONDRVFramebuffer) + +protected: +/* Reserved for future use. (Internal use only) */ + struct ExpansionData { }; + ExpansionData * reserved; + +protected: + + IOService * fNub; + class IONDRV * fNdrv; + + // current configuration + IODisplayModeID currentDisplayMode; + IOIndex currentDepth; + IOIndex currentPage; + UInt8 __reservedE; + + IOPhysicalAddress __resv_was_physicalFramebuffer; + IOMemoryDescriptor * vramRange; + + UInt8 gammaWidth; + UInt8 __reservedD; + UInt8 lastGrayMode; + VDClutBehavior lastClutSetting; + UInt8 __reservedC; + + bool consoleDevice; + UInt32 powerState; + UInt32 ndrvState; + SInt32 ndrvEnter; + OSArray * detailedTimings; + UInt32 detailedTimingsSeed; + UInt32 * detailedTimingsCurrent; + + IODeviceMemory * vramMemory; + + VDResolutionInfoRec cachedVDResolution; + + struct _VSLService * vslServices; + + UInt32 accessFlags; + unsigned int shouldDoI2CPower:1; + unsigned int online:1; + unsigned int avJackState:1; + unsigned int grayMode:1; + unsigned int platformSleep:1; + unsigned int forceReadEDID:1; + unsigned int supportsProbe:1; + unsigned int __reservedB:25; + + IOService * fDevice; + + UInt32 __reservedA[29]; + +private: + struct IONDRVFramebufferPrivate * __private; + +public: + virtual IOReturn doDriverIO( UInt32 commandID, void * contents, + UInt32 commandCode, UInt32 commandKind ); +private: + OSMetaClassDeclareReservedUsed(IONDRVFramebuffer, 0); + + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 1); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 2); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 3); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 4); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 5); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 6); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 7); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 8); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 9); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 10); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 11); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 12); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 13); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 14); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 15); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 16); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 17); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 18); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 19); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 20); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 21); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 22); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 23); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 24); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 25); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 26); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 27); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 28); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 29); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 30); + OSMetaClassDeclareReservedUnused(IONDRVFramebuffer, 31); + +private: + + void initForPM ( void ); + + virtual unsigned long maxCapabilityForDomainState( IOPMPowerFlags domainState ) APPLE_KEXT_OVERRIDE; + virtual unsigned long initialPowerStateForDomainState( IOPMPowerFlags domainState ) APPLE_KEXT_OVERRIDE; + virtual unsigned long powerStateForDomainState( IOPMPowerFlags domainState ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn checkDriver( void ); + virtual UInt32 iterateAllModes( IODisplayModeID * displayModeIDs ); + virtual IOReturn getResInfoForMode( IODisplayModeID modeID, + IODisplayModeInformation * theInfo ); + virtual IOReturn getResInfoForArbMode( IODisplayModeID modeID, + IODisplayModeInformation * theInfo ); + IOReturn getResInfoForDetailed( IODisplayModeID modeID, + VDDetailedTimingRec * detailed, + IODisplayModeInformation * info ); + IOIndex mapDepthIndex( IODisplayModeID modeID, IOIndex depth, bool fromDepthMode ); + virtual IOReturn validateDisplayMode( + IODisplayModeID mode, IOOptionBits flags, + VDDetailedTimingRec ** detailed ); + virtual IOReturn setDetailedTiming( + IODisplayModeID mode, IOOptionBits options, + void * description, IOByteCount descripSize ); + virtual void getCurrentConfiguration( void ); + static const IOTVector * _undefinedSymbolHandler( void * obj, + const char * libraryName, const char * symbolName ); + static bool _videoJackStateChangeHandler( void * target, void * ref, + IOService * newService, IONotifier * notifier ); + static void _avProbeAction( OSObject * p0, IOTimerEventSource * evtSrc ); + void displayI2CPower( bool enable ); + IOReturn ndrvSetPowerState( UInt32 newState ); + IOReturn ndrvUpdatePowerState( void ); + IOReturn ndrvSetDisplayPowerState( UInt32 newState ); + static IOReturn _probeAction( IONDRVFramebuffer * fb, IOOptionBits options ); + bool searchOfflineMode( IODisplayModeID * offlineMode ); + IOReturn processConnectChange( uintptr_t * value ); + IOReturn setMirror( IONDRVFramebuffer * other ); + IOReturn setConnectionFlags( void ); + bool getOnlineState( void ); + IOReturn ndrvGetSetFeature( UInt32 feature, uintptr_t newValue, uintptr_t * currentValue ); + static IOReturn _doControl( IONDRVFramebuffer * fb, UInt32 code, void * params ); + static IOReturn _doStatus( IONDRVFramebuffer * fb, UInt32 code, void * params ); + static IOReturn extControl( OSObject * owner, void * code, void * params ); + static IOReturn extStatus( OSObject * owner, void * code, void * params ); + IOReturn createI2C( void ); + void setInfoProperties( void ); + +public: + virtual IOReturn doControl( UInt32 code, void * params ); + virtual IOReturn doStatus( UInt32 code, void * params ); + +public: + + virtual IOService * probe( IOService * provider, + SInt32 * score ) APPLE_KEXT_OVERRIDE; + + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + + virtual void stop( IOService * provider ) APPLE_KEXT_OVERRIDE; + + virtual void free( void ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn setProperties( OSObject * properties ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn requestProbe( IOOptionBits options ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn enableController( void ) APPLE_KEXT_OVERRIDE; + + virtual IODeviceMemory * makeSubRange( IOPhysicalAddress64 start, + IOPhysicalLength64 length ); + virtual IODeviceMemory * getApertureRange( IOPixelAperture aperture ) APPLE_KEXT_OVERRIDE; + virtual IODeviceMemory * getVRAMRange( void ) APPLE_KEXT_OVERRIDE; + + virtual IODeviceMemory * findVRAM( void ); + + virtual bool isConsoleDevice( void ) APPLE_KEXT_OVERRIDE; + + virtual const IOTVector * undefinedSymbolHandler( const char * libraryName, + const char * symbolName ); + + virtual const char * getPixelFormats( void ) APPLE_KEXT_OVERRIDE; + + // Array of supported display modes + virtual IOItemCount getDisplayModeCount( void ) APPLE_KEXT_OVERRIDE; + virtual IOReturn getDisplayModes( IODisplayModeID * allDisplayModes ) APPLE_KEXT_OVERRIDE; + + // Info about a display mode + virtual IOReturn getInformationForDisplayMode( IODisplayModeID displayMode, + IODisplayModeInformation * info ) APPLE_KEXT_OVERRIDE; + + // Mask of pixel formats available in mode and depth + virtual UInt64 getPixelFormatsForDisplayMode( IODisplayModeID displayMode, + IOIndex depth ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn getPixelInformation( + IODisplayModeID displayMode, IOIndex depth, + IOPixelAperture aperture, IOPixelInformation * pixelInfo ) APPLE_KEXT_OVERRIDE; + + // Framebuffer info + + virtual IOReturn setupForCurrentConfig( void ) APPLE_KEXT_OVERRIDE; + + // Current display mode and depth + virtual IOReturn getCurrentDisplayMode( IODisplayModeID * displayMode, + IOIndex * depth ) APPLE_KEXT_OVERRIDE; + + // Set display mode and depth + virtual IOReturn setDisplayMode( IODisplayModeID displayMode, + IOIndex depth ) APPLE_KEXT_OVERRIDE; + + // For pages + virtual IOReturn setApertureEnable( IOPixelAperture aperture, + IOOptionBits enable ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn setStartupDisplayMode( IODisplayModeID displayMode, + IOIndex depth ) APPLE_KEXT_OVERRIDE; + virtual IOReturn getStartupDisplayMode( IODisplayModeID * displayMode, + IOIndex * depth ) APPLE_KEXT_OVERRIDE; + + //// CLUTs + + virtual IOReturn setCLUTWithEntries( IOColorEntry * colors, UInt32 index, + UInt32 numEntries, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + + //// Gamma + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_13 + virtual IOReturn setGammaTable( UInt32 channelCount, UInt32 dataCount, + UInt32 dataWidth, void * data, bool syncToVBL ) APPLE_KEXT_OVERRIDE; +#endif + + virtual IOReturn setGammaTable( UInt32 channelCount, UInt32 dataCount, + UInt32 dataWidth, void * data ) APPLE_KEXT_OVERRIDE; + + //// Display mode timing information + + virtual IOReturn getTimingInfoForDisplayMode( IODisplayModeID displayMode, + IOTimingInformation * info ) APPLE_KEXT_OVERRIDE; + + //// Detailed timing information + + virtual IOReturn validateDetailedTiming( + void * description, IOByteCount descripSize ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn setDetailedTimings( OSArray * array ) APPLE_KEXT_OVERRIDE; + + //// Controller attributes + + virtual IOReturn setAttribute( IOSelect attribute, uintptr_t value ) APPLE_KEXT_OVERRIDE; + virtual IOReturn getAttribute( IOSelect attribute, uintptr_t * value ) APPLE_KEXT_OVERRIDE; + + //// Connections + + virtual IOItemCount getConnectionCount( void ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn getAttributeForConnection( IOIndex connectIndex, + IOSelect attribute, uintptr_t * value ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn setAttributeForConnection( IOIndex connectIndex, + IOSelect attribute, uintptr_t info ) APPLE_KEXT_OVERRIDE; + + // Apple sensing + + virtual IOReturn getAppleSense( IOIndex connectIndex, + UInt32 * senseType, + UInt32 * primary, + UInt32 * extended, + UInt32 * displayType ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn connectFlags( IOIndex connectIndex, + IODisplayModeID displayMode, IOOptionBits * flags ) APPLE_KEXT_OVERRIDE; + + //// IOHighLevelDDCSense + + virtual bool hasDDCConnect( IOIndex connectIndex ) APPLE_KEXT_OVERRIDE; + virtual IOReturn getDDCBlock( IOIndex connectIndex, UInt32 blockNumber, + IOSelect blockType, IOOptionBits options, + UInt8 * data, IOByteCount * length ) APPLE_KEXT_OVERRIDE; + + //// Interrupts + + virtual IOReturn registerForInterruptType( IOSelect interruptType, + IOFBInterruptProc proc, OSObject * target, void * ref, + void ** interruptRef ) APPLE_KEXT_OVERRIDE; + virtual IOReturn unregisterInterrupt( void * interruptRef ) APPLE_KEXT_OVERRIDE; + virtual IOReturn setInterruptState( void * interruptRef, UInt32 state ) APPLE_KEXT_OVERRIDE; + + //// HW Cursors + + virtual IOReturn setCursorImage( void * cursorImage ) APPLE_KEXT_OVERRIDE; + virtual IOReturn setCursorState( SInt32 x, SInt32 y, bool visible ) APPLE_KEXT_OVERRIDE; + + //// I2C calls + + virtual IOReturn doI2CRequest( UInt32 bus, IOI2CBusTiming * timing, IOI2CRequest * request ) APPLE_KEXT_OVERRIDE; + + //// VSL calls + + static OSStatus VSLNewInterruptService( + void * entryID, + UInt32 serviceType, + _VSLService ** serviceID ); + static OSStatus VSLDisposeInterruptService( _VSLService * serviceID ); + static OSStatus VSLDoInterruptService( _VSLService * serviceID ); + static Boolean VSLPrepareCursorForHardwareCursor( + void * cursorRef, + IOHardwareCursorDescriptor * hwDesc, + IOHardwareCursorInfo * hwCursorInfo ); +}; + +#endif /* ! _IOKIT_IONDRVFRAMEBUFFER_H */ + + diff --git a/QualcommWireless/include/IOKit/ndrvsupport/IONDRVLibraries.h b/QualcommWireless/include/IOKit/ndrvsupport/IONDRVLibraries.h new file mode 100644 index 0000000..3d4b8d3 --- /dev/null +++ b/QualcommWireless/include/IOKit/ndrvsupport/IONDRVLibraries.h @@ -0,0 +1,376 @@ + +#ifndef __IONDRVLIBRARIES__ +#define __IONDRVLIBRARIES__ + +#include +#include +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +/* NameRegistry error codes */ +enum { + nrLockedErr = -2536, + nrNotEnoughMemoryErr = -2537, + nrInvalidNodeErr = -2538, + nrNotFoundErr = -2539, + nrNotCreatedErr = -2540, + nrNameErr = -2541, + nrNotSlotDeviceErr = -2542, + nrDataTruncatedErr = -2543, + nrPowerErr = -2544, + nrPowerSwitchAbortErr = -2545, + nrTypeMismatchErr = -2546, + nrNotModifiedErr = -2547, + nrOverrunErr = -2548, + nrResultCodeBase = -2549, + nrPathNotFound = -2550, /* a path component lookup failed */ + nrPathBufferTooSmall = -2551, /* buffer for path is too small */ + nrInvalidEntryIterationOp = -2552, /* invalid entry iteration operation */ + nrPropertyAlreadyExists = -2553, /* property already exists */ + nrIterationDone = -2554, /* iteration operation is done */ + nrExitedIteratorScope = -2555, /* outer scope of iterator was exited */ + nrTransactionAborted = -2556, /* transaction was aborted */ + + gestaltUndefSelectorErr = -5551 /*undefined selector was passed to Gestalt*/ +}; + +enum { + kNVRAMProperty = 0x00000020, // matches NR +}; + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef _IOKIT_IOSERVICE_H +typedef struct IOService IOService; +#endif + +IOReturn _IONDRVLibrariesInitialize( IOService * provider ); +IOReturn _IONDRVLibrariesFinalize( IOService * provider ); + +#ifndef kAAPLRegEntryIDKey +#define kAAPLRegEntryIDKey "AAPL,RegEntryID" +#endif + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/******************************************************************************* + * + * Foundation Types + * + */ +/* Value of a property */ +typedef void * RegPropertyValue; +/* Length of property value */ +typedef UInt32 RegPropertyValueSize; + +/*******************************************************************************/ + +/******************************************************************************* + * + * Root Entry Name Definitions (Applies to all Names in the RootNameSpace) + * + * + Names are a colon-separated list of name components. Name components + * may not themselves contain colons. + * + Names are presented as null-terminated ASCII character strings. + * + Names follow similar parsing rules to Apple file system absolute + * and relative paths. However the '::' parent directory syntax is + * not currently supported. + */ +/* Max length of Entry Name */ +enum { + kRegCStrMaxEntryNameLength = 47 +}; + +/* Entry Names are single byte ASCII */ +typedef char RegCStrEntryName; +typedef char * RegCStrEntryNamePtr; +/* length of RegCStrEntryNameBuf = kRegCStrMaxEntryNameLength+1*/ +typedef char RegCStrEntryNameBuf[48]; +typedef char RegCStrPathName; +typedef UInt32 RegPathNameSize; +enum { + kRegPathNameSeparator = ':', /* 0x3A */ + kRegEntryNameTerminator = 0x00, /* '\0' */ + kRegPathNameTerminator = 0x00 /* '\0' */ +}; + +/******************************************************************************* + * + * Property Name and ID Definitions + * (Applies to all Properties Regardless of NameSpace) + */ +enum { + kRegMaximumPropertyNameLength = 31, /* Max length of Property Name */ + kRegPropertyNameTerminator = 0x00 /* '\0' */ +}; + +typedef char RegPropertyNameBuf[32]; +typedef char RegPropertyName; +typedef char * RegPropertyNamePtr; +enum { + kRegMaxPropertyNameLength = kRegMaximumPropertyNameLength +}; + +/******************************************************************************* + * + * Iteration Operations + * + * These specify direction when traversing the name relationships + */ +typedef UInt32 RegIterationOp; +typedef RegIterationOp RegEntryIterationOp; +enum { + /* Absolute locations*/ + kRegIterRoot = 0x00000002, /* "Upward" Relationships */ + kRegIterParents = 0x00000003, /* include all parent(s) of entry */ + /* "Downward" Relationships*/ + kRegIterChildren = 0x00000004, /* include all children */ + kRegIterSubTrees = 0x00000005, /* include all sub trees of entry */ + kRegIterDescendants = 0x00000005, /* include all descendants of entry */ + /* "Horizontal" Relationships */ + kRegIterSibling = 0x00000006, /* include all siblings */ + /* Keep doing the same thing*/ + kRegIterContinue = 0x00000001 +}; + +/******************************************************************************* + * + * Name Entry and Property Modifiers + * + * + * + * Modifiers describe special characteristics of names + * and properties. Modifiers might be supported for + * some names and not others. + * + * Device Drivers should not rely on functionality + * specified as a modifier. + */ +typedef UInt32 RegModifiers; +typedef RegModifiers RegEntryModifiers; +typedef RegModifiers RegPropertyModifiers; +enum { + kRegNoModifiers = 0x00000000, /* no entry modifiers in place */ + kRegUniversalModifierMask = 0x0000FFFF, /* mods to all entries */ + kRegNameSpaceModifierMask = 0x00FF0000, /* mods to all entries within namespace */ + kRegModifierMask = (RegModifiers)0xFF000000 /* mods to just this entry */ +}; + +/* Universal Property Modifiers */ +enum { + kRegPropertyValueIsSavedToNVRAM = 0x00000020, /* property is non-volatile (saved in NVRAM) */ + kRegPropertyValueIsSavedToDisk = 0x00000040 /* property is non-volatile (saved on disk) */ +}; + +typedef size_t Size; + +#ifndef _IOKIT_IOREGISTRYENTRY_H +typedef struct IORegistryIterator IORegistryIterator; +typedef struct OSIterator OSIterator; +#endif /* _IOKIT_IOREGISTRYENTRY_H */ +typedef IORegistryIterator * RegEntryIter; +typedef OSIterator * RegPropertyIter; + +OSStatus RegistryEntryIDCopy( const RegEntryID * entryID, RegEntryID * to ); + +OSStatus RegistryEntryIDInit( RegEntryID * entryID ); + +Boolean RegistryEntryIDCompare( const RegEntryID * id1, const RegEntryID * id2); + +OSStatus RegistryPropertyGetSize( + const RegEntryID * entryID, + const RegPropertyName * propertyName, + RegPropertyValueSize * propertySize); + +OSStatus RegistryPropertyGet( + const RegEntryID * entryID, + const RegPropertyName * propertyName, + void * propertyValue, + RegPropertyValueSize * propertySize); + +OSStatus RegistryPropertyCreate( + const RegEntryID * entryID, + const RegPropertyName * propertyName, + const void * propertyValue, + RegPropertyValueSize propertySize); + +OSStatus RegistryPropertyDelete( + const RegEntryID * entryID, + const RegPropertyName * propertyName); + +OSStatus RegistryPropertySet( + const RegEntryID * entryID, + const RegPropertyName * propertyName, + const void * propertyValue, + RegPropertyValueSize propertySize); + +OSStatus RegistryPropertyGetMod( + const RegEntryID * entry, + const RegPropertyName * name, + RegPropertyModifiers * modifiers); + +OSStatus RegistryPropertySetMod( + const RegEntryID * entry, + const RegPropertyName * name, + RegPropertyModifiers modifiers); + +OSStatus RegistryPropertyIterateCreate( + const RegEntryID * entry, + RegPropertyIter * cookie); + +OSStatus RegistryPropertyIterateDispose( RegPropertyIter * cookie); + +OSStatus RegistryPropertyIterate( + RegPropertyIter * cookie, + RegPropertyName * foundProperty, + Boolean * done); + +OSStatus RegistryEntryIterateCreate( RegEntryIter * cookie); + +OSStatus RegistryEntryIterateDispose( RegEntryIter * cookie); + +OSStatus RegistryEntryIterate( RegEntryIter * cookie, + RegEntryIterationOp relationship, + RegEntryID * foundEntry, + Boolean * done); + +OSStatus RegistryCStrEntryToName( const RegEntryID * entryID, + RegEntryID * parentEntry, + RegCStrEntryName * nameComponent, + Boolean * done ); + +OSStatus RegistryCStrEntryLookup( const RegEntryID * parentEntry, + const RegCStrPathName * path, + RegEntryID * newEntry); + +OSStatus RegistryEntryIDDispose(RegEntryID * entryID); + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +enum { + paramErr = -50, /*error in user parameter list*/ + noHardwareErr = -200, /*Sound Manager Error Returns*/ + notEnoughHardwareErr = -201, /*Sound Manager Error Returns*/ + userCanceledErr = -128, + qErr = -1, /*queue element not found during deletion*/ + vTypErr = -2, /*invalid queue element*/ + corErr = -3, /*core routine number out of range*/ + unimpErr = -4, /*unimplemented core routine*/ + SlpTypeErr = -5, /*invalid queue element*/ + seNoDB = -8, /*no debugger installed to handle debugger command*/ + controlErr = -17, /*I/O System Errors*/ + statusErr = -18, /*I/O System Errors*/ + readErr = -19, /*I/O System Errors*/ + writErr = -20, /*I/O System Errors*/ + badUnitErr = -21, /*I/O System Errors*/ + unitEmptyErr = -22, /*I/O System Errors*/ + openErr = -23, /*I/O System Errors*/ + closErr = -24, /*I/O System Errors*/ + dRemovErr = -25, /*tried to remove an open driver*/ + dInstErr = -26, /*DrvrInstall couldn't find driver in resources*/ + + badCksmErr = -69, /*addr mark checksum didn't check*/ +}; +enum { + durationMicrosecond = -1, /* Microseconds are negative*/ + durationMillisecond = 1, /* Milliseconds are positive*/ + durationSecond = 1000, /* 1000 * durationMillisecond*/ + durationMinute = 60000, /* 60 * durationSecond,*/ + durationHour = 3600000, /* 60 * durationMinute,*/ + durationDay = 86400000, /* 24 * durationHour,*/ + durationNoWait = 0, /* don't block*/ + durationForever = 0x7FFFFFFF /* no time limit*/ +}; +#ifndef NULL + #if !defined(__cplusplus) && (defined(__SC__) || defined(THINK_C)) + /* Symantec C compilers (but not C++) want NULL and nil to be (void*)0 */ + #define NULL ((void *) 0) + #else + /* in case int is 16-bits, make sure NULL is 32-bits */ + #define NULL 0L + #endif +#endif + +#ifndef nil + #define nil NULL +#endif + +enum { + clutType = 0, /*0 if lookup table*/ + fixedType = 1, /*1 if fixed table*/ + directType = 2, /*2 if direct values*/ + RGBDirect = 16 /* 16 & 32 bits/pixel pixelType value */ +}; +typedef UInt32 * UInt32Ptr; + +typedef struct IOHardwareCursorDescriptor HardwareCursorDescriptorRec; +typedef HardwareCursorDescriptorRec * HardwareCursorDescriptorPtr; +typedef struct IOHardwareCursorInfo HardwareCursorInfoRec; +typedef HardwareCursorInfoRec * HardwareCursorInfoPtr; + +typedef ResType InterruptServiceType; +typedef struct _VSLService * InterruptServiceIDType; +typedef InterruptServiceIDType * InterruptServiceIDPtr; + +enum { + kVBLInterruptServiceType = 'vbl ', + kHBLInterruptServiceType = 'hbl ', + kFrameInterruptServiceType = 'fram', + kConnectInterruptServiceType = 'dci ', /* Renamed -- Use kFBCheckInterruptServiceType*/ + kFBConnectInterruptServiceType = kConnectInterruptServiceType, /* Demand to check configuration (Hardware unchanged)*/ + kFBChangedInterruptServiceType = 'chng', /* Demand to rebuild (Hardware has reinitialized on dependent change)*/ + kFBOfflineInterruptServiceType = 'remv', /* Demand to remove framebuffer (Hardware not available on dependent change -- but must not buserror)*/ + kFBOnlineInterruptServiceType = 'add ' /* Notice that hardware is available (after being removed)*/ +}; + +enum { + kVSLClamshellStateGestaltType = 'clam', +}; + +OSErr +VSLNewInterruptService( + RegEntryID * serviceDevice, + InterruptServiceType serviceType, + InterruptServiceIDPtr serviceID); + +OSErr +VSLDisposeInterruptService(InterruptServiceIDType serviceID); + +OSErr +VSLDoInterruptService(InterruptServiceIDType serviceID); + +Boolean +VSLPrepareCursorForHardwareCursor( + void * cursorRef, + IOHardwareCursorDescriptor * hardwareDescriptor, + IOHardwareCursorInfo * hwCursorInfo); + + +enum { + /* Version Release Stage Codes */ + developStage = 0x20, + alphaStage = 0x40, + betaStage = 0x60, + finalStage = 0x80 +}; + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +typedef struct OpaqueIOCommandID* IOCommandID; + +typedef UInt32 IOCommandKind; +typedef UInt32 IOCommandCode; + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifdef __cplusplus +} +#endif + +#endif /* __IONDRVLIBRARIES__ */ + diff --git a/QualcommWireless/include/IOKit/ndrvsupport/IONDRVSupport.h b/QualcommWireless/include/IOKit/ndrvsupport/IONDRVSupport.h new file mode 100644 index 0000000..f2702bc --- /dev/null +++ b/QualcommWireless/include/IOKit/ndrvsupport/IONDRVSupport.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef __IONDRVSUPPORT__ +#define __IONDRVSUPPORT__ + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +#define kIONDRVIgnoreKey "AAPL,iokit-ignore-ndrv" +#define kIONDRVForXKey "AAPL,iokit-ndrv" + + +struct IOTVector { + void * pc; + UInt32 toc; +}; +typedef struct IOTVector IOTVector; + +#ifdef __cplusplus +} +#endif + +#endif /* __IONDRVSUPPORT__ */ diff --git a/QualcommWireless/include/IOKit/network/IOBasicOutputQueue.h b/QualcommWireless/include/IOKit/network/IOBasicOutputQueue.h new file mode 100644 index 0000000..f568224 --- /dev/null +++ b/QualcommWireless/include/IOKit/network/IOBasicOutputQueue.h @@ -0,0 +1,354 @@ +/* + * Copyright (c) 1998-2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOBASICOUTPUTQUEUE_H +#define _IOBASICOUTPUTQUEUE_H + +#include +#include +#include + +struct IOMbufQueue; + +/*! @class IOBasicOutputQueue + @abstract A concrete implementation of an IOOutputQueue. + @discussion This object uses a mutex to protect the packet queue from + multiple producers. + A single producer is promoted to become a consumer when the queue is + not active. Otherwise, the producer will simply queue the packet and + return without blocking. + + The flow of packets from the queue to its target can be controlled + by calling methods such as start(), stop(), or service(). The target + is expected to call those methods from a single threaded context, + i.e. the work loop context in a network driver. In addition, the + target must also return a status for every packet delivered by the + consumer thread. This return value is the only mechanism that the + target can use to manage the queue when it is running on the + consumer thread. +*/ + +class IOBasicOutputQueue : public IOOutputQueue +{ + OSDeclareDefaultStructors( IOBasicOutputQueue ) + +private: + static IOReturn dispatchNetworkDataNotification(void * target, + void * param, + IONetworkData * data, + UInt32 type); + + void dequeue(); + +protected: + OSObject * _target; + IOOutputAction _action; + UInt32 _priorities; + IOOutputQueueStats * _stats; + IONetworkData * _statsData; + IOLock * _queueLock; + IOMbufQueue * _inQueues; + IOMbufQueue * _primaryQueues; + IOMbufQueue * _shadowQueues; + volatile bool _waitDequeueDone; + volatile UInt32 _state; + volatile UInt32 _serviceCount; + +/*! @function serviceThread + @abstract Provides an implementation for the serviceThread() method + defined in IOOutputQueue. + @discussion This method is called by the scheduled service thread when it + starts to run. The service thread is scheduled by service() + to restart a stalled queue when the kServiceAsync option is given. + @param param A parameter that was given to scheduleServiceThread(). + This parameter is not used. +*/ + + virtual void serviceThread(void * param) APPLE_KEXT_OVERRIDE; + +/*! @function output + @abstract Transfers all packets in the mbuf queue to the target. + @param queue A queue of output packets. + @param state Returns a state bit defined by IOBasicOutputQueue that + declares the new state of the queue following this method call. + A kStateStalled is returned if the queue should stall, otherwise 0 + is returned. +*/ + + virtual void output(IOMbufQueue * queue, UInt32 * state); + +/*! @function free + @abstract Frees the IOBasicOutputQueue object. + @discussion This function releases allocated resources, then call super::free(). +*/ + + virtual void free() APPLE_KEXT_OVERRIDE; + +/*! @function handleNetworkDataAccess + @abstract Handles an external access to the IONetworkData object + returned by getStatisticsData(). + @param data The IONetworkData object being accessed. + @param type Description of the type of access being performed. + @param param An optional parameter for the handler. + @result Returns kIOReturnSuccess on success, or an error code otherwise. +*/ + + virtual IOReturn handleNetworkDataAccess(IONetworkData * data, + UInt32 type, + void * param); + +public: + +/*! @function init + @abstract Initializes an IOBasicOutputQueue object. + @param target The object that will handle packets removed from the + queue, which is usually a subclass of IONetworkController. + @param action The function that will handle packets removed from the + queue. + @param capacity The initial capacity of the output queue. + @result Returns true if initialized successfully, false otherwise. +*/ + + virtual bool init(OSObject * target, + IOOutputAction action, + UInt32 capacity = 0, + UInt32 priorities = 1); + +/*! @function withTarget + @abstract Factory method that constructs and initializes an + IOBasicOutputQueue object. + @param target An IONetworkController object that will handle packets + removed from the queue. + @param capacity The initial capacity of the output queue. + @result Returns an IOBasicOutputQueue object on success, or 0 otherwise. +*/ + + static IOBasicOutputQueue * withTarget(IONetworkController * target, + UInt32 capacity = 0); + + /*! @function withTarget + @abstract Factory method that constructs and initializes an + IOBasicOutputQueue object. + @param target An IONetworkController object that will handle packets + removed from the queue. + @param capacity The initial capacity of the output queue. + @param priorities The number of traffic priorities supported + @result Returns an IOBasicOutputQueue object on success, or 0 otherwise. + */ + + static IOBasicOutputQueue * withTarget(IONetworkController * target, + UInt32 capacity, + UInt32 priorities); + +/*! @function withTarget + @abstract Factory method that constructs and initializes an + IOBasicOutputQueue object. + @param target The object that will handle packets removed from the + queue. + @param action The function that will handle packets removed from the + queue. + @param capacity The initial capacity of the output queue. + @result Returns an IOBasicOutputQueue object on success, or 0 otherwise. +*/ + + static IOBasicOutputQueue * withTarget(OSObject * target, + IOOutputAction action, + UInt32 capacity = 0); + + /*! @function withTarget + @abstract Factory method that constructs and initializes an + IOBasicOutputQueue object. + @param target The object that will handle packets removed from the + queue. + @param action The function that will handle packets removed from the + queue. + @param capacity The initial capacity of the output queue. + @param priorities The number of traffic priorities supported + @result Returns an IOBasicOutputQueue object on success, or 0 otherwise. + */ + + static IOBasicOutputQueue * withTarget(OSObject * target, + IOOutputAction action, + UInt32 capacity, + UInt32 priorities); + +/*! @function enqueue + @abstract Adds a packet, or a chain of packets, + to the queue. + @discussion This method is called by a client to add a packet, or a chain of packets, + to the queue. A packet is described by an mbuf chain, while a chain + of packets is constructed by linking multiple mbuf chains via the + m_nextpkt field. This method can be called by multiple client + threads. + @param m A single packet, or a chain of packets. + @param param A parameter provided by the caller. + @result Always returns 0. +*/ + + virtual UInt32 enqueue(mbuf_t m, void * param) APPLE_KEXT_OVERRIDE; + +/*! @function start + @abstract Starts up the packet flow between the queue and its target. + @discussion Called by the target to start the queue. This will allow + packets to be removed from the queue, and then delivered to the target. + @result Returns true if the queue was started successfully, false otherwise. */ + + virtual bool start() APPLE_KEXT_OVERRIDE; + +/*! @function stop + @abstract Stops the packet flow between the queue and its target. + @discussion This method stops the queue and prevents it from sending packets to its + target. This call is synchronous and it may block. After this method + returns, the queue will no longer call the registered target/action, + even as new packets are added to the queue. The queue will continue to + absorb new packets until the size of the queue reaches its capacity. + The registered action must never call stop(), or a deadlock will occur. + @result Returns the previous running state of the queue, + true if the queue was running, false if the queue was already stopped. +*/ + + virtual bool stop() APPLE_KEXT_OVERRIDE; + +/*! @enum ServiceAsync + @abstract The option bits recognized by service(). + @constant kServiceAsync Set this option to service the queue in + an asynchronous manner. The service() call will not block, but a + scheduling latency will be introduced before the queue is serviced. +*/ + + enum { + kServiceAsync = 0x1 + }; + +/*! @function service + @abstract Services a queue that was stalled by the target. + @discussion A target that stalls the queue must call service() when + it becomes ready to accept more packets. Calling this method when the + queue is not stalled is harmless. + @result Returns true if the queue was stalled and there were packets sitting in + the queue awaiting delivery, false otherwise. +*/ + + virtual bool service(IOOptionBits options = 0) APPLE_KEXT_OVERRIDE; + +/*! @function flush + @abstract Drops and frees all packets currently held by the queue. + @discussion To ensure that all packets are removed from the queue, + stop() should be called prior to flush(), to make sure there are + no packets in-flight and being delivered to the target. + @result Returns the number of packets that were dropped and freed. +*/ + + virtual UInt32 flush() APPLE_KEXT_OVERRIDE; + +/*! @function setCapacity + @abstract Changes the number of packets that the queue can hold + before it begins to drop excess packets. + @param capacity The new desired capacity. + @result Returns true if the new capacity was accepted, false otherwise. +*/ + + virtual bool setCapacity(UInt32 capacity) APPLE_KEXT_OVERRIDE; + +/*! @function getCapacity + @abstract Gets the number of packets that the queue can hold. + @discussion The queue will begin to drop incoming packets when the + size of the queue reaches its capacity. + @result Returns the current queue capacity. +*/ + + virtual UInt32 getCapacity() const APPLE_KEXT_OVERRIDE; + +/*! @function getSize + @abstract Gets the number of packets currently held in the queue. + @result Returns the size of the queue. +*/ + + virtual UInt32 getSize() const APPLE_KEXT_OVERRIDE; + +/*! @function getDropCount + @abstract Gets the number of packets dropped by the queue. + @result Returns the number of packets dropped due to over-capacity, or by + external calls to the flush() method. +*/ + + virtual UInt32 getDropCount(); + +/*! @function getOutputCount + @abstract Gets the number of packets accepted by the target. + @result Returns the number of times that kIOOutputStatusAccepted is returned by + the target. +*/ + + virtual UInt32 getOutputCount(); + +/*! @function getRetryCount + @abstract Gets the number of instances when the target has refused to + accept the packet provided. + @result Returns the number of times that kIOOutputStatusRetry is returned by the + target. +*/ + + virtual UInt32 getRetryCount(); + +/*! @function getStallCount + @abstract Gets the number of instances when the target has stalled the + queue. + @result Returns the number of times that kIOOutputCommandStall is returned by the + target. +*/ + + virtual UInt32 getStallCount(); + +/*! @enum GetStateBits + @abstract The bits in the value returned by getState(). + @constant kStateRunning Set when the queue is running. Calling start() + and stop() will set or clear this bit. + @constant kStateStalled Set when the queue is stalled by the target. + @constant kStateActive Set when a consumer thread is actively removing + packets from the queue and passing them to the target. +*/ + + enum { + kStateRunning = 0x1, + kStateOutputStalled = 0x2, + kStateOutputActive = 0x4, + kStateOutputServiceMask = 0xff00 + }; + +/*! @function getState + @abstract Gets the state of the queue object. + @result Returns the current state of the queue object. +*/ + + virtual UInt32 getState() const; + +/*! @function getStatisticsData + @abstract Returns an IONetworkData object containing statistics counters + updated by the queue. + @result Returns an IONetworkData object. +*/ + + virtual IONetworkData * getStatisticsData() const APPLE_KEXT_OVERRIDE; +}; + +#endif /* !_IOBASICOUTPUTQUEUE_H */ diff --git a/QualcommWireless/include/IOKit/network/IOEthernetController.h b/QualcommWireless/include/IOKit/network/IOEthernetController.h new file mode 100644 index 0000000..72b4600 --- /dev/null +++ b/QualcommWireless/include/IOKit/network/IOEthernetController.h @@ -0,0 +1,1226 @@ +/* + * Copyright (c) 1998-2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOETHERNETCONTROLLER_H +#define _IOETHERNETCONTROLLER_H + +#include +#include + +#ifndef __MAC_OS_X_VERSION_MIN_REQUIRED +#error "Missing macOS target version" +#endif + +#ifndef APPLE_KEXT_DEPRECATE +#define APPLE_KEXT_DEPRECATE +#endif + +/*! @defined kIOEthernetControllerClass + @abstract kIOEthernetControllerClass is the name of the + IOEthernetController class. */ + +#define kIOEthernetControllerClass "IOEthernetController" + +/*! @defined kIOEthernetAddressSize + @abstract The number of bytes in an Ethernet hardware address. */ + +#define kIOEthernetAddressSize 6 + +/*! @defined kIOEthernetMaxPacketSize + @abstract The maximum size of an Ethernet packet, including + the FCS bytes. */ + +#define kIOEthernetMaxPacketSize 1518 + +/*! @defined kIOEthernetMinPacketSize + @abstract The minimum size of an Ethernet packet, including + the FCS bytes. */ + +#define kIOEthernetMinPacketSize 64 + +/*! @defined kIOEthernetCRCSize + @abstract The size in bytes of the 32-bit CRC value appended + to the end of each Ethernet frame. */ + +#define kIOEthernetCRCSize 4 + +/*! @defined kIOEthernetWakeOnLANFilterGroup + @abstract kIOEthernetWakeOnLANFilterGroup describes the name assigned + to the Ethernet Wake-On-LAN filter group. This group represents + wake filters that are supported by the controller. */ + +#define kIOEthernetWakeOnLANFilterGroup "IOEthernetWakeOnLANFilterGroup" + +/*! @defined kIOEthernetDisabledWakeOnLANFilterGroup + @abstract kIOEthernetDisabledWakeOnLANFilterGroup describes the name + assigned to the disabled Ethernet Wake-On-LAN filter group. This + group represents wake filters that are currently disabled. + Membership in this group is dynamic. */ + +#define kIOEthernetDisabledWakeOnLANFilterGroup \ + "IOEthernetDisabledWakeOnLANFilterGroup" + +/*! @enum Wake On LAN Filters + @abstract All filters in the Wake-on-LAN filter group. + @discussion Each filter listed will respond to a network event that + will trigger a system wake-up. + @constant kIOEthernetWakeOnMagicPacket Reception of a Magic Packet. + @constant kIOEthernetWakeOnPacketAddressMatch Reception of a packet + which passes through any of the address filtering mechanisms based + on its destination Ethernet address. This may include unicast, + broadcast, or multicast addresses depending on the current state + and setting of the corresponding packet filters. */ + +enum { + kIOEthernetWakeOnMagicPacket = 0x00000001, + kIOEthernetWakeOnPacketAddressMatch = 0x00000002 +}; + +#ifdef KERNEL +#ifdef __cplusplus + +struct IOEthernetAddress { + UInt8 bytes[kIOEthernetAddressSize]; +}; + +/*! @const gIOEthernetWakeOnLANFilterGroup + @discussion gIOEthernetWakeOnLANFilterGroup is an OSSymbol object + that contains the name of the Ethernet Wake-on-LAN filter group + defined by kIOEthernetWakeOnLANFilterGroup. */ + +extern const OSSymbol * gIOEthernetWakeOnLANFilterGroup; + +/*! @const gIOEthernetDisabledWakeOnLANFilterGroup + @discussion gIOEthernetDisabledWakeOnLANFilterGroup is an OSSymbol object + that contains the name of the disabled Ethernet Wake-on-LAN filter group + defined by kIOEthernetDisabledWakeOnLANFilterGroup. */ + +extern const OSSymbol * gIOEthernetDisabledWakeOnLANFilterGroup; + + +/*! @enum AVB Time Sync Support + @abstract The support that the controller has for Time Sync timestamping. + @discussion A controller can support ingress and egress timestamping of time sync packets + in a number of ways. + @const kIOEthernetControllerAVBTimeSyncSupportNone Controller does not support sending or + receiving packets with ingress and egress timestamping + @const kIOEthernetControllerAVBTimeSyncSupportHardware Controller supports sending and + receiving packets with ingress and egress timestamping and the timestamping is done in hardware + @const kIOEthernetControllerAVBTimeSyncSupportInterrupt Controller supports sending and receiving + packets with ingress and egress timestamping and the timestamping is done in the primary interrupt handler + @const kIOEthernetControllerAVBTimeSyncSupportSoftware Controller supports sending and receiving + packets with ingress and egress timestamping and the timestamping is done in software stack + (secondary interrupt handler or higher) +*/ +typedef enum +{ + kIOEthernetControllerAVBTimeSyncSupportNone, + kIOEthernetControllerAVBTimeSyncSupportHardware, + kIOEthernetControllerAVBTimeSyncSupportInterrupt, + kIOEthernetControllerAVBTimeSyncSupportSoftware, +} IOEthernetControllerAVBTimeSyncSupport; + + +/*! @enum Controller AVB States + @abstract The state the AVB support is in. + @discussion A controller can be in one of 4 states depending on the capabilities required by the AVB stack. + @const kIOEthernetControllerAVBStateDisabled No AVB streaming services or gPTP can run + @const kIOEthernetControllerAVBStateActivated No AVB streaming services and no gPTP but they can be + enabled, no media restrictions + @const kIOEthernetControllerAVBStateTimeSyncEnabled No AVB streaming services, time sync hardware + enabled so that gPTP can run, no media restrictions + @const kIOEthernetControllerAVBStateAVBEnabled AVB streams can run, media restrictions are in place +*/ +typedef enum +{ + kIOEthernetControllerAVBStateDisabled, + kIOEthernetControllerAVBStateActivated, + kIOEthernetControllerAVBStateTimeSyncEnabled, + kIOEthernetControllerAVBStateAVBEnabled, +} IOEthernetControllerAVBState; + +///Events to trigger changes of state +/*! @enum Controller AVB State Events + @abstract Events to trigger the change in AVB state of the controller. + @const kIOEthernetControllerAVBStateEventDisable Disable AVB support + @const kIOEthernetControllerAVBStateEventEnable Enable AVB support + @const kIOEthernetControllerAVBStateEventStartTimeSync Start using Time Sync services. + @const kIOEthernetControllerAVBStateEventStopTimeSync Stop using Time Sync services. + @const kIOEthernetControllerAVBStateEventStartStreaming Start using realtime streaming services. + @const kIOEthernetControllerAVBStateEventStopStreaming Stop using realtime streaming services. +*/ +typedef enum +{ + kIOEthernetControllerAVBStateEventDisable, + kIOEthernetControllerAVBStateEventEnable, + kIOEthernetControllerAVBStateEventStartTimeSync, + kIOEthernetControllerAVBStateEventStopTimeSync, + kIOEthernetControllerAVBStateEventStartStreaming, + kIOEthernetControllerAVBStateEventStopStreaming, +} IOEthernetControllerAVBStateEvent; + + +class IOTimeSyncEthernetInterfaceAdapter; + +/*! @class IOEthernetController + @abstract Abstract superclass for Ethernet controllers. + @discussion Ethernet controller drivers should subclass IOEthernetController, and implement + or override the hardware specific methods to create an Ethernet driver. + An interface object (an IOEthernetInterface instance) must be + instantiated by the driver, through attachInterface(), to connect + the controller driver to the data link layer. +*/ + +class APPLE_KEXT_DEPRECATE IOEthernetController : public IONetworkController +{ + OSDeclareAbstractStructors( IOEthernetController ) + +protected: + struct IOECTSCallbackEntry; + + struct ExpansionData { + IOEthernetControllerAVBTimeSyncSupport fTimeSyncSupport; + bool fRealtimeMulticastAllowed; + + IOMapper *fAVBPacketMapper; + + uint32_t fNumberOfRealtimeTransmitQueues; + uint64_t *fTransmitQueuePacketLatency; + uint64_t *fTransmitQueuePrefetchDelay; + + uint32_t fNumberOfRealtimeReceiveQueues; + + IOEthernetControllerAVBState fAVBControllerState; + int32_t fTimeSyncEnabled; + int32_t fAVBEnabled; + IOLock *fStateLock; + OSArray *fStateChangeNotifiers; + IOLock *fStateChangeNotifiersLock; + + OSArray *fTimeSyncReceiveHandlers; + IOLock *fTimeSyncReceiveHandlersLock; + OSArray *fTimeSyncTransmitHandlers; + IOLock *fTimeSyncTransmitHandlersLock; + uint32_t fNextTimeSyncTransmitCallbackID; + bool fHasTimeSyncTransmitCallbackIDAvailable; + + struct IOECTSCallbackEntry *fTimeSyncTransmitCallbackQueue; + IOLock *fTimeSyncTransmitCallbackQueueLock; + struct IOECTSCallbackEntry *fTimeSyncReceiveCallbackQueue; + IOLock *fTimeSyncReceiveCallbackQueueLock; + + bool fTimeSyncCallbackThreadShouldKeepRunning; + bool fTimeSyncCallbackThreadIsRunning; + thread_t fTimeSyncCallbackThread; + semaphore_t fTimeSyncCallbackStartSemaphore; + semaphore_t fTimeSyncCallbackStopSemaphore; + semaphore_t fTimeSyncCallbackQueueSemaphore; + uint64_t fTimeSyncCallbackTimeoutTime; + + bool fgPTPPresent; + }; + + /*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData * _reserved; + + +public: + +/*! @function initialize + @abstract IOEthernetController class initializer. + @discussion Creates global OSSymbol objects that are used as keys. */ + + static void initialize(); + +/*! @function init + @abstract Initializes an IOEthernetController object. + @param properties A dictionary object containing a property table + associated with this instance. + @result Returns true on success, false otherwise. +*/ + + virtual bool init(OSDictionary * properties) APPLE_KEXT_OVERRIDE; + +/*! @function getPacketFilters + @abstract Gets the set of packet filters supported by the Ethernet + controller in the given filter group. + @discussion The default implementation of the abstract method inherited + from IONetworkController. When the filter group specified is + gIONetworkFilterGroup, then this method will return a value formed by + a bitwise OR of kIOPacketFilterUnicast, kIOPacketFilterBroadcast, + kIOPacketFilterMulticast, kIOPacketFilterPromiscuous. Otherwise, the + return value will be set to zero (0). Subclasses must override this + method if their filtering capability differs from what is reported by + this default implementation. This method is called from the workloop + context, and the result is published to the I/O Kit Registry. + @param group The name of the filter group. + @param filters Pointer to the mask of supported filters returned by + this method. + @result Returns kIOReturnSuccess. Drivers that override this + method must return kIOReturnSuccess to indicate success, or an error + return code otherwise. +*/ + + virtual IOReturn getPacketFilters(const OSSymbol * group, + UInt32 * filters) const APPLE_KEXT_OVERRIDE; + +/*! @function enablePacketFilter + @abstract Enables one of the supported packet filters from the + given filter group. + @discussion The default implementation of the abstract method inherited + from IONetworkController. This method will call setMulticastMode() or + setPromiscuousMode() when the multicast or the promiscuous filter is to be + enabled. Requests to disable the Unicast or Broadcast filters are handled + silently, without informing the subclass. Subclasses can override this + method to change this default behavior, or to extend it to handle + additional filter types or filter groups. This method call is synchronized + by the workloop's gate. + @param group The name of the filter group containing the filter to be + enabled. + @param aFilter The filter to enable. + @param enabledFilters All filters currently enabled by the client. + @param options Optional flags for the enable request. + @result Returns the value returned by setMulticastMode() or setPromiscuousMode() if + either of those two methods are called. Returns kIOReturnSuccess if the filter + specified is kIOPacketFilterUnicast or kIOPacketFilterBroadcast. + Returns kIOReturnUnsupported if the filter group specified is not + gIONetworkFilterGroup. +*/ + + virtual IOReturn enablePacketFilter(const OSSymbol * group, + UInt32 aFilter, + UInt32 enabledFilters, + IOOptionBits options = 0) APPLE_KEXT_OVERRIDE; + +/*! @function disablePacketFilter + @abstract Disables a packet filter that is currently enabled from the + given filter group. + @discussion The default implementation of the abstract method inherited + from IONetworkController. This method will call setMulticastMode() or + setPromiscuousMode() when the multicast or the promiscuous filter is to be + disabled. Requests to disable the Unicast or Broadcast filters are handled + silently, without informing the subclass. Subclasses can override this + method to change this default behavior, or to extend it to handle + additional filter types or filter groups. This method call is synchronized + by the workloop's gate. + @param group The name of the filter group containing the filter to be + disabled. + @param aFilter The filter to disable. + @param enabledFilters All filters currently enabled by the client. + @param options Optional flags for the disable request. + @result Returns the value returned by setMulticastMode() or setPromiscuousMode() if + either of those two methods are called. Returns kIOReturnSuccess if the filter + specified is kIOPacketFilterUnicast or kIOPacketFilterBroadcast. + Returns kIOReturnUnsupported if the filter group specified is not + gIONetworkFilterGroup. +*/ + + virtual IOReturn disablePacketFilter(const OSSymbol * group, + UInt32 aFilter, + UInt32 enabledFilters, + IOOptionBits options = 0) APPLE_KEXT_OVERRIDE; + +/*! @function getHardwareAddress + @abstract Gets the Ethernet controller's station address. + @discussion The default implementation of the abstract method inherited + from IONetworkController. This method will call the overloaded form + IOEthernetController::getHardwareAddress() that subclasses are expected + to override. + @param addr The buffer where the controller's hardware address should + be written. + @param inOutAddrBytes The size of the address buffer provided by the + client, and replaced by this method with the actual size of + the hardware address in bytes. + @result Returns kIOReturnSuccess on success, or an error otherwise. +*/ + + virtual IOReturn getHardwareAddress(void * addr, + UInt32 * inOutAddrBytes) APPLE_KEXT_OVERRIDE; + +/*! @function setHardwareAddress + @abstract Sets or changes the station address used by the Ethernet + controller. + @discussion The default implementation of the abstract method inherited + from IONetworkController. This method will call the overloaded form + IOEthernetController::setHardwareAddress() that subclasses are expected + to override. + @param addr The buffer containing the hardware address provided by + the client. + @param addrBytes The size of the address buffer provided by the + client in bytes. + @result Returns kIOReturnSuccess on success, or an error otherwise. +*/ + + virtual IOReturn setHardwareAddress(const void * addr, + UInt32 addrBytes) APPLE_KEXT_OVERRIDE; + +/*! @function getMaxPacketSize + @abstract Gets the maximum packet size supported by the Ethernet + controller, including the frame header and FCS. + @param maxSize Pointer to the return value. + @result Returns kIOReturnSuccess on success, or an error code otherwise. +*/ + + virtual IOReturn getMaxPacketSize(UInt32 * maxSize) const APPLE_KEXT_OVERRIDE; + +/*! @function getMinPacketSize + @abstract Gets the minimum packet size supported by the Ethernet + controller, including the frame header and FCS. + @param minSize Pointer to the return value. + @result Returns kIOReturnSuccess on success, or an error code otherwise. +*/ + + virtual IOReturn getMinPacketSize(UInt32 * minSize) const APPLE_KEXT_OVERRIDE; + +/*! @function getPacketFilters + @abstract Gets the set of packet filters supported by the Ethernet + controller in the network filter group. + @param filters Pointer to the return value containing a mask of + supported filters. + @result Returns kIOReturnSuccess. Drivers that override this + method must return kIOReturnSuccess to indicate success, or an error + return code otherwise. +*/ + + virtual IOReturn getPacketFilters(UInt32 * filters) const; + +/*! @function getHardwareAddress + @abstract Gets the Ethernet controller's permanent station address. + @discussion Ethernet drivers must implement this method, by reading the + address from hardware and writing it to the buffer provided. This method + is called from the workloop context. + @param addrP Pointer to an IOEthernetAddress where the hardware address + should be returned. + @result Returns kIOReturnSuccess on success, or an error return code otherwise. +*/ + + virtual IOReturn getHardwareAddress(IOEthernetAddress * addrP) = 0; + +/*! @function setHardwareAddress + @abstract Sets or changes the station address used by the Ethernet + controller. + @discussion This method is called in response to a client command to + change the station address used by the Ethernet controller. Implementation + of this method is optional. This method is called from the workloop context. + @param addrP Pointer to an IOEthernetAddress containing the new station + address. + @result The default implementation will always return kIOReturnUnsupported. + If overridden, drivers must return kIOReturnSuccess on success, or an error + return code otherwise. +*/ + + virtual IOReturn setHardwareAddress(const IOEthernetAddress * addrP); + +/*! @function setMulticastMode + @abstract Enables or disables multicast mode. + @discussion Called by enablePacketFilter() or disablePacketFilter() + when there is a change in the activation state of the multicast filter + identified by kIOPacketFilterMulticast. This method is called from the + workloop context. + @param active True to enable multicast mode, false to disable it. + @result Returns kIOReturnUnsupported. If overridden, drivers must return + kIOReturnSuccess on success, or an error return code otherwise. +*/ + + virtual IOReturn setMulticastMode(bool active); + +/*! @function setMulticastList + @abstract Sets the list of multicast addresses a multicast filter + should use to match against the destination address of an incoming frame. + @discussion This method sets the list of multicast addresses that the multicast filter + should use to match against the destination address of an incoming frame. + The frame should be accepted when a match occurs. Called when the multicast group membership of an interface + object is changed. Drivers that support kIOPacketFilterMulticast should + override this method and update the hardware multicast filter using the + list of Ethernet addresses provided. Perfect multicast filtering is + preferred if supported by the hardware, in order to reduce the number of + unwanted packets received. If the number of multicast addresses in the + list exceeds what the hardware is capable of supporting, or if perfect + filtering is not supported, then ideally the hardware should be programmed + to perform imperfect filtering, through some form of hash filtering + mechanism. Only as a last resort should the driver enable reception of + all multicast packets to satisfy this request. This method is called + from the workloop context, and only if the driver reports + kIOPacketFilterMulticast support in getPacketFilters(). + @param addrs An array of Ethernet addresses. This argument must be + ignored if the count argument is 0. + @param count The number of Ethernet addresses in the list. This value + will be zero when the list becomes empty. + @result Returns kIOReturnUnsupported. Drivers must return kIOReturnSuccess to + indicate success, or an error return code otherwise. +*/ + + virtual IOReturn setMulticastList(IOEthernetAddress * addrs, + UInt32 count); + +/*! @function setPromiscuousMode + @abstract Enables or disables promiscuous mode. + @discussion Called by enablePacketFilter() or disablePacketFilter() + when there is a change in the activation state of the promiscuous + filter identified by kIOPacketFilterPromiscuous. This method is + called from the workloop context. + @param active True to enable promiscuous mode, false to disable it. + @result Returns kIOReturnUnsupported. If overridden, drivers must return + kIOReturnSuccess on success, or an error return code otherwise. +*/ + + virtual IOReturn setPromiscuousMode(bool active); + +/*! @function setWakeOnMagicPacket + @abstract Enables or disables the wake on Magic Packet support. + @discussion Called by enablePacketFilter() or disablePacketFilter() + when there is a change in the activation state of the Wake-on-LAN + filter identified by kIOEthernetWakeOnMagicPacket. This method is + called from the workloop context. + @param active True to enable support for system wake on reception + of a Magic Packet, false to disable it. + @result Returns kIOReturnUnsupported. If overridden, drivers must return + kIOReturnSuccess on success, or an error return code otherwise. +*/ + + virtual IOReturn setWakeOnMagicPacket(bool active); + +protected: + +/*! @function createInterface + @abstract Creates an IOEthernetInterface object. + @discussion This method allocates and returns a new IOEthernetInterface instance. + A subclass of IONetworkController must implement this method and return + a matching interface object. The implementation in IOEthernetController + will return an IOEthernetInterface object. Subclasses of + IOEthernetController, such as Ethernet controller drivers, will have + little reason to override this implementation. + @result Returns a newly allocated and initialized IOEthernetInterface object. +*/ + + virtual IONetworkInterface * createInterface() APPLE_KEXT_OVERRIDE; + +/*! @function free + @abstract Frees the IOEthernetController instance. + @discussion This method releases resources, and is + then followed by a call to super::free(). */ + + virtual void free() APPLE_KEXT_OVERRIDE; + +/*! @function publishProperties + @abstract Publishes Ethernet controller properties and capabilities. + @discussion This method publishes Ethernet controller properties to the property + table. For instance, getHardwareAddress() is called to fetch the + hardware address, and the address is then published to the property + table. This method call is synchronized by the workloop's gate, + and must never be called directly by subclasses. + @result Returns true if all properties and capabilities were discovered, + and published successfully, false otherwise. Returning false will + prevent client objects from attaching to the Ethernet controller + since a property that a client relies upon may be missing. +*/ + + virtual bool publishProperties() APPLE_KEXT_OVERRIDE; + + OSMetaClassDeclareReservedUsed( IOEthernetController, 0); + + /*! @function getVlanTagDemand + @abstract Fetch the demand for hardware vlan tag stuffing + for the given packet before it is transmitted on the network. + @discussion A network controller that can insert 802.1Q vlan tags for output + packets must call this method to obtain vlan tag information that it must + insert into the given output packet. + @param m A mbuf containing a packet that may require vlan tag stuffing. + @param vlanTag After calling, the low order 16 bits contain the 802.1Q priority and + vlan ID tag in host order. The hi-order 16 bits are currently unused and should be ignored. + @result true if vlanTag has been set and should be used. + false if no vlan tag stuffing is required for this packet. */ + + virtual bool getVlanTagDemand(mbuf_t m, UInt32 *vlanTag); + + OSMetaClassDeclareReservedUsed( IOEthernetController, 1); + + /*! @function setVlanTag + @abstract Encode a received packet with the vlan tag result reported + by the hardware. + @discussion A network controller that can strip 802.1Q vlan tag information for a + received packet should call this method to encode the result on the + packet, before passing it up towards the protocol stacks. + @param m A mbuf containing a packet that has had its 802.1q vlan tag stripped by + the hardware. + @param vlanTag A value in host order that contains the 802.1q vlan tag and priority + in the low order 16 bits. The hi order word is currently unused and should be set to 0. */ + + virtual void setVlanTag(mbuf_t m, UInt32 vlanTag); + + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 + +public: + + /*! @struct IOEthernetControllerAVBSupport + @abstract Group of capabilities for the AVB/TSN support of the driver and hardware. + @discussion Structure containing the AVB/TSN capabilities of the controller. + @field timeSyncSupport The type of time sync timestamping support the driver provides. + @field numberOfRealtimeTransmitQueues The number of hardware queues available for AVB + traffic transmission. These are queues which support launch timestamps. + @field numberOfRealtimeReceiveQueues The number of hardware queues available for AVB + traffic reception. These are dedicated hardware queues with filtering that send + packets into a provided callback rather than the regular network stack + @field realtimeMulticastIsAllowed The transport layer allows for realtime traffic + to be sent multicast. Ethernet networks typically respond as true, WiFi networks as false. + @field packetMapper The IOMapper to be used for mapping the virtual memory used for packets to + the physical address addresses used by the controller. May be NULL to indicate that it can use + physical addresses from anywhere in the address space. + */ + typedef struct + { + IOEthernetControllerAVBTimeSyncSupport timeSyncSupport; + uint32_t numberOfRealtimeTransmitQueues; + uint32_t numberOfRealtimeReceiveQueues; + bool realtimeMulticastIsAllowed; + IOMapper *packetMapper; + } IOEthernetControllerAVBSupport; + + /*! @function getAVBSupport + @abstract Indicates that AVB streaming is supported and what capabilities it has. + @discussion + @param avbSupport A pointer to an IOEthernetControllerAVBSupport struct to return the capabilities. + @return True if this controller has at least 1 real time transmit queues or at least 1 realtime receive queues + */ + bool getAVBSupport(IOEthernetControllerAVBSupport *avbSupport) const; + +protected: + /*! @function setRealtimeMulticastIsAllowed + @abstract Sets up the realtime multicast allowed in the AVB support information. + @discussion Used by subclasses to set the value returned in the realtimeMulticastIsAllowed + field of the AVB support capabilities. This indicates if the transport allows the realtime + AVB transmit queues to use multicast destination addresses. A transport such as WiFi where + multicast drops to a low transfer rate would typically set this to false. Wired Ethernet + would typically set this to true. The default value of a newly initialized object is true. + @param realtimeMulticastAllowed bool indicating if the transport allows realtime streams to use multicast destination addresses. + */ + void setRealtimeMulticastIsAllowed(bool realtimeMulticastAllowed); + /*! @function setAVBPacketMapper + @abstract Sets up the packet mapper in the AVB support information. + @discussion Used by subclasses to set the value returned in the packetMapper field of the AVB + support capabilities. This is used by the AVB stack to create the memory descriptors used + for transmitting packets by the controller. The packet mapper is retained. + @param packetMapper the IOMapper to be used. + */ + void setAVBPacketMapper(IOMapper *packetMaper); + +#pragma mark Interface State + friend IOTimeSyncEthernetInterfaceAdapter; +public: + /*! @function getControllerAVBState + @abstract Get the current AVB state of the controller. + @discussion The controller transitions through a number of AVB states depending on the + services required by the AVB stack. The state transitions are triggered by a call to + changeAVBControllerState() as the AVB stack transitions into and out of using TimeSync + and/or streaming services + @return The AVB state of the controller. + */ + IOEthernetControllerAVBState getControllerAVBState(void) const; + + /*! @function changeAVBControllerState + @abstract Change the AVB state of the AVB state of the controller. + @discussion Called by the AVB stack to trigger changing of the controller AVB state machine + based on what services the AVB stack requires. + @param event The event to trigger the state machine change. + @return IOReturn code indicating either success or reason for failure. + */ + IOReturn changeAVBControllerState(IOEthernetControllerAVBStateEvent event); + + /*! @typedef avb_state_callback_t + @abstract Callback function for notifying of AVB state changes + @discussion Prototype for the callback function provided to the registerForAVBStateChangeNotifications() + function for calling back to the requestor. + @param context The context pointer that was provided in the call the registerForAVBStateChangeNotifications() + @param newState The new state that the controller is now in. + */ + typedef void (* avb_state_callback_t)(void *context, IOEthernetControllerAVBState oldState, IOEthernetControllerAVBState newState); + + //Allow the AVB stack or other interested drivers to register for notifications in the change of AVB state + /*! @function registerForAVBStateChangeNotifications + @abstract Function to register to receive callbacks whenever the AVB state changes. + @discussion This function registers the callback function and context provided by the caller so that + it can be called when the AVB state of the controller changes. + @param callback A pointer to a callback function + @param context A caller specified pointer sized value that is passed back in the callback function. + @return IOReturn code indicating success or a reason for failure. + */ + IOReturn registerForAVBStateChangeNotifications(avb_state_callback_t callback, void *context); + /*! @function deregisterForAVBStateChangeNotifications + @abstract Function to deregister from receiving callbacks whenever the AVB state changes. + @discussion This function deregisters the callback function and context provided by the caller so that + it will stop being called when the AVB state of the controller changes. The provided values must + match what was previously registered with registerForAVBStateChangeNotifications(). + @param callback A pointer to a callback function. + @param context A caller specified pointer sized value that is passed back in the callback function. + @return IOReturn code indicating success or a reason for failure. + */ + IOReturn deregisterForAVBStateChangeNotifications(avb_state_callback_t callback, void *context); + +protected: + /*! @function setAVBControllerState + @abstract Set the controller to the new AVB state. + @discussion This function is called as part of the changeAVBControllerState() processing and performs + the change to the new state. This function is overriden by subclasses to perform any driver specific + actions (such as enabling or disabling hardware features). Subclasses must call the base implementation + and should be called last. + @param newState The state to which the controller's AVB state machine will be set. + @return IOReturn code indicating success or a reason for failure. + */ + virtual IOReturn setAVBControllerState(IOEthernetControllerAVBState newState); + OSMetaClassDeclareReservedUsed( IOEthernetController, 2); + +#pragma mark AVB Packets and Callbacks +public: +#define kMaxIOEthernetReltimeEntries 4 + + struct IOEthernetAVBPacket; + + /*! @typedef avb_packet_callback_t + @abstract Callback function for handling received realtime or TimeSync packets + @discussion Prototype for the callback function provided to the setRealtimeReceiveQueuePacketHandler(), + addTimeSyncReceivePacketHandler() and addTimeSyncTransmitPacketHandler() functions for calling back to the requestor. + @param context The context pointer that was provided in the call the registerForAVBStateChangeNotifications() + @param packet The packet being received or transmitted. + */ + typedef void (* avb_packet_callback_t)(void *context, struct IOEthernetAVBPacket *packet); + + /*! @struct IOEthernetAVBPacket + @abstract Structure containing an AVB or TimeSync packet. + @discussion Structure containing the metadata for an AVB or TimeSync packet. + @field structVersion The version of the packet structure. The only defined version is version 0 and this field shall be set to 0. + @field numberOfEntries The number of entries in the virtualRanges and physicalRanges fields that contain + valid addresses and lengths. + @field virtualRanges The kernel virtual addresses of the buffer segments that make up the packet. + @field physicalRanges The physical addresses of the mapped buffer segments that make up the packet. + @field packetTimestamp The timestamp of the packet in mach_absolute_time() based time. For AVB realtime + transmit packets this is the launch time of the packet, for AVB realtime receive packets this is + optionally the ingress time of the packet. For TimeSync packets this is the egress time of transmitted + packets or the ingress time of received packets. + @field timestampValid Indicates if the packetTimestamp field contains a valid value. + @field transmittedTimeSyncCallbackRef For transmited egress time stamped packets the callback reference + returned by calling addTimeSyncTransmitPacketHandler(). This is required when calling transmitTimeSyncPacket(). + @field vlanTag The VLAN tag associated with the packet (includes the VLAN ID, Priority Code Point and Drop Eligable Indicator). + This is typically used on receive paths to carry the VLAN tag that was stripped during reception. + @field desc_buffer A field for the allocator to keep track of the buffer for memory management purposes. Use is allocator defined. + @field desc_dma A field for the allocator to keep track of the DMA. Use is allocator defined. + @field completion_context A pointer value for use in the completion callback + @field completion_callback A callback function called by completeAVBPacket() to return the packet to the allocator when use is completed. + */ + typedef struct IOEthernetAVBPacket + { + int structVersion; + int numberOfEntries; + IOVirtualRange virtualRanges[kMaxIOEthernetReltimeEntries]; + IOPhysicalRange physicalRanges[kMaxIOEthernetReltimeEntries]; + uint64_t packetTimestamp; + bool timestampValid; + uint32_t transmittedTimeSyncCallbackRef; + + uint16_t vlanTag; + + void *desc_buffer; + void *desc_dma; + void *completion_context; + avb_packet_callback_t completion_callback; + + void *reservedAVBStack; + void *reservedFamily; + } IOEthernetAVBPacket; + + /*! @function completeAVBPacket + @abstract Call the packet's completion callback to hand the packet back to the allocator of the packet for reuse or destruction. + @discussion The completeAVBPacket function is called to provide the packet back to the allocator (or its delegate function). + This is called by the owner of the IOEthernetAVBPacket when they have finished using it. + @param packet The packet to be returned. + */ + void completeAVBPacket(IOEthernetAVBPacket *packet); + + /*! @function allocateAVBPacket + @abstract Allocate a packet from the AVB packet pool. + @discussion Provide a packet from the AVB packet pool. The packet must eventually be returned by a call to completeAVBPacket(). + Packets allocated by this call will have one segment (numberOfEntries = 1) with a 2000 byte length. The caller must set the + virtual and physical range lengths to the amount of data actually used for the packet. + @param fromRealtimePool If true pull the packet from the pre-allocated realtime pool, if false then allocate a new packet. + @result The allocated packet. May return NULL if the pool is out of packets. + */ + IOEthernetAVBPacket *allocateAVBPacket(bool fromRealtimePool); + + +private: + static void allocatedAVBPacketCompletion(void *context, IOEthernetAVBPacket *packet); + void realtimePoolAVBPacketCompletion(IOEthernetAVBPacket *packet); + + +#pragma mark Realtime Transmit +public: + /*! @function getTransmitQueuePacketLatency + @abstract Get the minimum amount of time required between when transmitRealtimePacket() is called and the launch timestamp. + @discussion Get the packet latency, the minimum amount of time needed between when a packet is given to + transmitRealtimePacket() and the launchTime when it is sent. This includes any prefetch delay (where the NIC fetches + the data at most that amount of time before the launch time) and any descriptor setup time. + @param queueIndex index of the realtime transmit queue. + @return The number of mach_absolute_time ticks. + */ + uint64_t getTransmitQueuePacketLatency(uint32_t queueIndex) const; + + /*! @function getTransmitQueuePrefetchDelay + @abstract Get the maximum amount of time required between when NIC will DMA the packet contents and the launch timestamp. + @discussion Get the prefetch delay, the maximum amount of time between when the NIC will DMA the packet contents and + the launchTime when it is sent. + @param queueIndex index of the realtime transmit queue. + @return The number of mach_absolute_time ticks. + */ + uint64_t getTransmitQueuePrefetchDelay(uint32_t queueIndex) const; + + /*! @function transmitRealtimePacket + @abstract Transmit an AVB packet on a realtime transmit queue. + @discussion Queues an AVB packet onto one of the controllers realtime transmit queues. + @param queueIndex index of the realtime transmit queue. + @param packets Array of the AVB packets to transmit. + @param packetCount The number of AVB packets in the packets array. + @param commonTimestamp All of the packets in the packets array share the same timestamp and the timestamp from the first packet + should be used for scheduling all of the packets if needed by the hardware. + @param successfulPacketCount The number of packets that were sucessfully added to the transmit queue. + @return IOReturn indicating success or reason for failure. + */ + virtual IOReturn transmitRealtimePackets(uint32_t queueIndex, IOEthernetAVBPacket **packets, uint32_t packetCount, bool commonTimestamp, uint32_t *successfulPacketCount); + OSMetaClassDeclareReservedUsed( IOEthernetController, 3); + + //Clean up the realtime transmit queue (free up anything that has already been processed by the NIC) + /*! @function cleanupTransmitQueue + @abstract Cleanup the realtime transmit queue synchronously with AVB adding frames. + @discussion This function performs necessary cleanup of the realtime transmit queue (cleaning through transmit + descriptors) to free up space in the queue without needing to handle an interrupt. This is called from a + realtime (priority 97) thread and care should be taken about use of locks and memory allocation/deallocation. + @param queueIndex index of the realtime transmit queue. + @return IOReturn indicating success or reason for failure. + */ + virtual IOReturn cleanupTransmitQueue(uint32_t queueIndex); + OSMetaClassDeclareReservedUsed( IOEthernetController, 4); + +protected: + /*! @function setNumberOfRealtimeTransmitQueues + @abstract Sets up the realtime transmit queue count in the AVB support information. + @discussion Used by subclasses to set the value returned in the numberOfRealtimeTransmitQueues field of the AVB + support capabilities. It also initializes internal data structures to contain enough space for keeping track + of realtime transmit queue information (such as the packet latency). + @param numberOfTransmitQueues The number of transmit queues. + */ + void setNumberOfRealtimeTransmitQueues(uint32_t numberOfTransmitQueues); + /*! @function setTransmitQueuePacketLatency + @abstract Set the value returned by getTransmitQueuePacketLatency() for a given queue. + @discussion Stores the value of the minimum packet latency for a given queue. See getTransmitQueuePacketLatency for more details. + @param queueIndex index of the realtime transmit queue. + @param packetLatency The packet latency for the queue. + */ + void setTransmitQueuePacketLatency(uint32_t queueIndex, uint64_t packetLatency); + + /*! @function setTransmitQueuePrefetchDelay + @abstract Set the value returned by getTransmitQueuePrefetchDelay() for a given queue. + @discussion Stores the value of the maximum prefetch delay for a given queue. See getTransmitQueuePrefetchDelay for more details. + @param queueIndex index of the realtime transmit queue. + @param PrefetchDelay The prefetch delay for the queue. + */ + void setTransmitQueuePrefetchDelay(uint32_t queueIndex, uint64_t prefetchDelay); + +#pragma mark Realtime Receive +public: + /*! @enum Filter element types + @abstract The type of the filter element described in an IOEthernetAVBIngressFilterElement struct. + @const IOEthernetAVBIngressFilterTypeDestinationMAC Match a specific destination MAC address. Uses the destinationMAC field of the filter union. + @const IOEthernetAVBIngressFilterTypeEtherTypeVLANTag Match a specific EtherType and VLAN Tag (Priority Code Point + VLAN ID). Uses the etherTypeVLANTag field of the filter union. + @const IOEthernetAVBIngressFilterTypeUDPv4Port Match a specific UDPv4 source and/or destination port. Uses the udpPort field of the filter union. + @const IOEthernetAVBIngressFilterTypeUDPv6Port Match a specific UDPv6 source and/or destination port. Uses the udpPort field of the filter union. + @const IOEthernetAVBIngressFilterTypeIPv4Tuple Match a specific IPv4 tuple (source address, destination address, source port, destination port and protocol). Uses the ipv4Tuple field of the filter union. + @const IOEthernetAVBIngressFilterTypeIPv6Tuple Match a specific IPv6 tuple (source address, destination address, source port, destination port and protocol). Uses the ipv6Tuple field of the filter union. + @const IOEthernetAVBIngressFilterTypeMPLSLabel Match a specific MPLS Label. Uses the mplsLabel field of the filter union. + @const IOEthernetAVBIngressFilterTypeByteMatch Match an aribitrary byte range up to 128 bytes long. Uses the byteMatch field of the filter union. + @const IOEthernetAVBIngressFilterTypeCompound Provide an AND of more filter terms (takes each of the sub filters and ANDs together the results). Uses the compound field of the filter union. + */ + typedef enum + { + IOEthernetAVBIngressFilterTypeDestinationMAC, + IOEthernetAVBIngressFilterTypeEtherTypeVLANTag, + IOEthernetAVBIngressFilterTypeUDPv4Port, + IOEthernetAVBIngressFilterTypeUDPv6Port, + IOEthernetAVBIngressFilterTypeIPv4Tuple, + IOEthernetAVBIngressFilterTypeIPv6Tuple, + IOEthernetAVBIngressFilterTypeMPLSLabel, + IOEthernetAVBIngressFilterTypeByteMatch, + IOEthernetAVBIngressFilterTypeCompound, + } IOEthernetAVBIngressFilterType; + + /*! @enum Filter IP tuple protocol types + @abstract The protocl that the IPv4 or IPv6 tuple match applies to. + @const IOEthernetAVBIngressFilterProtocolTCP A TCP packet. + @const IOEthernetAVBIngressFilterProtocolUDP A UDP packet. + @const IOEthernetAVBIngressFilterProtocolSCTP An SCTP packet. + @const IOEthernetAVBIngressFilterProtocolICMP An ICMP packet. + */ + typedef enum + { + IOEthernetAVBIngressFilterProtocolTCP, + IOEthernetAVBIngressFilterProtocolUDP, + IOEthernetAVBIngressFilterProtocolSCTP, + IOEthernetAVBIngressFilterProtocolICMP + } IOEthernetAVBIngressFilterProtocol; + + /*! @struct IOEthernetAVBRealtimeIngressFilterElement + @abstract One element in realtime receive queue ingress filter used to configure the hardware + to send the packet to the specified receive queue. + @discussion One element in realtime receive queue ingress filter used to configure the hardware + to send the packet to the specified receive queue. + + For IOEthernetAVBRealtimeIngressFilterTypeEtherTypeVLANTag the element is applied as + (etherTypeVLANTag.etherType == (packet.etherType & etherTypeVLANTag.etherTypeMask)) && (etherTypeVLANTag.vlanTag == (packet.vlanTag & etherTypeVLANTag.vlanTagMask)) + For IOEthernetAVBRealtimeIngressFilterTypeUDPv4Port or IOEthernetAVBRealtimeIngressFilterTypeUDPv6Port the element is applied as + (udpPort.sourcePort == (packet.sourcePort & udpPort.sourcePortMask)) && (udpPort.destinationPort == (packet.destinationPort & udpPort.destinationPortMask)) + @field filterType The type of filter being added, defines which member of the union (filter) is used + @field filter The union of all possible filter type fields. + + @field destinationMAC The struct containing matching parameters for an IOEthernetAVBIngressFilterTypeDestinationMAC filter element. + @field etherTypeVLANTag The struct containing matching parameters for an IOEthernetAVBIngressFilterTypeEtherTypeVLANTag fiter element. + @field udpPort The struct containing matching parameters for an IOEthernetAVBIngressFilterTypeUDPv4Port or IOEthernetAVBIngressFilterTypeUDPv6Port filter element. + @field ipv4Tuple The struct containing matching parameters for an IOEthernetAVBIngressFilterTypeIPv4Tuple filter element. + @field ipv6Tuple The struct containing matching parameters for an IOEthernetAVBIngressFilterTypeIPv6Tuple filter element. + @field mplsLabel The struct containing matching parameters for an IOEthernetAVBIngressFilterTypeMPLSLabel filter element. + @field byteMatch The struct containing matching parameters for an IOEthernetAVBIngressFilterTypeByteMatch filter element. + @field compound The struct containing matching parameters for an IOEthernetAVBIngressFilterTypeCompound filter element. + + @field macAddress The MAC address to match. + @field macAddressMask The mask to apply to the destination MAC address of the packet to compare to the macAddress field. + + @field etherType The EtherType to match to send to the queue. + @field etherTypeMask The mask to apply to the EtherType of the packet to compare to the etherType field. + @field vlanTag The VLAN Tag (PCP and VID) to match to send to the queue. + @field vlanTagMask The mask to apply to the VLAN tag of the packet to compare to the vlanTag field. + + @field sourcePort The source port to match. + @field sourcePortMask The mask to apply to the source port of the packet to compare to the sourcePort field. + @field destinationPort The destination port to match. + @field destinationPortMask The mask to apply to the destination port of the packet to compare to the destinationPort field. + + @field sourceAddress The source address to match. + @field sourceAddressMask The mask to apply to the source address of the packet to compare to the sourceAddress field. + @field destinationAddress The destination address to match. + @field destinationAddressMask The mask to apply to the destination address of the packet to compare to the destinationAddress field. + @field protocol The protocol that the match applies to. See IOEthernetAVBIngressFilterProtocol. + + @field label The MPLS label to match + @field labelMask The mask to apply to the MPLS label in the packet to compare to the label field. + + @field patternOffset The offset into the packet that the pattern match begins at. + @field patternLength The number of bytes of pattern and pattern mask used in the match (maximum 128). + @field pattern The pattern to match. + @field patternMask The mask to apply to the bytes in the packet to compare to the pattern. + + @field elementCount The number of entries in the elements field. + @field elements An array of IOEthernetAVBIngressFilterElement structs for sub filters to be ANDed together to make this filter element. These elements should not have sub elements. + */ + typedef struct IOEthernetAVBIngressFilterElement + { + IOEthernetAVBIngressFilterType filterType; + + union + { + struct + { + uint8_t macAddress[kIOEthernetAddressSize]; + uint8_t macAddressMask[kIOEthernetAddressSize]; + } destinationMAC; + + struct + { + uint16_t etherType; + uint16_t etherTypeMask; + uint16_t vlanTag; + uint16_t vlanTagMask; + } etherTypeVLANTag; + + struct + { + uint16_t sourcePort; + uint16_t sourcePortMask; + uint16_t destinationPort; + uint16_t destinationPortMask; + } udpPort; + + struct + { + uint32_t sourceAddress; + uint32_t sourceAddressMask; + uint32_t destinationAddress; + uint32_t destinationAddressMask; + uint16_t sourcePort; + uint16_t sourcePortMask; + uint16_t destinationPort; + uint16_t destinationPortMask; + + uint8_t protocol; + } ipv4Tuple; + + struct + { + uint8_t sourceAddress[16]; + uint8_t sourceAddressMask[16]; + uint8_t destinationAddress[16]; + uint8_t destinationAddressMask[16]; + uint16_t sourcePort; + uint16_t sourcePortMask; + uint16_t destinationPort; + uint16_t destinationPortMask; + + uint8_t protocol; + } ipv6Tuple; + + struct + { + uint32_t label; + uint32_t labelMask; + } mplsLabel; + + struct + { + uint8_t patternOffset; + uint8_t patternLength; + uint8_t pattern[128]; + uint8_t patternMask[128]; + } byteMatch; + + struct + { + uint32_t elementCount; + struct IOEthernetAVBIngressFilterElement *elements; + } compound; + } filter; + } IOEthernetAVBIngressFilterElement; + + //Set the VLAN ID and PCP being used for a receive queue + /*! @function setRealtimeReceiveQueueFilter + @abstract Set the ingress filter being used for a receive queue. + @discussion Sets the ingress filter hardware for directing the appropriate media streaming packets into the receive queue. + Passing an empty array removes any added filters and either resets the queue to a default value or disables the queue. + @param queueIndex index of the realtime receive queue. + @param filterElements the array of IOEthernetAVBIngressFilterElement elements to apply as the ingress filter, + @param filterElementCount the number of elements in the filterElements array. + @return IOReturn indicating success or reason for failure. + */ + virtual IOReturn setRealtimeReceiveQueueFilter(uint32_t queueIndex, IOEthernetAVBIngressFilterElement *filterElements, uint32_t filterElementCount); + OSMetaClassDeclareReservedUsed( IOEthernetInterface, 5); + + //Get the VLAN ID and PCP being used for a receive queue + /*! @function getRealtimeReceiveQueueFilter + @abstract Get the ingress filter being used for a receive queue. + @discussion Gets the ingress filter hardware for directing the appropriate media streaming packets into the receive queue. + The caller should call IOFree on any elements array within an IOEthernetAVBIngressFilterTypeCompound element. + @param queueIndex index of the realtime receive queue. + @param filterElements the array of IOEthernetAVBIngressFilterElement elements to apply as the ingress filter, + @param filterElementCount the number of elements in the filterElements array. On entry this is the maximum size of the array. + @return IOReturn indicating success or reason for failure. + */ + virtual IOReturn getRealtimeReceiveQueueFilter(uint32_t queueIndex, IOEthernetAVBIngressFilterElement *filterElements, uint32_t *filterElementCount); + OSMetaClassDeclareReservedUsed( IOEthernetInterface, 6); + + /*! @function setRealtimeReceiveQueuePacketHandler + @abstract Set the packet handler callback function for a realtime receive queue. + @discussion Sets the callback function and context to be used to process all of the packets for a realtime receive queue. + Ownership of the packets is handed from the driver to the callback function. The callback function must call completeAVBPacket() + before returning. + @param queueIndex index of the realtime receive queue. + @param callback The callback function pointer. + @param context A caller specified pointer sized value that is passed back in the callback function. + @return IOReturn indicating success or reason for failure. + */ + virtual IOReturn setRealtimeReceiveQueuePacketHandler(uint32_t queueIndex, avb_packet_callback_t callback, void *context); + OSMetaClassDeclareReservedUsed( IOEthernetController, 7); + + /*! @function setRealtimeReceiveDestinationMACList + @abstract Set the list of destination MAC addreses used for a realtime receive queue. + @discussion Set the list of destination MAC addresses that are being received on a realtime receive queue. These multicast + addresses are *not* included in the list supplied to the setMulticastList call. + @param queueIndex index of the realtime receive queue. + @param addresses An array of ethernet destination MAC addresses. This shall be ignored if addressCount is 0. + @param addressCount The number of elements in the addresses array. + @return IOReturn indicating success or reason for failure. + */ + virtual IOReturn setRealtimeReceiveDestinationMACList(uint32_t queueIndex, IOEthernetAddress *addresses, int addressCount); + OSMetaClassDeclareReservedUsed( IOEthernetController, 8); + +protected: + /*! @function setNumberOfRealtimeReceiveQueues + @abstract Sets up the realtime receive queue count in the AVB support information. + @discussion Used by subclasses to set the value returned in the numberOfRealtimeReceiveQueues field of the AVB + support capabilities. It also initializes internal data structures to contain enough space for keeping track + of realtime receive queue information (such as the callbacks). + @param numberOfReceiveQueues The number of receive queues. + */ + void setNumberOfRealtimeReceiveQueues(uint32_t numberOfReceiveQueues); + +#pragma mark Time Sync +public: + /*! @function addTimeSyncReceivePacketHandler + @abstract Add a callback function to the list of Time Sync receive callbacks. + @discussion Add a callback function to the set of callbacks that are called for every received time sync packet. + Ownership of the packet is not handed to the callback function. The callback function must not call completeAVBPacket(). + @param callback The function to be called upon receiving a Time Sync packet in the dedicated time sync receive queue. + @param context A caller specified pointer sized value that is passed back in the callback function. + @return IOReturn indicating success or reason for failure. + */ + IOReturn addTimeSyncReceivePacketHandler(avb_packet_callback_t callback, void *context); + /*! @function removeTimeSyncReceivePacketHandler + @abstract Remove a previously added callback. + @discussion Remove a callback function that was previously added with addTimeSyncReceivePacketHandler(). + @param callback The function previously added. + @param context A caller specified pointer sized value that is passed back in the callback function. + @return IOReturn indicating success or reason for failure. + */ + IOReturn removeTimeSyncReceivePacketHandler(avb_packet_callback_t callback, void *context); + + //Set the callback for transmitted time sync packets (those that require egress timestamping) + /*! @function addTimeSyncTransmitPacketHandler + @abstract Add a callback function to be called after transmitting an egress timestamped Time Sync packet. + @discussion Add a callback function to the list and assigns a reference to it for tracking the callback to be used + for returning the egress timestamp to the caller. Ownership of the packet is not handed to the callback function. + The callback function must not call completeAVBPacket(). + @param callback The function to be called upon transmitting a Time Sync packet and obtaining it's egress timestamp. + @param context A caller specified pointer sized value that is passed back in the callback function. + @param callbackRef A pointer to a uint32_t that is allocated to the callback for use in the packets passed + to the transmitTimeSyncPacket so that the callback will be called. + @return IOReturn indicating success or reason for failure. + */ + IOReturn addTimeSyncTransmitPacketHandler(avb_packet_callback_t callback, void *context, uint32_t *callbackRef); + /*! @function removeTimeSyncTransmitPacketHandler + @abstract Remove a callback function previously added with addTimeSyncTransmitPacketHandler() + @discussion Remove a transmit packet handler previously added with addTimeSyncTransmitPacketHandler(). + @param callbackRef The callback reference returned by the call to addTimeSyncTransmitPacketHandler(). + @return IOReturn indicating success or reason for failure. + */ + IOReturn removeTimeSyncTransmitPacketHandler(uint32_t callbackRef); + + /*! @function transmitTimeSyncPacket + @abstract Transmit a time sync packet and capture it's egress timestamp. + @discussion Transmit a time sync packet which requires egress timestamping, after the egress timestamp is available + the transmit packet handler is called, passing this packet. If expiryTime (in mach_absolute_time) is reached + before the packet is transmitted it is aborted the packet callback called with the packet containing no valid timestamp. + @param packet The packet to be transmitted. + @param expiryTime The time at which the packet no longer needs to be transmitted if it hasn't already been transmitted. + @return IOReturn indicating success or reason for failure. + */ + virtual IOReturn transmitTimeSyncPacket(IOEthernetAVBPacket * packet, uint64_t expiryTime); + OSMetaClassDeclareReservedUsed( IOEthernetController, 9); + + +protected: + /*! @function setGPTPPresent + @abstract Set the gPTP present flag on the controller and trigger the AVB stack loading. + @discussion Sets the gPTPPresent property on the controller and interface. If setting gPTPPresent to true it calls + registerService() to trigger matching and loading of the AVB stack on demand, otherwise it calls messageClients + to trigger the stack to unload. + @param gPTPPresent + @return IOReturn indicating success or reason for failure. + */ + IOReturn setGPTPPresent(bool gPTPPresent); + +protected: + /*! @function receivedTimeSyncPacket + @abstract Send the received time sync packet to the callback functions. + @discussion This function is called by subclasses when they have received a Time Sync packet to send it to all of the + registered callback functions. + @param packet The received time sync packet. + */ + void receivedTimeSyncPacket(IOEthernetAVBPacket *packet); + /*! @function transmittedTimeSyncPacket + @abstract Send the transmitted time sync packet to the transmit callback. + @discussion This function is called by subclasses when they have transmitted an egress timestamped packet and have the + egress timestamp or when they have expired the packet. + @param packet The transmitted time sync packet + @param expired A bool indicating if the call is due to the packet being expired. + */ + void transmittedTimeSyncPacket(IOEthernetAVBPacket *packet, bool expired); + + /*! @function setTimeSyncPacketSupport + @abstract Sets up the time sync support in the AVB support information + @discussion Used by subclasses to set the value returned in the timeSyncSupport field of the AVB support caoabilities. + @param timeSyncPacketSupport The support that the controller has for timestamping. + */ + void setTimeSyncPacketSupport(IOEthernetControllerAVBTimeSyncSupport timeSyncPacketSupport); + +private: + static void timeSyncCallbackThreadEntry(void *param, wait_result_t waitResult); + void timeSyncCallbackThread(void); + + + + +#else + // Virtual function padding + OSMetaClassDeclareReservedUnused( IOEthernetController, 2); + OSMetaClassDeclareReservedUnused( IOEthernetController, 3); + OSMetaClassDeclareReservedUnused( IOEthernetController, 4); + OSMetaClassDeclareReservedUnused( IOEthernetController, 5); + OSMetaClassDeclareReservedUnused( IOEthernetController, 6); + OSMetaClassDeclareReservedUnused( IOEthernetController, 7); + OSMetaClassDeclareReservedUnused( IOEthernetController, 8); + OSMetaClassDeclareReservedUnused( IOEthernetController, 9); +#endif + OSMetaClassDeclareReservedUnused( IOEthernetController, 10); + OSMetaClassDeclareReservedUnused( IOEthernetController, 11); + OSMetaClassDeclareReservedUnused( IOEthernetController, 12); + OSMetaClassDeclareReservedUnused( IOEthernetController, 13); + OSMetaClassDeclareReservedUnused( IOEthernetController, 14); + OSMetaClassDeclareReservedUnused( IOEthernetController, 15); + OSMetaClassDeclareReservedUnused( IOEthernetController, 16); + OSMetaClassDeclareReservedUnused( IOEthernetController, 17); + OSMetaClassDeclareReservedUnused( IOEthernetController, 18); + OSMetaClassDeclareReservedUnused( IOEthernetController, 19); + OSMetaClassDeclareReservedUnused( IOEthernetController, 20); + OSMetaClassDeclareReservedUnused( IOEthernetController, 21); + OSMetaClassDeclareReservedUnused( IOEthernetController, 22); + OSMetaClassDeclareReservedUnused( IOEthernetController, 23); + OSMetaClassDeclareReservedUnused( IOEthernetController, 24); + OSMetaClassDeclareReservedUnused( IOEthernetController, 25); + OSMetaClassDeclareReservedUnused( IOEthernetController, 26); + OSMetaClassDeclareReservedUnused( IOEthernetController, 27); + OSMetaClassDeclareReservedUnused( IOEthernetController, 28); + OSMetaClassDeclareReservedUnused( IOEthernetController, 29); + OSMetaClassDeclareReservedUnused( IOEthernetController, 30); + OSMetaClassDeclareReservedUnused( IOEthernetController, 31); +}; + +/* + * FIXME: remove this. + */ +enum { + kIOEnetPromiscuousModeOff = false, + kIOEnetPromiscuousModeOn = true, + kIOEnetPromiscuousModeAll = true, + kIOEnetMulticastModeOff = false, + kIOEnetMulticastModeFilter = true +}; +typedef bool IOEnetPromiscuousMode; +typedef bool IOEnetMulticastMode; + +#endif /* __cplusplus */ +#endif /* KERNEL */ +#endif /* !_IOETHERNETCONTROLLER_H */ diff --git a/QualcommWireless/include/IOKit/network/IOEthernetInterface.h b/QualcommWireless/include/IOKit/network/IOEthernetInterface.h new file mode 100644 index 0000000..a5f707e --- /dev/null +++ b/QualcommWireless/include/IOKit/network/IOEthernetInterface.h @@ -0,0 +1,312 @@ +/* + * Copyright (c) 1998-2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOETHERNETINTERFACE_H +#define _IOETHERNETINTERFACE_H + +/*! @defined kIOEthernetInterfaceClass + @abstract The name of the + IOEthernetInterface class. +*/ + +#define kIOEthernetInterfaceClass "IOEthernetInterface" + +/*! @defined kIOActivePacketFilters + @abstract A property of IOEthernetInterface objects. + @discussion The kIOActivePacketFilters property has an OSDictionary value that describes the current + set of packet filters that have been successfully activated. Each + entry in the dictionary is a key/value pair consisting of the filter + group name, and an OSNumber describing the set of active filters for + that group. Entries in this dictionary will mirror those in + kIORequiredPacketFilters if the controller has reported success for + all filter change requests from the IOEthernetInterface object. +*/ + +#define kIOActivePacketFilters "IOActivePacketFilters" + +/*! @defined kIORequiredPacketFilters + @abstract A property of IOEthernetInterface objects. + @discussion The kIORequiredPacketFilters property has an OSDictionary value that describes the current + set of required packet filters. Each entry in the dictionary is a + key/value pair consisting of the filter group name, and an OSNumber + describing the set of required filters for that group. +*/ + +#define kIORequiredPacketFilters "IORequiredPacketFilters" + +/*! @defined kIOMulticastAddressList + @abstract A property of IOEthernetInterface objects. + @discussion The kIOMulticastAddressList property is an OSData object that describes the + list of multicast addresses that are being used by the + controller to match against the destination address of an + incoming frame. +*/ + +#define kIOMulticastAddressList "IOMulticastAddressList" +#define kIOMulticastFilterData kIOMulticastAddressList + +#ifdef KERNEL +#ifdef __cplusplus + +#include +#include +#include + +/*! @class IOEthernetInterface + @abstract The Ethernet interface object. + @discussion An Ethernet controller driver, + that is a subclass of IOEthernetController, will instantiate an object + of this class when the driver calls the attachInterface() method. + This interface object will then vend an Ethernet interface to DLIL, + and manage the connection between the controller driver and the upper + networking layers. Drivers will seldom need to subclass + IOEthernetInterface. +*/ + +class APPLE_KEXT_DEPRECATE IOEthernetInterface : public IONetworkInterface +{ + OSDeclareDefaultStructors( IOEthernetInterface ) + +private: + thread_call_t _inputEventThreadCall; // inputEvent() thread call + UInt32 _mcAddrCount; // # of multicast addresses + bool _ctrEnabled; // Is controller enabled? + OSDictionary * _supportedFilters; // Controller's supported filters + OSDictionary * _requiredFilters; // The required filters + OSDictionary * _activeFilters; // Currently active filters + bool _controllerLostPower; // true if controller is unusable + + struct ExpansionData { + UInt32 altMTU; // track the physical mtu of controller + UInt32 publishedFeatureID; // id for published wake packet + uint32_t supportedWakeFilters; // bitmask of supported wake filters + OSNumber * disabledWakeFilters; // OSNumber of disabled wake filters + uint64_t wompEnabledAssertionID; + }; + /*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData * _reserved; + + + IOReturn enableController(IONetworkController * ctr); + IOReturn setupMulticastFilter(IONetworkController * ctr); + + UInt32 getFilters(const OSDictionary * dict, + const OSSymbol * group); + + bool setFilters(OSDictionary * dict, + const OSSymbol * group, + UInt32 filters); + + IOReturn disableFilter(IONetworkController * ctr, + const OSSymbol * group, + UInt32 filter, + IOOptionBits options = 0); + + IOReturn enableFilter(IONetworkController * ctr, + const OSSymbol * group, + UInt32 filter, + IOOptionBits options = 0); + + int syncSIOCSIFFLAGS(IONetworkController * ctr); + int syncSIOCSIFADDR(IONetworkController * ctr); + int syncSIOCADDMULTI(IONetworkController * ctr); + int syncSIOCDELMULTI(IONetworkController * ctr); + int syncSIOCSIFMTU(IONetworkController * ctr, struct ifreq * ifr, bool); + int syncSIOCGIFDEVMTU(IONetworkController * ctr, struct ifreq * ifr); + int syncSIOCSIFLLADDR(IONetworkController * ctr, const char * lladdr, int len); + int syncSIOCSIFCAP(IONetworkController * ctr, struct ifreq * ifr); + void _fixupVlanPacket(mbuf_t, u_int16_t, int); + void reportInterfaceWakeFlags(IONetworkController * ctr); + + static void handleEthernetInputEvent(thread_call_param_t param0, thread_call_param_t param1); + static int performGatedCommand(void *, void *, void *, void *, void *); + static IOReturn enableFilter_Wrapper( + IOEthernetInterface *, IONetworkController *, const OSSymbol *, UInt32 , IOOptionBits); + +public: + +/*! @function init + @abstract Initializes an IOEthernetInterface instance. + @discussion Instance variables are initialized, and an arpcom + structure is allocated. + @param controller A network controller object that will service + the interface object being initialized. + @result Returns true on success, false otherwise. +*/ + + virtual bool init( IONetworkController * controller ) APPLE_KEXT_OVERRIDE; + +/*! @function getNamePrefix + @abstract Returns a string containing the prefix to use when + creating a BSD name for this interface. + @discussion The BSD name for each interface object is created by + concatenating a string returned by this method, with an unique + unit number assigned by IONetworkStack. + @result Returns a pointer to a constant C string "en". Therefore, Ethernet + interfaces will be registered with BSD as en0, en1, etc. +*/ + + virtual const char * getNamePrefix() const APPLE_KEXT_OVERRIDE; + +protected: + +/*! @function free + @abstract Frees the IOEthernetInterface instance. + @discussion The memory allocated for the arpcom structure is released, + followed by a call to super::free(). +*/ + + virtual void free() APPLE_KEXT_OVERRIDE; + +/*! @function performCommand + @abstract Handles an ioctl command sent to the Ethernet interface. + @discussion This method handles socket ioctl commands sent to the Ethernet + interface from DLIL. Commands recognized and processed by this method are + SIOCSIFADDR, SIOCSIFFLAGS, SIOCADDMULTI, and SIOCDELMULTI. Other commands + are passed to the superclass. + @param controller The controller object. + @param cmd The ioctl command code. + @param arg0 Command argument 0. Generally a pointer to an ifnet structure + associated with the interface. + @param arg1 Command argument 1. + @result Returns a BSD return value defined in bsd/sys/errno.h. +*/ + + virtual SInt32 performCommand(IONetworkController * controller, + unsigned long cmd, + void * arg0, + void * arg1) APPLE_KEXT_OVERRIDE; + +/*! @function controllerDidOpen + @abstract A notification that the interface has opened the network + controller. + @discussion This method will be called by IONetworkInterface after a + network controller has accepted an open from this interface object. + IOEthernetInterface will first call the implementation in its + superclass, then inspect the controller through properties published + in the registry. This method is called with the arbitration lock held. + @param controller The controller object that was opened. + @result Returns true on success, false otherwise. Returning false will + cause the controller to be closed, and any pending client opens to be + rejected. +*/ + + virtual bool controllerDidOpen(IONetworkController * controller) APPLE_KEXT_OVERRIDE; + +/*! @function controllerWillClose + @abstract A notification that the interface will close the network + controller. + @discussion This method will simply call super to propagate the method + call. This method is called with the arbitration lock held. + @param controller The controller that is about to be closed. +*/ + + virtual void controllerWillClose(IONetworkController * controller) APPLE_KEXT_OVERRIDE; + + +/*! @function controllerWillChangePowerState + @abstract Handles a notification that the network controller + servicing this interface object is about to transition to a new power state. + @discussion If the controller is about to transition to an unusable state, + and it is currently enabled, then the disable() method on the controller is + called. + @param controller The network controller object. + @param flags Flags that describe the capability of the controller in the new + power state. + @param stateNumber An index to a state in the network controller's + power state array that the controller is switching to. + @param policyMaker A reference to the network controller's policy-maker, + and is also the originator of this notification. + @result Always returns kIOReturnSuccess. +*/ + + virtual IOReturn controllerWillChangePowerState( + IONetworkController * controller, + IOPMPowerFlags flags, + UInt32 stateNumber, + IOService * policyMaker) APPLE_KEXT_OVERRIDE; + +/*! @function controllerDidChangePowerState + @abstract Handles a notification that the network controller servicing + this interface object has transitioned to a new power state. + @discussion If the controller did transition to a usable state, and it was + previously disabled due to a previous power change, then it is re-enabled. + @param controller The network controller object. + @param flags Flags that describe the capability of the controller in the new + power state. + @param stateNumber An index to a state in the network controller's + power state array that the controller has switched to. + @param policyMaker A reference to the network controller's policy-maker, + and is also the originator of this notification. + @result Always returns kIOReturnSuccess. +*/ + + virtual IOReturn controllerDidChangePowerState( + IONetworkController * controller, + IOPMPowerFlags flags, + UInt32 stateNumber, + IOService * policyMaker) APPLE_KEXT_OVERRIDE; + +public: + /* Override IONetworkInterface::willTerminate() */ + + virtual bool willTerminate( IOService * provider, + IOOptionBits options ) APPLE_KEXT_OVERRIDE; + + /* Override IONetworkInterface::attachToDataLinkLayer() */ + + virtual IOReturn attachToDataLinkLayer( IOOptionBits options, + void * parameter) APPLE_KEXT_OVERRIDE; + + /* Override IONetworkInterface::inputEvent() */ + + virtual bool inputEvent( UInt32 type, void * data) APPLE_KEXT_OVERRIDE; + +protected: + virtual void feedPacketInputTap(mbuf_t) APPLE_KEXT_OVERRIDE; + virtual void feedPacketOutputTap(mbuf_t) APPLE_KEXT_OVERRIDE; + virtual bool initIfnetParams(struct ifnet_init_params *params) APPLE_KEXT_OVERRIDE; + +public: + // Virtual function padding + OSMetaClassDeclareReservedUnused( IOEthernetInterface, 0); + OSMetaClassDeclareReservedUnused( IOEthernetInterface, 1); + OSMetaClassDeclareReservedUnused( IOEthernetInterface, 2); + OSMetaClassDeclareReservedUnused( IOEthernetInterface, 3); + OSMetaClassDeclareReservedUnused( IOEthernetInterface, 4); + OSMetaClassDeclareReservedUnused( IOEthernetInterface, 5); + OSMetaClassDeclareReservedUnused( IOEthernetInterface, 6); + OSMetaClassDeclareReservedUnused( IOEthernetInterface, 7); + OSMetaClassDeclareReservedUnused( IOEthernetInterface, 8); + OSMetaClassDeclareReservedUnused( IOEthernetInterface, 9); + OSMetaClassDeclareReservedUnused( IOEthernetInterface, 10); + OSMetaClassDeclareReservedUnused( IOEthernetInterface, 11); + OSMetaClassDeclareReservedUnused( IOEthernetInterface, 12); + OSMetaClassDeclareReservedUnused( IOEthernetInterface, 13); + OSMetaClassDeclareReservedUnused( IOEthernetInterface, 14); + OSMetaClassDeclareReservedUnused( IOEthernetInterface, 15); +}; + +#endif /* __cplusplus */ +#endif /* KERNEL */ +#endif /* !_IOETHERNETINTERFACE_H */ diff --git a/QualcommWireless/include/IOKit/network/IOEthernetStats.h b/QualcommWireless/include/IOKit/network/IOEthernetStats.h new file mode 100644 index 0000000..6125c2d --- /dev/null +++ b/QualcommWireless/include/IOKit/network/IOEthernetStats.h @@ -0,0 +1,161 @@ +/* + * Copyright (c) 1998-2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * IOEthernetStats.h - Ethernet MIB statistics definitions. + * + * HISTORY + */ + +#ifndef _IOETHERNETSTATS_H +#define _IOETHERNETSTATS_H + +/*! @header IOEthernetStats.h + @discussion Ethernet statistics. */ + +//--------------------------------------------------------------------------- +// Ethernet-like statistics group. + +/*! @typedef IODot3StatsEntry + @discussion Ethernet MIB statistics structure. + @field alignmentErrors dot3StatsAlignmentErrors. + @field fcsErrors dot3StatsFCSErrors. + @field singleCollisionFrames dot3StatsSingleCollisionFrames. + @field multipleCollisionFrames dot3StatsMultipleCollisionFrames. + @field sqeTestErrors dot3StatsSQETestErrors. + @field deferredTransmissions dot3StatsDeferredTransmissions. + @field lateCollisions dot3StatsLateCollisions. + @field excessiveCollisions dot3StatsExcessiveCollisions. + @field internalMacTransmitErrors dot3StatsInternalMacTransmitErrors. + @field carrierSenseErrors dot3StatsCarrierSenseErrors. + @field frameTooLongs dot3StatsFrameTooLongs. + @field internalMacReceiveErrors dot3StatsInternalMacReceiveErrors. + @field etherChipSet dot3StatsEtherChipSet. + @field missedFrames dot3StatsMissedFrames (not in RFC1650). + */ + +typedef struct { + UInt32 alignmentErrors; + UInt32 fcsErrors; + UInt32 singleCollisionFrames; + UInt32 multipleCollisionFrames; + UInt32 sqeTestErrors; + UInt32 deferredTransmissions; + UInt32 lateCollisions; + UInt32 excessiveCollisions; + UInt32 internalMacTransmitErrors; + UInt32 carrierSenseErrors; + UInt32 frameTooLongs; + UInt32 internalMacReceiveErrors; + UInt32 etherChipSet; + UInt32 missedFrames; +} IODot3StatsEntry; + +//--------------------------------------------------------------------------- +// Ethernet-like collision statistics group (optional). + +/*! @typedef IODot3CollEntry + @discussion Collision statistics structure. + @field collFrequencies dot3StatsCollFrequencies. */ + +typedef struct { + UInt32 collFrequencies[16]; +} IODot3CollEntry; + +//--------------------------------------------------------------------------- +// Receiver extra statistics group (not defined by RFC 1650). + +/*! @typedef IODot3RxExtraEntry + @discussion Extra receiver statistics not defined by RFC1650. + @field overruns receiver overruns. + @field watchdogTimeouts watchdog timer expirations. + @field frameTooShorts runt frames. + @field collisionErrors frames damages by late collision. + @field phyErrors PHY receive errors. + @field timeouts receiver timeouts. + @field interrupts receiver interrupts. + @field resets receiver resets. + @field resourceErrors receiver resource shortages. + */ + +typedef struct { + UInt32 overruns; + UInt32 watchdogTimeouts; + UInt32 frameTooShorts; + UInt32 collisionErrors; + UInt32 phyErrors; + UInt32 timeouts; + UInt32 interrupts; + UInt32 resets; + UInt32 resourceErrors; + UInt32 reserved[4]; +} IODot3RxExtraEntry; + +//--------------------------------------------------------------------------- +// Transmitter extra statistics group (not defined by RFC 1650). + +/*! @typedef IODot3TxExtraEntry + @discussion Extra transmitter statistics not defined by RFC1650. + @field underruns transmit underruns. + @field jabbers jabber events. + @field phyErrors PHY transmit errors. + @field timeouts transmitter timeouts. + @field interrupts transmitter interrupts. + @field resets transmitter resets. + @field resourceErrors transmitter resource shortages. + */ + +typedef struct { + UInt32 underruns; + UInt32 jabbers; + UInt32 phyErrors; + UInt32 timeouts; + UInt32 interrupts; + UInt32 resets; + UInt32 resourceErrors; + UInt32 reserved[4]; +} IODot3TxExtraEntry; + +//--------------------------------------------------------------------------- +// Aggregate Ethernet statistics. + +/*! @typedef IOEthernetStats + @discussion Aggregate Ethernet statistics structure. + @field dot3StatsEntry IODot3StatsEntry statistics group. + @field dot3CollEntry IODot3CollEntry statistics group. + @field dot3RxExtraEntry IODot3RxExtraEntry statistics group. + @field dot3TxExtraEntry IODot3TxExtraEntry statistics group. + */ + +typedef struct { + IODot3StatsEntry dot3StatsEntry; + IODot3CollEntry dot3CollEntry; + IODot3RxExtraEntry dot3RxExtraEntry; + IODot3TxExtraEntry dot3TxExtraEntry; +} IOEthernetStats; + +/*! @defined kIOEthernetStatsKey + @discussion Defines the name of an IONetworkData that contains + an IOEthernetStats. */ + +#define kIOEthernetStatsKey "IOEthernetStatsKey" + +#endif /* !_IOETHERNETSTATS_H */ diff --git a/QualcommWireless/include/IOKit/network/IOGatedOutputQueue.h b/QualcommWireless/include/IOKit/network/IOGatedOutputQueue.h new file mode 100644 index 0000000..7ffca75 --- /dev/null +++ b/QualcommWireless/include/IOKit/network/IOGatedOutputQueue.h @@ -0,0 +1,178 @@ +/* + * Copyright (c) 1998-2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOGATEDOUTPUTQUEUE_H +#define _IOGATEDOUTPUTQUEUE_H + +#include +#include +#include +#include + +/*! @class IOGatedOutputQueue + @abstract An extension of an IOBasicOutputQueue. + @discussion An IOCommandGate + object is created by this queue and added to a work loop as an + event source. All calls to the target by the consumer thread must + occur with the gate closed. Therefore, all calls to the target of + this type of queue will be serialized with any other thread that + runs on the same work loop context. This is useful for network + drivers that have a tight hardware coupling between the transmit + and receive engines, and a single-threaded hardware access model + is desirable. +*/ + +class IOGatedOutputQueue : public IOBasicOutputQueue +{ + OSDeclareDefaultStructors( IOGatedOutputQueue ) + +private: + static void gatedOutput(OSObject * owner, + IOGatedOutputQueue * self, + IOMbufQueue * queue, + UInt32 * state); + + static void restartDeferredOutput(OSObject * owner, + IOInterruptEventSource * sender, + int count); + +protected: + IOCommandGate * _gate; + IOInterruptEventSource * _interruptSrc; + +/*! @function output + @abstract Transfers all packets in the mbuf queue to the target. + @param queue A queue of output packets. + @param state Return a state bit defined by IOBasicOutputQueue that + declares the new state of the queue following this method call. + A kStateStalled is returned if the queue should stall, otherwise 0 + is returned. +*/ + + virtual void output(IOMbufQueue * queue, UInt32 * state) APPLE_KEXT_OVERRIDE; + +/*! @function free + @abstract Frees the IOGatedOutputQueue object. + @discussion Release allocated resources, then call super::free(). */ + + virtual void free() APPLE_KEXT_OVERRIDE; + +/*! @function output + @abstract Overrides the method inherited from IOOutputQueue. + @result Returns true if a thread was successfully scheduled to service + the queue. +*/ + + virtual bool scheduleServiceThread(void * param) APPLE_KEXT_OVERRIDE; + +public: + +/*! @function init + @abstract Initializes an IOGatedOutputQueue object. + @param target The object that will handle packets removed from the + queue, and is usually a subclass of IONetworkController. + @param action The function that will handle packets removed from the + queue. + @param workloop A workloop object. An IOCommandGate object is created + and added to this workloop as an event source. + @param capacity The initial capacity of the output queue. + @result Returns true if initialized successfully, false otherwise. +*/ + + virtual bool init(OSObject * target, + IOOutputAction action, + IOWorkLoop * workloop, + UInt32 capacity = 0, + UInt32 priorities = 1); + +/*! @function withTarget + @abstract Factory method that constructs and initializes an + IOGatedOutputQueue object. + @param target An IONetworkController object that will handle packets + removed from the queue. + @param workloop A workloop object. An IOCommandGate object is created + and added to this workloop as an event source. + @param capacity The initial capacity of the output queue. + @result Returns an IOGatedOutputQueue object on success, or 0 otherwise. +*/ + + static IOGatedOutputQueue * withTarget(IONetworkController * target, + IOWorkLoop * workloop, + UInt32 capacity = 0); + + /*! @function withTarget + @abstract Factory method that constructs and initializes an + IOGatedOutputQueue object. + @param target An IONetworkController object that will handle packets + removed from the queue. + @param workloop A workloop object. An IOCommandGate object is created + and added to this workloop as an event source. + @param capacity The initial capacity of the output queue. + @param priorities The number of traffic priorities supported + @result Returns an IOGatedOutputQueue object on success, or 0 otherwise. + */ + + static IOGatedOutputQueue * withTarget(IONetworkController * target, + IOWorkLoop * workloop, + UInt32 capacity, + UInt32 priorities); + +/*! @function withTarget + @abstract Factory method that constructs and initializes an + IOGatedOutputQueue object. + @param target The object that will handle packets removed from the + queue. + @param action The function that will handle packets removed from the + queue. + @param workloop A workloop object. An IOCommandGate object is created + and added to this workloop as an event source. + @param capacity The initial capacity of the output queue. + @result Returns an IOGatedOutputQueue object on success, or 0 otherwise. +*/ + + static IOGatedOutputQueue * withTarget(OSObject * target, + IOOutputAction action, + IOWorkLoop * workloop, + UInt32 capacity = 0); + + /*! @function withTarget + @abstract Factory method that constructs and initializes an + IOGatedOutputQueue object. + @param target The object that will handle packets removed from the + queue. + @param action The function that will handle packets removed from the + queue. + @param workloop A workloop object. An IOCommandGate object is created + and added to this workloop as an event source. + @param capacity The initial capacity of the output queue. + @param priorities The number of traffic priorities supported + @result Returns an IOGatedOutputQueue object on success, or 0 otherwise. + */ + + static IOGatedOutputQueue * withTarget(OSObject * target, + IOOutputAction action, + IOWorkLoop * workloop, + UInt32 capacity, + UInt32 priorities); +}; + +#endif /* !_IOGATEDOUTPUTQUEUE_H */ diff --git a/QualcommWireless/include/IOKit/network/IOKernelDebugger.h b/QualcommWireless/include/IOKit/network/IOKernelDebugger.h new file mode 100644 index 0000000..4543aca --- /dev/null +++ b/QualcommWireless/include/IOKit/network/IOKernelDebugger.h @@ -0,0 +1,402 @@ +/* + * Copyright (c) 1998-2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKERNELDEBUGGER_H +#define _IOKERNELDEBUGGER_H + +#include + +/*! @typedef IODebuggerRxHandler + @discussion Defines the receive handler that must be implemented + by the target to service KDP receive requests. This handler is called + by kdpReceiveDispatcher(). + @param target The target object. + @param buffer KDP receive buffer. The buffer allocated has room for + 1518 bytes. The receive handler must not overflow this buffer. + @param length The amount of data received and placed into the buffer. + Set to 0 if no frame was received during the poll interval. + @param timeout The amount of time to poll in milliseconds while waiting + for a frame to arrive. */ + +typedef void (*IODebuggerRxHandler)( IOService * target, + void * buffer, + UInt32 * length, + UInt32 timeout ); + +/*! @typedef IODebuggerTxHandler + @discussion Defines the transmit handler that must be implemented + by the target to service KDP transmit requests. This handler is called + by kdpTransmitDispatcher(). + @param target The target object. + @param buffer KDP transmit buffer. This buffer contains a KDP frame + to be sent on the network. + @param length The number of bytes in the transmit buffer. */ + +typedef void (*IODebuggerTxHandler)( IOService * target, + void * buffer, + UInt32 length ); + +/*! @typedef IODebuggerLinkStatusHandler + @discussion Defines the link up handler that must be implemented + by the target to service KDP link status requests. This handler is called + by kdpLinkStatusDispatcher(). + @param target The target object. + @result Return link status. +*/ + +typedef UInt32 (*IODebuggerLinkStatusHandler)( IOService * target); + +/*! @typedef IODebuggerSetModeHandler + @discussion Defines the mode handler that must be implemented + by the target to service KDP link status requests. This handler is called + by kdpSetModeDispatcher(). + @param target The target object. + @param active True if entering KDP and false if exiting KDP. + @result Return true on success and false on failure. +*/ + +typedef bool (*IODebuggerSetModeHandler)( IOService * target, bool active); + +/*! @typedef IODebuggerLockState + @discussion Defines flags returned by IOKernelDebugger::lock(). + @constant kIODebuggerLockTaken Set if the debugger lock was taken. */ + +typedef enum { + kIODebuggerLockTaken = 0x1 +} IODebuggerLockState; + +/*! @class IOKernelDebugger + @abstract Kernel debugger nub. + @discussion This object interfaces with the KDP + (kernel debugger protocol) module and dispatches KDP requests to its + target (provider). The target, designated as the debugger device, must + implement a pair of handler functions that are called to handle KDP + transmit and receive requests during a debugging session. Only a single + IOKernelDebugger in the system can be active at a given time. The + active IOKernelDebugger is the one that has an IOKDP object attached + as a client. + + The debugger device is usually a subclass of IOEthernetController. + However, any IOService can service an IOKernelDebugger client, + implement the two polled mode handlers, and transport the KDP + packets through a data channel. However, KDP assumes that the + debugger device is an Ethernet interface and therefore it will + always send, and expect to receive, an Ethernet frame. */ + +class IOKernelDebugger : public IOService +{ + OSDeclareDefaultStructors( IOKernelDebugger ) + +protected: + IOService * _target; // target (provider) + IODebuggerTxHandler _txHandler; // target's transmit handler. + IODebuggerRxHandler _rxHandler; // target's receive handler. + IOService * _client; // client that has opened us. + bool _pmDisabled; // true if disabled by PM. + + struct ExpansionData { + thread_call_t activationChangeThreadCall; + UInt32 stateVars[2]; + IONotifier * interfaceNotifier; + IODebuggerLinkStatusHandler linkStatusHandler; // target's link status handler. + IODebuggerSetModeHandler setModeHandler; // target's KDP mode handler. + }; + + /*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData * _reserved; + +/*! @function kdpReceiveDispatcher + @abstract The KDP receive dispatch function. + @discussion Field KDP receives requests, then dispatches the call to the + registered receiver handler. + @param buffer KDP receive buffer. The buffer allocated by KDP has room + for 1518 bytes. The receive handler must not overflow this buffer. + @param length The amount of data received and placed into the buffer. + Set to 0 if a frame was not received during the poll interval. + @param timeout The amount of time to poll in milliseconds while waiting + for a frame to arrive. +*/ + + static void kdpReceiveDispatcher(void * buffer, + UInt32 * length, + UInt32 timeout); + +/*! @function kdpTransmitDispatcher + @abstract The KDP transmit dispatch function. + @discussion Field KDP transmit requests, then dispatches the call to the + registered transmit handler. + @param buffer KDP transmit buffer. This buffer contains a KDP frame to + be sent on the network. + @param length The number of bytes in the transmit buffer. +*/ + + static void kdpTransmitDispatcher(void * buffer, UInt32 length); + +/*! @function kdpLinkStatusDispatcher + @abstract The KDP link status dispatch function. + @discussion Field KDP link status requests, then dispatches the call to the + registered link up handler. + @result Return link status. +*/ + + static UInt32 kdpLinkStatusDispatcher(void); + + +/*! @function kdpSetModeDispatcher + @abstract The KDP set mode dispatch function. + @discussion Field KDP set mode requests, then dispatches the call to the + registered set mode handler. + @param active TRUE if entering KDP. FALSE if leaving KDP. + @result Return TRUE if the link is up and data can be sent/received. Otherwise, + return FALSE. +*/ + + static boolean_t kdpSetModeDispatcher(boolean_t active); + +/*! @function free + @abstract Frees the IOKernelDebugger instance. */ + + virtual void free() APPLE_KEXT_OVERRIDE; + +/*! @function nullTxHandler + @abstract Null transmit handler. + @discussion This function is registered as the transmit handler when an + IOKernelDebugger object surrenders its status as the active debugger nub. + Until another IOKernelDebugger object gets promoted, this function will + handle polled transmit requests from KDP. This function does nothing + useful. +*/ + + static void nullTxHandler( IOService * target, + void * buffer, + UInt32 length ); + +/*! @function nullRxHandler + @abstract Null receive handler. + @discussion This function is registered as the receive handler when an + IOKernelDebugger object surrenders its status as the active debugger nub. + Until another IOKernelDebugger object gets promoted, this function will + handle polled receive requests from KDP. This function does nothing + except to log a warning message. +*/ + + static void nullRxHandler( IOService * target, + void * buffer, + UInt32 * length, + UInt32 timeout ); + +/*! @function nullLinkStatusHandler + @abstract Null link status handler. + @discussion This function is registered as the link status handler when an + IOKernelDebugger object surrenders its status as the active debugger nub. + Until another IOKernelDebugger object gets promoted, this function will + handle polled link status requests from KDP. + @result This function will always report link up. +*/ + + static UInt32 nullLinkStatusHandler( IOService * target); + +/*! @function nullSetModeHandler + @abstract Null set mode handler. + @discussion This function is registered as the set mode handler when an + IOKernelDebugger object surrenders its status as the active debugger nub. + Until another IOKernelDebugger object gets promoted, this function will + handle set mode requests from KDP. + @result This function will always return true. +*/ + + static bool nullSetModeHandler( IOService * target, bool active); + +/*! @function registerHandler + @abstract Registers the target and the handler functions. + @discussion This method is called by handleOpen() and handleClose() + to register or unregister the target and its handler functions. + @param target The target object. + @param txHandler The transmit handler function. The null handler is + registered if the argument is zero. + @param rxHandler The receive handler function. The null handler is + @param linkUpHandler The linkup handler function. The null handler is + registered if the argument is zero. +*/ + + static void registerHandler( IOService * target, + IODebuggerTxHandler txHandler = 0, + IODebuggerRxHandler rxHandler = 0, + IODebuggerLinkStatusHandler linkUpHandler = 0, + IODebuggerSetModeHandler setModeHandler = 0); + +/*! @function powerStateWillChangeTo + @abstract Handles notification that the network controller will change + power state. + @discussion If the controller is about to become unusable, then the + controller's handlers are unregistered, and the controller is disabled. + @param flags Describe the capability of the controller in the new power + state. + @param stateNumber The number of the state in the state array that the + controller is switching to. + @param policyMaker The policy maker that manages the controller's + power state. + @result Returns the constant 3000000, to indicate a maximum of 3 seconds for the + preparation to complete, and an acknowledgement delivered to the + policy maker. +*/ + + virtual IOReturn powerStateWillChangeTo( IOPMPowerFlags flags, + unsigned long stateNumber, + IOService * policyMaker ) APPLE_KEXT_OVERRIDE; + +/*! @function powerStateDidChangeTo + @abstract Handles notification that the network controller did change + power state. + @discussion If the controller became usable, then the controller is + re-enabled, and the controller's handlers are re-registered. + @param flags Description of the capability of the controller in the new power + state. + @param stateNumber The number of the state in the state array that the + controller is switching to. + @param policyMaker The policy maker that manages the controller's + power state. + @result Returns the constant 3000000, to indicate a maximum of 3 seconds for the + preparation to complete, and an acknowledgement delivered to the + policy maker. +*/ + + virtual IOReturn powerStateDidChangeTo( IOPMPowerFlags flags, + unsigned long stateNumber, + IOService * policyMaker ) APPLE_KEXT_OVERRIDE; + +/*! @function handleOpen + @abstract Handles a client open. + @discussion This method is called by IOService::open() to handle an + open from a client (IOKDP) with the arbitration lock held. + @param forClient The client (IOKDP) requesting the open. + @param options Options passed to the open() call. Not used. + @param arg A family defined argument passed to the open() call. Not used. + @result Returns true on success, false otherwise. +*/ + + virtual bool handleOpen( IOService * forClient, + IOOptionBits options, + void * arg ) APPLE_KEXT_OVERRIDE; + +/*! @function handleClose + @abstract Handles a client close. + @discussion This method is called by IOService::close() to handle a + close from a client with the arbitration lock held. + @param forClient The client (IOKDP) requesting the close. + @param options Options passed to the close() call. Not used. +*/ + + virtual void handleClose( IOService * forClient, + IOOptionBits options ) APPLE_KEXT_OVERRIDE; + +/*! @function handleIsOpen + @abstract Queries whether a client has an open on this object. + @discussion This method is called by IOService::isOpen() with the + arbitration lock held. + @result Returns true if the specified client, or any client if none (0) is + specified, presently has an open on this object. +*/ + + virtual bool handleIsOpen( const IOService * forClient ) const APPLE_KEXT_OVERRIDE; + + static bool interfacePublished( + void *target, void *param, IOService *service, IONotifier *notifier ); + +public: + +/*! @function lock + @abstract Takes the debugger lock conditionally. + @discussion This method takes the debugger lock if the object given matches the + target registered by registerHandler(). + @param target The target or provider of an IOKernelDebugger object. + @result Returns kIODebuggerLockTaken if the lock was taken, or 0 otherwise. +*/ + + static IODebuggerLockState lock( IOService * target ); + +/*! @function unlock + @abstract Releases the debugger lock. + @discussion This method releases the debugger lock if the kIODebuggerLockTaken flag is + set in the argument. +*/ + + static void unlock( IODebuggerLockState state ); + +/*! @function init + @abstract Initializes an IOKernelDebugger instance. + @param target The target object that implements the debugger handlers. + @param txHandler The target's transmit handler. A pointer to a 'C' function. + @param rxHandler The target's receive handler. A pointer to a 'C' function. + @param linkStatusHandler The target's link status handler. A pointer to a 'C' function. + @param setModeHandler The target's set mode handler. A pointer to a 'C' function. + @result Returns true if the instance initialized successfully, false otherwise. +*/ + + virtual bool init( IOService * target, + IODebuggerTxHandler txHandler, + IODebuggerRxHandler rxHandler, + IODebuggerLinkStatusHandler linkUpHandler, + IODebuggerSetModeHandler setModeHandler); + +/*! @function debugger + @abstract Factory method that performs allocation and initialization + of an IOKernelDebugger object. + @param target The target object that implements the debugger handlers. + @param txHandler The target's transmit handler. A pointer to a 'C' function. + @param rxHandler The target's receive handler. A pointer to a 'C' function. + @param linkStatusHandler The target's link status handler. A pointer to a 'C' function. + @param setModeHandler The target's set mode handler. A pointer to a 'C' function. + @result Returns an IOKernelDebugger instance on success, 0 otherwise. +*/ + + static IOKernelDebugger * debugger( IOService * target, + IODebuggerTxHandler txHandler, + IODebuggerRxHandler rxHandler, + IODebuggerLinkStatusHandler linkStatusHandler, + IODebuggerSetModeHandler setModeHandler); + + /* + * Entry point for generic messages delivered from the provider. + */ + + virtual IOReturn message( UInt32 type, IOService * provider, void * arg ) APPLE_KEXT_OVERRIDE; + +/*! @function signalDebugger + @abstract Signal the kernel to enter the debugger when safe. +*/ + static void signalDebugger(void); + + // Virtual function padding + OSMetaClassDeclareReservedUnused( IOKernelDebugger, 0); + OSMetaClassDeclareReservedUnused( IOKernelDebugger, 1); + OSMetaClassDeclareReservedUnused( IOKernelDebugger, 2); + OSMetaClassDeclareReservedUnused( IOKernelDebugger, 3); +}; + +// Concise form of the lock()/unlock() static member functions. +// +#define IODebuggerLock IOKernelDebugger::lock +#define IODebuggerUnlock IOKernelDebugger::unlock + +#endif /* !_IOKERNELDEBUGGER_H */ diff --git a/QualcommWireless/include/IOKit/network/IOMbufMemoryCursor.h b/QualcommWireless/include/IOKit/network/IOMbufMemoryCursor.h new file mode 100644 index 0000000..4e40173 --- /dev/null +++ b/QualcommWireless/include/IOKit/network/IOMbufMemoryCursor.h @@ -0,0 +1,381 @@ +/* + * Copyright (c) 1998-2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_NETWORK_IOMBUFMEMORYCURSOR_H +#define _IOKIT_NETWORK_IOMBUFMEMORYCURSOR_H + +#include + + +/*! @class IOMbufMemoryCursor + @abstract A mechanism to convert mbuf chains to physical addresses. + @discussion The IOMbufMemoryCursor defines the super class that all + specific mbuf cursors must inherit from, but a mbuf cursor can be created + without a specific formal subclass by just providing a segment function to + the initializers. This class performs the task of walking a given + mbuf chain and creating a physical scatter/gather list appropriate for + the target hardware. When necessary, this class may also coalesce + mbuf chains when the generated scatter/gather list exceeds the specified + hardware limit. However, this should be avoided since it exacts a + performance cost. +

+ A driver is expected to create a mbuf cursor and configure it to match the + limitations of it's DMA hardware; for instance the mbuf cursor used by + an Ethernet controller driver may have a maximum physical segment size + of 1520, and allow for up to 6 physical segments. Thus it would create a + mbuf cursor with a maxSegmentSize of 1520 and a maxNumSegments of 6. + The driver may choose to supply an OutputSegmentFunc function to + format the output of each scatter/gather segment to match the + hardware descriptor format, or it may use a subclass of + IOMbufMemoryCursor to generate IOPhysicalSegment segments with + various byte orders. +

+ A driver may also create more than one mbuf cursor, perhaps one + dedicated for the transmit thread, and the other for the receive thread. + This becomes a requirement when the driver is multi-threaded, since the + mbuf cursor maintains state and does not support reentrancy. */ + +class IOMbufMemoryCursor : public IOMemoryCursor +{ + OSDeclareDefaultStructors(IOMbufMemoryCursor) + +protected: + UInt32 maxNumSegments; + UInt32 coalesceCount; + UInt32 packetTooBigErrors; + + struct ExpansionData { }; + /*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + + virtual bool initWithSpecification(OutputSegmentFunc outSeg, + UInt32 maxSegmentSize, + UInt32 maxTransferSize, + UInt32 align); + +public: +/*! @function initWithSpecification + @abstract Primary initializer for the IOMbufMemoryCursor class. + @param outSeg Function to call to output one physical segment. + @param maxSegmentSize Maximum allowable size for one segment. + @param maxNumSegments Maximum number of segments. + @result Returns true if the inherited classes and this instance initialized + successfully. +*/ + + virtual bool initWithSpecification(OutputSegmentFunc outSeg, + UInt32 maxSegmentSize, + UInt32 maxNumSegments); + +/*! @function genPhysicalSegments + @abstract Generates a physical scatter/gather list given a mbuf packet. + @discussion Generates a list of physical segments from the given mbuf. + @param packet The mbuf packet. + @param vector Void pointer to base of output physical scatter/gather list. + Always passed directly onto the OutputSegmentFunc without interpretation + by the cursor. + @param maxSegs Maximum number of segments that can be written to segments + array. + @param doCoalesce Set to true to perform coalescing when the required + number of segments exceeds the specified limit, otherwise abort and + return 0. + @result Returns the number of segments that were filled in, or + 0 if an error occurred. +*/ + + virtual UInt32 genPhysicalSegments(mbuf_t packet, void * vector, + UInt32 maxSegs, bool doCoalesce); + +/*! @function getAndResetCoalesceCount + @abstract Returns a count of the total number of mbuf chains coalesced + by genPhysicalSegments(). + @discussion This method returns a count of the total number of mbuf chains coalesced + by genPhysicalSegments(). The counter is then reset to 0. + @result Returns the coalesce count. +*/ + + UInt32 getAndResetCoalesceCount(); + + // Virtual function padding + OSMetaClassDeclareReservedUnused( IOMbufMemoryCursor, 0); + OSMetaClassDeclareReservedUnused( IOMbufMemoryCursor, 1); + OSMetaClassDeclareReservedUnused( IOMbufMemoryCursor, 2); + OSMetaClassDeclareReservedUnused( IOMbufMemoryCursor, 3); +}; + + +/*! @class IOMbufNaturalMemoryCursor + @abstract An IOMbufMemoryCursor subclass that outputs a vector of + IOPhysicalSegments in the natural byte orientation for the cpu. + @discussion The IOMbufNaturalMemoryCursor would be used when it is too + difficult to implement an OutputSegmentFunc that is more appropriate for + your hardware. This cursor just outputs an array of IOPhysicalSegments. +*/ + +class IOMbufNaturalMemoryCursor : public IOMbufMemoryCursor +{ + OSDeclareDefaultStructors(IOMbufNaturalMemoryCursor) + +public: + +/*! @function withSpecification + @abstract Factory function that creates and initializes an + IOMbufNaturalMemoryCursor in one operation. + @discussion See also IOMbufMemoryCursor::initWithSpecification. + @param maxSegmentSize Maximum allowable size for one segment. + @param maxNumSegments Maximum number of segments. + @result Returns a new mbuf cursor if successfully created and initialized, + 0 otherwise. +*/ + + static IOMbufNaturalMemoryCursor * withSpecification(UInt32 maxSegmentSize, + UInt32 maxNumSegments); + +/*! @function getPhysicalSegments + @abstract Generates a cpu natural physical scatter/gather list from a given + mbuf. + @param packet The mbuf packet. + @param vector Pointer to an array of IOPhysicalSegments for the output + physical scatter/gather list. + @param numVectorSegments Maximum number of IOPhysicalSegments accepted. + @result Returns the number of segments that were filled in, or + 0 if an error occurred. +*/ + + UInt32 getPhysicalSegments(mbuf_t packet, + struct IOPhysicalSegment * vector, + UInt32 numVectorSegments = 0); + +/*! @function getPhysicalSegmentsWithCoalesce + @abstract Generates a cpu natural physical scatter/gather list from a given + mbuf. + @discussion Generate a cpu natural physical scatter/gather list from a + given mbuf. Coalesce mbuf chain when the number of segments in the + scatter/gather list exceeds numVectorSegments. + @param packet The mbuf packet. + @param vector Pointer to an array of IOPhysicalSegments for the output + physical scatter/gather list. + @param numVectorSegments Maximum number of IOPhysicalSegments accepted. + @result Returns the number of segments that were filled in, or + 0 if an error occurred. +*/ + + UInt32 getPhysicalSegmentsWithCoalesce(mbuf_t packet, + struct IOPhysicalSegment * vector, + UInt32 numVectorSegments = 0); +}; + +//=========================================================================== +//=========================================================================== + +/*! @class IOMbufBigMemoryCursor + @abstract An IOMbufMemoryCursor subclass that outputs a vector of + IOPhysicalSegments in the big endian byte order. + @discussion The IOMbufBigMemoryCursor would be used when the DMA hardware + requires a big endian address and length pair. This cursor outputs an + array of IOPhysicalSegments that are encoded in big-endian format. +*/ + +class IOMbufBigMemoryCursor : public IOMbufMemoryCursor +{ + OSDeclareDefaultStructors(IOMbufBigMemoryCursor) + +public: + +/*! @function withSpecification + @abstract Factory function that creates and initializes an + IOMbufBigMemoryCursor in one operation. + @discussion See also IOMbufMemoryCursor::initWithSpecification. + @param maxSegmentSize Maximum allowable size for one segment. + @param maxNumSegments Maximum number of segments. + @result Returns a new mbuf cursor if successfully created and initialized, + 0 otherwise. +*/ + + static IOMbufBigMemoryCursor * withSpecification(UInt32 maxSegmentSize, + UInt32 maxNumSegments); + +/*! @function getPhysicalSegments + @abstract Generates a big endian physical scatter/gather list from a given + mbuf. + @param packet The mbuf packet. + @param vector Pointer to an array of IOPhysicalSegments for the output + physical scatter/gather list. + @param numVectorSegments Maximum number of IOPhysicalSegments accepted. + @result Returns the number of segments that were filled in, or + 0 if an error occurred. +*/ + + UInt32 getPhysicalSegments(mbuf_t packet, + struct IOPhysicalSegment * vector, + UInt32 numVectorSegments = 0); + +/*! @function getPhysicalSegmentsWithCoalesce + @abstract Generates a big endian physical scatter/gather list from a given + mbuf. + @discussion Generate a big endian physical scatter/gather list from a + given mbuf. Coalesce mbuf chain when the number of segments in the + scatter/gather list exceeds numVectorSegments. + @param packet The mbuf packet. + @param vector Pointer to an array of IOPhysicalSegments for the output + physical scatter/gather list. + @param numVectorSegments Maximum number of IOPhysicalSegments accepted. + @result Returns the number of segments that were filled in, or + 0 if an error occurred. +*/ + + UInt32 getPhysicalSegmentsWithCoalesce(mbuf_t packet, + struct IOPhysicalSegment * vector, + UInt32 numVectorSegments = 0); +}; + +//=========================================================================== +//=========================================================================== + +/*! @class IOMbufLittleMemoryCursor + @abstract An IOMbufMemoryCursor subclass that outputs a vector of + IOPhysicalSegments in the little endian byte order. + @discussion The IOMbufLittleMemoryCursor would be used when the DMA + hardware requires a little endian address and length pair. This cursor + outputs an array of IOPhysicalSegments that are encoded in little endian + format. +*/ + +class IOMbufLittleMemoryCursor : public IOMbufMemoryCursor +{ + OSDeclareDefaultStructors(IOMbufLittleMemoryCursor) + +public: + +/*! @function withSpecification + @abstract Factory function that creates and initializes an + IOMbufLittleMemoryCursor in one operation. + @discussion See also IOMbufMemoryCursor::initWithSpecification. + @param maxSegmentSize Maximum allowable size for one segment. + @param maxNumSegments Maximum number of segments. + @result Returns a new mbuf cursor if successfully created and initialized, + 0 otherwise. +*/ + + static IOMbufLittleMemoryCursor * withSpecification(UInt32 maxSegmentSize, + UInt32 maxNumSegments); + +/*! @function getPhysicalSegments + @abstract Generates a little endian physical scatter/gather list from a + given mbuf. + @param packet The mbuf packet. + @param vector Pointer to an array of IOPhysicalSegments for the output + physical scatter/gather list. + @param numVectorSegments Maximum number of IOPhysicalSegments accepted. + @result Returns the number of segments that were filled in, or + 0 if an error occurred. +*/ + + UInt32 getPhysicalSegments(mbuf_t packet, + struct IOPhysicalSegment * vector, + UInt32 numVectorSegments = 0); + +/*! @function getPhysicalSegmentsWithCoalesce + @abstract Generates a little endian physical scatter/gather list from a + given mbuf. + @discussion Generate a little endian physical scatter/gather list from a + given mbuf. Coalesce mbuf chain when the number of segments in the + scatter/gather list exceeds numVectorSegments. + @param packet The mbuf packet. + @param vector Pointer to an array of IOPhysicalSegments for the output + physical scatter/gather list. + @param numVectorSegments Maximum number of IOPhysicalSegments accepted. + @result Returns the number of segments that were filled in, or + 0 if an error occurred. +*/ + + UInt32 getPhysicalSegmentsWithCoalesce(mbuf_t packet, + struct IOPhysicalSegment * vector, + UInt32 numVectorSegments = 0); +}; + +#ifdef __ppc__ + +struct IODBDMADescriptor; + +//=========================================================================== +//=========================================================================== + +/*! @class IOMbufDBDMAMemoryCursor + @abstract An IOMbufMemoryCursor subclass that outputs a vector of + IODBDMADescriptors. +*/ + +class IOMbufDBDMAMemoryCursor : public IOMbufMemoryCursor +{ + OSDeclareDefaultStructors(IOMbufDBDMAMemoryCursor) + +public: + +/*! @function withSpecification + @abstract Factory function that creates and initializes an + IOMbufDBDMAMemoryCursor in one operation. + @discussion See also IOMbufMemoryCursor::initWithSpecification. + @param maxSegmentSize Maximum allowable size for one segment. + @param maxNumSegments Maximum number of segments. + @result Returns a new mbuf cursor if successfully created and initialized, + 0 otherwise. +*/ + + static IOMbufDBDMAMemoryCursor * withSpecification(UInt32 maxSegmentSize, + UInt32 maxNumSegments); + +/*! @function getPhysicalSegments + @abstract Generates a DBDMA descriptor list from a given mbuf. + @param packet The mbuf packet. + @param vector Pointer to an array of IODBDMADescriptor for the output list. + @param numVectorSegments Maximum number of IODBDMADescriptors accepted. + @result Returns the number of segments that were filled in, or + 0 if an error occurred. +*/ + + UInt32 getPhysicalSegments(mbuf_t packet, + struct IODBDMADescriptor *vector, + UInt32 numVectorSegments = 0); + +/*! @function getPhysicalSegmentsWithCoalesce + @abstract Generates a DBDMA descriptor list from a given mbuf. + @discussion Generate a DBDMA descriptor list from a given mbuf. + Coalesce mbuf chain when the number of elements in the list exceeds + numVectorSegments. + @param packet The mbuf packet. + @param vector Pointer to an array of IODBDMADescriptor for the output list. + @param numVectorSegments Maximum number of IODBDMADescriptors accepted. + @result Returns the number of segments that were filled in, or + 0 if an error occurred. +*/ + + UInt32 getPhysicalSegmentsWithCoalesce(mbuf_t packet, + struct IODBDMADescriptor * vector, + UInt32 numVectorSegments = 0); +}; + +#endif /* __ppc__ */ + +#endif /* !_IOKIT_NETWORK_IOMBUFMEMORYCURSOR_H */ + diff --git a/QualcommWireless/include/IOKit/network/IONetworkController.h b/QualcommWireless/include/IOKit/network/IONetworkController.h new file mode 100644 index 0000000..21be744 --- /dev/null +++ b/QualcommWireless/include/IOKit/network/IONetworkController.h @@ -0,0 +1,1716 @@ +/* + * Copyright (c) 1998-2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IONETWORKCONTROLLER_H +#define _IONETWORKCONTROLLER_H + +#include + +#ifndef __MAC_OS_X_VERSION_MIN_REQUIRED +#error "Missing macOS target version" +#endif + +/*! @defined kIONetworkControllerClass + @abstract The name of the IONetworkController class. */ + +#define kIONetworkControllerClass "IONetworkController" + +/*! @defined kIOVendor + @abstract A property of IONetworkController objects. + @discussion The kIOVendor property is a property of IONetworkController objects. It has an OSString value that describes the vendor of the network controller. */ + +#define kIOVendor "IOVendor" + +/*! @defined kIOModel + @abstract A property of IONetworkController objects. + @discussion The kIOModel property is a property of IONetworkController objects. It has an OSString value that describes the model of the network controller. */ + +#define kIOModel "IOModel" + +/*! @defined kIORevision + @abstract A property of IONetworkController objects. + @discussion The kIORevision property is a property of IONetworkController objects. It has an OSString value that describes the revision level of the network controller. */ + +#define kIORevision "IORevision" + +/*! @defined kIOFeatures + @abstract A property of IONetworkController objects. + @discussion The kIOFeatures property is a property of IONetworkController objects. It has an OSNumber value that describes generic features defined by IONetworkController that are supported by the + network controller. */ + +#define kIOFeatures "IOFeatures" + +/*! @defined kIOMediumDictionary + @abstract A property of IONetworkController objects. + @discussion The kIOMediumDictionary property is a property of IONetworkController + objects. It has an OSDictionary value that is a container for the + collection of IONetworkMedium objects that represent the media + types supported by the network controller. + Each entry in the dictionary is a key/value pair consisting of + the medium name, and a dictionary value that contains the + properties for that medium entry. */ + +#define kIOMediumDictionary "IOMediumDictionary" + +/*! @defined kIODefaultMedium + @abstract A property of IONetworkController objects. + @discussion The kIODefaultMedium property is a property of IONetworkController + objects. It has an OSString value that describes the name of the + default medium. This definition may change or disappear in the + future. */ + +#define kIODefaultMedium "IODefaultMedium" + +/*! @defined kIOSelectedMedium + @abstract A property of IONetworkController objects. + @discussion The kIOSelectedMedium property is a property of IONetworkController + objects. It has an OSSymbol value that describes the name of the + current selected medium. This name can be used as a key into the + medium dictionary to gather additional information about the + selected medium. */ + +#define kIOSelectedMedium "IOSelectedMedium" + +/*! @defined kIOActiveMedium + @abstract A property of IONetworkController objects. + @discussion The kIOActiveMedium property is a property of IONetworkController + objects. It has an OSSymbol value that describes the name of the + active medium. This is the name of the medium where an active + link has been established. This name can be used as a key into + the medium dictionary to gather additional information about the + active medium. */ + +#define kIOActiveMedium "IOActiveMedium" + +/*! @defined kIOLinkSpeed + @abstract A property of IONetworkController objects. + @discussion The kIOLinkSpeed property is a property of IONetworkController + objects. It has an OSNumber value that describes the speed of the + link established over the active medium in bits per second. */ + +#define kIOLinkSpeed "IOLinkSpeed" + +/*! @defined kIOLinkStatus + @abstract A property of IONetworkController objects. + @discussion The kIOLinkStatus property is a property of IONetworkController + objects. It has an OSNumber value that describes the current network + link status. See IONetworkMedium for the definition of the link + status bits. */ + +#define kIOLinkStatus "IOLinkStatus" + +/*! @defined kIOLinkData + @abstract A property of IONetworkController objects. + @discussion The kIOLinkData property is a property of IONetworkController + objects. It has an OSData value that contains additional information + describing the active link that was established. + Its interpretation is not defined. */ + +#define kIOLinkData "IOLinkData" + +/*! @defined kIOPacketFilters + @abstract A property of IONetworkController objects. + @discussion The kIOPacketFilters property is a property of IONetworkController + objects. It has an OSDictionary value that describes the entire + set of packet filters supported by the controller. Each entry + in the dictionary is a key/value pair consisting of the filter + group name, and an OSNumber describing the set of supported + filters for that group. */ + +#define kIOPacketFilters "IOPacketFilters" + +/*! @defined kIOMACAddress + @abstract A property of IONetworkController objects. + @discussion The kIOMACAddress property is a property of IONetworkController + objects. It has an OSData value that describes the hardware + MAC (media access controller) address, or station address, + of the network controller. */ + +#define kIOMACAddress "IOMACAddress" + +/*! @defined kIOMaxPacketSize + @abstract A property of IONetworkController objects. + @discussion The kIOMaxPacketSize property is a property of IONetworkController + objects. It has an OSNumber value that describes the maximum + packet size supported by the controller. */ + +#define kIOMaxPacketSize "IOMaxPacketSize" + +/*! @defined kIOMinPacketSize + @abstract A property of IONetworkController objects. + @discussion The kIOMinPacketSize property is a property of IONetworkController + objects. It has an OSNumber value that describes the minimum + packet size supported by the controller. */ + +#define kIOMinPacketSize "IOMinPacketSize" + +/*! @defined kIONetworkFilterGroup + @abstract The name assigned to the standard network filter group. */ + +#define kIONetworkFilterGroup "IONetworkFilterGroup" + +/*! @enum StandardPacketFilters + @abstract All standard packet filters. + @discussion Each filter will allow the reception of certain class of packets + depending on its destination MAC address. + @constant kIOPacketFilterUnicast Reception of unicast packets. + @constant kIOPacketFilterBroadcast Reception of broadcast packets. + @constant kIOPacketFilterMulticast Reception of multicast packets + addressed to a set of multicast addresses. + @constant kIOPacketFilterMulticastAll Reception of all multicast + packets. + @constant kIOPacketFilterPromiscuous Reception of all packets. + @constant kIOPacketFilterPromiscuousAll Reception of all packets, + including bad packets. */ + +enum { + kIOPacketFilterUnicast = 0x1, + kIOPacketFilterBroadcast = 0x2, + kIOPacketFilterMulticast = 0x10, + kIOPacketFilterMulticastAll = 0x20, + kIOPacketFilterPromiscuous = 0x100, + kIOPacketFilterPromiscuousAll = 0x200 +}; + +/*! @enum Network Feature Flags + @abstract Feature flags returned by the getFeatures() method. + @constant kIONetworkFeatureNoBSDWait Set this bit in the value + returned by getFeatures() to disable the automatic wait for + "IOBSD" resource by the IONetworkController::start() method. + @constant kIONetworkFeatureHardwareVlan Set this bit in the value + returned by getFeatures() to indicate the controller supports hardware + stripping and stuffing of 802.1q vlan tags. If the controller supports + this feature it must enable it when initializing so that all received + packets delivered to higher layers have the tag stripped. The controller + should use setVlanTag() to provide the tag information out of band. + @constant kIONetworkFeatureSoftwareVlan Set this bit in the value + returned by getFeatures() to indicate that the controller can support software + based vlan by transmitting and receiving packets 4 bytes longer that normal. + @constant kIONetworkFeatureMultiPages Set this bit if the driver is + capable of handling packets coming down from the network stack that + reside in virtually, but not in physically contiguous span of the + external mbuf clusters. In this case, the data area of a packet in + the external mbuf cluster might cross one or more physical pages that + are disjoint, depending on the interface MTU and the packet size. + Such a use of larger than system page size clusters by the network + stack is done for better system efficiency. Drivers that utilize the + IOMbufNaturalMemoryCursor with the getPhysicalSegmentsWithCoalesce + interfaces and enumerate the list of vectors should set this flag + for possible gain in performance during bulk data transfer. + @constant kIONetworkFeatureTSOIPv4 Set this bit to advertise support + for TCP/IPv4 segmentation offload. + @constant kIONetworkFeatureTSOIPv6 Set this bit to advertise support + for TCP/IPv6 segmentation offload. + @constant kIONetworkFeatureTransmitCompletionStatus Set this bit to + advertise the capability to report per-packet transmit completion status. + See IONetworkInterface::reportTransmitCompletionStatus. + @constant kIONetworkFeatureHWTimeStamp Set this bit to advertise + the capability to compute per-packet timestamp in hardware. + @constant kIONetworkFeatureHWTimeStamp Set this bit to advertise + the capability to compute per-packet timestamp in software. +*/ + +enum { + kIONetworkFeatureNoBSDWait = 0x001, + kIONetworkFeatureHardwareVlan = 0x002, + kIONetworkFeatureSoftwareVlan = 0x004, + kIONetworkFeatureMultiPages = 0x008, + kIONetworkFeatureTSOIPv4 = 0x010, + kIONetworkFeatureTSOIPv6 = 0x020, + kIONetworkFeatureTransmitCompletionStatus = 0x040, + kIONetworkFeatureHWTimeStamp = 0x080, + kIONetworkFeatureSWTimeStamp = 0x100, + kIONetworkFeatureLRO = 0x200 +}; + +#ifdef KERNEL +#ifdef __cplusplus + +#include +#include +#include +#include + +class IOCommandGate; +class IOOutputQueue; +class IONetworkMedium; + +/*! @typedef IOPacketBufferConstraints + @discussion Constraint parameters, specified by a driver, + for the data buffer in a packet mbuf. This is observed by + allocatePacket() to satisfy the stated requirements. + @field alignStart Starting address byte alignment. + @field alignLength Buffer length byte alignment. */ + +typedef struct { + UInt32 alignStart; + UInt32 alignLength; + UInt32 reserved[6]; +} IOPacketBufferConstraints; + +// Some frequently used alignment constants. +// +enum { + kIOPacketBufferAlign1 = 1, + kIOPacketBufferAlign2 = 2, + kIOPacketBufferAlign4 = 4, + kIOPacketBufferAlign8 = 8, + kIOPacketBufferAlign16 = 16, + kIOPacketBufferAlign32 = 32 +}; + +/*! @const gIONetworkFilterGroup + @discussion gIONetworkFilterGroup is an OSSymbol object that contains + the name of the standard network filter group as defined by + kIONetworkFilterGroup. */ + +extern const OSSymbol * gIONetworkFilterGroup; + +/*! @class IONetworkController + @abstract Implements the framework for a generic + network controller. + @discussion A subclass of IONetworkController must provide + additional functionality specific for a particular networking type. + In addition, the driver must implement (override) a basic set of + hardware dependent methods to create a working driver. + + IONetworkController attaches itself to the data link layer (DLIL) via + an IONetworkInterface object. A controller object without a companion + interface is not accessible to the networking system. The controller + interacts with DLIL by calling methods defined by the interface object. + And conversely, DLIL will issue commands and packets to the controller + through the interface object. + + IONetworkController will create an IOCommandGate and attach this + event source to an IOWorkLoop object. All commands sent from the + interface object are handled through the IOCommandGate object, + which will serialize access to the controller. Outbound packets sent + from the interface to the controller have no implicit serialization. + Drivers must implement an output function that is thread safe, or use + an IOOutputQueue object which will provide a serialization model. + + Note: IONetworkController internally uses some private messaging constants + in the sys_iokit | sub_iokit_networking range defined in + "IONetworkControllerPrivate.h". If you create a client for your controller + (for example an IOUserClient), and it overrides the IOService::message + method, your client may receive these messages. It should ignore these + messages and pass them to super::message() + */ + +class IONetworkController : public IOService +{ + OSDeclareAbstractStructors( IONetworkController ) + +private: + + IOWorkLoop * _workLoop; + IOCommandGate * _cmdGate; + IOOutputQueue * _outputQueue; + OSSet * _clientSet; + OSCollectionIterator * _clientSetIter; + OSObject * _cmdClient; + UInt32 _alignStart; + UInt32 _alignLength; + UInt32 _alignPadding; + bool _propertiesPublished; + IOLock * _mediumLock; + IODebuggerLockState _debugLockState; + SInt32 _debugLockCount; + OSNumber * _linkStatus; + OSNumber * _linkSpeed; + const OSData * _lastLinkData; + const OSSymbol * _lastActiveMediumName; + const OSSymbol * _lastCurrentMediumName; + mbuf_t _freeList; + + struct ExpansionData { }; + /*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData * _reserved; + + + bool _broadcastEvent(UInt32 type, void * data = 0); + + static void debugRxHandler(IOService * handler, + void * buffer, + UInt32 * length, + UInt32 timeout); + + static void debugTxHandler(IOService * handler, + void * buffer, + UInt32 length); + + static UInt32 debugLinkStatusHandler(IOService * handler); + static bool debugSetModeHandler(IOService * handler, bool active); + + static IOReturn executeCommandAction(OSObject * owner, + void * arg0, + void * arg1, + void * arg2, + void * arg3); + + static IOReturn handleCommand(void * target, + void * param0, + void * param1, + void * param2, + void * param3); + +public: + +/*! @function init + @abstract Initializes the IONetworkController object. + @discussion Instance variables are initialized, then super::init() + is called. + @param properties A dictionary object containing a property table + associated with this instance. + @result Returns true on success, false otherwise. +*/ + + virtual bool init(OSDictionary * properties) APPLE_KEXT_OVERRIDE; + +/*! @function start + @abstract Starts the network controller. + @discussion After the controller driver has successfully matched + to a provider, this method is called to start the network controller. + IONetworkController will allocate resources and gather controller + properties in its implementation. No I/O will be performed until + the subclass tries to attach a client object. A driver must override + this method, and call super::start() at the beginning of its own + implementation. Then check the return value to make sure that its + superclass was started successfully before proceeding. Tasks that + are usually performed by a driver's start method are: resource + allocation, hardware initialization, allocation of IOEventSources + and attaching them to a workloop, publishing a medium dictionary, + and finally, attaching an interface object when it is ready to + handle client requests. + @param provider The provider that the controller was matched + (and attached) to. + @result Returns true on success, false otherwise. +*/ + + virtual bool start(IOService * provider) APPLE_KEXT_OVERRIDE; + +/*! @function stop + @abstract Stops the network controller. + @discussion The counterpart of start(). The controller has been + instructed to stop running. The stop() method should release + resources and undo actions performed by the start() method. + Subclasses must override this method and call super::stop() + at the end of its implementation. + @param provider The provider that the controller was matched + (and attached) to. */ + + virtual void stop(IOService * provider) APPLE_KEXT_OVERRIDE; + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_6 +/*! @function message + @abstract Receives messages delivered from an attached provider. + @discussion Handles the kIOMessageDeviceSignaledWakeup message + from a provider identifying the IONetworkController as the wakeup source. + @param type A type defined in IOMessage.h. + @param provider The provider from which the message originates. + @param argument An argument defined by the message type. + @result An IOReturn code defined by the message type. +*/ + + virtual IOReturn message( + UInt32 type, IOService * provider, void * argument ) APPLE_KEXT_OVERRIDE; +#endif + +/*! @typedef IONetworkController::Action + @discussion Definition of a C function that can be called + through executeCommand(). + @param target The first argument passed to action. + @param param0 Action parameter 0. + @param param1 Action parameter 1. + @param param2 Action parameter 2. + @param param3 Action parameter 3. */ + + typedef IOReturn (*Action)(void * target, void * param0, + void * param1, + void * param2, + void * param3); + +/*! @function executeCommand + @abstract Makes a C function call through the command gate. + @discussion This method makes a call to a C function that will be synchronized + with the workloop thread, and any other threads that are called + with the workloop's gate closed. + @param client The client requesting the action. This parameter is not + passed to the function. + @param action Pointer to a C function to be executed. + @param target The first parameter in the action callout. + @param param0 Action parameter 0. + @param param1 Action parameter 1. + @param param2 Action parameter 2. + @param param3 Action parameter 3. + @result Returns the value returned by the action. +*/ + + virtual IOReturn executeCommand(OSObject * client, + Action action, + void * target, + void * param0 = 0, + void * param1 = 0, + void * param2 = 0, + void * param3 = 0); + +/*! @function outputPacket + @abstract Transmits an output packet. + @discussion If an IOOutputQueue was created by createOutputQueue(), + then this method will be called by the output queue object. + Otherwise, an interface object will call this method directly when + it receives an output packet from the data link layer. + + There is no upper limit on the number of mbufs, hence the number of + memory fragments, in the mbuf chain provided. Drivers must be able to + handle cases when the mbuf count might exceed the limit supported by their + DMA engines, and perform coalescing to copy the various memory fragments + into a lesser number of fragments. This complexity can be hidden from + the driver when an IOMbufMemoryCursor is used, which is able to convert + an mbuf chain into a physical address scatter-gather list that will not + exceed a specified number of physically contiguous memory segments. + See IOMbufMemoryCursor. + + The implementation in IONetworkController performs no useful action + and will drop all packets. A driver must override this method and + process the output packet provided. The implementation in the driver + must not block, since this may cause the network stack to be reentered + from an unsafe point. + @param mbuf_t An mbuf chain containing the output packet to be sent on + the network. + @param param A parameter provided by the caller. + @result Returns a return code defined by the caller. +*/ + + virtual UInt32 outputPacket(mbuf_t m, void * param); + +/*! @function getFeatures + @abstract Reports generic features supported by the controller and/or + the driver. + @result This method will always return 0. Subclasses may override + this method and return a bit mask of all supported features. */ + + virtual UInt32 getFeatures() const; + +/*! @function newVendorString + @result Returns a string describing the vendor of the network controller. + The caller is responsible for releasing the string object returned. */ + + virtual const OSString * newVendorString() const; + +/*! @function newModelString + @result Returns a string describing the model of the network controller. + The caller is responsible for releasing the string object returned. */ + + virtual const OSString * newModelString() const; + +/*! @function newRevisionString + @result Returns a string describing the hardware revision of the + network controller. The caller is responsible for releasing the + string object returned. */ + + virtual const OSString * newRevisionString() const; + +/*! @function getSelectedMedium + @abstract Gets the current selected medium. + @discussion If the driver has previously called setSelectedMedium() + to indicate its current media selection, then this method will return + that medium object. Otherwise, the driver's property table is + consulted and a default medium property is examined, and the + corresponding entry in the medium dictionary is returned. + @result Returns the current selected medium, the default medium, or 0. +*/ + + virtual const IONetworkMedium * getSelectedMedium() const; + const IONetworkMedium * getCurrentMedium() const; + +/*! @function getMediumDictionary + @abstract Returns the medium dictionary published by the driver. + @discussion Returns the medium dictionary published by the driver + through publishMediumDictionary(). Use copyMediumDictionary() to + create and get a copy of the medium dictionary. + @result Returns the published medium dictionary, or 0 if the driver has not + yet published a medium dictionary through publishMediumDictionary(). +*/ + + virtual const OSDictionary * getMediumDictionary() const; + +/*! @function copyMediumDictionary + @abstract Returns a copy of the medium dictionary published by the + driver. + @discussion The caller is responsible for releasing the dictionary + object returned. Use getMediumDictionary() to get a reference to the + published medium dictionary instead of creating a copy. + @result Returns a copy of the medium dictionary, or 0 if the driver has not + published a medium dictionary through publishMediumDictionary(). +*/ + + virtual OSDictionary * copyMediumDictionary() const; + +/*! @function getOutputHandler + @abstract Gets the address of the method designated to handle output + packets for the network controller. + @result Returns a pointer to the outputPacket() method. +*/ + + virtual IOOutputAction getOutputHandler() const; + +/*! @function doEnable + @abstract Makes a synchronized call to enable() through executeCommand(). + @discussion Do not use this method, it may be removed in the future. + See enable(). +*/ + + virtual IOReturn doEnable(IOService * client); + +/*! @function doDisable + @abstract Makes a synchronized call to disable() through executeCommand(). + @discussion Do not use this method, it may be removed in the future. + See disable(). +*/ + + virtual IOReturn doDisable(IOService * client); + +/*! @function getCommandGate + @abstract Gets the IOCommandGate object created by IONetworkController. + @discussion When IONetworkController is started, an IOCommandGate object + is instantiated and attached to the workloop returned by getWorkLoop(). + This IOCommandGate object is used internally to synchronize client + commands handled through executeCommand(). Subclasses that need an + IOCommandGate should try to reuse the object returned by this method, + rather than creating a new instance. See IOCommandGate documentation. + @result Returns the IOCommandGate object created by IONetworkController. +*/ + + virtual IOCommandGate * getCommandGate() const; + +/*! @function getHardwareAddress + @abstract Gets the network controller's permanent hardware/station + address. + @discussion This method call is synchronized by the workloop's gate. + @param addr The buffer where the controller's hardware address should + be stored. + @param inOutAddrBytes The size of the address buffer provided by the + client, and replaced by this method with the actual size of + the hardware address in bytes. + @result Returns kIOReturnSuccess on success, or an error otherwise. +*/ + + virtual IOReturn getHardwareAddress(void * addr, + UInt32 * inOutAddrBytes) = 0; + +/*! @function setHardwareAddress + @abstract Sets or changes the station address used by the network + controller. + @discussion This method call is synchronized by the workloop's gate. + @param addr The buffer containing the hardware address provided by + the client. + @param addrBytes The size of the address buffer provided by the + client in bytes. + @result Returns kIOReturnSuccess on success, or an error otherwise. +*/ + + virtual IOReturn setHardwareAddress(const void * addr, + UInt32 addrBytes) = 0; + +/*! @function enable + @abstract Handles an enable request from a client. + @discussion This method handles an enable request from a client. A client will call + enable after it has opened the controller, and before it starts to use + the controller to send and to receive packets over the network. The + client object provided is typecasted using OSDynamicCast, and depending + on whether the client is an IOKernelDebugger or an IONetworkInterface, + then an overloaded enable method that takes a more specific argument + type is called. If the client matches neither type, then + kIOReturnBadArgument is returned. A driver has the option of overriding + this base enable method, or the overloaded form. This method call is + synchronized by the workloop's gate. + @param client The client object requesting the enable. + @result Returns the return value from the overloaded enable() method, or + kIOReturnBadArgument if the client type is unknown. +*/ + + virtual IOReturn enable(IOService * client); + +/*! @function disable + @abstract Handles a disable request from a client. + @discussion This method handles a disable request from a client. A client will call + disable if it has previously enabled the controller, and it no longer + needs to transport packets or perform I/O using the controller. + The client object is typecasted using OSDynamicCast, and depending on + whether the client is an IOKernelDebugger or an IONetworkInterface, + then an overloaded disable method that takes a more specific argument + type is called. If the client matches neither type, then + kIOReturnBadArgument is returned. A driver has the option of overriding + this base disable method, or the overloaded form. This method call is + synchronized by the workloop's gate. + @param client The client object requesting the disable. + @result Returns the return from the overloaded disable() method, or + kIOReturnBadArgument if the client type is unknown. +*/ + + virtual IOReturn disable(IOService * client); + +/*! @function setMaxPacketSize + @abstract A client request to change the maximum packet size. + @discussion This method call is synchronized by the workloop's gate. + @param maxSize The new maximum packet size. + @result Returns kIOReturnUnsupported. Drivers may override this method + and return either kIOReturnSuccess to indicate that the new size + was accepted and is in effect, or an error code to indicate failure. +*/ + + virtual IOReturn setMaxPacketSize(UInt32 maxSize); + +/*! @function getMaxPacketSize + @abstract Gets the maximum packet size supported by the controller. + @param maxSize Pointer to the return value. + @result Returns kIOReturnSuccess on success, or an error code otherwise. +*/ + + virtual IOReturn getMaxPacketSize(UInt32 * maxSize) const = 0; + +/*! @function getMinPacketSize + @abstract Gets the minimum packet size supported by the controller. + @param minSize Pointer to the return value. + @result Returns kIOReturnSuccess on success, or an error code otherwise. +*/ + + virtual IOReturn getMinPacketSize(UInt32 * minSize) const = 0; + +/*! @function selectMedium + @abstract A client request to change the medium selection. + @discussion This method is called when a client issues a command + for the controller to change its current medium selection. + The implementation must call setSelectedMedium() after the change + has occurred. This method call is synchronized by the workloop's + gate. + @param medium An entry from the published medium dictionary that + represents the selection chosen by the client. + @result Returns kIOReturnUnsupported. Drivers may override this method and + return kIOReturnSuccess if the selection was successful, + or an error code otherwise. +*/ + + virtual IOReturn selectMedium(const IONetworkMedium * medium); + +/*! @function selectMediumWithName + @abstract A client request to change the medium selection. + @discussion This method is called when a client issues a command + for the controller to change its current medium selection. + This implementation will look for an entry in the medium + dictionary published by the driver that is associated with the + key given. If a match is found, then selectMedium() is called to + perform the selection, otherwise an error is reported back to the + client. Subclasses should override selectMedium() and not this + method. This method call is synchronized by the workloop's gate. + @param mediumName An OSSymbol object that describes the name of the + new medium selected by the client. + @result Returns the return from selectMedium() if a matching entry was found + from the medium dictionary. Returns kIOReturnUnsupported if a medium + dictionary does not exist, or kIOReturnBadArgument if the name given + does not match any entry in the medium dictionary. +*/ + + virtual IOReturn selectMediumWithName(const OSSymbol * mediumName); + +/*! @function getPacketFilters + @abstract Gets the set of packet filters supported by the network + controller for the given filter group. + @discussion A subclass must implement this method and report the + set of filters that are supported for the given filter group. + This method call is synchronized by the workloop's gate. + @param group The name of the filter group. + @param filters Pointer to the mask of supported filters returned by + this method. + @result Returns kIOReturnSuccess on success, or an error to indicate a + failure to discover the set of supported filters. +*/ + + virtual IOReturn getPacketFilters(const OSSymbol * group, + UInt32 * filters) const = 0; + +/*! @function enablePacketFilter + @abstract Enables one of the supported packet filters from the + given filter group. + @discussion A client will call this method to enable a supported filter + from the filter group specified. If the client wishes to enable more + than one filter, it must call this method multiple times to enable the + desired set of filters. This method call is synchronized by the + workloop's gate. + @param group The name of the filter group containing the filter to be + enabled. + @param aFilter The filter to enable. + @param enabledFilters All filters currently enabled by the client. + @param options Optional flags for the enable request. + @result Returns kIOReturnSuccess on success, or an error otherwise. +*/ + + virtual IOReturn enablePacketFilter(const OSSymbol * group, + UInt32 aFilter, + UInt32 enabledFilters, + IOOptionBits options = 0) = 0; + +/*! @function disablePacketFilter + @abstract Disables a packet filter that is currently enabled from the + given filter group. + @discussion After a supported filter has been successfully enabled, + a client can call this method to disable that filter. This method call + is synchronized by the workloop's gate. + @param group The name of the filter group containing the filter to be + disabled. + @param aFilter The filter to disable. + @param enabledFilters All filters currently enabled by the client. + @param options Optional flags for the disable request. + @result Returns kIOReturnSuccess on success, or an error otherwise. +*/ + + virtual IOReturn disablePacketFilter(const OSSymbol * group, + UInt32 aFilter, + UInt32 enabledFilters, + IOOptionBits options = 0) = 0; + +/*! @function getOutputQueue + @abstract Gets the IOOutputQueue object created by createOutputQueue(). + @result Returns a reference to the output queue object created by + createOutputQueue(). +*/ + + virtual IOOutputQueue * getOutputQueue() const; + +/*! @function getPacketBufferConstraints + @abstract Gets the controller's packet buffer constraints. + @discussion Called by start() to obtain the constraints on the + memory buffer for each mbuf packet allocated through allocatePacket(). + Drivers can override this method to specify the buffer constraints + imposed by their bus master hardware. Note that outbound packets, + those that originate from the network stack, are not currently + subject to the constraints reported here. + @param constraints A pointer to an IOPacketBufferConstraints + structure that this method is expected to initialize. + See IOPacketBufferConstraints structure definition. +*/ + + virtual void getPacketBufferConstraints( + IOPacketBufferConstraints * constraints) const; + +/*! @function allocatePacket + @abstract Allocates a packet with a data buffer that is larger than + or equal to the size specified. + @discussion This method will always return a single mbuf unless the + size requested (plus the alignment padding) is greater than MCLBYTES. + The data buffer for the mbuf (or an mbuf chain) returned is aligned + according to the constraints reported by getPacketBufferConstraints(). + The length fields in each mbuf returned are set by this method, thus + allowing the mbuf to be passed directly to an IOMbufMemoryCursor object + in order to convert the mbuf to a physical address scatter-gather list. + @param size The minimum size of the data buffer for the mbuf + packet allocated. + @result Returns an mbuf packet, or 0 if allocation failed. +*/ + + virtual mbuf_t allocatePacket(UInt32 size); + +/*! @function copyPacket + @abstract Allocates a new packet, containing data copied from an + existing source packet. + @discussion The source packet is not modified by this method. + @param m The source packet. + @param size The number of bytes to copy. If set to 0, then the + entire data buffer from the source packet is copied. + @result Returns a new packet containing the same data as the source packet. +*/ + + virtual mbuf_t copyPacket(const mbuf_t m, UInt32 size = 0); + +/*! @function replacePacket + @abstract Allocates a new packet to replace an existing packet, the + existing packet is then returned. + @param mp A handle to the existing packet. + @param size If size is 0, then the new packet shall have the same buffer + size as the original packet that is being replaced. Otherwise, the new + packet shall have the buffer size specified by this value. + @result If packet allocation was successful, then a replacement will + take place and the original packet will be returned. Otherwise, 0 + is returned, and the original packet will be left untouched. +*/ + + virtual mbuf_t replacePacket(mbuf_t * mp, UInt32 size = 0); + +/*! @function replaceOrCopyPacket + @abstract A helper method that combines the functionality of + copyPacket() and replacePacket() to process a packet containing + a received frame. + @discussion This method will either make a copy or replace the existing + packet, whichever is more time efficient. Packets containing small frames + are copied, otherwise they are replaced. If replaced, then the existing + packet is returned, and a new packet with the same buffer size is created + to take its place. If copied, the existing packet is left intact, while a + copy is returned that will hold a copy of the data from the source packet. + @param mp A handle to the existing packet that may be replaced. + @param length The number of bytes received held in the packet. + Must be greater than zero. + @param replaced Pointer to a return value that is set to true to indicate + that the existing packet was replaced, or false to indicate that the + existing packet was not replaced, and a copy was created. + @result Returns a replacement or a copy of the existing packet, or 0 if packet + allocation failed. +*/ + + virtual mbuf_t replaceOrCopyPacket(mbuf_t * mp, + UInt32 length, + bool * replaced); + + enum { + kDelayFree = 0x01 + }; + +/*! @function freePacket + @abstract Releases the packet given back to the free pool. + @param mbuf_t The packet to be freed. + @param options When kDelayFree option is set, then the packet + provided to this function will be queued on the free packet queue. + A subsequent call to releaseFreePackets() will release all queued + packets by making a single BSD function call. Without the kDelayFree + option, the packet provided will be released immediately. +*/ + + virtual void freePacket(mbuf_t, IOOptionBits options = 0); + +/*! @function releaseFreePackets + @abstract Releases all packets held in the free packet queue. + @discussion The free packet queue is not protected by a lock. This + function must be called in a single-threaded manner with respect to + all calls to freePacket() with the kDelayFree option set. + @result Returns the number of packets queued and released. +*/ + + virtual UInt32 releaseFreePackets(); + +/*! @enum TCP/IP Checksums + @abstract TCP/IP checksums that may be supported by the + hardware. + @constant kChecksumFamilyTCPIP A value that describes the collection + of TCP/IP checksums. + @constant kChecksumIP An IP header checksum. + @constant kChecksumTCP A TCP checksum that covers the TCP header and TCP + data. + @constant kChecksumUDP A UDP checksum that covers the UDP header and UDP + data. + @constant kChecksumTCPIPv6 A TCP checksum that covers the IPv6 pseudo header, + TCP header and TCP data. + @constant kChecksumUDPIPv6 A UDP checksum that covers the IPv6 pseudo header, + UDP header and UDP data. + @constant kChecksumTCPNoPseudoHeader A TCP checksum that covers the TCP + header and the TCP data, but the pseudo header is not included in the + checksum computation. A partial 16-bit checksum value must be provided + to allow the protocol stacks to calculate and verify the final checksum. + This type of checksum is not currently supported on the output path. + @constant kChecksumUDPNoPseudoHeader A UDP checksum that covers the UDP + header and the UDP data, but the pseudo header is not included in the + checksum computation. A partial 16-bit checksum value must be provided + to allow the protocol stacks to calculate and verify the final checksum. + This type of checksum is not currently supported on the output path. + @constant kChecksumTCPSum16 The hardware has a simple checksum engine + that can perform a TCP style ones complement sum of 16-bit words over + a certain range of bytes in a packet. The hardware does not have the + ability to scan for IP or TCP headers, and the driver must pass/get + additional parameter(s) to or from the protocol stack to coordinate + the checksumming effort. +*/ + + enum { + kChecksumFamilyTCPIP = 0x00000001, + kChecksumIP = 0x0001, + kChecksumTCP = 0x0002, + kChecksumUDP = 0x0004, + kChecksumTCPIPv6 = 0x0020, + kChecksumUDPIPv6 = 0x0040, + kChecksumTCPNoPseudoHeader = 0x0100, + kChecksumUDPNoPseudoHeader = 0x0200, + kChecksumTCPSum16 = 0x1000 + }; + +/*! @function getChecksumSupport + @abstract Gets checksums that are supported by the network controller for + the given checksum family. + @discussion A network controller that is capable of inserting and verifying + checksums on output and input packets, should override this method and + advertise its capability in order to assist or offload the software checksum + calculations performed by the protocol stacks. + @param checksumMask A pointer to the mask of supported checksums returned + by this method. + @param checksumFamily A value that specifies the checksum family. + @param isOutput Set to true to query the support for checksum insertion on + output packets, or false to query the support for checksum verification + on input packets. Controllers that have symmetric hardware checksum support + can return a fixed checksum mask value, and ignore this argument. + @result Default return is kIOReturnUnsupported. Controllers that override + this method must return kIOReturnSuccess. Any other return value will be + interpretated as a lack of checksum support, regardless of the value + returned through the first argument. +*/ + + virtual IOReturn getChecksumSupport( UInt32 * checksumMask, + UInt32 checksumFamily, + bool isOutput ); + +/*! @function setChecksumResult + @abstract Encodes a received packet with the checksum result reported + by the hardware. + @discussion A network controller that can verify the checksum(s) for a + received packet, should call this method to encode the result on the + packet, before passing it up towards the protocol stacks. + @param packet An mbuf containing a packet that has been checksummed by + the hardware. + @param checksumFamily A value that specifies the checksum family. + @param resultMask A mask of all checksums that were checked or computed. + Setting a bit implies that the driver is able to report the result of + the checksum computation, by asserting the validity of the checksum, + or by returning a partial checksum value. + @param validMask A mask of all checksums are were computed and verified + by the hardware as valid. Certain types of checksum performed by the + hardware are inheritely incomplete, and therefore should never be marked + as valid. A checksum cannot be marked valid unless it has also been + checked. + @param param0 Optional parameter 0, defaults to 0. + @param param1 Optional parameter 1, defaults to 0. + @result Returns true if the checksum family is valid and the packet has been + encoded with the checksum result provided, false otherwise. +*/ + + virtual bool setChecksumResult( mbuf_t packet, + UInt32 checksumFamily, + UInt32 resultMask, + UInt32 validMask, + UInt32 param0 = 0, + UInt32 param1 = 0 ); + +/*! @function getChecksumDemand + @abstract Fetches the demand for hardware checksum computation and insertion + for the given packet before it is transmitted on the network. + @discussion A network controller that can insert a checksum for output + packets must call this method to obtain the set of checksums that it must + compute, and insert into the appropriate fields in the given output packet. + @param packet An mbuf containing a packet that may be missing one or more + checksums in the specified checksum family. + @param checksumFamily A value that specifies the checksum family. + @param demandMask A mask of all checksums that the hardware must compute + and insert into the appropriate checksum fields in the packet. + @param param0 Optional parameter 0, defaults to 0. + @param param1 Optional parameter 1, defaults to 0. +*/ + + virtual void getChecksumDemand( const mbuf_t packet, + UInt32 checksumFamily, + UInt32 * demandMask, + void * param0 = 0, + void * param1 = 0 ); + +/*! @function publishMediumDictionary + @abstract Publishes a dictionary of IONetworkMedium objects to + advertise the media selection supported by the network controller. + @discussion Called by drivers to publish their medium dictionary. + Each entry in the dictionary is an IONetworkMedium object that + represents a single medium that is supported by the controller. + This method will make a copy of the dictionary provided, then add + the copy to the driver's property table. The dictionary provided + can be released by the caller upon returning from this method. + It is permissible to call this method multiple times, which may be + necessary if the hardware's media capability changes dynamically. + However, if the capability is static, which is often the case, + then a driver will typically call this method only once from + its start() method. + + Several methods depend on the presence of a medium dictionary. + They should be called after the medium dictionary has been + published. Those methods are: + setSelectedMedium() + getSelectedMedium() + getMediumDictionary() + copyMediumDictionary() + + @param mediumDict A dictionary of IONetworkMedium objects. + @result Returns true if the dictionary is valid, and was successfully + exported to the property table, false otherwise. +*/ + + virtual bool publishMediumDictionary(const OSDictionary * mediumDict); + +/*! @function setSelectedMedium + @abstract Designates an entry in the published medium dictionary as + the current selected medium. + @discussion After the driver has configured the hardware to select + one of its supported media types, it must call this method to inform + its parent about the change that has occurred. IONetworkController + will update a property in the registry to reflect the current selection. + @param medium A medium object representing the current selection. + @result Returns true if the property table update was successful, + false if the update failed, or if the medium provided does not match + any entry from the published medium dictionary. +*/ + + virtual bool setSelectedMedium(const IONetworkMedium * medium); + bool setCurrentMedium(const IONetworkMedium * medium); + +/*! @function setLinkStatus + @abstract Reports the link status and the active medium. + @discussion Drivers must call this method when a link change is + detected. IONetworkController will update the link status properties + in the registry, and generate an event to inform the upper layers + about the change. + @param status Link status bits. + See IONetworkMedium for the definition of the link status bits. + @param activeMedium An object in the published medium dictionary + that represents the active medium. This may not be the same as + the selected medium. Set this to 0 if the link is inactive. + @param speed Link speed in units of bits per second. If zero, then + the link speed is taken from the medium object provided. + @param data An OSData containing any additional link parameter that + the driver wishes to publish to the registry. + @result Returns true if all link properties were successfully updated, + false otherwise. +*/ + + virtual bool setLinkStatus( + UInt32 status, + const IONetworkMedium * activeMedium = 0, + UInt64 speed = 0, + OSData * data = 0); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_6 +/*! @function systemWillShutdown + @abstract Handles system shutdown and restart notifications. + @discussion Overrides IOService::systemWillShutdown in order + to notify network clients that the power-managed controller should be disabled. + As a result, drivers can expect their disable method to be called + before system shutdown or restart. This implementation is synchronous and can + block before calling IOService::systemWillShutdown and return. + @param specifier + kIOMessageSystemWillPowerOff or kIOMessageSystemWillRestart. + @see //apple_ref/cpp/instm/IOService/systemWillShutdown/void/(IOOptionBits) IOService::systemWillShutdown +*/ + + virtual void systemWillShutdown( IOOptionBits specifier ) APPLE_KEXT_OVERRIDE; + + /* Override IOService::setAggressiveness() */ + + virtual IOReturn setAggressiveness( + unsigned long type, unsigned long newLevel ) APPLE_KEXT_OVERRIDE; +#endif + +protected: + +/*! @function free + @abstract Frees the IONetworkController object. + @discussion Frees the IONetworkController object by releasing all + allocated resources, followed by a call to super::free(). +*/ + + virtual void free() APPLE_KEXT_OVERRIDE; + +/*! @function registerWithPolicyMaker + @abstract Implemented by controller drivers to register with + the power management policy-maker. + @discussion Drivers that are able to power manage their hardware + should override this method and register with the policy-maker + provided by calling IOService::registerPowerDriver(). + IONetworkController will call this method before the initial + attempt is made to attach a client. + @param policyMaker The policy-maker chosen to manage power for + this network controller. + @result Returns kIOReturnSuccess on success, kIOReturnUnsupported if the + driver does not support power management, or an appropriate error + return code. The default return is kIOReturnUnsupported. */ + + virtual IOReturn registerWithPolicyMaker(IOService * policyMaker); + +/*! @function createWorkLoop + @abstract Method called by IONetworkController prior to the initial + getWorkLoop() call. + @discussion Before IONetworkController calls getWorkLoop() in its + start() method, it will call createWorkLoop() to make sure that a + subclass that wants to create a workloop, will do so before its + first use. + @result Returns true to indicate success, false otherwise. Returning false + will fail IONetworkController::start(). +*/ + + virtual bool createWorkLoop(); + +/*! @function prepare + @abstract Prepares the controller before an IOService is created and + attached as a client. + @discussion This method is called by attachInterface() or + attachDebuggerClient() to prepare the controller before the new client + object is attached. This method will call publishProperties() to publish + controller capabilities and properties that may be used by client objects. + However, publishProperties() will be called only once, even if prepare() + is called multiple times. This method call is synchronized by the + workloop's gate. + @result Returns kIOReturnSuccess on success, or an error code otherwise. + Returning an error will fail the client attach. +*/ + + virtual IOReturn prepare(); + +/*! @function publishProperties + @abstract Publishes controller properties and capabilities. + @discussion Called by IONetworkController to discover controller + properties, and publish them to the property table in the I/O Kit + Registry. This method is called once by prepare(). + @result Returns true if all properties were discovered and published + successfully, false otherwise. Returning false will prevent client + objects from attaching to the controller, since a property that + a client relies upon may be missing. */ + + virtual bool publishProperties(); + +/*! @function getCommandClient + @abstract Gets the command client object. + @discussion Methods called on the workloop context to service a + client request can call this method to get the client object that + initiated the command. + @result Returns the command client. If the caller is not running on the + workloop thread, or if the thread does not have the workloop's gate + closed, then 0 is returned. +*/ + + virtual OSObject * getCommandClient() const; + +/*! @function handleOpen + @abstract Handles a client open. + @discussion This method handles a client open on the controller object. IOService + calls this method with the arbitration lock held. Subclasses + should not override this method. + @param client The client that is attempting to open the controller. + @param options Not used. See IOService. + @param argument Not used. See IOService. + @result Returns true to accept the client open, false to refuse it. +*/ + + virtual bool handleOpen(IOService * client, + IOOptionBits options, + void * argument) APPLE_KEXT_OVERRIDE; + +/*! @function handleClose + @abstract Handles a client close. + @discussion This method handles a close from one of the client objects. IOService + calls this method with the arbitration lock held. Subclasses + should not override this method. + @param client The client that is closing the controller. + @param options Not used. See IOService. +*/ + + virtual void handleClose(IOService * client, IOOptionBits options) APPLE_KEXT_OVERRIDE; + +/*! @function handleIsOpen + @abstract Queries whether a client has an open on the controller. + @discussion This method is always called by IOService with the + arbitration lock held. Subclasses should not override this method. + @result Returns true if the specified client, or any client if none (0) is + specified, presently has an open on this object. +*/ + + virtual bool handleIsOpen(const IOService * client) const APPLE_KEXT_OVERRIDE; + +/*! @function enable + @abstract A request from an interface client to enable the controller. + @discussion This method is called by an interface client to enable the controller. + Upon receiving this command, the controller driver must bring up the + hardware and become ready to transmit and receive packets. A driver + should also delay the allocation of most runtime resources until this + method is called in order to conserve system resources. This method call + is synchronized by the workloop's gate. + @param interface The interface client object that requested the enable. + @result Returns kIOReturnUnsupported. Drivers that override this method must + return kIOReturnSuccess on success, or an error code otherwise. +*/ + + virtual IOReturn enable(IONetworkInterface * interface); + +/*! @function disable + @abstract A request from an interface client to disable the controller. + @discussion This method is called by an interface client to disable the controller. + This method should stop the hardware and disable hardware interrupt + sources. Any resources allocated by enable() should also be deallocated. + This method call is synchronized by the workloop's gate. + @param interface The interface object that requested the disable. + @result kIOReturnUnsupported. Drivers that override this method must + return Returns kIOReturnSuccess on success, or an error code otherwise. +*/ + + virtual IOReturn disable(IONetworkInterface * interface); + +/*! @function attachInterface + @abstract Attaches a new network interface client object. + @discussion This method creates a new network interface object and attaches + it as a client of the controller. The createInterface() method + is used to allocate and to initialize the interface, followed by a call to + configureInterface() to configure the interface. Subclasses + may override those two methods to customize the new interface object. + Before this method returns, registerService() is called on the + interface to start matching, which will ultimately attach the interface + to the networking stack. + Drivers will typically call this method from their start() + method after they are ready to process interface requests. This has the + desirable effect of preventing the busyState at the IOService + root from becoming zero before the interface object has completed matching, + which then holds off the user process that is waiting for I/O Kit to become + quiet before assigning BSD names to all interfaces. Drivers that are unable + to trigger interface matching synchronously from their start() + method should instead call adjustBusy to manually increment + the busyState, then followed by a busyState + decrement after attaching and registering the interface, or after a + reasonable timeout. + @param interface Upon success (return value is true), the + pointer to the interface object will be written to the argument provided. + @param doRegister If true, start interface matching before returning. + Drivers can pass false to postpone interface matching, then + register the interface when ready. + @result Returns true on success, false otherwise. +*/ + + virtual bool attachInterface(IONetworkInterface ** interface, + bool doRegister = true); + +/*! @function detachInterface + @abstract Detaches an interface client object. + @discussion This method will verify that the object provided is indeed + an IONetworkInterface instance, and then call its terminate() method. + Note that an interface object will close and detach from its + controller after the data link layer has removed all references to + all data structures exposed by the interface. The interface object + should be released following this call. + @param interface An interface object to be detached and terminated. + @param sync If true, the interface is terminated synchronously. + This may cause this method to block for an indeterminate + amount of time. */ + + virtual void detachInterface(IONetworkInterface * interface, + bool sync = false); + +/*! @function createInterface + @abstract Creates a new network interface object. + @discussion This method is called by attachInterface() to perform + allocation and initialization of a new interface object. A subclass of + IONetworkController must implement this method and return a matching + interface object. For example, IOEthernetController's implementation + will return an IOEthernetInterface object when createInterface() is + called. + @result Returns a newly allocated and initialized interface object. +*/ + + virtual IONetworkInterface * createInterface() = 0; + +/*! @function configureInterface + @abstract Configures a newly created network interface object. + @discussion This method configures an interface object that was created by + createInterface(). Subclasses can override this method to customize + and examine the interface object that will be attached to the + controller as a client. + @param interface The interface object to be configured. + @result Returns true if the operation was successful, false otherwise + (this will cause attachInterface() to fail and return 0). +*/ + + virtual bool configureInterface(IONetworkInterface * interface); + +/*! @function createOutputQueue + @abstract Creates an IOOutputQueue to handle output packet queueing, + and also to resolve contention for the controller's transmitter from + multiple client threads. + @discussion This method is called by start() to create an IOOutputQueue object to + handle output packet queueing. The default implementation will always + return 0, hence no output queue will be created. A driver may override + this method and return a subclass of IOOutputQueue. IONetworkController + will keep a reference to the queue created, and will release this + object when IONetworkController is freed. Also see getOutputQueue(). + @result Returns a newly allocated and initialized IOOutputQueue object. +*/ + + virtual IOOutputQueue * createOutputQueue(); + +/*! @function enable + @abstract An enable request from an IOKernelDebugger client. + @discussion Drivers that provide debugging support may either override + this method and set up the hardware to support the polled-mode send and + receive methods, receivePacket() and sendPacket(), or override the base + enable() and disable() methods that take an IOService argument. + @param debugger The IOKernelDebugger client requesting the enable. + @result Returns kIOReturnSuccess. Drivers must return kIOReturnSuccess + on success, or an error otherwise. +*/ + + virtual IOReturn enable(IOKernelDebugger * debugger); + +/*! @function disable + @abstract A disable request from an IOKernelDebugger client. + @discussion Drivers that provide debugging support may either override + this method to disable support for the polled-mode send and receive + methods, or override the base enable() and disable() methods that + take an IOService argument. + @param debugger The IOKernelDebugger client requesting the disable. + @result Returns kIOReturnSuccess. Drivers must return kIOReturnSuccess + on success, or an error otherwise. +*/ + + virtual IOReturn disable(IOKernelDebugger * debugger); + +/*! @function attachDebuggerClient + @abstract Attaches a new IOKernelDebugger client object. + @discussion This method allocates an IOKernelDebugger object and attaches it as + a client. Having a debugger client implies that the controller + supports kernel debugging, and therefore must implement the two + polled-mode methods that are called by the debugger client. See + sendPacket() and receivePacket(). Only a single debugger client + should be attached to each controller. + @param debuggerP A handle that will return the new + IOKernelDebugger object created. + @result Returns true on success, false otherwise. +*/ + + virtual bool attachDebuggerClient(IOKernelDebugger ** debuggerP); + +/*! @function detachDebuggerClient + @abstract Detaches an IOKernelDebugger client object. + @discussion This method detaches and terminates the IOKernelDebugger client object + provided. A synchronous termination is issued, and this method will + return after the debugger client has been terminated. The debugger + client should be released following this call. + @param debugger The IOKernelDebugger object to be detached and + terminated. If the argument provided is NULL or is not an + IOKernelDebugger, this method will return immediately. +*/ + + virtual void detachDebuggerClient(IOKernelDebugger * debugger); + +/*! @function reserveDebuggerLock + @abstract Takes the global debugger lock. + @discussion This method should not be used. Instead, call the + lock() method provided by IOKernelDebugger. +*/ + + void reserveDebuggerLock(); + +/*! @function releaseDebuggerLock + @abstract Releases the global debugger lock. + @discussion This method should not be used. Instead, call the + unlock() method provided by IOKernelDebugger. +*/ + + void releaseDebuggerLock(); + +/*! @function receivePacket + @abstract Debugger polled-mode receive handler. + @discussion This method must be implemented by a driver that supports + kernel debugging. After a debugger client has been attached through + attachDebuggerClient(), this method will be called by the debugger + client to poll for an incoming packet when the kernel debugger is active. + This method may be called from the primary interrupt context, and the + implementation must avoid any memory allocation, and must never block. + The receivePacket() method in IONetworkController is used as a placeholder, + it performs no useful action, and should not be called. A driver that + attaches a debugger client must override this method. + @param pkt Address of a receive buffer where the received packet should + be stored. This buffer has room for 1518 bytes. + @param pktSize Address where the number of bytes received must be + recorded. Set this to zero if no packets were received during + the timeout interval. + @param timeout The maximum amount of time in milliseconds to poll for + a packet to arrive before this method must return. +*/ + + virtual void receivePacket(void * pkt, UInt32 * pktSize, UInt32 timeout); + +/*! @function sendPacket + @abstract Debugger polled-mode transmit handler. + @discussion This method must be implemented by a driver that supports + kernel debugging. After a debugger client has been attached through + attachDebuggerClient(), this method will be called by the debugger + to send an outbound packet only when the kernel debugger is active. + This method may be called from the primary interrupt context, and the + implementation must avoid any memory allocation, and must never block. + The sendPacket() method in IONetworkController is used as a placeholder, + it performs no useful action, and should not be called. A driver that + attaches a debugger client must override this method. + @param pkt Pointer to a transmit buffer containing the packet to be + sent on the network. + @param pktSize The size of the transmit buffer in bytes. +*/ + + virtual void sendPacket(void * pkt, UInt32 pktSize); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_7 + +/*! @function getDebuggerLinkStatus + @abstract Debugger polled-mode link status handler. + @discussion This method should be implemented by a driver that wishes to support + early availability kernel debugging. After a debugger client has been attached through + attachDebuggerClient(), this method will be called by the debugger + to poll for link status availability only when the kernel debugger is active. + This method may be called from the primary interrupt context. As a result, the + implementation must avoid any memory allocation, not use spinlocks, and + never block. + + The getDebuggerLinkStatus() method in IONetworkController is used as a placeholder + and always reports that the link is up. A driver that attaches a debugger client + should override this method. The driver should do any setup required to make + sure the link is available for use. Prior to sending or receiving data, KDP will call this + function repeatedly until it indicates that the link is both valid and active + (kIONetworkLinkValid | kIONetworkLinkActive). + + @result Link status bits. See IONetworkMedium for the definition of the link status bits. +*/ + virtual UInt32 getDebuggerLinkStatus(void); + +/*! @function setDebuggerMode + @abstract Set debugger mode for network drivers. + @discussion This method should be implemented by a driver that wishes to be notified when + entering or leaving KDP. After a debugger client has been attached through + attachDebuggerClient(), this method will be called by the debugger + to inform the driver that the kernel debugger is going active or inactive. + This method may be called from the primary interrupt context. As a result, the + implementation must avoid any memory allocation, not use spinlocks, and + never block. + + The setDebuggerMode() method in IONetworkController is used as a placeholder + and doesn't do anything. If a driver wishes to perform specific actions based upon whether + or not the debugger is active or not, it should override this method. For example, drivers + may wish to alter power management settings or perform other chipset reconfigurations based + upon the active debugger state. + + @param active Set to true if entering KDP and false if leaving KDP. + @result Returns true on success and false otherwise. +*/ + virtual bool setDebuggerMode(bool active); + + // Virtual function padding + OSMetaClassDeclareReservedUsed( IONetworkController, 0); // getDebuggerLinkStatus + OSMetaClassDeclareReservedUsed( IONetworkController, 1); // setDebuggerMode + +#else + // Virtual function padding + OSMetaClassDeclareReservedUnused( IONetworkController, 0); + OSMetaClassDeclareReservedUnused( IONetworkController, 1); +#endif + +#ifdef __PRIVATE_SPI__ +public: + +/*! @function getMbufServiceClass + @discussion Get the service class of an mbuf packet. + @param mbuf The mbuf to get the service class of. + @result The service class +*/ + static IOMbufServiceClass getMbufServiceClass( mbuf_t mbuf ); + +/*! @function attachAuxiliaryDataToPacket + @abstract Attach family or driver specific data to a mbuf packet. + @discussion Memory is allocated for the auxiliary data and attached to + the packet. The data provided is then copied to the allocated memory. + Attaching auxiliary data to a packet which already has auxiliary data + attached will fail. The existing auxiliary data must be detached from the + packet and freed using removeAuxiliaryDataFromPacket before + attaching new data. Freeing the packet will also free any memory allocated + for auxiliary data. + @param packet The mbuf packet to attach the auxiliary data to. The packet + must point to a header mbuf with MBUF_PKTHDR flag set. + @param data Pointer to the auxiliary data provided by the caller. + This cannot be NULL. + @param length The length of the auxiliary data in bytes. + This must be greater than zero. + @param family The interface family defined in net/kpi_interface.h. + @param subFamily Reserved for future use. + @result kIOReturnSuccess upon success, or an error code + otherwise. +*/ + static IOReturn attachAuxiliaryDataToPacket( + mbuf_t packet, + const void * data, + IOByteCount length, + uint32_t family = 0, + uint32_t subFamily = 0 ); + +/*! @function removeAuxiliaryDataFromPacket + @discussion Remove and free any driver auxiliary data associated with + the packet. + @param packet The mbuf packet to remove the auxiliary data from. +*/ + static void removeAuxiliaryDataFromPacket( + mbuf_t packet ); + +/*! @function outputStart + @abstract An indication to the driver to dequeue and transmit packets + waiting in the interface output queue. + @discussion A driver that supports the pull output model must override this + method, which will be called by a per-interface output thread when a packet + is added to the interface output queue. In response, driver must verify that + free transmit resources are available, then dequeue one or more packets by + calling IONetworkInterface::dequeueOutputPackets(). Packets + removed from the queue are owned by the driver, and should be immediately + prepared for transmission. Additional software queueing at the driver layer + to store the dequeued packets for delayed transmission is highly discouraged + unless absolutely necessary. If transmit resources are exhausted, the driver + should quickly return kIOReturnNoResources to force the output + thread to retry later, otherwise the output thread will continue to call + this method until the output queue is empty. When driver creates a single + network interface, this method will execute in a single threaded context. + However, it is the driver's responsibility to protect transmit resources + that are shared with other driver threads. To simplify drivers that wish to + process output packets on their work loop context, the family provides an + option to force the output thread to always call this method through a + runAction(). However this can have negative performance + implications due to extra locking and serializing the output thread against + other work loop events. Another option that drivers can deploy to + synchronize against the output thread is to issue a thread stop before + touching any shared resources. But this should be used sparingly on the + data path since stopping the output thread can block. + @param interface The network interface with packet(s) to transmit. + @param options Always zero. + @result kIOReturnSuccess on success, output thread will + continue calling the driver until the output queue is empty. + kIOReturnNoResources when there is a temporary driver resource + shortage. +*/ + virtual IOReturn outputStart( + IONetworkInterface * interface, + IOOptionBits options ); + + OSMetaClassDeclareReservedUsed( IONetworkController, 2); + +/*! @function setInputPacketPollingEnable + @abstract Informs the driver when input polling is enabled or disabled. + @discussion A driver that supports input polling should override this + method to handle the transition from the default push-model, where a + hardware interrupt causes the driver to push input packets to the network + stack, to the pull-model where a poller thread will periodically poll the + driver for input packets. When polling is enabled, receive interrupt should + be masked OFF. This method is always called on driver's work loop context. + @param interface The interface that has enabled or disabled input polling. + @param enabled true if input polling is enabled, + false if input polling is disabled. + @result Driver should return kIOReturnSuccess if the transition + to/from polled-mode was successful, or an error code otherwise. +*/ + virtual IOReturn setInputPacketPollingEnable( + IONetworkInterface * interface, + bool enabled ); + + OSMetaClassDeclareReservedUsed( IONetworkController, 3); + +/*! @function pollInputPackets + @abstract Called by the interface poller thread to retrieve input packets + from the driver. + @discussion A driver that supports input polling must override this method + and pass any input packets to the network interface. For each input packet, + driver must call IONetworkInterface::enqueueInputPacket and + pass the pollQueue argument to add the packet to the polling + queue. This should continue until the maximum packet count is reached, or + the driver runs out of input packets. The poller can be configured to call + this method on the driver's work loop context. + @param interface The interface that is polling packets from the driver. + @param maxCount The maximum number of packets that the poller can accept. + @param pollQueue The polling queue that should be passed to + IONetworkInterface::enqueueInputPacket. Do not cache or use + this pointer after the method returns. + @param context The family will always pass zero. This can be used by the + driver for calls originating from the driver. E.g. A driver may choose to + unify polled-mode and interrupt-mode input packet handling and call this + method from its receive interrupt handler and pass a non-zero context to + distinguish the calling context. +*/ + virtual void pollInputPackets( + IONetworkInterface * interface, + uint32_t maxCount, + IOMbufQueue * pollQueue, + void * context ); + + OSMetaClassDeclareReservedUsed( IONetworkController, 4); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_9 + +/*! @function networkInterfaceNotification + @abstract Receives notification from an attached network interface. + @discussion An attached network interface invokes this method to notify + the driver about an interface state change or an event from the networking + stack. The family does not synchronize the call using the driver's work + loop. + @param interface The interface that issued the notification. + @param type The type of notification. + @param argument Optional data associated with the notification. Can be + NULL if the notification does not provide in-band data. + @result Default implementation returns kIOReturnUnsupported. + Driver should return kIOReturnSuccess if the notification + was handled. +*/ + virtual IOReturn networkInterfaceNotification( + IONetworkInterface * interface, + uint32_t type, + void * argument ); + + OSMetaClassDeclareReservedUsed( IONetworkController, 5); + +#else + + OSMetaClassDeclareReservedUnused( IONetworkController, 5); + +#endif + +#else /* !__PRIVATE_SPI__ */ + OSMetaClassDeclareReservedUnused( IONetworkController, 2); + OSMetaClassDeclareReservedUnused( IONetworkController, 3); + OSMetaClassDeclareReservedUnused( IONetworkController, 4); + OSMetaClassDeclareReservedUnused( IONetworkController, 5); +#endif /* !__PRIVATE_SPI__ */ + OSMetaClassDeclareReservedUnused( IONetworkController, 6); + OSMetaClassDeclareReservedUnused( IONetworkController, 7); + OSMetaClassDeclareReservedUnused( IONetworkController, 8); + OSMetaClassDeclareReservedUnused( IONetworkController, 9); + OSMetaClassDeclareReservedUnused( IONetworkController, 10); + OSMetaClassDeclareReservedUnused( IONetworkController, 11); + OSMetaClassDeclareReservedUnused( IONetworkController, 12); + OSMetaClassDeclareReservedUnused( IONetworkController, 13); + OSMetaClassDeclareReservedUnused( IONetworkController, 14); + OSMetaClassDeclareReservedUnused( IONetworkController, 15); + OSMetaClassDeclareReservedUnused( IONetworkController, 16); + OSMetaClassDeclareReservedUnused( IONetworkController, 17); + OSMetaClassDeclareReservedUnused( IONetworkController, 18); + OSMetaClassDeclareReservedUnused( IONetworkController, 19); + OSMetaClassDeclareReservedUnused( IONetworkController, 20); + OSMetaClassDeclareReservedUnused( IONetworkController, 21); + OSMetaClassDeclareReservedUnused( IONetworkController, 22); + OSMetaClassDeclareReservedUnused( IONetworkController, 23); + OSMetaClassDeclareReservedUnused( IONetworkController, 24); + OSMetaClassDeclareReservedUnused( IONetworkController, 25); + OSMetaClassDeclareReservedUnused( IONetworkController, 26); + OSMetaClassDeclareReservedUnused( IONetworkController, 27); + OSMetaClassDeclareReservedUnused( IONetworkController, 28); + OSMetaClassDeclareReservedUnused( IONetworkController, 29); + OSMetaClassDeclareReservedUnused( IONetworkController, 30); + OSMetaClassDeclareReservedUnused( IONetworkController, 31); +}; + +#endif /* __cplusplus */ +#endif /* KERNEL */ +#endif /* !_IONETWORKCONTROLLER_H */ diff --git a/QualcommWireless/include/IOKit/network/IONetworkData.h b/QualcommWireless/include/IOKit/network/IONetworkData.h new file mode 100644 index 0000000..9b61df2 --- /dev/null +++ b/QualcommWireless/include/IOKit/network/IONetworkData.h @@ -0,0 +1,477 @@ +/* + * Copyright (c) 1998-2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IONETWORKDATA_H +#define _IONETWORKDATA_H + +#define IONetworkParameter IONetworkData // FIXME + +/*! @enum NetworkDataAccessTypes + @abstract Constants that describe access types. + @constant kIONetworkDataAccessTypeRead Read access. + @constant kIONetworkDataAccessTypeWrite Write access (deprecated). + @constant kIONetworkDataAccessTypeReset Reset access (deprecated). + @constant kIONetworkDataAccessTypeSerialize Serialization access. +*/ + +enum { + kIONetworkDataAccessTypeRead = 0x01, + kIONetworkDataAccessTypeWrite = 0x02, + kIONetworkDataAccessTypeReset = 0x04, + kIONetworkDataAccessTypeSerialize = 0x08, + kIONetworkDataAccessTypeMask = 0xff +}; + +/*! @define kIONetworkDataBasicAccessTypes + @discussion The default access types supported by an IONetworkData + object. Allow read() and serialize(). */ + +#define kIONetworkDataBasicAccessTypes \ + (kIONetworkDataAccessTypeRead | kIONetworkDataAccessTypeSerialize) + +/*! @enum NetworkDataBufferTypes + @abstract The types of data buffers that can be managed by an IONetworkData object. + @constant kIONetworkDataBufferTypeInternal An internal data buffer + allocated by the init() method. + @constant kIONetworkDataBufferTypeExternal An external (persistent) data + buffer. + @constant kIONetworkDataBufferTypeNone No data buffer. The only useful + action perfomed by an IONetworkData object with this buffer type + is to call the access notification handler. +*/ + +enum { + kIONetworkDataBufferTypeInternal = 0, + kIONetworkDataBufferTypeExternal, + kIONetworkDataBufferTypeNone +}; + +/*! @defined kIONetworkDataBytes + @abstract A property of IONetworkData objects. + @discussion The kIONetworkDataBytes property is an OSData that describes + the data buffer of an IONetworkData object. This property is present + only if kIONetworkDataAccessTypeSerialize access is supported. +*/ + +#define kIONetworkDataBytes "Data" + +/*! @defined kIONetworkDataAccessTypes + @abstract A property of IONetworkData objects. + @discussion The kIONetworkDataAccessTypes property is an OSNumber that + describes the supported access types of an IONetworkData object. +*/ + +#define kIONetworkDataAccessTypes "Access Types" + +/*! @defined kIONetworkDataSize + @abstract A property of IONetworkData objects. + @discussion The kIONetworkDataSize property is an OSNumber that + describes the size of the data buffer of an IONetworkData object. +*/ + +#define kIONetworkDataSize "Size" + +#ifdef KERNEL + +#include +#include + +/*! @class IONetworkData + @abstract An object that manages a fixed-size named buffer. + @discussion An IONetworkData object manages a fixed-size named buffer. + This object provides external access methods that can be used to + access the contents of the data buffer. In addition, serialization + is supported, and therefore this object can be added to a property + table to publish the data object. An unique name must be assigned to + the object during initialization. An OSSymbol key will be created + based on the assigned name, and this key can be used when the object + is added to a dictionary. + + The level of access granted to the access methods can be restricted, + by specifying a set of supported access types when the object is + initialized, or modified later by calling setAccessTypes(). By default, + each IONetworkData object created will support serialization, and will + also allow its data buffer to be read through the read() access method. + + An access notification handler, in the form of a 'C' function, can + be registered to receive a call each time the data buffer is accessed + through an access method. Arguments provided to the handler will identify + the data object and the type of access that triggered the notification. + The handler can therefore perform lazy update of the data buffer until + an interested party tries to read or serialize the data. The notification + handler can also take over the default action performed by the access + methods when the buffer type is set to kIONetworkDataBufferTypeNone. + This will prevent the access methods from accessing the data buffer, + and allow the handler to override the access protocol. + + This object is primarily used by IONetworkInterface to export interface + properties to user space. +*/ + + +class IONetworkData : public OSObject +{ + OSDeclareDefaultStructors( IONetworkData ) + +public: + +/*! @typedef Action + @abstract Defines a C function that may be called by an IONetworkData object + when one of its access methods is called. + @param target The target of the notification. + @param param A parameter that was provided when the notification + handler was registered. + @param data The IONetworkData object being accessed, and the + sender of the notification. + @param accessType A bit will be set indicating the type of access + which triggered the notification. + @param buffer Pointer to the accessor's buffer. Only valid for + read() and write() accesses. + @param bufferSize Pointer to the size of the accessor's buffer. + @param offset An offset from the start of the data buffer to begin + reading or writing. +*/ + + typedef IOReturn (*Action)(void * target, + void * param, + IONetworkData * data, + UInt32 accessType, + void * buffer, + UInt32 * bufferSize, + UInt32 offset); + +protected: + const OSSymbol * _key; // key associated with this object. + UInt32 _access; // supported access types. + void * _buffer; // Data buffer. + UInt32 _bufType; // buffer type + UInt32 _size; // data buffer size. + void * _tapTarget; // target for access notification. + Action _tapAction; // the function to call. + void * _tapParam; // arbitrary notification param. + + struct ExpansionData { }; + /*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData * _reserved; + + +/*! @function free + @abstract Frees the IONetworkData object. +*/ + + virtual void free() APPLE_KEXT_OVERRIDE; + +/*! @function writeBytes + @abstract Writes to the data buffer with data from a source buffer + provided by the caller. + @param srcBuffer Pointer to a source buffer provided by the caller. + @param srcBufferSize The size of the source buffer. + @param writeOffset A byte offset from the start of the data buffer + to begin writting. + @result Returns true if the operation was successful, false otherwise. +*/ + + virtual bool writeBytes(const void * srcBuffer, + UInt32 srcBufferSize, + UInt32 writeOffset = 0); + +/*! @function readBytes + @abstract Reads from the data buffer and copies the data to a destination + buffer provided by the caller. + @param dstBuffer Pointer to the destination buffer. + @param dstBufferSize Pointer to an integer containing the size of the + destination buffer. And is overwritten by this method with the actual + number of bytes copied to the destination buffer. + @param readOffset A byte offset from the start of the data buffer + to begin reading. + @result Returns true if the operation was successful, false otherwise. +*/ + + virtual bool readBytes(void * dstBuffer, + UInt32 * dstBufferSize, + UInt32 readOffset = 0) const; + +/*! @function clearBuffer + @abstract Clears the data buffer by filling it with zeroes. + @result Returns true if the operation was successful, false otherwise. +*/ + + virtual bool clearBuffer(); + +public: + +/*! @function withInternalBuffer + @abstract Factory method that constructs and initializes an + IONetworkData object with an internal data buffer. + @param name A name to assign to this object. + @param bufferSize The number of bytes to allocate for the internal data + buffer. + @param accessTypes The initial supported access types. + @param target The notification target. + @param action The notification action. + @param param A parameter to pass to the notification action. + @result Returns an IONetworkData object on success, or 0 otherwise. +*/ + + static IONetworkData * + withInternalBuffer(const char * name, + UInt32 bufferSize, + UInt32 accessTypes = + kIONetworkDataBasicAccessTypes, + void * target = 0, + Action action = 0, + void * param = 0); + +/*! @function withExternalBuffer + @abstract Factory method that constructs and initializes an + IONetworkData object with an external data buffer. + @param name A name to assign to this object. + @param bufferSize The size of the external data buffer. + @param externalBuffer Pointer to the external data buffer. + @param accessTypes The initial supported access types. + @param target The notification target. + @param action The notification action. + @param param A parameter to pass to the notification action. + @result Returns an IONetworkData object on success, or 0 otherwise. +*/ + + static IONetworkData * + withExternalBuffer(const char * name, + UInt32 bufferSize, + void * externalBuffer, + UInt32 accessTypes = + kIONetworkDataBasicAccessTypes, + void * target = 0, + Action action = 0, + void * param = 0); + +/*! @function withNoBuffer + @abstract Factory method that constructs and initializes an + IONetworkData object without a data buffer. + @discussion The notification handler + must intervene when the IONetworkData is accessed. + @param name A name to assign to this object. + @param bufferSize The size of the phantom data buffer. + @param accessTypes The initial supported access types. + @param target The notification target. + @param action The notification action. + @param param A parameter to pass to the notification action. + @result Returns an IONetworkData object on success, or 0 otherwise. +*/ + + static IONetworkData * withNoBuffer(const char * name, + UInt32 bufferSize, + UInt32 accessTypes, + void * target, + Action action, + void * param = 0); + +/*! @function init + @abstract Initializes an IONetworkData object. + @param name A name to assign to this object. + @param bufferType The type of buffer associated with this object. + @param bufferSize The size of the data buffer. + @param externalBuffer Pointer to an external data buffer. + @param accessTypes The initial supported access types. + Can be later modified by calling setAccessTypes(). + @param target The notification target. + @param action The notification action. + @param param A parameter to pass to the notification action. + @result Returns true if initialized successfully, false otherwise. +*/ + + virtual bool init(const char * name, + UInt32 bufferType, + UInt32 bufferSize, + void * externalBuffer = 0, + UInt32 accessTypes = + kIONetworkDataBasicAccessTypes, + void * target = 0, + Action action = 0, + void * param = 0); + +/*! @function setAccessTypes + @abstract Sets the types of access that are permitted on the data buffer. + @param types A mask of access types indicating the supported access + types. +*/ + + virtual void setAccessTypes(UInt32 types); + +/*! @function setNotificationTarget + @abstract Registers a C function to handle access notifications sent + from this object. + @discussion A notification is sent by an IONetworkData object to the + registered notification handler, when an access method is called to + modify the contents of the data buffer. + @param target The first parameter passed to the notification handler. + @param action A pointer to a C function that will handle the notification. + If 0, then notification is disabled. + @param param An optional parameter passed to the notification handler. +*/ + + virtual void setNotificationTarget(void * target, + Action action, + void * param = 0); + +/*! @function getBuffer + @abstract Gets a pointer to the data buffer. + @result Returns a pointer to the data buffer. Returns 0 if the buffer type is + kIONetworkDataBufferTypeNone. +*/ + + virtual const void * getBuffer() const; + +/*! @function getBufferType + @abstract Gets the type of data buffer managed by this object. + @result Returns a constant that describes the type of the data buffer. +*/ + + virtual UInt32 getBufferType() const; + +/*! @function getAccessTypes + @abstract Gets the types of data access supported by this object. + @result Returns a mask of supported access types. +*/ + + virtual UInt32 getAccessTypes() const; + +/*! @function getNotificationTarget + @abstract Gets the first parameter that will be passed to the access + notification handler. + @result Returns the first parameter that will be passed to the access notification + handler. +*/ + + virtual void * getNotificationTarget() const; + +/*! @function getNotificationAction + @abstract Gets the C function that was registered to handle access + notifications sent from this object. + @result Returns a pointer to a C function, or 0 if notification is disabled. +*/ + + virtual Action getNotificationAction() const; + +/*! @function getNotificationParameter + @abstract Gets the parameter that will be passed to the access + notification handler. + @result Returns the parameter that will be passed to the access notification + handler. +*/ + + virtual void * getNotificationParameter() const; + +/*! @function getKey + @abstract Gets a unique OSSymbol key associated with this object. + @discussion During initialization, IONetworkData will create an + OSSymbol key based on its assigned name. + @result Returns an OSSymbol key that was generated from the name assigned to + this object. +*/ + + virtual const OSSymbol * getKey() const; + +/*! @function getSize + @abstract Gets the size of the data buffer. + @result Returns the size of the data buffer managed by this object in bytes. +*/ + + virtual UInt32 getSize() const; + +/*! @function reset + @abstract An access method that resets the data buffer. + @discussion This method handles an external request to reset the data buffer. + If notification is enabled, then the notification handler is called + after the data buffer has been cleared. + @result Returns kIOReturnSuccess on success, + kIOReturnNotWritable if reset access is not permitted, + or an error from the notification handler. +*/ + + virtual IOReturn reset(); + +/*! @function read + @abstract An access method that reads from the data buffer. + @discussion This method handles an external request to read from the data buffer + and copy it to the destination buffer provided by the accessor. + If notification is enabled, then the notification handler is called + before the data buffer is copied to the destination buffer. The + notification handler may use this opportunity to intervene and + to update the contents of the data buffer. + @param dstBuffer Pointer to the destination buffer. + @param dstBufferSize Pointer to an integer containing the size of the + destination buffer. And is overwritten by this method to the actual number + of bytes copied to the destination buffer. + @param readOffset An offset from the start of the source data buffer to + begin reading. + @result Returns kIOReturnSuccess on success, + kIOReturnBadArgument if any of the arguments provided is invalid, + kIOReturnNotReadable if read access is not permitted, + or an error from the notification handler. +*/ + + virtual IOReturn read(void * dstBuffer, + UInt32 * dstBufferSize, + UInt32 readOffset = 0); + +/*! @function write + @abstract An access method that writes to the data buffer. + @discussion This method handles an external request to write to the data buffer + from a source buffer provided by the accessor. After checking that + the data object supports write accesses, the data buffer is updated + if it exists. Then the registered notification handler is called. + @param srcBuffer Pointer to the source buffer. + @param srcBufferSize The number of bytes to write to the data buffer. + @param writeOffset An offset from the start of the destination data buffer + to begin writing. + @result Returns kIOReturnSuccess on success, + kIOReturnBadArgument if any of the arguments provided is invalid, + kIOReturnNotWritable if write access is not permitted, + or an error from the notification handler. +*/ + + virtual IOReturn write(void * srcBuffer, + UInt32 srcBufferSize, + UInt32 writeOffset = 0); + +/*! @function serialize + @abstract Serializes the IONetworkData object. + @discussion If notification is enabled, then the notification + handler is called just before the data buffer is serialized. + @param s An OSSerialize object. + @result Returns true on success, false otherwise. +*/ + + virtual bool serialize(OSSerialize * s) const APPLE_KEXT_OVERRIDE; + + // Virtual function padding + OSMetaClassDeclareReservedUnused( IONetworkData, 0); + OSMetaClassDeclareReservedUnused( IONetworkData, 1); + OSMetaClassDeclareReservedUnused( IONetworkData, 2); + OSMetaClassDeclareReservedUnused( IONetworkData, 3); +}; + +#endif /* KERNEL */ + +#endif /* !_IONETWORKDATA_H */ diff --git a/QualcommWireless/include/IOKit/network/IONetworkInterface.h b/QualcommWireless/include/IOKit/network/IONetworkInterface.h new file mode 100644 index 0000000..1e51706 --- /dev/null +++ b/QualcommWireless/include/IOKit/network/IONetworkInterface.h @@ -0,0 +1,1541 @@ +/* + * Copyright (c) 1998-2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IONETWORKINTERFACE_H +#define _IONETWORKINTERFACE_H + +#include + +#ifndef __MAC_OS_X_VERSION_MIN_REQUIRED +#error "Missing macOS target version" +#endif + +/*! @defined kIONetworkInterfaceClass + @abstract The name of the IONetworkInterface class. +*/ + +#define kIONetworkInterfaceClass "IONetworkInterface" + +/*! @defined kIONetworkData + @abstract A property of IONetworkInterface objects. + @discussion The kIONetworkData property has an OSDictionary value and is a + container for the set of IONetworkData objects managed by the interface. + Each entry in the dictionary is a key/value pair consisting of + the network data name, and an OSDictionary describing the + contents of the network data. +*/ + +#define kIONetworkData "IONetworkData" + +/*! @defined kIOInterfaceType + @abstract A property of IONetworkInterface objects. + @discussion The kIOInterfaceType property has an OSNumber value that + specifies the type of network interface that this interface represents. + The type constants are defined in bsd/net/if_types.h. +*/ + +#define kIOInterfaceType "IOInterfaceType" + +/*! @defined kIOMaxTransferUnit + @abstract A property of IONetworkInterface objects. + @discussion The kIOMaxTransferUnit property has an OSNumber value that + specifies the maximum transfer unit for the interface in bytes. +*/ + +#define kIOMaxTransferUnit "IOMaxTransferUnit" + +/*! @defined kIOMediaAddressLength + @abstract A property of IONetworkInterface objects. + @discussion The kIOMediaAddressLength property has an OSNumber value that + specifies the size of the media address in bytes. +*/ + +#define kIOMediaAddressLength "IOMediaAddressLength" + +/*! @defined kIOMediaHeaderLength + @abstract A property of IONetworkInterface objects. + @discussion The kIOMediaHeaderLength property has an OSNumber value that + specifies the size of the media header in bytes. +*/ + +#define kIOMediaHeaderLength "IOMediaHeaderLength" + +/*! @defined kIOInterfaceFlags + @abstract A property of IONetworkInterface objects. + @discussion The kIOInterfaceFlags property has an OSNumber value that + specifies the current value of the interface flags. The flag constants + are defined in bsd/net/if.h. +*/ + +#define kIOInterfaceFlags "IOInterfaceFlags" + +/*! @defined kIOInterfaceExtraFlags + @abstract A property of IONetworkInterface objects. + @discussion The kIOInterfaceExtraFlags property has an OSNumber value that + specifies the current value of the interface eflags. The eflag constants + are defined in bsd/net/if.h. +*/ + +#define kIOInterfaceExtraFlags "IOInterfaceExtraFlags" + +/*! @defined kIOInterfaceUnit + @abstract A property of IONetworkInterface objects. + @discussion The kIOInterfaceUnit property has an OSNumber value that + describes the unit number assigned to the interface object. +*/ + +#define kIOInterfaceUnit "IOInterfaceUnit" + +/*! @defined kIOInterfaceState + @abstract A property of IONetworkInterface objects. + @discussion The kIOInterfaceState property has an OSNumber value that + describes the current state of the interface object. This property is + not exported to BSD via the ifnet structure. +*/ + +#define kIOInterfaceState "IOInterfaceState" + +/*! @defined kIOInterfaceNamePrefix + @abstract A property of IONetworkInterface objects. + @discussion The kIOInterfaceNamePrefix property has an OSString value that + describes the string prefix for the BSD name assigned to the interface. +*/ + +#define kIOInterfaceNamePrefix "IOInterfaceNamePrefix" + +/*! @defined kIOPrimaryInterface + @abstract A property of IONetworkInterface objects. + @discussion The kIOInterfaceNamePrefix property has an OSBoolean value that + describes whether the interface is the primary or the built-in network + interface. +*/ + +#define kIOPrimaryInterface "IOPrimaryInterface" + +/*! @defined kIOBuiltin + @abstract kIOBuiltin is a property of IONetworkInterface + objects. It has an OSBoolean value. + @discussion The kIOBuiltin property describes whether the + interface is built-in. +*/ + +#define kIOBuiltin "IOBuiltin" + +/*! @defined kIOLocation + @abstract kIOLocation is a property of IONetworkInterface + objects. It has an OSString value. + @discussion The kIOLocation property describes the physical + location of built-in interfaces. +*/ + +#define kIOLocation "IOLocation" + +/*! @defined kIONetworkNoBSDAttachKey + @abstract kIONetworkNoBSDAttachKey is a property of IONetworkInterface + objects. It has an OSBoolean value. + @discussion Adding a property with this key and the value kOSBooleanTrue + before the interface is published will hold off the BSD attach. + When the interface is ready to attach to BSD, remove the property + and then re-publish the interface by calling registerService(). +*/ + +#define kIONetworkNoBSDAttachKey "IONetworkNoBSDAttach" + +/*! @enum InterfaceObjectStates + @discussion Constants used to encode the state of the interface object. + @constant kIONetworkInterfaceRegisteredState The interface object has + registered with the data link layer. + @constant kIONetworkInterfaceOpenedState One or more clients have an + open on the interface object. + @constant kIONetworkInterfaceDisabledState The interface is temporarily + unable to service its clients. This will occur when the network + controller that is servicing the interface has entered a low power + state that renders it unusable. +*/ + +enum { + kIONetworkInterfaceRegisteredState = 0x1, + kIONetworkInterfaceOpenedState = 0x2, + kIONetworkInterfaceDisabledState = 0x4 +}; + +#ifdef KERNEL +#ifdef __cplusplus + +#include +#include +#include +#include +#include + +class IONetworkController; +class IONetworkStack; +class IOCommandGate; +struct IOMbufQueue; + +/*! @typedef IOOutputAction + @discussion Prototype for an output packet handler that will process + all outbound packets sent to the interface from the data link layer. + An output handler is registered with the interface by calling + registerOutputHandler(). + @param mbuf_t A packet mbuf. + @param param A parameter for the output request. */ + +typedef UInt32 (OSObject::*IOOutputAction)(mbuf_t, void * param); + +/*! @typedef BPF_FUNC + @discussion Prototype for the BPF tap handler. This will disappear + when the correct DLIL header file is included. */ + +typedef int (*BPF_FUNC)(struct ifnet *, struct mbuf *); + +// Network event types recognized by inputEvent(). +// +enum { + /* DLIL defined event, argument must be a pointer to a + kern_event_msg structure. */ + kIONetworkEventTypeDLIL = 0xff000001, + + /* Link up event, no argument */ + kIONetworkEventTypeLinkUp = 0xff000002, + + /* Link down event, no argument */ + kIONetworkEventTypeLinkDown = 0xff000003, + + /* Wake on LAN support changed, no argument */ + kIONetworkEventWakeOnLANSupportChanged = 0xff000004, + + /* Link speed changed */ + kIONetworkEventTypeLinkSpeedChange = 0xff000005 +}; + +#ifdef __PRIVATE_SPI__ +enum { + kIONetworkWorkLoopSynchronous = 0x00000001 +}; + +enum { + kIONetworkClientBehaviorLinkStateActiveRegister = 0x00000001, + kIONetworkClientBehaviorLinkStateChangeMessage = 0x00000002 +}; + +/*! @enum IOMbufServiceClass + @discussion Service class of a mbuf packet. + @constant kIOMbufServiceClassBKSYS Background System-Initiated. + @constant kIOMbufServiceClassBK Background. + @constant kIOMbufServiceClassBE Best Effort. + @constant kIOMbufServiceClassRD Responsive Data. + @constant kIOMbufServiceClassOAM Operations, Administration, and Management. + @constant kIOMbufServiceClassAV Multimedia Audio/Video Streaming. + @constant kIOMbufServiceClassRV Responsive Multimedia Audio/Video. + @constant kIOMbufServiceClassVI Interactive Video. + @constant kIOMbufServiceClassVO Interactive Voice. + @constant kIOMbufServiceClassCTL Network Control. +*/ +enum IOMbufServiceClass { + kIOMbufServiceClassBKSYS = 100, + kIOMbufServiceClassBK = 200, + kIOMbufServiceClassBE = 0, + kIOMbufServiceClassRD = 300, + kIOMbufServiceClassOAM = 400, + kIOMbufServiceClassAV = 500, + kIOMbufServiceClassRV = 600, + kIOMbufServiceClassVI = 700, + kIOMbufServiceClassVO = 800, + kIOMbufServiceClassCTL = 900 +}; + +/*! @enum IONetworkTransmitStatus + @discussion Constants for packet transmit status. + @constant kIONetworkTransmitStatusSuccess Packet sent across link. + @constant kIONetworkTransmitStatusFailed Failed to send packet across link. + @constant kIONetworkTransmitStatusAborted Send aborted, peer was asleep. + @constant kIONetworkTransmitStatusQueueFull Driver send queue was full. +*/ +enum { + kIONetworkTransmitStatusSuccess = 0, + kIONetworkTransmitStatusFailed = 1, + kIONetworkTransmitStatusAborted = 2, + kIONetworkTransmitStatusQueueFull = 3 +}; + +typedef uint32_t IONetworkTransmitStatus; + +/*! @typedef IONetworkPacketPollingParameters + @discussion Mirrors the definition of ifnet_poll_params(). + @field maxPacketCount The maximum number of packets to be dequeued each + time the driver's pollInputPackets is invoked. A zero value + indicates the use of default maximum defined by the system. + @field lowThresholdPackets Low watermark packets threshold. + @field highThresholdPackets High watermark packets threshold. + @field lowThresholdBytes Low watermark bytes threshold. + @field highThresholdBytes High watermark bytes threshold. + @field pollIntervalTime The interval time between each invocation of + the driver's pollInputPackets in nanoseconds. +*/ +struct IONetworkPacketPollingParameters { + uint32_t maxPacketCount; + uint32_t lowThresholdPackets; + uint32_t highThresholdPackets; + uint32_t lowThresholdBytes; + uint32_t highThresholdBytes; + uint64_t pollIntervalTime; + uint64_t reserved[4]; +}; +#endif /* __PRIVATE_SPI__ */ + +/*! @class IONetworkInterface + @abstract Abstract class that manages the connection between an + IONetworkController and the data link interface layer. + @discussion An IONetworkInterface object manages the connection between + an IONetworkController and the data link interface layer (DLIL). + All interactions between the controller and DLIL must go through an + interface object. Any data structures that are required by DLIL for a + particular interface type shall be allocated and mantained by the + interface object. IONetworkInterface is an abstract class that must be + extended by a concrete subclass to specialize for a particular network + type. + + Although most drivers will allocate a single interface object, + it is possible for multiple interfaces to be attached to a single + controller. This controller driver will be responsible for arbitrating + access among its multiple interface clients. + + IONetworkInterface also maintains a dictionary of IONetworkData + objects containing statistics structures. Controller drivers can + ask for a particular data object by name and update the + statistics counters within directly. This dictionary is added to + the interface's property table and is visible outside of the kernel. +*/ + +class IONetworkInterface : public IOService +{ + OSDeclareAbstractStructors( IONetworkInterface ) + + friend class IONetworkStack; + +#ifdef __PRIVATE_SPI__ +public: +/*! @typedef OutputPreEnqueueHandler + @param target Reference supplied when the handler was installed. + @param refCon Reference supplied when the handler was installed. + @param packet The output packet; may be the head of a chain of packets. + Call enqueueOutputPacket() for each packet in the chain to + enqueue the packet before returning. The handler executes on the thread + context of the sending client. +*/ + typedef errno_t (*OutputPreEnqueueHandler)( + void * target, void * refCon, mbuf_t packet ); + + static IOReturn errnoToIOReturn( errno_t error ); +#endif /* __PRIVATE_SPI__ */ + +private: + IONetworkController * _driver; + ifnet_t _backingIfnet; + IOLock * _privateLock; + OSSet * _clientSet; + OSNumber * _stateBits; + bpf_packet_func _inputFilterFunc; + bpf_packet_func _outputFilterFunc; + OSObject * _outTarget; + IOOutputAction _outAction; + UInt32 _clientVar[4]; + OSDictionary * _dataDict; + IOMbufQueue * _inputPushQueue; + void * _unused1; + UInt32 _unused2; + + struct ExpansionData { + int unit; + int type; + int mtu; + int flags; + int eflags; + int addrlen; + int hdrlen; + int32_t loggingLevel; + uint32_t outputQueueModel; + IONetworkStats driverStats; + IONetworkStats lastDriverStats; + ifnet_stat_increment_param inputDeltas; + IORecursiveLock * publicLock; + char * remote_NMI_pattern; + unsigned int remote_NMI_len; + IONetworkController * controller; + uint32_t configFlags; + uint32_t txRingSize; + uint32_t txPullOptions; + uint32_t txQueueSize; + uint32_t txSchedulingModel; + uint32_t txTargetQdelay; + uint32_t txThreadState; + volatile UInt32 txThreadFlags; + uint32_t txThreadSignal; + uint32_t txThreadSignalLast; + thread_t txStartThread; + void * txStartAction; + IOWorkLoop * txWorkLoop; + uint32_t rxRingSize; + uint32_t rxPollOptions; + uint32_t rxPollModel; + void * rxPollAction; + void * rxCtlAction; + uint64_t rxPollEmpty; + uint64_t rxPollTotal; +#ifdef __PRIVATE_SPI__ + OutputPreEnqueueHandler peqHandler; + void * peqTarget; + void * peqRefcon; + uint32_t subType; +#endif + uint16_t txStartDelayQueueLength; /* optional */ + uint16_t txStartDelayTimeout; /* optional */ + IOOptionBits clientBehavior; + thread_call_t inputEventThreadCall; // inputEvent() thread call + }; + + ExpansionData * _reserved; + + bool _syncNetworkDataDict(); + SInt32 syncSIOCSIFMEDIA(IONetworkController * ctr, struct ifreq * ifr); + SInt32 syncSIOCGIFMEDIA(IONetworkController * ctr, struct ifreq * ifr, + unsigned long cmd); + SInt32 syncSIOCSIFMTU(IONetworkController * ctr, struct ifreq * ifr); + void drainOutputQueue(ifnet_t ifp, IONetworkController * driver); + IOReturn haltOutputThread(uint32_t stateBit); +#ifdef __PRIVATE_SPI__ + void actionInputCtl(IONetworkController * driver, + ifnet_ctl_cmd_t cmd, uint32_t arglen, void * arg ); +#endif + void pushInputQueue( IOMbufQueue * queue ); + void pushInputPacket( mbuf_t packet, uint32_t length ); + int if_start_precheck( ifnet_t ifp ); + static int performGatedCommand(void *, void *, void *, void *, void *); + static void powerChangeHandler(void *, void *, void *); + static errno_t if_ioctl(ifnet_t ifp, unsigned long cmd, void * data); + static int if_output(ifnet_t ifp, mbuf_t); + static errno_t if_set_bpf_tap(ifnet_t ifp, bpf_tap_mode, bpf_packet_func); + static void if_detach(ifnet_t ifp); + static void if_start(ifnet_t ifp); + static void if_start_gated(ifnet_t ifp); + static void if_input_poll(ifnet_t ifp, uint32_t flags, + uint32_t max_count, + mbuf_t * first_packet, mbuf_t * last_packet, + uint32_t * cnt, uint32_t * len); + static void if_input_poll_gated(ifnet_t ifp, uint32_t flags, + uint32_t max_count, + mbuf_t * first_packet, mbuf_t * last_packet, + uint32_t * cnt, uint32_t * len); +#ifdef __PRIVATE_SPI__ + static errno_t if_input_ctl(ifnet_t ifp, ifnet_ctl_cmd_t cmd, + uint32_t arglen, void * arg); + static errno_t if_output_pre_enqueue(ifnet_t ifp, mbuf_t packet); + static errno_t if_output_ctl(ifnet_t ifp, ifnet_ctl_cmd_t cmd, + u_int32_t arglen, void *arg); +#endif + void notifyDriver( uint32_t type, void * data ); + static void handleNetworkInputEvent(thread_call_param_t param0, thread_call_param_t param1); + +public: + +/*! @function isPrimaryInterface + @abstract Queries whether the interface is the primary network interface + on the system. + @discussion The definition of a primary interface and its discovery is + platform specific. + @result Returns true if the interface is the primary interface, + false otherwise. +*/ + virtual bool isPrimaryInterface( void ) const; + +/*! @function init + @abstract Initializes the IONetworkInterface object. + @discussion Resources are allocated, but an ifnet_t will not + be allocated until the interface is assigned a BSD name and attached to the + network stack. + @param controller A network controller object that will service the + the interface. + @result Returns true on success, false otherwise. +*/ + virtual bool init( IONetworkController * controller ); + +/*! @function isRegistered + @abstract Queries if the interface has attached to the BSD network stack. + @discussion Once attached a kIOBSDNameKey property is added + to the interface object with the assigned BSD name. + @result Returns true if interface is registered and attached to the network + stack, false otherwise. +*/ + virtual bool isRegistered( void ) const; + +/*! @function getInterfaceState + @abstract Reports the current state of the interface object. + @result Returns the current interface state flags. +*/ + virtual UInt32 getInterfaceState( void ) const; + +/*! @function getController + @abstract Gets the IONetworkController object that created + this interface. + @discussion The controller object passed to init() will be retained until + the interface closes the controller. Subclasses can safely call this method + before the controller is closed. + @result Returns the parent IONetworkController object. +*/ + virtual IONetworkController * getController( void ) const; + +/*! @function inputPacket + @abstract For drivers to submit a received packet to the network stack. + @discussion The packet provided to this method may be added to an input + queue managed by the interface object, which the driver can use to postpone + the packet handoff to the network stack, until all received packets have been + added to the input queue. A subsequent call to flushInputQueue(), + will transfer the entire contents of the input queue to the network stack. + This input queue is not protected by a lock. Drivers that leverage this + input queue must either access the queue from a single thread, or enforce + serialized access. + @param mbuf_t The mbuf containing the received packet. + @param length Specify the size of the received packet in the mbuf. + The mbuf length fields are updated with this value. If zero, then the mbuf + length fields are not updated. + @param options Pass kInputOptionQueuePacket to enqueue the + input packet. Pass zero to bypass the input queue, and immediately submit + the packet to the network stack. + @param param A parameter provided by the driver. Not used. + @result Returns the number of packets that were submitted to the network + stack, or zero if the packet was enqueued. +*/ + virtual UInt32 inputPacket( + mbuf_t packet, + UInt32 length = 0, + IOOptionBits options = 0, + void * param = 0 ); + +/*! @enum InputOptionQueuePacket + @discussion Options for inputPacket(). + @constant kInputOptionQueuePacket Enqueue the input packet provided to the + input packet queue. Calls to inputPacket() must be serialized. +*/ + enum { + kInputOptionQueuePacket = 0x1 + }; + +/*! @function flushInputQueue + @abstract Submit all packets held in the input queue to the network stack. + @discussion Allow drivers to remove all packets from the input queue and + submit them to the network stack. This method should be used in concert + with the inputPacket() method, to flush the input queue after + queueing a number of received packets. + @result Returns the number of packets that were submitted to the network + stack. Returns zero if the queue was empty. +*/ + virtual UInt32 flushInputQueue( void ); + +/*! @function clearInputQueue + @abstract Discards all packets in the input queue. + @discussion This method removes all packets from the input queue and + releases them back to the free mbuf pool. It is unusual for a driver to + call this method. + @result Returns the number of packets freed. +*/ + virtual UInt32 clearInputQueue( void ); + +/*! @function inputEvent + @abstract Sends an event to the network stack. + @discussion This method can be used by the driver to send an event to the + network stack. + @param type A constant describing the event type. + @param data An optional data associated with the event. + @result Returns true if the event was delivered, false if the event type + specified is invalid, or if the event delivery failed. +*/ + virtual bool inputEvent( UInt32 type, void * data ); + +/*! @function registerOutputHandler + @abstract Registers a target/action to handle outbound packets. + @discussion The interface object will forward all output packets sent from + the network stack to the target and action registered using this method. + The registration must occur before the interface is registered and opened + by IONetworkStack, otherwise the default handler will be used. + The default target and action is set by init() as the + controller, and the handler returned by the controller's + getOutputHandler() method. + @param target Object that implements the output handler. + @param action The function that will handle output packets. + @result Returns true if the target/action provided was accepted, + false otherwise. +*/ + virtual bool registerOutputHandler( + OSObject * target, + IOOutputAction action ); + +/*! @function getNamePrefix + @abstract Returns the BSD name prefix as a C-string. + @discussion The BSD name for each interface object is generated by + concatenating the string returned by this method, along with an unit number + assigned by IONetworkStack. A concrete interface subclass must + implement this method and return a distinct name prefix for its instances. + @result Returns a pointer to a constant C-string. +*/ + virtual const char * getNamePrefix() const = 0; + +/*! @function getInterfaceType + @abstract Gets the interface type. + @discussion This method returns the interface type previously set by + setInterfaceType. + @result Returns a constant defined in bsd/net/if_types.h + that describes the interface type. +*/ + virtual UInt8 getInterfaceType( void ) const; + +/*! @function getMaxTransferUnit + @abstract Gets the maximum transfer unit for this interface. + @discussion This method calls ifnet_mtu and returns the + maximum transfer unit. + @result Returns the interface MTU size in bytes. +*/ + virtual UInt32 getMaxTransferUnit( void ) const; + +/*! @function getFlags + @abstract Gets the current interface flags. + @discussion This method calls ifnet_flags and returns the + current interface flags. + @result Returns the interface flags. +*/ + virtual UInt16 getFlags( void ) const; + +/*! @function getExtraFlags + @abstract Gets the current interface eflags. + @discussion This method calls ifnet_eflags and returns the + current interface eflags. + @result Returns the value of the interface eflags. +*/ + virtual UInt32 getExtraFlags( void ) const; + +/*! @function getMediaAddressLength + @abstract Gets the size of the media (MAC-layer) address. + @discussion This method calls ifnet_addrlen and returns the + media address length. + @result Returns the size of the media address in bytes. +*/ + virtual UInt8 getMediaAddressLength( void ) const; + +/*! @function getMediaHeaderLength + @abstract Gets the size of the media header. + @discussion This method calls ifnet_hdrlen and returns the + media header length. + @result Returns the size of the media header in bytes. +*/ + virtual UInt8 getMediaHeaderLength( void ) const; + +/*! @function getUnitNumber + @abstract Gets the unit number assigned to this interface object. + @discussion This method calls ifnet_unit and returns the + unit number assigned by IONetworkStack. + @result Returns the assigned interface unit number. +*/ + virtual UInt16 getUnitNumber( void ) const; + +/*! @function addNetworkData + @abstract Adds an IONetworkData object to the interface. + @discussion The IONetworkData object is added to a + collection using the key from IONetworkData::getKey(). + The object provided is retained. + @param aData The IONetworkData object. + @result Returns true if the object was added, false otherwise. +*/ + virtual bool addNetworkData( IONetworkData * aData ); + +/*! @function removeNetworkData + @abstract Removes an IONetworkData object from the interface. + @discussion This method removes an IONetworkData object from + the collection managed by the interface. The object removed is released. + @param aKey An OSSymbol identifying the object to be removed. + @result Returns true if the object was found and removed, false otherwise. +*/ + virtual bool removeNetworkData( const OSSymbol * aKey ); + +/*! @function removeNetworkData + @abstract Removes an IONetworkData object from the interface. + @discussion This method removes an IONetworkData object from + the collection managed by the interface. The object removed is released. + @param aKey A C-string identifying the object to be removed. + @result Returns true if the object was found and removed, false otherwise. +*/ + virtual bool removeNetworkData( const char * aKey ); + +/*! @function getNetworkData + @abstract Gets an IONetworkData object from the interface. + @discussion Returns a reference to an IONetworkData object + that was previously added to the interface, and is associated with the + provided key. + @param aKey A C-string identifying the object. + @result Returns a reference to the matching IONetworkData + object, or NULL if no match was found. +*/ + virtual IONetworkData * getNetworkData( const char * aKey ) const; + +/*! @function getNetworkData + @abstract Gets an IONetworkData object from the interface. + @discussion Returns a reference to an IONetworkData object + that was previously added to the interface, and is associated with the + provided key. + @param aKey An OSSymbol identifying the object. + @result Returns a reference to the matching IONetworkData + object, or NULL if no match was found. +*/ + virtual IONetworkData * getNetworkData(const OSSymbol * aKey) const; + + /* Compatibility methods */ + IONetworkData * getParameter(const char * aKey) const; + bool setExtendedFlags(UInt32 flags, UInt32 clear = 0); + + /* Override IOService::message() */ + virtual IOReturn message( UInt32 type, IOService * provider, void * argument ) APPLE_KEXT_OVERRIDE; + +/*! @function debuggerRegistered + @abstract Tells the IONetworkData that this interface will be + used by the debugger. +*/ + void debuggerRegistered( void ); + +protected: +/*! @function setInterfaceType + @abstract Sets the interface type. + @discussion Sets the interface type before the interface is attached to + the network stack. See bsd/net/if_types.h for defined types. + The kIOInterfaceType is also updated using the provided type. + @param type A constant defined in bsd/net/if_types.h that + describes the interface type. + @result Returns true to indicate success if the interface has not yet + attached to the network stack, otherwise returns false. +*/ + virtual bool setInterfaceType( UInt8 type ); + +/*! @function setMaxTransferUnit + @abstract Sets the maximum transfer unit for this interface. + @discussion Calls ifnet_set_mtu if the interface is attached + to the network stack, and updates the kIOMaxTransferUnit + property using the provided value. + @param mtu The interface MTU size in bytes. + @result Always returns true. +*/ + virtual bool setMaxTransferUnit( UInt32 mtu ); + +/*! @function setFlags + @abstract Performs a read-modify-write operation on the current + interface flags value. + @discussion Calls ifnet_set_flags if the interface is attached + to the network stack, and updates the kIOInterfaceFlags + property using the provided value. See bsd/net/if.h header + file for the flag constants. + @param flags The bits that should be set. + @param clear The bits that should be cleared. If zero, then non + of the flags are cleared and the result is formed by OR'ing the + original flags value with the new flags. + @result Always returns true. +*/ + virtual bool setFlags( UInt16 flags, UInt16 clear = 0 ); + + /* Deprecated. No replacement. */ + virtual bool setExtraFlags( UInt32 flags, UInt32 clear = 0 ); + +/*! @function setMediaAddressLength + @abstract Sets the size of the media (MAC-layer) address. + @discussion Calls ifnet_set_addrlen if interface is attached + to the network stack, and updates the kIOMediaAddressLength + property using the provided value. + @param length The size of the media address in bytes. + @result Always returns true. +*/ + virtual bool setMediaAddressLength( UInt8 length ); + +/*! @function setMediaHeaderLength + @abstract Sets the size of the media header. + @discussion Calls ifnet_set_hdrlen if interface is attached + to the network stack, and updates the kIOMediaHeaderLength + property using the provided value. + @param length The size of the media header in bytes. + @result Always returns true. +*/ + virtual bool setMediaHeaderLength( UInt8 length ); + +/*! @function setUnitNumber + @abstract Assigns an unique unit number to this interface. + @discussion This method is called internally before the interface is + attached to the network stack, to assign an unique unit number to the + interface object. The kIOInterfaceUnit property is also + updated using the provided value. + @param unit The unit number assigned to this interface object. + @result Returns true to indicate success if the interface has not yet + attached to the network stack, otherwise returns false. +*/ + virtual bool setUnitNumber( UInt16 unit ); + +/*! @function free + @abstract Frees the IONetworkInterface object. + @discussion Resource allocated by init() are released, and + clearInputQueue() is called to ensure that the input queue is empty. + The interface should have already detached from the network stack. +*/ + virtual void free( void ) APPLE_KEXT_OVERRIDE; + + /* Override IOService::handleOpen() */ + virtual bool handleOpen( IOService * client, + IOOptionBits options, + void * argument ) APPLE_KEXT_OVERRIDE; + + /* Override IOService::handleClose() */ + virtual void handleClose( IOService * client, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + + /* Override IOService::handleIsOpen() */ + virtual bool handleIsOpen( const IOService * client ) const APPLE_KEXT_OVERRIDE; + +/*! @function lock + @abstract Acquires a recursive lock owned by the interface. + @discussion A recursive lock is allocated and initialized in + init(). This lock is otherwise not used by the + IONetworkInterface class. This method call acquires + the lock and must be balanced with an unlock(). +*/ + virtual void lock( void ); + +/*! @function unlock + @abstract Releases the recursive lock owned by the interface. + @discussion A recursive lock is allocated and initialized in + init(). This lock is otherwise not used by the + IONetworkInterface class. This method call releases + the lock to balance a prior lock(). +*/ + virtual void unlock( void ); + +/*! @function controllerDidOpen + @abstract Sends a notification that the interface has opened the network + controller. + @discussion This method is called by handleOpen() to notify + subclasses that the controller was opened. The open on the controller + occurs when the interface receives the initial open request from a client. + Subclasses can override this method and inspect the controller before + allowing the client open. This method is called with the arbitration lock + held, hence issuing I/O to the controller must be avoided to eliminate the + possibility of a deadlock. + @param controller The controller that was opened. + @result Must return true in order for handleOpen() to accept the client + open. If the return is false, then the controller will be closed and the + client open will fail. +*/ + virtual bool controllerDidOpen( IONetworkController * controller ); + +/*! @function controllerWillClose + @abstract Sends a notification that the interface will close the network + controller. + @discussion This method is called by handleClose() after + receiving a close from the last interface client, and just before the + controller is closed. Subclasses can override this method to perform any + cleanup action before the controller is closed. This method is called with + the arbitration lock held, hence issuing I/O to the controller should be + avoided to eliminate the possibility of a deadlock. + @param controller The controller that is about to be closed. +*/ + virtual void controllerWillClose( IONetworkController * controller ); + +/*! @function performCommand + @abstract Handles an ioctl command sent to the network interface. + @discussion This method handles socket ioctl commands sent to the + network interface from DLIL. + IONetworkInterface handles commands that are common for all network + interface types. A subclass of IONetworkInterface may override this + method to override the command handling in IONetworkInterface, or + to extend the command processing to handle additional commands. + The ioctl commands handled by IONetworkInterface are + SIOCGIFMTU (Get interface MTU size), + SIOCSIFMTU (Set interface MTU size), + SIOCSIFMEDIA (Set media), and + SIOCGIFMEDIA (Get media and link status). + @param controller The controller object. + @param cmd The ioctl command code. + @param arg0 Command argument 0. Generally a pointer to an ifnet structure + associated with the interface. + @param arg1 Command argument 1. + @result Returns a BSD return value defined in bsd/sys/errno.h. +*/ + virtual SInt32 performCommand( + IONetworkController * controller, + unsigned long cmd, + void * arg0, + void * arg1 ); + +public: + +/*! @function getIfnet + @abstract Returns the ifnet_t allocated by the interface object. + @discussion Gets the interface's ifnet_t, which is managed + primarily by IONetworkInterface, however subclasses or drivers + can use this method to obtain a reference to the ifnet_t for + interface KPI calls. + @result Returns the ifnet_t after the interface has attached + to the network stack and before the interface is detached, otherwise returns + NULL. +*/ + virtual ifnet_t getIfnet( void ) const; + +protected: + + /* Deprecated. Use initIfnetParams instead. */ + virtual bool initIfnet( struct ifnet * ifp ); + +/*! @function handleClientOpen + @abstract Handles a client open on the interface. + @discussion This method is called by handleOpen() to allow a + subclass to handle a client close. The arbitration lock is held. + @param client The client object requesting the open. + @param options Options passed to handleOpen(). + @param argument Argument passed to handleOpen(). + @result Returns true to accept the client open, false to reject the open. +*/ + virtual bool handleClientOpen( IOService * client, + IOOptionBits options, + void * argument ); + +/*! @function handleClientClose + @abstract Handles a client close on the interface. + @discussion This method is called by handleClose() to allow a + subclass to handle a client close. The arbitration lock is held. + @param client The client object requesting the close. + @param options Options same options passed to handleClose(). +*/ + virtual void handleClientClose( IOService * client, + IOOptionBits options ); + + /* Override IOService::newUserClient() */ + virtual IOReturn newUserClient( task_t owningTask, + void * security_id, + UInt32 type, + IOUserClient ** handler ) APPLE_KEXT_OVERRIDE; + +/*! @function setInterfaceState + @abstract Updates the interface object state flags. + @discussion The flags reflect the current state of the interface, and is + also published through the kIOInterfaceState property. + @param set The flags that should be set. + @param clear The flags that should be cleared. + @result Returns the new interface state flags. +*/ + virtual UInt32 setInterfaceState( UInt32 set, UInt32 clear = 0 ); + +/*! @function powerStateWillChangeTo + @abstract Handles a pre-change power interest notification from the + network controller. + @discussion The controllerWillChangePowerState() method is + called by this handler. Subclasses are not expected to override this method. + @param flags Flags that describe the capability of the controller in the + new power state. + @param stateNumber An index to a state in the network controller's + power state array that the controller is switching to. + @param policyMaker A reference to the network controller's policy-maker, + and is also the originator of this notification. + @result Returns IOPMAckImplied to indicate synchronous completion. +*/ + virtual IOReturn powerStateWillChangeTo( + IOPMPowerFlags flags, + unsigned long stateNumber, + IOService * policyMaker ) APPLE_KEXT_OVERRIDE; + +/*! @function powerStateDidChangeTo + @abstract Handles a post-change power interest notification from the + network controller. + @discussion The controllerDidChangePowerState() method is + called by this handler. Subclasses are not expected to override this method. + @param flags Flags that describe the capability of the controller in the + new power state. + @param stateNumber An index to a state in the network controller's + power state array that the controller has switched to. + @param policyMaker A reference to the network controller's policy-maker, + and is also the originator of this notification. + @result Returns IOPMAckImplied to indicate synchronous completion. +*/ + virtual IOReturn powerStateDidChangeTo( + IOPMPowerFlags flags, + unsigned long stateNumber, + IOService * policyMaker ) APPLE_KEXT_OVERRIDE; + +/*! @function controllerWillChangePowerState + @abstract Handles a notification that the network controller servicing + this interface object will transition to a new power state. + @param controller The network controller object. + @param flags Flags that describe the capability of the controller in the + new power state. + @param stateNumber An index to a state in the network controller's + power state array that the controller is switching to. + @param policyMaker A reference to the network controller's policy-maker, + and is also the originator of this notification. + @result The return value is always kIOReturnSuccess. +*/ + virtual IOReturn controllerWillChangePowerState( + IONetworkController * controller, + IOPMPowerFlags flags, + UInt32 stateNumber, + IOService * policyMaker ); + +/*! @function controllerDidChangePowerState + @abstract Handles a notification that the network controller servicing + this interface object has transitioned to a new power state. + @param controller The network controller object. + @param flags Flags that describe the capability of the controller in the + new power state. + @param stateNumber An index to a state in the network controller's + power state array that the controller has switched to. + @param policyMaker A reference to the network controller's policy-maker, + and is also the originator of this notification. + @result The return value is always kIOReturnSuccess. +*/ + virtual IOReturn controllerDidChangePowerState( + IONetworkController * controller, + IOPMPowerFlags flags, + UInt32 stateNumber, + IOService * policyMaker ); + +public: + /* Override IOService::willTerminate() */ + virtual bool willTerminate( + IOService * provider, + IOOptionBits options ) APPLE_KEXT_OVERRIDE; + + /* Override IOService::requestTerminate() */ + virtual bool requestTerminate( + IOService * provider, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + + /* Override IOService::serializeProperties() */ + virtual bool serializeProperties( OSSerialize * s ) const APPLE_KEXT_OVERRIDE; + +/*! @function attachToDataLinkLayer + @abstract Attach the network interface to the BSD data link layer. + @discussion This method is called internally to attach the network + interface to the BSD data link layer, after an unit number has been + assigned. The calling context is not synchronized against the driver's + work loop. Subclasses may override this method to perform additional + setup before the network stack attach. The getIfnet() method + will return the BSD interface being attached. + @param options Options for the attach call. None are currently defined. + @param parameter Parameter for the attach call. Not currently used. + @result Returns kIOReturnSuccess on success. +*/ + virtual IOReturn attachToDataLinkLayer( IOOptionBits options, + void * parameter ); + + OSMetaClassDeclareReservedUsed(IONetworkInterface, 0); + +/*! @function detachFromDataLinkLayer + @abstract Detach the network interface from the BSD data link layer. + @discussion This method is called internally to detach the network + interface from the BSD data link layer, after the interface has been + terminated and before the last client close. This method will block until + the detach operation is complete. The calling context is not synchronized + against the driver's work loop. Subclasses may override this method to + perform additional cleanup before or after detaching from the network + stack. The getIfnet() method will return NULL after detach. + @param options Options for the detach call. None are currently defined. + @param parameter Parameter for the detach call. Not currently used. +*/ + virtual void detachFromDataLinkLayer( IOOptionBits options, + void * parameter ); + + OSMetaClassDeclareReservedUsed(IONetworkInterface, 1); + +protected: +/*! @function feedPacketInputTap + @abstract Feed received packets to the BPF + @discussion This function is called internally to send input packets to + the BPF input tap when it is enabled. Subclasses are not expected to + override this method. + @param mbuf_t Pointer to the input packet. +*/ + virtual void feedPacketInputTap( mbuf_t ); + + OSMetaClassDeclareReservedUsed(IONetworkInterface, 2); + +/*! @function feedPacketOutputTap + @abstract Feed output packets to the BPF + @discussion This function is called internally to send output packets to + the BPF output tap when it is enabled. Subclasses are not expected to + override this method. + @param mbuf_t Pointer to the output packet. +*/ + virtual void feedPacketOutputTap( mbuf_t ); + + OSMetaClassDeclareReservedUsed(IONetworkInterface, 3); + +/*! @function initIfnetParams + @abstract Allows a subclass to provide ifnet initialization parameters + specific to an interface type. + @discussion This method initializes the parameters that are common to all + network interfaces. An interface subclass is expected to override this + method, call the superclass implementation first, then initialize the + parameters specific to that interface type. This method is called after + an unit number has been assigned to the interface, and just before the + interface is attached to BSD. + @param params Pointer to an ifnet_init_params allocated by + the caller. + @result Returns true on success, false otherwise. +*/ + virtual bool initIfnetParams( struct ifnet_init_params * params ); + + OSMetaClassDeclareReservedUsed(IONetworkInterface, 4); + +/*! @function configureOutputStartDelay + @abstract Configure the output start delay + @discussion This optional routine, if used, needs to be called after + IONetworkInterface::init() and before IONetworkInterface::attachToDataLinkLayer(). + This allows for over-riding ifnet_init_eparams.start_delay_qlen and + ifnet_init_eparams.start_delay_timeout. + @param outputStartDelayQueueLength, maps to ifnet_init_eparams.start_delay_qlen + @param outputStartDelayTimeout, maps to ifnet_init_eparams.start_delay_timeout + @result kIOReturnSuccess if interface was successfully + configured. + */ + IOReturn configureOutputStartDelay( uint16_t outputStartDelayQueueLength, + uint16_t outputStartDelayTimeout ); + +public: +#ifdef __PRIVATE_SPI__ +/*! @function setInterfaceSubType + @abstract Sets the interface sub-type. + @discussion The sub-type must be set before the interface is attached to + the networking stack. The driver's configureInterface() + or attachToDataLinkLayer in a subclass are valid call sites. + @param subType A constant defined in IONetworkTypesPrivate.h. + @result Returns true on success, false otherwise. +*/ + bool setInterfaceSubType( uint32_t subType ); + +/*! @function isBPFTapEnabled + @abstract Query if the BPF tap is enabled. + @abstract Allows a driver to poll the BPF tap state after receiving a + kIONetworkNotificationBPFTapStateChange notification. + @param options No options are currently defined, always pass zero. + @result Returns true if BPF tap is enabled, + false otherwise. +*/ + bool isBPFTapEnabled( IOOptionBits options = 0 ) const; + +/*! @function getLoggingLevel + @abstract Query the logging level for the interface. + @abstract Allows a driver to poll the logging level after receiving a + kIONetworkNotificationLoggingLevelChange notification. + @param options No options are currently defined, always pass zero. + @result Returns the current logging level. +*/ + int32_t getLoggingLevel( IOOptionBits options = 0 ) const; + +/*! @enum OutputPacketSchedulingModel + @discussion Output packet scheduling models. + @constant kOutputPacketSchedulingModelNormal + The default output packet scheduling model where the driver or media does + not require strict scheduling strategy, and that the networking stack is + free to choose the most appropriate scheduling and queueing algorithm, + including shaping traffics. + @constant kOutputPacketSchedulingModelDriverManaged + The alternative output packet scheduling model where the driver or media + requires strict scheduling strategy (e.g. 802.11 WMM), and that the + networking stack is only responsible for creating multiple queues for the + corresponding service classes. + @constant kOutputPacketSchedulingModelFqCodel + The FQ-CoDel packet scheduling model. +*/ + enum { + kOutputPacketSchedulingModelNormal = 0, + kOutputPacketSchedulingModelDriverManaged = 1, + kOutputPacketSchedulingModelFqCodel = 2 + }; + +/*! @function configureOutputPullModel + @abstract Configure and use the pull-model to transmit packets. + @discussion A driver that supports the pull-model to transmit packets must + call this method from configureInterface() to configure the + model, and to transition the interface to use the pull-model exclusively. + In the pull-model, the interface will manage an output queue that a driver + can pull packets from. An output thread will notify the driver through + outputStart() when packets are added to the output queue. + @param driverQueueSize The number of packets that the driver's transmit + queue or ring can hold. This parameter is not currently used by the family, + and drivers can pass zero. + @param options kIONetworkWorkLoopSynchronous forces the output + thread to call outputStart() on the driver's work loop context. + @param outputQueueSize The size of the interface output queue. Unless the + driver has special requirements, it is advisable to pass zero to let the + networking stack choose the output queue size. + @param outputSchedulingModel An output packet scheduling model. + Pass zero or kOutputPacketSchedulingModelNormal for the default + model which lets the network stacking choose the most appropriate scheduling + and queueing algorithm. + @param outputTargetQdelay Allow drivers to set the default target delay. + @result kIOReturnSuccess if interface was successfully + configured to use the pull-model for outbound packets. +*/ + virtual IOReturn configureOutputPullModel( + uint32_t driverQueueSize, + IOOptionBits options = 0, + uint32_t outputQueueSize = 0, + uint32_t outputSchedulingModel = 0, + uint32_t outputTargetQdelay = 0); + + OSMetaClassDeclareReservedUsed(IONetworkInterface, 5); + +/*! @function configureInputPacketPolling + @abstract Configure and enable polling of input packets. + @discussion A driver that supports polled-mode processing of input packets + must call this method from configureInterface() to configure + input polling. Once configured, the network stack is allowed to dynamically + transition the input model from the default push-model where packets are + pushed by the driver to the network stack, to the pull-model where a poller + thread will periodically pull packets (if any) from the driver. + @param driverQueueSize The number of packets that the driver's receive + queue or ring can hold when completely full. + @param options kIONetworkWorkLoopSynchronous forces the + poller thread to call pollInputPackets() on the driver's + work loop context. The setInputPacketPollingEnable() + method call is always synchronized against the driver's work loop. + @result kIOReturnSuccess if input polling was successfully + configured. +*/ + virtual IOReturn configureInputPacketPolling( + uint32_t driverQueueSize, + IOOptionBits options = 0 ); + + OSMetaClassDeclareReservedUsed(IONetworkInterface, 6); + +/*! @function reportDataTransferRates + @abstract For drivers to report the current data transfer rates. + @discussion The rates reported by this method will supersede the single + link speed reported by IONetworkController::setLinkStatus. + This method allows the driver to report asymmetric input and output data + rates, and also the effective data rates when available. + @param outputRateMax The maximum output data rate in bit/s. + @param inputRateMax The maximum input data rate in bit/s. + @param outputRateEffective The effective output data rate in bit/s. + If zero, the outputRateMax value is passed to the network stack. + @param inputRateEffective The effective input data rate in bit/s. + If zero, the inputRateMax value is passed to the network stack. +*/ + virtual void reportDataTransferRates( + uint64_t outputRateMax, + uint64_t inputRateMax, + uint64_t outputRateEffective = 0, + uint64_t inputRateEffective = 0 ); + + OSMetaClassDeclareReservedUsed(IONetworkInterface, 7); + +/*! @function stopOutputThread + @abstract Called by drivers to stop the output thread. + @discussion Only drivers that support the pull output model should call + this method. In the stop state, the output thread will not invoke the + driver's outputStart() method, even when new packets are + added to the output queue. This method is synchronous with respect to + any outputStart() invocation, so upon returning from this + method it is guaranteed that the output thread has stopped executing + driver code. The network interface will internally stop the output + thread before detaching from the network stack, and also before system + shutdown and restart. + @param options No options are currently defined, always pass zero. + @result kIOReturnSuccess if the thread was stopped, + kIOReturnTimeout if the wait for output thread to exit + outputStart() timed out. +*/ + IOReturn stopOutputThread( IOOptionBits options = 0 ); + +/*! @function startOutputThread + @abstract Called by drivers to start the output thread. + @discussion The output thread is initially in a stop state, and it must + be started before it can invoke the driver's outputStart() + method. Drivers may also issue start to release a previous stop request. + After starting the output thread, if the output queue is not empty, or + after a new packet is added to the output queue, the output thread will + wakeup and invoke the driver's outputStart() method. + @param options No options are currently defined, always pass zero. + @result kIOReturnSuccess if start was successful, + kIOReturnNotAttached if the network interface has detached + from the network stack. +*/ + IOReturn startOutputThread( IOOptionBits options = 0 ); + +/*! @function signalOutputThread + @abstract Informs the output thread that driver has completed packet + transmission. + @discussion A driver that supports the pull output model must call this + method after packet transmission is complete, and driver resources are + available to outputStart() to handle additional packets. + It is recommended to batch this call when retiring a group of output + packets. This method will wake up the output thread if the output queue + is not empty, and the output thread is not stopped. + @param options No options are currently defined, always pass zero. +*/ + void signalOutputThread( IOOptionBits options = 0 ); + +/*! @function flushOutputQueue + @abstract Flush all packets in the interface output queue. + @discussion A driver that supports the pull output model can use this + method to free all packets currently held in the interface output queue. + @param options No options are currently defined, always pass zero. +*/ + void flushOutputQueue( IOOptionBits options = 0 ); + +/*! @function dequeueOutputPackets + @abstract Dequeue packets from the interface output queue. + @discussion A driver that supports the output pull-model will typically + call this method from outputStart() after it has calculated + the maximum number of packets that can be dequeued based on available + resources. Drivers should not dequeue more packets than they can accept + since there is no facility to insert a packet to the head of the queue. + The only recourse is to drop the packet, or store the packet on a driver + managed queue which is not recommended. This method can dequeue a single + packet as a mbuf chain, or multiple packets using a linked list of mbuf + chains. It is also possible for the queue to not return any packet to the + driver in order to throttle the transmit rate. Although typically called + from outputStart(), this is not a mandatory requirement. E.g. + a driver may choose to dequeue in the transmit completion path to quickly + fill an available transmit slot. + @param maxCount The maximum number of packets to dequeue. This value must + be greater than zero. + @param packetHead Pointer to the first packet that was dequeued. + @param packetTail Optional pointer to the last packet that was dequeued. + @param packetCount Optional pointer to store the number of packets that + was dequeued. + @param packetBytes Optional pointer to store the total length of packets + that was dequeued. The length of each packet is given by + mbuf_pkthdr_len(). + @result kIOReturnSuccess if at least one packet was dequeued, + kIOReturnBadArgument if an argument was invalid, + kIOReturnNoFrames if the queue is empty, or the queue is + limiting the transmit rate. +*/ + virtual IOReturn dequeueOutputPackets( + uint32_t maxCount, + mbuf_t * packetHead, + mbuf_t * packetTail = 0, + uint32_t * packetCount = 0, + uint64_t * packetBytes = 0 ); + + OSMetaClassDeclareReservedUsed(IONetworkInterface, 8); + +/*! @function dequeueOutputPacketsWithServiceClass + @abstract Dequeue packets of a particular service class from the interface + output queue. + @discussion See dequeueOutputPackets. + @param maxCount The maximum number of packets to dequeue. This value must + be greater than zero. + @param serviceClass A service class specification provided by the caller. + Only packets belonging to the specified service class will be dequeued. + @param packetHead Pointer to the first packet that was dequeued. + @param packetTail Optional pointer to the last packet that was dequeued. + @param packetCount Optional pointer to store the number of packets that + was dequeued. + @param packetBytes Optional pointer to store the total length of packets + that was dequeued. The length of each packet is given by + mbuf_pkthdr_len(). + @result kIOReturnSuccess if at least one packet was dequeued, + kIOReturnBadArgument if an argument was invalid, + kIOReturnNoFrames if the queue is empty, no packet belongs to + the service class or the queue is limiting the transmit rate. +*/ + virtual IOReturn dequeueOutputPacketsWithServiceClass( + uint32_t maxCount, + IOMbufServiceClass serviceClass, + mbuf_t * packetHead, + mbuf_t * packetTail = 0, + uint32_t * packetCount = 0, + uint64_t * packetBytes = 0 ); + + OSMetaClassDeclareReservedUsed(IONetworkInterface, 9); + +/*! @function dequeueOutputPacketsWithMaxSize + @abstract Dequeue packets with a byte size constraint. + @discussion See dequeueOutputPackets. + @param maxSize The maximum byte size of the dequeued packet chain. + This value must be greater than zero. + @param packetHead Pointer to the first packet that was dequeued. + @param packetTail Optional pointer to the last packet that was dequeued. + @param packetCount Optional pointer to store the number of packets that + was dequeued. + @param packetBytes Optional pointer to store the total length of packets + that was dequeued. The length of each packet is given by + mbuf_pkthdr_len(). +*/ + IOReturn dequeueOutputPacketsWithMaxSize( + uint32_t maxSize, + mbuf_t * packetHead, + mbuf_t * packetTail = 0, + uint32_t * packetCount = 0, + uint64_t * packetBytes = 0 ); + +/* @function installOutputPreEnqueueHandler + @abstract Install a handler to intercept all output packets before they + are added to the output queue. + @discussion A single handler can be installed before the interface is + attached to the networking stack. The handler will not be invoked unless + the driver configures the interface to utilize the new output pull-model. + @param handler A C-function handler. + @target A reference passed to the handler. + @refCon A reference constant passed to the handler. + @result kIOReturnSuccess if the handler was successfully + installed, kIOReturnBadArgument if the handler provided was + NULL, or kIOReturnError if the call was made after the + interface has already attached to the networking stack. +*/ + IOReturn installOutputPreEnqueueHandler( + OutputPreEnqueueHandler handler, + void * target, + void * refCon ); + +/* @function enqueueOutputPacket + @abstract Enqueue a packet to the output queue. + @discussion Wrapper for the private ifnet_enqueue(). + @param packet The packet being enqueued; only one packet is allowed + to be enqueued at a time. + @param options No options are currently defined, always pass zero. + @result The value returned by ifnet_enqueue(). +*/ + errno_t enqueueOutputPacket( + mbuf_t packet, + IOOptionBits options = 0 ); + +/*! @function enqueueInputPacket + @abstract Queue a packet received by the driver before forwarding it to + the networking stack. + @discussion When input polling is not enabled, drivers should call this + method to queue each received packet on the interface input queue, then + flush the input queue at the end of the driver receive loop. When this + method is called as a result of input polling, driver must specify the + polling queue by passing the queue provided by the poller. Access to the + interface input queue is unsynchronized, since input packet handling is + expected to be single-threaded. The input packet must point to a header + mbuf with MBUF_PKTHDR flag set, with any additional mbufs + linked by the next chain. The length in the packet header, including the + data length for every mbuf in the chain must be set. If FCS is included + in the packet data, then the MBUF_HASFCS mbuf flag must be + set. This is the preferred interface to queue and submit an input packet, + and is functionally equivalent to calling inputPacket with + the kInputOptionQueuePacket option. Submitting a chain of + packets is not supported. + @param packet The input packet. Caller ceases ownership of the packet + regardless of the return value. + @param queue Defaults to zero which specifies the interface input queue. + To handoff a packet during input polling, pass the queue provided by the + poller. + @param options No options are currently defined, always pass zero. + @result kIOReturnSuccess if packet was added to the queue, + or an error code otherwise. +*/ + virtual IOReturn enqueueInputPacket( + mbuf_t packet, + IOMbufQueue * queue = 0, + IOOptionBits options = 0 ); + + OSMetaClassDeclareReservedUsed(IONetworkInterface, 10); + +/*! @function reportTransmitCompletionStatus + @abstract Report the transmit completion status for an outgoing packet. + @discussion Invoked by drivers that are capable of reporting when a packet + has been transmitted across the link layer. Besides reporting the packet + transmit status using this method, driver must also publish the + kIONetworkFeatureTransmitCompletionStatus feature. + @param packet The packet that was transmitted. + @param status The transmit status. + @param param1 Always pass zero. + @param param2 Always pass zero. + @param No options are currently defined, always pass zero. + @result kIOReturnSuccess if the transmit status was valid + and accepted, otherwise kIOReturnBadArgument for bad status, + or kIOReturnError if an error occurred when passing the status + to the networking stack. +*/ + IOReturn reportTransmitCompletionStatus( + mbuf_t packet, + IOReturn status, + uint32_t param1 = 0, + uint32_t param2 = 0, + IOOptionBits options = 0 ); + +/*! @function reportDatapathIssue + @abstract Used by kernel network driver or family to inform userspace + of a datapath issue. + @discussion An issue report will be sent to any userspace applications + or daemons that have registered for datapath issues notifications from + this network interface. + @param issue Subsystem specific error code. + @param data Reserved for future use. + @param length Reserved for future use. + @result Returns kIOReturnSuccess if successful, + otherwise an appropriate error code. +*/ + IOReturn reportDatapathIssue( + IOReturn issue, + void * data = 0, + IOByteCount length = 0 ); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_9 +/*! @function setPacketPollingParameters + @abstract Modify the input polling parameters. + @discussion Invokes ifnet_set_poll_params() using the + parameters provided. + @param params Polling parameters. + @param options No options are currently defined, always pass zero. + @result Returns kIOReturnSuccess if successful, + otherwise an appropriate error code. +*/ + IOReturn setPacketPollingParameters( + const IONetworkPacketPollingParameters * params, + IOOptionBits options = 0 ); +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_13 + /*! @function configureClientBehavior + @abstract Configure client behavior. + @discussion Invoked by drivers that wish to alter IONetworkInterface's behavior. + @param options set kIONetworkClientBehaviorLinkStateActiveRegister + to have IONetworkInterface trigger matching when link state goes to active. + set kIONetworkClientBehaviorLinkStateChangeMessage to have + IONetworkInterface deliver an IOKit message when link state changes. + @result Returns kIOReturnSuccess if successful, + otherwise an appropriate error code. + */ + IOReturn configureClientBehavior( IOOptionBits options = 0 ); +#endif + +#else /* !__PRIVATE_SPI__ */ + OSMetaClassDeclareReservedUnused( IONetworkInterface, 5); + OSMetaClassDeclareReservedUnused( IONetworkInterface, 6); + OSMetaClassDeclareReservedUnused( IONetworkInterface, 7); + OSMetaClassDeclareReservedUnused( IONetworkInterface, 8); + OSMetaClassDeclareReservedUnused( IONetworkInterface, 9); + OSMetaClassDeclareReservedUnused( IONetworkInterface, 10); +#endif /* !__PRIVATE_SPI__ */ + OSMetaClassDeclareReservedUnused( IONetworkInterface, 11); + OSMetaClassDeclareReservedUnused( IONetworkInterface, 12); + OSMetaClassDeclareReservedUnused( IONetworkInterface, 13); + OSMetaClassDeclareReservedUnused( IONetworkInterface, 14); + OSMetaClassDeclareReservedUnused( IONetworkInterface, 15); +}; + +#endif /* __cplusplus */ +#endif /* KERNEL */ +#endif /* !_IONETWORKINTERFACE_H */ diff --git a/QualcommWireless/include/IOKit/network/IONetworkMedium.h b/QualcommWireless/include/IOKit/network/IONetworkMedium.h new file mode 100644 index 0000000..62dbc66 --- /dev/null +++ b/QualcommWireless/include/IOKit/network/IONetworkMedium.h @@ -0,0 +1,425 @@ +/* + * Copyright (c) 1998-2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IONETWORKMEDIUM_H +#define _IONETWORKMEDIUM_H + +__BEGIN_DECLS + +#include + +/*! @typedef IOMediumType + @discussion A 32-bit value divided into fields which describes + a single medium type. */ + +typedef UInt32 IOMediumType; + +/*! @defined kIOMediumType + @abstract A property of IONetworkMedium objects. + @discussion The kIOMediumType property is an OSNumber object that describes the type of + medium that this object represents. +*/ + +#define kIOMediumType "Type" + +/*! @defined kIOMediumFlags + @abstract A property of IONetworkMedium objects. + @discussion The kIOMediumFlags property is an OSNumber object that describes a set of + attributes assigned to the medium. +*/ + +#define kIOMediumFlags "Flags" + +/*! @defined kIOMediumSpeed + @abstract A property of IONetworkMedium objects. + @discussion The kIOMediumSpeed property is an OSNumber object that describes the maximum link + speed supported by the medium in bits per second. +*/ + +#define kIOMediumSpeed "Speed" + +/*! @defined kIOMediumIndex + @abstract A property of IONetworkMedium objects. + @discussion The kIOMediumIndex property is an OSNumber object that describes an index assigned + by the owner of the medium object. Its interpretation is driver + specific. +*/ + +#define kIOMediumIndex "Index" + +//=========================================================================== +// Medium Type (IOMediumType). +// +// The medium type is encoded by a 32-bit value. The definitions of +// the fields and the encoding for each field is adapted from FreeBSD. +// +// Bits Definition +// ------------------- +// 4-0 medium subtype +// 7-5 network type +// 15-8 network specific options +// 19-16 reserved +// 27-20 common options +// 31-28 instance number + +// Ethernet. +// +enum { + kIOMediumEthernet = IFM_ETHER, + kIOMediumEthernetAuto = ( IFM_AUTO | IFM_ETHER ), + kIOMediumEthernetManual = ( IFM_MANUAL | IFM_ETHER ), + kIOMediumEthernetNone = ( IFM_NONE | IFM_ETHER ), + kIOMediumEthernet10BaseT = ( IFM_10_T | IFM_ETHER ), + kIOMediumEthernet10Base2 = ( IFM_10_2 | IFM_ETHER ), + kIOMediumEthernet10Base5 = ( IFM_10_5 | IFM_ETHER ), + kIOMediumEthernet100BaseTX = ( IFM_100_TX | IFM_ETHER ), + kIOMediumEthernet100BaseFX = ( IFM_100_FX | IFM_ETHER ), + kIOMediumEthernet100BaseT4 = ( IFM_100_T4 | IFM_ETHER ), + kIOMediumEthernet100BaseVG = ( IFM_100_VG | IFM_ETHER ), + kIOMediumEthernet100BaseT2 = ( IFM_100_T2 | IFM_ETHER ), + kIOMediumEthernet1000BaseSX = ( IFM_1000_SX | IFM_ETHER ), + kIOMediumEthernet10BaseSTP = ( IFM_10_STP | IFM_ETHER ), + kIOMediumEthernet10BaseFL = ( IFM_10_FL | IFM_ETHER ), + kIOMediumEthernet1000BaseLX = ( IFM_1000_LX | IFM_ETHER ), + kIOMediumEthernet1000BaseCX = ( IFM_1000_CX | IFM_ETHER ), + kIOMediumEthernet1000BaseTX = ( IFM_1000_T | IFM_ETHER ), //deprecated- use kIOMediumEthernet1000BaseT instead + kIOMediumEthernet1000BaseT = ( IFM_1000_T | IFM_ETHER ), + kIOMediumEthernetHomePNA1 = ( IFM_HPNA_1 | IFM_ETHER ), + kIOMediumEthernet10GBaseSR = ( IFM_10G_SR | IFM_ETHER ), + kIOMediumEthernet10GBaseLR = ( IFM_10G_LR | IFM_ETHER ), + kIOMediumEthernet10GBaseCX4 = ( IFM_10G_CX4 | IFM_ETHER ), + kIOMediumEthernet10GBaseT = ( IFM_10G_T | IFM_ETHER ), + kIOMediumEthernet2500BaseT = ( IFM_2500_T | IFM_ETHER ), + kIOMediumEthernet5000BaseT = ( IFM_5000_T | IFM_ETHER ) +}; + +// IEEE 802.11 Wireless. +// +enum { + kIOMediumIEEE80211 = IFM_IEEE80211, + kIOMediumIEEE80211Auto = ( IFM_AUTO | IFM_IEEE80211 ), + kIOMediumIEEE80211Manual = ( IFM_MANUAL | IFM_IEEE80211 ), + kIOMediumIEEE80211None = ( IFM_NONE | IFM_IEEE80211 ), + kIOMediumIEEE80211FH1 = ( IFM_IEEE80211_FH1 | IFM_IEEE80211 ), + kIOMediumIEEE80211FH2 = ( IFM_IEEE80211_FH2 | IFM_IEEE80211 ), + kIOMediumIEEE80211DS2 = ( IFM_IEEE80211_DS2 | IFM_IEEE80211 ), + kIOMediumIEEE80211DS5 = ( IFM_IEEE80211_DS5 | IFM_IEEE80211 ), + kIOMediumIEEE80211DS11 = ( IFM_IEEE80211_DS11 | IFM_IEEE80211 ), + kIOMediumIEEE80211DS1 = ( IFM_IEEE80211_DS1 | IFM_IEEE80211 ), + kIOMediumIEEE80211OptionAdhoc = IFM_IEEE80211_ADHOC +}; + +// Common options. +// +enum { + kIOMediumOptionFullDuplex = IFM_FDX, + kIOMediumOptionHalfDuplex = IFM_HDX, + kIOMediumOptionFlowControl = IFM_FLOW, + kIOMediumOptionEEE = IFM_EEE, + kIOMediumOptionFlag0 = IFM_FLAG0, + kIOMediumOptionFlag1 = IFM_FLAG1, + kIOMediumOptionFlag2 = IFM_FLAG2, + kIOMediumOptionLoopback = IFM_LOOP +}; + +// Medium type masks. +// +#define kIOMediumSubTypeMask IFM_TMASK +#define kIOMediumNetworkTypeMask IFM_NMASK +#define kIOMediumOptionsMask IFM_OMASK +#define kIOMediumCommonOptionsMask IFM_GMASK +#define kIOMediumInstanceShift IFM_ISHIFT +#define kIOMediumInstanceMask IFM_IMASK + +// Medium type field accessors. +// +#define IOMediumGetSubType(x) ((x) & kIOMediumSubTypeMask) +#define IOMediumGetNetworkType(x) ((x) & kIOMediumNetworkTypeMask) +#define IOMediumGetInstance(x) (((x) & kIOMediumInstanceMask) >> \ + kIOMediumInstanceShift) + +//=========================================================================== +// Medium flags. + + +//=========================================================================== +// Link status bits. +// +enum { + kIONetworkLinkValid = IFM_AVALID, // link status is valid + kIONetworkLinkActive = IFM_ACTIVE, // link is up/active. + kIONetworkLinkNoNetworkChange = IFM_WAKESAMENET +}; + +__END_DECLS + +#ifdef KERNEL +//=========================================================================== +// IONetworkMedium class. + +#include +#include + +/*! @class IONetworkMedium + @abstract An object that encapsulates information about a network + medium (i.e. 10Base-T, or 100Base-T Full Duplex). + @discussion The main purpose of + this object is for a network driver to advertise its media capability, + through a collection of IONetworkMedium objects stored in a dictionary + in its property table. IONetworkMedium supports serialization, and will + encode its properties in the form of a dictionary to the serialization + stream when instructed. This will allow a user-space application to + browse the set of media types supported by the controller. +*/ + +class IONetworkMedium : public OSObject +{ + OSDeclareDefaultStructors( IONetworkMedium ) + +protected: + IOMediumType _type; + UInt32 _flags; + UInt64 _speed; + UInt32 _index; + const OSSymbol * _name; + + struct ExpansionData { }; + /*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *_reserved; + + +/*! @function free + @abstract Frees the IONetworkMedium object. +*/ + + virtual void free() APPLE_KEXT_OVERRIDE; + +public: + +/*! @function nameForType + @abstract Creates a name that describes a medium type. + @discussion Given a medium type, creates an OSymbol object that + describes the medium type. There is a 1-to-1 mapping between the + medium type, and the medium name created by this method. The caller + is responsible for releasing the OSSymbol object returned. + @param type A medium type. See IONetworkMedium.h for type encoding. + @result Returns an OSSymbol object is created based on the type provided. +*/ + + static const OSSymbol * nameForType(IOMediumType type); + +/*! @function addMedium + @abstract Adds an IONetworkMedium object to a dictionary. + @discussion A helper function to add an IONetworkMedium object to a + given dictionary. The name of the medium is used as the key for the + new dictionary entry. + @param dict An OSDictionary object where the medium object should be + added as a new entry. + @param medium The IONetworkMedium object to add to the dictionary. + @result Returns true on success, false otherwise. +*/ + + static bool addMedium(OSDictionary * dict, + const IONetworkMedium * medium); + +/*! @function removeMedium + @abstract Removes an IONetworkMedium object from a dictionary. + @discussion A helper function to remove an entry in a dictionary. + @param dict The OSDictionary object where the medium object should be + removed from. + @param medium The name of this medium object is used as the key. +*/ + + static void removeMedium(OSDictionary * dict, + const IONetworkMedium * medium); + +/*! @function getMediumWithType + @abstract Finds a medium object from a dictionary with a given type. + @discussion This method iterates through a dictionary and returns an IONetworkMedium + entry with the given type. An optional mask supplies the don't care bits. + @param dict The dictionary to look for a matching entry. + @param type Search for an entry with this type. + @param mask The don't care bits in IOMediumType. Defaults to 0, which + implies that a perfect match is desired. + @result Returns the first matching IONetworkMedium entry found, + or 0 if no match was found. +*/ + + static IONetworkMedium * getMediumWithType(const OSDictionary * dict, + IOMediumType type, + IOMediumType mask = 0); + +/*! @function getMediumWithIndex + @abstract Finds a medium object from a dictionary with a given index. + @discussion This method iterates through a dictionary and returns an IONetworkMedium + entry with the given index. An optional mask supplies the don't care bits. + @param dict The dictionary to look for a matching entry. + @param index Search for an entry with the given index. + @param mask The don't care bits in index. Defaults to 0, which + implies that a perfect match is desired. + @result Returns the first matching IONetworkMedium entry found, + or 0 if no match was found. +*/ + + static IONetworkMedium * getMediumWithIndex(const OSDictionary * dict, + UInt32 index, + UInt32 mask = 0); + +/*! @function init + @abstract Initializes an IONetworkMedium object. + @param type The medium type, this value is encoded with bits defined in + IONetworkMedium.h. + @param speed The maximum (or the only) link speed supported over this + medium in units of bits per second. + @param flags An optional flag for the medium object. + See IONetworkMedium.h for defined flags. + @param index An optional index number assigned by the owner. + Drivers can use this to store an index to a media table in + the driver, or it may map to a driver-defined media type. + @param name An optional name assigned to this medium object. If 0, + then a name will be created based on the medium type by + calling IONetworkMedium::nameForType(). Since the name of + the medium is used as a key when inserted into a dictionary, + the name chosen must be unique within the scope of the owner. + @result Returns true on success, false otherwise. +*/ + + virtual bool init(IOMediumType type, + UInt64 speed, + UInt32 flags = 0, + UInt32 index = 0, + const char * name = 0); + +/*! @function medium + @abstract Factory method that allocates and initializes an IONetworkMedium object. + @param type The medium type, this value is encoded with bits defined in + IONetworkMedium.h. + @param speed The maximum (or the only) link speed supported over this + medium in units of bits per second. + @param flags An optional flag for the medium object. + See IONetworkMedium.h for defined flags. + @param index An optional index number assigned by the owner. + Drivers can use this to store an index to a media table in + the driver, or it may map to a driver-defined media type. + @param name An optional name assigned to this medium object. If 0, + then a name will be created based on the medium type by + calling IONetworkMedium::nameForType(). Since the name of + the medium is used as a key when inserted into a dictionary, + the name chosen must be unique within the scope of the owner. + @result Returns an IONetworkMedium instance on success, or 0 otherwise. +*/ + + static IONetworkMedium * medium(IOMediumType type, + UInt64 speed, + UInt32 flags = 0, + UInt32 index = 0, + const char * name = 0); + +/*! @function getType + @result Returns the medium type assigned to this medium object. +*/ + + virtual IOMediumType getType() const; + +/*! @function getSpeed + @result Returns the maximum link speed supported by this medium. +*/ + + virtual UInt64 getSpeed() const; + +/*! @function getFlags + @result Returns the medium flags. +*/ + + virtual UInt32 getFlags() const; + +/*! @function getIndex + @result Returns the assigned medium index. +*/ + + virtual UInt32 getIndex() const; + +/*! @function getName + @result Returns the name assigned to this medium object. +*/ + + virtual const OSSymbol * getName() const; + +/*! @function getKey + @result Returns the key to use for this medium object. This key should be + used when this object is added to a dictionary. Same as getName(). +*/ + + virtual const OSSymbol * getKey() const; + +/*! @function isEqualTo + @abstract Tests for equality between two IONetworkMedium objects. + @discussion Two IONetworkMedium objects are considered equal if + they have similar properties assigned to them during initialization. + @param medium An IONetworkMedium to test against the IONetworkMedium + object being called. + @result Returns true if equal, false otherwise. +*/ + + virtual bool isEqualTo(const IONetworkMedium * medium) const; + +/*! @function isEqualTo + @abstract Tests for equality between a IONetworkMedium object and an + OSObject. + @discussion The OSObject is considered equal to the IONetworkMedium + object if the OSObject is an IONetworkMedium, and they have + similar properties assigned to them during initialization. + @param obj An OSObject to test against an IONetworkMedium object. + @result Returns true if equal, false otherwise. +*/ + + virtual bool isEqualTo(const OSMetaClassBase * obj) const APPLE_KEXT_OVERRIDE; + +/*! @function serialize + @abstract Serializes the IONetworkMedium object. + @discussion A dictionary is created containing the properties + assigned to this medium object, and this dictionary is then + serialized using the OSSerialize object provided. + @param s An OSSerialize object. + @result Returns true on success, false otherwise. +*/ + + virtual bool serialize(OSSerialize * s) const APPLE_KEXT_OVERRIDE; + + // Virtual function padding + OSMetaClassDeclareReservedUnused( IONetworkMedium, 0); + OSMetaClassDeclareReservedUnused( IONetworkMedium, 1); + OSMetaClassDeclareReservedUnused( IONetworkMedium, 2); + OSMetaClassDeclareReservedUnused( IONetworkMedium, 3); +}; + +// Translate getKey() to getName(). +// +inline const OSSymbol * IONetworkMedium::getKey() const +{ + return getName(); +} + +#endif /* KERNEL */ + +#endif /* !_IONETWORKMEDIUM_H */ diff --git a/QualcommWireless/include/IOKit/network/IONetworkStats.h b/QualcommWireless/include/IOKit/network/IONetworkStats.h new file mode 100644 index 0000000..f358c1e --- /dev/null +++ b/QualcommWireless/include/IOKit/network/IONetworkStats.h @@ -0,0 +1,89 @@ +/* + * Copyright (c) 1998-2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IONETWORKSTATS_H +#define _IONETWORKSTATS_H + +#include + +/*! @header IONetworkStats.h + @discussion Generic network statistics. */ + +//------------------------------------------------------------------------ +// Generic network statistics. Common to all network interfaces. +// +// WARNING: This structure must match the statistics field in +// ifnet->if_data. This structure will overlay a portion of ifnet. + +/*! @typedef IONetworkStats + @discussion Generic network statistics structure. + @field inputPackets count input packets. + @field inputErrors count input errors. + @field outputPackets count output packets. + @field outputErrors count output errors. + @field collisions count collisions on CDMA networks. */ + +typedef struct { + UInt32 inputPackets; + UInt32 inputErrors; + UInt32 outputPackets; + UInt32 outputErrors; + UInt32 collisions; +} IONetworkStats; + +/*! @defined kIONetworkStatsKey + @discussion Defines the name of an IONetworkData that contains + an IONetworkStats. */ + +#define kIONetworkStatsKey "IONetworkStatsKey" + +//------------------------------------------------------------------------ +// Output queue statistics. + +/*! @typedef IOOutputQueueStats + @discussion Statistics recorded by IOOutputQueue objects. + @field capacity queue capacity. + @field size current size of the queue. + @field peakSize peak size of the queue. + @field dropCount number of packets dropped. + @field outputCount number of output packets. + @field retryCount number of retries. + @field stallCount number of queue stalls. */ + +typedef struct { + UInt32 capacity; + UInt32 size; + UInt32 peakSize; + UInt32 dropCount; + UInt32 outputCount; + UInt32 retryCount; + UInt32 stallCount; + UInt32 reserved[4]; +} IOOutputQueueStats; + +/*! @defined kIOOutputQueueStatsKey + @discussion Defines the name of an IONetworkData that contains + an IOOutputQueueStats. */ + +#define kIOOutputQueueStatsKey "IOOutputQueueStatsKey" + +#endif /* !_IONETWORKSTATS_H */ diff --git a/QualcommWireless/include/IOKit/network/IOOutputQueue.h b/QualcommWireless/include/IOKit/network/IOOutputQueue.h new file mode 100644 index 0000000..5716dd6 --- /dev/null +++ b/QualcommWireless/include/IOKit/network/IOOutputQueue.h @@ -0,0 +1,280 @@ +/* + * Copyright (c) 1998-2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOOUTPUTQUEUE_H +#define _IOOUTPUTQUEUE_H + +#include + +// Forward declarations. +// +struct mbuf; +class IONetworkData; + +// FIXME - We do not want the enqueue/dequeue macros defined in queue.h. +// +#undef enqueue +#undef dequeue + +// FIXME - Belongs in IOBasicOutputQueue.h +// +/*! @enum OutputPacketStatus + @abstract The status of the packet sent to the target. + @constant kIOOutputStatusMask Define the status field in the return code. + @constant kIOOutputStatusAccept Packet was accepted by the target. + @constant kIOOutputStatusDropped Packet accepted, but was also dropped. + @constant kIOOutputStatusRetry Target ran out of resources, and is unable + to accept the packet. The ownership of the packet reverts back to the + queue. +*/ + +enum { + kIOOutputStatusMask = 0x00ff, + kIOOutputStatusAccepted = 0x0000, + kIOOutputStatusDropped = 0x0001, + kIOOutputStatusRetry = 0x0002 +}; + +/*! @enum OutputCommands + @abstract A command requested by the target. + @constant kIOOutputCommandMask Define the command field in the return code. + @constant kIOOutputCommandNone No command. + @constant kIOOutputCommandStall A command to stall the queue. +*/ + +enum { + kIOOutputCommandMask = 0xff00, + kIOOutputCommandNone = 0x0000, + kIOOutputCommandStall = 0x0100 +}; + +/*! @enum OutputHandlerReturnCodes + @abstract Common return codes returned by the target's output handler. + @constant kIOReturnOutputSuccess Packet was accepted. + @constant kIOReturnOutputDropped Packet was dropped. + @constant kIOReturnOutputStall Stall the queue and retry the same packet + when the queue is restarted. +*/ + +enum { + kIOReturnOutputSuccess = (kIOOutputStatusAccepted | kIOOutputCommandNone), + kIOReturnOutputDropped = (kIOOutputStatusDropped | kIOOutputCommandNone), + kIOReturnOutputStall = (kIOOutputStatusRetry | kIOOutputCommandStall) +}; + +/*! @class IOOutputQueue + @abstract A packet queue that supports multiple producers and a single + consumer. + @discussion Each producer, or a client thread, will deliver a chain of packets + to the queue. A single consumer will remove packets from the queue one at a + time and forward it to the registered target/action. This object may be used + by an IONetworkController on the output (transmit) side to handle the output + packet flow downstream from an IONetworkInterface, and then call the driver's + output function. IOOutputQueue is an abstract class that provides an interface + for its subclasses. Concrete subclasses will complete the implementation, and + specify the context that the target is called for packets removed from + the queue. +*/ + +class IOOutputQueue : public OSObject +{ + OSDeclareAbstractStructors( IOOutputQueue ) + +private: + + static void runServiceThread(thread_call_param_t, thread_call_param_t); + +protected: + + thread_call_t _callEntry; // callout entry structure. + + struct ExpansionData { }; + /*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *_reserved; + + +/*! @function init + @abstract Initializes an IOOutputQueue object. + @result Returns true if initialized successfully, false otherwise. +*/ + + virtual bool init() APPLE_KEXT_OVERRIDE; + +/*! @function free + @abstract Frees the IOOutputQueue object. + @discussion Release allocated resources, then call super::free(). +*/ + + virtual void free() APPLE_KEXT_OVERRIDE; + +/*! @function scheduleServiceThread + @abstract Schedules a service thread callout. + @discussion This method can be called by service() to schedule + a thread that will call serviceThread() when it starts running. + @param param A parameter to pass to the serviceThread() method. + @result Returns true if a thread callout was scheduled, false otherwise. +*/ + + virtual bool scheduleServiceThread(void * param = 0); + +/*! @function cancelServiceThread + @abstract Cancels any pending service thread callout. + @result Returns true if a previously scheduled thread callout was canceled, + false otherwise. +*/ + + virtual bool cancelServiceThread(); + +/*! @function serviceThread + @abstract Method called by the scheduled service thread when it + starts to run. + @discussion Must be implemented by a subclass that calls + scheduleServiceThread(). The default implementation does nothing. + @param param A parameter that was given to scheduleServiceThread() + when the service thread was scheduled. +*/ + + virtual void serviceThread(void * param); + +public: + +/*! @function start + @abstract Starts up the queue. + @discussion This method is called by the target to start the queue. This will allow + packets to be removed from the queue, then delivered to the target. + @result Returns true if the queue was started successfully, false otherwise. +*/ + + virtual bool start() = 0; + +/*! @function stop + @abstract Stops the queue. + @discussion Stop the queue and prevent it from sending packets to its + target. + @result Returns the previous running state of the queue, + true if the queue was running, false if the queue was already stopped. +*/ + + virtual bool stop() = 0; + +/*! @function service + @abstract Services the queue. + @discussion Manage the queue after it has been started. + @param options Options for the service request. + @result Returns a return value to indicate the service result. +*/ + + virtual bool service(IOOptionBits options = 0) = 0; + +/*! @function flush + @abstract Drops and frees all packets currently held by the queue. + @result Returns the number of packets that were dropped and freed. +*/ + + virtual UInt32 flush() = 0; + +/*! @function setCapacity + @abstract Changes the number of packets that the queue can hold + before it begins to drop excess packets. + @param capacity The new desired capacity. + @result Returns true if the new capacity was accepted, false otherwise. +*/ + + virtual bool setCapacity(UInt32 capacity) = 0; + +/*! @function getCapacity + @abstract Gets the number of packets that the queue can hold. + @discussion The queue will begin to drop incoming packets when the + size of queue reaches its capacity. + @result Returns the current queue capacity. +*/ + + virtual UInt32 getCapacity() const = 0; + +/*! @function getSize + @abstract Gets the number of packets currently held in the queue. + @result Returns the size of the queue. +*/ + + virtual UInt32 getSize() const = 0; + +/*! @function enqueue + @abstract Adds a packet, or a chain of packets, to the queue. + @discussion This method is called by a client to add a packet, or a chain of packets, + to the queue. A packet is described by an mbuf chain, while a chain + of packets is constructed by linking multiple mbuf chains via the + m_nextpkt field. + @param m A single packet, or a chain of packets. + @param param A parameter provided by the caller. + @result Returns a return code. +*/ + + virtual UInt32 enqueue(mbuf_t m, void * param) = 0; + +/*! @function getOutputHandler + @abstract Returns the address of a function that is designated to handle + incoming packets sent to the queue object. + @result Returns the address of the enqueue() method. +*/ + + virtual IOOutputAction getOutputHandler() const; + +/*! @function getStatisticsData + @abstract Returns an IONetworkData object containing statistics counters + updated by the queue. + @result Returns an IONetworkData object. This implementation will always return + 0. +*/ + + virtual IONetworkData * getStatisticsData() const; + + /*! @function getMbufPriority + @abstract Determines an mbuf's traffic priority. The highest priority is 0. + @discussion A queue can prioritize certain classes of traffic. This method + facilitates that by evaluating an mbuf and returning its priority. + @param m An mbuf to analyze. + @result Returns a UInt32 representing the priority of the packet. 0 is the highest priority. + */ + + OSMetaClassDeclareReservedUsed( IOOutputQueue, 0); + virtual UInt32 getMbufPriority(mbuf_t m); + + // Virtual function padding + OSMetaClassDeclareReservedUnused( IOOutputQueue, 1); + OSMetaClassDeclareReservedUnused( IOOutputQueue, 2); + OSMetaClassDeclareReservedUnused( IOOutputQueue, 3); + OSMetaClassDeclareReservedUnused( IOOutputQueue, 4); + OSMetaClassDeclareReservedUnused( IOOutputQueue, 5); + OSMetaClassDeclareReservedUnused( IOOutputQueue, 6); + OSMetaClassDeclareReservedUnused( IOOutputQueue, 7); + OSMetaClassDeclareReservedUnused( IOOutputQueue, 8); + OSMetaClassDeclareReservedUnused( IOOutputQueue, 9); + OSMetaClassDeclareReservedUnused( IOOutputQueue, 10); + OSMetaClassDeclareReservedUnused( IOOutputQueue, 11); + OSMetaClassDeclareReservedUnused( IOOutputQueue, 12); + OSMetaClassDeclareReservedUnused( IOOutputQueue, 13); + OSMetaClassDeclareReservedUnused( IOOutputQueue, 14); + OSMetaClassDeclareReservedUnused( IOOutputQueue, 15); +}; + +#endif /* !_IOOUTPUTQUEUE_H */ diff --git a/QualcommWireless/include/IOKit/network/IOPacketQueue.h b/QualcommWireless/include/IOKit/network/IOPacketQueue.h new file mode 100644 index 0000000..b6694b0 --- /dev/null +++ b/QualcommWireless/include/IOKit/network/IOPacketQueue.h @@ -0,0 +1,290 @@ +/* + * Copyright (c) 1998-2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOPACKETQUEUE_H +#define _IOPACKETQUEUE_H + +#include +#include +extern "C" { +#include +} +// Forward declarations. +// +struct mbuf; +struct IOMbufQueue; + +// We do not want the enqueue/dequeue macros defined in queue.h. +// +// #warning queue.h should not be included +#undef enqueue +#undef dequeue + +/*! @class IOPacketQueue + @abstract Implements a bounded FIFO queue of mbuf packets. + @discussion Packets are + removed from the head of the queue (dequeue), and new packets are added + to the tail of the queue (enqueue). A spinlock is used to synchronize + access to the queue between methods that have a "lock" prefix. +*/ + +class IOPacketQueue : public OSObject +{ + OSDeclareDefaultStructors( IOPacketQueue ) + +protected: + IOMbufQueue * _queue; // mbuf queue + IOSimpleLock * _lock; // spinlock for synchronized methods + + struct ExpansionData { }; + /*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *_reserved; + +/*! @function free + @abstract Frees the IOPacketQueue object. + @discussion All packets held by the queue are released back to the free + pool, resource are deallocated, then super::free() is called. +*/ + + virtual void free() APPLE_KEXT_OVERRIDE; + +/*! @var IOPacketQueueDefaultCapacity + @abstract Describes the default capacity of the + queue object. + @discussion The capacity is only observed by the enqueue() method. + Therefore, it is possible for the size of the queue to exceed its + capacity when other methods, such as prepend(), are used to add packets + to the queue. +*/ + + static const UInt32 IOPacketQueueDefaultCapacity = 100; + +public: + +/*! @function withCapacity + @abstract Factory method that constructs and initializes an + IOPacketQueue object. + @param capacity The initial capacity of the queue object. Can be + later changed by calling the setCapacity() method. + @result Returns an IOPacketQueue instance on success, or 0 otherwise. +*/ + + static IOPacketQueue * withCapacity(UInt32 capacity = + IOPacketQueueDefaultCapacity); + +/*! @function initWithCapacity + @abstract Initializes an IOPacketQueue object. + @discussion This method initializes an IOPacketQueue object with the given capacity. + @param capacity The initial capacity of the queue. Can be later changed + by calling the setCapacity() method. + @result Returns true if initialized successfully, false otherwise. +*/ + + virtual bool initWithCapacity(UInt32 capacity = + IOPacketQueueDefaultCapacity); + +/*! @function getSize + @abstract Gets the size of the queue. + @result Returns the number of packets currently held by the queue. +*/ + + virtual UInt32 getSize() const; + +/*! @function setCapacity + @abstract Changes the capacity of the queue. + @param capacity The new capacity. + @result Returns true if the new capacity was accepted, false otherwise. +*/ + + virtual bool setCapacity(UInt32 capacity); + +/*! @function getCapacity + @abstract Gets the current capacity of the queue. + @result Returns the current queue capacity. +*/ + + virtual UInt32 getCapacity() const; + +/*! @function peek + @abstract Examines the packet at the head of the queue without + removing it from the queue. + @discussion A following call to peek() or dequeue() will return + the same packet. The caller must never modify the mbuf packet returned. + @result Returns the packet at the head of the queue. +*/ + + virtual const mbuf_t peek() const; + +/*! @function prepend + @abstract Adds a chain of packets to the head of the queue. + @param m A chain of packets to add to the head of the queue. +*/ + + virtual void prepend(mbuf_t m); + +/*! @function prepend + @abstract Removes all packets from the specified queue, and adds them + to the head of this queue. + @param queue The source IOPacketQueue object containing the packets to + be transferred. +*/ + + virtual void prepend(IOPacketQueue * queue); + +/*! @function lockPrepend + @abstract Adds a chain of packets to the head of a synchronized queue. + @discussion A spinlock is used to synchronize access to the queue. + @param m A chain of packets to add to the head of the queue. + @result Always returns true. +*/ + + virtual void lockPrepend(mbuf_t m); + +/*! @function enqueue + @abstract Adds a chain of packets to the tail of the queue. + @discussion Packets are not added if the size of the queue has reached + its capacity. + @param m A chain of packets to add to the tail of the queue. + @result Returns true on success, or false to indicate over-capacity and refusal + to accept the packet chain provided. +*/ + + virtual bool enqueue(mbuf_t m); + +/*! @function enqueue + @abstract Removes all packets from the specified queue, and adds them + to the tail of this queue. + @param queue The source IOPacketQueue object containing the packets to + be transferred. + @result Always returns true. +*/ + + virtual bool enqueue(IOPacketQueue * queue); + +/*! @function enqueueWithDrop + @abstract Adds a chain of packets to the tail of the queue. + @discussion Packets are + dropped if the size of the queue has reached its capacity. + @param m A chain of packets to add to the tail of the queue. + @result Returns the number of packets dropped and freed by the queue. +*/ + + virtual UInt32 enqueueWithDrop(mbuf_t m); + +/*! @function lockEnqueue + @abstract Adds a chain of packets to the tail of a synchronized queue. + @discussion Packets are not added if the size of the queue has reached + its capacity. A spinlock is used to synchronize access to the queue. + @param m A chain of packets to add to the tail of the queue. + @result Returns true on success, or false to indicate over-capacity and refusal + to accept the packet chain provided. +*/ + + virtual bool lockEnqueue(mbuf_t m); + +/*! @function lockEnqueueWithDrop + @abstract Adds a chain of packets to the tail of a synchronized queue. + @discussion Packets are dropped if the size of the queue has reached its capacity. A spinlock is used to synchronize access to the queue. + @param m A chain of packets to add to the tail of the queue. + @result Returns the number of packets dropped and freed by the queue. +*/ + + virtual UInt32 lockEnqueueWithDrop(mbuf_t m); + +/*! @function dequeue + @abstract Removes a single packet from the head of the queue. + @result Returns a packet removed from the head of the queue, or NULL if the + queue was empty. +*/ + + virtual mbuf_t dequeue(); + +/*! @function lockDequeue + @abstract Removes a single packet from the head of a synchronized queue. + @discussion A spinlock is used to synchronize access to the queue. + @result Returns a packet removed from the head of the queue, or NULL if the + queue was empty. +*/ + + virtual mbuf_t lockDequeue(); + +/*! @function dequeueAll + @abstract Removes all packets from the queue and returns the head of the + packet chain. + @discussion The size of the queue is cleared to zero. + @result Returns the head of a packet chain linking all packets that were held + in the queue, or NULL if the queue was empty. +*/ + + virtual mbuf_t dequeueAll(); + +/*! @function lockDequeueAll + @abstract Removes all packets from a synchronized queue and returns the + head of the packet chain. + @discussion The size of the queue is cleared to zero. A spinlock is used + to synchronize access to the queue. + @result Returns the head of a packet chain linking all packets that were held + in the queue, or NULL if the queue was empty. +*/ + + virtual mbuf_t lockDequeueAll(); + +/*! @function flush + @abstract Frees all packets currently held in the queue and releases them + back to the free mbuf pool. + @discussion The size of the queue is cleared to zero. + @result Returns the number of packets freed. +*/ + + virtual UInt32 flush(); + +/*! @function lockFlush + @abstract Frees all packets currently held in a synchronized queue and + releases them back to the free mbuf pool. + @discussion The size of the queue is cleared to zero. A spinlock is used + to synchronize access to the queue. + @result Returns the number of packets freed. +*/ + + virtual UInt32 lockFlush(); + + // Virtual Pad functions + OSMetaClassDeclareReservedUnused( IOPacketQueue, 0); + OSMetaClassDeclareReservedUnused( IOPacketQueue, 1); + OSMetaClassDeclareReservedUnused( IOPacketQueue, 2); + OSMetaClassDeclareReservedUnused( IOPacketQueue, 3); + OSMetaClassDeclareReservedUnused( IOPacketQueue, 4); + OSMetaClassDeclareReservedUnused( IOPacketQueue, 5); + OSMetaClassDeclareReservedUnused( IOPacketQueue, 6); + OSMetaClassDeclareReservedUnused( IOPacketQueue, 7); + OSMetaClassDeclareReservedUnused( IOPacketQueue, 8); + OSMetaClassDeclareReservedUnused( IOPacketQueue, 9); + OSMetaClassDeclareReservedUnused( IOPacketQueue, 10); + OSMetaClassDeclareReservedUnused( IOPacketQueue, 11); + OSMetaClassDeclareReservedUnused( IOPacketQueue, 12); + OSMetaClassDeclareReservedUnused( IOPacketQueue, 13); + OSMetaClassDeclareReservedUnused( IOPacketQueue, 14); + OSMetaClassDeclareReservedUnused( IOPacketQueue, 15); +}; + +#endif /* !_IOPACKETQUEUE_H */ diff --git a/QualcommWireless/include/IOKit/network/IOSkywalkEthernetInterface.h b/QualcommWireless/include/IOKit/network/IOSkywalkEthernetInterface.h new file mode 100644 index 0000000..6266d89 --- /dev/null +++ b/QualcommWireless/include/IOKit/network/IOSkywalkEthernetInterface.h @@ -0,0 +1,21 @@ +// +// IOSkywalkEthernetInterface.h +// IO80211Family +// +// Created by 钟先耀 on 2019/10/18. +// Copyright © 2019 钟先耀. All rights reserved. +// + +#ifndef _IOSKYWALKINTERFACE_H +#define _IOSKYWALKINTERFACE_H + +#include + +class IOSkywalkEthernetInterface : public IOEthernetController { + OSDeclareAbstractStructors( IOSkywalkEthernetInterface ) + +public: + +}; + +#endif /* _IOSKYWALKINTERFACE_H */ diff --git a/QualcommWireless/include/IOKit/nvram/IONVRAMController.h b/QualcommWireless/include/IOKit/nvram/IONVRAMController.h new file mode 100644 index 0000000..fcabedf --- /dev/null +++ b/QualcommWireless/include/IOKit/nvram/IONVRAMController.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IONVRAMCONTROLLER_H +#define _IOKIT_IONVRAMCONTROLLER_H + +#include + +class IONVRAMController : public IOService +{ + OSDeclareAbstractStructors(IONVRAMController); + +public: + virtual void registerService(IOOptionBits options = 0) APPLE_KEXT_OVERRIDE; + + virtual void sync(void); + + virtual IOReturn read(IOByteCount offset, UInt8 *buffer, + IOByteCount length) = 0; + virtual IOReturn write(IOByteCount offset, UInt8 *buffer, + IOByteCount length) = 0; +}; + +#endif /* !_IOKIT_IONVRAMCONTROLLER_H */ diff --git a/QualcommWireless/include/IOKit/pci/IOAGPDevice.h b/QualcommWireless/include/IOKit/pci/IOAGPDevice.h new file mode 100644 index 0000000..c3a7d90 --- /dev/null +++ b/QualcommWireless/include/IOKit/pci/IOAGPDevice.h @@ -0,0 +1,222 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. + * + * HISTORY + * + */ + + +#ifndef _IOKIT_IOAGPDEVICE_H +#define _IOKIT_IOAGPDEVICE_H + +#include +#include + +/* Definitions of AGP config registers */ +enum { + kIOPCIConfigAGPStatusOffset = 4, + kIOPCIConfigAGPCommandOffset = 8 +}; + +/* Definitions of AGP Command & Status registers */ +enum { + kIOAGPRequestQueueMask = 0xff000000, + kIOAGPSideBandAddresssing = 0x00000200, + kIOAGPEnable = 0x00000100, + kIOAGP4GbAddressing = 0x00000020, + kIOAGPFastWrite = 0x00000010, + kIOAGP4xDataRate = 0x00000004, + kIOAGP2xDataRate = 0x00000002, + kIOAGP1xDataRate = 0x00000001 +}; + +enum { + kIOAGPGartInvalidate = 0x00000001 +}; + +// getAGPStatus() defines +enum { + kIOAGPDefaultStatus = 0 +}; +enum { + kIOAGPIdle = 0x00000001, + kIOAGPInvalidGARTEntry = 0x00000002, + kIOAGPAccessOutOfRange = 0x00000004 +}; + +#define kIOAGPBusFlagsKey "IOAGPFlags" +enum { + // the AGP target must be idle before invalidating its gart tlb + kIOAGPGartIdleInvalidate = 0x00000001, + + // the AGP target cannot handle operations that cross page boundaries + kIOAGPDisablePageSpans = 0x00000002, + + // the AGP target cannot handle master -> target AGP writes + kIOAGPDisableAGPWrites = 0x00000004, + + // the AGP target cannot handle target -> master PCI reads + kIOAGPDisablePCIReads = 0x00000008, + + // the AGP target cannot handle master -> target PCI writes + kIOAGPDisablePCIWrites = 0x00000010, + + // the AGP target cannot handle all unaligned transactions + kIOAGPDisableUnaligned = 0x00000020, + + kIOAGPDisableFeature6 = 0x00000040, + kIOAGPDisableFeature7 = 0x00000080, + kIOAGPDisableFeature8 = 0x00000100, + kIOAGPDisableFeature9 = 0x00000200 +}; + +// masterState +enum { + kIOAGPStateEnabled = 0x00000001, + kIOAGPStateEnablePending = 0x00010000 +}; + + +/*! @class IOAGPDevice + @abstract An IOService class representing an AGP master device. + @discussion The discovery of an AGP master device by the PCI bus family results in an instance of the IOAGPDevice being created and published. It provides services specific to AGP, in addition to the PCI services supplied by its superclass IOPCIDevice. +*/ + +class IOAGPDevice : public IOPCIDevice +{ + OSDeclareDefaultStructors(IOAGPDevice) + +protected: + +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the IOWorkLoop in the future. +*/ + struct ExpansionData { }; + +/*! @var reserved + Reserved for future use. (Internal use only) +*/ + ExpansionData *reserved; + +public: + UInt32 masterState; + UInt8 masterAGPRegisters; + +/*! @function createAGPSpace + @abstract Allocates the AGP space, and enables AGP transactions on the master and slave. + @discussion This method should be called by the driver for the AGP master device to set the size of the space and enable AGP transactions. It will destroy any AGP space currently allocated. + @param options No options are currently defined, pass zero. + @param address The physical range allocated for the AGP space is passed back to the caller. + @param length An in/out parameter - the caller sets the devices maximum AGP addressing and the actual size created is passed back. + @result Returns an IOReturn code indicating success or failure. +*/ + + virtual IOReturn createAGPSpace( IOOptionBits options, + IOPhysicalAddress * address, + IOPhysicalLength * length ); + +/*! @function destroyAGPSpace + @abstract Destroys the AGP space, and disables AGP transactions on the master and slave. + @discussion This method should be called by the driver to shutdown AGP transactions and release resources. +*/ + + virtual IOReturn destroyAGPSpace( void ); + +/*! @function getAGPRangeAllocator + @abstract Accessor to obtain the AGP range allocator. + @discussion To allocate ranges in AGP space, obtain a range allocator for the space with this method. It is retained while the space is created (until destroyAGPSpace is called) and should not be released by the caller. + @result Returns a pointer to the range allocator for the AGP space. +*/ + + virtual IORangeAllocator * getAGPRangeAllocator( void ); + +/*! @function getAGPStatus + @abstract Returns the current state of the AGP bus. + @discussion Returns state bits for the AGP bus. Only one type of status is currently defined. + @param which Type of status - only kIOAGPDefaultStatus is currently valid. + @result Returns mask of status bits for the AGP bus. +*/ + + virtual IOOptionBits getAGPStatus( IOOptionBits which = kIOAGPDefaultStatus ); + +/*! @function commitAGPMemory + @abstract Makes memory addressable by AGP transactions. + @discussion Makes the memory described by the IOMemoryDescriptor object addressable by AGP by entering its pages into the GART array, given an offset into AGP space supplied by the caller (usually allocated by the AGP range allocator). It is the caller's responsibility to prepare non-kernel pageable memory before calling this method, with IOMemoryDescriptor::prepare. + @param memory A IOMemoryDescriptor object describing the memory to add to the GART. + @param agpOffset An offset into AGP space that the caller has allocated - usually allocated by the AGP range allocator. + @param options Pass kIOAGPGartInvalidate if the AGP target should invalidate any GART TLB. + @result Returns an IOReturn code indicating success or failure. +*/ + + virtual IOReturn commitAGPMemory( IOMemoryDescriptor * memory, + IOByteCount agpOffset, + IOOptionBits options = 0 ); + +/*! @function releaseAGPMemory + @abstract Releases memory addressable by AGP transactions. + @discussion Makes the memory described by the IOMemoryDescriptor object unaddressable by AGP by removing its pages from the GART array, given an offset into AGP space supplied by the caller (usually allocated by the AGP range allocator). It is the caller's responsibility to complete non-kernel pageable memory before calling this method, with IOMemoryDescriptor::complete. + @param memory A IOMemoryDescriptor object describing the memory to remove from the GART. + @param agpOffset An offset into AGP space that the caller has allocated - usually allocated by the AGP range allocator. + @param options Pass kIOAGPGartInvalidate if the AGP target should invalidate any GART TLB. + @result Returns an IOReturn code indicating success or failure. +*/ + + virtual IOReturn releaseAGPMemory( IOMemoryDescriptor * memory, + IOByteCount agpOffset, + IOOptionBits options = 0 ); + + virtual IOReturn resetAGP( IOOptionBits options = 0 ); + +/*! @function getAGPSpace + @abstract Returns the allocated AGP space. + @discussion This method can be called by the driver for the AGP master device to retrieve the physical address and size of the space created with createAGPSpace. + @param address The physical range allocated for the AGP space is passed back to the caller. Zero may be passed if the address is not needed by the caller. + @param length The size of the the AGP space created is passed back. Zero may be passed if the length is not needed by the caller. + @result Returns an IOReturn code indicating success or failure. +*/ + + virtual IOReturn getAGPSpace( IOPhysicalAddress * address, + IOPhysicalLength * length ); + + // Unused Padding + OSMetaClassDeclareReservedUnused(IOAGPDevice, 0); + OSMetaClassDeclareReservedUnused(IOAGPDevice, 1); + OSMetaClassDeclareReservedUnused(IOAGPDevice, 2); + OSMetaClassDeclareReservedUnused(IOAGPDevice, 3); + OSMetaClassDeclareReservedUnused(IOAGPDevice, 4); + OSMetaClassDeclareReservedUnused(IOAGPDevice, 5); + OSMetaClassDeclareReservedUnused(IOAGPDevice, 6); + OSMetaClassDeclareReservedUnused(IOAGPDevice, 7); + OSMetaClassDeclareReservedUnused(IOAGPDevice, 8); + OSMetaClassDeclareReservedUnused(IOAGPDevice, 9); + OSMetaClassDeclareReservedUnused(IOAGPDevice, 10); + OSMetaClassDeclareReservedUnused(IOAGPDevice, 11); + OSMetaClassDeclareReservedUnused(IOAGPDevice, 12); + OSMetaClassDeclareReservedUnused(IOAGPDevice, 13); + OSMetaClassDeclareReservedUnused(IOAGPDevice, 14); + OSMetaClassDeclareReservedUnused(IOAGPDevice, 15); + OSMetaClassDeclareReservedUnused(IOAGPDevice, 16); +}; + +#endif /* ! _IOKIT_IOAGPDEVICE_H */ diff --git a/QualcommWireless/include/IOKit/pci/IOPCIBridge.h b/QualcommWireless/include/IOKit/pci/IOPCIBridge.h new file mode 100644 index 0000000..e4aa04e --- /dev/null +++ b/QualcommWireless/include/IOKit/pci/IOPCIBridge.h @@ -0,0 +1,526 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * HISTORY + * + */ + + +#ifndef _IOKIT_IOPCIBRIDGE_H +#define _IOKIT_IOPCIBRIDGE_H + +#include +#include +#include +#include +#include + +#ifndef __MAC_OS_X_VERSION_MIN_REQUIRED +#error "Missing macOS target version" +#endif + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +class IOPCIConfigurator; +class IOPCIDevice; +class IOPCIMessagedInterruptController; + +enum { + kIOPCIResourceTypeMemory = 0, + kIOPCIResourceTypePrefetchMemory = 1, + kIOPCIResourceTypeIO = 2, + kIOPCIResourceTypeBusNumber = 3, + kIOPCIResourceTypeCount = 4, +}; + +/*! + @class IOPCIBridge + @abstract Base class for all PCI bridge drivers. +*/ + +class IOPCIBridge : public IOService +{ + friend class IOPCIDevice; + friend class IOPCI2PCIBridge; + friend class IOPCIConfigurator; + + OSDeclareAbstractStructors(IOPCIBridge) + +private: + static void initialize(void); + IORegistryEntry * findMatching( OSIterator * in, IOPCIAddressSpace space ); + virtual bool isDTNub( IOPCIDevice * nub ); + bool checkProperties( IOPCIDevice * entry ); + + void removeDevice( IOPCIDevice * device, IOOptionBits options = 0 ); + + void restoreQEnter(IOPCIDevice * device); + void restoreQRemove(IOPCIDevice * device); + + IOReturn restoreTunnelState(IOPCIDevice * rootDevice, IOOptionBits options, + bool * didTunnelController); + IOReturn restoreMachineState( IOOptionBits options, IOPCIDevice * device ); + void tunnelsWait(IOPCIDevice * device); + static IOReturn finishMachineState(IOOptionBits options); + static IOReturn systemPowerChange(void * target, void * refCon, + UInt32 messageType, IOService * service, + void * messageArgument, vm_size_t argSize); + + IOReturn _restoreDeviceState( IOPCIDevice * device, IOOptionBits options ); + IOReturn _restoreDeviceDependents(IOPCIDevice * device, IOOptionBits options, IOPCIDevice * forDependent); + IOReturn resolveLegacyInterrupts( IOService * provider, IOPCIDevice * nub ); + IOReturn resolveMSIInterrupts ( IOService * provider, IOPCIDevice * nub ); + + IOReturn relocate(IOPCIDevice * device, uint32_t options); + void spaceFromProperties( IORegistryEntry * regEntry, + IOPCIAddressSpace * space ); + void updateWakeReason(IOPCIDevice * device); + +protected: +#if !defined(__arm64__) + static SInt32 compareAddressCell( UInt32 cellCount, UInt32 cleft[], UInt32 cright[] ); +#else + static SInt64 compareAddressCell( UInt32 cellCount, UInt32 cleft[], UInt32 cright[] ); +#endif + IOReturn setDeviceASPMBits(IOPCIDevice * device, uint32_t bits); + IOReturn setDeviceL1PMBits(IOPCIDevice * device, uint32_t bits); + IOReturn setDeviceCLKREQBits(IOPCIDevice * device, uint32_t bits); + + IOReturn setDevicePowerState(IOPCIDevice * device, IOOptionBits options, + unsigned long prevState, unsigned long newState); + static IOReturn configOp(IOService * device, uintptr_t op, void * result, void * arg = 0); + static void deferredProbe(IOPCIDevice * device); + + void * __reserved1; + void * __reserved2; + +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the IOPCIBridge in the future. +*/ + struct ExpansionData + { + struct IOPCIRange * rangeLists[kIOPCIResourceTypeCount]; + IOPCIMessagedInterruptController *messagedInterruptController; + }; + +/*! @var reserved + Reserved for future use. (Internal use only) +*/ +private: + ExpansionData *reserved; + +protected: + IOWorkLoop * getConfiguratorWorkLoop(void) const; + +public: + static IOPCIEventSource * createEventSource( + OSObject * owner, IOPCIEventSource::Action action, uint32_t options); + +public: + virtual void probeBus( IOService * provider, UInt8 busNum ); + + virtual UInt8 firstBusNum( void ); + virtual UInt8 lastBusNum( void ); + + virtual void spaceFromProperties( OSDictionary * propTable, + IOPCIAddressSpace * space ); + virtual OSDictionary * constructProperties( IOPCIAddressSpace space ); + + virtual IOPCIDevice * createNub( OSDictionary * from ); + + virtual bool initializeNub( IOPCIDevice * nub, OSDictionary * from ); + + virtual bool publishNub( IOPCIDevice * nub, UInt32 index ); + + virtual bool addBridgeMemoryRange( IOPhysicalAddress start, + IOPhysicalLength length, bool host ); + + virtual bool addBridgeIORange( IOByteCount start, IOByteCount length ); + + +private: + virtual bool constructRange( IOPCIAddressSpace * flags, + IOPhysicalAddress64 phys, IOPhysicalLength64 len, + OSArray * array ); + + virtual bool matchNubWithPropertyTable( IOService * nub, + OSDictionary * propertyTable, + SInt32 * score ); + + virtual bool compareNubName( const IOService * nub, OSString * name, + OSString ** matched = 0 ) const; + + virtual bool pciMatchNub( IOPCIDevice * nub, + OSDictionary * table, SInt32 * score); + + virtual bool matchKeys( IOPCIDevice * nub, const char * keys, + UInt32 defaultMask, UInt8 regNum ); + + virtual IOReturn getNubResources( IOService * nub ); + + virtual IOReturn getNubAddressing( IOPCIDevice * nub ); + + virtual IOReturn getDTNubAddressing( IOPCIDevice * nub ); + +public: + virtual void free( void ) APPLE_KEXT_OVERRIDE; + + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_5 + virtual void stop( IOService * provider ) APPLE_KEXT_OVERRIDE; +#endif + + virtual bool configure( IOService * provider ); + + virtual IOReturn setProperties(OSObject * properties) APPLE_KEXT_OVERRIDE; + + virtual IOReturn newUserClient(task_t owningTask, void * securityID, + UInt32 type, OSDictionary * properties, + IOUserClient ** handler) APPLE_KEXT_OVERRIDE; + + virtual unsigned long maxCapabilityForDomainState ( IOPMPowerFlags domainState ) APPLE_KEXT_OVERRIDE; + virtual unsigned long initialPowerStateForDomainState ( IOPMPowerFlags domainState ) APPLE_KEXT_OVERRIDE; + virtual unsigned long powerStateForDomainState ( IOPMPowerFlags domainState ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn callPlatformFunction(const OSSymbol * functionName, + bool waitForFunction, + void * param1, void * param2, + void * param3, void * param4) APPLE_KEXT_OVERRIDE; + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + virtual IODeviceMemory * ioDeviceMemory( void ) = 0; + + virtual UInt32 configRead32( IOPCIAddressSpace space, UInt8 offset ) = 0; + virtual void configWrite32( IOPCIAddressSpace space, + UInt8 offset, UInt32 data ) = 0; + virtual UInt16 configRead16( IOPCIAddressSpace space, UInt8 offset ) = 0; + virtual void configWrite16( IOPCIAddressSpace space, + UInt8 offset, UInt16 data ) = 0; + virtual UInt8 configRead8( IOPCIAddressSpace space, UInt8 offset ) = 0; + virtual void configWrite8( IOPCIAddressSpace space, + UInt8 offset, UInt8 data ) = 0; + + virtual IOPCIAddressSpace getBridgeSpace( void ) = 0; + + virtual UInt32 findPCICapability( IOPCIAddressSpace space, + UInt8 capabilityID, UInt8 * offset = 0 ); + + virtual IOReturn setPowerState(unsigned long powerStateOrdinal, + IOService * whatDevice) APPLE_KEXT_OVERRIDE; + virtual IOReturn setDevicePowerState( IOPCIDevice * device, + unsigned long whatToDo ); + virtual IOReturn saveDeviceState( IOPCIDevice * device, + IOOptionBits options = 0 ); + virtual IOReturn restoreDeviceState( IOPCIDevice * device, + IOOptionBits options = 0 ); + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + virtual IOReturn createAGPSpace( IOAGPDevice * master, + IOOptionBits options, + IOPhysicalAddress * address, + IOPhysicalLength * length ); + + virtual IOReturn destroyAGPSpace( IOAGPDevice * master ); + + virtual IORangeAllocator * getAGPRangeAllocator( IOAGPDevice * master ); + + virtual IOOptionBits getAGPStatus( IOAGPDevice * master, + IOOptionBits options = 0 ); + virtual IOReturn resetAGPDevice( IOAGPDevice * master, + IOOptionBits options = 0 ); + + virtual IOReturn getAGPSpace( IOAGPDevice * master, + IOPhysicalAddress * address, + IOPhysicalLength * length ); + + virtual IOReturn commitAGPMemory( IOAGPDevice * master, + IOMemoryDescriptor * memory, + IOByteCount agpOffset, + IOOptionBits options ); + + virtual IOReturn releaseAGPMemory( IOAGPDevice * master, + IOMemoryDescriptor * memory, + IOByteCount agpOffset, + IOOptionBits options ); + +protected: + OSMetaClassDeclareReservedUsed(IOPCIBridge, 0); +private: + virtual bool addBridgePrefetchableMemoryRange( IOPhysicalAddress start, + IOPhysicalLength length, + bool host ); +protected: + bool addBridgePrefetchableMemoryRange( addr64_t start, addr64_t length ); + IOReturn kernelRequestProbe(IOPCIDevice * device, uint32_t options); + IOReturn protectDevice(IOPCIDevice * device, uint32_t space, uint32_t prot); + + OSMetaClassDeclareReservedUsed(IOPCIBridge, 1); + virtual UInt32 extendedFindPCICapability( IOPCIAddressSpace space, + UInt32 capabilityID, IOByteCount * offset = 0 ); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_6 + OSMetaClassDeclareReservedUsed(IOPCIBridge, 2); + virtual IOReturn setDeviceASPMState(IOPCIDevice * device, + IOService * client, IOOptionBits state); +#else + OSMetaClassDeclareReservedUnused(IOPCIBridge, 2); +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_7 + OSMetaClassDeclareReservedUsed(IOPCIBridge, 3); + virtual IOReturn checkLink(uint32_t options = 0); +#else + OSMetaClassDeclareReservedUnused(IOPCIBridge, 3); +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_10 + OSMetaClassDeclareReservedUsed(IOPCIBridge, 4); + virtual IOReturn enableLTR(IOPCIDevice * device, bool enable); + + OSMetaClassDeclareReservedUsed(IOPCIBridge, 5); + virtual IOPCIEventSource * createEventSource(IOPCIDevice * device, + OSObject * owner, IOPCIEventSource::Action action, uint32_t options); +#else + OSMetaClassDeclareReservedUnused(IOPCIBridge, 4); + OSMetaClassDeclareReservedUnused(IOPCIBridge, 5); +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_12_0 + OSMetaClassDeclareReservedUsed(IOPCIBridge, 6); + virtual UInt32 extendedFindPCICapability(struct IOPCIConfigEntry * entry, + UInt32 capabilityID, + IOByteCount * offset = NULL); +public: + virtual bool init( OSDictionary * propTable ); +#else + OSMetaClassDeclareReservedUnused(IOPCIBridge, 6); +#endif + + // Unused Padding + OSMetaClassDeclareReservedUnused(IOPCIBridge, 7); + OSMetaClassDeclareReservedUnused(IOPCIBridge, 8); + OSMetaClassDeclareReservedUnused(IOPCIBridge, 9); + OSMetaClassDeclareReservedUnused(IOPCIBridge, 10); + OSMetaClassDeclareReservedUnused(IOPCIBridge, 11); + OSMetaClassDeclareReservedUnused(IOPCIBridge, 12); + OSMetaClassDeclareReservedUnused(IOPCIBridge, 13); + OSMetaClassDeclareReservedUnused(IOPCIBridge, 14); + OSMetaClassDeclareReservedUnused(IOPCIBridge, 15); + OSMetaClassDeclareReservedUnused(IOPCIBridge, 16); + OSMetaClassDeclareReservedUnused(IOPCIBridge, 17); + OSMetaClassDeclareReservedUnused(IOPCIBridge, 18); + OSMetaClassDeclareReservedUnused(IOPCIBridge, 19); + OSMetaClassDeclareReservedUnused(IOPCIBridge, 20); + OSMetaClassDeclareReservedUnused(IOPCIBridge, 21); + OSMetaClassDeclareReservedUnused(IOPCIBridge, 22); + OSMetaClassDeclareReservedUnused(IOPCIBridge, 23); + OSMetaClassDeclareReservedUnused(IOPCIBridge, 24); + OSMetaClassDeclareReservedUnused(IOPCIBridge, 25); + OSMetaClassDeclareReservedUnused(IOPCIBridge, 26); + OSMetaClassDeclareReservedUnused(IOPCIBridge, 27); + OSMetaClassDeclareReservedUnused(IOPCIBridge, 28); + OSMetaClassDeclareReservedUnused(IOPCIBridge, 29); + OSMetaClassDeclareReservedUnused(IOPCIBridge, 30); + OSMetaClassDeclareReservedUnused(IOPCIBridge, 31); +}; + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +class IOPCI2PCIBridge : public IOPCIBridge +{ + friend class IOPCIEventSource; + friend class IOPCIDevice; + + OSDeclareDefaultStructors(IOPCI2PCIBridge) + +protected: + IOFilterInterruptEventSource * fBridgeInterruptSource; + +private: + IOPCIDevice * fBridgeDevice; + IOTimerEventSource * fTimerProbeES; + IOWorkLoop * fWorkLoop; + IOPMDriverAssertionID fPMAssertion; + IOSimpleLock * fISRLock; + struct IOPCIAERRoot * fAERRoot; + uint32_t __resvA[6]; + int32_t fTunnelL1EnableCount; + uint32_t fHotplugCount; + + uint8_t _resvA[3]; + uint8_t fHotPlugInts; + uint8_t fIntsPending; + uint8_t fIsAERRoot; + + uint8_t fPresence; + uint8_t fWaitingLinkEnable; + uint8_t fLinkChangeOnly; + uint8_t fBridgeInterruptEnablePending; + uint8_t fNeedProbe; + uint8_t fPresenceInt; + uint8_t fBridgeMSI; + uint8_t fNoDevice; + uint8_t fLinkControlWithPM; + uint8_t fPowerState; + char fLogName[32]; +; + +/*! @struct ExpansionData + @discussion This structure will be used to expand the capablilties of the class in the future. + */ + struct ExpansionData {}; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + ExpansionData *reserved; + +public: + + virtual UInt8 firstBusNum( void ) APPLE_KEXT_OVERRIDE; + virtual UInt8 lastBusNum( void ) APPLE_KEXT_OVERRIDE; + +public: + virtual void free() APPLE_KEXT_OVERRIDE; + + virtual bool serializeProperties( OSSerialize * serialize ) const APPLE_KEXT_OVERRIDE; + + virtual IOService * probe( IOService * provider, + SInt32 * score ) APPLE_KEXT_OVERRIDE; + + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + + virtual void stop( IOService * provider ) APPLE_KEXT_OVERRIDE; + + virtual bool configure( IOService * provider ) APPLE_KEXT_OVERRIDE; + + virtual void probeBus( IOService * provider, UInt8 busNum ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn requestProbe( IOOptionBits options ) APPLE_KEXT_OVERRIDE; + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_5 + virtual void systemWillShutdown(IOOptionBits specifier) APPLE_KEXT_OVERRIDE; +#endif + + virtual void saveBridgeState( void ); + + virtual void restoreBridgeState( void ); + + IOReturn setPowerState( unsigned long powerState, + IOService * whatDevice ) APPLE_KEXT_OVERRIDE; + + void adjustPowerState(unsigned long state); + + virtual IOReturn saveDeviceState( IOPCIDevice * device, + IOOptionBits options = 0 ) APPLE_KEXT_OVERRIDE; + + virtual bool publishNub( IOPCIDevice * nub, UInt32 index ) APPLE_KEXT_OVERRIDE; + + virtual IODeviceMemory * ioDeviceMemory( void ) APPLE_KEXT_OVERRIDE; + + virtual IOPCIAddressSpace getBridgeSpace( void ) APPLE_KEXT_OVERRIDE; + + virtual UInt32 configRead32( IOPCIAddressSpace space, UInt8 offset ) APPLE_KEXT_OVERRIDE; + virtual void configWrite32( IOPCIAddressSpace space, + UInt8 offset, UInt32 data ) APPLE_KEXT_OVERRIDE; + virtual UInt16 configRead16( IOPCIAddressSpace space, UInt8 offset ) APPLE_KEXT_OVERRIDE; + virtual void configWrite16( IOPCIAddressSpace space, + UInt8 offset, UInt16 data ) APPLE_KEXT_OVERRIDE; + virtual UInt8 configRead8( IOPCIAddressSpace space, UInt8 offset ) APPLE_KEXT_OVERRIDE; + virtual void configWrite8( IOPCIAddressSpace space, + UInt8 offset, UInt8 data ) APPLE_KEXT_OVERRIDE; + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_6 + virtual IOReturn setDeviceASPMState(IOPCIDevice * device, + IOService * client, IOOptionBits state) APPLE_KEXT_OVERRIDE; +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_7 + virtual IOReturn checkLink(uint32_t options = 0) APPLE_KEXT_OVERRIDE; +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_10 + virtual IOReturn enableLTR(IOPCIDevice * device, bool enable) APPLE_KEXT_OVERRIDE; + + virtual IOPCIEventSource * createEventSource(IOPCIDevice * device, + OSObject * owner, IOPCIEventSource::Action action, uint32_t options) APPLE_KEXT_OVERRIDE; +#endif + + // Unused Padding + OSMetaClassDeclareReservedUnused(IOPCI2PCIBridge, 0); + OSMetaClassDeclareReservedUnused(IOPCI2PCIBridge, 1); + OSMetaClassDeclareReservedUnused(IOPCI2PCIBridge, 2); + OSMetaClassDeclareReservedUnused(IOPCI2PCIBridge, 3); + OSMetaClassDeclareReservedUnused(IOPCI2PCIBridge, 4); + OSMetaClassDeclareReservedUnused(IOPCI2PCIBridge, 5); + OSMetaClassDeclareReservedUnused(IOPCI2PCIBridge, 6); + OSMetaClassDeclareReservedUnused(IOPCI2PCIBridge, 7); + OSMetaClassDeclareReservedUnused(IOPCI2PCIBridge, 8); + +protected: + void allocateBridgeInterrupts(IOService * provider); + void startBridgeInterrupts(IOService * provider); + void enableBridgeInterrupts(void); + void disableBridgeInterrupts(void); + +private: + IOReturn setTunnelL1Enable(IOPCIDevice * device, IOService * client, + bool l1Enable); + +public: + void startBootDefer(IOService * provider); + + bool filterInterrupt( IOFilterInterruptEventSource * source); + + void handleInterrupt( IOInterruptEventSource * source, + int count ); + void timerProbe(IOTimerEventSource * es); +}; + +#define kIOPCI2PCIBridgeName "IOPP" + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_12_0 +class IOPCIHostBridge : public IOPCIBridge +{ + OSDeclareDefaultStructors(IOPCIHostBridge); +public: + virtual void free(void) APPLE_KEXT_OVERRIDE; + + virtual IOService *probe(IOService * provider, SInt32 *score) APPLE_KEXT_OVERRIDE; + virtual bool configure(IOService * provider) APPLE_KEXT_OVERRIDE; + + // Host bridge data is shared, when bridges have shared resources, i.e. PCIe config space (legacy systems). + // They must be unique, if bridge has no resources to share (Apple Silicone). + IOService *bridgeData; + + // IOPCIFamily 726 (macOS Tahoe) extends the private host bridge layout. + // Keep subclass storage beyond fields written by the runtime superclass. + uint32_t _domainId; +private: + IONotifier *_publishNotifier; +}; +#endif + +#endif /* ! _IOKIT_IOPCIBRIDGE_H */ diff --git a/QualcommWireless/include/IOKit/pci/IOPCIDevice.h b/QualcommWireless/include/IOKit/pci/IOPCIDevice.h new file mode 100644 index 0000000..20b3d8a --- /dev/null +++ b/QualcommWireless/include/IOKit/pci/IOPCIDevice.h @@ -0,0 +1,813 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#ifndef _IOKIT_IOPCIDEVICE_H +#define _IOKIT_IOPCIDEVICE_H + +#include +#include + +#if TARGET_OS_OSX +#include +#endif + +/* Definitions of PCI Config Registers */ +enum { + kIOPCIConfigVendorID = kIOPCIConfigurationOffsetVendorID, + kIOPCIConfigDeviceID = kIOPCIConfigurationOffsetDeviceID, + kIOPCIConfigCommand = kIOPCIConfigurationOffsetCommand, + kIOPCIConfigStatus = kIOPCIConfigurationOffsetStatus, + kIOPCIConfigRevisionID = kIOPCIConfigurationOffsetRevisionID, + kIOPCIConfigClassCode = kIOPCIConfigurationOffsetClassCode, + kIOPCIConfigCacheLineSize = kIOPCIConfigurationOffsetCacheLineSize, + kIOPCIConfigLatencyTimer = kIOPCIConfigurationOffsetLatencyTimer, + kIOPCIConfigHeaderType = kIOPCIConfigurationOffsetHeaderType, + kIOPCIConfigBIST = kIOPCIConfigurationOffsetBIST, + kIOPCIConfigBaseAddress0 = kIOPCIConfigurationOffsetBaseAddress0, + kIOPCIConfigBaseAddress1 = kIOPCIConfigurationOffsetBaseAddress1, + kIOPCIConfigBaseAddress2 = kIOPCIConfigurationOffsetBaseAddress2, + kIOPCIConfigBaseAddress3 = kIOPCIConfigurationOffsetBaseAddress3, + kIOPCIConfigBaseAddress4 = kIOPCIConfigurationOffsetBaseAddress4, + kIOPCIConfigBaseAddress5 = kIOPCIConfigurationOffsetBaseAddress5, + kIOPCIConfigCardBusCISPtr = kIOPCIConfigurationOffsetCardBusCISPtr, + kIOPCIConfigSubSystemVendorID = kIOPCIConfigurationOffsetSubSystemVendorID, + kIOPCIConfigSubSystemID = kIOPCIConfigurationOffsetSubSystemID, + kIOPCIConfigExpansionROMBase = kIOPCIConfigurationOffsetExpansionROMBase, + kIOPCIConfigCapabilitiesPtr = kIOPCIConfigurationOffsetCapabilitiesPtr, + kIOPCIConfigInterruptLine = kIOPCIConfigurationOffsetInterruptLine, + kIOPCIConfigInterruptPin = kIOPCIConfigurationOffsetInterruptPin, + kIOPCIConfigMinimumGrant = kIOPCIConfigurationOffsetMinimumGrant, + kIOPCIConfigMaximumLatency = kIOPCIConfigurationOffsetMaximumLatency +}; + +/* Definitions of Capabilities PCI Config Register */ +enum { + kIOPCIPowerManagementCapability = kIOPCICapabilityIDPowerManagement, + kIOPCIAGPCapability = kIOPCICapabilityIDAGP, + kIOPCIVitalProductDataCapability = kIOPCICapabilityIDVitalProductData, + kIOPCISlotIDCapability = kIOPCICapabilityIDSlotID, + kIOPCIMSICapability = kIOPCICapabilityIDMSI, + kIOPCICPCIHotswapCapability = kIOPCICapabilityIDCPCIHotswap, + kIOPCIPCIXCapability = kIOPCICapabilityIDPCIX, + kIOPCILDTCapability = kIOPCICapabilityIDLDT, + kIOPCIVendorSpecificCapability = kIOPCICapabilityIDVendorSpecific, + kIOPCIDebugPortCapability = kIOPCICapabilityIDDebugPort, + kIOPCICPCIResourceControlCapability = kIOPCICapabilityIDCPCIResourceControl, + kIOPCIHotplugCapability = kIOPCICapabilityIDHotplug, + kIOPCIAGP8Capability = kIOPCICapabilityIDAGP8, + kIOPCISecureCapability = kIOPCICapabilityIDSecure, + kIOPCIPCIExpressCapability = kIOPCICapabilityIDPCIExpress, + kIOPCIMSIXCapability = kIOPCICapabilityIDMSIX, + kIOPCIFPBCapability = kIOPCICapabilityIDFPB, + + kIOPCIExpressErrorReportingCapability = kIOPCIExpressCapabilityIDErrorReporting, + kIOPCIExpressVirtualChannelCapability = kIOPCIExpressCapabilityIDVirtualChannel, + kIOPCIExpressDeviceSerialNumberCapability = kIOPCIExpressCapabilityIDDeviceSerialNumber, + kIOPCIExpressPowerBudgetCapability = kIOPCIExpressCapabilityIDPowerBudget, + kIOPCIExpressAccessControlServicesCapability = kIOPCIExpressCapabilityIDAccessControlServices, + kIOPCIExpressLatencyTolerenceReportingCapability = kIOPCIExpressCapabilityIDLatencyTolerenceReporting, + kIOPCIExpressL1PMSubstatesCapability = kIOPCIExpressCapabilityIDL1PMSubstates, +}; + +/* Space definitions */ +enum { + kIOPCIConfigSpace = 0, + kIOPCIIOSpace = 1, + kIOPCI32BitMemorySpace = 2, + kIOPCI64BitMemorySpace = 3 +}; + +enum { + kPCI2PCIPrimaryBus = 0x18, + kPCI2PCISecondaryBus = 0x19, + kPCI2PCISubordinateBus = 0x1a, + kPCI2PCISecondaryLT = 0x1b, + kPCI2PCIIORange = 0x1c, + kPCI2PCIMemoryRange = 0x20, + kPCI2PCIPrefetchMemoryRange = 0x24, + kPCI2PCIPrefetchUpperBase = 0x28, + kPCI2PCIPrefetchUpperLimit = 0x2c, + kPCI2PCIUpperIORange = 0x30, + kPCI2PCIBridgeControl = 0x3e +}; + +#define IOPCIPMCSPMEDISABLEINS3_DEFINED 1 +#define IOPCIPMCSPMEWAKEREASON_DEFINED 1 + +union IOPCIAddressSpace { + UInt32 bits; + struct { +#if __BIG_ENDIAN__ + unsigned int reloc:1; + unsigned int prefetch:1; + unsigned int t:1; + unsigned int resv:3; + unsigned int space:2; + unsigned int busNum:8; + unsigned int deviceNum:5; + unsigned int functionNum:3; + unsigned int registerNum:8; +#elif __LITTLE_ENDIAN__ + unsigned int registerNum:8; + unsigned int functionNum:3; + unsigned int deviceNum:5; + unsigned int busNum:8; + unsigned int space:2; + unsigned int resv:3; + unsigned int t:1; + unsigned int prefetch:1; + unsigned int reloc:1; +#endif + } s; + struct { +#if __BIG_ENDIAN__ + unsigned int resv:4; + unsigned int registerNumExtended:4; + unsigned int busNum:8; + unsigned int deviceNum:5; + unsigned int functionNum:3; + unsigned int registerNum:8; +#elif __LITTLE_ENDIAN__ + unsigned int registerNum:8; + unsigned int functionNum:3; + unsigned int deviceNum:5; + unsigned int busNum:8; + unsigned int registerNumExtended:4; + unsigned int resv:4; +#endif + } es; +}; +typedef union IOPCIAddressSpace IOPCIAddressSpace; + +struct IOPCIPhysicalAddress { + IOPCIAddressSpace physHi; +#if defined(__i386__) || defined(__x86_64__) + UInt32 physMid; + UInt32 physLo; + UInt32 lengthHi; + UInt32 lengthLo; +#else + UInt32 physLo; + UInt32 physMid; + UInt32 lengthLo; + UInt32 lengthHi; +#endif +}; + +// IOPCIDevice matching property names +#define kIOPCITunnelCompatibleKey "IOPCITunnelCompatible" +#define kIOPCITunnelledKey "IOPCITunnelled" +#define kIOPCITunnelL1EnableKey "IOPCITunnelL1Enable" + +#define kIOPCIPauseCompatibleKey "IOPCIPauseCompatible" + +// property to control PCI default config space save on sleep +#define kIOPMPCIConfigSpaceVolatileKey "IOPMPCIConfigSpaceVolatile" +// property to disable express link on sleep +#define kIOPMPCISleepLinkDisableKey "IOPMPCISleepLinkDisable" +// property to reset secondary bus on sleep +#define kIOPMPCISleepResetKey "IOPMPCISleepReset" + +#ifndef kIOPlatformDeviceASPMEnableKey +#define kIOPlatformDeviceASPMEnableKey "IOPlatformDeviceASPMEnable" +#endif + +#ifndef kIOPCIDeviceASPMSupportedKey +#define kIOPCIDeviceASPMSupportedKey "pci-aspm-supported" +#endif + +#define kIOPCIPMEOptionsKey "IOPCIPMEOptions" + +#define kIOPCITunnelIDKey "IOPCITunnelID" +#define kIOPCITunnelControllerIDKey "IOPCITunnelControllerID" + +#define kIOPCIBridgeInterruptESKey "IOPCIBridgeInterruptES" + +#define kIOPCIDeviceDeviceTreeEntryKey "IOPCIDeviceDeviceTreeEntry" + +enum { + kIOPCIDevicePowerStateCount = 4, + kIOPCIDeviceOffState = 0, + kIOPCIDeviceDozeState = 1, + kIOPCIDeviceOnState = 2, + kIOPCIDevicePausedState = 3, +}; + +enum +{ + // bits getInterruptType result + kIOInterruptTypePCIMessaged = 0x00010000 +}; + +// setLatencyTolerance options +enum +{ + kIOPCILatencySnooped = 0x00000001, + kIOPCILatencyUnsnooped = 0x00000002, +}; + +enum +{ + kIOPCIProbeOptionDone = 0x80000000, + + kIOPCIProbeOptionEject = 0x00100000, + kIOPCIProbeOptionNeedsScan = 0x00200000, +}; + + +// saveDeviceState options +enum +{ + kIOPCIConfigShadowPermanent = 0x80000000, +}; + +#if defined(KERNEL) + +#include +#include + +class IOPCIDevice; +class IOPCIBridge; +class IOPCI2PCIBridge; +class IOPCIMessagedInterruptController; +class IOPCIConfigurator; +class IOPCIEventSource; + +// IOPCIEvent.event +enum +{ + kIOPCIEventCorrectableError = 1, + kIOPCIEventNonFatalError = 2, + kIOPCIEventFatalError = 3, + kIOPCIEventLinkEnableChange = 4, +}; + + +struct IOPCIEvent +{ + IOPCIDevice * reporter; + uint32_t event; + uint32_t data[5]; +}; + +class IOPCIEventSource : public IOEventSource +{ + friend class IOPCIBridge; + friend class IOPCI2PCIBridge; + + OSDeclareDefaultStructors(IOPCIEventSource); +public: + typedef void (*Action)(OSObject * owner, IOPCIEventSource * es, + const IOPCIEvent * event ); +#define IOPCIEventAction IOPCIEventSource::Action + +private: + queue_chain_t fQ; + IOPCI2PCIBridge * fRoot; + IOPCIDevice * fDevice; + uint8_t fReadIndex; + uint8_t fWriteIndex; + IOPCIEvent * fEvents; + +public: + virtual void enable( void ) APPLE_KEXT_OVERRIDE; + virtual void disable( void ) APPLE_KEXT_OVERRIDE; + +protected: + virtual void free( void ) APPLE_KEXT_OVERRIDE; + virtual bool checkForWork( void ) APPLE_KEXT_OVERRIDE; +}; + + +typedef IOReturn (*IOPCIDeviceConfigHandler)(void * ref, + IOMessage message, IOPCIDevice * device, uint32_t state); + +/*! @class IOPCIDevice : public IOService + @abstract An IOService class representing a PCI device. + @discussion The discovery of a PCI device by the PCI bus family results in an instance of the IOPCIDevice being created and published. It provides services for looking up and mapping memory mapped hardware, and access to the PCI configuration and I/O spaces. + +

Matching Supported by IOPCIDevice

+ +Two types of matching are available, OpenFirmware name matching and PCI register matching. Currently, only one of these two matching schemes can be used in the same property table. + +

OpenFirmware Name Matching

+ +IOService performs matching based on the IONameMatch property (see IOService). IOPCIDevices created with OpenFirmware device tree entries will name match based on the standard OpenFirmware name matching properties. + +

PCI Register Matching

+ +A PCI device driver can also match on the values of certain config space registers. + +In each case, several matching values can be specified, and an optional mask for the value of the config space register may follow the value, preceded by an '&' character. +
+
+ kIOPCIMatchKey, "IOPCIMatch" +
+The kIOPCIMatchKey property matches the vendor and device ID (0x00) register, or the subsystem register (0x2c). +
+
+ kIOPCIPrimaryMatchKey, "IOPCIPrimaryMatch" +
+The kIOPCIPrimaryMatchKey property matches the vendor and device ID (0x00) register. +
+
+ kIOPCISecondaryMatchKey, "IOPCISecondaryMatch" +
+The kIOPCISecondaryMatchKey property matches the subsystem register (0x2c). +
+
+ kIOPCIClassMatchKey, "IOPCIClassMatch" +
+The kIOPCIClassMatchKey property matches the class code register (0x08). The default mask for this register is 0xffffff00. +
+
+Examples: +
+
+ <key>IOPCIMatch</key>
+ <string>0x00261011</string> +
+Matches a device whose vendor ID is 0x1011, and device ID is 0x0026, including subsystem IDs. +
+
+ <key>IOPCIMatch</key>
+ <string>0x00789004&0x00ffffff 0x78009004&0x0xff00ffff</string> +
+Matches with any device with a vendor ID of 0x9004, and a device ID of 0xzz78 or 0x78zz, where 'z' is don't care. +
+
+ <key>IOPCIClassMatch</key>
+ <string>0x02000000&0xffff0000</string> +
+
+Matches a device whose class code is 0x0200zz, an ethernet device. + +*/ + +class IOPCIDevice : public IOService +{ +#if TARGET_OS_OSX + OSDeclareDefaultStructorsWithDispatch(IOPCIDevice) +#else + OSDeclareDefaultStructors(IOPCIDevice) +#endif + + friend class IOPCIBridge; + friend class IOPCI2PCIBridge; + friend class IOPCIMessagedInterruptController; + friend class IOPCIConfigurator; + +protected: + IOPCIBridge * parent; + IOMemoryMap * ioMap; + OSObject * slotNameProperty; + +/*! @var reserved + Reserved for future use. (Internal use only) */ + struct IOPCIDeviceExpansionData * reserved; + +public: + IOPCIAddressSpace space; + UInt32 * savedConfig; + +public: + /* IOService/IORegistryEntry methods */ + + virtual bool init( OSDictionary * propTable ) APPLE_KEXT_OVERRIDE; + virtual bool init( IORegistryEntry * from, + const IORegistryPlane * inPlane ) APPLE_KEXT_OVERRIDE; + virtual void free( void ) APPLE_KEXT_OVERRIDE; + virtual bool attach( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void detach( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void detachAbove(const IORegistryPlane *) APPLE_KEXT_OVERRIDE; + + virtual IOReturn newUserClient( task_t owningTask, void * securityID, + UInt32 type, OSDictionary * properties, + IOUserClient ** handler ) APPLE_KEXT_OVERRIDE; + + virtual bool handleOpen(IOService * forClient, IOOptionBits options, void * arg) APPLE_KEXT_OVERRIDE; + virtual void handleClose(IOService * forClient, IOOptionBits options) APPLE_KEXT_OVERRIDE; + + virtual IOReturn requestProbe( IOOptionBits options ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn powerStateWillChangeTo (IOPMPowerFlags capabilities, + unsigned long stateNumber, + IOService* whatDevice) APPLE_KEXT_OVERRIDE; + virtual IOReturn setPowerState( unsigned long, IOService * ) APPLE_KEXT_OVERRIDE; + + virtual unsigned long maxCapabilityForDomainState ( IOPMPowerFlags domainState ) APPLE_KEXT_OVERRIDE; + virtual unsigned long initialPowerStateForDomainState ( IOPMPowerFlags domainState ) APPLE_KEXT_OVERRIDE; + virtual unsigned long powerStateForDomainState ( IOPMPowerFlags domainState ) APPLE_KEXT_OVERRIDE; + + virtual bool compareName( OSString * name, OSString ** matched = 0 ) const APPLE_KEXT_OVERRIDE; + virtual bool matchPropertyTable(OSDictionary * table) APPLE_KEXT_OVERRIDE; + virtual bool matchPropertyTable( OSDictionary * table, + SInt32 * score ) APPLE_KEXT_OVERRIDE; + virtual IOService * matchLocation( IOService * client ) APPLE_KEXT_OVERRIDE; + virtual IOReturn getResources( void ) APPLE_KEXT_OVERRIDE; + virtual IOReturn setProperties(OSObject * properties) APPLE_KEXT_OVERRIDE; + virtual IOReturn callPlatformFunction(const OSSymbol * functionName, + bool waitForFunction, + void * p1, void * p2, + void * p3, void * p4) APPLE_KEXT_OVERRIDE; + virtual IOReturn callPlatformFunction(const char * functionName, + bool waitForFunction, + void * p1, void * p2, + void * p3, void * p4) APPLE_KEXT_OVERRIDE; + virtual IODeviceMemory * getDeviceMemoryWithIndex(unsigned int index) APPLE_KEXT_OVERRIDE; + +private: + bool configAccess(bool write); + bool initReserved(void); + IOReturn setPCIPowerState(uint8_t powerState, uint32_t options); + void updateWakeReason(uint16_t pmeState); + IOReturn enableLTR(IOPCIDevice * device, bool enable); + IOReturn enableACS(IOPCIDevice * device, bool enable); + +public: + + /* Config space accessors */ + + virtual UInt32 configRead32( IOPCIAddressSpace space, UInt8 offset ); + virtual void configWrite32( IOPCIAddressSpace space, + UInt8 offset, UInt32 data ); + virtual UInt16 configRead16( IOPCIAddressSpace space, UInt8 offset ); + virtual void configWrite16( IOPCIAddressSpace space, + UInt8 offset, UInt16 data ); + virtual UInt8 configRead8( IOPCIAddressSpace space, UInt8 offset ); + virtual void configWrite8( IOPCIAddressSpace space, + UInt8 offset, UInt8 data ); + +#if __IOPCIDEVICE_INTERNAL__ + +#if APPLE_KEXT_VTABLE_PADDING + virtual UInt32 configRead32( UInt8 offset ); + virtual UInt16 configRead16( UInt8 offset ); + virtual UInt8 configRead8( UInt8 offset ); + virtual void configWrite32( UInt8 offset, UInt32 data ); + virtual void configWrite16( UInt8 offset, UInt16 data ); + virtual void configWrite8( UInt8 offset, UInt8 data ); +#endif /* APPLE_KEXT_VTABLE_PADDING */ + +#else /* !__IOPCIDEVICE_INTERNAL__ */ + +/*! @function configRead32 + @abstract Reads a 32-bit value from the PCI device's configuration space. + @discussion This method reads a 32-bit configuration space register on the device and returns its value. + @param offset An offset into configuration space, of which bits 0-1 are ignored. + @result An 32-bit value in host byte order (big endian on PPC). */ + + UInt32 configRead32( IOByteCount offset ) { return (extendedConfigRead32(offset)); } + +/*! @function configRead16 + @abstract Reads a 16-bit value from the PCI device's configuration space. + @discussion This method reads a 16-bit configuration space register on the device and returns its value. + @param offset An offset into configuration space, of which bit 0 is ignored. + @result An 16-bit value in host byte order (big endian on PPC). */ + + UInt16 configRead16( IOByteCount offset ) { return (extendedConfigRead16(offset)); } + +/*! @function configRead8 + @abstract Reads a 8-bit value from the PCI device's configuration space. + @discussion This method reads a 8-bit configuration space register on the device and returns its value. + @param offset An offset into configuration space. + @result An 8-bit value. */ + + UInt8 configRead8( IOByteCount offset ) { return (extendedConfigRead8(offset)); } + +/*! @function configWrite32 + @abstract Writes a 32-bit value to the PCI device's configuration space. + @discussion This method write a 32-bit value to a configuration space register on the device. + @param offset An offset into configuration space, of which bits 0-1 are ignored. + @param data An 32-bit value to be written in host byte order (big endian on PPC). */ + + void configWrite32( IOByteCount offset, UInt32 data ) { return (extendedConfigWrite32(offset, data)); } + +/*! @function configWrite16 + @abstract Writes a 16-bit value to the PCI device's configuration space. + @discussion This method write a 16-bit value to a configuration space register on the device. + @param offset An offset into configuration space, of which bit 0 is ignored. + @param data An 16-bit value to be written in host byte order (big endian on PPC). */ + + void configWrite16( IOByteCount offset, UInt16 data ) { return (extendedConfigWrite16(offset, data)); } + +/*! @function configWrite8 + @abstract Writes a 8-bit value to the PCI device's configuration space. + @discussion This method write a 8-bit value to a configuration space register on the device. + @param offset An offset into configuration space. + @param data An 8-bit value to be written. */ + + void configWrite8( IOByteCount offset, UInt8 data ) { return (extendedConfigWrite8(offset, data)); } + + OSMetaClassDeclareReservedUnused(IOPCIDevice, 16); + OSMetaClassDeclareReservedUnused(IOPCIDevice, 17); + OSMetaClassDeclareReservedUnused(IOPCIDevice, 18); + OSMetaClassDeclareReservedUnused(IOPCIDevice, 19); + OSMetaClassDeclareReservedUnused(IOPCIDevice, 20); + OSMetaClassDeclareReservedUnused(IOPCIDevice, 21); +public: + +#endif /* !__IOPCIDEVICE_INTERNAL__ */ + + virtual IOReturn saveDeviceState( IOOptionBits options = 0 ); + virtual IOReturn restoreDeviceState( IOOptionBits options = 0 ); + +/*! @function setConfigBits + @abstract Sets masked bits in a configuration space register. + @discussion This method sets masked bits in a configuration space register on the device by reading and writing the register. The value of the masked bits before the write is returned. + @param offset An 8-bit offset into configuration space, of which bits 0-1 are ignored. + @param mask An 32-bit mask indicating which bits in the value parameter are valid. + @param value An 32-bit value to be written in host byte order (big endian on PPC). + @result The value of the register masked with the mask before the write. */ + + virtual UInt32 setConfigBits( UInt8 offset, UInt32 mask, UInt32 value ); + +/*! @function setMemoryEnable + @abstract Sets the device's memory space response. + @discussion This method sets the memory space response bit in the device's command config space register to the passed value, and returns the previous state of the enable. + @param enable True or false to enable or disable the memory space response. + @result True if the memory space response was previously enabled, false otherwise. */ + + virtual bool setMemoryEnable( bool enable ); + +/*! @function setIOEnable + @abstract Sets the device's I/O space response. + @discussion This method sets the I/O space response bit in the device's command config space register to the passed value, and returns the previous state of the enable. The exclusive option allows only one exclusive device on the bus to be enabled concurrently, this should be only for temporary access. + @param enable True or false to enable or disable the I/O space response. + @param exclusive If true, only one setIOEnable with the exclusive flag set will be allowed at a time on the bus, this should be only for temporary access. + @result True if the I/O space response was previously enabled, false otherwise. */ + + virtual bool setIOEnable( bool enable, bool exclusive = false ); + +/*! @function setBusMasterEnable + @abstract Sets the device's bus master enable. + @discussion This method sets the bus master enable bit in the device's command config space register to the passed value, and returns the previous state of the enable. + @param enable True or false to enable or disable bus mastering. + @result True if bus mastering was previously enabled, false otherwise. */ + + virtual bool setBusMasterEnable( bool enable ); + +/*! @function findPCICapability + @abstract Search configuration space for a PCI capability register. + @discussion This method searches the device's config space for a PCI capability register matching the passed capability ID, if the device supports PCI capabilities. To search for PCI Express extended capabilities or for multiple capablities with the same ID, use the extendedFindPCICapability() method. + @param capabilityID An 8-bit PCI capability ID. + @param offset An optional pointer to return the offset into config space where the capability was found. + @result The 32-bit value of the capability register if one was found, zero otherwise. */ + + virtual UInt32 findPCICapability( UInt8 capabilityID, UInt8 * offset = 0 ); + +/*! @function getBusNumber + @abstract Accessor to return the PCI device's assigned bus number. + @discussion This method is an accessor to return the PCI device's assigned bus number. + @result The 8-bit value of device's PCI bus number. */ + + virtual UInt8 getBusNumber( void ); + +/*! @function getDeviceNumber + @abstract Accessor to return the PCI device's device number. + @discussion This method is an accessor to return the PCI device's device number. + @result The 5-bit value of device's device number. */ + + virtual UInt8 getDeviceNumber( void ); + +/*! @function getFunctionNumber + @abstract Accessor to return the PCI device's function number. + @discussion This method is an accessor to return the PCI device's function number. + @result The 3-bit value of device's function number. */ + + virtual UInt8 getFunctionNumber( void ); + + /* Device memory accessors */ + +/*! @function getDeviceMemoryWithRegister + @abstract Returns an instance of IODeviceMemory representing one of the device's memory mapped ranges. + @discussion This method will return a pointer to an instance of IODeviceMemory for the physical memory range that was assigned to the configuration space base address register passed in. It is analogous to IOService::getDeviceMemoryWithIndex. + @param reg The 8-bit configuration space register that is the base address register for the desired range. + @result A pointer to an instance of IODeviceMemory, or zero no such range was found. The IODeviceMemory is retained by the provider, so is valid while attached, or while any mappings to it exist. It should not be released by the caller. */ + + virtual IODeviceMemory * getDeviceMemoryWithRegister( UInt8 reg ); + +/*! @function mapDeviceMemoryWithRegister + @abstract Maps a physical range of the device. + @discussion This method will create a mapping for the IODeviceMemory for the physical memory range that was assigned to the configuration space base address register passed in, with IODeviceMemory::map(options). The mapping is represented by the returned instance of IOMemoryMap, which should not be released until the mapping is no longer required. This method is analogous to IOService::mapDeviceMemoryWithIndex. + @param reg The 8-bit configuration space register that is the base address register for the desired range. + @param options Options to be passed to the IOMemoryDescriptor::map() method. + @result An instance of IOMemoryMap, or zero if the index is beyond the count available. The mapping should be released only when access to it is no longer required. */ + + virtual IOMemoryMap * mapDeviceMemoryWithRegister( UInt8 reg, + IOOptionBits options = 0 ); + +/*! @function ioDeviceMemory + @abstract Accessor to the I/O space aperture for the bus. + @discussion This method will return a reference to the IODeviceMemory for the I/O aperture of the bus the device is on. + @result A pointer to an IODeviceMemory object for the I/O aperture. The IODeviceMemory is retained by the provider, so is valid while attached, or while any mappings to it exist. It should not be released by the caller. */ + + virtual IODeviceMemory * ioDeviceMemory( void ); + + /* I/O space accessors */ + +/*! @function ioWrite32 + @abstract Writes a 32-bit value to an I/O space aperture. + @discussion This method will write a 32-bit value to a 4 byte aligned offset in an I/O space aperture. If a map object is passed in, the value is written relative to it, otherwise to the value is written relative to the I/O space aperture for the bus. This function encapsulates the differences between architectures in generating I/O space operations. An eieio instruction is included on PPC. + @param offset An offset into a bus or device's I/O space aperture. + @param value The value to be written in host byte order (big endian on PPC). + @param map If the offset is relative to the beginning of a device's aperture, an IOMemoryMap object for that object should be passed in. Otherwise, passing zero will write the value relative to the beginning of the bus' I/O space. */ + + virtual void ioWrite32( UInt16 offset, UInt32 value, + IOMemoryMap * map = 0 ); + +/*! @function ioWrite16 + @abstract Writes a 16-bit value to an I/O space aperture. + @discussion This method will write a 16-bit value to a 2 byte aligned offset in an I/O space aperture. If a map object is passed in, the value is written relative to it, otherwise to the value is written relative to the I/O space aperture for the bus. This function encapsulates the differences between architectures in generating I/O space operations. An eieio instruction is included on PPC. + @param offset An offset into a bus or device's I/O space aperture. + @param value The value to be written in host byte order (big endian on PPC). + @param map If the offset is relative to the beginning of a device's aperture, an IOMemoryMap object for that object should be passed in. Otherwise, passing zero will write the value relative to the beginning of the bus' I/O space. */ + + virtual void ioWrite16( UInt16 offset, UInt16 value, + IOMemoryMap * map = 0 ); + +/*! @function ioWrite8 + @abstract Writes a 8-bit value to an I/O space aperture. + @discussion This method will write a 8-bit value to an offset in an I/O space aperture. If a map object is passed in, the value is written relative to it, otherwise to the value is written relative to the I/O space aperture for the bus. This function encapsulates the differences between architectures in generating I/O space operations. An eieio instruction is included on PPC. + @param offset An offset into a bus or device's I/O space aperture. + @param value The value to be written in host byte order (big endian on PPC). + @param map If the offset is relative to the beginning of a device's aperture, an IOMemoryMap object for that object should be passed in. Otherwise, passing zero will write the value relative to the beginning of the bus' I/O space. */ + + virtual void ioWrite8( UInt16 offset, UInt8 value, + IOMemoryMap * map = 0 ); + +/*! @function ioRead32 + @abstract Reads a 32-bit value from an I/O space aperture. + @discussion This method will read a 32-bit value from a 4 byte aligned offset in an I/O space aperture. If a map object is passed in, the value is read relative to it, otherwise to the value is read relative to the I/O space aperture for the bus. This function encapsulates the differences between architectures in generating I/O space operations. An eieio instruction is included on PPC. + @param offset An offset into a bus or device's I/O space aperture. + @param map If the offset is relative to the beginning of a device's aperture, an IOMemoryMap object for that object should be passed in. Otherwise, passing zero will write the value relative to the beginning of the bus' I/O space. + @result The value read in host byte order (big endian on PPC). */ + + virtual UInt32 ioRead32( UInt16 offset, IOMemoryMap * map = 0 ); + +/*! @function ioRead16 + @abstract Reads a 16-bit value from an I/O space aperture. + @discussion This method will read a 16-bit value from a 2 byte aligned offset in an I/O space aperture. If a map object is passed in, the value is read relative to it, otherwise to the value is read relative to the I/O space aperture for the bus. This function encapsulates the differences between architectures in generating I/O space operations. An eieio instruction is included on PPC. + @param offset An offset into a bus or device's I/O space aperture. + @param map If the offset is relative to the beginning of a device's aperture, an IOMemoryMap object for that object should be passed in. Otherwise, passing zero will write the value relative to the beginning of the bus' I/O space. + @result The value read in host byte order (big endian on PPC). */ + + virtual UInt16 ioRead16( UInt16 offset, IOMemoryMap * map = 0 ); + +/*! @function ioRead8 + @abstract Reads a 8-bit value from an I/O space aperture. + @discussion This method will read a 8-bit value from an offset in an I/O space aperture. If a map object is passed in, the value is read relative to it, otherwise to the value is read relative to the I/O space aperture for the bus. This function encapsulates the differences between architectures in generating I/O space operations. An eieio instruction is included on PPC. + @param offset An offset into a bus or device's I/O space aperture. + @param map If the offset is relative to the beginning of a device's aperture, an IOMemoryMap object for that object should be passed in. Otherwise, passing zero will write the value relative to the beginning of the bus' I/O space. + @result The value read. */ + + virtual UInt8 ioRead8( UInt16 offset, IOMemoryMap * map = 0 ); + + OSMetaClassDeclareReservedUsed(IOPCIDevice, 0); +/*! @function hasPCIPowerManagement + @abstract determine whether or not the device supports PCI Bus Power Management. + @discussion This method will look at the device's capabilties registers and determine whether or not the device supports the PCI BUS Power Management Specification. + @param state (optional) Check for support of a specific state (e.g. kPCIPMCPMESupportFromD3Cold). If state is not suuplied or is 0, then check for a property in the registry which tells which state the hardware expects the device to go to during sleep. + @result true if the specified state is supported */ + virtual bool hasPCIPowerManagement(IOOptionBits state = 0); + + OSMetaClassDeclareReservedUsed(IOPCIDevice, 1); +/*! @function enablePCIPowerManagement + @abstract enable PCI power management for sleep state + @discussion This method will enable PCI Bus Powermanagement when going to sleep mode. + @param state (optional) Enables PCI Power Management by placing the function in the given state (e.g. kPCIPMCSPowerStateD3). If state is not specified or is 0xffffffff, then the IOPCIDevice determines the desired state. If state is kPCIPMCSPowerStateD0 (0) then PCI Power Management is disabled. + @result kIOReturnSuccess if there were no errors */ + virtual IOReturn enablePCIPowerManagement(IOOptionBits state = 0xffffffff); + + OSMetaClassDeclareReservedUsed(IOPCIDevice, 2); +/*! @function extendedFindPCICapability + @abstract Search configuration space for a PCI capability register. + @discussion This method searches the device's config space for a PCI capability register matching the passed capability ID, if the device supports PCI capabilities. + @param capabilityID A PCI capability ID. PCI Express devices may support extended capabilities in config space starting at offset 0x100. To search this space, the ID passed should be the negated value of the PCI-SIG assigned ID for the extended capability. + @param offset An optional in/out parameter to return the offset into config space where the capability was found, and to set the start point of the next search. Initialize the offset to zero before the first call to extendedFindPCICapability() and subsequent calls will find all capabilty blocks that may exist on the device with the same ID. + @result The 32-bit value of the capability register if one was found, zero otherwise. */ + + virtual UInt32 extendedFindPCICapability( UInt32 capabilityID, IOByteCount * offset = 0 ); + + // Unused Padding + OSMetaClassDeclareReservedUnused(IOPCIDevice, 3); + OSMetaClassDeclareReservedUnused(IOPCIDevice, 4); + OSMetaClassDeclareReservedUnused(IOPCIDevice, 5); + OSMetaClassDeclareReservedUnused(IOPCIDevice, 6); + OSMetaClassDeclareReservedUnused(IOPCIDevice, 7); + OSMetaClassDeclareReservedUnused(IOPCIDevice, 8); + OSMetaClassDeclareReservedUnused(IOPCIDevice, 9); + OSMetaClassDeclareReservedUnused(IOPCIDevice, 10); + OSMetaClassDeclareReservedUnused(IOPCIDevice, 11); + OSMetaClassDeclareReservedUnused(IOPCIDevice, 12); + OSMetaClassDeclareReservedUnused(IOPCIDevice, 13); + OSMetaClassDeclareReservedUnused(IOPCIDevice, 14); + OSMetaClassDeclareReservedUnused(IOPCIDevice, 15); + +public: + +/*! @function extendedConfigRead32 + @abstract Reads a 32-bit value from the PCI device's configuration space. + @discussion This method reads a 32-bit configuration space register on the device and returns its value. + @param offset A byte offset into configuration space, of which bits 0-1 are ignored. + @result An 32-bit value in host byte order (big endian on PPC). */ + + UInt32 extendedConfigRead32( IOByteCount offset ); + +/*! @function extendedConfigRead16 + @abstract Reads a 16-bit value from the PCI device's configuration space. + @discussion This method reads a 16-bit configuration space register on the device and returns its value. + @param offset A byte offset into configuration space, of which bit 0 is ignored. + @result An 16-bit value in host byte order (big endian on PPC). */ + + UInt16 extendedConfigRead16( IOByteCount offset ); + +/*! @function extendedConfigRead8 + @abstract Reads a 8-bit value from the PCI device's configuration space. + @discussion This method reads a 8-bit configuration space register on the device and returns its value. + @param offset A byte offset into configuration space. + @result An 8-bit value. */ + + UInt8 extendedConfigRead8( IOByteCount offset ); + +/*! @function extendedConfigWrite32 + @abstract Writes a 32-bit value to the PCI device's configuration space. + @discussion This method writes a 32-bit value to a configuration space register on the device. + @param offset A byte offset into configuration space, of which bits 0-1 are ignored. + @param data An 32-bit value to be written in host byte order (big endian on PPC). */ + + void extendedConfigWrite32( IOByteCount offset, UInt32 data ); + +/*! @function extendedConfigWrite16 + @abstract Writes a 16-bit value to the PCI device's configuration space. + @discussion This method writes a 16-bit value to a configuration space register on the device. + @param offset A byte offset into configuration space, of which bit 0 is ignored. + @param data An 16-bit value to be written in host byte order (big endian on PPC). */ + + void extendedConfigWrite16( IOByteCount offset, UInt16 data ); + +/*! @function extendedConfigWrite8 + @abstract Writes a 8-bit value to the PCI device's configuration space. + @discussion This method writes a 8-bit value to a configuration space register on the device. + @param offset A byte offset into configuration space. + @param data An 8-bit value to be written. */ + + void extendedConfigWrite8( IOByteCount offset, UInt8 data ); + + // pass NULL or currentHandler, currentRef to get current handler installed + // pass NULL or handler, ref to set handler for device + // messages: kIOMessageDeviceWillPowerOff, kIOMessageDeviceHasPoweredOff, + // kIOMessageDeviceWillPowerOn, kIOMessageDeviceHasPoweredOn + // state: D3 + IOReturn setConfigHandler(IOPCIDeviceConfigHandler handler, void * ref, + IOPCIDeviceConfigHandler * currentHandler, void ** currentRef); + + // + IOReturn kernelRequestProbe(uint32_t options); + + // (kIOPCIConfigSpace, VM_PROT_READ/WRITE to disable that access) + IOReturn protectDevice(uint32_t space, uint32_t prot); + + IOReturn checkLink(uint32_t options = 0); + + IOReturn relocate(uint32_t options = 0); + + IOReturn setLatencyTolerance(IOOptionBits type, uint64_t nanoseconds); + + IOPCIEventSource * createEventSource(OSObject * owner, IOPCIEventSource::Action action, uint32_t options); + + // allow tunnel controller to enter L1, client should be an attached driver calling + // this method in its IOPCIDevice provider. + IOReturn setTunnelL1Enable(IOService * client, bool l1Enable); + + IOReturn setASPMState(IOService * client, IOOptionBits state); + + enum { kIOPCIAERErrorDescriptionMaxLength = 256 }; + + void copyAERErrorDescriptionForBit(bool correctable, uint32_t bit, char * string, size_t maxLength); +}; + +#endif /* defined(KERNEL) */ + +#endif /* ! _IOKIT_IOPCIDEVICE_H */ + diff --git a/QualcommWireless/include/IOKit/pci/IOPCIFamilyDefinitions.h b/QualcommWireless/include/IOKit/pci/IOPCIFamilyDefinitions.h new file mode 100644 index 0000000..4cf01c4 --- /dev/null +++ b/QualcommWireless/include/IOKit/pci/IOPCIFamilyDefinitions.h @@ -0,0 +1,243 @@ +/* + * Copyright (c) 2018-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef IOPCIDefinitions_h +#define IOPCIDefinitions_h + +#include +#if TARGET_OS_DRIVERKIT +#include +#include +#include +#include +#include +#else +#include +#include +#endif + +// IOPCIDevice matching property names +#define kIOPCIMatchKey "IOPCIMatch" +#define kIOPCIPrimaryMatchKey "IOPCIPrimaryMatch" +#define kIOPCISecondaryMatchKey "IOPCISecondaryMatch" +#define kIOPCIClassMatchKey "IOPCIClassMatch" + +// pci express capabilities +#define kIOPCIExpressCapabilitiesKey "IOPCIExpressCapabilities" +// pci express link status +#define kIOPCIExpressLinkStatusKey "IOPCIExpressLinkStatus" +// pci express link capabilities +#define kIOPCIExpressLinkCapabilitiesKey "IOPCIExpressLinkCapabilities" +// pci express slot status +#define kIOPCIExpressSlotStatusKey "IOPCIExpressSlotStatus" +// pci express slot capabilities +#define kIOPCIExpressSlotCapabilitiesKey "IOPCIExpressSlotCapabilities" + +#define kIOPCIDeviceMemoryArrayKey "IODeviceMemory" + +/* Definitions of PCI Config Registers */ +enum +{ + kIOPCIConfigurationOffsetVendorID = 0x00, + kIOPCIConfigurationOffsetDeviceID = 0x02, + kIOPCIConfigurationOffsetCommand = 0x04, + kIOPCIConfigurationOffsetStatus = 0x06, + kIOPCIConfigurationOffsetRevisionID = 0x08, + kIOPCIConfigurationOffsetClassCode = 0x09, + kIOPCIConfigurationOffsetCacheLineSize = 0x0C, + kIOPCIConfigurationOffsetLatencyTimer = 0x0D, + kIOPCIConfigurationOffsetHeaderType = 0x0E, + kIOPCIConfigurationOffsetBIST = 0x0F, + kIOPCIConfigurationOffsetBaseAddress0 = 0x10, + kIOPCIConfigurationOffsetBaseAddress1 = 0x14, + kIOPCIConfigurationOffsetBaseAddress2 = 0x18, + kIOPCIConfigurationOffsetBaseAddress3 = 0x1C, + kIOPCIConfigurationOffsetBaseAddress4 = 0x20, + kIOPCIConfigurationOffsetBaseAddress5 = 0x24, + kIOPCIConfigurationOffsetCardBusCISPtr = 0x28, + kIOPCIConfigurationOffsetSubSystemVendorID = 0x2C, + kIOPCIConfigurationOffsetSubSystemID = 0x2E, + kIOPCIConfigurationOffsetExpansionROMBase = 0x30, + kIOPCIConfigurationOffsetCapabilitiesPtr = 0x34, + kIOPCIConfigurationOffsetInterruptLine = 0x3C, + kIOPCIConfigurationOffsetInterruptPin = 0x3D, + kIOPCIConfigurationOffsetMinimumGrant = 0x3E, + kIOPCIConfigurationOffsetMaximumLatency = 0x3F +}; + +/* Definitions of Capabilities PCI Config Register */ +enum +{ + kIOPCICapabilityIDOffset = 0x00, + kIOPCINextCapabilityOffset = 0x01, + + kIOPCICapabilityIDPowerManagement = 0x01, + kIOPCICapabilityIDAGP = 0x02, + kIOPCICapabilityIDVitalProductData = 0x03, + kIOPCICapabilityIDSlotID = 0x04, + kIOPCICapabilityIDMSI = 0x05, + kIOPCICapabilityIDCPCIHotswap = 0x06, + kIOPCICapabilityIDPCIX = 0x07, + kIOPCICapabilityIDLDT = 0x08, + kIOPCICapabilityIDVendorSpecific = 0x09, + kIOPCICapabilityIDDebugPort = 0x0a, + kIOPCICapabilityIDCPCIResourceControl = 0x0b, + kIOPCICapabilityIDHotplug = 0x0c, + kIOPCICapabilityIDAGP8 = 0x0e, + kIOPCICapabilityIDSecure = 0x0f, + kIOPCICapabilityIDPCIExpress = 0x10, + kIOPCICapabilityIDMSIX = 0x11, + kIOPCICapabilityIDFPB = 0x15, + + kIOPCIExpressCapabilityIDErrorReporting = -0x01UL, + kIOPCIExpressCapabilityIDVirtualChannel = -0x02UL, + kIOPCIExpressCapabilityIDDeviceSerialNumber = -0x03UL, + kIOPCIExpressCapabilityIDPowerBudget = -0x04UL, + kIOPCIExpressCapabilityIDAccessControlServices = -0x0DUL, + kIOPCIExpressCapabilityIDLatencyTolerenceReporting = -0x18UL, + kIOPCIExpressCapabilityIDL1PMSubstates = -0x1EUL, +}; + +/* Command register definitions */ +enum +{ + kIOPCICommandIOSpace = 0x0001, + kIOPCICommandMemorySpace = 0x0002, + kIOPCICommandBusMaster = 0x0004, + kIOPCICommandSpecialCycles = 0x0008, + kIOPCICommandMemWrInvalidate = 0x0010, + kIOPCICommandPaletteSnoop = 0x0020, + kIOPCICommandParityError = 0x0040, + kIOPCICommandAddressStepping = 0x0080, + kIOPCICommandSERR = 0x0100, + kIOPCICommandFastBack2Back = 0x0200, + kIOPCICommandInterruptDisable = 0x0400 +}; + +/* Status register definitions */ +enum +{ + kIOPCIStatusInterrupt = 0x0008, + kIOPCIStatusCapabilities = 0x0010, + kIOPCIStatusPCI66 = 0x0020, + kIOPCIStatusUDF = 0x0040, + kIOPCIStatusFastBack2Back = 0x0080, + kIOPCIStatusDevSel0 = 0x0000, + kIOPCIStatusDevSel1 = 0x0200, + kIOPCIStatusDevSel2 = 0x0400, + kIOPCIStatusDevSel3 = 0x0600, + kIOPCIStatusTargetAbortCapable = 0x0800, + kIOPCIStatusTargetAbortActive = 0x1000, + kIOPCIStatusMasterAbortActive = 0x2000, + kIOPCIStatusSERRActive = 0x4000, + kIOPCIStatusParityErrActive = 0x8000 +}; + +enum +{ + kPCI2PCIOffsetPrimaryBus = 0x18, + kPCI2PCIOffsetSecondaryBus = 0x19, + kPCI2PCIOffsetSubordinateBus = 0x1a, + kPCI2PCIOffsetSecondaryLT = 0x1b, + kPCI2PCIOffsetIORange = 0x1c, + kPCI2PCIOffsetMemoryRange = 0x20, + kPCI2PCIOffsetPrefetchMemoryRange = 0x24, + kPCI2PCIOffsetPrefetchUpperBase = 0x28, + kPCI2PCIOffsetPrefetchUpperLimit = 0x2c, + kPCI2PCIOffsetUpperIORange = 0x30, + kPCI2PCIOffsetBridgeControl = 0x3e +}; + +// constants which are part of the PCI Bus Power Management Spec. +enum +{ + // capabilities bits in the 16 bit capabilities register + kPCIPMCPMESupportFromD3Cold = 0x8000, + kPCIPMCPMESupportFromD3Hot = 0x4000, + kPCIPMCPMESupportFromD2 = 0x2000, + kPCIPMCPMESupportFromD1 = 0x1000, + kPCIPMCPMESupportFromD0 = 0x0800, + kPCIPMCD2Support = 0x0400, + kPCIPMCD1Support = 0x0200, + + kPCIPMCD3Support = 0x0001 +}; + +enum +{ + // bits in the power management control/status register + kPCIPMCSPMEStatus = 0x8000, + kPCIPMCSPMEEnable = 0x0100, + kPCIPMCSPowerStateMask = 0x0003, + kPCIPMCSPowerStateD3 = 0x0003, + kPCIPMCSPowerStateD2 = 0x0002, + kPCIPMCSPowerStateD1 = 0x0001, + kPCIPMCSPowerStateD0 = 0x0000, + + kPCIPMCSDefaultEnableBits = (~(IOOptionBits)0), + + kPCIPMCSPMEDisableInS3 = 0x00010000, + kPCIPMCSPMEWakeReason = 0x00020000 +}; + +// PCIe error bits +enum +{ + kIOPCIUncorrectableErrorBitDataLinkProtocol = 4, + kIOPCIUncorrectableErrorBitSurpriseDown = 5, + kIOPCIUncorrectableErrorBitPoisonedTLP = 12, + kIOPCIUncorrectableErrorBitFlowControlProtocol = 13, + kIOPCIUncorrectableErrorBitCompletionTimeout = 14, + kIOPCIUncorrectableErrorBitCompleterAbort = 15, + kIOPCIUncorrectableErrorBitUnexpectedCompletion = 16, + kIOPCIUncorrectableErrorBitReceiverOverflow = 17, + kIOPCIUncorrectableErrorBitMalformedTLP = 18, + kIOPCIUncorrectableErrorBitECRC = 19, + kIOPCIUncorrectableErrorBitUnsupportedRequest = 20, + + kIOPCIUncorrectableErrorBitACSViolation = 21, + kIOPCIUncorrectableErrorBitInternal = 22, + kIOPCIUncorrectableErrorBitMCBlockedTLP = 23, + kIOPCIUncorrectableErrorBitAtomicOpEgressBlocked = 24, + kIOPCIUncorrectableErrorBitTLPPrefixBlocked = 25 +}; + +enum +{ + kIOPCICorrectableErrorBitReceiver = 0, + kIOPCICorrectableErrorBitBadTLP = 6, + kIOPCICorrectableErrorBitBadDLLP = 7, + kIOPCICorrectableErrorBitReplayNumRollover = 8, + kIOPCICorrectableErrorBitReplayTimerTimeout = 12, + kIOPCICorrectableErrorBitAdvisoryNonFatal = 13, + kIOPCICorrectableErrorBitCorrectedInternal = 14, + kIOPCICorrectableErrorBitHeaderLogOverflow = 15, +}; + + +#endif /* IOPCIDefinitions_h */ diff --git a/QualcommWireless/include/IOKit/platform/AppleMacIO.h b/QualcommWireless/include/IOKit/platform/AppleMacIO.h new file mode 100644 index 0000000..45e5b9b --- /dev/null +++ b/QualcommWireless/include/IOKit/platform/AppleMacIO.h @@ -0,0 +1,79 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1998 Apple Computer, Inc. All rights reserved. + * + * HISTORY + * + */ + + +#ifndef _IOKIT_APPLEMACIO_H +#define _IOKIT_APPLEMACIO_H + +#include + +#include + +class AppleMacIO : public IOService +{ + OSDeclareAbstractStructors(AppleMacIO); + + IOService * fNub; + IOMemoryMap * fMemory; + + struct ExpansionData { }; + ExpansionData *fReserved; + +protected: + virtual bool selfTest( void ); + +public: + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + + virtual IOService * createNub( IORegistryEntry * from ); + + virtual void processNub( IOService * nub ); + + virtual void publishBelow( IORegistryEntry * root ); + + virtual const char * deleteList( void ); + virtual const char * excludeList( void ); + + virtual bool compareNubName( const IOService * nub, OSString * name, + OSString ** matched = 0 ) const; + + virtual IOReturn getNubResources( IOService * nub ); + + OSMetaClassDeclareReservedUnused(AppleMacIO, 0); + OSMetaClassDeclareReservedUnused(AppleMacIO, 1); + OSMetaClassDeclareReservedUnused(AppleMacIO, 2); + OSMetaClassDeclareReservedUnused(AppleMacIO, 3); +}; + +#endif /* ! _IOKIT_APPLEMACIO_H */ diff --git a/QualcommWireless/include/IOKit/platform/AppleMacIODevice.h b/QualcommWireless/include/IOKit/platform/AppleMacIODevice.h new file mode 100644 index 0000000..cb6f898 --- /dev/null +++ b/QualcommWireless/include/IOKit/platform/AppleMacIODevice.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. + * + * HISTORY + * + */ + + +#ifndef _IOKIT_APPLEMACIODEVICE_H +#define _IOKIT_APPLEMACIODEVICE_H + +#include + +class AppleMacIODevice : public IOService +{ + OSDeclareDefaultStructors(AppleMacIODevice); + +private: + struct ExpansionData { }; + ExpansionData *reserved; + +public: + virtual bool compareName( OSString * name, OSString ** matched = 0 ) const APPLE_KEXT_OVERRIDE; + virtual IOService *matchLocation(IOService *client) APPLE_KEXT_OVERRIDE; + virtual IOReturn getResources( void ) APPLE_KEXT_OVERRIDE; + + OSMetaClassDeclareReservedUnused(AppleMacIODevice, 0); + OSMetaClassDeclareReservedUnused(AppleMacIODevice, 1); + OSMetaClassDeclareReservedUnused(AppleMacIODevice, 2); + OSMetaClassDeclareReservedUnused(AppleMacIODevice, 3); +}; + +#endif /* ! _IOKIT_APPLEMACIODEVICE_H */ diff --git a/QualcommWireless/include/IOKit/platform/AppleNMI.h b/QualcommWireless/include/IOKit/platform/AppleNMI.h new file mode 100644 index 0000000..a21688e --- /dev/null +++ b/QualcommWireless/include/IOKit/platform/AppleNMI.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1998-9 Apple Computer, Inc. All rights reserved. + * + * DRI: Josh de Cesare + * + */ + +#ifndef _IOKIT_APPLENMI_H +#define _IOKIT_APPLENMI_H + +#include +#include + +// NMI Interrupt Constants +enum{ + kExtInt9_NMIIntSource = 0x800506E0, + kNMIIntLevelMask = 0x00004000, + kNMIIntMask = 0x00000080 +}; + + +class AppleNMI : public IOService +{ + OSDeclareDefaultStructors(AppleNMI); + +private: + bool enable_debugger; + bool mask_NMI; + + struct ExpansionData { }; + ExpansionData * reserved; // Reserved for future use + +public: + IOService *rootDomain; + virtual bool start(IOService *provider) APPLE_KEXT_OVERRIDE; + virtual IOReturn initNMI(IOInterruptController *parentController, OSData *parentSource); + virtual IOReturn handleInterrupt(void *refCon, IOService *nub, int source); + +// Power handling methods: + virtual IOReturn powerStateWillChangeTo(IOPMPowerFlags, unsigned long, IOService*) APPLE_KEXT_OVERRIDE; + + OSMetaClassDeclareReservedUnused(AppleNMI, 0); + OSMetaClassDeclareReservedUnused(AppleNMI, 1); + OSMetaClassDeclareReservedUnused(AppleNMI, 2); + OSMetaClassDeclareReservedUnused(AppleNMI, 3); +}; + +#endif /* ! _IOKIT_APPLENMI_H */ diff --git a/QualcommWireless/include/IOKit/platform/ApplePlatformExpert.h b/QualcommWireless/include/IOKit/platform/ApplePlatformExpert.h new file mode 100644 index 0000000..d5ffd5a --- /dev/null +++ b/QualcommWireless/include/IOKit/platform/ApplePlatformExpert.h @@ -0,0 +1,91 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * HISTORY + * + */ + + +#ifndef _IOKIT_APPLEPLATFORM_H +#define _IOKIT_APPLEPLATFORM_H + +#include + +enum { + kBootROMTypeOldWorld = 0, + kBootROMTypeNewWorld +}; + +enum { + kChipSetTypePowerSurge = 0, + kChipSetTypePowerStar, + kChipSetTypeGossamer, + kChipSetTypePowerExpress, + kChipSetTypeCore99, + kChipSetTypeCore2001 +}; + +enum { + kMachineTypeUnknown = 0 +}; + +extern const OSSymbol *gGetDefaultBusSpeedsKey; + +class ApplePlatformExpert : public IODTPlatformExpert +{ + OSDeclareAbstractStructors(ApplePlatformExpert); + +private: + SInt32 _timeToGMT; + + struct ExpansionData { }; + ExpansionData *reserved; + +public: + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual bool configure( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual const char * deleteList( void ) APPLE_KEXT_OVERRIDE; + virtual const char * excludeList( void ) APPLE_KEXT_OVERRIDE; + + virtual void registerNVRAMController( IONVRAMController * nvram ) APPLE_KEXT_OVERRIDE; + + virtual long getGMTTimeOfDay(void) APPLE_KEXT_OVERRIDE; + virtual void setGMTTimeOfDay(long secs) APPLE_KEXT_OVERRIDE; + + virtual bool getMachineName(char *name, int maxLength) APPLE_KEXT_OVERRIDE; + + OSMetaClassDeclareReservedUnused(ApplePlatformExpert, 0); + OSMetaClassDeclareReservedUnused(ApplePlatformExpert, 1); + OSMetaClassDeclareReservedUnused(ApplePlatformExpert, 2); + OSMetaClassDeclareReservedUnused(ApplePlatformExpert, 3); +}; + + +#endif /* ! _IOKIT_APPLEPLATFORM_H */ diff --git a/QualcommWireless/include/IOKit/power/IOPwrController.h b/QualcommWireless/include/IOKit/power/IOPwrController.h new file mode 100644 index 0000000..f38707f --- /dev/null +++ b/QualcommWireless/include/IOKit/power/IOPwrController.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * 24 Nov 1998 suurballe Created. + */ + +#include + +class IOPwrController : public IOService +{ + OSDeclareAbstractStructors(IOPwrController); + +public: +}; diff --git a/QualcommWireless/include/IOKit/pwr_mgt/IOPM.h b/QualcommWireless/include/IOKit/pwr_mgt/IOPM.h new file mode 100644 index 0000000..84fcaa7 --- /dev/null +++ b/QualcommWireless/include/IOKit/pwr_mgt/IOPM.h @@ -0,0 +1,963 @@ +/* + * Copyright (c) 1998-2005 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +#ifndef _IOKIT_IOPM_H +#define _IOKIT_IOPM_H + +#include +#include +#include + +/*! @header IOPM.h + * @abstract Defines power management constants and keys used by both in-kernel and user space power management. + * @discussion IOPM.h defines a range of power management constants used in several in-kernel and user space APIs. Most significantly, the IOPMPowerFlags used to specify the fields of an IOPMPowerState struct are defined here. + * + * Most of the constants defined in IOPM.h are deprecated or for Apple internal use only, and are not elaborated on in headerdoc. + */ + +enum { + kIOPMMaxPowerStates = 10, + IOPMMaxPowerStates = kIOPMMaxPowerStates +}; + +/*! @enum IOPMPowerFlags + * @abstract Bits are used in defining capabilityFlags, inputPowerRequirements, and outputPowerCharacter in the IOPMPowerState structure. + * @discussion These bits may be bitwise-OR'd together in the IOPMPowerState capabilityFlags field, the outputPowerCharacter field, and/or the inputPowerRequirement field. + * + * The comments clearly mark whether each flag should be used in the capabilityFlags field, outputPowerCharacter field, and inputPowerRequirement field, or all three. + * + * The value of capabilityFlags, inputPowerRequirement or outputPowerCharacter may be 0. Most drivers implement their 'OFF' state, used when asleep, by defininf each of the 3 fields as 0. + * + * The bits listed below are only the most common bits used to define a device's power states. Your device's IO family may require that your device specify other input or output power flags to interact properly. Consult family-specific documentation to determine if your IOPower plane parents or children require other power flags; they probably don't. + * + * @constant kIOPMPowerOn Indicates the device is on, requires power, and provides power. Useful as a: Capability, InputPowerRequirement, OutputPowerCharacter + * + * @constant kIOPMDeviceUsable Indicates the device is usable in this state. Useful only as a Capability + * + * @constant kIOPMLowPower + * Indicates device is in a low power state. May be bitwis-OR'd together + * with kIOPMDeviceUsable flag, to indicate the device is still usable. + * + * A device with a capability of kIOPMLowPower may: + * Require either 0 or kIOPMPowerOn from its power parent + * Offer either kIOPMLowPower, kIOPMPowerOn, or 0 (no power at all) + * to its power plane children. + * + * Useful only as a Capability, although USB drivers should consult USB family documentation for other valid circumstances to use the kIOPMLowPower bit. + * + * @constant kIOPMPreventIdleSleep + * In the capability field of a power state, disallows idle system sleep while the device is in that state. + * + * For example, displays and disks set this capability for their ON power state; since the system may not idle sleep while the display (and thus keyboard or mouse) or the disk is active. + * + * Useful only as a Capability. + * + * @constant kIOPMSleepCapability + * Used only by certain IOKit Families (USB). Not defined or used by generic Power Management. Read your family documentation to see if you should define a powerstate using these capabilities. + * + * @constant kIOPMRestartCapability + * Used only by certain IOKit Families (USB). Not defined or used by generic Power Management. Read your family documentation to see if you should define a powerstate using these capabilities. + * + * @constant kIOPMSleep + * Used only by certain IOKit Families (USB). Not defined or used by generic Power Management. Read your family documentation to see if you should define a powerstate using these capabilities. + * + * @constant kIOPMRestart + * Used only by certain IOKit Families (USB). Not defined or used by generic Power Management. Read your family documentation to see if you should define a powerstate using these capabilities. + * + * @constant kIOPMInitialDeviceState + * Indicates the initial power state for the device. If initialPowerStateForDomainState() returns a power state with this flag set in the capability field, then the initial power change is performed without calling the driver's setPowerState(). + * + * @constant kIOPMRootDomainState + * An indication that the power flags represent the state of the root power + * domain. This bit must not be set in the IOPMPowerState structure. + * Power Management may pass this bit to initialPowerStateForDomainState() + * to map from a global system state to the desired device state. + */ +typedef unsigned long IOPMPowerFlags; +enum { + kIOPMPowerOn = 0x00000002, + kIOPMDeviceUsable = 0x00008000, + kIOPMLowPower = 0x00010000, + kIOPMPreventIdleSleep = 0x00000040, + kIOPMSleepCapability = 0x00000004, + kIOPMRestartCapability = 0x00000080, + kIOPMSleep = 0x00000001, + kIOPMRestart = 0x00000080, + kIOPMInitialDeviceState = 0x00000100, + kIOPMRootDomainState = 0x00000200 +}; + +/* + * Private IOPMPowerFlags + * + * For Apple use only + * Not for use with non-Apple drivers + * Their behavior is undefined + */ +enum { + kIOPMClockNormal = 0x0004, + kIOPMClockRunning = 0x0008, + kIOPMPreventSystemSleep = 0x0010, + kIOPMDoze = 0x0400, + kIOPMChildClamp = 0x0080, + kIOPMChildClamp2 = 0x0200, + kIOPMNotPowerManaged = 0x0800 +}; + +/* + * Deprecated IOPMPowerFlags + * Their behavior is undefined when used in IOPMPowerState + * Capability, InputPowerRequirement, or OutputPowerCharacter fields. + */ +enum { + kIOPMMaxPerformance = 0x4000, + kIOPMPassThrough = 0x0100, + kIOPMAuxPowerOn = 0x0020, + kIOPMNotAttainable = 0x0001, + kIOPMContextRetained = 0x2000, + kIOPMConfigRetained = 0x1000, + kIOPMStaticPowerValid = 0x0800, + kIOPMSoftSleep = 0x0400, + kIOPMCapabilitiesMask = kIOPMPowerOn | kIOPMDeviceUsable | + kIOPMMaxPerformance | kIOPMContextRetained | + kIOPMConfigRetained | kIOPMSleepCapability | + kIOPMRestartCapability +}; + +/* + * Support for old names of IOPMPowerFlag constants + */ +enum { + IOPMNotAttainable = kIOPMNotAttainable, + IOPMPowerOn = kIOPMPowerOn, + IOPMClockNormal = kIOPMClockNormal, + IOPMClockRunning = kIOPMClockRunning, + IOPMAuxPowerOn = kIOPMAuxPowerOn, + IOPMDeviceUsable = kIOPMDeviceUsable, + IOPMMaxPerformance = kIOPMMaxPerformance, + IOPMContextRetained = kIOPMContextRetained, + IOPMConfigRetained = kIOPMConfigRetained, + IOPMNotPowerManaged = kIOPMNotPowerManaged, + IOPMSoftSleep = kIOPMSoftSleep +}; + + +enum { + kIOPMNextHigherState = 1, + kIOPMHighestState = 2, + kIOPMNextLowerState = 3, + kIOPMLowestState = 4 +}; + +enum { + IOPMNextHigherState = kIOPMNextHigherState, + IOPMHighestState = kIOPMHighestState, + IOPMNextLowerState = kIOPMNextLowerState, + IOPMLowestState = kIOPMLowestState +}; + +// Internal commands used by power managment command queue +enum { + kIOPMBroadcastAggressiveness = 1, + kIOPMUnidleDevice +}; + +// Power consumption unknown value +enum { + kIOPMUnknown = 0xFFFF +}; + +/******************************************************************************* + * + * Root Domain property keys of interest + * + ******************************************************************************/ + +/* AppleClamshellState + * reflects the state of the clamshell (lid) on a portable. + * It has a boolean value. + * true == clamshell is closed + * false == clamshell is open + * not present == no clamshell on this hardware + */ +#define kAppleClamshellStateKey "AppleClamshellState" + +/* AppleClamshellCausesSleep + * reflects the clamshell close behavior on a portable. + * It has a boolean value. + * true == system will sleep when clamshell is closed + * false == system will not sleep on clamshell close + * (typically external display mode) + * not present == no clamshell on this hardware + */ +#define kAppleClamshellCausesSleepKey "AppleClamshellCausesSleep" + +/* kIOPMSleepWakeUUIDKey + * Key refers to a CFStringRef that will uniquely identify + * a sleep/wake cycle for logging & tracking. + * The key becomes valid at the beginning of a sleep cycle - before we + * initiate any sleep/wake notifications. + * The key becomes invalid at the completion of a system wakeup. The + * property will not be present in the IOPMrootDomain's registry entry + * when it is invalid. + * + * See IOPMrootDomain notification kIOPMMessageSleepWakeUUIDChange + */ + #define kIOPMSleepWakeUUIDKey "SleepWakeUUID" + +/* kIOPMBootSessionUUIDKey + * Key refers to a CFStringRef that will uniquely identify + * a boot cycle. + * The key becomes valid at boot time and remains valid + * till shutdown. The property value will remain same across + * sleep/wake/hibernate cycle. + */ +#define kIOPMBootSessionUUIDKey "BootSessionUUID" + +/* kIOPMDeepSleepEnabledKey + * Indicates the Deep Sleep enable state. + * It has a boolean value. + * true == Deep Sleep is enabled + * false == Deep Sleep is disabled + * not present == Deep Sleep is not supported on this hardware + */ +#define kIOPMDeepSleepEnabledKey "Standby Enabled" + +/* kIOPMDeepSleepDelayKey + * Key refers to a CFNumberRef that represents the delay in seconds before + * entering Deep Sleep state when on battery power and when remaining + * battery capacity is below a particular threshold (e.g., 50%.) The + * property is not present if Deep Sleep is unsupported. + */ +#define kIOPMDeepSleepDelayKey "Standby Delay" + +/* kIOPMDeepSleepDelayHighKey + * Key refers to a CFNumberRef that represents the delay in seconds before + * entering Deep Sleep state. This is used instead of the value specified by + * kIOPMDeepSleepDelayKey if the remaining battery capacity is above a + * particular threshold (e.g. 50%) or on AC power. The property is not + * present if Deep Sleep is unsupported. + */ +#define kIOPMDeepSleepDelayHighKey "High Standby Delay" + +/* kIOPMLowBatteryThresholdKey + * Key refers to a CFNumberRef that represents the threshold used to choose + * between the normal deep sleep delay and the high deep sleep delay (as a + * percentage of total battery capacity remaining.) The property is not + * present if Deep Sleep is unsupported. + */ +#define kIOPMStandbyBatteryThresholdKey "Standby Battery Threshold" + +/* kIOPMDestroyFVKeyOnStandbyKey + * Specifies if FileVault key can be stored when going to standby mode + * It has a boolean value, + * true == Destroy FV key when going to standby mode + * false == Retain FV key when going to standby mode + * not present == Retain FV key when going to standby mode + */ +#define kIOPMDestroyFVKeyOnStandbyKey "DestroyFVKeyOnStandby" + +/******************************************************************************* + * + * Properties that can control power management behavior + * + ******************************************************************************/ + +/* kIOPMResetPowerStateOnWakeKey + * If an IOService publishes this key with the value of kOSBooleanTrue, + * then PM will disregard the influence from changePowerStateToPriv() or + * any activity tickles that occurred before system sleep when resolving + * the initial device power state on wake. Influences from power children + * and changePowerStateTo() are not eliminated. At the earliest opportunity + * upon system wake, PM will query the driver for a new power state to be + * installed as the initial changePowerStateToPriv() influence, by calling + * initialPowerStateForDomainState() with both kIOPMRootDomainState and + * kIOPMPowerOn flags set. The default implementation will always return + * the lowest power state. Drivers can override this default behavior to + * immediately raise the power state when there are work blocked on the + * power change, and cannot afford to wait until the next activity tickle. + * This property should be statically added to a driver's plist or set at + * runtime before calling PMinit(). + */ +#define kIOPMResetPowerStateOnWakeKey "IOPMResetPowerStateOnWake" + +/******************************************************************************* + * + * Driver PM Assertions + * + ******************************************************************************/ + +/* Driver Assertion bitfield description + * Driver PM assertions are defined by these bits. + */ +enum { + /*! kIOPMDriverAssertionCPUBit + * When set, PM kernel will prefer to leave the CPU and core hardware + * running in "Dark Wake" state, instead of sleeping. + */ + kIOPMDriverAssertionCPUBit = 0x01, + + /*! kIOPMDriverAssertionPreventSystemIdleSleepBit + * When set, the system should not idle sleep. This does not prevent + * demand sleep. + */ + kIOPMDriverAssertionPreventSystemIdleSleepBit = 0x02, + + /*! kIOPMDriverAssertionUSBExternalDeviceBit + * When set, driver is informing PM that an external USB device is attached. + */ + kIOPMDriverAssertionUSBExternalDeviceBit = 0x04, + + /*! kIOPMDriverAssertionBluetoothHIDDevicePairedBit + * When set, driver is informing PM that a Bluetooth HID device is paired. + */ + kIOPMDriverAssertionBluetoothHIDDevicePairedBit = 0x08, + + /*! kIOPMDriverAssertionExternalMediaMountedBit + * When set, driver is informing PM that an external media is mounted. + */ + kIOPMDriverAssertionExternalMediaMountedBit = 0x10, + + /*! kIOPMDriverAssertionReservedBit5 + * Reserved for Thunderbolt. + */ + kIOPMDriverAssertionReservedBit5 = 0x20, + + /*! kIOPMDriverAssertionPreventDisplaySleepBit + * When set, the display should remain powered on while the system's awake. + */ + kIOPMDriverAssertionPreventDisplaySleepBit = 0x40, + + /*! kIOPMDriverAssertionReservedBit7 + * Reserved for storage family. + */ + kIOPMDriverAssertionReservedBit7 = 0x80, + + /*! kIOPMDriverAssertionMagicPacketWakeEnabledBit + * When set, driver is informing PM that magic packet wake is enabled. + */ + kIOPMDriverAssertionMagicPacketWakeEnabledBit = 0x100, + + /*! kIOPMDriverAssertionNetworkKeepAliveActiveBit + * When set, driver is informing PM that it is holding the network + * interface up to do TCPKeepAlive + */ + kIOPMDriverAssertionNetworkKeepAliveActiveBit = 0x200 +}; + +/* kIOPMAssertionsDriverKey + * This kIOPMrootDomain key refers to a CFNumberRef property, containing + * a bitfield describing the aggregate PM assertion levels. + * Example: A value of 0 indicates that no driver has asserted anything. + * Or, a value of kIOPMDriverAssertionCPUBit + * indicates that a driver (or drivers) have asserted a need for CPU and video. + */ +#define kIOPMAssertionsDriverKey "DriverPMAssertions" + +/* kIOPMAssertionsDriverKey + * This kIOPMrootDomain key refers to a CFNumberRef property, containing + * a bitfield describing the aggregate PM assertion levels. + * Example: A value of 0 indicates that no driver has asserted anything. + * Or, a value of kIOPMDriverAssertionCPUBit + * indicates that a driver (or drivers) have asserted a need for CPU and video. + */ +#define kIOPMAssertionsDriverDetailedKey "DriverPMAssertionsDetailed" + +/******************************************************************************* + * + * Kernel Driver assertion detailed dictionary keys + * + * Keys decode the Array & dictionary data structure under IOPMrootDomain property + * kIOPMAssertionsDriverKey. + * + */ +#define kIOPMDriverAssertionIDKey "ID" +#define kIOPMDriverAssertionCreatedTimeKey "CreatedTime" +#define kIOPMDriverAssertionModifiedTimeKey "ModifiedTime" +#define kIOPMDriverAssertionOwnerStringKey "Owner" +#define kIOPMDriverAssertionOwnerServiceKey "ServicePtr" +#define kIOPMDriverAssertionRegistryEntryIDKey "RegistryEntryID" +#define kIOPMDriverAssertionLevelKey "Level" +#define kIOPMDriverAssertionAssertedKey "Assertions" + +/******************************************************************************* + * + * Root Domain general interest messages + * + * Available by registering for interest type 'gIOGeneralInterest' + * on IOPMrootDomain. + * + ******************************************************************************/ + +/* kIOPMMessageClamshellStateChange + * Delivered as a general interest notification on the IOPMrootDomain + * IOPMrootDomain sends this message when state of either AppleClamshellState + * or AppleClamshellCausesSleep changes. If this clamshell change results in + * a sleep, the sleep will initiate soon AFTER delivery of this message. + * The state of both variables is encoded in a bitfield argument sent with + * the message. Check bits 0 and 1 using kClamshellStateBit & kClamshellSleepBit + */ +enum { + kClamshellStateBit = (1 << 0), + kClamshellSleepBit = (1 << 1) +}; + +#define kIOPMMessageClamshellStateChange \ + iokit_family_msg(sub_iokit_powermanagement, 0x100) + +/* kIOPMMessageFeatureChange + * Delivered when the set of supported features ("Supported Features" dictionary + * under IOPMrootDomain registry) changes in some way. Typically addition or + * removal of a supported feature. + * RootDomain passes no argument with this message. + */ +#define kIOPMMessageFeatureChange \ + iokit_family_msg(sub_iokit_powermanagement, 0x110) + +/* kIOPMMessageInflowDisableCancelled + * The battery has drained completely to its "Fully Discharged" state. + * If a user process has disabled battery inflow for battery + * calibration, we forcibly re-enable Inflow at this point. + * If inflow HAS been forcibly re-enabled, bit 0 + * (kInflowForciblyEnabledBit) will be set. + */ +enum { + kInflowForciblyEnabledBit = (1 << 0) +}; + +/* kIOPMMessageInternalBatteryFullyDischarged + * The battery has drained completely to its "Fully Discharged" state. + */ +#define kIOPMMessageInternalBatteryFullyDischarged \ + iokit_family_msg(sub_iokit_powermanagement, 0x120) + +/* kIOPMMessageSystemPowerEventOccurred + * Some major system thermal property has changed, and interested clients may + * modify their behavior. + */ +#define kIOPMMessageSystemPowerEventOccurred \ + iokit_family_msg(sub_iokit_powermanagement, 0x130) + +/* kIOPMMessageSleepWakeUUIDChange + * Either a new SleepWakeUUID has been specified at the beginning of a sleep, + * or we're removing the existing property upon completion of a wakeup. + */ +#define kIOPMMessageSleepWakeUUIDChange \ + iokit_family_msg(sub_iokit_powermanagement, 0x140) + +/* kIOPMMessageSleepWakeUUIDSet + * Argument accompanying the kIOPMMessageSleepWakeUUIDChange notification when + * a new UUID has been specified. + */ +#define kIOPMMessageSleepWakeUUIDSet ((void *)1) + +/* kIOPMMessageSleepWakeUUIDCleared + * Argument accompanying the kIOPMMessageSleepWakeUUIDChange notification when + * the current UUID has been removed. + */ +#define kIOPMMessageSleepWakeUUIDCleared ((void *)NULL) + +/*! kIOPMMessageDriverAssertionsChanged + * Sent when kernel PM driver assertions have changed. + */ +#define kIOPMMessageDriverAssertionsChanged \ + iokit_family_msg(sub_iokit_powermanagement, 0x150) + +/*! kIOPMMessageDarkWakeThermalEmergency + * Sent when machine becomes unsustainably warm in DarkWake. + * Kernel PM might choose to put the machine back to sleep right after. + */ +#define kIOPMMessageDarkWakeThermalEmergency \ + iokit_family_msg(sub_iokit_powermanagement, 0x160) + +/******************************************************************************* + * + * Power commands issued to root domain + * Use with IOPMrootDomain::receivePowerNotification() + * + * These commands are issued from system drivers only: + * ApplePMU, AppleSMU, IOGraphics, AppleACPIFamily + * + * TODO: deprecate kIOPMAllowSleep and kIOPMPreventSleep + ******************************************************************************/ +enum { + kIOPMSleepNow = (1 << 0),// put machine to sleep now + kIOPMAllowSleep = (1 << 1),// allow idle sleep + kIOPMPreventSleep = (1 << 2),// do not allow idle sleep + kIOPMPowerButton = (1 << 3),// power button was pressed + kIOPMClamshellClosed = (1 << 4),// clamshell was closed + kIOPMPowerEmergency = (1 << 5),// battery dangerously low + kIOPMDisableClamshell = (1 << 6),// do not sleep on clamshell closure + kIOPMEnableClamshell = (1 << 7),// sleep on clamshell closure + kIOPMProcessorSpeedChange = (1 << 8),// change the processor speed + kIOPMOverTemp = (1 << 9),// system dangerously hot + kIOPMClamshellOpened = (1 << 10),// clamshell was opened + kIOPMDWOverTemp = (1 << 11),// DarkWake thermal limits exceeded. + kIOPMPowerButtonUp = (1 << 12),// Power button up + kIOPMProModeEngaged = (1 << 13),// Fans entered 'ProMode' + kIOPMProModeDisengaged = (1 << 14) // Fans exited 'ProMode' +}; + + +/******************************************************************************* + * + * Power Management Return Codes + * + ******************************************************************************/ +enum { + kIOPMNoErr = 0, + + // Returned by driver's setPowerState(), powerStateWillChangeTo(), + // powerStateDidChangeTo(), or acknowledgeSetPowerState() to + // implicitly acknowledge power change upon function return. + kIOPMAckImplied = 0, + + // Deprecated + kIOPMWillAckLater = 1, + + // Returned by requestPowerDomainState() to indicate + // unrecognized specification parameter. + kIOPMBadSpecification = 4, + + // Returned by requestPowerDomainState() to indicate + // no power state matches search specification. + kIOPMNoSuchState = 5, + + // Deprecated + kIOPMCannotRaisePower = 6, + + // Deprecated + kIOPMParameterError = 7, + + // Returned when power management state is accessed + // before driver has called PMinit(). + kIOPMNotYetInitialized = 8, + + // And the old constants; deprecated + IOPMNoErr = kIOPMNoErr, + IOPMAckImplied = kIOPMAckImplied, + IOPMWillAckLater = kIOPMWillAckLater, + IOPMBadSpecification = kIOPMBadSpecification, + IOPMNoSuchState = kIOPMNoSuchState, + IOPMCannotRaisePower = kIOPMCannotRaisePower, + IOPMParameterError = kIOPMParameterError, + IOPMNotYetInitialized = kIOPMNotYetInitialized +}; + + +// IOPMPowerSource class descriptive strings +// Power Source state is published as properties to the IORegistry under these +// keys. +#define kIOPMPSExternalConnectedKey "ExternalConnected" +#define kIOPMPSExternalChargeCapableKey "ExternalChargeCapable" +#define kIOPMPSBatteryInstalledKey "BatteryInstalled" +#define kIOPMPSIsChargingKey "IsCharging" +#define kIOPMFullyChargedKey "FullyCharged" +#define kIOPMPSAtWarnLevelKey "AtWarnLevel" +#define kIOPMPSAtCriticalLevelKey "AtCriticalLevel" +#define kIOPMPSCurrentCapacityKey "CurrentCapacity" +#define kIOPMPSMaxCapacityKey "MaxCapacity" +#define kIOPMPSDesignCapacityKey "DesignCapacity" +#define kIOPMPSTimeRemainingKey "TimeRemaining" +#define kIOPMPSAmperageKey "Amperage" +#define kIOPMPSVoltageKey "Voltage" +#define kIOPMPSCycleCountKey "CycleCount" +#define kIOPMPSMaxErrKey "MaxErr" +#define kIOPMPSAdapterInfoKey "AdapterInfo" +#define kIOPMPSLocationKey "Location" +#define kIOPMPSErrorConditionKey "ErrorCondition" +#define kIOPMPSManufacturerKey "Manufacturer" +#define kIOPMPSManufactureDateKey "ManufactureDate" +#define kIOPMPSModelKey "Model" +#define kIOPMPSSerialKey "Serial" +#define kIOPMDeviceNameKey "DeviceName" +#define kIOPMPSLegacyBatteryInfoKey "LegacyBatteryInfo" +#define kIOPMPSBatteryHealthKey "BatteryHealth" +#define kIOPMPSHealthConfidenceKey "HealthConfidence" +#define kIOPMPSCapacityEstimatedKey "CapacityEstimated" +#define kIOPMPSBatteryChargeStatusKey "ChargeStatus" +#define kIOPMPSBatteryTemperatureKey "Temperature" +#define kIOPMPSAdapterDetailsKey "AdapterDetails" +#define kIOPMPSChargerConfigurationKey "ChargerConfiguration" + +// kIOPMPSBatteryChargeStatusKey may have one of the following values, or may have +// no value. If kIOPMBatteryChargeStatusKey has a NULL value (or no value) associated with it +// then charge is proceeding normally. If one of these battery charge status reasons is listed, +// then the charge may have been interrupted. +#define kIOPMBatteryChargeStatusTooHot "HighTemperature" +#define kIOPMBatteryChargeStatusTooCold "LowTemperature" +#define kIOPMBatteryChargeStatusTooHotOrCold "HighOrLowTemperature" +#define kIOPMBatteryChargeStatusGradient "BatteryTemperatureGradient" + +// Definitions for battery location, in case of multiple batteries. +// A location of 0 is unspecified +// Location is undefined for single battery systems +enum { + kIOPMPSLocationLeft = 1001, + kIOPMPSLocationRight = 1002 +}; + +// Battery quality health types, specified by BatteryHealth and HealthConfidence +// properties in an IOPMPowerSource battery kext. +enum { + kIOPMUndefinedValue = 0, + kIOPMPoorValue = 1, + kIOPMFairValue = 2, + kIOPMGoodValue = 3 +}; + +// Keys for kIOPMPSAdapterDetailsKey dictionary +#define kIOPMPSAdapterDetailsIDKey "AdapterID" +#define kIOPMPSAdapterDetailsWattsKey "Watts" +#define kIOPMPSAdapterDetailsRevisionKey "AdapterRevision" +#define kIOPMPSAdapterDetailsSerialNumberKey "SerialNumber" +#define kIOPMPSAdapterDetailsFamilyKey "FamilyCode" +#define kIOPMPSAdapterDetailsAmperageKey "Current" +#define kIOPMPSAdapterDetailsDescriptionKey "Description" +#define kIOPMPSAdapterDetailsPMUConfigurationKey "PMUConfiguration" +#define kIOPMPSAdapterDetailsVoltage "Voltage" +#define kIOPMPSAdapterDetailsSourceIDKey "Source" +#define kIOPMPSAdapterDetailsErrorFlagsKey "ErrorFlags" +#define kIOPMPSAdapterDetailsSharedSourceKey "SharedSource" +#define kIOPMPSAdapterDetailsCloakedKey "CloakedSource" + +// values for kIOPSPowerAdapterFamilyKey +enum { + kIOPSFamilyCodeDisconnected = 0, + kIOPSFamilyCodeUnsupported = kIOReturnUnsupported, + kIOPSFamilyCodeFirewire = iokit_family_err(sub_iokit_firewire, 0), + kIOPSFamilyCodeUSBHost = iokit_family_err(sub_iokit_usb, 0), + kIOPSFamilyCodeUSBHostSuspended = iokit_family_err(sub_iokit_usb, 1), + kIOPSFamilyCodeUSBDevice = iokit_family_err(sub_iokit_usb, 2), + kIOPSFamilyCodeUSBAdapter = iokit_family_err(sub_iokit_usb, 3), + kIOPSFamilyCodeUSBChargingPortDedicated = iokit_family_err(sub_iokit_usb, 4), + kIOPSFamilyCodeUSBChargingPortDownstream = iokit_family_err(sub_iokit_usb, 5), + kIOPSFamilyCodeUSBChargingPort = iokit_family_err(sub_iokit_usb, 6), + kIOPSFamilyCodeUSBUnknown = iokit_family_err(sub_iokit_usb, 7), + kIOPSFamilyCodeUSBCBrick = iokit_family_err(sub_iokit_usb, 8), + kIOPSFamilyCodeUSBCTypeC = iokit_family_err(sub_iokit_usb, 9), + kIOPSFamilyCodeUSBCPD = iokit_family_err(sub_iokit_usb, 10), + kIOPSFamilyCodeAC = iokit_family_err(sub_iokit_pmu, 0), + kIOPSFamilyCodeExternal = iokit_family_err(sub_iokit_pmu, 1), + kIOPSFamilyCodeExternal2 = iokit_family_err(sub_iokit_pmu, 2), + kIOPSFamilyCodeExternal3 = iokit_family_err(sub_iokit_pmu, 3), + kIOPSFamilyCodeExternal4 = iokit_family_err(sub_iokit_pmu, 4), + kIOPSFamilyCodeExternal5 = iokit_family_err(sub_iokit_pmu, 5), +}; + +// values for kIOPMPSAdapterDetailsErrorFlagsKey +enum { + kIOPSAdapterErrorFlagNoErrors = 0, + kIOPSAdapterErrorFlagInsufficientAvailablePower = (1 << 1), + kIOPSAdapterErrorFlagForeignObjectDetected = (1 << 2), + kIOPSAdapterErrorFlagDeviceNeedsToBeRepositioned = (1 << 3), +}; + +// Battery's time remaining estimate is invalid this long (seconds) after a wake +#define kIOPMPSInvalidWakeSecondsKey "BatteryInvalidWakeSeconds" + +// Battery must wait this long (seconds) after being completely charged before +// the battery is settled. +#define kIOPMPSPostChargeWaitSecondsKey "PostChargeWaitSeconds" + +// Battery must wait this long (seconds) after being completely discharged +// before the battery is settled. +#define kIOPMPSPostDishargeWaitSecondsKey "PostDischargeWaitSeconds" + + +/* CPU Power Management status keys + * Pass as arguments to IOPMrootDomain::systemPowerEventOccurred + * Or as arguments to IOPMSystemPowerEventOccurred() + * Or to decode the dictionary obtained from IOPMCopyCPUPowerStatus() + * These keys reflect restrictions placed on the CPU by the system + * to bring the CPU's power consumption within allowable thermal and + * power constraints. + */ + + +/* kIOPMGraphicsPowerLimitsKey + * The key representing the dictionary of graphics power limits. + * The dictionary contains the other kIOPMCPUPower keys & their associated + * values (e.g. Speed limit, Processor Count, and Schedule limits). + */ +#define kIOPMGraphicsPowerLimitsKey "Graphics_Power_Limits" + +/* kIOPMGraphicsPowerLimitPerformanceKey + * The key representing the percent of overall performance made available + * by the graphics chip as a percentage (integer 0 - 100). + */ +#define kIOPMGraphicsPowerLimitPerformanceKey "Graphics_Power_Performance" + + + +/* kIOPMCPUPowerLimitsKey + * The key representing the dictionary of CPU Power Limits. + * The dictionary contains the other kIOPMCPUPower keys & their associated + * values (e.g. Speed limit, Processor Count, and Schedule limits). + */ +#define kIOPMCPUPowerLimitsKey "CPU_Power_Limits" + +/* kIOPMCPUPowerLimitProcessorSpeedKey defines the speed & voltage limits placed + * on the CPU. + * Represented as a percentage (0-100) of maximum CPU speed. + */ +#define kIOPMCPUPowerLimitProcessorSpeedKey "CPU_Speed_Limit" + +/* kIOPMCPUPowerLimitProcessorCountKey reflects how many, if any, CPUs have been + * taken offline. Represented as an integer number of CPUs (0 - Max CPUs). + */ +#define kIOPMCPUPowerLimitProcessorCountKey "CPU_Available_CPUs" + +/* kIOPMCPUPowerLimitSchedulerTimeKey represents the percentage (0-100) of CPU time + * available. 100% at normal operation. The OS may limit this time for a percentage + * less than 100%. + */ +#define kIOPMCPUPowerLimitSchedulerTimeKey "CPU_Scheduler_Limit" + + +/* Thermal Level Warning Key + * Indicates the thermal constraints placed on the system. This value may + * cause clients to action to consume fewer system resources. + * The value associated with this warning is defined by the platform. + */ +#define kIOPMThermalLevelWarningKey "Thermal_Level_Warning" + +/* Thermal Warning Level values + * kIOPMThermalLevelNormal - under normal operating conditions + * kIOPMThermalLevelDanger - thermal pressure may cause system slowdown + * kIOPMThermalLevelCritical - thermal conditions may cause imminent shutdown + * + * The platform may define additional thermal levels if necessary. + * Platform specific values are defined from 100 and above + */ +enum { + kIOPMThermalLevelNormal = 0, + kIOPMThermalLevelDanger = 5, + kIOPMThermalLevelCritical = 10, + + kIOPMThermalLevelWarning = 100, + kIOPMThermalLevelTrap = 110, + + kIOPMThermalLevelUnknown = 255, +}; + +#define kIOPMThermalWarningLevelNormal kIOPMThermalLevelNormal +#define kIOPMThermalWarningLevelDanger kIOPMThermalLevelWarning +#define kIOPMThermalWarningLevelCrisis kIOPMThermalLevelCritical + +// PM Settings Controller setting types +// Settings types used primarily with: +// IOPMrootDomain::registerPMSettingController +// The values are identical to the similarly named keys for use in user space +// PM settings work. Those keys are defined in IOPMLibPrivate.h. +#define kIOPMSettingWakeOnRingKey "Wake On Modem Ring" +#define kIOPMSettingRestartOnPowerLossKey "Automatic Restart On Power Loss" +#define kIOPMSettingWakeOnACChangeKey "Wake On AC Change" +#define kIOPMSettingSleepOnPowerButtonKey "Sleep On Power Button" +#define kIOPMSettingWakeOnClamshellKey "Wake On Clamshell Open" +#define kIOPMSettingReduceBrightnessKey "ReduceBrightness" +#define kIOPMSettingDisplaySleepUsesDimKey "Display Sleep Uses Dim" +#define kIOPMSettingTimeZoneOffsetKey "TimeZoneOffsetSeconds" +#define kIOPMSettingMobileMotionModuleKey "MobileMotionModule" +#define kIOPMSettingGraphicsSwitchKey "GPUSwitch" +#define kIOPMSettingProModeControl "ProModeControl" +#define kIOPMSettingProModeDefer "ProModeDefer" + +// Setting controlling drivers can register to receive scheduled wake data +// Either in "CF seconds" type, or structured calendar data in a formatted +// IOPMCalendarStruct defined below. +#define kIOPMSettingAutoWakeSecondsKey "wake" +#define kIOPMSettingAutoWakeCalendarKey "WakeByCalendarDate" +#define kIOPMSettingAutoPowerSecondsKey "poweron" +#define kIOPMSettingAutoPowerCalendarKey "PowerByCalendarDate" + +// Debug seconds auto wake +// Used by sleep cycling debug tools +#define kIOPMSettingDebugWakeRelativeKey "WakeRelativeToSleep" +#define kIOPMSettingDebugPowerRelativeKey "PowerRelativeToShutdown" + +// Maintenance wake calendar. +#define kIOPMSettingMaintenanceWakeCalendarKey "MaintenanceWakeCalendarDate" + + +struct IOPMCalendarStruct { + UInt32 year; + UInt8 month; + UInt8 day; + UInt8 hour; + UInt8 minute; + UInt8 second; + UInt8 selector; +}; +typedef struct IOPMCalendarStruct IOPMCalendarStruct; + +// SetAggressiveness types +enum { + kPMGeneralAggressiveness = 0, + kPMMinutesToDim, + kPMMinutesToSpinDown, + kPMMinutesToSleep, + kPMEthernetWakeOnLANSettings, + kPMSetProcessorSpeed, + kPMPowerSource, + kPMMotionSensor, + kPMLastAggressivenessType +}; +#define kMaxType (kPMLastAggressivenessType-1) + +// SetAggressiveness values for the kPMPowerSource aggressiveness type +enum { + kIOPMInternalPower = 1, + kIOPMExternalPower +}; + +#define kIOREMSleepEnabledKey "REMSleepEnabled" + +// Strings for deciphering the dictionary returned from IOPMCopyBatteryInfo +#define kIOBatteryInfoKey "IOBatteryInfo" +#define kIOBatteryCurrentChargeKey "Current" +#define kIOBatteryCapacityKey "Capacity" +#define kIOBatteryFlagsKey "Flags" +#define kIOBatteryVoltageKey "Voltage" +#define kIOBatteryAmperageKey "Amperage" +#define kIOBatteryCycleCountKey "Cycle Count" + +enum { + kIOBatteryInstalled = (1 << 2), + kIOBatteryCharge = (1 << 1), + kIOBatteryChargerConnect = (1 << 0) +}; + +// Private power management message indicating battery data has changed +// Indicates new data resides in the IORegistry +#define kIOPMMessageBatteryStatusHasChanged iokit_family_msg(sub_iokit_pmu, 0x100) + +// Apple private Legacy messages for re-routing AutoWake and AutoPower messages to the PMU +// through newer user space IOPMSchedulePowerEvent API +#define kIOPMUMessageLegacyAutoWake iokit_family_msg(sub_iokit_pmu, 0x200) +#define kIOPMUMessageLegacyAutoPower iokit_family_msg(sub_iokit_pmu, 0x210) + +// For use with IOPMPowerSource bFlags +#define IOPM_POWER_SOURCE_REV 2 +enum { + kIOPMACInstalled = kIOBatteryChargerConnect, + kIOPMBatteryCharging = kIOBatteryCharge, + kIOPMBatteryInstalled = kIOBatteryInstalled, + kIOPMUPSInstalled = (1 << 3), + kIOPMBatteryAtWarn = (1 << 4), + kIOPMBatteryDepleted = (1 << 5), + kIOPMACnoChargeCapability = (1 << 6), // AC adapter cannot charge battery + kIOPMRawLowBattery = (1 << 7), // used only by Platform Expert + kIOPMForceLowSpeed = (1 << 8), // set by Platfm Expert, chk'd by Pwr Plugin + kIOPMClosedClamshell = (1 << 9), // set by PMU - reflects state of the clamshell + kIOPMClamshellStateOnWake = (1 << 10) // used only by Platform Expert +}; + +// ********************************************** +// Internal power management data structures +// ********************************************** + +#if KERNEL && __cplusplus +class IOService; + +enum { + kIOPowerEmergencyLevel = 1000 +}; + +enum { + kIOPMSubclassPolicy, + kIOPMSuperclassPolicy1 +}; + +struct stateChangeNote { + IOPMPowerFlags stateFlags; + unsigned long stateNum; + void * powerRef; +}; +typedef struct stateChangeNote stateChangeNote; + +#endif /* KERNEL && __cplusplus */ +struct IOPowerStateChangeNotification { + void * powerRef; + unsigned long returnValue; + unsigned long stateNumber; + IOPMPowerFlags stateFlags; +}; +typedef struct IOPowerStateChangeNotification IOPowerStateChangeNotification; +typedef IOPowerStateChangeNotification sleepWakeNote; + +/*! @struct IOPMSystemCapabilityChangeParameters + * @abstract A structure describing a system capability change. + * @discussion A system capability change is a system level transition from a set + * of system capabilities to a new set of system capabilities. Power management + * sends a kIOMessageSystemCapabilityChange message and provides + * this structure as the message data (by reference) to + * gIOPriorityPowerStateInterest clients when system capability + * changes. + * @field notifyRef An identifier for this message notification. Clients with pending + * I/O can signal completion by calling allowPowerChange() with this + * value as the argument. Clients that are able to process the notification + * synchronously should ignore this field. + * @field maxWaitForReply A return value to the caller indicating the maximum time in + * microseconds to wait for the allowPowerChange() call. The default + * value is zero, which indicates the client processing has finished, and power + * management should not wait for an allowPowerChange() call. + * @field changeFlags Flags will be set to indicate whether the notification precedes + * the capability change (kIOPMSystemCapabilityWillChange), or after + * the capability change has occurred (kIOPMSystemCapabilityDidChange). + * @field __reserved1 Set to zero. + * @field fromCapabilities The system capabilities at the start of the transition. + * @field toCapabilities The system capabilities at the end of the transition. + * @field __reserved2 Set to zero. + */ +struct IOPMSystemCapabilityChangeParameters { + uint32_t notifyRef; + uint32_t maxWaitForReply; + uint32_t changeFlags; + uint32_t __reserved1; + uint32_t fromCapabilities; + uint32_t toCapabilities; + uint32_t __reserved2[4]; +}; + +/*! @enum IOPMSystemCapabilityChangeFlags + * @constant kIOPMSystemCapabilityWillChange Indicates the system capability will change. + * @constant kIOPMSystemCapabilityDidChange Indicates the system capability has changed. + */ +enum { + kIOPMSystemCapabilityWillChange = 0x01, + kIOPMSystemCapabilityDidChange = 0x02 +}; + +enum { + kIOPMSystemCapabilityCPU = 0x01, + kIOPMSystemCapabilityGraphics = 0x02, + kIOPMSystemCapabilityAudio = 0x04, + kIOPMSystemCapabilityNetwork = 0x08 +}; + +#endif /* ! _IOKIT_IOPM_H */ diff --git a/QualcommWireless/include/IOKit/pwr_mgt/IOPMLibDefs.h b/QualcommWireless/include/IOKit/pwr_mgt/IOPMLibDefs.h new file mode 100644 index 0000000..7caa525 --- /dev/null +++ b/QualcommWireless/include/IOKit/pwr_mgt/IOPMLibDefs.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + + +#define kPMSetAggressiveness 0 +#define kPMGetAggressiveness 1 +#define kPMSleepSystem 2 +#define kPMAllowPowerChange 3 +#define kPMCancelPowerChange 4 +#define kPMShutdownSystem 5 +#define kPMRestartSystem 6 +#define kPMSleepSystemOptions 7 +#define kPMSetMaintenanceWakeCalendar 8 +#define kPMSetUserAssertionLevels 9 +#define kPMActivityTickle 10 +#define kPMGetSystemSleepType 11 +#define kPMSetClamshellSleepState 12 +#define kPMSleepWakeWatchdogEnable 13 +#define kPMSleepWakeDebugTrig 14 +#define kPMSetDisplayPowerOn 15 + +#define kNumPMMethods 16 diff --git a/QualcommWireless/include/IOKit/pwr_mgt/IOPMPowerSource.h b/QualcommWireless/include/IOKit/pwr_mgt/IOPMPowerSource.h new file mode 100644 index 0000000..c248941 --- /dev/null +++ b/QualcommWireless/include/IOKit/pwr_mgt/IOPMPowerSource.h @@ -0,0 +1,303 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef _IOPMPowerSource_h_ +#define _IOPMPowerSource_h_ + +#include +#include +#include +#include +#include + +enum { + kSecondsPerHour = 3600, + kTenMinutesInSeconds = 600 +}; + + +/*! @class IOPMPowerSource + * + * See IOKit/pwr_mgt/IOPM.h for power source keys relevant to this class. These + * report-type keys are required for calls to IOPMPowerSource::setReportables(), + * and they define the IORegistry interface through which data is passed back + * up to the rest of the system. + * + * A subclassing driver that doesn't want to do anything fancy should: + * 1. Subclass IOPMPowerSource + * 2. Install its own battery change notifications or polling routine that can + * converse with actual battery hardware. + * 3. When battery state changes, change the relevant member variables + * through setCurrentCapacity() style accessors. + * 4. Call updateStatus() on itself when all such settings have been updated. + * + * The subclass driver should also initially populate its settings and call + * updateStatus() on launch. + * + * + * Settings: + * + *
+ * ExternalConnected
+ * Type: bool
+ * IORegistry Key: kIOPMPSExternalConnectedKey
+ * True if computer is drawing external power
+ *
+ * ExternalChargeCapable
+ * Type: bool
+ * IORegistry Key: kIOPMPSExternalChargeCapableKey
+ * True if external power is capable of charging internal battery
+ *
+ * BatteryInstalled
+ * Type: bool
+ * IORegistry Key: kIOPMPSBatteryInstalledKey
+ * True if a battery is present; false if removed
+ *
+ * IsCharging
+ * Type: bool
+ * IORegistry Key: kIOPMPSIsChargingKey
+ * True if battery is charging itself from external power
+ *
+ * AtWarnLevel
+ * Type: bool
+ * IORegistry Key: kIOPMPSAtWarnLevelKey
+ * True if draining battery capacity and past warn level
+ *
+ * AtCriticalLevel
+ * Type: bool
+ * IORegistry Key: kIOPMPSAtCriticalLevelKey
+ * True if draining battery capacity and past critical level
+ *
+ * CurrentCapacity
+ * MaxCapacity
+ * Type: unsigned int
+ * IORegistry Key: kIOPMPSCurrentCapacityKey, kIOPMPSMaxCapacityKey
+ * Capacity measured in mAh
+ *
+ * TimeRemaining
+ * Type: int
+ * IORegistry Key: kIOPMPSTimeRemainingKey
+ * Time remaining measured in minutes
+ *
+ * Amperage
+ * Type: int
+ * IORegistry Key: kIOPMPSAmperageKey
+ * Current is measured in mA
+ *
+ * Voltage
+ * Type: unsigned int
+ * IORegistry Key: kIOPMPSVoltageKey
+ * Voltage measured in mV
+ *
+ * CycleCount
+ * Type: unsigned int
+ * IORegistry Key: kIOPMPSCycleCountKey
+ * Number of charge/discharge cycles
+ *
+ * AdapterInfo
+ * Type: int
+ * IORegistry Key: kIOPMPSAdapterInfoKey
+ * Power adapter information
+ *
+ * Location
+ * Type: int
+ * IORegistry Key: kIOPMPSLocationKey
+ * Clue about battery's location in machine - Left vs. Right
+ *
+ * ErrorCondition
+ * Type: OSSymbol
+ * IORegistry Key: kIOPMPSErrorConditionKey
+ * String describing error state of battery
+ *
+ * Manufacturer
+ * Type: OSSymbol
+ * IORegistry Key: kIOPMPSManufacturerKey
+ * String describing battery manufacturer
+ *
+ * Manufactured Date
+ * Type: unsigned 16-bit bitfield
+ * IORegistry Key: kIOPMPSManufactureDateKey
+ * Date is published in a bitfield per the Smart Battery Data spec rev 1.1
+ * in section 5.1.26
+ *   Bits 0...4 => day (value 1-31; 5 bits)
+ *   Bits 5...8 => month (value 1-12; 4 bits)
+ *   Bits 9...15 => years since 1980 (value 0-127; 7 bits)
+ *
+ * Model
+ * Type: OSSymbol
+ * IORegistry Key: kIOPMPSModelKey
+ * String describing model number
+ *
+ * Serial
+ * Type: OSSymbol
+ * IORegistry Key: kIOPMPSSerialKey
+ * String describing serial number or unique info
+ * The serial number published hear bears no correspondence to the Apple serial
+ * number printed on each battery. This is a manufacturer serial number with
+ * no correlation to the printed serial number.
+ *
+ * LegacyIOBatteryInfo
+ * Type: OSDictionary
+ * IORegistry Key: kIOPMPSLegacyBatteryInfoKey
+ * Dictionary conforming to the OS X 10.0-10.4
+ * 
+ */ + +class IOPMPowerSource : public IOService +{ + OSDeclareDefaultStructors(IOPMPowerSource); + + friend class IOPMPowerSourceList; + +protected: + +/*! @var settingsChangedSinceLastUpdate + * Used by subclasses to determine if any settings have been modified via the + * accessors below since last call to update(). true is settings have changed; + * false otherwise. + */ + bool settingsChangedSinceUpdate; + +/*! @var properties + * Stores power source state + */ + OSDictionary *properties; + + const OSSymbol *externalConnectedKey; + const OSSymbol *externalChargeCapableKey; + const OSSymbol *batteryInstalledKey; + const OSSymbol *chargingKey; + const OSSymbol *warnLevelKey; + const OSSymbol *criticalLevelKey; + const OSSymbol *currentCapacityKey; + const OSSymbol *maxCapacityKey; + const OSSymbol *timeRemainingKey; + const OSSymbol *amperageKey; + const OSSymbol *voltageKey; + const OSSymbol *cycleCountKey; + const OSSymbol *adapterInfoKey; + const OSSymbol *locationKey; + const OSSymbol *errorConditionKey; + const OSSymbol *manufacturerKey; + const OSSymbol *modelKey; + const OSSymbol *serialKey; + const OSSymbol *batteryInfoKey; + +// Tracking for IOPMPowerSourceList + IOPMPowerSource *nextInList; + +public: + +/*! @function powerSource + * @abstract Creates a new IOPMPowerSource nub. Must be attached to IORegistry, + * and registered by provider. + */ + static IOPMPowerSource *powerSource(void); + + virtual bool init(void) APPLE_KEXT_OVERRIDE; + + virtual void free(void) APPLE_KEXT_OVERRIDE; + +/*! @function updateStatus + * @abstract Must be called by physical battery controller when battery state + * has changed significantly. + * @discussion The system will not poll this object for battery updates. Rather \ + * the battery's controller must call updateStatus() every time state changes \ + * and the settings will be relayed to higher levels of power management. \ + * The subclassing driver should override this only if the driver needs to add \ + * new settings to the base class. + */ + virtual void updateStatus(void); + +/* Public accessors for battery state + */ + bool externalConnected(void); + bool externalChargeCapable(void); + bool batteryInstalled(void); + bool isCharging(void); + bool atWarnLevel(void); + bool atCriticalLevel(void); + + unsigned int currentCapacity(void); + unsigned int maxCapacity(void); + unsigned int capacityPercentRemaining(void); + int timeRemaining(void); + int amperage(void); + unsigned int voltage(void); + unsigned int cycleCount(void); + int adapterInfo(void); + int location(void); + + OSSymbol *errorCondition(void); + OSSymbol *manufacturer(void); + OSSymbol *model(void); + OSSymbol *serial(void); + OSDictionary *legacyIOBatteryInfo(void); + + OSObject *getPSProperty(const OSSymbol *); + +protected: + +/* Protected "setter" methods for subclasses + * Subclasses should use these setters to modify all battery properties. + * + * Subclasses must follow all property changes with a call to updateStatus() + * to flush settings changes to upper level battery API clients. + * + */ + void setExternalConnected(bool); + void setExternalChargeCapable(bool); + void setBatteryInstalled(bool); + void setIsCharging(bool); + void setAtWarnLevel(bool); + void setAtCriticalLevel(bool); + + void setCurrentCapacity(unsigned int); + void setMaxCapacity(unsigned int); + void setTimeRemaining(int); + void setAmperage(int); + void setVoltage(unsigned int); + void setCycleCount(unsigned int); + void setAdapterInfo(int); + void setLocation(int); + + void setErrorCondition(OSSymbol *); + void setManufacturer(OSSymbol *); + void setModel(OSSymbol *); + void setSerial(OSSymbol *); + void setLegacyIOBatteryInfo(OSDictionary *); + +/*! All of these methods funnel through the generic accessor method + * setPSProperty. Caller can pass in any arbitrary OSSymbol key, and + * that value will be stored in the PM settings dictionary, and relayed + * onto the IORegistry at update time. + */ + void setPSProperty(const OSSymbol *, OSObject *); +}; + +#endif diff --git a/QualcommWireless/include/IOKit/pwr_mgt/IOPMPowerSourceList.h b/QualcommWireless/include/IOKit/pwr_mgt/IOPMPowerSourceList.h new file mode 100644 index 0000000..e69663a --- /dev/null +++ b/QualcommWireless/include/IOKit/pwr_mgt/IOPMPowerSourceList.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +#include +#include + +class IOPMPowerSource; + +class IOPMPowerSourceList : public OSObject +{ + OSDeclareDefaultStructors(IOPMPowerSourceList); +private: +// pointer to first power source in list + IOPMPowerSource *firstItem; + +// how many power sources are in the list + unsigned long length; + +public: + void initialize(void); + void free(void) APPLE_KEXT_OVERRIDE; + + unsigned long numberOfItems(void); + IOReturn addToList(IOPMPowerSource *newPowerSource); + IOReturn removeFromList(IOPMPowerSource *theItem); + + LIBKERN_RETURNS_NOT_RETAINED IOPMPowerSource *firstInList(void); + LIBKERN_RETURNS_NOT_RETAINED IOPMPowerSource *nextInList(IOPMPowerSource *currentItem); +}; diff --git a/QualcommWireless/include/IOKit/pwr_mgt/IOPMpowerState.h b/QualcommWireless/include/IOKit/pwr_mgt/IOPMpowerState.h new file mode 100644 index 0000000..1ca2452 --- /dev/null +++ b/QualcommWireless/include/IOKit/pwr_mgt/IOPMpowerState.h @@ -0,0 +1,78 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOPMPOWERSTATE_H +#define _IOKIT_IOPMPOWERSTATE_H + +#include + +/*! @header IOPMpowerState.h + * @abstract Defines the struct IOPMPowerState that power managed drivers should use to describe their power states. + */ + +/*! @struct IOPMPowerState + * @abstract Describes a device's power state. + * @discussion To take part in system power management, drivers should define an array of 2 or more power states and pass it to kernel power management through IOService::registerPowerDriver. + * @field version Defines version number of this struct. Just use the value "1" when defining an IOPMPowerState. + * @field capabilityFlags Describes the capability of the device in this state. + * @field outputPowerCharacter Describes the power provided in this state. + * @field inputPowerRequirement Describes the input power required in this state. + * @field staticPower Describes average consumption in milliwatts. Unused; drivers may specify 0. + * @field stateOrder Valid in version kIOPMPowerStateVersion2 or greater of this structure. Defines ordering of power states independently of the power state ordinal. + * @field powerToAttain Describes dditional power to attain this state from next lower state (in milliWatts). Unused; drivers may specify 0. + * @field timeToAttain Describes time required to enter this state from next lower state (in microseconds). Unused; drivers may specify 0. + * @field settleUpTime Describes settle time required after entering this state from next lower state (microseconds). Unused; drivers may specify 0. + * @field timeToLower Describes time required to enter next lower state from this one (microseconds). Unused; drivers may specify 0. + * @field settleDownTime Settle time required after entering next lower state from this state (microseconds). Unused; drivers may specify 0. + * @field powerDomainBudget Describes power in milliWatts a domain in this state can deliver to its children. Unused; drivers may specify 0. + * } + */ + +struct IOPMPowerState { + unsigned long version; + IOPMPowerFlags capabilityFlags; + IOPMPowerFlags outputPowerCharacter; + IOPMPowerFlags inputPowerRequirement; + unsigned long staticPower; + unsigned long stateOrder; + unsigned long powerToAttain; + unsigned long timeToAttain; + unsigned long settleUpTime; + unsigned long timeToLower; + unsigned long settleDownTime; + unsigned long powerDomainBudget; +}; + +typedef struct IOPMPowerState IOPMPowerState; + +enum { + kIOPMPowerStateVersion1 = 1, + kIOPMPowerStateVersion2 = 2 +}; + +#endif /* _IOKIT_IOPMPOWERSTATE_H */ diff --git a/QualcommWireless/include/IOKit/pwr_mgt/IOPowerConnection.h b/QualcommWireless/include/IOKit/pwr_mgt/IOPowerConnection.h new file mode 100644 index 0000000..67d84b3 --- /dev/null +++ b/QualcommWireless/include/IOKit/pwr_mgt/IOPowerConnection.h @@ -0,0 +1,167 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1998 Apple Computer, Inc. All rights reserved. + * + * HISTORY + * + */ + + +#ifndef _IOKIT_IOPOWERCONNECTION_H +#define _IOKIT_IOPOWERCONNECTION_H + +#include +#include + +/*! @class IOPowerConnection + * Do not use IOPowerConnection. This class is an implementation detail defined + * for IOPM's management of the IORegistry IOPower plane. + * + * Only Kernel IOKit power management should reference the IOPowerConnection class. + */ + +class IOPowerConnection : public IOService +{ + OSDeclareDefaultStructors(IOPowerConnection); + +protected: +/*! @field parentKnowsState true: parent knows state of its domain + * used by child */ + bool stateKnown; + +/*! @field currentPowerFlags power flags which describe the current state of the power domain + * used by child */ + IOPMPowerFlags currentPowerFlags; + +/*! @field desiredDomainState state number which corresponds to the child's desire + * used by parent */ + unsigned long desiredDomainState; + +/*! @field requestFlag set to true when desiredDomainState is set */ + bool requestFlag; + +/*! @field preventIdleSleepFlag true if child has this bit set in its desired state + * used by parent */ + unsigned long preventIdleSleepFlag; + +/*! @field preventSystemSleepFlag true if child has this bit set in its desired state + * used by parent */ + unsigned long preventSystemSleepFlag; + +/*! @field awaitingAck true if child has not yet acked our notification + * used by parent */ + bool awaitingAck; + +/*! @field readyFlag true if the child has been added as a power child + * used by parent */ + bool readyFlag; + + +public: +/*! @function setParentKnowsState + * @abstract Sets the stateKnown variable. + * @discussion Called by the parent when the object is created and called by the child when it discovers that the parent now knows its state. */ + void setParentKnowsState(bool ); + +/*! @function setParentCurrentPowerFlags + * @abstract Sets the currentPowerFlags variable. + * @discussion Called by the parent when the object is created and called by the child when it discovers that the parent state is changing. */ + void setParentCurrentPowerFlags(IOPMPowerFlags ); + +/*! @function parentKnowsState + * @abstract Returns the stateKnown variable. */ + bool parentKnowsState(void ); + +/*! @function parentCurrentPowerFlags + * @abstract Returns the currentPowerFlags variable. */ + IOPMPowerFlags parentCurrentPowerFlags(void ); + +/*! @function setDesiredDomainState + * @abstract Sets the desiredDomainState variable. + * @discussion Called by the parent. */ + void setDesiredDomainState(unsigned long ); + +/*! @function getDesiredDomainState + * @abstract Returns the desiredDomainState variable. + * @discussion Called by the parent. */ + unsigned long getDesiredDomainState( void ); + +/*! @function setChildHasRequestedPower +* @abstract Set the flag that says that the child has called requestPowerDomainState. +* @discussion Called by the parent. */ + void setChildHasRequestedPower( void ); + +/*! @function childHasRequestedPower + * @abstract Return the flag that says whether the child has called requestPowerDomainState. + * @discussion Called by the PCI Aux Power Supply Driver to see if a device driver + * is power managed. */ + bool childHasRequestedPower( void ); + +/*! @function setPreventIdleSleepFlag + * @abstract Sets the preventIdleSleepFlag variable. + * @discussion Called by the parent. */ + void setPreventIdleSleepFlag(unsigned long ); + +/*! @function getPreventIdleSleepFlag + * @abstract Returns the preventIdleSleepFlag variable. + * @discussion Called by the parent. */ + bool getPreventIdleSleepFlag( void ); + +/*! @function setPreventSystemSleepFlag + * @abstract Sets the preventSystemSleepFlag variable. + * @discussion Called by the parent. */ + void setPreventSystemSleepFlag(unsigned long ); + +/*! @function getPreventSystemSleepFlag + * @abstract Returns the preventSystemSleepFlag variable. + * @discussion Called by the parent. */ + bool getPreventSystemSleepFlag( void ); + +/*! @function setAwaitingAck + * @abstract Sets the awaitingAck variable. + * @discussion Called by the parent. */ + void setAwaitingAck( bool ); + +/*! @function getAwaitingAck + * @abstract Returns the awaitingAck variable. + * @discussion Called by the parent. */ + bool getAwaitingAck( void ); + +/*! @function setReadyFlag + * @abstract Sets the readyFlag variable. + * @discussion Called by the parent. */ + void setReadyFlag( bool flag ); + +/*! @function getReadyFlag + * @abstract Returns the readyFlag variable. + * @discussion Called by the parent. */ + bool getReadyFlag( void ) const; +}; + +#endif /* ! _IOKIT_IOPOWERCONNECTION_H */ diff --git a/QualcommWireless/include/IOKit/pwr_mgt/RootDomain.h b/QualcommWireless/include/IOKit/pwr_mgt/RootDomain.h new file mode 100644 index 0000000..066b1f5 --- /dev/null +++ b/QualcommWireless/include/IOKit/pwr_mgt/RootDomain.h @@ -0,0 +1,353 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +#ifndef _IOKIT_ROOTDOMAIN_H +#define _IOKIT_ROOTDOMAIN_H + +#include +#include +#include +#include +#include + +#ifndef __MAC_OS_X_VERSION_MIN_REQUIRED +#error "Missing macOS target version" +#endif + +/*! + * Types for PM Assertions + * For creating, releasing, and getting PM assertion levels. + */ + +/*! IOPMDriverAssertionType + * A bitfield describing a set of assertions. May be used to specify which assertions + * to set with IOPMrootDomain::createPMAssertion; or to query which + * assertions are set with IOPMrootDomain::releasePMAssertion. + */ +typedef uint64_t IOPMDriverAssertionType; + +/* IOPMDriverAssertionID + * Drivers may create PM assertions to request system behavior (keep the system awake, + * or keep the display awake). When a driver creates an assertion via + * IOPMrootDomain::createPMAssertion, PM returns a handle to + * the assertion of type IOPMDriverAssertionID. + */ +typedef uint64_t IOPMDriverAssertionID; +#define kIOPMUndefinedDriverAssertionID 0 + +/* IOPMDriverAssertionLevel + * Possible values for IOPMDriverAssertionLevel are kIOPMDriverAssertionLevelOff + * and kIOPMDriverAssertionLevelOn + */ +typedef uint32_t IOPMDriverAssertionLevel; +#define kIOPMDriverAssertionLevelOff 0 +#define kIOPMDriverAssertionLevelOn 255 + +/* + * Flags for get/setSleepSupported() + */ +enum { + kRootDomainSleepNotSupported = 0x00000000, + kRootDomainSleepSupported = 0x00000001, + kFrameBufferDeepSleepSupported = 0x00000002, + kPCICantSleep = 0x00000004 +}; + +/* + * IOPMrootDomain registry property keys + */ +#define kRootDomainSupportedFeatures "Supported Features" +#define kRootDomainSleepReasonKey "Last Sleep Reason" +#define kRootDomainSleepOptionsKey "Last Sleep Options" +#define kIOPMRootDomainWakeReasonKey "Wake Reason" +#define kIOPMRootDomainWakeTypeKey "Wake Type" +#define kIOPMRootDomainPowerStatusKey "Power Status" + +/* + * Possible sleep reasons found under kRootDomainSleepReasonsKey + */ +#define kIOPMClamshellSleepKey "Clamshell Sleep" +#define kIOPMPowerButtonSleepKey "Power Button Sleep" +#define kIOPMSoftwareSleepKey "Software Sleep" +#define kIOPMOSSwitchHibernationKey "OS Switch Sleep" +#define kIOPMIdleSleepKey "Idle Sleep" +#define kIOPMLowPowerSleepKey "Low Power Sleep" +#define kIOPMThermalEmergencySleepKey "Thermal Emergency Sleep" +#define kIOPMMaintenanceSleepKey "Maintenance Sleep" + +/* + * String constants for communication with PM CPU + */ +#define kIOPMRootDomainLidCloseCString "LidClose" +#define kIOPMRootDomainBatPowerCString "BatPower" + +/* + * Supported Feature bitfields for IOPMrootDomain::publishFeature() + */ +enum { + kIOPMSupportedOnAC = (1 << 0), + kIOPMSupportedOnBatt = (1 << 1), + kIOPMSupportedOnUPS = (1 << 2) +}; + +typedef IOReturn (*IOPMSettingControllerCallback) +(OSObject *target, const OSSymbol *type, + OSObject *val, uintptr_t refcon); + +__BEGIN_DECLS +IONotifier * registerSleepWakeInterest( + IOServiceInterestHandler, void *, void * = NULL); + +IONotifier * registerPrioritySleepWakeInterest( + IOServiceInterestHandler handler, + void * self, void * ref = NULL); + +IOReturn acknowledgeSleepWakeNotification(void * ); + +IOReturn vetoSleepWakeNotification(void * PMrefcon); +__END_DECLS + +#define IOPM_ROOTDOMAIN_REV 2 + +class IOPMrootDomain : public IOService +{ + OSDeclareFinalStructors(IOPMrootDomain); + +public: + static IOPMrootDomain * construct( void ); + + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual IOReturn setAggressiveness( unsigned long, unsigned long ) APPLE_KEXT_OVERRIDE; + virtual IOReturn getAggressiveness( unsigned long, unsigned long * ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn sleepSystem( void ); + IOReturn sleepSystemOptions( OSDictionary *options ); + + virtual IOReturn setProperties( OSObject * ) APPLE_KEXT_OVERRIDE; + virtual bool serializeProperties( OSSerialize * s ) const APPLE_KEXT_OVERRIDE; + virtual OSObject * copyProperty( const char * aKey ) const APPLE_KEXT_OVERRIDE; + +/*! @function systemPowerEventOccurred + * @abstract Other drivers may inform IOPMrootDomain of system PM events + * @discussion systemPowerEventOccurred is a richer alternative to receivePowerNotification() + * Only Apple-owned kexts should have reason to call systemPowerEventOccurred. + * @param event An OSSymbol describing the type of power event. + * @param intValue A 32-bit integer value associated with the event. + * @result kIOReturnSuccess on success */ + + IOReturn systemPowerEventOccurred( + const OSSymbol *event, + uint32_t intValue ); + + IOReturn systemPowerEventOccurred( + const OSSymbol *event, + OSObject *value ); + + void claimSystemWakeEvent( IOService *device, + IOOptionBits flags, + const char *reason, + OSObject *details = NULL ); + + virtual IOReturn receivePowerNotification( UInt32 msg ); + + virtual void setSleepSupported( IOOptionBits flags ); + + virtual IOOptionBits getSleepSupported( void ); + + void wakeFromDoze( void ); + + void requestUserActive(IOService *driver, const char *reason); + +// KEXT driver announces support of power management feature + + void publishFeature( const char *feature ); + +// KEXT driver announces support of power management feature +// And specifies power sources with kIOPMSupportedOn{AC/Batt/UPS} bitfield. +// Returns a unique uint32_t identifier for later removing support for this +// feature. +// NULL is acceptable for uniqueFeatureID for kexts without plans to unload. + + void publishFeature( const char *feature, + uint32_t supportedWhere, + uint32_t *uniqueFeatureID); + +// KEXT driver announces removal of a previously published power management +// feature. Pass 'uniqueFeatureID' returned from publishFeature() + + IOReturn removePublishedFeature( uint32_t removeFeatureID ); + +/*! @function copyPMSetting + * @abstract Copy the current value for a PM setting. Returns an OSNumber or + * OSData depending on the setting. + * @param whichSetting Name of the desired setting. + * @result OSObject value if valid, NULL otherwise. */ + + OSObject * copyPMSetting( OSSymbol *whichSetting ); + +/*! @function registerPMSettingController + * @abstract Register for callbacks on changes to certain PM settings. + * @param settings NULL terminated array of C strings, each string for a PM + * setting that the caller is interested in and wants to get callbacks for. + * @param callout C function ptr or member function cast as such. + * @param target The target of the callback, usually 'this' + * @param refcon Will be passed to caller in callback; for caller's use. + * @param handle Caller should keep the OSObject * returned here. If non-NULL, + * handle will have a retain count of 1 on return. To deregister, pass to + * unregisterPMSettingController() + * @result kIOReturnSuccess on success. */ + + IOReturn registerPMSettingController( + const OSSymbol *settings[], + IOPMSettingControllerCallback callout, + OSObject *target, + uintptr_t refcon, + OSObject **handle); // out param + +/*! @function registerPMSettingController + * @abstract Register for callbacks on changes to certain PM settings. + * @param settings NULL terminated array of C strings, each string for a PM + * setting that the caller is interested in and wants to get callbacks for. + * @param supportedPowerSources bitfield indicating which power sources these + * settings are supported for (kIOPMSupportedOnAC, etc.) + * @param callout C function ptr or member function cast as such. + * @param target The target of the callback, usually 'this' + * @param refcon Will be passed to caller in callback; for caller's use. + * @param handle Caller should keep the OSObject * returned here. If non-NULL, + * handle will have a retain count of 1 on return. To deregister, pass to + * unregisterPMSettingController() + * @result kIOReturnSuccess on success. */ + + IOReturn registerPMSettingController( + const OSSymbol *settings[], + uint32_t supportedPowerSources, + IOPMSettingControllerCallback callout, + OSObject *target, + uintptr_t refcon, + OSObject **handle); // out param + + virtual IONotifier * registerInterest( + const OSSymbol * typeOfInterest, + IOServiceInterestHandler handler, + void * target, void * ref = NULL ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn callPlatformFunction( + const OSSymbol *functionName, + bool waitForFunction, + void *param1, void *param2, + void *param3, void *param4 ) APPLE_KEXT_OVERRIDE; + +/*! @function createPMAssertion + * @abstract Creates an assertion to influence system power behavior. + * @param whichAssertionsBits A bitfield specify the assertion that the caller requests. + * @param assertionLevel An integer detailing the initial assertion level, kIOPMDriverAssertionLevelOn + * or kIOPMDriverAssertionLevelOff. + * @param ownerService A pointer to the caller's IOService class, for tracking. + * @param ownerDescription A reverse-DNS string describing the caller's identity and reason. + * @result On success, returns a new assertion of type IOPMDriverAssertionID + */ + IOPMDriverAssertionID createPMAssertion( + IOPMDriverAssertionType whichAssertionsBits, + IOPMDriverAssertionLevel assertionLevel, + IOService *ownerService, + const char *ownerDescription); + +/* @function setPMAssertionLevel + * @abstract Modify the level of a pre-existing assertion. + * @discussion Change the value of a PM assertion to influence system behavior, + * without undergoing the work required to create or destroy an assertion. Suggested + * for clients who will assert and de-assert needs for PM behavior several times over + * their lifespan. + * @param assertionID An assertion ID previously returned by createPMAssertion + * @param assertionLevel The new assertion level. + * @result kIOReturnSuccess if it worked; kIOReturnNotFound or other IOReturn error on failure. + */ + IOReturn setPMAssertionLevel(IOPMDriverAssertionID assertionID, IOPMDriverAssertionLevel assertionLevel); + +/*! @function getPMAssertionLevel + * @absract Returns the active level of the specified assertion(s). + * @discussion Returns kIOPMDriverAssertionLevelOff or + * kIOPMDriverAssertionLevelOn. If multiple assertions are specified + * in the bitfield, only returns kIOPMDriverAssertionLevelOn + * if all assertions are active. + * @param whichAssertionBits Bits defining the assertion or assertions the caller is interested in + * the level of. If in doubt, pass kIOPMDriverAssertionCPUBit as the argument. + * @result Returns kIOPMDriverAssertionLevelOff or + * kIOPMDriverAssertionLevelOn indicating the specified assertion's levels, if available. + * If the assertions aren't supported on this machine, or aren't recognized by the OS, the + * result is undefined. + */ + IOPMDriverAssertionLevel getPMAssertionLevel(IOPMDriverAssertionType whichAssertionBits); + +/*! @function releasePMAssertion + * @abstract Removes an assertion to influence system power behavior. + * @result On success, returns a new assertion of type IOPMDriverAssertionID * + */ + IOReturn releasePMAssertion(IOPMDriverAssertionID releaseAssertion); + +/*! @function restartWithStackshot + * @abstract Take a stackshot of the system and restart the system. + * @result Return kIOReturnSuccess if it work, kIOReturnError if the service is not available. + */ + IOReturn restartWithStackshot(); + + IOReturn setWakeTime(uint64_t wakeContinuousTime); + +private: + unsigned long getRUN_STATE(void); + + virtual IOReturn changePowerStateTo( unsigned long ordinal ) APPLE_KEXT_COMPATIBILITY_OVERRIDE; + virtual IOReturn changePowerStateToPriv( unsigned long ordinal ); + virtual IOReturn requestPowerDomainState( IOPMPowerFlags, IOPowerConnection *, unsigned long ) APPLE_KEXT_OVERRIDE; + virtual void powerChangeDone( unsigned long ) APPLE_KEXT_OVERRIDE; + virtual bool tellChangeDown( unsigned long ) APPLE_KEXT_OVERRIDE; + virtual bool askChangeDown( unsigned long ) APPLE_KEXT_OVERRIDE; + virtual void tellChangeUp( unsigned long ) APPLE_KEXT_OVERRIDE; + virtual void tellNoChangeDown( unsigned long ) APPLE_KEXT_OVERRIDE; + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_9 + virtual IOReturn configureReport(IOReportChannelList *channels, + IOReportConfigureAction action, + void *result, + void *destination) APPLE_KEXT_OVERRIDE; + virtual IOReturn updateReport(IOReportChannelList *channels, + IOReportUpdateAction action, + void *result, + void *destination) APPLE_KEXT_OVERRIDE; +#endif + + void configureReportGated(uint64_t channel_id, + uint64_t action, + void *result); + IOReturn updateReportGated(uint64_t ch_id, + void *result, + IOBufferMemoryDescriptor *dest); + +}; + + +#endif /* _IOKIT_ROOTDOMAIN_H */ diff --git a/QualcommWireless/include/IOKit/rtc/IORTCController.h b/QualcommWireless/include/IOKit/rtc/IORTCController.h new file mode 100644 index 0000000..876210e --- /dev/null +++ b/QualcommWireless/include/IOKit/rtc/IORTCController.h @@ -0,0 +1,85 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * 24 Nov 1998 suurballe Created. + */ +#ifndef _IORTCCONTROLLER_H +#define _IORTCCONTROLLER_H + +#include + +typedef void (*RTC_tick_handler)( IOService * ); + + +class IORTCController : public IOService +{ + OSDeclareAbstractStructors(IORTCController); + +public: + + virtual IOReturn getRealTimeClock( UInt8 * currentTime, IOByteCount * length ) = 0; + virtual IOReturn setRealTimeClock( UInt8 * newTime ) = 0; +}; + +class IORTC : public IOService +{ + OSDeclareAbstractStructors(IORTC); + +protected: + +/*! @var reserved + * Reserved for future use. (Internal use only) */ + struct ExpansionData { }; + ExpansionData *iortc_reserved __unused; + +public: + + virtual long getGMTTimeOfDay( void ) = 0; + virtual void setGMTTimeOfDay( long secs ) = 0; + + virtual void getUTCTimeOfDay( clock_sec_t * secs, clock_nsec_t * nsecs ); + virtual void setUTCTimeOfDay( clock_sec_t secs, clock_nsec_t nsecs ); + + virtual void setAlarmEnable( IOOptionBits message ) = 0; + + virtual IOReturn getMonotonicClockOffset( int64_t * usecs ); + virtual IOReturn setMonotonicClockOffset( int64_t usecs ); + virtual IOReturn getMonotonicClockAndTimestamp( uint64_t * usecs, uint64_t *mach_absolute_time ); + + + OSMetaClassDeclareReservedUnused(IORTC, 0); + OSMetaClassDeclareReservedUnused(IORTC, 1); + OSMetaClassDeclareReservedUnused(IORTC, 2); + OSMetaClassDeclareReservedUnused(IORTC, 3); + OSMetaClassDeclareReservedUnused(IORTC, 4); + OSMetaClassDeclareReservedUnused(IORTC, 5); + OSMetaClassDeclareReservedUnused(IORTC, 6); + OSMetaClassDeclareReservedUnused(IORTC, 7); +}; + +#endif /* !_IORTCCONTROLLER_H */ diff --git a/QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2LSIWorkaroundDescriptor.h b/QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2LSIWorkaroundDescriptor.h new file mode 100644 index 0000000..178ef00 --- /dev/null +++ b/QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2LSIWorkaroundDescriptor.h @@ -0,0 +1,292 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#if __ppc__ + +/*! + @header IOFireWireSBP2LSIWorkaroundDescriptor + Contains the class definition for IOFireWireSBP2LSIWorkaroundDescriptor. +*/ + +#ifndef _IOKIT_IOFIREWIRESBP2LSIWORKAROUNDDESCRIPTOR_H +#define _IOKIT_IOFIREWIRESBP2LSIWORKAROUNDDESCRIPTOR_H + +#include + +class IOFireWireSBP2LSIRange; + +/*! + @class IOFireWireSBP2LSIWorkaroundDescriptor + @abstract This is a subclass of IOGeneralMemoryDescriptor. It is designed to work around + a hardware problem in a common SBP2 target. It takes a memory descriptor as + an argument. It retains this descriptor and returns a new one with resegmented + physical segments and potentially some "unfixable" segments double buffered. + + If the transfer will cause data to be sent from the Mac, syncBuffersForOutput + must be called before the transfer. + + If the transfer will cause data to be recieve by the Mac, syncBuffersForInput + must be called after the transfer. + + This class calculates the new segmentation only once when it is created. + Any changes to the structure of the original memory descriptor will render + this one useless. It must be released and a new IOFireWireSBP2LSIWorkaroundDescriptor + can be created. + + LSI Bridge Workaround Algorithm Details + + Goals: + 1. Avoid LSI Logic "< 16 byte" bug - prevent any data packet smaller than 16 bytes + 2. Minimize double-buffering + 3. Support non-multiple-of-512-byte devices, e.g. CD Audio + + Solution: + Write a page table such that the bridge will nor use packets smaller than 16 bytes. + In other words, rearrange the memory descriptor to avoid the bug, and do it such + that the SBP-2 layer will not break up a segment (du ro the 64k-1 limit) and + re-introduces the problem + + SBP-2 defines the kFWSBP2MaxPageClusterSize constant. We simply make sure + none of our segments are larger than this size and SBP-2 will not break them + up when it writes the SBP-2 page table. + + Notes: + - Some double buffering is unavoidable. Discontiguous pages may yield page + fragments at the start or end of the buffer (or both, with non-512x buffers). + solution uses less than 33 bytes of double-buffer per segment in original + memory descriptor. + - If driver must break up IO to meet ATA limit of 255 (250?) blocks, assume + the driver does this at a higher level (before applying workaround). + - It is expected that the original memory descriptor has been prepared (wired) +*/ + +class IOFireWireSBP2LSIWorkaroundDescriptor : public IOGeneralMemoryDescriptor +{ + OSDeclareDefaultStructors(IOFireWireSBP2LSIWorkaroundDescriptor) + + friend class IOFireWireSBP2LSIRange; + +protected: + + // reserved for future use + struct ExpansionData { }; + ExpansionData *reserved; + + bool fFixedCapacity; // for both allocators + + ////////////////////////////////////// + // for range allocator + + OSArray * fPermanentRanges; + UInt32 fAllocatedRangesCount; + + virtual IOReturn rangeAllocatorInitialize( UInt32 rangeCount ); + virtual void rangeAllocatorDeallocateAllRanges( void ); + virtual IOFireWireSBP2LSIRange * rangeAllocatorNewRange( void ); + virtual void rangeAllocatorFree( void ); + + ////////////////////////////////////// + // for buffer allocator + + OSArray * fBufferDescriptors; + UInt32 fPermanentPages; + IOByteCount fAllocatedBytesCount; + + virtual IOReturn bufferAllocatorInitialize( IOByteCount requestedBufferSize ); + virtual void bufferAllocatorDeallocateAllBuffers( void ); + virtual void * bufferAllocatorNewBuffer( IOPhysicalAddress * address ); + virtual void bufferAllocatorFree( void ); + + ////////////////////////////////////// + // for range table allocator + + IOPhysicalRange * fRangeTable; + IOByteCount fRangeTableSize; + + virtual IOReturn rangeTableAllocatorInitialize( UInt32 requestedBufferSize ); + virtual IOPhysicalRange * rangeTableAllocatorNewTable( UInt32 entries ); + virtual void rangeTableAllocatorFree( void ); + + ////////////////////////////////////// + // for workaround + + IOMemoryDescriptor * fOriginalDesc; + OSArray * fRanges; + IOByteCount fOffset; + IOByteCount fLength; + IODirection fDirection; + + + virtual bool initWithCapacity + ( UInt32 permanentRanges, IOByteCount permanentBufferSpace, bool fixedCapacity ); + + virtual void free(); + + virtual IOReturn resetToInitialCapacity( void ); + virtual IOReturn initializeRangesArray( void ); + virtual IOReturn recalculateSmallSegments( void ); + virtual IOReturn splitLargeSegments( void ); + virtual IOReturn resegmentOddLengthSegments( void ); + virtual IOReturn initializeBuffers( void ); + + virtual bool initWithAddress( void * address, /* not supported */ + IOByteCount withLength, + IODirection withDirection ); + + virtual bool initWithAddress( vm_address_t address, /* not supported */ + IOByteCount withLength, + IODirection withDirection, + task_t withTask ); + + virtual bool initWithPhysicalAddress( + IOPhysicalAddress address, /* not supported */ + IOByteCount withLength, + IODirection withDirection ); + + virtual bool initWithPhysicalRanges( + IOPhysicalRange * ranges, /* not supported */ + UInt32 withCount, + IODirection withDirection, + bool asReference = false ); + + virtual bool initWithRanges( IOVirtualRange * ranges, /* not supported */ + UInt32 withCount, + IODirection withDirection, + task_t withTask, + bool asReference = false ); + +public: + + // static factory methods and intializers + + // + // create a new instance + // + + + /*! + @function withDescriptor + @abstract Creates a new IOFireWireSBP2LSIWorkaroundDescriptor. + @discussion Create a IOFireWireSBP2LSIWorkaroundDescriptor with no permanent capacity then + inits it the given descriptor. This is basicly a short cut for calling + withCapacity( 0, 0, false) and the initWithDescriptor() + @param desc Original memory descriptor. + @param offset Offset of data to "fix" in bytes from beginning of descriptor. + @param len Length of data in bytes to "fix" + @param direction IODirection of data transfer. + @result Returns a new IOFireWireSBP2LSIWorkaroundDescriptor if successful. + */ + + static IOFireWireSBP2LSIWorkaroundDescriptor * withDescriptor + ( IOMemoryDescriptor * desc, IOByteCount offset = 0, + IOByteCount len = 0, IODirection direction = kIODirectionOutIn ); + + // initialize with descriptor + + /*! + @function initWithDescriptor + @abstract Initialize an IOFireWireSBP2LSIWorkaroundDescriptor with the given descriptor. + @discussion Initialize the workaround descriptor with the given descriptor. + @param desc Original memory descriptor. + @param offset Offset of data to "fix" in bytes from beginning of descriptor. + @param len Length of data in bytes to "fix" + @param direction IODirection of data transfer. + @result Returns true if the initialization was successful. + */ + + virtual bool initWithDescriptor( IOMemoryDescriptor * desc, IOByteCount offset = 0, + IOByteCount len = 0, IODirection direction = kIODirectionOutIn ); + + + /////////////////////////////////// + + + /*! + @function withCapacity + @abstract Create a new descriptor with possibly a permanent capacity. + @discussion Create and IOFireWireSBP2LSIWorkaroundDescriptor with a permanent fixed capacity. + You should call initWithDescriptor afterward. permanentRanges is number of ranges to keep + permanently allocated for use by the algorithm. If fixedCapacity is false additional ranges + may be allocated and deallocated dyanmicly if needed. The algorithm may require more or less + ranges than either the original descriptor or the final fixed may decriptor contain. + permanentBufferSpace is the number of bytes of permanent buffer to keep arround. If fixedCapacity + is false additional buffer space may be allocated and deallocated dynamically. permanentBufferSpace + should generally be set to 32 * maximum number of ranges. fixedCapacity is a flag indicating + whether dynamic allocations are allowed. When making decisions about the maximum amount of + buffer space to keep around, it should be noted tha the maximum number of ranges maybe different + from permanentRanges if fixedCapcity is false. + @param permanentRanges Count of permanent ranges. + @param permanentBufferSpace Byte count of permanent buffers. + @param fixedCapacity bool indicating if dynamic allocations can be made. + @result Returns true if the initialization was successful. + */ + + static IOFireWireSBP2LSIWorkaroundDescriptor * withCapacity + ( UInt32 permanentRanges, IOByteCount permanentBufferSpace, bool fixedCapacity ); + + + /////////////////////////////////// + + // + // manipulate buffers for IO + // + + /*! + @function syncBuffersForOutput + @abstract Synchronize the buffers for output. + @discussion Since double buffering may be invovled in the workaround. The driver needs to + indicate when these buffers should be syncronized with the original descriptor. For data + that will be output syncBuffersForOutput should be called before submiting the ORB. + @result Returns kIOReturnSuccess if sync was successful. + */ + + virtual IOReturn syncBuffersForOutput( void ); // call before output + + /*! + @function syncBuffersForInput + @abstract Synchronize the buffers for input. + @discussion Since double buffering may be invovled in the workaround. The driver needs to + indicate when these buffers should be syncronized with the original descriptor. For data + that will be input syncBuffersForOutput should be called after receiving completion status + for the ORB. + @result Returns kIOReturnSuccess if sync was successful. + */ + + virtual IOReturn syncBuffersForInput( void ); // call after input + +private: + + OSMetaClassDeclareReservedUnused(IOFireWireSBP2LSIWorkaroundDescriptor, 0); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2LSIWorkaroundDescriptor, 1); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2LSIWorkaroundDescriptor, 2); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2LSIWorkaroundDescriptor, 3); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2LSIWorkaroundDescriptor, 4); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2LSIWorkaroundDescriptor, 5); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2LSIWorkaroundDescriptor, 6); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2LSIWorkaroundDescriptor, 7); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2LSIWorkaroundDescriptor, 8); + +}; + +#endif + +#endif diff --git a/QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2LUN.h b/QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2LUN.h new file mode 100644 index 0000000..e6c97de --- /dev/null +++ b/QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2LUN.h @@ -0,0 +1,270 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/*! + @header IOFireWireSBP2LUN + Contains the class definition for IOFireWireSBP2LUN. +*/ + +#ifndef _IOKIT_IOFIREWIRESBP2LUN_H +#define _IOKIT_IOFIREWIRESBP2LUN_H + +#include +#include + +#include + +#include +#include + +class IOFireWireSBP2Target; + +/*! + @class IOFireWireSBP2LUN + @abstract Provider for most drivers. + @discussion IOFireWireSBP2LUN objects are created by IOFireWireSBP2Target objects. Each target may have zero or more IOFireWireSBP2LUN children. The LUN object serves as the matching nub for most drivers and therefore will be the provider for most drivers. It supplies the methods that control the operation of the LUN as a whole. Methods that control the behavior and execution of an SBP2 login session are supplied in a separate IOFireWireSBP2Login object. The LUN can be used to create one of these login objects. + The LUN can also create IOFireWireSBP2ManagementORBs for configuring and appending non-login related management functions. Login related management functions (ie. Login, Logout, Reconnect) are supplied by the IOFireWireSBP2Login. + Finally the LUN can supply a reference to the IOFireWireUnit. This can be useful if a driver wishes to access the standard FireWire APIs. +*/ + +class IOFireWireSBP2LUN : public IOService +{ + OSDeclareDefaultStructors( IOFireWireSBP2LUN ); + + friend class IOFireWireSBP2ManagementORB; + friend class IOFireWireSBP2Login; + friend class IOFireWireSBP2UserClient; + +protected: + + // reserved for future use + struct ExpansionData { }; + ExpansionData *reserved; + + //////////////////////////////////////////// + // methods called by friend classes + + // IOFireWireSBP2Login methods + virtual void removeLogin( IOFireWireSBP2Login * login ); + virtual IOFireWireSBP2Target * getTarget( void ); + + // IOFireWireSBP2ManagementORB methods + virtual void clearAllTasksInSet( void ); // assumes caller is on workloop + virtual void removeManagementORB( IOFireWireSBP2ManagementORB * orb ); + + // IOFireWireSBP2UserClient methods + virtual void flushAllManagementORBs( void ); + +public: + + //////////////////////////////////////////// + // IOService overrides + + /*! @function attach + @abstract Attaches an IOService client to a provider in the registry. + @discussion See IOService for discussion. + @param provider The IOService object which will serve as this objects provider. + @result false if the provider is inactive or on a resource failure, otherwise true. + */ + + virtual bool attach( IOService *provider ); + + /*! @function handleOpen + @abstract Overrideable method to control the open / close behaviour of an IOService. + @discussion See IOService for discussion. + @param forClient Designates the client of the provider requesting the open. + @param options Options for the open, may be interpreted by the implementor of handleOpen. + @result Return true if the open was successful, false otherwise. */ + + virtual bool handleOpen( IOService * forClient, + IOOptionBits options, + void * arg ); + /*! + @function handleClose + @abstract Overrideable method to control the open / close behaviour of an IOService. + @discussion See IOService for discussion. + @param forClient Designates the client of the provider requesting the close. + @param options Options for the close, may be interpreted by the implementor of handleOpen. + */ + + virtual void handleClose( IOService * forClient, + IOOptionBits options ); + + /*! + @function matchPropertyTable + @abstract Implements SBP2 specific matching. + @discussion See IOService for discussion. + @param table The dictionary of properties to be matched against. + @result Returns false if the family considers the matching dictionary does not match in properties it understands, true otherwise. + */ + + virtual bool matchPropertyTable(OSDictionary * table); + +protected: + + //////////////////////////////////////////// + // private fields + + IOFireWireSBP2Target * fProviderTarget; + UInt32 fLUNumber; + OSSet * fLoginSet; + OSIterator * fLoginSetIterator; + IOCommandGate * fGate; + OSSet * fORBSet; + OSIterator * fORBSetIterator; + OSObject * fDiagnostics; + + //////////////////////////////////////////// + // private methods + + // IOService methods + virtual void free( void ); + virtual IOReturn message( UInt32 type, IOService * provider, void * argument = 0 ); + + // create management orb internals + static IOReturn staticCreateManagementORBAction( OSObject *self, + void * refCon, + void * completion, + void * orb, + void * ); + virtual IOReturn createManagementORBAction( void * refCon, + FWSBP2ManagementCallback completion, + IOFireWireSBP2ManagementORB ** orb ); + + // remove management orb internals + static IOReturn staticRemoveManagementORBAction( OSObject * self, void * orb, + void *, void *, void * ); + virtual IOReturn removeManagementORBAction( IOFireWireSBP2ManagementORB * orb ); + + // flush all management orb internals + static IOReturn staticExecuteFlushAllMgmtORBs( OSObject * self, void *, + void *, void *, void * ); + virtual IOReturn executeFlushAllMgmtORBs( void ); + + // IOFireWireSBP2ManagementORB friend class wrappers + virtual bool initMgmtORBWithLUN( IOFireWireSBP2ManagementORB * orb, IOFireWireSBP2LUN * lun, + void * refCon, + FWSBP2ManagementCallback completion ); + + // IOFireWireSBP2Login friend class wrappers + virtual bool initLoginWithLUN( IOFireWireSBP2Login * login, IOFireWireSBP2LUN * lun ); + virtual void suspendedNotify( void ); + virtual void resumeNotify( void ); + +private: + + OSMetaClassDeclareReservedUnused(IOFireWireSBP2LUN, 0); + +public: + + //////////////////////////////////////////// + // client methods + + // getters + + /*! + @function getFireWireUnit + @abstract Returns an IOFireWireUnit object. + @discussion An IOFireWireUnit is the provider of an IOFireWireSBP2Target. In order to + use the base FireWire services you will need a reference to the unit. This method + returns that reference. + @result Returns a pointer to an IOFireWireUnit. + */ + + virtual IOFireWireUnit * getFireWireUnit( void ); + + /*! + @function getLUNumber + @abstract Returns the LUNs number. + @discussion Each LUN has a number to uniquely identify it on a device. This method returns + this value in a UInt32. + @result Returns a UInt32 containing the Logical Unit Number. + */ + + virtual UInt32 getLUNumber( void ); + + // factory methods + + /*! + @function createLogin + @abstract Creates a new IOFireWireSBP2Login object. + @discussion Creates a new IOFireWireSBP2Login object for the LUN. Login objects supply most + of the SBP2 APIs related to login maintenance and Normal Command ORB execution. + @result Returns a pointer to a new IOFireWireSBP2Login. + */ + + virtual IOFireWireSBP2Login *createLogin( void ); + + /*! + @function createManagementORB + @abstract Creates a new IOFireWireSBP2ManagementORB object. + @discussion Creates a new IOFireWireSBP2ManagementORB object. Management objects let you + execute commands like QueryLogins, LogicalUnitReset, and AbortTask. These commands are + configured after they are created here. When they are done executing (after a call to submit) + the supplied completion routine will be called with the supplied refcon. Usually this refCon + is the "this" pointer of completion method's object. + @param refCon The refcon passed to the completion routine. + @param completion The completion routine. Called when the ORB finishes execution. + @result Returns a pointer to a new IOFireWireSBP2Login. + */ + + virtual IOFireWireSBP2ManagementORB * createManagementORB( void * refCon, FWSBP2ManagementCallback completion ); + +protected: + + static IOReturn staticCreateLogin( OSObject *self, void * login, void *, void *, void * ); + virtual IOReturn createLoginAction( IOFireWireSBP2Login ** login ); + + static IOReturn staticRemoveLoginAction( OSObject *self, void * login, void *, void *, void * ); + virtual IOReturn removeLoginAction( IOFireWireSBP2Login * login ); + +public: + + /*! + @function getDiagnostics + @abstract Debug-only method. + @discussion Returns a reference to the internal diagnostics object when the services are built + in debug mode. Should be a no-op in release builds. + @result Returns a pointer to the diagnostics object (if any). + */ + + virtual OSObject * getDiagnostics( void ); + + virtual bool finalize( IOOptionBits options ); + +protected: + + void terminateNotify( void ); + +private: + OSMetaClassDeclareReservedUnused(IOFireWireSBP2LUN, 1); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2LUN, 2); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2LUN, 3); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2LUN, 4); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2LUN, 5); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2LUN, 6); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2LUN, 7); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2LUN, 8); + +}; + +#endif \ No newline at end of file diff --git a/QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2Login.h b/QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2Login.h new file mode 100644 index 0000000..42a838c --- /dev/null +++ b/QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2Login.h @@ -0,0 +1,1078 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/*! + @header IOFireWireSBP2Login + Contains the class definition for IOFireWireSBP2Login. +*/ + +#ifndef _IOKIT_IOFIREWIRESBP2LOGIN_H +#define _IOKIT_IOFIREWIRESBP2LOGIN_H + +#include + +#include + +#include +#include + +// login option flags +enum +{ + kFWSBP2DontSynchronizeMgmtAgent = (1 << 0), + kFWSBP2ExclusiveLogin = (1 << 5) +}; + +// notification events +enum +{ + kFWSBP2NormalCommandStatus = 6, + kFWSBP2NormalCommandTimeout = 7, + kFWSBP2UnsolicitedStatus = 8, + kFWSBP2NormalCommandReset = 9 +}; + +#define kIOMessageFWSBP2ReconnectComplete iokit_fw_err(0x3E8) +#define kIOMessageFWSBP2ReconnectFailed iokit_fw_err(0x3E9) + +/*! + @typedef FWSBP2LoginResponse + @param length Length of login response. + @param loginID Unique id representing this login. + @param commandBlockAgentAddressHi High 32 bits of command block agent address. + @param commandBlockAgentAddressLo Low 32 bits of command block agent address. + @param reserved Reserved. + @param reconnectHold Reconnect timeout encoded as 2^reconnectHold seconds. +*/ + +typedef struct +{ + UInt16 length; + UInt16 loginID; + UInt32 commandBlockAgentAddressHi; + UInt32 commandBlockAgentAddressLo; + UInt16 reserved; + UInt16 reconnectHold; +} FWSBP2LoginResponse, *FWSBP2LoginResponsePtr; + +/*! + @typedef FWSBP2StatusBlock + @param details Src, Resp, D, Len fields of status block format + @param sbpStatus SBP2 specific status + @param orbOffsetHi High 32 bits of address of orb status is for. + @param orbOffsetLo Low 32 bits of address of orb status is for. + @param status[6] Up to 48 bytes of additional data. Length is determined by len field. +*/ + +typedef struct +{ + UInt8 details; + UInt8 sbpStatus; + UInt16 orbOffsetHi; + UInt32 orbOffsetLo; + UInt32 status[6]; +} FWSBP2StatusBlock; + +class IOFireWireSBP2LUN; +class IOFireWireSBP2Login; + +// struct sent to login complete handler + +/*! + @typedef FWSBP2LoginCompleteParams + @param login Pointer to IOFireWireSBP2Login object. + @param generation FireWire generation value. + @param status Status of login attempt. + @param loginResponse Pointer to login response struct. + @param statusBlock Pointer to status block buffer. + @param statusBlockLength Length of entire status block. +*/ + +typedef struct +{ + IOFireWireSBP2Login * login; // login object this param is sent from + UInt32 generation; // generation this login was attempted in + + IOReturn status; // status of login attempt + + FWSBP2LoginResponsePtr loginResponse; // pointer to loginResponse buffer + FWSBP2StatusBlock * statusBlock; // pointer to statusBlock buffer + UInt32 statusBlockLength; // size of statusBlock buffer + +} FWSBP2LoginCompleteParams, *FWSBP2LoginCompleteParamsPtr; + +// struct sent to logout complete handler + +/*! + @typedef FWSBP2LogoutCompleteParams + @param login Pointer to IOFireWireSBP2Login object. + @param generation FireWire generation value. + @param status Status of login attempt. + @param statusBlock Pointer to status block buffer. + @param statusBlockLength Length of entire status block. +*/ + +typedef struct +{ + IOFireWireSBP2Login * login; // login object this param is sent from + UInt32 generation; // generation this login was attempted in + + IOReturn status; // status of login attempt + + FWSBP2StatusBlock * statusBlock; // pointer to statusBlock buffer + UInt32 statusBlockLength; // size of statusBlock buffer + +} FWSBP2LogoutCompleteParams, *FWSBP2LogoutCompleteParamsPtr; + +// struct sent with reconnect notification + +/*! + @typedef FWSBP2LogoutCompleteParams + @param login Pointer to IOFireWireSBP2Login object. + @param generation FireWire generation value. + @param status Status of login attempt. + @param reconnectStatusBlock Pointer to status block buffer. + @param reconnectStatusBlockLength Length of entire status block. +*/ + +typedef struct +{ + IOFireWireSBP2Login * login; // login object this param is sent from + UInt32 generation; // generation this login was attempted in + + IOReturn status; // status of reconnect attempt + + void * reconnectStatusBlock; // pointer to statusBlock buffer + UInt32 reconnectStatusBlockLength; // size of statusBlock buffer +} FWSBP2ReconnectParams, *FWSBP2ReconnectParamsPtr; + +// Callback when login and logout commands complete asynchronously + +/*! + @typedef FWSBP2LoginCallback + @param refCon Reference constant supplied when the notification was registered. + @param params Structure containing additional information about the status of the login. +*/ + +typedef void (*FWSBP2LoginCallback)(void * refCon, FWSBP2LoginCompleteParamsPtr params); + +/*! + @typedef FWSBP2LogoutCallback + @param refCon Reference constant supplied when the notification was registered. + @param params Structure containing additional information about the status of the logout. +*/ + +typedef void (*FWSBP2LogoutCallback)(void * refCon, FWSBP2LogoutCompleteParamsPtr params); + +/*! + @typedef FWSBP2StatusCallback + @param refCon Reference constant supplied when the notification was registered. + @param status Indicates success or failure of operation. +*/ + +typedef void (*FWSBP2StatusCallback)(void * refCon, IOReturn status); + +/*! + @typedef FWSBP2FetchAgentWriteCallback + @param refCon Reference constant supplied when the notification was registered. + @param status Indicates success or failure of operation. + @param orb Indicates current last orb in chain. +*/ + +typedef void (*FWSBP2FetchAgentWriteCallback)(void * refCon, IOReturn status, IOFireWireSBP2ORB * orb); + +/*! + @typedef FWSBP2NotifyParams + @param notificationEvent Type of event we are being notified of. + @param message buffer containing message. + @param length length of message field. + @param generation FireWire generation value. +*/ + +typedef struct +{ + void * commandObject; + UInt32 notificationEvent; + const void * message; + UInt32 length; + UInt32 generation; +} FWSBP2NotifyParams, *FWSBP2NotifyParamsPtr; + + +/*! + @typedef FWSBP2NotifyCallback + @param refCon Reference constant supplied when the notification was registered. + @param params FWSBP2NotifyParams containing notification information. +*/ + +typedef void (*FWSBP2NotifyCallback)(void * refCon, FWSBP2NotifyParamsPtr params); + +/*! + @class IOFireWireSBP2Login + @abstract Supplies the login maintenance and Normal Command ORB execution portions of the API. + @discussion Supplies APIs for login maintenance and command execution. Drivers can use this + object to create IOFireWireSBP2ORB objects and execute them. Solicited and unsolicited status + callback routines can be registered and the SBP2 services will notify the driver when the + appropriate status arrives. + This class also handles login maintenance. Supplies APIs for logging in and logging out and + attempts to reconnect to the LUN after bus resets. The base FireWire services deliver bus + reset notification via the IOKit message routine. The SBP2 services build on this behavior + and deliver reconnectFailed and reconnectComplete through the message routine as well. +*/ + +class IOFireWireSBP2Login : public OSObject +{ + OSDeclareDefaultStructors( IOFireWireSBP2Login ) + + friend class IOFireWireSBP2ORB; + friend class IOFireWireSBP2LUN; + friend class IOFireWireSBP2UserClient; + +protected: + + // command selectors + enum + { + kLoginCommandIdle = 0, + kLoginCommandDoLogin = 1, + kLoginCommandDoLogout = 2, + kLoginAddORB = 3, + kLoginRemoveORB = 4, + kLoginFetchAgentReset = 5 + }; + + // internal login states + enum + { + kLoginStateIdle = 0, + kLoginStateLoggingIn = 1, + kLoginStateConnected = 2, + kLoginStateReconnect = 3, + kLoginStateLoggingOut = 4, + kLoginStateTerminated = 5 + }; + + // rom keys + enum + { + kUnitCharacteristicsKey = 0x3A, + kManagementAgentOffsetKey = 0x54 + }; + + // sbp2 defs + enum + { + kFWSBP2RequestComplete = 0, + kFWSBP2TransportFailure = 1, + kFWSBP2IllegalRequest = 2, + kFWSBP2VendorDependent = 3 + }; + + enum + { + kFWSBP2NoSense = 0, + kFWSBP2RequestTypeNotSupported = 1, + kFWSBP2SpeedNotSupported = 2, + kFWSBP2PageSizeNotSupported = 3, + kFWSBP2AccessDenied = 4, + kFWSBP2LogicalUnitNotSupported = 5, + kFWSBP2MaxPayloadTooSmall = 6, + kFWSBP2FunctionRejected = 9, + kFWSBP2LoginIDNotRecognized = 10, + kFWSBP2DummyORBCompleted = 11, + kFWSBP2RequestAborted = 12, + kFWSBP2UnspecifiedError = 0xFF + }; + + typedef struct + { + UInt32 password[2]; + UInt32 loginResponseAddressHi; + UInt32 loginResponseAddressLo; + UInt16 options; + UInt16 lun; + UInt16 passwordLength; + UInt16 loginResponseLength; + UInt32 statusFIFOAddressHi; + UInt32 statusFIFOAddressLo; + } FWSBP2LoginORB; + + typedef struct + { + UInt32 reserved1[4]; + UInt16 options; + UInt16 loginID; + UInt32 reserved2; + UInt32 statusFIFOAddressHi; + UInt32 statusFIFOAddressLo; + } FWSBP2ReconnectORB; + + typedef struct + { + UInt32 reserved1[4]; + UInt16 options; + UInt16 loginID; + UInt32 reserved2; + UInt32 statusFIFOAddressHi; + UInt32 statusFIFOAddressLo; + } FWSBP2LogoutORB; + +protected: + + /////////////////////////////////////////////////////////////////// + // private interface methods + + // IOFireWireSBP2LUN methods + virtual void clearAllTasksInSet( void ); + virtual bool initWithLUN( IOFireWireSBP2LUN * lun ); + virtual void suspendedNotify( void ); + virtual void resumeNotify( void ); + + // IOFireWireSBP2ORB methods + virtual IOFireWireUnit * getFireWireUnit( void ); + virtual IOFireWireSBP2LUN * getFireWireLUN( void ); + virtual bool isFetchAgentWriteInProgress( void ); + virtual bool isConnected( void ); + virtual IOReturn removeORB( IOFireWireSBP2ORB * orb ); + virtual IOReturn appendORBImmediate( IOFireWireSBP2ORB * orb ); + virtual IOReturn appendORB( IOFireWireSBP2ORB * orb ); + virtual void sendTimeoutNotification( IOFireWireSBP2ORB * orb ); + +protected: + + // reserved for future use + struct ExpansionData { }; + ExpansionData *reserved; + + IOFireWireSBP2LUN * fLUN; + IOFireWireUnit * fUnit; + IOFireWireController * fControl; + IOCommandGate * fGate; + + FWSBP2LoginCallback fLoginCompletionCallback; + void * fLoginCompletionRefCon; + + FWSBP2LogoutCallback fLogoutCompletionCallback; + void * fLogoutCompletionRefCon; + + FWSBP2NotifyCallback fStatusNotifyCallback; + void * fStatusNotifyRefCon; + + FWSBP2NotifyCallback fUnsolicitedStatusNotifyCallback; + void * fUnsolicitedStatusNotifyRefCon; + + UInt32 fLoginFlags; + UInt32 fReconnectTime; + + UInt32 fLoginState; + UInt32 fManagementOffset; + UInt32 fManagementTimeout; + UInt32 fMaxORBSize; + UInt32 fMaxCommandBlockSize; + UInt16 fLoginNodeID; + UInt32 fLoginGeneration; + UInt32 fLoginID; + UInt32 fReconnectHold; + UInt32 fMaxPayloadSize; + void * fRefCon; + + // resources + + FWSBP2LoginORB fLoginORB; + IOFWAddressSpace * fLoginORBAddressSpace; + FWAddress fLoginORBAddress; + + FWSBP2LoginResponse fLoginResponse; + IOFWAddressSpace * fLoginResponseAddressSpace; + FWAddress fLoginResponseAddress; + + FWSBP2ReconnectORB fReconnectORB; + IOFWAddressSpace * fReconnectORBAddressSpace; + FWAddress fReconnectORBAddress; + + FWSBP2StatusBlock fStatusBlock; + IOFWAddressSpace * fStatusBlockAddressSpace; + FWAddress fStatusBlockAddress; + + FWSBP2StatusBlock fReconnectStatusBlock; + IOFWAddressSpace * fReconnectStatusBlockAddressSpace; + FWAddress fReconnectStatusBlockAddress; + + FWSBP2LogoutORB fLogoutORB; + IOFWAddressSpace * fLogoutORBAddressSpace; + FWAddress fLogoutORBAddress; + bool fLogoutPending; + + IOFWWriteCommand * fLoginWriteCommand; + IOMemoryDescriptor * fLoginWriteCommandMemory; + bool fLoginWriteInProgress; + + IOFWWriteCommand * fReconnectWriteCommand; + IOMemoryDescriptor * fReconnectWriteCommandMemory; + bool fReconnectWriteInProgress; + bool fReconnectWriteInterrupted; + + IOFWWriteCommand * fLogoutWriteCommand; + IOMemoryDescriptor * fLogoutWriteCommandMemory; + bool fLogoutWriteInProgress; + + IOFWCommand * fLoginTimeoutCommand; + bool fLoginTimeoutTimerSet; + + IOFWDelayCommand * fReconnectTimeoutCommand; + bool fReconnectTimeoutTimerSet; + + IOFWCommand * fLogoutTimeoutCommand; + bool fLogoutTimeoutTimerSet; + + FWAddress fFetchAgentAddress; + IOMemoryDescriptor * fFetchAgentWriteCommandMemory; + FWAddress fLastORBAddress; + IOFireWireSBP2ORB * fLastORB; + IOFWWriteCommand * fFetchAgentWriteCommand; + bool fFetchAgentWriteCommandInUse; + FWSBP2FetchAgentWriteCallback fFetchAgentWriteCompletion; + void * fFetchAgentWriteRefCon; + IOFireWireSBP2ORB * fORBToWrite; + + OSSet * fORBSet; + OSIterator * fORBSetIterator; + + void * fPasswordBuf; + UInt32 fPasswordLen; + IOFWAddressSpace * fPasswordAddressSpace; + FWAddress fPasswordAddress; + IOMemoryDescriptor * fPasswordDescriptor; + + bool fSuspended; + + UInt32 fLoginRetryDelay; + UInt32 fLoginRetryCount; + UInt32 fLoginRetryMax; + IOFWDelayCommand * fLoginRetryTimeoutCommand; + bool fLoginRetryTimeoutTimerSet; + IOFireWireSBP2Target * fTarget; + + bool fUnsolicitedStatusEnableRequested; + + IOFWDelayCommand * fReconnectRetryTimeoutCommand; + bool fReconnectRetryTimeoutTimerSet; + + int fCriticalSectionCount; + + // init / destroy + virtual IOReturn getUnitInformation( void ); + virtual IOReturn allocateResources( void ); + virtual void free( void ); + + // orb add / remove + virtual IOReturn addORB( IOFireWireSBP2ORB * orb ); + static IOReturn staticExecuteAddORB( OSObject *self, void * orb, void *, void *, void * ); + virtual IOReturn executeAddORB( IOFireWireSBP2ORB * orb ); + + static IOReturn staticExecuteRemoveORB( OSObject *self, void * orb, void *, void *, void * ); + virtual IOReturn executeRemoveORB( IOFireWireSBP2ORB * orb ); + + // + // login + // + + static IOReturn staticExecuteLogin( OSObject *self, void *, void *, void *, void * ); + virtual IOReturn executeLogin( void ); + virtual void abortLogin( void ); + + // login write complete handler + static void loginWriteCompleteStatic( void *refcon, IOReturn status, IOFireWireNub *device, IOFWCommand *fwCmd ); + virtual void loginWriteComplete( IOReturn status, IOFireWireNub *device, IOFWCommand *fwCmd ); + + // login timeout handler + static void loginTimeoutStatic( void *refcon, IOReturn status, IOFireWireBus *bus, IOFWBusCommand *fwCmd ); + virtual void loginTimeout( IOReturn status, IOFireWireBus *bus, IOFWBusCommand *fwCmd ); + + // status block write handler + static UInt32 statusBlockWriteStatic(void *refcon, UInt16 nodeID, IOFWSpeed &speed, FWAddress addr, UInt32 len, + const void *buf, IOFWRequestRefCon lockRead); + virtual UInt32 statusBlockWrite( UInt16 nodeID, IOFWSpeed &speed, FWAddress addr, UInt32 len, const void *buf, IOFWRequestRefCon lockRead); + virtual void completeLogin( IOReturn state, const void *buf = NULL, UInt32 len = 0, void * buf2 = NULL ); + + // + // reconnect + // + + virtual void doReconnect( void ); + virtual void restartReconnect( void ); + virtual void startReconnectTimer( void ); + + // reconnect write complete handler + static void reconnectWriteCompleteStatic( void *refcon, IOReturn status, IOFireWireNub *device, IOFWCommand *fwCmd ); + virtual void reconnectWriteComplete( IOReturn status, IOFireWireNub *device, IOFWCommand *fwCmd ); + + // reconnect timeout handler + static void reconnectTimeoutStatic( void *refcon, IOReturn status, IOFireWireBus *bus, IOFWBusCommand *fwCmd ); + virtual void reconnectTimeout( IOReturn status, IOFireWireBus *bus, IOFWBusCommand *fwCmd ); + + // reconnect status block + static UInt32 reconnectStatusBlockWriteStatic(void *refcon, UInt16 nodeID, IOFWSpeed &speed, FWAddress addr, + UInt32 len, const void *buf, IOFWRequestRefCon lockRead); + virtual UInt32 reconnectStatusBlockWrite( UInt16 nodeID, IOFWSpeed &speed, FWAddress addr, UInt32 len, + const void *buf, IOFWRequestRefCon lockRead); + + virtual void sendReconnectNotification( UInt32 event ); + virtual void sendReconnectNotificationWithStatusBlock( UInt32 event ); + + // + // logout + // + + static IOReturn staticExecuteLogout( OSObject *self, void *, void *, void *, void * ); + virtual IOReturn executeLogout( void ); + + // logout write complete handler + static void logoutWriteCompleteStatic( void *refcon, IOReturn status, IOFireWireNub *device, IOFWCommand *fwCmd ); + virtual void logoutWriteComplete( IOReturn status, IOFireWireNub *device, IOFWCommand *fwCmd ); + + // logout timeout handler + static void logoutTimeoutStatic( void *refcon, IOReturn status, IOFireWireBus *bus, IOFWBusCommand *fwCmd ); + virtual void logoutTimeout( IOReturn status, IOFireWireBus *bus, IOFWBusCommand *fwCmd ); + + virtual void completeLogout( IOReturn state, const void *buf = NULL, UInt32 len = 0); + + // fetch agent write complete handler + static void fetchAgentWriteCompleteStatic( void *refcon, IOReturn status, IOFireWireNub *device, IOFWCommand *fwCmd ); + virtual void fetchAgentWriteComplete( IOReturn status, IOFireWireNub *device, IOFWCommand *fwCmd ); + + // + // fetch agent + // + + bool fFetchAgentResetInProgress; + UInt32 fFetchAgentResetBuffer; + FWAddress fFetchAgentResetAddress; + IOFWWriteQuadCommand * fFetchAgentResetCommand; + void * fFetchAgentResetRefCon; + FWSBP2StatusCallback fFetchAgentResetCompletion; + + static IOReturn staticExecuteFetchAgentReset( OSObject *self, void *, void *, void *, void * ); + virtual IOReturn executeFetchAgentReset( void ); + static void fetchAgentResetCompleteStatic( void *refcon, IOReturn status, IOFireWireNub *device, IOFWCommand *fwCmd ); + virtual void fetchAgentResetComplete( IOReturn status, IOFireWireNub *device, IOFWCommand *fwCmd ); + + // + // doorbell + // + + bool fDoorbellInProgress; + bool fDoorbellRingAgain; + UInt32 fDoorbellBuffer; + FWAddress fDoorbellAddress; + IOFWWriteQuadCommand * fDoorbellCommand; + + static IOReturn staticExecuteDoorbell( OSObject *self, void *, void *, void *, void * ); + virtual IOReturn executeDoorbell( void ); + static void doorbellCompleteStatic( void *refcon, IOReturn status, IOFireWireNub *device, IOFWCommand *fwCmd ); + virtual void doorbellComplete( IOReturn status, IOFireWireNub *device, IOFWCommand *fwCmd ); + + // + // enable unsolicited satus + // + + bool fUnsolicitedStatusEnableInProgress; + UInt32 fUnsolicitedStatusEnableBuffer; + FWAddress fUnsolicitedStatusEnableAddress; + IOFWWriteQuadCommand * fUnsolicitedStatusEnableCommand; + + static IOReturn staticExecuteUnsolicitedStatusEnable( OSObject *self, void *, void *, void *, void * ); + virtual IOReturn executeUnsolicitedStatusEnable( void ); + static void unsolicitedStatusEnableCompleteStatic( void *refcon, IOReturn status, IOFireWireNub *device, IOFWCommand *fwCmd ); + virtual void unsolicitedStatusEnableComplete( IOReturn status, IOFireWireNub *device, IOFWCommand *fwCmd ); + + // + // busy timeout stuff + // + + bool fSetBusyTimeoutInProgress; + UInt32 fSetBusyTimeoutBuffer; + FWAddress fSetBusyTimeoutAddress; + IOFWWriteQuadCommand * fSetBusyTimeoutCommand; + + bool fInCriticalSection; + + UInt16 fLocalNodeID; + bool fFastStartSupported; + UInt32 fFastStartOffset; + UInt32 fFastStartMaxPayload; + + UInt32 fUserLoginGeneration; + bool fUserLoginGenerationSet; + + IOFWDelayCommand * fFetchAgentRetryTimerCommand; + bool fFetchAgentRetryTimerSet; + + virtual IOReturn executeSetBusyTimeout( void ); + static void setBusyTimeoutCompleteStatic( void *refcon, IOReturn status, IOFireWireNub *device, IOFWCommand *fwCmd ); + virtual void setBusyTimeoutComplete( IOReturn status, IOFireWireNub *device, IOFWCommand *fwCmd ); + +private: + // IOFireWireSBP2ORB friend class wrappers + OSMetaClassDeclareReservedUnused(IOFireWireSBP2Login, 0); + +protected: + virtual bool initORBWithLogin( IOFireWireSBP2ORB * orb, IOFireWireSBP2Login * login ); + virtual void setNextORBAddress( IOFireWireSBP2ORB * orb, FWAddress address ); + virtual void fetchAgentWriteComplete( IOFireWireSBP2ORB * orb, IOReturn status ); + virtual bool isORBTimerSet( IOFireWireSBP2ORB * orb ); + virtual void cancelORBTimer( IOFireWireSBP2ORB * orb ); + + // IOFireWireSBP2LUN friend class wrappers + virtual void removeLogin( void ); + virtual IOFireWireSBP2Target * getTarget( void ); + + UInt32 fARDMAMax; + bool fPhysicalAccessEnabled; + + bool fLoginStatusReceived; + FWSBP2StatusBlock fLoginStatusBlock; + UInt32 fLoginStatusBlockLen; + +private: + + OSMetaClassDeclareReservedUnused(IOFireWireSBP2Login, 1); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2Login, 2); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2Login, 3); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2Login, 4); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2Login, 5); + +public: + + ////////////////////////////// + + /*! + @function createORB + @abstract Creates a new IOFireWireSBP2ORB for this login. + @discussion Create a new IOFireWireSBP2ORB for this login. It can be configured + with it's accessors and executed with submitORB below. + @result Returns a pointer to the new ORB object. + */ + + virtual IOFireWireSBP2ORB * createORB( void ); + + /*! + @function submitORB + @abstract Submits the given orb + @discussion Starts execution of the given ORB. If the ORB is an immediate ORB it's + addresss is written to the fetch agent. If it is a non immediate orb its address + is appended to the last orb of the currently processing chain. The doorbell is not + rung automatically it must be run manually with the ringDoorbell command described below. + @param orb The orb to be executed. + @result Returns kIOReturnSuccess if the ORB has been started successfully. + */ + + virtual IOReturn submitORB( IOFireWireSBP2ORB * orb ); + + // set callbacks + + /*! + @function setStatusNotifyProc + @abstract Sets the callback to be called on normal command status. + @discussion The supplied callback is called when normal command status is recieved, when + a normal command times out, or when a normal command is aborted. + "notificationEvent" in the callback's params will indicate what happened. + It will be set to one of the following values: kFWSBP2NormalCommandReset, kFWSBP2NormalCommandStatus, + or kFWSBP2NormalCommandTimeout. If the event type is kFWSBP2NormalCommandTimeout and "len" is + non-zero then "message" contains the data written to the status block. + @param refCon refCon passed to callback. + @param callback address of callback method of type FWSBP2NotifyCallback. + */ + + virtual void setStatusNotifyProc( void * refCon, FWSBP2NotifyCallback callback ); + + /*! + @function getStatusNotifyProc + @abstract Returns the callback to be called on normal command status. + @discussion Returns the refCon and callback address of the status notify callback. + @param refCon output parameter returning the refCon to be passed to the callback. + @param callback output parameter returning the address of the callback. + */ + + virtual void getStatusNotifyProc( void ** refCon, FWSBP2NotifyCallback * callback ); + + /*! + @function setUnsolicitedStatusNotifyProc + @abstract Sets the callback to be called on normal command status. + @discussion The supplied callback is called when unsolicited status is recieved. + "notificationEvent" in the callback's params will indicate what happened. In this + case it will be set to kFWSBP2UnsolicitedStatus. If "len" is + non-zero then "message" contains the data written to the status block. Note: any buffers + returned by callbacks are only valid for the duration of the login and should not have + their contents modified. + @param refCon refCon passed to callback. + @param callback address of callback method of type FWSBP2NotifyCallback. + */ + + virtual void setUnsolicitedStatusNotifyProc( void * refCon, FWSBP2NotifyCallback callback ); + + /*! + @function getUnsolicitedStatusNotifyProc + @abstract Returns the callback to be called on unsolicited status. + @discussion Returns the refCon and callback address of the unsolicited status notify callback. + @param refCon output parameter returning the refCon to be passed to the callback. + @param callback output parameter returning the address of the callback. + */ + + virtual void getUnsolicitedStatusNotifyProc( void ** refCon, FWSBP2NotifyCallback * callback ); + + // command handling + + /*! + @function setLoginCompletion + @abstract Sets the callback to be called when a login attempt is complete. + @discussion The supplied callback is called when a login attempt has completed. "status" in the + callback's params should be checked to determine the success or failure of the login attempt. + If "statusBlock" is non-null then login status was written and it has been supplied here. If + the login attempt was successful then the login response will be supplied in the "loginResponse" + buffer. Note: all buffers supplied to callbacks are only valid for the duration of the callback. + Also, you are not to modify the contents of any supplied buffer. + @param refCon refCon passed to callback. + @param callback address of callback method of type FWSBP2LoginCallback. + */ + + virtual void setLoginCompletion( void * refCon, FWSBP2LoginCallback completion ); + + /*! + @function submitLogin + @abstract Attempts to login to the LUN. + @discussion This call begins the login process. The login object should be configured prior + to this call. If kIOReturnSuccess is returned from this call then the loginCompletion routine + will be called when the login completes (successfully or unsuccesfully). + @result Returns kIOReturnSuccess login has successlly begun. + */ + + virtual IOReturn submitLogin( void ); + + /*! + @function submitLogout + @abstract Attempts to logout of the LUN. + @discussion This call begins the logout process. If kIOReturnSuccess is returned from this call then + the logoutCompletion routine will be called when the logout completes (successfully or unsuccesfully). + @result Returns kIOReturnSuccess if logout has successfully begun. + */ + + virtual IOReturn submitLogout( void ); + + /*! + @function setLogoutCompletion + @abstract Sets the callback to be called when a logout attempt is complete. + @discussion The supplied callback is called when a logout attempt has completed. "status" in the + callback's params should be checked to determine the success or failure of the logout attempt. + If "statusBlock" is non-null then logout status was written and it has been supplied here. + Note: all buffers supplied to callbacks are only valid for the duration of the callback. + Also, you are not to modify the contents of any supplied buffer. + @param refCon refCon passed to callback. + @param callback address of callback method of type FWSBP2LogoutCallback. + */ + + virtual void setLogoutCompletion( void * refCon, FWSBP2LogoutCallback completion ); + + /*! + @function setFetchAgentWriteCompletion + @abstract Sets the callback to be called when the fetch agent write completes. + @discussion When an immediate orb is executed with submitORB, it's address is written to a + specific address on the device. This address is called the fetch agent. The device the + reads that orb from the Mac's memory and executes it. With this call you can register to + be called back when this write to the fetch agent completes. The SBP2 services guarantee + that the fetch agent write will be complete before status is reported for an ORB, so for + most drivers this notification is not required. + @param refCon refCon passed to callback. + @param callback address of callback method of type FWSBP2FetchAgentWriteCallback. + */ + + virtual void setFetchAgentWriteCompletion( void * refCon, FWSBP2FetchAgentWriteCallback completion ); + + /*! + @function setFetchAgentResetCompletion + @abstract Sets the callback to be called when a fetch agent reset completes. + @discussion The fetch agent state machine on the device can be reset by a write to a specific + register. The SBP2 services offer a utility method to reset the fetch agent. You can register + a callback routine here to be notified when this rest write completes. + @param refCon refCon passed to callback. + @param callback address of callback method of type FWSBP2FetchAgentWriteCallback. + */ + + virtual void setFetchAgentResetCompletion( void * refCon, FWSBP2StatusCallback completion ); + + /*! + @function submitFetchAgentReset + @abstract Resets the LUN's fetch agent. + @discussion The fetch agent state machine on the device can be reset by a write to a specific + register. This reset can be intiated by a call to this method. Notification of the completion + of this write can be had by registering a callback with the setFetchAgentResetCompletion method. + @result Returns kIOReturnSuccess if the reset started successfully. + */ + + virtual IOReturn submitFetchAgentReset( void ); + + /*! + @function ringDoorbell + @abstract Rings the doorbell on the LUN. + @discussion Non-immediate appends to the ORB chain may require the fetch agent state machine + to be notified of the new ORB's presence. This is accomplished by writing to the so called + doorbell register. This method begins one of those writes. + @result Returns kIOReturnSuccess if the ring started successfully. + */ + + virtual IOReturn ringDoorbell( void ); + + /*! + @function enableUnsolicitedStatus + @abstract Enables unsolicited status. + @discussion After unsolicited is sent the device will not send any additional unsolicited status + until a specific register is written. This serves as a sort of flow-control for unsolicited status. + After unsolicited status is recieved and processed drivers will want to reenable the delivery + of unsolicted status by a call to this method. + @result Returns kIOReturnSuccess if the status enable write started successfully. + */ + + virtual IOReturn enableUnsolicitedStatus( void ); + + // accessors + + /*! + @function getMaxCommandBlockSize + @abstract Returns the maximum command block size. + @discussion The device publishes an upper limit on the size of command block that it can + accept. That value can be accessed via this method. + @result Returns a UInt32 containing the maximum command block size. + */ + + virtual UInt32 getMaxCommandBlockSize( void ); + + /*! + @function getLoginID + @abstract Returns the current login ID. + @discussion When we successfully login to a device. The device gives us a unique login id. + This is used internally for reconnecting to the device after bus resets and for certain other + management ORBs. Most drivers are probably not interested in this value. + @result Returns a UInt32 containing the current login ID. + */ + + virtual UInt32 getLoginID( void ); + + /*! + @function setLoginFlags + @abstract Sets login configuration flags. + @discussion Configures the login behavior according to the provided flags. Currently two + flags are defined for this API. kFWSBP2ExclusiveLogin sets the exclusive login bit in the + login ORB. kFWSBP2DontSynchronizeMgmtAgent allows simultaneous logins or reconnects to LUNs + with a common management agent (ie LUNs in the same unit directory). + @param loginFlags the login configuration flags. + */ + + virtual void setLoginFlags( UInt32 loginFlags ); + + /*! + @function getLoginFlags + @abstract Returns the currently set login flags. + @discussion Returns the current state of the login flags. Currently there is only one + flag defined for this API. kFWSBP2ExclusiveLogin indicates that the exclusive login bit + should be set in the login ORB. + @result Returns a UInt32 containing the currently set login flags. + */ + + virtual UInt32 getLoginFlags( void ); + + /*! + @function setReconnectTime + @abstract Sets the desired reconnect duration. + @discussion The target and initiator arbitrate the duration of the reconnect timeout. Here + the initiator specifies its desired timeout time in 2^reconnectTime seconds. After a + successful login the device returns the actual timeout value it wishes to use. This value + may be less than the reconnect timeout that the intiator specified if this is all that the + device can support. + @param reconnectTime The desired reconnect timeout encoded as 2^reconnectTime seconds. + */ + + virtual void setReconnectTime( UInt32 reconnectTime ); + + /*! + @function getReconnectTime + @abstract Returns the currently set reconnect time. + @discussion Returns the currently desired initiator reconnect time encoded as 2^time seconds. + @result Returns a UInt32 containing the currently set reconnect time. + */ + + virtual UInt32 getReconnectTime( void ); + + /*! + @function setMaxPayloadSize + @abstract Sets the maximum data transfer length for a normal command ORB. + @discussion Sets the maximum data transfer length for a normal command ORB. This value is + the maximum for all ORBs sent to this LUN. This can be trimmed further on an ORB by ORB basis, + by a similar call in the IOFireWireSBP2ORB itself. + @param reconnectTime The desired maximum payload size in bytes. + */ + + virtual void setMaxPayloadSize( UInt32 maxPayloadSize ); + + /*! + @function getMaxPayloadSize + @abstract Returns the currently set maximum payload size. + @discussion Returns the currently global maximum payload size in bytes. + @result Returns a UInt32 containing the currently set maximum payload size. + */ + + virtual UInt32 getMaxPayloadSize( void ); + + /*! + @function setPassword + @abstract Sets the login password. + @discussion Sets the login password using a buffer and a length. An alternate version exists + that accepts an IOMemoryDescriptor. If the password length is 8 or less the password is copied + directly into the login orb. If the length is greater than 8 the buffer is referenced by address + in the login ORB. In this case the buffer is not copied and should remain allocated for the + duration of the login attempt. + @param buf a pointer to the password buffer. + @param len the length in bytes of the password buffer. + @result Returns kIOReturnSuccess on success. + */ + + virtual IOReturn setPassword( void * buf, UInt32 len ); + + /*! + @function setPassword + @abstract Sets the login password. + @discussion Sets the login password using an IOMemoryDescriptor. An alternate version exists + that accepts a buffer and a length. If the password length is 8 or less the password is copied + directly into the login orb. If the length is greater than 8 the buffer is referenced by address + in the login ORB. + @param memory an IOMemoryDescriptor referencing the password. + @result Returns kIOReturnSuccess on success. + */ + + virtual IOReturn setPassword( IOMemoryDescriptor * memory ); + + + /*! + @function setRefCon + @abstract Sets the login refCon. + @discussion Sets a user defined value on the login that can be retrieved later with the + method getRefCon. + @param refCon a user defined value. + */ + + virtual void setRefCon( void * refCon ); + + /*! + @function getRefCon + @abstract Returns the refCon set with setRefCon. + @discussion Returns the user defined value previously stored in the login with setRefCon. + @result Returns the previously stored user defined value. + */ + + virtual void * getRefCon( void ); + + /*! + @function setBusyTimeoutRegisterValue + @abstract Sets the value to be written to the BUSY_TIMEOUT register. + @discussion 1394-1995 defines a register known as the BUSY_TIMEOUT register. This register + controls the busy retry behavior of your device. The initial value for this register is + 0x00000000. Which means busied transactions will not be retried. Since most devices want + their transactions retired on busy acks, the SBP2 service automatically updates the + BUSY_TIMEOUT register with the value specified here whenever necessary. Most drivers should + set this value to 0x0000000f. + @param timeout desired value of the BUSY_TIMEOUT register. + */ + + virtual void setBusyTimeoutRegisterValue( UInt32 timeout ); + +protected: + + virtual void startORBTimer( IOFireWireSBP2ORB * orb ); + virtual void prepareORBForExecution( IOFireWireSBP2ORB * orb ); + + static IOReturn staticExecuteORB( OSObject *self, void * orb, void *, void *, void * ); + virtual IOReturn executeORB( IOFireWireSBP2ORB * orb ); + +public: + + /*! + @function release + @abstract Primary implementation of the release mechanism. + @discussion See OSObject.h for more information. When retainCount == when then call free(). + */ + + virtual void release() const; + + /*! + @function setLoginRetryCountAndDelayTime + @abstract Sets login retry behavior. + @discussion Sets login retry behavior. + @param retryCount number of times to retry logins + @param uSecs delay time in microseconds between login retries + */ + + virtual void setLoginRetryCountAndDelayTime( UInt32 retryCount, UInt32 uSecs ); + +protected: + virtual IOReturn initialExecuteLogin( void ); + virtual void startLoginRetryTimer( void ); + virtual void stopLoginRetryTimer( void ); + static void loginRetryTimeoutStatic( void *refcon, IOReturn status, + IOFireWireBus *bus, IOFWBusCommand *fwCmd ); + virtual void loginRetryTimeout( IOReturn status, IOFireWireBus *bus, IOFWBusCommand *fwCmd); + + virtual void startReconnectRetryTimer( void ); + virtual void stopReconnectRetryTimer( void ); + static void reconnectRetryTimeoutStatic( void *refcon, IOReturn status, IOFireWireBus *bus, IOFWBusCommand *fwCmd ); + virtual void reconnectRetryTimeout( IOReturn status, IOFireWireBus *bus, IOFWBusCommand *fwCmd ); + + virtual bool isORBAppended( IOFireWireSBP2ORB * orb ); + virtual void setORBIsAppended( IOFireWireSBP2ORB * orb, bool state ); + +public: + virtual void setAddressLoForLoginORBAndResponse( UInt32 addressLoORB, UInt32 addresLoResponse ); + + virtual void setLoginGeneration( UInt32 generation ); + virtual void clearLoginGeneration( void ); + +protected: + void startFetchAgentRetryTimer( UInt32 duration ); + void stopFetchAgentRetryTimer( void ); + static void fetchAgentRetryTimerStatic( void *refcon, IOReturn status, IOFireWireBus *bus, IOFWBusCommand *fwCmd ); + void fetchAgentRetryTimer( IOReturn status, IOFireWireBus *bus, IOFWBusCommand *fwCmd ); + + void terminateNotify( void ); + void processLoginWrite( void ); + +public: + + bool isPhysicalAccessEnabled( void ); + UInt32 getARDMMax( void ); + +private: + + OSMetaClassDeclareReservedUnused(IOFireWireSBP2Login, 6); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2Login, 7); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2Login, 8); + + }; + +#endif diff --git a/QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2ManagementORB.h b/QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2ManagementORB.h new file mode 100644 index 0000000..9455383 --- /dev/null +++ b/QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2ManagementORB.h @@ -0,0 +1,345 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/*! + @header IOFireWireSBP2ManagementORB + Contains the class definition for IOFireWireSBP2ManagementORB. +*/ + +#ifndef _IOKIT_IOFIREWIRESBP2MANAGEMENTORB_H +#define _IOKIT_IOFIREWIRESBP2MANAGEMENTORB_H + +#include +#include + +#include + +class IOFireWireSBP2LUN; +class IOFireWireSBP2ManagementORB; +class IOFireWireSBP2ORB; + +enum +{ + kFWSBP2QueryLogins = 1, + kFWSBP2AbortTask = 0xb, + kFWSBP2AbortTaskSet = 0xc, + kFWSBP2LogicalUnitReset = 0xe, + kFWSBP2TargetReset = 0xf +}; + +// Callback when management command completes asynchronously + +/*! + @typedef FWSBP2ManagementCallback + @param refCon Reference constant supplied when the notification was registered. + @param status Indicates success or failure of operation. + @param orb Indicates current orb status is for. +*/ + +typedef void (*FWSBP2ManagementCallback)(void * refCon, IOReturn status, IOFireWireSBP2ManagementORB * orb); + +/*! + @class IOFireWireSBP2ManagementORB + @abstract Supplies non login related management ORBs. Management ORBs can be executed independent + of a login, if necessary. Management ORBs are created using the IOFireWireSBP2LUN interface. +*/ + +class IOFireWireSBP2ManagementORB : public IOFWCommand +{ + OSDeclareDefaultStructors( IOFireWireSBP2ManagementORB ) + + friend class IOFireWireSBP2LUN; + friend class IOFireWireSBP2UserClient; + +protected: + + //////////////////////////////////////// + // rom keys + + enum + { + kUnitCharacteristicsKey = 0x3A, + kManagementAgentOffsetKey = 0x54 + }; + + //////////////////////////////////////// + // structs + + typedef struct + { + UInt32 orbOffsetHi; + UInt32 orbOffsetLo; + UInt32 reserved1[2]; + UInt16 options; + UInt16 loginID; + UInt32 reserved2; + UInt32 statusFIFOAddressHi; + UInt32 statusFIFOAddressLo; + } FWSBP2TaskManagementORB; + + typedef struct + { + UInt32 reserved1[2]; + UInt32 queryResponseAddressHi; + UInt32 queryResponseAddressLo; + UInt16 options; + UInt16 lun; + UInt16 reserved2; + UInt16 queryResponseLength; + UInt32 statusFIFOAddressHi; + UInt32 statusFIFOAddressLo; + } FWSBP2QueryLoginsORB; + + typedef struct + { + UInt8 details; + UInt8 sbpStatus; + UInt16 orbOffsetHi; + UInt32 orbOffsetLo; + UInt32 status[6]; + } FWSBP2StatusBlock; + +protected: + + //////////////////////////////////////// + // friend methods + + // IOFireWireSBP2LUN methods + virtual bool initWithLUN( IOFireWireSBP2LUN * lun, + void * refCon, + FWSBP2ManagementCallback completion ); + + // IOFireWireSBP2UserClient methods + virtual void setAsyncCallbackReference( void * asyncRef ); + virtual void getAsyncCallbackReference( void * asyncRef ); + +protected: + + // reserved for future use + struct ExpansionData + { + bool fInCriticalSection; + }; + ExpansionData * fExpansionData; + + IOFireWireSBP2LUN * fLUN; + IOFireWireUnit * fUnit; + + UInt32 fManagementOffset; + UInt32 fManagementTimeout; + UInt32 fFunction; + OSObject * fManageeCommand; + + // our orb + FWSBP2TaskManagementORB fManagementORB; + IOFWAddressSpace * fManagementORBAddressSpace; + FWAddress fManagementORBAddress; + + // command to write management agent + IOFWWriteCommand * fWriteCommand; + IOMemoryDescriptor * fWriteCommandMemory; + + // timeout + IOFWCommand * fTimeoutCommand; + bool fTimeoutTimerSet; + + // status block + FWSBP2StatusBlock fStatusBlock; + IOFWAddressSpace * fStatusBlockAddressSpace; + FWAddress fStatusBlockAddress; + + // response buffer + void * fResponseBuf; + UInt32 fResponseLen; + IOFWAddressSpace * fResponseAddressSpace; + FWAddress fResponseAddress; + + // competion routine + FWSBP2ManagementCallback fCompletionCallback; + void * fCompletionRefCon; + + // for user client + OSAsyncReference64 fCallbackAsyncRef; + + IOMemoryMap * fResponseMap; + + bool fCompleting; + + //////////////////////////////////////// + + // init / destroy + virtual IOReturn getUnitInformation( void ); + virtual IOReturn allocateResources( void ); + virtual void free( void ); + + // command execution + virtual IOReturn execute( void ); + virtual IOReturn complete( IOReturn state ); + + // write complete handler + static void writeCompleteStatic( void *refcon, + IOReturn status, + IOFireWireNub *device, + IOFWCommand *fwCmd ); + virtual void writeComplete( IOReturn status, + IOFireWireNub *device, + IOFWCommand *fwCmd ); + + // timeout handler + static void handleTimeoutStatic( void *refcon, + IOReturn status, + IOFireWireBus *bus, + IOFWBusCommand *fwCmd ); + virtual void handleTimeout( IOReturn status, IOFireWireBus *bus, IOFWBusCommand *fwCmd ); + + // status block write handler + static UInt32 statusBlockWriteStatic( void *refcon, + UInt16 nodeID, + IOFWSpeed &speed, + FWAddress addr, + UInt32 len, + const void *buf, + IOFWRequestRefCon lockRead ); + virtual UInt32 statusBlockWrite( UInt16 nodeID, + FWAddress addr, + UInt32 len, + const void *buf, + IOFWRequestRefCon lockRead ); + + // IOFireWireSBP2LUN friend class wrappers + virtual void clearAllTasksInSet( void ); + virtual void removeManagementORB( IOFireWireSBP2ManagementORB * orb ); + +public: + + //////////////////////////////////////// + // client methods + + /*! + @function setCommandFunction + @abstract Sets the function of the management ORB. + @discussion Sets the the function of the management ORB. Legal values are kFWSBP2QueryLogins, + kFWSBP2AbortTask, kFWSBP2AbortTaskSet, kFWSBP2LogicalUnitReset, and kFWSBP2TargetReset. + @param function a value indicating the desired management function. + @result Returns kIOReturnSuccess if function was a legal function. + */ + + virtual IOReturn setCommandFunction( UInt32 function ); + + /*! + @function getCommandFunction + @abstract Returns the current function of the management ORB. + @discussion Returns the function of the management ORB. This is the same value that was + set with setCommandFunction. + @result Returns the function of the management ORB. + */ + + virtual UInt32 getCommandFunction( void ); + + /*! + @function setManageeCommand + @abstract Sets the command to be managed by the management ORB. + @discussion All management functions except kFWSBP2QueryLogins require a reference to an ORB of + some sort. kFWSBP2AbortTaskSet, kFWSBP2LogicalUnitReset, and kFWSBP2TargetReset require a + reference to the login ORB. kFWSBP2AbortTask requires a reference to the ORB to be aborted. + This method allows you to set the ORB to be managed. + @param command a reference to an IOFireWireSBP2Login or an IOFireWireSBP2ORB. + */ + + virtual void setManageeCommand( OSObject * command ); + + /*! + @function getCommandFunction + @abstract Returns the current managee command of the management ORB. + @discussion Returns the current managee command of the management ORB. This is the same value that was + set with setManageeCommand. + @result Returns the current managee command of the management ORB. + */ + + virtual OSObject* getManageeCommand( void ); + + /*! + @function setResponseBuffer + @abstract Sets the response buffer for the management ORB. + @discussion Sets the response buffer for the management ORB. kFWSBP2QueryLogins returns + a response to its query and needs to write it somewhere. This routine allows you to + specify the location. + @param desc memory descriptor for buffer. + @result Returns kIOReturnSuccess on a success. + */ + + virtual IOReturn setResponseBuffer( IOMemoryDescriptor * desc ); + + /*! + @function setResponseBuffer + @abstract Sets the response buffer for the management ORB. + @discussion Sets the response buffer for the management ORB. kFWSBP2QueryLogins returns + a response to its query and needs to write it somewhere. This routine allows you to + specify the location. + @param buf backing store for buffer + @param len length of buffer. + @result Returns kIOReturnSuccess on a success. + */ + + virtual IOReturn setResponseBuffer( void * buf, UInt32 len ); + + /*! + @function getResponseBuffer + @abstract Returns the response buffer for the management ORB. + @discussion Returns the response buffer set in setResponseBuffer above + @param desc memory descriptor for buffer. + @param buf output parameter for backing store for buffer + @param len output parameter for length of buffer. + */ + + virtual void getResponseBuffer( void ** buf, UInt32 * len ); + + /*! + @function release + @abstract Primary implementation of the release mechanism. + @discussion See OSObject.h for more information. + @param when When retainCount == when then call free(). + */ + + virtual void release() const; + +protected: + + virtual void setORBToDummy( IOFireWireSBP2ORB * orb ); + + virtual void suspendedNotify(); + +private: + + OSMetaClassDeclareReservedUsed(IOFireWireSBP2ManagementORB, 0); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2ManagementORB, 1); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2ManagementORB, 2); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2ManagementORB, 3); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2ManagementORB, 4); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2ManagementORB, 5); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2ManagementORB, 6); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2ManagementORB, 7); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2ManagementORB, 8); + +}; + +#endif \ No newline at end of file diff --git a/QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2ORB.h b/QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2ORB.h new file mode 100644 index 0000000..5c11593 --- /dev/null +++ b/QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2ORB.h @@ -0,0 +1,547 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/*! + @header IOFireWireSBP2ORB + Contains the class definition for IOFireWireSBP2ORB. +*/ + +#ifndef _IOKIT_IOFIREWIRESBP2ORB_H +#define _IOKIT_IOFIREWIRESBP2ORB_H + +#include + +#include +#include +#include + +enum +{ + kFWSBP2ConstraintForceDoubleBuffer = (1 << 0) +}; + +// login option flags +enum +{ + kFWSBP2CommandCompleteNotify = (1 << 0), + kFWSBP2CommandTransferDataFromTarget = (1 << 1), + kFWSBP2CommandImmediate = (1 << 2), + + kFWSBP2CommandNormalORB = (1 << 5), + kFWSBP2CommandReservedORB = (1 << 6), + kFWSBP2CommandVendorORB = (1 << 7), + kFWSBP2CommandDummyORB = (1 << 8), + kFWSBP2CommandCheckGeneration = (1 << 9), + + kFWSBP2CommandFixedSize = (1 << 10), + kFWSBP2CommandVirtualORBs = (1 << 11) // handy for debugging +}; + +enum +{ + kFWSBP2MaxPageClusterSize = 0xf000 +}; + +class IOFireWireSBP2ORB; +class IOFireWireSBP2LUN; +class IOFireWireSBP2Login; + +/*! + @class IOFireWireSBP2ORB + @abstract Represents an SBP2 normal command ORB. Supplies the APIs for configuring normal + command ORBs. This includes setting the command block and writing the page tables for I/O. + The ORBs are executed using the submitORB method in IOFireWireSBP2Login. +*/ + +class IOFireWireSBP2ORB : public IOCommand +{ + OSDeclareDefaultStructors( IOFireWireSBP2ORB ) + + friend class IOFireWireSBP2Login; + friend class IOFireWireSBP2ManagementORB; + +protected: + + typedef struct + { + UInt32 nextORBAddressHi; + UInt32 nextORBAddressLo; + UInt32 dataDescriptorHi; + UInt32 dataDescriptorLo; + UInt16 options; + UInt16 dataSize; + UInt32 commandBlock[1]; // will be variable sized + } FWSBP2ORB; + + typedef struct + { + UInt16 segmentLength; + UInt16 segmentBaseAddressHi; + UInt32 segmentBaseAddressLo; + } FWSBP2PTE; + +private: + + OSMetaClassDeclareReservedUnused(IOFireWireSBP2ORB, 0); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2ORB, 1); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2ORB, 2); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2ORB, 3); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2ORB, 4); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2ORB, 5); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2ORB, 6); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2ORB, 7); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2ORB, 8); + +protected: + + virtual void deallocateBufferAddressSpace( void ); + virtual IOReturn allocateTimer( void ); + virtual void deallocateTimer( void ); + + /*! + @function deallocatePageTable + @abstract Frees up memory allocated for the page table. + @discussion Frees all memory associated with the page table. Undoes what allocatePageTable does. + Calling allocatePageTable again will automatically deallocate the existing page table before + allocating a new one, so this method is not used in most cases. + */ + + virtual void deallocatePageTable( void ); + +protected: + + // IOFireWireSBP2Login methods + virtual bool initWithLogin( IOFireWireSBP2Login * login ); + virtual void setNextORBAddress( FWAddress address ); + +public: + + /*! + @function allocatePageTable + @abstract Allocates memory for the page table. + @discussion Page table allocation is handle automatically by the ORB, except if the + kFWSBP2CommandFixedSize flags is set. In this case we will fail to write a page table if we + need more page table space than we have already. This method is exposed so these drivers + can preallocate as much page table as they need. This is useful if your driver is part of + the paging path and cannot allow allocations to occur. + @param entryCount number of entries of page table to be allocated. + */ + + virtual IOReturn allocatePageTable( UInt32 entryCount ); + +protected: + + virtual bool isTimerSet( void ); + virtual void cancelTimer( void ); + +protected: + + // reserved for future use + struct ExpansionData { }; + ExpansionData *reserved; + + IOFireWireSBP2Login * fLogin; + IOFireWireSBP2LUN * fLUN; + IOFireWireUnit * fUnit; + IOFireWireController * fControl; + IODMACommand * fDMACommand; + void * fUnused2; + + UInt32 fCommandFlags; + UInt32 fMaxPayloadSize; + UInt32 fTimeoutDuration; + UInt32 fGeneration; + UInt64 fRefCon; + + // + // orb + // + + IOMemoryDescriptor * fORBDescriptor; + FWSBP2ORB * fORBBuffer; + + FWAddress fORBPseudoAddress; + IOFWAddressSpace * fORBPseudoAddressSpace; + + IOFWAddressSpace * fORBPhysicalAddressSpace; + FWAddress fORBPhysicalAddress; + + // + // page table + // + + UInt32 fPageTableSize; + IOBufferMemoryDescriptor * fPageTableDescriptor; + + IOFWAddressSpace * fPageTablePhysicalAddressSpace; + FWAddress fPageTablePhysicalAddress; + UInt32 fPageTablePhysicalLength; + + IOFWAddressSpace * fPageTablePseudoAddressSpace; + FWAddress fPageTablePseudoAddress; + + // + // buffers + // + + IOFWAddressSpace * fBufferAddressSpace; + bool fBufferAddressSpaceAllocated; + IOMemoryDescriptor * fBufferDescriptor; + + // + // timer + // + + IOFWDelayCommand * fTimeoutCommand; + bool fTimeoutTimerSet; + + bool fInProgress; + bool fIsAppended; + + UInt32 fFetchAgentWriteRetries; + UInt32 fPTECount; + UInt32 fFetchAgentWriteRetryInterval; + + UInt32 fConstraintOptions; + + virtual IOReturn allocateResources( void ); + virtual void free( void ); + + // orb timeout handler + static void orbTimeoutStatic( void *refcon, IOReturn status, IOFireWireBus *bus, IOFWBusCommand *fwCmd ); + virtual void orbTimeout( IOReturn status, IOFireWireBus *bus, IOFWBusCommand *fwCmd ); + + // login friend class wrappers + virtual IOFireWireUnit * getFireWireUnit( void ); + virtual IOFireWireSBP2LUN * getFireWireLUN( void ); + virtual void deallocateORB( void ); + virtual IOReturn allocateORB( UInt32 orbSize ); + virtual IOReturn removeORB( IOFireWireSBP2ORB * orb ); + virtual void prepareORBForExecution( void ); + virtual void startTimer( void ); + virtual void sendTimeoutNotification( IOFireWireSBP2ORB * orb ); + +public: + + /*! + @function release + @abstract Primary implementation of the release mechanism. + @discussion See OSObject.h for more information. + @param when When retainCount == when then call free(). + */ + + virtual void release() const; + + /*! + @function getLogin + @abstract Gets the login associated with this ORB. + @discussion Returns the IOFireWireSBP2Login object associated with this ORB. + @result Returns a pointer to an IOFireWireSBP2Login. + */ + + virtual IOFireWireSBP2Login * getLogin( void ); + + /*! + @function setCommandBuffersAsRanges + @abstract Creates a page table from a list of ranges. + @discussion Creates a page table with the given parameters. Any addresses mapped by this method + must remain valid until setCommandBuffers is called again or releaseCommandBuffers is called. + The SBP2 services do not release references to the command buffers just because the command + has completed. + @param ranges An array of ranges representing the data to be transfered. + @param withCount The number of ranges in the ranges array. + @param withDirection An IODirection indicating the direction of data transfer. + @param withTask The task that these adressses reside in. + @param offset Offset in bytes into data to begin writing table at. + @param length Number of bytes of data to map from offset. + @result Returns KIOReturnSuccess if the page table was written successfully. + */ + + virtual IOReturn setCommandBuffersAsRanges( IOVirtualRange * ranges, + UInt32 withCount, + IODirection withDirection, + task_t withTask, + UInt32 offset = 0, + UInt32 length = 0 ); + /*! + @function setCommandBuffersAsRanges + @abstract Creates a page table from a list of ranges. + @discussion Creates a page table with the given parameters. Any addresses mapped by this method + must remain valid until setCommandBuffers is called again or releaseCommandBuffers is called. + The SBP2 services do not release references to the command buffers just because the command + has completed. + @param memoryDescriptor IOMemoryDescriptor describe ranges to be written to a page table. + @param offset Offset in bytes into data to begin writing table at. + @param length Number of bytes of data to map from offset. + @result Returns KIOReturnSuccess if the page table was written successfully. + */ + + virtual IOReturn setCommandBuffers( IOMemoryDescriptor * memoryDescriptor, UInt32 offset = 0, + UInt32 length = 0 ); + + + /*! + @function releaseCommandBuffers + @abstract Releases SBP2's reference to the command buffers. + @discussion When you create a page table with one of the variants of setCommandBuffers. + SBP2 holds on to a reference to the buffers until this method is called. This means that + if a command completed and you manipulated the memory descriptor or released the buffers + without calling this method you could leave FW in an inconsistent state. + @result Returns KIOReturnSuccess if the page table was cleared successfully. + */ + + virtual IOReturn releaseCommandBuffers( void ); + + /*! + @function setCommandBlock + @abstract Sets the command block portion of the ORB. + @discussion Copys the data provided in the buffer to the command block portion of the ORB. + @param buffer Pointer to buffer to copy command block from. + @param length Number of bytes of data to copy. + @result Returns KIOReturnSuccess if the command block was updated successfully. + */ + + virtual IOReturn setCommandBlock( void * buffer, UInt32 length ); + + /*! + @function setCommandBlock + @abstract Sets the command block portion of the ORB. + @discussion Copys the data provided in the buffer to the command block portion of the ORB. + @param memory IOMemoryDescriptor representing the command block buffer. + @result Returns KIOReturnSuccess if the command block was updated successfully. + */ + + virtual IOReturn setCommandBlock( IOMemoryDescriptor * memory ); + + /*! + @function getCommandBufferDescriptor + @abstract Returns the memory descriptor representing the command buffer. + @discussion Returns the IOMemoryDescriptor for the data mapped by setCommandBuffer variants. + Works for setCommandBuffersAsRanges too. + @result Returns memory descriptor representing mapped data buffers. + */ + + virtual IOMemoryDescriptor * getCommandBufferDescriptor( void ); + + // accessors + + /*! + @function setCommandFlags + @abstract Sets configuration flags for the ORB. + @discussion Sets the configuration flags for the ORB. These can be any of the following: +

kFWSBP2CommandCompleteNotify - Set the notify bit as specified in SBP2 standard. Set to receive completion/timeout notification on this ORB. You almost always want to set this.

+

kFWSBP2CommandTransferDataFromTarget - Transfer direction as specified in SBP2 standard. Set if data is to be written by the device into the host's memory.

+

kFWSBP2CommandImmediate - Immediate Append. ORB address will be written to fetch agent and not chained. It is only legal to have one immediate ORB in progress at a time.

+

kFWSBP2CommandNormalORB - ORB format 0 - Format specified by SBP2 standard. Set this for most ORBs.

+

kFWSBP2CommandReservedORB - ORB format 1 - Format reserved by SBP2 standard for future standardization.

+

kFWSBP2CommandVendorORB - ORB format 2 - Format specified by SBP2 standard for vendor dependent ORBs.

+

kFWSBP2CommandDummyORB - ORB format 3 - Format specified by SBP2 standard for dummy ORBs.

+

kFWSBP2CommandCheckGeneration - If set upon submitORB, the ORB will only be appended if generation set with setCommandGeneration() matches the current generation. Pretty much all SBP2 drivers need sophisticated logic to track login state, so this is generally not used.

+

kFWSBP2CommandFixedSize - Do not allocate more memory for page table if needed. If there is not enough space in the currently allocated page table, the setCommandBuffers call will fail. This is important to set if your device is the backing store, as we don't want to cause memory allocations on the paging path.

+

kFWSBP2CommandVirtualORBs - Normally ORBs are backed by physical address spaces. Setting this flag makes this ORB backed by a pseudo address space. This can make ORBs easier to see in a bus trace. Virtual ORBs will have an address in the form of ffcX.XXXX.0000.0000. Pseudo address space backed ORBs are slower, so you won't want to set for deployment builds.

+ @param flags The flags to be set. + */ + + virtual void setCommandFlags( UInt32 flags ); + + /*! + @function getCommandFlags + @abstract Sets configuration flags for the ORB. + @discussion Returns the current configuration flags set on this ORB. + @result Return The current ORB flags. + */ + + virtual UInt32 getCommandFlags( void ); + + /*! + @function setMaxPayloadSize + @abstract Sets max payload size for the ORB. + @discussion This sets the maximum payload size for this ORB only. This size is clipped by + the global max payload size set in the login object. + @param maxPayloadSize The maximum payload size in bytes. + */ + + virtual void setMaxPayloadSize( UInt32 maxPayloadSize ); + + /*! + @function getMaxPayloadSize + @abstract Gets max payload size for the ORB. + @discussion This gets the maximum payload size for this ORB only. + @result Returns the maximum payload size in bytes. + */ + + virtual UInt32 getMaxPayloadSize( void ); + + /*! + @function setCommandTimeout + @abstract Sets the timeout of the ORB. + @discussion This sets the timeout for the ORB in milliseconds. Note that ORBs without timeouts + can be "lost." You will obviously not recieve timeout notification for timeouts of zero. But + perhaps less obviously you will not recieve orb reset notification, which is really a sort of + accelerated timeout notification for bus reset situations. + @param timeout The timeout duration in milliseconds. + */ + + virtual void setCommandTimeout( UInt32 timeout ); + + /*! + @function getCommandTimeout + @abstract Gets the timeout of the ORB. + @discussion This method gets the timeout for this ORB in milliseconds. + @result Returns the timeout for the orb in milliseconds. + */ + + virtual UInt32 getCommandTimeout( void ); + + + /*! + @function setCommandGeneration + @abstract Sets the command generation. + @discussion This sets the bus generation this ORB should be appended in. It is only meaningful + when combined with the kFWSBP2CommandCheckGeneration flags above. + @param gen The bus generation for command execution. + */ + + virtual void setCommandGeneration( UInt32 gen ); + + /*! + @function getCommandGeneration + @abstract Gets the command generation. + @discussion This gets the bus generation this ORB should be appended in. + @result Returns the bus generation for command execution. + */ + + virtual UInt32 getCommandGeneration( void ); + + /*! + @function setRefCon + @abstract Sets the ORB refCon. + @discussion Sets a user defined value on the ORB that can be retrieved later with the + method getRefCon. + @param refCon a user defined value. + */ + + virtual void setRefCon( void * refCon ); + + /*! + @function getRefCon + @abstract Returns the refCon set with setRefCon. + @discussion Returns the user defined value previously stored in the ORB with setRefCon. + @result Returns the previously stored user defined value. + */ + + virtual void * getRefCon( void ); + +protected: + + virtual void setToDummy( void ); + +public: + /*! + @function getORBAddress + @abstract Returns the FireWire address of this ORB. + @discussion Returns the FireWire bus address of this ORB. This is not the same as the Macintosh + address for the IOFireWireSBP2ORB. + @result Returns the FireWire address of this ORB. + */ + + virtual void getORBAddress( FWAddress * address ); + +protected: + + virtual bool isAppended( void ); + virtual void setIsAppended( bool state ); + virtual UInt32 getFetchAgentWriteRetries( void ); + virtual void setFetchAgentWriteRetries( UInt32 retries ); + + virtual void prepareFastStartPacket( IOBufferMemoryDescriptor * descriptor ); + + UInt32 getFetchAgentWriteRetryInterval( void ); + void setFetchAgentWriteRetryInterval( UInt32 interval ); + + IOReturn completeBufferAddressSpace( void ); + IOReturn prepareBufferAddressSpace( IOMemoryDescriptor * memoryDescriptor ); + +public: + + /*! + @function setBufferConstraints + @abstract Configures page table generation parameters + @discussion Sets the maximums size of any page table segment and the required alignemnt. Double buffering + may be used to satisfy these constraints. The only supported option is kFWSBP2ConstraintForceDoubleBuffer which + forces a page aligned double buffering of the entire descriptor. + @result May return an error if there is a problem allocating the underlying resources or if buffers are currently attached. + */ + + IOReturn setBufferConstraints( UInt64 maxSegmentSize, UInt32 alignment, UInt32 options = 0); + + + /*! + @function setCommandBuffersAsRanges64 + @abstract Creates a page table from a list of 64 bit ranges. + @discussion Creates a page table with the given parameters. Any addresses mapped by this method + must remain valid until setCommandBuffers is called again or releaseCommandBuffers is called. + The SBP2 services do not release references to the command buffers just because the command + has completed. This is a 64 bit compatible version of setCommandBuffersAsRanges. + @param ranges An array of ranges representing the data to be transfered. + @param withCount The number of ranges in the ranges array. + @param withDirection An IODirection indicating the direction of data transfer. + @param withTask The task that these adressses reside in. + @param offset Offset in bytes into data to begin writing table at. + @param length Number of bytes of data to map from offset. + @result Returns KIOReturnSuccess if the page table was written successfully. + */ + + IOReturn setCommandBuffersAsRanges64( IOAddressRange * ranges, + uint64_t withCount, + IODirection withDirection, + task_t withTask, + uint64_t offset = 0, + uint64_t length = 0); + + /*! + @function setRefCon64 + @abstract Sets the ORB refCon as a 64 bit value. + @discussion Sets a user defined value on the ORB that can be retrieved later with the + method getRefCon. + @param refCon a user defined value. + */ + + virtual void setRefCon64( UInt64 refCon ); + + /*! + @function getRefCon64 + @abstract Returns the 64 bit refCon set with setRefCon64. + @discussion Returns the user defined value previously stored in the ORB with setRefCon. + @result Returns the previously stored user defined value. + */ + + virtual UInt64 getRefCon64( void ); + +protected: + + UInt32 calculateTransferSizeLog( bool * clipping ); + + +}; + +#endif diff --git a/QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2Target.h b/QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2Target.h new file mode 100644 index 0000000..4288ce9 --- /dev/null +++ b/QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2Target.h @@ -0,0 +1,224 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/*! + @header IOFireWireSBP2Target + Contains the class definition for IOFireWireSBP2Target. +*/ + +#ifndef _IOKIT_IOFIREWIRESBP2TARGET_H +#define _IOKIT_IOFIREWIRESBP2TARGET_H + +#include +#include + +enum +{ + kIOFWSBP2FailsOnAckBusy = (1 << 0), + kIOFWSBP2FailsOnBusResetsDuringIO = (1 << 1), + kIOFWSBP2DontUsePTPacketLimit = (1 << 2) +}; + +/*! + @class IOFireWireSBP2Target + @abstract Serves as bridge between IOFireWireUnit and IOFireWireLUN. + @discussion Matches against IOFireWireUnits supporting the SBP2 protocol. Creates IOFireWireSBP2LUN nubs for matching. Most drivers will match against an IOFireWireSBP2LUN, but matching against an IOFireWireSBP2Target is also supported. This can be useful in cases where a single driver wishes to + control all LUNs on a device. Support for this technique is minimal, however, and the driver will be + required to discover it's LUNs through the registry. +*/ + +class IOFireWireSBP2Target : public IOService +{ + OSDeclareDefaultStructors(IOFireWireSBP2Target); + +protected: + + ///////////////////////////////////////// + // rom keys + + enum + { + kCmdSpecIDKey = 0x38, + kCmdSetKey = 0x39, + kSoftwareRevKey = 0x3b, + kFirmwareRevKey = 0x3c, + kLUNKey = 0x14, + kLUNDirectoryKey = 0xd4, + kManagementAgentOffsetKey = 0x54, + kUnitCharacteristicsKey = 0x3A, + kRevisionKey = 0x21, + kFastStartKey = 0x3E + }; + + typedef struct + { + UInt32 cmdSpecID; + UInt32 cmdSet; + UInt32 vendorID; + UInt32 softwareRev; + UInt32 firmwareRev; + UInt32 lun; + UInt32 devType; + UInt32 unitCharacteristics; + UInt32 managementOffset; + UInt32 revision; + bool fastStartSupported; + UInt32 fastStart; + } LUNInfo; + + // reserved for future use + struct ExpansionData + { + bool fStarted; + OSArray * fPendingMgtAgentCommands ; + UInt32 fNumberPendingMgtAgentOrbs; + UInt32 fNumLUNs; + }; + ExpansionData * fExpansionData; + + ///////////////////////////////////////// + // private fields + + bool fOpenFromTarget; + UInt32 fOpenFromLUNCount; + IOFireWireUnit * fProviderUnit; + UInt32 fFlags; + + IOFireWireController * fControl; + + UInt32 fIOCriticalSectionCount; + + ///////////////////////////////////////// + // private internals + + virtual void free( void ); + virtual IOReturn message( UInt32 type, + IOService * provider, + void * argument = 0); + + virtual void scanForLUNs( void ); + IOReturn createLUN( LUNInfo * info ); + +public: + + ///////////////////////////////////////// + // public methods + + /*! @function handleOpen + @abstract Overrideable method to control the open / close behaviour of an IOService. + @discussion See IOService for discussion. + @param forClient Designates the client of the provider requesting the open. + @param options Options for the open, may be interpreted by the implementor of handleOpen. + @result Return true if the open was successful, false otherwise. */ + + virtual bool handleOpen( IOService * forClient, IOOptionBits options, void * arg ); + + /*! + @function handleClose + @abstract Overrideable method to control the open / close behaviour of an IOService. + @discussion See IOService for discussion. + @param forClient Designates the client of the provider requesting the close. + @param options Options for the close, may be interpreted by the implementor of handleOpen. + */ + + virtual void handleClose( IOService * forClient, IOOptionBits options ); + + /*! + @function handleIsOpen + @abstract Overrideable method to control the open / close behaviour of an IOService. + @discussion See IOService for discussion. + @param forClient If non-zero, isOpen returns the open state for that client. If zero is passed, isOpen returns the open state for all clients. + @result Returns true if the specific, or any, client has the IOService open. + */ + + virtual bool handleIsOpen( const IOService * forClient ) const; + + /*! + @function start + @abstract During an IOService instantiation, the start method is called when the IOService has been selected to run on the provider. + @discussion See IOService for discussion. + @result Return true if the start was successful, false otherwise (which will cause the instance to be detached and usually freed). + */ + + virtual bool start( IOService *provider ); + + /*! + @function stop + @abstract During an IOService termination, the stop method is called in its clients before they are detached & it is destroyed. + @discussion See IOService for discussion. + */ + + virtual void stop( IOService *provider ); + + /*! + @function getFireWireUnit + @abstract Returns an IOFireWireUnit object. + @discussion An IOFireWireUnit is the provider of an IOFireWireSBP2Target. In order to use the base FireWire services + you will need a reference to the unit. This method returns that reference. + @result Returns a pointer to an IOFireWireUnit. + */ + + virtual IOFireWireUnit * getFireWireUnit( void ); + + /*! + @function matchPropertyTable + @abstract Implements SBP2 specific matching. + @discussion See IOService for discussion. + @param table The dictionary of properties to be matched against. + @result Returns false if the family considers the matching dictionary does not match in properties it understands, true otherwise. + */ + + virtual bool matchPropertyTable( OSDictionary * table ); + + virtual void setTargetFlags( UInt32 flags ); + virtual UInt32 getTargetFlags( void ); + +protected: + virtual void configurePhysicalFilter( void ); + +public: + virtual void clearTargetFlags( UInt32 flags ); + virtual IOReturn beginIOCriticalSection( void ); + virtual void endIOCriticalSection( void ); + + virtual bool finalize( IOOptionBits options ); + + IOReturn synchMgmtAgentAccess( IOFWCommand * mgmtOrbCommand ); + void completeMgmtAgentAccess( ); + void clearMgmtAgentAccess( ); + void cancelMgmtAgentAccess( IOFWCommand * mgmtOrbCommand ); + +protected: + + OSMetaClassDeclareReservedUnused(IOFireWireSBP2Target, 0); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2Target, 1); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2Target, 2); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2Target, 3); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2Target, 4); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2Target, 5); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2Target, 6); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2Target, 7); + OSMetaClassDeclareReservedUnused(IOFireWireSBP2Target, 8); + +}; + +#endif diff --git a/QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2UserClient.h b/QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2UserClient.h new file mode 100644 index 0000000..a469558 --- /dev/null +++ b/QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2UserClient.h @@ -0,0 +1,188 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOFIREWIRESBP2USERCLIENT_H +#define _IOKIT_IOFIREWIRESBP2USERCLIENT_H + +#include + +#define FIREWIREPRIVATE +#include +#undef FIREWIREPRIVATE + +#include + +#include +#include + +class IOFireWireSBP2UserClient : public IOUserClient +{ + OSDeclareDefaultStructors(IOFireWireSBP2UserClient) + +protected: + + bool fOpened; + bool fStarted; + IOFireWireSBP2Login * fLogin; + task_t fTask; + + IOFireWireSBP2LUN * fProviderLUN; + OSAsyncReference64 fMessageCallbackAsyncRef; + OSAsyncReference64 fLoginCallbackAsyncRef; + OSAsyncReference64 fLogoutCallbackAsyncRef; + OSAsyncReference64 fUnsolicitedStatusNotifyAsyncRef; + OSAsyncReference64 fStatusNotifyAsyncRef; + OSAsyncReference64 fFetchAgentResetAsyncRef; + OSAsyncReference64 fFetchAgentWriteAsyncRef; + + IOFWUserObjectExporter * fExporter; + + IOFireWireLib::UserObjectHandle fSessionRef; + + IOLock * fUserClientLock; + + virtual IOReturn externalMethod( uint32_t selector, + IOExternalMethodArguments * args, + IOExternalMethodDispatch * dispatch, + OSObject * target, + void * reference ); +public: + + virtual bool initWithTask( task_t owningTask, void * securityToken, UInt32 type, OSDictionary * properties ); + virtual void free (); + + virtual bool start( IOService * provider ); + + virtual IOReturn clientClose( void ); + virtual IOReturn clientDied( void ); + + // IOFireWireSBP2ManagementORB friend class wrappers + virtual void flushAllManagementORBs( void ); + + ///////////////////////////////////////////////// + // IOFireWireSBP2LUN + + IOReturn open( IOExternalMethodArguments * arguments ); + IOReturn openWithSessionRef( IOExternalMethodArguments * arguments ); + IOReturn getSessionRef( IOExternalMethodArguments * arguments ); + IOReturn close( IOExternalMethodArguments * arguments ); + + // callbacks + IOReturn setMessageCallback( IOExternalMethodArguments * arguments ); + virtual IOReturn message( UInt32 type, IOService * provider, void * arg ); + + ///////////////////////////////////////////////// + // IOFireWireSBP2Login + + IOReturn setLoginCallback( IOExternalMethodArguments * arguments ); + IOReturn setLogoutCallback( IOExternalMethodArguments * arguments ); + IOReturn setUnsolicitedStatusNotify( IOExternalMethodArguments * arguments ); + IOReturn setStatusNotify( IOExternalMethodArguments * arguments ); + IOReturn createLogin( IOExternalMethodArguments * arguments ); + IOReturn releaseLogin( IOExternalMethodArguments * arguments ); + IOReturn submitLogin( IOExternalMethodArguments * arguments ); + IOReturn submitLogout( IOExternalMethodArguments * arguments ); + IOReturn setLoginFlags( IOExternalMethodArguments * arguments ); + IOReturn getMaxCommandBlockSize( IOExternalMethodArguments * arguments ); + IOReturn getLoginID( IOExternalMethodArguments * arguments ); + IOReturn setReconnectTime( IOExternalMethodArguments * arguments ); + IOReturn setMaxPayloadSize( IOExternalMethodArguments * arguments ); + + IOReturn submitFetchAgentReset( IOExternalMethodArguments * arguments ); + IOReturn setFetchAgentWriteCompletion( IOExternalMethodArguments * arguments ); + IOReturn ringDoorbell( IOExternalMethodArguments * arguments ); + IOReturn enableUnsolicitedStatus( IOExternalMethodArguments * arguments ); + IOReturn setBusyTimeoutRegisterValue( IOExternalMethodArguments * arguments ); + IOReturn setPassword( IOExternalMethodArguments * arguments ); + + // callbacks + + static void staticLoginCallback( void * refCon, FWSBP2LoginCompleteParamsPtr params ); + virtual void loginCallback( FWSBP2LoginCompleteParamsPtr params ); + + static void staticLogoutCallback( void * refCon, FWSBP2LogoutCompleteParamsPtr params ); + virtual void logoutCallback( FWSBP2LogoutCompleteParamsPtr params ); + + static void staticStatusNotify( void * refCon, FWSBP2NotifyParams * params ); + virtual void statusNotify( FWSBP2NotifyParams * params ); + + static void staticUnsolicitedNotify( void * refCon, FWSBP2NotifyParams * params ); + virtual void unsolicitedNotify( FWSBP2NotifyParams * params ); + + static void staticFetchAgentWriteComplete( void * refCon, IOReturn status, IOFireWireSBP2ORB * orb ); + virtual void fetchAgentWriteComplete( IOReturn status, IOFireWireSBP2ORB * orb ); + + static void staticFetchAgentResetComplete( void * refCon, IOReturn status ); + virtual void fetchAgentResetComplete( IOReturn status ); + + ///////////////////////////////////////////////// + // IOFireWireSBP2ORB + + IOReturn createORB( IOExternalMethodArguments * arguments ); + IOReturn releaseORB( IOExternalMethodArguments * arguments ); + IOReturn submitORB( IOExternalMethodArguments * arguments ); + IOReturn setCommandFlags( IOExternalMethodArguments * arguments ); + IOReturn setORBRefCon( IOExternalMethodArguments * arguments ); + IOReturn setMaxORBPayloadSize( IOExternalMethodArguments * arguments ); + IOReturn setCommandTimeout( IOExternalMethodArguments * arguments ); + IOReturn setCommandGeneration( IOExternalMethodArguments * arguments ); + IOReturn setToDummy( IOExternalMethodArguments * arguments ); + IOReturn setCommandBuffersAsRanges( IOExternalMethodArguments * arguments ); + IOReturn releaseCommandBuffers( IOExternalMethodArguments * arguments ); + IOReturn setCommandBlock( IOExternalMethodArguments * arguments ); + + // LSI workaround + IOReturn LSIWorkaroundSetCommandBuffersAsRanges( IOExternalMethodArguments * arguments ); + IOReturn LSIWorkaroundSyncBuffersForOutput( IOExternalMethodArguments * arguments ); + IOReturn LSIWorkaroundSyncBuffersForInput( IOExternalMethodArguments * arguments ); + + ///////////////////////////////////////////////// + // IOFireWireSBP2MgmtORB + + IOReturn createMgmtORB( IOExternalMethodArguments * arguments ); + IOReturn releaseMgmtORB( IOExternalMethodArguments * arguments ); + IOReturn setMgmtORBCallback( IOExternalMethodArguments * arguments ); + IOReturn submitMgmtORB( IOExternalMethodArguments * arguments ); + IOReturn setMgmtORBCommandFunction( IOExternalMethodArguments * arguments ); + IOReturn setMgmtORBManageeORB( IOExternalMethodArguments * arguments ); + IOReturn setMgmtORBManageeLogin( IOExternalMethodArguments * arguments ); + IOReturn setMgmtORBResponseBuffer( IOExternalMethodArguments * arguments ); + + // callbacks + static void staticMgmtORBCallback( void * refCon, IOReturn status, IOFireWireSBP2ManagementORB * orb ); + virtual void mgmtORBCallback( IOReturn status, IOFireWireSBP2ManagementORB * orb ); + + // IOFireWireSBP2MgmtORB friend class wrappers + virtual void setMgmtORBAsyncCallbackReference( IOFireWireSBP2ManagementORB * orb, void * asyncRef ); + virtual void getMgmtORBAsyncCallbackReference( IOFireWireSBP2ManagementORB * orb, void * asyncRef ); + + uint32_t checkScalarInputCount; + uint32_t checkStructureInputSize; + uint32_t checkScalarOutputCount; + uint32_t checkStructureOutputSize; + + IOReturn checkArguments( IOExternalMethodArguments * args, uint32_t scalarInCount, uint32_t structInCount, + uint32_t scalarOutCount, uint32_t structOutCount ); + +}; + +#endif diff --git a/QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2UserClientCommon.h b/QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2UserClientCommon.h new file mode 100644 index 0000000..cb114ba --- /dev/null +++ b/QualcommWireless/include/IOKit/sbp2/IOFireWireSBP2UserClientCommon.h @@ -0,0 +1,79 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOFIREWIRESBP2USERCLIENTCOMMON_H_ +#define _IOKIT_IOFIREWIRESBP2USERCLIENTCOMMON_H_ + +#define kIOFireWireSBP2LibConnection 12 + +enum IOFWSBP2UserClientCommandCodes { + kIOFWSBP2UserClientOpen, // kIOUCScalarIScalarO 0,0 + kIOFWSBP2UserClientClose, // kIOUCScalarIScalarO 0,0 + kIOFWSBP2UserClientCreateLogin, // kIOUCScalarIScalarO 0,1 + kIOFWSBP2UserClientReleaseLogin, // kIOUCScalarIScalarO 1,0 + kIOFWSBP2UserClientSubmitLogin, // kIOUCScalarIScalarO 1,0 + kIOFWSBP2UserClientSubmitLogout, // kIOUCScalarIScalarO 1,0 + kIOFWSBP2UserClientSetLoginFlags, // kIOUCScalarIScalarO 2,0 + kIOFWSBP2UserClientGetMaxCommandBlockSize, // kIOUCScalarIScalarO 1,1 + kIOFWSBP2UserClientGetLoginID, // kIOUCScalarIScalarO 1,1 + kIOFWSBP2UserClientSetReconnectTime, // kIOUCScalarIScalarO 1,0 + kIOFWSBP2UserClientSetMaxPayloadSize, // kIOUCScalarIScalarO 1,0 + kIOFWSBP2UserClientCreateORB, // kIOUCScalarIScalarO 0,1 + kIOFWSBP2UserClientReleaseORB, // kIOUCScalarIScalarO 1,0 + kIOFWSBP2UserClientSubmitORB, // kIOUCScalarIScalarO 1,0 + kIOFWSBP2UserClientSetCommandFlags, // kIOUCScalarIScalarO 2,0 + kIOFWSBP2UserClientSetMaxORBPayloadSize, // kIOUCScalarIScalarO 2,0 + kIOFWSBP2UserClientSetCommandTimeout, // kIOUCScalarIScalarO 2,0 + kIOFWSBP2UserClientSetCommandGeneration, // kIOUCScalarIScalarO 2,0 + kIOFWSBP2UserClientSetToDummy, // kIOUCScalarIScalarO 1,0 + kIOFWSBP2UserClientSetCommandBuffersAsRanges, // kIOUCScalarIScalarO 6,0 + kIOFWSBP2UserClientReleaseCommandBuffers, // kIOUCScalarIScalarO 1,0 + kIOFWSBP2UserClientSetCommandBlock, // kIOUCScalarIScalarO 3,0 + kIOFWSBP2UserClientCreateMgmtORB, // kIOUCScalarIScalarO 0,1 + kIOFWSBP2UserClientReleaseMgmtORB, // kIOUCScalarIScalarO 1,0 + kIOFWSBP2UserClientSubmitMgmtORB, // kIOUCScalarIScalarO 1,0 + kIOFWSBP2UserClientMgmtORBSetCommandFunction, // kIOUCScalarIScalarO 2,0 + kIOFWSBP2UserClientMgmtORBSetManageeORB, // kIOUCScalarIScalarO 2,0 + kIOFWSBP2UserClientMgmtORBSetManageeLogin, // kIOUCScalarIScalarO 2,0 + kIOFWSBP2UserClientMgmtORBSetResponseBuffer, // kIOUCScalarIScalarO 3,0 + kIOFWSBP2UserClientLSIWorkaroundSetCommandBuffersAsRanges, // kIOUCScalarIScalarO 6,0 + kIOFWSBP2UserClientMgmtORBLSIWorkaroundSyncBuffersForOutput, // kIOUCScalarIScalarO 1,0 + kIOFWSBP2UserClientMgmtORBLSIWorkaroundSyncBuffersForInput, // kIOUCScalarIScalarO 1,0 + kIOFWSBP2UserClientOpenWithSessionRef, // kIOUCScalarIScalarO 1,0 + kIOFWSBP2UserClientGetSessionRef, // kIOUCScalarIScalarO 0,1 + kIOFWSBP2UserClientRingDoorbell, // kIOUCScalarIScalarO 1, 0 + kIOFWSBP2UserClientEnableUnsolicitedStatus, // kIOUCScalarIScalarO 1, 0 + kIOFWSBP2UserClientSetBusyTimeoutRegisterValue, // kIOUCScalarIScalarO 2, 0 + kIOFWSBP2UserClientSetORBRefCon, // kIOUCScalarIScalarO 2, 0 + kIOFWSBP2UserClientSetPassword, // kIOUCScalarIScalarO 3, 0 + kIOFWSBP2UserClientSetMessageCallback, // kIOUCScalarIScalarO 2, 0 + kIOFWSBP2UserClientSetLoginCallback, // kIOUCScalarIScalarO 2, 0 + kIOFWSBP2UserClientSetLogoutCallback, // kIOUCScalarIScalarO 2, 0 + kIOFWSBP2UserClientSetUnsolicitedStatusNotify, // kIOUCScalarIScalarO 2, 0 + kIOFWSBP2UserClientSetStatusNotify, // kIOUCScalarIScalarO 2, 0 + kIOFWSBP2UserClientSetMgmtORBCallback, // kIOUCScalarIScalarO 3, 0 + kIOFWSBP2UserClientSubmitFetchAgentReset, // kIOUCScalarIScalarO 3, 0 + kIOFWSBP2UserClientSetFetchAgentWriteCompletion, // kIOUCScalarIScalaO 2, 0 + kIOFWSBP2UserClientNumCommands +}; + +#endif \ No newline at end of file diff --git a/QualcommWireless/include/IOKit/sbp2/IOFireWireSerialBusProtocolTransport.h b/QualcommWireless/include/IOKit/sbp2/IOFireWireSerialBusProtocolTransport.h new file mode 100644 index 0000000..4e0276e --- /dev/null +++ b/QualcommWireless/include/IOKit/sbp2/IOFireWireSerialBusProtocolTransport.h @@ -0,0 +1,449 @@ +/* + * Copyright (c) 1998-2009 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +/*! + @header IOFireWireSerialBusProtocolTransport + Contains the class definition for IOFireWireSerialBusProtocolTransport. +*/ + + +#ifndef _IOKIT_IO_FIREWIRE_SERIAL_BUS_PROTOCOL_TRANSPORT_H_ +#define _IOKIT_IO_FIREWIRE_SERIAL_BUS_PROTOCOL_TRANSPORT_H_ + + +#include +#include +#include +#include +#include +#include +#include + +#include + +/*! + @class IOFireWireSerialBusProtocolTransport + @abstract SCSI Protocol Driver Family for FireWire SBP2 Devices. + @discussion IOFireWireSerialBusProtocolTransport contains all the bus specific support for FireWire + SBP2 compliant devices. To add vendor specific features or workarounds you will sub-class the appropriate + methods of this family. +*/ + +class IOFireWireSerialBusProtocolTransport : public IOSCSIProtocolServices +{ + + OSDeclareDefaultStructors ( IOFireWireSerialBusProtocolTransport ) + +private: + + IOFireWireUnit * fUnit; + IOFireWireSBP2LUN * fSBPTarget; + IOFireWireSBP2Login * fLogin; + IOFireWireSBP2ORB * fORB; + IOFireWireSBP2ManagementORB * fLUNResetORB; + + // /!\ WARNING! NOT USED left behind for legacy binary reasons + __unused IOSimpleLock * fQueueLock; + + UInt32 fLoginRetryCount; + bool fDeferRegisterService; + bool fNeedLogin; + + // /!\ WARNING! NOT USED left behind for legacy binary reasons + __unused bool fPhysicallyConnected; + + static void + StatusNotifyStatic ( void * refCon, FWSBP2NotifyParamsPtr params ); + + static void + UnsolicitedStatusNotifyStatic ( void * refCon, + FWSBP2NotifyParamsPtr params ); + + static void + LunResetCompleteStatic ( void * refCon, + IOReturn status, + IOFireWireSBP2ManagementORB * orb ); + + static void + FetchAgentResetCompleteStatic ( void * refcon, + IOReturn status ); + + static IOReturn + ConnectToDeviceStatic ( OSObject * refCon, void *, void *, void *, void * ); + + virtual void + FetchAgentResetComplete ( IOReturn status ); + + static void LoginCompletionStatic ( void * refCon, FWSBP2LoginCompleteParams * params ); + + static void + LogoutCompletionStatic ( void * refCon, FWSBP2LogoutCompleteParams * params ); + + /*! + @function CoalesceSenseData + @abstract CoalesceSenseData convert a SBP-2 status block into a SPC-2 sense block. + @discussion CoalesceSenseData pulls the appropriate bits out of the SBP2 sense block + as defined in SBP-2 Annex B section B.2 and dynamically builds a sense data block as + defined in SPC-2 section 7.23.2. + */ + + SCSITaskStatus + CoalesceSenseData ( FWSBP2StatusBlock * sourceData, + UInt8 quadletCount, + SCSI_Sense_Data * targetData ); + + virtual void ConnectToDevice ( void ); + + virtual void DisconnectFromDevice ( void ); + + virtual bool IsDeviceCPUInDiskMode ( void ); + +protected: + + /*! + @function AllocateResources + @abstract Allocate Resources. + @discussion Called from start method to allocate needed resources. + */ + + virtual IOReturn AllocateResources ( void ); + + /*! + @function DeallocateResources + @abstract Deallocate Resources. + @discussion Called from cleanUp method to deallocate resources. + */ + + virtual void DeallocateResources ( void ); + + enum SBP2LoginState + { + kFirstTimeLoggingInState, + kLogginSucceededState, + kLogginFailedState + }; + + /*! + @typedef SBP2ClientOrbData + @param orb IOFireWireSBP2ORB for request. + @param scsiTask SCSITaskIdentifier of request. + @param serviceResponse SCSIServiceResponse of request. + @param taskStatus SCSITaskStatus of request. + @discussion This structure is stuffed into the refcon so we can associate which + IOFireWireSBP2ORB and SCSITaskIdentifier is completing. + */ + + typedef struct { + IOFireWireSBP2ORB * orb; + SCSITaskIdentifier scsiTask; + SCSIServiceResponse serviceResponse; + SCSITaskStatus taskStatus; + IOBufferMemoryDescriptor * quadletAlignedBuffer; + } SBP2ClientOrbData; + + static const UInt32 kDefaultBusyTimeoutValue = 0x0000000F; + static const UInt64 kMaxFireWireLUN = 0xFFFF; + static const UInt32 kMaxFireWirePayload = 4096; + static const UInt32 kMaxLoginRetryCount = 8; + static const UInt32 kMaxReconnectCount = 128; + static const UInt32 kCSRModelInfoKey = 0x17; + + UInt32 fReconnectCount; + bool fLoggedIn; + + // binary compatibility instance variable expansion + struct ExpansionData + { + IOCommandPool * fCommandPool; + IOCommandPool * fSubmitQueue; + SBP2LoginState fLoginState; + bool fLUNResetPathFlag; + int fLUNResetCount; + bool fAlwaysSetSenseData; + bool fAutonomousSpinDownWorkAround; + }; + + ExpansionData * reserved; + + bool fObjectIsOpen; + + /*! + @function CommandORBAccessor + @abstract accessor function for fORB. + @discussion xxx. + */ + + IOFireWireSBP2ORB * CommandORBAccessor ( void ); + + /*! + @function SBP2LoginAccessor + @abstract accessor function for fLogin. + @discussion xxx. + */ + + IOFireWireSBP2Login * SBP2LoginAccessor ( void ); + + virtual IOReturn + message ( UInt32 type, IOService * provider, void * argument = 0 ) APPLE_KEXT_OVERRIDE; + + /*! + @function SendSCSICommand + @abstract Prepare and send a SCSI command to the device. + @discussion The incoming SCSITaskIdentifier gets turned into a IOFireWireSBP2ORB + and is submitted to the SBP2 layer. See IOSCSIProtocolServices.h for more details + regarding SendSCSICommand. Also see IOFireWireSBP2Lib.h for details regarding the + IOFireWireSBP2ORB structure and the submitORB method. + @result If the command was sent to the device and is pending completion, the + subclass should return true and return back the kSCSIServiceResponse_Request_In_Process response. + If the command completes immediately with an error, the subclass will return true + and return back the appropriate status. If the subclass is currently processing all the + commands it can, the subclass will return false and the command will be resent next time + CommandCompleted is called. + */ + + virtual bool + SendSCSICommand ( SCSITaskIdentifier request, + SCSIServiceResponse * serviceResponse, + SCSITaskStatus * taskStatus ) APPLE_KEXT_OVERRIDE; + + /*! + @function SetCommandBuffers + @abstract Method to set orb's buffers. + @discussion This method was added so that subclasses can override and massage buffers as + needed. The default simply calls setCommandBuffers. See IOFireWireSBP2Lib.h for details + regarding the setCommandBuffers method. + @result xxx. + */ + + virtual IOReturn + SetCommandBuffers ( IOFireWireSBP2ORB * orb, SCSITaskIdentifier request ); + + /*! + @function CompleteSCSITask + @abstract This qualifies and sets appropriate data then calls CommandCompleted. + @discussion See IOSCSIProtocolServices.h for more details + regarding CommandCompleted. + */ + + virtual void + CompleteSCSITask ( IOFireWireSBP2ORB * orb ); + + /*! + @function AbortSCSICommand + @abstract This method is intended to abort an in progress SCSI Task. + @discussion Currently not implemented in super class. This is a stub method for adding + the abort command in the near future. + @result See SCSITask.h for SCSIServiceResponse codes. + */ + + virtual SCSIServiceResponse + AbortSCSICommand ( SCSITaskIdentifier request ) APPLE_KEXT_OVERRIDE; + + /*! + @function StatusNotify + @abstract This is our handler for status. + @discussion See IOFireWireSBP2Lib.h for details regarding the FWSBP2NotifyParams + structure that is passed in to the completion.. + */ + + virtual void + StatusNotify ( FWSBP2NotifyParams * params ); + + /*! + @function SetValidAutoSenseData + @abstract Set the auto sense data that was returned for a given SCSI Task. + @discussion SetValidAutoSenseData is called to qualify sense data that is copied to the + client via the SetAutoSenseData method. See IOSCSIProtocolServices.h for more details + regarding SetAutoSenseData. + */ + + void + SetValidAutoSenseData ( SBP2ClientOrbData * clientData, + FWSBP2StatusBlock * statusBlock, + SCSI_Sense_Data * targetData ); + + /*! + @function UnsolicitedStatusNotify + @abstract This is our handler for unsolicited status. + @discussion After we have parsed and handled the unsolicited status we call + enableUnsolicitedStatus. See IOFireWireSBP2Lib.h for details regarding the + enableUnsolicitedStatus method. + */ + + virtual void + UnsolicitedStatusNotify ( FWSBP2NotifyParamsPtr params ); + + /*! + @function LoginCompletion + @abstract Completion routine for login complete. + @discussion See IOFireWireSBP2Lib.h for details regarding the FWSBP2LogoutCompleteParams + structure that is passed in to the completion. + */ + + virtual void + LoginCompletion ( FWSBP2LoginCompleteParams * params ); + + /*! + @function LogoutCompletion + @abstract Completion routine for logout complete. + @discussion See IOFireWireSBP2Lib.h for details regarding the FWSBP2LogoutCompleteParams + structure that is passed in to the completion. + */ + + virtual void + LogoutCompletion ( FWSBP2LogoutCompleteParams * params ); + + /*! + @function IsProtocolServiceSupported + @abstract Determine is specified feature is supported by the protocol layer. + @discussion If the service has a value that must be returned, it will be returned in the + serviceValue output parameter. See IOSCSIProtocolServices.h for more details regarding + IsProtocolServiceSupported. + @result Will return true if the specified feature is supported by the protocol layer. + */ + + virtual bool + IsProtocolServiceSupported ( SCSIProtocolFeature feature, void * serviceValue ) APPLE_KEXT_OVERRIDE; + + /*! + @function HandleProtocolServiceFeature + @abstract Handle specified feature supported by the protocol layer. + @discussion See IOSCSIProtocolServices.h for more details regarding HandleProtocolServiceFeature. + @result Will return true if the specified feature is supported by the protocol layer. + */ + + virtual bool + HandleProtocolServiceFeature ( SCSIProtocolFeature feature, void * serviceValue ) APPLE_KEXT_OVERRIDE; + + /*! + @function LunResetComplete + @abstract Callback to submit Fetch Agent Reset. + @discussion See IOFireWireSBP2Lib.h for details regarding the submitFetchAgentReset + method. + */ + + virtual void + LunResetComplete ( IOReturn status, IOFireWireSBP2ManagementORB * orb ); + +public: + + /*! + @function init + @abstract See IOService for discussion. + @discussion Setup and prime class into known state. + */ + + bool init ( OSDictionary * propTable ) APPLE_KEXT_OVERRIDE; + + /*! + @function start + @discussion See IOService for discussion. + @result Return true if the start was successful, false otherwise ( which will + cause the instance to be detached and usually freed ). + */ + + virtual bool start ( IOService * provider ) APPLE_KEXT_OVERRIDE; + + /*! + @function cleanUp + @abstract cleanUp is called to tear down IOFireWireSerialBusProtocolTransport. + @discussion cleanUp is called when we receive a kIOFWMessageServiceIsRequestingClose + message or if we fail our initialization. + */ + + virtual void cleanUp ( void ); + + /*! + @function finalize + @abstract See IOService for discussion. + @result Returns true. + */ + + virtual bool finalize ( IOOptionBits options ) APPLE_KEXT_OVERRIDE; + + /*! + @function free + @discussion See IOService for discussion. + @result none. + */ + + virtual void free ( void ) APPLE_KEXT_OVERRIDE; + +protected: + + virtual IOReturn login ( void ); + OSMetaClassDeclareReservedUsed ( IOFireWireSerialBusProtocolTransport, 1 ); + + virtual IOReturn submitLogin ( void ); + OSMetaClassDeclareReservedUsed ( IOFireWireSerialBusProtocolTransport, 2 ); + + virtual void loginLost ( void ); + OSMetaClassDeclareReservedUsed ( IOFireWireSerialBusProtocolTransport, 3 ); + + void loginSuspended ( void ); + OSMetaClassDeclareReservedUsed ( IOFireWireSerialBusProtocolTransport, 4 ); + + virtual void loginResumed ( void ); + OSMetaClassDeclareReservedUsed ( IOFireWireSerialBusProtocolTransport, 5 ); + + static IOReturn CriticalOrbSubmissionStatic ( + OSObject * refCon, + void * val1, + void * val2, + void * val3, + void * val4 ); + + /*! + @function CriticalOrbSubmission + @abstract xxx. + @discussion xxx. + @result none. + */ + + void + CriticalOrbSubmission ( + IOFireWireSBP2ORB * orb, + SCSITaskIdentifier request ); + + virtual void submitOrbFromQueue ( void ); + OSMetaClassDeclareReservedUsed ( IOFireWireSerialBusProtocolTransport, 6 ); + +private: + + // binary compatibility reserved method space + + OSMetaClassDeclareReservedUnused ( IOFireWireSerialBusProtocolTransport, 7 ); + OSMetaClassDeclareReservedUnused ( IOFireWireSerialBusProtocolTransport, 8 ); + OSMetaClassDeclareReservedUnused ( IOFireWireSerialBusProtocolTransport, 9 ); + OSMetaClassDeclareReservedUnused ( IOFireWireSerialBusProtocolTransport, 10 ); + OSMetaClassDeclareReservedUnused ( IOFireWireSerialBusProtocolTransport, 11 ); + OSMetaClassDeclareReservedUnused ( IOFireWireSerialBusProtocolTransport, 12 ); + OSMetaClassDeclareReservedUnused ( IOFireWireSerialBusProtocolTransport, 13 ); + OSMetaClassDeclareReservedUnused ( IOFireWireSerialBusProtocolTransport, 14 ); + OSMetaClassDeclareReservedUnused ( IOFireWireSerialBusProtocolTransport, 15 ); + OSMetaClassDeclareReservedUnused ( IOFireWireSerialBusProtocolTransport, 16 ); + +}; + +#endif /* _IOKIT_IO_FIREWIRE_SERIAL_BUS_PROTOCOL_TRANSPORT_H_ */ diff --git a/QualcommWireless/include/IOKit/scsi/IOBDServices.h b/QualcommWireless/include/IOKit/scsi/IOBDServices.h new file mode 100644 index 0000000..55a6e31 --- /dev/null +++ b/QualcommWireless/include/IOKit/scsi/IOBDServices.h @@ -0,0 +1,240 @@ +/* + * Copyright (c) 2006-2009 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#ifndef _IOKIT_IO_BD_SERVICES_H_ +#define _IOKIT_IO_BD_SERVICES_H_ + +#if defined(KERNEL) && defined(__cplusplus) + + +//----------------------------------------------------------------------------- +// Includes +//----------------------------------------------------------------------------- + +// IOKit includes +#include + +// Generic IOKit storage related headers +#include +#include + +// SCSI Architecture Model Family includes +#include + +class IOMemoryDescriptor; + +//----------------------------------------------------------------------------- +// Class Declaration +//----------------------------------------------------------------------------- + +class IOBDServices : public IOBDBlockStorageDevice +{ + + OSDeclareDefaultStructors ( IOBDServices ) + +protected: + + OSSet * fClients; + IOSCSIPeripheralDeviceType05 * fProvider; + + virtual void free ( void ) APPLE_KEXT_OVERRIDE; + + // Reserve space for future expansion. + struct IOBDServicesExpansionData { }; + IOBDServicesExpansionData * fIOBDServicesReserved; + +public: + + static void AsyncReadWriteComplete ( void * clientData, + IOReturn status, + UInt64 actualByteCount ); + + // Deprecated + virtual IOReturn doAsyncReadWrite ( IOMemoryDescriptor * buffer, + UInt32 block, + UInt32 nblks, + IOStorageCompletion completion ); + + virtual IOReturn doAsyncReadWrite ( IOMemoryDescriptor * buffer, + UInt64 block, + UInt64 nblks, + IOStorageCompletion completion ); + + virtual IOReturn doAsyncReadWrite ( IOMemoryDescriptor * buffer, + UInt64 block, + UInt64 nblks, + IOStorageAttributes * attributes, + IOStorageCompletion * completion ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn doEjectMedia ( void ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn doFormatMedia ( UInt64 byteCapacity ) APPLE_KEXT_OVERRIDE; + + virtual UInt32 doGetFormatCapacities ( UInt64 * capacities, + UInt32 capacitiesMaxCount ) const APPLE_KEXT_OVERRIDE; + virtual IOReturn doSynchronizeCache ( void ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn getWriteCacheState ( bool * enabled ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn setWriteCacheState ( bool enabled ) APPLE_KEXT_OVERRIDE; + + virtual char * getVendorString ( void ) APPLE_KEXT_OVERRIDE; + + virtual char * getProductString ( void ) APPLE_KEXT_OVERRIDE; + + virtual char * getRevisionString ( void ) APPLE_KEXT_OVERRIDE; + + virtual char * getAdditionalDeviceInfoString ( void ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportBlockSize ( UInt64 * blockSize ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportEjectability ( bool * isEjectable ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportMediaState ( bool * mediaPresent, bool * changed ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportMaxValidBlock ( UInt64 * maxBlock ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportRemovability ( bool * isRemovable ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportWriteProtection ( bool * isWriteProtected ) APPLE_KEXT_OVERRIDE; + + /* CD Specific */ + virtual IOReturn doAsyncReadCD ( IOMemoryDescriptor * buffer, + UInt32 block, + UInt32 nblks, + CDSectorArea sectorArea, + CDSectorType sectorType, + IOStorageCompletion completion ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn readISRC ( UInt8 track, CDISRC isrc ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn readMCN ( CDMCN mcn) APPLE_KEXT_OVERRIDE; + + virtual IOReturn readTOC ( IOMemoryDescriptor * buffer ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn audioPause ( bool pause ); + + virtual IOReturn audioPlay ( CDMSF timeStart, CDMSF timeStop ); + + virtual IOReturn audioScan ( CDMSF timeStart, bool reverse ); + + virtual IOReturn audioStop ( void ); + + virtual IOReturn getAudioStatus ( CDAudioStatus * status ); + + virtual IOReturn getAudioVolume ( UInt8 * leftVolume, UInt8 * rightVolume ); + + virtual IOReturn setAudioVolume ( UInt8 leftVolume, UInt8 rightVolume ); + + virtual IOReturn getSpeed ( UInt16 * kilobytesPerSecond ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn setSpeed ( UInt16 kilobytesPerSecond ) APPLE_KEXT_OVERRIDE; + + /* DVD Specific */ + virtual UInt32 getMediaType ( void ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportKey ( IOMemoryDescriptor * buffer, + const DVDKeyClass keyClass, + const UInt32 lba, + const UInt8 agid, + const DVDKeyFormat keyFormat ) APPLE_KEXT_OVERRIDE __attribute__ ((deprecated)); + + virtual IOReturn reportKey ( IOMemoryDescriptor * buffer, + const DVDKeyClass keyClass, + const UInt32 lba, + const UInt8 blockCount, + const UInt8 agid, + const DVDKeyFormat keyFormat ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn sendKey ( IOMemoryDescriptor * buffer, + const DVDKeyClass keyClass, + const UInt8 agid, + const DVDKeyFormat keyFormat ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn readDVDStructure ( IOMemoryDescriptor * buffer, + const UInt8 structureFormat, + const UInt32 logicalBlockAddress, + const UInt8 layer, + const UInt8 agid ) APPLE_KEXT_OVERRIDE; + + /* BD Specific */ + virtual IOReturn readDiscStructure ( IOMemoryDescriptor * buffer, + UInt8 structureFormat, + UInt32 logicalBlockAddress, + UInt8 layer, + UInt8 agid, + UInt8 mediaType ) APPLE_KEXT_OVERRIDE; + + /* 10.6.0 */ + virtual IOReturn requestIdle ( void ) APPLE_KEXT_OVERRIDE; + + /* System Specific */ + virtual IOReturn message ( UInt32 type, IOService * provider, void * argument ) APPLE_KEXT_OVERRIDE; + virtual IOReturn setProperties ( OSObject * properties ) APPLE_KEXT_OVERRIDE; + + /* User Client Specific */ + virtual bool start ( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual bool open ( IOService * client, IOOptionBits options, IOStorageAccess access ); + + virtual bool handleOpen ( IOService * client, IOOptionBits options, void * access ) APPLE_KEXT_OVERRIDE; + virtual void handleClose ( IOService * client, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + virtual bool handleIsOpen ( const IOService * client ) const APPLE_KEXT_OVERRIDE; + + /* Added with 10.1.3 */ + virtual IOReturn readTOC ( IOMemoryDescriptor * buffer, + CDTOCFormat format, + UInt8 msf, + UInt8 trackSessionNumber, + UInt16 * actualByteCount ) APPLE_KEXT_OVERRIDE; + + /* Added with 10.1.3 */ + virtual IOReturn readDiscInfo ( IOMemoryDescriptor * buffer, + UInt16 * actualByteCount ) APPLE_KEXT_OVERRIDE; + + /* Added with 10.1.3 */ + virtual IOReturn readTrackInfo ( IOMemoryDescriptor * buffer, + UInt32 address, + CDTrackInfoAddressType addressType, + UInt16 * actualByteCount ) APPLE_KEXT_OVERRIDE; + + /* Added with 10.5 */ + virtual IOReturn splitTrack ( UInt32 address ) APPLE_KEXT_OVERRIDE; + +private: + + // Space reserved for future expansion. + OSMetaClassDeclareReservedUnused ( IOBDServices, 1 ); + OSMetaClassDeclareReservedUnused ( IOBDServices, 2 ); + OSMetaClassDeclareReservedUnused ( IOBDServices, 3 ); + OSMetaClassDeclareReservedUnused ( IOBDServices, 4 ); + OSMetaClassDeclareReservedUnused ( IOBDServices, 5 ); + OSMetaClassDeclareReservedUnused ( IOBDServices, 6 ); + OSMetaClassDeclareReservedUnused ( IOBDServices, 7 ); + OSMetaClassDeclareReservedUnused ( IOBDServices, 8 ); + +}; + +#endif /* defined(KERNEL) && defined(__cplusplus) */ + +#endif /* _IOKIT_IO_BD_SERVICES_H_ */ diff --git a/QualcommWireless/include/IOKit/scsi/IOBlockStorageServices.h b/QualcommWireless/include/IOKit/scsi/IOBlockStorageServices.h new file mode 100644 index 0000000..4f756d4 --- /dev/null +++ b/QualcommWireless/include/IOKit/scsi/IOBlockStorageServices.h @@ -0,0 +1,164 @@ +/* + * Copyright (c) 1998-2009 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#ifndef _IOKIT_IO_BLOCK_STORAGE_SERVICES_H_ +#define _IOKIT_IO_BLOCK_STORAGE_SERVICES_H_ + +#if defined(KERNEL) && defined(__cplusplus) + + +//----------------------------------------------------------------------------- +// Includes +//----------------------------------------------------------------------------- + +// IOKit includes +#include + +// Generic IOKit storage related headers +#include + +// SCSI Architecture Model Family includes +#include + + +//----------------------------------------------------------------------------- +// Class Declaration +//----------------------------------------------------------------------------- + +class IOBlockStorageServices : public IOBlockStorageDevice +{ + + OSDeclareDefaultStructors ( IOBlockStorageServices ) + +private: + + bool fMediaChanged; /* DEPRECATED */ + bool fMediaPresent; + +protected: + + IOSCSIBlockCommandsDevice * fProvider; + + UInt64 fMaxReadBlocks; + UInt64 fMaxWriteBlocks; + + virtual bool attach ( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void detach ( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void free ( void ) APPLE_KEXT_OVERRIDE; + virtual IOReturn newUserClient ( + task_t owningTask, + void * securityID, + UInt32 type, + OSDictionary * properties, + IOUserClient ** handler ) APPLE_KEXT_OVERRIDE; + + // Reserve space for future expansion. + struct IOBlockStorageServicesExpansionData { }; + IOBlockStorageServicesExpansionData * fIOBlockStorageServicesReserved; + +public: + + virtual IOReturn message ( UInt32 type, IOService * provider, void * argument ) APPLE_KEXT_OVERRIDE; + + static void AsyncReadWriteComplete ( void * clientData, + IOReturn status, + UInt64 actualByteCount ); + + // Deprecated + virtual IOReturn doAsyncReadWrite ( IOMemoryDescriptor * buffer, + UInt32 block, + UInt32 nblks, + IOStorageCompletion completion ); + + virtual IOReturn doAsyncReadWrite ( IOMemoryDescriptor * buffer, + UInt64 block, + UInt64 nblks, + IOStorageCompletion completion ); + + virtual IOReturn doAsyncReadWrite ( IOMemoryDescriptor * buffer, + UInt64 block, + UInt64 nblks, + IOStorageAttributes * attributes, + IOStorageCompletion * completion ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn doEjectMedia ( void ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn doFormatMedia ( UInt64 byteCapacity ) APPLE_KEXT_OVERRIDE; + + virtual UInt32 doGetFormatCapacities ( UInt64 * capacities, + UInt32 capacitiesMaxCount ) const APPLE_KEXT_OVERRIDE; + virtual IOReturn doSynchronizeCache ( void ) APPLE_KEXT_OVERRIDE; + + virtual char * getVendorString ( void ) APPLE_KEXT_OVERRIDE; + + virtual char * getProductString ( void ) APPLE_KEXT_OVERRIDE; + + virtual char * getRevisionString ( void ) APPLE_KEXT_OVERRIDE; + + virtual char * getAdditionalDeviceInfoString ( void ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportBlockSize ( UInt64 * blockSize ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportEjectability ( bool * isEjectable ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportMediaState ( bool * mediaPresent, bool * changed ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportMaxValidBlock ( UInt64 * maxBlock ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportRemovability ( bool * isRemovable ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportWriteProtection ( bool * isWriteProtected ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn getWriteCacheState ( bool * enabled ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn setWriteCacheState ( bool enabled ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn doUnmap ( IOBlockStorageDeviceExtent * extents, + UInt32 extentsCount, + IOStorageUnmapOptions options = 0 ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn doGetProvisionStatus ( UInt64 block, + UInt64 nblks, + UInt32 * extentsCount, + IOBlockStorageProvisionDeviceExtent * extents, + IOStorageGetProvisionStatusOptions options = 0) APPLE_KEXT_OVERRIDE; + + +#if !TARGET_OS_IPHONE + // Space reserved for future expansion. + OSMetaClassDeclareReservedUnused ( IOBlockStorageServices, 1 ); + OSMetaClassDeclareReservedUnused ( IOBlockStorageServices, 2 ); + OSMetaClassDeclareReservedUnused ( IOBlockStorageServices, 3 ); + OSMetaClassDeclareReservedUnused ( IOBlockStorageServices, 4 ); + OSMetaClassDeclareReservedUnused ( IOBlockStorageServices, 5 ); + OSMetaClassDeclareReservedUnused ( IOBlockStorageServices, 6 ); + OSMetaClassDeclareReservedUnused ( IOBlockStorageServices, 7 ); + OSMetaClassDeclareReservedUnused ( IOBlockStorageServices, 8 ); +#endif /* !TARGET_OS_IPHONE */ + +}; + +#endif /* defined(KERNEL) && defined(__cplusplus) */ + +#endif /* _IOKIT_IO_BLOCK_STORAGE_SERVICES_H_ */ diff --git a/QualcommWireless/include/IOKit/scsi/IOCompactDiscServices.h b/QualcommWireless/include/IOKit/scsi/IOCompactDiscServices.h new file mode 100644 index 0000000..0a9f5ae --- /dev/null +++ b/QualcommWireless/include/IOKit/scsi/IOCompactDiscServices.h @@ -0,0 +1,222 @@ +/* + * Copyright (c) 1998-2009 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#ifndef _IOKIT_IO_COMPACT_DISC_SERVICES_H_ +#define _IOKIT_IO_COMPACT_DISC_SERVICES_H_ + +#if defined(KERNEL) && defined(__cplusplus) + + +//----------------------------------------------------------------------------- +// Includes +//----------------------------------------------------------------------------- + +// IOKit includes +#include + +// Generic IOKit storage related headers +#include +#include + +// SCSI Architecture Model Family includes +#include + +class IOMemoryDescriptor; + +// Use this switch to turn off the data cache. +#define _USE_DATA_CACHING_ 1 + + +//----------------------------------------------------------------------------- +// Class Declaration +//----------------------------------------------------------------------------- + +class IOCompactDiscServices : public IOCDBlockStorageDevice +{ + + OSDeclareDefaultStructors ( IOCompactDiscServices ) + +#if (_USE_DATA_CACHING_) + // Data Cache members + bool fUseDataCache; // Indicates if cache should be used. This + // will be set to false if all the necessary support + // for the data cache could not be allocated or + // initialized. + UInt8 * fDataCacheStorage; // Storage space for the cache + UInt32 fDataCacheStartBlock; // Starting block of the data in the cache. + UInt32 fDataCacheBlockCount; // Number of contiguous blocks in the cache + // starting with fDataCacheStartBlock. A value of + // zero in this member indicates that all data + // in the cache is invalid. + + IOSimpleLock * fDataCacheLock; // This is the lock for preventing multiple access + // while manipulating the data cache. +#endif + +protected: + + OSSet * fClients; + IOSCSIPeripheralDeviceType05 * fProvider; + + virtual void free ( void ) APPLE_KEXT_OVERRIDE; + + // Reserve space for future expansion. + struct IOCompactDiscServicesExpansionData { }; + IOCompactDiscServicesExpansionData * fIOCompactDiscServicesReserved; + +public: + + static void AsyncReadWriteComplete ( void * clientData, + IOReturn status, + UInt64 actualByteCount ); + + // Deprecated + virtual IOReturn doAsyncReadWrite ( IOMemoryDescriptor * buffer, + UInt32 block, + UInt32 nblks, + IOStorageCompletion completion ); + + virtual IOReturn doAsyncReadWrite ( IOMemoryDescriptor * buffer, + UInt64 block, + UInt64 nblks, + IOStorageCompletion completion ); + + virtual IOReturn doAsyncReadWrite ( IOMemoryDescriptor * buffer, + UInt64 block, + UInt64 nblks, + IOStorageAttributes * attributes, + IOStorageCompletion * completion ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn doEjectMedia ( void ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn doFormatMedia ( UInt64 byteCapacity ) APPLE_KEXT_OVERRIDE; + + virtual UInt32 doGetFormatCapacities ( UInt64 * capacities, + UInt32 capacitiesMaxCount ) const APPLE_KEXT_OVERRIDE; + virtual IOReturn doSynchronizeCache ( void ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn getWriteCacheState ( bool * enabled ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn setWriteCacheState ( bool enabled ) APPLE_KEXT_OVERRIDE; + + virtual char * getVendorString ( void ) APPLE_KEXT_OVERRIDE; + + virtual char * getProductString ( void ) APPLE_KEXT_OVERRIDE; + + virtual char * getRevisionString ( void ) APPLE_KEXT_OVERRIDE; + + virtual char * getAdditionalDeviceInfoString ( void ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportBlockSize ( UInt64 * blockSize ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportEjectability ( bool * isEjectable ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportMediaState ( bool * mediaPresent, bool * changed ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportMaxValidBlock ( UInt64 * maxBlock ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportRemovability ( bool * isRemovable ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportWriteProtection ( bool * isWriteProtected ) APPLE_KEXT_OVERRIDE; + + /* CD Specific */ + virtual IOReturn doAsyncReadCD ( IOMemoryDescriptor * buffer, + UInt32 block, + UInt32 nblks, + CDSectorArea sectorArea, + CDSectorType sectorType, + IOStorageCompletion completion ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn readISRC ( UInt8 track, CDISRC isrc ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn readMCN ( CDMCN mcn) APPLE_KEXT_OVERRIDE; + + virtual IOReturn readTOC ( IOMemoryDescriptor * buffer ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn audioPause ( bool pause ); + + virtual IOReturn audioPlay ( CDMSF timeStart, CDMSF timeStop ); + + virtual IOReturn audioScan ( CDMSF timeStart, bool reverse ); + + virtual IOReturn audioStop ( void ); + + virtual IOReturn getAudioStatus ( CDAudioStatus * status ); + + virtual IOReturn getAudioVolume ( UInt8 * leftVolume, UInt8 * rightVolume ); + + virtual IOReturn setAudioVolume ( UInt8 leftVolume, UInt8 rightVolume ); + + virtual UInt32 getMediaType ( void ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn getSpeed ( UInt16 * kilobytesPerSecond ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn setSpeed ( UInt16 kilobytesPerSecond ) APPLE_KEXT_OVERRIDE; + + /* System Specific */ + virtual IOReturn message ( UInt32 type, IOService * provider, void * argument ) APPLE_KEXT_OVERRIDE; + virtual IOReturn setProperties ( OSObject * properties ) APPLE_KEXT_OVERRIDE; + + /* User Client Specific */ + virtual bool start ( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual bool open ( IOService * client, IOOptionBits options, IOStorageAccess access ); + + virtual bool handleOpen ( IOService * client, IOOptionBits options, void * access ) APPLE_KEXT_OVERRIDE; + virtual void handleClose ( IOService * client, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + virtual bool handleIsOpen ( const IOService * client ) const APPLE_KEXT_OVERRIDE; + + /* Added with 10.1.3 */ + virtual IOReturn readTOC ( IOMemoryDescriptor * buffer, + CDTOCFormat format, + UInt8 msf, + UInt8 trackSessionNumber, + UInt16 * actualByteCount ) APPLE_KEXT_OVERRIDE; + + /* Added with 10.1.3 */ + virtual IOReturn readDiscInfo ( IOMemoryDescriptor * buffer, + UInt16 * actualByteCount ) APPLE_KEXT_OVERRIDE; + + /* Added with 10.1.3 */ + virtual IOReturn readTrackInfo ( IOMemoryDescriptor * buffer, + UInt32 address, + CDTrackInfoAddressType addressType, + UInt16 * actualByteCount ) APPLE_KEXT_OVERRIDE; + +private: + + // Space reserved for future expansion. + OSMetaClassDeclareReservedUnused ( IOCompactDiscServices, 1 ); + OSMetaClassDeclareReservedUnused ( IOCompactDiscServices, 2 ); + OSMetaClassDeclareReservedUnused ( IOCompactDiscServices, 3 ); + OSMetaClassDeclareReservedUnused ( IOCompactDiscServices, 4 ); + OSMetaClassDeclareReservedUnused ( IOCompactDiscServices, 5 ); + OSMetaClassDeclareReservedUnused ( IOCompactDiscServices, 6 ); + OSMetaClassDeclareReservedUnused ( IOCompactDiscServices, 7 ); + OSMetaClassDeclareReservedUnused ( IOCompactDiscServices, 8 ); + +}; + +#endif /* defined(KERNEL) && defined(__cplusplus) */ + +#endif /* _IOKIT_IO_COMPACT_DISC_SERVICES_H_ */ diff --git a/QualcommWireless/include/IOKit/scsi/IODVDServices.h b/QualcommWireless/include/IOKit/scsi/IODVDServices.h new file mode 100644 index 0000000..2f276db --- /dev/null +++ b/QualcommWireless/include/IOKit/scsi/IODVDServices.h @@ -0,0 +1,250 @@ +/* + * Copyright (c) 1998-2009 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#ifndef _IOKIT_IO_DVD_SERVICES_H_ +#define _IOKIT_IO_DVD_SERVICES_H_ + +#if defined(KERNEL) && defined(__cplusplus) + + +//----------------------------------------------------------------------------- +// Includes +//----------------------------------------------------------------------------- + +// IOKit includes +#include + +// Generic IOKit storage related headers +#include +#include + +// SCSI Architecture Model Family includes +#include + +class IOMemoryDescriptor; + +// Use this switch to turn off the data cache. +#define _DVD_USE_DATA_CACHING_ 1 + + +//----------------------------------------------------------------------------- +// Class Declaration +//----------------------------------------------------------------------------- + +class IODVDServices : public IODVDBlockStorageDevice +{ + + OSDeclareDefaultStructors ( IODVDServices ) + +#if (_DVD_USE_DATA_CACHING_) + // Data Cache members + bool fUseDataCache; // Indicates if cache should be used. This + // will be set to false if all the necessary support + // for the data cache could not be allocated or + // initialized. + UInt8 * fDataCacheStorage; // Storage space for the cache + UInt32 fDataCacheStartBlock; // Starting block of the data in the cache. + UInt32 fDataCacheBlockCount; // Number of contiguous blocks in the cache + // starting with fDataCacheStartBlock. A value of + // zero in this member indicates that all data + // in the cache is invalid. + + IOSimpleLock * fDataCacheLock; // This is the lock for preventing multiple access + // while manipulating the data cache. +#endif + +protected: + + OSSet * fClients; + IOSCSIPeripheralDeviceType05 * fProvider; + + virtual void free ( void ) APPLE_KEXT_OVERRIDE; + + // Reserve space for future expansion. + struct IODVDServicesExpansionData { }; + IODVDServicesExpansionData * fIODVDServicesReserved; + +public: + + static void AsyncReadWriteComplete ( void * clientData, + IOReturn status, + UInt64 actualByteCount ); + + // Deprecated + virtual IOReturn doAsyncReadWrite ( IOMemoryDescriptor * buffer, + UInt32 block, + UInt32 nblks, + IOStorageCompletion completion ); + + virtual IOReturn doAsyncReadWrite ( IOMemoryDescriptor * buffer, + UInt64 block, + UInt64 nblks, + IOStorageCompletion completion ); + + virtual IOReturn doAsyncReadWrite ( IOMemoryDescriptor * buffer, + UInt64 block, + UInt64 nblks, + IOStorageAttributes * attributes, + IOStorageCompletion * completion ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn doEjectMedia ( void ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn doFormatMedia ( UInt64 byteCapacity ) APPLE_KEXT_OVERRIDE; + + virtual UInt32 doGetFormatCapacities ( UInt64 * capacities, + UInt32 capacitiesMaxCount ) const APPLE_KEXT_OVERRIDE; + virtual IOReturn doSynchronizeCache ( void ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn getWriteCacheState ( bool * enabled ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn setWriteCacheState ( bool enabled ) APPLE_KEXT_OVERRIDE; + + virtual char * getVendorString ( void ) APPLE_KEXT_OVERRIDE; + + virtual char * getProductString ( void ) APPLE_KEXT_OVERRIDE; + + virtual char * getRevisionString ( void ) APPLE_KEXT_OVERRIDE; + + virtual char * getAdditionalDeviceInfoString ( void ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportBlockSize ( UInt64 * blockSize ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportEjectability ( bool * isEjectable ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportMediaState ( bool * mediaPresent, bool * changed ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportMaxValidBlock ( UInt64 * maxBlock ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportRemovability ( bool * isRemovable ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportWriteProtection ( bool * isWriteProtected ) APPLE_KEXT_OVERRIDE; + + /* CD Specific */ + virtual IOReturn doAsyncReadCD ( IOMemoryDescriptor * buffer, + UInt32 block, + UInt32 nblks, + CDSectorArea sectorArea, + CDSectorType sectorType, + IOStorageCompletion completion ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn readISRC ( UInt8 track, CDISRC isrc ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn readMCN ( CDMCN mcn) APPLE_KEXT_OVERRIDE; + + virtual IOReturn readTOC ( IOMemoryDescriptor * buffer ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn audioPause ( bool pause ); + + virtual IOReturn audioPlay ( CDMSF timeStart, CDMSF timeStop ); + + virtual IOReturn audioScan ( CDMSF timeStart, bool reverse ); + + virtual IOReturn audioStop ( void ); + + virtual IOReturn getAudioStatus ( CDAudioStatus * status ); + + virtual IOReturn getAudioVolume ( UInt8 * leftVolume, UInt8 * rightVolume ); + + virtual IOReturn setAudioVolume ( UInt8 leftVolume, UInt8 rightVolume ); + + virtual IOReturn getSpeed ( UInt16 * kilobytesPerSecond ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn setSpeed ( UInt16 kilobytesPerSecond ) APPLE_KEXT_OVERRIDE; + + /* DVD Specific */ + virtual UInt32 getMediaType ( void ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportKey ( IOMemoryDescriptor * buffer, + const DVDKeyClass keyClass, + const UInt32 lba, + const UInt8 agid, + const DVDKeyFormat keyFormat ) APPLE_KEXT_OVERRIDE __attribute__ ((deprecated)); + + virtual IOReturn reportKey ( IOMemoryDescriptor * buffer, + const DVDKeyClass keyClass, + const UInt32 lba, + const UInt8 blockCount, + const UInt8 agid, + const DVDKeyFormat keyFormat ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn sendKey ( IOMemoryDescriptor * buffer, + const DVDKeyClass keyClass, + const UInt8 agid, + const DVDKeyFormat keyFormat ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn readDVDStructure ( IOMemoryDescriptor * buffer, + const UInt8 structureFormat, + const UInt32 logicalBlockAddress, + const UInt8 layer, + const UInt8 agid ) APPLE_KEXT_OVERRIDE; + + /* 10.6.0 */ + virtual IOReturn requestIdle ( void ) APPLE_KEXT_OVERRIDE; + + /* System Specific */ + virtual IOReturn message ( UInt32 type, IOService * provider, void * argument ) APPLE_KEXT_OVERRIDE; + virtual IOReturn setProperties ( OSObject * properties ) APPLE_KEXT_OVERRIDE; + + /* User Client Specific */ + virtual bool start ( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual bool open ( IOService * client, IOOptionBits options, IOStorageAccess access ); + + virtual bool handleOpen ( IOService * client, IOOptionBits options, void * access ) APPLE_KEXT_OVERRIDE; + virtual void handleClose ( IOService * client, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + virtual bool handleIsOpen ( const IOService * client ) const APPLE_KEXT_OVERRIDE; + + /* Added with 10.1.3 */ + virtual IOReturn readTOC ( IOMemoryDescriptor * buffer, + CDTOCFormat format, + UInt8 msf, + UInt8 trackSessionNumber, + UInt16 * actualByteCount ) APPLE_KEXT_OVERRIDE; + + /* Added with 10.1.3 */ + virtual IOReturn readDiscInfo ( IOMemoryDescriptor * buffer, + UInt16 * actualByteCount ) APPLE_KEXT_OVERRIDE; + + /* Added with 10.1.3 */ + virtual IOReturn readTrackInfo ( IOMemoryDescriptor * buffer, + UInt32 address, + CDTrackInfoAddressType addressType, + UInt16 * actualByteCount ) APPLE_KEXT_OVERRIDE; + +private: + + // Space reserved for future expansion. + OSMetaClassDeclareReservedUnused ( IODVDServices, 1 ); + OSMetaClassDeclareReservedUnused ( IODVDServices, 2 ); + OSMetaClassDeclareReservedUnused ( IODVDServices, 3 ); + OSMetaClassDeclareReservedUnused ( IODVDServices, 4 ); + OSMetaClassDeclareReservedUnused ( IODVDServices, 5 ); + OSMetaClassDeclareReservedUnused ( IODVDServices, 6 ); + OSMetaClassDeclareReservedUnused ( IODVDServices, 7 ); + OSMetaClassDeclareReservedUnused ( IODVDServices, 8 ); + +}; + +#endif /* defined(KERNEL) && defined(__cplusplus) */ + +#endif /* _IOKIT_IO_DVD_SERVICES_H_ */ diff --git a/QualcommWireless/include/IOKit/scsi/IOReducedBlockServices.h b/QualcommWireless/include/IOKit/scsi/IOReducedBlockServices.h new file mode 100644 index 0000000..46188af --- /dev/null +++ b/QualcommWireless/include/IOKit/scsi/IOReducedBlockServices.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 1998-2009 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#ifndef _IOKIT_IO_REDUCED_BLOCK_SERVICES_H_ +#define _IOKIT_IO_REDUCED_BLOCK_SERVICES_H_ + +#if defined(KERNEL) && defined(__cplusplus) + + +//----------------------------------------------------------------------------- +// Includes +//----------------------------------------------------------------------------- + +// Generic IOKit related headers +#include + +// Generic IOKit storage related headers +#include + +// SCSI Architecture Model Family includes +#include + + +//----------------------------------------------------------------------------- +// Class Declaration +//----------------------------------------------------------------------------- + +class IOReducedBlockServices : public IOBlockStorageDevice +{ + + OSDeclareDefaultStructors ( IOReducedBlockServices ) + + +protected: + // Reserve space for future expansion. + struct IOReducedBlockServicesExpansionData { }; + IOReducedBlockServicesExpansionData * fIOReducedBlockServicesReserved; + + IOSCSIPeripheralDeviceType0E * fProvider; + + virtual bool attach ( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void detach ( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void free ( void ) APPLE_KEXT_OVERRIDE; + + +public: + + virtual IOReturn message ( UInt32 type, IOService * provider, void * argument ) APPLE_KEXT_OVERRIDE; + + static void AsyncReadWriteComplete ( void * clientData, + IOReturn status, + UInt64 actualByteCount ); + + // Deprecated + virtual IOReturn doAsyncReadWrite ( IOMemoryDescriptor * buffer, + UInt32 block, + UInt32 nblks, + IOStorageCompletion completion ); + + virtual IOReturn doAsyncReadWrite ( IOMemoryDescriptor * buffer, + UInt64 block, + UInt64 nblks, + IOStorageCompletion completion ); + + virtual IOReturn doAsyncReadWrite ( IOMemoryDescriptor * buffer, + UInt64 block, + UInt64 nblks, + IOStorageAttributes * attributes, + IOStorageCompletion * completion ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn doEjectMedia ( void ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn doFormatMedia ( UInt64 byteCapacity ) APPLE_KEXT_OVERRIDE; + + virtual UInt32 doGetFormatCapacities ( UInt64 * capacities, + UInt32 capacitiesMaxCount ) const APPLE_KEXT_OVERRIDE; + + virtual IOReturn doSynchronizeCache ( void ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn getWriteCacheState ( bool * enabled ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn setWriteCacheState ( bool enabled ) APPLE_KEXT_OVERRIDE; + + virtual char * getVendorString ( void ) APPLE_KEXT_OVERRIDE; + + virtual char * getProductString ( void ) APPLE_KEXT_OVERRIDE; + + virtual char * getRevisionString ( void ) APPLE_KEXT_OVERRIDE; + + virtual char * getAdditionalDeviceInfoString ( void ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportBlockSize ( UInt64 * blockSize ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportEjectability ( bool * isEjectable ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportMediaState ( bool * mediaPresent, bool * changed ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportMaxValidBlock ( UInt64 * maxBlock ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportRemovability ( bool * isRemovable ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn reportWriteProtection ( bool * isWriteProtected ) APPLE_KEXT_OVERRIDE; + +private: + + // Space reserved for future expansion. + OSMetaClassDeclareReservedUnused ( IOReducedBlockServices, 1 ); + OSMetaClassDeclareReservedUnused ( IOReducedBlockServices, 2 ); + OSMetaClassDeclareReservedUnused ( IOReducedBlockServices, 3 ); + OSMetaClassDeclareReservedUnused ( IOReducedBlockServices, 4 ); + OSMetaClassDeclareReservedUnused ( IOReducedBlockServices, 5 ); + OSMetaClassDeclareReservedUnused ( IOReducedBlockServices, 6 ); + OSMetaClassDeclareReservedUnused ( IOReducedBlockServices, 7 ); + OSMetaClassDeclareReservedUnused ( IOReducedBlockServices, 8 ); + +}; + +#endif /* defined(KERNEL) && defined(__cplusplus) */ + +#endif /* _IOKIT_IO_REDUCED_BLOCK_SERVICES_H_ */ diff --git a/QualcommWireless/include/IOKit/scsi/IOSCSIBlockCommandsDevice.h b/QualcommWireless/include/IOKit/scsi/IOSCSIBlockCommandsDevice.h new file mode 100644 index 0000000..f99312a --- /dev/null +++ b/QualcommWireless/include/IOKit/scsi/IOSCSIBlockCommandsDevice.h @@ -0,0 +1,1594 @@ +/* + * Copyright (c) 1998-2011 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#ifndef _IOKIT_IO_SCSI_BLOCK_COMMANDS_DEVICE_H_ +#define _IOKIT_IO_SCSI_BLOCK_COMMANDS_DEVICE_H_ + +#if defined(KERNEL) && defined(__cplusplus) + +//----------------------------------------------------------------------------- +// Constants +//----------------------------------------------------------------------------- + +// SBC power states as defined in T10:996D SCSI Block Commands - 3 (SBC-3) +// Revision 8c, November 13, 1997, pages 10-11. +enum +{ + kSBCPowerStateSystemSleep = 0, + kSBCPowerStateSleep = 1, + kSBCPowerStateStandby = 2, + kSBCPowerStateIdle = 3, + kSBCPowerStateActive = 4, + kSBCNumPowerStates = 5 +}; + +enum +{ + kMediaStateUnlocked = 0, + kMediaStateLocked = 1 +}; + + +//----------------------------------------------------------------------------- +// Includes +//----------------------------------------------------------------------------- + +// General IOKit headers +#include +#include +#include +#include + +// Generic IOKit storage related headers +#include + +// SCSI Architecture Model Family includes +#include +#include + +// Build includes +#include + +// Forward declaration for the SCSIBlockCommands that is used internally by the +// IOSCSIBlockCommandsDevice class. +class SCSIBlockCommands; + +//----------------------------------------------------------------------------- +// Class Declaration +//----------------------------------------------------------------------------- + +/*! + @class IOSCSIBlockCommandsDevice + @superclass IOSCSIPrimaryCommandsDevice + @discussion Implementation of the T10 device Block Commands device. + */ +class IOSCSIBlockCommandsDevice : public IOSCSIPrimaryCommandsDevice +{ + + OSDeclareAbstractStructors ( IOSCSIBlockCommandsDevice ) + +private: + + IOReturn GetWriteCacheState ( IOMemoryDescriptor * buffer, + UInt8 modePageControlValue ); + + static void AsyncReadWriteComplete ( SCSITaskIdentifier completedTask ); + +protected: + + // Reserve space for future expansion. + struct IOSCSIBlockCommandsDeviceExpansionData + { + IONotifier * fPowerDownNotifier; + bool fWriteCacheEnabled; + bool fDeviceIsShared; + UInt64 fMediumBlockCount64; +#if !TARGET_OS_IPHONE + bool fDeviceHasSATTranslation; + bool fDeviceHasNVMETranslation; +#endif /* !TARGET_OS_IPHONE */ + bool fProtocolSpecificPowerControl; + bool fRequiresEjectWithStartStopUnit; + UInt32 fMaximumUnmapLBACount; + UInt32 fMaximumUnmapBlockDescriptorCount; + UInt64 fMaximumWriteSameLength; + UInt8 fLBPRZ; + bool fUnmapAllowed; + bool fUseWriteSame; + }; + IOSCSIBlockCommandsDeviceExpansionData * fIOSCSIBlockCommandsDeviceReserved; + + #define fPowerDownNotifier fIOSCSIBlockCommandsDeviceReserved->fPowerDownNotifier + #define fWriteCacheEnabled fIOSCSIBlockCommandsDeviceReserved->fWriteCacheEnabled + #define fMaximumUnmapLBACount fIOSCSIBlockCommandsDeviceReserved->fMaximumUnmapLBACount + #define fMaximumUnmapBlockDescriptorCount fIOSCSIBlockCommandsDeviceReserved->fMaximumUnmapBlockDescriptorCount + #define fMaximumWriteSameLength fIOSCSIBlockCommandsDeviceReserved->fMaximumWriteSameLength + #define fLBPRZ fIOSCSIBlockCommandsDeviceReserved->fLBPRZ + #define fUnmapAllowed fIOSCSIBlockCommandsDeviceReserved->fUnmapAllowed + #define fUseWriteSame fIOSCSIBlockCommandsDeviceReserved->fUseWriteSame + + // The fDeviceIsShared is used to indicate whether this device exists on a Physical + // Interconnect that allows multiple initiators to access it. This is used mainly + // by the power management code to not send power state related START_STOP_UNIT + // commands to the device. + // The fDeviceIsShared value is also used to prevent power state commands from being + // sent to manual eject device since these devices behave better when allowed to + // manage their own power. + #define fDeviceIsShared fIOSCSIBlockCommandsDeviceReserved->fDeviceIsShared + + // The fMediumBlockCount64 provides support for 64 bit LBAs and + // replaces fMediumBlockCount which only supports 32 bits. + // This value should not be directly accessed and instead the member routine + // ReportMediumTotalBlockCount() should be used to retrieve it and the member routine + // SetMediumCharacteristics() should be used to set it. + #define fMediumBlockCount64 fIOSCSIBlockCommandsDeviceReserved->fMediumBlockCount64 + +#if !TARGET_OS_IPHONE + #define fDeviceHasSATTranslation fIOSCSIBlockCommandsDeviceReserved->fDeviceHasSATTranslation +#endif /* !TARGET_OS_IPHONE */ + +#if !TARGET_OS_IPHONE + #define fDeviceHasNVMETranslation fIOSCSIBlockCommandsDeviceReserved->fDeviceHasNVMETranslation +#endif /* !TARGET_OS_IPHONE */ + + // Device support protocol specific power off + #define fProtocolSpecificPowerControl fIOSCSIBlockCommandsDeviceReserved->fProtocolSpecificPowerControl + + // Device requires START_STOP_UNIT for ejects, regardless if PREVENT_ALLOW_MEIDUMREMOVAL + // failed. + #define fRequiresEjectWithStartStopUnit fIOSCSIBlockCommandsDeviceReserved->fRequiresEjectWithStartStopUnit + +private: + /* OBSOLETE. Use IOSCSIPrimaryCommandsDevice::Get/SetANSIVersion */ + UInt8 fANSIVersion; + +protected: + // ---- Device Characteristics ---- + bool fMediaIsRemovable; + + // ---- Medium Characteristics ---- + bool fMediumPresent; + +private: + // The byte count of each physical block on the medium. + // This value should not be directly accessed and instead the member routine + // ReportMediumBlockSize() should be used to retrieve it and the member routine + // SetMediumCharacteristics() should be used to set it. + UInt32 fMediumBlockSize; + + // The total number of blocks of fMediumBlockSize on the medium. + // OBSOLETE. Use fMediumBlockCount64 instead which allows for support of + // devices that have 33 through 64 bit LBA values. + UInt32 fMediumBlockCount; + +protected: + // Whether the installed medium is protected from writes + bool fMediumIsWriteProtected; + + // Whether user removal of medium has been prevented + bool fMediumRemovalPrevented; + + // Indicates whether this is a known manual eject device + bool fKnownManualEject; + + // Polling thread variables + thread_call_t fPollingThread; + UInt32 fPollingMode; + enum + { + kPollingMode_Suspended = 0, + kPollingMode_NewMedia = 1, + kPollingMode_MediaRemoval = 2 + }; + + // ---- Methods for controlling the current state of device support ---- + /*! + @function InitializeDeviceSupport + @abstract Called in super class's start() to initialize device support. + @discussion Called in super class's start() to initialize device support. The underlying infrastructure + for supporting a device must be implemented here. + @result true if device could be successfully configured false if not. + */ + virtual bool InitializeDeviceSupport ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function StartDeviceSupport + @abstract Called in super class's start() to start device support. + @discussion Called in super class's start() to start device support. Support for starting + devices and making them usable must be implemented here. + */ + virtual void StartDeviceSupport ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function SuspendDeviceSupport + @abstract Called to temporarily suspend device support. + @discussion Called to temporarily suspend device support. Support for suspending + devices must be implemented here. + */ + virtual void SuspendDeviceSupport ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function ResumeDeviceSupport + @abstract Called to temporarily resume device support. + @discussion Called to temporarily resume device support. Support for resuming + devices must be implemented here. + */ + virtual void ResumeDeviceSupport ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function StopDeviceSupport + @abstract Called to stop device support. + @discussion Called to stop device support. Support for stopping + devices must be implemented here. + */ + virtual void StopDeviceSupport ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function TerminateDeviceSupport + @abstract Called to terminate device support. + @discussion Called to terminate device support. The underlying infrastructure for + support a device should be cleaned up here. + */ + virtual void TerminateDeviceSupport ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function free + @abstract Called to release all resources held by the object. + @discussion Release all resources held by the object, then call super::free(). + */ + virtual void free ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function ClearNotReadyStatus + @abstract Clears any NOT_READY status for the device. + @discussion Polls device with TEST_UNIT_READY until the device returns kSCSITaskStatus_GOOD status. + Exits if device has become disconnected. + @result true if device is now active (isInactive == false) and false otherwise. + */ + virtual bool ClearNotReadyStatus ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function CreateStorageServiceNub + @abstract Creates a nub which links the IOSCSIReducedBlockCommandsDevice to the IOStorageFamily. + @discussion Creates a nub which links the IOSCSIReducedBlockCommandsDevice to the IOStorageFamily. + */ + virtual void CreateStorageServiceNub ( void ); + + /*! + @function DetermineDeviceCharacteristics + @abstract Determine the characteristics of the device. + @discussion Determine the characteristics, ANSI version, removability, etc., of the device via its INQUIRY data. + @result true on success and false on failure. + */ + virtual bool DetermineDeviceCharacteristics ( void ); + + /*! + @function GetMediumRotationRate + @abstract Get the rotation rate of the device. + @discussion Get the rotation rate of the device via its INQUIRY data. + Sets the result as a property on the device's registry entry. + */ + void GetMediumRotationRate ( void ); + + /*! + @function LogicalBlockProvisioningUnmapSupport + @abstract Check if the device supports Logical Block Provisioning Unmap. + @discussion Check if the device supports Logical Block Provisioning Unmap via its INQUIRY data. + @return true if unmap is supported and false otherwise. + */ + bool LogicalBlockProvisioningUnmapSupport ( void ); + + /*! + @function GetDeviceUnmapCharacteristics + @abstract Get the unmap characteristics of the device. + @discussion Get the unmap characteristics of the device. + */ + void GetDeviceUnmapCharacteristics ( ); + + // ---- Methods used for controlling the polling thread ---- + + /*! + @function ProcessPoll + @abstract Process a poll for media. + @discussion Process a poll for media based on the current polling mode of the driver. + */ + virtual void ProcessPoll ( void ); + + /*! + @function EnablePolling + @abstract Enables media polling. + @discussion Schedules a thread to poll the device for media at the prescribed interval. + */ + virtual void EnablePolling ( void ); + + /*! + @function DisablePolling + @abstract Disables media polling. + @discussion Cancels ( if running ) the media polling thread. + */ + virtual void DisablePolling ( void ); + + // Main and support methods for polling for new Media + + /*! + @function PollForNewMedia + @abstract Polls for new media insertion. + @discussion Polls for new media insertion. If new media is inserted, it is initialized and + clients are notified via the kIOMessageMediaStateHasChanged message. + */ + virtual void PollForNewMedia ( void ); + + /*! + @function DetermineMediaPresence + @abstract Check if media has been inserted. + @discussion Check if media has been inserted by sending TEST_UNIT_READY + and checking the SENSE data. + @return true if medium was found and false otherwise. + */ + virtual bool DetermineMediaPresence ( void ); + + /*! + @function PreventMediumRemoval + @abstract Prevent Medium Removal. + @discussion Prevents medium removal by sending the PREVENT_ALLOW_MEDIUM_REMOVAL command + with the PREVENT field set to "Medium removal shall be prohibited". + @return true if medium was successfully locked and false otherwise. + */ + virtual bool PreventMediumRemoval ( void ); + + /*! + @function DetermineMediumCapacity + @abstract Determines capacity of the medium. + @discussion Determines capacity of the medium via the READ_CAPACITY or READ_CAPACITY_16 commands. + @param blockSize used to return the block size of the medium. + @param blockCount used to return the block count of the medium. + @return true if medium capacity was successfully queried and false otherwise. + */ + virtual bool DetermineMediumCapacity ( + UInt64 * blockSize, + UInt64 * blockCount ); + + /*! + @function DetermineMediumWriteProtectState + @abstract Determine medium write protect state of the medium. + @discussion Determine medium write protect state of the medium via MODE_SENSE_10, MODE_SENSE_6, + or manual READ_10 commands. + @return true if medium is in write protect state and false otherwise. + */ + virtual bool DetermineMediumWriteProtectState ( void ); + + // Main and support methods for polling for Media removal + + /*! + @function PollForMediaRemoval + @abstract Check if media has been removed. + @discussion Check if media has been removed by sending TEST_UNIT_READY + and checking the SENSE data. If so, message clients and resets the driver's + medium characteristics. + */ + virtual void PollForMediaRemoval ( void ); + + // ---- Methods used for handling medium characteristics ---- + + /*! + @function SetMediumCharacteristics + @abstract Sets the block size and block count for the current media. + OBSOLETE - Use the version compatible with 64 bit LBAs instead. + @discussion Sets the block size and block count for the current media. + OBSOLETE - Use the version compatible with 64 bit LBAs instead. + @param blockSize The media's block size in bytes. + @param blockCount The count of the media's blocks. + */ + virtual void SetMediumCharacteristics ( + UInt32 blockSize, + UInt32 blockCount ); + + /*! + @function SetMediumCharacteristics + @abstract Sets the block size and block count for the current media. + @discussion Sets the block size and block count for the current media. + @param blockSize The media's block size in bytes. + @param blockCount The count of the media's blocks. + */ + void SetMediumCharacteristics ( + UInt64 blockSize, + UInt64 blockCount ); + + /*! + @function ResetMediumCharacteristics + @abstract Resets the block size and block count. + @discussion Resets the block size and block count. + */ + virtual void ResetMediumCharacteristics ( void ); + + /*! + @function IssueRead + @abstract DEPRECATED. Please do not use this method. + @discussion DEPRECATED. Please do not use this method. + @param buffer DEPRECATED. Please do not use this method. + @param startBlock DEPRECATED. Please do not use this method. + @param blockCount DEPRECATED. Please do not use this method. + @result DEPRECATED. Please do not use this method. + */ + virtual IOReturn IssueRead ( + IOMemoryDescriptor * buffer, + UInt64 startBlock, + UInt64 blockCount ); + + /*! + @function IssueRead + @abstract Issues an asynchronous read command. + @discussion Issues an asynchronous read command. + @param buffer A pointer to a valid IOMemoryDescriptor to which the data can be copied to. + @param startBlock Starting logical block address for the read operation. + @param blockCount The number of blocks to be read. + @param clientData A valid pointer to the client data to be used for callback completion. + @result A valid IOReturn value. + */ + virtual IOReturn IssueRead ( + IOMemoryDescriptor * buffer, + UInt64 startBlock, + UInt64 blockCount, + void * clientData ); + + /*! + @function IssueWrite + @abstract DEPRECATED. Please do not use this method. + @discussion DEPRECATED. Please do not use this method. + @param buffer DEPRECATED. Please do not use this method. + @param startBlock DEPRECATED. Please do not use this method. + @param blockCount DEPRECATED. Please do not use this method. + @result DEPRECATED. Please do not use this method. + */ + virtual IOReturn IssueWrite ( + IOMemoryDescriptor * buffer, + UInt64 startBlock, + UInt64 blockCount ); + + /*! + @function IssueWrite + @abstract Issues an asynchronous write command. + @discussion Issues an asynchronous write command. + @param buffer A pointer to a valid IOMemoryDescriptor to which the data can be copied from. + @param startBlock Starting logical block address for the write operation. + @param blockCount The number of blocks to be written. + @param clientData A valid pointer to the client data to be used for callback completion. + @result A valid IOReturn value. + */ + virtual IOReturn IssueWrite ( + IOMemoryDescriptor * buffer, + UInt64 startBlock, + UInt64 blockCount, + void * clientData ); + + /*! + @function IssueUnmap + @abstract Issue a synchronous unmap command. + @discussion Issue a synchronous unmap command. + @param extentsList a list of extents to unmap. + @param blockDescriptorCount the count of extents in extentsList. + @return A valid IOReturn value. + */ + IOReturn IssueUnmap ( + IOBlockStorageDeviceExtent * extentsList, + UInt32 blockDescriptorCount ); + + // ----- Power Management Support ------ + + /*! + @function InitializePowerManagement + @abstract Called to initialize power management. + @discussion Called by InitializeDeviceSupport() to initialize power management by, + joining the power management tree, registering power states, and setting the lowest idle + power state. + @param provider A valid pointer to this object's provider. + */ + virtual void InitializePowerManagement ( IOService * provider ) APPLE_KEXT_OVERRIDE; + + /*! + @function GetInitialPowerState + @abstract Called by power management to determine initial power state. + @discussion We override this method so that when we register for power management, + we go to our active power state (which the drive is definitely in + at startup time). + @result Returns the initial power state desired when power management is initialized. + */ + virtual UInt32 GetInitialPowerState ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function GetNumberOfPowerStateTransitions + @abstract Called by power management to determine this class's total + number of power state transitions. + @discussion We override this method in order to provide the number of transitions + from Fully active to Sleep state so that the idle timer can be adjusted + to the appropriate time period based on the disk spin down time set in + the Energy Saver prefs panel. + @result Returns the number of power state transitions for this class. + */ + virtual UInt32 GetNumberOfPowerStateTransitions ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function TicklePowerManager + @abstract The TicklePowerManager method is called to tell the power manager that the + device needs to be in a certain power state to handle requests. + @discussion The TicklePowerManager() is called by CheckPowerState() and + sends an activity tickle ( via activityTickle() ) to the power manager + so that the idle timer is reset. + Subclasses must override this method. Third party subclasses shouldn't need to override + this method but can to alter the default behavior. + */ + virtual void TicklePowerManager ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function HandlePowerChange + @abstract Handles the state machine for power management state changes. + @discussion The HandlePowerChange method is the state machine for power management. + It is guaranteed to be on its own thread of execution (different from + the power manager thread AND the workloop thread. This routine can + send sync or async calls to the drive without worrying about threading + issues. + */ + virtual void HandlePowerChange ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function HandleCheckPowerState(void) + @abstract The HandleCheckPowerState (void) method is on the serialized side of the command + gate and can change member variables safely without multi-threading issues. + It's main purpose is to call the superclass' HandleCheckPowerState ( UInt32 maxPowerState ) + with the max power state the class registered with. + @discussion The HandleCheckPowerState (void) method is on the serialized side of the command + gate and can change member variables safely without multi-threading issues. + It's main purpose is to call the superclass' HandleCheckPowerState ( UInt32 maxPowerState ) + with the max power state the class registered with. + Subclasses must override this method. Third party subclasses shouldn't need to override + this method but can to alter the default behavior. The default behavior is to block until the + object transitions to its maximum power state. + */ + virtual void HandleCheckPowerState ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function VerifyMediumPresence + @abstract Called to ascertain the current presence of media. + @discussion The VerifyMediumPresence method is called to see if the medium which we + anticipated being there is still there. + @result true if media is present and false if media is not present. + */ + virtual bool VerifyMediumPresence ( void ); + + /*! + @function CheckMediumCapacityData + @abstract Called to ascertain if the medium has changed capacity data. + If so, it messages the upper layers. + @discussion The CheckMediumCapacityData is called to see if the medium has indeed changed + capacity data. If it has, it messages the upper layers. + */ + void CheckMediumCapacityData ( void ); + +public: + + /*! + @function sProcessPoll + @abstract Static method called to poll for media. + @discussion Static method called to poll for media. Called from polling thread. + Will reschedule itself via EnablePolling if polling is not suspended. + @param pdtDriver a pointer to a valid IOSCSIBlockCommandsDevice ( or subclass ) which is to + be polled. + @param refCon a pointer to an additional object which can be determined by the implementer. + */ + static void sProcessPoll ( void * pdtDriver, void * refCon ); + + // ---- Methods for controlling the device ---- + + /*! + @function SyncReadWrite + @abstract DEPRECATED. Please do not use this method. + @discussion DEPRECATED. Please do not use this method. + @param buffer DEPRECATED. Please do not use this method. + @param startBlock DEPRECATED. Please do not use this method. + @param blockCount DEPRECATED. Please do not use this method. + @param blockSize DEPRECATED. Please do not use this method. + @result DEPRECATED. Please do not use this method. + */ + virtual IOReturn SyncReadWrite ( + IOMemoryDescriptor * buffer, + UInt64 startBlock, + UInt64 blockCount, + UInt64 blockSize ); + + /*! + @function AsyncReadWrite + @abstract Translates an asynchronous I/O request into a read or a write. + @discussion Translates an asynchronous I/O request into a read or a write. + @param buffer A pointer to a valid IOMemoryDescriptor to which the + data can be copied to or from. + @param startBlock Starting logical block address for the write operation. + @param blockCount The number of blocks to read or write. + @param blockSize used to specify the block size to be used for the read or write. + @param clientData A valid pointer to the client data to be used for callback completion. + @result A valid IOReturn value. + */ + virtual IOReturn AsyncReadWrite ( + IOMemoryDescriptor * buffer, + UInt64 startBlock, + UInt64 blockCount, + UInt64 blockSize, + void * clientData ); + + /*! + @function GetWriteCacheState + @abstract Get the write cache state. + @discussion Get the write cache state. + @param enabled used to return the current write cache state. + @return A valid IOReturn value. + */ + IOReturn GetWriteCacheState ( bool * enabled ); + + /*! + @function SetWriteCacheState + @abstract Sets the write cache state. + @discussion Sets the write cache state. + @param enabled the state of the write cache. + @return A valid IOReturn value. + */ + IOReturn SetWriteCacheState ( bool enabled ); + + /*! + @function DetermineMediumGeometry + @abstract Determines geometry of the medium. + @discussion Determines geometry of the medium via mode sense data and places + the results in the Device Characteristics Dictionary + */ + void DetermineMediumGeometry ( void ); + + // ---- Methods for controlling medium state ---- + /*! + @function EjectTheMedium + @abstract Called to eject the inserted media from the drive. + @discussion Called by IOBlockStorageDevice subclasses to eject the inserted + media from the drive. + @result A valid IOReturn value. + */ + virtual IOReturn EjectTheMedium ( void ); + + /*! + @function LockUnlockMedium + @abstract Called to lock or unlock the inserted media. + @discussion Called by IOBlockStorageDevice subclasses to lock or unlock the inserted media. + @param doLock if true the media will be locked, if false the media will be unlocked. + @result A valid IOReturn value. + */ + virtual IOReturn LockUnlockMedium ( bool doLock ); + + /*! + @function SynchronizeCache + @abstract Called to synchronize the devices cache and thereby force its contents to be + written out to the media. + @discussion Called by IOBlockStorageDevice subclasses to synchronize the devices cache + and thereby force the cache's contents to be written out to the media. + @result A valid IOReturn value. + */ + virtual IOReturn SynchronizeCache ( void ); + + // ---- Methods for controlling media format ---- + + /*! + @function FormatMedium + @abstract Called to perform a low level format of the inserted media. + @discussion Called IOBlockStorageDevice subclasses to perform a low level + of the inserted media. Default implementation simply returns kIOReturnUnsupported + if not overridden. + @param blockCount The number of blocks to be formatted. + @param blockSize used to specify the block size to be used for the format. + @result A valid IOReturn value. + */ + virtual IOReturn FormatMedium ( + UInt64 blockCount, + UInt64 blockSize ); + + /*! + @function GetFormatCapacities + @abstract Called to determine the formatted capacity of the inserted media. + @discussion Called IOBlockStorageDevice subclasses to determine the formatted + capacity of the inserted media. Presently unsupported by default implementation. + Returns 0 unless overridden. + @param capacities a pointer to a valid UInt64 array. + @param capacitiesMaxCount the number of elements addressable within capacities. + @result The number of elements assigned in capacities ( count is 1 based ). + */ + virtual UInt32 GetFormatCapacities ( + UInt64 * capacities, + UInt32 capacitiesMaxCount ) const; + + // ---- Query methods to report device characteristics ---- + + /*! + @function ReportDeviceMaxBlocksReadTransfer + @abstract Reports maximum read transfer blocks. + @discussion Reports the maximum number of blocks that the device can handle per + read. A value of 0 (zero) indicates there is no limit aside from the size of + the method's return parameter. + @return the maximum read transfer blocks. + */ + virtual UInt64 ReportDeviceMaxBlocksReadTransfer ( void ); + + /*! + @function ReportDeviceMaxBlocksWriteTransfer + @abstract Reports maximum write transfer blocks. + @discussion Reports the maximum number of blocks that the device can handle per + write. A value of 0 (zero) indicates there is no limit aside from the size of + the method's return parameter. + @return the maximum write transfer blocks. + */ + virtual UInt64 ReportDeviceMaxBlocksWriteTransfer ( void ); + + /*! + @function ReportDeviceMediaRemovability + @abstract Reports whether the device supports removal of the media. + @discussion Reports whether the device supports removal of the media. + @return true if media is removable and false otherwise. + */ + virtual bool ReportDeviceMediaRemovability ( void ); + + // ---- Query methods to report installed medium characteristics ---- + + /*! + @function ReportMediumBlockSize + @abstract Reports the logical block size of the medium. + @discussion Reports the logical block size of the medium. + @return the logical block size. + */ + virtual UInt64 ReportMediumBlockSize ( void ); + + /*! + @function ReportMediumTotalBlockCount + @abstract Reports the total logical block count of the medium. + @discussion Reports the total logical block count of the medium. + @return the total logical block count. + */ + virtual UInt64 ReportMediumTotalBlockCount ( void ); + + /*! + @function ReportMediumWriteProtection + @abstract Reports whether or not the medium is write protected. + @discussion Reports whether or not the media is write protected. + @return true if media is write protected and false otherwise. + */ + virtual bool ReportMediumWriteProtection ( void ); + + // ---- Query method to report the device provision initialization pattern ---- + + /*! + @function ReportProvisioningInitializationPattern + @abstract Reports the device provision initialization pattern. + @discussion Reports the device provision initialization pattern. + @param buffer the buffer into which the results will be copied. + @result A valid IOReturn value. + */ + IOReturn ReportProvisioningInitializationPattern ( + IOMemoryDescriptor * buffer ); + + /*! @function message + @abstract Receives messages delivered from an attached provider. + @discussion Handles the kIOMessageMediaParametersHaveChanged message + by CheckMediumCapacityData on a separate thread. + @param type A type defined in IOMessage.h. + @param nub The provider from which the message originates. + @param arg An argument defined by the message type. + @result An IOReturn code defined by the message type. + */ + virtual IOReturn message ( UInt32 type, IOService * nub, void * arg ) APPLE_KEXT_OVERRIDE; + + // ---- Called prior to restarting or shutting down ---- + + /*! @function systemWillShutdown + @abstract Handles system shutdown and restart notifications. + @discussion Overrides IOService::systemWillShutdown in order + to execute any special handling as specified in the device characteristics dictionary. + As a result, drivers can expect their disable method to be called + before system shutdown or restart. This implementation is synchronous and can + block before calling IOService::systemWillShutdown and return. + @param specifier + kIOMessageSystemWillPowerOff or kIOMessageSystemWillRestart. + @see //apple_ref/cpp/instm/IOService/systemWillShutdown/void/(IOOptionBits) IOService::systemWillShutdown + */ + virtual void systemWillShutdown ( IOOptionBits specifier ) APPLE_KEXT_OVERRIDE; + + // ---- Unmap related methods ---- + // Check to see if we can coalesce the current and the next extent + + /*! + @function UnmapTryExtentCoalesce + @abstract Helper function to check and coalesce two extents. + @discussion Helper function to check and coalesce two extents. In order to be + successfully merged, the extents must be sequential. + @param mergedExtent a pointer where the new merged extent will be placed. + @param currentExtent the first extent to merge. + @param nextExtent the second extent to merge. + @return true if the extents were merged and false otherwise. + */ + bool UnmapTryExtentCoalesce ( + IOBlockStorageDeviceExtent * mergedExtent, + IOBlockStorageDeviceExtent * currentExtent, + IOBlockStorageDeviceExtent * nextExtent ); + + /*! + @function UnmapTruncateAndAccumulate + @abstract Helper function to truncate an extent if required. + @discussion Adds an extent to the end of the extent unmap dispatch list. + If there are not enough unmap LBAs to fit the whole extent, it is split and the remaining, + truncated extent is returned. + @param extentDispatchList the extent dispatch list to add the extent. + @param blockDescriptorCount the current count of block descriptors in the dispatch list. + @param unmapLBACount the current count of queued LBAs for the next unmap operation. + @param mergedExtent a pointer to the extent to be added. The truncated extent is returned + using this pointer as well. + @return true if adding the extent used all remaining unmap LBAs + and false otherwise. + */ + bool UnmapTruncateAndAccumulate ( + IOBlockStorageDeviceExtent * extentDispatchList, + UInt32 blockDescriptorCount, + UInt32 * unmapLBACount, + IOBlockStorageDeviceExtent * mergedExtent ); + + // Use the write same command to do unmaps on the given extents. + + /*! + @function WriteSameUnmap + @abstract Uses the write same command to unmap the given extents. + @discussion Uses the write same command to unmap the given extents. + @param extents the array of extents to unmap. + @param extentsCount the count of extents in the provided array. + @param requestBlockSize used to specify the block size to be used for the write. + @return A valid IOReturn value. + */ + IOReturn WriteSameUnmap ( + IOBlockStorageDeviceExtent * extents, + UInt32 extentsCount, + UInt32 requestBlockSize ); + + /*! + @function UpdateLBAProvisionStatus + @abstract Get the block provision status. + @discussion Update the extents with the provision status that we got from the device. + @param extentsCount the count of extents in extents. + @param extents a list of extents to unmap. + @param dataBuffer a pointer to a valid IOMemoryDescriptor in which the received + status data is to be stored. + @param transferLength used to specify the maximum requested amount of status data. + @return A valid IOReturn value. + */ + IOReturn UpdateLBAProvisionStatus ( + UInt32 * extentsCount, + IOBlockStorageProvisionDeviceExtent * extents, + IOMemoryDescriptor * dataBuffer, + UInt32 transferLength ); + + /*! + @function IsUnmapAllowed + @abstract Return whether unmap is allowed. + @discussion Return whether unmap is allowed. + @return true if unmap is allowed and false otherwise. + */ + bool IsUnmapAllowed ( ); + + /*! + @function IsUseWriteSame + @abstract Return whether WRITE_SAME should be used for UNMAP commands. + @discussion Return whether WRITE_SAME should be used for UNMAP commands. + @return true if the device supports unmap operations with write same command + and false otherwise. + */ + bool IsUseWriteSame ( ); + +protected: + + + /*! + @function GET_LBA_STATUS + @abstract Builds a GET_LBA_STATUS command. + @discussion Builds a GET_LBA_STATUS command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param dataBuffer a pointer to a valid IOMemoryDescriptor in which the received + status data is to be stored. + @param LOGICAL_BLOCK_ADDRESS used to specify the logical block address + from which the get status is to be initiated. + @param ALLOCATION_LENGTH used to specify the maximum requested amount of status data. + @param CONTROL the CONTROL byte to use for the command. + @result true if the command was successfully built and false otherwise. + */ + bool GET_LBA_STATUS ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField8Byte LOGICAL_BLOCK_ADDRESS, + SCSICmdField4Byte ALLOCATION_LENGTH, + SCSICmdField1Byte CONTROL ); + + /*! + @function READ_10 + @abstract Builds a READ (10) command. + @discussion Builds a READ (10) command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param dataBuffer a pointer to a valid IOMemoryDescriptor in which the read data is to be stored. + @param blockSize used to specify the block size to be used for the read. + @param DPO the value of the disable page out bit to set in the command. + @param FUA the value of the force unit access bit to set in the command. + @param RELADR the value of the relative address bit to set in the command. + @param LOGICAL_BLOCK_ADDRESS used to specify the logical block address from which the read is to be initiated. + @param TRANSFER_LENGTH the desired transfer length in blocks. + @param CONTROL the CONTROL byte to use for the command. + @result true if the command was successfully built and false otherwise. + */ + virtual bool READ_10 ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + UInt32 blockSize, + SCSICmdField1Bit DPO, + SCSICmdField1Bit FUA, + SCSICmdField1Bit RELADR, + SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS, + SCSICmdField2Byte TRANSFER_LENGTH, + SCSICmdField1Byte CONTROL ); + + // Defined in SBC-2 section 5.10 + /*! + @function READ_10 + @abstract Builds a READ (10) command. + @discussion Builds a READ (10) command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param dataBuffer a pointer to a valid IOMemoryDescriptor in which the read data is to be stored. + @param blockSize used to specify the block size to be used for the read. + @param RDPROTECT the value of the read protect field to set in the command. + @param DPO the value of the disable page out bit to set in the command. + @param FUA the value of the force unit access bit to set in the command. + @param FUA_NV the value of the force unit access bit to set in the command. + @param LOGICAL_BLOCK_ADDRESS used to specify the logical block address from which the read is to be initiated. + @param GROUP_NUMBER the value of the grouping function group number to set in the command. + @param TRANSFER_LENGTH the desired transfer length in blocks. + @param CONTROL the CONTROL byte to use for the command. + @result true if the command was successfully built and false otherwise. + */ + bool READ_10 ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + UInt32 blockSize, + SCSICmdField3Bit RDPROTECT, + SCSICmdField1Bit DPO, + SCSICmdField1Bit FUA, + SCSICmdField1Bit FUA_NV, + SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS, + SCSICmdField6Bit GROUP_NUMBER, + SCSICmdField2Byte TRANSFER_LENGTH, + SCSICmdField1Byte CONTROL ); + + /*! + @function READ_12 + @abstract Builds a READ (12) command. + @discussion Builds a READ (12) command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param dataBuffer a pointer to a valid IOMemoryDescriptor in which the read data is to be stored. + @param blockSize used to specify the block size to be used for the read. + @param DPO the value of the disable page out bit to set in the command. + @param FUA the value of the force unit access bit to set in the command. + @param RELADR the value of the relative address bit to set in the command. + @param LOGICAL_BLOCK_ADDRESS used to specify the logical block address from which the read is to be initiated. + @param TRANSFER_LENGTH the desired transfer length in blocks. + @param CONTROL the CONTROL byte to use for the command. + @return true if the command was successfully built and false otherwise. + */ + virtual bool READ_12 ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + UInt32 blockSize, + SCSICmdField1Bit DPO, + SCSICmdField1Bit FUA, + SCSICmdField1Bit RELADR, + SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS, + SCSICmdField4Byte TRANSFER_LENGTH, + SCSICmdField1Byte CONTROL ); + + // Defined in SBC-2 section 5.11 + /*! + @function READ_12 + @abstract Builds a READ (12) command. + @discussion Builds a READ (12) command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param dataBuffer a pointer to a valid IOMemoryDescriptor in which the read data is to be stored. + @param blockSize used to specify the block size to be used for the read. + @param RDPROTECT the value of the read protect field to set in the command. + @param DPO the value of the disable page out bit to set in the command. + @param FUA the value of the force unit access bit to set in the command. + @param FUA_NV the value of the force unit access bit to set in the command. + @param LOGICAL_BLOCK_ADDRESS used to specify the logical block address from which the read is to be initiated. + @param TRANSFER_LENGTH the desired transfer length in blocks. + @param GROUP_NUMBER the value of the grouping function group number to set in the command. + @param CONTROL the CONTROL byte to use for the command. + @return true if the command was successfully built and false otherwise. + */ + bool READ_12 ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + UInt32 blockSize, + SCSICmdField3Bit RDPROTECT, + SCSICmdField1Bit DPO, + SCSICmdField1Bit FUA, + SCSICmdField1Bit FUA_NV, + SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS, + SCSICmdField4Byte TRANSFER_LENGTH, + SCSICmdField6Bit GROUP_NUMBER, + SCSICmdField1Byte CONTROL ); + + /*! + @function READ_16 + @abstract Builds a READ (16) command. + @discussion Builds a READ (16) command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param dataBuffer a pointer to a valid IOMemoryDescriptor in which the read data is to be stored. + @param blockSize used to specify the block size to be used for the read. + @param RDPROTECT the value of the read protect field to set in the command. + @param DPO the value of the disable page out bit to set in the command. + @param FUA the value of the force unit access bit to set in the command. + @param FUA_NV the value of the force unit access bit to set in the command. + @param LOGICAL_BLOCK_ADDRESS used to specify the logical block address from which the read is to be initiated. + @param TRANSFER_LENGTH the desired transfer length in blocks. + @param GROUP_NUMBER the value of the grouping function group number to set in the command. + @param CONTROL the CONTROL byte to use for the command. + @return true if the command was successfully built and false otherwise. + */ + bool READ_16 ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + UInt32 blockSize, + SCSICmdField3Bit RDPROTECT, + SCSICmdField1Bit DPO, + SCSICmdField1Bit FUA, + SCSICmdField1Bit FUA_NV, + SCSICmdField8Byte LOGICAL_BLOCK_ADDRESS, + SCSICmdField4Byte TRANSFER_LENGTH, + SCSICmdField6Bit GROUP_NUMBER, + SCSICmdField1Byte CONTROL ); + + /*! + @function READ_CAPACITY + @abstract Builds a READ CAPACITY command. + @discussion Builds a READ CAPACITY command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param dataBuffer a pointer to a valid IOMemoryDescriptor in which the read capacity data is to be stored. + @param RELADR the value of the relative address bit to set in the command. + @param LOGICAL_BLOCK_ADDRESS used to specify the logical block address from which + the read capacity is to be initiated. + @param PMI the value of the partial medium indicator bit to set in the command. + @param CONTROL the CONTROL byte to use for the command. + @return true if the command was successfully built and false otherwise. + */ + virtual bool READ_CAPACITY ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField1Bit RELADR, + SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS, + SCSICmdField1Bit PMI, + SCSICmdField1Byte CONTROL ); + + /*! + @function READ_CAPACITY_16 + @abstract Builds a READ CAPACITY (16) command. + @discussion Builds a READ CAPACITY (16) command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param dataBuffer a pointer to a valid IOMemoryDescriptor in which the read capacity data is to be stored. + @param LOGICAL_BLOCK_ADDRESS used to specify the logical block address from which + the read capacity is to be initiated. + @param ALLOCATION_LENGTH used to specify the maximum requested amount of read data. + @param PMI the value of the partial medium indicator bit to set in the command. + @param CONTROL the CONTROL byte to use for the command. + @return true if the command was successfully built and false otherwise. + */ + bool READ_CAPACITY_16 ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField8Byte LOGICAL_BLOCK_ADDRESS, + SCSICmdField4Byte ALLOCATION_LENGTH, + SCSICmdField1Bit PMI, + SCSICmdField1Byte CONTROL ); + + /*! + @function REPORT_PROVISIONING_INITIALIZATION_PATTERN + @abstract Builds a REPORT_PROVISIONING_INITIALIZATION_PATTERN command. + @discussion Builds a REPORT_PROVISIONING_INITIALIZATION_PATTERN command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param dataBuffer a pointer to a valid IOMemoryDescriptor in which the + provisioning initialization pattern data is to be stored. + @param ALLOCATION_LENGTH used to specify the maximum requested amount of provisioning data. + @param CONTROL the CONTROL byte to use for the command. + @return true if the command was successfully built and false otherwise. + */ + bool REPORT_PROVISIONING_INITIALIZATION_PATTERN ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField4Byte ALLOCATION_LENGTH, + SCSICmdField1Byte CONTROL ); + + /*! + @function START_STOP_UNIT + @abstract Builds a START STOP UNIT command. + @discussion Builds a START STOP UNIT command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param IMMED the value of the immediate bit to set in the command. + @param POWER_CONDITIONS used to specify the desired POWER CONDITIONS code. + @param LOEJ used to specify whether or not the LOAD/EJECT ( LEOJ ) bit for the command needs to be set. + @param START the value of the START bit to set in the command. + @param CONTROL the CONTROL byte to use for the command. + @return true if the command was successfully built and false otherwise. + */ + virtual bool START_STOP_UNIT ( + SCSITaskIdentifier request, + SCSICmdField1Bit IMMED, + SCSICmdField4Bit POWER_CONDITIONS, + SCSICmdField1Bit LOEJ, + SCSICmdField1Bit START, + SCSICmdField1Byte CONTROL ); + + /*! + @function SYNCHRONIZE_CACHE + @abstract Builds a SYNCHRONIZE CACHE command. + @discussion Builds a SYNCHRONIZE CACHE command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param IMMED the value of the immediate bit to set in the command. + @param RELADR the value of the relative address bit to set in the command. + @param LOGICAL_BLOCK_ADDRESS used to specify the logical block address from which + the synchronize cache is to be initiated. + @param NUMBER_OF_BLOCKS the number of blocks to synchronize. + @param CONTROL the CONTROL byte to use for the command. + @return true if the command was successfully built and false otherwise. + */ + virtual bool SYNCHRONIZE_CACHE ( + SCSITaskIdentifier request, + SCSICmdField1Bit IMMED, + SCSICmdField1Bit RELADR, + SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS, + SCSICmdField2Byte NUMBER_OF_BLOCKS, + SCSICmdField1Byte CONTROL ); + + // Defined in SBC-2 section 5.22 + /*! + @function SYNCHRONIZE_CACHE + @abstract Builds a SYNCHRONIZE CACHE command. + @discussion Builds a SYNCHRONIZE CACHE command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param IMMED the value of the immediate bit to set in the command. + @param SYNC_NV used to specify whether or not the synchronize non-volatile bit for the command needs to be set. + @param LOGICAL_BLOCK_ADDRESS used to specify the logical block address from which + the synchronize cache is to be initiated. + @param GROUP_NUMBER the value of the grouping function group number to set in the command. + @param NUMBER_OF_BLOCKS the number of blocks to synchronize. + @param CONTROL the CONTROL byte to use for the command. + @return true if the command was successfully built and false otherwise. + */ + bool SYNCHRONIZE_CACHE ( + SCSITaskIdentifier request, + SCSICmdField1Bit IMMED, + SCSICmdField1Bit SYNC_NV, + SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS, + SCSICmdField6Bit GROUP_NUMBER, + SCSICmdField2Byte NUMBER_OF_BLOCKS, + SCSICmdField1Byte CONTROL ); + + /*! + @function SYNCRONIZE_CACHE_16 + @abstract Builds a SYNCHRONIZE CACHE (16) command. + @discussion Builds a SYNCHRONIZE CACHE (16) command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param SYNC_NV used to specify whether or not the synchronize non-volatile bit for the command needs to be set. + @param IMMED the value of the immediate bit to set in the command. + @param LOGICAL_BLOCK_ADDRESS used to specify the logical block address from which + the synchronize cache is to be initiated. + @param NUMBER_OF_BLOCKS the number of blocks to synchronize. + @param GROUP_NUMBER the value of the grouping function group number to set in the command. + @param CONTROL the CONTROL byte to use for the command. + @return true if the command was successfully built and false otherwise. + */ + bool SYNCRONIZE_CACHE_16 ( + SCSITaskIdentifier request, + SCSICmdField1Bit SYNC_NV, + SCSICmdField1Bit IMMED, + SCSICmdField8Byte LOGICAL_BLOCK_ADDRESS, + SCSICmdField4Byte NUMBER_OF_BLOCKS, + SCSICmdField6Bit GROUP_NUMBER, + SCSICmdField1Byte CONTROL ); + + /*! + @function UNMAP + @abstract Builds a UNMAP command. + @discussion Builds a UNMAP command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param dataBuffer a pointer to a valid IOMemoryDescriptor in which the + parameter list data is supplied. + @param ANCHOR the value of the anchor bit to set in the command. + @param GROUP_NUMBER the value of the grouping function group number to set in the command. + @param PARAMETER_LIST_LENGTH the length of the supplied parameter list data buffer in bytes. + @param CONTROL the CONTROL byte to use for the command. + @return true if the command was successfully built and false otherwise. + */ + bool UNMAP ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField1Bit ANCHOR, + SCSICmdField6Bit GROUP_NUMBER, + SCSICmdField2Byte PARAMETER_LIST_LENGTH, + SCSICmdField1Byte CONTROL ); + + /*! + @function WRITE_10 + @abstract Builds a WRITE (10) command. + @discussion Builds a WRITE (10) command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param dataBuffer a pointer to a valid IOMemoryDescriptor in which the data to be written is stored. + @param blockSize used to specify the block size to be used for the write. + @param DPO the value of the disable page out bit to set in the command. + @param FUA the value of the force unit access bit to set in the command. + @param EBP the value of the erase by pass bit to set in the command. + @param RELADR the value of the relative address bit to set in the command. + @param LOGICAL_BLOCK_ADDRESS used to specify the logical block address from which the write is to be initiated. + @param TRANSFER_LENGTH the desired transfer length in blocks. + @param CONTROL the CONTROL byte to use for the command. + @return true if the command was successfully built and false otherwise. + */ + virtual bool WRITE_10 ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + UInt32 blockSize, + SCSICmdField1Bit DPO, + SCSICmdField1Bit FUA, + SCSICmdField1Bit EBP, + SCSICmdField1Bit RELADR, + SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS, + SCSICmdField2Byte TRANSFER_LENGTH, + SCSICmdField1Byte CONTROL ); + + // Defined in SBC-2 section 5.29 + /*! + @function WRITE_10 + @abstract Builds a WRITE (10) command. + @discussion Builds a WRITE (10) command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param dataBuffer a pointer to a valid IOMemoryDescriptor in which the data to be written is stored. + @param blockSize used to specify the block size to be used for the write. + @param WRPROTECT the value of the write protect field to set in the command. + @param DPO the value of the disable page out bit to set in the command. + @param FUA the value of the force unit access bit to set in the command. + @param FUA_NV the value of the force unit access bit to set in the command. + @param LOGICAL_BLOCK_ADDRESS used to specify the logical block address from which the write is to be initiated. + @param GROUP_NUMBER the value of the grouping function group number to set in the command. + @param TRANSFER_LENGTH the desired transfer length in blocks. + @param CONTROL the CONTROL byte to use for the command. + @return true if the command was successfully built and false otherwise. + */ + bool WRITE_10 ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + UInt32 blockSize, + SCSICmdField3Bit WRPROTECT, + SCSICmdField1Bit DPO, + SCSICmdField1Bit FUA, + SCSICmdField1Bit FUA_NV, + SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS, + SCSICmdField6Bit GROUP_NUMBER, + SCSICmdField2Byte TRANSFER_LENGTH, + SCSICmdField1Byte CONTROL ); + + /*! + @function WRITE_12 + @abstract Builds a WRITE (12) command. + @discussion Builds a WRITE (12) command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param dataBuffer a pointer to a valid IOMemoryDescriptor in which the data to be written is stored. + @param blockSize used to specify the block size to be used for the write. + @param DPO the value of the disable page out bit to set in the command. + @param FUA the value of the force unit access bit to set in the command. + @param EBP the value of the erase by pass bit to set in the command. + @param RELADR the value of the relative address bit to set in the command. + @param LOGICAL_BLOCK_ADDRESS used to specify the logical block address from which the write is to be initiated. + @param TRANSFER_LENGTH the desired transfer length in blocks. + @param CONTROL the CONTROL byte to use for the command. + @return true if the command was successfully built and false otherwise. + */ + virtual bool WRITE_12 ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + UInt32 blockSize, + SCSICmdField1Bit DPO, + SCSICmdField1Bit FUA, + SCSICmdField1Bit EBP, + SCSICmdField1Bit RELADR, + SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS, + SCSICmdField4Byte TRANSFER_LENGTH, + SCSICmdField1Byte CONTROL ); + + // Defined in SBC-2 section 5.30 + /*! + @function WRITE_12 + @abstract Builds a WRITE (12) command. + @discussion Builds a WRITE (12) command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param dataBuffer a pointer to a valid IOMemoryDescriptor in which the data to be written is stored. + @param blockSize used to specify the block size to be used for the write. + @param WRPROTECT the value of the write protect field to set in the command. + @param DPO the value of the disable page out bit to set in the command. + @param FUA the value of the force unit access bit to set in the command. + @param FUA_NV the value of the force unit access bit to set in the command. + @param LOGICAL_BLOCK_ADDRESS used to specify the logical block address from which the write is to be initiated. + @param GROUP_NUMBER the value of the grouping function group number to set in the command. + @param TRANSFER_LENGTH the desired transfer length in blocks. + @param CONTROL the CONTROL byte to use for the command. + @return true if the command was successfully built and false otherwise. + */ + bool WRITE_12 ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + UInt32 blockSize, + SCSICmdField3Bit WRPROTECT, + SCSICmdField1Bit DPO, + SCSICmdField1Bit FUA, + SCSICmdField1Bit FUA_NV, + SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS, + SCSICmdField6Bit GROUP_NUMBER, + SCSICmdField4Byte TRANSFER_LENGTH, + SCSICmdField1Byte CONTROL ); + + /*! + @function WRITE_16 + @abstract Builds a WRITE (16) command. + @discussion Builds a WRITE (16) command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param dataBuffer a pointer to a valid IOMemoryDescriptor in which the data to be written is stored. + @param blockSize used to specify the block size to be used for the write. + @param WRPROTECT the value of the write protect field to set in the command. + @param DPO the value of the disable page out bit to set in the command. + @param FUA the value of the force unit access bit to set in the command. + @param FUA_NV the value of the force unit access bit to set in the command. + @param LOGICAL_BLOCK_ADDRESS used to specify the logical block address from which the write is to be initiated. + @param TRANSFER_LENGTH the desired transfer length in blocks. + @param GROUP_NUMBER the value of the grouping function group number to set in the command. + @param CONTROL the CONTROL byte to use for the command. + @return true if the command was successfully built and false otherwise. + */ + bool WRITE_16 ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + UInt32 blockSize, + SCSICmdField3Bit WRPROTECT, + SCSICmdField1Bit DPO, + SCSICmdField1Bit FUA, + SCSICmdField1Bit FUA_NV, + SCSICmdField8Byte LOGICAL_BLOCK_ADDRESS, + SCSICmdField4Byte TRANSFER_LENGTH, + SCSICmdField6Bit GROUP_NUMBER, + SCSICmdField1Byte CONTROL ); + + /*! + @function WRITE_SAME_10 + @abstract Builds a WRITE SAME (10) command. + @discussion Builds a WRITE SAME (10) command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param buffer a pointer to a valid IOMemoryDescriptor in which the data to be written is stored. + @param requestBlockSize used to specify the block size to be used for the write. + @param WRPROTECT the value of the write protect field to set in the command. + @param ANCHOR the value of the anchor bit to set in the command. + @param UNMAP the value of the unmap bit to set in the command. + @param startBlock Starting logical block address for the write or unmap operation. + @param GROUP_NUMBER the value of the grouping function group number to set in the command. + @param blockCount The number of blocks to write or unmap. + @param CONTROL the CONTROL byte to use for the command. + @return true if the command was successfully built and false otherwise. + */ + bool WRITE_SAME_10 ( + SCSITaskIdentifier request, + IOMemoryDescriptor * buffer, + UInt32 requestBlockSize, + SCSICmdField3Bit WRPROTECT, + SCSICmdField1Bit ANCHOR, + SCSICmdField1Bit UNMAP, + SCSICmdField4Byte startBlock, + SCSICmdField6Bit GROUP_NUMBER, + SCSICmdField2Byte blockCount, + SCSICmdField1Byte CONTROL ); + + /*! + @function WRITE_SAME_16 + @abstract Builds a WRITE SAME (16) command. + @discussion Builds a WRITE SAME (16) command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param buffer a pointer to a valid IOMemoryDescriptor in which the data to be written is stored. + @param requestBlockSize used to specify the block size to be used for the write. + @param WRPROTECT the value of the write protect field to set in the command. + @param ANCHOR the value of the anchor bit to set in the command. + @param UNMAP the value of the unmap bit to set in the command. + @param NDOB used to specify whether or not the no data-out buffer bit for the command needs to be set. + @param startBlock Starting logical block address for the write or unmap operation. + @param blockCount The number of blocks to write or unmap. + @param GROUP_NUMBER the value of the grouping function group number to set in the command. + @param CONTROL the CONTROL byte to use for the command. + @return true if the command was successfully built and false otherwise. + */ + bool WRITE_SAME_16 ( + SCSITaskIdentifier request, + IOMemoryDescriptor * buffer, + UInt32 requestBlockSize, + SCSICmdField3Bit WRPROTECT, + SCSICmdField1Bit ANCHOR, + SCSICmdField1Bit UNMAP, + SCSICmdField1Bit NDOB, + SCSICmdField8Byte startBlock, + SCSICmdField4Byte blockCount, + SCSICmdField6Bit GROUP_NUMBER, + SCSICmdField1Byte CONTROL ); + + /* Added with 10.2 */ + OSMetaClassDeclareReservedUsed ( IOSCSIBlockCommandsDevice, 1 ); + +public: + + /*! + @function PowerDownHandler + @abstract Method called at sleep, restart, or shutdown time. + @discussion Notification handler registered with registerPrioritySleepWakeInterest(). + @param refCon a pointer to an object which can be determined by the implementer when + registerPrioritySleepWakeInterest() is called. + @param messageType a constant defined in IOMessage.h ( kIOMessageSystemWillPowerOff, kIOMessageSystemWillRestart, etc. ). + @param provider a pointer to the provider of the notification. + @param messageArgument a pointer to the notification's argument. + @param argSize the size of the argument. + @result A valid IOReturn value. + */ + virtual IOReturn PowerDownHandler ( void * refCon, + UInt32 messageType, + IOService * provider, + void * messageArgument, + vm_size_t argSize ); + + + /* Added with 10.2 */ + OSMetaClassDeclareReservedUsed ( IOSCSIBlockCommandsDevice, 2 ); + +protected: + + /*! + @function SetMediumIcon + @abstract Sets graphical icon for device's medium objects. + @discussion Provides an opportunity for the driver to select a more fitting icon then default icon. + */ + virtual void SetMediumIcon ( void ); + + + /* Added with 10.3.3 */ + OSMetaClassDeclareReservedUsed ( IOSCSIBlockCommandsDevice, 3 ); + +protected: + + /*! + @function AsyncReadWriteCompletion + @abstract Completion routine for asynchronous read and write requests. + @discussion Completion routine for asynchronous read and write requests. + @param completedTask the task from which to extract the client data to inspect. + */ + virtual void AsyncReadWriteCompletion ( SCSITaskIdentifier completedTask ); + + + /* Added with 10.6.0 */ + OSMetaClassDeclareReservedUsed ( IOSCSIBlockCommandsDevice, 4 ); + +public: + + /*! + @function AsyncReadWrite + @abstract Translates an asynchronous I/O request into a read or a write. + @discussion Translates an asynchronous I/O request into a read or a write. + @param buffer A pointer to a valid IOMemoryDescriptor to which the + data can be copied to or from. + @param startBlock Starting logical block address for the write operation. + @param blockCount The number of block to be write. + @param blockSize used to specify the block size to be used for the read or write. + @param attributes used to set the attributes of the read or write. + Currently only used to set kIOStorageOptionForceUnitAccess. + @param clientData A valid pointer to the client data to be used for callback completion. + @result A valid IOReturn value. + */ + virtual IOReturn AsyncReadWrite ( + IOMemoryDescriptor * buffer, + UInt64 startBlock, + UInt64 blockCount, + UInt64 blockSize, + IOStorageAttributes * attributes, + void * clientData ); + + OSMetaClassDeclareReservedUsed ( IOSCSIBlockCommandsDevice, 5 ); + + /*! + @function Unmap + @abstract Unmap the given extents. + @discussion Unmap the given extents. + @param extents a list of extents to unmap. + @param ExtentsCount the count of extents in extents. + @result A valid IOReturn value. + */ + virtual IOReturn Unmap ( IOBlockStorageDeviceExtent * extents, + UInt32 ExtentsCount ); + + OSMetaClassDeclareReservedUsed ( IOSCSIBlockCommandsDevice, 6 ); + + /*! + @function WriteSame + @abstract Write or unmap the given extent. + @discussion Write or unmap the given extent. + @param buffer a pointer to a valid IOMemoryDescriptor in which the data to be written is stored. + @param startBlock Starting logical block address for the write or unmap operation. + @param blockCount The number of blocks to write or unmap. + @param writeSameOptions the command options to pass to WRITE_SAME. + @param requestBlockSize used to specify the block size to be used for the write. + @result A valid IOReturn value. + */ + virtual IOReturn WriteSame ( + IOMemoryDescriptor * buffer, + UInt64 startBlock, + UInt64 blockCount, + UInt8 writeSameOptions, + UInt32 requestBlockSize ); + + OSMetaClassDeclareReservedUsed ( IOSCSIBlockCommandsDevice, 7 ); + + /*! + @function GetProvisionStatus + @abstract Get the block provision status. + @discussion Get the block provision status. + @param block Starting logical block address for the status operation. + @param nblks The number of blocks. + @param extentsCount the count of extents in extents. + @param extents a list of extents to unmap. + @result A valid IOReturn value. + */ + virtual IOReturn GetProvisionStatus ( UInt64 block, + UInt64 nblks, + UInt32 * extentsCount, + IOBlockStorageProvisionDeviceExtent * extents ); + + +private: + +#if !TARGET_OS_IPHONE + // Space reserved for future expansion. + OSMetaClassDeclareReservedUnused ( IOSCSIBlockCommandsDevice, 8 ); + OSMetaClassDeclareReservedUnused ( IOSCSIBlockCommandsDevice, 9 ); + OSMetaClassDeclareReservedUnused ( IOSCSIBlockCommandsDevice, 10 ); + OSMetaClassDeclareReservedUnused ( IOSCSIBlockCommandsDevice, 11 ); + OSMetaClassDeclareReservedUnused ( IOSCSIBlockCommandsDevice, 12 ); + OSMetaClassDeclareReservedUnused ( IOSCSIBlockCommandsDevice, 13 ); + OSMetaClassDeclareReservedUnused ( IOSCSIBlockCommandsDevice, 14 ); + OSMetaClassDeclareReservedUnused ( IOSCSIBlockCommandsDevice, 15 ); + OSMetaClassDeclareReservedUnused ( IOSCSIBlockCommandsDevice, 16 ); +#endif /* !TARGET_OS_IPHONE */ + +}; + +#endif /* defined(KERNEL) && defined(__cplusplus) */ + +#endif /* _IOKIT_IO_SCSI_BLOCK_COMMANDS_DEVICE_H_ */ diff --git a/QualcommWireless/include/IOKit/scsi/IOSCSIMultimediaCommandsDevice.h b/QualcommWireless/include/IOKit/scsi/IOSCSIMultimediaCommandsDevice.h new file mode 100644 index 0000000..0aa05a2 --- /dev/null +++ b/QualcommWireless/include/IOKit/scsi/IOSCSIMultimediaCommandsDevice.h @@ -0,0 +1,831 @@ +/* + * Copyright (c) 1998-2009 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#ifndef _IOKIT_IO_SCSI_MULTIMEDIA_COMMANDS_DEVICE_H_ +#define _IOKIT_IO_SCSI_MULTIMEDIA_COMMANDS_DEVICE_H_ + +#if KERNEL +#include +#else +#include +#endif + +#include + +// Build includes +#include + + +//----------------------------------------------------------------------------- +// Constants +//----------------------------------------------------------------------------- + + +// Message constants +#define kIOMessageTrayStateChange 0x69000035 +#define kIOMessageTrayStateHasChanged kIOMessageTrayStateChange // DEPRECATED, use kIOMessageTrayStateChange instead + +// Message values for kIOMessageTrayStateChange +enum +{ + kMessageTrayStateChangeRequestAccepted = 0, + kMessageTrayStateChangeRequestRejected = 1 +}; + +#define kIOMessageMediaAccessChange 0x69000036 + +// Message values for kIOMessageMediaAccessChange +enum +{ + kMessageDeterminingMediaPresence = 0, + kMessageFoundMedia = 1, + kMessageMediaTypeDetermined = 2 +}; + +// IOKit property keys and constants +#define kIOPropertySupportedCDFeatures kIOPropertySupportedCDFeaturesKey +#define kIOPropertySupportedDVDFeatures kIOPropertySupportedDVDFeaturesKey +#define kIOPropertySupportedBDFeatures kIOPropertySupportedBDFeaturesKey +#define kIOPropertyLowPowerPolling "Low Power Polling" + +typedef UInt32 CDFeatures; +enum +{ + kCDFeaturesAnalogAudioBit = 0, // Analog Audio playback + kCDFeaturesReadStructuresBit = 1, // CD-ROM + kCDFeaturesWriteOnceBit = 2, // CD-R + kCDFeaturesReWriteableBit = 3, // CD-R/W + kCDFeaturesCDDAStreamAccurateBit = 4, // CD-DA stream accurate + kCDFeaturesPacketWriteBit = 5, // Packet Writing + kCDFeaturesTAOWriteBit = 6, // CD Track At Once + kCDFeaturesSAOWriteBit = 7, // CD Mastering - Session At Once + kCDFeaturesRawWriteBit = 8, // CD Mastering - Raw + kCDFeaturesTestWriteBit = 9, // CD Mastering/TAO - Test Write + kCDFeaturesBUFWriteBit = 10 // CD Mastering/TAO - Buffer Underrun Free +}; + +enum +{ + kCDFeaturesAnalogAudioMask = (1 << kCDFeaturesAnalogAudioBit), + kCDFeaturesReadStructuresMask = (1 << kCDFeaturesReadStructuresBit), + kCDFeaturesWriteOnceMask = (1 << kCDFeaturesWriteOnceBit), + kCDFeaturesReWriteableMask = (1 << kCDFeaturesReWriteableBit), + kCDFeaturesCDDAStreamAccurateMask = (1 << kCDFeaturesCDDAStreamAccurateBit), + kCDFeaturesPacketWriteMask = (1 << kCDFeaturesPacketWriteBit), + kCDFeaturesTAOWriteMask = (1 << kCDFeaturesTAOWriteBit), + kCDFeaturesSAOWriteMask = (1 << kCDFeaturesSAOWriteBit), + kCDFeaturesRawWriteMask = (1 << kCDFeaturesRawWriteBit), + kCDFeaturesTestWriteMask = (1 << kCDFeaturesTestWriteBit), + kCDFeaturesBUFWriteMask = (1 << kCDFeaturesBUFWriteBit) +}; + +typedef UInt32 DVDFeatures; +enum +{ + kDVDFeaturesCSSBit = 0, // DVD-CSS + kDVDFeaturesReadStructuresBit = 1, // DVD-ROM + kDVDFeaturesWriteOnceBit = 2, // DVD-R + kDVDFeaturesRandomWriteableBit = 3, // DVD-RAM + kDVDFeaturesReWriteableBit = 4, // DVD-RW + kDVDFeaturesTestWriteBit = 5, // DVD-R Write - Test Write + kDVDFeaturesBUFWriteBit = 6, // DVD-R Write - Buffer Underrun Free + kDVDFeaturesPlusRBit = 7, // DVD+R + kDVDFeaturesPlusRWBit = 8, // DVD+RW (implies backgound format support) + kDVDFeaturesHDReadBit = 9, // HD DVD-ROM + kDVDFeaturesHDRBit = 10, // HD DVD-R + kDVDFeaturesHDRAMBit = 11, // HD DVD-RAM + kDVDFeaturesHDRWBit = 12 // HD DVD-RW +}; + +enum +{ + kDVDFeaturesCSSMask = (1 << kDVDFeaturesCSSBit), + kDVDFeaturesReadStructuresMask = (1 << kDVDFeaturesReadStructuresBit), + kDVDFeaturesWriteOnceMask = (1 << kDVDFeaturesWriteOnceBit), + kDVDFeaturesRandomWriteableMask = (1 << kDVDFeaturesRandomWriteableBit), + kDVDFeaturesReWriteableMask = (1 << kDVDFeaturesReWriteableBit), + kDVDFeaturesTestWriteMask = (1 << kDVDFeaturesTestWriteBit), + kDVDFeaturesBUFWriteMask = (1 << kDVDFeaturesBUFWriteBit), + kDVDFeaturesPlusRMask = (1 << kDVDFeaturesPlusRBit), + kDVDFeaturesPlusRWMask = (1 << kDVDFeaturesPlusRWBit), + kDVDFeaturesHDReadMask = (1 << kDVDFeaturesHDReadBit), + kDVDFeaturesHDRMask = (1 << kDVDFeaturesHDRBit), + kDVDFeaturesHDRAMMask = (1 << kDVDFeaturesHDRAMBit), + kDVDFeaturesHDRWMask = (1 << kDVDFeaturesHDRWBit) +}; + +typedef UInt32 BDFeatures; +enum +{ + kBDFeaturesReadBit = 0, // BD-ROM + kBDFeaturesWriteBit = 1 // BD-R / BD-RE +}; + +enum +{ + kBDFeaturesReadMask = (1 << kBDFeaturesReadBit), + kBDFeaturesWriteMask = (1 << kBDFeaturesWriteBit) +}; + +enum +{ + kDiscStatusEmpty = 0, + kDiscStatusIncomplete = 1, + kDiscStatusComplete = 2, + kDiscStatusOther = 3, + kDiscStatusMask = 0x03, + kDiscStatusErasableMask = 0x10 +}; + + +#if defined(KERNEL) && defined(__cplusplus) + +// MMC power states as defined in T10:1228D SCSI Multimedia Commands - 2 (MMC-2) +// Revision 11a, August 30, 1999, page 312 (Annex F). +enum +{ + kMMCPowerStateSystemSleep = 0, + kMMCPowerStateSleep = 1, + kMMCPowerStateStandby = 2, + kMMCPowerStateIdle = 3, + kMMCPowerStateActive = 4, + kMMCNumPowerStates = 5 +}; + +enum +{ + kMediaStateUnlocked = 0, + kMediaStateLocked = 1 +}; + + +//----------------------------------------------------------------------------- +// Includes +//----------------------------------------------------------------------------- + +// General IOKit headers +#include +#include + +// Generic IOKit storage related headers +#include +#include +#include + +// SCSI Architecture Model Family includes +#include + +// Forward definitions for internal use only classes +class SCSIMultimediaCommands; +class SCSIBlockCommands; + + +//----------------------------------------------------------------------------- +// Class Declaration +//----------------------------------------------------------------------------- + +class IOSCSIMultimediaCommandsDevice : public IOSCSIPrimaryCommandsDevice +{ + + OSDeclareAbstractStructors ( IOSCSIMultimediaCommandsDevice ) + +private: + + static void AsyncReadWriteComplete ( SCSITaskIdentifier completedTask ); + +protected: + + // Reserve space for future expansion. + struct IOSCSIMultimediaCommandsDeviceExpansionData + { + IONotifier * fPowerDownNotifier; + bool fDeviceSupportsPowerOff; + BDFeatures fSupportedBDFeatures; + bool fDeviceSupportsAsyncNotification; + bool fDeviceSupportsFastSpindown; + UInt8 fCDLoadingMechanism; + bool fDoNotLockMedia; + }; + IOSCSIMultimediaCommandsDeviceExpansionData * fIOSCSIMultimediaCommandsDeviceReserved; + + #define fPowerDownNotifier fIOSCSIMultimediaCommandsDeviceReserved->fPowerDownNotifier + #define fDeviceSupportsPowerOff fIOSCSIMultimediaCommandsDeviceReserved->fDeviceSupportsPowerOff + #define fSupportedBDFeatures fIOSCSIMultimediaCommandsDeviceReserved->fSupportedBDFeatures + #define fDeviceSupportsAsyncNotification fIOSCSIMultimediaCommandsDeviceReserved->fDeviceSupportsAsyncNotification + #define fDeviceSupportsFastSpindown fIOSCSIMultimediaCommandsDeviceReserved->fDeviceSupportsFastSpindown + #define fCDLoadingMechanism fIOSCSIMultimediaCommandsDeviceReserved->fCDLoadingMechanism + #define fDoNotLockMedia fIOSCSIMultimediaCommandsDeviceReserved->fDoNotLockMedia + + CDFeatures fSupportedCDFeatures; + DVDFeatures fSupportedDVDFeatures; + + UInt16 fCurrentDiscSpeed; + bool fMediaChanged; + bool fMediaPresent; + + // The byte count of each physical block on the media. + UInt32 fMediaBlockSize; + + // The total number of blocks of fMediaBlockSize on the media. + UInt32 fMediaBlockCount; + + // Flags used to indicate device feature + bool fMediaIsRemovable; + bool fMediaIsWriteProtected; + UInt32 fMediaType; + + thread_call_t fPollingThread; + bool fDeviceSupportsLowPowerPolling; + bool fLowPowerPollingEnabled; + UInt32 fPollingMode; + + enum + { + kPollingMode_Suspended = 0, + kPollingMode_NewMedia = 1, + kPollingMode_MediaRemoval = 2 + }; + + virtual IOReturn setProperties ( OSObject * properties ) APPLE_KEXT_OVERRIDE; + + virtual void CreateStorageServiceNub ( void ); + virtual bool DetermineDeviceCharacteristics ( void ); + virtual IOReturn DetermineIfMediaIsRemovable ( void ); + virtual IOReturn DetermineDeviceFeatures ( void ); + virtual void DetermineMediaType ( void ); + virtual bool CheckForDVDMediaType ( void ); + virtual bool CheckForCDMediaType ( void ); + virtual void PollForMedia ( void ); + virtual void EnablePolling ( void ); + virtual void DisablePolling ( void ); + virtual void CheckWriteProtection ( void ); + virtual bool ClearNotReadyStatus ( void ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn GetDeviceConfiguration ( void ); + virtual IOReturn GetDeviceConfigurationSize ( UInt32 * size ); + virtual IOReturn ParseFeatureList ( UInt32 numProfiles, UInt8 * firstFeaturePtr ); + + virtual IOReturn GetMechanicalCapabilities ( void ); + virtual IOReturn GetMechanicalCapabilitiesSize ( UInt32 * size ); + virtual IOReturn ParseMechanicalCapabilities ( UInt8 * mechanicalCapabilitiesPtr ); + + virtual IOReturn CheckForLowPowerPollingSupport ( void ); + virtual IOReturn GetCurrentPowerStateOfDrive ( UInt32 * powerState ); + + virtual IOReturn IssueRead ( IOMemoryDescriptor * buffer, + UInt64 startBlock, + UInt64 blockCount ); + + virtual IOReturn IssueRead ( IOMemoryDescriptor * buffer, + void * clientData, + UInt64 startBlock, + UInt64 blockCount ); + + virtual IOReturn IssueWrite ( IOMemoryDescriptor * buffer, + UInt64 startBlock, + UInt64 blockCount ); + + virtual IOReturn IssueWrite ( IOMemoryDescriptor * buffer, + void * clientData, + UInt64 startBlock, + UInt64 blockCount ); + + virtual void SetMediaCharacteristics ( UInt32 blockSize, UInt32 blockCount ); + virtual void ResetMediaCharacteristics ( void ); + + UInt8 ConvertBCDToHex ( UInt8 binaryCodedDigit ); + + // ------ User Client Support ------ + + virtual IOReturn HandleSetUserClientExclusivityState ( IOService * userClient, bool state ) APPLE_KEXT_OVERRIDE; + + // ----- Power Management Support ------ + + // We override this method to set our power states and register ourselves + // as a power policy maker. + virtual void InitializePowerManagement ( IOService * provider ) APPLE_KEXT_OVERRIDE; + + // We override this method so that when we register for power management, + // we go to our active power state (which the drive is definitely in + // at startup time). + virtual UInt32 GetInitialPowerState ( void ) APPLE_KEXT_OVERRIDE; + + // We override this method in order to provide the number of transitions + // from Fully active to Sleep state so that the idle timer can be adjusted + // to the appropriate time period based on the disk spindown time set in + // the Energy Saver prefs panel. + virtual UInt32 GetNumberOfPowerStateTransitions ( void ) APPLE_KEXT_OVERRIDE; + + // The TicklePowerManager method is called to tell the power manager that the + // device needs to be in a certain power state to handle requests. + virtual void TicklePowerManager ( void ) APPLE_KEXT_OVERRIDE; + + // The HandlePowerChange method is the state machine for power management. + // It is guaranteed to be on its own thread of execution (different from + // the power manager thread AND the workloop thread. This routine can + // send sync or async calls to the drive without worrying about threading + // issues. + virtual void HandlePowerChange ( void ) APPLE_KEXT_OVERRIDE; + + // The HandleCheckPowerState (void) method is on the serialized side of the command + // gate and can change member variables safely without multi-threading issues. + // It's main purpose is to call the superclass' HandleCheckPowerState ( UInt32 maxPowerState ) + // with the max power state the class registered with. + virtual void HandleCheckPowerState ( void ) APPLE_KEXT_OVERRIDE; + + // The CheckMediaPresence method is called to see if the media which we + // anticipated being there is still there. + virtual bool CheckMediaPresence ( void ); + + virtual bool InitializeDeviceSupport ( void ) APPLE_KEXT_OVERRIDE; + virtual void StartDeviceSupport ( void ) APPLE_KEXT_OVERRIDE; + virtual void SuspendDeviceSupport ( void ) APPLE_KEXT_OVERRIDE; + virtual void ResumeDeviceSupport ( void ) APPLE_KEXT_OVERRIDE; + virtual void StopDeviceSupport ( void ) APPLE_KEXT_OVERRIDE; + virtual void TerminateDeviceSupport ( void ) APPLE_KEXT_OVERRIDE; + + virtual void free ( void ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn VerifyDeviceState ( void ) APPLE_KEXT_OVERRIDE; + + +public: + + virtual IOReturn setAggressiveness ( unsigned long type, unsigned long minutes ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn SyncReadWrite ( IOMemoryDescriptor * buffer, + UInt64 startBlock, + UInt64 blockCount ); + + virtual IOReturn AsyncReadWrite ( IOMemoryDescriptor * buffer, + UInt64 block, + UInt64 nblks, + void * clientData ); + + virtual IOReturn EjectTheMedia ( void ); + virtual IOReturn GetTrayState ( UInt8 * trayState ); + virtual IOReturn SetTrayState ( UInt8 trayState ); + virtual IOReturn FormatMedia ( UInt64 byteCapacity ); + virtual UInt32 GetFormatCapacities ( UInt64 * capacities, + UInt32 capacitiesMaxCount ) const; + virtual IOReturn LockUnlockMedia ( bool doLock ); + virtual IOReturn SynchronizeCache ( void ); + virtual IOReturn ReportBlockSize ( UInt64 * blockSize ); + virtual IOReturn ReportEjectability ( bool * isEjectable ); + virtual IOReturn ReportLockability ( bool * isLockable ); + virtual IOReturn ReportPollRequirements ( bool * pollIsRequired, + bool * pollIsExpensive ); + virtual IOReturn ReportMaxReadTransfer ( UInt64 blockSize, + UInt64 * max ); + virtual IOReturn ReportMaxValidBlock ( UInt64 * maxBlock ); + virtual IOReturn ReportMaxWriteTransfer ( UInt64 blockSize, + UInt64 * max ); + virtual IOReturn ReportMediaState ( bool * mediaPresent, + bool * changed ); + virtual IOReturn ReportRemovability ( bool * isRemovable ); + virtual IOReturn ReportWriteProtection ( bool * isWriteProtected ); + + static void sPollForMedia ( void * pdtDriver, void * refCon ); + + /* CD Specific */ + virtual IOReturn SetMediaAccessSpeed ( UInt16 kilobytesPerSecond ); + + virtual IOReturn GetMediaAccessSpeed ( UInt16 * kilobytesPerSecond ); + + virtual IOReturn AsyncReadCD ( IOMemoryDescriptor * buffer, + UInt32 block, + UInt32 nblks, + CDSectorArea sectorArea, + CDSectorType sectorType, + void * clientData ); + + virtual IOReturn ReadISRC ( UInt8 track, CDISRC isrc ); + + virtual IOReturn ReadMCN ( CDMCN mcn); + + virtual IOReturn ReadTOC ( IOMemoryDescriptor * buffer ); + + /* DVD Specific */ + virtual UInt32 GetMediaType ( void ); + + virtual IOReturn ReportKey ( IOMemoryDescriptor * buffer, + const DVDKeyClass keyClass, + const UInt32 lba, + const UInt8 agid, + const DVDKeyFormat keyFormat ) __attribute__ ((deprecated)); + + virtual IOReturn SendKey ( IOMemoryDescriptor * buffer, + const DVDKeyClass keyClass, + const UInt8 agid, + const DVDKeyFormat keyFormat ); + + virtual IOReturn ReadDVDStructure ( IOMemoryDescriptor * buffer, + const UInt32 length, + const UInt8 structureFormat, + const UInt32 logicalBlockAddress, + const UInt8 layer, + const UInt8 agid ); + + // The block size decoding for Read CD and Read CD MSF as defined in table 255 + bool GetBlockSize ( + UInt32 * requestedByteCount, + SCSICmdField3Bit EXPECTED_SECTOR_TYPE, + SCSICmdField1Bit SYNC, + SCSICmdField2Bit HEADER_CODES, + SCSICmdField1Bit USER_DATA, + SCSICmdField1Bit EDC_ECC, + SCSICmdField2Bit ERROR_FIELD, + SCSICmdField3Bit SUBCHANNEL_SELECTION_BITS ); + + SCSICmdField4Byte ConvertMSFToLBA ( SCSICmdField3Byte MSF ); + + // The GET CONFIGURATION command as defined in section 6.1.4 + virtual bool GET_CONFIGURATION ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField2Bit RT, + SCSICmdField2Byte STARTING_FEATURE_NUMBER, + SCSICmdField2Byte ALLOCATION_LENGTH, + SCSICmdField1Byte CONTROL ); + + // The GET EVENT/STATUS NOTIFICATION command as defined in section 6.1.5 + virtual bool GET_EVENT_STATUS_NOTIFICATION ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField1Bit IMMED, + SCSICmdField1Byte NOTIFICATION_CLASS_REQUEST, + SCSICmdField2Byte ALLOCATION_LENGTH, + SCSICmdField1Byte CONTROL ); + + // The GET PERFORMANCE command as defined in section 6.1.6 + virtual bool GET_PERFORMANCE ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField2Bit TOLERANCE, + SCSICmdField1Bit WRITE, + SCSICmdField2Bit EXCEPT, + SCSICmdField4Byte STARTING_LBA, + SCSICmdField2Byte MAXIMUM_NUMBER_OF_DESCRIPTORS, + SCSICmdField1Byte CONTROL ); + + // The LOAD/UNLOAD MEDIUM command as defined in section 6.1.7 + virtual bool LOAD_UNLOAD_MEDIUM ( + SCSITaskIdentifier request, + SCSICmdField1Bit IMMED, + SCSICmdField1Bit LO_UNLO, + SCSICmdField1Bit START, + SCSICmdField1Byte SLOT, + SCSICmdField1Byte CONTROL ); + + // The MECHANISM STATUS command as defined in section 6.1.8 + virtual bool MECHANISM_STATUS ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField2Byte ALLOCATION_LENGTH, + SCSICmdField1Byte CONTROL ); + + virtual bool READ_10 ( + SCSITaskIdentifier request, + IOMemoryDescriptor *dataBuffer, + UInt32 blockSize, + SCSICmdField1Bit DPO, + SCSICmdField1Bit FUA, + SCSICmdField1Bit RELADR, + SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS, + SCSICmdField2Byte TRANSFER_LENGTH, + SCSICmdField1Byte CONTROL ); + + // The READ CD command as defined in section 6.1.15 + virtual bool READ_CD ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField3Bit EXPECTED_SECTOR_TYPE, + SCSICmdField1Bit RELADR, + SCSICmdField4Byte STARTING_LOGICAL_BLOCK_ADDRESS, + SCSICmdField3Byte TRANSFER_LENGTH, + SCSICmdField1Bit SYNC, + SCSICmdField2Bit HEADER_CODES, + SCSICmdField1Bit USER_DATA, + SCSICmdField1Bit EDC_ECC, + SCSICmdField2Bit ERROR_FIELD, + SCSICmdField3Bit SUBCHANNEL_SELECTION_BITS, + SCSICmdField1Byte CONTROL ); + + // The READ CD MSF command as defined in section 6.1.16 + virtual bool READ_CD_MSF ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField3Bit EXPECTED_SECTOR_TYPE, + SCSICmdField3Byte STARTING_MSF, + SCSICmdField3Byte ENDING_MSF, + SCSICmdField1Bit SYNC, + SCSICmdField2Bit HEADER_CODES, + SCSICmdField1Bit USER_DATA, + SCSICmdField1Bit EDC_ECC, + SCSICmdField2Bit ERROR_FIELD, + SCSICmdField3Bit SUBCHANNEL_SELECTION_BITS, + SCSICmdField1Byte CONTROL ); + + // The READ CAPACITY command as defined in section 6.1.17 + virtual bool READ_CAPACITY ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField1Bit RELADR, + SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS, + SCSICmdField1Bit PMI, + SCSICmdField1Byte CONTROL ); + + // The READ DISC INFORMATION command as defined in section 6.1.18 + virtual bool READ_DISC_INFORMATION ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField2Byte ALLOCATION_LENGTH, + SCSICmdField1Byte CONTROL ); + + // The READ DVD STRUCTURE command as defined in section 6.1.19 + virtual bool READ_DVD_STRUCTURE ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField4Byte ADDRESS, + SCSICmdField1Byte LAYER_NUMBER, + SCSICmdField1Byte FORMAT, + SCSICmdField2Byte ALLOCATION_LENGTH, + SCSICmdField2Bit AGID, + SCSICmdField1Byte CONTROL ); + + // The READ FORMAT CAPACITIES command as defined in section 6.1.20 + virtual bool READ_FORMAT_CAPACITIES ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField2Byte ALLOCATION_LENGTH, + SCSICmdField1Byte CONTROL ); + + // The READ SUB-CHANNEL command as defined in section 6.1.23 + virtual bool READ_SUB_CHANNEL ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField1Bit MSF, + SCSICmdField1Bit SUBQ, + SCSICmdField1Byte SUB_CHANNEL_PARAMETER_LIST, + SCSICmdField1Byte TRACK_NUMBER, + SCSICmdField2Byte ALLOCATION_LENGTH, + SCSICmdField1Byte CONTROL ); + + // The READ TOC/PMA/ATIP command as defined in section 6.1.24/25 + virtual bool READ_TOC_PMA_ATIP ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField1Bit MSF, + SCSICmdField4Bit FORMAT, + SCSICmdField1Byte TRACK_SESSION_NUMBER, + SCSICmdField2Byte ALLOCATION_LENGTH, + SCSICmdField1Byte CONTROL ); + + // The READ TRACK INFORMATION command as defined in section 6.1.26 + virtual bool READ_TRACK_INFORMATION ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField2Bit ADDRESS_NUMBER_TYPE, + SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS_TRACK_SESSION_NUMBER, + SCSICmdField2Byte ALLOCATION_LENGTH, + SCSICmdField1Byte CONTROL ); + + /*********************** LEGACY COMMAND SUPPORT ***********************/ + // The SET CD SPEED command as defined in section 6.1.36 + virtual bool SET_CD_SPEED ( + SCSITaskIdentifier request, + SCSICmdField2Byte LOGICAL_UNIT_READ_SPEED, + SCSICmdField2Byte LOGICAL_UNIT_WRITE_SPEED, + SCSICmdField1Byte CONTROL ); + /*********************** END LEGACY COMMAND SUPPORT ***********************/ + + // The SET READ AHEAD command as defined in section 6.1.37 + virtual bool SET_READ_AHEAD ( + SCSITaskIdentifier request, + SCSICmdField4Byte TRIGGER_LOGICAL_BLOCK_ADDRESS, + SCSICmdField4Byte READ_AHEAD_LOGICAL_BLOCK_ADDRESS, + SCSICmdField1Byte CONTROL ); + + // The SET STREAMING command as defined in section 6.1.38 + virtual bool SET_STREAMING ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField2Byte PARAMETER_LIST_LENGTH, + SCSICmdField1Byte CONTROL ); + + virtual bool START_STOP_UNIT ( + SCSITaskIdentifier request, + SCSICmdField1Bit IMMED, + SCSICmdField4Bit POWER_CONDITIONS, + SCSICmdField1Bit LOEJ, + SCSICmdField1Bit START, + SCSICmdField1Byte CONTROL ); + + // The SYNCHRONIZE CACHE command as defined in section 6.1.40 + virtual bool SYNCHRONIZE_CACHE ( + SCSITaskIdentifier request, + SCSICmdField1Bit IMMED, + SCSICmdField1Bit RELADR, + SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS, + SCSICmdField2Byte NUMBER_OF_BLOCKS, + SCSICmdField1Byte CONTROL ); + + // The WRITE (10) command as defined in section 6.1.41 + virtual bool WRITE_10 ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + UInt32 blockSize, + SCSICmdField1Bit DPO, + SCSICmdField1Bit FUA, + SCSICmdField1Bit RELADR, + SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS, + SCSICmdField2Byte TRANSFER_LENGTH, + SCSICmdField1Byte CONTROL ); + + // The WRITE AND VERIFY (10) command as defined in section 6.1.42 + virtual bool WRITE_AND_VERIFY_10 ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + UInt32 blockSize, + SCSICmdField1Bit DPO, + SCSICmdField1Bit BYT_CHK, + SCSICmdField1Bit RELADR, + SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS, + SCSICmdField4Byte TRANSFER_LENGTH, + SCSICmdField1Byte CONTROL ); + + /* Added with 10.1.3 */ + OSMetaClassDeclareReservedUsed ( IOSCSIMultimediaCommandsDevice, 1 ); + + virtual IOReturn ReadTOC ( IOMemoryDescriptor * buffer, + CDTOCFormat format, + UInt8 msf, + UInt32 trackSessionNumber, + UInt16 * actualByteCount ); + + /* Added with 10.1.3 */ + OSMetaClassDeclareReservedUsed ( IOSCSIMultimediaCommandsDevice, 2 ); + + virtual IOReturn ReadDiscInfo ( IOMemoryDescriptor * buffer, + UInt16 * actualByteCount ); + + /* Added with 10.1.3 */ + OSMetaClassDeclareReservedUsed ( IOSCSIMultimediaCommandsDevice, 3 ); + + virtual IOReturn ReadTrackInfo ( IOMemoryDescriptor * buffer, + UInt32 address, + CDTrackInfoAddressType addressType, + UInt16 * actualByteCount ); + + /* Added with 10.2 */ + OSMetaClassDeclareReservedUsed ( IOSCSIMultimediaCommandsDevice, 4 ); + + virtual IOReturn PowerDownHandler ( void * refCon, + UInt32 messageType, + IOService * provider, + void * messageArgument, + vm_size_t argSize ); + + /* Added with 10.3.3 */ + OSMetaClassDeclareReservedUsed ( IOSCSIMultimediaCommandsDevice, 5 ); + + +protected: + + + virtual void AsyncReadWriteCompletion ( SCSITaskIdentifier completedTask ); + + +public: + + + /* Added with 10.5 */ + OSMetaClassDeclareReservedUsed ( IOSCSIMultimediaCommandsDevice, 6 ); + + virtual IOReturn ReadDiscStructure ( IOMemoryDescriptor * buffer, + const UInt32 length, + const UInt8 structureFormat, + const UInt32 logicalBlockAddress, + const UInt8 layer, + const UInt8 agid, + const UInt8 mediaType ); + + + bool CheckForBDMediaType ( void ); + + + bool READ_DISC_STRUCTURE ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField4Bit MEDIA_TYPE, + SCSICmdField4Byte ADDRESS, + SCSICmdField1Byte LAYER_NUMBER, + SCSICmdField1Byte FORMAT, + SCSICmdField2Byte ALLOCATION_LENGTH, + SCSICmdField2Bit AGID, + SCSICmdField1Byte CONTROL ); + + + OSMetaClassDeclareReservedUsed ( IOSCSIMultimediaCommandsDevice, 7 ); + + virtual IOReturn ReserveTrack ( UInt8 reservationType, + UInt8 reservationFormat, + UInt64 ReservationParameter ); + + + bool RESERVE_TRACK_V2 ( SCSITaskIdentifier request, + SCSICmdField1Bit RMZ, + SCSICmdField1Bit ARSV, + SCSICmdField7Byte RESERVATION_PARAMETER, + SCSICmdField1Byte CONTROL ); + + + bool REPORT_KEY_V2 ( SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS, + SCSICmdField1Byte KEY_CLASS, + SCSICmdField2Byte ALLOCATION_LENGTH, + SCSICmdField2Bit AGID, + SCSICmdField6Bit KEY_FORMAT, + SCSICmdField1Byte CONTROL ) __attribute__ ((deprecated)); + + + bool REPORT_KEY_V3 ( SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS, + SCSICmdField1Byte KEY_CLASS, + SCSICmdField2Byte ALLOCATION_LENGTH, + SCSICmdField1Byte BLOCK_COUNT, + SCSICmdField2Bit AGID, + SCSICmdField6Bit KEY_FORMAT, + SCSICmdField1Byte CONTROL ); + + + bool SEND_KEY_V2 ( SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField1Byte KEY_CLASS, + SCSICmdField2Byte PARAMETER_LIST_LENGTH, + SCSICmdField2Bit AGID, + SCSICmdField6Bit KEY_FORMAT, + SCSICmdField1Byte CONTROL ); + + +protected: + + + void SetPollingMode ( UInt32 newPollingMode ); + + +public: + + + /* 10.6.0 */ + + IOReturn RequestIdle ( void ); + + /* 10.12.0 */ + virtual IOReturn ReportKey ( IOMemoryDescriptor * buffer, + const DVDKeyClass keyClass, + const UInt32 lba, + const UInt8 blockCount, + const UInt8 agid, + const DVDKeyFormat keyFormat ); + +private: + + // Space reserved for future expansion. + OSMetaClassDeclareReservedUnused ( IOSCSIMultimediaCommandsDevice, 9 ); + OSMetaClassDeclareReservedUnused ( IOSCSIMultimediaCommandsDevice, 10 ); + OSMetaClassDeclareReservedUnused ( IOSCSIMultimediaCommandsDevice, 11 ); + OSMetaClassDeclareReservedUnused ( IOSCSIMultimediaCommandsDevice, 12 ); + OSMetaClassDeclareReservedUnused ( IOSCSIMultimediaCommandsDevice, 13 ); + OSMetaClassDeclareReservedUnused ( IOSCSIMultimediaCommandsDevice, 14 ); + OSMetaClassDeclareReservedUnused ( IOSCSIMultimediaCommandsDevice, 15 ); + OSMetaClassDeclareReservedUnused ( IOSCSIMultimediaCommandsDevice, 16 ); + +}; + +#endif /* defined(KERNEL) && defined(__cplusplus) */ + +#endif /* _IOKIT_IO_SCSI_MULTIMEDIA_COMMANDS_DEVICE_H_ */ diff --git a/QualcommWireless/include/IOKit/scsi/IOSCSIPeripheralDeviceNub.h b/QualcommWireless/include/IOKit/scsi/IOSCSIPeripheralDeviceNub.h new file mode 100644 index 0000000..f6404c9 --- /dev/null +++ b/QualcommWireless/include/IOKit/scsi/IOSCSIPeripheralDeviceNub.h @@ -0,0 +1,228 @@ +/* + * Copyright (c) 1998-2010 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#ifndef _IOKIT_IO_SCSI_PERIPHERAL_DEVICE_NUB_H_ +#define _IOKIT_IO_SCSI_PERIPHERAL_DEVICE_NUB_H_ + + +//----------------------------------------------------------------------------- +// Constants +//----------------------------------------------------------------------------- + +// Probe score values +enum +{ + kPeripheralDeviceTypeNoMatch = 0, + kDefaultProbeRanking = 5000, + kFirstOrderRanking = 10000, + kSecondOrderRanking = 15000, + kThirdOrderRanking = 20000 +}; + + +#if defined(KERNEL) && defined(__cplusplus) + + +//----------------------------------------------------------------------------- +// Includes +//----------------------------------------------------------------------------- + +// General IOKit headers +#include +#include + +// SCSI Architecture Model Family includes +#include + +// Build includes +#include + + +// Forward definitions for internal use only classes. +class SCSIPrimaryCommands; + +//----------------------------------------------------------------------------- +// Class Declarations +//----------------------------------------------------------------------------- + +class IOSCSIPeripheralDeviceNub : public IOSCSIProtocolServices +{ + + OSDeclareDefaultStructors ( IOSCSIPeripheralDeviceNub ) + +private: + + static bool sCompareIOProperty ( + IOService * object, + OSDictionary * table, + char * propertyKeyName, + bool * matches ); + + static void TaskCallback ( SCSITaskIdentifier completedTask ); + void TaskCompletion ( SCSITaskIdentifier completedTask ); + + static IOReturn sWaitForTask ( void * object, SCSITask * request ); + IOReturn GatedWaitForTask ( SCSITask * request ); + +protected: + + SCSIServiceResponse SendTask ( SCSITask * request ); + + bool InterrogateDevice ( void ); + + // Reserve space for future expansion. + struct IOSCSIPeripheralDeviceNubExpansionData { }; + IOSCSIPeripheralDeviceNubExpansionData * fIOSCSIPeripheralDeviceNubReserved; + + IOSCSIProtocolInterface * fProvider; + + UInt8 fDefaultInquiryCount; + + virtual bool SendSCSICommand ( SCSITaskIdentifier request, + SCSIServiceResponse * serviceResponse, + SCSITaskStatus * taskStatus ) APPLE_KEXT_OVERRIDE; + + virtual SCSIServiceResponse AbortSCSICommand ( SCSITaskIdentifier request ) APPLE_KEXT_OVERRIDE; + + // The IsProtocolServiceSupported will return true if the specified + // feature is supported by the protocol layer. If the service has a value that must be + // returned, it will be returned in the serviceValue output parameter. + virtual bool IsProtocolServiceSupported ( SCSIProtocolFeature feature, void * serviceValue ) APPLE_KEXT_OVERRIDE; + + virtual bool HandleProtocolServiceFeature ( SCSIProtocolFeature feature, void * serviceValue ) APPLE_KEXT_OVERRIDE; + +public: + + bool init ( OSDictionary * propTable ) APPLE_KEXT_OVERRIDE; + virtual bool start ( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void free ( void ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn message ( UInt32 type, IOService * nub, void * arg ) APPLE_KEXT_OVERRIDE; + + virtual bool matchPropertyTable ( OSDictionary * table, + SInt32 * score ) APPLE_KEXT_OVERRIDE; + + // The ExecuteCommand method will take a SCSITask object and transport + // it across the physical wires to the device + virtual void ExecuteCommand ( SCSITaskIdentifier request ) APPLE_KEXT_OVERRIDE; + + // The Task Management function to allow the SCSI Application Layer client to request + // that a specific task be aborted. + virtual SCSIServiceResponse AbortTask ( UInt8 theLogicalUnit, SCSITaggedTaskIdentifier theTag ) APPLE_KEXT_OVERRIDE; + + // The Task Management function to allow the SCSI Application Layer client to request + // that a all tasks curerntly in the task set be aborted. + virtual SCSIServiceResponse AbortTaskSet ( UInt8 theLogicalUnit ) APPLE_KEXT_OVERRIDE; + + virtual SCSIServiceResponse ClearACA ( UInt8 theLogicalUnit ) APPLE_KEXT_OVERRIDE; + + virtual SCSIServiceResponse ClearTaskSet ( UInt8 theLogicalUnit ) APPLE_KEXT_OVERRIDE; + + virtual SCSIServiceResponse LogicalUnitReset ( UInt8 theLogicalUnit ) APPLE_KEXT_OVERRIDE; + + virtual SCSIServiceResponse TargetReset ( void ) APPLE_KEXT_OVERRIDE; + + // ************* Obsoleted Member Routine **************** + // The AbortCommand method is replaced by the AbortTask Management function and + // should no longer be called. + virtual SCSIServiceResponse AbortCommand ( SCSITaskIdentifier abortTask ) APPLE_KEXT_OVERRIDE; + +private: + + +#if !TARGET_OS_IPHONE + // Space reserved for future expansion. + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceNub, 1 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceNub, 2 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceNub, 3 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceNub, 4 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceNub, 5 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceNub, 6 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceNub, 7 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceNub, 8 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceNub, 9 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceNub, 10 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceNub, 11 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceNub, 12 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceNub, 13 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceNub, 14 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceNub, 15 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceNub, 16 ); +#endif /* !TARGET_OS_IPHONE */ + +}; + + +class IOSCSILogicalUnitNub : public IOSCSIPeripheralDeviceNub +{ + + OSDeclareDefaultStructors ( IOSCSILogicalUnitNub ) + +private: + + UInt8 fLogicalUnitNumber; + +protected: + + // Reserve space for future expansion. + struct IOSCSILogicalUnitNubExpansionData { }; + IOSCSILogicalUnitNubExpansionData * fIOSCSILogicalUnitNubReserved; + +public: + + virtual void SetLogicalUnitNumber ( UInt8 newLUN ); + UInt8 GetLogicalUnitNumber ( void ); + + // The ExecuteCommand method will take a SCSITask object and transport + // it across the physical wires to the device + virtual void ExecuteCommand ( SCSITaskIdentifier request ) APPLE_KEXT_OVERRIDE; + +private: + +#if !TARGET_OS_IPHONE + // Space reserved for future expansion. + OSMetaClassDeclareReservedUnused ( IOSCSILogicalUnitNub, 1 ); + OSMetaClassDeclareReservedUnused ( IOSCSILogicalUnitNub, 2 ); + OSMetaClassDeclareReservedUnused ( IOSCSILogicalUnitNub, 3 ); + OSMetaClassDeclareReservedUnused ( IOSCSILogicalUnitNub, 4 ); + OSMetaClassDeclareReservedUnused ( IOSCSILogicalUnitNub, 5 ); + OSMetaClassDeclareReservedUnused ( IOSCSILogicalUnitNub, 6 ); + OSMetaClassDeclareReservedUnused ( IOSCSILogicalUnitNub, 7 ); + OSMetaClassDeclareReservedUnused ( IOSCSILogicalUnitNub, 8 ); + OSMetaClassDeclareReservedUnused ( IOSCSILogicalUnitNub, 9 ); + OSMetaClassDeclareReservedUnused ( IOSCSILogicalUnitNub, 10 ); + OSMetaClassDeclareReservedUnused ( IOSCSILogicalUnitNub, 11 ); + OSMetaClassDeclareReservedUnused ( IOSCSILogicalUnitNub, 12 ); + OSMetaClassDeclareReservedUnused ( IOSCSILogicalUnitNub, 13 ); + OSMetaClassDeclareReservedUnused ( IOSCSILogicalUnitNub, 14 ); + OSMetaClassDeclareReservedUnused ( IOSCSILogicalUnitNub, 15 ); + OSMetaClassDeclareReservedUnused ( IOSCSILogicalUnitNub, 16 ); +#endif /* !TARGET_OS_IPHONE */ + +}; + + +#endif /* defined(KERNEL) && defined(__cplusplus) */ + +#endif /* _IOKIT_IO_SCSI_PERIPHERAL_DEVICE_NUB_H_ */ diff --git a/QualcommWireless/include/IOKit/scsi/IOSCSIPeripheralDeviceType00.h b/QualcommWireless/include/IOKit/scsi/IOSCSIPeripheralDeviceType00.h new file mode 100644 index 0000000..0e8e8af --- /dev/null +++ b/QualcommWireless/include/IOKit/scsi/IOSCSIPeripheralDeviceType00.h @@ -0,0 +1,104 @@ +/* + * Copyright (c) 1998-2009 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IO_SCSI_PERIPHERAL_DEVICE_TYPE_OO_H_ +#define _IOKIT_IO_SCSI_PERIPHERAL_DEVICE_TYPE_OO_H_ + +#if defined(KERNEL) && defined(__cplusplus) + + +//----------------------------------------------------------------------------- +// Includes +//----------------------------------------------------------------------------- + +// SCSI Architecture Model Family includes +#include + + +//----------------------------------------------------------------------------- +// Class Declaration +//----------------------------------------------------------------------------- + +class IOSCSIPeripheralDeviceType00 : public IOSCSIBlockCommandsDevice +{ + + OSDeclareDefaultStructors ( IOSCSIPeripheralDeviceType00 ) + +protected: + + // Reserve space for future expansion. + struct IOSCSIPeripheralDeviceType00ExpansionData + { + OSSet * fClients; + }; + IOSCSIPeripheralDeviceType00ExpansionData * fIOSCSIPeripheralDeviceType00Reserved; + +public: + + bool init ( OSDictionary * propTable ) APPLE_KEXT_OVERRIDE; + virtual bool start ( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void free ( void ) APPLE_KEXT_OVERRIDE; + + virtual bool handleOpen ( + IOService * client, + IOOptionBits options, + void * access ) APPLE_KEXT_OVERRIDE; + + virtual void handleClose ( + IOService * client, + IOOptionBits options ) APPLE_KEXT_OVERRIDE; + + virtual bool handleIsOpen ( const IOService * client ) const APPLE_KEXT_OVERRIDE; + + virtual IOReturn newUserClient ( + task_t owningTask, + void * securityID, + UInt32 type, + OSDictionary * properties, + IOUserClient ** handler ) APPLE_KEXT_OVERRIDE; + virtual void CreateStorageServiceNub ( void ) APPLE_KEXT_OVERRIDE; + + virtual char * GetVendorString ( void ) APPLE_KEXT_OVERRIDE; + virtual char * GetProductString ( void ) APPLE_KEXT_OVERRIDE; + virtual char * GetRevisionString ( void ) APPLE_KEXT_OVERRIDE; + + +private: + +#if !TARGET_OS_IPHONE + // Space reserved for future expansion. + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType00, 1 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType00, 2 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType00, 3 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType00, 4 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType00, 5 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType00, 6 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType00, 7 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType00, 8 ); +#endif /* !TARGET_OS_IPHONE */ + +}; + +#endif /* defined(KERNEL) && defined(__cplusplus) */ + +#endif /* _IOKIT_IO_SCSI_PERIPHERAL_DEVICE_TYPE_OO_H_ */ diff --git a/QualcommWireless/include/IOKit/scsi/IOSCSIPeripheralDeviceType05.h b/QualcommWireless/include/IOKit/scsi/IOSCSIPeripheralDeviceType05.h new file mode 100644 index 0000000..e443166 --- /dev/null +++ b/QualcommWireless/include/IOKit/scsi/IOSCSIPeripheralDeviceType05.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 1998-2009 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IO_SCSI_PERIPHERAL_DEVICE_TYPE_05_H_ +#define _IOKIT_IO_SCSI_PERIPHERAL_DEVICE_TYPE_05_H_ + +#if defined(KERNEL) && defined(__cplusplus) + + +//----------------------------------------------------------------------------- +// Includes +//----------------------------------------------------------------------------- + +// SCSI Architecture Model Family includes +#include + + +//----------------------------------------------------------------------------- +// Class Declaration +//----------------------------------------------------------------------------- + +class IOSCSIPeripheralDeviceType05 : public IOSCSIMultimediaCommandsDevice +{ + + OSDeclareDefaultStructors ( IOSCSIPeripheralDeviceType05 ) + +protected: + + // Reserve space for future expansion. + struct IOSCSIPeripheralDeviceType05ExpansionData { }; + IOSCSIPeripheralDeviceType05ExpansionData * fIOSCSIPeripheralDeviceType05Reserved; + +public: + + bool init ( OSDictionary * propTable ) APPLE_KEXT_OVERRIDE; + virtual bool start ( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void stop ( IOService * provider ) APPLE_KEXT_OVERRIDE; + +private: + + // Space reserved for future expansion. + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType05, 1 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType05, 2 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType05, 3 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType05, 4 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType05, 5 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType05, 6 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType05, 7 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType05, 8 ); + +}; + +#endif /* defined(KERNEL) && defined(__cplusplus) */ + +#endif /* _IOKIT_IO_SCSI_PERIPHERAL_DEVICE_TYPE_05_H_ */ diff --git a/QualcommWireless/include/IOKit/scsi/IOSCSIPeripheralDeviceType07.h b/QualcommWireless/include/IOKit/scsi/IOSCSIPeripheralDeviceType07.h new file mode 100644 index 0000000..9631287 --- /dev/null +++ b/QualcommWireless/include/IOKit/scsi/IOSCSIPeripheralDeviceType07.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 1998-2009 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IO_SCSI_PERIPHERAL_DEVICE_TYPE_07_H_ +#define _IOKIT_IO_SCSI_PERIPHERAL_DEVICE_TYPE_07_H_ + +#if defined(KERNEL) && defined(__cplusplus) + + +//----------------------------------------------------------------------------- +// Includes +//----------------------------------------------------------------------------- + +// SCSI Architecture Model Family includes +#include + + +//----------------------------------------------------------------------------- +// Class Declaration +//----------------------------------------------------------------------------- + +class IOSCSIPeripheralDeviceType07 : public IOSCSIBlockCommandsDevice +{ + + OSDeclareDefaultStructors ( IOSCSIPeripheralDeviceType07 ) + +protected: + + // Reserve space for future expansion. + struct IOSCSIPeripheralDeviceType07ExpansionData { }; + IOSCSIPeripheralDeviceType07ExpansionData * fIOSCSIPeripheralDeviceType07Reserved; + +public: + + bool init ( OSDictionary * propTable ) APPLE_KEXT_OVERRIDE; + virtual bool start ( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void stop ( IOService * provider ) APPLE_KEXT_OVERRIDE; + +private: + + // Space reserved for future expansion. + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType07, 1 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType07, 2 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType07, 3 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType07, 4 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType07, 5 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType07, 6 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType07, 7 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType07, 8 ); + +}; + +#endif /* defined(KERNEL) && defined(__cplusplus) */ + +#endif /* _IOKIT_IO_SCSI_PERIPHERAL_DEVICE_TYPE_07_H_ */ diff --git a/QualcommWireless/include/IOKit/scsi/IOSCSIPeripheralDeviceType0E.h b/QualcommWireless/include/IOKit/scsi/IOSCSIPeripheralDeviceType0E.h new file mode 100644 index 0000000..d3eac58 --- /dev/null +++ b/QualcommWireless/include/IOKit/scsi/IOSCSIPeripheralDeviceType0E.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 1998-2009 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IO_SCSI_PERIPHERAL_DEVICE_TYPE_0E_H_ +#define _IOKIT_IO_SCSI_PERIPHERAL_DEVICE_TYPE_0E_H_ + +#if defined(KERNEL) && defined(__cplusplus) + +//----------------------------------------------------------------------------- +// Includes +//----------------------------------------------------------------------------- + +// General IOKit headers +#include + +// SCSI Architecture Model Family includes +#include + + +//----------------------------------------------------------------------------- +// Class Declaration +//----------------------------------------------------------------------------- + +class IOSCSIPeripheralDeviceType0E : public IOSCSIReducedBlockCommandsDevice +{ + + OSDeclareDefaultStructors ( IOSCSIPeripheralDeviceType0E ) + +protected: + + // Reserve space for future expansion. + struct IOSCSIPeripheralDeviceType0EExpansionData { }; + IOSCSIPeripheralDeviceType0EExpansionData * fIOSCSIPeripheralDeviceType0EReserved; + +public: + + bool init ( OSDictionary * propTable ) APPLE_KEXT_OVERRIDE; + virtual bool start ( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void stop ( IOService * provider ) APPLE_KEXT_OVERRIDE; + +private: + + // Space reserved for future expansion. + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType0E, 1 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType0E, 2 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType0E, 3 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType0E, 4 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType0E, 5 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType0E, 6 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType0E, 7 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPeripheralDeviceType0E, 8 ); + +}; + +#endif /* defined(KERNEL) && defined(__cplusplus) */ + +#endif /* _IOKIT_IO_SCSI_PERIPHERAL_DEVICE_TYPE_0E_H_ */ diff --git a/QualcommWireless/include/IOKit/scsi/IOSCSIPrimaryCommandsDevice.h b/QualcommWireless/include/IOKit/scsi/IOSCSIPrimaryCommandsDevice.h new file mode 100644 index 0000000..53a1575 --- /dev/null +++ b/QualcommWireless/include/IOKit/scsi/IOSCSIPrimaryCommandsDevice.h @@ -0,0 +1,731 @@ +/* + * Copyright (c) 1998-2015 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#ifndef _IOKIT_IO_SCSI_PRIMARY_COMMANDS_DEVICE_H_ +#define _IOKIT_IO_SCSI_PRIMARY_COMMANDS_DEVICE_H_ + +#if defined(KERNEL) && defined(__cplusplus) + + +//----------------------------------------------------------------------------- +// Includes +//----------------------------------------------------------------------------- + +// General IOKit headers +#include +#include +#include +#include + +// SCSI Architecture Model Family includes +#include +#include +#include +#include + +// Build includes +#include + + +//----------------------------------------------------------------------------- +// Constants +//----------------------------------------------------------------------------- + +// Notification messages +enum +{ + kSCSIServicesNotification_Suspend = 0x69000080, + kSCSIServicesNotification_Resume = 0x69000090 +}; + + +// Timeout values +enum +{ + kOneSecondTimeoutInMS = 1000, + kTenSecondTimeoutInMS = 10 * kOneSecondTimeoutInMS, + kThirtySecondTimeoutInMS = 30 * kOneSecondTimeoutInMS, + kFortyFiveSecondTimeoutInMS = 45 * kOneSecondTimeoutInMS +}; + +// Mode page values for page control field +enum +{ + kModePageControlCurrentValues = 0x00, + kModePageControlChangeableValues = 0x01, + kModePageControlDefaultValues = 0x02, + kModePageControlSavedValues = 0x03 +}; + +// The command should be tried 5 times. The original attempt +// plus 4 retries. +#define kDefaultRetryCount 4 + +// Forward declarations for internal use only classes +class SCSIPrimaryCommands; + + +//----------------------------------------------------------------------------- +// Class Declaration +//----------------------------------------------------------------------------- + +class IOSCSIPrimaryCommandsDevice : public IOSCSIProtocolInterface +{ + + OSDeclareAbstractStructors ( IOSCSIPrimaryCommandsDevice ) + + friend class SCSITaskUserClient; + +private: + + IOSCSIProtocolInterface * fProtocolDriver; + + // The fProtocolAccessEnabled member variable indicates whether + // requests coming from the client can be sent to the device. + // This will be set to true after the Protocol Service driver is successfully + // opened and before the call to InitializeDeviceSupport and set to false before + // TerminateDeviceSupport is called. + bool fProtocolAccessEnabled; + + // The fDeviceAccessEnabled member variable indicates whether + // requests coming from the client can be sent to the device. + // This will be set to true after InitializeDeviceSupport is called and + // set to false before StopDeviceSupport is called. + bool fDeviceAccessEnabled; + bool fDeviceAccessSuspended; + + static bool ServerKeyswitchCallback ( void * target, + void * refCon, + IOService * newService ); + + static void TaskCallback ( SCSITaskIdentifier completedTask ); + void TaskCompletion ( SCSITaskIdentifier completedTask ); + + static IOReturn sWaitForTask ( void * object, SCSITaskIdentifier request ); + IOReturn GatedWaitForTask ( SCSITaskIdentifier request ); + +protected: + + // Reserve space for future expansion. + struct IOSCSIPrimaryCommandsDeviceExpansionData + { + IONotifier * fKeySwitchNotifier; + UInt8 fANSIVersion; + UInt32 fReadTimeoutDuration; + UInt32 fWriteTimeoutDuration; + bool fCMDQUE; + SCSITaggedTaskIdentifier fTaskID; + IOSimpleLock * fTaskIDLock; + UInt32 fRetryCount; + UInt32 fNumCommandsExecuting; + int fMaxPollRetries; + int fPollDebounceRetriesLeft; + }; + IOSCSIPrimaryCommandsDeviceExpansionData * fIOSCSIPrimaryCommandsDeviceReserved; + + #define fReadTimeoutDuration fIOSCSIPrimaryCommandsDeviceReserved->fReadTimeoutDuration + #define fWriteTimeoutDuration fIOSCSIPrimaryCommandsDeviceReserved->fWriteTimeoutDuration + #define fRetryCount fIOSCSIPrimaryCommandsDeviceReserved->fRetryCount + #define fNumCommandsExecuting fIOSCSIPrimaryCommandsDeviceReserved->fNumCommandsExecuting + #define fMaxPollRetries fIOSCSIPrimaryCommandsDeviceReserved->fMaxPollRetries + #define fPollDebounceRetriesLeft fIOSCSIPrimaryCommandsDeviceReserved->fPollDebounceRetriesLeft + + UInt8 fDefaultInquiryCount; + OSDictionary * fDeviceCharacteristicsDictionary; + UInt32 fNumCommandsOutstanding; + + virtual void free ( void ) APPLE_KEXT_OVERRIDE; + void SetANSIVersion ( UInt8 ); + void SetCMDQUE ( bool value ); + IOReturn GetModeSense ( + IOMemoryDescriptor * dataBuffer, + SCSICmdField6Bit PAGE_CODE, + SCSICmdField2Byte ALLOCATION_LENGTH, + bool * use10ByteModeSense ); + bool RetrieveINQUIRYData ( + UInt8 EVPD, + UInt8 inquiryPage, + UInt8 * inquiryBuffer, + UInt16 * dataSize ); + + // This flag is set if the device responds to a MODE_SENSE_10 command + // with the page code set to 0x1A (Power Conditions Mode Page) + bool fDeviceSupportsPowerConditions; + + // This method is called by the start method to obtain information from + // the device with regards to whether it supports the power conditions mode page. + virtual void CheckPowerConditionsModePage ( void ); + + // This will return back the Protocol driver that is used to + // send service requests to the device. + virtual IOSCSIProtocolInterface * GetProtocolDriver ( void ); + + // This will get a new SCSITask for the caller + virtual SCSITaskIdentifier GetSCSITask ( void ); + + // This will release a SCSITask (eventually return it to a pool) + virtual void ReleaseSCSITask ( SCSITaskIdentifier request ); + + // This will return a unique value for the tagged task identifier + SCSITaggedTaskIdentifier GetUniqueTagID ( void ); + + // Call for executing the command synchronously + SCSIServiceResponse SendCommand ( + SCSITaskIdentifier request, + UInt32 timeoutDuration ); + + // Call for executing the command asycnchronously + void SendCommand ( + SCSITaskIdentifier request, + UInt32 timeoutDuration, + SCSITaskCompletion taskCompletion ); + + + virtual bool InitializeDeviceSupport ( void ) = 0; + virtual void StartDeviceSupport ( void ) = 0; + virtual void SuspendDeviceSupport ( void ) = 0; + virtual void ResumeDeviceSupport ( void ) = 0; + virtual void StopDeviceSupport ( void ) = 0; + virtual void TerminateDeviceSupport ( void ) = 0; + virtual UInt32 GetNumberOfPowerStateTransitions ( void ) = 0; + + virtual IOReturn VerifyDeviceState ( void ); + // Called to clear any power-on/reset status in the drive + virtual bool ClearPowerOnReset ( void ); + virtual bool ClearNotReadyStatus ( void ) = 0; + + bool IsProtocolAccessEnabled ( void ); + bool IsDeviceAccessEnabled ( void ); + bool IsDeviceAccessSuspended ( void ); + + // Accessors for saving and retrieving data from an SCSITask object. + bool ResetForNewTask( + SCSITaskIdentifier request ); + bool SetTaskAttribute ( + SCSITaskIdentifier request, + SCSITaskAttribute newAttribute ); + SCSITaskAttribute GetTaskAttribute ( + SCSITaskIdentifier request ); + bool SetTaggedTaskIdentifier ( + SCSITaskIdentifier request, + SCSITaggedTaskIdentifier taggedTaskIdentifier ); + SCSITaggedTaskIdentifier GetTaggedTaskIdentifier ( + SCSITaskIdentifier request ); + bool SetTaskState ( + SCSITaskIdentifier request, + SCSITaskState newTaskState ); + SCSITaskState GetTaskState ( + SCSITaskIdentifier request ); + bool SetTaskStatus ( + SCSITaskIdentifier request, + SCSITaskStatus newStatus ); + SCSITaskStatus GetTaskStatus ( + SCSITaskIdentifier request ); + bool SetCommandDescriptorBlock ( + SCSITaskIdentifier request, + UInt8 cdbByte0, + UInt8 cdbByte1, + UInt8 cdbByte2, + UInt8 cdbByte3, + UInt8 cdbByte4, + UInt8 cdbByte5 ); + + // Populate the 10 Byte Command Descriptor Block + bool SetCommandDescriptorBlock ( + SCSITaskIdentifier request, + UInt8 cdbByte0, + UInt8 cdbByte1, + UInt8 cdbByte2, + UInt8 cdbByte3, + UInt8 cdbByte4, + UInt8 cdbByte5, + UInt8 cdbByte6, + UInt8 cdbByte7, + UInt8 cdbByte8, + UInt8 cdbByte9 ); + + // Populate the 12 Byte Command Descriptor Block + bool SetCommandDescriptorBlock ( + SCSITaskIdentifier request, + UInt8 cdbByte0, + UInt8 cdbByte1, + UInt8 cdbByte2, + UInt8 cdbByte3, + UInt8 cdbByte4, + UInt8 cdbByte5, + UInt8 cdbByte6, + UInt8 cdbByte7, + UInt8 cdbByte8, + UInt8 cdbByte9, + UInt8 cdbByte10, + UInt8 cdbByte11 ); + + // Populate the 16 Byte Command Descriptor Block + bool SetCommandDescriptorBlock ( + SCSITaskIdentifier request, + UInt8 cdbByte0, + UInt8 cdbByte1, + UInt8 cdbByte2, + UInt8 cdbByte3, + UInt8 cdbByte4, + UInt8 cdbByte5, + UInt8 cdbByte6, + UInt8 cdbByte7, + UInt8 cdbByte8, + UInt8 cdbByte9, + UInt8 cdbByte10, + UInt8 cdbByte11, + UInt8 cdbByte12, + UInt8 cdbByte13, + UInt8 cdbByte14, + UInt8 cdbByte15 ); + + bool SetDataTransferDirection ( + SCSITaskIdentifier request, + UInt8 newDirection ); + UInt8 GetDataTransferDirection ( + SCSITaskIdentifier request ); + bool SetRequestedDataTransferCount ( + SCSITaskIdentifier request, + UInt64 newRequestedCount ); + UInt64 GetRequestedDataTransferCount ( + SCSITaskIdentifier request ); + bool SetRealizedDataTransferCount ( + SCSITaskIdentifier request, + UInt64 newRealizedDataCount ); + UInt64 GetRealizedDataTransferCount ( + SCSITaskIdentifier request ); + bool SetDataBuffer ( + SCSITaskIdentifier request, + IOMemoryDescriptor * newBuffer ); + IOMemoryDescriptor * GetDataBuffer ( + SCSITaskIdentifier request ); + bool SetTimeoutDuration ( + SCSITaskIdentifier request, + UInt32 newTimeout ); + UInt32 GetTimeoutDuration ( + SCSITaskIdentifier request ); + bool SetTaskCompletionCallback ( + SCSITaskIdentifier request, + SCSITaskCompletion newCallback ); + void TaskCompletedNotification ( + SCSITaskIdentifier request ); + + bool SetServiceResponse ( + SCSITaskIdentifier request, + SCSIServiceResponse serviceResponse ); + SCSIServiceResponse GetServiceResponse ( + SCSITaskIdentifier request ); + bool SetAutosenseCommand ( + SCSITaskIdentifier request, + UInt8 cdbByte0, + UInt8 cdbByte1, + UInt8 cdbByte2, + UInt8 cdbByte3, + UInt8 cdbByte4, + UInt8 cdbByte5 ); + bool GetAutoSenseData ( + SCSITaskIdentifier request, + SCSI_Sense_Data * senseData ); // DEPRECATED, use below function instead + bool GetAutoSenseData ( + SCSITaskIdentifier request, + SCSI_Sense_Data * senseData, + UInt8 senseDataSize ); + UInt8 GetAutoSenseDataSize ( + SCSITaskIdentifier request ); + + bool SetApplicationLayerReference ( + SCSITaskIdentifier request, + void * newReferenceValue ); + void * GetApplicationLayerReference ( + SCSITaskIdentifier request ); + + void IncrementOutstandingCommandsCount ( void ); + static void sIncrementOutstandingCommandsCount ( + IOSCSIPrimaryCommandsDevice * self ); + virtual void HandleIncrementOutstandingCommandsCount ( void ); + + + // This static member routine provides a mechanism for retrieving a pointer to + // the object that is claimed as the owner of the specified SCSITask. + static OSObject * sGetOwnerForTask ( SCSITaskIdentifier request ); + +public: + + bool init ( OSDictionary * propTable ) APPLE_KEXT_OVERRIDE; + virtual bool start ( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void stop ( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual IOReturn message ( UInt32 type, IOService * nub, void * arg ) APPLE_KEXT_OVERRIDE; + + // The setAgressiveness method is called by the power manager + // to notify us of certain power management settings. We override + // this method in order to catch the kPMMinutesToSpinDown message + // in order to set our idle timer. + virtual IOReturn setAggressiveness ( unsigned long type, unsigned long minutes ) APPLE_KEXT_OVERRIDE; + + // Methods for getting device information strings + virtual char * GetVendorString ( void ); + virtual char * GetProductString ( void ); + virtual char * GetRevisionString ( void ); + OSDictionary * GetProtocolCharacteristicsDictionary ( void ); + OSDictionary * GetDeviceCharacteristicsDictionary ( void ); + UInt8 GetANSIVersion ( void ); + bool GetCMDQUE ( void ); +#if !TARGET_OS_IPHONE + OSString * MapINQUIRYDataToIconFile ( void ); +#endif /* !TARGET_OS_IPHONE */ + UInt32 GetRetryCount ( void ); + + // -- SCSI Protocol Interface Methods -- + // The ExecuteCommand method will take a SCSI Task and transport + // it across the physical wire(s) to the device + virtual void ExecuteCommand ( SCSITaskIdentifier request ) APPLE_KEXT_OVERRIDE; + + // The Task Management function to allow the SCSI Application Layer client to request + // that a specific task be aborted. + SCSIServiceResponse AbortTask ( UInt8 theLogicalUnit, SCSITaggedTaskIdentifier theTag ) APPLE_KEXT_OVERRIDE; + + // The Task Management function to allow the SCSI Application Layer client to request + // that a all tasks curerntly in the task set be aborted. + SCSIServiceResponse AbortTaskSet ( UInt8 theLogicalUnit ) APPLE_KEXT_OVERRIDE; + + SCSIServiceResponse ClearACA ( UInt8 theLogicalUnit ) APPLE_KEXT_OVERRIDE; + + SCSIServiceResponse ClearTaskSet ( UInt8 theLogicalUnit ) APPLE_KEXT_OVERRIDE; + + SCSIServiceResponse LogicalUnitReset ( UInt8 theLogicalUnit ) APPLE_KEXT_OVERRIDE; + + SCSIServiceResponse TargetReset ( void ) APPLE_KEXT_OVERRIDE; + + // The AbortCommand method will abort the indicated SCSI Task, + // if it is possible and the task has not already completed. + virtual SCSIServiceResponse AbortCommand ( SCSITaskIdentifier request ) APPLE_KEXT_OVERRIDE; + + // The IsProtocolServiceSupported will return true if the specified + // feature is supported by the protocol layer. If the service has a value that must be + // returned, it will be returned in the serviceValue output parameter. + virtual bool IsProtocolServiceSupported ( + SCSIProtocolFeature feature, + void * serviceValue ) APPLE_KEXT_OVERRIDE; + + // The HandleProtocolServiceFeature will return true if the specified feature could + // be handled properly by the protocol layer. + virtual bool HandleProtocolServiceFeature ( + SCSIProtocolFeature feature, + void * serviceValue ) APPLE_KEXT_OVERRIDE; + + // Utility methods for use by all peripheral device objects. + + // isParameterValid are used to validate that the parameter passed into + // the command methods are of the correct value. + + // Validate Parameter used for 1 bit to 1 byte paramaters + bool IsParameterValid ( + SCSICmdField1Byte param, + SCSICmdField1Byte mask ); + + // Validate Parameter used for 9 bit to 2 byte paramaters + bool IsParameterValid ( + SCSICmdField2Byte param, + SCSICmdField2Byte mask ); + + // Validate Parameter used for 17 bit to 4 byte paramaters + bool IsParameterValid ( + SCSICmdField4Byte param, + SCSICmdField4Byte mask ); + + // Validate Parameter used for 33 bit to 8 byte paramaters + bool IsParameterValid ( + SCSICmdField8Byte param, + SCSICmdField8Byte mask ); + + + bool IsMemoryDescriptorValid ( + IOMemoryDescriptor * dataBuffer ); + + bool IsMemoryDescriptorValid ( + IOMemoryDescriptor * dataBuffer, + UInt64 requiredSize ); + + virtual bool INQUIRY ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField1Bit CMDDT, + SCSICmdField1Bit EVPD, + SCSICmdField1Byte PAGE_OR_OPERATION_CODE, + SCSICmdField1Byte ALLOCATION_LENGTH, + SCSICmdField1Byte CONTROL ); + +#if !TARGET_OS_IPHONE + + virtual bool LOG_SELECT ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField1Bit PCR, + SCSICmdField1Bit SP, + SCSICmdField2Bit PC, + SCSICmdField2Byte PARAMETER_LIST_LENGTH, + SCSICmdField1Byte CONTROL ); + + virtual bool LOG_SENSE ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField1Bit PPC, + SCSICmdField1Bit SP, + SCSICmdField2Bit PC, + SCSICmdField6Bit PAGE_CODE, + SCSICmdField2Byte PARAMETER_POINTER, + SCSICmdField2Byte ALLOCATION_LENGTH, + SCSICmdField1Byte CONTROL ); + +#endif /* !TARGET_OS_IPHONE */ + + virtual bool MODE_SELECT_6 ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField1Bit PF, + SCSICmdField1Bit SP, + SCSICmdField1Byte PARAMETER_LIST_LENGTH, + SCSICmdField1Byte CONTROL ); + + virtual bool MODE_SELECT_10 ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField1Bit PF, + SCSICmdField1Bit SP, + SCSICmdField2Byte PARAMETER_LIST_LENGTH, + SCSICmdField1Byte CONTROL ); + + virtual bool MODE_SENSE_6 ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField1Bit DBD, + SCSICmdField2Bit PC, + SCSICmdField6Bit PAGE_CODE, + SCSICmdField1Byte ALLOCATION_LENGTH, + SCSICmdField1Byte CONTROL ); + + virtual bool MODE_SENSE_10 ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField1Bit LLBAA, + SCSICmdField1Bit DBD, + SCSICmdField2Bit PC, + SCSICmdField6Bit PAGE_CODE, + SCSICmdField2Byte ALLOCATION_LENGTH, + SCSICmdField1Byte CONTROL ); + +#if !TARGET_OS_IPHONE + + virtual bool PERSISTENT_RESERVE_IN ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField5Bit SERVICE_ACTION, + SCSICmdField2Byte ALLOCATION_LENGTH, + SCSICmdField1Byte CONTROL ); + + virtual bool PERSISTENT_RESERVE_OUT ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField5Bit SERVICE_ACTION, + SCSICmdField4Bit SCOPE, + SCSICmdField4Bit TYPE, + SCSICmdField1Byte CONTROL ); + +#endif /* !TARGET_OS_IPHONE */ + + virtual bool PREVENT_ALLOW_MEDIUM_REMOVAL ( + SCSITaskIdentifier request, + SCSICmdField2Bit PREVENT, + SCSICmdField1Byte CONTROL ); + +#if !TARGET_OS_IPHONE + + virtual bool READ_BUFFER ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField4Bit MODE, + SCSICmdField1Byte BUFFER_ID, + SCSICmdField3Byte BUFFER_OFFSET, + SCSICmdField3Byte ALLOCATION_LENGTH, + SCSICmdField1Byte CONTROL ); + + virtual bool RECEIVE ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField3Byte TRANSFER_LENGTH, + SCSICmdField1Byte CONTROL ); + + virtual bool RECEIVE_DIAGNOSTICS_RESULTS ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField1Bit PCV, + SCSICmdField1Byte PAGE_CODE, + SCSICmdField2Byte ALLOCATION_LENGTH, + SCSICmdField1Byte CONTROL ); + + virtual bool RELEASE_6 ( + SCSITaskIdentifier request, + SCSICmdField1Byte CONTROL ); + + virtual bool RELEASE_10 ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField1Bit THRDPTY, + SCSICmdField1Bit LONGID, + SCSICmdField1Byte THIRD_PARTY_DEVICE_ID, + SCSICmdField2Byte PARAMETER_LIST_LENGTH, + SCSICmdField1Byte CONTROL ); + +#endif /* !TARGET_OS_IPHONE */ + + virtual bool REPORT_DEVICE_IDENTIFIER ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField4Byte ALLOCATION_LENGTH, + SCSICmdField1Byte CONTROL ); + + + + virtual bool REPORT_LUNS ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField4Byte ALLOCATION_LENGTH, + SCSICmdField1Byte CONTROL ); + + virtual bool REQUEST_SENSE ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField1Byte ALLOCATION_LENGTH, + SCSICmdField1Byte CONTROL ); + +#if !TARGET_OS_IPHONE + + virtual bool RESERVE_6 ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField1Byte CONTROL ); + + virtual bool RESERVE_10 ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField1Bit THRDPTY, + SCSICmdField1Bit LONGID, + SCSICmdField1Byte THIRD_PARTY_DEVICE_ID, + SCSICmdField2Byte PARAMETER_LIST_LENGTH, + SCSICmdField1Byte CONTROL ); + + virtual bool SEND ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField1Bit AER, + SCSICmdField3Byte TRANSFER_LENGTH, + SCSICmdField1Byte CONTROL ); + + virtual bool SEND_DIAGNOSTICS ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField3Bit SELF_TEST_CODE, + SCSICmdField1Bit PF, + SCSICmdField1Bit SELF_TEST, + SCSICmdField1Bit DEVOFFL, + SCSICmdField1Bit UNITOFFL, + SCSICmdField2Byte PARAMETER_LIST_LENGTH, + SCSICmdField1Byte CONTROL ); + + virtual bool SET_DEVICE_IDENTIFIER ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField5Bit SERVICE_ACTION, + SCSICmdField4Byte PARAMETER_LIST_LENGTH, + SCSICmdField1Byte CONTROL ); + +#endif /* !TARGET_OS_IPHONE */ + + virtual bool TEST_UNIT_READY ( + SCSITaskIdentifier request, + SCSICmdField1Byte CONTROL ); + +#if !TARGET_OS_IPHONE + + virtual bool WRITE_BUFFER ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField4Bit MODE, + SCSICmdField1Byte BUFFER_ID, + SCSICmdField3Byte BUFFER_OFFSET, + SCSICmdField3Byte PARAMETER_LIST_LENGTH, + SCSICmdField1Byte CONTROL ); + +#endif /* !TARGET_OS_IPHONE */ + + // The SPC-3 INQUIRY command as defined in section 6.4.1 of SPC-3. + bool INQUIRY ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField1Bit EVPD, + SCSICmdField1Byte PAGE_CODE, + SCSICmdField2Byte ALLOCATION_LENGTH, + SCSICmdField1Byte CONTROL ); + + OSMetaClassDeclareReservedUsed ( IOSCSIPrimaryCommandsDevice, 1 ); + + // ClampPowerState() will check if it is currently running behind the + // workloop lock, if not, it will call itself again to run behind the + // workloop gate. When subclassing ClampPowerState() make sure to take + // workloop synchronization in consideration. + + virtual void ClampPowerState ( void ); + + OSMetaClassDeclareReservedUsed ( IOSCSIPrimaryCommandsDevice, 2 ); + + virtual void ReleasePowerStateClamp ( void ); + + +private: + + +#if !TARGET_OS_IPHONE + // Space reserved for future expansion. + OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 3 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 4 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 5 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 6 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 7 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 8 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 9 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 10 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 11 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 12 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 13 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 14 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 15 ); + OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 16 ); +#endif /* !TARGET_OS_IPHONE */ + +}; + +#endif /* defined(KERNEL) && defined(__cplusplus) */ + +#endif /* _IOKIT_IO_SCSI_PRIMARY_COMMANDS_DEVICE_H_ */ diff --git a/QualcommWireless/include/IOKit/scsi/IOSCSIProtocolInterface.h b/QualcommWireless/include/IOKit/scsi/IOSCSIProtocolInterface.h new file mode 100644 index 0000000..c6a7393 --- /dev/null +++ b/QualcommWireless/include/IOKit/scsi/IOSCSIProtocolInterface.h @@ -0,0 +1,922 @@ +/* + * Copyright (c) 1998-2009 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IO_SCSI_PROTOCOL_INTERFACE_H_ +#define _IOKIT_IO_SCSI_PROTOCOL_INTERFACE_H_ + + +/*! @header SCSI Protocol Interface + @discussion + This file contains definitions for the IOSCSIProtocolInterface class, + SCSI Protocol Features used by this interface, and additional constants + used by this interface. +*/ + + +//----------------------------------------------------------------------------- +// Includes +//----------------------------------------------------------------------------- + +#include +#include + +//----------------------------------------------------------------------------- +// Constants +//----------------------------------------------------------------------------- + +/* +SCSI Device Characteristics - Defined between SCSI Application Layer and + SCSI Protocol Layer only. +*/ + +/*! +@constant kIOPropertySCSIDeviceCharacteristicsKey +@discussion +This key is used to define SCSI Device Characteristics for a particular device. +It is the key for the dictionary containing the keys of characteristics. These keys +are only defined between the SCSI Protocol Layer and the SCSI Applicaiton Layer. Some +properties may be copied from this dictionary to the more generic Device Characteristics +or Protocol Characteristics dictionaries. +*/ +#define kIOPropertySCSIDeviceCharacteristicsKey "SCSI Device Characteristics" + +/*! +@constant kIOPropertySCSIInquiryLengthKey +@discussion +This key is used to define a default INQUIRY length to issue to the device. The +value is a UInt32 corresponding to the number of bytes to request in the INQUIRY +command. +*/ +#define kIOPropertySCSIInquiryLengthKey "Inquiry Length" + +/*! +@constant kIOPropertySCSIManualEjectKey +@discussion +This key is used to indicate that the device is known to be a manual ejectable media +device. This property overrides all of the driver checks for determining this capability. +This property is a string, although if it exists it should always be true. +*/ +#define kIOPropertySCSIManualEjectKey "Manual Eject" + +/*! +@constant kIOPropertyReadTimeOutDurationKey +@discussion +This key is used to define the Read Time Out for a particular device. +This property overrides all of the protocol defaults. +This property is a value, in milliseconds. +*/ +#define kIOPropertyReadTimeOutDurationKey "Read Time Out Duration" + +/*! +@constant kIOPropertyWriteTimeOutDurationKey +@discussion +This key is used to define the Write Time Out for a particular device. +This property overrides all of the protocol defaults. +This property is a value, in milliseconds. +*/ +#define kIOPropertyWriteTimeOutDurationKey "Write Time Out Duration" + +/*! +@constant kIOPropertyRetryCountKey +@discussion +This key is used to define the number of Read/Write retries for a particular device. +This property overrides all of the protocol defaults. +The value is a UInt32 corresponding to the number of retries. +*/ +#define kIOPropertyRetryCountKey "Retry Count" + +/*! + @constant kIOPropertyAutonomousSpinDownKey + @discussion + This key is used to indicate that the device is known to have its own internal logic + for idle disk spin down. This key is used to mark device which respond poorly to our + efforts to manually spin down or spin up the device when it is already in the desired + state. + */ +#define kIOPropertyAutonomousSpinDownKey "Autonomous Spin Down" + +/*! + @constant kIOPropertyDoNotPreventMediumRemovalKey + @discussion + This key is used to indicate that the device either does not require or respond + well to PREVENT_ALLOW_MEDIUM_REMOVAL. This property indicates that the + PREVENT_ALLOW_MEDIUM_REMOVAL should not be used with the specified device. + */ +#define kIOPropertyDoNotPreventMediumRemovalKey "Do Not Prevent Medium Removal" + +/*! + @constant kIOPropertyEjectRequireStartStopUnitKey + @discussion + This key is used to indicate that while the device may have failed PREVENT_ALLOW_MEDIUM + REMOVAL it still requires a START_STOP_UNIT to eject/unload media. + */ +#define kIOPropertyEjectRequireStartStopUnitKey "Eject Requires START_STOP_UNIT" + +/*! + @constant kIOPropertyRequiresRestartEjectKey + @discussion + This key is used to indicate that the device requires a START_STOP_UNIT to eject + the device's media prior to restarting to ensuring proper function at next boot cycle. + */ +#define kIOPropertyRequiresRestartEjectKey "Require Restart Eject" + +/*! + @constant kIOPropertyNoSenseDebounceRetries + @discussion + This key is used to indicate how many retries a device may require when it reports + NO_SENSE/NO_ADITIONAL_SENSE_INFORMATION as a response to a REQUEST_SENSE. + */ +#define kIOPropertyNoSenseDebounceRetries "NO_SENSE Debounce Retries" + +#if defined(KERNEL) && defined(__cplusplus) + + +/*! +@constant kCFBundleIdentifierKey +@discussion +Property key for CFBundleIdentifier. +*/ +#define kCFBundleIdentifierKey "CFBundleIdentifier" + +/*! +@constant kIOSCSIArchitectureBundleIdentifierKey +@discussion +IOSCSIArchitectureModelFamily's CFBundle identifier. +*/ +#define kIOSCSIArchitectureBundleIdentifierKey "com.apple.iokit.IOSCSIArchitectureModelFamily" + + +// General kernel headers +#include + +// General IOKit headers +#include +#include +#include +#include + +// SCSI Architecture Model Family includes +#include + + +/*! +@enum SCSI Protocol Interface Device Notification values +@discussion +Message values for SCSI Protocol Interface Device Notifications. +@constant kSCSIProtocolNotification_DeviceRemoved +Private message sent between a SCSI protocol service provider and +SCSI application layer driver to indicate device removal. +@constant kSCSIProtocolNotification_VerifyDeviceState +Private message sent between a SCSI protocol service provider and +SCSI application layer driver to indicate device state may have +changed and the device state should be re-verified by the SCSI +Application Layer driver. An example would be a bus reset which clears +the tray locking state of an ATAPI device. +@constant kSCSIServicesNotification_ExclusivityChanged +Message sent when a change in exclusivity state occurs. Usually in +response to acquiring/releasing exclusive access to a device via a user client. +@constant kSCSIProtocolNotification_ForcePowerDown +Message sent between a SCSI protocol service provider and +SCSI application layer driver to initiate transition to the lowest power state. +@constant kSCSIProtocolNotification_ForcePowerUp +Message sent between a SCSI protocol service provider and +SCSI application layer driver to initiate transition to the highest power state. +*/ +enum +{ + kSCSIProtocolNotification_DeviceRemoved = 0x69000010, + kSCSIProtocolNotification_VerifyDeviceState = 0x69000020, + kSCSIServicesNotification_ExclusivityChanged = 0x69000030, + kSCSIProtocolNotification_ForcePowerDown = 0x69000040, + kSCSIProtocolNotification_ForcePowerUp = 0x69000050 +}; + + +/*! +@typedef SCSIProtocolFeature +@discussion +Typedef for SCSIProtocolFeature, a 32-bit quantity. +*/ +typedef UInt32 SCSIProtocolFeature; + +/*! +@enum SCSI Protocol Features +@discussion +The list of SCSI Protocol Features currently supported. +*/ +enum +{ + + /*! + @constant kSCSIProtocolFeature_ACA Not yet used. + */ + kSCSIProtocolFeature_ACA = 1, + + /*! + @constant kSCSIProtocolFeature_CPUInDiskMode Used to determine + if the SCSI Protocol Services Driver supports a CPU which is in + target disk mode. + */ + kSCSIProtocolFeature_CPUInDiskMode = 2, + + /*! + @constant kSCSIProtocolFeature_ProtocolSpecificPolling Used + to determine if the SCSI Protocol Services Driver supports + protocol specific polling for media. This is used for low-power + polling specifically for ATAPI devices on ATA buses + */ + kSCSIProtocolFeature_ProtocolSpecificPolling = 3, + + /*! + @constant kSCSIProtocolFeature_ProtocolSpecificSleepCommand Used + to determine if the SCSI Protocol Services Driver supports + protocol specific sleep commands to a drive. This is used for + sleeping drives specifically ATAPI devices on ATA buses. + */ + kSCSIProtocolFeature_ProtocolSpecificSleepCommand = 4, + + /*! + @constant kSCSIProtocolFeature_GetMaximumLogicalUnitNumber If + the SCSI Protocol Services Driver supports logical units, it will + report the maximum addressable ID that it supports in the UInt32 pointer + that is passed in as the serviceValue. If only one unit is supported, + the driver should return false for this query. + */ + kSCSIProtocolFeature_GetMaximumLogicalUnitNumber = 5, + + /*! + @constant kSCSIProtocolFeature_MaximumReadBlockTransferCount If + the SCSI Protocol Services Driver has a maximum number of + blocks that can be transfered in a read request, it will return + true to this query and return the block count in the UInt32 pointer + that is passed in as the serviceValue. + */ + kSCSIProtocolFeature_MaximumReadBlockTransferCount = 6, + + /*! + @constant kSCSIProtocolFeature_MaximumWriteBlockTransferCount If + the SCSI Protocol Services Driver has a maximum number of + blocks that can be transferred in a write request, it will return + true to this query and return the block count in the UInt32 pointer + that is passed in as the serviceValue. + */ + kSCSIProtocolFeature_MaximumWriteBlockTransferCount = 7, + + /*! + @constant kSCSIProtocolFeature_MaximumReadTransferByteCount If + the SCSI Protocol Services Driver has a maximum byte count + that can be transferred in a read request, it will return + true to this query and return the byte count in the UInt64 pointer + that is passed in as the serviceValue. + */ + kSCSIProtocolFeature_MaximumReadTransferByteCount = 8, + + /*! + @constant kSCSIProtocolFeature_MaximumWriteTransferByteCount If + the SCSI Protocol Services Driver has a maximum byte count + that can be transferred in a write request, it will return + true to this query and return the byte count in the UInt64 pointer + that is passed in as the serviceValue. + */ + kSCSIProtocolFeature_MaximumWriteTransferByteCount = 9, + + /*! + @constant kSCSIProtocolFeature_SubmitDefaultInquiryData If + the SCSI Protocol Services Driver needs any extra information to + make any negotiation settings from the standard INQUIRY data, this + will be called to set that appropriately. The serviceValue will + point to a SCSICmd_INQUIRY_StandardData buffer. The size + of the buffer depends on the SCSI Device Characteristics + dictionary for the device or bus. If there is no + kIOPropertySCSIInquiryLengthKey value set in the dictionary + or if it doesn't exist, then the size of the data will be + the size of the full amount of Inquiry retrieved from the device. + */ + kSCSIProtocolFeature_SubmitDefaultInquiryData = 10, + + /*! + @constant kSCSIProtocolFeature_ProtocolAlwaysReportsAutosenseData If + the SCSI Protocol Services Driver always reports available + autosense data when a kSCSITaskStatus_CHECK_CONDITION is set, + then the protocol layer should return true. E.g. FireWire + transport drivers should respond true to this. + */ + kSCSIProtocolFeature_ProtocolAlwaysReportsAutosenseData = 11, + + /*! + @constant kSCSIProtocolFeature_ProtocolSpecificPowerOff If + the SCSI Protocol Services Driver supports removing the power + to the drive, then the protocol layer should return true. This is + used for aggressive power management, specifically for ATAPI + devices on ATA buses. + */ + kSCSIProtocolFeature_ProtocolSpecificPowerOff = 12, + + /*! + @constant kSCSIProtocolFeature_ProtocolSpecificPowerControl + Used to determine if the SCSI Protocol Services Driver supports + switching the power to the drive on and off. This is used for aggressive + power management, specifically for SATAPI devices on AHCI buses. + */ + kSCSIProtocolFeature_ProtocolSpecificPowerControl = 13, + + /*! + @constant kSCSIProtocolFeature_ProtocolSpecificAsyncNotification + Used to determine if the SCSI Protocol Services Driver supports + asynchronous notifications from the drive. This is used to prevent + polling for media, specifically for SATAPI devices on AHCI buses. + */ + kSCSIProtocolFeature_ProtocolSpecificAsyncNotification = 14, + + /*! + kSCSIProtocolFeature_HierarchicalLogicalUnits: + If the SCSI Protocol Services layer supports hierarchical + logical units, then the protocol services layer should report true + and use IOSCSIProtocolServices::GetLogicalUnitBytes() to retrieve + the full 8 bytes of LUN information. + */ + kSCSIProtocolFeature_HierarchicalLogicalUnits = 15, + + /*! + kSCSIProtocolFeature_MultiPathing: + If the SCSI Protocol Services layer supports multi-pathing, + then the protocol services layer should report true. + This is used to support multiple paths to a logical unit + by creating a IOSCSIMultipathedLogicalUnit object. + */ + kSCSIProtocolFeature_MultiPathing = 16, + + /*! + kSCSIProtocolFeature_ProtocolSpecificLinkRetrain: + If the SCSI Protocol Services layer supports link retrain, then the protocol + services layer should report true. + */ + kSCSIProtocolFeature_ProtocolSpecificLinkRetrain = 17 + +}; + + +/*! +@typedef SCSIProtocolPowerState +@discussion +Typedef for SCSIProtocolPowerState, a 32-bit quantity. +*/ +typedef UInt32 SCSIProtocolPowerState; + +/*! +@enum SCSI Protocol Power States +@discussion +The list of SCSI Protocol Power States. +*/ +enum +{ + /*! + @constant kSCSIProtocolPowerStateOff + Off power state. + */ + kSCSIProtocolPowerStateOff = 0, + + /*! + @constant kSCSIProtocolPowerStateOn + On power state. + */ + kSCSIProtocolPowerStateOn = 1 +}; + + +//----------------------------------------------------------------------------- +// Class Declaration +//----------------------------------------------------------------------------- + +/*! +@class IOSCSIProtocolInterface +@superclass IOService +@discussion +This class defines the public SCSI Protocol Layer API for any class that +provides Protocol services or needs to provide the Protocol Service API +for passing service requests to a Protocol Service driver. +*/ +class IOSCSIProtocolInterface : public IOService +{ + + OSDeclareAbstractStructors ( IOSCSIProtocolInterface ) + +public: + + /*! @function init + @abstract Initializes generic IOService data structures (expansion data, etc). + */ + virtual bool init( OSDictionary * dictionary = 0 ) APPLE_KEXT_OVERRIDE; + + /*! + @function start + @abstract During an IOService object's instantiation, starts the IOService object that has been selected to run on the provider. + @discussion See IOService.h for details. + @result true if the start was successful; false otherwise (which will cause the instance to be detached and usually freed). + */ + virtual bool start ( IOService * provider ) APPLE_KEXT_OVERRIDE; + + /*! + @function free + @abstract Called to release all resources held by the object. + @discussion Release all resources held by the object, then call super::free(). + */ + virtual void free ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function willTerminate + @abstract Passes a termination up the stack. + @discussion Notification that a provider has been terminated, sent before recursing up the stack, in root-to-leaf order. + @param provider The terminated provider of this object. + @param options Options originally passed to terminate(). + @result true. + */ + virtual bool willTerminate ( IOService * provider, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + + /*! + @function GetUserClientExclusivityState + @abstract Gets the current exclusivity state of the user client. + @discussion The GetUserClientExclusivityState() method is called by the SCSITaskUserClient + to determine if any user client is holding exclusive access at the current time. This is simply + a preflight check and a return value of false does not guarantee that a subsequent + call to SetUserClientExclusivityState() will return successfully. + @result true if a user client is in exclusive control of the device, false otherwise. + */ + virtual bool GetUserClientExclusivityState ( void ); + + /*! + @function SetUserClientExclusivityState + @abstract Sets the current exclusivity state of the user client. + @discussion The SetUserClientExclusivityState() method is called by the SCSITaskUserClient + to set the exclusive access mode. + @param userClient The instance of SCSITaskUserClient for which to change exclusivity state. + @param state Exclusivity state. true means exclusive access is desired, false + means exclusive access is being released. + @result A valid IOReturn code indicating success or the type of failure. + */ + virtual IOReturn SetUserClientExclusivityState ( IOService * userClient, bool state ); + + + /*! + @function initialPowerStateForDomainState + @abstract Determines which power state a device is in, given the current power domain state. + @discussion Power management calls this method once, when the driver is initializing power management. + Subclasses should not need to override this method. + @param flags Flags that describe the character of "domain power"; they represent the outputPowerCharacter field of a state in the power domain's power state array. + @result A state number. + */ + virtual unsigned long initialPowerStateForDomainState ( IOPMPowerFlags flags ) APPLE_KEXT_OVERRIDE; + + /*! + @function setPowerState + @abstract Requests a power managed driver to change the power state of its device. + @discussion Requests a power managed driver to change the power state of its device. Most subclasses + of IOSCSIProtocolInterface have class-specific mechanisms and should not override this routine. + See IOSCSIProtocolServices.h, IOSCSIBlockCommandsDevice.h, IOSCSIReducedBlockCommandsDevice.h, and + IOSCSIMultimediaCommandsDevice.h for more information about power management changes. + Subclasses should not need to override this method. + @param powerStateOrdinal The number in the power state array to which the drive is being instructed to change. + @param whichDevice A pointer to the power management object which registered to manage power for this device. + The whichDevice field is not pertinent to us since the driver is both the "policy maker" for the device, + and the "policy implementor" for the device. + @result See IOService.h for details. + */ + virtual IOReturn setPowerState ( unsigned long powerStateOrdinal, IOService * whichDevice ) APPLE_KEXT_OVERRIDE; + + /*! + @function IsPowerManagementIntialized + @abstract Called to determine if power management is initialized. + @discussion Called to determine if power management is initialized. + Subclasses should not need to override this method. + @result true if power management has been initialized, false otherwise. + */ + virtual bool IsPowerManagementIntialized ( void ); + + /*! + @function CheckPowerState + @abstract Called by clients to ensure device is in correct power state before issuing I/O. + @discussion Called by clients to ensure device is in correct power state before issuing I/O. + If the device is not ready to handle such requests, it gives the driver a chance to block the + thread until the device is ready. Subclasses should not need to override this method. + */ + virtual void CheckPowerState ( void ); + + /*! + @function ExecuteCommand + @abstract Called to send a SCSITask and transport it across the physical wire(s) to the device. + @discussion Called to send a SCSITask and transport it across the physical wire(s) to the device. + Subclasses internal to IOSCSIArchitectureModelFamily will need to override this method. Third + party subclasses should not need to override this method. + @param request A valid SCSITaskIdentifier representing the task to transport across the wire(s). + */ + virtual void ExecuteCommand ( SCSITaskIdentifier request ) = 0; + + /*! + @function AbortCommand + @abstract Obsolete. Do not use this method. + @discussion Obsolete. Do not use this method. + */ + virtual SCSIServiceResponse AbortCommand ( SCSITaskIdentifier request ) = 0; + + /*! + @function IsProtocolServiceSupported + @abstract This method is called to query for support of a protocol specific service feature. + @discussion This method is called to query for support of a protocol specific service feature. + Subclasses of IOSCSIProtocolServices should override this method. + @param feature A valid SCSIProtocolFeature. See enums for SCSIProtocolFeature. + @param serviceValue A pointer to a structure/value that is used in conjunction with the feature + requested. See enums for SCSIProtocolFeature. NB: This parameter may be NULL for certain + feature requests. + @result true if the feature is supported, false otherwise. + */ + virtual bool IsProtocolServiceSupported ( + SCSIProtocolFeature feature, + void * serviceValue ) = 0; + + /*! + @function HandleProtocolServiceFeature + @abstract This method is called to enact support of a protocol specific service feature. + @discussion This method is called to enact support of a protocol specific service feature. + Subclasses of IOSCSIProtocolServices should override this method. + @param feature A valid SCSIProtocolFeature. See enums for SCSIProtocolFeature. + @param serviceValue A pointer to a structure/value that is used in conjunction with the feature + requested. See enums for SCSIProtocolFeature. NB: This parameter may be NULL for certain + feature requests. + @result true if the service feature request succeeded, false otherwise. + */ + virtual bool HandleProtocolServiceFeature ( + SCSIProtocolFeature feature, + void * serviceValue ) = 0; + +protected: + + // Reserve space for future expansion. + struct IOSCSIProtocolInterfaceExpansionData + { + IOWorkLoop * fWorkLoop; + }; + IOSCSIProtocolInterfaceExpansionData * fIOSCSIProtocolInterfaceReserved; + + // ------ Power Management Support ------ + + thread_call_t fPowerManagementThread; + IOCommandGate * fCommandGate; + UInt32 fCurrentPowerState; + UInt32 fProposedPowerState; + bool fPowerTransitionInProgress; + bool fPowerAckInProgress; + bool fPowerManagementInitialized; + + /*! + @function GetCommandGate + @abstract Accessor method to obtain the IOCommandGate. + @discussion Accessor method to obtain the IOCommandGate. + @result The IOCommandGate for this instance. May return NULL. + */ + IOCommandGate * GetCommandGate ( void ); + + /*! + @function InitializePowerManagement + @abstract This method is called to initialize power management. + @discussion This method is called to initialize power management. It will call PMinit(), joinPMTree(), + and makeUsable(). This method does not call registerPowerDriver(). + Subclasses may override this method to change the behavior (such as the number of power states). + @param provider The power management provider (i.e. the provider to attach to in the PowerManagement + tree). This may be a device that is not in the PM Tree itself, in which case, the IOService plane + is traversed towards the root node in an effort to find a node in the PM Tree. + */ + virtual void InitializePowerManagement ( IOService * provider ); + + /*! + @function GetInitialPowerState + @abstract This method is called to obtain the initial power state of the device (usually the highest). + @discussion This method is called to obtain the initial power state of the device (usually the highest). + Subclasses must override this method. + @result A power state ordinal. + */ + virtual UInt32 GetInitialPowerState ( void ) = 0; + + /*! + @function finalize + @abstract Finalizes the destruction of an IOService object. + @discussion See IOService.h + Subclasses may override this method, but should call super::finalize(). + @result true. + */ + virtual bool finalize ( IOOptionBits options ) APPLE_KEXT_OVERRIDE; + + /*! + @function sHandleSetPowerState + @abstract The sHandleSetPowerState method is a static function used as C->C++ glue + for going behind the command gate. + @discussion The sHandleSetPowerState method is a static function used as C->C++ glue + for going behind the command gate. + @param self The 'this' pointer for the class. + @param powerStateOrdinal The power state to which device shall be changed. + @result A valid IOReturn code indicating success or failure. + */ + static IOReturn sHandleSetPowerState ( IOSCSIProtocolInterface * self, UInt32 powerStateOrdinal ); + + /*! + @function sGetPowerTransistionInProgress + @abstract The sGetPowerTransistionInProgress method is a static function used as C->C++ glue + for going behind the command gate. + @discussion The sGetPowerTransistionInProgress method is a static function used as C->C++ glue + for going behind the command gate. + @param self The 'this' pointer for the class. + @result true if a power state is in progress, otherwise false. + */ + static bool sGetPowerTransistionInProgress ( IOSCSIProtocolInterface * self ); + + /*! + @function HandleSetPowerState + @abstract The HandleSetPowerState method is called by the glue code and is on the + serialized side of the command gate. + @discussion The HandleSetPowerState method is called by the glue code and is on the + serialized side of the command gate. This allows us to touch any member + variables as necessary without any multi-threading issues. + Subclasses may override this method to change behavior. Third party subclasses + should not need to override this method, but may. + @param powerStateOrdinal The power state to which device shall be changed. + */ + virtual void HandleSetPowerState ( UInt32 powerStateOrdinal ); + + /*! + @function sPowerManagement + @abstract The sPowerManagement method is a static C-function which is called using + mach's thread_call API. It guarantees us a thread of execution which is + different than the power management thread and the workloop thread on which + we can issue commands to the device synchronously or asynchronously without + worrying about deadlocks. It calls through to HandlePowerChange, which is + a state machine used to direct power management. + @discussion The sPowerManagement method is a static C-function which is called using + mach's thread_call API. It guarantees us a thread of execution which is + different than the power management thread and the workloop thread on which + we can issue commands to the device synchronously or asynchronously without + worrying about deadlocks. It calls through to HandlePowerChange, which is + a state machine used to direct power management. + @param whichDevice The 'this' pointer. + */ + static void sPowerManagement ( thread_call_param_t whichDevice ); + + /*! + @function HandlePowerChange + @abstract The HandlePowerChange method is pure virtual and is left to each protocol or + application layer driver to implement. It is guaranteed to be called on its + own thread of execution and can make synchronous or asynchronous calls. + @discussion The HandlePowerChange method is pure virtual and is left to each protocol or + application layer driver to implement. It is guaranteed to be called on its + own thread of execution and can make synchronous or asynchronous calls. + Subclasses must override this method. Third party subclasses shouldn't need to override + this method but can to alter the default behavior. + */ + virtual void HandlePowerChange ( void ) = 0; + + /*! + @function sHandleCheckPowerState + @abstract The sHandleCheckPowerState method is a static function used as C->C++ glue + for going behind the command gate. + @discussion The sHandleCheckPowerState method is a static function used as C->C++ glue + for going behind the command gate. + @param self The 'this' pointer for the class. + */ + static void sHandleCheckPowerState ( IOSCSIProtocolInterface * self ); + + /*! + @function HandleCheckPowerState(void) + @abstract The HandleCheckPowerState (void) method is on the serialized side of the command + gate and can change member variables safely without multi-threading issues. + It's main purpose is to call the superclass' HandleCheckPowerState ( UInt32 maxPowerState ) + with the max power state the class registered with. + @discussion The HandleCheckPowerState (void) method is on the serialized side of the command + gate and can change member variables safely without multi-threading issues. + It's main purpose is to call the superclass' HandleCheckPowerState ( UInt32 maxPowerState ) + with the max power state the class registered with. + Subclasses must override this method. Third party subclasses shouldn't need to override + this method but can to alter the default behavior. + */ + virtual void HandleCheckPowerState ( void ) = 0; + + /*! + @function HandleCheckPowerState(UInt32 maxPowerState) + @abstract The HandleCheckPowerState(UInt32 maxPowerState) method is called by + the subclasses and is passed the maxPowerState number given to the power + manager at initialization time. This guarantees the threads block until that + power state has been achieved. + @discussion The HandleCheckPowerState(UInt32 maxPowerState) method is called by + the subclasses and is passed the maxPowerState number given to the power + manager at initialization time. This guarantees the threads block until that + power state has been achieved. + @param maxPowerState The maximum power state in the power state array. + */ + void HandleCheckPowerState ( UInt32 maxPowerState ); + + /*! + @function TicklePowerManager(void) + @abstract The TicklePowerManager(void) method is called by CheckPowerState and + sends an activity tickle to the power manager so that the idle timer is + reset. + @discussion The TicklePowerManager(void) method is called by CheckPowerState and + sends an activity tickle to the power manager so that the idle timer is + reset. + Subclasses must override this method. Third party subclasses shouldn't need to override + this method but can to alter the default behavior. + */ + virtual void TicklePowerManager ( void ) = 0; + + /*! + @function TicklePowerManager(UInt32 maxPowerState) + @abstract The TicklePowerManager(UInt32 maxPowerState) method is a convenience + function which can be called by subclasses in TicklePowerManager (void) + in order to tell the power manager to reset idle timer or bring the device + into the requested state. It returns whatever is returned by activityTickle + (true if device is in the requested state, false if it is not). + @discussion The TicklePowerManager(UInt32 maxPowerState) method is a convenience + function which can be called by subclasses in TicklePowerManager(void) + in order to tell the power manager to reset idle timer or bring the device + into the requested state. It returns whatever is returned by activityTickle + (true if device is in the requested state, false if it is not). + @param maxPowerState The maximum power state in the power state array. + @result The result of the call to activityTickle(). See IOService.h for details. + */ + bool TicklePowerManager ( UInt32 maxPowerState ); + + // ------ User Client Support ------ + + bool fUserClientExclusiveControlled; + IOService * fUserClient; + + /*! + @function sGetUserClientExclusivityState + @abstract The sGetUserClientExclusivityState method is a static function used as C->C++ glue + for going behind the command gate. + @discussion The sGetUserClientExclusivityState method is a static function used as C->C++ glue + for going behind the command gate. + @param self The 'this' pointer for the class. + @param state A pointer to a bool in which the state should be set. + */ + static void sGetUserClientExclusivityState ( IOSCSIProtocolInterface * self, bool * state ); + + /*! + @function sSetUserClientExclusivityState + @abstract The sSetUserClientExclusivityState method is a static function used as C->C++ glue + for going behind the command gate. + @discussion The sSetUserClientExclusivityState method is a static function used as C->C++ glue + for going behind the command gate. + @param self The 'this' pointer for the class. + @param result A pointer to an IOReturn for the resulting status. + @param userClient The instance of SCSITaskUserClient for which to change exclusivity state. + @param state A bool indicating the desired state to set. + */ + static void sSetUserClientExclusivityState ( IOSCSIProtocolInterface * self, IOReturn * result, IOService * userClient, bool state ); + + /*! + @function HandleGetUserClientExclusivityState + @abstract Gets the current exclusivity state of the user client. + @discussion The HandleGetUserClientExclusivityState() method is called on the serialized side + of the command gate to determine if any user client is holding exclusive access at the current + time. See discussion for GetUserClientExclusivityState(). + Subclasses may override this method to alter default behavior. Third party subclasses should + not need to override this method. + @result true if a user client is in exclusive control of the device, false otherwise. + */ + virtual bool HandleGetUserClientExclusivityState ( void ); + + /*! + @function HandleSetUserClientExclusivityState + @abstract Sets the current exclusivity state of the user client. + @discussion The HandleSetUserClientExclusivityState() method is called on the serialized side + of the command gate to set the exclusive access mode. + @param userClient The instance of SCSITaskUserClient for which to change exclusivity state. + @param state Exclusivity state. true means exclusive access is desired, false + means exclusive access is being released. + @result A valid IOReturn code indicating success or the type of failure. + */ + virtual IOReturn HandleSetUserClientExclusivityState ( IOService * userClient, bool state ); + +public: + + // ------- SCSI Architecture Model Task Management Functions ------ + + OSMetaClassDeclareReservedUsed ( IOSCSIProtocolInterface, 1 ); + /*! + @function AbortTask + @abstract Aborts a task based on the Logical Unit and tagged task identifier. + @discussion Aborts a task based on the Logical Unit and tagged task identifier. + Subclasses must override this method. Third party subclasses should not need to override + this method. + @param theLogicalUnit This value should be zero unless the device driver is + more complex and managing multiple Logical Units. + @param theTag A valid SCSITaggedTaskIdentifier representing an outstanding SCSITask. + @result A valid SCSIServiceResponse code. + */ + virtual SCSIServiceResponse AbortTask ( UInt8 theLogicalUnit, SCSITaggedTaskIdentifier theTag ) = 0; + + OSMetaClassDeclareReservedUsed ( IOSCSIProtocolInterface, 2 ); + /*! + @function AbortTaskSet + @abstract Aborts a task set based on the Logical Unit. + @discussion Aborts a task set based on the Logical Unit. + Subclasses must override this method. Third party subclasses should not need to override + this method. + @param theLogicalUnit This value should be zero unless the device driver is + more complex and managing multiple Logical Units. + @result A valid SCSIServiceResponse code. + */ + virtual SCSIServiceResponse AbortTaskSet ( UInt8 theLogicalUnit ) = 0; + + OSMetaClassDeclareReservedUsed ( IOSCSIProtocolInterface, 3 ); + /*! + @function ClearACA + @abstract Clears an Auto-Contingent Allegiance (ACA) for the specified Logical Unit. + @discussion Clears an Auto-Contingent Allegiance (ACA) for the specified Logical Unit. + Subclasses must override this method. Third party subclasses should not need to override + this method. + @param theLogicalUnit This value should be zero unless the device driver is + more complex and managing multiple Logical Units. + @result A valid SCSIServiceResponse code. + */ + virtual SCSIServiceResponse ClearACA ( UInt8 theLogicalUnit ) = 0; + + OSMetaClassDeclareReservedUsed ( IOSCSIProtocolInterface, 4 ); + /*! + @function ClearTaskSet + @abstract Clears a task set for the specified Logical Unit. + @discussion Clears a task set for the specified Logical Unit. + Subclasses must override this method. Third party subclasses should not need to override + this method. + @param theLogicalUnit This value should be zero unless the device driver is + more complex and managing multiple Logical Units. + @result A valid SCSIServiceResponse code. + */ + virtual SCSIServiceResponse ClearTaskSet ( UInt8 theLogicalUnit ) = 0; + + OSMetaClassDeclareReservedUsed ( IOSCSIProtocolInterface, 5 ); + /*! + @function LogicalUnitReset + @abstract Resets the specified Logical Unit. + @discussion Resets the specified Logical Unit. + Subclasses must override this method. Third party subclasses should not need to override + this method. + @param theLogicalUnit This value should be zero unless the device driver is + more complex and managing multiple Logical Units. + @result A valid SCSIServiceResponse code. + */ + virtual SCSIServiceResponse LogicalUnitReset ( UInt8 theLogicalUnit ) = 0; + + OSMetaClassDeclareReservedUsed ( IOSCSIProtocolInterface, 6 ); + + /*! + @function TargetReset + @abstract Resets the target device. + @discussion Resets the target device. + Subclasses must override this method. Third party subclasses should not need to override + this method. + @result A valid SCSIServiceResponse code. + */ + virtual SCSIServiceResponse TargetReset ( void ) = 0; + +private: + + // Method to show that the disk spinning up in spindump stacks + void __DISK_IS_ASLEEP__ ( void ) __attribute__((noinline)); + +#if !TARGET_OS_IPHONE + // Space reserved for future expansion. + OSMetaClassDeclareReservedUnused ( IOSCSIProtocolInterface, 7 ); + OSMetaClassDeclareReservedUnused ( IOSCSIProtocolInterface, 8 ); + OSMetaClassDeclareReservedUnused ( IOSCSIProtocolInterface, 9 ); + OSMetaClassDeclareReservedUnused ( IOSCSIProtocolInterface, 10 ); + OSMetaClassDeclareReservedUnused ( IOSCSIProtocolInterface, 11 ); + OSMetaClassDeclareReservedUnused ( IOSCSIProtocolInterface, 12 ); + OSMetaClassDeclareReservedUnused ( IOSCSIProtocolInterface, 13 ); + OSMetaClassDeclareReservedUnused ( IOSCSIProtocolInterface, 14 ); + OSMetaClassDeclareReservedUnused ( IOSCSIProtocolInterface, 15 ); + OSMetaClassDeclareReservedUnused ( IOSCSIProtocolInterface, 16 ); +#endif /* !TARGET_OS_IPHONE */ + +}; + +#endif /* defined(KERNEL) && defined(__cplusplus) */ + +#endif /* _IOKIT_IO_SCSI_PROTOCOL_INTERFACE_H_ */ diff --git a/QualcommWireless/include/IOKit/scsi/IOSCSIProtocolServices.h b/QualcommWireless/include/IOKit/scsi/IOSCSIProtocolServices.h new file mode 100644 index 0000000..2c7a52e --- /dev/null +++ b/QualcommWireless/include/IOKit/scsi/IOSCSIProtocolServices.h @@ -0,0 +1,784 @@ +/* + * Copyright (c) 1998-2011 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#ifndef _IOKIT_IO_SCSI_PROTOCOL_SERVICES_H_ +#define _IOKIT_IO_SCSI_PROTOCOL_SERVICES_H_ + +#if defined(KERNEL) && defined(__cplusplus) + + +//----------------------------------------------------------------------------- +// Includes +//----------------------------------------------------------------------------- + +// Mach includes +#include + +// General IOKit headers +#include +#include + +// SCSI Architecture Model Family includes +#include +#include +#include + +// Build includes +#include + + +//----------------------------------------------------------------------------- +// Constants +//----------------------------------------------------------------------------- + +// Power Management values +enum +{ + kSCSIProtocolLayerPowerStateOff = 0, + kSCSIProtocolLayerPowerStateOn = 1, + kSCSIProtocolLayerNumDefaultStates = 2 +}; + +// Forward definitions of internal use only classes +class SCSITask; + +//----------------------------------------------------------------------------- +// Class Declaration +//----------------------------------------------------------------------------- + +/*! + @class IOSCSIProtocolServices + @superclass IOSCSIProtocolInterface + @discussion + This class defines the public SCSI Protocol Services Layer API for any class + that implements SCSI protocol services. A protocol services layer driver is + responsible for taking incoming SCSITaskIdentifier objects and translating + them to the native command type for the native protocol interface + (e.g. SBP-2 ORB on FireWire). + */ +class IOSCSIProtocolServices : public IOSCSIProtocolInterface +{ + + OSDeclareAbstractStructors ( IOSCSIProtocolServices ) + +private: + + // The head pointer for the queue of waiting SCSI Tasks. + SCSITask * fSCSITaskQueueHead; /* OBSOLETE */ + + // This is the lock for preventing multiple access while + // manipulating the SCSI Task queue. + IOSimpleLock * fQueueLock; + + // The internal flag to indicate whether service requests should be + // executed or immediately errored, such as when a device is removed. + bool fAllowServiceRequests; + +protected: + + // Reserve space for future expansion. + struct IOSCSIProtocolServicesExpansionData + { + // For internal use only. Do not use. + UInt32 fSemaphore; + bool fRequiresAutosenseDescriptor; + SCSITaskCompletion fCompletionRoutine; + queue_head_t fTaskQueueHead; + queue_head_t fAutoSenseQueueHead; + }; + IOSCSIProtocolServicesExpansionData * fIOSCSIProtocolServicesReserved; + + /*! + @function SendSCSICommand + @abstract Pure virtual method subclasses must implement in order to send SCSITasks on the wire. + @discussion Send a SCSI Command to the device. If the command was sent to the + device and is pending completion, the subclass should return true and + return back the kSCSIServiceResponse_Request_In_Process response. + If the command completes immediately with an error, the subclass will + return true and return back the appropriate status. + If the subclass is currently processing all the commands it can, the + subclass will return false and the command will be resent next time + CommandCompleted is called. + @param request A valid SCSITaskIdentifier representing the command to send on the wire. + @param serviceResponse Pointer to a SCSIServiceResponse value returned to the caller. + @param taskStatus Pointer to a SCSITaskStatus value returned to the caller. + @result False if no more commands can be processed at this time, otherwise true. + */ + virtual bool SendSCSICommand ( SCSITaskIdentifier request, + SCSIServiceResponse * serviceResponse, + SCSITaskStatus * taskStatus ) = 0; + + /*! + @function AbortSCSICommand + @abstract Pure virtual method subclasses must implement so that SCSITasks may be aborted. + @discussion Provides the capability for a caller to request that a particular SCSITask + be aborted. + @param request A valid SCSITaskIdentifier representing the command to be aborted. + @result A valid SCSIServiceResponse. + */ + virtual SCSIServiceResponse AbortSCSICommand ( SCSITaskIdentifier request ) = 0; + + /*! + @function CommandCompleted + @abstract Method subclass calls to complete a SCSITask. + @discussion Subclasses will call this inherited method when the command + executed by SendSCSICommand has completed. + @param request A valid SCSITaskIdentifier indicating the request to complete. + @param serviceResponse A valid SCSIServiceResponse value. + @param taskStatus A valid SCSITaskStatus value. + */ + void CommandCompleted ( SCSITaskIdentifier request, + SCSIServiceResponse serviceResponse, + SCSITaskStatus taskStatus ); + + /*! + @function GetTaskAttribute + @abstract Accessor method to retrieve the SCSITaskAttribute associated with the specified request. + @discussion Accessor method to retrieve the SCSITaskAttribute associated with the specified request. + @param request A valid SCSITaskIdentifier. + @result A valid SCSITaskAttribute value. + */ + SCSITaskAttribute GetTaskAttribute ( SCSITaskIdentifier request ); + + /*! + @function SetTaskState + @abstract Accessor method to set the SCSITaskState associated with the specified request. + @discussion Accessor method to set the SCSITaskState associated with the specified request. + @param request A valid SCSITaskIdentifier. + @param newTaskState A valid SCSITaskState value. + @result True on success, otherwise false. + */ + bool SetTaskState ( SCSITaskIdentifier request, + SCSITaskState newTaskState ); + /*! + @function GetTaskState + @abstract Accessor method to retrieve the SCSITaskState associated with the specified request. + @discussion Accessor method to retrieve the SCSITaskState associated with the specified request. + @param request A valid SCSITaskIdentifier. + @result A valid SCSITaskState value. + */ + SCSITaskState GetTaskState ( SCSITaskIdentifier request ); + + /*! + @function GetLogicalUnitNumber + @abstract Accessor method to retrieve the logical unit number associated with the specified request. + @discussion Accessor method to retrieve the logical unit number associated with the specified request. + NOTE: This method is deprecated in favor of GetLogicalUnitBytes(). + @param request A valid SCSITaskIdentifier. + @result A valid single-byte LUN value. + */ + UInt8 GetLogicalUnitNumber ( SCSITaskIdentifier request ); + + /*! + @function GetLogicalUnitBytes + @abstract Accessor method to retrieve the logical unit bytes associated with the specified request. + @discussion Accessor method to retrieve the logical unit bytes associated with the specified request. + @param request A valid SCSITaskIdentifier. + @param lunBytes A pointer to SCSILogicalUnitBytes to be filled in by this method. + */ + void GetLogicalUnitBytes ( SCSITaskIdentifier request, SCSILogicalUnitBytes * lunBytes ); + + /*! + @function GetCommandDescriptorBlockSize + @abstract Accessor method to retrieve the Command Descriptor Block size associated with the specified request. + @discussion Accessor method to retrieve the Command Descriptor Block size associated with the specified request. + @param request A valid SCSITaskIdentifier. + @result A valid CDB size (e.g. 6, 10, 12, or 16 bytes). + */ + UInt8 GetCommandDescriptorBlockSize ( SCSITaskIdentifier request ); + + /*! + @function GetCommandDescriptorBlock + @abstract Accessor method to retrieve the Command Descriptor Block associated with the specified request. + @discussion Accessor method to retrieve the Command Descriptor Block associated with the specified request. + @param request A valid SCSITaskIdentifier. + @param cdbData A pointer to SCSICommandDescriptorBlock to be filled in by this method. + NOTE: This routine will always fill in 16 bytes, so if the protocol layer driver supports less than this amount + it will have to create a local SCSICommandDescriptorBlock variable to get the CDB data. + @result True on success, otherwise false. + */ + bool GetCommandDescriptorBlock ( SCSITaskIdentifier request, + SCSICommandDescriptorBlock * cdbData ); + + /*! + @function GetDataTransferDirection + @abstract Accessor method to retrieve the data transfer direction associated with the specified request. + @discussion Accessor method to retrieve the data transfer direction associated with the specified request. + @param request A valid SCSITaskIdentifier. + @result The data transfer direction (e.g. kSCSIDataTransfer_NoDataTransfer). + */ + UInt8 GetDataTransferDirection ( SCSITaskIdentifier request ); + + /*! + @function GetRequestedDataTransferCount + @abstract Accessor method to retrieve the requested data transfer count associated with the specified request. + @discussion Accessor method to retrieve the requested data transfer count associated with the specified request. + @param request A valid SCSITaskIdentifier. + @result The requested data transfer count. + */ + UInt64 GetRequestedDataTransferCount ( SCSITaskIdentifier request ); + + /*! + @function SetRealizedDataTransferCount + @abstract Accessor method to set the realized (actual) data transfer count associated with the specified request. + @discussion Accessor method to set the realized (actual) data transfer count associated with the specified request. + @param request A valid SCSITaskIdentifier. + @param newRealizedDataCount The realized (actual) data count transferred. + @result True on success, otherwise false. + */ + bool SetRealizedDataTransferCount ( SCSITaskIdentifier request, + UInt64 newRealizedDataCount ); + + /*! + @function GetRealizedDataTransferCount + @abstract Accessor method to retrieve the realized data transfer count associated with the specified request. + @discussion Accessor method to retrieve the realized data transfer count associated with the specified request. + @param request A valid SCSITaskIdentifier. + @result The realized data transfer count. + */ + UInt64 GetRealizedDataTransferCount ( SCSITaskIdentifier request ); + + /*! + @function GetDataBuffer + @abstract Accessor method to retrieve the data buffer associated with the specified request. + @discussion Accessor method to retrieve the data buffer associated with the specified request. + @param request A valid SCSITaskIdentifier. + @result An IOMemoryDescriptor associated with the request. May be NULL if data transfer + direction is kSCSIDataTransfer_NoDataTransfer. + */ + IOMemoryDescriptor * GetDataBuffer ( SCSITaskIdentifier request ); + + /*! + @function GetDataBufferOffset + @abstract Accessor method to retrieve the data buffer offset associated with the specified request. + @discussion Accessor method to retrieve the data buffer offset associated with the specified request. + @param request A valid SCSITaskIdentifier. + @result Offset into the data buffer at which to start the transfer of data. + */ + UInt64 GetDataBufferOffset ( SCSITaskIdentifier request ); + + /*! + @function GetTimeoutDuration + @abstract Accessor method to retrieve the timeout duration in milliseconds associated with the specified request. + @discussion Accessor method to retrieve the timeout duration in milliseconds associated with the specified request. + @param request A valid SCSITaskIdentifier. + @result Timeout duration in milliseconds. + */ + UInt32 GetTimeoutDuration ( SCSITaskIdentifier request ); + + /*! + @function GetAutosenseRequestedDataTransferCount + @abstract Accessor method to retrieve the requested data transfer count for autosense data + associated with the specified request. + @discussion Accessor method to retrieve the requested data transfer count for autosense data + associated with the specified request. + @param request A valid SCSITaskIdentifier. + @result The requested autosense data transfer count. + */ + UInt64 GetAutosenseRequestedDataTransferCount ( SCSITaskIdentifier request ); + + /*! + @function SetAutoSenseData + @abstract Accessor method to set the autosense data. NOTE: This method is deprecated. + @discussion Accessor method to set the autosense data. NOTE: This method is deprecated. + @param request A valid SCSITaskIdentifier. + @param senseData A pointer to a SCSI_Sense_Data structure to be copied. Only + sizeof(struct SCSI_Sense_Data) bytes will be copied. + @result True if sense data was successfully copied, otherwise false. + */ + bool SetAutoSenseData ( SCSITaskIdentifier request, + SCSI_Sense_Data * senseData ) __attribute__ ((deprecated)); + + /*! + @function SetAutoSenseData + @abstract Accessor method to set the autosense data. + @discussion Accessor method to set the autosense data. + @param request A valid SCSITaskIdentifier. + @param senseData A pointer to sense data to be copied. + @param senseDataSize Number of bytes to copy. + @result True if sense data was successfully copied, otherwise false. + */ + bool SetAutoSenseData ( SCSITaskIdentifier request, + SCSI_Sense_Data * senseData, + UInt8 senseDataSize ); + + /*! + @function EnsureAutosenseDescriptorExists + @abstract Internal method, not to be called by subclasses. + @discussion Internal method, not to be called by subclasses. + @param request A valid SCSITaskIdentifier. + */ + void EnsureAutosenseDescriptorExists ( SCSITaskIdentifier request ); + + /*! + @function SetProtocolLayerReference + @abstract Accessor method to set the protocol layer reference. + @discussion Accessor method to set the protocol layer reference. + @param request A valid SCSITaskIdentifier. + @param newReferenceValue Pointer to reference data. + @result True on success, otherwise false. + */ + bool SetProtocolLayerReference ( + SCSITaskIdentifier request, + void * newReferenceValue ); + + /*! + @function GetProtocolLayerReference + @abstract Accessor method to retrieve the protocol layer reference. + @discussion Accessor method to retrieve the protocol layer reference. + @param request A valid SCSITaskIdentifier. + @result The protocol layer reference value. May be NULL. + */ + void * GetProtocolLayerReference ( SCSITaskIdentifier request ); + + /*! + @function SetTaskExecutionMode + @abstract Internal method used to set the task execution mode. + @discussion Internal method used to set the task execution mode. + @param request A valid SCSITaskIdentifier. + @param newTaskMode A valid SCSITaskMode value. + @result True on success, otherwise false. + */ + bool SetTaskExecutionMode ( + SCSITaskIdentifier request, + SCSITaskMode newTaskMode ); + + /*! + @function GetTaskExecutionMode + @abstract Internal method used to retrieve the task execution mode. + @discussion Internal method used to retrieve the task execution mode. + @param request A valid SCSITaskIdentifier. + @result A valid SCSITaskMode value. + */ + SCSITaskMode GetTaskExecutionMode ( SCSITaskIdentifier request ); + + /*! + @function SendNotification_DeviceRemoved + @abstract Method called by subclasses when a device is physically removed from the bus. + @discussion Method called by subclasses when a device is physically removed from the bus. + */ + void SendNotification_DeviceRemoved ( void ); + + /*! + @function SendNotification_VerifyDeviceState + @abstract Method called by subclasses when a device state needs to be re-verified due to some + bus condition which may have changed the device state. + @discussion Method called by subclasses when a device state needs to be re-verified due to some + bus condition which may have changed the device state. + */ + void SendNotification_VerifyDeviceState ( void ); + + // -- SCSI Task Queue Management Methods -- + // Following are the commands used to manipulate the queue of pending SCSI Tasks. + + /*! + @function AddSCSITaskToQueue + @abstract Internal method called to add a SCSITask to the processing queue. + @discussion Internal method called to add a SCSITask to the processing queue. + @param request A valid SCSITaskIdentifier. + */ + void AddSCSITaskToQueue ( SCSITaskIdentifier request ); + + /*! + @function AddSCSITaskToHeadOfQueue + @abstract Internal method called to add a SCSITask to the head of the processing queue. + @discussion Internal method called to add a SCSITask to the head of the processing queue. + @param request A valid SCSITask pointer. + */ + void AddSCSITaskToHeadOfQueue ( SCSITask * request ); + + /*! + @function RetrieveNextSCSITaskFromQueue + @abstract Internal method called to retrieve the next SCSITask to process. + @discussion Internal method called to retrieve the next SCSITask to process. + @result A valid SCSITask pointer or NULL if there are no tasks to process. + */ + SCSITask * RetrieveNextSCSITaskFromQueue ( void ); + + /*! + @function AbortSCSITaskFromQueue + @abstract Deprecated internal method. + @discussion Deprecated internal method. + */ + bool AbortSCSITaskFromQueue ( SCSITask * request ); + + /*! + @function SendSCSITasksFromQueue + @abstract Internal method called to start processing SCSITasks. + @discussion Internal method called to start processing SCSITasks. Only one client or workloop + thread may process SCSITasks at any point in time. This method coordinates to ensure only one + thread does so. + */ + void SendSCSITasksFromQueue ( void ); + + /*! + @function RejectSCSITasksCurrentlyQueued + @abstract Internal method called to reject currently enqueued SCSITasks. + @discussion Internal method called to reject currently enqueued SCSITasks. This method is + typically called in response to device termination. + */ + void RejectSCSITasksCurrentlyQueued ( void ); + + /*! + @function ProcessCompletedTask + @abstract Internal method called to process completed SCSITasks. + @discussion Internal method called to process completed SCSITasks. This method determines if + a CHECK_CONDITION has occurred and if sense data was requested and autosense data is not present. + If so, it will change the execution mode of the SCSITask and request sense data on behalf of + the caller. + @param request A valid SCSITaskIdentifier. + @param serviceResponse A valid SCSIServiceResponse value. + @param taskStatus A valid SCSITaskStatus value. + */ + void ProcessCompletedTask ( SCSITaskIdentifier request, + SCSIServiceResponse serviceResponse, + SCSITaskStatus taskStatus ); + + /*! + @function RejectTask + @abstract Internal method called to reject a particular SCSITask. + @discussion Internal method called to reject a particular SCSITask. + @param request A valid SCSITaskIdentifier. + */ + void RejectTask ( SCSITaskIdentifier request ); + + // ------ Power Management Support ------ + + /*! + @function InitializePowerManagement + @abstract Subclasses call this method to initialize power management. + @discussion Subclasses call this method to initialize power management. + In the protocol services layer, this method calls the protocol interface layer + to initialize power management state variables and then registers the protocol + layer driver with the power manager with two(2) states, ON and OFF. Subclasses may + override this behavior. + @param provider The provider to be joined to in the power management tree. + */ + virtual void InitializePowerManagement ( IOService * provider ) APPLE_KEXT_OVERRIDE; + + /*! + @function GetInitialPowerState + @abstract This method is called once, right after InitializePowerManagement() + in order to determine what state the device is initially in at startup time (usually + the highest power mode). + @discussion This method is called once, right after InitializePowerManagement() + in order to determine what state the device is initially in at startup time (usually + the highest power mode). + @result The power state the device is currently in. + */ + virtual UInt32 GetInitialPowerState ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function HandlePowerChange + @abstract This method is called to handle a power change. + @discussion This method is called to handle a power change. It is called from a clean thread + context (i.e. new thread, no locks held) and can make synchronous or asynchronous calls. + */ + virtual void HandlePowerChange ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function HandleCheckPowerState + @abstract Method called to check if the device is in the correct power state for an I/O. + @discussion The HandleCheckPowerState (void) method is on the serialized side of the command + gate and can change member variables safely without multi-threading issues. Its main purpose is + to call the superclass' HandleCheckPowerState ( UInt32 maxPowerState ) with the max power state + with which the class registered. + */ + virtual void HandleCheckPowerState ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function TicklePowerManager + @abstract Internal method. Do not use. + @discussion Internal method. Do not use. + */ + virtual void TicklePowerManager ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function HandlePowerOff + @abstract Convenience method for a protocol service driver to handle a power off call (called + on the way to sleep). + @discussion Convenience method for a protocol service driver to handle a power off call (called + on the way to sleep). This method is guaranteed to be called after application layer drivers + have been put to sleep. + @result A valid IOReturn code. + */ + virtual IOReturn HandlePowerOff ( void ); + + /*! + @function HandlePowerOn + @abstract Convenience method for a protocol service driver to handle a power on call (called + on the way back up from sleep). + @discussion Convenience method for a protocol service driver to handle a power on call (called + on the way back up from sleep). Driver should perform any bus specific activity necessary to + recover from power-on/wake from sleep (e.g. bus reset on ATAPI). This method is guaranteed to + be called before application layer drivers have been awakened. + @result A valid IOReturn code. + */ + virtual IOReturn HandlePowerOn ( void ); + + +public: + + + /*! + @function init + @abstract Standard init method for all IORegistryEntry subclasses. + @discussion A registry entry must be initialized with this method before it can be used. A property dictionary may passed and will be retained by this method for use as the registry entry's property table, or an empty one will be created. + @param A dictionary that will become the registry entry's property table (retaining it), or zero which will cause an empty property table to be created. + @result true on success, or false on a resource failure. + */ + virtual bool init ( OSDictionary * propTable = 0 ) APPLE_KEXT_OVERRIDE; + + /*! + @function start + @abstract During an IOService object's instantiation, starts the IOService object that has been selected to run on the provider. + @discussion The start method of an IOService instance is called by its provider when it has been selected (due to its probe score and match category) as the winning client. The client is already attached to the provider when start is called.
Implementations of start must call start on their superclass at an appropriate point. If an implementation of start has already called super::start but subsequently determines that it will fail, it must call super::stop to balance the prior call to super::start and prevent reference leaks. + @result true if the start was successful; false otherwise (which will cause the instance to be detached and usually freed). + */ + virtual bool start ( IOService * provider ) APPLE_KEXT_OVERRIDE; + + + /*! + @function free + @abstract Frees data structures that were allocated during start(). + @discussion Frees data structures that were allocated during start(). + */ + virtual void free ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function RegisterSCSITaskCompletionRoutine + @abstract Used by IOSCSITargetDevice to register a completion routine. + @discussion Used by IOSCSITargetDevice to register a completion routine. Internal use only. + @param completion A SCSITaskCompletion routine. + */ + void RegisterSCSITaskCompletionRoutine ( SCSITaskCompletion completion ); + + // ------- SCSI Architecture Model Task Management Functions ------ + + /*! + @function ExecuteCommand + @abstract ExecuteCommand method will take a SCSI Task and transport it across the physical + wire(s) to the device. + @discussion ExecuteCommand method will take a SCSI Task and transport it across the physical + wire(s) to the device. + @param request A valid SCSITaskIdentifier. + */ + void ExecuteCommand ( SCSITaskIdentifier request ) APPLE_KEXT_OVERRIDE; + + /*! + @function AbortTask + @abstract The Task Management function to allow the SCSI Application Layer client to request + that a specific task be aborted. + @discussion The Task Management function to allow the SCSI Application Layer client to request + that a specific task be aborted. + @param theLogicalUnit A logical unit for which to abort a task. + @param theTag A valid SCSITaggedTaskIdentifier used to identify which task to abort. + @result A valid SCSIServiceResponse. + */ + SCSIServiceResponse AbortTask ( UInt8 theLogicalUnit, SCSITaggedTaskIdentifier theTag ) APPLE_KEXT_OVERRIDE; + + /*! + @function AbortTaskSet + @abstract The Task Management function to allow the SCSI Application Layer client to request + that a complete task set be aborted. + @discussion The Task Management function to allow the SCSI Application Layer client to request + that a complete task set be aborted. + @param theLogicalUnit A logical unit for which to abort the task set. + @result A valid SCSIServiceResponse. + */ + SCSIServiceResponse AbortTaskSet ( UInt8 theLogicalUnit ) APPLE_KEXT_OVERRIDE; + + /*! + @function ClearACA + @abstract The Task Management function to clear an Auto-Contingent Allegiance condition. + @discussion The Task Management function to clear an Auto-Contingent Allegiance condition. + @param theLogicalUnit A logical unit for which to clear the ACA. + @result A valid SCSIServiceResponse. + */ + SCSIServiceResponse ClearACA ( UInt8 theLogicalUnit ) APPLE_KEXT_OVERRIDE; + + /*! + @function ClearTaskSet + @abstract The Task Management function to clear a task set. + @discussion The Task Management function to clear a task set. + @param theLogicalUnit A logical unit for which to clear a task set. + @result A valid SCSIServiceResponse. + */ + SCSIServiceResponse ClearTaskSet ( UInt8 theLogicalUnit ) APPLE_KEXT_OVERRIDE; + + /*! + @function LogicalUnitReset + @abstract The Task Management function to reset a logical unit. + @discussion The Task Management function to reset a logical unit. + @param theLogicalUnit A logical unit for which to clear a task set. + @result A valid SCSIServiceResponse. + */ + SCSIServiceResponse LogicalUnitReset ( UInt8 theLogicalUnit ) APPLE_KEXT_OVERRIDE; + + /*! + @function TargetReset + @abstract The Task Management function to reset a target device. + @discussion The Task Management function to reset a target device. + @result A valid SCSIServiceResponse. + */ + SCSIServiceResponse TargetReset ( void ) APPLE_KEXT_OVERRIDE; + + // ************* Obsoleted Member Routine **************** + /*! + @function AbortCommand + @abstract Deprecated. Do not use. + @discussion Deprecated. Do not use. + */ + virtual SCSIServiceResponse AbortCommand ( SCSITaskIdentifier request ) APPLE_KEXT_OVERRIDE __attribute__ ((deprecated)); + + + // ---- Method used for determining protocol or physical interconnect characteristics. ---- + /*! + @function IsProtocolServiceSupported + @abstract IsProtocolServiceSupported will return true if the specified + feature is supported by the protocol layer. + @discussion IsProtocolServiceSupported will return true if the specified + feature is supported by the protocol layer. + @param feature A valid SCSIProtocolFeature. + @param serviceValue A pointer to a value for the protocol feature. + @result True if the requested service is supported, otherwise false. + */ + virtual bool IsProtocolServiceSupported ( SCSIProtocolFeature feature, void * serviceValue ) APPLE_KEXT_OVERRIDE = 0; + + /*! + @function HandleProtocolServiceFeature + @abstract HandleProtocolServiceFeature instructs the Protocol Services driver to perform the + necessary tasks for the indicated feature. + @discussion HandleProtocolServiceFeature instructs the Protocol Services driver to perform the + necessary tasks for the indicated feature. + @param feature A valid SCSIProtocolFeature. + @param serviceValue A pointer to a value for the protocol feature. + @result True if successful, otherwise false. + */ + virtual bool HandleProtocolServiceFeature ( SCSIProtocolFeature feature, void * serviceValue ) APPLE_KEXT_OVERRIDE = 0; + + +protected: + + // ----- Protocol Services Driver request handlers for Task Management functions ----- + + /*! + @function HandleAbortTask + @abstract HandleAbortTask instructs the Protocol Services driver to abort the task. + @discussion HandleAbortTask instructs the Protocol Services driver to abort the task. + @param theLogicalUnit A valid logical unit number. + @param theTag The tag of the command to abort. + @result A valid SCSIServiceResponse. + */ + OSMetaClassDeclareReservedUsed ( IOSCSIProtocolServices, 1 ); + virtual SCSIServiceResponse HandleAbortTask ( + UInt8 theLogicalUnit, + SCSITaggedTaskIdentifier theTag ); + + /*! + @function HandleAbortTaskSet + @abstract HandleAbortTaskSet instructs the Protocol Services driver to abort the task set. + @discussion HandleAbortTaskSet instructs the Protocol Services driver to abort the task set. + @param theLogicalUnit A valid logical unit number. + @result A valid SCSIServiceResponse. + */ + OSMetaClassDeclareReservedUsed ( IOSCSIProtocolServices, 2 ); + virtual SCSIServiceResponse HandleAbortTaskSet ( + UInt8 theLogicalUnit ); + + /*! + @function HandleClearACA + @abstract HandleClearACA instructs the Protocol Services driver to clear an auto-contingent allegiance. + @discussion HandleClearACA instructs the Protocol Services driver to clear an auto-contingent allegiance. + @param theLogicalUnit A valid logical unit number. + @result A valid SCSIServiceResponse. + */ + OSMetaClassDeclareReservedUsed ( IOSCSIProtocolServices, 3 ); + virtual SCSIServiceResponse HandleClearACA ( + UInt8 theLogicalUnit ); + + /*! + @function HandleClearTaskSet + @abstract HandleClearTaskSet instructs the Protocol Services driver to clear the task set. + @discussion HandleClearTaskSet instructs the Protocol Services driver to clear the task set. + @param theLogicalUnit A valid logical unit number. + @result A valid SCSIServiceResponse. + */ + OSMetaClassDeclareReservedUsed ( IOSCSIProtocolServices, 4 ); + virtual SCSIServiceResponse HandleClearTaskSet ( + UInt8 theLogicalUnit ); + + /*! + @function HandleLogicalUnitReset + @abstract HandleLogicalUnitReset instructs the Protocol Services driver to reset the logical unit. + @discussion HandleLogicalUnitReset instructs the Protocol Services driver to reset the logical unit. + @param theLogicalUnit A valid logical unit number. + @result A valid SCSIServiceResponse. + */ + OSMetaClassDeclareReservedUsed ( IOSCSIProtocolServices, 5 ); + virtual SCSIServiceResponse HandleLogicalUnitReset ( + UInt8 theLogicalUnit ); + + /*! + @function HandleTargetReset + @abstract HandleTargetReset instructs the Protocol Services driver to reset the target. + @discussion HandleTargetReset instructs the Protocol Services driver to reset the target. + @result A valid SCSIServiceResponse. + */ + OSMetaClassDeclareReservedUsed ( IOSCSIProtocolServices, 6 ); + virtual SCSIServiceResponse HandleTargetReset ( void ); + + /*! + @function CreateSCSITargetDevice + @abstract Used to create a SCSITargetDevice which will manage logical units. + @discussion The CreateSCSITargetDevice member routine will create the appropriate object + to represent the Target portion of a SCSI Device. This object is responsible + for managing the Target functions of the SCSI Device including the Task Manager and + Logical Units. + @result True if successful, otherwise false. + */ + OSMetaClassDeclareReservedUsed ( IOSCSIProtocolServices, 7 ); + virtual bool CreateSCSITargetDevice ( void ); + +private: + + +#if !TARGET_OS_IPHONE + // Space reserved for future expansion. + OSMetaClassDeclareReservedUnused ( IOSCSIProtocolServices, 8 ); + OSMetaClassDeclareReservedUnused ( IOSCSIProtocolServices, 9 ); + OSMetaClassDeclareReservedUnused ( IOSCSIProtocolServices, 10 ); + OSMetaClassDeclareReservedUnused ( IOSCSIProtocolServices, 11 ); + OSMetaClassDeclareReservedUnused ( IOSCSIProtocolServices, 12 ); + OSMetaClassDeclareReservedUnused ( IOSCSIProtocolServices, 13 ); + OSMetaClassDeclareReservedUnused ( IOSCSIProtocolServices, 14 ); + OSMetaClassDeclareReservedUnused ( IOSCSIProtocolServices, 15 ); + OSMetaClassDeclareReservedUnused ( IOSCSIProtocolServices, 16 ); +#endif /* !TARGET_OS_IPHONE */ + +}; + +#endif /* defined(KERNEL) && defined(__cplusplus) */ + +#endif /* _IOKIT_IO_SCSI_PROTOCOL_SERVICES_H_ */ diff --git a/QualcommWireless/include/IOKit/scsi/IOSCSIReducedBlockCommandsDevice.h b/QualcommWireless/include/IOKit/scsi/IOSCSIReducedBlockCommandsDevice.h new file mode 100644 index 0000000..8658fa7 --- /dev/null +++ b/QualcommWireless/include/IOKit/scsi/IOSCSIReducedBlockCommandsDevice.h @@ -0,0 +1,1010 @@ +/* + * Copyright (c) 1998-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#ifndef _IOKIT_IO_SCSI_REDUCED_BLOCK_COMMANDS_DEVICE_H_ +#define _IOKIT_IO_SCSI_REDUCED_BLOCK_COMMANDS_DEVICE_H_ + +#if defined(KERNEL) && defined(__cplusplus) + + +/*! @header SCSI Reduced Block Commands Device + @discussion + This file contains definitions for the IOSCSIReducedBlockCommandsDevice class, + commands required for RBC devices, power management, and additional constants + used by this class. + */ + + +//----------------------------------------------------------------------------- +// Includes +//----------------------------------------------------------------------------- + +// General IOKit headers +#include +#include + +// Generic IOKit storage related headers +#include + +// SCSI Architecture Model Family includes +#include + +// Build includes +#include + +//----------------------------------------------------------------------------- +// Constants +//----------------------------------------------------------------------------- + +// RBC power states as defined in T10:1240D SCSI Reduced Block Commands (RBC) +// Revision 10a, August 18, 1999, page 13. +enum +{ + kRBCPowerStateSystemSleep = 0, + kRBCPowerStateSleep = 1, + kRBCPowerStateStandby = 2, + kRBCPowerStateIdle = 3, + kRBCPowerStateActive = 4, + kRBCNumPowerStates = 5 +}; + +/*! +@enum Media lock state values +@discussion +Values used to set media lock state. +@constant kMediaStateUnlocked +Value to be passed in order to unlock media and make it availabe for writing. +@constant kMediaStateLocked +Value to be passed when the media is to be locked and made read-only. +*/ + +enum +{ + kMediaStateUnlocked = 0, + kMediaStateLocked = 1 +}; + +#define kCapacityDataBufferSize 8 + +// Forward declaration for the SCSIReducedBlockCommands that is used internally by the +// IOSCSIReducedBlockCommandsDevice class. +class SCSIReducedBlockCommands; + +//----------------------------------------------------------------------------- +// Class Declaration +//----------------------------------------------------------------------------- + +/*! +@class IOSCSIReducedBlockCommandsDevice +@superclass IOSCSIPrimaryCommandsDevice +@discussion +Implementation of the T10 device Reduced Block Commands device. This is the base +driver for all subclasses implementing peripheral device type 0xE. +*/ +class IOSCSIReducedBlockCommandsDevice : public IOSCSIPrimaryCommandsDevice +{ + + OSDeclareAbstractStructors ( IOSCSIReducedBlockCommandsDevice ); + +private: + + static void AsyncReadWriteComplete ( SCSITaskIdentifier completedTask ); + +protected: + + // Reserve space for future expansion. + struct IOSCSIReducedBlockCommandsDeviceExpansionData + { + IONotifier * fPowerDownNotifier; + bool fMediumRemovalPrevented; + bool fKnownManualEject; + UInt32 fPollingMode; + bool fProtocolSpecificPowerControl; + }; + IOSCSIReducedBlockCommandsDeviceExpansionData * fIOSCSIReducedBlockCommandsDeviceReserved; + + #define fPowerDownNotifier fIOSCSIReducedBlockCommandsDeviceReserved->fPowerDownNotifier + #define fMediumRemovalPrevented fIOSCSIReducedBlockCommandsDeviceReserved->fMediumRemovalPrevented + #define fKnownManualEject fIOSCSIReducedBlockCommandsDeviceReserved->fKnownManualEject + #define fPollingMode fIOSCSIReducedBlockCommandsDeviceReserved->fPollingMode + #define fProtocolSpecificPowerControl fIOSCSIReducedBlockCommandsDeviceReserved->fProtocolSpecificPowerControl + + bool fMediaChanged; + bool fMediaPresent; + + // The byte count of each physical block on the media. + UInt32 fMediaBlockSize; + + // The total number of blocks of mediaBlockSize on the media. + UInt32 fMediaBlockCount; + + // Flags used to indicate device features. + bool fMediaIsRemovable; + bool fMediaIsWriteProtected; + + thread_call_t fPollingThread; + + enum + { + kPollingMode_Suspended = 0, + kPollingMode_NewMedia = 1, + kPollingMode_MediaRemoval = 2 + }; + + /*! + @function CreateStorageServiceNub + @abstract Creates a nub which links the IOSCSIReducedBlockCommandsDevice to the IOStorageFamily. + @discussion Creates a nub which links the IOSCSIReducedBlockCommandsDevice to the IOStorageFamily. + */ + virtual void CreateStorageServiceNub ( void ); + + /*! + @function DetermineDeviceCharacteristics + @abstract Determine the characteristics of the device. + @discussion Determine the characteristics, ANSI version, removability, etc., of the device via its INQUIRY data. + @result true on success and false on failure. + */ + virtual bool DetermineDeviceCharacteristics ( void ); + + /*! + @function PollForMedia + @abstract Poll device for media insertion or removal depending on selected polling mode. + @discussion Polls device for media insertion or removal depending on selected polling mode. + If a change in media state is detected the correct media inserted or removed API is called from within PollForMedia. + */ + virtual void PollForMedia ( void ); + + /*! + @function EnablePolling + @abstract Enables media polling. + @discussion Schedules a thread to poll the device for media at the prescribed interval. + */ + virtual void EnablePolling ( void ); + + /*! + @function DisablePolling + @abstract Disables media polling. + @discussion Cancels ( if running ) the media polling thread. + */ + virtual void DisablePolling ( void ); + + /*! + @function CheckWriteProtection + @abstract Ascertains whether or not media is locked. + @discussion Determines the current write protection state of the media. + Result stored in fMediaIsWriteProtected. + */ + virtual void CheckWriteProtection ( void ); + + /*! + @function SetMediaCharacteristics + @abstract Sets the block size and block count for the current media. + @discussion Sets the block size and block count for the current media. + @param blockSize The media's block size in bytes. + @param blockCount The count of the media's blocks. + */ + virtual void SetMediaCharacteristics ( UInt32 blockSize, UInt32 blockCount ); + + /*! + @function ResetMediaCharacteristics + @abstract Resets the block size and block count. + @discussion Resets the block size and block count. + */ + virtual void ResetMediaCharacteristics ( void ); + + /*! + @function ClearNotReadyStatus + @abstract Clears any NOT_READY status for the device. + @discussion Polls device with TEST_UNIT_READY until the device returns kSCSITaskStatus_GOOD status. + Exits if device has become disconnected. + @result true if device is now active (isInactive == false) and false otherwise. + */ + virtual bool ClearNotReadyStatus ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function IssueRead + @abstract DEPRECATED. Please do not use this method. + @discussion DEPRECATED. Please do not use this method. + @param buffer DEPRECATED. Please do not use this method. + @param startBlock DEPRECATED. Please do not use this method. + @param blockCount DEPRECATED. Please do not use this method. + @result DEPRECATED. Please do not use this method. + */ + virtual IOReturn IssueRead ( IOMemoryDescriptor * buffer, + UInt64 startBlock, + UInt64 blockCount ); + + /*! + @function IssueWrite + @abstract DEPRECATED. Please do not use this method. + @discussion DEPRECATED. Please do not use this method. + @param buffer DEPRECATED. Please do not use this method. + @param startBlock DEPRECATED. Please do not use this method. + @param blockCount DEPRECATED. Please do not use this method. + @result DEPRECATED. Please do not use this method. + */ + virtual IOReturn IssueWrite ( IOMemoryDescriptor* buffer, + UInt64 startBlock, + UInt64 blockCount ); + + /*! + @function IssueRead + @abstract Issues an asynchronous read command. + @discussion Issues an asynchronous read command. + @param buffer A pointer to a valid IOMemoryDescriptor to which the data can be copied to. + @param startBlock Starting logical block address for the read operation. + @param blockCount The number of blocks to be read. + @param clientData A valid pointer to the client data to be used for callback completion. + @result A valid IOReturn value. + */ + virtual IOReturn IssueRead ( IOMemoryDescriptor * buffer, + UInt64 startBlock, + UInt64 blockCount, + void * clientData ); + + /*! + @function IssueWrite + @abstract Issues an asynchronous write command. + @discussion Issues an asynchronous write command. + @param buffer A pointer to a valid IOMemoryDescriptor to which the data can be copied from. + @param startBlock Starting logical block address for the write operation. + @param blockCount The number of blocks to be written. + @param clientData A valid pointer to the client data to be used for callback completion. + @result A valid IOReturn value. + */ + virtual IOReturn IssueWrite ( IOMemoryDescriptor * buffer, + UInt64 startBlock, + UInt64 blockCount, + void * clientData ); + + // ----- Power Management Support ------ + + /*! + @function InitializePowerManagement + @abstract Called to initialize power management. + @discussion Called by InitializeDeviceSupport() to initialize power management by, + joining the power management tree, registering power states, and setting the lowest idle + power state. + @param A valid pointer to this object's provider. + */ + + // We override this method to set our power states and register ourselves + // as a power policy maker. + virtual void InitializePowerManagement ( IOService * provider ) APPLE_KEXT_OVERRIDE; + + /*! + @function GetInitialPowerState + @abstract Called by power management to determine initial power state. + @discussion Called by power management to determine which power state is desired when + power management is initialized. + @result Returns the initial power state desired when power management is initialized. + */ + + // We override this method so that when we register for power management, + // we go to our active power state (which the drive is definitely in + // at startup time). + virtual UInt32 GetInitialPowerState ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function GetNumberOfPowerStateTransitions + @abstract Called by power management to determine this class's total + number of power state transitions. + @discussion Called by power management to determine this class's total + number of power state transitions. + @result Returns the number of power state transitions for this class. + */ + + // We override this method in order to provide the number of transitions + // from Fully active to Sleep state so that the idle timer can be adjusted + // to the appropriate time period based on the disk spin down time set in + // the Energy Saver prefs panel. + virtual UInt32 GetNumberOfPowerStateTransitions ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function TicklePowerManager + @abstract The TicklePowerManager() is called by CheckPowerState() and + sends an activity tickle ( via activityTickle() ) to the power manager + so that the idle timer is reset. + @discussion The TicklePowerManager() is called by CheckPowerState() and + sends an activity tickle ( via activityTickle() ) to the power manager + so that the idle timer is reset. + Subclasses must override this method. Third party subclasses shouldn't need to override + this method but can to alter the default behavior. + */ + + // The TicklePowerManager method is called to tell the power manager that the + // device needs to be in a certain power state to handle requests. + virtual void TicklePowerManager ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function HandlePowerChange + @abstract Handles the state machine for power management state changes. + @discussion Handles the state machine for power management state changes. + */ + + // The HandlePowerChange method is the state machine for power management. + // It is guaranteed to be on its own thread of execution (different from + // the power manager thread AND the workloop thread. This routine can + // send sync or async calls to the drive without worrying about threading + // issues. + virtual void HandlePowerChange ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function HandleCheckPowerState(void) + @abstract The HandleCheckPowerState (void) method is on the serialized side of the command + gate and can change member variables safely without multi-threading issues. + It's main purpose is to call the superclass' HandleCheckPowerState ( UInt32 maxPowerState ) + with the max power state the class registered with. + @discussion The HandleCheckPowerState (void) method is on the serialized side of the command + gate and can change member variables safely without multi-threading issues. + It's main purpose is to call the superclass' HandleCheckPowerState ( UInt32 maxPowerState ) + with the max power state the class registered with. + Subclasses must override this method. Third party subclasses shouldn't need to override + this method but can to alter the default behavior. The default behavior is to block until the + object transistions to its maximum power state. + */ + + virtual void HandleCheckPowerState ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function CheckMediaPresence + @abstract Called to ascertain the current presence of media. + @discussion Called to ascertain the current presence of media. + @result true if media is present and false if media is not present. + */ + + // The CheckMediaPresence method is called to see if the media which we + // anticipated being there is still there. + virtual bool CheckMediaPresence ( void ); + + /*! + @function InitializeDeviceSupport + @abstract Called in super class's start() to initialize device support. + @discussion Called in super class's start() to initialize device support. The underlying infrastructure + for supporting a device must be implemented here. + @result true if device could be successfully configured false if not. + */ + virtual bool InitializeDeviceSupport ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function StartDeviceSupport + @abstract Called in super class's start() to start device support. + @discussion Called in super class's start() to start device support. Support for starting + devices and making them usable must be implemented here. + */ + virtual void StartDeviceSupport ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function SuspendDeviceSupport + @abstract Called to temporarily suspend device support. + @discussion Called to temporarily suspend device support. Support for suspending + devices must be implemented here. + */ + virtual void SuspendDeviceSupport ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function ResumeDeviceSupport + @abstract Called to temporarily resume device support. + @discussion Called to temporarily resume device support. Support for resuming + devices must be implemented here. + */ + virtual void ResumeDeviceSupport ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function StopDeviceSupport + @abstract Called to stop device support. + @discussion Called to stop device support. Support for stopping + devices must be implemented here. + */ + virtual void StopDeviceSupport ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function TerminateDeviceSupport + @abstract Called to terminate device support. + @discussion Called to terminate device support. The underlying infrastructure for + support a device should be cleaned up here. + */ + virtual void TerminateDeviceSupport ( void ) APPLE_KEXT_OVERRIDE; + + /*! + @function free + @abstract Called to release all resources held by the object. + @discussion Release all resources held by the object, then call super::free(). + */ + virtual void free ( void ) APPLE_KEXT_OVERRIDE; + +public: + + /*! + @function SyncReadWrite + @abstract Translates a synchronous I/O request into a read or a write. + @discussion Translates a synchronous I/O request into a read or a write. + Default implementation always returns kIOReturnUnsupported. + @param buffer A pointer to a valid IOMemoryDescriptor to which the + data can be copied to or from. + @param startBlock Starting logical block address for the write operation. + @param blockCount The number of block to be write. + @result A valid IOReturn value. + */ + virtual IOReturn SyncReadWrite ( IOMemoryDescriptor * buffer, + UInt64 startBlock, + UInt64 blockCount ); + + /*! + @function AsyncReadWrite + @abstract Translates an asynchronous I/O request into a read or a write. + @discussion Translates an asynchronous I/O request into a read or a write. + @param buffer A pointer to a valid IOMemoryDescriptor to which the + data can be copied to or from. + @param startBlock Starting logical block address for the write operation. + @param blockCount The number of block to be write. + @result A valid IOReturn value. + */ + virtual IOReturn AsyncReadWrite ( IOMemoryDescriptor * buffer, + UInt64 block, + UInt64 nblks, + void * clientData ); + + /*! + @function EjectTheMedia + @abstract Called to eject the inserted media from the drive. + @discussion Called by IOBlockStorageDevice subclasses to eject the inserted + media from the drive. + @result A valid IOReturn value. + */ + virtual IOReturn EjectTheMedia ( void ); + + /*! + @function FormatMedia + @abstract Called to perform a low level format of the inserted media. + @discussion Called IOBlockStorageDevice subclasses to perform a low level + of the inserted media. Default implementation simply returns kIOReturnUnsupported + if not overridden. + @param byteCapacity + @result A valid IOReturn value. + */ + virtual IOReturn FormatMedia ( UInt64 byteCapacity ); + + /*! + @function GetFormatCapacities + @abstract Called to determine the formatted capacity of the inserted media. + @discussion Called IOBlockStorageDevice subclasses to determine the formatted + capacity of the inserted media. Presently unsupported by default implementation. + Returns 0 unless overridden. + @param capacities a pointer to a valid UInt64 array. + @param capacitiesMaxCount the number of elements addressable within capacities. + @result The number of elements assigned in capacities ( count is 1 based ). + */ + virtual UInt32 GetFormatCapacities ( UInt64 * capacities, + UInt32 capacitiesMaxCount ) const; + + /*! + @function LockUnlockMedia + @abstract Called to lock or unlock the inserted media. + @discussion Called by IOBlockStorageDevice subclasses to lock or unlock the inserted media. + @param doLock if true the media will be locked, if false the media will be unlocked. + @result A valid IOReturn value. + */ + virtual IOReturn LockUnlockMedia ( bool doLock ); + + /*! + @function SynchronizeCache + @abstract Called to synchronize the devices cache and thereby force its contents to be + written out to the media. + @discussion Called by IOBlockStorageDevice subclasses to synchronize the devices cache + and thereby force the cache's contents to be written out to the media. + @result A valid IOReturn value. + */ + virtual IOReturn SynchronizeCache ( void ); + + /*! + @function ReportBlockSize + @abstract Reports the logical block size of the media. + @discussion Called by IOBlockStorageDevice subclasses to get the logical block size of the media. + @param blockSize a valid pointer to a UInt64 in which the logical block size is to be stored. + @result A valid IOReturn value. + */ + virtual IOReturn ReportBlockSize ( UInt64 * blockSize ); + + /*! + @function ReportEjectability + @abstract Reports whether or not the media is ejectable. + @discussion Called by IOBlockStorageDevice subclasses to determine whether or not the media is ejectable. + @param isEjectable a valid pointer to a bool in which the ejectability of the media is to be stored. + @result A valid IOReturn value. + */ + virtual IOReturn ReportEjectability ( bool * isEjectable ); + + /*! + @function ReportLockability + @abstract Reports whether or not the media is lockable ( can be write protected ). + @discussion Called by IOBlockStorageDevice subclasses to determine whether or not the media is lockable + ( can be write protected ). + @param isLockable a valid pointer to a bool in which the lockability of the media is to be stored. + @result A valid IOReturn value. + */ + virtual IOReturn ReportLockability ( bool * isLockable ); + + /*! + @function ReportPollRequirements + @abstract Reports polling requirements to caller. + @discussion Called by IOBlockStorageDevice subclasses to determine polling requirements. + Used to determine if polling for media is required and if polling is expensive. + @param pollIsRequired a pointer to a bool in which to store whether or not polling is required. + @param pollIsExpensive a pointer to a bool in which to store whether or not polling is expensive. + @result A valid IOReturn value. + */ + virtual IOReturn ReportPollRequirements ( bool * pollIsRequired, + bool * pollIsExpensive ); + + /*! + @function ReportMaxReadTransfer + @abstract Reports maximum read transfer size to caller. + @discussion Called by IOBlockStorageDevice subclasses to determine the maximum size + of a read transfer in bytes. + @param blockSize used to pass in the block size to be used for a follow up transfer. + @param max a pointer to a UInt64 in which to store the maximum transfer size in bytes. + @result A valid IOReturn value. + */ + virtual IOReturn ReportMaxReadTransfer ( UInt64 blockSize, + UInt64 * max ); + + /*! + @function ReportMaxValidBlock + @abstract Reports the maximum valid block on the media. + @discussion Called by IOBlockStorageDevice subclasses to determine the maximum valid + block of the media. + @param maxBlock a pointer to a UInt64 in which the maximum valid block is to be stored. + @result A valid IOReturn value. + */ + virtual IOReturn ReportMaxValidBlock ( UInt64 * maxBlock ); + + /*! + @function ReportMaxWriteTransfer + @abstract Reports maximum write transfer size to caller. + @discussion Called by IOBlockStorageDevice subclasses to determine the maximum size + of a write transfer in bytes. + @param blockSize used to pass in the block size of the media. + @param max a pointer to a UInt64 in which to store the maximum transfer size in bytes. + @result A valid IOReturn value. + */ + virtual IOReturn ReportMaxWriteTransfer ( UInt64 blockSize, + UInt64 * max ); + + /*! + @function ReportMediaState + @abstract Reports the state of media in the device. + @discussion Called by IOBlockStorageDevice subclasses to determine whether or not media is + present and if that media has changed. + @param mediaPresent a pointer to a bool in which media presence will be stored. + @param changed a pointer to a bool in which whether or not the media has changed will be stored. + @result A valid IOReturn value. + */ + virtual IOReturn ReportMediaState ( bool * mediaPresent, + bool * changed ); + + /*! + @function ReportRemovability + @abstract Reports whether or not the media may be removed. + @discussion Called by IOBlockStorageDevice subclasses to determine whether or not the media may be removed. + @param isRemovable a pointer to a bool in which whether or not the media can be me removed + will be stored. + @result A valid IOReturn value. + */ + virtual IOReturn ReportRemovability ( bool * isRemovable ); + + /*! + @function ReportWriteProtection + @abstract Reports whether or not the media is write protected. + @discussion Called by IOBlockStorageDevice subclasses to determine whether or not the media is write protected. + @param isWriteProtected a pointer to a bool in which whether or not the media is write protected will be stored. + @result A valid IOReturn value. + */ + virtual IOReturn ReportWriteProtection ( bool * isWriteProtected ); + + /*! + @function sPollForMedia + @abstract Static method called to poll for media. + @discussion Static method called to poll for media. + @param pdtDriver a pointer to a valid IOSCSIReducedBlockCommandsDevice ( or subclass ) which is to + be polled. + @param refCon a pointer to an additional object which can be determined by the implementer. + */ + static void sPollForMedia ( void * pdtDriver, void * refCon ); + + +protected: + + + /*! + @function FORMAT_UNIT + @abstract Builds a FORMAT UNIT command. + @discussion Builds a FORMAT UNIT command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param IMMED used to specify whether or not the immediate bit for the command needs to be set. + @param PROGRESS used to specify whether or not the progress bit for the commands needs to be set. + @param PERCENT_TIME used to specify whether or not the percent time bit for the command needs to be set. + @param INCREMENT used to specify whether or not the increment bit for the command needs to be set. + @result true if the command was successfully built and false if not. + */ + // The FORMAT_UNIT command as defined in section 5.1 + virtual bool FORMAT_UNIT ( + SCSITaskIdentifier request, + SCSICmdField1Bit IMMED, + SCSICmdField1Bit PROGRESS, + SCSICmdField1Bit PERCENT_TIME, + SCSICmdField1Bit INCREMENT ); + + /*! + @function INQUIRY + @abstract Builds a INQUIRY command. + @discussion Builds a INQUIRY command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param dataBuffer a point to a valid IOMemoryDescriptor in which the received INQUIRY data is to be stored. + @param CMDDT used to specify whether or not the command support data ( CmdDT ) bit for the commands needs to be set. + @param EVPD used to specify whether or not the vital product data ( EVPD ) bit for the command needs to be set. + @param PAGE_OR_OPERATION_CODE used to specify which INQUIRY data page is being requested of the device. + @param ALLOCATION_LENGTH used to specify the maximum requested amount of INQUIRY data. + @result true if the command was successfully built and false if not. + */ + // The INQUIRY command as defined in SPC-2 w/o CONTROL byte + virtual bool INQUIRY ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField1Bit CMDDT, + SCSICmdField1Bit EVPD, + SCSICmdField1Byte PAGE_OR_OPERATION_CODE, + SCSICmdField1Byte ALLOCATION_LENGTH ); + + /*! + @function MODE_SELECT_6 + @abstract Builds a MODE SELECT(6) command. + @discussion Builds a MODE SELECT(6) command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param dataBuffer a point to a valid IOMemoryDescriptor in which the MODE SELECT data is stored. + @param PF used to specify whether or not the page format ( PF ) bit for the commands needs to be set. + @param SP used to specify whether or not the saves pages ( SP ) bit for the command needs to be set. + @param PARAMETER_LIST_LENGTH used to specify the length of the supplied data. + @result true if the command was successfully built and false if not. + */ + // The MODE_SELECT(6) command as defined in SPC-2 w/o CONTROL byte + virtual bool MODE_SELECT_6 ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField1Bit PF, + SCSICmdField1Bit SP, + SCSICmdField1Byte PARAMETER_LIST_LENGTH ); + + /*! + @function MODE_SENSE_6 + @abstract Builds a MODE SENSE(6) command. + @discussion Builds a MODE SENSE(6) command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param dataBuffer a point to a valid IOMemoryDescriptor in which the MODE SENSE data is to be stored. + @param DBD used to specify whether or not the disable block descriptors ( DBD ) bit for the commands needs to be set. + @param PC used to specify the desired page control ( PC ) value. + @param PAGE_CODE used to specify the desired page code. + @param ALLOCATION_LENGTH used to specify the maximum requested amount of MODE_SENSE data. + @result true if the command was successfully built and false if not. + */ + // The MODE_SENSE(6) command as defined in SPC-2 w/o CONTROL byte + virtual bool MODE_SENSE_6 ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField1Bit DBD, + SCSICmdField2Bit PC, + SCSICmdField6Bit PAGE_CODE, + SCSICmdField1Byte ALLOCATION_LENGTH ); + + /*! + @function PERSISTENT_RESERVE_IN + @abstract Builds a PERSISTENT RESERVE IN command. + @discussion Builds a PERSISTENT RESERVE IN command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param dataBuffer a point to a valid IOMemoryDescriptor in which the reservation data is to be stored. + @param SERVICE_ACTION used to specify the SERVICE ACTION code. + @param ALLOCATION_LENGTH used to specify the number of parameter data bytes available to be returned. + @result true if the command was successfully built and false if not. + */ + // The PERSISTENT_RESERVE_IN command as defined in SPC-2 w/o CONTROL byte + virtual bool PERSISTENT_RESERVE_IN ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField5Bit SERVICE_ACTION, + SCSICmdField2Byte ALLOCATION_LENGTH ); + + /*! + @function PERSISTENT_RESERVE_OUT + @abstract Builds a PERSISTENT RESERVE OUT command. + @discussion Builds a PERSISTENT RESERVE OUT command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param dataBuffer a point to a valid IOMemoryDescriptor in which the reservation data is stored. + @param SERVICE_ACTION used to specify the SERVICE ACTION code. + @param SCOPE used to specify the desired scope. + @param TYPE used to specify the desired type. + @result true if the command was successfully built and false if not. + */ + // The PERSISTENT_RESERVE_OUT command as defined in SPC-2 w/o CONTROL byte + virtual bool PERSISTENT_RESERVE_OUT ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField5Bit SERVICE_ACTION, + SCSICmdField4Bit SCOPE, + SCSICmdField4Bit TYPE ); + + /*! + @function PREVENT_ALLOW_MEDIUM_REMOVAL + @abstract Builds a PREVENT ALLOW MEDIUM REMOVAL command. + @discussion Builds a PREVENT ALLOW MEDIUM REMOVAL command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param PREVENT used to specify whether or not media removal shall be prevented or allowed. The caller + uses kMediaStateUnlocked or kMediaStateLocked constant to set the state. + @result true if the command was successfully built and false if not. + */ + // The PREVENT_ALLOW_MEDIUM_REMOVAL command as defined in SPC-2 w/o CONTROL byte + virtual bool PREVENT_ALLOW_MEDIUM_REMOVAL ( + SCSITaskIdentifier request, + SCSICmdField2Bit PREVENT ); + + /*! + @function READ_10 + @abstract Builds a READ(10) command. + @discussion Builds a READ(10) command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param dataBuffer a point to a valid IOMemoryDescriptor in which the read data is to be stored. + @param blockSize used to specify the block size to be used for the read. + @param LOGICAL_BLOCK_ADDRESS used to specify the logical block address from which the read is to be initiated. + @param TRANSFER_LENGTH the desired transfer length in blocks. + @result true if the command was successfully built and false if not. + */ + // The READ_10 command as defined in section 5.2 + virtual bool READ_10 ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + UInt32 blockSize, + SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS, + SCSICmdField2Byte TRANSFER_LENGTH ); + + /*! + @function READ_CAPACITY + @abstract Builds a READ CAPACITY command. + @discussion Builds a READ CAPACITY command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param dataBuffer a point to a valid IOMemoryDescriptor in which the read capacity data is to be stored. + @result true if the command was successfully built and false if not. + */ + // The READ_CAPACITY command as defined in section 5.3 + virtual bool READ_CAPACITY ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer ); + + /*! + @function RELEASE_6 + @abstract Builds a RELEASE(6) command. + @discussion Builds a RELEASE(6) command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @result true if the command was successfully built and false if not. + */ + // The RELEASE(6) command as defined in SPC-2 w/o CONTROL byte + virtual bool RELEASE_6 ( + SCSITaskIdentifier request ); + + /*! + @function REQUEST_SENSE + @abstract Builds a REQUEST SENSE command. + @discussion Builds a REQUEST SENSE command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param dataBuffer a point to a valid IOMemoryDescriptor in which the sense data is to be stored. + @param ALLOCATION_LENGTH the maximum size of sense data to be supplied. + @result true if the command was successfully built and false if not. + */ + // The REQUEST_SENSE command as defined in SPC-2 w/o CONTROL byte + virtual bool REQUEST_SENSE ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField1Byte ALLOCATION_LENGTH ); + + /*! + @function RESERVE_6 + @abstract Builds a RESERVE(6) command. + @discussion Builds a RESERVE(6) command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @result true if the command was successfully built and false if not. + */ + // The RESERVE(6) command as defined in SPC-2 w/o CONTROL byte + virtual bool RESERVE_6 ( + SCSITaskIdentifier request ); + + /*! + @function START_STOP_UNIT + @abstract Builds a START STOP UNIT command. + @discussion Builds a START STOP UNIT command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param IMMED used to specify whether or not the immediate bit for the command needs to be set. + @param POWER_CONDITIONS used to specify the desired POWER CONDITIONS code. + @param LEOJ used to specify whether or not the LOAD/EJECT ( LEOJ ) bit for the command needs to be set. + @param START used to specify whether or not the START bit for the command needs to be set. + @result true if the command was successfully built and false if not. + */ + // The START_STOP_UNIT command as defined in section 5.4 + virtual bool START_STOP_UNIT ( + SCSITaskIdentifier request, + SCSICmdField1Bit IMMED, + SCSICmdField4Bit POWER_CONDITIONS, + SCSICmdField1Bit LEOJ, + SCSICmdField1Bit START ); + + /*! + @function SYNCHRONIZE_CACHE + @abstract Builds a SYNCHRONIZE CACHE command. + @discussion Builds a SYNCHRONIZE CACHE command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @result true if the command was successfully built and false if not. + */ + // The SYNCRONIZE_CACHE command as defined in section 5.5 + virtual bool SYNCHRONIZE_CACHE ( + SCSITaskIdentifier request ); + + /*! + @function TEST_UNIT_READY + @abstract Builds a TEST UNIT READY command. + @discussion Builds a TEST UNIT READY command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @result true if the command was successfully built and false if not. + */ + // The TEST_UNIT_READY command as defined in SPC-2 w/o CONTROL byte + virtual bool TEST_UNIT_READY ( + SCSITaskIdentifier request ); + + /*! + @function VERIFY + @abstract Builds a VERIFY command. + @discussion Builds a VERIFY command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param LOGICAL_BLOCK_ADDRESS used to specify the logical block address from which the verify should be initiated. + @param VERIFICATION_LENGTH the desired length in blocks. + @result true if the command was successfully built and false if not. + */ + // The VERIFY command as defined in section 5.7 + virtual bool VERIFY ( + SCSITaskIdentifier request, + SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS, + SCSICmdField2Byte VERIFICATION_LENGTH ); + + /*! + @function WRITE_10 + @abstract Builds a WRITE(10) command. + @discussion Builds a WRITE(10) command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param dataBuffer a point to a valid IOMemoryDescriptor in which the data to be written is stored. + @param blockSize used to specify the block size to be used for the write. + @param FUA used specify whether or not the force unit access ( FUA ) bit should be set. + @param LOGICAL_BLOCK_ADDRESS used to specify the logical block address from which the write should be initiated. + @param TRANSFER_LENGTH the desired transfer length in blocks. + @result true if the command was successfully built and false if not. + */ + // The WRITE_10 command as defined in section 5.6 + virtual bool WRITE_10 ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + UInt32 blockSize, + SCSICmdField1Bit FUA, + SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS, + SCSICmdField2Byte TRANSFER_LENGTH ); + + /*! + @function WRITE_BUFFER + @abstract Builds a WRITE BUFFER command. + @discussion Builds a WRITE BUFFER command. + @param request a SCSITaskIdentifier in which the built command will be stored. + @param dataBuffer a point to a valid IOMemoryDescriptor in which the data to be written is stored. + @param MODE used to specify which WRITE BUFFER mode is to be used. + @param BUFFER_ID used to be specificy the desired buffer ID. + @param BUFFER_OFFSET used to specify the desired buffer offset. + @param PARAMETER_LIST_LENGTH the length of the buffer to be transferred. + @result true if the command was successfully built and false if not. + */ + // The WRITE_BUFFER command as defined in SPC-2 w/o CONTROL byte + virtual bool WRITE_BUFFER ( + SCSITaskIdentifier request, + IOMemoryDescriptor * dataBuffer, + SCSICmdField4Bit MODE, + SCSICmdField1Byte BUFFER_ID, + SCSICmdField3Byte BUFFER_OFFSET, + SCSICmdField3Byte PARAMETER_LIST_LENGTH ); + + + + /* Added with 10.2 */ + OSMetaClassDeclareReservedUsed ( IOSCSIReducedBlockCommandsDevice, 1 ); + +public: + + /*! + @function PowerDownHandler + @abstract Method called at sleep, restart, or shutdown time. + @discussion Notification handler registered with registerPrioritySleepWakeInterest(). + @param refCon a pointer to an object which can be determined by the implementer when + registerPrioritySleepWakeInterest() is called. + @param messageType a constant defined in IOMessage.h ( kIOMessageSystemWillPowerOff, kIOMessageSystemWillRestart, etc. ). + @param provider a pointer to the provider of the notification. + @param messageArgument a pointer to the notification's argument. + @param argSize the size of the argument. + @result A valid IOReturn value. + */ + virtual IOReturn PowerDownHandler ( void * refCon, + UInt32 messageType, + IOService * provider, + void * messageArgument, + vm_size_t argSize ); + + + /* Added with 10.2 */ + OSMetaClassDeclareReservedUsed ( IOSCSIReducedBlockCommandsDevice, 2 ); + +protected: + + /*! + @function SetMediaIcon + @abstract Sets graphical icon for device's media objects. + @discussion Provides an opportunity for the driver to select a more fitting icon then default icon. + */ + virtual void SetMediaIcon ( void ); + + + /* Added with 10.3.3 */ + OSMetaClassDeclareReservedUsed ( IOSCSIReducedBlockCommandsDevice, 3 ); + +protected: + + /*! + @function AsyncReadWriteCompletion + @abstract Completion routine for asynchronous read and write requests. + @discussion Completion routine for asynchronous read and write requests. + */ + virtual void AsyncReadWriteCompletion ( SCSITaskIdentifier completedTask ); + + +private: + + // Space reserved for future expansion. + OSMetaClassDeclareReservedUnused ( IOSCSIReducedBlockCommandsDevice, 4 ); + OSMetaClassDeclareReservedUnused ( IOSCSIReducedBlockCommandsDevice, 5 ); + OSMetaClassDeclareReservedUnused ( IOSCSIReducedBlockCommandsDevice, 6 ); + OSMetaClassDeclareReservedUnused ( IOSCSIReducedBlockCommandsDevice, 7 ); + OSMetaClassDeclareReservedUnused ( IOSCSIReducedBlockCommandsDevice, 8 ); + OSMetaClassDeclareReservedUnused ( IOSCSIReducedBlockCommandsDevice, 9 ); + OSMetaClassDeclareReservedUnused ( IOSCSIReducedBlockCommandsDevice, 10 ); + OSMetaClassDeclareReservedUnused ( IOSCSIReducedBlockCommandsDevice, 11 ); + OSMetaClassDeclareReservedUnused ( IOSCSIReducedBlockCommandsDevice, 12 ); + OSMetaClassDeclareReservedUnused ( IOSCSIReducedBlockCommandsDevice, 13 ); + OSMetaClassDeclareReservedUnused ( IOSCSIReducedBlockCommandsDevice, 14 ); + OSMetaClassDeclareReservedUnused ( IOSCSIReducedBlockCommandsDevice, 15 ); + OSMetaClassDeclareReservedUnused ( IOSCSIReducedBlockCommandsDevice, 16 ); + +}; + +#endif /* defined(KERNEL) && defined(__cplusplus) */ + +#endif /* _IOKIT_IO_SCSI_REDUCED_BLOCK_COMMANDS_DEVICE_H_ */ diff --git a/QualcommWireless/include/IOKit/scsi/SCSICmds_INQUIRY_Definitions.h b/QualcommWireless/include/IOKit/scsi/SCSICmds_INQUIRY_Definitions.h new file mode 100644 index 0000000..c2ec0d2 --- /dev/null +++ b/QualcommWireless/include/IOKit/scsi/SCSICmds_INQUIRY_Definitions.h @@ -0,0 +1,1232 @@ +/* + * Copyright (c) 1998-2018 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_SCSI_CMDS_INQUIRY_H_ +#define _IOKIT_SCSI_CMDS_INQUIRY_H_ + + +//----------------------------------------------------------------------------- +// Includes +//----------------------------------------------------------------------------- + +#if KERNEL +#include +#else +#include +#endif + + +/*! @header SCSI Inquiry Definitions + @discussion + This file contains all definitions for the data returned from + the INQUIRY (0x12) command. +*/ + + +/*! + * @enum Payload sizes + * @discussion + * Definitions for sizes related to the INQUIRY data. + * @constant kINQUIRY_StandardDataHeaderSize + * INQUIRY data header size. + * @constant kINQUIRY_MaximumDataSize + * Maximum size for INQUIRY data. +*/ +enum +{ + kINQUIRY_StandardDataHeaderSize = 5, + kINQUIRY_MaximumDataSize = 255 +}; + + +/*! +@enum INQUIRY field sizes +@discussion +Sizes for some of the inquiry data fields. +@constant kINQUIRY_VENDOR_IDENTIFICATION_Length +Size of VENDOR_IDENTIFICATION field. +@constant kINQUIRY_PRODUCT_IDENTIFICATION_Length +Size of PRODUCT_IDENTIFICATION field. +@constant kINQUIRY_PRODUCT_REVISION_LEVEL_Length +Size of PRODUCT_REVISION_LEVEL field. +*/ +enum +{ + kINQUIRY_VENDOR_IDENTIFICATION_Length = 8, + kINQUIRY_PRODUCT_IDENTIFICATION_Length = 16, + kINQUIRY_PRODUCT_REVISION_LEVEL_Length = 4 +}; + + +/*! +@struct SCSICmd_INQUIRY_StandardData +@discussion +This structure defines the format of the required standard data that is +returned for the INQUIRY command. This is the data that is required to +be returned from all devices. +*/ +typedef struct SCSICmd_INQUIRY_StandardData +{ + UInt8 PERIPHERAL_DEVICE_TYPE; // 7-5 = Qualifier. 4-0 = Device type. + UInt8 RMB; // 7 = removable + UInt8 VERSION; // 7/6 = ISO/IEC, 5-3 = ECMA, 2-0 = ANSI. + UInt8 RESPONSE_DATA_FORMAT; // 7 = AERC, 6 = Obsolete, 5 = NormACA, 4 = HiSup 3-0 = Response data format. (SPC-3 obsoletes AERC) + // If ANSI Version = 0, this is ATAPI and bits 7-4 = ATAPI version. + UInt8 ADDITIONAL_LENGTH; // Number of additional bytes available in inquiry data + UInt8 SCCSReserved; // SCC-2 device flag and reserved fields (SPC-3 adds PROTECT 3PC TPGS, and ACC) + UInt8 flags1; // First byte of support flags (See SPC-3 section 6.4.2) + UInt8 flags2; // Second byte of support flags (Byte 7) (See SPC-3 section 6.4.2) + char VENDOR_IDENTIFICATION[kINQUIRY_VENDOR_IDENTIFICATION_Length]; + char PRODUCT_IDENTIFICATION[kINQUIRY_PRODUCT_IDENTIFICATION_Length]; + char PRODUCT_REVISION_LEVEL[kINQUIRY_PRODUCT_REVISION_LEVEL_Length]; +} SCSICmd_INQUIRY_StandardData; +typedef SCSICmd_INQUIRY_StandardData * SCSICmd_INQUIRY_StandardDataPtr; + + +/*! +@struct SCSICmd_INQUIRY_StandardDataAll +@discussion +This structure defines the all of the fields that can be returned in +repsonse to the INQUIRy request for the standard data. There is no +requirement as to how much of the additional data must be returned by a device. +*/ +typedef struct SCSICmd_INQUIRY_StandardDataAll +{ + UInt8 PERIPHERAL_DEVICE_TYPE; // 7-5 = Qualifier. 4-0 = Device type. + UInt8 RMB; // 7 = removable + UInt8 VERSION; // 7/6 = ISO/IEC, 5-3 = ECMA, 2-0 = ANSI. + UInt8 RESPONSE_DATA_FORMAT; // 7 = AERC, 6 = Obsolete, 5 = NormACA, 4 = HiSup 3-0 = Response data format. + // If ANSI Version = 0, this is ATAPI and bits 7-4 = ATAPI version. + UInt8 ADDITIONAL_LENGTH; // Number of additional bytes available in inquiry data + UInt8 SCCSReserved; // SCC-2 device flag and reserved fields + UInt8 flags1; // First byte of support flags (Byte 6) + UInt8 flags2; // Second byte of support flags (Byte 7) + char VENDOR_IDENTIFICATION[kINQUIRY_VENDOR_IDENTIFICATION_Length]; + char PRODUCT_IDENTIFICATION[kINQUIRY_PRODUCT_IDENTIFICATION_Length]; + char PRODUCT_REVISION_LEVEL[kINQUIRY_PRODUCT_REVISION_LEVEL_Length]; + + // Following is the optional data that may be returned by a device. + UInt8 VendorSpecific1[20]; + UInt8 flags3; // Third byte of support flags, mainly SPI-3 (Byte 56) + UInt8 Reserved1; + UInt16 VERSION_DESCRIPTOR[8]; + UInt8 Reserved2[22]; + UInt8 VendorSpecific2[160]; +} SCSICmd_INQUIRY_StandardDataAll; + + +/*! +@enum Peripheral Qualifier +@discussion +Inquiry Peripheral Qualifier definitions +@constant kINQUIRY_PERIPHERAL_QUALIFIER_Connected +Peripheral Device is connected. +@constant kINQUIRY_PERIPHERAL_QUALIFIER_SupportedButNotConnected +Peripheral Device is supported, but not connected. +@constant kINQUIRY_PERIPHERAL_QUALIFIER_NotSupported +Peripheral Device is not supported. +@constant kINQUIRY_PERIPHERAL_QUALIFIER_Mask +Mask to use for PERIPHERAL_DEVICE_TYPE field. +*/ +enum +{ + kINQUIRY_PERIPHERAL_QUALIFIER_Connected = 0x00, + kINQUIRY_PERIPHERAL_QUALIFIER_SupportedButNotConnected = 0x20, + kINQUIRY_PERIPHERAL_QUALIFIER_NotSupported = 0x60, + kINQUIRY_PERIPHERAL_QUALIFIER_Mask = 0xE0 +}; + + +/*! +@enum Peripheral Device types +@discussion +Inquiry Peripheral Device type definitions +@constant kINQUIRY_PERIPHERAL_TYPE_DirectAccessSBCDevice +SBC Device. +@constant kINQUIRY_PERIPHERAL_TYPE_SequentialAccessSSCDevice +Sequential Access (Tape) SSC Device. +@constant kINQUIRY_PERIPHERAL_TYPE_PrinterSSCDevice +SSC Device. +@constant kINQUIRY_PERIPHERAL_TYPE_ProcessorSPCDevice +SPC Device. +@constant kINQUIRY_PERIPHERAL_TYPE_WriteOnceSBCDevice +SBC Device. +@constant kINQUIRY_PERIPHERAL_TYPE_CDROM_MMCDevice +MMC Device. +@constant kINQUIRY_PERIPHERAL_TYPE_ScannerSCSI2Device +SCSI2 Device. +@constant kINQUIRY_PERIPHERAL_TYPE_OpticalMemorySBCDevice +SBC Device. +@constant kINQUIRY_PERIPHERAL_TYPE_MediumChangerSMCDevice +SMC Device. +@constant kINQUIRY_PERIPHERAL_TYPE_CommunicationsSSCDevice +Comms SSC Device. +@constant kINQUIRY_PERIPHERAL_TYPE_StorageArrayControllerSCC2Device +SCC2 Device. +@constant kINQUIRY_PERIPHERAL_TYPE_EnclosureServicesSESDevice +SES Device. +@constant kINQUIRY_PERIPHERAL_TYPE_SimplifiedDirectAccessRBCDevice +RBC Device. +@constant kINQUIRY_PERIPHERAL_TYPE_OpticalCardReaderOCRWDevice +OCRW Device. +@constant kINQUIRY_PERIPHERAL_TYPE_ObjectBasedStorageDevice +OSD device. +@constant kINQUIRY_PERIPHERAL_TYPE_AutomationDriveInterface +Automation Drive Interface device. +@constant kINQUIRY_PERIPHERAL_TYPE_WellKnownLogicalUnit +Well known logical unit. +@constant kINQUIRY_PERIPHERAL_TYPE_UnknownOrNoDeviceType +Unknown or no device. +@constant kINQUIRY_PERIPHERAL_TYPE_Mask +Mask to use for PERIPHERAL_DEVICE_TYPE field. +*/ +enum +{ + kINQUIRY_PERIPHERAL_TYPE_DirectAccessSBCDevice = 0x00, + kINQUIRY_PERIPHERAL_TYPE_SequentialAccessSSCDevice = 0x01, + kINQUIRY_PERIPHERAL_TYPE_PrinterSSCDevice = 0x02, + kINQUIRY_PERIPHERAL_TYPE_ProcessorSPCDevice = 0x03, + kINQUIRY_PERIPHERAL_TYPE_WriteOnceSBCDevice = 0x04, + kINQUIRY_PERIPHERAL_TYPE_CDROM_MMCDevice = 0x05, + kINQUIRY_PERIPHERAL_TYPE_ScannerSCSI2Device = 0x06, + kINQUIRY_PERIPHERAL_TYPE_OpticalMemorySBCDevice = 0x07, + kINQUIRY_PERIPHERAL_TYPE_MediumChangerSMCDevice = 0x08, + kINQUIRY_PERIPHERAL_TYPE_CommunicationsSSCDevice = 0x09, + /* 0x0A - 0x0B ASC IT8 Graphic Arts Prepress Devices */ + kINQUIRY_PERIPHERAL_TYPE_StorageArrayControllerSCC2Device = 0x0C, + kINQUIRY_PERIPHERAL_TYPE_EnclosureServicesSESDevice = 0x0D, + kINQUIRY_PERIPHERAL_TYPE_SimplifiedDirectAccessRBCDevice = 0x0E, + kINQUIRY_PERIPHERAL_TYPE_OpticalCardReaderOCRWDevice = 0x0F, + /* 0x10 - 0x1E Reserved Device Types */ + kINQUIRY_PERIPHERAL_TYPE_ObjectBasedStorageDevice = 0x11, + kINQUIRY_PERIPHERAL_TYPE_AutomationDriveInterface = 0x12, + kINQUIRY_PERIPHERAL_TYPE_WellKnownLogicalUnit = 0x1E, + kINQUIRY_PERIPHERAL_TYPE_UnknownOrNoDeviceType = 0x1F, + + + kINQUIRY_PERIPHERAL_TYPE_Mask = 0x1F +}; + + +/*! +@enum Removable Bit field definitions +@discussion +Inquiry Removable Bit field definitions +@constant kINQUIRY_PERIPHERAL_RMB_MediumFixed +Medium type is fixed disk. +@constant kINQUIRY_PERIPHERAL_RMB_MediumRemovable +Medium type is removable disk. +@constant kINQUIRY_PERIPHERAL_RMB_BitMask +Mask to use for RMB field. +*/ +enum +{ + kINQUIRY_PERIPHERAL_RMB_MediumFixed = 0x00, + kINQUIRY_PERIPHERAL_RMB_MediumRemovable = 0x80, + kINQUIRY_PERIPHERAL_RMB_BitMask = 0x80 +}; + + +/*! +@enum Version field definitions +@discussion +Definitions for bits/masks in the INQUIRY Version field. +@constant kINQUIRY_ISO_IEC_VERSION_Mask +Mask for valid bits for ISO/IEC Version. +@constant kINQUIRY_ECMA_VERSION_Mask +Mask for valid bits for ECMA Version. +@constant kINQUIRY_ANSI_VERSION_NoClaimedConformance +No ANSI conformance claimed by the device server. +@constant kINQUIRY_ANSI_VERSION_SCSI_1_Compliant +SCSI-1 conformance claimed by the device server. +@constant kINQUIRY_ANSI_VERSION_SCSI_2_Compliant +SCSI-2 conformance claimed by the device server. +@constant kINQUIRY_ANSI_VERSION_SCSI_SPC_Compliant +SPC conformance claimed by the device server. +@constant kINQUIRY_ANSI_VERSION_SCSI_SPC_2_Compliant +SPC-2 conformance claimed by the device server. +@constant kINQUIRY_ANSI_VERSION_SCSI_SPC_3_Compliant +SPC-3 conformance claimed by the device server. +@constant kINQUIRY_ANSI_VERSION_Mask +Mask for valid bits for ANSI Version. +*/ +enum +{ + kINQUIRY_ISO_IEC_VERSION_Mask = 0xC0, + + kINQUIRY_ECMA_VERSION_Mask = 0x38, + + kINQUIRY_ANSI_VERSION_NoClaimedConformance = 0x00, + kINQUIRY_ANSI_VERSION_SCSI_1_Compliant = 0x01, + kINQUIRY_ANSI_VERSION_SCSI_2_Compliant = 0x02, + kINQUIRY_ANSI_VERSION_SCSI_SPC_Compliant = 0x03, + kINQUIRY_ANSI_VERSION_SCSI_SPC_2_Compliant = 0x04, + kINQUIRY_ANSI_VERSION_SCSI_SPC_3_Compliant = 0x05, + kINQUIRY_ANSI_VERSION_Mask = 0x07 +}; + + +/*! +@enum Response Data Format field definitions +@discussion +Definitions for bits/masks in the INQUIRY RESPONSE_DATA_FORMAT field. +@constant kINQUIRY_Byte3_HISUP_Bit +HISUP bit definition. +@constant kINQUIRY_Byte3_NORMACA_Bit +NORMACA bit definition. +@constant kINQUIRY_Byte3_AERC_Bit +AERC bit definition. +@constant kINQUIRY_RESPONSE_DATA_FORMAT_Mask +Mask for valid bits for RESPONSE_DATA_FORMAT. +@constant kINQUIRY_Byte3_HISUP_Mask +Mask to use to test the HISUP bit. +@constant kINQUIRY_Byte3_NORMACA_Mask +Mask to use to test the NORMACA bit. +@constant kINQUIRY_Byte3_AERC_Mask +Mask to use to test the AERC bit. +*/ +enum +{ + // Bit definitions + // Bits 0-3: RESPONSE DATA FORMAT + kINQUIRY_Byte3_HISUP_Bit = 4, + kINQUIRY_Byte3_NORMACA_Bit = 5, + // Bit 6 is Obsolete + kINQUIRY_Byte3_AERC_Bit = 7, + + // Masks + kINQUIRY_RESPONSE_DATA_FORMAT_Mask = 0x0F, // Bits 0-3 + kINQUIRY_Byte3_HISUP_Mask = (1 << kINQUIRY_Byte3_HISUP_Bit), + kINQUIRY_Byte3_NORMACA_Mask = (1 << kINQUIRY_Byte3_NORMACA_Bit), + // Bit 6 is Obsolete + kINQUIRY_Byte3_AERC_Mask = (1 << kINQUIRY_Byte3_AERC_Bit) +}; + + +/*! +@enum SCCS field definitions +@discussion +Definitions for bits/masks in the INQUIRY SCCSReserved field. +@constant kINQUIRY_Byte5_SCCS_Bit +SCCS bit definition. +@constant kINQUIRY_Byte5_ACC_Bit +ACC bit definition. +@constant kINQUIRY_Byte5_ExplicitTPGS_Bit +Explicit TPGS bit definition. +@constant kINQUIRY_Byte5_ImplicitTPGS_Bit +Implicit TPGS bit definition. +@constant kINQUIRY_Byte5_3PC_Bit +3PC bit definition. +@constant kINQUIRY_Byte5_PROTECT_Bit +PROTECT bit definition. +@constant kINQUIRY_Byte5_SCCS_Mask +Mask to use to test the SCCS bit. +@constant kINQUIRY_Byte5_ACC_Mask +Mask to use to test the ACC bit. +@constant kINQUIRY_Byte5_ExplicitTPGS_Mask +Mask to use for the Explicit TPGS bits. +@constant kINQUIRY_Byte5_ImplicitTPGS_Mask +Mask to use for the Implicit TPGS bits. +@constant kINQUIRY_Byte5_3PC_Mask +Mask to use to test the 3PC bit. +@constant kINQUIRY_Byte5_PROTECT_Mask +Mask to use to test the PROTECT bit. +*/ +enum +{ + // Bit definitions + kINQUIRY_Byte5_SCCS_Bit = 7, + kINQUIRY_Byte5_ACC_Bit = 6, + kINQUIRY_Byte5_ExplicitTPGS_Bit = 5, + kINQUIRY_Byte5_ImplicitTPGS_Bit = 4, + kINQUIRY_Byte5_3PC_Bit = 3, + // Bits 1-2: Reserved + kINQUIRY_Byte5_PROTECT_Bit = 0, + + // Masks + kINQUIRY_Byte5_SCCS_Mask = (1 << kINQUIRY_Byte5_SCCS_Bit), + kINQUIRY_Byte5_ACC_Mask = (1 << kINQUIRY_Byte5_ACC_Bit), + kINQUIRY_Byte5_ExplicitTPGS_Mask = (1 << kINQUIRY_Byte5_ExplicitTPGS_Bit), + kINQUIRY_Byte5_ImplicitTPGS_Mask = (1 << kINQUIRY_Byte5_ImplicitTPGS_Bit), + + kINQUIRY_Byte5_3PC_Mask = (1 << kINQUIRY_Byte5_3PC_Bit), + // Bits 1-2: Reserved + kINQUIRY_Byte5_PROTECT_Mask = (1 << kINQUIRY_Byte5_PROTECT_Bit) +}; + + +/*! +@enum flags1 field definitions +@discussion +Definitions for bits/masks in the INQUIRY flags1 field. +@constant kINQUIRY_Byte6_ADDR16_Bit +ADDR16 bit definition. +@constant kINQUIRY_Byte6_MCHNGR_Bit +MCHNGR bit definition. +@constant kINQUIRY_Byte6_MULTIP_Bit +MULTIP bit definition. +@constant kINQUIRY_Byte6_VS_Bit +VS bit definition. +@constant kINQUIRY_Byte6_ENCSERV_Bit +ENCSERV bit definition. +@constant kINQUIRY_Byte6_BQUE_Bit +BQUE bit definition. +@constant kINQUIRY_Byte6_ADDR16_Mask +Mask to use to test the ADDR16 bit. +@constant kINQUIRY_Byte6_MCHNGR_Mask +Mask to use to test the MCHNGR bit. +@constant kINQUIRY_Byte6_MULTIP_Mask +Mask to use to test the MULTIP bit. +@constant kINQUIRY_Byte6_VS_Mask +Mask to use to test the VS bit. +@constant kINQUIRY_Byte6_ENCSERV_Mask +Mask to use to test the ENCSERV bit. +@constant kINQUIRY_Byte6_BQUE_Mask +Mask to use to test the BQUE bit. +*/ +enum +{ + // Byte offset + kINQUIRY_Byte6_Offset = 6, + + // Bit definitions + kINQUIRY_Byte6_ADDR16_Bit = 0, // SPI Specific + // Bit 1 is Obsolete + // Bit 2 is Obsolete + kINQUIRY_Byte6_MCHNGR_Bit = 3, + kINQUIRY_Byte6_MULTIP_Bit = 4, + kINQUIRY_Byte6_VS_Bit = 5, + kINQUIRY_Byte6_ENCSERV_Bit = 6, + kINQUIRY_Byte6_BQUE_Bit = 7, + + // Masks + kINQUIRY_Byte6_ADDR16_Mask = (1 << kINQUIRY_Byte6_ADDR16_Bit), // SPI Specific + // Bit 1 is Obsolete + // Bit 2 is Obsolete + kINQUIRY_Byte6_MCHNGR_Mask = (1 << kINQUIRY_Byte6_MCHNGR_Bit), + kINQUIRY_Byte6_MULTIP_Mask = (1 << kINQUIRY_Byte6_MULTIP_Bit), + kINQUIRY_Byte6_VS_Mask = (1 << kINQUIRY_Byte6_VS_Bit), + kINQUIRY_Byte6_ENCSERV_Mask = (1 << kINQUIRY_Byte6_ENCSERV_Bit), + kINQUIRY_Byte6_BQUE_Mask = (1 << kINQUIRY_Byte6_BQUE_Bit) +}; + + +/*! +@enum flags2 field definitions +@discussion +Definitions for bits/masks in the INQUIRY flags2 field. +@constant kINQUIRY_Byte7_VS_Bit +VS bit definition. +@constant kINQUIRY_Byte7_CMDQUE_Bit +CMDQUE bit definition. +@constant kINQUIRY_Byte7_TRANDIS_Bit +TRANDIS bit definition. +@constant kINQUIRY_Byte7_LINKED_Bit +LINKED bit definition. +@constant kINQUIRY_Byte7_SYNC_Bit +SYNC bit definition. +@constant kINQUIRY_Byte7_WBUS16_Bit +WBUS16 bit definition. +@constant kINQUIRY_Byte7_RELADR_Bit +RELADR bit definition. +@constant kINQUIRY_Byte7_VS_Mask +Mask to use to test the VS bit. +@constant kINQUIRY_Byte7_CMDQUE_Mask +Mask to use to test the CMDQUE bit. +@constant kINQUIRY_Byte7_TRANDIS_Mask +Mask to use to test the TRANDIS bit. +@constant kINQUIRY_Byte7_LINKED_Mask +Mask to use to test the LINKED bit. +@constant kINQUIRY_Byte7_SYNC_Mask +Mask to use to test the SYNC bit. +@constant kINQUIRY_Byte7_WBUS16_Mask +Mask to use to test the WBUS16 bit. +@constant kINQUIRY_Byte7_RELADR_Mask +Mask to use to test the RELADR bit. +*/ +enum +{ + // Byte offset + kINQUIRY_Byte7_Offset = 7, + + // Bit definitions + kINQUIRY_Byte7_VS_Bit = 0, + kINQUIRY_Byte7_CMDQUE_Bit = 1, + kINQUIRY_Byte7_TRANDIS_Bit = 2, // SPI Specific + kINQUIRY_Byte7_LINKED_Bit = 3, + kINQUIRY_Byte7_SYNC_Bit = 4, // SPI Specific + kINQUIRY_Byte7_WBUS16_Bit = 5, // SPI Specific + // Bit 6 is Obsolete + kINQUIRY_Byte7_RELADR_Bit = 7, + + // Masks + kINQUIRY_Byte7_VS_Mask = (1 << kINQUIRY_Byte7_VS_Bit), + kINQUIRY_Byte7_CMDQUE_Mask = (1 << kINQUIRY_Byte7_CMDQUE_Bit), + kINQUIRY_Byte7_TRANDIS_Mask = (1 << kINQUIRY_Byte7_TRANDIS_Bit),// SPI Specific + kINQUIRY_Byte7_LINKED_Mask = (1 << kINQUIRY_Byte7_LINKED_Bit), + kINQUIRY_Byte7_SYNC_Mask = (1 << kINQUIRY_Byte7_SYNC_Bit), // SPI Specific + kINQUIRY_Byte7_WBUS16_Mask = (1 << kINQUIRY_Byte7_WBUS16_Bit), // SPI Specific + // Bit 6 is Obsolete + kINQUIRY_Byte7_RELADR_Mask = (1 << kINQUIRY_Byte7_RELADR_Bit) +}; + + +/*! +@enum Byte 56 features field definitions +@discussion +Definitions for bits/masks in the INQUIRY Byte 56 field. +Inquiry Byte 56 features (for devices that report an ANSI VERSION of +kINQUIRY_ANSI_VERSION_SCSI_SPC_Compliant or later). +These are SPI-3 Specific. +@constant kINQUIRY_Byte56_IUS_Bit +IUS bit definition. +@constant kINQUIRY_Byte56_QAS_Bit +QAS bit definition. +@constant kINQUIRY_Byte56_IUS_Mask +Mask to use to test the IUS bit. +@constant kINQUIRY_Byte56_QAS_Mask +Mask to use to test the QAS bit. +@constant kINQUIRY_Byte56_CLOCKING_Mask +Mask to use to test CLOCKING bits. +@constant kINQUIRY_Byte56_CLOCKING_ONLY_ST +Single-transition clocking only. +@constant kINQUIRY_Byte56_CLOCKING_ONLY_DT +Double-transition clocking only. +@constant kINQUIRY_Byte56_CLOCKING_ST_AND_DT +Single-transition and double-transition clocking. +*/ +enum +{ + // Byte offset + kINQUIRY_Byte56_Offset = 56, + + // Bit definitions + kINQUIRY_Byte56_IUS_Bit = 0, + kINQUIRY_Byte56_QAS_Bit = 1, + // Bits 2 and 3 are the CLOCKING bits + // All other bits are reserved + + kINQUIRY_Byte56_IUS_Mask = (1 << kINQUIRY_Byte56_IUS_Bit), + kINQUIRY_Byte56_QAS_Mask = (1 << kINQUIRY_Byte56_QAS_Bit), + kINQUIRY_Byte56_CLOCKING_Mask = 0x0C, + + // Definitions for the CLOCKING bits + kINQUIRY_Byte56_CLOCKING_ONLY_ST = 0x00, + kINQUIRY_Byte56_CLOCKING_ONLY_DT = 0x04, + // kINQUIRY_Byte56_CLOCKING_RESERVED = 0x08, + kINQUIRY_Byte56_CLOCKING_ST_AND_DT = 0x0C +}; + + +/*! +@define kINQUIRY_VERSION_DESCRIPTOR_MaxCount +Maximum number of INQUIRY version descriptors supported. +*/ +#define kINQUIRY_VERSION_DESCRIPTOR_MaxCount 8 + + +/*! +@enum kINQUIRY_VERSION_DESCRIPTOR_SAT +SAT specification version descriptor. +*/ +enum +{ + kINQUIRY_VERSION_DESCRIPTOR_SAT = 0x1EA0 +}; + +/*! + @enum kINQUIRY_VERSION_DESCRIPTOR_NVME + NVMe specification version descriptor. + */ +enum +{ + kINQUIRY_VERSION_DESCRIPTOR_NVME = 0x8080 +}; + + +/* +IORegistry property names for information derived from the Inquiry data. +The Peripheral Device Type is the only property that the +generic Logical Unit Drivers will use to match. These properties are +listed in order of matching priority. First is the Peripheral Device Type. +Second is the Vendor Identification. Third is the Product Identification. +Last is the Product Revision Level. To match a particular product, you would +specify the Peripheral Device Type, Vendor Identification, and Product +Identification. To restrict the match to a particular firmware revision, you +would add the Product Revision Level. To not match on a particular product, +but on a particular vendor's products, you would only include the +Peripheral Device Type and the Vendor Identification. +*/ + +/*! +@define kIOPropertySCSIPeripheralDeviceType +SCSI Peripheral Device Type as reported in the INQUIRY data. +*/ +#define kIOPropertySCSIPeripheralDeviceType "Peripheral Device Type" + +/*! +@define kIOPropertySCSIPeripheralDeviceTypeSize +Size of the kIOPropertySCSIPeripheralDeviceType key. +*/ +#define kIOPropertySCSIPeripheralDeviceTypeSize 8 + +/*! +@define kIOPropertyTPGSInfo +TPGS Info as reported in the INQUIRY data. +*/ +#define kIOPropertyTPGSInfo "TPGS Information" + +/*! +@define kIOPropertyHiSup +Hierarchical LUN Support as reported in the INQUIRY data. +*/ +#define kIOPropertyHiSup "Hierarchical LUN Support" + +/*! +@define kIOPropertyTPGSInfoSize +Size of the kIOPropertyTPGSInfo key. +*/ +#define kIOPropertyTPGSInfoSize 8 + +/* These properties are listed in order of matching priority */ + +/*! +@define kIOPropertySCSIVendorIdentification +Vendor ID as reported in the INQUIRY data. Additional space characters (0x20) +are truncated. +*/ +#define kIOPropertySCSIVendorIdentification "Vendor Identification" + +/*! +@define kIOPropertySCSIProductIdentification +Product ID as reported in the INQUIRY data. Additional space characters (0x20) +are truncated. +*/ +#define kIOPropertySCSIProductIdentification "Product Identification" + +/*! +@define kIOPropertySCSIProductRevisionLevel +Product Revision Level as reported in the INQUIRY data. +*/ +#define kIOPropertySCSIProductRevisionLevel "Product Revision Level" + +#ifndef __OPEN_SOURCE__ + +/*! +@enum INQUIRY Page Codes +@discussion INQUIRY Page Codes to be used when EVPD is set in the +INQUIRY command. +@constant kINQUIRY_Page00_PageCode +Page Code 00h. +@constant kINQUIRY_Page80_PageCode +Page Code 80h. +@constant kINQUIRY_Page83_PageCode +Page Code 83h. +@constant kINQUIRY_Page89_PageCode +Page Code 89h. +@constant kINQUIRY_PageB0_PageCode +Page Code B0h. +@constant kINQUIRY_PageB1_PageCode +Page Code B1h. +@constant kINQUIRY_PageB2_PageCode +Page Code B2h. +@constant kINQUIRY_PageC0_PageCode +Page Code C0h. +@constant kINQUIRY_PageC1_PageCode +Page Code C1h. +*/ +enum +{ + kINQUIRY_Page00_PageCode = 0x00, + kINQUIRY_Page80_PageCode = 0x80, + kINQUIRY_Page83_PageCode = 0x83, + kINQUIRY_Page89_PageCode = 0x89, + kINQUIRY_PageB0_PageCode = 0xB0, + kINQUIRY_PageB1_PageCode = 0xB1, + kINQUIRY_PageB2_PageCode = 0xB2, + kINQUIRY_PageC0_PageCode = 0xC0, + kINQUIRY_PageC1_PageCode = 0xC1 +}; + +#else + +/*! + @enum INQUIRY Page Codes + @discussion INQUIRY Page Codes to be used when EVPD is set in the + INQUIRY command. + @constant kINQUIRY_Page00_PageCode + Page Code 00h. + @constant kINQUIRY_Page80_PageCode + Page Code 80h. + @constant kINQUIRY_Page83_PageCode + Page Code 83h. + @constant kINQUIRY_Page89_PageCode + Page Code 89h. + @constant kINQUIRY_PageB0_PageCode + Page Code B0h. + @constant kINQUIRY_PageB1_PageCode + Page Code B1h. + @constant kINQUIRY_PageB2_PageCode + Page Code B2h. + */ +enum +{ + kINQUIRY_Page00_PageCode = 0x00, + kINQUIRY_Page80_PageCode = 0x80, + kINQUIRY_Page83_PageCode = 0x83, + kINQUIRY_Page89_PageCode = 0x89, + kINQUIRY_PageB0_PageCode = 0xB0, + kINQUIRY_PageB1_PageCode = 0xB1, + kINQUIRY_PageB2_PageCode = 0xB2, +}; + +#endif /* __OPEN_SOURCE__ */ + + +/*! +@struct SCSICmd_INQUIRY_Page00_Header +@discussion INQUIRY Page 00h Header. +*/ +typedef struct SCSICmd_INQUIRY_Page00_Header +{ + UInt8 PERIPHERAL_DEVICE_TYPE; // 7-5 = Qualifier. 4-0 = Device type. + UInt8 PAGE_CODE; // Must be equal to 00h + UInt8 RESERVED; // reserved field + UInt8 PAGE_LENGTH; // n-3 bytes +} SCSICmd_INQUIRY_Page00_Header; + + +/*! +@struct SCSICmd_INQUIRY_Page00_Header_SPC_16 +@discussion INQUIRY Page 00h Header. +*/ +typedef struct SCSICmd_INQUIRY_Page00_Header_SPC_16 +{ + UInt8 PERIPHERAL_DEVICE_TYPE; // 7-5 = Qualifier. 4-0 = Device type. + UInt8 PAGE_CODE; // Must be equal to 00h + UInt16 PAGE_LENGTH; // n-3 bytes +} SCSICmd_INQUIRY_Page00_Header_SPC_16; + +/*! +@struct SCSICmd_INQUIRY_Page80_Header +@discussion INQUIRY Page 80h Header. +*/ +typedef struct SCSICmd_INQUIRY_Page80_Header +{ + UInt8 PERIPHERAL_DEVICE_TYPE; // 7-5 = Qualifier. 4-0 = Device type. + UInt8 PAGE_CODE; // Must be equal to 80h + UInt8 RESERVED; // reserved field + UInt8 PAGE_LENGTH; // n-3 bytes + UInt8 PRODUCT_SERIAL_NUMBER; // 4-n +} SCSICmd_INQUIRY_Page80_Header; + + +/*! +@struct SCSICmd_INQUIRY_Page80_Header_SPC_16 +@discussion INQUIRY Page 80h Header with 16 bytes INQUIRY Command. +*/ +typedef struct SCSICmd_INQUIRY_Page80_Header_SPC_16 +{ + UInt8 PERIPHERAL_DEVICE_TYPE; // 7-5 = Qualifier. 4-0 = Device type. + UInt8 PAGE_CODE; // Must be equal to 80h + UInt16 PAGE_LENGTH; // n-3 bytes + UInt8 PRODUCT_SERIAL_NUMBER; // 4-n +} SCSICmd_INQUIRY_Page80_Header_SPC_16; + + +/*! +@define kIOPropertySCSIINQUIRYUnitSerialNumber +Key that describes the INQUIRY Unit Serial Number in the IORegistry. +*/ +#define kIOPropertySCSIINQUIRYUnitSerialNumber "INQUIRY Unit Serial Number" + + +/*! +@struct SCSICmd_INQUIRY_Page83_Header +@discussion INQUIRY Page 83h Header. +*/ +typedef struct SCSICmd_INQUIRY_Page83_Header +{ + UInt8 PERIPHERAL_DEVICE_TYPE; // 7-5 = Qualifier. 4-0 = Device type. + UInt8 PAGE_CODE; // Must be equal to 83h + UInt8 RESERVED; // reserved field + UInt8 PAGE_LENGTH; // n-3 bytes +} SCSICmd_INQUIRY_Page83_Header; + + +/*! +@struct SCSICmd_INQUIRY_Page83_Header_SPC_16 +@discussion INQUIRY Page 83h Header used with the 16 byte INQUIRY command. +*/ +typedef struct SCSICmd_INQUIRY_Page83_Header_SPC_16 +{ + UInt8 PERIPHERAL_DEVICE_TYPE; // 7-5 = Qualifier. 4-0 = Device type. + UInt8 PAGE_CODE; // Must be equal to 83h + UInt16 PAGE_LENGTH; // n-3 bytes +} SCSICmd_INQUIRY_Page83_Header_SPC_16; + + +/*! +@struct SCSICmd_INQUIRY_Page83_Identification_Descriptor +@discussion INQUIRY Page 83h Identification Descriptor. +*/ +typedef struct SCSICmd_INQUIRY_Page83_Identification_Descriptor +{ + UInt8 CODE_SET; // 7-4 = Protocol Identifier. 3-0 = Code Set + UInt8 IDENTIFIER_TYPE; // 7 = PIV 5-4 = ASSOCIATION 3-0 = Identifier + UInt8 RESERVED; + UInt8 IDENTIFIER_LENGTH; + UInt8 IDENTIFIER; +} SCSICmd_INQUIRY_Page83_Identification_Descriptor; + + +/*! +@enum INQUIRY Page 83h Code Set +@discussion +Definitions for the Code Set field. +@constant kINQUIRY_Page83_CodeSetBinaryData +The identifier contains binary data. +@constant kINQUIRY_Page83_CodeSetASCIIData +The identifier contains ASCII data. +@constant kINQUIRY_Page83_CodeSetUTF8Data +The identifier contains UTF-8 data. +*/ +enum +{ + kINQUIRY_Page83_CodeSetReserved = 0x0, + kINQUIRY_Page83_CodeSetBinaryData = 0x1, + kINQUIRY_Page83_CodeSetASCIIData = 0x2, + kINQUIRY_Page83_CodeSetUTF8Data = 0x3, + // 0x4 - 0xF reserved + kINQUIRY_Page83_CodeSetMask = 0xF +}; + + +/*! +@enum INQUIRY Page 83h Association +@discussion +Definitions for the Association field. +@constant kINQUIRY_Page83_AssociationLogicalUnit +Association of the identifier is with the logical unit. +@constant kINQUIRY_Page83_AssociationDevice +Association of the identifier is with the device (same as logical unit in SPC-2). +@constant kINQUIRY_Page83_AssociationTargetPort +Association of the identifier is with the target port. +@constant kINQUIRY_Page83_AssociationTargetDevice +Association of the identifier is with the target device (i.e. all ports). +@constant kINQUIRY_Page83_AssociationMask +Mask to use to determine association. +*/ +enum +{ + // SPC-3 - Association is changed to be specific to + // Logical Units + kINQUIRY_Page83_AssociationLogicalUnit = 0x00, + + // Backwards compatibility for SPC-2 + kINQUIRY_Page83_AssociationDevice = kINQUIRY_Page83_AssociationLogicalUnit, + + // Association is related to a Target Port + kINQUIRY_Page83_AssociationTargetPort = 0x10, + + // SPC-3 - Added as specific association to + // a Target device. + kINQUIRY_Page83_AssociationTargetDevice = 0x20, + + kINQUIRY_Page83_AssociationMask = 0x30, + kINQUIRY_Page83_AssociationShift = 4 +}; + + +/*! +@enum INQUIRY Page 83h Identifier Type +@discussion +Definitions for the Identifier Type field. +@constant kINQUIRY_Page83_IdentifierTypeVendorSpecific +Vendor Specific Identifier Type. +@constant kINQUIRY_Page83_IdentifierTypeVendorID +Vendor Specific Identifier Type. +@constant kINQUIRY_Page83_IdentifierTypeIEEE_EUI64 +EUI-64 Identifier Type. +@constant kINQUIRY_Page83_IdentifierTypeNAAIdentifier +NAA Identifier Type. +@constant kINQUIRY_Page83_IdentifierTypeRelativePortIdentifier +Relative Target Port Identifier Type. +@constant kINQUIRY_Page83_IdentifierTypeTargetPortGroup +Target Port Group Identifier Type. +@constant kINQUIRY_Page83_IdentifierTypeLogicalUnitGroup +Logical Unit Group Identifier Type. +@constant kINQUIRY_Page83_IdentifierTypeMD5LogicalUnitIdentifier +MD5 Logical Unit Identifier Type. +@constant kINQUIRY_Page83_IdentifierTypeSCSINameString +SCSI Name String Identifier Type. +@constant kINQUIRY_Page83_IdentifierTypeMask +Mask to use to determine association. +@constant kINQUIRY_Page83_ProtocolIdentifierValidBit +PIV Bit definition. +@constant kINQUIRY_Page83_ProtocolIdentifierValidMask +Mask to use to determine if PIV is set. +*/ +enum +{ + kINQUIRY_Page83_IdentifierTypeVendorSpecific = 0, + kINQUIRY_Page83_IdentifierTypeVendorID = 1, + kINQUIRY_Page83_IdentifierTypeIEEE_EUI64 = 2, + kINQUIRY_Page83_IdentifierTypeNAAIdentifier = 3, + kINQUIRY_Page83_IdentifierTypeRelativePortIdentifier = 4, + kINQUIRY_Page83_IdentifierTypeTargetPortGroup = 5, + kINQUIRY_Page83_IdentifierTypeLogicalUnitGroup = 6, + kINQUIRY_Page83_IdentifierTypeMD5LogicalUnitIdentifier = 7, + kINQUIRY_Page83_IdentifierTypeSCSINameString = 8, + // 0x9 - 0xF Reserved + + kINQUIRY_Page83_IdentifierTypeMask = 0xF, + + kINQUIRY_Page83_ProtocolIdentifierValidBit = 7, + kINQUIRY_Page83_ProtocolIdentifierValidMask = (1 << kINQUIRY_Page83_ProtocolIdentifierValidBit) + +}; + +// Backwards compatibility +#define kINQUIRY_Page83_IdentifierTypeFCNameIdentifier kINQUIRY_Page83_IdentifierTypeNAAIdentifier +#define kINQUIRY_Page83_IdentifierTypeUndefined kINQUIRY_Page83_IdentifierTypeVendorSpecific + + +/*! +@enum Protocol Identifier values +@discussion +Definitions for the protocol identifier values. +@constant kSCSIProtocolIdentifier_FibreChannel +FibreChannel Protocol Identifier. +@constant kSCSIProtocolIdentifier_ParallelSCSI +Parallel SCSI Protocol Identifier. +@constant kSCSIProtocolIdentifier_SSA +SSA Protocol Identifier. +@constant kSCSIProtocolIdentifier_FireWire +FireWire (IEEE-1394) Protocol Identifier. +@constant kSCSIProtocolIdentifier_RDMA +RDMA Protocol Identifier. +@constant kSCSIProtocolIdentifier_iSCSI +iSCSI Protocol Identifier. +@constant kSCSIProtocolIdentifier_SAS +SAS Protocol Identifier. +@constant kSCSIProtocolIdentifier_ADT +ADT Protocol Identifier. +@constant kSCSIProtocolIdentifier_ATAPI +ATAPI Protocol Identifier. +@constant kSCSIProtocolIdentifier_None +No Protocol Identifier. +*/ +enum +{ + kSCSIProtocolIdentifier_FibreChannel = 0, + kSCSIProtocolIdentifier_ParallelSCSI = 1, + kSCSIProtocolIdentifier_SSA = 2, + kSCSIProtocolIdentifier_FireWire = 3, + kSCSIProtocolIdentifier_RDMA = 4, + kSCSIProtocolIdentifier_iSCSI = 5, + kSCSIProtocolIdentifier_SAS = 6, + kSCSIProtocolIdentifier_ADT = 7, + kSCSIProtocolIdentifier_ATAPI = 8, + // 0x9-0xE Reserved + kSCSIProtocolIdentifier_None = 0xF +}; + + +/*! +@define kIOPropertySCSIINQUIRYDeviceIdentification +Device Identification key. +*/ +#define kIOPropertySCSIINQUIRYDeviceIdentification "INQUIRY Device Identification" + + +/*! +@define kIOPropertySCSIINQUIRYDeviceIdCodeSet +Code Set type key. +*/ +#define kIOPropertySCSIINQUIRYDeviceIdCodeSet "Code Set" + + +/*! +@define kIOPropertySCSIINQUIRYDeviceIdType +Identifier Type key. +*/ +#define kIOPropertySCSIINQUIRYDeviceIdType "Identifier Type" + + +/*! +@define kIOPropertySCSIINQUIRYDeviceIdAssociation +Association key. +*/ +#define kIOPropertySCSIINQUIRYDeviceIdAssociation "Association" + + +/*! +@define kIOPropertySCSIINQUIRYDeviceIdentifier +Identifier key (data or string). +*/ +#define kIOPropertySCSIINQUIRYDeviceIdentifier "Identifier" + + + + +/*! +@struct SCSICmd_INQUIRY_Page83_RelativeTargetPort_Identifier +@discussion INQUIRY Page 83h Relative Target Port Identifier. +*/ +typedef struct SCSICmd_INQUIRY_Page83_RelativeTargetPort_Identifier +{ + UInt16 OBSOLETE; + UInt16 RELATIVE_TARGET_PORT_IDENTIFIER; +} SCSICmd_INQUIRY_Page83_RelativeTargetPort_Identifier; + + +/*! +@struct SCSICmd_INQUIRY_Page83_TargetPortGroup_Identifier +@discussion INQUIRY Page 83h Target Port Group Identifier. +*/ +typedef struct SCSICmd_INQUIRY_Page83_TargetPortGroup_Identifier +{ + UInt16 RESERVED; + UInt16 TARGET_PORT_GROUP; +} SCSICmd_INQUIRY_Page83_TargetPortGroup_Identifier; + + +/*! +@struct SCSICmd_INQUIRY_Page83_LogicalUnitGroup_Identifier +@discussion INQUIRY Page 83h Logical Unit Group Identifier. +*/ +typedef struct SCSICmd_INQUIRY_Page83_LogicalUnitGroup_Identifier +{ + UInt16 RESERVED; + UInt16 LOGICAL_UNIT_GROUP; +} SCSICmd_INQUIRY_Page83_LogicalUnitGroup_Identifier; + + +/*! +@struct SCSICmd_INQUIRY_Page89_Data +@discussion INQUIRY Page 89h data as defined in the SAT 1.0 +specification. This section contains all structures and +definitions used by the INQUIRY command in response to a request +for page 89h - ATA information VPD Page. +*/ +typedef struct SCSICmd_INQUIRY_Page89_Data +{ + UInt8 PERIPHERAL_DEVICE_TYPE; // 7-5 = Qualifier. 4-0 = Device type. + UInt8 PAGE_CODE; // Must be equal to 89h + UInt16 PAGE_LENGTH; // Must be equal to 238h + UInt32 Reserved; + UInt8 SAT_VENDOR_IDENTIFICATION[kINQUIRY_VENDOR_IDENTIFICATION_Length]; + UInt8 SAT_PRODUCT_IDENTIFICATION[kINQUIRY_PRODUCT_IDENTIFICATION_Length]; + UInt8 SAT_PRODUCT_REVISION_LEVEL[kINQUIRY_PRODUCT_REVISION_LEVEL_Length]; + UInt8 ATA_DEVICE_SIGNATURE[20]; + UInt8 COMMAND_CODE; + UInt8 Reserved2[3]; + UInt8 IDENTIFY_DATA[512]; +} SCSICmd_INQUIRY_Page89_Data; + +#pragma pack(push, 1) + +/*! + @struct SCSICmd_INQUIRY_PageB0_Data + @discussion INQUIRY Page B0h data as defined in the SBC + specification. This section contains all structures and + definitions used by the INQUIRY command in response to a request + for page B0h - Block Limits VPD Page. + */ +typedef struct SCSICmd_INQUIRY_PageB0_Data +{ + UInt8 PERIPHERAL_DEVICE_TYPE; // 7-5 = Qualifier. 4-0 = Device type. + UInt8 PAGE_CODE; // Must be equal to B0h + UInt16 PAGE_LENGTH; // Must be equal to 3Ch + UInt8 WSNZ; // 0 = WSNZ, 7-1 = Reserved. + UInt8 MAXIMUM_COMPARE_AND_WRITE_LENGTH; + UInt16 OPTIMAL_TRANSFER_LENGTH_GRANULARITY; + UInt32 MAXIMUM_TRANSFER_LENGTH; + UInt32 OPTIMAL_TRANSFER_LENGTH; + UInt32 MAXIMUM_PREFETCH_LENGTH; + UInt32 MAXIMUM_UNMAP_LBA_COUNT; + UInt32 MAXIMUM_UNMAP_BLOCK_DESCRIPTOR_COUNT; + UInt32 OPTIMAL_UNMAP_GRANULARITY; + UInt32 UNMAP_GRANULARITY_ALIGNMENT; + UInt64 MAXIMUM_WRITE_SAME_LENGTH; + UInt32 MAXIMUM_ATOMIC_TRANSFER_LENGTH; + UInt32 ATOMIC_ALIGNMENT; + UInt32 ATOMIC_TRANSFER_LENGTH_GRANULARITY; + UInt32 MAXIMUM_ATOMIC_TRANSFER_LENGTH_WITH_ATOMIC_BOUNDARY; + UInt32 MAXIMUM_ATOMIC_BOUNDARY_SIZE; +} SCSICmd_INQUIRY_PageB0_Data; + +#pragma pack(pop) + +/*! +@struct SCSICmd_INQUIRY_PageB1_Data +@discussion INQUIRY Page B1h data as defined in the SBC +specification. This section contains all structures and +definitions used by the INQUIRY command in response to a request +for page B1h - Block Device Characteristics VPD Page. +*/ +typedef struct SCSICmd_INQUIRY_PageB1_Data +{ + UInt8 PERIPHERAL_DEVICE_TYPE; // 7-5 = Qualifier. 4-0 = Device type. + UInt8 PAGE_CODE; // Must be equal to B1h + UInt8 Reserved; + UInt8 PAGE_LENGTH; // Must be equal to 3Ch + UInt16 MEDIUM_ROTATION_RATE; + UInt8 Reserved2[58]; +} SCSICmd_INQUIRY_PageB1_Data; + +enum +{ + kINQUIRY_PageB1_Page_Length = 0x3C +}; + +#pragma pack(push, 1) + +/*! + @struct SCSICmd_INQUIRY_PageB2_Data + @discussion INQUIRY Page B2h data as defined in the SBC + specification. This section contains all structures and + definitions used by the INQUIRY command in response to a request + for page B2h - Logical Block Provisioning VPD Page. + */ +typedef struct SCSICmd_INQUIRY_PageB2_Data +{ + UInt8 PERIPHERAL_DEVICE_TYPE; // 7-5 = Qualifier. 4-0 = Device type. + UInt8 PAGE_CODE; // Must be equal to B2h. + UInt16 PAGE_LENGTH; // Must be n-3. + UInt8 THRESHOLD_EXPONENT; + UInt8 LBP_FLAGS; // 7 = LBPU, 6 = LBPWS, 5 = LBPWS10, + // 4-2 = LBPRZ, 1 = ANC_SUP, 0 = DP. + UInt8 MINIMUM_PERCENTAGE; // 7-3 = MINIMUM PERCENTAGE, + // 2-0 = PROVISIONING TYPE. + UInt8 THRESHOLD_PERCENTAGE; +} SCSICmd_INQUIRY_PageB2_Data; + +typedef struct SCSICmd_INQUIRY_PageB2_Provisioning_Group_Descriptor +{ + UInt8 DESIGNATION_DESCRIPTOR[20]; + UInt8 RESERVED[18]; +} SCSICmd_INQUIRY_PageB2_Provisioning_Group_Descriptor; + +#pragma pack(pop) + +#ifndef __OPEN_SOURCE__ + +#pragma pack(push, 1) + +enum +{ + kC0DataMaxStringLen = 32 +}; + +enum +{ + kINQUIRY_PageC0_Features_HasSEP_LUN = ( 1 << 3 ) +}; + +typedef struct SCSICmd_INQUIRY_PageCx_Header +{ + + UInt8 PERIPHERAL_DEVICE_TYPE; // 7-5 = Qualifier. 4-0 = Device type. + UInt8 PAGE_CODE; // Must be equal to C0h or C1h + UInt8 RESERVED; + UInt8 PAGE_LENGTH; + +} SCSICmd_INQUIRY_PAGECx_Header; + +/*! + @struct SCSICmd_INQUIRY_PageC0_Data + @discussion INQUIRY Page C0h data as defined in Apple Target + Disk Mode specification. This is a vendor specific data structure. + This section contains all structures and definitions used by + the INQUIRY command in response to a request for page C0h. + */ + +typedef struct SCSICmd_INQUIRY_PageC0_Data +{ + + SCSICmd_INQUIRY_PAGECx_Header fHeader; + UInt8 fTdmPageVersion; + UInt8 fTdmProtocolVersion; + UInt8 fReserved1; + UInt8 fReserved2; + UInt8 fMacModelId[kC0DataMaxStringLen]; + UInt8 fSerialNumber[kC0DataMaxStringLen]; + UInt32 fMaxReadSize; + UInt32 fMaxWriteSize; + UInt32 fNativeBlockSize; + UInt32 fPreferredIOSize; + UInt64 fFeatures; + UInt64 fWorkArounds; + UInt16 fEncryptionType; + UInt8 fReserved3[2]; + UInt64 fInstalledRAMSize; + +} SCSICmd_INQUIRY_PageC0_Data; + +/*! + @struct SCSICmd_INQUIRY_PageC1_Data + @discussion INQUIRY Page C1h data as defined in Apple Target + Disk Mode specification. This is a vendor specific data structure. + This section contains all structures and definitions used by + the INQUIRY command in response to a request for page C1h. + */ + +typedef struct SCSICmd_INQUIRY_PageC1_Data +{ + + SCSICmd_INQUIRY_PAGECx_Header fHeader; + UInt8 fTdmPowerRequirementsPageVersion; + UInt8 fReserved1; + UInt16 fReserved2; + UInt32 fPowerRequired; + +} SCSICmd_INQUIRY_PageC1_Data; + +#pragma pack(pop) + +#endif /* __OPEN_SOURCE__ */ + +/*! +@define kIOPropertySATVendorIdentification +Vendor Identification of the SATL. +*/ +#define kIOPropertySATVendorIdentification "SAT Vendor Identification" + + +/*! +@define kIOPropertySATProductIdentification +Product Identification of the SATL. +*/ +#define kIOPropertySATProductIdentification "SAT Product Identification" + + +/*! +@define kIOPropertySATProductRevisonLevel +Product Revision Level of the SATL. +*/ +#define kIOPropertySATProductRevisonLevel "SAT Product Revision Level" + + +#endif /* _IOKIT_SCSI_CMDS_INQUIRY_H_ */ diff --git a/QualcommWireless/include/IOKit/scsi/SCSICmds_MODE_Definitions.h b/QualcommWireless/include/IOKit/scsi/SCSICmds_MODE_Definitions.h new file mode 100644 index 0000000..8d9c250 --- /dev/null +++ b/QualcommWireless/include/IOKit/scsi/SCSICmds_MODE_Definitions.h @@ -0,0 +1,559 @@ +/* + * Copyright (c) 1998-2009 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_SCSI_CMDS_MODE_DEFINITIONS_H_ +#define _IOKIT_SCSI_CMDS_MODE_DEFINITIONS_H_ + + +//----------------------------------------------------------------------------- +// Includes +//----------------------------------------------------------------------------- + +#if KERNEL +#include +#else +#include +#endif + + +/*! @header SCSI Request Sense Definitions + @discussion + This file contains all definitions for the data returned from + the MODE_SENSE_6 and MODE_SENSE_10 commands. +*/ + +#pragma pack(1) + +/*! +@struct SPCModeParameterHeader6 +@discussion +Mode Parameter Header for the MODE_SENSE_6 command. +*/ +typedef struct SPCModeParameterHeader6 +{ + UInt8 MODE_DATA_LENGTH; + UInt8 MEDIUM_TYPE; + UInt8 DEVICE_SPECIFIC_PARAMETER; + UInt8 BLOCK_DESCRIPTOR_LENGTH; +} SPCModeParameterHeader6; + + +/*! +@struct SPCModeParameterHeader10 +@discussion +Mode Parameter Header for the MODE_SENSE_10 command. +*/ +typedef struct SPCModeParameterHeader10 +{ + UInt16 MODE_DATA_LENGTH; + UInt8 MEDIUM_TYPE; + UInt8 DEVICE_SPECIFIC_PARAMETER; + UInt8 LONGLBA; + UInt8 RESERVED; + UInt16 BLOCK_DESCRIPTOR_LENGTH; +} SPCModeParameterHeader10; + + +/*! +@enum Long LBA Bitfield definitions +@discussion +Long LBA Bitfield definitions for Mode Parameter Header +for MODE_SENSE_10 command. +@constant kModeSenseParameterHeader10_LongLBABit +Bit to indicate Long LBA block descriptors follow. +@constant kModeSenseParameterHeader10_LongLBAMask +Mask to test for kModeSenseParameterHeader10_LongLBABit. +*/ +enum +{ + kModeSenseParameterHeader10_LongLBABit = 0, + kModeSenseParameterHeader10_LongLBAMask = (1 << kModeSenseParameterHeader10_LongLBABit), +}; + + +/*! +@enum Device Specific Parameter Bitfield definitions +@discussion +SBC definitions for Device Specific Parameter in the +Mode Sense Header Block. +@constant kModeSenseSBCDeviceSpecific_DPOFUABit +Bit to indicate DPO and FUA bits are accepted by the device server. +@constant kModeSenseSBCDeviceSpecific_WriteProtectBit +Bit to indicate medium is write protected. +@constant kModeSenseSBCDeviceSpecific_DPOFUAMask +Mask to test for kModeSenseSBCDeviceSpecific_DPOFUABit. +@constant kModeSenseSBCDeviceSpecific_WriteProtectMask +Mask to test for kModeSenseSBCDeviceSpecific_WriteProtectBit. +*/ +enum +{ + kModeSenseSBCDeviceSpecific_DPOFUABit = 4, + kModeSenseSBCDeviceSpecific_WriteProtectBit = 7, + kModeSenseSBCDeviceSpecific_DPOFUAMask = (1 << kModeSenseSBCDeviceSpecific_DPOFUABit), + kModeSenseSBCDeviceSpecific_WriteProtectMask = (1 << kModeSenseSBCDeviceSpecific_WriteProtectBit) +}; + + +/*! +@struct ModeParameterBlockDescriptor +@discussion +General mode parameter block descriptor. +*/ +typedef struct ModeParameterBlockDescriptor +{ + UInt8 DENSITY_CODE; + UInt8 NUMBER_OF_BLOCKS[3]; + UInt8 RESERVED; + UInt8 BLOCK_LENGTH[3]; +} ModeParameterBlockDescriptor; + + +/*! +@struct DASDModeParameterBlockDescriptor +@discussion +Direct Access Storage Device mode parameter block descriptor. +*/ +typedef struct DASDModeParameterBlockDescriptor +{ + UInt32 NUMBER_OF_BLOCKS; + UInt8 DENSITY_CODE; + UInt8 BLOCK_LENGTH[3]; +} DASDModeParameterBlockDescriptor; + + +/*! +@struct LongLBAModeParameterBlockDescriptor +@discussion +Long LBA mode parameter block descriptor. +*/ +typedef struct LongLBAModeParameterBlockDescriptor +{ + UInt64 NUMBER_OF_BLOCKS; + UInt8 DENSITY_CODE; + UInt8 RESERVED[3]; + UInt32 BLOCK_LENGTH; +} LongLBAModeParameterBlockDescriptor; + + +/*! +@struct ModePageFormatHeader +@discussion +Mode Page format header. +*/ +typedef struct ModePageFormatHeader +{ + UInt8 PS_PAGE_CODE; + UInt8 PAGE_LENGTH; +} ModePageFormatHeader; + + +/*! +@enum Mode Page Format bit definitions +@discussion +Mode Page Format bit definitions. +@constant kModePageFormat_PS_Bit +Bit to indicate Parameters Saveable. +@constant kModePageFormat_PAGE_CODE_Mask +Mask to obtain the PAGE_CODE from the PS_PAGE_CODE field. +@constant kModePageFormat_PS_Mask +Mask to test for kModePageFormat_PS_Bit. +*/ +enum +{ + kModePageFormat_PS_Bit = 7, + + kModePageFormat_PAGE_CODE_Mask = 0x3F, + kModePageFormat_PS_Mask = (1 << kModePageFormat_PS_Bit) +}; + + +#if 0 +#pragma mark - +#pragma mark SPC Mode Pages +#pragma mark - +#endif + + +/*! +@enum SPC Mode Pages +@discussion +SPC Mode Page definitions. +@constant kSPCModePagePowerConditionCode +Power Conditions Mode Page value. +@constant kSPCModePageAllPagesCode +All Mode Pages value. +*/ +enum +{ + kSPCModePagePowerConditionCode = 0x1A, + kSPCModePageAllPagesCode = 0x3F +}; + +/*! +@struct SPCModePagePowerCondition +@discussion +Power Conditions Mode Page (PAGE CODE 0x1A) format. +*/ +typedef struct SPCModePagePowerCondition +{ + ModePageFormatHeader header; + UInt8 RESERVED; + UInt8 IDLE_STANDBY; + UInt32 IDLE_CONDITION_TIMER; + UInt32 STANDBY_CONDITION_TIMER; +} SPCModePagePowerCondition; + + +#if 0 +#pragma mark - +#pragma mark 0x00 SBC Direct Access Mode Pages +#pragma mark - +#endif + + +/*! +@enum SBC Mode Pages +@discussion +SBC Mode Page definitions. +@constant kSBCModePageFormatDeviceCode +Format Device Mode Page value. +@constant kSBCModePageRigidDiskGeometryCode +Rigid Disk Geometry Page value. +@constant kSBCModePageFlexibleDiskCode +Flexible Disk Page value. +@constant kSBCModePageCachingCode +Caching Page value. +*/ +enum +{ + kSBCModePageFormatDeviceCode = 0x03, + kSBCModePageRigidDiskGeometryCode = 0x04, + kSBCModePageFlexibleDiskCode = 0x05, + kSBCModePageCachingCode = 0x08 +}; + + +/*! +@struct SBCModePageFormatDevice +@discussion +Format Device Mode Page (PAGE CODE 0x03) format. +*/ +typedef struct SBCModePageFormatDevice +{ + ModePageFormatHeader header; + UInt16 TRACKS_PER_ZONE; + UInt16 ALTERNATE_SECTORS_PER_ZONE; + UInt16 ALTERNATE_TRACKS_PER_ZONE; + UInt16 ALTERNATE_TRACKS_PER_LOGICAL_UNIT; + UInt16 SECTORS_PER_TRACK; + UInt16 DATA_BYTES_PER_PHYSICAL_SECTOR; + UInt16 INTERLEAVE; + UInt16 TRACK_SKEW_FACTOR; + UInt16 CYLINDER_SKEW_FACTOR; + UInt8 SSEC_HSEC_RMB_SURF; + UInt8 RESERVED[3]; +} SBCModePageFormatDevice; + + +/*! +@struct SBCModePageRigidDiskGeometry +@discussion +Rigid Disk Geometry Mode Page (PAGE CODE 0x04) format. +*/ +typedef struct SBCModePageRigidDiskGeometry +{ + ModePageFormatHeader header; + UInt8 NUMBER_OF_CYLINDERS[3]; + UInt8 NUMBER_OF_HEADS; + UInt8 STARTING_CYLINDER_WRITE_PRECOMPENSATION[3]; + UInt8 STARTING_CYLINDER_REDUCED_WRITE_CURRENT[3]; + UInt16 DEVICE_STEP_RATE; + UInt8 LANDING_ZONE_CYLINDER[3]; + UInt8 RPL; + UInt8 ROTATIONAL_OFFSET; + UInt8 RESERVED; + UInt16 MEDIUM_ROTATION_RATE; + UInt8 RESERVED1[2]; +} SBCModePageRigidDiskGeometry; + + +/*! +@enum Rigid Disk Geometry bitfields +@discussion +Bit field masks for Rigid Disk Geometry structure fields. +@constant kSBCModePageRigidDiskGeometry_RPL_Mask +Mask for use with the RPL field. +*/ +enum +{ + kSBCModePageRigidDiskGeometry_RPL_Mask = 0x03 +}; + + +/*! +@struct SBCModePageFlexibleDisk +@discussion +Flexible Disk Mode Page (PAGE CODE 0x05) format. +*/ +typedef struct SBCModePageFlexibleDisk +{ + ModePageFormatHeader header; + UInt16 TRANSFER_RATE; + UInt8 NUMBER_OF_HEADS; + UInt8 SECTORS_PER_TRACK; + UInt16 DATA_BYTES_PER_SECTOR; + UInt16 NUMBER_OF_CYLINDERS; + UInt16 STARTING_CYLINDER_WRITE_PRECOMPENSATION; + UInt16 STARTING_CYLINDER_REDUCED_WRITE_CURRENT; + UInt16 DEVICE_STEP_RATE; + UInt8 DEVICE_STEP_PULSE_WIDTH; + UInt16 HEAD_SETTLE_DELAY; + UInt8 MOTOR_ON_DELAY; + UInt8 MOTOR_OFF_DELAY; + UInt8 TRDY_SSN_MO; + UInt8 SPC; + UInt8 WRITE_COMPENSATION; + UInt8 HEAD_LOAD_DELAY; + UInt8 HEAD_UNLOAD_DELAY; + UInt8 PIN_34_PIN_2; + UInt8 PIN_4_PIN_1; + UInt16 MEDIUM_ROTATION_RATE; + UInt8 RESERVED[2]; +} SBCModePageFlexibleDisk; + + +/*! +@enum TRDY_SSN_MO bitfields +@discussion +Bit field definitions and masks for Flexible Disk TRDY_SSN_MO field. +@constant kSBCModePageFlexibleDisk_MO_Bit +MO Bit definition. +@constant kSBCModePageFlexibleDisk_SSN_Bit +SSN Bit definition. +@constant kSBCModePageFlexibleDisk_TRDY_Bit +TRDY Bit definition. +@constant kSBCModePageFlexibleDisk_MO_Mask +Mask for use with TRDY_SSN_MO field. +@constant kSBCModePageFlexibleDisk_SSN_Mask +Mask for use with TRDY_SSN_MO field. +@constant kSBCModePageFlexibleDisk_TRDY_Mask +Mask for use with TRDY_SSN_MO field. +*/ +enum +{ + // Bits 0:4 Reserved + kSBCModePageFlexibleDisk_MO_Bit = 5, + kSBCModePageFlexibleDisk_SSN_Bit = 6, + kSBCModePageFlexibleDisk_TRDY_Bit = 7, + + kSBCModePageFlexibleDisk_MO_Mask = (1 << kSBCModePageFlexibleDisk_MO_Bit), + kSBCModePageFlexibleDisk_SSN_Mask = (1 << kSBCModePageFlexibleDisk_SSN_Bit), + kSBCModePageFlexibleDisk_TRDY_Mask = (1 << kSBCModePageFlexibleDisk_TRDY_Bit) +}; + + +/*! +@enum SPC bitfields +@discussion +Bit field definitions and masks for Flexible Disk SPC field. +@constant kSBCModePageFlexibleDisk_SPC_Mask +Mask for use with SPC field. +*/ +enum +{ + kSBCModePageFlexibleDisk_SPC_Mask = 0x0F +}; + + +/*! +@enum PIN_34_PIN_2 bitfields +@discussion +Bit field definitions and masks for Flexible Disk PIN_34_PIN_2 field. +@constant kSBCModePageFlexibleDisk_PIN_2_Mask +Mask for use with PIN_34_PIN_2 field. +@constant kSBCModePageFlexibleDisk_PIN_34_Mask +Mask for use with PIN_34_PIN_2 field. +*/ +enum +{ + kSBCModePageFlexibleDisk_PIN_2_Mask = 0x0F, + kSBCModePageFlexibleDisk_PIN_34_Mask = 0xF0 +}; + + +/*! +@enum PIN_4_PIN_1 bitfields +@discussion +Bit field definitions and masks for Flexible Disk PIN_4_PIN_1 field. +@constant kSBCModePageFlexibleDisk_PIN_1_Mask +Mask for use with PIN_4_PIN_1 field. +@constant kSBCModePageFlexibleDisk_PIN_4_Mask +Mask for use with PIN_4_PIN_1 field. +*/ +enum +{ + kSBCModePageFlexibleDisk_PIN_1_Mask = 0x0F, + kSBCModePageFlexibleDisk_PIN_4_Mask = 0xF0 +}; + + +/*! +@struct SBCModePageCaching +@discussion +Caching Mode Page (PAGE CODE 0x08) format. +*/ +typedef struct SBCModePageCaching +{ + ModePageFormatHeader header; + UInt8 flags; + UInt8 DEMAND_READ_WRITE_RETENTION_PRIORITY; + UInt16 DISABLE_PREFETCH_TRANSFER_LENGTH; + UInt16 MINIMUM_PREFETCH; + UInt16 MAXIMUM_PREFETCH; + UInt16 MAXIMUM_PREFETCH_CEILING; + UInt8 flags2; + UInt8 NUMBER_OF_CACHE_SEGMENTS; + UInt16 CACHE_SEGMENT_SIZE; + UInt8 RESERVED; + UInt8 NON_CACHE_SEGMENT_SIZE[3]; +} SBCModePageCaching; + + +/*! +@enum Caching flags bitfields +@discussion +Bit field definitions and masks for Caching flags field. +@constant kSBCModePageCaching_RCD_Bit +RCD Bit definition. +@constant kSBCModePageCaching_MF_Bit +MF Bit definition. +@constant kSBCModePageCaching_WCE_Bit +WCE Bit definition. +@constant kSBCModePageCaching_SIZE_Bit +SIZE Bit definition. +@constant kSBCModePageCaching_DISC_Bit +DISC Bit definition. +@constant kSBCModePageCaching_CAP_Bit +CAP Bit definition. +@constant kSBCModePageCaching_ABPF_Bit +ABPF Bit definition. +@constant kSBCModePageCaching_IC_Bit +IC Bit definition. +@constant kSBCModePageCaching_RCD_Mask +Mask for use with flags field. +@constant kSBCModePageCaching_MF_Mask +Mask for use with flags field. +@constant kSBCModePageCaching_WCE_Mask +Mask for use with flags field. +@constant kSBCModePageCaching_SIZE_Mask +Mask for use with flags field. +@constant kSBCModePageCaching_DISC_Mask +Mask for use with flags field. +@constant kSBCModePageCaching_CAP_Mask +Mask for use with flags field. +@constant kSBCModePageCaching_ABPF_Mask +Mask for use with flags field. +@constant kSBCModePageCaching_IC_Mask +Mask for use with flags field. +*/ +enum +{ + kSBCModePageCaching_RCD_Bit = 0, + kSBCModePageCaching_MF_Bit = 1, + kSBCModePageCaching_WCE_Bit = 2, + kSBCModePageCaching_SIZE_Bit = 3, + kSBCModePageCaching_DISC_Bit = 4, + kSBCModePageCaching_CAP_Bit = 5, + kSBCModePageCaching_ABPF_Bit = 6, + kSBCModePageCaching_IC_Bit = 7, + + kSBCModePageCaching_RCD_Mask = (1 << kSBCModePageCaching_RCD_Bit), + kSBCModePageCaching_MF_Mask = (1 << kSBCModePageCaching_MF_Bit), + kSBCModePageCaching_WCE_Mask = (1 << kSBCModePageCaching_WCE_Bit), + kSBCModePageCaching_SIZE_Mask = (1 << kSBCModePageCaching_SIZE_Bit), + kSBCModePageCaching_DISC_Mask = (1 << kSBCModePageCaching_DISC_Bit), + kSBCModePageCaching_CAP_Mask = (1 << kSBCModePageCaching_CAP_Bit), + kSBCModePageCaching_ABPF_Mask = (1 << kSBCModePageCaching_ABPF_Bit), + kSBCModePageCaching_IC_Mask = (1 << kSBCModePageCaching_IC_Bit) +}; + + +/*! +@enum Demand Read/Write Retention masks +@discussion +Demand Read/Write Retention masks. +@constant kSBCModePageCaching_DEMAND_WRITE_Mask +Mask for the DEMAND_READ_WRITE_RETENTION_PRIORITY field. +@constant kSBCModePageCaching_DEMAND_READ_Mask +Mask for the DEMAND_READ_WRITE_RETENTION_PRIORITY field. +*/ +enum +{ + kSBCModePageCaching_DEMAND_WRITE_Mask = 0x00FF, + kSBCModePageCaching_DEMAND_READ_Mask = 0xFF00 +}; + +/*! +@enum Caching flags2 bitfields +@discussion +Bit field definitions and masks for Caching flags2 field. +@constant kSBCModePageCaching_VS1_Bit +VS1 Bit definition. +@constant kSBCModePageCaching_VS2_Bit +VS2 Bit definition. +@constant kSBCModePageCaching_DRA_Bit +DRA Bit definition. +@constant kSBCModePageCaching_LBCSS_Bit +LBCSS Bit definition. +@constant kSBCModePageCaching_FSW_Bit +FSW Bit definition. +@constant kSBCModePageCaching_VS1_Mask +Mask for use with flags2 field. +@constant kSBCModePageCaching_VS2_Mask +Mask for use with flags2 field. +@constant kSBCModePageCaching_DRA_Mask +Mask for use with flags2 field. +@constant kSBCModePageCaching_LBCSS_Mask +Mask for use with flags2 field. +@constant kSBCModePageCaching_FSW_Mask +Mask for use with flags2 field. +*/ +enum +{ + // Bits 0:2 Reserved + kSBCModePageCaching_VS1_Bit = 3, + kSBCModePageCaching_VS2_Bit = 4, + kSBCModePageCaching_DRA_Bit = 5, + kSBCModePageCaching_LBCSS_Bit = 6, + kSBCModePageCaching_FSW_Bit = 7, + + kSBCModePageCaching_VS1_Mask = (1 << kSBCModePageCaching_VS1_Bit), + kSBCModePageCaching_VS2_Mask = (1 << kSBCModePageCaching_VS2_Bit), + kSBCModePageCaching_DRA_Mask = (1 << kSBCModePageCaching_DRA_Bit), + kSBCModePageCaching_LBCSS_Mask = (1 << kSBCModePageCaching_LBCSS_Bit), + kSBCModePageCaching_FSW_Mask = (1 << kSBCModePageCaching_FSW_Bit) +}; + +#pragma options align=reset + +#endif /* _IOKIT_SCSI_CMDS_MODE_DEFINITIONS_H_ */ diff --git a/QualcommWireless/include/IOKit/scsi/SCSICmds_READ_CAPACITY_Definitions.h b/QualcommWireless/include/IOKit/scsi/SCSICmds_READ_CAPACITY_Definitions.h new file mode 100644 index 0000000..59abde3 --- /dev/null +++ b/QualcommWireless/include/IOKit/scsi/SCSICmds_READ_CAPACITY_Definitions.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 1998-2009 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_SCSI_CMDS_READ_CAPACITY_H_ +#define _IOKIT_SCSI_CMDS_READ_CAPACITY_H_ + + +#if KERNEL +#include +#else +#include +#endif + + +/*! @header SCSI Request Sense Definitions + @discussion + This file contains all definitions for the data returned from + the READ CAPACITY 10 (0x25) and READ CAPACITY 16 (0x9E) commands. +*/ + +/*! +@enum READ CAPACITY Payload Sizes +@discussion +Sizes of the payload for the READ CAPACITY 10 and +READ CAPACITY 16 commands. +@constant kREPORT_CAPACITY_DataSize +Data size for a READ_CAPACITY command. +@constant kREPORT_CAPACITY_16_DataSize +Data size for a READ_CAPACITY_16 command. +*/ +enum +{ + kREPORT_CAPACITY_DataSize = 8, + kREPORT_CAPACITY_16_DataSize = 32 +}; + + +/*! +@constant kREPORT_CAPACITY_MaximumLBA +@discussion +Maximum LBA supported via READ CAPACITY 10 command. +*/ +#define kREPORT_CAPACITY_MaximumLBA 0xFFFFFFFFUL + + +/*! +@constant kREPORT_CAPACITY_16_MaximumLBA +@discussion +Maximum LBA supported via READ CAPACITY 16 command. +*/ +#define kREPORT_CAPACITY_16_MaximumLBA 0xFFFFFFFFFFFFFFFFULL + + +/*! +@struct SCSI_Capacity_Data +@discussion +Capacity return structure for READ CAPACITY 10 command. +*/ +typedef struct SCSI_Capacity_Data +{ + UInt32 RETURNED_LOGICAL_BLOCK_ADDRESS; + UInt32 BLOCK_LENGTH_IN_BYTES; +} SCSI_Capacity_Data; + + +/*! +@struct SCSI_Capacity_Data_Long +@discussion +Capacity return structure for READ CAPACITY 16 command. +*/ +typedef struct SCSI_Capacity_Data_Long +{ + UInt64 RETURNED_LOGICAL_BLOCK_ADDRESS; + UInt32 BLOCK_LENGTH_IN_BYTES; + UInt8 RTO_EN_PROT_EN; + UInt8 Reserved[19]; +} SCSI_Capacity_Data_Long; + + +/*! +@enum RTO_EN definitions +@discussion +Values for the REFERENCE TAG OWN (RTO_EN) bit in the +READ CAPACITY Long Data structure. +@constant kREAD_CAPACITY_RTO_Enabled +Reference Tag Own enabled. +@constant kREAD_CAPACITY_RTO_Disabled +Reference Tag Own disabled. +@constant kREAD_CAPACITY_RTO_Mask +Mask to use when checking the RTO_EN_PROT_EN field. +*/ +enum +{ + kREAD_CAPACITY_RTO_Enabled = 0x02, + kREAD_CAPACITY_RTO_Disabled = 0x00, + kREAD_CAPACITY_RTO_Mask = 0x02 +}; + + +/*! +@enum PROTECTION INFORMATION definitions +@discussion +Values for the PROTECTION INFORMATION (PROT_EN) bit in the +READ CAPACITY Long Data structure. +@constant kREAD_CAPACITY_PROT_Enabled +Protection Information enabled. +@constant kREAD_CAPACITY_PROT_Disabled +Protection Information disabled. +@constant kREAD_CAPACITY_PROT_Mask +Mask to use when checking the RTO_EN_PROT_EN field. +*/ + +enum +{ + kREAD_CAPACITY_PROT_Enabled = 0x01, + kREAD_CAPACITY_PROT_Disabled = 0x00, + kREAD_CAPACITY_PROT_Mask = 0x01 +}; + + +#endif /* _IOKIT_SCSI_CMDS_READ_CAPACITY_H_ */ diff --git a/QualcommWireless/include/IOKit/scsi/SCSICmds_REPORT_LUNS_Definitions.h b/QualcommWireless/include/IOKit/scsi/SCSICmds_REPORT_LUNS_Definitions.h new file mode 100644 index 0000000..e2892fb --- /dev/null +++ b/QualcommWireless/include/IOKit/scsi/SCSICmds_REPORT_LUNS_Definitions.h @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2004-2009 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_SCSI_CMDS_REPORT_LUNS_DEFINITIONS_H_ +#define _IOKIT_SCSI_CMDS_REPORT_LUNS_DEFINITIONS_H_ + + +#if KERNEL +#include +#else +#include +#endif + + +/*! @header SCSI Request Sense Definitions + @discussion + This file contains all definitions for the data returned from + the REPORT_LUNS (0xA0) command. +*/ + + +/*! +@struct SCSICmd_REPORT_LUNS_LUN_ENTRY +@discussion +This structure represents a single LUN entry in a LUN list +returned via the REPORT_LUNS command. +*/ +typedef struct SCSICmd_REPORT_LUNS_LUN_ENTRY +{ + UInt16 FIRST_LEVEL_ADDRESSING; + UInt16 SECOND_LEVEL_ADDRESSING; + UInt16 THIRD_LEVEL_ADDRESSING; + UInt16 FOURTH_LEVEL_ADDRESSING; +} SCSICmd_REPORT_LUNS_LUN_ENTRY; + + +/*! +@constant kREPORT_LUNS_HeaderSize +@discussion +Size of the REPORT_LUNS header as defined in the SPC-3 specification. +*/ +#define kREPORT_LUNS_HeaderSize 8 + +/*! +@enum REPORT_LUNS addressing methods. +@discussion +REPORT_LUNS addressing methods described in +SAM-2 documents. +@constant kREPORT_LUNS_ADDRESS_METHOD_PERIPHERAL_DEVICE +Peripheral Device Addressing Method. +@constant kREPORT_LUNS_ADDRESS_DEVICE_TYPE_SPECIFIC +Device Type Specific Addressing Method. +@constant kREPORT_LUNS_ADDRESS_METHOD_LOGICAL_UNIT +Logical Unit Specific Addressing Method. +@constant kREPORT_LUNS_ADDRESS_METHOD_OFFSET +Offset to the address method data. +*/ +enum +{ + kREPORT_LUNS_ADDRESS_METHOD_PERIPHERAL_DEVICE = 0, + kREPORT_LUNS_ADDRESS_METHOD_FLAT_SPACE = 1, + kREPORT_LUNS_ADDRESS_DEVICE_TYPE_SPECIFIC = kREPORT_LUNS_ADDRESS_METHOD_FLAT_SPACE, + kREPORT_LUNS_ADDRESS_METHOD_LOGICAL_UNIT = 2, + // Reserved [3] + kREPORT_LUNS_ADDRESS_METHOD_OFFSET = 14 +}; + + +/*! +@struct REPORT_LUNS_LOGICAL_UNIT_ADDRESSING +@discussion +This structure represents a LUN Addressing scheme. +*/ +typedef struct REPORT_LUNS_LOGICAL_UNIT_ADDRESSING +{ +#ifdef __LITTLE_ENDIAN__ + UInt16 LUN : 5; + UInt16 BUS_NUMBER : 3; + UInt16 TARGET : 6; + UInt16 reserved2 : 1; + UInt16 reserved : 1; +#else /* !__LITTLE_ENDIAN__ */ + UInt16 reserved : 1; + UInt16 reserved2 : 1; + UInt16 TARGET : 6; + UInt16 BUS_NUMBER : 3; + UInt16 LUN : 5; +#endif /* !__LITTLE_ENDIAN__ */ +} REPORT_LUNS_LOGICAL_UNIT_ADDRESSING; + + +/*! +@struct REPORT_LUNS_PERIPHERAL_DEVICE_ADDRESSING +@discussion +This structure represents a Peripheral Device Addressing scheme. +*/ +typedef struct REPORT_LUNS_PERIPHERAL_DEVICE_ADDRESSING +{ +#ifdef __LITTLE_ENDIAN__ + UInt16 TARGET_LUN : 8; + UInt16 BUS_IDENTIFIER : 6; + UInt16 reserved2 : 1; + UInt16 reserved : 1; +#else /* !__LITTLE_ENDIAN__ */ + UInt16 reserved : 1; + UInt16 reserved2 : 1; + UInt16 BUS_IDENTIFIER : 6; + UInt16 TARGET_LUN : 8; +#endif /* !__LITTLE_ENDIAN__ */ +} REPORT_LUNS_PERIPHERAL_DEVICE_ADDRESSING; + + +/*! +@struct SCSICmd_REPORT_LUNS_Header +@discussion +This structure defines the format of the data that is returned for +the REPORT_LUNS command. +*/ +typedef struct SCSICmd_REPORT_LUNS_Header +{ + UInt32 LUN_LIST_LENGTH; // LUN list length in bytes. + UInt32 RESERVED; + SCSICmd_REPORT_LUNS_LUN_ENTRY LUN[1]; // Variable length list. Must have at least LUN 0 if +} SCSICmd_REPORT_LUNS_Header; // Target supports REPORT_LUNS command. + + +#endif /* _IOKIT_SCSI_CMDS_REPORT_LUNS_DEFINITIONS_H_ */ diff --git a/QualcommWireless/include/IOKit/scsi/SCSICmds_REQUEST_SENSE_Defs.h b/QualcommWireless/include/IOKit/scsi/SCSICmds_REQUEST_SENSE_Defs.h new file mode 100644 index 0000000..8cfabb0 --- /dev/null +++ b/QualcommWireless/include/IOKit/scsi/SCSICmds_REQUEST_SENSE_Defs.h @@ -0,0 +1,234 @@ +/* + * Copyright (c) 1998-2009 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_SCSI_CMDS_REQUEST_SENSE_H_ +#define _IOKIT_SCSI_CMDS_REQUEST_SENSE_H_ + + +#if KERNEL +#include +#else +#include +#endif + + +/*! @header SCSI Request Sense Definitions + @discussion + This file contains all definitions for the data returned from + the REQUEST SENSE (0x03) command and from auto sense on protocols + that support it. +*/ + + +/*! +@enum kSenseDefaultSize +@discussion +The default size for SCSI Request Sense data. +*/ +enum +{ + kSenseDefaultSize = 18 +}; + + +/*! +@struct SCSI_Sense_Data +@discussion +The basic SCSI Request Sense data structure. +*/ +typedef struct SCSI_Sense_Data +{ + UInt8 VALID_RESPONSE_CODE; // 7 = Valid. 6-0 = Response Code. + UInt8 SEGMENT_NUMBER; // Segment number + UInt8 SENSE_KEY; // 7 = FILEMARK, 6 = EOM, 5 = ILI, 3-0 = SENSE KEY. + UInt8 INFORMATION_1; // INFORMATION. + UInt8 INFORMATION_2; // INFORMATION. + UInt8 INFORMATION_3; // INFORMATION. + UInt8 INFORMATION_4; // INFORMATION. + UInt8 ADDITIONAL_SENSE_LENGTH; // Number of additional bytes available in sense data + UInt8 COMMAND_SPECIFIC_INFORMATION_1; // Command Specific Information + UInt8 COMMAND_SPECIFIC_INFORMATION_2; // Command Specific Information + UInt8 COMMAND_SPECIFIC_INFORMATION_3; // Command Specific Information + UInt8 COMMAND_SPECIFIC_INFORMATION_4; // Command Specific Information + UInt8 ADDITIONAL_SENSE_CODE; // Additional Sense Code + UInt8 ADDITIONAL_SENSE_CODE_QUALIFIER; // Additional Sense Code Qualifier + UInt8 FIELD_REPLACEABLE_UNIT_CODE; // Field Replaceable Unit Code + UInt8 SKSV_SENSE_KEY_SPECIFIC_MSB; // 7 = Sense Key Specific Valid bit, 6-0 Sense Key Specific MSB + UInt8 SENSE_KEY_SPECIFIC_MID; // Sense Key Specific Middle + UInt8 SENSE_KEY_SPECIFIC_LSB; // Sense Key Specific LSB +} SCSI_Sense_Data; + + +/*! +@enum Sense Valid +@discussion +Masks to use to determine if sense data is valid or not. +@constant kSENSE_DATA_VALID +Sense data is valid. +@constant kSENSE_NOT_DATA_VALID +Sense data is not valid. +@constant kSENSE_DATA_VALID_Mask +Validity mask to use when checking the VALID_RESPONSE_CODE field. +*/ +enum +{ + kSENSE_DATA_VALID = 0x80, + kSENSE_NOT_DATA_VALID = 0x00, + kSENSE_DATA_VALID_Mask = 0x80 +}; + + +/*! +@enum Sense Response Codes +@discussion +Masks and values to determine the Response Code. +@constant kSENSE_RESPONSE_CODE_Current_Errors +Response code indicating current errors are reported. +@constant kSENSE_RESPONSE_CODE_Deferred_Errors +Response code indicating deferred errors are reported. +@constant kSENSE_RESPONSE_CODE_Mask +Mask to use when checking the VALID_RESPONSE_CODE field. +*/ +enum +{ + kSENSE_RESPONSE_CODE_Current_Errors = 0x70, + kSENSE_RESPONSE_CODE_Deferred_Errors = 0x71, + kSENSE_RESPONSE_CODE_Mask = 0x7F +}; + + +/*! +@enum FILEMARK bit field definitions +@discussion +Masks and values to determine the FileMark bit field. +@constant kSENSE_FILEMARK_Set +Filemark bit is set. +@constant kSENSE_FILEMARK_Not_Set +Filemark bit is not set. +@constant kSENSE_FILEMARK_Mask +Mask to use when checking the SENSE_KEY field for the FILEMARK bit. +*/ +enum +{ + kSENSE_FILEMARK_Set = 0x80, + kSENSE_FILEMARK_Not_Set = 0x00, + kSENSE_FILEMARK_Mask = 0x80 +}; + + +/*! +@enum EOM bit field definitions +@discussion +Masks and values to determine the End Of Medium bit field. +@constant kSENSE_EOM_Set +End Of Medium bit is set. +@constant kSENSE_EOM_Not_Set +End Of Medium bit is not set. +@constant kSENSE_EOM_Mask +Mask to use when checking the SENSE_KEY field for the EOM bit. +*/ +enum +{ + kSENSE_EOM_Set = 0x40, + kSENSE_EOM_Not_Set = 0x00, + kSENSE_EOM_Mask = 0x40 +}; + + +/*! +@enum ILI bit field definitions +@discussion +Masks and values to determine the Incorrect Length Indicator bit field. +@constant kSENSE_ILI_Set +Incorrect Length Indicator bit is set. +@constant kSENSE_ILI_Not_Set +Incorrect Length Indicator bit is not set. +@constant kSENSE_ILI_Mask +Mask to use when checking the SENSE_KEY field for the ILI bit. +*/ +enum +{ + kSENSE_ILI_Set = 0x20, + kSENSE_ILI_Not_Set = 0x00, + kSENSE_ILI_Mask = 0x20 +}; + + +/*! +@enum Sense Key definitions +@discussion +Masks and values to determine the SENSE_KEY. +@constant kSENSE_KEY_NO_SENSE +No sense data is present. +@constant kSENSE_KEY_RECOVERED_ERROR +A recovered error has occurred. +@constant kSENSE_KEY_NOT_READY +Device server is not ready. +@constant kSENSE_KEY_MEDIUM_ERROR +Device server detected a medium error. +@constant kSENSE_KEY_HARDWARE_ERROR +Device server detected a hardware error. +@constant kSENSE_KEY_ILLEGAL_REQUEST +Device server detected an illegal request. +@constant kSENSE_KEY_UNIT_ATTENTION +Device server indicates a unit attention condition. +@constant kSENSE_KEY_DATA_PROTECT +Device server indicates a data protect condition. +@constant kSENSE_KEY_BLANK_CHECK +Device server indicates a blank check condition. +@constant kSENSE_KEY_VENDOR_SPECIFIC +Device server indicates a vendor specific condition. +@constant kSENSE_KEY_COPY_ABORTED +Device server indicates a copy aborted condition. +@constant kSENSE_KEY_ABORTED_COMMAND +Device server indicates an aborted command condition. +@constant kSENSE_KEY_VOLUME_OVERFLOW +Device server indicates a volume overflow condition. +@constant kSENSE_KEY_MISCOMPARE +Device server indicates a miscompare condition. +@constant kSENSE_KEY_Mask +Mask to use when checking the SENSE_KEY field for the SENSE_KEY value. +*/ +enum +{ + kSENSE_KEY_NO_SENSE = 0x00, + kSENSE_KEY_RECOVERED_ERROR = 0x01, + kSENSE_KEY_NOT_READY = 0x02, + kSENSE_KEY_MEDIUM_ERROR = 0x03, + kSENSE_KEY_HARDWARE_ERROR = 0x04, + kSENSE_KEY_ILLEGAL_REQUEST = 0x05, + kSENSE_KEY_UNIT_ATTENTION = 0x06, + kSENSE_KEY_DATA_PROTECT = 0x07, + kSENSE_KEY_BLANK_CHECK = 0x08, + kSENSE_KEY_VENDOR_SPECIFIC = 0x09, + kSENSE_KEY_COPY_ABORTED = 0x0A, + kSENSE_KEY_ABORTED_COMMAND = 0x0B, + /* SENSE KEY 0x0C is obsoleted */ + kSENSE_KEY_VOLUME_OVERFLOW = 0x0D, + kSENSE_KEY_MISCOMPARE = 0x0E, + /* SENSE KEY 0x0F is reserved */ + kSENSE_KEY_Mask = 0x0F +}; + + +#endif /* _IOKIT_SCSI_CMDS_REQUEST_SENSE_H_ */ diff --git a/QualcommWireless/include/IOKit/scsi/SCSICommandDefinitions.h b/QualcommWireless/include/IOKit/scsi/SCSICommandDefinitions.h new file mode 100644 index 0000000..d33aed6 --- /dev/null +++ b/QualcommWireless/include/IOKit/scsi/SCSICommandDefinitions.h @@ -0,0 +1,479 @@ +/* + * Copyright (c) 2001-2009 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_SCSI_COMMAND_DEFINITIONS_H_ +#define _IOKIT_SCSI_COMMAND_DEFINITIONS_H_ + + +#if KERNEL +#include +#else +#include +#endif + + +/*! @header SCSICommandDefinitions + @discussion + This file contains all the definitions for types and constants that are + used by the command set classes for building CDBs. The field type + definitions are used for the parameters passed to a method that builds and + sends any SCSI defined command to clearly identify the type of value + expected for a parameter. + + The command methods will then use the appropriate mask to verify that the + value passed into a parameter is of the specified type. + + Currently only types and masks are defined for 8 bytes and smaller fields. + If a command is defined that uses a larger field, these should be expanded + to include those sizes. +*/ + +#pragma mark Field Type Definitions +/* These are the type definitions used for the parameters of methods that + * build and send Command Descriptor Blocks. + */ + +/* 1 Byte or smaller fields. */ + +/*! @typedef SCSICmdField1Bit */ +typedef UInt8 SCSICmdField1Bit; + +/*! @typedef SCSICmdField2Bit */ +typedef UInt8 SCSICmdField2Bit; + +/*! @typedef SCSICmdField3Bit */ +typedef UInt8 SCSICmdField3Bit; + +/*! @typedef SCSICmdField4Bit */ +typedef UInt8 SCSICmdField4Bit; + +/*! @typedef SCSICmdField5Bit */ +typedef UInt8 SCSICmdField5Bit; + +/*! @typedef SCSICmdField6Bit */ +typedef UInt8 SCSICmdField6Bit; + +/*! @typedef SCSICmdField7Bit */ +typedef UInt8 SCSICmdField7Bit; + +/*! @typedef SCSICmdField1Byte */ +typedef UInt8 SCSICmdField1Byte; + +/* 2 Bytes or smaller fields. */ + +/*! @typedef SCSICmdField9Bit */ +typedef UInt16 SCSICmdField9Bit; + +/*! @typedef SCSICmdField10Bit */ +typedef UInt16 SCSICmdField10Bit; + +/*! @typedef SCSICmdField11Bit */ +typedef UInt16 SCSICmdField11Bit; + +/*! @typedef SCSICmdField12Bit */ +typedef UInt16 SCSICmdField12Bit; + +/*! @typedef SCSICmdField13Bit */ +typedef UInt16 SCSICmdField13Bit; + +/*! @typedef SCSICmdField14Bit */ +typedef UInt16 SCSICmdField14Bit; + +/*! @typedef SCSICmdField15Bit */ +typedef UInt16 SCSICmdField15Bit; + +/*! @typedef SCSICmdField2Byte */ +typedef UInt16 SCSICmdField2Byte; + +/* 3 Bytes or smaller fields. */ + +/*! @typedef SCSICmdField17Bit */ +typedef UInt32 SCSICmdField17Bit; + +/*! @typedef SCSICmdField18Bit */ +typedef UInt32 SCSICmdField18Bit; + +/*! @typedef SCSICmdField19Bit */ +typedef UInt32 SCSICmdField19Bit; + +/*! @typedef SCSICmdField20Bit */ +typedef UInt32 SCSICmdField20Bit; + +/*! @typedef SCSICmdField21Bit */ +typedef UInt32 SCSICmdField21Bit; + +/*! @typedef SCSICmdField22Bit */ +typedef UInt32 SCSICmdField22Bit; + +/*! @typedef SCSICmdField23Bit */ +typedef UInt32 SCSICmdField23Bit; + +/*! @typedef SCSICmdField3Byte */ +typedef UInt32 SCSICmdField3Byte; + +/* 4 Bytes or smaller fields. */ + +/*! @typedef SCSICmdField25Bit */ +typedef UInt32 SCSICmdField25Bit; + +/*! @typedef SCSICmdField26Bit */ +typedef UInt32 SCSICmdField26Bit; + +/*! @typedef SCSICmdField27Bit */ +typedef UInt32 SCSICmdField27Bit; + +/*! @typedef SCSICmdField28Bit */ +typedef UInt32 SCSICmdField28Bit; + +/*! @typedef SCSICmdField29Bit */ +typedef UInt32 SCSICmdField29Bit; + +/*! @typedef SCSICmdField30Bit */ +typedef UInt32 SCSICmdField30Bit; + +/*! @typedef SCSICmdField31Bit */ +typedef UInt32 SCSICmdField31Bit; + +/*! @typedef SCSICmdField4Byte */ +typedef UInt32 SCSICmdField4Byte; + +/* 5 Bytes or smaller fields. */ + +/*! @typedef SCSICmdField33Bit */ +typedef UInt64 SCSICmdField33Bit; + +/*! @typedef SCSICmdField34Bit */ +typedef UInt64 SCSICmdField34Bit; + +/*! @typedef SCSICmdField35Bit */ +typedef UInt64 SCSICmdField35Bit; + +/*! @typedef SCSICmdField36Bit */ +typedef UInt64 SCSICmdField36Bit; + +/*! @typedef SCSICmdField37Bit */ +typedef UInt64 SCSICmdField37Bit; + +/*! @typedef SCSICmdField38Bit */ +typedef UInt64 SCSICmdField38Bit; + +/*! @typedef SCSICmdField39Bit */ +typedef UInt64 SCSICmdField39Bit; + +/*! @typedef SCSICmdField5Byte */ +typedef UInt64 SCSICmdField5Byte; + +/* 6 Bytes or smaller fields. */ + +/*! @typedef SCSICmdField41Bit */ +typedef UInt64 SCSICmdField41Bit; + +/*! @typedef SCSICmdField42Bit */ +typedef UInt64 SCSICmdField42Bit; + +/*! @typedef SCSICmdField43Bit */ +typedef UInt64 SCSICmdField43Bit; + +/*! @typedef SCSICmdField44Bit */ +typedef UInt64 SCSICmdField44Bit; + +/*! @typedef SCSICmdField45Bit */ +typedef UInt64 SCSICmdField45Bit; + +/*! @typedef SCSICmdField46Bit */ +typedef UInt64 SCSICmdField46Bit; + +/*! @typedef SCSICmdField47Bit */ +typedef UInt64 SCSICmdField47Bit; + +/*! @typedef SCSICmdField6Byte */ +typedef UInt64 SCSICmdField6Byte; + +/* 7 Bytes or smaller fields. */ + +/*! @typedef SCSICmdField49Bit */ +typedef UInt64 SCSICmdField49Bit; + +/*! @typedef SCSICmdField50Bit */ +typedef UInt64 SCSICmdField50Bit; + +/*! @typedef SCSICmdField51Bit */ +typedef UInt64 SCSICmdField51Bit; + +/*! @typedef SCSICmdField52Bit */ +typedef UInt64 SCSICmdField52Bit; + +/*! @typedef SCSICmdField53Bit */ +typedef UInt64 SCSICmdField53Bit; + +/*! @typedef SCSICmdField54Bit */ +typedef UInt64 SCSICmdField54Bit; + +/*! @typedef SCSICmdField55Bit */ +typedef UInt64 SCSICmdField55Bit; + +/*! @typedef SCSICmdField7Byte */ +typedef UInt64 SCSICmdField7Byte; + +/* 8 Bytes or smaller fields. */ + +/*! @typedef SCSICmdField57Bit */ +typedef UInt64 SCSICmdField57Bit; + +/*! @typedef SCSICmdField58Bit */ +typedef UInt64 SCSICmdField58Bit; + +/*! @typedef SCSICmdField59Bit */ +typedef UInt64 SCSICmdField59Bit; + +/*! @typedef SCSICmdField60Bit */ +typedef UInt64 SCSICmdField60Bit; + +/*! @typedef SCSICmdField61Bit */ +typedef UInt64 SCSICmdField61Bit; + +/*! @typedef SCSICmdField62Bit */ +typedef UInt64 SCSICmdField62Bit; + +/*! @typedef SCSICmdField63Bit */ +typedef UInt64 SCSICmdField63Bit; + +/*! @typedef SCSICmdField8Byte */ +typedef UInt64 SCSICmdField8Byte; + + +#pragma mark Field Mask Definitions +/* These are masks that are used to verify that the values passed into the + * parameters for the fields are not larger than the field size. + * + * NB: These have changed from enums to #define since enums greater than + * 32 bits in size are not well-defined in C99. + */ + +/* 1 Byte or smaller fields. */ + +/*! @constant kSCSICmdFieldMask1Bit */ +#define kSCSICmdFieldMask1Bit 0x01 + +/*! @constant kSCSICmdFieldMask2Bit */ +#define kSCSICmdFieldMask2Bit 0x03 + +/*! @constant kSCSICmdFieldMask3Bit */ +#define kSCSICmdFieldMask3Bit 0x07 + +/*! @constant kSCSICmdFieldMask4Bit */ +#define kSCSICmdFieldMask4Bit 0x0F + +/*! @constant kSCSICmdFieldMask5Bit */ +#define kSCSICmdFieldMask5Bit 0x1F + +/*! @constant kSCSICmdFieldMask6Bit */ +#define kSCSICmdFieldMask6Bit 0x3F + +/*! @constant kSCSICmdFieldMask7Bit */ +#define kSCSICmdFieldMask7Bit 0x7F + +#define kSCSICmdFieldMask1Byte 0xFF + +/* 2 Bytes or smaller fields. */ + +/*! @constant kSCSICmdFieldMask9Bit */ +#define kSCSICmdFieldMask9Bit 0x01FF + +/*! @constant kSCSICmdFieldMask10Bit */ +#define kSCSICmdFieldMask10Bit 0x03FF + +/*! @constant kSCSICmdFieldMask11Bit */ +#define kSCSICmdFieldMask11Bit 0x07FF + +/*! @constant kSCSICmdFieldMask12Bit */ +#define kSCSICmdFieldMask12Bit 0x0FFF + +/*! @constant kSCSICmdFieldMask13Bit */ +#define kSCSICmdFieldMask13Bit 0x1FFF + +/*! @constant kSCSICmdFieldMask14Bit */ +#define kSCSICmdFieldMask14Bit 0x3FFF + +/*! @constant kSCSICmdFieldMask15Bit */ +#define kSCSICmdFieldMask15Bit 0x7FFF + +/*! @constant kSCSICmdFieldMask2Byte */ +#define kSCSICmdFieldMask2Byte 0xFFFF + +/* 3 Bytes or smaller fields. */ + +/*! @constant kSCSICmdFieldMask17Bit */ +#define kSCSICmdFieldMask17Bit 0x01FFFF + +/*! @constant kSCSICmdFieldMask18Bit */ +#define kSCSICmdFieldMask18Bit 0x03FFFF + +/*! @constant kSCSICmdFieldMask19Bit */ +#define kSCSICmdFieldMask19Bit 0x07FFFF + +/*! @constant kSCSICmdFieldMask20Bit */ +#define kSCSICmdFieldMask20Bit 0x0FFFFF + +/*! @constant kSCSICmdFieldMask21Bit */ +#define kSCSICmdFieldMask21Bit 0x1FFFFF + +/*! @constant kSCSICmdFieldMask22Bit */ +#define kSCSICmdFieldMask22Bit 0x3FFFFF + +/*! @constant kSCSICmdFieldMask23Bit */ +#define kSCSICmdFieldMask23Bit 0x7FFFFF + +/*! @constant kSCSICmdFieldMask3Byte */ +#define kSCSICmdFieldMask3Byte 0xFFFFFF + +/* 4 Bytes or smaller fields. */ +/*! @constant kSCSICmdFieldMask25Bit */ +#define kSCSICmdFieldMask25Bit 0x01FFFFFFUL + +/*! @constant kSCSICmdFieldMask26Bit */ +#define kSCSICmdFieldMask26Bit 0x03FFFFFFUL + +/*! @constant kSCSICmdFieldMask27Bit */ +#define kSCSICmdFieldMask27Bit 0x07FFFFFFUL + +/*! @constant kSCSICmdFieldMask28Bit */ +#define kSCSICmdFieldMask28Bit 0x0FFFFFFFUL + +/*! @constant kSCSICmdFieldMask29Bit */ +#define kSCSICmdFieldMask29Bit 0x1FFFFFFFUL + +/*! @constant kSCSICmdFieldMask30Bit */ +#define kSCSICmdFieldMask30Bit 0x3FFFFFFFUL + +/*! @constant kSCSICmdFieldMask31Bit */ +#define kSCSICmdFieldMask31Bit 0x7FFFFFFFUL + +/*! @constant kSCSICmdFieldMask4Byte */ +#define kSCSICmdFieldMask4Byte 0xFFFFFFFFUL + +/* 5 Bytes or smaller fields. */ + +/*! @constant kSCSICmdFieldMask33Bit */ +#define kSCSICmdFieldMask33Bit 0x01FFFFFFFFULL + +/*! @constant kSCSICmdFieldMask34Bit */ +#define kSCSICmdFieldMask34Bit 0x03FFFFFFFFULL + +/*! @constant kSCSICmdFieldMask35Bit */ +#define kSCSICmdFieldMask35Bit 0x07FFFFFFFFULL + +/*! @constant kSCSICmdFieldMask36Bit */ +#define kSCSICmdFieldMask36Bit 0x0FFFFFFFFFULL + +/*! @constant kSCSICmdFieldMask37Bit */ +#define kSCSICmdFieldMask37Bit 0x1FFFFFFFFFULL + +/*! @constant kSCSICmdFieldMask38Bit */ +#define kSCSICmdFieldMask38Bit 0x3FFFFFFFFFULL + +/*! @constant kSCSICmdFieldMask39Bit */ +#define kSCSICmdFieldMask39Bit 0x7FFFFFFFFFULL + +/*! @constant kSCSICmdFieldMask5Byte */ +#define kSCSICmdFieldMask5Byte 0xFFFFFFFFFFULL + +/* 6 Bytes or smaller fields. */ + +/*! @constant kSCSICmdFieldMask41Bit */ +#define kSCSICmdFieldMask41Bit 0x01FFFFFFFFFFULL + +/*! @constant kSCSICmdFieldMask42Bit */ +#define kSCSICmdFieldMask42Bit 0x03FFFFFFFFFFULL + +/*! @constant kSCSICmdFieldMask43Bit */ +#define kSCSICmdFieldMask43Bit 0x07FFFFFFFFFFULL + +/*! @constant kSCSICmdFieldMask44Bit */ +#define kSCSICmdFieldMask44Bit 0x0FFFFFFFFFFFULL + +/*! @constant kSCSICmdFieldMask45Bit */ +#define kSCSICmdFieldMask45Bit 0x1FFFFFFFFFFFULL + +/*! @constant kSCSICmdFieldMask46Bit */ +#define kSCSICmdFieldMask46Bit 0x3FFFFFFFFFFFULL + +/*! @constant kSCSICmdFieldMask47Bit */ +#define kSCSICmdFieldMask47Bit 0x7FFFFFFFFFFFULL + +/*! @constant kSCSICmdFieldMask6Byte */ +#define kSCSICmdFieldMask6Byte 0xFFFFFFFFFFFFULL + +/* 7 Bytes or smaller fields. */ + +/*! @constant kSCSICmdFieldMask49Bit */ +#define kSCSICmdFieldMask49Bit 0x01FFFFFFFFFFFFULL + +/*! @constant kSCSICmdFieldMask50Bit */ +#define kSCSICmdFieldMask50Bit 0x03FFFFFFFFFFFFULL + +/*! @constant kSCSICmdFieldMask51Bit */ +#define kSCSICmdFieldMask51Bit 0x07FFFFFFFFFFFFULL + +/*! @constant kSCSICmdFieldMask52Bit */ +#define kSCSICmdFieldMask52Bit 0x0FFFFFFFFFFFFFULL + +/*! @constant kSCSICmdFieldMask53Bit */ +#define kSCSICmdFieldMask53Bit 0x1FFFFFFFFFFFFFULL + +/*! @constant kSCSICmdFieldMask54Bit */ +#define kSCSICmdFieldMask54Bit 0x3FFFFFFFFFFFFFULL + +/*! @constant kSCSICmdFieldMask55Bit */ +#define kSCSICmdFieldMask55Bit 0x7FFFFFFFFFFFFFULL + +/*! @constant kSCSICmdFieldMask7Byte */ +#define kSCSICmdFieldMask7Byte 0xFFFFFFFFFFFFFFULL + +/* 8 Bytes or smaller fields. */ + +/*! @constant kSCSICmdFieldMask57Bit */ +#define kSCSICmdFieldMask57Bit 0x01FFFFFFFFFFFFFFULL + +/*! @constant kSCSICmdFieldMask58Bit */ +#define kSCSICmdFieldMask58Bit 0x03FFFFFFFFFFFFFFULL + +/*! @constant kSCSICmdFieldMask59Bit */ +#define kSCSICmdFieldMask59Bit 0x07FFFFFFFFFFFFFFULL + +/*! @constant kSCSICmdFieldMask60Bit */ +#define kSCSICmdFieldMask60Bit 0x0FFFFFFFFFFFFFFFULL + +/*! @constant kSCSICmdFieldMask61Bit */ +#define kSCSICmdFieldMask61Bit 0x1FFFFFFFFFFFFFFFULL + +/*! @constant kSCSICmdFieldMask62Bit */ +#define kSCSICmdFieldMask62Bit 0x3FFFFFFFFFFFFFFFULL + +/*! @constant kSCSICmdFieldMask63Bit */ +#define kSCSICmdFieldMask63Bit 0x7FFFFFFFFFFFFFFFULL + +/*! @constant kSCSICmdFieldMask8Byte */ +#define kSCSICmdFieldMask8Byte 0xFFFFFFFFFFFFFFFFULL + +#endif /* _IOKIT_SCSI_COMMAND_DEFINITIONS_H_ */ diff --git a/QualcommWireless/include/IOKit/scsi/SCSICommandOperationCodes.h b/QualcommWireless/include/IOKit/scsi/SCSICommandOperationCodes.h new file mode 100644 index 0000000..37a92c6 --- /dev/null +++ b/QualcommWireless/include/IOKit/scsi/SCSICommandOperationCodes.h @@ -0,0 +1,920 @@ +/* + * Copyright (c) 2001-2009 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _SCSI_COMMAND_OPERATION_CODES_H_ +#define _SCSI_COMMAND_OPERATION_CODES_H_ + +#pragma mark About this file +/* This file contains the operation code definitions for all commands defined + * by the SCSI specifications. The commands are listed in three formats: + * 1) All commands are listed in alphabetical order. This list is the live + * enumeration for all of the command constants. + * 2) The commands are listed in ascending numerical order. + * 3) The commands are grouped by Peripheral Device Type. + * + * In the command listings by Peripheral Device Type, there will be a comment + * following each command. This comment indentifies the section of the related + * specification where the commands is defined and the requirement type of the + * command, Mandatory or Optional. + * If a specification redefines an optional command from SPC as mandatory, + * the command will be relisted in the Peripheral Device Type command list with + * the mandatory tag next to it. + * All commands that are listed in SPC as Device Type Specifc will be relisted + * as a comment in all specifications lists that support that command with the + * appropriate Mandatory or Optional tag for that specification. + * + * The section number and the requirement type of the command are based on the + * version of the specification listed in the header comment for the Peripheral + * Device Type. This data is provided for informational purposes only. The + * specification document and version that the device adheres to as indicated + * by the data returned in response to the INQUIRY command should be used as + * the authorative source for supported and required behavior of the device. + * + * The SPC set is listed before all other Peripheral Device Type commands as + * this is the base document from which all of the other documents are derived. + * + * The Peripheral Device Types and associated command sets as defined by SPC-2, + * section 7.4.1 are as follows: + * Peripheral Device Type Associated Command Specification + * ------------------------------------ ----------------------------------- + * 0x00 Direct Access Device SBC - SCSI-3 Block Commands + * 0x01 Sequential Access Device SSC - SCSI-3 Stream Commands + * 0x02 Printer Device SSC - SCSI-3 Stream Commands + * 0x03 Processor Device SPC - SCSI Primary Commands-2 + * 0x04 Write Once Device SBC - SCSI-3 Block Commands + * 0x05 CD-ROM Device MMC - SCSI Multimedia Commands-2 + * 0x06 Scanner Device SGC - SCSI-3 Graphics Commands + * 0x07 Optical Memory Device SBC - SCSI-3 Block Commands + * 0x08 Medium Changer Device SMC - SCSI-3 Medium Changer Cmds + * 0x09 Communications Device SSC - SCSI-3 Stream Commands + * 0x0A - 0x0B Graphic Arts Prepress Dev ASC IT8 + * 0x0C Storage Array Controller Device SCC-2 - SCSI Controller Commands-2 + * 0x0D Enclosure Services SES - SCSI-3 Enclosure Services + * 0x0E Simplified Direct Access Device RBC - SCSI Reduced Block Commands + * 0x0F Optical Card Reader/Writer Device OCRW - SCSI Specification for + * Optical Card Reader/Writer + * 0x10 Reserved No command specification + * 0x11 Object-Based Storage Device OSD - SCSI Object Based Storage + * Device Commands + * 0x12 - 0x14 Reserved No command specification + * 0x15 Multimedia Media Access Engine RMC - Reduced Multimedia Commands + * 0x16 - 0x1E Reserved No command specification + * 0x1F Unknown or No Device No command specification + */ + +#pragma mark - +#pragma mark Command Definitions by Name +/* All SCSI Commands listed in alphabetical order. These are the live + * definitions of the commands. All other command lists are informative. + */ +enum +{ + kSCSICmd_ACCESS_CONTROL_IN = 0x86, + kSCSICmd_ACCESS_CONTROL_OUT = 0x87, + kSCSICmd_BLANK = 0xA1, + kSCSICmd_CHANGE_DEFINITION = 0x40, + kSCSICmd_CLOSE_TRACK_SESSION = 0x5B, + kSCSICmd_COMPARE = 0x39, + kSCSICmd_COPY = 0x18, + kSCSICmd_COPY_AND_VERIFY = 0x3A, + kSCSICmd_ERASE_10 = 0x2C, + kSCSICmd_ERASE_12 = 0xAC, + kSCSICmd_EXTENDED_COPY = 0x83, + kSCSICmd_FORMAT_UNIT = 0x04, + kSCSICmd_GET_CONFIGURATION = 0x46, + kSCSICmd_GET_EVENT_STATUS_NOTIFICATION = 0x4A, + kSCSICmd_GET_PERFORMANCE = 0xAC, + kSCSICmd_INQUIRY = 0x12, + kSCSICmd_LOAD_UNLOAD_MEDIUM = 0xA6, + kSCSICmd_LOCK_UNLOCK_CACHE = 0x36, + kSCSICmd_LOCK_UNLOCK_CACHE_16 = 0x92, + kSCSICmd_LOG_SELECT = 0x4C, + kSCSICmd_LOG_SENSE = 0x4D, + kSCSICmd_MAINTENANCE_IN = 0xA3, + kSCSICmd_MAINTENANCE_OUT = 0xA4, + kSCSICmd_MECHANISM_STATUS = 0xBD, + kSCSICmd_MEDIUM_SCAN = 0x38, + kSCSICmd_MODE_SELECT_6 = 0x15, + kSCSICmd_MODE_SELECT_10 = 0x55, + kSCSICmd_MODE_SENSE_6 = 0x1A, + kSCSICmd_MODE_SENSE_10 = 0x5A, + kSCSICmd_MOVE_MEDIUM_ATTACHED = 0xA7, + kSCSICmd_PAUSE_RESUME = 0x4B, + kSCSICmd_PERSISTENT_RESERVE_IN = 0x5E, + kSCSICmd_PERSISTENT_RESERVE_OUT = 0x5F, + kSCSICmd_PLAY_AUDIO_10 = 0x45, + kSCSICmd_PLAY_AUDIO_12 = 0xA5, + kSCSICmd_PLAY_AUDIO_MSF = 0x47, + kSCSICmd_PLAY_AUDIO_TRACK_INDEX = 0x48, + kSCSICmd_PLAY_CD = 0xBC, + kSCSICmd_PLAY_RELATIVE_10 = 0x49, + kSCSICmd_PLAY_RELATIVE_12 = 0xA9, + kSCSICmd_PREFETCH = 0x34, + kSCSICmd_PREFETCH_16 = 0x90, + kSCSICmd_PREVENT_ALLOW_MEDIUM_REMOVAL = 0x1E, + kSCSICmd_READ_6 = 0x08, + kSCSICmd_READ_10 = 0x28, + kSCSICmd_READ_12 = 0xA8, + kSCSICmd_READ_16 = 0x88, + kSCSICmd_READ_ATTRIBUTE = 0x8C, + kSCSICmd_READ_BUFFER = 0x3C, + kSCSICmd_READ_BUFFER_CAPACITY = 0x5C, + kSCSICmd_READ_CAPACITY = 0x25, + kSCSICmd_READ_CD = 0xBE, + kSCSICmd_READ_CD_MSF = 0xB9, + kSCSICmd_READ_DEFECT_DATA_10 = 0x37, + kSCSICmd_READ_DEFECT_DATA_12 = 0xB7, + kSCSICmd_READ_DISC_INFORMATION = 0x51, + kSCSICmd_READ_DVD_STRUCTURE = 0xAD, + kSCSICmd_READ_DISC_STRUCTURE = 0xAD, + kSCSICmd_READ_ELEMENT_STATUS_ATTACHED = 0xB4, + kSCSICmd_READ_FORMAT_CAPACITIES = 0x23, + kSCSICmd_READ_GENERATION = 0x29, + kSCSICmd_READ_HEADER = 0x44, + kSCSICmd_READ_LONG = 0x3E, + kSCSICmd_READ_MASTER_CUE = 0x59, + kSCSICmd_READ_SUB_CHANNEL = 0x42, + kSCSICmd_READ_TOC_PMA_ATIP = 0x43, + kSCSICmd_READ_TRACK_INFORMATION = 0x52, + kSCSICmd_READ_UPDATED_BLOCK_10 = 0x2D, + kSCSICmd_REASSIGN_BLOCKS = 0x07, + kSCSICmd_REBUILD = 0x81, + kSCSICmd_RECEIVE = 0x08, + kSCSICmd_RECEIVE_COPY_RESULTS = 0x84, + kSCSICmd_RECEIVE_DIAGNOSTICS_RESULTS = 0x1C, + kSCSICmd_REDUNDANCY_GROUP_IN = 0xBA, + kSCSICmd_REDUNDANCY_GROUP_OUT = 0xBB, + kSCSICmd_REGENERATE = 0x82, + kSCSICmd_RELEASE_6 = 0x17, + kSCSICmd_RELEASE_10 = 0x57, + kSCSICmd_REPAIR_TRACK = 0x58, + kSCSICmd_REPORT_DEVICE_IDENTIFIER = 0xA3, + kSCSICmd_REPORT_KEY = 0xA4, + kSCSICmd_REPORT_LUNS = 0xA0, + kSCSICmd_REQUEST_SENSE = 0x03, + kSCSICmd_RESERVE_6 = 0x16, + kSCSICmd_RESERVE_10 = 0x56, + kSCSICmd_RESERVE_TRACK = 0x53, + kSCSICmd_REZERO_UNIT = 0x01, + kSCSICmd_SCAN_MMC = 0xBA, + kSCSICmd_SEARCH_DATA_EQUAL_10 = 0x31, + kSCSICmd_SEARCH_DATA_EQUAL_12 = 0xB1, + kSCSICmd_SEARCH_DATA_HIGH_10 = 0x30, + kSCSICmd_SEARCH_DATA_HIGH_12 = 0xB0, + kSCSICmd_SEARCH_DATA_LOW_10 = 0x32, + kSCSICmd_SEARCH_DATA_LOW_12 = 0xB2, + kSCSICmd_SEEK_6 = 0x0B, + kSCSICmd_SEEK_10 = 0x2B, + kSCSICmd_SEND = 0x0A, + kSCSICmd_SEND_CUE_SHEET = 0x5D, + kSCSICmd_SEND_DIAGNOSTICS = 0x1D, + kSCSICmd_SEND_DVD_STRUCTURE = 0xBF, + kSCSICmd_SEND_EVENT = 0xA2, + kSCSICmd_SEND_KEY = 0xA3, + kSCSICmd_SEND_OPC_INFORMATION = 0x54, + kSCSICmd_SERVICE_ACTION_IN = 0x9E, + kSCSICmd_SERVICE_ACTION_OUT = 0x9F, + kSCSICmd_SET_CD_SPEED = 0xBB, + kSCSICmd_SET_DEVICE_IDENTIFIER = 0xA4, + kSCSICmd_SET_LIMITS_10 = 0x33, + kSCSICmd_SET_LIMITS_12 = 0xB3, + kSCSICmd_SET_READ_AHEAD = 0xA7, + kSCSICmd_SET_STREAMING = 0xB6, + kSCSICmd_SPARE_IN = 0xBC, + kSCSICmd_SPARE_OUT = 0xBD, + kSCSICmd_START_STOP_UNIT = 0x1B, + kSCSICmd_STOP_PLAY_SCAN = 0x4E, + kSCSICmd_SYNCHRONIZE_CACHE = 0x35, + kSCSICmd_SYNCHRONIZE_CACHE_16 = 0x91, + kSCSICmd_TEST_UNIT_READY = 0x00, + kSCSICmd_UPDATE_BLOCK = 0x3D, + kSCSICmd_UNMAP = 0x42, + kSCSICmd_VERIFY_10 = 0x2F, + kSCSICmd_VERIFY_12 = 0xAF, + kSCSICmd_VERIFY_16 = 0x8F, + kSCSICmd_VOLUME_SET_IN = 0xBE, + kSCSICmd_VOLUME_SET_OUT = 0xBF, + kSCSICmd_WRITE_6 = 0x0A, + kSCSICmd_WRITE_10 = 0x2A, + kSCSICmd_WRITE_12 = 0xAA, + kSCSICmd_WRITE_16 = 0x8A, + kSCSICmd_WRITE_AND_VERIFY_10 = 0x2E, + kSCSICmd_WRITE_AND_VERIFY_12 = 0xAE, + kSCSICmd_WRITE_AND_VERIFY_16 = 0x8E, + kSCSICmd_WRITE_ATTRIBUTE = 0x8D, + kSCSICmd_WRITE_BUFFER = 0x3B, + kSCSICmd_WRITE_LONG = 0x3F, + kSCSICmd_WRITE_SAME = 0x41, + kSCSICmd_WRITE_SAME_16 = 0x93, + kSCSICmd_XDREAD = 0x52, + kSCSICmd_XDWRITE = 0x50, + kSCSICmd_XDWRITE_EXTENDED = 0x80, + kSCSICmd_XDWRITEREAD_10 = 0x53, + kSCSICmd_XPWRITE = 0x51, + + kSCSICmdVariableLengthCDB = 0x7F +}; + +/* Service Action Definitions for the Variable Length CDB (7Fh) command */ +enum +{ + kSCSIServiceAction_READ_32 = 0x0009, + kSCSIServiceAction_VERIFY_32 = 0x000A, + kSCSIServiceAction_WRITE_32 = 0x000B, + kSCSIServiceAction_WRITE_AND_VERIFY_32 = 0x000C, + kSCSIServiceAction_WRITE_SAME_32 = 0x000D, + kSCSIServiceAction_XDREAD_32 = 0x0003, + kSCSIServiceAction_XDWRITE_32 = 0x0004, + kSCSIServiceAction_XDWRITEREAD_32 = 0x0007, + kSCSIServiceAction_XPWRITE_32 = 0x0006 +}; + +/* Service Action Definitions for the MAINTENANCE IN (A3h) command */ +enum +{ + kSCSIServiceAction_REPORT_ALIASES = 0x0B, + kSCSIServiceAction_REPORT_DEVICE_IDENTIFIER = 0x05, + kSCSIServiceAction_REPORT_PRIORITY = 0x0E, + kSCSIServiceAction_REPORT_PROVISIONING_INITIALIZATION_PATTERN = 0x1D, + kSCSIServiceAction_REPORT_SUPPORTED_OPERATION_CODES = 0x0C, + kSCSIServiceAction_REPORT_SUPPORTED_TASK_MANAGEMENT_FUNCTIONS = 0x0D, + kSCSIServiceAction_REPORT_TARGET_PORT_GROUPS = 0x0A +}; + +/* Service Action Definitions for the MAINTENANCE OUT (A4h) command */ +enum +{ + kSCSIServiceAction_CHANGE_ALIASES = 0x0B, + kSCSIServiceAction_SET_DEVICE_IDENTIFIER = 0x06, + kSCSIServiceAction_SET_PRIORITY = 0x0E, + kSCSIServiceAction_SET_TARGET_PORT_GROUPS = 0x0A +}; + +/* Service Action Definitions for the SERVICE ACTION IN (9Eh) command */ +enum +{ + kSCSIServiceAction_GET_LBA_STATUS = 0x12, + kSCSIServiceAction_READ_CAPACITY_16 = 0x10, + kSCSIServiceAction_READ_LONG_16 = 0x11, +}; + +/* Service Action Definitions for the SERVICE ACTION OUT (9Fh) command */ +enum +{ + kSCSIServiceAction_WRITE_LONG_16 = 0x11 +}; + +#pragma mark - +#pragma mark Command Definitions by Number +#if 0 +enum +{ +}; +#endif + + +#pragma mark - +#pragma mark All Types SPC Commands +/* Commands defined by the T10:1236-D SCSI Primary Commands-2 (SPC-2) + * command specification. The definitions and section numbers are based on + * section 7 of the revision 18, 21 May 2000 version of the specification. + * + * These commands are defined for all devices. + */ +enum +{ + kSPCCmd_CHANGE_DEFINITION = 0x40, /* Obsolete */ + kSPCCmd_COMPARE = 0x39, /* Sec. 7.2: Optional */ + kSPCCmd_COPY = 0x18, /* Sec. 7.3: Optional */ + kSPCCmd_COPY_AND_VERIFY = 0x3A, /* Sec. 7.4: Optional */ + kSPCCmd_EXTENDED_COPY = 0x83, /* Sec. 7.5: Optional */ + kSPCCmd_INQUIRY = 0x12, /* Sec. 7.6: Mandatory */ + kSPCCmd_LOG_SELECT = 0x4C, /* Sec. 7.7: Optional */ + kSPCCmd_LOG_SENSE = 0x4D, /* Sec. 7.8: Optional */ + kSPCCmd_MODE_SELECT_6 = 0x15, /* Sec. 7.9: Device Type + * Specific */ + kSPCCmd_MODE_SELECT_10 = 0x55, /* Sec. 7.10: Device Type + * Specific */ + kSPCCmd_MODE_SENSE_6 = 0x1A, /* Sec. 7.11: Device Type + * Specific */ + kSPCCmd_MODE_SENSE_10 = 0x5A, /* Sec. 7.12: Device Type + * Specific */ + kSPCCmd_MOVE_MEDIUM_ATTACHED = 0xA7, /* Defined in SMC */ + kSPCCmd_PERSISTENT_RESERVE_IN = 0x5E, /* Sec. 7.13: Device Type + * Specific */ + kSPCCmd_PERSISTENT_RESERVE_OUT = 0x5F, /* Sec. 7.14: Device Type + * Specific */ + kSPCCmd_PREVENT_ALLOW_MEDIUM_REMOVAL = 0x1E, /* Sec. 7.15: Device Type + * Specific */ + kSPCCmd_READ_BUFFER = 0x3C, /* Sec. 7.16: Optional */ + kSPCCmd_READ_ELEMENT_STATUS_ATTACHED = 0xB4, /* Defined in SMC */ + kSPCCmd_RECEIVE_COPY_RESULTS = 0x84, /* Sec. 7.17: Optional */ + kSPCCmd_RECEIVE_DIAGNOSTICS_RESULTS = 0x1C, /* Sec. 7.18: Optional */ + kSPCCmd_RELEASE_10 = 0x57, /* Sec. 7.19: Device Type + * Specific */ + kSPCCmd_RELEASE_6 = 0x17, /* Sec. 7.20: Device Type + * Specific */ + kSPCCmd_REPORT_DEVICE_IDENTIFIER = 0xA3, /* Sec. 7.21: Optional */ + kSPCCmd_REPORT_LUNS = 0xA0, /* Sec. 7.22: Mandatory for + * LUN Supporting devices*/ + kSPCCmd_REQUEST_SENSE = 0x03, /* Sec. 7.23: Device Type + * Specific */ + kSPCCmd_RESERVE_10 = 0x56, /* Sec. 7.24: Device Type + * Specific */ + kSPCCmd_RESERVE_6 = 0x16, /* Sec. 7.25: Device Type + * Specific */ + kSPCCmd_SEND_DIAGNOSTICS = 0x1D, /* Sec. 7.26: Optional */ + kSPCCmd_SET_DEVICE_IDENTIFIER = 0xA4, /* Sec. 7.27: Optional */ + kSPCCmd_TEST_UNIT_READY = 0x00, /* Sec. 7.28: Mandatory */ + kSPCCmd_WRITE_BUFFER = 0x3B /* Sec. 7.29: Optional */ +}; + +#pragma mark - +#pragma mark 0x00 SBC Direct Access Commands +/* Commands defined by the T10:990-D SCSI-3 Block Commands (SBC) command + * specification. The definitions and section numbers are based on section 6.1 + * of the revision 8c, 13 November 1997 version of the specification. + */ +enum +{ + kSBCCmd_CHANGE_DEFINITION = 0x40, /* Obsolete */ + kSBCCmd_COMPARE = 0x39, /* SPC: Optional */ + kSBCCmd_COPY = 0x18, /* SPC: Optional */ + kSBCCmd_COPY_AND_VERIFY = 0x3A, /* SPC: Optional*/ + kSBCCmd_FORMAT_UNIT = 0x04, /* Sec. 6.1.1: Mandatory */ + kSBCCmd_INQUIRY = 0x12, /* SPC: Mandatory */ + kSBCCmd_LOCK_UNLOCK_CACHE = 0x36, /* Sec. 6.1.2: Optional */ + kSBCCmd_LOG_SELECT = 0x4C, /* SPC: Optional */ + kSBCCmd_LOG_SENSE = 0x4D, /* SPC: Optional */ + kSBCCmd_MODE_SELECT_6 = 0x15, /* SPC: Optional */ + kSBCCmd_MODE_SELECT_10 = 0x55, /* SPC: Optional */ + kSBCCmd_MODE_SENSE_6 = 0x1A, /* SPC: Optional */ + kSBCCmd_MODE_SENSE_10 = 0x5A, /* SPC: Optional */ + kSBCCmd_MOVE_MEDIUM_ATTACHED = 0xA7, /* SMC: Optional */ + kSBCCmd_PERSISTENT_RESERVE_IN = 0x5E, /* SPC: Optional */ + kSBCCmd_PERSISTENT_RESERVE_OUT = 0x5F, /* SPC: Optional */ + kSBCCmd_PREFETCH = 0x34, /* Sec. 6.1.3: Optional */ + kSBCCmd_PREVENT_ALLOW_MEDIUM_REMOVAL = 0x1E, /* SPC: Optional */ + kSBCCmd_READ_6 = 0x08, /* Sec. 6.1.4: Mandatory */ + kSBCCmd_READ_10 = 0x28, /* Sec. 6.1.5: Mandatory */ + kSBCCmd_READ_12 = 0xA8, /* Sec. 6.2.4: Optional */ + kSBCCmd_READ_BUFFER = 0x3C, /* SPC: Optional */ + kSBCCmd_READ_CAPACITY = 0x25, /* Sec. 6.1.6: Mandatory */ + kSBCCmd_READ_DEFECT_DATA_10 = 0x37, /* Sec. 6.1.7: Optional */ + kSBCCmd_READ_DEFECT_DATA_12 = 0xB7, /* Sec. 6.2.5: Optional */ + kSBCCmd_READ_ELEMENT_STATUS_ATTACHED = 0xB4, /* SMC: Optional */ + kSBCCmd_READ_GENERATION = 0x29, /* Sec. 6.2.6: Optional */ + kSBCCmd_READ_LONG = 0x3E, /* Sec. 6.1.8: Optional */ + kSBCCmd_READ_UPDATED_BLOCK_10 = 0x2D, /* Sec. 6.2.7: Optional */ + kSBCCmd_REASSIGN_BLOCKS = 0x07, /* Sec. 6.1.9: Optional */ + kSBCCmd_REBUILD = 0x81, /* Sec. 6.1.10: Optional */ + kSBCCmd_RECEIVE_DIAGNOSTICS_RESULTS = 0x1C, /* SPC: Optional */ + kSBCCmd_REGENERATE = 0x82, /* Sec. 6.1.11: Optional */ + kSBCCmd_RELEASE_6 = 0x17, /* SPC: Optional */ + kSBCCmd_RELEASE_10 = 0x57, /* SPC: Mandatory */ + kSBCCmd_REPORT_LUNS = 0xA0, /* SPC: Optional */ + kSBCCmd_REQUEST_SENSE = 0x03, /* SPC: Mandatory */ + kSBCCmd_RESERVE_6 = 0x16, /* SPC: Optional */ + kSBCCmd_RESERVE_10 = 0x56, /* SPC: Mandatory */ + kSBCCmd_REZERO_UNIT = 0x01, /* Obsolete */ + kSBCCmd_SEARCH_DATA_EQUAL_10 = 0x31, /* Obsolete */ + kSBCCmd_SEARCH_DATA_HIGH_10 = 0x30, /* Obsolete */ + kSBCCmd_SEARCH_DATA_LOW_10 = 0x32, /* Obsolete */ + kSBCCmd_SEEK_6 = 0x0B, /* Obsolete */ + kSBCCmd_SEEK_10 = 0x2B, /* Sec. 6.1.12: Optional */ + kSBCCmd_SEND_DIAGNOSTICS = 0x1D, /* SPC: Mandatory */ + kSBCCmd_SET_LIMITS_10 = 0x33, /* Sec. 6.1.13: Optional */ + kSBCCmd_SET_LIMITS_12 = 0xB3, /* Sec. 6.2.8: Optional */ + kSBCCmd_START_STOP_UNIT = 0x1B, /* Sec. 6.1.14: Optional */ + kSBCCmd_SYNCHRONIZE_CACHE = 0x35, /* Sec. 6.1.15: Optional */ + kSBCCmd_TEST_UNIT_READY = 0x00, /* SPC: Mandatory */ + kSBCCmd_UPDATE_BLOCK = 0x3D, /* Sec. 6.2.9: Optional */ + kSBCCmd_VERIFY_10 = 0x2F, /* Sec. 6.1.16: Optional */ + kSBCCmd_WRITE_6 = 0x0A, /* Sec. 6.1.17: Optional */ + kSBCCmd_WRITE_10 = 0x2A, /* Sec. 6.1.18: Optional */ + kSBCCmd_WRITE_12 = 0xAA, /* Sec. 6.2.13: Optional */ + kSBCCmd_WRITE_AND_VERIFY_10 = 0x2E, /* Sec. 6.1.19: Optional */ + kSBCCmd_WRITE_AND_VERIFY_12 = 0xAE, /* Sec. 6.2.15: Optional */ + kSBCCmd_WRITE_BUFFER = 0x3B, /* SPC: Optional */ + kSBCCmd_WRITE_LONG = 0x3F, /* Sec. 6.1.20: Optional */ + kSBCCmd_WRITE_SAME = 0x41, /* Sec. 6.1.21: Optional */ + kSBCCmd_XDREAD = 0x52, /* Sec. 6.1.22: Optional */ + kSBCCmd_XDWRITE = 0x50, /* Sec. 6.1.23: Optional */ + kSBCCmd_XDWRITE_EXTENDED = 0x80, /* Sec. 6.1.24: Optional */ + kSBCCmd_XPWRITE = 0x51 /* Sec. 6.1.25: Optional */ +}; + +#pragma mark - +#pragma mark 0x01 SSC Sequential Access Commands +/* Commands defined by the T10:997-D SCSI-3 Stream Commands (SSC) command + * specification. The definitions and section numbers are based on section 5 + * of the revision 22, January 1, 2000 version of the specification. + */ +enum +{ + kSSCSeqCmd_CHANGE_DEFINITION = 0x40, /* Obsolete */ + kSSCSeqCmd_COMPARE = 0x39, /* SPC: Optional */ + kSSCSeqCmd_COPY = 0x18, /* SPC: Optional */ + kSSCSeqCmd_COPY_AND_VERIFY = 0x3A, /* SPC: Optional */ + kSSCSeqCmd_ERASE = 0x19, /* Sec. 5.3.1: Mandatory */ + kSSCSeqCmd_FORMAT_MEDIUM = 0x04, /* Sec. 5.3.2: Optional */ + kSSCSeqCmd_INQUIRY = 0x12, /* SPC: Mandatory */ + kSSCSeqCmd_LOAD_UNLOAD = 0x1B, /* Sec. 5.3.3: Optional */ + kSSCSeqCmd_LOCATE = 0x2B, /* Sec. 5.3.4: Optional */ + kSSCSeqCmd_LOG_SELECT = 0x4C, /* SPC: Optional */ + kSSCSeqCmd_LOG_SENSE = 0x4D, /* SPC: Optional */ + kSSCSeqCmd_MODE_SELECT_6 = 0x15, /* SPC: Mandatory */ + kSSCSeqCmd_MODE_SELECT_10 = 0x55, /* SPC: Optional */ + kSSCSeqCmd_MODE_SENSE_6 = 0x1A, /* SPC: Mandatory */ + kSSCSeqCmd_MODE_SENSE_10 = 0x5A, /* SPC: Optional */ + kSSCSeqCmd_MOVE_MEDIUM = 0xA5, /* SMC: Optional */ + kSSCSeqCmd_MOVE_MEDIUM_ATTACHED = 0xA7, /* SMC: Optional */ + kSSCSeqCmd_PERSISTENT_RESERVE_IN = 0x5E, /* SPC: Optional */ + kSSCSeqCmd_PERSISTENT_RESERVE_OUT = 0x5F, /* SPC: Optional */ + kSSCSeqCmd_PREVENT_ALLOW_MEDIUM_REMOVAL = 0x1E, /* SPC: Optional */ + kSSCSeqCmd_READ_6 = 0x08, /* Sec. 5.3.5: Mandatory */ + kSSCSeqCmd_READ_BLOCK_LIMITS = 0x05, /* Sec. 5.3.6: Mandatory */ + kSSCSeqCmd_READ_BUFFER = 0x3C, /* SPC: Optional */ + kSSCSeqCmd_READ_ELEMENT_STATUS = 0xB8, /* SMC: Optional */ + kSSCSeqCmd_READ_ELEMENT_STATUS_ATTACHED = 0xB4, /* SMC: Optional */ + kSSCSeqCmd_READ_POSITION = 0x34, /* Sec. 5.3.7: Mandatory */ + kSSCSeqCmd_READ_REVERSE = 0x0F, /* Sec. 5.3.8: Optional */ + kSSCSeqCmd_RECEIVE_DIAGNOSTICS_RESULTS = 0x1C, /* SPC: Optional */ + kSSCSeqCmd_RECOVER_BUFFERED_DATA = 0x14, /* Sec. 5.3.9: Optional */ + kSSCSeqCmd_RELEASE_6 = 0x17, /* SPC: Mandatory */ + kSSCSeqCmd_RELEASE_10 = 0x57, /* SPC: Mandatory */ + kSSCSeqCmd_REPORT_DENSITY_SUPPORT = 0x44, /* Sec. 5.3.10: Mandatory*/ + kSSCSeqCmd_REPORT_LUNS = 0xA0, /* SPC: Mandatory */ + kSSCSeqCmd_REQUEST_SENSE = 0x03, /* SPC: Mandatory */ + kSSCSeqCmd_RESERVE_6 = 0x16, /* SPC: Mandatory */ + kSSCSeqCmd_RESERVE_10 = 0x56, /* SPC: Mandatory */ + kSSCSeqCmd_REWIND = 0x01, /* Sec. 5.3.11: Mandatory*/ + kSSCSeqCmd_SEND_DIAGNOSTICS = 0x1D, /* SPC: Mandatory */ + kSSCSeqCmd_SPACE = 0x11, /* Sec. 5.3.12: Mandatory*/ + kSSCSeqCmd_TEST_UNIT_READY = 0x00, /* SPC: Mandatory */ + kSSCSeqCmd_VERIFY_6 = 0x13, /* Sec. 5.3.13: Optional */ + kSSCSeqCmd_WRITE_6 = 0x0A, /* Sec. 5.3.14: Mandatory*/ + kSSCSeqCmd_WRITE_BUFFER = 0x3B, /* SPC: Optional */ + kSSCSeqCmd_WRITE_FILEMARKS = 0x10 /* Sec. 5.3.15: Mandatory*/ +}; + +#pragma mark - +#pragma mark 0x02 SSC Printer Commands +/* Commands defined by the T10:997-D SCSI-3 Stream Commands (SSC) command + * specification. The definitions and section numbers are based on section 6 + * of the revision 22, January 1, 2000 version of the specification. + */ +enum +{ + kSSCPrinterCmd_CHANGE_DEFINITION = 0x40, /* Obsolete */ + kSSCPrinterCmd_COMPARE = 0x39, /* SPC: Optional */ + kSSCPrinterCmd_COPY = 0x18, /* SPC: Optional */ + kSSCPrinterCmd_COPY_AND_VERIFY = 0x3A, /* SPC: Optional */ + kSSCPrinterCmd_FORMAT = 0x04, /* Sec. 6.2.1: Optional */ + kSSCPrinterCmd_INQUIRY = 0x12, /* SPC: Mandatory */ + kSSCPrinterCmd_LOG_SELECT = 0x4C, /* SPC: Optional */ + kSSCPrinterCmd_LOG_SENSE = 0x4D, /* SPC: Optional */ + kSSCPrinterCmd_MODE_SELECT_6 = 0x15, /* SPC: Mandatory */ + kSSCPrinterCmd_MODE_SELECT_10 = 0x55, /* SPC: Optional */ + kSSCPrinterCmd_MODE_SENSE_6 = 0x1A, /* SPC: Mandatory */ + kSSCPrinterCmd_MODE_SENSE_10 = 0x5A, /* SPC: Optional */ + kSSCPrinterCmd_PERSISTENT_RESERVE_IN = 0x5E, /* SPC: Optional */ + kSSCPrinterCmd_PERSISTENT_RESERVE_OUT = 0x5F, /* SPC: Optional */ + kSSCPrinterCmd_PRINT = 0x0A, /* Sec. 6.2.2: Mandatory */ + kSSCPrinterCmd_READ_BUFFER = 0x3C, /* SPC: Optional */ + kSSCPrinterCmd_RECEIVE_DIAGNOSTICS_RESULTS = 0x1C, /* SPC: Optional */ + kSSCPrinterCmd_RECOVER_BUFFERED_DATA = 0x14, /* Sec. 6.2.3: Optional */ + kSSCPrinterCmd_RELEASE_6 = 0x17, /* SPC: Mandatory */ + kSSCPrinterCmd_RELEASE_10 = 0x57, /* SPC: Mandatory */ + kSSCPrinterCmd_REPORT_LUNS = 0xA0, /* SPC: Mandatory */ + kSSCPrinterCmd_REQUEST_SENSE = 0x03, /* SPC: Mandatory */ + kSSCPrinterCmd_RESERVE_6 = 0x16, /* SPC: Mandatory */ + kSSCPrinterCmd_RESERVE_10 = 0x56, /* SPC: Mandatory */ + kSSCPrinterCmd_SEND_DIAGNOSTICS = 0x1D, /* SPC: Mandatory */ + kSSCPrinterCmd_SLEW_AND_PRINT = 0x0B, /* Sec. 6.2.4: Optional */ + kSSCPrinterCmd_STOP_PRINT = 0x1B, /* Sec. 6.2.5: Optional */ + kSSCPrinterCmd_SYNCHRONIZE_BUFFER = 0x10, /* Sec. 6.2.6: Optional */ + kSSCPrinterCmd_TEST_UNIT_READY = 0x00, /* SPC: Mandatory */ + kSSCPrinterCmd_WRITE_BUFFER = 0x3B /* SPC: Optional */ +}; + +#pragma mark - +#pragma mark 0x03 SPC Processor Commands +/* Commands defined by the T10:1236-D SCSI Primary Commands-2 (SPC-2) + * command specification. The definitions and section numbers are based on + * section 9 of the revision 18, 21 May 2000 version of the specification. + */ +enum +{ + kSPCProcCmd_CHANGE_DEFINITION = 0x40, /* Obsolete */ + kSPCProcCmd_COMPARE = 0x39, /* Sec. 7.2: Optional */ + kSPCProcCmd_COPY = 0x18, /* Sec. 7.3: Optional */ + kSPCProcCmd_COPY_AND_VERIFY = 0x3A, /* Sec. 7.4: Optional */ + kSPCProcCmd_EXTENDED_COPY = 0x83, /* Sec. 7.5: Optional */ + kSPCProcCmd_INQUIRY = 0x12, /* Sec. 7.6: Mandatory */ + kSPCProcCmd_LOG_SELECT = 0x4C, /* Sec. 7.7: Optional */ + kSPCProcCmd_LOG_SENSE = 0x4D, /* Sec. 7.8: Optional */ + kSPCProcCmd_PERSISTENT_RESERVE_IN = 0x5E, /* Sec. 7.13: Optional */ + kSPCProcCmd_PERSISTENT_RESERVE_OUT = 0x5F, /* Sec. 7.14: Optional */ + kSPCProcCmd_READ_BUFFER = 0x3C, /* Sec. 7.16: Optional */ + kSPCProcCmd_RECEIVE = 0x08, /* Sec. 9.2: Optional */ + kSPCProcCmd_RECEIVE_COPY_RESULTS = 0x84, /* Sec. 7.17: Optional */ + kSPCProcCmd_RECEIVE_DIAGNOSTICS_RESULTS = 0x1C, /* Sec. 7.18: Optional */ + kSPCProcCmd_RELEASE_10 = 0x57, /* Sec. 7.19: Optional */ + kSPCProcCmd_RELEASE_6 = 0x17, /* Sec. 7.20: Optional */ + kSPCProcCmd_REPORT_LUNS = 0xA0, /* Sec. 7.22: Optional */ + kSPCProcCmd_REQUEST_SENSE = 0x03, /* Sec. 7.23: Mandatory */ + kSPCProcCmd_RESERVE_10 = 0x56, /* Sec. 7.24: Optional */ + kSPCProcCmd_RESERVE_6 = 0x16, /* Sec. 7.25: Optional */ + kSPCProcCmd_SEND = 0x0A, /* Sec. 9.3: Optional */ + kSPCProcCmd_SEND_DIAGNOSTICS = 0x1D, /* Sec. 7.26: Mandatory */ + kSPCProcCmd_TEST_UNIT_READY = 0x00, /* Sec. 7.27: Mandatory */ + kSPCProcCmd_WRITE_BUFFER = 0x3B /* Sec. 7.29: Optional */ +}; + +#pragma mark - +#pragma mark 0x04 SBC Write Once Commands +/* Commands defined by the T10:990-D SCSI-3 Block Commands (SBC) command + * specification. The definitions and section numbers are based on section 6.3 + * of the revision 8c, 13 November 1997 version of the specification. + */ +enum +{ + kSBCWOCmd_CHANGE_DEFINITION = 0x40, /* SPC: Optional */ + kSBCWOCmd_COMPARE = 0x39, /* SPC: Optional */ + kSBCWOCmd_COPY = 0x18, /* SPC: Optional */ + kSBCWOCmd_COPY_AND_VERIFY = 0x3A, /* SPC: Optional*/ + kSBCWOCmd_INQUIRY = 0x12, /* SPC: Mandatory */ + kSBCWOCmd_LOCK_UNLOCK_CACHE = 0x36, /* Sec. 6.1.2: Optional */ + kSBCWOCmd_LOG_SELECT = 0x4C, /* SPC: Optional */ + kSBCWOCmd_LOG_SENSE = 0x4D, /* SPC: Optional */ + kSBCWOCmd_MEDIUM_SCAN = 0x38, /* Sec. 6.2.3: Optional */ + kSBCWOCmd_MODE_SELECT_6 = 0x15, /* SPC: Optional */ + kSBCWOCmd_MODE_SELECT_10 = 0x55, /* SPC: Optional */ + kSBCWOCmd_MODE_SENSE_6 = 0x1A, /* SPC: Optional */ + kSBCWOCmd_MODE_SENSE_10 = 0x5A, /* SPC: Optional */ + kSBCWOCmd_MOVE_MEDIUM = 0xA5, /* SMC: Optional */ + kSBCWOCmd_PERSISTENT_RESERVE_IN = 0x5E, /* SPC: Optional */ + kSBCWOCmd_PERSISTENT_RESERVE_OUT = 0x5F, /* SPC: Optional */ + kSBCWOCmd_PREFETCH = 0x34, /* Sec. 6.1.3: Optional */ + kSBCWOCmd_PREVENT_ALLOW_MEDIUM_REMOVAL = 0x1E, /* SPC: Optional */ + kSBCWOCmd_READ_6 = 0x08, /* Sec. 6.1.4: Optional */ + kSBCWOCmd_READ_10 = 0x28, /* Sec. 6.1.5: Mandatory */ + kSBCWOCmd_READ_12 = 0xA8, /* Sec. 6.2.4: Optional */ + kSBCWOCmd_READ_BUFFER = 0x3C, /* SPC: Optional */ + kSBCWOCmd_READ_CAPACITY = 0x25, /* Sec. 6.1.6: Mandatory */ + kSBCWOCmd_READ_ELEMENT_STATUS = 0xB8, /* SMC: Optional */ + kSBCWOCmd_READ_LONG = 0x3E, /* Sec. 6.1.8: Optional */ + kSBCWOCmd_REASSIGN_BLOCKS = 0x07, /* Sec. 6.1.9: Optional */ + kSBCWOCmd_RECEIVE_DIAGNOSTICS_RESULTS = 0x1C, /* SPC: Optional */ + kSBCWOCmd_RELEASE_6 = 0x17, /* SPC: Optional */ + kSBCWOCmd_RELEASE_10 = 0x57, /* SPC: Mandatory */ + kSBCWOCmd_REQUEST_SENSE = 0x03, /* SPC: Mandatory */ + kSBCWOCmd_RESERVE_6 = 0x16, /* SPC: Optional */ + kSBCWOCmd_RESERVE_10 = 0x56, /* SPC: Mandatory */ + kSBCWOCmd_REZERO_UNIT = 0x01, /* Obsolete */ + kSBCWOCmd_SEARCH_DATA_EQUAL_10 = 0x31, /* Obsolete */ + kSBCWOCmd_SEARCH_DATA_EQUAL_12 = 0xB1, /* Obsolete */ + kSBCWOCmd_SEARCH_DATA_HIGH_10 = 0x30, /* Obsolete */ + kSBCWOCmd_SEARCH_DATA_HIGH_12 = 0xB0, /* Obsolete */ + kSBCWOCmd_SEARCH_DATA_LOW_10 = 0x32, /* Obsolete */ + kSBCWOCmd_SEARCH_DATA_LOW_12 = 0xB2, /* Obsolete */ + kSBCWOCmd_SEEK_6 = 0x0B, /* Obsolete */ + kSBCWOCmd_SEEK_10 = 0x2B, /* Sec. 6.1.12: Optional */ + kSBCWOCmd_SEND_DIAGNOSTICS = 0x1D, /* SPC: Mandatory */ + kSBCWOCmd_SET_LIMITS_10 = 0x33, /* Sec. 6.1.13: Optional */ + kSBCWOCmd_SET_LIMITS_12 = 0xB3, /* Sec. 6.2.8: Optional */ + kSBCWOCmd_START_STOP_UNIT = 0x1B, /* Sec. 6.1.14: Optional */ + kSBCWOCmd_SYNCHRONIZE_CACHE = 0x35, /* Sec. 6.1.15: Optional */ + kSBCWOCmd_TEST_UNIT_READY = 0x00, /* SPC: Mandatory */ + kSBCWOCmd_VERIFY_10 = 0x2F, /* Sec. 6.2.10: Optional */ + kSBCWOCmd_VERIFY_12 = 0xAF, /* Sec. 6.2.11: Optional */ + kSBCWOCmd_WRITE_6 = 0x0A, /* Sec. 6.1.17: Optional */ + kSBCWOCmd_WRITE_10 = 0x2A, /* Sec. 6.2.10: Mandatory*/ + kSBCWOCmd_WRITE_12 = 0xAA, /* Sec. 6.2.13: Optional */ + kSBCWOCmd_WRITE_AND_VERIFY_10 = 0x2E, /* Sec. 6.2.14: Optional */ + kSBCWOCmd_WRITE_AND_VERIFY_12 = 0xAE, /* Sec. 6.2.15: Optional */ + kSBCWOCmd_WRITE_BUFFER = 0x3B, /* SPC: Optional */ + kSBCWOCmd_WRITE_LONG = 0x3F /* Sec. 6.1.20: Optional */ +}; + +#pragma mark - +#pragma mark 0x05 MMC CD-ROM Commands +/* Commands defined by the T10:1363-D SCSI Multimedia Commands-3 (MMC-3) + * specification. The definitions and section numbers are based on section 6.1 + * of the revision 01, March 03, 2000 version of the specification. + * + * NOTE: The comments following each command may not be accurate. These are + * not from the MMC-3 specification, but have been derived from the SCSI-2 and + * original MMC specifications. Unlike the other SCSI command specifications, + * MMC-2 and MMC-3 do not provide a command requirement type and therefore does + * not relist the SPC commands with these requirements as they apply to MMC + * devices. The MMC-2 and MMC-3 specifications also refer back to the SBC + * specification which seems invalid since MMC devices do not represent a + * Peripheral Device Type defined by SBC. It is assumed that the SBC + * references refer to the Peripheral Device Type 0x00 - Direct Access Commands + * definitions from that specification. + */ +enum +{ + kMMCCmd_BLANK = 0xA1, /* Sec. 6.1.1: */ + kMMCCmd_CHANGE_DEFINITION = 0x40, /* Obsolete */ + kMMCCmd_CLOSE_TRACK_SESSION = 0x5B, /* Sec. 6.1.2: */ + kMMCCmd_COMPARE = 0x39, /* SPC: Optional */ + kMMCCmd_COPY = 0x18, /* SPC: Optional */ + kMMCCmd_COPY_AND_VERIFY = 0x3A, /* SPC: Optional */ + kMMCCmd_ERASE = 0x2C, /* SBC: */ + kMMCCmd_FORMAT_UNIT = 0x04, /* Sec. 6.1.3: */ + kMMCCmd_GET_CONFIGURATION = 0x46, /* Sec. 6.1.4: */ + kMMCCmd_GET_EVENT_STATUS_NOTIFICATION = 0x4A, /* Sec. 6.1.5: */ + kMMCCmd_GET_PERFORMANCE = 0xAC, /* Sec. 6.1.6: */ + kMMCCmd_INQUIRY = 0x12, /* SPC: Mandatory */ + kMMCCmd_LOAD_UNLOAD_MEDIUM = 0xA6, /* Sec. 6.1.7: */ + kMMCCmd_LOG_SELECT = 0x4C, /* SPC: Optional */ + kMMCCmd_LOG_SENSE = 0x4D, /* SPC: Optional */ + kMMCCmd_MECHANISM_STATUS = 0xBD, /* Sec. 6.1.8: */ + kMMCCmd_MODE_SELECT_6 = 0x15, /* SPC: Mandatory */ + kMMCCmd_MODE_SELECT_10 = 0x55, /* SPC: Mandatory */ + kMMCCmd_MODE_SENSE_6 = 0x1A, /* SPC: Mandatory */ + kMMCCmd_MODE_SENSE_10 = 0x5A, /* SPC: Mandatory */ + kMMCCmd_PAUSE_RESUME = 0x4B, /* Sec. 6.1.9: */ + kMMCCmd_PLAY_AUDIO_10 = 0x45, /* Sec. 6.1.10: */ + kMMCCmd_PLAY_AUDIO_12 = 0xA5, /* Sec. 6.1.11: */ + kMMCCmd_PLAY_AUDIO_MSF = 0x47, /* Sec. 6.1.12: */ + kMMCCmd_PLAY_AUDIO_TRACK_INDEX = 0x48, /* Obsolete */ + kMMCCmd_PLAY_CD = 0xBC, /* Sec. 6.1.13: */ + kMMCCmd_PLAY_RELATIVE_10 = 0x49, /* Obsolete */ + kMMCCmd_PLAY_RELATIVE_12 = 0xA9, /* Obsolete */ + kMMCCmd_PREFETCH = 0x34, /* Optional */ + kMMCCmd_PREVENT_ALLOW_MEDIUM_REMOVAL = 0x1E, /* Optional */ + kMMCCmd_READ_6 = 0x08, /* Optional */ + kMMCCmd_READ_10 = 0x28, /* Mandatory */ + kMMCCmd_READ_12 = 0xA8, /* Optional */ + kMMCCmd_READ_BUFFER = 0x3C, /* Optional */ + kMMCCmd_READ_BUFFER_CAPACITY = 0x5C, /* Sec. 6.1.15: */ + kMMCCmd_READ_CD = 0xBE, /* Sec. 6.1.16: */ + kMMCCmd_READ_CD_MSF = 0xB9, /* Sec. 6.1.17: */ + kMMCCmd_READ_CAPACITY = 0x25, /* Sec. 6.1.18: */ + kMMCCmd_READ_DISC_INFORMATION = 0x51, /* Sec. 6.1.19: */ + kMMCCmd_READ_DVD_STRUCTURE = 0xAD, /* Sec. 6.1.20: */ + kMMCCmd_READ_DISC_STRUCTURE = 0xAD, /* Sec. 6.1.20: */ + kMMCCmd_READ_FORMAT_CAPACITIES = 0x23, /* Sec. 6.1.21: */ + kMMCCmd_READ_HEADER = 0x44, /* Sec. 6.1.22: */ + kMMCCmd_READ_LONG = 0x3E, /* Optional */ + kMMCCmd_READ_MASTER_CUE = 0x59, /* Sec. 6.1.23: */ + kMMCCmd_READ_SUB_CHANNEL = 0x42, /* Sec. 6.1.24: */ + kMMCCmd_READ_TOC_PMA_ATIP = 0x43, /* Sec. 6.1.25: */ + kMMCCmd_READ_TRACK_INFORMATION = 0x52, /* Sec. 6.1.27: */ + kMMCCmd_RECEIVE_DIAGNOSTICS_RESULTS = 0x1C, /* Optional */ + kMMCCmd_RELEASE_6 = 0x17, /* Mandatory */ + kMMCCmd_RELEASE_10 = 0x57, /* Optional */ + kMMCCmd_REPAIR_TRACK = 0x58, /* Sec. 6.1.28: */ + kMMCCmd_REPORT_KEY = 0xA4, /* Sec. 6.1.29: */ + kMMCCmd_REQUEST_SENSE = 0x03, /* Mandatory */ + kMMCCmd_RESERVE_6 = 0x16, /* Mandatory */ + kMMCCmd_RESERVE_10 = 0x56, /* Optional */ + kMMCCmd_RESERVE_TRACK = 0x53, /* Sec. 6.1.30: */ + kMMCCmd_SCAN_MMC = 0xBA, /* Sec. 6.1.31: */ + kMMCCmd_SEARCH_DATA_EQUAL_10 = 0x31, /* Obsolete */ + kMMCCmd_SEARCH_DATA_EQUAL_12 = 0xB1, /* Obsolete */ + kMMCCmd_SEARCH_DATA_HIGH_10 = 0x30, /* Obsolete */ + kMMCCmd_SEARCH_DATA_HIGH_12 = 0xB0, /* Obsolete */ + kMMCCmd_SEARCH_DATA_LOW_10 = 0x32, /* Obsolete */ + kMMCCmd_SEARCH_DATA_LOW_12 = 0xB2, /* Obsolete */ + kMMCCmd_SEEK_6 = 0x0B, /* Obsolete */ + kMMCCmd_SEEK_10 = 0x2B, /* SBC: */ + kMMCCmd_SEND_CUE_SHEET = 0x5D, /* Sec. 6.1.32: */ + kMMCCmd_SEND_DIAGNOSTICS = 0x1D, /* Mandatory */ + kMMCCmd_SEND_DVD_STRUCTURE = 0xBF, /* Sec. 6.1.33: */ + kMMCCmd_SEND_EVENT = 0xA2, /* Sec. 6.1.34: */ + kMMCCmd_SEND_KEY = 0xA3, /* Sec. 6.1.35: */ + kMMCCmd_SEND_OPC_INFORMATION = 0x54, /* Sec. 6.1.36: */ + kMMCCmd_SET_CD_SPEED = 0xBB, /* Sec. 6.1.37: */ + kMMCCmd_SET_LIMITS_10 = 0x33, /* Optional */ + kMMCCmd_SET_LIMITS_12 = 0xB3, /* Optional */ + kMMCCmd_SET_READ_AHEAD = 0xA7, /* Sec. 6.1.38: */ + kMMCCmd_SET_STREAMING = 0xB6, /* Sec. 6.1.39: */ + kMMCCmd_START_STOP_UNIT = 0x1B, /* Optional */ + kMMCCmd_STOP_PLAY_SCAN = 0x4E, /* Sec. 6.1.40: */ + kMMCCmd_SYNCHRONIZE_CACHE = 0x35, /* Sec. 6.1.41: */ + kMMCCmd_TEST_UNIT_READY = 0x00, /* Mandatory */ + kMMCCmd_VERIFY_10 = 0x2F, /* Optional */ + kMMCCmd_VERIFY_12 = 0xAF, /* Optional */ + kMMCCmd_WRITE_10 = 0x2A, /* Sec. 6.1.42: */ + kMMCCmd_WRITE_12 = 0xAA, /* Sec. 6.1.43: */ + kMMCCmd_WRITE_AND_VERIFY_10 = 0x2E, /* Sec. 6.1.44: */ + kMMCCmd_WRITE_BUFFER = 0x3B /* Optional */ +}; + +#pragma mark - +#pragma mark 0x06 SGC Scanner Commands +/* Commands defined by the T10:998-D SCSI-3 Graphics Commands (SGC) + * specification. The definitions and section numbers are based on section 6 + * of the revision 0, April 1995 version of the specification. + */ +enum +{ + kSGCCmd_CHANGE_DEFINITION = 0x40, /* SPC: Optional */ + kSGCCmd_COMPARE = 0x39, /* SPC: Optional */ + kSGCCmd_COPY = 0x18, /* SPC: Optional */ + kSGCCmd_COPY_AND_VERIFY = 0x3A, /* SPC: Optional */ + kSGCCmd_GET_DATA_BUFFER_STATUS = 0x34, /* Sec. 6.1.1: Optional */ + kSGCCmd_GET_WINDOW = 0x25, /* Sec. 6.1.2: Optional */ + kSGCCmd_INQUIRY = 0x12, /* SPC: Mandatory */ + kSGCCmd_LOG_SELECT = 0x4C, /* SPC: Optional */ + kSGCCmd_LOG_SENSE = 0x4D, /* SPC: Optional */ + kSGCCmd_MODE_SELECT_6 = 0x15, /* SPC: Optional */ + kSGCCmd_MODE_SELECT_10 = 0x55, /* SPC: Optional */ + kSGCCmd_MODE_SENSE_6 = 0x1A, /* SPC: Optional */ + kSGCCmd_MODE_SENSE_10 = 0x5A, /* SPC: Optional */ + kSGCCmd_OBJECT_POSITION = 0x31, /* Sec. 6.1.3: Optional */ + kSGCCmd_PORT_STATUS = 0x11, /* SPC (??): Mandatory + * for dual port devices */ + kSGCCmd_READ = 0x28, /* Sec. 6.1.4: Mandatory */ + kSGCCmd_READ_BUFFER = 0x3C, /* SPC: Optional */ + kSGCCmd_RECEIVE_DIAGNOSTICS_RESULTS = 0x1C, /* SPC: Optional */ + kSGCCmd_RELEASE_6 = 0x17, /* SPC: Mandatory */ + kSGCCmd_REQUEST_SENSE = 0x03, /* SPC: Mandatory */ + kSGCCmd_RESERVE_6 = 0x16, /* SPC: Mandatory */ + kSGCCmd_SCAN = 0x1B, /* Sec. 6.1.5: Optional */ + kSGCCmd_SEND = 0x1B, /* Sec. 6.1.6: Optional */ + kSGCCmd_SEND_DIAGNOSTICS = 0x1D, /* SPC: Mandatory */ + kSGCCmd_SET_WINDOW = 0x24, /* Sec. 6.1.7: Mandatory */ + kSGCCmd_TEST_UNIT_READY = 0x00, /* SPC: Mandatory */ + kSGCCmd_WRITE_BUFFER = 0x3B /* SPC: Optional */ +}; + +#pragma mark - +#pragma mark 0x07 SBC Optical Media Commands +/* Commands defined by the T10:990-D SCSI-3 Block Commands (SBC) + * (revision 8c, 13 November 1998) command specification. + */ + +#pragma mark - +#pragma mark 0x08 SMC Medium Changer Commands +/* Commands defined by the T10:1228-D SCSI-3 Medium Changer Commands-2 (SMC-2) + * (revision 0, March 16, 2000) command specification. + */ +enum +{ + /* Commands For Independent Medium Changers */ + kSMCCmd_EXCHANGE_MEDIUM = 0xA6, /* Optional */ + kSMCCmd_INITIALIZE_ELEMENT_STATUS = 0x07, /* Optional */ + kSMCCmd_MODE_SELECT_6 = 0x15, /* Optional */ + kSMCCmd_MODE_SELECT_10 = 0x55, /* Optional */ + kSMCCmd_MODE_SENSE_6 = 0x1A, /* Optional */ + kSMCCmd_MODE_SENSE_10 = 0x5A, /* Optional */ + kSMCCmd_MOVE_MEDIUM = 0xA5, /* Mandatory */ + kSMCCmd_PERSISTENT_RESERVE_IN = 0x5E, /* Optional */ + kSMCCmd_PERSISTENT_RESERVE_OUT = 0x5F, /* Optional */ + kSMCCmd_POSITION_TO_ELEMENT = 0x2B, /* Optional */ + kSMCCmd_READ_ELEMENT_STATUS = 0xB8, /* Mandatory */ + kSMCCmd_RELEASE_ELEMENT_6 = 0x16, /* Optional */ + kSMCCmd_RELEASE_ELEMENT_10 = 0x56, /* Optional */ + kSMCCmd_REQUEST_VOLUME_ELEMENT_ADDRESS = 0xB5, /* Optional */ + kSMCCmd_REQUEST_SENSE = 0x03, /* Mandatory */ + kSMCCmd_RESERVE_ELEMENT_6 = 0x16, /* Optional */ + kSMCCmd_RESERVE_ELEMENT_10 = 0x56 /* Optional */ +}; + +#pragma mark - +#pragma mark 0x09 SSC Communications Commands +/* Commands defined by the T10:997-D SCSI-3 Stream Commands (SSC) + * (revision 22, January 1, 2000) command specification. + */ + +#pragma mark - +#pragma mark 0x0A ASC IT8 Prepress Commands +#pragma mark 0x0B ASC IT8 Prepress Commands +/* Commands defined by the ASC IT8 specification + * (revision xx, month day, year) command specification. + */ +#if 0 +enum +{ +}; +#endif + +#pragma mark - +#pragma mark 0x0C SCC Array Controller Commands +/* Commands defined by the ANSI NCITS.318-199x SCSI Controller + * Commands (SCC-2) ratified command specification. + */ +enum +{ + kSCCCmd_MAINTENANCE_IN = 0xA3, /* Mandatory */ + kSCCCmd_MAINTENANCE_OUT = 0xA4, /* Optional */ + kSCCCmd_MODE_SELECT_6 = 0x15, /* Optional */ + kSCCCmd_MODE_SELECT_10 = 0x55, /* Optional */ + kSCCCmd_MODE_SENSE_6 = 0x1A, /* Optional */ + kSCCCmd_MODE_SENSE_10 = 0x5A, /* Optional */ + kSCCCmd_PERSISTENT_RESERVE_IN = 0x5E, /* Optional */ + kSCCCmd_PERSISTENT_RESERVE_OUT = 0x5F, /* Optional */ + kSCCCmd_PORT_STATUS = 0x1F, /* Optional */ + kSCCCmd_REDUNDANCY_GROUP_IN = 0xBA, /* Mandatory */ + kSCCCmd_REDUNDANCY_GROUP_OUT = 0xBB, /* Optional */ + kSCCCmd_RELEASE_6 = 0x17, /* Optional */ + kSCCCmd_RELEASE_10 = 0x57, /* Optional */ + kSCCCmd_REPORT_LUNS = 0xA0, /* Mandatory */ + kSCCCmd_REQUEST_SENSE = 0x03, /* Mandatory */ + kSCCCmd_RESERVE_6 = 0x16, /* Optional */ + kSCCCmd_RESERVE_10 = 0x56, /* Optional*/ + kSCCCmd_SEND_DIAGNOSTICS = 0x1D, /* Optional */ + kSCCCmd_SPARE_IN = 0xBC, /* Mandatory */ + kSCCCmd_SPARE_OUT = 0xBD /* Optional */ +}; + +#pragma mark - +#pragma mark 0x0D SES Enclosure Services Commands +/* Commands defined by the T10:1212-D SCSI-3 Enclosure Services (SES) + * (revision 8b, February 11, 1998) command specification. + */ +enum +{ + kSESCmd_MODE_SELECT_6 = 0x15, /* Optional */ + kSESCmd_MODE_SELECT_10 = 0x55, /* Optional */ + kSESCmd_MODE_SENSE_6 = 0x1A, /* Optional */ + kSESCmd_MODE_SENSE_10 = 0x5A, /* Optional */ + kSESCmd_PERSISTENT_RESERVE_IN = 0x5E, /* Optional */ + kSESCmd_PERSISTENT_RESERVE_OUT = 0x5F, /* Optional */ + kSESCmd_RECEIVE_DIAGNOSTICS_RESULTS = 0x17, /* Mandatory */ + kSESCmd_RELEASE_6 = 0x17, /* Optional */ + kSESCmd_RELEASE_10 = 0x57, /* Optional */ + kSESCmd_REQUEST_SENSE = 0x03, /* Mandatory */ + kSESCmd_RESERVE_6 = 0x16, /* Optional */ + kSESCmd_RESERVE_10 = 0x56, /* Optional */ + kSESCmd_SEND_DIAGNOSTICS = 0x1D /* Mandatory */ +}; + +#pragma mark - +#pragma mark 0x0E RBC Reduced Block Commands +/* Commands defined by the T10:1240-D Reduced Block Commands (RBC) + * (revision 10a, August 18, 1999) command specification. + */ +enum +{ + kRBCCmd_FORMAT_UNIT = 0x04, /* Optional */ + kRBCCmd_READ_10 = 0x28, /* Mandatory */ + kRBCCmd_READ_CAPACITY = 0x25, /* Mandatory */ + kRBCCmd_START_STOP_UNIT = 0x1B, /* Mandatory */ + kRBCCmd_SYNCHRONIZE_CACHE = 0x35, /* Optional */ + kRBCCmd_VERIFY_10 = 0x2F, /* Mandatory */ + kRBCCmd_WRITE_10 = 0x2A, /* Mandatory */ + kRBCCmd_WRITE_BUFFER = 0x3B /* Mandatory for fixed media + * Optional for removable */ +}; + +#pragma mark - +#pragma mark 0x0F OCRW Optical Card Commands +/* Commands defined by the ISO/IEC 14776-381 SCSI Specification for + * Optical Card Reader/Writer (OCRW) ratified command specification. + */ +#if 0 +enum +{ +}; +#endif + +#pragma mark - +#pragma mark 0x11 OSD Object-based Storage Commands +/* Commands defined by the T10:1355-D Object-based Storage Commands (OSD) + * (revision 1, 18 May 2000) command specification. + */ +#if 0 +enum +{ +}; +#endif + +#pragma mark - +#pragma mark 0x15 RMC Simplified Multimedia Commands +/* Commands defined by the T10:1364-D Reduced Multimedia Commands (RMC) + * (revision 1, November 11, 1999) command specification. + */ +#if 0 +enum +{ +}; +#endif + +#endif /* _SCSI_COMMAND_OPERATION_CODES_H_ */ diff --git a/QualcommWireless/include/IOKit/scsi/SCSIPort.h b/QualcommWireless/include/IOKit/scsi/SCSIPort.h new file mode 100644 index 0000000..8eefbeb --- /dev/null +++ b/QualcommWireless/include/IOKit/scsi/SCSIPort.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2004-2009 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_SCSI_PORTS_H_ +#define _IOKIT_SCSI_PORTS_H_ + + +/*! @header SCSIPort + @discussion + This file contains all the definitions for SCSIPort notifications and status. +*/ + + +/*! +@enum kSCSIPort_NotificationStatusChange +@discussion +Message definition to be used with the messageClients +call to inform of a change in port status. +*/ +enum +{ + kSCSIPort_NotificationStatusChange = 0x68000001 +}; + + +/*! @typedef SCSIPortStatus + @abstract 32-bit number to represent a SCSIPortStatus. + @discussion Type for SCSIPortStatus. +*/ + +typedef UInt32 SCSIPortStatus; + +/*! @enum SCSI Port Status Values + @discussion Definitions for the possible port status values +*/ +enum +{ + /*! + @constant kSCSIPort_StatusOnline + The port is online. + */ + kSCSIPort_StatusOnline = 0, + + /*! + @constant kSCSIPort_StatusOffline + The port is offline (e.g. unplugged cable). + */ + kSCSIPort_StatusOffline = 1, + + /*! + @constant kSCSIPort_StatusFailure + Driver has detected unrecoverable port failure (e.g. hardware port failure) + */ + kSCSIPort_StatusFailure = 2 +}; + +#endif /* _IOKIT_SCSI_PORTS_H_ */ diff --git a/QualcommWireless/include/IOKit/scsi/SCSITask.h b/QualcommWireless/include/IOKit/scsi/SCSITask.h new file mode 100644 index 0000000..52939fa --- /dev/null +++ b/QualcommWireless/include/IOKit/scsi/SCSITask.h @@ -0,0 +1,465 @@ +/* + * Copyright (c) 1998-2009 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#ifndef _IOKIT_SCSI_TASK_H_ +#define _IOKIT_SCSI_TASK_H_ + + +#if KERNEL +#include <IOKit/IOTypes.h> +#else +#include <CoreFoundation/CoreFoundation.h> +#endif + + +/*! @header SCSITask +SCSITask typedefs and constants used inside the kernel and user space. + +Note that the SCSITaskIdentifier is an opaque object and that directly +casting the SCSITaskIdentifier to any other type is discouraged. The SCSITask +implementation changes when necessary to accomodate architectural changes, +performance improvements, and bug fixes. + +Device and protocol layer drivers that need to access information +contained in a SCSITask should use the appropriate accessor methods in +IOSCSIPrimaryCommandsDevice.h or IOSCSIProtocolServices.h +*/ + + +/*! @typedef SCSIDeviceIdentifier + @abstract 64-bit number to represent a SCSI Device. + @discussion If the identifier can either be that of an initiator or a target, + SCSIDeviceIdentifier should be used. +*/ + +typedef UInt64 SCSIDeviceIdentifier; + +/*! @typedef SCSITargetIdentifier + @abstract 64-bit number to represent a SCSI Target Device. + @discussion If the identifier is for a target only and not an initiator, then + SCSITargetIdentifier should be used. +*/ + +typedef SCSIDeviceIdentifier SCSITargetIdentifier; + +/*! @typedef SCSIInitiatorIdentifier + @abstract 64-bit number to represent a SCSI Initiator Device. + @discussion If the identifier is for an initiator only and not a target, then + SCSIInitiatorIdentifier should be used. +*/ + +typedef SCSIDeviceIdentifier SCSIInitiatorIdentifier; + +/*! @typedef SCSILogicalUnitBytes[8] + @abstract 8-Byte array to represent LUN information + @discussion The SCSI Primary Commands specification treats the 64-bits + of LUN information as 4 2-byte structures. + + Use of the 64-bit SCSILogicalUnitNumber is now deprecated. Since it + was not defined on Mac OS X how the 64-bits were encoded for hierarchical + units and all usage was simply as a 64-bit number, changing the encoding + scheme now would result in non-binary compatible code. New APIs have been + added to retrieve the LUN bytes from the SCSITask and set them in the SCSITask. + */ +typedef UInt8 SCSILogicalUnitBytes[8]; +typedef UInt64 SCSILogicalUnitNumber; // DEPRECATED + + +/*! @typedef SCSITaggedTaskIdentifier + @abstract 64-bit number to represent a unique task identifier. + @discussion The Tagged Task Identifier is used when a Task has a Task Attribute other + than SIMPLE. The SCSI Application Layer client that controls the Logical + Unit for which a Task is intended is required to guarantee that the Task + Tag Identifier is unique. Zero cannot be used a a Tag value as this is used + to when a Tagged Task Identifier value is needed for a Task with a SIMPLE + attribute. +*/ + +typedef UInt64 SCSITaggedTaskIdentifier; + +/*! + @enum Untagged Task Identifier + @discussion The Untagged Task Identifier is used to indicate no unique tag + is associated with the Task. + @constant kSCSIUntaggedTaskIdentifier This value means the task is untagged. + */ + +enum +{ + kSCSIUntaggedTaskIdentifier = 0 +}; + +/*! + @typedef SCSITaskAttribute + @abstract Attributes for task delivery. + @discussion The Task Attribute defines how this task should be managed + when determing order for queueing and submission to the + appropriate device server. The Task Attribute is set by the SCSI + Application Layer and cannot be modified by the SCSI Protocol Layer. + @constant kSCSITask_SIMPLE The task has a simple attribute. + @constant kSCSITask_ORDERED The task has an ordered attribute. + @constant kSCSITask_HEAD_OF_QUEUE The task has a head-of-queue attribute. + @constant kSCSITask_ACA The task has an auto-contingent-allegiance attribute. + */ + +typedef enum SCSITaskAttribute +{ + kSCSITask_SIMPLE = 0, + kSCSITask_ORDERED = 1, + kSCSITask_HEAD_OF_QUEUE = 2, + kSCSITask_ACA = 3 +} SCSITaskAttribute; + +/*! + @typedef SCSITaskState + @abstract Attributes for task state. + @discussion The Task State represents the current state of the task. + The state is set to NEW_TASK when the task is created. The SCSI Protocol + Layer will then adjust the state as the task is queued and during + execution. The SCSI Application Layer can examine the state to monitor + the progress of a task. The Task State can only be modified by the SCSI + Protocol Layer. The SCSI Application Layer can only read the state. + @constant kSCSITaskState_NEW_TASK The task state is new task. + @constant kSCSITaskState_ENABLED The task is enabled and queued. + @constant kSCSITaskState_BLOCKED The task is blocked. + @constant kSCSITaskState_DORMANT The task is dormant. + @constant kSCSITaskState_ENDED The task is complete. + */ + +typedef enum SCSITaskState +{ + kSCSITaskState_NEW_TASK = 0, + kSCSITaskState_ENABLED = 1, + kSCSITaskState_BLOCKED = 2, + kSCSITaskState_DORMANT = 3, + kSCSITaskState_ENDED = 4 +} SCSITaskState; + + +/*! + @typedef SCSIServiceResponse + @abstract Attributes for task service response. + @discussion The Service Response represents the execution status of + a service request made to a Protocol Services Driver. The Service + Response can only be modified by the SCSI Protocol Layer. The SCSI + Application Layer can only read the state. + */ + +typedef enum SCSIServiceResponse +{ + /*! + @constant kSCSIServiceResponse_Request_In_Process + Not defined in SAM specification, but is a service response used + for asynchronous commands that are not yet completed. + */ + kSCSIServiceResponse_Request_In_Process = 0, + + /*! + @constant kSCSIServiceResponse_SERVICE_DELIVERY_OR_TARGET_FAILURE + The service request failed because of a delivery or target failure. + */ + kSCSIServiceResponse_SERVICE_DELIVERY_OR_TARGET_FAILURE = 1, + + /*! + @constant kSCSIServiceResponse_TASK_COMPLETE + The task completed. + */ + kSCSIServiceResponse_TASK_COMPLETE = 2, + + /*! + @constant kSCSIServiceResponse_LINK_COMMAND_COMPLETE + The linked command completed. + */ + kSCSIServiceResponse_LINK_COMMAND_COMPLETE = 3, + + /*! + @constant kSCSIServiceResponse_FUNCTION_COMPLETE + The task management function completed. + */ + kSCSIServiceResponse_FUNCTION_COMPLETE = 4, + + /*! + @constant kSCSIServiceResponse_FUNCTION_REJECTED + The task management function was rejected. + */ + kSCSIServiceResponse_FUNCTION_REJECTED = 5 +} SCSIServiceResponse; + +/*! + @typedef SCSITaskStatus + @abstract Attributes for task status. + @discussion The Task Status represents the completion status + of the task which provides the SCSI Application Layer with + additional information about how to procede in handling a + completed task. + + The SCSI Architecture Model specification only defines task + status values for when a task completes with a service response + of either TASK_COMPLETED or LINK_COMMAND_COMPLETE. + + Since additional information will aid in error recovery when + a task fails to be completed by a device due to a service + response of kSCSIServiceResponse_SERVICE_DELIVERY_OR_TARGET_FAILURE, + additional values have been defined that can be returned by the + SCSI Protocol Layer to inform the SCSI Application Layer of the + cause of the delivery failure. + + The Task Status can only be modified by the SCSI Protocol Layer. + The SCSI Application Layer can only read the status +*/ +typedef enum SCSITaskStatus +{ + + /*! + @constant kSCSITaskStatus_GOOD + The task completed with a status of GOOD. + */ + + kSCSITaskStatus_GOOD = 0x00, + + /*! + @constant kSCSITaskStatus_CHECK_CONDITION + The task completed with a status of CHECK_CONDITION. Additional + information about the condition should be available in the sense data. + */ + + kSCSITaskStatus_CHECK_CONDITION = 0x02, + + /*! + @constant kSCSITaskStatus_CONDITION_MET + The task completed with a status of CONDITION_MET. + */ + + kSCSITaskStatus_CONDITION_MET = 0x04, + + /*! + @constant kSCSITaskStatus_BUSY + The task completed with a status of BUSY. The device server might need + time to process a request and a delay may be required. + */ + kSCSITaskStatus_BUSY = 0x08, + + /*! + @constant kSCSITaskStatus_INTERMEDIATE + The task completed with a status of INTERMEDIATE. + */ + kSCSITaskStatus_INTERMEDIATE = 0x10, + + /*! + @constant kSCSITaskStatus_INTERMEDIATE_CONDITION_MET + The task completed with a status of INTERMEDIATE_CONDITION_MET. + */ + kSCSITaskStatus_INTERMEDIATE_CONDITION_MET = 0x14, + + /*! + @constant kSCSITaskStatus_RESERVATION_CONFLICT + The task completed with a status of RESERVATION_CONFLICT. + */ + kSCSITaskStatus_RESERVATION_CONFLICT = 0x18, + + /*! + @constant kSCSITaskStatus_TASK_SET_FULL + The task completed with a status of TASK_SET_FULL. The device server + may need to complete a task before the initiator sends another. + */ + kSCSITaskStatus_TASK_SET_FULL = 0x28, + + /*! + @constant kSCSITaskStatus_ACA_ACTIVE + The task completed with a status of ACA_ACTIVE. The device server may + need the initiator to clear the Auto-Contingent Allegiance condition + before it will respond to new commands. + */ + kSCSITaskStatus_ACA_ACTIVE = 0x30, + + /*! + @constant kSCSITaskStatus_TaskTimeoutOccurred + If a task is aborted by the SCSI Protocol Layer due to it exceeding + the timeout value specified by the task, the task status shall be + set to kSCSITaskStatus_TaskTimeoutOccurred. + */ + + kSCSITaskStatus_TaskTimeoutOccurred = 0x01, + + /*! + @constant kSCSITaskStatus_ProtocolTimeoutOccurred + If a task is aborted by the SCSI Protocol Layer due to it exceeding a + timeout value specified by the support for the protocol or a related + specification, the task status shall be set to + kSCSITaskStatus_ProtocolTimeoutOccurred. + */ + + kSCSITaskStatus_ProtocolTimeoutOccurred = 0x02, + + /*! + @constant kSCSITaskStatus_DeviceNotResponding + If a task is unable to be delivered due to a failure of the device not + accepting the task or the device acknowledging the attempt to send it the + device the task status shall be set to kSCSITaskStatus_DeviceNotResponding. + This will allow the SCSI Application driver to perform the necessary steps + to try to recover the device. This shall only be reported after the SCSI + Protocol Layer driver has attempted all protocol specific attempts to recover + the device. + */ + + kSCSITaskStatus_DeviceNotResponding = 0x03, + + /*! + @constant kSCSITaskStatus_DeviceNotPresent + If the task is unable to be delivered because the device has been + detached, the task status shall be set to kSCSITaskStatus_DeviceNotPresent. + This will allow the SCSI Application Layer to halt the sending of tasks + to the device and, if supported, perform any device failover or system + cleanup. + */ + kSCSITaskStatus_DeviceNotPresent = 0x04, + + /*! + @constant kSCSITaskStatus_DeliveryFailure + If the task is unable to be + delivered to the device due to a failure in the SCSI Protocol Layer, + such as a bus reset or communications error, but the device is is + known to be functioning properly, the task status shall be set to + kSCSITaskStatus_DeliveryFailure. This can also be reported if the + task could not be delivered due to a protocol error that has since + been corrected. + */ + kSCSITaskStatus_DeliveryFailure = 0x05, + + /*! + @constant kSCSITaskStatus_No_Status + This status is not defined by + the SCSI specifications, but is here to provide a status that can + be returned in cases where there is not status available from the + device or protocol, for example, when the service response is + neither TASK_COMPLETED nor LINK_COMMAND_COMPLETE or when the + service response is SERVICE_DELIVERY_OR_TARGET_FAILURE and the + reason for failure could not be determined. + */ + kSCSITaskStatus_No_Status = 0xFF +} SCSITaskStatus; + +/*! + @enum Command Descriptor Block Size + @discussion Command Descriptor Block Size constants. +*/ +enum +{ + /*! + @constant kSCSICDBSize_Maximum This is the largest size a Command Descriptor + Block can be as specified in SPC-2. + */ + kSCSICDBSize_Maximum = 16, + + /*! + @constant kSCSICDBSize_6Byte Use this for a 6-byte CDB. + */ + kSCSICDBSize_6Byte = 6, + + /*! + @constant kSCSICDBSize_10Byte Use this for a 10-byte CDB. + */ + kSCSICDBSize_10Byte = 10, + + /*! + @constant kSCSICDBSize_12Byte Use this for a 12-byte CDB. + */ + kSCSICDBSize_12Byte = 12, + + /*! + @constant kSCSICDBSize_16Byte Use this for a 16-byte CDB. + */ + kSCSICDBSize_16Byte = 16 +}; + +typedef UInt8 SCSICommandDescriptorBlock[kSCSICDBSize_Maximum]; + +/*! + @enum Data Transfer Direction + @discussion DataTransferDirection constants. +*/ +enum +{ + /*! + @constant kSCSIDataTransfer_NoDataTransfer Use this for tasks + that transfer no data. + */ + kSCSIDataTransfer_NoDataTransfer = 0x00, + + /*! + @constant kSCSIDataTransfer_FromInitiatorToTarget Use this for tasks that transfer + data from the initiator to the target. + */ + kSCSIDataTransfer_FromInitiatorToTarget = 0x01, + + /*! + @constant kSCSIDataTransfer_FromTargetToInitiator Use this for tasks that transfer + data from the target to the initiator. + */ + kSCSIDataTransfer_FromTargetToInitiator = 0x02 +}; + + +#if defined(KERNEL) && defined(__cplusplus) + +/* Libkern includes */ +#include <libkern/c++/OSObject.h> + + +/*! + @enum SCSITaskMode + @discussion The SCSI Task mode is used by the SCSI + Protocol Layer to indicate what mode the task is executing. +*/ +typedef enum SCSITaskMode +{ + kSCSITaskMode_CommandExecution = 1, + kSCSITaskMode_Autosense = 2 +} SCSITaskMode; + +/*! + @typedef SCSITaskIdentifier + @discussion This is an opaque object that represents a task. + This is used so that drivers for both the SCSI Protocol Layer + and the SCSI Application Layer cannot modify the SCSITask object + directly but must instead use the inherited methods to do so. This + allows the implementation of SCSITask to change without directly + impacting device and protocol layer drivers. In addition, it + prevents changing of properties that are not allowed to be + changed by a given layer. +*/ +typedef OSObject * SCSITaskIdentifier; + + +/*! + @typedef SCSITaskCompletion + @discussion This is the typedef for completion routines that + work with SCSITaskIdentifiers. +*/ +typedef void ( *SCSITaskCompletion )( SCSITaskIdentifier completedTask ); + + +#endif /* defined(KERNEL) && defined(__cplusplus) */ + +#endif /* _IOKIT_SCSI_TASK_H_ */ diff --git a/QualcommWireless/include/IOKit/scsi/spi/IOSCSIParallelInterfaceController.h b/QualcommWireless/include/IOKit/scsi/spi/IOSCSIParallelInterfaceController.h new file mode 100644 index 0000000..9cd9709 --- /dev/null +++ b/QualcommWireless/include/IOKit/scsi/spi/IOSCSIParallelInterfaceController.h @@ -0,0 +1,1617 @@ +/* + * Copyright (c) 2002-2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef __IOKIT_IO_SCSI_PARALLEL_INTERFACE_CONTROLLER_H__ +#define __IOKIT_IO_SCSI_PARALLEL_INTERFACE_CONTROLLER_H__ + + + /*! + @header IOSCSIParallelInterfaceController + The IOSCSIParallelInterfaceController class and the associated HBA child + class is responsible for the management of all related hardware. This + includes the onboard HBA controller chip and the physical state of the + bus. These classes are not responsible for any of the management of + the SCSI Devices on the bus with the exception of maintaining the queue that + holds the objects representing those SCSI Devices. +*/ + + +//----------------------------------------------------------------------------- +// Includes +//----------------------------------------------------------------------------- + +// General IOKit includes +#include <IOKit/IOService.h> +#include <IOKit/IOWorkLoop.h> +#include <IOKit/IOCommandGate.h> +#include <IOKit/IODMACommand.h> +#include <IOKit/IOInterruptEventSource.h> +#include <IOKit/IOFilterInterruptEventSource.h> +#include <IOKit/IOTimerEventSource.h> +#include <IOKit/IOCommandPool.h> + +// IOKit SCSI ArchitectureModel Family includes +#include <IOKit/scsi/SCSITask.h> +#include <IOKit/scsi/SCSICmds_REQUEST_SENSE_Defs.h> +#include <IOKit/scsi/SCSIPort.h> + +#include <Availability.h> + +#ifndef __MAC_OS_X_VERSION_MIN_REQUIRED +#error "Missing macOS target version" +#endif + +//----------------------------------------------------------------------------- +// Constants +//----------------------------------------------------------------------------- + + +#define kIOPropertySCSIDeviceFeaturesKey "SCSI Device Features" +#define kIOPropertySCSI_I_T_NexusFeaturesKey "SCSI I_T Nexus Features" + +// Set this key with a value of true in ReportHBAConstraints() to indicate support +// for full 8-byte LUN addressing and use GetLogicalUnitBytes() to obtain the +// full 8-byte LUN when processing commands in ProcessParallelTask(). +#define kIOHierarchicalLogicalUnitSupportKey "SCSI Hierarchical Logical Unit Support" + +// This is the alignment mask used when allocating per-task HBA data. It allows +// the HBA to declare whether or not it supports 64-bit addressability and what the +// minimum byte alignment is for the data. E.g. By specifying 0x0000FFFFFFFFFFFEULL, +// the controller would be indicating that it supports 48-bits of addressability, but +// at a minimum of being 2-byte aligned. +#define kIOMinimumHBADataAlignmentMaskKey "HBA Data Alignment" + +// The Feature Selectors used to identify features of the SCSI Parallel +// Interface. These are used by the DoesHBASupportSCSIParallelFeature +// to report whether the HBA supports a given SCSI Parallel Interface +// feature and are used for requesting negotiation and reporting negotiation +// results between the controller and the device. + +// When the DoesHBASupportSCSIParallelFeature() member routine of the controller +// child class is called, it will return true if the HBA that it controls +// supports the specified SCSIParallelFeature or false if it does not. +typedef enum SCSIParallelFeature +{ + // The selector for support of Wide Data Transfers. Only Wide16 is supported + // as Wide32 has been obsoleted by the SPI-3 specification. + kSCSIParallelFeature_WideDataTransfer = 0, + + // The selector for support of Synchronous Data Transfers. + kSCSIParallelFeature_SynchronousDataTransfer = 1, + + // The selector for support of Quick Arbitration and Selection (QAS). + kSCSIParallelFeature_QuickArbitrationAndSelection = 2, + + // The selector for support of Double Transition (DT) data transfers. + kSCSIParallelFeature_DoubleTransitionDataTransfers = 3, + + // The selector for SPI Information Unit (IU) transfers. + kSCSIParallelFeature_InformationUnitTransfers = 4, + + // Since the Feature selectors are zero base, this will always have the + // correct total. + kSCSIParallelFeature_TotalFeatureCount +} SCSIParallelFeature; + + +typedef enum SCSIParallelFeatureRequest +{ + // This selector indicates that current negotiation + // should be used. + kSCSIParallelFeature_NoNegotiation = 0, + + // This selector indicates that the controller + // should attempt negotiation for the feature + kSCSIParallelFeature_AttemptNegotiation = 1, + + // This selector indicates that the controller + // should clear any negotiation for the feature + kSCSIParallelFeature_ClearNegotiation = 2 +} SCSIParallelFeatureRequest; + +typedef enum SCSIParallelFeatureResult +{ + kSCSIParallelFeature_NegotitiationUnchanged = 0, + kSCSIParallelFeature_NegotitiationCleared = 1, + kSCSIParallelFeature_NegotitiationSuccess = 2 +} SCSIParallelFeatureResult; + + +// The SCSI Message Codes used for MESSAGE IN and MESSAGE OUT phases. +enum SCSIParallelMessages +{ + // Link Control Messages + kSCSIParallelMessage_TASK_COMPLETE = 0x00, + kSCSIParallelMessage_EXTENDED_MESSAGE = 0x01, + kSCSIParallelMessage_SAVE_DATA_POINTER = 0x02, + kSCSIParallelMessage_RESTORE_POINTERS = 0x03, + kSCSIParallelMessage_DISCONNECT = 0x04, + kSCSIParallelMessage_INITIATOR_DETECTED_ERROR = 0x05, + kSCSIParallelMessage_MESSAGE_REJECT = 0x07, + kSCSIParallelMessage_NO_OPERATION = 0x08, + kSCSIParallelMessage_MESSAGE_PARITY_ERROR = 0x09, + kSCSIParallelMessage_IGNORE_WIDE_RESIDUE = 0x23, + kSCSIParallelMessage_QAS_REQUEST = 0x55, + kSCSIParallelMessage_IDENTIFY = 0x80, + + // The Message Codes used in the EXTENDED_MESSAGE message. + kSCSIParallelMessage_MODIFY_DATA_POINTER = 0x00, + kSCSIParallelMessage_SYNCHONOUS_DATA_TRANSFER_REQUEST = 0x01, + // Reserved = 0x02 + kSCSIParallelMessage_WIDE_DATA_TRANSFER_REQUEST = 0x03, + kSCSIParallelMessage_PARALLEL_PROTOCOL_REQUEST = 0x04, + // Reserved = 0x05 through 0xFF + + // Task Attribute Message Codes + kSCSIParallelMessage_ACA = 0x24, + kSCSIParallelMessage_HEAD_OF_QUEUE = 0x21, + kSCSIParallelMessage_LINKED_COMMAND_COMPLETE = 0x0A, + kSCSIParallelMessage_ORDERED = 0x22, + kSCSIParallelMessage_SIMPLE = 0x20, + + // Task Management Message Codes + kSCSIParallelMessage_ABORT_TASK = 0x0D, + kSCSIParallelMessage_ABORT_TASK_SET = 0x06, + kSCSIParallelMessage_CLEAR_ACA = 0x16, + kSCSIParallelMessage_CLEAR_TASK_SET = 0x0E, + kSCSIParallelMessage_LOGICAL_UNIT_RESET = 0x17, + kSCSIParallelMessage_TARGET_RESET = 0x0C +}; + +enum +{ + kSCSIParallelTaskControllerIDQueueHead = 0 +}; + +// Notifications +enum +{ + kSCSIControllerNotificationBusReset = 0x68000000 +}; + +// Forward declaration for the internally used Parallel Device object. +class IOSCSIParallelInterfaceDevice; + +// This is the identifier that is used to specify a given parallel Task. +typedef OSObject * SCSIParallelTaskIdentifier; + + +//----------------------------------------------------------------------------- +// Class Declarations +//----------------------------------------------------------------------------- + +/*! @class IOSCSIParallelInterfaceController + @abstract Class that represents a SCSI Host Bus Adapter. + @discussion Class that represents a SCSI Host Bus Adapter. +*/ +class IOSCSIParallelInterfaceController : public IOService +{ + + OSDeclareAbstractStructors ( IOSCSIParallelInterfaceController ) + +#if 0 +#pragma mark - +#pragma mark Client API +#endif + + +public: + + /*! + @function GetSCSIParallelTask + @abstract Method to allow the client to get a SCSIParallelTask + @discussion Get a SCSIParallelTask from the controller so that a request + can be issued to the HBA driver. + @param blockForCommand If the blockForCommand parameter is set to false + and there are no free SCSIParallelTasks, this method will return NULL, + otherwise it will wait for one to become available before returning. + @result If there is a SCSI Parallel Task available, a reference to it + will be returned. + */ + + SCSIParallelTaskIdentifier GetSCSIParallelTask ( bool blockForCommand ); + + /*! + @function FreeSCSIParallelTask + @abstract Method to allow the client to release a SCSIParallelTask + @discussion The FreeSCSIParallelTask method is called by the client when + a SCSIParallelTask has been completed and the associated returnTask + needs to be returned to the pool. + @param returnTask is a reference to the SCSIParallelTaskIdentifier to be + returned. + */ + + void FreeSCSIParallelTask ( SCSIParallelTaskIdentifier returnTask ); + + /*! + @function FindTaskForAddress + @abstract Find a task for a given Task Address, if one exists. + @discussion If a valid Tagged Task Identifier is specified, this method + will return the task specified by the Tagged Task Address if one is + found, or else NULL will be returned. If zero is used as the Tagged + Task Identifier, then this routine will search for an outstanding task + based on the Untagged Task Address and return the task or else, if one + is not found, return NULL. + @param theT is the Target component of the I_T_L or I_T_L_Q nexus. + @param theL is the Logical Unit component of the I_T_L or I_T_L_Q nexus. + @param theQ is the Queue Tag component of the I_T_L_Q nexus. If this is + an I_T_L nexus, then the kSCSIUntaggedTaskIdentifier constant should be + used for theQ. + @result returns a valid SCSIParallelTaskIdentifier or NULL if none + found. + */ + + SCSIParallelTaskIdentifier FindTaskForAddress ( + SCSIDeviceIdentifier theT, + SCSILogicalUnitNumber theL, + SCSITaggedTaskIdentifier theQ ); + + + /*! + @function FindTaskForControllerIdentifier + @abstract Find a task for a given Target and Controller Task Identifier + @discussion Allows the controller child class to find an outstanding task + for a specified target and controller task identifier + @param theTarget is the Target that the task . + @param theIdentifier is the controller task identifier set using the SCSI + Parallel Task's SetControllerTaskIdentifier() method. + @result returns a valid SCSIParallelTaskIdentifier or NULL if none + found. + */ + + SCSIParallelTaskIdentifier FindTaskForControllerIdentifier ( + SCSIDeviceIdentifier theTarget, + UInt64 theIdentifier ); + + + /*! + @function ExecuteParallelTask + @abstract Submit a SCSIParallelTask for execution. + @discussion The ExecuteParallelTask call is made by the client to submit + a SCSIParallelTask for execution. + @param parallelRequest is a reference to the SCSIParallelTaskIdentifier + to be executed. + @result is an appropriate SCSIServiceResponse which are defined in the + file <IOKit/scsi/SCSITask.h>. + */ + + SCSIServiceResponse ExecuteParallelTask ( + SCSIParallelTaskIdentifier parallelRequest ); + + // --- Public API methods provided by HBA child classes ---- + + /*! + @function ReportHBAHighestLogicalUnitNumber + @abstract Gets the Highest Logical Unit Number. + @discussion This method is used to query the HBA child class to + determine what the highest Logical Unit Number that the controller can + address. + @result returns a valid 64-bit logical unit number. + */ + + virtual SCSILogicalUnitNumber ReportHBAHighestLogicalUnitNumber ( void ) = 0; + + /*! + @function DoesHBASupportSCSIParallelFeature + @abstract Queries the HBA child class to determine if it supports a + specific SPI feature. + @discussion Queries the HBA child class to determine if it supports the + specified feature as defined by the SCSI Parallel Interconnect + specifications. + @result Returns true if requested feature is supported. + */ + + virtual bool DoesHBASupportSCSIParallelFeature ( + SCSIParallelFeature theFeature ) = 0; + + /*! + @function InitializeTargetForID + @abstract Called to initialize a target device. + @discussion This method will be called to initialize a target device in + a single-threaded manner. The HBA can use this method to probe the + target or do anything else necessary before the device object is + registered with IOKit for matching. + @result Returns true if the target was successfully initialized. + */ + + virtual bool InitializeTargetForID ( + SCSITargetIdentifier targetID ) = 0; + + // The SCSI Task Management Functions as defined in the SCSI Architecture + // Model - 2 (SAM-2) specification. These are used by the client to request + // the specified function. The controller can complete these immmediately + // by returning the appropriate SCSIServiceResponse, or these can be completed + // asyncronously by the controller returning a SCSIServiceResponse of + // kSCSIServiceResponse_Request_In_Process and then calling the appropriate + // function complete member routine listed in the child class API section. + + virtual SCSIServiceResponse AbortTaskRequest ( + SCSITargetIdentifier theT, + SCSILogicalUnitNumber theL, + SCSITaggedTaskIdentifier theQ ) = 0; + + virtual SCSIServiceResponse AbortTaskSetRequest ( + SCSITargetIdentifier theT, + SCSILogicalUnitNumber theL ) = 0; + + virtual SCSIServiceResponse ClearACARequest ( + SCSITargetIdentifier theT, + SCSILogicalUnitNumber theL ) = 0; + + virtual SCSIServiceResponse ClearTaskSetRequest ( + SCSITargetIdentifier theT, + SCSILogicalUnitNumber theL ) = 0; + + virtual SCSIServiceResponse LogicalUnitResetRequest ( + SCSITargetIdentifier theT, + SCSILogicalUnitNumber theL ) = 0; + + virtual SCSIServiceResponse TargetResetRequest ( + SCSITargetIdentifier theT ) = 0; + + + + /*! + @function DoesHBAPerformAutoSense + @abstract Queries the HBA child class to determine if it automatically + performs AutoSense and provides AutoSense data for each I/O. If the HBA + allocates space for AutoSense in its HBA specific data region on a per + task basis, the HBA should respond true. + @discussion Queries the HBA child class to determine if it automatically + performs AutoSense and provides AutoSense data for each I/O. If the HBA + allocates space for AutoSense in its HBA specific data region on a per + task basis, the HBA should respond true. + @result Return true if HBA performs AutoSense into its own private data + buffer. + */ + + OSMetaClassDeclareReservedUsed ( IOSCSIParallelInterfaceController, 1 ); + + virtual bool DoesHBAPerformAutoSense ( void ); + + /*! + @function ReportHBAConstraints + @abstract Called to report the I/O constraints for this controller. + A list of valid keys includes: + kIOMaximumSegmentCountReadKey, (required) + kIOMaximumSegmentCountWriteKey, (required) + kIOMaximumSegmentByteCountReadKey, (required) + kIOMaximumSegmentByteCountWriteKey, (required) + kIOMinimumSegmentAlignmentByteCountKey, (required) + kIOMaximumSegmentAddressableBitCountKey, (required) + kIOMinimumHBADataAlignmentMaskKey (required) + kIOHierarchicalLogicalUnitSupportKey (optional). + NB: These keys and their values are described in this header and <IOKit/IOKitKeys.h> + @param constraints. An OSDictionary object used to aggregate the key/value pairs. + Subclasses must set the required keys if they override this method. If a subclass does + not provide the required keys, the system will panic. + */ + OSMetaClassDeclareReservedUsed ( IOSCSIParallelInterfaceController, 2 ); + + virtual void ReportHBAConstraints ( OSDictionary * constraints ); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_7 + + /*! + @function DoesHBASupportMultiPathing + @abstract Queries the HBA child class to determine if it supports + Multi-Pathing. + @discussion Queries the HBA child class to determine if it supports + Multi-Pathing. + @result Returns true if requested feature is supported. + */ + OSMetaClassDeclareReservedUsed ( IOSCSIParallelInterfaceController, 3 ); + + virtual bool DoesHBASupportMultiPathing ( void ); + +#else + + OSMetaClassDeclareReservedUnused ( IOSCSIParallelInterfaceController, 3 ); + +#endif + + // Padding for the Client API + OSMetaClassDeclareReservedUnused ( IOSCSIParallelInterfaceController, 4 ); + OSMetaClassDeclareReservedUnused ( IOSCSIParallelInterfaceController, 5 ); + OSMetaClassDeclareReservedUnused ( IOSCSIParallelInterfaceController, 6 ); + OSMetaClassDeclareReservedUnused ( IOSCSIParallelInterfaceController, 7 ); + OSMetaClassDeclareReservedUnused ( IOSCSIParallelInterfaceController, 8 ); + + +#if 0 +#pragma mark - +#pragma mark Child Class API +#endif + + +protected: + + // ---- Target Creation and Destruction methods --- + + /*! + @function CreateTargetForID + @abstract Method to perform device creation. + @discussion For HBA child classes that report true to the + DoesHBAPerformDeviceManagement() method, the child class will be + responsible for all device management by using these methods; + otherwise, the superclass will be responsible for all device management. + This method must be used to perform SCSI Parallel Device creation and + cannot be overridden. + @param targetID SCSIDeviceIdentifier of desired targetID. + @result returns true if successful. + */ + + bool CreateTargetForID ( SCSIDeviceIdentifier targetID ); + + /*! + @function CreateTargetForID + @abstract Method to perform device creation. + @discussion For HBA child classes that report true to the + DoesHBAPerformDeviceManagement() method, the child class will be + responsible for all device management by using these methods; + otherwise, the superclass will be responsible for all device management. + This method must be used to perform SCSI Parallel Device creation and + cannot be overridden. + @param targetID SCSIDeviceIdentifier of desired targetID. + @param properties A dictionary of properties to associate with the device + upon creation. The list of valid property keys is as follows: + kIOPropertySASAddressKey, + kIOPropertyFibreChannelNodeWorldWideNameKey, + kIOPropertyFibreChannelPortWorldWideNameKey, + kIOPropertyFibreChannelAddressIdentifierKey, + kIOPropertyFibreChannelALPAKey, and + kIOPropertyRetryCountKey + These keys are defined in + <IOKit/storage/IOStorageProtocolCharacteristics.h> and the values + associated with these keys must be of the proper type/size, + or the target creation will not succeed. + @result returns true if successful. + */ + + bool CreateTargetForID ( SCSIDeviceIdentifier targetID, + OSDictionary * properties ); + + /*! + @function DestroyTargetForID + @abstract Method to perform device destruction. + @discussion For HBA child classes that report true to the + DoesHBAPerformDeviceManagement() method, the child class will be + responsible for all device management by using these methods; otherwise, + the superclass will be responsible for all device management. + This method must be used to perform SCSI Parallel Device destruction and + cannot be overridden. + @param targetID SCSIDeviceIdentifier of desired targetID. + */ + + void DestroyTargetForID ( SCSIDeviceIdentifier targetID ); + + /*! + @function GetTargetForID + @abstract Accessor for getting pointer to IOSCSIParallelInterfaceDevice. + @param targetID SCSIDeviceIdentifier of desired targetID. + @result returns pointer to IOSCSIParallelInterfaceDevice or NULL if not + found. + */ + + IOSCSIParallelInterfaceDevice * GetTargetForID ( + SCSIDeviceIdentifier targetID ); + + /*! + @function SetTargetProperty + @abstract Accessor for setting a property for a specific target. + @param device A pointer to a valid IOSCSIParallelInterfaceDevice. + @param key A pointer to a valid OSString object which represents the key. + A list of valid keys includes: + kIOPropertySASAddressKey, + kIOPropertyFibreChannelNodeWorldWideNameKey, + kIOPropertyFibreChannelPortWorldWideNameKey, + kIOPropertyFibreChannelAddressIdentifierKey, and + kIOPropertyFibreChannelALPAKey. + NB: These keys and their values are described in <IOKit/storage/IOStorageProtocolCharacteristics.h> + @param value Pointer to an OSObject (one of type OSData, OSString, etc.) + which represents the value for the property. The value must be of the proper type + and size for the specified key. + @result returns true if identifier was properly set, otherwise false. + */ + + bool SetTargetProperty ( SCSIDeviceIdentifier targetID, + const char * key, + OSObject * value ); + + /*! + @function RemoveTargetProperty + @abstract Accessor for removing a property from a specific target. + @param device A pointer to a valid IOSCSIParallelInterfaceDevice. + @param key A pointer to a valid OSString object which represents the key. + */ + + void RemoveTargetProperty ( SCSIDeviceIdentifier targetID, + const char * key ); + + // ---- Methods for HBA specifics. ---- + + /*! + @function SetHBAProperty + @abstract Accessor for setting a property for this object. + @param key A pointer to a valid OSString object which represents the key. + A list of valid keys includes: + kIOPropertyVendorNameKey, + kIOPropertyProductNameKey, + kIOPropertyProductRevisionLevelKey, + kIOPropertyPortDescriptionKey, + kIOPropertyPortSpeedKey, + kIOPropertyPortTopologyKey, + kIOPropertySCSIParallelSignalingTypeKey, + kIOPropertyFibreChannelCableDescriptionKey, + kIOPropertyFibreChannelNodeWorldWideNameKey, + kIOPropertyFibreChannelPortWorldWideNameKey, + kIOPropertyFibreChannelAddressIdentifierKey, + kIOPropertyFibreChannelALPAKey, and + kIOPropertySASAddressKey. + NB: These keys and their values are described in <IOKit/storage/IOStorageDeviceCharacteristics.h> + and <IOKit/storage/IOStorageProtocolCharacteristics.h> + @param value Pointer to an OSObject (one of type OSData, OSString, etc.) + which represents the value for the property. The value must be of the proper type, + and/or size for the specified key. + @result returns true if identifier was properly set, otherwise false. + */ + + bool SetHBAProperty ( const char * key, + OSObject * value ); + + /*! + @function RemoveHBAProperty + @abstract Accessor for removing a property for this object. + @param key A pointer to a valid OSString object which represents the key. + See the SetHBAProperty() method for a list of valid keys. + */ + + void RemoveHBAProperty ( const char * key ); + + // These methods will not be called before the InitializeController() call, + // and will not be called after the TerminateController() call. But in the + // interval between those calls, they shall report the correct requested + // information. They are implemented as seperate pure virtual methods + // instead of a selector driven method because the HBA child class is + // required to report this information. + + /*! + @function ReportInitiatorIdentifier + @abstract Get the SCSI Device Identifier for the HBA. + @discussion This method will be called to determine the SCSI Device + Identifier that the Initiator has assigned for this HBA. + @result returns SCSIInitiatorIdentifier. + */ + + virtual SCSIInitiatorIdentifier ReportInitiatorIdentifier ( void ) = 0; + + /*! + @function ReportHighestSupportedDeviceID + @abstract Get the highest supported SCSI Device Identifier. + @discussion This method will be called to determine the value of the + highest SCSI Device Identifier supported by the HBA. This value will be + used to determine the last ID to process. + @result returns highest SCSIDeviceIdentifier + */ + + virtual SCSIDeviceIdentifier ReportHighestSupportedDeviceID ( void ) = 0; + + /*! + @function ReportMaximumTaskCount + @abstract Report Maximum Task Count + @discussion This method will be called to retrieve the maximum number of + outstanding tasks the HBA can process. This number must be greater than + zero or the controller driver will fail to match and load. + @result returns maximum (non-zero) task count. + */ + + virtual UInt32 ReportMaximumTaskCount ( void ) = 0; + + /*! + @function ReportHBASpecificTaskDataSize + @abstract Determine memory needed for HBA Task specific use. + @discussion This method is used to retrieve the amount of memory that + will be allocated in the SCSI Parallel Task for HBA specific use. + @result returns memory required in bytes + */ + + virtual UInt32 ReportHBASpecificTaskDataSize ( void ) = 0; + + /*! + @function ReportHBASpecificDeviceDataSize + @abstract Determine memory needed for HBA Device specific use. + @discussion This method is used to retrieve the amount of memory that + will be allocated in the SCSI Parallel Device for HBA specific use. + @result returns memory required in bytes + */ + + virtual UInt32 ReportHBASpecificDeviceDataSize ( void ) = 0; + + /*! + @function DoesHBAPerformDeviceManagement + @abstract Determine if HBA will manage devices. + @discussion This method is used to determine if the HBA will manage + target device creation and destruction. + @result return true means objects for target devices will only be + created when the child class calls the CreateTargetForID method. + */ + + virtual bool DoesHBAPerformDeviceManagement ( void ) = 0; + + // ---- Initialize and Terminate methods for the subclass to implement ----- + // The subclass shall not override the IOKit init and terminate methods, + // but shall instead rely on these methods for initialization and + // termination. + + // This is done to allow for this superclass to manage all IOKit specifics + // and to require only a Family specific API to be implemented by the + // subclass drivers. + + /*! + @function InitializeController + @abstract Called to initialize the controller + @discussion It is guaranteed that the InitializeController() will only be + called once per instantiation. The InitializeController() methods allows + the subclass driver to do all the necessary initialization required by + the hardware before it is able to accept requests to execute. All + necessary allocation of resources should be made during this method + call. This is the first method that will be called in the subclass. + @result return true means that initialization was successful. + */ + + virtual bool InitializeController ( void ) = 0; + + /*! + @function TerminateController + @abstract Called to terminate the controller + @discussion It is guaranteed that the TerminateController() will only be + called once and only after the InitializeController() method and only if + true was returned in response to the InitializeController() method. + The TerminateController() method allows the subclass to release all + resources that were acquired for operation of the hardware and shutdown + all hardware services. + This is the last method of the subclass that will be called before the + class is destroyed. + */ + + virtual void TerminateController ( void ) = 0; + + // ---- Start and Stop methods for the subclass ---- + + /*! + @function StartController + @abstract Called to start the controller + @discussion The StartController will always be called before any + requests are sent to the driver for execution. This method is called + after an initialize to start the services provided by the specific HBA + driver or called after a StopController call to restart those services. + After this call completes, all services provided by the HBA driver are + available to the client. + @result return true means that start was successful. + */ + + virtual bool StartController ( void ) = 0; + + /*! + @function StopController + @abstract Called to stop the controller + @discussion The StopController method will be called any time that the + system wants the card to stop accepting requests. ( See StartController + discussion ). The subclass should disable the hardware interrupt for + the particular controller (if possible) in this method. + */ + + virtual void StopController ( void ) = 0; + + // ---- Suspend and Resume Methods for the subclass ---- + + /*! + @function SuspendServices + @abstract Called to suspend controller services + @discussion Method will be called when the system wants to suspend the + services that are provided by the HBA driver. This call is not a reset + and the driver shall retain all state data between this so that if a + ResumeServices call is received, the driver can continue providing + services without a visible difference to the client. The driver may + receive multiple SuspendServices calls without receiving a + ResumeServices call and should ignore any after the first until a + ResumeServices call is received. + */ + + virtual void SuspendServices ( void ); + + /*! + @function ResumeServices + @abstract Called to resume controller services + @discussion Method that will be called to resume services + provided by the driver. ( See SuspendServices discussion ) + */ + + virtual void ResumeServices ( void ); + + /*! + @function HandleInterruptRequest + @abstract Handle Interrupt Request + @discussion The HandleInterruptRequest is used to notify an HBA + specific subclass that an interrupt request needs to be serviced. It is + called on the workloop (it holds the gate) at secondary interrupt level. + */ + + virtual void HandleInterruptRequest ( void ) = 0; + + /*! + @function EnableInterrupt + @abstract Enable Interrupt + @discussion Method that the HBA child class can call to enable + the associated IOInterruptEventSource. + */ + + void EnableInterrupt ( void ); + + /*! + @function DisableInterrupt + @abstract Disable Interrupt + @discussion Method that the HBA child class can call to disable + the associated IOInterruptEventSource. + */ + + void DisableInterrupt ( void ); + + /*! + @function SignalInterrupt + @abstract Signals that an interrupt has occurred. + @discussion Subclasses of IOSCSIParallelInterfaceController + should call this method in order to get the secondary interrupt + thread scheduled if and only if they will be returning false from + their overriden FilterInterruptRequest() method. See the + discussion for the FilterInterruptRequest() method for more + details. + + NOTE: This method should only be called from within the + FilterInterruptRequest() method and at no other time. + + Available in 10.3.3 or later. + + */ + + void SignalInterrupt ( void ); + + /*! + @function ProcessParallelTask + @abstract Called by client to process a parallel task. + @discussion This method is called to process a parallel task (i.e. put + the command on the bus). The HBA specific sublcass must implement this + method. + @param parallelRequest A valid SCSIParallelTaskIdentifier. + @result serviceResponse (see <IOKit/scsi/SCSITask.h>) + */ + + virtual SCSIServiceResponse ProcessParallelTask ( + SCSIParallelTaskIdentifier parallelRequest ) = 0; + + /*! + @function CompleteParallelTask + @abstract Parallel Task Completion + @discussion The HBA specific sublcass inherits the CompleteParallelTask() + method which shall be called when the HBA has completed the processing + of a parallel task. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @param completionStatus The status of the SCSI bus. + @param serviceResponse (see <IOKit/scsi/SCSITask.h>) + */ + + void CompleteParallelTask ( + SCSIParallelTaskIdentifier parallelRequest, + SCSITaskStatus completionStatus, + SCSIServiceResponse serviceResponse ); + + + // Completion routines for the SCSI Task Management functions as described + // in the SCSI ArchitectureModel - 2 (SAM-2) specification. Each of these + // correspond to a client request for the specific Task Management functions. + // If the Controller Child Class completed the request by returning a + // SCSIServiceResponse of anything other than kSCSIServiceResponse_Request_In_Process, + // then the controller class does not need to call the completion member routine. + // If the controller did not complete the request immediately, then it will + // need to call the appropriate completion member routine listed here. + void CompleteAbortTask ( + SCSITargetIdentifier theT, + SCSILogicalUnitNumber theL, + SCSITaggedTaskIdentifier theQ, + SCSIServiceResponse serviceResponse ); + + void CompleteAbortTaskSet ( + SCSITargetIdentifier theT, + SCSILogicalUnitNumber theL, + SCSIServiceResponse serviceResponse ); + + void CompleteClearACA ( + SCSITargetIdentifier theT, + SCSILogicalUnitNumber theL, + SCSIServiceResponse serviceResponse ); + + void CompleteClearTaskSet ( + SCSITargetIdentifier theT, + SCSILogicalUnitNumber theL, + SCSIServiceResponse serviceResponse ); + + void CompleteLogicalUnitReset ( + SCSITargetIdentifier theT, + SCSILogicalUnitNumber theL, + SCSIServiceResponse serviceResponse ); + + void CompleteTargetReset ( + SCSITargetIdentifier theT, + SCSIServiceResponse serviceResponse ); + + /*! + @function NotifyClientsOfBusReset + @abstract Method called to notify clients that a bus reset has occurred. + @discussion This method is used by the HBA child class to inform the + parent class and any clients that a bus reset has occurred. + */ + + void NotifyClientsOfBusReset ( void ); + + /*! + @function NotifyClientsOfPortStatusChange + @abstract Method called to notify clients of port status change events. + @discussion This method is used by the HBA child class to inform the + parent class and any clients that a port has changed status. + */ + + void NotifyClientsOfPortStatusChange ( SCSIPortStatus newStatus ); + + /*! + @function GetSCSIDomainIdentifier + @abstract Accessor method to get the SCSI Domain Identifier. + @discussion Accessor method to get the SCSI Domain Identifier. + @result returns SCSI Domain Identifier. + */ + + SInt32 GetSCSIDomainIdentifier ( void ); + + /*! + @function GetProvider + @abstract Accessor method to get the IOService which is the controller's + provider. + @discussion Accessor method to get the IOService which is the + controller's provider. + @result returns pointer to IOService. + */ + + IOService * GetProvider ( void ); + + /*! + @function GetWorkLoop + @abstract Accessor method to get the IOWorkLoop associated with this + HBA. + @discussion Accessor method to get the IOWorkLoop associated with this + HBA. + @result returns pointer to IOWorkLoop. + */ + + IOWorkLoop * GetWorkLoop ( void ) const; + + /*! + @function GetCommandGate + @abstract Accessor to get an IOCommandGate associated with the workloop. + @discussion Accessor to get an IOCommandGate associated with the + workloop. + @result returns pointer to IOCommandGate. + */ + + IOCommandGate * GetCommandGate ( void ); + + // ---- SCSI Parallel Task Object Accessors ---- + + /*! + @function GetSCSITaskIdentifier + @abstract Method to retrieve a SCSITaskIdentifier from a valid + SCSIParallelTaskIdentifier. + @discussion Method to retrieve a SCSITaskIdentifier from a valid + SCSIParallelTaskIdentifier. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @result returns SCSITaskIdentifier that represents the original request + from the SCSI Application Layer client. + */ + + SCSITaskIdentifier GetSCSITaskIdentifier ( + SCSIParallelTaskIdentifier parallelTask ); + + /*! + @function GetTargetIdentifier + @abstract Method to get the SCSITargetIdentifier associated with a + request. + @discussion Method to get the SCSITargetIdentifier associated with a + request. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @result returns SCSITargetIdentifier + */ + + SCSITargetIdentifier GetTargetIdentifier ( + SCSIParallelTaskIdentifier parallelTask ); + + // ---- Methods for Accessing data in the client's SCSI Task Object ---- + // Method to retrieve the LUN that identifies the Logical Unit whose Task + // Set to which this task is to be added. + + /*! + @function GetLogicalUnitNumber + @abstract Method to get the logical unit number associated with a + request. + @discussion Method to get the logical unit number associated with a + request. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @result returns a valid 64-bit logical unit number. + */ + + SCSILogicalUnitNumber GetLogicalUnitNumber ( + SCSIParallelTaskIdentifier parallelTask ); // DEPRECATED, use GetLogicalUnitBytes instead. + + /*! + @function GetLogicalUnitBytes + @abstract Method to get the logical unit bytes associated with a + request. + @discussion Method to get the logical unit bytes associated with a + request. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @result returns a valid 8-byte logical unit address. + */ + + void GetLogicalUnitBytes ( + SCSIParallelTaskIdentifier parallelTask, + SCSILogicalUnitBytes * logicalUnitBytes ); + + /*! + @function GetTaggedTaskIdentifier + @abstract Method to retrieve the SCSI Tagged Task Identifier of the + task. If the returned value is equal to kSCSIUntaggedTaskIdentifier, + then this task is untagged. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @result an SCSITaskAttribute value. + */ + + SCSITaggedTaskIdentifier GetTaggedTaskIdentifier ( + SCSIParallelTaskIdentifier parallelTask ); + + /*! + @function GetTaskAttribute + @abstract Method to retrieve the SCSI Task Attribute of the task + @param parallelTask A valid SCSIParallelTaskIdentifier. + @result an SCSITaskAttribute value. + */ + + SCSITaskAttribute GetTaskAttribute ( + SCSIParallelTaskIdentifier parallelTask ); + + /*! + @function GetCommandDescriptorBlockSize + @abstract Method to retrieve the size of the SCSI Command Descriptor + Block (CDB). + @param parallelTask A valid SCSIParallelTaskIdentifier. + @result returns the size of the SCSI Command Descriptor Block in bytes. + */ + + UInt8 GetCommandDescriptorBlockSize ( + SCSIParallelTaskIdentifier parallelTask ); + + /*! + @function GetCommandDescriptorBlock + @abstract Method to retrieve the SCSI Command Descriptor Block (CDB). + @discussion This will always return a 16 Byte CDB. If the Protocol Layer + driver does not support 16 Byte CDBs, it will have to create a local + SCSICommandDescriptorBlock variable to get the CDB data and then + transfer the needed bytes from there. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @param cdbData is a SCSICommandDescriptorBlock pointer to 16 byte CDB + @result returns true if data was copied to cdbData pointer + */ + + bool GetCommandDescriptorBlock ( + SCSIParallelTaskIdentifier parallelTask, + SCSICommandDescriptorBlock * cdbData ); + + /*! + @function GetDataTransferDirection + @abstract Retrieves the data transfer direction for any data associated + with the request. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @result One of the valid data transfer directions described in + <IOKit/scsi/SCSITask.h> + */ + + UInt8 GetDataTransferDirection ( SCSIParallelTaskIdentifier parallelTask ); + + /*! + @function GetRequestedDataTransferCount + @abstract Retrieves the requested data transfer count for any data + associated with the request. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @result The requested data transfer count in bytes. + */ + + UInt64 GetRequestedDataTransferCount ( + SCSIParallelTaskIdentifier parallelTask ); + + /*! + @function GetRealizedDataTransferCount + @abstract Retrieves the realized data transfer count for any data + associated with the request. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @result The realized data transfer count in bytes. + */ + + UInt64 GetRealizedDataTransferCount ( + SCSIParallelTaskIdentifier parallelTask ); + + /*! + @function SetRealizedDataTransferCount + @abstract Sets the realized data transfer count in bytes. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @param realizedTransferCountInBytes is the number of bytes actually + transferred. + @result true means the data transfer count was successfully set. + */ + + bool SetRealizedDataTransferCount ( + SCSIParallelTaskIdentifier parallelTask, + UInt64 realizedTransferCountInBytes ); + + /*! + @function IncrementRealizedDataTransferCount + @abstract Increments the realized data transfer count. This method is + helpful for when the HBA has to do multiple passes of DMA because there + are more scatter-gather elements than it can process in one pass. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @param realizedTransferCountInBytes is the number of bytes to add to the + realized data count for the task. + */ + + void IncrementRealizedDataTransferCount ( + SCSIParallelTaskIdentifier parallelTask, + UInt64 realizedTransferCountInBytes ); + + /*! + @function GetDataBuffer + @abstract Method to retrieve client buffer from the request. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @result returns pointer to an IOMemoryDescriptor which represents the + buffer. + */ + + IOMemoryDescriptor * GetDataBuffer ( + SCSIParallelTaskIdentifier parallelTask ); + + /*! + @function GetDataBufferOffset + @abstract Method to retrieve offset into client buffer at which to start + processing. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @result returns offset in bytes + */ + + UInt64 GetDataBufferOffset ( SCSIParallelTaskIdentifier parallelTask ); + + /*! + @function GetDMACommand + @abstract Method to retrieve a pointer to an IODMACommand from the request. + @discussion For devices utilizing DMA, the IODMACommand object should be + obtained via GetDMACommand(). The subclass is responsible for calling prepare() + on the IODMACommand object using the proper offset obtained via GetDataBufferOffset() + and correct size obtained via GetRequestedDataTransferCount(). The subclass + is further responsible for calling complete() on the IODMACommand object once + all DMA operations have finished. + NB: Subclasses should not call IODMACommand::setMemoryDescriptor(). + @param parallelTask A valid SCSIParallelTaskIdentifier. + @result returns pointer to an IODMACommand which is used in conjunction + with the task. + */ + + IODMACommand * GetDMACommand ( + SCSIParallelTaskIdentifier parallelTask ); + + /*! + @function GetTimeoutDuration + @abstract Method to retrieve the timeout duration in milliseconds for a + request. + @discussion Method to retrieve the timeout duration in milliseconds for + a request. A value of zero represents an infinite timeout, or on + hardware where infinite timeouts are not possible, substitute the + longest timeout possible. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @result returns timeout duration in milliseconds + */ + + UInt32 GetTimeoutDuration ( SCSIParallelTaskIdentifier parallelTask ); + + /*! + @function SetAutoSenseData + @abstract Method to set the auto sense data buffer associated with a + request. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @param newSensedata pointer to auto sense data buffer + @result returns true if data in newSenseData was succesfully into the + task object + */ + + bool SetAutoSenseData ( + SCSIParallelTaskIdentifier parallelTask, + SCSI_Sense_Data * newSenseData, + UInt8 senseDataSize ); + + /*! + @function GetAutoSenseData + @abstract Method to retrieve auto sense data buffer associated with a + request. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @param receivingBuffer pointer to auto sense data buffer + @result returns true if successfully copied data into receivingBuffer + */ + + bool GetAutoSenseData ( + SCSIParallelTaskIdentifier parallelTask, + SCSI_Sense_Data * receivingBuffer, + UInt8 senseDataSize ); + + /*! + @function GetAutoSenseDataSize + @abstract Method to retrieve auto sense data buffer size associated with a + request. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @result returns Size of auto sense data buffer. + */ + + UInt8 GetAutoSenseDataSize ( + SCSIParallelTaskIdentifier parallelTask ); + + + /*! + @function GetSCSIParallelFeatureNegotiation + @abstract Method to retrieve the requested value for negotiation of the. + @discussion Query as to whether the SCSI Parallel Device object has + negotiated wide data transfers. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @result A valid SCSIParallelFeatureControl. + */ + + SCSIParallelFeatureRequest GetSCSIParallelFeatureNegotiation ( + SCSIParallelTaskIdentifier parallelTask, + SCSIParallelFeature requestedFeature ); + + /*! + @function GetSCSIParallelFeatureNegotiationCount + @abstract Method to retrieve the number of requested negotiations. + @discussion Query as to the number of SCSI Parallel Features that are + requested to either be negotitated or cleared. These are all features + that are set to either kSCSIParallelFeature_AttemptNegotiation or + kSCSIParallelFeature_ClearNegotiation. If the return value is zero, + then all features are set to kSCSIParallelFeature_NoNegotiation + and all feature negotiations are to remain as they currently exist. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @result an unsigned integer up to 64 bits in size. + */ + + UInt64 GetSCSIParallelFeatureNegotiationCount ( + SCSIParallelTaskIdentifier parallelTask); + + /*! + @function SetSCSIParallelFeatureNegotiationResult + @abstract Method to set the wide data transfer negotiation result. + @discussion Method to set the wide data transfer negotiation result. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @param requestedFeature The SCSIParallelFeature that the has been set to + newResult. + @param newResult A valid SCSIParallelFeatureResult value. + */ + + void SetSCSIParallelFeatureNegotiationResult ( + SCSIParallelTaskIdentifier parallelTask, + SCSIParallelFeature requestedFeature, + SCSIParallelFeatureResult newResult ); + + /*! + @function GetSCSIParallelFeatureNegotiationResult + @abstract Method to retrieve the result of any wide transfer + negotiations. + @discussion Query as to whether the SCSI Parallel Controller object has + negotiated wide data transfers. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @result A valid SCSIParallelFeatureResult. + */ + + SCSIParallelFeatureResult GetSCSIParallelFeatureNegotiationResult ( + SCSIParallelTaskIdentifier parallelTask, + SCSIParallelFeature requestedFeature ); + + /*! + @function GetSCSIParallelFeatureNegotiationResultCount + @abstract Method to retrieve the number of changed negotiations. + @discussion Query as to the number of SCSI Parallel Features that have + been changed to either negotitated or cleared. These are all features + that are set to either kSCSIParallelFeature_NegotitiationCleared or + kSCSIParallelFeature_NegotitiationSuccess. If the return value is zero, + then all features are set to kSCSIParallelFeature_NegotitiationUnchanged. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @result an unsigned integer up to 64 bits in size. + */ + + UInt64 GetSCSIParallelFeatureNegotiationResultCount ( + SCSIParallelTaskIdentifier parallelTask); + + // Controller Task Identifier related member routines + + /*! + @function SetControllerTaskIdentifier + @abstract Method to set the Controller Task Identifier. + @discussion This method allows the Controller Child Class + driver to set a unique identifier to associate with the specified + SCSI Parallel Task. This identifier is designed to be used by + controllers that do not have access to the LUN and Tag information + when notified by the HBA that a request has completed. + If the kSCSIParallelTaskControllerIDQueueHead is used, this + member routine will return the first Task on the queue. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @param newIdentifier unsigned 64 bit integer token. + @result none + */ + + void SetControllerTaskIdentifier ( + SCSIParallelTaskIdentifier parallelTask, + UInt64 newIdentifier ); + + UInt64 GetControllerTaskIdentifier ( + SCSIParallelTaskIdentifier parallelTask); + + + // The HBA Data related fields + + /*! + @function GetHBADataSize + @abstract Method to retrieve the HBA Data Size in bytes. + @discussion Method to retrieve the HBA Data Size in bytes. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @result returns HBA Data size in bytes. + */ + + UInt32 GetHBADataSize ( SCSIParallelTaskIdentifier parallelTask ); + + /*! + @function GetHBADataPointer + @abstract Method to retrieve the HBA Data pointer. + @discussion Method to retrieve the HBA Data pointer. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @result returns pointer to buffer for HBA specific data, NULL if + none found or GetHBADataSize() returns zero. + */ + + void * GetHBADataPointer ( SCSIParallelTaskIdentifier parallelTask ); + + /*! + @function GetHBADataDescriptor + @abstract Method to retrieve the IOMemoryDescriptor associated with + the HBA Data. + @discussion Method to retrieve the IOMemoryDescriptor associated with + the HBA Data. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @result returns pointer to an IOMemoryDescriptor that wraps the HBA + specific data buffer, NULL if none found or GetHBADataSize() returns zero. + */ + + IOMemoryDescriptor * GetHBADataDescriptor ( + SCSIParallelTaskIdentifier parallelTask ); + + // ---- SCSI Parallel Device Object Accessors ---- + + // The HBA Data related fields + + /*! + @function GetHBATargetDataSize + @abstract Method to retrieve the HBA Data Size in bytes. + @discussion Method to retrieve the HBA Data Size in bytes. + @param targetDevice A valid SCSITargetIdentifier. + @result returns HBA Data size in bytes. + */ + + UInt32 GetHBATargetDataSize ( SCSITargetIdentifier targetID ); + + /*! + @function GetHBATargetDataPointer + @abstract Method to retrieve the HBA Data pointer. + @discussion Method to retrieve the HBA Data pointer. + @param targetDevice A valid SCSITargetIdentifier. + @result returns pointer to buffer for HBA specific data, NULL if + none found or GetHBADataSize is zero. + */ + + void * GetHBATargetDataPointer ( SCSITargetIdentifier targetID ); + + +#if 0 +#pragma mark - +#pragma mark Additional Child Class APIs +#endif + + + // ---- Timeout Related Methods ---- + + /*! + @function SetTimeoutForTask + @abstract Method to set the timeout duration in milliseconds for a + request. + @discussion Method to set the timeout duration in milliseconds for a + request. + @param parallelTask A valid SCSIParallelTaskIdentifier. + @param timeoutOverride A timeout value in milliseconds in case the + HBA driver wishes to override the default value provided in the + parallelTask. + */ + + void SetTimeoutForTask ( SCSIParallelTaskIdentifier parallelTask, + UInt32 timeoutOverride = 0 ); + + /*! + @function HandleTimeout + @abstract Method to handle command timeouts. + @discussion Method to handle command timeouts. This should + be overridden by the child class in order to clean up HBA + specific structures after a timeout has occurred. This method + is called on the workloop (it holds the gate). + @param parallelRequest A valid SCSIParallelTaskIdentifier. + */ + + OSMetaClassDeclareReservedUsed ( IOSCSIParallelInterfaceController, 9 ); + + virtual void HandleTimeout ( + SCSIParallelTaskIdentifier parallelRequest ); + + + // ---- Filter Interrupt ---- + + /*! + @function FilterInterruptRequest + @abstract Filter method called at primary interrupt time. + @discussion Filter method called at primary interrupt time. + This should only be overridden by the child class in order + to determine if an interrupt occurred for this controller instance. + Since all work occurs at primary interrupt time, this routine + should be quick and efficient and defer as much processing as + possible to the HandleInterruptRequest() method. + + NOTE: Unlike the HandleInterruptRequest() and HandleTimeout() + methods, FilterInterruptRequest() is NOT called with the + workloop lock held. + + If the value returned by FilterInterruptRequest() is true, the + secondary interrupt thread will be scheduled and the hardware + interrupt line will be disabled. If the controller instance shares + that interrupt line with other devices, it can cause large + interrupt latencies. If the controller instance can disable the + interrupt in the chip itself, the following can be done to reduce + interrupt latencies: + + - Interrupt occurs + - FilterInterruptRequest() method is called. + - If the interrupt is not for this controller, return false + immediately. + - If the interrupt is for this controller, and the controller + can disable interrupts for this chip, the controller should + disable the interrupts for this chip, call SignalInterrupt(), + and return false. This causes the secondary interrupt thread + to get scheduled, yet does not disable the interrupt line for + all devices tied to that interrupt. This effectively allows + other devices to process their interrrupts, thus reducing + interrupt latency for those devices. + - HandleInterruptRequest() method is called. + - Controller processes interrupt and completes I/O requests. + - Controller re-enables interrupts for the device. + + NOTE: If you use this approach, the interrupting condition MUST be + cleared from the hardware, otherwise an infinite process interrupt + loop will occur. + + If the controller cannot disable interrupts on the chip, it should + simply return true if an interrupt has occurred for its device. + + @result True if the hardware interrupt line should be disabled, + otherwise false. + */ + + OSMetaClassDeclareReservedUsed ( IOSCSIParallelInterfaceController, 10 ); + + virtual bool FilterInterruptRequest ( void ); + + /*! + @function InitializeDMASpecification + @abstract Called to initialize an IODMACommand with a DMA specification. + @param command A pointer to a valid IODMACommand object. Subclasses + should override this method and call IODMACommand::initWithSpecification() + supplying the proper arguments to that method based on the DMA strategy. + @result boolean value indicating success or failure. + */ + OSMetaClassDeclareReservedUsed ( IOSCSIParallelInterfaceController, 11 ); + + virtual bool InitializeDMASpecification ( IODMACommand * command ); + + /*! + @function CreateDeviceInterrupt + @abstract Called to create an IOInterruptEventSource for the device. Subclasses + may wish to use a different interrupt index than 0 (e.g. for using PCI Message + Signaled Interrupts) or might not need an interrupt at all (virtual HBA). + @param action A pointer to the action routine that should be passed to either + IOInterruptEventSource::interruptEventSource() or + IOFilterInterruptEventSource::filterInterruptEventSource as the method to call + when an interrupt occurs for the device (sometimes called the "deferred procedure call" + or the "secondary context method". By passing this routine along, it will + properly wire up the HandleInterruptRequest() method you should override to handle + interrupts. + @param filter A pointer to the filter routine that should be passed to + IOFilterInterruptEventSource::filterInterruptEventSource as the method to call + at primary interrupt time when an interrupt occurs for the device. + By passing this routine along, it will properly wire up the + FilterInterruptRequest() method you may override to handle primary interrupts. + @result IOInterruptEventSource. May return NULL if and only if there is no + hardware interrupt associated with this device. + */ + OSMetaClassDeclareReservedUsed ( IOSCSIParallelInterfaceController, 12 ); + + virtual IOInterruptEventSource * CreateDeviceInterrupt ( + IOInterruptEventSource::Action action, + IOFilterInterruptEventSource::Filter filter, + IOService * provider ); + + // Padding for the Child Class API + OSMetaClassDeclareReservedUnused ( IOSCSIParallelInterfaceController, 13 ); + OSMetaClassDeclareReservedUnused ( IOSCSIParallelInterfaceController, 14 ); + OSMetaClassDeclareReservedUnused ( IOSCSIParallelInterfaceController, 15 ); + OSMetaClassDeclareReservedUnused ( IOSCSIParallelInterfaceController, 16 ); + + +#if 0 +#pragma mark - +#pragma mark Internal Use Only +#endif + +private: + + // binary compatibility instance variable expansion + struct ExpansionData { }; + ExpansionData * fIOSCSIParallelInterfaceControllerExpansionData; + + IOService * fProvider; + OSSet * fClients; + + static SInt32 fSCSIParallelDomainCount; + SInt32 fSCSIDomainIdentifier; + + // The HBA attributes + SCSIInitiatorIdentifier fInitiatorIdentifier; + + // The maximum SCSI Device Identifier support by the HBA + // This is retreived from the child class via the + SCSIDeviceIdentifier fHighestSupportedDeviceID; + + // The total number of tasks that the HBA can proccess at a time. + // This is retrieved from the child class via ReportMaximumTaskCount + UInt32 fSupportedTaskCount; + + // The Number of requests that are currently outstanding for the current + // instantiation. + UInt16 fOutstandingRequests; + + // The member variable to indicate if the current instantiation has been + // succesfully intialized. + bool fHBAHasBeenInitialized; + + // The member variable to indicate if the current instantiation is running. + // A true means that the last or only Start call made was successful. A + // false value means that either a successful Start has not been made or a + // Stop call has been made. + bool fHBACanAcceptClientRequests; + + // The pool for the available SCSI Parallel Task objects + IOCommandPool * fParallelTaskPool; + + // WorkLoop variables + IOWorkLoop * fWorkLoop; + IOTimerEventSource * fTimerEvent; + IOInterruptEventSource * fDispatchEvent; + + IOCommandGate * fControllerGate; + + bool AllocateSCSIParallelTasks ( void ); + void DeallocateSCSIParallelTasks ( void ); + + IOWorkLoop * getWorkLoop ( void ) const APPLE_KEXT_OVERRIDE; + bool CreateWorkLoop ( IOService * provider ); + void ReleaseWorkLoop ( void ); + + // SCSI Parallel Device List + // The SCSI Parallel Device List will consist of 16 elements to represent + // identifiers that end in 0h through Fh. Each array element will point + // to a device object that represents the beginning of a linked list of + // device objects. By using an array of linked lists, the traversal time + // to find an object on a bus that supports a large number of devices, such + // as Fibre Channel, will be significantly lower than having to walk a list + // that is comprised of all devices on the bus. For parallel wide and + // narrow busses, which support 16 and 8 devices respectively, this will act + // like a simple array of device objects. + enum + { + kSCSIParallelDeviceListArrayCount = 16, + kSCSIParallelDeviceListIndexMask = 0x0F + }; + + IOSimpleLock * fDeviceLock; + IOSCSIParallelInterfaceDevice * + fParallelDeviceList[kSCSIParallelDeviceListArrayCount]; + + void InitializeDeviceList ( void ); + void AddDeviceToTargetList ( + IOSCSIParallelInterfaceDevice * newDevice ); + void RemoveDeviceFromTargetList ( + IOSCSIParallelInterfaceDevice * victimDevice ); + + // The Interrupt Service Routine for the controller. + static void ServiceInterrupt ( + OSObject * theObject, + IOInterruptEventSource * theSource, + int count ); + + static void TimeoutOccurred ( OSObject * owner, IOTimerEventSource * sender ); + + static bool FilterInterrupt ( + OSObject * theObject, + IOFilterInterruptEventSource * theSource ); + + // IOService support methods + // These shall not be overridden by the HBA child classes. + bool start ( IOService * provider ) APPLE_KEXT_OVERRIDE; + void stop ( IOService * provider ) APPLE_KEXT_OVERRIDE; + + +protected: + + // These may be overriden by the HBA child classes if necessary, but should + // call the superclass implementation. + virtual bool handleOpen ( + IOService * client, + IOOptionBits options, + void * arg ) APPLE_KEXT_OVERRIDE; + + virtual void handleClose ( + IOService * client, + IOOptionBits options ) APPLE_KEXT_OVERRIDE; + + virtual bool handleIsOpen ( + const IOService * client ) const APPLE_KEXT_OVERRIDE; + + virtual bool willTerminate ( IOService * provider, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + virtual bool didTerminate ( IOService * provider, IOOptionBits options, bool * defer ) APPLE_KEXT_OVERRIDE; + virtual void free ( void ) APPLE_KEXT_OVERRIDE; + + +}; + + +#endif /* __IOKIT_IO_SCSI_PARALLEL_INTERFACE_CONTROLLER_H__ */ diff --git a/QualcommWireless/include/IOKit/serial/IOModemSerialStreamSync.h b/QualcommWireless/include/IOKit/serial/IOModemSerialStreamSync.h new file mode 100644 index 0000000..be75287 --- /dev/null +++ b/QualcommWireless/include/IOKit/serial/IOModemSerialStreamSync.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * + * IOModemSerialStreamSync.h + * This file contains Modem specific extensions to the IOSerialStreamSync class. + * + * 2000-10-21 gvdl Initial real change to IOKit serial family. + * + */ + +#ifndef _SERIAL_IOMODEMSERIALSTREAMSYNC_H +#define _SERIAL_IOMODEMSERIALSTREAMSYNC_H + +#include <IOKit/serial/IOSerialStreamSync.h> + +class IOModemSerialStreamSync : public IOSerialStreamSync +{ + OSDeclareDefaultStructors(IOModemSerialStreamSync) +}; + +#endif /* !_SERIAL_IOMODEMSERIALSTREAMSYNC_H */ + diff --git a/QualcommWireless/include/IOKit/serial/IORS232SerialStreamSync.h b/QualcommWireless/include/IOKit/serial/IORS232SerialStreamSync.h new file mode 100644 index 0000000..15d520a --- /dev/null +++ b/QualcommWireless/include/IOKit/serial/IORS232SerialStreamSync.h @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/* + * IORS232SerialStreamSync.h + * This file contains RS232 specific extensions to the IOSerialStreamSync class. + * + * 2000-10-21 gvdl Initial real change to IOKit serial family. + */ + +#ifndef _SERIAL_IORS232SERIALSTREAMSYNC_H +#define _SERIAL_IORS232SERIALSTREAMSYNC_H + +#include <sys/ioctl.h> +#include <IOKit/serial/IOSerialStreamSync.h> + +/* + * Extra events for RS232 based PortDevices + */ + +#define PD_RS232_E_RX_LINE_BREAK (PD_DATA_VOID|PD_OP(63)) // line break was received +#define PD_RS232_E_LINE_BREAK (PD_DATA_BYTE|PD_OP(62)) // BOOL set/clear line break + +#define PD_RS232_E_RX_STOP_BITS (PD_DATA_LONG|PD_OP(61)) // half stop bits +#define PD_RS232_E_STOP_BITS (PD_DATA_LONG|PD_OP(60)) // half stop bits + +#define PD_RS232_E_XON_BYTE (PD_DATA_BYTE|PD_OP(59)) // The XON char for TX&RX +#define PD_RS232_E_XOFF_BYTE (PD_DATA_BYTE|PD_OP(58)) // The XOFF char for TX&RX + +#define PD_RS232_E_MIN_LATENCY (PD_DATA_BYTE|PD_OP(57)) // BOOL true if low latency req + +/* + * RS232 Parity stuff, used with the DATA_INTEGRITY event + */ +#define PD_RS232_PARITY_DEFAULT 0 // Valid only for RX, means follow TX +#define PD_RS232_PARITY_NONE 1 // No Parity bit inserted or expected +#define PD_RS232_PARITY_ODD 2 // Odd Parity bit inserted or expected +#define PD_RS232_PARITY_EVEN 3 // Even Parity bit inserted or expected +#define PD_RS232_PARITY_MARK 4 // Mark inserted or expected +#define PD_RS232_PARITY_SPACE 5 // Space inserted or expected +#define PD_RS232_PARITY_ANY 6 // Valid only for RX, means discard parity + +/* + * RS232 Flow Control specifiers, used with the FLOW_CONTROL event + * NB. The XON character is set with FLOW_START_DATA + * and the XOFF character is set with FLOW_STOP_DATA. + * + * Signal Name Direction + * RFR Ready For Receive Output generated by UART + * RTS Ready To Send (alias of RFR) Output generated by UART + * CTS Clear To Send Input sensed by UART + * DTR Data Terminal Ready Output generated by UART + * DSR Data Set Ready Input sensed by UART + * TXO XON/XOFF/XANY protocol Characters received by UART + * RXO XON/XOFF protocol Characters transmitted by UART + * DCD Data Carrier Detect Input sensed by UART + */ + +/* + * RS232 State Word extensions, based on <bsd/sys/ioctl.h> + * Also the 'current state' bits for enq/deq of Flow Control event + */ +#define PD_RS232_S_MASK 0x0000ffffUL +#define PD_RS232_S_SHIFT 0 // to align State bits for enq/deq event +#define PD_RS232_D_MASK 0xffff0000UL +#define PD_RS232_D_SHIFT 16 // to align Delta bits for enq/deq event +#define PD_RS232_A_MASK 0x0000ffffUL +#define PD_RS232_A_SHIFT 0 // to align Auto bits for req/exec event +#define PD_RS232_N_MASK 0xffff0000UL +#define PD_RS232_N_SHIFT 16 // to align Notify bits for req/exec event + +#define PD_RS232_S_LE TIOCM_LE // line enable +#define PD_RS232_S_DTR TIOCM_DTR // data terminal ready +#define PD_RS232_S_RTS TIOCM_RTS // request to send +#define PD_RS232_S_RFR PD_RS232_S_RTS // ready for receive +#define PD_RS232_S_TXO TIOCM_ST // TX XON/XOFF +#define PD_RS232_S_RXO TIOCM_SR // RX XON/XOFF +#define PD_RS232_S_CTS TIOCM_CTS // clear to send +#define PD_RS232_S_CAR TIOCM_CAR // carrier detect +#define PD_RS232_S_DCD PD_RS232_S_CAR +#define PD_RS232_S_RNG TIOCM_RNG // ring +#define PD_RS232_S_RI PD_RS232_S_RNG +#define PD_RS232_S_DSR TIOCM_DSR // data set ready + +#define PD_RS232_S_BRK 0x00000800UL // break active Extension to TIOCM +#define PD_RS232_S_LOOP 0x00001000UL // LOOP back Extension to TIOCM +#define PD_RS232_S_TXQ 0x00002000UL // User flowcontrol bit +#define PD_RS232_S_RXQ 0x00004000UL // User flowcontrol bit + +// The 'delta' bits for enq/deq of Flow Control event +#define PD_RS232_D_LE (PD_RS232_S_LE << PD_RS232_D_SHIFT) +#define PD_RS232_D_DTR (PD_RS232_S_DTR << PD_RS232_D_SHIFT) +#define PD_RS232_D_RTS (PD_RS232_S_RTS << PD_RS232_D_SHIFT) +#define PD_RS232_D_RFR (PD_RS232_S_RFR << PD_RS232_D_SHIFT) +#define PD_RS232_D_TXO (PD_RS232_S_TXO << PD_RS232_D_SHIFT) +#define PD_RS232_D_RXO (PD_RS232_S_RXO << PD_RS232_D_SHIFT) +#define PD_RS232_D_CTS (PD_RS232_S_CTS << PD_RS232_D_SHIFT) +#define PD_RS232_D_CAR (PD_RS232_S_CAR << PD_RS232_D_SHIFT) +#define PD_RS232_D_DCD (PD_RS232_S_DCD << PD_RS232_D_SHIFT) +#define PD_RS232_D_RNG (PD_RS232_S_RNG << PD_RS232_D_SHIFT) +#define PD_RS232_D_RI (PD_RS232_S_RI << PD_RS232_D_SHIFT) +#define PD_RS232_D_DSR (PD_RS232_S_DSR << PD_RS232_D_SHIFT) + +#define PD_RS232_D_BRK (PD_RS232_S_BRK << PD_RS232_D_SHIFT) +#define PD_RS232_D_LOOP (PD_RS232_S_LOOP << PD_RS232_D_SHIFT) +#define PD_RS232_D_TXQ (PD_RS232_S_TXQ << PD_RS232_D_SHIFT) +#define PD_RS232_D_RXQ (PD_RS232_S_RXQ << PD_RS232_D_SHIFT) + +// The 'auto' bits for exec/req of Flow Control event +#define PD_RS232_A_LE PD_RS232_S_LE +#define PD_RS232_A_DTR PD_RS232_S_DTR +#define PD_RS232_A_RTS PD_RS232_S_RTS +#define PD_RS232_A_RFR PD_RS232_S_RFR +#define PD_RS232_A_TXO PD_RS232_S_TXO +#define PD_RS232_A_RXO PD_RS232_S_RXO +#define PD_RS232_A_CTS PD_RS232_S_CTS +#define PD_RS232_A_CAR PD_RS232_S_CAR +#define PD_RS232_A_DCD PD_RS232_S_DCD +#define PD_RS232_A_RNG PD_RS232_S_RNG +#define PD_RS232_A_RI PD_RS232_S_RI +#define PD_RS232_A_DSR PD_RS232_S_DSR +#define PD_RS232_A_XANY 0x00000400 // changes _A_TXO from XON/XOFF to XANY/XOFF +#define PD_RS232_A_BRK PD_RS232_S_BRK +#define PD_RS232_A_LOOP PD_RS232_S_LOOP +#define PD_RS232_A_TXQ PD_RS232_S_TXQ +#define PD_RS232_A_RXQ PD_RS232_S_RXQ + +// The 'notify' bits for exec/req of Flow Control event +#define PD_RS232_N_LE (PD_RS232_S_LE << PD_RS232_N_SHIFT) +#define PD_RS232_N_DTR (PD_RS232_S_DTR << PD_RS232_N_SHIFT) +#define PD_RS232_N_RTS (PD_RS232_S_RTS << PD_RS232_N_SHIFT) +#define PD_RS232_N_RFR (PD_RS232_S_RFR << PD_RS232_N_SHIFT) +#define PD_RS232_N_TXO (PD_RS232_S_TXO << PD_RS232_N_SHIFT) +#define PD_RS232_N_RXO (PD_RS232_S_RXO << PD_RS232_N_SHIFT) +#define PD_RS232_N_CTS (PD_RS232_S_CTS << PD_RS232_N_SHIFT) +#define PD_RS232_N_CAR (PD_RS232_S_CAR << PD_RS232_N_SHIFT) +#define PD_RS232_N_DCD (PD_RS232_S_DCD << PD_RS232_N_SHIFT) +#define PD_RS232_N_RNG (PD_RS232_S_RNG << PD_RS232_N_SHIFT) +#define PD_RS232_N_RI (PD_RS232_S_RI << PD_RS232_N_SHIFT) +#define PD_RS232_N_DSR (PD_RS232_S_DSR << PD_RS232_N_SHIFT) + +#define PD_RS232_N_BRK (PD_RS232_S_BRK << PD_RS232_N_SHIFT) +#define PD_RS232_N_LOOP (PD_RS232_S_LOOP << PD_RS232_N_SHIFT) +#define PD_RS232_N_TXQ (PD_RS232_S_TXQ << PD_RS232_N_SHIFT) +#define PD_RS232_N_RXQ (PD_RS232_S_RXQ << PD_RS232_N_SHIFT) + +class IORS232SerialStreamSync : public IOSerialStreamSync +{ + OSDeclareDefaultStructors(IORS232SerialStreamSync) +}; + +#endif /* !_SERIAL_IORS232SERIALSTREAMSYNC_H */ + diff --git a/QualcommWireless/include/IOKit/serial/IOSerialDriverSync.h b/QualcommWireless/include/IOKit/serial/IOSerialDriverSync.h new file mode 100644 index 0000000..92f69df --- /dev/null +++ b/QualcommWireless/include/IOKit/serial/IOSerialDriverSync.h @@ -0,0 +1,91 @@ +/* + *Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * + *@APPLE_LICENSE_HEADER_START@ + * + *The contents of this file constitute Original Code as defined in and + *are subject to the Apple Public Source License Version 1.1 (the + *"License"). You may not use this file except in compliance with the + *License. Please obtain a copy of the License at + *http://www.apple.com/publicsource and read it before using this file. + * + *This Original Code and all software distributed under the License are + *distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + *EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + *INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + *FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + *License for the specific language governing rights and limitations + *under the License. + * + *@APPLE_LICENSE_HEADER_END@ + */ + +/* + * IOSerialDriverSync.h + * This file contains the abstract parent class for any IOSerialDriver + * interface, which is a generic serial interface, designed for devices + * that do character oriented transfers (async) rather than block or + * packet transfers. Most notably RS-232, Printer, Mouse, and Keyboard + * type devices. + * + * 2000-10-21 gvdl Initial real change to IOKit serial family. + */ + +#ifndef _SERIAL_IOSERIALDRIVERSYNC_H +#define _SERIAL_IOSERIALDRIVERSYNC_H + +#include <IOKit/IOService.h> + +class IOSerialDriverSync : public IOService +{ + OSDeclareAbstractStructors(IOSerialDriverSync); + +public: + virtual IOReturn acquirePort(bool sleep, void *refCon) = 0; + + virtual IOReturn releasePort(void *refCon) = 0; + + virtual IOReturn setState(UInt32 state, UInt32 mask, void *refCon) = 0; + + virtual UInt32 getState(void *refCon) = 0; + + virtual IOReturn watchState(UInt32 *state, UInt32 mask, void *refCon) = 0; + + virtual UInt32 nextEvent(void *refCon) = 0; + + virtual IOReturn executeEvent(UInt32 event, UInt32 data, void *refCon) = 0; + + virtual IOReturn requestEvent(UInt32 event, UInt32 *data, void *refCon) = 0; + + virtual IOReturn enqueueEvent(UInt32 event, UInt32 data, + bool sleep, void *refCon) = 0; + + virtual IOReturn dequeueEvent(UInt32 *event, UInt32 *data, + bool sleep, void *refCon) = 0; + + virtual IOReturn enqueueData(UInt8 *buffer, UInt32 size, UInt32 *count, + bool sleep, void *refCon) = 0; + + virtual IOReturn dequeueData(UInt8 *buffer, UInt32 size, UInt32 *count, + UInt32 min, void *refCon) = 0; + +OSMetaClassDeclareReservedUnused(IOSerialDriverSync, 0); +OSMetaClassDeclareReservedUnused(IOSerialDriverSync, 1); +OSMetaClassDeclareReservedUnused(IOSerialDriverSync, 2); +OSMetaClassDeclareReservedUnused(IOSerialDriverSync, 3); +OSMetaClassDeclareReservedUnused(IOSerialDriverSync, 4); +OSMetaClassDeclareReservedUnused(IOSerialDriverSync, 5); +OSMetaClassDeclareReservedUnused(IOSerialDriverSync, 6); +OSMetaClassDeclareReservedUnused(IOSerialDriverSync, 7); +OSMetaClassDeclareReservedUnused(IOSerialDriverSync, 8); +OSMetaClassDeclareReservedUnused(IOSerialDriverSync, 9); +OSMetaClassDeclareReservedUnused(IOSerialDriverSync, 10); +OSMetaClassDeclareReservedUnused(IOSerialDriverSync, 11); +OSMetaClassDeclareReservedUnused(IOSerialDriverSync, 12); +OSMetaClassDeclareReservedUnused(IOSerialDriverSync, 13); +OSMetaClassDeclareReservedUnused(IOSerialDriverSync, 14); +OSMetaClassDeclareReservedUnused(IOSerialDriverSync, 15); + +}; + +#endif /* !_SERIAL_IOSERIALDRIVERSYNC_H */ diff --git a/QualcommWireless/include/IOKit/serial/IOSerialKeys.h b/QualcommWireless/include/IOKit/serial/IOSerialKeys.h new file mode 100644 index 0000000..9538a24 --- /dev/null +++ b/QualcommWireless/include/IOKit/serial/IOSerialKeys.h @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * IOSerialKeys.h + * + * 2000-10-21 gvdl Initial real change to IOKit serial family. + * + */ + +/* +Sample Matching dictionary +{ + IOProviderClass = kIOSerialBSDServiceValue; + kIOSerialBSDTypeKey = kIOSerialBSDAllTypes + | kIOSerialBSDModemType + | kIOSerialBSDRS232Type; + kIOTTYDeviceKey = <Raw Unique Device Name>; + kIOTTYBaseNameKey = <Raw Unique Device Name>; + kIOTTYSuffixKey = <Raw Unique Device Name>; + kIOCalloutDeviceKey = <Callout Device Name>; + kIODialinDeviceKey = <Dialin Device Name>; +} + +Note only the IOProviderClass is mandatory. The other keys allow the searcher to reduce the size of the set of matching devices. +*/ + +/* Service Matching That is the 'IOProviderClass' */ +#define kIOSerialBSDServiceValue "IOSerialBSDClient" + +/* Matching keys */ +#define kIOSerialBSDTypeKey "IOSerialBSDClientType" + +/* Currently possible kIOSerialBSDTypeKey values. */ +#define kIOSerialBSDAllTypes "IOSerialStream" +#define kIOSerialBSDModemType "IOModemSerialStream" +#define kIOSerialBSDRS232Type "IORS232SerialStream" + +// Properties that resolve to a /dev device node to open for +// a particular service +#define kIOTTYDeviceKey "IOTTYDevice" +#define kIOTTYBaseNameKey "IOTTYBaseName" +#define kIOTTYSuffixKey "IOTTYSuffix" + +#define kIOCalloutDeviceKey "IOCalloutDevice" +#define kIODialinDeviceKey "IODialinDevice" + +// Property 'ioctl' wait for the tty device to go idle. +#define kIOTTYWaitForIdleKey "IOTTYWaitForIdle" + +#if KERNEL +extern const OSSymbol *gIOSerialBSDServiceValue; +extern const OSSymbol *gIOSerialBSDTypeKey; +extern const OSSymbol *gIOSerialBSDAllTypes; +extern const OSSymbol *gIOSerialBSDModemType; +extern const OSSymbol *gIOSerialBSDRS232Type; +extern const OSSymbol *gIOTTYDeviceKey; +extern const OSSymbol *gIOTTYBaseNameKey; +extern const OSSymbol *gIOTTYSuffixKey; +extern const OSSymbol *gIOCalloutDeviceKey; +extern const OSSymbol *gIODialinDeviceKey; +#endif /* KERNEL */ diff --git a/QualcommWireless/include/IOKit/serial/IOSerialStreamSync.h b/QualcommWireless/include/IOKit/serial/IOSerialStreamSync.h new file mode 100644 index 0000000..e1b8017 --- /dev/null +++ b/QualcommWireless/include/IOKit/serial/IOSerialStreamSync.h @@ -0,0 +1,275 @@ +/* + *Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * + *@APPLE_LICENSE_HEADER_START@ + * + *The contents of this file constitute Original Code as defined in and + *are subject to the Apple Public Source License Version 1.1 (the + *"License"). You may not use this file except in compliance with the + *License. Please obtain a copy of the License at + *http://www.apple.com/publicsource and read it before using this file. + * + *This Original Code and all software distributed under the License are + *distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + *EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + *INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + *FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + *License for the specific language governing rights and limitations + *under the License. + * + *@APPLE_LICENSE_HEADER_END@ + */ +/* + * IOSerialStreamSync.h + * + * 2000-10-21 gvdl Initial real change to IOKit serial family. + * + */ + +#ifndef _SERIAL_IOSERIALSTREAMSYNC_H +#define _SERIAL_IOSERIALSTREAMSYNC_H + +#include <IOKit/IOService.h> + +#ifdef __LP64__ + +#define PD_DATA_MASK 0x03U +#define PD_DATA_VOID 0x00U +#define PD_DATA_BYTE 0x01U +#define PD_DATA_WORD 0x02U +#define PD_DATA_LONG 0x03U + +#else + +#define PD_DATA_MASK 0x03UL +#define PD_DATA_VOID 0x00UL +#define PD_DATA_BYTE 0x01UL +#define PD_DATA_WORD 0x02UL +#define PD_DATA_LONG 0x03UL + +#endif + +#define PD_OP(x) ((x) << 2) +#define PD_E_MASK (~PD_DATA_MASK) + +/* General Command & Status events */ +#define PD_E_EOQ (PD_DATA_VOID|PD_OP( 0)) // Always nextEvent on empty queue +#define PD_E_ACTIVE (PD_DATA_BYTE|PD_OP( 1)) // BOOL start/shutdown chip + +/* Queue management events - all units are multiples of characters + *based on the current character size + */ +#define PD_E_TXQ_SIZE (PD_DATA_LONG|PD_OP( 2)) +#define PD_E_RXQ_SIZE (PD_DATA_LONG|PD_OP( 3)) +#define PD_E_TXQ_LOW_WATER (PD_DATA_LONG|PD_OP( 4)) +#define PD_E_RXQ_LOW_WATER (PD_DATA_LONG|PD_OP( 5)) +#define PD_E_TXQ_HIGH_WATER (PD_DATA_LONG|PD_OP( 6)) +#define PD_E_RXQ_HIGH_WATER (PD_DATA_LONG|PD_OP( 7)) +#define PD_E_TXQ_AVAILABLE (PD_DATA_LONG|PD_OP( 8)) +#define PD_E_RXQ_AVAILABLE (PD_DATA_LONG|PD_OP( 9)) +#define PD_E_TXQ_FLUSH (PD_DATA_VOID|PD_OP(10)) +#define PD_E_RXQ_FLUSH (PD_DATA_LONG|PD_OP(11)) + +/* port & link characteristics - units are half bits */ +#define PD_E_DATA_RATE (PD_DATA_LONG|PD_OP(12)) // raw bits of symbols per second +#define PD_E_RX_DATA_RATE (PD_DATA_LONG|PD_OP(13)) +#define PD_E_DATA_SIZE (PD_DATA_LONG|PD_OP(14)) // raw bits per symbol +#define PD_E_RX_DATA_SIZE (PD_DATA_LONG|PD_OP(15)) +#define PD_E_DATA_INTEGRITY (PD_DATA_LONG|PD_OP(16)) // parity or ECC method +#define PD_E_RX_DATA_INTEGRITY (PD_DATA_LONG|PD_OP(17)) +#define PD_E_EXTERNAL_CLOCK_MODE (PD_DATA_LONG|PD_OP(28)) // multiplier between clock and data rates + +/* timeout events */ +#define PD_E_DELAY (PD_DATA_LONG|PD_OP(18)) // inter-character delay (us) +#define PD_E_DATA_LATENCY (PD_DATA_LONG|PD_OP(19)) // A dequeueData Latency timeout + // rcs Secondary Timer mainly to fix performance + // problems with MIDI and IRDA drivers. + // Midi and Irda drivers will issue an IOCTL + // call with this as the selector and + // the Data as the value they want the rate set + // to (Typically 1 for IrDA devices) +#define PD_E_FLOW_CONTROL (PD_DATA_LONG|PD_OP(20)) // enable/disable each flow mechanism + +/* I/O events */ +#define PD_E_VALID_DATA (PD_DATA_VOID|PD_OP(21)) // A valid frame was received +#define PD_E_VALID_DATA_BYTE (PD_DATA_BYTE|PD_E_VALID_DATA) +#define PD_E_VALID_DATA_WORD (PD_DATA_WORD|PD_E_VALID_DATA) +#define PD_E_VALID_DATA_LONG (PD_DATA_LONG|PD_E_VALID_DATA) + +#define PD_E_SPECIAL (PD_DATA_VOID|PD_OP(22)) // valid data received with 'special' value +#define PD_E_SPECIAL_BYTE (PD_DATA_BYTE|PD_E_SPECIAL) +#define PD_E_SPECIAL_WORD (PD_DATA_WORD|PD_E_SPECIAL) +#define PD_E_SPECIAL_LONG (PD_DATA_LONG|PD_E_SPECIAL) + +#define PD_E_FRAMING_ERROR (PD_DATA_VOID|PD_OP(23)) // Failure occured assembling frame +#define PD_E_FRAMING_BYTE (PD_DATA_BYTE|PD_E_FRAMING_ERROR) +#define PD_E_FRAMING_WORD (PD_DATA_WORD|PD_E_FRAMING_ERROR) +#define PD_E_FRAMING_LONG (PD_DATA_LONG|PD_E_FRAMING_ERROR) + +#define PD_E_INTEGRITY_ERROR (PD_DATA_VOID|PD_OP(24)) // An uncorrectable frame was received +#define PD_E_INTEGRITY_BYTE (PD_DATA_BYTE|PD_E_INTEGRITY_ERROR) +#define PD_E_INTEGRITY_WORD (PD_DATA_WORD|PD_E_INTEGRITY_ERROR) +#define PD_E_INTEGRITY_LONG (PD_DATA_LONG|PD_E_INTEGRITY_ERROR) + +#define PD_E_INTEGRITY_WARNING (PD_DATA_VOID|PD_OP(25)) // A correctable frame was received +#define PD_E_HW_OVERRUN_ERROR (PD_DATA_VOID|PD_OP(26)) // Hardware's buffer overflowed, data lost +#define PD_E_SW_OVERRUN_ERROR (PD_DATA_VOID|PD_OP(27)) // Driver's buffer overflowed, data lost + +/* + *The variables below make up the bits returned + *by the State methods:- getState, setState, watchState + */ +#define PD_S_MASK 0xffff0000UL +#define PD_S_RX_OFFSET 7 + +#define PD_S_ACQUIRED 0x80000000UL +#define PD_S_ACTIVE 0x40000000UL + +#define PD_S_TX_ENABLE 0x20000000UL +#define PD_S_TX_BUSY 0x10000000UL +#define PD_S_TX_EVENT 0x08000000UL +#define PD_S_TXQ_EMPTY 0x04000000UL +#define PD_S_TXQ_LOW_WATER 0x02000000UL +#define PD_S_TXQ_HIGH_WATER 0x01000000UL +#define PD_S_TXQ_FULL 0x00800000UL +#define PD_S_TXQ_MASK ( PD_S_TXQ_EMPTY | PD_S_TXQ_LOW_WATER \ + | PD_S_TXQ_FULL | PD_S_TXQ_HIGH_WATER ) + +#define PD_S_RX_ENABLE (PD_S_TX_ENABLE >> PD_S_RX_OFFSET) +#define PD_S_RX_BUSY (PD_S_TX_BUSY >> PD_S_RX_OFFSET) +#define PD_S_RX_EVENT (PD_S_TX_EVENT >> PD_S_RX_OFFSET) +#define PD_S_RXQ_EMPTY (PD_S_TXQ_EMPTY >> PD_S_RX_OFFSET) +#define PD_S_RXQ_LOW_WATER (PD_S_TXQ_LOW_WATER >> PD_S_RX_OFFSET) +#define PD_S_RXQ_HIGH_WATER (PD_S_TXQ_HIGH_WATER >> PD_S_RX_OFFSET) +#define PD_S_RXQ_FULL (PD_S_TXQ_FULL >> PD_S_RX_OFFSET) +#define PD_S_RXQ_MASK (PD_S_TXQ_MASK >> PD_S_RX_OFFSET) + +class IOSerialDriverSync; +class IOSerialStreamSync : public IOService +{ + OSDeclareDefaultStructors(IOSerialStreamSync); + +protected: + IOSerialDriverSync *fProvider; + void *fRefCon; + +public: + /* acquire tests and sets the state of the port object. If the port was + *available, then the state is set to busy, and kIOReturnSuccess is returned. + *If the port was already busy and sleep is YES, then the thread will sleep + *until the port is freed, then re-attempts the acquire. If the port was + *already busy and sleep in NO, then kIOReturnExclusiveAccess is returned. + */ + virtual IOReturn acquirePort(bool sleep); + + /* release sets the state of the port object to available and wakes up any + *threads sleeping for access to this port. It will return kIOReturnSuccess + *if the port was in a busy state, and kIOReturnNotOpen if it was available. + */ + virtual IOReturn releasePort(); + + /* + *Set the state for the port device. + */ + virtual IOReturn setState(UInt32 state, UInt32 mask); + + /* + *Get the state for the port device. + */ + virtual UInt32 getState(); + + /* + *Wait for the at least one of the state bits defined in mask to be equal + *to the value defined in state. + *Check on entry then sleep until necessary. + */ + virtual IOReturn watchState(UInt32 *state, UInt32 mask); + + /* nextEvent returns the type of the next event on the RX queue. If no + *events are present on the RX queue, then EOQ is returned. + */ + virtual UInt32 nextEvent(); + + /* executeEvent causes the specified event to be processed immediately. + *This is primarily used for channel control commands like START & STOP + */ + virtual IOReturn executeEvent(UInt32 event, UInt32 data); + + /* requestEvent processes the specified event as an immediate request and + *returns the results in data. This is primarily used for getting link + *status information and verifying baud rate and such. + */ + virtual IOReturn requestEvent(UInt32 event, UInt32 *data); + + /* enqueueEvent will place the specified event into the TX queue. The + *sleep argument allows the caller to specify the enqueueEvent's + *behaviour when the TX queue is full. If sleep is true, then this + *method will sleep until the event is enqueued. If sleep is false, + *then enqueueEvent will immediatly return kIOReturnNoResources. + */ + virtual IOReturn enqueueEvent(UInt32 event, UInt32 data, bool sleep); + + /* dequeueEvent will remove the oldest event from the RX queue and return + *it in event & data. The sleep argument defines the behaviour if the RX + *queue is empty. If sleep is true, then this method will sleep until an + *event is available. If sleep is false, then an EOQ event will be + *returned. In either case kIOReturnSuccess is returned. + */ + virtual IOReturn dequeueEvent(UInt32 *event, UInt32 *data, bool sleep); + + /* enqueueData will attempt to copy data from the specified buffer to the + *TX queue as a sequence of VALID_DATA events. The argument bufferSize + *specifies the number of bytes to be sent. The actual number of bytes + *transferred is returned in transferCount. If sleep is true, then this + *method will sleep until all bytes can be transferred. If sleep is + *false, then as many bytes as possible will be copied to the TX queue. + */ + virtual IOReturn enqueueData(UInt8 *buffer, UInt32 size, UInt32 *count, bool sleep ); + + /* dequeueData will attempt to copy data from the RX queue to the specified + *buffer. No more than bufferSize VALID_DATA events will be transferred. + *In other words, copying will continue until either a non-data event is + *encountered or the transfer buffer is full. The actual number of bytes + *transferred is returned in transferCount. + * + *The sleep semantics of this method are slightly more complicated than + *other methods in this API: Basically, this method will continue to + *sleep until either minCount characters have been received or a non + *data event is next in the RX queue. If minCount is zero, then this + *method never sleeps and will return immediatly if the queue is empty. + * + *The latency parameter specifies the maximum amount of time that should + *pass after the first character is available before the routine returns. + *This allows the caller to specify a 'packet' timeout. The unit of the + *latency parameter is microseconds, though the exact delay may vary + *depending on the granularity of the timeout services available to the + *driver. + */ + virtual IOReturn dequeueData(UInt8 *buffer, UInt32 size, UInt32 *count, UInt32 min); + + /* Internal for IOSerialDriver only */ + virtual bool init(OSDictionary *dictionary = 0, void *refCon = 0); + virtual bool attach(IOService *provider) APPLE_KEXT_OVERRIDE; + void *getRefCon() const { return fRefCon; } + +OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 0); +OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 1); +OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 2); +OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 3); +OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 4); +OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 5); +OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 6); +OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 7); +OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 8); +OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 9); +OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 10); +OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 11); +OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 12); +OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 13); +OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 14); +OSMetaClassDeclareReservedUnused(IOSerialStreamSync, 15); +}; + +#endif /* !_SERIAL_IOSERIALSTREAMSYNC_H */ + + diff --git a/QualcommWireless/include/IOKit/skywalk/IOSkywalkCloneableNetworkPacket.h b/QualcommWireless/include/IOKit/skywalk/IOSkywalkCloneableNetworkPacket.h new file mode 100644 index 0000000..97b2f33 --- /dev/null +++ b/QualcommWireless/include/IOKit/skywalk/IOSkywalkCloneableNetworkPacket.h @@ -0,0 +1,76 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKCLONEABLENETWORKPACKET_H +#define _IOSKYWALKCLONEABLENETWORKPACKET_H + +#include <IOKit/skywalk/IOSkywalkNetworkPacket.h> + +class IOSkywalkCloneableNetworkPacket : public IOSkywalkNetworkPacket +{ + OSDeclareDefaultStructors( IOSkywalkCloneableNetworkPacket ) + +public: + static IOSkywalkPacket * withPool( IOSkywalkPacketBufferPool * pool, IOSkywalkPacketDescriptor * desc, IOOptionBits options ); + virtual bool initWithPool( IOSkywalkPacketBufferPool * pool, IOSkywalkPacketDescriptor * desc, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + + IOSkywalkCloneableNetworkPacket * packetClone(); + IOReturn packetCloneWithBaseAndLimit( int64_t base, size_t limit, IOSkywalkCloneableNetworkPacket ** packet ); + IOReturn setPacketBufferBaseAndLimit( int64_t base, size_t limit ); + IOReturn getPacketBufferBaseAddr( uint8_t ** baseAddr ); + IOReturn getPacketBufferObjectBaseAddr( uint8_t ** baseAddr ); + IOReturn getPacketBufferObjectIOBusBaseAddr( uint8_t ** baseAddr ); + + virtual UInt32 getPacketBuffers( IOSkywalkPacketBuffer ** buffers, UInt32 count ) APPLE_KEXT_OVERRIDE; + virtual UInt32 getPacketBufferCount() APPLE_KEXT_OVERRIDE; + virtual IOMemoryDescriptor * getMemoryDescriptor() APPLE_KEXT_OVERRIDE; + virtual IOReturn setDataLength( UInt32 length ) APPLE_KEXT_OVERRIDE; + virtual UInt32 getDataLength() APPLE_KEXT_OVERRIDE; + virtual IOReturn setDataOffset( UInt16 offset ) APPLE_KEXT_OVERRIDE; + virtual UInt16 getDataOffset() APPLE_KEXT_OVERRIDE; + virtual IOReturn setDataOffsetAndLength( UInt16 offset, UInt32 length ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn prepareWithQueue( IOSkywalkPacketQueue * queue, IOSkywalkPacketDirection direction = kIOSkywalkPacketDirectionNone, IOOptionBits options = 0 ) APPLE_KEXT_OVERRIDE; + virtual IOReturn completeWithQueue( IOSkywalkPacketQueue * queue, IOSkywalkPacketDirection direction = kIOSkywalkPacketDirectionNone, IOOptionBits options = 0 ) APPLE_KEXT_OVERRIDE; + + virtual UInt32 getPacketType() APPLE_KEXT_OVERRIDE; + virtual kern_buflet_t acquireWithPacketHandle( UInt64 handle, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + virtual void disposePacket() APPLE_KEXT_OVERRIDE; + void printPacket(); + +protected: + uint64_t _reserved[3]; // 128... I bet they are used or set in another class! +}; + +#endif diff --git a/QualcommWireless/include/IOKit/skywalk/IOSkywalkController.h b/QualcommWireless/include/IOKit/skywalk/IOSkywalkController.h new file mode 100644 index 0000000..99cf72a --- /dev/null +++ b/QualcommWireless/include/IOKit/skywalk/IOSkywalkController.h @@ -0,0 +1,59 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKCONTROLLER_H +#define _IOSKYWALKCONTROLLER_H + +#include <IOKit/IOService.h> + +class IOSkywalkInterface; + +class IOSkywalkController : public IOService +{ + OSDeclareDefaultStructors( IOSkywalkController ) + +public: + virtual void free() APPLE_KEXT_OVERRIDE; + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual bool handleOpen( IOService * forClient, IOOptionBits options, void * arg ) APPLE_KEXT_OVERRIDE; + virtual void handleClose( IOService * forClient, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + virtual bool handleIsOpen( const IOService * forClient ) const APPLE_KEXT_OVERRIDE; + IOReturn attachInterface( IOSkywalkInterface * interface, IOOptionBits options ); + IOReturn detachInterface( IOSkywalkInterface * interface, IOOptionBits options ); + +protected: + void * mReserved; + OSSet * mInterfaces; +}; + +#endif diff --git a/QualcommWireless/include/IOKit/skywalk/IOSkywalkEthernetInterface.h b/QualcommWireless/include/IOKit/skywalk/IOSkywalkEthernetInterface.h new file mode 100644 index 0000000..bdd1cb9 --- /dev/null +++ b/QualcommWireless/include/IOKit/skywalk/IOSkywalkEthernetInterface.h @@ -0,0 +1,95 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKETHERNETINTERFACE_H +#define _IOSKYWALKETHERNETINTERFACE_H + +#include <IOKit/skywalk/IOSkywalkNetworkInterface.h> +#include <net/if_dl.h> + +class IOSkywalkEthernetInterface : public IOSkywalkNetworkInterface +{ + OSDeclareAbstractStructors( IOSkywalkEthernetInterface ) + + struct RegistrationInfo; + +public: + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + + bool initRegistrationInfo( RegistrationInfo * info, IOOptionBits options, size_t size ); + IOReturn registerEthernetInterface( const RegistrationInfo * info, IOSkywalkPacketQueue ** queues, IOOptionBits queueOptions, IOSkywalkPacketBufferPool * pool1, IOSkywalkPacketBufferPool * pool2, IOOptionBits options = 0 ); + IOReturn deregisterEthernetInterface( IOOptionBits options = 0 ); + + virtual IOReturn initBSDInterfaceParameters( struct ifnet_init_eparams * params, sockaddr_dl ** ll ) APPLE_KEXT_OVERRIDE; + virtual IOReturn prepareBSDInterface( ifnet_t interface, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + virtual errno_t processBSDCommand( ifnet_t interface, UInt32 cmd, void * data ) APPLE_KEXT_OVERRIDE; + + errno_t ioctl_sifflags( ifnet_t interface ); + errno_t ioctl_multicast( ifnet_t interface, bool ); + + virtual IOReturn getPacketTapInfo(UInt32 *, UInt32 *) APPLE_KEXT_OVERRIDE; + virtual UInt32 getMaxTransferUnit() APPLE_KEXT_OVERRIDE; + virtual UInt32 getMinPacketSize() APPLE_KEXT_OVERRIDE; + virtual UInt32 getHardwareAssists() APPLE_KEXT_OVERRIDE; + + virtual IOReturn configureMulticastFilter( UInt32, const ether_addr * addresses, uint32_t count ); + virtual IOReturn setPromiscuousModeEnable( bool enable, IOOptionBits options ); + + OSMetaClassDeclareReservedUnused( IOSkywalkEthernetInterface, 0 ); + OSMetaClassDeclareReservedUnused( IOSkywalkEthernetInterface, 1 ); + OSMetaClassDeclareReservedUnused( IOSkywalkEthernetInterface, 2 ); + OSMetaClassDeclareReservedUnused( IOSkywalkEthernetInterface, 3 ); + OSMetaClassDeclareReservedUnused( IOSkywalkEthernetInterface, 4 ); + OSMetaClassDeclareReservedUnused( IOSkywalkEthernetInterface, 5 ); + OSMetaClassDeclareReservedUnused( IOSkywalkEthernetInterface, 6 ); + OSMetaClassDeclareReservedUnused( IOSkywalkEthernetInterface, 7 ); + OSMetaClassDeclareReservedUnused( IOSkywalkEthernetInterface, 8 ); + OSMetaClassDeclareReservedUnused( IOSkywalkEthernetInterface, 9 ); + OSMetaClassDeclareReservedUnused( IOSkywalkEthernetInterface, 10 ); + +protected: + void * mReserved; + + struct ExpansionData + { + RegistrationInfo * eRegistrationInfo; + OSData * eMulticastAddresses; + UInt32 eNumMulticastAddresses; + UInt16 eBSDInterfaceFlags; + sockaddr_dl eLinkLayerSockAddress; + }; + ExpansionData * mExpansionData; +}; + +#endif diff --git a/QualcommWireless/include/IOKit/skywalk/IOSkywalkFamily.h b/QualcommWireless/include/IOKit/skywalk/IOSkywalkFamily.h new file mode 100644 index 0000000..05c2ff0 --- /dev/null +++ b/QualcommWireless/include/IOKit/skywalk/IOSkywalkFamily.h @@ -0,0 +1,54 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#pragma once + +#include <IOKit/skywalk/IOSkywalkSupport.h> +#include <IOKit/skywalk/IOSkywalkTypes.h> +#include <IOKit/skywalk/IOSkywalkMemorySegment.h> +#include <IOKit/skywalk/IOSkywalkPacket.h> +#include <IOKit/skywalk/IOSkywalkNetworkPacket.h> +#include <IOKit/skywalk/IOSkywalkCloneableNetworkPacket.h> +#include <IOKit/skywalk/IOSkywalkPacketBuffer.h> +#include <IOKit/skywalk/IOSkywalkPacketBufferPool.h> +#include <IOKit/skywalk/IOSkywalkPacketQueue.h> +#include <IOKit/skywalk/IOSkywalkRxSubmissionQueue.h> +#include <IOKit/skywalk/IOSkywalkRxCompletionQueue.h> +#include <IOKit/skywalk/IOSkywalkTxSubmissionQueue.h> +#include <IOKit/skywalk/IOSkywalkTxCompletionQueue.h> +#include <IOKit/skywalk/IOSkywalkController.h> +#include <IOKit/skywalk/IOSkywalkNetworkController.h> +#include <IOKit/skywalk/IOSkywalkInterface.h> +#include <IOKit/skywalk/IOSkywalkNetworkInterface.h> +#include <IOKit/skywalk/IOSkywalkEthernetInterface.h> +#include <IOKit/skywalk/IOUserNetworkEthernetNicProxy.h> diff --git a/QualcommWireless/include/IOKit/skywalk/IOSkywalkInterface.h b/QualcommWireless/include/IOKit/skywalk/IOSkywalkInterface.h new file mode 100644 index 0000000..c1828f9 --- /dev/null +++ b/QualcommWireless/include/IOKit/skywalk/IOSkywalkInterface.h @@ -0,0 +1,81 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKINTERFACE_H +#define _IOSKYWALKINTERFACE_H + +#include <IOKit/IOService.h> + +class IOSkywalkPacketQueue; +class IOSkywalkPacketBufferPool; + +class IOSkywalkInterface : public IOService +{ + OSDeclareAbstractStructors( IOSkywalkInterface ) + +protected: + virtual void free() APPLE_KEXT_OVERRIDE; + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void stop( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual bool handleOpen( IOService * forClient, IOOptionBits options, void * arg ) APPLE_KEXT_OVERRIDE; + virtual void handleClose( IOService * forClient, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + virtual bool handleIsOpen( const IOService * forClient ) const APPLE_KEXT_OVERRIDE; + virtual IOReturn enable( IOOptionBits options ) = 0; + virtual IOReturn disable( IOOptionBits options ) = 0; + virtual IOReturn clientConnectWithTask( task_t task, IOService * forClient, IOOptionBits options ); + virtual void clientDisconnect( IOService * forClient, IOOptionBits options ); + + IOReturn registerInterfaceWithQueues( IOSkywalkPacketQueue ** queue, UInt32 count, IOSkywalkPacketBufferPool * pool1, IOSkywalkPacketBufferPool * pool2, IOOptionBits options = 0 ); + IOReturn deregisterInterfaceWithQueues(); + + OSMetaClassDeclareReservedUnused( IOSkywalkInterface, 0 ); + OSMetaClassDeclareReservedUnused( IOSkywalkInterface, 1 ); + OSMetaClassDeclareReservedUnused( IOSkywalkInterface, 2 ); + OSMetaClassDeclareReservedUnused( IOSkywalkInterface, 3 ); + OSMetaClassDeclareReservedUnused( IOSkywalkInterface, 4 ); + OSMetaClassDeclareReservedUnused( IOSkywalkInterface, 5 ); + OSMetaClassDeclareReservedUnused( IOSkywalkInterface, 6 ); + OSMetaClassDeclareReservedUnused( IOSkywalkInterface, 7 ); + OSMetaClassDeclareReservedUnused( IOSkywalkInterface, 8 ); + OSMetaClassDeclareReservedUnused( IOSkywalkInterface, 9 ); + OSMetaClassDeclareReservedUnused( IOSkywalkInterface, 10 ); + +protected: + void * mReserved; // 136 + OSArray * mPacketQueueArray; // 144 + IOSkywalkPacketBufferPool * mPacketBufferPool1; // 152 + IOSkywalkPacketBufferPool * mPacketBufferPool2; // 160 + OSSet * mClients; // 168 +}; + +#endif diff --git a/QualcommWireless/include/IOKit/skywalk/IOSkywalkMemorySegment.h b/QualcommWireless/include/IOKit/skywalk/IOSkywalkMemorySegment.h new file mode 100644 index 0000000..634ad2f --- /dev/null +++ b/QualcommWireless/include/IOKit/skywalk/IOSkywalkMemorySegment.h @@ -0,0 +1,88 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKMEMORYSEGMENT_H +#define _IOSKYWALKMEMORYSEGMENT_H + +#include <IOKit/IODMACommand.h> +#include <IOKit/skywalk/IOSkywalkPacketBufferPool.h> + +struct IOSkywalkMemorySegmentDescriptor +{ + UInt32 packetBufferCount; + + struct + { + IODMACommand::SegmentFunction outSegFunc; + UInt8 numAddressBits; + UInt64 maxSegmentSize; + IODMACommand::MappingOptions mappingOptions; + UInt64 maxTransferSize; + UInt32 alignment; + IOMapper * mapper; + } * specs; +}; + +class IOSkywalkMemorySegment : public OSObject +{ + OSDeclareDefaultStructors( IOSkywalkMemorySegment ) + +public: + static IOSkywalkMemorySegment * withPool( IOSkywalkPacketBufferPool * pool, IOSkywalkMemorySegmentDescriptor * desc, IOOptionBits options = 0 ); + virtual bool initWithPool( IOSkywalkPacketBufferPool * pool, IOSkywalkMemorySegmentDescriptor * desc, IOOptionBits options = 0 ); + virtual void free() APPLE_KEXT_OVERRIDE; + + IOSkywalkPacketBufferPool * getPacketBufferPool(); + virtual IOReturn setDMACommand( IODMACommand * dmaCommand, IOOptionBits options = 0 ); + virtual IODMACommand * getDMACommand(); + + virtual IOReturn prepare( IODirection forDirection = kIODirectionNone ); + virtual IOReturn complete( IODirection forDirection = kIODirectionNone ); + + virtual IOReturn setBufferMemoryDescriptor( IOBufferMemoryDescriptor * md ); + IOMemoryDescriptor * getMemoryDescriptor(); + virtual IOReturn setMemoryDescriptor( IOMemoryDescriptor * md, UInt64 address ); + UInt64 getVirtualAddress(); + +protected: + void * mReserved; // 16 + IOSkywalkPacketBufferPool * mPool; // 24 + IOMemoryDescriptor * mMemoryDescriptor; // 32 + OSObject * _unknown; // 40 + UInt64 mVirtualAddress; // 48 + IODMACommand * mDMACommand; // 56 + OSArray * mPacketBufferArray; // 64, stores IOSkywalkPacketBuffers + uint64_t _reserved1[6]; // 72 +}; + +#endif diff --git a/QualcommWireless/include/IOKit/skywalk/IOSkywalkNetworkController.h b/QualcommWireless/include/IOKit/skywalk/IOSkywalkNetworkController.h new file mode 100644 index 0000000..41a1ace --- /dev/null +++ b/QualcommWireless/include/IOKit/skywalk/IOSkywalkNetworkController.h @@ -0,0 +1,44 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKNETWORKCONTROLLER_H +#define _IOSKYWALKNETWORKCONTROLLER_H + +#include <IOKit/skywalk/IOSkywalkController.h> + +class IOSkywalkNetworkController : public IOSkywalkController +{ + OSDeclareDefaultStructors( IOSkywalkNetworkController ) +}; + +#endif diff --git a/QualcommWireless/include/IOKit/skywalk/IOSkywalkNetworkInterface.h b/QualcommWireless/include/IOKit/skywalk/IOSkywalkNetworkInterface.h new file mode 100644 index 0000000..64502f9 --- /dev/null +++ b/QualcommWireless/include/IOKit/skywalk/IOSkywalkNetworkInterface.h @@ -0,0 +1,144 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKNETWORKINTERFACE_H +#define _IOSKYWALKNETWORKINTERFACE_H + +#include <IOKit/skywalk/IOSkywalkInterface.h> +#include <IOKit/skywalk/IOSkywalkTypes.h> +#include <IOKit/80211/apple80211_ioctl.h> + +class IOSkywalkNetworkKDPPoller; + +class IOSkywalkNetworkInterface : public IOSkywalkInterface +{ + OSDeclareAbstractStructors( IOSkywalkNetworkInterface ) + + struct RegistrationInfo; + +public: + virtual void free() APPLE_KEXT_OVERRIDE; + + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void stop( IOService * provider ) APPLE_KEXT_OVERRIDE; + + IOReturn registerNetworkInterface( const RegistrationInfo * info, IOSkywalkPacketQueue ** queues, IOOptionBits queueOptions, IOSkywalkPacketBufferPool * pool1, IOSkywalkPacketBufferPool * pool2, IOOptionBits options = 0 ); + IOReturn deregisterNetworkInterface( IOOptionBits options = 0 ); + + void handleLinkStatusEvent(); + IOReturn reportEventType( UInt32 type, void * argument, vm_size_t argSize = 0 ); + IOReturn reportLinkStatus( IOSkywalkNetworkLinkStatus linkStatus, IOSkywalkNetworkMediaType activeMediaType ); + IOReturn reportLinkQuality( IOSkywalkNetworkLinkQuality linkQuality ); + IOReturn reportDataBandwidths( uint64_t maxInputBandwidth, uint64_t maxOutputBandwidth, uint64_t effectiveInputBandwidth, uint64_t effectiveOutputBandwidth ); + IOReturn reportInterfaceAdvisory( const struct ifnet_interface_advisory * advisory ); + + virtual IOReturn setAggressiveness( unsigned long type, unsigned long newLevel ) APPLE_KEXT_OVERRIDE; + + virtual void joinPMtree( IOService * driver ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn initBSDInterfaceParameters( struct ifnet_init_eparams * params, struct sockaddr_dl ** ll ) = 0; + virtual IOReturn prepareBSDInterface( ifnet_t interface, IOOptionBits options ); + virtual void finalizeBSDInterface( ifnet_t interface, IOOptionBits options ); + virtual ifnet_t getBSDInterface(); + virtual void setBSDName( const char * name ); + virtual const char * getBSDName(); + + virtual errno_t processBSDCommand( ifnet_t interface, UInt32 cmd, void * data ); + errno_t ioctl_gifmedia( ifnet_t interface, UInt32 sockioc, void * data ); + errno_t ioctl_sifmedia( ifnet_t interface, void * data ); + errno_t ioctl_gifdevmtu( ifnet_t interface, void * data ); + errno_t ioctl_sifmtu( ifnet_t interface, void * data, bool useOriginalLength ); + errno_t ioctl_gifcap( ifnet_t interface, void * data ); + errno_t ioctl_sifcap( ifnet_t interface, void * data ); + + virtual void setRunningState( bool state ); + + virtual IOReturn handleChosenMedia( UInt32 ); + virtual IOReturn getSupportedMediaArray( UInt32 *, UInt32 * ); + + virtual IOReturn getPacketTapInfo( UInt32 *, UInt32 * ); + virtual IOReturn getUnsentDataByteCount( UInt32 *, UInt32 *, UInt32 ); + virtual IOReturn getSupportedWakeFlags( UInt32 * flags ); + virtual IOReturn enableNetworkWake( UInt32 flags ); + + virtual IOReturn calculateRingSizeForQueue( const IOSkywalkPacketQueue * queue, UInt32 * size ); + IOReturn getServiceClassIndex( kern_packet_svc_class_t serviceClass, UInt32 * index ); + virtual UInt32 getMaxTransferUnit(); + virtual UInt32 getMinPacketSize(); + virtual IOReturn getMTU( UInt32 * mtu ); + virtual void setMTU( UInt32 mtu ); + + virtual UInt32 getHardwareAssists(); + virtual void setHardwareAssists( UInt32 hardwareAssists ); + IOReturn setKDPPoller( IOSkywalkNetworkKDPPoller * poller ); + + virtual void captureInterfaceState( UInt32 state ); + virtual void restoreInterfaceState( UInt32 state ); + virtual IOReturn handleDoorbellForQueue( IOSkywalkPacketQueue * queue, UInt32 ); + + OSMetaClassDeclareReservedUnused( IOSkywalkNetworkInterface, 0 ); + OSMetaClassDeclareReservedUnused( IOSkywalkNetworkInterface, 1 ); + OSMetaClassDeclareReservedUnused( IOSkywalkNetworkInterface, 2 ); + OSMetaClassDeclareReservedUnused( IOSkywalkNetworkInterface, 3 ); + OSMetaClassDeclareReservedUnused( IOSkywalkNetworkInterface, 4 ); + OSMetaClassDeclareReservedUnused( IOSkywalkNetworkInterface, 5 ); + OSMetaClassDeclareReservedUnused( IOSkywalkNetworkInterface, 6 ); + OSMetaClassDeclareReservedUnused( IOSkywalkNetworkInterface, 7 ); + OSMetaClassDeclareReservedUnused( IOSkywalkNetworkInterface, 8 ); + OSMetaClassDeclareReservedUnused( IOSkywalkNetworkInterface, 9 ); + OSMetaClassDeclareReservedUnused( IOSkywalkNetworkInterface, 10 ); + +protected: + void * mReserved; + + struct ExpansionData + { + RegistrationInfo * eRegistrationInfo; + ifnet_t eBSDInterface; + OSArray * ePacketQueueArray; + IOLock * eDataLock; + IOLock * eInterfacePreparedLock; + IOSkywalkNetworkKDPPoller * eKDPPoller; + thread_call_t eLinkStatusEventThread; + UInt32 eLinkStatusMessageType; + IOSkywalkNetworkMediaType eActiveMediaType; + UInt32 eChosenMedia; + IOSkywalkNetworkLinkStatus eLinkStatus; + bool eInterfacePrepared; + const char eBSDName[80]; + UInt32 eMTU; + }; + ExpansionData * mExpansionData; +}; + +#endif diff --git a/QualcommWireless/include/IOKit/skywalk/IOSkywalkNetworkPacket.h b/QualcommWireless/include/IOKit/skywalk/IOSkywalkNetworkPacket.h new file mode 100644 index 0000000..96316d3 --- /dev/null +++ b/QualcommWireless/include/IOKit/skywalk/IOSkywalkNetworkPacket.h @@ -0,0 +1,83 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKNETWORKPACKET_H +#define _IOSKYWALKNETWORKPACKET_H + +#include <IOKit/skywalk/IOSkywalkPacket.h> + +class IOSkywalkNetworkPacket : public IOSkywalkPacket +{ + OSDeclareDefaultStructors( IOSkywalkNetworkPacket ) + +public: + static IOSkywalkNetworkPacket * withPool( IOSkywalkPacketBufferPool * pool, IOSkywalkPacketDescriptor * desc, IOOptionBits options ); + virtual UInt32 getPacketType() APPLE_KEXT_OVERRIDE; + + IOReturn setHeadroom( uint8_t headroom ); + uint8_t getHeadroom(); + IOReturn setLinkHeaderLength( uint8_t length ); + uint8_t getLinkHeaderLength(); + IOReturn setLinkHeaderOffset( uint32_t offset ); + IOReturn getLinkHeaderOffset( uint32_t * offset ); + IOReturn setNetworkHeaderOffset( uint32_t offset ); + IOReturn getNetworkHeaderOffset( uint32_t * offset ); + IOReturn setDataContainsFCS( bool contain ); + bool getDataContainsFCS(); + kern_packet_svc_class_t getServiceClass(); + + IOReturn setTimestamp( AbsoluteTime timestamp ); + IOReturn getTimestamp( AbsoluteTime * timestamp ); + IOReturn clearTimestamp(); + bool isTimestampRequested(); + IOReturn setCompletionStatus( int status ); + IOReturn getExpiryTime( AbsoluteTime * time ); + + IOReturn getTokenData( void * data, uint16_t * size ); + IOReturn getPacketID( packet_id_t * packetID ); + + bool isPacketGroupStart(); + bool isPacketGroupEnd(); + bool isHighPriority(); + bool isTransportNewFlow(); + bool isTransportLastPacket(); + IOReturn setIsLinkBroadcast( bool broadcast ); + bool isLinkBroadcast(); + IOReturn setIsLinkMulticast( bool multicast ); + bool isLinkMulticast(); + +protected: + void * mReserved; +}; + +#endif diff --git a/QualcommWireless/include/IOKit/skywalk/IOSkywalkPacket.h b/QualcommWireless/include/IOKit/skywalk/IOSkywalkPacket.h new file mode 100644 index 0000000..5253248 --- /dev/null +++ b/QualcommWireless/include/IOKit/skywalk/IOSkywalkPacket.h @@ -0,0 +1,115 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKPACKET_H +#define _IOSKYWALKPACKET_H + +#include <IOKit/IOCommand.h> +#include <IOKit/skywalk/IOSkywalkPacketBufferPool.h> + +typedef uint32_t IOSkywalkPacketDirection; +enum +{ + kIOSkywalkPacketDirectionNone = 0x00000000, + kIOSkywalkPacketDirectionTx = 0x00000001, + kIOSkywalkPacketDirectionRx = 0x00000002 +}; + +enum IOSkywalkPacketTypes +{ + kIOSkywalkPacketTypeGeneric = 0, + kIOSkywalkPacketTypeNetwork, + kIOSkywalkPacketTypeCloneable +}; + +struct IOSkywalkPacketDescriptor +{ + kern_packet_idx_t packetIndex; + bool singleBuffer; +}; + +class IOSkywalkPacket : public IOCommand +{ + OSDeclareDefaultStructors( IOSkywalkPacket ) + +public: + static IOSkywalkPacket * withPool( IOSkywalkPacketBufferPool * pool, IOSkywalkPacketDescriptor * desc, IOOptionBits options ); + virtual bool initWithPool( IOSkywalkPacketBufferPool * pool, IOSkywalkPacketDescriptor * desc, IOOptionBits options ); + virtual void free() APPLE_KEXT_OVERRIDE; + + IOSkywalkPacketBufferPool * getPacketBufferPool(); + UInt32 getBufferSize(); + virtual UInt32 getPacketBuffers( IOSkywalkPacketBuffer ** buffers, UInt32 maxBuffers ); + virtual UInt32 getPacketBufferCount(); + virtual IOMemoryDescriptor * getMemoryDescriptor(); + virtual IOReturn setDataLength( UInt32 length ); + virtual UInt32 getDataLength(); + virtual IOReturn setDataOffset( UInt16 offset ); + virtual UInt16 getDataOffset(); + virtual IOReturn setDataOffsetAndLength( UInt16 offset, UInt32 length ); + + IOSkywalkPacketQueue * getSourceQueue(); + virtual IOReturn prepareWithQueue( IOSkywalkPacketQueue * queue, IOSkywalkPacketDirection direction = kIOSkywalkPacketDirectionNone, IOOptionBits options = 0 ); + virtual IOReturn prepare( IOSkywalkPacketQueue * queue, UInt64 offset, IOOptionBits options = 0 ); + virtual IOReturn completeWithQueue( IOSkywalkPacketQueue * queue, IOSkywalkPacketDirection direction = kIOSkywalkPacketDirectionNone, IOOptionBits options = 0 ); + virtual IOReturn complete( IOSkywalkPacketQueue * queue, IOOptionBits options = 0 ); + + void setTransferDirection( IOSkywalkPacketDirection direction ); + IOSkywalkPacketDirection getTransferDirection(); + bool clearTransferDirection( IOSkywalkPacketDirection direction ); + + void setSlotReference( void * ref ); + void * getSlotReference(); + virtual UInt32 getPacketType(); + virtual kern_buflet_t acquireWithPacketHandle( kern_packet_t handle, IOOptionBits options ); + void cancelCompletionCallback(); + virtual void disposePacket(); + +protected: + void * mReserved; // 32 + kern_packet_t mPacketHandle; // 40 + IOSkywalkPacketBuffer ** mPacketBuffers; // 48 + IOSkywalkPacketQueue * mSourceQueue; // 56 + IOSkywalkPacketBufferPool * mBufferPool; // 64 + kern_buflet_t mBuflet; // 72 + + uint64_t _reserved0; // 80 + UInt32 mPacketState; // 88 - 0 on complete, 1 on acquire, 2 on prepare + UInt32 mMaxNumBuffers; // 92 + UInt32 mActualNumBuffers; // 96 + kern_packet_idx_t mPacketIndex; // 100 + IOSkywalkPacketDirection mTransferDirection; // 104 + void * mSlotReference; // 112 +}; + +#endif diff --git a/QualcommWireless/include/IOKit/skywalk/IOSkywalkPacketBuffer.h b/QualcommWireless/include/IOKit/skywalk/IOSkywalkPacketBuffer.h new file mode 100644 index 0000000..903a7b4 --- /dev/null +++ b/QualcommWireless/include/IOKit/skywalk/IOSkywalkPacketBuffer.h @@ -0,0 +1,116 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKPACKETBUFFER_H +#define _IOSKYWALKPACKETBUFFER_H + +#include <skywalk/os_skywalk.h> +#include <IOKit/IOCommand.h> +#include <IOKit/skywalk/IOSkywalkTypes.h> + +class IOSkywalkPacket; +class IOSkywalkPacketQueue; +class IOSkywalkPacketBufferPool; +class IOSkywalkMemorySegment; + +struct IOSkywalkPacketBufferDescriptor +{ + IOMemoryDescriptor * memDescriptor; + IOSkywalkMemorySegment * memSegment; + UInt64 memSegmentOffset; +}; + +class IOSkywalkPacketBuffer : public IOCommand +{ + OSDeclareDefaultStructors( IOSkywalkPacketBuffer ) + +public: + static IOSkywalkPacketBuffer * withPool( IOSkywalkPacketBufferPool * pool, IOSkywalkPacketBufferDescriptor * desc, IOOptionBits options = 0 ); + virtual bool initWithPool( IOSkywalkPacketBufferPool * pool, IOSkywalkPacketBufferDescriptor * desc, IOOptionBits options = 0 ); + virtual void free() APPLE_KEXT_OVERRIDE; + + IOSkywalkPacketBufferPool * getPacketBufferPool(); + UInt32 getBufferSize(); + + UInt32 getDataLength(); + IOReturn setDataLength( UInt32 length ); + UInt16 getDataOffset(); + IOReturn setDataOffset( UInt16 offset ); + IOReturn setDataOffsetAndLength( UInt16 offset, UInt32 length ); + + IOSkywalkPacket * getPacket(); + virtual void setPacket( IOSkywalkPacket * packet, IOOptionBits options ); + + virtual IOReturn prepare( IODirection forDirection = kIODirectionNone ); + virtual IOReturn complete( IODirection forDirection = kIODirectionNone ); + + IOSkywalkMemorySegment * getMemorySegment(); + UInt64 getMemorySegmentOffset(); + virtual IOReturn prepareWithMemorySegment( IOSkywalkMemorySegment * segment, UInt64 offset, IOOptionBits options = 0 ); + virtual IOReturn completeWithMemorySegment( IOSkywalkMemorySegment * segment, UInt64 offset, IOOptionBits options = 0 ); + + IOSkywalkPacketQueue * getSourceQueue(); + virtual IOReturn prepareWithQueue( IOSkywalkPacketQueue * queue, IODirection direction = kIODirectionNone, IOOptionBits options = 0 ); + virtual IOReturn completeWithQueue( IOSkywalkPacketQueue * queue, IODirection direction = kIODirectionNone, IOOptionBits options = 0 ); + + kern_buflet_t getBufletHandle(); + void setBufletHandle( kern_buflet_t handle ); + virtual void acquireWithBufletHandle( kern_buflet_t handle ); + + UInt64 getBufferHandle(); + virtual void acquireWithBufferHandle( UInt64 handle ); + + virtual void disposePacketBuffer(); + void cancelCompletionCallback(); + +public: + void * mReserved; // 32 + IOSkywalkPacketBufferPool * mPool; // 40 + kern_buflet_t mBufletHandle; // 48 + UInt64 mBufferHandle; // 56 + + IOSkywalkPacket * mPacket; // 64 + IOSkywalkPacketQueue * mSourceQueue; // 72 + IOMemoryDescriptor * mMemDescriptor; // 80 + IOSkywalkMemorySegment * mMemorySegment; // 88 + uint64_t __reserved0[2]; // 96 + + UInt64 mMemorySegmentOffset; // 112 + UInt32 mBufferState; // 120 + UInt32 mDataLength; // 124 + UInt16 mDataOffset; // 128 + + uint64_t _reserved1; // 136 +}; + +#endif diff --git a/QualcommWireless/include/IOKit/skywalk/IOSkywalkPacketBufferPool.h b/QualcommWireless/include/IOKit/skywalk/IOSkywalkPacketBufferPool.h new file mode 100644 index 0000000..ae17cf3 --- /dev/null +++ b/QualcommWireless/include/IOKit/skywalk/IOSkywalkPacketBufferPool.h @@ -0,0 +1,172 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2021 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKPACKETBUFFERPOOL_H +#define _IOSKYWALKPACKETBUFFERPOOL_H + +#include <IOKit/IOBufferMemoryDescriptor.h> +#include <IOKit/skywalk/IOSkywalkPacketBuffer.h> + +extern void pp_ctx_retain( void * target ); +extern void pp_ctx_release( void * target ); + +struct SegmentStats +{ + UInt64 constructorCount; + UInt64 destructorCount; + UInt64 prepareErrors; + UInt32 prepareMaxRetries; + UInt32 prepareErrorCode; +}; + +struct IOSkywalkPacketDescriptor; +struct IOSkywalkPacketBufferDescriptor; +struct IOSkywalkMemorySegmentDescriptor; + +class IOSkywalkInterface; + +class IOSkywalkPacketBufferPool : public OSObject +{ + OSDeclareDefaultStructors( IOSkywalkPacketBufferPool ) + + /*! @enum IOSkywalkPacketBufferPoolFlags + @abstract Flags for PoolOptions::poolFlags. + @constant PoolFlagSingleMemorySegment The pool will be constucted with single memory segment of buffers. + @constant PoolFlagPersistentMemory The pool memory will be persistently wired. + */ + + enum IOSkywalkPacketBufferPoolFlags + { + kIOSkywalkPacketBufferPoolFlagSingleMemorySegment = 0x00000002, + kIOSkywalkPacketBufferPoolFlagPersistentMemory = 0x00000004, + kIOSkywalkPacketBufferPoolFlagFlagMask = kIOSkywalkPacketBufferPoolFlagSingleMemorySegment | kIOSkywalkPacketBufferPoolFlagPersistentMemory + }; + + struct PoolOptions + { + uint32_t packetCount; // 0 + uint32_t bufferCount; // 4 + uint32_t bufferSize; // 8 + uint32_t maxBuffersPerPacket; // 12 + uint32_t memorySegmentSize; // 16 + uint32_t poolFlags; // 20 + uint64_t _reserved; // 24 + }; + +public: + static IOSkywalkPacketBufferPool * withName( const char * name, OSObject * owner, UInt32 packetType, const PoolOptions * options ); + virtual bool initWithName( const char * name, void * owner, UInt32 packetType, const PoolOptions * options ); + virtual bool initWithName( const char * name, OSObject * owner, UInt32 packetType, const PoolOptions * options ); + const char * getPoolName(); + virtual void free() APPLE_KEXT_OVERRIDE; + void disposeAllPackets(); + void disposeAllBuffers(); + virtual void release() const APPLE_KEXT_OVERRIDE; + void releaseAllPackets(); + void releaseAllMemorySegments(); + + void checkInPacketQueue( const IOSkywalkPacketQueue * queue ); + void checkOutPacketQueue( const IOSkywalkPacketQueue * queue ); + + void reportingChangeNotification(); + void checkInReportingService( IOService * service, const IOSkywalkInterface * interface ); + void checkOutReportingService( const IOService * service ); + void addPoolReporter( IOService * service, OSSet * reportSet ); + void createReportersForService( IOService * service, const IOSkywalkInterface * interface ); + void removeReportersForService( const IOService * service ); + OSSet * copyReportersForService( const IOService * service ); + UInt64 getReportChannelValue( UInt64 reportChannel ); + + virtual IOReturn allocatePacket( UInt32 bufCount, IOSkywalkPacket ** outPacket, IOOptionBits options ); // no sleep if (options & 1) + virtual IOReturn allocatePackets( UInt32 bufCount, UInt32 * numPackets, IOSkywalkPacket ** outPackets, IOOptionBits options ); + virtual IOReturn deallocatePacket( IOSkywalkPacket * packet ); + virtual IOReturn deallocatePackets( IOSkywalkPacket ** packets, uint32_t numPackets ); + virtual IOReturn deallocatePacketChain( kern_packet_t packet ); + + virtual IOReturn allocatePacketBuffer( IOSkywalkPacketBuffer ** outBuf, IOOptionBits options ); + virtual IOReturn allocatePacketBuffers( UInt32 * numBufs, IOSkywalkPacketBuffer ** outBufs, IOOptionBits options ); + virtual IOReturn deallocatePacketBuffer( IOSkywalkPacketBuffer * buf ); + virtual IOReturn deallocatePacketBuffers( IOSkywalkPacketBuffer ** bufs, uint32_t numBufs ); + + static void segmentConstructor( kern_pbufpool_t pbufPool, kern_segment_t segment, IOMemoryDescriptor * md ); + static void segmentDestructor( kern_pbufpool_t pbufPool, kern_segment_t segment, IOMemoryDescriptor * md ); + bool createSegmentBuffers( IOSkywalkMemorySegment * segment, UInt32 numBuffers, bool subDesc ); + void destroySegmentBuffers( IOSkywalkMemorySegment * segment ); + IOReturn prepareMemorySegment( IOSkywalkMemorySegment * segment, IOBufferMemoryDescriptor * buffer, UInt64 offset ); + + virtual IOReturn newPacket( IOSkywalkPacketDescriptor * desc, IOSkywalkPacket ** outPacket ); + IOSkywalkPacket * getPacketWithHandle( kern_packet_t handle ); + IOSkywalkPacket * getPacketWithIndex( kern_packet_idx_t index ); + + virtual IOReturn newPacketBuffer( IOSkywalkPacketBufferDescriptor * desc, IOSkywalkPacketBuffer ** outBuffer ); + IOSkywalkPacketBuffer * getPacketBufferWithBufletHandle( kern_buflet_t handle ); + IOSkywalkPacketBuffer * getPacketBufferWithSegmentInfo( kern_segment_t segment, UInt32 bufIndex ); + + virtual IOReturn newMemorySegment( IOSkywalkMemorySegmentDescriptor * desc, IOSkywalkMemorySegment ** outSegment ); + IOSkywalkMemorySegment * getMemorySegmentWithHandle( kern_segment_t handle ); + +protected: + void * mReserved; // 16 + kern_pbufpool_t mPbufPool; // 24 + OSObject * mProvider; // 32 + + UInt32 mPacketCount; // 40 + UInt32 mBufferCount; // 44 + UInt32 mBufferSize; // 48 + UInt32 mMaxFragments; // 52 + UInt32 mSegmentCount; // 56 + UInt32 mPacketType; // 60 + UInt32 mSegmentSize; // 64 + UInt32 mBuffersPerSegment; // 68 + UInt32 mPoolFlags; // 72 + + uint64_t _reserved; // 80 + IOSkywalkMemorySegment * mMemSegment; // 88 + OSArray * mPacketArray; // 96 + OSArray * mSegmentArray; // 104 + uint64_t _reserved2; // 112 + SegmentStats * mSegmentStats; // 120 + + IOLock * mSetLock; // 128 - protect the OSSets + OSSet * mPacketQueueSet; // 136 + OSString * mPoolName; // 144 + OSSet * mReporterSet; // 152 + OSSet * mReportingServiceSet; // 160 + thread_call_t mReportingChangeNotificationThread; // 168 + bool mSingleMemorySemgent; // 176 + bool mPersistentMemory; // 177 + bool mSegmentBuffersWithSubRange; // 178 + bool mDisposed; // 179 +}; + +#endif diff --git a/QualcommWireless/include/IOKit/skywalk/IOSkywalkPacketQueue.h b/QualcommWireless/include/IOKit/skywalk/IOSkywalkPacketQueue.h new file mode 100644 index 0000000..5446ae0 --- /dev/null +++ b/QualcommWireless/include/IOKit/skywalk/IOSkywalkPacketQueue.h @@ -0,0 +1,117 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2022 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKPACKETQUEUE_H +#define _IOSKYWALKPACKETQUEUE_H + +#include <IOKit/skywalk/IOSkywalkPacket.h> +#include <IOKit/IOEventSource.h> + +class IOSkywalkPacketPoller; + +typedef void (*IOSkywalkPacketQueueNotifyAction)(IOSkywalkPacketQueue * owner, void * arg); + +class IOSkywalkPacketQueue : public IOEventSource +{ + OSDeclareAbstractStructors( IOSkywalkPacketQueue ) + +public: + virtual IOReturn initialize( void * refCon ); + virtual void finalize(); + virtual IOReturn synchronize( IOOptionBits options ); + virtual IOReturn syncPackets( kern_packet_t * packetArray, UInt32 * packetCount, IOOptionBits options ); + virtual IOReturn sendNotification( IOOptionBits options ); + virtual IOReturn handleDoorbell( IOOptionBits options ); + + void * getRefcon(); + virtual IOSkywalkPacketBufferPool * getPacketBufferPool(); + virtual IOReturn setPacketBufferPool( IOSkywalkPacketBufferPool * pool ); + IOSkywalkInterface * getInterface(); + void setInterface( IOSkywalkInterface * interface ); + + bool isQueueReady(); + kern_packet_svc_class_t getServiceClass(); + + IODirection getDirection(); + UInt32 getQueueId(); + UInt32 getCapacity(); + UInt32 getBufferSize(); + virtual UInt32 getPacketCount() = 0; + virtual UInt32 getPacketBufferCount(); + virtual UInt32 getFreeSpace(); + virtual IOReturn getDataByteCount( UInt32 * count ); + + virtual IOReturn setPacketPoller( IOSkywalkPacketPoller * poller ); + virtual IOReturn performCommand( UInt32 command, void * data, size_t dataSize ); + // Call to default completion methods cause panics + virtual void packetCompletion( IOSkywalkPacket * packet, IOSkywalkPacketQueue * queue, IOOptionBits options ); + virtual void bufferCompletion( IOSkywalkPacketBuffer * buffer, IOSkywalkPacketQueue * queue, IOOptionBits options ); + void scheduleQueueNotification( IOSkywalkPacketQueue * queue ); + void deliverQueueNotifications( IOSkywalkPacketQueueNotifyAction notification, void * param ); + static UInt64 statGetElapsedTime( const AbsoluteTime * startTime ); + + virtual bool initWithPool( IOSkywalkPacketBufferPool * pool, UInt32 bufferSize, IODirection direction, UInt32 capacity, UInt32 queueId, OSObject * owner, IOEventSource::Action action, void * refCon ); + virtual void free() APPLE_KEXT_OVERRIDE; + + OSMetaClassDeclareReservedUnused( IOSkywalkPacketQueue, 0 ); + OSMetaClassDeclareReservedUnused( IOSkywalkPacketQueue, 1 ); + OSMetaClassDeclareReservedUnused( IOSkywalkPacketQueue, 2 ); + OSMetaClassDeclareReservedUnused( IOSkywalkPacketQueue, 3 ); + OSMetaClassDeclareReservedUnused( IOSkywalkPacketQueue, 4 ); + OSMetaClassDeclareReservedUnused( IOSkywalkPacketQueue, 5 ); + OSMetaClassDeclareReservedUnused( IOSkywalkPacketQueue, 6 ); + OSMetaClassDeclareReservedUnused( IOSkywalkPacketQueue, 7 ); + OSMetaClassDeclareReservedUnused( IOSkywalkPacketQueue, 8 ); + OSMetaClassDeclareReservedUnused( IOSkywalkPacketQueue, 9 ); + OSMetaClassDeclareReservedUnused( IOSkywalkPacketQueue, 10 ); + +protected: + void * mReserved; // 72 + IOSkywalkPacketBufferPool * mPool; // 80 + void * mRefcon; // 88 + IOSkywalkPacketQueue * mNotificationOwner; // 96 + OSArray * mNotificationArray; // 104 + IOSkywalkInterface * mInterface; // 112 + + uint64_t _reserved0[4]; // 120 + + UInt32 mQueueId; // 152 + UInt32 mCapacity; // 156 + UInt32 mBufferSize; // 160 + IODirection mDirection; // 164 + kern_packet_svc_class_t mServiceClass; // 168 + uint64_t _reserved1[2]; // 172 + bool mQueueReady; // 188 +}; + +#endif diff --git a/QualcommWireless/include/IOKit/skywalk/IOSkywalkRxCompletionQueue.h b/QualcommWireless/include/IOKit/skywalk/IOSkywalkRxCompletionQueue.h new file mode 100644 index 0000000..70f2858 --- /dev/null +++ b/QualcommWireless/include/IOKit/skywalk/IOSkywalkRxCompletionQueue.h @@ -0,0 +1,93 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2022 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKRXCOMPLETIONQUEUE_H +#define _IOSKYWALKRXCOMPLETIONQUEUE_H + +#include <IOKit/skywalk/IOSkywalkPacketQueue.h> + +class IOSkywalkRxCompletionQueue; +class IOSkywalkPacketTable; + +typedef IOReturn (*IOSkywalkRxCompletionQueueAction)( OSObject * owner, IOSkywalkRxCompletionQueue *, IOSkywalkPacket **, UInt32, void * ); + +class IOSkywalkRxCompletionQueue : public IOSkywalkPacketQueue +{ + OSDeclareDefaultStructors( IOSkywalkRxCompletionQueue ) + +public: + virtual IOReturn initialize( void * refCon ) APPLE_KEXT_OVERRIDE; + virtual void finalize() APPLE_KEXT_OVERRIDE; + virtual void enable() APPLE_KEXT_OVERRIDE; + virtual void disable() APPLE_KEXT_OVERRIDE; + + IOReturn synchronizeNonChain( IOOptionBits options ); + virtual IOReturn synchronize( IOOptionBits options ) APPLE_KEXT_OVERRIDE; + virtual IOReturn syncPackets( kern_packet_t * packetArray, UInt32 * packetCount, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + virtual IOReturn sendNotification( IOOptionBits options ) APPLE_KEXT_OVERRIDE; + + virtual IOReturn setPacketPoller( IOSkywalkPacketPoller * poller ) APPLE_KEXT_OVERRIDE; + virtual IOReturn performCommand( UInt32 command, void * data, size_t dataSize ) APPLE_KEXT_OVERRIDE; + IOReturn gatedEnqueue( void * refCon, bool * ); + virtual IOReturn requestEnqueue( void * packets, IOOptionBits options ); + virtual IOReturn enqueuePackets( const IOSkywalkPacket ** packets, UInt32 packetCount, IOOptionBits options ); + virtual IOReturn enqueuePackets( const queue_entry * packets, UInt32 packetCount, IOOptionBits options ); + virtual UInt32 getPacketCount() APPLE_KEXT_OVERRIDE; + UInt32 getEffectiveCapacity( IOOptionBits options ); + virtual bool checkForWork() APPLE_KEXT_OVERRIDE; + + static IOSkywalkRxCompletionQueue * withPool( IOSkywalkPacketBufferPool * pool, UInt32 capacity, UInt32 queueId, OSObject * owner, IOSkywalkRxCompletionQueueAction action, void * refCon, IOOptionBits options ); + virtual bool initWithPool( IOSkywalkPacketBufferPool * pool, UInt32 capacity, UInt32 queueId, OSObject * owner, IOSkywalkRxCompletionQueueAction action, void * refCon, IOOptionBits options ); + virtual void free() APPLE_KEXT_OVERRIDE; + + void addReporters( IOService * target, OSSet * set ); + UInt64 getReportChannelValue( UInt64 reportChannel ); + + OSMetaClassDeclareReservedUnused( IOSkywalkRxCompletionQueue, 0 ); + OSMetaClassDeclareReservedUnused( IOSkywalkRxCompletionQueue, 1 ); + OSMetaClassDeclareReservedUnused( IOSkywalkRxCompletionQueue, 2 ); + OSMetaClassDeclareReservedUnused( IOSkywalkRxCompletionQueue, 3 ); + OSMetaClassDeclareReservedUnused( IOSkywalkRxCompletionQueue, 4 ); + OSMetaClassDeclareReservedUnused( IOSkywalkRxCompletionQueue, 5 ); + OSMetaClassDeclareReservedUnused( IOSkywalkRxCompletionQueue, 6 ); + OSMetaClassDeclareReservedUnused( IOSkywalkRxCompletionQueue, 7 ); + OSMetaClassDeclareReservedUnused( IOSkywalkRxCompletionQueue, 8 ); + OSMetaClassDeclareReservedUnused( IOSkywalkRxCompletionQueue, 9 ); + OSMetaClassDeclareReservedUnused( IOSkywalkRxCompletionQueue, 10 ); + +protected: + +}; +// 296 + +#endif diff --git a/QualcommWireless/include/IOKit/skywalk/IOSkywalkRxSubmissionQueue.h b/QualcommWireless/include/IOKit/skywalk/IOSkywalkRxSubmissionQueue.h new file mode 100644 index 0000000..8e282a8 --- /dev/null +++ b/QualcommWireless/include/IOKit/skywalk/IOSkywalkRxSubmissionQueue.h @@ -0,0 +1,103 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2022 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKRXSUBMISSIONQUEUE_H +#define _IOSKYWALKRXSUBMISSIONQUEUE_H + +#include <IOKit/skywalk/IOSkywalkPacketQueue.h> + +class IOSkywalkRxSubmissionQueue; +class IOSkywalkPacketTable; + +typedef IOReturn (*IOSkywalkRxSubmissionQueueAction)( OSObject * owner, IOSkywalkRxSubmissionQueue *, const IOSkywalkPacket **, UInt32, void * ); + +struct IOSkywalkRxSubmissionQueueStats; // 56 + +class IOSkywalkRxSubmissionQueue : public IOSkywalkPacketQueue +{ + OSDeclareDefaultStructors( IOSkywalkRxSubmissionQueue ) + +public: + virtual IOReturn initialize( void * refCon ) APPLE_KEXT_OVERRIDE; + virtual void finalize() APPLE_KEXT_OVERRIDE; + virtual void enable() APPLE_KEXT_OVERRIDE; + virtual void disable() APPLE_KEXT_OVERRIDE; + + void gatedDequeue( void * refCon ); + virtual IOReturn requestDequeue( void * refCon, IOOptionBits options ); + void retryDequeue(); + + virtual IOReturn performCommand( UInt32 command, void * data, size_t dataSize ) APPLE_KEXT_OVERRIDE; + virtual void packetCompletion( IOSkywalkPacket * packet, IOSkywalkPacketQueue * queue, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + void adjustPacketCounters(); + virtual UInt32 getPacketCount() APPLE_KEXT_OVERRIDE; + UInt32 getEffectiveCapacity( IOOptionBits options ); + virtual bool checkForWork() APPLE_KEXT_OVERRIDE; + + static IOSkywalkRxSubmissionQueue * withPool( IOSkywalkPacketBufferPool * pool, UInt32 capacity, UInt32 queueId, kern_packet_svc_class_t serviceClass, OSObject * owner, IOSkywalkRxSubmissionQueueAction action, void * refCon, IOOptionBits options ); + virtual bool initWithPool( IOSkywalkPacketBufferPool * pool, UInt32 capacity, UInt32 queueId, kern_packet_svc_class_t serviceClass, OSObject * owner, IOSkywalkRxSubmissionQueueAction action, void * refCon, IOOptionBits options ) + virtual void free() APPLE_KEXT_OVERRIDE; + + void addReporters( IOService * target, OSSet * set ); + UInt64 getReportChannelValue( UInt64 reportChannel ); + + OSMetaClassDeclareReservedUnused( IOSkywalkRxSubmissionQueue, 0 ); + OSMetaClassDeclareReservedUnused( IOSkywalkRxSubmissionQueue, 1 ); + OSMetaClassDeclareReservedUnused( IOSkywalkRxSubmissionQueue, 2 ); + OSMetaClassDeclareReservedUnused( IOSkywalkRxSubmissionQueue, 3 ); + OSMetaClassDeclareReservedUnused( IOSkywalkRxSubmissionQueue, 4 ); + OSMetaClassDeclareReservedUnused( IOSkywalkRxSubmissionQueue, 5 ); + OSMetaClassDeclareReservedUnused( IOSkywalkRxSubmissionQueue, 6 ); + OSMetaClassDeclareReservedUnused( IOSkywalkRxSubmissionQueue, 7 ); + OSMetaClassDeclareReservedUnused( IOSkywalkRxSubmissionQueue, 8 ); + OSMetaClassDeclareReservedUnused( IOSkywalkRxSubmissionQueue, 9 ); + OSMetaClassDeclareReservedUnused( IOSkywalkRxSubmissionQueue, 10 ); + +protected: + void * mReserved; // 192 + IOSkywalkPacketTable * mTable; // 200 + IOLock * mInitLock; // 208 + IOSkywalkRxSubmissionQueueStats * mStats; // 216 + thread_call_t mRetryDequeueThread; // 224 + uint64_t _reserved0; // 232 + UInt32 mQueueId; // 240 + UInt32 ; // 244 + UInt32 ; // 248 + UInt32 ; // 252 + UInt32 ; // 256 + UInt32 ; // 260 + UInt32 ; // 264 + uint64_t _reserved1[2]; // 272 +}; + +#endif diff --git a/QualcommWireless/include/IOKit/skywalk/IOSkywalkSupport.h b/QualcommWireless/include/IOKit/skywalk/IOSkywalkSupport.h new file mode 100644 index 0000000..17d6f3d --- /dev/null +++ b/QualcommWireless/include/IOKit/skywalk/IOSkywalkSupport.h @@ -0,0 +1,402 @@ +/* + * Copyright (c) 2015-2022 Apple, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef _IOSKYWALKSUPPORT_H +#define _IOSKYWALKSUPPORT_H + +#include <sys/queue.h> +#include <IOKit/IOService.h> +#include <IOKit/IOBufferMemoryDescriptor.h> +#include <IOKit/IOMultiMemoryDescriptor.h> + +typedef uint32_t IOSKSize; +typedef uint32_t IOSKIndex; +typedef uint32_t IOSKCount; +typedef uint32_t IOSKOffset; + +typedef struct +{ + boolean_t userWritable; /* writable by user task */ + boolean_t kernelWritable; /* writable by kernel task */ + boolean_t iodirIn; /* direction: device-to-host */ + boolean_t iodirOut; /* direction: host-to-device */ + boolean_t purgeable; /* purgeable (not wired) */ + boolean_t inhibitCache; /* cache-inhibit */ + boolean_t physContig; /* physically contiguous */ + boolean_t pureData; /* data only, no pointers */ +} IOSKMemoryBufferSpec; + +typedef struct +{ + boolean_t noRedirect; +} IOSKRegionSpec; + +const OSSymbol * IOSKCopyKextIdentifierWithAddress( vm_address_t address ); + +class IOMemoryDescriptor; +typedef IOMemoryDescriptor * IOSKMemoryRef; +typedef IOSKMemoryRef IOSKMemoryArrayRef; +typedef IOSKMemoryRef IOSKMemoryBufferRef; + +class IOSKArena; +typedef IOSKArena * IOSKArenaRef; + +class IOSKRegion; +typedef IOSKRegion * IOSKRegionRef; + +class IOSKMapper; +typedef IOSKMapper * IOSKMapperRef; +typedef IOSKMemoryRef IOSKMemoryDescriptor; + +class IOMemoryMap; +typedef IOMemoryMap * IOSKMemoryMapRef; + +#define IOSK_CONSUMED LIBKERN_CONSUMED + +__BEGIN_DECLS + +IOSKMemoryBufferRef IOSKMemoryBufferCreate( mach_vm_size_t capacity, + const IOSKMemoryBufferSpec * spec, + mach_vm_address_t * kvaddr ); + +IOSKMemoryArrayRef IOSKMemoryArrayCreate( const IOSKMemoryRef refs[], + uint32_t count ); + +void IOSKMemoryDestroy( IOSK_CONSUMED IOSKMemoryRef reference ); + +IOSKMemoryMapRef IOSKMemoryMapToTask( IOSKMemoryRef reference, + task_t intoTask, + mach_vm_address_t * mapAddr, + mach_vm_size_t * mapSize ); + +IOSKMemoryMapRef IOSKMemoryMapToKernelTask( IOSKMemoryRef reference, + mach_vm_address_t * mapAddr, + mach_vm_size_t * mapSize ); + +void IOSKMemoryMapDestroy( + IOSK_CONSUMED IOSKMemoryMapRef reference ); + +IOReturn IOSKMemoryReclaim( IOSKMemoryRef reference ); +IOReturn IOSKMemoryDiscard( IOSKMemoryRef reference ); + +IOReturn IOSKMemoryWire( IOSKMemoryRef reference ); +IOReturn IOSKMemoryUnwire( IOSKMemoryRef reference ); + +IOSKArenaRef +IOSKArenaCreate( IOSKRegionRef * regionList, IOSKCount regionCount ); + +void +IOSKArenaDestroy( IOSK_CONSUMED IOSKArenaRef arena ); + +void +IOSKArenaRedirect( IOSKArenaRef arena ); + +IOSKRegionRef +IOSKRegionCreate( const IOSKRegionSpec * regionSpec, + IOSKSize segmentSize, IOSKCount segmentCount ); + +void +IOSKRegionDestroy( IOSK_CONSUMED IOSKRegionRef region ); + +IOReturn +IOSKRegionSetBuffer( IOSKRegionRef region, IOSKIndex segmentIndex, + IOSKMemoryBufferRef buffer ); + +void +IOSKRegionClearBuffer( IOSKRegionRef region, IOSKIndex segmentIndex ); + +void +IOSKRegionClearBufferDebug( IOSKRegionRef region, IOSKIndex segmentIndex, + IOSKMemoryBufferRef * prevBufferRef ); + +IOSKMapperRef +IOSKMapperCreate( IOSKArenaRef arena, task_t task ); + +void +IOSKMapperDestroy( IOSK_CONSUMED IOSKMapperRef mapper ); + +void +IOSKMapperRedirect( IOSKMapperRef mapper ); + +IOReturn +IOSKMapperGetAddress( IOSKMapperRef mapper, + mach_vm_address_t * address, mach_vm_size_t * size ); + +boolean_t +IOSKBufferIsWired( IOSKMemoryBufferRef buffer ); + +__END_DECLS + +class IOSKMemoryArray : public IOMultiMemoryDescriptor +{ + OSDeclareFinalStructors( IOSKMemoryArray ) + +public: + bool overwriteMappingInTask( + task_t intoTask, + mach_vm_address_t * startAddr, + IOOptionBits options ); +}; + +class IOSKMemoryBuffer : public IOBufferMemoryDescriptor +{ + OSDeclareFinalStructors( IOSKMemoryBuffer ) + +public: + bool initWithSpec( task_t inTask, + mach_vm_size_t capacity, + mach_vm_address_t alignment, + const IOSKMemoryBufferSpec * spec ); + + virtual void * getBytesNoCopy( void ) APPLE_KEXT_OVERRIDE; + + virtual void * getBytesNoCopy(vm_size_t start, vm_size_t withLength) APPLE_KEXT_OVERRIDE; + + bool + isWired( void ) const + { + return _wireCount != 0; + } + + IOSKMemoryBufferSpec fSpec; + void *fKernelAddr; + IOMemoryMap *fKernelReadOnlyMapping; + +protected: + virtual void taggedRelease(const void *tag = NULL) const APPLE_KEXT_OVERRIDE; + virtual void free( void ) APPLE_KEXT_OVERRIDE; +}; + +// FIXME: rename IOSKMemoryBuffer -> IOSKBuffer +typedef IOSKMemoryBuffer IOSKBuffer; + +/*! @class IOSKRegionMapper + @abstract IOSkywalk memory mapper of a IOSKRegion. + @discussion Tracks all memory mappings of a single IOSKRegion, with an array of IOMemoryMaps to map the region's memory segments. Created and released by the parent IOSKMapper. +*/ + +class IOSKRegionMapper : public OSObject +{ + OSDeclareFinalStructors( IOSKRegionMapper ) + +public: + bool initWithMapper( IOSKMapper * mapper, IOSKRegion * region, + IOSKOffset regionOffset ); + + IOReturn map( IOSKIndex segIndex, IOSKBuffer * buffer ); + void unmap( IOSKIndex segIndex, vm_prot_t prot ); + + kern_return_t mapOverwrite( vm_map_offset_t addr, + vm_map_size_t size, vm_prot_t prot ); + +private: + virtual void free( void ) APPLE_KEXT_OVERRIDE; + + IOSKMapper * fMapper; + IOSKRegion * fRegion; + IOMemoryMap ** fMemoryMaps; + IOSKCount fMemoryMapCount; + IOSKOffset fRegionOffset; +}; + +/*! @class IOSKMapper + @abstract IOSkywalk memory mapper of a task. + @discussion Manages all memory mappings of a single task, with an array of IOSKRegionMappers to map all memory regions of a memory arena. Retains the IOSKArena. +*/ + +class IOSKMapper : public OSObject +{ + OSDeclareFinalStructors( IOSKMapper ) + friend class IOSKRegionMapper; + +public: + bool initWithTask( task_t task, IOSKArena * arena ); + + IOReturn map( IOSKIndex regIndex, IOSKIndex segIndex, IOSKBuffer * buffer ); + void unmap( IOSKIndex regIndex, IOSKIndex segIndex, vm_prot_t prot ); + + mach_vm_address_t + getMapAddress( mach_vm_size_t * size ) const + { + if (size) + *size = fMapSize; + return fMapAddr; + } + + IOSKArena * + getArena( void ) const + { + return fArena; + } + bool + isRedirected( void ) const + { + return fRedirected; + } + void + redirectMap( void ) + { + fRedirected = true; + } + +private: + virtual void free( void ) APPLE_KEXT_OVERRIDE; + + task_t fTask; + vm_map_t fTaskMap; + IOSKArena * fArena; + OSArray * fSubMaps; + mach_vm_address_t fMapAddr; + mach_vm_size_t fMapSize; + bool fRedirected; +}; + +/*! @class IOSKArena + @abstract IOSkywalk memory buffer arena consisting of IOSKRegions. + @discussion An array of IOSKRegions is used to create an IOSKArena. One or more IOSKMapper can map the arena memory to tasks. Retains the IOSKRegions, also circularly retains the IOSKMapper(s) until the client calls IOSKMapperDestroy(). +*/ + +class IOSKArena : public OSObject +{ + OSDeclareFinalStructors( IOSKArena ) + +public: + bool initWithRegions( IOSKRegion ** regions, + IOSKCount regionCount ); + + IOReturn createMapperForTask( task_t task, + LIBKERN_RETURNS_RETAINED IOSKMapper ** mapper ); + void redirectMap( IOSKMapper * mapper ); + + IOSKSize + getArenaSize( void ) const + { + return fArenaSize; + } + IOSKCount + getRegionCount( void ) const + { + return fRegions->getCount(); + } + IOSKRegion * getRegion( IOSKIndex regIndex ) const; + + IOReturn map( const IOSKRegion * region, + IOSKOffset regionOffset, + IOSKIndex regionIndex, + IOSKIndex segmentIndex, + IOSKMemoryBuffer * buffer ); + + void unmap( const IOSKRegion * region, + IOSKOffset regionOffset, + IOSKIndex regionIndex, + IOSKIndex segmentIndex, + vm_prot_t prot, + bool isRedirected, + const void * context ); + + bool addMapper( const IOSKMapper * mapper ); + void removeMapper( const IOSKMapper * mapper ); + +private: + virtual void free( void ) APPLE_KEXT_OVERRIDE; + + IOLock * fArenaLock; + OSSet * fMappers; + OSArray * fRegions; + IOSKSize fArenaSize; +}; + +/*! @class IOSKRegion + @abstract IOSkywalk memory buffer region. + @discussion An IOSKRegion manages a dynamic array of IOSKBuffers representing each memory segment in the region. Each IOSKRegion can be shared by multiple IOSKArenas, and the IOSKRegion keeps state specific to each arena - the offset and the index of the region within the arena. A lock is used to serialize updates to the IOSKBuffer array and the arenas. Retains the IOSKBuffers. +*/ + +class IOSKRegion : public OSObject +{ + OSDeclareFinalStructors( IOSKRegion ) + +public: + bool initWithSpec( const IOSKRegionSpec * spec, + IOSKSize segSize, IOSKCount segCount ); + + IOReturn setSegmentBuffer( IOSKIndex index, IOSKBuffer * buf ); + void clearSegmentBuffer( IOSKIndex index, IOSKMemoryBufferRef * prevBuffer ); + + bool attachArena( IOSKArena * arena, + IOSKOffset regionOffset, IOSKIndex regionIndex ); + void detachArena( const IOSKArena * arena ); + + IOReturn updateMappingsForArena( IOSKArena * arena, bool redirect, + const void * context = NULL ); + + IOSKCount + getSegmentCount( void ) const + { + return fSegmentCount; + } + IOSKSize + getSegmentSize( void ) const + { + return fSegmentSize; + } + IOSKSize + getRegionSize( void ) const + { + return fSegmentCount * fSegmentSize; + } + +private: + virtual void free( void ) APPLE_KEXT_OVERRIDE; + + struct Segment + { + IOSKBuffer * fBuffer; + }; + + struct ArenaEntry + { + SLIST_ENTRY(ArenaEntry) link; + IOSKArena * fArena; + IOSKOffset fRegionOffset; + IOSKIndex fRegionIndex; + }; + SLIST_HEAD(ArenaHead, ArenaEntry); + + IOReturn _setSegmentBuffer( const IOSKIndex index, IOSKMemoryBuffer * buf ); + void _clearSegmentBuffer( const IOSKIndex index, IOSKMemoryBufferRef * prevBuffer ); + ArenaEntry * findArenaEntry( const IOSKArena * arena ); + + IOSKRegionSpec fSpec; + IOLock * fRegionLock; + ArenaHead * fArenaHead; + Segment * fSegments; + IOSKCount fSegmentCount; + IOSKSize fSegmentSize; +}; + +#endif diff --git a/QualcommWireless/include/IOKit/skywalk/IOSkywalkTxCompletionQueue.h b/QualcommWireless/include/IOKit/skywalk/IOSkywalkTxCompletionQueue.h new file mode 100644 index 0000000..5b3eae9 --- /dev/null +++ b/QualcommWireless/include/IOKit/skywalk/IOSkywalkTxCompletionQueue.h @@ -0,0 +1,151 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2022 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKTXCOMPLETIONQUEUE_H +#define _IOSKYWALKTXCOMPLETIONQUEUE_H + +#include <IOKit/skywalk/IOSkywalkPacketQueue.h> + +extern void queueNotifyAction( IOSkywalkPacketQueue * target, void * refCon ); + +class IOSkywalkTxCompletionQueue; +class IOSkywalkPacketTable; + +typedef IOReturn (*IOSkywalkTxCompletionQueueAction)( OSObject * owner, IOSkywalkTxCompletionQueue *, IOSkywalkPacket **, UInt32, void * ); + +/*! @struct IOSkywalkTxCompletionQueueStats + @abstract A structure containing counters of serveral functions in the IOSkywalkTxCompletionQueue class. + @field enqueueCounter Increment with each successful enqueue operation, regardless of the function utilized. + @field checkForWorkCounter Increment with each call to checkForWork() if enqueueAndCompletePackets() is executed. + @field enqueueFailureCounter Increment with each failed enqueue operation. + @field completeCounter The number of packets completed, updated each time completePackets() is called. +*/ +struct IOSkywalkTxCompletionQueueStats +{ + UInt64 enqueueCounter; + UInt64 checkForWorkCounter; + UInt64 enqueueFailureCounter; + UInt64 completeCounter; +}; + +class IOSkywalkTxCompletionQueue : public IOSkywalkPacketQueue +{ + OSDeclareDefaultStructors( IOSkywalkTxCompletionQueue ) + +public: + virtual IOReturn initialize( void * refCon ) APPLE_KEXT_OVERRIDE; + virtual void finalize() APPLE_KEXT_OVERRIDE; + virtual void enable() APPLE_KEXT_OVERRIDE; + virtual void disable() APPLE_KEXT_OVERRIDE; + + virtual IOReturn performCommand( UInt32 command, void * data, size_t dataSize ) APPLE_KEXT_OVERRIDE; + virtual IOReturn requestEnqueue( void * packets, IOOptionBits options ); + virtual IOReturn enqueuePackets( const IOSkywalkPacket ** packets, UInt32 packetCount, IOOptionBits options ); + virtual IOReturn enqueuePackets( const queue_entry * packets, UInt32 packetCount, IOOptionBits options ); + void completePackets(); + IOReturn enqueueAndCompletePackets( void * packets ); + virtual UInt32 getPacketCount() APPLE_KEXT_OVERRIDE; + UInt32 getEffectiveCapacity( IOOptionBits options ); + virtual bool checkForWork() APPLE_KEXT_OVERRIDE; + + static IOSkywalkTxCompletionQueue * withPool( IOSkywalkPacketBufferPool * pool, UInt32 capacity, UInt32 queueId, OSObject * owner, IOSkywalkTxCompletionQueueAction action, void * refCon, IOOptionBits options ); + virtual bool initWithPool( IOSkywalkPacketBufferPool * pool, UInt32 capacity, UInt32 queueId, OSObject * owner, IOSkywalkTxCompletionQueueAction action, void * refCon, IOOptionBits options ); + virtual void free() APPLE_KEXT_OVERRIDE; + + void addReporters( IOService * target, OSSet * set ); + UInt64 getReportChannelValue( UInt64 reportChannel ); + + OSMetaClassDeclareReservedUnused( IOSkywalkTxCompletionQueue, 0 ); + OSMetaClassDeclareReservedUnused( IOSkywalkTxCompletionQueue, 1 ); + OSMetaClassDeclareReservedUnused( IOSkywalkTxCompletionQueue, 2 ); + OSMetaClassDeclareReservedUnused( IOSkywalkTxCompletionQueue, 3 ); + OSMetaClassDeclareReservedUnused( IOSkywalkTxCompletionQueue, 4 ); + OSMetaClassDeclareReservedUnused( IOSkywalkTxCompletionQueue, 5 ); + OSMetaClassDeclareReservedUnused( IOSkywalkTxCompletionQueue, 6 ); + OSMetaClassDeclareReservedUnused( IOSkywalkTxCompletionQueue, 7 ); + OSMetaClassDeclareReservedUnused( IOSkywalkTxCompletionQueue, 8 ); + OSMetaClassDeclareReservedUnused( IOSkywalkTxCompletionQueue, 9 ); + OSMetaClassDeclareReservedUnused( IOSkywalkTxCompletionQueue, 10 ); + +protected: + /*! @var mReserved + * The first variable of every class in IOSkywalkFamily is reserved. + * Offset: 192. */ + void * mReserved; + + /*! @var mTable + * The IOSkywalkPacketTable in which the packets of this queue are stored. + * Offset: 200. */ + IOSkywalkPacketTable * mTable; + + /*! @var mInitLock + * An IOLock governing the initialize() and finalize() routines. + * Offset: 208. */ + IOLock * mInitLock; + + /*! @var mStats + * Structure containing various counters related to this class. + * Offset: 216. */ + IOSkywalkTxCompletionQueueStats * mStats; + + /*! @var mCommandData + * Data for command 0x50000. + * Offset: 224. */ + void * mCommandData; + + uint64_t _reserved0[2]; + + /*! @var mActionStatus + * Set when $link action runs and clear when it completes. No new enqueue request should happen when this flag is set. + * Offset: 248. */ + UInt32 mActionStatus; + + /*! @var mInitCounter + * Incremented by initialize() and decremented by finalize(). + * Offset: 252. */ + UInt32 mInitCounter; + + /*! @var mWorkCounter + * The number of works to do, incremented in requestEnqueue(). A work in this class could be considered as an enqueue request. + * Offset: 256. */ + UInt32 mWorkCounter; + + /*! @var mNumCheckedWorks + * Updated with the value of $link mWorkCounter whenever checkForWork() is called. + * Offset: 260. */ + UInt32 mNumCheckedWorks; + + uint64_t _reserved1[2]; +}; + +#endif diff --git a/QualcommWireless/include/IOKit/skywalk/IOSkywalkTxSubmissionQueue.h b/QualcommWireless/include/IOKit/skywalk/IOSkywalkTxSubmissionQueue.h new file mode 100644 index 0000000..1805062 --- /dev/null +++ b/QualcommWireless/include/IOKit/skywalk/IOSkywalkTxSubmissionQueue.h @@ -0,0 +1,125 @@ +/* + * Released under "The BSD 3-Clause License" + * + * Copyright (c) 2022 cjiang. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _IOSKYWALKTXSUBMISSIONQUEUE_H +#define _IOSKYWALKTXSUBMISSIONQUEUE_H + +#include <IOKit/skywalk/IOSkywalkPacketQueue.h> + +class IOSkywalkTxSubmissionQueue; +class IOSkywalkPacketTable; +class IOSkywalkRing; + +typedef IOReturn (*IOSkywalkQueryFreeSpaceHandler) ( OSObject * owner, IOSkywalkTxSubmissionQueue * queue, UInt32 * outSpace ); +typedef IOReturn (*IOSkywalkTxSubmissionQueueAction)( OSObject * owner, IOSkywalkTxSubmissionQueue * queue, const IOSkywalkPacket **, UInt32, void * ); + +struct IOSkywalkTxSubmissionQueueStats; // size = 128 + +class IOSkywalkTxSubmissionQueue : public IOSkywalkPacketQueue +{ + OSDeclareDefaultStructors( IOSkywalkTxSubmissionQueue ) + +public: + virtual IOReturn initialize( void * refCon ) APPLE_KEXT_OVERRIDE; + virtual void finalize() APPLE_KEXT_OVERRIDE; + virtual void enable() APPLE_KEXT_OVERRIDE; + virtual void disable() APPLE_KEXT_OVERRIDE; + + virtual IOReturn synchronize( IOOptionBits options ) APPLE_KEXT_OVERRIDE; + void requestAsyncRefill(); + void refillTxRing( bool txDoorbellContext ); + + virtual IOReturn sendNotification( IOOptionBits options ) APPLE_KEXT_OVERRIDE; + virtual IOReturn handleDoorbell( IOOptionBits options ) APPLE_KEXT_OVERRIDE; + + void gatedDequeue( void * refCon ); + virtual IOReturn requestDequeue( void * refCon, IOOptionBits options ); + virtual void purgePackets(); + + virtual IOReturn performCommand( UInt32 command, void * data, size_t dataSize ) APPLE_KEXT_OVERRIDE; + virtual void packetCompletion( IOSkywalkPacket * packet, IOSkywalkPacketQueue * queue, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + void adjustPacketCounters(); + virtual UInt32 getPacketCount() APPLE_KEXT_OVERRIDE; + virtual IOReturn getDataByteCount( UInt32 * count ) APPLE_KEXT_OVERRIDE; + UInt32 getEffectiveCapacity( IOOptionBits options ); + virtual bool checkForWork() APPLE_KEXT_OVERRIDE; + + // outSpace is unused + static UInt32 defaultQueryFreeSpaceHandler( OSObject * owner, IOSkywalkTxSubmissionQueue * queue, UInt32 * outSpace ); + UInt32 defaultQueryFreeSpace( UInt32 * outSpace ); + + static IOSkywalkTxSubmissionQueue * withPoolAndServiceClass( IOSkywalkPacketBufferPool * pool, UInt32 capacity, UInt32 queueId, kern_packet_svc_class_t serviceClass, OSObject * owner, IOSkywalkQueryFreeSpaceHandler handler, IOSkywalkTxSubmissionQueueAction action, void * refCon, IOOptionBits options ); + static IOSkywalkTxSubmissionQueue * withPool( IOSkywalkPacketBufferPool * pool, UInt32 capacity, UInt32 queueId, OSObject * owner, IOSkywalkQueryFreeSpaceHandler handler, IOSkywalkTxSubmissionQueueAction action, void * refCon, IOOptionBits options ); + static IOSkywalkTxSubmissionQueue * withPool( IOSkywalkPacketBufferPool * pool, UInt32 capacity, UInt32 queueId, OSObject * owner, IOSkywalkTxSubmissionQueueAction action, void * refCon, IOOptionBits options ); + virtual bool initWithPool( IOSkywalkPacketBufferPool * pool, UInt32 capacity, UInt32 queueId, kern_packet_svc_class_t serviceClass, OSObject * owner, IOSkywalkQueryFreeSpaceHandler handler, IOSkywalkTxSubmissionQueueAction action, void * refCon, IOOptionBits options ); + virtual void free() APPLE_KEXT_OVERRIDE; + + void addReporters( IOService * target, OSSet * set ); + UInt64 getReportChannelValue( UInt64 reportChannel ); + + OSMetaClassDeclareReservedUnused( IOSkywalkTxSubmissionQueue, 0 ); + OSMetaClassDeclareReservedUnused( IOSkywalkTxSubmissionQueue, 1 ); + OSMetaClassDeclareReservedUnused( IOSkywalkTxSubmissionQueue, 2 ); + OSMetaClassDeclareReservedUnused( IOSkywalkTxSubmissionQueue, 3 ); + OSMetaClassDeclareReservedUnused( IOSkywalkTxSubmissionQueue, 4 ); + OSMetaClassDeclareReservedUnused( IOSkywalkTxSubmissionQueue, 5 ); + OSMetaClassDeclareReservedUnused( IOSkywalkTxSubmissionQueue, 6 ); + OSMetaClassDeclareReservedUnused( IOSkywalkTxSubmissionQueue, 7 ); + OSMetaClassDeclareReservedUnused( IOSkywalkTxSubmissionQueue, 8 ); + OSMetaClassDeclareReservedUnused( IOSkywalkTxSubmissionQueue, 9 ); + OSMetaClassDeclareReservedUnused( IOSkywalkTxSubmissionQueue, 10 ); + +protected: + void * mReserved; // 192 + IOSkywalkRing * mRing; // 200 + IOSkywalkPacketTable * mTable; // 208 + IOSkywalkQueryFreeSpaceHandler mQueryFreeSpaceHandler; // 216 + ifnet_t mIfnet; // 224 + IOSkywalkTxSubmissionQueueStats * mStats; // 232 + uint64_t _reserved0[3]; // 240 + UInt32 mPacketCount; // 264 + UInt32 mNumCompletedPackets; // 268 + // 272 + // 276 + // 280 + // 284 + // 288 + // 292 + // 300 + // 308 + // 316 +}; + +// 344 + +#endif diff --git a/QualcommWireless/include/IOKit/skywalk/IOSkywalkTypes.h b/QualcommWireless/include/IOKit/skywalk/IOSkywalkTypes.h new file mode 100644 index 0000000..a0e1ca0 --- /dev/null +++ b/QualcommWireless/include/IOKit/skywalk/IOSkywalkTypes.h @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2019-2022 Apple, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef _IOSKYWALKTYPES_H +#define _IOSKYWALKTYPES_H + +#include <IOKit/IOLib.h> + +typedef uint32_t IOSkywalkNetworkLinkStatus; +enum +{ + kIOSkywalkNetworkLinkStatusInvalid = 0x00000000, + kIOSkywalkNetworkLinkStatusInactive = 0x00000001, + kIOSkywalkNetworkLinkStatusActive = 0x00000003, + kIOSkywalkNetworkLinkStatusWakeSameNet = 0x00000004 +}; + +typedef uint32_t IOSkywalkNetworkLinkQuality; +enum +{ + kIOSkywalkNetworkLinkQualityOff = (-2), + kIOSkywalkNetworkLinkQualityUnknown = (-1), + kIOSkywalkNetworkLinkQualityBad = 10, + kIOSkywalkNetworkLinkQualityPoor = 50, + kIOSkywalkNetworkLinkQualityGood = 100 +}; + +enum { + kIOSkywalkNetworkMediaOptionFullDuplex = 0x00100000, + kIOSkywalkNetworkMediaOptionHalfDuplex = 0x00200000, + kIOSkywalkNetworkMediaOptionFlowControl = 0x00400000, + kIOSkywalkNetworkMediaOptionEEE = 0x00800000, + kIOSkywalkNetworkMediaOptionLoopback = 0x08000000 +}; + +typedef uint32_t IOSkywalkNetworkMediaType; +enum +{ + kIOSkywalkNetworkMediaEthernetAuto = 0x00000020, + kIOSkywalkNetworkMediaEthernetManual = 0x00000021, + kIOSkywalkNetworkMediaEthernetNone = 0x00000022, + kIOSkywalkNetworkMediaEthernet10BaseT = 0x00000023, + kIOSkywalkNetworkMediaEthernet10Base2 = 0x00000024, + kIOSkywalkNetworkMediaEthernet10Base5 = 0x00000025, + kIOSkywalkNetworkMediaEthernet100BaseTX = 0x00000026, + kIOSkywalkNetworkMediaEthernet100BaseFX = 0x00000027, + kIOSkywalkNetworkMediaEthernet100BaseT4 = 0x00000028, + kIOSkywalkNetworkMediaEthernet100BaseVG = 0x00000029, + kIOSkywalkNetworkMediaEthernet100BaseT2 = 0x0000002a, + kIOSkywalkNetworkMediaEthernet1000BaseSX = 0x0000002b, + kIOSkywalkNetworkMediaEthernet10BaseSTP = 0x0000002c, + kIOSkywalkNetworkMediaEthernet10BaseFL = 0x0000002d, + kIOSkywalkNetworkMediaEthernet1000BaseLX = 0x0000002e, + kIOSkywalkNetworkMediaEthernet1000BaseCX = 0x0000002f, + kIOSkywalkNetworkMediaEthernet1000BaseT = 0x00000030, + kIOSkywalkNetworkMediaEthernetHomePNA1 = 0x00000031, + kIOSkywalkNetworkMediaEthernet10GBaseSR = 0x00000032, + kIOSkywalkNetworkMediaEthernet10GBaseLR = 0x00000033, + kIOSkywalkNetworkMediaEthernet10GBaseCX4 = 0x00000034, + kIOSkywalkNetworkMediaEthernet10GBaseT = 0x00000035, + kIOSkywalkNetworkMediaEthernet2500BaseT = 0x00000036, + kIOSkywalkNetworkMediaEthernet5000BaseT = 0x00000037, + kIOSkywalkNetworkMediaEthernet1000BaseCX_SGMII = 0x00000038, + kIOSkywalkNetworkMediaEthernet1000BaseKX = 0x00000039, + kIOSkywalkNetworkMediaEthernet10GBaseKX4 = 0x0000003a, + kIOSkywalkNetworkMediaEthernet10GBaseKR = 0x0000003b, + kIOSkywalkNetworkMediaEthernet10GBaseCR1 = 0x0000003c, + kIOSkywalkNetworkMediaEthernet10GBaseER = 0x0000003d, + kIOSkywalkNetworkMediaEthernet20GBaseKR2 = 0x0000003e, + kIOSkywalkNetworkMediaEthernet25GBaseCR = 0x0000003f, + kIOSkywalkNetworkMediaEthernet25GBaseKR = 0x00000820, + kIOSkywalkNetworkMediaEthernet25GBaseSR = 0x00000821, + kIOSkywalkNetworkMediaEthernet25GBaseLR = 0x00000822, + kIOSkywalkNetworkMediaEthernet40GBaseCR4 = 0x00000823, + kIOSkywalkNetworkMediaEthernet40GBaseSR4 = 0x00000824, + kIOSkywalkNetworkMediaEthernet40GBaseLR4 = 0x00000825, + kIOSkywalkNetworkMediaEthernet40GBaseKR4 = 0x00000826, + kIOSkywalkNetworkMediaEthernet50GBaseCR2 = 0x00000827, + kIOSkywalkNetworkMediaEthernet50GBaseKR2 = 0x00000828, + kIOSkywalkNetworkMediaEthernet50GBaseSR2 = 0x00000829, + kIOSkywalkNetworkMediaEthernet50GBaseLR2 = 0x0000082a, + kIOSkywalkNetworkMediaEthernet56GBaseR4 = 0x0000082b, + kIOSkywalkNetworkMediaEthernet100GBaseCR4 = 0x0000082c, + kIOSkywalkNetworkMediaEthernet100GBaseSR4 = 0x0000082d, + kIOSkywalkNetworkMediaEthernet100GBaseKR4 = 0x0000082e, + kIOSkywalkNetworkMediaEthernet100GBaseLR4 = 0x0000082f, + kIOSkywalkNetworkMediaEthernetMask = 0x00000fff +}; + +enum +{ + kIOSkywalkNetworkFeatureFlagSoftwareVlan = 0x00020000, + kIOSkywalkNetworkFeatureFlagWOMP = 0x04000000, + kIOSkywalkNetworkFeatureFlagNicProxy = 0x08000000 +}; + +#endif diff --git a/QualcommWireless/include/IOKit/skywalk/IOUserNetworkEthernetNicProxy.h b/QualcommWireless/include/IOKit/skywalk/IOUserNetworkEthernetNicProxy.h new file mode 100644 index 0000000..b005098 --- /dev/null +++ b/QualcommWireless/include/IOKit/skywalk/IOUserNetworkEthernetNicProxy.h @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2020-2022 Apple, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef _IOUSERNETWORKETHERNETNICPROXY_H +#define _IOUSERNETWORKETHERNETNICPROXY_H + +#include <netinet/in.h> +#include <net/ethernet.h> +#pragma pack(1) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu-variable-sized-type-not-at-end" + +// +// IP V4 TCP Keepalive structure. +// +typedef struct nicproxy_v4_keep_alive_s { + uint32_t timeout; + in_port_t local_port; + in_port_t remote_port; + ether_addr_t remote_mac_addr; + uint16_t win_size; + uint32_t seq_num; + uint32_t ack_num; + in_addr_t local_ip; + in_addr_t remote_ip; +} nicproxy_v4_keep_alive_t; + +// +// IP V6 TCP Keepalive structure. +// +typedef struct nicproxy_v6_keep_alive_s { + uint32_t timeout; + in_port_t local_port; + in_port_t remote_port; + ether_addr_t remote_mac_addr; + uint16_t win_size; + uint32_t seq_num; + uint32_t ack_num; + in6_addr_t local_ip; + in6_addr_t remote_ip; +} nicproxy_v6_keep_alive_t; + +typedef struct nicproxy_inet_info_s { + uint8_t v4LocalAddrCount; + uint8_t v4AddrCount; + uint8_t v6LocalAddrCount; + uint8_t v6AddrCount; + // FW will add the base to the following offset members and will treat them as pointers. + // The offsets are relative to the start of this struct so that the struct is pretty much self-contained + // in_addr_t * + uint32_t v4AddrOfft; + // uint8_t * + uint32_t v4PrefixOfft; + // in6_addr * + uint32_t v6AddrOfft; + // uint8_t * + uint32_t v6PrefixOfft; +} nicproxy_inet_info_t; + +typedef struct nicproxy_port_info_s { + uint16_t UDPPortCount; + uint16_t TCPPortCount; + // in_port_t * + uint32_t UDPPortOfft; // See the comment in the nicproxy_inet_info struct + // in_port_t * + uint32_t TCPPortOfft; +} nicproxy_port_info_t; + +typedef struct nicproxy_keep_alive_info_s { + uint16_t v4KACount; + uint16_t v6KACount; + uint32_t retryCount; + uint32_t retryInterval; + // nicproxy_v4_keep_alive_t * + uint32_t v4KAOfft; // See the comment in the nicproxy_inet_info struct + // nicproxy_v6_keep_alive_t * + uint32_t v6KAOfft; +} nicproxy_keep_alive_info_t; + +typedef struct nicproxy_rr_info_s { + uint32_t RRCount; + uint32_t RRBufLen; + // Offset to RR index table relative to the start of offloadRRInfo struct. The indices + // themselves are relative to the start of RR buffer. FW can add the buffer address + // and treat them as pointers. + // uint8_t ** + uint32_t RRIdxOfft; + // Offset to the RR buffer relative to the start of offloadRRInfo struct. + // uint8_t * + uint32_t RRBufOfft; +} nicproxy_rr_info_t; + +#define NIC_PROXY_FLAGS_WONLINK (1 << 7); +#define NIC_PROXY_FLAGS_WOMP (1 << 6); + +typedef struct nicproxy_info_s { + uint32_t len; // The whole structure length including the variable-size buf + ether_addr_t mac_addr; + uint8_t flags; + uint8_t reserved; + nicproxy_inet_info_t ips; + nicproxy_port_info_t ports; + nicproxy_keep_alive_info_t kas; + nicproxy_rr_info_t rrs; + uint8_t buf[0]; +} nicproxy_info_t; + +// +// Resource Record definitions. +// +enum { + rr_ptr_mask = 0xc0, + rr_length_mask = 0x3f +}; + +typedef union rr_record_s { + struct { + uint8_t len; + union { + uint8_t name[]; + uint8_t record[]; + }; + } label; + struct { + uint8_t hb; + uint8_t lb; + uint8_t record[]; + } ptr; + struct { + uint16_t type; + uint16_t rr_class; + uint32_t ttl; + uint16_t len; + } rr; +} rr_record_t; + +typedef struct rr_sub_type_s { + uint16_t sub_typ_cnt; + uint8_t sub_typ_name[]; +} rr_sub_type_t; + +typedef struct rr_srv_record_s { + rr_record_t rr_record; + struct { + uint16_t priority; + uint16_t weight; + uint16_t port; + uint8_t target[]; + }; + rr_sub_type_t sub_type; +} rr_srv_record_t; + +typedef struct rr_txt_record_s { + rr_record_t rr_record; + uint8_t txt[]; +} rr_txt_record_t; + +typedef struct rr_ptr_record_s { + rr_record_t rr_record; + uint8_t name[]; +} rr_ptr_record_t; + +typedef struct rr_null_record_s { + rr_record_t rr_record; + uint8_t data[]; +} rr_null_record_t; + +typedef struct nicproxy_limits_info_s { + uint8_t ipv4_cnt; + uint8_t ipv6_cnt; + uint16_t kaIPv4Count; + uint16_t kaIPv6Count; + uint16_t wakeUDPCount; + uint16_t wakeTCPCount; + uint16_t rr_cnt; + uint8_t mDnsMaxDomainLen; + uint8_t ethCount; + uint16_t rr_buf_size; +} nicproxy_limits_info_t; + +#pragma clang diagnostic pop +#pragma pack() + +#endif diff --git a/QualcommWireless/include/IOKit/storage/IOAppleLabelScheme.h b/QualcommWireless/include/IOKit/storage/IOAppleLabelScheme.h new file mode 100644 index 0000000..242255e --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOAppleLabelScheme.h @@ -0,0 +1,191 @@ +/* + * Copyright (c) 1998-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/* + * This header contains the IOAppleLabelScheme class definition. + */ + +#ifndef _IOAPPLELABELSCHEME_H +#define _IOAPPLELABELSCHEME_H + +#include <IOKit/IOTypes.h> + +/* + * kIOAppleLabelSchemeClass is the name of the IOAppleLabelScheme class. + */ + +#define kIOAppleLabelSchemeClass "IOAppleLabelScheme" + +/* + * Apple Label Scheme Definitions + */ + +#pragma pack(push, 1) /* (enable 8-bit struct packing) */ + +/* Label scheme. */ + +struct applelabel +{ + uint8_t al_boot0[416]; /* (reserved for boot area) */ + uint16_t al_magic; /* (the magic number) */ + uint16_t al_type; /* (label type) */ + uint32_t al_flags; /* (generic flags) */ + uint64_t al_offset; /* (offset of property area, bytes) */ + uint32_t al_size; /* (size of property area, bytes) */ + uint32_t al_checksum; /* (checksum of property area) */ + uint8_t al_boot1[72]; /* (reserved for boot area) */ +}; + +/* Label scheme signature (al_magic). */ + +#define AL_MAGIC 0x414C + +/* Label scheme version (al_type). */ + +#define AL_TYPE_DEFAULT 0x0000 + +/* Label scheme flags (al_flags). */ + +#define AL_FLAG_DEFAULT 0x00000000 + +#pragma pack(pop) /* (reset to default struct packing) */ + +#ifdef KERNEL +#ifdef __cplusplus + +/* + * Kernel + */ + +#include <IOKit/storage/IOFilterScheme.h> + +/* + * Class + */ + +class IOAppleLabelScheme : public IOFilterScheme +{ + OSDeclareDefaultStructors(IOAppleLabelScheme); + +protected: + + struct ExpansionData { /* */ }; + ExpansionData * _expansionData; + + IOMedia * _content; + + /* + * Free all of this object's outstanding resources. + */ + + virtual void free(void) APPLE_KEXT_OVERRIDE; + + /* + * Scan the provider media for an Apple label scheme. + */ + + virtual IOMedia * scan(SInt32 * score); + + /* + * Ask whether the given content appears to be corrupt. + */ + + virtual bool isContentCorrupt(OSDictionary * properties); + + /* + * Ask whether the given content appears to be invalid. + */ + + virtual bool isContentInvalid(OSDictionary * properties); + + /* + * Instantiate a new media object to represent the given content. + */ + + virtual IOMedia * instantiateMediaObject(OSDictionary * properties); + + /* + * Allocate a new media object (called from instantiateMediaObject). + */ + + virtual IOMedia * instantiateDesiredMediaObject(OSDictionary * properties); + + /* + * Attach the given media object to the device tree plane. + */ + + virtual bool attachMediaObjectToDeviceTree(IOMedia * media); + + /* + * Detach the given media object from the device tree plane. + */ + + virtual void detachMediaObjectFromDeviceTree(IOMedia * media); + +public: + + /* + * Initialize this object's minimal state. + */ + + virtual bool init(OSDictionary * properties = 0) APPLE_KEXT_OVERRIDE; + + /* + * Determine whether the provider media contains an Apple label scheme. + */ + + virtual IOService * probe(IOService * provider, SInt32 * score) APPLE_KEXT_OVERRIDE; + + /* + * Publish the new media object which represents our content. + */ + + virtual bool start(IOService * provider) APPLE_KEXT_OVERRIDE; + + /* + * Clean up after the media object we published before terminating. + */ + + virtual void stop(IOService * provider) APPLE_KEXT_OVERRIDE; + + OSMetaClassDeclareReservedUnused(IOAppleLabelScheme, 0); + OSMetaClassDeclareReservedUnused(IOAppleLabelScheme, 1); + OSMetaClassDeclareReservedUnused(IOAppleLabelScheme, 2); + OSMetaClassDeclareReservedUnused(IOAppleLabelScheme, 3); + OSMetaClassDeclareReservedUnused(IOAppleLabelScheme, 4); + OSMetaClassDeclareReservedUnused(IOAppleLabelScheme, 5); + OSMetaClassDeclareReservedUnused(IOAppleLabelScheme, 6); + OSMetaClassDeclareReservedUnused(IOAppleLabelScheme, 7); + OSMetaClassDeclareReservedUnused(IOAppleLabelScheme, 8); + OSMetaClassDeclareReservedUnused(IOAppleLabelScheme, 9); + OSMetaClassDeclareReservedUnused(IOAppleLabelScheme, 10); + OSMetaClassDeclareReservedUnused(IOAppleLabelScheme, 11); + OSMetaClassDeclareReservedUnused(IOAppleLabelScheme, 12); + OSMetaClassDeclareReservedUnused(IOAppleLabelScheme, 13); + OSMetaClassDeclareReservedUnused(IOAppleLabelScheme, 14); + OSMetaClassDeclareReservedUnused(IOAppleLabelScheme, 15); +}; + +#endif /* __cplusplus */ +#endif /* KERNEL */ +#endif /* !_IOAPPLELABELSCHEME_H */ diff --git a/QualcommWireless/include/IOKit/storage/IOApplePartitionScheme.h b/QualcommWireless/include/IOKit/storage/IOApplePartitionScheme.h new file mode 100644 index 0000000..8e9f2c3 --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOApplePartitionScheme.h @@ -0,0 +1,251 @@ +/* + * Copyright (c) 1998-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/* + * This header contains the IOApplePartitionScheme class definition. + */ + +#ifndef _IOAPPLEPARTITIONSCHEME_H +#define _IOAPPLEPARTITIONSCHEME_H + +#include <IOKit/IOTypes.h> + +/* + * kIOApplePartitionSchemeClass is the name of the IOApplePartitionScheme class. + */ + +#define kIOApplePartitionSchemeClass "IOApplePartitionScheme" + +/* + * Apple Partition Map Definitions + */ + +#pragma pack(push, 1) /* (enable 8-bit struct packing) */ + +/* Structure constants. */ + +#define DPISTRLEN 32 + +/* Partition map entry, as found in blocks 1 to dpme_map_entries of the disk. */ + +typedef struct dpme +{ + UInt16 dpme_signature; /* (unique value for partition entry, 'PM') */ + UInt16 dpme_reserved_1; /* (reserved for future use) */ + UInt32 dpme_map_entries; /* (number of partition entries) */ + UInt32 dpme_pblock_start; /* (physical block start of partition) */ + UInt32 dpme_pblocks; /* (physical block count of partition) */ + char dpme_name[DPISTRLEN]; /* (name of partition) */ + char dpme_type[DPISTRLEN]; /* (type of partition, eg. Apple_HFS) */ + UInt32 dpme_lblock_start; /* (logical block start of partition) */ + UInt32 dpme_lblocks; /* (logical block count of partition) */ + UInt32 dpme_flags; /* (partition flags, see defines below) */ + UInt32 dpme_boot_block; /* (logical block start of boot code) */ + UInt32 dpme_boot_bytes; /* (byte count of boot code) */ + UInt32 dpme_load_addr; /* (load address in memory of boot code) */ + UInt32 dpme_load_addr_2; /* (reserved for future use) */ + UInt32 dpme_goto_addr; /* (jump address in memory of boot code) */ + UInt32 dpme_goto_addr_2; /* (reserved for future use) */ + UInt32 dpme_checksum; /* (checksum of boot code) */ + UInt8 dpme_process_id[16]; /* (processor type) */ + UInt32 dpme_reserved_2[32]; /* (reserved for future use) */ + UInt32 dpme_reserved_3[62]; /* (reserved for future use) */ +} DPME; + +/* Driver descriptor map entry. */ + +typedef struct DDMap +{ + UInt32 ddBlock; /* (driver's block start, sbBlkSize-blocks) */ + UInt16 ddSize; /* (driver's block count, 512-blocks) */ + UInt16 ddType; /* (driver's system type) */ +} DDMap; + +/* Driver descriptor map, as found in block zero of the disk. */ + +typedef struct Block0 +{ + UInt16 sbSig; /* (unique value for block zero, 'ER') */ + UInt16 sbBlkSize; /* (block size for this device) */ + UInt32 sbBlkCount; /* (block count for this device) */ + UInt16 sbDevType; /* (device type) */ + UInt16 sbDevId; /* (device id) */ + UInt32 sbDrvrData; /* (driver data) */ + UInt16 sbDrvrCount; /* (driver descriptor count) */ + DDMap sbDrvrMap[8]; /* (driver descriptor table) */ + UInt8 sbReserved[430]; /* (reserved for future use) */ +} Block0; + +/* Partition map signature (sbSig). */ + +#define BLOCK0_SIGNATURE 0x4552 + +/* Partition map entry signature (dpme_signature). */ + +#define DPME_SIGNATURE 0x504D + +/* Partition map entry flags (dpme_flags). */ + +#define DPME_FLAGS_VALID 0x00000001 /* (bit 0) */ +#define DPME_FLAGS_ALLOCATED 0x00000002 /* (bit 1) */ +#define DPME_FLAGS_IN_USE 0x00000004 /* (bit 2) */ +#define DPME_FLAGS_BOOTABLE 0x00000008 /* (bit 3) */ +#define DPME_FLAGS_READABLE 0x00000010 /* (bit 4) */ +#define DPME_FLAGS_WRITABLE 0x00000020 /* (bit 5) */ +#define DPME_FLAGS_OS_PIC_CODE 0x00000040 /* (bit 6) */ +#define DPME_FLAGS_OS_SPECIFIC_2 0x00000080 /* (bit 7) */ +#define DPME_FLAGS_OS_SPECIFIC_1 0x00000100 /* (bit 8) */ +#define DPME_FLAGS_RESERVED_2 0xFFFFFE00 /* (bit 9..31) */ + +#pragma pack(pop) /* (reset to default struct packing) */ + +#ifdef KERNEL +#ifdef __cplusplus + +/* + * Kernel + */ + +#include <IOKit/storage/IOPartitionScheme.h> + +/* + * Class + */ + +class IOApplePartitionScheme : public IOPartitionScheme +{ + OSDeclareDefaultStructors(IOApplePartitionScheme); + +protected: + + struct ExpansionData { /* */ }; + ExpansionData * _expansionData; + + OSSet * _partitions; /* (set of media objects representing partitions) */ + + /* + * Free all of this object's outstanding resources. + */ + + virtual void free(void) APPLE_KEXT_OVERRIDE; + + /* + * Scan the provider media for an Apple partition map. Returns the set + * of media objects representing each of the partitions (the retain for + * the set is passed to the caller), or null should no partition map be + * found. The default probe score can be adjusted up or down, based on + * the confidence of the scan. + */ + + virtual OSSet * scan(SInt32 * score); + + /* + * Ask whether the given partition appears to be corrupt. A partition that + * is corrupt will cause the failure of the Apple partition map recognition + * altogether. + */ + + virtual bool isPartitionCorrupt( dpme * partition, + UInt32 partitionID, + UInt32 partitionBlockSize ); + + /* + * Ask whether the given partition appears to be invalid. A partition that + * is invalid will cause it to be skipped in the scan, but will not cause a + * failure of the Apple partition map recognition. + */ + + virtual bool isPartitionInvalid( dpme * partition, + UInt32 partitionID, + UInt32 partitionBlockSize ); + + /* + * Instantiate a new media object to represent the given partition. + */ + + virtual IOMedia * instantiateMediaObject( dpme * partition, + UInt32 partitionID, + UInt32 partitionBlockSize ); + + /* + * Allocate a new media object (called from instantiateMediaObject). + */ + + virtual IOMedia * instantiateDesiredMediaObject( + dpme * partition, + UInt32 partitionID, + UInt32 partitionBlockSize ); + +public: + + /* + * Initialize this object's minimal state. + */ + + virtual bool init(OSDictionary * properties = 0) APPLE_KEXT_OVERRIDE; + + /* + * Determine whether the provider media contains an Apple partition map. + */ + + virtual IOService * probe(IOService * provider, SInt32 * score) APPLE_KEXT_OVERRIDE; + + /* + * Publish the new media objects which represent our partitions. + */ + + virtual bool start(IOService * provider) APPLE_KEXT_OVERRIDE; + + /* + * Clean up after the media objects we published before terminating. + */ + + virtual void stop(IOService * provider) APPLE_KEXT_OVERRIDE; + + /* + * Request that the provider media be re-scanned for partitions. + */ + + virtual IOReturn requestProbe(IOOptionBits options) APPLE_KEXT_OVERRIDE; + + OSMetaClassDeclareReservedUnused(IOApplePartitionScheme, 0); + OSMetaClassDeclareReservedUnused(IOApplePartitionScheme, 1); + OSMetaClassDeclareReservedUnused(IOApplePartitionScheme, 2); + OSMetaClassDeclareReservedUnused(IOApplePartitionScheme, 3); + OSMetaClassDeclareReservedUnused(IOApplePartitionScheme, 4); + OSMetaClassDeclareReservedUnused(IOApplePartitionScheme, 5); + OSMetaClassDeclareReservedUnused(IOApplePartitionScheme, 6); + OSMetaClassDeclareReservedUnused(IOApplePartitionScheme, 7); + OSMetaClassDeclareReservedUnused(IOApplePartitionScheme, 8); + OSMetaClassDeclareReservedUnused(IOApplePartitionScheme, 9); + OSMetaClassDeclareReservedUnused(IOApplePartitionScheme, 10); + OSMetaClassDeclareReservedUnused(IOApplePartitionScheme, 11); + OSMetaClassDeclareReservedUnused(IOApplePartitionScheme, 12); + OSMetaClassDeclareReservedUnused(IOApplePartitionScheme, 13); + OSMetaClassDeclareReservedUnused(IOApplePartitionScheme, 14); + OSMetaClassDeclareReservedUnused(IOApplePartitionScheme, 15); +}; + +#endif /* __cplusplus */ +#endif /* KERNEL */ +#endif /* !_IOAPPLEPARTITIONSCHEME_H */ diff --git a/QualcommWireless/include/IOKit/storage/IOBDBlockStorageDevice.h b/QualcommWireless/include/IOKit/storage/IOBDBlockStorageDevice.h new file mode 100644 index 0000000..f3c0e65 --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOBDBlockStorageDevice.h @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2006-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/*! + * @header IOBDBlockStorageDevice + * @abstract + * This header contains the IOBDBlockStorageDevice class definition. + */ + +#ifndef _IOBDBLOCKSTORAGEDEVICE_H +#define _IOBDBLOCKSTORAGEDEVICE_H + +#include <IOKit/storage/IOBDTypes.h> + +/*! + * @defined kIOBDBlockStorageDeviceClass + * @abstract + * kIOBDBlockStorageDeviceClass is the name of the IOBDBlockStorageDevice class. + * @discussion + * kIOBDBlockStorageDeviceClass is the name of the IOBDBlockStorageDevice class. + */ + +#define kIOBDBlockStorageDeviceClass "IOBDBlockStorageDevice" + +#ifdef KERNEL +#ifdef __cplusplus + +/* + * Kernel + */ + +#include <IOKit/storage/IODVDBlockStorageDevice.h> + +/* Property used for matching, so the generic driver gets the nub it wants. */ +#define kIOBlockStorageDeviceTypeBD "BD" + +/*! + * @class + * IOBDBlockStorageDevice + * @abstract + * The IOBDBlockStorageDevice class is a generic BD block storage device + * abstraction. + * @discussion + * This class is the protocol for generic BD functionality, independent of + * the physical connection protocol (e.g. SCSI, ATA, USB). + * + * The APIs are the union of CD APIs, DVD APIs, and all + * necessary new low-level BD APIs. + * + * A subclass implements relay methods that translate our requests into + * calls to a protocol- and device-specific provider. + */ + +class IOBDBlockStorageDevice : public IODVDBlockStorageDevice +{ + OSDeclareAbstractStructors(IOBDBlockStorageDevice) + +protected: + + struct ExpansionData { /* */ }; + ExpansionData * _expansionData; + +public: + + /*! + * @function init + * @discussion + * Initialize this object's minimal state. + * @param properties + * Substitute property table for this object (optional). + * @result + * Returns true on success, false otherwise. + */ + + virtual bool init(OSDictionary * properties); + + /*! + * @function readDiscStructure + * @discussion + * Issue an MMC READ DISC STRUCTURE command. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param format + * As documented by MMC. + * @param address + * As documented by MMC. + * @param layer + * As documented by MMC. + * @param grantID + * As documented by MMC. + * @param type + * As documented by MMC. + * @result + * Returns the status of the data transfer. + */ + + virtual IOReturn readDiscStructure( IOMemoryDescriptor * buffer, + UInt8 format, + UInt32 address, + UInt8 layer, + UInt8 grantID, + UInt8 type ) = 0; + + /*! + * @function splitTrack + * @discussion + * Issue an MMC RESERVE TRACK command with the ARSV bit. + * @param address + * As documented by MMC. + * @result + * Returns the status of the operation. + */ + + virtual IOReturn splitTrack(UInt32 address) = 0; + + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDevice, 0); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDevice, 1); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDevice, 2); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDevice, 3); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDevice, 4); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDevice, 5); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDevice, 6); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDevice, 7); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDevice, 8); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDevice, 9); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDevice, 10); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDevice, 11); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDevice, 12); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDevice, 13); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDevice, 14); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDevice, 15); +}; + +#endif /* __cplusplus */ +#endif /* KERNEL */ +#endif /* !_IOBDBLOCKSTORAGEDEVICE_H */ diff --git a/QualcommWireless/include/IOKit/storage/IOBDBlockStorageDriver.h b/QualcommWireless/include/IOKit/storage/IOBDBlockStorageDriver.h new file mode 100644 index 0000000..645ad1d --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOBDBlockStorageDriver.h @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2006-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/* + * @header IOBDBlockStorageDriver + * @abstract + * This header contains the IOBDBlockStorageDriver class definition. + * @discussion + * This class implements BD functionality, independent of + * the physical connection protocol (e.g. SCSI, ATA, USB). + * + * A protocol-specific provider implements the functionality using an appropriate + * protocol and commands. + */ + +#ifndef _IOBDBLOCKSTORAGEDRIVER_H +#define _IOBDBLOCKSTORAGEDRIVER_H + +#include <IOKit/storage/IOBDBlockStorageDevice.h> +#include <IOKit/storage/IODVDBlockStorageDriver.h> + +/* + * @defined kIOBDBlockStorageDriverClass + * @abstract + * kIOBDBlockStorageDriverClass is the name of the IOBDBlockStorageDriver class. + * @discussion + * kIOBDBlockStorageDriverClass is the name of the IOBDBlockStorageDriver class. + */ + +#define kIOBDBlockStorageDriverClass "IOBDBlockStorageDriver" + +/* + * @class + * IOBDBlockStorageDriver + * @abstract + * Generic BD Driver. + * @discussion + * Storage drivers are split into two parts: the Generic Driver handles + * all generic device issues, independent of the lower-level transport + * mechanism (e.g. SCSI, ATA, USB, FireWire). All storage operations + * at the Generic Driver level are translated into a series of generic + * device operations. These operations are passed via the Device Nub + * to a Transport Driver, which implements the appropriate + * transport-dependent protocol to execute these operations. + * + * To determine the write-protect state of a device (or media), for + * example, the generic driver would issue a call to the + * Transport Driver's reportWriteProtection method. If this were a SCSI + * device, its Transport Driver would issue a Mode Sense command to + * extract the write-protection status bit. The Transport Driver then + * reports true or false to the generic driver. + * + * The generic driver therefore has no knowledge of, or involvement + * with, the actual commands and mechanisms used to communicate with + * the device. It is expected that the generic driver will rarely, if + * ever, need to be subclassed to handle device idiosyncrasies; rather, + * the Transport Driver should be changed via overrides. + * + * A generic driver could be subclassed to create a different type of + * generic device. The generic driver IOBDBlockStorageDriver class is a subclass + * of IODVDBlockStorageDriver, adding BD functions. Similarly, the Transport Driver + * IOBDBlockStorageDevice is a subclass of IODVDBlockStorageDevice, adding BD + * functions. +*/ + +class IOBDBlockStorageDriver : public IODVDBlockStorageDriver +{ + OSDeclareDefaultStructors(IOBDBlockStorageDriver) + +protected: + + struct ExpansionData { /* */ }; + ExpansionData * _expansionData; + + /* Overrides of IODVDBlockStorageDriver. */ + + virtual IOReturn acceptNewMedia(void); + + /* End of IODVDBlockStorageDriver overrides. */ + +public: + + /* + * Obtain this object's provider. We override the superclass's method to + * return a more specific subclass of IOService -- IOBDBlockStorageDevice. + * This method serves simply as a convenience to subclass developers. + */ + + virtual IOBDBlockStorageDevice * getProvider() const; + + /* Overrides of IODVDBlockStorageDriver: */ + + virtual const char * getDeviceTypeName(void); + virtual IOMedia * instantiateDesiredMediaObject(void); + virtual IOMedia * instantiateMediaObject(UInt64 base,UInt64 byteSize, + UInt32 blockSize,char *mediaName); + virtual IOReturn readStructure(IOMemoryDescriptor *buffer,const DVDStructureFormat format, + const UInt32 address,const UInt8 layer,const UInt8 agid); + + /* End of IODVDBlockStorageDriver overrides. */ + + /* + * @function splitTrack + * @discussion + * Issue an MMC RESERVE TRACK command with the ARSV bit. + * @param address + * As documented by MMC. + * @result + * Returns the status of the operation. + */ + + virtual IOReturn splitTrack(UInt32 address); + + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDriver, 0); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDriver, 1); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDriver, 2); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDriver, 3); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDriver, 4); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDriver, 5); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDriver, 6); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDriver, 7); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDriver, 8); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDriver, 9); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDriver, 10); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDriver, 11); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDriver, 12); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDriver, 13); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDriver, 14); + OSMetaClassDeclareReservedUnused(IOBDBlockStorageDriver, 15); +}; + +#endif /* !_IOBDBLOCKSTORAGEDRIVER_H */ diff --git a/QualcommWireless/include/IOKit/storage/IOBDMedia.h b/QualcommWireless/include/IOKit/storage/IOBDMedia.h new file mode 100644 index 0000000..f932f19 --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOBDMedia.h @@ -0,0 +1,317 @@ +/* + * Copyright (c) 2006-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/*! + * @header IOBDMedia + * @abstract + * This header contains the IOBDMedia class definition. + */ + +#ifndef _IOBDMEDIA_H +#define _IOBDMEDIA_H + +/*! + * @defined kIOBDMediaClass + * @abstract + * kIOBDMediaClass is the name of the IOBDMedia class. + * @discussion + * kIOBDMediaClass is the name of the IOBDMedia class. + */ + +#define kIOBDMediaClass "IOBDMedia" + +/*! + * @defined kIOBDMediaTypeKey + * @abstract + * kIOBDMediaTypeKey is a property of IOBDMedia objects. It has an OSString + * value. + * @discussion + * The kIOBDMediaTypeKey property identifies the BD media type (BD-ROM, BD-R, + * BD-RE, etc). See the kIOBDMediaType contants for possible values. + */ + +#define kIOBDMediaTypeKey "Type" + +/*! + * @defined kIOBDMediaTypeROM + * The kIOBDMediaTypeKey constant for BD-ROM media. + */ + +#define kIOBDMediaTypeROM "BD-ROM" + +/*! + * @defined kIOBDMediaTypeR + * The kIOBDMediaTypeKey constant for BD-R media. + */ + +#define kIOBDMediaTypeR "BD-R" + +/*! + * @defined kIOBDMediaTypeRE + * The kIOBDMediaTypeKey constant for BD-RE media. + */ + +#define kIOBDMediaTypeRE "BD-RE" + +#ifdef KERNEL +#ifdef __cplusplus + +/* + * Kernel + */ + +#include <IOKit/storage/IOBDBlockStorageDriver.h> +#include <IOKit/storage/IOMedia.h> + +/*! + * @class IOBDMedia + * @abstract + * The IOBDMedia class is a random-access disk device abstraction for BDs. + * @discussion + * The IOBDMedia class is a random-access disk device abstraction for BDs. + */ + +class IOBDMedia : public IOMedia +{ + OSDeclareDefaultStructors(IOBDMedia) + +protected: + + struct ExpansionData { /* */ }; + ExpansionData * _expansionData; + +public: + + /* + * Obtain this object's provider. We override the superclass's method to + * return a more specific subclass of IOService -- IOBDBlockStorageDriver. + * This method serves simply as a convenience to subclass developers. + */ + + virtual IOBDBlockStorageDriver * getProvider() const; + + /* + * Compare the properties in the supplied table to this object's properties. + */ + + virtual bool matchPropertyTable(OSDictionary * table, SInt32 * score); + + /* + * Issue an MMC REPORT KEY command. + * Obsoleted, replaced by this interface. + * virtual IOReturn reportKey( IOMemoryDescriptor * buffer, + * UInt8 keyClass, + * UInt32 address, + * UInt8 blockCount, + * UInt8 grantID, + * UInt8 format ); + */ + + virtual IOReturn reportKey( IOMemoryDescriptor * buffer, + UInt8 keyClass, + UInt32 address, + UInt8 grantID, + UInt8 format ) __attribute__ ((deprecated)); + + /*! + * @function sendKey + * @discussion + * Issue an MMC SEND KEY command. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param keyClass + * As documented by MMC. + * @param grantID + * As documented by MMC. + * @param format + * As documented by MMC. + * @result + * Returns the status of the data transfer. + */ + + virtual IOReturn sendKey( IOMemoryDescriptor * buffer, + UInt8 keyClass, + UInt8 grantID, + UInt8 format ); + + /*! + * @function readStructure + * @discussion + * Issue an MMC READ DISC STRUCTURE command. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param format + * As documented by MMC. + * @param address + * As documented by MMC. + * @param layer + * As documented by MMC. + * @param grantID + * As documented by MMC. + * @result + * Returns the status of the data transfer. + */ + + virtual IOReturn readStructure( IOMemoryDescriptor * buffer, + UInt8 format, + UInt32 address, + UInt8 layer, + UInt8 grantID ); + + /*! + * @function getSpeed + * @discussion + * Get the current speed used for data transfers. + * @param kilobytesPerSecond + * Returns the current speed used for data transfers, in kB/s. + * + * kBDSpeedMin specifies the minimum speed for all BD media (1X). + * kBDSpeedMax specifies the maximum speed supported in hardware. + * @result + * Returns the status of the operation. + */ + + virtual IOReturn getSpeed(UInt16 * kilobytesPerSecond); + + /*! + * @function setSpeed + * @discussion + * Set the speed to be used for data transfers. + * @param kilobytesPerSecond + * Speed to be used for data transfers, in kB/s. + * + * kBDSpeedMin specifies the minimum speed for all BD media (1X). + * kBDSpeedMax specifies the maximum speed supported in hardware. + * @result + * Returns the status of the operation. + */ + + virtual IOReturn setSpeed(UInt16 kilobytesPerSecond); + + /*! + * @function readDiscInfo + * @discussion + * Issue an MMC READ DISC INFORMATION command. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param type + * Reserved for future use. Set to zero. + * @param actualByteCount + * Returns the actual number of bytes transferred in the data transfer. + * @result + * Returns the status of the data transfer. + */ + + virtual IOReturn readDiscInfo( IOMemoryDescriptor * buffer, + UInt8 type, + UInt16 * actualByteCount ); + + /*! + * @function readTrackInfo + * @discussion + * Issue an MMC READ TRACK INFORMATION command. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param address + * As documented by MMC. + * @param addressType + * As documented by MMC. + * @param open + * Reserved for future use. Set to zero. + * @param actualByteCount + * Returns the actual number of bytes transferred in the data transfer. + * @result + * Returns the status of the data transfer. + */ + + virtual IOReturn readTrackInfo( IOMemoryDescriptor * buffer, + UInt32 address, + UInt8 addressType, + UInt8 open, + UInt16 * actualByteCount ); + + /*! + * @function splitTrack + * @discussion + * Issue an MMC RESERVE TRACK command with the ARSV bit. + * @param address + * As documented by MMC. + * @result + * Returns the status of the operation. + */ + + virtual IOReturn splitTrack(UInt32 address); + + /*! + * @function reportKey + * @discussion + * Issue an MMC REPORT KEY command. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param keyClass + * As documented by MMC. + * @param address + * As documented by MMC. + * @param blockCount + * As documented by MMC. + * @param grantID + * As documented by MMC. + * @param format + * As documented by MMC. + * @result + * Returns the status of the data transfer. + */ + + virtual IOReturn reportKey( IOMemoryDescriptor * buffer, + UInt8 keyClass, + UInt32 address, + UInt8 blockCount, + UInt8 grantID, + UInt8 format ); + + OSMetaClassDeclareReservedUsed(IOBDMedia, 0); /* reportKey */ + OSMetaClassDeclareReservedUnused(IOBDMedia, 1); + OSMetaClassDeclareReservedUnused(IOBDMedia, 2); + OSMetaClassDeclareReservedUnused(IOBDMedia, 3); + OSMetaClassDeclareReservedUnused(IOBDMedia, 4); + OSMetaClassDeclareReservedUnused(IOBDMedia, 5); + OSMetaClassDeclareReservedUnused(IOBDMedia, 6); + OSMetaClassDeclareReservedUnused(IOBDMedia, 7); + OSMetaClassDeclareReservedUnused(IOBDMedia, 8); + OSMetaClassDeclareReservedUnused(IOBDMedia, 9); + OSMetaClassDeclareReservedUnused(IOBDMedia, 10); + OSMetaClassDeclareReservedUnused(IOBDMedia, 11); + OSMetaClassDeclareReservedUnused(IOBDMedia, 12); + OSMetaClassDeclareReservedUnused(IOBDMedia, 13); + OSMetaClassDeclareReservedUnused(IOBDMedia, 14); + OSMetaClassDeclareReservedUnused(IOBDMedia, 15); +}; + +#endif /* __cplusplus */ +#endif /* KERNEL */ +#endif /* !_IOBDMEDIA_H */ diff --git a/QualcommWireless/include/IOKit/storage/IOBDMediaBSDClient.h b/QualcommWireless/include/IOKit/storage/IOBDMediaBSDClient.h new file mode 100644 index 0000000..778dd39 --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOBDMediaBSDClient.h @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2006-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOBDMEDIABSDCLIENT_H +#define _IOBDMEDIABSDCLIENT_H + +#include <sys/ioctl.h> +#include <sys/types.h> + +#include <IOKit/storage/IOBDTypes.h> + +/* + * Definitions + * + * ioctl description + * ---------------------------- ------------------------------------------------ + * DKIOCBDREADSTRUCTURE see IOBDMedia::readStructure() in IOBDMedia.h + * + * DKIOCBDREADDISCINFO see IOBDMedia::readDiscInfo() in IOBDMedia.h + * DKIOCBDREADTRACKINFO see IOBDMedia::readTrackInfo() in IOBDMedia.h + * + * DKIOCBDREPORTKEY see IOBDMedia::reportKey() in IOBDMedia.h + * DKIOCBDSENDKEY see IOBDMedia::sendKey() in IOBDMedia.h + * + * DKIOCBDGETSPEED see IOBDMedia::getSpeed() in IOBDMedia.h + * DKIOCBDSETSPEED see IOBDMedia::setSpeed() in IOBDMedia.h + * + * in /System/Library/Frameworks/Kernel.framework/Headers/IOKit/storage/ + */ + +typedef struct +{ + uint8_t format; + + uint8_t reserved0008[3]; /* reserved, clear to zero */ + + uint32_t address; + uint8_t grantID; + uint8_t layer; + + uint8_t reserved0080[4]; /* reserved, clear to zero */ + + uint16_t bufferLength; + void * buffer; +} dk_bd_read_structure_t; + +typedef struct +{ + uint8_t format; + uint8_t keyClass; + uint8_t blockCount; + + uint8_t reserved0024[1]; /* reserved, clear to zero */ + + uint32_t address; + uint8_t grantID; + + uint8_t reserved0072[5]; /* reserved, clear to zero */ + + uint16_t bufferLength; + void * buffer; +} dk_bd_report_key_t; + +typedef struct +{ + uint8_t format; + uint8_t keyClass; + + uint8_t reserved0016[6]; /* reserved, clear to zero */ + + uint8_t grantID; + + uint8_t reserved0072[5]; /* reserved, clear to zero */ + + uint16_t bufferLength; + void * buffer; +} dk_bd_send_key_t; + +typedef struct +{ + uint8_t reserved0000[14]; /* reserved, clear to zero */ + + uint16_t bufferLength; /* actual length on return */ + void * buffer; +} dk_bd_read_disc_info_t; + +typedef struct +{ + uint8_t reserved0000[4]; /* reserved, clear to zero */ + + uint32_t address; + uint8_t addressType; + + uint8_t reserved0072[5]; /* reserved, clear to zero */ + + uint16_t bufferLength; /* actual length on return */ + void * buffer; +} dk_bd_read_track_info_t; + +#define DKIOCBDREADSTRUCTURE _IOW('d', 160, dk_bd_read_structure_t) +#define DKIOCBDREPORTKEY _IOW('d', 161, dk_bd_report_key_t) +#define DKIOCBDSENDKEY _IOW('d', 162, dk_bd_send_key_t) + +#define DKIOCBDGETSPEED _IOR('d', 163, uint16_t) +#define DKIOCBDSETSPEED _IOW('d', 163, uint16_t) + +#define DKIOCBDREADDISCINFO _IOWR('d', 164, dk_bd_read_disc_info_t) +#define DKIOCBDREADTRACKINFO _IOWR('d', 165, dk_bd_read_track_info_t) + +#define DKIOCBDSPLITTRACK _IOW('d', 166, uint32_t) + +#ifdef KERNEL +#ifdef __cplusplus + +/* + * Kernel + */ + +#include <IOKit/storage/IOBDMedia.h> +#include <IOKit/storage/IOMediaBSDClient.h> + +/* + * Class + */ + +class IOBDMediaBSDClient : public IOMediaBSDClient +{ + OSDeclareDefaultStructors(IOBDMediaBSDClient) + +protected: + + struct ExpansionData { /* */ }; + ExpansionData * _expansionData; + +public: + + /* + * Obtain this object's provider. We override the superclass's method + * to return a more specific subclass of IOService -- IOBDMedia. This + * method serves simply as a convenience to subclass developers. + */ + + virtual IOBDMedia * getProvider() const; + + /* + * Process a BD-specific ioctl. + */ + + virtual int ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, proc_t proc); + + OSMetaClassDeclareReservedUnused(IOBDMediaBSDClient, 0); + OSMetaClassDeclareReservedUnused(IOBDMediaBSDClient, 1); + OSMetaClassDeclareReservedUnused(IOBDMediaBSDClient, 2); + OSMetaClassDeclareReservedUnused(IOBDMediaBSDClient, 3); + OSMetaClassDeclareReservedUnused(IOBDMediaBSDClient, 4); + OSMetaClassDeclareReservedUnused(IOBDMediaBSDClient, 5); + OSMetaClassDeclareReservedUnused(IOBDMediaBSDClient, 6); + OSMetaClassDeclareReservedUnused(IOBDMediaBSDClient, 7); +}; + +#endif /* __cplusplus */ +#endif /* KERNEL */ +#endif /* !_IOBDMEDIABSDCLIENT_H */ diff --git a/QualcommWireless/include/IOKit/storage/IOBDTypes.h b/QualcommWireless/include/IOKit/storage/IOBDTypes.h new file mode 100644 index 0000000..d31cef7 --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOBDTypes.h @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2006-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _BDTYPES_H +#define _BDTYPES_H + +#include <IOKit/IOTypes.h> + +#pragma pack(push, 1) /* (enable 8-bit struct packing) */ + +/* + * Media Types + */ + +enum +{ + kBDMediaTypeUnknown = 0x0300, + kBDMediaTypeROM = 0x0302, /* BD-ROM */ + kBDMediaTypeRE = 0x0303, /* BD-RE */ + kBDMediaTypeR = 0x0304, /* BD-R */ + + kBDMediaTypeMin = 0x0300, + kBDMediaTypeMax = 0x03FF +}; + +typedef UInt32 BDMediaType; + +/* + * Media Speed (kB/s) + */ + +#define kBDSpeedMin 0x1126 +#define kBDSpeedMax 0xFFFF + +/* + * MMC Formats + */ + +// Read Disc Information Format +struct BDDiscInfo +{ + UInt16 dataLength; +#ifdef __LITTLE_ENDIAN__ + UInt8 discStatus:2; + UInt8 stateOfLastSession:2; + UInt8 erasable:1; + UInt8 dataType:3; +#else /* !__LITTLE_ENDIAN__ */ + UInt8 dataType:3; + UInt8 erasable:1; + UInt8 stateOfLastSession:2; + UInt8 discStatus:2; +#endif /* !__LITTLE_ENDIAN__ */ + UInt8 reserved2; + UInt8 numberOfSessionsLSB; + UInt8 firstTrackNumberInLastSessionLSB; + UInt8 lastTrackNumberInLastSessionLSB; + UInt8 reserved4[2]; + UInt8 numberOfSessionsMSB; + UInt8 firstTrackNumberInLastSessionMSB; + UInt8 lastTrackNumberInLastSessionMSB; + UInt8 reserved6[22]; +}; +typedef struct BDDiscInfo BDDiscInfo; + +// Read Track Information Format +struct BDTrackInfo +{ + UInt16 dataLength; + UInt8 trackNumberLSB; + UInt8 sessionNumberLSB; + UInt8 reserved; +#ifdef __LITTLE_ENDIAN__ + UInt8 reserved2:5; + UInt8 damage:1; + UInt8 reserved3:2; + + UInt8 reserved4:6; + UInt8 blank:1; + UInt8 reservedTrack:1; + + UInt8 nextWritableAddressValid:1; + UInt8 lastRecordedAddressValid:1; + UInt8 reserved5:6; +#else /* !__LITTLE_ENDIAN__ */ + UInt8 reserved3:2; + UInt8 damage:1; + UInt8 reserved2:5; + + UInt8 reservedTrack:1; + UInt8 blank:1; + UInt8 reserved4:6; + + UInt8 reserved5:6; + UInt8 lastRecordedAddressValid:1; + UInt8 nextWritableAddressValid:1; +#endif /* !__LITTLE_ENDIAN__ */ + UInt32 trackStartAddress; + UInt32 nextWritableAddress; + UInt32 freeBlocks; + UInt32 clusterSize; + UInt32 trackSize; + UInt32 lastRecordedAddress; + UInt8 trackNumberMSB; + UInt8 sessionNumberMSB; + UInt8 reserved6; + UInt8 reserved7; +}; +typedef struct BDTrackInfo BDTrackInfo; + +#pragma pack(pop) /* (reset to default struct packing) */ + +#endif /* _BDTYPES_H */ diff --git a/QualcommWireless/include/IOKit/storage/IOBlockStorageDevice.h b/QualcommWireless/include/IOKit/storage/IOBlockStorageDevice.h new file mode 100644 index 0000000..c197001 --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOBlockStorageDevice.h @@ -0,0 +1,549 @@ +/* + * Copyright (c) 1998-2015 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/*! + * @header IOBlockStorageDevice + * @abstract + * This header contains the IOBlockStorageDevice class definition. + */ + +#ifndef _IOBLOCKSTORAGEDEVICE_H +#define _IOBLOCKSTORAGEDEVICE_H + +#include <IOKit/IOTypes.h> +#include <IOKit/storage/IOStorageDeviceCharacteristics.h> + +/*! + * @defined kIOBlockStorageDeviceClass + * @abstract + * The name of the IOBlockStorageDevice class. + */ + +#define kIOBlockStorageDeviceClass "IOBlockStorageDevice" + +/*! + * @defined kIOBlockStorageDeviceWriteCacheStateKey + * @abstract + * The name of the property used to get or set the write cache state of the + * block storage device. + */ +#define kIOBlockStorageDeviceWriteCacheStateKey "WriteCacheState" + +#ifdef KERNEL +#ifdef __cplusplus + +/* + * Kernel + */ + +#include <IOKit/IOMemoryDescriptor.h> +#include <IOKit/IOMessage.h> +#include <IOKit/IOService.h> +#include <IOKit/storage/IOMedia.h> + +/*! + * @defined kIOMessageMediaParametersHaveChanged + * @abstract + * The message ID which indicates that the media parameters, such as the highest valid block + * for the device, have changed. + * @discussion + * The message is passed to all clients of the IOBlockStorageDevice via the message() method. + */ +#define kIOMessageMediaParametersHaveChanged iokit_family_msg(sub_iokit_block_storage, 2) + +/*! + * @defined kIOMessageMediaStateHasChanged + * @abstract + * The message ID which indicates that the media state has changed. + * @discussion + * The message is passed to all clients of the IOBlockStorageDevice via the message() method. + * The argument that is passed along with this message is an IOMediaState value. + */ +#define kIOMessageMediaStateHasChanged iokit_family_msg(sub_iokit_block_storage, 1) + +/* Property used for matching, so the generic driver gets the nub it wants. */ +/*! + * @defined kIOBlockStorageDeviceTypeKey + * @abstract The name of the property tested for nub type matching by the generic block + * storage driver. + */ +#define kIOBlockStorageDeviceTypeKey "device-type" +/*! + * @defined kIOBlockStorageDeviceTypeGeneric + * @abstract A character string used for nub matching. + */ +#define kIOBlockStorageDeviceTypeGeneric "Generic" +/*! + * @defined kIOBlockStorageDeviceTDMLocked + * @abstract A boolean property to tell if device is connected through TDM, and not + * authenticated yet + */ +#define kIOBlockStorageDeviceTDMLocked "AppleTDMLocked" +/*! + * @struct IOBlockStorageDeviceExtent + * @abstract + * Extent for unmap storage requests. + * @field blockStart + * The starting block number of the operation. + * @field blockCount + * The integral number of blocks to be deleted. + */ + +struct IOBlockStorageDeviceExtent +{ + UInt64 blockStart; + UInt64 blockCount; +}; + +/*! + * @struct IOBlockStorageProvisionDeviceExtent + * @discussion + * Extent for provision status. + * @field blockStart + * Starting block offset for the operation. + * @field blockCount + * Size of the operation. + * @field provisionType + * Block provision type, such as mapped, deallocated, or anchared. See + * IOStorageProvisionTypes + */ + +struct IOBlockStorageProvisionDeviceExtent +{ + UInt64 blockStart; + UInt64 blockCount; + UInt8 provisionType; + UInt8 reserved[7]; +}; + +/*! + * @class + * IOBlockStorageDevice + * @abstract + * A generic block storage device abstraction. + * @discussion + * The IOBlockStorageDevice class exports the generic block storage protocol, + * independent of the physical connection protocol (e.g. SCSI, ATA, USB), + * forwarding all requests to its provider (the Transport Driver). + * Though the nub does no actual processing of requests, it is necessary + * in a C++ environment. The Transport Driver can be of any type, as + * long as it inherits from IOService. Because Transport Drivers needn't + * derive from a type known to IOBlockStorageDriver, it isn't possible for + * IOBlockStorageDriver to include the appropriate header file to allow direct + * communication with the Transport Driver. Thus we achieve polymorphism by + * having the Transport Driver instantiate a subclass of IOBlockStorageDevice. + * A typical implementation for a concrete subclass of IOBlockStorageDevice + * simply relays all methods to its provider (the Transport Driver), which + * implements the protocol- and device-specific behavior. + * + * All pure-virtual functions must be implemented by the Transport Driver, which + * is responsible for instantiating the Nub. + */ + +class IOBlockStorageDevice : public IOService { + + OSDeclareAbstractStructors(IOBlockStorageDevice) + +protected: + + struct ExpansionData { /* */ }; + ExpansionData * _expansionData; + +public: + + /* Overrides from IORegistryEntry */ + + using IORegistryEntry::getProperty; + + /*! + * @function init + * @discussion + * This function is overridden so that IOBlockStorageDevice can set a + * property, used by IOBlockStorageDriver for matching. Since the concrete + * subclass of IOBlockStorageDevice can be of any class type, the property + * is used for matching. + * + * This function is usually not overridden by developers. + */ + virtual bool init(OSDictionary * properties) APPLE_KEXT_OVERRIDE; + + virtual OSObject * getProperty(const OSSymbol * key) const APPLE_KEXT_OVERRIDE; + + virtual IOReturn setProperties(OSObject * properties) APPLE_KEXT_OVERRIDE; + + /* --- A subclass must implement the the following methods: --- */ + + /*! + * @function doEjectMedia + * @abstract + * Eject the media. + */ + virtual IOReturn doEjectMedia(void) = 0; + + /*! + * @function doFormatMedia + * @abstract + * Format the media to the specified byte capacity. + * @discussion + * The specified byte capacity must be one supported by the device. + * Supported capacities can be obtained by calling doGetFormatCapacities. + * @param byteCapacity + * The byte capacity to which the device is to be formatted, if possible. + */ + virtual IOReturn doFormatMedia(UInt64 byteCapacity) = 0; + + /*! + * @function doGetFormatCapacities + * @abstract + * Return the allowable formatting byte capacities. + * @discussion + * This function returns the supported byte capacities for the device. + * @param capacities + * Pointer for returning the list of capacities. + * @param capacitiesMaxCount + * The number of capacity values returned in "capacities," or if no buffer + * is given, the total number of capacity values available. + */ + virtual UInt32 doGetFormatCapacities(UInt64 * capacities, + UInt32 capacitiesMaxCount) const = 0; + +#if TARGET_OS_OSX && defined(__x86_64__) + virtual IOReturn doLockUnlockMedia(bool doLock) __attribute__ ((deprecated)); +#endif /* TARGET_OS_OSX && defined(__x86_64__) */ + + virtual IOReturn doSynchronizeCache(void) __attribute__ ((deprecated)); + + /*! + * @function getVendorString + * @abstract + * Return Vendor Name string for the device. + * @result + * A pointer to a static character string. + */ + virtual char * getVendorString(void) = 0; + + /*! + * @function getProductString + * @abstract + * Return Product Name string for the device. + * @result + * A pointer to a static character string. + */ + virtual char * getProductString(void) = 0; + + /*! + * @function getRevisionString + * @abstract + * Return Product Revision string for the device. + * @result + * A pointer to a static character string. + */ + virtual char * getRevisionString(void) = 0; + + /*! + * @function getAdditionalDeviceInfoString + * @abstract + * Return additional informational string for the device. + * @result + * A pointer to a static character string. + */ + virtual char * getAdditionalDeviceInfoString(void) = 0; + + /*! + * @function reportBlockSize + * @abstract + * Report the block size for the device, in bytes. + * @param blockSize + * Pointer to returned block size value. + */ + virtual IOReturn reportBlockSize(UInt64 *blockSize) = 0; + + /*! + * @function reportEjectability + * @abstract + * Report if the media is ejectable under software control. + * @discussion + * This method should only be called if the media is known to be removable. + * @param isEjectable + * Pointer to returned result. True indicates the media is ejectable, False indicates + * the media cannot be ejected under software control. + */ + virtual IOReturn reportEjectability(bool *isEjectable) = 0; + +#if TARGET_OS_OSX && defined(__x86_64__) + virtual IOReturn reportLockability(bool *isLockable) __attribute__ ((deprecated)); +#endif /* TARGET_OS_OSX && defined(__x86_64__) */ + + /*! + * @function reportMaxValidBlock + * @abstract + * Report the highest valid block for the device. + * @param maxBlock + * Pointer to returned result + */ + virtual IOReturn reportMaxValidBlock(UInt64 *maxBlock) = 0; + + /*! + * @function reportMediaState + * @abstract + * Report the device's media state. + * @discussion + * This method reports whether we have media in the drive or not, and + * whether the state has changed from the previously reported state. + * + * A result of kIOReturnSuccess is always returned if the test for media is successful, + * regardless of media presence. The mediaPresent result should be used to determine + * whether media is present or not. A return other than kIOReturnSuccess indicates that + * the Transport Driver was unable to interrogate the device. In this error case, the + * outputs mediaState and changedState will *not* be stored. + * @param mediaPresent Pointer to returned media state. True indicates media is present + * in the device; False indicates no media is present. + */ + virtual IOReturn reportMediaState(bool *mediaPresent,bool *changedState = 0) = 0; + +#if TARGET_OS_OSX && defined(__x86_64__) + virtual IOReturn reportPollRequirements(bool *pollRequired, + bool *pollIsExpensive) __attribute__ ((deprecated)); +#endif /* TARGET_OS_OSX && defined(__x86_64__) */ + + /*! + * @function reportRemovability + * @abstract + * Report whether the media is removable or not. + * @discussion + * This method reports whether the media is removable, but it does not + * provide detailed information regarding software eject or lock/unlock capability. + * @param isRemovable + * Pointer to returned result. True indicates that the media is removable; False + * indicates the media is not removable. + */ + virtual IOReturn reportRemovability(bool *isRemovable) = 0; + + /*! + * @function reportWriteProtection + * @abstract + * Report whether the media is write-protected or not. + * @param isWriteProtected + * Pointer to returned result. True indicates that the media is write-protected (it + * cannot be written); False indicates that the media is not write-protected (it + * is permissible to write). + */ + virtual IOReturn reportWriteProtection(bool *isWriteProtected) = 0; + + /*! + * @function getWriteCacheState + * @abstract + * Reports the current write cache state of the device. + * @discussion + * Reports the current write cache state of the device. The write cache + * state is not guaranteed to persist across reboots and detaches. + * @param enabled + * Pointer to returned result. True indicates the write cache is enabled; + * False indicates the write cache is disabled. + */ + virtual IOReturn getWriteCacheState(bool *enabled); + + /*! + * @function setWriteCacheState + * @abstract + * Sets the write cache state of the device. + * @discussion + * Sets the write cache state of the device. The write cache state + * is not guaranteed to persist across reboots and detaches. + * @param enabled + * True to enable the write cache; False to disable the write cache. + */ + virtual IOReturn setWriteCacheState(bool enabled); + + /*! + * @function doAsyncReadWrite + * @abstract + * Start an asynchronous read or write operation. + * @param buffer + * An IOMemoryDescriptor describing the data-transfer buffer. The data direction + * is contained in the IOMemoryDescriptor. Responsibility for releasing the descriptor + * rests with the caller. + * @param block + * The starting block number of the data transfer. + * @param nblks + * The integral number of blocks to be transferred. + * @param attributes + * Attributes of the data transfer. See IOStorageAttributes. + * @param completion + * The completion routine to call once the data transfer is complete. + */ + virtual IOReturn doAsyncReadWrite(IOMemoryDescriptor *buffer, + UInt64 block, UInt64 nblks, + IOStorageAttributes *attributes, + IOStorageCompletion *completion) = 0; + + /*! + * @function requestIdle + * @abstract + * Request that the device enter an idle state. + * @discussion + * Request that the device enter an idle state. The device will exit this state on the + * next read or write request, or as it sees necessary. One example is for a DVD drive + * to spin down when it enters such an idle state, and spin up on the next read request + * from the system. + */ + virtual IOReturn requestIdle(void); + +#if TARGET_OS_OSX && defined(__x86_64__) + virtual IOReturn doDiscard(UInt64 block, UInt64 nblks) __attribute__ ((deprecated)); +#endif /* TARGET_OS_OSX && defined(__x86_64__) */ + + /*! + * @function doUnmap + * @abstract + * Delete unused data blocks from the media. + * @param extents + * List of extents. See IOBlockStorageDeviceExtent. It is legal for the callee to + * overwrite the contents of this buffer in order to satisfy the request. + * @param extentsCount + * Number of extents. + * @param options + * Options for the unmap. See IOStorageUnmapOptions. + */ + virtual IOReturn doUnmap(IOBlockStorageDeviceExtent * extents, + UInt32 extentsCount, + IOStorageUnmapOptions options = 0); /* 10.6.6 */ + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_10 + /*! + * @function doSetPriority + * @abstract + * Reprioritize read or write operations. + * @param extents + * List of extents. See IOBlockStorageDeviceExtent. It is legal for the callee to + * overwrite the contents of this buffer in order to satisfy the request. + * @param extentsCount + * Number of extents. + * @param priority + * New priority. See IOStoragePriority. + */ + virtual IOReturn doSetPriority(IOBlockStorageDeviceExtent * extents, + UInt32 extentsCount, + IOStoragePriority priority); /* 10.10.0 */ +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_11 + /*! + * @function doSynchronize + * @abstract + * Force data blocks in the hardware's buffer to be flushed to the media. + * @discussion + * This method should only be called if the media is writable. + * @param block + * The starting block number of the synchronization. + * @param nblks + * The integral number of blocks to be synchronized. Set to zero to specify the + * end-of-media. + * @param options + * Options for the synchronization. See IOStorageSynchronizeOptions. + */ + virtual IOReturn doSynchronize(UInt64 block, + UInt64 nblks, + IOStorageSynchronizeOptions options = 0); /* 10.11.0 */ +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_12 + /*! + * @function doGetProvisionStatus + * @discussion + * Get device block provision status + * @param block + * Block offset of logical extent on the device. + * @param nblks + * Blocks count of logical extent on the device. + * @param extentsCount + * Number of extents allocated in extents. On return, this parameter indicate number + * of provision extents returned. + * @param extents + * List of provision extents, block based. See IOStorageProvisionDeviceExtents. + * @param options + * Options for get provision status. See IOStorageGetProvisionStatusOptions. + * @result + * Returns the status of the getProvisionStatus. + */ + + virtual IOReturn doGetProvisionStatus(UInt64 block, + UInt64 nblks, + UInt32 * extentsCount, + IOBlockStorageProvisionDeviceExtent * extents, + IOStorageGetProvisionStatusOptions options = 0); /* 10.12.0 */ +#endif + + OSMetaClassDeclareReservedUsed(IOBlockStorageDevice, 0); + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_10 + OSMetaClassDeclareReservedUsed(IOBlockStorageDevice, 1); +#else + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 1); +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_11 + OSMetaClassDeclareReservedUsed(IOBlockStorageDevice, 2); +#else + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 2); +#endif + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_12 + OSMetaClassDeclareReservedUsed(IOBlockStorageDevice, 3); +#else + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 3); +#endif + + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 4); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 5); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 6); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 7); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 8); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 9); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 10); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 11); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 12); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 13); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 14); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 15); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 16); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 17); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 18); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 19); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 20); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 21); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 22); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 23); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 24); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 25); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 26); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 27); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 28); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 29); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 30); + OSMetaClassDeclareReservedUnused(IOBlockStorageDevice, 31); +}; + +#endif /* __cplusplus */ +#endif /* KERNEL */ +#endif /* !_IOBLOCKSTORAGEDEVICE_H */ diff --git a/QualcommWireless/include/IOKit/storage/IOBlockStorageDriver.h b/QualcommWireless/include/IOKit/storage/IOBlockStorageDriver.h new file mode 100644 index 0000000..0b04b9f --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOBlockStorageDriver.h @@ -0,0 +1,1528 @@ +/* + * Copyright (c) 1998-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/*! + * @header IOBlockStorageDriver + * @abstract + * This header contains the IOBlockStorageDriver class definition. + */ + +#ifndef _IOBLOCKSTORAGEDRIVER_H +#define _IOBLOCKSTORAGEDRIVER_H + +#include <IOKit/IOTypes.h> + +/*! + * @defined kIOBlockStorageDriverClass + * @abstract + * The name of the IOBlockStorageDriver class. + */ + +#define kIOBlockStorageDriverClass "IOBlockStorageDriver" + +/*! + * @defined kIOBlockStorageDriverStatisticsKey + * @abstract + * Holds a table of numeric values describing the driver's + * operating statistics. + * @discussion + * This property holds a table of numeric values describing the driver's + * operating statistics. The table is an OSDictionary, where each entry + * describes one given statistic. + */ + +#define kIOBlockStorageDriverStatisticsKey "Statistics" + +/*! + * @defined kIOBlockStorageDriverStatisticsBytesReadKey + * @abstract + * Describes the number of bytes read since the block storage + * driver was instantiated. + * @discussion + * This property describes the number of bytes read since the block storage + * driver was instantiated. It is one of the statistic entries listed under + * the top-level kIOBlockStorageDriverStatisticsKey property table. It has + * an OSNumber value. + */ + +#define kIOBlockStorageDriverStatisticsBytesReadKey "Bytes (Read)" + +/*! + * @defined kIOBlockStorageDriverStatisticsBytesWrittenKey + * @abstract + * Describes the number of bytes written since the block storage + * driver was instantiated. + * @discussion + * This property describes the number of bytes written since the block storage + * driver was instantiated. It is one of the statistic entries listed under the + * top-level kIOBlockStorageDriverStatisticsKey property table. It has an + * OSNumber value. + */ + +#define kIOBlockStorageDriverStatisticsBytesWrittenKey "Bytes (Write)" + +/*! + * @defined kIOBlockStorageDriverStatisticsReadErrorsKey + * @abstract + * Describes the number of read errors encountered since the block + * storage driver was instantiated. + * @discussion + * This property describes the number of read errors encountered since the block + * storage driver was instantiated. It is one of the statistic entries listed + * under the top-level kIOBlockStorageDriverStatisticsKey property table. It + * has an OSNumber value. + */ + +#define kIOBlockStorageDriverStatisticsReadErrorsKey "Errors (Read)" + +/*! + * @defined kIOBlockStorageDriverStatisticsWriteErrorsKey + * @abstract + * Describes the number of write errors encountered since the + * block storage driver was instantiated. + * @discussion + * This property describes the number of write errors encountered since the + * block storage driver was instantiated. It is one of the statistic entries + * listed under the top-level kIOBlockStorageDriverStatisticsKey property table. + * It has an OSNumber value. + */ + +#define kIOBlockStorageDriverStatisticsWriteErrorsKey "Errors (Write)" + +/*! + * @defined kIOBlockStorageDriverStatisticsLatentReadTimeKey + * @abstract + * Describes the number of nanoseconds of latency during reads + * since the block storage driver was instantiated. + * @discussion + * This property describes the number of nanoseconds of latency during reads + * since the block storage driver was instantiated. It is one of the statistic + * entries listed under the top-level kIOBlockStorageDriverStatisticsKey + * property table. It has an OSNumber value. + */ + +#define kIOBlockStorageDriverStatisticsLatentReadTimeKey "Latency Time (Read)" + +/*! + * @defined kIOBlockStorageDriverStatisticsLatentWriteTimeKey + * @abstract + * Describes the number of nanoseconds of latency during writes + * since the block storage driver was instantiated. + * @discussion + * This property describes the number of nanoseconds of latency during writes + * since the block storage driver was instantiated. It is one of the statistic + * entries listed under the top-level kIOBlockStorageDriverStatisticsKey + * property table. It has an OSNumber value. + */ + +#define kIOBlockStorageDriverStatisticsLatentWriteTimeKey "Latency Time (Write)" + +/*! + * @defined kIOBlockStorageDriverStatisticsReadsKey + * @abstract + * Describes the number of read operations processed since the + * block storage driver was instantiated. + * @discussion + * This property describes the number of read operations processed since the + * block storage driver was instantiated. It is one of the statistic entries + * listed under the top-level kIOBlockStorageDriverStatisticsKey property table. + * It has an OSNumber value. + */ + +#define kIOBlockStorageDriverStatisticsReadsKey "Operations (Read)" + +/*! + * @defined kIOBlockStorageDriverStatisticsWritesKey + * @abstract + * Describes the number of write operations processed since the + * block storage driver was instantiated. + * @discussion + * This property describes the number of write operations processed since the + * block storage driver was instantiated. It is one of the statistic entries + * listed under the top-level kIOBlockStorageDriverStatisticsKey property table. + * It has an OSNumber value. + */ + +#define kIOBlockStorageDriverStatisticsWritesKey "Operations (Write)" + +/*! + * @defined kIOBlockStorageDriverStatisticsReadRetriesKey + * @abstract + * Describes the number of read retries required since the block + * storage driver was instantiated. + * @discussion + * This property describes the number of read retries required since the block + * storage driver was instantiated. It is one of the statistic entries listed + * under the top-level kIOBlockStorageDriverStatisticsKey property table. It + * has an OSNumber value. + */ + +#define kIOBlockStorageDriverStatisticsReadRetriesKey "Retries (Read)" + +/*! + * @defined kIOBlockStorageDriverStatisticsWriteRetriesKey + * @abstract + * Describes the number of write retries required since the block + * storage driver was instantiated. + * @discussion + * This property describes the number of write retries required since the block + * storage driver was instantiated. It is one of the statistic entries listed + * under the top-level kIOBlockStorageDriverStatisticsKey property table. It + * has an OSNumber value. + */ + +#define kIOBlockStorageDriverStatisticsWriteRetriesKey "Retries (Write)" + +/*! + * @defined kIOBlockStorageDriverStatisticsTotalReadTimeKey + * @abstract + * Describes the number of nanoseconds spent performing reads + * since the block storage driver was instantiated. + * @discussion + * This property describes the number of nanoseconds spent performing reads + * since the block storage driver was instantiated. It is one of the statistic + * entries listed under the top-level kIOBlockStorageDriverStatisticsKey + * property table. It has an OSNumber value. + */ + +#define kIOBlockStorageDriverStatisticsTotalReadTimeKey "Total Time (Read)" + +/*! + * @defined kIOBlockStorageDriverStatisticsTotalWriteTimeKey + * @abstract + * Describes the number of nanoseconds spent performing writes + * since the block storage driver was instantiated. + * @discussion + * This property describes the number of nanoseconds spent performing writes + * since the block storage driver was instantiated. It is one of the statistic + * entries listed under the top-level kIOBlockStorageDriverStatisticsKey + * property table. It has an OSNumber value. + */ + +#define kIOBlockStorageDriverStatisticsTotalWriteTimeKey "Total Time (Write)" + +/*! + * @enum IOMediaState + * @abstract + * The different states that getMediaState() can report. + * @constant kIOMediaStateOffline + * Media is not available. + * @constant kIOMediaStateOnline + * Media is available and ready for operations. + * @constant kIOMediaStateBusy + * Media is available, but not ready for operations. + */ + +enum +{ + kIOMediaStateOffline = 0, + kIOMediaStateOnline = 1, + kIOMediaStateBusy = 2 +}; + +typedef UInt32 IOMediaState; + +#ifdef KERNEL +#ifdef __cplusplus + +/* + * Kernel + */ + +#include <IOKit/storage/IOBlockStorageDevice.h> +#include <IOKit/storage/IOMedia.h> +#include <IOKit/storage/IOStorage.h> + +/*! + * @class IOBlockStorageDriver + * @abstract + * The common base class for generic block storage drivers. + * @discussion + * The IOBlockStorageDriver class is the common base class for generic block + * storage drivers. It matches and communicates via an IOBlockStorageDevice + * interface, and connects to the remainder of the storage framework via the + * IOStorage protocol. It extends the IOStorage protocol by implementing the + * appropriate open and close semantics, deblocking for unaligned transfers, + * polling for ejectable media, locking and ejection policies, media object + * creation and tear-down, and statistics gathering and reporting. + * + * Block storage drivers are split into two parts: the generic driver handles + * all generic device issues, independent of the lower-level transport + * mechanism (e.g. SCSI, ATA, USB, FireWire). All storage operations + * at the generic driver level are translated into a series of generic + * device operations. These operations are passed via the IOBlockStorageDevice + * nub to a transport driver, which implements the appropriate + * transport-dependent protocol to execute these operations. + * + * To determine the write-protect state of a device (or media), for + * example, the generic driver would issue a call to the + * Transport Driver's reportWriteProtection method. If this were a SCSI + * device, its transport driver would issue a Mode Sense command to + * extract the write-protection status bit. The transport driver then + * reports true or false to the generic driver. + * + * The generic driver therefore has no knowledge of, or involvement + * with, the actual commands and mechanisms used to communicate with + * the device. It is expected that the generic driver will rarely, if + * ever, need to be subclassed to handle device idiosyncrasies; rather, + * the transport driver should be changed via overrides. + * + * A generic driver could be subclassed to create a different type of + * generic device. The generic driver IOCDBlockStorageDriver class is + * a subclass of IOBlockStorageDriver, adding CD functions. + */ + +class IOBlockStorageDriver : public IOStorage +{ + OSDeclareDefaultStructors(IOBlockStorageDriver); + +public: + + /*! + * @enum Statistics + * @abstract + * Indices for the different statistics that getStatistics() can report. + * @constant kStatisticsReads Number of read operations thus far. + * @constant kStatisticsBytesRead Number of bytes read thus far. + * @constant kStatisticsTotalReadTime Nanoseconds spent performing reads thus far. + * @constant kStatisticsLatentReadTime Nanoseconds of latency during reads thus far. + * @constant kStatisticsReadRetries Number of read retries thus far. + * @constant kStatisticsReadErrors Number of read errors thus far. + * @constant kStatisticsWrites Number of write operations thus far. + * @constant kStatisticsSingleBlockWrites Number of write operations for a single block thus far. + * @constant kStatisticsBytesWritten Number of bytes written thus far. + * @constant kStatisticsTotalWriteTime Nanoseconds spent performing writes thus far. + * @constant kStatisticsLatentWriteTime Nanoseconds of latency during writes thus far. + * @constant kStatisticsWriteRetries Number of write retries thus far. + * @constant kStatisticsWriteErrors Number of write errors thus far. + */ + + enum Statistics + { + kStatisticsReads, + kStatisticsBytesRead, + kStatisticsTotalReadTime, + kStatisticsLatentReadTime, + kStatisticsReadRetries, + kStatisticsReadErrors, + + kStatisticsWrites, + kStatisticsSingleBlockWrites, + kStatisticsBytesWritten, + kStatisticsTotalWriteTime, + kStatisticsLatentWriteTime, + kStatisticsWriteRetries, + kStatisticsWriteErrors + }; + + static const UInt32 kStatisticsCount = kStatisticsWriteErrors + 1; + +protected: + + struct Context; + + struct ExpansionData + { + UInt64 reserved0000; + UInt64 maxReadBlockTransfer; + UInt64 maxWriteBlockTransfer; + IONotifier * powerEventNotifier; + UInt32 deblockRequestWriteLockCount; + UInt64 maxReadSegmentTransfer; + UInt64 maxWriteSegmentTransfer; + UInt64 maxReadSegmentByteTransfer; + UInt64 maxWriteSegmentByteTransfer; + UInt64 minSegmentAlignmentByteTransfer; + UInt64 maxSegmentWidthByteTransfer; + Context * contexts; + IOSimpleLock * contextsLock; + UInt32 contextsCount; + UInt32 contextsMaxCount; + }; + ExpansionData * _expansionData; + + #define _maxReadBlockTransfer \ + IOBlockStorageDriver::_expansionData->maxReadBlockTransfer + #define _maxWriteBlockTransfer \ + IOBlockStorageDriver::_expansionData->maxWriteBlockTransfer + #define _powerEventNotifier \ + IOBlockStorageDriver::_expansionData->powerEventNotifier + #define _deblockRequestWriteLockCount \ + IOBlockStorageDriver::_expansionData->deblockRequestWriteLockCount + #define _maxReadSegmentTransfer \ + IOBlockStorageDriver::_expansionData->maxReadSegmentTransfer + #define _maxWriteSegmentTransfer \ + IOBlockStorageDriver::_expansionData->maxWriteSegmentTransfer + #define _maxReadSegmentByteTransfer \ + IOBlockStorageDriver::_expansionData->maxReadSegmentByteTransfer + #define _maxWriteSegmentByteTransfer \ + IOBlockStorageDriver::_expansionData->maxWriteSegmentByteTransfer + #define _minSegmentAlignmentByteTransfer \ + IOBlockStorageDriver::_expansionData->minSegmentAlignmentByteTransfer + #define _maxSegmentWidthByteTransfer \ + IOBlockStorageDriver::_expansionData->maxSegmentWidthByteTransfer + #define _contexts \ + IOBlockStorageDriver::_expansionData->contexts + #define _contextsLock \ + IOBlockStorageDriver::_expansionData->contextsLock + #define _contextsCount \ + IOBlockStorageDriver::_expansionData->contextsCount + #define _contextsMaxCount \ + IOBlockStorageDriver::_expansionData->contextsMaxCount + + OSSet * _openClients; + OSNumber * _statistics[kStatisticsCount]; + + /* + * @struct Context + * @discussion + * Context structure for a read/write operation. It describes the block size, + * and where applicable, a block type and block sub-type, for a data transfer, + * as well as the completion information for the original request. Note that + * the block type field is unused in the IOBlockStorageDriver class. + * @field block.size + * Block size for the operation. + * @field block.type + * Block type for the operation. Unused in IOBlockStorageDriver. The default + * value for this field is IOBlockStorageDriver::kBlockTypeStandard. + * @field block.typeSub + * Block sub-type for the operation. It's definition depends on block.type. + * Unused in IOBlockStorageDriver. + * @field request.byteStart + * Starting byte offset for the data transfer. + * @param request.buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param request.attributes + * Attributes of the data transfer. See IOStorageAttributes. + * @param request.completion + * Completion routine to call once the data transfer is complete. + */ + + struct Context + { + struct + { + UInt64 byteStart; + IOMemoryDescriptor * buffer; + IOStorageAttributes attributes; + IOStorageCompletion completion; + } request; + + struct + { + UInt32 size; + UInt8 type; + UInt8 typeSub[3]; + } block; + + AbsoluteTime timeStart; + + UInt64 reserved0704; + UInt64 reserved0768; + UInt64 reserved0832; + UInt64 reserved0896; + + Context * next; + }; + + static const UInt8 kBlockTypeStandard = 0x00; + + using IOService::open; + + /* + * Free all of this object's outstanding resources. + * + * This method's implementation is not typically overridden. + */ + + void free() APPLE_KEXT_OVERRIDE; + + /*! + * @function handleOpen + * @discussion + * The handleOpen method grants or denies permission to access this object + * to an interested client. The argument is an IOStorageAccess value that + * specifies the level of access desired -- reader or reader-writer. + * + * This method can be invoked to upgrade or downgrade the access level for + * an existing client as well. The previous access level will prevail for + * upgrades that fail, of course. A downgrade should never fail. If the + * new access level should be the same as the old for a given client, this + * method will do nothing and return success. In all cases, one, singular + * close-per-client is expected for all opens-per-client received. + * + * This implementation replaces the IOService definition of handleIsOpen(). + * @param client + * Client requesting the open. + * @param options + * Options for the open. Set to zero. + * @param access + * Access level for the open. Set to kIOStorageAccessReader or + * kIOStorageAccessReaderWriter. + * @result + * Returns true if the open was successful, false otherwise. + */ + + virtual bool handleOpen(IOService * client, + IOOptionBits options, + void * access) APPLE_KEXT_OVERRIDE; + + /*! + * @function handleIsOpen + * @discussion + * The handleIsOpen method determines whether the specified client, or any + * client if none is specified, presently has an open on this object. + * + * This implementation replaces the IOService definition of handleIsOpen(). + * @param client + * Client to check the open state of. Set to zero to check the open state + * of all clients. + * @result + * Returns true if the client was (or clients were) open, false otherwise. + */ + + virtual bool handleIsOpen(const IOService * client) const APPLE_KEXT_OVERRIDE; + + /*! + * @function handleClose + * @discussion + * The handleClose method closes the client's access to this object. + * + * This implementation replaces the IOService definition of handleIsOpen(). + * @param client + * Client requesting the close. + * @param options + * Options for the close. Set to zero. + */ + + virtual void handleClose(IOService * client, IOOptionBits options) APPLE_KEXT_OVERRIDE; + + /*! + * @function addToBytesTransferred + * @discussion + * Update the total number of bytes transferred, the total transfer time, + * and the total latency time -- used for statistics. + * + * This method's implementation is not typically overridden. + * @param bytesTransferred + * Number of bytes transferred in this operation. + * @param totalTime + * Nanoseconds spent performing this operation. + * @param latentTime + * Nanoseconds of latency during this operation. + * @param isWrite + * Indicates whether this operation was a write, otherwise is was a read. + */ + + virtual void addToBytesTransferred(UInt64 bytesTransferred, + UInt64 totalTime, + UInt64 latentTime, + bool isWrite); + + /*! + * @function incrementErrors + * @discussion + * Update the total error count -- used for statistics. + * + * This method's implementation is not typically overridden. + * @param isWrite + * Indicates whether this operation was a write, otherwise is was a read. + */ + + virtual void incrementErrors(bool isWrite); + + /*! + * @function incrementRetries + * @discussion + * Update the total retry count -- used for statistics. + * + * This method's implementation is not typically overridden. + * @param isWrite + * Indicates whether this operation was a write, otherwise is was a read. + */ + + virtual void incrementRetries(bool isWrite); + + /*! + * @function allocateContext + * @discussion + * Allocate a context structure for a read/write operation. + * @result + * Context structure. + */ + + virtual Context * allocateContext(); + + /*! + * @function deleteContext + * @discussion + * Delete a context structure from a read/write operation. + * @param context + * Context structure to be deleted. + */ + + virtual void deleteContext(Context * context); + + /*! + * @function deblockRequest + * @discussion + * The deblockRequest method checks to see if the incoming request rests + * on the media's block boundaries, and if not, deblocks it. Deblocking + * involves rounding out the request to the nearest block boundaries and + * transferring the excess bytes into a scratch buffer. + * + * This method is part of a sequence of methods invoked for each read/write + * request. The first is prepareRequest, which allocates and prepares some + * context for the transfer; the second is deblockRequest, which aligns the + * transfer at the media's block boundaries; third is breakUpRequest, which + * breaks up the transfer into multiple sub-transfers when certain hardware + * constraints are exceeded; fourth is executeRequest, which implements the + * actual transfer from the block storage device. + * + * This method's implementation is not typically overridden. + * @param byteStart + * Starting byte offset for the data transfer. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param attributes + * Attributes of the data transfer. See IOStorageAttributes. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + * @param completion + * Completion routine to call once the data transfer is complete. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + * @param context + * Additional context information for the data transfer (e.g. block size). + */ + + virtual void deblockRequest(UInt64 byteStart, + IOMemoryDescriptor * buffer, + IOStorageAttributes * attributes, + IOStorageCompletion * completion, + Context * context); + + /*! + * @function executeRequest + * @discussion + * Execute an asynchronous storage request. The request is guaranteed to be + * block-aligned. + * + * This method is part of a sequence of methods invoked for each read/write + * request. The first is prepareRequest, which allocates and prepares some + * context for the transfer; the second is deblockRequest, which aligns the + * transfer at the media's block boundaries; third is breakUpRequest, which + * breaks up the transfer into multiple sub-transfers when certain hardware + * constraints are exceeded; fourth is executeRequest, which implements the + * actual transfer from the block storage device. + * @param byteStart + * Starting byte offset for the data transfer. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param attributes + * Attributes of the data transfer. See IOStorageAttributes. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + * @param completion + * Completion routine to call once the data transfer is complete. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + * @param context + * Additional context information for the data transfer (e.g. block size). + */ + + virtual void executeRequest(UInt64 byteStart, + IOMemoryDescriptor * buffer, + IOStorageAttributes * attributes, + IOStorageCompletion * completion, + Context * context); + + /*! + * @function handleStart + * @discussion + * Prepare the block storage driver for operation. + * + * This is where a media object needs to be created for fixed media, and + * optionally for removable media. + * + * Note that this method is called from within the start() routine; + * if this method returns successfully, it should be prepared to accept + * any of IOBlockStorageDriver's APIs. + * @param provider + * This object's provider. + * @result + * Returns true on success, false otherwise. + */ + + virtual bool handleStart(IOService * provider); + +#if TARGET_OS_OSX && defined(__x86_64__) + virtual bool handleYield(IOService * provider, + IOOptionBits options = 0, + void * argument = 0) __attribute__ ((deprecated)); +#endif /* TARGET_OS_OSX && defined(__x86_64__) */ + + /*! + * @function getMediaBlockSize + * @discussion + * Ask the driver about the media's natural block size. + * @result + * Natural block size, in bytes. + */ + + virtual UInt64 getMediaBlockSize() const; + +public: + + using IOStorage::open; + using IOStorage::read; + using IOStorage::write; + + /* + * Initialize this object's minimal state. + * + * This method's implementation is not typically overridden. + */ + + virtual bool init(OSDictionary * properties = 0) APPLE_KEXT_OVERRIDE; + + /* + * This method is called once we have been attached to the provider object. + * + * This method's implementation is not typically overridden. + */ + + virtual bool start(IOService * provider) APPLE_KEXT_OVERRIDE; + + /* + * This method is called before we are detached from the provider object. + * + * This method's implementation is not typically overridden. + */ + + virtual void stop(IOService * provider) APPLE_KEXT_OVERRIDE; + + virtual bool didTerminate(IOService * provider, + IOOptionBits options, + bool * defer) APPLE_KEXT_OVERRIDE; + +#if TARGET_OS_OSX && defined(__x86_64__) + virtual bool yield(IOService * provider, + IOOptionBits options = 0, + void * argument = 0) __attribute__ ((deprecated)); +#endif /* TARGET_OS_OSX && defined(__x86_64__) */ + + /*! + * @function read + * @discussion + * The read method is the receiving end for all read requests from the + * storage framework (through the media object created by this driver). + * + * This method initiates a sequence of methods (stages) for each read/write + * request. The first is prepareRequest, which allocates and prepares some + * context for the transfer; the second is deblockRequest, which aligns the + * transfer at the media's block boundaries; third is breakUpRequest, which + * breaks up the transfer into multiple sub-transfers when certain hardware + * constraints are exceeded; fourth is executeRequest, which implements the + * actual transfer from the block storage device. + * + * This method's implementation is not typically overridden. + * @param client + * Client requesting the read. + * @param byteStart + * Starting byte offset for the data transfer. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param attributes + * Attributes of the data transfer. See IOStorageAttributes. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + * @param completion + * Completion routine to call once the data transfer is complete. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + */ + + virtual void read(IOService * client, + UInt64 byteStart, + IOMemoryDescriptor * buffer, + IOStorageAttributes * attributes, + IOStorageCompletion * completion) APPLE_KEXT_OVERRIDE; + + /*! + * @function write + * @discussion + * The write method is the receiving end for all write requests from the + * storage framework (through the media object created by this driver). + * + * This method initiates a sequence of methods (stages) for each read/write + * request. The first is prepareRequest, which allocates and prepares some + * context for the transfer; the second is deblockRequest, which aligns the + * transfer at the media's block boundaries; third is breakUpRequest, which + * breaks up the transfer into multiple sub-transfers when certain hardware + * constraints are exceeded; fourth is executeRequest, which implements the + * actual transfer from the block storage device. + * + * This method's implementation is not typically overridden. + * @param client + * Client requesting the write. + * @param byteStart + * Starting byte offset for the data transfer. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param attributes + * Attributes of the data transfer. See IOStorageAttributes. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + * @param completion + * Completion routine to call once the data transfer is complete. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + */ + + virtual void write(IOService * client, + UInt64 byteStart, + IOMemoryDescriptor * buffer, + IOStorageAttributes * attributes, + IOStorageCompletion * completion) APPLE_KEXT_OVERRIDE; + + /*! + * @function synchronize + * @discussion + * Flush the cached data in the storage object, if any. + * @param client + * Client requesting the synchronization. + * @param byteStart + * Starting byte offset for the synchronization. + * @param byteCount + * Size of the synchronization. Set to zero to specify the end-of-media. + * @param options + * Options for the synchronization. See IOStorageSynchronizeOptions. + * @result + * Returns the status of the synchronization. + */ + + virtual IOReturn synchronize(IOService * client, + UInt64 byteStart, + UInt64 byteCount, + IOStorageSynchronizeOptions options = 0) APPLE_KEXT_OVERRIDE; + + /*! + * @function unmap + * @discussion + * Delete unused data from the storage object at the specified byte offsets. + * @param client + * Client requesting the operation. + * @param extents + * List of extents. See IOStorageExtent. It is legal for the callee to + * overwrite the contents of this buffer in order to satisfy the request. + * @param extentsCount + * Number of extents. + * @param options + * Options for the unmap. See IOStorageUnmapOptions. + * @result + * Returns the status of the operation. + */ + + virtual IOReturn unmap(IOService * client, + IOStorageExtent * extents, + UInt32 extentsCount, + IOStorageUnmapOptions options = 0) APPLE_KEXT_OVERRIDE; + + /*! + * @function getProvisionStatus + * @discussion + * Get device block provision status + * @param client + * Client requesting the synchronization. + * @param byteStart + * Byte offset of logical extent on the device. + * @param byteCount + * Byte length of logical extent on the device, 0 mean the entire remaining space. + * @param extentsCount + * Number of extents allocated in extents. On return, this parameter indicate number + * of provision extents returned. + * @param extents + * List of provision extents. See IOStorageProvisionExtents. + * @result + * Returns the status of the getProvisionStatus. + */ + + virtual IOReturn getProvisionStatus(IOService * client, + UInt64 byteStart, + UInt64 byteCount, + UInt32 * extentsCount, + IOStorageProvisionExtent * extents, + IOStorageGetProvisionStatusOptions options = 0) APPLE_KEXT_OVERRIDE; + + /*! + * @function lockPhysicalExtents + * @discussion + * Lock the contents of the storage object against relocation temporarily, + * for the purpose of getting physical extents. + * @param client + * Client requesting the operation. + * @result + * Returns true if the lock was successful, false otherwise. + */ + + virtual bool lockPhysicalExtents(IOService * client) APPLE_KEXT_OVERRIDE; + + /*! + * @function copyPhysicalExtent + * @discussion + * Convert the specified byte offset into a physical byte offset, relative + * to a physical storage object. This call should only be made within the + * context of lockPhysicalExtents(). + * @param client + * Client requesting the operation. + * @param byteStart + * Starting byte offset for the operation. Returns a physical byte offset, + * relative to the physical storage object, on success. + * @param byteCount + * Size of the operation. Returns the actual number of bytes which can be + * transferred, relative to the physical storage object, on success. + * @result + * A reference to the physical storage object, which should be released by + * the caller, or a null on error. + */ + + virtual IOStorage * copyPhysicalExtent(IOService * client, + UInt64 * byteStart, + UInt64 * byteCount) APPLE_KEXT_OVERRIDE; + + /*! + * @function unlockPhysicalExtents + * @discussion + * Unlock the contents of the storage object for relocation again. This + * call must balance a successful call to lockPhysicalExtents(). + * @param client + * Client requesting the operation. + */ + + virtual void unlockPhysicalExtents(IOService * client) APPLE_KEXT_OVERRIDE; + + /*! + * @function setPriority + * @discussion + * Reprioritize read or write requests at the specified byte offsets. + * @param client + * Client requesting the operation. + * @param extents + * List of extents. See IOStorageExtent. It is legal for the callee to + * overwrite the contents of this buffer in order to satisfy the request. + * @param extentsCount + * Number of extents. + * @param priority + * New priority. See IOStoragePriority. + * @result + * Returns the status of the operation. + */ + + virtual IOReturn setPriority(IOService * client, + IOStorageExtent * extents, + UInt32 extentsCount, + IOStoragePriority priority) APPLE_KEXT_OVERRIDE; + + /*! + * @function ejectMedia + * @discussion + * Eject the media from the device. The driver is responsible for tearing + * down the media object it created before proceeding with the eject. If + * the tear-down fails, an error should be returned. + * @result + * An IOReturn code. + */ + + virtual IOReturn ejectMedia(); + + /*! + * @function formatMedia + * @discussion + * Format the media with the specified byte capacity. The driver is + * responsible for tearing down the media object and recreating it. + * @param byteCapacity + * Number of bytes to format media to. + * @result + * An IOReturn code. + */ + + virtual IOReturn formatMedia(UInt64 byteCapacity); + +#if TARGET_OS_OSX && defined(__x86_64__) + virtual IOReturn lockMedia(bool lock) __attribute__ ((deprecated)); + + virtual IOReturn pollMedia() __attribute__ ((deprecated)); +#endif /* TARGET_OS_OSX && defined(__x86_64__) */ + + /*! + * @function isMediaEjectable + * @discussion + * Ask the driver whether the media is ejectable. + * @result + * Returns true if the media is ejectable, false otherwise. + */ + + virtual bool isMediaEjectable() const; + + /*! + * @function isMediaRemovable + * @discussion + * Ask the driver whether the media is ejectable. + * @result + * Returns true if the media is ejectable, false otherwise. + */ + + virtual bool isMediaRemovable() const; + +#if TARGET_OS_OSX && defined(__x86_64__) + virtual bool isMediaPollExpensive() const __attribute__ ((deprecated)); + + virtual bool isMediaPollRequired() const __attribute__ ((deprecated)); +#endif /* TARGET_OS_OSX && defined(__x86_64__) */ + + /*! + * @function isMediaWritable + * @discussion + * Ask the driver whether the media is writable. + * @result + * Returns true if the media is writable, false otherwise. + */ + + virtual bool isMediaWritable() const; + + /*! + * @function getMediaState + * @discussion + * Ask the driver about the media's current state. + * @result + * An IOMediaState value. + */ + + virtual IOMediaState getMediaState() const; + + /*! + * @function getFormatCapacities + * @discussion + * Ask the driver to report the feasible formatting capacities for the + * inserted media (in bytes). This routine fills the caller's buffer, + * up to the maximum count specified if the real number of capacities + * would overflow the buffer. The return value indicates the actual + * number of capacities copied to the buffer. + * + * If the capacities buffer is not supplied or if the maximum count is + * zero, the routine returns the proposed count of capacities instead. + * @param capacities + * Buffer that will receive the UInt64 capacity values. + * @param capacitiesMaxCount + * Maximum number of capacity values that can be held in the buffer. + * @result + * Actual number of capacity values copied to the buffer, or if no buffer + * is given, the total number of capacity values available. + */ + + virtual UInt32 getFormatCapacities(UInt64 * capacities, + UInt32 capacitiesMaxCount) const; + + /*! + * @function getStatistics + * @discussion + * Ask the driver to report its operating statistics. + * + * The statistics are each indexed by IOBlockStorageDriver::Statistics + * indices. This routine fills the caller's buffer, up to the maximum + * count specified if the real number of statistics would overflow the + * buffer. The return value indicates the actual number of statistics + * copied to the buffer. + * + * If the statistics buffer is not supplied or if the maximum count is + * zero, the routine returns the proposed count of statistics instead. + * @param statistics + * Buffer that will receive the UInt64 statistic values. + * @param statisticsMaxCount + * Maximum number of statistic values that can be held in the buffer. + * @result + * Actual number of statistic values copied to the buffer, or if no buffer + * is given, the total number of statistic values available. + */ + + virtual UInt32 getStatistics(UInt64 * statistics, + UInt32 statisticsMaxCount) const; + + /*! + * @function getStatistic + * @discussion + * Ask the driver to report one of its operating statistics. + * @param statistic + * Statistic index (an IOBlockStorageDriver::Statistics index). + * @result + * Statistic value. + */ + + virtual UInt64 getStatistic(Statistics statistic) const; + + /* + * Generic entry point for calls from the provider. A return value of + * kIOReturnSuccess indicates that the message was received, and where + * applicable, that it was successful. + */ + + virtual IOReturn message(UInt32 type, IOService * provider, void * argument) APPLE_KEXT_OVERRIDE; + + /* + * Obtain this object's provider. We override the superclass's method to + * return a more specific subclass of IOService -- IOBlockStorageDevice. + * This method serves simply as a convenience to subclass developers. + */ + + virtual IOBlockStorageDevice * getProvider() const APPLE_KEXT_OVERRIDE; + +protected: + + IOLock * _deblockRequestWriteLock; + + UInt64 _reserved1024; + + static void breakUpRequestExecute(void * parameter, void * target); + + static void deblockRequestExecute(void * parameter, void * target); + + /* + * This is the completion routine for the broken up breaker sub-requests. + * It verifies the success of the just-completed stage, transitions to + * the next stage, then builds and issues a transfer for the next stage. + */ + + static void breakUpRequestCompletion(void * target, + void * parameter, + IOReturn status, + UInt64 actualByteCount); + + /* + * This is the completion routine for the aligned deblocker sub-requests. + * It verifies the success of the just-completed stage, transitions to + * the next stage, then builds and issues a transfer for the next stage. + */ + + static void deblockRequestCompletion(void * target, + void * parameter, + IOReturn status, + UInt64 actualByteCount); + + /* + * This is the completion routine for the prepared request. It updates + * the driver's statistics, performs some clean up work, then calls the + * original request's completion routine. + */ + + static void prepareRequestCompletion(void * target, + void * parameter, + IOReturn status, + UInt64 actualByteCount); + +#if TARGET_OS_OSX && defined(__x86_64__) + virtual void schedulePoller() __attribute__ ((deprecated)); + + virtual void unschedulePoller() __attribute__ ((deprecated)); +#endif /* TARGET_OS_OSX && defined(__x86_64__) */ + + /* + * This method is the power event handler for restarts and shutdowns. + */ + + static IOReturn handlePowerEvent(void * target, + void * parameter, + UInt32 messageType, + IOService * provider, + void * messageArgument, + vm_size_t messageArgumentSize); + +protected: + + /* Device info: */ + + /*! + * @var _removable + * True if the media is removable; False if it is fixed (not removable). + */ + bool _removable; + + /*! + * @var _ejectable + * True if the media is ejectable under software control. + */ + bool _ejectable; /* software-ejectable */ + + UInt16 _reserved1104; + + UInt32 _openAssertions; + + /* Media info and states: */ + + /*! + * @var _mediaObject + * A pointer to the media object we have instantiated (if any). + */ + IOMedia * _mediaObject; + + /*! + * @var _mediaType + * Type of the media (can be used to differentiate between the + * different types of CD media, DVD media, etc). + */ + UInt32 _mediaType; + + bool _solidState; + + /*! + * @var _writeProtected + * True if the media is write-protected; False if not. + */ + bool _writeProtected; + + UInt16 _reserved1264; + UInt64 _reserved1280; + + /*! + * @var _mediaBlockSize + * The block size of the media, in bytes. + */ + UInt64 _mediaBlockSize; + + /*! + * @var _maxBlockNumber + * The maximum allowable block number for the media, zero-based. + */ + UInt64 _maxBlockNumber; + + /*! + * @var _maxReadByteTransfer + * The maximum byte transfer allowed for read operations. + */ + UInt64 _maxReadByteTransfer; + + /*! + * @var _maxWriteByteTransfer + * The maximum byte transfer allowed for write operations. + */ + UInt64 _maxWriteByteTransfer; + + /*! + * @function acceptNewMedia + * @abstract + * React to new media insertion. + * @discussion + * This method logs the media block size and block count, then calls + * instantiateMediaObject to get a media object instantiated. The + * media object is then attached above us and registered. + * + * This method can be overridden to control what happens when new media + * is inserted. The default implementation deals with one IOMedia object. + */ + virtual IOReturn acceptNewMedia(void); + +#if TARGET_OS_OSX && defined(__x86_64__) + virtual UInt64 constrainByteCount(UInt64 requestedCount,bool isWrite) __attribute__ ((deprecated)); +#endif /* TARGET_OS_OSX && defined(__x86_64__) */ + + /*! + * @function decommissionMedia + * @abstract + * Decommission an existing piece of media that has gone away. + * @discussion + * This method wraps a call to terminate, to tear down the stack and + * the IOMedia object for the media. If "forcible" is true, the media + * object will be forgotten, and initMediaState will be called. A + * forcible decommission would occur when an unrecoverable error + * happens during tear-down (e.g. perhaps a client is still open), but + * we must still forget about the media. + * @param forcible + * True to force forgetting of the media object even if terminate reports + * that there was an active client. + */ + virtual IOReturn decommissionMedia(bool forcible); + + /*! + * @function instantiateDesiredMediaObject + * @abstract + * Create an IOMedia object for media. + * @discussion + * This method creates the exact type of IOMedia object desired. It is called by + * instantiateMediaObject. A subclass may override this one-line method to change + * the type of media object actually instantiated. + */ + virtual IOMedia * instantiateDesiredMediaObject(void); + + /*! + * @function instantiateMediaObject + * @abstract + * Create an IOMedia object for media. + * @discussion + * This method creates an IOMedia object from the supplied parameters. It is a + * convenience method to wrap the handful of steps to do the job. + * @param base + * Byte number of beginning of active data area of the media. Usually zero. + * @param byteSize + * Size of the data area of the media, in bytes. + * @param blockSize + * Block size of the media, in bytes. + * @param mediaName + * Name of the IOMedia object. + * @result + * A pointer to the created IOMedia object, or a null on error. + */ + virtual IOMedia * instantiateMediaObject(UInt64 base,UInt64 byteSize, + UInt32 blockSize,char *mediaName); + + /*! + * @function recordMediaParameters + * @abstract + * Obtain media-related parameters on media insertion. + * @discussion + * This method obtains media-related parameters via calls to the + * Transport Driver's reportBlockSize, reportMaxValidBlock, + * and reportWriteProtection methods. + */ + virtual IOReturn recordMediaParameters(void); + + /*! + * @function rejectMedia + * @abstract + * Reject new media. + * @discussion + * This method will be called if validateNewMedia returns False (thus rejecting + * the new media. A vendor may choose to override this method to control behavior + * when media is rejected. + * + * The default implementation simply calls ejectMedia. + */ + virtual void rejectMedia(void); /* default ejects */ + + /*! + * @function validateNewMedia + * @abstract + * Verify that new media is acceptable. + * @discussion + * This method will be called whenever new media is detected. Return true to accept + * the media, or false to reject it (and call rejectMedia). Vendors might override + * this method to handle password-protection for new media. + * + * The default implementation always returns True, indicating media is accepted. + */ + virtual bool validateNewMedia(void); + + /* --- Internally used methods. --- */ + + /* + * @group + * Internally Used Methods + * @discussion + * These methods are used internally, and will not generally be modified. + */ + + /*! + * @function checkForMedia + * @abstract + * Check if media has newly arrived or disappeared. + * @discussion + * This method does most of the work in polling for media, first + * calling the block storage device's reportMediaState method. If + * reportMediaState reports no change in the media state, kIOReturnSuccess + * is returned. If the media state has indeed changed, a call is made to + * mediaStateHasChanged to act on the event. + */ + virtual IOReturn checkForMedia(void); + + /*! + * @function getDeviceTypeName + * @abstract + * Return the desired device name. + * @discussion + * This method returns a string, used to compare the + * kIOBlockStorageDeviceTypeKey of our provider. This method is called from + * probe. + * + * The default implementation of this method returns + * kIOBlockStorageDeviceTypeGeneric. + */ + virtual const char * getDeviceTypeName(void); + + /*! + * @function initMediaState + * @abstract + * Initialize media-related instance variables. + * @discussion + * Called when media is not present, this method marks the device state + * as not having media present, not spun up, and write-enabled. + */ + virtual void initMediaState(void); + + /*! + * @function mediaStateHasChanged + * @abstract + * React to a new media insertion or a media removal. + * @discussion + * This method is called on a media state change, that is, an arrival + * or removal. If media has just become available, calls are made to + * recordMediaParameters and acceptNewMedia. If media has just gone + * away, a call is made to decommissionMedia, with the forcible + * parameter set to true. The forcible tear-down is needed to enforce + * the disappearance of media, regardless of interested clients. + */ + virtual IOReturn mediaStateHasChanged(IOMediaState state); + + /* + * @endgroup + */ + +protected: + + /*! + * @function breakUpRequest + * @discussion + * The breakUpRequest method checks to see if the incoming request exceeds + * our transfer constraints, and if so, breaks up the request into smaller + * sub-requests. + * + * This method is part of a sequence of methods invoked for each read/write + * request. The first is prepareRequest, which allocates and prepares some + * context for the transfer; the second is deblockRequest, which aligns the + * transfer at the media's block boundaries; third is breakUpRequest, which + * breaks up the transfer into multiple sub-transfers when certain hardware + * constraints are exceeded; fourth is executeRequest, which implements the + * actual transfer from the block storage device. + * + * This method's implementation is not typically overridden. + * @param byteStart + * Starting byte offset for the data transfer. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param attributes + * Attributes of the data transfer. See IOStorageAttributes. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + * @param completion + * Completion routine to call once the data transfer is complete. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + * @param context + * Additional context information for the data transfer (e.g. block size). + */ + + virtual void breakUpRequest(UInt64 byteStart, + IOMemoryDescriptor * buffer, + IOStorageAttributes * attributes, + IOStorageCompletion * completion, + Context * context); + + /*! + * @function prepareRequest + * @discussion + * The prepareRequest method allocates and prepares state for the transfer. + * + * This method is part of a sequence of methods invoked for each read/write + * request. The first is prepareRequest, which allocates and prepares some + * context for the transfer; the second is deblockRequest, which aligns the + * transfer at the media's block boundaries; third is breakUpRequest, which + * breaks up the transfer into multiple sub-transfers when certain hardware + * constraints are exceeded; fourth is executeRequest, which implements the + * actual transfer from the block storage device. + * + * This method's implementation is not typically overridden. + * @param byteStart + * Starting byte offset for the data transfer. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param attributes + * Attributes of the data transfer. See IOStorageAttributes. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + * @param completion + * Completion routine to call once the data transfer is complete. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + */ + + virtual void prepareRequest(UInt64 byteStart, + IOMemoryDescriptor * buffer, + IOStorageAttributes * attributes, + IOStorageCompletion * completion); + +public: + + /*! + * @function requestIdle + * @abstract + * Request that the device enter an idle state. + * @discussion + * Request that the device enter an idle state. The device will exit this state on the + * next read or write request, or as it sees necessary. One example is for a DVD drive + * to spin down when it enters such an idle state, and spin up on the next read request + * from the system. + */ + virtual IOReturn requestIdle(void); + + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 0); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 1); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 2); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 3); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 4); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 5); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 6); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 7); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 8); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 9); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 10); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 11); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 12); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 13); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 14); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 15); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 16); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 17); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 18); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 19); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 20); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 21); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 22); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 23); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 24); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 25); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 26); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 27); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 28); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 29); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 30); + OSMetaClassDeclareReservedUnused(IOBlockStorageDriver, 31); +}; + +#endif /* __cplusplus */ +#endif /* KERNEL */ +#endif /* !_IOBLOCKSTORAGEDRIVER_H */ diff --git a/QualcommWireless/include/IOKit/storage/IOCDBlockStorageDevice.h b/QualcommWireless/include/IOKit/storage/IOCDBlockStorageDevice.h new file mode 100644 index 0000000..f33b85f --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOCDBlockStorageDevice.h @@ -0,0 +1,142 @@ +/* + * Copyright (c) 1998-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/*! + * @header IOCDBlockStorageDevice + * @abstract + * This header contains the IOCDBlockStorageDevice class definition. + */ + +#ifndef _IOCDBLOCKSTORAGEDEVICE_H +#define _IOCDBLOCKSTORAGEDEVICE_H + +#include <IOKit/storage/IOCDTypes.h> + +/*! + * @defined kIOCDBlockStorageDeviceClass + * @abstract + * kIOCDBlockStorageDeviceClass is the name of the IOCDBlockStorageDevice class. + * @discussion + * kIOCDBlockStorageDeviceClass is the name of the IOCDBlockStorageDevice class. + */ + +#define kIOCDBlockStorageDeviceClass "IOCDBlockStorageDevice" + +#ifdef KERNEL +#ifdef __cplusplus + +/* + * Kernel + */ + +#include <IOKit/storage/IOBlockStorageDevice.h> + +/* Property used for matching, so the generic driver gets the nub it wants. */ +#define kIOBlockStorageDeviceTypeCDROM "CDROM" + +/*! + * @class + * IOCDBlockStorageDevice : public IOBlockStorageDevice + * @abstract + * The IOCDBlockStorageDevice class is a generic CD block storage device + * abstraction. + * @discussion + * This class is the protocol for generic CD functionality, independent of + * the physical connection protocol (e.g. SCSI, ATA, USB). + * + * The APIs are the union of CD (block storage) data APIs and all + * necessary low-level CD APIs. + * + * A subclass implements relay methods that translate our requests into + * calls to a protocol- and device-specific provider. + */ + +class IOCDBlockStorageDevice : public IOBlockStorageDevice { + + OSDeclareAbstractStructors(IOCDBlockStorageDevice) + +protected: + + struct ExpansionData { /* */ }; + ExpansionData * _expansionData; + +public: + + /* Overrides from IORegistryEntry */ + + virtual bool init(OSDictionary * properties); + + /*-----------------------------------------*/ + /* CD APIs */ + /*-----------------------------------------*/ + + virtual IOReturn doAsyncReadCD(IOMemoryDescriptor *buffer, + UInt32 block,UInt32 nblks, + CDSectorArea sectorArea, + CDSectorType sectorType, + IOStorageCompletion completion) = 0; + virtual UInt32 getMediaType(void) = 0; + virtual IOReturn readISRC(UInt8 track,CDISRC isrc) = 0; + virtual IOReturn readMCN(CDMCN mcn) = 0; + virtual IOReturn readTOC(IOMemoryDescriptor *buffer) = 0; + + /*-----------------------------------------*/ + /* CD APIs */ + /*-----------------------------------------*/ + + virtual IOReturn getSpeed(UInt16 * kilobytesPerSecond) = 0; + + virtual IOReturn setSpeed(UInt16 kilobytesPerSecond) = 0; + + virtual IOReturn readTOC(IOMemoryDescriptor *buffer,CDTOCFormat format, + UInt8 msf,UInt8 trackSessionNumber, + UInt16 *actualByteCount) = 0; + + virtual IOReturn readDiscInfo(IOMemoryDescriptor *buffer, + UInt16 *actualByteCount) = 0; + + virtual IOReturn readTrackInfo(IOMemoryDescriptor *buffer,UInt32 address, + CDTrackInfoAddressType addressType, + UInt16 *actualByteCount) = 0; + + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDevice, 0); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDevice, 1); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDevice, 2); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDevice, 3); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDevice, 4); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDevice, 5); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDevice, 6); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDevice, 7); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDevice, 8); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDevice, 9); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDevice, 10); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDevice, 11); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDevice, 12); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDevice, 13); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDevice, 14); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDevice, 15); +}; + +#endif /* __cplusplus */ +#endif /* KERNEL */ +#endif /* !_IOCDBLOCKSTORAGEDEVICE_H */ diff --git a/QualcommWireless/include/IOKit/storage/IOCDBlockStorageDriver.h b/QualcommWireless/include/IOKit/storage/IOCDBlockStorageDriver.h new file mode 100644 index 0000000..7be06eb --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOCDBlockStorageDriver.h @@ -0,0 +1,218 @@ +/* + * Copyright (c) 1998-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * IOCDBlockStorageDriver.h + * + * This class implements CD functionality, independent of + * the physical connection protocol (e.g. SCSI, ATA, USB). + * + * A protocol-specific provider implements the functionality using an appropriate + * protocol and commands. + */ + +#ifndef _IOCDBLOCKSTORAGEDRIVER_H +#define _IOCDBLOCKSTORAGEDRIVER_H + +#include <IOKit/IOTypes.h> +#include <IOKit/storage/IOCDBlockStorageDevice.h> +#include <IOKit/storage/IOCDTypes.h> +#include <IOKit/storage/IOBlockStorageDriver.h> + +/* + * @defined kIOCDBlockStorageDriverClass + * @abstract + * kIOCDBlockStorageDriverClass is the name of the IOCDBlockStorageDriver class. + * @discussion + * kIOCDBlockStorageDriverClass is the name of the IOCDBlockStorageDriver class. + */ + +#define kIOCDBlockStorageDriverClass "IOCDBlockStorageDriver" + +class IOCDBlockStorageDriver : public IOBlockStorageDriver { + + OSDeclareDefaultStructors(IOCDBlockStorageDriver) + +public: + + static const UInt64 kBlockSizeCD = 2352; + static const UInt8 kBlockTypeCD = 0x01; + + /* Overrides of IORegistryEntry */ + + virtual bool init(OSDictionary * properties); + virtual void free(void); + + /* Overrides of IOBlockStorageDriver: */ + + virtual IOReturn ejectMedia(void); + virtual void executeRequest(UInt64 byteStart, + IOMemoryDescriptor *buffer, + IOStorageAttributes *attributes, + IOStorageCompletion *completion, + Context *context); + virtual const char * getDeviceTypeName(void); + virtual IOMedia * instantiateDesiredMediaObject(void); + virtual IOMedia * instantiateMediaObject(UInt64 base,UInt64 byteSize, + UInt32 blockSize,char *mediaName); + virtual IOReturn recordMediaParameters(void); + + /* End of IOBlockStorageDriver overrides. */ + + /* + * @function getMediaType + * @abstract + * Get the current type of media inserted in the CD drive. + * @discussion + * Certain I/O operations may not be allowed depending on the type of + * media currently inserted. For example, one cannot issue write operations + * if CD-ROM media is inserted. + * @result + * See the kCDMediaType constants in IOCDTypes.h. + */ + virtual UInt32 getMediaType(void); + + /* -------------------------------------------------*/ + /* APIs implemented here, exported by IOCDMedia: */ + /* -------------------------------------------------*/ + + virtual CDTOC * getTOC(void); + virtual void readCD(IOService *client, + UInt64 byteStart, + IOMemoryDescriptor *buffer, + CDSectorArea sectorArea, + CDSectorType sectorType, + IOStorageAttributes *attributes, + IOStorageCompletion *completion); + virtual IOReturn readISRC(UInt8 track,CDISRC isrc); + virtual IOReturn readMCN(CDMCN mcn); + + /* end of IOCDMedia APIs */ + + /* + * Obtain this object's provider. We override the superclass's method to + * return a more specific subclass of IOService -- IOCDBlockStorageDevice. + * This method serves simply as a convenience to subclass developers. + */ + + virtual IOCDBlockStorageDevice * getProvider() const; + +protected: + + /* Overrides of IOBlockStorageDriver behavior. */ + + /* When CD media is inserted, we want to create multiple nubs for the data and + * audio tracks, for sessions, and the entire media. We override the methods + * that manage nubs. + */ + virtual IOReturn acceptNewMedia(void); + virtual IOReturn decommissionMedia(bool forcible); + + /* End of IOBlockStorageDriver overrides. */ + + /* Internally used methods: */ + + using IOBlockStorageDriver::getMediaBlockSize; + + virtual IOReturn cacheTocInfo(void); + virtual UInt64 getMediaBlockSize(CDSectorArea area,CDSectorType type); + virtual void prepareRequest(UInt64 byteStart, + IOMemoryDescriptor *buffer, + CDSectorArea sectorArea, + CDSectorType sectorType, + IOStorageAttributes *attributes, + IOStorageCompletion *completion); + + /* ------- */ + + struct ExpansionData + { + UInt32 minBlockNumberAudio; + UInt32 maxBlockNumberAudio; + }; + ExpansionData * _expansionData; + + #define _minBlockNumberAudio \ + IOCDBlockStorageDriver::_expansionData->minBlockNumberAudio + #define _maxBlockNumberAudio \ + IOCDBlockStorageDriver::_expansionData->maxBlockNumberAudio + + UInt32 _reserved0032; + + /* We keep the TOC here because we'll always need it, so what the heck. + * + * There are possible "point" track entries for 0xa0..a2, 0xb0..b4, and 0xc0..0xc1. + * Tracks need not start at 1, as long as they're between 1 and 99, and have contiguous + * numbers. + */ + + CDTOC * _toc; + UInt32 _tocSize; + + /* ------- */ + + IOReturn reportDiscInfo(CDDiscInfo *discInfo); + IOReturn reportTrackInfo(UInt16 track,CDTrackInfo *trackInfo); + +public: + + virtual IOReturn getSpeed(UInt16 * kilobytesPerSecond); + + virtual IOReturn setSpeed(UInt16 kilobytesPerSecond); + + virtual IOReturn readTOC(IOMemoryDescriptor *buffer,CDTOCFormat format, + UInt8 formatAsTime,UInt8 trackOrSessionNumber, + UInt16 *actualByteCount); + + virtual IOReturn readDiscInfo(IOMemoryDescriptor *buffer, + UInt16 *actualByteCount); + + virtual IOReturn readTrackInfo(IOMemoryDescriptor *buffer,UInt32 address, + CDTrackInfoAddressType addressType, + UInt16 *actualByteCount); + + virtual void writeCD(IOService *client, + UInt64 byteStart, + IOMemoryDescriptor *buffer, + CDSectorArea sectorArea, + CDSectorType sectorType, + IOStorageAttributes *attributes, + IOStorageCompletion *completion); + + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDriver, 0); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDriver, 1); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDriver, 2); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDriver, 3); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDriver, 4); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDriver, 5); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDriver, 6); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDriver, 7); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDriver, 8); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDriver, 9); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDriver, 10); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDriver, 11); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDriver, 12); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDriver, 13); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDriver, 14); + OSMetaClassDeclareReservedUnused(IOCDBlockStorageDriver, 15); +}; +#endif diff --git a/QualcommWireless/include/IOKit/storage/IOCDMedia.h b/QualcommWireless/include/IOKit/storage/IOCDMedia.h new file mode 100644 index 0000000..9aab27e --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOCDMedia.h @@ -0,0 +1,507 @@ +/* + * Copyright (c) 1998-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/*! + * @header IOCDMedia + * @abstract + * This header contains the IOCDMedia class definition. + */ + +#ifndef _IOCDMEDIA_H +#define _IOCDMEDIA_H + +/*! + * @defined kIOCDMediaClass + * @abstract + * kIOCDMediaClass is the name of the IOCDMedia class. + * @discussion + * kIOCDMediaClass is the name of the IOCDMedia class. + */ + +#define kIOCDMediaClass "IOCDMedia" + +/*! + * @defined kIOCDMediaTOCKey + * @abstract + * kIOCDMediaTOCKey is a property of IOCDMedia objects. It has an OSData value + * and a CDTOC structure. + * @discussion + * The kIOCDMediaTOCKey property contains the CD's full table of contents, + * formatted as a CDTOC structure. The CDTOC structure is same as what is + * returned by a READ TOC command, format 0x02. All fields in the TOC are + * guaranteed to be binary-encoded (no BCD-encoded numbers are ever passed). + */ + +#define kIOCDMediaTOCKey "TOC" + +/*! + * @defined kIOCDMediaTypeKey + * @abstract + * kIOCDMediaTypeKey is a property of IOCDMedia objects. It has an OSString + * value. + * @discussion + * The kIOCDMediaTypeKey property identifies the CD media type (CD-ROM, CD-R, + * CD-RW, etc). See the kIOCDMediaType contants for possible values. + */ + +#define kIOCDMediaTypeKey "Type" + +/*! + * @defined kIOCDMediaTypeROM + * The kIOCDMediaTypeKey constant for CD-ROM media (inclusive of the CD-I, + * CD-ROM XA, and CD Audio standards, and mixed mode combinations thereof). + */ + +#define kIOCDMediaTypeROM "CD-ROM" + +/*! + * @defined kIOCDMediaTypeR + * The kIOCDMediaTypeKey constant for CD Recordable (CD-R) media. + */ + +#define kIOCDMediaTypeR "CD-R" + +/*! + * @defined kIOCDMediaTypeRW + * The kIOCDMediaTypeKey constant for CD ReWritable (CD-RW) media. + */ + +#define kIOCDMediaTypeRW "CD-RW" + +#ifdef KERNEL +#ifdef __cplusplus + +/* + * Kernel + */ + +#include <IOKit/storage/IOCDBlockStorageDriver.h> +#include <IOKit/storage/IOMedia.h> + +/*! + * @class IOCDMedia + * @abstract + * The IOCDMedia class is a random-access disk device abstraction for CDs. + * @discussion + * The IOCDMedia class is a random-access disk device abstraction for CDs. It + * extends the IOMedia class by implementing special CD APIs, such as readCD, + * and publishing the TOC as a property of the IOCDMedia object. + */ + +class IOCDMedia : public IOMedia +{ + OSDeclareDefaultStructors(IOCDMedia) + +protected: + + struct ExpansionData { /* */ }; + ExpansionData * _expansionData; + +public: + + using IOStorage::read; + using IOStorage::write; + + /* + * Obtain this object's provider. We override the superclass's method to + * return a more specific subclass of IOService -- IOCDBlockStorageDriver. + * This method serves simply as a convenience to subclass developers. + */ + + virtual IOCDBlockStorageDriver * getProvider() const; + + /* + * Compare the properties in the supplied table to this object's properties. + */ + + virtual bool matchPropertyTable(OSDictionary * table, SInt32 * score); + + /*! + * @function read + * @discussion + * Read data from the storage object at the specified byte offset into the + * specified buffer, asynchronously. When the read completes, the caller + * will be notified via the specified completion action. + * + * The buffer will be retained for the duration of the read. + * @param client + * Client requesting the read. + * @param byteStart + * Starting byte offset for the data transfer. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param attributes + * Attributes of the data transfer. See IOStorageAttributes. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + * @param completion + * Completion routine to call once the data transfer is complete. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + */ + + virtual void read(IOService * client, + UInt64 byteStart, + IOMemoryDescriptor * buffer, + IOStorageAttributes * attributes, + IOStorageCompletion * completion); + + /* + * @function write + * @discussion + * Write data into the storage object at the specified byte offset from the + * specified buffer, asynchronously. When the write completes, the caller + * will be notified via the specified completion action. + * + * The buffer will be retained for the duration of the write. + * @param client + * Client requesting the write. + * @param byteStart + * Starting byte offset for the data transfer. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param attributes + * Attributes of the data transfer. See IOStorageAttributes. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + * @param completion + * Completion routine to call once the data transfer is complete. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + */ + + virtual void write(IOService * client, + UInt64 byteStart, + IOMemoryDescriptor * buffer, + IOStorageAttributes * attributes, + IOStorageCompletion * completion); + + /*! + * @function readCD + * @discussion + * Read data from the CD media object at the specified byte offset into the + * specified buffer, asynchronously. Special areas of the CD sector can be + * read via this method, such as the header and subchannel data. When the + * read completes, the caller will be notified via the specified completion + * action. + * + * The buffer will be retained for the duration of the read. + * @param client + * Client requesting the read. + * @param byteStart + * Starting byte offset for the data transfer (see sectorArea parameter). + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param sectorArea + * Sector area(s) to read. The sum of each area's size defines the natural + * block size of the media for the call. This should be taken into account + * when computing the address of byteStart. See IOCDTypes.h. + * @param sectorType + * Sector type that is expected. The data transfer is terminated as soon as + * data is encountered that does not match the expected type. + * @param attributes + * Attributes of the data transfer. See IOStorageAttributes. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + * @param completion + * Completion routine to call once the data transfer is complete. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + */ + + virtual void readCD(IOService * client, + UInt64 byteStart, + IOMemoryDescriptor * buffer, + CDSectorArea sectorArea, + CDSectorType sectorType, + IOStorageAttributes * attributes, + IOStorageCompletion * completion); + + /*! + * @function readCD + * @discussion + * Read data from the CD media object at the specified byte offset into the + * specified buffer, synchronously. Special areas of the CD sector can be + * read via this method, such as the header and subchannel data. When the + * read completes, this method will return to the caller. The actual byte + * count field is optional. + * @param client + * Client requesting the read. + * @param byteStart + * Starting byte offset for the data transfer (see sectorArea parameter). + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param sectorArea + * Sector area(s) to read. The sum of each area's size defines the natural + * block size of the media for the call. This should be taken into account + * when computing the address of byteStart. See IOCDTypes.h. + * @param sectorType + * Sector type that is expected. The data transfer is terminated as soon as + * data is encountered that does not match the expected type. + * @param attributes + * Attributes of the data transfer. See IOStorageAttributes. + * @param actualByteCount + * Returns the actual number of bytes transferred in the data transfer. + * @result + * Returns the status of the data transfer. + */ + + virtual IOReturn readCD(IOService * client, + UInt64 byteStart, + IOMemoryDescriptor * buffer, + CDSectorArea sectorArea, + CDSectorType sectorType, + IOStorageAttributes * attributes = 0, + UInt64 * actualByteCount = 0); + + /*! + * @function readISRC + * @discussion + * Read the International Standard Recording Code for the specified track. + * @param track + * Track number from which to read the ISRC. + * @param isrc + * Buffer for the ISRC data. Buffer contents will be zero-terminated. + * @result + * Returns the status of the operation. + */ + + virtual IOReturn readISRC(UInt8 track, CDISRC isrc); + + /*! + * @function readMCN + * @discussion + * Read the Media Catalog Number (also known as the Universal Product Code). + * @param mcn + * Buffer for the MCN data. Buffer contents will be zero-terminated. + * @result + * Returns the status of the operation. + */ + + virtual IOReturn readMCN(CDMCN mcn); + + /*! + * @function getTOC + * @discussion + * Get the full Table Of Contents. + * + * All CDTOC fields passed across I/O Kit APIs are guaranteed to be + * binary-encoded (no BCD-encoded numbers are ever passed). + * @result + * Returns a pointer to the TOC buffer (do not deallocate). + */ + + virtual CDTOC * getTOC(); + + /*! + * @function getSpeed + * @discussion + * Get the current speed used for data transfers. + * @param kilobytesPerSecond + * Returns the current speed used for data transfers, in kB/s. + * + * kCDSpeedMin specifies the minimum speed for all CD media (1X). + * kCDSpeedMax specifies the maximum speed supported in hardware. + * @result + * Returns the status of the operation. + */ + + virtual IOReturn getSpeed(UInt16 * kilobytesPerSecond); + + /*! + * @function setSpeed + * @discussion + * Set the speed to be used for data transfers. + * @param kilobytesPerSecond + * Speed to be used for data transfers, in kB/s. + * + * kCDSpeedMin specifies the minimum speed for all CD media (1X). + * kCDSpeedMax specifies the maximum speed supported in hardware. + * @result + * Returns the status of the operation. + */ + + virtual IOReturn setSpeed(UInt16 kilobytesPerSecond); + + /*! + * @function readTOC + * @discussion + * Issue an MMC READ TOC/PMA/ATIP command. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param format + * As documented by MMC. + * @param formatAsTime + * As documented by MMC. + * @param trackOrSessionNumber + * As documented by MMC. + * @param actualByteCount + * Returns the actual number of bytes transferred in the data transfer. + * @result + * Returns the status of the data transfer. + */ + + virtual IOReturn readTOC(IOMemoryDescriptor * buffer, + CDTOCFormat format, + UInt8 formatAsTime, + UInt8 trackOrSessionNumber, + UInt16 * actualByteCount); + + /*! + * @function readDiscInfo + * @discussion + * Issue an MMC READ DISC INFORMATION command. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param actualByteCount + * Returns the actual number of bytes transferred in the data transfer. + * @result + * Returns the status of the data transfer. + */ + + virtual IOReturn readDiscInfo(IOMemoryDescriptor * buffer, + UInt16 * actualByteCount); + + /*! + * @function readTrackInfo + * @discussion + * Issue an MMC READ TRACK INFORMATION command. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param address + * As documented by MMC. + * @param addressType + * As documented by MMC. + * @param actualByteCount + * Returns the actual number of bytes transferred in the data transfer. + * @result + * Returns the status of the data transfer. + */ + + virtual IOReturn readTrackInfo(IOMemoryDescriptor * buffer, + UInt32 address, + CDTrackInfoAddressType addressType, + UInt16 * actualByteCount); + + /* + * @function writeCD + * @discussion + * Write data into the CD media object at the specified byte offset from the + * specified buffer, asynchronously. When the write completes, the caller + * will be notified via the specified completion action. + * + * The buffer will be retained for the duration of the write. + * @param client + * Client requesting the write. + * @param byteStart + * Starting byte offset for the data transfer (see sectorArea parameter). + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param sectorArea + * Sector area(s) to write. The sum of each area's size defines the natural + * block size of the media for the call. This should be taken into account + * when computing the address of byteStart. See IOCDTypes.h. + * @param sectorType + * Sector type that is expected. + * @param attributes + * Attributes of the data transfer. See IOStorageAttributes. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + * @param completion + * Completion routine to call once the data transfer is complete. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + */ + + virtual void writeCD(IOService * client, + UInt64 byteStart, + IOMemoryDescriptor * buffer, + CDSectorArea sectorArea, + CDSectorType sectorType, + IOStorageAttributes * attributes, + IOStorageCompletion * completion); + + /* + * @function writeCD + * @discussion + * Write data into the CD media object at the specified byte offset from the + * specified buffer, synchronously. When the write completes, this method + * will return to the caller. The actual byte count field is optional. + * @param client + * Client requesting the write. + * @param byteStart + * Starting byte offset for the data transfer (see sectorArea parameter). + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param sectorArea + * Sector area(s) to write. The sum of each area's size defines the natural + * block size of the media for the call. This should be taken into account + * when computing the address of byteStart. See IOCDTypes.h. + * @param sectorType + * Sector type that is expected. + * @param attributes + * Attributes of the data transfer. See IOStorageAttributes. + * @param actualByteCount + * Returns the actual number of bytes transferred in the data transfer. + * @result + * Returns the status of the data transfer. + */ + + virtual IOReturn writeCD(IOService * client, + UInt64 byteStart, + IOMemoryDescriptor * buffer, + CDSectorArea sectorArea, + CDSectorType sectorType, + IOStorageAttributes * attributes = 0, + UInt64 * actualByteCount = 0); + + OSMetaClassDeclareReservedUnused(IOCDMedia, 0); + OSMetaClassDeclareReservedUnused(IOCDMedia, 1); + OSMetaClassDeclareReservedUnused(IOCDMedia, 2); + OSMetaClassDeclareReservedUnused(IOCDMedia, 3); + OSMetaClassDeclareReservedUnused(IOCDMedia, 4); + OSMetaClassDeclareReservedUnused(IOCDMedia, 5); + OSMetaClassDeclareReservedUnused(IOCDMedia, 6); + OSMetaClassDeclareReservedUnused(IOCDMedia, 7); + OSMetaClassDeclareReservedUnused(IOCDMedia, 8); + OSMetaClassDeclareReservedUnused(IOCDMedia, 9); + OSMetaClassDeclareReservedUnused(IOCDMedia, 10); + OSMetaClassDeclareReservedUnused(IOCDMedia, 11); + OSMetaClassDeclareReservedUnused(IOCDMedia, 12); + OSMetaClassDeclareReservedUnused(IOCDMedia, 13); + OSMetaClassDeclareReservedUnused(IOCDMedia, 14); + OSMetaClassDeclareReservedUnused(IOCDMedia, 15); +}; + +#endif /* __cplusplus */ +#endif /* KERNEL */ +#endif /* !_IOCDMEDIA_H */ diff --git a/QualcommWireless/include/IOKit/storage/IOCDMediaBSDClient.h b/QualcommWireless/include/IOKit/storage/IOCDMediaBSDClient.h new file mode 100644 index 0000000..d5acdcf --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOCDMediaBSDClient.h @@ -0,0 +1,199 @@ +/* + * Copyright (c) 1998-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOCDMEDIABSDCLIENT_H +#define _IOCDMEDIABSDCLIENT_H + +#include <sys/ioctl.h> + +#include <IOKit/storage/IOCDTypes.h> + +/* + * Definitions + * + * ioctl description + * ---------------------------- ------------------------------------------------ + * DKIOCCDREAD see IOCDMedia::readCD() in IOCDMedia.h + * DKIOCCDREADTOC see IOCDMedia::readTOC() in IOCDMedia.h + * + * DKIOCCDREADDISCINFO see IOCDMedia::readDiscInfo() in IOCDMedia.h + * DKIOCCDREADTRACKINFO see IOCDMedia::readTrackInfo() in IOCDMedia.h + * + * DKIOCCDREADISRC see IOCDMedia::readISRC() in IOCDMedia.h + * DKIOCCDREADMCN see IOCDMedia::readMCN() in IOCDMedia.h + * + * DKIOCCDGETSPEED see IOCDMedia::getSpeed() in IOCDMedia.h + * DKIOCCDSETSPEED see IOCDMedia::setSpeed() in IOCDMedia.h + * + * in /System/Library/Frameworks/Kernel.framework/Headers/IOKit/storage/ + */ + +typedef struct +{ + uint64_t offset; + + uint8_t sectorArea; + uint8_t sectorType; + +#ifdef __LP64__ + uint8_t reserved0080[10]; /* reserved, clear to zero */ +#else /* !__LP64__ */ + uint8_t reserved0080[6]; /* reserved, clear to zero */ +#endif /* !__LP64__ */ + + uint32_t bufferLength; /* actual length on return */ + void * buffer; +} dk_cd_read_t; + +typedef struct +{ + CDISRC isrc; + uint8_t track; + + uint8_t reserved0112[2]; /* reserved, clear to zero */ +} dk_cd_read_isrc_t; + +typedef struct +{ + CDMCN mcn; + + uint8_t reserved0112[2]; /* reserved, clear to zero */ +} dk_cd_read_mcn_t; + +typedef struct +{ + uint8_t format; + uint8_t formatAsTime; + + uint8_t reserved0016[5]; /* reserved, clear to zero */ + + union + { + uint8_t session; + uint8_t track; + } address; + +#ifdef __LP64__ + uint8_t reserved0064[6]; /* reserved, clear to zero */ +#else /* !__LP64__ */ + uint8_t reserved0064[2]; /* reserved, clear to zero */ +#endif /* !__LP64__ */ + + uint16_t bufferLength; /* actual length on return */ + void * buffer; +} dk_cd_read_toc_t; + +typedef struct +{ +#ifdef __LP64__ + uint8_t reserved0000[14]; /* reserved, clear to zero */ +#else /* !__LP64__ */ + uint8_t reserved0000[10]; /* reserved, clear to zero */ +#endif /* !__LP64__ */ + + uint16_t bufferLength; /* actual length on return */ + void * buffer; +} dk_cd_read_disc_info_t; + +typedef struct +{ + uint8_t reserved0000[4]; /* reserved, clear to zero */ + + uint32_t address; + uint8_t addressType; + +#ifdef __LP64__ + uint8_t reserved0072[5]; /* reserved, clear to zero */ +#else /* !__LP64__ */ + uint8_t reserved0072[1]; /* reserved, clear to zero */ +#endif /* !__LP64__ */ + + uint16_t bufferLength; /* actual length on return */ + void * buffer; +} dk_cd_read_track_info_t; + +#define DKIOCCDREAD _IOWR('d', 96, dk_cd_read_t) + +#define DKIOCCDREADISRC _IOWR('d', 97, dk_cd_read_isrc_t) +#define DKIOCCDREADMCN _IOWR('d', 98, dk_cd_read_mcn_t) + +#define DKIOCCDGETSPEED _IOR('d', 99, uint16_t) +#define DKIOCCDSETSPEED _IOW('d', 99, uint16_t) + +#define DKIOCCDREADTOC _IOWR('d', 100, dk_cd_read_toc_t) + +#define DKIOCCDREADDISCINFO _IOWR('d', 101, dk_cd_read_disc_info_t) +#define DKIOCCDREADTRACKINFO _IOWR('d', 102, dk_cd_read_track_info_t) + +#ifdef KERNEL +#ifdef __cplusplus + +/* + * Kernel + */ + +#include <IOKit/storage/IOCDMedia.h> +#include <IOKit/storage/IOMediaBSDClient.h> + +/* + * Class + */ + +class IOCDMediaBSDClient : public IOMediaBSDClient +{ + OSDeclareDefaultStructors(IOCDMediaBSDClient) + +protected: + + struct ExpansionData { /* */ }; + ExpansionData * _expansionData; + +public: + + /* + * Obtain this object's provider. We override the superclass's method + * to return a more specific subclass of IOService -- IOCDMedia. This + * method serves simply as a convenience to subclass developers. + */ + + virtual IOCDMedia * getProvider() const; + + /* + * Process a CD-specific ioctl. + */ + + virtual int ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, proc_t proc); + + OSMetaClassDeclareReservedUnused(IOCDMediaBSDClient, 0); + OSMetaClassDeclareReservedUnused(IOCDMediaBSDClient, 1); + OSMetaClassDeclareReservedUnused(IOCDMediaBSDClient, 2); + OSMetaClassDeclareReservedUnused(IOCDMediaBSDClient, 3); + OSMetaClassDeclareReservedUnused(IOCDMediaBSDClient, 4); + OSMetaClassDeclareReservedUnused(IOCDMediaBSDClient, 5); + OSMetaClassDeclareReservedUnused(IOCDMediaBSDClient, 6); + OSMetaClassDeclareReservedUnused(IOCDMediaBSDClient, 7); +}; + +#endif /* __cplusplus */ +#endif /* KERNEL */ +#endif /* !_IOCDMEDIABSDCLIENT_H */ diff --git a/QualcommWireless/include/IOKit/storage/IOCDPartitionScheme.h b/QualcommWireless/include/IOKit/storage/IOCDPartitionScheme.h new file mode 100644 index 0000000..1c9cd93 --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOCDPartitionScheme.h @@ -0,0 +1,226 @@ +/* + * Copyright (c) 1998-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/* + * @header IOCDPartitionScheme + * @abstract + * This header contains the IOCDPartitionScheme class definition. + */ + +#ifndef _IOCDPARTITIONSCHEME_H +#define _IOCDPARTITIONSCHEME_H + +#include <IOKit/storage/IOCDTypes.h> + +/* + * @defined kIOCDPartitionSchemeClass + * @abstract + * kIOCDPartitionSchemeClass is the name of the IOCDPartitionScheme class. + * @discussion + * kIOCDPartitionSchemeClass is the name of the IOCDPartitionScheme class. + */ + +#define kIOCDPartitionSchemeClass "IOCDPartitionScheme" + +/* + * @defined kIOMediaSessionIDKey + * @abstract + * kIOMediaSessionIDKey is property of IOMedia objects. It has an OSNumber + * value. + * @discussion + * The kIOMediaSessionIDKey property is placed into each IOMedia instance + * created by the CD partition scheme. It identifies the session number + * the track was recorded on. + */ + +#define kIOMediaSessionIDKey "Session ID" + +#ifdef KERNEL +#ifdef __cplusplus + +/* + * Kernel + */ + +#include <IOKit/storage/IOCDMedia.h> +#include <IOKit/storage/IOPartitionScheme.h> + +/* + * Class + */ + +class IOCDPartitionScheme : public IOPartitionScheme +{ + OSDeclareDefaultStructors(IOCDPartitionScheme); + +protected: + + struct ExpansionData { /* */ }; + ExpansionData * _expansionData; + + OSSet * _partitions; /* (set of media objects representing partitions) */ + + /* + * Free all of this object's outstanding resources. + */ + + virtual void free(void); + + /* + * Scan the provider media for CD partitions (in TOC). Returns the set + * of media objects representing each of the partitions (the retain for + * the set is passed to the caller), or null should no CD partitions be + * found. The default probe score can be adjusted up or down, based on + * the confidence of the scan. + */ + + virtual OSSet * scan(SInt32 * score); + + /* + * Ask whether the given partition appears to be corrupt. A partition that + * is corrupt will cause the failure of the CD partition scheme altogether. + */ + + virtual bool isPartitionCorrupt( CDTOCDescriptor * partition, + UInt64 partitionSize, + UInt32 partitionBlockSize, + CDSectorType partitionBlockType, + CDTOC * toc ); + + /* + * Ask whether the given partition appears to be invalid. A partition that + * is invalid will cause it to be skipped in the scan, but will not cause a + * failure of the CD partition scheme. + */ + + virtual bool isPartitionInvalid( CDTOCDescriptor * partition, + UInt64 partitionSize, + UInt32 partitionBlockSize, + CDSectorType partitionBlockType, + CDTOC * toc ); + + /* + * Instantiate a new media object to represent the given partition. + */ + + virtual IOMedia * instantiateMediaObject( + CDTOCDescriptor * partition, + UInt64 partitionSize, + UInt32 partitionBlockSize, + CDSectorType partitionBlockType, + CDTOC * toc ); + + /* + * Allocate a new media object (called from instantiateMediaObject). + */ + + virtual IOMedia * instantiateDesiredMediaObject( + CDTOCDescriptor * partition, + UInt64 partitionSize, + UInt32 partitionBlockSize, + CDSectorType partitionBlockType, + CDTOC * toc ); + +public: + + /* + * Initialize this object's minimal state. + */ + + virtual bool init(OSDictionary * properties = 0); + + /* + * Scan the provider media for CD partitions. + */ + + virtual IOService * probe(IOService * provider, SInt32 * score); + + /* + * Determine whether the provider media contains CD partitions. + */ + + virtual bool start(IOService * provider); + + /* + * Read data from the storage object at the specified byte offset into the + * specified buffer, asynchronously. When the read completes, the caller + * will be notified via the specified completion action. + * + * The buffer will be retained for the duration of the read. + * + * For the CD partition scheme, we convert the read from a partition + * object into the appropriate readCD command to our provider media. + */ + + virtual void read(IOService * client, + UInt64 byteStart, + IOMemoryDescriptor * buffer, + IOStorageAttributes * attributes, + IOStorageCompletion * completion); + + /* + * Write data into the storage object at the specified byte offset from the + * specified buffer, asynchronously. When the write completes, the caller + * will be notified via the specified completion action. + * + * The buffer will be retained for the duration of the write. + * + * For the CD partition scheme, we convert the write from a partition + * object into the appropriate writeCD command to our provider media. + */ + + virtual void write(IOService * client, + UInt64 byteStart, + IOMemoryDescriptor * buffer, + IOStorageAttributes * attributes, + IOStorageCompletion * completion); + + /* + * Obtain this object's provider. We override the superclass's method + * to return a more specific subclass of OSObject -- IOCDMedia. This + * method serves simply as a convenience to subclass developers. + */ + + virtual IOCDMedia * getProvider() const; + + OSMetaClassDeclareReservedUnused(IOCDPartitionScheme, 0); + OSMetaClassDeclareReservedUnused(IOCDPartitionScheme, 1); + OSMetaClassDeclareReservedUnused(IOCDPartitionScheme, 2); + OSMetaClassDeclareReservedUnused(IOCDPartitionScheme, 3); + OSMetaClassDeclareReservedUnused(IOCDPartitionScheme, 4); + OSMetaClassDeclareReservedUnused(IOCDPartitionScheme, 5); + OSMetaClassDeclareReservedUnused(IOCDPartitionScheme, 6); + OSMetaClassDeclareReservedUnused(IOCDPartitionScheme, 7); + OSMetaClassDeclareReservedUnused(IOCDPartitionScheme, 8); + OSMetaClassDeclareReservedUnused(IOCDPartitionScheme, 9); + OSMetaClassDeclareReservedUnused(IOCDPartitionScheme, 10); + OSMetaClassDeclareReservedUnused(IOCDPartitionScheme, 11); + OSMetaClassDeclareReservedUnused(IOCDPartitionScheme, 12); + OSMetaClassDeclareReservedUnused(IOCDPartitionScheme, 13); + OSMetaClassDeclareReservedUnused(IOCDPartitionScheme, 14); + OSMetaClassDeclareReservedUnused(IOCDPartitionScheme, 15); +}; + +#endif /* __cplusplus */ +#endif /* KERNEL */ +#endif /* !_IOCDPARTITIONSCHEME_H */ diff --git a/QualcommWireless/include/IOKit/storage/IOCDTypes.h b/QualcommWireless/include/IOKit/storage/IOCDTypes.h new file mode 100644 index 0000000..db1be39 --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOCDTypes.h @@ -0,0 +1,492 @@ +/* + * Copyright (c) 1998-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOCDTYPES_H +#define _IOCDTYPES_H + +#include <IOKit/IOTypes.h> +#include <libkern/OSByteOrder.h> + +#pragma pack(push, 1) /* (enable 8-bit struct packing) */ + +/* + * Minutes, Seconds, Frames (M:S:F) + * + * All M:S:F values passed across I/O Kit APIs are guaranteed to be + * binary-encoded numbers (no BCD-encoded numbers are ever passed). + */ + +typedef struct +{ + UInt8 minute; + UInt8 second; + UInt8 frame; +} CDMSF; + +/* + * Media Catalogue Numbers (MCN), International Standard Recording Codes (ISRC) + * + * All MCN and ISRC values passed across I/O Kit APIs are guaranteed + * to have a zero-terminating byte, for convenient use as C strings. + */ + +#define kCDMCNMaxLength 13 +#define kCDISRCMaxLength 12 + +typedef char CDMCN [kCDMCNMaxLength + 1]; +typedef char CDISRC[kCDISRCMaxLength + 1]; + +/* + * Audio Status + * + * All CDAudioStatus fields passed across I/O Kit APIs are guaranteed to + * be binary-encoded numbers (no BCD-encoded numbers are ever passed). + */ + +#define kCDAudioStatusUnsupported 0x00 +#define kCDAudioStatusActive 0x11 +#define kCDAudioStatusPaused 0x12 +#define kCDAudioStatusSuccess 0x13 +#define kCDAudioStatusFailure 0x14 +#define kCDAudioStatusNone 0x15 + +typedef struct +{ + UInt8 status; + struct + { + CDMSF time; + struct + { + UInt8 index; + UInt8 number; + CDMSF time; + } track; + } position; +} CDAudioStatus; + +/* + * Table Of Contents + * + * All CDTOC fields passed across I/O Kit APIs are guaranteed to be + * binary-encoded numbers (no BCD-encoded numbers are ever passed). + */ + +typedef struct +{ + UInt8 session; +#ifdef __LITTLE_ENDIAN__ + UInt8 control:4, adr:4; +#else /* !__LITTLE_ENDIAN__ */ + UInt8 adr:4, control:4; +#endif /* !__LITTLE_ENDIAN__ */ + UInt8 tno; + UInt8 point; + CDMSF address; + UInt8 zero; + CDMSF p; +} CDTOCDescriptor; + +typedef struct +{ + UInt16 length; + UInt8 sessionFirst; + UInt8 sessionLast; + CDTOCDescriptor descriptors[0]; +} CDTOC; + +/* + * Table Of Contents Descriptor Count Convenience Function + */ + +static inline UInt32 CDTOCGetDescriptorCount(CDTOC * toc) +{ + UInt32 tocSize = OSSwapBigToHostInt16(toc->length) + (UInt32) sizeof(toc->length); + + return (tocSize < (UInt32) sizeof(CDTOC)) ? 0 : + (tocSize - (UInt32) sizeof(CDTOC)) / (UInt32) sizeof(CDTOCDescriptor); +} + +/* + * M:S:F To LBA Convenience Function + */ + +static inline UInt32 CDConvertMSFToLBA(CDMSF msf) +{ + return (((msf.minute * 60U) + msf.second) * 75U) + msf.frame - 150U; +} + +/* + * M:S:F To Clipped LBA Convenience Function + */ + +static inline UInt32 CDConvertMSFToClippedLBA(CDMSF msf) +{ + return (msf.minute == 0 && msf.second <= 1) ? 0 : CDConvertMSFToLBA(msf); +} + +/* + * LBA To M:S:F Convenience Function + */ + +static inline CDMSF CDConvertLBAToMSF(UInt32 lba) +{ + CDMSF msf; + + lba += 150; + msf.minute = (lba / (75 * 60)); + msf.second = (lba % (75 * 60)) / 75; + msf.frame = (lba % (75 )); + + return msf; +} + +/* + * Track Number To M:S:F Convenience Function + * + * The CDTOC structure is assumed to be complete, that is, none of + * the descriptors are missing or clipped due to an insufficiently + * sized buffer holding the CDTOC contents. + */ + +static inline CDMSF CDConvertTrackNumberToMSF(UInt8 track, CDTOC * toc) +{ + UInt32 count = CDTOCGetDescriptorCount(toc); + UInt32 i; + CDMSF msf = { 0xFF, 0xFF, 0xFF }; + + for (i = 0; i < count; i++) + { + if (toc->descriptors[i].point == track && toc->descriptors[i].adr == 1) + { + msf = toc->descriptors[i].p; + break; + } + } + + return msf; +} + +/* + * Sector Areas, Sector Types + * + * Bytes Per Type CDDA Mode1 Mode2 Mode2Form1 Mode2Form2 + * Per Area +----------+----------+----------+----------+----------+ + * Sync | 0 | 12 | 12 | 12 | 12 | + * Header | 0 | 4 | 4 | 4 | 4 | + * SubHeader | 0 | 0 | 0 | 8 | 8 | + * User | 2352 | 2048 | 2336 | 2048 | 2328 | + * Auxiliary | 0 | 288 | 0 | 280 | 0 | + * ErrorFlags | 294 | 294 | 294 | 294 | 294 | + * SubChannel | 96 | 96 | 96 | 96 | 96 | + * SubChannelQ | 16 | 16 | 16 | 16 | 16 | + * +----------+----------+----------+----------+----------+ + */ + +typedef enum +{ + kCDSectorAreaSync = 0x80, + kCDSectorAreaHeader = 0x20, + kCDSectorAreaSubHeader = 0x40, + kCDSectorAreaUser = 0x10, + kCDSectorAreaAuxiliary = 0x08, + kCDSectorAreaErrorFlags = 0x02, + kCDSectorAreaSubChannel = 0x01, + kCDSectorAreaSubChannelQ = 0x04 +} CDSectorArea; + +typedef enum +{ + kCDSectorTypeUnknown = 0x00, + kCDSectorTypeCDDA = 0x01, + kCDSectorTypeMode1 = 0x02, + kCDSectorTypeMode2 = 0x03, + kCDSectorTypeMode2Form1 = 0x04, + kCDSectorTypeMode2Form2 = 0x05, + kCDSectorTypeCount = 0x06 +} CDSectorType; + +typedef enum +{ + kCDSectorSizeCDDA = 2352, + kCDSectorSizeMode1 = 2048, + kCDSectorSizeMode2 = 2336, + kCDSectorSizeMode2Form1 = 2048, + kCDSectorSizeMode2Form2 = 2328, + kCDSectorSizeWhole = 2352 +} CDSectorSize; + +/* + * Media Types + */ + +enum +{ + kCDMediaTypeUnknown = 0x0100, + kCDMediaTypeROM = 0x0102, /* CD-ROM */ + kCDMediaTypeR = 0x0104, /* CD-R */ + kCDMediaTypeRW = 0x0105, /* CD-RW */ + + kCDMediaTypeMin = 0x0100, + kCDMediaTypeMax = 0x01FF +}; + +typedef UInt32 CDMediaType; + +/* + * Media Speed (kB/s) + */ + +#define kCDSpeedMin 0x00B0 +#define kCDSpeedMax 0xFFFF + +/* + * MMC Formats + */ + +// Read Table Of Contents Format Types +typedef UInt8 CDTOCFormat; +enum +{ + kCDTOCFormatTOC = 0x02, // CDTOC + kCDTOCFormatPMA = 0x03, // CDPMA + kCDTOCFormatATIP = 0x04, // CDATIP + kCDTOCFormatTEXT = 0x05 // CDTEXT +}; + +// Read Table Of Contents Format 0x03 +struct CDPMADescriptor +{ + UInt8 reserved; +#ifdef __LITTLE_ENDIAN__ + UInt8 control:4, adr:4; +#else /* !__LITTLE_ENDIAN__ */ + UInt8 adr:4, control:4; +#endif /* !__LITTLE_ENDIAN__ */ + UInt8 tno; + UInt8 point; + CDMSF address; + UInt8 zero; + CDMSF p; +}; +typedef struct CDPMADescriptor CDPMADescriptor; + +struct CDPMA +{ + UInt16 dataLength; + UInt8 reserved; + UInt8 reserved2; + CDPMADescriptor descriptors[0]; +}; +typedef struct CDPMA CDPMA; + +// Read Table Of Contents Format 0x04 +struct CDATIP +{ + UInt16 dataLength; + UInt8 reserved[2]; +#ifdef __LITTLE_ENDIAN__ + UInt8 referenceSpeed:3; + UInt8 reserved3:1; + UInt8 indicativeTargetWritingPower:3; + UInt8 reserved2:1; + + UInt8 reserved5:6; + UInt8 unrestrictedUse:1; + UInt8 reserved4:1; + + UInt8 a3Valid:1; + UInt8 a2Valid:1; + UInt8 a1Valid:1; + UInt8 discSubType:3; + UInt8 discType:1; + UInt8 reserved6:1; +#else /* !__LITTLE_ENDIAN__ */ + UInt8 reserved2:1; + UInt8 indicativeTargetWritingPower:3; + UInt8 reserved3:1; + UInt8 referenceSpeed:3; + + UInt8 reserved4:1; + UInt8 unrestrictedUse:1; + UInt8 reserved5:6; + + UInt8 reserved6:1; + UInt8 discType:1; + UInt8 discSubType:3; + UInt8 a1Valid:1; + UInt8 a2Valid:1; + UInt8 a3Valid:1; +#endif /* !__LITTLE_ENDIAN__ */ + UInt8 reserved7; + CDMSF startTimeOfLeadIn; + UInt8 reserved8; + CDMSF lastPossibleStartTimeOfLeadOut; + UInt8 reserved9; + UInt8 a1[3]; + UInt8 reserved10; + UInt8 a2[3]; + UInt8 reserved11; + UInt8 a3[3]; + UInt8 reserved12; +}; +typedef struct CDATIP CDATIP; + +// Read Table Of Contents Format 0x05 +struct CDTEXTDescriptor +{ + UInt8 packType; + UInt8 trackNumber; + UInt8 sequenceNumber; +#ifdef __LITTLE_ENDIAN__ + UInt8 characterPosition:4; + UInt8 blockNumber:3; + UInt8 doubleByteCharacterCode:1; +#else /* !__LITTLE_ENDIAN__ */ + UInt8 doubleByteCharacterCode:1; + UInt8 blockNumber:3; + UInt8 characterPosition:4; +#endif /* !__LITTLE_ENDIAN__ */ + UInt8 textData[12]; + UInt8 reserved[2]; +}; +typedef struct CDTEXTDescriptor CDTEXTDescriptor; + +struct CDTEXT +{ + UInt16 dataLength; + UInt8 reserved; + UInt8 reserved2; + CDTEXTDescriptor descriptors[0]; +}; +typedef struct CDTEXT CDTEXT; + +// Read Disc Information Format +struct CDDiscInfo +{ + UInt16 dataLength; +#ifdef __LITTLE_ENDIAN__ + UInt8 discStatus:2; + UInt8 stateOfLastSession:2; + UInt8 erasable:1; + UInt8 reserved:3; +#else /* !__LITTLE_ENDIAN__ */ + UInt8 reserved:3; + UInt8 erasable:1; + UInt8 stateOfLastSession:2; + UInt8 discStatus:2; +#endif /* !__LITTLE_ENDIAN__ */ + UInt8 numberOfFirstTrack; + UInt8 numberOfSessionsLSB; + UInt8 firstTrackNumberInLastSessionLSB; + UInt8 lastTrackNumberInLastSessionLSB; +#ifdef __LITTLE_ENDIAN__ + UInt8 reserved3:5; + UInt8 unrestrictedUse:1; + UInt8 discBarCodeValid:1; + UInt8 discIdentificationValid:1; +#else /* !__LITTLE_ENDIAN__ */ + UInt8 discIdentificationValid:1; + UInt8 discBarCodeValid:1; + UInt8 unrestrictedUse:1; + UInt8 reserved3:5; +#endif /* !__LITTLE_ENDIAN__ */ + UInt8 discType; + UInt8 numberOfSessionsMSB; + UInt8 firstTrackNumberInLastSessionMSB; + UInt8 lastTrackNumberInLastSessionMSB; + UInt32 discIdentification; + UInt8 reserved7; + CDMSF lastSessionLeadInStartTime; + UInt8 reserved8; + CDMSF lastPossibleStartTimeOfLeadOut; + UInt8 discBarCode[8]; + UInt8 reserved9; + UInt8 numberOfOPCTableEntries; + UInt8 opcTableEntries[0]; +}; +typedef struct CDDiscInfo CDDiscInfo; + +// Read Track Information Address Types +typedef UInt8 CDTrackInfoAddressType; +enum +{ + kCDTrackInfoAddressTypeLBA = 0x00, + kCDTrackInfoAddressTypeTrackNumber = 0x01, + kCDTrackInfoAddressTypeSessionNumber = 0x02, +}; + +// Read Track Information Format +struct CDTrackInfo +{ + UInt16 dataLength; + UInt8 trackNumberLSB; + UInt8 sessionNumberLSB; + UInt8 reserved; +#ifdef __LITTLE_ENDIAN__ + UInt8 trackMode:4; + UInt8 copy:1; + UInt8 damage:1; + UInt8 reserved3:2; + + UInt8 dataMode:4; + UInt8 fixedPacket:1; + UInt8 packet:1; + UInt8 blank:1; + UInt8 reservedTrack:1; + + UInt8 nextWritableAddressValid:1; + UInt8 lastRecordedAddressValid:1; + UInt8 reserved5:6; +#else /* !__LITTLE_ENDIAN__ */ + UInt8 reserved3:2; + UInt8 damage:1; + UInt8 copy:1; + UInt8 trackMode:4; + + UInt8 reservedTrack:1; + UInt8 blank:1; + UInt8 packet:1; + UInt8 fixedPacket:1; + UInt8 dataMode:4; + + UInt8 reserved5:6; + UInt8 lastRecordedAddressValid:1; + UInt8 nextWritableAddressValid:1; +#endif /* !__LITTLE_ENDIAN__ */ + UInt32 trackStartAddress; + UInt32 nextWritableAddress; + UInt32 freeBlocks; + UInt32 fixedPacketSize; + UInt32 trackSize; + UInt32 lastRecordedAddress; + UInt8 trackNumberMSB; + UInt8 sessionNumberMSB; + UInt8 reserved6; + UInt8 reserved7; +}; +typedef struct CDTrackInfo CDTrackInfo; + +#pragma pack(pop) /* (reset to default struct packing) */ + +#endif /* _IOCDTYPES_H */ diff --git a/QualcommWireless/include/IOKit/storage/IODVDBlockStorageDevice.h b/QualcommWireless/include/IOKit/storage/IODVDBlockStorageDevice.h new file mode 100644 index 0000000..7198d8e --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IODVDBlockStorageDevice.h @@ -0,0 +1,140 @@ +/* + * Copyright (c) 1998-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/*! + * @header IODVDBlockStorageDevice + * @abstract + * This header contains the IODVDBlockStorageDevice class definition. + */ + +#ifndef _IODVDBLOCKSTORAGEDEVICE_H +#define _IODVDBLOCKSTORAGEDEVICE_H + +#include <IOKit/storage/IODVDTypes.h> + +/*! + * @defined kIODVDBlockStorageDeviceClass + * @abstract + * kIODVDBlockStorageDeviceClass is the name of the IODVDBlockStorageDevice class. + * @discussion + * kIODVDBlockStorageDeviceClass is the name of the IODVDBlockStorageDevice class. + */ + +#define kIODVDBlockStorageDeviceClass "IODVDBlockStorageDevice" + +#ifdef KERNEL +#ifdef __cplusplus + +/* + * Kernel + */ + +#include <IOKit/storage/IOCDBlockStorageDevice.h> + +/* Property used for matching, so the generic driver gets the nub it wants. */ +#define kIOBlockStorageDeviceTypeDVD "DVD" + +/*! + * @class + * IODVDBlockStorageDevice : public IOCDBlockStorageDevice + * @abstract + * The IODVDBlockStorageDevice class is a generic DVD block storage device + * abstraction. + * @discussion + * This class is the protocol for generic DVD functionality, independent of + * the physical connection protocol (e.g. SCSI, ATA, USB). + * + * The APIs are the union of CD APIs and all + * necessary new low-level DVD APIs. + * + * A subclass implements relay methods that translate our requests into + * calls to a protocol- and device-specific provider. + */ + +class IODVDBlockStorageDevice : public IOCDBlockStorageDevice { + + OSDeclareAbstractStructors(IODVDBlockStorageDevice) + +protected: + + struct ExpansionData { /* */ }; + ExpansionData * _expansionData; + +public: + + /* Overrides from IORegistryEntry */ + + virtual bool init(OSDictionary * properties); + + /* New APIs for DVD */ + + virtual IOReturn reportKey(IOMemoryDescriptor *buffer,const DVDKeyClass keyClass, + const UInt32 lba,const UInt8 agid,const DVDKeyFormat keyFormat) __attribute__ ((deprecated)); + + virtual IOReturn sendKey(IOMemoryDescriptor *buffer,const DVDKeyClass keyClass, + const UInt8 agid,const DVDKeyFormat keyFormat) = 0; + + virtual IOReturn readDVDStructure(IOMemoryDescriptor *buffer,const DVDStructureFormat format, + const UInt32 address,const UInt8 layer,const UInt8 agid) = 0; + + virtual IOReturn reportKey(IOMemoryDescriptor *buffer,const DVDKeyClass keyClass, + const UInt32 lba,const UInt8 blockCount, + const UInt8 agid,const DVDKeyFormat keyFormat); /* 10.12.0 */ + + OSMetaClassDeclareReservedUsed(IODVDBlockStorageDevice, 0); /* reportKey */ + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 1); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 2); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 3); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 4); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 5); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 6); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 7); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 8); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 9); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 10); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 11); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 12); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 13); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 14); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 15); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 16); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 17); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 18); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 19); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 20); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 21); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 22); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 23); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 24); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 25); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 26); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 27); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 28); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 29); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 30); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDevice, 31); +}; + +#endif /* __cplusplus */ +#endif /* KERNEL */ +#endif /* !_IODVDBLOCKSTORAGEDEVICE_H */ diff --git a/QualcommWireless/include/IOKit/storage/IODVDBlockStorageDriver.h b/QualcommWireless/include/IOKit/storage/IODVDBlockStorageDriver.h new file mode 100644 index 0000000..7b21b8b --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IODVDBlockStorageDriver.h @@ -0,0 +1,239 @@ +/* + * Copyright (c) 1998-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * IODVDBlockStorageDriver.h + * + * This class implements DVD functionality, independent of + * the physical connection protocol (e.g. SCSI, ATA, USB). + * + * A protocol-specific provider implements the functionality using an appropriate + * protocol and commands. + */ + +#ifndef _IODVDBLOCKSTORAGEDRIVER_H +#define _IODVDBLOCKSTORAGEDRIVER_H + +#include <IOKit/IOTypes.h> +#include <IOKit/storage/IOCDBlockStorageDriver.h> +#include <IOKit/storage/IODVDBlockStorageDevice.h> +#include <IOKit/storage/IODVDTypes.h> + +/* + * @defined kIODVDBlockStorageDriverClass + * @abstract + * kIODVDBlockStorageDriverClass is the name of the IODVDBlockStorageDriver class. + * @discussion + * kIODVDBlockStorageDriverClass is the name of the IODVDBlockStorageDriver class. + */ + +#define kIODVDBlockStorageDriverClass "IODVDBlockStorageDriver" + +class IODVDBlockStorageDevice; + +/* + * @class + * IODVDBlockStorageDriver : public IOCDBlockStorageDriver + * @abstract + * Generic DVD Driver. + * @discussion + * Storage drivers are split into two parts: the Generic Driver handles + * all generic device issues, independent of the lower-level transport + * mechanism (e.g. SCSI, ATA, USB, FireWire). All storage operations + * at the Generic Driver level are translated into a series of generic + * device operations. These operations are passed via the Device Nub + * to a Transport Driver, which implements the appropriate + * transport-dependent protocol to execute these operations. + * + * To determine the write-protect state of a device (or media), for + * example, the generic driver would issue a call to the + * Transport Driver's reportWriteProtection method. If this were a SCSI + * device, its Transport Driver would issue a Mode Sense command to + * extract the write-protection status bit. The Transport Driver then + * reports true or false to the generic driver. + * + * The generic driver therefore has no knowledge of, or involvement + * with, the actual commands and mechanisms used to communicate with + * the device. It is expected that the generic driver will rarely, if + * ever, need to be subclassed to handle device idiosyncrasies; rather, + * the Transport Driver should be changed via overrides. + * + * A generic driver could be subclassed to create a different type of + * generic device. The generic driver IODVDBlockStorageDriver class is a subclass + * of IOCDBlockStorageDriver, adding DVD functions. Similarly, the Transport Driver + * IODVDBlockStorageDevice is a subclass of IOCDBlockStorageDevice, adding DVD + * functions. +*/ + +class IODVDBlockStorageDriver : public IOCDBlockStorageDriver { + + OSDeclareDefaultStructors(IODVDBlockStorageDriver) + +protected: + + struct ExpansionData { /* */ }; + ExpansionData * _expansionData; + + /* Overrides of IOCDBlockStorageDriver. */ + + virtual IOReturn acceptNewMedia(void); + + /* End of IOCDBlockStorageDriver overrides. */ + +public: + + /* + * Obtain this object's provider. We override the superclass's method to + * return a more specific subclass of IOService -- IODVDBlockStorageDevice. + * This method serves simply as a convenience to subclass developers. + */ + + virtual IODVDBlockStorageDevice * getProvider() const; + + /* Overrides of IOCDBlockStorageDriver: */ + + virtual const char * getDeviceTypeName(void); + virtual IOMedia * instantiateDesiredMediaObject(void); + virtual IOMedia * instantiateMediaObject(UInt64 base,UInt64 byteSize, + UInt32 blockSize,char *mediaName); + + /* End of IOCDBlockStorageDriver overrides. */ + + /* + * @function reportKey + * @abstract + * Get key info from the DVD drive. + * @discussion + * This function handles the getting of key- and encryption-related data for the drive. + * @param buffer + * A buffer containing information, as documented in the specification + * "MtFuji Commands For Multimedia Devices." + * @param keyClass + * As documented by MtFuji. See DVDKeyClass. + * @param lba + * As documented by MtFuji. + * @param agid + * As documented by MtFuji. + * @param keyFormat + * As documented by MtFuji. See DVDKeyFormat. + */ + virtual IOReturn reportKey(IOMemoryDescriptor *buffer,const DVDKeyClass keyClass, + const UInt32 lba,const UInt8 agid,const DVDKeyFormat keyFormat) __attribute__ ((deprecated)); + + /* + * @function sendKey + * @abstract + * Send key info to the DVD drive. + * @discussion + * This function handles the setting of key- and encryption-related data for the drive. + * @param buffer + * A buffer containing information, as documented in the specification + * "MtFuji Commands For Multimedia Devices." + * @param keyClass + * As documented by MtFuji. See DVDKeyClass. + * @param agid + * As documented by MtFuji. + * @param keyFormat + * As documented by MtFuji. See DVDKeyFormat. + */ + virtual IOReturn sendKey(IOMemoryDescriptor *buffer,const DVDKeyClass keyClass, + const UInt8 agid,const DVDKeyFormat keyFormat); + + /* + * @function readStructure + * @abstract + * Get control structures from the DVD media. + * @discussion + * This function handles the getting of control structure data for the media. + * @param buffer + * A buffer containing information, as documented in the specification + * "MtFuji Commands For Multimedia Devices." + * @param format + * As documented by MtFuji. See DVDStructureFormat. + * @param address + * As documented by MtFuji. + * @param layer + * As documented by MtFuji. + * @param agid + * As documented by MtFuji. + */ + virtual IOReturn readStructure(IOMemoryDescriptor *buffer,const DVDStructureFormat format, + const UInt32 address,const UInt8 layer,const UInt8 agid); + + /* + * @function reportKey + * @abstract + * Get key info from the DVD drive. + * @discussion + * This function handles the getting of key- and encryption-related data for the drive. + * @param buffer + * A buffer containing information, as documented in the specification + * "MtFuji Commands For Multimedia Devices." + * @param keyClass + * As documented by MtFuji. See DVDKeyClass. + * @param lba + * As documented by MtFuji. + * @param blockCount + * As documented by MMC + * @param agid + * As documented by MtFuji. + * @param keyFormat + * As documented by MtFuji. See DVDKeyFormat. + */ + virtual IOReturn reportKey(IOMemoryDescriptor *buffer,const DVDKeyClass keyClass, + const UInt32 lba,const UInt8 blockCount, + const UInt8 agid,const DVDKeyFormat keyFormat); + + OSMetaClassDeclareReservedUsed(IODVDBlockStorageDriver, 0); /* reportKey */ + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 1); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 2); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 3); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 4); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 5); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 6); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 7); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 8); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 9); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 10); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 11); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 12); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 13); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 14); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 15); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 16); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 17); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 18); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 19); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 20); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 21); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 22); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 23); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 24); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 25); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 26); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 27); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 28); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 29); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 30); + OSMetaClassDeclareReservedUnused(IODVDBlockStorageDriver, 31); +}; +#endif diff --git a/QualcommWireless/include/IOKit/storage/IODVDMedia.h b/QualcommWireless/include/IOKit/storage/IODVDMedia.h new file mode 100644 index 0000000..8745ce0 --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IODVDMedia.h @@ -0,0 +1,366 @@ +/* + * Copyright (c) 1998-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/*! + * @header IODVDMedia + * @abstract + * This header contains the IODVDMedia class definition. + */ + +#ifndef _IODVDMEDIA_H +#define _IODVDMEDIA_H + +/*! + * @defined kIODVDMediaClass + * @abstract + * kIODVDMediaClass is the name of the IODVDMedia class. + * @discussion + * kIODVDMediaClass is the name of the IODVDMedia class. + */ + +#define kIODVDMediaClass "IODVDMedia" + +/*! + * @defined kIODVDMediaTypeKey + * @abstract + * kIODVDMediaTypeKey is a property of IODVDMedia objects. It has an OSString + * value. + * @discussion + * The kIODVDMediaTypeKey property identifies the DVD media type (DVD-ROM, + * DVD-R, DVD-RW, DVD+RW, DVD-RAM, etc). See the kIODVDMediaType contants + * for possible values. + */ + +#define kIODVDMediaTypeKey "Type" + +/*! + * @defined kIODVDMediaTypeROM + * The kIODVDMediaTypeKey constant for DVD-ROM media. + */ + +#define kIODVDMediaTypeROM "DVD-ROM" + +/*! + * @defined kIODVDMediaTypeR + * The kIODVDMediaTypeKey constant for DVD Recordable (DVD-R) media. + */ + +#define kIODVDMediaTypeR "DVD-R" + +/*! + * @defined kIODVDMediaTypeRW + * The kIODVDMediaTypeKey constant for DVD ReWritable (DVD-RW) media. + */ + +#define kIODVDMediaTypeRW "DVD-RW" + +/*! + * @defined kIODVDMediaTypePlusR + * The kIODVDMediaTypeKey constant for DVD "Plus" Recordable (DVD+R) media. + */ + +#define kIODVDMediaTypePlusR "DVD+R" + +/*! + * @defined kIODVDMediaTypePlusRW + * The kIODVDMediaTypeKey constant for DVD "Plus" ReWritable (DVD+RW) media. + */ + +#define kIODVDMediaTypePlusRW "DVD+RW" + +/*! + * @defined kIODVDMediaTypeRAM + * The kIODVDMediaTypeKey constant for DVD-RAM media. + */ + +#define kIODVDMediaTypeRAM "DVD-RAM" + +/*! + * @defined kIODVDMediaTypeHDROM + * The kIODVDMediaTypeKey constant for HD DVD-ROM media. + */ + +#define kIODVDMediaTypeHDROM "HD DVD-ROM" + +/*! + * @defined kIODVDMediaTypeHDR + * The kIODVDMediaTypeKey constant for HD DVD Recordable (HD DVD-R) media. + */ + +#define kIODVDMediaTypeHDR "HD DVD-R" + +/*! + * @defined kIODVDMediaTypeHDRW + * The kIODVDMediaTypeKey constant for HD DVD ReWritable (HD DVD-RW) media. + */ + +#define kIODVDMediaTypeHDRW "HD DVD-RW" + +/*! + * @defined kIODVDMediaTypeHDRAM + * The kIODVDMediaTypeKey constant for HD DVD-RAM media. + */ + +#define kIODVDMediaTypeHDRAM "HD DVD-RAM" + +#ifdef KERNEL +#ifdef __cplusplus + +/* + * Kernel + */ + +#include <IOKit/storage/IODVDBlockStorageDriver.h> +#include <IOKit/storage/IOMedia.h> + +/*! + * @class IODVDMedia + * @abstract + * The IODVDMedia class is a random-access disk device abstraction for DVDs. + * @discussion + * The IODVDMedia class is a random-access disk device abstraction for DVDs. + */ + +class IODVDMedia : public IOMedia +{ + OSDeclareDefaultStructors(IODVDMedia) + +protected: + + struct ExpansionData { /* */ }; + ExpansionData * _expansionData; + +public: + + /* + * Obtain this object's provider. We override the superclass's method to + * return a more specific subclass of IOService -- IODVDBlockStorageDriver. + * This method serves simply as a convenience to subclass developers. + */ + + virtual IODVDBlockStorageDriver * getProvider() const; + + /* + * Compare the properties in the supplied table to this object's properties. + */ + + virtual bool matchPropertyTable(OSDictionary * table, SInt32 * score); + + /* + * Issue an MMC REPORT KEY command. + * Obsoleted, replaced by this interface: + * virtual IOReturn reportKey( IOMemoryDescriptor * buffer, + * UInt8 keyClass, + * UInt32 address, + * UInt8 blockCount, + * UInt8 grantID, + * UInt8 format ); + */ + + virtual IOReturn reportKey( IOMemoryDescriptor * buffer, + const DVDKeyClass keyClass, + const UInt32 address, + const UInt8 grantID, + const DVDKeyFormat format ) __attribute__ ((deprecated)); + + /*! + * @function sendKey + * @discussion + * Issue an MMC SEND KEY command. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. Pass null for the kDVDKeyFormatAGID_Invalidate format + * case. + * @param keyClass + * As documented by MMC. + * @param grantID + * As documented by MMC. + * @param format + * As documented by MMC. + * @result + * Returns the status of the data transfer. + */ + + virtual IOReturn sendKey( IOMemoryDescriptor * buffer, + const DVDKeyClass keyClass, + const UInt8 grantID, + const DVDKeyFormat format ); + + /*! + * @function readStructure + * @discussion + * Issue an MMC READ DVD STRUCTURE command. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param format + * As documented by MMC. + * @param address + * As documented by MMC. + * @param layer + * As documented by MMC. + * @param grantID + * As documented by MMC. + * @result + * Returns the status of the data transfer. + */ + + virtual IOReturn readStructure( IOMemoryDescriptor * buffer, + const DVDStructureFormat format, + const UInt32 address, + const UInt8 layer, + const UInt8 grantID ); + + /*! + * @function getSpeed + * @discussion + * Get the current speed used for data transfers. + * @param kilobytesPerSecond + * Returns the current speed used for data transfers, in kB/s. + * + * kDVDSpeedMin specifies the minimum speed for all DVD media (1X). + * kDVDSpeedMax specifies the maximum speed supported in hardware. + * @result + * Returns the status of the operation. + */ + + virtual IOReturn getSpeed(UInt16 * kilobytesPerSecond); + + /*! + * @function setSpeed + * @discussion + * Set the speed to be used for data transfers. + * @param kilobytesPerSecond + * Speed to be used for data transfers, in kB/s. + * + * kDVDSpeedMin specifies the minimum speed for all DVD media (1X). + * kDVDSpeedMax specifies the maximum speed supported in hardware. + * @result + * Returns the status of the operation. + */ + + virtual IOReturn setSpeed(UInt16 kilobytesPerSecond); + + /*! + * @function readDiscInfo + * @discussion + * Issue an MMC READ DISC INFORMATION command. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param actualByteCount + * Returns the actual number of bytes transferred in the data transfer. + * @result + * Returns the status of the data transfer. + */ + + virtual IOReturn readDiscInfo( IOMemoryDescriptor * buffer, + UInt16 * actualByteCount ); + + /*! + * @function readRZoneInfo + * @discussion + * Issue an MMC READ RZONE INFORMATION (READ TRACK INFORMATION) command. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param address + * As documented by MMC. + * @param addressType + * As documented by MMC. + * @param actualByteCount + * Returns the actual number of bytes transferred in the data transfer. + * @result + * Returns the status of the data transfer. + */ + + virtual IOReturn readRZoneInfo( IOMemoryDescriptor * buffer, + UInt32 address, + DVDRZoneInfoAddressType addressType, + UInt16 * actualByteCount ); + + /*! + * @function reportKey + * @discussion + * Issue an MMC REPORT KEY command. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param keyClass + * As documented by MMC. + * @param address + * As documented by MMC. + * @param blockCount + * As documented by MMC. + * @param grantID + * As documented by MMC. + * @param format + * As documented by MMC. + * @result + * Returns the status of the data transfer. + */ + + virtual IOReturn reportKey( IOMemoryDescriptor * buffer, + UInt8 keyClass, + UInt32 address, + UInt8 blockCount, + UInt8 grantID, + UInt8 format ); + + OSMetaClassDeclareReservedUsed(IODVDMedia, 0); /* reportKey */ + OSMetaClassDeclareReservedUnused(IODVDMedia, 1); + OSMetaClassDeclareReservedUnused(IODVDMedia, 2); + OSMetaClassDeclareReservedUnused(IODVDMedia, 3); + OSMetaClassDeclareReservedUnused(IODVDMedia, 4); + OSMetaClassDeclareReservedUnused(IODVDMedia, 5); + OSMetaClassDeclareReservedUnused(IODVDMedia, 6); + OSMetaClassDeclareReservedUnused(IODVDMedia, 7); + OSMetaClassDeclareReservedUnused(IODVDMedia, 8); + OSMetaClassDeclareReservedUnused(IODVDMedia, 9); + OSMetaClassDeclareReservedUnused(IODVDMedia, 10); + OSMetaClassDeclareReservedUnused(IODVDMedia, 11); + OSMetaClassDeclareReservedUnused(IODVDMedia, 12); + OSMetaClassDeclareReservedUnused(IODVDMedia, 13); + OSMetaClassDeclareReservedUnused(IODVDMedia, 14); + OSMetaClassDeclareReservedUnused(IODVDMedia, 15); + OSMetaClassDeclareReservedUnused(IODVDMedia, 16); + OSMetaClassDeclareReservedUnused(IODVDMedia, 17); + OSMetaClassDeclareReservedUnused(IODVDMedia, 18); + OSMetaClassDeclareReservedUnused(IODVDMedia, 19); + OSMetaClassDeclareReservedUnused(IODVDMedia, 20); + OSMetaClassDeclareReservedUnused(IODVDMedia, 21); + OSMetaClassDeclareReservedUnused(IODVDMedia, 22); + OSMetaClassDeclareReservedUnused(IODVDMedia, 23); + OSMetaClassDeclareReservedUnused(IODVDMedia, 24); + OSMetaClassDeclareReservedUnused(IODVDMedia, 25); + OSMetaClassDeclareReservedUnused(IODVDMedia, 26); + OSMetaClassDeclareReservedUnused(IODVDMedia, 27); + OSMetaClassDeclareReservedUnused(IODVDMedia, 28); + OSMetaClassDeclareReservedUnused(IODVDMedia, 29); + OSMetaClassDeclareReservedUnused(IODVDMedia, 30); + OSMetaClassDeclareReservedUnused(IODVDMedia, 31); +}; + +#endif /* __cplusplus */ +#endif /* KERNEL */ +#endif /* !_IODVDMEDIA_H */ diff --git a/QualcommWireless/include/IOKit/storage/IODVDMediaBSDClient.h b/QualcommWireless/include/IOKit/storage/IODVDMediaBSDClient.h new file mode 100644 index 0000000..d0d7073 --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IODVDMediaBSDClient.h @@ -0,0 +1,198 @@ +/* + * Copyright (c) 1998-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IODVDMEDIABSDCLIENT_H +#define _IODVDMEDIABSDCLIENT_H + +#include <sys/ioctl.h> + +#include <IOKit/storage/IODVDTypes.h> + +/* + * Definitions + * + * ioctl description + * ---------------------------- ------------------------------------------------ + * DKIOCDVDREADSTRUCTURE see IODVDMedia::readStructure() in IODVDMedia.h + * + * DKIOCDVDREADDISCINFO see IODVDMedia::readDiscInfo() in IODVDMedia.h + * DKIOCDVDREADRZONEINFO see IODVDMedia::readRZoneInfo() in IODVDMedia.h + * + * DKIOCDVDREPORTKEY see IODVDMedia::reportKey() in IODVDMedia.h + * DKIOCDVDSENDKEY see IODVDMedia::sendKey() in IODVDMedia.h + * + * DKIOCDVDGETSPEED see IODVDMedia::getSpeed() in IODVDMedia.h + * DKIOCDVDSETSPEED see IODVDMedia::setSpeed() in IODVDMedia.h + * + * in /System/Library/Frameworks/Kernel.framework/Headers/IOKit/storage/ + */ + +typedef struct +{ + uint8_t format; + + uint8_t reserved0008[3]; /* reserved, clear to zero */ + + uint32_t address; + uint8_t grantID; + uint8_t layer; + +#ifdef __LP64__ + uint8_t reserved0080[4]; /* reserved, clear to zero */ +#endif /* __LP64__ */ + + uint16_t bufferLength; + void * buffer; +} dk_dvd_read_structure_t; + +typedef struct +{ + uint8_t format; + uint8_t keyClass; + uint8_t blockCount; + + uint8_t reserved0024[1]; /* reserved, clear to zero */ + + uint32_t address; + uint8_t grantID; + +#ifdef __LP64__ + uint8_t reserved0072[5]; /* reserved, clear to zero */ +#else /* !__LP64__ */ + uint8_t reserved0072[1]; /* reserved, clear to zero */ +#endif /* !__LP64__ */ + + uint16_t bufferLength; + void * buffer; +} dk_dvd_report_key_t; + +typedef struct +{ + uint8_t format; + uint8_t keyClass; + + uint8_t reserved0016[6]; /* reserved, clear to zero */ + + uint8_t grantID; + +#ifdef __LP64__ + uint8_t reserved0072[5]; /* reserved, clear to zero */ +#else /* !__LP64__ */ + uint8_t reserved0072[1]; /* reserved, clear to zero */ +#endif /* !__LP64__ */ + + uint16_t bufferLength; + void * buffer; +} dk_dvd_send_key_t; + +typedef struct +{ +#ifdef __LP64__ + uint8_t reserved0000[14]; /* reserved, clear to zero */ +#else /* !__LP64__ */ + uint8_t reserved0000[10]; /* reserved, clear to zero */ +#endif /* !__LP64__ */ + + uint16_t bufferLength; /* actual length on return */ + void * buffer; +} dk_dvd_read_disc_info_t; + +typedef struct +{ + uint8_t reserved0000[4]; /* reserved, clear to zero */ + + uint32_t address; + uint8_t addressType; + +#ifdef __LP64__ + uint8_t reserved0072[5]; /* reserved, clear to zero */ +#else /* !__LP64__ */ + uint8_t reserved0072[1]; /* reserved, clear to zero */ +#endif /* !__LP64__ */ + + uint16_t bufferLength; /* actual length on return */ + void * buffer; +} dk_dvd_read_rzone_info_t; + +#define DKIOCDVDREADSTRUCTURE _IOW('d', 128, dk_dvd_read_structure_t) +#define DKIOCDVDREPORTKEY _IOW('d', 129, dk_dvd_report_key_t) +#define DKIOCDVDSENDKEY _IOW('d', 130, dk_dvd_send_key_t) + +#define DKIOCDVDGETSPEED _IOR('d', 131, uint16_t) +#define DKIOCDVDSETSPEED _IOW('d', 131, uint16_t) + +#define DKIOCDVDREADDISCINFO _IOWR('d', 132, dk_dvd_read_disc_info_t) +#define DKIOCDVDREADRZONEINFO _IOWR('d', 133, dk_dvd_read_rzone_info_t) + +#ifdef KERNEL +#ifdef __cplusplus + +/* + * Kernel + */ + +#include <IOKit/storage/IODVDMedia.h> +#include <IOKit/storage/IOMediaBSDClient.h> + +/* + * Class + */ + +class IODVDMediaBSDClient : public IOMediaBSDClient +{ + OSDeclareDefaultStructors(IODVDMediaBSDClient) + +protected: + + struct ExpansionData { /* */ }; + ExpansionData * _expansionData; + +public: + + /* + * Obtain this object's provider. We override the superclass's method + * to return a more specific subclass of IOService -- IODVDMedia. This + * method serves simply as a convenience to subclass developers. + */ + + virtual IODVDMedia * getProvider() const; + + /* + * Process a DVD-specific ioctl. + */ + + virtual int ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, proc_t proc); + + OSMetaClassDeclareReservedUnused(IODVDMediaBSDClient, 0); + OSMetaClassDeclareReservedUnused(IODVDMediaBSDClient, 1); + OSMetaClassDeclareReservedUnused(IODVDMediaBSDClient, 2); + OSMetaClassDeclareReservedUnused(IODVDMediaBSDClient, 3); + OSMetaClassDeclareReservedUnused(IODVDMediaBSDClient, 4); + OSMetaClassDeclareReservedUnused(IODVDMediaBSDClient, 5); + OSMetaClassDeclareReservedUnused(IODVDMediaBSDClient, 6); + OSMetaClassDeclareReservedUnused(IODVDMediaBSDClient, 7); +}; + +#endif /* __cplusplus */ +#endif /* KERNEL */ +#endif /* !_IODVDMEDIABSDCLIENT_H */ diff --git a/QualcommWireless/include/IOKit/storage/IODVDTypes.h b/QualcommWireless/include/IOKit/storage/IODVDTypes.h new file mode 100644 index 0000000..d4398a3 --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IODVDTypes.h @@ -0,0 +1,437 @@ +/* + * Copyright (c) 1998-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IODVDTYPES_H +#define _IODVDTYPES_H + +#include <IOKit/IOTypes.h> + +#pragma pack(push, 1) /* (enable 8-bit struct packing) */ + +/* + * Media Types + */ + +enum +{ + kDVDMediaTypeUnknown = 0x0200, + kDVDMediaTypeROM = 0x0202, /* DVD-ROM */ + kDVDMediaTypeRAM = 0x0203, /* DVD-RAM */ + kDVDMediaTypeR = 0x0204, /* DVD-R */ + kDVDMediaTypeRW = 0x0205, /* DVD-RW */ + kDVDMediaTypePlusRW = 0x0206, /* DVD+RW */ + kDVDMediaTypePlusR = 0x0207, /* DVD+R */ + kDVDMediaTypeHDROM = 0x0212, /* HD DVD-ROM */ + kDVDMediaTypeHDRAM = 0x0213, /* HD DVD-RAM */ + kDVDMediaTypeHDR = 0x0214, /* HD DVD-R */ + kDVDMediaTypeHDRW = 0x0215, /* HD DVD-RW */ + + kDVDMediaTypeMin = 0x0200, + kDVDMediaTypeMax = 0x02FF +}; + +typedef UInt32 DVDMediaType; + +/* + * Media Speed (kB/s) + */ + +#define kDVDSpeedMin 0x0546 +#define kDVDSpeedMax 0xFFFF + +/* + * MMC Formats + */ + +typedef UInt8 DVDCPRMRegionCode; +enum +{ + kDVDCPRMRegion1 = 0xFE, + kDVDCPRMRegion2 = 0xFD, + kDVDCPRMRegion3 = 0xFB, + kDVDCPRMRegion4 = 0xF7, + kDVDCPRMRegion5 = 0xEF, + kDVDCPRMRegion6 = 0xDF +}; + +typedef UInt8 DVDRegionalPlaybackControlScheme; +enum +{ + kDVDRegionalPlaybackControlSchemePhase1 = 0x00, + kDVDRegionalPlaybackControlSchemePhase2 = 0x01 +}; + +typedef UInt8 DVDBookType; +enum +{ + kDVDBookTypeROM = 0x0, + kDVDBookTypeRAM = 0x1, + kDVDBookTypeR = 0x2, + kDVDBookTypeRW = 0x3, + kDVDBookTypeHDROM = 0x4, + kDVDBookTypeHDRAM = 0x5, + kDVDBookTypeHDR = 0x6, + kDVDBookTypeHDRW = 0x7, + kDVDBookTypePlusRW = 0x9, + kDVDBookTypePlusR = 0xA, + kDVDBookTypePlusRWDoubleLayer = 0xD, + kDVDBookTypePlusRDoubleLayer = 0xE +}; + +typedef UInt8 DVDKeyClass; +enum +{ + kDVDKeyClassCSS_CPPM_CPRM = 0x00, + kDVDKeyClassRSSA = 0x01 +}; + +typedef UInt8 DVDKeyFormat; +enum +{ + kDVDKeyFormatAGID_CSS = 0x00, + kDVDKeyFormatChallengeKey = 0x01, + kDVDKeyFormatKey1 = 0x02, + kDVDKeyFormatKey2 = 0x03, + kDVDKeyFormatTitleKey = 0x04, + kDVDKeyFormatASF = 0x05, + kDVDKeyFormatSetRegion = 0x06, + kDVDKeyFormatRegionState = 0x08, + kDVDKeyFormatAGID_CSS2 = 0x10, + kDVDKeyFormatAGID_CPRM = 0x11, + kDVDKeyFormatAGID_Invalidate = 0x3F +}; + +typedef UInt8 DVDStructureFormat; +enum +{ + kDVDStructureFormatPhysicalFormatInfo = 0x00, + kDVDStructureFormatCopyrightInfo = 0x01, + kDVDStructureFormatDiscKeyInfo = 0x02, + // skip BCA + kDVDStructureFormatManufacturingInfo = 0x04 +}; + +// Read DVD Structures Format 0x00 +struct DVDPhysicalFormatInfo +{ + UInt8 dataLength[2]; + UInt8 reserved[2]; +#ifdef __LITTLE_ENDIAN__ + // Byte 0 + UInt8 partVersion:4; + UInt8 bookType:4; + + // Byte 1 + UInt8 minimumRate:4; + UInt8 discSize:4; + + // Byte 2 + UInt8 layerType:4; + UInt8 trackPath:1; + UInt8 numberOfLayers:2; + UInt8 reserved2:1; + + // Byte 3 + UInt8 trackDensity:4; + UInt8 linearDensity:4; +#else /* !__LITTLE_ENDIAN__ */ + // Byte 0 + UInt8 bookType:4; + UInt8 partVersion:4; + + // Byte 1 + UInt8 discSize:4; + UInt8 minimumRate:4; + + // Byte 2 + UInt8 reserved2:1; + UInt8 numberOfLayers:2; + UInt8 trackPath:1; + UInt8 layerType:4; + + // Byte 3 + UInt8 linearDensity:4; + UInt8 trackDensity:4; +#endif /* !__LITTLE_ENDIAN__ */ + + // Bytes 4-15 + UInt8 zero1; // always 0x00 + UInt8 startingPhysicalSectorNumberOfDataArea[3]; + UInt8 zero2; // always 0x00 + UInt8 endPhysicalSectorNumberOfDataArea[3]; + UInt8 zero3; // always 0x00 + UInt8 endSectorNumberInLayerZero[3]; + + // Byte 16 +#ifdef __LITTLE_ENDIAN__ + UInt8 reserved1:7; + UInt8 bcaFlag:1; +#else /* !__LITTLE_ENDIAN__ */ + UInt8 bcaFlag:1; + UInt8 reserved1:7; +#endif /* !__LITTLE_ENDIAN__ */ + + // Bytes 17-2047 + UInt8 mediaSpecific[2031]; +}; +typedef struct DVDPhysicalFormatInfo DVDPhysicalFormatInfo; + +// Read DVD Structures Format 0x01 +struct DVDCopyrightInfo +{ + UInt8 dataLength[2]; + UInt8 reserved[2]; + UInt8 copyrightProtectionSystemType; + DVDCPRMRegionCode regionMask; + UInt8 reserved2[2]; +}; +typedef struct DVDCopyrightInfo DVDCopyrightInfo; + +// Read DVD Structures Format 0x02 +struct DVDDiscKeyInfo +{ + UInt8 dataLength[2]; + UInt8 reserved[2]; + UInt8 discKeyStructures[2048]; +}; +typedef struct DVDDiscKeyInfo DVDDiscKeyInfo; + +// Read DVD Structures Format 0x04 +struct DVDManufacturingInfo +{ + UInt8 dataLength[2]; + UInt8 reserved[2]; + UInt8 discManufacturingInfo[2048]; +}; +typedef struct DVDManufacturingInfo DVDManufacturingInfo; + +// ReportKey Format 0x00 +struct DVDAuthenticationGrantIDInfo +{ + UInt8 dataLength[2]; + UInt8 reserved[2]; + UInt8 reserved2[3]; +#ifdef __LITTLE_ENDIAN__ + UInt8 reservedBits:6; + UInt8 grantID:2; +#else /* !__LITTLE_ENDIAN__ */ + UInt8 grantID:2; + UInt8 reservedBits:6; +#endif /* !__LITTLE_ENDIAN__ */ +}; +typedef struct DVDAuthenticationGrantIDInfo DVDAuthenticationGrantIDInfo; + +// ReportKey and SendKey Format 0x01 +struct DVDChallengeKeyInfo +{ + UInt8 dataLength[2]; + UInt8 reserved[2]; + UInt8 challengeKeyValue[10]; + UInt8 reserved2[2]; +}; +typedef struct DVDChallengeKeyInfo DVDChallengeKeyInfo; + +// ReportKey Format 0x02 +struct DVDKey1Info +{ + UInt8 dataLength[2]; + UInt8 reserved[2]; + UInt8 key1Value[5]; + UInt8 reserved2[3]; +}; +typedef struct DVDKey1Info DVDKey1Info; + +// SendKey Format 0x03 +struct DVDKey2Info +{ + UInt8 dataLength[2]; + UInt8 reserved[2]; + UInt8 key2Value[5]; + UInt8 reserved2[3]; +}; +typedef struct DVDKey2Info DVDKey2Info; + +// ReportKey Format 0x04 +struct DVDTitleKeyInfo +{ + UInt8 dataLength[2]; + UInt8 reserved[2]; +#ifdef __LITTLE_ENDIAN__ + UInt8 CP_MOD:4; + UInt8 CGMS:2; + UInt8 CP_SEC:1; + UInt8 CPM:1; +#else /* !__LITTLE_ENDIAN__ */ + UInt8 CPM:1; + UInt8 CP_SEC:1; + UInt8 CGMS:2; + UInt8 CP_MOD:4; +#endif /* !__LITTLE_ENDIAN__ */ + UInt8 titleKeyValue[5]; + UInt8 reserved2[2]; +}; +typedef struct DVDTitleKeyInfo DVDTitleKeyInfo; + +// ReportKey Format 0x05 +struct DVDAuthenticationSuccessFlagInfo +{ + UInt8 dataLength[2]; + UInt8 reserved[2]; + UInt8 reserved2[3]; +#ifdef __LITTLE_ENDIAN__ + UInt8 successFlag:1; + UInt8 reservedBits:7; +#else /* !__LITTLE_ENDIAN__ */ + UInt8 reservedBits:7; + UInt8 successFlag:1; +#endif /* !__LITTLE_ENDIAN__ */ +}; +typedef struct DVDAuthenticationSuccessFlagInfo DVDAuthenticationSuccessFlagInfo; + +// ReportKey Format 0x08 +struct DVDRegionPlaybackControlInfo +{ + UInt8 dataLength[2]; + UInt8 reserved[2]; +#ifdef __LITTLE_ENDIAN__ + UInt8 numberUserResets:3; + UInt8 numberVendorResets:3; + UInt8 typeCode:2; +#else /* !__LITTLE_ENDIAN__ */ + UInt8 typeCode:2; + UInt8 numberVendorResets:3; + UInt8 numberUserResets:3; +#endif /* !__LITTLE_ENDIAN__ */ + DVDCPRMRegionCode driveRegion; + DVDRegionalPlaybackControlScheme rpcScheme; + UInt8 reserved2; +}; +typedef struct DVDRegionPlaybackControlInfo DVDRegionPlaybackControlInfo; + +// Read Disc Information Format +struct DVDDiscInfo +{ + UInt16 dataLength; +#ifdef __LITTLE_ENDIAN__ + UInt8 discStatus:2; + UInt8 stateOfLastBorder:2; + UInt8 erasable:1; + UInt8 reserved:3; +#else /* !__LITTLE_ENDIAN__ */ + UInt8 reserved:3; + UInt8 erasable:1; + UInt8 stateOfLastBorder:2; + UInt8 discStatus:2; +#endif /* !__LITTLE_ENDIAN__ */ + UInt8 reserved2; + UInt8 numberOfBordersLSB; + UInt8 firstRZoneNumberInLastBorderLSB; + UInt8 lastRZoneNumberInLastBorderLSB; +#ifdef __LITTLE_ENDIAN__ + UInt8 reserved3:5; + UInt8 unrestrictedUse:1; + UInt8 discBarCodeValid:1; + UInt8 reserved4:1; +#else /* !__LITTLE_ENDIAN__ */ + UInt8 reserved4:1; + UInt8 discBarCodeValid:1; + UInt8 unrestrictedUse:1; + UInt8 reserved3:5; +#endif /* !__LITTLE_ENDIAN__ */ + UInt8 reserved5; + UInt8 numberOfBordersMSB; + UInt8 firstRZoneNumberInLastBorderMSB; + UInt8 lastRZoneNumberInLastBorderMSB; + UInt8 reserved6[4]; + UInt8 reserved7[4]; + UInt8 reserved8[4]; + UInt8 discBarCode[8]; + UInt8 reserved9; + UInt8 numberOfOPCTableEntries; + UInt8 opcTableEntries[0]; +}; +typedef struct DVDDiscInfo DVDDiscInfo; + +// Read RZone Information Address Types +typedef UInt8 DVDRZoneInfoAddressType; +enum +{ + kDVDRZoneInfoAddressTypeLBA = 0x00, + kDVDRZoneInfoAddressTypeRZoneNumber = 0x01, + kDVDRZoneInfoAddressTypeBorderNumber = 0x02, +}; + +// Read RZone Information Format +struct DVDRZoneInfo +{ + UInt16 dataLength; + UInt8 rzoneNumberLSB; + UInt8 borderNumberLSB; + UInt8 reserved; +#ifdef __LITTLE_ENDIAN__ + UInt8 reserved2:4; + UInt8 copy:1; + UInt8 damage:1; + UInt8 reserved3:2; + + UInt8 reserved4:4; + UInt8 restrictedOverwrite:1; + UInt8 incremental:1; + UInt8 blank:1; + UInt8 reservedRZone:1; + + UInt8 nextWritableAddressValid:1; + UInt8 lastRecordedAddressValid:1; + UInt8 reserved5:6; +#else /* !__LITTLE_ENDIAN__ */ + UInt8 reserved3:2; + UInt8 damage:1; + UInt8 copy:1; + UInt8 reserved2:4; + + UInt8 reservedRZone:1; + UInt8 blank:1; + UInt8 incremental:1; + UInt8 restrictedOverwrite:1; + UInt8 reserved4:4; + + UInt8 reserved5:6; + UInt8 lastRecordedAddressValid:1; + UInt8 nextWritableAddressValid:1; +#endif /* !__LITTLE_ENDIAN__ */ + UInt32 rzoneStartAddress; + UInt32 nextWritableAddress; + UInt32 freeBlocks; + UInt32 blockingFactor; + UInt32 rzoneSize; + UInt32 lastRecordedAddress; + UInt8 rzoneNumberMSB; + UInt8 borderNumberMSB; + UInt8 reserved6; + UInt8 reserved7; +}; +typedef struct DVDRZoneInfo DVDRZoneInfo; + +#pragma pack(pop) /* (reset to default struct packing) */ + +#endif /* _IODVDTYPES_H */ diff --git a/QualcommWireless/include/IOKit/storage/IOFDiskPartitionScheme.h b/QualcommWireless/include/IOKit/storage/IOFDiskPartitionScheme.h new file mode 100644 index 0000000..0036e37 --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOFDiskPartitionScheme.h @@ -0,0 +1,245 @@ +/* + * Copyright (c) 1998-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/* + * This header contains the IOFDiskPartitionScheme class definition. + */ + +#ifndef _IOFDISKPARTITIONSCHEME_H +#define _IOFDISKPARTITIONSCHEME_H + +#include <IOKit/IOTypes.h> + +/* + * kIOFDiskPartitionSchemeClass is the name of the IOFDiskPartitionScheme class. + */ + +#define kIOFDiskPartitionSchemeClass "IOFDiskPartitionScheme" + +/* + * FDisk Partition Map Definitions + */ + +#pragma pack(push, 1) /* (enable 8-bit struct packing) */ + +/* Structure constants. */ + +#define DISK_BLK0SZ sizeof(struct disk_blk0) /* (size of partition map) */ +#define DISK_BOOTSZ 446 /* (size of boot code in map) */ +#define DISK_NPART 4 /* (number of entries in map) */ + +/* Partition map entry. */ + +struct fdisk_part +{ + UInt8 bootid; /* (is active boot partition?) */ + UInt8 beghead; /* (beginning head) */ + UInt8 begsect; /* (beginning sector; beginning cylinder, high 2 bits) */ + UInt8 begcyl; /* (beginning cylinder, low 8 bits) */ + UInt8 systid; /* (type) */ + UInt8 endhead; /* (ending head) */ + UInt8 endsect; /* (ending sector; ending cylinder, high 2 bits) */ + UInt8 endcyl; /* (ending cylinder, low 8 bits) */ + UInt32 relsect; /* (block start) */ + UInt32 numsect; /* (block count) */ +}; + +/* Partition map, as found in block zero of the disk (or extended partition). */ + +struct disk_blk0 +{ + UInt8 bootcode[DISK_BOOTSZ]; /* (boot code) */ + struct fdisk_part parts[DISK_NPART]; /* (partition entries) */ + UInt16 signature; /* (unique signature for map) */ +}; + +/* Partition map signature (signature). */ + +#define DISK_SIGNATURE 0xAA55 + +/* Partition map entry types (systid). */ + +#define FDISK_PARTITION_TYPE_01 "DOS_FAT_12" +#define FDISK_PARTITION_TYPE_04 "DOS_FAT_16_S" +#define FDISK_PARTITION_TYPE_06 "DOS_FAT_16" +#define FDISK_PARTITION_TYPE_07 "Windows_NTFS" +#define FDISK_PARTITION_TYPE_0B "DOS_FAT_32" +#define FDISK_PARTITION_TYPE_0C "Windows_FAT_32" +#define FDISK_PARTITION_TYPE_0E "Windows_FAT_16" +#define FDISK_PARTITION_TYPE_42 "Windows_LDM" +#define FDISK_PARTITION_TYPE_82 "Linux_Swap" +#define FDISK_PARTITION_TYPE_83 "Linux" +#define FDISK_PARTITION_TYPE_8E "Linux_LVM" +#define FDISK_PARTITION_TYPE_A5 "FreeBSD" +#define FDISK_PARTITION_TYPE_A6 "OpenBSD" +#define FDISK_PARTITION_TYPE_A7 "Apple_Rhapsody_UFS" +#define FDISK_PARTITION_TYPE_A8 "Apple_UFS" +#define FDISK_PARTITION_TYPE_A9 "NetBSD" +#define FDISK_PARTITION_TYPE_AB "Apple_Boot" +#define FDISK_PARTITION_TYPE_AE "Apple_Encrypted" +#define FDISK_PARTITION_TYPE_AF "Apple_HFS" +#define FDISK_PARTITION_TYPE_FD "Linux_RAID" + +#pragma pack(pop) /* (reset to default struct packing) */ + +#ifdef KERNEL +#ifdef __cplusplus + +/* + * Kernel + */ + +#include <IOKit/storage/IOPartitionScheme.h> + +/* + * Class + */ + +class IOFDiskPartitionScheme : public IOPartitionScheme +{ + OSDeclareDefaultStructors(IOFDiskPartitionScheme); + +protected: + + struct ExpansionData { /* */ }; + ExpansionData * _expansionData; + + OSSet * _partitions; /* (set of media objects representing partitions) */ + + /* + * Free all of this object's outstanding resources. + */ + + virtual void free(void) APPLE_KEXT_OVERRIDE; + + /* + * Scan the provider media for an FDisk partition map. Returns the set + * of media objects representing each of the partitions (the retain for + * the set is passed to the caller), or null should no partition map be + * found. The default probe score can be adjusted up or down, based on + * the confidence of the scan. + */ + + virtual OSSet * scan(SInt32 * score); + + /* + * Ask whether the given partition is extended. + */ + + virtual bool isPartitionExtended(fdisk_part * partition); + + /* + * Ask whether the given partition is used. + */ + + virtual bool isPartitionUsed(fdisk_part * partition); + + /* + * Ask whether the given partition appears to be corrupt. A partition that + * is corrupt will cause the failure of the FDisk partition map recognition + * altogether. + */ + + virtual bool isPartitionCorrupt( fdisk_part * partition, + UInt32 partitionID, + UInt32 fdiskBlock ); + + /* + * Ask whether the given partition appears to be invalid. A partition that + * is invalid will cause it to be skipped in the scan, but will not cause a + * failure of the FDisk partition map recognition. + */ + + virtual bool isPartitionInvalid( fdisk_part * partition, + UInt32 partitionID, + UInt32 fdiskBlock ); + + /* + * Instantiate a new media object to represent the given partition. + */ + + virtual IOMedia * instantiateMediaObject( fdisk_part * partition, + UInt32 partitionID, + UInt32 fdiskBlock ); + + /* + * Allocate a new media object (called from instantiateMediaObject). + */ + + virtual IOMedia * instantiateDesiredMediaObject( fdisk_part * partition, + UInt32 partitionID, + UInt32 fdiskBlock ); + +public: + + /* + * Initialize this object's minimal state. + */ + + virtual bool init(OSDictionary * properties = 0) APPLE_KEXT_OVERRIDE; + + /* + * Determine whether the provider media contains an FDisk partition map. + */ + + virtual IOService * probe(IOService * provider, SInt32 * score) APPLE_KEXT_OVERRIDE; + + /* + * Publish the new media objects which represent our partitions. + */ + + virtual bool start(IOService * provider) APPLE_KEXT_OVERRIDE; + + /* + * Clean up after the media objects we published before terminating. + */ + + virtual void stop(IOService * provider) APPLE_KEXT_OVERRIDE; + + /* + * Request that the provider media be re-scanned for partitions. + */ + + virtual IOReturn requestProbe(IOOptionBits options) APPLE_KEXT_OVERRIDE; + + OSMetaClassDeclareReservedUnused(IOFDiskPartitionScheme, 0); + OSMetaClassDeclareReservedUnused(IOFDiskPartitionScheme, 1); + OSMetaClassDeclareReservedUnused(IOFDiskPartitionScheme, 2); + OSMetaClassDeclareReservedUnused(IOFDiskPartitionScheme, 3); + OSMetaClassDeclareReservedUnused(IOFDiskPartitionScheme, 4); + OSMetaClassDeclareReservedUnused(IOFDiskPartitionScheme, 5); + OSMetaClassDeclareReservedUnused(IOFDiskPartitionScheme, 6); + OSMetaClassDeclareReservedUnused(IOFDiskPartitionScheme, 7); + OSMetaClassDeclareReservedUnused(IOFDiskPartitionScheme, 8); + OSMetaClassDeclareReservedUnused(IOFDiskPartitionScheme, 9); + OSMetaClassDeclareReservedUnused(IOFDiskPartitionScheme, 10); + OSMetaClassDeclareReservedUnused(IOFDiskPartitionScheme, 11); + OSMetaClassDeclareReservedUnused(IOFDiskPartitionScheme, 12); + OSMetaClassDeclareReservedUnused(IOFDiskPartitionScheme, 13); + OSMetaClassDeclareReservedUnused(IOFDiskPartitionScheme, 14); + OSMetaClassDeclareReservedUnused(IOFDiskPartitionScheme, 15); +}; + +#endif /* __cplusplus */ +#endif /* KERNEL */ +#endif /* !_IOFDISKPARTITIONSCHEME_H */ diff --git a/QualcommWireless/include/IOKit/storage/IOFilterScheme.h b/QualcommWireless/include/IOKit/storage/IOFilterScheme.h new file mode 100644 index 0000000..dcb6cf4 --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOFilterScheme.h @@ -0,0 +1,396 @@ +/* + * Copyright (c) 1998-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/*! + * @header IOFilterScheme + * @abstract + * This header contains the IOFilterScheme class definition. + */ + +#ifndef _IOFILTERSCHEME_H +#define _IOFILTERSCHEME_H + +/*! + * @defined kIOFilterSchemeClass + * @abstract + * The name of the IOFilterScheme class. + * @discussion + * kIOFilterSchemeClass is the name of the IOFilterScheme class. + */ + +#define kIOFilterSchemeClass "IOFilterScheme" + +#ifdef KERNEL +#ifdef __cplusplus + +/* + * Kernel + */ + +#include <IOKit/storage/IOMedia.h> +#include <IOKit/storage/IOStorage.h> + +/*! + * @class IOFilterScheme + * @abstract + * The common base class for all filter scheme + * objects. + * @discussion + * The IOFilterScheme class is the common base class for all filter scheme + * objects. It extends the IOStorage class by implementing the appropriate + * open and close semantics for filter objects (standard semantics are act + * as a relay for incoming opens, producing one outgoing open for each + * incoming open). It also implements the default read and write semantics, + * which pass all reads and writes through to the provider media unprocessed. + * For simple schemes, the default behavior is sufficient. More complex + * filter schemes such as RAID will want to do extra processing for reads + * and writes. + */ + +class IOFilterScheme : public IOStorage +{ + OSDeclareDefaultStructors(IOFilterScheme); + +protected: + + struct ExpansionData { /* */ }; + ExpansionData * _expansionData; + + /*! + * @function handleOpen + * @discussion + * The handleOpen method grants or denies permission to access this object + * to an interested client. The argument is an IOStorageAccess value that + * specifies the level of access desired -- reader or reader-writer. + * + * This method can be invoked to upgrade or downgrade the access level for + * an existing client as well. The previous access level will prevail for + * upgrades that fail, of course. A downgrade should never fail. If the + * new access level should be the same as the old for a given client, this + * method will do nothing and return success. In all cases, one, singular + * close-per-client is expected for all opens-per-client received. + * + * This implementation replaces the IOService definition of handleOpen(). + * @param client + * Client requesting the open. + * @param options + * Options for the open. Set to zero. + * @param access + * Access level for the open. Set to kIOStorageAccessReader or + * kIOStorageAccessReaderWriter. + * @result + * Returns true if the open was successful, false otherwise. + */ + + virtual bool handleOpen(IOService * client, + IOOptionBits options, + void * access) APPLE_KEXT_OVERRIDE; + + /*! + * @function handleIsOpen + * @discussion + * The handleIsOpen method determines whether the specified client, or any + * client if none is specified, presently has an open on this object. + * + * This implementation replaces the IOService definition of handleIsOpen(). + * @param client + * Client to check the open state of. Set to zero to check the open state + * of all clients. + * @result + * Returns true if the client was (or clients were) open, false otherwise. + */ + + virtual bool handleIsOpen(const IOService * client) const APPLE_KEXT_OVERRIDE; + + /*! + * @function handleClose + * @discussion + * The handleClose method closes the client's access to this object. + * + * This implementation replaces the IOService definition of handleClose(). + * @param client + * Client requesting the close. + * @param options + * Options for the close. Set to zero. + */ + + virtual void handleClose(IOService * client, IOOptionBits options) APPLE_KEXT_OVERRIDE; + +public: + + using IOStorage::read; + using IOStorage::write; + + /*! + * @function read + * @discussion + * Read data from the storage object at the specified byte offset into the + * specified buffer, asynchronously. When the read completes, the caller + * will be notified via the specified completion action. + * + * The buffer will be retained for the duration of the read. + * + * For simple filter schemes, the default behavior is to simply pass the + * read through to the provider media. More complex filter schemes such + * as RAID will need to do extra processing here. + * @param client + * Client requesting the read. + * @param byteStart + * Starting byte offset for the data transfer. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param attributes + * Attributes of the data transfer. See IOStorageAttributes. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + * @param completion + * Completion routine to call once the data transfer is complete. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + */ + + virtual void read(IOService * client, + UInt64 byteStart, + IOMemoryDescriptor * buffer, + IOStorageAttributes * attributes, + IOStorageCompletion * completion) APPLE_KEXT_OVERRIDE; + + /*! + * @function write + * @discussion + * Write data into the storage object at the specified byte offset from the + * specified buffer, asynchronously. When the write completes, the caller + * will be notified via the specified completion action. + * + * The buffer will be retained for the duration of the write. + * + * For simple filter schemes, the default behavior is to simply pass the + * write through to the provider media. More complex filter schemes such + * as RAID will need to do extra processing here. + * @param client + * Client requesting the write. + * @param byteStart + * Starting byte offset for the data transfer. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param attributes + * Attributes of the data transfer. See IOStorageAttributes. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + * @param completion + * Completion routine to call once the data transfer is complete. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + */ + + virtual void write(IOService * client, + UInt64 byteStart, + IOMemoryDescriptor * buffer, + IOStorageAttributes * attributes, + IOStorageCompletion * completion) APPLE_KEXT_OVERRIDE; + + /*! + * @function synchronize + * @discussion + * Flush the cached data in the storage object, if any. + * @param client + * Client requesting the synchronization. + * @param byteStart + * Starting byte offset for the synchronization. + * @param byteCount + * Size of the synchronization. Set to zero to specify the end-of-media. + * @param options + * Options for the synchronization. See IOStorageSynchronizeOptions. + * @result + * Returns the status of the synchronization. + */ + + virtual IOReturn synchronize(IOService * client, + UInt64 byteStart, + UInt64 byteCount, + IOStorageSynchronizeOptions options = 0) APPLE_KEXT_OVERRIDE; + + /*! + * @function unmap + * @discussion + * Delete unused data from the storage object at the specified byte offsets. + * @param client + * Client requesting the operation. + * @param extents + * List of extents. See IOStorageExtent. It is legal for the callee to + * overwrite the contents of this buffer in order to satisfy the request. + * @param extentsCount + * Number of extents. + * @param options + * Options for the unmap. See IOStorageUnmapOptions. + * @result + * Returns the status of the operation. + */ + + virtual IOReturn unmap(IOService * client, + IOStorageExtent * extents, + UInt32 extentsCount, + IOStorageUnmapOptions options = 0) APPLE_KEXT_OVERRIDE; + + /*! + * @function getProvisionStatus + * @discussion + * Get device block provision status + * @param client + * Client requesting the synchronization. + * @param byteStart + * Byte offset of logical extent on the device. + * @param byteCount + * Byte length of logical extent on the device, 0 mean the entire remaining space. + * @param extentsCount + * Number of extents allocated in extents. On return, this parameter indicate number + * of provision extents returned. + * @param extents + * List of provision extents. See IOStorageProvisionExtents. + * @result + * Returns the status of the getProvisionStatus. + */ + + virtual IOReturn getProvisionStatus(IOService * client, + UInt64 byteStart, + UInt64 byteCount, + UInt32 * extentsCount, + IOStorageProvisionExtent * extents, + IOStorageGetProvisionStatusOptions options = 0) APPLE_KEXT_OVERRIDE; + + /*! + * @function lockPhysicalExtents + * @discussion + * Lock the contents of the storage object against relocation temporarily, + * for the purpose of getting physical extents. + * @param client + * Client requesting the operation. + * @result + * Returns true if the lock was successful, false otherwise. + */ + + virtual bool lockPhysicalExtents(IOService * client) APPLE_KEXT_OVERRIDE; + + /*! + * @function copyPhysicalExtent + * @discussion + * Convert the specified byte offset into a physical byte offset, relative + * to a physical storage object. This call should only be made within the + * context of lockPhysicalExtents(). + * @param client + * Client requesting the operation. + * @param byteStart + * Starting byte offset for the operation. Returns a physical byte offset, + * relative to the physical storage object, on success. + * @param byteCount + * Size of the operation. Returns the actual number of bytes which can be + * transferred, relative to the physical storage object, on success. + * @result + * A reference to the physical storage object, which should be released by + * the caller, or a null on error. + */ + + virtual IOStorage * copyPhysicalExtent(IOService * client, + UInt64 * byteStart, + UInt64 * byteCount) APPLE_KEXT_OVERRIDE; + + /*! + * @function unlockPhysicalExtents + * @discussion + * Unlock the contents of the storage object for relocation again. This + * call must balance a successful call to lockPhysicalExtents(). + * @param client + * Client requesting the operation. + */ + + virtual void unlockPhysicalExtents(IOService * client) APPLE_KEXT_OVERRIDE; + + /*! + * @function setPriority + * @discussion + * Reprioritize read or write requests at the specified byte offsets. + * @param client + * Client requesting the operation. + * @param extents + * List of extents. See IOStorageExtent. It is legal for the callee to + * overwrite the contents of this buffer in order to satisfy the request. + * @param extentsCount + * Number of extents. + * @param priority + * New priority. See IOStoragePriority. + * @result + * Returns the status of the operation. + */ + + virtual IOReturn setPriority(IOService * client, + IOStorageExtent * extents, + UInt32 extentsCount, + IOStoragePriority priority) APPLE_KEXT_OVERRIDE; + + /* + * Obtain this object's provider. We override the superclass's method + * to return a more specific subclass of OSObject -- an IOMedia. This + * method serves simply as a convenience to subclass developers. + */ + + virtual IOMedia * getProvider() const APPLE_KEXT_OVERRIDE; + + OSMetaClassDeclareReservedUnused(IOFilterScheme, 0); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 1); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 2); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 3); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 4); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 5); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 6); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 7); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 8); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 9); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 10); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 11); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 12); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 13); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 14); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 15); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 16); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 17); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 18); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 19); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 20); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 21); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 22); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 23); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 24); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 25); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 26); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 27); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 28); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 29); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 30); + OSMetaClassDeclareReservedUnused(IOFilterScheme, 31); +}; + +#endif /* __cplusplus */ +#endif /* KERNEL */ +#endif /* !_IOFILTERSCHEME_H */ diff --git a/QualcommWireless/include/IOKit/storage/IOFireWireStorageCharacteristics.h b/QualcommWireless/include/IOKit/storage/IOFireWireStorageCharacteristics.h new file mode 100644 index 0000000..710f29f --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOFireWireStorageCharacteristics.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) 1998-2009 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#ifndef _IOKIT_IO_FIREWIRE_STORAGE_DEVICE_CHARACTERISTICS_H_ +#define _IOKIT_IO_FIREWIRE_STORAGE_DEVICE_CHARACTERISTICS_H_ + +// +// Bridge Characteristics - Characteristics defined for FireWire bridges. +// + +/*! +@defined kIOPropertyBridgeCharacteristicsKey +@discussion This key is used to define Bridge Characteristics for a particular +devices's bridge chipset. It has an associated dictionary which lists the +bridge characteristics. + +Requirement: Optional + +Example: +<pre> +@textblock +<dict> + <key>Bridge Characteristics</key> + <dict> + <key>Bridge Vendor Name</key> + <string>Oxford Semiconductor</string> + <key>Bridge Model Name</key> + <string>FW911</string> + <key>Bridge Revision Level</key> + <string>3.7</string> + </dict> +</dict> +@/textblock +</pre> +*/ + +#define kIOPropertyBridgeCharacteristicsKey "Bridge Characteristics" +#define kIOPropertyBridgeVendorNameKey "Bridge Vendor Name" +#define kIOPropertyBridgeModelNameKey "Bridge Model Name" +#define kIOPropertyBridgeRevisionLevelKey "Bridge Revision Level" + +#endif /* _IOKIT_IO_FIREWIRE_STORAGE_DEVICE_CHARACTERISTICS_H_ */ \ No newline at end of file diff --git a/QualcommWireless/include/IOKit/storage/IOGUIDPartitionScheme.h b/QualcommWireless/include/IOKit/storage/IOGUIDPartitionScheme.h new file mode 100644 index 0000000..d4b9e5a --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOGUIDPartitionScheme.h @@ -0,0 +1,252 @@ +/* + * Copyright (c) 1998-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/* + * This header contains the IOGUIDPartitionScheme class definition. + */ + +#ifndef _IOGUIDPARTITIONSCHEME_H +#define _IOGUIDPARTITIONSCHEME_H + +#include <IOKit/IOTypes.h> + +/* + * kIOGUIDPartitionSchemeClass is the name of the IOGUIDPartitionScheme class. + */ + +#define kIOGUIDPartitionSchemeClass "IOGUIDPartitionScheme" + +/* + * GUID Partition Map Definitions + */ + +#include <uuid/uuid.h> + +#pragma pack(push, 1) /* (enable 8-bit struct packing) */ + +/* Partition map. */ + +struct gpt_hdr +{ + uint8_t hdr_sig[8]; + uint32_t hdr_revision; + uint32_t hdr_size; + uint32_t hdr_crc_self; + uint32_t __reserved; + uint64_t hdr_lba_self; + uint64_t hdr_lba_alt; + uint64_t hdr_lba_start; + uint64_t hdr_lba_end; + uuid_t hdr_uuid; + uint64_t hdr_lba_table; + uint32_t hdr_entries; + uint32_t hdr_entsz; + uint32_t hdr_crc_table; + uint32_t padding; +}; + +/* Partition map entry. */ + +struct gpt_ent +{ + uuid_t ent_type; + uuid_t ent_uuid; + uint64_t ent_lba_start; + uint64_t ent_lba_end; + uint64_t ent_attr; + uint16_t ent_name[36]; +}; + +/* Partition map signature (hdr_sig). */ + +#define GPT_HDR_SIG "EFI PART" + +/* Partition map version (hdr_revision). */ + +#define GPT_HDR_REVISION 0x00010000 + +/* Partition map entry flags (ent_attr). */ + +#define GPT_ENT_ATTR_PLATFORM 0x00000001 + +/*! + * @defined kIOGUIDPartitionSchemeUUIDKey + * @abstract + * A property of IOGUIDPartitionSchemeGUID objects + * @discussion + * The kIOGUIDPartitionSchemeUUIDKey property has an OSString value and contains + * a persistent GUID for the disk define in GPT header + */ +#define kIOGUIDPartitionSchemeUUIDKey "UUID" + +/*! + * @defined kIOMediaGPTPartitionAttributesKey + * @abstrat + * A property of IOMedia objects for GPT partitions + * @discussion + * The kIOMediaGPTPartitionAttributesKey property has an OSNumber value of 64bit + * GPT partition attributes + */ +#define kIOMediaGPTPartitionAttributesKey "GPT Attributes" + +#pragma pack(pop) /* (reset to default struct packing) */ + +#ifdef KERNEL +#ifdef __cplusplus + +/* + * Kernel + */ + +#include <IOKit/storage/IOPartitionScheme.h> + +/* + * Class + */ + +class IOGUIDPartitionScheme : public IOPartitionScheme +{ + OSDeclareDefaultStructors(IOGUIDPartitionScheme); + +protected: + + struct ExpansionData { /* */ }; + ExpansionData * _expansionData; + + OSSet * _partitions; /* (set of media objects representing partitions) */ + + /* + * Free all of this object's outstanding resources. + */ + + virtual void free(void) APPLE_KEXT_OVERRIDE; + + /* + * Scan the provider media for a GUID partition map. Returns the set + * of media objects representing each of the partitions (the retain for + * the set is passed to the caller), or null should no partition map be + * found. The default probe score can be adjusted up or down, based on + * the confidence of the scan. + */ + + virtual OSSet * scan(SInt32 * score); + + /* + * Ask whether the given partition is used. + */ + + virtual bool isPartitionUsed(gpt_ent * partition); + + /* + * Ask whether the given partition appears to be corrupt. A partition that + * is corrupt will cause the failure of the GUID partition map recognition + * altogether. + */ + + virtual bool isPartitionCorrupt( gpt_ent * partition, + UInt32 partitionID ); + + /* + * Ask whether the given partition appears to be invalid. A partition that + * is invalid will cause it to be skipped in the scan, but will not cause a + * failure of the GUID partition map recognition. + */ + + virtual bool isPartitionInvalid( gpt_ent * partition, + UInt32 partitionID ); + + /* + * Instantiate a new media object to represent the given partition. + */ + + virtual IOMedia * instantiateMediaObject( gpt_ent * partition, + UInt32 partitionID ); + + /* + * Allocate a new media object (called from instantiateMediaObject). + */ + + virtual IOMedia * instantiateDesiredMediaObject( gpt_ent * partition, + UInt32 partitionID ); + +public: + + /* + * Initialize this object's minimal state. + */ + + virtual bool init(OSDictionary * properties = 0) APPLE_KEXT_OVERRIDE; + + /* + * Determine whether the provider media contains a GUID partition map. + */ + + virtual IOService * probe(IOService * provider, SInt32 * score) APPLE_KEXT_OVERRIDE; + + /* + * Publish the new media objects which represent our partitions. + */ + + virtual bool start(IOService * provider) APPLE_KEXT_OVERRIDE; + + /* + * Clean up after the media objects we published before terminating. + */ + + virtual void stop(IOService * provider) APPLE_KEXT_OVERRIDE; + + /* + * Request that the provider media be re-scanned for partitions. + */ + + virtual IOReturn requestProbe(IOOptionBits options) APPLE_KEXT_OVERRIDE; + + /* + * Generic entry point for calls from the provider. A return value of + * kIOReturnSuccess indicates that the message was received, and where + * applicable, that it was successful. + */ + + virtual IOReturn message(UInt32 type, IOService * provider, void * argument) APPLE_KEXT_OVERRIDE; + + OSMetaClassDeclareReservedUnused(IOGUIDPartitionScheme, 0); + OSMetaClassDeclareReservedUnused(IOGUIDPartitionScheme, 1); + OSMetaClassDeclareReservedUnused(IOGUIDPartitionScheme, 2); + OSMetaClassDeclareReservedUnused(IOGUIDPartitionScheme, 3); + OSMetaClassDeclareReservedUnused(IOGUIDPartitionScheme, 4); + OSMetaClassDeclareReservedUnused(IOGUIDPartitionScheme, 5); + OSMetaClassDeclareReservedUnused(IOGUIDPartitionScheme, 6); + OSMetaClassDeclareReservedUnused(IOGUIDPartitionScheme, 7); + OSMetaClassDeclareReservedUnused(IOGUIDPartitionScheme, 8); + OSMetaClassDeclareReservedUnused(IOGUIDPartitionScheme, 9); + OSMetaClassDeclareReservedUnused(IOGUIDPartitionScheme, 10); + OSMetaClassDeclareReservedUnused(IOGUIDPartitionScheme, 11); + OSMetaClassDeclareReservedUnused(IOGUIDPartitionScheme, 12); + OSMetaClassDeclareReservedUnused(IOGUIDPartitionScheme, 13); + OSMetaClassDeclareReservedUnused(IOGUIDPartitionScheme, 14); + OSMetaClassDeclareReservedUnused(IOGUIDPartitionScheme, 15); +}; + +#endif /* __cplusplus */ +#endif /* KERNEL */ +#endif /* !_IOGUIDPARTITIONSCHEME_H */ diff --git a/QualcommWireless/include/IOKit/storage/IOMedia.h b/QualcommWireless/include/IOKit/storage/IOMedia.h new file mode 100644 index 0000000..75ed962 --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOMedia.h @@ -0,0 +1,797 @@ +/* + * Copyright (c) 1998-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/*! + * @header IOMedia + * @abstract + * This header contains the IOMedia class definition. + */ + +#ifndef _IOMEDIA_H +#define _IOMEDIA_H + +#include <IOKit/IOTypes.h> + +/*! + * @defined kIOMediaClass + * @abstract + * The name of the IOMedia class. + */ + +#define kIOMediaClass "IOMedia" + +/*! + * @defined kIOMediaContentKey + * @abstract + * A property of IOMedia objects. + * @discussion + * The kIOMediaContentKey property has an OSString + * value and contains a description of the media's + * contents. The description is the same as the hint at the time of the + * object's creation, but it is possible that the description has been overridden + * by a client (which has probed the media and identified the content correctly) + * of the media object. It is more accurate than the hint for this reason. The + * string is formed in the likeness of Apple's "Apple_HFS" strings or in the + * likeness of a UUID. + */ + +#define kIOMediaContentKey "Content" + +/*! + * @defined kIOMediaContentHintKey + * @abstract + * A property of IOMedia objects. + * @discussion + * The kIOMediaContentHintKey property has an OSString + * value and contains a hint of the media's contents. + * The hint is set at the time of the object's creation, should the creator have + * a clue as to what it may contain. The hint string does not change for the + * lifetime of the object and is formed in the likeness of Apple's "Apple_HFS" + * strings or in the likeness of a UUID. + */ + +#define kIOMediaContentHintKey "Content Hint" + +/*! + * @defined kIOMediaEjectableKey + * @abstract + * A property of IOMedia objects. + * @discussion + * The kIOMediaEjectableKey property has an OSBoolean + * value and describes whether the media is ejectable + * from the drive mechanism under software control. Implies IOMediaRemovable + * is also true. + */ + +#define kIOMediaEjectableKey "Ejectable" + +/*! + * @defined kIOMediaLeafKey + * @abstract + * A property of IOMedia objects. + * @discussion + * The kIOMediaLeafKey property has an OSBoolean value and describes whether the media is a leaf, that is, + * it is the deepest media object in this branch of the I/O Registry. + */ + +#define kIOMediaLeafKey "Leaf" + +/*! + * @defined kIOMediaOpenKey + * @abstract + * A property of IOMedia objects. + * @discussion + * The kIOMediaOpenKey property has an OSBoolean value and describes whether + * a client presently has an open on this media. + */ + +#define kIOMediaOpenKey "Open" + +/*! + * @defined kIOMediaPreferredBlockSizeKey + * @abstract + * A property of IOMedia objects. + * @discussion + * The kIOMediaPreferredBlockSizeKey property has an + * OSNumber value and describes the media's natural + * block size in bytes. This information is useful to clients that want to + * optimize access to the media. + */ + +#define kIOMediaPreferredBlockSizeKey "Preferred Block Size" + +/*! + * @defined kIOMediaRemovableKey + * @abstract + * A property of IOMedia objects. + * @discussion + * The kIOMediaRemovableKey property has an OSBoolean + * value and describes whether the media is removable + * from the drive mechanism. + */ + +#define kIOMediaRemovableKey "Removable" + +/*! + * @defined kIOMediaSizeKey + * @abstract + * A property of IOMedia objects. + * @discussion + * The kIOMediaSizeKey property has an OSNumber value and describes the total length of the media in + * bytes. + */ + +#define kIOMediaSizeKey "Size" + +/*! + * @defined kIOMediaUUIDKey + * @abstract + * A property of IOMedia objects. + * @discussion + * The kIOMediaUUIDKey property has an OSString value and contains a persistent + * Universal Unique Identifier for the media if such an identifier is available. + */ + +#define kIOMediaUUIDKey "UUID" + +/*! + * @defined kIOMediaWholeKey + * @abstract + * A property of IOMedia objects. + * @discussion + * The kIOMediaWholeKey property has an OSBoolean + * value and describes whether the media is whole, that is, + * it represents the whole disk (the physical disk, or a virtual replica + * thereof). + */ + +#define kIOMediaWholeKey "Whole" + +/*! + * @defined kIOMediaWritableKey + * @abstract + * A property of IOMedia objects. + * @discussion + * The kIOMediaWritableKey property has an OSBoolean + * value and describes whether the media is writable. + */ + +#define kIOMediaWritableKey "Writable" + +/*! + * @defined kIOMediaContentMaskKey + * @abstract + * A property of IOMedia clients. + * @discussion + * The kIOMediaContentMaskKey property has an OSString + * value and must exist in all IOMedia clients that + * drive new content (that is, produce new media objects). When the client + * matches against the provider media, the value of the client's + * kIOMediaContentMaskKey property is used to replace the provider's + * kIOMediaContentKey property. + */ + +#define kIOMediaContentMaskKey "Content Mask" + +/*! + * @defined kIOMediaIconKey + * @abstract + * A property of any object in the media stack. + * @discussion + * kIOMediaIconKey is a property of any object in the media stack that wishes + * to override the default icon shown for the media objects in the stack. It + * is usually defined in a provider object below the media object. It has an + * OSDictionary value, with properties identical to the kIOIconKey definition, + * that is, kCFBundleIdentifierKey and kIOBundleResourceFileKey. + */ + +#define kIOMediaIconKey "IOMediaIcon" + +/*! + * @enum IOMediaAttributeMask + * @discussion + * The IOMediaAttributeMask bit mask describes various attributes of + * the media object, such as its ejectability and its removability. + * @constant kIOMediaAttributeEjectableMask + * Indicates whether the media is ejectable from the drive mechanism + * under software control. Implies kIOMediaAttributeRemovableMask. + * @constant kIOMediaAttributeRemovableMask + * Indicates whether the media is removable from the drive mechanism. + */ + +enum +{ + kIOMediaAttributeEjectableMask = 0x00000001, + kIOMediaAttributeRemovableMask = 0x00000002, + kIOMediaAttributeReservedMask = 0xFFFFFFFC +}; + +typedef UInt32 IOMediaAttributeMask; + +#ifdef KERNEL +#ifdef __cplusplus + +/* + * Kernel + */ + +#include <IOKit/storage/IOStorage.h> + +/*! + * @class IOMedia + * @abstract + * A random-access disk device abstraction. + * @discussion + * The IOMedia class is a random-access disk device abstraction. It provides a + * consistent interface for both real and virtual disk devices, for subdivisions + * of disks such as partitions, for supersets of disks such as RAID volumes, and + * so on. It extends the IOStorage class by implementing the appropriate open, + * close, read, write, and matching semantics for media objects. The properties + * it has reflect the properties of real disk devices, such as ejectability and + * writability. + * + * The read and write interfaces support byte-level access to the storage space, + * with the appropriate deblocking handled by the block storage driver, however, + * a typical client will want to get the natural block size in order to optimize + * access to the real disk device. A read or write is accepted so long as the + * client's access is valid, the media is formatted and the transfer is within + * the bounds of the media. An optional non-zero base (offset) is then applied + * before the read or write is passed to the provider object. + */ + +class IOMedia : public IOStorage +{ + OSDeclareDefaultStructors(IOMedia) + +protected: + +#ifdef KERNEL_PRIVATE + struct ExpansionData { + IOLock * _lock; + OSArray * _probeList; + bool _needRegisterService; + }; + #define mediaManagementLock ( IOMedia::_expansionData->_lock ) + #define mediaProbeList ( IOMedia::_expansionData->_probeList ) + #define mediaNeedRegisterService ( IOMedia::_expansionData->_needRegisterService ) +#else /* KERNEL_PRIVATE */ + struct ExpansionData { /* */ }; +#endif /* KERNEL_PRIVATE */ + + ExpansionData * _expansionData; + + UInt32 _attributes; + + bool _isWhole; + bool _isWritable; + + UInt64 _mediaBase; /* (relative to the storage object below us) */ + UInt64 _mediaSize; + + IOStorageAccess _openLevel; + OSDictionary * _openClients; + + UInt32 _reserved0320; + + UInt64 _preferredBlockSize; + + /* + * Free all of this object's outstanding resources. + */ + + virtual void free() APPLE_KEXT_OVERRIDE; + + /*! + * @function handleOpen + * @discussion + * The handleOpen method grants or denies permission to access this object + * to an interested client. The argument is an IOStorageAccess value that + * specifies the level of access desired -- reader or reader-writer. + * + * This method can be invoked to upgrade or downgrade the access level for + * an existing client as well. The previous access level will prevail for + * upgrades that fail, of course. A downgrade should never fail. If the + * new access level should be the same as the old for a given client, this + * method will do nothing and return success. In all cases, one, singular + * close-per-client is expected for all opens-per-client received. + * + * This implementation replaces the IOService definition of handleOpen(). + * @param client + * Client requesting the open. + * @param options + * Options for the open. Set to zero. + * @param access + * Access level for the open. Set to kIOStorageAccessReader or + * kIOStorageAccessReaderWriter. + * @result + * Returns true if the open was successful, false otherwise. + */ + + virtual bool handleOpen(IOService * client, + IOOptionBits options, + void * access) APPLE_KEXT_OVERRIDE; + + /*! + * @function handleIsOpen + * @discussion + * The handleIsOpen method determines whether the specified client, or any + * client if none is specified, presently has an open on this object. + * + * This implementation replaces the IOService definition of handleIsOpen(). + * @param client + * Client to check the open state of. Set to zero to check the open state + * of all clients. + * @result + * Returns true if the client was (or clients were) open, false otherwise. + */ + + virtual bool handleIsOpen(const IOService * client) const APPLE_KEXT_OVERRIDE; + + /*! + * @function handleClose + * @discussion + * The handleClose method closes the client's access to this object. + * + * This implementation replaces the IOService definition of handleClose(). + * @param client + * Client requesting the close. + * @param options + * Options for the close. Set to zero. + */ + + virtual void handleClose(IOService * client, IOOptionBits options) APPLE_KEXT_OVERRIDE; + +#ifdef KERNEL_PRIVATE +private: + + void scheduleProbe ( IOService * driver ); + void scheduleRegisterService( void ); + +public: + + /*! + * @function close + * @abstract Releases active access to a provider. + * @discussion IOService provides generic open and close semantics to track + * clients of a provider that have established an active datapath. The use + * of open and close, and rules regarding * ownership are family defined, + * and defined by the handleOpen and handleClose methods in the provider. + * @param client Designates the client of the provider requesting the + * close. + * @param options Options available for the close. The provider family may + * implement options for close; IOService defines none. + */ + + virtual void close( IOService * client, + IOOptionBits options = 0 ) APPLE_KEXT_OVERRIDE; + +#endif /* KERNEL_PRIVATE */ + +public: + + using IOStorage::read; + using IOStorage::write; + + /* + * This method is called for each client interested in the services we + * provide. The superclass links us as a parent to this client in the + * I/O Kit registry on success. + */ + + virtual bool attachToChild(IORegistryEntry * client, + const IORegistryPlane * plane) APPLE_KEXT_OVERRIDE; + + /* + * This method is called for each client that loses interest in the + * services we provide. The superclass unlinks us from this client + * in the I/O Kit registry on success. + */ + + virtual void detachFromChild(IORegistryEntry * client, + const IORegistryPlane * plane) APPLE_KEXT_OVERRIDE; + + /* + * Obtain this object's provider. We override the superclass's method to + * return a more specific subclass of OSObject -- IOStorage. This method + * serves simply as a convenience to subclass developers. + */ + + virtual IOStorage * getProvider() const APPLE_KEXT_OVERRIDE; + + /* + * Compare the properties in the supplied table to this object's properties. + */ + + virtual bool matchPropertyTable(OSDictionary * table, SInt32 * score) APPLE_KEXT_OVERRIDE; + + /*! + * @function read + * @discussion + * Read data from the storage object at the specified byte offset into the + * specified buffer, asynchronously. When the read completes, the caller + * will be notified via the specified completion action. + * + * The buffer will be retained for the duration of the read. + * @param client + * Client requesting the read. + * @param byteStart + * Starting byte offset for the data transfer. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param attributes + * Attributes of the data transfer. See IOStorageAttributes. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + * @param completion + * Completion routine to call once the data transfer is complete. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + */ + + virtual void read(IOService * client, + UInt64 byteStart, + IOMemoryDescriptor * buffer, + IOStorageAttributes * attributes, + IOStorageCompletion * completion) APPLE_KEXT_OVERRIDE; + + /*! + * @function write + * @discussion + * Write data into the storage object at the specified byte offset from the + * specified buffer, asynchronously. When the write completes, the caller + * will be notified via the specified completion action. + * + * The buffer will be retained for the duration of the write. + * @param client + * Client requesting the write. + * @param byteStart + * Starting byte offset for the data transfer. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param attributes + * Attributes of the data transfer. See IOStorageAttributes. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + * @param completion + * Completion routine to call once the data transfer is complete. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + */ + + virtual void write(IOService * client, + UInt64 byteStart, + IOMemoryDescriptor * buffer, + IOStorageAttributes * attributes, + IOStorageCompletion * completion) APPLE_KEXT_OVERRIDE; + + /*! + * @function synchronize + * @discussion + * Flush the cached data in the storage object, if any. + * @param client + * Client requesting the synchronization. + * @param byteStart + * Starting byte offset for the synchronization. + * @param byteCount + * Size of the synchronization. Set to zero to specify the end-of-media. + * @param options + * Options for the synchronization. See IOStorageSynchronizeOptions. + * @result + * Returns the status of the synchronization. + */ + + virtual IOReturn synchronize(IOService * client, + UInt64 byteStart, + UInt64 byteCount, + IOStorageSynchronizeOptions options = 0) APPLE_KEXT_OVERRIDE; + + /*! + * @function unmap + * @discussion + * Delete unused data from the storage object at the specified byte offsets. + * @param client + * Client requesting the operation. + * @param extents + * List of extents. See IOStorageExtent. It is legal for the callee to + * overwrite the contents of this buffer in order to satisfy the request. + * @param extentsCount + * Number of extents. + * @param options + * Options for the unmap. See IOStorageUnmapOptions. + * @result + * Returns the status of the operation. + */ + + virtual IOReturn unmap(IOService * client, + IOStorageExtent * extents, + UInt32 extentsCount, + IOStorageUnmapOptions options = 0) APPLE_KEXT_OVERRIDE; + + /*! + * @function getProvisionStatus + * @discussion + * Get device block provision status + * @param client + * Client requesting the synchronization. + * @param byteStart + * Byte offset of logical extent on the device. + * @param byteCount + * Byte length of logical extent on the device, 0 mean the entire remaining space. + * @param extentsCount + * Number of extents allocated in extents. On return, this parameter indicate number + * of provision extents returned. + * @param extents + * List of provision extents. See IOStorageProvisionExtents. + * @result + * Returns the status of the getProvisionStatus. + */ + + virtual IOReturn getProvisionStatus(IOService * client, + UInt64 byteStart, + UInt64 byteCount, + UInt32 * extentsCount, + IOStorageProvisionExtent * extents, + IOStorageGetProvisionStatusOptions options = 0) APPLE_KEXT_OVERRIDE; + + /*! + * @function lockPhysicalExtents + * @discussion + * Lock the contents of the storage object against relocation temporarily, + * for the purpose of getting physical extents. + * @param client + * Client requesting the operation. + * @result + * Returns true if the lock was successful, false otherwise. + */ + + virtual bool lockPhysicalExtents(IOService * client) APPLE_KEXT_OVERRIDE; + + /*! + * @function copyPhysicalExtent + * @discussion + * Convert the specified byte offset into a physical byte offset, relative + * to a physical storage object. This call should only be made within the + * context of lockPhysicalExtents(). + * @param client + * Client requesting the operation. + * @param byteStart + * Starting byte offset for the operation. Returns a physical byte offset, + * relative to the physical storage object, on success. + * @param byteCount + * Size of the operation. Returns the actual number of bytes which can be + * transferred, relative to the physical storage object, on success. + * @result + * A reference to the physical storage object, which should be released by + * the caller, or a null on error. + */ + + virtual IOStorage * copyPhysicalExtent(IOService * client, + UInt64 * byteStart, + UInt64 * byteCount) APPLE_KEXT_OVERRIDE; + + /*! + * @function unlockPhysicalExtents + * @discussion + * Unlock the contents of the storage object for relocation again. This + * call must balance a successful call to lockPhysicalExtents(). + * @param client + * Client requesting the operation. + */ + + virtual void unlockPhysicalExtents(IOService * client) APPLE_KEXT_OVERRIDE; + + /*! + * @function setPriority + * @discussion + * Reprioritize read or write requests at the specified byte offsets. + * @param client + * Client requesting the operation. + * @param extents + * List of extents. See IOStorageExtent. It is legal for the callee to + * overwrite the contents of this buffer in order to satisfy the request. + * @param extentsCount + * Number of extents. + * @param priority + * New priority. See IOStoragePriority. + * @result + * Returns the status of the operation. + */ + + virtual IOReturn setPriority(IOService * client, + IOStorageExtent * extents, + UInt32 extentsCount, + IOStoragePriority priority) APPLE_KEXT_OVERRIDE; + + /*! + * @function getPreferredBlockSize + * @discussion + * Ask the media object for its natural block size. This information + * is useful to clients that want to optimize access to the media. + * @result + * Natural block size, in bytes. + */ + + virtual UInt64 getPreferredBlockSize() const; + + /*! + * @function getSize + * @discussion + * Ask the media object for its total length in bytes. + * @result + * Media size, in bytes. + */ + + virtual UInt64 getSize() const; + + /*! + * @function getBase + * @discussion + * Ask the media object for its byte offset relative to the provider media. + * @result + * Media offset, in bytes. + */ + + virtual UInt64 getBase() const; + + /*! + * @function isEjectable + * @discussion + * Ask the media object whether it is ejectable. + * @result + * Returns true if the media is ejectable, false otherwise. + */ + + virtual bool isEjectable() const; + + /*! + * @function isFormatted + * @discussion + * Ask the media object whether it is formatted. + * @result + * Returns true if the media is formatted, false otherwise. + */ + + virtual bool isFormatted() const; + + /*! + * @function isWhole + * @discussion + * Ask the media object whether it represents the whole disk. + * @result + * Returns true if the media represents the whole disk, false otherwise. + */ + + virtual bool isWhole() const; + + /*! + * @function isWritable + * @discussion + * Ask the media object whether it is writable. + * @result + * Returns true if the media is writable, false otherwise. + */ + + virtual bool isWritable() const; + + /*! + * @function getContent + * @discussion + * Ask the media object for a description of its contents. The description + * is the same as the hint at the time of the object's creation, but it is + * possible that the description has been overridden by a client (which has probed + * the media and identified the content correctly) of the media object. It + * is more accurate than the hint for this reason. The string is formed in + * the likeness of Apple's "Apple_HFS" strings or in the likeness of a UUID. + * + * The content description can be overridden by any client that matches onto + * this media object with a match category of kIOStorageCategory. The media + * object checks for a kIOMediaContentMaskKey property in the client, and if + * it finds one, it copies it into kIOMediaContentKey property. + * @result + * Description of media's contents. + */ + + virtual const char * getContent() const; + + /*! + * @function getContentHint + * @discussion + * Ask the media object for a hint of its contents. The hint is set at the + * time of the object's creation, should the creator have a clue as to what + * it may contain. The hint string does not change for the lifetime of the + * object and is also formed in the likeness of Apple's "Apple_HFS" strings + * or in the likeness of a UUID. + * @result + * Hint of media's contents. + */ + + virtual const char * getContentHint() const; + + /*! + * @function init + * @discussion + * Initialize this object's minimal state. + * @param base + * Media offset, in bytes. + * @param size + * Media size, in bytes. + * @param preferredBlockSize + * Natural block size, in bytes. + * @param attributes + * Media attributes, such as ejectability and removability. See + * IOMediaAttributeMask. + * @param isWhole + * Indicates whether the media represents the whole disk. + * @param isWritable + * Indicates whether the media is writable. + * @param contentHint + * Hint of media's contents (optional). See getContentHint(). + * @param properties + * Substitute property table for this object (optional). + * @result + * Returns true on success, false otherwise. + */ + + virtual bool init(UInt64 base, + UInt64 size, + UInt64 preferredBlockSize, + IOMediaAttributeMask attributes, + bool isWhole, + bool isWritable, + const char * contentHint = 0, + OSDictionary * properties = 0); + + /*! + * @function getAttributes + * @discussion + * Ask the media object for its attributes. + * @result + * Media attributes, such as ejectability and removability. See + * IOMediaAttributeMask. + */ + + virtual IOMediaAttributeMask getAttributes() const; + + OSMetaClassDeclareReservedUnused(IOMedia, 0); + OSMetaClassDeclareReservedUnused(IOMedia, 1); + OSMetaClassDeclareReservedUnused(IOMedia, 2); + OSMetaClassDeclareReservedUnused(IOMedia, 3); + OSMetaClassDeclareReservedUnused(IOMedia, 4); + OSMetaClassDeclareReservedUnused(IOMedia, 5); + OSMetaClassDeclareReservedUnused(IOMedia, 6); + OSMetaClassDeclareReservedUnused(IOMedia, 7); + OSMetaClassDeclareReservedUnused(IOMedia, 8); + OSMetaClassDeclareReservedUnused(IOMedia, 9); + OSMetaClassDeclareReservedUnused(IOMedia, 10); + OSMetaClassDeclareReservedUnused(IOMedia, 11); + OSMetaClassDeclareReservedUnused(IOMedia, 12); + OSMetaClassDeclareReservedUnused(IOMedia, 13); + OSMetaClassDeclareReservedUnused(IOMedia, 14); + OSMetaClassDeclareReservedUnused(IOMedia, 15); +}; + +#endif /* __cplusplus */ +#endif /* KERNEL */ +#endif /* !_IOMEDIA_H */ diff --git a/QualcommWireless/include/IOKit/storage/IOMediaBSDClient.h b/QualcommWireless/include/IOKit/storage/IOMediaBSDClient.h new file mode 100644 index 0000000..5896971 --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOMediaBSDClient.h @@ -0,0 +1,142 @@ +/* + * Copyright (c) 1998-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOMEDIABSDCLIENT_H +#define _IOMEDIABSDCLIENT_H + +#include <sys/disk.h> + +#ifdef KERNEL +#ifdef __cplusplus + +/* + * Kernel + */ + +#include <sys/conf.h> +#include <IOKit/storage/IOMedia.h> + +class AnchorTable; +class MinorTable; +struct MinorSlot; + +UInt64 _IOMediaBSDClientGetThrottleMask(IOMedia * media); + +/* + * Class + */ + +class IOMediaBSDClient : public IOService +{ + OSDeclareDefaultStructors(IOMediaBSDClient) + +protected: + + struct ExpansionData { /* */ }; + ExpansionData * _expansionData; + +private: + + AnchorTable * _anchors; + UInt32 _reserved0064 __attribute__ ((unused)); + UInt32 _reserved0096 __attribute__ ((unused)); + MinorTable * _minors; + UInt32 _reserved0160 __attribute__ ((unused)); + +protected: + + /* + * Find the whole media that roots the given media tree. + */ + + virtual IOMedia * getWholeMedia( IOMedia * media, + UInt32 * slicePathSize = 0, + char * slicePath = 0 ); + + /* + * Create bdevsw and cdevsw nodes for the given media object. + */ + + virtual bool createNodes(IOMedia * media); + + /* + * Free all of this object's outstanding resources. + */ + + virtual void free() APPLE_KEXT_OVERRIDE; + +public: + + /* + * Obtain this object's provider. We override the superclass's method to + * return a more specific subclass of IOService -- IOMedia. This method + * method serves simply as a convenience to subclass developers. + */ + + virtual IOMedia * getProvider() const APPLE_KEXT_OVERRIDE; + + /* + * Initialize this object's minimal state. + */ + + virtual bool init(OSDictionary * properties = 0) APPLE_KEXT_OVERRIDE; + + /* + * This method is called once we have been attached to the provider object. + */ + + virtual bool start(IOService * provider) APPLE_KEXT_OVERRIDE; + + /* + * This method is called when we are to terminate from the provider object. + */ + + virtual bool terminate(IOOptionBits options) APPLE_KEXT_OVERRIDE; + + /* + * Process a foreign ioctl. + */ + + virtual int ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, proc_t proc); + + OSMetaClassDeclareReservedUnused(IOMediaBSDClient, 0); + OSMetaClassDeclareReservedUnused(IOMediaBSDClient, 1); + OSMetaClassDeclareReservedUnused(IOMediaBSDClient, 2); + OSMetaClassDeclareReservedUnused(IOMediaBSDClient, 3); + OSMetaClassDeclareReservedUnused(IOMediaBSDClient, 4); + OSMetaClassDeclareReservedUnused(IOMediaBSDClient, 5); + OSMetaClassDeclareReservedUnused(IOMediaBSDClient, 6); + OSMetaClassDeclareReservedUnused(IOMediaBSDClient, 7); + OSMetaClassDeclareReservedUnused(IOMediaBSDClient, 8); + OSMetaClassDeclareReservedUnused(IOMediaBSDClient, 9); + OSMetaClassDeclareReservedUnused(IOMediaBSDClient, 10); + OSMetaClassDeclareReservedUnused(IOMediaBSDClient, 11); + OSMetaClassDeclareReservedUnused(IOMediaBSDClient, 12); + OSMetaClassDeclareReservedUnused(IOMediaBSDClient, 13); + OSMetaClassDeclareReservedUnused(IOMediaBSDClient, 14); + OSMetaClassDeclareReservedUnused(IOMediaBSDClient, 15); +}; + +#endif /* __cplusplus */ +#endif /* KERNEL */ +#endif /* !_IOMEDIABSDCLIENT_H */ diff --git a/QualcommWireless/include/IOKit/storage/IOPartitionScheme.h b/QualcommWireless/include/IOKit/storage/IOPartitionScheme.h new file mode 100644 index 0000000..3d54142 --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOPartitionScheme.h @@ -0,0 +1,481 @@ +/* + * Copyright (c) 1998-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/*! + * @header IOPartitionScheme + * @abstract + * This header contains the IOPartitionScheme class definition. + */ + +#ifndef _IOPARTITIONSCHEME_H +#define _IOPARTITIONSCHEME_H + +/*! + * @defined kIOPartitionSchemeClass + * @abstract + * The name of the IOPartitionScheme class. + * @discussion + * kIOPartitionSchemeClass is the name of the IOPartitionScheme class. + */ + +#define kIOPartitionSchemeClass "IOPartitionScheme" + +/*! + * @defined kIOMediaBaseKey + * @abstract + * A property of IOMedia objects. + * @discussion + * The kIOMediaBaseKey property has an OSNumber value and is placed into an + * IOMedia instance created via the partition scheme. It describes the byte + * offset of the partition relative to the provider media. + */ + +#define kIOMediaBaseKey "Base" + +/*! + * @defined kIOMediaLiveKey + * @abstract + * A property of IOMedia objects. + * @discussion + * The kIOMediaLiveKey property has an OSBoolean + * value and is placed into an IOMedia instance + * created via the partition scheme. It describes whether the + * partition is live, that is, it is up-to-date with respect + * to the on-disk partition table. + */ + +#define kIOMediaLiveKey "Live" + +/*! + * @defined kIOMediaPartitionIDKey + * @abstract + * A property of IOMedia objects. + * @discussion + * The kIOMediaPartitionIDKey property has an OSNumber + * value and is placed into an IOMedia instance + * created via the partition scheme. It is an ID that differentiates one + * partition from the other (within a given scheme). It is typically an index + * into the on-disk partition table. + */ + +#define kIOMediaPartitionIDKey "Partition ID" + +#ifdef KERNEL +#ifdef __cplusplus + +/* + * Kernel + */ + +#include <IOKit/storage/IOMedia.h> +#include <IOKit/storage/IOStorage.h> + +/*! + * @class IOPartitionScheme + * @abstract + * The common base class for all partition scheme + * objects. + * @discussion + * The IOPartitionScheme class is the common base class for all partition scheme + * objects. It extends the IOStorage class by implementing the appropriate open + * and close semantics for partition objects (standard semantics are to act as a + * multiplexor for incoming opens, producing one outgoing open with the correct + * access). It also implements the default read and write semantics, which pass + * all reads and writes through to the provider media unprocessed. For simple + * schemes, the default behavior is sufficient. More complex partition schemes + * such as RAID will want to do extra processing for reads and writes. + */ + +class IOPartitionScheme : public IOStorage +{ + OSDeclareDefaultStructors(IOPartitionScheme); + +protected: + + struct ExpansionData { /* */ }; + ExpansionData * _expansionData; + + IOStorageAccess _openLevel; + OSSet * _openReaders; + OSSet * _openReaderWriters; + + /* + * Free all of this object's outstanding resources. + */ + + virtual void free() APPLE_KEXT_OVERRIDE; + + /*! + * @function handleOpen + * @discussion + * The handleOpen method grants or denies permission to access this object + * to an interested client. The argument is an IOStorageAccess value that + * specifies the level of access desired -- reader or reader-writer. + * + * This method can be invoked to upgrade or downgrade the access level for + * an existing client as well. The previous access level will prevail for + * upgrades that fail, of course. A downgrade should never fail. If the + * new access level should be the same as the old for a given client, this + * method will do nothing and return success. In all cases, one, singular + * close-per-client is expected for all opens-per-client received. + * + * This implementation replaces the IOService definition of handleOpen(). + * @param client + * Client requesting the open. + * @param options + * Options for the open. Set to zero. + * @param access + * Access level for the open. Set to kIOStorageAccessReader or + * kIOStorageAccessReaderWriter. + * @result + * Returns true if the open was successful, false otherwise. + */ + + virtual bool handleOpen(IOService * client, + IOOptionBits options, + void * access) APPLE_KEXT_OVERRIDE; + + /*! + * @function handleIsOpen + * @discussion + * The handleIsOpen method determines whether the specified client, or any + * client if none is specified, presently has an open on this object. + * + * This implementation replaces the IOService definition of handleIsOpen(). + * @param client + * Client to check the open state of. Set to zero to check the open state + * of all clients. + * @result + * Returns true if the client was (or clients were) open, false otherwise. + */ + + virtual bool handleIsOpen(const IOService * client) const APPLE_KEXT_OVERRIDE; + + /*! + * @function handleClose + * @discussion + * The handleClose method closes the client's access to this object. + * + * This implementation replaces the IOService definition of handleClose(). + * @param client + * Client requesting the close. + * @param options + * Options for the close. Set to zero. + */ + + virtual void handleClose(IOService * client, IOOptionBits options) APPLE_KEXT_OVERRIDE; + + /* + * Attach the given media object to the device tree plane. + */ + + virtual bool attachMediaObjectToDeviceTree(IOMedia * media); + + /* + * Detach the given media object from the device tree plane. + */ + + virtual void detachMediaObjectFromDeviceTree(IOMedia * media); + + /* + * Updates a set of existing partitions, represented by partitionsOld, + * with possible updates from a rescan of the disk, represented by + * partitionsNew. It returns a new set of partitions with the results, + * removing partitions from partitionsOld where applicable, adding + * partitions from partitionsNew where applicable, and folding in property + * changes to partitions from partitionsNew into partitionsOld where + * applicable. + */ + + virtual OSSet * juxtaposeMediaObjects(OSSet * partitionsOld, + OSSet * partitionsNew); + +public: + + using IOStorage::read; + using IOStorage::write; + + /* + * Initialize this object's minimal state. + */ + + virtual bool init(OSDictionary * properties = 0) APPLE_KEXT_OVERRIDE; + + /*! + * @function read + * @discussion + * Read data from the storage object at the specified byte offset into the + * specified buffer, asynchronously. When the read completes, the caller + * will be notified via the specified completion action. + * + * The buffer will be retained for the duration of the read. + * + * For simple partition schemes, the default behavior is to simply pass the + * read through to the provider media. More complex partition schemes such + * as RAID will need to do extra processing here. + * @param client + * Client requesting the read. + * @param byteStart + * Starting byte offset for the data transfer. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param attributes + * Attributes of the data transfer. See IOStorageAttributes. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + * @param completion + * Completion routine to call once the data transfer is complete. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + */ + + virtual void read(IOService * client, + UInt64 byteStart, + IOMemoryDescriptor * buffer, + IOStorageAttributes * attributes, + IOStorageCompletion * completion) APPLE_KEXT_OVERRIDE; + + /*! + * @function write + * @discussion + * Write data into the storage object at the specified byte offset from the + * specified buffer, asynchronously. When the write completes, the caller + * will be notified via the specified completion action. + * + * The buffer will be retained for the duration of the write. + * + * For simple partition schemes, the default behavior is to simply pass the + * write through to the provider media. More complex partition schemes such + * as RAID will need to do extra processing here. + * @param client + * Client requesting the write. + * @param byteStart + * Starting byte offset for the data transfer. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param attributes + * Attributes of the data transfer. See IOStorageAttributes. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + * @param completion + * Completion routine to call once the data transfer is complete. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + */ + + virtual void write(IOService * client, + UInt64 byteStart, + IOMemoryDescriptor * buffer, + IOStorageAttributes * attributes, + IOStorageCompletion * completion) APPLE_KEXT_OVERRIDE; + + /*! + * @function synchronize + * @discussion + * Flush the cached data in the storage object, if any. + * @param client + * Client requesting the synchronization. + * @param byteStart + * Starting byte offset for the synchronization. + * @param byteCount + * Size of the synchronization. Set to zero to specify the end-of-media. + * @param options + * Options for the synchronization. See IOStorageSynchronizeOptions. + * @result + * Returns the status of the synchronization. + */ + + virtual IOReturn synchronize(IOService * client, + UInt64 byteStart, + UInt64 byteCount, + IOStorageSynchronizeOptions options = 0) APPLE_KEXT_OVERRIDE; + + /*! + * @function unmap + * @discussion + * Delete unused data from the storage object at the specified byte offsets. + * @param client + * Client requesting the operation. + * @param extents + * List of extents. See IOStorageExtent. It is legal for the callee to + * overwrite the contents of this buffer in order to satisfy the request. + * @param extentsCount + * Number of extents. + * @param options + * Options for the unmap. See IOStorageUnmapOptions. + * @result + * Returns the status of the operation. + */ + + virtual IOReturn unmap(IOService * client, + IOStorageExtent * extents, + UInt32 extentsCount, + IOStorageUnmapOptions options = 0) APPLE_KEXT_OVERRIDE; + + /*! + * @function getProvisionStatus + * @discussion + * Get device block provision status + * @param client + * Client requesting the synchronization. + * @param byteStart + * Byte offset of logical extent on the device. + * @param byteCount + * Byte length of logical extent on the device, 0 mean the entire remaining space. + * @param extentsCount + * Number of extents allocated in extents. On return, this parameter indicate number + * of provision extents returned. + * @param extents + * List of provision extents. See IOStorageProvisionExtents. + * @result + * Returns the status of the getProvisionStatus. + */ + + virtual IOReturn getProvisionStatus(IOService * client, + UInt64 byteStart, + UInt64 byteCount, + UInt32 * extentsCount, + IOStorageProvisionExtent * extents, + IOStorageGetProvisionStatusOptions options = 0) APPLE_KEXT_OVERRIDE; + + /*! + * @function lockPhysicalExtents + * @discussion + * Lock the contents of the storage object against relocation temporarily, + * for the purpose of getting physical extents. + * @param client + * Client requesting the operation. + * @result + * Returns true if the lock was successful, false otherwise. + */ + + virtual bool lockPhysicalExtents(IOService * client) APPLE_KEXT_OVERRIDE; + + /*! + * @function copyPhysicalExtent + * @discussion + * Convert the specified byte offset into a physical byte offset, relative + * to a physical storage object. This call should only be made within the + * context of lockPhysicalExtents(). + * @param client + * Client requesting the operation. + * @param byteStart + * Starting byte offset for the operation. Returns a physical byte offset, + * relative to the physical storage object, on success. + * @param byteCount + * Size of the operation. Returns the actual number of bytes which can be + * transferred, relative to the physical storage object, on success. + * @result + * A reference to the physical storage object, which should be released by + * the caller, or a null on error. + */ + + virtual IOStorage * copyPhysicalExtent(IOService * client, + UInt64 * byteStart, + UInt64 * byteCount) APPLE_KEXT_OVERRIDE; + + /*! + * @function unlockPhysicalExtents + * @discussion + * Unlock the contents of the storage object for relocation again. This + * call must balance a successful call to lockPhysicalExtents(). + * @param client + * Client requesting the operation. + */ + + virtual void unlockPhysicalExtents(IOService * client) APPLE_KEXT_OVERRIDE; + + /*! + * @function setPriority + * @discussion + * Reprioritize read or write requests at the specified byte offsets. + * @param client + * Client requesting the operation. + * @param extents + * List of extents. See IOStorageExtent. It is legal for the callee to + * overwrite the contents of this buffer in order to satisfy the request. + * @param extentsCount + * Number of extents. + * @param priority + * New priority. See IOStoragePriority. + * @result + * Returns the status of the operation. + */ + + virtual IOReturn setPriority(IOService * client, + IOStorageExtent * extents, + UInt32 extentsCount, + IOStoragePriority priority) APPLE_KEXT_OVERRIDE; + + /* + * Obtain this object's provider. We override the superclass's method + * to return a more specific subclass of OSObject -- an IOMedia. This + * method serves simply as a convenience to subclass developers. + */ + + virtual IOMedia * getProvider() const APPLE_KEXT_OVERRIDE; + + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 0); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 1); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 2); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 3); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 4); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 5); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 6); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 7); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 8); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 9); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 10); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 11); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 12); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 13); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 14); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 15); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 16); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 17); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 18); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 19); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 20); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 21); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 22); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 23); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 24); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 25); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 26); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 27); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 28); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 29); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 30); + OSMetaClassDeclareReservedUnused(IOPartitionScheme, 31); +}; + +#ifdef KERNEL_PRIVATE +#define kIOPartitionScheme_partition_valid ( ( intptr_t ) 1 ) +#define _partitionSchemeState ( *( intptr_t *) &( IOPartitionScheme::_expansionData ) ) +#endif /* KERNEL_PRIVATE */ + +#endif /* __cplusplus */ +#endif /* KERNEL */ +#endif /* !_IOPARTITIONSCHEME_H */ diff --git a/QualcommWireless/include/IOKit/storage/IOStorage.h b/QualcommWireless/include/IOKit/storage/IOStorage.h new file mode 100644 index 0000000..34930be --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOStorage.h @@ -0,0 +1,788 @@ +/* + * Copyright (c) 1998-2015 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/*! + * @header IOStorage + * @abstract + * This header contains the IOStorage class definition. + */ + +#ifndef _IOSTORAGE_H +#define _IOSTORAGE_H + +#include <sys/kernel_types.h> +#include <IOKit/IOTypes.h> + +/*! + * @defined kIOStorageClass + * @abstract + * The name of the IOStorage class. + */ + +#define kIOStorageClass "IOStorage" + +/*! + * @defined kIOStorageCategory + * @abstract + * kIOStorageCategory is a value for IOService's kIOMatchCategoryKey property. + * @discussion + * The kIOStorageCategory value is the standard value for the IOService property + * kIOMatchCategoryKey ("IOMatchCategory") for all storage drivers. All storage + * objects that expect to drive new content (that is, produce new media objects) + * are expected to compete within the kIOStorageCategory namespace. + * + * See the IOService documentation for more information on match categories. + */ + +#define kIOStorageCategory "IOStorage" /* (as IOMatchCategory) */ + +/*! + * @defined kIOStorageFeaturesKey + * @abstract + * A property of any object in the storage stack. + * @discussion + * kIOStorageFeaturesKey is a property of any object in the storage stack that + * wishes to express support of additional features, such as Force Unit Access. + * It is typically defined in the device object below the block storage driver + * object. It has an OSDictionary value, where each entry describes one given + * feature. + */ + +#define kIOStorageFeaturesKey "IOStorageFeatures" + +/*! + * @defined kIOStorageFeatureBarrier + * @abstract + * Describes the presence of the Barrier feature. + * @discussion + * This property describes the ability of the storage stack to honor a write + * barrier, guaranteeing that on power loss, writes after the barrier will not + * be visible until all writes before the barrier are visible. It is one of the + * feature entries listed under the top-level kIOStorageFeaturesKey property + * table. It has an OSBoolean value. + */ + +#define kIOStorageFeatureBarrier "Barrier" + +/*! + * @defined kIOStorageFeatureForceUnitAccess + * @abstract + * Describes the presence of the Force Unit Access feature. + * @discussion + * This property describes the ability of the storage stack to force a request + * to access the media. It is one of the feature entries listed under the top- + * level kIOStorageFeaturesKey property table. It has an OSBoolean value. + */ + +#define kIOStorageFeatureForceUnitAccess "Force Unit Access" + +/*! + * @defined kIOStorageFeaturePriority + * @abstract + * Describes the presence of the Priority feature. + * @discussion + * This property describes the ability of the storage stack to enforce the + * priority of a request. It is one of the feature entries listed under the + * top-level kIOStorageFeaturesKey property table. It has an OSBoolean value. + */ + +#define kIOStorageFeaturePriority "Priority" + +/*! + * @defined kIOStorageFeatureUnmap + * @abstract + * Describes the presence of the Unmap feature. + * @discussion + * This property describes the ability of the storage stack to delete unused + * data from the media. It is one of the feature entries listed under the top- + * level kIOStorageFeaturesKey property table. It has an OSBoolean value. + */ + +#define kIOStorageFeatureUnmap "Unmap" + +#ifdef KERNEL +#ifdef __cplusplus + +/* + * Kernel + */ + +#include <IOKit/assert.h> +#include <IOKit/IOMemoryDescriptor.h> +#include <IOKit/IOService.h> + +/*! + * @enum IOStorageAccess + * @discussion + * The IOStorageAccess enumeration describes the possible access levels for open + * requests. + * @constant kIOStorageAccessNone + * No access is requested; should not be passed to open(). + * @constant kIOStorageAccessReader + * Read-only access is requested. + * @constant kIOStorageAccessReaderWriter + * Read and write access is requested. + * @constant kIOStorageAccessSharedLock + * Shared access is requested. + * @constant kIOStorageAccessExclusiveLock + * Exclusive access is requested. + */ + +enum +{ + kIOStorageAccessNone = 0x00, + kIOStorageAccessReader = 0x01, + kIOStorageAccessReaderWriter = 0x03, + kIOStorageAccessSharedLock = 0x04, + kIOStorageAccessExclusiveLock = 0x08 +}; + +typedef UInt32 IOStorageAccess; + +/*! + * @enum IOStorageOptions + * @discussion + * Options for read and write storage requests. + * @constant kIOStorageOptionForceUnitAccess + * Force the request to access the media. + * @constant kIOStorageOptionIsEncrypted + * The data is already encrypted. + * @constant kIOStorageOptionIsStatic + * The data is likely to remain unaltered. + */ + +enum +{ + kIOStorageOptionNone = 0x0000, + kIOStorageOptionForceUnitAccess = 0x0001, + kIOStorageOptionIsEncrypted = 0x0010, + kIOStorageOptionIsStatic = 0x0020, + kIOStorageOptionReserved = 0xFFCE +}; + +typedef UInt16 IOStorageOptions; + +/*! + * @enum IOStoragePriority + * @discussion + * Priority of read and write storage requests. The lower the value, the + * higher the priority. + * @constant kIOStoragePriorityHigh + * This priority should only be used for I/O that is critical to system + * responsiveness. + * @constant kIOStoragePriorityDefault + * This priority is for work requested by the user, but that is not the user's + * current focus. + * @constant kIOStoragePriorityLow + * This priority is for short-running background work. + * @constant kIOStoragePriorityBackground + * This priority is for long-running, I/O intensive background work, such as + * backups, search indexing, or file synchronization. + */ + +enum +{ + kIOStoragePriorityHigh = 63, /* 0 to 63 */ + kIOStoragePriorityDefault = 127, /* 64 to 127 */ + kIOStoragePriorityLow = 191, /* 128 to 191 */ + kIOStoragePriorityBackground = 255 /* 192 to 255 */ +}; + +typedef UInt8 IOStoragePriority; + +/*! + * @enum IOStorageSynchronizeOptions + * @discussion + * Options for synchronize storage requests. + * @constant kIOStorageSynchronizeOptionBarrier + * Issue a write barrier only. + */ + +enum +{ + kIOStorageSynchronizeOptionNone = 0x00000000, + kIOStorageSynchronizeOptionBarrier = 0x00000002, + kIOStorageSynchronizeOptionReserved = 0xFFFFFFFD +}; + +typedef UInt32 IOStorageSynchronizeOptions; + +/*! + * @enum IOStorageUnmapOptions + * @discussion + * Options for unmap storage requests. + */ + +enum +{ + kIOStorageUnmapOptionReserved = 0xFFFFFFFF +}; + +typedef UInt32 IOStorageUnmapOptions; + +/*! + * @struct IOStorageAttributes + * @discussion + * Attributes of read and write storage requests. + * @field options + * Options for the request. See IOStorageOptions. + * @field priority + * Priority of the request. See IOStoragePriority. + * @field bufattr + * Reserved for future use. Set to zero. + */ + +struct IOStorageAttributes +{ + IOStorageOptions options; + IOStoragePriority priority; + UInt8 reserved0024; + UInt32 reserved0032; + UInt64 reserved0064; + UInt64 adjustedOffset; + bufattr_t bufattr; +}; + +/*! + * @struct IOStorageExtent + * @discussion + * Extent for unmap storage requests. + * @field byteStart + * Starting byte offset for the operation. + * @field byteCount + * Size of the operation. + */ + +struct IOStorageExtent +{ + UInt64 byteStart; + UInt64 byteCount; +}; + +/*! + * @enum IOStorageProvisionTypes + * @discussion + * Device block provision types, such as mapped, deallocated, or anchored. See SCSI + * SBC4 specifiction, LBA status descriptor for definitions. + */ + +enum +{ + kIOStorageProvisionTypeMapped = 0x00, + kIOStorageProvisionTypeDeallocated = 0x01, + kIOStorageProvisionTypeAnchored = 0x02 +}; + +typedef UInt64 IOStorageGetProvisionStatusOptions; +/*! + * @struct IOStorageProvisionExtent + * @discussion + * Extent for provision status. + * @field byteStart + * Starting byte offset for the operation. + * @field byteCount + * Size of the operation. + * @field provisionType + * Block provision type. See IOStorageProvisionTypes. + */ + +struct IOStorageProvisionExtent +{ + UInt64 byteStart; + UInt64 byteCount; + UInt8 provisionType; + UInt8 reserved[7]; +}; + +/*! + * @typedef IOStorageCompletionAction + * @discussion + * The IOStorageCompletionAction declaration describes the C (or C++) completion + * routine that is called once an asynchronous storage operation completes. + * @param target + * Opaque client-supplied pointer (or an instance pointer for a C++ callback). + * @param parameter + * Opaque client-supplied pointer. + * @param status + * Status of the data transfer. + * @param actualByteCount + * Actual number of bytes transferred in the data transfer. + */ + +typedef void (*IOStorageCompletionAction)(void * target, + void * parameter, + IOReturn status, + UInt64 actualByteCount); + +/*! + * @struct IOStorageCompletion + * @discussion + * The IOStorageCompletion structure describes the C (or C++) completion routine + * that is called once an asynchronous storage operation completes. The values + * passed for the target and parameter fields will be passed to the routine when + * it is called. + * @field target + * Opaque client-supplied pointer (or an instance pointer for a C++ callback). + * @field action + * Completion routine to call on completion of the data transfer. + * @field parameter + * Opaque client-supplied pointer. + */ + +struct IOStorageCompletion +{ + void * target; + IOStorageCompletionAction action; + void * parameter; +}; + +/*! + * @class IOStorage + * @abstract + * The common base class for mass storage objects. + * @discussion + * The IOStorage class is the common base class for mass storage objects. It is + * an abstract class that defines the open/close/read/write APIs that need to be + * implemented in a given subclass. Synchronous versions of the read/write APIs + * are provided here -- they are coded in such a way as to wrap the asynchronous + * versions implemented in the subclass. + */ + +class IOStorage : public IOService +{ + OSDeclareAbstractStructors(IOStorage); + +protected: + + struct ExpansionData { /* */ }; + ExpansionData * _expansionData; + + /*! + * @function handleOpen + * @discussion + * The handleOpen method grants or denies permission to access this object + * to an interested client. The argument is an IOStorageAccess value that + * specifies the level of access desired -- reader or reader-writer. + * + * This method can be invoked to upgrade or downgrade the access level for + * an existing client as well. The previous access level will prevail for + * upgrades that fail, of course. A downgrade should never fail. If the + * new access level should be the same as the old for a given client, this + * method will do nothing and return success. In all cases, one, singular + * close-per-client is expected for all opens-per-client received. + * @param client + * Client requesting the open. + * @param options + * Options for the open. Set to zero. + * @param access + * Access level for the open. Set to kIOStorageAccessReader or + * kIOStorageAccessReaderWriter. + * @result + * Returns true if the open was successful, false otherwise. + */ + + virtual bool handleOpen(IOService * client, + IOOptionBits options, + void * access) APPLE_KEXT_OVERRIDE = 0; + + /*! + * @function handleIsOpen + * @discussion + * The handleIsOpen method determines whether the specified client, or any + * client if none is specified, presently has an open on this object. + * @param client + * Client to check the open state of. Set to zero to check the open state + * of all clients. + * @result + * Returns true if the client was (or clients were) open, false otherwise. + */ + + virtual bool handleIsOpen(const IOService * client) const APPLE_KEXT_OVERRIDE = 0; + + /*! + * @function handleClose + * @discussion + * The handleClose method closes the client's access to this object. + * @param client + * Client requesting the close. + * @param options + * Options for the close. Set to zero. + */ + + virtual void handleClose(IOService * client, IOOptionBits options) APPLE_KEXT_OVERRIDE = 0; + +public: + +#if TARGET_OS_OSX && defined(__x86_64__) + virtual bool attach(IOService * provider) APPLE_KEXT_OVERRIDE; +#endif /* TARGET_OS_OSX && defined(__x86_64__) */ + + /*! + * @function complete + * @discussion + * Invokes the specified completion action of the read/write request. If + * the completion action is unspecified, no action is taken. This method + * serves simply as a convenience to storage subclass developers. + * @param completion + * Completion information for the data transfer. + * @param status + * Status of the data transfer. + * @param actualByteCount + * Actual number of bytes transferred in the data transfer. + */ + + static void complete(IOStorageCompletion * completion, + IOReturn status, + UInt64 actualByteCount = 0); + + /*! + * @function open + * @discussion + * Ask the storage object for permission to access its contents; the method + * is equivalent to IOService::open(), but with the correct parameter types. + * + * This method may also be invoked to upgrade or downgrade the access of an + * existing open (if it fails, the existing open prevails). + * @param client + * Client requesting the open. + * @param options + * Options for the open. Set to zero. + * @param access + * Access level for the open. Set to kIOStorageAccessReader or + * kIOStorageAccessReaderWriter. + * @result + * Returns true if the open was successful, false otherwise. + */ + + virtual bool open(IOService * client, + IOOptionBits options, + IOStorageAccess access); + + /*! + * @function read + * @discussion + * Read data from the storage object at the specified byte offset into the + * specified buffer, synchronously. When the read completes, this method + * will return to the caller. The actual byte count field is optional. + * @param client + * Client requesting the read. + * @param byteStart + * Starting byte offset for the data transfer. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param attributes + * Attributes of the data transfer. See IOStorageAttributes. + * @param actualByteCount + * Returns the actual number of bytes transferred in the data transfer. + * @result + * Returns the status of the data transfer. + */ + + virtual IOReturn read(IOService * client, + UInt64 byteStart, + IOMemoryDescriptor * buffer, + IOStorageAttributes * attributes = 0, + UInt64 * actualByteCount = 0); + + /*! + * @function write + * @discussion + * Write data into the storage object at the specified byte offset from the + * specified buffer, synchronously. When the write completes, this method + * will return to the caller. The actual byte count field is optional. + * @param client + * Client requesting the write. + * @param byteStart + * Starting byte offset for the data transfer. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param attributes + * Attributes of the data transfer. See IOStorageAttributes. + * @param actualByteCount + * Returns the actual number of bytes transferred in the data transfer. + * @result + * Returns the status of the data transfer. + */ + + virtual IOReturn write(IOService * client, + UInt64 byteStart, + IOMemoryDescriptor * buffer, + IOStorageAttributes * attributes = 0, + UInt64 * actualByteCount = 0); + +#if TARGET_OS_OSX && defined(__x86_64__) + virtual IOReturn synchronizeCache(IOService * client) __attribute__ ((deprecated)); +#endif /* TARGET_OS_OSX && defined(__x86_64__) */ + + /*! + * @function read + * @discussion + * Read data from the storage object at the specified byte offset into the + * specified buffer, asynchronously. When the read completes, the caller + * will be notified via the specified completion action. + * + * The buffer will be retained for the duration of the read. + * @param client + * Client requesting the read. + * @param byteStart + * Starting byte offset for the data transfer. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param attributes + * Attributes of the data transfer. See IOStorageAttributes. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + * @param completion + * Completion routine to call once the data transfer is complete. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + */ + + virtual void read(IOService * client, + UInt64 byteStart, + IOMemoryDescriptor * buffer, + IOStorageAttributes * attributes, + IOStorageCompletion * completion) = 0; + + /*! + * @function write + * @discussion + * Write data into the storage object at the specified byte offset from the + * specified buffer, asynchronously. When the write completes, the caller + * will be notified via the specified completion action. + * + * The buffer will be retained for the duration of the write. + * @param client + * Client requesting the write. + * @param byteStart + * Starting byte offset for the data transfer. + * @param buffer + * Buffer for the data transfer. The size of the buffer implies the size of + * the data transfer. + * @param attributes + * Attributes of the data transfer. See IOStorageAttributes. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + * @param completion + * Completion routine to call once the data transfer is complete. It is the + * responsibility of the callee to maintain the information for the duration + * of the data transfer, as necessary. + */ + + virtual void write(IOService * client, + UInt64 byteStart, + IOMemoryDescriptor * buffer, + IOStorageAttributes * attributes, + IOStorageCompletion * completion) = 0; + +#if TARGET_OS_OSX && defined(__x86_64__) + virtual IOReturn discard(IOService * client, + UInt64 byteStart, + UInt64 byteCount) __attribute__ ((deprecated)); +#endif /* TARGET_OS_OSX && defined(__x86_64__) */ + + /*! + * @function unmap + * @discussion + * Delete unused data from the storage object at the specified byte offsets. + * @param client + * Client requesting the operation. + * @param extents + * List of extents. See IOStorageExtent. It is legal for the callee to + * overwrite the contents of this buffer in order to satisfy the request. + * @param extentsCount + * Number of extents. + * @param options + * Options for the unmap. See IOStorageUnmapOptions. + * @result + * Returns the status of the operation. + */ + +#if TARGET_OS_OSX && defined(__x86_64__) + virtual IOReturn unmap(IOService * client, + IOStorageExtent * extents, + UInt32 extentsCount, + IOStorageUnmapOptions options = 0); /* 10.6.6 */ +#else /* !TARGET_OS_OSX || !defined(__x86_64__) */ + virtual IOReturn unmap(IOService * client, + IOStorageExtent * extents, + UInt32 extentsCount, + IOStorageUnmapOptions options = 0) = 0; +#endif /* !TARGET_OS_OSX || !defined(__x86_64__) */ + + /*! + * @function lockPhysicalExtents + * @discussion + * Lock the contents of the storage object against relocation temporarily, + * for the purpose of getting physical extents. + * @param client + * Client requesting the operation. + * @result + * Returns true if the lock was successful, false otherwise. + */ + + virtual bool lockPhysicalExtents(IOService * client); /* 10.7.0 */ + + /*! + * @function copyPhysicalExtent + * @discussion + * Convert the specified byte offset into a physical byte offset, relative + * to a physical storage object. This call should only be made within the + * context of lockPhysicalExtents(). + * @param client + * Client requesting the operation. + * @param byteStart + * Starting byte offset for the operation. Returns a physical byte offset, + * relative to the physical storage object, on success. + * @param byteCount + * Size of the operation. Returns the actual number of bytes which can be + * transferred, relative to the physical storage object, on success. + * @result + * A reference to the physical storage object, which should be released by + * the caller, or a null on error. + */ + + virtual IOStorage * copyPhysicalExtent(IOService * client, + UInt64 * byteStart, + UInt64 * byteCount); /* 10.7.0 */ + + /*! + * @function unlockPhysicalExtents + * @discussion + * Unlock the contents of the storage object for relocation again. This + * call must balance a successful call to lockPhysicalExtents(). + * @param client + * Client requesting the operation. + */ + + virtual void unlockPhysicalExtents(IOService * client); /* 10.7.0 */ + + /*! + * @function setPriority + * @discussion + * Reprioritize read or write requests at the specified byte offsets. + * @param client + * Client requesting the operation. + * @param extents + * List of extents. See IOStorageExtent. It is legal for the callee to + * overwrite the contents of this buffer in order to satisfy the request. + * @param extentsCount + * Number of extents. + * @param priority + * New priority. See IOStoragePriority. + * @result + * Returns the status of the operation. + */ + + virtual IOReturn setPriority(IOService * client, + IOStorageExtent * extents, + UInt32 extentsCount, + IOStoragePriority priority); /* 10.10.0 */ + + /*! + * @function synchronize + * @discussion + * Flush the cached data in the storage object, if any. + * @param client + * Client requesting the synchronization. + * @param byteStart + * Starting byte offset for the synchronization. + * @param byteCount + * Size of the synchronization. Set to zero to specify the end-of-media. + * @param options + * Options for the synchronization. See IOStorageSynchronizeOptions. + * @result + * Returns the status of the synchronization. + */ + +#if TARGET_OS_OSX && defined(__x86_64__) + virtual IOReturn synchronize(IOService * client, + UInt64 byteStart, + UInt64 byteCount, + IOStorageSynchronizeOptions options = 0); /* 10.11.0 */ +#else /* !TARGET_OS_OSX || !defined(__x86_64__) */ + virtual IOReturn synchronize(IOService * client, + UInt64 byteStart, + UInt64 byteCount, + IOStorageSynchronizeOptions options = 0) = 0; +#endif /* !TARGET_OS_OSX || !defined(__x86_64__) */ + + /*! + * @function getProvisionStatus + * @discussion + * Get device block provision status + * @param client + * Client requesting the synchronization. + * @param byteStart + * Byte offset of logical extent on the device. + * @param byteCount + * Byte length of logical extent on the device, 0 mean the entire remaining space. + * @param extentsCount + * Number of extents allocated in extents. On return, this parameter indicate number + * of provision extents returned. + * @param extents + * List of provision extents. See IOStorageProvisionExtents. + * @param options + * Options for get provision status. See IOStorageGetProvisionStatusOptions. + * @result + * Returns the status of the getProvisionStatus. + */ + + virtual IOReturn getProvisionStatus(IOService * client, + UInt64 byteStart, + UInt64 byteCount, + UInt32 * extentsCount, + IOStorageProvisionExtent * extents, + IOStorageGetProvisionStatusOptions options = 0 ); /* 10.12.0 */ + + OSMetaClassDeclareReservedUsed(IOStorage, 0); + OSMetaClassDeclareReservedUsed(IOStorage, 1); + OSMetaClassDeclareReservedUsed(IOStorage, 2); + OSMetaClassDeclareReservedUsed(IOStorage, 3); + OSMetaClassDeclareReservedUsed(IOStorage, 4); + OSMetaClassDeclareReservedUsed(IOStorage, 5); + OSMetaClassDeclareReservedUsed(IOStorage, 6); + OSMetaClassDeclareReservedUnused(IOStorage, 7); + OSMetaClassDeclareReservedUnused(IOStorage, 8); + OSMetaClassDeclareReservedUnused(IOStorage, 9); + OSMetaClassDeclareReservedUnused(IOStorage, 10); + OSMetaClassDeclareReservedUnused(IOStorage, 11); + OSMetaClassDeclareReservedUnused(IOStorage, 12); + OSMetaClassDeclareReservedUnused(IOStorage, 13); + OSMetaClassDeclareReservedUnused(IOStorage, 14); + OSMetaClassDeclareReservedUnused(IOStorage, 15); +}; + +#if TARGET_OS_OSX && defined(__x86_64__) +#ifdef KERNEL_PRIVATE +#define _kIOStorageSynchronizeOption_super__synchronizeCache 0xFFFFFFFF +#define _respondsTo_synchronizeCache ( IOStorage::_expansionData ) +#endif /* KERNEL_PRIVATE */ +#endif /* TARGET_OS_OSX && defined(__x86_64__) */ + +#endif /* __cplusplus */ +#endif /* KERNEL */ +#endif /* !_IOSTORAGE_H */ diff --git a/QualcommWireless/include/IOKit/storage/IOStorageCardCharacteristics.h b/QualcommWireless/include/IOKit/storage/IOStorageCardCharacteristics.h new file mode 100644 index 0000000..143b584 --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOStorageCardCharacteristics.h @@ -0,0 +1,490 @@ +/* + * Copyright (c) 1998-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IO_STORAGE_CARD_CHARACTERISTICS_H_ +#define _IOKIT_IO_STORAGE_CARD_CHARACTERISTICS_H_ + + +/* + * Card Characteristics - Characteristics defined for cards. + */ + +/*! +@defined kIOPropertyCardCharacteristicsKey +@discussion This key is used to define Card Characteristics for a particular +piece of MMC/SD media and it has an associated dictionary which lists the +card characteristics. + +Requirement: Mandatory + +Example: +<pre> +@textblock +<dict> + <key>Card Characteristics</key> + <dict> + <key>Product Name</key> + <string>SD32G</string> + <key>Product Revision Level</key> + <string>1.0</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyCardCharacteristicsKey "Card Characteristics" + + +/*! +@defined kIOPropertySlotKey +@discussion This key is used to define the slot number for the device + +Requirement: Mandatory + +Example: +<pre> +@textblock +<dict> + <key>Slot</key> + <integer>1<integer> + </dict> +@/textblock +</pre> +*/ +#define kIOPropertySlotKey "Slot" + + +/*! +@defined kIOProperty64BitKey +@discussion This key defines wether the device supports 64-bit. + +Requirement: Mandatory + +Example: +<pre> +@textblock +<dict> + <key>64-bit</key> + <true/> +</dict> +@/textblock +</pre> +*/ +#define kIOProperty64BitKey "64-bit" + + +/*! +@defined kIOPropertyClockDivisorKey + @discussion This key defines the current clock divisor for the device. + +Requirement: Mandatory. + +Example: +<pre> +@textblock +<dict> + <key>Clock Divisor</key> + <integer>128</integer> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyClockDivisorKey "Clock Divisor" + + +/*! +@defined kIOPropertyBaseFrequencyKey +@discussion This key defines the current base frequency for the device. + +Requirement: Mandatory. + +Example: +<pre> +@textblock +<dict> + <key>Base Frequency</key> + <integer>50</integer> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyBaseFrequencyKey "Base Frequency" + + +/*! +@defined kIOPropertyBusVoltageKey +@discussion This key defines the current bus voltage for the device in mV + +Requirement: Mandatory. + +Example: +<pre> +@textblock +<dict> + <key>Bus Voltage</key> + <integer>3300</integer> +</dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyBusVoltageKey "Bus Voltage" + + +/*! +@defined kIOPropertyBusWidthKey +@discussion This key defines the current bus width for the device. + +Requirement: Mandatory. + +Example: +<pre> +@textblock +<dict> + <key>Bus Width</key> + <integer>4</integer> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyBusWidthKey "Bus Width" + + +/*! +@defined kIOPropertyCardPresentKey +@discussion This key defines wether a MMC or SD card is physically present. + +Requirement: Mandatory + +Example: +<pre> +@textblock +<dict> + <key>Card Present</key> + <true/> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyCardPresentKey "Card Present" + + +/*! + @defined kIOPropertyProductSerialNumberKey + @discussion This key is used to indicate the card serial number ID. + + Requirement: Mandatory + + Example: + <pre> + @textblock + <dict> + <key>Card Characteristics</key> + <dict> + <key>Product Name</key> + <string>SD32G</string> + <key>Product Revision Level</key> + <string>1.0</string> + <key>Card Type</key> + <string>SDHC</string> + <key>Serial Number</key> + <data>0045ff</data> + </dict> + </dict> + @/textblock + </pre> + */ +#define kIOPropertyProductSerialNumberKey "Serial Number" + + +/*! + @defined kIOPropertyManufacturerIDKey + @discussion This key is used to indicate the card manufacturer ID. + + Requirement: Optional + + Example: + <pre> + @textblock + <dict> + <key>Card Characteristics</key> + <dict> + <key>Product Name</key> + <string>SD32G</string> + <key>Product Revision Level</key> + <string>1.0</string> + <key>Card Type</key> + <string>SDHC</string> + <key>Manufacturer ID</key> + <data>03</data> + </dict> + </dict> + @/textblock + </pre> + */ +#define kIOPropertyManufacturerIDKey "Manufacturer ID" + + +/*! +@defined kIOPropertyApplicationIDKey + @discussion This key is used to indicate the card application ID. + +Requirement: Optional + +Example: +<pre> +@textblock +<dict> + <key>Card Characteristics</key> + <dict> + <key>Product Name</key> + <string>SD32G</string> + <key>Product Revision Level</key> + <string>1.0</string> + <key>Card Type</key> + <string>SDHC</string> + <key>Application ID</key> + <data>ffff</data> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyApplicationIDKey "Application ID" + + +/*! +@defined kIOPropertyManufacturingDateKey + @discussion This key is used to indicate the card manufacturing date. + +Requirement: Mandatory. + +Example: +<pre> +@textblock +<dict> + <key>Card Characteristics</key> + <dict> + <key>Product Name</key> + <string>SD32G</string> + <key>Product Revision Level</key> + <string>1.0</string> + <key>Card Type</key> + <string>SDHC</string> + <key>Manufacturing Date</key> + <string>2009-12</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyManufacturingDateKey "Manufacturing Date" + + +/*! +@defined kIOPropertySpeedClassKey + @discussion This key is used to indicate SD card speed class. + +Requirement: Mandatory. + +Example: +<pre> +@textblock +<dict> + <key>Card Characteristics</key> + <dict> + <key>Product Name</key> + <string>SD32G</string> + <key>Product Revision Level</key> + <string>1.0</string> + <key>Card Type</key> + <string>SDHC</string> + <key>Speed Class</key> + <data>02</data> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertySpeedClassKey "Speed Class" + + +/*! +@defined kIOPropertySpecificationVersionKey +@discussion This key is used to indicate the card specification version. + +Requirement: Mandatory. + +Example: +<pre> +@textblock +<dict> + <key>Card Characteristics</key> + <dict> + <key>Product Name</key> + <string>SD32G</string> + <key>Product Revision Level</key> + <string>1.0</string> + <key>Card Type</key> + <string>SDHC</string> + <key>Specification Version</key> + <string>3.0</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertySpecificationVersionKey "Specification Version" + + +/*! +@defined kIOPropertyCardTypeKey + @discussion This key is used to indicate the card type is MMC. + +Requirement: Optional. + +Example: +<pre> +@textblock +<dict> + <key>Card Characteristics</key> + <dict> + <key>Product Name</key> + <string>SD32G</string> + <key>Product Revision Level</key> + <string>1.0</string> + <key>Card Type</key> + <string>MMC</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyCardTypeKey "Card Type" + + +/*! +@defined kIOPropertyCardTypeMMCKey + @discussion This key is used to indicate the card type is MMC. + + Requirement: Optional. + +Example: +<pre> +@textblock +<dict> + <key>Card Characteristics</key> + <dict> + <key>Product Name</key> + <string>SD32G</string> + <key>Product Revision Level</key> + <string>1.0</string> + <key>Card Type</key> + <string>MMC</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyCardTypeMMCKey "MMC" + + +/*! +@defined kIOPropertyCardTypeSDSCKey + @discussion This key is used to indicate the card type is SDSC. + +Requirement: Optional. + +Example: +<pre> +@textblock +<dict> + <key>Card Characteristics</key> + <dict> + <key>Product Name</key> + <string>SD32G</string> + <key>Product Revision Level</key> + <string>1.0</string> + <key>Card Type</key> + <string>SDSC</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyCardTypeSDSCKey "SDSC" + + +/*! +@defined kIOPropertyCardTypeSDHCKey + @discussion This key is used to indicate the card type is SDHC. + +Requirement: Optional. + +Example: +<pre> +@textblock +<dict> + <key>Card Characteristics</key> + <dict> + <key>Product Name</key> + <string>SD32G</string> + <key>Product Revision Level</key> + <string>1.0</string> + <key>Card Type</key> + <string>SDHC</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyCardTypeSDHCKey "SDHC" + + +/*! +@defined kIOPropertyCardTypeSDXCKey + @discussion This key is used to indicate the card type is SDXC. + +Requirement: Optional. + +Example: +<pre> +@textblock +<dict> + <key>Card Characteristics</key> + <dict> + <key>Product Name</key> + <string>SD32G</string> + <key>Product Revision Level</key> + <string>1.0</string> + <key>Card Type</key> + <string>SDXC</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyCardTypeSDXCKey "SDXC" + + +#endif /* _IOKIT_IO_STORAGE_CARD_CHARACTERISTICS_H_ */ diff --git a/QualcommWireless/include/IOKit/storage/IOStorageControllerCharacteristics.h b/QualcommWireless/include/IOKit/storage/IOStorageControllerCharacteristics.h new file mode 100644 index 0000000..2705809 --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOStorageControllerCharacteristics.h @@ -0,0 +1,1346 @@ +/* + * Copyright (c) 1998-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IO_STORAGE_CONTROLLER_CHARACTERISTICS_H_ +#define _IOKIT_IO_STORAGE_CONTROLLER_CHARACTERISTICS_H_ + + +/* + * Controller Characteristics - Characteristics defined for controllers. + */ + + +/*! +@defined kIOPropertyControllerCharacteristicsKey +@discussion This key is used to define Controller Characteristics for a particular +device and it has an associated dictionary which lists the +controller characteristics. + +Requirement: Mandatory + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Speed</key> + <string>Automatic</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyControllerCharacteristicsKey "Controller Characteristics" + + +/*! +@defined kIOPropertySASAddressKey +@discussion This key is the unique 64-bit SAS Address for the device server +node located at this port, or for the initiating host port. + +Requirement: Mandatory for SAS. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>SAS Address</key> + <data>0011223344556677</data> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertySASAddressKey "SAS Address" + + +/*! +@defined kIOPropertySCSIPortIdentifierKey +@discussion This key is the unique port identifier for the device server +node located at this port, or for the initiating host port. The format for +this data is allowed to be vendor-specific, as long as it is guaranteed to +be unique. Length is arbitrary, to allow for itnerfaces with non-standard +identifier rules. It is recommended to have this be a copy of an existing +standard unique identifier for this port, should one already exist for your +interface type + +Requirement: Mandatory. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Unique SCSI Port Identifier</key> + <data>0011223344556677</data> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertySCSIPortIdentifierKey "Unique SCSI Port Identifier" + + +/*! +@defined kIOPropertyFibreChannelNodeWorldWideNameKey +@discussion This key is the unique 64-bit World Wide Name for the device server +node located at this port, or for the initiating host port. + +Requirement: Mandatory for Fibre Channel Interface. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Node World Wide Name</key> + <data>0011223344556677</data> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyFibreChannelNodeWorldWideNameKey "Node World Wide Name" + + +/*! +@defined kIOPropertyFibreChannelPortWorldWideNameKey +@discussion This key is the unique 64-bit World Wide Name for the port. + +Requirement: Mandatory for Fibre Channel Interface. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port World Wide Name</key> + <data>0011223344556677</data> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyFibreChannelPortWorldWideNameKey "Port World Wide Name" + + +/*! +@defined kIOPropertyFibreChannelAddressIdentifierKey +@discussion This key is the 24-bit Address Identifier (S_ID or D_ID) as +defined in the FC-FS specification. It contains the address identifier +of the source or destination Nx_Port. + +Note: This value can change. It is not a static value. + +Requirement: Optional (only necessary for Fibre Channel Interface). + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Address Identifier</key> + <data>001122</data> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyFibreChannelAddressIdentifierKey "Address Identifier" + + +/*! +@defined kIOPropertyFibreChannelALPAKey +@discussion This key is the 8-bit Arbitrated Loop Physical Address +(AL_PA) value as defined in the FC-AL-2 specification. + +Note: This value can change. It is not a static value. + +Requirement: Optional (only necessary for Fibre Channel Interface). + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>AL_PA</key> + <data>04</data> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyFibreChannelALPAKey "AL_PA" + + +/*! +@defined kIOPropertyPortStatusKey +@discussion This key is associated with the current port +status of the physical link. The port status is either +"Link Established", "No Link Established", or "Link Failed". + +Note: This value can change when the port status changes. It +is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Status</key> + <string>Link Established</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortStatusKey "Port Status" + + +/*! +@defined kIOPropertyPortSpeedKey +@discussion This key is associated with the current port +speed. The port speed can be any valid speed for the interconnect. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Speed</key> + <string>Automatic (1 Gigabit)</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortSpeedKey "Port Speed" + + +/*! +@defined kIOPropertyPortTopologyKey +@discussion This key is associated with the current port +topology. The port topology can be any valid topology for the interconnect. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Topology</key> + <string>Automatic (N_Port)</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortTopologyKey "Port Topology" + + +/*! +@defined kIOPropertyPortDescriptionKey +@discussion This key is associated with an human +readable port description. Examples include +"Channel A", "Port 1", etc. + +Requirement: Optional for all interconnects. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Description</key> + <string>Channel A</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortDescriptionKey "Port Description" + + +/*! +@defined kIOPropertySCSIParallelSignalingTypeKey +@discussion This key is associated with the signaling type +used for this SCSI Parallel bus. Valid values include +"High Voltage Differential", "Low Voltage Differential", +and "Single Ended". + +Requirement: Optional for SCSI Parallel Interface. Not +defined for any other physical interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>SCSI Parallel Signaling Type</key> + <string>High Voltage Differential</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertySCSIParallelSignalingTypeKey "SCSI Parallel Signaling Type" + + +/*! +@defined kIOPropertyFibreChannelCableDescriptionKey +@discussion This key is associated with the cabling type +used for this Fibre Channel port. Valid values include +"Copper" and "Fiber Optic". + +Requirement: Optional for Fibre Channel Interface. Not +defined for any other physical interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Fibre Channel Cabling Type</key> + <string>Copper</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyFibreChannelCableDescriptionKey "Fibre Channel Cabling Type" + + +/*! +@defined kIOPropertyEncryptionTypeKey +@discussion This key is associated with the encryption type +used for this storage controller. Valid values currently include +"AES-XTS", "AES-XEX" and "AES-CBC". + +Requirement: Optional for all storage controllers. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Encryption Type</key> + <string>AES-XTS</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyEncryptionTypeKey "Encryption Type" + + +/*! +@defined kIOPropertyLowPowerModeKey +@discussion This key is associated with whether the storage +device has low-power mode enabled. If enabled, it will set this +key to true. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Low Power Mode</key> + <true/> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyLowPowerModeKey "Low Power Mode" + + +/* + * Values - Values for the characteristics defined above. + */ + + +/*! +@defined kIOPropertyPortStatusLinkEstablishedKey +@discussion This key defines the value of Link Established for the key +kIOPropertyPortStatusKey. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Status</key> + <string>Link Established</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortStatusLinkEstablishedKey "Link Established" + + +/*! +@defined kIOPropertyPortStatusNoLinkEstablishedKey +@discussion This key defines the value of No Link Established for the key +kIOPropertyPortStatusKey. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Status</key> + <string>No Link Established</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortStatusNoLinkEstablishedKey "No Link Established" + + +/*! +@defined kIOPropertyPortStatusLinkFailedKey +@discussion This key defines the value of Link Failed for the key +kIOPropertyPortStatusKey. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Status</key> + <string>Link Failed</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortStatusLinkFailedKey "Link Failed" + + +/*! +@defined kIOPropertyPortSpeedAutomaticKey +@discussion This key defines the value of Automatic for the key +kIOPropertyPortSpeedKey. If the speed of the port is automatically +adjusted by the host/device and a definitive speed is not known, +this key should be used. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Speed</key> + <string>Automatic</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortSpeedAutomaticKey "Automatic" + + +/*! +@defined kIOPropertyPortSpeed1GigabitKey +@discussion This key defines the value of 1 Gigabit for the key +kIOPropertyPortSpeedKey. If the speed of the port is 1 Gigabit +per second and is not automatically determined (i.e. the user +configured the port to be exactly this speed), +this key should be used. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Speed</key> + <string>1 Gigabit</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortSpeed1GigabitKey "1 Gigabit" + +/*! +@defined kIOPropertyPortSpeed1_5GigabitKey +@discussion This key defines the value of 1.5 Gigabit for the key +kIOPropertyPortSpeedKey. If the speed of the port is 1.5 Gigabits +per second and is not automatically determined (i.e. the user +configured the port to be exactly this speed), +this key should be used. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Speed</key> + <string>1.5 Gigabit</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortSpeed1_5GigabitKey "1.5 Gigabit" + + +/*! +@defined kIOPropertyPortSpeed2GigabitKey +@discussion This key defines the value of 2 Gigabit for the key +kIOPropertyPortSpeedKey. If the speed of the port is 2 Gigabits +per second and is not automatically determined (i.e. the user +configured the port to be exactly this speed), +this key should be used. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Speed</key> + <string>2 Gigabit</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortSpeed2GigabitKey "2 Gigabit" + + +/*! +@defined kIOPropertyPortSpeed3GigabitKey +@discussion This key defines the value of 3 Gigabit for the key +kIOPropertyPortSpeedKey. If the speed of the port is 3 Gigabits +per second and is not automatically determined (i.e. the user +configured the port to be exactly this speed), +this key should be used. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Speed</key> + <string>3 Gigabit</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortSpeed3GigabitKey "3 Gigabit" + + +/*! +@defined kIOPropertyPortSpeed4GigabitKey +@discussion This key defines the value of 4 Gigabit for the key +kIOPropertyPortSpeedKey. If the speed of the port is 4 Gigabits +per second and is not automatically determined (i.e. the user +configured the port to be exactly this speed), +this key should be used. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Speed</key> + <string>4 Gigabit</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortSpeed4GigabitKey "4 Gigabit" + +/*! +@defined kIOPropertyPortSpeed6GigabitKey +@discussion This key defines the value of 6 Gigabit for the key +kIOPropertyPortSpeedKey. If the speed of the port is 6 Gigabits +per second and is not automatically determined (i.e. the user +configured the port to be exactly this speed), +this key should be used. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Speed</key> + <string>6 Gigabit</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortSpeed6GigabitKey "6 Gigabit" + + +/*! +@defined kIOPropertyPortSpeed8GigabitKey +@discussion This key defines the value of 8 Gigabit for the key +kIOPropertyPortSpeedKey. If the speed of the port is 8 Gigabits +per second and is not automatically determined (i.e. the user +configured the port to be exactly this speed), +this key should be used. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Speed</key> + <string>8 Gigabit</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortSpeed8GigabitKey "8 Gigabit" + + +/*! +@defined kIOPropertyPortSpeed10GigabitKey +@discussion This key defines the value of 10 Gigabit for the key +kIOPropertyPortSpeedKey. If the speed of the port is 10 Gigabits +per second and is not automatically determined (i.e. the user +configured the port to be exactly this speed), +this key should be used. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Speed</key> + <string>10 Gigabit</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortSpeed10GigabitKey "10 Gigabit" + + +/*! +@defined kIOPropertyPortSpeed12GigabitKey +@discussion This key defines the value of 12 Gigabit for the key +kIOPropertyPortSpeedKey. If the speed of the port is 12 Gigabits +per second and is not automatically determined (i.e. the user +configured the port to be exactly this speed), +this key should be used. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Speed</key> + <string>12 Gigabit</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortSpeed12GigabitKey "12 Gigabit" + + +/*! +@defined kIOPropertyPortSpeed16GigabitKey +@discussion This key defines the value of 16 Gigabit for the key +kIOPropertyPortSpeedKey. If the speed of the port is 16 Gigabits +per second and is not automatically determined (i.e. the user +configured the port to be exactly this speed), +this key should be used. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Speed</key> + <string>16 Gigabit</string> + </dict> +</dict> +@/textblock +</pre> + */ +#define kIOPropertyPortSpeed16GigabitKey "16 Gigabit" + + +/*! +@defined kIOPropertyPortSpeed40GigabitKey +@discussion This key defines the value of 40 Gigabit for the key +kIOPropertyPortSpeedKey. If the speed of the port is 40 Gigabits +per second and is not automatically determined (i.e. the user +configured the port to be exactly this speed), +this key should be used. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Speed</key> + <string>40 Gigabit</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortSpeed40GigabitKey "40 Gigabit" + + +/*! +@defined kIOPropertyPortSpeedAutomatic1GigabitKey +@discussion This key defines the value of Automatic (1 Gigabit) +for the key kIOPropertyPortSpeedKey. If the speed of the port is +1 Gigabit per second and is automatically determined by host +software, this key should be used. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Speed</key> + <string>Automatic (1 Gigabit)</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortSpeedAutomatic1GigabitKey "Automatic (1 Gigabit)" + + +/*! +@defined kIOPropertyPortSpeedAutomatic1_5GigabitKey +@discussion This key defines the value of Automatic (1.5 Gigabit) for the key +kIOPropertyPortSpeedKey. If the speed of the port is +1.5 Gigabits per second and is automatically determined by host +software, this key should be used. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Speed</key> + <string>Automatic (1.5 Gigabit)</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortSpeedAutomatic1_5GigabitKey "Automatic (1.5 Gigabit)" + + +/*! +@defined kIOPropertyPortSpeedAutomatic2GigabitKey +@discussion This key defines the value of Automatic (2 Gigabit) +for the key kIOPropertyPortSpeedKey. If the speed of the port is +2 Gigabits per second and is automatically determined by host +software, this key should be used. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Speed</key> + <string>Automatic (2 Gigabit)</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortSpeedAutomatic2GigabitKey "Automatic (2 Gigabit)" + + +/*! +@defined kIOPropertyPortSpeedAutomatic3GigabitKey +@discussion This key defines the value of Automatic (3 Gigabit) +for the key kIOPropertyPortSpeedKey. If the speed of the port is +3 Gigabits per second and is automatically determined by host +software, this key should be used. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Speed</key> + <string>Automatic (3 Gigabit)</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortSpeedAutomatic3GigabitKey "Automatic (3 Gigabit)" + + +/*! +@defined kIOPropertyPortSpeedAutomatic4GigabitKey +@discussion This key defines the value of Automatic (4 Gigabit) +for the key kIOPropertyPortSpeedKey. If the speed of the port is +4 Gigabits per second and is automatically determined by host +software, this key should be used. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Speed</key> + <string>Automatic (4 Gigabit)</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortSpeedAutomatic4GigabitKey "Automatic (4 Gigabit)" + + +/*! +@defined kIOPropertyPortSpeedAutomatic6GigabitKey +@discussion This key defines the value of Automatic (6 Gigabit) +for the key kIOPropertyPortSpeedKey. If the speed of the port is +6 Gigabits per second and is automatically determined by host +software, this key should be used. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Speed</key> + <string>Automatic (6 Gigabit)</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortSpeedAutomatic6GigabitKey "Automatic (6 Gigabit)" + + +/*! +@defined kIOPropertyPortSpeedAutomatic8GigabitKey +@discussion This key defines the value of Automatic (8 Gigabit) +for the key kIOPropertyPortSpeedKey. If the speed of the port is +8 Gigabits per second and is automatically determined by host +software, this key should be used. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Speed</key> + <string>Automatic (8 Gigabit)</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortSpeedAutomatic8GigabitKey "Automatic (8 Gigabit)" + + +/*! +@defined kIOPropertyPortSpeedAutomatic10GigabitKey +@discussion This key defines the value of Automatic (10 Gigabit) +for the key kIOPropertyPortSpeedKey. If the speed of the port is +10 Gigabits per second and is automatically determined by host +software, this key should be used. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Speed</key> + <string>Automatic (10 Gigabit)</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortSpeedAutomatic10GigabitKey "Automatic (10 Gigabit)" + + +/*! +@defined kIOPropertyPortTopologyAutomaticKey +@discussion This key defines the value of Automatic for the key +kIOPropertyPortTopologyKey. If the topology of the port is automatically +adjusted by the host/device and a definitive topology is not known, +this key should be used. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Topology</key> + <string>Automatic</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortTopologyAutomaticKey "Automatic" + + +/*! +@defined kIOPropertyPortTopologyNPortKey +@discussion This key defines the value of N_Port for the key +kIOPropertyPortTopologyKey. If the topology of the port is an N_Port, +this key should be used. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Topology</key> + <string>N_Port</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortTopologyNPortKey "N_Port" + + +/*! +@defined kIOPropertyPortTopologyNLPortKey +@discussion This key defines the value of NL_Port for the key +kIOPropertyPortTopologyKey. If the topology of the port is an NL_Port, +this key should be used. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Topology</key> + <string>NL_Port</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortTopologyNLPortKey "NL_Port" + + +/*! +@defined kIOPropertyPortTopologyAutomaticNPortKey +@discussion This key defines the value of Automatic (N_Port) for the key +kIOPropertyPortTopologyKey. If the topology of the port is +N_Port and is automatically determined by host software, this +key should be used. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Topology</key> + <string>Automatic (N_Port)</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortTopologyAutomaticNPortKey "Automatic (N_Port)" + + +/*! +@defined kIOPropertyPortTopologyAutomaticNLPortKey +@discussion This key defines the value of Automatic (NL_Port) for the key +kIOPropertyPortTopologyKey. If the topology of the port is +NL_Port and is automatically determined by host software, this +key should be used. + +Note: This value can change. It is not a static value. + +Requirement: Optional for any interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Port Topology</key> + <string>Automatic (NL_Port)</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPortTopologyAutomaticNLPortKey "Automatic (NL_Port)" + + +/*! +@defined kIOPropertySCSIParallelSignalingTypeHVDKey +@discussion This key defines the value of High Voltage Differential for the key +kIOPropertySCSIParallelSignalingTypeKey. If the signaling type of the port is +High Voltage Differential, this key should be used. + +Requirement: Optional for SCSI Parallel Interface interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>SCSI Parallel Signaling Type</key> + <string>High Voltage Differential</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertySCSIParallelSignalingTypeHVDKey "High Voltage Differential" + + +/*! +@defined kIOPropertySCSIParallelSignalingTypeLVDKey +@discussion This key defines the value of Low Voltage Differential for the key +kIOPropertySCSIParallelSignalingTypeKey. If the signaling type of the port is +Low Voltage Differential, this key should be used. + +Requirement: Optional for SCSI Parallel Interface interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>SCSI Parallel Signaling Type</key> + <string>Low Voltage Differential</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertySCSIParallelSignalingTypeLVDKey "Low Voltage Differential" + + +/*! +@defined kIOPropertySCSIParallelSignalingTypeSEKey +@discussion This key defines the value of Single Ended for the key +kIOPropertySCSIParallelSignalingTypeKey. If the signaling type of the port is +Single Ended, this key should be used. + +Requirement: Optional for SCSI Parallel Interface interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>SCSI Parallel Signaling Type</key> + <string>Single Ended</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertySCSIParallelSignalingTypeSEKey "Single Ended" + + +/*! +@defined kIOPropertyFibreChannelCableDescriptionCopperKey +@discussion This key defines the value of Copper for the key +kIOPropertyFibreChannelCableDescriptionKey. If the cabling is +Copper, this key should be used. + +Requirement: Optional for Fibre Channel Interface interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Fibre Channel Cabling Type</key> + <string>Copper</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyFibreChannelCableDescriptionCopperKey "Copper" + + +/*! +@defined kIOPropertyFibreChannelCableDescriptionFiberOpticKey +@discussion This key defines the value of Fiber Optic for the key +kIOPropertyFibreChannelCableDescriptionKey. If the cabling is +Fiber Optic, this key should be used. + +Requirement: Optional for Fibre Channel Interface interconnect. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Fibre Channel Cabling Type</key> + <string>Fiber Optic</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyFibreChannelCableDescriptionFiberOpticKey "Fiber Optic" + + +/*! +@defined kIOPropertyAESCBCKey +@discussion This key defines the value of AES-CBC for the key +kIOPropertyEncryptionTypeKey. If the encryption used is +AES-CBC, this key should be used. + +Requirement: Optional for all storage controllers. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Encryption Type</key> + <string>AES-CBC</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyAESCBCKey "AES-CBC" + + +/*! +@defined kIOPropertyAESXTSKey +@discussion This key defines the value of AES-XTS for the key +kIOPropertyEncryptionTypeKey. If the encryption used is +AES-XTS, this key should be used. + +Requirement: Optional for all storage controllers. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Encryption Type</key> + <string>AES-XTS</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyAESXTSKey "AES-XTS" + + +/*! +@defined kIOPropertyAESXEXKey +@discussion This key defines the value of AES-XEX for the key +kIOPropertyEncryptionTypeKey. If the encryption used is +AES-XEX, this key should be used. + +Requirement: Optional for all storage controllers. + +Example: +<pre> +@textblock +<dict> + <key>Controller Characteristics</key> + <dict> + <key>Encryption Type</key> + <string>AES-XEX</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyAESXEXKey "AES-XEX" + + +#endif /* _IOKIT_IO_STORAGE_CONTROLLER_CHARACTERISTICS_H_ */ diff --git a/QualcommWireless/include/IOKit/storage/IOStorageDeviceCharacteristics.h b/QualcommWireless/include/IOKit/storage/IOStorageDeviceCharacteristics.h new file mode 100644 index 0000000..a262635 --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOStorageDeviceCharacteristics.h @@ -0,0 +1,687 @@ +/* + * Copyright (c) 1998-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IO_STORAGE_DEVICE_CHARACTERISTICS_H_ +#define _IOKIT_IO_STORAGE_DEVICE_CHARACTERISTICS_H_ + +#include <IOKit/storage/IOStorageProtocolCharacteristics.h> + +/* + * Device Characteristics - Characteristics defined for devices. + */ + +/*! +@defined kIOPropertyDeviceCharacteristicsKey +@discussion This key is used to define Device Characteristics for a particular +device and it has an associated dictionary which lists the +device characteristics. The device characteristics are Command Set specific +and are listed in the header files for each command set. + +Requirement: Mandatory + +Example: +<pre> +@textblock +<dict> + <key>Device Characteristics</key> + <dict> + <key>Vendor Name</key> + <string>Apple</string> + <key>Product Name</key> + <string>iPod</string> + <key>Product Revision Level</key> + <string>1.0</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyDeviceCharacteristicsKey "Device Characteristics" + + +/*! +@defined kIOPropertyVendorNameKey +@discussion This key is used to define the Vendor Name for a particular device +and it has an associated string. + +Requirement: Mandatory + +Example: +<pre> +@textblock +<dict> + <key>Device Characteristics</key> + <dict> + <key>Vendor Name</key> + <string>Apple</string> + <key>Product Name</key> + <string>iPod</string> + <key>Product Revision Level</key> + <string>1.0</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyVendorNameKey "Vendor Name" + + +/*! +@defined kIOPropertyProductNameKey +@discussion This key is used to define the Product Name for a particular device +and it has an associated string. + +Requirement: Mandatory + +Example: +<pre> +@textblock +<dict> + <key>Device Characteristics</key> + <dict> + <key>Vendor Name</key> + <string>Apple</string> + <key>Product Name</key> + <string>iPod</string> + <key>Product Revision Level</key> + <string>1.0</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyProductNameKey "Product Name" + + +/*! +@defined kIOPropertyProductRevisionLevelKey +@discussion This key is used to define the Product Revision Level for a +particular device and it has an associated string. + +Requirement: Mandatory + +Example: +<pre> +@textblock +<dict> + <key>Device Characteristics</key> + <dict> + <key>Vendor Name</key> + <string>Apple</string> + <key>Product Name</key> + <string>iPod</string> + <key>Product Revision Level</key> + <string>1.0</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyProductRevisionLevelKey "Product Revision Level" + + +/*! +@defined kIOPropertyProductSerialNumberKey +@discussion This key is used to define the Product Serial Number for a +particular device and it has an associated data. + +Requirement: Mandatory + +Example: +<pre> +@textblock +<dict> + <key>Device Characteristics</key> + <dict> + <key>Vendor Name</key> + <string>Apple</string> + <key>Product Name</key> + <string>iPod</string> + <key>Product Revision Level</key> + <string>1.0</string> + <key>Serial Number</key> + <string>123456789</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyProductSerialNumberKey "Serial Number" + + +/*! +@defined kIOPropertySupportedCDFeaturesKey +@discussion This key is used to define the supported CD Features for a +particular optical device and it has an associated bitfield. See +<IOKit/scsi/IOSCSIMultimediaCommandsDevice.h> for definitions of the +bits and associated bitmasks. + +Requirement: Mandatory for optical devices (Peripheral Device Type 05h). + +Example: +<pre> +@textblock +<dict> + <key>Device Characteristics</key> + <dict> + <key>Vendor Name</key> + <string>Apple</string> + <key>Product Name</key> + <string>SuperDrive</string> + <key>Product Revision Level</key> + <string>1.0</string> + <key>CD Features</key> + <integer>1663</integer> + <key>DVD Features</key> + <integer>103</integer> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertySupportedCDFeaturesKey "CD Features" + + +/*! +@defined kIOPropertySupportedDVDFeaturesKey +@discussion This key is used to define the supported DVD Features for a +particular optical device and it has an associated bitfield. See +<IOKit/scsi/IOSCSIMultimediaCommandsDevice.h> for definitions of the +bits and associated bitmasks. + +Requirement: Mandatory for optical devices (Peripheral Device Type 05h). + +Example: +<pre> +@textblock +<dict> + <key>Device Characteristics</key> + <dict> + <key>Vendor Name</key> + <string>Apple</string> + <key>Product Name</key> + <string>SuperDrive</string> + <key>Product Revision Level</key> + <string>1.0</string> + <key>CD Features</key> + <integer>1663</integer> + <key>DVD Features</key> + <integer>103</integer> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertySupportedDVDFeaturesKey "DVD Features" + + +/*! +@defined kIOPropertySupportedBDFeaturesKey +@discussion This key is used to define the supported BD Features for a +particular optical device and it has an associated bitfield. See +<IOKit/scsi/IOSCSIMultimediaCommandsDevice.h> for definitions of the +bits and associated bitmasks. + +Requirement: Mandatory for optical devices (Peripheral Device Type 05h). + +Example: +<pre> +@textblock +<dict> + <key>Device Characteristics</key> + <dict> + <key>Vendor Name</key> + <string>Apple</string> + <key>Product Name</key> + <string>SuperDrive</string> + <key>Product Revision Level</key> + <string>1.0</string> + <key>CD Features</key> + <integer>1663</integer> + <key>DVD Features</key> + <integer>103</integer> + <key>BD Features</key> + <integer>21</integer> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertySupportedBDFeaturesKey "BD Features" + + +/*! +@defined kIOPropertyRigidDiskGeometryKey +@discussion This key is used to define a dictionary containing +rigid disk geometry information. + +Requirement: Optional. If a device publishes this dictionary, it +must publish all key/value pairs which are deemed Mandatory. + +Example: +<pre> +@textblock +<dict> + <key>Device Characteristics</key> + <dict> + <key>Vendor Name</key> + <string>Apple</string> + <key>Product Name</key> + <string>iPod</string> + <key>Product Revision Level</key> + <string>1.0</string> + <key>Rigid Disk Geometry</key> + <dict> + <key>Sector Count per Track</key> + <integer>12345</integer> + <key>Head Count</key> + <integer>12</integer> + <key>Cylinder Count</key> + <integer>12345</integer> + <key>Bytes per Physical Sector</key> + <integer>512</integer> + </dict> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyRigidDiskGeometryKey "Rigid Disk Geometry" + + +/*! +@defined kIOPropertySectorCountPerTrackKey +@discussion This key is used to define the number of sectors per +each track for a particular medium. + +Requirement: Mandatory element of the Rigid Disk Geometry dictionary. + +Example: +<pre> +@textblock +<dict> + <key>Device Characteristics</key> + <dict> + <key>Vendor Name</key> + <string>Apple</string> + <key>Product Name</key> + <string>iPod</string> + <key>Product Revision Level</key> + <string>1.0</string> + <key>Rigid Disk Geometry</key> + <dict> + <key>Sector Count per Track</key> + <integer>12345</integer> + </dict> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertySectorCountPerTrackKey "Sector Count per Track" + + +/*! +@defined kIOPropertyHeadCountKey +@discussion This key is used to define the number of heads for +a particular medium. + +Requirement: Mandatory element of the Rigid Disk Geometry dictionary. + +Example: +<pre> +@textblock +<dict> + <key>Device Characteristics</key> + <dict> + <key>Vendor Name</key> + <string>Apple</string> + <key>Product Name</key> + <string>iPod</string> + <key>Product Revision Level</key> + <string>1.0</string> + <key>Rigid Disk Geometry</key> + <dict> + <key>Sector Count per Track</key> + <integer>12345</integer> + <key>Head Count</key> + <integer>12</integer> + <key>Cylinder Count</key> + <integer>12345</integer> + <key>Bytes per Physical Sector</key> + <integer>512</integer> + </dict> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyHeadCountKey "Head Count" + + +/*! +@defined kIOPropertyCylinderCountKey +@discussion This key is used to define the number of heads for +a particular medium. + +Requirement: Mandatory element of the Rigid Disk Geometry dictionary. + +Example: +<pre> +@textblock +<dict> + <key>Device Characteristics</key> + <dict> + <key>Vendor Name</key> + <string>Apple</string> + <key>Product Name</key> + <string>iPod</string> + <key>Product Revision Level</key> + <string>1.0</string> + <key>Rigid Disk Geometry</key> + <dict> + <key>Sector Count per Track</key> + <integer>12345</integer> + <key>Head Count</key> + <integer>12</integer> + <key>Cylinder Count</key> + <integer>12345</integer> + <key>Bytes per Physical Sector</key> + <integer>512</integer> + </dict> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyCylinderCountKey "Cylinder Count" + + +/*! +@defined kIOPropertyBytesPerPhysicalSectorKey +@discussion This key is used to define the number of heads for +a particular medium. + +Requirement: Mandatory element of the Rigid Disk Geometry dictionary. + +Example: +<pre> +@textblock +<dict> + <key>Device Characteristics</key> + <dict> + <key>Vendor Name</key> + <string>Apple</string> + <key>Product Name</key> + <string>iPod</string> + <key>Product Revision Level</key> + <string>1.0</string> + <key>Rigid Disk Geometry</key> + <dict> + <key>Sector Count per Track</key> + <integer>12345</integer> + <key>Head Count</key> + <integer>12</integer> + <key>Cylinder Count</key> + <integer>12345</integer> + <key>Bytes per Physical Sector</key> + <integer>512</integer> + </dict> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyBytesPerPhysicalSectorKey "Bytes per Physical Sector" + + +/*! +@defined kIOPropertyPhysicalBlockSizeKey +@discussion This key is used to define the physical block size of a hard disk drive. + +Requirement: Mandatory for hard disk drives with physical block size other than 512 bytes. + +Example: +<pre> +@textblock +<dict> + <key>Device Characteristics</key> + <dict> + <key>Vendor Name</key> + <string>Apple</string> + <key>Product Name</key> + <string>iPod</string> + <key>Product Revision Level</key> + <string>1.0</string> + <key>Physical Block Size</key> + <integer>4096</integer> + <key>Logical Block Size</key> + <integer>512</integer> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPhysicalBlockSizeKey "Physical Block Size" + + +/*! +@defined kIOPropertyLogicalBlockSizeKey +@discussion This key is used to define the logical block size of a hard disk drive. + +Requirement: Mandatory for hard disk drives with logical block size other than 512 bytes +or that does not match its physical block size. + +Example: +<pre> +@textblock +<dict> + <key>Device Characteristics</key> + <dict> + <key>Vendor Name</key> + <string>Apple</string> + <key>Product Name</key> + <string>iPod</string> + <key>Product Revision Level</key> + <string>1.0</string> + <key>Physical Block Size</key> + <integer>4096</integer> + <key>Logical Block Size</key> + <integer>512</integer> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyLogicalBlockSizeKey "Logical Block Size" + + +/*! +@defined kIOPropertyTargetDiskModeKey +@discussion This key is used to indicate the device is another computer in Target Disk Mode. + +Requirement: Optional. + +Example: +<pre> +@textblock +<dict> + <key>Device Characteristics</key> + <dict> + <key>Vendor Name</key> + <string>AAPL</string> + <key>Product Name</key> + <string>FireWire Target</string> + <key>Product Revision Level</key> + <string>0000</string> + <key>Target Disk Mode</key> + <true/> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyTargetDiskModeKey "Target Disk Mode" + + +/*! +@defined kIOPropertyInvalidStartupDiskKey +@discussion This key is used to denote devices when cannot be used as a startup disk. + +Requirement: Optional. + +Example: +<pre> +@textblock +<dict> + <key>Device Characteristics</key> + <dict> + <key>Vendor Name</key> + <string>APPLE</string> + <key>Product Name</key> + <string>Target Disk Mode</string> + <key>Product Revision Level</key> + <string>0000</string> + <key>Invalid Startup Disk</key> + <true/> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyInvalidStartupDiskKey "Invalid Startup Disk" + + +/*! +@defined kIOPropertyMediumTypeKey +@discussion This key is used to indicate the medium type of the device. + +Requirement: Optional. + +Example: +<pre> +@textblock +<dict> + <key>Device Characteristics</key> + <dict> + <key>Vendor Name</key> + <string>AAPL</string> + <key>Product Name</key> + <string>FireWire Target</string> + <key>Product Revision Level</key> + <string>0000</string> + <key>Medium Type</key> + <string>Rotational</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyMediumTypeKey "Medium Type" + + +/*! +@defined kIOPropertyMediumTypeRotationalKey +@discussion This key is used to indicate the medium type of the device is rotational. + +Requirement: Optional. + +Example: +<pre> +@textblock +<dict> + <key>Device Characteristics</key> + <dict> + <key>Vendor Name</key> + <string>AAPL</string> + <key>Product Name</key> + <string>FireWire Target</string> + <key>Product Revision Level</key> + <string>0000</string> + <key>Medium Type</key> + <string>Rotational</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyMediumTypeRotationalKey "Rotational" + + +/*! +@defined kIOPropertyMediumTypeSolidStateKey +@discussion This key is used to indicate the medium type of the device is solid state. + +Requirement: Optional. + +Example: +<pre> +@textblock +<dict> + <key>Device Characteristics</key> + <dict> + <key>Vendor Name</key> + <string>AAPL</string> + <key>Product Name</key> + <string>FireWire Target</string> + <key>Product Revision Level</key> + <string>0000</string> + <key>Medium Type</key> + <string>Solid State</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyMediumTypeSolidStateKey "Solid State" + + +/*! +@defined kIOPropertyMediumRotationRateKey +@discussion This key is used to indicate the medium rotation rate in RPM of the device. + +Requirement: Optional. + +Example: +<pre> +@textblock +<dict> + <key>Device Characteristics</key> + <dict> + <key>Vendor Name</key> + <string>AAPL</string> + <key>Product Name</key> + <string>FireWire Target</string> + <key>Product Revision Level</key> + <string>0000</string> + <key>Rotation Rate</key> + <integer>7200</integer> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyMediumRotationRateKey "Rotation Rate" + + +#endif /* _IOKIT_IO_STORAGE_DEVICE_CHARACTERISTICS_H_ */ diff --git a/QualcommWireless/include/IOKit/storage/IOStorageProtocolCharacteristics.h b/QualcommWireless/include/IOKit/storage/IOStorageProtocolCharacteristics.h new file mode 100644 index 0000000..d7f065a --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/IOStorageProtocolCharacteristics.h @@ -0,0 +1,645 @@ +/* + * Copyright (c) 1998-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IO_STORAGE_PROTOCOL_CHARACTERISTICS_H_ +#define _IOKIT_IO_STORAGE_PROTOCOL_CHARACTERISTICS_H_ + +#include <IOKit/storage/IOStorageControllerCharacteristics.h> + +/* + * Protocol Characteristics - Characteristics defined for protocols. + */ + +/*! +@defined kIOPropertyProtocolCharacteristicsKey +@discussion This key is used to define Protocol Characteristics for a particular +protocol and it has an associated dictionary which lists the +protocol characteristics. + +Requirement: Mandatory + +Example: +<pre> +@textblock +<dict> + <key>Protocol Characteristics</key> + <dict> + <key>Physical Interconnect</key> + <string>ATAPI</string> + <key>Physical Interconnect Location</key> + <string>Internal</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyProtocolCharacteristicsKey "Protocol Characteristics" + + +/*! +@defined kIOPropertySCSIInitiatorIdentifierKey +@discussion An identifier that will uniquely identify this SCSI Initiator for the +SCSI Domain. + +Requirement: Mandatory for SCSI Parallel Interface, SAS, +and Fibre Channel Interface. + +Example: +<pre> +@textblock +<dict> + <key>Protocol Characteristics</key> + <dict> + <key>Physical Interconnect</key> + <string>SCSI Parallel Interface</string> + <key>Physical Interconnect Location</key> + <string>Internal</string> + <key>SCSI Initiator Identifier</key> + <integer>7</integer> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertySCSIInitiatorIdentifierKey "SCSI Initiator Identifier" + + +/*! +@defined kIOPropertySCSIDomainIdentifierKey +@discussion An identifier that will uniquely identify this SCSI Domain for the +Physical Interconnect type. This identifier is only guaranteed to be unique for +any given Physical Interconnect and is not guaranteed to be the same across +restarts or shutdowns. + +Requirement: Mandatory for SCSI Parallel Interface and Fibre Channel Interface. + +Example: +<pre> +@textblock +<dict> + <key>Protocol Characteristics</key> + <dict> + <key>Physical Interconnect</key> + <string>SCSI Parallel Interface</string> + <key>Physical Interconnect Location</key> + <string>Internal</string> + <key>SCSI Domain Identifier</key> + <integer>0</integer> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertySCSIDomainIdentifierKey "SCSI Domain Identifier" + + +/*! +@defined kIOPropertySCSITargetIdentifierKey +@discussion This is the SCSI Target Identifier for a given SCSI Target Device. + +Requirement: Mandatory for SCSI Parallel Interface and Fibre Channel Interface. + +Example: +<pre> +@textblock +<dict> + <key>Protocol Characteristics</key> + <dict> + <key>Physical Interconnect</key> + <string>SCSI Parallel Interface</string> + <key>Physical Interconnect Location</key> + <string>Internal</string> + <key>SCSI Target Identifier</key> + <integer>3</integer> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertySCSITargetIdentifierKey "SCSI Target Identifier" + + +/*! +@defined kIOPropertySCSILogicalUnitNumberKey +@discussion This key is the SCSI Logical Unit Number for the device server +controlled by the driver. + +Requirement: Mandatory for SCSI Parallel Interface, SAS, and Fibre Channel Interface. + +Example: +<pre> +@textblock +<dict> + <key>Protocol Characteristics</key> + <dict> + <key>Physical Interconnect</key> + <string>SCSI Parallel Interface</string> + <key>Physical Interconnect Location</key> + <string>Internal</string> + <key>SCSI Logical Unit Number</key> + <integer>2</integer> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertySCSILogicalUnitNumberKey "SCSI Logical Unit Number" + + +/*! +@defined kIOPropertyPhysicalInterconnectTypeKey +@discussion This key is used to define the Physical Interconnect to which +a device is attached. + +Requirement: Mandatory. + +Example: +<pre> +@textblock +<dict> + <key>Protocol Characteristics</key> + <dict> + <key>Physical Interconnect</key> + <string>SCSI Parallel Interface</string> + <key>Physical Interconnect Location</key> + <string>Internal</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPhysicalInterconnectTypeKey "Physical Interconnect" + + +/*! +@defined kIOPropertyPhysicalInterconnectLocationKey +@discussion This key is used to define the Physical Interconnect +Location. + +Requirement: Mandatory. + +Example: +<pre> +@textblock +<dict> + <key>Protocol Characteristics</key> + <dict> + <key>Physical Interconnect</key> + <string>SCSI Parallel Interface</string> + <key>Physical Interconnect Location</key> + <string>Internal</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPhysicalInterconnectLocationKey "Physical Interconnect Location" + + +/*! +@defined kIOPropertySCSIProtocolMultiInitKey +@discussion This protocol characteristics key is used to inform the system +that the protocol supports having multiple devices that act as initiators. + +Requirement: Optional. + +Example: +<pre> +@textblock +<dict> + <key>Protocol Characteristics</key> + <dict> + <key>Physical Interconnect</key> + <string>Fibre Channel Interface</string> + <key>Physical Interconnect Location</key> + <string>External</string> + <key>Multiple Initiators</key> + <string>True</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertySCSIProtocolMultiInitKey "Multiple Initiators" + + +/* + * Values - Values for the characteristics defined above. + */ + + +/*! +@defined kIOPropertyInternalKey +@discussion This key defines the value of Internal for the key +kIOPropertyPhysicalInterconnectLocationKey. If the device is +connected to an internal bus, this key should be set. + +Example: +<pre> +@textblock +<dict> + <key>Protocol Characteristics</key> + <dict> + <key>Physical Interconnect</key> + <string>ATA</string> + <key>Physical Interconnect Location</key> + <string>Internal</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyInternalKey "Internal" + + +/*! +@defined kIOPropertyExternalKey +@discussion This key defines the value of External for the key +kIOPropertyPhysicalInterconnectLocationKey. If the device is +connected to an external bus, this key should be set. + +Example: +<pre> +@textblock +<dict> + <key>Protocol Characteristics</key> + <dict> + <key>Physical Interconnect</key> + <string>Fibre Channel Interface</string> + <key>Physical Interconnect Location</key> + <string>External</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyExternalKey "External" + + +/*! +@defined kIOPropertyInternalExternalKey +@discussion This key defines the value of Internal/External for the key +kIOPropertyPhysicalInterconnectLocationKey. If the device is connected +to a bus and it is indeterminate whether it is internal or external, +this key should be set. + +Example: +<pre> +@textblock +<dict> + <key>Protocol Characteristics</key> + <dict> + <key>Physical Interconnect</key> + <string>SCSI Parallel Interface</string> + <key>Physical Interconnect Location</key> + <string>Internal/External</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyInternalExternalKey "Internal/External" + + +/*! +@defined kIOPropertyInterconnectFileKey +@discussion This key defines the value of File for the key +kIOPropertyPhysicalInterconnectLocationKey. If the device is a file +that is being represented as a storage device, this key should be set. + +NOTE: This key should only be used when the Physical Interconnect is set to +Virtual Interface. + +Example: +<pre> +@textblock +<dict> + <key>Protocol Characteristics</key> + <dict> + <key>Physical Interconnect</key> + <string>Virtual Interface</string> + <key>Physical Interconnect Location</key> + <string>File</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyInterconnectFileKey "File" + + +/*! +@defined kIOPropertyInterconnectRAMKey +@discussion This key defines the value of RAM for the key +kIOPropertyPhysicalInterconnectLocationKey. If the device is system memory +that is being represented as a storage device, this key should be set. + +NOTE: This key should only be used when the Physical Interconnect is set to +Virtual Interface. + +Example: +<pre> +@textblock +<dict> + <key>Protocol Characteristics</key> + <dict> + <key>Physical Interconnect</key> + <string>Virtual Interface</string> + <key>Physical Interconnect Location</key> + <string>RAM</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyInterconnectRAMKey "RAM" + + +/*! +@defined kIOPropertyPhysicalInterconnectTypeATA +@discussion This key defines the value of ATA for the key +kIOPropertyPhysicalInterconnectTypeKey. If the device is connected +to an ATA bus, this key should be set. + +Example: +<pre> +@textblock +<dict> + <key>Protocol Characteristics</key> + <dict> + <key>Physical Interconnect</key> + <string>ATA</string> + <key>Physical Interconnect Location</key> + <string>Internal</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPhysicalInterconnectTypeATA "ATA" + + +/*! +@defined kIOPropertyPhysicalInterconnectTypeSerialATA +@discussion This key defines the value of SATA for the key +kIOPropertyPhysicalInterconnectTypeKey. If the device is connected +to a SATA bus, this key should be set. + +Example: +<pre> +@textblock +<dict> + <key>Protocol Characteristics</key> + <dict> + <key>Physical Interconnect</key> + <string>SATA</string> + <key>Physical Interconnect Location</key> + <string>Internal</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPhysicalInterconnectTypeSerialATA "SATA" + + +/*! +@defined kIOPropertyPhysicalInterconnectTypeSerialAttachedSCSI +@discussion This key defines the value of SAS for the key +kIOPropertyPhysicalInterconnectTypeKey. If the device is connected +to a SAS bus, this key should be set. + +Example: +<pre> +@textblock +<dict> + <key>Protocol Characteristics</key> + <dict> + <key>Physical Interconnect</key> + <string>SAS</string> + <key>Physical Interconnect Location</key> + <string>External</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPhysicalInterconnectTypeSerialAttachedSCSI "SAS" + + +/*! +@defined kIOPropertyPhysicalInterconnectTypeATAPI +@discussion This key defines the value of ATAPI for the key +kIOPropertyPhysicalInterconnectTypeKey. If the device is connected +to an ATA bus and follows the ATAPI command specification, this key +should be set. + +Example: +<pre> +@textblock +<dict> + <key>Protocol Characteristics</key> + <dict> + <key>Physical Interconnect</key> + <string>ATAPI</string> + <key>Physical Interconnect Location</key> + <string>Internal</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPhysicalInterconnectTypeATAPI "ATAPI" + + +/*! +@defined kIOPropertyPhysicalInterconnectTypeUSB +@discussion This key defines the value of USB for the key +kIOPropertyPhysicalInterconnectTypeKey. If the device is connected +to a USB port, this key should be set. + +Example: +<pre> +@textblock +<dict> + <key>Protocol Characteristics</key> + <dict> + <key>Physical Interconnect</key> + <string>USB</string> + <key>Physical Interconnect Location</key> + <string>External</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPhysicalInterconnectTypeUSB "USB" + + +/*! +@defined kIOPropertyPhysicalInterconnectTypeFireWire +@discussion This key defines the value of USB for the key +kIOPropertyPhysicalInterconnectTypeKey. If the device is connected +to a FireWire port, this key should be set. + +Example: +<pre> +@textblock +<dict> + <key>Protocol Characteristics</key> + <dict> + <key>Physical Interconnect</key> + <string>FireWire</string> + <key>Physical Interconnect Location</key> + <string>External</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPhysicalInterconnectTypeFireWire "FireWire" + + +/*! + @defined kIOPropertyPhysicalInterconnectTypeSecureDigital + @discussion This key defines the value of Secure Digital for the key + kIOPropertyPhysicalInterconnectTypeSecureDigital. If the device is + connected to a Secure Digital port and follows the Secure Digital + specification, this key should be set. + + Example: + <pre> + @textblock + <dict> + <key>Protocol Characteristics</key> + <dict> + <key>Physical Interconnect</key> + <string>Secure Digital</string> + <key>Physical Interconnect Location</key> + <string>Internal</string> + </dict> + </dict> + @/textblock + </pre> + */ +#define kIOPropertyPhysicalInterconnectTypeSecureDigital "Secure Digital" + + +/*! +@defined kIOPropertyPhysicalInterconnectTypeSCSIParallel +@discussion This key defines the value of SCSI Parallel Interface for the key +kIOPropertyPhysicalInterconnectTypeKey. If the device is connected +to a SCSI Parallel port, this key should be set. + +Example: +<pre> +@textblock +<dict> + <key>Protocol Characteristics</key> + <dict> + <key>Physical Interconnect</key> + <string>SCSI Parallel Interface</string> + <key>Physical Interconnect Location</key> + <string>External</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPhysicalInterconnectTypeSCSIParallel "SCSI Parallel Interface" + + +/*! +@defined kIOPropertyPhysicalInterconnectTypeFibreChannel +@discussion This key defines the value of Fibre Channel Interface for the key +kIOPropertyPhysicalInterconnectTypeKey. If the device is connected +to a Fibre Channel port, this key should be set. + +Example: +<pre> +@textblock +<dict> + <key>Protocol Characteristics</key> + <dict> + <key>Physical Interconnect</key> + <string>Fibre Channel Interface</string> + <key>Physical Interconnect Location</key> + <string>External</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPhysicalInterconnectTypeFibreChannel "Fibre Channel Interface" + + +/*! +@defined kIOPropertyPhysicalInterconnectTypeVirtual +@discussion This key defines the value of Virtual Interface for the key +kIOPropertyPhysicalInterconnectTypeVirtual. If the device is being made to look +like a storage device, but is not such in actuality, such as a File or RAM, this +key should be set. + +Example: +<pre> +@textblock +<dict> + <key>Protocol Characteristics</key> + <dict> + <key>Physical Interconnect</key> + <string>Virtual Interface</string> + <key>Physical Interconnect Location</key> + <string>File</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPhysicalInterconnectTypeVirtual "Virtual Interface" + + +/*! +@defined kIOPropertyPhysicalInterconnectTypePCI +@discussion This key defines the value of PCI for the key +kIOPropertyPhysicalInterconnectTypePCI. If the device is connected +via PCI, this key should be set. + +Example: +<pre> +@textblock +<dict> + <key>Protocol Characteristics</key> + <dict> + <key>Physical Interconnect</key> + <string>PCI</string> + <key>Physical Interconnect Location</key> + <string>Internal</string> + </dict> +</dict> +@/textblock +</pre> +*/ +#define kIOPropertyPhysicalInterconnectTypePCI "PCI" + + +#endif /* _IOKIT_IO_STORAGE_PROTOCOL_CHARACTERISTICS_H_ */ diff --git a/QualcommWireless/include/IOKit/storage/ata/IOATAPIProtocolTransport.h b/QualcommWireless/include/IOKit/storage/ata/IOATAPIProtocolTransport.h new file mode 100644 index 0000000..3356ae7 --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/ata/IOATAPIProtocolTransport.h @@ -0,0 +1,365 @@ +/* + * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/*! + @header IOATAPIProtocolTransport + Contains the class definition for IOATAPIProtocolTransport. +*/ + + +#ifndef _IOKIT_IO_ATAPI_PROTOCOL_TRANSPORT_H_ +#define _IOKIT_IO_ATAPI_PROTOCOL_TRANSPORT_H_ + +#define kIOPropertyATAPIMassStorageCharacteristics "ATAPI Mass Storage Characteristics" + +#if defined(KERNEL) && defined(__cplusplus) + +/* General IOKit includes */ +#include <IOKit/IOLib.h> +#include <IOKit/IOMessage.h> +#include <IOKit/IOService.h> +#include <IOKit/IOCommandPool.h> + +/* IOKit ATA Family includes */ +#include <IOKit/ata/IOATADevice.h> +#include <IOKit/ata/IOATATypes.h> + +/* IOKit ATA Storage includes */ +#include <IOKit/storage/ata/IOATAStorageDefines.h> + +/* SCSI Architecture Model Family includes */ +#include <IOKit/scsi/IOSCSIProtocolServices.h> + +// Forward class declaration +class IOATAPIProtocolTransport; + +/*! + @typedef ATAPIClientData + @param cmd IOATACommand for request. + @param self Pointer to the object. + @param scsiTask SCSITaskIdentifier of request. + @discussion This structure is stuffed into the refcon so we can associate which + IOATACommand and SCSITaskIdentifier is completing. +*/ + +struct ATAPIClientData +{ + IOATACommand * cmd; + IOATAPIProtocolTransport * self; + SCSITaskIdentifier scsiTask; +}; +typedef struct ATAPIClientData ATAPIClientData; + + +/*! + @class IOATAPIProtocolTransport + @abstract SCSI Protocol Driver Family for ATAPI Devices. + @discussion IOATAPIProtocolTransport contains all the bus specific support for ATAPI compliant devices. + To add vendor specific features or workarounds you will sub-class the appropriate + methods of this family. +*/ + +class IOATAPIProtocolTransport : public IOSCSIProtocolServices +{ + + OSDeclareDefaultStructors ( IOATAPIProtocolTransport ) + +public: + + // ---- IOService methods overridden ---- + + bool init ( OSDictionary * propTable ); + + // The start method is called to start our services. If the device + // can be controlled by this object, then we return true, else we + // return false. start() is usually used to allocate resources once + // it is determined that the device can be controlled by this object. + virtual bool start ( IOService * provider ); + + // The stop method is called to stop our services. It is primarily + // called for deallocation of resources. + virtual void stop ( IOService * provider ); + + // This method is our last chance to free all resources allocated. + virtual void free ( void ); + + +protected: + + // ---- member variables ---- + + IOATADevice * fATADevice; + ataUnitID fATAUnitID; + ataDeviceType fATADeviceType; + ataSocketType fATASocketType; + atapiConfig fATAPIPacketConfig; + UInt8 fPIOMode; + UInt8 fDMAMode; + UInt8 fUltraDMAMode; + IOCommandGate * fCommandGate; + IOCommandPool * fCommandPool; + IOATACommand * fResetCommand; + IOATACommand * fConfigCommand; + IOATACommand * fIdentifyCommand; + char fRevision[kSizeOfATARevisionString + 1]; + char fModel[kSizeOfATAModelString + 1]; + bool fWakeUpResetOccurred; + bool fPhysicallyConnected; + + // Used for low-power polling support + thread_call_t fPollingThread; + + UInt16 fDeviceIdentifyData[256]; + IOMemoryDescriptor * fDeviceIdentifyBuffer; + bool fResetInProgress; + + // Binary Compatibility instance variable expansion + struct ExpansionData + { + UInt32 fSemaphore; + UInt32 fMediaNotifyValue; + }; + ExpansionData * reserved; + + // ---- IOService methods overridden ---- + + // The message method is used to listen to messages from our provider, the ATA controller. + // It sends messages for bus reset notifications and for device removal (such as MediaBay, + // PC card, etc.) + virtual IOReturn message ( UInt32 type, IOService * provider, void * argument = 0 ); + + // ---- Protocol transport methods overridden ---- + + // Send a SCSI Command to the device. If the command was sent to the + // device and is pending completion, the subclass should return true and + // return back the kSCSIServiceResponse_Request_In_Process response. + // If the command completes immediately with an error, the subclass will + // return true and return back the appropriate status. + // if the subclass is currently processing all the commands it can, the + // subclass will return false and the command will be resent next time + // CommandCompleted is called. + virtual bool SendSCSICommand ( SCSITaskIdentifier request, + SCSIServiceResponse * serviceResponse, + SCSITaskStatus * taskStatus ); + + // This is a stub - not implemented in upper layer yet. Eventually, there + // will be a way to abort a task or task set and this method will be called. + // It will abort any commands which have not been executed by the ATA controller + virtual SCSIServiceResponse AbortSCSICommand ( SCSITaskIdentifier request ); + + // The IsProtocolServiceSupported method will return true if the protocol + // layer supports the specified feature. + virtual bool IsProtocolServiceSupported ( SCSIProtocolFeature feature, void * serviceValue ); + + // The HandleProtocolServiceFeature method will return true if the protocol + // layer properly handled the specified feature. + virtual bool HandleProtocolServiceFeature ( SCSIProtocolFeature feature, void * serviceValue ); + + // ------ Power Management Support ------ + + // The HandlePowerOff method is called to do any bus specific activity + // necessary before shutting down and going to sleep. + virtual IOReturn HandlePowerOff ( void ); + + // The HandlePowerOn method is called to do any bus specific activity + // necessary to recover from power-on/wake from sleep (e.g. device reset on ATAPI) + virtual IOReturn HandlePowerOn ( void ); + + + // ---- Methods defined by this class ---- + + // Static callback proc for all SCSITask objects, it calls through to + // SCSITaskCallbackFunction. + static void sSCSITaskCallbackProc ( IOATACommand * cmd ); + + // Callback proc for synchronous ATA only type commands. + static void sATACallbackSync ( IOATACommand * cmd ); + + // Callback proc for asynchronous ATAPI resets. + static void sATAPIResetCallback ( IOATACommand * cmd ); + + // Callback proc that does nothing. + static void sATAPIVoidCallback ( IOATACommand * cmd ); + + // State machine for device configuration. + static void sATAPIConfigStateMachine ( IOATACommand * cmd ); + + // Used for low-power polling. + static void sPollStatusRegister ( void * xptDriver, void * refCon ); + + // Static callback for low-power polling. + static void sPollStatusRegisterCallback ( IOATACommand * cmd ); + + // This method is called by the SCSITaskCallbackFunction and it calls the + // inherited CommandCompleted message with the results of the task. + virtual void CompleteSCSITask ( SCSITaskIdentifier scsiTask, + SCSIServiceResponse serviceResponse, + SCSITaskStatus taskStatus ); + + // The SCSITaskCallbackFunction method is called by the static callback procedure + // to complete SCSITask operations. This method may be subclassed if a device + // workaround is necessary. + virtual void SCSITaskCallbackFunction ( IOATACommand * cmd, + SCSITaskIdentifier scsiTask ); + + // The ReportATAPIDeviceType method returns the ataDeviceType for ATAPI + virtual ataDeviceType ReportATAPIDeviceType ( void ) const; + + // The InspectDevice method is called to inspect the ATA device and verify + // that it is a device which can be controlled by this object + virtual bool InspectDevice ( IOATADevice * ataDevice ); + + // The AllocateATACommandObjects method is called to allocate a pool of + // IOATACommands for general purpose I/O usage. + virtual void AllocateATACommandObjects ( void ); + + // The DeallocateATACommandObjects method is called to deallocate a pool of + // IOATACommands for general purpose I/O usage. + virtual void DeallocateATACommandObjects ( void ); + + // The GetATACommandObject method is called to retrieve a command from + // the pool. Pass true to allow the method to sleep waiting for a command, + // else pass false. If false is passed, there is NO guarantee that a valid + // command will be returned. If true is passed, it IS guaranteed that a + // valid command will be returned, but the thread may be slept waiting for + // those resources. + virtual IOATACommand * GetATACommandObject ( bool okToSleep = true ); + + // The ReturnATACommandObject method is called to return a command to + // the pool. + virtual void ReturnATACommandObject ( IOATACommand * cmd ); + + // The sSwapBytes16 method is used to word-swap the Device Identify data + // on big endian systems. Since all identify data is returned in little endian + // values, it must be word-swapped before inspected. + static void sSwapBytes16 ( UInt8 * buffer, IOByteCount numBytesToSwap ); + + // The sConvertHighestBitToNumber method is used to find the highest bit in a + // word and return a numeric value. This is used to find the highest possible + // values for PIO, DMA, and UltraDMA transfer modes. + static UInt8 sConvertHighestBitToNumber ( UInt16 bitField ); + + // The sSetWakeupResetOccurred method is used to safely set member variables + // behind the command gate. + static void sSetWakeupResetOccurred ( IOATAPIProtocolTransport * driver, + bool resetOccurred ); + + // The sCheckWakeupResetOccur method is used to safely check member variables + // behind the command gate. + static void sCheckWakeupResetOccurred ( IOATAPIProtocolTransport * driver, + bool * resetOccurred ); + + // The DidWakeupResetOccur method is used to safely find out if a reset + // occurred while we were asleep. + virtual bool CheckWakeupResetOccurred ( void ); + + // The WakeupResetOccurred method is used to safely set/clear the reset flag. + virtual void SetWakeupResetOccurred ( bool resetOccurred ); + + // The SetPIOTransferMode method is used to set the programmed input-output (PIO) + // transfer mode. The highest value reported by the device is used. + virtual IOReturn SetPIOTransferMode ( IOATACommand * cmd, bool forceSync ); + + // The SetDMATransferMode method is used to set the direct memory access (DMA) + // transfer mode. The highest value reported by the device is used. + virtual IOReturn SetDMATransferMode ( IOATACommand * cmd, bool forceSync ); + + // The IdentifyAndConfigureATAPIDevice method is called to correctly identify + // and configure an ATAPI device. + virtual IOReturn IdentifyAndConfigureATAPIDevice ( void ); + + // The ConfigureATAPIDevice method is called to correctly configure the ATAPI + // device. It currently configures any PIO/DMA/UDMA transfer modes but may be + // expanded in the future. + virtual IOReturn ConfigureATAPIDevice ( void ); + + // The ReconfigureATAPIDevice method is called to correctly reconfigure the ATAPI + // device after a reset event has occurred (bus reset or device reset). It + // currently reconfigures any PIO/DMA/UDMA transfer modes but may be expanded in + // the future. + virtual IOReturn ReconfigureATAPIDevice ( void ); + + // The IdentifyATAPIDevice method is called to correctly identify the ATAPI + // device. It currently issues the Identify ATAPI Device packet command and + // uses the data to correctly configure the device. + virtual IOReturn IdentifyATAPIDevice ( void ); + + // The ResetATAPIDevice method is called to issue a Device Reset (also known + // as a SOFT RESET). This method will only reset the specified device on the + // bus. + virtual IOReturn ResetATAPIDevice ( void ); + + // The SendATASleepCommand method is called to put an ATAPI drive in sleep + // mode. + virtual IOReturn SendATASleepCommand ( void ); + + // The EnablePollingOfStatusRegister method is called to set up a timer for + // the call to PollStatusRegister. It is called when the SCSI Application Layer + // driver wants to enable low-power polling and after a poll which does not + // see a change in the register status. + virtual void EnablePollingOfStatusRegister ( void ); + + // The DisablePollingOfStatusRegister method is called to cancel any thread + // call which is doing a poll and drop the retain count on the object. + virtual void DisablePollingOfStatusRegister ( void ); + + // The PollStatusRegister method is used to do low-power polling on drives which + // support it. This feature is enabled by the SCSI Application Layer driver. + virtual void PollStatusRegister ( void * refCon ); + + // Callback method for the polling of the status register. + virtual void PollStatusRegisterCallback ( IOATACommand * cmd ); + + // The TurnDrivePowerOff method is called to turn power to the drive OFF + IOReturn TurnDrivePowerOff ( void ); + + IOReturn SendCommand ( IOATACommand * cmd ); + IOReturn GatedWaitForRequest ( void * data ); + +private: + + // Binary Compatibility reserved method space + OSMetaClassDeclareReservedUnused ( IOATAPIProtocolTransport, 1 ); + OSMetaClassDeclareReservedUnused ( IOATAPIProtocolTransport, 2 ); + OSMetaClassDeclareReservedUnused ( IOATAPIProtocolTransport, 3 ); + OSMetaClassDeclareReservedUnused ( IOATAPIProtocolTransport, 4 ); + OSMetaClassDeclareReservedUnused ( IOATAPIProtocolTransport, 5 ); + OSMetaClassDeclareReservedUnused ( IOATAPIProtocolTransport, 6 ); + OSMetaClassDeclareReservedUnused ( IOATAPIProtocolTransport, 7 ); + OSMetaClassDeclareReservedUnused ( IOATAPIProtocolTransport, 8 ); + OSMetaClassDeclareReservedUnused ( IOATAPIProtocolTransport, 9 ); + OSMetaClassDeclareReservedUnused ( IOATAPIProtocolTransport, 10 ); + OSMetaClassDeclareReservedUnused ( IOATAPIProtocolTransport, 11 ); + OSMetaClassDeclareReservedUnused ( IOATAPIProtocolTransport, 12 ); + OSMetaClassDeclareReservedUnused ( IOATAPIProtocolTransport, 13 ); + OSMetaClassDeclareReservedUnused ( IOATAPIProtocolTransport, 14 ); + OSMetaClassDeclareReservedUnused ( IOATAPIProtocolTransport, 15 ); + OSMetaClassDeclareReservedUnused ( IOATAPIProtocolTransport, 16 ); + +}; + +#endif /* defined(KERNEL) && defined(__cplusplus) */ + +#endif /* _IOKIT_IO_ATAPI_PROTOCOL_TRANSPORT_H_ */ \ No newline at end of file diff --git a/QualcommWireless/include/IOKit/storage/ata/IOATAStorageDefines.h b/QualcommWireless/include/IOKit/storage/ata/IOATAStorageDefines.h new file mode 100644 index 0000000..fdac8b3 --- /dev/null +++ b/QualcommWireless/include/IOKit/storage/ata/IOATAStorageDefines.h @@ -0,0 +1,321 @@ +/* + * Copyright (c) 1998-2007 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IO_ATA_STORAGE_DEFINES_H_ +#define _IOKIT_IO_ATA_STORAGE_DEFINES_H_ + +#include <stdint.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Important word offsets in device identify data as + * defined in ATA-5 standard + */ + +enum +{ + kATAIdentifyConfiguration = 0, + kATAIdentifyLogicalCylinderCount = 1, + kATAIdentifyLogicalHeadCount = 3, + kATAIdentifySectorsPerTrack = 6, + kATAIdentifySerialNumber = 10, + kATAIdentifyFirmwareRevision = 23, + kATAIdentifyModelNumber = 27, + kATAIdentifyMultipleSectorCount = 47, + kATAIdentifyDriveCapabilities = 49, + kATAIdentifyDriveCapabilitiesExtended = 50, + kATAIdentifyPIOTiming = 51, + kATAIdentifyExtendedInfoSupport = 53, + kATAIdentifyCurrentCylinders = 54, + kATAIdentifyCurrentHeads = 55, + kATAIdentifyCurrentSectors = 56, + kATAIdentifyCurrentCapacity = 57, + kATAIdentifyCurrentMultipleSectors = 59, + kATAIdentifyLBACapacity = 60, + kATAIdentifySingleWordDMA = 62, + kATAIdentifyMultiWordDMA = 63, + kATAIdentifyAdvancedPIOModes = 64, + kATAIdentifyMinMultiWordDMATime = 65, + kATAIdentifyRecommendedMultiWordDMATime = 66, + kATAIdentifyMinPIOTime = 67, + kATAIdentifyMinPIOTimeWithIORDY = 68, + kATAIdentifyQueueDepth = 75, + kATAIdentifyMajorVersion = 80, + kATAIdentifyMinorVersion = 81, + kATAIdentifyCommandSetSupported = 82, + kATAIdentifyCommandSetSupported2 = 83, + kATAIdentifyCommandExtension1 = 84, + kATAIdentifyCommandExtension2 = 85, + kATAIdentifyCommandsEnabled = 86, + kATAIdentifyCommandsDefault = 87, + kATAIdentifyUltraDMASupported = 88, + kATAIdentifyPhysicalLogicalSectorSize = 106, + kATAIdentifyWordsPerLogicalSector1 = 117, + kATAIdentifyWordsPerLogicalSector2 = 118, + kATAIdentifyLogicalSectorAlignment = 209, + kATAIdentifyIntegrity = 255 +}; + + +/* + * Important bits in device identify data + * as defined in ATA-5 standard + */ + +enum +{ + // Configuration field (word 0) + kFixedDeviceBit = 6, // Fixed disk indicator bit + kRemoveableMediaBit = 7, // Removable media indicator bit + kNonMagneticDriveBit = 15, // Non-magnetic drive indicator bit + + kFixedDeviceMask = (1 << kFixedDeviceBit), // Mask for fixed disk indicator + kRemoveableMediaMask = (1 << kRemoveableMediaBit), // Mask for removable media indicator + kNonMagneticDriveMask = (1 << kNonMagneticDriveBit), // Mask for non-magnetic drive indicator + + // Capabilities field (word 49) + kDMABit = 8, // DMA supported bit + kLBABit = 9, // LBA supported bit + kIORDYDisableBit = 10, // IORDY can be disabled bit + kIORDYBit = 11, // IORDY supported bit + kStandbyTimerBit = 13, // Standby timer supported bit + + kDMASupportedMask = (1 << kDMABit), // Mask for DMA supported + kLBASupportedMask = (1 << kLBABit), // Mask for LBA supported + kDMADisableMask = (1 << kIORDYDisableBit), // Mask for DMA supported + kIORDYSupportedMask = (1 << kIORDYBit), // Mask for IORDY supported + kStandbySupportedMask = (1 << kStandbyTimerBit), // Mask for Standby Timer supported + + // Extensions field (word 53) + kCurFieldsValidBit = 0, // Bit to show words 54-58 are valid + kExtFieldsValidBit = 1, // Bit to show words 64-70 are valid + kCurFieldsValidMask = (1 << kCurFieldsValidBit), // Mask for current fields valid + kExtFieldsValidMask = (1 << kExtFieldsValidBit), // Extension word valid + + // Advanced PIO Transfer Modes field (word 64) + kMode3Bit = 0, // Bit to indicate mode 3 is supported + kMode3Mask = (1 << kMode3Bit), // Mask for mode 3 support + + // Integrity of Identify data (word 255) + kChecksumValidCookie = 0xA5 // Bits 7:0 if device supports feature + +}; + + +/* String size constants */ +enum +{ + kSizeOfATAModelString = 40, + kSizeOfATARevisionString = 8 +}; + +/* ATA Command timeout constants ( in milliseconds ) */ +enum +{ + kATATimeout10Seconds = 10000, + kATATimeout30Seconds = 30000, + kATATimeout45Seconds = 45000, + kATATimeout1Minute = 60000, + kATADefaultTimeout = kATATimeout30Seconds +}; + + +/* Retry constants */ +enum +{ + kATAZeroRetries = 0, + kATADefaultRetries = 4 +}; + +/* max number of blocks supported in ATA transaction */ +enum +{ + kIOATASectorCount8Bit = 8, + kIOATASectorCount16Bit = 16 +}; + +enum +{ + kIOATAMaximumBlockCount8Bit = (1 << kIOATASectorCount8Bit), + kIOATAMaximumBlockCount16Bit = (1 << kIOATASectorCount16Bit), + + // For backwards compatibility + kIOATAMaxBlocksPerXfer = kIOATAMaximumBlockCount8Bit +}; + + + +/* Power Management time constants (in seconds) */ +enum +{ + kSecondsInAMinute = 60, + k5Minutes = 5 * kSecondsInAMinute +}; + +/* Bits for features published in Word 82 of device identify data */ +enum +{ + kATASupportsSMARTBit = 0, + kATASupportsPowerManagementBit = 3, + kATASupportsWriteCacheBit = 5 +}; + +/* Masks for features published in Word 82 of device identify data */ +enum +{ + kATASupportsSMARTMask = (1 << kATASupportsSMARTBit), + kATASupportsPowerManagementMask = (1 << kATASupportsPowerManagementBit), + kATASupportsWriteCacheMask = (1 << kATASupportsWriteCacheBit) +}; + +/* Bits for features published in Word 83 of device identify data */ +enum +{ + kATASupportsCompactFlashBit = 2, + kATASupportsAdvancedPowerManagementBit = 3, + + kATASupports48BitAddressingBit = 10, + + kATASupportsFlushCacheBit = 12, + kATASupportsFlushCacheExtendedBit = 13 +}; + +/* Masks for features published in Word 83 of device identify data */ +enum +{ + kATASupportsCompactFlashMask = (1 << kATASupportsCompactFlashBit), + kATASupportsAdvancedPowerManagementMask = (1 << kATASupportsAdvancedPowerManagementBit), + + kATASupports48BitAddressingMask = (1 << kATASupports48BitAddressingBit), + + kATASupportsFlushCacheMask = (1 << kATASupportsFlushCacheBit), + kATASupportsFlushCacheExtendedMask = (1 << kATASupportsFlushCacheExtendedBit), + + // Mask to ensure data is valid + kIdentifyWordValidationMask = 0xC000, + kIdentifyWordValid = 0x4000 +}; + +/* Bits for features published in Word 84 of device identify data */ +enum +{ + kATAForceUnitAccessFeatureBit = 6, +}; + +/* Masks for features published in Word 84 of device identify data */ +enum +{ + kATAForceUnitAccessFeatureMask = (1 << kATAForceUnitAccessFeatureBit), +}; + +/* Bits for features published in Word 85 of device identify data */ +enum +{ + kATAWriteCacheEnabledBit = 5 +}; + +/* Masks for features published in Word 85 of device identify data */ +enum +{ + kATAWriteCacheEnabledMask = (1 << kATAWriteCacheEnabledBit) +}; + + +/* Bits for features published in Word 106 of device identify data */ +enum +{ + kATAPhysicalLogicalEnabledBit0 = 15, + kATAPhysicalLogicalEnabledBit1 = 14, + kATAMultipleLogicalSectorsBit = 13, + kATAValidLogicalSectorSizeBit = 12 +}; + +/* Masks for features published in Word 106 of device identify data */ +enum +{ + kATAPhysicalLogicalEnabledMask = (1 << kATAPhysicalLogicalEnabledBit0) | (1 << kATAPhysicalLogicalEnabledBit1), + kATAPhysicalLogicalEnabledValue = (0 << kATAPhysicalLogicalEnabledBit0) | (1 << kATAPhysicalLogicalEnabledBit1), + kATAMultipleLogicalSectorsMask = (1 << kATAMultipleLogicalSectorsBit), + kATAValidLogicalSectorSizeMask = (1 << kATAValidLogicalSectorSizeBit), + kATAPhysicalSectorSizeMask = 0xF, + kATALogicalSectorAlignmentMask = 0x3FFF +}; + +// Property table keys +#define kIOATASupportedFeaturesKey "ATA Features" + +/* ATA supported features */ +enum +{ + kIOATAFeaturePowerManagement = 0x01, /* OBSOLETE */ + kIOATAFeatureWriteCache = 0x02, /* OBSOLETE */ + kIOATAFeatureAdvancedPowerManagement = 0x04, + kIOATAFeatureCompactFlash = 0x08, + kIOATAFeature48BitLBA = 0x10, + kIOATAFeatureSMART = 0x20 +}; + +/* ATA Advanced Power Management settings (valid settings range from 1-254), +the settings below are the more common settings */ +enum +{ + kIOATAMaxPerformance = 0xFE, + kIOATADefaultPerformance = 0x80, + kIOATAMaxPowerSavings = 0x01 +}; + +/* ATA Transfer Mode bit masks */ +enum +{ + kATAEnableUltraDMAModeMask = 0x40, + kATAEnableMultiWordDMAModeMask = 0x20, + kATAEnablePIOModeMask = 0x08 +}; + + +typedef uint32_t ATAOperationType; +enum +{ + kATAOperationTypeRead = 0, + kATAOperationTypeWrite = 1, + kATAOperationTypeFlushCache = 2, + kATAOperationTypeSMART = 3, + kATAOperationTypeConfiguration = 4, + kATAOperationTypePowerManagement = 5, + kATAOperationTypeSMS = 6 +}; + +#if defined(KERNEL) + +typedef struct __ATAIORequest * ATARequestIdentifier; + +#endif // defined(KERNEL) + +#ifdef __cplusplus +} +#endif + +#endif /* _IOKIT_IO_ATA_STORAGE_DEFINES_H_ */ diff --git a/QualcommWireless/include/IOKit/stream/IOStream.h b/QualcommWireless/include/IOKit/stream/IOStream.h new file mode 100644 index 0000000..060c7cb --- /dev/null +++ b/QualcommWireless/include/IOKit/stream/IOStream.h @@ -0,0 +1,609 @@ +/* + * Copyright 2006 Apple Computer, Inc. All rights reserved. + * + */ + +#if !defined(__IOKIT_IOSTREAM_H) +#define __IOKIT_IOSTREAM_H + +#include <IOKit/IOService.h> +#include <IOKit/IOMemoryDescriptor.h> +#include <IOKit/IOBufferMemoryDescriptor.h> +#include <IOKit/IOUserClient.h> + +#include <IOKit/stream/IOStreamShared.h> + +/*! + @header IOStream.h + Definitions for IOStream family. + */ + +class IOStreamBuffer; + +/*! + @class IOStream + @abstract + A class representing a stream of data buffers passed from kernel to + user space and back again. + @discussion + The IOStream class defines a mechanism for moving buffers of data from + kernel space to user space or vice-versa. The policy for which direction + the data flows and the nature of the data is left up the the implementer + of the driver which uses IOStream. + + Although it is expected that the client of an IOStream will be in user space, + this is not required. + + References to "output" mean "from the IOStream to the user client", and + "input" means "from the user client to the IOStream." + + */ + +class IOStream : public IOService +{ + OSDeclareDefaultStructors(IOStream); + + protected: + OSArray * _buffers; // IOStreamBuffer objects in this stream + + IOItemCount _queueCount; // Number of entries for the queues + + IOMemoryDescriptor * _inputQueueDescriptor; + IOMemoryMap * _inputQueueMap; + + IOMemoryDescriptor * _outputQueueDescriptor; + IOMemoryMap * _outputQueueMap; + + IOStreamBufferQueue * _outputQueue; // Shared memory for buffers out to user space + IOStreamBufferQueue * _inputQueue; // Shared memory for buffers in from user space + + mach_port_t _outputPort; + mach_port_t _inputPort; + + OSArray * _memoryMaps; // Maps for data queues + + IOStreamMode _streamMode; + + public: + + /*! + @functiongroup Creating IOStream objects + */ + + /*! + @function withBuffers + @param mode The initial mode of the stream, either output, input, or input/output. + @param queueLength The nuber of queue entries to reserve in the input and output queue. + Zero means to make the queues big enough to accommodate all the buffers at once. + @param properties + A dictionary of properties which will be set on the stream. + @param buffers + An array of IOStreamBuffer objects which will be the buffers for this stream. + */ + + static IOStream *withBuffers(OSArray *buffers, IOStreamMode mode = kIOStreamModeOutput, IOItemCount queueLength = 0, OSDictionary *properties = 0); + + virtual bool init(OSDictionary *properties = 0); + + /*! + @function initWithBuffers + @param mode The initial mode of the stream, either output, input, or input/output. + @param queueLength The nuber of queue entries to reserve in the input and output queue. + Zero means to make the queues big enough to accommodate all the buffers at once. + @param properties + A dictionary of properties which will be set on the stream. + @param buffers + An array of IOStreamBuffer objects which will be the buffers for this stream. + */ + virtual bool initWithBuffers(OSArray *buffers, IOStreamMode mode = kIOStreamModeOutput, IOItemCount queueLength = 0, OSDictionary *properties = 0); + + /*! + @function free + */ + virtual void free(void); + + /*! + @functiongroup Opening and closing streams + */ + + /*! + @function handleOpen + @abstract The handleOpen() method relies on the default IOService behavior + to ensure that + only one client has the stream open at a time. + The shared input and output queues are created at open time. + @param options + @param arg + */ + virtual bool handleOpen( IOService * forClient, + IOOptionBits options, + void * arg ); + + /*! + @function handleClose + @abstract The handleClose method destroys the shared input and output + queues. + @param options + */ + virtual void handleClose( IOService * forClient, + IOOptionBits options ); + + /*! + @functiongroup Managing shared queues + */ + + /*! + @function createQueues + @abstract Creates the shared input and output queues, without regard + to whether the stream is open or not. + Normally this is called by handleOpen(). + @param queueLength + @param options + @result Returns kIOReturnSuccess if the queues were successfully created. + */ + virtual IOReturn createQueues( IOItemCount queueLength = 0, IOOptionBits options = 0 ); + + /*! + @function destroyQueues + @abstract Releases the shared input and output queues. + @result Returns kIOReturnSuccess if the queues were successfully destroyed. + The queues cannot be destroyed while the stream is open by a client. + */ + virtual IOReturn destroyQueues( void ); + + /*! + @function getOutputQueue + @result A pointer to the output IOStreamBufferQueue structure for the stream, + or NULL if the stream is not open and the queue has not been created yet. + */ + virtual IOStreamBufferQueue *getOutputQueue(void); // get shared-memory output queue + + /*! + @function getOutputQueueMemoryDescriptor + @result An IOMemoryDescriptor object repesenting the shared memory + output queue buffer. + */ + virtual IOMemoryDescriptor *getOutputQueueMemoryDescriptor(void); + + /*! + @function getInputQueue + @result A pointer to the input IOStreamBufferQueue structure for the stream, + or NULL if the stream is not open and the queue has not been created yet. + */ + virtual IOStreamBufferQueue *getInputQueue(void); // get shared-memory input queue + + /*! + @function getInputQueueMemoryDescriptor + @result An IOMemoryDescriptor object repesenting the shared memory + input queue buffer. + */ + virtual IOMemoryDescriptor *getInputQueueMemoryDescriptor(void); + + + /*! + @functiongroup Managing buffers in an IOStream + */ + + /*! + @function addBuffer + @abstract Add a buffer to an IOStream. + @param buffer + @discussion + Adds an IOStreamBuffer to an IOStream. It will be added to the end + of the buffer array, so the buffer ID of existing buffers will not change. + */ + virtual IOReturn addBuffer(IOStreamBuffer *buffer); // add a new buffer to the stream + + /*! + @function addBuffers + @param buffers + @result + */ + virtual IOReturn addBuffers(OSArray *buffers); + + /*! + @function removeBuffer + @param buffer A pointer to an IOStreamBuffer object in the stream. + @result Returns kIOReturnSuccess if the buffer was removed, or kIOReturnNotFound + if the buffer was not in this stream. + @abstract + Removes a buffer from the stream. Buffers cannot be removed + while the stream is open, as this will change the buffer IDs of existing + buffers. + */ + virtual IOReturn removeBuffer(IOStreamBuffer *buffer); + + /*! + @function removeBuffer + @param bufferID The ID of the buffer to remove. + @result Returns kIOReturnSuccess if the buffer was removed. + @abstract + Removes a buffer from the stream. Buffers cannot be removed + while the stream is open, as this will change the buffer IDs of existing + buffers. + */ + + virtual IOReturn removeBuffer(IOStreamBufferID bufferID); + + /*! + @function removeAllBuffers + @result + */ + virtual IOReturn removeAllBuffers( void ); + + /*! + @function removeAllBuffers + @result Returns kIOReturnSuccess if all the buffers were successfully + removed. Buffers cannot be removed + while the stream is open, as this will change the buffer IDs of existing + buffers. + + */ + virtual IOItemCount getBufferCount( void ); + + /*! + @function getBuffers + @abstract Get an array containing all the buffers in the stream. + @discussion + Returns an OSArray containing all the buffers in the stream in order of their buffer ID. + */ + virtual OSArray *getBuffers( void ); + + + /*! + @function getBufferWithID + @param bufferID + The ID of the buffer to get. + @result + A pointer to an IOStreamBuffer object, or NULL if the + buffer ID was invalid for this stream. + */ + + virtual IOStreamBuffer *getBufferWithID(IOStreamBufferID bufferID); + + /*! + @functiongroup Managing notification ports + */ + + /*! + @function getInputPort + @abstract Get the Mach port used to receive notifications + from user space that a buffer has been added to the input queue. + */ + virtual mach_port_t getInputPort(void); + + /*! + @function setInputPort + @abstract Set the Mach port used to receive notifications from + user space that a buffer has been added to the input queue. + @param port + + */ + virtual IOReturn setInputPort(mach_port_t port); + + /*! + @function getOutputPort + @abstract Get the Mach port used to send notifications to user space + that a buffer has been added to the output queue. + */ + virtual mach_port_t getOutputPort(void); + + /*! + @function setOutputPort + @abstract Set the Mach port used to send notifications to user space + that a buffer has been added to the output queue. + @param port + */ + virtual IOReturn setOutputPort(mach_port_t port); + + /*! + @function sendOutputNotification + @abstract Send a notification to the user client that data is available + for reading on the output queue. This will result in the user's output + handler being called, if they registered one. + @result Returns kIOReturnSuccess if the notification was successfully sent. + */ + virtual IOReturn sendOutputNotification(void); + + /*! + @functiongroup Queueing and dequeueing buffers + */ + + /*! + @function enqueueOutputBuffer + @abstract A convenience method for enqueueing a buffer. + @param buffer + @param dataOffset + @param dataLength + @param controlOffset + @param controlLength + @result + */ + virtual IOReturn enqueueOutputBuffer(IOStreamBuffer *buffer, + IOByteCount dataOffset = 0, + IOByteCount dataLength = 0, + IOByteCount controlOffset = 0, + IOByteCount controlLength = 0); + + + /*! + @function enqueueOutputEntry + @param entry + @result + */ + virtual IOReturn enqueueOutputEntry( IOStreamBufferQueueEntry *entry ); + + /*! + @function dequeueInputEntry + @param entry + @result + */ + virtual IOReturn dequeueInputEntry( IOStreamBufferQueueEntry *entry ); + + /*! + @functiongroup Managing notifications + */ + + /*! + @function inputCallback + @abstract Input callback function to be implemented by a subclass; + @param token + A 32-bit token value that can be used by convention to communicate + from user space to the stream. The semantics of this value are + defined by the IOStream subclass. + @discussion + The inputCallback() method is called as a result of a fast trap + from user space. It is called on the same thread as the user request, + but the subclass should implement this call as a notification sent + to a workloop so that the request is asynchronous. + */ + virtual void inputCallback( UInt32 token ); + + /*! + @function inputSyncCallback + @abstract Input callback function to be implemented by a subclass. + @param token + A 32-bit token value that can be used by convention to communicate + from user space to the stream. The semantics of this value are + defined by the IOStream subclass. + @discussion + The inputSyncCallback() method is called as a result of a fast trap + from user space. It is called on the same thread as the user request, + so no context switch is necessary. + */ + virtual void inputSyncCallback( UInt32 token ); + + /*! + @functiongroup Stream control + */ + + /*! + @function getStreamMode + @abstract Returns the mode of the stream, either input or output. + @result The mode of the stream, either kIOStreamModeInput + (from user space to kernel space) or the default + kIOStreamModeOutput (from kernel space to user space). + */ + virtual IOStreamMode getStreamMode(void); + + /*! + @function setStreamMode + @abstract Sets the mode of the stream, either input or output. + @discussion Subclasses may define whether it is possible + to change the mode of a stream. + */ + virtual IOReturn setStreamMode(IOStreamMode mode); + + /*! + @function startStream + @abstract Start sending data on a stream. + @result Returns kIOReturnSuccess if the stream was successfully started. + @discussion This must be implemented by a subclass. + */ + virtual IOReturn startStream(void); + + /*! + @function stopStream + @abstract Stop sending data on a stream. + @result Returns kIOReturnSuccess if the stream was successfully stopped. + @discussion This must be implemented by a subclass. + */ + virtual IOReturn stopStream(void); + + /*! + @function suspendStream + @abstract Temporarily suspend data flow on the stream. + @result Returns kIOReturnSuccess if the stream was successfully suspended. + @discussion This must be implemented by a subclass. + */ + virtual IOReturn suspendStream(void); + + /*! + @functiongroup Managing user clients + */ + + /*! + @function newUserClient + @abstract See the documentation for the IOService method newUserClient. + */ + virtual IOReturn newUserClient( task_t owningTask, void * securityID, + UInt32 type, OSDictionary * properties, + IOUserClient ** handler ); + + + /* Reserved slots */ + + OSMetaClassDeclareReservedUnused(IOStream, 0); + OSMetaClassDeclareReservedUnused(IOStream, 1); + OSMetaClassDeclareReservedUnused(IOStream, 2); + OSMetaClassDeclareReservedUnused(IOStream, 3); + OSMetaClassDeclareReservedUnused(IOStream, 4); + OSMetaClassDeclareReservedUnused(IOStream, 5); + OSMetaClassDeclareReservedUnused(IOStream, 6); + OSMetaClassDeclareReservedUnused(IOStream, 7); + OSMetaClassDeclareReservedUnused(IOStream, 8); + OSMetaClassDeclareReservedUnused(IOStream, 9); + OSMetaClassDeclareReservedUnused(IOStream, 10); + OSMetaClassDeclareReservedUnused(IOStream, 11); + OSMetaClassDeclareReservedUnused(IOStream, 12); + OSMetaClassDeclareReservedUnused(IOStream, 13); + OSMetaClassDeclareReservedUnused(IOStream, 14); + OSMetaClassDeclareReservedUnused(IOStream, 15); + OSMetaClassDeclareReservedUnused(IOStream, 16); + OSMetaClassDeclareReservedUnused(IOStream, 17); + OSMetaClassDeclareReservedUnused(IOStream, 18); + OSMetaClassDeclareReservedUnused(IOStream, 19); + OSMetaClassDeclareReservedUnused(IOStream, 20); + OSMetaClassDeclareReservedUnused(IOStream, 21); + OSMetaClassDeclareReservedUnused(IOStream, 22); + OSMetaClassDeclareReservedUnused(IOStream, 23); + OSMetaClassDeclareReservedUnused(IOStream, 24); + OSMetaClassDeclareReservedUnused(IOStream, 25); + OSMetaClassDeclareReservedUnused(IOStream, 26); + OSMetaClassDeclareReservedUnused(IOStream, 27); + OSMetaClassDeclareReservedUnused(IOStream, 28); + OSMetaClassDeclareReservedUnused(IOStream, 29); + OSMetaClassDeclareReservedUnused(IOStream, 30); + OSMetaClassDeclareReservedUnused(IOStream, 31); + +}; + + +/*! + @class IOStreamBuffer + A class representing a data buffer that is part of an IOStream. + */ + +class IOStreamBuffer : public OSObject +{ + OSDeclareDefaultStructors(IOStreamBuffer); + +protected: + IOMemoryDescriptor * _dataBuffer; // The data buffer is expected to be filled by hardware. + IOMemoryDescriptor * _controlBuffer; // The control buffer is expected to be defined by the hardware driver. + + IOStreamBufferID _bufferID; // Client handle for this buffer. + + OSArray * _clientMemoryMaps; // Maps for clients who are sharing these buffers. + + SInt32 _clientReferenceCount; // Count of client uses of this buffer. May be negative. + +public: + /*! + @function initWithMemoryDescriptors + */ + virtual bool initWithMemoryDescriptors(IOMemoryDescriptor *dataBuffer, + IOMemoryDescriptor *controlBuffer, + IOStreamBufferID bufferID = 0); + + /*! + @function withMemoryDescriptors + */ + static IOStreamBuffer *withMemoryDescriptors(IOMemoryDescriptor *dataBuffer, + IOMemoryDescriptor *controlBuffer, + IOStreamBufferID bufferID = 0); + + virtual void free(void); + + /*! + @function getBufferID + @abstract Gets the buffer identifier for the IOStreamBuffer object. + @discussion The buffer identifier is unique across all buffers in a stream. + */ + virtual IOStreamBufferID getBufferID(void); + + /*! + @function setBufferID + @abstract Sets the buffer identifier for the IOStreamBuffer object. + */ + + virtual void setBufferID( IOStreamBufferID bufferID ); + + /*! + @function setDataBuffer + @abstract Sets the data buffer for the IOStreamBuffer object. + */ + virtual void setDataBuffer(IOMemoryDescriptor *dataBuffer); + + /*! + @function setControlBuffer + @abstract Sets the control buffer for the IOStreamBuffer object. + */ + virtual void setControlBuffer(IOMemoryDescriptor *controlBuffer); + + /*! + @function getDataBuffer + @result A pointer to the IOMemoryDescriptor for the data buffer. + */ + virtual IOMemoryDescriptor *getDataBuffer(void); + + /*! + @function getControlBuffer + @result A pointer to the IOMemoryDescriptor for the control buffer. + */ + virtual IOMemoryDescriptor *getControlBuffer(void); + + /*! + @function getClientReferenceCount + @result The count of client references to this buffer. It may be positive + or negative, depending on whether the client is sending data into the kernel, + or the kernel is sending data out to the client. + */ + virtual SInt32 getClientReferenceCount( void ); + + /*! + @function sendClientReference + @param offset The offset in the buffer of the data sent to the client. + @param length The length of the data sent to the client. + @result The new client reference count. + @abstract + */ + virtual SInt32 sendClientReference( IOByteCount offset = 0, IOByteCount length = 0 ); + + /*! + @function receiveClientReference + @param offset The offset in the buffer of the data from the client. + @param length The length of the data from the client. + @abstract + */ + virtual SInt32 receiveClientReference( IOByteCount offset = 0, IOByteCount length = 0 ); + + /* Reserved slots */ + + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 0); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 1); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 2); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 3); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 4); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 5); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 6); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 7); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 8); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 9); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 10); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 11); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 12); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 13); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 14); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 15); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 16); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 17); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 18); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 19); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 20); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 21); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 22); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 23); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 24); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 25); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 26); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 27); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 28); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 29); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 30); + OSMetaClassDeclareReservedUnused(IOStreamBuffer, 31); + +}; + +#endif /* ! __IOKIT_IOSTREAM_H */ + diff --git a/QualcommWireless/include/IOKit/stream/IOStreamFamily.h b/QualcommWireless/include/IOKit/stream/IOStreamFamily.h new file mode 100644 index 0000000..a4eb7f0 --- /dev/null +++ b/QualcommWireless/include/IOKit/stream/IOStreamFamily.h @@ -0,0 +1,13 @@ +/* + * Copyright 2006 Apple Computer, Inc. All rights reserved. + * + */ + +#ifndef __IOKIT_IOSTREAMFAMILY_H +#define __IOKIT_IOSTREAMFAMILY_H + +#include <IOKit/stream/IOStream.h> +#include <IOKit/stream/IOStreamShared.h> + + +#endif /* !__IOKIT_IOSTREAMFAMILY_H */ diff --git a/QualcommWireless/include/IOKit/stream/IOStreamShared.h b/QualcommWireless/include/IOKit/stream/IOStreamShared.h new file mode 100644 index 0000000..7d520bb --- /dev/null +++ b/QualcommWireless/include/IOKit/stream/IOStreamShared.h @@ -0,0 +1,180 @@ +/* + * IOStreamShared.h + * IOStreamFamily + * + * Copyright 2006 Apple Computer, Inc. All rights reserved. + * + */ + +#if !defined(__IOKIT_IOSTREAMSHARED_H) +#define __IOKIT_IOSTREAMSHARED_H + +#include <sys/cdefs.h> + +#include <IOKit/IOTypes.h> + +/*! + @header IOStreamShared.h + IOStream definitions shared between kernel and user space. + */ + +__BEGIN_DECLS + +// Buffer numbers are guaranteed to go from 0 to bufferCount - 1. +/*! + @typedef IOStreamBufferID + */ +typedef UInt32 IOStreamBufferID; +#define kIOStreamBufferIDInvalid (~0) + +// This is the header for the shared-memory queue used to send buffer notifications +// from kernel to user space or vice versa. + +// Queue entry in input or output queue + +#ifdef __cplusplus + +/*! + @struct IOStreamBufferQueueEntry + @field bufferID The ID of the buffer passed in this queue entry. + @field dataLength The length of the valid data in the buffer. + @field reserved Reserved for future use. +*/ + +struct IOStreamBufferQueueEntry { + IOStreamBufferID bufferID; + UInt32 dataOffset; + UInt32 dataLength; + UInt32 controlOffset; + UInt32 controlLength; + UInt32 reserved[3]; +}; + + +/*! + @struct IOStreamBufferQueue + @field entryCount The number of queue entries in the queue. + @field headIndex The index of the next queue slot that will be filled in by the queue writer. + @field tailIndex The index of the next queue slot that can be read by the queue reader. + @field reserved Reserved for future use. + @field queue The array of queue entries. + */ + +struct IOStreamBufferQueue { + UInt32 entryCount; + volatile UInt32 headIndex; + volatile UInt32 tailIndex; + UInt32 reserved; + IOStreamBufferQueueEntry queue[0]; +}; + +#else + +typedef struct __IOStreamBufferQueueEntry { + IOStreamBufferID bufferID; + UInt32 dataOffset; + UInt32 dataLength; + UInt32 controlOffset; + UInt32 controlLength; + UInt32 reserved[3]; +} IOStreamBufferQueueEntry; + +typedef struct __IOStreamBufferQueue { + UInt32 entryCount; + volatile UInt32 headIndex; + volatile UInt32 tailIndex; + UInt32 reserved; + IOStreamBufferQueueEntry queue[0]; +} IOStreamBufferQueue; + +#endif + +/*! + @enum Memory mapping types + @constant kIOStreamMemoryTypeOutputQueue + @constant kIOStreamMemoryTypeInputQueue + @constant kIOStreamMemoryTypeBufferData + @constant kIOStreamMemoryTypeBufferControl + @constant kIOStreamBufferIDMask + @constant kIOStreamMemoryTypeMask + @abstract Memory types used with IOConnectMapMemory(). + @discussion + */ +enum { + kIOStreamMemoryTypeOutputQueue = 0x10000000, + kIOStreamMemoryTypeInputQueue = 0x20000000, + kIOStreamMemoryTypeBufferData = 0x30000000, + kIOStreamMemoryTypeBufferControl = 0x40000000, + kIOStreamBufferIDMask = 0x0FFFFFFF, + kIOStreamMemoryTypeMask = 0xF0000000 +}; + +/*! + @enum Mach port types + @constant kIOStreamPortTypeOutput + @constant kIOStreamPortTypeInput + @abstract Port types used with IOConnectSetNotificationPort(). + @discussion + */ +enum { + kIOStreamPortTypeOutput, + kIOStreamPortTypeInput +}; + +/*! + @enum IOStream open options + @discussion + */ + +enum { + kIOStreamOptionOpenExclusive = 0x00010000, + kIOStreamOptionOpenShared = 0x00020000 +}; + +/*! + @enum User client methods + @constant kIOStreamMethodOpen + @constant kIOStreamMethodClose + @constant kIOStreamMethodStart + @constant kIOStreamMethodStop + @constant kIOStreamMethodSuspend + @constant kIOStreamMethodGetMode + @constant kIOStreamMethodSetMode + + @abstract Client method numbers used with IOConnectMethod...() functions. + @discussion + */ +enum { + kIOStreamMethodOpen, + kIOStreamMethodClose, + kIOStreamMethodStart, + kIOStreamMethodStop, + kIOStreamMethodSuspend, + kIOStreamMethodGetMode, + kIOStreamMethodSetMode, + kIOStreamMethodGetBufferCount +}; + +/*! + @enum User client traps + @constant kIOStreamEnqueueInputTrap + @constant kIOStreamEnqueueInputSyncTrap + @abstract Client trap numbers used with IOConnectTrap..() functions. + @discussion + */ +enum { + kIOStreamEnqueueInputTrap, + kIOStreamEnqueueInputSyncTrap +}; + +typedef enum { + kIOStreamModeInput, // From user to kernel space + kIOStreamModeOutput, // From kernel to user space + kIOStreamModeInputOutput // bidirectional +} IOStreamMode; + + +__END_DECLS + +#endif /* ! __IOKIT_IOSTREAMSHARED_H */ + diff --git a/QualcommWireless/include/IOKit/stream/IOStreamUserClient.h b/QualcommWireless/include/IOKit/stream/IOStreamUserClient.h new file mode 100644 index 0000000..887575a --- /dev/null +++ b/QualcommWireless/include/IOKit/stream/IOStreamUserClient.h @@ -0,0 +1,76 @@ +/* + * IOStreamUserClient.h + * IOStreamFamily + * + * Copyright 2006 Apple Computer, Inc. All rights reserved. + * + */ + +#if !defined( __IOKIT_IOSTREAMUSERCLIENT_H ) +#define __IOKIT_IOSTREAMUSERCLIENT_H + + +#include <IOKit/IOUserClient.h> + +#include <IOKit/stream/IOStreamShared.h> +#include <IOKit/stream/IOStream.h> + +class IOStreamUserClient : public IOUserClient +{ + OSDeclareDefaultStructors( IOStreamUserClient ) + +protected: + IOStream * _owner; + task_t _task; + +public: + virtual bool initWithTask( + task_t owningTask, void * securityToken, UInt32 type, + OSDictionary * properties); + virtual bool initWithTask( + task_t owningTask, void * securityToken, UInt32 type); + + virtual IOReturn clientClose( void ); + virtual IOReturn clientDied( void ); + + virtual IOService * getService( void ); + + virtual IOReturn registerNotificationPort( + mach_port_t port, UInt32 type, UInt32 refCon ); + + virtual IOReturn connectClient( IOUserClient * client ); + + virtual IOExternalMethod * getTargetAndMethodForIndex( + IOService ** targetP, UInt32 index ); + + virtual IOExternalTrap * + getTargetAndTrapForIndex( IOService **targetP, UInt32 index ); + + virtual IOReturn clientMemoryForType( UInt32 type, + IOOptionBits * options, + IOMemoryDescriptor ** memory ); + + virtual bool start( IOService * provider ); + + +protected: + virtual IOReturn openMethod( char * dataIn, char * dataOut, + IOByteCount inputSize, IOByteCount * outputSize ); + virtual IOReturn closeMethod( void ); + virtual IOReturn startMethod( void ); + virtual IOReturn stopMethod( void ); + virtual IOReturn suspendMethod( void ); + virtual IOReturn getModeMethod( char * dataOut, + IOByteCount * outputSize ); + virtual IOReturn setModeMethod( char * dataIn, + IOByteCount inputSize ); + virtual IOReturn getBufferCountMethod( char * dataOut, + IOByteCount * outputSize ); + + virtual IOReturn inputTrap( UInt32 token ); + virtual IOReturn inputSyncTrap( UInt32 token ); + +}; + +#endif /* ! __IOKIT_IOSTREAMUSERCLIENT_H */ + diff --git a/QualcommWireless/include/IOKit/system.h b/QualcommWireless/include/IOKit/system.h new file mode 100644 index 0000000..75c0ac6 --- /dev/null +++ b/QualcommWireless/include/IOKit/system.h @@ -0,0 +1,67 @@ +/* + * Copyright (c) 1998-2004 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +#ifndef __IOKIT_SYSTEM_H +#define __IOKIT_SYSTEM_H + +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS +#endif + +#include <sys/cdefs.h> + +__BEGIN_DECLS + +#include <mach/mach_types.h> +#include <mach/mach_interface.h> +#include <mach/memory_object_types.h> + +#include <stdarg.h> +#include <stdint.h> +#include <string.h> + +#include <IOKit/assert.h> /* Must be before other includes of kern/assert.h */ + +#include <kern/kern_types.h> +#include <kern/thread.h> +#include <kern/debug.h> +#include <kern/task.h> +#include <kern/sched_prim.h> +#include <kern/locks.h> +#include <kern/queue.h> +#include <kern/ipc_mig.h> +#include <libkern/libkern.h> + + +#ifndef _MISC_PROTOS_H_ +extern void _doprnt( const char *format, va_list *arg, + void (*lputc)(char), int radix ); +#endif + +__END_DECLS + +#endif /* !__IOKIT_SYSTEM_H */ diff --git a/QualcommWireless/include/IOKit/system_management/IOWatchDogTimer.h b/QualcommWireless/include/IOKit/system_management/IOWatchDogTimer.h new file mode 100644 index 0000000..0139a7b --- /dev/null +++ b/QualcommWireless/include/IOKit/system_management/IOWatchDogTimer.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef _IOWATCHDOGTIMER_H +#define _IOWATCHDOGTIMER_H + +#include <IOKit/IOService.h> + +class IOWatchDogTimer : public IOService +{ + OSDeclareAbstractStructors(IOWatchDogTimer); + +protected: + IONotifier *notifier; + struct ExpansionData { }; + APPLE_KEXT_WSHADOW_PUSH; + ExpansionData *reserved; + APPLE_KEXT_WSHADOW_POP; + +public: + virtual bool start(IOService *provider) APPLE_KEXT_OVERRIDE; + virtual void stop(IOService *provider) APPLE_KEXT_OVERRIDE; + virtual IOReturn setProperties(OSObject *properties) APPLE_KEXT_OVERRIDE; + virtual void setWatchDogTimer(UInt32 timeOut) = 0; + + OSMetaClassDeclareReservedUnused(IOWatchDogTimer, 0); + OSMetaClassDeclareReservedUnused(IOWatchDogTimer, 1); + OSMetaClassDeclareReservedUnused(IOWatchDogTimer, 2); + OSMetaClassDeclareReservedUnused(IOWatchDogTimer, 3); +}; + +#endif /* !_IOWATCHDOGTIMER_H */ diff --git a/QualcommWireless/include/IOKit/usb/AppleUSBDefinitions.h b/QualcommWireless/include/IOKit/usb/AppleUSBDefinitions.h new file mode 100644 index 0000000..257b46f --- /dev/null +++ b/QualcommWireless/include/IOKit/usb/AppleUSBDefinitions.h @@ -0,0 +1,1214 @@ +/* + * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef AppleUSBCommon_AppleUSBDefinitions_h +#define AppleUSBCommon_AppleUSBDefinitions_h + +#include <TargetConditionals.h> +#if TARGET_OS_DRIVERKIT +#include <stdint.h> +#include <stddef.h> +#include <sys/_types/_uuid_t.h> +#include <DriverKit/IOTypes.h> +#include <DriverKit/IOLib.h> +#else +#include <IOKit/IOTypes.h> +#include <libkern/OSByteOrder.h> +#endif + +#ifndef IOUSBBit +#define IOUSBBit(bit) ((uint32_t)(1) << bit) +#endif + +#ifndef IOUSBBitRange +#define IOUSBBitRange(start, end) (~(((uint32_t)(1) << start) - 1) & (((uint32_t)(1) << end) | (((uint32_t)(1) << end) - 1))) +#endif + +#ifndef IOUSBBitRange64 +#define IOUSBBitRange64(start, end) (~(((uint64_t)(1) << start) - 1) & (((uint64_t)(1) << end) | (((uint64_t)(1) << end) - 1))) +#endif + +#ifndef IOUSBBitRangePhase +#define IOUSBBitRangePhase(start, end) (start) +#endif + +#ifndef USBToHost16 +#define USBToHost16 OSSwapLittleToHostInt16 +#endif + +#ifndef HostToUSB16 +#define HostToUSB16 OSSwapHostToLittleInt16 +#endif + +#ifndef USBToHost32 +#define USBToHost32 OSSwapLittleToHostInt32 +#endif + +#ifndef HostToUSB32 +#define HostToUSB32 OSSwapHostToLittleInt32 +#endif + +#ifndef USBToHost64 +#define USBToHost64 OSSwapLittleToHostInt64 +#endif + +#ifndef HostToUSB64 +#define HostToUSB64 OSSwapHostToLittleInt64 +#endif + +#define kIOUSB30Bitrate5Gbps ( 5 * 1000 * 1000 * 1000ULL) +#define kIOUSB30Bitrate10Gbps (10 * 1000 * 1000 * 1000ULL) +#define kIOUSB32Bitrate20Gbps (20 * 1000 * 1000 * 1000ULL) + +/*! + * @enum kIOUSBAppleVendorID + * @discussion Apple's vendor ID, assigned by the USB-IF + */ +enum +{ + kIOUSBAppleVendorID = 0x05AC +}; + +#pragma mark Descriptor definitions + +/*! + * @enum tIOUSBDescriptorType + * @brief Descriptor types defined by USB 2.0 Table 9-5 and USB 3.0 Table 9-6 + */ +enum tIOUSBDescriptorType +{ + kIOUSBDescriptorTypeDevice = 1, + kIOUSBDescriptorTypeConfiguration = 2, + kIOUSBDescriptorTypeString = 3, + kIOUSBDescriptorTypeInterface = 4, + kIOUSBDescriptorTypeEndpoint = 5, + kIOUSBDescriptorTypeDeviceQualifier = 6, + kIOUSBDescriptorTypeOtherSpeedConfiguration = 7, + kIOUSBDescriptorTypeInterfacePower = 8, + kIOUSBDescriptorTypeOTG = 9, + kIOUSBDescriptorTypeDebug = 10, + kIOUSBDescriptorTypeInterfaceAssociation = 11, + kIOUSBDescriptorTypeBOS = 15, + kIOUSBDescriptorTypeDeviceCapability = 16, + kIOUSBDecriptorTypeHID = 33, + kIOUSBDecriptorTypeReport = 34, + kIOUSBDescriptorTypePhysical = 35, + kIOUSBDescriptorTypeHub = 41, + kIOUSBDescriptorTypeSuperSpeedHub = 42, + kIOUSBDescriptorTypeSuperSpeedUSBEndpointCompanion = 48, + kIOUSBDescriptorTypeSuperSpeedPlusIsochronousEndpointCompanion = 49 +}; + +typedef enum tIOUSBDescriptorType tIOUSBDescriptorType; + +/*! + * @enum tIOUSBDescriptorSize + * @brief Size in bytes for descriptor structures + */ +enum tIOUSBDescriptorSize +{ + kIOUSBDescriptorHeaderSize = 2, + kIOUSBDescriptorSizeDevice = 18, + kIOUSBDescriptorSizeConfiguration = 9, + kIOUSBDescriptorSizeInterface = 9, + kIOUSBDescriptorSizeEndpoint = 7, + kIOUSBDescriptorSizeStringMinimum = kIOUSBDescriptorHeaderSize, + kIOUSBDescriptorSizeStringMaximum = 255, + kIOUSBDescriptorSizeDeviceQualifier = 10, + kIOUSBDescriptorSizeInterfaceAssociation = 8, + kIOUSBDescriptorSizeBOS = 5, + kIOUSBDescriptorSizeDeviceCapability = 3, + kIOUSBDescriptorSizeUSB20ExtensionCapability = 7, + kIOUSBDescriptorSizeSuperSpeedUSBDeviceCapability = 10, + kIOUSBDescriptorSizeContainerIDCapability = 20, + kIOUSBDescriptorSizeHubMinimum = 9, + kIOUSBDescriptorSizeHubMaximum = 21, + kIOUSBDescriptorSizeSuperSpeedHub = 12, + kIOUSBDescriptorSizeSuperSpeedUSBEndpointCompanion = 6, + kIOUSBDescriptorSizeSuperSpeedPlusIsochronousEndpointCompanion = 8, + kIOUSBDescriptorSizeBillboardDeviceMinimum = 44, + kIOUSBDescriptorSizeBillboardDeviceMaximum = 256, + kIOUSBDescriptorSizePlatformECIDCapability = 28, + kIOUSBDescriptorSizePlatformCapability = 20 +}; + +typedef enum tIOUSBDescriptorSize tIOUSBDescriptorSize; + +/*! + * @struct IOUSBDescriptorHeader + * @brief Base descriptor defined by USB 2.0 9.5 + * @discussion IOUSBDescriptorDefinitions declares structs to represent a variety of USB standard + * descriptors. + */ +struct IOUSBDescriptorHeader +{ + uint8_t bLength; + uint8_t bDescriptorType; +} __attribute__((packed)); + +typedef struct IOUSBDescriptorHeader IOUSBDescriptorHeader; + +/*! + * @brief Base descriptor defined by USB 2.0 9.5 + * @discussion Used to represent generic descriptor definitions + */ +typedef IOUSBDescriptorHeader IOUSBDescriptor; + +/*! + * @typedef IOUSBDeviceDescriptor + * @discussion Descriptor for a USB Device. + * See the USB Specification at <a href="http://www.usb.org" target="_blank">http://www.usb.org</a>. + */ +struct IOUSBDeviceDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t bcdUSB; + uint8_t bDeviceClass; + uint8_t bDeviceSubClass; + uint8_t bDeviceProtocol; + uint8_t bMaxPacketSize0; + uint16_t idVendor; + uint16_t idProduct; + uint16_t bcdDevice; + uint8_t iManufacturer; + uint8_t iProduct; + uint8_t iSerialNumber; + uint8_t bNumConfigurations; +} __attribute__((packed)); + +typedef struct IOUSBDeviceDescriptor IOUSBDeviceDescriptor; + +/*! + * @typedef IOUSBDeviceQualifierDescriptor + * @discussion USB Device Qualifier Descriptor. + * See the USB Specification at <a href="http://www.usb.org" target="_blank">http://www.usb.org</a>. + * USB 2.0 9.6.2: Device Qualifier + */ +struct IOUSBDeviceQualifierDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t bcdUSB; + uint8_t bDeviceClass; + uint8_t bDeviceSubClass; + uint8_t bDeviceProtocol; + uint8_t bMaxPacketSize0; + uint8_t bNumConfigurations; + uint8_t bReserved; +} __attribute__((packed)); + +typedef struct IOUSBDeviceQualifierDescriptor IOUSBDeviceQualifierDescriptor; + +/*! + * @typedef IOUSBConfigurationDescHeader + * @discussion Header of a IOUSBConfigurationDescriptor. Used to get the total length of the descriptor. + * USB 2.0 9.6.3: Configuration + */ +struct IOUSBConfigurationDescHeader +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t wTotalLength; +} __attribute__((packed)); + +typedef struct IOUSBConfigurationDescHeader IOUSBConfigurationDescHeader; + +/*! + * @typedef IOUSBConfigurationDescriptor + * @discussion Standard USB Configuration Descriptor. It is variable length, so this only specifies + * the known fields. We use the wTotalLength field to read the whole descriptor. + * See the USB Specification at <a href="http://www.usb.org" target="_blank">http://www.usb.org</a>. + * USB 2.0 9.6.3: Configuration + */ +struct IOUSBConfigurationDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t wTotalLength; + uint8_t bNumInterfaces; + uint8_t bConfigurationValue; + uint8_t iConfiguration; + uint8_t bmAttributes; + uint8_t MaxPower; +} __attribute__((packed)); + +typedef struct IOUSBConfigurationDescriptor IOUSBConfigurationDescriptor; + + +enum +{ + kIOUSBConfigurationDescriptorAttributeRemoteWakeCapable = IOUSBBit(5), + kIOUSBConfigurationDescriptorAttributeSelfPowered = IOUSBBit(6) +}; + + +/*! + * @typedef IOUSBInterfaceDescriptor + * @discussion Descriptor for a USB Interface. See the USB Specification at + * <a href="http://www.usb.org" target="_blank">http://www.usb.org</a>. + * USB 2.0 9.6.5: Interface + */ +struct IOUSBInterfaceDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bInterfaceNumber; + uint8_t bAlternateSetting; + uint8_t bNumEndpoints; + uint8_t bInterfaceClass; + uint8_t bInterfaceSubClass; + uint8_t bInterfaceProtocol; + uint8_t iInterface; +} __attribute__((packed)); + +typedef struct IOUSBInterfaceDescriptor IOUSBInterfaceDescriptor; + + +/*! + * @typedef IOUSBEndpointDescriptor + * @discussion Descriptor for a USB Endpoint. See the USB Specification at + * <a href="http://www.usb.org" target="_blank">http://www.usb.org</a>. + * USB 2.0 9.6.6: Endpoint + */ +struct IOUSBEndpointDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bEndpointAddress; + uint8_t bmAttributes; + uint16_t wMaxPacketSize; + uint8_t bInterval; +} __attribute__((packed)); + +typedef struct IOUSBEndpointDescriptor IOUSBEndpointDescriptor; + +enum +{ + kIOUSBEndpointDescriptorNumber = IOUSBBitRange(0, 3), + kIOUSBEndpointDescriptorNumberPhase = IOUSBBitRangePhase(0, 3), + kIOUSBEndpointDescriptorEndpointAddressReserved = IOUSBBitRange(4, 6), + kIOUSBEndpointDescriptorDirection = IOUSBBit(7), + kIOUSBEndpointDescriptorDirectionPhase = IOUSBBitRangePhase(7, 7), + kIOUSBEndpointDescriptorDirectionOut = 0, + kIOUSBEndpointDescriptorDirectionIn = IOUSBBit(7), + + kIOUSBEndpointDescriptorTransferType = IOUSBBitRange(0, 1), + kIOUSBEndpointDescriptorTransferTypePhase = IOUSBBitRangePhase(0, 1), + kIOUSBEndpointDescriptorTransferTypeControl = (0 << IOUSBBitRangePhase(0, 1)), + kIOUSBEndpointDescriptorTransferTypeIsochronous = (1 << IOUSBBitRangePhase(0, 1)), + kIOUSBEndpointDescriptorTransferTypeBulk = (2 << IOUSBBitRangePhase(0, 1)), + kIOUSBEndpointDescriptorTransferTypeInterrupt = (3 << IOUSBBitRangePhase(0, 1)), + kIOUSBEndpointDescriptorSynchronizationType = IOUSBBitRange(2, 3), + kIOUSBEndpointDescriptorSynchronizationTypePhase = IOUSBBitRangePhase(2, 3), + kIOUSBEndpointDescriptorSynchronizationTypeNone = (0 << IOUSBBitRangePhase(2, 3)), + kIOUSBEndpointDescriptorSynchronizationTypeAsynchronous = (1 << IOUSBBitRangePhase(2, 3)), + kIOUSBEndpointDescriptorSynchronizationTypeAdaptive = (2 << IOUSBBitRangePhase(2, 3)), + kIOUSBEndpointDescriptorSynchronizationTypeSynchronous = (3 << IOUSBBitRangePhase(2, 3)), + kIOUSBEndpointDescriptorUsageType = IOUSBBitRange(4, 5), + kIOUSBEndpointDescriptorUsageTypePhase = IOUSBBitRangePhase(4, 5), + kIOUSBEndpointDescriptorUsageTypeInterruptPeriodic = (0 << IOUSBBitRangePhase(4, 5)), + kIOUSBEndpointDescriptorUsageTypeInterruptNotification = (1 << IOUSBBitRangePhase(4, 5)), + kIOUSBEndpointDescriptorUsageTypeInterruptReserved1 = (2 << IOUSBBitRangePhase(4, 5)), + kIOUSBEndpointDescriptorUsageTypeInterruptReserved2 = (3 << IOUSBBitRangePhase(4, 5)), + kIOUSBEndpointDescriptorUsageTypeIsocData = (0 << IOUSBBitRangePhase(4, 5)), + kIOUSBEndpointDescriptorUsageTypeIsocFeedback = (1 << IOUSBBitRangePhase(4, 5)), + kIOUSBEndpointDescriptorUsageTypeIsocImplicit = (2 << IOUSBBitRangePhase(4, 5)), + kIOUSBEndpointDescriptorUsageTypeIsocReserved = (3 << IOUSBBitRangePhase(4, 5)), + + kIOUSBEndpointDescriptorPacketSize = IOUSBBitRange(0, 10), + kIOUSBEndpointDescriptorPacketSizePhase = IOUSBBitRangePhase(0, 10), + kIOUSBEndpointDescriptorPacketSizeMult = IOUSBBitRange(11, 12), + kIOUSBEndpointDescriptorPacketSizeMultPhase = IOUSBBitRangePhase(11, 12), + kIOUSBEndpointDescriptorReserved = IOUSBBitRange(13, 15), + kIOUSBEndpointDescriptorReservedPhase = IOUSBBitRangePhase(13, 15) +}; + +/*! + * @enum tIOUSBEndpointDirection + * @brief IO Direction of an endpoint + * @constant kIOUSBEndpointDirectionOut endpoint direction is host-to-device + * @constant kIOUSBEndpointDirectionIn endpoint direction is device-to-host + * @constant kIOUSBEndpointDirectionUnknown the direction is unknown + */ +enum tIOUSBEndpointDirection +{ + kIOUSBEndpointDirectionOut = (kIOUSBEndpointDescriptorDirectionOut >> kIOUSBEndpointDescriptorDirectionPhase), + kIOUSBEndpointDirectionIn = (kIOUSBEndpointDescriptorDirectionIn >> kIOUSBEndpointDescriptorDirectionPhase), + kIOUSBEndpointDirectionUnknown = 2 +}; + +typedef enum tIOUSBEndpointDirection tIOUSBEndpointDirection; + +/*! + * @enum tIOUSBEndpointType + * @brief Describes the type of endpoint + * @constant kIOUSBEndpointTypeControl endpoint is a control endpoint + * @constant kIOUSBEndpointTypeIsochronous endpoint is an isochronous endpoint + * @constant kIOUSBEndpointTypeBulk is a bulk endpoint + * @constant kIOUSBEndpointTypeInterrupt is an interrupt endpoint + */ +enum tIOUSBEndpointType +{ + kIOUSBEndpointTypeControl = (kIOUSBEndpointDescriptorTransferTypeControl >> kIOUSBEndpointDescriptorTransferTypePhase), + kIOUSBEndpointTypeIsochronous = (kIOUSBEndpointDescriptorTransferTypeIsochronous >> kIOUSBEndpointDescriptorTransferTypePhase), + kIOUSBEndpointTypeBulk = (kIOUSBEndpointDescriptorTransferTypeBulk >> kIOUSBEndpointDescriptorTransferTypePhase), + kIOUSBEndpointTypeInterrupt = (kIOUSBEndpointDescriptorTransferTypeInterrupt >> kIOUSBEndpointDescriptorTransferTypePhase) +}; + +typedef enum tIOUSBEndpointType tIOUSBEndpointType; + +enum tIOUSBEndpointSynchronizationType +{ + kIOUSBEndpointSynchronizationTypeNone = (kIOUSBEndpointDescriptorSynchronizationTypeNone >> kIOUSBEndpointDescriptorSynchronizationTypePhase), + kIOUSBEndpointSynchronizationTypeAsynchronous = (kIOUSBEndpointDescriptorSynchronizationTypeAsynchronous >> kIOUSBEndpointDescriptorSynchronizationTypePhase), + kIOUSBEndpointSynchronizationTypeAdaptive = (kIOUSBEndpointDescriptorSynchronizationTypeAdaptive >> kIOUSBEndpointDescriptorSynchronizationTypePhase), + kIOUSBEndpointSynchronizationTypeSynchronous = (kIOUSBEndpointDescriptorSynchronizationTypeSynchronous >> kIOUSBEndpointDescriptorSynchronizationTypePhase) +}; + +typedef enum tIOUSBEndpointSynchronizationType tIOUSBEndpointSynchronizationType; + +enum tIOUSBEndpointUsageType +{ + kIOUSBEndpointUsageTypeIsocData = (kIOUSBEndpointDescriptorUsageTypeIsocData >> kIOUSBEndpointDescriptorUsageTypePhase), + kIOUSBEndpointUsageTypeIsocFeedback = (kIOUSBEndpointDescriptorUsageTypeIsocFeedback >> kIOUSBEndpointDescriptorUsageTypePhase), + kIOUSBEndpointUsageTypeIsocImplicit = (kIOUSBEndpointDescriptorUsageTypeIsocImplicit >> kIOUSBEndpointDescriptorUsageTypePhase) +}; + +typedef enum tIOUSBEndpointUsageType tIOUSBEndpointUsageType; + +/*! + * @enum tIOUSBLanguageID + * @brief USB Language Identifiers 1.0 + */ +enum tIOUSBLanguageID +{ + kIOUSBLanguageIDEnglishUS = 0x0409 +}; + +typedef enum tIOUSBLanguageID tIOUSBLanguageID; + +/*! + * @typedef IOUSBStringDescriptor + * @discussion Descriptor for a USB Strings. See the USB Specification at + * <a href="http://www.usb.org" target="_blank">http://www.usb.org</a>. + * USB 2.0 9.6.7: String + */ +struct IOUSBStringDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bString[1]; +} __attribute__((packed)); + +typedef struct IOUSBStringDescriptor IOUSBStringDescriptor; + +enum tIOUSBDeviceCapabilityType +{ + // USB 3.0 Table 9-13 + kIOUSBDeviceCapabilityTypeWireless = 1, + kIOUSBDeviceCapabilityTypeUSB20Extension = 2, + kIOUSBDeviceCapabilityTypeSuperSpeed = 3, + kIOUSBDeviceCapabilityTypeContainerID = 4, + + // USB 3.1 Table 9-14 + kIOUSBDeviceCapabilityTypePlatform = 5, + kIOUSBDeviceCapabilityTypePowerDelivery = 6, + kIOUSBDeviceCapabilityTypeBatteryInfo = 7, + kIOUSBDeviceCapabilityTypePdConsumerPort = 8, + kIOUSBDeviceCapabilityTypePdProviderPort = 9, + kIOUSBDeviceCapabilityTypeSuperSpeedPlus = 10, + kIOUSBDeviceCapabilityTypePrecisionMeasurement = 11, + kIOUSBDeviceCapabilityTypeWirelessExt = 12, + kIOUSBDeviceCapabilityTypeBillboard = 13, + kIOUSBDeviceCapabilityTypeBillboardAltMode = 15 +}; + +typedef enum tIOUSBDeviceCapabilityType tIOUSBDeviceCapabilityType; + +/*! + * @typedef IOUSBBOSDescriptor + * @discussion USB BOS descriptor. See the USB Specification at + * <a href="http://www.usb.org" target="_blank">http://www.usb.org</a>. + * USB 3.0 9.6.2: Binary Device Object Store (BOS) + */ +struct IOUSBBOSDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t wTotalLength; + uint8_t bNumDeviceCaps; +} __attribute__((packed)); + +typedef struct IOUSBBOSDescriptor IOUSBBOSDescriptor; + + +/*! + * @typedef IOUSBDeviceCapabilityDescriptorHeader + * @discussion USB BOS descriptor. See the USB Specification at + * <a href="http://www.usb.org" target="_blank">http://www.usb.org</a>. + * USB 3.0 9.6.2: Binary Device Object Store (BOS) + */ +struct IOUSBDeviceCapabilityDescriptorHeader +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDevCapabilityType; + uint8_t bNumDeviceCaps; +} __attribute__((packed)); + +typedef struct IOUSBDeviceCapabilityDescriptorHeader IOUSBDeviceCapabilityDescriptorHeader; + +/*! + * @typedef IOUSBDeviceCapabilityUSB2Extension + * @discussion Device Capability USB 2.0 Extension. + * USB 3.0 9.6.2.1: USB 2.0 Extension + */ +struct IOUSBDeviceCapabilityUSB2Extension +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDevCapabilityType; + uint32_t bmAttributes; +} __attribute__((packed)); + +typedef struct IOUSBDeviceCapabilityUSB2Extension IOUSBDeviceCapabilityUSB2Extension; + + +enum +{ + kIOUSBUSB20ExtensionCapabilityLPM = IOUSBBit(1), + + // From USB 2.0 ECN Errata for Link Power Management. + kIOUSBUSB20ExtensionCapabilityBESLSupport = IOUSBBit(2), + kIOUSBUSB20ExtensionCapabilityBESLValid = IOUSBBit(3), + kIOUSBUSB20ExtensionCapabilityBESLDValid = IOUSBBit(4), + kIOUSBUSB20ExtensionCapabilityBESL = IOUSBBitRange(8, 11), + kIOUSBUSB20ExtensionCapabilityBESLPhase = IOUSBBitRangePhase(8, 11), + kIOUSBUSB20ExtensionCapabilityBESLD = IOUSBBitRange(12, 15), + kIOUSBUSB20ExtensionCapabilityBESLDPhase = IOUSBBitRangePhase(12, 15) +}; + + +/*! + * @typedef IOUSBDeviceCapabilitySuperSpeedUSB + * @discussion Device Capability SuperSpeed USB. USB 3.0 9.6.2.2: SuperSpeed USB Device Capability + */ +struct IOUSBDeviceCapabilitySuperSpeedUSB +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDevCapabilityType; + uint8_t bmAttributes; + uint16_t wSpeedsSupported; + uint8_t bFunctionalitySupport; + uint8_t bU1DevExitLat; + uint16_t wU2DevExitLat; +} __attribute__((packed)); + +typedef struct IOUSBDeviceCapabilitySuperSpeedUSB IOUSBDeviceCapabilitySuperSpeedUSB; + + +enum +{ + kIOUSBSuperSpeedDeviceCapabilityLTM = IOUSBBit(1), + + kIOUSBSuperSpeedDeviceCapabilityLowSpeed = IOUSBBit(0), + kIOUSBSuperSpeedDeviceCapabilityFullSpeed = IOUSBBit(1), + kIOUSBSuperSpeedDeviceCapabilityHighSpeed = IOUSBBit(2), + kIOUSBSuperSpeedDeviceCapability5Gb = IOUSBBit(3), + + kIOUSBSuperSpeedDeviceCapabilitySupportLowSpeed = 0, + kIOUSBSuperSpeedDeviceCapabilitySupportFullSpeed = 1, + kIOUSBSuperSpeedDeviceCapabilitySupportHighSpeed = 2, + kIOUSBSuperSpeedDeviceCapabilitySupport5Gb = 3, + + kIOUSBSuperSpeedDeviceCapabilityU1DevExitLatMax = 0xa, + kIOUSBSuperSpeedDeviceCapabilityU2DevExitLatMax = 0x7ff +}; + + +/*! + * @typedef IOUSBDeviceCapabilitySuperSpeedPlusUSB + * @discussion Device Capability SuperSpeedPlus USB. + * USB 3.1 9.6.2.5: SuperSpeedPlus USB Device Capability + */ +struct IOUSBDeviceCapabilitySuperSpeedPlusUSB +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDevCapabilityType; + uint8_t bReserved; + uint32_t bmAttributes; + uint16_t wFunctionalitySupport; + uint16_t wReserved; + uint32_t bmSublinkSpeedAttr[1]; +} __attribute__((packed)); + +typedef struct IOUSBDeviceCapabilitySuperSpeedPlusUSB IOUSBDeviceCapabilitySuperSpeedPlusUSB; + +enum +{ + //bmAttributes + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkSpeedAttrCount = IOUSBBitRange(0, 4), + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkSpeedAttrCountPhase = IOUSBBitRangePhase(0, 4), + + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkSpeedIdCount = IOUSBBitRange(5, 8), + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkSpeedIdCountPhase = IOUSBBitRangePhase(5, 8), + + //wFunctionalitySupport + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkMinSpeedId = IOUSBBitRange(0, 3), + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkMinSpeedIdPhase = IOUSBBitRangePhase(0, 3), + + kIOUSBSuperSpeedPlusDeviceCapabilityReserved = IOUSBBitRange(4, 7), + kIOUSBSuperSpeedPlusDeviceCapabilityReservedPhase = IOUSBBitRangePhase(4, 7), + + kIOUSBSuperSpeedPlusDeviceCapabilityMinRxLaneCount = IOUSBBitRange(8, 11), + kIOUSBSuperSpeedPlusDeviceCapabilityMinRxLaneCountPhase = IOUSBBitRangePhase(8, 11), + + kIOUSBSuperSpeedPlusDeviceCapabilityMinTxLaneCount = IOUSBBitRange(12, 15), + kIOUSBSuperSpeedPlusDeviceCapabilityMinTxLaneCountPhase = IOUSBBitRangePhase(12, 15), + + //bmSublinkSpeedAttr + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkSpeedId = IOUSBBitRange(0, 3), + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkSpeedIdPhase = IOUSBBitRangePhase(0, 3), + + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkLSE = IOUSBBitRange(4, 5), + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkLSEPhase = IOUSBBitRangePhase(4, 5), + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkLSEBits = (0 << kIOUSBSuperSpeedPlusDeviceCapabilitySublinkLSEPhase), + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkLSEKbits = (1 << kIOUSBSuperSpeedPlusDeviceCapabilitySublinkLSEPhase), + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkLSEMbits = (2 << kIOUSBSuperSpeedPlusDeviceCapabilitySublinkLSEPhase), + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkLSEGbits = (3 << kIOUSBSuperSpeedPlusDeviceCapabilitySublinkLSEPhase), + + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkType = IOUSBBitRange(6, 7), + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkTypePhase = IOUSBBitRangePhase(6, 7), + + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkSymmetry = IOUSBBit(6), + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkSymmetryPhase = IOUSBBitRangePhase(6, 6), + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkSymmetric = (0 << kIOUSBSuperSpeedPlusDeviceCapabilitySublinkSymmetryPhase), + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkAsymmetric = (1 << kIOUSBSuperSpeedPlusDeviceCapabilitySublinkSymmetryPhase), + + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkDirection = IOUSBBit(7), + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkDirectionPhase = IOUSBBitRangePhase(7, 7), + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkDirectionRx = (0 << kIOUSBSuperSpeedPlusDeviceCapabilitySublinkDirectionPhase), + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkDirectionTx = (1 << kIOUSBSuperSpeedPlusDeviceCapabilitySublinkDirectionPhase), + + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkReserved = IOUSBBitRange(8, 13), + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkReservedPhase = IOUSBBitRangePhase(8, 13), + + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkProtocol = IOUSBBitRange(14, 15), + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkProtocolPhase = IOUSBBitRangePhase(14, 15), + + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkSpeedMantissa = IOUSBBitRange(16, 31), + kIOUSBSuperSpeedPlusDeviceCapabilitySublinkSpeedMantissaPhase = IOUSBBitRangePhase(16, 31), +}; + + +/*! + * @typedef IOUSBDeviceCapabilityContainerID + * @discussion Device Capability Container ID. + * USB 3.0 9.6.2.3: Container ID + */ +struct IOUSBDeviceCapabilityContainerID +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDevCapabilityType; + uint8_t bReservedID; + uint8_t containerID[16]; +} __attribute__((packed)); + +typedef struct IOUSBDeviceCapabilityContainerID IOUSBDeviceCapabilityContainerID; + + +/*! + * @typedef IOUSBPlatformCapabilityDescriptor + * @discussion Device Capability Platform Descriptor. + * USB 3.1 9.6.2.4: Platform Descriptor + */ +struct IOUSBPlatformCapabilityDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDevCapabilityType; + uint8_t bReserved; + uuid_t PlatformCapabilityUUID; +} __attribute__((packed)); + +typedef struct IOUSBPlatformCapabilityDescriptor IOUSBPlatformCapabilityDescriptor; + + +/*! + * @typedef IOUSBDeviceCapabilityBillboardAltConfig + * @discussion Device Capability Billboard Alternate Setting Info. + * USB Billboard 3.1.6.2: Billboard Capability Descriptor V1.2 + */ +struct IOUSBDeviceCapabilityBillboardAltConfigCompatibility +{ + uint16_t wSVID; + uint32_t dwAlternateMode; + uint8_t iAlternateModeString; +} __attribute__((packed)); + +typedef struct IOUSBDeviceCapabilityBillboardAltConfigCompatibility IOUSBDeviceCapabilityBillboardAltConfigCompatibility; + +/*! + * @typedef IOUSBDeviceCapabilityBillboardAltConfig + * @discussion Device Capability Billboard Alternate Setting Info. + * USB Billboard 3.1.6.2: Billboard Capability Descriptor V1.1 and 1.21+ + */ +struct IOUSBDeviceCapabilityBillboardAltConfig +{ + uint16_t wSVID; + uint8_t bAltenateMode; + uint8_t iAlternateModeString; +} __attribute__((packed)); + +typedef struct IOUSBDeviceCapabilityBillboardAltConfig IOUSBDeviceCapabilityBillboardAltConfig; + +/*! + * @typedef IOUSBDeviceCapabilityBillboard + * @discussion Device Capability Billboard. + * USB Billboard 3.1.6.2: Billboard Capability Descriptor + */ +struct IOUSBDeviceCapabilityBillboard +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDevCapabilityType; + uint8_t iAdditionalInfoURL; + uint8_t bNumberOfAlternateModes; + uint8_t bPreferredAlternateMode; + uint16_t vCONNPower; + uint8_t bmConfigured[32]; + uint16_t bcdVersion; + uint8_t bAdditionalFailureInfo; + uint8_t bReserved; + IOUSBDeviceCapabilityBillboardAltConfig pAltConfigurations[]; +} __attribute__((packed)); + +typedef struct IOUSBDeviceCapabilityBillboard IOUSBDeviceCapabilityBillboard; + +/*! + * @typedef IOUSBDeviceCapabilityBillboardAltMode + * @discussion Device Capability Billboard Alternate mode. + * USB Billboard 3.1.6.3: Billboard Capability Descriptor V1.21 + */ +struct IOUSBDeviceCapabilityBillboardAltMode +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDevCapabilityType; + uint8_t bIndex; + uint16_t dwAlternateModeVdo; +} __attribute__((packed)); + +typedef struct IOUSBDeviceCapabilityBillboardAltMode IOUSBDeviceCapabilityBillboardAltMode; + +/*! + * @typedef IOUSBInterfaceAssociationDescriptor + * @discussion USB Inerface Association Descriptor. ECN to the USB 2.0 Spec. + * See the USB Specification at <a href="http://www.usb.org" target="_blank">http://www.usb.org</a>. + * USB 3.0 9.6.4: Interface Association + */ +struct IOUSBInterfaceAssociationDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bFirstInterface; + uint8_t bInterfaceCount; + uint8_t bFunctionClass; + uint8_t bFunctionSubClass; + uint8_t bFunctionProtocol; + uint8_t iFunction; +} __attribute__((packed)); + +typedef struct IOUSBInterfaceAssociationDescriptor IOUSBInterfaceAssociationDescriptor; + + +/*! + * @typedef IOUSBSuperSpeedEndpointCompanionDescriptor + * @discussion Descriptor for a SuperSpeed USB Endpoint Companion. + * See the USB Specification at <a href="http://www.usb.org"TARGET="_blank">http://www.usb.org</a>. + * USB 3.1 9.6.7: SuperSpeed Endpoint Companion + */ +struct IOUSBSuperSpeedEndpointCompanionDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bMaxBurst; + uint8_t bmAttributes; + uint16_t wBytesPerInterval; +} __attribute__((packed)); + +typedef struct IOUSBSuperSpeedEndpointCompanionDescriptor IOUSBSuperSpeedEndpointCompanionDescriptor; + + +enum +{ + kIOUSBSuperSpeedEndpointCompanionDescriptorMaxBurst = IOUSBBitRange(0, 4), + kIOUSBSuperSpeedEndpointCompanionDescriptorMaxBurstPhase = IOUSBBitRangePhase(0, 4), + + kIOUSBSuperSpeedEndpointCompanionDescriptorBulkMaxStreams = IOUSBBitRange(0, 4), + kIOUSBSuperSpeedEndpointCompanionDescriptorBulkMaxStreamsPhase = IOUSBBitRangePhase(0, 4), + kIOUSBSuperSpeedEndpointCompanionDescriptorBulkReserved = IOUSBBitRange(5, 7), + kIOUSBSuperSpeedEndpointCompanionDescriptorBulkReservedPhase = IOUSBBitRangePhase(5, 7), + kIOUSBSuperSpeedEndpointCompanionDescriptorIsocMult = IOUSBBitRange(0, 1), + kIOUSBSuperSpeedEndpointCompanionDescriptorIsocMultPhase = IOUSBBitRangePhase(0, 1), + kIOUSBSuperSpeedEndpointCompanionDescriptorIsocReserved = IOUSBBitRange(2, 6), + kIOUSBSuperSpeedEndpointCompanionDescriptorIsocReservedPhase = IOUSBBitRangePhase(2, 6), + kIOUSBSuperSpeedEndpointCompanionDescriptorSSPIsocCompanion = IOUSBBit(7) +}; + +/*! + * @typedef IOUSBSuperSpeedPlusIsochronousEndpointCompanionDescriptor + * @discussion Descriptor for a SuperSpeedPlus Isochronout USB Endpoint Companion. + * See the USB Specification at <a href="http://www.usb.org"TARGET="_blank">http://www.usb.org</a>. + * USB 3.1 9.6.8: SuperSpeedPlus Isochronous Endpoint Companion + */ +struct IOUSBSuperSpeedPlusIsochronousEndpointCompanionDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t wReserved; + uint32_t dwBytesPerInterval; +} __attribute__((packed)); + +typedef struct IOUSBSuperSpeedPlusIsochronousEndpointCompanionDescriptor IOUSBSuperSpeedPlusIsochronousEndpointCompanionDescriptor; + + + +/*! + * @typedef IOUSB20HubDescriptor + * @discussion Descriptor for a USB hub. + * See the USB Specification at <a href="http://www.usb.org"TARGET="_blank">http://www.usb.org</a>. + * USB 2.0 11.23.2.1: Hub Descriptor + */ +struct IOUSB20HubDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bNumberPorts; + uint16_t wHubCharacteristics; + uint8_t bPowerOnToPowerGood; + uint8_t bHubControllerCurrent; + uint8_t deviceRemovable[2]; // Technically variable size + uint8_t reserved[2]; // Unused +} __attribute__((packed)); + +typedef struct IOUSB20HubDescriptor IOUSB20HubDescriptor; + + +/*! + * @typedef IOUSBSuperSpeedHubDescriptor + * @discussion Descriptor for a Super Speed USB hub. + * See the USB Specification at <a href="http://www.usb.org"TARGET="_blank">http://www.usb.org</a>. + * USB 3.0 10.13.2.1: SuperSpeed Hub Descriptor + */ +struct IOUSBSuperSpeedHubDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bNumberPorts; + uint16_t wHubCharacteristics; + uint8_t bPowerOnToPowerGood; + uint8_t bHubControllerCurrent; + uint8_t bHubDecodeLatency; + uint16_t wHubDelay; + uint16_t deviceRemovable; +} __attribute__((packed)); + +typedef struct IOUSBSuperSpeedHubDescriptor IOUSBSuperSpeedHubDescriptor; + + +enum +{ + kIOUSBSuperSpeedHubCharacteristicsPowerSwitchingMask = IOUSBBitRange(0, 1), + kIOUSBSuperSpeedHubCharacteristicsPowerSwitchingGanged = (0 << IOUSBBitRangePhase(0, 1)), + kIOUSBSuperSpeedHubCharacteristicsPowerSwitchingIndividual = (1 << IOUSBBitRangePhase(0, 1)), + kIOUSBSuperSpeedHubCharacteristicsCompoundDevice = IOUSBBit(2), + kIOUSBSuperSpeedHubCharacteristicsOverCurrentMask = IOUSBBitRange(3, 4), + kIOUSBSuperSpeedHubCharacteristicsOverCurrentGlobal = (0 << IOUSBBitRangePhase(3, 4)), + kIOUSBSuperSpeedHubCharacteristicsOverCurrentIndividual = (1 << IOUSBBitRangePhase(3, 4)), + kIOUSBSuperSpeedHubCharacteristicsReserved = IOUSBBitRange(5, 15), + + kIOUSBSuperSpeedHubDecodeLatencyMax = 10, + kIOUSBSuperSpeedHubDelayMax = 400 +}; + +/*! + * @typedef UASPipeDescriptor + * @discussion Structure used to specify the Mass Storage Specific UAS pipe usage descriptor + */ +struct UASPipeDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bPipeID; + uint8_t bReserved; +} __attribute__((packed)); + +typedef struct UASPipeDescriptor UASPipeDescriptor; + +/*! + * @typedef IOUSBHIDDescriptor + * @discussion USB HID Descriptor. See the USB HID Specification at + * <a href="http://www.usb.org" target="_blank">http://www.usb.org</a>. + */ +struct IOUSBHIDDescriptor +{ + uint8_t descLen; + uint8_t descType; + uint16_t descVersNum; + uint8_t hidCountryCode; + uint8_t hidNumDescriptors; + uint8_t hidDescriptorType; + uint8_t hidDescriptorLengthLo; + uint8_t hidDescriptorLengthHi; +} __attribute__((packed)); + +typedef struct IOUSBHIDDescriptor IOUSBHIDDescriptor; + +/*! + * @typedef IOUSBHIDReportDesc + * @discussion USB HID Report Descriptor header. See the USB HID Specification at + * <a href="http://www.usb.org" target="_blank">http://www.usb.org</a>. + */ +struct IOUSBHIDReportDesc +{ + uint8_t hidDescriptorType; + uint8_t hidDescriptorLengthLo; + uint8_t hidDescriptorLengthHi; +} __attribute__((packed)); + +typedef struct IOUSBHIDReportDesc IOUSBHIDReportDesc; + +/*! + * @typedef IOUSBDFUDescriptor + * @discussion USB Device Firmware Update Descriptor. See the USB Device Firmware Update + * Specification at <a href="http://www.usb.org" target="_blank">http://www.usb.org</a>. + */ +struct IOUSBDFUDescriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bmAttributes; + uint16_t wDetachTimeout; + uint16_t wTransferSize; +} __attribute__((packed)); + +typedef struct IOUSBDFUDescriptor IOUSBDFUDescriptor; +#pragma mark Device requests +/*! + * @typedef IOUSBDeviceRequest + * @discussion Standard device request. + * See the USB Specification at <a href="http://www.usb.org"TARGET="_blank">http://www.usb.org</a>. + * USB 2.0 9.3: USB Device Requests + */ +struct IOUSBDeviceRequest +{ + uint8_t bmRequestType; + uint8_t bRequest; + uint16_t wValue; + uint16_t wIndex; + uint16_t wLength; +} __attribute__((packed)); + +typedef struct IOUSBDeviceRequest IOUSBDeviceRequest; + +/*! + * @typedef IOUSBDeviceRequestSetSELData + * @discussion See the USB Specification at <a href="http://www.usb.org"TARGET="_blank">http://www.usb.org</a>. + * USB 3.0 9.4.12: Set SEL Standard Device Request + */ +struct IOUSBDeviceRequestSetSELData +{ + uint8_t u1Sel; // Time in μs for U1 System Exit Latency + uint8_t u1Pel; // Time in μs for U1 Device to Host Exit Latency + uint16_t u2Sel; // Time in μs for U2 System Exit Latency + uint16_t u2Pel; // Time in μs for U2 Device to Host Exit Latency +} __attribute__((packed)); + +typedef struct IOUSBDeviceRequestSetSELData IOUSBDeviceRequestSetSELData; + +/*! + * @enum tIOUSBDeviceRequestDirectionValue + * @brief Values of 'direction' field of a device request + * @constant kIOUSBDeviceRequestDirectionValueOut the device request data phase direction is host-to-device + * @constant kIOUSBDeviceRequestDirectionValueIn the device request data phase direction is device-to-host + */ +enum tIOUSBDeviceRequestDirectionValue +{ + kIOUSBDeviceRequestDirectionValueOut = 0, + kIOUSBDeviceRequestDirectionValueIn = 1 +}; + +typedef enum tIOUSBDeviceRequestDirectionValue tIOUSBDeviceRequestDirectionValue; + +/*! + * @enum tIOUSBDeviceRequestType + * @brief Values of 'type' field of a device request + * @constant kIOUSBDeviceRequestTypeValueStandard the device request is a standard device request + * @constant kIOUSBDeviceRequestTypeValueClass the device request is a class specified device request + * @constant kIOUSBDeviceRequestTypeValueVendor the device request is a vendor specified device request + */ +enum tIOUSBDeviceRequestTypeValue +{ + kIOUSBDeviceRequestTypeValueStandard = 0, + kIOUSBDeviceRequestTypeValueClass = 1, + kIOUSBDeviceRequestTypeValueVendor = 2 +}; + +typedef enum tIOUSBDeviceRequestTypeValue tIOUSBDeviceRequestTypeValue; + +/*! + * @enum tIOUSBDeviceRequestRecipientValue + * @brief Values of 'recipient' field of a device request + * @constant kIOUSBDeviceRequestRecipientValueDevice the device request's recipient is a device + * @constant kIOUSBDeviceRequestRecipientValueInterface the device request's recipient is an interface + * @constant kIOUSBDeviceRequestRecipientValueEndpoint the device request's recipient is an endpoint + * @constant kIOUSBDeviceRequestRecipientValueOther the device request's recipient is an other type + */ +enum tIOUSBDeviceRequestRecipientValue +{ + kIOUSBDeviceRequestRecipientValueDevice = 0, + kIOUSBDeviceRequestRecipientValueInterface = 1, + kIOUSBDeviceRequestRecipientValueEndpoint = 2, + kIOUSBDeviceRequestRecipientValueOther = 3 +}; + +typedef enum tIOUSBDeviceRequestRecipientValue tIOUSBDeviceRequestRecipientValue; + +enum tIOUSBDeviceRequest +{ + kIOUSBDeviceRequestSize = 8, + kIOUSBDeviceRequestDirectionMask = IOUSBBit(7), + kIOUSBDeviceRequestDirectionPhase = IOUSBBitRangePhase(7, 7), + kIOUSBDeviceRequestDirectionOut = (kIOUSBDeviceRequestDirectionValueOut << kIOUSBDeviceRequestDirectionPhase), + kIOUSBDeviceRequestDirectionIn = (kIOUSBDeviceRequestDirectionValueIn << kIOUSBDeviceRequestDirectionPhase), + kIOUSBDeviceRequestTypeMask = IOUSBBitRange(5, 6), + kIOUSBDeviceRequestTypePhase = IOUSBBitRangePhase(5, 6), + kIOUSBDeviceRequestTypeStandard = (kIOUSBDeviceRequestTypeValueStandard << kIOUSBDeviceRequestTypePhase), + kIOUSBDeviceRequestTypeClass = (kIOUSBDeviceRequestTypeValueClass << kIOUSBDeviceRequestTypePhase), + kIOUSBDeviceRequestTypeVendor = (kIOUSBDeviceRequestTypeValueVendor << kIOUSBDeviceRequestTypePhase), + kIOUSBDeviceRequestRecipientMask = IOUSBBitRange(0, 4), + kIOUSBDeviceRequestRecipientPhase = IOUSBBitRangePhase(0, 4), + kIOUSBDeviceRequestRecipientDevice = (kIOUSBDeviceRequestRecipientValueDevice << kIOUSBDeviceRequestRecipientPhase), + kIOUSBDeviceRequestRecipientInterface = (kIOUSBDeviceRequestRecipientValueInterface << kIOUSBDeviceRequestRecipientPhase), + kIOUSBDeviceRequestRecipientEndpoint = (kIOUSBDeviceRequestRecipientValueEndpoint << kIOUSBDeviceRequestRecipientPhase), + kIOUSBDeviceRequestRecipientOther = (kIOUSBDeviceRequestRecipientValueOther << kIOUSBDeviceRequestRecipientPhase), +}; + +// USB 2.0 9.4: Standard Device Requests +// USB 3.0 9.4: Standard Device Requests +enum +{ + kIOUSBDeviceRequestGetStatus = 0, + kIOUSBDeviceRequestClearFeature = 1, + kIOUSBDeviceRequestGetState = 2, + kIOUSBDeviceRequestSetFeature = 3, + kIOUSBDeviceRequestSetAddress = 5, + kIOUSBDeviceRequestGetDescriptor = 6, + kIOUSBDeviceRequestSetDescriptor = 7, + kIOUSBDeviceRequestGetConfiguration = 8, + kIOUSBDeviceRequestSetConfiguration = 9, + kIOUSBDeviceRequestGetInterface = 10, + kIOUSBDeviceRequestSetInterface = 11, + kIOUSBDeviceRequestSynchFrame = 12, + kIOUSBDeviceRequestSetSel = 48, + kIOUSBDeviceRequestSetIsochronousDelay = 49 +}; + +// USB 2.0 9.4.5: Get Status +// USB 3.0 9.4.5: Get Status +enum +{ + kIOUSBDeviceStatusSelfPowered = IOUSBBit(0), + kIOUSBDeviceStatusRemoteWakeEnable = IOUSBBit(1), + kIOUSBDeviceStatusU1Enable = IOUSBBit(2), + kIOUSBDeviceStatusU2Enable = IOUSBBit(3), + kIOUSBDeviceStatusLTMEnable = IOUSBBit(4), + + kIOUSBInterfaceStatusRemoteWakeCapable = IOUSBBit(0), + kIOUSBInterfaceStatusRemoteWakeEnable = IOUSBBit(1), + + IOUSBEndpointStatusHalt = IOUSBBit(0) +}; + +// USB 2.0 Table 9-6: Standard Feature Selectors +// USB 3.0 Table 9-7: Standard Feature Selectors +enum +{ + kIOUSBDeviceFeatureSelectorRemoteWakeup = 1, + kIOUSBDeviceFeatureSelectorTestMode = 2, + kIOUSBDeviceFeatureSelectorU1Enable = 48, + kIOUSBDeviceFeatureSelectorU2Enable = 49, + kIOUSBDeviceFeatureSelectorLTMEnable = 50, + + kIOUSBInterfaceFeatureSelectorSuspend = 0, + + IOUSBEndpointFeatureSelectorStall = 0, +}; + +// USB 3.0 Table 9-8: Suspend Options +enum +{ + kIOUSBInterfaceSuspendLowPower = IOUSBBit(0), + kIOUSBInterfaceSuspendRemoteWakeEnable = IOUSBBit(1) +}; + +// USB 3.0 Table 10-16: Hub Parameters +enum +{ + kIOUSBHubPort2PortExitLatencyNs = 1000, + kIOUSBHubDelayNs = 400 +}; + +// USB 3.0 Table 8-33: Timing Parameters +enum +{ + kIOUSBPingResponseTimeNs = 400 +}; + +#pragma mark Power Constants +enum tIOUSBBusVoltage +{ + kIOUSBBusVoltageDefault = 5 +}; + +enum tIOUSB20BusCurrent +{ + kIOUSB20BusCurrentMinimum = 100, + kIOUSB20BusCurrentDefault = 500, + kIOUSB20BusCurrentMaxPowerUnits = 2 +}; + +enum tIOUSB30BusCurrent +{ + kIOUSB30BusCurrentMinimum = 150, + kIOUSB30BusCurrentDefault = 900, + kIOUSB30BusCurrentMaxPowerUnits = 8 +}; + +#pragma mark USB 3.0 constants +// USB 3.0 Table 6-21 +enum tIOUSB30ResetTimeout +{ + kIOUSB30ResetMinimumTimeout = 80, + kIOUSB30ResetTypicalTimeout = 100, + kIOUSB30ResetMaximumTimeout = 120, + kIOUSB30ResetMaximumWithMarginTimeout = 150 +}; + +// USB 3.0 Table 7-12 +enum tIOUSB30LinkStateTimeout +{ + kIOUSB30LinkStateSSInactiveQuietTimeout = 12, + kIOUSB30LinkStateRxDetectQuietTimeout = 12, + kIOUSB30LinkStatePollingLFPSTimeout = 360, + kIOUSB30LinkStatePollingActiveTimeout = 12, + kIOUSB30LinkStatePollingConfigurationTimeout = 12, + kIOUSB30LinkStatePollingIdleTimeout = 2, + kIOUSB30LinkStateU0RecoveryTimeout = 1, + kIOUSB30LinkStateU0LTimeout = 0, // 10 microseconds + kIOUSB30LinkStateU1NoLFPSResponseTimeout = 2, + kIOUSB30LinkStateU1PingTimeout = 300, + kIOUSB30LinkStateU2NoLFPSResponseTimeout = 2, + kIOUSB30LinKStateU2RxDetectDelay = 100, + kIOUSB30LinkStateU3NoLFPSResponseTimeout = 10, + kIOUSB30LinkStateU3WakeupRetryDelay = 100, + kIOUSB30LinkStateU3RxDetectDelay = 100, + kIOUSB30LinkStateRecoveryActiveTimeout = 12, + kIOUSB30LinkStateRecoveryConfigurationTimeout = 6, + kIOUSB30LinkStateRecoveryIdleTimeout = 2, + kIOUSB30LinkStateLoopbackExitTimeout = 2, + kIOUSB30LinkStateHotResetActiveTimeout = 12, + kIOUSB30LinkStateHotResetExistTimeout = 2, + + // USB 3.0 7.5.4 + kIOUSB30LinkStatePollingDeadline = (kIOUSB30LinkStatePollingLFPSTimeout + 1 + kIOUSB30LinkStatePollingActiveTimeout + kIOUSB30LinkStatePollingConfigurationTimeout + kIOUSB30LinkStatePollingIdleTimeout), + + // USB 3.0 7.5.9 and 7.5.10 + kIOUSB30LinkStateSSResumeDeadline = (kIOUSB30LinkStateU3NoLFPSResponseTimeout + kIOUSB30LinkStateRecoveryActiveTimeout + kIOUSB30LinkStateRecoveryConfigurationTimeout + kIOUSB30LinkStateRecoveryIdleTimeout), +}; + +// USB 3.1 Table 8-18 +enum tIOUSB30DeviceNotificationType +{ + kIOUSB30DeviceNotificationTypeFunctionWake = 1, + kIOUSB30DeviceNotificationTypeLatencyTolerance = 2, + kIOUSB30DeviceNotificationTypeBusIntervalAdjustment = 3, + kIOUSB30DeviceNotificationTypeHostRoleRequest = 4, + kIOUSB30DeviceNotificationTypeSublinkSpeed = 5 +}; + +// USB 3.1 Table 8-36 +enum tIOUSB30TimingParameters +{ + kIOUSB30TimingParameterBELTDefaultNs = 1 * 1000 * 1000, + kIOUSB30TimingParameterBELTMinNs = 125 * 1000 +}; + +// USB 3.1 Table 10-12 Port Status Type Codes +enum tIOUSB30HubPortStatusCode +{ + kIOUSB30HubPortStatusCodeStandard = 0, + kIOUSB30HubPortStatusCodePD = 1, + kIOUSB30HubPortStatusCodeExt = 2, + kIOUSB30HubPortStatusCodeCount = 3 +}; + +/*! + * @typedef IOUSB30HubPortStatusExt + * @discussion See the USB Specification at <a href="http://www.usb.org"TARGET="_blank">http://www.usb.org</a>. + * USB 3.1 10.16.2.6 Get Port Status + */ +struct IOUSB30HubPortStatusExt +{ + uint16_t wPortStatus; + uint16_t wPortChange; + uint32_t dwExtPortStatus; +} __attribute__((packed)); + +// USB 3.1 Table 10-11. Note, offsets are specific to dwExtPortStatus +enum tIOUSB30HubExtStatus +{ + kIOUSB30HubExtStatusRxSublinkSpeedID = IOUSBBitRange(0, 3), + kIOUSB30HubExtStatusRxSublinkSpeedIDPhase = IOUSBBitRangePhase(0, 3), + + kIOUSB30HubExtStatusTxSublinkSpeedID = IOUSBBitRange(4, 7), + kIOUSB30HubExtStatusTxSublinkSpeedIDPhase = IOUSBBitRangePhase(4, 7), + + kIOUSB30HubExtStatusRxLaneCount = IOUSBBitRange(8, 11), + kIOUSB30HubExtStatusRxLaneCountPhase = IOUSBBitRangePhase(8, 11), + + kIOUSB30HubExtStatusTxLaneCount = IOUSBBitRange(12, 15), + kIOUSB30HubExtStatusTxLaneCountPhase = IOUSBBitRangePhase(12, 15) +}; + +#endif /* AppleUSBCommon_AppleUSBDefinitions_h */ diff --git a/QualcommWireless/include/IOKit/usb/IOUSBBus.h b/QualcommWireless/include/IOKit/usb/IOUSBBus.h new file mode 100644 index 0000000..21e6534 --- /dev/null +++ b/QualcommWireless/include/IOKit/usb/IOUSBBus.h @@ -0,0 +1,35 @@ +/* + * Copyright © 1998-2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOUSBBUS_H +#define _IOKIT_IOUSBBUS_H + +#include <IOKit/IOService.h> + +class IOUSBBus : public IOService +{ + OSDeclareAbstractStructors(IOUSBBus) +}; + +#endif + diff --git a/QualcommWireless/include/IOKit/usb/IOUSBCommand.h b/QualcommWireless/include/IOKit/usb/IOUSBCommand.h new file mode 100644 index 0000000..420d951 --- /dev/null +++ b/QualcommWireless/include/IOKit/usb/IOUSBCommand.h @@ -0,0 +1,280 @@ +/* + * Copyright � 1998-2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOUSBCOMMAND_H +#define _IOKIT_IOUSBCOMMAND_H + +#include <IOKit/IOCommand.h> +#include <IOKit/IOCommandPool.h> +#include <IOKit/IOMemoryDescriptor.h> +#include <IOKit/IODMACommand.h> +#include <IOKit/usb/USB.h> + +/* + * USB Command + * This is the command block for a USB command to be queued on the + * Command Gate of the WorkLoop. Although the actual work of creating + * the command and enqueueing it is done for them via the deviceRequest, + * read, and write methods, this is the primary way that devices will get + * work done. + * Note: This is private to IOUSBController and should be moved to a + * private header. + */ + +typedef enum { + DEVICE_REQUEST, // Device request using pointer + READ, + WRITE, + CREATE_EP, + DELETE_EP, + DEVICE_REQUEST_DESC, // Device request using descriptor + DEVICE_REQUEST_BUFFERCOMMAND, // Device request using a second IOUSBCommand in _bufferCommand + INVALID_SELECTOR = 0xFF, // For use to invalidate a IOUSBCommand that has been returned +} usbCommand; + +#define kUSBCommandScratchBuffers 10 +#define kUSBCommandScratch64Buffers 5 + +/* + IOUSBCommand + Subclass of IOCommand that is used to add USB specific data. +*/ +class IOUSBCommand : public IOCommand +{ + OSDeclareAbstractStructors(IOUSBCommand) + +protected: + usbCommand _selector; + IOUSBDeviceRequestPtr _request; + USBDeviceAddress _address; + UInt8 _endpoint; + UInt8 _direction; + UInt8 _type; + bool _bufferRounding; + IOMemoryDescriptor * _buffer; + IOUSBCompletion _uslCompletion; + IOUSBCompletion _clientCompletion; + UInt32 _dataRemaining; // For Control transfers + UInt8 _stage; // For Control transfers + IOReturn _status; + IOMemoryDescriptor * _origBuffer; + IOUSBCompletion _disjointCompletion; + IOByteCount _dblBufLength; + UInt32 _noDataTimeout; + UInt32 _completionTimeout; + UInt32 _UIMScratch[kUSBCommandScratchBuffers]; + + struct ExpansionData + { + IOByteCount _reqCount; + IOMemoryDescriptor *_requestMemoryDescriptor; + IOMemoryDescriptor *_bufferMemoryDescriptor; + bool _multiTransferTransaction; + bool _finalTransferInTransaction; + bool _useTimeStamp; + AbsoluteTime _timeStamp; + bool _isSyncTransfer; // Returns true if the command is used for a synchronous transfer + IODMACommand *_dmaCommand; // used to get memory mapping + IOUSBCommand *_bufferUSBCommand; // points to another IOUSBCommand used for phase 2 of control transactions + IOUSBCommand *_masterUSBCommand; // points from the bufferUSBCommand back to the parent command + UInt32 _streamID; + void * _backTrace[kUSBCommandScratchBuffers]; + UInt64 _UIMScratch64[kUSBCommandScratch64Buffers]; + }; + ExpansionData * _expansionData; + + // we override these OSObject method in order to allocate and release our expansion data + virtual bool init() APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + +public: + + // static constructor + static IOUSBCommand * NewCommand(void); + + // Manipulators + void SetSelector(usbCommand sel); + void SetRequest(IOUSBDeviceRequestPtr req); + void SetAddress(USBDeviceAddress addr); + void SetEndpoint(UInt8 ep); + void SetDirection(UInt8 dir); + void SetType(UInt8 type); + void SetBufferRounding(bool br); + void SetBuffer(IOMemoryDescriptor *buf); + void SetUSLCompletion(IOUSBCompletion completion); + void SetClientCompletion(IOUSBCompletion completion); + void SetDataRemaining(UInt32 dr); + void SetStage(UInt8 stage); + void SetStatus(IOReturn stat); + void SetOrigBuffer(IOMemoryDescriptor *buf); + void SetDisjointCompletion(IOUSBCompletion completion); + void SetDblBufLength(IOByteCount len); + void SetNoDataTimeout(UInt32 to); + void SetCompletionTimeout(UInt32 to); + void SetUIMScratch(UInt32 index, UInt32 value); + void SetUIMScratch64(UInt32 index, UInt64 value); + void SetReqCount(IOByteCount reqCount); + void SetRequestMemoryDescriptor(IOMemoryDescriptor *requestMemoryDescriptor); + void SetBufferMemoryDescriptor(IOMemoryDescriptor *bufferMemoryDescriptor); + void SetMultiTransferTransaction(bool); + void SetFinalTransferInTransaction(bool); + void SetUseTimeStamp(bool); + void SetTimeStamp(AbsoluteTime timeStamp); + void SetIsSyncTransfer(bool); + inline void SetDMACommand(IODMACommand *dmaCommand) { _expansionData->_dmaCommand = dmaCommand; } + inline void SetStreamID(UInt32 streamID) { _expansionData->_streamID = streamID; } + void SetBufferUSBCommand(IOUSBCommand *bufferUSBCommand); + void SetBT(UInt32 index, void * value); + + // Accessors + usbCommand GetSelector(void); + IOUSBDeviceRequestPtr GetRequest(void); + USBDeviceAddress GetAddress(void); + UInt8 GetEndpoint(void); + UInt8 GetDirection(void); + UInt8 GetType(void); + bool GetBufferRounding(void); + IOMemoryDescriptor * GetBuffer(void); + IOUSBCompletion GetUSLCompletion(void); + IOUSBCompletion GetClientCompletion(void); + UInt32 GetDataRemaining(void); + UInt8 GetStage(void); + IOReturn GetStatus(void); + IOMemoryDescriptor * GetOrigBuffer(void); + IOUSBCompletion GetDisjointCompletion(void); + IOByteCount GetDblBufLength(void); + UInt32 GetNoDataTimeout(void); + UInt32 GetCompletionTimeout(void); + UInt32 GetUIMScratch(UInt32 index); + UInt64 GetUIMScratch64(UInt32 index); + IOByteCount GetReqCount(void); + IOMemoryDescriptor * GetRequestMemoryDescriptor(void); + IOMemoryDescriptor * GetBufferMemoryDescriptor(void); + bool GetMultiTransferTransaction(void); + bool GetFinalTransferInTransaction(void); + bool GetUseTimeStamp(void); + AbsoluteTime GetTimeStamp(void); + bool GetIsSyncTransfer(void); + inline IODMACommand * GetDMACommand(void) {return _expansionData->_dmaCommand; } + inline UInt32 GetStreamID(void) {return _expansionData->_streamID; } + inline IOUSBCommand * GetBufferUSBCommand(void) {return _expansionData->_bufferUSBCommand; } + inline IOUSBCommand * GetMasterUSBCommand(void) {return _expansionData->_masterUSBCommand ? _expansionData->_masterUSBCommand : this;} +}; + + +class IOUSBIsocCommand : public IOCommand +{ + OSDeclareAbstractStructors(IOUSBIsocCommand) + +protected: + usbCommand _selector; + USBDeviceAddress _address; + UInt8 _endpoint; + UInt8 _direction; + IOMemoryDescriptor * _buffer; + IOUSBIsocCompletion _completion; + UInt64 _startFrame; + UInt32 _numFrames; + IOUSBIsocFrame * _frameList; + IOReturn _status; + + struct ExpansionData + { + UInt32 _updateFrequency; + bool _useTimeStamp; + AbsoluteTime _timeStamp; + bool _isSyncTransfer; // Returns true if the command is used for a synchronous transfer + bool _rosettaClient; + IODMACommand * _dmaCommand; + IOUSBIsocCompletion _uslCompletion; + bool _lowLatency; + UInt32 _UIMScratch[kUSBCommandScratchBuffers]; + }; + ExpansionData * _expansionData; + + // we override these OSObject method in order to allocate and release our expansion data + virtual bool init() APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + +public: + // static constructor + static IOUSBIsocCommand *NewCommand(void); + + // Manipulators + void SetSelector(usbCommand sel) {_selector = sel; } + void SetAddress(USBDeviceAddress addr) {_address = addr; } + void SetEndpoint(UInt8 ep) {_endpoint = ep; } + void SetDirection(UInt8 dir) {_direction = dir; } + void SetBuffer(IOMemoryDescriptor *buf) {_buffer = buf; } + void SetCompletion(IOUSBIsocCompletion completion) {_completion = completion; } + void SetStartFrame(UInt64 sf) {_startFrame = sf; } + void SetNumFrames(UInt32 nf) {_numFrames = nf; } + void SetFrameList(IOUSBIsocFrame *fl) {_frameList = fl; } + void SetStatus(IOReturn stat) {_status = stat; } + void SetUpdateFrequency( UInt32 fr) { _expansionData->_updateFrequency = fr; } + void SetUIMScratch(UInt32 index, UInt32 value) { if(index < kUSBCommandScratchBuffers)_expansionData->_UIMScratch[index] = value; } + void SetUseTimeStamp(bool useIt) { _expansionData->_useTimeStamp= useIt; } + void SetTimeStamp(AbsoluteTime timeStamp) { _expansionData->_timeStamp= timeStamp; } + void SetIsSyncTransfer(bool isSync) { _expansionData->_isSyncTransfer = isSync; } + void SetRosettaClient(bool isRosetta) { _expansionData->_rosettaClient = isRosetta; } + void SetDMACommand(IODMACommand *dmaCommand) { _expansionData->_dmaCommand = dmaCommand; } + void SetUSLCompletion(IOUSBIsocCompletion completion) { _expansionData->_uslCompletion = completion; } + void SetLowLatency(bool lowLatency) { _expansionData->_lowLatency = lowLatency; } + + // Accessors + usbCommand GetSelector(void) { return _selector; } + USBDeviceAddress GetAddress(void) { return _address; } + UInt8 GetEndpoint(void) { return _endpoint; } + UInt8 GetDirection(void) { return _direction; } + IOMemoryDescriptor * GetBuffer(void) { return _buffer; } + IOUSBIsocCompletion GetCompletion(void) { return _completion; } + UInt64 GetStartFrame(void) { return _startFrame; } + UInt32 GetNumFrames(void) { return _numFrames; } + IOUSBIsocFrame * GetFrameList(void) { return _frameList; } + UInt32 GetUpdateFrequency(void) { return _expansionData->_updateFrequency; } + UInt32 GetUIMScratch(UInt32 index) { return( (index < kUSBCommandScratchBuffers)?_expansionData->_UIMScratch[index]:0); } + IOReturn GetStatus(void) { return _status; } + bool GetUseTimeStamp(void) { return _expansionData->_useTimeStamp; } + AbsoluteTime GetTimeStamp(void) { return _expansionData->_timeStamp; } + bool GetIsSyncTransfer(void) { return _expansionData->_isSyncTransfer; } + bool GetIsRosettaClient(void) { return _expansionData->_rosettaClient; } + IODMACommand * GetDMACommand(void) { return _expansionData->_dmaCommand; } + IOUSBIsocCompletion GetUSLCompletion(void) { return _expansionData->_uslCompletion; } + bool GetLowLatency(void) { return _expansionData->_lowLatency; } +}; + +class IOUSBCommandPool : public IOCommandPool +{ + OSDeclareDefaultStructors( IOUSBCommandPool ) + +protected: + virtual IOReturn gatedReturnCommand(IOCommand * command) APPLE_KEXT_OVERRIDE; + virtual IOReturn gatedGetCommand(IOCommand ** command, bool blockForCommand) APPLE_KEXT_OVERRIDE; + +public: + static IOCommandPool * withWorkLoop(IOWorkLoop * inWorkLoop); +}; + + +#endif + diff --git a/QualcommWireless/include/IOKit/usb/IOUSBController.h b/QualcommWireless/include/IOKit/usb/IOUSBController.h new file mode 100644 index 0000000..94a9b71 --- /dev/null +++ b/QualcommWireless/include/IOKit/usb/IOUSBController.h @@ -0,0 +1,1186 @@ +/* + * Copyright � 1998-2013 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOUSBCONTROLLER_H +#define _IOKIT_IOUSBCONTROLLER_H + +//================================================================================================ +// +// Headers +// +//================================================================================================ +// +#include <libkern/c++/OSArray.h> + +#include <IOKit/IOService.h> +#include <IOKit/IOMemoryDescriptor.h> +#include <IOKit/IODeviceMemory.h> +#include <IOKit/IOWorkLoop.h> +#include <IOKit/IOCommandGate.h> +#include <IOKit/IOCommandPool.h> + +#include <IOKit/usb/USB.h> +#include <IOKit/usb/USBHub.h> +#include <IOKit/usb/IOUSBBus.h> +#include <IOKit/usb/IOUSBNub.h> +#include <IOKit/usb/IOUSBCommand.h> +#include <IOKit/usb/IOUSBWorkLoop.h> + +#include <IOKit/acpi/IOACPIPlatformDevice.h> + + +//================================================================================================ +// +// Types and Constants +// +//================================================================================================ +// +enum +{ + kErrataCMDDisableTestMode = (1ULL << 0), // turn off UHCI test mode + kErrataOnlySinglePageTransfers = (1ULL << 1), // Don't cross page boundaries in a single transfer + kErrataRetryBufferUnderruns = (1ULL << 2), // Don't cross page boundaries in a single transfer + kErrataLSHSOpti = (1ULL << 3), // Don't cross page boundaries in a single transfer + kErrataDisableOvercurrent = (1ULL << 4), // Always set the NOCP bit in rhDescriptorA register + kErrataLucentSuspendResume = (1ULL << 5), // Don't allow port suspend at the root hub + kErrataNeedsWatchdogTimer = (1ULL << 6), // Use Watchdog timer to reset confused controllers + kErrataNeedsPortPowerOff = (1ULL << 7), // Power off the ports and back on again to clear weird status. + kErrataAgereEHCIAsyncSched = (1ULL << 8), // needs workaround for Async Sched bug + kErrataNECOHCIIsochWraparound = (1ULL << 9), // needs workaround for NEC isoch buffer wraparound problem + kErrataNECIncompleteWrite = (1ULL << 10), // needs workaround for NEC bits not sticking (errata IBB-2UE-00030 Jun 23 2005) + kErrataICH6PowerSequencing = (1ULL << 11), // needs special power sequencing for early Transition machines + kErrataICH7ISTBuffer = (1ULL << 12), // buffer for Isochronous Scheduling Threshold + kErrataUHCISupportsOvercurrent = (1ULL << 13), // UHCI controller supports overcurrent detection + kErrataNeedsOvercurrentDebounce = (1ULL << 14), // The overcurrent indicator should be debounced by 10ms + kErrataSupportsPortResumeEnable = (1ULL << 15), // UHCI has resume enable bits at config address 0xC4 + kErrataNoCSonSplitIsoch = (1ULL << 16), // MCP79 - split iscoh is a little different + kErrataOHCINoGlobalSuspendOnSleep = (1ULL << 17), // when sleeping, do not put the OHCI controller in SUSPEND state. just leave it Operational with suspended downstream ports + kErrataMissingPortChangeInt = (1ULL << 18), // sometimes the port change interrupt may be missing + kErrataMCP79IgnoreDisconnect = (1ULL << 19), // MCP79 - need to ignore a connect/disconnect on wake + kErrataUse32bitEHCI = (1ULL << 20), // MCP79 - EHCI should only run with 32 bit DMA addresses + kErrataUHCISupportsResumeDetectOnConnect = (1ULL << 21), // UHCI controller will generate a ResumeDetect interrupt while in Global Suspend if a device is plugged in + kErrataDontUseCompanionController = (1ULL << 22), // For systems which will end up being EHCI only + kErrataIgnoreRootHubPowerClearFeature = (1ULL << 23), // MCP89 - don't power off the root hub ports + kErrataDisablePCIeLinkOnSleep = (1ULL << 24), // some controllers require us to do some extra work in the PCIe bridge on sleep.. we just set a property + kErrataXHCISWAssistXHCIIdle = (1ULL << 25), // XHCI requires software assist to go to Idle + kErrataEHCIUseRLvalue = (1ULL << 26), // we want to program Control and Bulk QHs with the RL on some controllers + kErrataXHCINoMSI = (1ULL << 27), // Don't use MSI Interrupts + kErrataXHCIEnableAutoCompliance = (1ULL << 28), // Enable auto compliance on this controller + kErrataXHCIPPTMuxing = (1ULL << 29), // Has Panther Point muxing implementation + kErratakUHCIResetAfterBabble = (1ULL << 30), // Used by UHCI for a particular vendor + kErrataXHCIParkRing = (1ULL << 31), // Enable Park/Ring + kErrataXHCIPantherPoint = (1ULL << 32), // This is an Intel Panther Point controller + kErrataXHCISWBandwidthCheck = (1ULL << 33) // This XHCI requires software to check the periodic bandwidth before creating an endpoint + +#ifndef __OPEN_SOURCE__ + // Other definitions in private header file +#endif +}; + +enum +{ + kUSBWatchdogTimeoutMS = 1000, + kUSBWatchdogTimeoutMSDuringRestartOff = 100 +}; + + +// Here are some constants which really need to be moved to IOPCIFamily +// This is a Power Management Register Block (section 3.2 of the PCI Power Management Spec) +enum +{ + kPCIPMRegBlockCapID = 0, // Capability ID + kPCIPMRegBlockNext = 1, // NextItemPtr + kPCIPMRegBlockPMC = 2, // Power Management Capabilities + kPCIPMRegBlockPMCSR = 4, // Power Management Control/Status Register + kPCIPMRegBlock_BSE = 6, // PMCSR Bridge Support Extensions + kPCIPMRegBlockData = 7 // Data +}; + + +/*! + @struct + @discussion This table contains the list of errata that are necessary for known problems with particular devices. + The format is vendorID, product ID, lowest revisionID needing errata, highest rev needing errata, errataBits. + The result of all matches is ORed together, so more than one entry may match. + Typically for a given errata a list of revisions that this applies to is supplied. + @field vendID The Vendor ID of the device + @field deviceID Product ID of device + @field revisionLo Lowest product revsion to apply errata to + @field revisionHi Highest product revision to apply errata to + @field errata Bit field flagging which errata to apply to device. +*/ + +struct ErrataListEntryStruct +{ + UInt16 vendID; + UInt16 deviceID; + UInt16 revisionLo; + UInt16 revisionHi; + UInt32 errata; +}; + +typedef struct ErrataListEntryStruct ErrataListEntry, *ErrataListEntryPtr; + + +struct ErrataList64EntryStruct +{ + UInt16 vendID; + UInt16 deviceID; + UInt16 revisionLo; + UInt16 revisionHi; + UInt64 errata; +}; + +typedef struct ErrataList64EntryStruct ErrataList64Entry, *ErrataList64EntryPtr; + + +struct SleepCurrentPerModelStruct +{ + char model[14]; + UInt32 totalExtraWakeCurrent; // Above the 500mA available to each port + UInt32 maxWakeCurrentPerPort; // Any one port can not exceed this + UInt32 totalExtraSleepCurrent; // Above the 500mA available to each port + UInt32 maxSleepCurrentPerPort; // Any one port can not exceed this +}; + +typedef struct SleepCurrentPerModelStruct SleepCurrentPerModel, *SleepCurrentPerModelPtr; + + +//================================================================================================ +// +// Routines used to implement synchronous I/O +// +//================================================================================================ +// +void IOUSBSyncCompletion(void *target, void * parameter, IOReturn status, UInt32 bufferSizeRemaining); + +void IOUSBSyncIsoCompletion(void *target, void * parameter, IOReturn status, IOUSBIsocFrame *pFrames); + + +//================================================================================================ +// +// Forward Declarations +// +//================================================================================================ +// +class IOUSBDevice; +class IOUSBLog; +class IOUSBHubDevice; +class IOUSBRootHubDevice; +class IOMemoryDescriptor; +class AppleUSBHubPort; + +//================================================================================================ +// +// IOUSBController Class +// +//================================================================================================ +// +/*! + @class IOUSBController + @abstract Base class for USB hardware driver + @discussion Not many directly useful methods for USB device driver writers, + IOUSBDevice, IOUSBInterface and IOUSBPipe provide more useful abstractions. + The bulk of this class interfaces between IOKit and the low-level UIM, which is + based on the MacOS9 UIM. To impliment a new controller type, subclass + IOUSBController and impiment all the "UIM functions". AppleUSBOHCI + is an example of this implementing all the functions necessary to drive an + OHCI controller. +*/ +class IOUSBController : public IOUSBBus +{ + OSDeclareAbstractStructors(IOUSBController) + friend class IOUSBControllerV2; + friend class IOUSBControllerV3; + friend class AppleUSBHub; + friend class IOUSBRootHubDevice; + +protected: + + IOUSBWorkLoop * _workLoop; + IOCommandGate * _commandGate; + IOUSBRootHubDevice * _rootHubDevice; + UInt32 _devZeroLock; + static UInt32 _busCount; + static bool gUsedBusIDs[256]; + static UInt32 gExtraCurrentPropertiesInitialized; + + struct ExpansionData + { + IOCommandPool *freeUSBCommandPool; + IOCommandPool *freeUSBIsocCommandPool; + IOTimerEventSource *watchdogUSBTimer; + bool _terminating; + bool _watchdogTimerActive; + bool _pcCardEjected; // Obsolete + UInt32 _busNumber; + UInt32 _currentSizeOfCommandPool; + UInt32 _currentSizeOfIsocCommandPool; + UInt8 _controllerSpeed; // Controller speed, passed down for splits + thread_call_t _terminatePCCardThread; // Obsolete + bool _addressPending[kUSBMaxDevices+2]; + SInt32 _activeIsochTransfers; // isochronous transfers in the queue + IOService *_provider; // common name for our provider + bool _controllerCanSleep; // true iff the controller is able to support sleep/wake + bool _needToClose; + UInt32 _isochMaxBusStall; // value (in ns) of the maximum PCI bus stall allowed for Isoch. + SInt32 _activeInterruptTransfers; // interrupt transfers in the queue + IOUSBRootHubDevice *_rootHubDeviceSS; + UInt32 _locationID; + UInt32 _ignoreDisconnectBitmap; // Port bitmap (adjusted for HS/SS ranges for XHCI controllers) + UInt32 _watchdogTimerTimeout; + bool _usePCIBusNumber; // T if we should use the PCI bus number in the calculations for USB Bus number + UInt32 _acpiRootHubDepth; // depth of the root hub in the ACPI device tree, this value is either hard coded or set to + bool _onThunderbolt; // T if this controller is on a Thunderbolt bus + UInt32 _locationID_SS; + }; + ExpansionData *_expansionData; + + // The following methods do not use and upper case initial letter because they are part of IOKit + // + +public: + static volatile UInt32 gExternalNonSSPortsUsingExtraCurrent; + + virtual bool init( OSDictionary * propTable ) APPLE_KEXT_OVERRIDE; + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void stop( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual bool finalize(IOOptionBits options) APPLE_KEXT_OVERRIDE; + virtual IOReturn message( UInt32 type, IOService * provider, void * argument = 0 ) APPLE_KEXT_OVERRIDE; + virtual bool didTerminate( IOService * provider, IOOptionBits options, bool * defer ) APPLE_KEXT_OVERRIDE; + + void ReturnUSBCommand( IOUSBCommand * command ); + +protected: + + IOReturn getNubResources( IOService * regEntry ); + + virtual UInt32 GetErrataBits( + UInt16 vendorID, + UInt16 deviceID, + UInt16 revisionID ); + + + static IOReturn DoDeleteEP( + OSObject * owner, + void * arg0, + void * arg1, + void * arg2, + void * arg3 ); + + static IOReturn DoAbortEP( + OSObject * owner, + void * arg0, + void * arg1, + void * arg2, + void * arg3 ); + + static IOReturn DoClearEPStall( + OSObject * owner, + void * arg0, + void * arg1, + void * arg2, + void * arg3 ); + + static IOReturn DoCreateEP( + OSObject * owner, + void * arg0, + void * arg1, + void * arg2, + void * arg3 ); + static IOReturn DoControlTransfer( + OSObject * owner, + void * arg0, + void * arg1, + void * arg2, + void * arg3 ); + + static IOReturn DoIOTransfer( + OSObject * owner, + void * arg0, + void * arg1, + void * arg2, + void * arg3 ); + + static IOReturn DoIsocTransfer( + OSObject * owner, + void * arg0, + void * arg1, + void * arg2, + void * arg3 ); + + static IOReturn DoLowLatencyIsocTransfer( + OSObject * owner, + void * arg0, + void * arg1, + void * arg2, + void * arg3 ); + + static void ControlPacketHandler( + OSObject * target, + void * parameter, + IOReturn status, + UInt32 bufferSizeRemaining ); + + static void InterruptPacketHandler( + OSObject * target, + void * parameter, + IOReturn status, + UInt32 bufferSizeRemaining ); + + static void BulkPacketHandler( + OSObject * target, + void * parameter, + IOReturn status, + UInt32 bufferSizeRemaining ); + + static void IsocCompletionHandler( + OSObject * target, + void * parameter, + IOReturn status, + IOUSBIsocFrame *pFrames ); + + static void LowLatencyIsocCompletionHandler( + OSObject * target, + void * parameter, + IOReturn status, + IOUSBLowLatencyIsocFrame *pFrames ); + + static void WatchdogTimer(OSObject *target, IOTimerEventSource *sender); + + // Obsolete + static void TerminatePCCard(OSObject *target); + + static IOReturn ProtectedDevZeroLock(OSObject *target, void* lock, void *, void *, void*); + + + USBDeviceAddress GetNewAddress( void ); + + IOReturn ControlTransaction( IOUSBCommand * command ); + + IOReturn InterruptTransaction( IOUSBCommand * command ); + + IOReturn BulkTransaction( IOUSBCommand * command ); + + IOReturn IsocTransaction( IOUSBIsocCommand * command ); + + IOReturn LowLatencyIsocTransaction( IOUSBIsocCommand * command ); + + void FreeCommand( IOUSBCommand * command ); + + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // Invokes the specified completion action of the request. If + // the completion action is unspecified, no action is taken. + void Complete( + IOUSBCompletion completion, + IOReturn status, + UInt32 actualByteCount = 0 ); + + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // Invokes the specified completion action of the request. If + // the completion action is unspecified, no action is taken. + void CompleteWithTimeStamp ( + IOUSBCompletionWithTimeStamp completion, + IOReturn status, + UInt32 actualByteCount, + AbsoluteTime timeStamp); + + + + // + // UIM methods + // + +/*! + @function UIMInitialize + @abstract UIM function, initialise the controller and UIM data structures. +*/ + virtual IOReturn UIMInitialize( IOService * provider ) = 0; + +/*! + @function UIMFinalize + @abstract UIM function, finalise the controller and UIM data structures prior to removal. +*/ + virtual IOReturn UIMFinalize() = 0; + + // Control +/*! + @function UIMCreateControlEndpoint + @abstract UIM function, create a control endpoint for the controller. + @param functionNumber The USB device ID of the device for this endpoint + @param endpointNumber The endpoint number for this endpoint + @param maxPacketSize Maximum packet size of this endpoint + @param speed speed of the device: kUSBDeviceSpeedLow or kUSBDeviceSpeedFull +*/ + virtual IOReturn UIMCreateControlEndpoint( + UInt8 functionNumber, + UInt8 endpointNumber, + UInt16 maxPacketSize, + UInt8 speed) = 0; + +/* Note: this function has been superceded. */ + virtual IOReturn UIMCreateControlTransfer( short functionNumber, + short endpointNumber, + IOUSBCompletion completion, + void * CBP, + bool bufferRounding, + UInt32 bufferSize, + short direction) = 0; + +/*! + @function UIMCreateControlTransfer + @abstract UIM function, Do a transfer on a control endpoint. + This method supercedes the method which takes a void * parameter. + @param functionNumber The USB device ID of the device to perform the transaction with + @param endpointNumber The endpoint number for the transaction + @param completion Action to perform when I/O completes + @param CBP Memory descriptor describing the buffer to transfer. Will never describe + memory which has disjoint packets. + @param bufferRounding If true, short packets are OK and do not cause an error + @param bufferSize Size of the data to transfer in the data phase. (C + @param direction Specifies direction and PID for transaction. kUSBIn, KUSBOut (DATA PID) or kUSBSetup (SETUP PID). +*/ + virtual IOReturn UIMCreateControlTransfer( short functionNumber, + short endpointNumber, + IOUSBCompletion completion, + IOMemoryDescriptor * CBP, + bool bufferRounding, + UInt32 bufferSize, + short direction) = 0; + + // Bulk +/*! + @function UIMCreateBulkEndpoint + @abstract UIM function, create a bulk endpoint for the controller. + @param functionNumber The USB device ID of the device for this endpoint + @param endpointNumber The endpoint number for this endpoint + @param direction Specifies direction for the endpoint. kUSBIn or KUSBOut. + @param speed speed of the device: kUSBDeviceSpeedLow or kUSBDeviceSpeedFull + @param maxPacketSize Maximum packet size of this endpoint +*/ + virtual IOReturn UIMCreateBulkEndpoint( + UInt8 functionNumber, + UInt8 endpointNumber, + UInt8 direction, + UInt8 speed, + UInt8 maxPacketSize) = 0; + +/* Note: this function has been superceded. */ + virtual IOReturn UIMCreateBulkTransfer( short functionNumber, + short endpointNumber, + IOUSBCompletion completion, + IOMemoryDescriptor * CBP, + bool bufferRounding, + UInt32 bufferSize, + short direction) = 0; + + // Interrupt +/*! + @function UIMCreateInterruptEndpoint + @abstract UIM function, create an interrupt endpoint for the controller. + @param functionNumber The USB device ID of the device for this endpoint + @param endpointNumber The endpoint number for this endpoint + @param direction Specifies direction for the endpoint. kUSBIn or KUSBOut. + @param speed speed of the device: kUSBDeviceSpeedLow or kUSBDeviceSpeedFull + @param maxPacketSize Maximum packet size of this endpoint + @param pollingRate The maximum polling interval from the endpoint descriptor. +*/ + virtual IOReturn UIMCreateInterruptEndpoint( + short functionAddress, + short endpointNumber, + UInt8 direction, + short speed, + UInt16 maxPacketSize, + short pollingRate) = 0; + +/* Note: this function has been superceded. */ + virtual IOReturn UIMCreateInterruptTransfer( short functionNumber, + short endpointNumber, + IOUSBCompletion completion, + IOMemoryDescriptor * CBP, + bool bufferRounding, + UInt32 bufferSize, + short direction) = 0; + + // Isoch +/*! + @function UIMCreateIsochEndpoint + @abstract Create an Isochronous endpoint in the controller. + @param functionNumber The USB device ID of the device for this endpoint + @param endpointNumber The endpoint number for this endpoint + @param maxPacketSize Maximum packet size of this endpoint + @param direction Specifies direction for the endpoint. kUSBIn or KUSBOut. +*/ + virtual IOReturn UIMCreateIsochEndpoint( + short functionAddress, + short endpointNumber, + UInt32 maxPacketSize, + UInt8 direction) = 0; + +/*! + @function UIMCreateIsochTransfer + @abstract UIM function, Do a transfer on an Isocchronous endpoint. + @param functionNumber The USB device ID of the device to perform the transaction with + @param endpointNumber The endpoint number for the transaction + @param completion Action to perform when I/O completes + @param direction Specifies direction for transfer. kUSBIn or KUSBOut. + @param frameStart The frame number in which to start the transactions + @param pBuffer describes memory buffer. + @param frameCount number of frames to do transactions in + @param pFrames Describes transactions in individual frames, gives sizes and reults for transactions. +*/ + virtual IOReturn UIMCreateIsochTransfer( + short functionAddress, + short endpointNumber, + IOUSBIsocCompletion completion, + UInt8 direction, + UInt64 frameStart, + IOMemoryDescriptor * pBuffer, + UInt32 frameCount, + IOUSBIsocFrame *pFrames) = 0; + +/*! + @function UIMAbortEndpoint + @abstract UIM function Abort the specified endpoint, return all transactions queued on it. + @param functionNumber The USB device ID of the device to Abort + @param endpointNumber The endpoint number to Abort + @param direction Specifies direction of the endpoint for uniqueness. kUSBIn or KUSBOut. +*/ + virtual IOReturn UIMAbortEndpoint( + short functionNumber, + short endpointNumber, + short direction) = 0; + +/*! + @function UIMDeleteEndpoint + @abstract UIM function Delete the specified endpoint, returning all transactions queued on it. + @param functionNumber The USB device ID of the device to Delete + @param endpointNumber The endpoint number to Delete + @param direction Specifies direction of the endpoint for uniqueness. kUSBIn or KUSBOut. +*/ + virtual IOReturn UIMDeleteEndpoint( + short functionNumber, + short endpointNumber, + short direction) = 0; + +/*! + @function UIMClearEndpointStall + @abstract UIM function Clear stall on the specified endpoint, set data toggle to zero, + return all transactions queued on it. + @param functionNumber The USB device ID of the device to Clear + @param endpointNumber The endpoint number to Clear + @param direction Specifies direction of the endpoint for uniqueness. kUSBIn or KUSBOut. +*/ + virtual IOReturn UIMClearEndpointStall( + short functionNumber, + short endpointNumber, + short direction) = 0; + +/*! + @function UIMRootHubStatusChange + @abstract UIM function UIMRootHubStatusChange - This method was internal to the UIM (never called by the superclass) until + IOUSBControllerV3. For UIMs which are a subclass of IOUSBController or IOUSBControllerV2, it can + still be used internally only. For subclasses of IOUSBControllerV3, however, the meaning has changed + slightly. Now, it is used to determine if there is a status change on the root hub, and if so, it + needs to update the IOUSBControllerV3 instance variable _rootHubStatusChangedBitmap +*/ + virtual void UIMRootHubStatusChange(void) = 0; + + static const IORegistryPlane *gIOUSBPlane; + +public: + + static IOUSBLog *_log; + + IOCommandGate * GetCommandGate(void); + + /*! + @struct Endpoint + Describes an endpoint of a device. + Simply an easier to use version of the endpoint descriptor. + @field descriptor The raw endpoint descriptor. + @field number Endpoint number + @field direction Endpoint direction: kUSBOut, kUSBIn, kUSBAnyDirn + @field transferType Type of endpoint: kUSBControl, kUSBIsoc, kUSBBulk, kUSBInterrupt + @field maxPacketSize Maximum packet size for endpoint, which will include the multiplier for HS High Bandwidth endpoints + @field interval Polling interval in milliseconds (only relevent for Interrupt endpoints) + */ + struct Endpoint { + IOUSBEndpointDescriptor * descriptor; + UInt8 number; + UInt8 direction; // in, out + UInt8 transferType; // cntrl, bulk, isoc, int + UInt16 maxPacketSize; // MPS (includes the multiplier for HS High Bandwidth Isoch endpoints) + UInt8 interval; + }; + + // Implements IOService::getWorkLoop const member function + virtual IOWorkLoop * getWorkLoop() const APPLE_KEXT_OVERRIDE; + + /* + * Root hub methods + * Only of interest to the IOUSBRootHubDevice object + */ +/*! + @function GetRootHubDeviceDescriptor + @abstract UIM function, return the device descriptor of the simulated root hub device + As GET_DESCRIPTOR control request for device descrptor + @param desc Descriptor structure to return data in +*/ + virtual IOReturn GetRootHubDeviceDescriptor( IOUSBDeviceDescriptor *desc ) = 0; + +/*! + @function GetRootHubDescriptor + @abstract UIM function, return the hub descriptor of the simulated root hub device + As GET_DESCRIPTOR control request for hub descrptor + @param desc Descriptor structure to return data in +*/ + virtual IOReturn GetRootHubDescriptor( IOUSBHubDescriptor *desc ) = 0; + +/*! + @function SetRootHubDescriptor + @abstract UIM function, optional. Set the hub descriptor data. + As SET_DESCRIPTOR control request for hub descrptor + @param buffer Descriptor data +*/ + virtual IOReturn SetRootHubDescriptor( OSData *buffer ) = 0; + +/*! + @function GetRootHubConfDescriptor + @abstract UIM function, retrun the configuration descriptor of the simulated root hub device + As GET_DESCRIPTOR control request for configuration descrptor + @param desc Descriptor structure to return data in +*/ + virtual IOReturn GetRootHubConfDescriptor( OSData *desc ) = 0; + +/*! + @function GetRootHubStatus + @abstract UIM function, get the status of the root hub. As GET_STATUS control request to device. + @param status Status structure to return +*/ + virtual IOReturn GetRootHubStatus( IOUSBHubStatus *status ) = 0; + +/*! + @function SetRootHubFeature + @abstract UIM function, set feature of root hub, As SET_FEATURE control request. + @param wValue The feature to set, as would be transferred in wValue field of SETUP packet. +*/ + virtual IOReturn SetRootHubFeature( UInt16 wValue ) = 0; + +/*! + @function ClearRootHubFeature + @abstract UIM function, set feature of root hub, As CLEAR_FEATURE control request. + @param wValue The feature to clear, as would be transferred in wValue field of SETUP packet. +*/ + virtual IOReturn ClearRootHubFeature( UInt16 wValue ) = 0; + +/*! + @function GetRootHubPortStatus + @abstract UIM function, get the status of a root hub port. As GET_STATUS control request to the port. + @param status Status structure to return + @param port Port to get status for. +*/ + virtual IOReturn GetRootHubPortStatus( IOUSBHubPortStatus *status, UInt16 port ) = 0; + +/*! + @function SetRootHubPortFeature + @abstract UIM function, set feature of a root hub port, As SET_FEATURE control request to a port. + @param wValue The feature to set, as would be transferred in wValue field of SETUP packet. + @param port Port to set feature for +*/ + virtual IOReturn SetRootHubPortFeature( UInt16 wValue, UInt16 port ) = 0; + +/*! + @function ClearRootHubPortFeature + @abstract UIM function, clear feature of a root hub port, As CLEAR_FEATURE control request to a port. + @param wValue The feature to clear, as would be transferred in wValue field of SETUP packet. + @param port Port to clear feature for +*/ + virtual IOReturn ClearRootHubPortFeature( UInt16 wValue, UInt16 port ) = 0; + +/*! + @function ClearRootHubPortFeature + @abstract UIM function, Impliments GET_BUS_STATE control request, now obsolete. +*/ + virtual IOReturn GetRootHubPortState( UInt8 *state, UInt16 port ) = 0; + +/*! + @function SetHubAddress + @abstract UIM function, set the address of the simulated root hub device, as SET_ADDRESS + @param wValue New address for root hub. +*/ + virtual IOReturn SetHubAddress( UInt16 wValue ) = 0; + + + /*! + @function openPipe + Open a pipe to the specified device endpoint + @param address Address of the device on the USB bus + @param speed of the device: kUSBHighSpeed or kUSBLowSpeed + @param endpoint description of endpoint to connect to + */ + virtual IOReturn OpenPipe( USBDeviceAddress address, + UInt8 speed, + Endpoint * endpoint ); + /*! + @function closePipe + Close a pipe to the specified device endpoint + @param address Address of the device on the USB bus + @param endpoint description of endpoint + */ + virtual IOReturn ClosePipe( USBDeviceAddress address, + Endpoint * endpoint ); + + // Controlling pipe state + /*! + @function abortPipe + Abort pending I/O to/from the specified endpoint, causing them to complete with return code kIOReturnAborted + @param address Address of the device on the USB bus + @param endpoint description of endpoint + */ + virtual IOReturn AbortPipe( + USBDeviceAddress address, + Endpoint * endpoint ); + /*! + @function resetPipe + Abort pending I/O and clear stalled state - this method is a combination of abortPipe and clearPipeStall + @param address Address of the device on the USB bus + @param endpoint description of endpoint + */ + virtual IOReturn ResetPipe( USBDeviceAddress address, + Endpoint * endpoint ); + /*! + @function clearPipeStall + Clear a pipe stall. + @param address Address of the device on the USB bus + @param endpoint description of endpoint + */ + virtual IOReturn ClearPipeStall( USBDeviceAddress address, + Endpoint * endpoint ); + + // Transferring Data + /*! + @function read + Read from an interrupt or bulk endpoint + @param buffer place to put the transferred data + @param address Address of the device on the USB bus + @param endpoint description of endpoint + @param completion describes action to take when buffer has been filled + */ + virtual IOReturn Read( IOMemoryDescriptor * buffer, + USBDeviceAddress address, + Endpoint * endpoint, + IOUSBCompletion * completion ); + /*! + @function write + Write to an interrupt or bulk endpoint + @param buffer place to get the transferred data + @param address Address of the device on the USB bus + @param endpoint description of endpoint + @param completion describes action to take when buffer has been emptied + */ + virtual IOReturn Write( IOMemoryDescriptor * buffer, + USBDeviceAddress address, + Endpoint * endpoint, + IOUSBCompletion * completion ); + + /*! + @function isocIO + Read from or write to an isochronous endpoint + @param buffer place to put the transferred data + @param frameStart USB frame number of the frame to start transfer + @param numFrames Number of frames to transfer + @param frameList Bytes to transfer and result for each frame + @param address Address of the device on the USB bus + @param endpoint description of endpoint + @param completion describes action to take when buffer has been filled + */ + virtual IOReturn IsocIO( IOMemoryDescriptor * buffer, + UInt64 frameStart, + UInt32 numFrames, + IOUSBIsocFrame * frameList, + USBDeviceAddress address, + Endpoint * endpoint, + IOUSBIsocCompletion * completion ); + /*! + @function deviceRequest + Make a control request to the specified endpoint + There are two versions of this method, one uses a simple void * + to point to the data portion of the transfer, the other uses an + IOMemoryDescriptor to point to the data. + @param request parameter block for the control request + @param completion describes action to take when the request has been executed + @param address Address of the device on the USB bus + @param epNum endpoint number + */ + virtual IOReturn DeviceRequest( IOUSBDevRequest * request, + IOUSBCompletion * completion, + USBDeviceAddress address, + UInt8 epNum ); + + virtual IOReturn DeviceRequest( IOUSBDevRequestDesc * request, + IOUSBCompletion * completion, + USBDeviceAddress address, + UInt8 epNum ); + + /* + * Methods used by the hub driver to initialize a device + */ + /*! + @function AcquireDeviceZero + Get the device zero lock - call this before resetting a device, to ensure there's + only one device with address 0 + */ + virtual IOReturn AcquireDeviceZero( void ); + /*! + @function ReleaseDeviceZero + Release the device zero lock - call this to release the device zero lock, + when there is no longer a device at address 0 + */ + virtual void ReleaseDeviceZero( void ); + + // non-virtual methods + void WaitForReleaseDeviceZero( void ); + IOReturn ConfigureDeviceZero( UInt8 maxPacketSize, UInt8 speed ); + IOReturn GetDeviceZeroDescriptor( IOUSBDeviceDescriptor * desc, UInt16 size ); + IOReturn SetDeviceZeroAddress(USBDeviceAddress address); + IOUSBDevice * MakeDevice(USBDeviceAddress *address); + IOUSBHubDevice * MakeHubDevice(USBDeviceAddress *address); + IOReturn CreateDevice( IOUSBDevice * device, + USBDeviceAddress deviceAddress, + UInt8 maxPacketSize, + UInt8 speed, + UInt32 powerAvailable ); + + /*! + @function GetBandwidthAvailable + Returns the available bandwidth (in bytes) per frame or microframe for + isochronous transfers. + @result maximum number of bytes that a new iso pipe could transfer + per frame given current allocations. + */ + virtual UInt32 GetBandwidthAvailable( void ) = 0; + + /*! + @function GetFrameNumber + Returns the full current frame number. + @result The frame number. + */ + virtual UInt64 GetFrameNumber( void ) = 0; + + /*! + @function GetFrameNumber32 + Returns the least significant 32 bits of the frame number. + @result The lsb 32 bits of the frame number. + */ + virtual UInt32 GetFrameNumber32( void ) = 0; + + // Debugger polled mode + virtual void PollInterrupts( IOUSBCompletionAction safeAction = 0 ) = 0; + + virtual IOReturn PolledRead( + short functionNumber, + short endpointNumber, + IOUSBCompletion completion, + IOMemoryDescriptor * CBP, + bool bufferRounding, + UInt32 bufferSize); + + OSMetaClassDeclareReservedUsed(IOUSBController, 0); + virtual void UIMCheckForTimeouts(void); + + OSMetaClassDeclareReservedUsed(IOUSBController, 1); + virtual IOReturn UIMCreateControlTransfer( short functionNumber, + short endpointNumber, + IOUSBCommand* command, + void* CBP, + bool bufferRounding, + UInt32 bufferSize, + short direction); + + OSMetaClassDeclareReservedUsed(IOUSBController, 2); + virtual IOReturn UIMCreateControlTransfer( short functionNumber, + short endpointNumber, + IOUSBCommand* command, + IOMemoryDescriptor* CBP, + bool bufferRounding, + UInt32 bufferSize, + short direction); + + OSMetaClassDeclareReservedUsed(IOUSBController, 3); +/*! + @function UIMCreateBulkTransfer + @abstract UIM function, Do a transfer on a bulk endpoint. + This method supercedes the method which takes multiple parameters. + @param command paramters for transfer. +*/ + virtual IOReturn UIMCreateBulkTransfer(IOUSBCommand* command); + + OSMetaClassDeclareReservedUsed(IOUSBController, 4); +/*! + @function UIMCreateInterruptTransfer + @abstract UIM function, Do a transfer on an interrupt endpoint. + This method supercedes the method which takes multiple parameters. + @param command paramters for transfer. +*/ + virtual IOReturn UIMCreateInterruptTransfer(IOUSBCommand* command); + + /*! + @function deviceRequest + Make a control request to the specified endpoint + There are two versions of this method, one uses a simple void * + to point to the data portion of the transfer, the other uses an + IOMemoryDescriptor to point to the data. + @param request parameter block for the control request + @param completion describes action to take when the request has been executed + @param address Address of the device on the USB bus + @param epNum endpoint number + */ + OSMetaClassDeclareReservedUsed(IOUSBController, 5); + virtual IOReturn DeviceRequest( IOUSBDevRequest * request, + IOUSBCompletion * completion, + USBDeviceAddress address, + UInt8 epNum, + UInt32 noDataTimeout, + UInt32 completionTimeout ); + + OSMetaClassDeclareReservedUsed(IOUSBController, 6); + virtual IOReturn DeviceRequest( IOUSBDevRequestDesc * request, + IOUSBCompletion * completion, + USBDeviceAddress address, + UInt8 epNum, + UInt32 noDataTimeout, + UInt32 completionTimeout ); + + + + OSMetaClassDeclareReservedUsed(IOUSBController, 7); + /*! + @function read + Read from an interrupt or bulk endpoint + @param buffer place to put the transferred data + @param address Address of the device on the USB bus + @param endpoint description of endpoint + @param completion describes action to take when buffer has been filled + */ + virtual IOReturn Read( IOMemoryDescriptor * buffer, + USBDeviceAddress address, + Endpoint * endpoint, + IOUSBCompletion * completion, + UInt32 noDataTimeout, + UInt32 completionTimeout ); + + OSMetaClassDeclareReservedUsed(IOUSBController, 8); + /*! + @function write + Write to an interrupt or bulk endpoint + @param buffer place to get the transferred data + @param address Address of the device on the USB bus + @param endpoint description of endpoint + @param completion describes action to take when buffer has been emptied + */ + virtual IOReturn Write( IOMemoryDescriptor * buffer, + USBDeviceAddress address, + Endpoint * endpoint, + IOUSBCompletion * completion, + UInt32 noDataTimeout, + UInt32 completionTimeout ); + + // this should really not be using a padding slot, since free is in our superclas, but we shipped this way so now we need to leave it. + OSMetaClassDeclareReservedUsed(IOUSBController, 9); + virtual void free() APPLE_KEXT_OVERRIDE; + +protected: + +/*! + @function UIMRootHubStatusChange(bool) + @abstract UIM function UIMRootHubStatusChange(bool) - This method was internal to the UIM (never called by the superclass) until + IOUSBControllerV3. For UIMs which are a subclass of IOUSBController or IOUSBControllerV2, it can + still be used internally only. For subclasses of IOUSBControllerV3, however, it has become obsolete + (it still needs to be implemented since it is pure virtual) +*/ + OSMetaClassDeclareReservedUsed(IOUSBController, 10); + virtual void UIMRootHubStatusChange( bool abort ) = 0; + +public: + + OSMetaClassDeclareReservedUsed(IOUSBController, 11); + virtual IOReturn CreateRootHubDevice( IOService * provider, IOUSBRootHubDevice ** rootHubDevice); + + OSMetaClassDeclareReservedUsed(IOUSBController, 12); + /*! + @function Read + Read from an interrupt or bulk endpoint + @param buffer place to put the transferred data + @param address Address of the device on the USB bus + @param endpoint description of endpoint + @param completion describes action to take when buffer has been filled + @param noDataTimeout number of milliseconds of no data movement before the request is aborted + @param completionTimeout number of milliseonds after the command is on the bus in which it must complete + @param reqCount number of bytes requested for the transfer (must not be greater than the length of the buffer) + */ + virtual IOReturn Read( IOMemoryDescriptor * buffer, + USBDeviceAddress address, + Endpoint * endpoint, + IOUSBCompletion * completion, + UInt32 noDataTimeout, + UInt32 completionTimeout, + IOByteCount reqCount ); + + OSMetaClassDeclareReservedUsed(IOUSBController, 13); + /*! + @function Write + Write to an interrupt or bulk endpoint + @param buffer place to get the transferred data + @param address Address of the device on the USB bus + @param endpoint description of endpoint + @param completion describes action to take when buffer has been emptied + @param noDataTimeout number of milliseconds of no data movement before the request is aborted + @param completionTimeout number of milliseonds after the command is on the bus in which it must complete + @param reqCount number of bytes requested for the transfer (must not be greater than the length of the buffer) + */ + virtual IOReturn Write( IOMemoryDescriptor * buffer, + USBDeviceAddress address, + Endpoint * endpoint, + IOUSBCompletion * completion, + UInt32 noDataTimeout, + UInt32 completionTimeout, + IOByteCount reqCount ); + + OSMetaClassDeclareReservedUsed(IOUSBController, 14); + + virtual IOReturn GetRootHubStringDescriptor(UInt8 index, OSData *desc) = 0; + + OSMetaClassDeclareReservedUsed(IOUSBController, 15); + /*! + @function IsocIO + Read from or write to an isochronous endpoint + @param buffer place to put the transferred data + @param frameStart USB frame number of the frame to start transfer + @param numFrames Number of frames to transfer + @param frameList Bytes to transfer and result for each frame + @param address Address of the device on the USB bus + @param endpoint description of endpoint + @param completion describes action to take when buffer has been filled + @param updateFrequency describes how often to update the framelist once the transfer has completed (in ms) + */ + virtual IOReturn IsocIO( IOMemoryDescriptor * buffer, + UInt64 frameStart, + UInt32 numFrames, + IOUSBLowLatencyIsocFrame * frameList, + USBDeviceAddress address, + Endpoint * endpoint, + IOUSBLowLatencyIsocCompletion * completion, + UInt32 updateFrequency ); + + OSMetaClassDeclareReservedUsed(IOUSBController, 16); + + /*! + @function UIMCreateIsochTransfer + @abstract UIM function, Do a transfer on an Isocchronous endpoint. + @param functionNumber The USB device ID of the device to perform the transaction with + @param endpointNumber The endpoint number for the transaction + @param completion Action to perform when I/O completes + @param direction Specifies direction for transfer. kUSBIn or KUSBOut. + @param frameStart The frame number in which to start the transactions + @param pBuffer describes memory buffer. + @param frameCount number of frames to do transactions in + @param pFrames Describes transactions in individual frames, gives sizes and reults for transactions. + @param updateFrequency Describes how often we update the frameList parameters (in ms) + */ + virtual IOReturn UIMCreateIsochTransfer( + short functionAddress, + short endpointNumber, + IOUSBIsocCompletion completion, + UInt8 direction, + UInt64 frameStart, + IOMemoryDescriptor * pBuffer, + UInt32 frameCount, + IOUSBLowLatencyIsocFrame *pFrames, + UInt32 updateFrequency); + + + OSMetaClassDeclareReservedUsed(IOUSBController, 17); + virtual IOReturn CheckForDisjointDescriptor(IOUSBCommand *command, UInt16 maxPacketSize); + + /*! + @function UIMCreateIsochTransfer + @abstract UIM function, Do a transfer on an Isocchronous endpoint. + @param command an IOUSBIsocCommand object with all the necessary information + */ + OSMetaClassDeclareReservedUsed(IOUSBController, 18); + virtual IOReturn UIMCreateIsochTransfer(IOUSBIsocCommand *command); + + // do not use this slot without first checking bug rdar://6022420 + OSMetaClassDeclareReservedUnused(IOUSBController, 19); + +protected: + void IncreaseIsocCommandPool(); + void IncreaseCommandPool(); + void ParsePCILocation(const char *str, int *deviceNum, int *functionNum); + int ValueOfHexDigit(char c); + + UInt32 ExpressCardPort( IORegistryEntry * provider ); + IOACPIPlatformDevice * CopyACPIDevice( IORegistryEntry * device ); + bool DumpUSBACPI( IORegistryEntry * acpiDevice ); + bool IsPortInternal( IORegistryEntry * provider, UInt32 portnum, UInt32 locationID ); + bool IsControllerMuxed( IORegistryEntry * provider, UInt32 locationID ); +#ifndef __OPEN_SOURCE__ + bool IsPortMuxed(IORegistryEntry * provider, UInt32 portnum, UInt32 locationID, char *muxName); + bool IsPortMapped(IORegistryEntry * provider, UInt32 portNumber, UInt32 locationID, UInt32 *mappedPort); +#endif + UInt8 GetControllerSpeed() { return (_expansionData ? _expansionData->_controllerSpeed : 255); } + +private: + bool HasExpressCard( IORegistryEntry * acpiDevice, UInt32 * portnum ); + bool CheckACPIUPCTable( IORegistryEntry * acpiDevice, UInt32 portnum, UInt32 locationID ); + IOReturn CheckACPIUPCTable( IORegistryEntry * acpiDevice, UInt32 portNumber, UInt32 locationID, UInt8 *connectorType ); + +#ifndef __OPEN_SOURCE__ + bool CheckACPIUPCTableForMuxedMethods( IORegistryEntry * acpiDevice, UInt32 portnum, UInt32 locationID, char* muxName ); + bool CheckACPIForPortMapping( IORegistryEntry * acpiDevice, UInt32 portNumber, UInt32 locationID, UInt32 *mappedPort ); +#endif + bool CheckACPIUPCTableForInternalHubErrataBits( IORegistryEntry* acpiDevice, UInt32 portnum, UInt32 locationID, UInt32* errataBits ); + int calculateUSBDepth(UInt32 locationID); + int calculateACPIDepth(int hubUSBDepth); +}; + +//================================================================================================ +// +// IOUSBController_ExtraCurrentIOLockClass +// +// Used for locking access to shared resources between all EHCI controllers +// +//================================================================================================ +// +class IOUSBController_ExtraCurrentIOLockClass +{ +public: + IOUSBController_ExtraCurrentIOLockClass(void); // Constructor + virtual ~IOUSBController_ExtraCurrentIOLockClass(void); // Destructor + + IOLock *lock; +}; + +#endif + diff --git a/QualcommWireless/include/IOKit/usb/IOUSBControllerListElement.h b/QualcommWireless/include/IOKit/usb/IOUSBControllerListElement.h new file mode 100644 index 0000000..fa0d591 --- /dev/null +++ b/QualcommWireless/include/IOKit/usb/IOUSBControllerListElement.h @@ -0,0 +1,125 @@ +/* + * Copyright © 1998-2007 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOUSBCONTROLLERLISTELEMENT_H +#define _IOUSBCONTROLLERLISTELEMENT_H + + +#include <libkern/c++/OSObject.h> + +#include <IOKit/IOTypes.h> + +#include <IOKit/usb/USB.h> + + +/* + class IOUSBControllerListElement + Used by the IOUSBController to manage the USB controller lists that are common between EHCI and UHCI. +*/ +class IOUSBControllerListElement : public OSObject +{ + OSDeclareDefaultStructors(IOUSBControllerListElement) + +private: + +public: + + virtual void SetPhysicalLink(IOPhysicalAddress next) = 0; + virtual IOPhysicalAddress GetPhysicalLink(void) = 0; + virtual IOPhysicalAddress GetPhysicalAddrWithType(void) = 0; + virtual void print(int level); + + IOPhysicalAddress _sharedPhysical; // phys address of the memory shared with the controller + void * _sharedLogical; // logical address of the above + IOUSBControllerListElement *_logicalNext; // the next element in the list + +}; + + +class IOUSBControllerV2; // needed for a parameter +class IOUSBControllerIsochEndpoint; + +class IOUSBControllerIsochListElement : public IOUSBControllerListElement +{ + OSDeclareDefaultStructors(IOUSBControllerIsochListElement) + +private: + +public: + + virtual void SetPhysicalLink(IOPhysicalAddress next) APPLE_KEXT_OVERRIDE = 0; + virtual IOPhysicalAddress GetPhysicalLink(void) APPLE_KEXT_OVERRIDE = 0; + virtual IOPhysicalAddress GetPhysicalAddrWithType(void) APPLE_KEXT_OVERRIDE = 0; + virtual void print(int level) APPLE_KEXT_OVERRIDE; + + IOUSBControllerIsochEndpoint *_pEndpoint; + IOUSBIsocFrame *_pFrames; + IOUSBIsocCompletion _completion; + Boolean _lowLatency; + bool _requestFromRosettaClient; // True if the request originated from a Rosetta client in user space + UInt8 _framesInTD; // used for HS Isoch only + UInt64 _frameNumber; // frame number for scheduling purposes + UInt32 _frameIndex; // index into the myFrames array + IOUSBControllerIsochListElement *_doneQueueLink; // linkage used by done queue processing + + // pure virtual methods which must be implemented by descendants + virtual IOReturn UpdateFrameList(AbsoluteTime timeStamp) = 0; + virtual IOReturn Deallocate(IOUSBControllerV2 *uim) = 0; +}; + +class IOUSBControllerIsochEndpoint : public OSObject +{ + OSDeclareDefaultStructors(IOUSBControllerIsochEndpoint) + +public: + + virtual bool init() APPLE_KEXT_OVERRIDE; + + IOUSBControllerIsochEndpoint *nextEP; + IOUSBControllerIsochListElement *toDoList; // ITD or SITD + IOUSBControllerIsochListElement *toDoEnd; // ITD or SITD + IOUSBControllerIsochListElement *doneQueue; // ITD or SITD + IOUSBControllerIsochListElement *doneEnd; // ITD or SITD + IOUSBControllerIsochListElement *deferredQueue; // ITD or SITD + IOUSBControllerIsochListElement *deferredEnd; // ITD or SITD + UInt64 firstAvailableFrame; // next frame available for a transfer on this EP + UInt32 maxPacketSize; + UInt32 activeTDs; // + when added to todo list, - when taken from done queue + UInt32 onToDoList; // + when added to todo list, - when taken from done queue + UInt32 onDoneQueue; // + when added to todo list, - when taken from done queue + volatile SInt32 scheduledTDs; // + when linked onto periodic list, - when unlinked + UInt32 deferredTDs; + UInt32 onProducerQ; + UInt32 onReversedList; + UInt16 inSlot; // where Isoc TDs are being put in the periodic list + short functionAddress; + short endpointNumber; + IOReturn accumulatedStatus; + UInt32 interval; // this is the decoded interval value for HS endpoints and is 1 for FS endpoints + UInt8 direction; + bool aborting; +}; + + +#endif + diff --git a/QualcommWireless/include/IOKit/usb/IOUSBControllerV2.h b/QualcommWireless/include/IOKit/usb/IOUSBControllerV2.h new file mode 100644 index 0000000..fb89bbe --- /dev/null +++ b/QualcommWireless/include/IOKit/usb/IOUSBControllerV2.h @@ -0,0 +1,453 @@ +/* + * Copyright � 1998-2013 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOUSBCONTROLLERV2_H +#define _IOKIT_IOUSBCONTROLLERV2_H + +#include <IOKit/IODMACommand.h> + +#include <IOKit/usb/IOUSBControllerListElement.h> +#include <IOKit/usb/IOUSBController.h> + +// These are the values returned in GetLowLatencyOptionsAndPhysicalMask + +#define kLowLatencyUSBDefaultOptionBits 0 // by default we don't need contiguous memory +#define kLowLatencyUSB32bitPhysicalMask 0x00000000FFFFF000ULL // 32 bit memory aligned on a 4K boundary (default) +#define kLowLatencyUSB64bitPhysicalMask 0xFFFFFFFFFFFFF000ULL // 64 bit memory aligned on a 4K boundary + + +/*! + @class IOUSBControllerV2 + @abstract subclass of the IOUSBController to provide support for high speed + devices and split transactions. + @discussion The IOUSBController class provide sufficient functionality to + work with full (12Mb/s) and low (1.5Mb/s) devices. IOUSBControllerV2 + introduces the support for high (480Mb/s) speed devices from the + USB 2.0 spec. In particular IOUSBControllerV2 indicates the high + speed hub a full or low speed device is attached to so that split + transactions can be directed to the hub at high speed to be forwarded + to the full or low speed device by the hub. + It also gives support for bulk endoints of greater than 256 bytes. +*/ + +class IOUSBControllerV2 : public IOUSBController +{ + OSDeclareAbstractStructors(IOUSBControllerV2) + +protected: + + // These for keeping track of high speed ancestor to allow controller to do splits. + // + UInt8 _highSpeedHub[128]; + UInt8 _highSpeedPort[128]; + + struct V2ExpansionData { + UInt8 _multiTT[128]; + IOUSBCommand *ClearTTCommand; + IOUSBControllerIsochEndpoint *_isochEPList; // linked list of active Isoch "endpoints" + IOUSBControllerIsochEndpoint *_freeIsochEPList; // linked list of freed Isoch EP data structures + thread_call_t _returnIsochDoneQueueThread; + }; + V2ExpansionData *_v2ExpansionData; + + // Super's expansion data + #define _freeUSBCommandPool _expansionData->freeUSBCommandPool + #define _freeUSBIsocCommandPool _expansionData->freeUSBIsocCommandPool + #define _watchdogUSBTimer _expansionData->watchdogUSBTimer + #define _controllerTerminating _expansionData->_terminating + #define _watchdogTimerActive _expansionData->_watchdogTimerActive + #define _busNumber _expansionData->_busNumber + #define _currentSizeOfCommandPool _expansionData->_currentSizeOfCommandPool + #define _currentSizeOfIsocCommandPool _expansionData->_currentSizeOfIsocCommandPool + #define _controllerSpeed _expansionData->_controllerSpeed + #define _activeIsochTransfers _expansionData->_activeIsochTransfers + #define _activeInterruptTransfers _expansionData->_activeInterruptTransfers + #define _rootHubDeviceSS _expansionData->_rootHubDeviceSS + + // this class's expansion data + #define _isochEPList _v2ExpansionData->_isochEPList + #define _freeIsochEPList _v2ExpansionData->_freeIsochEPList + #define _returnIsochDoneQueueThread _v2ExpansionData->_returnIsochDoneQueueThread + + virtual bool init( OSDictionary * propTable ) APPLE_KEXT_OVERRIDE; + virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + + static IOReturn DoCreateEP(OSObject *owner, + void *arg0, void *arg1, + void *arg2, void *arg3); + + static void clearTTHandler( + OSObject * target, + void * parameter, + IOReturn status, + UInt32 bufferSizeRemaining ); + + void UpdateTopology(USBDeviceAddress deviceAddress, + UInt8 speed, + USBDeviceAddress hubAddress, + int port); + +public: + + /*! + @function openPipe + Open a pipe to the specified device endpoint + @param address Address of the device on the USB bus + @param speed of the device: kUSBDeviceSpeedLow, kUSBDeviceSpeedFull, kUSBDeviceSpeedHigh or kUSBDeviceSpeedSuper + @param endpoint description of endpoint to connect to + */ + virtual IOReturn OpenPipe( USBDeviceAddress address, + UInt8 speed, + Endpoint * endpoint ) APPLE_KEXT_OVERRIDE; + + /*! + @function CreateDevice + @abstract Create a new device as IOUSBController, making a note of the + high speed hub device ID and port number the full/low speed + device is attached to. + @param newDevice new device object to work with + @param deviceAddress USB device ID + @param maxPacketSize max packet size of endpoint zero + @param speed speed of the device kUSBDeviceSpeedLow, kUSBDeviceSpeedFull, kUSBDeviceSpeedHigh, kUSBDeviceSpeedSuper + @param powerAvailable power available to the device + @param hub USB ID of hub the device is immediatly attached to. (Not necessarily high speed) + @param port port number of port the device is attached to. + */ + virtual IOReturn CreateDevice( IOUSBDevice *newDevice, + USBDeviceAddress deviceAddress, + UInt8 maxPacketSize, + UInt8 speed, + UInt32 powerAvailable, + USBDeviceAddress hub, + int port); + + /*! + @function ConfigureDeviceZero + @abstract configure pipe zero of device zero, as IOUSBController, but also keeping + note of high speed hub device is attached to. + @param maxPacketSize max packet size for the pipe + @param speed speed of the device kUSBDeviceSpeedLow, kUSBDeviceSpeedFull, kUSBDeviceSpeedHigh, kUSBDeviceSpeedSuper + @param hub USB ID of hub the device is immediatly attached to. (Not necessarily high speed) + @param port port number of port the device is attached to. + */ + virtual IOReturn ConfigureDeviceZero(UInt8 maxPacketSize, UInt8 speed, USBDeviceAddress hub, int port); + +/*! + @function UIMCreateControlEndpoint + @abstract Create an endpoint in the controller to do control transactions. + @param functionNumber USB device ID of device + @param endpointNumber endpoint address of the endpoint in the device + @param maxPacketSize maximum packet size of this endpoint + @param speed speed of the device kUSBDeviceSpeedLow, kUSBDeviceSpeedFull, kUSBDeviceSpeedHigh + @param highSpeedHub If speed is not kUSBDeviceSpeedHigh, the address of the high speed hub to + address split transactions to. + @param highSpeedPort If speed is not kUSBDeviceSpeedHigh, the hub port to address split transactions to +*/ + virtual IOReturn UIMCreateControlEndpoint( + UInt8 functionNumber, + UInt8 endpointNumber, + UInt16 maxPacketSize, + UInt8 speed, + USBDeviceAddress highSpeedHub, + int highSpeedPort) = 0; + +/*! + @function UIMCreateBulkEndpoint + @abstract Create an endpoint in the controller to do bulk transactions. + @param functionNumber USB device ID of device + @param endpointNumber endpoint address of the endpoint in the device + @param direction Direction of data flow. kUSBIn or kUSBOut + @param maxPacketSize maximum packet size of this endpoint + @param speed speed of the device kUSBDeviceSpeedFull, kUSBDeviceSpeedHigh + @param highSpeedHub If speed is not kUSBDeviceSpeedHigh, the address of the high speed hub to + address split transactions to. + @param highSpeedPort If speed is not kUSBDeviceSpeedHigh, the hub port to address split transactions to +*/ + virtual IOReturn UIMCreateBulkEndpoint( + UInt8 functionNumber, + UInt8 endpointNumber, + UInt8 direction, + UInt8 speed, + UInt16 maxPacketSize, + USBDeviceAddress highSpeedHub, + int highSpeedPort) = 0; + +/*! + @function UIMCreateInterruptEndpoint + @abstract Create an endpoint in the controller to do interrupt transactions. + @param functionAddress USB device ID of device + @param endpointNumber endpoint address of the endpoint in the device + @param direction Direction of data flow. kUSBIn or kUSBOut + @param speed speed of the device kUSBDeviceSpeedLow, kUSBDeviceSpeedFull, kUSBDeviceSpeedHigh + @param maxPacketSize maximum packet size of this endpoint + @param pollingRate The maximum polling interval from the endpoint descriptor. + @param highSpeedHub If speed is not kUSBDeviceSpeedHigh, the address of the high speed hub to + address split transactions to. + @param highSpeedPort If speed is not kUSBDeviceSpeedHigh, the hub port to address split transactions to +*/ + virtual IOReturn UIMCreateInterruptEndpoint( + short functionAddress, + short endpointNumber, + UInt8 direction, + short speed, + UInt16 maxPacketSize, + short pollingRate, + USBDeviceAddress highSpeedHub, + int highSpeedPort) = 0; + +/*! + @function UIMCreateIsochEndpoint + @abstract Create an endpoint in the controller to do Isochronous transactions. + @param functionAddress USB device ID of device + @param endpointNumber endpoint address of the endpoint in the device + @param maxPacketSize maximum packet size of this endpoint + @param direction Specifies direction for the endpoint. kUSBIn or KUSBOut. + @param highSpeedHub If non zero, this is a full speed device, the address of the high speed hub to + address split transactions to. + @param highSpeedPort If highSpeedHub is non zero, the hub port to address split transactions to +*/ + virtual IOReturn UIMCreateIsochEndpoint( + short functionAddress, + short endpointNumber, + UInt32 maxPacketSize, + UInt8 direction, + USBDeviceAddress highSpeedHub, + int highSpeedPort) = 0; + + + static void ReturnIsochDoneQueueEntry(OSObject *target, thread_call_param_t endpointPtr); + + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 0); + virtual IOReturn AddHSHub(USBDeviceAddress highSpeedHub, UInt32 flags); + + static IOReturn DOHSHubMaintenance(OSObject *owner, void *arg0, void *arg1, void *arg2, void *arg3); + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 1); + virtual IOReturn UIMHubMaintenance(USBDeviceAddress highSpeedHub, UInt32 highSpeedPort, UInt32 command, UInt32 flags); + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 2); + virtual IOReturn RemoveHSHub(USBDeviceAddress highSpeedHub); + + static IOReturn DOSetTestMode(OSObject *owner, void *arg0, void *arg1, void *arg2, void *arg3); + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 3); + virtual IOReturn SetTestMode(UInt32 mode, UInt32 port); + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 4); + virtual IOReturn UIMSetTestMode(UInt32 mode, UInt32 port); + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 5); + virtual UInt64 GetMicroFrameNumber( void ); + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 6); + virtual void ClearTT(USBDeviceAddress addr, UInt8 endpt, Boolean IN); + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 7); + /*! + @function Read + Read from an interrupt or bulk endpoint + @param buffer place to put the transferred data + @param address Address of the device on the USB bus + @param endpoint description of endpoint + @param completion describes action to take when buffer has been filled + @param noDataTimeout number of milliseconds of no data movement before the request is aborted + @param completionTimeout number of milliseonds after the command is on the bus in which it must complete + @param reqCount number of bytes requested for the transfer (must not be greater than the length of the buffer) + */ + virtual IOReturn ReadV2( IOMemoryDescriptor * buffer, + USBDeviceAddress address, + Endpoint * endpoint, + IOUSBCompletionWithTimeStamp * completion, + UInt32 noDataTimeout, + UInt32 completionTimeout, + IOByteCount reqCount ); + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 8); +/*! + @function UIMCreateIsochEndpoint + @abstract Create an endpoint in the controller to do Isochronous transactions. + @param functionAddress USB device ID of device + @param endpointNumber endpoint address of the endpoint in the device + @param maxPacketSize maximum packet size of this endpoint + @param direction Specifies direction for the endpoint. kUSBIn or KUSBOut. + @param highSpeedHub If non zero, this is a full speed device, the address of the high speed hub to + address split transactions to. + @param highSpeedPort If highSpeedHub is non zero, the hub port to address split transactions to + @param interval The encoded interval value from the endpoint descriptor +*/ + virtual IOReturn UIMCreateIsochEndpoint( short functionAddress, + short endpointNumber, + UInt32 maxPacketSize, + UInt8 direction, + USBDeviceAddress highSpeedHub, + int highSpeedPort, + UInt8 interval); + + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 9); + virtual IOUSBControllerIsochEndpoint* AllocateIsochEP(void); + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 10); + virtual IOReturn DeallocateIsochEP(IOUSBControllerIsochEndpoint *pEP); + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 11); + virtual IOUSBControllerIsochEndpoint* FindIsochronousEndpoint(short functionNumber, short endpointNumber, short direction, IOUSBControllerIsochEndpoint* *pEDBack); + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 12); + virtual IOUSBControllerIsochEndpoint* CreateIsochronousEndpoint(short functionNumber, short endpointNumber, short direction); + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 13); + virtual void PutTDonToDoList(IOUSBControllerIsochEndpoint* pED, IOUSBControllerIsochListElement *pTD); + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 14); + virtual IOUSBControllerIsochListElement *GetTDfromToDoList(IOUSBControllerIsochEndpoint* pED); + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 15); + virtual void PutTDonDeferredQueue(IOUSBControllerIsochEndpoint* pED, IOUSBControllerIsochListElement *pTD); + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 16); + virtual IOUSBControllerIsochListElement *GetTDfromDeferredQueue(IOUSBControllerIsochEndpoint* pED); + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 17); + virtual void PutTDonDoneQueue(IOUSBControllerIsochEndpoint* pED, IOUSBControllerIsochListElement *pTD, bool checkDeferred); + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 18); + virtual IOUSBControllerIsochListElement *GetTDfromDoneQueue(IOUSBControllerIsochEndpoint* pED); + + // 7185026 - this is to make this call from behind the gate + static IOReturn GatedGetTDfromDoneQueue(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3); + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 19); + virtual void ReturnIsochDoneQueue(IOUSBControllerIsochEndpoint*); + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 20); + virtual IODMACommand *GetNewDMACommand(); + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 21); + /*! + @function GetLowLatencyOptionsAndPhysicalMask + @abstract Low Latency transfers require that the client have access to the memory after the Isochronous I/O request has already been scheduled. This might be used, for example to fill in outgoing data "just in time." Some controllers, however, may have requirements which need to be followed in order to make sure that the memory buffer isn't moved after the call is made. This call will return an IOOptionBits and mach_vm_address_t which can be used in a call to IOBufferMemoryDescriptor::inTaskWithPhysicalMask which will help meet these requirements. + @param optionBits Pointer to an an IOOptionBits. The only bit which may be returned is kIOMemoryPhysicallyContiguous. Other bits, e.g. direction bits, must be ORd in by the client as needed. This call replaces the old property based method of obtaining this information. + @param physicalMask Pointer to a mach_vm_address_t which should be used in the call to IOBufferMemoryDescriptor::inTaskWithPhysicalMask and will guarantee that when the memory is wired down it will be accessible by both the client and the USB controller at the same time. + @result returns kIOReturnSuccess if the method is implemented by the controller, otherwise kIOReturnUnsupported + */ + virtual IOReturn GetLowLatencyOptionsAndPhysicalMask(IOOptionBits *optionBits, mach_vm_address_t *physicalMask); + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 22); + /*! + @function GetFrameNumberWithTime + @abstract Real Time A/V applications send and receive Iscohronous data scheduled on certain USB frame numbers. The clock for these frame numbers is independent of the system clock, and drivers need to synchronize these two clocks. This routine will return a system time which corresponds to the beginning of a USB frame number. It is not necessarily the currrent frame, but it will be a frame in the recent past (within the past minute). The jitter between the start of the USB frame and the system time will be as low as possible, but due to hardware interrupt latencies could be as high as 200 microseconds. + @param frameNumber A pointer to a UInt64 in which to hold the USB frame number corresponding to the given system time. + @param theTime A pointer to an AbsoluteTime corresponding to the system time at the beginning of the given USB frame number. + @result returns kIOReturnSuccess if the method is implemented by the controller, otherwise kIOReturnUnsupported + */ + virtual IOReturn GetFrameNumberWithTime(UInt64* frameNumber, AbsoluteTime *theTime); + + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 23); + /*! + @function Read + Read from a stream on a bulk endpoint + @param streamID stream ID of the stream to read from + @param buffer place to put the transferred data + @param address Address of the device on the USB bus + @param endpoint description of endpoint + @param completion describes action to take when buffer has been filled + @param noDataTimeout number of milliseconds of no data movement before the request is aborted + @param completionTimeout number of milliseonds after the command is on the bus in which it must complete + @param reqCount number of bytes requested for the transfer (must not be greater than the length of the buffer) + */ + virtual IOReturn ReadStream(UInt32 streamID, + IOMemoryDescriptor * buffer, + USBDeviceAddress address, + Endpoint * endpoint, + IOUSBCompletion * completion, + UInt32 noDataTimeout, + UInt32 completionTimeout, + IOByteCount reqCount ); + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 24); + /*! + @function Write + Write to a stream on a bulk endpoint + @param streamID stream ID of the stream to write to + @param buffer place to get the transferred data + @param address Address of the device on the USB bus + @param endpoint description of endpoint + @param completion describes action to take when buffer has been emptied + @param noDataTimeout number of milliseconds of no data movement before the request is aborted + @param completionTimeout number of milliseonds after the command is on the bus in which it must complete + @param reqCount number of bytes requested for the transfer (must not be greater than the length of the buffer) + */ + virtual IOReturn WriteStream(UInt32 streamID, + IOMemoryDescriptor * buffer, + USBDeviceAddress address, + Endpoint * endpoint, + IOUSBCompletion * completion, + UInt32 noDataTimeout, + UInt32 completionTimeout, + IOByteCount reqCount ); + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 25); + /*! + @function openPipe + Open a pipe to the specified device endpoint + @param address Address of the device on the USB bus + @param speed of the device: kUSBDeviceSpeedLow, kUSBDeviceSpeedFull, kUSBDeviceSpeedHigh or kUSBDeviceSpeedSuper + @param endpoint description of endpoint to connect to + @param maxStreams maximum number of streams pipe supports + @param maxBurstAndMult maximum number of bursts and burst multiplier + */ + virtual IOReturn OpenSSPipe(USBDeviceAddress address, + UInt8 speed, + Endpoint * endpoint, + UInt32 maxStreams, + UInt32 maxBurstAndMult); + + OSMetaClassDeclareReservedUsed(IOUSBControllerV2, 26); + /*! + @function UpdateDeviceAddress + Tell the controller about the new address of a device. Used when a device has been reset + @param deviceAddress Address of the device on the USB bus + @param speed of the device: kUSBDeviceSpeedLow, kUSBDeviceSpeedFull, kUSBDeviceSpeedHigh or kUSBDeviceSpeedSuper + @param highSpeedHub If non zero, this is a full speed device, the address of the high speed hub to address split transactions to. + @param highSpeedPort If highSpeedHub is non zero, the hub port to address split transactions to + */ + virtual IOReturn UpdateDeviceAddress(USBDeviceAddress oldDeviceAddress, + USBDeviceAddress newDeviceAddress, + UInt8 speed, + USBDeviceAddress hubAddress, + int port); + + + + OSMetaClassDeclareReservedUnused(IOUSBControllerV2, 27); + OSMetaClassDeclareReservedUnused(IOUSBControllerV2, 28); + OSMetaClassDeclareReservedUnused(IOUSBControllerV2, 29); + +}; + + +#endif diff --git a/QualcommWireless/include/IOKit/usb/IOUSBDevice.h b/QualcommWireless/include/IOKit/usb/IOUSBDevice.h new file mode 100644 index 0000000..a9ec216 --- /dev/null +++ b/QualcommWireless/include/IOKit/usb/IOUSBDevice.h @@ -0,0 +1,611 @@ +/* + * Copyright � 1998-2007 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#ifndef _IOKIT_IOUSBDEVICE_H +#define _IOKIT_IOUSBDEVICE_H + +#include <IOKit/usb/IOUSBNub.h> +#include <IOKit/usb/IOUSBPipe.h> +#include <IOKit/usb/IOUSBPipeV2.h> +#include <IOKit/IOBufferMemoryDescriptor.h> +#include <IOKit/IOWorkLoop.h> +#include <IOKit/IOCommandGate.h> + +#include <kern/thread_call.h> + +// The following are definitions for errata properties needed for different devices. This +// should be but in the dictionary of the IOUSBDevice in question. This can be achieved +// by using the AppleUSBMergeNub class and having an IOProviderMergeProperties dictionary +// with the required properties. + +// This property allows a device to specify a configuration value of 0 in its configuration +// descriptor. This does not follow the spec, but we will allow it in order to get the device +// to work. The property should be a Boolean +// +#define kAllowConfigValueOfZero "kAllowZeroConfigValue" +#define kAllowNumConfigsOfZero "kAllowZeroNumConfigs" + + +class IOUSBController; +class IOUSBControllerV2; +class IOUSBControllerV3; +class IOUSBInterface; +class IOUSBHubPolicyMaker; +/*! + @class IOUSBDevice + @abstract The IOService object representing a device on the USB bus. + @discussion This class provides functionality to configure a device and to create + IOUSBInterface objects to represent the interfaces of the device. +*/ + +class IOUSBDevice : public IOUSBNub +{ + friend class IOUSBController; + friend class IOUSBControllerV2; + friend class IOUSBInterface; + friend class IOUSBPipe; + friend class IOUSBInterfaceUserClientV2; + friend class IOUSBInterfaceUserClientV3; + friend class IOUSBDeviceUserClientV2; + + OSDeclareDefaultStructors(IOUSBDevice) + +protected: + + USBDeviceAddress _address; + IOUSBController * _controller; + IOUSBPipe * _pipeZero; + IOUSBDeviceDescriptor _descriptor; + UInt32 _busPowerAvailable; + UInt8 _speed; + IOUSBEndpointDescriptor _endpointZero; // Fake ep for control pipe + void * _port; // Obsolete, do not use + IOBufferMemoryDescriptor** _configList; + IOUSBInterface** _interfaceList; // Obsolete, do not use + UInt8 _currentConfigValue; + UInt8 _numInterfaces; // Obsolete, do not use + + struct ExpansionData + { + UInt32 _portNumber; + thread_call_t _doPortResetThread; + IOUSBDevice * _usbPlaneParent; + bool _portResetThreadActive; + bool _allowConfigValueOfZero; + thread_call_t _doPortSuspendThread; + bool _portSuspendThreadActive; + thread_call_t _doPortReEnumerateThread; + bool _resetInProgress; + bool _portHasBeenReset; + IORecursiveLock* _XgetConfigLock; // Obsolete + bool _doneWaiting; // Obsolete + bool _notifiedWhileBooting; // Obsolete + IOWorkLoop * _workLoop; + IOTimerEventSource * _notifierHandlerTimer; // Obsolete + UInt32 _notificationType; // Obsolete + bool _suspendInProgress; + bool _portHasBeenSuspendedOrResumed; + bool _addExtraResetTime; + bool _suspendCommand; + IOCommandGate * _commandGate; + OSSet * _openInterfaces; + bool _resetCommand; + IOReturn _resetError; + IOReturn _suspendError; + thread_call_t _doMessageClientsThread; + IOUSBHubPolicyMaker * _hubPolicyMaker; + UInt32 _sleepPowerAllocated; // how much sleep power we already gave to our client + UInt32 _wakePowerAllocated; // how much extra power during wake did we already give our client + UInt32 _devicePortInfo; + bool _deviceIsInternal; // Will be set if all our upstream hubs are captive (internal to the computer) + bool _deviceIsInternalIsValid; // true if we have already determined whether the device is internal + bool _newGetConfigLock; // new lock, taken within the WL gate, when doing a GetConfig + UInt32 _resetAndReEnumerateLock; // "Lock" to prevent us from doing a reset or a re-enumerate while the other one is in progress + UInt32 _locationID; + IOLock* _interfaceArrayLock; + OSArray* _interfaceArray; + UInt32 _standardUSBPortPower; // Largest amount of current that this port can provide (e.g. 500mA for USB2.0, 900mA for USB3.0) + bool _usingExtra400mAforUSB3; + UInt32 _wakeRevocablePowerAllocated; // how much extra "revocable" power during wake did we already give our client + UInt32 _wakeUSB3PowerAllocated; // how much extra "USB3" power during wake did we already give our client + bool _attachedToEnclosureAndUsingExtraWakePower; + bool _deviceIsOnThunderbolt; // Will be set if all our upstream hubs are on Thunderbolt + UInt16 _isochDelay; + IOUSBControllerV3 * _controllerV3; + IOService * _interfacePowerParent; // default parent for joinPMTree for interface drivers + bool _loadingDriverAfterReEnumerate; + bool _hasMSCInterface; // True if any of the IOUSBInterfaces are mass storage class + }; + ExpansionData * _expansionData; + + const IOUSBConfigurationDescriptor *FindConfig(UInt8 configValue, UInt8 *configIndex=0); + + virtual IOUSBInterface * GetInterface(const IOUSBInterfaceDescriptor *interface); + +public: + virtual IOReturn SetFeature(UInt8 feature); + +protected: + virtual IOReturn GetConfigDescriptor(UInt8 configIndex, void *data, UInt32 len); + + virtual IOReturn GetDeviceDescriptor(IOUSBDeviceDescriptor *desc, UInt32 size); + + virtual bool init(USBDeviceAddress deviceAddress, UInt32 powerAvaiable, UInt8 speed, UInt8 maxPacketSize ); + + virtual bool matchPropertyTable(OSDictionary * table, SInt32 *score) APPLE_KEXT_OVERRIDE; + +public: + // IOService methods + virtual bool init( void ) APPLE_KEXT_OVERRIDE; + virtual bool start( IOService *provider ) APPLE_KEXT_OVERRIDE; + virtual bool handleIsOpen(const IOService *forClient) const APPLE_KEXT_OVERRIDE; + virtual bool handleOpen(IOService *forClient, IOOptionBits options, void *arg) APPLE_KEXT_OVERRIDE; + virtual void handleClose(IOService *forClient, IOOptionBits options) APPLE_KEXT_OVERRIDE; + virtual IOReturn message( UInt32 type, IOService * provider, void * argument = 0 ) APPLE_KEXT_OVERRIDE; + virtual bool terminate( IOOptionBits options = 0 ) APPLE_KEXT_OVERRIDE; + virtual bool requestTerminate( IOService * provider, IOOptionBits options ) APPLE_KEXT_OVERRIDE; + virtual void stop( IOService *provider ) APPLE_KEXT_OVERRIDE; + virtual bool finalize(IOOptionBits options) APPLE_KEXT_OVERRIDE; + virtual void free( void ) APPLE_KEXT_OVERRIDE; + virtual void joinPMtree ( IOService * driver ) APPLE_KEXT_OVERRIDE; + + // IOUSBDevice methods + virtual void SetProperties(); + + // simple accessor methods + IOService *GetInterfacePowerParent(void); + + static IOUSBDevice *NewDevice(void); + + virtual void SetPort(void *port); // Obsolete, do NOT use + + /*! + @function FindNextInterfaceDescriptor + return a pointer to the next interface descriptor within the given full configuration descriptor satisfying the requirements specified, or NULL if there aren't any. + @param configDescIn the configuration descriptor within which to search. obtained from GetFullConfigurationDescriptor(configIndex). use NULL to specify the current configuration's descriptor. + @param intfDesc interface descriptor from which to start the search. NULL for the first interface descriptor in the given configuration descriptor + @param request IOUSBFindInterfaceRequest specifying the desired interface. Not changed. + @param descOut pointer to placeholder for the returned descriptor ptr + @result returns kIOReturnBadArgument if configDesc is not correct, or if configDesc is NULL and the device is not configured, or if intfDesc is not in configDesc. Otherwise returns kIOReturnSuccess or kIOUSBInterfaceNotFound. + */ + virtual IOReturn FindNextInterfaceDescriptor(const IOUSBConfigurationDescriptor *configDescIn, + const IOUSBInterfaceDescriptor *intfDesc, + const IOUSBFindInterfaceRequest *request, + IOUSBInterfaceDescriptor **descOut); + /*! + @function FindNextInterface + return an pointer to an IOUSBInterface object satisfying the requirements specified in request, or NULL if there aren't any. the device + must be configured for there to be any interfaces. + @param current interface to start searching from, NULL to start at the beginning of the device's interface list for the current configuration. + @param request specifies what properties an interface must have to match. + @result Pointer to a matching IOUSBInterface, or NULL if none match. Note: The IOUSBInterface is NOT retained for the caller. If the caller wishes to continue to use the returned object, it should call retain() on that object. + */ + LIBKERN_RETURNS_NOT_RETAINED virtual IOUSBInterface *FindNextInterface(IOUSBInterface *current, + IOUSBFindInterfaceRequest *request); + + /*! + @function CreateInterfaceIterator + return an OSIterator to iterate through interfaces satisfying the requirements specified in request. + @param request specifies what properties an interface must have to match. + @result Pointer to an OSIterator. + */ + virtual OSIterator *CreateInterfaceIterator(IOUSBFindInterfaceRequest *request); + + // Get pointer to full config info (cached in device, don't free returned pointer) + /*! + @function GetFullConfigurationDescriptor + return a pointer to all the descriptors for the requested configuration. + @param configIndex The configuration index (not the configuration value) + @result Pointer to the descriptors, which are cached in the IOUSBDevice object. + */ + virtual const IOUSBConfigurationDescriptor *GetFullConfigurationDescriptor(UInt8 configIndex); + + /*! + @function GetConfigurationDescriptor + Copy the specified amount of data for a configuration into the suppled buffer. + @param configValue The configuration value + @param data Buffer to copy data into + @param len number of bytes to copy + */ + virtual IOReturn GetConfigurationDescriptor(UInt8 configValue, void *data, UInt32 len); + + /*! + @function ResetDevice + Reset the device, returning it to the addressed, unconfigured state. + This is useful if a device has got badly confused. Note that the AppleUSBComposite driver will automatically + reconfigure the device if it is a composite device. + */ + virtual IOReturn ResetDevice(); + + /*! + @function SetConfiguration + Do a USB SetConfiguration call to the device. The caller must have the device open() in order to + actually cause a configuration change. If the device is currently configured, all IOUSBInterface objects + associated with the device are freed. After the new configuration has been set, all of its IOUSBInterface objects are + instantiated automatically. + @param forClient The client requesting the configuration change + @param configValue The desired configuration value. + @param startInterfaceMatching A boolean specifying whether IOKit should begin the process of finding + matching drivers for the new IOUSBInterface objects. + */ + virtual IOReturn SetConfiguration(IOService *forClient, UInt8 configValue, bool startInterfaceMatching=true); + + // Access to addressing and cached info + /*! + @function GetAddress + returns the bus address of the device + */ + virtual USBDeviceAddress GetAddress(void); + + /*! + @function GetSpeed + returns the speed of the device + */ + virtual UInt8 GetSpeed(void); + /*! + @function GetBus + returns a pointer to the IOUSBController object for the device + */ + virtual IOUSBController *GetBus(void); + /*! + @function GetBusPowerAvailable + returns the power available to the device, in units of 2mA + */ + virtual UInt32 GetBusPowerAvailable( void ); + /*! + @function GetMaxPacketSize + returns the maximum packet size for endpoint zero (only 8, 16, 32, 64 are valid) + */ + virtual UInt8 GetMaxPacketSize(void); + /*! + @function GetVendorID + returns the Vendor ID of the device + */ + virtual UInt16 GetVendorID(void); + /*! + @function GetProductID + returns the Product ID of the device + */ + virtual UInt16 GetProductID(void); + /*! + @function GetDeviceRelease + returns the DeviceRelease information + */ + virtual UInt16 GetDeviceRelease(void); + /*! + @function GetNumConfigurations + returns the number of configs in the device config descriptor + */ + virtual UInt8 GetNumConfigurations(void); + /*! + @function GetManufacturerStringIndex + returns the index of string descriptor describing manufacturer + */ + virtual UInt8 GetManufacturerStringIndex(void ); + /*! + @function GetProductStringIndex + returns the index of string descriptor describing product + */ + virtual UInt8 GetProductStringIndex(void ); + /*! + @function GetSerialNumberStringIndex + returns the index of string descriptor describing the device's serial number + */ + virtual UInt8 GetSerialNumberStringIndex(void ); + /*! + @function GetPipeZero + returns a pointer to the device's default control pipe + */ + virtual IOUSBPipe * GetPipeZero(void); + + // Deprecated but needed for binary compatibility + virtual IOUSBPipe* MakePipe(const IOUSBEndpointDescriptor *ep); + + // this method is deprecated. use the other DeviceRequest methods + virtual IOReturn DeviceRequest(IOUSBDevRequest *request, + IOUSBCompletion *completion = 0); + + // Same but with a memory descriptor + virtual IOReturn DeviceRequest(IOUSBDevRequestDesc *request, + IOUSBCompletion *completion = 0); + + /*! + @function GetConfiguration + Gets the current configuration from the IOUSBDevice object. Note that this call will send a control + request on the bus to get the current configuration from the physical device. + @param configNum Pointer to place to store configuration value. + */ + virtual IOReturn GetConfiguration(UInt8 *configNumber); + + /*! + @function GetDeviceStatus + Gets the device's status. Note that this sends a control request to the physical device. + @param status Pointer to place to store the status. + */ + virtual IOReturn GetDeviceStatus(USBStatus *status); + + /*! + @function GetStringDescriptor + Get a string descriptor as ASCII, in the specified language (default is US English) + @param index Index of the string descriptor to get. + @param buf Pointer to place to store ASCII string + @param maxLen Size of buffer pointed to by buf + @param lang Language to get string in (default is US English) + */ + virtual IOReturn GetStringDescriptor(UInt8 index, char *buf, int maxLen, UInt16 lang=0x409); + + /*! + @function GetChildLocationID + Get the locationID (UInt32) given the port number and the parent's location + @param parentLocationID locationID for the hub to which this device is attached. + @param port Port number of the hub where this device is attached + */ + virtual UInt32 GetChildLocationID(UInt32 parentLocationID, int port); + + virtual const IOUSBDescriptorHeader* FindNextDescriptor(const void *cur, UInt8 descType); + + virtual void DisplayNotEnoughPowerNotice(); + + // These are non-virtual function so that we don't have to take up a binary compatibility slot. + UInt16 GetbcdUSB(void); + UInt8 GetDeviceClass(void); + UInt8 GetDeviceSubClass(void); + UInt8 GetProtocol(void); + UInt32 GetLocationID(void); + UInt16 GetIsochDelay(void); + bool IsDeviceInternal(void); + + void SetBusPowerAvailable(UInt32 newPower); + IOService *GetDevicePowerParent(void); + + OSMetaClassDeclareReservedUsed(IOUSBDevice, 0); + /*! + @function DeviceRequest + @abstract execute a control request to the default control pipe (pipe zero) + @param request The parameter block to send to the device + @param noDataTimeout Specifies an amount of time (in ms) after which the command will be aborted + if no data has been transferred on the bus. + @param completionTimeout Specifies an amount of time (in ms) after which the command will be aborted if the entire command has + not been completed. + @param completion Function to call when request completes. If omitted then + DeviceRequest() executes synchronously, blocking until the request is complete. If the request is asynchronous, the client must make sure that + the IOUSBDevRequest is not released until the callback has occurred. + + */ + virtual IOReturn DeviceRequest(IOUSBDevRequest *request, + UInt32 noDataTimeout, + UInt32 completionTimeout, + IOUSBCompletion *completion = 0); + + /*! + @function DeviceRequest + @abstract execute a control request to the default control pipe (pipe zero) + @param request The parameter block to send to the device (with the pData as an IOMemoryDesriptor) + @param noDataTimeout Specifies an amount of time (in ms) after which the command will be aborted + if no data has been transferred on the bus. + @param completionTimeout Specifies an amount of time (in ms) after which the command will be aborted if the entire command has + not been completed. + @param completion Function to call when request completes. If omitted then + DeviceRequest() executes synchronously, blocking until the request is complete. If the request is asynchronous, the client must make sure that + the IOUSBDevRequest is not released until the callback has occurred. + + */ + OSMetaClassDeclareReservedUsed(IOUSBDevice, 1); + virtual IOReturn DeviceRequest(IOUSBDevRequestDesc *request, + UInt32 noDataTimeout, + UInt32 completionTimeout, + IOUSBCompletion *completion = 0); + + OSMetaClassDeclareReservedUsed(IOUSBDevice, 2); + /*! + @function SuspendDevice + @abstract Instruct the hub to which this device is attached to suspend or resume the port to which the device is attached. + Note that if there are any outstanding transactions on any pipes in the device, those transactions will get returned with a + kIOReturnNotResponding error. + @param suspend Boolean value. true = suspend, false = resume. + */ + virtual IOReturn SuspendDevice( bool suspend); + + OSMetaClassDeclareReservedUsed(IOUSBDevice, 3); + /*! + @function ReEnumerateDevice + @abstract Instruct the hub to which this device is attached to reset the port to which this device is attached. This causes the + IOUSBDevice object and any child objects (IOUSBInterface objects or driver objects) to be terminated, and the device to be + completely reenumerated, as if it had been detached and reattached. + @param options Reserved for future use. + */ + virtual IOReturn ReEnumerateDevice( UInt32 options ); + + OSMetaClassDeclareReservedUsed(IOUSBDevice, 4); + /*! + @function DisplayUserNotification + @abstract Will use the Notification Center to display a notification to the user. Only Low Power and Overcurrent notifications are supported. + @param notificationType Which notification to display. + */ + virtual void DisplayUserNotification(UInt32 notificationType); + + OSMetaClassDeclareReservedUsed(IOUSBDevice, 5); + // Deprecated but needed for binary compatibility + virtual IOUSBPipe* MakePipe(const IOUSBEndpointDescriptor *ep, IOUSBInterface *interface); + + + OSMetaClassDeclareReservedUsed(IOUSBDevice, 6); + /*! + @function SetHubParent + @abstract Used by the hub driver to give the nub a pointer to its HubPolicyMaker object + @param hubPolicyMaker The object representing the Hub driver + */ + virtual void SetHubParent(IOUSBHubPolicyMaker *hubParent); + + OSMetaClassDeclareReservedUsed(IOUSBDevice, 7); + /*! + @function GetHubParent + @abstract Used by the hub driver to give the nub a pointer to its HubPolicyMaker object + @param hubPolicyMaker The object representing the Hub driver + */ + virtual IOUSBHubPolicyMaker* GetHubParent(); + + OSMetaClassDeclareReservedUsed(IOUSBDevice, 8); + /*! + @function GetDeviceInformation + @abstract Returns status information about the USB device, such as whether the device is captive or whether it is in the suspended state. + @param requestedPower The desired amount of power that the client wishes to reserve + @result Actual power that was reserved + + */ + virtual IOReturn GetDeviceInformation(UInt32 *info); + + OSMetaClassDeclareReservedUsed(IOUSBDevice, 9); + /*! + @function RequestExtraPower + @abstract Clients can use this API to reserve extra power for use by this device while the machine is asleep or while it is awake. Units are milliAmps (mA). + @param type Indicates whether the power is to be used during wake or sleep (One of kUSBPowerDuringSleep or kUSBPowerDuringWake) + @param requestedPower Amount of power desired, in mA + @result Amount of power actually reserved, in mA. It can be less than the requested or zero. + + */ + virtual UInt32 RequestExtraPower(UInt32 type, UInt32 requestedPower); + + OSMetaClassDeclareReservedUsed(IOUSBDevice, 10); + /*! + @function ReturnExtraPower + @abstract Clients can use this API to tell the system that they will not use power that was previously reserved by using the RequestExtraPower API. + @param type Indicates whether the power is to be used during wake or sleep (One of kUSBPowerDuringSleep or kUSBPowerDuringWake) + @param returnedPower Amount of power that is no longer needed, in mA + @result If the returnedPower was not previously allocated, an error will be returned. This will include the case for power that was requested for sleep but was returned for wake. + + */ + virtual IOReturn ReturnExtraPower(UInt32 type, UInt32 returnedPower); + + OSMetaClassDeclareReservedUsed(IOUSBDevice, 11); + /*! + @function GetExtraPowerAllocated + @abstract Clients can use this API to ask how much extra power has already been reserved by this device. Units are milliAmps (mA). + @param type Indicates whether the allocated power was to be used during wake or sleep (One of kUSBPowerDuringSleep or kUSBPowerDuringWake) + @result Amount of power allocated, in mA. + + */ + virtual UInt32 GetExtraPowerAllocated(UInt32 type); + + OSMetaClassDeclareReservedUsed(IOUSBDevice, 12); + /*! + @function DoLocationOverrideAndModelMatch + @abstract Will look for a kOverrideIfAtLocationID array proerty with locationID entries and a "MacModel" property. If any of the locationIDs match to the Mac Model, will return true. + If there is no kOverrideAtLocationID property, it will also return true. + @result True if we have a match, false otherwise + */ + virtual bool DoLocationOverrideAndModelMatch(); + + OSMetaClassDeclareReservedUsed(IOUSBDevice, 13); + /*! + @function SetConfiguration + Do a USB SetConfiguration call to the device. The caller must have the device open() in order to + actually cause a configuration change. If the device is currently configured, all IOUSBInterface objects + associated with the device are freed. After the new configuration has been set, all of its IOUSBInterface objects are + instantiated automatically. + @param forClient The client requesting the configuration change + @param configValue The desired configuration value. + @param startInterfaceMatching A boolean specifying whether IOKit should begin the process of finding + @param issueRemoteWakeup A boolean specifying whether we should issue the SetFeature(kUSBFeatureDeviceRemoteWakeup) immediately after setting the configuration, before loading any drivers. + matching drivers for the new IOUSBInterface objects. + */ + virtual IOReturn SetConfiguration(IOService *forClient, UInt8 configValue, bool startInterfaceMatching, bool issueRemoteWakeup); + + OSMetaClassDeclareReservedUsed(IOUSBDevice, 14); + /*! + @function OpenOrCloseAllInterfacePipes + @abstract Iterates over all interfaces and either opens all the pipes, or closes them all + @param open, if true pipes are opened, else closed + */ + virtual void OpenOrCloseAllInterfacePipes(bool open); + + + + + OSMetaClassDeclareReservedUsed(IOUSBDevice, 15); + /*! + @function MakePipe + @abstract build a pipe on a given endpoint + @param ep A description of the endpoint + @param sscd The SuperSpeed Companion Descriptor, if any (NULL if none) + @param interface The IOUSBInterface object requesting the pipe + returns the desired IOUSBPipe object + */ + virtual IOUSBPipeV2* MakePipe(const IOUSBEndpointDescriptor *ep, IOUSBSuperSpeedEndpointCompanionDescriptor *sscd, IOUSBInterface *interface); + + OSMetaClassDeclareReservedUsed(IOUSBDevice, 16); + /*! + @function SetAddress + @param address Sets the bus address of the device + */ + virtual void SetAddress(USBDeviceAddress address); + + OSMetaClassDeclareReservedUsed(IOUSBDevice, 17); + /*! + @function SetIsochDelay + @param delay Sets the delay, in nanoseconds, from the time a host transmits a packet to the time it is received by the device. Sum of all the wHubDelay's for the + upstream hubs. + */ + virtual IOReturn SetIsochDelay(UInt16 delay); + + OSMetaClassDeclareReservedUnused(IOUSBDevice, 18); + OSMetaClassDeclareReservedUnused(IOUSBDevice, 19); + +private: + + static void ProcessPortResetEntry(__unused OSObject *target){}; // obsolete + void ProcessPortReset(void){}; // obsolete + + void TerminateInterfaces(bool terminate); + + static void ProcessPortReEnumerateEntry(OSObject *target, thread_call_param_t options); + void ProcessPortReEnumerate(UInt32 options); + + static void DoMessageClientsEntry(OSObject *target, thread_call_param_t messageStruct); + void DoMessageClients( void * messageStructPtr); + + void DisplayUserNotificationForDevice(UInt32 notificationType, UInt8 port); + + UInt32 SimpleUnicodeToUTF8(UInt16 uChar, UInt8 utf8Bytes[4]); + void SwapUniWords (UInt16 **unicodeString, UInt32 uniSize); + void TrimStringDescriptor(UInt16 **unicodeString, SInt32 *uniSize); + + IOReturn TakeGetConfigLock(void); + IOReturn ReleaseGetConfigLock(void); + static IOReturn ChangeGetConfigLock(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3); + + void RegisterInterfaces(void); + + static IOReturn _ResetDevice(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3); + static IOReturn _ReEnumerateDevice(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3); + static IOReturn _DeviceRequest(OSObject *target, void *arg0, void *arg1, __unused void *arg2, __unused void *arg3); + static IOReturn _DeviceRequestDesc(OSObject *target, void *arg0, void *arg1, __unused void *arg2, __unused void *arg3); + static IOReturn _GetConfiguration(OSObject *target, void *arg0, __unused void *arg1, __unused void *arg2, __unused void *arg3); + static IOReturn _GetDeviceStatus(OSObject *target, void *arg0, __unused void *arg1, __unused void *arg2, __unused void *arg3); + static IOReturn _DeviceRequestWithTimeout(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3); + static IOReturn _DeviceRequestDescWithTimeout(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3); + +}; + +#endif diff --git a/QualcommWireless/include/IOKit/usb/IOUSBHostDevice.h b/QualcommWireless/include/IOKit/usb/IOUSBHostDevice.h new file mode 100644 index 0000000..f9cf3b4 --- /dev/null +++ b/QualcommWireless/include/IOKit/usb/IOUSBHostDevice.h @@ -0,0 +1,840 @@ +/* + * Copyright (c) 1998-2016 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +/*! + @header IOUSBHostDevice.h + @brief IOUSBHostDevice is an IOService representing a USB device. + @discussion + + <h3>Session Management</h3> + + A driver that has successfully matched on an IOUSBHostDevice is able to take ownership of the device by calling the <code>open</code> method defined by IOService on the IOUSBHostDevice. Once <code>open</code> has completed successfully, the driver has an open session, and may use the deviceRequest interface to send control requests, and the setConfiguration interface to create or destroy child IOUSBHostInterface services. + + When the driver is finished with control of the IOUSBHostDevice, it must call <code>close</code> to end its session. Calling <code>close</code> will synchronously abort that session's outstanding IO on the control endpoint. If the device is terminating for any reason, such as being unplugged, the driver must call <code>close</code> on the IOUSBHostDevice, or termination will be blocked and the port will not register newly attached devices for matching. The willTerminate call into the driver is the recommended location to call <code>close</code>. + + Drivers that match on an IOUSBHostInterface service do not need to open a session to the IOUSBHostDevice, as the IOUSBHostInterface will open a session to the IOUSBHostDevice on the driver's behalf. + + <h3>deviceRequest Interface</h3> + + The <code>deviceRequest</code> methods are used to send control requests to the device's default endpoint. The <code>deviceRequest</code> methods may not be used for the following standard requests: + <ul> + <li>CLEAR_FEATURE ENDPOINT_HALT (USB 2.0 9.4.1) - Use <code>IOUSBHostPipe::clearStall</code> to send this request</li> + <li>SET_ADDRESS (USB 2.0 9.4.6)</li> + <li>SET_CONFIGURATION (USB 2.0 9.4.7) - Use <code>setConfiguration</code> to send this request</li> + <li>SET_INTERFACE (USB 2.0 9.4.10) - Use <code>IOUSBHostInterface::selectAlternateSetting</code> to send this request</li> + </ul> + + <h3>IOUSBDevice Migration</h3> + + IOUSBHostDevice serves as a replacement for IOUSBDevice. Clients that previously matched on IOUSBDevice can use the following guide to convert to IOUSBHostDevice. + + <code>virtual UInt16 IOUSBDevice::GetbcdUSB();</code><br> + Replacement: <code>USBToHost16(getDeviceDescriptor()->bcdUSB);</code> + + <code>virtual UInt8 IOUSBDevice::GetDeviceClass();</code><br> + Replacement: <code>getDeviceDescriptor()->bDeviceClass;</code> + + <code>virtual UInt8 IOUSBDevice::GetDeviceSubClass();</code><br> + Replacement: <code>getDeviceDescriptor()->bDeviceSubClass</code> + + <code>virtual UInt8 IOUSBDevice::GetProtocol();</code><br> + Replacement: <code>getDeviceDescriptor()->bDeviceProtocol</code> + + <code>virtual UInt8 IOUSBDevice::GetMaxPacketSize();</code><br> + Replacement: <code>getDeviceDescriptor->bMaxPacketSize0</code> + + <code>virtual UInt16 IOUSBDevice::GetVendorID();</code><br> + Replacement: <code>USBToHost16(getDeviceDescriptor()->idVendor)</code> + + <code>virtual UInt16 IOUSBDevice::GetProductID();</code><br> + Replacement: <code>USBToHost16(getDeviceDescriptor()->idProduct)</code> + + <code>virtual UInt16 IOUSBDevice::GetDeviceRelease();</code><br> + Replacement: <code>USBToHost16(getDeviceDescriptor()->bcdDevice)</code> + + <code>virtual UInt8 IOUSBDevice::GetNumConfigurations();</code><br> + Replacement: <code>getDeviceDescriptor()->bNumConfigurations</code> + + <code>virtual UInt8 IOUSBDevice::GetManufacturerStringIndex();</code><br> + Replacement: <code>getDeviceDescriptor()->iManufacturer</code> + + <code>virtual UInt8 IOUSBDevice::GetProductStringIndex();</code><br> + Replacement: <code>getDeviceDescriptor()->iProduct</code> + + <code>virtual UInt8 IOUSBDevice::GetSerialNumberStringIndex();</code><br> + Replacement: <code>getDeviceDescriptor()->iSerialNumber</code> + + <code>virtual IOReturn IOUSBDevice::FindNextInterfaceDescriptor(const IOUSBConfigurationDescriptor*, const IOUSBInterfaceDescriptor*, const IOUSBFindInterfaceRequest*, IOUSBInterfaceDescriptor**);</code><br> + Replacement:<br> + <pre>ConfigurationDescriptor* confDesc = getConfigurationDescriptor(); +InterfaceDescriptor* intDesc = NULL; +while((intDesc = StandardUSB::getNextInterfaceDescriptor(confDesc, intDesc)) != NULL) +{ + if(intDesc->bInterfaceClass == kMyClass) + { + break; + } +}</pre> + + <code>virtual const IOUSBConfigurationDescriptor* IOUSBDevice::GetCachedConfigurationDescriptor(UInt8 configIndex);</code><br> + <code>virtual const IOUSBConfigurationDescriptor* IOUSBDevice::GetFullConfigurationDescriptor(UInt8 configIndex);</code><br> + Replacement: <code>getConfigurationDescriptor(configIndex)</code> + + <code>virtual IOReturn IOUSBDevice::GetConfigurationDescriptor(UInt8 configValue, void* data, UInt32 len);</code><br> + Replacement: <code>getConfigurationDescriptorWithValue(configValue);</code> + + <code>virtual IOUSBHostInterface* IOUSBDevice::FindNextInterface(IOUSBHostInterface*, IOUSBFindInterfaceRequest* request);</code><br> + <code>virtual OSIterator* IOUSBDevice::CreateInterfaceIterator(IOUSBFindInterfaceRequest* request);</code><br> + Replacement:<br> + <pre>OSIterator* iterator = _device->getChildIterator(gIOServicePlane); +OSObject* candidate = NULL; +while(iterator != NULL && (candidate = iterator->getNextObject()) != NULL) +{ + IOUSBHostInterface* interfaceCandidate = OSDynamicCast(IOUSBHostInterface, candidate); + if( interfaceCandidate != NULL + && interfaceCandidate->getInterfaceDescriptor()->bInterfaceClass == kMyClass) + { + _interface = interfaceCandidate; + break; + } +} +OSSafeReleaseNULL(iterator);</pre> + + <code>virtual IOReturn IOUSBDevice::SetConfiguration(IOService*, UInt8, bool);</code><br> + Replacement: <code>setConfiguration(configNumber, startMatchingInterfaces);</code> + + <code>virtual UInt8 IOUSBDevice::GetSpeed();</code><br> + Replacement: <code>getSpeed();</code> + + <code>virtual IOUSBController* IOUSBDevice::GetBus();</code><br> + Replacement: The controller cannot be directly accessed. Use <code>getFrameNumber(...)</code> and <code>createIOBuffer(...)</code> instead. + + <code>virtual UInt32 IOUSBDevice::GetBusPowerAvailable();</code><br> + Replacement: <code>allocateDownstreamBusCurrent(...);</code> + + <code>virtual IOReturn IOUSBDevice::DeviceRequest(IOUSBDevRequest*, IOUSBCompletion*);<br> + virtual IOReturn IOUSBDevice::DeviceRequest(IOUSBDevRequestDesc*, IOUSBCompletion*);<br> + virtual IOReturn IOUSBDevice::DeviceRequest(IOUSBDevRequest*, UInt32, UInt32, IOUSBCompletion*);<br> + virtual IOReturn IOUSBDevice::DeviceRequest(IOUSBDevRequestDesc*, UInt32, UInt32, IOUSBCompletion*);<br></code> + Replacment: <code>deviceRequest(...);</code> + + <code>virtual IOReturn IOUSBDevice::GetConfiguration(UInt8*);</code><br> + Replacment: + <pre>uint8_t configNumber = 0; +StandardUSB::DeviceRequest request; +request.bmRequestType = makeDeviceRequestbmRequestType(kRequestDirectionIn, kRequestTypeStandard, kRequestRecipientDevice); +request.bRequest = kDeviceRequestGetConfiguration; +request.wValue = 0; +request.wIndex = 0; +request.wLength = sizeof(configNumber); + +uint32_t bytesTransferred = 0; + +deviceRequest(this, request, &configNumber, bytesTransferred, kUSBHostStandardRequestCompletionTimeout);</pre> + + <code>virtual IOReturn IOUSBDevice::GetDeviceStatus(USBStatus*);</code><br> + Replacement: + <pre>uint16_t status = 0; +StandardUSB::DeviceRequest request; +request.bmRequestType = makeDeviceRequestbmRequestType(kRequestDirectionIn, kRequestTypeStandard, kRequestRecipientDevice); +request.bRequest = kDeviceRequestGetStatus; +request.wValue = 0; +request.wIndex = 0; +request.wLength = sizeof(status); + +uint32_t bytesTransferred = 0; + +deviceRequest(this, request, &status, bytesTransferred, kUSBHostStandardRequestCompletionTimeout);</pre> + + <code>virtual IOUSBPipe* IOUSBDevice::GetPipeZero();</code><br> + Replacement: The IOUSBHostPipe representing the default control endpoint is not accessible. Use <code>deviceRequest(...)</code> and <code>abortDeviceRequests(...)</code> interfaces to interact with the default control endpoint. + + <code>virtual IOReturn IOUSBDevice::GetStringDescriptor(UInt8, char*, int, UInt16);</code><br> + Replacement: + <pre>char stringBuffer[256] = { 0 }; +size_t stringLength = sizeof(stringBuffer); +const StringDescriptor* stringDescriptor = getStringDescriptor(index); +if( stringDescriptor != NULL + && stringDescriptor->bLength > StandardUSB::kDescriptorSize) +{ + StandardUB::stringDescriptorToUTF8(stringDescriptor, stringBuffer, stringLength); +}</pre> + + <code>virtual const IOUSBDescriptorHeader* IOUSBDevice::FindNextDescriptor(const void*, UInt8);</code><br> + Replacement: <code>StandardUSB::getNextDescriptorWithType(getConfigurationDescriptor(), currentDescriptor, descriptorType);</code> + + <code>virtual IOReturn IOUSBDevice::SuspendDevice(bool);</code><br> + Replacement: Power management should be done using the idling system described in IOUSBHostFamily.h. + + <code>virtual IOReturn IOUSBDevice::ReEnumerateDevice(UInt32);</code><br> + Replacement: <code>reset();</code> + + <code>virtual IOReturn IOUSBDevice::GetDeviceInformation(UInt32*);</code><br> + Replacement: <code>getPortStatus();</code> + + <code>virtual UInt32 IOUSBDevice::RequestExtraPower(UInt32, UInt32);<br> + virtual IOReturn IOUSBDevice::ReturnExtraPower(UInt32, UInt32);</code><br> + Replacement: <code>allocateDownstreamBusCurrent(...);</code> + + <code>virtual tUSBHostDeviceAddress IOUSBDevice::GetAddress(void);</code><br> + Replacement: <code>getAddress();</code> + + <code>virtual IOReturn IOUSBDevice::ResetDevice();<br> + virtual UInt32 IOUSBDevice::GetExtraPowerAllocated(UInt32);<br> + void IOUSBDevice::SetBusPowerAvailable(UInt32);</code><br> + Replacement: none + */ + +#ifndef IOUSBHostFamily_IOUSBHostDevice_h +#define IOUSBHostFamily_IOUSBHostDevice_h + +#include <IOKit/usb/StandardUSB.h> +#include <IOKit/usb/IOUSBHostFamily.h> +#include <IOKit/usb/IOUSBHostPipe.h> +#include <IOKit/IOBufferMemoryDescriptor.h> + +#if TARGET_OS_OSX +#include <USBDriverKit/IOUSBHostDevice.h> +#endif + +#include <IOKit/IOWorkLoop.h> +#include <IOKit/IOCommandGate.h> +#include <IOKit/pwr_mgt/RootDomain.h> +#include <kern/thread_call.h> + +#define kUSBHostDeviceForceSuspend "kUSBHostDeviceForceSuspend" + +class AppleUSBHostController; +class IOUSBHostInterface; +class AppleUSBHostDeviceIdler; +class AppleUSBHostRequestCompleter; +class AppleUSBHostPort; +class AppleUSBDescriptorCache; +class AppleUSBHostResources; + +/*! + * @class IOUSBHostDevice + * @brief The IOService object representing a USB device + * @discussion This class provides functionality to send control requests to the default control endpoint, as well as create IOUSBHostInterface objects to represent the interfaces contained in the selected configuration. Function drivers should not subclass IOUSBHostDevice. + */ +class __IOUSBHOSTFAMILY_DEPRECATED IOUSBHostDevice : public IOService +{ + friend class AppleUSBHostController; + friend class IOUSBHostInterface; + friend class IOUSBHostIOSource; + friend class IOUSBHostPipe; + friend class IOUSBHostStream; + friend class AppleUSBIORequest; + friend class AppleUSBHostDeviceIdler; + +#if TARGET_OS_OSX + OSDeclareDefaultStructorsWithDispatch(IOUSBHostDevice) +#else + OSDeclareDefaultStructors(IOUSBHostDevice) +#endif + +public: + /*! + * @namespace IOUSBHostDevice + * @brief Powerstates supported by an IOUSBHostDevice + * @constant kPowerStateOff The device has been powered off and will be terminated. + * @constant kPowerStateSuspended The device is suspended. All I/O has been paused and the bus will be suspended once its AppleUSBHostPort power parent enters the suspend state. + * @constant kPowerStateOn The device is powered on and I/O is possible. + * @constant kPowerStateCount Number of possible power states. + */ + enum tPowerState + { + kPowerStateOff = 0, + kPowerStateSuspended, + kPowerStateOn, + kPowerStateCount + }; + + /* + * @brief Factory method for creating an IOUSBHostDevice object + * @discussion This method should not be called by function drivers. IOUSBHostDevice objects are created by AppleUSBHostPort services when a device is connected. + * @param controller Controller to which the USB device is attached + * @param speed Speed at which the device enumerated + * @param address tUSBHostDeviceAddress that has been allocated by the controller + * @return Pointer to an IOUSBHostDevice object if successful, otherwise NULL + */ + static IOUSBHostDevice* withController(AppleUSBHostController* controller, UInt8 speed, tUSBHostDeviceAddress address); + +protected: + virtual bool initWithController(AppleUSBHostController* controller, UInt8 speed, tUSBHostDeviceAddress address); + + // Pad slots for future expansion + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 0); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 1); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 2); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 3); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 4); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 5); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 6); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 7); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 8); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 9); + +#pragma mark IOService overrides +public: + /*! + * @functiongroup IOService overrides + * @discussion For a discussion of proper usage for <code>open</code> and <code>close</code>, see the discussion of "Session Management" above. + */ + + virtual bool attach(IOService* provider) APPLE_KEXT_OVERRIDE; + virtual bool start(IOService* provider) APPLE_KEXT_OVERRIDE; + virtual bool terminate(IOOptionBits options = 0) APPLE_KEXT_OVERRIDE; + virtual bool willTerminate(IOService* provider, IOOptionBits options) APPLE_KEXT_OVERRIDE; + virtual void stop(IOService* provider) APPLE_KEXT_OVERRIDE; + virtual void free(void) APPLE_KEXT_OVERRIDE; + + virtual bool compareProperty(OSDictionary* matching, const char* key) APPLE_KEXT_OVERRIDE; + virtual bool compareProperty(OSDictionary* matching, const OSString* key) APPLE_KEXT_OVERRIDE; + virtual bool matchPropertyTable(OSDictionary* table, SInt32* score) APPLE_KEXT_OVERRIDE; + virtual bool matchPropertyTable(OSDictionary* table) APPLE_KEXT_OVERRIDE; + + virtual IOReturn setProperties(OSObject* properties) APPLE_KEXT_OVERRIDE; + + /*! + * @brief Open a session to the IOUSBHostDevice + * @discussion This method opens a session to an IOUSBHostDevice. It will acquire the service's workloop lock. Child IOUSBHostInterfaces may open simultaneous sessions, but only one other service may open a session. + * @param forClient The IOService that is opening a session. + * @param options See IOService.h + * @param arg See IOService.h + * @return bool true if the session could be opened, otherwise false. + */ + virtual bool open(IOService* forClient, IOOptionBits options = 0, void* arg = 0) APPLE_KEXT_OVERRIDE; + virtual bool handleOpen(IOService* forClient, IOOptionBits options, void* arg) APPLE_KEXT_OVERRIDE; + virtual bool handleIsOpen(const IOService* forClient) const APPLE_KEXT_OVERRIDE; + + /*! + * @brief Close a session to the IOUSBHostDevice + * @discussion This method closes an open session to an IOUSBHostDevice. It will acquire the service's workloop lock, abort any IO associated with the specified client, and may call commandSleep to allow processing of aborted control requests before returning. + * @param forClient The IOService that is closing its session. Any IO associated with the specified client will be aborted. + * @param options See IOService.h + */ + virtual void close(IOService* forClient, IOOptionBits options = 0) APPLE_KEXT_OVERRIDE; + virtual void handleClose(IOService* forClient, IOOptionBits options) APPLE_KEXT_OVERRIDE; + + virtual IOReturn newUserClient(task_t owningTask, void* securityID, UInt32 type, IOUserClient** handler) APPLE_KEXT_OVERRIDE; + + virtual IOReturn message(UInt32 type, IOService* provider, void* argument = 0) APPLE_KEXT_OVERRIDE; + + virtual const char* stringFromReturn(IOReturn code) APPLE_KEXT_OVERRIDE; + + virtual bool setProperty(const OSSymbol* aKey, OSObject* anObject) APPLE_KEXT_OVERRIDE; + virtual bool setProperty(const OSString* aKey, OSObject* anObject) APPLE_KEXT_OVERRIDE; + virtual bool setProperty(const char* aKey, OSObject* anObject) APPLE_KEXT_OVERRIDE; + virtual bool setProperty(const char* aKey, const char* aString) APPLE_KEXT_OVERRIDE; + virtual bool setProperty(const char* aKey, bool aBoolean) APPLE_KEXT_OVERRIDE; + + virtual bool setProperty(const char* aKey, unsigned long long aValue, unsigned int aNumberOfBits) APPLE_KEXT_OVERRIDE; + virtual bool setProperty(const char* aKey, void* bytes, unsigned int length) APPLE_KEXT_OVERRIDE; + +protected: + virtual IOReturn terminateGated(IOOptionBits options = 0); + + virtual IOReturn openGated(IOService* forClient, IOOptionBits options, void* arg); + virtual IOReturn closeGated(IOService* forClient, IOOptionBits options); + + // Protected pad slots for IOService overrides + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 10); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 11); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 12); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 13); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 14); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 15); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 16); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 17); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 18); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 19); + +protected: + int32_t _terminationPending; + AppleUSBHostResources* _resources; + AppleUSBHostController* _controller; + AppleUSBHostPort* _port; + OSSet* _clients; + IOWorkLoop* _workLoop; + IOCommandGate* _commandGate; + +#pragma mark Power management +public: + /*! + * @functiongroup Power management + */ + + virtual void registerPowerService(); + virtual IOReturn addPowerChild(IOService* theChild) APPLE_KEXT_OVERRIDE; + virtual IOReturn removePowerChild(IOPowerConnection* theChild) APPLE_KEXT_OVERRIDE; + virtual IOReturn powerStateWillChangeTo(IOPMPowerFlags capabilities, unsigned long stateNumber, IOService* whatDevice) APPLE_KEXT_OVERRIDE; + virtual IOReturn setPowerState(unsigned long stateNumber, IOService* whatDevice) APPLE_KEXT_OVERRIDE; + virtual IOReturn powerStateDidChangeTo(IOPMPowerFlags capabilities, unsigned long stateNumber, IOService* whatDevice) APPLE_KEXT_OVERRIDE; + virtual unsigned long initialPowerStateForDomainState(IOPMPowerFlags domainState) APPLE_KEXT_OVERRIDE; + virtual void PMstop(void) APPLE_KEXT_OVERRIDE; + virtual IOReturn forcePower(tPowerState powerState, bool clamp, uint32_t timeoutMs = 0); + + /*! + * @brief Allocate bus current that does not match the bMaxPower value specified by the device's configuration descriptor + * @discussion + * Devices can use this interface to request more or less bus current than what is specified in the selected configuration descriptor's bMaxPower field. The parameters passed in are abolute values of current required for operation in kPowerStateOn and kPowerStateSuspended IOUSBHostDevice power levels, and override the bMaxPower field in the configuration descriptor. For example, if bMaxPower indicates the device requires 500mA to operate, then a request for 1000mA will double the allocated power for the device. + * A setConfiguration call to select a different configuration or unconfigure the device will reset the bus current allocations. + * The parameters are passed by reference, and may be modified before being returned. If more bus current is being requested than is available, the values may be reduced to stay within system limits. + * @param wakeUnits As input, the number of mA requested when the device is in kPowerStateOn. As output, the number of mA allocated to the device in kPowerStateOn. + * @param sleepUnits As input, the number of mA requested when the device is in kPowerStateSuspended. As output, the number of mA allocated to the device in kPowerStateSuspended. + * @return IOReturn kIOReturnSuccess if the device's allocation amounts were updated, otherwise an error code + */ + virtual IOReturn allocateDownstreamBusCurrent(uint32_t& wakeUnits, uint32_t& sleepUnits); + + enum tIdleAssertion + { + kIdleAssertionInhibit = 0, + kIdleAssertionPermit + }; + /*! + * @brief This method should be considered private and should not be called by function drivers. + */ + virtual IOReturn idleAssertion(IOService* forService, tIdleAssertion assertion); + + // Public pad slots for power management + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 20); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 21); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 22); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 23); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 24); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 25); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 26); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 27); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 28); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 29); + +protected: + static IOPMPowerState _sPowerStates[kPowerStateCount]; + static const OSSymbol* _sPowerStateSymbols[kPowerStateCount]; + + virtual void powerChangeDone(unsigned long stateNumber) APPLE_KEXT_OVERRIDE; + virtual IOReturn powerStateWillChangeToGated(IOPMPowerFlags capabilities, unsigned long stateNumber, IOService* whatDevice); + virtual IOReturn setPowerStateGated(unsigned long stateNumber, IOService* whatDevice); + virtual IOReturn powerStateDidChangeToGated(IOPMPowerFlags capabilities, unsigned long stateNumber, IOService* whatDevice); + virtual IOReturn forcePowerGated(tPowerState powerState, bool clamp, uint32_t timeoutMs); + virtual void addPowerChildThreadCall(thread_call_t threadCall); + virtual IOReturn addPowerChildGated(void); + + virtual void pmStopThreadCall(thread_call_t threadCall); + + virtual IOReturn allocateDownstreamBusCurrentGated(uint32_t& wakeUnits, uint32_t& sleepUnits); + + virtual IOReturn updateIdlePolicy(bool asynchronous = false); + virtual void updateIdlePolicyAsync(thread_call_t threadCall); + virtual IOReturn updateIdlePolicyGated(); + + // Protected pad slots for power management + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 30); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 31); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 32); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 33); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 34); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 35); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 36); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 37); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 38); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 39); + +protected: + bool _allowUpdateIdlePolicy; + bool _forcePowerInProgress; + IOLock* _powerChildrenLock; + OSSet* _powerChildren; + OSSet* _activePowerChildren; + IOPMDriverAssertionID _externalDevicePowerAssertion; + tPowerState _currentPowerState; + bool _powerOffPending; + +#pragma mark Descriptors +public: + /*! @functiongroup Descriptors */ + + /*! + * @brief Store the provided descriptor in the set of cached descriptors. + * @discussion This method will store a descriptor in a set of cached descriptors. If a descriptor with an identical <code>bDescriptorType</code>, <code>index</code>, and <code>languageID</code> already exists in the cache, it will be replaced. The provided descriptor is copied, and may be discarded after being stored in the cache. Future descriptor fetch calls such as getDescriptor will return the cached value. Future GET_DESCRIPTOR control requests (USB 2.0 9.4.3) will also return the cached descriptor. SET_DESCRIPTOR control requests (USB 2.0 9.4.8) will remove the cached descriptor. + * @param descriptor Pointer to the descriptor to cache + * @param length Length of the descriptor, or 0 the descriptor's bLength field should be used. + * @param index Descriptor index value. Low byte of <code>wValue</code> of the SET_DESCRIPTOR control request (USB 2.0 9.4.8). + * @param languageID Descriptor language ID. <code>wIndex</code> of the SET_DESCRIPTOR control request (USB 2.0 9.4.8). + * @return IOReturn result code + */ + virtual IOReturn cacheDescriptor(const StandardUSB::Descriptor* descriptor, uint16_t length = 0, uint8_t index = 0, uint16_t languageID = 0); + + /*! + * @brief Retrieve a descriptor from the cache or the device + * @discussion + * This method will search the descriptor cache for the descriptor that matches the input arguments. If the descriptor is not in the cache, a GET_DESCRIPTOR control request (USB 2.0 9.4.3) will be issued to retrieve the descriptor from the device. If the device request is successful, the retrieved descriptor will be added to the cache. + * This method will acquire the service's workloop lock, and may call commandSleep to perform the GET_DESCRIPTOR control request. + * @param type <code>bDescriptorType</code> of the descriptor to find. + * @param length Reference to a uint16_t which will be updated with the length of the descriptor. As input, used as <code>wLength</code> when fetching variable-length configuration or BOS descriptors, or when fetching nonstandard descriptor types. + * @param index Descriptor index value. Low byte of <code>wValue</code> of the SET_DESCRIPTOR control request (USB 2.0 9.4.8). + * @param languageID Descriptor language ID. <code>wIndex</code> of the SET_DESCRIPTOR control request (USB 2.0 9.4.8). + * @param requestType tDeviceRequestType to be used for a GET_DESCRIPTOR control request. + * @param requestRecipient tDeviceRequestRecipient to be used for a GET_DESCRIPTOR control request. + * @return Pointer to the cached descriptor if found, otherwise NULL. + */ + virtual const StandardUSB::Descriptor* getDescriptor(uint8_t type, + uint16_t& length, + uint8_t index = 0, + uint16_t languageID = 0, + tDeviceRequestType requestType = kRequestTypeStandard, + tDeviceRequestRecipient requestRecipient = kRequestRecipientDevice); + + /*! + * @brief Return the device descriptor + * @discussion This method uses getDescriptor to retrieve the device descriptor. + * @return Pointer to the device descriptor, or NULL if the service is terminating. + */ + virtual const StandardUSB::DeviceDescriptor* getDeviceDescriptor(); + + /*! + * @brief Return the configuration descriptor with the specified index + * @discussion This method uses getDescriptor to retrieve a configuration descriptor. + * @param index Descriptor index value + * @return Pointer to the configuration descriptor if found + */ + virtual const StandardUSB::ConfigurationDescriptor* getConfigurationDescriptor(uint8_t index); + + /*! + * @brief Return the configuration descriptor with the specified <code>bConfigurationValue</code> + * @discussion This method uses getDescriptor to search for a configuration descriptor with a specific <code>bConfigurationValue</code> field. + * @param bConfigurationValue Value to match + * @return Pointer to the configuration descriptor if found + */ + virtual const StandardUSB::ConfigurationDescriptor* getConfigurationDescriptorWithValue(uint8_t bConfigurationValue); + + /*! + * @brief Return the currently selected configuration descriptor + * @discussion This method uses getDescriptor to return the configuration descriptor currently selected after a successful setConfiguration call + * @return Pointer to the configuration descriptor if found, or NULL if the device is not configured + */ + virtual const StandardUSB::ConfigurationDescriptor* getConfigurationDescriptor(); + + /*! + * @brief Return the capability descriptors of the device + * @discussion This method uses getDescriptor to return the device's BOS descriptors + * @return Pointer to the BOS descriptor if found, otherwise NULL + */ + virtual const StandardUSB::BOSDescriptor* getCapabilityDescriptors(); + + /*! + * @brief Return a string descriptor from the device + * @discussion This method uses getDescriptor to return a string descriptor. + * @param index Descriptor index value. Low byte of <code>wValue</code> of the SET_DESCRIPTOR control request (USB 2.0 9.4.8). + * @param languageID Descriptor language ID. <code>wIndex</code> of the SET_DESCRIPTOR control request (USB 2.0 9.4.8). * + * @return Pointer to the descriptor if found + */ + virtual const StandardUSB::StringDescriptor* getStringDescriptor(uint8_t index, uint16_t languageID = StandardUSB::kLanguageIDEnglishUS); + + // Public pad slots for descriptors + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 40); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 41); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 42); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 43); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 44); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 45); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 46); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 47); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 48); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 49); + +protected: + virtual IOReturn cacheDescriptorGated(const StandardUSB::Descriptor* descriptor, uint16_t length, uint8_t index, uint16_t languageID); + + struct tDescriptorSelectors + { + uint8_t index; + uint16_t languageID; + tDeviceRequestType requestType; + tDeviceRequestRecipient requestRecipient; + }; + virtual IOReturn getDescriptorGated(uint8_t type, uint16_t& length, tDescriptorSelectors& selectors, const StandardUSB::Descriptor*& result); + + // Protected pad slots for descriptors + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 50); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 51); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 52); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 53); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 54); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 55); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 56); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 57); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 58); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 59); + +protected: + bool _getDescriptorInProgress; + AppleUSBDescriptorCache* _descriptorCache; + +#pragma mark Configuration, interface, and pipe management +public: + /*! @functiongroup Configuration, interface, and pipe management */ + + /*! + * @brief Select a new configuration for the device + * @discussion + * This method will select a new configuration for a device. If the device was previously configured all child interfaces will be terminated prior to setting the new configuration. This method will send the SET_CONFIGURATION control request (USB 2.0 9.4.7) to the device. + * This method will acquire the service's workloop lock, and may call commandSleep to perform the SET_CONFIGURATION control request. + * @param bConfigurationValue Configuration to select + * @param matchInterfaces If true, any interfaces within the new configuration will be registered for matching. + * @return IOReturn result code + */ + virtual IOReturn setConfiguration(uint8_t bConfigurationValue, bool matchInterfaces = true); + + /*! + * @brief The following method should be considered private and should not be called by function drivers. + * @discussion Drivers should use <code>IOUSBHostInterface::copyPipe</code> to retrieve handles to IOUSBHostPipe objects. + */ + virtual IOUSBHostPipe* createPipe(const StandardUSB::EndpointDescriptor* descriptor, const StandardUSB::SuperSpeedEndpointCompanionDescriptor* companionDescriptor, IOUSBHostInterface* interface); + + /*! + * @brief Enqueue a request on the default control endpoint + * @discussion This method will enqueue an asynchronous request on the default control endpoint. If successful, the provided completion routine will be called to report the status of the completed IO. + * @param forClient The service with an open session issuing the request. + * @param request Reference to a valid StandardUSB::DeviceRequest structure. The structure is copied and can therefore be stack-allocated. + * @param dataBuffer A void* or IOMemoryDescriptor* defining the memory to use for the request's data phase. + * @param completion Pointer to a IOUSBHostCompletion structure. This will be copied and can therefore be stack-allocated. + * @param completionTimeoutMs Timeout of the request in milliseconds. If 0, the request will never timeout. + * @return kIOReuturnSuccess if the completion will be called in the future, otherwise error + */ + virtual IOReturn deviceRequest(IOService* forClient, StandardUSB::DeviceRequest& request, void* dataBuffer, IOUSBHostCompletion* completion, uint32_t completionTimeoutMs = kUSBHostDefaultControlCompletionTimeoutMS); + virtual IOReturn deviceRequest(IOService* forClient, StandardUSB::DeviceRequest& request, IOMemoryDescriptor* dataBuffer, IOUSBHostCompletion* completion, uint32_t completionTimeoutMs = kUSBHostDefaultControlCompletionTimeoutMS); + + /*! + * @brief Send a request on the default control endpoint + * @discussion This method will send a synchronous request on the default control endpoint, and will not return until the request is complete. This method will acquire the service's workloop lock, and will call commandSleep to send the control request. + * @param forClient The service with an open session issuing the request. + * @param request Reference to a valid StandardUSB::DeviceRequest structure. + * @param dataBuffer A void* or IOMemoryDescriptor* defining the memory to use for the request's data phase. + * @param bytesTransferred A uint32_t reference which will be updated with the byte count of the completed data phase. + * @param completionTimeoutMs Timeout of the request in milliseconds. If 0, the request will never timeout. + * @return IOReturn value indicating the result of the IO request + */ + virtual IOReturn deviceRequest(IOService* forClient, StandardUSB::DeviceRequest& request, void* dataBuffer, uint32_t& bytesTransferred, uint32_t completionTimeoutMs = kUSBHostDefaultControlCompletionTimeoutMS); + virtual IOReturn deviceRequest(IOService* forClient, StandardUSB::DeviceRequest& request, IOMemoryDescriptor* dataBuffer, uint32_t& bytesTransferred, uint32_t completionTimeoutMs = kUSBHostDefaultControlCompletionTimeoutMS); + + /*! + * @brief Abort device requests made via the @link deviceRequest @/link methods by <code>forClient</code> + * @discussion This method will abort any requests associated with a specific client made via the @link deviceRequest @/link methods. It will not abort requests made by other clients. + * @param forClient Client which issued the requests + * @param options IOUSBHostIOSource::tAbortOptions + * @param withError IOReturn error value to return with the requests. The default value of kIOReturnAborted should be used. + * @return IOReturn result code + */ + virtual IOReturn abortDeviceRequests(IOService* forClient = NULL, IOOptionBits options = IOUSBHostIOSource::kAbortAsynchronous, IOReturn withError = kIOReturnAborted); + + // Public pad slots for configuration, interface, and pipe management + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 60); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 61); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 62); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 63); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 64); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 65); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 66); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 67); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 68); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 69); + +protected: + virtual IOReturn setConfigurationGated(uint8_t bConfigurationValue, bool matchInterfaces); + + virtual IOReturn createPipeGated(const StandardUSB::EndpointDescriptor* descriptor, const StandardUSB::SuperSpeedEndpointCompanionDescriptor* companionDescriptor, IOUSBHostInterface* interface, IOUSBHostPipe*& result); + + virtual IOReturn deviceRequest(IOService* forClient, StandardUSB::DeviceRequest& request, + void* rawBuffer, IOMemoryDescriptor* descriptorBuffer, + uint32_t& bytesTransferred, IOUSBHostCompletion* completion, + uint32_t completionTimeoutMs); + + virtual IOReturn internalDeviceRequest(IOService* forClient, StandardUSB::DeviceRequest& request, + void* rawBuffer, IOMemoryDescriptor* descriptorBuffer, + uint32_t& bytesTransferred, IOUSBHostCompletion* completion, + uint32_t completionTimeoutMs); + + virtual IOReturn internalDeviceRequestGated(IOUSBHostPipe::tInternalControlRequestParameters& parameters); + + virtual IOReturn abortDeviceRequestsGated(IOService* forClient, IOOptionBits options, IOReturn withError); + + virtual IOReturn getLPMExitLatencyGated(tUSBLinkState linkState, tUSBLPMExitLatency latencyType, uint32_t& latencyNs); + + virtual IOReturn updateLPMPolicyGated(); + + // Protected pad slots for configuration, interface, and pipe management + OSMetaClassDeclareReservedUsed(IOUSBHostDevice, 70); + OSMetaClassDeclareReservedUsed(IOUSBHostDevice, 71); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 72); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 73); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 74); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 75); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 76); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 77); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 78); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 79); + +#pragma mark Miscellaneous +public: + /*! @functiongroup Provider and state accessors */ + + /*! + * @brief Retrieve the device's address + * @return Current address of the device + */ + virtual tUSBHostDeviceAddress getAddress() const; + + /*! + * @brief Retrieve the device's operational speed + * @return tInternalUSBHostConnectionSpeed + */ + virtual uint8_t getSpeed() const; + + /*! + * @brief Return the current frame number of the USB controller + * @description This method will return the current frame number of the USB controller, omitting microframe. This is most useful for scheduling future isochronous requests. + * @param theTime If not NULL, this will be updated with the current system time + * @return The current frame number + */ + virtual uint64_t getFrameNumber(AbsoluteTime* theTime = NULL); + + /*! + * @brief Terminate the device and attempt to reenumerate it + * @discussion This function will reset and attempt to reenumerate the USB device. The current IOUSBHostDevice object and all of its children will be terminated. A new IOUSBHostDevice object will be created and registered if the reset is successful and the previous object has finished terminating. This function may not be called from the port workloop thread. + * @return IOReturn result code + */ + virtual IOReturn reset(); + + /*! + * @brief Return the current port status + * @discussion This method will return the current port status as described by @link tUSBHostPortStatus @/link + * @return port status + */ + virtual uint32_t getPortStatus(); + + /*! + * @brief Allocate a buffer to be used for I/O + * @discussion This method will allocate an IOBufferMemoryDescriptor optimized for use by the underlying controller hardware. A buffer allocated by this method will not be bounced to perform DMA operations. + * @param options kIODirectionOut, kIODirectionIn to set the direction of the I/O transfer. + * @param capacity Size of the buffer to allocate + * @return Pointer to an IOBufferMemoryDescriptor if successful, otherwise NULL + */ + virtual IOBufferMemoryDescriptor* createIOBuffer(IOOptionBits options, mach_vm_size_t capacity); + + /*! + * @brief Calculate desired USB LPM Exit Latency + * @discussion This method can be called to get various USB LPM Exit Latencies + * @param linkState The link state we want to exit from + * @param latencyType Desired type of Exit Latency to be calculated + * @param latencyNs Calculated Exit Latency value in Nanoseconds + * @return IOReturn result code + */ + virtual IOReturn getLPMExitLatency(tUSBLinkState linkState, tUSBLPMExitLatency latencyType, uint32_t& latencyNs); + + // Public pad slots for miscellaneous + OSMetaClassDeclareReservedUsed(IOUSBHostDevice, 80); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 81); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 82); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 83); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 84); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 85); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 86); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 87); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 88); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 89); + +protected: + // Protected pad slots for miscellaneous + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 90); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 91); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 92); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 93); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 94); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 95); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 96); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 97); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 98); + OSMetaClassDeclareReservedUnused(IOUSBHostDevice, 99); + +#if TARGET_OS_OSX + static void asyncDeviceRequestCompletionCallback(void *owner, void *parameter, IOReturn status, uint32_t bytesTransferred); +#endif + +protected: + enum + { + kClientsDefaultCapacity = 16, + kPowerChildrenDefaultCapacity = 16, + kSetConfigurationIORetries = 3, + kSetConfigurationIORetryInterval = 100 + }; + + AppleUSBHostRequestCompleter* _requestCompleter; + AppleUSBHostDeviceIdler* _deviceIdler; + tUSBHostDeviceAddress _address; + IOUSBHostPipe* _pipeZero; + UInt8 _speed; + StandardUSB::EndpointDescriptor _endpointZero; + IOBufferMemoryDescriptor** _configList; + uint32_t _configListCount; + uint8_t _currentConfigValue; + bool _setConfigurationInProgress; + uint32_t _configurationBusCurrent; // mA + uint32_t _allocatedWakeBusCurrent; // mA + uint32_t _allocatedSleepBusCurrent;// mA + uint32_t _pendingCloseCount; + + uint32_t _debugLoggingMask; + uint32_t _locationID; + + struct tExpansionData + { + OSDictionary* _lpmLatencyCache; + tUSBDeviceLPMStatus _lpmU1Status; + tUSBDeviceLPMStatus _lpmU2Status; + tUSBDeviceLPMStatus _lpmL1Status; + OSDictionary* _dkInterfaceIteratorDict; + uintptr_t _dkInterfaceInteratorRefID; + }; + + tExpansionData* _expansionData; + + +private: + enum + { + kForcePowerTimeoutMs = 1000ULL, // Milliseconds + kSuspendDeviceTimeout = 1000ULL, // Milliseconds + kTerminationTimeout = 5000ULL, // Milliseconds + kDeviceAddressInvalid = 0xffff + }; +}; + +#endif // IOUSBHostFamily_IOUSBHostDevice_h diff --git a/QualcommWireless/include/IOKit/usb/IOUSBHostFamily.h b/QualcommWireless/include/IOKit/usb/IOUSBHostFamily.h new file mode 100644 index 0000000..e5094fd --- /dev/null +++ b/QualcommWireless/include/IOKit/usb/IOUSBHostFamily.h @@ -0,0 +1,502 @@ +/* + * Copyright (c) 1998-2016 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +/*! + @header IOUSBHostFamily.h + @brief IOUSBHostFamily provides support for discovering, enumerating, and communicating with USB devices. + @discussion Starting with Mac OS X El Capitan, IOUSBHostFamily serves as a replacement for IOUSBFamily. + + <h3>Architecture</h3> + + USB host controller hardware is managed by AppleUSBHostController subclasses such as AppleUSBXHCI and AppleUSBEHCI. Each AppleUSBHostController is the parent to one or more AppleUSBHostPort services, and each AppleUSBHostPort is able to enumerate a single IOUSBHostDevice service. IOUSBHostDevice is the parent to zero or more IOUSBHostInterface services, and IOUSBHostInterface provides access to zero or more IOUSBHostPipe objects. USB 3.0 and newer streaming-capable IOUSBHostPipe objects can generate one or more IOUSBHostStream objects. + + AppleUSBHostPort services provide a workloop that is dedicated for use by the port, its enumerated device, and any attached drivers. As such, drivers should not create or manage their own workloops. + + IOUSBHostDevice and IOUSBHostInterface services can be matched on and controlled by third-party drivers, and are documented in IOUSBHostDevice.h and IOUSBHostInterface.h. IOUSBHostPipe and IOUSBHostStream services share a common IOUSBHostIOSource base class, and are documented in IOUSBHostIOSource.h, IOUSBHostPipe.h, and IOUSBHostStream.h. AppleUSBHostController and AppleUSBHostPort should be considered opaque classes. + + <h3>Matching</h3> + + IOUSBHostDevice and IOUSBHostInterface matching uses the same properties as the deprecated IOUSBDevice and IOUSBInterface classes. See <a href="https://developer.apple.com/library/mac/qa/qa1076/_index.html">QA1076: Tips on USB driver matching for Mac OS X</a> for additional information. + + <h3>Power management</h3> + + IOUSBHostFamily supports more advanced power management capabilities, including pausing IO, and automatic suspend of idle devices. All of this functionality is guided by idle policies set on IOUSBHostInterface services and IOUSBHostPipe objects. The idle policy functionality allows most drivers to ignore suspend or resume events on the bus, and makes it unnecessary for them to actively participate in power management. + + <h4>Idle suspend</h4> + + By default, interfaces and pipes do not enable an idle policy, and the device will remain in the active (not suspended) state as long as the host machine is awake. To enable idle suspend, the driver controlling an IOUSBHostInterface must enable an idle policy with the <code>IOUSBHostInterface::setIdlePolicy</code> API. In the simple case of a device with only a single interface, when the interface's endpoints have no IO requests pending, the system will wait the time specified in the setIdlePolicy call, and then electrically suspend the device. A new IO request during the wait period will cancel the suspend, and a new IO request after the device has suspended will immediately resume the device and initiate the IO. + + In the more complex case of a device with multiple interfaces, a consensus idle policy must be calculated by finding the largest idle policy for all interfaces, excluding those which have not been opened by a driver. + + Selection of an idle policy depends on the individual device, and should factor in resume latency tolerance. The recommended idle policy for an interface is 50ms or larger. + + Idle suspend is disabled if a driver is the power child of the IOUSBHostDevice and resides in a power state with an input power requirement that does not include <code>kIOPMLowPower</code>. + + <h4>Pausing IO</h4> + + A more advanced approach to idle suspend allows the device to suspend while transfers are still pending. This is particularly useful for interfaces with interrupt IN endpoints that always have an IO pending, and otherwise would not idle suspend. To enable IO pause, endpoints that would otherwise keep the device in the active state must enable an idle policy with the <code>IOUSBHostPipe::setIdlePolicy</code> API. When an IOUSBHostPipe with an idle policy begins servicing a new IO, but does not complete it within the wait time specified in the idle policy, the IOUSBHostPipe is now considered idle and will not keep the device in the active state. Idle endpoints are still serviced on the bus, and the IOUSBHostPipe is capable of moving data even when idle. When all endpoints in the device have no pending IO requests or are idle, the idle suspend wait period begins as described above. + + If the idle suspend period elapses without any new IO requests that would cancel the suspend, IOUSBHostFamily will pause the transfers on the bus and suspend the device. IO requests are not aborted or returned to the driver when paused in this manner. + + After resuming the device due to a remote wake or a new IO request, the pending IO requests are resumed on the bus, and data movement can continue. If a large transfer is interrupted by a suspend, IOUSBHostFamily will combine the packets from before and after the suspend and return them as a single transfer result. Note that not all firmware supports a mid-transfer suspend/resume, and pausing IO should only be enabled for devices that have been tested for this use case. + + Control and isochronous IOUSBHostPipe objects never enable an idle policy, and pending IO on these endpoints will always prevent idle suspend. + + Selection of an idle policy depends on the individual endpoint, and should factor in resume latency tolerance and expected data transfer frequency. The recommended idle policy for IN-direction bulk and interrupt endpoints is 50ms or larger. Firmware must be capable of handling a mid-transfer suspend/resume, and should issue a remote wake when data is available to be read. Enabling an idle policy for OUT-direction bulk or interrupt endpoints is not generally recommended, but if enabled, firmware should have the ability to issue a remote wake when there is space in its endpoint buffer for additional data. + + <h4>System power state changes</h4> + + For devices that idle suspend, it may be necessary to perform IO as the system enters the sleep state, for example to enable wake-on-LAN for an Ethernet controller. Drivers that wish to perform this type of IO should call <code>IOService::registerInterestedDriver</code> on the PM root to be notified of system-level changes. During the <code>powerStateWillChangeTo</code> notification with a capability flag including <code>kIOPMSleepCapability</code>, the driver can initiate an IO request and resume the device. Once the driver acknowledges this <code>powerStateWillChangeTo</code> notification, the device may not be able to raise its power state until the system wakes. Attempting an IO request from other PM root <code>powerStateWillChangeTo</code> and <code>powerStateDidChangeTo</code> notifications may result in a deadlock waiting for a power state change. + + <h3>Comparison to IOUSBFamily</h3> + + Developers already familiar with IOUSBFamily can take advantage of new capabilities in IOUSBHostFamily that can simplify driver development and maintenace. + + <h4>Workloops</h4> + + IOUSBFamily provided a workloop for each controller, and all downstream devices shared that workloop. By contrast, each AppleUSBHostPort creates a workloop dedicated for its attached device, which significantly reduces lock contention and improves responsiveness for drivers attached to IOUSBHostDevice or IOUSBHostInterface services. Because the workloop is not shared across many unrelated services, driver developers are discouraged from creating an additional workloop. + + <h4>Synchronous IO from completion callbacks</h4> + + IOUSBFamily did not permit synchronous IO to be executed from a completion callback, but this restriction has been removed in IOUSBHostFamily. Driver developers can now issue a sequence of synchronous commands in a completion routine without chaining thread calls or using complex state machines. + + <h4>IO bookkeeping</h4> + + IOUSBHostFamily now tracks all outstanding IOs for an endpoint, and offers more predictable behavior when aborting transfers or terminating services. In most cases, driver developers no longer need to track the number of outstanding IOs, and can terminate their services with more determinism. + + <h3>Driver Recommendations</h3> + + <ul> + <li>Do not create a separate workloop</li> + <li>If joining the power plane, reside in a <code>kIOPMLowPower</code> state to enable idle suspend</li> + <li>If supporting pausing IO, only enable an idle policy on bulk or interrupt IN endpoints</li> + <li>If interested in system power state changes, call <code>registerInterestedDriver</code> on the PM root</li> + </ul> +*/ + +#ifndef IOUSBHostFamily_IOUSBHostFamily_h +#define IOUSBHostFamily_IOUSBHostFamily_h + +#include <IOKit/usb/StandardUSB.h> +#include <IOKit/usb/IOUSBHostFamilyDefinitions.h> + +#ifndef __IOUSBHOSTFAMILY_DEPRECATED +#define __IOUSBHOSTFAMILY_DEPRECATED +#endif + +#pragma mark Typedefs + +typedef uint16_t tUSBHostDeviceAddress; + +#pragma mark General enumerations + +#ifdef __cplusplus +using namespace StandardUSB; +#endif + +enum tEndpointDirection +{ + kEndpointDirectionOut = (kEndpointDescriptorDirectionOut >> kEndpointDescriptorDirectionPhase), + kEndpointDirectionIn = (kEndpointDescriptorDirectionIn >> kEndpointDescriptorDirectionPhase), + kEndpointDirectionUnknown = 2 +}; + +typedef enum tEndpointDirection tEndpointDirection; + +enum tEndpointType +{ + kEndpointTypeControl = (kEndpointDescriptorTransferTypeControl >> kEndpointDescriptorTransferTypePhase), + kEndpointTypeIsochronous = (kEndpointDescriptorTransferTypeIsochronous >> kEndpointDescriptorTransferTypePhase), + kEndpointTypeBulk = (kEndpointDescriptorTransferTypeBulk >> kEndpointDescriptorTransferTypePhase), + kEndpointTypeInterrupt = (kEndpointDescriptorTransferTypeInterrupt >> kEndpointDescriptorTransferTypePhase) +}; + +typedef enum tEndpointType tEndpointType; + +enum tDeviceRequestDirection +{ + kRequestDirectionOut = (kDeviceRequestDirectionOut >> kDeviceRequestDirectionPhase), + kRequestDirectionIn = (kDeviceRequestDirectionIn >> kDeviceRequestDirectionPhase) +}; + +typedef enum tDeviceRequestDirection tDeviceRequestDirection; + +enum tDeviceRequestType +{ + kRequestTypeStandard = (kDeviceRequestTypeStandard >> kDeviceRequestTypePhase), + kRequestTypeClass = (kDeviceRequestTypeClass >> kDeviceRequestTypePhase), + kRequestTypeVendor = (kDeviceRequestTypeVendor >> kDeviceRequestTypePhase) +}; + +typedef enum tDeviceRequestType tDeviceRequestType; + +enum tDeviceRequestRecipient +{ + kRequestRecipientDevice = (kDeviceRequestRecipientDevice >> kDeviceRequestRecipientPhase), + kRequestRecipientInterface = (kDeviceRequestRecipientInterface >> kDeviceRequestRecipientPhase), + kRequestRecipientEndpoint = (kDeviceRequestRecipientEndpoint >> kDeviceRequestRecipientPhase), + kRequestRecipientOther = (kDeviceRequestRecipientOther >> kDeviceRequestRecipientPhase) +}; + +typedef enum tDeviceRequestRecipient tDeviceRequestRecipient; + +inline uint8_t makeDeviceRequestbmRequestType(tDeviceRequestDirection direction, tDeviceRequestType type, tDeviceRequestRecipient recipient) +{ + return ((direction << kDeviceRequestDirectionPhase) & kDeviceRequestDirectionMask) + | ((type << kDeviceRequestTypePhase) & kDeviceRequestTypeMask) + | ((recipient << kDeviceRequestRecipientPhase) & kDeviceRequestRecipientMask); +} + +enum +{ + kUSBHostVendorSpecificClass = 255, + kUSBHostHubClass = 9, + kUSBHostMaxDevices = 128, // The largest number of devices permitted on USB 2.0 buses + kUSBHostMaxPipes = 32, // The largest number of endpoints permitted on USB devices + kUSBHostMaxCountFullSpeedIsochronous = 1023, // max size (bytes) of any one Isoc frame for 1 FS endpoint + kUSBHostVendorIDAppleComputer = 0x05AC +}; + +/*! + * @enum tInternalUSBHostConnectionSpeed + * @brief Connection speeds used internally by IOUSBHostFamily + */ +enum tInternalUSBHostConnectionSpeed +{ + kUSBHostConnectionSpeedLow = 0, + kUSBHostConnectionSpeedFull = 1, + kUSBHostConnectionSpeedHigh = 2, + kUSBHostConnectionSpeedSuper = 3, + kUSBHostConnectionSpeedSuperPlus = 4, + kUSBHostConnectionSpeedSuperPlusBy2 = 5, + kUSBHostConnectionSpeedCount = 6 +}; + + +/*! + @definedblock IOUSBHostFamily message codes + @discussion Messages passed between USB services using the <code>IOService::message</code> API. + */ +#define kUSBHostMessageUpdateIdlePolicy iokit_usbhost_msg(0x100) // 0xe0005100 Apple Internal use only. IOUSBHostInterface -> IOUSBHostDevice to update its idle policy. +#define kUSBHostMessageRemoteWake iokit_usbhost_msg(0x101) // 0xe0005101 Apple Internal use only. AppleUSBHostController -> AppleUSBHostPort -> IOUSBHostDevice upon a remote wake event. Argument is locationID of remote wake. +#define kUSBHostMessageDeviceSuspend iokit_usbhost_msg(0x102) // 0xe0005102 Apple Internal use only. IOUSBHostDevice -> clients upon a suspend event. +#define kUSBHostMessageDeviceResume iokit_usbhost_msg(0x103) // 0xe0005103 Apple Internal use only. IOUSBHostDevice -> clients upon a resume event. +#define kUSBHostMessagePortsCreated iokit_usbhost_msg(0x104) // 0xe0005104 Apple Internal use only. AppleUSBHostController and AppleUSBHub -> clients after all ports have been created. +#define kUSBHostMessageDeviceConnected iokit_usbhost_msg(0x105) // 0xe0005105 Apple Internal use only. AppleUSBRemovablePort -> clients after a connect. +#define kUSBHostMessageDeviceDisconnected iokit_usbhost_msg(0x106) // 0xe0005106 Apple Internal use only. AppleUSBRemovablePort -> clients after a disconnect. +#define kUSBHostMessageControllerPoweredOn iokit_usbhost_msg(0x107) // 0xe0005107 Apple Internal use only. AppleEmbeddedUSBXHCIFL1100 -> FL1100Boot after a stable power state is reached. +#define kUSBHostMessageNonInterruptIsochFrame iokit_usbhost_msg(0x108) // 0xe0005108 Apple Internal use only. +#define kUSBHostMessageInterfaceAlternateSetting iokit_usbhost_msg(0x109) // 0xe0005109 Apple Internal use only. IOUSBHostInterface -> IOUSBInterface to update interface properties after an alternate setting is selected +#define kUSBHostMessageDeviceLegacyCapture iokit_usbhost_msg(0x10A) // 0xe000510A Apple Internal use only. IOUSBHostDevice -> IOUSBDevice to relay user space re-enumeration for capturing/releasing devices + +// User Message Support + +#define kUSBLegacyMessagePortHasBeenSuspended iokit_usblegacy_err_msg(0x0d) // 0xe000400d Apple Internal use only. Message sent by an IOUSBDevice indicating the completion of a power change on the compatibility service +#define kUSBLegacyMessagePortHasBeenResumed iokit_usblegacy_err_msg(0x0b) // 0xe000400b Apple Internal use only. Message sent by an IOUSBDevice indicating the completion of a power change on the compatibility service +#define kUSBHostMessageOvercurrentCondition iokit_usblegacy_err_msg(0x13) // 0xe0004013 Apple Internal use only. Message sent to the clients of the device's hub parent, when a device causes an overcurrent condition. The message argument contains the locationID of the device +#define kUSBHostMessageNotEnoughPower iokit_usblegacy_err_msg(0x14) // 0xe0004014 Apple Internal use only. Message sent to the clients of the device's hub parent, when a device causes an low power notice to be displayed. The message argument contains the locationID of the device +#define kUSBHostMessageEndpointCountExceeded iokit_usblegacy_err_msg(0x19) // 0xe0004019 Apple Internal use only. Message sent to a device when endpoints cannot be created because the USB controller ran out of resources +#define kUSBHostMessageDeviceCountExceeded iokit_usblegacy_err_msg(0x1a) // 0xe000401a Apple Internal use only. Message sent by a hub when a device cannot be enumerated because the USB controller ran out of resources +#define kUSBHostMessageUnsupportedConfiguration iokit_usblegacy_err_msg(0x1c) // 0xe000401c Apple Internal use only. Message sent to the clients of the device when a device is not supported in the current configuration. The message argument contains the locationID of the device +#define kUSBHostMessageHubCountExceeded iokit_usblegacy_err_msg(0x1d) // 0xe000401d Apple Internal use only. Message sent when a 6th hub was plugged in and was not enumerated, as the USB spec only support 5 hubs in a chain +#define kUSBHostMessageTDMLowBattery iokit_usblegacy_err_msg(0x1e) // 0xe000401e Apple Internal use only. Message sent when when an attached TDM system battery is running low. +/*! @/definedblock */ + + +/*! + * @brief Port types returned by IOUSBHostDevice::getPortStatus + * + * @constant kUSBHostPortTypeStandard A general-purpose USB port. + * @constant kUSBHostPortTypeCaptive The attached device cannot be physically disconnected from the port. + * @constant kUSBHostPortTypeInternal The attached device cannot be physically disconnected from the host machine. + * @constant kUSBHostPortTypeAccessory The attached device may require authentication before function drivers can access it. + * @constant kUSBHostPortTypeCount The number of entries in this enum. + */ +enum tUSBHostPortType +{ + kUSBHostPortTypeStandard = kIOUSBHostPortTypeStandard, + kUSBHostPortTypeCaptive = kIOUSBHostPortTypeCaptive, + kUSBHostPortTypeInternal = kIOUSBHostPortTypeInternal, + kUSBHostPortTypeAccessory = kIOUSBHostPortTypeAccessory, + kUSBHostPortTypeExpressCard = kIOUSBHostPortTypeExpressCard, + kUSBHostPortTypeCount = kIOUSBHostPortTypeCount +}; + +/*! + * @brief Connection speeds returned by IOUSBHostDevice::getPortStatus + * @discussion This enumeration matches the default speed ID mappings defined in XHCI 1.0 Table 147. + * + * @constant kUSBHostPortConnectionSpeedNone No device is connected + * @constant kUSBHostPortConnectionSpeedFull A full-speed (12 Mb/s) device is connected + * @constant kUSBHostPortConnectionSpeedLow A low-speed (1.5 Mb/s) device is connected + * @constant kUSBHostPortConnectionSpeedHigh A high-speed (480 Mb/s) device is connected) + * @constant kUSBHostPortConnectionSpeedSuper A superspeed (5 Gb/s) device is connected) + * @constant kUSBHostPortConnectionSpeedSuperPlus A superspeed (10 Gb/s) device is connected) + * @constant kUSBHostPortConnectionSpeedUSB3Gen2By2 A superspeed (20 Gb/s) device is connected) + */ +enum tUSBHostConnectionSpeed +{ + kUSBHostPortConnectionSpeedNone = kIOUSBHostConnectionSpeedNone, + kUSBHostPortConnectionSpeedFull = kIOUSBHostConnectionSpeedFull, + kUSBHostPortConnectionSpeedLow = kIOUSBHostConnectionSpeedLow, + kUSBHostPortConnectionSpeedHigh = kIOUSBHostConnectionSpeedHigh, + kUSBHostPortConnectionSpeedSuper = kIOUSBHostConnectionSpeedSuper, + kUSBHostPortConnectionSpeedSuperPlus = kIOUSBHostConnectionSpeedSuperPlus, + kUSBHostPortConnectionSpeedSuperPlusBy2 = kIOUSBHostConnectionSpeedSuperPlusBy2, + kUSBHostPortConnectionSpeedCount = kIOUSBHostConnectionSpeedCount +}; + +/*! + * @enum tOpenOptions + * @brief Option bits used when calling ::open on IOUSBHostFamily services + */ +enum +{ + kUSBHostOpenOptionSelectAlternateSetting = StandardUSBBit(16), // IOUSBHostInterface + kUSBHostOpenOptionUserClientSession = StandardUSBBit(17) // IOUSBHostDevice: Reserved for AppleUSBHostUserClient objects +}; + +/*! + * @brief Values returned by IOUSBHostDevice::getPortStatus + * + * @constant kUSBHostPortStatusPortTypeMask The mask for bits representing the port type. + * @constant kUSBHostPortStatusPortTypeStandard A general-purpose USB port. + * @constant kUSBHostPortStatusPortTypeCaptive The attached device cannot be physically disconnected from the port. + * @constant kUSBHostPortStatusPortTypeInternal The attached device cannot be physically disconnected from the host machine. + * @constant kUSBHostPortStatusPortTypeAccessory The attached device may require authentication before function drivers can access it. + * @constant kUSBHostPortStatusConnectedSpeedMask The mask for bits representing the connection state. + * @constant kUSBHostPortStatusConnectedSpeedNone The port does not have a connected device. + * @constant kUSBHostPortStatusConnectedSpeedFull The port has a full-speed device connected. + * @constant kUSBHostPortStatusConnectedSpeedLow The port has a low-speed device connected. + * @constant kUSBHostPortStatusConnectedSpeedHigh The port has a high-speed device connected. + * @constant kUSBHostPortStatusConnectedSpeedSuper The port has a superspeed device connected. + * @constant kUSBHostPortStatusResetting The port is currently resetting the link. + * @constant kUSBHostPortStatusEnabled The port is enabled and packets are permitted to reach the device. Not valid unless kUSBHostPortStatusConnectedSpeedMask is nonzero. + * @constant kUSBHostPortStatusSuspended The port is suspended. Not valid unless kUSBHostPortStatusConnectedSpeedMask is nonzero. + * @constant kUSBHostPortStatusOvercurrent The port is in the overcurrent condition. + * @constant kUSBHostPortStatusTestMode The port is in test mode. + */ +enum tUSBHostPortStatus +{ + kUSBHostPortStatusPortTypeMask = kIOUSBHostPortStatusPortTypeMask, + kUSBHostPortStatusPortTypePhase = kIOUSBHostPortStatusPortTypePhase, + kUSBHostPortStatusPortTypeStandard = kIOUSBHostPortStatusPortTypeStandard, + kUSBHostPortStatusPortTypeCaptive = kIOUSBHostPortStatusPortTypeCaptive, + kUSBHostPortStatusPortTypeInternal = kIOUSBHostPortStatusPortTypeInternal, + kUSBHostPortStatusPortTypeAccessory = kIOUSBHostPortStatusPortTypeAccessory, + kUSBHostPortStatusPortTypeReserved = kIOUSBHostPortStatusPortTypeReserved, + kUSBHostPortStatusConnectedSpeedMask = kIOUSBHostPortStatusConnectedSpeedMask, + kUSBHostPortStatusConnectedSpeedPhase = kIOUSBHostPortStatusConnectedSpeedPhase, + kUSBHostPortStatusConnectedSpeedNone = kIOUSBHostPortStatusConnectedSpeedNone, + kUSBHostPortStatusConnectedSpeedFull = kIOUSBHostPortStatusConnectedSpeedFull, + kUSBHostPortStatusConnectedSpeedLow = kIOUSBHostPortStatusConnectedSpeedLow, + kUSBHostPortStatusConnectedSpeedHigh = kIOUSBHostPortStatusConnectedSpeedHigh, + kUSBHostPortStatusConnectedSpeedSuper = kIOUSBHostPortStatusConnectedSpeedSuper, + kUSBHostPortStatusConnectedSpeedSuperPlus = kIOUSBHostPortStatusConnectedSpeedSuperPlus, + kUSBHostPortStatusConnectedSpeedSuperPlusBy2 = kIOUSBHostPortStatusConnectedSpeedSuperPlusBy2, + kUSBHostPortStatusResetting = kIOUSBHostPortStatusResetting, + kUSBHostPortStatusEnabled = kIOUSBHostPortStatusEnabled, + kUSBHostPortStatusSuspended = kIOUSBHostPortStatusSuspended, + kUSBHostPortStatusOvercurrent = kIOUSBHostPortStatusOvercurrent, + kUSBHostPortStatusTestMode = kIOUSBHostPortStatusTestMode +}; + +/*! + @enum tUSBHostDefaultControlRequestTimeout + @brief Default control request timeout values in milliseconds + */ +enum +{ +#if USB_COMPLIANCE_MODE + kUSBHostSetAddressTimeout = 50, // USB 2.0 9.2.6.3 + kUSBHostStandardRequestNoDataTimeout = 500, // USB 2.0 9.2.6.4 + kUSBHostStandardRequestCompletionTimeout = 5000, // USB 2.0 9.2.6.4 + kUSBHostStandardRequestSimpleCompletionTimeout = 50, // USB 2.0 9.2.6.4 Standard request with no data stage + kUSBHostClassRequestNoDataTimeout = 500, // USB 2.0 9.2.6.5 + kUSBHostClassRequestCompletionTimeout = 5000, // USB 2.0 9.2.6.5 + kUSBHostVendorRequestNoDataTimeout = 0, + kUSBHostVendorRequestCompletionTimeout = 5000, +#else + // More tolerant timeout values for noncompliant devices + kUSBHostSetAddressTimeout = 1000, + kUSBHostStandardRequestNoDataTimeout = 0, + kUSBHostStandardRequestCompletionTimeout = 5000, + kUSBHostStandardRequestSimpleCompletionTimeout = 1000, + kUSBHostClassRequestNoDataTimeout = 0, + kUSBHostClassRequestCompletionTimeout = 5000, + kUSBHostVendorRequestNoDataTimeout = 0, + kUSBHostVendorRequestCompletionTimeout = 5000, +#endif + kUSBHostDefaultControlNoDataTimeoutMS = 0, + kUSBHostDefaultControlCompletionTimeoutMS = 5000 +}; + +#pragma mark APCI enumerations + +// ACPI 5.0a Table 9-227: UPC Return Package Values +typedef enum +{ + kUSBHostPortNotConnectable = 0, // Port is not connectable + kUSBHostPortConnectable = 1 // Port is connectable either user visible or invisible +} tUSBHostPortConnectable; + +// ACPI 5.0a Table 9-227: UPC Return Package Values +typedef enum +{ + kUSBHostConnectorTypeA = 0x00, + kUSBHostConnectorTypeMiniAB = 0x01, + kUSBHostConnectorTypeExpressCard = 0x02, + kUSBHostConnectorTypeUSB3A = 0x03, + kUSBHostConnectorTypeUSB3B = 0x04, + kUSBHostConnectorTypeUSB3MicroB = 0x05, + kUSBHostConnectorTypeUSB3MicroAB = 0x06, + kUSBHostConnectorTypeUSB3PowerB = 0x07, + kUSBHostConnectorTypeUSBTypeC = 0x09, + kUSBHostConnectorTypeUnknown = 0xFE, + kUSBHostConnectorTypeProprietary = 0xFF +} tUSBHostConnectorType; + +/*! + * @enum tUSBHostPowerSourceType + * @brief Power sources used internally by IOUSBHostFamily + * @constant kUSBHostPowerSourceTypeStaticPool The power source is a statically allocated pool for software to manage. + * @constant kUSBHostPowerSourceTypeSMC The power source is managed by the SMC. + * @constant kUSBHostPowerSourceTypeHardware The power source is guaranteed by the hardware and can always allocate the port current limit. + */ +typedef enum +{ + kUSBHostPowerSourceTypeStaticPool = 0, + kUSBHostPowerSourceTypeSMC, + kUSBHostPowerSourceTypeHardware +}tUSBHostPowerSourceType; + +#if TARGET_CPU_X86 || TARGET_CPU_X86_64 + +#ifndef kACPIDevicePathKey +#define kACPIDevicePathKey "acpi-path" +#endif + +#ifndef kACPIInterruptTypeValid +#define kACPIInterruptTypeValid (1 << 1) +#endif + +// ACPI methods +#define kUSBHostACPIPropertyXHCICompanion "XHCN" // The number of the companion XHCI controller, used for multiplexed ports +#define kUSBHostACPIPropertyMultiplexor "MUXS" // The ACPI method name for the port multiplexor + +// _UPC +// _EJD + +#define kSDControllerGPIOResetACPIMethod "SRST" +#define kSDControllerGPIOPowerACPIMethod "SPWR" +#define kSDPortConnectionBehaviorACPIMethod "SBHV" +#define kSDControllerGPIOResetPropertyKey "GPIO_RESET" +#define kSDControllerCaptiveUSB3ReaderKey "U3SD" +#define kGetBehaviorACPIMethod "GBHV" +#define kGPEACPIString "_GPE" +#define kRDYForGPIOTest "RDYG" +#define kReconfiguredCount "RCFG" +#define kUSBPlatformProperties "USBX" +#define kUSBTypeCCableDetectACPIMethod "MODU" +#define kUSBTypeCCableDetectACPIMethodSupported "RTPC" +#define kGPEOCACPIString "GPOC" +#define kACPIPortTimingOverride "TMG" + +// connection types returned by MODU method +typedef enum +{ + kUSBTypeCCableTypeNone = 0, + kUSBTypeCCableTypeUSB = 1, +} tUSBCTypeCableType; + +#endif + +typedef enum +{ + kLinkStateU0 = 0, // USB3 Link State U0 (On) + kLinkStateU1 = 1, // USB3 Link State U1 (Standby, fast exit) + kLinkStateU2 = 2, // USB3 Link State U2 (Standby, slower exit) + kLinkStateU3 = 3, // USB3 Link State U3 (Suspend) + + kLinkStateL0 = 0, // USB2 Link State L0 (On) + kLinkStateL1 = 1, // USB2 Link State L1 (Sleep) + kLinkStateL2 = 2, // USB2 Link State L2 (Suspend) + kLinkStateL3 = 3, // USB2 Link State L3 (Off) + +} tUSBLinkState; + +typedef enum +{ + kDescriptorExitLatency, // Descriptor Exit Latencies (DEL). + kDeviceExitLatency, // Device Initiated Exit Latencies (PEL) + kSystemExitLatency, // System Exit Latency (SEL) + kMaxExitLatency, // Max Exit Latency (MEL) + + // USB2 LPM specific latencies + kBestEffortServiceLatency, // Best Effort Service Latency + kBestEffortServiceLatencyDeep, // Best Effort Service Latency Deep + kDefaultBestEffortServiceLatency, // Default Best Effort Service Latency + kDefaultBestEffortServiceLatencyDeep, // Default Best Effort Service Latency Deep + kMaxL1BaseExitLatency, // Max Exit Latency for L1 while using BESL base value + kMaxL1DeepExitLatency, // Max Exit Latency for L1 while using BESL Deep + +} tUSBLPMExitLatency; + +enum +{ + kUSB3LPMMaxU1SEL = 0xFF, + kUSB3LPMMaxU1PEL = 0xFF, + + kUSB3LPMMaxU2SEL = 0xFFFF, + kUSB3LPMMaxU2PEL = 0xFFFF, + + kUSB3LPMMaxU1Timeout = 0x7F, + kUSB3LPMU1Disabled = 0, + kUSB3LPMU1AcceptOnly = 0xFF, + + kUSB3LPMMaxU2Timeout = 0xFE00, // In Micro Seconds + kUSB3LPMU2Disabled = 0, // In Micro Seconds + kUSB3LPMU2AcceptOnly = 0xFF00, // In Micro Seconds + + kUSB3LPMMaxT3SEL = 100, // SEL:T3 value as per USB 3.0 Section C.1.5.1 in Nano Seconds + kUSB3LPMMaxHostSchDelay = 1000, // Maximum Host Scheduling Delay for Max Exit Latency Calculations + + kUSB3LPMExtraDeviceEL = 4000, // An additional delay(buffer) in Nano Seconds added to Exit Latency reported by the device in its BOS descriptor + + kUSB2LPMMaxL1Timeout = 0xFF00, // In Micro seconds +}; + +typedef enum +{ + kUSBDeviceLPMStatusDefault = 0, + kUSBDeviceLPMStatusDisabled = 1, + kUSBDeviceLPMStatusEnabled = 2 + +} tUSBDeviceLPMStatus; + +#endif diff --git a/QualcommWireless/include/IOKit/usb/IOUSBHostFamilyDefinitions.h b/QualcommWireless/include/IOKit/usb/IOUSBHostFamilyDefinitions.h new file mode 100644 index 0000000..f552863 --- /dev/null +++ b/QualcommWireless/include/IOKit/usb/IOUSBHostFamilyDefinitions.h @@ -0,0 +1,302 @@ +/* + * Copyright (c) 1998-2016 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +/*! + @header IOUSBHostFamilyDefinitions.h + @brief Definitions used for the IOUSBHostFamily + !*/ + +#ifndef IOUSBHostFamily_IOUSBHostFamilyDefinitions_h +#define IOUSBHostFamily_IOUSBHostFamilyDefinitions_h + +#include <TargetConditionals.h> +#if TARGET_OS_DRIVERKIT +#include <stdint.h> +#include <stddef.h> +#include <sys/_types/_uuid_t.h> +#include <DriverKit/IOTypes.h> +#include <DriverKit/IOLib.h> +#else +#include <IOKit/IOTypes.h> +#include <libkern/OSByteOrder.h> +#endif + +#define IOUSBHostFamilyBit(bit) ((uint32_t)(1) << bit) +#define IOUSBHostFamilyBitRange(start, end) (~(((uint32_t)(1) << start) - 1) & (((uint32_t)(1) << end) | (((uint32_t)(1) << end) - 1))) +#define IOUSBHostFamilyBitRange64(start, end) (~(((uint64_t)(1) << start) - 1) & (((uint64_t)(1) << end) | (((uint64_t)(1) << end) - 1))) +#define IOUSBHostFamilyBitRangePhase(start, end) (start) + +#define iokit_usb_codemask IOUSBHostFamilyBitRange(0, 11) +#define iokit_usbhost_group (1 << IOUSBHostFamilyBitRangePhase(12, 13)) +#define iokit_usblegacy_group (0 << IOUSBHostFamilyBitRangePhase(12, 13)) +#define iokit_usbhost_err(message) ((IOReturn)(iokit_family_err(sub_iokit_usb, iokit_usbhost_group | (message & iokit_usb_codemask)))) +#define iokit_usbhost_msg(message) ((uint32_t)(iokit_family_msg(sub_iokit_usb, iokit_usbhost_group | (message & iokit_usb_codemask)))) +#define iokit_usblegacy_err_msg(message) ((uint32_t)(sys_iokit | sub_iokit_usb | message)) + +/*! + @definedblock IOUSBHostFamily message codes + @discussion Messages passed between USB services using the <code>IOService::message</code> API. + */ +#define kUSBHostMessageConfigurationSet iokit_usbhost_msg(0x00) // 0xe0005000 IOUSBHostDevice -> clients upon a setConfiguration call. +#define kUSBHostMessageRenegotiateCurrent iokit_usbhost_msg(0x01) // 0xe0005001 Request clients to renegotiate bus current allocations + +#define kUSBHostReturnPipeStalled iokit_usbhost_err(0x0) // 0xe0005000 Pipe has issued a STALL handshake. Use clearStall to clear this condition. +#define kUSBHostReturnNoPower iokit_usbhost_err(0x1) // 0xe0005001 A setConfiguration call was not able to succeed because all configurations require more power than is available. + +/*! + * @enum tIOUSBHostConnectionSpeed + * @brief Connection speeds reported in kUSBHostMatchingPropertySpeed + * @discussion This enumeration matches the default speed ID mappings defined in XHCI 1.0 Table 147. + * @constant kIOUSBHostConnectionSpeedNone No device is connected + * @constant kIOUSBHostConnectionSpeedFull A full-speed (12 Mb/s) device is connected + * @constant kIOUSBHostConnectionSpeedLow A low-speed (1.5 Mb/s) device is connected + * @constant kIOUSBHostConnectionSpeedHigh A high-speed (480 Mb/s) device is connected) + * @constant kIOUSBHostConnectionSpeedSuper A superspeed (5 Gb/s) device is connected) + * @constant kIOUSBHostConnectionSpeedSuperPlus A superspeed (10 Gb/s) device is connected) + * @constant kIOUSBHostConnectionSpeedSuperPlusBy2 A superspeed (20 Gb/s) device is connected) + */ +enum tIOUSBHostConnectionSpeed +{ + kIOUSBHostConnectionSpeedNone = 0, + kIOUSBHostConnectionSpeedFull = 1, + kIOUSBHostConnectionSpeedLow = 2, + kIOUSBHostConnectionSpeedHigh = 3, + kIOUSBHostConnectionSpeedSuper = 4, + kIOUSBHostConnectionSpeedSuperPlus = 5, + kIOUSBHostConnectionSpeedSuperPlusBy2 = 6, + kIOUSBHostConnectionSpeedCount = 7 +}; + +/*! + * @brief Port types returned by IOUSBHostDevice::getPortStatus and kUSBHostPortPropertyStatus + * + * @constant kIOUSBHostPortTypeStandard A general-purpose USB port. + * @constant kIOUSBHostPortTypeCaptive The attached device cannot be physically disconnected from the port. + * @constant kIOUSBHostPortTypeInternal The attached device cannot be physically disconnected from the host machine. + * @constant kIOUSBHostPortTypeAccessory The attached device may require authentication before function drivers can access it. + * @constant kIOUSBHostPortTypeCount The number of entries in this enum. + */ +enum tIOUSBHostPortType +{ + kIOUSBHostPortTypeStandard = 0, + kIOUSBHostPortTypeCaptive, + kIOUSBHostPortTypeInternal, + kIOUSBHostPortTypeAccessory, + kIOUSBHostPortTypeExpressCard, + kIOUSBHostPortTypeCount +}; + +/*! + * @brief Values returned by IOUSBHostDevice::getPortStatus and kUSBHostPortPropertyStatus + * + * @constant kIOUSBHostPortStatusPortTypeMask The mask for bits representing the port type. + * @constant kIOUSBHostPortStatusPortTypeStandard A general-purpose USB port. + * @constant kIOUSBHostPortStatusPortTypeCaptive The attached device cannot be physically disconnected from the port. + * @constant kIOUSBHostPortStatusPortTypeInternal The attached device cannot be physically disconnected from the host machine. + * @constant kIOUSBHostPortStatusPortTypeAccessory The attached device may require authentication before function drivers can access it. + * @constant kIOUSBHostPortStatusConnectedSpeedMask The mask for bits representing the connection state. + * @constant kIOUSBHostPortStatusConnectedSpeedNone The port does not have a connected device. + * @constant kIOUSBHostPortStatusConnectedSpeedFull The port has a full-speed device connected. + * @constant kIOUSBHostPortStatusConnectedSpeedLow The port has a low-speed device connected. + * @constant kIOUSBHostPortStatusConnectedSpeedHigh The port has a high-speed device connected. + * @constant kIOUSBHostPortStatusConnectedSpeedSuper The port has a superspeed device connected. + * @constant kIOUSBHostPortStatusResetting The port is currently resetting the link. + * @constant kIOUSBHostPortStatusEnabled The port is enabled and packets are permitted to reach the device. Not valid unless kIOUSBHostPortStatusConnectedSpeedMask is nonzero. + * @constant kIOUSBHostPortStatusSuspended The port is suspended. Not valid unless kIOUSBHostPortStatusConnectedSpeedMask is nonzero. + * @constant kIOUSBHostPortStatusOvercurrent The port is in the overcurrent condition. + * @constant kIOUSBHostPortStatusTestMode The port is in test mode. + */ +enum tIOUSBHostPortStatus +{ + kIOUSBHostPortStatusPortTypeMask = IOUSBHostFamilyBitRange(0, 3), + kIOUSBHostPortStatusPortTypePhase = IOUSBHostFamilyBitRangePhase(0, 3), + kIOUSBHostPortStatusPortTypeStandard = (kIOUSBHostPortTypeStandard << IOUSBHostFamilyBitRangePhase(0, 3)), + kIOUSBHostPortStatusPortTypeCaptive = (kIOUSBHostPortTypeCaptive << IOUSBHostFamilyBitRangePhase(0, 3)), + kIOUSBHostPortStatusPortTypeInternal = (kIOUSBHostPortTypeInternal << IOUSBHostFamilyBitRangePhase(0, 3)), + kIOUSBHostPortStatusPortTypeAccessory = (kIOUSBHostPortTypeAccessory << IOUSBHostFamilyBitRangePhase(0, 3)), + kIOUSBHostPortStatusPortTypeReserved = IOUSBHostFamilyBitRange(4, 7), + kIOUSBHostPortStatusConnectedSpeedMask = IOUSBHostFamilyBitRange(8, 10), + kIOUSBHostPortStatusConnectedSpeedPhase = IOUSBHostFamilyBitRangePhase(8, 10), + kIOUSBHostPortStatusConnectedSpeedNone = (kIOUSBHostConnectionSpeedNone << IOUSBHostFamilyBitRangePhase(8, 10)), + kIOUSBHostPortStatusConnectedSpeedFull = (kIOUSBHostConnectionSpeedFull << IOUSBHostFamilyBitRangePhase(8, 10)), + kIOUSBHostPortStatusConnectedSpeedLow = (kIOUSBHostConnectionSpeedLow << IOUSBHostFamilyBitRangePhase(8, 10)), + kIOUSBHostPortStatusConnectedSpeedHigh = (kIOUSBHostConnectionSpeedHigh << IOUSBHostFamilyBitRangePhase(8, 10)), + kIOUSBHostPortStatusConnectedSpeedSuper = (kIOUSBHostConnectionSpeedSuper << IOUSBHostFamilyBitRangePhase(8, 10)), + kIOUSBHostPortStatusConnectedSpeedSuperPlus = (kIOUSBHostConnectionSpeedSuperPlus << IOUSBHostFamilyBitRangePhase(8, 10)), + kIOUSBHostPortStatusConnectedSpeedSuperPlusBy2 = (kIOUSBHostConnectionSpeedSuperPlusBy2 << IOUSBHostFamilyBitRangePhase(8, 10)), + kIOUSBHostPortStatusResetting = IOUSBHostFamilyBit(11), + kIOUSBHostPortStatusEnabled = IOUSBHostFamilyBit(12), + kIOUSBHostPortStatusSuspended = IOUSBHostFamilyBit(13), + kIOUSBHostPortStatusOvercurrent = IOUSBHostFamilyBit(14), + kIOUSBHostPortStatusTestMode = IOUSBHostFamilyBit(15) +}; + +#pragma mark Registry property names + +#define kUSBHostMatchingPropertySpeed "USBSpeed" +#define kUSBHostMatchingPropertyPortType "USBPortType" + +#define kUSBHostMatchingPropertyVendorID "idVendor" +#define kUSBHostMatchingPropertyProductID "idProduct" +#define kUSBHostMatchingPropertyProductIDMask "idProductMask" +#define kUSBHostMatchingPropertyProductIDArray "idProductArray" +#define kUSBHostMatchingPropertyDeviceClass "bDeviceClass" +#define kUSBHostMatchingPropertyDeviceSubClass "bDeviceSubClass" +#define kUSBHostMatchingPropertyDeviceProtocol "bDeviceProtocol" +#define kUSBHostMatchingPropertyDeviceReleaseNumber "bcdDevice" +#define kUSBHostMatchingPropertyConfigurationValue "bConfigurationValue" +#define kUSBHostMatchingPropertyInterfaceClass "bInterfaceClass" +#define kUSBHostMatchingPropertyInterfaceSubClass "bInterfaceSubClass" +#define kUSBHostMatchingPropertyInterfaceProtocol "bInterfaceProtocol" +#define kUSBHostMatchingPropertyInterfaceNumber "bInterfaceNumber" + +#define kUSBHostPropertyLocationID "locationID" +#define kUSBHostPropertyDebugOptions "kUSBDebugOptions" +#define kUSBHostPropertyWakePowerSupply "kUSBWakePowerSupply" +#define kUSBHostPropertySleepPowerSupply "kUSBSleepPowerSupply" +#define kUSBHostPropertyWakePortCurrentLimit "kUSBWakePortCurrentLimit" +#define kUSBHostPropertySleepPortCurrentLimit "kUSBSleepPortCurrentLimit" +#define kUSBHostPropertyFailedRemoteWake "kUSBFailedRemoteWake" +#define kUSBHostPropertyBusCurrentPoolID "UsbBusCurrentPoolID" +#define kUSBHostPropertySmcBusCurrentPoolID "UsbSmcBusCurrentPoolID" +#define kUSBHostPropertyUserClientEntitlementRequired "UsbUserClientEntitlementRequired" +#define kUSBHostPropertyUserClientEnableReset "kUSBLegacyForceReEnumerate" // TODO: Rename this +#define kUSBHostPropertyUserClientOwningTaskName "UsbUserClientOwningTaskName" +#define kUSBHostPropertyForcePower "UsbForcePower" +#define kUSBHostPropertyForcceLinkSpeed "UsbLinkSpeed" + +#define kUSBHostDevicePropertyVendorString "kUSBVendorString" +#define kUSBHostDevicePropertySerialNumberString "kUSBSerialNumberString" +#define kUSBHostDevicePropertyContainerID "kUSBContainerID" +#define kUSBHostDevicePropertyFailedRequestedPower "kUSBFailedRequestedPower" +#define kUSBHostDevicePropertyResumeRecoveryTime "kUSBResumeRecoveryTime" +#define kUSBHostDevicePropertyPreferredConfiguration "kUSBPreferredConfiguration" +#define kUSBHostDevicePropertyPreferredRecoveryConfiguration "kUSBPreferredRecoveryConfiguration" +#define kUSBHostDevicePropertyCurrentConfiguration "kUSBCurrentConfiguration" +#define kUSBHostDevicePropertyRemoteWakeOverride "kUSBRemoteWakeOverride" +#define kUSBHostDevicePropertyConfigurationDescriptorOverride "kUSBConfigurationDescriptorOverride" +#define kUSBHostDevicePropertyDeviceDescriptorOverride "kUSBDeviceDescriptorOverride" +#define kUSBHostDevicePropertyConfigurationCurrentOverride "kUSBConfigurationCurrentOverride" +#define kUSBHostDevicePropertyResetDurationOverride "kUSBResetDurationOverride" +#define kUSBHostDevicePropertyDesiredChargingCurrent "kUSBDesiredChargingCurrent" +#define kUSBHostDevicePropertyDescriptorOverride "kUSBDescriptorOverride" +#define kUSBHostDescriptorOverrideVendorStringIndex "UsbDescriptorOverrideVendorStringIndex" +#define kUSBHostDescriptorOverrideProductStringIndex "UsbDescriptorOverrideProductStringIndex" +#define kUSBHostDescriptorOverrideSerialNumberStringIndex "UsbDescriptorOverrideSerialNumberStringIndex" +#define kUSBHostDevicePropertyDeviceECID "kUSBDeviceECID" +#define kUSBHostDevicePropertyEnableLPM "kUSBHostDeviceEnableLPM" +#define kUSBHostDevicePropertyDisablePortLPM "kUSBHostDeviceDisablePortLPM" // Disable port initiated LPM for this device + +#define kUSBHostBillboardDevicePropertyNumberOfAlternateModes "bNumberOfAlternateModes" +#define kUSBHostBillboardDevicePropertyPreferredAlternateMode "bPreferredAlternateMode" +#define kUSBHostBillboardDevicePropertyVCONNPower "VCONNPower" +#define kUSBHostBillboardDevicePropertyConfigured "bmConfigured" +#define kUSBHostBillboardDevicePropertyAdditionalFailureInfo "bAdditonalFailureInfo" +#define kUSBHostBillboardDevicePropertyBcdVersion "BcdVersion" +#define kUSBHostBillboardDevicePropertySVID "wSVID" +#define kUSBHostBillboardDevicePropertyAlternateMode "bAlternateMode" +#define kUSBHostBillboardDevicePropertyAlternateModeStringIndex "iAlternateModeString" +#define kUSBHostBillboardDevicePropertyAlternateModeString "AlternateModeString" +#define kUSBHostBillboardDevicePropertyAddtionalInfoURLIndex "iAddtionalInfoURL" +#define kUSBHostBillboardDevicePropertyAddtionalInfoURL "AddtionalInfoURL" +#define kUSBHostBillboardDevicePropertydwAlternateModeVdo "dwAlternateModeVdo" + +#define kUSBHostInterfacePropertyAlternateSetting "bAlternateSetting" + +#define kUSBHostPortPropertyStatus "port-status" +#define kUSBHostPortPropertyOvercurrent "UsbHostPortOvercurrent" +#define kUSBHostPortPropertyPortNumber "port" +#define kUSBHostPortPropertyRemovable "removable" +#define kUSBHostPortPropertyTestMode "kUSBTestMode" +#define kUSBHostPortPropertySimulateInterrupt "kUSBSimulateInterrupt" +#define kUSBHostPortPropertyBusCurrentAllocation "kUSBBusCurrentAllocation" +#define kUSBHostPortPropertyBusCurrentSleepAllocation "kUSBBusCurrentSleepAllocation" +#define kUSBHostPortPropertyConnectable "UsbConnectable" +#define kUSBHostPortPropertyConnectorType "UsbConnector" +#define kUSBHostPortPropertyMux "UsbMux" +#define kUSBHostPortPropertyCompanionIndex "kUSBCompanionIndex" +#define kUSBHostPortPropertyDisconnectInterval "kUSBDisconnectInterval" +#define kUSBHostPortPropertyUsbCPortNumber "UsbCPortNumber" +#define kUSBHostPortPropertyCompanionPortNumber "UsbCompanionPortNumber" // OSData key to set/get the port number of the companion port +#define kUSBHostPortPropertyPowerSource "UsbPowerSource" + +#define kUSBHostHubPropertyPowerSupply "kUSBHubPowerSupply" // OSNumber mA available for downstream ports, 0 for bus-powered +#define kUSBHostHubPropertyIdlePolicy "kUSBHubIdlePolicy" // OSNumber ms to be used as device idle policy +#define kUSBHostHubPropertyStartupDelay "kUSBHubStartupDelay" // OSNumber ms delay before creating downstream ports +#define kUSBHostHubPropertyPortSequenceDelay "kUSBHubPortSequenceDelay" // OSNumber ms delay between port creation +#define kUSBHostHubPropertyHubPowerSupplyType "kUSBHubPowerSupplyType" // OSNumber for tPowerSupply hub is, 2 for bus-powered, 1 for self + +#define kUSBHostControllerPropertyIsochronousRequiresContiguous "kUSBIsochronousRequiresContiguous" +#define kUSBHostControllerPropertySleepSupported "kUSBSleepSupported" +#define kUSBHostControllerPropertyRTD3Supported "UsbRTD3Supported" +#define kUSBHostControllerPropertyMuxEnabled "kUSBMuxEnabled" +#define kUSBHostControllerPropertyCompanion "kUSBCompanion" // OSBoolean false to disable all companion controllers +#define kUSBHostControllerPropertyLowSpeedCompanion "kUSBLowSpeedCompanion" // OSBoolean false to disable low-speed companion controller +#define kUSBHostControllerPropertyFullSpeedCompanion "kUSBFullSpeedCompanion" // OSBoolean false to disable full-speed companion controller +#define kUSBHostControllerPropertyHighSpeedCompanion "kUSBHighSpeedCompanion" // OSBoolean false to disable high-speed companion controller +#define kUSBHostControllerPropertySuperSpeedCompanion "kUSBSuperSpeedCompanion" // OSBoolean false to disable superspeed companion controller +#define kUSBHostControllerPropertyRevision "Revision" // OSData Major/minor revision number of controller +#define kUSBHostControllerPropertyCompanionControllerName "UsbCompanionControllerName" // OSString key to set/get the name of the service, i.e. companion controller dictionary. +#define kUSBHostControllerPropertyDisableUSB3LPM "kUSBHostControllerDisableUSB3LPM" // OSBoolean true to disable USB3 LPM on a given controller +#define kUSBHostControllerPropertyDisableUSB2LPM "kUSBHostControllerDisableUSB2LPM" // OSBoolean true to disable USB2 LPM on a given controller +#define kUSBHostControllerPropertyDisableWakeSources "UsbHostControllerDisableWakeSources" // OSBoolean true to disable connect/disconnect/overcurrent wake sources +#define kUSBHostControllerPropertyPersistFullSpeedIsochronous "UsbHostControllerPersistFullSpeedIsochronous" // OSBoolean true to reduce commands related to full-speed isochronous endpoints + +#define kUSBHostPortPropertyExternalDeviceResetController "kUSBHostPortExternalDeviceResetController" +#define kUSBHostPortPropertyExternalDevicePowerController "kUSBHostPortExternalDevicePowerController" + +#define kUSBHostPortPropertyCardReader "kUSBHostPortPropertyCardReader" +#define kUSBHostPortPropertyCardReaderValidateDescriptors "kUSBHostPortPropertyCardReaderValidateDescriptors" + +#define kUSBHostPortPropertyOffset "kUSBHostPortPropertyOffset" + +#define kIOUSBHostDeviceClassName "IOUSBHostDevice" +#define kIOUSBHostInterfaceClassName "IOUSBHostInterface" + +// for IOUSBLib compatibility +#define kUSBHostDevicePropertyAddress "kUSBAddress" +#define kUSBHostDevicePropertyManufacturerStringIndex "iManufacturer" +#define kUSBHostDevicePropertySerialNumberStringIndex "iSerialNumber" +#define kUSBHostDevicePropertyProductStringIndex "iProduct" +#define kUSBHostDevicePropertyProductString "kUSBProductString" +#define kUSBHostDevicePropertyNumConfigs "bNumConfigurations" +#define kUSBHostDevicePropertyMaxPacketSize "bMaxPacketSize0" +#define kUSBHostDevicePropertyStandardVersion "bcdUSB" + +#define kUSBHostInterfacePropertyStringIndex "iInterface" +#define kUSBHostInterfacePropertyString "kUSBString" +#define kUSBHostInterfacePropertyNumEndpoints "bNumEndpoints" + +// Legacy power properties +#define kAppleMaxPortCurrent "AAPL,current-available" +#define kAppleCurrentExtra "AAPL,current-extra" +#define kAppleMaxPortCurrentInSleep "AAPL,max-port-current-in-sleep" +#define kAppleCurrentExtraInSleep "AAPL,current-extra-in-sleep" +#define kAppleExternalConnectorBitmap "AAPL,ExternalConnectorBitmap" + +#endif /* IOUSBHostFamily_IOUSBHostFamilyDefinitions_h */ diff --git a/QualcommWireless/include/IOKit/usb/IOUSBHostHIDDevice.h b/QualcommWireless/include/IOKit/usb/IOUSBHostHIDDevice.h new file mode 100644 index 0000000..5d2088d --- /dev/null +++ b/QualcommWireless/include/IOKit/usb/IOUSBHostHIDDevice.h @@ -0,0 +1,260 @@ +/* + * Copyright (c) 1998-2006 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef IOUSBHOSTHIDDEVICE_H +#define IOUSBHOSTHIDDEVICE_H + +#include <IOKit/IOBufferMemoryDescriptor.h> + +#include <IOKit/hid/IOHIDDevice.h> + +#include <IOKit/usb/IOUSBHostInterface.h> +#include <IOKit/usb/StandardUSB.h> +#include <IOKit/usb/USBSpec.h> +#include <IOKit/usb/IOUSBHostFamily.h> +#include <IOKit/IOTimerEventSource.h> + + +#define ENABLE_HIDREPORT_LOGGING 0 + +enum +{ + kInterruptRetries = 10, + kErrorRecoveryInterval = 50 // Milliseconds +}; + +// from IOHIDDescriptorParser.h: +// // types of HID reports (input, output, feature) +// enum +// { +// kHIDInputReport = 1, +// kHIDOutputReport, +// kHIDFeatureReport, +// kHIDUnknownReport = 255 +// }; +// +// Report types from high level HID Manager: +// from IOHIDKeys.h: +// enum IOHIDReportType +// { +// kIOHIDReportTypeInput = 0, +// kIOHIDReportTypeOutput, +// kIOHIDReportTypeFeature, +// kIOHIDReportTypeCount +// }; +// +#define HID_MGR_2_USB_REPORT_TYPE(x) (x + 1) + +#define USB_2_HID_MGR_REPORT_TYPE(x) (x - 1) + +#define kHIDDriverRetryCount 3 + +#define kUSBHIDReportLoggingLevel "USB HID Report Logging Level" + +#define kUSBHID_DeviceIdleTimeout "Device Idle Timeout" + +#define kUSBHID_IoIdleTimeout "I/O Idle Timeout" + +#define kUSBHostHIDDevicePropertyIdlePolicy "kUSBHIDDeviceIdlePolicy" + +/*! + @typedef IOUSBHostHIDDescriptor + @discussion USB HID Descriptor. See the USB HID Specification at <a href="http://www.usb.org"TARGET="_blank">http://www.usb.org</a>. (This structure + should have used the #pragma pack(1) compiler directive to get byte alignment. + */ +struct IOUSBHostHIDDescriptor : public StandardUSB::Descriptor +{ + uint16_t descVersNum; + uint8_t hidCountryCode; + uint8_t hidNumDescriptors; + uint8_t hidDescriptorType; + uint8_t hidDescriptorLengthLo; + uint8_t hidDescriptorLengthHi; +} __attribute__((packed)); + +/*! + @typedef IOUSBHIDReportDesc + @discussion USB HID Report Descriptor header. See the USB HID Specification at <a href="http://www.usb.org"TARGET="_blank">http://www.usb.org</a>. (This structure + should have used the #pragma pack(1) compiler directive to get byte alignment. + */ +struct IOUSBHostHIDReportDescriptor +{ + uint8_t hidDescriptorType; + uint8_t hidDescriptorLengthLo; + uint8_t hidDescriptorLengthHi; +} __attribute__((packed)); + +/*! + @class IOUSBHostHIDDevice + @abstract Driver that matches to USB HID devices. + @discussion This class can be overriden to provide for specific behaviors. + */ +class IOUSBHostHIDDevice : public IOHIDDevice +{ + OSDeclareDefaultStructors(IOUSBHostHIDDevice) + +private: + typedef struct IOUSBHidExpansionData + { + uint8_t _bInterfaceNumber; + } tIOUSBHidExpansionData; + + tIOUSBHidExpansionData *_expansionData; + + typedef struct + { + IOUSBHostCompletion usbCompletion; + IOHIDCompletion* hidCompletion; + IOMemoryDescriptor* report; + } tAsyncContext; + + +protected: + IOWorkLoop *_workLoop; + IOCommandGate *_gate; + IOUSBHostDevice *_device; + IOUSBHostInterface *_interface; + IOUSBHostPipe *_interruptPipe; + IOUSBHostPipe *_interruptOutPipe; + IOBufferMemoryDescriptor *_buffer; + IOMemoryDescriptor *_zlpDescriptor; + IOUSBHostCompletion _completion; + IOUSBHostCompletion _zlpCompletion; + bool _interruptReadPending; + uint32_t _interruptOutMaxSize; + uint32_t _zlpBuffer; + uint32_t _debugLoggingMask; + int32_t _interruptRetries; + IOTimerEventSource *_interruptRetriesTimer; + + // IOHIDDevice Methods + virtual bool handleStart (IOService *provider) APPLE_KEXT_OVERRIDE; + virtual void interruptRetry(IOTimerEventSource* timer); + + // IOUSBHIDDevice Methods + virtual IOReturn setProtocol (uint16_t protocol); + + virtual OSString* getStringAtIndex (uint8_t index, uint16_t lang = 0x0409) const; + + virtual IOReturn getHidDescriptor (uint8_t inDescriptorType, uint8_t inDescriptorIndex, uint8_t *vOutBuf, uint32_t *vOutSize) const; + + virtual IOReturn getHidDescriptorGated (uint8_t inDescriptorType, uint8_t inDescriptorIndex, uint8_t *vOutBuf, uint32_t *vOutSize) const; + + virtual IOReturn readInterruptPipeAsync (void); + + virtual IOReturn readInterruptPipeAsyncGated (void); + + virtual void interruptReadComplete (void *parameter, IOReturn status, uint32_t bytesTransferred); + + virtual void setReportComplete (void *parameter, IOReturn status, uint32_t bytesTransferred); + + virtual void zlpWriteComplete (void *parameter, IOReturn status, uint32_t bytesTransferred); + + // Protected pad slots for future expansion + OSMetaClassDeclareReservedUnused(IOUSBHostHIDDevice, 0); + OSMetaClassDeclareReservedUnused(IOUSBHostHIDDevice, 1); + OSMetaClassDeclareReservedUnused(IOUSBHostHIDDevice, 2); + OSMetaClassDeclareReservedUnused(IOUSBHostHIDDevice, 3); + OSMetaClassDeclareReservedUnused(IOUSBHostHIDDevice, 4); + OSMetaClassDeclareReservedUnused(IOUSBHostHIDDevice, 5); + OSMetaClassDeclareReservedUnused(IOUSBHostHIDDevice, 6); + OSMetaClassDeclareReservedUnused(IOUSBHostHIDDevice, 7); + OSMetaClassDeclareReservedUnused(IOUSBHostHIDDevice, 8); + OSMetaClassDeclareReservedUnused(IOUSBHostHIDDevice, 9); + +public: + // IOService Methods + virtual bool start (IOService *provider) APPLE_KEXT_OVERRIDE; + + virtual bool willTerminate (IOService *provider, IOOptionBits options) APPLE_KEXT_OVERRIDE; + + virtual void stop (IOService *provider) APPLE_KEXT_OVERRIDE; + + virtual void free (void) APPLE_KEXT_OVERRIDE; + + virtual bool setProperty(const OSSymbol* aKey, OSObject* anObject) APPLE_KEXT_OVERRIDE; + + virtual bool setProperty(const OSString* aKey, OSObject* anObject) APPLE_KEXT_OVERRIDE; + + virtual bool setProperty(const char* aKey, OSObject* anObject) APPLE_KEXT_OVERRIDE; + + virtual bool setProperty(const char* aKey, const char * aString) APPLE_KEXT_OVERRIDE; + + virtual bool setProperty(const char* aKey, bool aBoolean) APPLE_KEXT_OVERRIDE; + + virtual bool setProperty(const char* aKey, unsigned long long aValue, unsigned int aNumberOfBits) APPLE_KEXT_OVERRIDE; + + virtual bool setProperty(const char* aKey, void* bytes, unsigned int length) APPLE_KEXT_OVERRIDE; + + + // IOHIDDevice Methods + virtual IOReturn newReportDescriptor (IOMemoryDescriptor **descriptor ) const APPLE_KEXT_OVERRIDE; + + virtual OSString* newTransportString (void) const APPLE_KEXT_OVERRIDE; + + virtual OSString* newManufacturerString (void) const APPLE_KEXT_OVERRIDE; + + virtual OSString* newProductString (void) const APPLE_KEXT_OVERRIDE; + + virtual OSString* newSerialNumberString (void) const APPLE_KEXT_OVERRIDE; + + virtual OSNumber* newVendorIDNumber (void) const APPLE_KEXT_OVERRIDE; + + virtual OSNumber* newProductIDNumber (void) const APPLE_KEXT_OVERRIDE; + + virtual OSNumber* newVersionNumber (void) const APPLE_KEXT_OVERRIDE; + + virtual OSNumber* newLocationIDNumber (void) const APPLE_KEXT_OVERRIDE; + + virtual OSNumber* newCountryCodeNumber (void) const APPLE_KEXT_OVERRIDE; + + virtual IOReturn getReport (IOMemoryDescriptor *report, IOHIDReportType reportType, IOOptionBits options) APPLE_KEXT_OVERRIDE; + + virtual IOReturn setReport (IOMemoryDescriptor *report, IOHIDReportType reportType, IOOptionBits options = 0) APPLE_KEXT_OVERRIDE; + + virtual IOReturn setReport(IOMemoryDescriptor * report, IOHIDReportType reportType, IOOptionBits options, UInt32 completionTimeout, IOHIDCompletion* completion = 0) APPLE_KEXT_OVERRIDE; + + + // IOUSBHIDDevice Methods + virtual IOReturn SetIdleMillisecs (UInt16 msecs); + + virtual UInt32 getMaxReportSize (void) const; + + virtual OSString* newIndexedString (UInt8 index) const; + + virtual OSNumber* newReportIntervalNumber() const APPLE_KEXT_OVERRIDE; + + // Public pad slots for future expansion + OSMetaClassDeclareReservedUnused(IOUSBHostHIDDevice, 10); + OSMetaClassDeclareReservedUnused(IOUSBHostHIDDevice, 11); + OSMetaClassDeclareReservedUnused(IOUSBHostHIDDevice, 12); + OSMetaClassDeclareReservedUnused(IOUSBHostHIDDevice, 13); + OSMetaClassDeclareReservedUnused(IOUSBHostHIDDevice, 14); + OSMetaClassDeclareReservedUnused(IOUSBHostHIDDevice, 15); + OSMetaClassDeclareReservedUnused(IOUSBHostHIDDevice, 16); + OSMetaClassDeclareReservedUnused(IOUSBHostHIDDevice, 17); + OSMetaClassDeclareReservedUnused(IOUSBHostHIDDevice, 18); + OSMetaClassDeclareReservedUnused(IOUSBHostHIDDevice, 19); +}; + +#endif // IOUSBHOSTHIDDEVICE_H diff --git a/QualcommWireless/include/IOKit/usb/IOUSBHostIOSource.h b/QualcommWireless/include/IOKit/usb/IOUSBHostIOSource.h new file mode 100644 index 0000000..a4cc25e --- /dev/null +++ b/QualcommWireless/include/IOKit/usb/IOUSBHostIOSource.h @@ -0,0 +1,406 @@ +/* + * Copyright (c) 1998-2016 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +/*! + @header IOUSBHostIOSource.h + @brief IOUSBHostIOSource is the base class for objects that perform USB IO. + */ + +#ifndef IOUSBHostFamily_IOUSBHostIOSource_h +#define IOUSBHostFamily_IOUSBHostIOSource_h + +#include <sys/queue.h> +#include <libkern/c++/OSObject.h> +#include <IOKit/IOCommandGate.h> +#include <IOKit/IOTimerEventSource.h> +#include <IOKit/IOMemoryDescriptor.h> +#include <IOKit/usb/IOUSBHostFamily.h> + +#define kUSBHostTransferLimit (1024) + +class AppleUSBHostController; +class IOUSBHostDevice; +class AppleUSBRequestPool; + +typedef void (*IOUSBHostCompletionAction)(void* owner, void* parameter, IOReturn status, uint32_t bytesTransferred); + +/*! + * @struct IOUSBHostCompletion + * @discussion Struture describing the completion callback for an asynchronous bulk, control, or interrupt IO operation + * @field owner Pointer to an object that owns the transfer. May be used as <code>this</code> for an action passed via OSMemberFunctionCast. + * @field action IOUSBHostCompletionAction to run when the IO request completes. + * @field parameter Pointer to be used as context within the completion action. + */ +struct IOUSBHostCompletion +{ + void* owner; + IOUSBHostCompletionAction action; + void* parameter; +}; + +typedef void (*IOUSBHostBundledCompletionAction)(void *owner, uint32_t ioCompletionCount, IOMemoryDescriptor** dataBufferArray, void** parameter, IOReturn* statusArray, uint32_t* actualByteCountArray); + +/*! + * @struct IOUSBHostBundledCompletion + * @discussion Struture describing the completion callback for an asynchronous bulk, control, or interrupt IO operation + * @field owner Pointer to an object that owns the transfer. May be used as <code>this</code> for an action passed via OSMemberFunctionCast. + * @field action IOUSBHostBundledCompletion to run when the IO request completes. + * @field parameter Pointer to be used as context within the completion action. + */ +struct IOUSBHostBundledCompletion +{ + void* owner; + IOUSBHostBundledCompletionAction action; + void* parameter; +}; + + + +/*! + * @struct IOUSBHostIsochronousFrame + * @discussion Structure representing a single frame in an isochronous transfer. + * @field status Completion status for this individual frame. IOUSBHostFamily will initialize this to kIOReturnInvalid and will update the field with a valid status code upon completion of the frame. + * @field requestCount The number of bytes requested to transfer for this frame. This field must be initialized by the caller before this structure is submitted to IOUSBHostFamily. + * @field completeCount The number of bytes actually transferred for this frame. IOUSBHostFamily will update this field upon completion of the frame. + * @field reserved Reserved for future use. + * @field timeStamp The observed AbsoluteTime for this frame's completion. Note that interrupt latency and system load may result in more than one frame completing with the same timestamp. + */ +struct IOUSBHostIsochronousFrame +{ + IOReturn status; + uint32_t requestCount; + uint32_t completeCount; + uint32_t reserved; + AbsoluteTime timeStamp; +} __attribute__((packed)); + +typedef void (*IOUSBHostIsochronousCompletionAction)(void* owner, void* parameter, IOReturn status, IOUSBHostIsochronousFrame* frameList); + +/*! + * @struct IOUSBHostIsochronousCompletion + * @discussion Struture describing the completion callback for an asynchronous isochronous operation + * @field owner Pointer to an object that owns the transfer. May be used as <code>this</code> for an action passed via OSMemberFunctionCast. + * @field action IOUSBHostIsochronousCompletionAction to run when the IO request completes. + * @field parameter Pointer to be used as context within the completion action. + */ +struct IOUSBHostIsochronousCompletion +{ + void* owner; + IOUSBHostIsochronousCompletionAction action; + void* parameter; +}; + +typedef LIST_HEAD (IOUSBHostIOSourceClientRecordList, IOUSBHostIOSourceClientRecord) IOUSBHostIOSourceClientRecordList; +typedef LIST_ENTRY (IOUSBHostIOSourceClientRecord) IOUSBHostIOSourceClientRecordLink; + +struct IOUSBHostIOSourceClientRecord +{ + IOService* forClient; + UInt32 outstandingIO; + IOUSBHostIOSourceClientRecordLink link; +}; + +/*! + * @struct tPacketFilterMetadata + * @discussion Struture providing information about the IOUSBHostIOSource's parents + * @field deviceAddress Address of the parent IOUSBHostDevice. + * @field interfaceClass If enpointAddress is non-zero, the class of the parent IOUSBHostInteface. + * @field interfaceSubClass If enpointAddress is non-zero, the sub-class of the parent IOUSBHostInteface. + * @field interfaceProtocol If enpointAddress is non-zero, the protocol of the parent IOUSBHostInteface. + * @field interfaceAltSetting Current alternate setting of the parent IOUSBHostInterface. + * @field endpointAddress The address of the endpoint including the direction. + * @field endpointType See tEndpointType in IOUSBHostFamily.h. + * @field speed See tUSBHostConnectionSpeed in IOUSBHostFamily.h. + * @field vid Vendor ID of the parent IOUSBHostDevice. + * @field pid Product ID of the parent IOUSBHostDevice. + * @field locationID USB locationID of the parent IOUSBHostDevice. + */ +struct tPacketFilterMetadata +{ + uint8_t deviceAddress; + uint8_t interfaceClass; + uint8_t interfaceSubclass; + uint8_t interfaceProtocol; + uint8_t interfaceAltSetting; + uint8_t endpointAddress; + uint8_t endpointType; + uint8_t speed; + uint16_t vid; + uint16_t pid; + uint32_t locationID; +} __attribute__((packed)); + +/*! + * @class IOUSBHostIOSource + * @brief The base class for objects that perform USB IO. + * @discussion This class provides functionality to transfer data across USB. Function drivers should not subclass IOUSBHostIOSource. + */ +class __IOUSBHOSTFAMILY_DEPRECATED IOUSBHostIOSource : public OSObject +{ + friend class AppleUSBIORequest; + friend class IOUSBHostInterface; + + OSDeclareAbstractStructors(IOUSBHostIOSource) + +protected: + virtual void free() APPLE_KEXT_OVERRIDE; + + virtual bool initWithOwners(AppleUSBHostController* controller, IOUSBHostDevice* device); + + OSMetaClassDeclareReservedUsed(IOUSBHostIOSource, 0); + virtual IOReturn open(); + + OSMetaClassDeclareReservedUsed(IOUSBHostIOSource, 1); + virtual IOReturn openGated(); + + OSMetaClassDeclareReservedUsed(IOUSBHostIOSource, 2); + virtual IOReturn destroy(); + + OSMetaClassDeclareReservedUsed(IOUSBHostIOSource, 3); + virtual IOReturn destroyGated(); + + // Pad slots for future expansion + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 4); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 5); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 6); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 7); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 8); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 9); + +public: + /*! + * @enum tState + * @namespace IOUSBHostIOSource + * @brief Return value for <code>getState()</code> + * @constant kStateReady The I/O source is idle and fully-functional. + * @constant kStateRunningCompletions The I/O source is currently running completions. + * @constant kStateAborting The I/O source is currently aborting all requests. + * @constant kStateInactive The I/O source has been closed. + */ + enum tState + { + kStateReady, + kStateRunningCompletions, + kStateAborting, + kStateInactive, + kStateDestroyed + }; + + /*! + * @brief Returns the current state of the I/O source. + * @result @link tState @/link + */ + virtual tState getState(); + + /*! + * @enum tAbortOptions + * @brief Options for <code>abort()</code> + * @constant kAbortAsynchronous abort() should return immediately without waiting for the aborted IO to complete + * @constant kAbortSynchronous abort() should not return until the aborted IO has completed + */ + enum tAbortOptions + { + kAbortAsynchronous = 0x0, + kAbortSynchronous = 0x1 + }; + + /*! + * @brief Abort pending I/O requests. + * @discussion This method will abort all pending I/O requests. If <code>options</code> includes <code>kAbortSynchronous</code>, this method will block any new IO requests unless they are submitted from an aborted IO's completion routine. + * @param options tAbortOptions + * @param withError IOReturn error value to return with the requests. The default value of kIOReturnAborted should be used. + * @param forClient Service for which to abort requests. If NULL, all requests will be aborted. Only control endpoints can specify a non-NULL value. + * @return IOReturn result code + */ + virtual IOReturn abort(IOOptionBits options = kAbortAsynchronous, IOReturn withError = kIOReturnAborted, IOService* forClient = NULL); + + // Public pad slots for future expansion + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 10); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 11); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 12); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 13); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 14); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 15); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 16); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 17); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 18); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 19); + +protected: + // Protected pad slots for future expansion + OSMetaClassDeclareReservedUsed(IOUSBHostIOSource, 20); + virtual UInt32 getOutstandingIO(IOService* forClient); + + OSMetaClassDeclareReservedUsed(IOUSBHostIOSource, 21); + virtual UInt32 adjustOutstandingIO(IOService* forClient, SInt32 increment); + + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 22); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 23); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 24); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 25); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 26); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 27); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 28); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 29); + +protected: + struct tSynchronousParameter + { + uint32_t bytesTransferred; + IOReturn status; + }; + + virtual void synchronousCompletion(void* parameter, IOReturn status, uint32_t bytesTransferred); + virtual void synchronousIsochronousCompletion(void* parameter, IOReturn status, IOUSBHostIsochronousFrame* pFrames); + + virtual IOReturn getStateGated(tState& state); + + virtual IOReturn close(); + + virtual IOReturn closeGated(); + + virtual IOReturn abortGated(IOOptionBits options, IOReturn withError, IOService* forClient); + + virtual void timerCompletion(IOTimerEventSource* timer); + + AppleUSBHostController* _controller; + IOUSBHostDevice* _device; + + IOWorkLoop* _workloop; + IOCommandGate* _commandGate; + IOTimerEventSource* _timer; + AppleUSBRequestPool* _requestPool; + + tState _state; + UInt32 _outstandingIO; + UInt32 _completionRunning; + +#pragma mark IO +public: + /*! + * @brief Enqueue an IO request on the source + * @discussion This method is used to issue an asynchronous I/O request on a bulk or interrupt pipe. See IOUSBHostPipe::io and IOUSBHostStream::io for object-specific interface notes. + * @param dataBuffer IOMemoryDescriptor pointer containing the buffer to use for the transfer + * @param dataBufferLength Length of the request. Must be <= <code>dataBuffer->getLength()</code> + * @param completion Pointer to a IOUSBHostCompletion structure. This will be copied and can therefore be stack-allocated. + * @param completionTimeoutMs Timeout of the request in milliseconds. If 0, the request will never timeout. Must be 0 for interrupt pipes and streams. + * @return kIOReuturnSuccess if the completion will be called in the future, otherwise error + */ + virtual IOReturn io(IOMemoryDescriptor* dataBuffer, uint32_t dataBufferLength, IOUSBHostCompletion* completion, uint32_t completionTimeoutMs = 0); + + /*! + * @brief Perform an IO request on the source + * @discussion This method will send a synchronous request on the IO source, and will not return until the request is complete. This method will acquire the service's workloop lock, and will call commandSleep to send the request. See IOUSBHostPipe::io and IOUSBHostStream::io for object-specific interface notes. + * @param dataBuffer IOMemoryDescriptor pointer containing the buffer to use for the transfer + * @param dataBufferLength Length of the request. Must be <= <code>dataBuffer->getLength()</code> + * @param bytesTransferred uint32_t reference which will be updated with the bytes transferred during the request + * @param completionTimeoutMs Timeout of the request in milliseconds. If 0, the request will never timeout. Must be 0 for interrupt pipes and streams. + * @return IOReturn value indicating the result of the IO request + */ + virtual IOReturn io(IOMemoryDescriptor* dataBuffer, uint32_t dataBufferLength, uint32_t& bytesTransferred, uint32_t completionTimeoutMs = 0); + + + OSMetaClassDeclareReservedUsed(IOUSBHostIOSource, 30); + + /*! + * @brief Enqueue an IO request on the source + * @discussion This method is used to issue an asynchronous I/O request on a bulk or interrupt pipe that will trigger a IOUSBHostBundledCompletionAction callback. + * I/O requests enqueued with this method may be completed in bundles that may reduce the total number of callbacks. + * The 'ioCompletionCount' callback parameter indicates the number of completed I/Os associated with this callback and the size of the + * 'dataBufferArray', 'statusArray' and' actualByteCountArray. Clients must iterate over these arrays to extract the completion status/length + * of each individual IOMemoryDescriptor. + * See IOUSBHostPipe::io and IOUSBHostStream::io for object-specific interface notes. + * @param dataBuffer IOMemoryDescriptor pointer containing the buffer to use for the transfer + * @param dataBufferLength Length of the request. Must be <= <code>dataBuffer->getLength()</code> + * @param completion Pointer to a IOUSBHostBundledCompletion structure. This will be copied and can therefore be stack-allocated. + * @param completionTimeoutMs Timeout of the request in milliseconds. If 0, the request will never timeout. Must be 0 for interrupt pipes and streams. + * @return kIOReuturnSuccess if the completion will be called in the future, otherwise error + */ + virtual IOReturn io(IOMemoryDescriptor* dataBuffer, uint32_t dataBufferLength, IOUSBHostBundledCompletion* completion, uint32_t completionTimeoutMs = 0); + + + + + // Public pad slots for IO + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 31); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 32); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 33); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 34); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 35); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 36); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 37); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 38); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 39); + +protected: + // Protected pad slots for IO + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 40); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 41); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 42); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 43); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 44); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 45); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 46); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 47); + OSMetaClassDeclareReservedUnused(IOUSBHostIOSource, 48); + +protected: + struct tInternalDataTransferParameters + { + IOMemoryDescriptor* dataBuffer; + uint32_t dataBufferLength; + uint32_t* bytesTransferred; + IOUSBHostCompletion* completion; + IOUSBHostBundledCompletion* bundledCompletion; + uint32_t completionTimeoutMs; + IOUSBHostIsochronousFrame* frameList; + uint32_t frameListCount; + uint64_t firstFrameNumber; + IOUSBHostIsochronousCompletion* isochronousCompletion; + }; + + OSMetaClassDeclareReservedUsed(IOUSBHostIOSource, 49); + virtual IOReturn ioBundledGated(tInternalDataTransferParameters& parameters); + + virtual IOReturn ioGated(tInternalDataTransferParameters& parameters); + + struct tExpansionData + { + IOUSBHostIOSourceClientRecordList _ioRecordList; + tPacketFilterMetadata _metadata; + void* _dkMemoryDescriptorRing; + IOCommandGate* _controllerCommandGate; + }; + + tExpansionData* _expansionData; + +#pragma mark Debug + uint32_t _debugLoggingMask; +}; + +#endif diff --git a/QualcommWireless/include/IOKit/usb/IOUSBHostInterface.h b/QualcommWireless/include/IOKit/usb/IOUSBHostInterface.h new file mode 100644 index 0000000..5a1f97c --- /dev/null +++ b/QualcommWireless/include/IOKit/usb/IOUSBHostInterface.h @@ -0,0 +1,551 @@ +/* + * Copyright (c) 1998-2016 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +/*! + @header IOUSBHostInterface.h + @brief IOUSBHostInterface is an IOService representing a USB interface. + @discussion + + <h3>Session Management</h3> + + A driver that has successfully matched on an IOUSBHostInterface is able to take ownership of the interface by calling the <code>open</code> method defined by IOService on the IOUSBHostInterface. Once <code>open</code> has completed successfully, the driver has an open session, and may use the deviceRequest interface to send control requests, the selectAlternateSetting interface to change the endpoints and behavior of the interface. + + When the driver is finished with control of the IOUSBHostInterface, it must call <code>close</code> to end its session. Calling <code>close</code> will synchronously abort any IO associated with that session, including requests on the control endpoint. If the interface is terminating for any reason, such as the device being unplugged, the driver must call <code>close</code> on the IOUSBHostInterface, or termination will be blocked and the port will not register newly attached devices for matching. The willTerminate call into the driver is the recommended location to call <code>close</code>. + + <h3>deviceRequest Interface</h3> + + The <code>deviceRequest</code> methods are used to send control requests to the device's default endpoint. The <code>deviceRequest</code> methods may not be used for the following standard requests: + <ul> + <li>CLEAR_FEATURE ENDPOINT_HALT (USB 2.0 9.4.1) - Use <code>IOUSBHostPipe::clearStall</code> to send this request</li> + <li>SET_ADDRESS (USB 2.0 9.4.6)</li> + <li>SET_CONFIGURATION (USB 2.0 9.4.7) - Use <code>setConfiguration</code> to send this request</li> + <li>SET_INTERFACE (USB 2.0 9.4.10) - Use <code>IOUSBHostInterface::selectAlternateSetting</code> to send this request</li> + </ul> + + <h3>IOUSBInterface Migration</h3> + + IOUSBHostInterface serves as a replacement for IOUSBInterface. Clients that previously matched on IOUSBInterface can use the following guide to convert to IOUSBHostInterface. + + <code>virtual const IOUSBInterfaceDescriptor* IOUSBInterface::FindNextAltInterface(const IOUSBInterfaceDescriptor*, IOUSBFindInterfaceRequest*);</code><br> + Replacement: <code>StandardUSB::getNextInterfaceDescriptor(...);</code> + + <code>virtual IOUSBPipe* IOUSBInterface::FindNextPipe(IOUSBHostPipe*, IOUSBFindEndpointRequest*);<br> + virtual IOUSBPipe* IOUSBInterface::FindNextPipe(IOUSBHostPipe*, IOUSBFindEndpointRequest*, bool);</code><br> + Replacement: + <pre>const EndpointDescriptor* endpointCandidate = NULL; +IOUSBHostPipe* foundPipe = NULL; +while((endpointCandidate = StandardUSB::getNextAssociatedDescriptorWithType(getConfigurationDescriptor(), getInterfaceDescriptor(), endpointCandidate, kDescriptorTypeEndpoint)) != NULL) +{ + if(endpointCandidate->bEndpointAddress == desiredAddress>) + { + foundPipe = copyPipe(StandardUSB::getEndpointAddress(endpointCandidate)); + break; + } +}</pre> + + <code>virtual const IOUSBDescriptorHeader* IOUSBInterface::FindNextAssociatedDescriptor(const void*, UInt8);</code><br> + Replacement: <code>StandardUSB::getNextAssociatedDescriptorWithType(getConfigurationDescriptor(), getInterfaceDescriptor(), currentDescriptor, type);</code> + + <code>virtual IOReturn IOUSBInterface::SetAlternateInterface(IOService*, UInt16); + Replacement: <code>selectAlternateSetting(...);</code> + + <code>virtual IOUSBHostPipe* IOUSBInterface::GetPipeObj(UInt8);<br> + virtual IOUSBHostPipe* IOUSBInterface::GetPipeObjRetain(UInt8);</code><br> + Replacement: <code>copyPipe(endpointAddress);</code><br> + Note that <code>copyPipe</code> behaves like <code>GetPipeObjRetain</code>, and the returned pipe must be released by the caller during termination. + + <code>virtual UInt8 IOUSBInterface::GetConfigValue();</code><br> + Replacement: <code>getConfigurationDescriptor()->bConfigurationValue;</code> + + <code>virtual IOUSBHostDevice* IOUSBInterface::GetDevice();</code><br> + Replacement: + <pre>// Function drivers should not assume the immediate provider of an IOUSBHostInterface is an IOUSBHostDevice. +IOService* deviceCandidate = getProvider(); +IOUSBHostDevice* device = NULL; +while(deviceCandidate != NULL) +{ + device = OSDynamicCast(IOUSBHostDevice, deviceCandidate); + if(device != NULL) + { + break; + } + + deviceCandidate = deviceCandidate->getProvider(); +}</pre> + + <code>virtual UInt8 IOUSBInterface::GetInterfaceNumber();</code><br> + Replacement: <code>getInterfaceDescriptor()->bInterfaceNumber;</code> + + <code>virtual UInt8 IOUSBInterface::GetAlternateSetting();</code><br> + Replacement: <code>getInterfaceDescriptor()->bAlternateSetting;</code> + + <code>virtual UInt8 IOUSBInterface::GetNumEndpoints();</code><br> + Replacement: <code>getInterfaceDescriptor()->bNumEndpoints;</code> + + <code>virtual UInt8 IOUSBInterface::GetInterfaceClass();</code><br> + Replacement: <code>getInterfaceDescriptor()->bInterfaceClass;</code> + + <code>virtual UInt8 IOUSBInterface::GetInterfaceSubClass();</code><br> + Replacement: <code>getInterfaceDescriptor()->bInterfaceSubClass;</code> + + <code>virtual UInt8 IOUSBInterface::GetInterfaceProtocol();</code><br> + Replacement: <code>getInterfaceDescriptor()->bInterfaceProtocol;</code> + + <code>virtual UInt8 IOUSBInterface::GetInterfaceStringIndex();</code><br> + Replacement: <code>getInterfaceDescriptor()->iInterface;</code> + + <code>virtual IOReturn IOUSBInterface::DeviceRequest(IOUSBDevRequest* request, IOUSBCompletion* completion = 0);<br> + virtual IOReturn IOUSBInterface::DeviceRequest(IOUSBDevRequestDesc* request, IOUSBCompletion* completion = 0);</code><br> + Replacement: <code>deviceRequest(...)</code> + + <code>virtual IOReturn IOUSBInterface::GetEndpointProperties(UInt8 alternateSetting, UInt8 endpointNumber, UInt8 direction, UInt8* transferType, UInt16* maxPacketSize, UInt8* interval);<br> + virtual IOReturn GetEndpointPropertiesV3(IOUSBEndpointProperties*);</code><br> + Replacement: Use <code>StandardUSB::getEndpoint*</code> methods to retrieve endpoint properties. + + <code>virtual IOReturn RememberStreams();</code><br> + Replacement: none + + <code>virtual IOReturn RecreateStreams();</code><br> + Replacement: none + + <code>virtual void UnlinkPipes();</code><br> + Replacement: none + + <code>virtual void ReopenPipes();</code><br> + Replacement: none + + <code>virtual IOReturn GetInterfaceStatus(USBStatus*);</code><br> + Replacement: Use <code>deviceRequest(...)</code> to manually craft the control request. + + <code>virtual IOReturn SetFunctionSuspendFeature(UInt8);</code><br> + Replacement: It is not recommended for function drivers to send this request. + + <code>virtual IOReturn EnableRemoteWake(bool);</code><br> + Replacement: Use <code>deviceRequest(...)</code> to manually craft the control request. <code>IOUSBHostDevice::setConfiguration</code> will automatically enable remote wake if the descriptors indicate it is supported. + */ + +#ifndef IOUSBHostFamily_IOUSBHostInterface_h +#define IOUSBHostFamily_IOUSBHostInterface_h + +#include <IOKit/IOService.h> +#include <libkern/c++/OSData.h> + +#include <IOKit/usb/IOUSBHostFamily.h> +#include <IOKit/usb/IOUSBHostDevice.h> + +#if TARGET_OS_OSX +#include <USBDriverKit/IOUSBHostInterface.h> +#endif + +/*! + * @class IOUSBHostInterface + * @brief The IOService object representing a USB interface + * @discussion This class provides functionality to send control requests to the default control endpoint, as well as create IOUSBHostPipe objects to transfer data. Function drivers should not subclass IOUSBHostInterface. + */ +class __IOUSBHOSTFAMILY_DEPRECATED IOUSBHostInterface : public IOService +{ +#if TARGET_OS_OSX + OSDeclareDefaultStructorsWithDispatch(IOUSBHostInterface) +#else + OSDeclareDefaultStructors(IOUSBHostInterface) +#endif + +public: + /* + * @brief Factory method for creating an IOUSBHostInterface object + * @discussion This method should not be called by function drivers. To create an IOUSBHostInterface, use IOUSBHostDevice::setConfiguration(...) + * @param configurationDescriptor Descriptor for the configuration this interface belongs to + * @param interfaceDescriptor Descriptor for this interface's default alt setting + * @return Pointer to an IOUSBHostInterface object if successful, otherwise NULL + */ + static IOUSBHostInterface* withDescriptors(const StandardUSB::ConfigurationDescriptor* configurationDescriptor, const StandardUSB::InterfaceDescriptor* interfaceDescriptor); + +protected: + virtual bool initWithDescriptors(const StandardUSB::ConfigurationDescriptor* configurationDescriptor, const StandardUSB::InterfaceDescriptor* interfaceDescriptor); + + // Pad slots for future expansion + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 0); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 1); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 2); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 3); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 4); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 5); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 6); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 7); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 8); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 9); + +#pragma mark IOService overrides +public: + // The following methods, with the notable exception of <code>open</code> and <code>close</code> should be considered private and should not be called by function drivers. For a discussion of proper usage for <code>open</code> and <code>close</code>, see the discussion of "Session Management" above. + virtual bool attach(IOService* provider) APPLE_KEXT_OVERRIDE; + virtual bool start(IOService* provider) APPLE_KEXT_OVERRIDE; + virtual bool terminate(IOOptionBits options = 0) APPLE_KEXT_OVERRIDE; + virtual void stop(IOService* provider) APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + + virtual bool compareProperty(OSDictionary* matching, const char* key) APPLE_KEXT_OVERRIDE; + virtual bool compareProperty(OSDictionary* matching, const OSString* key) APPLE_KEXT_OVERRIDE; + virtual bool matchPropertyTable(OSDictionary* table, SInt32* score) APPLE_KEXT_OVERRIDE; + virtual bool matchPropertyTable(OSDictionary* table) APPLE_KEXT_OVERRIDE; + + + enum + { + kOpenOptionsSelectAlternateInterface = kUSBHostOpenOptionSelectAlternateSetting + } __attribute__((deprecated)); + + /*! @functiongroup IOService overrides */ + + /*! + * @brief Open a session to the IOUSBHostInterface + * @discussion This method opens a session to an IOUSBHostInterface. It will acquire the service's workloop lock. Only one service may open a session at a time. + * @param forClient The IOService that is opening a session. + * @param options See IOService.h, <code>kOpenOptionsSelectAlternateInterface</code> in the options mask will immediately select the alternate setting passed by value through the <code>arg</code> parameter + * @param arg See IOService.h, or the value of the alt setting to use if <code>kUSBHostOpenOptionSelectAlternateSetting</code> is included in the options mask + * @return bool true if the session could be opened, otherwise false. + */ + virtual bool open(IOService* forClient, IOOptionBits options = 0, void* arg = 0) APPLE_KEXT_OVERRIDE; + + /*! + * @brief Close a session to the IOUSBHostInterface + * @discussion This method closes an open session to an IOUSBHostInterface. It will acquire the service's workloop lock, abort any IO for the interface and its endpoints, and may call commandSleep to allow processing of aborted IO before returning. + * @param forClient The IOService that is closing its session. + * @param options See IOService.h + */ + virtual void close(IOService* forClient, IOOptionBits options = 0) APPLE_KEXT_OVERRIDE; + + virtual IOReturn newUserClient(task_t owningTask, void* securityID, UInt32 type, IOUserClient** handler) APPLE_KEXT_OVERRIDE; + + virtual IOReturn message(UInt32 type, IOService* provider, void* argument = 0) APPLE_KEXT_OVERRIDE; + + virtual const char* stringFromReturn(IOReturn code) APPLE_KEXT_OVERRIDE; + +protected: + virtual IOReturn openGated(IOService* forClient, IOOptionBits options, void* arg); + virtual IOReturn closeGated(IOService* forClient, IOOptionBits options); + + // Pad slots for IOService overrides + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 10); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 11); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 12); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 13); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 14); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 15); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 16); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 17); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 18); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 19); + +protected: + IOCommandGate* _commandGate; + IOWorkLoop* _workLoop; + +#pragma mark Power management +public: + /*! @functiongroup Power management */ + + /*! + * @brief Sets the desired idle suspend timeout for the interface + * @discussion Once the interface is considered idle, it will defer electrical suspend of the device for the specified duration. For a more complete discussion of idle policies, refer to "Idle suspend" in IOUSBHostFamily.h. + * @param deviceIdleTimeout The amount of time, in milliseconds, after all pipes are idle to wait before suspending the device. + * @return IOReturn result code + */ + virtual IOReturn setIdlePolicy(uint32_t deviceIdleTimeout); + + /*! + * @brief Retrieve the current idle suspend timeout. See @link setIdlePolicy @/link + * @return The amount of time, in milliseconds, after all pipes are idle to wait before suspending the device, + */ + virtual uint32_t getIdlePolicy(); + + // Public pad slots for power management + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 20); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 21); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 22); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 23); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 24); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 25); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 26); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 27); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 28); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 29); + +protected: + // Protected pad slots for power management + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 30); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 31); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 32); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 33); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 34); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 35); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 36); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 37); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 38); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 39); + +protected: + uint32_t _deviceIdleTimeout; + +#pragma mark Descriptors +public: + /*! @functiongroup Descriptors */ + + /*! + * @brief Retrieve the configuration descriptor in which this interface is defined + * @return ConfigurationDescriptor pointer + */ + virtual const StandardUSB::ConfigurationDescriptor* getConfigurationDescriptor(); + + /*! + * @brief Retrieve the interface descriptor associated with this interface + * @return InterfaceDescriptor pointer + */ + virtual const StandardUSB::InterfaceDescriptor* getInterfaceDescriptor(); + + /*! + * @brief Return a string descriptor from the device + * @discussion This method uses IOUSBHostDevice::getDescriptor to return a string descriptor. + * @param index Descriptor index value. Low byte of <code>wValue</code> of the SET_DESCRIPTOR control request (USB 2.0 9.4.8). + * @param languageID Descriptor language ID. <code>wIndex</code> of the SET_DESCRIPTOR control request (USB 2.0 9.4.8). * + * @return Pointer to the descriptor if found + */ + virtual const StandardUSB::StringDescriptor* getStringDescriptor(uint8_t index, uint16_t languageID = StandardUSB::kLanguageIDEnglishUS); + + // Public pad slots for descriptors + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 40); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 41); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 42); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 43); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 44); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 45); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 46); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 47); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 48); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 49); + +protected: + virtual IOReturn getInterfaceDescriptorGated(const StandardUSB::InterfaceDescriptor*& result); + + // Protected pad slots for descriptors + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 50); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 51); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 52); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 53); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 54); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 55); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 56); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 57); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 58); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 59); + +#pragma mark Alternate setting and pipe management +public: + /*! @functiongroup Alternate setting and pipe management */ + + /*! + * @brief Select an alternate setting for this interface + * @discussion This method is used to select an alternate setting for the interface. All pending IO on the interface's pipes will be aborted, and the open pipes will be closed. The new alternate setting will be selected via SET_INTERFACE control request (USB 2.0 9.4.10). + * @param bAlternateSetting Alternate interface number to activate + * @return IOReturn result code + */ + virtual IOReturn selectAlternateSetting(uint8_t bAlternateSetting); + + /*! + * @brief Return the pipe whose <code>bEndpointAddress</code> matches <code>address</code> + * @discussion This method will return the pipe whose <code>bEndpointAddress</code> matches <code>address</code>. If the pipe doesn't exist yet, but is part of the interface, it will first be created. The caller must release the IOUSBHostPipe when finished using it. + * @param address Address of the pipe + * @return Pointer to a retain()ed IOUSBHostPipe object or NULL + */ + virtual IOUSBHostPipe* copyPipe(uint8_t address); + + /*! + * @brief Enqueue a request on the default control endpoint + * @discussion This method will enqueue an asynchronous request on the default control endpoint. If successful, the provided completion routine will be called to report the status of the completed IO. + * @param request Reference to a valid StandardUSB::DeviceRequest structure. The structure is copied and can therefore be stack-allocated. + * @param dataBuffer A void* or IOMemoryDescriptor* defining the memory to use for the request's data phase. + * @param completion Pointer to a IOUSBHostCompletion structure. This will be copied and can therefore be stack-allocated. + * @param completionTimeoutMs Timeout of the request in milliseconds. If 0, the request will never timeout. + * @return kIOReuturnSuccess if the completion will be called in the future, otherwise error + */ + virtual IOReturn deviceRequest(StandardUSB::DeviceRequest& request, void* dataBuffer, IOUSBHostCompletion* completion, uint32_t completionTimeoutMs = kUSBHostDefaultControlCompletionTimeoutMS); + virtual IOReturn deviceRequest(StandardUSB::DeviceRequest& request, IOMemoryDescriptor* dataBuffer, IOUSBHostCompletion* completion, uint32_t completionTimeoutMs = kUSBHostDefaultControlCompletionTimeoutMS); + + /*! + * @brief Send a request on the default control endpoint + * @discussion This method will send a synchronous request on the default control endpoint, and will not return until the request is complete. This method will acquire the service's workloop lock, and will call commandSleep to send the control request. + * @param request Reference to a valid StandardUSB::DeviceRequest structure. + * @param dataBuffer A void* or IOMemoryDescriptor* defining the memory to use for the request's data phase. + * @param bytesTransferred A uint32_t reference which will be updated with the byte count of the completed data phase. + * @param completionTimeoutMs Timeout of the request in milliseconds. If 0, the request will never timeout. + * @return IOReturn value indicating the result of the IO request + */ + virtual IOReturn deviceRequest(StandardUSB::DeviceRequest& request, void* dataBuffer, uint32_t& bytesTransferred, uint32_t completionTimeoutMs = kUSBHostDefaultControlCompletionTimeoutMS); + virtual IOReturn deviceRequest(StandardUSB::DeviceRequest& request, IOMemoryDescriptor* dataBuffer, uint32_t& bytesTransferred, uint32_t completionTimeoutMs = kUSBHostDefaultControlCompletionTimeoutMS); + + /*! + * @brief Abort device requests made via the @link deviceRequest @/link methods by <code>forClient</code> + * @discussion This method will abort any requests associated with a specific client made via the @link deviceRequest @/link methods. It will not abort requests made by other clients. + * @param options IOUSBHostIOSource::tAbortOptions + * @param withError IOReturn error value to return with the requests. The default value of kIOReturnAborted should be used. + * @return IOReturn result code + */ + IOReturn abortDeviceRequests(IOOptionBits options = IOUSBHostIOSource::kAbortAsynchronous, IOReturn withError = kIOReturnAborted); + + // Public pad slots for alternate setting and pipe management + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 60); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 61); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 62); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 63); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 64); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 65); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 66); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 67); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 68); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 69); + +protected: + enum + { + kInitIORetries = 3, + kInitIORetryInterval = 100, + kDestroyPipesOptionAll = StandardUSBBit(0) + }; + + virtual void updateMatchingProperties(); + + virtual IOReturn selectAlternateSettingGated(uint8_t bAlternateSetting); + + virtual IOReturn copyPipeGated(uint8_t address, IOUSBHostPipe*& result); + + virtual void closePipes(); + virtual IOReturn closePipesGated(); + + // Must be called on the command gate + virtual void pipeLockLock(); + virtual void pipeLockUnlock(); + + + OSMetaClassDeclareReservedUsed(IOUSBHostInterface, 70); + virtual void destroyPipes(IOOptionBits options = 0); + + OSMetaClassDeclareReservedUsed(IOUSBHostInterface, 71); + virtual IOReturn destroyPipesGated(IOOptionBits options); + + // Protected pad slots for alternate setting and pipe management + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 72); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 73); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 74); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 75); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 76); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 77); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 78); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 79); + +protected: + IOUSBHostPipe* _pipeList[kUSBHostMaxPipes]; + + bool _pipeLock; + + const StandardUSB::ConfigurationDescriptor* _configurationDescriptor; + const StandardUSB::InterfaceDescriptor* _interfaceDescriptor; + IOUSBHostDevice* _device; + + uint32_t _debugLoggingMask; + uint32_t _locationID; // TODO: Initialize this for tracepoints + +#pragma mark Miscellaneous +public: + /*! @functiongroup Provider access */ + + /*! + * @brief Return the parent/provider IOUSBHostDevice object of this interface. + * @return IOUSBHostDevice pointer + */ + virtual IOUSBHostDevice* getDevice() const; + + /*! + * @brief Return the current frame number of the USB controller + * @description This method will return the current frame number of the USB controller, omitting microframe. This is most useful for scheduling future isochronous requests. + * @param theTime If not NULL, this will be updated with the current system time + * @return The current frame number + */ + virtual uint64_t getFrameNumber(AbsoluteTime* theTime = NULL) const; + + /*! + * @brief Return the current port status + * @discussion Combination of tUSBHostPortStatus values + * @return port status + */ + virtual uint32_t getPortStatus() const; + + /*! + * @brief Allocate a buffer to be used for I/O + * @discussion This method will allocate an IOBufferMemoryDescriptor optimized for use by the underlying controller hardware. A buffer allocated by this method will not be bounced to perform DMA operations. + * @param options kIODirectionOut, kIODirectionIn to set the direction of the I/O transfer. + * @param capacity Size of the buffer to allocate + * @return Pointer to an IOBufferMemoryDescriptor if successful, otherwise NULL + */ + virtual IOBufferMemoryDescriptor* createIOBuffer(IOOptionBits options, mach_vm_size_t capacity); + + // Public pad slots for miscellaneous + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 80); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 81); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 82); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 83); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 84); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 85); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 86); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 87); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 88); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 89); + +protected: + // Protected pad slots for miscellaneous + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 90); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 91); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 92); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 93); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 94); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 95); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 96); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 97); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 98); + OSMetaClassDeclareReservedUnused(IOUSBHostInterface, 99); + +protected: + struct tExpansionData + { + uint16_t _persistentOutEndpointMask; + uint16_t _persistentInEndpointMask; + bool _allPipesDestroyed; + }; + tExpansionData* _expansionData; +}; + +#endif // IOUSBHostFamily_IOUSBHostInterface_h diff --git a/QualcommWireless/include/IOKit/usb/IOUSBHostPipe.h b/QualcommWireless/include/IOKit/usb/IOUSBHostPipe.h new file mode 100644 index 0000000..03d2495 --- /dev/null +++ b/QualcommWireless/include/IOKit/usb/IOUSBHostPipe.h @@ -0,0 +1,641 @@ +/* + * Copyright (c) 1998-2016 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +/*! + @header IOUSBHostPipe.h + @brief IOUSBHostPipe is an object representing a USB endpoint. + @discussion + + <h3>IOUSBPipe Migration</h3> + + IOUSBHostPipe serves as a replacement for IOUSBPipe. Clients that previously used an IOUSBPipe can use the following guide to convert to IOUSBHostPipe. + + <code>virtual IOReturn IOUSBPipe::Abort(IOOptionBits, IOReturn);</code><br> + Replacement: <code>abort(...);</code> + + <code>virtual IOReturn IOUSBPipe::Reset();<br> + virtual IOReturn IOUSBPipe::ClearStall();</code><br> + Replacement: <code>clearStall(false)</code> + + <code>virtual IOReturn IOUSBPipe::ClearPipeStall(bool);</code><br> + Replacement: <code>clearStall(...);</code> + + <code>virtual IOReturn IOUSBPipe::Read(IOMemoryDescriptor*, IOUSBCompletion*, UInt32*);<br> + virtual IOReturn IOUSBPipe::Read(IOMemoryDescriptor*, UInt32, UInt32, IOUSBCompletion*, UInt32*);<br> + virtual IOReturn IOUSBPipe::Read(IOMemoryDescriptor*, UInt32, UInt32, IOByteCount, IOUSBCompletion*, UInt32*);<br> + virtual IOReturn IOUSBPipe::Read(IOMemoryDescriptor*, UInt32, UInt32, IOByteCount, IOUSBCompletionWithTimeStamp*, UInt32*);<br> + virtual IOReturn IOUSBPipe::Write(IOMemoryDescriptor*, UInt32, UInt32, IOUSBCompletion*);<br> + virtual IOReturn IOUSBPipe::Write(IOMemoryDescriptor*, UInt32, UInt32, IOByteCount, IOUSBCompletion*);<br> + virtual IOReturn IOUSBPipe::Write(IOMemoryDescriptor*, IOUSBCompletion*);<br> + virtual IOReturn IOUSBPipe::Read(IOMemoryDescriptor*, UInt64, UInt32, IOUSBIsocFrame*, IOUSBIsocCompletion*);<br> + virtual IOReturn IOUSBPipe::Read(IOMemoryDescriptor*, UInt64, UInt32, IOUSBLowLatencyIsocFrame*, IOUSBLowLatencyIsocCompletion*, UInt32);<br> + virtual IOReturn IOUSBPipe::Write(IOMemoryDescriptor*, UInt64, UInt32, IOUSBIsocFrame*, IOUSBIsocCompletion*);<br> + virtual IOReturn IOUSBPipe::Write(IOMemoryDescriptor*, UInt64, UInt32, IOUSBLowLatencyIsocFrame*, IOUSBLowLatencyIsocCompletion*, UInt32);</code><br> + Replacement: <code>io(...);</code> + + <code>virtual IOReturn IOUSBPipe::ControlRequest(IOUSBDevRequestDesc*, IOUSBCompletion*, UInt32, UInt32);<br> + virtual IOReturn IOUSBPipe::ControlRequest(IOUSBDevRequest*, IOUSBCompletion*);<br> + virtual IOReturn IOUSBPipe::ControlRequest(IOUSBDevRequestDesc*, UInt32, UInt32, IOUSBCompletion*);<br> + virtual IOReturn IOUSBPipe::ControlRequest(IOUSBDevRequest*, UInt32, UInt32, IOUSBCompletion*);</code><br> + Replacement: <code>controlRequest(...);</code> + + <code>virtual const IOUSBController::Endpoint* IOUSBPipe::GetEndpoint();<br> + virtual UInt8 IOUSBPipe::GetDirection();<br> + virtual UInt8 IOUSBPipe::GetType();<br> + virtual UInt8 IOUSBPipe::GetEndpointNumber();<br> + virtual UInt16 IOUSBPipe::GetMaxPacketSize();<br> + virtual UInt8 IOUSBPipe::GetInterval();</code><br> + Replacement: Use <code>getEndpointDescriptor()</code>, <code>getSuperSpeedEndpointCompanionDescriptor()</code>, and <code>getDescriptors()</code> with <code>StandardUSB::getEndpoint*</code> methods to retrieve endpoint characteristics + + <code>virtual tUSBHostDeviceAddress IOUSBPipe::GetAddress();</code><br> + Replacement: <code>getDeviceAddress();</code> + + <code>virtual UInt8 IOUSBPipe::GetSpeed();</code><br> + Replacement: <code>getSpeed();</code> + + <code>virtual IOReturn IOUSBPipe::GetPipeStatus();</code><br> + Replacement: If an endpoint is halted, new IO requests will be rejected with an appropriate error until the condition is cleared. + + <code>virtual IOReturn IOUSBPipe::SetPipePolicy(UInt16 maxPacketSize, UInt8 maxInterval);</code><br> + Replacement: <code>adjustPipe(...);</code> + + <h3>IOUSBPipeV2 Migration</h3> + + IOUSBPipeV2 implemented interfaces for USB 3.0 streaming endpoint support. IOUSBHostPipe provides interfaces to enable or disable streaming, and IOUSBHostStream provides interfaces to perform streaming IO. + + <code>virtual IOReturn IOUSBPipeV2::CreateStreams(UInt32);</code><br> + Replacement: <code>enableStreams();</code> and <code>disableStreams();</code> + + <code>virtual IOReturn IOUSBPipeV2::Read(UInt32, IOMemoryDescriptor*, UInt32, UInt32, IOByteCount, IOUSBCompletion*, IOByteCount*);<br> + virtual IOReturn IOUSBPipeV2::Write(UInt32, IOMemoryDescriptor*, UInt32, UInt32, IOByteCount, IOUSBCompletion*);<br> + virtual IOReturn IOUSBPipeV2::Abort(UInt32, IOOptionBits, IOReturn);</code><br> + Replacement: Use <code>copyStream</code> and IOUSBHostStream interfaces to perform IO to a streaming endpoint. + + <code>virtual UInt32 IOUSBPipeV2::GetConfiguredStreams();</code><br> + Replacement: none + + <code>virtual UInt32 IOUSBPipeV2::SupportsStreams();</code><br> + Replacement: <code>StandardUSB::getEndpointMaxStreams(...);</code> + + <code>virtual const IOUSBSuperSpeedEndpointCompanionDescriptor* IOUSBPipeV2::GetSuperSpeedEndpointCompanionDescriptor();</code><br> + Replacement: <code>getSuperSpeedEndpointCompanionDescriptor(...);</code> + + <code>virtual UInt8 IOUSBPipeV2::GetMult();</code><br> + Replacement: <code>StandardUSB::getEndpointMult(...);</code> + Refer to documentation for this method, as it may not return the same values as <code>IOUSBPipeV2::GetMult()</code>. + + <code>virtual UInt8 IOUSBPipeV2::GetMaxBurst();<br> + virtual UInt16 IOUSBPipeV2::GetBytesPerInterval();</code><br> + Replacement: <code>StandardUSB::getEndpointBurstSize(...)</code> or <code>StandardUSB::getEndpointBurstSize32(...)</code>. Refer to documentation for the replacement methods, as they may not return the same values as <code>IOUSBPipeV2::GetMaxBurst()</code> or <code>IOUSBPipeV2::GetBytesPerInterval;</code> + */ + +#ifndef IOUSBHostFamily_IOUSBHostPipe_h +#define IOUSBHostFamily_IOUSBHostPipe_h + +#include <IOKit/IOService.h> +#include <IOKit/IOMemoryDescriptor.h> + +#include <IOKit/usb/StandardUSB.h> +#include <IOKit/usb/IOUSBHostFamily.h> +#include <IOKit/usb/IOUSBHostIOSource.h> +#include <IOKit/usb/IOUSBHostStream.h> + +#if TARGET_OS_OSX +#include <USBDriverKit/IOUSBHostPipe.h> +#endif + +class IOUSBHostInterface; +class AppleUSBHostController; + +/*! + * @class IOUSBHostPipe + * @brief The OSObject representing a USB endpoint + * @discussion This class provides functionality to transfer data across USB. Function drivers should not subclass IOUSBHostPipe. + */ +class __IOUSBHOSTFAMILY_DEPRECATED IOUSBHostPipe : public IOUSBHostIOSource +{ + friend class IOUSBHostInterface; + friend class IOUSBHostDevice; + friend class AppleUSBHostController; + friend class AppleUSBIORequest; + +#if TARGET_OS_OSX + OSDeclareDefaultStructorsWithDispatch(IOUSBHostPipe) +#else + OSDeclareDefaultStructors(IOUSBHostPipe) +#endif + +public: + /*! + * @struct StandardUSBDescriptors + * @brief Encapsulates descriptors for a single endpoint + * @discussion The StandardUSBDescriptors struct is used to intialize and adjust pipes in the system. The bcdUSB member must be initialized to the USB revision supported by the device. Acceptable values are 0x0110, 0x0200, 0x0300, 0x0310. The descriptor member must always be initialized with a pointer to a valid endpoint descriptor. The ssCompanionDescriptor and sspCompanionDescriptor members may be required for bcdUSB versions 0x0300 and greater, depending on device operating speed and values set in the descriptors. See USB 3.1 ¤ 9.5 for more information on when these descriptors may be required. + */ + struct StandardUSBDescriptors + { + uint16_t bcdUSB; + const StandardUSB::EndpointDescriptor* descriptor; + const StandardUSB::SuperSpeedEndpointCompanionDescriptor* ssCompanionDescriptor; + const StandardUSB::SuperSpeedPlusIsochronousEndpointCompanionDescriptor* sspCompanionDescriptor; + }; + + /* + * @brief Factory method for creating an IOUSBHostPipe object + * @discussion This method should not be called by function drivers. To create an IOUSBHostPipe, use IOUSBHostInterface::copyPipe(...) + * @param descriptor EndpointDescriptor for the endpoint + * @param companionDescriptor SuperSpeedEndpointCompanionDescriptor for the endpoint, or NULL + * @param controller AppleUSBHostController to which the USB endpoint is associated + * @param device IOUSBHostDevice to which this endpoint belongs, or NULL + * @param interface IOUSBHostInterface to which this endpoint belongs, or NULL + * @param speed Operational speed of the device + * @param address tUSBHostDeviceAddress that has been allocated by the controller + * @return Pointer to an IOUSBHostPipe object if successful, otherwise NULL + */ + static IOUSBHostPipe* withDescriptorsAndOwners(const StandardUSB::EndpointDescriptor* descriptor, + const StandardUSB::SuperSpeedEndpointCompanionDescriptor* companionDescriptor, + AppleUSBHostController* controller, + IOUSBHostDevice* device, + IOUSBHostInterface* interface, + UInt8 speed, + tUSBHostDeviceAddress address); + +protected: + virtual bool initWithDescriptorsAndOwners(const StandardUSB::EndpointDescriptor* descriptor, + const StandardUSB::SuperSpeedEndpointCompanionDescriptor* companionDescriptor, + AppleUSBHostController* controller, + IOUSBHostDevice* device, + IOUSBHostInterface* interface, + UInt8 speed, + tUSBHostDeviceAddress address); + +#pragma mark IOUSBHostIOSource overrides +public: + virtual void free() APPLE_KEXT_OVERRIDE; + + /*! @functiongroup IO + * @discussion All I/O calls will synchronize with the workloop. Furthermore, all completion callbacks will also synchronize with the workloop. Therefore, when using the asynchronous I/O methods it is most performant to make subsequent calls from completion callback as the workloop lock will already be owned. + */ + + /*! + * @brief Abort pending I/O requests. + * @discussion See IOUSBHostIOSource::abort for documentation + */ + virtual IOReturn abort(IOOptionBits options = kAbortAsynchronous, IOReturn withError = kIOReturnAborted, IOService* forClient = NULL) APPLE_KEXT_OVERRIDE; + +protected: + virtual IOReturn openGated() APPLE_KEXT_OVERRIDE; + virtual IOReturn closeGated() APPLE_KEXT_OVERRIDE; + virtual IOReturn destroyGated() APPLE_KEXT_OVERRIDE; + virtual IOReturn abortGated(IOOptionBits options, IOReturn withError, IOService* forClient) APPLE_KEXT_OVERRIDE; + virtual UInt32 getOutstandingIO(IOService* forClient) APPLE_KEXT_OVERRIDE; + virtual UInt32 adjustOutstandingIO(IOService* forClient, SInt32 increment) APPLE_KEXT_OVERRIDE; + + // Protected pad slots for IOUSBHostIOSource overrides + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 0); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 1); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 2); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 3); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 4); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 5); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 6); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 7); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 8); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 9); + +protected: + UInt8 _speed; + IOUSBHostInterface* _interface; + +#pragma mark Descriptors and policies +public: + /*! + * @functiongroup Descriptors + */ + + /*! + * @brief Options for <code>getEndpointDescriptor</code>, <code>getSuperSpeedEndpointCompanionDescriptor</code>, and <code>getDescriptors</code> + * + * @constant kGetEndpointDescriptorOriginal - Original descriptor used when creating the pipe + * @constant kGetEndpointDescriptorCurrentPolicy - Descriptor controlling the current endpoint policy, including changes made via the <code>adjustPolicy</code> method. + */ + enum tGetEndpointDescriptorOptions + { + kGetEndpointDescriptorOriginal = 0, + kGetEndpointDescriptorCurrentPolicy + }; + + /*! + * @brief Retrieve the EndpointDescriptor associated with this object + * @param type tGetEndpointDescriptorOptions indicating which descriptor to retrieve + * @return EndpointDescriptor pointer if successful, otherwise NULL + */ + virtual const StandardUSB::EndpointDescriptor* getEndpointDescriptor(tGetEndpointDescriptorOptions type = kGetEndpointDescriptorCurrentPolicy); + + /*! + * @brief Retrieve the SuperSpeedEndpointCompanionDescriptor associated with this object + * @param type tGetEndpointDescriptorOptions indicating which descriptor to retrieve + * @return SuperSpeedEndpointCompanionDescriptor pointer if successful, otherwise NULL + */ + virtual const StandardUSB::SuperSpeedEndpointCompanionDescriptor* getSuperSpeedEndpointCompanionDescriptor(tGetEndpointDescriptorOptions type = kGetEndpointDescriptorCurrentPolicy); + + /*! @functiongroup Policies */ + /*! + * @brief Adjust behavior of periodic endpoints to consume a different amount of bus bandwidth + * @discussion Periodic (interrupt and isochronous) endpoints reserve bus bandwidth when they are created, which takes into account max packet size, burst size, and the endpoint service interval. If a function driver knows the endpoint will not use all of the allocated bandwidth, the <code>adjustPolicy</code> method may be used to reduce the bandwidth reserved for the endpoint. The original endpoint descriptors should be copied and modified to adjust max packet size, mult, burst, and interval, and then passed to <code>adjustPolicy</code>. The altered descriptors must pass <code>StandardUSB::validateEndpointDescriptor(...)</code> for policy changes to be processed. + * @param endpointDescriptor Pointer to an EndpointDescriptor describing the new endpoint policy + * @param companionDescriptor Pointer to a SuperSpeedEndpointCompanionDescriptor describing the bandwidth request + * @return IOReturn result code + */ + virtual IOReturn adjustPipe(const StandardUSB::EndpointDescriptor* endpointDescriptor, const StandardUSB::SuperSpeedEndpointCompanionDescriptor* companionDescriptor); + + /*! + * @brief Sets the desired idle timeout for the pipe + * @discussion When a bulk or interrupt pipe is actively servicing an IO request, it will be considered "busy" for idleTimeoutMs. For a more complete discussion of idle policies, refer to "Pausing IO" in IOUSBHostFamily.h. + * @param idleTimeoutMs The amount of time, in milliseconds, before an active transfer is considered idle. If 0 the pipe will not be considered idle if there is an IO request enqueued. + * @return IOReturn result code + */ + virtual IOReturn setIdlePolicy(uint32_t idleTimeoutMs); + + /*! + * @brief Retrieve the current idle timeout for the pipe + * @return Current idle timeout in milliseconds + */ + virtual uint32_t getIdlePolicy(); + + /*! @functiongroup IO */ + /*! + * @brief Clear the halt condition of the pipe. + * @discussion When a bulk or interrupt USB endpoint encounters any IO error other than a timeout, it transitions to a Halted state which must be cleared to perform additional IO on the endpoint. This method will clear the halted condition for the endpoint, including sending a CLEAR_TT_BUFFER control request (USB 2.0 11.24.2.3) to an intermediate hub if required. All pending IO on the endpoint will be aborted, and the data toggle for the endpoint will also be reset. To keep the device's data toggle synchronized with the host's data toggle, it is recommended that the withRequest parameter is always set to true, which causes the <code>clearStall</code> call to send a CLEAR_FEATURE ENDPOINT_HALT (USB 2.0 9.4.1) command to the device. clearStall is not required for control endpoints. + * @param withRequest If true a CLEAR_FEATURE ENDPOINT_HALT (USB 2.0 9.4.1) will be sent to the device. + * + * @return IOReturn result code + */ + virtual IOReturn clearStall(bool withRequest); + + // Public pad slots for descriptors and policies + /*! @functiongroup Policies */ + OSMetaClassDeclareReservedUsed(IOUSBHostPipe, 10); + /*! + * @brief Adjust behavior of periodic endpoints to consume a different amount of bus bandwidth + * @discussion Periodic (interrupt and isochronous) endpoints reserve bus bandwidth when they are created, which takes into account max packet size, burst size, and the endpoint service interval. If a function driver knows the endpoint will not use all of the allocated bandwidth, the <code>adjustPolicy</code> method may be used to reduce the bandwidth reserved for the endpoint. The original endpoint descriptors should be copied and modified to adjust max packet size, mult, burst, and interval, and then passed to <code>adjustPolicy</code>. The altered descriptors must pass <code>StandardUSB::validateEndpointDescriptor(...)</code> for policy changes to be processed. + * @param descriptors Pointer to a StandardUSBDescriptors structure describing the new endpoint policy + * @return IOReturn result code + */ + virtual IOReturn adjustPipe(StandardUSBDescriptors* descriptors); + + /*! @functiongroup Descriptors */ + OSMetaClassDeclareReservedUsed(IOUSBHostPipe, 11); + /*! + * @brief Retrieve the descriptors associated with this object + * @param descriptors StandardUSBDescriptors pointer to populate + * @param type tGetEndpointDescriptorOptions indicating which descriptors to retrieve + * @return IOReturn result + */ + virtual IOReturn getDescriptors(StandardUSBDescriptors* descriptors, tGetEndpointDescriptorOptions type = kGetEndpointDescriptorCurrentPolicy); + + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 12); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 13); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 14); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 15); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 16); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 17); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 18); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 19); + +protected: + virtual IOReturn adjustPipeGated(const StandardUSB::EndpointDescriptor* endpointDescriptor, + const StandardUSB::SuperSpeedEndpointCompanionDescriptor* companionDescriptor); + + virtual IOReturn setIdlePolicyGated(uint32_t idleTimeoutMs); + virtual IOReturn getIdlePolicyGated(uint32_t& result); + + virtual IOReturn clearStallGated(bool withRequest); + + // Protected pad slots for descriptors and policies + OSMetaClassDeclareReservedUsed(IOUSBHostPipe, 20); + virtual IOReturn adjustPipeGatedV2(StandardUSBDescriptors* descriptors); + + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 21); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 22); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 23); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 24); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 25); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 26); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 27); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 28); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 29); + +protected: + const StandardUSB::EndpointDescriptor* _descriptor; + const StandardUSB::SuperSpeedEndpointCompanionDescriptor* _companionDescriptor; + const StandardUSB::SuperSpeedPlusIsochronousEndpointCompanionDescriptor* _sspCompanionDescriptor; + + StandardUSB::EndpointDescriptor _currentPolicyDescriptor; + StandardUSB::SuperSpeedEndpointCompanionDescriptor _currentPolicyCompanionDescriptor; + StandardUSB::SuperSpeedPlusIsochronousEndpointCompanionDescriptor _currentPolicySSPCompanionDescriptor; + + // Cached values + UInt32 _maxPacketSize; + UInt32 _burstSize; + + UInt32 _ioIdleTimeout; + +#pragma mark Control requests +public: + /*! @functiongroup IO */ + /*! + * @brief Enqueue a request on a control endpoint + * @discussion This method will enqueue an asynchronous request on a control endpoint. If successful, the provided completion routine will be called to report the status of the completed IO. + * @param forClient The service issuing the request. + * @param request Reference to a valid StandardUSB::DeviceRequest structure. The structure is copied and can therefore be stack-allocated. + * @param dataBuffer A void* or IOMemoryDescriptor* defining the memory to use for the request's data phase. + * @param completion Pointer to a IOUSBHostCompletion structure. This will be copied and can therefore be stack-allocated. + * @param completionTimeoutMs Timeout of the request in milliseconds. If 0, the request will never timeout. + * @return kIOReuturnSuccess if the completion will be called in the future, otherwise error + */ + virtual IOReturn controlRequest(IOService* forClient, StandardUSB::DeviceRequest& request, void* dataBuffer, IOUSBHostCompletion* completion, uint32_t completionTimeoutMs); + virtual IOReturn controlRequest(IOService* forClient, StandardUSB::DeviceRequest& request, IOMemoryDescriptor* dataBuffer, IOUSBHostCompletion* completion, uint32_t completionTimeoutMs); + + /*! + * @brief Send a request on a control endpoint + * @discussion This method will send a synchronous request on a control endpoint, and will not return until the request is complete. This method will acquire the owning device's workloop lock, and will call commandSleep to send the control request. + * @param forClient The service issuing the request. + * @param request Reference to a valid StandardUSB::DeviceRequest structure. + * @param dataBuffer A void* or IOMemoryDescriptor* defining the memory to use for the request's data phase. + * @param bytesTransferred A uint32_t reference which will be updated with the byte count of the completed data phase. + * @param completionTimeoutMs Timeout of the request in milliseconds. If 0, the request will never timeout. + * @return IOReturn value indicating the result of the IO request + */ + virtual IOReturn controlRequest(IOService* forClient, StandardUSB::DeviceRequest& request, void* dataBuffer, uint32_t& bytesTransferred, uint32_t completionTimeoutMs); + virtual IOReturn controlRequest(IOService* forClient, StandardUSB::DeviceRequest& request, IOMemoryDescriptor* dataBuffer, uint32_t& bytesTransferred, uint32_t completionTimeoutMs); + + // Public pad slots for control requests + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 30); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 31); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 32); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 33); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 34); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 35); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 36); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 37); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 38); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 39); + +protected: + struct tInternalControlRequestParameters + { + IOService* forClient; + StandardUSB::DeviceRequest* request; + void* rawBuffer; + IOMemoryDescriptor* descriptorBuffer; + uint32_t* bytesTransferred; + IOUSBHostCompletion* completion; + uint32_t completionTimeoutMs; + }; + virtual IOReturn controlRequestGated(tInternalControlRequestParameters& parameters); + + static void rawBufferControlRequestCompletion(void* target, void* parameter, IOReturn status, uint32_t bytesTransferred); + + // Protected pad slots for control requests + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 40); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 41); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 42); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 43); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 44); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 45); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 46); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 47); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 48); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 49); + +#pragma mark IO +public: + /*! + * @functiongroup IO + */ + + /*! + * @brief Enqueue a request on a bulk or interrupt endpoint + * @discussion See IOUSBHostIOSource::io for documentation + * @param completionTimeoutMs Must be 0 for interrupt endpoints. + */ + virtual IOReturn io(IOMemoryDescriptor* dataBuffer, uint32_t dataBufferLength, IOUSBHostCompletion* completion, uint32_t completionTimeoutMs = 0) APPLE_KEXT_OVERRIDE; + + /*! + * @brief Perform a request on a bulk or interrupt endpoint + * @discussion See IOUSBHostIOSource::io for documentation + * @param completionTimeoutMs Must be 0 for interrupt endpoints. + */ + virtual IOReturn io(IOMemoryDescriptor* dataBuffer, uint32_t dataBufferLength, uint32_t& bytesTransferred, uint32_t completionTimeoutMs = 0) APPLE_KEXT_OVERRIDE; + + /*! + * @brief Enqueue or perform a request on an isochronous endpoint + * @discussion + * This method is used to issue isochronous requests. The caller allocates and initializes an array of IOUSBHostIsochronousFrame structures, which is used to describe the frames that will be transferred. See @link IOUSBHostIsochronousFrame @/link for information regarding structure initialization requirements and usage. + * @param dataBuffer Pointer to a valid memory descriptor to be used as the backing store for the I/O. + * @param frameList Pointer first element in an IOUSBHostIsochronousFrame array. The array must contain at least frameListCount elements. + * @param frameListCount Number of elements in <code>frameList</code>. + * @param firstFrameNumber Frame number which this request should begin on. The current frame number can be queried via <code>IOUSHostDevice::getFrameNumber()</code> or <code>IOUSBHostInterface::getFrameNumber()</code>. If 0, the transfer will start on the next available frame (XHCI only). + * @param completion To create a synchronous I/O request, this parameter must be NULL. For an asynchronous request this paramater must be properly filled out prior to calling this method. If not NULL, this parameter will be copied and can therefore be stack-allocated. + * @return IOReturn result code + */ + virtual IOReturn io(IOMemoryDescriptor* dataBuffer, IOUSBHostIsochronousFrame* frameList, uint32_t frameListCount, uint64_t firstFrameNumber = 0, IOUSBHostIsochronousCompletion* completion = NULL); + + /*! + * @brief Enqueue a request on a bulk or interrupt endpoint + * @discussion See IOUSBHostIOSource::io for documentation + * @param completionTimeoutMs Must be 0 for interrupt endpoints. + */ + virtual IOReturn io(IOMemoryDescriptor* dataBuffer, uint32_t dataBufferLength, IOUSBHostBundledCompletion* completion, uint32_t completionTimeoutMs = 0) APPLE_KEXT_OVERRIDE; + + // Public pad slots for IO + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 50); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 51); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 52); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 53); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 54); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 55); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 56); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 57); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 58); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 59); + +protected: + virtual IOReturn isochronousIoGated(tInternalDataTransferParameters& parameters); + +#if TARGET_OS_OSX + static void asyncIOCompletionCallback(void* owner, void* parameter, IOReturn status, uint32_t bytesTransferred); + static void asyncIOCompletionCallbackBundled(void *owner, uint32_t ioCompletionCount, IOMemoryDescriptor** dataBufferArray, void** parameterArray, IOReturn* statusArray, uint32_t* actualByteCountArray); + static void asyncIsochIOCompletionCallback(void* owner, void* parameter, IOReturn status, IOUSBHostIsochronousFrame* frameList); +#endif + + // Protected pad slots for IO + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 60); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 61); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 62); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 63); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 64); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 65); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 66); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 67); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 68); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 69); + +#pragma mark Streams +public: + /*! + * @functiongroup Streams + * @discussion IOUSBHostPipe defines interfaces to enable and disable streams for an endpoint, and to create IOUSBHostStream objects. See IOUSBHostStream.h for additional documentation. + */ + + /*! + * @brief Enable streams for the IOUSBHostPipe + * @discussion This method changes the operational mode of the IOUSBHostPipe to allow streaming endpoint transfers, and must be called before copyStream will return any IOUSBHostStream objects. + * @return IOReturn result code. An error will be returned if the pipe, device, or underlying host controller does not support streams. + */ + virtual IOReturn enableStreams(); + + /*! + * @brief Disable streams for the IOUSBHostPipe + * @discussion This method changes the operational mode of the IOUSBHostPipe to disable streaming endpoint transfers. Calling this method will synchronously abort any outstanding calls on existing IOUSBHostStream objects, and therefore all stream contexts should first be set as non-active on the device via an out-of-band (class-defined) mechanism (USB 3.1 8.12.1.4). + * @return IOReturn result code. An error will be returned if streams were not enabled for this IOUSBHostPipe. + */ + virtual IOReturn disableStreams(); + + /*! + * @brief Return the stream associated with <code>streamID</code> + * @discussion This method will return the stream associated with <code>streamID</code>. If the stream doesn't exist yet it will be created. The caller must release the IOUSBHostStream when finished using it. <code>IOUSBHostPipe::enableStreams</code> must be called before this method will return a stream object. + * @param streamID Stream ID in the range of 1 to <code>max</code>, where <code>max</code> can be retrieved by calling <code>StandardUSB::getEndpointMaxStreams</code> with the endpoint descriptors. + * @return Pointer to a retain()ed IOUSBHostStream object or NULL. NULL may be returned if either the device or the underlying host controller do not support that stream ID. + */ + virtual IOUSBHostStream* copyStream(uint32_t streamID); + + // Public pad slots for streams + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 70); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 71); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 72); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 73); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 74); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 75); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 76); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 77); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 78); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 79); + +protected: + virtual IOReturn enableStreamsGated(); + + virtual IOReturn disableStreamsGated(); + + virtual IOReturn copyStreamGated(uint32_t streamID, IOUSBHostStream*& result); + + // Protected pad slots for streams + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 80); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 81); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 82); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 83); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 84); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 85); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 86); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 87); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 88); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 89); + +protected: + IOUSBHostStream** _streamArray; + bool _streamsEnabled; + +#pragma mark Miscellaneous +public: + /*! @functiongroup Provider interfaces */ + + /*! + * @brief Retrieve the device's operational speed + * @return tInternalUSBHostConnectionSpeed + */ + virtual uint8_t getSpeed() const; + + /*! + * @brief Retrieve the device's address + * @return Current address of the device + */ + virtual tUSBHostDeviceAddress getDeviceAddress() const; + + // Public pad slots for miscellaneous + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 90); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 91); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 92); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 93); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 94); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 95); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 96); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 97); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 98); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 99); + +protected: + struct tRawBufferControlRequestCompletionParameter + { + IOMemoryDescriptor* memoryDescriptor; + IOUSBHostCompletion clientCompletion; + }; + + // Protected pad slots for miscellaneous + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 100); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 101); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 102); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 103); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 104); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 105); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 106); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 107); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 108); + OSMetaClassDeclareReservedUnused(IOUSBHostPipe, 109); + + +private: + void destroyMemoryDescriptorRing(); + +#pragma mark Deprecated +public: + enum tPipeAbortOptions + { + kIOUSBPipeAbortAsync = IOUSBHostIOSource::kAbortAsynchronous, + kIOUSBPipeAbortSync = IOUSBHostIOSource::kAbortSynchronous + }; + + enum tUSBPipeState + { + kUSBPipeStateReady = IOUSBHostIOSource::kStateReady, + kUSBPipeStateRunningCompletions = IOUSBHostIOSource::kStateRunningCompletions, + kUSBPipeStateAborting = IOUSBHostIOSource::kStateAborting, + kUSBPipeStateInactive = IOUSBHostIOSource::kStateInactive + }; +}; + +#endif // IOUSBHostFamily_IOUSBHostPipe_h diff --git a/QualcommWireless/include/IOKit/usb/IOUSBHostStream.h b/QualcommWireless/include/IOKit/usb/IOUSBHostStream.h new file mode 100644 index 0000000..0efd1d8 --- /dev/null +++ b/QualcommWireless/include/IOKit/usb/IOUSBHostStream.h @@ -0,0 +1,135 @@ +/* + * Copyright (c) 1998-2016 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +/*! + @header IOUSBHostStream.h + @brief IOUSBHostStream is an object representing an individual stream within a streaming endpoint. + */ + +#ifndef IOUSBHostFamily_IOUSBHostStream_h +#define IOUSBHostFamily_IOUSBHostStream_h + +#include <IOKit/usb/IOUSBHostFamily.h> +#include <IOKit/usb/IOUSBHostIOSource.h> + +class IOUSBHostPipe; + +/*! + * @class IOUSBHostStream + * @brief The OSObject representing an individual stream within a USB endpoint + * @discussion This class provides functionality to transfer data across USB. Function drivers should not subclass IOUSBHostStream. + */ +class __IOUSBHOSTFAMILY_DEPRECATED IOUSBHostStream : public IOUSBHostIOSource +{ + OSDeclareDefaultStructors(IOUSBHostStream) + + friend class IOUSBHostPipe; + +public: + /*! + * @brief Factory method for creating an IOUSBHostStream object + * @discussion This method should not be called by function drivers. To create an IOUSBHostStream, use IOUSBHostPipe::copyStream(...) + * @param controller AppleUSBHostController to which the USB endpoint is associated + * @param device IOUSBHostDevice to which this endpoint belongs + * @param pipe IOUSBHostPipe to which this stream belongs + * @param streamID The stream ID for this instance + * @return Pointer to an IOUSBHostStream object if successful, otherwise NULL + */ + IOUSBHostStream* withOwnersAndStreamID(AppleUSBHostController* controller, IOUSBHostDevice* device, IOUSBHostPipe* pipe, uint32_t streamID); + + virtual void free() APPLE_KEXT_OVERRIDE; + + /*! + * @brief Abort pending I/O requests. + * @discussion See IOUSBHostIOSource::abort for documentation. A stream context must be set as non-active on the device via an out-of-band (class-defined) mechanism before this method is called (USB 3.1 8.12.1.4). A non-active stream will not be selected by the device to become the current stream on the endpoint. + */ + virtual IOReturn abort(IOOptionBits options = kAbortAsynchronous, IOReturn withError = kIOReturnAborted, IOService* forClient = NULL) APPLE_KEXT_OVERRIDE; + + /*! + * @brief Retrieve the IOUSBHostPipe to which this stream belongs + * @return IOUSBHostPipe pointer + */ + virtual IOUSBHostPipe* getPipe() const { return _pipe; } + + /*! + * @brief Retrieve the sream ID for this instance + * @return Stream ID + */ + virtual uint32_t getStreamID() const { return _streamID; } + + /*! + * @brief Enqueue a request on a stream + * @discussion See IOUSBHostIOSource::io for documentation + * @param completionTimeoutMs Must be 0 for streams. + */ + virtual IOReturn io(IOMemoryDescriptor* dataBuffer, uint32_t dataBufferLength, IOUSBHostCompletion* completion, uint32_t completionTimeoutMs = 0) APPLE_KEXT_OVERRIDE; + + /*! + * @brief Perform a request on a stream + * @discussion See IOUSBHostIOSource::io for documentation + * @param completionTimeoutMs Must be 0 for streams. + */ + virtual IOReturn io(IOMemoryDescriptor* dataBuffer, uint32_t dataBufferLength, uint32_t& bytesTransferred, uint32_t completionTimeoutMs = 0) APPLE_KEXT_OVERRIDE; + + // Public pad slots for future expansion + OSMetaClassDeclareReservedUnused(IOUSBHostStream, 0); + OSMetaClassDeclareReservedUnused(IOUSBHostStream, 1); + OSMetaClassDeclareReservedUnused(IOUSBHostStream, 2); + OSMetaClassDeclareReservedUnused(IOUSBHostStream, 3); + OSMetaClassDeclareReservedUnused(IOUSBHostStream, 4); + OSMetaClassDeclareReservedUnused(IOUSBHostStream, 5); + OSMetaClassDeclareReservedUnused(IOUSBHostStream, 6); + OSMetaClassDeclareReservedUnused(IOUSBHostStream, 7); + OSMetaClassDeclareReservedUnused(IOUSBHostStream, 8); + OSMetaClassDeclareReservedUnused(IOUSBHostStream, 9); + +protected: + virtual bool initWithOwnersAndStreamID(AppleUSBHostController* controller, IOUSBHostDevice* device, IOUSBHostPipe* pipe, uint32_t streamID); + + virtual IOReturn closeGated() APPLE_KEXT_OVERRIDE; + + virtual IOReturn abortGated(IOOptionBits options, IOReturn withError, IOService* forClient) APPLE_KEXT_OVERRIDE; + + // Protected pad slots for future expansion + OSMetaClassDeclareReservedUnused(IOUSBHostStream, 10); + OSMetaClassDeclareReservedUnused(IOUSBHostStream, 11); + OSMetaClassDeclareReservedUnused(IOUSBHostStream, 12); + OSMetaClassDeclareReservedUnused(IOUSBHostStream, 13); + OSMetaClassDeclareReservedUnused(IOUSBHostStream, 14); + OSMetaClassDeclareReservedUnused(IOUSBHostStream, 15); + OSMetaClassDeclareReservedUnused(IOUSBHostStream, 16); + OSMetaClassDeclareReservedUnused(IOUSBHostStream, 17); + OSMetaClassDeclareReservedUnused(IOUSBHostStream, 18); + OSMetaClassDeclareReservedUnused(IOUSBHostStream, 19); + +protected: + IOUSBHostPipe* _pipe; + uint32_t _streamID; +}; + +#endif diff --git a/QualcommWireless/include/IOKit/usb/IOUSBInterface.h b/QualcommWireless/include/IOKit/usb/IOUSBInterface.h new file mode 100644 index 0000000..da115ce --- /dev/null +++ b/QualcommWireless/include/IOKit/usb/IOUSBInterface.h @@ -0,0 +1,366 @@ +/* + * Copyright � 1998-2007, 2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOUSBINTERFACE_H +#define _IOKIT_IOUSBINTERFACE_H + +#include <IOKit/IOService.h> +#include <libkern/c++/OSData.h> + +#include <IOKit/usb/USB.h> +#include <IOKit/usb/IOUSBNub.h> +#include <IOKit/usb/IOUSBDevice.h> + +/*! + @class IOUSBInterface + @abstract The object representing an interface of a device on the USB bus. + @discussion This class provides functionality to find the pipes of an interface and + to read the descriptors associated with an interface. When an interface is open()ed, + all its pipes are created +*/ +class IOUSBInterface : public IOUSBNub +{ + friend class IOUSBInterfaceUserClientV2; + friend class IOUSBInterfaceUserClientV3; + friend class IOUSBDevice; + friend class IOUSBPipe; + friend class IOUSBPipeV2; + + OSDeclareDefaultStructors(IOUSBInterface) + +protected: + IOUSBPipe * _pipeList[kUSBMaxPipes]; + const IOUSBConfigurationDescriptor *_configDesc; + const IOUSBInterfaceDescriptor * _interfaceDesc; + IOUSBDevice * _device; + + // these variable are the parsed interface descriptor + UInt8 _bInterfaceNumber; + UInt8 _bAlternateSetting; + UInt8 _bNumEndpoints; + UInt8 _bInterfaceClass; + UInt8 _bInterfaceSubClass; + UInt8 _bInterfaceProtocol; + UInt8 _iInterface; + + struct ExpansionData { + IOCommandGate *_gate; + IOWorkLoop *_workLoop; + bool _needToClose; + IOLock * _pipeObjLock; // Deprecated + OSSet * _openClients; + UInt32 _RememberedStreams[kUSBMaxPipes]; + bool _openPending; + }; + ExpansionData * _expansionData; + + // private methods + virtual void ClosePipes(void); // close all pipes (except pipe zero) + virtual IOReturn CreatePipes(void); // open all pipes in the current interface/alt interface + virtual void SetProperties(void); // update my property table with the correct properties + + IOReturn ResetPipes(void); // reset all pipes (except pipe zero) (not virtual) + IOReturn AbortPipesGated(void); // abort all pipes (except pipe zero) (not virtual) + IOReturn ClosePipesGated(bool close); // Abort and close or unlink all pipes (except pipe zero) (not virtual) + IOUSBPipe* FindNextPipeGated(IOUSBPipe *current, IOUSBFindEndpointRequest *request, bool withRetain); + IOUSBPipe* GetPipeObjGated(UInt8 index); + IOReturn ReopenPipesGated(); // relink all pipes (except pipe zero) (not virtual) + void RememberStreamsGated(void); + IOReturn RecreateStreamsGated(void); + + // Return the "Full" MaxPacketSize, given an endpoint descriptor and a pointer to an sscd if there is one + // This will multiple the MPS in the ep by the mult and the burst which may or may not be present + UInt16 CalculateFullMaxPacketSize(IOUSBEndpointDescriptor *ed, IOUSBSuperSpeedEndpointCompanionDescriptor *sscd); + +public: + // static methods + static IOUSBInterface * withDescriptors(const IOUSBConfigurationDescriptor *cfDesc, const IOUSBInterfaceDescriptor *ifDesc); + static IOReturn CallSuperOpen(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3); + static IOReturn CallSuperClose(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3); + static IOReturn _ResetPipes(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3); + static IOReturn _AbortPipes(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3); + static IOReturn _ClosePipes(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3); + static IOReturn _FindNextPipe(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3); + static IOReturn _GetPipeObj(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3); + static IOReturn _ReopenPipes(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3); + static IOReturn _RememberStreams(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3); + static IOReturn _RecreateStreams(OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3); + + static UInt8 hex2char( UInt8 digit ); + + // IOService methods + virtual bool start(IOService * provider) APPLE_KEXT_OVERRIDE; + virtual bool handleOpen(IOService *forClient, IOOptionBits options = 0, void *arg = 0 ) APPLE_KEXT_OVERRIDE; + virtual bool handleIsOpen(const IOService *forClient) const APPLE_KEXT_OVERRIDE; + virtual bool open(IOService *forClient, IOOptionBits options = 0, void *arg = 0 ) APPLE_KEXT_OVERRIDE; + virtual void close(IOService *forClient, IOOptionBits options = 0) APPLE_KEXT_OVERRIDE; + virtual void handleClose(IOService *forClient, IOOptionBits options = 0) APPLE_KEXT_OVERRIDE; + virtual IOReturn message( UInt32 type, IOService * provider, void * argument = 0 ) APPLE_KEXT_OVERRIDE; + virtual bool finalize(IOOptionBits options) APPLE_KEXT_OVERRIDE; + virtual void stop(IOService * provider) APPLE_KEXT_OVERRIDE; + virtual bool terminate( IOOptionBits options = 0 ) APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; + virtual void joinPMtree ( IOService * driver ) APPLE_KEXT_OVERRIDE; + + // IOUSBInterface class methods + virtual bool init( const IOUSBConfigurationDescriptor *cfDesc, + const IOUSBInterfaceDescriptor *ifDesc); + /*! + @function FindNextAltInterface + return alternate interface descriptor satisfying the requirements specified in request, or NULL if there aren't any. + request is updated with the properties of the returned interface. + @param current interface descriptor to start searching from, NULL to start at alternate interface 0. + @param request specifies what properties an interface must have to match. + @result Pointer to a matching interface descriptor, or NULL if none match. + */ + LIBKERN_RETURNS_NOT_RETAINED virtual const IOUSBInterfaceDescriptor *FindNextAltInterface(const IOUSBInterfaceDescriptor *current, + IOUSBFindInterfaceRequest *request); + + /*! + @function FindNextPipe + Find a pipe of the interface that matches the requirements, either + starting from the beginning of the interface's pipe list or from a specified + pipe. + @param current Pipe to start searching from, NULL to start from beginning of list. + @param request Requirements for pipe to match, updated with the found pipe's + properties. + @result Pointer to the pipe, or NULL if no pipe matches the request. + */ + LIBKERN_RETURNS_NOT_RETAINED virtual IOUSBPipe *FindNextPipe(IOUSBPipe *current, IOUSBFindEndpointRequest *request); + + /*! + @function FindNextAssociatedDescriptor + Find the next descriptor of the requested type associated with the interface. + @param current Descriptor to start searching from, NULL to start from beginning of list. + @param type Descriptor type to search for, or kUSBAnyDesc to return any descriptor type. + @result Pointer to the descriptor, or NULL if no matching descriptors found. + */ + LIBKERN_RETURNS_NOT_RETAINED virtual const IOUSBDescriptorHeader * FindNextAssociatedDescriptor(const void *current, UInt8 type); + + /*! + @function SetAlternateInterface + Select the specified alternate interface. + @param forClient The client requesting the alternate setting. This client must have the interface open in order to perform the request. + @param alternateSetting Alternate setting (from the alternate interface's interface descriptor). + @result exclusive access error if the interface is not open. otherwise the result of the transaction + */ + virtual IOReturn SetAlternateInterface(IOService *forClient, UInt16 alternateSetting); + + /*! + @function GetPipeObj + returns a handle to the pipe at the corresponding index + @param index value from zero to kUSBMaxPipes-1 + @result The IOUSBPipe object. Note that the client does not own a reference to this pipe, so the client should retain() the IOUSBPipe object if necessary. + */ + virtual IOUSBPipe *GetPipeObj(UInt8 index); + /*! + @function GetConfigValue + returns the device configuration value for the interface + @result The device configuration value. + */ + virtual UInt8 GetConfigValue(); + /*! + @function GetDevice + returns the device the interface is part of. + @result Pointer to the IOUSBDevice object which is the parent of this IOUSBInterface object. + */ + virtual IOUSBDevice *GetDevice(); + /*! + @function GetInterfaceNumber + returns the zero based value identifying the index in the array of concurrent + interfaces supported by the current configuration + @result the interface index + */ + virtual UInt8 GetInterfaceNumber(); + /*! + @function GetAlternateSetting + returns the alternate setting for this interface. + @result the alternate setting + */ + virtual UInt8 GetAlternateSetting(); + /*! + @function GetNumEndpoints + returns the number of endpoints used by this interface (excluding + device endpoint zero. If the value is zero, this interface only + uses endpoint zero. + @result the number of endpoints + */ + virtual UInt8 GetNumEndpoints(); + /*! + @function GetInterfaceClass + returns the class code for this interface (assigned by the USB) + a value of zero is reserved + if the value is FFh, the interface class is vendor-specific + all other values are reserved for assignment by the USB + @result the interface class + */ + virtual UInt8 GetInterfaceClass(); + /*! + @function GetInterfaceSubClass + returns the subclass code (assigned by the USB). + These codes are qualified by the value returned by GetInterfaceClass + @result the interface subclass + */ + virtual UInt8 GetInterfaceSubClass(); + /*! + @function GetInterfaceProtocol + returns the protocol code (assigned by the USB). + @result the interface index + */ + virtual UInt8 GetInterfaceProtocol(); + /*! + @function GetInterfaceStringIndex + returns the index of the string descriptor describing the interface + @result the string index + */ + virtual UInt8 GetInterfaceStringIndex(); + + /*! + @function DeviceRequest + @abstract Sends a control request to the default control pipe in the device (pipe zero) + @param request The parameter block to send to the device + @param completion Function to call when request completes. If omitted then + DeviceRequest() executes synchronously, blocking until the request is complete. If the request is asynchronous, the client must make sure that + the IOUSBDevRequest is not released until the callback has occurred. + */ + virtual IOReturn DeviceRequest(IOUSBDevRequest *request, IOUSBCompletion *completion = 0); + + /*! + @function DeviceRequest + @abstract Sends a control request to the default control pipe in the device (pipe zero) + @param request The parameter block to send to the device (with the pData as an IOMemoryDesriptor) + @param completion Function to call when request completes. If omitted then + DeviceRequest() executes synchronously, blocking until the request is complete. If the request is asynchronous, the client must make sure that + the IOUSBDevRequest is not released until the callback has occurred. + */ + virtual IOReturn DeviceRequest(IOUSBDevRequestDesc *request, IOUSBCompletion *completion = 0); + + virtual bool matchPropertyTable(OSDictionary * table, SInt32 *score) APPLE_KEXT_OVERRIDE; + + OSMetaClassDeclareReservedUsed(IOUSBInterface, 0); + /*! + @function GetEndpointProperties + @abstract Returns the properties of an endpoint, possibly in an alternate interface. + @param alternateSetting specifies the desired alternate setting + @param endpointNumber specifies the endpoint number + @param direction specifies the direction (kUSBIn, kUSBOut) + @param transferType a pointer to hold the transfer type (kUSBControl, kUSBBulk, etc.) of the endpoint if found. + @param maxPacketSize a pointer to hold the maxPacketSize in the endpoint descriptor. + @param interval a pointer to hold the interval value in the endpoint descriptor. + @result returns kIOReturnSuccess if the endpoint is found, and kIOUSBEndpointNotFound if it is not. + */ + virtual IOReturn GetEndpointProperties(UInt8 alternateSetting, UInt8 endpointNumber, UInt8 direction, UInt8 *transferType, UInt16 *maxPacketSize, UInt8 *interval); + + + OSMetaClassDeclareReservedUsed(IOUSBInterface, 1); + /*! + @function FindNextPipe + Find a pipe of the interface that matches the requirements, either + starting from the beginning of the interface's pipe list or from a specified + pipe. + @param current Pipe to start searching from, NULL to start from beginning of list. + @param request Requirements for pipe to match, updated with the found pipe's + properties. + @param withRetain Pass true to retain and the client should release it later after its use. + @result Pointer to the pipe, or NULL if no pipe matches the request. + */ + virtual IOUSBPipe* FindNextPipe(IOUSBPipe *current, IOUSBFindEndpointRequest *request, bool withRetain); + + OSMetaClassDeclareReservedUsed(IOUSBInterface, 2); + /*! + @function RememberStreams. + Make a note of which pipes have streams, so they can be recreated later. + @result returns kIOReturnSuccess if sucessful. + */ + virtual IOReturn RememberStreams(void); + + OSMetaClassDeclareReservedUsed(IOUSBInterface, 3); + /*! + @function RecreateStreams + Recreate the remembered streams after a device has been reset. + @result returns kIOReturnSuccess if sucessful. + */ + virtual IOReturn RecreateStreams(void); + + OSMetaClassDeclareReservedUsed(IOUSBInterface, 4); + virtual void UnlinkPipes(void); // delete the UIM endpoint from the pipe + + OSMetaClassDeclareReservedUsed(IOUSBInterface, 5); + virtual void ReopenPipes(void); // open all pipes in the current interface/alt interface + + OSMetaClassDeclareReservedUsed(IOUSBInterface, 6); + /*! + @function GetEndpointPropertiesV3 + @abstract Returns the properties of an endpoint, possibly in an alternate interface, including any information from the SuperSpeed Companion Descriptor + @param endpointProperties Pointer to a IOUSBEndpointProperties structure that upon success will contain the information for the endpoint. The bVersion field + needs to be initialized with the structure version (see USBEndpointVersion enum in USB.h). The bAlternateSetting, bEndpointNumber, and bDirection (kUSBIn, kUSBOut) MUST also be filled + in with the values for the desired descriptor. Not that the bMaxStreams value for Bulk endpoints is the value specified by the bmAttributes field in the SuperSpeed companion descriptor. + @result returns kIOReturnSuccess if the endpoint is found, and kIOUSBEndpointNotFound if it is not. + */ + virtual IOReturn GetEndpointPropertiesV3(IOUSBEndpointProperties *endpointProperties); + + OSMetaClassDeclareReservedUsed(IOUSBInterface, 7); + /*! + @function GetInterfaceStatus + @abstract Returns the result of issuing a GET_STATUS request on the device for this interface. + @param status Pointer to a USBStatus type which will contain the results of the operation. + @result returns kIOReturnSuccess if the request is completed successfully, otherwise returns the result of the Device Request. + */ + virtual IOReturn GetInterfaceStatus(USBStatus *status); + + OSMetaClassDeclareReservedUsed(IOUSBInterface, 8); + /*! + @function SetFunctionSuspendFeature + @abstract Issues a SET_FEATURE(FUNCTION_SUSPEND) to the interface. + @param options The suspend options passed to the Device Request. + @result returns kIOReturnSuccess if the request is completed successfully, otherwise returns the result of the Device Request. + */ + virtual IOReturn SetFunctionSuspendFeature(UInt8 options); + + OSMetaClassDeclareReservedUsed(IOUSBInterface, 9); + /*! + @function EnableRemoteWake + @abstract Will enable or disable the USB 3.0 remote wake function for the interface + @param enable Whether we enable (true) or disable (false) the remote wake.. + @result returns kIOReturnSuccess if the request is completed successfully, otherwise returns the result of the Device Request to set the feature. + */ + virtual IOReturn EnableRemoteWake(bool enable); + + + OSMetaClassDeclareReservedUnused(IOUSBInterface, 10); + OSMetaClassDeclareReservedUnused(IOUSBInterface, 11); + OSMetaClassDeclareReservedUnused(IOUSBInterface, 12); + OSMetaClassDeclareReservedUnused(IOUSBInterface, 13); + OSMetaClassDeclareReservedUnused(IOUSBInterface, 14); + OSMetaClassDeclareReservedUnused(IOUSBInterface, 15); + OSMetaClassDeclareReservedUnused(IOUSBInterface, 16); + OSMetaClassDeclareReservedUnused(IOUSBInterface, 17); + OSMetaClassDeclareReservedUnused(IOUSBInterface, 18); + OSMetaClassDeclareReservedUnused(IOUSBInterface, 19); + +protected: + + +}; + +#endif diff --git a/QualcommWireless/include/IOKit/usb/IOUSBNub.h b/QualcommWireless/include/IOKit/usb/IOUSBNub.h new file mode 100644 index 0000000..41ee718 --- /dev/null +++ b/QualcommWireless/include/IOKit/usb/IOUSBNub.h @@ -0,0 +1,85 @@ +/* + * Copyright © 1998-2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOUSBNUB_H +#define _IOKIT_IOUSBNUB_H + +#include <IOKit/IOService.h> +#include <libkern/c++/OSData.h> +#include <IOKit/IOMemoryDescriptor.h> + +#include <IOKit/usb/USB.h> + +extern const OSSymbol *gUSBVendorID; +extern const OSSymbol *gUSBProductID; +extern const OSSymbol *gUSBInterfaceNumber; +extern const OSSymbol *gUSBConfigurationValue; +extern const OSSymbol *gUSBDeviceReleaseNumber; +extern const OSSymbol *gUSBInterfaceClass; +extern const OSSymbol *gUSBInterfaceSubClass; +extern const OSSymbol *gUSBInterfaceProtocol; +extern const OSSymbol *gUSBProductIDMask; +extern const OSSymbol *gUSBDeviceClass; +extern const OSSymbol *gUSBDeviceSubClass; +extern const OSSymbol *gUSBDeviceProtocol; + +class IOUSBController; +class IOUSBPipe; + +/* + IOUSBNub + Super class for for IOUSBDevice and IOUSBInterface. + */ +class IOUSBNub : public IOService +{ + OSDeclareDefaultStructors(IOUSBNub) + +public: + static void initialize(); + + // IOKit method + + virtual bool USBCompareProperty(OSDictionary * matching, const OSSymbol * key ); + + bool IsWildCardMatch( OSDictionary * matching, const char * key ); + bool USBComparePropertyWithMask( OSDictionary *matching, const char *key, const char * maskKey ); + bool USBComparePropertyInArray( OSDictionary *matching, const char *arrayName, const char * key, UInt32 * theProductIDThatMatched ); + bool USBComparePropertyInArrayWithMask( OSDictionary *matching, const char *arrayName, const char * key, const char * maskKey, UInt32 * theProductIDThatMatched ); + +}; + +#ifdef __cplusplus +extern "C" { +#endif + +void printDescriptor(const IOUSBDescriptorHeader *desc); +void printDeviceDescriptor(const IOUSBDeviceDescriptor *desc); +void printConfigDescriptor(const IOUSBConfigurationDescriptor *cd); +void printEndpointDescriptor(const IOUSBEndpointDescriptor *ed); +void printInterfaceDescriptor(const IOUSBInterfaceDescriptor *id); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/QualcommWireless/include/IOKit/usb/IOUSBPipe.h b/QualcommWireless/include/IOKit/usb/IOUSBPipe.h new file mode 100644 index 0000000..3979c11 --- /dev/null +++ b/QualcommWireless/include/IOKit/usb/IOUSBPipe.h @@ -0,0 +1,397 @@ +/* + * Copyright � 1998-2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOUSBPIPE_H +#define _IOKIT_IOUSBPIPE_H + +#include <IOKit/IOService.h> +#include <IOKit/IOMemoryDescriptor.h> + +#include <IOKit/usb/USB.h> +#include <IOKit/usb/IOUSBController.h> +#include <IOKit/usb/IOUSBControllerV2.h> + +class IOUSBInterface; + +#define kAppleUSBSSIsocContinuousFrame 0xFFFFFFFFFFFFFFFEull + +/*! + @class IOUSBPipe + @abstract The object representing an open pipe for a device. +*/ +class IOUSBPipe : public OSObject +{ + friend class IOUSBInterface; + friend class IOUSBDevice; + + OSDeclareDefaultStructors(IOUSBPipe) + +protected: + + const IOUSBEndpointDescriptor * _descriptor; + IOUSBController::Endpoint _endpoint; // tidied up version of descriptor + IOUSBController * _controller; + USBDeviceAddress _address; + UInt8 _status; // was previously used for status. Now used to detect whether a property exists or not + + struct ExpansionData + { + IOReturn _correctStatus; + IOUSBDevice * _device; // Remember containing device for clearing TTs + UInt8 _speed; + IOUSBInterface * _interface; + bool _crossEndianCompatible; + UInt32 _locationID; + UInt8 _uasUsageID; + UInt8 _usageType; + UInt8 _syncType; + bool _zeroNoDataTimeout; + }; + ExpansionData * _expansionData; + + virtual void free() APPLE_KEXT_OVERRIDE; + + IOReturn ClosePipe(void); + +public: + + // The following 4 methods are deprecated (replaced by the new IOUSBPipeV2 class) + // + virtual bool InitToEndpoint(const IOUSBEndpointDescriptor *endpoint, UInt8 speed, + USBDeviceAddress address, IOUSBController * controller); + + static IOUSBPipe *ToEndpoint(const IOUSBEndpointDescriptor *endpoint, UInt8 speed, + USBDeviceAddress address, IOUSBController * controller); + + static IOUSBPipe *ToEndpoint(const IOUSBEndpointDescriptor *endpoint, + IOUSBDevice * device, IOUSBController * controller); + + static IOUSBPipe *ToEndpoint(const IOUSBEndpointDescriptor *endpoint, + IOUSBDevice * device, IOUSBController * controller, IOUSBInterface *interface); + + // Controlling pipe state + /*! + @function GetStatus + This method does NOT work. Do not call it. See GetPipeStatus for the correct method. + GetStatus will always return 0. + */ + virtual UInt8 GetStatus(void); + /*! + @function Abort + This method causes all outstanding I/O on a pipe to complete with return code kIOReturnAborted. It clears the halted bit but does NOT clear the + toggle bit on the endpoint in the controller. If you wish to clear the toggle bit, see ClearPipeStall + */ + virtual IOReturn Abort(void); + /*! + @function Reset + This method is identical to ClearPipeStall(false). The use of that API is preferred. + */ + virtual IOReturn Reset(void); + /*! + @function ClearStall + This method is equivalent to ClearPipeStall(false). This method is available before version 1.9. + */ + virtual IOReturn ClearStall(void); + + // + // Transferring Data + // + + // deprecated + virtual IOReturn Read(IOMemoryDescriptor * buffer, + IOUSBCompletion * completion = 0, + IOByteCount * bytesRead = 0); + + // deprecated + virtual IOReturn Write(IOMemoryDescriptor * buffer, + IOUSBCompletion * completion = 0); + + // Transfer data over Isochronous pipes + /*! + @function Read + Read from an isochronous endpoint + @param buffer place to put the transferred data + @param frameStart USB frame number of the frame to start transfer + @param numFrames Number of frames to transfer + @param frameList Bytes to transfer and result for each frame + @param completion describes action to take when buffer has been filled + */ + virtual IOReturn Read(IOMemoryDescriptor * buffer, + UInt64 frameStart, UInt32 numFrames, IOUSBIsocFrame *frameList, + IOUSBIsocCompletion * completion = 0); + /*! + @function Write + Write to an isochronous endpoint + @param buffer place to get the transferred data + @param frameStart USB frame number of the frame to start transfer + @param numFrames Number of frames to transfer + @param frameList Bytes to transfer and result for each frame + @param completion describes action to take when buffer has been emptied + */ + virtual IOReturn Write(IOMemoryDescriptor * buffer, + UInt64 frameStart, UInt32 numFrames, IOUSBIsocFrame *frameList, + IOUSBIsocCompletion * completion = 0); + + // Do a control request over a Control pipe, using a memory descriptor + /*! + @function ControlRequest + Make a control request + There are two versions of this method, one uses a simple void * + to point to the data portion of the transfer, the other uses an + IOMemoryDescriptor to point to the data. + @param request parameter block for the control request + @param completion describes action to take when the request has been executed + */ + virtual IOReturn ControlRequest(IOUSBDevRequestDesc *request, + IOUSBCompletion *completion = 0); + + // Do a control request over a Control pipe, using a simple buffer + virtual IOReturn ControlRequest(IOUSBDevRequest *request, + IOUSBCompletion *completion = 0); + + /* + * Accessors + */ + /*! + @function GetEndpoint + returns a pointer to the Endpoint structure for the pipe. + */ + virtual const IOUSBController::Endpoint * GetEndpoint(); + /*! + @function GetEndpointDescriptor + returns the endpoint descriptor for the pipe. + */ + virtual const IOUSBEndpointDescriptor * GetEndpointDescriptor(); + /*! + @function GetDirection + returns the direction of the pipe:kUSBOut/kUSBIn for a bulk or interrupt pipe, + kUSBAnyDirn for a control pipe. + */ + virtual UInt8 GetDirection(); + /*! + @function GetType + returns the pipe type: kUSBControl, kUSBBulk or kUSBInterrupt. + */ + virtual UInt8 GetType(); + /*! + @function GetEndpointNumber + returns the endpoint number in the device that the pipe is connected to. + */ + virtual UInt8 GetEndpointNumber(); + virtual USBDeviceAddress GetAddress(); + virtual UInt16 GetMaxPacketSize(); + virtual UInt8 GetInterval(); + + // Transfer data over Bulk pipes with timeouts. + OSMetaClassDeclareReservedUsed(IOUSBPipe, 0); + + // deprecated + virtual IOReturn Read(IOMemoryDescriptor * buffer, + UInt32 noDataTimeout, + UInt32 completionTimeout, + IOUSBCompletion * completion = 0, + IOByteCount * bytesRead = 0); + + OSMetaClassDeclareReservedUsed(IOUSBPipe, 1); + + // deprecated + virtual IOReturn Write(IOMemoryDescriptor * buffer, + UInt32 noDataTimeout, + UInt32 completionTimeout, + IOUSBCompletion * completion = 0); + + OSMetaClassDeclareReservedUsed(IOUSBPipe, 2); + // Do a control request over a Control pipe, using a memory descriptor + /*! + @function ControlRequest + Make a control request. + There are two versions of this method, one uses a simple void * + to point to the data portion of the transfer, the other uses an + IOMemoryDescriptor to point to the data. + @param request parameter block for the control request + @param noDataTimeout Specifies an amount of time (in ms) after which the command will be aborted + if no data has been transferred on the bus. + @param completionTimeout Specifies an amount of time (in ms) after which the command will be aborted if the entire command has + not been completed. + @param completion describes action to take when the request has been executed + */ + virtual IOReturn ControlRequest(IOUSBDevRequestDesc *request, + UInt32 noDataTimeout, + UInt32 completionTimeout, + IOUSBCompletion *completion = 0); + + OSMetaClassDeclareReservedUsed(IOUSBPipe, 3); + // Do a control request over a Control pipe, using a simple buffer + virtual IOReturn ControlRequest(IOUSBDevRequest *request, + UInt32 noDataTimeout, + UInt32 completionTimeout, + IOUSBCompletion *completion = 0); + + OSMetaClassDeclareReservedUsed(IOUSBPipe, 4); + /*! + @function Read + Read from an interrupt or bulk endpoint + @param buffer place to put the transferred data + @param noDataTimeout number of milliseconds of no bus activity until transaction times out. Note that if a tranasction times out + the driver software may have to resynchronize the data toggle. See ClearPipeStall. + @param completionTimeout number of milliseconds from the time the transaction is placed on the bus until it times out + @param reqCount requested number of bytes to transfer. must be <= buffer->getLength() + @param completion describes action to take when buffer has been filled + @param bytesRead returns total bytes read for synchronous reads + */ + virtual IOReturn Read(IOMemoryDescriptor * buffer, + UInt32 noDataTimeout, + UInt32 completionTimeout, + IOByteCount reqCount, + IOUSBCompletion * completion = 0, + IOByteCount * bytesRead = 0); + + OSMetaClassDeclareReservedUsed(IOUSBPipe, 5); + /*! + @function Write + Write to an interrupt or bulk endpoint + @param buffer place to get the transferred data + @param noDataTimeout number of milliseconds of no bus activity until transaction times out. Note that if a tranasction times out + the driver software may have to resynchronize the data toggle. See ClearPipeStall. + @param completionTimeout number of milliseconds from the time the transaction is placed on the bus until it times out + @param reqCount requested number of bytes to transfer. must be <= buffer->getLength() + @param completion describes action to take when buffer has been emptied + */ + virtual IOReturn Write(IOMemoryDescriptor * buffer, + UInt32 noDataTimeout, + UInt32 completionTimeout, + IOByteCount reqCount, + IOUSBCompletion * completion = 0); + + OSMetaClassDeclareReservedUsed(IOUSBPipe, 6); + /*! + @function GetPipeStatus + Returns the status of the pipe (kIOUSBPipeStalled of the pipe is stalled, else kIOReturnSuccess) + */ + virtual IOReturn GetPipeStatus(void); + + OSMetaClassDeclareReservedUsed(IOUSBPipe, 7); + /*! + @function ClearPipeStall + AVAILABLE ONLY IN VERSION 1.9 AND ABOVE + This method causes all outstanding I/O on a pipe to complete with return code kIOUSBTransactionReturned. It also clears both the halted bit and the + toggle bit on the endpoint in the controller. The driver may need to reset the data toggle within the device to avoid losing any data. If the + device correctly handles the ClearFeature(ENDPOINT_HALT) device request, then this API will handle that by sending the correct request to the + device. + @param withDeviceRequest if true, a ClearFeature(ENDPOINT_HALT) is sent to the appropriate endpoint on the device after the transactions on the + controllers endpoint are returned and the toggle bit on the controllers endpoint is cleared. if this parameter is false, then this is equivalent + to the pre-1.9 API. This means that the endpoint on the controller is cleared, but no DeviceRequest is sent to the device's endpoint. + */ + virtual IOReturn ClearPipeStall(bool withDeviceRequest); + + OSMetaClassDeclareReservedUsed(IOUSBPipe, 8); + /*! + @function SetPipePolicy + AVAILABLE ONLY IN VERSION 1.9 AND ABOVE + This method allows a driver to change the maxPacketSize of an Isochronous pipe, or the polling interval for an interrupt pipe. There is a limited + amount of bandwidth on any single bus, and isochronous pipes tend to use much of this bandwidth. The driver may know, however, that there + will never be as much bandwidth used as is specified in the pipe's endpoint descriptor. Therefore, the driver may return some of this + bandwidth to the system by using this method. Additionally, if on an open of an IOUSBInterface any of the Isochronous pipes is unable to be + opened because of a lack of bandwidth, the pipe will be created with a bandwidth of zero, and the driver may get some of the limited bandwidth + remaining by using this call. + This method returns kIOReturnBadArgument if the pipe is a bulk on control pipe, or if the maxPacketSize parameter is larger than the amount specified + in the endpoint descriptor. It returns kIOReturnNoBandwidth if the bandwidth requested cannot be allocated. Otherwise it returns kIOReturnSuccess. + @param maxPacketSize specifies the maximum number of bytes to be used in any one millisecond frame by this pipe. The value must be less than or + equal to the maxPacketSize specified in the endpoint descriptor. + @param maxInterval not currently used. reserved for future expansion + + */ + virtual IOReturn SetPipePolicy(UInt16 maxPacketSize, UInt8 maxInterval); + + OSMetaClassDeclareReservedUsed(IOUSBPipe, 9); + + // Transfer data over Isochronous pipes and process the frame list at hardware interrupt time + /*! + @function Read + AVAILABLE ONLY IN VERSION 1.9.2 AND ABOVE + Read from an isochronous endpoint and process the IOUSBLowLatencyIsocFrame fields at + hardware interrupt time + @param buffer place to put the transferred data + @param frameStart USB frame number of the frame to start transfer. For SuperSpeed Isoc devices, if the frameStart is kAppleUSBSSIsocContinuousFrame, then just continue after the last transfer which was called. + @param numFrames Number of frames to transfer + @param frameList Bytes to transfer, result, and time stamp for each frame + @param completion describes action to take when buffer has been filled + @param updateFrequency describes how often (in milliseconds) should the frame list be processed + */ + virtual IOReturn Read(IOMemoryDescriptor * buffer, + UInt64 frameStart, UInt32 numFrames, IOUSBLowLatencyIsocFrame *frameList, + IOUSBLowLatencyIsocCompletion * completion = 0, UInt32 updateFrequency = 0); + + OSMetaClassDeclareReservedUsed(IOUSBPipe, 10); + /*! + @function Write + AVAILABLE ONLY IN VERSION 1.9.2 AND ABOVE + Write to an isochronous endpoint + @param buffer place to get the data to transfer + @param frameStart USB frame number of the frame to start transfer. For SuperSpeed Isoc devices, if the frameStart is kAppleUSBSSIsocContinuousFrame, then just continue after the last transfer which was called. + @param numFrames Number of frames to transfer + @param frameList Pointer to list of frames indicating bytes to transfer and result for each frame + @param completion describes action to take when buffer has been emptied + @param updateFrequency describes how often (in milliseconds) should the frame list be processed + */ + virtual IOReturn Write(IOMemoryDescriptor * buffer, + UInt64 frameStart, UInt32 numFrames, IOUSBLowLatencyIsocFrame *frameList, + IOUSBLowLatencyIsocCompletion * completion = 0, UInt32 updateFrequency = 0); + + OSMetaClassDeclareReservedUsed(IOUSBPipe, 11); + /*! + @function Read + Read from an interrupt or bulk endpoint + @param buffer place to put the transferred data + @param noDataTimeout number of milliseconds of no bus activity until transaction times out. Note that if a tranasction times out + the driver software may have to resynchronize the data toggle. See ClearPipeStall. + @param completionTimeout number of milliseconds from the time the transaction is placed on the bus until it times out + @param reqCount requested number of bytes to transfer. must be <= buffer->getLength() + @param completion describes action to take when buffer has been filled + @param bytesRead returns total bytes read for synchronous reads + */ + virtual IOReturn Read(IOMemoryDescriptor * buffer, + UInt32 noDataTimeout, + UInt32 completionTimeout, + IOByteCount reqCount, + IOUSBCompletionWithTimeStamp * completion = 0, + IOByteCount * bytesRead = 0); + + OSMetaClassDeclareReservedUsed(IOUSBPipe, 12); + virtual bool InitToEndpoint(const IOUSBEndpointDescriptor *endpoint, UInt8 speed, + USBDeviceAddress address, IOUSBController * controller, IOUSBDevice * device, IOUSBInterface * interface); + + OSMetaClassDeclareReservedUsed(IOUSBPipe, 13); + virtual UInt8 GetUsageType(void); + + OSMetaClassDeclareReservedUsed(IOUSBPipe, 14); + virtual UInt8 GetSyncType(void); + + OSMetaClassDeclareReservedUnused(IOUSBPipe, 15); + OSMetaClassDeclareReservedUnused(IOUSBPipe, 16); + OSMetaClassDeclareReservedUnused(IOUSBPipe, 17); + OSMetaClassDeclareReservedUnused(IOUSBPipe, 18); + OSMetaClassDeclareReservedUnused(IOUSBPipe, 19); + +}; + +#endif diff --git a/QualcommWireless/include/IOKit/usb/IOUSBPipeV2.h b/QualcommWireless/include/IOKit/usb/IOUSBPipeV2.h new file mode 100644 index 0000000..873ada0 --- /dev/null +++ b/QualcommWireless/include/IOKit/usb/IOUSBPipeV2.h @@ -0,0 +1,196 @@ +/* + * Copyright © 2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOUSBPIPEV2_H +#define _IOKIT_IOUSBPIPEV2_H + +#include <IOKit/IOService.h> +#include <IOKit/IOMemoryDescriptor.h> + +#include <IOKit/usb/USB.h> +#include <IOKit/usb/IOUSBController.h> +#include <IOKit/usb/IOUSBControllerV2.h> +#include <IOKit/usb/IOUSBPipe.h> + + +/*! + @class IOUSBPipeV2 + @abstract The object representing an open pipe for a device. +*/ +class IOUSBPipeV2 : public IOUSBPipe +{ + friend class IOUSBInterface; + friend class IOUSBDevice; + + OSDeclareDefaultStructors(IOUSBPipeV2) + +protected: + + IOUSBSuperSpeedEndpointCompanionDescriptor * _sscd; + UInt32 _maxStream; // number to be used as an exponent to get the actual maximum + UInt32 _maxBurst; // zero based (i.e. 0=1 burst) + UInt32 _configuredStreams; + UInt32 _mult; // zero based max value is 2 (meaning 3 packets) + UInt32 _bytesPerInterval; + + struct V2PipeExpansionData + { + }; + V2PipeExpansionData * _v2PipeExpansionData; + + static IOUSBPipeV2 *ToEndpoint(const IOUSBEndpointDescriptor *endpoint, IOUSBSuperSpeedEndpointCompanionDescriptor *sscd, + IOUSBDevice * device, IOUSBController * controller, IOUSBInterface *interface); + +public: + using IOUSBPipe::Read; + using IOUSBPipe::Write; + using IOUSBPipe::Abort; + + // inherited from the IOUSBPipe class + virtual IOReturn SetPipePolicy(UInt16 maxPacketSize, UInt8 maxInterval) APPLE_KEXT_OVERRIDE; //this must have the same KPI as IOUSBPipe::SetPipePolicy + + // New to IOUSBPipeV2 + virtual bool InitToEndpoint(const IOUSBEndpointDescriptor *endpoint, IOUSBSuperSpeedEndpointCompanionDescriptor *sscd, UInt8 speed, + USBDeviceAddress address, IOUSBController * controller, IOUSBDevice * device, IOUSBInterface * interface); + + /*! + @function Read + Read from a stream on a bulk endpoint + @param streamID ID of the stream to read from + @param buffer place to put the transferred data + @param noDataTimeout number of milliseconds of no bus activity until transaction times out. Note that if a tranasction times out + the driver software may have to resynchronize the data toggle. See ClearPipeStall. + @param completionTimeout number of milliseconds from the time the transaction is placed on the bus until it times out + @param reqCount requested number of bytes to transfer. must be <= buffer->getLength() + @param completion describes action to take when buffer has been filled + @param bytesRead returns total bytes read for synchronous reads + */ + virtual IOReturn Read(UInt32 streamID, + IOMemoryDescriptor * buffer, + UInt32 noDataTimeout, + UInt32 completionTimeout, + IOByteCount reqCount, + IOUSBCompletion * completion = 0, + IOByteCount * bytesRead = 0); + + /*! + @function Write + Write to a stream on a bulk endpoint + @param streamID ID of the stream to write to + @param buffer place to get the transferred data + @param noDataTimeout number of milliseconds of no bus activity until transaction times out. Note that if a tranasction times out + the driver software may have to resynchronize the data toggle. See ClearPipeStall. + @param completionTimeout number of milliseconds from the time the transaction is placed on the bus until it times out + @param reqCount requested number of bytes to transfer. must be <= buffer->getLength() + @param completion describes action to take when buffer has been emptied + */ + virtual IOReturn Write(UInt32 streamID, + IOMemoryDescriptor * buffer, + UInt32 noDataTimeout, + UInt32 completionTimeout, + IOByteCount reqCount, + IOUSBCompletion * completion = 0); + + /*! + @function SupportsStreams + Returns non zero if the pipe supports streams. + Return value is the max supported stream. + */ + virtual UInt32 SupportsStreams(void); + + /*! + @function CreateStreams + @param streamID ID of the highest stream to create (pass 0 to destroy streams) + */ + virtual IOReturn CreateStreams(UInt32 maxStreams); + + /*! + @function Abort(stream) + This method causes all outstanding I/O on a stream of a pipe to complete with return code kIOReturnAborted. It clears the halted bit but does NOT clear the + toggle bit on the endpoint in the controller. If you wish to clear the toggle bit, see ClearPipeStall + @param streamID ID of the stream to abort + */ + virtual IOReturn Abort(UInt32 streamID); + + /*! + @function GetConfiguredStreams + Get the number of streams which have been configured for the endpoint with CreateStreams + */ + virtual UInt32 GetConfiguredStreams(void); + + /*! + @function GetSuperSpeedEndpointCompanionDescriptor + returns the SuperSpeed endpoint companion descriptor for the pipe. + */ + virtual const IOUSBSuperSpeedEndpointCompanionDescriptor * GetSuperSpeedEndpointCompanionDescriptor(); + + /*! + @function GetMaxBurst + returns the value of bMaxBurst from the SuperSpeed endpoint companion descriptor + */ + virtual UInt8 GetMaxBurst(); + + /*! + @function GetMaxBurst + returns the value of bMaxBurst from the SuperSpeed endpoint companion descriptor + */ + virtual UInt8 GetMult(); + + /*! + @function GetMaxBurst + returns the value of bMaxBurst from the SuperSpeed endpoint companion descriptor + */ + virtual UInt16 GetBytesPerInterval(); + + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 0); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 1); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 2); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 3); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 4); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 5); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 6); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 7); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 8); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 9); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 10); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 11); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 12); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 13); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 14); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 15); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 16); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 17); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 18); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 19); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 20); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 21); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 22); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 23); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 24); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 25); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 26); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 27); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 28); + OSMetaClassDeclareReservedUnused(IOUSBPipeV2, 29); +}; + +#endif diff --git a/QualcommWireless/include/IOKit/usb/IOUSBWorkLoop.h b/QualcommWireless/include/IOKit/usb/IOUSBWorkLoop.h new file mode 100644 index 0000000..e4bca54 --- /dev/null +++ b/QualcommWireless/include/IOKit/usb/IOUSBWorkLoop.h @@ -0,0 +1,67 @@ +/* + * Copyright � 2001-2006 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_IOUSBWORKLOOP_H +#define _IOKIT_IOUSBWORKLOOP_H + +#include <IOKit/IOWorkLoop.h> + +/* + class IOUSBWorkLoop + Subclass of IOWorkloop that allows the USB stack to more finely control sleep and wake. +*/ +class IOUSBWorkLoop : public IOWorkLoop +{ + OSDeclareDefaultStructors(IOUSBWorkLoop) + +protected: + void * fSleepToken; +#ifndef __OPEN_SOURCE__ + lck_grp_t * fLockGroup; +#endif + bool init ( const char * controllerLocation ); + void free ( void ) APPLE_KEXT_OVERRIDE; + + // Overrides to check for sleeping + virtual void closeGate() APPLE_KEXT_OVERRIDE; + virtual bool tryCloseGate() APPLE_KEXT_OVERRIDE; + +public: + // Create a workloop + static IOUSBWorkLoop * workLoop(const char * controllerLocation); + + // Put workloop to sleep (Must have gate closed, opens gate if successful) + virtual IOReturn sleep(void *token); + + // Wake workloop up (closes gate if successful) + virtual IOReturn wake(void *token); + + void CloseGate(void); + void OpenGate(void); + + int SleepWithTimeout(void *token, UInt64 timeout); + void Wakeup(void *token, bool oneThread); +}; + +#endif + diff --git a/QualcommWireless/include/IOKit/usb/StandardUSB.h b/QualcommWireless/include/IOKit/usb/StandardUSB.h new file mode 100644 index 0000000..0c88564 --- /dev/null +++ b/QualcommWireless/include/IOKit/usb/StandardUSB.h @@ -0,0 +1,1380 @@ +/* + * Copyright (c) 1998-2016 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +/*! @header StandardUSB.h + @brief StandardUSB defines structures and constants to reflect the USB specification + */ + +#ifndef IOUSBHostFamily_StandardUSB_h +#define IOUSBHostFamily_StandardUSB_h + +#include <IOKit/IOTypes.h> +#include <IOKit/IOReturn.h> +#include <libkern/OSByteOrder.h> +#include <IOKit/usb/AppleUSBDefinitions.h> + + +#define StandardUSBBit(bit) IOUSBBit(bit) +#define StandardUSBBitRange(start, end) IOUSBBitRange(start, end) +#define StandardUSBBitRange64(start, end) IOUSBBitRange64(start, end) +#define StandardUSBBitRangePhase(start, end) IOUSBBitRangePhase(start, end) + +#define kUSB30Bitrate5Gbps kIOUSB30Bitrate5Gbps +#define kUSB30Bitrate10Gbps kIOUSB30Bitrate10Gbps +#define kUSB32Bitrate20Gbps kIOUSB32Bitrate20Gbps + +#ifdef __cplusplus + +#pragma mark StandardUSB namespace +namespace StandardUSB +{ + +#endif // __cplusplus + +#pragma mark Descriptor definitions + /*! + * @enum tDescriptorType + * @namespace StandardUSB + * @brief Descriptor types defined by USB 2.0 Table 9-5 and USB 3.0 Table 9-6 + */ + enum tDescriptorType + { + kDescriptorTypeDevice = kIOUSBDescriptorTypeDevice, + kDescriptorTypeConfiguration = kIOUSBDescriptorTypeConfiguration, + kDescriptorTypeString = kIOUSBDescriptorTypeString, + kDescriptorTypeInterface = kIOUSBDescriptorTypeInterface, + kDescriptorTypeEndpoint = kIOUSBDescriptorTypeEndpoint, + kDescriptorTypeDeviceQualifier = kIOUSBDescriptorTypeDeviceQualifier, + kDescriptorTypeOtherSpeedConfiguration = kIOUSBDescriptorTypeOtherSpeedConfiguration, + kDescriptorTypeInterfacePower = kIOUSBDescriptorTypeInterfacePower, + kDescriptorTypeOTG = kIOUSBDescriptorTypeOTG, + kDescriptorTypeDebug = kIOUSBDescriptorTypeDebug, + kDescriptorTypeInterfaceAssociation = kIOUSBDescriptorTypeInterfaceAssociation, + kDescriptorTypeBOS = kIOUSBDescriptorTypeBOS, + kDescriptorTypeDeviceCapability = kIOUSBDescriptorTypeDeviceCapability, + kDescriptorTypeHub = kIOUSBDescriptorTypeHub, + kDescriptorTypeSuperSpeedHub = kIOUSBDescriptorTypeSuperSpeedHub, + kDescriptorTypeSuperSpeedUSBEndpointCompanion = kIOUSBDescriptorTypeSuperSpeedUSBEndpointCompanion, + kDescriptorTypeSuperSpeedPlusIsochronousEndpointCompanion = kIOUSBDescriptorTypeSuperSpeedPlusIsochronousEndpointCompanion + }; + + typedef enum tDescriptorType tDescriptorType; + + /*! + * @enum tDescriptorSize + * @namespace StandardUSB + * @brief Size in bytes for descriptor structures + */ + enum tDescriptorSize + { + kDescriptorSize = kIOUSBDescriptorHeaderSize, + kDescriptorSizeDevice = kIOUSBDescriptorSizeDevice, + kDescriptorSizeConfiguration = kIOUSBDescriptorSizeConfiguration, + kDescriptorSizeInterface = kIOUSBDescriptorSizeInterface, + kDescriptorSizeEndpoint = kIOUSBDescriptorSizeEndpoint, + kDescriptorSizeStringMinimum = kDescriptorSize, + kDescriptorSizeStringMaximum = kIOUSBDescriptorSizeStringMaximum, + kDescriptorSizeDeviceQualifier = kIOUSBDescriptorSizeDeviceQualifier, + kDescriptorSizeInterfaceAssociation = kIOUSBDescriptorSizeInterfaceAssociation, + kDescriptorSizeBOS = kIOUSBDescriptorSizeBOS, + kDescriptorSizeDeviceCapability = kIOUSBDescriptorSizeDeviceCapability, + kDescriptorSizeUSB20ExtensionCapability = kIOUSBDescriptorSizeUSB20ExtensionCapability, + kDescriptorSizeSuperSpeedUSBDeviceCapability = kIOUSBDescriptorSizeSuperSpeedUSBDeviceCapability, + kDescriptorSizeContainerIDCapability = kIOUSBDescriptorSizeContainerIDCapability, + kDescriptorSizeHubMinimum = kIOUSBDescriptorSizeHubMinimum, + kDescriptorSizeHubMaximum = kIOUSBDescriptorSizeHubMaximum, + kDescriptorSizeSuperSpeedHub = kIOUSBDescriptorSizeSuperSpeedHub, + kDescriptorSizeSuperSpeedUSBEndpointCompanion = kIOUSBDescriptorSizeSuperSpeedUSBEndpointCompanion, + kDescriptorSizeSuperSpeedPlusIsochronousEndpointCompanion = kIOUSBDescriptorSizeSuperSpeedPlusIsochronousEndpointCompanion, + kDescriptorSizeBillboardDeviceMinimum = kIOUSBDescriptorSizeBillboardDeviceMinimum, + kDescriptorSizeBillboardDeviceMaximum = kIOUSBDescriptorSizeBillboardDeviceMaximum, + kDescriptorSizePlatformECIDCapability = kIOUSBDescriptorSizePlatformECIDCapability, + kDescriptorSizePlatformCapability = kIOUSBDescriptorSizePlatformCapability + }; + + typedef enum tDescriptorSize tDescriptorSize; + + /*! + * @struct Descriptor + * @namespace StandardUSB + * @brief Base descriptor defined by USB 2.0 9.5 + * @discussion StandardUSB.h declares structs to represent a variety of USB standard descriptors. Each of thes structs is derived from the Descriptor base struct, and can therefore be passed to methods accepting a Descriptor pointer without explicit casting. For the C language, each struct is defined independently to include the bLength and bDescriptorType fields expected for all USB descriptors. + */ + struct Descriptor + { + uint8_t bLength; + uint8_t bDescriptorType; + } __attribute__((packed)); + + typedef struct Descriptor Descriptor; + + +#ifdef __cplusplus + // USB 2.0 9.6.1: Device + struct DeviceDescriptor : public Descriptor + { +#else + struct DeviceDescriptor + { + uint8_t bLength; + uint8_t bDescriptorType; +#endif + uint16_t bcdUSB; + uint8_t bDeviceClass; + uint8_t bDeviceSubClass; + uint8_t bDeviceProtocol; + uint8_t bMaxPacketSize0; + uint16_t idVendor; + uint16_t idProduct; + uint16_t bcdDevice; + uint8_t iManufacturer; + uint8_t iProduct; + uint8_t iSerialNumber; + uint8_t bNumConfigurations; + } __attribute__((packed)); + + typedef struct DeviceDescriptor DeviceDescriptor; + + +#ifdef __cplusplus + // USB 2.0 9.6.2: Device Qualifier + struct DeviceQualifierDescriptor : public Descriptor + { +#else + struct DeviceQualifierDescriptor + { + uint8_t bLength; + uint8_t bDescriptorType; +#endif + uint16_t bcdUSB; + uint8_t bDeviceClass; + uint8_t bDeviceSubClass; + uint8_t bDeviceProtocol; + uint8_t bMaxPacketSize0; + uint8_t bNumConfigurations; + uint8_t bReserved; + } __attribute__((packed)); + + typedef struct DeviceQualifierDescriptor DeviceQualifierDescriptor; + + +#ifdef __cplusplus + // USB 2.0 9.6.3: Configuration + struct ConfigurationDescriptor : public Descriptor + { +#else + struct ConfigurationDescriptor + { + uint8_t bLength; + uint8_t bDescriptorType; +#endif + uint16_t wTotalLength; + uint8_t bNumInterfaces; + uint8_t bConfigurationValue; + uint8_t iConfiguration; + uint8_t bmAttributes; + uint8_t bMaxPower; + } __attribute__((packed)); + + typedef struct ConfigurationDescriptor ConfigurationDescriptor; + + + enum + { + kConfigurationDescriptorAttributeRemoteWakeCapable = kIOUSBConfigurationDescriptorAttributeRemoteWakeCapable, + kConfigurationDescriptorAttributeSelfPowered = kIOUSBConfigurationDescriptorAttributeSelfPowered + }; + + +#ifdef __cplusplus + // USB 2.0 9.6.5: Interface + struct InterfaceDescriptor : public Descriptor + { +#else + struct InterfaceDescriptor + { + uint8_t bLength; + uint8_t bDescriptorType; +#endif + uint8_t bInterfaceNumber; + uint8_t bAlternateSetting; + uint8_t bNumEndpoints; + uint8_t bInterfaceClass; + uint8_t bInterfaceSubClass; + uint8_t bInterfaceProtocol; + uint8_t iInterface; + } __attribute__((packed)); + + typedef struct InterfaceDescriptor InterfaceDescriptor; + + +#ifdef __cplusplus + // USB 2.0 9.6.6: Endpoint + struct EndpointDescriptor : public Descriptor + { +#else + struct EndpointDescriptor + { + uint8_t bLength; + uint8_t bDescriptorType; +#endif + uint8_t bEndpointAddress; + uint8_t bmAttributes; + uint16_t wMaxPacketSize; + uint8_t bInterval; + } __attribute__((packed)); + + typedef struct EndpointDescriptor EndpointDescriptor; + + enum + { + kEndpointDescriptorNumber = kIOUSBEndpointDescriptorNumber, + kEndpointDescriptorEndpointAddressReserved = kIOUSBEndpointDescriptorEndpointAddressReserved, + kEndpointDescriptorDirection = kIOUSBEndpointDescriptorDirection, + kEndpointDescriptorDirectionPhase = kIOUSBEndpointDescriptorDirectionPhase, + kEndpointDescriptorDirectionOut = kIOUSBEndpointDescriptorDirectionOut, + kEndpointDescriptorDirectionIn = kIOUSBEndpointDescriptorDirectionIn, + + kEndpointDescriptorTransferType = kIOUSBEndpointDescriptorTransferType, + kEndpointDescriptorTransferTypePhase = kIOUSBEndpointDescriptorTransferTypePhase, + kEndpointDescriptorTransferTypeControl = kIOUSBEndpointDescriptorTransferTypeControl, + kEndpointDescriptorTransferTypeIsochronous = kIOUSBEndpointDescriptorTransferTypeIsochronous, + kEndpointDescriptorTransferTypeBulk = kIOUSBEndpointDescriptorTransferTypeBulk, + kEndpointDescriptorTransferTypeInterrupt = kIOUSBEndpointDescriptorTransferTypeInterrupt, + kEndpointDescriptorSynchronizationType = kIOUSBEndpointDescriptorSynchronizationType, + kEndpointDescriptorSynchronizationTypePhase = kIOUSBEndpointDescriptorSynchronizationTypePhase, + kEndpointDescriptorSynchronizationTypeNone = kIOUSBEndpointDescriptorSynchronizationTypeNone, + kEndpointDescriptorSynchronizationTypeAsynchronous = kIOUSBEndpointDescriptorSynchronizationTypeAsynchronous, + kEndpointDescriptorSynchronizationTypeAdaptive = kIOUSBEndpointDescriptorSynchronizationTypeAdaptive, + kEndpointDescriptorSynchronizationTypeSynchronous = kIOUSBEndpointDescriptorSynchronizationTypeSynchronous, + kEndpointDescriptorUsageType = kIOUSBEndpointDescriptorUsageType, + kEndpointDescriptorUsageTypePhase = kIOUSBEndpointDescriptorUsageTypePhase, + kEndpointDescriptorUsageTypeInterruptPeriodic = kIOUSBEndpointDescriptorUsageTypeInterruptPeriodic, + kEndpointDescriptorUsageTypeInterruptNotification = kIOUSBEndpointDescriptorUsageTypeInterruptNotification, + kEndpointDescriptorUsageTypeInterruptReserved1 = kIOUSBEndpointDescriptorUsageTypeInterruptReserved1, + kEndpointDescriptorUsageTypeInterruptReserved2 = kIOUSBEndpointDescriptorUsageTypeInterruptReserved2, + kEndpointDescriptorUsageTypeIsocData = kIOUSBEndpointDescriptorUsageTypeIsocData, + kEndpointDescriptorUsageTypeIsocFeedback = kIOUSBEndpointDescriptorUsageTypeIsocFeedback, + kEndpointDescriptorUsageTypeIsocImplicit = kIOUSBEndpointDescriptorUsageTypeIsocImplicit, + kEndpointDescriptorUsageTypeIsocReserved = kIOUSBEndpointDescriptorUsageTypeIsocReserved, + + kEndpointDescriptorPacketSize = kIOUSBEndpointDescriptorPacketSize, + kEndpointDescriptorPacketSizePhase = kIOUSBEndpointDescriptorPacketSizePhase, + kEndpointDescriptorPacketSizeMult = kIOUSBEndpointDescriptorPacketSizeMult, + kEndpointDescriptorPacketSizeMultPhase = kIOUSBEndpointDescriptorPacketSizeMultPhase, + kEndpointDescriptorReserved = kIOUSBEndpointDescriptorReserved, + kEndpointDescriptorReservedPhase = kIOUSBEndpointDescriptorReservedPhase + }; + + // USB Language Identifiers 1.0 + enum tLanguageID + { + kLanguageIDEnglishUS = kIOUSBLanguageIDEnglishUS + }; + + typedef enum tLanguageID tLanguageID; + + +#ifdef __cplusplus + // USB 2.0 9.6.7: String + struct StringDescriptor : public Descriptor + { +#else + struct StringDescriptor + { + uint8_t bLength; + uint8_t bDescriptorType; +#endif + uint8_t bString[1]; + } __attribute__((packed)); + + typedef struct StringDescriptor StringDescriptor; + + + enum tDeviceCapabilityType + { + // USB 3.0 Table 9-13 + kDeviceCapabilityTypeWireless = kIOUSBDeviceCapabilityTypeWireless, + kDeviceCapabilityTypeUSB20Extension = kIOUSBDeviceCapabilityTypeUSB20Extension, + kDeviceCapabilityTypeSuperSpeed = kIOUSBDeviceCapabilityTypeSuperSpeed, + kDeviceCapabilityTypeContainerID = kIOUSBDeviceCapabilityTypeContainerID, + + // USB 3.1 Table 9-14 + kDeviceCapabilityTypePlatform = kIOUSBDeviceCapabilityTypePlatform, + kDeviceCapabilityTypePowerDelivery = kIOUSBDeviceCapabilityTypePowerDelivery, + kDeviceCapabilityTypeBatteryInfo = kIOUSBDeviceCapabilityTypeBatteryInfo, + kDeviceCapabilityTypePdConsumerPort = kIOUSBDeviceCapabilityTypePdConsumerPort, + kDeviceCapabilityTypePdProviderPort = kIOUSBDeviceCapabilityTypePdProviderPort, + kDeviceCapabilityTypeSuperSpeedPlus = kIOUSBDeviceCapabilityTypeSuperSpeedPlus, + kDeviceCapabilityTypePrecisionMeasurement = kIOUSBDeviceCapabilityTypePrecisionMeasurement, + kDeviceCapabilityTypeWirelessExt = kIOUSBDeviceCapabilityTypeWirelessExt, + kDeviceCapabilityTypeBillboard = kIOUSBDeviceCapabilityTypeBillboard, + kDeviceCapabilityTypeBillboardAltMode = kIOUSBDeviceCapabilityTypeBillboardAltMode + }; + + typedef enum tDeviceCapabilityType tDeviceCapabilityType; + + +#ifdef __cplusplus + // USB 3.0 9.6.2: Binary Device Object Store (BOS) + struct BOSDescriptor : public Descriptor + { +#else + struct BOSDescriptor + { + uint8_t bLength; + uint8_t bDescriptorType; +#endif + uint16_t wTotalLength; + uint8_t bNumDeviceCaps; + } __attribute__((packed)); + + typedef struct BOSDescriptor BOSDescriptor; + + +#ifdef __cplusplus + // USB 3.0 9.6.2: Binary Device Object Store (BOS) + struct DeviceCapabilityDescriptor : public Descriptor + { +#else + struct DeviceCapabilityDescriptor + { + uint8_t bLength; + uint8_t bDescriptorType; +#endif + uint8_t bDevCapabilityType; + } __attribute__((packed)); + + typedef struct DeviceCapabilityDescriptor DeviceCapabilityDescriptor; + + +#ifdef __cplusplus + // USB 3.0 9.6.2.1: USB 2.0 Extension + struct USB20ExtensionCapabilityDescriptor : public DeviceCapabilityDescriptor + { +#else + struct USB20ExtensionCapabilityDescriptor + { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDevCapabilityType; +#endif + uint32_t bmAttributes; + } __attribute__((packed)); + + typedef struct USB20ExtensionCapabilityDescriptor USB20ExtensionCapabilityDescriptor; + + + enum + { + kUSB20ExtensionCapabilityLPM = kIOUSBUSB20ExtensionCapabilityLPM, + + // From USB 2.0 ECN Errata for Link Power Management. + kUSB20ExtensionCapabilityBESLSupport = kIOUSBUSB20ExtensionCapabilityBESLSupport, + kUSB20ExtensionCapabilityBESLValid = kIOUSBUSB20ExtensionCapabilityBESLValid, + kUSB20ExtensionCapabilityBESLDValid = kIOUSBUSB20ExtensionCapabilityBESLDValid, + kUSB20ExtensionCapabilityBESL = kIOUSBUSB20ExtensionCapabilityBESL, + kUSB20ExtensionCapabilityBESLPhase = kIOUSBUSB20ExtensionCapabilityBESLPhase, + kUSB20ExtensionCapabilityBESLD = kIOUSBUSB20ExtensionCapabilityBESLD, + kUSB20ExtensionCapabilityBESLDPhase = kIOUSBUSB20ExtensionCapabilityBESLDPhase + }; + + +#ifdef __cplusplus + // USB 3.0 9.6.2.2: SuperSpeed USB Device Capability + struct SuperSpeedUSBDeviceCapabilityDescriptor : public DeviceCapabilityDescriptor + { +#else + struct SuperSpeedUSBDeviceCapabilityDescriptor + { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDevCapabilityType; +#endif + uint8_t bmAttributes; + uint16_t wSpeedsSupported; + uint8_t bFunctionalitySupport; + uint8_t bU1DevExitLat; + uint16_t bU2DevExitLat; + } __attribute__((packed)); + + typedef struct SuperSpeedUSBDeviceCapabilityDescriptor SuperSpeedUSBDeviceCapabilityDescriptor; + + + enum + { + kSuperSpeedDeviceCapabilityLTM = kIOUSBSuperSpeedDeviceCapabilityLTM, + + kSuperSpeedDeviceCapabilityLowSpeed = kIOUSBSuperSpeedDeviceCapabilityLowSpeed, + kSuperSpeedDeviceCapabilityFullSpeed = kIOUSBSuperSpeedDeviceCapabilityFullSpeed, + kSuperSpeedDeviceCapabilityHighSpeed = kIOUSBSuperSpeedDeviceCapabilityHighSpeed, + kSuperSpeedDeviceCapability5Gb = kIOUSBSuperSpeedDeviceCapability5Gb, + + kSuperSpeedDeviceCapabilitySupportLowSpeed = kIOUSBSuperSpeedDeviceCapabilitySupportLowSpeed, + kSuperSpeedDeviceCapabilitySupportFullSpeed = kIOUSBSuperSpeedDeviceCapabilitySupportFullSpeed, + kSuperSpeedDeviceCapabilitySupportHighSpeed = kIOUSBSuperSpeedDeviceCapabilitySupportHighSpeed, + kSuperSpeedDeviceCapabilitySupport5Gb = kIOUSBSuperSpeedDeviceCapabilitySupport5Gb, + + kSuperSpeedDeviceCapabilityU1DevExitLatMax = kIOUSBSuperSpeedDeviceCapabilityU1DevExitLatMax, + kSuperSpeedDeviceCapabilityU2DevExitLatMax = kIOUSBSuperSpeedDeviceCapabilityU2DevExitLatMax + }; + +#ifdef __cplusplus + // USB 3.1 9.6.2.5: SuperSpeedPlus USB Device Capability + struct SuperSpeedPlusUSBDeviceCapabilityDescriptor : public DeviceCapabilityDescriptor + { +#else + struct SuperSpeedPlusUSBDeviceCapabilityDescriptor + { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDevCapabilityType; +#endif + uint8_t bReserved; + uint32_t bmAttributes; + uint16_t wFunctionalitySupport; + uint16_t wReserved; + uint32_t bmSublinkSpeedAttr[1]; + + } __attribute__((packed)); + + typedef struct SuperSpeedPlusUSBDeviceCapabilityDescriptor SuperSpeedPlusUSBDeviceCapabilityDescriptor; + + enum + { + //bmAttributes + kSuperSpeedPlusDeviceCapabilitySublinkSpeedAttrCount = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkSpeedAttrCount, + kSuperSpeedPlusDeviceCapabilitySublinkSpeedAttrCountPhase = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkSpeedAttrCountPhase, + + kSuperSpeedPlusDeviceCapabilitySublinkSpeedIdCount = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkSpeedIdCount, + kSuperSpeedPlusDeviceCapabilitySublinkSpeedIdCountPhase = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkSpeedIdCountPhase, + + //wFunctionalitySupport + kSuperSpeedPlusDeviceCapabilitySublinkMinSpeedId = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkMinSpeedId, + kSuperSpeedPlusDeviceCapabilitySublinkMinSpeedIdPhase = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkMinSpeedIdPhase, + + kSuperSpeedPlusDeviceCapabilityReserved = kIOUSBSuperSpeedPlusDeviceCapabilityReserved, + kSuperSpeedPlusDeviceCapabilityReservedPhase = kIOUSBSuperSpeedPlusDeviceCapabilityReservedPhase, + + kSuperSpeedPlusDeviceCapabilityMinRxLaneCount = kIOUSBSuperSpeedPlusDeviceCapabilityMinRxLaneCount, + kSuperSpeedPlusDeviceCapabilityMinRxLaneCountPhase = kIOUSBSuperSpeedPlusDeviceCapabilityMinRxLaneCountPhase, + + kSuperSpeedPlusDeviceCapabilityMinTxLaneCount = kIOUSBSuperSpeedPlusDeviceCapabilityMinTxLaneCount, + kSuperSpeedPlusDeviceCapabilityMinTxLaneCountPhase = kIOUSBSuperSpeedPlusDeviceCapabilityMinTxLaneCountPhase, + + //bmSublinkSpeedAttr + kSuperSpeedPlusDeviceCapabilitySublinkSpeedId = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkSpeedId, + kSuperSpeedPlusDeviceCapabilitySublinkSpeedIdPhase = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkSpeedIdPhase, + + kSuperSpeedPlusDeviceCapabilitySublinkLSE = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkLSE, + kSuperSpeedPlusDeviceCapabilitySublinkLSEPhase = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkLSEPhase, + kSuperSpeedPlusDeviceCapabilitySublinkLSEBits = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkLSEBits, + kSuperSpeedPlusDeviceCapabilitySublinkLSEKbits = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkLSEKbits, + kSuperSpeedPlusDeviceCapabilitySublinkLSEMbits = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkLSEMbits, + kSuperSpeedPlusDeviceCapabilitySublinkLSEGbits = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkLSEGbits, + + kSuperSpeedPlusDeviceCapabilitySublinkType = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkType, + kSuperSpeedPlusDeviceCapabilitySublinkTypePhase = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkTypePhase, + + kSuperSpeedPlusDeviceCapabilitySublinkSymmetry = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkSymmetry, + kSuperSpeedPlusDeviceCapabilitySublinkSymmetryPhase = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkSymmetryPhase, + kSuperSpeedPlusDeviceCapabilitySublinkSymmetric = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkSymmetric, + kSuperSpeedPlusDeviceCapabilitySublinkAsymmetric = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkAsymmetric, + + kSuperSpeedPlusDeviceCapabilitySublinkDirection = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkDirection, + kSuperSpeedPlusDeviceCapabilitySublinkDirectionPhase = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkDirectionPhase, + kSuperSpeedPlusDeviceCapabilitySublinkDirectionRx = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkDirectionRx, + kSuperSpeedPlusDeviceCapabilitySublinkDirectionTx = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkDirectionTx, + + kSuperSpeedPlusDeviceCapabilitySublinkReserved = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkReserved, + kSuperSpeedPlusDeviceCapabilitySublinkReservedPhase = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkReservedPhase, + + kSuperSpeedPlusDeviceCapabilitySublinkProtocol = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkProtocol, + kSuperSpeedPlusDeviceCapabilitySublinkProtocolPhase = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkProtocolPhase, + + kSuperSpeedPlusDeviceCapabilitySublinkSpeedMantissa = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkSpeedMantissa, + kSuperSpeedPlusDeviceCapabilitySublinkSpeedMantissaPhase = kIOUSBSuperSpeedPlusDeviceCapabilitySublinkSpeedMantissaPhase, + }; + + +#ifdef __cplusplus + // USB 3.0 9.6.2.3: Container ID + struct ContainerIDCapabilityDescriptor : public DeviceCapabilityDescriptor + { +#else + struct ContainerIDCapabilityDescriptor + { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDevCapabilityType; +#endif + uint8_t bReserved; + uint32_t containerID[4]; + } __attribute__((packed)); + + typedef struct ContainerIDCapabilityDescriptor ContainerIDCapabilityDescriptor; + +#ifdef __cplusplus + // USB 3.1 9.6.2.4: Platform Descriptor + struct PlatformCapabilityDescriptor : public DeviceCapabilityDescriptor + { +#else + struct PlatformCapabilityDescriptor + { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDevCapabilityType; +#endif + uint8_t bReserved; + uuid_t uuidPlatformCapability; + }__attribute__((packed)); + + typedef struct PlatformCapabilityDescriptor PlatformCapabilityDescriptor; + + // USB Billboard 3.1.6.2: Billboard Capability Descriptor V1.2 + struct BillboardAltModeCapabilityCompatibility + { + uint16_t wSVID; + uint32_t dwAlternateMode; + uint8_t iAlternateModeString; + }__attribute__((packed)); + + typedef struct BillboardAltModeCapabilityCompatibility BillboardAltModeCapabilityCompatibility; + + // USB Billboard 3.1.6.2: Billboard Capability Descriptor V1.1 and 1.21+ + struct BillboardAltModeCapability + { + uint16_t wSVID; + uint8_t bAlternateMode; + uint8_t iAlternateModeString; + }__attribute__((packed)); + + typedef struct BillboardAltModeCapability BillboardAltModeCapability; + +#ifdef __cplusplus + // USB Billboard 3.1.6.2: Billboard Capability Descriptor + struct BillboardCapabilityDescriptor : public DeviceCapabilityDescriptor + { +#else + struct BillboardCapabilityDescriptor + { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDevCapabilityType; +#endif + uint8_t iAddtionalInfoURL; + uint8_t bNumberOfAlternateModes; + uint8_t bPreferredAlternateMode; + uint16_t VCONNPower; + uint8_t bmConfigured[32]; + uint16_t bcdVersion; + uint8_t bAdditonalFailureInfo; + uint8_t bReserved; + uint8_t altModeCapabilities[]; + }__attribute__((packed)); + + typedef struct BillboardCapabilityDescriptor BillboardCapabilityDescriptor; + +#ifdef __cplusplus + // USB Billboard 3.1.6.3: Billboard Capability Descriptor V1.21 + struct BillboardAltModeCapabilityDescriptor : public DeviceCapabilityDescriptor + { +#else + struct BillboardAltModeCapabilityDescriptor + { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDevCapabilityType; +#endif + uint8_t bIndex; + uint16_t dwAlternateModeVdo; + }__attribute__((packed)); + + typedef struct BillboardAltModeCapabilityDescriptor BillboardAltModeCapabilityDescriptor; + +#ifdef __cplusplus + // USB 3.0 9.6.4: Interface Association + struct InterfaceAssociationDescriptor: public Descriptor + { +#else + struct InterfaceAssociationDescriptor + { + uint8_t bLength; + uint8_t bDescriptorType; +#endif + uint8_t bFirstInterface; + uint8_t bInterfaceCount; + uint8_t bFunctionClass; + uint8_t bFunctionSubClass; + uint8_t bFunctionProtocol; + uint8_t iFunction; + } __attribute__((packed)); + + typedef struct InterfaceAssociationDescriptor InterfaceAssociationDescriptor; + + +#ifdef __cplusplus + // USB 3.1 9.6.7: SuperSpeed Endpoint Companion + struct SuperSpeedEndpointCompanionDescriptor : public Descriptor + { +#else + struct SuperSpeedEndpointCompanionDescriptor + { + uint8_t bLength; + uint8_t bDescriptorType; +#endif + uint8_t bMaxBurst; + uint8_t bmAttributes; + uint16_t wBytesPerInterval; + } __attribute__((packed)); + + typedef struct SuperSpeedEndpointCompanionDescriptor SuperSpeedEndpointCompanionDescriptor; + + + enum + { + kSuperSpeedEndpointCompanionDescriptorMaxBurst = kIOUSBSuperSpeedEndpointCompanionDescriptorMaxBurst, + kSuperSpeedEndpointCompanionDescriptorMaxBurstPhase = kIOUSBSuperSpeedEndpointCompanionDescriptorMaxBurstPhase, + + kSuperSpeedEndpointCompanionDescriptorBulkMaxStreams = kIOUSBSuperSpeedEndpointCompanionDescriptorBulkMaxStreams, + kSuperSpeedEndpointCompanionDescriptorBulkMaxStreamsPhase = kIOUSBSuperSpeedEndpointCompanionDescriptorBulkMaxStreamsPhase, + kSuperSpeedEndpointCompanionDescriptorBulkReserved = kIOUSBSuperSpeedEndpointCompanionDescriptorBulkReserved, + kSuperSpeedEndpointCompanionDescriptorBulkReservedPhase = kIOUSBSuperSpeedEndpointCompanionDescriptorBulkReservedPhase, + kSuperSpeedEndpointCompanionDescriptorIsocMult = kIOUSBSuperSpeedEndpointCompanionDescriptorIsocMult, + kSuperSpeedEndpointCompanionDescriptorIsocMultPhase = kIOUSBSuperSpeedEndpointCompanionDescriptorIsocMultPhase, + kSuperSpeedEndpointCompanionDescriptorIsocReserved = kIOUSBSuperSpeedEndpointCompanionDescriptorIsocReserved, + kSuperSpeedEndpointCompanionDescriptorIsocReservedPhase = kIOUSBSuperSpeedEndpointCompanionDescriptorIsocReservedPhase, + kSuperSpeedEndpointCompanionDescriptorSSPIsocCompanion = kIOUSBSuperSpeedEndpointCompanionDescriptorSSPIsocCompanion + }; + + +#ifdef __cplusplus + // USB 3.1 9.6.8: SuperSpeedPlus Isochronous Endpoint Companion + struct SuperSpeedPlusIsochronousEndpointCompanionDescriptor : public Descriptor + { +#else + struct SuperSpeedPlusIsochronousEndpointCompanionDescriptor + { + uint8_t bLength; + uint8_t bDescriptorType; +#endif + uint16_t wReserved; + uint32_t dwBytesPerInterval; + } __attribute__((packed)); + + typedef struct SuperSpeedPlusIsochronousEndpointCompanionDescriptor SuperSpeedPlusIsochronousEndpointCompanionDescriptor; + + +#ifdef __cplusplus + // USB 2.0 11.23.2.1: Hub Descriptor + struct HubDescriptor : public Descriptor + { +#else + struct HubDescriptor + { + uint8_t bLength; + uint8_t bDescriptorType; +#endif + uint8_t bNumberPorts; + uint16_t wHubCharacteristics; + uint8_t bPowerOnToPowerGood; + uint8_t bHubControllerCurrent; + uint8_t deviceRemovable[2]; // Technically variable size + uint8_t reserved[2]; // Unused + } __attribute__((packed)); + + typedef struct HubDescriptor HubDescriptor; + + +#ifdef __cplusplus + // USB 3.0 10.13.2.1: SuperSpeed Hub Descriptor + struct SuperSpeedHubDescriptor : public Descriptor + { +#else + struct SuperSpeedHubDescriptor + { + uint8_t bLength; + uint8_t bDescriptorType; +#endif + uint8_t bNumberPorts; + uint16_t wHubCharacteristics; + uint8_t bPowerOnToPowerGood; + uint8_t bHubControllerCurrent; + uint8_t bHubDecodeLatency; + uint16_t wHubDelay; + uint16_t deviceRemovable; + } __attribute__((packed)); + + typedef struct SuperSpeedHubDescriptor SuperSpeedHubDescriptor; + + + enum + { + kSuperSpeedHubCharacteristicsPowerSwitchingMask = kIOUSBSuperSpeedHubCharacteristicsPowerSwitchingMask, + kSuperSpeedHubCharacteristicsPowerSwitchingGanged = kIOUSBSuperSpeedHubCharacteristicsPowerSwitchingGanged, + kSuperSpeedHubCharacteristicsPowerSwitchingIndividual = kIOUSBSuperSpeedHubCharacteristicsPowerSwitchingIndividual, + kSuperSpeedHubCharacteristicsCompoundDevice = kIOUSBSuperSpeedHubCharacteristicsCompoundDevice, + kSuperSpeedHubCharacteristicsOverCurrentMask = kIOUSBSuperSpeedHubCharacteristicsOverCurrentMask, + kSuperSpeedHubCharacteristicsOverCurrentGlobal = kIOUSBSuperSpeedHubCharacteristicsOverCurrentGlobal, + kSuperSpeedHubCharacteristicsOverCurrentIndividual = kIOUSBSuperSpeedHubCharacteristicsOverCurrentIndividual, + kSuperSpeedHubCharacteristicsReserved = kIOUSBSuperSpeedHubCharacteristicsReserved, + + kSuperSpeedHubDecodeLatencyMax = kIOUSBSuperSpeedHubDecodeLatencyMax, + kSuperSpeedHubDelayMax = kIOUSBSuperSpeedHubDelayMax + }; + +#ifdef __cplusplus +#pragma mark Descriptor list parsing + /*! + * @brief Get the next descriptor in a configuration descriptor + * @discussion This method will advance currentDescriptor by its bLength, and validate that the new descriptor fits withing the bounds of configurationDescriptor. Using NULL for currentDescriptor will return the first descriptor after the configuration descriptor. + * @param configurationDescriptor Configuration descriptor that contains the descriptors to iterate through + * @param currentDescriptor A descriptor pointer within the bounds of configurationDescriptor, or NULL + * @return Descriptor pointer, or NULL if no descriptor can be returned + */ + const Descriptor* getNextDescriptor(const ConfigurationDescriptor* configurationDescriptor, const Descriptor* currentDescriptor); + + /*! + * @brief Find the next descriptor matching a given type within a configuration descriptor + * @discussion This method uses getNextDescriptor, and further validates that the returned descriptor's bDescriptorType field matches the type parameter. + * @param configurationDescriptor Configuration descriptor that contains the descriptors to iterate through + * @param currentDescriptor A descriptor pointer within the bounds of configurationDescriptor, or NULL + * @param type tDescriptorType representing the descriptor type to find + * @return Descriptor pointer, or NULL if no matching descriptor can be found + */ + const Descriptor* getNextDescriptorWithType(const ConfigurationDescriptor* configurationDescriptor, const Descriptor* currentDescriptor, const uint8_t type); + + /*! + * @brief Get the next descriptor in a configuration descriptor that belongs to another container descriptor + * @discussion This method uses getNextDescriptor, but will return NULL if another descriptor is found whose bDescriptorType field matches the value used for parentDescriptor's bDescriptorType. Using NULL for currentDescriptor will return the first descriptor after parentDescriptor. + * @param configurationDescriptor Configuration descriptor that contains the descriptors to iterate through + * @param parentDescriptor A descriptor pointer within the bounds of configurationDescriptor + * @param currentDescriptor A descriptor pointer within the bounds of configurationDescriptor, or NULL + * @return Descriptor pointer, or NULL if no descriptor can be returned + */ + const Descriptor* getNextAssociatedDescriptor(const ConfigurationDescriptor* configurationDescriptor, const Descriptor* parentDescriptor, const Descriptor* currentDescriptor); + + /*! + * @brief Find the next descriptor matching a given type within a configuration descriptor that belongs to another container descriptor + * @discussion This method uses getNextAssociatedDescriptor, and further validates that the returned descriptor's bDescriptorType field matches the type passed parameter. + * @param configurationDescriptor Configuration descriptor that contains the descriptors to iterate through + * @param parentDescriptor A descriptor pointer within the bounds of configurationDescriptor + * @param currentDescriptor A descriptor pointer within the bounds of configurationDescriptor, or NULL + * @param type tDescriptorType representing the descriptor type to find + * @return Descriptor pointer, or NULL if no matching descriptor can be found + */ + const Descriptor* getNextAssociatedDescriptorWithType(const ConfigurationDescriptor* configurationDescriptor, const Descriptor* parentDescriptor, const Descriptor* currentDescriptor, const uint8_t type); + + /*! + * @brief Find the next interface association descriptor in a configuration descriptor + * @discussion This method uses getNextDescriptorWithType to fetch the next interface association descriptor + * @param configurationDescriptor Configuration descriptor that contains the descriptors to iterate through + * @param currentDescriptor A descriptor pointer within the bounds of configurationDescriptor, or NULL + * @return InterfaceAssociationDescriptor pointer, or NULL if no matching descriptor can be found + */ + const InterfaceAssociationDescriptor* getNextInterfaceAssociationDescriptor(const ConfigurationDescriptor* configurationDescriptor, const Descriptor* currentDescriptor); + + /*! + * @brief Find the next interface descriptor in a configuration descriptor + * @discussion This method uses getNextDescriptorWithType to fetch the next interface descriptor + * @param configurationDescriptor Configuration descriptor that contains the descriptors to iterate through + * @param currentDescriptor A descriptor pointer within the bounds of configurationDescriptor, or NULL + * @return InterfaceDescriptor pointer, or NULL if no matching descriptor can be found + */ + const InterfaceDescriptor* getNextInterfaceDescriptor(const ConfigurationDescriptor* configurationDescriptor, const Descriptor* currentDescriptor); + + /*! + * @brief Find the next endpoint descriptor associated with an interface descriptor + * @discussion This method uses getNextAssociatedDescriptorWithType to fetch the next endpoint descriptor associated with a specific interface descriptor + * @param configurationDescriptor Configuration descriptor that contains the descriptors to iterate through + * @param interfaceDescriptor An interface descriptor within the bounds of configurationDescriptor + * @param currentDescriptor A descriptor pointer within the bounds of configurationDescriptor, or NULL + * @return EndpointDescriptor pointer, or NULL if no matching descriptor can be found + */ + const EndpointDescriptor* getNextEndpointDescriptor(const ConfigurationDescriptor* configurationDescriptor, const InterfaceDescriptor* interfaceDescriptor, const Descriptor* currentDescriptor); + + /*! + * @brief Get the next device capability descriptor in a BOS descriptor + * @discussion This method will advance currentDescriptor by its bLength, and validate that the new descriptor fits withing the bounds of bosDescriptor. Using NULL for currentDescriptor will return the first descriptor after the BOS descriptor. + * @param bosDescriptor BOS descriptor that contains the descriptors to iterate through + * @param currentDescriptor A descriptor pointer within the bounds of bosDescriptor, or NULL + * @return DeviceCapabilityDescriptor pointer, or NULL if no descriptor can be returned + */ + const DeviceCapabilityDescriptor* getNextCapabilityDescriptor(const BOSDescriptor* bosDescriptor, const DeviceCapabilityDescriptor* currentDescriptor); + + /*! + * @brief Find the next descriptor matching a given type within a BOS descriptor + * @discussion This method uses getNextCapabilityDescriptor, and further validates that the returned descriptor's bDevCapabilityType field matches the type parameter. + * @param bosDescriptor BOS descriptor that contains the descriptors to iterate through + * @param currentDescriptor A descriptor pointer within the bounds of bosDescriptor, or NULL + * @param type tDeviceCapabilityType representing the descriptor type to find + * @return DeviceCapabilityDescriptor pointer, or NULL if no matching descriptor can be found + */ + const DeviceCapabilityDescriptor* getNextCapabilityDescriptorWithType(const BOSDescriptor* bosDescriptor, const DeviceCapabilityDescriptor* currentDescriptor, const uint8_t type); + + /*! + * @brief Find the first USB20ExtensionCapabilityDescriptor in a BOS descriptor + * @discussion This method uses getNextCapabilityDescriptorWithType to fetch the first USB20ExtensionCapabilityDescriptor + * @param bosDescriptor BOS descriptor that contains the descriptors to iterate through + * @return USB20ExtensionCapabilityDescriptor pointer, or NULL if no matching descriptor can be found + */ + const USB20ExtensionCapabilityDescriptor* getUSB20ExtensionDeviceCapabilityDescriptor(const BOSDescriptor* bosDescriptor); + + /*! + * @brief Find the first SuperSpeedUSBDeviceCapabilityDescriptor in a BOS descriptor + * @discussion This method uses getNextCapabilityDescriptorWithType to fetch the first SuperSpeedUSBDeviceCapabilityDescriptor + * @param bosDescriptor BOS descriptor that contains the descriptors to iterate through + * @return SuperSpeedUSBDeviceCapabilityDescriptor pointer, or NULL if no matching descriptor can be found + */ + const SuperSpeedUSBDeviceCapabilityDescriptor* getSuperSpeedDeviceCapabilityDescriptor(const BOSDescriptor* bosDescriptor); + + /*! + * @brief Find the first SuperSpeedPlusUSBDeviceCapabilityDescriptor in a BOS descriptor + * @discussion This method uses getNextCapabilityDescriptorWithType to fetch the first SuperSpeedPlusUSBDeviceCapabilityDescriptor + * @param bosDescriptor BOS descriptor that contains the descriptors to iterate through + * @return SuperSpeedPlusUSBDeviceCapabilityDescriptor pointer, or NULL if no matching descriptor can be found + */ + const SuperSpeedPlusUSBDeviceCapabilityDescriptor* getSuperSpeedPlusDeviceCapabilityDescriptor(const BOSDescriptor* bosDescriptor); + + /*! + * @brief Find the first ContainerIDCapabilityDescriptor in a BOS descriptor + * @discussion This method uses getNextCapabilityDescriptorWithType to fetch the first ContainerIDCapabilityDescriptor + * @param bosDescriptor BOS descriptor that contains the descriptors to iterate through + * @return ContainerIDCapabilityDescriptor pointer, or NULL if no matching descriptor can be found + */ + const ContainerIDCapabilityDescriptor* getContainerIDDescriptor(const BOSDescriptor* bosDescriptor); + + /*! + * @brief Find the first PlatformCapabilityDescriptor in a BOS descriptor + * @discussion This method uses getNextCapabilityDescriptorWithType to fetch the first PlatformCapabilityDescriptor + * @param bosDescriptor BOS descriptor that contains the descriptors to iterate through + * @return PlatformCapabilityDescriptor pointer, or NULL if no matching descriptor can be found + */ + const PlatformCapabilityDescriptor* getPlatformCapabilityDescriptor(const BOSDescriptor* bosDescriptor); + + /*! + * @brief Find the first BillboardCapabilityDescriptor in a BOS descriptor + * @discussion This method uses getNextCapabilityDescriptorWithType to fetch the first BillboardCapabilityDescriptor + * @param bosDescriptor BOS descriptor that contains the descriptors to iterate through + * @return BillboardCapabilityDescriptor pointer, or NULL if no matching descriptor can be found + */ + const BillboardCapabilityDescriptor* getBillboardDescriptor(const BOSDescriptor* bosDescriptor); + + +#pragma mark Device descriptor parsing + /*! + * @brief Validate the contents of a device descriptor + * @discussion This method parses a device descriptor and validates its contents. If repairable validation errors are encountered, the descriptor passed in may be modified. + * @param usbDeviceSpeed The operational speed of the device + * @param descriptor The descriptor to validate + * @return bool true if the descriptor passed validation, false if it did not + */ + bool validateDeviceDescriptor(uint32_t usbDeviceSpeed, const DeviceDescriptor* descriptor); + +#pragma mark Endpoint descriptor parsing + /*! + * @brief Extract the direction of an endpoint from an endpoint descriptor + * @discussion This method parses an endpoint descriptor to determine its transfer direction + * @param descriptor The descriptor to parse + * @return tEndpointDirection indicating the direction found. Control endpoints return tEndpointDirection. + */ + uint8_t getEndpointDirection(const EndpointDescriptor* descriptor); + + /*! + * @brief Extract the direction and number of an endpoint from an endpoint descriptor + * @discussion This method parses an endpoint descriptor to determine its address + * @param descriptor The descriptor to parse + * @return uint8_t representing direction and endpoint number + */ + uint8_t getEndpointAddress(const EndpointDescriptor* descriptor); + + /*! + * @brief Extract the number of an endpoint from an endpoint descriptor + * @discussion This method parses an endpoint descriptor to determine its number, excluding direction + * @param descriptor The descriptor to parse + * @return uint8_t representing endpoint number + */ + uint8_t getEndpointNumber(const EndpointDescriptor* descriptor); + + /*! + * @brief Extract the type of an endpoint from an endpoint descriptor + * @discussion This method parses an endpoint descriptor to determine its type + * @param descriptor The descriptor to parse + * @return tEndpointType indicating the type found. + */ + uint8_t getEndpointType(const EndpointDescriptor* descriptor); + + /*! + * @brief Validate the max packet size of an endpoint descriptor + * @discussion This method parses an endpoint descriptor and validates the max packet size. If repairable validation errors are encountered, the descriptor passed in may be modified. + * @param usbDeviceSpeed The operational speed of the device + * @param descriptor The descriptor to validate + * @return bool true if the descriptor passed validation, false if it did not + */ + bool validateEndpointMaxPacketSize(uint32_t usbDeviceSpeed, const EndpointDescriptor* descriptor); + + /*! + * @brief Extract the max packet size from an endpoint descriptor + * @discussion This method parses an endpoint descriptor to determine its max packet size, which does not take into account mult or burst factors. + * @param usbDeviceSpeed The operational speed of the device + * @param descriptor The descriptor to parse + * @return uint16_t The max packet size in bytes + */ + uint16_t getEndpointMaxPacketSize(uint32_t usbDeviceSpeed, const EndpointDescriptor* descriptor); + + /*! + * @brief Validate the burst size of endpoint descriptors + * @discussion This method parses endpoint descriptors and validates the burst size. If repairable validation errors are encountered, the descriptors passed in may be modified. + * @param usbDeviceSpeed The operational speed of the device + * @param descriptor The EndpointDescriptor to validate + * @param companionDescriptor The SuperSpeedEndpointCompanionDescriptor to validate, or NULL + * @return bool true if the descriptor passed validation, false if it did not + */ + bool validateEndpointBurstSize(uint32_t usbDeviceSpeed, const EndpointDescriptor* descriptor, const SuperSpeedEndpointCompanionDescriptor* companionDescriptor); + + /*! + * @brief Validate the burst size of endpoint descriptors + * @discussion This method parses endpoint descriptors and validates the burst size. If repairable validation errors are encountered, the descriptors passed in may be modified. + * @param usbDeviceSpeed The operational speed of the device + * @param descriptor The EndpointDescriptor to validate + * @param companionDescriptor The SuperSpeedEndpointCompanionDescriptor to validate, or NULL + * @param sspCompanionDescriptor The SuperSpeedPlusIsochronousEndpointCompanionDescriptor to validate, or NULL + * @return bool true if the descriptor passed validation, false if it did not + */ + bool validateEndpointBurstSize(uint32_t usbDeviceSpeed, + const EndpointDescriptor* descriptor, + const SuperSpeedEndpointCompanionDescriptor* companionDescriptor, + const SuperSpeedPlusIsochronousEndpointCompanionDescriptor* sspCompanionDescriptor); + + /*! + * @brief Extract the burst size from endpoint descriptors + * @discussion This method parses endpoint descriptors to determine burst size, which includes mult and burst factors as applicable. + * @param usbDeviceSpeed The operational speed of the device + * @param descriptor The EndpointDescriptor to parse + * @param companionDescriptor The SuperSpeedEndpointCompanionDescriptor to parse, or NULL + * @return uint16_t The burst size in bytes + */ + uint16_t getEndpointBurstSize(uint32_t usbDeviceSpeed, const EndpointDescriptor* descriptor, const SuperSpeedEndpointCompanionDescriptor* companionDescriptor); + + /*! + * @brief Extract the burst size from endpoint descriptors + * @discussion This method parses endpoint descriptors to determine burst size, which includes mult and burst factors as applicable. SuperSpeed Plus isochronous endpoints will return the dwBytesPerInterval field from the SuperSpeedPlusIsochronousEndpointCompanionDescriptor parameter. + * @param usbDeviceSpeed The operational speed of the device + * @param descriptor The EndpointDescriptor to parse + * @param companionDescriptor The SuperSpeedEndpointCompanionDescriptor to parse, or NULL + * @param sspCompanionDescriptor The SuperSpeedPlusIsochronousEndpointCompanionDescriptor to parse, or NULL + * @return uint32_t The burst size in bytes + */ + uint32_t getEndpointBurstSize32(uint32_t usbDeviceSpeed, + const EndpointDescriptor* descriptor, + const SuperSpeedEndpointCompanionDescriptor* companionDescriptor = NULL, + const SuperSpeedPlusIsochronousEndpointCompanionDescriptor* sspCompanionDescriptor = NULL); + + /*! + * @brief Extract the mult count from endpoint descriptors + * @discussion This method parses endpoint descriptors to determine mult + * @param usbDeviceSpeed The operational speed of the device + * @param descriptor The EndpointDescriptor to parse + * @param companionDescriptor The SuperSpeedEndpointCompanionDescriptor to parse, or NULL + * @param sspCompanionDescriptor The SuperSpeedPlusIsochronousEndpointCompanionDescriptor to parse, or NULL + * @return uint8_t The mult count + */ + uint8_t getEndpointMult(uint32_t usbDeviceSpeed, + const EndpointDescriptor* descriptor, + const SuperSpeedEndpointCompanionDescriptor* companionDescriptor = NULL, + const SuperSpeedPlusIsochronousEndpointCompanionDescriptor* sspCompanionDescriptor = NULL); + + /*! + * @brief Validate the interval of an endpoint descriptor + * @discussion This method parses an endpoint descriptor and validates the interval. If repairable validation errors are encountered, the descriptor passed in may be modified. + * @param usbDeviceSpeed The operational speed of the device + * @param descriptor The EndpointDescriptor to validate + * @return bool true if the descriptor passed validation, false if it did not + */ + bool validateEndpointInterval(uint32_t usbDeviceSpeed, const EndpointDescriptor* descriptor); + + /*! + * @brief Extract the interval of an endpoint descriptor + * @discussion This method parses an endpoint descriptor and returns the service interval as n in (2^(n-1)) microframes + * @param usbDeviceSpeed The operational speed of the device + * @param descriptor The EndpointDescriptor to parse + * @return uint32_t Encoded endpoint interval + */ + uint32_t getEndpointIntervalEncodedMicroframes(uint32_t usbDeviceSpeed, const EndpointDescriptor* descriptor); + + /*! + * @brief Extract the interval of an endpoint descriptor + * @discussion This method parses an endpoint descriptor and returns the service interval in microframes + * @param usbDeviceSpeed The operational speed of the device + * @param descriptor The EndpointDescriptor to parse + * @return uint32_t Endpoint interval in microframes + */ + uint32_t getEndpointIntervalMicroframes(uint32_t usbDeviceSpeed, const EndpointDescriptor* descriptor); + + /*! + * @brief Extract the interval of an endpoint descriptor + * @discussion This method parses an endpoint descriptor and returns the service interval in frames + * @param usbDeviceSpeed The operational speed of the device + * @param descriptor The EndpointDescriptor to parse + * @return uint32_t Endpoint interval in frames + */ + uint32_t getEndpointIntervalFrames(uint32_t usbDeviceSpeed, const EndpointDescriptor* descriptor); + + /*! + * @brief Extract the number of streams supported by an endpoint + * @discussion This method parses endpoint descriptors and returns the number of streams supported as n in (2^n) + * @param usbDeviceSpeed The operational speed of the device + * @param descriptor The EndpointDescriptor to parse + * @param companionDescriptor The SuperSpeedEndpointCompanionDescriptor to parse + * @return uint32_t Encoded number of streams + */ + uint32_t getEndpointMaxStreamsEncoded(uint32_t usbDeviceSpeed, const EndpointDescriptor* descriptor, const SuperSpeedEndpointCompanionDescriptor* companionDescriptor); + + /*! + * @brief Extract the number of streams supported by an endpoint + * @discussion This method parses endpoint descriptors and returns the number of streams supported + * @param usbDeviceSpeed The operational speed of the device + * @param descriptor The EndpointDescriptor to parse + * @param companionDescriptor The SuperSpeedEndpointCompanionDescriptor to parse + * @return uint32_t Number of streams + */ + uint32_t getEndpointMaxStreams(uint32_t usbDeviceSpeed, const EndpointDescriptor* descriptor, const SuperSpeedEndpointCompanionDescriptor* companionDescriptor); + + /*! + * @brief Extract the maximum bus current required by a configuration descriptor + * @discussion This method parses a configuration descriptor and returns the number of milliamps required to power the device + * @param usbDeviceSpeed The operational speed of the device + * @param descriptor The ConfigurationDescriptor to parse + * @return uint32_t milliamps required + */ + uint32_t getConfigurationMaxPowerMilliAmps(uint32_t usbDeviceSpeed, const ConfigurationDescriptor* descriptor); + + /*! + * @brief Validate the contents of an endpoint descriptor + * @discussion This method parses an endpoint descriptor and validates its contents. If repairable validation errors are encountered, the descriptor passed in may be modified. + * @param usbDeviceSpeed The operational speed of the device + * @param descriptor The EndpointDescriptor to validate + * @param companionDescriptor The SuperSpeedEndpointCompanionDescriptor to validate, or NULL + * @return bool true if the descriptor passed validation, false if it did not + */ + bool validateEndpointDescriptor(uint32_t usbDeviceSpeed, const EndpointDescriptor* descriptor, const SuperSpeedEndpointCompanionDescriptor* companionDescriptor); + + /*! + * @brief Validate the contents of an endpoint descriptor + * @discussion This method parses an endpoint descriptor and validates its contents. If repairable validation errors are encountered, the descriptor passed in may be modified. + * @param usbDeviceSpeed The operational speed of the device + * @param descriptor The EndpointDescriptor to validate + * @param companionDescriptor The SuperSpeedEndpointCompanionDescriptor to validate, or NULL + * @param sspCompanionDescriptor The SuperSpeedPlusIsochronousEndpointCompanionDescriptor to validate, or NULL + * @return bool true if the descriptor passed validation, false if it did not + */ + bool validateEndpointDescriptor(uint32_t usbDeviceSpeed, + const EndpointDescriptor* descriptor, + const SuperSpeedEndpointCompanionDescriptor* companionDescriptor, + const SuperSpeedPlusIsochronousEndpointCompanionDescriptor* sspCompanionDescriptor); + +#pragma mark String descriptor parsing + /*! + * @brief Convert a USB string descriptor to a UTF8 character string + * @discussion This method uses utf8_encodestr with appropriate options to convert a USB string descriptor to a UTF8 string. + * @param stringDescriptor Descriptor to convert + * @param stringBuffer Buffer to write the UTF8 string to + * @param length Reference to size_t. As input it is the size stringBuffer. As output it is the number of character written to stringBuffer. + * @return IOReturn result code. kIOReturnSuccess if any portion of the string could be converted and placed in stringBuffer. kIOReturnError if the string descriptor cannot be converted to UTF8. + */ + IOReturn stringDescriptorToUTF8(const StringDescriptor* stringDescriptor, char* stringBuffer, size_t& length); + +#pragma mark Capability descriptor parsing + /*! + * @brief Validate the contents of a BOS descriptor + * @discussion This method parses a BOS descriptor and validates its contents, as well as the contents of its associated device capability descriptors. If repairable validation errors are encountered, the descriptor passed in may be modified. + * @param bosDescriptor The BOSDescriptor to validate + * @return bool true if the descriptor passed validation, false if it did not + */ + bool validateDeviceCapabilityDescriptors(const BOSDescriptor* bosDescriptor); + +#endif // __cplusplus + +#pragma mark Device requests + // USB 2.0 9.3: USB Device Requests + struct DeviceRequest + { + uint8_t bmRequestType; + uint8_t bRequest; + uint16_t wValue; + uint16_t wIndex; + uint16_t wLength; + } __attribute__((packed)); + + typedef struct DeviceRequest DeviceRequest; + + // USB 3.0 9.4.12: Set SEL Standard Device Request + struct DeviceRequestSetSELData + { + uint8_t u1Sel; // Time in μs for U1 System Exit Latency + uint8_t u1Pel; // Time in μs for U1 Device to Host Exit Latency + uint16_t u2Sel; // Time in μs for U2 System Exit Latency + uint16_t u2Pel; // Time in μs for U2 Device to Host Exit Latency + } __attribute__((packed)); + + typedef struct DeviceRequestSetSELData DeviceRequestSetSELData; + + enum + { + kDeviceRequestSize = kIOUSBDeviceRequestSize, + kDeviceRequestDirectionMask = kIOUSBDeviceRequestDirectionMask, + kDeviceRequestDirectionPhase = kIOUSBDeviceRequestDirectionPhase, + kDeviceRequestDirectionOut = kIOUSBDeviceRequestDirectionOut, + kDeviceRequestDirectionIn = kIOUSBDeviceRequestDirectionIn, + kDeviceRequestTypeMask = kIOUSBDeviceRequestTypeMask, + kDeviceRequestTypePhase = kIOUSBDeviceRequestTypePhase, + kDeviceRequestTypeStandard = kIOUSBDeviceRequestTypeStandard, + kDeviceRequestTypeClass = kIOUSBDeviceRequestTypeClass, + kDeviceRequestTypeVendor = kIOUSBDeviceRequestTypeVendor, + kDeviceRequestRecipientMask = kIOUSBDeviceRequestRecipientMask, + kDeviceRequestRecipientPhase = kIOUSBDeviceRequestRecipientPhase, + kDeviceRequestRecipientDevice = kIOUSBDeviceRequestRecipientDevice, + kDeviceRequestRecipientInterface= kIOUSBDeviceRequestRecipientInterface, + kDeviceRequestRecipientEndpoint = kIOUSBDeviceRequestRecipientEndpoint, + kDeviceRequestRecipientOther = kIOUSBDeviceRequestRecipientOther, + }; + + // USB 2.0 9.4: Standard Device Requests + // USB 3.0 9.4: Standard Device Requests + enum + { + kDeviceRequestGetStatus = kIOUSBDeviceRequestGetStatus, + kDeviceRequestClearFeature = kIOUSBDeviceRequestClearFeature, + kDeviceRequestGetState = kIOUSBDeviceRequestGetState, + kDeviceRequestSetFeature = kIOUSBDeviceRequestSetFeature, + kDeviceRequestSetAddress = kIOUSBDeviceRequestSetAddress, + kDeviceRequestGetDescriptor = kIOUSBDeviceRequestGetDescriptor, + kDeviceRequestSetDescriptor = kIOUSBDeviceRequestSetDescriptor, + kDeviceRequestGetConfiguration = kIOUSBDeviceRequestGetConfiguration, + kDeviceRequestSetConfiguration = kIOUSBDeviceRequestSetConfiguration, + kDeviceRequestGetInterface = kIOUSBDeviceRequestGetInterface, + kDeviceRequestSetInterface = kIOUSBDeviceRequestSetInterface, + kDeviceRequestSynchFrame = kIOUSBDeviceRequestSynchFrame, + kDeviceRequestSetSel = kIOUSBDeviceRequestSetSel, + kDeviceRequestSetIsochronousDelay = kIOUSBDeviceRequestSetIsochronousDelay + }; + + // USB 2.0 9.4.5: Get Status + // USB 3.0 9.4.5: Get Status + enum + { + kDeviceStatusSelfPowered = kIOUSBDeviceStatusSelfPowered, + kDeviceStatusRemoteWakeEnable = kIOUSBDeviceStatusRemoteWakeEnable, + kDeviceStatusU1Enable = kIOUSBDeviceStatusU1Enable, + kDeviceStatusU2Enable = kIOUSBDeviceStatusU2Enable, + kDeviceStatusLTMEnable = kIOUSBDeviceStatusLTMEnable, + + kInterfaceStatusRemoteWakeCapable = kIOUSBInterfaceStatusRemoteWakeCapable, + kInterfaceStatusRemoteWakeEnable = kIOUSBInterfaceStatusRemoteWakeEnable, + + kEndpointStatusHalt = IOUSBEndpointStatusHalt + }; + + // USB 2.0 Table 9-6: Standard Feature Selectors + // USB 3.0 Table 9-7: Standard Feature Selectors + enum + { + kDeviceFeatureSelectorRemoteWakeup = kIOUSBDeviceFeatureSelectorRemoteWakeup, + kDeviceFeatureSelectorTestMode = kIOUSBDeviceFeatureSelectorTestMode, + kDeviceFeatureSelectorU1Enable = kIOUSBDeviceFeatureSelectorU1Enable, + kDeviceFeatureSelectorU2Enable = kIOUSBDeviceFeatureSelectorU2Enable, + kDeviceFeatureSelectorLTMEnable = kIOUSBDeviceFeatureSelectorLTMEnable, + + kInterfaceFeatureSelectorSuspend = kIOUSBInterfaceFeatureSelectorSuspend, + + kEndpointFeatureSelectorStall = IOUSBEndpointFeatureSelectorStall, + }; + + // USB 3.0 Table 9-8: Suspend Options + enum + { + kInterfaceSuspendLowPower = kIOUSBInterfaceSuspendLowPower, + kInterfaceSuspendRemoteWakeEnable = kIOUSBInterfaceSuspendRemoteWakeEnable + }; + + // USB 3.0 Table 10-16: Hub Parameters + enum + { + kHubPort2PortExitLatencyNs = kIOUSBHubPort2PortExitLatencyNs, + kHubDelayNs = kIOUSBHubDelayNs + }; + + // USB 3.0 Table 8-33: Timing Parameters + enum + { + kPingResponseTimeNs = kIOUSBPingResponseTimeNs + }; + + enum tBusVoltage + { + kBusVoltageDefault = kIOUSBBusVoltageDefault + }; + +#ifdef __cplusplus +} + + +namespace StandardUSB20 +{ +#pragma mark BESL & HIRD Encodings + + /*! + * @brief BESL Encodings from Table X-X1 in USB 2.0 ECN Errata for Link Power Management + * @discussion This method converts the Best Effort Service Latency Index value used in the USB 2.0 Extension descriptor to Nanoseconds. + * @param beslIndex The BESL Index value used in the USB 2.0 Extension descriptor + * @param beslNs Reference to uint32_t. As output, it is the converted BESL value in Nanoseconds + * @return result code. kIOReturnSuccess if the conversion was successful. kIOReturnBadArgument if the input beslIndex is invalid. + */ + IOReturn convertBESLIndexToNs(uint32_t beslIndex, uint32_t& beslNs); + + /*! + * @brief BESL Encodings from Table X-X1 in USB 2.0 ECN Errata for Link Power Management + * @discussion This method does the opposite of convertBESLIndexToUs. It converts the BESL value in Nanoseconds to Index. + * @param beslNs The converted BESL value in Nanoseconds + * @param beslIndex Reference to uint32_t. As output, it is the BESL Index value converted from Nanoseconds. + * @return result code. kIOReturnSuccess if the conversion was successful. kIOReturnBadArgument if the input beslNs is invalid. + */ + IOReturn convertBESLNsToIndex(uint32_t beslNs, uint32_t &beslIndex); + + enum tBusCurrent + { + kBusCurrentMinimum = kIOUSB20BusCurrentMinimum, + kBusCurrentDefault = kIOUSB20BusCurrentDefault, + kBusCurrentMaxPowerUnits = kIOUSB20BusCurrentMaxPowerUnits + + }; +} + +namespace StandardUSB30 +{ + enum tBusCurrent + { + kBusCurrentMinimum = kIOUSB30BusCurrentMinimum, + kBusCurrentDefault = kIOUSB30BusCurrentDefault, + kBusCurrentMaxPowerUnits = kIOUSB30BusCurrentMaxPowerUnits + }; + + // USB 3.0 Table 6-21 + enum tResetTimeout + { + kResetMinimumTimeout = kIOUSB30ResetMinimumTimeout, + kResetTypicalTimeout = kIOUSB30ResetTypicalTimeout, + kResetMaximumTimeout = kIOUSB30ResetMaximumTimeout, + kResetMaximumWithMarginTimeout = kIOUSB30ResetMaximumWithMarginTimeout + }; + + // USB 3.0 Table 7-12 + enum tLinkStateTimeout + { + kLinkStateSSInactiveQuietTimeout = kIOUSB30LinkStateSSInactiveQuietTimeout, + kLinkStateRxDetectQuietTimeout = kIOUSB30LinkStateRxDetectQuietTimeout, + kLinkStatePollingLFPSTimeout = kIOUSB30LinkStatePollingLFPSTimeout, + kLinkStatePollingActiveTimeout = kIOUSB30LinkStatePollingActiveTimeout, + kLinkStatePollingConfigurationTimeout = kIOUSB30LinkStatePollingConfigurationTimeout, + kLinkStatePollingIdleTimeout = kIOUSB30LinkStatePollingIdleTimeout, + kLinkStateU0RecoveryTimeout = kIOUSB30LinkStateU0RecoveryTimeout, + kLinkStateU0LTimeout = kIOUSB30LinkStateU0LTimeout, // 10 microseconds + kLinkStateU1NoLFPSResponseTimeout = kIOUSB30LinkStateU1NoLFPSResponseTimeout, + kLinkStateU1PingTimeout = kIOUSB30LinkStateU1PingTimeout, + kLinkStateU2NoLFPSResponseTimeout = kIOUSB30LinkStateU2NoLFPSResponseTimeout, + kLinKStateU2RxDetectDelay = kIOUSB30LinKStateU2RxDetectDelay, + kLinkStateU3NoLFPSResponseTimeout = kIOUSB30LinkStateU3NoLFPSResponseTimeout, + kLinkStateU3WakeupRetryDelay = kIOUSB30LinkStateU3WakeupRetryDelay, + kLinkStateU3RxDetectDelay = kIOUSB30LinkStateU3RxDetectDelay, + kLinkStateRecoveryActiveTimeout = kIOUSB30LinkStateRecoveryActiveTimeout, + kLinkStateRecoveryConfigurationTimeout = kIOUSB30LinkStateRecoveryConfigurationTimeout, + kLinkStateRecoveryIdleTimeout = kIOUSB30LinkStateRecoveryIdleTimeout, + kLinkStateLoopbackExitTimeout = kIOUSB30LinkStateLoopbackExitTimeout, + kLinkStateHotResetActiveTimeout = kIOUSB30LinkStateHotResetActiveTimeout, + kLinkStateHotResetExistTimeout = kIOUSB30LinkStateHotResetExistTimeout, + + // USB 3.0 7.5.4 + kLinkStatePollingDeadline = kIOUSB30LinkStatePollingDeadline, + + // USB 3.0 7.5.9 and 7.5.10 + kLinkStateSSResumeDeadline = kIOUSB30LinkStateSSResumeDeadline, + }; + + // USB 3.1 Table 8-18 + enum tDeviceNotificationType + { + kDeviceNotificationTypeFunctionWake = kIOUSB30DeviceNotificationTypeFunctionWake, + kDeviceNotificationTypeLatencyTolerance = kIOUSB30DeviceNotificationTypeLatencyTolerance, + kDeviceNotificationTypeBusIntervalAdjustment = kIOUSB30DeviceNotificationTypeBusIntervalAdjustment, + kDeviceNotificationTypeHostRoleRequest = kIOUSB30DeviceNotificationTypeHostRoleRequest, + kDeviceNotificationTypeSublinkSpeed = kIOUSB30DeviceNotificationTypeSublinkSpeed + }; + + // USB 3.1 Table 8-36 + enum tTimingParameters + { + kTimingParameterBELTDefaultNs = kIOUSB30TimingParameterBELTDefaultNs, + kTimingParameterBELTMinNs = kIOUSB30TimingParameterBELTMinNs + }; + + // USB 3.1 Table 10-12 Port Status Type Codes + enum tHubPortStatusCode + { + tHubPortStatusCodeStandard = kIOUSB30HubPortStatusCodeStandard, + tHubPortStatusCodePD = kIOUSB30HubPortStatusCodePD, + tHubPortStatusCodeExt = kIOUSB30HubPortStatusCodeExt, + tHubPortStatusCodeCount = kIOUSB30HubPortStatusCodeCount + }; + + // USB 3.1 10.16.2.6 Get Port Status + struct tHubPortStatusExt + { + uint16_t wPortStatus; + uint16_t wPortChange; + uint32_t dwExtPortStatus; + } __attribute__((packed)); + + // USB 3.1 Table 10-11. Note, offsets are specific to dwExtPortStatus + enum tHubExtStatus + { + kHubExtStatusRxSublinkSpeedID = kIOUSB30HubExtStatusRxSublinkSpeedID, + kHubExtStatusRxSublinkSpeedIDPhase = kIOUSB30HubExtStatusRxSublinkSpeedIDPhase, + + kHubExtStatusTxSublinkSpeedID = kIOUSB30HubExtStatusTxSublinkSpeedID, + kHubExtStatusTxSublinkSpeedIDPhase = kIOUSB30HubExtStatusTxSublinkSpeedIDPhase, + + kHubExtStatusRxLaneCount = kIOUSB30HubExtStatusRxLaneCount, + kHubExtStatusRxLaneCountPhase = kIOUSB30HubExtStatusRxLaneCountPhase, + + kHubExtStatusTxLaneCount = kIOUSB30HubExtStatusTxLaneCount, + kHubExtStatusTxLaneCountPhase = kIOUSB30HubExtStatusTxLaneCountPhase + }; +} +#endif // __cplusplus + +#endif diff --git a/QualcommWireless/include/IOKit/usb/USB.h b/QualcommWireless/include/IOKit/usb/USB.h new file mode 100644 index 0000000..eb46ee1 --- /dev/null +++ b/QualcommWireless/include/IOKit/usb/USB.h @@ -0,0 +1,1286 @@ +/* + * Copyright © 1998-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _USB_H +#define _USB_H + +#include <IOKit/IOTypes.h> +#include <libkern/OSByteOrder.h> +#include <IOKit/usb/USBSpec.h> +#include <IOKit/usb/IOUSBHostFamilyDefinitions.h> +#include <IOKit/usb/AppleUSBDefinitions.h> + + +#if !__OPEN_SOURCE__ && TARGET_OS_IPHONE && !TARGET_OS_MACCATALYST +//these headers were previously exported for iOS clients +#include <IOKit/usb/IOUSBHostFamily.h> +#include <IOKit/usb/StandardUSB.h> + +// These are for Apple internal use only +#define kIOUSBMessageUpdateIdlePolicy kUSBHostMessageUpdateIdlePolicy +#define kIOUSBMessageRemoteWake kUSBHostMessageRemoteWake +#endif + +#if KERNEL +#include <IOKit/IOMemoryDescriptor.h> +#endif /* KERNEL */ + + +#ifdef __cplusplus +extern "C" { +#endif + +/*! + @header USB.h + @abstract Public Interfaces to the USB implementation in Mac OS X. + @discussion This header file contains definitions and structures that are used in the different USB API's in Mac OS X, both in the kernel and in the user space. + */ + +/*! + @defineblock Endian conversion definitions + @discussion The USB API's use a convention of specifying parameters in the host order. The USB spec specifies that multi-byte items should be + formatted in little endian order. The following macros allow one to translate multi-byte values from Host order to USB order and vice versa. There are separate macros for + in-kernel use and for user space use. + */ +#define USBToHostWord USBToHost16 +#define HostToUSBWord HostToUSB16 +#define USBToHostLong USBToHost32 +#define HostToUSBLong HostToUSB32 +/*! @/defineblock */ + +#ifndef USBBitRange +#define USBBitRange(start, end) IOUSBBitRange(start, end) +#endif + +#ifndef USBBitRangePhase +#define USBBitRangePhase(start, end) IOUSBBitRangePhase(start, end) +#endif + +/*! + @enum Miscellaneous Constants + @discussion + */ +enum +{ + kUSBDeviceIDShift = 7, + kUSBMaxDevices = 128, + kUSBMaxDevice = kUSBMaxDevices - 1, + kUSBDeviceIDMask = 0x7f, + kUSBTooManyDevicesAddress = 0xfffe, + + kUSBPipeIDMask = 0xf, + kUSBMaxPipes = 32, // In and Out pipes can have same pipe number. + + kUSBInterfaceIDShift = 8, + kUSBMaxInterfaces = 1 << kUSBInterfaceIDShift, + kUSBInterfaceIDMask = kUSBMaxInterfaces - 1, + + kUSBEndPtShift = 7, + kUSBDeviceMask = ((1 << kUSBEndPtShift) - 1), + + kUSBNoPipeIdx = -1, + +#ifndef __OPEN_SOURCE__ + // In order to ameliorate the effects of PCI Pause on drivers that do not subscribe to the USB Notifications for it, we have decided to sleep threads that come into the UIM + // while we are in PCI Pause. We will wake those threads up after the root hub drivers are back ON. However, we needed a way to detect that an I/O was coming from user space. + // One way to solve that would be to power manage the user client and do the sleep/wake there, but that was a big undertaking. Another way is for the user client to somehow + // let the UIM know through some APIs. We decided on a quick way by using bits that are part of the API to communicate that the request is coming from user space. For device + // requests we use the wLenDone field, a 32-bit quantity, but whose maximum value is only 16 bits. Same goes for the streamID of bulk requests. Those bits are set by the user + // client and cleared by the controller after checking them. If they are set and PCI Pause is active, we will sleep that request. +#endif + kUSBUCRequestWithoutUSBNotificationMask = (1 << 30), + kUSBEndpointTransferTypeUCMask = (1 << 7), + + // Constants for streams + kUSBStream0 = 0, + kUSBMaxStream = 65533, + kUSBPRimeStream = 0xfffe, + kUSBNoStream = 0xffff, + kUSBAllStreams = 0xffffffff, // Obsolete, use kUSBStreamIDAllStreamsMask + kUSBStreamIDMask = 0xffff, + kUSBStreamIDAllStreamsMask = (1 << 31) +}; + +/*! + @enum bRequest Shifts and Masks + @discussion These are used to create the macro to encode the bRequest field of a Device Request + */ +enum +{ + kUSBRqDirnShift = kIOUSBDeviceRequestDirectionPhase, + kUSBRqDirnMask = 1, + + kUSBRqTypeShift = kIOUSBDeviceRequestTypePhase, + kUSBRqTypeMask = 3, + + kUSBRqRecipientMask = kIOUSBDeviceRequestRecipientMask +}; + +/*! + @defined USBmakebmRequestType + @discussion Macro to encode the bmRequestType field of a Device Request. It is used when constructing an IOUSBDevRequest. + */ +#define USBmakebmRequestType(direction, type, recipient) \ + (((direction & kUSBRqDirnMask) << kUSBRqDirnShift) | \ + ((type & kUSBRqTypeMask) << kUSBRqTypeShift) | \ + (recipient & kUSBRqRecipientMask)) + +/*! + @enum kUSBMaxIsocFrameReqCount + @discussion Maximum size in bytes allowed for one Isochronous frame + */ +enum +{ + kUSBMaxFSIsocEndpointReqCount = 1023, // max size (bytes) of any one Isoc frame for 1 FS endpoint + kUSBMaxHSIsocEndpointReqCount = 3072, // max size (bytes) of any one Isoc frame for 1 HS endpoint + kUSBMaxHSIsocFrameCount = 7168 // max size (bytes) of all Isoc transfers in a HS frame +}; + +/*! + @defined EncodeRequest + @discussion Macro that encodes the bRequest and bRequestType fields of a IOUSBDevRequest into a single value. It is useful when one needs + to know what type of request the IOUSBDevRequest encodes and simplifies comparisons. + */ +#define EncodeRequest(request, direction, type, recipient) \ + (((UInt16)request << 8) + \ + ((UInt16)recipient + \ + ((UInt16)type << kUSBRqTypeShift) + \ + ((UInt16)direction << kUSBRqDirnShift))) + + +/*! + @enum Standard Device Requests + @discussion Encoding of the standard device requests. + <tt> + <pre><b> + bmRequestType bRequest wValue wIndex wLength Data</b> + 00000000B CLEAR_FEATURE Feature Zero Zero None (device) + 00000001B Feature Interface Zero None (Interface) + 00000010B Feature Endpoint Zero None (Endpoint) + + 10000000B GET_CONFIGURATION Zero Zero One Configuration + 10000000B GET_DESCRIPTOR Type LangID Length Descriptor + 10000001B GET_INTERFACE Zero Interface One Alternate + + 10000000B GET_STATUS Zero Zero Two status (device) + 10000001B Zero Interface Two status (Interface) + 10000010B Zero Endpoint Two status (Endpoint) + + 00000000B SET_ADDRESS Address Zero Zero None + 00000000B SET_CONFIGURATION Configuration Zero Zero None + 00000000B SET_DESCRIPTOR Type LangID Length Descriptor + + 00000000B SET_FEATURE Feature Zero Zero None (device) + 00000001B Feature Interface Zero None (Interface) + 00000010B Feature Endpoint Zero None (Endpoint) + + 00000001B SET_INTERFACE Alternate Interface Zero None + 10000010B SYNCH_FRAME Zero Endpoint Two Frame Number + </pre> + </tt> + */ +enum +{ + kClearDeviceFeature = EncodeRequest(kUSBRqClearFeature, kUSBOut, kUSBStandard, kUSBDevice), + kClearInterfaceFeature = EncodeRequest(kUSBRqClearFeature, kUSBOut, kUSBStandard, kUSBInterface), + kClearEndpointFeature = EncodeRequest(kUSBRqClearFeature, kUSBOut, kUSBStandard, kUSBEndpoint), + kGetConfiguration = EncodeRequest(kUSBRqGetConfig, kUSBIn, kUSBStandard, kUSBDevice), + kGetDescriptor = EncodeRequest(kUSBRqGetDescriptor, kUSBIn, kUSBStandard, kUSBDevice), + kGetInterface = EncodeRequest(kUSBRqGetInterface, kUSBIn, kUSBStandard, kUSBInterface), + kGetDeviceStatus = EncodeRequest(kUSBRqGetStatus, kUSBIn, kUSBStandard, kUSBDevice), + kGetInterfaceStatus = EncodeRequest(kUSBRqGetStatus, kUSBIn, kUSBStandard, kUSBInterface), + kGetEndpointStatus = EncodeRequest(kUSBRqGetStatus, kUSBIn, kUSBStandard, kUSBEndpoint), + kSetAddress = EncodeRequest(kUSBRqSetAddress, kUSBOut, kUSBStandard, kUSBDevice), + kSetConfiguration = EncodeRequest(kUSBRqSetConfig, kUSBOut, kUSBStandard, kUSBDevice), + kSetDescriptor = EncodeRequest(kUSBRqSetDescriptor, kUSBOut, kUSBStandard, kUSBDevice), + kSetDeviceFeature = EncodeRequest(kUSBRqSetFeature, kUSBOut, kUSBStandard, kUSBDevice), + kSetInterfaceFeature = EncodeRequest(kUSBRqSetFeature, kUSBOut, kUSBStandard, kUSBInterface), + kSetEndpointFeature = EncodeRequest(kUSBRqSetFeature, kUSBOut, kUSBStandard, kUSBEndpoint), + kSetInterface = EncodeRequest(kUSBRqSetInterface, kUSBOut, kUSBStandard, kUSBInterface), + kSyncFrame = EncodeRequest(kUSBRqSyncFrame, kUSBIn, kUSBStandard, kUSBEndpoint), +}; + +/*! + @defined kCallInterfaceOpenWithGate + @discussion If the USB Device has this property, drivers for any of its interfaces will have their handleOpen method called while holding the workloop gate. + */ +#define kCallInterfaceOpenWithGate "kCallInterfaceOpenWithGate" + +// TYPES + +typedef UInt16 USBDeviceAddress; + +typedef uint32_t USBPhysicalAddress32; + +/*! + @typedef IOUSBIsocFrame + @discussion Structure used to encode information about each isoc frame. + @param frStatus Returns status associated with the frame. + @param frReqCount Input specifiying how many bytes to read or write. + @param frActCount Actual # of bytes transferred. + */ +typedef struct IOUSBIsocFrame +{ + IOReturn frStatus; + UInt16 frReqCount; + UInt16 frActCount; +} IOUSBIsocFrame; + + +/*! + @typedef IOUSBLowLatencyIsocFrame + @discussion Structure used to encode information about each isoc frame that is processed + at hardware interrupt time (low latency). + @param frStatus Returns status associated with the frame. + @param frReqCount Input specifiying how many bytes to read or write. + @param frActCount Actual # of bytes transferred. + @param frTimeStamp Time stamp that indicates time when frame was procesed. + */ +struct IOUSBLowLatencyIsocFrame +{ + IOReturn frStatus; + UInt16 frReqCount; + UInt16 frActCount; + AbsoluteTime frTimeStamp; +}; + +typedef struct IOUSBLowLatencyIsocFrame IOUSBLowLatencyIsocFrame; + +/*! + @typedef IOUSBCompletionAction + @discussion Function called when USB I/O completes. + @param target The target specified in the IOUSBCompletion struct. + @param parameter The parameter specified in the IOUSBCompletion struct. + @param status Completion status. + @param bufferSizeRemaining Bytes left to be transferred. + */ +typedef void (* IOUSBCompletionAction)(void* target, + void* parameter, + IOReturn status, + UInt32 bufferSizeRemaining); + +/*! + @typedef IOUSBCompletionActionWithTimeStamp + @discussion Function called when USB I/O completes. + @param target The target specified in the IOUSBCompletion struct. + @param parameter The parameter specified in the IOUSBCompletion struct. + @param status Completion status. + @param bufferSizeRemaining Bytes left to be transferred. + @param timeStamp Time at which the transaction was processed. + */ +typedef void (* IOUSBCompletionActionWithTimeStamp)(void* target, + void* parameter, + IOReturn status, + UInt32 bufferSizeRemaining, + AbsoluteTime timeStamp); + +/*! + @typedef IOUSBIsocCompletionAction + @discussion Function called when Isochronous USB I/O completes. + @param target The target specified in the IOUSBIsocCompletionn struct. + @param parameter The parameter specified in the IOUSBIsocCompletion struct. + @param status Completion status. + @param pFrames Pointer to the frame list containing the status for each frame transferred. + */ +typedef void (* IOUSBIsocCompletionAction)(void* target, + void* parameter, + IOReturn status, + IOUSBIsocFrame* pFrames); + +/*! + @typedef IOUSBLowLatencyIsocCompletionAction + @discussion Function called when Low Latency Isochronous USB I/O completes. + @param target The target specified in the IOUSBLowLatencyIsocCompletion struct. + @param parameter The parameter specified in the IOUSBLowLatencyIsocCompletion struct. + @param status Completion status. + @param pFrames Pointer to the low latency frame list containing the status for each frame transferred. + */ +typedef void (* IOUSBLowLatencyIsocCompletionAction)(void* target, + void* parameter, + IOReturn status, + IOUSBLowLatencyIsocFrame* pFrames); + +/*! + @typedef IOUSBCompletion + @discussion Struct specifying action to perform when a USB I/O completes. + @param target The target to pass to the action function. + @param action The function to call. + @param parameter The parameter to pass to the action function. + */ +typedef struct IOUSBCompletion +{ + void* target; + IOUSBCompletionAction action; + void* parameter; +} IOUSBCompletion; + +/*! + @typedef IOUSBCompletionWithTimeStamp + @discussion Struct specifying action to perform when a USB I/O completes. + @param target The target to pass to the action function. + @param action The function to call. + @param parameter The parameter to pass to the action function. + */ +typedef struct IOUSBCompletionWithTimeStamp +{ + void* target; + IOUSBCompletionActionWithTimeStamp action; + void* parameter; +} IOUSBCompletionWithTimeStamp; + +/*! + @typedef IOUSBIsocCompletion + @discussion Struct specifying action to perform when an Isochronous USB I/O completes. + @param target The target to pass to the action function. + @param action The function to call. + @param parameter The parameter to pass to the action function. + */ +typedef struct IOUSBIsocCompletion +{ + void* target; + IOUSBIsocCompletionAction action; + void* parameter; +} IOUSBIsocCompletion; + +/*! + @typedef IOUSBLowLatencyIsocCompletion + @discussion Struct specifying action to perform when an Low Latency Isochronous USB I/O completes. + @param target The target to pass to the action function. + @param action The function to call. + @param parameter The parameter to pass to the action function. + */ +typedef struct IOUSBLowLatencyIsocCompletion +{ + void* target; + IOUSBLowLatencyIsocCompletionAction action; + void* parameter; +} IOUSBLowLatencyIsocCompletion; + +/*! + @defineblock IOUSBFamily error codes + @discussion Errors specific to the IOUSBFamily. Note that the iokit_usb_err(x) translates to 0xe0004xxx, where xxx is the value in parenthesis as a hex number. + */ + +#define iokit_usb_err(return ) (IOReturn)(sys_iokit | sub_iokit_usb | return ) +#define kIOUSBUnknownPipeErr iokit_usb_err(0x61) // 0xe0004061 Pipe ref not recognized +#define kIOUSBTooManyPipesErr iokit_usb_err(0x60) // 0xe0004060 Too many pipes +#define kIOUSBNoAsyncPortErr iokit_usb_err(0x5f) // 0xe000405f no async port +#define kIOUSBNotEnoughPipesErr iokit_usb_err(0x5e) // 0xe000405e not enough pipes in interface +#define kIOUSBNotEnoughPowerErr iokit_usb_err(0x5d) // 0xe000405d not enough power for selected configuration +#define kIOUSBEndpointNotFound iokit_usb_err(0x57) // 0xe0004057 Endpoint Not found +#define kIOUSBConfigNotFound iokit_usb_err(0x56) // 0xe0004056 Configuration Not found +#define kIOUSBPortWasSuspended iokit_usb_err(0x52) // 0xe0004052 The transaction was returned because the port was suspended +#define kIOUSBPipeStalled iokit_usb_err(0x4f) // 0xe000404f Pipe has stalled, error needs to be cleared +#define kIOUSBInterfaceNotFound iokit_usb_err(0x4e) // 0xe000404e Interface ref not recognized +#define kIOUSBLowLatencyBufferNotPreviouslyAllocated iokit_usb_err(0x4d) // 0xe000404d Attempted to use user land low latency isoc calls w/out calling PrepareBuffer (on the data buffer) first +#define kIOUSBLowLatencyFrameListNotPreviouslyAllocated iokit_usb_err(0x4c) // 0xe000404c Attempted to use user land low latency isoc calls w/out calling PrepareBuffer (on the frame list) first +#define kIOUSBHighSpeedSplitError iokit_usb_err(0x4b) // 0xe000404b Error to hub on high speed bus trying to do split transaction +#define kIOUSBSyncRequestOnWLThread iokit_usb_err(0x4a) // 0xe000404a A synchronous USB request was made on the workloop thread (from a callback?). Only async requests are permitted in that case +#define kIOUSBDeviceNotHighSpeed iokit_usb_err(0x49) // 0xe0004049 Name is deprecated, see below +#define kIOUSBDeviceTransferredToCompanion iokit_usb_err(0x49) // 0xe0004049 The device has been tranferred to another controller for enumeration +#define kIOUSBClearPipeStallNotRecursive iokit_usb_err(0x48) // 0xe0004048 IOUSBPipe::ClearPipeStall should not be called recursively +#define kIOUSBDevicePortWasNotSuspended iokit_usb_err(0x47) // 0xe0004047 Port was not suspended +#define kIOUSBEndpointCountExceeded iokit_usb_err(0x46) // 0xe0004046 The endpoint was not created because the controller cannot support more endpoints +#define kIOUSBDeviceCountExceeded iokit_usb_err(0x45) // 0xe0004045 The device cannot be enumerated because the controller cannot support more devices +#define kIOUSBStreamsNotSupported iokit_usb_err(0x44) // 0xe0004044 The request cannot be completed because the XHCI controller does not support streams +#define kIOUSBInvalidSSEndpoint iokit_usb_err(0x43) // 0xe0004043 An endpoint found in a SuperSpeed device is invalid (usually because there is no Endpoint Companion Descriptor) +#define kIOUSBTooManyTransactionsPending iokit_usb_err(0x42) // 0xe0004042 The transaction cannot be submitted because it would exceed the allowed number of pending transactions + +#if !__OPEN_SOURCE__ && TARGET_OS_IPHONE && !TARGET_OS_MACCATALYST +#define kIOUSBTransactionReturned kIOReturnAborted +#define kIOUSBTransactionTimeout kIOReturnTimeout +#else +#define kIOUSBTransactionReturned iokit_usb_err(0x50) // 0xe0004050 The transaction has been returned to the caller +#define kIOUSBTransactionTimeout iokit_usb_err(0x51) // 0xe0004051 Transaction timed out +#endif + +/*! + @definedblock IOUSBFamily hardware error codes + @discussion These errors are returned by the OHCI controller. The # in parenthesis (xx) corresponds to the OHCI Completion Code. + For the following Completion codes, we return a generic IOKit error instead of a USB specific error. + <tt> + <pre> + Completion Code Error Returned Description + 9 kIOReturnUnderrun (Data Underrun) EP returned less data than max packet size + 8 kIOReturnOverrun (Data Overrun) Packet too large or more data than buffer + 5 kIOReturnNotResponding Device Not responding + 4 kIOUSBPipeStalled Endpoint returned a STALL PID + </pre> + </tt> + */ +#define kIOUSBLinkErr iokit_usb_err(0x10) // 0xe0004010 +#define kIOUSBNotSent2Err iokit_usb_err(0x0f) // 0xe000400f Transaction not sent +#define kIOUSBNotSent1Err iokit_usb_err(0x0e) // 0xe000400e Transaction not sent +#define kIOUSBBufferUnderrunErr iokit_usb_err(0x0d) // 0xe000400d Buffer Underrun (Host hardware failure on data out, PCI busy?) +#define kIOUSBBufferOverrunErr iokit_usb_err(0x0c) // 0xe000400c Buffer Overrun (Host hardware failure on data out, PCI busy?) +#define kIOUSBReserved2Err iokit_usb_err(0x0b) // 0xe000400b Reserved +#define kIOUSBReserved1Err iokit_usb_err(0x0a) // 0xe000400a Reserved +#define kIOUSBWrongPIDErr iokit_usb_err(0x07) // 0xe0004007 Pipe stall, Bad or wrong PID +#define kIOUSBPIDCheckErr iokit_usb_err(0x06) // 0xe0004006 Pipe stall, PID CRC error +#define kIOUSBDataToggleErr iokit_usb_err(0x03) // 0xe0004003 Pipe stall, Bad data toggle +#define kIOUSBBitstufErr iokit_usb_err(0x02) // 0xe0004002 Pipe stall, bitstuffing +#define kIOUSBCRCErr iokit_usb_err(0x01) // 0xe0004001 Pipe stall, bad CRC +/*! @/definedblock */ + + +/*! + @defineblock IOUSBFamily message codes + @discussion Messages specific to the IOUSBFamily. Note that the iokit_usb_msg(x) translates to 0xe0004xxx, where xxx is the value in parenthesis as a hex number. + */ +#define iokit_usb_msg(message) (UInt32)(sys_iokit | sub_iokit_usb | message) +#define kIOUSBMessageHubResetPort iokit_usb_msg(0x01) // 0xe0004001 Message sent to a hub to reset a particular port +#define kIOUSBMessageHubSuspendPort iokit_usb_msg(0x02) // 0xe0004002 Message sent to a hub to suspend a particular port +#define kIOUSBMessageHubResumePort iokit_usb_msg(0x03) // 0xe0004003 Message sent to a hub to resume a particular port +#define kIOUSBMessageHubIsDeviceConnected iokit_usb_msg(0x04) // 0xe0004004 Message sent to a hub to inquire whether a particular port has a device connected or not +#define kIOUSBMessageHubIsPortEnabled iokit_usb_msg(0x05) // 0xe0004005 Message sent to a hub to inquire whether a particular port is enabled or not +#define kIOUSBMessageHubReEnumeratePort iokit_usb_msg(0x06) // 0xe0004006 Message sent to a hub to reenumerate the device attached to a particular port +#define kIOUSBMessagePortHasBeenReset iokit_usb_msg(0x0a) // 0xe000400a Message sent to a device indicating that the port it is attached to has been reset +#define kIOUSBMessagePortHasBeenResumed iokit_usb_msg(0x0b) // 0xe000400b Message sent to a device indicating that the port it is attached to has been resumed +#define kIOUSBMessageHubPortClearTT iokit_usb_msg(0x0c) // 0xe000400c Message sent to a hub to clear the transaction translator +#define kIOUSBMessagePortHasBeenSuspended iokit_usb_msg(0x0d) // 0xe000400d Message sent to a device indicating that the port it is attached to has been suspended +#define kIOUSBMessageFromThirdParty iokit_usb_msg(0x0e) // 0xe000400e Message sent from a third party. Uses IOUSBThirdPartyParam to encode the sender's ID +#define kIOUSBMessagePortWasNotSuspended iokit_usb_msg(0x0f) // 0xe000400f Message indicating that the hub driver received a resume request for a port that was not suspended +#define kIOUSBMessageExpressCardCantWake iokit_usb_msg(0x10) // 0xe0004010 Message from a driver to a bus that an express card will disconnect on sleep and thus shouldn't wake +#define kIOUSBMessageCompositeDriverReconfigured iokit_usb_msg(0x11) // 0xe0004011 Message from the composite driver indicating that it has finished re-configuring the device after a reset +#define kIOUSBMessageHubSetPortRecoveryTime iokit_usb_msg(0x12) // 0xe0004012 Message sent to a hub to set the # of ms required when resuming a particular port +#define kIOUSBMessageOvercurrentCondition iokit_usb_msg(0x13) // 0xe0004013 Message sent to the clients of the device's hub parent, when a device causes an overcurrent condition. The message argument contains the locationID of the device +#define kIOUSBMessageNotEnoughPower iokit_usb_msg(0x14) // 0xe0004014 Message sent to the clients of the device's hub parent, when a device causes an low power notice to be displayed. The message argument contains the locationID of the device +#define kIOUSBMessageController iokit_usb_msg(0x15) // 0xe0004015 Generic message sent from controller user client to controllers +#define kIOUSBMessageRootHubWakeEvent iokit_usb_msg(0x16) // 0xe0004016 Message from the HC Wakeup code indicating that a Root Hub port has a wake event +#define kIOUSBMessageReleaseExtraCurrent iokit_usb_msg(0x17) // 0xe0004017 Message to ask any clients using extra current to release it if possible +#define kIOUSBMessageReallocateExtraCurrent iokit_usb_msg(0x18) // 0xe0004018 Message to ask any clients using extra current to attempt to allocate it some more +#define kIOUSBMessageEndpointCountExceeded iokit_usb_msg(0x19) // 0xe0004019 Message sent to a device when endpoints cannot be created because the USB controller ran out of resources +#define kIOUSBMessageDeviceCountExceeded iokit_usb_msg(0x1a) // 0xe000401a Message sent by a hub when a device cannot be enumerated because the USB controller ran out of resources +#define kIOUSBMessageHubPortDeviceDisconnected iokit_usb_msg(0x1b) // 0xe000401b Message sent by a built-in hub when a device was disconnected +#define kIOUSBMessageUnsupportedConfiguration iokit_usb_msg(0x1c) // 0xe000401c Message sent to the clients of the device when a device is not supported in the current configuration. The message argument contains the locationID of the device +#define kIOUSBMessageHubCountExceeded iokit_usb_msg(0x1d) // 0xe000401d Message sent when a 6th hub was plugged in and was not enumerated, as the USB spec only support 5 hubs in a chain +#define kIOUSBMessageTDMLowBattery iokit_usb_msg(0x1e) // 0xe000401e Message sent when when an attached TDM system battery is running low. +#define kIOUSBMessageLegacySuspendDevice iokit_usb_msg(0x1f) // 0xe000401f Message sent to legacy interfaces when SuspedDevice() is called . +#define kIOUSBMessageLegacyResetDevice iokit_usb_msg(0x20) // 0xe0004020 Message sent to legacy interfaces when ResetDevice() is called . +#define kIOUSBMessageLegacyReEnumerateDevice iokit_usb_msg(0x21) // 0xe0004021 Message sent to legacy interfaces when ReEnumerateDevice() is called . + +#define kIOUSBMessageRenegotiateCurrent kUSBHostMessageRenegotiateCurrent + +#if !__OPEN_SOURCE__ && TARGET_OS_IPHONE && !TARGET_OS_MACCATALYST +#define kIOUSBMessageConfigurationSet kUSBHostMessageConfigurationSet +#else +#define kIOUSBMessageConfigurationSet iokit_usb_msg(0x22) // 0xe0004022 Message sent upon a SetConfiguration call +#endif + +// Obsolete +// +struct IOUSBMouseData +{ + UInt16 buttons; + SInt16 XDelta; + SInt16 YDelta; +}; + +typedef struct IOUSBMouseData IOUSBMouseData; +typedef IOUSBMouseData* IOUSBMouseDataPtr; + +// Obsolete +// +struct IOUSBKeyboardData +{ + UInt16 keycount; + UInt16 usbkeycode[32]; +}; + +typedef struct IOUSBKeyboardData IOUSBKeyboardData; +typedef IOUSBKeyboardData* IOUSBKeyboardDataPtr; + +// Obsolete +// +union IOUSBHIDData +{ + IOUSBKeyboardData kbd; + IOUSBMouseData mouse; +}; + +typedef union IOUSBHIDData IOUSBHIDData; +typedef IOUSBHIDData* IOUSBHIDDataPtr; + + +typedef IOUSBDeviceDescriptor* IOUSBDeviceDescriptorPtr; +typedef IOUSBDescriptorHeader* IOUSBDescriptorHeaderPtr; +typedef IOUSBBOSDescriptor* IOUSBBOSDescriptorPtr; +typedef IOUSBDeviceCapabilityDescriptorHeader* IOUSBDeviceCapabilityDescriptorHeaderPtr; +typedef IOUSBDeviceCapabilityUSB2Extension* IOUSBDeviceCapabilityUSB2ExtensionPtr; +typedef IOUSBDeviceCapabilitySuperSpeedUSB* IOUSBDeviceCapabilitySuperSpeedUSBPtr; +typedef IOUSBDeviceCapabilitySuperSpeedPlusUSB* IOUSBDeviceCapabilitySuperSpeedPlusUSBPtr; +typedef IOUSBDeviceCapabilityContainerID* IOUSBDeviceCapabilityContainerIDPtr; +typedef IOUSBPlatformCapabilityDescriptor* IOUSBPlatformCapabilityDescriptorPtr; +typedef IOUSBDeviceCapabilityBillboardAltConfig* IOUSBDeviceCapabilityBillboardAltConfigPtr; +typedef IOUSBDeviceCapabilityBillboard* IOUSBDeviceCapabilityBillboardPtr; +typedef IOUSBDeviceCapabilityBillboardAltMode* IOUSBDeviceCapabilityBillboardAltModePtr; +typedef IOUSBConfigurationDescriptor* IOUSBConfigurationDescriptorPtr; +typedef IOUSBConfigurationDescHeader* IOUSBConfigurationDescHeaderPtr; +typedef IOUSBInterfaceDescriptor* IOUSBInterfaceDescriptorPtr; +typedef IOUSBEndpointDescriptor* IOUSBEndpointDescriptorPtr; +typedef IOUSBStringDescriptor* IOUSBStringDescriptorPtr; +typedef IOUSBSuperSpeedEndpointCompanionDescriptor* IOUSBSuperSpeedEndpointCompanionDescriptorPtr; +typedef IOUSBSuperSpeedPlusIsochronousEndpointCompanionDescriptor* IOUSBSuperSpeedPlusIsochronousEndpointCompanionDescriptorPtr; +typedef UASPipeDescriptor* UASPipeDescriptorPtr; +typedef IOUSBHIDDescriptor* IOUSBHIDDescriptorPtr; +typedef IOUSBHIDReportDesc* IOUSBHIDReportDescPtr; +typedef IOUSBDeviceQualifierDescriptor* IOUSBDeviceQualifierDescriptorPtr; +typedef IOUSBDFUDescriptor* IOUSBDFUDescriptorPtr; +typedef IOUSBInterfaceAssociationDescriptor* IOUSBInterfaceAssociationDescriptorPtr; + +enum +{ + kIOUSBDeviceCapabilityDescriptorType = 16, + kIOUSBDeviceCapabilityDescriptorLengthMin = 3, +}; + + + +enum +{ + kUSB_EPDesc_bmAttributes_TranType_Mask = USBBitRange(0, 1), + kUSB_EPDesc_bmAttributes_TranType_Shift = USBBitRangePhase(0, 1), + kUSB_EPDesc_bmAttributes_SyncType_Mask = USBBitRange(2, 3), + kUSB_EPDesc_bmAttributes_SyncType_Shift = USBBitRangePhase(2, 3), + kUSB_EPDesc_bmAttributes_UsageType_Mask = USBBitRange(4, 5), + kUSB_EPDesc_bmAttributes_UsageType_Shift = USBBitRangePhase(4, 5), + + kUSB_EPDesc_wMaxPacketSize_MPS_Mask = USBBitRange(0, 10), + kUSB_EPDesc_wMaxPacketSize_MPS_Shift = USBBitRangePhase(0, 10), + kUSB_EPDesc_MaxMPS = 1024, // this is the maximum no matter what + + kUSB_HSFSEPDesc_wMaxPacketSize_Mult_Mask = USBBitRange(11, 12), + kUSB_HSFSEPDesc_wMaxPacketSize_Mult_Shift = USBBitRangePhase(11, 12) +}; + +enum +{ + kUSB_SSCompDesc_Bulk_MaxStreams_Mask = USBBitRange(0, 4), + kUSB_SSCompDesc_Bulk_MaxStreams_Shift = USBBitRangePhase(0, 4), + kUSB_SSCompDesc_Isoc_Mult_Mask = USBBitRange(0, 1), + kUSB_SSCompDesc_Isoc_Mult_Shift = USBBitRangePhase(0, 1) +}; + + +#ifndef __OPEN_SOURCE__ +// Leave this here because it has existed for many years, but it never really belonged here in the first place +#endif + +// these following 2 lines are deprecated and should not be used. +enum {addPacketShift = 11}; // Bits for additional packets in maxPacketField. (Table 9-13) + +#define mungeMaxPacketSize(w) ((w > 1024) ? (((w >> (addPacketShift)) + 1) * (w & ((1 << addPacketShift) - 1))) : w) + +/*! + @typedef IOUSBEndpointProperties + @discussion Structure used with the IOUSBLib GetEndpointPropertiesV3 and GetPipePropertiesV3 API. Most of the fields are taken directly from corresponding Standard Endpoint Descriptor and SuperSpeed Endpoint Companion Descriptor. wBytesPerInterval will be synthesized for High Speed High Bandwidth Isochronous endpoints. + @field bVersion Version of the structure. Currently kUSBEndpointPropertiesVersion3. Need to set this when using this structure + @field bAlternateSetting Used as an input for GetEndpointPropertiesV3. Used as an output for GetPipePropertiesV3 + @field bDirection Used as an input for GetEndpointPropertiesV3. Used as an output for GetPipePropertiesV3. One of kUSBIn or kUSBOut. + @field bEndpointNumber Used as an input for GetEndpointPropertiesV3. Used as an output for GetPipePropertiesV3 + @field bTransferType One of kUSBControl, kUSBBulk, kUSBIsoc, or kUSBInterrupt + @field bUsageType For interrupt and isoc endpoints, the usage type. For Bulk endpoints of the UAS Mass Storage Protocol, the pipe ID. + @field bSyncType For isoc endpoints only + @field bInterval The bInterval field from the Standard Endpoint descriptor. + @field wMaxPacketSize The meaning of this value depends on whether this is called with GetPipePropertiesV3 or GetEndpointPropertiesV3. See the documentation of those calls for more info. + @field bMaxBurst For SuperSpeed endpoints, maximum number of packets the endpoint can send or receive as part of a burst + @field bMaxStreams For SuperSpeed bulk endpoints, maximum number of streams this endpoint supports. + @field bMult For SuperSpeed isoc endpoints, this is the mult value from the SuperSpeed Endpoint Companion Descriptor. For High Speed isoc and interrupt endpoints, this is bits 11 and 12 of the Standard Endpoint Descriptor, which represents a similar value. + @field wBytesPerInterval For SuperSpeed interrupt and isoc endpoints, this is the wBytesPerInterval from the SuperSpeed Endpoint Companion Descriptor. For High Speed High Bandwidth isoc endpoints, this will be equal to wMaxPacketSize * (bMult+1). + */ +struct IOUSBEndpointProperties +{ + UInt8 bVersion; + UInt8 bAlternateSetting; + UInt8 bDirection; + UInt8 bEndpointNumber; + UInt8 bTransferType; + UInt8 bUsageType; + UInt8 bSyncType; + UInt8 bInterval; + UInt16 wMaxPacketSize; + UInt8 bMaxBurst; + UInt8 bMaxStreams; + UInt8 bMult; + UInt16 wBytesPerInterval; +} __attribute__((packed)); + +typedef struct IOUSBEndpointProperties IOUSBEndpointProperties; +typedef IOUSBEndpointProperties* IOUSBEndpointPropertiesPtr; + +/*! + @enum USBGetEndpointVersion + @discussion Version of the IOUSBEndpointProperties structure. + @constant kUSBEndpointPropertiesVersion3 Version that has support for USB3 SuperSpeed Endpoint Companion fields. + */ +enum +{ + kUSBEndpointPropertiesVersion3 = 0x03 +}; + +/*! + @typedef USBStatus + @discussion Type used to get a DeviceStatus as a single quantity. + */ +typedef UInt16 USBStatus; +typedef USBStatus* USBStatusPtr; + +// These constants are obsolete +// +enum +{ + kIOUSBAnyClass = 0xFFFF, + kIOUSBAnySubClass = 0xFFFF, + kIOUSBAnyProtocol = 0xFFFF, + kIOUSBAnyVendor = 0xFFFF, + kIOUSBAnyProduct = 0xFFFF +}; + +// This structure are obsolete +// +typedef struct IOUSBMatch +{ + UInt16 usbClass; + UInt16 usbSubClass; + UInt16 usbProtocol; + UInt16 usbVendor; + UInt16 usbProduct; +} IOUSBMatch; + +/*! + @typedef IOUSBFindEndpointRequest + @discussion Struct used to find endpoints of an interface + type and direction are used to match endpoints, + type, direction, maxPacketSize and interval are updated + with the properties of the found endpoint. + @field type Type of endpoint: kUSBControl, kUSBIsoc, kUSBBulk, kUSBInterrupt, kUSBAnyType. If kUSBAnyType is specified, this field is treated as a don't care. + @field direction Direction of endpoint: kUSBOut, kUSBIn, kUSBAnyDirn. If kUSBAnyDirn is specified, this field is treated as a don't care. + @field maxPacketSize maximum packet size of endpoint. + @field interval Polling interval in mSec for endpoint. + */ +typedef struct +{ + UInt8 type; + UInt8 direction; + UInt16 maxPacketSize; + UInt8 interval; +} IOUSBFindEndpointRequest; + +/*! + @struct IOUSBDevRequest + @discussion Parameter block for control requests, using a simple pointer + for the data to be transferred. + @field bmRequestType Request type: kUSBStandard, kUSBClass or kUSBVendor + @field bRequest Request code + @field wValue 16 bit parameter for request, host endianess + @field wIndex 16 bit parameter for request, host endianess + @field wLength Length of data part of request, 16 bits, host endianess + @field pData Pointer to data for request - data returned in bus endianess + @field wLenDone Set by standard completion routine to number of data bytes + actually transferred + */ +typedef struct +{ + UInt8 bmRequestType; + UInt8 bRequest; + UInt16 wValue; + UInt16 wIndex; + UInt16 wLength; + void* pData; + UInt32 wLenDone; +} IOUSBDevRequest; +typedef IOUSBDevRequest* IOUSBDeviceRequestPtr; + +/*! + @struct IOUSBDevRequestTO + @discussion Parameter block for control requests with timeouts, using a simple pointer + for the data to be transferred. Same as a IOUSBDevRequest except for the two extra timeout fields. + @field bmRequestType Request type: kUSBStandard, kUSBClass or kUSBVendor + @field bRequest Request code + @field wValue 16 bit parameter for request, host endianess + @field wIndex 16 bit parameter for request, host endianess + @field wLength Length of data part of request, 16 bits, host endianess + @field pData Pointer to data for request - data returned in bus endianess + @field wLenDone Set by standard completion routine to number of data bytes + actually transferred + @field noDataTimeout Specifies a time value in milliseconds. Once the request is queued on the bus, if no data is transferred in this amount of time, the request will be aborted and returned. + @field completionTimeout Specifies a time value in milliseconds. Once the request is queued on the bus, if the entire request is not completed in this amount of time, the request will be aborted and returned + */ +typedef struct +{ + UInt8 bmRequestType; + UInt8 bRequest; + UInt16 wValue; + UInt16 wIndex; + UInt16 wLength; + void* pData; + UInt32 wLenDone; + UInt32 noDataTimeout; + UInt32 completionTimeout; +} IOUSBDevRequestTO; + +/*! + @enum Default timeout values + @discussion default values used for data and completion timeouts. + */ +enum +{ + kUSBDefaultControlNoDataTimeoutMS = 5000, + kUSBDefaultControlCompletionTimeoutMS = 0 +}; + +// Internal structure to pass parameters between IOUSBLib and UserClient +// +typedef struct +{ + UInt32 pipeRef; + void* buf; + UInt32 size; + UInt32 noDataTimeout; + UInt32 completionTimeout; +} IOUSBBulkPipeReq; + +#if KERNEL +/*! + @struct IOUSBDevRequestDesc + @discussion Parameter block for control requests, using a memory descriptor + for the data to be transferred. Only available in the kernel. + @field bmRequestType Request type: kUSBStandard, kUSBClass or kUSBVendor + @field bRequest Request code + @field wValue 16 bit parameter for request, host endianess + @field wIndex 16 bit parameter for request, host endianess + @field wLength Length of data part of request, 16 bits, host endianess + @field pData Pointer to memory descriptor for data for request - data returned in bus endianess + @field wLenDone Set by standard completion routine to number of data bytes + actually transferred + */ +typedef struct +{ + UInt8 bmRequestType; + UInt8 bRequest; + UInt16 wValue; + UInt16 wIndex; + UInt16 wLength; + IOMemoryDescriptor* pData; + UInt32 wLenDone; +} IOUSBDevRequestDesc; +// TODO: move IOUSBDevRequestDesc to be shared between kernel and user. + +/*! + @enum IOUSBFamilyIOOptionBit + @discussion Options used exclusively by the USB Family when calling calling IOService APIs, such as open() and close(). + @constant kIOUSBInterfaceOpenAlt Open the alternate interface specified when creating the interface. + @constant kUSBOptionBitOpenExclusivelyBit Used in open()'ing the IOUSBDevice or IOUSBInterface by the corresponding user client. Only 1 user client can have exclusive access to those objects + */ +enum +{ + kIOUSBInterfaceOpenAlt = 0x00010000, + kIOUSBInterfaceOpenAlternateInterfaceBit = 16, + kUSBOptionBitOpenExclusivelyBit = 17, + kIOUSBInterfaceOpenAlternateInterfaceMask = ( 1 << kIOUSBInterfaceOpenAlternateInterfaceBit ), + kUSBOptionBitOpenExclusivelyMask = ( 1 << kUSBOptionBitOpenExclusivelyBit ) +}; + +#endif + +// Internal structure to pass parameters between IOUSBLib and UserClient +// +// use a structure because there's a limit of 6 total arguments +// to a user client method. +typedef struct +{ + UInt8 bmRequestType; + UInt8 bRequest; + UInt16 wValue; + UInt16 wIndex; + UInt16 wLength; + void* pData; // data pointer + UInt32 wLenDone; // # bytes transferred + UInt8 pipeRef; +} IOUSBDevReqOOL; + +// Internal structure to pass parameters between IOUSBLib and UserClient +// +typedef struct +{ + UInt8 bmRequestType; + UInt8 bRequest; + UInt16 wValue; + UInt16 wIndex; + UInt16 wLength; + void* pData; // data pointer + UInt32 wLenDone; // # bytes transferred + UInt8 pipeRef; + UInt32 noDataTimeout; + UInt32 completionTimeout; +} IOUSBDevReqOOLTO; + +// Internal structure to pass parameters between IOUSBLib and UserClient +// +// Structure to request isochronous transfer +// +typedef struct +{ + UInt32 fPipe; + void* fBuffer; + UInt32 fBufSize; + UInt64 fStartFrame; + UInt32 fNumFrames; + IOUSBIsocFrame* fFrameCounts; +} IOUSBIsocStruct; + +// Internal structure to pass parameters between IOUSBLib and UserClient +// +// Structure to request low latency isochronous transfer +// +struct IOUSBLowLatencyIsocStruct +{ + UInt32 fPipe; + UInt32 fBufSize; + UInt64 fStartFrame; + UInt32 fNumFrames; + UInt32 fUpdateFrequency; + UInt32 fDataBufferCookie; + UInt32 fDataBufferOffset; + UInt32 fFrameListBufferCookie; + UInt32 fFrameListBufferOffset; +}; + +typedef struct IOUSBLowLatencyIsocStruct IOUSBLowLatencyIsocStruct; + + +/*! + @struct IOUSBGetFrameStruct + @discussion Structure used from user space to return the frame number and a timestamp on when the frame register was read. + @field frame frame number + @field timeStamp AbsoluteTime when the frame was updated + */ +typedef struct +{ + UInt64 frame; + AbsoluteTime timeStamp; +} IOUSBGetFrameStruct; + + +/*! + @struct IOUSBFindInterfaceRequest + @discussion Structure used with FindNextInterface. + */ +typedef struct +{ + UInt16 bInterfaceClass; // requested class + UInt16 bInterfaceSubClass; // requested subclass + UInt16 bInterfaceProtocol; // requested protocol + UInt16 bAlternateSetting; // requested alt setting +} IOUSBFindInterfaceRequest; + +/*! + @enum kIOUSBFindInterfaceDontCare + @discussion Constant that can be used for the fields of IOUSBFindInterfaceRequest to specify that they should not be matched. + */ +enum +{ + kIOUSBFindInterfaceDontCare = 0xFFFF +}; + +/*! + @enum kIOUSBVendorIDApple + @discussion USB Vendor ID for Apple, Inc. + */ +enum +{ + kIOUSBVendorIDAppleComputer = kIOUSBAppleVendorID, + kIOUSBVendorIDApple = kIOUSBAppleVendorID +}; + +/*! + @enum USBDeviceSpeed + @discussion Returns the speed of a particular USB device. + @constant kUSBDeviceSpeedLow The device is a low speed device. + @constant kUSBDeviceSpeedFull The device is a full speed device. + @constant kUSBDeviceSpeedHigh The device is a high speed device. + @constant kUSBDeviceSpeedSuper The device is a SuperSpeed (Gen 1) 5Gbps device + @constant kUSBDeviceSpeedSuperPlus The device is a SuperSpeed Plus (Gen 2) 10Gbps device + @constant kUSBDeviceSpeedSuperPlusBy2 The device is a SuperSpeed Plus (Gen 2 X 2) 20Gbps device + */ +enum +{ + kUSBDeviceSpeedLow = 0, + kUSBDeviceSpeedFull = 1, + kUSBDeviceSpeedHigh = 2, + kUSBDeviceSpeedSuper = 3, + kUSBDeviceSpeedSuperPlus = 4, + kUSBDeviceSpeedSuperPlusBy2 = 5 +}; + +/*! + @enum MicrosecondsInFrame + @discussion Returns the number of microseconds in a USB frame. + @constant kUSBFullSpeedMicrosecondsInFrame The device is attached to a bus running at full speed (1 ms / frame). + @constant kUSBHighSpeedMicrosecondsInFrame The device is attached to a bus running at high speed (125 microseconds / frame). + */ +enum +{ + kUSBFullSpeedMicrosecondsInFrame = 1000, + kUSBHighSpeedMicrosecondsInFrame = 125 +}; + +// During low latency transfers, the stack will set the frStatus for each frame to this value. A client can check that to see if the transfer has completed. We set the frStatus to a +// valid return code when the transfer completes. +// +enum +{ + kUSBLowLatencyIsochTransferKey = 'llit' // Set frStatus field of first frame in isoch transfer to designate as low latency +}; + +// This structure is DEPRECATED. See the LowLatencyUserBufferInfoV2 +// +typedef struct LowLatencyUserBufferInfo LowLatencyUserBufferInfo; + +struct LowLatencyUserBufferInfo +{ + UInt32 cookie; + void* bufferAddress; + IOByteCount bufferSize; + UInt32 bufferType; + Boolean isPrepared; + LowLatencyUserBufferInfo* nextBuffer; +}; + +// This structure is DEPRECATED. See the LowLatencyUserBufferInfoV3 + +typedef struct LowLatencyUserBufferInfoV2 LowLatencyUserBufferInfoV2; + +struct LowLatencyUserBufferInfoV2 +{ + UInt32 cookie; + void* bufferAddress; + IOByteCount bufferSize; + UInt32 bufferType; + Boolean isPrepared; + void* mappedUHCIAddress; + LowLatencyUserBufferInfoV2* nextBuffer; +}; + + +// This structure is used to pass information for the low latency calls between user space and the kernel. +// +typedef struct LowLatencyUserBufferInfoV3 LowLatencyUserBufferInfoV3; + +struct LowLatencyUserBufferInfoV3 +{ + uint64_t cookie; + mach_vm_address_t bufferAddress; + mach_vm_size_t bufferSize; + uint64_t bufferType; + uint64_t isPrepared; + mach_vm_address_t mappedUHCIAddress; + LowLatencyUserBufferInfoV3* nextBuffer; +}; + + +/*! + @enum USBLowLatencyBufferType + @discussion Used to specify what kind of buffer to create when calling LowLatencyCreateBuffer(). + @constant kUSBLowLatencyWriteBuffer The buffer will be used to write data out to a device. + @constant kUSBLowLatencyReadBuffer The buffer will be used to read data from a device. + @constant kUSBLowLatencyFrameListBuffer The buffer will be used for a low latency isoch frame list. + */ +typedef enum +{ + kUSBLowLatencyWriteBuffer = 0, + kUSBLowLatencyReadBuffer = 1, + kUSBLowLatencyFrameListBuffer = 2 +} USBLowLatencyBufferType; + +// USB User Notification Types +// +enum +{ + kUSBNoUserNotificationType = 0, + kUSBNotEnoughPowerNotificationType = 1, + kUSBIndividualOverCurrentNotificationType = 2, + kUSBGangOverCurrentNotificationType = 3, + kUSBiOSDeviceNotEnoughPowerNotificationType = 4, + kUSBNotEnoughPowerNoACNotificationType = 5, + kUSBDeviceCountExceededNotificationType = 6, + kUSBEndpointCountExceededNotificationType = 7, + kUSBUnsupportedNotificationType = 8, + kUSBHubCountExceededNotificationType = 9, + kUSBTDMLowBatteryType = 10, + kUSBCTBNotEnoughPowerNotificationType = 11, + kUSBCTBUnsupportedNotificationType = 12, + kUSBCUnsupportedTBPortNotificationType = 13, + kUSBCUnsupportedTBCableNotificationType = 14 +}; + +/*! + @defined Property Definitions + @discussion Useful property names in USB land. + */ +#define kUSBDevicePropertyBusPowerAvailable "Bus Power Available" +#define kUSBDevicePropertyLocationID kUSBHostPropertyLocationID +#define kUSBProductIDMask kUSBHostMatchingPropertyProductIDMask +#define kUSBProductIdsArrayName kUSBHostMatchingPropertyProductIDArray +#define kUSBSuspendPort "kSuspendPort" +#define kUSBExpressCardCantWake "ExpressCardCantWake" +#define kUSBDeviceResumeRecoveryTime kUSBHostDevicePropertyResumeRecoveryTime +#define kUSBOutOfSpecMPSOK "Out of spec MPS OK" +#define kOverrideIfAtLocationID "OverrideIfAtLocationID" +#define kUSBDeviceCurrentConfiguration kUSBHostDevicePropertyCurrentConfiguration +#define kUSBDeviceRemoteWakeOverride kUSBHostDevicePropertyRemoteWakeOverride +#define kUSBDeviceConfigurationCurrentOverride kUSBHostDevicePropertyConfigurationCurrentOverride +#define kUSBDeviceResetDurationOverride kUSBHostDevicePropertyResetDurationOverride +#define kUSBDeviceDataToggleResetOverride kUSBHostPropertyDataToggleResetOverride +#define kUSBDeviceFailedRequestedPower kUSBHostDevicePropertyFailedRequestedPower +#define kUSBPropertyRemovable kUSBHostPortPropertyRemovable +#define kUSBPropertyTestMode kUSBHostPortPropertyTestMode +#define kUSBPropertyDebugLevel kUSBHostPropertyDebugOptions +#define kUSBHubPropertyPowerSupply kUSBHostHubPropertyPowerSupply +#define kUSBControllerSleepSupported kUSBHostControllerPropertySleepSupported +#define kUSBPortPropertyBusCurrentAllocation kUSBHostPortPropertyBusCurrentAllocation + +// legacy properties +#define kUSBPreferredInterface "Preferred Interface" +#define kUSBPreferredInterfacePriority "priority" +#define kOverrideAllowLowPower "kOverrideAllowLowPower" +#define kUSBUserClientEntitlementRequired "UsbUserClientEntitlementRequired" +#define kUSBDevicePropertySpeed "Device Speed" + +#if !__OPEN_SOURCE__ && TARGET_OS_IPHONE && !TARGET_OS_MACCATALYST +#define kUSBDevicePropertyAddress kUSBHostDevicePropertyAddress +#define kUSBPreferredConfiguration kUSBHostDevicePropertyPreferredConfiguration +#define kUSBControllerNeedsContiguousMemoryForIsoch kUSBHostControllerPropertyIsochronousRequiresContiguous +#define kUSBHubDontAllowLowPower kUSBHostHubPropertyIdlePolicy +#define kConfigurationDescriptorOverride kUSBHostDevicePropertyConfigurationDescriptorOverride +#else +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_14 +#define kUSBDevicePropertyAddress "USB Address" +#define kUSBPreferredConfiguration "Preferred Configuration" +#define kUSBControllerNeedsContiguousMemoryForIsoch "Need contiguous memory for isoch" +#define kUSBHubDontAllowLowPower "kUSBHubDontAllowLowPower" +#define kConfigurationDescriptorOverride "ConfigurationDescriptorOverride" +#else +#define kUSBDevicePropertyAddress kUSBHostDevicePropertyAddress +#define kUSBPreferredConfiguration kUSBHostDevicePropertyPreferredConfiguration +#define kUSBControllerNeedsContiguousMemoryForIsoch kUSBHostControllerPropertyIsochronousRequiresContiguous +#define kUSBHubDontAllowLowPower kUSBHostHubPropertyIdlePolicy +#define kConfigurationDescriptorOverride kUSBHostDevicePropertyConfigurationDescriptorOverride +#endif /* MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_14 */ +#endif + + +/*! + @enum USBReEnumerateOptions + @discussion Options used when calling ReEnumerateDevice. + @constant kUSBAddExtraResetTimeBit Setting this bit will cause the Hub driver to wait 100ms before addressing the device after the reset following the re-enumeration. + @constant kUSBReEnumerateCaptureDeviceBit Setting this bit will terminate any drivers attached to an IOUSBInterface for the device and to the IOUSBDevice itself. It will not terminate + any drivers attached to a Mass Storage Class IOUSBInterface. A client needs to have the appropriate permissions in order to specify this bit. See IOUSBLib.h + @constant kUSBReEnumerateReleaseDeviceBit Setting this bit will return return any device that was captured back to the OS. The driver for the IOUSBDevice will be loaded. A client needs to have the appropriate permissions in order to specify this bit. See IOUSBLib.h + */ +typedef enum +{ + kUSBAddExtraResetTimeBit = 31, + kUSBReEnumerateCaptureDeviceBit = 30, + kUSBReEnumerateReleaseDeviceBit = 29, + kUSBAddExtraResetTimeMask = ( 1 << kUSBAddExtraResetTimeBit), + kUSBReEnumerateCaptureDeviceMask = ( 1 << kUSBReEnumerateCaptureDeviceBit), + kUSBReEnumerateReleaseDeviceMask = ( 1 << kUSBReEnumerateReleaseDeviceBit) +} USBReEnumerateOptions; + +/*! + @enum USBDeviceInformationBits + @discussion GetUSBDeviceInformation will return a unit32_t value with bits set indicating that a particular state is present in the USB device. These bits are described here + + @constant kUSBInformationDeviceIsCaptiveBit The USB device is directly attached to its hub and cannot be removed. + @constant kUSBInformationDeviceIsAttachedToRootHubBit The USB device is directly attached to the root hub + @constant kUSBInformationDeviceIsInternalBit The USB device is internal to the enclosure (all the hubs it attaches to are captive) + @constant kUSBInformationDeviceIsConnectedBit The USB device is connected to its hub + @constant kUSBInformationDeviceIsEnabledBit The hub port to which the USB device is attached is enabled + @constant kUSBInformationDeviceIsSuspendedBit The hub port to which the USB device is attached is suspended + @constant kUSBInformationDeviceIsInResetBit The hub port to which the USB device is attached is being reset + @constant kUSBInformationDeviceOvercurrentBit The USB device generated an overcurrent + @constant kUSBInformationDevicePortIsInTestModeBit The hub port to which the USB device is attached is in test mode + @constant kUSBInformationDeviceIsRootHub The device is the root hub simulation + @constant kUSBInformationRootHubisBuiltIn If this is a root hub simulation and it's built into the enclosure, this bit is set. If it's on an expansion card, it will be cleared + @constant kUSBInformationDeviceIsRemote This device is "attached" to the controller through a remote connection + @constant kUSBInformationDeviceIsAttachedToEnclosure The hub port to which the USB device is connected has a USB connector on the enclosure + @constant kUSBInformationDeviceIsOnThunderboltBit The USB device is downstream of a controller that is attached through Thunderbolt + + */ +typedef enum +{ + kUSBInformationDeviceIsCaptiveBit = 0, + kUSBInformationDeviceIsAttachedToRootHubBit = 1, + kUSBInformationDeviceIsInternalBit = 2, + kUSBInformationDeviceIsConnectedBit = 3, + kUSBInformationDeviceIsEnabledBit = 4, + kUSBInformationDeviceIsSuspendedBit = 5, + kUSBInformationDeviceIsInResetBit = 6, + kUSBInformationDeviceOvercurrentBit = 7, + kUSBInformationDevicePortIsInTestModeBit = 8, + kUSBInformationDeviceIsRootHub = 9, + kUSBInformationRootHubisBuiltIn = 10, + kUSBInformationRootHubIsBuiltInBit = 10, + kUSBInformationDeviceIsRemote = 11, + kUSBInformationDeviceIsAttachedToEnclosure = 12, + kUSBInformationDeviceIsOnThunderboltBit = 13, + kUSBInformationDeviceIsCaptiveMask = (1 << kUSBInformationDeviceIsCaptiveBit), + kUSBInformationDeviceIsAttachedToRootHubMask = (1 << kUSBInformationDeviceIsAttachedToRootHubBit), + kUSBInformationDeviceIsInternalMask = (1 << kUSBInformationDeviceIsInternalBit), + kUSBInformationDeviceIsConnectedMask = (1 << kUSBInformationDeviceIsConnectedBit), + kUSBInformationDeviceIsEnabledMask = (1 << kUSBInformationDeviceIsEnabledBit), + kUSBInformationDeviceIsSuspendedMask = (1 << kUSBInformationDeviceIsSuspendedBit), + kUSBInformationDeviceIsInResetMask = (1 << kUSBInformationDeviceIsInResetBit), + kUSBInformationDeviceOvercurrentMask = (1 << kUSBInformationDeviceOvercurrentBit), + kUSBInformationDevicePortIsInTestModeMask = (1 << kUSBInformationDevicePortIsInTestModeBit), + kUSBInformationDeviceIsRootHubMask = (1 << kUSBInformationDeviceIsRootHub), + kUSBInformationRootHubisBuiltInMask = (1 << kUSBInformationRootHubisBuiltIn), + kUSBInformationRootHubIsBuiltInMask = (1 << kUSBInformationRootHubIsBuiltInBit), + kUSBInformationDeviceIsRemoteMask = (1 << kUSBInformationDeviceIsRemote), + kUSBInformationDeviceIsAttachedToEnclosureMask = (1 << kUSBInformationDeviceIsAttachedToEnclosure), + kUSBInformationDeviceIsOnThunderboltMask = (1 << kUSBInformationDeviceIsOnThunderboltBit) +} USBDeviceInformationBits; + +/*! + @enum USBPowerRequestTypes + @discussion Used to specify what kind of power will be reserved using the IOUSBDevice RequestExtraPower and ReturnExtraPower APIs. + @constant kUSBPowerDuringSleep The power is to be used during sleep. + @constant kUSBPowerDuringWake The power is to be used while the system is awake (i.e not sleeping) + @constant kUSBPowerRequestWakeRelease When used with ReturnExtraPower(), it will send a message to all devices to return any extra wake power if possible. + @constant kUSBPowerRequestSleepRelease When used with ReturnExtraPower(), it will send a message to all devices to return any sleep power if possible. + @constant kUSBPowerRequestWakeReallocate When used with ReturnExtraPower(), it will send a message to all devices indicating that they can ask for more wake power, as some device has released it. + @constant kUSBPowerRequestSleepReallocate When used with ReturnExtraPower(), it will send a message to all devices indicating that they can ask for more sleep power, as some device has released it. + @constant kUSBPowerDuringWakeRevocable The power is to be used while the system is awake (i.e not sleeping), but can be taken away (via the kUSBPowerRequestWakeRelease message). The system can then allocate that extra power to another device. + @constant kUSBPowerDuringWakeUSB3 This is used by the USB stack to allocate the 400mA extra for USB3, above the 500ma allocated by USB2 + */ +typedef enum +{ + kUSBPowerDuringSleep = 0, + kUSBPowerDuringWake = 1, + kUSBPowerRequestWakeRelease = 2, + kUSBPowerRequestSleepRelease = 3, + kUSBPowerRequestWakeReallocate = 4, + kUSBPowerRequestSleepReallocate = 5, + kUSBPowerDuringWakeRevocable = 6, + kUSBPowerDuringWakeUSB3 = 7 +} USBPowerRequestTypes; + +// these are not for a Public API, but are just the bits used below +enum +{ + kUSBNotificationPreForcedSuspendBit = 0, + kUSBNotificationPostForcedSuspendBit = 1, + kUSBNotificationPreForcedResumeBit = 2, + kUSBNotificationPostForcedResumeBit = 3, +}; + +/*! + @enum USBNotificationTypes + @discussion Used to register for USB notifications. These types may be OR'd together if more than one notification is desired. These notification are expected to be acknowledged before the process (e.g. system sleep or system wake) can be continued. See RegisterForNotification and AcknowledgeNotification in IOUSBDeviceInterface and IOUSBInterfaceInterface. + @constant kUSBNotificationPreForcedSuspend A notification is sent prior to a forced suspend (e.g. system sleep). + @constant kUSBNotificationPostForcedSuspend A notification is sent after a forced suspend has been completed (e.g. system sleep). + @constant kUSBNotificationPreForcedResume A notification is sent before a resume which happens after a forced suspend (e.g. system wake). + @constant kUSBNotificationPostForcedResume A notification is sent after a resume which happens after a forced suspend (e.g. system wake). + */ +typedef enum +{ + kUSBNotificationPreForcedSuspend = (1 << kUSBNotificationPreForcedSuspendBit), + kUSBNotificationPostForcedSuspend = (1 << kUSBNotificationPostForcedSuspendBit), + kUSBNotificationPreForcedResume = (1 << kUSBNotificationPreForcedResumeBit), + kUSBNotificationPostForcedResume = (1 << kUSBNotificationPostForcedResumeBit), +} USBNotificationTypes; + + +// Apple specific properties +#define kAppleRevocableExtraCurrent "AAPL,revocable-extra-current" +#define kAppleExternalSuperSpeedPorts "AAPL,ExternalSSPorts" +#define kAppleUnconnectedSuperSpeedPorts "AAPL,UnconnectedSSPorts" +#define kAppleAcpiRootHubDepth "AAPL,root-hub-depth" + +#define kAppleStandardPortCurrentInSleep "AAPL,standard-port-current-in-sleep" + +#define kAppleInternalUSBDevice "AAPL,device-internal" +#define kAppleExternalConnectorBitmap "AAPL,ExternalConnectorBitmap" +#define kUSBBusID "AAPL,bus-id" +#define kApplePowerSupply "AAPL,power-supply" + +// Deprecated Names and/or values +#define kAppleCurrentAvailable "AAPL,current-available" +#define kAppleCurrentInSleep "AAPL,current-in-sleep" +#define kApplePortCurrentInSleep "AAPL,port-current-in-sleep" + +#define kOverrideAttachedToCPU "kOverrideAttachedToCPU" + +// UPC definitions from ACPI Rev 4.0 +typedef enum +{ + kUSBPortNotConnectable = 0, // Port is not connectable + kUSBPortConnectable = 1 // Port is connectable either user visible or invisible +} kUSBConnectable; + +typedef enum +{ + kUSBTypeAConnector = 0x00, // Type ÔAÕ connector + kUSBTypeMiniABConnector = 0x01, // Mini-AB connector + kUSBTypeExpressCard = 0x02, // ExpressCard + kUSB3TypeStdAConnector = 0x03, // USB 3 Standard-A connector + kUSB3TypeStdBConnector = 0x04, // USB 3 Standard-B connector + kUSB3TypeMicroBConnector = 0x05, // USB 3 Micro-B connector + kUSB3TypeMicroABConnector = 0x06, // USB 3 Micro-AB connector + kUSB3TypePowerBConnector = 0x07, // USB 3 Power-B connector + kUSBProprietaryConnector = 0xFF // Proprietary connector +} kUSBHostConnectorType; + +// Root hub definitions +enum +{ + kUSBSpeed_Mask = USBBitRange(0, 1), + kUSBSpeed_Shift = USBBitRangePhase(0, 1), + + kUSBAddress_Mask = USBBitRange(8, 15), + kUSBAddress_Shift = USBBitRangePhase(8, 15) +}; + +enum +{ + kXHCISSRootHubAddress = kUSBMaxDevices, + kXHCIUSB2RootHubAddress = kUSBMaxDevices + 1, + kSuperSpeedBusBitMask = 0x01000000 +}; + +#define ISROOTHUB(a) ((a == kXHCISSRootHubAddress) || (a == kXHCIUSB2RootHubAddress)) + +// values (in nanoseconds) which are sent to requireMaxBusStall as appropriate +#define kEHCIIsochMaxBusStall 25000 +#define kXHCIIsochMaxBusStall 25000 +#define kOHCIIsochMaxBusStall 25000 +#define kUHCIIsochMaxBusStall 10000 +#define kMaxBusStall10uS 10000 +#define kMaxBusStall25uS 25000 + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/QualcommWireless/include/IOKit/usb/USBHub.h b/QualcommWireless/include/IOKit/usb/USBHub.h new file mode 100644 index 0000000..ba41437 --- /dev/null +++ b/QualcommWireless/include/IOKit/usb/USBHub.h @@ -0,0 +1,387 @@ +/* + * Copyright � 1998-2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _USBHUB_H +#define _USBHUB_H + +#include <IOKit/usb/USB.h> +#include <IOKit/usb/USBSpec.h> + + /*! + @header USBHub.h + @abstract Constants and definitions used with Hub devices. + @discussion + */ + + /*! + @enum Hub Descriptor Type + @discussion + */ +enum { + kUSBHubDescriptorType = 0x29, + kUSB3HubDescriptorType = 0x2A +}; + + /*! + @enum HubFeatures + @discussion Used with SET_FEATURE to set hub and port features + */ +enum { + + kUSBHubLocalPowerChangeFeature = 0, /* Hub features */ + kUSBHubOverCurrentChangeFeature = 1, + + kUSBHubPortConnectionFeature = 0, /* port features */ + kUSBHubPortEnableFeature = 1, + kUSBHubPortSuspendFeature = 2, + kUSBHubPortOverCurrentFeature = 3, + kUSBHubPortResetFeature = 4, + kUSBHubPortPowerFeature = 8, + kUSBHubPortLowSpeedFeature = 9, + kUSBHubPortConnectionChangeFeature = 16, + kUSBHubPortEnableChangeFeature = 17, + kUSBHubPortSuspendChangeFeature = 18, + kUSBHubPortOverCurrentChangeFeature = 19, + kUSBHubPortResetChangeFeature = 20, + kUSBHubPortTestFeature = 21, + kUSBHubPortIndicatorFeature = 22, + + // USB 3.0 + kUSBHubPortLinkStateFeature = 5, /* port features */ + kUSBHubPortU1TimeoutFeature = 23, + kUSBHubPortU2TimeoutFeature = 24, + kUSBHubPortLinkStateChangeFeature = 25, + kUSBHubPortConfigErrorChangeFeature = 26, + kUSBHubPortRemoteWakeMaskFeature = 27, + kUSBHubPortBHPortResetFeature = 28, + kUSBHubPortBHResetChangeFeature = 29, + kUSBHubPortForceLinkPMAcceptFeature = 30, + +}; + + /*! + @enum HubPortStatus + @discussion Used to decode the Port Status and Change + */ +enum { + kSSHubPortStatusConnectionBit = 0, + kSSHubPortStatusEnabledBit = 1, + kSSHubPortStatusOverCurrentBit = 3, + kSSHubPortStatusResetBit = 4, + + // USB 3.0 + kSSHubPortStatusLinkStateShift = 5, + kSSHubPortStatusPowerBit = 9, + kSSHubPortStatusSpeedShift = 10, + kSSHubPortChangeBHResetBit = 5, + kSSHubPortChangePortLinkStateBit = 6, + kSSHubPortChangePortConfigErrBit = 7, + + kHubPortConnection = 0x0001, + kHubPortEnabled = 0x0002, + kHubPortSuspend = 0x0004, + kHubPortOverCurrent = 0x0008, + kHubPortBeingReset = 0x0010, + kHubPortPower = 0x0100, + kHubPortLowSpeed = 0x0200, + kHubPortHighSpeed = 0x0400, + kHubPortTestMode = 0x0800, + kHubPortIndicator = 0x1000, + kHubPortSuperSpeed = 0x2000, // This is a synthesized bit that is using a reserved bit from the Hub Port Status definition in USB 2.0. + kHubPortBit14 = 0x4000, // That bit is used by the hub driver to encode the USB3 link state into the USB2 PortStatus (using bits 5-7 as well, that are reserved in the USB 2 spec) + kHubPortDebouncing = 0x8000, // This is a synthesized bit that is using a reserved bit from the Hub Port Status definition in USB 2.0. + + // USB 3.0 + kSSHubPortStatusConnectionMask = ( 1 << kSSHubPortStatusConnectionBit ), + kSSHubPortStatusEnabledMask = ( 1 << kSSHubPortStatusEnabledBit ), + kSSHubPortStatusOverCurrentMask = ( 1 << kSSHubPortStatusOverCurrentBit ), + kSSHubPortStatusBeingResetMask = ( 1 << kSSHubPortStatusResetBit ), + kSSHubPortStatusLinkStateMask = 0x01E0, + kSSHubPortStatusPowerMask = ( 1 << kSSHubPortStatusPowerBit ), + kSSHubPortStatusSpeedMask = 0x1C00, + kSSHubPortChangeBHResetMask = ( 1 << kSSHubPortChangeBHResetBit ), + kSSHubPortChangePortLinkStateMask = ( 1 << kSSHubPortChangePortLinkStateBit ), + kSSHubPortChangePortConfigErrMask = ( 1 << kSSHubPortChangePortConfigErrBit ), + + // these are the bits which cause the hub port state machine to keep moving (USB 3.0) + kHubPortSuperSpeedStateChangeMask = (kHubPortConnection | kHubPortEnabled | kHubPortSuspend | kHubPortOverCurrent | kHubPortBeingReset | kSSHubPortStatusBeingResetMask | kSSHubPortChangePortLinkStateMask | kSSHubPortChangePortConfigErrMask), + // these are the bits which cause the hub port state machine to keep moving (USB 2.0) + kHubPortStateChangeMask = (kHubPortConnection | kHubPortEnabled | kHubPortSuspend | kHubPortOverCurrent | kHubPortBeingReset) +}; + + + /*! + @enum HubStatus + @discussion Used to decode the Hub Status and Change + */ +enum { + kHubLocalPowerStatus = 1, + kHubOverCurrentIndicator = 2, + kHubLocalPowerStatusChange = 1, + kHubOverCurrentIndicatorChange = 2 +}; + + /*! + @enum HubCharacteristics + @discussion + */ +enum { + kPerPortSwitchingBit = (1 << 0), + kNoPowerSwitchingBit = (1 << 1), + kCompoundDeviceBit = (1 << 2), + kPerPortOverCurrentBit = (1 << 3), + kNoOverCurrentBit = (1 << 4), + + kUSBHubOvercurrentMask = 0x18, + kUSBHubOvercurrentShift = 3, + + kHubTTThinkTimeMask = 0x60, + kHubTTThinkTimeShift = 5, + + kHubPortIndicatorBit = 7, + kHubPortIndicatorMask = 0x0080 +}; + +/*! +@enum PowerSwitching + @discussion + */ +enum { + kHubSupportsGangPower = 0, + kHubSupportsIndividualPortPower = 1, + kHubPortSetPowerOff = 0, + kHubPortSetPowerOn = 1 +}; + +/*! +@enum PortIndicatorSelectors + @discussion + */ +enum { + kHubPortIndicatorAutomatic = 0, + kHubPortIndicatorAmber, + kHubPortIndicatorGreen, + kHubPortIndicatorOff +}; + +/*! + @enum Root Hub specific + @discussion + */ +enum { + kPrdRootHubApple = 0x8005, // ProductID for classic speed root hubs + kPrdRootHubAppleE = 0x8006, // ProductID for high speed root hubs + kPrdRootHubAppleSS = 0x8007, // ProductID for super speed root hubs + kUSBRootHubPollingRate = 32 // Enpoint polling rate interval for root hubs +}; + +/*! + @enum Hub Class Request + @discussion Specifies values for the bRequest field of a Device Request. + */ +enum USBHubClassRequest { + kUSBHubRqGetStatus = 0, + kUSBHubRqClearFeature = 1, + kUSBHubRqGetState = 2, + kUSBHubRqSetFeature = 3, + kUSBHubRqReserved2 = 4, + kUSBHubRqSetAddress = 5, + kUSBHubRqGetDescriptor = 6, + kUSBHubRqSetDescriptor = 7, + kUSBHubRqGetConfig = 8, + kUSBHubRqSetConfig = 9, + kUSBHubRqGetInterface = 10, + kUSBHubRqSetInterface = 11, +}; + +/*! +@enum Hub Device Requests +@discussion Encoding of the hub specific standard requests +<tt> +<pre><b> +Request bmRequestType bRequest wValue wIndex wLength Data</b> +ClearHubFeature 0010 0000B CLEAR_FEATURE Feature Zero Zero None +ClearPortFeature 0010 0011B Feature Port Zero None + +GetBusState 1010 0011B GET_STATE Zero Port One Port Bus State + +GetHubDescriptor 1010 0000B GET_DESCRIPTOR Type Zero Length Descriptor + +GetHubStatus 1010 0000B GET_STATUS Zero Zero Four Hub Status +GetPortStatus 1010 0011B Zero Port Four Port Status + +SetHubDescriptor 0010 0000B SET_DESCRIPTOR Type Zero Length Descriptor + +SetHubFeature 0010 0000B SET_FEATURE Feature Zero Zero None +SetPortFeature 0010 0011B Feature Port Zero None +</pre> +</tt> + */ +enum { + kClearHubFeature = EncodeRequest(kUSBRqClearFeature, kUSBOut, kUSBClass, kUSBDevice), + kClearPortFeature = EncodeRequest(kUSBRqClearFeature, kUSBOut, kUSBClass, kUSBOther), + kGetPortState = EncodeRequest(kUSBRqGetState, kUSBIn, kUSBClass, kUSBOther), + kGetHubDescriptor = EncodeRequest(kUSBRqGetDescriptor, kUSBIn, kUSBClass, kUSBDevice), + kGetHub3Descriptor= EncodeRequest(kUSBRqGetDescriptor, kUSBIn, kUSBClass, kUSBDevice), + kGetHubStatus = EncodeRequest(kUSBRqGetStatus, kUSBIn, kUSBClass, kUSBDevice), + kGetPortStatus = EncodeRequest(kUSBRqGetStatus, kUSBIn, kUSBClass, kUSBOther), + kSetHubDescriptor = EncodeRequest(kUSBRqGetDescriptor, kUSBOut, kUSBClass, kUSBDevice), + kSetHubFeature = EncodeRequest(kUSBRqSetFeature, kUSBOut, kUSBClass, kUSBDevice), + kSetPortFeature = EncodeRequest(kUSBRqSetFeature, kUSBOut, kUSBClass, kUSBOther) +}; + + +/*! + @typedef IOUSBHubDescriptor + @discussion USB Hub Descriptor. See the USB HID Specification at <a href="http://www.usb.org"TARGET="_blank">http://www.usb.org</a>. +*/ + +enum{ + // Support a maximum of 64 ports, which will pack into 9 bytes + kNumPortBytes = 9 +}; + +struct IOUSBHubDescriptor { + UInt8 length; + UInt8 hubType; + UInt8 numPorts; + UInt16 characteristics __attribute__((packed)); + UInt8 powerOnToGood; // Port settling time, in 2ms + UInt8 hubCurrent; + // These are received packed, will have to be unpacked + UInt8 removablePortFlags[kNumPortBytes]; + UInt8 pwrCtlPortFlags[kNumPortBytes]; +}; + +typedef struct IOUSBHubDescriptor IOUSBHubDescriptor; + +enum +{ + // these are sent to the controller when configuring a HS hub + + kUSBHSHubCommandAddHub = 1, + kUSBHSHubCommandRemoveHub = 2, + + kUSBHSHubFlagsMultiTTMask = 0x01, + kUSBHSHubFlagsMoreInfoMask = 0x02, + kUSBHSHubFlagsTTThinkTimeShift = 2, + kUSBHSHubFlagsTTThinkTimeMask = 0x0C, + kUSBHSHubFlagsNumPortsShift = 4, + kUSBHSHubFlagsNumPortsMask = 0xF0 +}; + +// To cope with the extra fields in a USB3 hub descriptor + +struct IOUSB3HubDescriptor { + UInt8 length; + UInt8 hubType; + UInt8 numPorts; + UInt16 characteristics __attribute__((packed)); + UInt8 powerOnToGood; // Port settling time, in 2ms + UInt8 hubCurrent; + UInt8 hubHdrDecLat; // Header decode latency, new 3.0 field + UInt16 hubDelay __attribute__((packed)); // new in 3.0 + + // These are received packed, will have to be unpacked + UInt8 removablePortFlags[kNumPortBytes]; + UInt8 pwrCtlPortFlags[kNumPortBytes]; // This field does not exist in the 3.0 descriptor +}; + +typedef struct IOUSB3HubDescriptor IOUSB3HubDescriptor; + +/*! + @typedef IOUSBHubStatus + @discussion Used to get the port status and change flags using GetPortStatus() +*/ +struct IOUSBHubStatus { + UInt16 statusFlags; + UInt16 changeFlags; +}; +typedef struct IOUSBHubStatus IOUSBHubStatus; +typedef IOUSBHubStatus * IOUSBHubStatusPtr; + +typedef struct IOUSBHubStatus IOUSBHubPortStatus; + + +/*! + @typedef IOUSBHubPortReEnumerateParam + @discussion Used to specify the port that needs to be reenumerated +*/ +typedef struct IOUSBHubPortReEnumerateParam IOUSBHubPortReEnumerateParam; + +struct IOUSBHubPortReEnumerateParam { + UInt32 portNumber; + UInt32 options; +}; + +typedef struct IOUSBHubPortClearTTParam IOUSBHubPortClearTTParam; + +struct IOUSBHubPortClearTTParam { + UInt32 portNumber; + UInt32 options; +#if 0 + UInt8 deviceAddress; <<0 + UInt8 endpointNum; <<8 + UInt8 endpointType; <<16 // As split transaction. 00 Control, 10 Bulk + UInt8 IN; <<24 // Direction, 1 = IN, 0 = OUT +#endif +}; + +#pragma mark USB 3 Additions + +/*! + @enum USB 3 Hub Class Request + @discussion Specifies values for the bRequest field of a Device Request. + */ +enum { + kUSBHubRqSetHubDepth = 12, + kUSBHubRqGetPortErrorCount = 13 +}; + +enum { + kSetHubDepth = EncodeRequest(kUSBHubRqSetHubDepth, kUSBOut, kUSBClass, kUSBDevice), + kGetPortErrorCount = EncodeRequest(kUSBHubRqGetPortErrorCount, kUSBIn, kUSBClass, kUSBOther) +}; + +/*! + @enum Link State for USB 3.0 + @discussion Used to decode the Port Status and Change + */ +enum { + kSSHubPortLinkStateU0 = 0, + kSSHubPortLinkStateU1 = 1, + kSSHubPortLinkStateU2 = 2, + kSSHubPortLinkStateU3 = 3, + kSSHubPortLinkStateSSDisabled = 4, + kSSHubPortLinkStateRxDetect = 5, + kSSHubPortLinkStateSSInactive = 6, + kSSHubPortLinkStatePolling = 7, + kSSHubPortLinkStateRecovery = 8, + kSSHubPortLinkStateHotReset = 9, + kSSHubPortLinkStateComplianceMode = 10, + kSSHubPortLinkStateLoopBack = 11, + + kSSHubPortSpeed5Gbps = 0 +}; + +#endif diff --git a/QualcommWireless/include/IOKit/usb/USBSpec.h b/QualcommWireless/include/IOKit/usb/USBSpec.h new file mode 100644 index 0000000..32975ba --- /dev/null +++ b/QualcommWireless/include/IOKit/usb/USBSpec.h @@ -0,0 +1,685 @@ +/* + * Copyright � 1998-2012 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/* + * Constants that both OS9 and OSX want to define, and whose values are + * specified by the USB Standard. + * Put in a seperate file so they can be included if the OS9 include file isn't already + * included. + */ +#ifndef _USBSPEC_H +#define _USBSPEC_H + +#include <IOKit/usb/AppleUSBDefinitions.h> +#include <IOKit/usb/IOUSBHostFamilyDefinitions.h> + +#if !__OPEN_SOURCE__ && TARGET_OS_IPHONE && !TARGET_OS_MACCATALYST +// these headers were previously exported for iOS clients +#include <IOKit/usb/IOUSBHostFamily.h> +#include <IOKit/usb/StandardUSB.h> +#endif + + +#ifdef __cplusplus + +#if !__OPEN_SOURCE__ && TARGET_OS_IPHONE && !TARGET_OS_MACCATALYST +using namespace StandardUSB; +#endif + +extern "C" { +#endif + +#if !__OPEN_SOURCE__ && TARGET_OS_IPHONE && !TARGET_OS_MACCATALYST +/* @enum Feature constants + @discussion Used with SET_FEATURE requests + */ +enum +{ + kUSBFunctionSuspendLowPower = kIOUSBInterfaceSuspendLowPower, + kUSBFunctionSuspendEnableRemoteWake = kIOUSBInterfaceSuspendRemoteWakeEnable +}; + +/*! + @enum Device Status + @discussion Specified bits returned by a get status request + */ +enum +{ + kUSBDeviceStatusSelfPowered = kIOUSBDeviceStatusSelfPowered, + kUSBDeviceStatusRemoteWake = kIOUSBDeviceStatusRemoteWakeEnable, + kUSBDeviceStatusU1Enable = kIOUSBDeviceStatusU1Enable, + kUSBDeviceStatusU2Enable = kIOUSBDeviceStatusU2Enable, + kUSBDeviceStatusLTMEnable = kIOUSBDeviceStatusLTMEnable, + + kUSBInterfaceStatusFunctionRemoteWakeCapable = kIOUSBInterfaceStatusRemoteWakeCapable, + kUSBInterfaceStatusFunctionRemoteWake = kIOUSBInterfaceStatusRemoteWakeEnable, + + kUSBPipeStatusHalt = IOUSBEndpointStatusHalt +}; + +#endif + +/*! + @header USBSpec.h + @abstract Constants and definitions of parameters that are used in communcating with USB devices and interfaces. + @discussion + */ + +/*! + @enum Endpoint type + @discussion Used in IOUSBFindEndpointRequest's type field + */ +enum +{ + kUSBControl = kIOUSBEndpointTypeControl, + kUSBIsoc = kIOUSBEndpointTypeIsochronous, + kUSBBulk = kIOUSBEndpointTypeBulk, + kUSBInterrupt = kIOUSBEndpointTypeInterrupt, + kUSBAnyType = 0xFF +}; + +/*! + @enum Endpoint direction + @discussion Used in IOUSBFindEndpointRequest's direction field + */ +enum +{ + kUSBOut = kIOUSBEndpointDirectionOut, + kUSBIn = kIOUSBEndpointDirectionIn, + kUSBNone = kIOUSBEndpointDirectionUnknown, + kUSBAnyDirn = 3 +}; + +/*! + @enum Device Request Type + @discussion This type is encoded in the bmRequestType field of a Device Request. It specifies the type of request: standard, class or vendor specific. + */ +enum +{ + kUSBStandard = kIOUSBDeviceRequestTypeValueStandard, + kUSBClass = kIOUSBDeviceRequestTypeValueClass, + kUSBVendor = kIOUSBDeviceRequestTypeValueVendor +}; + +/*! + @enum Device Request Recipient + @discussion This recipient is encoded in the bmRequestType field of a Device Request. It specifies the type of recipient for a request: the device, the interface, or an endpoint. + */ +enum +{ + kUSBDevice = kIOUSBDeviceRequestRecipientValueDevice, + kUSBInterface = kIOUSBDeviceRequestRecipientValueInterface, + kUSBEndpoint = kIOUSBDeviceRequestRecipientValueEndpoint, + kUSBOther = kIOUSBDeviceRequestRecipientValueOther +}; + +/*! + @enum Device Request + @discussion Specifies values for the bRequest field of a Device Request. + */ +enum +{ + kUSBRqGetStatus = kIOUSBDeviceRequestGetStatus, + kUSBRqClearFeature = kIOUSBDeviceRequestClearFeature, + kUSBRqGetState = kIOUSBDeviceRequestGetState, + kUSBRqSetFeature = kIOUSBDeviceRequestSetFeature, + kUSBRqReserved2 = 4, + kUSBRqSetAddress = kIOUSBDeviceRequestSetAddress, + kUSBRqGetDescriptor = kIOUSBDeviceRequestGetDescriptor, + kUSBRqSetDescriptor = kIOUSBDeviceRequestSetDescriptor, + kUSBRqGetConfig = kIOUSBDeviceRequestGetConfiguration, + kUSBRqSetConfig = kIOUSBDeviceRequestSetConfiguration, + kUSBRqGetInterface = kIOUSBDeviceRequestGetInterface, + kUSBRqSetInterface = kIOUSBDeviceRequestSetInterface, + kUSBRqSyncFrame = kIOUSBDeviceRequestSynchFrame, + kUSBSetSel = kIOUSBDeviceRequestSetSel, + kUSBSetIsochDelay = kIOUSBDeviceRequestSetIsochronousDelay +}; + +/*! + @enum USB Descriptors + @discussion Specifies values for diffent descriptor types. + */ +enum +{ + kUSBAnyDesc = 0, // Wildcard for searches + kUSBDeviceDesc = kIOUSBDescriptorTypeDevice, + kUSBConfDesc = kIOUSBDescriptorTypeConfiguration, + kUSBStringDesc = kIOUSBDescriptorTypeString, + kUSBInterfaceDesc = kIOUSBDescriptorTypeInterface, + kUSBEndpointDesc = kIOUSBDescriptorTypeEndpoint, + kUSBDeviceQualifierDesc = kIOUSBDescriptorTypeDeviceQualifier, + kUSBOtherSpeedConfDesc = kIOUSBDescriptorTypeOtherSpeedConfiguration, + kUSBInterfacePowerDesc = kIOUSBDescriptorTypeInterfacePower, + kUSBOnTheGoDesc = kIOUSBDescriptorTypeOTG, + kUSDebugDesc = kIOUSBDescriptorTypeDebug, + kUSBInterfaceAssociationDesc = kIOUSBDescriptorTypeInterfaceAssociation, + kUSBBOSDescriptor = kIOUSBDescriptorTypeBOS, + kUSBDeviceCapability = kIOUSBDescriptorTypeDeviceCapability, + kUSBSuperSpeedEndpointCompanion = kIOUSBDescriptorTypeSuperSpeedUSBEndpointCompanion, + kUSB3HUBDesc = kIOUSBDescriptorTypeSuperSpeedHub, + kUSBHIDDesc = kIOUSBDecriptorTypeHID, + kUSBReportDesc = kIOUSBDecriptorTypeReport, + kUSBPhysicalDesc = 0x23, + kUSBHUBDesc = kIOUSBDescriptorTypeHub, +}; + + +/*! + @enum Device Capability Types + @discussion Used with decoding the Device Capability descriptor + */ +enum +{ + kUSBDeviceCapabilityWirelessUSB = kIOUSBDeviceCapabilityTypeWireless, + kUSBDeviceCapabilityUSB20Extension = kIOUSBDeviceCapabilityTypeUSB20Extension, + kUSBDeviceCapabilitySuperSpeedUSB = kIOUSBDeviceCapabilityTypeSuperSpeed, + kUSBDeviceCapabilityContainerID = kIOUSBDeviceCapabilityTypeContainerID, + kUSBDeviceCapabilityBillboard = kIOUSBDeviceCapabilityTypeBillboard, + kUSBDeviceCapabilityBillboardAltMode = kIOUSBDeviceCapabilityTypeBillboardAltMode +}; + +/*! + @enum Feature Selectors + @discussion Used with SET/CLEAR_FEATURE requests. + */ +enum +{ + kUSBFeatureEndpointStall = IOUSBEndpointFeatureSelectorStall, // Endpoint + kUSBFeatureDeviceRemoteWakeup = kIOUSBDeviceFeatureSelectorRemoteWakeup, // Device + kUSBFeatureTestMode = kIOUSBDeviceFeatureSelectorTestMode, // Device + kUSBFeatureFunctionSuspend = kIOUSBInterfaceFeatureSelectorSuspend, // Interface + kUSBFeatureU1Enable = kIOUSBDeviceFeatureSelectorU1Enable, // Device + kUSBFeatureU2Enable = kIOUSBDeviceFeatureSelectorU2Enable, // Device + kUSBFeatureLTMEnable = kIOUSBDeviceFeatureSelectorLTMEnable // Device +}; + +/*! + @enum Miscellaneous bits and masks + */ +enum +{ + kUSBFunctionRemoteWakeCapableBit = IOUSBBit(0), // GET_STATUS + kUSBFunctionRemoteWakeupBit = IOUSBBit(1), // GET_STATUS + kUSBLowPowerSuspendStateBit = IOUSBBit(0), // SET_FEATURE(FUNCTION_SUSPEND) + kUSBFunctionRemoteWakeEnableBit = IOUSBBit(1) // SET_FEATURE(FUNCTION_SUSPEND) +}; + +/*! + @enum USB Power constants + @discussion Constants relating to USB Power. + */ +enum +{ + kUSB100mAAvailable = 50, + kUSB500mAAvailable = 250, + kUSB100mA = 50, + kUSBAtrBusPowered = 0x80, + kUSBAtrSelfPowered = 0x40, + kUSBAtrRemoteWakeup = 0x20, + kUSB2MaxPowerPerPort = kIOUSB20BusCurrentDefault, + kUSB150mAAvailable = 75, + kUSB900mAAvailable = 450, + kUSB150mA = 75, + kUSB3MaxPowerPerPort = kIOUSB30BusCurrentDefault +}; + +/*! + @enum USB Release constants + @discussion Constants relating to USB releases as found in the bcdUSB field of the Device Descriptor. + */ +enum +{ + kUSBRel10 = 0x0100, + kUSBRel11 = 0x0110, + kUSBRel20 = 0x0200, + kUSBRel30 = 0x0300 +}; + + +/*! + @enum HID requests + @discussion Constants for HID requests. + */ +enum +{ + kHIDRqGetReport = 1, + kHIDRqGetIdle = 2, + kHIDRqGetProtocol = 3, + kHIDRqSetReport = 9, + kHIDRqSetIdle = 10, + kHIDRqSetProtocol = 11 +}; + +/*! + @enum HID report types + @discussion Constants for the three kinds of HID reports. + */ +enum +{ + kHIDRtInputReport = 1, + kHIDRtOutputReport = 2, + kHIDRtFeatureReport = 3 +}; + + +/*! + @enum HID Protocol + @discussion Used in the SET_PROTOCOL device request + */ +enum +{ + kHIDBootProtocolValue = 0, + kHIDReportProtocolValue = 1 +}; + + + +enum +{ + kUSBCapsLockKey = 0x39, + kUSBNumLockKey = 0x53, + kUSBScrollLockKey = 0x47 +}; + +/*! + @enum Device Class Codes + @discussion Constants for USB Device classes (bDeviceClass). + */ +enum +{ + kUSBCompositeClass = 0, + kUSBCommClass = 2, // Deprecated + kUSBCommunicationClass = 2, + kUSBHubClass = 9, + kUSBDataClass = 10, + kUSBPersonalHealthcareClass = 15, + kUSBBillBoardClass = 17, + kUSBDiagnosticClass = 220, + kUSBWirelessControllerClass = 224, + kUSBMiscellaneousClass = 239, + kUSBApplicationSpecificClass = 254, + kUSBVendorSpecificClass = 255 +}; + +/*! + @enum Interface Class + @discussion Constants for Interface classes (bInterfaceClass). + */ +enum +{ + kUSBAudioClass = 1, // Deprecated + kUSBAudioInterfaceClass = 1, + + kUSBCommunicationControlInterfaceClass = 2, + kUSBCommunicationDataInterfaceClass = 10, + + kUSBHIDClass = 3, + kUSBHIDInterfaceClass = 3, + + kUSBPhysicalInterfaceClass = 5, + + kUSBImageInterfaceClass = 6, + + kUSBPrintingClass = 7, // Deprecated + kUSBPrintingInterfaceClass = 7, + + kUSBMassStorageClass = 8, // Deprecated + kUSBMassStorageInterfaceClass = 8, + + kUSBChipSmartCardInterfaceClass = 11, + + kUSBContentSecurityInterfaceClass = 13, + + kUSBVideoInterfaceClass = 14, + + kUSBPersonalHealthcareInterfaceClass = 15, + + kUSBDiagnosticDeviceInterfaceClass = 220, + + kUSBWirelessControllerInterfaceClass = 224, + + kUSBApplicationSpecificInterfaceClass = 254, + + kUSBVendorSpecificInterfaceClass = 255 +}; + +// Obsolete +enum +{ + kUSBDisplayClass = 4 // Obsolete +}; + +/*! + @enum Interface SubClass + @discussion Constants for USB Interface SubClasses (bInterfaceSubClass). + */ +enum +{ + kUSBCompositeSubClass = 0, + + kUSBHubSubClass = 0, + + // For the kUSBAudioInterfaceClass + // + kUSBAudioControlSubClass = 0x01, + kUSBAudioStreamingSubClass = 0x02, + kUSBMIDIStreamingSubClass = 0x03, + + // For the kUSBApplicationSpecificInterfaceClass + // + kUSBDFUSubClass = 0x01, + kUSBIrDABridgeSubClass = 0x02, + kUSBTestMeasurementSubClass = 0x03, + + // For the kUSBMassStorageInterfaceClass + // + kUSBMassStorageRBCSubClass = 0x01, + kUSBMassStorageATAPISubClass = 0x02, + kUSBMassStorageQIC157SubClass = 0x03, + kUSBMassStorageUFISubClass = 0x04, + kUSBMassStorageSFF8070iSubClass = 0x05, + kUSBMassStorageSCSISubClass = 0x06, + + // For the kUSBHIDInterfaceClass + // + kUSBHIDBootInterfaceSubClass = 0x01, + + // For the kUSBCommunicationDataInterfaceClass + // + kUSBCommDirectLineSubClass = 0x01, + kUSBCommAbstractSubClass = 0x02, + kUSBCommTelephoneSubClass = 0x03, + kUSBCommMultiChannelSubClass = 0x04, + kUSBCommCAPISubClass = 0x05, + kUSBCommEthernetNetworkingSubClass = 0x06, + kUSBATMNetworkingSubClass = 0x07, + + // For the kUSBDiagnosticDeviceInterfaceClass + // + kUSBReprogrammableDiagnosticSubClass = 0x01, + + // For the kUSBWirelessControllerInterfaceClass + // + kUSBRFControllerSubClass = 0x01, + + // For the kUSBMiscellaneousClass + // + kUSBCommonClassSubClass = 0x02, + + // For the kUSBVideoInterfaceClass + // + kUSBVideoControlSubClass = 0x01, + kUSBVideoStreamingSubClass = 0x02, + kUSBVideoInterfaceCollectionSubClass = 0x03 + +}; + +enum USBClassSpecificDesc +{ + kUSBClassSpecificDescriptor = 0x24 +}; + + +/*! + @enum Interface Protocol + @discussion Reported in the bInterfaceProtocol field of the Interface Descriptor. + */ +enum +{ + + // For kUSBHubClass + kHubSuperSpeedProtocol = 3, + + // For kUSBHIDInterfaceClass + // + kHIDNoInterfaceProtocol = 0, + kHIDKeyboardInterfaceProtocol = 1, + kHIDMouseInterfaceProtocol = 2, + kUSBVendorSpecificProtocol = 0xff, + + // For kUSBDiagnosticDeviceInterfaceClass + // + kUSB2ComplianceDeviceProtocol = 0x01, + + // For kUSBWirelessControllerInterfaceClass + // + kUSBBluetoothProgrammingInterfaceProtocol = 0x01, + + // For kUSBMiscellaneousClass + // + KUSBInterfaceAssociationDescriptorProtocol = 0x01, + + // For Mass Storage + // + kMSCProtocolControlBulkInterrupt = 0x00, + kMSCProtocolControlBulk = 0x01, + kMSCProtocolBulkOnly = 0x50, + kMSCProtocolUSBAttachedSCSI = 0x62 +}; + + +/*! + @enum DFU Class Attributes + @discussion + */ +enum +{ + kUSBDFUAttributesMask = 0x07, + kUSBDFUCanDownloadBit = 0, + kUSBDFUCanUploadBit = 1, + kUSBDFUManifestationTolerantBit = 2 +}; + +/*! + @enum Printer Class Requests + @discussion The bRequest parameter for Printing Class Sepcific Requests + */ +enum +{ + kUSPrintingClassGetDeviceID = 0, + kUSPrintingClassGePortStatus = 1, + kUSPrintingClassSoftReset = 2 +}; + +/*! + @enum Endpoint Descriptor bits + @discussion Bit definitions for endpoint descriptor fields + */ +enum +{ + kUSBbEndpointAddressMask = 0x0f, + kUSBbEndpointDirectionBit = kIOUSBEndpointDescriptorDirectionPhase, + kUSBbEndpointDirectionMask = kIOUSBEndpointDescriptorDirection, + kUSBEndpointDirectionOut = kIOUSBEndpointDescriptorDirectionOut, + kUSBEndpointDirectionIn = kIOUSBEndpointDescriptorDirectionIn, + + kUSBEndpointbmAttributesTransferTypeMask = kIOUSBEndpointDescriptorTransferType, + kUSBEndpointbmAttributesSynchronizationTypeMask = kIOUSBEndpointDescriptorSynchronizationType, + kUSBEndpointbmAttributesSynchronizationTypeShift = 2, + kUSBEndpointbmAttributesUsageTypeMask = kIOUSBEndpointDescriptorUsageType, + kUSBEndpointbmAttributesUsageTypeShift = 4, + + kUSBPeriodicInterruptUsageType = 0, + kUSBNotificationInterruptUsageType = 1, + kUSBNoSynchronizationIsocSyncType = 0, + kUSBAsynchronousIsocSyncType = 1, + kUSBAdaptiveIsocSyncType = 2, + kUSBSynchronousIsocSyncType = 3, + kUSBDataIsocUsageType = 0, + kUSBFeedbackIsocUsageType = 1, + kUSBImplicitFeedbackDataIsocUsageType = 2 +}; + +/*! + @enum USB Device Capability Type constants + @discussion Bit definitions and constants for different values of USB Device Capability types + */ +enum +{ + kUSB20ExtensionLPMSupported = 1, // Bit 1 of bmAttributes of USB 2.0 Extension Device Capability + kUSBSuperSpeedLTMCapable = 1, // Bit 1 of bmAttributes of SuperSpeed USB Device Capability + kUSBSuperSpeedSupportsLS = 0, // Value of wSpeedSupported indicating that the device supports low speed + kUSBSuperSpeedSupportsFS = 1, // Value of wSpeedSupported indicating that the device supports full speed + kUSBSuperSpeedSupportsHS = 2, // Value of wSpeedSupported indicating that the device supports high speed + kUSBSuperSpeedSupportsSS = 3, // Value of wSpeedSupported indicating that the device supports 5 Gbps +}; + +/*! + @enum USB Device Billboard Capability Vconn Power constants + @discussion Power needed by the adapter for full functionality + */ +enum +{ + kUSBBillboardVConn1Watt = 0, + kUSBBillboardVConn1P5Watt = 1, + kUSBBillboardVConn2Watt = 2, + kUSBBillboardVConn3Watt = 3, + kUSBBillboardVConn4Watt = 4, + kUSBBillboardVConn5Watt = 5, + kUSBBillboardVConn6Watt = 6, + kUSBBillboardVConnReserved = 7 +}; + +/*! + @defineblock USB Billboard Capability Descriptor Constant + @define kUSBBillboardVConnNoPowerReq bit position for No Power Required, VConn b2:0 are ignored when this bit is set + */ + +#define kUSBBillboardVConnNoPowerReq 15 + +/*! @/defineblock */ + +/*! + @enum USB Device Billboard Capability bmConfigured constants + @ A bit pair signifying the state of Alternate Modes + */ +enum +{ + kUSBBillboardUnspecifiedError = 0, + kUSBBillboardConfigNotAttempted = 1, + kUSBBillboardConfigUnsuccessful = 2, + kUSBBillboardAltModeConfigSuccess = 3 +}; + +/*! + @enum USB Device Billboard Capability AdditionalFailureInfo constants + @ A bit field signifying additional failure information + */ +enum +{ + kUSBBillboardAdditinalInfoNoPower = 1, + kUSBBillboardAdditinalInfoNoUSBPD = 2 +}; + +/*! + @defineblock USB Descriptor and IORegistry constants + @discussion Various constants used to describe the fields in the various USB Device Descriptors and IORegistry names used for some of those fields + + @define kUSBDeviceClass The field in the USB Device Descriptor corresponding to the device class + @define kUSBDeviceSubClass The field in the USB Device Descriptor corresponding to the device sub class + @define kUSBDeviceProtocol The field in the USB Device Descriptor corresponding to the device protocol + @define kUSBDeviceMaxPacketSize The field in the USB Device Descriptor corresponding to the maximum packet size for endpoint 0 + @define kUSBVendorID The field in the USB Device Descriptor corresponding to the device USB Vendor ID + @define kUSBVendorName Deprecated. Use kUSBVendorID + @define kUSBProductID The field in the USB Device Descriptor corresponding to the device USB Product ID + @define kUSBProductName Deprecated. Use kUSBProductID + @define kUSBDeviceReleaseNumber The field in the USB Device Descriptor corresponding to the device release version + @define kUSBManufacturerStringIndex The field in the USB Device Descriptor corresponding to the index for the manufacturer's string + @define kUSBProductStringIndex The field in the USB Device Descriptor corresponding to the index for the product name's string + @define kUSBSerialNumberStringIndex The field in the USB Device Descriptor corresponding to the index for the serial number's string + @define kUSBDeviceNumConfigs The field in the USB Configuration Descriptor corresponding to the number of configurations + @define kUSBInterfaceNumber The field in the USB Configuration Descriptor corresponding to the number of configurations + @define kUSBAlternateSetting The field in the USB Configuration Descriptor corresponding to the number of configurations + @define kUSBNumEndpoints The field in the USB Configuration Descriptor corresponding to the number of configurations + @define kUSBInterfaceClass The field in the USB Interface Descriptor corresponding to the interface class + @define kUSBInterfaceSubClass The field in the USB Interface Descriptor corresponding to the interface sub class + @define kUSBInterfaceProtocol The field in the USB Interface Descriptor corresponding to the interface protocol + @define kUSBInterfaceStringIndex The field in the USB Interface Descriptor corresponding to the index for the interface name's string + @define kUSBConfigurationValue The field in the USB Interface Descriptor corresponding to the configuration + @define kUSBProductString IORegistry key for the device's USB Product string + @define kUSBVendorString IORegistry key for the device's USB manufacturer string + @define kUSBSerialNumberString IORegistry key for the device's USB serial number string + @define kUSB1284DeviceID IORegistry key for the 1284 Device ID of a printer + + */ +#define kUSBDeviceClass kUSBHostMatchingPropertyDeviceClass +#define kUSBDeviceSubClass kUSBHostMatchingPropertyDeviceSubClass +#define kUSBDeviceProtocol kUSBHostMatchingPropertyDeviceProtocol +#define kUSBDeviceMaxPacketSize kUSBHostDevicePropertyMaxPacketSize +#define kUSBVendorID kUSBHostMatchingPropertyVendorID +#define kUSBVendorName kUSBVendorID // bad name - keep for backward compatibility +#define kUSBProductID kUSBHostMatchingPropertyProductID +#define kUSBProductName kUSBProductID // bad name - keep for backward compatibility +#define kUSBDeviceReleaseNumber kUSBHostMatchingPropertyDeviceReleaseNumber +#define kUSBManufacturerStringIndex kUSBHostDevicePropertyManufacturerStringIndex +#define kUSBProductStringIndex kUSBHostDevicePropertyProductStringIndex +#define kUSBSerialNumberStringIndex kUSBHostDevicePropertySerialNumberStringIndex +#define kUSBDeviceNumConfigs kUSBHostDevicePropertyNumConfigs +#define kUSBInterfaceNumber kUSBHostMatchingPropertyInterfaceNumber +#define kUSBAlternateSetting kUSBHostInterfacePropertyAlternateSetting +#define kUSBNumEndpoints kUSBHostInterfacePropertyNumEndpoints +#define kUSBInterfaceClass kUSBHostMatchingPropertyInterfaceClass +#define kUSBInterfaceSubClass kUSBHostMatchingPropertyInterfaceSubClass +#define kUSBInterfaceProtocol kUSBHostMatchingPropertyInterfaceProtocol +#define kUSBInterfaceStringIndex kUSBHostInterfacePropertyStringIndex +#define kUSBConfigurationValue kUSBHostMatchingPropertyConfigurationValue +#define kUSBInterfaceString kUSBHostInterfacePropertyString +#define kUSB1284DeviceID "1284 Device ID" + +#define kUSBCompatibilityMatch "USBCompatibilityMatch" +#define kUSBStandardVersion kUSBHostDevicePropertyStandardVersion +#define kUSBSpecReleaseNumber kUSBStandardVersion +#define kUSBDeviceContainerID kUSBContainerID +#define kUSBContainerID kUSBHostDevicePropertyContainerID + +#if !__OPEN_SOURCE__ && TARGET_OS_IPHONE && !TARGET_OS_MACCATALYST +#define kUSBProductString kUSBHostDevicePropertyProductString +#define kUSBVendorString kUSBHostDevicePropertyVendorString +#define kUSBSerialNumberString kUSBHostDevicePropertySerialNumberString +#else +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_14 +#define kUSBProductString "USB Product Name" +#define kUSBVendorString "USB Vendor Name" +#define kUSBSerialNumberString "USB Serial Number" +#else +#define kUSBProductString kUSBHostDevicePropertyProductString +#define kUSBVendorString kUSBHostDevicePropertyVendorString +#define kUSBSerialNumberString kUSBHostDevicePropertySerialNumberString +#endif /* MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_14 */ +#endif + +/*! + @enum Apple USB Vendor ID + @discussion Apple's vendor ID, assigned by the USB-IF + */ +enum +{ + kAppleVendorID = kIOUSBAppleVendorID +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/QualcommWireless/include/IOKit/video/IOVideoControlDictionary.h b/QualcommWireless/include/IOKit/video/IOVideoControlDictionary.h new file mode 100644 index 0000000..3ae44fd --- /dev/null +++ b/QualcommWireless/include/IOKit/video/IOVideoControlDictionary.h @@ -0,0 +1,74 @@ +/* + File: IOVideoControlDictionary.h + + Contains: + + Copyright: © 2006-2012 by Apple Inc., all rights reserved. +*/ + +#if !defined(__IOVideoControlDictionary_h__) +#define __IOVideoControlDictionary_h__ + +// System Includes +#include <IOKit/video/IOVideoTypes.h> + +class OSArray; +class OSDictionary; +class OSString; + +class IOVideoControlDictionary +{ +// Construction/Destruction +public: + static OSDictionary* create(UInt32 controlID, UInt32 baseClass, UInt32 derivedClass, UInt32 scope, UInt32 element, bool isReadOnly = false, UInt32 variant = 0, OSString* name = NULL); + static OSDictionary* createBooleanControl(UInt32 controlID, UInt32 baseClass, UInt32 derivedClass, UInt32 scope, UInt32 element, bool value, bool isReadOnly = false, UInt32 variant = 0, OSString* name = NULL); + static OSDictionary* createSelectorControl(UInt32 controlID, UInt32 baseClass, UInt32 derivedClass, UInt32 scope, UInt32 element, UInt32 value, OSArray* selectorMap, bool isReadOnly = false, UInt32 variant = 0, OSString* name = NULL); + +// General Attributes +public: + static OSDictionary* getControlByID(OSArray* controlList, UInt32 controlID); + + static UInt32 getControlID(const OSDictionary* dictionary); + static void setControlID(OSDictionary* dictionary, UInt32 controlID); + + static UInt32 getBaseClass(const OSDictionary* dictionary); + static void setBaseClass(OSDictionary* dictionary, UInt32 baseClass); + + static UInt32 getClass(const OSDictionary* dictionary); + static void setClass(OSDictionary* dictionary, UInt32 derivedClass); + + static UInt32 getScope(const OSDictionary* dictionary); + static void setScope(OSDictionary* dictionary, UInt32 scope); + + static UInt32 getElement(const OSDictionary* dictionary); + static void setElement(OSDictionary* dictionary, UInt32 element); + + static bool isReadOnly(const OSDictionary* dictionary); + static void setIsReadOnly(OSDictionary* dictionary, bool isReadOnly); + + static UInt32 getVariant(const OSDictionary* dictionary); + static void setVariant(OSDictionary* dictionary, UInt32 variant); + + static OSString* copyName(const OSDictionary* dictionary); + static void setName(OSDictionary* dictionary, const OSString* name); + +// Boolean Control Attributes +public: + static bool getBooleanControlValue(const OSDictionary* dictionary); + static void setBooleanControlValue(OSDictionary* dictionary, bool value); + +// Selector Control Attributes +public: + static UInt32 getSelectorControlValue(const OSDictionary* dictionary); + static void setSelectorControlValue(OSDictionary* dictionary, UInt32 value); + + static OSArray* copySelectorControlSelectorMap(const OSDictionary* dictionary); + static void setSelectorControlSelectorMap(OSDictionary* dictionary, const OSArray* selectorMap); + +// Selector Control Selector Map Item Support +public: + static OSDictionary* createSelectorControlSelectorMapItem(UInt32 value, const OSString* name); + static OSDictionary* createSelectorControlSelectorMapItem(UInt32 value, const OSString* name, UInt32 kind); +}; + +#endif diff --git a/QualcommWireless/include/IOKit/video/IOVideoDevice.h b/QualcommWireless/include/IOKit/video/IOVideoDevice.h new file mode 100644 index 0000000..a32b5b7 --- /dev/null +++ b/QualcommWireless/include/IOKit/video/IOVideoDevice.h @@ -0,0 +1,154 @@ +/* + File: IOVideoDevice.h + + Contains: + + Copyright: © 2006-2013 by Apple Inc., all rights reserved. +*/ + +#if !defined(__IOKIT_IOVIDEODEVICE_H) +#define __IOKIT_IOVIDEODEVICE_H + +#include <IOKit/IOService.h> +#include <IOKit/video/IOVideoTypes.h> +#include <IOKit/stream/IOStreamShared.h> + +class IOVideoStream; + +/*! + @class IOVideoDevice + @abstract A class representing a video device. + @discussion The IOVideoDevice class defines a mechanism for accessing the IOVideoStreams that a device presents. + + Although it is expected that the client of an IOVideoDevice will be in user space, this is not required. + + */ +class IOVideoDevice : public IOService +{ +// Construction/Destruction + OSDeclareDefaultStructors(IOVideoDevice); +public: + virtual bool init(OSDictionary* properties); + virtual void free(void); + +/*! + @function newUserClient + @abstract See the documentation for the IOService method newUserClient. +*/ + virtual IOReturn newUserClient(task_t owningTask, void* securityID, UInt32 type, OSDictionary* properties, IOUserClient** handler); + +/*! + @function getStreamCount + @result Returns the number of streams of the device. +*/ + virtual int getStreamCount(void); + +/*! + @function getStream + @param streamIndex + The index for which the underlying stream is desired. + @result Returns the number of streams of the device. +*/ + virtual IOVideoStream* getStream(UInt32 streamIndex); + +/*! + @function startStream + @abstract Start sending data on a stream. + @result Returns kIOReturnSuccess if the stream was successfully started. + @discussion This must be implemented by a subclass. +*/ + virtual IOReturn startStream(IOVideoStream* stream); + +/*! + @function stopStream + @abstract Stop sending data on a stream. + @result Returns kIOReturnSuccess if the stream was successfully started. + @discussion This must be implemented by a subclass. +*/ + virtual IOReturn stopStream(IOVideoStream* stream); + +/*! + @function suspendStream + @abstract Temporarily suspend data flow on the stream. + @result Returns kIOReturnSuccess if the stream was successfully suspended. + @discussion This must be implemented by a subclass. +*/ + virtual IOReturn suspendStream(IOVideoStream* stream); + +/*! + @function setStreamMode + @abstract Sets the mode of the stream, either input or output. + @discussion This must be implemented by a subclass. +*/ + virtual IOReturn setStreamMode(IOVideoStream* stream, IOStreamMode mode); + virtual IOReturn openStream(UInt32 streamIndex); + virtual IOReturn closeStream(UInt32 streamIndex); + virtual IOReturn startStream(UInt32 streamIndex); + virtual IOReturn stopStream(UInt32 streamIndex); + virtual IOReturn suspendStream(UInt32 streamIndex); + + + virtual IOReturn releaseStreams(void); + virtual void inputCallback(UInt32 token); + virtual void inputSyncCallback(UInt32 token); + + virtual IOReturn registerNotificationPort(mach_port_t port, UInt32 type, UInt32 clientData); + + virtual void sendSingleNotification(UInt32 notificationID, UInt32 objectID, UInt32 notificationArgument1, UInt32 notificationArgument2, UInt64 notificationArgument3, UInt64 notificationArgument4); + virtual void sendMultiNotification(UInt32 numberNotifications, const IOVideoDeviceNotification* notifications); + + virtual IOReturn setStreamFormat(UInt32 streamID, const IOVideoStreamDescription* newStreamFormat); + +// Control methods + virtual IOReturn setControlValue(UInt32 controlID, UInt32 value, UInt32* newValue); + +protected: + virtual IOReturn addStream(IOVideoStream* stream); + virtual IOReturn removeStream(UInt32 streamIndex); + + OSArray* mStreams; + IOVideoDeviceNotificationMessage* mNotificationMessage; + UInt32 mMaxNumberNotifications; + UInt32 mOutstandingConfigChangeRequests; + +// Future Expansion +public: + OSMetaClassDeclareReservedUnused(IOVideoDevice, 0); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 1); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 2); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 3); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 4); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 5); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 6); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 7); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 8); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 9); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 10); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 11); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 12); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 13); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 14); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 15); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 16); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 17); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 18); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 19); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 20); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 21); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 22); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 23); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 24); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 25); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 26); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 27); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 28); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 29); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 30); + OSMetaClassDeclareReservedUnused(IOVideoDevice, 31); + +protected: + struct ExpansionData {}; + ExpansionData *mReserved; +}; + +#endif diff --git a/QualcommWireless/include/IOKit/video/IOVideoDeviceClientInit.h b/QualcommWireless/include/IOKit/video/IOVideoDeviceClientInit.h new file mode 100644 index 0000000..0ab901f --- /dev/null +++ b/QualcommWireless/include/IOKit/video/IOVideoDeviceClientInit.h @@ -0,0 +1,26 @@ +/* + File: IOVideoDeviceClientInit.h + + Contains: This class is used to add an IOProviderMergeProperties dictionary entry to a provider's property list, thus providing a tie between hardware and a CFBundle at hardware + load time. This property usually contains the user client class name and the CFPlugInTypes UUID's but it can contain other properties. + + + Copyright: © 2006-2012 by Apple Inc., all rights reserved. +*/ + +#ifndef __IOVIDEODEVICECLIENTINIT_H +#define __IOVIDEODEVICECLIENTINIT_H + +#include <IOKit/IOService.h> + +class IOVideoDeviceUserClientInit : public IOService +{ + OSDeclareDefaultStructors(IOVideoDeviceUserClientInit); + +public: + virtual bool start(IOService* provider) ; + virtual bool MergeDictionaryIntoProvider(IOService* provider, OSDictionary* mergeDicttionary); + virtual bool MergeDictionaryIntoDictionary(OSDictionary* sourceDictionary, OSDictionary* targetDictionary); +}; + +#endif diff --git a/QualcommWireless/include/IOKit/video/IOVideoDeviceLib.h b/QualcommWireless/include/IOKit/video/IOVideoDeviceLib.h new file mode 100644 index 0000000..1f04ef8 --- /dev/null +++ b/QualcommWireless/include/IOKit/video/IOVideoDeviceLib.h @@ -0,0 +1,213 @@ +/* + File: IOVideoDeviceLib.h + + Contains: IOCFPlugin library for using IOVideoDevice objects. + The IOVideoDevice plugin provides a convenient set of functions for accessing and manipulating IOVideoDevice objects from user programs. + + Copyright: © 2006-2012 by Apple Inc., all rights reserved. +*/ + +#if !defined(__IOKIT_IOVIDEODEVICELIB_H) +#define __IOKIT_IOVIDEODEVICELIB_H + +#include <CoreFoundation/CoreFoundation.h> +#include <IOKit/IOKitLib.h> +#include <IOKit/IOCFPlugIn.h> +#include <IOKit/stream/IOStreamLib.h> +#include <IOKit/stream/IOStreamShared.h> +#include <IOKit/video/IOVideoDeviceShared.h> +#include <IOKit/video/IOVideoTypes.h> + +__BEGIN_DECLS + +#pragma mark IOVideo UUIDs + +/*! + @defined kIOVideoDeviceLibTypeID + @discussion This is the UUID of the plug-in type (5339633C-F903-4212-9C90-9B18AF01862D). +*/ +#define kIOVideoDeviceLibTypeID CFUUIDGetConstantUUIDWithBytes(kCFAllocatorDefault, 0x53, 0x39, 0x63, 0x3C, 0xF9, 0x03, 0x42, 0x12, 0x9C, 0x90, 0x9B, 0x18, 0xAF, 0x01, 0x86, 0x2D) + +/*! + @defined kIOVideoDeviceInterfaceID_v1 + @discussion This is the UUID of version 1 of the plug-in interface (080E3-5106-4D16-B70C-B3216F13CDB9A). +*/ +#define kIOVideoDeviceInterfaceID_v1 CFUUIDGetConstantUUIDWithBytes(kCFAllocatorDefault, 0x0D, 0xE0, 0x80, 0xE3, 0x51, 0x06, 0x4D, 0x16, 0xB7, 0x0C, 0xB3, 0x21, 0x6F, 0x13, 0xCD, 0xB9) +#define kIOVideoDeviceInterfaceID kIOVideoDeviceInterfaceID_v1 + +typedef struct IOVideoDeviceInterface_v1_t IOVideoDeviceInterface_v1_t; + +/*! + @typedef IOVideoDeviceRef +*/ +typedef IOVideoDeviceInterface_v1_t** IOVideoDeviceRef; + +/*! + @typedef IOVideoDeviceOutputCallback +*/ +typedef void (*IOVideoDeviceOutputCallback)( IOVideoDeviceRef stream, + void* context); + +/*! + @typedef IOVideoDeviceNotificationCallback +*/ +typedef void (*IOVideoDeviceNotificationCallback)( IOVideoDeviceRef device, + void* context, + void* message); + +/*! + @interface IOVideoDeviceInterface + @abstract Interface for accessing kernel-space video drivers from user space. + */ +typedef struct IOVideoDeviceInterface_v1_t +{ + IUNKNOWN_C_GUTS; + UInt32 Version; + UInt32 Revision; + + /*! + @functiongroup Opening and closing VideoDevices + */ + + /*! + @function Open + @abstract Open an IOVideoDevice from user space. + @discussion The Open function opens the device. + @param device + The IOVideoDeviceRef to the device returned by QueryInterface. + @param options + Open options. Currently unused. + @result If the device could not be opened an error will be returned. + */ + IOReturn + (*Open)(IOVideoDeviceRef device, IOOptionBits options); + + /*! + @function Close + @abstract Closes an IOVideoDevice. + @discussion Calling Close frees all streams belonging to the device and frees all user resources used by the device. + @param device + The IOVideoDeviceRef of the device to close. + @result Returns kIOReturnSuccess if the device was successfully closed. + */ + IOReturn + (*Close)(IOVideoDeviceRef device); + + /*! + @function GetNotificationPort + @abstract Get the notification port for device state changes sent to user space. + @param device + The IOVideoDeviceRef of the stream to operate on. + @result A CFMachPortRef of the output notification port. + */ + CFMachPortRef + (*GetNotificationPort)(IOVideoDeviceRef device); + + /*! + @function SetNotificationCallback + @abstract Set the callback function to be called when certain device state changes happen. + @param device + The IOVideoDeviceRef of the device to operate on. Pass NULL to remove the callback. + @result Returns kIOReturnSuccess if the callback was successfully set or removed. + */ + IOReturn + (*SetNotificationCallback)( IOVideoDeviceRef device, + IOVideoDeviceNotificationCallback callback, + void* context); + + /*! + @function SetControlValue + @param device + @param controlID + @param newValue + @result Returns kIOReturnSuccess if the call was successfully. + */ + IOReturn + (*SetControlValue)( IOVideoDeviceRef device, + UInt32 controlID, + UInt32 value, + UInt32* newValue); + + /*! + @function SetStreamFormat + @param device + @param streamID + @param streamFormat + @result Returns kIOReturnSuccess if the call was successfully. + */ + IOReturn + (*SetStreamFormat)( IOVideoDeviceRef device, + UInt32 streamID, + IOVideoStreamDescription* streamFormat); + + /*! + @function GetRunLoopSource + @abstract Gets a CFRunLoopSource for the CFMachPort used for notifications from the kernel that data is ready. + @param device + The IOVideoDeviceRef of the stream to operate on. + @result The CFRunLoopSourceRef for the run loop source, or NULL if there was an error creating the source. + */ + CFRunLoopSourceRef + (*GetRunLoopSource)(IOVideoDeviceRef device); + + /*! + @function AddToRunLoop + @abstract Add the CFRunLoopSource for the notification port to a run loop. + @param device + The IOVideoDeviceRef of the device to operate on. + @param runLoop + The run loop to which to add the notification source. + @result Returns kIOReturnSuccess if the source was successfully added to the run loop. + */ + + IOReturn + (*AddToRunLoop)( IOVideoDeviceRef device, + CFRunLoopRef runLoop); + + /*! + @function RemoveFromRunLoop + @abstract Remove the CFRunLoopSource for the notification port from a run loop. + @param device + The IOVideoDeviceRef of the device to operate on. + @param runLoop + The run loop from which to remove the notification source. + @result Returns kIOReturnSuccess if the source was successfully removed from the run loop. + */ + IOReturn + (*RemoveFromRunLoop)( IOVideoDeviceRef device, + CFRunLoopRef runLoop); + + /*! + @function CreateStreamInterface + @param device + The IOVideoDeviceRef of the device to operate on. + @param streamDictionary + @param streamIndex + @param isInput + @result Returns kIOReturnSuccess if the stream was successfully created. + */ + IOReturn + (*CreateStreamInterface)( IOVideoDeviceRef device, + CFDictionaryRef streamDictionary, + UInt32 streamIndex, + bool isInput, + IOStreamRef* streamRef); + + /*! + @function ReleaseStreamInterface + @param device + The IOVideoDeviceRef of the device to operate on. + @param isInput + @param streamRef + @result Returns kIOReturnSuccess if the stream was successfully released. + */ + IOReturn + (*ReleaseStreamInterface)( IOVideoDeviceRef device, + bool isInput, + IOStreamRef* streamRef); +} IOVideoDeviceInterface; + + +__END_DECLS + +#endif diff --git a/QualcommWireless/include/IOKit/video/IOVideoDeviceShared.h b/QualcommWireless/include/IOKit/video/IOVideoDeviceShared.h new file mode 100644 index 0000000..12a485e --- /dev/null +++ b/QualcommWireless/include/IOKit/video/IOVideoDeviceShared.h @@ -0,0 +1,39 @@ +/* + File: IOVideoDeviceShared.h + + Contains: + + Copyright: © 2006-2012 by Apple Inc., all rights reserved. +*/ + +#if !defined(__IOKIT_IOVIDEODEVICESHARED_H) +#define __IOKIT_IOVIDEODEVICESHARED_H + +#include <sys/cdefs.h> +#include <IOKit/IOTypes.h> + +/*! + @header IOVideoDeviceShared.h + IOVideoDevice definitions shared between kernel and user space. + */ + +__BEGIN_DECLS + +/*! + @enum Mach port types + @constant kIOVideoDevicePortTypeNotification + @constant kIOVideoDevicePortTypeOutput + @constant kIOVideoDevicePortTypeInput + @abstract Port types used with IOConnectSetNotificationPort(). + */ +enum +{ + kIOVideoDevicePortTypeNotification, + kIOVideoDevicePortTypeOutput, + kIOVideoDevicePortTypeInput +}; + +__END_DECLS + +#endif /* ! __IOKIT_IOVIDEODEVICESHARED_H */ + diff --git a/QualcommWireless/include/IOKit/video/IOVideoDeviceUserClient.h b/QualcommWireless/include/IOKit/video/IOVideoDeviceUserClient.h new file mode 100644 index 0000000..bd55ff1 --- /dev/null +++ b/QualcommWireless/include/IOKit/video/IOVideoDeviceUserClient.h @@ -0,0 +1,109 @@ +/* + File: IOVideoDeviceUserClient.h + + Contains: + + Copyright: © 2006-2012 by Apple Inc., all rights reserved. +*/ + +#if !defined(__IOKIT_IOVIDEODEVICEUSERCLIENT_H) +#define __IOKIT_IOVIDEODEVICEUSERCLIENT_H + +/*! + @enum User client methods + @constant kIOVideoDeviceMethodOpen + @constant kIOVideoDeviceMethodClose + @constant kIOVideoDeviceMethodGetMode + @constant kIOVideoDeviceMethodSetControlValue + @constant kIOVideoDeviceMethodOpenStream + @constant kIOVideoDeviceMethodCloseStream + @constant kIOVideoDeviceMethodSetStreamFormat + @constant kIOVideoDeviceMethodStartStream + @constant kIOVideoDeviceMethodStopStream + @constant kIOVideoDeviceMethodSuspendStream + + @abstract Client method numbers used with IOConnectMethod...() functions. + */ +enum +{ + kIOVideoDeviceMethodOpen = 0, + kIOVideoDeviceMethodClose, + kIOVideoDeviceMethodGetMode, + kIOVideoDeviceMethodSetMode, + kIOVideoDeviceMethodSetControlValue, + kIOVideoDeviceMethodOpenStream, + kIOVideoDeviceMethodCloseStream, + kIOVideoDeviceMethodSetStreamFormat, + kIOVideoDeviceMethodStartStream, + kIOVideoDeviceMethodStopStream, + kIOVideoDeviceMethodSuspendStream, + + kIOVideoDeviceMethodCount +}; + +#ifdef KERNEL +#ifdef __cplusplus + +#include <IOKit/IOUserClient.h> +#include <IOKit/stream/IOStreamShared.h> +#include <IOKit/video/IOVideoTypes.h> + +class IOVideoDevice; + +class IOVideoDeviceUserClient : public IOUserClient +{ +// Construction/Destruction + OSDeclareDefaultStructors(IOVideoDeviceUserClient) + +// Static versions of external methods +private: + static IOReturn sOpen(IOVideoDeviceUserClient* target, void* reference, IOExternalMethodArguments* arguments); + static IOReturn sClose(IOVideoDeviceUserClient* target, void* reference, IOExternalMethodArguments* arguments); + static IOReturn sGetMode(IOVideoDeviceUserClient* target, void* reference, IOExternalMethodArguments* arguments); + static IOReturn sSetMode(IOVideoDeviceUserClient* target, void* reference, IOExternalMethodArguments* arguments); + static IOReturn sSetControlValue(IOVideoDeviceUserClient* target, void* reference, IOExternalMethodArguments* arguments); + static IOReturn sOpenStream(IOVideoDeviceUserClient* target, void* reference, IOExternalMethodArguments* arguments); + static IOReturn sCloseStream(IOVideoDeviceUserClient* target, void* reference, IOExternalMethodArguments* arguments); + static IOReturn sSetStreamFormat(IOVideoDeviceUserClient* target, void* reference, IOExternalMethodArguments* arguments); + static IOReturn sStartStream(IOVideoDeviceUserClient* target, void* reference, IOExternalMethodArguments* arguments); + static IOReturn sStopStream(IOVideoDeviceUserClient* target, void* reference, IOExternalMethodArguments* arguments); + static IOReturn sSuspendStream(IOVideoDeviceUserClient* target, void* reference, IOExternalMethodArguments* arguments); + +protected: + const IOExternalMethodDispatch* mExternalMethods; + IOVideoDevice* mDevice; + task_t mTask; + +// IOUserClient overriden methods +public: + virtual bool initWithTask(task_t owningTask, void* securityToken, UInt32 type); + virtual bool initWithTask(task_t owningTask, void* securityToken, UInt32 type, OSDictionary* properties); + virtual IOReturn clientClose(void); + virtual IOReturn clientDied(void); + virtual IOService* getService(void); + virtual IOReturn registerNotificationPort(mach_port_t port, UInt32 portType, UInt32 refCon); + virtual IOReturn connectClient(IOUserClient* client); + virtual IOReturn externalMethod(uint32_t selector, IOExternalMethodArguments* arguments, IOExternalMethodDispatch* dispatch, OSObject* target, void* reference); + +// IOService overriden methods + virtual bool start(IOService* provider); + +// external methods +public: + virtual IOReturn open(IOOptionBits options); + virtual IOReturn close(void); + virtual IOReturn getMode(UInt32 streamIndex, IOStreamMode* mode); + virtual IOReturn setMode(UInt32 streamIndex, IOStreamMode mode); + virtual IOReturn setControlValue(UInt32 controlID, UInt32 value, UInt32* newValue); + virtual IOReturn setStreamFormat(UInt32 streamID, const IOVideoStreamDescription* newStreamFormat); + virtual IOReturn openStream(UInt32 streamIndex); + virtual IOReturn closeStream(UInt32 streamIndex); + virtual IOReturn startStream(UInt32 streamIndex); + virtual IOReturn stopStream(UInt32 streamIndex); + virtual IOReturn suspendStream(UInt32 streamIndex); +}; + +#endif /* __cplusplus */ +#endif /* KERNEL */ + +#endif diff --git a/QualcommWireless/include/IOKit/video/IOVideoStream.h b/QualcommWireless/include/IOKit/video/IOVideoStream.h new file mode 100644 index 0000000..054c37e --- /dev/null +++ b/QualcommWireless/include/IOKit/video/IOVideoStream.h @@ -0,0 +1,140 @@ +/* + File: IOVideoStream.h + + Contains: + + Copyright: © 2006-2012 by Apple Inc., all rights reserved. +*/ + +#ifndef __IOKIT_IOVIDEOSTREAM_H +#define __IOKIT_IOVIDEOSTREAM_H + +#include <IOKit/stream/IOStream.h> + +class IOVideoDevice; + +/*! + @class IOVideoStream + @abstract A class representing a stream of video data buffers passed from kernel to user space and back again. + @discussion The IOVideoStream class defines a mechanism for moving buffers of data from kernel space to user space or vice-versa. The policy for which direction the data flows and the + nature of the data is left up the the implementer of the driver which uses IOStream. + + Although it is expected that the client of an IOVideoStream will be in user space, this is not required. + + References to "output" mean "from the IOVideoStream to the user client", and "input" means "from the user client to the IOVideoStream." + + */ +class IOVideoStream : public IOStream +{ +// Construction/Destruction + OSDeclareDefaultStructors(IOVideoStream); + +protected: + IOStreamMode mStreamMode; + +public: + +/*! + @function withBuffers + @param buffers + An array of IOStreamBuffer objects which will be the buffers for this stream. + @param mode + The initial mode of the video stream, either output, input, or input/output. + @param queueLength + The nuber of queue entries to reserve in the input and output queue. Zero means to make the queues big enough to accommodate all the buffers at once. + @param properties + A dictionary of properties which will be set on the video stream. +*/ + static IOVideoStream* withBuffers(OSArray* buffers, IOStreamMode mode = kIOStreamModeOutput, IOItemCount queueLength = 0, OSDictionary* properties = 0); + + +/*! + @function initWithBuffers + @param buffers + An array of IOStreamBuffer objects which will be the buffers for this stream. + @param mode + The initial mode of the video stream, either output, input, or input/output. + @param queueLength + The nuber of queue entries to reserve in the input and output queue. Zero means to make the queues big enough to accommodate all the buffers at once. + @param properties + A dictionary of properties which will be set on the video stream. +*/ + virtual bool initWithBuffers(OSArray* buffers, IOStreamMode mode = kIOStreamModeOutput, IOItemCount queueLength = 0, OSDictionary* properties = 0); + + virtual IOVideoDevice* getDevice(void); // Returns provider cast to an IOVideoDevice + +/*! + @function getStreamMode + @abstract Returns the mode of the stream, either input or output. + @result The mode of the stream, either kIOStreamModeInput (from user space to kernel space) or the default kIOStreamModeOutput (from kernel space to user space). +*/ + virtual IOStreamMode getStreamMode(void); + +/*! + @function setStreamMode + @abstract Sets the mode of the stream, either input or output. +*/ + virtual IOReturn setStreamMode(IOStreamMode mode); + +/*! + @function startStream + @abstract Start sending data on a stream. + @result Returns kIOReturnSuccess if the stream was successfully started. +*/ + virtual IOReturn startStream(void); + +/*! + @function stopStream + @abstract Stop sending data on a stream. + @result Returns kIOReturnSuccess if the stream was successfully started. +*/ + virtual IOReturn stopStream(void); + +/*! + @function suspendStream + @abstract Temporarily suspend data flow on the stream. + @result Returns kIOReturnSuccess if the stream was successfully suspended. +*/ + virtual IOReturn suspendStream(void); + +// Future Expansion +public: + OSMetaClassDeclareReservedUnused(IOVideoStream, 0); + OSMetaClassDeclareReservedUnused(IOVideoStream, 1); + OSMetaClassDeclareReservedUnused(IOVideoStream, 2); + OSMetaClassDeclareReservedUnused(IOVideoStream, 3); + OSMetaClassDeclareReservedUnused(IOVideoStream, 4); + OSMetaClassDeclareReservedUnused(IOVideoStream, 5); + OSMetaClassDeclareReservedUnused(IOVideoStream, 6); + OSMetaClassDeclareReservedUnused(IOVideoStream, 7); + OSMetaClassDeclareReservedUnused(IOVideoStream, 8); + OSMetaClassDeclareReservedUnused(IOVideoStream, 9); + OSMetaClassDeclareReservedUnused(IOVideoStream, 10); + OSMetaClassDeclareReservedUnused(IOVideoStream, 11); + OSMetaClassDeclareReservedUnused(IOVideoStream, 12); + OSMetaClassDeclareReservedUnused(IOVideoStream, 13); + OSMetaClassDeclareReservedUnused(IOVideoStream, 14); + OSMetaClassDeclareReservedUnused(IOVideoStream, 15); + OSMetaClassDeclareReservedUnused(IOVideoStream, 16); + OSMetaClassDeclareReservedUnused(IOVideoStream, 17); + OSMetaClassDeclareReservedUnused(IOVideoStream, 18); + OSMetaClassDeclareReservedUnused(IOVideoStream, 19); + OSMetaClassDeclareReservedUnused(IOVideoStream, 20); + OSMetaClassDeclareReservedUnused(IOVideoStream, 21); + OSMetaClassDeclareReservedUnused(IOVideoStream, 22); + OSMetaClassDeclareReservedUnused(IOVideoStream, 23); + OSMetaClassDeclareReservedUnused(IOVideoStream, 24); + OSMetaClassDeclareReservedUnused(IOVideoStream, 25); + OSMetaClassDeclareReservedUnused(IOVideoStream, 26); + OSMetaClassDeclareReservedUnused(IOVideoStream, 27); + OSMetaClassDeclareReservedUnused(IOVideoStream, 28); + OSMetaClassDeclareReservedUnused(IOVideoStream, 29); + OSMetaClassDeclareReservedUnused(IOVideoStream, 30); + OSMetaClassDeclareReservedUnused(IOVideoStream, 31); + +protected: + struct ExpansionData {}; + ExpansionData *mReserved; +}; + +#endif diff --git a/QualcommWireless/include/IOKit/video/IOVideoStreamDictionary.h b/QualcommWireless/include/IOKit/video/IOVideoStreamDictionary.h new file mode 100644 index 0000000..e488716 --- /dev/null +++ b/QualcommWireless/include/IOKit/video/IOVideoStreamDictionary.h @@ -0,0 +1,47 @@ +/* + File: IOVideoStreamDictionary.h + + Contains: + + Copyright: © 2006-2012 by Apple Inc., all rights reserved. +*/ + +#if !defined(__IOVideoStreamDictionary_h__) +#define __IOVideoStreamDictionary_h__ + +// System Includes +#include <IOKit/video/IOVideoTypes.h> + +class OSArray; +class OSDictionary; + +class IOVideoStreamDictionary +{ + +// Construction/Destruction +public: + static OSDictionary* create(UInt32 streamID, UInt32 startingDeviceChannelNumber, const OSDictionary* currentFormat, OSArray* availableFormats = NULL); + +// Attributes +public: + static UInt32 getStreamID(const OSDictionary* dictionary); + static void setStreamID(OSDictionary* dictionary, UInt32 streamID); + + static UInt32 getStartingDeviceChannelNumber(const OSDictionary* dictionary); + static void setStartingDeviceChannelNumber(OSDictionary* dictionary, UInt32 startingDeviceChannelNumber); + + static IOOptionBits getBufferMappingOptions(const OSDictionary* dictionary); + static void setBufferMappingOptions(OSDictionary* dictionary, IOOptionBits bufferMappingOptions); + + static bool getCurrentFormat(const OSDictionary* dictionary, IOVideoStreamDescription& format); + static void setCurrentFormat(OSDictionary* dictionary, const IOVideoStreamDescription& format); + static OSDictionary* copyCurrentFormatDictionary(const OSDictionary* dictionary); + static void setCurrentFormatDictionary(OSDictionary* dictionary, const OSDictionary* format); + + static OSArray* copyAvailableFormats(const OSDictionary* dictionary); + static void setAvailableFormats(OSDictionary* dictionary, OSArray* availableFormats); + + static void printDictionary(const OSDictionary* dictionary); +}; + +#endif diff --git a/QualcommWireless/include/IOKit/video/IOVideoStreamFormatDictionary.h b/QualcommWireless/include/IOKit/video/IOVideoStreamFormatDictionary.h new file mode 100644 index 0000000..9485c50 --- /dev/null +++ b/QualcommWireless/include/IOKit/video/IOVideoStreamFormatDictionary.h @@ -0,0 +1,44 @@ +/* + File: IOVideoStreamFormat.h + + Contains: + + Copyright: © 2006-2012 by Apple Inc., all rights reserved. +*/ + +#if !defined(__IOVideoStreamFormat_h__) +#define __IOVideoStreamFormat_h__ + +// System Includes +#include <IOKit/video/IOVideoTypes.h> + +class OSDictionary; + +class IOVideoStreamFormatDictionary +{ +public: + static OSDictionary* create(UInt32 codecType, UInt32 codecFlags, UInt32 width, UInt32 height); + static OSDictionary* createWithDescription(const IOVideoStreamDescription& format); + +// Attributes +public: + static UInt32 getCodecType(const OSDictionary* dictionary); + static void setCodecType(OSDictionary* dictionary, UInt32 codecType); + + static UInt32 getCodecFlags(const OSDictionary* dictionary); + static void setCodecFlags(OSDictionary* dictionary, UInt32 codecFlags); + + static UInt32 getWidth(const OSDictionary* dictionary); + static void setWidth(OSDictionary* dictionary, UInt32 width); + + static UInt32 getHeight(const OSDictionary* dictionary); + static void setHeight(OSDictionary* dictionary, UInt32 height); + + static void getDescription(const OSDictionary* dictionary, IOVideoStreamDescription& format); + static void printDescription(const IOVideoStreamDescription& format); + static void printDictionary(const OSDictionary* dictionary); + + static bool isSameSampleFormat(const IOVideoStreamDescription& format1, const IOVideoStreamDescription& format2); +}; + +#endif diff --git a/QualcommWireless/include/IOKit/video/IOVideoTypes.h b/QualcommWireless/include/IOKit/video/IOVideoTypes.h new file mode 100644 index 0000000..5435812 --- /dev/null +++ b/QualcommWireless/include/IOKit/video/IOVideoTypes.h @@ -0,0 +1,321 @@ +/* + File: IOVideoTypes.h + + Contains: + + Copyright: © 2006-2014 by Apple Inc., all rights reserved. +*/ + +#if !defined(__IOVideoTypes_h__) +#define __IOVideoTypes_h__ + +// System Includes +#include <IOKit/IOTypes.h> +#include <mach/message.h> + +#if defined(__cplusplus) +extern "C" +{ +#endif + +/*! + @struct IOVideoDeviceNotification + @abstract This structure contains an individual notification from the driver. + @field mObjectID + The ID of the object to which the notification pertains. + @field mNotificationID + A UInt32 that identifies the kind of the notification. + @field mNotificationArgument1 + A UInt32 whose usage depends on the the specific kind of notification. + @field mNotificationArgument2 + A UInt32 whose usage depends on the the specific kind of notification. + @field mNotificationArgument3 + A UInt64 whose usage depends on the the specific kind of notification. + @field mNotificationArgument4 + A UInt64 whose usage depends on the the specific kind of notification. +*/ +struct IOVideoDeviceNotification +{ + UInt32 mObjectID; + UInt32 mNotificationID; + UInt32 mNotificationArgument1; + UInt32 mNotificationArgument2; + UInt64 mNotificationArgument3; + UInt64 mNotificationArgument4; +}; +typedef struct IOVideoDeviceNotification IOVideoDeviceNotification; + +/*! + @struct IOVideoDeviceNotificationMessage + @abstract This structure describes a notification from the driver. Note that the message can contain multiple notifications. + @field mMessageHeader + The mach message header. + @field mClientData + The client data that was registered with the mach port. + @field mNumberNotifications + The number of IOVideoDeviceNotifications in the mNotifications array. + @field mNotifications + A variable length array of IOVideoDeviceNotification structures that carry the actual notification data. The number of elements in this array is denoted by + mNumberNotifications, but can also be inferred from the message size in the mach message header. +*/ +struct IOVideoDeviceNotificationMessage +{ + mach_msg_header_t mMessageHeader; + UInt32 mClientData; + UInt32 mNumberNotifications; + IOVideoDeviceNotification mNotifications[1]; +}; +typedef struct IOVideoDeviceNotificationMessage IOVideoDeviceNotificationMessage; + +#define CalculateIOVideoDeviceNotificationMessageSize(numberNotifications) (sizeof(IOVideoDeviceNotificationMessage) + (((numberNotifications) - 1) * sizeof(IOVideoDeviceNotification))) + +#pragma mark Notification IDs +/*! + @enum Notification IDs + @discussion + @abstract The four char codes used to identify the kind of the notification. + @discussion All device-level notifications will have an object ID of 0. + @constant kIOVideoDeviceNotificationID_ControlValueChanged + Indicates that the value of the control with the given ID has changed. The first argument is the new value. + @constant kIOVideoDeviceNotificationID_ControlRangeChanged + Indicates that the range of the control with the given ID has changed. +*/ +enum +{ + kIOVideoDeviceNotificationID_ControlValueChanged = 'cval', + kIOVideoDeviceNotificationID_ControlRangeChanged = 'crng' +}; + +struct IOVideoStreamDescription +{ + UInt32 mVideoCodecType; + UInt32 mVideoCodecFlags; + UInt32 mWidth; + UInt32 mHeight; + UInt32 mReserved1; + UInt32 mReserved2; +}; +typedef struct IOVideoStreamDescription IOVideoStreamDescription; + +//================================================================================================== +#pragma mark Control Constants + +/*! + @enum Control Constants + @discussion + @abstract Various constants related to controls. + @constant kIOVideoControlScopeGlobal + The scope for controls that apply to the device as a whole. + @constant kIOVideoControlScopeInput + The scope for controls that apply to the input section of the device. + @constant kIOVideoControlScopeOutput + The scope for controls that apply to the output section of the device. + @constant kIOVideoControlScopePlayThrough + The scope for controls that apply to the play through section of the device. + @constant kIOVideoControlElementMaster + The element value for controls that apply to the master element or to the entire scope. Note that other elements are numbered consecutively starting from 1. +*/ +enum +{ + kIOVideoControlScopeGlobal = 'glob', + kIOVideoControlScopeInput = 'inpt', + kIOVideoControlScopeOutput = 'outp', + kIOVideoControlScopePlayThrough = 'ptru', + kIOVideoControlElementMaster = 0 +}; + +/*! + @enum Control Base Class IDs + @discussion + @abstract The class IDs that identify the various control base classes. + @constant kIOVideoControlBaseClassIDBoolean + The class ID that identifies the boolean control class which is a subclass of the base control class. Boolean controls manipulate on/off switches in the hardware. + @constant kIOVideoControlBaseClassIDSelector + The class ID that identifies the selector control class which is a subclass of the base control class. Selector controls manipulate controls that have + multiple, but discreet values. + @constant kIOVideoControlBaseClassIDFeature + The class ID that identifies the feature control class which is a subclass of the base control class. Feature controls manipulate various features that might be + present on a device, such as hue, saturation, zoom, etc. +*/ +enum +{ + kIOVideoControlBaseClassIDBoolean = 'togl', + kIOVideoControlBaseClassIDSelector = 'slct', + kIOVideoControlBaseClassIDFeature = 'ftct' + +}; + +/*! + @enum IOVideoBooleanControl Subclass IDs + @discussion + @abstract The four char codes that identify the various standard subclasses of IOVideoBooleanControl. + @constant kIOVideoBooleanControlClassIDJack + A IOVideoBooleanControl where a true value means something is plugged into that element. + @constant kIOVideoBooleanControlClassIDDirection + A IOVideoBooleanControl where a true value means the element is operating in input mode, and false means the element is operating in output mode. + This control is only needed for devices which can do input and output, but not at the same time. +*/ +enum +{ + kIOVideoBooleanControlClassIDJack = 'jack', + kIOVideoBooleanControlClassIDDirection = 'dire' +}; + +/*! + @enum IOVideoSelectorControl Subclass IDs + @discussion + @abstract The four char codes that identify the various standard subclasses of IOVideoSelectorControl. + @constant kIOVideoSelectorControlClassIDDataSource + A IOVideoSelectorControl that identifies where the data for the element is coming from. + @constant kIOVideoSelectorControlClassIDDataDestination + A IOVideoSelectorControl that identifies where the data for the element is going. +*/ +enum +{ + kIOVideoSelectorControlClassIDDataSource = 'dsrc', + kIOVideoSelectorControlClassIDDataDestination = 'dest' +}; + +/*! + @enum IOVideoFeatureControl Subclass IDs + @discussion + @abstract The four char codes that identify the various standard subclasses of IOVideoFeatureControl. + @constant kIOVideoFeatureControlClassIDBlackLevel + A IOVideoFeatureControl that controls the black level offset. The units for the control's absolute value are percetage (%). + @constant kIOVideoFeatureControlClassIDWhiteLevel + A IOVideoFeatureControl that controls the white level offset. The units for the control's absolute value are percentage (%). + @constant kIOVideoFeatureControlClassIDHue + A IOVideoFeatureControl that controls the hue offset. Positive values mean counterclockwise, negative values means clockwise on a vector scope. The units for the + control's absolute value are degrees (°). + @constant kIOVideoFeatureControlClassIDSaturation + A IOVideoFeatureControl that controls color intensity. For example, at high saturation levels, red appears to be red; at low saturation, red appears as pink. The + unit for the control's absolute value is a percentage (%). + @constant kIOVideoFeatureControlClassIDContrast + A IOVideoFeatureControl that controls a the distance bewtween the whitest whites and blackest blacks. The units for the control's absolute value are percentage (%). + @constant kIOVideoFeatureControlClassIDSharpness + A IOVideoFeatureControl that controls the sharpness of the picture. The units for the control's absolute value are undefined. + @constant kIOVideoFeatureControlClassIDBrightness + A IOVideoFeatureControl that controls the intensity of the video level. The units for the control's absolute value are percetage (%). + @constant kIOVideoFeatureControlClassIDGain + A IOVideoFeatureControl that controls the amplification of the signal. The units for the control's absolute value are decibels (dB). + @constant kIOVideoFeatureControlClassIDIris + A IOVideoFeatureControl that controls a mechanical lens iris. The units for the control's absolute value are an F number (F). + @constant kIOVideoFeatureControlClassIDShutter + A IOVideoFeatureControl that controls the integration time of the incoming light. The units for the control's absolute value are seconds (s). + @constant kIOVideoFeatureControlClassIDExposure + A IOVideoFeatureControl that controls a the total amount of light accumulated. The units for the control's absolute value are exposure value (EV). + @constant kIOVideoFeatureControlClassIDWhiteBalanceU + A IOVideoFeatureControl that controls the adjustment of the white color of the picture. The units for the control's absolute value are kelvin (K). + @constant kIOVideoFeatureControlClassIDWhiteBalanceV + A IOVideoFeatureControl that controls a adjustment of the white color of the picture. The units for the control's absolute value are kelvin (K). + @constant kIOVideoFeatureControlClassIDGamma + A IOVideoFeatureControl that defines the function between incoming light level and output picture level. The units for the control's absolute value are undefined. + @constant kIOVideoFeatureControlClassIDTemperature + A IOVideoFeatureControl that controls the temperature inside of the device and/or controlling temperature. The units for the control's absolute value are undefined. + @constant kIOVideoFeatureControlClassIDZoom + A IOVideoFeatureControl that controls the zoom. The units for the control's absolute value are power where 1 is the wide end. + @constant kIOVideoFeatureControlClassIDFocus + A IOVideoFeatureControl that controls a focus mechanism. The units for the control's absolute value are meters (m). + @constant kIOVideoFeatureControlClassIDPan + A IOVideoFeatureControl that controls a panning mechanism. Positive values mean clockwise, negative values means counterclockwise. The units for the control's + absolute value are degrees (°). + @constant kIOVideoFeatureControlClassIDTilt + A IOVideoFeatureControl that controls a tilt mechanism. Positive values mean updwards, negative values means downwards. The units for the control's absolute value are + degrees (°). + @constant kIOVideoFeatureControlClassIDOpticalFilter + A IOVideoFeatureControl that controls changing the optical filter of camera lens function. The units for the control's absolute value are are undefined. + @constant kIOVideoFeatureControlClassIDBacklightCompensation + A IOVideoFeatureControl that controls the amount of backlight compensation to apply. A low number indicates the least amount of backlight compensation. The units for the + control's absolute value are are undefined. + @constant kIOVideoFeatureControlClassIDPowerLineFrequency + A IOVideoFeatureControl to specify the power line frequency to properly implement anti-flicker processing. The units for the contorl's absolute value are hertz (Hz). +*/ +enum +{ + kIOVideoFeatureControlClassIDBlackLevel = 'bklv', + kIOVideoFeatureControlClassIDWhiteLevel = 'whlv', + kIOVideoFeatureControlClassIDHue = 'hue ', + kIOVideoFeatureControlClassIDSaturation = 'satu', + kIOVideoFeatureControlClassIDContrast = 'ctst', + kIOVideoFeatureControlClassIDSharpness = 'shrp', + kIOVideoFeatureControlClassIDBrightness = 'brit', + kIOVideoFeatureControlClassIDGain = 'gain', + kIOVideoFeatureControlClassIDIris = 'iris', + kIOVideoFeatureControlClassIDShutter = 'shtr', + kIOVideoFeatureControlClassIDExposure = 'xpsr', + kIOVideoFeatureControlClassIDWhiteBalanceU = 'whbu', + kIOVideoFeatureControlClassIDWhiteBalanceV = 'whbv', + kIOVideoFeatureControlClassIDGamma = 'gmma', + kIOVideoFeatureControlClassIDTemperature = 'temp', + kIOVideoFeatureControlClassIDZoom = 'zoom', + kIOVideoFeatureControlClassIDFocus = 'fcus', + kIOVideoFeatureControlClassIDPan = 'pan ', + kIOVideoFeatureControlClassIDTilt = 'tilt', + kIOVideoFeatureControlClassIDOpticalFilter = 'opft', + kIOVideoFeatureControlClassIDBacklightCompensation = 'bklt', + kIOVideoFeatureControlClassIDPowerLineFrequency = 'pwfq' +}; + +//================================================================================================== +#pragma mark IORegistry Keys + +// IOVideo Class Names +#define kIOVideoDevice_ClassName "IOVideoDevice" + +// IOVideoDevice IORegistry Keys +#pragma mark IOVideoDevice IORegistry Keys +#define kIOVideoDeviceKey_DeviceName "device name" +#define kIOVideoDeviceKey_DeviceManufacturer "device manufacturer" +#define kIOVideoDeviceKey_DeviceUID "device UID" +#define kIOVideoDeviceKey_IOEngineIsRunning "is running" +#define kIOVideoDeviceKey_InputLatency "input latency" +#define kIOVideoDeviceKey_OutputLatency "output latency" +#define kIOVideoDeviceKey_InputStreamList "input streams" +#define kIOVideoDeviceKey_OutputStreamList "output streams" +#define kIOVideoDeviceKey_ControlList "controls" + +// IOVideoDevice Stream Dictionary Keys +#pragma mark IOVideoDevice Stream Dictionary Keys +#define kIOVideoStreamKey_StreamID "stream ID" +#define kIOVideoStreamKey_StartingDeviceChannelNumber "starting channel" +#define kIOVideoStreamKey_BufferMappingOptions "buffer mapping options" +#define kIOVideoStreamKey_CurrentFormat "current format" +#define kIOVideoStreamKey_AvailableFormats "available formats" + +// IOVideoDevice Control Dictionary Keys +#pragma mark IOVideoDevice Control Dictionary Keys +#define kIOVideoControlKey_ControlID "control ID" +#define kIOVideoControlKey_BaseClass "base class" +#define kIOVideoControlKey_Class "class" +#define kIOVideoControlKey_Scope "scope" +#define kIOVideoControlKey_Element "element" +#define kIOVideoControlKey_IsReadOnly "read only" +#define kIOVideoControlKey_Variant "variant" +#define kIOVideoControlKey_Name "name" +#define kIOVideoControlKey_Value "value" + +// IOVideoDevice Selector Control Dictionary Keys +#pragma mark IOVideoDevice Selector Control Dictionary Keys +#define kIOVideoSelectorControlKey_SelectorMap "selectors" + +// IOVideoDevice Selector Control Selector Map Item Dictionary Keys +#pragma mark IOVideoDevice Selector Control Selector Map Item Dictionary Keys +#define kIOVideoSelectorControlSelectorMapItemKey_Value "value" +#define kIOVideoSelectorControlSelectorMapItemKey_Name "name" +#define kIOVideoSelectorControlSelectorMapItemKey_Kind "kind" + +// Stream Format Dictionary Keys +#pragma mark Stream Format Dictionary Keys +#define kIOVideoStreamFormatKey_CodecType "codec type" +#define kIOVideoStreamFormatKey_CodecFlags "codec flags" +#define kIOVideoStreamFormatKey_Width "width" +#define kIOVideoStreamFormatKey_Height "height" + + +//================================================================================================== + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 0000000..975fd63 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,105 @@ +# Architecture de QualcommWireless + +Ce document détaille l'architecture logicielle et matérielle du pilote unifié **QualcommWireless** pour les puces combinées **Qualcomm FastConnect 7800** (SoC WCN7850) sous macOS Sequoia (15.x) et versions ultérieures. + +--- + +## 1. Vue d'Ensemble du Matériel WCN7850 + +Le module sans fil Qualcomm FastConnect 7800 (WCN7850) utilise une architecture à double bus physique : + +```mermaid +graph TD + subgraph Host["Système Hôte (macOS Sequoia - Darwin 24)"] + subgraph Kernel["Kernel Space (XNU / IOKit)"] + IO80211["com.apple.iokit.IO80211Family\n(IO80211Controller)"] + IOUSB["com.apple.iokit.IOUSBHostFamily\n(IOUSBHostDevice / Interface)"] + QWifi["QualcommWifi.kext\n(Driver Wi-Fi 7 Natif)"] + QBt["QualcommWireless.kext\n(Initialisation & Firmware BT)"] + end + subgraph Userland["Espace Utilisateur"] + AirportD["airportd / CoreWLAN / Control Center"] + BtD["bluetoothd / IOBluetoothFamily daemon"] + end + end + + subgraph Hardware["Qualcomm FastConnect 7800 (WCN7850)"] + subgraph PCIeBus["Bus PCIe Gen3 x1 (VID 0x17cb, PID 0x1107)"] + BAR0["MMIO BAR0 (512 Ko)"] + Windowing["Registre Fenêtrage (0x310c)"] + BHI["Boot Host Interface (BHI/BHIe)"] + MHI["Modem Host Interface (MHI v1.0)"] + AMSS["Firmware Wi-Fi 7 (AMSS)"] + end + subgraph USBBus["Bus USB 2.0 (VID 0x0489, PID 0xe10d)"] + EP0["Contrôle EP0 (Requêtes Vendeur QCA)"] + EP2["Bulk OUT EP2 (DFU Firmware Upload)"] + EP1["Interrupt IN EP1 (Événements HCI)"] + ROM["ROM Qualcomm & Patch RAM"] + end + end + + AirportD -->|Apple80211 IOCTL / Skywalk| IO80211 + IO80211 --> QWifi + QWifi -->|BAR0 Windowing / MHI / Ring DMA| BAR0 + BAR0 --> Windowing + Windowing --> BHI + BHI --> AMSS + + BtD -->|UserClient / HCI Packets| IOUSB + IOUSB --> QBt + QBt -->|DFU Rampatch & NVM| EP2 + QBt -->|HCI Reset| EP0 +``` + +### Caractéristiques Physiques +1. **Partie Wi-Fi (PCIe)** : + - Identifiant : `0x17cb:0x1107` + - Protocole : 802.11a/b/g/n/ac/ax/be (Wi-Fi 7) + - Bandes de fréquence : 2.4 GHz, 5 GHz, 6 GHz + - Largeur de canal maximale : 320 MHz, modulation 4096-QAM + - Débit théorique : jusqu'à 5.8 Gbps + - Bus d'interface : PCI Express Gen3 x1 + +2. **Partie Bluetooth (USB)** : + - Identifiant : `0x0489:0xe10d` (Foxconn / Hon Hai WCN7850 HCI) + - Spécification : Bluetooth 5.4, LE Audio, Auracast + - Bus d'interface : USB 2.0 haute fidélité (connecté en interne sur port USB de la carte mère) + +--- + +## 2. Découpage du Pilote Kernel + +Le pilote est structuré en deux classes IOKit distinctes et complémentaires au sein du bundle : + +### 2.1. `QualcommWifi` (`IO80211Controller`) +- **Rôle** : Pilote Wi-Fi natif. +- **Classe parente** : `IO80211Controller` (de `com.apple.iokit.IO80211Family`). +- **Fournisseur (Provider)** : `IOPCIDevice` (`pci17cb,1107`). +- **Gestion MMIO & Fenêtrage** : + - La mémoire de configuration et de contrôle du WCN7850 s'étend sur plusieurs mégaoctets de registres internes, mais le BAR0 PCIe n'expose qu'une fenêtre de 512 Ko. + - Le pilote implémente le fenêtrage dynamique Qualcomm via le registre `0x310c` (`ATH12K_PCI_WINDOW_REG_ADDRESS`). Pour toute adresse au-delà de 512 Ko, l'offset de fenêtre est programmé à la volée. +- **Cycle de vie du Firmware MHI / BHI** : + 1. Reset global du SoC (`0x3008`). + 2. Lecture de la révision matérielle TCSR (`0x1B00000`). + 3. Allocation des descripteurs DMA 36-bit alignés sur 4 Ko (`ATH12K_DMA_MASK_36BIT_PAGE`). + 4. Initialisation du Boot Host Interface (BHI). + 5. Chargement en mémoire des firmwares `amss.bin`, `m3.bin`, et `board-2.bin`. + 6. Transition de l'environnement d'exécution (Execution Environment) de `PBL` (Primary Boot Loader) vers `AMSS`. + 7. Établissement des anneaux de commande, d'événements et de données MHI (M0 State). +- **Intégration macOS 802.11** : + - Traitement natif des commandes IOCTL `APPLE80211_IOC_*` (SSID, scan passif/actif, BSSID list, RSSI, canal, association). + - Fourniture d'une véritable interface sans fil reconnue par le Centre de Contrôle et `airportd`. + +### 2.2. `QualcommWireless` (`IOService`) +- **Rôle** : Initialisation du contrôleur Bluetooth USB et téléversement du Rampatch & NVM. +- **Classe parente** : `IOService`. +- **Fournisseur (Provider)** : `IOUSBHostDevice` (`0x0489:0xe10d`). +- **Protocole de démarrage** : + 1. Interrogation de la version matérielle (`QCA_GET_TARGET_VERSION`). + 2. Vérification de l'état du microprogramme (`QCA_CHECK_STATUS`). + 3. Téléversement du RAMPATCH binaire (`rampatch_usb_00190200_bin`) via le pipe Bulk OUT (EP2) avec header DFU de 40 octets. + 4. Téléversement de la configuration NVRAM (`nvm_usb_00190200_bin`) avec header DFU de 4 octets. + 5. Envoi d'un `HCI_Reset` (`0x03, 0x0c, 0x00`) via requête de contrôle USB. + 6. Injection des métadonnées `IORegistry` (`USB Product Name`, `kUSBHostPortType=255`, spoofing `idVendor=0x0a12`). + 7. Fermeture propre des pipes et libération de l'accès exclusif afin que le daemon `bluetoothd` prenne la main sans conflit. diff --git a/docs/BLUETOOTH.md b/docs/BLUETOOTH.md new file mode 100644 index 0000000..94bb2cf --- /dev/null +++ b/docs/BLUETOOTH.md @@ -0,0 +1,106 @@ +# Diagnostic & Architecture Bluetooth (Qualcomm WCN7850) + +Ce document décrit en profondeur le fonctionnement du sous-système Bluetooth de la puce **Qualcomm FastConnect 7800 (WCN7850)**, l'analyse détaillée du crash au démarrage de session macOS, et la solution définitive. + +--- + +## 1. Description du Contrôleur Bluetooth + +- **Identifiants matériels** : + - Vendeur : `0x0489` (Foxconn / Hon Hai) + - Produit : `0xe10d` + - Nom du chipset : Qualcomm WCN7850 Bluetooth 5.4 HCI + - Bus : USB 2.0 (Interface 0 : Contrôle/Bulk HCI, Interface 1 : SCO Audio) +- **Rôle dans macOS** : + - Fournit la couche transport HCI (Host Controller Interface) au daemon système `bluetoothd`. + - Gère les périphériques HID (claviers, souris, Magic Trackpad), les casques audio A2DP/HFP, et les fonctionnalités Continuity / AirDrop si la carte Wi-Fi est associée. + +--- + +## 2. Analyse Post-Mortem du Kernel Panic au Login + +### 2.1. Symptômes observés +- Au démarrage, l'écran de verrouillage macOS s'affiche correctement. +- Dès que le mot de passe utilisateur est validé et que la session commence à charger, l'écran se fige complètement puis la machine redémarre (Kernel Panic). + +### 2.2. Traces du Kernel Panic (`Kernel-2026-10-15-174229.panic`) +```text +panic(cpu 0 caller 0xffffff800ec4b86d): A kext releasing a(n) IOBluetoothL2CAPChannel has corrupted the registry. @OSObject.cpp:224 +Panicked task 0xffffff8b71de3980: 235 threads: pid 0: kernel_task +Backtrace (CPU 0), panicked thread: 0xffffff903e00ab30, Frame : Return Address +0xfffffff2a9823bd0 : 0xffffff800edd07bd mach_kernel : _panic + 0x81 +0xfffffff2a9823cc0 : 0xffffff800ec4b86d mach_kernel : __ZNK8OSObject13taggedReleaseEPKvi + 0x8d +0xfffffff2a9823cd0 : 0xffffff8010694464 com.apple.iokit.IOBluetoothFamily : __ZN17IOBluetoothDevice13removeChannelEP23IOBluetoothL2CAPChannel + 0xae +0xfffffff2a9823d70 : 0xffffff8010697629 com.apple.iokit.IOBluetoothFamily : __ZN23IOBluetoothL2CAPChannel6stopWLEv + 0x65 +0xfffffff2a9823df0 : 0xffffff8010697583 com.apple.iokit.IOBluetoothFamily : __ZN23IOBluetoothL2CAPChannel4stopEP9IOService + 0x33 +0xfffffff2a9823e90 : 0xffffff800ecc7dd6 mach_kernel : __ZN9IOService15terminateWorkerEj + 0x8b6 +Kernel Extensions in backtrace: + com.apple.iokit.IOBluetoothFamily(9.0) +``` + +### 2.3. Cause Racine (Root Cause) +1. **L'Intrusion de `IntelBTPatcher.kext`** : + - Le kext tiers `IntelBTPatcher.kext` (conçu spécifiquement pour les puces Intel AX200/AX210) était resté activé (`Enabled: true`) dans le fichier `config.plist` d'OpenCore. + - `IntelBTPatcher` intercepte et patche globalement les méthodes virtuelles de `IOBluetoothFamily` dans le noyau pour contourner des anomalies de paquets HCI propres à Intel. +2. **Incompatibilité avec Darwin 24 (macOS 15 Sequoia)** : + - Sous macOS 15 Sequoia, Apple a profondément remanié la gestion mémoire d'IOKit, notamment la validation des `taggedRelease` dans `OSObject.cpp:224`. + - `IntelBTPatcher v2.5.0` (compilé pour Monterey/Ventura/Sonoma) n'est pas compatible avec cette sémantique et effectue une libération désynchronisée (double release ou tag invalide) lors de la fermeture d'un canal L2CAP. +3. **Le déclencheur au Login** : + - Dès la validation du mot de passe de session, `loginwindow` démarre `bluetoothd`. + - Les périphériques Apple couplés (notamment la **Magic Mouse 2** `78:CA:39:F4:15:5A` et le **Magic Keyboard** `78:CA:39:4C:A3:9A`) établissent ou réinitialisent leurs canaux L2CAP (`HID ACL`). + - Lors de la libération ou du renouvellement du canal L2CAP (`IOBluetoothDevice::removeChannel`), le hook corrompu d'IntelBTPatcher déclenche immédiatement l'assertion de corruption de registre du noyau (`OSObject::taggedRelease`), provoquant le kernel panic instantané. + +--- + +## 3. Solution et Bonnes Pratiques + +### 3.1. Désactivation définitive d'`IntelBTPatcher` +Pour les cartes **Qualcomm FastConnect 7800**, `IntelBTPatcher` ne doit **JAMAIS** être utilisé : +- Dans `/Volumes/EFI/EFI/OC/config.plist` : + ```xml + <dict> + <key>BundlePath</key> + <string>IntelBTPatcher.kext</string> + <key>Enabled</key> + <false/> + </dict> + ``` +- Suppression physique du bundle `IntelBTPatcher.kext` du dossier `EFI/OC/Kexts/`. + +### 3.2. Rôle de `BlueToolFixup.kext` +- `BlueToolFixup.kext` (de la suite BrcmPatchRAM / Acidanthera) est, quant à lui, **requis et compatible**. +- Il patche dynamiquement `bluetoothd` en espace utilisateur pour accepter les dongles tiers non-Apple et débloquer les commandes de bas niveau (HCI Vendor Commands). +- Arguments de démarrage recommandés dans `boot-args` : + `-btlfxallowanyaddr -btlfxnvramcheck` + +--- + +## 4. Séquence de Chargement du Firmware USB + +Le firmware Bluetooth Qualcomm nécessite deux étages binaires téléversés au démarrage : + +```mermaid +sequenceDiagram + autonumber + participant K as QualcommWireless (Kext) + participant USB as Contrôleur USB WCN7850 + participant D as bluetoothd (macOS) + + K->>USB: QCA_GET_TARGET_VERSION (Requête de contrôle vendeur) + USB-->>K: Versions ROM / Patch / RAM + K->>USB: QCA_CHECK_STATUS (Vérification statut) + USB-->>K: Status 0x00 (RAMPATCH et Syscfg requis) + K->>USB: EP0: Header DFU (40 octets) + K->>USB: EP2 (Bulk OUT): RAMPATCH WCN7850 (paquets de 4096 octets) + K->>USB: EP0: Header DFU (4 octets) + K->>USB: EP2 (Bulk OUT): NVM WCN7850 (paquets de 4096 octets) + K->>USB: HCI Reset (0x03, 0x0C, 0x00) + USB-->>K: HCI Command Complete Event + K->>K: Injection des propriétés IORegistry (spoofing CSR 0x0a12) + K->>K: Libération de l'interface USB (close) + Note over D,USB: bluetoothd prend la main en exclusivité + D->>USB: Établissement transport HCI USB + D->>USB: Connexion Magic Mouse 2 / Clavier (L2CAP) +``` + +Grâce à cette séquence, le contrôleur Bluetooth WCN7850 opère de manière parfaitement stable sous macOS Sequoia sans aucun crash au démarrage de session. diff --git a/docs/BUILD.md b/docs/BUILD.md new file mode 100644 index 0000000..cd32603 --- /dev/null +++ b/docs/BUILD.md @@ -0,0 +1,134 @@ +# Compilation et Déploiement de QualcommWireless + +Ce guide détaille les étapes pour compiler le kext **QualcommWireless** à partir des sources et l'intégrer proprement dans l'EFI OpenCore. + +--- + +## 1. Prérequis Système + +- **Système d'exploitation hôte** : macOS Sonoma (14.x) ou macOS Sequoia (15.x). +- **Environnement de développement** : Xcode 15+ ou 16+ avec les outils en ligne de commande (`xcode-select --install`). +- **SDK macOS** : macOS 15.x SDK (inclus dans Xcode). +- **Architectures cibles** : Binaire universel `x86_64` (Hackintosh Intel/AMD) et `arm64e` (Apple Silicon). + +--- + +## 2. Arborescence du Projet + +```text +QualcommWireless/ +├── .gitignore # Filtres pour conserver un dépôt git propre +├── docs/ # Documentation technique détaillée +│ ├── ARCHITECTURE.md # Vue d'ensemble matérielle & logicielle +│ ├── BLUETOOTH.md # Analyse Bluetooth, diagnostic crash & fix +│ ├── NATIVE_WIFI.md # Pile Wi-Fi native (IO80211Controller) +│ └── BUILD.md # Ce guide de compilation et d'installation +├── firmware/ # Binaires de microprogrammes WCN7850 +│ ├── amss.bin # Microprogramme principal Wi-Fi +│ ├── board-2.bin # Données de calibration radio RF +│ └── m3.bin # Microprogramme d'économie d'énergie M3 +├── QualcommWireless/ # Code source du pilote C++ / IOKit +│ ├── Info.plist # Descripteur et personnalités IOKit +│ ├── Firmware_WCN7850.h # Header des microprogrammes BT intégrés +│ ├── Firmware_WCN7850_Wifi.h # Déclarations des microprogrammes Wi-Fi +│ ├── QualcommWifi.hpp/.cpp # Implémentation du pilote Wi-Fi natif +│ ├── QualcommWireless.hpp/.cpp # Implémentation de la partie Bluetooth USB +│ └── include/ # Headers internes IOKit & 802.11 +└── QualcommWireless.xcodeproj # Projet Xcode configuré pour build KEXT +``` + +--- + +## 3. Compilation + +### 3.1. En Ligne de Commande (Recommandé) +Depuis la racine du projet : + +```bash +xcodebuild -project QualcommWireless.xcodeproj -configuration Release +``` + +Le bundle kext final est généré dans : +`build/Release/QualcommWireless.kext` + +### 3.2. Vérification du Binaire +Pour s'assurer que le kext est bien un binaire universel prêt pour le chargement noyau : + +```bash +file build/Release/QualcommWireless.kext/Contents/MacOS/QualcommWireless +``` + +Sortie attendue : +```text +Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit kext bundle x86_64] [arm64e] +``` + +--- + +## 4. Déploiement dans OpenCore + +### 4.1. Copie du Kext dans l'EFI +Montez votre partition EFI (ex. `/Volumes/EFI`), puis copiez le kext compilé : + +```bash +cp -R build/Release/QualcommWireless.kext /Volumes/EFI/EFI/OC/Kexts/ +``` + +### 4.2. Configuration dans `config.plist` + +Dans la section `Kernel -> Add` de votre `config.plist` : + +```xml +<dict> + <key>Arch</key> + <string>Any</string> + <key>BundlePath</key> + <string>QualcommWireless.kext</string> + <key>Comment</key> + <string>Qualcomm FastConnect 7800 Wi-Fi & Bluetooth</string> + <key>Enabled</key> + <true/> + <key>ExecutablePath</key> + <string>Contents/MacOS/QualcommWireless</string> + <key>MaxKernel</key> + <string></string> + <key>MinKernel</key> + <string></string> + <key>PlistPath</key> + <string>Contents/Info.plist</string> +</dict> +``` + +> [!CAUTION] +> **RÈGLE CRITIQUE POUR ÉVITER LES CRASHS :** +> - **DÉSACTIVEZ ET SUPPRIMEZ `IntelBTPatcher.kext`**. Il est conçu uniquement pour les puces Intel et provoque un Kernel Panic immédiat à la connexion des périphériques Bluetooth sous macOS 15 Sequoia (`IOBluetoothL2CAPChannel` taggedRelease registry corruption). +> - **CONSERVEZ `BlueToolFixup.kext`**, qui est indispensable pour activer la gestion des dongles tiers dans `bluetoothd`. + +### 4.3. Arguments de Démarrage (`NVRAM -> boot-args`) +Vérifiez la présence des arguments suivants pour assurer la compatibilité Bluetooth : +```text +-btlfxallowanyaddr -btlfxnvramcheck +``` + +--- + +## 5. Diagnostic et Commandes Utiles + +Pour vérifier l'état du système après un redémarrage : + +- **Vérifier l'état du Bluetooth** : + ```bash + system_profiler SPBluetoothDataType + ``` +- **Vérifier la détection USB du contrôleur** : + ```bash + ioreg -l -r -n "IOUSBHostDevice@00a10000" + ``` +- **Consulter les journaux Bluetooth en temps réel** : + ```bash + /usr/bin/log stream --predicate 'process == "bluetoothd"' + ``` +- **Vérifier les extensions noyau chargées** : + ```bash + kmutil showloaded | grep -iE 'qualcomm|blue' + ``` diff --git a/docs/NATIVE_WIFI.md b/docs/NATIVE_WIFI.md new file mode 100644 index 0000000..3daca4b --- /dev/null +++ b/docs/NATIVE_WIFI.md @@ -0,0 +1,116 @@ +# Pile Wi-Fi Native macOS pour Qualcomm WCN7850 + +Ce document détaille l'implémentation de la pile Wi-Fi **native** (`IO80211Controller`) pour le chipset **Qualcomm FastConnect 7800 (WCN7850)** sous macOS Sequoia (Darwin 24). + +--- + +## 1. Pourquoi le Wi-Fi Natif et non l'Émulation Ethernet ? + +Dans les premières ébauches de pilotes non officiels pour macOS, certains projets choisissaient d'émuler une interface réseau filaire standard (`IOEthernetController`), en masquant les détails Wi-Fi dans un daemon externe (comme `HeliPort`). + +Cependant, cette approche présente des limitations rédhibitoires : +- ❌ Pas d'intégration dans le menu Wi-Fi natif du Centre de Contrôle macOS. +- ❌ Absence de géolocalisation par points d'accès Wi-Fi (CoreLocation). +- ❌ Incompatibilité totale avec les services Apple (AirDrop, AirPlay, Continuité, Universal Control). +- ❌ Impossibilité pour les applications utilisant `CoreWLAN.framework` de découvrir les réseaux, obtenir le RSSI, ou basculer de canal. + +**QualcommWireless fait le choix d'une intégration 100% native** en dérivant directement de `IO80211Controller` (de `com.apple.iokit.IO80211Family`). + +--- + +## 2. Architecture de `QualcommWifi` (`IO80211Controller`) + +```mermaid +graph TD + subgraph AppleStack["Sous-Système Sans Fil Apple"] + CC["Centre de Contrôle macOS"] + CoreWLAN["CoreWLAN.framework"] + AirportD["airportd (Daemon Système)"] + Skywalk["Skywalk Family (Packet Pipeline)"] + IO80211["IO80211Family (IO80211Controller / IO80211Interface)"] + end + + subgraph Driver["QualcommWifi (Driver Kernel)"] + IoctlHandler["Gestionnaire IOCTL Apple80211 (apple80211_ioctl)"] + ScanEngine["Moteur de Scan (Passif / Actif / Multicanal)"] + RingDMA["Gestionnaire DMA & Anneaux MHI (CR / ER / TR)"] + FirmwarePipeline["Pipeline de Démarrage BHI / AMSS"] + Windowing["Module Fenêtrage PCIe BAR0 (0x310c)"] + end + + subgraph Hardware["Qualcomm WCN7850 (PCIe 0x17cb:0x1107)"] + PBL["Primary Boot Loader (PBL)"] + MHIHardware["MHI Engine (Modem Host Interface)"] + WlanFirmware["Firmware AMSS Wi-Fi 7 (ath12k/WCN7850)"] + MacPhy["MAC / Baseband PHY (802.11a/b/g/n/ac/ax/be)"] + end + + CC --> AirportD + CoreWLAN --> AirportD + AirportD -->|apple80211_ioctl| IO80211 + Skywalk --> IO80211 + IO80211 --> IoctlHandler + IoctlHandler --> ScanEngine + ScanEngine --> RingDMA + RingDMA --> Windowing + FirmwarePipeline --> Windowing + Windowing --> PBL + PBL --> MHIHardware + MHIHardware --> WlanFirmware + WlanFirmware --> MacPhy +``` + +--- + +## 3. Communication Matérielle : MHI & Fenêtrage PCIe + +### 3.1. Gestion du Fenêtrage PCIe BAR0 +Le bus PCIe expose un espace MMIO BAR0 de 512 Ko. Or, les composants internes du WCN7850 (SoC, registres MHI, BHI, mémoires partagées) s'étendent sur plusieurs mégaoctets : +- **Registre de sélection de fenêtre** : `0x310c` (`ATH12K_PCI_WINDOW_REG_ADDRESS`). +- **Calcul de la fenêtre** : Pour une adresse matérielle $A \ge 512\text{ Ko}$, le numéro de fenêtre est calculé par : + $$\text{window} = (A \gg 19) \ \& \ 0x3F$$ + $$\text{offset} = 0x80000 \ | \ (A \ \& \ 0x7FFFF)$$ +- Le pilote met à jour dynamiquement `fCurrWindow` avant d'effectuer les écritures/lectures MMIO nécessaires. + +### 3.2. Séquence de Boot MHI (Modem Host Interface) +1. **Reset initial** via `ATH12K_PCI_SOC_GLOBAL_RESET` (`0x3008`). +2. **Boot Host Interface (BHI/BHIe)** : + - Initialisation des vecteurs de transmission (`ATH12K_BHIE_TXVECADDR_LOW` / `_HIGH`). + - Transfert de l'image de firmware principale (`amss.bin`, taille ~6 Mo) et du fichier de calibration carte (`board-2.bin`, ~2.4 Mo). + - Validation de la signature et exécution dans le SoC WCN7850. +3. **Transition d'environnement MHI** : + - Transition de l'état `PBL` (Primary Boot Loader) vers `AMSS` (Advanced Mobile Subscriber Software). + - Configuration des anneaux MHI : + - *Command Ring* (CR) : Envoi des requêtes d'initialisation WMI. + - *Event Ring* (ER) : Réception asynchrone des événements et interruptions MSI-X. + - *Transfer Rings* (TR) : Transmission et réception des paquets réseau 802.11. + +--- + +## 4. Implémentation des IOCTLs Apple80211 + +Pour qu'un pilote soit reconnu par le sous-système Wi-Fi de macOS, il doit répondre aux requêtes de configuration `apple80211_ioctl` émises par `airportd` : + +| Opération IOCTL | Rôle dans le système macOS | +| :--- | :--- | +| `APPLE80211_IOC_SSID` (GET / SET) | Lecture et définition du réseau Wi-Fi cible. | +| `APPLE80211_IOC_SCAN_REQ_MULTIPLE` | Déclenchement d'un scan Wi-Fi (recherche des réseaux environnants pour l'interface graphique). | +| `APPLE80211_IOC_SCAN_RESULT` | Remontée unitaire ou groupée des points d'accès découverts (SSID, BSSID, RSSI, Beacon, Type de sécurité WPA2/WPA3). | +| `APPLE80211_IOC_BSSID_LIST` | Fourniture de la liste des BSSIDs disponibles dans le cache. | +| `APPLE80211_IOC_CHANNEL` (GET / SET) | Lecture et bascule de canal (2.4 GHz, 5 GHz, 6 GHz). | +| `APPLE80211_IOC_CHANNEL_INFO` | Enumération des canaux supportés (canaux 1 à 14, bandes 5 GHz UNII-1 à UNII-4, et canaux 6 GHz UNII-5 à UNII-8 pour le Wi-Fi 6E/7). | +| `APPLE80211_IOC_PHY_MODE` | Déclaration des modes PHY supportés (`APPLE80211_MODE_11BE`, `11AX`, `11AC`, `11N`, `11G`, `11A`, `11B`). | +| `APPLE80211_IOC_STATE` | État de la machine à états de l'interface (`RUN`, `INIT`, `SCAN`, `AUTH`, `ASSOC`). | +| `APPLE80211_IOC_RSSI` | Niveau de signal courant (en dBm, typiquement entre -30 dBm et -95 dBm). | +| `APPLE80211_IOC_RATE` | Débit négocié courant (jusqu'aux débits Wi-Fi 7 EHT MCS 0-13). | +| `APPLE80211_IOC_TXPOWER` | Puissance d'émission radio déclarée. | + +--- + +## 5. Prise en Charge du Wi-Fi 7 (802.11be) + +La puce WCN7850 introduit les caractéristiques Wi-Fi 7 suivantes, intégrées dans la table des capacités du pilote : +- **Canaux 320 MHz ultra-larges** en bande 6 GHz. +- **Modulation 4096-QAM (4K-QAM)** augmentant la densité de données de 20% par rapport au 1024-QAM du Wi-Fi 6. +- **Multi-Link Operation (MLO)** : Capacité matérielle d'agréger ou de basculer dynamiquement entre plusieurs bandes (ex. 5 GHz + 6 GHz) pour une latence ultra-faible. +- **Preamble Puncturing** : Évitement automatique des sous-canaux brouillés pour maximiser la bande passante utilisable. diff --git a/firmware/amss.bin b/firmware/amss.bin new file mode 100644 index 0000000000000000000000000000000000000000..410bc9b9dcbd2bdad40c5e828485cbf0cca44054 GIT binary patch literal 6090816 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 &i=J>q?3L8! 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 )ih%(agH`1zOjHyNjev5G@cgz!vO#FSE56aKT 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�v+(gI% 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�&33)Z#zM?gb}A7`k)Z4O4m1{YgAIm>X~h5a{2 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 sOouwN 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 +|wZ+$C&Q-tYG@rk){lc50ev+UQfnI!1zLmc= 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ΠolWcFaso%o_kY;IOBGhAa`Syi*oXznn{Z&xuJ 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%0D~&qRcHBH~0+vTMxY`^Wrn! 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 W#Rka^ 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 *RW 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%0Dgd#&EiB$a}90c~3(x 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≥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℞nF<;{MSG>7;+Wwp%{4V{~cHR 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 Kb6Ezz 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%0D;!b1(5cOd8+tRpUst5P9lm>hmD_v<*I&)F052 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 ito*d64Pqrt^bF$|L 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�M=p@&#n3FK573nt1u({XHMMjcxR#<?%_3rn6tc07uw=^9!lnMt;Y zZ^@=2j53vD$wqOf5PnP^K1xzvZw4b6mjM~#Br*ChUl4f+I6O5gkwdSCi~VvU42hYe zYj_Fa9Gg64T47WjoyYzx?mHWWuR4&tCYlV(1!oM#@XxXiEU?O)sF}0T^w<grLnnnc zXR%_=Vg48QSw<U$%AIU9m0`3k_643AjVAFE9W;l@@<!^}87fBxN7?>a7FRkF$8{_2 zE61WYSRa^E@f<uSCHj&7Ie!FGj4z6d#f3Itg(7OA4ptR16@{Nhsxfx)v>c@bmU1$k zW+TSTxLoKkE1@tC%v&yw@syxD7*XtZnS}^<nRiKK7oEsuvA}Upi5nE<T`ZA|B~z?& zj1BCOBwB|VOD7^J+zAvOE;K?unV<)8D#a<wvAuDDY_@qMQS9dj$;|?v3Dy!zG$Eyv zl`Cyw=p@qEq#gwWYef<K5ww$&W>aD8vP@89NEurUBGXXbsU-59wX2XrG9JN>VQaF* zi|t^*u!wVxgW-ZeiKhrZun96en^<3VHlAg{Ar)L#skqK?$?)GY<XK_7_$-zOqmLFr z-(pxen0T@y<8~S$YTF4r%ziZyh=dDb8Qj9OmCJ@%;;0TJVR4+(;dC@@#WP`x!OS3h zEmm|I&5i72#}?Nw8vxD_+8EVg3sQ{Kcq)aZj!0!u;v8j}76vAZU1=BP)Pas0wuyz_ z%%suJY|Kc;iQ_A>nGuUvenmetm(DrJ6u6G#Kj(1M9J&{eg=0AIiBxg^<^4%gS-8_l z41LxrA`s0jkC|yI%u9^G3egT4VJGII34E+5UUDQtWe7k^p`{28023Q^P_THjxazqa z>k|_>UX)+41g=B|R%kZqBwVph)GL$nEejl2EU+AbE-Bqu27yGNEr&9}OC_k2L(U>M zaNT1#G1xDJrji&NX%qdQc8dNP-6Wgc%SKElrS{YMBoc>N7iG{=((CL66eOCiI36~W zjJ1bD$5KN5AUo+Bx|8LCmLl9k1VN&neU1NzF@SxEsS!=$f8#76^RxI82`qk`VY^r_ z45NT@$(W6c7DiJbRMGIM1O{soVXEC8A)<j%D3OiSRFw&=R}4cGPGKJKNF}o!Hh9dA z5dFgW!Q{&oA}cuB?ixi-GhGo>F4hxP7}jJ0XElR1!{lZdiF*-3DDJzMO;E{<B(M+J zD-4gUG#u_U5<Z6L!3xK~MujL&NTd+gIE98tp{$6uL;!8QTn6P7iQ<wK_(k5p99?y- zUmP?h1_6Yr7iRRZ)R7D+BqP(Qm59ZeVHdJMB2gIWS<eT`ANv{ei}(aVAcSYp{*<*r zNCuMuKbe3khIW_@g&JoyT24`(5QM^z#&b!dKr|>>Y%eykjg^50D#~wGi{f3l2iV(b zR4KJ4*&K!bV@E~t=do7MG-;D=BTyV^ZS)$-vOs6Ya3Uo=2|C2E`C_aPLWXf1$8ap1 zEXtWQW>(5cXVX|i<VfKrnU#d(80NeDKQx+Sn+XIl7A(=fgak8A2cfV+bb=R!kg$X+ zS=7vPgivUfUFpPFl}IsyF9p7c5MtlQP=Q!<tZL{SOvB=M5`W3EA>&EbZPJdS-%ZqP zG)=sQ?Pm3i1MUXm2vZONi%mt$5+jKjzzrv`L<~iaQ7)ZH<3HfJA!zWcF)5-b6T4?U zvA3eKO)&zYPsq$8x=r+*I1&C{k#B;?><u=#grr3*kfopkg?=$Q35N)wjCd^JB%w5d z^286q1bSrluyP2W73Ci*gzzWPsHEw-m3RgTb`>6$`V=kp(`Kfb|7;F*$E4t$VPrBv zEO15{<24$~S~kWEY7%oNmLfoFCkUJ?HknNq`NyDT=OD6D2+T|(X<-Kv$zeglL&7Y| zIfCMBYgok-i`gc|Cc@py6zjqLvGK<-$%qGHky9U`gox`2u?pGh^fiKQgJZw~CgPgH z6t-l0VX|tuqW9e+fHV=o7~UCD7O#MyMj}qcl5L9Svxyp^7;(=q-&riSjqtKK+psYm z@nf)$5xs<P30tv`5QDhj+6hE<Bati$GKpsrLtEnVx@+CZB8wbi0$GVMg6M>#P|->H zhfd2C<x4z*9>lN0`G`B%Xbx6Jl%ObXg_H*_ID<#16B{BEO%UCqn>kD(+T_S0R~*Nb zCX)feHJ5Ng_Ax`!6&x>c=up(x$N<VkurM$u2^}*XsL39Fi0#F&*Ksz(M3H3cV$R_l zamo`R)?BOyw~b*UWR_&9IRrhJdyIN)<TN&9yqEuhfrzzg;|U?NP_#*u9(GHF=t?SA zoM&`}Npv+w+!1ll*vB!Ok!gkX&L9%da-uRp6=f%?PSiLd12cjGE$S&whfG{=+-@0d z7U5ZDD289d5e}hk!ky9|Nt3{-O$S+_CSrw{1x7CiDaCpS$-qL|Mik&4qf%ua;e{p` z8hmDA_QdUx1Ncs<2>uR{mk9Nw2_hl=5KZjOWP)wPvWTF0IJ1(ZOCZ;AT?<w?Uu8^2 z5(y%eCcXy|9gH=Wv+ab5yby>ti+U56pN%dn9Q}%qgd>jMo#>Hc*#DTFQLM!<9u}@Q zXI#h~saT?pMY+Lfuws$QDcZmk#bJqY@`pyid1Aacm_zJhtK!CTgKWT7fJF{^@Hg4# zVH+Wn%i)qB-=V~1W=9j1VF7bog03Q-#aA{7V<1)WkuZet-LP(=xZ@5{tgwk;K@f^i zPlk{=f|no>qeA0&bc8c>YM4ZXB35%b91G?d?+wQ@i>4#sfp}A3oOlX$2%V0jnB*3z z3rMdVjYO~*2}i*P>y8sAd@jso!sa$&6j_gJVq=2$tUv8(o*e{?&gqEI(i}cWVg1D; zENWW9>L3(G<QKao>|||RA8q}j|AwbRfG<W2MB$$pB8lw)^A1h}Q&U`DEK2O2td0(| zECH+&2L~Igg>aq4QX)2B<v5GQFJe{o#2eC43>5f6s3qAmHfxdK3lprRO^iBCfCE8C z%tX51NrdgR9YGopk8zx^S=_%C1_ClK$@CJU$RKvGgRr*>{f#h9Ci@|YHGuzxWX3m% zvsf~AR3~Nyx+umbUA5$XVy%bcoM~`qNOUrR6Bq4Szv(o-9AO<CaVLYy%2_t95eo<B zf`d+EE%BaI%3*`W320#N6MaO_qIHSo7x~7vknKpYIc?feOj-0s7B3p<oF>SGg~)0^ zXt9bBd}u%pqcD>22{>Otn-=&+JaVv;v<Y@$VAvRhNk-N#+WDNopjMD-1pWz_VRBL{ zC*3R>2WzRgE(okq5;s4oGgS5{qKA#{;F=M~#UjJam79Zcg0{C~xP%ynm=5BTEnnaV zFI^{I2+>R!p_3$9#=b)n60fsk#1Gj@*sjPb&Qe+ZnC-}JqQ}I~(^gL$CM;JPr!~jc zC2}f>$)4!3lM%A)Sb_r_v_+D5g*uieV2Lh3!*M=LcnR%_tChe`#xTLl2_rW#PUOpC zHNy=N8e-l!IgymkpEw>MLP-G@TcJNl2>9aAmNQZ?q7q*liH=i*ERGcQA3i@CA&2>l zugU&Gr?Cu@I!WgkGi=6)!6QovX`v*O_yB|jHPVWdawu6`uNd>P$>A!2e8o7!;6`A< zFQFxz3hXNkzm)U<JBO8w?sBkFksBN+MT`6pmO)i<EXP?Kjy-2O9Mc!0O33Rp-kK$0 zqtGmCpW`{$blAx7A1m$)Yys@dBq2;prwp+cRs%vF-Oe(~_QdCib0e6LcLd;cnuRJs zFc34thsVNV01zBVCj9VZf;SL|b~7}X=~&HjqzmJXFGI(OyyDED{xD5&I5~hS<g+gD z4hSox@i<Kc4dNw=&W#er!ym*3!X8D@7wGYSu@pFZ$MVEhLNZ`RV=EU<P%#fMRtOMq zXuu#i(!sc*=oP6Hwjc*z1Z$A*NNa*78BPUI8=RtgEfDnNl?*I>G#=r<7<MoxC>C)C z77o5XRv!*VO40&DiseXvmp2T;HnC%(#6`a&!QSEs5X%qpB%+LW1ROMFp&yJqTY#ZR z^2u>Lt}m7WqKS81INmR=AKnBYh=THSY|dWroM<T%WyukB$#9s!UPX;z;Bk^k2ujg$ zmT{KzUBapyB^BDk4T_<<QNrwIx@aQ=an#v6GP?+UvzXaqymf;KgiOW1jU)ZAc~Mj* zhGH&*Z;RQ9vQd0T4lAk&vkE&49Z_h9vtd`!p;LMFf^$xegV{O}%nwc<QYcs|M~+~< zVU8h*w8c0rU<xr3tRlYzkXc3wZD#a>4D*c&XG#j~5cbZpGYOh-`bb<^XEzo`IER(U z4!gMCO+3&P?+qXV>06TMH(^T)d5Bs;OcmE5OM)%Mu0%mmqtq}9AMuT>k_f_7#g@bx zBJhDhT%1RS20_C45-~S6C}B6$x`SY0i_1MI@QcioY{boo5)jXD+Jwx-p(*5Z^1-1F zQA@ouL2QRX$Ae^q(2oQpiv8gnn*qd&=S2?O9S%r1Fu;V-+a<(hih3Nq#Vb8HV8~-U zNRC7C%y3ZfpKu!Ro^<Ytsf^W|LhN8TAc_#lG7C8WDXwEQ3j!Nr!hj402T>_vl;JcB zDVjk!6!_PH4(<yU0GcjG3z0Zou#5S;wLz2~(L_-+KO@GQOKLtFqYNG;Q3=E^E1SSx zG7Nt>=jZ_ry)dhzSxhbbCe9lfHS|33Mpj}5*()JO(6hit77Hk%V{2xN7<XK@l+77# z4r!rScY#jfZX)VLTqV?PX*EQG`suJnF{z1fr4UH?6TG#7%tC@wXAEC5irg!%Qx*im zpBN3%9fVbq2soi;Y)wwD^i~MR9@=SG>IhN%8a5B!UWU%%YhWN0_;Cm?W5eK%>f9B9 zqLl<sh5Qtg$^JpV5alMCk;Bi6V0{vXPV?eU(T+x1ARrmoG%hZOo4lYzR13==pD%?g zSE!FThK;X)BZ4!IOpp*EAdfXl8-y6JsR>4=F#QS8ppjYga)A^O;3TT&+>sYk@F;O~ zO^a=fhnsQVrjvunyDmNP95grXGz`ac368cHTEd;gwK!H}q<h}CL%y<vm~%q*#C|v> z<g8V`oL+jtqut}B(+qEWp4QT_KALRl>fpNuy#C+r6EGKg0ko@SC2wP{@62|zw{;qA zxm;_T<*d$m-w^0|?BweN{+AIb#9PH{vABA&H?(co-)t+VZ#!79)ki(Ny{flv3tv^} zgUbIRLoxTlODl~Fp1EjHWqA)*oJaF530^&JTi>M@gnPeMtS>;guTtxq5*Dwhc6H`@ zefuKU!RYLnw34yn?Oy+_-;V6c)t&Ujt;BsZ8snDNXxBPzYg&r01pD74;e}h5#AT*W z61y$Cu?5w-Mz2t>cA3g}?-2LoSnchtXZRg)n|8B0d3SbITPyGKGH{ymePns>`@)HJ zhS5lip?0_pG5KBIyTrW{3olCdPV0G-xL0Wi-B+c15qfV}doLzyPX&OTd>!#IET16v z%bNHRt<${seDA!Fzt@5$C?)-+cfI?vUiaJ@fnjIA<H6hq+~+#g;$4AIuluTA_jUYG zCL{}<y&@0@^}4SLxbNC-R{D02AD3opulvh;-p8$?E%BzSinfaPv{k(C)m9a471L>} zc)z`;{;I8Bf89E1t3cCDTa_f<3UA%CRlKLI;(f2Sx@oJJ?)S?r+pDc^+A7lc{Sr;E zsb{Q$6MEeb?{&`~c`S@!a00*XEQYy){ISL2{Z6l6Zu<2-Z3VCDx!+8`3iWKJU&VX+ zRlM)jug&zUm`=Zn_uG5MaP!t)_w=hsGh27wwRv){d;O7_LOOqVvPeI<r!SjF^}65H ztIivH_2ufG`=oI&{~W;k9W+(1wXV7~KAKmpWxXq|YuXV<hU*&Y8)qDS%&|?gW**nN zW^G&7>FYPNuj}aCc;*>r&8}KpIf|dL-ccQxes5I;zjEhYyWI5tMpIQq=>TJAbwzxT zv6K73?&lEqv&#Lfc0Y%@pTmqDRTaS+s;H-~k;c8%g-O%%sP{b|q-Xb6>^%Bf_Zb$> z4VE@l0oB2QO+$mjn}!8zn}!D`G>r&OZK?^zn??p_G>r;2?HnDPyFYYI(Cs`ZxJdkm z{Qjxmm8FLov#S?}Doe*1vxhF8U0FKb*fnf%cV+1W_%{OLUgI#ZbfWuwfA!+Zs?tfu zuBru<{Yy6?V5smguR^%qRdwRP%EG?lxuGgh-cTLrPu0VNrH8BP3BvA0KCD;L#j1OU z8Y7Ir;?iL0WR)4bvpP83d!|g4SJr@@&EH57=Avo}<4g)yuXd<skjp1?St`CuOFv?4 zT3lLES`Hn{kKai*DoX?X%TBB!ZE<a|w8E%Zyr6{S3xlgREv^h!YU#L_`d?4~8-@nT z8UKN^hc6seRyupc!gyKfy*0-18h3S$`KhWOW{jvGZj2;1R93pHX5oyoQr0BD`hMQx zN`C)c6?)J7PP=}SJy2O5=wGpzDk^EY&dt~MD9~>Txcz9T4wlvrHTumOwy=t}hcBE; z+arv6(KAp%2CtI*K@G#;VYo5k{t*jn%lrwTzvt2+epY_dLPo$F&wfU5u^BAwXPmdV zRVcvlg%*$<@>pPmj7s;OzpYqSS~9966grW43F(P+{x2?dr+7kOQeZNVfndNZTu5I$ zbztd02n)|%Z7NqK&YD7t`BhJ9^70o?E-f9-4_k&RG(cWW-0|Dvg$K$6DuSccbm8K8 zj1dy=v|YhpldUK}*a!?X2KzLWSI-X-jS+M|TqfzOD<?{WmBE3*s^D<Z2aP~!pgd3+ z=pPsu7#xy~(#f~5I<u`geb1(K^%}li<b9b4YX0U@L-_E~!HP+f=Zn<IbruaV_j^(W zJBJ`3=1+_J1tVE~{<CKix#q&ZP;_*5uI_DW{0qUF)qH1EUo7pE@v+xRREL{U{IcwZ zjO8YHHj`)0tl~#r*I1pWb?*5Uq~1oSZ|`BNxTW1JzPV(tYFX3fcwbyons4HD<XSqt z+{_vJT5XX=->+KP+LmFcs8L_#(s#@XgQTCIbt$l?_K~e}?$_qLj`)S#)V2*6x1C)W zls%p7<g0TXZL3yi^tCX)frd5Olj(mgY%Oy`(2(zndBweNhq+aXp<b=&QR#*6EN3^u zjN7ccG<s_8O|(}6_168$SI7GHF1|OYuj2I--!s>rK6k~rvV(QHr+!1Ex!-A$ogo!c z_zhKk--*9U;QqLhzW-DOR0BhSVF0@gY0KZ@14aU)fYE^dwyFM(pT0xIkMW>iy}$Py z0v`&D1I7arfQi5)K%###Adx-=_y{l+kY+vtI1&g03IZsgte}}3OgV=NAm~s=j;ox? z>A+FI4B%)$f6ne$pbn@98h}Qi3784Y0*(V_1IGh%fR6%mfqB4u-~?a+a3Zh}Xa*Jm zCjln|i-9G;DZs~orNA;^Iq-3y1y})CKnAb@2gm|BU?s2$SPh&CU|zd_$8-&NEzkzE z1M7eepcCi<)&r*l8-R_#8NivqS-{!AIlw1?PXgV*Cg5D)JYX|$K5zl>Dd0ljBH+`& z#lR)NXMjtA%Ye&)D}XJ)mB3ZNXMxWFp9ii6z5sj?_!97C;48pafv*8ufop(kf$M<l zfv*GK0B!(o1ilG;3%Cim8Mp=bHt=7-t-x)-?Z9_{ZNMGCcY*H#cLLuBegNDB+zs3V z{1EsNupPJ;*a7?)*a_SR+z<Q&*aiF)_!;nX-~r%4;341_z{9{Jz@xw~fyaQyfhT}p z0Z#(I27UuP1w0Kr1N;{F9k3gC7I+SL9(V!xJ@6v%-@r@2%fKIiKLW1+e**pt`~`Rw zcnx?Rcmwz=@HgP^z(0UDfwzFSfqw$;0Ph0t0eJvzDBA^Ng8dK3uqXq{feN4!=m+!% z1^@#A{r%v<fPO0)Q{Jcsh64IK?6?ue2ta>}Q-4Pu^V=8=90ZI3YJsu9!N4Ja)aRkV zIAA=0OJYm}CIN>5nDWNqfc}Q>M}VooG~fu}NFWSEfG7|H;(-1}Y7$5R`aAb&Kz~Q} zC}0L~G;j=XEZ`5p|8Me7THe*2lJA{1U(iKt%Rb0Dg>P%SN}k`7@M8{Lmc7cA>qX_? zqfT56)4|E4wXv5e;8n0%frzfc*LEX4RiMOr=R|vQGOkIm_fr3o=auv9fDQbzxqjum zr>gn&^IMvlo2AjaI@-M7ws86KzccQA2fG+)ald@6v2ke>i)kmu#1MJ$nx1;?)-2{! zADOE=3-O)RYtiDZtqf|hQjL{2guQ;1L+UuYrWLiFvH5ZKjy6xnceLcz_LQ_cR(BE5 zX)SyS+|I3ZGu8Lrp%*np9L5dCc=41%N-+{+JW|5mDn-u#`g`RM0ySmm0^kl{U^#jK z_$d&sKz;&MmB?dYU_WFnFsVOs46p}~HxRi6Tr>zBG?+3&sIQ7Ps@b<g*>}UxdBf2Y zBan+V?AuZ3fzj;$G05jyblbt~*ATm69P(fSbx%SEO@^;2)He;e5JqlAkyi=!dKz6b z1G!L#ylX_h9mn3Di%eet&nKaSK89RuLC0j#EvHdt9ddpn{CyIA_$l<?WynF4#4}sb zdEY`OA-uysLI?c}K!8q1Al`<6`zyj~2m+@Hp;5x7|3_WGc&9mF9J(rCY&<7m47-Y$ z%*_GAx{u$A-yJZ%^G?9{)j>hyzUe{Z^Za4=Q@ex4vTp>9OCJgv<K7AyM@=d*0w<Rk zU%IfwNc^zGc<1jW#-aQn?#DYyjRpJ>`k%jBYHZ>UKi~0%GUJ<nE;GJ9yWIHu4duq4 z2UZx*Zm2M(yj)=%ZdDpHcUKxO=lU5J{;i+!g-iMyUz<9>IOK@|#!VLuG=6j3AY*>@ zVB<S44mR%EHN-gl&MM<4cT^jv?HFqO^S8r{l><i@w|=z7c>XIRjYCUE8(;Y3LB?mQ zYmJ3>jWrg2;t*rNvO|qwCyzI3)=o5@{`z6YarwiIlg^%Mj638=<Bu;#j3K{^BY#cf zvkQ+hI-WSj*m_xmF=x{(<0s#qV_ZAt1mkNzZ#M4OvBVf#_HkqG=WXNNb5<MCAGYzk z$EO>&tT@NG;GxY%)h(B}>()Xnbgr^GvMmaVwp%T0)?@H;v8Ha!Z}p`ly6z`i0#&=V z1V#Z$+y$=u>6XAiAjtE>VCQFB0;>R)wK3}FTLO;(PXa7!qw2vef!)9h0886wdWiI2 zPzS*BHikdECGcfnE5I^09(ZI+p!Lx$fp&o9ZhZNdTLM!b+Y$%^EPG?Y<J1p42~7TC zz<8VWquAq$HP~Z|7Wtvj;$G`X>Ir({<du|YS9WxD$zng#`%R4&qPjB6`2mUyE)S7l zKHRY?(zzk!zA|0eLQL7S^gH48U#?(TMZW=qtA>pjbx`fWhmN0k*p#V9@Vzf{`q9VM zH_n><FZBPX63Y4w9yY4>(1}xyh?z&%&ocTAtDSg+S#J!RXu5{^2k<>-?g=M0pS0v- z%Uk%~@v76-w5{tpedC$ueDd7QpStMc&s@Ic!|FyLSk`~Q;Nc@ijXn6#Nrz22l4GUm zM>jOi`smyf7M--@<1Lw$t4?cQ*LB93=bX3sQ<r?^a-+20pkX6xLlX}_B5Ka4pE+lK z^Wx=J?$ox<jc1>G!Nr#u?;D3XCp0fvp2?lo*0u4Rb3b+Q<%MyX)4V*_w(;DHH9m8e zx1Ag8H>{e_>##~bYTdi)F~K9u<nh6Y<}^O)-MeI6uzC5?wZS>d7xIyF@0MnR8_(^& zGT3(R20ku!@47#2Oq|oEF;l(At6n~8bvJPgA4g2!L-iV}*D#ZHfnk{8<W}<s=*<ay z%t`XG{CGavmhy4#+AG<*-NfH<Yec7F6OJb>X#|$5>>Sa}5#1c<T*rs@p<nCLuN6HX zbCP^4KYlGGml_BnN={T;6V=v4)iF_ZOjI2zKhfoDj#z3tUOcSz()H(M`VAd3F;zEb zS=*+o5G18WzoA-cbKG(?iY#H9y5wY*1<HdJC0!f%&7Agv26lfJN9wwrA1c`+XJb1* znAJO5)gVl|ORs?k@2YLPG7thL07`rk{4}r|kX*aD{mQ^L;BG){RCZh$7zo4x$+hjB zR|ckbT^R@il54Mm{|dYVNUqI2{mQ@s;A%i}Exhr{z!G2?z@woL)hk*=u6yOt+qw#W zz6I<i3F|Mq<c}@pyOeG+mAKgbQznJ{cc51KJNzr)ck&AxTTWWgRKI9u%iI%=3r!Ch z6P;=ER-MTo_n9`oxp~?#{Fn<ev^lhRZfIJ_Uf+R9$}haE5AoY$tDTMR-D(eYb%rKq z*G>;nqBXnHvd_@%;i3L+@rL&mH;}P*XyWS7(uu35Ph7n`G&j4_e_S3SDnZ3lLlaxq zht_mXU8`7#+v?uyn$<inG}8@pIO0d#F6d~>g~A&rZVYwUZj?wFYpji-oVB`jJ(@tx z6XT*!Zu{c6@YsKkKYPTG5$DriximDTOpO;d><jA;SC+dG6F<D@7SqW0!+ol(<g}-< z#Hgqs07?*;zd!_3@K-u3dG5!3e_#O51Hps9gMlGNSy>gh8axyjW+<9jUOs~R8ek;P zql_}Fhmw+m;BO323ycMbSQ;VfIu!bGz<B5<@H~<GNx)$|PX-RBjw!%LsADS6)3`qZ z;IDO*gb8U!z)^4v949>iB%w=z>+l?B0}Fs9zzSd$&<<<_x`7LU%Ymzbt-y`ItpI=5 zDX<;b1w0Hq3G4=50$v5)1o%(jG!Uo)MgbvUGH|%NOaG_iO8D6*EeSCe8iz1ox_v4y zpUwROU<uDFjFMnGW4w;>>;O7}ZpPyMydOk_YhVB3tc0HYxO=~6iYUAkFV~~qGi6Vj zLM=TsaX0>@dV1HPn)Xcb>M79l)YFsVQK(cQ&8ww%%APbmwG?Q2xar-~Q^g*a>QkA* za}S5TQ}(1#9LyV+0yjM=1#Y~Q-rN*YdMJDjyL)q}ntNInhp%_*v-h<>DKBj5T|)OS zocI2e|Ha<7$3<2A{hz~G<s#~Gzlw{ZqM|Mr6%BP47KG%o!s4aW<u2p`E1+Vbu9u3; z6pPAI6V1v>6U$1=42_IZ6V1xX3yPX0Dw-)3%I`gM&MwRCKtA8+_x$rcyxx4~@}AFp zX3m_;%+AbdE<-GGC5N##jQ-}@Fb^T6YW9;<#Ap2D^%z5prR6#1^<fM#GMdlM3TjKU zJ<WcjJuO3m=y;(i5q##hkZ?YvIVTcgZVS&bKM#CJ%QHbznU|Yz9z$5mgOsaf7&)gc z)A4?D?R<ziD+p;?T0}<IS{@h4L%YRskvzg%9986D-{SazyiT+@9xSAaJd;`+4;Hc= zBL*#x2MZ~|XhX~6|2AYh=^nN?{`W#!WMlFeuY-;xxgwh5j8}wt2!G9x5I&ZVYra$P zF(gAH$Ed|T#CYYI>mYpN^~`JKSw>E?p5~BdJ;pFzi*P3uY#`PcLz=ZThZwa8AqMm7 z5Z7vp`>}cb7<tB$8vR5MUjp+G64vZ*enJ>6ZVqX-hukU5EpG3bK`b=aYb=HNy`t?C zqASk>l6y<d|EW6;xlNIq4!Jo=0CM9X7l%E7AwSxs9}TGh9tLIrq{B%bVx<6sm#`)a z43bDB_^@;L?v|EKcwx0}va#vW!`8NE&!%3zdiRz}?d+QD?HwE(9i5!;=|mToCRbNC zw<dRY4-ZezK7E?Jy!!Sfy6E?`$p<%^$mffj$QL-9@FmV}-ElPGh1k*xN0T)U8yrnN za5UNCXzGch7mg<Km2#qq9(Whz4_GK1L@zyvZh8>?^nmrkL2{ypQBkv`78=#^(x|#w zQtOQw@v>Qih^wXE4tyf%A1LZSb^c^BZ||ml{rdO!@fk3nY2d&?gPMGO2M=x<GGypb zKfhtanuZS_F#?lx{hP3igDmqJ*@R_?qnogNX-w1Du@5~I5;AUF)A;cdXwUUO(-NdO zn(T1kBlPx74mg?|aWpyMaK_Q(g2NR@lN%0q98DfLnmlnd^}*qVqp2?rQ`MTz%7eBk z(uC<jnlU|au?Pog(DWdUnjWNK(*qZhaF8ZW50gzM$Ah*`<F(K%>18Ke7=kcf9nF$n zlES4T2$Lyd4pSY9Ihrpg5m(ELtOK8zDgQ1`%-(+&_wVxk|HHPnAMh}LPsfwXbu+v5 z%nR%`U^`F_>;{gMKEv*T+y_(ul|U761gHj10;hn}Kn;*t{|$Q)vKr~GK-K~Ez-^!b z&>{XL;_6N#95@AcBf|9vXU@LBszx4SC6HAJkA&L_?tsyesmYNG!m!<NZVt9|4owM7 z#zxWl)cpLY3{+L|!eML(><<WR%`<Wa<d2obr$3gCZLo7@%i^)WW}YlR3zOVs5qZf7 z%*FQlGIe~EEDhTkrxv8+i`M!09WgaipO-Zb!%u!P(>$ng<fGOZEmHA}R+{otbMw+c zwqeMmE&A(gUN&ZsBWtE(bMPwyoqfMhmXC?@$!RhSffeND%5=$jv(qswmz{;Zm@(i+ zt-wH5vxm%yLWGu2M>8Ifj}&RTVdK+uT4O>wF6U<o6*S1kVzkbNw7QF^%T;chS@obe zHqgIyebRczTHJYLwtZeYqsqva<Fnnyt)JobZ|My%^9BU9s}6~T=03xHGh3i2W%u+f zW%mIUKqXK`{Og`!k3d!fCxHt1PeIlISAaU89$1C+B|s_Ah`~>y^ESd80M+Be*dq8z zcH|vs1KdQCvSKD86ELP-1M!W9)Pg*Ge}S~Ktw<9vvNaF2E^vtMYH%8AU{9}7mel8I z_(>ie=qK%%?zrAouc@8WCWD4FY<yPgxB+_79+L}Xxp`zLmP{2R?IdTOPB(!m(9PH4 zx9C)C?wvjtKe}g-w>MlP9=uIy&Zs|WDXX_DWq0F;(i%t9w@oP<(xa4(wk>6S5S|1M zvAYy$Xgg?AUTPOkoK~H=FdbvT8r^*4LF)H3(vbW}y*9$#qJBrUuD9m)MADG@m3X3l z16uPiZ4YgZ36QsqK<f!?!=IX(L-w|%a}Ma&KB#Sl&`t6oHkHEN!nXDsCw|`J?b<-> zYMVWYZ+n>-vro>+qPe%dF$s)zN<^xJX?w>rsw5e<ZAZpfzMAmW2w6;^Oqq{mKLs*; z@I!_WT=<1!WjI;*{zrCtetz=o^sxi-ZJ2=I)^%!BM%pD4*rr~L(Pp;+QmHuV`tWV6 z_#w2hF?<_Sjm0&qJVe`=A0z|6c^hj$8qzicJ2azJGwZmv^Y!!cVlc;~ZHZ_zGe+~a zl70^c@#zRXA7Y80fvnIM!sH0-<SxaZ9V3Gq^LiO?rXQUZIDt`MR-lT`j9bDOFe9#* z&WgehDQs_yOZP^TGNvW3kR&ZhO<r+HS|#QcE`gh*U5>FSq$6N0F|OUjlKv25(Hm2R zo9Nh)t}lN-EXKWT8|w5TU=;#)_#u1?>lyYW-0E?qY$1>de-Y#gz<57Yk8gWFBs$kY zUpYXo@k02?J+k9#$aHJ#xaP@ZQt|<dz%~zHV`Jf`+lq6@)uK<voL^K5eGZ+6ZPB4* zb{Brf_ukA-bEst_RVXWDWzSl6m3uAj>$U93UbU<qVW%Nod)KlvfHI%}VTC{uU;tJC z#Q<ZEw2<4u(GRI*k4S6T8d)uS1yT+D8xU6pYz4Lfr|oLla>(7l9$+6Z!y7h02FDy? zk3gP+{|aylZdVf554J(NetwC)g0MQE9*`sN+mH>!54{_JMz~ABmpIn4L5Qz{yR?5T z>*#|rc*1U=%D0yF1xgTB3cq|%EgOxzgOEl#xRzBwUg=%LD&XD*M8iJ~Wm$o8`NSV$ z*Cife6}1)YI$|fv+z7uOoZz9TAMk?0OIZW_TOo@flX8Z#n&?ApWN0ZXLA(_(18!SL zDRGD4xeV?Rpc)`;sS@Ytlxi3o*yefBvKg38GC8sQ(aYAx%Ceh;%sOm&ggB}l(;N#O zS2>nB?slwlEOIJw+Um5&>4;N}(`_d!XHRFjv&wmz^IYdAonLX@;e5dPd*|PrTk3ca zUxZ_h<4cbF9iMV~&*=xJ`%VL$W1XLHe%<--1L|Jpcn~wJ+8$jkU)z-bvyk@6_dn6t zx*W~t<A0*H^R&wx+vn)4=UUIVe!|*d{iO9u>owM;)~{H<X8pSLwl*Wd?Wcdx(3W{V zsFvn*E%lKyG{-%N>lv59u3ux0U+d#1mxb+wVh+5^RF^p}OI%)XdCTQfmt!uqE_Ype zxb}4obe-t>sB5n4a@Ut#-*x@m^*h&JUH@_IjhTc0nIpz!p36p;FI}#=IJu5<O?Q3H z^+VS)uH7D3f9v+y`F-R+Q;rcX|2H+*-t|rHUk_R;`wmk6`||a78|^m9P3xBL_O#o2 zx1DZZxc%sM)vd|R!F`bXL+)|zsqPEhpLO5l{(<{f?!UO-aOXT+JcfEq@JR5O?eT=i z8jsgKKK3~5@xPmI$F=nD+Yxyl-Rq$CI?ktcOh?zlFt<dvMQ(4n9d-NDt&e-Sd$#+F z?w`3|a_{Le(qpE_lO8+Bpnf~Yzth)_f>uEtwYS60e>_mxlU;VXu&$F`H@n_+Rl2Qp zJMZT2zSRA=ySK;O7A0z**UC6}A8~xg@l~haoyIz^aXu$v5r2Qoa<g`S+daxGr{?gM zy2*3><976s`>C7TUbpG)fAK%)3(1V(=2~np%PTWkN8X}^^<wD2r=^f?ym1{EgGh|< z@O`eBm`Kc64a-hTNH0JKT$M6AhAfgBkdK*U1LVQFLK((1;#DflYSQHD$I6Tz`b9{@ zkwb`=$*7O_4^u@XXcH1+VwCaI+k{8Q#ZJ^lL}-KvlAh;B#>H!zBTV7sGl`f*hJiOS zEG5&=)8(hjQs!l3;1g~1J9Wuq*o{uaN*4ynk_+fs1{ob5qhoXt^y8VbsGNeVWL?(d ze3A&v-AX6JRYIL$7(z(d9Kf%3zzna}6=)obn~gXoSEt2Z7#LPDDj@64<oMlBfpu5- z2pf87E3l&JMXX5jZ!>nmj|=Sf!?-}JZjXlSBT<k|$0kYjUI9mP7VpsKFpgDU!PY&o zfxa)_MtBg$h5TEMZz4TO#;h8)nUx_;8bIF18!K0`#iiBkw(SSlZGUZGw*%z>i8Dec za0~z5!0O?4{no%1!EFFm0L8#6poI9>SF@#%>wp4qRsU>YBY|k37;$7grW7^=v>FE_ z<wM)V+&v5(gwc=rg{Ht>!mkA1pY-MVaMPGA<4*=@_&{U%8o;eWzDEF(mKna8B|~sL zi&r0$o~_hj&kNyX7wA*9q}7uZkzvU?4PDeoD@%qodVR454eJ%o^ubyn;7P1sIEQO^ z9Pk>hLQINd=HLzDN4)7o0DE1)1Kz^*+aK71H*_E1ZM;+Z1D|4TL?mzuKaM^IG-1ue zOTY-=Fop@T02^RCeu10}G+=#2888WGzzm4DfT@5r@EO)%<O4&2i<o8c8t^FK3Y@~o z>np&cKwsb@-tpc6@_>hcZa_8WsBQ%20Am3g;1|p%*#Q`UL|_O&1~h)ez(zUn43G+p z1KfZ=G3fCfunQ;wasf5q57+~LVhr>Yun#B$o&@FqlYwBMFMtV)Og%;?egX~xJAjvg zWk3$_2oM1T0@J23ImzVYK(}5t4C|+p=qCxuK;>9<%z$||OoV1wyqy0ZONGB6h)1oN zB#2lhAsr)~>9S}|gbW|9#OOSh?nG#`)22-dpH3X{@=1|VD&kVdOrk1zN31d?oKYs? zOSTAS)X7<S3$kz{B0AE^T;P1%gouf#PC6chYGS~Y#o_~sBpk({<Ao?T{jFRWu`!O^ z(D}85M-KWiUen?&eiatxu+r|XwmC92I}Pi9$%lJ$)A6-P-1W)IfV6qpdM%>(7_#n& zEWSuh#p;V(tenEA9llSDuYL-j>rIG|CC@9!mF1=D$+sb?I=Xtvl%bw}5i}pmrkVKM z<ZPunfehJe;}a61rlw=e9$&^Z3l2+cComMt9{g#F2>eQtn>Qs{H!t14MY`4$nu$1t zY6<9Ei#Ua93G7^pIE88n>RgLBg=!huxt6w+fX-{zoYFz<no~NcU2_W6(zbTZDIL_V zIfZIzTf63z4r<q&LbbH5U2{qYwQEkHTH4lbVCS`KPN7=bwq0{d2eoTXp<3G3t~sTH z+BK(8Ep2PpoYFz<np3Ejwzcc84NL6giZ&8DsFPM2+7`E&&_R6!bY?>{p#vM52_2l3 zW<m!x1a@XaGob?;nh71)&`dD1AvP>BPOHI=ZL_h%7`Y4609CrKAi3Eafv03bYI2S` zJufRatvOtsoJZb<+lx}t&pd}kYE=u;bvg|;qcBf~g=_QE+mDRQ%}#GgS1w3iXbPFC z!N=HP3hibPdr3ef9u7MEoK7An8q+Qz#@K+MiD4jQwI4fDEOJywk)ay0CmAfkbIj~% zB?O0S)NKPb<ahIen5-OP2dxZ&-CWs1fT;+y)Zwuz2EYAdA!Jqo9@4@O++^2~dAb7f ztj=D@Ob*jzq$d~PwL~2q7Bewkn-If9PSwW5slv7K;gb`?6EsXhxJFC9W}l$J(i&5& zDlQf;CGnwA8WP8^yD>#hRYqwTWRyJ{Kh)`RwUEP8nS?N9tPB}IF_WN)Q!}9n31N{+ zye-AWheu6})lyGbWO&#ltujm#H6=<j9pnU!RudHyt_`22j*1UwR8zyFqg#Zi<KsfZ zTZBZ%;iK=`w&77K@+Ec{r)`m?COkeSDpsk9ik(Pbg7B_)$~TUsFC=NH*g$4>0e$x| zTQ$zVt>Co=-@4Xf?>?QjARFJ0Msvb`d*r<+4Z9IylNBUx8O|@yrfX8MFy8E?XP%zs zP5$8*IPw~N20!Gv;zxaS0qAk2J5v*l7f`boB|6nZiy089_?gs9nXm#~*b{}U7{{`4 z@}+Freq;#?b5dpGWs<pvmqCKo2l){LX3%#>yt?xTR;)?7b+@D)ZoKnLhsF^adj9;L z66m(jJy0^ypCCs7K!&!ZgRp1DSQ5e?SMWkwGn@~fl!i%cLby_`jgM2tXr@L+X~LtU zaNg12RsKv%Ki1@v`pv^7OkXd_wnJL7B_v<p&}D1y>LZU#(%~(?AKCBW3~a6M$Ix|c z?5cb9Oi6TN0u!FdJglZUv((CB2OnQQxnRn_78Zhzpx_Y2zfLS9kO(@`GIjcb!Xm?p z;#DR8R#!Jc$BVCQ-2BGBO)T(j>FzeOt%cKVWo?5B{FjF_cDZ30)T!UUOlU@T5p)D$ zJ^q6pu7Zv<T|v=`2UOxN=y-AC11dl=59q*_X%4;*+``B{L%fb)#e>_?N6?X}FEkWC zpqjpdj#oB6paLY5K?lp2+Smgr@}_pow#F^#f!Zj^)PUWNB&40<+9%hp`L#!`p$9VT z0TR)B8o%*Ja-LqBBTToO&D=Mbdc#75uzM`&XbXMtRuS|OL$@knnOS_N9UF|LB^M+M zTZhn{X0y|buLNe#4O3oZwLjgzBqcRDAANXZr@m$XoU-sXk)_wA^YmsWUzpTftY}W9 z<7>=<Y_eG!{KgXSd!Q6xk6P?R(mImtM2leu8d<SzKU;%MKLGxzoHZLG4MsJ*dein` z<mu2}JQU(_iE|T9&yRvJU<_;)wh$t4{LS$<5{w!nn+lnoj$G_KmIgyIjm04Q`^cyY z{-2$U?YRd|viyJ?7NsL!VYwRWZt;(Wk39Rxb2SYh<1*xs@Pdxb5GT!CKN}T=)!(U@ z=cL8_r_^+^HaukkA6rObjZgP{x?vqDHVwvm7sffTb214g%1iwC=kzr7E38*Fu|mj$ z)HykYxv3bWH=f}_T~0DdOZUl1pO3k!rglP8;+Y=*3hN>0A#Tt1bW$}b3-!q`pXeqB z-m92#uhGp*%ML+epsE_S@#Vz;Hj2c*&|v>LoLy}`UQ@_ZohC*(4s4-o&4Ukaq4VA% z;U{%j2uVuCPZlF1@?^cdJ{j*jGVgJ+*u>~)VT_)yJQ547cq4620l$`pqq?C%D01uM z$OMCINngQsdUW&Z7SK)IEv;LXO@K|BO%)%?$RNv5HoU}<y*sLQGK>P_y5v2G%zZN( z2MjkKzay!MV&i)kX&(eCy!M7^hA}#_X%&vS)`Wq*Xsr1b^n^9vf(+KAf-&Z4O-2B* zpN=(oi^O=cHH^klYR$jNy<$z?*f4%;%|F*)x5j`jj%{R+7sqaE4F2NaZygJC**Gma z^t<x3*atQ%gRev~?nl~AeinXuNST*MZW6*}PFkWdIwu)ZIfd}t1+sY<29y<`f%;{o zjU78cSLmlt#?IcD*r(%vFOWoUX6v`CXB&Y%dsni|>+4wwaPeXlYXxZw+};ZL#(H)d zPy<{9t{}b+V1BJ)ufSgi+y)u}=FRnN@TV(T1z<(o;MhW@K}sPnB0T!{DptL3C0lv5 ziq$~QK=|ppD)u5!2PDCN8#sx$BlT6R?_2BH5@0)^+P0qcJFt=szFEcYfm`<WdNu@Z z-&<AeI=IV$-M}885%76uJ*!5XFQgwJ2ZDfLU@Nc<*bbBf%$5VJ4&2>v?*aA!6@VUL zm5^1y5uh4437i5>12w=!;0jO&)C0GH0;FqzYy_BhQMZ5<P>Ap%zyPcOY!M~}906Cr z6OaKufG^+&$bldr7zhCrK-EFi4^R!L;6Di&2^kHj0Szz>m;odK#lR|{5n#5%9-tWc zuL7*#wgsd>3H(POtAUfiDWDEvry;KpH&73pLVlVZsDqt2zkgJ*igKJEAQGs$d4P?E zR0A4d8ZZMW0xt<N4afv^fF39S3IWGmr~|+gkO4k`0cm_8R{_57BP~!2Yy+x*+dvS` zo!<xR*-}V3qyg9mR09_Q-`%J;U<ObKlmg|z3h3Sq9D%zU*aP=T$WwsTho}?45pV@O z0U6)}_yT@_90&q}fe>IH(kmcOlXC(Y2}A>GKm$wzW&lY*8u6d|o~=NdN}vX5svt8F zei7~?aO>c{0(UjsrFW}XJ^TegAy5PufE7S7unH&vN`ZC21|pHB400>54cHEp1G|Ae zfV!cIO#?Ck9iRsafI^@MFaZ0&s{ks2D&PoE4V(l{0jGf);3BXB{G=nW2Qm#Z6VL&A zpa3WYiU0$!0w@Mn0VO~wunyP&lmT0TZNPS*9I*Wh=L)hKI0>8r>Hy{_&Jo}WNWt-h zY<SVY${>9JU%(HL13^GA5CSLw6%YwT18P76Oao>BNkAHq3FrVl;0XN%kcB`IU;tJC z#egfx8(0N*2~Y~G12zC<z;>V<*bVFf_5l?@B~S$%0c1#D4S5nc1)K(IfQ!Htpbn@9 zZUYTKBfxx%YZ<TtYym0Y2>3vkFW?8rfgr#Y;hunu!~?#7A0P*UfM7uN`T;fsQbGJk zlLmhQpn^XVC;}Q$zXnLFmkjJG$TDC%Pz78B8UV**$P4fR<Uj}z2}A=LAPLX`g}@4+ z1lRy<19k%yz!BgSa1rpUh8{oxsDKdI770n_l7`}0=67rp9@<TK)gkk;`2+hW<5kEK zq3!)DjXkEA*1yKbXOOL@wDbMjOi#w|(2>d6m|}o;mW=f5u!1~Yo3#YyoRk9cIR@iY zjcoGcU9vteO`D#kPt#(F2nJ2)p^n|my5?<QeE?q|5{L%WfWq%<Rs%T=m;odKX+S2R z1N49joJgPm?n0mlFaRrnVqg_e0+a&lfDJ$yuoc(_YzNAL-M~Je0;mM4fFnRPa1uBL zoCa!ui-6-7E7>cM(a5_FvL3h%GyshNlfQwL09Jr4AO#!&SHKgH0X~2);0MToARrhB z0Th4=a78|mkkNn|&;Zkb89-sp_xP0<bpjN@oe8M}^gsdN`uK9T5K{6g<~2YX!0|+w z0d5(j58w-|fZqxnGOu77&PVH3LFO>fv)5+%hWQ!i8RVpv#%*S6=5Ju@05aEtgdKri zrU2!dhjIZMu-=G-?FMHbK-R<LARXb7w@#viNV?vLf2(I)5mo_iB~S$%0jhzMz$xG~ zFm2e^^qTMiHyUWYCd1rf%*#l~*6347o}}y=@Y^dp<%za-%AiZLh@K5ZPph>cqz;=| z7-Lamtrf9%0nQI#1=s>oz!7i-JOLTt1NZ`dfE)+{f`Je~0jPjTAR15u8i3g0gFHGY zk19p<T*6W?mROL#Cfq-a1GgORFV>7L)@?XomufeR6v?pj^g!$~?S~zu1F;X<80-+O z5WRa8Vl&Y&%!p~dilW7t;os!RiNPV8yqQf~i0dBE0eYYS*i(o)f~<o~f+TC$2)7XK zB7n3h1^h$@X-nHNhse~X(3NSuNW<I$<D4W?k2>gRz21zRPh&|4r=$ap@m@(dy9uYA zb|Ks=X&XG%0Y~WDv}1<xw%pvmZ$Mc|p-FFyl$Z3nNDod5kRBWvD<?g;Qbdv-oF_nf za58|Tc^30{hztbCv&0EJ(v$N6NKdX9@kIIpL^ryebYF8nNYbMtLywr^L&xPwo<RVH zK<IwkWbh&wfC>g1bWy2+o7fZrkcs~afJ_rq0hn?`_Y-%8j0DISel&pTNlX&p0i*$> z4A_>G?vJj6+Y2ZFh;5|DCj*KAZ{QhZPGm9A4_F2C2TB1_#&y5|U;{7^*aDzSP503z zWquzR4D1Gm0DFL;z&?P~fq~`sS^pev{QST;p#DZcRsy7M4g>x`H9&s5I0=xt{s9OA zeg;MY0VvNX$g=?1XW};?82A+!16&8l&mF%54*_?85a1Rt4)_}w58MYP0A$680+Q@g zt%Pg>NIcn}Iuw%ZPaOtH_Ms+qFM|w+B>PH7K$88VCqj~aqsh4-`$b1Vl6|5dh75t6 z1gU@|=V$`#kAaMYKNd0?G7d5pQVpqwoD8XfjE9^CnE*KhQUjR;nFyH%IR$bx&Kr@~ zx|Z$_uZNrle*xrlNG0-n1hNqRM<I(KXF#rioC#SBIScX`L88}B{m%+=l^~xJ<QhS~ zg~m+MZ4>0%f_z7i?+TL4Z6mxLf_zVqI|aE{ke>+hQ$g+%<Y$6BD9A4aSt-ab1$ju2 zUkMUh<kEb<7UVaAJS@l~f;=k7Zv}Zwkkx`bF32ARc}kF{1*t&&YEixt)JqcNYRF{B zQpglYY$Hqe;m2D!l^X;}MzP2>x&<;Fayw)O<eQMQA>V<_gnS<|3-Tk##~}AW&Vl>{ zl3dgKA+sR|!HyhAtdOMpt$YKihyPp1xsX3V=0Qf{y32?B8U6yuvyk&3Yar)C?gSP9 z7vV32oCy9x$XoC~4p|5J1Y|vA5#%3`iy&`9E{1G?TmngKHvkf(UkYgpxeStgerq|T zJ>&{VPsk@Bhd@3BISTS=NEKu;<Z#GmAhGo_{bs;;$Y<dXg(UYVax;Gp;$g_ukl22d zen%h<vIPDqkZU2QK|T*T1M&sPB*;?8Ovo1@b&xMX&WC&%@^Q#@kc%N-fm{apD&%s= z^^i|NZh%|`Nq(AI4fz@*wj-tAA$SS04E~oPH$%P(xdrky$k!qBaK5%eZh`*|NNguf zzftfG<XiB+2e}Qh9P(|*{gCfKIzzq-`8niv$ODi&AP+&l2YC{boWqNd<&ak(cR`Z6 zcps>T{{zU|kh>v?%^w1xu;(MlMudM1$-ut{!WMEbq$A`fkgkxQLV7~(gOovj1}TNy z59tH>IpkQ#3dl&v1CZg+dk`{8@INfbNrEKvKEFWx49H4IAMn3~oCW_O$O`zsf{cg1 z3X<Hzz6Nyge*-Cz^3RY3@E?JHG2~ImBS`lxqz!P4_<?HRVc<AG+TaP`P2f9#)*)mC z@IBBS?fD1D3&4-S72p)m3*kROsvv)c)FYo?Aa(GchV+Fz14-Vr&O*Kic@FX*WDVpA z$n%hmkVLl?($_+!L0*J>AMz69N065x9|3*^4#H1txB>hI)WH8cWF6#H$iE@$ASEdO zHAoN0>yTcMB+Y5W*F)ao{@`wNe{y%Y2JSEJZ|)zik-Nv;#|EV=KA?o%neYWA&=@%v zzy)!WxEM~&#d8{N3OAj5l$*(o;}l#dSHR8Z7IIH;i#P+fj9bAy#g%bexUJlq+}qr{ z+zzgsd!PH7JIo#Bs<{)~N$v;kC+-){p9|zha?xBYH<?S|61i#IBisyb7B`+#a$(#& zu8@12E8-S&OS$FTlUy;knR}gkgWJZv!)@o@<92Z$aNlr8xNo`R+;`mf+$rv7?lel* ze2n78a1U`wTnd-QWpG*C94?#Fb9tPKi{PTTXSip%=eQE?d9IXuiF<`x&+X<u;`VZ% za-VS(+(E9AJH(ygYPbvBMeZ{98+Vnv#?^Dd+*mGzOXgC!bS{&7jMH&B+*~f73+E!a zhq;y9DsDBmmV1GFkz2>T%5C62<o0l%aQnFZ+yU+j?n|zUJIkHtYPn0?74CPgj=Rp? zY+*Bg?{B><-~81(6`ccm48vI&4#)w2AOOHt^UOfN7Z?l-0fqv8fDG^k`T_j`A7B6= z_MV@ffu9AC8+kw1%xu5E#B%~$t!ijxazb`|p(-_(7*2GRwWEu40Auh2A9f08wd%Kx zE;W9jqIF<9i|_NwnT>1^VBY7|z;E8?bp^LeeO`5PDpihuIzhh<x~8?#-?~p-Xw=_! z4TrH4!uN4wGurHh(58gSv{a_kD%BK*>NBXRj#|DR46t!UD?5wfH?Id7xU?QRtL3QF zEEv(YN7k}5QP}}}ZLJe*kXUSFtpM|L;R(OF4O@*ibf#TRy270|Em99bo#|5P)3634 zH*aAyeqH2kj!xq1P1b!Q>k63LOwO+-!i-}k)4-+m)@px=Hs=moMU$V4nZQ<?z_cNT zF5p)sF|D_(Xv0(|r{(45>Y1Qc`-Ze3n#$PuMT7-4DSR!UKatGWLm|pr)T$l~@SC5z zByhWQ9Zk&2?!5V^$i;>oD<n;=w|p=!8(FMFwtOJtxi!eYVPf080b29<y#dna<2x(Z zV<~-jN>&agLmEHxlD|N!Uw~<m_?R4%(Hx46Zqjqon6Z8jG3f<)+O)JhD)Y%C!SsR@ zEm;FW<N~sz332H3Oh#5lE+2pu7-=c9ljT~n#)!E5jV{6?^c+2d-J<3&`3sV<DvY1E zOMV5%w844glXc`9yK?&9pGhMD`SVip7vi`3jM>yM3>7axVw8$0C<H;9o+3B7{7tR^ zCeIXWbdlIxOc3Ey@UG@ClEN5kboraY0+5!>vgFh9E)r`DGrIhl)VziIf?OuMFpJ60 z$fgO>vQx83)#vib=klSL+Q9oU>w&0EElf3whjPlt$Al;khEg6fpgey@r_V+`Wiy!z z@>4SzecEi8s85~8>kwSTL}QrIg|NIVCOKQ5h2+FA9X4Fz3!36D*i5vir>4W7xd0Pq z%})Y<u8e1nw3P)JSxiAb&O$zn%tuY-2LeG%LCU;*d~gqEmK25j+KvDQ6G%)>l*H&R zK&_bED5=q%N`4zKdUEjHLZh2hi_x8yotJ9vE6i$+A}7Jf<68{M+$x03{E)X3=5H28 z+D6NiB&2mpV_0)azCCD3TQ+Iq+n2dEKBT3#=CEdMd|PgzjBl96BJvH<=p*MB9~FS1 z#t^cn71<4Kp(%uK7shzBBU21tUB(zbYjS;>5lG`Q5@<s-`Gj(};I}wUxI#>1{=zgW z;tOu_<u&t2t2HH}g)_3uPcyZ&xz1=4Hl-pJKpQ39-HRVcriCudPQ%<A5=(DELgDE> z!90|<1A2{{k%hwY7oa(t)Q>UJq}mwJu5KY;6Pfo@3r%7CDKn}u1q%T}^_hZsKY#j~ zZEIU*axWxzRN-U@>5X^DR=F8(bYRmqV8(8z%w}v-e?}{ex?7gnXoq>3jW@E6tY}$g z!Y28&EHk;8;Z}){y`hO?m$eo(z~GA*x|})q1S(l5K%#k<5KID$c^eBX+;90diFoP| zt|oX}pCmz{aFx&uh&9a_l3zsOC4qeY#6<&%S5VxXIc}J($@C@)E`Ls%O=;!V`j4W8 zZ%)ovg>WLtvpX5jVEo53m`v9s`7gldY4b8ta|(0}UPc(w3(LyZWBo`TLmnj=8RUUn zfVJM);1Ne!dUi%0K1s*W&Cd!7Gt!v6+>~^p7x!`caM#MU{8L^Vpbg|hg0v%f$0(u} z(d2&s{U1pG2hsl{Nj``r|H-pCB?BHR1RowjBoI#_B1SUgyS7>#%+`}qkRO<dVm_16 z)E!L!k3oWrG^z}OD1#u%Ac!)Ek+giEkYa*DMIbMNcrlVm&&|hskq*;F<%0AVWPl)1 z9AZ-*CK;Muzf#HO1Ek6s@~FdivB=az5cK@QCCtN2NhiU)qhO&PY%F%gj+zX4yW=y| zVm>Q*u|s3Rd7(Bm2jOAfA_$vcwq_xynU#xE44Z^B1$i`2!G~)DwwQbP*Gb+wvScY| zz7Q>Mw!oB~S(qt5W0<*FW?^Q$7KY*BZEl&IuED^|25*~OYi_CF6W)Aj_4v1AomrSE zS7VsDb!K5^ycX8sQDknNe@pB9TUaOf%qx;St+2YpR2VV|xP_->QOu(K$;@SZ_nExo z=aY+0pGy9d7i}W(PEFp(NVHrVh)WHQzyR$iv`n~01!>3Nx`AuVD6M}0E)qEX1A?{w zBggRWQMi1^@X7qg1Zc50H4P642+{_O9LeOPFTuYp5*KYa<Yf+fX@Z7#T{@?ic1@@s zHyOU8LVdX@xC@hR3%OsA8<3gLJmuU`+Vldv;ZZ8NXn0pv9&)5%cuf{uc=I$*nHsr3 zlb4FSG9R5MBhP&qwu+VI>(bNpOqx!QjUDrt%yir{^txm+m3KDoA-S{BX?)$zg4uQ= zgC$Z<WjCe)GC&?MYM4B5n0%B>K4z>x?xHjyiokD8nnO0u#T!9#K3>_$W~KT0d9-7O z4Mmj0VgiQ;8hxS7K6*c<;q;ztbfG3^ldGTlVN*&>cE}?S`}kssK32(Laa<G64%1 zLnmVOT1*_iM->*Qo~~7?;<d{7@K`0InWjxp#xn`%SZdYEiQ&pnEK4&vkWNdY7^6e0 zOq|A(;n2oS36CcmlVGu3R2-v>Nl4)1!lIQbEYIU}WK`jyi4(O(Uu2jN9IlBGTpE%? zm@--w%Ba<<MEbAUm`D<fROCPYnMIJWX0M=(noEmAOpOWDsuE+=OniKlHY`TPgvEp- zEBZeH$u(h-j5=DW!4kX}ZCG?vc&rB76=+RCQL$K`7ZyE9n6vFoPbFr+XJf*4Yo3V{ z7N(97JlJelmWo&Hf^->a1SF*_RhNZ{>@t20B$Jwown^3|l0_0G6*M#ry`{X|g<2s2 z`Nmdynm66BK#S8B78j$Ambdg`fm$>cHfoe%d<1d%W3gjoxJs*xo)|Y)rk<qXzetvv zt6wNf!v@gUP-ZsSuNe>OY*}Pf1itMxKTXE#r749xsM}u{EXl-1FY|KnElXUSBf_v| zazt1-iE0inG+BnGK&;YgCdcrOxCk^Fr7D4eF%!dMX`n1rVBrL5RcaM8ZrpgXbIky{ zGmTJp!bfk(q;6w%G6@Uwv80r&GR;H&N-4uC?HEpp4|*vb7)zxiV;$;bVXJgz?36By zgVL383U#w^Rk|~Mlpai9r6=R9?8Ed|dNBi(eVIW@88cYv%?wrcV}>2*&y29J#K26I zl*7*{^iWAHBnRzS8#W$42p}^zWad$6&&h;%OdbKns?yGaPl2B^!jME|XJM<dw{VPf z(90NCiPF*F?RwB@nU5>@78a69sf8`CfaV7cwn*WK6rM=o%cmGjQuw)=@s>|TR^4d; zuV=Z1m0*Wpw_b|0BuI$Y+rqz;V-83aEKNwtLyU{Gk9U<xP-Cy4#?~vHn2o5hO{lTW zsIk|TZp<5~vA0wn7TZx{yF&Z0yOmy3K2}8b{fc3^UW`h%EQnQl8^*Aq{g#HX%KnB4 zY^cxDP*yp>5Y8$Gel?Nh?3jszmM5{HzDpltm4gl0Z0L|>dR8@bSs`ZVEi<r@!%nPX z9VN=)hBNGe5nr8SCHBnHsa8Q&R=lt#<q*m>Rca-1CVu1j4z*{yA8?prZNRxAbwGKM zIB!*U^xUvSku}O~_>I;_i+YZ<r)TAW1I`Ljilez+^scBfM7hx@5*}&CNh@(`2(L;C z#S&|V)k_!_4Z_e3&Cg)TD(wx{Y=pydDI4mz)Saz#S|&qNFtZDl?ip#%`Bpku1R<Q9 zAI@qy6e9!pVY*eQ9czzrIfpv1?xBvX*8wNSTR4vst!#P|btXH_8rK2RxM=xMIo6>< z%RAse=fw#5U{74eLV_PF(O_(4&_leWHCd8hFgYt3z6xo@NvF6<NhE);3JVK`#6m`W zmSnb0_lcGk{HDH)f{|IsEPO0{E&OCtB~pn4{8R<#uiJHF_I#f~%Re_QKVL(i$$WVA z59ImTjnNA-Sda{)9s_F(|DdA}P%_SjUt;p`tfou-)6>X<7>{Rd0p3cm1y@{zHjJzl z51S%ubF_%ohR2dMy=J7A(Gggb8)+6R<D(<7Odq*~X=4&5n#Y<&N5!g0tk&N=zB#oq zI-s5Cs0eMs6zl^KpwULfsuNAt38~GZNd~H@1T}elnexWU^l2><(meRoSVG@Irzv|= zbeIwk3A`~V<Dt`ZG)G4(u>d+^x+#V_OwqWJN5v+nu{6k>z(+^MVfA!Of+`WUKDlkQ znnd$YC_JFe;`!8Jaj^-S_{1=9!rMuWjR3G+TB|6cq;+cYVu3n{h~snMqmeB!iaeRf z+d+aUcRo5QA)cOZQ?Sv|9F3f{WcvYQ43*8%G}qSge6&hjIf)igPE(U2wXZxTJbohG zH9;E#QggYCt!1i~oK93c_CLUjL9~(9Y<a>|qS+WO6t6itB0fCaJfT^+O`kq(Q77>5 zsS%C69Izu^>w}Lb@1u!mNwMZlfly7+*o7f6re%ejqT|I=BU&u=)JW{q077_+R%}wP z35!Mxnxc%3A|G}oHVFrB8fi=k;nBDTw27$DL@l<MP!TF0O&SxnvmiTHBqo?QtLD`4 ziLv~ZkQf~v-&Q$^o*aiQ1<C82k<v1CJQ|I8tWaxarkU9lo?sRopGZz8_NvgtnX)#E zrZ1b}ny9!~ZKNt%U^M4#yc=QXi{|sz9E}s67_L=?tFdpG>E!d#Lbb$WzYAlDdD)yg zR7q}a2{C3l8=C_un3-wx=1iI`PD2c@0L?8fLKUMlevVgdtXWfZVsuPmOjL|<;}9*+ zFhwUMqDg4tr)xE&Yh<+16wRlOYsE1|^Le*cV2VZ$BwQOyb~q8f7ECLbk0v#vL9a=v zqWg&$b2ckFUg{GPVXii8dRS}IXfr@`Xv;`rYUACf<%0@&@Ohh}TRf=RMh7-qMO}Pq zdP`4CfMN9hCpVFVa%<#b1#6WWcPT-EnQ~lb5$HMa`blrcWE%fCF^?7$@Ttk2zP&5l z*wpFcL>*7M$t|8cd}{t_(<+LTj*pIsLw7MQUON%H)R61kbl+_mt&WS13Y(4x4|<(p zq($-3Q&izoNJCdEQFU7EMS~4u=!M2dt2>DfM|Fqd0-mHzjOC@E0&8UPJrwjVsUu^7 zmUPB2S#X+RGrJHV(d0*`{Q0STl)gn2Hj6aHXiPE9tCjN#a%AJi$tEY_IUF8m>?zZ{ zvXirN&`~BCq@_~}_&3S_!~a27H?k*z$ZPmL|JFv<+?3O|H?pVf@CE4~Giart<XBdm zM;05C&lM%7nUnvI+=jn4vW)=Ap4b{J*h-A_A1-HPvSjQ~i*@5^q*>Af3!2H^4E#x^ z1<JxG7#Uy|&JCJ`aC!&}KC{xw7?!bQycv93o0gdL9~2TPr*M=?6h6`?6+!6dq9=h! z^ba@-D}`-$HF}aHfE=V>VPR!qiw=jQg{zE_A&ls=z$$=#SZQ$3qCeIb_%egATA-VB zFhU1%Bpu235Y3nHx*@zj(m8==3-@5G9q2`9U|2CF&OY@20IWoqGjt&4Hp-!~C-e=$ zdWLv*DEcbv9m%=_duYYHu;ut>2T=1nnQhD;MG&W++|2qw)<BXz*%e3wWCJAWQ~Ex& znI)Y*!!oQ#gB%Gz>9#*aB&?2vBs{nIn^{L_PBQZw!_DQcd6;hkzV8ZNPdp?UHAsRa z^HTL@eqV%_!B6tt1Gx>o-zvy;BQVz#_Q??*N$iAzL`b6^qu&?yC7Fd!gMEeYuY;a4 zNTI(t#k#N3Zpx6pO8Y63`YIhPbV|o5bNectraa#_)Y)QprHjQrv;g!`Njb<t)4?wc zU(kLmCR<uqNic*VwM4B)+D%<2m9PwY#6MYtIxIVFp>kYy(E>eUGDj2I&`a$WYR6fT zF09JI!t;P5X&+?VMFqW;7zaT<q(6)<vm?fJ+%QVvfl-P+7^Uc|a<=eMxmftATrGnz z^x|fz!+&?ntw`bVqc2-2>BdxgKE1)2Z@rArU$%s~k@izdCSh8r(!pRiQ0ZuJ7^reu z<~lIa`A46DlOz%*(&fh$zLO-~nM&7XB_m*p1T|yb_X~RqzbdKTijk6TItD*5eq)7_ zO0AemyJa%kcu6?Spe9>7S~DtpOPLL$a(FtJ?ZK!VpH`vSR60GaW_z}>r@vs2J+a50 z*ke!ZvG32@qjKmk*yB8f;U-&+mB`c*{#sKo-PN`-iG`nqTt@7+N_alsY}3l$e> zp~hl~M8y<aCdDGnBGW==p|>c&eD;Ny!~O*2qdB0zjtjCI(_Lo4gi5;MKSm;~Xe^0L z!T?8wgl$?Tv8b@JXj*2)ktjk^SanzQYFZ{`WmlO(wE1U&=I4W47}OMQL0K8N>x^Q{ z+VIE?Nj7kxOqZTRwz@DSqXU}p8etF;<CDnszsG-T;J-ES-x~OD4g9wT{#yh8t%3j6 zK*u$(trk5Q+Rur`%PDoVOBQ(eRZv3Sz1!uGK%VET##%9;Q{D{lfX;Yi;oS<LGoEY{ z)(`_7^U6`)dK#^OwVm<E`|XN;o%0xU2qh!McvFz?Wj;I7`ReG9X4Ep$F7RaYYZ+M= zc=D%e8F?3YjN$@TKvMgxXwRi11A|bGi<Eaow7pb;M^?9@A8PDewWm^c3gzH=vi9PQ zVTLQUjDhE=kZ*@aSwk&T#`6pvl1M}*%Dac!m-e6FNuf{5>)R)$&&Wd^^F724$TH}Y zb-_L(5BfyUn;iP&U9iu{>&!j{^eMVvpOM#@eQM}acfmd*uQU6Spf9Nl_8EDd*{6p- zeHZLA@;bB60DXoo*k|N*W?u>Pm2|;ABd;_2%Al{T3-%d#o!M6oedS%S&&cb{z6$88 z=z@JlUT5}ILtk|l>@)H@v#$pFYPw*bk=L1h_0U(}1^bM=&g^5daR1xeh5Mht>&!kW zcv4=U`2A1db!MLoJXsg)Gx9pKPY!+ZF4$+}b*4`NeTpvFXXJIJPYr$QF4$+}byj~# z(3jK&`;5HK?9)S^z6<sld7as3fIb7Sud0JbAPqM1pwAQN@Tjmjk4+C~dk*f9ga{)K z?+|26zQaS{RpVy_2|typeX79QO*mrjb<ExxerE`VQHbSh_^5_4d_?nFVH`wnH|IUj zw}-|Qi{=Y`bf*f8<I5<$gMS}_M|QTro(H1(J^_#HY=Pp6@^*u_oAO*m-~Ygq@w_sA zsv=F(=AQyQ1<woa)+V+&APKxAp64URGk|B{dE_Um4v#YM%6Oh!Oke${HB3F(>4RZp z^nd&RE>?e91JFqFn@xvDBlI=$JdsWcK8OL{z0P?R$QPj5`E-~m!x+E=C`0r*0*?`R zt|Iyr-~p7O5aD5$lp21g6#Vic#*>04<@Jg3WZ=oVz>|X~?*h*UJRhE?5wkA{yr3@d ze8KbOd1Cd)1cMjcIZpw70JTg^p91=TPI(6C13KqHpP>u-DxeSOR9^-30iE)g!KjzP zJTH^7JNP#SyfK~gHdudJ15hPmkC_c_;JI~y2m3Y%_KE6)eH#S(#CVJZ<&g0CuIr$v zG}sY5$1d=!z_a3co?`l3!E^1Lr+_|yY7*0D01xP#hkOlP$hQLefKK&QKp)U4k3l;C zC~pJ(-@!k$14d{EqPzz18amInf`fe=&l7706%ODzbb;3&y#8I_1%emYInRLmGe9dt z(Lt4vU<2;Y0A(oX|MveGaDN6m=i&Zr5bn=n`YK=_K=m0c+Ru}OR=_@>a~|xg5bP7x z2m2}n`^0z(oL_*?m;P`6p91F>=$wc1s}Rnwp?y^}RDtsgbgB<Kmel}!8v4JZe*zD6 zjL8ThhrkoYi#sOrJedOHtU$*H&$9}}_-<IoEJnYz2B3t~A~X{Z?|!yo?|%yDQ}FuA ztwa<GyasTRWFkBU`WRlHRFwBRc&}4Mj$-ef2Jj3#uUt;)?f<I)uY%_(#CQtu6g<z$ zzkO9Sw7j&2DKDkYX?hW!yaex8C6r(*#$&*vyY8VCij`M}d}VyTl0=bwYu45<HESs$ zDMf^*coF4&krG__=HEWK<b@ih<OLcx!>4@;4Xr>qD){nxij`N7eD!?3a<Ot4P!0oM z4$*d64qkZ|cnr!xcXWicV*N7x^RVxES|rhYWpCqryiIw9QYza2rv^{W^E8v&r_fOO zHnf**)G68y81U$hkJx`qEZ-9FN_c%C_9FS#z`h#Zz7=BnDxj}|*B2zFFA2OPp10dY zB;R`Q>UmzYw+K(R1NBUHuEe}NG5gfusd=7wJ#R-nZ>Rdi>lr+{b7p7t3|<MZPrROC zUkz`ccs)a31+P!Mp217vdE)g9UOmqft!E|#<qe_rqM-jf`X}(X&Ypt;57!#`-L%8Q z5QOVIh>w<Z$ihPsycIkz8qeSkk7DqOyTDro-l{I}O28}W0`J!78s^q$YL=Sq&^m0W z3f}E5@a}+jhv!`pQHPnEH2`Ihy-+(oc%B@b+f5y_u+wx6KncalF7QGbrbI2q(?Oq( zF@RD5bbRnU%(G-LH&x^ic%8PZG_<QUUXN(I0&fM+6K_}G6?cKR3cOWa;FW+^(gohF z*=Sd@X*tB(6?nJ1z`Fz99iAuNt_o`SouBzVcBujF{^NO_x2q!PE20`)#jX#A=WQE- zJ#YQn%}@vw^mW?))X0}_ppGZS^l8A;P(tGp5uSP`o-;Ekf&W#i1Fi-<O&54c;3e@q zRR^j_umL=PGD<{v(&U*n0A<KTcna_U%7_%<6@v#*2LE(upIiwZKqL95P5V4U3d)hf z^Q_vZ@S$m_mo%OyS}))k1fFQUq@!Nad3`dGd==mUlp$I#;1vrz(Ru-|Qs9Z!O9sl3 z(S>?pX4UXJ)*EM|v|kv5#jF~DMv9G#G7{*M@H}!2cX(KVXT|eG?~_vSq&yFc8#+Gh z!L#Rij2O=WJO`dvBxauvcs@Lje_D5twE{eakgrz<91?5*&%pEeSwHP_4a-o^%Xpq> zJ+FYi6+BP0o{PaN=6Ry^TmoJR&l9cZ=fQiP=ZV(y3*f!L^F-^p0=x=ApI7^JLPHC2 z{TA}=nURR_m`7^(UCXie^EI)CU;xiR6^Y-+SAe&I@<i|Bna|ZQna@$4*!8Ob51>4; z`wNo=eOWwDM%nHEQ-BB1NHLxPJb?0o+gC+HE5HM&yG(><cnta;<9VW|Lx*zcc%Epz zfTs|6qV<vuec8M|nTUM~@BqpX;~BsMC{MIrz^f2=Wt83iKSK`m<?#AM>xEfU!+$ZN zv-|EE+;`W|%tY@866llgJkk4s6?j%WPxO8u1y9QJMDGU<;5qO-Uy=Li9`7|Z04;}A z`&Gw>`aqu#&lA7zf~Vkl^aDd3=`?_6;CbTrUDWe3o+nz*E1+)$&l9cZV(^N2o@hOn zfLFrvMC<tl@Lu3~V)e|Ffmg=!MBgVXz^mYSqV-pV>#c}y&*Jypl{NgAQaZWsDsUfH z@b_`@4T_Eqg$nOYDxMc2!ZU>9Jtw?#9`ZEhE8O<m&sseL@8dK0I9dA?8ft((1D`J= z#)}3on&+(&QODFH-+Ccmk@7OP!Mn}#3dHm^fY-qD{KR;T;5G6*v0^Y%ltapwLv-Ho zdgxov>r;r_4;VdodY*?ZojN|s!7J~a*QlIX15iCy9cyDGp)+d$%CHsTF<~fg7|+`$ z!m9uepp0k{o-NulKpA5B8YZGWPwZSD6AAkwd7fG%UjujmWr&r7QQ$gP@YlKcb&2Py zisy-6mv|0_cg{1<SNytMh3j$^Us9P^fl&?vpRf3J30^eM6STIkv>y4^3k=cg61>|y zPyD(BuYu?JwVxv&+6Z1F&y$Jqq$r1!FNgSb34QB%ed5<8czT{EeqDlB-Z`&P`5dlG z-ahf`@;O|WJkM6FykRJB7|#=H&lTVSR8zEwK3mmuxGp=-*Dw+7d1B}Km`K<c$@9do zOXw4LV&&jqyYV(kn%@NTu~xJ8NSp+OPu7#1f}F-0SW{y783q5%#u5;(a5nT;YJ-i9 zqobFXuWvv=NXU|wK9Xcr*-I?l^Z@RfN0+e{auUkmr=^!zPH^kCzr;!e_Z7Ii3vR=X zmsm@|9fWWz!QEt52I3|*7k;*dCH7a2S<bTMBnRGYVdmz{+!8Z)H#2v4Gq<IgyN8+E z&CKm#=C(3(TbsFU%-p@r+)^{Qy_ws=%<W|6b~JOln7Lie+<na4?t+`tMTKrTYbPf) z)O?V-BOxVEY{B*j!tupAoG*a~w}qLzx7tW*{w8Puf=IX94R}d#ld#s|!-Oyr?h6?C zA#hI;;)v`I5Iqq<8bJ6&lJr#oF`>QiM}&9?$}^Y5Z7i$)tIf2XxK3HmvK4%(C5R^_ z#wTZ+wDM#9BEHIw`KoDR`kVG!Q?xtI6;3^z9kc)H#PnUSdgW`1Y6|=G#JBsh@hb-; z_DE+uG}XQ%9_=>b-A5Na_GUkY)p?Ek<d2gaB=$iM%SVigj-KZ`!RqyXNj;8_{owI= z)$)jWkEHj{`eS6o(-D&w2L-8S=qsO{xwo!@Ie+Dw?iUw7;uID3UjC#@*8)Cvt$HXl zsHpefy)^^Y4EcG|+!WV<S!?Qg)qL^w-1_>%xec{HPM&=<%A%^@KZ}nQT8(zDwDmd= zKYN(n4(EK^qZdbyIN!g|+Gn46w5i~s(H?XAhEKix&ioy2r`dNNJsm#t$rqWKQA_78 zvrbaQPkeT+q5oc|NgiwGF40DLt8&-PUF`9b-?*^X<`zwTEO_yPuX_BQcFTVA6Q2+A zNdI<J{>Z%vi_%m2T}jzG^|^F)!SM;3hmE+qHGimnB==(I+d7*$OJ~24^=p#SN*jCB zXJ_)lA&tSS2mI1&{e<sQx(}QpdnWOd!uXl<XBK&Fap}Kg^UVCTBmG9tcp-W7j9CF$ zUT@ialeVb)e6Mu@SD$!d@h^+kaxwNJJW>*VPkK1ADXKL4+c~Q<8H+#JS*j$Pp%!%$ zi{ttP#xI)U{^HDi3%~Op#+2Lk8(!qMW9;0?y}i0UJZ9X59{Xn=Py020(~!jxcV~Yi zIhuZ7@<O-$6MH^3tXquijfsKDe_MWM`*84gF+JR!`;A;Ev2}JCk@jc&iJ||@Y_wXP z`>@wL8P6wuCto{fey_5$w{t_S<I;!5ACK>s>d}<HWaF-K-Go845vvuSge43*8ag5M zqXnNNPab30>$jLyd5+2UkA5YSPRX?YTKggwGgz)(?(<a7BTmybe_DU-K9lP`e{}Sn z!P@D*HWss|ISonPHn^AdJ96hm-m!P3dy@if>%vOa)qU>S_RQ@)`i<ln$zMw5^z82Y zdEV2D>N18pI}NBUbn_cJ?7+B_ksr$L1^&?MkIB;Exn6G$|7P%jzCmN}56^N@KGDzT zjZw30?u_c`^XKS4a{`0QZQW<gPH&8{${ChCb$0Bi@P03ix-)Kg{`FX?-O>1;=e;sc zJ!(<dV~hUwu?~OOGBIjR^pa?Yh2@iHj(Kd}SP#{d1oyp8e@}YWqeQkWS7K9cYm<6< z;Thecu~`;JW?vljtxCW6%<L0ZA9-hMuFbA^gw1?+ie2U_zGD`r1bJnyR6pXR^$W<H z7u_TH(WKDKRIl5PQ%A*RY9bu{5{D0aV)yjNM@*VHa`C!}Yu|Vx&Fc8YM|brr$|*`e z7tKAfp1Tn@$a_VYW_m?g#k8xr>-`6x49RD=#%ms(I443fIeI#|cK@eP{<UPVUHPzw zY;Zpy_bB5X(=%!r%jyw;gSaJT?(Sx83o~~w!Of>?z6T{8;_pEu{7MyhUYYK`jNCsU zFlgkc(ZOT*RIaTKso7y;Bb6GX-GxKCVkOJf8?EN=h2$HjrVxFfpME{+IA#2fdz;c$ z*QDnsRVDR!e}Bqj0bh>(jXk+#$>uYw4ke#*%dj}~Y)<^{rihy#Jd*zT;Zmo?w=4^W zJI2k|_uXB+#qQ+``FFQov8esFSb8q{;o-l%k$Lpa%4?rBWgeR)xqtS$b@pe^+20se z<hmu>!(sD;4a~^2*RF2;HtAAD+Lng*-+SIGqkgF}^&}Imxqc(~Ekl#@f|VogefWpA zVf=F??2o+;bQ|EHyn8&k<d>s^ZhZAjuf@lX{ygqh$hBGSr|aZ?|NI{B@oJ;PZL6;m zPE6W<@NhSMa!u2x%)Pfh)7#z}>u>#Z^?AlNXiN9-vGLy0FTGVWev(a_`0<+9akm!x z{T`HSdGd?;+gE&Q|A|$6Y4?+L_W{)t1`I8Hqjo_3;}%|ti~G6NBnCQtaIDsL)%jaZ zKfSEKGim7kzcYQV_0Agn-jMP0>w{l>%zk+Frx$ET&RTjoId{ad_kyn<a|pP8e!&;7 z-M;hB@V~2<?XMqptIvg7q2K;;>F~}=$G<s#@9FdQ9tZG_G=ixgd;HY6fC+v3cq|-s z_TGq*WtTkmANZwLFZ&DME#6fx@8<ot&A7F<pZWIu`D<0@kHxQ*9ow{J_2t9i*KFl4 z^%*{AWmE9MA2$zq`SgX}>%PDF_lH?a?hNXCuc^Sl&Nk-V5GUEPVQ%j})zeG*Xx)I~ z14D+&?^+KSRPl}7`={&vaUIum+wVw{rE{;jeqTfxV)qUjF>UKZ!&UW%W_o{mWJmYg z^6SjPL*uP`g)On29^U&NTar`rkLKv%568?n(ID}>o#8ywqnqOdKOcw5?v(=rZUx?& zdu+i^HD3j8+VsnaYq58Kx%F+g!TFomgFV#^ljh6rJ!7bMo^D?gyxp&N^hW7w<*V@< zy<#`)Xix;?UYfCC?bX8vUSPB@I6BPwF5lHIY?=KF{mxrk_)nIsb9ldL{<?#A9{tGs zx7~$(&jq;ltexRibT>=B!!CN|lD@lEc{~1fb?z<Q`trkXescc<_W7B+=e^qV(63{2 zP8BSD@60ThUMIhPY225u{rTDcvgdNE)^Au^lYDT?y?5LWIu2qKcJ>YaPHXnx@>ufo zd5_;u#7RH<epu63=HBgLA1wN-DD{|S1m|tHZ0~WacV_$Fu-aa6A}6K%%e4(j)lc<H zxmxbXbsy`>IqY(_u$%R!+RFO1Tvl(`+4#jE`R(Vg%P$TJU{Cb;RR2xv_s4!ru~>8W zvzJ!8uY6(u@OQrU8g|XCw^!WDBkXUd8yqiZul2qX(QoLytUMo&)oXhmzkB1B$JFZ= z4$QfB;n7vY>Tb?|?+<Qi-#<@V>+eX8-CznVdOJTQ{dUOP)5eYP`fHWP#h)4*zB_W{ z^uaxir*`hpUElk2V-LqUJw0l&&q{l|JK@gw_tiBG+}xUPXBh5&$}Vw!c=yI3Gp5`d z@~+0K&qIo&USk?>T4kj4>v>hW)bZx0*IhS#y~^#;lsdOlTh4gA^i-T@*mkwk&dGYo z+h@J5_bGYqm+4P$Jn3}(`cKz?tGKi$B=lxR@Up)S_B-FS@Y1nvPef>~lrzq;%QoiT zSU>OB55tdpeVONT|IlB5e|FX<=RNjIr_a4&GtLd3rTDymU&maRfTur~I#pNOZ_Y|_ z={{q*)0A6VY=RYb_x!wW{29D9yJ4iyz5A2jnaQ|5eZAqz$W1qN&+n{%ud*-q{kdG( z&!6rb{e;ubF{^$XH{hX{J*}l5Uj1wB);SiJB5XZA@|ihe`O%nR?4bSj6SH2s@%+K- zKi_i8y)e{!6Wj37tO0X|c#Y}deKv5u<r>c~Uo7Ji&UiOCUGr|5{SxD_>Alsy*OvAi zwdm}%(W^5@$U}av?%(%LwM$A-Zm&5><1AM>crw;G(Rcm&<y`ZzW-fnVzxmRDf6A`! zm{NVu_H^GKRh79t_iyRV&boI0cg>qef4E<G<d{52_w!S3F*i??thNr^yvFV5r&_Ni zBYS(WP5T|gj^F6H{;9Ry=JfyW@71r=-cYQK|9#sw!}SlZdHs{@+{?<s`P&{3CFfWy zUbFw^#*eRGx~hu%?TeX;#(Tv#9c$`#4Jf-;J<!Eg>nRzu!@hJ@qvMK((>||8>>qt9 zXw&$Iz2fBiBVz4NF8}Oi#<I_9k1NjJ_*fR#J9FiP5i94f2}w!rJ7W2frd~nY^*7wJ zylbDzx>@h~rd~SyTkVJ~dzXxJd{aLv{?Fw8nQQVKrXRW~{q6i3_aE!e_{6ds`}fND z%>L%u>wo#Z`}t)_u%b3Tx#oJ_YJJo0pUbSS|57bkBPqWd64mSK!^!(DzdwCwU0U_k zJH<KAvD5m0ZoTVHuJm@r8t3_AKX)6Pc+ByO*(H(z=ltvPDg(a%dg-!n{z;g8{LP;F zOB<(a{~0%WlVy;sZ?~J<zP&q{TYTl`YctP9-(7v~%(?2z-<K|{|LaD;UkhIMXI?3e zv)t1AHR-Q@i#-o-+UdJ+h*G|)SUKEtMu}|Byk0%t=-cz|UHO?CpDrB#&%@S?<EuC1 zL%aW~mT#M>_w@W@Q^RkKaX<CflpTL^r~LBqTXJjH*j@eCHEbS`@nb)`F^{J<Jongl zH>4|X-M>8My!*?&6eHe#Y{anWiN~BKr)e9Wc=_C={dYE9411&cn$vRcKhN~o^2gt0 zH|zd#O#0pOk3}~d!y50O`{h$>|6@fxUd}q(eZcNb5*uH653i<Nm-9d8_POOJw_o%< z^QUam&EwJiyg&J2fqak0$zxyd+^N0r&CQ*+ds<8XIjPHS_({I_)>_YdS8urQsNIz7 zb!yHW*^%(?cOBx6u05(;%G7);)!zBw<KdRx=bCyR`*Lp2HQn=j^xACE<LEAhP0_6D z-B$F<zHc+X&);K%)-;Xn=iTdw_XUqWhvs_tKcTQZ*e~wNu0`XIKXdGUb@)%mE<f%% znSIMMugARd_{J0G4xT;xL%`QZD{mdyzqj9SJJ&zoW5M`<zSoNnxI4U3-)+#h$Le2w zG467utmfjTVUue=a69qKq>$%N{F<=z#G2hpF8tEh>t5-^dk!JG=iCoZ>}7Xs@(r%i zThBhWMbY!vZH1?!-_1UwhHkd*cCh?%>dkY97WQ1TcmF!C16$9=e)rI}3AMJ9%dV!3 zRM#Jt$K5SFaII<3!8&$xRo(4j`(l2cekJyE_0l!F=a1QR;H=^Pnep=1?q>dWz3Hu$ zhCBJ=0<L^{>;2kKWEZXl52(N2tM6+zPmKG_Ca3##?i${z9R5DfJ^#h~Hcy^kYjf+D zru$Vj*RDnM`mFY$FUDPYZvL7((_PLtt*c&p_n_hCnSNiD99X%;u)Ew<`T1L_(4W5x zuDz`tU(5b9;X+e!wc_r`!`k}ScJ91-dz!rV%YMr5W@OqO2>rvb_vzl%hc=G?{PI8F zzi0i;$@_ikY~wurXT|k=>D&@FWM>WMzn8TeS-Q-<a_=n%-Fdrv1ETd8=I&U1!mV=S zi4T80^GnQkvucxTZd?qRqqv+AP*MNW?51wl3cq!?KRB-MGwB<9OrALGx6qJ#M*@e8 z`?{a^(X+$VGaH}1xTweUE3??A231`C)c<Dng600l<IXCsjDIrD^4QqL9<}GLc?6vu z-s{j2L(`#^_J7~Gm2$sm%lU3A;^J%qwLN>>`n#yd+=mwT^!Kjsc`nM^GNxXACu&LW zn$H7YJ9=;E{zIR>IO52QYwb=YU*1w{ck$NM-0Hcv29+i?_}%UM&mX<ZZjYL*zA)LZ z;_FM#OxQEz?C?)^e|Z0R&CuR|E<ZWJzSqE{K7H9FmkXyR^tcmUBKhUz<K46T^Lrc{ zu-n@Evp?=jdgk5yt1kC<%cT2t-T&P2NB>2`|GfI>xoe-<lw1tWs=oB(26e;Ey%kQo zUy==*dMj>3)>qfv-RIxCU;onS8~IP^8onAl%<fgI_XcFXzrX*LUK6ZGOrCK0iS0X& zpOGkja_L#paPjpep3~g4^1tmS49&RP+wr5P{r?HCK5@hPyv5x|pJjWzxOJ24Vqxs? zf*)e#PbZi8jyyTn)9vP3>8wJ9<?NZ`nP=?A{bi|pu70TZxy${nm!8}05Pxpqy}4I* zPCIb7ca5~$k*`ZEzj#aiPwF2_E<Lhi*70sjp8IBW$hhxUdylXC<&{m6aqm_*{&=X| zZKcBCY-^JwjXP6rz3usBY@z((oegjK)WvT4;POWwvsWt{KfgP7z&VNiz@1jnc}tpB zZ@O{)y{fp{#>Dc=Cv(sL)%(@=?Qb<b-~WB-37^4z4el;u?@QmByU1Z(kDUJRJ+fp} z-9-JkSpn)1CmvZMz4G$?`o~`$UVB-y<i?Sp`d*7RNk_c4(hxF#zI?>G8b$A@isLs% zEPlWC)kW{$^!r3<7kWV<|L91`c;8QUjn1(8&ZlV0AC9`8w%9k`R(t-&og0|sxPO4G z@V+DWdR*hUeTv_lqRwARoxAJivQ5brU;cie$Nk?~t4$7e|4f>;=K8eUnZH-euDg+U z=Jek$KK@#_^bs{ZKVx?}HXUX>mWHdn0<{LWqxz-R!+#CE`S_94pR0?%IA-z4!5_9e z-28pZEQSpYN$MHwBkghfopbjRy6wFF%k}pz#oX<E`SjW3YbT!%yL<PV15;2IVEN*T zq+YMtoO3xp@Ld1ObuxKgzYC+6FR>Wq5Wmzn`LW&(uQ&{Ey4rtu!;U#SxrhETc&<Em zJn+vS?8dzK@Z<qj=StY`e@(j3YyA12b6#G1WA9J9?3)5Zhb=lCKjPs}I1i5*X%@MY zF8)=Y<zW4#OTd7Ft7T)J3@;l!&^t*sG(^h9=aki#9xl1zy6}9%l_~Me&eON<AI?o_ zsJc+|=l>(`y~CQm!vF6KHkpJylCY5(hO#$qnPQj9(ps%D)z(&-T5YRL?Xt>HTic2( zt#z>-sEh=WAtPaf1d_01gz(%aq}R94bNznT^<3BQ`R@tWJNJt__vf7RIp;p-d=lV8 zTMd1sfplBtuNxOMmVS!Wiez!sCcY}8H1ngh`fJLJuU%%ZtC%RGyXO^QdlV}A6njL^ zvh1i&ThG_Df4VP9kaB~Kt$rAy^o?GP{JFlVRj-E3#mi3uMO(C5hSk*iyC%NMYrC0{ z(LHEHo%*meRW39<Qls)~AN|iGTJ<dQ2X%gPKCKhIv0s}k%u?6Lw;^7ZlPEo}i6=cR zrW)+}YufV0jy%hIs|lJLZ)CrBSV`e21x51ecCqH?E^;W$A8>knvl-RRJNHe6Zkg%y za;opKF`rq`S3IpZ@P~ulhr(LRuO%4G3-<66hWDxSCaILUmG6sY$j6NMzx^;U;QeR+ zz_2oJ+Ab-dIQ&zx$@zyiR@xWy4RwFbRwo={s+Eso=rm`l%?GjNwqJanuIn#Jd!KJr z(^0W8_2pbMskKYZdnm5Ud)70pP@EGJg?;}?q|&u_L~8IDf%c3Kw=M3Ao%mWQo*kcG z{WLGUrFG#KFTn?!`;<~vY^e{g)+n9{Oj>-6nVEfNWwh#V>qF5ro6<}7ThU8Y^3s^X zq}65kMPkk#O7Q+>q2FRUBTKFO*5&!`+K86)m^zFGx61w8d*Vu2TzbcjPmK&>8#6S` zpI>YGazHSvb)nSt1|yeYXPU3<aAddkid`?>;x`h8$g8%tI+bS|cKVLk<$TiMhZ(D) z!?+zv*7JKYfq&<|{agXly0|@csDeX%^JUp;-AkLMPQxD={aTFGmK>3Om+>`<KvaKG z)Y|Fujvah;=%5OJX_K|5^{Jb|wk}~gtNFL6bH4l4vCM?l<+v|ab+9fX*PGu7v2hRd zJED!6G~ZUN*kDBBkzK!~z1ucfWdAr}MSFfcqE*HFQU}YyXtldUVya>i<<BinBQ?K^ zc$W5%KJ#rQYs2y{6(&O!!TOE2|I+^Hs<<~fsdgf%JKKX0TB(UWUHxWpGMbQdFGk~c zrGe*Tt<^)Rb~X0fU-;7JDUoFL_b08FukFy@TH~qs!GQvsKJNj0)ph$YeS3@s(v(@V z^fV8BdH_+!A(uIP`UAVJt%sYZZgLVjD~#ixc^*79V33wSY!saGy7(Wx{xiLj@x)HQ zzSAQi+)*dbVcHLempL!@SgqS4u>b9#K>kA~p@5${!+(}hH(uVrB_$4|JER9jD>eMk z*iTR=YHryc<fe)5S<ULP9XhfDXZTcU%4XY={z%aWt@S$`97Z>qwdkL%Wc!>U_v>8N z?qeVB-uuq55@YFrzo`4SQm)RPnqQqxy0|Z$Ue4yaRk9rovahlTO_Tk*;da!vm-A?@ z8={}f`B%S5NQpA3+Zm>LOEp2&kGA4`r-^U9<V2)3DO9s=nX9dz7PrdfTTk<Tx|krO z<Pa_T6Js6Ne8HS(DPj;S30zsFvir53M>OI{7X)edZVUH4NbWYA_(bS!XE1%|i|E(? z6!2bi%?yUSU6xlqKWc5w*UH|o=d~Ag*Q=_zPxKx7U(4e<(;s_dzxDPrb!LSre9bO? z_f8>D{gF$l*BEAxUV_oy2@R$i=^xi>*Be4B`R_H;YD!Ot*z2}slb<_=y0|<wWQ<i3 zx#!+`j2(y;8mOz!5X_8>RCO;^`hCm)Twi^+7x#o8$N12%`ToR5#S7h?@yoYQ#!%-^ zV;b=vmb@B`WUCKctWefzs*xOsEpeVIm~`J^<jKr?J>_)S$-!9(b4Tek7RSq*OBh`q zh_LX8&EM$BXDGGHWl!1}G^_U4WKT7e_q7^3c!(1|w^>!nxIIj&{2q5h!CKyGzVvlI zx#s0R#s)(#6dqyCU9D}|1_f@P-}j=ozq&0ax>UwX*ED=J5*#_}#>&vRIAtUb`oKW2 zy3j)<ITX6Ojr7?2jp<3Q#MQ3sD5kg$lf`Bs8WGJ;?3s1vRSU5H#E7h({ZgS{IMKvc zeXlq9O%+4q_xi9^_0pu-?{2PoCB0B}&sw?i?qk11%0-KiZL2xOw4Q3ORnlG~@`PSg zo5>b~7xL|7#e$<r%lZb1e4FdRR^dH#U!(6QElWG5Ty90iIQ!dQSIHi<=f+Y(yMNWL z(Qguv13$<t)Lb7cn5}zgs~I*aSnA}FI`f|K<tA_S5=<(Hf@97n)!r7rGVpj*(wF{; z_p@Ub#DQL=-SX;Y7g(KPT#x74-s_f*@6{#+MNU`<BcCb!k~Q)3JwwGW!;JZgE4L^8 z#`MYNb5Yi}6X~9W)Md@+Xv*xz3mmJzw|V;cb$X1el&4hXd>J?YflE0ZAM{%7{6(*M z&BMFj|Gk_-#Trh}rhOCB9dLkZS)O$@km9~aV*a2|vbmw$@5%>zt@2m)s(j&RMAX(~ z_ZIEm(Tu}KN)+B33d#p5T@g_{jWo+LH=jU>oes&{{msvQ>$6kpl^?a|_SwC~wA6P~ zl*}$9ZfY*@HJH{C&gc9YtYdech4<V<ers3Iq`=wVta01DYIeQj6}=W`v6G1=U39aU z^xTvc$fdZSR9x@5$6@t1Z;y{UxV9BNfmZLXOsyDlvtH`Fygl}6s%&N4bKl#<pMplN zcI_anY{u$#Z^&`|0VB4(=NmlJS?{26X{%jubomwKxjo6xzOKj=KCUjK^_CCf4}BB4 zQ1o#(-e!9~E$E|AVNQwtGmVe^l>e-43HoC5V|9lYEz{vD`)rT5NnGse_v#SsGgM=b zCJg`5bh67xzgg_<Q#2~FN_g=uu10KVOSSySvB2iervf)Z^E9iSjaOLiuI(L(OnAC~ zE<rHb=I7|y*{ajQ=1oW5<k8$?IdZ+v$ek_ew%ERXc3R2v&9i#3L_P0xn}AV=D*0`W z`Hg+f#GbHhcg55%t~j`2(p+Y1SvJi>Q_fi>BwD$(ZF_{44PS}ivrN2e^eS$#<n2Ne zU-=grRx#<J$o$xrK<^hH*)ET_*DYaBi?&AHiZyGxP~4F#^bk?Ca)^6x?wb*(vZlX% z`iey9zN%Y!g*AOT#^<53$G}kQOO9uxezN(aJ0*g<KOR+6zLDT^(6HHj$~H`;O@}i^ ze!6?KFe(t2l9Dq*HIJ+nybK;uxo%Hmz+Yp8J}+?gopG>|r_Qc=Oc(Y1UQ=CjIf~NN z7w@R;JM@}x^HAvcLLybs?gQNF_a4mFjjYw##(hl6?lSJwcwQEz!H&BrOfg&Y44M9> z!gI1SSKuz!S0`qDu`S9W>8DT=%%%jl=F|d{d4;NB#q#3WGeLG3Mvq|~MkT(<^@YBY z_Giq6Z9irZEF`x6mxeu+n=SnYFGpT?{3j#Zx!`NUq{e~9_h*h|6Mu6&I?V8)4qvz^ zRzL94#^ktR*<z76=;0xq=x2S58T!`KB>Ta-+jEyT56(?(yS8p#5@&DhmZ9v>Q$8{j zP&`wJBN7*fxf4P3thzgeq|SiP`<EkA5;PihYwQn5{7k71PZr`e)VkBxwbWkrFL+6E z!i#@Q4qvo+kl5qc+CTS7WpG;eLfVVtDR#qq4MTBccg)bCo!JunYoWVbL?M0Cj^^G{ zAJ6t`Kfc7B9BcDuBF3u1$WL?ecai;vT{$+quS#ZZ?_OE`bgV=rS`<~g=~;8_&Srw* z)g-bgKF49otDNFGs2Zg6X1cJ=E&2)d*(0pWdYfd7rMm~tL*PZ5_%f#V)enYkpJ#ch z>oFs2GF8&#ta>M({_d0dcjE#4(j9u5ZIR0)&fi&$H~ul6l4RuLSh#CIDe=4mcfe+H z$&}ut^X6LVT<^!RjTZtk-zfZmc}K`fkeA<9X8DC6jJaT~KK-4SL)SOYB+pBP$<HgC z)kZ8%1q^L2jc$>zNFN&Cy>IZ~bxKY6Ck1a}<3z&4M}_UD(zD0&SFmPT++4lLUeZw4 z#^kowU+h^(+mUJUJdR>=(<esZ>pvWrb^H9RoQ_mW8cnY%-&@MpQrf_7_#z<Xp&zeU zA@HQ_jA3biTf$Vjadd67S-_e2)|JiblM1!_%uT<FBQ&M%A%;G0*5CIhwpS-My`KMN z76JD%#St45LiYc#vdhyc_TG4IUZ?NrQ08-=WE!(Pt$p>p<Mdblxz?Lcg(;m`R%>er zC|RPEHJKQ_Vqgc=CcB$8t+{{2Fb2Hsgzu+AgvRmBF$N9t`zOyGaOk-EcMwPWi3i)d zhTW|*ihn&58u~Pu8QpQl)xT|jD(k+m)$8SoYdUXt5bve2I=B7Uz6zD^%wH3~FW?TZ z3v7D*DqSopJd$kOw28_1aI$>iQ$oG+-TN~JR|;z|563FW2Tpq%JN7f$8;b)UkX9QN z0$wz&R5@av-}?-wRNTw8*}R3+>uKQFVnP~L7OEr=yG$oF>ap?W&hqv{-tB4sOly>` z4(6viJ<z0Tjpum^e>i)q;c;J7J?A5wifZ?5qg0dZ?&Dq49WQmJ>C=DJDIQj*HAHO` zOq>5SW!d}*TO}sCiC+<?I-O@B8D5`}D!gLLWPJP=&LFqx&P2j@F>jQxjBZ7(BLm~E z0`C2ZffqZf%4(i%VRI@gGG1t~%I<tl>3hohiTP%{x25hYyP#J;38<n6Lo*8}KP?={ z*=y5Qe&ERD&#{4wYSkzM?&fmgld7ayQHGrI<CnfmH5@NW;HM#$-Q=|4lU9LMO%|St z-{v$C|N7RpVKe61WP(np_25sjqOV*<)y$Cfqs*@j@v8D!IwyW$u)eAk3X?I+JE#3u zh35`aSl=$E>&%_C#q-MCMtRRA)#nbyhzv#}taC6WlMhZ9Hhhp!M?BH#py>F<uj(67 z_OR)%k(PJt>?uAQf|deORF%no$+I30s)UAf@dmyZ{TK%?@0$$1Zq%0WYw5r@`r?Jn zRJ!O8$M@Aa<C;3HLw0Z2LeA44+0}O@f-+zD-{*4N{Hkm2YD~V^@|?%j8s9gtxJv0> z_%ilQj^pEr_z#E%H(Tu(`%@BxuR2A;ad~pnK?QaE{NK4M4u|?JyB_hT3;FsDKYY-n zNE%(CZ!ll!INy`joo;%~XzmZ9ik(q>eZbc@8V<)f2({kPwKm5jI2lY7u97UX|EXQ} z8hWuBW$xKMpkY3rN~BD`Q|=k`XsN%C?R{X(wh8}*sI;w#{M^sEZsjqyUST@i?|~D8 z(%zKJGQO-`LEaSAg4w@CY_MatQTbO|)xw_-?HG=il8mELXGH7o)V=PAW)FYS)kFO9 zYNg5rKD)iQLh$mp=UF_wt^G?%y7&Dn&v&$);>C5GE{%9f)FHec_2G86c{sAiw)=8+ zT=wkvYWeV_i$knIZrQ3aiL?5?HlH%^!8>EF!_+{x!Fmd|FQm>y__%1vMc$z8)S10X z4=VGm&mH%e#s+7%^J<c4uE`P1>iDajT8%OH>i?|hs?3ihuWm?mlzf*?P`{W}Kl&l5 z_o{2HerftnqT{(}Lbvx3^Q8xRllW6nt&hEH%?i}AjB`S#+PL2s&fH;MSEzcN`0)Fe z+=c~(T&->0dCE?g$|Q|f1FgJ1@?@T^iB<SGk743^H^U<B`<)9mkCNKVjj=;ThWUC) zc#>I6YTEdj%+>ZE@+88GzvsLu-pi=@`L`p3T0vPu%b{^C56)~K>U?1^5=2RQ9_A)` zezMN9>&rI1X(j4j=J)riEtiv0<!29*-z`1PcysJ#Orvo`;hfb#olf`bfhGEJPj2?D zNu{X1V8^VR1d7%R172mr04{PM+cxkrVacf`;qOn32cEu}&z3vN3$+<ea!~*Aux;D= z?_zs3sP?ocPaSdXuahvZHj-T23SLp4kxJXF=6rPwf*G!L37%8ASs2ki2fX5Kx7yl= z<oMbG?IM+5cU)X;Jy$f#G%v9E^Am}^Vqc(UP&V1>Ls5*))2cy<Z;eBH=-t}hhu2E! zVw+X>mD_2OpPrJ3MBE76^$h0l`D58HM&|j`>usmznl`8Oygt2q@$*K4c)Bv@<$;cx z+SCby?%d{A3j$oA>E)3Yd#8+4jiMi?mLEr9I|B#O>nilv6N(ZXG3xR48GVzgk>+Qa z%DuQ~dzE{)*Qq_=&mHl)HfNBGwg0DIOg9>hd-ju@@54xL_2T&rMkbeIXVj0?(1-h* zP7UwAltw&tx&HmcS^Q*lN}BW5qGHDb?SX?1dJf7*aEAV!pJx*8{bIK;=1fz1J|ESD zF|n=duV7+M1z(?CTq++{NzXBHc$n&jITT@%buZrGd#@Rm5!Fd9zJ8!HNJM>eYB5c- zgu~wC5|>WV3Sm$EcGZsJ#1_szdSci5#b3l#PBvXp>8FVCkM(;9)wv$pMum*713qOn zpO8v=o(Ps#mx-QM)vh_trEq=Kzt@X4zrkmO+7(hO$S4@eDD=ZcxrdL6M*GIBTlcD{ zacj+g-jnL`{_|66I|7RY8;6q2i#GIm+CG^adY>QsFnPcCw7+SduF(An=|sBswA{x> zX0DGH5Cs%RQT(y%9ge$V%nFkwTURZcmbCsbTz0<i=Y3(5#5`+~r1+WRpt6!;(c8Qo zHm_!8gO?Y^jriBv4BLalu(TxoerE@7ZyN$!r#}DwqC<M3lVZsWT#r#xZsWb?a(SIp zqk!6rIK5$&+S$`rnOa7vhFE(yOsDb1KDnnK3ur|w!Sp(dUY&aDKt~<bRKb;^)Tg?p z&Asw0f`X;P3TyUPo?Bp3j?EvfbW3hti&*nb>I-sB$!P6Rt+>zeSl4HnslyjrGF4|h z!*n>-BA4^?M{J9oYo?nY+)@ADyC&$vn}Ny`VP4M?{)iA({GCgCeX|W8c`{_-r(izb z*teP%5R@T2dn4(YYVbwn0{8*h5l>GIi)x>lZJ1fx!!HY5O&^eS@#g-7eTRHUvg?n$ z)l#coS-;`h*r;LpOYZ*u6-^UAtDtpk+dp=*Jh1gU9bP>>rYL0lal6B@&p&=g74^KB zak6i^sQ2n=`RvXswHkKObqbt^n78%Ez44q6eRLAWSLaF5K?V-TQZ~IcWhi-?ky|*H z`F$HR8kG|d2Clc7X1R~v5!uzWSG%PZ3N)@6FuH=3Z3Rm!Ari@N{>_o^xV>XlHpK7o zVJb0yg<0))sq%ZUxm42ibf-j^louF$nQr;`WNddDcV%`}K9Rcphw%6BV(sUTSM;c@ zG*r?5`Yw7tAvm#W-okOb>Yjt&cBMY6n+1&7g7jI<*=(xkPStqpE^QjQ3V&^KvBaAH z-8NgrgP)~OEKx$9bykE-OrH<aRv2Tgb1h+eSiC*W;xB~D8+YOcF8t1Vmb$U1?@9O* z1G5*$)Gh?!1U<W22{gAsxi}`a(}KoZD%oVH>2;Ae`|4<^=3i9!@9$$R`kx9Tx-S}d zaT8mLRVs^Oop-J4cM1Jsz_QPT>RY_m$LjT93V$dwc{$n=qquxu?M2UUe4EB~8}hWT z{i;dAbsDxaa$9Uw3gssL;=3egIrprOg<fBVCeQLc_pW~8N6|Q`tUfuXQOA$^tWw`C zUt+a&E(d$O#jeg{BDA?oG-IY0&Tze(*SxY{TU}D6``Z3lbE)gJ(rYUAFEv4hnvFP? zovHDxJY-h)o$agCBh@_e`fGBQTkPpS4(7PAo*UbCE#1XB_o@wT6}7yKQ7L@=X31E7 zkN-Eg>6B~33qKmI<}^EsdxJTxE<R~fjKNw}jyP@7Qk|kye=&FC6MCqHylU!b+$xcm zjHy&wX!LYGVAJmu*XO{z8$IBzcCpC$vSW*6G`3QiUc^<``LpQNN;0`o<(pXQPK&5z z(~Z{`W<JgJ|Ea3a_}ky?xqS6c^-mnB@Ehr~QGLr76Zi$I2A9no$G-B%akbrT84XPl zF0S{|$Q|EG*rD&TYrdeE$nSYx=DL+<K$_?ao5;b0>uEO>dTm_tQ`cl&e|MI>SK&o% zpy`PK7B+R6*l9E5+5h|c^0`|!_S75WX&cltjjexdm|Zb_t2S&HEqJ~4`?%ME9JT3M zja@?S=A`bc+pY=IrcVnbuAz<N0&YJR=eM$|5IRU!=gqOQV;mR>I16EHs_;<T3NJ>k zSB}(WuzuH48OyN|M^kVdv<{q{cCMOBRo!)auclW<yh%=F*&Ff8xaZFgT&1;Q7?|H2 z2l{6d^H_uaT*qhfY24%nr=@RvE;-#;$k*Avaz(e<pKQrB4SV;)7>9j8G^KOOpX>AW z+Zz2x&7Pxo|LU!eRG^LATj;lOze_Z{WMVj!wDNlO-QT`$_xU)@*~9hyE_dRTQt4R^ z*)D8Sa7xp-Te_I9-nc6G^Jkv??)yCZjtx7l><;f=o@{g&*3pgRCR+sdWgCmePi<B2 z4=+!A-Ita-Joxj`f%@L4XF+zUoge>DJN3_B%&z2kyW!@?IGuqsNBx2K-m_^pYzB-v zj$r0$C+&?c=h*z^<DmFYguk}D@-b_^Fodk)97O+{(_)`)TQ;P<F!}tGZLu0zv^aud za@m{J(hAL4(=?B)tmcW+`(}C%?fgyKDac1(|FcRHd4KN>CpJ-M(lkS#IfQ4E4141J z=fgy%rp-31?Al*D=CwjwRdS}a1861o_jYH$yG5QE!30g)nDy0Z7Hp<<<bAn{{kTEm zy869PCoiXWnRi7GTfK`u7gJKO+VHWD?U^<Q>xc7$OFx(A4Y4eO-`RRz5s@Ppf?hJM zE1_T5GX6QGpZmJ5b3=%*?mIjBo1niFh7^~`tv_zhe|twI4AUm@SNb7EDEjkw@?b;q zV{yrutF~{LW!5vhv6xOyD;|F-T)VkDSDDkF&)9RU&~=>7oBhu9c2k#Arsl<8Z4B<_ zWp#uo<5s>hEO(#CZ^EQ{hqjpR`eEKQC0&iAG-Yw}r&RB+t3og-Sgnh6W0P6~iR!7P z3-g({DEJp{_N!&x-c^zJsg11@j`FWb_5`+qH@;d-;qy4`hvfSyoW2#hIo&PG(aVsl zQKQppdfM_1ovIi)eRZNyv}1AQeTg7`vS6i}Uh3Vq?W*$*wZCR9XTB!7+ZMaUnq`W; zI#W2_lO?))y#u$TIAzlem(=Eq6oXA}duDE}+UVn)Zswy)Qg^4kQ_^21y<_(#_OT{e zxG0K{xVkje&u3e5zVEkQB#{KVc1#H)LYGM#ct68+Y{_e8aaZ5xt5gweB~4?MT~(cF zLw<92a23idq5+M_NU_WD#QJia?DRY&JNQH)L%C+1uP6M6403S4&(pG3WddIvKbwop zGpn;hCL<a6T#FocJJu?xVA8vn#q}Kx8@tByeOt}jJNJmNTl*BvOOb&OAtf-`W`#8S zcV(4~8!f+ARkn15j1^9KPba?@FK!n$woC3Yt_%K%c-A!DEa8f$`LB7ehkWPhN=Hb1 zr68;?c2H>_iK-Md-!s(1Tj8_CwUWB=&}Y0qDAz^z>e~Z^GmA;@S<|Ickz+L-<&`zR zQ*KmOdc7;9am`Yhkt7P<Uhya`T>CB|Y_5zK^!7Gy?^w{NH<#6$Gbto7Sq1L-7MXaf zk>#QDt5=wTHbFYog6dbnPks8yWU^C`XUjT@GEV5vca$*o`kY9<1)hm^IEEU{n^>v* z7#BE~JyhOV(N#BQC@Cl8stDhEbFVggw1~Nr@9l`8x*`UX$<xJ>j2FM@H{}en`}>7U ztHgMUH_m%9rH|W-eMeg!R&t_X)q{1j%z~ZEH)d?T=ILWnqG&L0yOc&tbn@F0=3S)A znoQ)_cV>uV%&xmR*&ZjF&ipp(ua@V`*;eRXM$cJ^nk*7bzxQ9P7v)WaOw$z~(=S-| znzrb$HS7)39jR_qbIwX42XmkMP{3jE%fu`^SHX+WL-LUCouD^{+-Fr)cYCb{sYj`0 z;7-pUT@tA_8(5oMp_8<{{B79fudY)lIs$xJAL-HgH*{eL&t{6R%2g{;FPx3)i6gJ7 z`*7?g3fIjN&ZtFiPBbXw@22iCNRrRPai^*WiONUx3>D-ib9iJ$d!JaJlWvRvF4c3S zg^;L|FS@$e%nUNeQu0JWGcA&e)`YS?PW%L0&dctWWbcCvx$^KHwajLtkwj8~R^d!+ z>nEZkSQ4*C^s9caW*VhHQq_|pKV>#Kw1b;P=e(bJb6RgkyL`}7@A1YORil~IMccut z)naEat&G-$S5p(ygmnAcVa%PO)~85bn)W(e1p}ox3vX{96W@hMd2c#%qUv#Rmt@#y zILGL=<JUu_?N7`Eo+t5<UFB2#RQu(izTL{Fm{&!F1$UN>ZK_rz!BdnhmueSCc(+h& zO(K(@8I9f%hc?BnX6>prD;i69AHkoRit`|OmA!4QDIWIW8qJit8*VyHw`0=H9N=G> z_K_JzLZ4iRYl}HJicO+iK4%Bt;614`dal-Sx5?q*ox{c^$&M?t2_2#HNfU+aSp1Y# z5Y}UXXz%46%w!WKID%@8akas+Ua~*e#Y5=TlQfV}8Pt*BR^!5)h#E_oNgj$fVutdT zZZ|By_ZT48@|0uD&&+TX1nbHrp%d{6@l=ud%(^@gb)rt^A}*oBbGBC{bCleQ7e{We zWC)rs^^{v>>Du-d_4;vGce4i4G_u990xv!01{R}M62DSO&LPyvWf}!-E!q-i-h?aa zXVelJ3JKHJ%(;-x>?xbEYRqZ3X>vs81>!P!&r2JAty<D+Q72C~dNG$BIqfYMtwN*t z4@bYQnEhrb_i4*WsY)!C*cDovCm*}n<9+`vV^NWz*Zb;T>XYhglTUcUkm0L?5-dxn zNG*CIWYAVMLDJe0kIz{@Yt?FBVjs1z%K4-(?)^oA{Sv!P$gP~ooZm+Z$CdV`koLM9 z#&@q|>k7LWbv5#a7`vwU;RyKx{B?0_ADL6jb9z>E%dRDDwpw`yHsWzz4ac$1v8g8X zu|Kv<IeV7bQgX}vSu+pA>Fp~P=io!-qlTGHwwM-qO5JLAnr_?5eteiqBB`)<H|_{2 zW4>Z$mCJ4OTDn4re!r_v$cbMlvhTHDwklX3h41Z1l^Ci<4#rKCsCny%uz7=#!vf*J zld@~{CuP0%?@J7=MN_vN-^XmeDj!jc>x#h^s??0+KmC5FayIVuj$wUDoC-@WWICT6 zw<yq+bSA%URx{%7d^t-#O$_Z^AzyGS!x)XFO+|Lv&8=9M67UU_+LHb{T(o(~7T>KI zMon@BgbH%hO0&e9VYk6vFGi3i&eljD@V*<!Dd{!rP1mim`n8AGY|04PKoDbEGe%og z9A;BHuHc$<=o42(;&l@9C~A~K#6*>Zx2{j&{7kI5Kp9i(I57MET7zK8E;Pz0X((|f ze#~y7#U<6vw<EPOdBDEMQOI^l@}Jc!GiWi!tBP=3q7T#F8)xsh;EV0Iiout%lP4nP zQ#+<-lN_y0_6+YI4mW9bjGM!Ds=fE;=W<fy7&ZmC+l%=Qt3DJX4w)?PNu-)FnHT7` zn+n}+W`eobhihx9-(tO@J^H6Y`Kj+q#>&jncSWy8G(8sEjAEW)$=9ui7yJkbc1dy$ zq7XuYmXWO!3%`&jI?4=J_U-dpo}yMwg>)Um^E_Xf6}BHAy5?A56g(^%zTQ>-*lvPF z50MXA2sUAPM_Z^Vu@$^@>@|;)BCPFpUJJ{zUm^5Qq`t~*wb#1t+`no#n6PLw)1rE3 zqk~@6pji8Yp7>4Q`*gZLcVMXBEK$C^Cr6S^Y1O=>|5}9Q?ZfU8#k7{r<Y=XkY(_Gg zU#nGxXUc^=xFNB(<H|)%a5$-Dm8~@r-<hi-62;fNmYKJhD@xI+Avlb%sg!_YZZSSy zJ{ZLUp6aBn!ahBma@inz>MAZ-ey2e=wUnP?5V!ff+A^VZ9dja>BUFzj$M=-ZmZ-DU z233uwB6(EdnK#%+*?l}bL#LQh^~#8C@6T-`TSdG1=$=%5)EnAuZ)syu+Lbqtvp&tI za$1-P>uU(sYKPS%i{2WE&NMCByXetO3168v+20b^Q_~;)eDbB&0HxD_T{2uT9X91P zvg4h#x@1F$md^}rB|zdMS7Tpfp2Z~y_B!+uraG=sOPx*$)n2tt#8czl*iOOy^k#uU zv=dc#kD=R2%WFfOeE0nEsL@uVYkXmSBu!*rMhs+}Tt`%@(xSNT(@UBtAGTG#U`)nD zwcCzFj<Xx~w#L2-e#>t^GHy6D&=WVnpV&=nc1|^DnKKm3jHS)<%#F-~CicwGooq~s zhp3XA^;d|IFa6my*m$RMmsLS!vw(uLY^6+D>l*fUi{z^}1>z$I9dsN7X^&QM_7>#| zbR)5Qu?~@*;9kcVn2hfCRxNg+YgPAWO;^p=G~e#FUWgbtGGMj97$|S<>p3~~NIlb4 zU|ND<@mo7EqanJd_3cF47fM*38%~OIri-kLEn~Z}RS5#_x|sC>@u~JW#a4rQjL_n| zx3wr|E^1RHWA8*dHF`$ypm`=&H*c{(r!ru2-CnaC&l#f(VQ%*-KF+_?x^#*zp(_M; zcn)1q?3>&p_=^a?O7wiHT~+i->#94$wuv$|YuHlVl}4ZueFWRZEf%Yux3o#q(|WhP zuPnAaU~q#CGOT>$2!oaQel`45sHSJgE214g(T(WL7o%T5530@|Pb6fF^Ax>(ZJlgv zYrN`>lcuBJFy~5r%G?qb<K!7M0eA1XwR*}TfAO8M4YstQk8^8!x1ND#fn%m&iUNhh z<#4g}%l*Ur6+1f5Wskj$xK6Qp(-HlMC(UhK>QMs@zF2rfp;pzeH*YaG=<&L#i3-yK zKLU+OnqF#p(K`}~O?>Mk!Z^gQCpr3fT{NtlwrBec)Upgcc@l30o(^v~V%$@=3OgzJ z)hSS?nUmjqVcLrB>6zw4vR%<D?Xl%Fi|hFI9Y@3wG((H4-eMwlF5T19?bO@JRxg!2 zQrPmI<qIT?N>QuBTaK%NXXb1Y5$m07UZ|G0ytln)g1yXSXLr}?vaP)wIqvoPI1#0Z z$u80wbTC}ut%hnxjZO{rX_4is#Jz5@wo}}uCJ&)1Bj4SJRp4N27dMsJ5h1A<EPB@X zzE7os?Crh7C~C~utY8~|?n0MDF#}h@?_E8jQ%%faQ)|?;BmMT^i{95;2RWtc7%kfN zPs|I%>_$>!G&Wj4(ze!FPSbxfq|vTEcR7IWFk3bgMoJu9?Xn|At;WsdJEgi!O&PT4 z^LHBrx#XJX+7!6iVk-x3%a;#?-tQG=Db&qz>^vO>Lq`=jTP8^tM)s;w#XGyR#Er(O z8r~h;@;p(IGoQvDKT4@ypTHcPnHsqzN0PJSTz$skQ<Z{EYaND2v@u>&L{<6V89C#T z+#x?n>svunp*VNeZkS?R>l(b&%V`|3)~Rw#)bD4MyJeG;1+kR0@xoG@aT~>co}b2) zJ89zL$e>d&U4PzymLtCQYE_hM$)(2+tyK83lNhmvk)y_<eoG(IL4N5lf!ark>-K0Y z;E86Ly0tcgN*4!&?8-VuyE=boyL~&3pVX3Fm+;PhB>qjAii35HWTkCSzXz?)Hkvw3 zaIg#2SXqqKqs*6<>>UUsM78_Pm$~*WlsC`O${APiP5OoSq}tMf2rHpk<ZNRd_c0Aa zvd9vub!2EJnq41G>y6d6)2$k_>JIGZjTVqO>vqZy_J*|eHq+a8cGop98~u8Wo|HUf zbaOfw4P_!@joPJ%4nnV(P-1DXoUu5gTSu{7jWe#1i};(^=c(S@+5fiRI!*=i^!QYU zTA=DxQwrI>I=)q6nqZZUo9MB5oY7xsdK=f@P`46lJi|?7=WACRdCyr1#FKVI-b%IR zGjg<UY=;f^)L?XbYYn$S)Ozia?fvXlW>bDmY2U>qKLNe7@ol3b-GV2d`;LZxjf-Eg zGmD}&*IM`9*7qC@d0D63rz?3C-mJbPP$5|r>Lol)eOjuAwc@GhE$wa=z2fLLX-B?v z7`>)%+*?~4Pi2}#t@PmZ@%irr@>Gj@#rn6@&OpJHrNX}48oQ>nR>S+ZA4yu-4ZSsS z?MDZVxTFsKZn0dmIZKH-G&5-;V9k{o<!Yy}#oP$vrj@CNYq(O=%zmTCLp^D@R4b8b zRI67tgPdpTr<$qu^%VJOw91tA)Z5xl2X$Ou=-(}J(Z+_WO%$<i=AxH!k>v~l-y7P| zykxCWEuu8^bx^vC9@;z!?6GTXYS`0FZEtOkY~%Otk?&iVLl%ts^_z5;k1=&)w6lAQ zhf~ZlH4Qq_g;)!H4Eu3?UC8XJS*TUvKyqy<zE1xlzKXF#t7_&fRJ#Vw$G7_t!UhUU z81pfD(~A)ro^~sQI4Z~1k+!pcx~)axX<e-n^~P%?^<7$Bato2~)xM`)k56f@s9R-U z8Q?25+t}$!W^;IsjnUm45}sN(%;yK2PFY%uLPlc@lNmwm>58Z!Ha*EwD7yWsK&(ci z&HK>#PFF^-6aDUi8dE$YMfmml((LgVN|GRrT;(>!NYO8MG}fsfY32AVHM=s5nZx<B zrD9%F@7q90{*d*^dAX{=&?-Tb{@4Vm*}=z@uH?<nd&cBo<!;FJkML(wnPuxwQMluS zv=Zm5B6c~eBSE9yI9<G_n=TGhJv}l&>f3Tkfj8vf*k{)?m#)w%jJ#hpa815qz!00` zR$!BF?&}h6K;x^m^iL(Y<vK;r#IG`m!mgCTy`<_H&)Mzt{AFf+WaExWRn2DS5ZgHY zI4ri2+sG3S%^UXHEGFpqIyG9Cyx)lr@iWk-*A%eJi2HO}S1b9MIFaJ%uEDvSZPsS- zWBx`g?@BU9rT%@%v&z9xNk&KXl%ZXYLoh4XU5?=>tZVA$#@M#Hm5VWQ9IgJr_|XV$ z!K&>F-=Rdyj?HKyiW>F%-0dB?*3G(U-F9s5^6QDP_N&XKYDwlK?_^@eteR(^tLNL2 zR<g=z($3|*%U4PEDg&)Y-#WNud6MR4h<V<&7NN9#Vy})Sey!M$Q`j@DhqcXia_}^v zpPtTbuI2dYTyh$alw%!qL&pWf0v(ouKw|6J%nBaxVmD1+F%0&?I!3K0I|PeT-bP?s zN9tazEZLFpv>d-m)BcG&>wJQ)E(Z2CtL{^{F6_gfGGJ3{+d`l0(=Xf9q-Z4GX)kbL z(g#<jh8vgJST={jNmR%%%yCrn4A;9c&EXU_7-5Hv2Nx3;jn%`(d0YxDT0V8L+O5#X zZZ7Uk@^qtdi<gnDp%cqjpqM$HLdYHWt?qlDPaG8EoKxJG{3k?*kO)n})RbBU9zPf? zmucl=K;hOrxVU)DdqodBeM4L5Sz{3(4i@MWvk7Hgwk`d$brgzip8FFmIZ=Om{PSA= zZ^WGf&g5xDhasO1ssdF~I8|sJ?JvaVcV`O4Mg^W>W&`Ug0&;Y&F6Qgj&hQ?@&16x- zCMp>5n+oQPMQ6NMEgCVs2GNQ~+j-*H_3U-20#a2>_jSt>>w@WHVuuYytbhfk=z@Nv zE_t-K!<%1(;hAQ*-c>&~#p$VPrVN-Y>>CIjFkZOU-O^k>pFUmIPu05a!cvXvpPX!B zq`Kqi*L7yxsYX=_UKT=J_9IV$r%uSAAHHmpM836K!?54FmqN7UQ7W2+f-09NrxxrE zcF4<%#Dev7$@L*46ROkB8Q%#TGl6;bym-u3P&1ccQ0p8{8=Qz9n1o*|-8Vki?(;V0 zU05r(A!OWeB)%PkIc;pHTs53LaYT>dTCRmtI=0S_QB9QChtO8*Z}WSN;zx7GbKPxq zYF@8j*=b1EjdS7|P@8@FxlU1TQPl1UgI7m|g-*Ar{T;6fVGejfI=95U#XeYWyF`B_ zcqURyw82>2ANIPvQ<c+2!)k0sr~SYHeB|BIAKf$6BA6Uh&XB~7>c7+1N^xdsh!*#& z8LPDrQrFio>6{CEqV?7J!Y(5VFUyGTyS>MhgLUKFFjnj~bZ-yz_rU)?&|e<^SLmgG zU;dZT{X>xc8;9<hfNqPd08#{@d$TBm(BDm~g3vu!;Pwa@5{L|<fT$of5DjDkG6k7| z%t7d$5bHpeAS;kMNCTt^(gLA-s-eHf)&=Q-tU)#)TaX=y1wyyyMfZzv1nGkeK<M5S z@JnhKCdd$E1TqFWf!2dIfY4p7T|nqhuH8WHAaq{}PmmYL8{`A>1^I#eK>?tR{}H<X z#BR_Y5V~7Z1Sk>|1&Rj6fcE`ICxE{KeGNJZIt5AwrGQdFX`uA~XcO>e&=$~E&^8dd zUk182O&}-;6#O6U2mTav0Q4E?Am|Y2bI@VX5m4-ZlmUDibO!Vd=q%_Q=v&ZtpzlHF z|DzD#P*50XCny}W3-kf#L(oT{kN=}M;CN61C=rwdItn@lIu7~*^yPna0XP$s1<D5H zfO0{3po^eOpdbDt)Smw@^$V1D8T2dY3g{{*A5;J;1Qmg<fv$sYfPMr04!Q~Y1N0~8 zFVHPeG3Yj^1XKzt1C@g+KzBfQL4Skp{YU=*-v>PaJp?@hJqA^RszBAC8c;2$4pa|% z0(uI126_%^0KEXc{9k<kum68{{3|%75!3`~2DO0LAP%S%^cvI#dIM?)b$~iSU7)w1 z|I_0IRk!=#jtQ_PVBvY~-YiU?0xTIAJ@7Iq!OEfyGus|!=T^wb7|86eA#>3eMdpve zWI*0rhd%1U%wot`^koDy_yA;gBZh)?z=mUg#y-VLu+BL26(IBfjAi2X<Nm<0@aOSj ze4HHmS~WbS0ad?TosvEaF!)rwkK@`}C=V|9o~lNZdYz=Kj$y6VKs0MtNGJrzD=MoJ z$yAz#mX4kQ3jePIzF+u1d_WP>``ci#I2;a(p7D5jd3godLlIv8_p$b(9C}qzQBeWD z;8A$y;1&z%Q$uoy16|r|1?jV*>=al=OhY^dJ<Ca-anchMNS`NVC;M*|Qv1KG2VVJq z+s^-6VgK_Dwwa)g!J>5zJ+Ny=`uy*`exk_Nq;()C`>(TD9Q(gf|8sy(;5jTN7z7VF zuu3wnaXN>!Ucctw0(MNsLhW-{rrw(01FVmXh05o!`l@Sw7qA{O-d}ze`*X!vY58}- zhTK_W)&FUNl#abRi~Xo^?X_cIue7Xj0PP%B3_?NL>gTY0s2}l12IsJQ=xcle>?Ot; zcP^gAQp9V=T7z|xan2;P1B8yf3pRXejd`2l+(5`Lx8)p`0785Odk%XHgt*P+9QKIM z8WW&@)Mb6d0(&M*7VmowTefkHPZ*!Wo-kSCOJH*>*7$MtS!_eiTD^@B+as&@=a*-( zg&<Vd4X_E&7l?m;3;h5>TnM&D#`<uMCLrXu0LzkboA4~Q6NLOdV25OU=?#<vLjL<; zP1@J^;08D^=e4$d3pPi_a@}XKY!HfX1KTO%`-5k(k3q;^1NMoG??WFr?OZD-1Z=pB z_kVB>tNr1c-wAAwj6aHiaRi}qlp@bz+dzm9Zas&!*tW*sLYX<TzAXlOSH?GBEQ&!W zz5y&-#wQ?O(?H071?&wOJ3$*fK*;|Q*eDqbW6og{_OJQx-h=Z3p_m>xSL=Z_UQjrP z-J-Y_vmfjc84r;l?`1hTBshyLmi2Q3ShkGAAH!IKP?<wu6Dno>_6W+C`L}=#k#YDs z$Y&6WKLIvP#;2ab*fp#jTL`x1#Tqx1oW*`yw#I+VpT!0&tZ@{wvV0hVTvLCt=4XLD z0cD}`FGWK?!}%i)0Lz#0AC8d2AmncZdra1c7oeYfK3((g0jqRijlYHdXi#3`A+UTI z|L^AfmcP$pFUb1&53pr2_JOs6M_4OI43<q?<1y&VoY}QD7lYM@^F(bkfxOF+<z6w^ zyE10MxVgy2E*$J08Mi@sIWT7E*kZ7EW&E=P%y-%OT7bPF;~s0s4V$(23t%tFcn{3q zC=e>=6xjPRJ`#Qo8?tLH{s>rtEXOEdwPk!C>U=D#w-YQ+#wPmbuq;^1P?<ZxhRgU8 ztQl8i>&AVsF0y>M0&CKK+**7Z*l%V0(N4&1khE=J&&ZenW2OJun*R)x!LpRq1-8>_ zjrp*)f3#tZ_ki6m<AjGWFCbr0nE?-A&4lj}FTgwwm(AY*yK~qbAmk4LtIb;Dp(w}) z5b_Jb=0MIN{ubI50R4qH3hY4{GhuAgWaE1U><t+^K`xic^0^Ugn~a_A!n^>Xa_)l- zfZRe{2>Zq#vc01iY?+K*#4ztx)?&7R4UzHBFt+-#_Pc=fk#Sq=S?m$nn)xl*92x)I z1#2}3)%6(cCE1#60p~p=J9msd<P78%iZOwh1X=tA6ffg&s6TCWt(+@h55l;j__XaX zMuBVW1lB{w9x!$RvK-g~Hbll2?XV_*(6K#Whh)sFI*Z*Q%g+$7AIbPz*vA5VW&IEK zpp1Direm`8nGbeW#!q0qNs#SL7r<VU@v+LYSRbeZ)w>65kBnJcpbxjMmA?n<ei>81 zuMR@-C*WMuK!|%F2YIqQ6ob7Ba}W71IYa(~5Z?z|C|l<PV1L*TeT4isVEx+y*B6M# z;Jh0;)_4dkQ`XNP!9Kr7w%4Bk%M+}{T!4Ag1M53F76Wro354)2<jZ{+d&HfvFCCQS z@ENc?8Cw`Z|HB@SVvc}4Cgc0i_8M9H1K_%7hwR$uAXu@Cd5|w-vYe^8cNS~$V6Cn{ zoM7z*p)&7+eJo?S#j{uf2>JCPzf5E~77o`@ELr|X!8&(Pw$>d1%apB$6gW;>cI?k^ zeN+fS<=g;k0_T7@?ZtU)&dc*sE(Uv7#y6e<KU?#&!FI~{e%*QOV-PyF6D&{0>h<Tb z`XJ<Y0XrmPUe$T*vFbH{4%lNgYg}A;9$N-N@r_`6AP(^ml*gBqsRU(EWaacg{X?=g zV4k1H{sBVqN{`QDwPocvf&D|qcOO7IK`5pZtQ^E4E{5ZdHLURou>0Zsk^dmr1Q{O# zdrHRlp+Dqat;HyTrO4Q%7Wz%r&SJ24WxVhY#NJ<vmjhcSYr`0vhfsDdvtSFMe^I?T z&>v!1pJ+pwOc3(_|KYI(`YHtV7d*nj&dQjk`H5-3Cx7kRA<@GaeQ9p=LFC@hBXK7K zzEG)MryqAMx=JoPOc{<zQP}wzdVh>QU~^>jxg*p7{>Go7C3OS48bA38u`2MW{TYA6 zO29=M-fTmx$AZt4CKu61P#AgOlO_Q)#8ilR?feU>2Ezb8_tR~7hR^WeSyi&6gIE#R z;g1+;nfk!Oeh)hGqYvb=mMV=ADg&2%+HHnd4L<Y`Z(cf#SRc55_e1Hq<A7-{PNv9D z08T!&7fJ($WA%2QhiCXK5S};0iMAs~_XSS#sF#*c1^y8;>x%s7T()hta6ya(-lIy8 zeq^8utcWo|Z@DoVz%*r3X}t_!KXs-)@}qO#`I(X>VluEGXqU7u8nFIR6KUJfJ&0#g z<f2gws`qJJF#2duTCe+Nm5&gkdOx(DQ$dXCJszkn^`rj5No$4AdsKHF`ghz8k^_8D zEE>b+Cl77$fH+`&14*CYdkssb!uqiPf{GIOiQsR1*zzR>{F>nJtT8sjp+mv{HNTxk z1V-b0@Av~tZHU2!!dUzCD>G&Osm-vCIp4%8<Y6%Hw;FFijikbhDM3~TI$dsJ_25IT zhYVb(I`|d9-?nYLnIW(~uoX7z3uj;ypRIXQPkZAvtSYpDCM=Bmx8B2D-yX97KN0*& zzuNmCzcRGv=j}qWi!A=lg9dBlM|pHAzxKmUx0_f3#Jhaf7QYE%a8RL~`cNW@LH&?? z_pP)pCd81sJ~@K?Oz@LQhb%)N-U$4vyK0HZPY3_R#zP0Az>ng$tR%T2KOX!Gmok0E zpe{r3e`GnUo(6tB@Na04C?`NXEfj;{2AQ&QfaQRzwM~prUl~GQt;?+c&;sIBm~cK% zS{+eep$`DRu6w3}`U(qvLD+yR>MK=X$D|w9sIO2T2B+Mx2E@oiT~!&DQ2W}vX&azQ zbC&7@{ruNW>BmO~5M%MrKT<|*dz-aOIv3HHe&~D`K51GzR$R(=K%ae(nGloqsTcC2 zIcfs!Mh|TkeEvvSV{||5h2#!tF6%L&otr*UM>&J~FvP1e{0Pi&HSj-n+!Ka!51nI} z{(v-9(HcNx9+9pq>cA1qt$QIvnyX0(za=6>F?XEK9z~4SgU#Dt`XNT~S7KE{5TiB8 z@8r1<l>TVk3z%7`2^byVEm4bTh%ko03n%|xhZxU-H7q7^17frWY;xdxBSz=-Nbfl6 zW{e*6<Z03mc8D2F=m$$BZNw;7UF8lWAx34kerhdU15mv)WK|#Z4Ho#fy*Cb{7-Js{ zX8I%zJTSJvH3uaQh>5^PdzGc<h4SjWIVTYL(b^ffr(Xe`3;LhD-p&EubC6fc(4I`j zPby`QKRA0h7loGND4qzccu;Lu4a%!%$PfG`9p<KMSZ&~T=OD*4U|rx}RA^uGfaQTV zsXt6i+k6eH0la@-ojh~PHLMn}zYABr1{kdg1B@s8p8=}?Q@8ueHv(gUV_dK3p?cAJ zQ;F?hAV%wepWS9@pP+bcm3d#}SAm#czlf2x6Rml_1O=obKM^?9_lyx@9bm=Xj}9Q# z2i761Y(;DYEYGTiR;{gnKHAzx5TkN7y8j?;108tB=Bp=>UmbXnG5IB8G^Xn|U6zhD z4*2_heS45!nz!Ejq<aV>3i>l_c_;E?p%#X6r$1tK;G<s8ld!;OOru;I5)c~$TWv0K zL@{W5iFP|w5u>s5(C#upOa?x<`$WnDj2BwFd}0&Ak>7}k!7NdwKWf4#guu_0w(WFT zf*5T>Xq#2<C#ZbXW-DvnTFwAp+A9oeg+AAXa;|&)en0~8C@25kY$L4~?R!lh`}x43 z(mu>h&Xn%4v?%m5urmS3Pm6}n&_5d8hS&(W!%FT$#5iEb(1aAkdca1hRXef3XpTQl z#H>S%#`na!z%Uep_62h@k+fbCaM{5eI~0TFoyem@+Ml{n@H2~m<RBD}#>MnNg|uF6 zdkkjs#1`qeYXKip#!B}qwB|e@7JZK5G5-(li~D)E4Y<+#y}5lh2F)o{7gZ@r+W%-x zh$o$r<{s*QE#14us2CJ;CTyEDAJE)XzW%p#m6C^k`}t^rbgrTE`d)nzg-i2c+rkN7 z#At0XZ~s-A18DDk+-($v{HUGL?VL!&Xl~99Cra}f?H$*vUQ6dJ%01S{v(gv?V9h** zO(-7qXUnb>>9q;k+cUeJ4<bLhz7X{mN!Jq<CI*wU_nEX_9JKQ*`Inne-)h6L>R}_& zaYS`l+_IO>7cJmp+PTs;C_=o+muIE(1?_`cCzPZ)pb7oVXN*cekEa56f6muJ^`d=h z_He`ph|&3;%Au<uHuiyX;(SjaMtzv9xlP)iX#G!UI4`YN1!78m<jSEKRq$iBJ=%^K zT{lG+{F2g%auw<dpa&d7?MGvGdE}KBilIR}>u=9)Jh&D1Q$x5;d|?<<2CNADwbk5# z1z<E^{MVn=Q*ys4U1uuV=9SU02H?NAO&6sDMmY+DnNR4kW^TKNRfvY4r|N0%@Bv2a zo>JtFby2`*{`ypnN%uH)Cd}30bLK24Qx4h|v#-Gb17|>jHveNKFYR-*GN)Rs2BY%P z9%`ledn{r@Xxk>cku8W(n-5U`&_s;RU7h9m85S6=&$U6VXe*YEX<Y1QN{AJ}-yD$0 zLX7%+cgRV!jZ5dzKUzuB96;Ap%g0=#>krB+onv8sC<d)9J5{!OAV%f*2esNFM*H2i zy*knyL+jF~zGP{8Q2yV?McDltzu7W)ZQTQZ&1W=eKNv&%-9K4EO~z;eM|u1xt(OTL z`o$>p473e+(-HYSh?z|I+1>|T7Kl-P4(q&&K#bOb=C8NW5TiN%BA5=N1M3MBa$x^w z()Jhwo9`Kwt}|FDv;38^H;O^|eA6jSx`wDkV=$8F8@kA^53C<?TAJr*Z8@QTQu;G} zRImG%ERsINXaZBeJm-!DMt$`oNiGmEir0>ELLt%|J7@N-v>)`LRV}RZyOCcTI81(7 zdM+A<@P5MUQ+0GK>cjaR_oQWNFrg3q)Zx{&c`<gZ2+zc?otNUVyxoXt5aVX!DQz># z`A&1JJBmj?fY-sNY(S{YgmM)gC?Q6B-visL(l!_Yzl%Gx1^F>dn1e!w)K7t9ErT+p z*KcV4c2TcL_fT}5)_r1BI(BI8pYadCW8qM=F73u@N&WDbiSRF=iVabb=-A)sJL3Ok z!m<4yBS!0LhT__uh}OfG8@`dY4bOyrF!lKog`m3b8H`BJ3$=5*mvyqVF5nAVt<v=q z<zbrtNCI>Nh5*O@eB3`7F)HVlosBeS(4PM1;UejKAS|%qmT)5o!Jzf9{dm%5#2UcE zA6%EV8O^(o<+`MOg65I_t|e5YG{=f`_I`pG)my9c4-NwjQewjXLgE`D#sXiCdMjmg z4V;k3{0#X~dk%YkCS7mQ9zk%Zm9`D#$)RAv4h(t#CsV&SMu_@Ev_($352Ac9R%CsS z{HQ%&Gu*WhqjB6yDU|MON_mj;U*3_f4_M$ugSCH>tp>c`$V|FMsRAE0`_mE~D+k9e z9R7W+UYKQWUpd4eKU!xvHo4L_iD(@dHtzjUy08MPh9pVH2wk7|ne5+);?ca@7uPRc zqtLp&FZ$Pm$d9fKZf(kt=07zQem7*@ho_($q;3BD;D{$G6YY1yA$=!NJUSNR@tZx0 zLGwrnf5i<k%AcQ<ZcFzgv~EAQ*ERvS)bFg=C7svEAG6ua1^Lk$Rp#+5<X`SMwO86# zD1S0d2BdYN{`~E$SC0S2ypMb8gcx0mzG04ig;))^W7ktMVr5`=yBE^jM(eqI;1g+? z=ofF6NIy#JCBr!`s|8BuI1_l2oR=RuRtfk@G*7zU=>W%R9Xg8q@FRQ7v2EW;#~SsI zPE_e(<ko@m$tVAjuE_-877az|-iP*-NsPBNA5fp~+M=w2g?O~T?__!&L&u``o`)Gj z()oh+_ea})f>+nB{aoYT??a6CvQnF3CSrO8ykGd*G8Hj;zs@q<B3&zVnee+od+)g- zKibES#C(NAOtOdf6i3r7(f^B4g!q=D_Ce5wGzH**Pg|vZg07j(ZOg1syfmLJw)-GN zc|Ps;Si0w;vF;``s31Se;g$FjIJ>nR7$#XuueVWt5^Y!Fke|ka-{mp56^K{~+VDa@ zN}3Po`t2Xe_tLSG2bO$!AqvHy{nUsqkme_v*FV`?Nc#i>O#1S7conXH;CW<&mvmmx zfp;rymahL4;F~(ZvH!*#JM@Y4dIptwDKcEzX7nD%HJmNo7c_t^{idYt)C2wre?;0g zHQ*x~jHL4g9UDeCDcz?OfVX<GrSB!tHS<lkW;bbFz^8pal#VYdbI|z9Pmy1f32PU5 z?H>{nfp;iAl;)ToaN(x}1qhM8huv*A9+e8CL<7I4{vvA?{HlmmH2eXjd+YH-qtY^Q zhOp+O?v}Oz51hN>mNX~P9(3H3tcK$0z@PnJ?7atE6xX}|zm48@sY~5miXaLss1c38 zf*Kp$Ml7(PNi-_W5*t-xmljP-RGKAL1WPngX&NO;R}?AB(gdU}y|cgPnPn4_`^~-o z@4ff;zxVa}eMjHS=bU+-bIzP|=FFMdot?l{L?6cZQ8Q;nU5M9W!!}y#Dy#@h|CDx! z7D(cleY5%564ZJ;=-VnAXk^ehRv4%(CE88{(mC_ld!oPL@wk00ooH*kHc8n!?nwoE zJQtUJeu0DKXS3lx*_M=DAc=gFr>gs5n%HN^`$WWXf%V{|t3>o$GNfO}_}&8Tm7oq= z127fn|7_@EUwq+*8fOKJ?eD%sjmMFh)ndXP=dMHBiBX6sgO%S0qCeyL`p{wpeYDpB z9Zx;J5;gAo9yO&|sByj#>hDABmonr_QfVf}8SD=^4!sI!gU3$ESHBTu!1xV52Z%b+ z1+BvSfv5)q&?)P>J<%TfdE~CeME}IO>$8Qkw_-eAJHOgFWgcoB(CznXLQ!M?U)h=D zf%QXW!@UUq2IBmJ=Ml4=;ZQ=!m@mFtM)Ykw$9*)rav8?s__>s^oUp+$+3(zk-^ZCL z_P%Vi!Q(emZZ1&<JTH{023uo1)|;bDDv=kCy{ne#5?UMdHT&m8zryyd{CG@KpP(P; zYJGveSlb8W^@!sL=c2yzwh;S*>AYV~CE{`Xzo!#SloQK5qJEC(^LXu(JnIGgg+32| zt9EQA&hKo{rVD>rDvf{3_a^!?&QT4fid8Wl_cvGX!tXZLegj1N;(RrZyqeHBw;A)6 zCyq7TcVmNZiL&YNA>R;3VmvVh?YC(^as1+VxY8nHHl|Mly>UET5jBp(gEwYivk*Fa zHH~O@9N#|kPb0<_95avX+G>wBIFBN4s3FEl6Hl0*?0tua9nn{}ZIV+)jdPEi`xS{k zKwLK&eYpbT<#;ep(|ST2F9zW2v0&5^<2j&1H!TZ8Z48=X_sM3|WHx*zvh!2`NMfwM zYuLXWCC--)Y<N8twFzi5%`##f)8NCsAQc58j91}7o9^qhLyc|yoZst#8p{?*(IWZ@ zw%w{Pj;ujvti$<RjuGP|ww(-BpEyTg|M?`y;1l#^IFm@#4qilg(8hT6uf#Eh<HiTA z9O4+q^XvwXRHE-;KM4)aA?lL@I?67WhUw72e%snrYf<C9Q14}ub2@6;a!((O$8qB* z<0m3b9Ah=<J%px!UdNkn1|}p!(C3_)eAIZ3%h@wq2DJ&~wSiS+gpG=G)FkdEe`&mt zbsaGtVt*^yQAE_g9%vaA9#I~wpBrwYThN}#g>zzH4-dyZytZ|AA0g@!`;s_745fu* z8MMWmE;J#rV870C;)(jlI{8{Bg6Q)&W?DP&Heq?NY+2KZ+Y%%?ALd|-^_B2^jdR_5 zdJl=dqyzfdil_~kCgx=w@iB3{<2|n5-0XreUJbM*cO}tAbkN5?>L&Ua_6LpCer&X1 zgWl*{un#qU{_yR#8ls=zHHh4tpNKIH^ZHTyxHFawuWhfg4ELiw1@y1*-Eq_y|GCvu zG$C<p;hJ|_xCUxGZwluY67vwempFTk2GOtZ{5aJ?cNN;;9AL^POkzC2dpPw<1;m() z=l5g|n>fbN=92d;4%%b---imPpvH53if!RnsM(-5>opMdgT4p75{bSf2Rh#((jRS% zK_>=2C(57++GWeNMHr85q`F{;=(mcXIX3J07?1Viq*p+Udw7m;vfe?oJNBjLil3{Y z4c6O^4LdiY#^a9V97`Mv@}RHmP<6m~b<iVZ7h-?0je2K0@-ZIgHX$^P5Y#NtmhM8L z4l&=+slLSZBevr+o6<#?8McL{#)<W4kMli_>}p~>RD*pX2gEB8@t{5B-w^%K7;JVf zouPz@;u!vDbMa!d!7`65k&Ja5(C2nuCCY~9)91^bh_=IVOk~G%M0?yXfk7CNKK7-b z4NnsN1joH*ixoy_BLl57ynT!qOBr;ie_u@%jK}euynVR~Y9lYWW?##5LXFqXRTfK# zaRA5ChfDK5#&|q81utl@LCx}nIc?BWVxEBG@KWtIqHgKVke}anA}_qR(5kbII4{#6 z&F}SZtwvvrPtdtSjFWg@;`<rzc3?aQbn%X1S=4xsDAQ#fF-GC_&YjPetRdn-n|TGg zqE_&N`(6Iu5%nVr`WtiQV2me0dE5hU6W0auU>~;agC0h!f;ROr{Svh<=o5<ziE)Dg z`mhGxoqz@M{c=VDactszBXGCm+5y|z{IhbRe_}m+KEs}<LmYD|zN{hYpXLeIrzZZN zV=_2yYron+v^CaeO5WZGGQ{J!*DE?pl;404>F=}(hiDQ7w3@7)Ich5S3WK6UP;2nu ze(#<<CTbPXqFMUOP~&;o_Dg@F4`5!GNh-wgr3yACtZ9V3Ea*#qvu2__8T9#0ONo8N z@%&SRx5U2V_{^{ywL%*M&?cW=H%5)uaZ1)Ri19(22mO}wnJ>oE*>FzT_7hR(3ZR9) z^`;oF<_vYX9cSP$M+N=xqc2QQ<5=CeI+u?c&quDVL&R}s%!cnvEO|+sXE9$VE#Ez8 zgMC9+W4{7wc{a4Mw=EAf_QQy<d!DE<-!D|1iTSoB=mj(15`9k{^mWP(buc0NYFNa@ zVAMuD=+nwwggx%dh{Xw_Z!3e|!+r7*m=N{zetR>~x6yv(?2Fql-T*YmqJr38Inbrb z+ubpq4SL7cHAMZWgZ{)^i#UD_L0_0Yv=U56G|(oDgoUUvuPr7+M4!YtQq}a|h<3zt zH*+4&<e>~ud+EF!ZPZlI$}1Y}QFEX^lLOossI@?UXVSj~H6Clr=T_;X#&g#6*j>bU zi)l7dyommZ$7YsJpbXleW-v8bsPP!l^L<Ag`#3M%%Bdl2P^W6IA<B$(p8d_w`_UXr z_{(RDiSl6iw?5uX^lj{`;fGHX^=Sen-0tW(1MP7>zq?MIIL6Ut=FOvF7*7Fh=4z&l zT8|5#B~7oP67isar1lbhiJl5`fLF1a7>{!mKht?DP%C=D=atsA#Id6Zx_)cma*W5Z z>!n{BF;>t(FTjgPSX4o)a3hKGFhS2JX%gw{gO;7%u>fuG^I0o7@jlde9MM;~5%rJz zI8(dB3FEOow>Rt~>JzVz-ab4^ocnN0UYfI==&LxcUS1vSiS}4;8s_;#-^O|PquOIc zU6Hv^248LBSi|{ATH;(j+AD*0`Z9*-8#taX9lNKB@mN1T!4KRB8#;XUu_28(X7N1L zyd;e%CmvsuKllHahT8g9o&5eikpGwagMHFM13Y$c{uX@n2FcZD-KG<FAOFV04)U+% zUp4Tr8u)**2FMgD4W3VvS5Q<^#*_MA!+&~QjzlI=CTi*5w}bgAj4MnM8=gDn!n40T zc&^qHo>}D+&&gsE|Iv0*<U~djD}z5RdU|YJj0~7YxESa$|Eu9YC2#QGpFTV)_<wcz zbNT-j`e$q4|7zp>cO))(CYE>_7M?tXg$x%Y;tu%xziQd4fOi4^>&t&vI{#lvf))7Z z{_<~+|Nm(Ff7HbA@IM*G&SR=aCYmeQ@b2bL1J*lt{nM*rm<I69_y_TZ^x#!D6&K9i zMze?a$1mfb?BAbc)tNU?&@^phj4)Z4_|Et<n^#xc{R(X1z4CWN{HK=uker0<sH|pq z$NW_1?#z_|cG+8kymN!#ee(gU67m+$_RfbF=M;~@yXVWE_`kiK>RfU9cu3U&cn^J8 zL~ZrK6P)VrE;?7<g?G}w>qvP`)wL_Oc5!*R65db0BeFF6@bT`4#}D1UzaQRJzs6bp zwz1eY<L&jFjJ@#QdeztI_s^^$JvI<zJxPIg*iY+Ad!2jASFm+)VDof%pS`TuVN@*V zE~8`ZtKtstwoiQ%u1oi@F+5de!?J+)-2bY@F#7B+N1wE`TRRrsd9UnzKq=_EdfHC~ z8sk-U+Xrf1n{;JgJkT1s;>mkXGo}8@#sHyyVXYv-Dnw9ugkJMe<1OKLuHrgcPDkT` zrPeJvtvB1AUUCqf*mJ&T+opp4O@Zf!_8wCiP5en^ytw_bSjp0eymXU0<?9q*>MupU zwA#*anW6Da*|9-K`F25v!f&?(N^#p%RX@>pr?)>oseXL*c}<hft=f-{J<?fYwVz27 z>|;JoJ*#tkU!_*?HhqoYJ;&9KrA$-GYS5Qeb2>-bmC-ibHEVreSe~IsYhz;TU7EOQ z#l>5V-Hz!EhYR_QbdQ{-W7#FGU53$J^EajrMt-YK{_%Ez;)9<9G=EA<FiMF}un7CS z+t$@4U@l!0<y?5Z>yyJ9QkFXDd$|t0Cb`~DNM91VB5t9*k<dw|qtpJ~vrg_$KYCdF z5F5)n6e-r;x4Tny*H=Yyd%|kS2aef{C7kaZx^j;-_@wmKKwXdDAWerfZ0YDZ>ixNB zeDBFPa>`vH_1W7<nWlcOELAl}M#qRuGcoHTnHgt{8fZ8V$PEfb?@L52KPRTwMf%58 zI_imD_ZB!6UEEjn!ppq#`S=^bvs*_qpMU;I;tLDa@S=f6t2b{8wh4ZF(cV;4;n3Ym z?ie+g7cLiYB9QS*yRV+9ZxQEQRgk$+fXMQ48+W?xF3z-{M{3PK-V<$n=YzMt;j#<r zJAbH`fB5E`@zzm|UO8pj2Nn6(Lb2#cx#0Qo(wnh&3IdmDyfhmRcu{sE_hqzCU7@v1 z!Yjf3sCVB4`wKnoGMaS6+|Cbg`TcnhNn^KfBvY>Z$d$XA7OZ&paj<e;8C#{kJ6V~k z<*Z~r*H*#JzeIM&VSn1$n_iTx;#yLz$e$!uRwpw}jH%OSrpkWIi&mPy@HS)Ne05!? zx!xSRsp^)7boCje&f1SFf8{JlJLSJ@&pIzJ2g8(=qwm;0_u|uiwl3nXHXbWlUU5Ix z{q(L|i+mg+oXqGRABnrer?)hO8#jK)WcJdM)O2SC$*tHMLAv-_JghLEJ`nXp)GO~9 z(tEZ!zHjy+<H0i1`jODg3nV#rP1*S31|>z_uZ*DYcj`QPcgdhrypSWOAZtb&>N9UD zZk&22uFvvIC$nh`;VH|TyLU{Tulm~j-KBc79SdKX=!$YV`8P^g@p~yoo7YDhtX^rS z@8hqow=LXQH{qH$^QkaYXH0*)w*AT(S|P{oXe8fx#mISiK&`l_UODfVdW9cPT#(%| ze?C>Kwp;w;7p0@d?-;`;9BKzXd>7n5zf-OM+_KpIvD=P=Tc?c=iypR*$80K~E}eB! z!NRm%&0^ML?PZ&98pb@_X4*M5&2rNXBW|x_#LVLr5wk6JiR^QgbL^L&uKfspo@a*R zm+IEBHv-Ia;YaJ<mPKplKde)}@O2%9KdXCCro_MVd*7({?Al~Oia)8`xS^)>N{~&F zy)3JsJS{Q*=;p)%cl(Ya3j^O*+8UW}wGGm$%<MX9oxL5KHh$&ac08$2l<_37_f>7o zKzo1q(5TpVczncqxUY45u%=khpLIjE_e^xAXzQx+HfJmA7CpuA#?fxWy4DuAn$~WI z>T$L4$|){|l^c$xRo!b$6zF;-)t-2Ht5L}{?n7(|U!?9`(jWJtWQ;sRU50-+TKP(D zokm%$x_)DADW@!lVsZIEwAH5;c6QzOx@PUL$*_NamOs~>B$|8sv!J<pC7JdomW|I+ zEqAc{G3=z(8YdNtX{>6FKFd&lnq#|$&z_UY$pwZo;*SJl!D)j24x1oR$lat5eY27q zcif7rZPJeyEc+^@>U?HSWkpw4B}LV)T1&^JMoU$_j@BR2`2H2ACF@#O+o|vj(WVvT zUT1DeKS!%;P)UX}Od)#>(-cF7G+0psRu1vK9{xF^okyM9&ZXHlWfj)eRyL$meQ3{k z`=P<>Re4@*(e3Zz3%>G>&$k$+7v#mWi+l`<O9e@4<$kPN0%2;*`!8$)J4arQ4JPkv zr>tMtt~_(vN$siJFqY$rZRR208d~S}uAgDGrQ@TUy@mFU$HeyKQ-Wvj%nhEYyn?|! z^ESnju`s|i^t)8UdoOQmmsi!PmA{Nu_~}e8HFRO!IK8ZE_>{ZtAoX5k|3(I>|MBLC ze(fh613S!(h6UeOkABJ;6SqEgrJmk#L-x~8+7#?<+myMpPN+G#RWbOx9%;m0pQn}A zxL=#f4%3;pYCSVB+DiAEBtyL`*B$h)UN~v+-60jDpcU1une+lq)59v06KmVd%)2Yi zA0OE_bvgU2WoM4%v~PolE#0^urs~QKn~x4Cm<^Gaav0{<3>JK`S0_IE1*4zasuXlv zUv|jl1}UbhZDiVBtHIxxiG81?hxZOTh<hU*vjzsHi-y-73MSpi=gT#X#;GZ5XE5~* zLX34(L#C5OypJlM1Up?hmb_@ol1TR{)a>PgpPg2p3d-_XW^Us{t4~|`<f5<F;jMwo zyg#;HV8-b9m?ScsQUBJ^vhdk@PR?UP-G>h!GahH3RQfglrtIr#D{6DEA(>1MgxfwH zB<JP6l+X4A(oQ4^WbZt4RCw3wt~924OWAOmjf(yJ2xV9A2*uT(I?4I0xJ7Yas5WLl zHK<>k?9|y(nAwyb7bx7eB<7v*$oW^LSK151R}{RQM%nhF@}9xVgpfxC%jc{sHKym6 zlLsq>J-tdFhG+)8T9)U=7k=I*fBfDJ^?L2~`fi6$8viQOVZP{?^|T^Qr|D}F#g=uZ zeDjT|*_<j3FTGE8_%jlphR8LDYe%)F*mc`}RM#|nMu1?dzVRD{?vSGLU*cc<@Kwfh zFUyi=ly}1Cx4zDPv2F&pNcp|^b#78pWn@5B-69)ti=KR^XsF$Nph1v1T3I<xs;*O| zwR9KCj43+F>Q0T7nd{m~_1m6AKJ<flJT2F6^i7M}@TiLCppkX*fWtESpw9;3P~a~1 zSlEGL^5LV|a>tGcRlklDY3~h*WPScA&tmCZA=g}8Xg^Zd>6CXPX<<xY))M#WYOV^6 zzOFgv)0Xa8IsS<qJ;qs7vTg3&AI5AC1f93=^FD91bkR1=#qQe_KmF2>9C_~M;N$v} zU1~f*>#mH#CXroG<DT5C2Gw=RjW<R`O|IwSTU+hbMF(Db_o;c*4<F0<hSX)CDeLTK zs<i9yLAAJVG&SPBeyz3B_ms|j;~mV=SKFDFciquhz}TQ&eKkRI=lp1OjYensFW-<= zgS|?WW*gTkXvo{jQz;p;a*PlemaP}<6F)ENzBA60pWZOYeHypL+@+N9fL)Z)LkS5( zXU^pIe{(pYXUAGQ(LAlxww9kbEn!ZzjiYx(b({5*g)erqYRq1R3!>~g1dZpm34NF< z^))y0-$$-H(aM`Xy^CYCf53Ex!T8e6ZM68T6H2|@n~ad3#<WSU*7|2#jf_4%7Qrev zWwW+sunk3)A-cXNIGVRhy;NF;oMp&lyV2p+knYzH{F_g0^%6KLrMxaXoBq<zIQ>b( zWwpnfrf1#n{$>2mp_PRhQ^}4Qf-J+^mlM|CJ-GMr{hd3<9`1>(&OY&j%Cqa4ZZAul z9E!)((_Wj;4J>zE=U%yahjsP-sE+CbQEAm-JHxBC__|lPI|RO+rlb0r+UZbS`P=&Z z2iMN$C4TGhYkd6r+|!8;+1IniGT-(+&SdgpvI3LCbKcN{p1Pe3$}7_FELeS({Yt=& zf5$%;B`j0OZL;?_?mU<r-G47Pbu8~$0PWGWRK>U;b^2o6T+N1SQOqso&ib|A2@PCH z*;*^Md+XV4-(YMRaNBs!yCSV!3*9Jzbl3hFFGq(T3#^q$eI)I34N=N3Kj(Cm@rqv* zCKug*K0hvtT%S>yvwg;JxqzyC@Lj0tkfOhWT}&r!rdbVX_3h3+{q4y$7ZQt~enutz zbX+|s=T>0M`xWbaHTR_$&CD$epHoqlXxXA(q`OI^rhO$UgXPQanR@y4ohd&IMr(}! z7CaKMWV~%z(v5b{_0#+BI*tuh?^f*{{<Nko{z^^vrGz5oogTNi25-j~?-?&xuqpGA z89lI))cRdT=ibv5V?vKgqvGYR_P<$$&D{U^rh311N7Lp@?!}ejv`YDQU+OKNG@HR| z)r$^aa&x9XbvI2*OQ)S(qTcsyNb2aj_mNuJ=dJBBEY2^~JF;!b+Ryx)f}Ap}FCB_! z)fUET?=yB#A9GlyB3|;6BByz>o3|#b?&ExJl>*7X;kN_n1B=Z?itH(o4C7&z><|6! z9ZaqBZyB>57GC}O#oN*Y)7tmPZllGmj@8Pm^)pKIzQyi;GHzJqUZkn1<wc#!xzqZJ z-CH&m{7wGp1V&kGMntRX%?`?;1FEV=52(roScLb~-6*KJQ0w+KbVX2g(AnCytDByT z-r3b7dp{vcX>N0j+8aAJrq(_cbJx{=vp0OiaK8L~*F5?Z?o^u4LAhhKa?gzD>8-Y` z@L{%cx^9k@|3_}qQ|8q~u}!CS#153zBo)cb6F%8{pIg~AJw+xk%hufVe6A(uB9);T z@U$~x!@*ic-286Qf>P~s^6|4`XT;4BWvOw_Ms|({1!dJ8&W)%t{xP_IK_jCj<fU<A z#mRuGhUVbPyITue=D6G-r*65fdDi5SPII1{O6qz)YBNtLyLDfjPQ+o}l=Io?>=wlw zlGa#pX_jx?&F1ZDsTx&<>6I!$FE_nPs<r)`-?oP0De^y_)|-@jV@Nkwf8gbed5z6^ z=bzmS47%2)9h};_Kla{-wVCBZ4JrfH<uRn<-nc%d%JRl5g%^aONeOMi@I8S$CskDP zqHiewdiXr;DqIDx-jhK4IQ)XL{dS6qn}|h<^FQAfV|PR7)3dIzSvjeXYY{~%HJ}X0 zUCJoeJ{WmV>qA7UW&;1(a{Gj5%z_z>vm7-Cnj9|-`R`2WO&a$TUH&1ct;i~__Dm1| zrI~3?dizOIDl;|drZcssw6(vGq{GW%Z`k88CF<)Wom1JJvdjyfR9|}+6=wAvozG5R z)b!1~Kz@EIr^S^SQE9M!Th)|VR*kXxMlFv%ji?tm23PHgPp^xQ6pnu84BwhBNSYHe zm^f?WqiSt>uxoec`Qx=wi7z|b)+sY;HWXM^IXjvsyiSu*TjErC=xOJZ5l&puH1)`V zvIrYf&g-;!cU}d4<kXv`E36F}E($kkEx1bUQD@sJk5)KM6@4*2Z_NuM=kr%RXW#vr zV%}Ql!n9;YsXYsfQCf0rRMzcG{^;t@I@;oI@T+53E^pVb$gMFd59vt^Bg=giMpoUs zyq41K5!@OQXjHZ(?p!`qI8tU+^QiT0t1q?fcDAOeLzkgqS~A<4<!NMpHBu`$B!G4> z%(UHl->+|1zr0)6*_!aSS<$)Ub6L8qpdywbd?!|X5SBGCn-tVAFw?2(*URa3*=^C? zL-(Ij$WIoiPz84CU)x1$v-T#k*5+hd$Dj3dy0klB$@}tzg&rF?c09dUE%Vr$qhH=P z?EB0+i{?Gg*;KUF#d*)F(na!DQf$05yr_fZluEO;&c)xA);1~5PgOtoDs<-ToAd3t z8Ly4lTgt``Z7%E7N_b5Yx!f^3L&;rmcxu<;hKywH@xW~5wLZn&K|dC^$sQs1n&fs5 zxn3~oPxrsje(!!)Th#1`5sLgtjnAh)nzBYXIyE&SljTDvX`kuH*3~hMx12I9WR9aB zW9HWvy)<tmM7{Uw;OFcdQ~T*`K+V(jCvVj>x(oZRRu+@;Lxr@${y+se^Dx!@#>&bT zC+7`28D>_BA17ta;b-5s%dUAb?FZ|QSq3r68<pU(Bx8=!{8>H21)}-=2@hQ;$IP>} zo+mywesglGapB4JdN)X(>$Hrm<ZmAE_~pqmjjpvybp{JeY}D*Xk-cGsLC=*wo|khv zeqBohjo+g8t97mN)Dz-c4juI7E}qsb#V&;x(V`j!A3xDAKUj101+iW8`@{vV948I7 zWv=mJ?|YP&&L(#6{1{G&C!L2s&I%j)^qeKz-q(h{!2by)@)2+Jz-O%bM_<_Vhyxxm znZqg?UR=|mDvn0|S8v?gj1Lr>+bMAu9ozEK-kx0GvU;!3?l%k7ZkrcjJzvX58S-ZE zWb%jG+qz~7R2MmqTioe$GWz}pZ!tHH)Gk~bIJS<#>70^Z@?gn5-$z<EJL+1hJbP*c zPDajYTg}ROqeUaTMFnv>2j(SxNOVq6n%8(?v1jS(C%L0f_p+HS#>t9qkr7o%$6i*3 zw$7#O9V`%idD*RI<)-UOyY?6u^{@0}n9na(&S~{+nO-sWUU8qm_~BQXO23Gzij#ED zQ$3p0bhlqrFJE{0Lhq$r%ctpXjP7SIW%YQ{MjcImGqj#MoYLn$BWmd4oxqN3_3lkk zzF{2x&s8(BJ}(iqE%tt<JtMrr-Y9O=<w>-W(PirezAl+QA)WCq>-29iN3X9_Tlqat z|B-4G-LvK~<*<^G_J!I&d&XlA`}VF9#s2cR{<YuxGF7H=Ro<-Rzo_!5{`IO-^?RdL zoi!`#vd8a)d(8dJZA2}>aDRUI2jkJzAJlm%mki7v8W}bn`;1fFdpU&m>6gx`eg~2p z@BBF0w&|-@RuJD!>9oxH=2;JpYyY<T#B9g4*6dJ?V2zTS;p6U?wsy^mFJ#3#WKB7B z@p%6o*R|?Z?j2TrjG(%pZ;M|zL{r7rZ-v%ReaR|o`O0^e@9h}3qd(HecJiIu{8T*# zZMBT**98jH%?7PJ_x~tXN&3Pwvr=~K^%oh2O>BAN8vF5dooZW>TSqF@_HKTZu5IQ? zbN`J(J?0#WOoef$f@4IXw(m5aU51VA{MY;h&2^XkyMJEcX_yn4VsiCvaNWSFZRJOQ z*gC9p%kBN4N^#{TyHe&yJFV^g<SnU}zfO9$ks?FAep)#Db@_f~s!c@Y!L=!kJt3(> z(RZWXYOV^e4LEkvc<Fs31MknqM7ORRXxLYscV1f?!%aIO)GYkaDQEYpjna2Djd{bJ zV^-y?qVwsNE!OO6_ocRUf#w@ItEvv)uKFtqw@YST9sea{bFAVi-6+?#3v{)g#<(@L zG+ytWJ66q!TLpv11Gr0mN)&RZFO4m3`yyYk<<zv{il~lXugG~;o4m}nm{&km`Fxi~ z*CBxu=jbuE-utgoTML8Y23?gRRBk*W>DA_W+pgYZLT@#wt38pELA!HfhVH}t@Cv4s zOu@5<ZgTmN>&NVJ+sn=?+^*SnFxBt~Z@>L3=l#8Dsu!OAAf(FwmhNG<&n>OLqT<$D zjVYmmqZR&-SJ!mptXE8;S)7YgtMtokcV1LYcHQq}WAQ21<_xz)`JS)WP&?O1?!e_t z#)s3XG7F~&Rhw26*uSD=xHl!!=UN<Grzv9@)XmUl6wjo#Kjb&9e;;$&ZfZwYj&{+u z$f_$zk@acp#16T&H$Pa#bQ#ZBac71+J-cb{fI+Lv`&QP2`}!@Ehx_x}_j;(PFUcKv zx})ytwT^7@^|own-`J80#|U=yHH#$DLS2%~?*3H9u!5=Bpdh1EVLzu~<oLlpnf9K- zcSE;|tUk>e`-Wnp^z*|<ofh^^zY2Cy%SAtU&TI^vXVb5ilzn2!f!y0wbvnz^ZqaYv z&TPC~$1U4m9hbHw&+vNSLHF9ZABS{4kXNhOOj_SX`O${{VSS07&(;)D`jr&H+Yq&Z zjfswG#?_3*Jy9w3b+!?vD{r{W+_hkV<&?{}>?62Nx(R~hYR7N4zOFp7@5AOCXWGRz z^$J-&o(;6M+}BQWLG24RRP{t{Vw2;hn=yiw0zSk!IkwsasdD>c4NPPsf9N@W?WV@P zdvx0I`l8HlM?LDYU1}L7hv>CszFEaO<(b22J>xQCSL4a{Su;e{W+f#hO==Z^>!}rM z?$u|!Hz7UP1+Q{=@+w<=r~RZ#;;l!u_Irx2c~<2PejtflwM`2K(+}5N%k#QZ8=w)b z;$~GOc2H(F9;;S+ptr0o<MIXNiUeI!g-xZP#Kd`?C~tKlnX1wy<86^K+>)AJJZ&$l zwmP$e!K3l&zBJ6v+_{WJTed1yV`t>)p5YJ;6UBHkw<O25HMnovhq%|4jNmgi<cRaH zdL9k&+jA~Cy&k>d*Wi4)O<|prJMFvOJ3g3wx#4xL@vZ8>Vy<q~nq>QmN6Rdat#F%p zy(rk!C?c)?u!&KlAi!4bTr6o|s!y80^Hdt?$_0U*_NQ$6IB9v;cY~yw#lMDkKHKkH zn_#bg{k}<3+Cd|yvNi4*jmy20>Gw?Ab=>ct$lcKum#vsE!$$veznS!7%H_s+++WKV z-sxO4&Q{v?WBS-Dx#S{qjnTr9oyYrR4q7)1%*ZTl7?>uORlLbK(xfKyusn{mD$1rh zH$+g8s#&DHQoTsL>O}j~dG`wjIu7wvG!|~pA77%`vRJQym8qc7`b<>RG<f6DjDpZ{ z<5!nbKMV=uJG}j4>wUh7t+G`s)K=f(Ff~-y`+f3Q-NXD3M#Y_P_}wG>mur^uS#x#A zGu^Fj<l5_2bgDkwa#KcoO$H;Zm?5W;>N~WoSfIS=M<<)|gIt@tKbMlTQZm}jHo^_D z{y5qNPHoQBDS?l_st6ObPf30|<xWcf*PcAP*=%L`&%19t_0HPfYn8p-e)s;HhTjZ4 zuG!#NS5_G5JvMWpi`-nl3_<KctM?06%+qyq%B1aRXs^{eGo60be!VTrK}~N(U$DyE z_@qI*qc>aicG>8CWz6O5J!a7L!whAWr?ZMIs)zileIjaqowC(*`1JQr1e!lZ7QYVY z<StEgTC($0$zXt+akJZ~M=y)&RI_wFOHH#W#&zp=k&3aayMD<ZcwFL>I$p0nWL#w_ zD$y)5ab7Asz0vx|EQ*flZELd?t5cXtR`rxZZK0gqj!sQ)RuuP=X@Ya!N(~LKv)!V! zB@Ba~c10T}UJI#hbB%c$9(!|0<x*PX{*vHIUyJR`>03HyuN+sTp4%7qZq1+>HRU+R z{zYLm^Ng9Oa<7-m`<Bl)41aYkpj^Q<qHc9$nu*g5Kf^_90=q9JpVypT;yB-<%)>4< zDn~n4AXJ$0Tt%k&T&G@=OSE~>%otr)Uu9eMA~iP?N|sLEpjC~~L%r$y;qKRF-}`0y ze=1TrC~xdpnNXsBv6WF@)Xf`ANrrpFaO3bR_b9j2qh7OgX3@*udWF@m3|AIE`LgCk zd?&w7>2|G^>D?9TZtD*AZ+((JB`7F|^>XcouG`B)#%<aoG-57s*tu5^%$~jYp!UlV z@8&JZE=uu78(3#P?P+rhyVaQTt-I=vYr<*DXRWJu)u}fvT&rQ`r)|i)s%<qIUB5j) z@J_GV*=XKeH>0BQ>(_)eb$zApS6?ap)%1GM3(GPmm7XuWn3pV)`W4j#iW>8I_MI$$ z`}KVc?LC~^l=SWx`hqV!^sld6u10H2W?p0@y2NH?_@u7kEU0rhX_Q%)G@4fsQt{!z z`e&Ly2t>|{Ud>2O4dp}_IybFy^Y2(!5HoaJHm&dNY<26Z(H_V2pXfcpb0_<oj;))v zcFm36i|Y)_PwJ9%Gnx{p{`6PHpB&9lTKIK|asQO=_pi0QTAUu&D8IYz$xuA3VRY=w zMWyR&Tx!0R&lMfgnnj7(^|aDIGPvrF;FhA!AsgmAhl0_o5By5k_swVw)Q)%dZ#gk9 z_=vbbCcCG|!h3^RmND0eW9rwVv%I#hb(z<r`!fX(Dmtw@FJAH=V+X6X7k|E9{Dl(N z$SteO;^+JlRW;eVwwVPUGTDPMhWkDW?I|fIch5f5X?Ine>ymf+sr{}#r$vQfHRb|K z=eDCY2KA=J(}r%zQZ$+q?=Z>VvwIetrPqfo@EDCu%BMU^Wz+LEnz4U$4juY+yZdlJ zijk9f)^xjBX}?e&yeTji)^IiMDv1gn8%K6Ee$L^1a>Y|L5H7CysDE7HrJ9Ep^GPk; z>+Jz?@5h|l_oG2AQ9;XFw){FHr_YZ6`~b}73#-{`kNVmTF5NTeatP!7vRq&+-|D4a z%5*X0>!itr4X*EVB+*sl)uP52!r<Syc_me)Ll;z|HENalG&Ql`5WPL6f}GDQWW5(C zxSNM_9j9bz2Qeb`O3dvnqxI6o;%38I!={@eaj#7udpJokoYQXOV9};{quKSXYwe@4 zZQ5f@KN_!vU0vMbAy;VZV5MTFrsb??tk^~O&^f7lLN{M8(Ext>Uo~hbvwqu~@v_*O z+Sc5@oKX>_NG?`ZJY-XElW+YbtXR<5!6=#%WD#N5sV=04XkF0hp(jvzgGT)YBL$?G zvCJNuj-mlShS;j+<3!s6?W*yQM_#HJm_N1+G%h4L){R%FiF`G!?PBJ{Otn#q9|;}e z$a@&w<ZiPcpUJh1H_TQ~Q_QEfjjZoxwWK$YTZDa{GHR+~`J{e9&GZuGS8WaLW1Z?A zhJJ=>%pe9yF_fgyr_sh~wdr-F#3&`oyAKC`2yArf%9bayY%Tc4G1_g68~WAO;SM%) zjf~fmZZ@5NZ#^E%X3Y`Xd$6;|81K8@M~T@S)*RlvC@W(<7kaj4INM=LwLzF{QAc)N zaua_bPR3JSIG!as-?XLq<F5Uq9Wpj5Ng74WBqmF>Yp}E?w;<=GXN6egM75E37Z-LG z)VT|i>QY+O`%2-RhlxsV+J(lRRvFw93pnseu3c_DS+XK_3D<KfUrGEvyF^&-IZ(o6 zSa=)OQ)hJD>5Wq6nfuuWncR{Uw>j0PH~V)-^@WI%KV-Fy4ty+=uN0<GLra(CGSuL0 z9-cCs`iv*MpSW49H#KdZLlMI<eQurenjHj1C7is_yo@rx)(&xz5>M4zSwpEy@s_*; zW!p&L2wj$}t!|W}!5WOI5EOL26ZVEEl*&>%5=x?<mzGmTT$r`25JvE@+6Qq%dV`lR z_f1A|WVvJKn8Hn62OWVz5qxPpSSy7UqD>y+mIXaFdYJhetID&P)Zy1tII@j$V(f8q z=1aBv9uGPS-P?TOJ+)mO>J4^H{{1Xj73Gt1Mq~y#T8^SjmksQ9XfkXV?<gMi8h381 zE#y5Q-OqS=yZOLa03~O{vqufyQ%kSP_>J+9|JbQabtqgrjTND#CYwzvQLxiV)$LZW z?TjtYEG~HCE6i#THIP0;42Ls1SZ+*}k?Qi3&(D{rbX3cRD|Ge>-<1?ZRnQ01Gz^VY zwOO+MBLO3Jlw|pFMFXYv${woOO0{Co*37c7JnOvd5<9_+W|z*WzTjcMp<;L!kyDn( zPnl1w>-}Ur^+*Ozj4at=TByPkrI|841L<wIK7@;6`U1PNnz{9&wq#kpiKnfHd5rR- z-g#YZ)b)l&76PW<KxcVTiRgWhlHXJTSIkbAb?KSkrB3qH7Fc9*{j73~U9{tslBm_A zhJ9(Radpmu+`61jXE9rzOBIRyDhgi~6jaxY57JfRnAyxY4Yo?H%=XclT^pMdn$ks` z<9_l<GC>2knu_YOJ3?hk4eX|bu!}U^=vI0$Rvz={b8I*<;_>%J?~BHGY>_>EP9&Q% zp71`k$(zJ5X3q_AD7C(zU(blr4l;JMP-PX#bG!T-{XaMl$IC}4*;3fO)~yC@27O^9 zHAOyy#Pl@e84A_w#_AiWuS`lxYU27u@+4J1na)1dmaGPPi+6YZ$P;RcVv%~Hp_66T z%mDjTF3-qXK5PiyYor!6HEIsW4t@kr)Ky_ymqYS5zHO^v{#0e=$gA;O?ReYbk409V zjO+n+M@CQ7SS~4dgwgLYc%C{+zo8SZ)kzns2OIJ&vZvHCN;*S}IZxR6?0V5qq-?gF zm{K@e(AUu#S<_V(@Ft_4KcuFrrWbGUMDKuZv@TC)oNlG)u1M0NnAt&%^W<t;Y^pt4 zJZas`0PQ<t^K0k7z0h2*XlGGp6T*p8v>9giiF#8->P_mkqUJ2|Nj(QkfqASRpOLO@ zJ0*ncY+j;3fA3MKnx9s|YWEx>iGyez$|p5$s8$aNs+{s7elrrrj3uhE;IVA)zR<xG zxgZ@k!)m6lIzA+Y4@=;8F4X{h2t*OUhaDz=BO8BfA0G<I3zYoU{=98Z$r^l!fCaTC zpOElySqzye)fhz~zL7-1FCC>9uOLS*`SIWVs+e>m@vziHl9S7U-}@vUIEA(R1Zalw z2rgKD&)tNCZ;HbA%#)9jaUBE{T>m4!YT+p|elJTB^XI?#z!LgAf<zHqXaMm*4y<t- z@vsN1v0gBY+bjU|#kjxo#chA*i)F{O<l)H^1Q*N~!R7DroeJB~7t{Vb-@nTjeeq!} zOnWK(L2$u5i3fgQjaBfE%4`Yo=!<Fpo$ue}i@vxGvwH{~5kZZ+Ep1B-OY;RuY{z#S zO#_X-$lv+mw!ibmK96ZXfIJb@f7iaS>GyoGebE=|<rG80WM2)4$Nu?`^2K__V+_dy za6fR7=8OFq`_5!v+>ZSU>q_dI4h}q7+#>Ovkbmoob%lKc)4_b>u)wfL^F@t$PtF(X zAMH7S)EE7H{=u>EcfMwme9@2nm;Hs!f1B@=Nxta!*Sh-me9d8_w61V}C)X906_>xO zXJgo=3!wif7$>8E1?vjy0hhn?HGyr|FN}a<=){wKv5l~AV0})mX9&Xg)5#=LSfd|S z?{uhVtZUR5H&JawdrbBP6C#c^VTbnUhy6q9J28a(8(%Ob;@Bu)k+w0`*FV!g_>+A9 z+5WL^lJ7s;Kh{t3{b&1!FZljv`-dO+{%6N`d{`QNvE7QHfe>7<Z%B_}jFPtT<aURl zhVaFHI6MKYes4ES6Vv!dzL+P1$1@EK5nQm%(dQreVjS9IpOuz*^7#z?a62w&J2_ve zFK(0i`a&dv%fIJ~+okF1Oz07q04Neqi%Zgz9>dtTC+92m#X7`%asTi*Jc2s`3#Ny@ zm_N>U{*f={jq?rcACrA?Ou+o$R6(Tkk9={P^t|%dbCPtQCf6016Lp7U8^)tAwz<?7 z<e$c9+$PNzx1kUE;sdB#^^XyA9E`_B{--E1nNLVUQzmKZBu$&7WhQCaNm_1_mY<{* zCTYb<T4|D2o}^VKY28U$f08zwr1d6gqe+@GNt;aQxFykK`Ct;UpjMdBSVumOQ^{C& zd1P-g9zXIFZ;U1uV*8}9G+w%%rz|3q<FH4;@3w=cOz7R9X%qT{nushrp?P!>S#Cl< z_4|%YozTVn@5u5KdPm@CvciPEYj=iB75-ivQe5=`GC3Jb3*#_o+9WMAp>Z33;TbYz zB8-|kX&Y{rz8h=zUdeoYg*Vtl{*jOAvjb%6L>-})o2045m;(GR1H>y$idUJ?xNT<O z88VqINe?w;LT}m)@yU{S)RYPBv;PcPaUxyRN)wv@HP{48>`_xEY4U`|{Dj{?x_n8! zpr%aH)Jd8)Ny|*qvXivjgvNCFF*(q_lKe5e`1TpHdhwsb3KL=6rZu5Occ466NqJDi z%j3}f_eFZWbmUnI(f69Cd{35{*k{xVlQc#2M}D5uejt;BCH>6@G<8DrQS&D12{dg& zOEZ+_w`sqmy{F5ZC6m)7>Ck1*k|`5<hr(GhbwW?}MawG_z8K#CcI0G<zeoxEC-h_= zEKT`@Pp}r)NB*%NgKP*Bvk(|hb-{l^Yg$776B^Uf{1oga*Eh9^L|(a^1ph5$V9>PI z2-m<l72-OfIiN3V)cqcBrx~s332}IilxiI7r5b&u8s}3|jn|k`jpvIAO_^j*k)~q- z+ois+eX<R4zOd6Q)l7!{lK7&=c^&-bC&YWgSqIaRYP6AR%vY*0eTkNwW2E|zc=<_b z!tpuD{*N>#=PN1aMEb<OptgYWOiGj37mU}0k#SNwgng)1fOaz2<Gx6=B+Us;q$AaT z*ia_LQ;2<+*huOpRLdRGl-fu%<|~cYpU@V6v5}-NvB&9v)E?^=wI<k0eBWq!f|l5$ zmb6`{mPBK{g=*yzHdqg#TIxi3B=%DXEh&#gOVS_z-CkWgKwFx=L`%|_YE1tN?U!I9 zX-BEXyrde_mul?K5-q78X*`xks{cq+(w8Lhl6L$;y9f4Np4fMZmXrszbl;^K@9Rjl zqzv~b*`SuDNyHO<;0x{hkiO&?{6afc8;=F7lb6~xL_F?S4N(S3z7^VLI%tpOmuj?` zqf@4j!xmm2OEtEaRHM&d7dn|DOC?e1A5UzMglT^Y(@1jK><I(hPA2^^4$(;zSqe#3 z>JD!KrO3*Fz0GV%6ozRe*~$Je|HQBdk)ve0oc0VSNdX`|n3JjLnn?2_!m@vaVWh+K z*$cg-{*v?-dJ|zTg+ii|6!py|$&t7e8BBpb5ri;~l=3(%5DOPZ6dH-9X*`i17miQ} z)2B_8hf7g}u!7-KY-m^{VPzxh`O+|!SHaNCd2(1$-}IBoVH$nPqCbaCmrR7AG!&A` zgf*lOAu{Rr>YNBKlNiHa+zvU;l}1SRSB63S@CroIiT%^~JprB!)<2DIHsQe~+JmNH zzF3k1`qM~C29^u{2vbQkJK_gtAWD)xjXq1VnZ%=E{nF?T6JcyGsBhNfundW+#kH3d z0k_MLXgaoYc!UR*kLV8zB?(CKhx(dG0QZkdQqYs`k0gIZ{iPH6@nAa{Qj{({s-(TG zq}w43TWJ)!BnG#WiML!!40zC6v45CN*o%q$R2`R33e!lc9BIU*&=lx#B+?oHuXA`Z z$BE9Ldng6Yzi=NE{osHNmY2kLg`|-2`Umat#HHDLjIe(N@pyfM*Ez%q4OY0}C8UE< zL^@!vTzh~B?}vPG#<LMO!cF7gQAs+7A)W?NMEVe4C6>g;K|I!q)Lxk)DbHMpmzTyv z`bP#N_9IXpydIL4(_$k26R^kYEFvASKQkh+uLFC$-ur9$6Tu$uX$Jy0Amvey6ZLWv z;_(`gh=+8l&YUOqi$u>SkFxT~D`6X(o=u((piXCHlM#@ATCnU`Z_)+BlZ|j6uziGI zrxMW^Mj;KO{p6V=hX3e2lIuT+BC!ui{H3<sNnuQHav1ZQ97dnXVQintVa#uG82iWM zFz%l;ESV8PeN5z!Va$JW7~>{~F@I^8s00WnPxxaPnH)xcX&5B2#7)>^0PQD-(SC9m z^OJ_9b;+0d(<x*aG{_`RARQ0_A|R3qadKo5{V61$Pu@|QL@tIlyIPV&rh{)7ggs$> z0@jhRJ`3w$SYO2T;Z$-OtVLk|0M;ake*)`lSeL@O7}j;L7Q(t4)*@JwUx6L?(P2%8 zH4D~kSX;rG3u^~h^I+``Yfo7F!I}^2AdClpQZSS=63B+K!;%j1xV{H#6hFfn>xGm| zA>%eY7h^o`htCno^)QBi|NJ9PVu!Za{=~wjk}*Au!#+bSTq+sUo*akujcFmc;2Ptw z?y)~(pT}bpk6Szz@wmfz2;O6XLywrZ;|ULjFJk_T^8>ukfpZKtzyXW_6TlQO1Ev7x z02i<Y?0^}-OaRXX9|5xg+;1Ec^Z<PTe|*Rg!1)LZumGk4mcTS%I)EdyHDCkS19O16 z0G=^$+{aUaBY>x19^eeP0P}$bz(U{?U=gqwSORPWJ_9}nz5q4>n}IKZEx=Y_8*l_T z3LFED11Er!KnxHI!~yYuE8qsW12|Lh1aQWIvkW{}tN?J_3I;-eP+&W-1K0`d0=@!v z1ABl|z-i!H;5*<9@ICMYa27ZRoCkb>PXQd4*8=N+^?)zn2k-%ZU_THBgaZ*kBoGBe z0|$VEz}G-BkOHIv7l4bvCEzmfBX9+{3QzzVAPZyzIY2J(1b7Pk3Ooaz19`x2zzg6d zkPj39g+LKd43q$+z$@T2PzJmK-U8*oJD>un1gd~)KnT<VbwEAP05k&cfhM3CXaPO| ztw0;l4s-yWfC%UUx`7@54-`CD@d$>|hqx~*18bPTl3*kv$pZ?2BA^5)11f+jpazg~ z@y{Q}8xep%uhqNB!KIS(E7sTKMSgPNe^5(G{%;F_ZT!D+`Cn76zf|1+mU0or!h@7J zN{L~g4gog610r!dZpQLrAN<os2;;HvUorSEy8ovO@IR67|DSncJ0X}S&J|wtnv?z+ zE-hq|5TP-R@YkG3%jaAo8Ht;K&P*mF!L@D##lDGTBoDSDQhVw8uYP}xZ(yAyb4^Z? zgN;vO(SKk344n*A^$NAmtB0wamop?=4YzlPwHh^yS9!d#Db9YudzO>ymEDzjJ2N!P zIOq10(r2MBTnag*Ib~htA(fo!uIiL(ud1$hDQ}`na|=@Q0-kth=KfrFPyJ44hI2;B z?f84_U%1&x&soLc?|kdS+XDxxNr4I-bXA>L{UD=AmdL2Yz)m+n^MdMp`2*xT!!vs4 zcTiiNG$hnU*F*`D1=%%4wLuLrO&uS?I@-G&`WyzUhYiQt$HPgP<U)#o+Cfv54U|(= z5GZyiTdQqjoYy$1HC<;O^Bi*;vr_x4<`%{lmFx0bsrh3DgEzY~+tXTZy%#qWH+a2| zZwcwB>%BdiD&wsds+(#OVCDUhv17;r#*&O>d{_E1;UbYs<UH}rThlvDZ1ii?os@3T z{KS4EHG^3LH3Re^`bhGaCwyj^O%us*WXUoql&*2cFsC=T-Sa)YhFvZ$smZtb&HB0O z^Nzg2{PU%T6)N>(Z6^od8<EPY+8#zVromH-r*%!snHp-Q&N9(?rSgQje2CV$pz%W0 z^0HS&Ciw?ml)g|epp?Kn-m1tAA+5sh;vtckE<;j?QxYn}>t2+-6v^`OGS1W}aum#h zy2-a`b@HLAE?Vk_sb&e*39~u8+C@?B8OzzL(|x!;*(-y*JeFn67tal}4L46TG}81_ z%A&@O6%Q8oMfH~S-tMm(nlZkD+ACkCdP&nvPmA@5$+uHvrhaW{Hm%Q6)AFuG{giss zSH`*QIwL#7QvFoD1l`-rI-PFqS6T-&U#Z`r&sW{9G+(}l_6^y4JYb}DkUl`~x9N8r z2p=jKbs(RVy{YV`;h<;8Id2|r6=-Mk5g)$q#<2IARmZKfOfXT`&t=rf)r}eVmV5}Q zV^?y^ii$f6((*g<6ANQX!pp2H+-njW3R@C83cIcQ69-j?eTUPAR0r`Jeu568R`;gI z_2-3Fg0QN>N~5aqYH>|OJ*k=B9@XPK96-*Mx1&evL>p1e>MSW-+nFJ=ljmg5Et-34 zPWWucnJV0NOBJ(|MkjR~=mqlI$nL{2Jwfei&B67enviNnRZeASm9Zc}c)Q-YiP2ip zf#3cl52g%x4U>oC2RZ#Y-SHhcE%6P`HJpl&vZ#{y!rJ_ld|^R$u~V5%Wq6(7gH><) zSi4*S!%+XcNxNk`*LRkYJ!?*oJ^LenyAZ1cb9IiLo{L7Ra<r@+Id?Q<$aa9;&+2Cl zbPR4ASwDV`JW6ww->>AV`iNeoenPWKYfQUc=P~oV?oGXFeFwvKqXKr7ahqw|l!q4j zmcy2o(~emxPW^t$5)(a^rQS8o3e^$$wbXgz?L&|I1-&u7HGMUMkz?spPbG$CykUsB zzpZF)`h4CpzE{yoC!Z`Io7I`iW86CyS@RNSpSQkgW@zZ96{gxQ|ClyLPK4Qa4B4HU zD5EOxt7xRGrqZdLq@<?6k`aq*hB~{$TU8qbRe^6*N(>9CUz~U`J-@1GUD=JQWsORm z>xS~FRVveU3|V1jg;U3;)l7?+T5QTQB5Ow}+ft$jy4xuA>J<s4Ir+7D<ma5{?B9y> zMI|=ntQx=f5$)E!M#JOdX%tl%Ygw^O5v_*eN4hn}8et6;52Ozi4|<Mxij!$vrDAoq zzR)Cjx@czXJh4mXBG$4X*UV)`OTrgeIj;X`o7GK|Fx~ZPH)S4=w)cj2B)0gzuYvEV zCcjT<$!JgQ));&;wt;$4exu4p#wpF$+NR8Jm@}9rI?-AQ8UYNBTCH-4B3Z#-jx1YC zE1~94GRPsMx^eZf(qX$nyS}=v(2m*<QBC}Y?AoH5TY?zD$(r-E`3=e~t{wAw9}S-% zyUO2C-KOcND=-in#j^NDk@{qvTDreNDan5zq}{7N<Q=^@?zvO8%`b`f(r&wFgk>1s zX}?$S^ZLwfPj2QF6r3zgdo%vdw<@iAyxO`tymGv}u*|yDtuX9G^|QxMta8G#9%qhc z`eqmAdORz7!7k>#>8fHhgtpdo8xO0K6XZfw64Z0F$$DG^PeU`_Qr;=vRA(QTXA7E_ z_^d1n*?^Y`I8&j+#DoTO5OO3;S){?4v+c|l&fgohdrM^Gy$5$LKYS=Tm9!EITyOpd z+vm)i&0e^0&z?P>@7Z(bZpIIH?-miu0I|Te<$tifc{6;U^2-?VVqiCL1t<sPx5SX` zfla^}AP*P>EVjmweSjmt1E3jTZUcW{H*f_g2jm06AJ_z(0rG%Bz#<6zfg`{Jpc!BW zgFmnvxB`>|@*&_4Yy!>zdB7lG5eojm5#RyP3^2EYKd>9P0+a*tJHQ{<1e^i#fI+}w zC-?(LfCoS`uzMHy0p)=FSKtTa0fPV&;uZs&K%W6fP&ZtF55xi4fCyki-FO0#Ksq1< z=ukI2AQ(sniUAVT4Hw`8aX>a80@zSDo<Jm!4hR7{)C~^^29kkdfCP2J1^7T5kPV0c zHq?zL5DBCMLVyl+!vlhWWS|%zLEUfxJ`e|F10sM8b>j&{0_lJdphMm8fM6gQC<aJS z7jZx~AOhG>C!T;1pznsXA&w73LO30;fH)uE2=D-C2AF%GPJ!LP6`&lD-wX8)Yy!>z zdB7lGu@C%#BftZo8DQ=Qe_%Io1t<sP!@wWd1e^i#fI+|_9Q=VJzyqKeU`BvHup77n zlmqgS;16s9&H#D9AYc&%{=gC70niLEqro584O{^>9R+(}5U@A~_P`Nf_i@+`l!J}@ z0Z1R%1e^i#fI-0GAlL&(fCoS`!2BB02X+HjfO0_o5cmU|fHOcIFbG&227llP@BnBA zm`A`L*bQ6($^m&On>}y_*C!wy;0%xlERF$N;0jO<$j5>Wa0V!c^2>wG1K6KtfC=Hn zz#zm~oP@lABftZo8DN6H{b@)a0slN;5U_{?Ti^)r0B8o7@sJj<8@K|L1M&&r51auu z0fWGiZ@>p=2AHS77AObgA&<qdJ_GAKU=XnQ7V-h|z|R8geSqCy!-IYo3?u`^015gW z7vKYNKsF!(*wE)Zfk+@75CU}Qb37mzNCt`l67)GPzz5=hY(NCCq0e~&kw7{i1nAJ` zct9|a3={(-=yP0v55xi4fCykipYsGFfpkC!(4o)qfM6gQC<aK-r?>zghy${LNN8Ij zK!<kX0l`2r5C`p*4T!*o4SmiNhy>CBAwY*d#{+_aWS|%zL7(FSd>{_U21EcG`kW^a z38Vu;fDV0*2LuDjKrujqKF0<4Kpc<_hyXT}&l5<;HT0oKARQ0_eCRuIKsF!(*wAl0 zfpkCw<!6IUG3*ZsG#B6lbm((DAQ(sniUAV%asf~150MD?3jsRxIUW!UBm>0&3Hlrt z-~(|$HXs7n(0@FEbRZI-LqAFeiUAVzCoYf;hyXU^!H0D^tc3s_`X3Jn287_t1D{|Z z4s67d(>v*3Ye_}?Z>a|jO|d*vtg9#1Hz10{Vsng5IHqP(%#AIkT8eGN*5X;>*<yR~ zT=6`yqnIaNgm){%|7yqoq5jPGkETQ(whY*CMEaxds%O-!qUa2D4NWa=9j30HzOjiB z>kyl>-qdW`^wrijw%kBy*~0-x;78z<6qTjsnp!$wd*XLn+Vm-__XVPPti!zd3uoKA z#C@`8@s^lXlAenGiprW>PaI;eH>FKqz0YdVV%!$A%r!EA_;Gnin9hJgK&p~NO;=l4 zL*}zT*|_=3Ein@vepzI|#E;Q~Jro-pupC5*O;;}m4;yZv%c{)>COr85k%#}Zv*4kB z2s$Vf!9Hfy;w=;DO7;(a<o@5=znK#|7(aOrzlm9OYS-C`WQcm2yq`1oS=n;!7cHK! z660rI_5j}eI@noo9q+r&gd49^Sbw5OA)ZahRuaNj>?Hr-J2u2W*gT=o@{i{(FrCTw zZ>{m88#XC}Fq-&-HvedeIU@N+jx2njfoa@@Fs80@luX<Yo)4b}%0PGltnu>-G9)Yq zYYJS4F=361^L#&-g%j&#e_2n&uUaCB|9y?0i-F%NTo2BKKd@Z8Mpd7=Dr&a0tW<bD z4gTXoY?nxkf-i!=GI=|G$1*Z1`oO`j4;?=84Sr&F^z^ZBkAHXKOw9N3qy$oI9FYX^ z2i{AdL{o;>AS$ZD4R1Br8F;^eJnSB1fL}3z1zvYR+zKb!2y@3ek(LV+Y4(mMN`-M) z7&{;i0_=$}#!I*1O<G8rCMyRE#N)Fo)(Y^RXy9wW25^}O$HIC(!2g@@ZHUhX$^o>+ zFqa|ueu*92z+D4S@q0^D84{T$<3g2FBvIrQNn`~@3dZANK`Q?=dp$Ch6zQ+I8Nqlg zFD|%0xW9@RfJF>dG#T6`=>w9_{LoL5vg9)a{Jac5H<MP-WZ!?Jp+PYlV%f3b8*(}z z|2mt9%?AAx$OEukcVYbicm(i|enVaib_e6XA*;hS4M`G2S)`w>CDTrjHzq)ufY!uz zTtT({zK}IF)nFI@;UX;=u6yAR-JCEZlc`i08Ej9e2&@bIu0I>V&rh(N|A)Oh0gS3T z7dU?JkU+v3Fa&TN6)jrSun5SSkcC782}xM=*$yF@kd$mpCJ?N?1_cF0iy9RbT2O0o zsYOMlY84bMw$$2+K5OkORa<?wwo~hS<tZ)i`|dKCgwSWpouQ@wfs=FQ-h1xyyXT&} zpXqI6Nm`%g9AV|t{8rFE&ZlXJILnM`UJW|_9vLZ;@>%aUn7$<a`El!`*>t?>ECX0^ z*ZWKEFxp=~+FyrvEp$Hhqw}aA*Fe{^PFu^bj>Al|HFP}gI3y|4?<x1@|6(50f#j2W z-(6;bgc1o0B(zB=df+ZIS3-e=;Sxql7%O42gl+fVW$u!&SHimzK9-Oq-P0xL_#Tw} zyCl3N;bRGXrT=gVlO>c(sFSc#!UhS}5kxnC+RQA|Z>E_kW|CERbTde&PCLv@v#;6X zkn!!42cNgfL+<^}er6xD*CG8ojYPgg%mLjFv)}yK{H^(x`LubtIn|tEPBO=v=b5LN z2h2a3KQgBslIJhxpUqFrKbgNbe_=jrex;*-N2=4L+oYVi*TeK_wH@-*MPDf)?m+wG zj`~)4(xAUQ+0jQzYDAvwaQkU|K<;+`NS>B(F0aYG@Lw3u%2NS<G5&0PYWzu#(PD=_ zc+j1mPDlH=<BvGQY5yIPZj<%t6cgDN2FY_F7s@~TGxWi`%n=eMNYF0pWc_cFuvNm8 zG$Zx66Yb$rq<>!tY0hvF>Azos;e6jA=~pD|({9%1M0tK>vOELwZ}RLzt90ovOM9|B zOLDF}FET~GYo$Iws^cND?>a@k>+lyuhjaVePod~GU~eHiWO}bi*yl`ly~LX&Y;nF9 zNL(UezVm&Z#O)H=B&?ROKthuQeL7{bJbiJ6@m=F-<9}uR1LU9II92u@qm69&uJgX! z>YirJ-!w@dXLL8dt=9N7|0yztO!+s>nD8yxRwQIekc@_3;t>)uo$nFNBk45fyFP_8 zL7qBkkrMK-^>jq6pUy{Dzw_nUoyF2U*6k$uK1PDZcG=n|HFugk#G>`b+l_^iZnM(+ zV$wQ;x&|iP@XiDclI-@Q!|8Y?$gWz$;XXQ?t}z*x75>_ApJjZ1k*!F_smC0L8<*R? z^A^(aP5Vb=raHQGPPzT{cak(M6Pi4E+LS31r|4&@2K~t2$y29JnmTpj)Tz_5v-74; z&zU|wclvZm<WHVFW%A^yl56thiIXQ!nml>3j>k09()te?ly=;41Jlz74IX@)d>uG& zKx~(cjBYx{4yNOY`Q0a-zX{FlX8YzfrpB@1#HH<K(Xw`PyM+A`CbYK8b;@?L=B_p7 zyO*`gHOO`|>+*JUt%UFu?Q&hG-F#od{C{tkYl-b<orEnC_B<=yB_6p#hPhJ4d6mQ( zR?0Z9Yd7DL@UDcmwGytE@vW0#ZfrMqN!WXn<du+qbGun0VT%N#UB;#1mUc5!!gdKe zBoy7&ZkFHKZr&r|6-j5VZ#SQou=aN8FX4?l+Rc;=?Q-3=-E5V#U()M0wwqfeWPYvP zyi`Kw*W1kln`IjR&!_4xb&zF{u=Q?P)_Y`H-)J|RB#zDcv3wsX-G|@X(LH60<cs;f z;hXK|2I;o_K6{u2_je5Y#<x4tI^Nwf?EHttO@`esaor;w{kKbc{-ZJ<(!EOJ*!lQd z(<`^hJbzc_NkY*x?dEO?MY0~(O6V&i)8mib67<+YKYGsK9xLi`NQQQFK6-qkpYtWS zc{QK=Ui)XstF^hCH}<{d&yrW4BXslnrIOHNGW~p(ypv=&Jyz2?NS8OuIq1^7?(vo$ zqsA_;e6>E~<gX5=d1K#e*KY1H_^FcaF0Y<T$|1k?%w+6)?V49-L63<Kmv@5n8!kcJ z|CaaKWpJy;*St#f_vFo#d^%lSzn}G;cp2P!hE((FbpM{bY9*759&=05a&lIe)z5Wy zR=*Bno!@C*?dBe@Yj@4(=GA_O%d5lc`qyd4zN;O3e69Ur^XqqaThY8a{=?<%I_<7` z^?U4l-hXYnGH7(Vx;<&$vn9i|&I!ag`K}iF(SEV>tle~;^;}Ey>U_oKRVz1d*Ljv+ z(Yz-}TF3pd{L%dS(Wsx5I{b8XUNo<cJ2tOQ*Ufvl>1tkg9p%Y%HNSpzdE9d)?bO}! z%Bh@{SH~TjSEuXdJ=}CPuLhk??ECb(yl&m0^xaKYw;`QpttVpNiFfn5%iUdGot|4~ zb<L~O>mxzutGm3~PnS!V$$ckYZ8V>bS3j}KtKYT1ZaW%lUX2fzSNplsm1L*9I(|Jx zsFk4gwOszNrg^yTb@HI@l2o6uG_{BE<<umjEj3xLyYw`!P3<MuP*RNc)Kug4)ZWI| zQu`Qpr}j0rr1mqmrS>-_%g<kz$Qzke=_8HS^h{%I`dDLA`UGQJ`eb8wdX{nd;3{L? z;2Pte!F9&=!A-`V!C_<H;8x?~!Iv8;8EwXi87qy<jMYYN##&>3#yVq3#x2IGjN6Ud zGd3FE%Ghk|%=m`!R>uAEe%=GdyBQA}|CRAA<98Vk8Gp?9wy{5BtMTWIhYjD5M~q%W z9yR(7*=7tJ@|ck^<Z<JKAx{|oA=`}<UAgj+>tIHYUh;08yey>~$?DG)n_6&oYb+=W zF8G>q8fmL<HO)3H8FtzilkO3dPKrq<$E15Y=@nAwWLnntq}!B+6|&-WB5u%iufgpf z8@uaXV+~rCG??;$wHx$oLendxa9e5lu4x_TRT8fl-Z@yq<T=Aitn<-BVrw2`JpB$E zWFD=4c6|M5@=U)IbewKF8q2a<X^B^SPUi13hU;ax&l+U1vh1Dh^t)?oEt@W%4k({k zTTLI%SBEvlM3>9*lI1p6b@*yp$Js+-{kX$+7svYQu<khBxU+YMaqM{AVPoUiWpT^G zXNfyc@2{<IS!c5D^b<QRt4vEb*VuCCGK@R?;e54x>L+%2{#yBUht;yIc~(dz?#4PF zSIKvskM71BI}LZfG>+}=rlVz7%XMt|?XnGZ-KJu{cN&L|=dT3a3Dk@zHlLOG(a#78 zqa~C`Xppd0!U*|yvh#0$-`mU~ujmrXy#Pt~j!6$(V0YJkyKlWs+9R+_ec$!BnLa0d zQ2M#+O^0jRbDP<BtETKv+f#<I;|qqd?_B98JG9783}chbL`lBP$LV%ncUZlTpyL|) z%w5qF|EJHC_9XTRob##rytboZf6=rrCfy?@o#dn+Ja4_39Fy)DlkOFhPI1yTV`Tho zhV{|3FD9K7lTMCF_jJ-a?;|f;Z}x4Hgp=;E$)5L1H?B8R7TA8;PcEqUO-Yi3eXpap z*(*g~5H@?sUkNe~&*@->70ZaNSVpC><n7db@(laCUv}E=aAU>@rR3B2;3rP}7dzJc z(p?7D_~2m8uirJll~2d7Z!YO{jV~V5{1Tf7CBJsJrmx-Y{#JhJKG>SR9_dQ{H}*+; zA(=9Od^CMrOgcR#Jvb(v;iPwLd1giI^^bo22k4<vr)wh8?GzbKi=Pp5@ASlzPCmu2 z-SpGlIEH_^-W;hLgY$VS^>)*Y$PCLz)4rH=kC=3llTJG2cJn+Zzip@@hI#Lka?4OY zPraNhHM_h|^>%Wyjy1Nsu6^xp4Jc{-xMe<Nr(NbxEV|u1^%dJq`^#oxy(6dFaFqnv zWUO;sP4AYVpV;_s9sY3R(eq)QrW=My`c?@i$8^(vZufHz(_OELUF7uBSm$5I({(;I zzb=Q;>O8s2>vq4y=`Ya{EwAR+kGe}$X|z3OyO*z%a<I?dKI?9ha^R$g-g>*)!%45* zc)OY8q@Vt}v|Hn(w{5=N?CGTU-7Rg{IBA`ZUIXYE6Lj6{xmnk4Nip4Y7!5hybkj2B z_SabR4RT^lYtW_8;11_@mrhoHJzvpox^GC6vloq1obP_;yB^zX_blhT4zFcGV_m13 zPh-uevF6iQ^J%R4G}htuoKs_6x0+95&8M;E(^&Iqtobz7;k9gOTqQyCX{`A))_fXk zK8-b>#yZbQPOQ^)=Rsrr?v7hy{jPa*c#ZYDUL}tGE}f#E-Bzl1wEWpUdK;UfLukUD z51*veU#&G?x}-Etk+4aE&acMW-=4OePs^kRz1*(DPjK?-aGNBIaPn#S(R@SYyT;mI zgD!*SE0J#+r%Bi(q3iT?Joa?$JR@Wn9e$IO&u^s-qfNeVlC*23<JEjx4`@(V&DZMW z%arsc2|Jv8I*bml{WaF<Xi$I6mnE$eXzZ7u-E?{y>o7XJ&X2}!J)~(Jew~v~hutJW z$D^@df<26#Pv_4K+CAcouT|1Io_#UXA1B{+`Wm|jAf{X@^BX&-ohCuHsZ>p$(Y9k+ znsH{<nLBn)`<$lRva(0C?V2`F;(^jV&B>FwW5+bvHm&@ljpwJyI<wN}w!Jb<*0Gg7 zPr8e(l^!eO%5c)-BrWCN>V84i&S}R>anfl|l5y(vCTG29P0#qLw2PIMBy%ifR|{Ro z$618SC7xhx|F=8M<fe`RtlQ^*!=H}Pc1bxESwztG%R=q%C-2$Lm1_-hythx_b63mv zb@J@M59Qo=n6&62mB_xg<XY=Frm;;%)&6riJ~&s>a?y0CVD~>bz&Z-l);^L9X>rEr zbui^%s;rehvaR<!sCUI=?HDorWt&P(?w#Bxxo>hm*|+Kel@70WA3J~REnSlbAMBNJ zP;Tv~4(!=`(7^%e2M?Zn(Cv6Ib>P8hNBe$JUFy=*RjKW%UrXJVs{0K4+rfjA(_7QG zrLP;jXK+eJZpNyNof*C%V~3;<Yd=AU`s|<l^oI0X)1OJddhkQi3e#T(pP4Z$<I5R$ zXG|S(^03#B|J%kDJJn0l?@zyD@CSn@O1ng*L*5?x-2XGK?+>|T*hHE4E7PAFyeOk% zx*aKd?1%gQuj_HgU^O{-aFta)RH^fwMq8|hY|9x^HdBpWzF|hH?_Hy}@7MD7`g>BU z-<PxD1;*&!6%rOos5C~U1|?J(qf)Ak(J8eO78#>cYb1P0LY)Mij<y$<B-?^MHP%bY zc8Y8xsn(umu(TaDY*?0TPv*(VZrW!KAJUONd0<C+=)sQkklt?EkOwf_w9g#c$4yIj zJH1Jk$(-i1x=Y#`e%P=pqSJNKlJ}sYX{mp$;jb9>v*X=)i>77XqG_2oCvD}`v^%Yz z9dEalrOTyhtGkRpnwI&|&%)F#sUsxT{g0d0eVCgbZlxcwhOxWbX?u7(9XpI(i@iPd zTdCTXnht+^>Lbzg{i)ALI?K9VYp17M!^mK||J7y-q96NvM?IV=eRTb~pDanpvp&}P z)o%LTw2l__n<38{=y$um@A#gqN$XQ0e`AN&%E&qqw0m36{mSWOiu2X|u7@0leB>b> zqeqV<YxbpeCaLL@lY7cvDQ%L!SFaTLD`i;@J5p17>%m7ipEN0=S*FpupB|*jN51>A zOj8eUtdITOr<J<<U54+`CruBW<&!Bhn`Oo<ul2oSdF}qX6S6<{_m0Jp?=rrWz5{io z$;a*=<+VEsk&M=7*bAX)A+x$je@WPXrEi!2(miY8X0t%TYzY@jSSX=ZLbHS`BwQom zMhRObBu(9DJ|=NriJy`<UE-Y*pD6L066<lt(Cm%oS1UK0<DK+vlGb~L+WqU2)^i6< ze^b&Eo%FXQt@l8+`xBC$;-sIIv>y9t_wPx1s+0baq^CLQ|B!T+lm3OIvz_!ilAi9Q zuaI<(lh*mvYySIXobO3@U9Fn_P|~`}H2nujE4QXUm9*ZE(sXjwW>b!Dtn>g$>o%p` zhe=v?|5o}WN$YXHcGv03agUWgO}gv7CG9>!(kD9Ub0n?T+O+%mlGg24(^DjUij&Th zwBJeV{7cdrM(1C@=<quKx}r6$^RHW^rgi?c^l3U-#-k-q(>niJ>NKtMuO&{?I{&(H zX<FxBOPZ!nlkU2SXj<oAueobl=U>lZG_CV5hfh{o=U+Dx?VcxT-9R*5Bk8v38_hZ= zZgS$V6Sq3?<xc#$>dof)60#)}OIRqONy5KNxJkm-B|ISEI}*Mp;Z+IyBz!30e<h?W zvb{c#@$Hw89F%n~VYq||5{e{zQ9?+<)e`QI@Subp681`XPr`po=po}8Ea6%i$E^}J zOZb+A??`w-!cQdpr-VVZvaTeYD`A?15(yO&nk0Nh!a50?By5%Ntb~^({HKK9O87)V z?=MMtknnj4LS~#T^FLKWxrD_Mu9R@Qgsl=@l<=m6KS)Tak+LIUw1ff)0SQYbTrc4s z2~SFRS;DU*9FTB<jQ>FXMsu1I&yx7^f{kXW6JPAaUvT0IC$4qkdM94u#7mv{GAI6u z6R&pS>z()}C%(;zzvjf>bmFZ}{2eFW;lwXG@g67si4(u!#Q*8U?>g}ZPW%Ta-tWW* zow(;>dwKggak>)^b>dT;_zWlhyc3Ud;_*&A)rs?*xX6jiocIzau5jWSCvJ4&rA~Z> z6F(~Pb_x9(q&|``OoCdSDzTP_n<d^iexrG(#1kfOG#`+7uWV1>kvNhk^`yl6C4S9` ze<ks5S+5^S9KLX)c|hWAvp1SO8)X|P+bHk4ZZ=0s9F|zeZ>04dDd8LmlO<?X?CGb? zcyixL39BWnm9S1iyM*-;Hb^KjpWLSt)S0pOntm&7?Zk{zt+dvidSs--*he1v1gd>c zM*C=YdxxB2-J`M>O#8?<SK0mTZ_;L0-sx8F=HQY*bGRZDp43~D;pI)iiS@zyKq$CG zy3{r-o)`=-4AeD^%xoQ{Au}^mx-SbfEei$eE1DNi%xoQVzMVJNP-Q0$8DB+ZAh<Nx z5DtVx6_r65sAXaE^5#Hg^&)%P6I<#lDkt@>Y?a{_X38i>%cNvV`WfdW$4{S-sYwl! zdWV9I&Y)wZ!?;m76Gr80DrS)Il6q&5^PL_O#^+e0bcdVNJ6u`k3}a2k?V<6c-pdxc zBN#6o^7GG+j@<5V&+aIh-3hT7?Vk3SwdVzg_O$0-duAWn)1GhbIsMR{_B?6NoI`sy z)z?dp+(UcRx7JFJJn1p!g3+T#kLe;+*QELKwRe|Al#;Madg&_fSY@)FofQ_-(OTyd ztE~0dyezmhtl4CY`Oc?v(pnAjN4mO6SsAU8-B}%4)<%!*GB@r3y7*c`Mvsz((P1j8 zqeFI#X0!}7MtXKTP$*_vs&T=X(V3$&$Ed+*yO2cJsT4M6V4bd(rSX{)bihv2Y^)0& zz9fZP?cO>9ElcC2v}TUCRztMh>5SV$>5S{tyB{j#45gci7OgQCbeR`-0G(Kc3~-p< zI+caeJGvB_mTfS!yeZr${kkb%b}`cOWyyCfM$Ogk_M#=N%Xq`B^^Fbg%C$D{*kN?x z?fyE~qja@($$!|A=oGn*;%S$}CMk(pZ2!KZShK9TvPS1bW@L<(U|nltw5YmsHmP@0 z)gl=}7bS1(n9TeMI>@-uqbHm{F1q--SWT5J&SL92b+!f_c2r(|bk%4X>ljd1t5me( zGDnZH2FxEl_Wal>heEnJ>$;83j;1H|uBdO)KDt`RU67NhnWIBY>TR#SD(N^zw~4N+ zuc^MWzCm&aWq@em*D-V~g|%{`V|2$Z%GR2<`l`oRdz;p^I6gl*s*Ytm+&ZpVR$r$@ zZ&an^9F?Q{n#?X$)nSW)yS}?C2cswl|5D{Z*S8$Y9QJsmsb=~Ab37tLR7kn6st8vE z!gWh0${5c(Z&|Z$Tv{dA<-5!7>%8+q)s+q5IvK{Q-<*MB2A2(~sZx4d)mwMHD=Rd& zRph(tU0dH&*%%7RAl4C0cZ1j!fP2g&L&PLyfvT%@ziibD-Q^CqhO4B%waIqZzo}jY ztOFXW_b98TbB5II+sbZLOm;`>@J5rPMk!~ozB<&{ptE4@d7O-$gqkXwo29?j0Cw;3 z*71xps8&VQI*VG1Io+)KDB3^NxG*UFwG!*LzwRyqnSqX)%o!?Xc$rZhXmntVjA+zh z*S9s$*ueQZ&|z1&HPAR6<ghC}*r*E}yA++~CFU4Q54@a`8PnC--${v;Qc8)9g_NB% zCDz>xoML@cN^ES6eBOC6=bZKz>#Vb(vC=(1JnuaHQfr@PNK$Lx=H(5QjV<A(V5qiH zYk*Pt+O<iycO6o;ppNg>_@o-{=u**8Rok$%^H5EVp>T6hYh0^(udb~N2Sb^Gri!p0 z`dOok?dG2DcIr`4RVC-awG9F5z@__MHCkzQ)2pJ@&gC2vTFc{3&>pW0VP)>rt5J3W zRa(c5(ZzE!NG%X<(Tb!~*Ko+8=rs9YYq&$q9f8%cn`Io;4T#;X+kp=YGAa=5)fL3; zb$F1NA-aN$3UmiDN-r!N0y0Vp*r6b!0^NW(9Xl;!^q}H!MOb$ma=6e@j1R4*?bDL; z&eOrP08X^e5cJ4hv+63<UX_gv)wPQzS|gK7G9w$qHNlV$FtWKRSXo<LYfWgRTitib zHfrP;{ij_!4wz-8I}VPmU5Ps{pJ}-o7dC#T<yzR%Y%iFc9|gj}=CE`a>6e2J&*r8! zB-g3z3rY5hIP8I*T-b1j3<U#rN!M*rcd!zy6AX#vgkKJg{>lK-J8I-yK+7B@Cs5~) z8$UsB?8s;P<M!`uWIf^h?uK-GL%Ov;YJcDF#5!#HwvFac37X#J#G0;q%<lG^rE)!d z*=F-B2?Y`sNw`|VHze$m@Qwsut6UqEkR>4?;ol`}l<>5KpGo*c!m#CXtyIE12}>p1 zB4L|^S0#KTVc=z(%}fc!5*j32FX2H6KalW&gw!u@miF*An=>R-OIRi09tqD&cw2&b z`DW8EVVZ<5O1MJ81_@6|cvHdw2`5}3_q!xqETL7xZ4w@r@S22=B^>wfa_wHiYza*g zzAE7%2|twZTM2!>ve`UaLZO5j3D-!tSHcSt-j%R+=SEX*`YE5G=^im@xf2-euJ_yZ zqxXI^rT5?#e_p@KlPZ#4ccol^matDk->d9<KGNCH^!5UI=!Fjg2q1s}0tg_000Iag zfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s} z0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*sr zAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_0 z00IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@ z2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000Iag zfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s} z0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*sr zAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_0 z00IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@ z2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000Iag zfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s} z0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*sr zAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_0 z00IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@ z2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000Iag zfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s} z0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*sr zAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_0 z00IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@ z2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000Iag zfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s} z0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*sr zAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_0 z00IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@ z2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000Iag zfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s} z0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*sr zAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_0 z00IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@ z2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000Iag zfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s} z0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*sr zAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_0 z00IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@ z2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000Iag zfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s} z0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*sr zAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_0 z00IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@ z2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000Iag zfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s} z0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*sr zAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_0 z00IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@ z2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000Iag zfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s} z0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*sr zAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_0 z00IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@ z2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000Iag zfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s} z0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*sr zAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_0 z00IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@ z2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000Iag zfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s} z0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*sr zAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_0 z00IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@ z2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000Iag zfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s} z0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*sr zAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_0 z00IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@ z2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000Iag zfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s} z0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*sr zAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_0 z00IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@ z2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000Iag zfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s} z0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*sr zAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_0 z00IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@ z2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000Iag zfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s} z0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*sr zAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_0 z00IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@ z2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000Iag zfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s} z0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*sr zAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_0 z00IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@ z2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000Iag zfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s} z0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*sr zAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_0 z00IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@ z2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000Iag zfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s} z0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*sr zAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_0 z00IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@ z2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000Iag zfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s} z0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*sr zAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_0 z00IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@ z2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000Iag zfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s} z0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*sr zAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_0 z00IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@ z2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000Iag zfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s} z0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*sr zAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_0 z00IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@ z2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000Iag zfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s} z0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*sr zAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_0 z00IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@ z2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000Iag zfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s} z0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*sr zAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_0 z00IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@ z2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000Iag zfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s} z0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*srAb<b@2q1s}0tg_000IagfB*sr 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�<uR!L^2 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°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 FRI1xRzpxQNWUPNMO9pd) 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 z�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 ?&XNkBPbVv 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�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 V=040a2YL1YlJQr$7ys{n{{gBq3WERu literal 0 HcmV?d00001 diff --git a/firmware/board-2.bin b/firmware/board-2.bin new file mode 100644 index 0000000000000000000000000000000000000000..086284c85a9666a9a8e3562c51f0953801ac8eed GIT binary patch literal 2431968 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�en?!RvCpT(Zg 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 N82j^C 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®K}e&W?*(iunwk>6}9 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±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 literal 0 HcmV?d00001 diff --git a/firmware/m3.bin b/firmware/m3.bin new file mode 100644 index 0000000000000000000000000000000000000000..cfd5c6cdd82c52a14aafd9eda76b4cc0f3a4dabc GIT binary patch literal 299660 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%0A54|WV>Xw2H{yW9LEp7 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 literal 0 HcmV?d00001