[
  {
    "path": "360Controller/360Controller.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t32D94FC60562CBF700B6AF17 /* _60Controller.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A224C3EFF42367911CA2CB7 /* _60Controller.h */; };\n\t\t32D94FC80562CBF700B6AF17 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C167DFE841241C02AAC07 /* InfoPlist.strings */; };\n\t\t32D94FCA0562CBF700B6AF17 /* _60Controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A224C3FFF42367911CA2CB7 /* _60Controller.cpp */; settings = {ATTRIBUTES = (); }; };\n\t\t3B36DCC410B7816F00FFD769 /* Controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B36DCC210B7816F00FFD769 /* Controller.cpp */; };\n\t\t3B36DCC510B7816F00FFD769 /* Controller.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B36DCC310B7816F00FFD769 /* Controller.h */; };\n\t\t3B36DCCB10B7817E00FFD769 /* ChatPad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B36DCC610B7817E00FFD769 /* ChatPad.cpp */; };\n\t\t3B36DCCC10B7817E00FFD769 /* ChatPad.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B36DCC710B7817E00FFD769 /* ChatPad.h */; };\n\t\t3B36DCCD10B7817E00FFD769 /* chatpadhid.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B36DCC810B7817E00FFD769 /* chatpadhid.h */; };\n\t\t3B36DCCE10B7817E00FFD769 /* chatpadkeys.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B36DCC910B7817E00FFD769 /* chatpadkeys.cpp */; };\n\t\t3B36DCCF10B7817E00FFD769 /* chatpadkeys.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B36DCCA10B7817E00FFD769 /* chatpadkeys.h */; };\n\t\t3BB5E09C09641F8200F83598 /* xbox360hid.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BB5E09B09641F8200F83598 /* xbox360hid.h */; };\n\t\t3BCE45CA09638EBC00B69EDF /* ControlStruct.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BCE45C909638EBC00B69EDF /* ControlStruct.h */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t089C167EFE841241C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\t1A224C3EFF42367911CA2CB7 /* _60Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _60Controller.h; sourceTree = \"<group>\"; };\n\t\t1A224C3FFF42367911CA2CB7 /* _60Controller.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = _60Controller.cpp; sourceTree = \"<group>\"; };\n\t\t32D94FCF0562CBF700B6AF17 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t32D94FD00562CBF700B6AF17 /* 360Controller.kext */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = 360Controller.kext; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t3B0F1276097B395B00127827 /* Feedback360.bundle */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.plug-in\"; name = Feedback360.bundle; path = ../Feedback360/build/Deployment/Feedback360.bundle; sourceTree = SOURCE_ROOT; };\n\t\t3B36DCC210B7816F00FFD769 /* Controller.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Controller.cpp; sourceTree = \"<group>\"; };\n\t\t3B36DCC310B7816F00FFD769 /* Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Controller.h; sourceTree = \"<group>\"; };\n\t\t3B36DCC610B7817E00FFD769 /* ChatPad.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ChatPad.cpp; sourceTree = \"<group>\"; };\n\t\t3B36DCC710B7817E00FFD769 /* ChatPad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChatPad.h; sourceTree = \"<group>\"; };\n\t\t3B36DCC810B7817E00FFD769 /* chatpadhid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = chatpadhid.h; sourceTree = \"<group>\"; };\n\t\t3B36DCC910B7817E00FFD769 /* chatpadkeys.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = chatpadkeys.cpp; sourceTree = \"<group>\"; };\n\t\t3B36DCCA10B7817E00FFD769 /* chatpadkeys.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = chatpadkeys.h; sourceTree = \"<group>\"; };\n\t\t3BB5E09B09641F8200F83598 /* xbox360hid.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = xbox360hid.h; sourceTree = \"<group>\"; };\n\t\t3BCE45C909638EBC00B69EDF /* ControlStruct.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ControlStruct.h; sourceTree = \"<group>\"; };\n\t\t8DA8362C06AD9B9200E5AC22 /* Kernel.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kernel.framework; path = /System/Library/Frameworks/Kernel.framework; sourceTree = \"<absolute>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t32D94FCB0562CBF700B6AF17 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t089C166AFE841209C02AAC07 /* 360Controller */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t247142CAFF3F8F9811CA285C /* Source */,\n\t\t\t\t089C167CFE841241C02AAC07 /* Resources */,\n\t\t\t\t19C28FB6FE9D52B211CA2CBB /* Products */,\n\t\t\t);\n\t\t\tname = 360Controller;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t089C167CFE841241C02AAC07 /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B2EF52A0965A0AE007BFB7B /* Kernel Driver */,\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t19C28FB6FE9D52B211CA2CBB /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t32D94FD00562CBF700B6AF17 /* 360Controller.kext */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t247142CAFF3F8F9811CA285C /* Source */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B2EF19A0965A03E007BFB7B /* Kernel Driver */,\n\t\t\t);\n\t\t\tname = Source;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3B2EF19A0965A03E007BFB7B /* Kernel Driver */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B36DCC010B7815000FFD769 /* Controller */,\n\t\t\t\t3B36DCC110B7815700FFD769 /* ChatPad */,\n\t\t\t\t3BCE45C909638EBC00B69EDF /* ControlStruct.h */,\n\t\t\t\t1A224C3EFF42367911CA2CB7 /* _60Controller.h */,\n\t\t\t\t1A224C3FFF42367911CA2CB7 /* _60Controller.cpp */,\n\t\t\t);\n\t\t\tname = \"Kernel Driver\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3B2EF52A0965A0AE007BFB7B /* Kernel Driver */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B0F1276097B395B00127827 /* Feedback360.bundle */,\n\t\t\t\t8DA8362C06AD9B9200E5AC22 /* Kernel.framework */,\n\t\t\t\t32D94FCF0562CBF700B6AF17 /* Info.plist */,\n\t\t\t\t089C167DFE841241C02AAC07 /* InfoPlist.strings */,\n\t\t\t);\n\t\t\tname = \"Kernel Driver\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3B36DCC010B7815000FFD769 /* Controller */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B36DCC210B7816F00FFD769 /* Controller.cpp */,\n\t\t\t\t3B36DCC310B7816F00FFD769 /* Controller.h */,\n\t\t\t\t3BB5E09B09641F8200F83598 /* xbox360hid.h */,\n\t\t\t);\n\t\t\tname = Controller;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3B36DCC110B7815700FFD769 /* ChatPad */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B36DCC610B7817E00FFD769 /* ChatPad.cpp */,\n\t\t\t\t3B36DCC710B7817E00FFD769 /* ChatPad.h */,\n\t\t\t\t3B36DCC910B7817E00FFD769 /* chatpadkeys.cpp */,\n\t\t\t\t3B36DCCA10B7817E00FFD769 /* chatpadkeys.h */,\n\t\t\t\t3B36DCC810B7817E00FFD769 /* chatpadhid.h */,\n\t\t\t);\n\t\t\tname = ChatPad;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t32D94FC50562CBF700B6AF17 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t32D94FC60562CBF700B6AF17 /* _60Controller.h in Headers */,\n\t\t\t\t3BCE45CA09638EBC00B69EDF /* ControlStruct.h in Headers */,\n\t\t\t\t3BB5E09C09641F8200F83598 /* xbox360hid.h in Headers */,\n\t\t\t\t3B36DCC510B7816F00FFD769 /* Controller.h in Headers */,\n\t\t\t\t3B36DCCC10B7817E00FFD769 /* ChatPad.h in Headers */,\n\t\t\t\t3B36DCCD10B7817E00FFD769 /* chatpadhid.h in Headers */,\n\t\t\t\t3B36DCCF10B7817E00FFD769 /* chatpadkeys.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t32D94FC30562CBF700B6AF17 /* 360Controller */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 3BBDC682097938A90023AAD8 /* Build configuration list for PBXNativeTarget \"360Controller\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t32D94FC50562CBF700B6AF17 /* Headers */,\n\t\t\t\t32D94FC70562CBF700B6AF17 /* Resources */,\n\t\t\t\t32D94FC90562CBF700B6AF17 /* Sources */,\n\t\t\t\t32D94FCB0562CBF700B6AF17 /* Frameworks */,\n\t\t\t\t32D94FCC0562CBF700B6AF17 /* Rez */,\n\t\t\t\t3B0F12A1097B3A3A00127827 /* ShellScript */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = 360Controller;\n\t\t\tproductInstallPath = \"$(SYSTEM_LIBRARY_DIR)/Extensions\";\n\t\t\tproductName = 360Controller;\n\t\t\tproductReference = 32D94FD00562CBF700B6AF17 /* 360Controller.kext */;\n\t\t\tproductType = \"com.apple.product-type.kernel-extension.iokit\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t089C1669FE841209C02AAC07 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tbuildConfigurationList = 3BBDC686097938A90023AAD8 /* Build configuration list for PBXProject \"360Controller\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 1;\n\t\t\tknownRegions = (\n\t\t\t\tEnglish,\n\t\t\t\tJapanese,\n\t\t\t\tFrench,\n\t\t\t\tGerman,\n\t\t\t);\n\t\t\tmainGroup = 089C166AFE841209C02AAC07 /* 360Controller */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t32D94FC30562CBF700B6AF17 /* 360Controller */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t32D94FC70562CBF700B6AF17 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t32D94FC80562CBF700B6AF17 /* InfoPlist.strings in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXRezBuildPhase section */\n\t\t32D94FCC0562CBF700B6AF17 /* Rez */ = {\n\t\t\tisa = PBXRezBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXRezBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t3B0F12A1097B3A3A00127827 /* ShellScript */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"cd \\\"$TARGET_BUILD_DIR/$TARGET_NAME.kext/Contents\\\"\\nmkdir PlugIns > /dev/null 2>&1\\nrm -R PlugIns/Feedback360.plugin > /dev/null 2>&1\\necho \\\"$SRCROOT/../Feedback360/build/Deployment/Feedback360.bundle\\\"\\ncp -R \\\"$SRCROOT/../Feedback360/build/Deployment/Feedback360.bundle\\\" PlugIns/Feedback360.plugin\\n# Renaming extension from bundle to a plugin? Could be naughty.\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t32D94FC90562CBF700B6AF17 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t32D94FCA0562CBF700B6AF17 /* _60Controller.cpp in Sources */,\n\t\t\t\t3B36DCC410B7816F00FFD769 /* Controller.cpp in Sources */,\n\t\t\t\t3B36DCCB10B7817E00FFD769 /* ChatPad.cpp in Sources */,\n\t\t\t\t3B36DCCE10B7817E00FFD769 /* chatpadkeys.cpp in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t089C167DFE841241C02AAC07 /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t089C167EFE841241C02AAC07 /* English */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t3BBDC683097938A90023AAD8 /* Development */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_32_64_BIT)\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1.0.0d12;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = YES;\n\t\t\t\tGCC_GENERATE_DEBUGGING_SYMBOLS = YES;\n\t\t\t\tGCC_MODEL_TUNING = G5;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(SYSTEM_LIBRARY_DIR)/Extensions\";\n\t\t\t\tMODULE_NAME = com.mice.driver.Xbox360Controller;\n\t\t\t\tMODULE_VERSION = 1.0.0d11;\n\t\t\t\tPREBINDING = NO;\n\t\t\t\tPRODUCT_NAME = 360Controller;\n\t\t\t\tSDKROOT = \"\";\n\t\t\t\tWRAPPER_EXTENSION = kext;\n\t\t\t\tZERO_LINK = YES;\n\t\t\t};\n\t\t\tname = Development;\n\t\t};\n\t\t3BBDC684097938A90023AAD8 /* Deployment */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tARCHS = (\n\t\t\t\t\tppc,\n\t\t\t\t\ti386,\n\t\t\t\t\tx86_64,\n\t\t\t\t);\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1.0.0d12;\n\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = NO;\n\t\t\t\tGCC_GENERATE_DEBUGGING_SYMBOLS = NO;\n\t\t\t\tGCC_MODEL_TUNING = G5;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(SYSTEM_LIBRARY_DIR)/Extensions\";\n\t\t\t\tLD_GENERATE_MAP_FILE = NO;\n\t\t\t\tMODULE_NAME = com.mice.driver.Xbox360Controller;\n\t\t\t\tMODULE_VERSION = 1.0.0d11;\n\t\t\t\tPREBINDING = NO;\n\t\t\t\tPRODUCT_NAME = 360Controller;\n\t\t\t\tWRAPPER_EXTENSION = kext;\n\t\t\t\tZERO_LINK = NO;\n\t\t\t};\n\t\t\tname = Deployment;\n\t\t};\n\t\t3BBDC685097938A90023AAD8 /* Default */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCURRENT_PROJECT_VERSION = 1.0.0d12;\n\t\t\t\tGCC_GENERATE_DEBUGGING_SYMBOLS = NO;\n\t\t\t\tGCC_MODEL_TUNING = G5;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(SYSTEM_LIBRARY_DIR)/Extensions\";\n\t\t\t\tMODULE_NAME = com.mice.driver.Xbox360Controller;\n\t\t\t\tMODULE_VERSION = 1.0.0d11;\n\t\t\t\tPREBINDING = NO;\n\t\t\t\tPRODUCT_NAME = 360Controller;\n\t\t\t\tWRAPPER_EXTENSION = kext;\n\t\t\t};\n\t\t\tname = Default;\n\t\t};\n\t\t3BBDC687097938A90023AAD8 /* Development */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"Developer ID Application: Colin Munro\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.5;\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\tSDKROOT = \"\";\n\t\t\t};\n\t\t\tname = Development;\n\t\t};\n\t\t3BBDC688097938A90023AAD8 /* Deployment */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_32_64_BIT)\";\n\t\t\t\tCODE_SIGN_IDENTITY = \"Developer ID Application: Colin Munro\";\n\t\t\t\tGCC_VERSION = \"\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.5;\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\tSDKROOT = \"\";\n\t\t\t\t\"SDKROOT[arch=x86_64]\" = \"\";\n\t\t\t};\n\t\t\tname = Deployment;\n\t\t};\n\t\t3BBDC689097938A90023AAD8 /* Default */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"Developer ID Application: Colin Munro\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.5;\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\tSDKROOT = \"\";\n\t\t\t};\n\t\t\tname = Default;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t3BBDC682097938A90023AAD8 /* Build configuration list for PBXNativeTarget \"360Controller\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t3BBDC683097938A90023AAD8 /* Development */,\n\t\t\t\t3BBDC684097938A90023AAD8 /* Deployment */,\n\t\t\t\t3BBDC685097938A90023AAD8 /* Default */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Default;\n\t\t};\n\t\t3BBDC686097938A90023AAD8 /* Build configuration list for PBXProject \"360Controller\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t3BBDC687097938A90023AAD8 /* Development */,\n\t\t\t\t3BBDC688097938A90023AAD8 /* Deployment */,\n\t\t\t\t3BBDC689097938A90023AAD8 /* Default */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Default;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 089C1669FE841209C02AAC07 /* Project object */;\n}\n"
  },
  {
    "path": "360Controller/ChatPad.cpp",
    "content": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n ChatPad.cpp - Implementation of the ChatPad Accessory driver\n \n This file is part of Xbox360Controller.\n \n Xbox360Controller is free software; you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation; either version 2 of the License, or\n (at your option) any later version.\n \n Xbox360Controller is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n GNU General Public License for more details.\n \n You should have received a copy of the GNU General Public License\n along with Foobar; if not, write to the Free Software\n Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n */\n\n#include <IOKit/IOLib.h>\n#include \"ChatPad.h\"\nnamespace HID_ChatPad {\n#include \"chatpadhid.h\"\n}\n#include \"chatpadkeys.h\"\n#include \"_60Controller.h\"\n\nOSDefineMetaClassAndStructors(ChatPadKeyboardClass, IOHIDDevice)\n\nIOReturn ChatPadKeyboardClass::newReportDescriptor(IOMemoryDescriptor **descriptor) const\n{\n    IOBufferMemoryDescriptor *buffer;\n    \n    buffer = IOBufferMemoryDescriptor::inTaskWithOptions(kernel_task, 0, sizeof(HID_ChatPad::ReportDescriptor));\n    if (buffer == NULL)\n\t\treturn kIOReturnNoResources;\n    buffer->writeBytes(0, HID_ChatPad::ReportDescriptor, sizeof(HID_ChatPad::ReportDescriptor));\n    *descriptor = buffer;\n    return kIOReturnSuccess;\n}\n\nIOReturn ChatPadKeyboardClass::setReport(IOMemoryDescriptor *report, IOHIDReportType reportType, IOOptionBits options)\n{\n\t// Maybe add LED support later?\n    return kIOReturnUnsupported;\n}\n\nIOReturn ChatPadKeyboardClass::getReport(IOMemoryDescriptor *report, IOHIDReportType reportType, IOOptionBits options)\n{\n    return kIOReturnUnsupported;\n}\n\nIOReturn ChatPadKeyboardClass::handleReport(IOMemoryDescriptor *report, IOHIDReportType reportType, IOOptionBits options)\n{\n\tIOBufferMemoryDescriptor *realReport = OSDynamicCast(IOBufferMemoryDescriptor, report);\n\tif (realReport != NULL)\n\t{\n\t\tunsigned char *data = (unsigned char*)realReport->getBytesNoCopy();\n\t\tif (data[0] == 0x00)\n\t\t{\n\t\t\tfor (int i = 2; i < 5; i++)\n\t\t\t{\n\t\t\t\tdata[i] = ChatPad2USB(data[i]);\n\t\t\t}\n\t\t}\n\t}\n\treturn IOHIDDevice::handleReport(report, reportType, options);\n}\n\nOSNumber* ChatPadKeyboardClass::newPrimaryUsageNumber() const\n{\n    return OSNumber::withNumber(HID_ChatPad::ReportDescriptor[3], 8);\n}\n\nOSNumber* ChatPadKeyboardClass::newPrimaryUsagePageNumber() const\n{\n    return OSNumber::withNumber(HID_ChatPad::ReportDescriptor[1], 8);\n}\n\nOSString* ChatPadKeyboardClass::newProductString() const\n{\n    return OSString::withCString(\"ChatPad\");\n}\n\nOSString* ChatPadKeyboardClass::newTransportString() const\n{\n    return OSString::withCString(\"Serial\");\n}\n\nOSNumber* ChatPadKeyboardClass::newVendorIDNumber() const\n{\n\t// Same as USB\n\treturn OSNumber::withNumber(100, 32);\n}\n\nOSNumber* ChatPadKeyboardClass::newProductIDNumber() const\n{\n\t// Same as USB, plus one\n\treturn OSNumber::withNumber(100, 32);\n}\n\nstatic IOHIDDevice* GetParent(const IOService *current)\n{\n\tXbox360Peripheral *owner;\n\t\n\towner = OSDynamicCast(Xbox360Peripheral, current->getProvider());\n\tif (owner == NULL)\n\t\treturn NULL;\n\treturn owner->getController(0);\n}\n\nbool ChatPadKeyboardClass::start(IOService *provider)\n{\n    if (!IOHIDDevice::start(provider))\n        return false;\n    return OSDynamicCast(Xbox360Peripheral, provider) != NULL;\n}\n\nOSString* ChatPadKeyboardClass::newManufacturerString() const\n{\n\tIOHIDDevice *device = GetParent(this);\n\tif (device == NULL)\n\t\treturn NULL;\n\treturn device->newManufacturerString();\n}\n\nOSString* ChatPadKeyboardClass::newSerialNumberString() const\n{\n\tIOHIDDevice *device = GetParent(this);\n\tif (device == NULL)\n\t\treturn NULL;\n\treturn device->newSerialNumberString();\n}\n\nOSNumber* ChatPadKeyboardClass::newLocationIDNumber() const\n{\n\tIOHIDDevice *device = GetParent(this);\n\tif (device == NULL)\n\t\treturn NULL;\n\tOSNumber *number = device->newLocationIDNumber();\n\tif (number == NULL)\n\t\treturn NULL;\n\tUInt32 value = number->unsigned32BitValue();\n\tnumber->release();\n\treturn OSNumber::withNumber(value + 1, 32);\n}\n"
  },
  {
    "path": "360Controller/ChatPad.h",
    "content": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n ChatPad.h - Driver class for the ChatPad accessory\n \n This file is part of Xbox360Controller.\n \n Xbox360Controller is free software; you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation; either version 2 of the License, or\n (at your option) any later version.\n \n Xbox360Controller is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n GNU General Public License for more details.\n \n You should have received a copy of the GNU General Public License\n along with Foobar; if not, write to the Free Software\n Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n */\n\n#include <IOKit/hid/IOHIDDevice.h>\n\nclass ChatPadKeyboardClass : public IOHIDDevice\n{\n\tOSDeclareDefaultStructors(ChatPadKeyboardClass)\n\t\nprivate:\n\npublic:\n    virtual bool start(IOService *provider);\n\n    // IOHidDevice methods\n    virtual IOReturn newReportDescriptor(IOMemoryDescriptor **descriptor) const;\n    \n    virtual IOReturn setReport(IOMemoryDescriptor *report,IOHIDReportType reportType,IOOptionBits options=0);\n    virtual IOReturn getReport(IOMemoryDescriptor *report,IOHIDReportType reportType,IOOptionBits options);\n\n\tvirtual IOReturn handleReport(IOMemoryDescriptor *report, IOHIDReportType reportType = kIOHIDReportTypeInput, IOOptionBits options = 0);\n\t\n    virtual OSString* newManufacturerString() const;\n    virtual OSNumber* newPrimaryUsageNumber() const;\n    virtual OSNumber* newPrimaryUsagePageNumber() const;\n    virtual OSNumber* newProductIDNumber() const;\n    virtual OSString* newProductString() const;\n    virtual OSString* newSerialNumberString() const;\n    virtual OSString* newTransportString() const;\n    virtual OSNumber* newVendorIDNumber() const;\n\t\n    virtual OSNumber* newLocationIDNumber() const;\n};\n"
  },
  {
    "path": "360Controller/ControlStruct.h",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    ControlStruct.h - Structures used by the device\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#ifndef __CONTROLSTRUCT_H__\n#define __CONTROLSTRUCT_H__\n\ntypedef UInt8 XBox360_Byte;\ntypedef UInt16 XBox360_Short;\ntypedef SInt16 XBox360_SShort;\n\n#define Xbox360_Prepare(x,t)      {memset(&x,0,sizeof(x));x.header.command=t;x.header.size=sizeof(x);}\n\n#define PACKED __attribute__((__packed__))\n\n// Common structure format\ntypedef struct {\n    XBox360_Byte command;\n    XBox360_Byte size;\n} PACKED XBOX360_PACKET;\n\n// Analog stick format\ntypedef struct {\n    XBox360_SShort x,y;\n} PACKED XBOX360_HAT;\n\n// Structure describing the report had back from the controller\ntypedef struct {\n    XBOX360_PACKET header;\n    XBox360_Short buttons;\n    XBox360_Byte trigL,trigR;\n    XBOX360_HAT left,right;\n    XBox360_Byte reserved[6];\n} PACKED XBOX360_IN_REPORT;\n\n// Structure describing the command to change LED status\ntypedef struct {\n    XBOX360_PACKET header;\n    XBox360_Byte pattern;\n} PACKED XBOX360_OUT_LED;\n\n// Structure describing the command to change rumble motor status\ntypedef struct {\n    XBOX360_PACKET header;\n    XBox360_Byte reserved1;\n    XBox360_Byte big,little;\n    XBox360_Byte reserved[3];\n} PACKED XBOX360_OUT_RUMBLE;\n\n// Enumeration of command types\nenum {\n    // In\n    inReport  = 0,\n    // Out\n    outRumble = 0,\n    outLed    = 1\n};\n\n// Button bits\nenum {\n    btnHatRight      = 0x8000,\n    btnHatLeft       = 0x4000,\n    btnBack          = 0x2000,\n    btnStart         = 0x1000,\n    btnDigiRight     = 0x0800,\n    btnDigiLeft      = 0x0400,\n    btnDigiDown      = 0x0200,\n    btnDigiUp        = 0x0100,\n    btnY             = 0x0080,\n    btnX             = 0x0040,\n    btnB             = 0x0020,\n    btnA             = 0x0010,\n    btnReserved1     = 0x0008,  // Unused?\n    btnXbox          = 0x0004,\n    btnShoulderRight = 0x0002,\n    btnShoulderLeft  = 0x0001\n};\n\n// LED values\nenum {\n    ledOff          = 0x00,\n    ledBlinkingAll  = 0x01,\n    ledFlashOn1     = 0x02,\n    ledFlashOn2     = 0x03,\n    ledFlashOn3     = 0x04,\n    ledFlashOn4     = 0x05,\n    ledOn1          = 0x06,\n    ledOn2          = 0x07,\n    ledOn3          = 0x08,\n    ledOn4          = 0x09,\n    ledRotating     = 0x0a,\n    ledBlinking     = 0x0b, // Blinking of previously enabled LED (e.g. from 0x01-0x09)\n    ledBlinkingSlow = 0x0c, // As above\n    ldAlternating   = 0x0d  // 1+4, 2+3, then back to previous after a short time\n};\n\n#endif // __CONTROLSTRUCT_H__\n"
  },
  {
    "path": "360Controller/Controller.cpp",
    "content": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n Controller.cpp - driver class for the 360 controller\n \n This file is part of Xbox360Controller.\n \n Xbox360Controller is free software; you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation; either version 2 of the License, or\n (at your option) any later version.\n \n Xbox360Controller is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n GNU General Public License for more details.\n \n You should have received a copy of the GNU General Public License\n along with Foobar; if not, write to the Free Software\n Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n */\n\n#include <IOKit/usb/IOUSBDevice.h>\n#include <IOKit/usb/IOUSBInterface.h>\n#include \"Controller.h\"\n#include \"ControlStruct.h\"\nnamespace HID_360 {\n#include \"xbox360hid.h\"\n}\n#include \"_60Controller.h\"\n\nOSDefineMetaClassAndStructors(Xbox360ControllerClass, IOHIDDevice)\n\nstatic Xbox360Peripheral* GetOwner(IOService *us)\n{\n\tIOService *prov;\n\t\n\tprov = us->getProvider();\n\tif (prov == NULL)\n\t\treturn NULL;\n\treturn OSDynamicCast(Xbox360Peripheral, prov);\n}\n\nstatic IOUSBDevice* GetOwnerProvider(const IOService *us)\n{\n\tIOService *prov, *provprov;\n\t\n\tprov = us->getProvider();\n\tif (prov == NULL)\n\t\treturn NULL;\n\tprovprov = prov->getProvider();\n\tif (provprov == NULL)\n\t\treturn NULL;\n\treturn OSDynamicCast(IOUSBDevice, provprov);\n}\n\nbool Xbox360ControllerClass::start(IOService *provider)\n{\n    if (OSDynamicCast(Xbox360Peripheral, provider) == NULL)\n        return false;\n    return IOHIDDevice::start(provider);\n}\n\nIOReturn Xbox360ControllerClass::setProperties(OSObject *properties)\n{\n\tXbox360Peripheral *owner = GetOwner(this);\n\tif (owner == NULL)\n\t\treturn kIOReturnUnsupported;\n\treturn owner->setProperties(properties);\n}\n\n// Returns the HID descriptor for this device\nIOReturn Xbox360ControllerClass::newReportDescriptor(IOMemoryDescriptor **descriptor) const\n{\n    IOBufferMemoryDescriptor *buffer;\n    \n    buffer=IOBufferMemoryDescriptor::inTaskWithOptions(kernel_task,0,sizeof(HID_360::ReportDescriptor));\n    if(buffer==NULL) return kIOReturnNoResources;\n    buffer->writeBytes(0,HID_360::ReportDescriptor,sizeof(HID_360::ReportDescriptor));\n    *descriptor=buffer;\n    return kIOReturnSuccess;\n}\n\n// Handles a message from the userspace IOHIDDeviceInterface122::setReport function\nIOReturn Xbox360ControllerClass::setReport(IOMemoryDescriptor *report,IOHIDReportType reportType,IOOptionBits options)\n{\n    char data[2];\n    \n    report->readBytes(0,data,2);\n    switch(data[0]) {\n        case 0x00:  // Set force feedback\n            if((data[1]!=report->getLength())||(data[1]!=0x04)) return kIOReturnUnsupported;\n\t\t{\n\t\t\tXBOX360_OUT_RUMBLE rumble;\n\t\t\t\n\t\t\tXbox360_Prepare(rumble,outRumble);\n\t\t\treport->readBytes(2,data,2);\n\t\t\trumble.big=data[0];\n\t\t\trumble.little=data[1];\n\t\t\tGetOwner(this)->QueueWrite(&rumble,sizeof(rumble));\n//\t\t\tIOLog(\"Set rumble: big(%d) little(%d)\\n\", rumble.big, rumble.little);\n\t\t}\n            return kIOReturnSuccess;\n        case 0x01:  // Set LEDs\n            if((data[1]!=report->getLength())||(data[1]!=0x03)) return kIOReturnUnsupported;\n\t\t{\n\t\t\tXBOX360_OUT_LED led;\n\t\t\t\n\t\t\treport->readBytes(2,data,1);\n\t\t\tXbox360_Prepare(led,outLed);\n\t\t\tled.pattern=data[0];\n\t\t\tGetOwner(this)->QueueWrite(&led,sizeof(led));\n//\t\t\tIOLog(\"Set LED: %d\\n\", led.pattern);\n\t\t}\n            return kIOReturnSuccess;\n        default:\n\t\t\tIOLog(\"Unknown escape %d\\n\", data[0]);\n            return kIOReturnUnsupported;\n    }\n}\n\n// Get report\nIOReturn Xbox360ControllerClass::getReport(IOMemoryDescriptor *report,IOHIDReportType reportType,IOOptionBits options)\n{\n    // Doesn't do anything yet ;)\n    return kIOReturnUnsupported;\n}\n\n// Returns the string for the specified index from the USB device's string list, with an optional default\nOSString* Xbox360ControllerClass::getDeviceString(UInt8 index,const char *def) const\n{\n    IOReturn err;\n    char buf[1024];\n    const char *string;\n    \n    err = GetOwnerProvider(this)->GetStringDescriptor(index,buf,sizeof(buf));\n    if(err==kIOReturnSuccess) string=buf;\n    else {\n        if(def==NULL) string=\"Unknown\";\n        else string=def;\n    }\n    return OSString::withCString(string);\n}\n\nOSString* Xbox360ControllerClass::newManufacturerString() const\n{\n    return getDeviceString(GetOwnerProvider(this)->GetManufacturerStringIndex());\n}\n\nOSNumber* Xbox360ControllerClass::newPrimaryUsageNumber() const\n{\n    return OSNumber::withNumber(HID_360::ReportDescriptor[3], 8);\n}\n\nOSNumber* Xbox360ControllerClass::newPrimaryUsagePageNumber() const\n{\n    return OSNumber::withNumber(HID_360::ReportDescriptor[1], 8);\n}\n\nOSNumber* Xbox360ControllerClass::newProductIDNumber() const\n{\n    return OSNumber::withNumber(GetOwnerProvider(this)->GetProductID(),16);\n}\n\nOSString* Xbox360ControllerClass::newProductString() const\n{\n    return getDeviceString(GetOwnerProvider(this)->GetProductStringIndex());\n}\n\nOSString* Xbox360ControllerClass::newSerialNumberString() const\n{\n    return getDeviceString(GetOwnerProvider(this)->GetSerialNumberStringIndex());\n}\n\nOSString* Xbox360ControllerClass::newTransportString() const\n{\n    return OSString::withCString(\"USB\");\n}\n\nOSNumber* Xbox360ControllerClass::newVendorIDNumber() const\n{\n    return OSNumber::withNumber(GetOwnerProvider(this)->GetVendorID(),16);\n}\n\nOSNumber* Xbox360ControllerClass::newLocationIDNumber() const\n{\n\tIOUSBDevice *device;\n    OSNumber *number;\n    UInt32 location;\n    \n\tdevice = GetOwnerProvider(this);\n    if (device)\n    {\n        if ((number = OSDynamicCast(OSNumber, device->getProperty(\"locationID\"))))\n        {\n            location = number->unsigned32BitValue();\n        }\n        else\n        {\n            // Make up an address\n            if ((number = OSDynamicCast(OSNumber, device->getProperty(\"USB Address\"))))\n                location |= number->unsigned8BitValue() << 24;\n\t\t\t\n            if ((number = OSDynamicCast(OSNumber, device->getProperty(\"idProduct\"))))\n                location |= number->unsigned8BitValue() << 16;\n        }\n    }\n    \n    return (location != 0) ? OSNumber::withNumber(location, 32) : 0;\n}\n"
  },
  {
    "path": "360Controller/Controller.h",
    "content": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n Controller.h - Driver class for the 360 controller\n \n This file is part of Xbox360Controller.\n \n Xbox360Controller is free software; you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation; either version 2 of the License, or\n (at your option) any later version.\n \n Xbox360Controller is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n GNU General Public License for more details.\n \n You should have received a copy of the GNU General Public License\n along with Foobar; if not, write to the Free Software\n Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n */\n\n#include <IOKit/hid/IOHIDDevice.h>\n\nclass Xbox360ControllerClass : public IOHIDDevice\n{\n\tOSDeclareDefaultStructors(Xbox360ControllerClass)\n\nprivate:\n    OSString* getDeviceString(UInt8 index,const char *def=NULL) const;\n\npublic:\n    virtual bool start(IOService *provider);\n\n    virtual IOReturn setProperties(OSObject *properties);\n\n    virtual IOReturn newReportDescriptor(IOMemoryDescriptor **descriptor) const;\n    \n    virtual IOReturn setReport(IOMemoryDescriptor *report,IOHIDReportType reportType,IOOptionBits options=0);\n    virtual IOReturn getReport(IOMemoryDescriptor *report,IOHIDReportType reportType,IOOptionBits options);\n\t\n    virtual OSString* newManufacturerString() const;\n    virtual OSNumber* newPrimaryUsageNumber() const;\n    virtual OSNumber* newPrimaryUsagePageNumber() const;\n    virtual OSNumber* newProductIDNumber() const;\n    virtual OSString* newProductString() const;\n    virtual OSString* newSerialNumberString() const;\n    virtual OSString* newTransportString() const;\n    virtual OSNumber* newVendorIDNumber() const;\n\t\n    virtual OSNumber* newLocationIDNumber() const;\n};\n"
  },
  {
    "path": "360Controller/English.lproj/InfoPlist.strings",
    "content": "﻿/* Localized versions of Info.plist keys */\n\nCFBundleName = \"360Controller\";\nNSHumanReadableCopyright = \"© Colin Munro, 2005-11\";"
  },
  {
    "path": "360Controller/Info copy.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleExecutable</key>\n\t<string>360Controller</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.mice.driver.Xbox360Controller</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundlePackageType</key>\n\t<string>KEXT</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0.0d1</string>\n\t<key>IOKitPersonalities</key>\n\t<dict>\n\t\t<key>Controller</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360ControllerClass</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>654</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>1118</integer>\n\t\t</dict>\n\t</dict>\n\t<key>OSBundleLibraries</key>\n\t<dict>\n\t\t<key>com.apple.iokit.IOHIDFamily</key>\n\t\t<string>1.2</string>\n\t\t<key>com.apple.iokit.IOUSBFamily</key>\n\t\t<string>1.8</string>\n\t\t<key>com.apple.kernel.libkern</key>\n\t\t<string>6.9.9</string>\n\t\t<key>com.apple.kernel.mach</key>\n\t\t<string>6.9.9</string>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "360Controller/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.mice.driver.Xbox360Controller</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundlePackageType</key>\n\t<string>KEXT</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0.0d12</string>\n\t<key>IOKitPersonalities</key>\n\t<dict>\n\t\t<key>AfterglowGamepadforXbox360</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>275</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>3695</integer>\n\t\t</dict>\n\t\t<key>AfterglowGamepadforXbox360Z</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>531</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>3695</integer>\n\t\t</dict>\n\t\t<key>AfterglowGamepadforXbox360ZZ</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>63744</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>7085</integer>\n\t\t</dict>\n\t\t<key>AviatorforXbox360PC</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>52009</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>1848</integer>\n\t\t</dict>\n\t\t<key>BatarangwiredcontrollerXBOX</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>16144</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>5604</integer>\n\t\t</dict>\n\t\t<key>BigbenControllerBB7201</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>1537</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>5227</integer>\n\t\t</dict>\n\t\t<key>ChatPadKeyboardEvents</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.apple.iokit.IOHIDFamily</string>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>IOHIDEventDriver</string>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOHIDInterface</string>\n\t\t\t<key>VendorID</key>\n\t\t\t<integer>100</integer>\n\t\t</dict>\n\t\t<key>Controller</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>62465</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>1848</integer>\n\t\t</dict>\n\t\t<key>ControllerZ</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>62721</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>3695</integer>\n\t\t</dict>\n\t\t<key>ControllerZZ</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>63489</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>5168</integer>\n\t\t</dict>\n\t\t<key>ControllerZZZ</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>654</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>7085</integer>\n\t\t</dict>\n\t\t<key>ControllerZZZZ</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>64001</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>7085</integer>\n\t\t</dict>\n\t\t<key>DDRUniverse2Mat</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>4</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>4779</integer>\n\t\t</dict>\n\t\t<key>Ferrari458Racingwheel</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>23296</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>9414</integer>\n\t\t</dict>\n\t\t<key>GH4Guitar</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>18228</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>5168</integer>\n\t\t</dict>\n\t\t<key>GamepadF310</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>49693</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>1133</integer>\n\t\t</dict>\n\t\t<key>GamepadforXbox360</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>769</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>3695</integer>\n\t\t</dict>\n\t\t<key>GamepadforXbox360Z</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>1025</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>3695</integer>\n\t\t</dict>\n\t\t<key>GamepadforXbox360ZZ</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>770</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>4779</integer>\n\t\t</dict>\n\t\t<key>GamepadforXbox360ZZZ</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>63746</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>7085</integer>\n\t\t</dict>\n\t\t<key>GamestopXbox360Controller</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>63745</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>7085</integer>\n\t\t</dict>\n\t\t<key>GuitarHeroforPCMAC</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>18252</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>5168</integer>\n\t\t</dict>\n\t\t<key>HORIPADEX2TURBO</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>62721</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>7085</integer>\n\t\t</dict>\n\t\t<key>HarmonixDrumKitforXbox360</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>3</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>7085</integer>\n\t\t</dict>\n\t\t<key>HarmonixGuitarforXbox360</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>2</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>7085</integer>\n\t\t</dict>\n\t\t<key>HoriCoDOA4FightStick</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>10</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>3853</integer>\n\t\t</dict>\n\t\t<key>HoriFightingStickEx2</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>13</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>3853</integer>\n\t\t</dict>\n\t\t<key>HoriRealArcadeProEx</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>22</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>3853</integer>\n\t\t</dict>\n\t\t<key>HoriRealArcadeProVXSA</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>21761</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>9414</integer>\n\t\t</dict>\n\t\t<key>HoriSOULCALIBURVStick</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>21766</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>9414</integer>\n\t\t</dict>\n\t\t<key>JoytechNeoSe</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>61485</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>7085</integer>\n\t\t</dict>\n\t\t<key>JoytechNeoSeTake2</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>48879</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>5678</integer>\n\t\t</dict>\n\t\t<key>LogitechChillStream</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>49730</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>1133</integer>\n\t\t</dict>\n\t\t<key>LogitechF510</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>49694</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>1133</integer>\n\t\t</dict>\n\t\t<key>MadCatz360</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>64769</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>7085</integer>\n\t\t</dict>\n\t\t<key>MadCatzBeatPad</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>18240</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>1848</integer>\n\t\t</dict>\n\t\t<key>MadCatzCallofDutyGamePad</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>61477</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>7085</integer>\n\t\t</dict>\n\t\t<key>MadCatzFPSProGamePad</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>61479</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>7085</integer>\n\t\t</dict>\n\t\t<key>MadCatzGhostReconFSGamePad</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>61473</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>7085</integer>\n\t\t</dict>\n\t\t<key>MadCatzMicroConGamePadPro</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>18230</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>1848</integer>\n\t\t</dict>\n\t\t<key>MadCatzMicroConGamePadProZ</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>61494</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>7085</integer>\n\t\t</dict>\n\t\t<key>MadCatzPortableDrumKit</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>39025</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>1848</integer>\n\t\t</dict>\n\t\t<key>MadCatzStreetFighterIVFightPad</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>18216</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>1848</integer>\n\t\t</dict>\n\t\t<key>MadCatzStreetFighterIVFightStickSE</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>18200</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>1848</integer>\n\t\t</dict>\n\t\t<key>MadCatzXbox360Controller</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>18198</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>1848</integer>\n\t\t</dict>\n\t\t<key>MadCatzXbox360ControllerZ</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>18214</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>1848</integer>\n\t\t</dict>\n\t\t<key>MadCatzXbox360ControllerZZ</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>48879</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>1848</integer>\n\t\t</dict>\n\t\t<key>MadCatzXbox360ControllerZZZ</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>61462</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>7085</integer>\n\t\t</dict>\n\t\t<key>MadCatzXboxcontrollerMW2</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>46886</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>1848</integer>\n\t\t</dict>\n\t\t<key>MicrosoftXbox360Controller</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>654</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>1118</integer>\n\t\t</dict>\n\t\t<key>PDPAFTERGLOWAX1</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>769</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>4779</integer>\n\t\t</dict>\n\t\t<key>PDPDancePad</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>261</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>3695</integer>\n\t\t</dict>\n\t\t<key>PelicanTSZ360Pad</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>513</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>3695</integer>\n\t\t</dict>\n\t\t<key>PowerAMiniProElite</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>16128</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>5604</integer>\n\t\t</dict>\n\t\t<key>PowerAMiniProEliteGlow</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>21248</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>9414</integer>\n\t\t</dict>\n\t\t<key>REALARCADEPROEX</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>62724</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>7085</integer>\n\t\t</dict>\n\t\t<key>REALARCADEProVX</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>62722</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>7085</integer>\n\t\t</dict>\n\t\t<key>RazerOnza</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>64768</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>5769</integer>\n\t\t</dict>\n\t\t<key>RazerOnzaTournamentEdition</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>64769</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>5769</integer>\n\t\t</dict>\n\t\t<key>RedOctaneGuitarHeroXplorer</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>18248</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>5168</integer>\n\t\t</dict>\n\t\t<key>RockCandyGamepadforXbox360</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>287</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>3695</integer>\n\t\t</dict>\n\t\t<key>RockRevolutionforXbox360</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>6</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>4779</integer>\n\t\t</dict>\n\t\t<key>SaitekCyborgRumblePadPCXbox360</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>51970</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>1848</integer>\n\t\t</dict>\n\t\t<key>SaitekP3200RumblePadPCXbox360</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>51971</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>1848</integer>\n\t\t</dict>\n\t\t<key>StreetFighterIVFightPad</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>61480</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>7085</integer>\n\t\t</dict>\n\t\t<key>StreetFighterIVFightStickTE</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>18232</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>1848</integer>\n\t\t</dict>\n\t\t<key>SuperSFIVFightStickTES</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>63288</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>1848</integer>\n\t\t</dict>\n\t\t<key>TronXbox360controller</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>63747</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>7085</integer>\n\t\t</dict>\n\t\t<key>USBGamepad</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>21760</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>7085</integer>\n\t\t</dict>\n\t\t<key>XB360MortalKombatFightStick</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>63750</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>7085</integer>\n\t\t</dict>\n\t\t<key>XboxAirflowiredcontroller</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Xbox360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Xbox360Peripheral</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>16138</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>5604</integer>\n\t\t</dict>\n\t</dict>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>Copyright © 2013 MICE Software. All rights reserved.</string>\n\t<key>OSBundleLibraries</key>\n\t<dict>\n\t\t<key>com.apple.iokit.IOHIDFamily</key>\n\t\t<string>1.2</string>\n\t\t<key>com.apple.iokit.IOUSBFamily</key>\n\t\t<string>1.8</string>\n\t\t<key>com.apple.kpi.iokit</key>\n\t\t<string>8.0.0</string>\n\t\t<key>com.apple.kpi.libkern</key>\n\t\t<string>8.0.0</string>\n\t\t<key>com.apple.kpi.mach</key>\n\t\t<string>8.0.0</string>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "360Controller/_60Controller.cpp",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    Bug fixes contributed by Cody \"codeman38\" Boisclair\n    \n    _60Controller.cpp - main source of the driver\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#include <IOKit/IOLib.h>\n#include <IOKit/IOMessage.h>\n#include <IOKit/IOTimerEventSource.h>\n#include \"_60Controller.h\"\n#include \"ControlStruct.h\"\n#include \"ChatPad.h\"\n#include \"Controller.h\"\n\n#define kDriverSettingKey       \"DeviceData\"\n\n#define kIOSerialDeviceType   \"Serial360Device\"\n\nOSDefineMetaClassAndStructors(Xbox360Peripheral, IOService)\n#define super IOService\n\nclass LockRequired\n{\nprivate:\n    IOLock *_lock;\npublic:\n    LockRequired(IOLock *lock)\n    {\n        _lock = lock;\n        IOLockLock(_lock);\n    }\n    ~LockRequired()\n    {\n        IOLockUnlock(_lock);\n    }\n};\n\n// Find the maximum packet size of this pipe\nstatic UInt32 GetMaxPacketSize(IOUSBPipe *pipe)\n{\n    const IOUSBEndpointDescriptor *ed;\n    \n    ed=pipe->GetEndpointDescriptor();\n    if(ed==NULL) return 0;\n    else return ed->wMaxPacketSize;\n}\n\nvoid Xbox360Peripheral::SendSpecial(UInt16 value)\n{\n\tIOUSBDevRequest controlReq;\n\n\tcontrolReq.bmRequestType = USBmakebmRequestType(kUSBOut, kUSBVendor, kUSBInterface);\n\tcontrolReq.bRequest = 0x00;\n\tcontrolReq.wValue = value;\n\tcontrolReq.wIndex = 0x0002;\n\tcontrolReq.wLength = 0;\n\tcontrolReq.pData = NULL;\n\tif (device->DeviceRequest(&controlReq, 100, 100, NULL) != kIOReturnSuccess)\n\t\tIOLog(\"Failed to send special message %.4x\\n\", value);\n}\n\nvoid Xbox360Peripheral::SendInit(UInt16 value, UInt16 index)\n{\n\tIOUSBDevRequest controlReq;\n\t\n\tcontrolReq.bmRequestType = USBmakebmRequestType(kUSBOut, kUSBVendor, kUSBDevice);\n\tcontrolReq.bRequest = 0xa9;\n\tcontrolReq.wValue = value;\n\tcontrolReq.wIndex = index;\n\tcontrolReq.wLength = 0;\n\tcontrolReq.pData = NULL;\n\tdevice->DeviceRequest(&controlReq, 100, 100, NULL);\t// Will fail - but device should still act on it\n}\n\nbool Xbox360Peripheral::SendSwitch(bool sendOut)\n{\n\tIOUSBDevRequest controlReq;\n\n\tcontrolReq.bmRequestType = USBmakebmRequestType(sendOut ? kUSBOut : kUSBIn, kUSBVendor, kUSBDevice);\n\tcontrolReq.bRequest = 0xa1;\n\tcontrolReq.wValue = 0x0000;\n\tcontrolReq.wIndex = 0xe416;\n\tcontrolReq.wLength = sizeof(chatpadInit);\n\tcontrolReq.pData = chatpadInit;\n\tif (device->DeviceRequest(&controlReq, 100, 100, NULL) == kIOReturnSuccess)\n        return true;\n    IOLog(\"start - failed to %s chatpad setting\\n\", sendOut ? \"write\" : \"read\");\n    return false;\n}\n\nvoid Xbox360Peripheral::SendToggle(void)\n{\n\tSendSpecial(serialToggle ? 0x1F : 0x1E);\n\tserialToggle = !serialToggle;\n}\n\nvoid Xbox360Peripheral::ChatPadTimerActionWrapper(OSObject *owner, IOTimerEventSource *sender)\n{\n\tXbox360Peripheral *controller;\n\n\tcontroller = OSDynamicCast(Xbox360Peripheral, owner);\n\tcontroller->ChatPadTimerAction(sender);\n}\n\nvoid Xbox360Peripheral::ChatPadTimerAction(IOTimerEventSource *sender)\n{\n\tint nextTime, serialGot;\n\t\n\tserialGot = 0;\n\tnextTime = 1000;\n\tswitch (serialTimerState)\n\t{\n\t\tcase tsToggle:\n\t\t\tSendToggle();\n\t\t\tif (serialActive)\n\t\t\t{\n\t\t\t\tif (!serialHeard)\n\t\t\t\t{\n\t\t\t\t\tserialActive = false;\n\t\t\t\t\tserialGot = 2;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (serialHeard)\n\t\t\t\t{\n\t\t\t\t\tserialTimerState = tsReset1;\n\t\t\t\t\tserialResetCount = 0;\n\t\t\t\t\tnextTime = 40;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t\t\n\t\tcase tsMiniToggle:\n\t\t\tSendToggle();\n\t\t\tif (serialHeard)\n\t\t\t{\n\t\t\t\tserialTimerState = tsSet1;\n\t\t\t\tnextTime = 40;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tserialResetCount++;\n\t\t\t\tif (serialResetCount > 3)\n\t\t\t\t{\n\t\t\t\t\tserialTimerState = tsToggle;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tserialTimerState = tsReset1;\n\t\t\t\t\tnextTime = 40;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t\t\n\t\tcase tsReset1:\n\t\t\tSendSpecial(0x1B);\n\t\t\tserialTimerState = tsReset2;\n\t\t\tnextTime = 35;\n\t\t\tbreak;\n\t\t\t\n\t\tcase tsReset2:\n\t\t\tSendSpecial(0x1B);\n\t\t\tserialTimerState = tsMiniToggle;\n\t\t\tnextTime = 150;\n\t\t\tbreak;\n\t\t\t\n\t\tcase tsSet1:\n\t\t\tSendSpecial(0x18);\n\t\t\tserialTimerState = tsSet2;\n\t\t\tnextTime = 10;\n\t\t\tbreak;\n\t\t\t\n\t\tcase tsSet2:\n\t\t\tSendSpecial(0x10);\n\t\t\tserialTimerState = tsSet3;\n\t\t\tnextTime = 10;\n\t\t\tbreak;\n\t\t\t\n\t\tcase tsSet3:\n\t\t\tSendSpecial(0x03);\n\t\t\tserialTimerState = tsToggle;\n\t\t\tnextTime = 940;\n\t\t\tserialActive = true;\n\t\t\tserialGot = 1;\n\t\t\tbreak;\n\t}\n\tsender->setTimeoutMS(nextTime);\t// Todo: Make it take into account function execution time?\n\tserialHeard = false;\n\t// Make it happen after the timer's set, for minimum impact\n\tswitch (serialGot)\n\t{\n\t\tcase 1:\n\t\t\tSerialConnect();\n\t\t\tbreak;\n\t\t\t\n\t\tcase 2:\n\t\t\tSerialDisconnect();\n\t\t\tbreak;\n\t\t\t\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\n// Read the settings from the registry\nvoid Xbox360Peripheral::readSettings(void)\n{\n    OSDictionary *dataDictionary;\n    OSBoolean *value;\n    OSNumber *number;\n    \n    dataDictionary=OSDynamicCast(OSDictionary,getProperty(kDriverSettingKey));\n    if(dataDictionary==NULL) return;\n    value=OSDynamicCast(OSBoolean,dataDictionary->getObject(\"InvertLeftX\"));\n    if(value!=NULL) invertLeftX=value->getValue();\n    value=OSDynamicCast(OSBoolean,dataDictionary->getObject(\"InvertLeftY\"));\n    if(value!=NULL) invertLeftY=value->getValue();\n    value=OSDynamicCast(OSBoolean,dataDictionary->getObject(\"InvertRightX\"));\n    if(value!=NULL) invertRightX=value->getValue();\n    value=OSDynamicCast(OSBoolean,dataDictionary->getObject(\"InvertRightY\"));\n    if(value!=NULL) invertRightY=value->getValue();\n    number=OSDynamicCast(OSNumber,dataDictionary->getObject(\"DeadzoneLeft\"));\n    if(number!=NULL) deadzoneLeft=number->unsigned32BitValue();\n    number=OSDynamicCast(OSNumber,dataDictionary->getObject(\"DeadzoneRight\"));\n    if(number!=NULL) deadzoneRight=number->unsigned32BitValue();\n    value=OSDynamicCast(OSBoolean,dataDictionary->getObject(\"RelativeLeft\"));\n    if(value!=NULL) relativeLeft=value->getValue();\n    value=OSDynamicCast(OSBoolean,dataDictionary->getObject(\"RelativeRight\"));\n    if(value!=NULL) relativeRight=value->getValue();\n    /*\n    IOLog(\"Xbox360Peripheral preferences loaded:\\n  invertLeft X: %s, Y: %s\\n   invertRight X: %s, Y:%s\\n  deadzone Left: %d, Right: %d\\n\\n\",\n            invertLeftX?\"True\":\"False\",invertLeftY?\"True\":\"False\",\n            invertRightX?\"True\":\"False\",invertRightY?\"True\":\"False\",\n            deadzoneLeft,deadzoneRight);\n    */\n}\n\n// Initialise the extension\nbool Xbox360Peripheral::init(OSDictionary *propTable)\n{\n    bool res=super::init(propTable);\n    mainLock = IOLockAlloc();\n    device=NULL;\n    interface=NULL;\n    inPipe=NULL;\n    outPipe=NULL;\n    inBuffer=NULL;\n\tpadHandler = NULL;\n\tserialIn = NULL;\n\tserialInPipe = NULL;\n\tserialInBuffer = NULL;\n\tserialTimer = NULL;\n\tserialHandler = NULL;\n    // Default settings\n    invertLeftX=invertLeftY=FALSE;\n    invertRightX=invertRightY=FALSE;\n    deadzoneLeft=deadzoneRight=0;\n    relativeLeft=relativeRight=FALSE;\n    // Done\n    return res;\n}\n\n// Free the extension\nvoid Xbox360Peripheral::free(void)\n{\n    IOLockFree(mainLock);\n    super::free();\n}\n\nbool Xbox360Peripheral::start(IOService *provider)\n{\n    const IOUSBConfigurationDescriptor *cd;\n    IOUSBFindInterfaceRequest intf;\n    IOUSBFindEndpointRequest pipe;\n    XBOX360_OUT_LED led;\n    IOWorkLoop *workloop = NULL;\n    \n    if (!super::start(provider))\n\t\treturn false;\n    // Get device\n    device=OSDynamicCast(IOUSBDevice,provider);\n    if(device==NULL) {\n        IOLog(\"start - invalid provider\\n\");\n        goto fail;\n    }\n    // Check for configurations\n    if(device->GetNumConfigurations()<1) {\n        device=NULL;\n        IOLog(\"start - device has no configurations!\\n\");\n        goto fail;\n    }\n    // Set configuration\n    cd=device->GetFullConfigurationDescriptor(0);\n    if(cd==NULL) {\n        device=NULL;\n        IOLog(\"start - couldn't get configuration descriptor\\n\");\n        goto fail;\n    }\n    // Open\n    if(!device->open(this)) {\n        device=NULL;\n        IOLog(\"start - unable to open device\\n\");\n        goto fail;\n    }\n    if(device->SetConfiguration(this,cd->bConfigurationValue,true)!=kIOReturnSuccess) {\n        IOLog(\"start - unable to set configuration\\n\");\n        goto fail;\n    }\n    // Get release\n    {\n        UInt16 release = device->GetDeviceRelease();\n        switch (release) {\n            default:\n                IOLog(\"Unknown device release %.4x\", release);\n                // fall through\n            case 0x0110:\n                chatpadInit[0] = 0x01;\n                chatpadInit[1] = 0x02;\n                break;\n            case 0x0114:\n                chatpadInit[0] = 0x09;\n                chatpadInit[1] = 0x00;\n                break;\n        }\n    }\n    // Find correct interface\n    intf.bInterfaceClass=kIOUSBFindInterfaceDontCare;\n    intf.bInterfaceSubClass=93;\n    intf.bInterfaceProtocol=1;\n    intf.bAlternateSetting=kIOUSBFindInterfaceDontCare;\n    interface=device->FindNextInterface(NULL,&intf);\n    if(interface==NULL) {\n        IOLog(\"start - unable to find the interface\\n\");\n        goto fail;\n    }\n    interface->open(this);\n    // Find pipes\n    pipe.direction=kUSBIn;\n    pipe.interval=0;\n    pipe.type=kUSBInterrupt;\n    pipe.maxPacketSize=0;\n    inPipe=interface->FindNextPipe(NULL,&pipe);\n    if(inPipe==NULL) {\n        IOLog(\"start - unable to find in pipe\\n\");\n        goto fail;\n    }\n    inPipe->retain();\n    pipe.direction=kUSBOut;\n    outPipe=interface->FindNextPipe(NULL,&pipe);\n    if(outPipe==NULL) {\n        IOLog(\"start - unable to find out pipe\\n\");\n        goto fail;\n    }\n    outPipe->retain();\n    // Get a buffer\n    inBuffer=IOBufferMemoryDescriptor::inTaskWithOptions(kernel_task,0,GetMaxPacketSize(inPipe));\n    if(inBuffer==NULL) {\n        IOLog(\"start - failed to allocate input buffer\\n\");\n        goto fail;\n    }\n\t// Find chatpad interface\n\tintf.bInterfaceClass = kIOUSBFindInterfaceDontCare;\n\tintf.bInterfaceSubClass = 93;\n\tintf.bInterfaceProtocol = 2;\n\tintf.bAlternateSetting = kIOUSBFindInterfaceDontCare;\n\tserialIn = device->FindNextInterface(NULL, &intf);\n\tif (serialIn == NULL) {\n\t\tIOLog(\"start - unable to find chatpad interface\\n\");\n        goto nochat;\n    }\n\tserialIn->open(this);\n\t// Find chatpad pipe\n\tpipe.direction = kUSBIn;\n\tpipe.interval = 0;\n\tpipe.type = kUSBInterrupt;\n\tpipe.maxPacketSize = 0;\n\tserialInPipe = serialIn->FindNextPipe(NULL, &pipe);\n\tif (serialInPipe == NULL)\n\t{\n\t\tIOLog(\"start - unable to find chatpad in pipe\\n\");\n\t\tgoto fail;\n\t}\n\tserialInPipe->retain();\n\t// Get a buffer for the chatpad\n\tserialInBuffer = IOBufferMemoryDescriptor::inTaskWithOptions(kernel_task, 0, GetMaxPacketSize(serialInPipe));\n\tif (serialInBuffer == NULL)\n\t{\n\t\tIOLog(\"start - failed to allocate input buffer for chatpad\\n\");\n\t\tgoto fail;\n\t}\n\t// Create timer for chatpad\n\tserialTimer = IOTimerEventSource::timerEventSource(this, ChatPadTimerActionWrapper);\n\tif (serialTimer == NULL)\n\t{\n\t\tIOLog(\"start - failed to create timer for chatpad\\n\");\n\t\tgoto fail;\n\t}\n    workloop = getWorkLoop();\n\tif ((workloop == NULL) || (workloop->addEventSource(serialTimer) != kIOReturnSuccess))\n\t{\n\t\tIOLog(\"start - failed to connect timer for chatpad\\n\");\n\t\tgoto fail;\n\t}\n\t// Configure ChatPad\n\t\t// Send 'configuration'\n\tSendInit(0xa30c, 0x4423);\n\tSendInit(0x2344, 0x7f03);\n\tSendInit(0x5839, 0x6832);\n\t\t// Set 'switch'\n    if ((!SendSwitch(false)) || (!SendSwitch(true)) || (!SendSwitch(false)))\n        goto fail;\n\t\t// Begin toggle\n\tserialHeard = false;\n\tserialActive = false;\n\tserialToggle = false;\n\tserialResetCount = 0;\n\tserialTimerState = tsToggle;\n\tserialTimer->setTimeoutMS(1000);\n    // Begin reading\n    if (!QueueSerialRead())\n        goto fail;\nnochat:\n    if (!QueueRead())\n\t\tgoto fail;\n    // Disable LED\n    Xbox360_Prepare(led,outLed);\n    led.pattern=ledOff;\n    QueueWrite(&led,sizeof(led));\n    // Done\n\tPadConnect();\n\tregisterService();\n    return true;\nfail:\n    ReleaseAll();\n    return false;\n}\n\n// Set up an asynchronous read\nbool Xbox360Peripheral::QueueRead(void)\n{\n    IOUSBCompletion complete;\n    IOReturn err;\n\n    if ((inPipe == NULL) || (inBuffer == NULL))\n        return false;\n    complete.target=this;\n    complete.action=ReadCompleteInternal;\n    complete.parameter=inBuffer;\n    err=inPipe->Read(inBuffer,0,0,inBuffer->getLength(),&complete);\n    if(err==kIOReturnSuccess) return true;\n    else {\n        IOLog(\"read - failed to start (0x%.8x)\\n\",err);\n        return false;\n    }\n}\n\nbool Xbox360Peripheral::QueueSerialRead(void)\n{\n    IOUSBCompletion complete;\n    IOReturn err;\n\t\n    if ((serialInPipe == NULL) || (serialInBuffer == NULL))\n        return false;\n    complete.target = this;\n    complete.action = SerialReadCompleteInternal;\n    complete.parameter = serialInBuffer;\n    err = serialInPipe->Read(serialInBuffer, 0, 0, serialInBuffer->getLength(), &complete);\n    if (err == kIOReturnSuccess)\n\t{\n\t\treturn true;\n\t}\n    else\n\t{\n        IOLog(\"read - failed to start for chatpad (0x%.8x)\\n\",err);\n        return false;\n    }\n}\n\n// Set up an asynchronous write\nbool Xbox360Peripheral::QueueWrite(const void *bytes,UInt32 length)\n{\n    IOBufferMemoryDescriptor *outBuffer;\n    IOUSBCompletion complete;\n    IOReturn err;\n    \n    outBuffer=IOBufferMemoryDescriptor::inTaskWithOptions(kernel_task,0,length);\n    if(outBuffer==NULL) {\n        IOLog(\"send - unable to allocate buffer\\n\");\n        return false;\n    }\n    outBuffer->writeBytes(0,bytes,length);\n    complete.target=this;\n    complete.action=WriteCompleteInternal;\n    complete.parameter=outBuffer;\n    err=outPipe->Write(outBuffer,0,0,length,&complete);\n    if(err==kIOReturnSuccess) return true;\n    else {\n        IOLog(\"send - failed to start (0x%.8x)\\n\",err);\n        return false;\n    }\n}\n\nvoid Xbox360Peripheral::stop(IOService *provider)\n{\n    ReleaseAll();\n    super::stop(provider);\n}\n\n// Releases all the objects used\nvoid Xbox360Peripheral::ReleaseAll(void)\n{\n    LockRequired locker(mainLock);\n    \n\tSerialDisconnect();\n\tPadDisconnect();\n\tif (serialTimer != NULL)\n\t{\n\t\tserialTimer->cancelTimeout();\n\t\tgetWorkLoop()->removeEventSource(serialTimer);\n\t\tserialTimer->release();\n\t\tserialTimer = NULL;\n\t}\n\tif (serialInPipe != NULL)\n\t{\n\t\tserialInPipe->Abort();\n\t\tserialInPipe->release();\n\t\tserialInPipe = NULL;\n\t}\n\tif (serialInBuffer != NULL)\n\t{\n\t\tserialInBuffer->release();\n\t\tserialInBuffer = NULL;\n\t}\n\tif (serialIn != NULL)\n\t{\n\t\tserialIn->close(this);\n\t\tserialIn = NULL;\n\t}\n    if(outPipe!=NULL) {\n        outPipe->Abort();\n        outPipe->release();\n        outPipe=NULL;\n    }\n    if(inPipe!=NULL) {\n        inPipe->Abort();\n        inPipe->release();\n        inPipe=NULL;\n    }\n    if(inBuffer!=NULL) {\n        inBuffer->release();\n        inBuffer=NULL;\n    }\n    if(interface!=NULL) {\n        interface->close(this);\n        interface=NULL;\n    }\n    if(device!=NULL) {\n        device->close(this);\n        device=NULL;\n    }\n}\n\n// Handle message sent to the driver\nIOReturn Xbox360Peripheral::message(UInt32 type,IOService *provider,void *argument)\n{\n    switch(type) {\n        case kIOMessageServiceIsTerminated:\n        case kIOMessageServiceIsRequestingClose:\n            if(device->isOpen(this)) ReleaseAll();\n            return kIOReturnSuccess;\n        default:\n            return super::message(type,provider,argument);\n    }\n}\n\n// This returns the abs() value of a short, swapping it if necessary\nstatic inline XBox360_SShort getAbsolute(XBox360_SShort value)\n{\n    XBox360_SShort reverse;\n    \n#ifdef __LITTLE_ENDIAN__\n    reverse=value;\n#elif __BIG_ENDIAN__\n    reverse=((value&0xFF00)>>8)|((value&0x00FF)<<8);\n#else\n#error Unknown CPU byte order\n#endif\n    return (reverse<0)?~reverse:reverse;\n}\n\n// Adjusts the report for any settings speciified by the user\nvoid Xbox360Peripheral::fiddleReport(IOBufferMemoryDescriptor *buffer)\n{\n    XBOX360_IN_REPORT *report=(XBOX360_IN_REPORT*)buffer->getBytesNoCopy();\n    if(invertLeftX) report->left.x=~report->left.x;\n    if(!invertLeftY) report->left.y=~report->left.y;\n    if(invertRightX) report->right.x=~report->right.x;\n    if(!invertRightY) report->right.y=~report->right.y;\n    if(deadzoneLeft!=0) {\n        if(relativeLeft) {\n            if((getAbsolute(report->left.x)<deadzoneLeft)&&(getAbsolute(report->left.y)<deadzoneLeft)) {\n                report->left.x=0;\n                report->left.y=0;\n            }\n        } else {\n            if(getAbsolute(report->left.x)<deadzoneLeft) report->left.x=0;\n            if(getAbsolute(report->left.y)<deadzoneLeft) report->left.y=0;\n        }\n    }\n    if(deadzoneRight!=0) {\n        if(relativeRight) {\n            if((getAbsolute(report->right.x)<deadzoneRight)&&(getAbsolute(report->right.y)<deadzoneRight)) {\n                report->right.x=0;\n                report->right.y=0;\n            }\n        } else {\n            if(getAbsolute(report->right.x)<deadzoneRight) report->right.x=0;\n            if(getAbsolute(report->right.y)<deadzoneRight) report->right.y=0;\n        }\n    }\n}\n\n// This forwards a completed read notification to a member function\nvoid Xbox360Peripheral::ReadCompleteInternal(void *target,void *parameter,IOReturn status,UInt32 bufferSizeRemaining)\n{\n    if(target!=NULL)\n        ((Xbox360Peripheral*)target)->ReadComplete(parameter,status,bufferSizeRemaining);\n}\n\nvoid Xbox360Peripheral::SerialReadCompleteInternal(void *target, void *parameter, IOReturn status, UInt32 bufferSizeRemaining)\n{\n\tif (target != NULL)\n\t\t((Xbox360Peripheral*)target)->SerialReadComplete(parameter, status, bufferSizeRemaining);\n}\n\n// This forwards a completed write notification to a member function\nvoid Xbox360Peripheral::WriteCompleteInternal(void *target,void *parameter,IOReturn status,UInt32 bufferSizeRemaining)\n{\n    if(target!=NULL)\n        ((Xbox360Peripheral*)target)->WriteComplete(parameter,status,bufferSizeRemaining);\n}\n\n// This handles a completed asynchronous read\nvoid Xbox360Peripheral::ReadComplete(void *parameter,IOReturn status,UInt32 bufferSizeRemaining)\n{\n\tif (padHandler != NULL) // avoid deadlock with release\n\t{\n\t\tLockRequired locker(mainLock);\n\t\tIOReturn err;\n\t\tbool reread=!isInactive();\n\t\t\n\t\tswitch(status) {\n\t\t\tcase kIOReturnOverrun:\n\t\t\t\tIOLog(\"read - kIOReturnOverrun, clearing stall\\n\");\n\t\t\t\tif (inPipe != NULL)\n\t\t\t\t\tinPipe->ClearStall();\n\t\t\t\t// Fall through\n\t\t\tcase kIOReturnSuccess:\n\t\t\t\tif (inBuffer != NULL)\n\t\t\t\t{\n\t\t\t\t\tconst XBOX360_IN_REPORT *report=(const XBOX360_IN_REPORT*)inBuffer->getBytesNoCopy();\n\t\t\t\t\tif((report->header.command==inReport)&&(report->header.size==sizeof(XBOX360_IN_REPORT))) {\n\t\t\t\t\t\tfiddleReport(inBuffer);\n\t\t\t\t\t\terr = padHandler->handleReport(inBuffer, kIOHIDReportTypeInput);\n\t\t\t\t\t\tif(err!=kIOReturnSuccess) {\n\t\t\t\t\t\t\tIOLog(\"read - failed to handle report: 0x%.8x\\n\",err);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase kIOReturnNotResponding:\n\t\t\t\tIOLog(\"read - kIOReturnNotResponding\\n\");\n\t\t\t\treread=false;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treread=false;\n\t\t\t\tbreak;\n\t\t}\n\t\tif(reread) QueueRead();\n    }\n}\n\nvoid Xbox360Peripheral::SerialReadComplete(void *parameter, IOReturn status, UInt32 bufferSizeRemaining)\n{\n\tif (padHandler != NULL) // avoid deadlock with release\n\t{\n\t\tLockRequired locker(mainLock);\n\t\tbool reread = !isInactive();\n\t\n\t\tswitch (status)\n\t\t{\n\t\t\tcase kIOReturnOverrun:\n\t\t\t\tIOLog(\"read (serial) - kIOReturnOverrun, clearing stall\\n\");\n\t\t\t\tif (serialInPipe != NULL)\n\t\t\t\t\tserialInPipe->ClearStall();\n\t\t\t\t// Fall through\n\t\t\tcase kIOReturnSuccess:\n\t\t\t\tserialHeard = true;\n\t\t\t\tif (serialInBuffer != NULL)\n\t\t\t\t\tSerialMessage(serialInBuffer, serialInBuffer->getCapacity() - bufferSizeRemaining);\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase kIOReturnNotResponding:\n\t\t\t\tIOLog(\"read (serial) - kIOReturnNotResponding\\n\");\n\t\t\t\treread = false;\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tdefault:\n\t\t\t\treread = false;\n\t\t\t\tbreak;\n\t\t}\n\t\tif (reread)\n\t\t\tQueueSerialRead();\n\t}\n}\n\n// Handle a completed asynchronous write\nvoid Xbox360Peripheral::WriteComplete(void *parameter,IOReturn status,UInt32 bufferSizeRemaining)\n{\n    IOMemoryDescriptor *memory=(IOMemoryDescriptor*)parameter;\n    if(status!=kIOReturnSuccess) {\n        IOLog(\"write - Error writing: 0x%.8x\\n\",status);\n    }\n    memory->release();\n}\n\n\n// Called by the userspace IORegistryEntrySetCFProperties function\nIOReturn Xbox360Peripheral::setProperties(OSObject *properties)\n{\n    OSDictionary *dictionary;\n    \n    dictionary=OSDynamicCast(OSDictionary,properties);\n    if(dictionary!=NULL) {\n        setProperty(kDriverSettingKey,dictionary);\n        readSettings();\n        return kIOReturnSuccess;\n    } else return kIOReturnBadArgument;\n}\n\nIOHIDDevice* Xbox360Peripheral::getController(int index)\n{\n\tswitch (index)\n\t{\n\t\tcase 0:\n\t\t\treturn padHandler;\n\t\tcase 1:\n\t\t\treturn serialHandler;\n\t\tdefault:\n\t\t\treturn NULL;\n\t}\n}\n\n// Main controller support\n\nvoid Xbox360Peripheral::PadConnect(void)\n{\n\tPadDisconnect();\n\tpadHandler = new Xbox360ControllerClass;\n\tif (padHandler != NULL)\n\t{\n        const OSString *keys[] = {\n            OSString::withCString(kIOSerialDeviceType),\n\t\t\tOSString::withCString(\"IOCFPlugInTypes\"),\n\t\t\tOSString::withCString(\"IOKitDebug\"),\n        };\n        const OSObject *objects[] = {\n            OSNumber::withNumber((unsigned long long)1, 32),\n\t\t\tgetProperty(\"IOCFPlugInTypes\"),\n            OSNumber::withNumber((unsigned long long)65535, 32),\n        };\n        OSDictionary *dictionary = OSDictionary::withObjects(objects, keys, sizeof(keys) / sizeof(keys[0]), 0);\n\t\tif (padHandler->init(dictionary))\n\t\t{\n\t\t\tpadHandler->attach(this);\n\t\t\tpadHandler->start(this);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpadHandler->release();\n\t\t\tpadHandler = NULL;\n\t\t}\n\t}\n}\n\nvoid Xbox360Peripheral::PadDisconnect(void)\n{\n\tif (padHandler != NULL)\n\t{\n\t\tpadHandler->terminate(kIOServiceRequired | kIOServiceSynchronous);\n\t\tpadHandler->release();\n\t\tpadHandler = NULL;\n\t}\n}\n\n// Serial peripheral support\n\nvoid Xbox360Peripheral::SerialConnect(void)\n{\n\tSerialDisconnect();\n\tserialHandler = new ChatPadKeyboardClass;\n    if (serialHandler != NULL)\n    {\n        const OSString *keys[] = {\n            OSString::withCString(kIOSerialDeviceType),\n        };\n        const OSObject *objects[] = {\n            OSNumber::withNumber((unsigned long long)0, 32),\n        };\n        OSDictionary *dictionary = OSDictionary::withObjects(objects, keys, sizeof(keys) / sizeof(keys[0]), 0);\n        if (serialHandler->init(dictionary))\n        {\n            serialHandler->attach(this);\n\t\t\tserialHandler->start(this);\n        }\n        else\n        {\n            serialHandler->release();\n            serialHandler = NULL;\n        }\n    }\n}\n\nvoid Xbox360Peripheral::SerialDisconnect(void)\n{\n\tif (serialHandler != NULL)\n\t{\n        // Hope it's okay to terminate twice...\n\t\tserialHandler->terminate(kIOServiceRequired | kIOServiceSynchronous);\n\t\tserialHandler->release();\n\t\tserialHandler = NULL;\n\t}\n}\n\nvoid Xbox360Peripheral::SerialMessage(IOBufferMemoryDescriptor *data, size_t length)\n{\n\tif (serialHandler != NULL)\n\t{\n\t\tchar *buffer = (char*)data->getBytesNoCopy();\n\t\tif ((length == 5) && (buffer[0] == 0x00))\n\t\t\tserialHandler->handleReport(data, kIOHIDReportTypeInput);\n\t}\n}\n"
  },
  {
    "path": "360Controller/_60Controller.h",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    _60Controller.h - declaration of the driver main class\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#ifndef __XBOX360CONTROLLER_H__\n#define __XBOX360CONTROLLER_H__\n\n#include <IOKit/hid/IOHIDDevice.h>\n#include <IOKit/usb/IOUSBDevice.h>\n#include <IOKit/usb/IOUSBInterface.h>\n\nclass Xbox360ControllerClass;\nclass ChatPadKeyboardClass;\n\nclass Xbox360Peripheral : public IOService\n{\n    OSDeclareDefaultStructors(Xbox360Peripheral)\n\nprivate:\n    void ReleaseAll(void);\n    bool QueueRead(void);\n\tbool QueueSerialRead(void);\n\n\tstatic void SerialReadCompleteInternal(void *target,void *parameter,IOReturn status,UInt32 bufferSizeRemaining);\n    static void ReadCompleteInternal(void *target,void *parameter,IOReturn status,UInt32 bufferSizeRemaining);\n    static void WriteCompleteInternal(void *target,void *parameter,IOReturn status,UInt32 bufferSizeRemaining);\n    \n\tvoid SerialReadComplete(void *parameter, IOReturn status, UInt32 bufferSizeRemaining);\n\t\n    void fiddleReport(IOBufferMemoryDescriptor *buffer);\n    \n    void readSettings(void);\n\n\tstatic void ChatPadTimerActionWrapper(OSObject *owner, IOTimerEventSource *sender);\n\tvoid ChatPadTimerAction(IOTimerEventSource *sender);\n\tvoid SendToggle(void);\n\tvoid SendSpecial(UInt16 value);\n\tvoid SendInit(UInt16 value, UInt16 index);\n    bool SendSwitch(bool sendOut);\n\t\n\tvoid PadConnect(void);\n\tvoid PadDisconnect(void);\n\t\n\tvoid SerialConnect(void);\n\tvoid SerialDisconnect(void);\n\tvoid SerialMessage(IOBufferMemoryDescriptor *data, size_t length);\n\nprotected:\n\ttypedef enum {\n\t\ttsToggle,\n\t\ttsReset1,\n\t\ttsReset2,\n\t\ttsMiniToggle,\n\t\ttsSet1,\n\t\ttsSet2,\n\t\ttsSet3,\n\t} TIMER_STATE;\n\t\n    IOUSBDevice *device;\n    IOLock *mainLock;\n\t\n\t// Joypad\n    IOUSBInterface *interface;\n    IOUSBPipe *inPipe,*outPipe;\n    IOBufferMemoryDescriptor *inBuffer;\n\t\n\t// Keyboard\n\tIOUSBInterface *serialIn;\n\tIOUSBPipe *serialInPipe;\n    IOBufferMemoryDescriptor *serialInBuffer;\n\tIOTimerEventSource *serialTimer;\n\tbool serialToggle, serialHeard, serialActive;\n\tint serialResetCount;\n\tTIMER_STATE serialTimerState;\n\tChatPadKeyboardClass *serialHandler;\n\tXbox360ControllerClass *padHandler;\n    UInt8 chatpadInit[2];\n\n    // Settings\n    bool invertLeftX,invertLeftY;\n    bool invertRightX,invertRightY;\n    short deadzoneLeft,deadzoneRight;\n    bool relativeLeft,relativeRight;\n\npublic:\n    // this is from the IORegistryEntry - no provider yet\n    virtual bool init(OSDictionary *propTable);\n    virtual void free(void);\n\n\tbool start(IOService *provider);\n\tvoid stop(IOService *provider);\n\t\n    // IOKit methods. These methods are defines in <IOKit/IOService.h>\n\n    virtual IOReturn setProperties(OSObject *properties);\n\n    virtual IOReturn message(UInt32 type, IOService *provider, void *argument);\n    \n\t// Hooks\n    virtual void ReadComplete(void *parameter,IOReturn status,UInt32 bufferSizeRemaining);\n    virtual void WriteComplete(void *parameter,IOReturn status,UInt32 bufferSizeRemaining);\n\n    bool QueueWrite(const void *bytes,UInt32 length);\n\t\n\tIOHIDDevice* getController(int index);\n};\n\n#endif /* __XBOX360CONTROLLER_H__ */\n"
  },
  {
    "path": "360Controller/chatpadhid.h",
    "content": "/*\r\n MICE Xbox 360 Controller driver for Mac OS X\r\n Copyright (C) 2006-2013 Colin Munro\r\n \r\n chatpadhid.h - a HID descriptor for the Microsoft ChatPad accessory\r\n \r\n This file is part of Xbox360Controller.\r\n \r\n Xbox360Controller is free software; you can redistribute it and/or modify\r\n it under the terms of the GNU General Public License as published by\r\n the Free Software Foundation; either version 2 of the License, or\r\n (at your option) any later version.\r\n \r\n Xbox360Controller is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n GNU General Public License for more details.\r\n \r\n You should have received a copy of the GNU General Public License\r\n along with Foobar; if not, write to the Free Software\r\n Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\r\n */\r\n\r\n// F:\\Documents and Settings\\Desktop\\hid\\ChatPad_Keyboard.h\r\n\r\n\r\nchar ReportDescriptor[58] = {\r\n    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)\r\n    0x09, 0x06,                    // USAGE (Keyboard)\r\n    0xa1, 0x01,                    // COLLECTION (Application)\r\n    0x25, 0x00,                    //   LOGICAL_MAXIMUM (0)\r\n    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)\r\n    0x75, 0x08,                    //   REPORT_SIZE (8)\r\n    0x95, 0x01,                    //   REPORT_COUNT (1)\r\n    0x81, 0x03,                    //   INPUT (Cnst,Var,Abs)\r\n    0x05, 0x07,                    //   USAGE_PAGE (Keyboard)\r\n    0x09, 0xe1,                    //   USAGE (Keyboard LeftShift)\r\n    0x09, 0xe0,                    //   USAGE (Keyboard LeftControl)\r\n    0x09, 0xe2,                    //   USAGE (Keyboard LeftAlt)\r\n    0x09, 0xe3,                    //   USAGE (Keyboard Left GUI)\r\n    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)\r\n    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)\r\n    0x75, 0x01,                    //   REPORT_SIZE (1)\r\n    0x95, 0x04,                    //   REPORT_COUNT (4)\r\n    0x81, 0x02,                    //   INPUT (Data,Var,Abs)\r\n    0x75, 0x01,                    //   REPORT_SIZE (1)\r\n    0x95, 0x04,                    //   REPORT_COUNT (4)\r\n    0x81, 0x03,                    //   INPUT (Cnst,Var,Abs)\r\n    0x95, 0x03,                    //   REPORT_COUNT (3)\r\n    0x75, 0x08,                    //   REPORT_SIZE (8)\r\n    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)\r\n    0x26, 0xe7, 0x00,              //   LOGICAL_MAXIMUM (231)\r\n    0x19, 0x00,                    //   USAGE_MINIMUM (Reserved (no event indicated))\r\n    0x29, 0xe7,                    //   USAGE_MAXIMUM (Keyboard Right GUI)\r\n    0x81, 0x00,                    //   INPUT (Data,Ary,Abs)\r\n    0xc0                           // END_COLLECTION\r\n};\r\n\r\n"
  },
  {
    "path": "360Controller/chatpadkeys.cpp",
    "content": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n chatpadkeys.cpp - Converts a chatpad scancode to a USB key value\n \n This file is part of Xbox360Controller.\n \n Xbox360Controller is free software; you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation; either version 2 of the License, or\n (at your option) any later version.\n \n Xbox360Controller is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n GNU General Public License for more details.\n \n You should have received a copy of the GNU General Public License\n along with Foobar; if not, write to the Free Software\n Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n */\n\n#include \"chatpadkeys.h\"\n\n#define ROW_SIZE\t\t8\n\ntypedef struct MAP_DATA {\n\tunsigned char row[ROW_SIZE];\n} MAP_DATA;\n\nstatic const MAP_DATA columns[] = {\n{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},\n{0x00, 0x24, 0x23, 0x22, 0x21, 0x20, 0x1F, 0x1E},\n{0x00, 0x18, 0x1C, 0x17, 0x15, 0x08, 0x1A, 0x14},\n{0x00, 0x0D, 0x0B, 0x0A, 0x09, 0x07, 0x16, 0x04},\n{0x00, 0x11, 0x05, 0x19, 0x06, 0x1B, 0x1D, 0x00},\n{0x00, 0x4F, 0x10, 0x37, 0x2C, 0x50, 0x00, 0x00},\n{0x00, 0x00, 0x36, 0x28, 0x13, 0x27, 0x26, 0x25},\n{0x00, 0x2A, 0x0F, 0x00, 0x00, 0x12, 0x0C, 0x0E},\n};\n\nunsigned char ChatPad2USB(unsigned char input)\n{\n\tunsigned char row, column;\n\t\n\trow = input & 0x0F;\n\tif (row >= ROW_SIZE)\n\t\treturn 0x00;\n\tcolumn = (input & 0xF0) >> 4;\n\tif (column >= (sizeof(columns) / sizeof(columns[0])))\n\t\treturn 0x00;\n\treturn columns[column].row[row];\n}\n"
  },
  {
    "path": "360Controller/chatpadkeys.h",
    "content": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n chatpadkeys.h - public functions of the ChatPad key handling\n \n This file is part of Xbox360Controller.\n \n Xbox360Controller is free software; you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation; either version 2 of the License, or\n (at your option) any later version.\n \n Xbox360Controller is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n GNU General Public License for more details.\n \n You should have received a copy of the GNU General Public License\n along with Foobar; if not, write to the Free Software\n Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n */\n\nunsigned char ChatPad2USB(unsigned char input);\n"
  },
  {
    "path": "360Controller/version.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>BuildVersion</key>\n\t<string>12</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n\t<key>ProductBuildVersion</key>\n\t<string>7K571</string>\n\t<key>ProjectName</key>\n\t<string>DevToolsWizardTemplates</string>\n\t<key>SourceVersion</key>\n\t<string>3870000</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "360Controller/xbox360hid.h",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    xbox360hid.h - HID descriptor for the driver\n        \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n\n/*\n * This descriptor was generated using the USB HID definition tool available\n * from the USB people's website. It's not quite the same as the HID descriptor\n * on the free60.org site as I created this file before I knew about it and\n * just kept working with this one anyway :)\n */\n\nchar ReportDescriptor[196] = {\n    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)\n    0x09, 0x05,                    // USAGE (Game Pad)\n    0xa1, 0x01,                    // COLLECTION (Application)\n    0x05, 0x01,                    //   USAGE_PAGE (Generic Desktop)\n    0x09, 0x3a,                    //   USAGE (Counted Buffer)\n    0xa1, 0x02,                    //   COLLECTION (Logical)\n    0x75, 0x08,                    //     REPORT_SIZE (8)\n    0x95, 0x02,                    //     REPORT_COUNT (2)\n    0x05, 0x01,                    //     USAGE_PAGE (Generic Desktop)\n    0x09, 0x3f,                    //     USAGE (Reserved)\n    0x09, 0x3b,                    //     USAGE (Byte Count)\n    0x81, 0x01,                    //     INPUT (Cnst,Ary,Abs)\n    0x75, 0x01,                    //     REPORT_SIZE (1)\n    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)\n    0x25, 0x01,                    //     LOGICAL_MAXIMUM (1)\n    0x35, 0x00,                    //     PHYSICAL_MINIMUM (0)\n    0x45, 0x01,                    //     PHYSICAL_MAXIMUM (1)\n    0x95, 0x04,                    //     REPORT_COUNT (4)\n    0x05, 0x09,                    //     USAGE_PAGE (Button)\n    0x19, 0x0c,                    //     USAGE_MINIMUM (Button 12)\n    0x29, 0x0f,                    //     USAGE_MAXIMUM (Button 15)\n    0x81, 0x02,                    //     INPUT (Data,Var,Abs)\n    0x75, 0x01,                    //     REPORT_SIZE (1)\n    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)\n    0x25, 0x01,                    //     LOGICAL_MAXIMUM (1)\n    0x35, 0x00,                    //     PHYSICAL_MINIMUM (0)\n    0x45, 0x01,                    //     PHYSICAL_MAXIMUM (1)\n    0x95, 0x04,                    //     REPORT_COUNT (4)\n    0x05, 0x09,                    //     USAGE_PAGE (Button)\n    0x09, 0x09,                    //     USAGE (Button 9)\n    0x09, 0x0a,                    //     USAGE (Button 10)\n    0x09, 0x07,                    //     USAGE (Button 7)\n    0x09, 0x08,                    //     USAGE (Button 8)\n    0x81, 0x02,                    //     INPUT (Data,Var,Abs)\n    0x75, 0x01,                    //     REPORT_SIZE (1)\n    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)\n    0x25, 0x01,                    //     LOGICAL_MAXIMUM (1)\n    0x35, 0x00,                    //     PHYSICAL_MINIMUM (0)\n    0x45, 0x01,                    //     PHYSICAL_MAXIMUM (1)\n    0x95, 0x03,                    //     REPORT_COUNT (3)\n    0x05, 0x09,                    //     USAGE_PAGE (Button)\n    0x09, 0x05,                    //     USAGE (Button 5)\n    0x09, 0x06,                    //     USAGE (Button 6)\n    0x09, 0x0b,                    //     USAGE (Button 11)\n    0x81, 0x02,                    //     INPUT (Data,Var,Abs)\n    0x75, 0x01,                    //     REPORT_SIZE (1)\n    0x95, 0x01,                    //     REPORT_COUNT (1)\n    0x81, 0x01,                    //     INPUT (Cnst,Ary,Abs)\n    0x75, 0x01,                    //     REPORT_SIZE (1)\n    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)\n    0x25, 0x01,                    //     LOGICAL_MAXIMUM (1)\n    0x35, 0x00,                    //     PHYSICAL_MINIMUM (0)\n    0x45, 0x01,                    //     PHYSICAL_MAXIMUM (1)\n    0x95, 0x04,                    //     REPORT_COUNT (4)\n    0x05, 0x09,                    //     USAGE_PAGE (Button)\n    0x19, 0x01,                    //     USAGE_MINIMUM (Button 1)\n    0x29, 0x04,                    //     USAGE_MAXIMUM (Button 4)\n    0x81, 0x02,                    //     INPUT (Data,Var,Abs)\n    0x75, 0x08,                    //     REPORT_SIZE (8)\n    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)\n    0x26, 0xff, 0x00,              //     LOGICAL_MAXIMUM (255)\n    0x35, 0x00,                    //     PHYSICAL_MINIMUM (0)\n    0x46, 0xff, 0x00,              //     PHYSICAL_MAXIMUM (255)\n    0x95, 0x02,                    //     REPORT_COUNT (2)\n    0x05, 0x01,                    //     USAGE_PAGE (Generic Desktop)\n    0x09, 0x32,                    //     USAGE (Z)\n    0x09, 0x35,                    //     USAGE (Rz)\n    0x81, 0x02,                    //     INPUT (Data,Var,Abs)\n    0x75, 0x10,                    //     REPORT_SIZE (16)\n    0x16, 0x00, 0x80,              //     LOGICAL_MINIMUM (-32768)\n    0x26, 0xff, 0x7f,              //     LOGICAL_MAXIMUM (32767)\n    0x36, 0x00, 0x80,              //     PHYSICAL_MINIMUM (-32768)\n    0x46, 0xff, 0x7f,              //     PHYSICAL_MAXIMUM (32767)\n    0x05, 0x01,                    //     USAGE_PAGE (Generic Desktop)\n    0x09, 0x01,                    //     USAGE (Pointer)\n    0xa1, 0x00,                    //     COLLECTION (Physical)\n    0x95, 0x02,                    //       REPORT_COUNT (2)\n    0x05, 0x01,                    //       USAGE_PAGE (Generic Desktop)\n    0x09, 0x30,                    //       USAGE (X)\n    0x09, 0x31,                    //       USAGE (Y)\n    0x81, 0x02,                    //       INPUT (Data,Var,Abs)\n    0xc0,                          //     END_COLLECTION\n    0x05, 0x01,                    //     USAGE_PAGE (Generic Desktop)\n    0x09, 0x01,                    //     USAGE (Pointer)\n    0xa1, 0x00,                    //     COLLECTION (Physical)\n    0x95, 0x02,                    //       REPORT_COUNT (2)\n    0x05, 0x01,                    //       USAGE_PAGE (Generic Desktop)\n    0x09, 0x33,                    //       USAGE (Rx)\n    0x09, 0x34,                    //       USAGE (Ry)\n    0x81, 0x02,                    //       INPUT (Data,Var,Abs)\n    0xc0,                          //     END_COLLECTION\n    0xc0,                          //   END_COLLECTION\n    0xc0                           // END_COLLECTION\n};"
  },
  {
    "path": "360Daemon/360Daemon.1",
    "content": ".\\\"Modified from man(1) of FreeBSD, the NetBSD mdoc.template, and mdoc.samples.\r\n.\\\"See Also:\r\n.\\\"man mdoc.samples for a complete listing of options\r\n.\\\"man mdoc for the short list of editing options\r\n.\\\"/usr/share/misc/mdoc.template\r\n.Dd 7/8/07               \\\" DATE \r\n.Dt 360Daemon 1      \\\" Program name and manual section number \r\n.Os Darwin\r\n.Sh NAME                 \\\" Section Header - required - don't modify \r\n.Nm 360Daemon,\r\n.\\\" The following lines are read in generating the apropos(man -k) database. Use only key\r\n.\\\" words here as the database is built based on the words here and in the .ND line. \r\n.Nm Other_name_for_same_program(),\r\n.Nm Yet another name for the same program.\r\n.\\\" Use .Nm macro to designate other names for the documented program.\r\n.Nd This line parsed for whatis database.\r\n.Sh SYNOPSIS             \\\" Section Header - required - don't modify\r\n.Nm\r\n.Op Fl abcd              \\\" [-abcd]\r\n.Op Fl a Ar path         \\\" [-a path] \r\n.Op Ar file              \\\" [file]\r\n.Op Ar                   \\\" [file ...]\r\n.Ar arg0                 \\\" Underlined argument - use .Ar anywhere to underline\r\narg2 ...                 \\\" Arguments\r\n.Sh DESCRIPTION          \\\" Section Header - required - don't modify\r\nUse the .Nm macro to refer to your program throughout the man page like such:\r\n.Nm\r\nUnderlining is accomplished with the .Ar macro like this:\r\n.Ar underlined text .\r\n.Pp                      \\\" Inserts a space\r\nA list of items with descriptions:\r\n.Bl -tag -width -indent  \\\" Begins a tagged list \r\n.It item a               \\\" Each item preceded by .It macro\r\nDescription of item a\r\n.It item b\r\nDescription of item b\r\n.El                      \\\" Ends the list\r\n.Pp\r\nA list of flags and their descriptions:\r\n.Bl -tag -width -indent  \\\" Differs from above in tag removed \r\n.It Fl a                 \\\"-a flag as a list item\r\nDescription of -a flag\r\n.It Fl b\r\nDescription of -b flag\r\n.El                      \\\" Ends the list\r\n.Pp\r\n.\\\" .Sh ENVIRONMENT      \\\" May not be needed\r\n.\\\" .Bl -tag -width \"ENV_VAR_1\" -indent \\\" ENV_VAR_1 is width of the string ENV_VAR_1\r\n.\\\" .It Ev ENV_VAR_1\r\n.\\\" Description of ENV_VAR_1\r\n.\\\" .It Ev ENV_VAR_2\r\n.\\\" Description of ENV_VAR_2\r\n.\\\" .El                      \r\n.Sh FILES                \\\" File used or created by the topic of the man page\r\n.Bl -tag -width \"/Users/joeuser/Library/really_long_file_name\" -compact\r\n.It Pa /usr/share/file_name\r\nFILE_1 description\r\n.It Pa /Users/joeuser/Library/really_long_file_name\r\nFILE_2 description\r\n.El                      \\\" Ends the list\r\n.\\\" .Sh DIAGNOSTICS       \\\" May not be needed\r\n.\\\" .Bl -diag\r\n.\\\" .It Diagnostic Tag\r\n.\\\" Diagnostic informtion here.\r\n.\\\" .It Diagnostic Tag\r\n.\\\" Diagnostic informtion here.\r\n.\\\" .El\r\n.Sh SEE ALSO \r\n.\\\" List links in ascending order by section, alphabetically within a section.\r\n.\\\" Please do not reference files that do not exist without filing a bug report\r\n.Xr a 1 , \r\n.Xr b 1 ,\r\n.Xr c 1 ,\r\n.Xr a 2 ,\r\n.Xr b 2 ,\r\n.Xr a 3 ,\r\n.Xr b 3 \r\n.\\\" .Sh BUGS              \\\" Document known, unremedied bugs \r\n.\\\" .Sh HISTORY           \\\" Document history if command behaves in a unique manner"
  },
  {
    "path": "360Daemon/360Daemon.m",
    "content": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n 360Daemon.m - main functionality of the support daemon\n \n This file is part of Xbox360Controller.\n \n Xbox360Controller is free software; you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation; either version 2 of the License, or\n (at your option) any later version.\n \n Xbox360Controller is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n GNU General Public License for more details.\n \n You should have received a copy of the GNU General Public License\n along with Foobar; if not, write to the Free Software\n Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n */\n#import <Foundation/Foundation.h>\n#import <IOKit/IOKitLib.h>\n#import <IOKit/IOCFPlugIn.h>\n#import <IOKit/hid/IOHIDLib.h>\n#import <IOKit/hid/IOHIDKeys.h>\n#include <IOKit/usb/IOUSBLib.h>\n#import <ForceFeedback/ForceFeedback.h>\n#include \"ControlPrefs.h\"\n\n#define CHECK_SHOWAGAIN     @\"Do not show this message again\"\n\n#define INSTALL_PATH        @\"/Library/Application Support/MICE/360Daemon\"\n#define RESOURCE_PATH       INSTALL_PATH @\"/Resources\"\n\nmach_port_t masterPort;\nIONotificationPortRef notifyPort;\nCFRunLoopSourceRef notifySource;\nio_iterator_t onIteratorWired;\nio_iterator_t onIteratorWireless;\nio_iterator_t onIteratorOther;\nio_iterator_t offIteratorWired;\nio_iterator_t offIteratorWireless;\nBOOL foundWirelessReceiver;\nNSString *leds[4];\n\nCFUserNotificationRef activeAlert = nil;\nCFRunLoopSourceRef activeAlertSource;\nint activeAlertIndex;\n\nenum {\n    kaPlugNCharge = 0,\n};\n\nNSString *alertStrings[] = {\n    @\"You have attached a Microsoft Play & Charge cable for your XBox 360 Wireless Controller. While this cable will allow you to charge your wireless controller, you will require the Microsoft Wireless Gaming Receiver for Windows to use your wireless controller in Mac OS X!\",\n};\n\nstatic void releaseAlert(void)\n{\n    CFRunLoopRemoveSource(CFRunLoopGetCurrent(), activeAlertSource, kCFRunLoopCommonModes);\n    CFRelease(activeAlertSource);\n    CFRelease(activeAlert);\n    activeAlertSource = nil;\n    activeAlert = nil;\n}\n\nstatic void callbackAlert(CFUserNotificationRef userNotification, CFOptionFlags responseFlags)\n{\n    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];\n\n    if (responseFlags & CFUserNotificationCheckBoxChecked(0))\n        SetAlertDisabled(activeAlertIndex);\n    releaseAlert();\n    [pool release];\n}\n\nstatic void ShowAlert(int index)\n{\n    SInt32 error;\n    NSArray *checkBoxes = [NSArray arrayWithObjects:CHECK_SHOWAGAIN, nil];\n    NSArray *dictKeys = [NSArray arrayWithObjects:\n        (NSString*)kCFUserNotificationAlertHeaderKey,\n        (NSString*)kCFUserNotificationAlertMessageKey,\n        (NSString*)kCFUserNotificationCheckBoxTitlesKey,\n        (NSString*)kCFUserNotificationIconURLKey,\n        nil];\n    NSArray *dictValues = [NSArray arrayWithObjects:\n        @\"XBox 360 Controller Driver\",\n        alertStrings[index],\n        checkBoxes,\n        [NSURL fileURLWithPath:RESOURCE_PATH @\"/Alert.tif\"],\n        nil];\n    NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:dictValues forKeys:dictKeys];\n    \n    if (AlertDisabled(index))\n        return;\n\n    if (activeAlert != nil)\n    {\n        CFUserNotificationCancel(activeAlert);\n        releaseAlert();\n    }\n\n    activeAlertIndex = index;\n    activeAlert = CFUserNotificationCreate(kCFAllocatorDefault, 0, kCFUserNotificationPlainAlertLevel, &error, (CFDictionaryRef)dictionary);\n    activeAlertSource = CFUserNotificationCreateRunLoopSource(kCFAllocatorDefault, activeAlert, callbackAlert, 0);\n    CFRunLoopAddSource(CFRunLoopGetCurrent(), activeAlertSource, kCFRunLoopCommonModes);\n}\n\nstatic void ConfigureDevice(io_service_t object)\n{\n    IOCFPlugInInterface **iodev;\n    IOUSBDeviceInterface **dev;\n    IOReturn err;\n    SInt32 score;\n    \n    if ((!IOCreatePlugInInterfaceForService(object, kIOUSBDeviceUserClientTypeID, kIOCFPlugInInterfaceID, &iodev, &score))&&iodev)\n    {\n        err = (*iodev)->QueryInterface(iodev, CFUUIDGetUUIDBytes(kIOUSBDeviceInterfaceID), (LPVOID)&dev);\n        (*iodev)->Release(iodev);\n        if ((!err) && dev)\n        {\n            if ((*dev)->USBDeviceOpen(dev) == 0)\n            {\n                IOUSBConfigurationDescriptorPtr confDesc;\n                \n                if ((*dev)->GetConfigurationDescriptorPtr(dev, 0, &confDesc) == 0)\n                {\n                    (*dev)->SetConfiguration(dev, confDesc->bConfigurationValue);\n                    // Open interface? Hopefully not necessary\n                }\n                (*dev)->USBDeviceClose(dev);\n            }\n            (*dev)->Release(dev);\n        }\n    }\n}\n\n// Supported device - connecting - set settings?\nstatic void callbackConnected(void *param,io_iterator_t iterator)\n{\n    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];\n    io_service_t object = 0;\n    \n    while ((object = IOIteratorNext(iterator)) != 0)\n    {\n\t\t/*\n\t\tCFStringRef bob = IOObjectCopyClass(object);\n\t\tNSLog(@\"Found %p: %@\", object, bob);\n\t\tCFRelease(bob);\n\t\t */\n        if (IOObjectConformsTo(object, \"WirelessHIDDevice\") || IOObjectConformsTo(object, \"Xbox360ControllerClass\"))\n        {\n            FFDeviceObjectReference forceFeedback;\n            NSString *serialNumber;\n            \n            serialNumber = GetSerialNumber(object);\n            // Supported device - load settings\n            ConfigController(object, GetController(serialNumber));\n            // Set LEDs\n            forceFeedback = 0;\n            if (FFCreateDevice(object, &forceFeedback) != FF_OK)\n                forceFeedback = 0;\n            if (forceFeedback != 0)\n            {\n                FFEFFESCAPE escape;\n                unsigned char c;\n                int i;\n    \n                c = 0x0a;\n                if (serialNumber != nil)\n                {\n                    for (i = 0; i < 4; i++)\n                    {\n                        if ((leds[i] == nil) || ([leds[i] caseInsensitiveCompare:serialNumber] == NSOrderedSame))\n                        {\n                            c = 0x06 + i;\n                            if (leds[i] == nil)\n                                leds[i] = [serialNumber retain];\n//                            NSLog(@\"Added controller with LED %i\", i);\n                            break;\n                        }\n                    }\n                }\n                escape.dwSize = sizeof(escape);\n                escape.dwCommand = 0x02;\n                escape.cbInBuffer = sizeof(c);\n                escape.lpvInBuffer = &c;\n                escape.cbOutBuffer = 0;\n                escape.lpvOutBuffer = NULL;\n                FFDeviceEscape(forceFeedback, &escape);\n                FFReleaseDevice(forceFeedback);\n            }\n        }\n        else\n        {\n            CFTypeRef vendorID = IORegistryEntrySearchCFProperty(object,kIOServicePlane,CFSTR(\"idVendor\"),kCFAllocatorDefault,kIORegistryIterateRecursively | kIORegistryIterateParents);\n            CFTypeRef productID = IORegistryEntrySearchCFProperty(object,kIOServicePlane,CFSTR(\"idProduct\"),kCFAllocatorDefault,kIORegistryIterateRecursively | kIORegistryIterateParents);\n            if ((vendorID != NULL) && (productID != NULL))\n            {\n                UInt32 idVendor = [((NSNumber*)vendorID) unsignedIntValue];\n                UInt32 idProduct = [((NSNumber*)productID) unsignedIntValue];\n                if (idVendor == 0x045e)\n                {\n                    // Microsoft\n                    switch (idProduct)\n                    {\n                        case 0x028f:    // Plug'n'charge cable\n                            if (!foundWirelessReceiver)\n                                ShowAlert(kaPlugNCharge);\n                            ConfigureDevice(object);\n                            break;\n                        case 0x0719:    // Microsoft Wireless Gaming Receiver\n                        case 0x0291:    // Third party Wireless Gaming Receiver\n                            foundWirelessReceiver = TRUE;\n                            break;\n                    }\n                }\n            }\n            if (vendorID != NULL)\n                CFRelease(vendorID);\n            if (productID != NULL)\n                CFRelease(productID);\n        }\n        IOObjectRelease(object);\n    }\n    [pool release];\n}\n\n// Supported device - disconnecting\nstatic void callbackDisconnected(void *param, io_iterator_t iterator)\n{\n    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];\n    io_service_t object = 0;\n    NSString *serial;\n    int i;\n    \n    while ((object = IOIteratorNext(iterator)) != 0)\n    {\n\t\t/*\n\t\tCFStringRef bob = IOObjectCopyClass(object);\n\t\tNSLog(@\"Lost %p: %@\", object, bob);\n\t\tCFRelease(bob);\n\t\t */\n        serial = GetSerialNumber(object);\n        if (serial != nil)\n        {\n            for (i = 0; i < 4; i++)\n            {\n                if (leds[i] == nil)\n                    continue;\n                if ([leds[i] caseInsensitiveCompare:serial] == NSOrderedSame)\n                {\n                    [leds[i] release];\n                    leds[i] = nil;\n//                    NSLog(@\"Removed controller with LED %i\", i);\n                }\n            }\n        }\n        IOObjectRelease(object);\n    }\n    [pool release];\n}\n\n// Entry point\nint main (int argc, const char * argv[])\n{\n    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];\n\n    foundWirelessReceiver = FALSE;\n    memset(leds, 0, sizeof(leds));\n    // Get master port, for accessing I/O Kit\n    IOMasterPort(MACH_PORT_NULL,&masterPort);\n    // Set up notification of USB device addition/removal\n    notifyPort=IONotificationPortCreate(masterPort);\n    notifySource=IONotificationPortGetRunLoopSource(notifyPort);\n    CFRunLoopAddSource(CFRunLoopGetCurrent(),notifySource,kCFRunLoopCommonModes);\n    // Start listening\n        // USB devices\n    IOServiceAddMatchingNotification(notifyPort, kIOFirstMatchNotification, IOServiceMatching(kIOUSBDeviceClassName), callbackConnected, NULL, &onIteratorOther);\n    callbackConnected(NULL, onIteratorOther);\n        // Wired 360 devices\n    IOServiceAddMatchingNotification(notifyPort, kIOFirstMatchNotification, IOServiceMatching(\"Xbox360ControllerClass\"), callbackConnected, NULL, &onIteratorWired);\n    callbackConnected(NULL, onIteratorWired);\n    IOServiceAddMatchingNotification(notifyPort, kIOTerminatedNotification, IOServiceMatching(\"Xbox360ControllerClass\"), callbackDisconnected, NULL, &offIteratorWired);\n    callbackDisconnected(NULL, offIteratorWired);\n        // Wireless 360 devices\n    IOServiceAddMatchingNotification(notifyPort, kIOFirstMatchNotification, IOServiceMatching(\"WirelessHIDDevice\"), callbackConnected, NULL, &onIteratorWireless);\n    callbackConnected(NULL, onIteratorWireless);\n    IOServiceAddMatchingNotification(notifyPort, kIOTerminatedNotification, IOServiceMatching(\"WirelessHIDDevice\"), callbackDisconnected, NULL, &offIteratorWireless);\n    callbackDisconnected(NULL, offIteratorWireless);\n    // Run loop\n    CFRunLoopRun();\n    // Stop listening\n    IOObjectRelease(onIteratorOther);\n    IOObjectRelease(onIteratorWired);\n    IOObjectRelease(offIteratorWired);\n    IOObjectRelease(onIteratorWireless);\n    IOObjectRelease(offIteratorWireless);\n    CFRunLoopRemoveSource(CFRunLoopGetCurrent(), notifySource, kCFRunLoopCommonModes);\n    CFRunLoopSourceInvalidate(notifySource);\n    IONotificationPortDestroy(notifyPort);\n    // End\n    [pool release];\n    return 0;\n}\n"
  },
  {
    "path": "360Daemon/360Daemon.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 45;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t3B7905000CE3F6A400ACB699 /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B7904FF0CE3F6A400ACB699 /* ForceFeedback.framework */; };\n\t\t3B7A8E2C0CE14E38005BB45B /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B7A8E2B0CE14E38005BB45B /* IOKit.framework */; };\n\t\t3B8698090CE2903100283CEC /* ControlPrefs.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B8698080CE2903100283CEC /* ControlPrefs.m */; };\n\t\t8DD76F9A0486AA7600D96B5E /* 360Daemon.m in Sources */ = {isa = PBXBuildFile; fileRef = 08FB7796FE84155DC02AAC07 /* 360Daemon.m */; settings = {ATTRIBUTES = (); }; };\n\t\t8DD76F9C0486AA7600D96B5E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08FB779EFE84155DC02AAC07 /* Foundation.framework */; };\n\t\t8DD76F9F0486AA7600D96B5E /* 360Daemon.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = C6859EA3029092ED04C91782 /* 360Daemon.1 */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t8DD76F9E0486AA7600D96B5E /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 8;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t\t8DD76F9F0486AA7600D96B5E /* 360Daemon.1 in CopyFiles */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t08FB7796FE84155DC02AAC07 /* 360Daemon.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = 360Daemon.m; sourceTree = \"<group>\"; };\n\t\t08FB779EFE84155DC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = \"<absolute>\"; };\n\t\t32A70AAB03705E1F00C91783 /* 360Daemon_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 360Daemon_Prefix.pch; sourceTree = \"<group>\"; };\n\t\t3B7904D50CE3F13700ACB699 /* Alert.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = Alert.tif; sourceTree = \"<group>\"; };\n\t\t3B7904FF0CE3F6A400ACB699 /* ForceFeedback.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ForceFeedback.framework; path = /System/Library/Frameworks/ForceFeedback.framework; sourceTree = \"<absolute>\"; };\n\t\t3B7A8E2B0CE14E38005BB45B /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = \"<absolute>\"; };\n\t\t3B8698070CE2903100283CEC /* ControlPrefs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ControlPrefs.h; sourceTree = \"<group>\"; };\n\t\t3B8698080CE2903100283CEC /* ControlPrefs.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ControlPrefs.m; sourceTree = \"<group>\"; };\n\t\t3BBB7EED16C387C600BC7827 /* com.mice.360Daemon.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = com.mice.360Daemon.plist; sourceTree = \"<group>\"; };\n\t\t8DD76FA10486AA7600D96B5E /* 360Daemon */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = 360Daemon; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tC6859EA3029092ED04C91782 /* 360Daemon.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = 360Daemon.1; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t8DD76F9B0486AA7600D96B5E /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8DD76F9C0486AA7600D96B5E /* Foundation.framework in Frameworks */,\n\t\t\t\t3B7A8E2C0CE14E38005BB45B /* IOKit.framework in Frameworks */,\n\t\t\t\t3B7905000CE3F6A400ACB699 /* ForceFeedback.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t08FB7794FE84155DC02AAC07 /* 360Daemon */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t08FB7795FE84155DC02AAC07 /* Source */,\n\t\t\t\tC6859EA2029092E104C91782 /* Documentation */,\n\t\t\t\t08FB779DFE84155DC02AAC07 /* External Frameworks and Libraries */,\n\t\t\t\t1AB674ADFE9D54B511CA2CBB /* Products */,\n\t\t\t);\n\t\t\tname = 360Daemon;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t08FB7795FE84155DC02AAC07 /* Source */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B7904D50CE3F13700ACB699 /* Alert.tif */,\n\t\t\t\t3B8698070CE2903100283CEC /* ControlPrefs.h */,\n\t\t\t\t3B8698080CE2903100283CEC /* ControlPrefs.m */,\n\t\t\t\t32A70AAB03705E1F00C91783 /* 360Daemon_Prefix.pch */,\n\t\t\t\t08FB7796FE84155DC02AAC07 /* 360Daemon.m */,\n\t\t\t\t3BBB7EED16C387C600BC7827 /* com.mice.360Daemon.plist */,\n\t\t\t);\n\t\t\tname = Source;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t08FB779DFE84155DC02AAC07 /* External Frameworks and Libraries */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B7904FF0CE3F6A400ACB699 /* ForceFeedback.framework */,\n\t\t\t\t3B7A8E2B0CE14E38005BB45B /* IOKit.framework */,\n\t\t\t\t08FB779EFE84155DC02AAC07 /* Foundation.framework */,\n\t\t\t);\n\t\t\tname = \"External Frameworks and Libraries\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1AB674ADFE9D54B511CA2CBB /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8DD76FA10486AA7600D96B5E /* 360Daemon */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tC6859EA2029092E104C91782 /* Documentation */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC6859EA3029092ED04C91782 /* 360Daemon.1 */,\n\t\t\t);\n\t\t\tname = Documentation;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t8DD76F960486AA7600D96B5E /* 360Daemon */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 1DEB927408733DD40010E9CD /* Build configuration list for PBXNativeTarget \"360Daemon\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t8DD76F990486AA7600D96B5E /* Sources */,\n\t\t\t\t8DD76F9B0486AA7600D96B5E /* Frameworks */,\n\t\t\t\t8DD76F9E0486AA7600D96B5E /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = 360Daemon;\n\t\t\tproductInstallPath = \"$(HOME)/bin\";\n\t\t\tproductName = 360Daemon;\n\t\t\tproductReference = 8DD76FA10486AA7600D96B5E /* 360Daemon */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t08FB7793FE84155DC02AAC07 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tbuildConfigurationList = 1DEB927808733DD40010E9CD /* Build configuration list for PBXProject \"360Daemon\" */;\n\t\t\tcompatibilityVersion = \"Xcode 2.4\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 1;\n\t\t\tknownRegions = (\n\t\t\t\tEnglish,\n\t\t\t\tJapanese,\n\t\t\t\tFrench,\n\t\t\t\tGerman,\n\t\t\t);\n\t\t\tmainGroup = 08FB7794FE84155DC02AAC07 /* 360Daemon */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t8DD76F960486AA7600D96B5E /* 360Daemon */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t8DD76F990486AA7600D96B5E /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8DD76F9A0486AA7600D96B5E /* 360Daemon.m in Sources */,\n\t\t\t\t3B8698090CE2903100283CEC /* ControlPrefs.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t1DEB927508733DD40010E9CD /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_32_64_BIT)\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = YES;\n\t\t\t\tGCC_MODEL_TUNING = G5;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = 360Daemon_Prefix.pch;\n\t\t\t\tINSTALL_PATH = \"$(HOME)/bin\";\n\t\t\t\tPRODUCT_NAME = 360Daemon;\n\t\t\t\tSDKROOT = \"\";\n\t\t\t\tZERO_LINK = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1DEB927608733DD40010E9CD /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_GENERATE_DEBUGGING_SYMBOLS = NO;\n\t\t\t\tGCC_MODEL_TUNING = G5;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = 360Daemon_Prefix.pch;\n\t\t\t\tINSTALL_PATH = \"$(HOME)/bin\";\n\t\t\t\tPRODUCT_NAME = 360Daemon;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t1DEB927908733DD40010E9CD /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"Developer ID Application: Colin Munro\";\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.5;\n\t\t\t\tPREBINDING = NO;\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\tSDKROOT = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1DEB927A08733DD40010E9CD /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_32_64_BIT)\";\n\t\t\t\tCODE_SIGN_IDENTITY = \"Developer ID Application: Colin Munro\";\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.5;\n\t\t\t\tPREBINDING = NO;\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\tSDKROOT = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t1DEB927408733DD40010E9CD /* Build configuration list for PBXNativeTarget \"360Daemon\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1DEB927508733DD40010E9CD /* Debug */,\n\t\t\t\t1DEB927608733DD40010E9CD /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t1DEB927808733DD40010E9CD /* Build configuration list for PBXProject \"360Daemon\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1DEB927908733DD40010E9CD /* Debug */,\n\t\t\t\t1DEB927A08733DD40010E9CD /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 08FB7793FE84155DC02AAC07 /* Project object */;\n}\n"
  },
  {
    "path": "360Daemon/360Daemon_Prefix.pch",
    "content": "//\n// Prefix header for all source files of the '360Daemon' target in the '360Daemon' project.\n//\n\n#ifdef __OBJC__\n    #import <Foundation/Foundation.h>\n#endif\n"
  },
  {
    "path": "360Daemon/ControlPrefs.h",
    "content": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n ControlPrefs.h - interface to the preferences functionality\n \n This file is part of Xbox360Controller.\n \n Xbox360Controller is free software; you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation; either version 2 of the License, or\n (at your option) any later version.\n \n Xbox360Controller is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n GNU General Public License for more details.\n \n You should have received a copy of the GNU General Public License\n along with Foobar; if not, write to the Free Software\n Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n */\n#import <Cocoa/Cocoa.h>\n\n#define DOM_DAEMON      CFSTR(\"com.mice.driver.Xbox360Controller.daemon\")\n#define DOM_CONTROLLERS CFSTR(\"com.mice.driver.Xbox360Controller.devices\")\n\n#define D_SHOWONCE      @\"ShowAlert\"\n#define D_KNOWNDEV      @\"KnownDevices\"\n\n// Daemon's own settings\nvoid SetAlertDisabled(int index);\nBOOL AlertDisabled(int index);\n\n// Controller settings\nvoid SetController(NSString *serial, NSDictionary *data);\nNSDictionary* GetController(NSString *serial);\n\n// Configuration settings\nvoid SetKnownDevices(NSDictionary *devices);\nNSDictionary* GetKnownDevices(void);\n\n// Utility functions\nNSString* GetSerialNumber(io_service_t device);\nvoid ConfigController(io_service_t device, NSDictionary *config);\n"
  },
  {
    "path": "360Daemon/ControlPrefs.m",
    "content": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n ControlPrefs.m - code to read and write shared preferences\n \n This file is part of Xbox360Controller.\n \n Xbox360Controller is free software; you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation; either version 2 of the License, or\n (at your option) any later version.\n \n Xbox360Controller is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n GNU General Public License for more details.\n \n You should have received a copy of the GNU General Public License\n along with Foobar; if not, write to the Free Software\n Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n */\n#import \"ControlPrefs.h\"\n\nvoid SetAlertDisabled(int index)\n{\n    NSString *prop;\n    NSNumber *value;\n\n    prop = [NSString stringWithFormat:@\"%@%i\", D_SHOWONCE, index];\n    value = [NSNumber numberWithBool:TRUE];\n    CFPreferencesSetValue((CFStringRef)prop, value, DOM_DAEMON, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost);\n    CFPreferencesSynchronize((CFStringRef)DOM_DAEMON, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost);\n}\n\nBOOL AlertDisabled(int index)\n{\n    NSString *prop;\n    BOOL result;\n    CFPropertyListRef value;\n    \n    result = FALSE;\n    prop = [NSString stringWithFormat:@\"%@%i\", D_SHOWONCE, index];\n    value = CFPreferencesCopyValue((CFStringRef)prop, DOM_DAEMON, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost);\n    if (value != NULL)\n    {\n        result = [((NSNumber*)value) boolValue];\n        CFRelease(value);\n    }\n    return result;\n}\n\nvoid SetController(NSString *serial, NSDictionary *data)\n{\n    CFPreferencesSetValue((CFStringRef)serial, data, DOM_CONTROLLERS, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);\n    CFPreferencesSynchronize(DOM_CONTROLLERS, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);\n}\n\nNSDictionary* GetController(NSString *serial)\n{\n    CFPropertyListRef value;\n    \n    CFPreferencesSynchronize(DOM_CONTROLLERS, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);\n    value = CFPreferencesCopyValue((CFStringRef)serial, DOM_CONTROLLERS, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);\n    return [((NSDictionary*)value) autorelease];\n}\n\nNSString* GetSerialNumber(io_service_t device)\n{\n    CFTypeRef value;\n    \n    value = IORegistryEntrySearchCFProperty(device, kIOServicePlane, CFSTR(\"USB Serial Number\"), kCFAllocatorDefault, kIORegistryIterateRecursively);\n    if (value == NULL)\n        value = IORegistryEntrySearchCFProperty(device, kIOServicePlane, CFSTR(\"SerialNumber\"), kCFAllocatorDefault, kIORegistryIterateRecursively);\n    return [((NSString*)value) autorelease];\n}\n\nvoid ConfigController(io_service_t device, NSDictionary *config)\n{\n    IORegistryEntrySetCFProperties(device, config);\n}\n\nvoid SetKnownDevices(NSDictionary *devices)\n{\n    // Setting the dictionary should work?\n    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:devices];\n    CFPreferencesSetValue((CFStringRef)D_KNOWNDEV, data, DOM_CONTROLLERS, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);\n    CFPreferencesSynchronize(DOM_CONTROLLERS, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);\n}\n\nNSDictionary* GetKnownDevices(void)\n{\n    CFPropertyListRef value;\n    NSData *data;\n    \n    CFPreferencesSynchronize(DOM_CONTROLLERS, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);\n    value = CFPreferencesCopyValue((CFStringRef)D_KNOWNDEV, DOM_CONTROLLERS, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);\n    data = [(NSData*)value autorelease];\n    if (data == nil)\n        return nil;\n    return [NSKeyedUnarchiver unarchiveObjectWithData:data];\n}\n"
  },
  {
    "path": "360Daemon/FoundationTool.pbproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 39;\n\tobjects = {\n\t\t014CEA4F0018CE4811CA2923 = {\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tbuildSettings = {\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = YES;\n\t\t\t\tGCC_GENERATE_DEBUGGING_SYMBOLS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tZERO_LINK = YES;\n\t\t\t};\n\t\t\tisa = PBXBuildStyle;\n\t\t\tname = Development;\n\t\t};\n\t\t014CEA500018CE4811CA2923 = {\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tbuildSettings = {\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = NO;\n\t\t\t\tZERO_LINK = NO;\n\t\t\t};\n\t\t\tisa = PBXBuildStyle;\n\t\t\tname = Deployment;\n\t\t};\n//010\n//011\n//012\n//013\n//014\n//080\n//081\n//082\n//083\n//084\n\t\t08FB7793FE84155DC02AAC07 = {\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tbuildStyles = (\n\t\t\t\t014CEA4F0018CE4811CA2923,\n\t\t\t\t014CEA500018CE4811CA2923,\n\t\t\t);\n\t\t\thasScannedForEncodings = 1;\n\t\t\tisa = PBXProject;\n\t\t\tmainGroup = 08FB7794FE84155DC02AAC07;\n\t\t\tprojectDirPath = \"\";\n\t\t\ttargets = (\n\t\t\t\t8DD76F960486AA7600D96B5E,\n\t\t\t);\n\t\t};\n\t\t08FB7794FE84155DC02AAC07 = {\n\t\t\tchildren = (\n\t\t\t\t08FB7795FE84155DC02AAC07,\n\t\t\t\tC6859EA2029092E104C91782,\n\t\t\t\t08FB779DFE84155DC02AAC07,\n\t\t\t\t1AB674ADFE9D54B511CA2CBB,\n\t\t\t);\n\t\t\tisa = PBXGroup;\n\t\t\tname = \"«PROJECTNAME»\";\n\t\t\trefType = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t08FB7795FE84155DC02AAC07 = {\n\t\t\tchildren = (\n\t\t\t\t32A70AAB03705E1F00C91783,\n\t\t\t\t08FB7796FE84155DC02AAC07,\n\t\t\t);\n\t\t\tisa = PBXGroup;\n\t\t\tname = Source;\n\t\t\trefType = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t08FB7796FE84155DC02AAC07 = {\n\t\t\tfileEncoding = 4;\n\t\t\tisa = PBXFileReference;\n\t\t\tlastKnownFileType = sourcecode.c.objc;\n\t\t\tpath = \"«PROJECTNAME».m\";\n\t\t\trefType = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t08FB779DFE84155DC02AAC07 = {\n\t\t\tchildren = (\n\t\t\t\t08FB779EFE84155DC02AAC07,\n\t\t\t);\n\t\t\tisa = PBXGroup;\n\t\t\tname = \"External Frameworks and Libraries\";\n\t\t\trefType = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t08FB779EFE84155DC02AAC07 = {\n\t\t\tfallbackIsa = PBXFileReference;\n\t\t\tisa = PBXFrameworkReference;\n\t\t\tlastKnownFileType = wrapper.framework;\n\t\t\tname = Foundation.framework;\n\t\t\tpath = /System/Library/Frameworks/Foundation.framework;\n\t\t\trefType = 0;\n\t\t\tsourceTree = \"<absolute>\";\n\t\t};\n//080\n//081\n//082\n//083\n//084\n//1A0\n//1A1\n//1A2\n//1A3\n//1A4\n\t\t1AB674ADFE9D54B511CA2CBB = {\n\t\t\tchildren = (\n\t\t\t\t8DD76FA10486AA7600D96B5E,\n\t\t\t);\n\t\t\tisa = PBXGroup;\n\t\t\tname = Products;\n\t\t\trefType = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n//1A0\n//1A1\n//1A2\n//1A3\n//1A4\n//320\n//321\n//322\n//323\n//324\n\t\t32A70AAB03705E1F00C91783 = {\n\t\t\tfileEncoding = 4;\n\t\t\tisa = PBXFileReference;\n\t\t\tlastKnownFileType = file;\n\t\t\tpath = \"«PROJECTNAME»_Prefix.pch\";\n\t\t\trefType = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n//320\n//321\n//322\n//323\n//324\n//8D0\n//8D1\n//8D2\n//8D3\n//8D4\n\t\t8DD76F960486AA7600D96B5E = {\n\t\t\tbuildPhases = (\n\t\t\t\t8DD76F990486AA7600D96B5E,\n\t\t\t\t8DD76F9B0486AA7600D96B5E,\n\t\t\t\t8DD76F9E0486AA7600D96B5E,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_GENERATE_DEBUGGING_SYMBOLS = NO;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"«PROJECTNAME»_Prefix.pch\";\n\t\t\t\tINSTALL_PATH = \"$(HOME)/bin\";\n\t\t\t\tPRODUCT_NAME = \"«PROJECTNAME»\";\n\t\t\t};\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tisa = PBXNativeTarget;\n\t\t\tname = \"«PROJECTNAME»\";\n\t\t\tproductInstallPath = \"$(HOME)/bin\";\n\t\t\tproductName = \"«PROJECTNAME»\";\n\t\t\tproductReference = 8DD76FA10486AA7600D96B5E;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t8DD76F990486AA7600D96B5E = {\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8DD76F9A0486AA7600D96B5E,\n\t\t\t);\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t8DD76F9A0486AA7600D96B5E = {\n\t\t\tfileRef = 08FB7796FE84155DC02AAC07;\n\t\t\tisa = PBXBuildFile;\n\t\t\tsettings = {\n\t\t\t\tATTRIBUTES = (\n\t\t\t\t);\n\t\t\t};\n\t\t};\n\t\t8DD76F9B0486AA7600D96B5E = {\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8DD76F9C0486AA7600D96B5E,\n\t\t\t);\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t8DD76F9C0486AA7600D96B5E = {\n\t\t\tfileRef = 08FB779EFE84155DC02AAC07;\n\t\t\tisa = PBXBuildFile;\n\t\t\tsettings = {\n\t\t\t};\n\t\t};\n\t\t8DD76F9E0486AA7600D96B5E = {\n\t\t\tbuildActionMask = 8;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t\t8DD76F9F0486AA7600D96B5E,\n\t\t\t);\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n\t\t8DD76F9F0486AA7600D96B5E = {\n\t\t\tfileRef = C6859EA3029092ED04C91782;\n\t\t\tisa = PBXBuildFile;\n\t\t\tsettings = {\n\t\t\t};\n\t\t};\n\t\t8DD76FA10486AA7600D96B5E = {\n\t\t\texplicitFileType = \"compiled.mach-o.executable\";\n\t\t\tincludeInIndex = 0;\n\t\t\tisa = PBXFileReference;\n\t\t\tpath = \"«PROJECTNAME»\";\n\t\t\trefType = 3;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n//8D0\n//8D1\n//8D2\n//8D3\n//8D4\n//C60\n//C61\n//C62\n//C63\n//C64\n\t\tC6859EA2029092E104C91782 = {\n\t\t\tchildren = (\n\t\t\t\tC6859EA3029092ED04C91782,\n\t\t\t);\n\t\t\tisa = PBXGroup;\n\t\t\tname = Documentation;\n\t\t\trefType = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tC6859EA3029092ED04C91782 = {\n\t\t\tisa = PBXFileReference;\n\t\t\tlastKnownFileType = file;\n\t\t\tpath = \"«PROJECTNAME».1\";\n\t\t\trefType = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t};\n\trootObject = 08FB7793FE84155DC02AAC07;\n}\n"
  },
  {
    "path": "360Daemon/com.mice.360Daemon.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>RunAtLoad</key>\n\t<true/>\n\t<key>ProgramArguments</key>\n\t<array>\n\t\t<string>/Library/Application Support/MICE/360Daemon/360Daemon</string>\n\t</array>\n\t<key>KeepAlive</key>\n\t<true/>\n\t<key>Label</key>\n\t<string>com.mice.360Daemon</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "DriverTool/DriverTool.1",
    "content": ".\\\"Modified from man(1) of FreeBSD, the NetBSD mdoc.template, and mdoc.samples.\n.\\\"See Also:\n.\\\"man mdoc.samples for a complete listing of options\n.\\\"man mdoc for the short list of editing options\n.\\\"/usr/share/misc/mdoc.template\n.Dd 8/05/2011               \\\" DATE \n.Dt DriverTool 1      \\\" Program name and manual section number \n.Os Darwin\n.Sh NAME                 \\\" Section Header - required - don't modify \n.Nm DriverTool,\n.\\\" The following lines are read in generating the apropos(man -k) database. Use only key\n.\\\" words here as the database is built based on the words here and in the .ND line. \n.Nm Other_name_for_same_program(),\n.Nm Yet another name for the same program.\n.\\\" Use .Nm macro to designate other names for the documented program.\n.Nd This line parsed for whatis database.\n.Sh SYNOPSIS             \\\" Section Header - required - don't modify\n.Nm\n.Op Fl abcd              \\\" [-abcd]\n.Op Fl a Ar path         \\\" [-a path] \n.Op Ar file              \\\" [file]\n.Op Ar                   \\\" [file ...]\n.Ar arg0                 \\\" Underlined argument - use .Ar anywhere to underline\narg2 ...                 \\\" Arguments\n.Sh DESCRIPTION          \\\" Section Header - required - don't modify\nUse the .Nm macro to refer to your program throughout the man page like such:\n.Nm\nUnderlining is accomplished with the .Ar macro like this:\n.Ar underlined text .\n.Pp                      \\\" Inserts a space\nA list of items with descriptions:\n.Bl -tag -width -indent  \\\" Begins a tagged list \n.It item a               \\\" Each item preceded by .It macro\nDescription of item a\n.It item b\nDescription of item b\n.El                      \\\" Ends the list\n.Pp\nA list of flags and their descriptions:\n.Bl -tag -width -indent  \\\" Differs from above in tag removed \n.It Fl a                 \\\"-a flag as a list item\nDescription of -a flag\n.It Fl b\nDescription of -b flag\n.El                      \\\" Ends the list\n.Pp\n.\\\" .Sh ENVIRONMENT      \\\" May not be needed\n.\\\" .Bl -tag -width \"ENV_VAR_1\" -indent \\\" ENV_VAR_1 is width of the string ENV_VAR_1\n.\\\" .It Ev ENV_VAR_1\n.\\\" Description of ENV_VAR_1\n.\\\" .It Ev ENV_VAR_2\n.\\\" Description of ENV_VAR_2\n.\\\" .El                      \n.Sh FILES                \\\" File used or created by the topic of the man page\n.Bl -tag -width \"/Users/joeuser/Library/really_long_file_name\" -compact\n.It Pa /usr/share/file_name\nFILE_1 description\n.It Pa /Users/joeuser/Library/really_long_file_name\nFILE_2 description\n.El                      \\\" Ends the list\n.\\\" .Sh DIAGNOSTICS       \\\" May not be needed\n.\\\" .Bl -diag\n.\\\" .It Diagnostic Tag\n.\\\" Diagnostic informtion here.\n.\\\" .It Diagnostic Tag\n.\\\" Diagnostic informtion here.\n.\\\" .El\n.Sh SEE ALSO \n.\\\" List links in ascending order by section, alphabetically within a section.\n.\\\" Please do not reference files that do not exist without filing a bug report\n.Xr a 1 , \n.Xr b 1 ,\n.Xr c 1 ,\n.Xr a 2 ,\n.Xr b 2 ,\n.Xr a 3 ,\n.Xr b 3 \n.\\\" .Sh BUGS              \\\" Document known, unremedied bugs \n.\\\" .Sh HISTORY           \\\" Document history if command behaves in a unique manner"
  },
  {
    "path": "DriverTool/DriverTool.m",
    "content": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n DriverTool.m - implementation of driver info tweaking tool\n \n This file is part of Xbox360Controller.\n \n Xbox360Controller is free software; you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation; either version 2 of the License, or\n (at your option) any later version.\n \n Xbox360Controller is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n GNU General Public License for more details.\n \n You should have received a copy of the GNU General Public License\n along with Foobar; if not, write to the Free Software\n Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n */\n#import <Foundation/Foundation.h>\n\n#define DRIVER_NAME     @\"360Controller.kext\"\n\nstatic NSDictionary *infoPlistAttributes = nil;\n\nstatic NSString* GetDriverDirectory(void)\n{\n    NSArray *data = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSSystemDomainMask, YES);\n    return [[data objectAtIndex:0] stringByAppendingPathComponent:@\"Extensions\"];\n}\n\nstatic NSString* GetDriverConfigPath(NSString *driver)\n{\n    NSString *root = GetDriverDirectory();\n    NSString *driverPath = [root stringByAppendingPathComponent:driver];\n    NSString *contents = [driverPath stringByAppendingPathComponent:@\"Contents\"];\n    return [contents stringByAppendingPathComponent:@\"Info.plist\"];\n}\n\nstatic id ReadDriverConfig(NSString *driver)\n{\n    NSString *filename;\n    NSError *error = nil;\n    NSData *data;\n    NSDictionary *config;\n    \n    filename = GetDriverConfigPath(driver);\n    infoPlistAttributes = [[[NSFileManager defaultManager] attributesOfItemAtPath:filename error:&error] retain];\n    if (infoPlistAttributes == nil)\n    {\n        NSLog(@\"Warning: Failed to read attributes of '%@': %@\",\n              filename, error);\n    }\n    data = [NSData dataWithContentsOfFile:filename];\n    config = [NSPropertyListSerialization propertyListFromData:data mutabilityOption:0 format:NULL errorDescription:NULL];\n    return config;\n}\n\nstatic void WriteDriverConfig(NSString *driver, id config)\n{\n    NSString *filename;\n    NSString *errorString;\n    NSData *data;\n    \n    filename = GetDriverConfigPath(driver);\n    errorString = nil;\n    data = [NSPropertyListSerialization dataFromPropertyList:config format:NSPropertyListXMLFormat_v1_0 errorDescription:&errorString];\n    if (data == nil)\n        NSLog(@\"Error writing config for driver: %@\", errorString);\n    [errorString release];\n    if (![data writeToFile:filename atomically:NO])\n        NSLog(@\"Failed to write file!\");\n    if (infoPlistAttributes != nil)\n    {\n        NSError *error = nil;\n        if (![[NSFileManager defaultManager] setAttributes:infoPlistAttributes ofItemAtPath:filename error:&error])\n        {\n            NSLog(@\"Error setting attributes on '%@': %@\",\n                  filename, error);\n        }\n    }\n}\n\nstatic void ScrubDevices(NSMutableDictionary *devices)\n{\n    NSMutableArray *deviceKeys;\n    \n    deviceKeys = [NSMutableArray arrayWithCapacity:10];\n    for (NSString *key in [devices allKeys])\n    {\n        NSDictionary *device = [devices objectForKey:key];\n        if ([(NSString*)[device objectForKey:@\"IOClass\"] compare:@\"Xbox360Peripheral\"] == NSOrderedSame)\n            [deviceKeys addObject:key];\n    }\n    [devices removeObjectsForKeys:deviceKeys];\n}\n\nstatic id MakeMutableCopy(id object)\n{\n    return [(id<NSObject>)CFPropertyListCreateDeepCopy(\n                    kCFAllocatorDefault,\n                    (CFTypeRef)object,\n                    kCFPropertyListMutableContainers) autorelease];\n}\n\nstatic void AddDevice(NSMutableDictionary *personalities, NSString *name, int vendor, int product)\n{\n    NSMutableDictionary *controller;\n    \n    controller = [NSMutableDictionary dictionaryWithCapacity:10];\n    \n    // Standard \n    [controller setObject:@\"com.mice.driver.Xbox360Controller\"\n                   forKey:@\"CFBundleIdentifier\"];\n    [controller setObject:[NSDictionary dictionaryWithObject:@\"360Controller.kext/Contents/PlugIns/Feedback360.plugin\"\n                                                      forKey:@\"F4545CE5-BF5B-11D6-A4BB-0003933E3E3E\"]\n                   forKey:@\"IOCFPlugInTypes\"];\n    [controller setObject:@\"Xbox360Peripheral\"\n                   forKey:@\"IOClass\"];\n    [controller setObject:@\"IOUSBDevice\"\n                   forKey:@\"IOProviderClass\"];\n    [controller setObject:[NSNumber numberWithInt:65535]\n                   forKey:@\"IOKitDebug\"];\n    \n    // Device-specific\n    [controller setObject:[NSNumber numberWithInt:vendor]\n                   forKey:@\"idVendor\"];\n    [controller setObject:[NSNumber numberWithInt:product]\n                   forKey:@\"idProduct\"];\n    \n    // Add it to the tree\n    [personalities setObject:controller\n                      forKey:name];\n}\n\nstatic void AddDevices(NSMutableDictionary *personalities, int argc, const char *argv[])\n{\n    int i, count;\n    \n    count = (argc - 2) / 3;\n    for (i = 0; i < count; i++)\n    {\n        NSString *name = [NSString stringWithCString:argv[(i * 3) + 2] encoding:NSUTF8StringEncoding];\n        int vendor = atoi(argv[(i * 3) + 3]);\n        int product = atoi(argv[(i * 3) + 4]);\n        AddDevice(personalities, name, vendor, product);\n    }\n}\n\nint main (int argc, const char * argv[]) {\n    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];\n\n    NSDictionary *config = ReadDriverConfig(DRIVER_NAME);\n    if (argc == 1)\n    {\n        // Print out current types\n        NSDictionary *types;\n        NSArray *keys;\n        \n        types = [config objectForKey:@\"IOKitPersonalities\"];\n        keys = [types allKeys];\n        for (NSString *key in keys)\n        {\n            NSDictionary *device = [types objectForKey:key];\n            if ([(NSString*)[device objectForKey:@\"IOClass\"] compare:@\"Xbox360Peripheral\"] != NSOrderedSame)\n                continue;\n            fprintf(stdout, \"%s,%i,%i\\n\",\n                    [key UTF8String],\n                    [[device objectForKey:@\"idVendor\"] intValue],\n                    [[device objectForKey:@\"idProduct\"] intValue]);\n        }\n    }\n    else if ((argc > 1) && (strcmp(argv[1], \"edit\") == 0) && (((argc - 2) % 3) == 0))\n    {\n        NSMutableDictionary *saving;\n        NSMutableDictionary *devices;\n        \n        saving = MakeMutableCopy(config);\n        devices = [saving objectForKey:@\"IOKitPersonalities\"];\n        ScrubDevices(devices);\n        AddDevices(devices, argc, argv);\n        WriteDriverConfig(DRIVER_NAME, saving);\n\n        system(\"/usr/bin/touch /System/Library/Extensions\");\n    }\n    else\n        NSLog(@\"Invalid number of parameters (%i)\", argc);\n    \n    [pool drain];\n    return 0;\n}\n"
  },
  {
    "path": "DriverTool/DriverTool.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 45;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t8DD76F9A0486AA7600D96B5E /* DriverTool.m in Sources */ = {isa = PBXBuildFile; fileRef = 08FB7796FE84155DC02AAC07 /* DriverTool.m */; settings = {ATTRIBUTES = (); }; };\n\t\t8DD76F9C0486AA7600D96B5E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08FB779EFE84155DC02AAC07 /* Foundation.framework */; };\n\t\t8DD76F9F0486AA7600D96B5E /* DriverTool.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = C6859EA3029092ED04C91782 /* DriverTool.1 */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t8DD76F9E0486AA7600D96B5E /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 8;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t\t8DD76F9F0486AA7600D96B5E /* DriverTool.1 in CopyFiles */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t08FB7796FE84155DC02AAC07 /* DriverTool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DriverTool.m; sourceTree = \"<group>\"; };\n\t\t08FB779EFE84155DC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = \"<absolute>\"; };\n\t\t32A70AAB03705E1F00C91783 /* DriverTool_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DriverTool_Prefix.pch; sourceTree = \"<group>\"; };\n\t\t8DD76FA10486AA7600D96B5E /* DriverTool */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = DriverTool; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tC6859EA3029092ED04C91782 /* DriverTool.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = DriverTool.1; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t8DD76F9B0486AA7600D96B5E /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8DD76F9C0486AA7600D96B5E /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t08FB7794FE84155DC02AAC07 /* DriverTool */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t08FB7795FE84155DC02AAC07 /* Source */,\n\t\t\t\tC6859EA2029092E104C91782 /* Documentation */,\n\t\t\t\t08FB779DFE84155DC02AAC07 /* External Frameworks and Libraries */,\n\t\t\t\t1AB674ADFE9D54B511CA2CBB /* Products */,\n\t\t\t);\n\t\t\tname = DriverTool;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t08FB7795FE84155DC02AAC07 /* Source */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t32A70AAB03705E1F00C91783 /* DriverTool_Prefix.pch */,\n\t\t\t\t08FB7796FE84155DC02AAC07 /* DriverTool.m */,\n\t\t\t);\n\t\t\tname = Source;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t08FB779DFE84155DC02AAC07 /* External Frameworks and Libraries */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t08FB779EFE84155DC02AAC07 /* Foundation.framework */,\n\t\t\t);\n\t\t\tname = \"External Frameworks and Libraries\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1AB674ADFE9D54B511CA2CBB /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8DD76FA10486AA7600D96B5E /* DriverTool */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tC6859EA2029092E104C91782 /* Documentation */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC6859EA3029092ED04C91782 /* DriverTool.1 */,\n\t\t\t);\n\t\t\tname = Documentation;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t8DD76F960486AA7600D96B5E /* DriverTool */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 1DEB927408733DD40010E9CD /* Build configuration list for PBXNativeTarget \"DriverTool\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t8DD76F990486AA7600D96B5E /* Sources */,\n\t\t\t\t8DD76F9B0486AA7600D96B5E /* Frameworks */,\n\t\t\t\t8DD76F9E0486AA7600D96B5E /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = DriverTool;\n\t\t\tproductInstallPath = \"$(HOME)/bin\";\n\t\t\tproductName = DriverTool;\n\t\t\tproductReference = 8DD76FA10486AA7600D96B5E /* DriverTool */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t08FB7793FE84155DC02AAC07 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tbuildConfigurationList = 1DEB927808733DD40010E9CD /* Build configuration list for PBXProject \"DriverTool\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.1\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 1;\n\t\t\tknownRegions = (\n\t\t\t\tEnglish,\n\t\t\t\tJapanese,\n\t\t\t\tFrench,\n\t\t\t\tGerman,\n\t\t\t);\n\t\t\tmainGroup = 08FB7794FE84155DC02AAC07 /* DriverTool */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t8DD76F960486AA7600D96B5E /* DriverTool */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t8DD76F990486AA7600D96B5E /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8DD76F9A0486AA7600D96B5E /* DriverTool.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t1DEB927508733DD40010E9CD /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = YES;\n\t\t\t\tGCC_MODEL_TUNING = G5;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = DriverTool_Prefix.pch;\n\t\t\t\tINSTALL_PATH = /usr/local/bin;\n\t\t\t\tPRODUCT_NAME = DriverTool;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1DEB927608733DD40010E9CD /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tGCC_MODEL_TUNING = G5;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = DriverTool_Prefix.pch;\n\t\t\t\tINSTALL_PATH = /usr/local/bin;\n\t\t\t\tPRODUCT_NAME = DriverTool;\n\t\t\t\tSDKROOT = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t1DEB927908733DD40010E9CD /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_32_64_BIT)\";\n\t\t\t\tCODE_SIGN_IDENTITY = \"Developer ID Application: Colin Munro\";\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.5;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPREBINDING = NO;\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\tSDKROOT = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1DEB927A08733DD40010E9CD /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_32_64_BIT)\";\n\t\t\t\tCODE_SIGN_IDENTITY = \"Developer ID Application: Colin Munro\";\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.5;\n\t\t\t\tPREBINDING = NO;\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\tSDKROOT = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t1DEB927408733DD40010E9CD /* Build configuration list for PBXNativeTarget \"DriverTool\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1DEB927508733DD40010E9CD /* Debug */,\n\t\t\t\t1DEB927608733DD40010E9CD /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t1DEB927808733DD40010E9CD /* Build configuration list for PBXProject \"DriverTool\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1DEB927908733DD40010E9CD /* Debug */,\n\t\t\t\t1DEB927A08733DD40010E9CD /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 08FB7793FE84155DC02AAC07 /* Project object */;\n}\n"
  },
  {
    "path": "DriverTool/DriverTool_Prefix.pch",
    "content": "//\n// Prefix header for all source files of the 'DriverTool' target in the 'DriverTool' project.\n//\n\n#ifdef __OBJC__\n    #import <Foundation/Foundation.h>\n#endif\n"
  },
  {
    "path": "Feedback360/English.lproj/InfoPlist.strings",
    "content": "﻿/* Localized versions of Info.plist keys */\n\nCFBundleName = \"Feedback360\";\nNSHumanReadableCopyright = \"© Colin Munro, 2005-2011\";"
  },
  {
    "path": "Feedback360/Feedback360.xcodeproj/colin.mode1",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>ActivePerspectiveName</key>\n\t<string>Project</string>\n\t<key>AllowedModules</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXSmartGroupTreeModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Groups and Files Outline View</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXNavigatorGroup</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Editor</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>XCTaskListModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Task List</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>XCDetailModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>File and Smart Group Detail Viewer</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>1</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXBuildResultsModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Detailed Build Results Viewer</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>1</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXProjectFindModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Project Batch Find Tool</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXRunSessionModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Run Log</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXBookmarksModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Bookmarks Tool</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXClassBrowserModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Class Browser</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXCVSModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Source Code Control Tool</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXDebugBreakpointsModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Debug Breakpoints Tool</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>XCDockableInspector</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Inspector</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXOpenQuicklyModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Open Quickly Tool</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>1</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXDebugSessionModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Debugger</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>1</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXDebugCLIModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Debug Console</string>\n\t\t</dict>\n\t</array>\n\t<key>Description</key>\n\t<string>DefaultDescriptionKey</string>\n\t<key>DockingSystemVisible</key>\n\t<false/>\n\t<key>Extension</key>\n\t<string>mode1</string>\n\t<key>FavBarConfig</key>\n\t<dict>\n\t\t<key>PBXProjectModuleGUID</key>\n\t\t<string>3B2EF59109661AF5007BFB7B</string>\n\t\t<key>XCBarModuleItemNames</key>\n\t\t<dict/>\n\t\t<key>XCBarModuleItems</key>\n\t\t<array/>\n\t</dict>\n\t<key>FirstTimeWindowDisplayed</key>\n\t<false/>\n\t<key>Identifier</key>\n\t<string>com.apple.perspectives.project.mode1</string>\n\t<key>MajorVersion</key>\n\t<integer>31</integer>\n\t<key>MinorVersion</key>\n\t<integer>1</integer>\n\t<key>Name</key>\n\t<string>Default</string>\n\t<key>Notifications</key>\n\t<array/>\n\t<key>OpenEditors</key>\n\t<array/>\n\t<key>PerspectiveWidths</key>\n\t<array>\n\t\t<integer>-1</integer>\n\t\t<integer>-1</integer>\n\t</array>\n\t<key>Perspectives</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>ChosenToolbarItems</key>\n\t\t\t<array>\n\t\t\t\t<string>active-target-popup</string>\n\t\t\t\t<string>active-buildstyle-popup</string>\n\t\t\t\t<string>action</string>\n\t\t\t\t<string>NSToolbarFlexibleSpaceItem</string>\n\t\t\t\t<string>buildOrClean</string>\n\t\t\t\t<string>build-and-runOrDebug</string>\n\t\t\t\t<string>com.apple.ide.PBXToolbarStopButton</string>\n\t\t\t\t<string>get-info</string>\n\t\t\t\t<string>toggle-editor</string>\n\t\t\t\t<string>NSToolbarFlexibleSpaceItem</string>\n\t\t\t\t<string>com.apple.pbx.toolbar.searchfield</string>\n\t\t\t</array>\n\t\t\t<key>ControllerClassBaseName</key>\n\t\t\t<string></string>\n\t\t\t<key>IconName</key>\n\t\t\t<string>WindowOfProjectWithEditor</string>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>perspective.project</string>\n\t\t\t<key>IsVertical</key>\n\t\t\t<false/>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>BecomeActive</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>PBXBottomSmartGroupGIDs</key>\n\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t<string>1C37FBAC04509CD000000102</string>\n\t\t\t\t\t\t\t<string>1C37FAAC04509CD000000102</string>\n\t\t\t\t\t\t\t<string>1C08E77C0454961000C914BD</string>\n\t\t\t\t\t\t\t<string>1C37FABC05509CD000000102</string>\n\t\t\t\t\t\t\t<string>1C37FABC05539CD112110102</string>\n\t\t\t\t\t\t\t<string>E2644B35053B69B200211256</string>\n\t\t\t\t\t\t\t<string>1C37FABC04509CD000100104</string>\n\t\t\t\t\t\t\t<string>1CC0EA4004350EF90044410B</string>\n\t\t\t\t\t\t\t<string>1CC0EA4004350EF90041110B</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t<string>1CE0B1FE06471DED0097A5F4</string>\n\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t<string>Files</string>\n\t\t\t\t\t\t<key>PBXProjectStructureProvided</key>\n\t\t\t\t\t\t<string>yes</string>\n\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleColumnData</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleColumnWidthsKey</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<real>186</real>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleColumnsKey_v4</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<string>MainColumn</string>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<string>089C166AFE841209C02AAC07</string>\n\t\t\t\t\t\t\t\t<string>08FB77AFFE84173DC02AAC07</string>\n\t\t\t\t\t\t\t\t<string>089C167CFE841241C02AAC07</string>\n\t\t\t\t\t\t\t\t<string>3B2EF5470965B8E3007BFB7B</string>\n\t\t\t\t\t\t\t\t<string>089C1671FE841209C02AAC07</string>\n\t\t\t\t\t\t\t\t<string>3B2EF54B0965C358007BFB7B</string>\n\t\t\t\t\t\t\t\t<string>0AA1909FFE8422F4C02AAC07</string>\n\t\t\t\t\t\t\t\t<string>19C28FB6FE9D52B211CA2CBB</string>\n\t\t\t\t\t\t\t\t<string>1C37FABC05509CD000000102</string>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>\n\t\t\t\t\t\t\t<string>{{0, 0}, {186, 338}}</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<key>PBXTopSmartGroupGIDs</key>\n\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t<key>XCIncludePerspectivesSwitch</key>\n\t\t\t\t\t\t<true/>\n\t\t\t\t\t\t<key>XCSharingToken</key>\n\t\t\t\t\t\t<string>com.apple.Xcode.GFSharingToken</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t<string>{{0, 0}, {203, 356}}</string>\n\t\t\t\t\t\t<key>GroupTreeTableConfiguration</key>\n\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t<string>MainColumn</string>\n\t\t\t\t\t\t\t<real>186</real>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t<string>308 400 690 397 0 0 1280 1002 </string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t<string>PBXSmartGroupTreeModule</string>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>203pt</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1CE0B20306471E060097A5F4</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>MyNewFile14.java</string>\n\t\t\t\t\t\t\t\t<key>PBXSplitModuleInNavigatorKey</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Split0</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t\t\t<string>1CE0B20406471E060097A5F4</string>\n\t\t\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t\t\t<string>MyNewFile14.java</string>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>SplitCount</key>\n\t\t\t\t\t\t\t\t\t<string>1</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>StatusBarVisibility</key>\n\t\t\t\t\t\t\t\t<true/>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {482, 0}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>308 400 690 397 0 0 1280 1002 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXNavigatorGroup</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>0pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1CE0B20506471E060097A5F4</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>Detail</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 5}, {482, 351}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>308 400 690 397 0 0 1280 1002 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>XCDetailModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>351pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>482pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Project</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>XCModuleDock</string>\n\t\t\t\t<string>PBXSmartGroupTreeModule</string>\n\t\t\t\t<string>XCModuleDock</string>\n\t\t\t\t<string>PBXNavigatorGroup</string>\n\t\t\t\t<string>XCDetailModule</string>\n\t\t\t</array>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>3BCC40840BDA915400B1619B</string>\n\t\t\t\t<string>1CE0B1FE06471DED0097A5F4</string>\n\t\t\t\t<string>3BCC40850BDA915400B1619B</string>\n\t\t\t\t<string>1CE0B20306471E060097A5F4</string>\n\t\t\t\t<string>1CE0B20506471E060097A5F4</string>\n\t\t\t</array>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.default</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ControllerClassBaseName</key>\n\t\t\t<string></string>\n\t\t\t<key>IconName</key>\n\t\t\t<string>WindowOfProject</string>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>perspective.morph</string>\n\t\t\t<key>IsVertical</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>BecomeActive</key>\n\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>PBXBottomSmartGroupGIDs</key>\n\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t<string>1C37FBAC04509CD000000102</string>\n\t\t\t\t\t\t\t<string>1C37FAAC04509CD000000102</string>\n\t\t\t\t\t\t\t<string>1C08E77C0454961000C914BD</string>\n\t\t\t\t\t\t\t<string>1C37FABC05509CD000000102</string>\n\t\t\t\t\t\t\t<string>1C37FABC05539CD112110102</string>\n\t\t\t\t\t\t\t<string>E2644B35053B69B200211256</string>\n\t\t\t\t\t\t\t<string>1C37FABC04509CD000100104</string>\n\t\t\t\t\t\t\t<string>1CC0EA4004350EF90044410B</string>\n\t\t\t\t\t\t\t<string>1CC0EA4004350EF90041110B</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t<string>11E0B1FE06471DED0097A5F4</string>\n\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t<string>Files</string>\n\t\t\t\t\t\t<key>PBXProjectStructureProvided</key>\n\t\t\t\t\t\t<string>yes</string>\n\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleColumnData</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleColumnWidthsKey</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<real>186</real>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleColumnsKey_v4</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<string>MainColumn</string>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<string>29B97314FDCFA39411CA2CEA</string>\n\t\t\t\t\t\t\t\t<string>1C37FABC05509CD000000102</string>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>\n\t\t\t\t\t\t\t<string>{{0, 0}, {186, 337}}</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<key>PBXTopSmartGroupGIDs</key>\n\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t<key>XCIncludePerspectivesSwitch</key>\n\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t<key>XCSharingToken</key>\n\t\t\t\t\t\t<string>com.apple.Xcode.GFSharingToken</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t<string>{{0, 0}, {203, 355}}</string>\n\t\t\t\t\t\t<key>GroupTreeTableConfiguration</key>\n\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t<string>MainColumn</string>\n\t\t\t\t\t\t\t<real>186</real>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t<string>373 269 690 397 0 0 1440 878 </string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t<string>PBXSmartGroupTreeModule</string>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>100%</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Morph</string>\n\t\t\t<key>PreferredWidth</key>\n\t\t\t<integer>300</integer>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>XCModuleDock</string>\n\t\t\t\t<string>PBXSmartGroupTreeModule</string>\n\t\t\t</array>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>11E0B1FE06471DED0097A5F4</string>\n\t\t\t</array>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.default.short</string>\n\t\t</dict>\n\t</array>\n\t<key>PerspectivesBarVisible</key>\n\t<false/>\n\t<key>ShelfIsVisible</key>\n\t<false/>\n\t<key>SourceDescription</key>\n\t<string>file at '/System/Library/PrivateFrameworks/DevToolsInterface.framework/Versions/A/Resources/XCPerspectivesSpecificationMode1.xcperspec'</string>\n\t<key>StatusbarIsVisible</key>\n\t<true/>\n\t<key>TimeStamp</key>\n\t<real>0.0</real>\n\t<key>ToolbarDisplayMode</key>\n\t<integer>1</integer>\n\t<key>ToolbarIsVisible</key>\n\t<true/>\n\t<key>ToolbarSizeMode</key>\n\t<integer>1</integer>\n\t<key>Type</key>\n\t<string>Perspectives</string>\n\t<key>UpdateMessage</key>\n\t<string>The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the \"Metro-Morph\" feature).  You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature.  Do you wish to update to the latest Workspace defaults for project '%@'?</string>\n\t<key>WindowJustification</key>\n\t<integer>5</integer>\n\t<key>WindowOrderList</key>\n\t<array>\n\t\t<string>3B2EF5820965C4A5007BFB7B</string>\n\t\t<string>/Users/colin/Projects2/OSX/360 Controller/Feedback360/Feedback360.xcodeproj</string>\n\t</array>\n\t<key>WindowString</key>\n\t<string>308 400 690 397 0 0 1280 1002 </string>\n\t<key>WindowTools</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>FirstTimeWindowDisplayed</key>\n\t\t\t<false/>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.build</string>\n\t\t\t<key>IsVertical</key>\n\t\t\t<true/>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1CD0528F0623707200166675</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string></string>\n\t\t\t\t\t\t\t\t<key>StatusBarVisibility</key>\n\t\t\t\t\t\t\t\t<true/>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {500, 218}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>691 470 500 500 0 0 1280 1002 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXNavigatorGroup</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>218pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXBuildLogShowsTranscriptDefaultKey</key>\n\t\t\t\t\t\t\t\t<string>{{0, 5}, {500, 231}}</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>XCMainBuildResultsModuleGUID</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>Build</string>\n\t\t\t\t\t\t\t\t<key>XCBuildResultsTrigger_Collapse</key>\n\t\t\t\t\t\t\t\t<integer>1021</integer>\n\t\t\t\t\t\t\t\t<key>XCBuildResultsTrigger_Open</key>\n\t\t\t\t\t\t\t\t<integer>1011</integer>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 223}, {500, 236}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>691 470 500 500 0 0 1280 1002 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXBuildResultsModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>236pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>459pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Build Results</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXBuildResultsModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<true/>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>3B2EF5820965C4A5007BFB7B</string>\n\t\t\t\t<string>3BCC40880BDA916800B1619B</string>\n\t\t\t\t<string>1CD0528F0623707200166675</string>\n\t\t\t\t<string>XCMainBuildResultsModuleGUID</string>\n\t\t\t</array>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.build</string>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>691 470 500 500 0 0 1280 1002 </string>\n\t\t\t<key>WindowToolGUID</key>\n\t\t\t<string>3B2EF5820965C4A5007BFB7B</string>\n\t\t\t<key>WindowToolIsVisible</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.debugger</string>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Debugger</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>HorizontalSplitView</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>_collapsingFrameDimension</key>\n\t\t\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t\t\t<key>_indexOfCollapsedView</key>\n\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t<key>_percentageOfCollapsedView</key>\n\t\t\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t\t\t<key>isCollapsed</key>\n\t\t\t\t\t\t\t\t\t\t<string>yes</string>\n\t\t\t\t\t\t\t\t\t\t<key>sizes</key>\n\t\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t\t<string>{{0, 0}, {317, 164}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<string>{{317, 0}, {377, 164}}</string>\n\t\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>VerticalSplitView</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>_collapsingFrameDimension</key>\n\t\t\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t\t\t<key>_indexOfCollapsedView</key>\n\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t<key>_percentageOfCollapsedView</key>\n\t\t\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t\t\t<key>isCollapsed</key>\n\t\t\t\t\t\t\t\t\t\t<string>yes</string>\n\t\t\t\t\t\t\t\t\t\t<key>sizes</key>\n\t\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t\t<string>{{0, 0}, {694, 164}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<string>{{0, 164}, {694, 216}}</string>\n\t\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>LauncherConfigVersion</key>\n\t\t\t\t\t\t\t\t<string>8</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1C162984064C10D400B95A72</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>Debug - GLUTExamples (Underwater)</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>DebugConsoleDrawerSize</key>\n\t\t\t\t\t\t\t\t<string>{100, 120}</string>\n\t\t\t\t\t\t\t\t<key>DebugConsoleVisible</key>\n\t\t\t\t\t\t\t\t<string>None</string>\n\t\t\t\t\t\t\t\t<key>DebugConsoleWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>{{200, 200}, {500, 300}}</string>\n\t\t\t\t\t\t\t\t<key>DebugSTDIOWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>{{200, 200}, {500, 300}}</string>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {694, 380}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>321 238 694 422 0 0 1440 878 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXDebugSessionModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>100%</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>100%</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Debugger</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXDebugSessionModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>1CD10A99069EF8BA00B06720</string>\n\t\t\t\t<string>1C0AD2AB069F1E9B00FABCE6</string>\n\t\t\t\t<string>1C162984064C10D400B95A72</string>\n\t\t\t\t<string>1C0AD2AC069F1E9B00FABCE6</string>\n\t\t\t</array>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.debug</string>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>321 238 694 422 0 0 1440 878 </string>\n\t\t\t<key>WindowToolGUID</key>\n\t\t\t<string>1CD10A99069EF8BA00B06720</string>\n\t\t\t<key>WindowToolIsVisible</key>\n\t\t\t<integer>0</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FirstTimeWindowDisplayed</key>\n\t\t\t<false/>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.find</string>\n\t\t\t<key>IsVertical</key>\n\t\t\t<true/>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t\t\t<string>1CDD528C0622207200134675</string>\n\t\t\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t\t\t<string>IOHIDLib.h</string>\n\t\t\t\t\t\t\t\t\t\t<key>StatusBarVisibility</key>\n\t\t\t\t\t\t\t\t\t\t<true/>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t\t\t<string>{{0, 0}, {781, 212}}</string>\n\t\t\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t\t\t<string>31 477 781 470 0 0 1280 1002 </string>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t\t\t<string>PBXNavigatorGroup</string>\n\t\t\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t\t\t<string>781pt</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>212pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>BecomeActive</key>\n\t\t\t\t\t\t\t<true/>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1CD0528E0623707200166675</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>Project Find</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 217}, {781, 212}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>31 477 781 470 0 0 1280 1002 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXProjectFindModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>212pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>429pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Project Find</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXProjectFindModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<true/>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>1C530D57069F1CE1000CFCEE</string>\n\t\t\t\t<string>3BCF4DD2097DA7030049C083</string>\n\t\t\t\t<string>3BCF4DD3097DA7030049C083</string>\n\t\t\t\t<string>1CDD528C0622207200134675</string>\n\t\t\t\t<string>1CD0528E0623707200166675</string>\n\t\t\t</array>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>31 477 781 470 0 0 1280 1002 </string>\n\t\t\t<key>WindowToolGUID</key>\n\t\t\t<string>1C530D57069F1CE1000CFCEE</string>\n\t\t\t<key>WindowToolIsVisible</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>MENUSEPARATOR</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.debuggerConsole</string>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>BecomeActive</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1C78EAAC065D492600B07095</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>Debugger Console</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {440, 358}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>650 41 440 400 0 0 1280 1002 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXDebugCLIModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>358pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>358pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Debugger Console</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXDebugCLIModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>1C78EAAD065D492600B07095</string>\n\t\t\t\t<string>1C78EAAE065D492600B07095</string>\n\t\t\t\t<string>1C78EAAC065D492600B07095</string>\n\t\t\t</array>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>650 41 440 400 0 0 1280 1002 </string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.run</string>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>LauncherConfigVersion</key>\n\t\t\t\t\t\t\t\t<string>3</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1CD0528B0623707200166675</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>Run</string>\n\t\t\t\t\t\t\t\t<key>Runner</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>HorizontalSplitView</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>_collapsingFrameDimension</key>\n\t\t\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t\t\t<key>_indexOfCollapsedView</key>\n\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t<key>_percentageOfCollapsedView</key>\n\t\t\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t\t\t<key>isCollapsed</key>\n\t\t\t\t\t\t\t\t\t\t<string>yes</string>\n\t\t\t\t\t\t\t\t\t\t<key>sizes</key>\n\t\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t\t<string>{{0, 0}, {493, 167}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<string>{{0, 176}, {493, 267}}</string>\n\t\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>VerticalSplitView</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>_collapsingFrameDimension</key>\n\t\t\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t\t\t<key>_indexOfCollapsedView</key>\n\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t<key>_percentageOfCollapsedView</key>\n\t\t\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t\t\t<key>isCollapsed</key>\n\t\t\t\t\t\t\t\t\t\t<string>yes</string>\n\t\t\t\t\t\t\t\t\t\t<key>sizes</key>\n\t\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t\t<string>{{0, 0}, {405, 443}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<string>{{414, 0}, {514, 443}}</string>\n\t\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {460, 159}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>316 696 459 200 0 0 1280 1002 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXRunSessionModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>159pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>159pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Run Log</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXRunSessionModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>1C0AD2B3069F1EA900FABCE6</string>\n\t\t\t\t<string>1C0AD2B4069F1EA900FABCE6</string>\n\t\t\t\t<string>1CD0528B0623707200166675</string>\n\t\t\t\t<string>1C0AD2B5069F1EA900FABCE6</string>\n\t\t\t</array>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.run</string>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>316 696 459 200 0 0 1280 1002 </string>\n\t\t\t<key>WindowToolGUID</key>\n\t\t\t<string>1C0AD2B3069F1EA900FABCE6</string>\n\t\t\t<key>WindowToolIsVisible</key>\n\t\t\t<integer>0</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.scm</string>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1C78EAB2065D492600B07095</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>&lt;No Editor&gt;</string>\n\t\t\t\t\t\t\t\t<key>PBXSplitModuleInNavigatorKey</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Split0</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t\t\t<string>1C78EAB3065D492600B07095</string>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>SplitCount</key>\n\t\t\t\t\t\t\t\t\t<string>1</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>StatusBarVisibility</key>\n\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {452, 0}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>743 379 452 308 0 0 1280 1002 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXNavigatorGroup</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>0pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>BecomeActive</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1CD052920623707200166675</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>SCM</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>ConsoleFrame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 259}, {452, 0}}</string>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 7}, {452, 259}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>743 379 452 308 0 0 1280 1002 </string>\n\t\t\t\t\t\t\t\t<key>TableConfiguration</key>\n\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t<string>Status</string>\n\t\t\t\t\t\t\t\t\t<real>30</real>\n\t\t\t\t\t\t\t\t\t<string>FileName</string>\n\t\t\t\t\t\t\t\t\t<real>199</real>\n\t\t\t\t\t\t\t\t\t<string>Path</string>\n\t\t\t\t\t\t\t\t\t<real>197.09500122070312</real>\n\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t<key>TableFrame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {452, 250}}</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXCVSModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>262pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>266pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>SCM</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXCVSModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>1C78EAB4065D492600B07095</string>\n\t\t\t\t<string>1C78EAB5065D492600B07095</string>\n\t\t\t\t<string>1C78EAB2065D492600B07095</string>\n\t\t\t\t<string>1CD052920623707200166675</string>\n\t\t\t</array>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.scm</string>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>743 379 452 308 0 0 1280 1002 </string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.breakpoints</string>\n\t\t\t<key>IsVertical</key>\n\t\t\t<false/>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>BecomeActive</key>\n\t\t\t\t\t\t\t<true/>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXBottomSmartGroupGIDs</key>\n\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t<string>1C77FABC04509CD000000102</string>\n\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1CE0B1FE06471DED0097A5F4</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>Files</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectStructureProvided</key>\n\t\t\t\t\t\t\t\t<string>no</string>\n\t\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleColumnData</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleColumnWidthsKey</key>\n\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t<real>168</real>\n\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleColumnsKey_v4</key>\n\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t<string>MainColumn</string>\n\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key>\n\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t<string>1C77FABC04509CD000000102</string>\n\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>\n\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>\n\t\t\t\t\t\t\t\t\t<string>{{0, 0}, {168, 350}}</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>PBXTopSmartGroupGIDs</key>\n\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t<key>XCIncludePerspectivesSwitch</key>\n\t\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {185, 368}}</string>\n\t\t\t\t\t\t\t\t<key>GroupTreeTableConfiguration</key>\n\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t<string>MainColumn</string>\n\t\t\t\t\t\t\t\t\t<real>168</real>\n\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>315 424 744 409 0 0 1440 878 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXSmartGroupTreeModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>185pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1CA1AED706398EBD00589147</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>Detail</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{190, 0}, {554, 368}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>315 424 744 409 0 0 1440 878 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>XCDetailModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>554pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>368pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>MajorVersion</key>\n\t\t\t<integer>2</integer>\n\t\t\t<key>MinorVersion</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>Name</key>\n\t\t\t<string>Breakpoints</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXSmartGroupTreeModule</string>\n\t\t\t\t<string>XCDetailModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<true/>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>1CDDB66807F98D9800BB5817</string>\n\t\t\t\t<string>1CDDB66907F98D9800BB5817</string>\n\t\t\t\t<string>1CE0B1FE06471DED0097A5F4</string>\n\t\t\t\t<string>1CA1AED706398EBD00589147</string>\n\t\t\t</array>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.breakpoints</string>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>315 424 744 409 0 0 1440 878 </string>\n\t\t\t<key>WindowToolGUID</key>\n\t\t\t<string>1CDDB66807F98D9800BB5817</string>\n\t\t\t<key>WindowToolIsVisible</key>\n\t\t\t<true/>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.debugAnimator</string>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXNavigatorGroup</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>100%</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>100%</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Debug Visualizer</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXNavigatorGroup</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<true/>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.debugAnimator</string>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>100 100 700 500 0 0 1280 1002 </string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.bookmarks</string>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXBookmarksModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>100%</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>100%</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Bookmarks</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXBookmarksModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>538 42 401 187 0 0 1280 1002 </string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.classBrowser</string>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>BecomeActive</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>OptionsSetName</key>\n\t\t\t\t\t\t\t\t<string>Hierarchy, all classes</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1CA6456E063B45B4001379D8</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>Class Browser - NSObject</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>ClassesFrame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {374, 96}}</string>\n\t\t\t\t\t\t\t\t<key>ClassesTreeTableConfiguration</key>\n\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t<string>PBXClassNameColumnIdentifier</string>\n\t\t\t\t\t\t\t\t\t<real>208</real>\n\t\t\t\t\t\t\t\t\t<string>PBXClassBookColumnIdentifier</string>\n\t\t\t\t\t\t\t\t\t<real>22</real>\n\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {630, 331}}</string>\n\t\t\t\t\t\t\t\t<key>MembersFrame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 105}, {374, 395}}</string>\n\t\t\t\t\t\t\t\t<key>MembersTreeTableConfiguration</key>\n\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t<string>PBXMemberTypeIconColumnIdentifier</string>\n\t\t\t\t\t\t\t\t\t<real>22</real>\n\t\t\t\t\t\t\t\t\t<string>PBXMemberNameColumnIdentifier</string>\n\t\t\t\t\t\t\t\t\t<real>216</real>\n\t\t\t\t\t\t\t\t\t<string>PBXMemberTypeColumnIdentifier</string>\n\t\t\t\t\t\t\t\t\t<real>97</real>\n\t\t\t\t\t\t\t\t\t<string>PBXMemberBookColumnIdentifier</string>\n\t\t\t\t\t\t\t\t\t<real>22</real>\n\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t<key>PBXModuleWindowStatusBarHidden2</key>\n\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>385 179 630 352 0 0 1440 878 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXClassBrowserModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>332pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>332pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Class Browser</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXClassBrowserModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>1C0AD2AF069F1E9B00FABCE6</string>\n\t\t\t\t<string>1C0AD2B0069F1E9B00FABCE6</string>\n\t\t\t\t<string>1CA6456E063B45B4001379D8</string>\n\t\t\t</array>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.classbrowser</string>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>385 179 630 352 0 0 1440 878 </string>\n\t\t\t<key>WindowToolGUID</key>\n\t\t\t<string>1C0AD2AF069F1E9B00FABCE6</string>\n\t\t\t<key>WindowToolIsVisible</key>\n\t\t\t<integer>0</integer>\n\t\t</dict>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Feedback360/Feedback360.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 45;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t3B2EF54C0965C358007BFB7B /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B2EF54B0965C358007BFB7B /* ForceFeedback.framework */; };\n\t\t3BBA037D09697D80008A46C9 /* emulator.c in Sources */ = {isa = PBXBuildFile; fileRef = 3BBA037C09697D80008A46C9 /* emulator.c */; };\n\t\t3BBA03D0096A22F5008A46C9 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BBA03CF096A22F5008A46C9 /* IOKit.framework */; };\n\t\t3BBA03E3096A29B5008A46C9 /* devlink.c in Sources */ = {isa = PBXBuildFile; fileRef = 3BBA03E2096A29B5008A46C9 /* devlink.c */; };\n\t\t8D576312048677EA00EA77CD /* main.c in Sources */ = {isa = PBXBuildFile; fileRef = 08FB77B6FE84183AC02AAC07 /* main.c */; settings = {ATTRIBUTES = (); }; };\n\t\t8D576314048677EA00EA77CD /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0AA1909FFE8422F4C02AAC07 /* CoreFoundation.framework */; };\n\t\t8D5B49A804867FD3000E48DA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8D5B49A704867FD3000E48DA /* InfoPlist.strings */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t089C167EFE841241C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\t08FB77B6FE84183AC02AAC07 /* main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = main.c; sourceTree = \"<group>\"; };\n\t\t0AA1909FFE8422F4C02AAC07 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = \"<absolute>\"; };\n\t\t3B2EF5440965B3C7007BFB7B /* main.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = main.h; sourceTree = \"<group>\"; };\n\t\t3B2EF54B0965C358007BFB7B /* ForceFeedback.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ForceFeedback.framework; path = /System/Library/Frameworks/ForceFeedback.framework; sourceTree = \"<absolute>\"; };\n\t\t3BBA037B09697D80008A46C9 /* emulator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emulator.h; sourceTree = \"<group>\"; };\n\t\t3BBA037C09697D80008A46C9 /* emulator.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = emulator.c; sourceTree = \"<group>\"; };\n\t\t3BBA03CF096A22F5008A46C9 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = \"<absolute>\"; };\n\t\t3BBA03E1096A29B5008A46C9 /* devlink.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = devlink.h; sourceTree = \"<group>\"; };\n\t\t3BBA03E2096A29B5008A46C9 /* devlink.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = devlink.c; sourceTree = \"<group>\"; };\n\t\t8D576316048677EA00EA77CD /* Feedback360.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Feedback360.bundle; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t8D576317048677EA00EA77CD /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t8D576313048677EA00EA77CD /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8D576314048677EA00EA77CD /* CoreFoundation.framework in Frameworks */,\n\t\t\t\t3B2EF54C0965C358007BFB7B /* ForceFeedback.framework in Frameworks */,\n\t\t\t\t3BBA03D0096A22F5008A46C9 /* IOKit.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t089C166AFE841209C02AAC07 /* Feedback360 */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t08FB77AFFE84173DC02AAC07 /* Source */,\n\t\t\t\t089C167CFE841241C02AAC07 /* Resources */,\n\t\t\t\t089C1671FE841209C02AAC07 /* External Frameworks and Libraries */,\n\t\t\t\t19C28FB6FE9D52B211CA2CBB /* Products */,\n\t\t\t);\n\t\t\tname = Feedback360;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t089C1671FE841209C02AAC07 /* External Frameworks and Libraries */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3BBA03CF096A22F5008A46C9 /* IOKit.framework */,\n\t\t\t\t3B2EF54B0965C358007BFB7B /* ForceFeedback.framework */,\n\t\t\t\t0AA1909FFE8422F4C02AAC07 /* CoreFoundation.framework */,\n\t\t\t);\n\t\t\tname = \"External Frameworks and Libraries\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t089C167CFE841241C02AAC07 /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B2EF5470965B8E3007BFB7B /* New Group */,\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t08FB77AFFE84173DC02AAC07 /* Source */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B2EF5440965B3C7007BFB7B /* main.h */,\n\t\t\t\t08FB77B6FE84183AC02AAC07 /* main.c */,\n\t\t\t\t3BBA037B09697D80008A46C9 /* emulator.h */,\n\t\t\t\t3BBA037C09697D80008A46C9 /* emulator.c */,\n\t\t\t\t3BBA03E1096A29B5008A46C9 /* devlink.h */,\n\t\t\t\t3BBA03E2096A29B5008A46C9 /* devlink.c */,\n\t\t\t);\n\t\t\tname = Source;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t19C28FB6FE9D52B211CA2CBB /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8D576316048677EA00EA77CD /* Feedback360.bundle */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3B2EF5470965B8E3007BFB7B /* New Group */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8D576317048677EA00EA77CD /* Info.plist */,\n\t\t\t\t8D5B49A704867FD3000E48DA /* InfoPlist.strings */,\n\t\t\t);\n\t\t\tname = \"New Group\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t8D57630D048677EA00EA77CD /* Feedback360 */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 3BBDC69309793BF60023AAD8 /* Build configuration list for PBXNativeTarget \"Feedback360\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t8D57630F048677EA00EA77CD /* Resources */,\n\t\t\t\t8D576311048677EA00EA77CD /* Sources */,\n\t\t\t\t8D576313048677EA00EA77CD /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Feedback360;\n\t\t\tproductInstallPath = \"$(HOME)/Library/Bundles\";\n\t\t\tproductName = Feedback360;\n\t\t\tproductReference = 8D576316048677EA00EA77CD /* Feedback360.bundle */;\n\t\t\tproductType = \"com.apple.product-type.bundle\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t089C1669FE841209C02AAC07 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tbuildConfigurationList = 3BBDC69709793BF60023AAD8 /* Build configuration list for PBXProject \"Feedback360\" */;\n\t\t\tcompatibilityVersion = \"Xcode 2.4\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 1;\n\t\t\tknownRegions = (\n\t\t\t\tEnglish,\n\t\t\t\tJapanese,\n\t\t\t\tFrench,\n\t\t\t\tGerman,\n\t\t\t);\n\t\t\tmainGroup = 089C166AFE841209C02AAC07 /* Feedback360 */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t8D57630D048677EA00EA77CD /* Feedback360 */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t8D57630F048677EA00EA77CD /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8D5B49A804867FD3000E48DA /* InfoPlist.strings in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t8D576311048677EA00EA77CD /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8D576312048677EA00EA77CD /* main.c in Sources */,\n\t\t\t\t3BBA037D09697D80008A46C9 /* emulator.c in Sources */,\n\t\t\t\t3BBA03E3096A29B5008A46C9 /* devlink.c in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t8D5B49A704867FD3000E48DA /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t089C167EFE841241C02AAC07 /* English */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t3BBDC69409793BF60023AAD8 /* Development */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = YES;\n\t\t\t\tGCC_GENERATE_DEBUGGING_SYMBOLS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(HOME)/Library/Bundles\";\n\t\t\t\tPRODUCT_NAME = Feedback360;\n\t\t\t\tWRAPPER_EXTENSION = bundle;\n\t\t\t\tZERO_LINK = YES;\n\t\t\t};\n\t\t\tname = Development;\n\t\t};\n\t\t3BBDC69509793BF60023AAD8 /* Deployment */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = NO;\n\t\t\t\tGCC_GENERATE_DEBUGGING_SYMBOLS = NO;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(HOME)/Library/Bundles\";\n\t\t\t\tPRODUCT_NAME = Feedback360;\n\t\t\t\tWRAPPER_EXTENSION = bundle;\n\t\t\t\tZERO_LINK = NO;\n\t\t\t};\n\t\t\tname = Deployment;\n\t\t};\n\t\t3BBDC69609793BF60023AAD8 /* Default */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_GENERATE_DEBUGGING_SYMBOLS = NO;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(HOME)/Library/Bundles\";\n\t\t\t\tPRODUCT_NAME = Feedback360;\n\t\t\t\tWRAPPER_EXTENSION = bundle;\n\t\t\t};\n\t\t\tname = Default;\n\t\t};\n\t\t3BBDC69809793BF60023AAD8 /* Development */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"Developer ID Application: Colin Munro\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.5;\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\tSDKROOT = \"\";\n\t\t\t};\n\t\t\tname = Development;\n\t\t};\n\t\t3BBDC69909793BF60023AAD8 /* Deployment */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_32_64_BIT)\";\n\t\t\t\tCODE_SIGN_IDENTITY = \"Developer ID Application: Colin Munro\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.5;\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\tSDKROOT = \"\";\n\t\t\t};\n\t\t\tname = Deployment;\n\t\t};\n\t\t3BBDC69A09793BF60023AAD8 /* Default */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"Developer ID Application: Colin Munro\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.5;\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\tSDKROOT = \"\";\n\t\t\t};\n\t\t\tname = Default;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t3BBDC69309793BF60023AAD8 /* Build configuration list for PBXNativeTarget \"Feedback360\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t3BBDC69409793BF60023AAD8 /* Development */,\n\t\t\t\t3BBDC69509793BF60023AAD8 /* Deployment */,\n\t\t\t\t3BBDC69609793BF60023AAD8 /* Default */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Default;\n\t\t};\n\t\t3BBDC69709793BF60023AAD8 /* Build configuration list for PBXProject \"Feedback360\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t3BBDC69809793BF60023AAD8 /* Development */,\n\t\t\t\t3BBDC69909793BF60023AAD8 /* Deployment */,\n\t\t\t\t3BBDC69A09793BF60023AAD8 /* Default */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Default;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 089C1669FE841209C02AAC07 /* Project object */;\n}\n"
  },
  {
    "path": "Feedback360/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.mice.Xbox360ControllerForceFeedback</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n\t<key>CFPlugInDynamicRegistration</key>\n\t<string>NO</string>\n\t<key>CFPlugInFactories</key>\n\t<dict>\n\t\t<key>B8ED278F-EC8A-4E8E-B4CF-13E2A9D68E83</key>\n\t\t<string>Control360Factory</string>\n\t</dict>\n\t<key>CFPlugInTypes</key>\n\t<dict>\n\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t<array>\n\t\t\t<string>B8ED278F-EC8A-4E8E-B4CF-13E2A9D68E83</string>\n\t\t</array>\n\t</dict>\n\t<key>CFBundleName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>Copyright © 2013 MICE Software. All rights reserved.</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Feedback360/devlink.c",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    devlink.c - code to speak to the driver itself\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#include <IOKit/IOCFPlugin.h>\n#include \"devlink.h\"\n\n// Initialise the link\nbool Device_Initialise(DeviceLink *link,io_object_t device)\n{\n    IOCFPlugInInterface **plugInInterface;\n    SInt32 score;\n    IOReturn ret;\n    \n    plugInInterface=NULL;\n    score=0;\n    ret=IOCreatePlugInInterfaceForService(device,kIOHIDDeviceUserClientTypeID,kIOCFPlugInInterfaceID,&plugInInterface,&score);\n    if(ret!=kIOReturnSuccess) return FALSE;\n    ret=(*plugInInterface)->QueryInterface(plugInInterface,CFUUIDGetUUIDBytes(kIOHIDDeviceInterfaceID121),(LPVOID)&link->interface);\n    (*plugInInterface)->Release(plugInInterface);\n    if(ret!=kIOReturnSuccess) return FALSE;\n    (*link->interface)->open(link->interface,0);\n    return TRUE;\n}\n\n// Finish the link\nvoid Device_Finalise(DeviceLink *link)\n{\n    (*link->interface)->close(link->interface);\n    (*link->interface)->Release(link->interface);\n    link->interface=NULL;\n}\n\n// Send a report via the link\nbool Device_Send(DeviceLink *link,void *data,int length)\n{\n    if(link->interface==NULL) return FALSE;\n    else {\n        IOReturn res=(*link->interface)->setReport(link->interface,kIOHIDReportTypeOutput,0,data,length,10000,NULL,NULL,NULL);\n\t\tif (res != kIOReturnSuccess)\n\t\t\tfprintf(stderr, \"Device_Send failed: 0x%.8x\\n\", res);\n        return res==kIOReturnSuccess;\n    }\n}\n"
  },
  {
    "path": "Feedback360/devlink.h",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    devlink.h - Interface to the device link\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#include <Carbon/Carbon.h>\n#include <IOKit/hid/IOHIDLib.h>\n\ntypedef struct {\n    IOHIDDeviceInterface121 **interface;\n} DeviceLink;\n\nbool Device_Initialise(DeviceLink *link,io_object_t device);\nvoid Device_Finalise(DeviceLink *link);\n\nbool Device_Send(DeviceLink *link,void *data,int length);\n"
  },
  {
    "path": "Feedback360/emulator.c",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    emulator.c - simulate a force feedback device\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#include \"emulator.h\"\n\n/*\n * This code could do with being improved. For example, the two motors could\n * allow for a \"left\" and \"right\" rumble in a car game.\n *\n * For debugging, you may use fprintf(stderr,...). The output will appear on\n * the console of whatever game is using the Apple Force Feedback Framework.\n */\n\n#define LoopGranularity             500         // Microseconds\n#define LoopTimerDelay              (LoopGranularity*0.000001f) // In seconds\n\nstatic void Emulate_Timer(CFRunLoopTimerRef timer,void *context);\n\n// Initialise the emulation of a force feedback device\nvoid Emulate_Initialise(ForceEmulator *emulator,int effectCount,void (*SetForce)(void*,unsigned char,unsigned char),void *context)\n{\n    int i;\n    CFRunLoopTimerContext callbackData;\n    \n    // Set callback\n    emulator->SetForce=SetForce;\n    emulator->context=context;\n    // Create effects memory\n    emulator->effects=(ForceEffect*)malloc(sizeof(ForceEffect)*effectCount);\n    emulator->effectCount=effectCount;\n    // Defaults\n    emulator->enable=TRUE;\n    emulator->pause=FALSE;\n    emulator->gain=4;\n    emulator->maxGain=4;\n    emulator->activeEffect=-1;\n    // Reset\n    for(i=0;i<effectCount;i++) emulator->effects[i].inUse=FALSE;\n    // Launch timer\n    callbackData.version=0;\n    callbackData.info=emulator;\n    callbackData.retain=NULL;\n    callbackData.release=NULL;\n    callbackData.copyDescription=NULL;\n    emulator->timer=CFRunLoopTimerCreate(NULL,LoopTimerDelay,LoopTimerDelay,0,0,Emulate_Timer,&callbackData);\n    CFRunLoopAddTimer(CFRunLoopGetCurrent(),emulator->timer,kCFRunLoopCommonModes);\n}\n\n// Close down the force feedback stuff\nvoid Emulate_Finalise(ForceEmulator *emulator)\n{\n    CFRunLoopTimerInvalidate(emulator->timer);\n    CFRelease(emulator->timer);\n    free(emulator->effects);\n    emulator->SetForce(emulator->context,0,0);\n}\n\n// Call the callback, if output is enabled\nvoid Emulate_Callback(ForceEmulator *emulator,unsigned char large,unsigned char small)\n{\n    emulator->oldLarge=large;\n    emulator->oldSmall=small;\n    if(emulator->enable) emulator->SetForce(emulator->context,large,small);\n}\n\n// Create an effect - for the FF API\nint Emulate_CreateEffect(ForceEmulator *emulator,const ForceParams *params)\n{\n    int i;\n    \n    for(i=0;i<emulator->effectCount;i++) {\n        if(!emulator->effects[i].inUse) {\n            emulator->effects[i].inUse=TRUE;\n            if(!Emulate_ChangeEffect(emulator,i+1,params)) {\n                emulator->effects[i].inUse=FALSE;\n                return 0;\n            }\n            return i+1;\n        }\n    }\n    return 0;\n}\n\n// Change an effect - for the FF API\nbool Emulate_ChangeEffect(ForceEmulator *emulator,int index,const ForceParams *params)\n{\n    ForceEffect *effect=emulator->effects+index-1;\n    effect->gain=params->gain;\n    effect->maxLevel=params->maxLevel;\n    effect->startCount=params->startDelay/LoopGranularity;\n    effect->attackLevel=params->attackLevel;\n    effect->attackCount=params->attackTime/LoopGranularity;\n    effect->sustainLevel=params->sustainLevel;\n    effect->sustainCount=params->sustainTime/LoopGranularity;\n    effect->fadeLevel=params->fadeLevel;\n    effect->fadeCount=params->fadeTime/LoopGranularity;\n    return TRUE;\n}\n\n// Destroy an effect - for the FF API\nvoid Emulate_DestroyEffect(ForceEmulator *emulator,int index)\n{\n    emulator->effects[index-1].inUse=FALSE;\n    if(emulator->activeEffect==(index-1)) emulator->activeEffect=-1;\n}\n\n// Returns true if the effect index is in use\nbool Emulate_IsValidEffect(ForceEmulator *emulator,int index)\n{\n    if((index<1)||(index>emulator->effectCount)) return FALSE;\n    return emulator->effects[index-1].inUse;\n}\n\n// Returns true if the effect index is playing\nbool Emulate_IsPlaying(ForceEmulator *emulator,int index)\n{\n    return emulator->activeEffect==(index-1);\n}\n\n// Returns true if the device has no effects\nbool Emulate_IsEmpty(ForceEmulator *emulator)\n{\n    int i;\n    \n    for(i=0;i<emulator->effectCount;i++)\n        if(emulator->effects[i].inUse)\n            return FALSE;\n    return TRUE;\n}\n\n// Resets the device\nvoid Emulate_Reset(ForceEmulator *emulator)\n{\n    int i;\n    \n    for(i=0;i<emulator->effectCount;i++) emulator->effects[i].inUse=FALSE;\n    Emulate_Callback(emulator,0,0);\n}\n\n// Starts an effect for the specified number of loops\nvoid Emulate_Start(ForceEmulator *emulator,int index,int iterations)\n{\n    ForceEffect *effect;\n    \n//    fprintf(stderr,\"Emulate_Start(%p,%i,%i)\\n\",emulator,index,iterations);\n    effect=emulator->effects+index-1;\n    effect->countStart=effect->startCount;\n    effect->countAttack=effect->attackCount;\n    effect->countSustain=effect->sustainCount;\n    effect->countFade=effect->fadeCount;\n    effect->countLoop=iterations;\n    emulator->activeEffect=index-1;\n}\n\n// Stops an effect\nvoid Emulate_Stop(ForceEmulator *emulator,int index)\n{\n//    fprintf(stderr,\"Emulate_Stop(%p,%i)\\n\",emulator,index);\n    if((index-1)==emulator->activeEffect) {\n        emulator->activeEffect=-1;\n        Emulate_Callback(emulator,0,0);\n    }\n}\n\n// Returns true if no effects are running\nbool Emulate_IsStopped(ForceEmulator *emulator)\n{\n    return emulator->activeEffect==-1;\n}\n\n// Returns the number of used effects\nUInt32 Emulate_Effects_Used(ForceEmulator *emulator)\n{\n    int i,j;\n    \n    for(i=j=0;i<emulator->effectCount;i++)\n        if(emulator->effects[i].inUse)\n            j++;\n    return j;\n}\n\n// Returns the number of possible effects\nUInt32 Emulate_Effects_Total(ForceEmulator *emulator)\n{\n    return emulator->effectCount;\n}\n\n// Enables or disables the force feedback\nvoid Emulate_SetEnable(ForceEmulator *emulator,bool enable)\n{\n    bool old=emulator->enable;\n    // Stop motors in case they were running\n    if(old&&(!enable)) Emulate_Callback(emulator,0,0);\n    emulator->enable=enable;\n    // Resume motors at last computed value, as we'll have\n    // been computing new values for them even if disabled\n    if((!old)&&enable) Emulate_Callback(emulator,emulator->oldLarge,emulator->oldSmall);\n}\n\n// Returns true if enabled\nbool Emulate_IsEnabled(ForceEmulator *emulator)\n{\n    return emulator->enable;\n}\n\n// Pauses the device\nvoid Emulate_SetPaused(ForceEmulator *emulator,bool enable)\n{\n    bool old=emulator->pause;\n    // Stop motors in case they were running\n    if((!old)&&enable) Emulate_Callback(emulator,0,0);\n    emulator->pause=enable;\n    // Resume motors at last computed value, as we'll be\n    // resuming feedback effects where we left off.\n    if(old&&(!enable)) Emulate_Callback(emulator,emulator->oldLarge,emulator->oldSmall);\n}\n\n// Returns true if paused\nbool Emulate_IsPaused(ForceEmulator *emulator)\n{\n    return emulator->pause;\n}\n\n// Sets the gain for the device\nvoid Emulate_SetGain(ForceEmulator *emulator,int gain,int gainMax)\n{\n    if((emulator->gain<=0)||(emulator->maxGain<=0)) return;\n    emulator->gain=gain;\n    emulator->maxGain=gainMax;\n    while(emulator->maxGain<4) {\n        emulator->gain*=2;\n        emulator->maxGain*=2;\n    }\n}\n\n// Utility - scales a value\nstatic inline int Emulate_Scale(int from,int to,int max,int val)\n{\n    int upper=max-1;\n    return from+(((to-from)*(upper-val))/upper);\n}\n\n// Utility - computes the values for the large and small motors from the effect\nstatic void Emulate_Force(ForceEmulator *emulator,int force,int maxGain)\n{\n    int adjusted;\n    int bling;\n    int small,large;\n    \n//    fprintf(stderr,\"Emulate_Force(%p,%i)\\n\",emulator,force);\n    adjusted=(force*emulator->gain)/emulator->maxGain;\n    bling=maxGain/4;\n    if(adjusted<bling) {\n        // Only activate small motor\n        large=0;\n        small=(adjusted*0xff)/bling;\n    } else {\n        // Activate large motor\n        large=((adjusted-bling)*0xff)/(bling*3);\n        if(adjusted<(bling*3)) small=0;\n        else {\n            // Activate small motor too\n            small=((adjusted-(bling*3))*0xff)/bling;\n        }\n    }\n//    fprintf(stderr,\"Computed %i,%i from adjusted=%i, bling=%i\\n\",large,small,adjusted,bling);\n    Emulate_Callback(emulator,large,small);\n}\n\n// Handles the timer, to simulate an effect using the rumble motors\nstatic void Emulate_Timer(CFRunLoopTimerRef timer,void *context)\n{\n    ForceEmulator *emulator;\n    int i;\n    ForceEffect *effect;\n    int level;\n    \n    // Find effect\n    emulator=(ForceEmulator*)context;\n    i=emulator->activeEffect;\n    if((i==-1)||emulator->pause) return;\n    effect=emulator->effects+emulator->activeEffect;\n    // Process each counter on the effect, to see what's happening\n    if(effect->countStart>0) {\n        // In the start (pre-effect) stage\n        level=effect->attackLevel;\n        effect->countStart--;\n    } else {\n        if(effect->countAttack>0) {\n            // In the attack stage\n            level=Emulate_Scale(effect->attackLevel,effect->sustainLevel,effect->attackCount,effect->countAttack);\n            effect->countAttack--;\n        } else {\n            if(effect->countSustain>0) {\n                // In the sustain stage\n                level=effect->sustainLevel;\n                effect->countSustain--;\n            } else {\n                if(effect->countFade>0) {\n                    // In the fade stage\n                    level=Emulate_Scale(effect->sustainLevel,effect->fadeLevel,effect->fadeCount,effect->countFade);\n                    effect->countFade--;\n                } else {\n                    // Work out if we need to do it again\n                    effect->countLoop--;\n                    if(effect->countLoop>0) {\n                        // Prepare for next loop\n                        level=effect->attackLevel;\n                        effect->countStart=effect->startCount;\n                        effect->countAttack=effect->attackCount;\n                        effect->countSustain=effect->sustainCount;\n                        effect->countFade=effect->fadeCount;\n                    } else {\n                        // Effect finished\n                        level=0;\n                        emulator->activeEffect=-1;\n                    }\n                }\n            }\n        }\n    }\n    // Actually calculate what to do for the effect\n    Emulate_Force(emulator,(level*effect->gain)/effect->maxLevel,effect->maxLevel);\n}\n"
  },
  {
    "path": "Feedback360/emulator.h",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    emulator.h - Interface to fake FF API effects using rumble motors\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#include <Carbon/Carbon.h>\n\ntypedef enum {\n    fsStop,\n    fsPlay,\n} ForceState;\n\ntypedef struct {\n    bool inUse;\n    ForceState state;\n    // Information\n    int gain;\n    int maxLevel;\n    int startCount;\n    int attackLevel;\n    int attackCount;\n    int sustainLevel;\n    int sustainCount;\n    int fadeLevel;\n    int fadeCount;\n    // Runtime\n    int countStart;\n    int countAttack;\n    int countSustain;\n    int countFade;\n    int countLoop;\n} ForceEffect;\n\ntypedef struct {\n    // Settings\n    int gain;           // 0-maxLevel\n    int maxLevel;\n    int startDelay;     // Microseconds\n    // Envelope for effect\n    int attackLevel;    // 0-maxLevel\n    int attackTime;     // Microseconds\n    int sustainLevel;   // 0-maxLevel\n    int sustainTime;    // Microseconds\n    int fadeLevel;      // 0-maxLevel\n    int fadeTime;       // Microseconds\n} ForceParams;\n\ntypedef struct {\n    // Callback\n    void (*SetForce)(void *context,unsigned char large,unsigned char small);\n    void *context;\n    // Options\n    int gain,maxGain;\n    bool enable,pause;\n    // Effect entries\n    ForceEffect *effects;\n    int effectCount;\n    // Runtime\n    CFRunLoopTimerRef timer;\n    unsigned char oldLarge,oldSmall;\n    int activeEffect;\n} ForceEmulator;\n\n// Constructor/destructor\nvoid Emulate_Initialise(ForceEmulator *emulator,int effectCount,void (*SetForce)(void*,unsigned char,unsigned char),void *context);\nvoid Emulate_Finalise(ForceEmulator *emulator);\n\n// Options\nvoid Emulate_SetGain(ForceEmulator *emulator,int gain,int gainMax);\nvoid Emulate_SetEnable(ForceEmulator *emulator,bool enable);\nbool Emulate_IsEnabled(ForceEmulator *emulator);\nvoid Emulate_SetPaused(ForceEmulator *emulator,bool enable);\nbool Emulate_IsPaused(ForceEmulator *emulator);\n\n// Using effects\nint Emulate_CreateEffect(ForceEmulator *emulator,const ForceParams *params);\nbool Emulate_ChangeEffect(ForceEmulator *emulator,int index,const ForceParams *params);\nvoid Emulate_DestroyEffect(ForceEmulator *emulator,int index);\n\nbool Emulate_IsValidEffect(ForceEmulator *emulator,int index);\nbool Emulate_IsPlaying(ForceEmulator *emulator,int index);\n\nbool Emulate_IsEmpty(ForceEmulator *emulator);\n\nvoid Emulate_Reset(ForceEmulator *emulator);\n\nvoid Emulate_Start(ForceEmulator *emulator,int index,int iterations);\nvoid Emulate_Stop(ForceEmulator *emulator,int index);\nbool Emulate_IsStopped(ForceEmulator *emulator);\n\nUInt32 Emulate_Effects_Used(ForceEmulator *emulator);\nUInt32 Emulate_Effects_Total(ForceEmulator *emulator);\n\n// Callbacks\nvoid Emulate_Callback(ForceEmulator *emulator,unsigned char large,unsigned char small);\n"
  },
  {
    "path": "Feedback360/main.c",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    main.c - Main code for the FF plugin\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#include <CoreFoundation/CoreFoundation.h>\n#include \"main.h\"\n\nstatic void dealloc360Feedback(Xbox360ForceFeedback *this);\n\n// IUnknown\n\nstatic HRESULT Feedback360QueryInterface(void *that,REFIID iid,LPVOID *ppv)\n{\n    Xbox360ForceFeedback *this=FFThis(that);\n    CFUUIDRef interface;\n    \n    interface=CFUUIDCreateFromUUIDBytes(NULL,iid);\n    // IOForceFeedbackDevice\n    if(CFEqual(interface,kIOForceFeedbackDeviceInterfaceID))\n        *ppv=&this->iIOForceFeedbackDeviceInterface;\n    // IUnknown || IOCFPlugInInterface\n    else if(CFEqual(interface,IUnknownUUID)||CFEqual(interface,kIOCFPlugInInterfaceID))\n        *ppv=&this->iIOCFPlugInInterface;\n    else\n        *ppv=NULL;\n    // Done\n    CFRelease(interface);\n    if((*ppv)==NULL) return E_NOINTERFACE;\n    else {\n        this->iIOCFPlugInInterface.pseudoVTable->AddRef(*ppv);\n        return S_OK;\n    }\n}\n\nstatic ULONG Feedback360AddRef(void *that)\n{\n    Xbox360ForceFeedback *this=FFThis(that);\n    this->refCount++;\n    return this->refCount;\n}\n\nstatic ULONG Feedback360Release(void *that)\n{\n    Xbox360ForceFeedback *this=FFThis(that);\n    this->refCount--;\n    if(this->refCount==0) {\n        dealloc360Feedback(this);\n        return 0;\n    } else return this->refCount;\n}\n\n// IOCFPlugInInterface\n\nstatic IOReturn Feedback360Probe(void *that,CFDictionaryRef propertyTable,io_service_t service,SInt32 *order)\n{\n    if ((service==0)\n     || ((!IOObjectConformsTo(service,\"Xbox360ControllerClass\"))\n     && (!IOObjectConformsTo(service,\"Wireless360Controller\")))) return kIOReturnBadArgument;\n    return S_OK;\n}\n\nstatic IOReturn Feedback360Start(void *that,CFDictionaryRef propertyTable,io_service_t service)\n{\n    return S_OK;\n}\n\nstatic IOReturn Feedback360Stop(void *that)\n{\n    return S_OK;\n}\n\n// IOForceFeedbackDevice\n\nstatic HRESULT Feedback360GetVersion(void *this,ForceFeedbackVersion *version)\n{\n    if((this==NULL)||(version==NULL)) return FFERR_INVALIDPARAM;\n    version->apiVersion.majorRev=kFFPlugInAPIMajorRev;\n    version->apiVersion.minorAndBugRev=kFFPlugInAPIMinorAndBugRev;\n    version->apiVersion.stage=kFFPlugInAPIStage;\n    version->apiVersion.nonRelRev=kFFPlugInAPINonRelRev;\n    version->plugInVersion.majorRev=FeedbackDriverVersionMajor;\n    version->plugInVersion.minorAndBugRev=FeedbackDriverVersionMinor;\n    version->plugInVersion.stage=FeedbackDriverVersionStage;\n    version->plugInVersion.nonRelRev=FeedbackDriverVersionNonRelRev;\n    return S_OK;\n}\n\nstatic void Feedback360_Callback(void *that,unsigned char large,unsigned char small)\n{\n    Xbox360ForceFeedback *this=(Xbox360ForceFeedback*)that;\n    char buf[]={0x00,0x04,large,small};\n    if(!this->manual) Device_Send(&this->device,buf,sizeof(buf));\n}\n\nstatic HRESULT Feedback360InitializeTerminate(void *that,NumVersion APIversion,io_object_t hidDevice,boolean_t begin)\n{\n    Xbox360ForceFeedback *this=FFThis(that);\n//    fprintf(stderr,\"Feedback360InitializeTerminate(%p,[%i.%i.%i.%i],%p,%s)\\n\",this,APIversion.majorRev,APIversion.minorAndBugRev,APIversion.stage,APIversion.nonRelRev,hidDevice,begin?\"true\":\"false\");\n    if(this==NULL) return FFERR_INVALIDPARAM;\n    if(begin) {\n//        fprintf(stderr,\"Feedback: Initialising...\\n\");\n        // Initialize\n        if(APIversion.majorRev!=kFFPlugInAPIMajorRev)\n        {\n//            fprintf(stderr,\"Feedback: Invalid version\\n\");\n            return FFERR_INVALIDPARAM;\n        }\n        // From probe\n            if( (hidDevice==0)\n             || ((!IOObjectConformsTo(hidDevice,\"Xbox360ControllerClass\"))\n             &&  (!IOObjectConformsTo(hidDevice,\"Wireless360Controller\"))) )\n        {\n//            fprintf(stderr,\"Feedback: Invalid device\\n\");\n            return FFERR_INVALIDPARAM;\n        }\n        Emulate_Initialise(&this->emulator,10,Feedback360_Callback,this);\n        if(!Device_Initialise(&this->device,hidDevice)) {\n//            fprintf(stderr,\"Feedback: Failed to initialise\\n\");\n            Emulate_Finalise(&this->emulator);\n            return FFERR_NOINTERFACE;\n        }\n        this->manual=FALSE;\n    } else {\n//        fprintf(stderr,\"Feedback: Terminating\\n\");\n        // Terminate\n        Emulate_Finalise(&this->emulator);\n        Device_Finalise(&this->device);\n    }\n    return FF_OK;\n}\n\nstatic HRESULT Feedback360DestroyEffect(void *that,FFEffectDownloadID downloadID)\n{\n    Xbox360ForceFeedback *this=FFThis(that);\n    Emulate_DestroyEffect(&this->emulator,downloadID);\n    return FF_OK;\n}\n\nstatic bool Feedback360SupportedEffect(CFUUIDRef effect)\n{\n    if(CFEqual(effect,kFFEffectType_SawtoothDown_ID)) return TRUE;\n    if(CFEqual(effect,kFFEffectType_SawtoothUp_ID)) return TRUE;\n    if(CFEqual(effect,kFFEffectType_Sine_ID)) return TRUE;\n    if(CFEqual(effect,kFFEffectType_Spring_ID)) return TRUE;\n    if(CFEqual(effect,kFFEffectType_Square_ID)) return TRUE;\n    if(CFEqual(effect,kFFEffectType_Triangle_ID)) return TRUE;\n    return FALSE;\n}\n\nstatic bool Feedback360ConvertEffect(const FFEFFECT *effect,ForceParams *params)\n{\n    if((effect->cbTypeSpecificParams!=sizeof(FFPERIODIC))||(effect->lpvTypeSpecificParams==NULL)) return FALSE;\n    // Settings\n    params->startDelay=effect->dwStartDelay;\n    params->gain=effect->dwGain;\n    params->maxLevel=10000;\n    // Envelope\n    params->sustainLevel=((FFPERIODIC*)effect->lpvTypeSpecificParams)->dwMagnitude;\n        // Documentation was a bit confusing here as to which value was right, compared to what a game actually used\n//    params->sustainTime=effect->dwDuration;\n    params->sustainTime=((FFPERIODIC*)effect->lpvTypeSpecificParams)->dwPeriod;\n    if(effect->lpEnvelope==NULL) {\n        params->attackLevel=params->sustainLevel;\n        params->attackTime=0;\n        params->fadeLevel=params->sustainLevel;\n        params->fadeTime=0;\n    } else {\n        if(effect->lpEnvelope->dwSize<sizeof(FFENVELOPE)) return FALSE;\n        params->attackLevel=effect->lpEnvelope->dwAttackLevel;\n        params->attackTime=effect->lpEnvelope->dwAttackTime;\n        params->fadeLevel=effect->lpEnvelope->dwFadeLevel;\n        params->fadeTime=effect->lpEnvelope->dwFadeTime;\n    }\n    // Done\n    return TRUE;\n}\n\nstatic HRESULT Feedback360DownloadEffect(void *that,CFUUIDRef effectType,FFEffectDownloadID *downloadID,FFEFFECT *effect,FFEffectParameterFlag flags)\n{\n    ForceParams params;\n    Xbox360ForceFeedback *this=FFThis(that);\n\n    if(!Feedback360SupportedEffect(effectType)) return FFERR_UNSUPPORTED;\n    if(!(effect->dwFlags&FFEFF_SPHERICAL)) return FFERR_UNSUPPORTED;\n    if(effect->dwTriggerButton!=FFEB_NOTRIGGER) return FFERR_UNSUPPORTED;\n    if(!Feedback360ConvertEffect(effect,&params)) return FFERR_UNSUPPORTED;\n    if(Emulate_IsPaused(&this->emulator)) return FFERR_DEVICEPAUSED;\n    if(flags&FFEP_NODOWNLOAD) return FF_OK;\n    if((*downloadID)==0) {\n        *downloadID=Emulate_CreateEffect(&this->emulator,&params);\n        if((*downloadID)==0) return FFERR_DEVICEFULL;\n    } else {\n        if(!Emulate_IsValidEffect(&this->emulator,*downloadID)) return FFERR_INVALIDDOWNLOADID;\n        if(!Emulate_ChangeEffect(&this->emulator,*downloadID,&params)) return FFERR_EFFECTTYPEMISMATCH;\n    }\n    if(flags&FFEP_START) {\n        // Restart\n    }\n    return FF_OK;\n}\n\nstatic HRESULT Feedback360Escape(void *that,FFEffectDownloadID downloadID,FFEFFESCAPE *escape)\n{\n    Xbox360ForceFeedback *this=FFThis(that);\n\n    if(this==NULL) return FFERR_INVALIDPARAM;\n    if(downloadID!=0) return FFERR_UNSUPPORTED;\n    if(escape->dwSize<sizeof(FFEFFESCAPE)) return FFERR_INVALIDPARAM;\n    escape->cbOutBuffer=0;\n    switch(escape->dwCommand) {\n        case 0x00:  // Control motors\n            if(escape->cbInBuffer!=1) return FFERR_INVALIDPARAM;\n            this->manual=((unsigned char*)escape->lpvInBuffer)[0]!=0x00;\n            break;\n        case 0x01:  // Set motors\n            if(escape->cbInBuffer!=2) return FFERR_INVALIDPARAM;\n            if(this->manual) {\n                unsigned char *data=escape->lpvInBuffer;\n                unsigned char buf[]={0x00,0x04,data[0],data[1]};\n                Device_Send(&this->device,buf,sizeof(buf));\n            }\n            break;\n        case 0x02:  // Set LED\n            if(escape->cbInBuffer!=1) return FFERR_INVALIDPARAM;\n            {\n                unsigned char *data=escape->lpvInBuffer;\n                unsigned char buf[]={0x01,0x03,data[0]};\n                Device_Send(&this->device,buf,sizeof(buf));\n            }\n            break;\n        case 0x03:  // Power off\n        {\n            unsigned char buf[] = {0x02, 0x02};\n            Device_Send(&this->device, buf, sizeof(buf));\n        }\n            break;\n        default:\n            fprintf(stderr, \"Xbox360Controller FF plugin: Unknown escape (%i)\\n\", (int)escape->dwCommand);\n            return FFERR_UNSUPPORTED;\n    }\n    return FF_OK;\n}\n\nstatic HRESULT Feedback360GetEffectStatus(void *that,FFEffectDownloadID downloadID,FFEffectStatusFlag *statusCode)\n{\n    Xbox360ForceFeedback *this=FFThis(that);\n\n    if(!Emulate_IsValidEffect(&this->emulator,downloadID)) return FFERR_INVALIDDOWNLOADID;\n    *statusCode=Emulate_IsPlaying(&this->emulator,downloadID)?FFEGES_PLAYING:FFEGES_NOTPLAYING;\n    return FF_OK;\n}\n\nstatic HRESULT Feedback360GetForceFeedbackCapabilities(void *this,FFCAPABILITIES *capabilities)\n{\n    capabilities->ffSpecVer.majorRev=kFFPlugInAPIMajorRev;\n    capabilities->ffSpecVer.minorAndBugRev=kFFPlugInAPIMinorAndBugRev;\n    capabilities->ffSpecVer.stage=kFFPlugInAPIStage;\n    capabilities->ffSpecVer.nonRelRev=kFFPlugInAPINonRelRev;\n    capabilities->supportedEffects=FFCAP_ET_SQUARE|FFCAP_ET_SINE|FFCAP_ET_TRIANGLE|FFCAP_ET_SAWTOOTHUP|FFCAP_ET_SAWTOOTHDOWN;\n    capabilities->emulatedEffects=0;\n    capabilities->subType=FFCAP_ST_VIBRATION;\n    capabilities->numFfAxes=1;\n    capabilities->ffAxes[0]=FFJOFS_X;\n    capabilities->storageCapacity=256;\n    capabilities->playbackCapacity=1;\n    capabilities->driverVer.majorRev=FeedbackDriverVersionMajor;\n    capabilities->driverVer.minorAndBugRev=FeedbackDriverVersionMinor;\n    capabilities->driverVer.stage=FeedbackDriverVersionStage;\n    capabilities->driverVer.nonRelRev=FeedbackDriverVersionNonRelRev;\n    capabilities->firmwareVer.majorRev=1;\n    capabilities->firmwareVer.minorAndBugRev=0;\n    capabilities->firmwareVer.stage=developStage;\n    capabilities->firmwareVer.nonRelRev=0;\n    capabilities->hardwareVer.majorRev=1;\n    capabilities->hardwareVer.minorAndBugRev=0;\n    capabilities->hardwareVer.stage=developStage;\n    capabilities->hardwareVer.nonRelRev=0;\n    return S_OK;\n}\n\nstatic HRESULT Feedback360GetForceFeedbackState(void *that,ForceFeedbackDeviceState *deviceState)\n{\n    Xbox360ForceFeedback *this=FFThis(that);\n\n    if(deviceState->dwSize<sizeof(ForceFeedbackDeviceState)) return FFERR_INVALIDPARAM;\n    else deviceState->dwSize=sizeof(ForceFeedbackDeviceState);\n    deviceState->dwState\n        = Emulate_IsEmpty(&this->emulator)?FFGFFS_EMPTY:0\n        | Emulate_IsStopped(&this->emulator)?FFGFFS_STOPPED:0\n        | Emulate_IsPaused(&this->emulator)?FFGFFS_PAUSED:0\n        | Emulate_IsEnabled(&this->emulator)?FFGFFS_ACTUATORSON:FFGFFS_ACTUATORSOFF;\n    deviceState->dwLoad=(Emulate_Effects_Used(&this->emulator)*100)/Emulate_Effects_Total(&this->emulator);\n    return S_OK;\n}\n\nstatic HRESULT Feedback360SendForceFeedbackCommand(void *that,FFCommandFlag state)\n{\n    Xbox360ForceFeedback *this=FFThis(that);\n\n    switch(state) {\n        case FFSFFC_RESET:\n            Emulate_Reset(&this->emulator);\n            return S_OK;\n        case FFSFFC_STOPALL:\n            Emulate_Stop(&this->emulator,0);    // 0 == all effects\n            return S_OK;\n        case FFSFFC_PAUSE:\n        case FFSFFC_CONTINUE:\n            Emulate_SetPaused(&this->emulator,state==FFSFFC_PAUSE);\n            return S_OK;\n        case FFSFFC_SETACTUATORSON:\n        case FFSFFC_SETACTUATORSOFF:\n            Emulate_SetEnable(&this->emulator,state==FFSFFC_SETACTUATORSON);\n            return S_OK;\n        default:\n            return FFERR_UNSUPPORTED;\n    }\n}\n\nstatic HRESULT Feedback360SetProperty(void *that,FFProperty property,void *value)\n{\n    Xbox360ForceFeedback *this=FFThis(that);\n\n    switch(property) {\n        case FFPROP_FFGAIN:\n            {\n                UInt32 uValue = *((UInt32*)value);\n                if (uValue > 10000)\n\t\t\t\t\treturn FFERR_INVALIDPARAM;\n                Emulate_SetGain(&this->emulator, uValue, 10000);\n            }\n            return FF_OK;\n        default:\n            return FFERR_UNSUPPORTED;\n    }\n}\n\nstatic HRESULT Feedback360StartEffect(void *that,FFEffectDownloadID downloadID,FFEffectStartFlag mode,UInt32 iterations)\n{\n    Xbox360ForceFeedback *this=FFThis(that);\n\n    if(mode&FFES_SOLO) Feedback360SendForceFeedbackCommand(that,FFSFFC_RESET);\n    Emulate_Start(&this->emulator,downloadID,iterations);\n    return S_OK;\n}\n\nstatic HRESULT Feedback360StopEffect(void *that,FFEffectDownloadID downloadID)\n{\n    Xbox360ForceFeedback *this=FFThis(that);\n\n    if(!Emulate_IsValidEffect(&this->emulator,downloadID)) return FFERR_INVALIDDOWNLOADID;\n    Emulate_Stop(&this->emulator,downloadID);\n    return S_OK;\n}\n\n// Function table\n\nstatic IOCFPlugInInterface functionMap360_IOCFPlugInInterface={\n    // Padding required for COM\n    NULL,\n    // IUnknown\n    Feedback360QueryInterface,\n    Feedback360AddRef,\n    Feedback360Release,\n    // IOCFPlugInInterface\n    1,0,    // Version\n    Feedback360Probe,\n    Feedback360Start,\n    Feedback360Stop\n};\n\nstatic IOForceFeedbackDeviceInterface functionMap360_IOForceFeedbackDeviceInterface={\n    // Padding required for COM\n    NULL,\n    // IUnknown\n    Feedback360QueryInterface,\n    Feedback360AddRef,\n    Feedback360Release,\n    // IOForceFeedbackDevice\n    Feedback360GetVersion,\n    Feedback360InitializeTerminate,\n    Feedback360DestroyEffect,\n    Feedback360DownloadEffect,\n    Feedback360Escape,\n    Feedback360GetEffectStatus,\n    Feedback360GetForceFeedbackCapabilities,\n    Feedback360GetForceFeedbackState,\n    Feedback360SendForceFeedbackCommand,\n    Feedback360SetProperty,\n    Feedback360StartEffect,\n    Feedback360StopEffect\n};\n\n// Constructor and destructor\n\nstatic IOCFPlugInInterface** alloc360Feedback(CFUUIDRef uuid)\n{\n    Xbox360ForceFeedback *item;\n    \n    item=(Xbox360ForceFeedback*)malloc(sizeof(Xbox360ForceFeedback));\n    item->iIOCFPlugInInterface.pseudoVTable=(IUnknownVTbl*)&functionMap360_IOCFPlugInInterface;\n    item->iIOCFPlugInInterface.obj=item;\n    item->iIOForceFeedbackDeviceInterface.pseudoVTable=(IUnknownVTbl*)&functionMap360_IOForceFeedbackDeviceInterface;\n    item->iIOForceFeedbackDeviceInterface.obj=item;\n    item->factoryID=CFRetain(uuid);\n    CFPlugInAddInstanceForFactory(uuid);\n    item->refCount=1;\n    return (IOCFPlugInInterface**)&item->iIOCFPlugInInterface.pseudoVTable;\n}\n\nstatic void dealloc360Feedback(Xbox360ForceFeedback *this)\n{\n    CFUUIDRef uuid;\n    \n    uuid=this->factoryID;\n    free(this);\n    if(uuid) {\n        CFPlugInRemoveInstanceForFactory(uuid);\n        CFRelease(uuid);\n    }\n}\n\n// External factory function\n\nvoid* Control360Factory(CFAllocatorRef allocator,CFUUIDRef uuid)\n{\n    if(CFEqual(uuid,kIOForceFeedbackLibTypeID)) return (void*)alloc360Feedback(uuid);\n    else return NULL;\n}\n"
  },
  {
    "path": "Feedback360/main.h",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    main.h - defines the structure used for the plugin COM object\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#include <ForceFeedback/IOForceFeedbackLib.h>\n#include <IOKit/IOCFPlugin.h>\n#include \"emulator.h\"\n#include \"devlink.h\"\n\nstruct _Xbox360ForceFeedback;\n\ntypedef struct _Xbox360InterfaceMap {\n    IUnknownVTbl *pseudoVTable;\n    struct _Xbox360ForceFeedback *obj;\n} Xbox360InterfaceMap;\n\ntypedef struct _Xbox360ForceFeedback {\n    Xbox360InterfaceMap iIOCFPlugInInterface;\n    Xbox360InterfaceMap iIOForceFeedbackDeviceInterface;\n    CFUUIDRef factoryID;\n    UInt32 refCount;\n    ForceEmulator emulator;\n    DeviceLink device;\n    bool manual;\n} Xbox360ForceFeedback;\n\n#define FFThis(interface)                       (((interface)==NULL)?NULL:(((Xbox360InterfaceMap*)(interface))->obj))\n\n#define FeedbackDriverVersionMajor              1\n#define FeedbackDriverVersionMinor              0\n#define FeedbackDriverVersionStage              developStage\n#define FeedbackDriverVersionNonRelRev          0\n\n// B8ED278F-EC8A-4E8E-B4CF-13E2A9D68E83\n#define FeedbackDriverUuid CFUUIDGetConstantUUIDWithBytes(NULL, \t\\\n    0xB8, 0xED, 0x27, 0x8F, 0xEC, 0x8A, 0x4E, 0x8E, \t\t\t\t\t\\\n    0xB4, 0xCF, 0x13, 0xE2, 0xA9, 0xD6, 0x8E, 0x83)\n\n// Factory function\nvoid* Control360Factory(CFAllocatorRef allocator,CFUUIDRef uuid);\n"
  },
  {
    "path": "Feedback360/version.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>BuildVersion</key>\n\t<string>12</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n\t<key>ProductBuildVersion</key>\n\t<string>7K571</string>\n\t<key>ProjectName</key>\n\t<string>DevToolsWizardTemplates</string>\n\t<key>SourceVersion</key>\n\t<string>3870000</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Install360Controller/Install360Controller.pkgproj",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PACKAGES</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>PACKAGE_FILES</key>\n\t\t\t<dict>\n\t\t\t\t<key>DEFAULT_INSTALL_LOCATION</key>\n\t\t\t\t<string>/</string>\n\t\t\t\t<key>HIERARCHY</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Utilities</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>Applications</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>509</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>../360Daemon/build/Release/360Daemon</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>3</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>../360Daemon/Alert.tif</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>420</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>3</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>Resources</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>2</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string>360Daemon</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>2</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t\t\t<string>MICE</string>\n\t\t\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>2</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Application Support</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Documentation</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Filesystems</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Frameworks</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Input Methods</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Internet Plug-Ins</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>LaunchAgents</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t\t\t<string>../360Daemon/com.mice.360Daemon.plist</string>\n\t\t\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>420</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>3</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>LaunchDaemons</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t\t\t<string>../Pref360Control/build/Deployment/Pref360Control.prefPane</string>\n\t\t\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>3</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>PreferencePanes</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Preferences</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Printers</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>PrivilegedHelperTools</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>QuickLook</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>QuickTime</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Screen Savers</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Scripts</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Services</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Widgets</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>Library</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>BUNDLE_CAN_DOWNGRADE</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<true/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string>../360Controller/build/Deployment/360Controller.kext</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>3</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string>../Wireless360Controller/build/Release/Wireless360Controller.kext</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>3</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string>../WirelessGamingReceiver/build/Release/WirelessGamingReceiver.kext</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>3</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t\t\t<string>Extensions</string>\n\t\t\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Library</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>System</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Shared</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>1023</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>Users</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t<string>/</string>\n\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t<integer>0</integer>\n\t\t\t\t</dict>\n\t\t\t\t<key>PAYLOAD_TYPE</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t\t<key>VERSION</key>\n\t\t\t\t<integer>2</integer>\n\t\t\t</dict>\n\t\t\t<key>PACKAGE_SCRIPTS</key>\n\t\t\t<dict>\n\t\t\t\t<key>POSTINSTALL_PATH</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t<string>Scripts/finish.sh</string>\n\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t<integer>1</integer>\n\t\t\t\t</dict>\n\t\t\t\t<key>PREINSTALL_PATH</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t<string>Scripts/upgrade.sh</string>\n\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t<integer>1</integer>\n\t\t\t\t</dict>\n\t\t\t\t<key>RESOURCES</key>\n\t\t\t\t<array/>\n\t\t\t</dict>\n\t\t\t<key>PACKAGE_SETTINGS</key>\n\t\t\t<dict>\n\t\t\t\t<key>AUTHENTICATION</key>\n\t\t\t\t<integer>1</integer>\n\t\t\t\t<key>CONCLUSION_ACTION</key>\n\t\t\t\t<integer>2</integer>\n\t\t\t\t<key>IDENTIFIER</key>\n\t\t\t\t<string>com.mice.pkg.Xbox360controller</string>\n\t\t\t\t<key>NAME</key>\n\t\t\t\t<string>Install360Controller</string>\n\t\t\t\t<key>OVERWRITE_PERMISSIONS</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>VERSION</key>\n\t\t\t\t<string>0.12</string>\n\t\t\t</dict>\n\t\t\t<key>UUID</key>\n\t\t\t<string>95C3DB03-4C99-4A29-AEC7-C73B3D9F6A04</string>\n\t\t</dict>\n\t</array>\n\t<key>PROJECT</key>\n\t<dict>\n\t\t<key>PROJECT_COMMENTS</key>\n\t\t<dict>\n\t\t\t<key>NOTES</key>\n\t\t\t<data>\n\t\t\tPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1M\n\t\t\tIDQuMDEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQv\n\t\t\tc3RyaWN0LmR0ZCI+CjxodG1sPgo8aGVhZD4KPG1ldGEgaHR0cC1l\n\t\t\tcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7\n\t\t\tIGNoYXJzZXQ9VVRGLTgiPgo8bWV0YSBodHRwLWVxdWl2PSJDb250\n\t\t\tZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIj4KPHRp\n\t\t\tdGxlPjwvdGl0bGU+CjxtZXRhIG5hbWU9IkdlbmVyYXRvciIgY29u\n\t\t\tdGVudD0iQ29jb2EgSFRNTCBXcml0ZXIiPgo8bWV0YSBuYW1lPSJD\n\t\t\tb2NvYVZlcnNpb24iIGNvbnRlbnQ9IjExODcuMzQiPgo8c3R5bGUg\n\t\t\tdHlwZT0idGV4dC9jc3MiPgo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5\n\t\t\tPgo8L2JvZHk+CjwvaHRtbD4K\n\t\t\t</data>\n\t\t</dict>\n\t\t<key>PROJECT_PRESENTATION</key>\n\t\t<dict>\n\t\t\t<key>INSTALLATION TYPE</key>\n\t\t\t<dict>\n\t\t\t\t<key>HIERARCHIES</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>INSTALLER</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>LIST</key>\n\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>DESCRIPTION</key>\n\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t<key>OPTIONS</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>HIDDEN</key>\n\t\t\t\t\t\t\t\t\t<true/>\n\t\t\t\t\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>PACKAGE_UUID</key>\n\t\t\t\t\t\t\t\t<string>95C3DB03-4C99-4A29-AEC7-C73B3D9F6A04</string>\n\t\t\t\t\t\t\t\t<key>REQUIREMENTS</key>\n\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t<key>TITLE</key>\n\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t<key>TOOLTIP</key>\n\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t<key>UUID</key>\n\t\t\t\t\t\t\t\t<string>CB32CFF6-F06D-4B81-B1A5-A040090A6BFB</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<key>REMOVED</key>\n\t\t\t\t\t\t<dict/>\n\t\t\t\t\t</dict>\n\t\t\t\t</dict>\n\t\t\t\t<key>INSTALLATION TYPE</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t</dict>\n\t\t\t<key>INSTALLATION_STEPS</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewIntroductionController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>Introduction</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewReadMeController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>ReadMe</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewLicenseController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>License</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewDestinationSelectController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>TargetSelect</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewInstallationTypeController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>PackageSelection</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewInstallationController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>Install</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewSummaryController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>Summary</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>INTRODUCTION</key>\n\t\t\t<dict>\n\t\t\t\t<key>LOCALIZATIONS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>LANGUAGE</key>\n\t\t\t\t\t\t<string>English</string>\n\t\t\t\t\t\t<key>VALUE</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>Text/Welcome.rtf</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</dict>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t\t<key>LICENSE</key>\n\t\t\t<dict>\n\t\t\t\t<key>KEYWORDS</key>\n\t\t\t\t<dict/>\n\t\t\t\t<key>LOCALIZATIONS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>LANGUAGE</key>\n\t\t\t\t\t\t<string>English</string>\n\t\t\t\t\t\t<key>VALUE</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>../Licence.txt</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</dict>\n\t\t\t\t</array>\n\t\t\t\t<key>MODE</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t</dict>\n\t\t\t<key>README</key>\n\t\t\t<dict>\n\t\t\t\t<key>LOCALIZATIONS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>LANGUAGE</key>\n\t\t\t\t\t\t<string>English</string>\n\t\t\t\t\t\t<key>VALUE</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>../Readme.rtf</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</dict>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t\t<key>SUMMARY</key>\n\t\t\t<dict>\n\t\t\t\t<key>LOCALIZATIONS</key>\n\t\t\t\t<array/>\n\t\t\t</dict>\n\t\t\t<key>TITLE</key>\n\t\t\t<dict>\n\t\t\t\t<key>LOCALIZATIONS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>LANGUAGE</key>\n\t\t\t\t\t\t<string>English</string>\n\t\t\t\t\t\t<key>VALUE</key>\n\t\t\t\t\t\t<string>Install360Controller</string>\n\t\t\t\t\t</dict>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>PROJECT_REQUIREMENTS</key>\n\t\t<dict>\n\t\t\t<key>LIST</key>\n\t\t\t<array/>\n\t\t\t<key>POSTINSTALL_PATH</key>\n\t\t\t<dict/>\n\t\t\t<key>PREINSTALL_PATH</key>\n\t\t\t<dict/>\n\t\t\t<key>RESOURCES</key>\n\t\t\t<array/>\n\t\t\t<key>ROOT_VOLUME_ONLY</key>\n\t\t\t<true/>\n\t\t</dict>\n\t\t<key>PROJECT_SETTINGS</key>\n\t\t<dict>\n\t\t\t<key>ADVANCED_OPTIONS</key>\n\t\t\t<dict/>\n\t\t\t<key>BUILD_FORMAT</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>BUILD_PATH</key>\n\t\t\t<dict>\n\t\t\t\t<key>PATH</key>\n\t\t\t\t<string>build</string>\n\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t<integer>1</integer>\n\t\t\t</dict>\n\t\t\t<key>CERTIFICATE</key>\n\t\t\t<dict>\n\t\t\t\t<key>NAME</key>\n\t\t\t\t<string>Developer ID Installer: Colin Munro</string>\n\t\t\t\t<key>PATH</key>\n\t\t\t\t<string>/Users/colin/Library/Keychains/login.keychain</string>\n\t\t\t</dict>\n\t\t\t<key>EXCLUDED_FILES</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATTERNS_ARRAY</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.DS_Store</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>PROTECTED</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>PROXY_NAME</key>\n\t\t\t\t\t<string>Remove .DS_Store files</string>\n\t\t\t\t\t<key>PROXY_TOOLTIP</key>\n\t\t\t\t\t<string>Remove \".DS_Store\" files created by the Finder.</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATTERNS_ARRAY</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.pbdevelopment</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>PROTECTED</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>PROXY_NAME</key>\n\t\t\t\t\t<string>Remove .pbdevelopment files</string>\n\t\t\t\t\t<key>PROXY_TOOLTIP</key>\n\t\t\t\t\t<string>Remove \".pbdevelopment\" files created by ProjectBuilder or Xcode.</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATTERNS_ARRAY</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>CVS</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.cvsignore</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.cvspass</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.svn</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.git</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.gitignore</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>PROTECTED</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>PROXY_NAME</key>\n\t\t\t\t\t<string>Remove SCM metadata</string>\n\t\t\t\t\t<key>PROXY_TOOLTIP</key>\n\t\t\t\t\t<string>Remove helper files and folders used by the CVS, SVN or Git Source Code Management systems.</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATTERNS_ARRAY</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>classes.nib</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>designable.db</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>info.nib</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>PROTECTED</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>PROXY_NAME</key>\n\t\t\t\t\t<string>Optimize nib files</string>\n\t\t\t\t\t<key>PROXY_TOOLTIP</key>\n\t\t\t\t\t<string>Remove \"classes.nib\", \"info.nib\" and \"designable.nib\" files within .nib bundles.</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATTERNS_ARRAY</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>Resources Disabled</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>PROTECTED</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>PROXY_NAME</key>\n\t\t\t\t\t<string>Remove Resources Disabled folders</string>\n\t\t\t\t\t<key>PROXY_TOOLTIP</key>\n\t\t\t\t\t<string>Remove \"Resources Disabled\" folders.</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>SEPARATOR</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>NAME</key>\n\t\t\t<string>Install360Controller</string>\n\t\t</dict>\n\t</dict>\n\t<key>TYPE</key>\n\t<integer>0</integer>\n\t<key>VERSION</key>\n\t<integer>2</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Install360Controller/Scripts/finish.sh",
    "content": "#!/bin/sh\n\n/usr/bin/touch /System/Library/Extensions\n\nexit 0\n"
  },
  {
    "path": "Install360Controller/Scripts/upgrade.sh",
    "content": "#!/bin/sh\n\n# Clear out daemon\n\nif [ -d /Library/StartupItems/360ControlDaemon ]; then\n   /bin/rm -r /Library/StartupItems/360ControlDaemon\nfi\n\nif [ -f /Library/LaunchDaemons/com.mice.360Daemon.plist ]; then\n   launchctl stop com.mice.360Daemon\n   /bin/rm /Library/LaunchDaemons/com.mice.360Daemon.plist\nfi\n\nif [ -d /Library/Application\\ Support/MICE/360Daemon ]; then\n   /bin/rm -r /Library/Application\\ Support/MICE/360Daemon\nfi\n\n# Remove preference pane\n\nif [ -d /Library/PreferencePanes/Pref360Control.prefPane ]; then\n   /bin/rm -r /Library/PreferencePanes/Pref360Control.prefPane\nfi\n\n# Remove drivers\n\nif [ -d /System/Library/Extensions/360Controller.kext ]; then\n   /bin/rm -r /System/Library/Extensions/360Controller.kext\nfi\n\nif [ -d /System/Library/Extensions/Wireless360Controller.kext ]; then\n   /bin/rm -r /System/Library/Extensions/Wireless360Controller.kext\nfi\n\nif [ -d /System/Library/Extensions/WirelessGamingReceiver.kext ]; then\n   /bin/rm -r /System/Library/Extensions/WirelessGamingReceiver.kext\nfi\n\nexit 0\n"
  },
  {
    "path": "Install360Controller/Text/Welcome.rtf",
    "content": "{\\rtf1\\ansi\\ansicpg1252\\cocoartf1187\\cocoasubrtf340\n\\cocoascreenfonts1{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;}\n{\\colortbl;\\red255\\green255\\blue255;}\n{\\*\\listtable{\\list\\listtemplateid1\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid1\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid1}\n{\\list\\listtemplateid2\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid101\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid2}\n{\\list\\listtemplateid3\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid201\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid3}\n{\\list\\listtemplateid4\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid301\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid4}\n{\\list\\listtemplateid5\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid401\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid5}\n{\\list\\listtemplateid6\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid501\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid6}\n{\\list\\listtemplateid7\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid601\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid7}\n{\\list\\listtemplateid8\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid701\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid8}\n{\\list\\listtemplateid9\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid801\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid9}\n{\\list\\listtemplateid10\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid901\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid10}\n{\\list\\listtemplateid11\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid1001\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid11}}\n{\\*\\listoverridetable{\\listoverride\\listid1\\listoverridecount0\\ls1}{\\listoverride\\listid2\\listoverridecount0\\ls2}{\\listoverride\\listid3\\listoverridecount0\\ls3}{\\listoverride\\listid4\\listoverridecount0\\ls4}{\\listoverride\\listid5\\listoverridecount0\\ls5}{\\listoverride\\listid6\\listoverridecount0\\ls6}{\\listoverride\\listid7\\listoverridecount0\\ls7}{\\listoverride\\listid8\\listoverridecount0\\ls8}{\\listoverride\\listid9\\listoverridecount0\\ls9}{\\listoverride\\listid10\\listoverridecount0\\ls10}{\\listoverride\\listid11\\listoverridecount0\\ls11}}\n\\paperw12240\\paperh15840\\margl1440\\margr1440\\vieww14760\\viewh12840\\viewkind0\n\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\n\n\\f0\\b\\fs42 \\cf0 XBox 360 Controller Driver\\\n\n\\b0\\fs24 Version 0.12\\\nCopyright (C) 2005-2013 Colin Munro\\\n\\\nWelcome to the installer for the XBox 360 Controller driver for Mac OS X.\\\n\\\n\n\\b Update 0.12: 4/01/2013\\\n\n\\b0 \\\nThis update includes:\\\n\\pard\\tx220\\tx720\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\li720\\fi-720\\pardirnatural\n\\ls1\\ilvl0\\cf0 {\\listtext\t\\'95\t}Fix that prevents non-ChatPad-compatible controllers from working\\\n{\\listtext\t\\'95\t}Improvement to ChatPad support\\\n{\\listtext\t\\'95\t}Improvement to wireless support (automatic and manual power-off)\\\n{\\listtext\t\\'95\t}Updated Info.plist with many common devices\\\n\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\n\\cf0 \\\n\n\\b Update 0.11: 10/01/2012\\\n\n\\b0 \\\nThis update includes:\\\n\\pard\\tx220\\tx720\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\li720\\fi-720\\pardirnatural\n\\ls2\\ilvl0\\cf0 {\\listtext\t\\'95\t}Temporary Lion fix (thanks to \"codeman38\")\\\n{\\listtext\t\\'95\t}Adjustment to the automatic device match function\\\n\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\n\\cf0 \\\n\n\\b Update 0.10: 8/05/2011\\\n\n\\b0 \\\nThis update includes:\\\n\\pard\\tx220\\tx720\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\li720\\fi-720\\pardirnatural\n\\ls3\\ilvl0\\cf0 {\\listtext\t\\'95\t}Various bugfixes\\\n{\\listtext\t\\'95\t}New product IDs for Wireless Gaming Receiver\\\n{\\listtext\t\\'95\t}Automatic device match function, allowing you to select and deselect which controllers you want it to match with\\\n{\\listtext\t\\'95\t}Fix the incompatibility with Bioshock introduced with ChatPad support\\\n\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\n\\cf0 \\\n\n\\b Update 0.09: 21/11/2009\\\n\n\\b0 \\\nThis update includes:\\\n\\pard\\tx220\\tx720\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\li720\\fi-720\\pardirnatural\n\\ls4\\ilvl0\\cf0 {\\listtext\t\\'95\t}Driver rearchitecture\\\n{\\listtext\t\\'95\t}ChatPad support in wired controller\\\n\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\n\n\\b \\cf0 \\\nUpdate 0.08: 10/09/2009\\\n\n\\b0 \\\nThis update includes:\\\n\\pard\\tx220\\tx720\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\li720\\fi-720\\pardirnatural\n\\ls5\\ilvl0\\cf0 {\\listtext\t\\'95\t}64-bit support (untested)\\\n{\\listtext\t\\'95\t}Fix for Snow Leopard\\\n{\\listtext\t\\'95\t}Minor bugfixes\\\n\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\n\\cf0 \\\n\n\\b Update 0.07: 16/12/2007\\\n\n\\b0 \\\nThis update includes:\\\n\\pard\\tx220\\tx720\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\li720\\fi-720\\pardirnatural\n\\ls6\\ilvl0\\cf0 {\\listtext\t\\'95\t}10.4 bugfix\\\n{\\listtext\t\\'95\t}Extra controller IDs\\\n\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\n\\cf0 \\\n\n\\b Update 0.06: 10/11/2007\n\\b0 \\\n\\\nThis update includes:\\\n\\pard\\tx220\\tx720\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\li720\\fi-720\\pardirnatural\n\\ls7\\ilvl0\\cf0 {\\listtext\t\\'95\t}Improvements to the wireless support\\\n{\\listtext\t\\'95\t}Daemon providing persistent settings and LED setting\\\n{\\listtext\t\\'95\t}Bugfix to support Halo\\\n\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\n\\cf0 \\\n\n\\b Update 0.05: 21/4/2007\n\\b0 \\\n\\\nThis update includes:\\\n\\pard\\tx220\\tx720\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\li720\\fi-720\\pardirnatural\n\\ls8\\ilvl0\\cf0 {\\listtext\t\\'95\t}Improvements to the wireless support\\\n{\\listtext\t\\'95\t}New increased compatibility with games\\\n{\\listtext\t\\'95\t}Support for the Guitar Hero controller\\\n\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\n\\cf0 \\\n\n\\b Update 0.04: 27/2/2007\\\n\n\\b0 \\\nThis update includes:\\\n\\pard\\tx220\\tx720\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\li720\\fi-720\\pardirnatural\n\\ls9\\ilvl0\\cf0 {\\listtext\t\\'95\t}Driver for the Microsoft Wireless Gaming Receiver for Windows\\\n{\\listtext\t\\'95\t}Driver for the above to use the Wireless 360 Controller\\\n{\\listtext\t\\'95\t}Updates to the Preference Pane to support the Wireless 360 Controller\\\n\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\n\\cf0 \\\n\n\\b Update 0.03: 22/7/2006\\\n\n\\b0 \\\nThis update includes:\\\n\\pard\\tx220\\tx720\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\li720\\fi-720\\pardirnatural\n\\ls10\\ilvl0\\cf0 {\\listtext\t\\'95\t}More 3rd party vendor/product IDs\\\n\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\n\\cf0 \\\n\n\\b Update 0.02: 11/2/2006\n\\b0 \\\n\\\nThis update includes:\\\n\\pard\\tx220\\tx720\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\li720\\fi-720\\pardirnatural\n\\ls11\\ilvl0\\cf0 {\\listtext\t\\'95\t}Universal binaries, for Intel Mac support\\\n{\\listtext\t\\'95\t}Additional 3rd party vendor/product IDs (support for matching on interface instead of IDs still isn't working)\\\n{\\listtext\t\\'95\t}Preference Pane now correctly detects devices being connected/disconnected\\\n{\\listtext\t\\'95\t}Alternative deadzone mode\\\n{\\listtext\t\\'95\t}D-pad moved from pointer to plain joypad buttons, for better support in games\\\n\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\n\\cf0 \\\nPlease visit {\\field{\\*\\fldinst{HYPERLINK \"http://tattiebogle.net/index.php/ProjectRoot/Xbox360Controller/OsxDriver\"}}{\\fldrslt http://tattiebogle.net/index.php/ProjectRoot/Xbox360Controller/OsxDriver}} for information on this software. Consider donating or buying via the Amazon associate links to support development of this driver!\\\n\\\nEnsure to read the following Read Me and License sections before installing!}"
  },
  {
    "path": "Licence.txt",
    "content": "\t\t    GNU GENERAL PUBLIC LICENSE\n\t\t       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Library General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\f\n\t\t    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\f\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\f\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\f\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n\t\t     END OF TERMS AND CONDITIONS\n\f\n\t    How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Library General\nPublic License instead of this License.\n"
  },
  {
    "path": "Pref360Control/DeviceItem.h",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    DeviceItem.h - declaration of wrapper class for device handles\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#import <Cocoa/Cocoa.h>\n#import <IOKit/IOKitLib.h>\n#import <IOKit/IOCFPlugIn.h>\n#import <IOKit/hid/IOHIDLib.h>\n#import <IOKit/hid/IOHIDKeys.h>\n#import <ForceFeedback/ForceFeedback.h>\n\n@interface DeviceItem : NSObject {\n    IOHIDDeviceInterface122 **interface;\n    FFDeviceObjectReference forceFeedback;\n    io_service_t deviceHandle;\n    NSString *deviceName;\n}\n\n+ allocateDeviceItemForDevice:(io_service_t)device;\n\n- (NSString*)name;\n- (IOHIDDeviceInterface122**)hidDevice;\n- (FFDeviceObjectReference)ffDevice;\n- (io_service_t)rawDevice;\n\n@end\n"
  },
  {
    "path": "Pref360Control/DeviceItem.m",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    DeviceItem.m - implementation of device wrapper class\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#import \"DeviceItem.h\"\n\nstatic NSString* GetDeviceName(io_service_t device)\n{\n    CFMutableDictionaryRef serviceProperties;\n    NSDictionary *properties;\n    NSString *deviceName = nil;\n    \n    if (IORegistryEntryCreateCFProperties(device, &serviceProperties, kCFAllocatorDefault, kNilOptions) != KERN_SUCCESS)\n        return nil;\n    properties = (NSDictionary*)serviceProperties;\n    deviceName = [properties objectForKey:(NSString*)CFSTR(kIOHIDProductKey)];\n    if (deviceName == nil)\n        deviceName = [properties objectForKey:@\"USB Product Name\"];\n    [deviceName retain];\n    CFRelease(serviceProperties);\n    return deviceName;\n}\n\n@implementation DeviceItem\n\n+ allocateDeviceItemForDevice:(io_service_t)device\n{\n    DeviceItem *item;\n    IOReturn ret;\n    IOCFPlugInInterface **plugInInterface;\n    SInt32 score=0;\n    \n    item=[[[DeviceItem alloc] init] autorelease];\n    if(item==nil) goto fail;\n    ret=IOCreatePlugInInterfaceForService(device,kIOHIDDeviceUserClientTypeID,kIOCFPlugInInterfaceID,&plugInInterface,&score);\n    if(ret!=kIOReturnSuccess) goto fail;\n    ret=(*plugInInterface)->QueryInterface(plugInInterface,CFUUIDGetUUIDBytes(kIOHIDDeviceInterfaceID122),(LPVOID)&item->interface);\n    (*plugInInterface)->Release(plugInInterface);\n    if(ret!=kIOReturnSuccess) goto fail;\n    item->forceFeedback=0;\n    FFCreateDevice(device,&item->forceFeedback);\n    item->deviceHandle=device;\n    item->deviceName = GetDeviceName(device);\n    return item;\nfail:\n    IOObjectRelease(device);\n    return NULL;\n}\n\n- (void)dealloc\n{\n    if(deviceHandle != 0)\n        IOObjectRelease(deviceHandle);\n    if(interface != NULL)\n        (*interface)->Release(interface);\n    if(forceFeedback != 0)\n        FFReleaseDevice(forceFeedback);\n    [deviceName release];\n    [super dealloc];\n}\n\n- (NSString*)name\n{\n    return deviceName;\n}\n\n- (IOHIDDeviceInterface122**)hidDevice\n{\n    return interface;\n}\n\n- (FFDeviceObjectReference)ffDevice\n{\n    return forceFeedback;\n}\n\n- (io_service_t)rawDevice\n{\n    return deviceHandle;\n}\n\n@end\n"
  },
  {
    "path": "Pref360Control/DeviceLister.h",
    "content": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n DeviceLister.h - decleration of a class to display supported devices\n \n This file is part of Xbox360Controller.\n \n Xbox360Controller is free software; you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation; either version 2 of the License, or\n (at your option) any later version.\n \n Xbox360Controller is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n GNU General Public License for more details.\n \n You should have received a copy of the GNU General Public License\n along with Foobar; if not, write to the Free Software\n Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n */\n#import <Cocoa/Cocoa.h>\n\n@class Pref360ControlPref;\n\n@interface DeviceLister : NSObject {\n    Pref360ControlPref *owner;\n    IBOutlet NSWindow *sheet;\n    IBOutlet NSTableView *list;\n    \n    NSMutableDictionary *entries;\n    NSMutableArray *connected, *enabled;\n    \n    BOOL changed;\n}\n\n- (void)showWithOwner:(Pref360ControlPref*)pane;\n- (IBAction)done:(id)sender;\n\n@end\n"
  },
  {
    "path": "Pref360Control/DeviceLister.m",
    "content": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n DeviceLister.m - implementation of a class to list supported devices\n \n This file is part of Xbox360Controller.\n \n Xbox360Controller is free software; you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation; either version 2 of the License, or\n (at your option) any later version.\n \n Xbox360Controller is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n GNU General Public License for more details.\n \n You should have received a copy of the GNU General Public License\n along with Foobar; if not, write to the Free Software\n Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n */\n#import <IOKit/usb/IOUSBLib.h>\n#import \"DeviceLister.h\"\n#import \"Pref360ControlPref.h\"\n#import \"ControlPrefs.h\"\n\n#define TOOL_FILENAME       @\"DriverTool\"\n\n// Get some sort of CF type for a field in the IORegistry\nstatic id GetDeviceValue(io_service_t device, NSString *key)\n{\n    CFTypeRef value;\n    \n    value = IORegistryEntrySearchCFProperty(device, kIOServicePlane, (CFStringRef)key, kCFAllocatorDefault, kIORegistryIterateRecursively);\n    return [((NSObject*)value) autorelease];\n}\n\n// Make sure a name is as nice as possible for eventually going into the XML for the driver\nstatic NSString* SanitiseName(NSString *name)\n{\n    NSMutableString *output;\n    int i;\n    \n    output = [NSMutableString stringWithCapacity:100];\n    for (i = 0; i < [name length]; i++)\n    {\n        unichar c = [name characterAtIndex:i];\n        if (c == ' ')\n            c = '_';\n        else if (!(((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) || ((c >= '0') && (c <= '9')) || (c == '_')))\n            continue;\n        [output appendFormat:@\"%C\", c];\n    }\n    return output;\n}\n\n// Get the Device interface for a given IO service\nstatic IOUSBDeviceInterface** GetDeviceInterface(io_service_t device)\n{\n    IOCFPlugInInterface **iodev;\n    IOUSBDeviceInterface **dev;\n    IOReturn err;\n    SInt32 score;\n    \n    if ((IOCreatePlugInInterfaceForService(device, kIOUSBDeviceUserClientTypeID, kIOCFPlugInInterfaceID, &iodev, &score) == kIOReturnSuccess) && (iodev != NULL))\n    {\n        err = (*iodev)->QueryInterface(iodev, CFUUIDGetUUIDBytes(kIOUSBDeviceInterfaceID), (LPVOID)&dev);\n        (*iodev)->Release(iodev);\n        if (err == kIOReturnSuccess)\n            return dev;\n    }\n    return NULL;\n}\n\n// Get the Interface interface for a given IO service\nstatic IOUSBInterfaceInterface** GetInterfaceInterface(io_service_t interface)\n{\n    IOCFPlugInInterface **iodev;\n    IOUSBInterfaceInterface **intf;\n    IOReturn err;\n    SInt32 score;\n    \n    if ((IOCreatePlugInInterfaceForService(interface, kIOUSBInterfaceUserClientTypeID, kIOCFPlugInInterfaceID, &iodev, &score) == kIOReturnSuccess) && (iodev != NULL))\n    {\n        err = (*iodev)->QueryInterface(iodev, CFUUIDGetUUIDBytes(kIOUSBInterfaceInterfaceID), (LPVOID)&intf);\n        (*iodev)->Release(iodev);\n        if (err == kIOReturnSuccess)\n            return intf;\n    }\n    return NULL;\n}\n\n// List of interfaces we expect on a normal Microsoft controller\nconst struct {\n    int numEndpoints;\n    UInt8 classNum, subClassNum, protocolNum;\n} ControllerInterfaces[] = {\n//  Endpoints   Class   Subclass    Protocol\n    {2,         255,    93,         1},\n    {4,         255,    93,         3},\n    {1,         255,    93,         2},\n    {0,         255,    253,        19},\n};\n\n// Detect if an IO service object is a Microsoft controller by running through and checking some things\nstatic BOOL IsXBox360Controller(io_service_t device)\n{\n    IOUSBDeviceInterface **interface;\n    IOUSBFindInterfaceRequest iRq;\n    io_iterator_t iterator;\n    io_service_t devInterface;\n    IOUSBInterfaceInterface **interfaceInterface;\n    \n    int interfaceCount;\n    UInt8 interfaceNum, classNum, subClassNum, protocolNum, endpointCount;\n    \n    BOOL devValid;\n\n    // Get the interface to the device\n    interface = GetDeviceInterface(device);\n    if (interface == NULL)\n        return NO;\n    (*interface)->GetDeviceClass(interface, &classNum);\n    (*interface)->GetDeviceSubClass(interface, &subClassNum);\n    (*interface)->GetDeviceProtocol(interface, &protocolNum);\n    devValid = (classNum == 0xFF) && (subClassNum == 0xFF) && (protocolNum == 0xFF);\n    \n    // Search the interfaces\n    iRq.bInterfaceClass = kIOUSBFindInterfaceDontCare;\n    iRq.bInterfaceSubClass = kIOUSBFindInterfaceDontCare;\n    iRq.bInterfaceProtocol = kIOUSBFindInterfaceDontCare;\n    iRq.bAlternateSetting = kIOUSBFindInterfaceDontCare;\n    interfaceCount = 0;\n    if ((*interface)->CreateInterfaceIterator(interface, &iRq, &iterator) == kIOReturnSuccess)\n    {\n        while ((devInterface = IOIteratorNext(iterator)) != 0)\n        {\n            interfaceInterface = GetInterfaceInterface(devInterface);\n            if (interfaceInterface != NULL)\n            {\n                (*interfaceInterface)->GetInterfaceNumber(interfaceInterface, &interfaceNum);\n                (*interfaceInterface)->GetInterfaceClass(interfaceInterface, &classNum);\n                (*interfaceInterface)->GetInterfaceSubClass(interfaceInterface, &subClassNum);\n                (*interfaceInterface)->GetInterfaceProtocol(interfaceInterface, &protocolNum);\n                (*interfaceInterface)->GetNumEndpoints(interfaceInterface, &endpointCount);\n                if (interfaceNum < (sizeof(ControllerInterfaces) / sizeof(ControllerInterfaces[0])))\n                {\n                    if (\n                        (ControllerInterfaces[interfaceNum].classNum == classNum)\n                    &&\n                        (ControllerInterfaces[interfaceNum].subClassNum == subClassNum)\n                    &&\n                        (ControllerInterfaces[interfaceNum].protocolNum == protocolNum)\n                    &&\n                        (ControllerInterfaces[interfaceNum].numEndpoints == endpointCount)\n                       )\n                    {\n                        // Found another interface in the right place\n                        interfaceCount++;\n                    }\n                }\n                (*interfaceInterface)->Release(interfaceInterface);\n            }\n            IOObjectRelease(devInterface);\n        }\n        IOObjectRelease(iterator);\n    }\n    \n    // Done\n    (*interface)->Release(interface);\n    \n    return devValid && (interfaceCount >= 3);   // Only 3 in case the security descriptor is missing?\n}\n\n@implementation DeviceLister\n\n- init\n{\n    if (self = [super init])\n    {\n        entries = [[NSMutableDictionary dictionaryWithCapacity:10] retain];\n        connected = [[NSMutableArray arrayWithCapacity:10] retain];\n        enabled = [[NSMutableArray arrayWithCapacity:10] retain];\n    }\n    return self;\n}\n\n- (void)dealloc\n{\n    [entries release];\n    [connected release];\n    [enabled release];\n    [super dealloc];\n}\n\n- (NSString*)toolPath\n{\n    // Find the path of our tool in our bundle - should it be in the driver's bundle?\n    return [[[owner bundle] resourcePath] stringByAppendingPathComponent:TOOL_FILENAME];\n}\n\n- (OSStatus)writeToolWithAuthorisation:(AuthorizationRef)authorisationRef\n{\n    OSStatus result;\n    NSString *toolPath;\n    NSMutableArray *parameters;\n    const char **argv;\n    int i;\n    \n    toolPath = [self toolPath];\n    \n    // Build array of parameters\n    parameters = [NSMutableArray arrayWithCapacity:10];\n    [parameters addObject:@\"edit\"];\n    \n    for (NSNumber *key in enabled)\n    {\n        NSString *name = [entries objectForKey:key];\n        NSUInteger keyValue = [key unsignedIntValue];\n        UInt16 vendor = (keyValue >> 16) & 0xFFFF;\n        UInt16 product = keyValue & 0xFFFF;\n        [parameters addObject:name];\n        [parameters addObject:[NSString stringWithFormat:@\"%i\", vendor]];\n        [parameters addObject:[NSString stringWithFormat:@\"%i\", product]];\n    }\n    \n    // Convert parameters to a C array\n    argv = malloc(sizeof(char*) * ([parameters count] + 1));\n    i = 0;\n    for (NSString *item in parameters)\n        argv[i++] = [item UTF8String];\n    argv[i] = NULL;\n    \n    // Execute the command\n    result = AuthorizationExecuteWithPrivileges(authorisationRef,\n                                                [toolPath UTF8String],\n                                                kAuthorizationFlagDefaults,\n                                                (char**)argv,\n                                                NULL);\n    \n    // Done\n    free(argv);\n    return result;\n}\n\n- (NSString*)readTool\n{\n    NSTask *task;\n    NSPipe *pipe, *error;\n    NSData *data;\n    NSString *response;\n    NSArray *lines;\n    \n    // Prepare to run the tool\n    task = [[[NSTask alloc] init] autorelease];\n    [task setLaunchPath:[self toolPath]];\n    \n    // Hook up the pipe to catch the output\n    pipe = [NSPipe pipe];\n    [task setStandardOutput:pipe];\n    error = [NSPipe pipe];\n    [task setStandardError:error];\n    \n    // Run the tool\n    [task launch];\n    [task waitUntilExit];\n    \n    // Check result\n    if ([task terminationStatus] != 0)\n    {\n        data = [[error fileHandleForReading] readDataToEndOfFile];\n        return [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];\n    }\n    \n    // Read the data back\n    data = [[pipe fileHandleForReading] readDataToEndOfFile];\n    response = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];\n    \n    // Parse the results\n    lines = [response componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];\n    for (NSString *line in lines)\n    {\n        NSArray *values = [line componentsSeparatedByString:@\",\"];\n        if ([values count] != 3)\n            continue;\n        NSUInteger vendor = [[values objectAtIndex:1] intValue];\n        NSUInteger product = [[values objectAtIndex:2] intValue];\n        NSNumber *key = [NSNumber numberWithUnsignedInt:(int)((vendor << 16) | product)];\n        [enabled addObject:key];\n        if ([entries objectForKey:key] == nil)\n            [entries setObject:SanitiseName([values objectAtIndex:0]) forKey:key];\n    }\n    \n    return nil;\n}\n\n// Get the list of devices we've seen from the settings\n- (NSString*)readKnownDevices\n{\n    NSDictionary *known;\n    NSArray *keys;\n    \n    known = GetKnownDevices();\n    keys = [known allKeys];\n    for (NSNumber *key in keys)\n    {\n        if ([entries objectForKey:key] == nil)\n            [entries setObject:[known objectForKey:key] forKey:key];\n    }\n    return nil;\n}\n\n// Find any matching devices currently plugged in\n- (NSString*)readIOKit\n{\n    io_iterator_t iterator;\n    io_service_t object;\n    \n    iterator = 0;\n    IOServiceGetMatchingServices([owner masterPort], IOServiceMatching(kIOUSBDeviceClassName), &iterator);\n    if (iterator != 0)\n    {\n        while ((object = IOIteratorNext(iterator)) != 0)\n        {\n            if (IsXBox360Controller(object))\n            {\n                NSNumber *vendorValue, *productValue;\n                UInt16 vendor,product;\n                \n                vendorValue = GetDeviceValue(object, @\"idVendor\");\n                vendor = [vendorValue intValue];\n                \n                productValue = GetDeviceValue(object, @\"idProduct\");\n                product = [productValue intValue];\n                \n                if ((vendorValue != nil) && (productValue != nil))\n                {\n                    NSNumber *key;\n                    \n                    key = [NSNumber numberWithUnsignedInt:(vendor << 16) | product];\n                    [connected addObject:key];\n                    if ([entries objectForKey:key] == nil)\n                    {\n                        NSString *name = GetDeviceValue(object, @\"USB Product Name\");\n                        if (name == nil)\n                            name = [NSString stringWithFormat:@\"Unknown_%.4x_%.4x\", vendor, product];\n                        else\n                            name = SanitiseName(name);\n                        [entries setObject:name forKey:key];\n                    }\n                }\n            }\n            IOObjectRelease(object);\n        }\n        IOObjectRelease(iterator);\n    }\n    return nil;\n}\n\n- (void)showFailure:(NSString*)message\n{\n    NSAlert *alert = [NSAlert alertWithMessageText:nil\n                                     defaultButton:nil\n                                   alternateButton:nil\n                                       otherButton:nil\n                         informativeTextWithFormat:@\"%@\", message];\n    [alert runModal];\n}\n\n- (BOOL)loadDevices\n{\n    NSString *error;\n    \n    // Initialise\n    error = nil;\n    [entries removeAllObjects];\n    [connected removeAllObjects];\n    [enabled removeAllObjects];\n    \n    // These can be done in any order, depending on the behaviour desired\n    if (error == nil)\n        error = [self readKnownDevices];\n    if (error == nil)\n        error = [self readTool];\n    if (error == nil)\n        error = [self readIOKit];\n    \n    // Check for errors\n    if (error != nil)\n    {\n        [self showFailure:error];\n        return NO;\n    }\n    \n    // Done\n    SetKnownDevices(entries);\n    [list reloadData];\n    changed = NO;\n    return YES;\n}\n\n// attempt to authenticate so we can edit the driver's list of supported devices as root\n- (BOOL)trySave\n{\n    OSStatus status;\n    AuthorizationRef authorisationRef;\n    BOOL success = NO;\n    \n    status = AuthorizationCreate(NULL,\n                                 kAuthorizationEmptyEnvironment,\n                                 kAuthorizationFlagDefaults,\n                                 &authorisationRef);\n    if (status != errAuthorizationSuccess)\n    {\n        [self showFailure:NSLocalizedString(@\"Unable to create authorisation request\", @\"\")];\n        return NO;\n    }\n    \n    AuthorizationItem right = {kAuthorizationRightExecute, 0, NULL, 0};\n    AuthorizationRights rights = {1, &right};\n    status = AuthorizationCopyRights(authorisationRef,\n                                     &rights,\n                                     NULL,\n                                     kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | kAuthorizationFlagPreAuthorize | kAuthorizationFlagExtendRights,\n                                     NULL);\n    if (status != errAuthorizationSuccess)\n    {\n        [self showFailure:NSLocalizedString(@\"Unable to acquire authorisation\", @\"\")];\n        goto fail;\n    }\n    \n    status = [self writeToolWithAuthorisation:authorisationRef];\n    if (status != errAuthorizationSuccess)\n    {\n        [self showFailure:NSLocalizedString(@\"Failed to execute the driver tool\", @\"\")];\n        goto fail;\n    }\n    \n    success = YES;\n    \nfail:\n    AuthorizationFree(authorisationRef, kAuthorizationFlagDestroyRights);\n    return success;\n}\n\n- (void)showWithOwner:(Pref360ControlPref*)pane\n{\n    owner = pane;\n    if (![self loadDevices])\n        return;\n    [NSApp beginSheet:sheet\n       modalForWindow:[NSApp mainWindow]\n        modalDelegate:nil\n       didEndSelector:nil\n          contextInfo:NULL];\n}\n\n- (IBAction)done:(id)sender\n{\n    if (changed)\n        [self trySave];\n    [NSApp endSheet:sheet];\n    [sheet close];\n}\n\n// NSTableView data source\n\n- (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView\n{\n    return [entries count];\n}\n\n- (id)tableView:(NSTableView*)aTableView objectValueForTableColumn:(NSTableColumn*)aTableColumn row:(NSInteger)rowIndex\n{\n    NSString *identifier = [aTableColumn identifier];\n    NSString *key = [[entries allKeys] objectAtIndex:rowIndex];\n    if ([identifier compare:@\"enable\"] == NSOrderedSame)\n    {\n        return [NSNumber numberWithBool:[enabled containsObject:key]];\n    }\n    if ([identifier compare:@\"name\"] == NSOrderedSame)\n    {\n        NSColor *colour;\n        \n        if ([connected containsObject:key])\n            colour = [NSColor blueColor];\n        else\n            colour = [NSColor blackColor];\n        return [[[NSAttributedString alloc] initWithString:[entries objectForKey:key]\n                                                attributes:[NSDictionary dictionaryWithObject:colour forKey:NSForegroundColorAttributeName]] autorelease];\n    }\n    return nil;\n}\n\n- (void)tableView:(NSTableView*)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn*)aTableColumn row:(NSInteger)rowIndex\n{\n    if ([(NSString*)[aTableColumn identifier] compare:@\"enable\"] == NSOrderedSame)\n    {\n        NSString *key = [[entries allKeys] objectAtIndex:rowIndex];\n        BOOL contains = [enabled containsObject:key];\n        if ([(NSNumber*)anObject boolValue])\n        {\n            if (!contains)\n            {\n                [enabled addObject:key];\n                changed = YES;\n            }\n        }\n        else\n        {\n            if (contains)\n            {\n                [enabled removeObject:key];\n                changed = YES;\n            }\n        }\n\n    }\n}\n\n@end\n"
  },
  {
    "path": "Pref360Control/English.lproj/Pref360ControlPref.nib/designable.nib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<archive type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"8.00\">\n\t<data>\n\t\t<int key=\"IBDocument.SystemTarget\">1050</int>\n\t\t<string key=\"IBDocument.SystemVersion\">12C60</string>\n\t\t<string key=\"IBDocument.InterfaceBuilderVersion\">2844</string>\n\t\t<string key=\"IBDocument.AppKitVersion\">1187.34</string>\n\t\t<string key=\"IBDocument.HIToolboxVersion\">625.00</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginVersions\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t<string key=\"NS.object.0\">2844</string>\n\t\t</object>\n\t\t<array key=\"IBDocument.IntegratedClassDependencies\">\n\t\t\t<string>NSBox</string>\n\t\t\t<string>NSButton</string>\n\t\t\t<string>NSButtonCell</string>\n\t\t\t<string>NSCustomObject</string>\n\t\t\t<string>NSCustomView</string>\n\t\t\t<string>NSImageCell</string>\n\t\t\t<string>NSImageView</string>\n\t\t\t<string>NSMenu</string>\n\t\t\t<string>NSMenuItem</string>\n\t\t\t<string>NSPopUpButton</string>\n\t\t\t<string>NSPopUpButtonCell</string>\n\t\t\t<string>NSProgressIndicator</string>\n\t\t\t<string>NSScrollView</string>\n\t\t\t<string>NSScroller</string>\n\t\t\t<string>NSSlider</string>\n\t\t\t<string>NSSliderCell</string>\n\t\t\t<string>NSTableColumn</string>\n\t\t\t<string>NSTableView</string>\n\t\t\t<string>NSTextField</string>\n\t\t\t<string>NSTextFieldCell</string>\n\t\t\t<string>NSView</string>\n\t\t\t<string>NSWindowTemplate</string>\n\t\t</array>\n\t\t<array key=\"IBDocument.PluginDependencies\">\n\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t</array>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.Metadata\">\n\t\t\t<string key=\"NS.key.0\">PluginDependencyRecalculationVersion</string>\n\t\t\t<integer value=\"1\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<array class=\"NSMutableArray\" key=\"IBDocument.RootObjects\" id=\"1008938679\">\n\t\t\t<object class=\"NSCustomObject\" id=\"33196832\">\n\t\t\t\t<string key=\"NSClassName\">Pref360ControlPref</string>\n\t\t\t</object>\n\t\t\t<object class=\"NSCustomObject\" id=\"113153157\">\n\t\t\t\t<string key=\"NSClassName\">FirstResponder</string>\n\t\t\t</object>\n\t\t\t<object class=\"NSCustomObject\" id=\"475535432\">\n\t\t\t\t<string key=\"NSClassName\">NSApplication</string>\n\t\t\t</object>\n\t\t\t<object class=\"NSWindowTemplate\" id=\"871157433\">\n\t\t\t\t<int key=\"NSWindowStyleMask\">7</int>\n\t\t\t\t<int key=\"NSWindowBacking\">2</int>\n\t\t\t\t<string key=\"NSWindowRect\">{{240, 597}, {595, 304}}</string>\n\t\t\t\t<int key=\"NSWTFlags\">1081606144</int>\n\t\t\t\t<string key=\"NSWindowTitle\">&lt;&lt; do not localize &gt;&gt;</string>\n\t\t\t\t<string key=\"NSWindowClass\">NSWindow</string>\n\t\t\t\t<object class=\"NSMutableString\" key=\"NSViewClass\">\n\t\t\t\t\t<characters key=\"NS.bytes\">View</characters>\n\t\t\t\t</object>\n\t\t\t\t<nil key=\"NSUserInterfaceItemIdentifier\"/>\n\t\t\t\t<string key=\"NSWindowContentMinSize\">{595, 10}</string>\n\t\t\t\t<object class=\"NSView\" key=\"NSWindowView\" id=\"182693741\">\n\t\t\t\t\t<reference key=\"NSNextResponder\"/>\n\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t<array class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t\t<object class=\"NSPopUpButton\" id=\"306776851\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{107, 260}, {471, 26}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"594420181\"/>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"NSPopUpButtonCell\" key=\"NSCell\" id=\"561224349\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">-2076180416</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">2048</int>\n\t\t\t\t\t\t\t\t<object class=\"NSFont\" key=\"NSSupport\" id=\"855035077\">\n\t\t\t\t\t\t\t\t\t<string key=\"NSName\">LucidaGrande</string>\n\t\t\t\t\t\t\t\t\t<double key=\"NSSize\">13</double>\n\t\t\t\t\t\t\t\t\t<int key=\"NSfFlags\">1044</int>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"306776851\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">109199360</int>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">1</int>\n\t\t\t\t\t\t\t\t<object class=\"NSFont\" key=\"NSAlternateImage\">\n\t\t\t\t\t\t\t\t\t<string key=\"NSName\">LucidaGrande</string>\n\t\t\t\t\t\t\t\t\t<double key=\"NSSize\">13</double>\n\t\t\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<string key=\"NSAlternateContents\"/>\n\t\t\t\t\t\t\t\t<object class=\"NSMutableString\" key=\"NSKeyEquivalent\">\n\t\t\t\t\t\t\t\t\t<characters key=\"NS.bytes\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">400</int>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">75</int>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" key=\"NSMenuItem\" id=\"179303603\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"526947918\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Item1</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSState\">1</int>\n\t\t\t\t\t\t\t\t\t<object class=\"NSCustomResource\" key=\"NSOnImage\" id=\"417460925\">\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSClassName\">NSImage</string>\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSResourceName\">NSMenuCheckmark</string>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t<object class=\"NSCustomResource\" key=\"NSMixedImage\" id=\"542412254\">\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSClassName\">NSImage</string>\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSResourceName\">NSMenuMixedState</string>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t<string key=\"NSAction\">_popUpItemAction:</string>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSTarget\" ref=\"561224349\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<bool key=\"NSMenuItemRespectAlignment\">YES</bool>\n\t\t\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSMenu\" id=\"526947918\">\n\t\t\t\t\t\t\t\t\t<object class=\"NSMutableString\" key=\"NSTitle\">\n\t\t\t\t\t\t\t\t\t\t<characters key=\"NS.bytes\">OtherViews</characters>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t\t\t<reference ref=\"179303603\"/>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"176148628\">\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"526947918\"/>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Item2</string>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"417460925\"/>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"542412254\"/>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSAction\">_popUpItemAction:</string>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSTarget\" ref=\"561224349\"/>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"757433344\">\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"526947918\"/>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Item3</string>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"417460925\"/>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"542412254\"/>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSAction\">_popUpItemAction:</string>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSTarget\" ref=\"561224349\"/>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<int key=\"NSPreferredEdge\">3</int>\n\t\t\t\t\t\t\t\t<bool key=\"NSUsesItemFromMenu\">YES</bool>\n\t\t\t\t\t\t\t\t<bool key=\"NSAltersState\">YES</bool>\n\t\t\t\t\t\t\t\t<int key=\"NSArrowPosition\">1</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<bool key=\"NSAllowsLogicalLayoutDirection\">NO</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSTextField\" id=\"904887625\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{40, 266}, {65, 17}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"306776851\"/>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"NSTextFieldCell\" key=\"NSCell\" id=\"809746561\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67108864</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">71303168</int>\n\t\t\t\t\t\t\t\t<string type=\"base64-UTF8\" key=\"NSContents\">RGV2aWNlOgo</string>\n\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"855035077\"/>\n\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"904887625\"/>\n\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSBackgroundColor\" id=\"972077515\">\n\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">6</int>\n\t\t\t\t\t\t\t\t\t<string key=\"NSCatalogName\">System</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSColorName\">controlColor</string>\n\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSColor\" id=\"650170037\">\n\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MC42NjY2NjY2NjY3AA</bytes>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSTextColor\" id=\"787701499\">\n\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">6</int>\n\t\t\t\t\t\t\t\t\t<string key=\"NSCatalogName\">System</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSColorName\">controlTextColor</string>\n\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSColor\" id=\"823782827\">\n\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MAA</bytes>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<bool key=\"NSAllowsLogicalLayoutDirection\">NO</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSCustomView\" id=\"697093889\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{43, 117}, {77, 77}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"474618466\"/>\n\t\t\t\t\t\t\t<string key=\"NSClassName\">MyAnalogStick</string>\n\t\t\t\t\t\t\t<string key=\"NSExtension\">NSView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSCustomView\" id=\"831751290\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{123, 43}, {77, 77}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"259262025\"/>\n\t\t\t\t\t\t\t<string key=\"NSClassName\">MyDigitalStick</string>\n\t\t\t\t\t\t\t<string key=\"NSExtension\">NSView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSCustomView\" id=\"259262025\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{226, 43}, {77, 77}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"480509555\"/>\n\t\t\t\t\t\t\t<string key=\"NSClassName\">MyAnalogStick</string>\n\t\t\t\t\t\t\t<string key=\"NSExtension\">NSView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSCustomView\" id=\"480509555\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{306, 117}, {77, 77}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"528430124\"/>\n\t\t\t\t\t\t\t<string key=\"NSClassName\">MyMainButtons</string>\n\t\t\t\t\t\t\t<string key=\"NSExtension\">NSView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSCustomView\" id=\"507865753\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{151, 141}, {126, 39}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"417421942\"/>\n\t\t\t\t\t\t\t<string key=\"NSClassName\">MyCentreButtons</string>\n\t\t\t\t\t\t\t<string key=\"NSExtension\">NSView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSCustomView\" id=\"676721950\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{43, 202}, {77, 18}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"63088613\"/>\n\t\t\t\t\t\t\t<string key=\"NSClassName\">MyShoulderButton</string>\n\t\t\t\t\t\t\t<string key=\"NSExtension\">NSView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSCustomView\" id=\"63088613\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{306, 202}, {77, 18}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"82694390\"/>\n\t\t\t\t\t\t\t<string key=\"NSClassName\">MyShoulderButton</string>\n\t\t\t\t\t\t\t<string key=\"NSExtension\">NSView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSProgressIndicator\" id=\"594420181\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">1280</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{41, 224}, {161, 20}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"1050460036\"/>\n\t\t\t\t\t\t\t<int key=\"NSpiFlags\">16392</int>\n\t\t\t\t\t\t\t<double key=\"NSMaxValue\">255</double>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSProgressIndicator\" id=\"1050460036\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">1280</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{224, 224}, {161, 20}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"676721950\"/>\n\t\t\t\t\t\t\t<int key=\"NSpiFlags\">16392</int>\n\t\t\t\t\t\t\t<double key=\"NSMaxValue\">255</double>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSButton\" id=\"417421942\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{41, 93}, {71, 18}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"939084424\"/>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"NSButtonCell\" key=\"NSCell\" id=\"395906385\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67108864</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">0</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\">Invert X</string>\n\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"855035077\"/>\n\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"417421942\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">1211912448</int>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">2</int>\n\t\t\t\t\t\t\t\t<object class=\"NSButtonImageSource\" key=\"NSAlternateImage\" id=\"1040496536\">\n\t\t\t\t\t\t\t\t\t<string key=\"NSImageName\">NSSwitch</string>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<string key=\"NSAlternateContents\"/>\n\t\t\t\t\t\t\t\t<string key=\"NSKeyEquivalent\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">200</int>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">25</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<bool key=\"NSAllowsLogicalLayoutDirection\">NO</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSButton\" id=\"939084424\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{41, 73}, {71, 18}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"831751290\"/>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"NSButtonCell\" key=\"NSCell\" id=\"62132573\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67108864</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">0</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\">Invert Y</string>\n\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"855035077\"/>\n\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"939084424\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">1211912448</int>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">2</int>\n\t\t\t\t\t\t\t\t<reference key=\"NSAlternateImage\" ref=\"1040496536\"/>\n\t\t\t\t\t\t\t\t<string key=\"NSAlternateContents\"/>\n\t\t\t\t\t\t\t\t<string key=\"NSKeyEquivalent\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">200</int>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">25</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<bool key=\"NSAllowsLogicalLayoutDirection\">NO</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSButton\" id=\"528430124\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{309, 81}, {71, 18}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"476460571\"/>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"NSButtonCell\" key=\"NSCell\" id=\"212463309\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67108864</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">0</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\">Invert X</string>\n\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"855035077\"/>\n\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"528430124\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">1211912448</int>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">2</int>\n\t\t\t\t\t\t\t\t<reference key=\"NSAlternateImage\" ref=\"1040496536\"/>\n\t\t\t\t\t\t\t\t<string key=\"NSAlternateContents\"/>\n\t\t\t\t\t\t\t\t<string key=\"NSKeyEquivalent\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">200</int>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">25</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<bool key=\"NSAllowsLogicalLayoutDirection\">NO</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSButton\" id=\"489803090\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{309, 61}, {71, 18}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"546276811\"/>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"NSButtonCell\" key=\"NSCell\" id=\"942182196\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67108864</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">0</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\">Invert Y</string>\n\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"855035077\"/>\n\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"489803090\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">1211912448</int>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">2</int>\n\t\t\t\t\t\t\t\t<reference key=\"NSAlternateImage\" ref=\"1040496536\"/>\n\t\t\t\t\t\t\t\t<string key=\"NSAlternateContents\"/>\n\t\t\t\t\t\t\t\t<string key=\"NSKeyEquivalent\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">200</int>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">25</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<bool key=\"NSAllowsLogicalLayoutDirection\">NO</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSSlider\" id=\"1022723239\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{224, 16}, {161, 21}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"1012678591\"/>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"NSSliderCell\" key=\"NSCell\" id=\"984839922\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67108864</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">0</int>\n\t\t\t\t\t\t\t\t<object class=\"NSMutableString\" key=\"NSContents\">\n\t\t\t\t\t\t\t\t\t<characters key=\"NS.bytes\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSFont\" key=\"NSSupport\">\n\t\t\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica</string>\n\t\t\t\t\t\t\t\t\t<double key=\"NSSize\">12</double>\n\t\t\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"1022723239\"/>\n\t\t\t\t\t\t\t\t<double key=\"NSMaxValue\">32768</double>\n\t\t\t\t\t\t\t\t<double key=\"NSMinValue\">0.0</double>\n\t\t\t\t\t\t\t\t<double key=\"NSValue\">50</double>\n\t\t\t\t\t\t\t\t<double key=\"NSAltIncValue\">0.0</double>\n\t\t\t\t\t\t\t\t<int key=\"NSNumberOfTickMarks\">0</int>\n\t\t\t\t\t\t\t\t<int key=\"NSTickMarkPosition\">1</int>\n\t\t\t\t\t\t\t\t<bool key=\"NSAllowsTickMarkValuesOnly\">NO</bool>\n\t\t\t\t\t\t\t\t<bool key=\"NSVertical\">NO</bool>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<bool key=\"NSAllowsLogicalLayoutDirection\">NO</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSButton\" id=\"476460571\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{41, 53}, {64, 18}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"489803090\"/>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"NSButtonCell\" key=\"NSCell\" id=\"733036987\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67108864</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">0</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\">Linked</string>\n\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"855035077\"/>\n\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"476460571\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">1211912448</int>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">2</int>\n\t\t\t\t\t\t\t\t<reference key=\"NSAlternateImage\" ref=\"1040496536\"/>\n\t\t\t\t\t\t\t\t<string key=\"NSAlternateContents\"/>\n\t\t\t\t\t\t\t\t<string key=\"NSKeyEquivalent\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">200</int>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">25</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<bool key=\"NSAllowsLogicalLayoutDirection\">NO</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSButton\" id=\"546276811\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{309, 41}, {64, 18}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"931418527\"/>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"NSButtonCell\" key=\"NSCell\" id=\"973145854\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67108864</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">0</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\">Linked</string>\n\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"855035077\"/>\n\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"546276811\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">1211912448</int>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">2</int>\n\t\t\t\t\t\t\t\t<reference key=\"NSAlternateImage\" ref=\"1040496536\"/>\n\t\t\t\t\t\t\t\t<string key=\"NSAlternateContents\"/>\n\t\t\t\t\t\t\t\t<string key=\"NSKeyEquivalent\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">200</int>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">25</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<bool key=\"NSAllowsLogicalLayoutDirection\">NO</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSBox\" id=\"1012678591\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t\t\t\t<object class=\"NSView\" id=\"772377613\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"1012678591\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">274</int>\n\t\t\t\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextField\" id=\"864598614\">\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"772377613\"/>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{13, 193}, {153, 14}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"772377613\"/>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"24399355\"/>\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextFieldCell\" key=\"NSCell\" id=\"470400361\">\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67108864</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">272629760</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSContents\">Xbox 360 Controller Driver</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSFont\" key=\"NSSupport\" id=\"26\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSName\">LucidaGrande</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<double key=\"NSSize\">11</double>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSfFlags\">3100</int>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"864598614\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSBackgroundColor\" ref=\"972077515\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSTextColor\" ref=\"787701499\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSAllowsLogicalLayoutDirection\">NO</bool>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextField\" id=\"24399355\">\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"772377613\"/>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{13, 173}, {129, 17}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"772377613\"/>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"850481656\"/>\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextFieldCell\" key=\"NSCell\" id=\"26653717\">\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67108864</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">272629760</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSContents\">Version 0.12</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSFont\" key=\"NSSupport\" id=\"276746597\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSName\">LucidaGrande</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<double key=\"NSSize\">10</double>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSfFlags\">2843</int>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"24399355\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSBackgroundColor\" ref=\"972077515\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSTextColor\" ref=\"787701499\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSAllowsLogicalLayoutDirection\">NO</bool>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextField\" id=\"850481656\">\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"772377613\"/>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{13, 157}, {129, 17}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"772377613\"/>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"786708842\"/>\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextFieldCell\" key=\"NSCell\" id=\"1039916014\">\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67108864</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">272629760</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSContents\">(C) 2006-13 Colin Munro</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"276746597\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"850481656\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSBackgroundColor\" ref=\"972077515\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSTextColor\" ref=\"787701499\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSAllowsLogicalLayoutDirection\">NO</bool>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextField\" id=\"786708842\">\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"772377613\"/>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{10, 138}, {129, 14}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"772377613\"/>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"924246914\"/>\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextFieldCell\" key=\"NSCell\" id=\"202714468\">\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">69206017</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">272629760</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSContents\">http://tattiebogle.net/</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"26\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"786708842\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSBackgroundColor\" ref=\"972077515\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSTextColor\" ref=\"787701499\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSAllowsLogicalLayoutDirection\">NO</bool>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextField\" id=\"924246914\">\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"772377613\"/>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{10, 116}, {153, 14}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"772377613\"/>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"564381582\"/>\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextFieldCell\" key=\"NSCell\" id=\"59849550\">\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">69206017</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">272629760</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSContents\">http://mice-software.com/</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"26\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"924246914\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSBackgroundColor\" ref=\"972077515\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSTextColor\" ref=\"787701499\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSAllowsLogicalLayoutDirection\">NO</bool>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextField\" id=\"564381582\">\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"772377613\"/>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{13, 11}, {150, 97}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"772377613\"/>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextFieldCell\" key=\"NSCell\" id=\"837329624\">\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67108864</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">272629760</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<string type=\"base64-UTF8\" key=\"NSContents\">Rm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBkcml2ZXIsIHBsZWFzZSBzZWUgdGhlIHN1cHBsaWVk\nIFJlYWRtZSBhbmQgTGljZW5jZSBkb2N1bWVudHMuCgpQbGVhc2UgY29uc2lkZXIgZG9uYXRpbmcgaWYg\neW91IGVuam95IHRoaXMgZHJpdmVyIQ</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"276746597\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"564381582\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSBackgroundColor\" ref=\"972077515\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSTextColor\" ref=\"787701499\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSAllowsLogicalLayoutDirection\">NO</bool>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{2, 2}, {179, 218}}</string>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"1012678591\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"864598614\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{395, 16}, {183, 235}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"772377613\"/>\n\t\t\t\t\t\t\t<string key=\"NSOffsets\">{0, 0}</string>\n\t\t\t\t\t\t\t<object class=\"NSTextFieldCell\" key=\"NSTitleCell\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67108864</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">0</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\">About</string>\n\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"26\"/>\n\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSBackgroundColor\">\n\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">6</int>\n\t\t\t\t\t\t\t\t\t<string key=\"NSCatalogName\">System</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSColorName\">textBackgroundColor</string>\n\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSColor\" id=\"240678025\">\n\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MQA</bytes>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSTextColor\">\n\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MCAwLjgwMDAwMDAxMTkAA</bytes>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<reference key=\"NSContentView\" ref=\"772377613\"/>\n\t\t\t\t\t\t\t<int key=\"NSBorderType\">3</int>\n\t\t\t\t\t\t\t<int key=\"NSBoxType\">0</int>\n\t\t\t\t\t\t\t<int key=\"NSTitlePosition\">2</int>\n\t\t\t\t\t\t\t<bool key=\"NSTransparent\">NO</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSImageView\" id=\"474618466\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t<set class=\"NSMutableSet\" key=\"NSDragTypes\">\n\t\t\t\t\t\t\t\t<string>Apple PDF pasteboard type</string>\n\t\t\t\t\t\t\t\t<string>Apple PICT pasteboard type</string>\n\t\t\t\t\t\t\t\t<string>Apple PNG pasteboard type</string>\n\t\t\t\t\t\t\t\t<string>NSFilenamesPboardType</string>\n\t\t\t\t\t\t\t\t<string>NeXT Encapsulated PostScript v1.2 pasteboard type</string>\n\t\t\t\t\t\t\t\t<string>NeXT TIFF v4.0 pasteboard type</string>\n\t\t\t\t\t\t\t</set>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{197, 190}, {32, 24}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"507865753\"/>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"NSImageCell\" key=\"NSCell\" id=\"698797599\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">134217728</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">33554432</int>\n\t\t\t\t\t\t\t\t<object class=\"NSCustomResource\" key=\"NSContents\">\n\t\t\t\t\t\t\t\t\t<string key=\"NSClassName\">NSImage</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSResourceName\">battNone</string>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<int key=\"NSAlign\">0</int>\n\t\t\t\t\t\t\t\t<int key=\"NSScale\">1</int>\n\t\t\t\t\t\t\t\t<int key=\"NSStyle\">0</int>\n\t\t\t\t\t\t\t\t<bool key=\"NSAnimates\">YES</bool>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<bool key=\"NSAllowsLogicalLayoutDirection\">NO</bool>\n\t\t\t\t\t\t\t<bool key=\"NSEditable\">YES</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSSlider\" id=\"82694390\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">268</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{17, 40}, {21, 156}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"697093889\"/>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"NSSliderCell\" key=\"NSCell\" id=\"1025201993\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67108864</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">0</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\"/>\n\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"82694390\"/>\n\t\t\t\t\t\t\t\t<double key=\"NSMaxValue\">32768</double>\n\t\t\t\t\t\t\t\t<double key=\"NSMinValue\">0.0</double>\n\t\t\t\t\t\t\t\t<double key=\"NSValue\">50</double>\n\t\t\t\t\t\t\t\t<double key=\"NSAltIncValue\">0.0</double>\n\t\t\t\t\t\t\t\t<int key=\"NSNumberOfTickMarks\">0</int>\n\t\t\t\t\t\t\t\t<int key=\"NSTickMarkPosition\">0</int>\n\t\t\t\t\t\t\t\t<bool key=\"NSAllowsTickMarkValuesOnly\">NO</bool>\n\t\t\t\t\t\t\t\t<bool key=\"NSVertical\">YES</bool>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<bool key=\"NSAllowsLogicalLayoutDirection\">NO</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSButton\" id=\"496590417\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">-2147483380</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{8, 254}, {39, 38}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"904887625\"/>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"NSButtonCell\" key=\"NSCell\" id=\"856908081\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67108864</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">134217728</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\">+</string>\n\t\t\t\t\t\t\t\t<object class=\"NSFont\" key=\"NSSupport\">\n\t\t\t\t\t\t\t\t\t<string key=\"NSName\">LucidaGrande</string>\n\t\t\t\t\t\t\t\t\t<double key=\"NSSize\">18</double>\n\t\t\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"496590417\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">-2034499584</int>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">7</int>\n\t\t\t\t\t\t\t\t<string key=\"NSAlternateContents\"/>\n\t\t\t\t\t\t\t\t<string key=\"NSKeyEquivalent\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">200</int>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">25</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<bool key=\"NSAllowsLogicalLayoutDirection\">NO</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSButton\" id=\"931418527\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">-2147483380</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{62, 9}, {118, 32}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"182693741\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"1022723239\"/>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"NSButtonCell\" key=\"NSCell\" id=\"158692514\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67108864</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">134217728</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\">Power off</string>\n\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"855035077\"/>\n\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"931418527\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">-2038284288</int>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">129</int>\n\t\t\t\t\t\t\t\t<string key=\"NSAlternateContents\"/>\n\t\t\t\t\t\t\t\t<string key=\"NSKeyEquivalent\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">200</int>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">25</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<bool key=\"NSAllowsLogicalLayoutDirection\">NO</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</array>\n\t\t\t\t\t<string key=\"NSFrameSize\">{595, 304}</string>\n\t\t\t\t\t<reference key=\"NSSuperview\"/>\n\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"496590417\"/>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"NSScreenRect\">{{0, 0}, {1280, 1002}}</string>\n\t\t\t\t<string key=\"NSMinSize\">{595, 32}</string>\n\t\t\t\t<string key=\"NSMaxSize\">{10000000000000, 10000000000000}</string>\n\t\t\t\t<bool key=\"NSWindowIsRestorable\">YES</bool>\n\t\t\t</object>\n\t\t\t<object class=\"NSWindowTemplate\" id=\"903541117\">\n\t\t\t\t<int key=\"NSWindowStyleMask\">15</int>\n\t\t\t\t<int key=\"NSWindowBacking\">2</int>\n\t\t\t\t<string key=\"NSWindowRect\">{{131, 166}, {519, 336}}</string>\n\t\t\t\t<int key=\"NSWTFlags\">1685585920</int>\n\t\t\t\t<string key=\"NSWindowTitle\">Window</string>\n\t\t\t\t<string key=\"NSWindowClass\">NSWindow</string>\n\t\t\t\t<nil key=\"NSViewClass\"/>\n\t\t\t\t<nil key=\"NSUserInterfaceItemIdentifier\"/>\n\t\t\t\t<string key=\"NSWindowContentMinSize\">{490, 150}</string>\n\t\t\t\t<object class=\"NSView\" key=\"NSWindowView\" id=\"810235426\">\n\t\t\t\t\t<nil key=\"NSNextResponder\"/>\n\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t<array class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t\t<object class=\"NSScrollView\" id=\"45914786\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"810235426\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">274</int>\n\t\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t\t\t\t<object class=\"NSClipView\" id=\"312259412\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"45914786\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">2304</int>\n\t\t\t\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSTableView\" id=\"175461146\">\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"312259412\"/>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSFrameSize\">{477, 229}</string>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"312259412\"/>\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSAllowsLogicalLayoutDirection\">NO</bool>\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSControlAllowsExpansionToolTips\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"_NSCornerView\" key=\"NSCornerView\">\n\t\t\t\t\t\t\t\t\t\t\t\t<nil key=\"NSNextResponder\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">-2147483392</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{224, 0}, {16, 17}}</string>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"NSTableColumns\">\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTableColumn\" id=\"210023524\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSIdentifier\">enable</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<double key=\"NSWidth\">20</double>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<double key=\"NSMinWidth\">20</double>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<double key=\"NSMaxWidth\">20</double>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTableHeaderCell\" key=\"NSHeaderCell\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">75497536</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">2048</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSContents\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"26\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSBackgroundColor\" id=\"1061957366\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MC4zMzMzMzI5ODU2AA</bytes>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSTextColor\" id=\"755935030\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">6</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSCatalogName\">System</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSColorName\">headerTextColor</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSColor\" ref=\"823782827\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSButtonCell\" key=\"NSDataCell\" id=\"342903531\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67108864</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">131072</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSContents\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"26\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"175461146\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">1211912448</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">2</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSCustomResource\" key=\"NSNormalImage\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSClassName\">NSImage</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSResourceName\">NSSwitch</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSAlternateImage\" ref=\"1040496536\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSAlternateContents\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquivalent\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">200</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">25</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSResizingMask\">1</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSIsResizeable\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSIsEditable\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSTableView\" ref=\"175461146\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTableColumn\" id=\"560496734\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSIdentifier\">name</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<double key=\"NSWidth\">451</double>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<double key=\"NSMinWidth\">40</double>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<double key=\"NSMaxWidth\">1000</double>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTableHeaderCell\" key=\"NSHeaderCell\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">75497536</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">2048</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSContents\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"26\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSBackgroundColor\" ref=\"1061957366\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSTextColor\" ref=\"755935030\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextFieldCell\" key=\"NSDataCell\" id=\"159210440\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">337641536</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">2048</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSContents\">Text Cell</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"855035077\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"175461146\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSBackgroundColor\" id=\"544551164\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">6</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSCatalogName\">System</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSColorName\">controlBackgroundColor</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSColor\" ref=\"650170037\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSTextColor\" ref=\"787701499\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSResizingMask\">1</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSIsResizeable\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSTableView\" ref=\"175461146\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t\t\t<double key=\"NSIntercellSpacingWidth\">3</double>\n\t\t\t\t\t\t\t\t\t\t\t<double key=\"NSIntercellSpacingHeight\">2</double>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSBackgroundColor\" ref=\"240678025\"/>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSGridColor\">\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">6</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSCatalogName\">System</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSColorName\">gridColor</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSColor\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MC41AA</bytes>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<double key=\"NSRowHeight\">17</double>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSTvFlags\">-700448768</int>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSDelegate\"/>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSDataSource\"/>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSColumnAutoresizingStyle\">4</int>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSDraggingSourceMaskForLocal\">15</int>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSDraggingSourceMaskForNonLocal\">0</int>\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSAllowsTypeSelect\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSTableViewDraggingDestinationStyle\">0</int>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSTableViewGroupRowStyle\">1</int>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{1, 1}, {477, 229}}</string>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"45914786\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"175461146\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSDocView\" ref=\"175461146\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSBGColor\" ref=\"544551164\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NScvFlags\">4</int>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSScroller\" id=\"101532416\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"45914786\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">-2147483392</int>\n\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{224, 17}, {15, 102}}</string>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"45914786\"/>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSAllowsLogicalLayoutDirection\">NO</bool>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSTarget\" ref=\"45914786\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSAction\">_doScroller:</string>\n\t\t\t\t\t\t\t\t\t<double key=\"NSPercent\">0.9925373134328358</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSScroller\" id=\"573989040\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"45914786\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">-2147483392</int>\n\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{-100, -100}, {223, 15}}</string>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"45914786\"/>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSAllowsLogicalLayoutDirection\">NO</bool>\n\t\t\t\t\t\t\t\t\t<int key=\"NSsFlags\">1</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSTarget\" ref=\"45914786\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSAction\">_doScroller:</string>\n\t\t\t\t\t\t\t\t\t<double key=\"NSPercent\">0.57142859697341919</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 60}, {479, 231}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"810235426\"/>\n\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"312259412\"/>\n\t\t\t\t\t\t\t<int key=\"NSsFlags\">133650</int>\n\t\t\t\t\t\t\t<reference key=\"NSVScroller\" ref=\"101532416\"/>\n\t\t\t\t\t\t\t<reference key=\"NSHScroller\" ref=\"573989040\"/>\n\t\t\t\t\t\t\t<reference key=\"NSContentView\" ref=\"312259412\"/>\n\t\t\t\t\t\t\t<bytes key=\"NSScrollAmts\">QSAAAEEgAABBmAAAQZgAAA</bytes>\n\t\t\t\t\t\t\t<double key=\"NSMinMagnification\">0.25</double>\n\t\t\t\t\t\t\t<double key=\"NSMaxMagnification\">4</double>\n\t\t\t\t\t\t\t<double key=\"NSMagnification\">1</double>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSTextField\" id=\"43841333\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"810235426\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">268</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{17, 299}, {355, 17}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"810235426\"/>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"NSTextFieldCell\" key=\"NSCell\" id=\"533177015\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">68157504</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">272630784</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\">Select the devices you would like to use with the driver:</string>\n\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"855035077\"/>\n\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"43841333\"/>\n\t\t\t\t\t\t\t\t<reference key=\"NSBackgroundColor\" ref=\"972077515\"/>\n\t\t\t\t\t\t\t\t<reference key=\"NSTextColor\" ref=\"787701499\"/>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<bool key=\"NSAllowsLogicalLayoutDirection\">NO</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSButton\" id=\"467583346\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"810235426\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">289</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{409, 12}, {96, 32}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"810235426\"/>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"NSButtonCell\" key=\"NSCell\" id=\"21032511\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67108864</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">134217728</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\">Done</string>\n\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"855035077\"/>\n\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"467583346\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">-2038284288</int>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">129</int>\n\t\t\t\t\t\t\t\t<string key=\"NSAlternateContents\"/>\n\t\t\t\t\t\t\t\t<string key=\"NSKeyEquivalent\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">200</int>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">25</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<bool key=\"NSAllowsLogicalLayoutDirection\">NO</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSTextField\" id=\"487488822\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"810235426\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{17, 16}, {323, 28}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"810235426\"/>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"NSTextFieldCell\" key=\"NSCell\" id=\"492667372\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">68157504</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">272630784</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\">To save changes to this list, you must enter your password. A restart will be required for changes to take effect.</string>\n\t\t\t\t\t\t\t\t<object class=\"NSFont\" key=\"NSSupport\">\n\t\t\t\t\t\t\t\t\t<string key=\"NSName\">LucidaGrande</string>\n\t\t\t\t\t\t\t\t\t<double key=\"NSSize\">11</double>\n\t\t\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"487488822\"/>\n\t\t\t\t\t\t\t\t<reference key=\"NSBackgroundColor\" ref=\"972077515\"/>\n\t\t\t\t\t\t\t\t<reference key=\"NSTextColor\" ref=\"787701499\"/>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<bool key=\"NSAllowsLogicalLayoutDirection\">NO</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</array>\n\t\t\t\t\t<string key=\"NSFrameSize\">{519, 336}</string>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"NSScreenRect\">{{0, 0}, {1280, 1002}}</string>\n\t\t\t\t<string key=\"NSMinSize\">{490, 172}</string>\n\t\t\t\t<string key=\"NSMaxSize\">{10000000000000, 10000000000000}</string>\n\t\t\t\t<bool key=\"NSWindowIsRestorable\">YES</bool>\n\t\t\t</object>\n\t\t\t<object class=\"NSCustomObject\" id=\"109043079\">\n\t\t\t\t<string key=\"NSClassName\">DeviceLister</string>\n\t\t\t</object>\n\t\t</array>\n\t\t<object class=\"IBObjectContainer\" key=\"IBDocument.Objects\">\n\t\t\t<array class=\"NSMutableArray\" key=\"connectionRecords\">\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_window</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"871157433\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">26</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">leftStickInvertY</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"939084424\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">127</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">rightStickInvertX</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"528430124\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">128</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">rightStickInvertY</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"489803090\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">129</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">deviceList</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"306776851\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">130</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">rightStickDeadzone</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"1022723239\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">134</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">rightStick</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"259262025\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">136</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">leftTrigger</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"594420181\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">137</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">rightTrigger</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"1050460036\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">138</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">leftShoulder</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"676721950\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">139</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">rightShoulder</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"63088613\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">140</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">digiStick</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"831751290\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">141</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">centreButtons</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"507865753\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">142</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">rightButtons</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"480509555\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">143</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">leftStick</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"697093889\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">144</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">leftStickInvertX</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"417421942\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">145</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">selectDevice:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"306776851\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">146</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">changeSetting:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"1022723239\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">151</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">changeSetting:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"417421942\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">152</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">changeSetting:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"939084424\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">153</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">changeSetting:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"528430124\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">154</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">changeSetting:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"489803090\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">155</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">leftLinked</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"476460571\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">169</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">rightLinked</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"546276811\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">170</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">changeSetting:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"476460571\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">171</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">changeSetting:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"546276811\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">172</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">batteryLevel</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"474618466\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">175</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">changeSetting:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"82694390\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">196</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">leftStickDeadzone</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"82694390\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">197</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">showDeviceList:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"496590417\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">220</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">deviceLister</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"109043079\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">226</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">powerOff:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"931418527\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">229</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">powerOff</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"931418527\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">230</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">dataSource</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"175461146\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"109043079\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">225</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">done:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"109043079\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"467583346\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">222</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">sheet</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"109043079\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"903541117\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">223</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">list</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"109043079\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"175461146\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">224</int>\n\t\t\t\t</object>\n\t\t\t</array>\n\t\t\t<object class=\"IBMutableOrderedSet\" key=\"objectRecords\">\n\t\t\t\t<array key=\"orderedObjects\">\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">0</int>\n\t\t\t\t\t\t<array key=\"object\" id=\"0\"/>\n\t\t\t\t\t\t<reference key=\"children\" ref=\"1008938679\"/>\n\t\t\t\t\t\t<nil key=\"parent\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"33196832\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">File's Owner</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"113153157\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">First Responder</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">12</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"871157433\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"182693741\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">PrefPane</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">6</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"182693741\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"306776851\"/>\n\t\t\t\t\t\t\t<reference ref=\"904887625\"/>\n\t\t\t\t\t\t\t<reference ref=\"697093889\"/>\n\t\t\t\t\t\t\t<reference ref=\"831751290\"/>\n\t\t\t\t\t\t\t<reference ref=\"259262025\"/>\n\t\t\t\t\t\t\t<reference ref=\"480509555\"/>\n\t\t\t\t\t\t\t<reference ref=\"507865753\"/>\n\t\t\t\t\t\t\t<reference ref=\"676721950\"/>\n\t\t\t\t\t\t\t<reference ref=\"63088613\"/>\n\t\t\t\t\t\t\t<reference ref=\"594420181\"/>\n\t\t\t\t\t\t\t<reference ref=\"1050460036\"/>\n\t\t\t\t\t\t\t<reference ref=\"417421942\"/>\n\t\t\t\t\t\t\t<reference ref=\"939084424\"/>\n\t\t\t\t\t\t\t<reference ref=\"528430124\"/>\n\t\t\t\t\t\t\t<reference ref=\"489803090\"/>\n\t\t\t\t\t\t\t<reference ref=\"1022723239\"/>\n\t\t\t\t\t\t\t<reference ref=\"476460571\"/>\n\t\t\t\t\t\t\t<reference ref=\"546276811\"/>\n\t\t\t\t\t\t\t<reference ref=\"1012678591\"/>\n\t\t\t\t\t\t\t<reference ref=\"474618466\"/>\n\t\t\t\t\t\t\t<reference ref=\"82694390\"/>\n\t\t\t\t\t\t\t<reference ref=\"496590417\"/>\n\t\t\t\t\t\t\t<reference ref=\"931418527\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"871157433\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">98</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"306776851\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"561224349\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"182693741\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">103</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"904887625\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"809746561\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"182693741\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">104</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"697093889\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"182693741\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">105</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"831751290\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"182693741\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">106</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"259262025\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"182693741\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">107</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"480509555\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"182693741\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">108</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"507865753\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"182693741\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">109</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"676721950\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"182693741\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">110</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"63088613\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"182693741\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">111</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"594420181\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"182693741\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">112</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1050460036\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"182693741\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">114</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"417421942\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"395906385\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"182693741\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">115</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"939084424\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"62132573\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"182693741\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">116</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"528430124\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"212463309\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"182693741\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">117</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"489803090\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"942182196\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"182693741\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">120</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1022723239\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"984839922\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"182693741\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">156</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"476460571\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"733036987\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"182693741\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">157</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"546276811\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"973145854\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"182693741\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">158</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1012678591\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"864598614\"/>\n\t\t\t\t\t\t\t<reference ref=\"24399355\"/>\n\t\t\t\t\t\t\t<reference ref=\"850481656\"/>\n\t\t\t\t\t\t\t<reference ref=\"786708842\"/>\n\t\t\t\t\t\t\t<reference ref=\"924246914\"/>\n\t\t\t\t\t\t\t<reference ref=\"564381582\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"182693741\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">174</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"474618466\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"698797599\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"182693741\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">177</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"561224349\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"526947918\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"306776851\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">178</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"809746561\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"904887625\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">179</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"395906385\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"417421942\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">180</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"62132573\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"939084424\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">181</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"212463309\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"528430124\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">182</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"942182196\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"489803090\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">184</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"984839922\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1022723239\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">185</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"733036987\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"476460571\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">186</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"973145854\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"546276811\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">193</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"698797599\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"474618466\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">99</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"526947918\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"757433344\"/>\n\t\t\t\t\t\t\t<reference ref=\"179303603\"/>\n\t\t\t\t\t\t\t<reference ref=\"176148628\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"561224349\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">102</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"757433344\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"526947918\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">101</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"179303603\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"526947918\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">100</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"176148628\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"526947918\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-3</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"475535432\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">Application</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">161</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"864598614\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"470400361\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1012678591\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">187</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"470400361\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"864598614\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">163</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"24399355\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"26653717\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1012678591\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">188</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"26653717\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"24399355\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">165</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"850481656\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"1039916014\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1012678591\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">189</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1039916014\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"850481656\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">166</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"786708842\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"202714468\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1012678591\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">190</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"202714468\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"786708842\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">167</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"924246914\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"59849550\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1012678591\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">191</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"59849550\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"924246914\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">168</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"564381582\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"837329624\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1012678591\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">192</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"837329624\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"564381582\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">194</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"82694390\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"1025201993\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"182693741\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">195</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1025201993\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"82694390\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">198</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"496590417\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"856908081\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"182693741\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">199</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"856908081\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"496590417\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">200</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"903541117\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"810235426\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">DeviceSheet</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">201</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"810235426\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"43841333\"/>\n\t\t\t\t\t\t\t<reference ref=\"467583346\"/>\n\t\t\t\t\t\t\t<reference ref=\"487488822\"/>\n\t\t\t\t\t\t\t<reference ref=\"45914786\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"903541117\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">202</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"45914786\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"101532416\"/>\n\t\t\t\t\t\t\t<reference ref=\"573989040\"/>\n\t\t\t\t\t\t\t<reference ref=\"175461146\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"810235426\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">203</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"101532416\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"45914786\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">204</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"573989040\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"45914786\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">205</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"175461146\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"210023524\"/>\n\t\t\t\t\t\t\t<reference ref=\"560496734\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"45914786\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">207</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"210023524\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"342903531\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"175461146\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">208</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"560496734\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"159210440\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"175461146\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">209</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"159210440\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"560496734\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">211</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"342903531\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"210023524\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">214</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"43841333\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"533177015\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"810235426\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">215</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"533177015\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"43841333\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">216</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"467583346\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"21032511\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"810235426\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">217</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"21032511\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"467583346\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">218</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"487488822\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"492667372\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"810235426\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">219</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"492667372\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"487488822\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">221</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"109043079\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">227</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"931418527\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"158692514\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"182693741\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">228</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"158692514\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"931418527\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</array>\n\t\t\t</object>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"flattenedProperties\">\n\t\t\t\t<string key=\"-1.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"-2.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"-3.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"100.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"101.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"102.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"103.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"104.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"105.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"106.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"107.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"108.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"109.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"110.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"111.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"112.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"114.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"115.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"116.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"117.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"12.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"12.IBWindowTemplateEditedContentRect\">{{326, 482}, {595, 304}}</string>\n\t\t\t\t<string key=\"120.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"156.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"157.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"158.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"161.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"163.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"165.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"166.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"167.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"168.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"174.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"177.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"178.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"179.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"180.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"181.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"182.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"184.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"185.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"186.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"187.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"188.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"189.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"190.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"191.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"192.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"193.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"194.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"195.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"198.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"199.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"200.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"200.IBWindowTemplateEditedContentRect\">{{349, 211}, {519, 336}}</string>\n\t\t\t\t<boolean value=\"NO\" key=\"200.NSWindowTemplate.visibleAtLaunch\"/>\n\t\t\t\t<string key=\"201.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"202.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"203.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"204.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"205.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"207.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"208.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"209.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"211.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"214.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"215.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"216.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"217.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"218.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"219.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"221.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"227.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"228.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"6.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"98.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t<string key=\"99.IBPluginDependency\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t</dictionary>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"unlocalizedProperties\"/>\n\t\t\t<nil key=\"activeLocalization\"/>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"localizations\"/>\n\t\t\t<nil key=\"sourceID\"/>\n\t\t\t<int key=\"maxID\">230</int>\n\t\t</object>\n\t\t<object class=\"IBClassDescriber\" key=\"IBDocument.Classes\">\n\t\t\t<array class=\"NSMutableArray\" key=\"referencedPartialClassDescriptions\">\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">DeviceLister</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"actions\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">done:</string>\n\t\t\t\t\t\t<string key=\"NS.object.0\">id</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"actionInfosByName\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">done:</string>\n\t\t\t\t\t\t<object class=\"IBActionInfo\" key=\"NS.object.0\">\n\t\t\t\t\t\t\t<string key=\"name\">done:</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">id</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<string key=\"list\">NSTableView</string>\n\t\t\t\t\t\t<string key=\"sheet\">NSWindow</string>\n\t\t\t\t\t</dictionary>\n\t\t\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"toOneOutletInfosByName\">\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"list\">\n\t\t\t\t\t\t\t<string key=\"name\">list</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">NSTableView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"sheet\">\n\t\t\t\t\t\t\t<string key=\"name\">sheet</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">NSWindow</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</dictionary>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/DeviceLister.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">MyAnalogStick</string>\n\t\t\t\t\t<string key=\"superclassName\">NSView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/MyAnalogStick.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">MyCentreButtons</string>\n\t\t\t\t\t<string key=\"superclassName\">NSView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/MyCentreButtons.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">MyDigitalStick</string>\n\t\t\t\t\t<string key=\"superclassName\">NSView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/MyDigitalStick.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">MyMainButtons</string>\n\t\t\t\t\t<string key=\"superclassName\">NSView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/MyMainButtons.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">MyShoulderButton</string>\n\t\t\t\t\t<string key=\"superclassName\">NSView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/MyShoulderButton.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSPreferencePane</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<string key=\"_firstKeyView\">NSView</string>\n\t\t\t\t\t\t<string key=\"_initialKeyView\">NSView</string>\n\t\t\t\t\t\t<string key=\"_lastKeyView\">NSView</string>\n\t\t\t\t\t\t<string key=\"_window\">NSWindow</string>\n\t\t\t\t\t</dictionary>\n\t\t\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"toOneOutletInfosByName\">\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"_firstKeyView\">\n\t\t\t\t\t\t\t<string key=\"name\">_firstKeyView</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">NSView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"_initialKeyView\">\n\t\t\t\t\t\t\t<string key=\"name\">_initialKeyView</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">NSView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"_lastKeyView\">\n\t\t\t\t\t\t\t<string key=\"name\">_lastKeyView</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">NSView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"_window\">\n\t\t\t\t\t\t\t<string key=\"name\">_window</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">NSWindow</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</dictionary>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/NSPreferencePane.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">Pref360ControlPref</string>\n\t\t\t\t\t<string key=\"superclassName\">NSPreferencePane</string>\n\t\t\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"actions\">\n\t\t\t\t\t\t<string key=\"powerOff:\">id</string>\n\t\t\t\t\t\t<string key=\"showDeviceList:\">id</string>\n\t\t\t\t\t</dictionary>\n\t\t\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"actionInfosByName\">\n\t\t\t\t\t\t<object class=\"IBActionInfo\" key=\"powerOff:\">\n\t\t\t\t\t\t\t<string key=\"name\">powerOff:</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">id</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBActionInfo\" key=\"showDeviceList:\">\n\t\t\t\t\t\t\t<string key=\"name\">showDeviceList:</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">id</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</dictionary>\n\t\t\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<string key=\"batteryLevel\">NSImageView</string>\n\t\t\t\t\t\t<string key=\"centreButtons\">MyCentreButtons</string>\n\t\t\t\t\t\t<string key=\"deviceList\">NSPopUpButton</string>\n\t\t\t\t\t\t<string key=\"deviceLister\">DeviceLister</string>\n\t\t\t\t\t\t<string key=\"digiStick\">MyDigitalStick</string>\n\t\t\t\t\t\t<string key=\"leftLinked\">NSButton</string>\n\t\t\t\t\t\t<string key=\"leftShoulder\">MyShoulderButton</string>\n\t\t\t\t\t\t<string key=\"leftStick\">MyAnalogStick</string>\n\t\t\t\t\t\t<string key=\"leftStickDeadzone\">NSSlider</string>\n\t\t\t\t\t\t<string key=\"leftStickInvertX\">NSButton</string>\n\t\t\t\t\t\t<string key=\"leftStickInvertY\">NSButton</string>\n\t\t\t\t\t\t<string key=\"leftTrigger\">NSProgressIndicator</string>\n\t\t\t\t\t\t<string key=\"powerOff\">NSButton</string>\n\t\t\t\t\t\t<string key=\"rightButtons\">MyMainButtons</string>\n\t\t\t\t\t\t<string key=\"rightLinked\">NSButton</string>\n\t\t\t\t\t\t<string key=\"rightShoulder\">MyShoulderButton</string>\n\t\t\t\t\t\t<string key=\"rightStick\">MyAnalogStick</string>\n\t\t\t\t\t\t<string key=\"rightStickDeadzone\">NSSlider</string>\n\t\t\t\t\t\t<string key=\"rightStickInvertX\">NSButton</string>\n\t\t\t\t\t\t<string key=\"rightStickInvertY\">NSButton</string>\n\t\t\t\t\t\t<string key=\"rightTrigger\">NSProgressIndicator</string>\n\t\t\t\t\t</dictionary>\n\t\t\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"toOneOutletInfosByName\">\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"batteryLevel\">\n\t\t\t\t\t\t\t<string key=\"name\">batteryLevel</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">NSImageView</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"centreButtons\">\n\t\t\t\t\t\t\t<string key=\"name\">centreButtons</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">MyCentreButtons</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"deviceList\">\n\t\t\t\t\t\t\t<string key=\"name\">deviceList</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">NSPopUpButton</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"deviceLister\">\n\t\t\t\t\t\t\t<string key=\"name\">deviceLister</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">DeviceLister</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"digiStick\">\n\t\t\t\t\t\t\t<string key=\"name\">digiStick</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">MyDigitalStick</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"leftLinked\">\n\t\t\t\t\t\t\t<string key=\"name\">leftLinked</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">NSButton</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"leftShoulder\">\n\t\t\t\t\t\t\t<string key=\"name\">leftShoulder</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">MyShoulderButton</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"leftStick\">\n\t\t\t\t\t\t\t<string key=\"name\">leftStick</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">MyAnalogStick</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"leftStickDeadzone\">\n\t\t\t\t\t\t\t<string key=\"name\">leftStickDeadzone</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">NSSlider</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"leftStickInvertX\">\n\t\t\t\t\t\t\t<string key=\"name\">leftStickInvertX</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">NSButton</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"leftStickInvertY\">\n\t\t\t\t\t\t\t<string key=\"name\">leftStickInvertY</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">NSButton</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"leftTrigger\">\n\t\t\t\t\t\t\t<string key=\"name\">leftTrigger</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">NSProgressIndicator</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"powerOff\">\n\t\t\t\t\t\t\t<string key=\"name\">powerOff</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">NSButton</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"rightButtons\">\n\t\t\t\t\t\t\t<string key=\"name\">rightButtons</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">MyMainButtons</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"rightLinked\">\n\t\t\t\t\t\t\t<string key=\"name\">rightLinked</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">NSButton</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"rightShoulder\">\n\t\t\t\t\t\t\t<string key=\"name\">rightShoulder</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">MyShoulderButton</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"rightStick\">\n\t\t\t\t\t\t\t<string key=\"name\">rightStick</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">MyAnalogStick</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"rightStickDeadzone\">\n\t\t\t\t\t\t\t<string key=\"name\">rightStickDeadzone</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">NSSlider</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"rightStickInvertX\">\n\t\t\t\t\t\t\t<string key=\"name\">rightStickInvertX</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">NSButton</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"rightStickInvertY\">\n\t\t\t\t\t\t\t<string key=\"name\">rightStickInvertY</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">NSButton</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"rightTrigger\">\n\t\t\t\t\t\t\t<string key=\"name\">rightTrigger</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">NSProgressIndicator</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</dictionary>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/Pref360ControlPref.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</array>\n\t\t</object>\n\t\t<int key=\"IBDocument.localizationMode\">0</int>\n\t\t<string key=\"IBDocument.TargetRuntimeIdentifier\">IBCocoaFramework</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginDeclaredDependencies\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>\n\t\t\t<integer value=\"1050\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<bool key=\"IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion\">YES</bool>\n\t\t<int key=\"IBDocument.defaultPropertyAccessControl\">3</int>\n\t\t<dictionary class=\"NSMutableDictionary\" key=\"IBDocument.LastKnownImageSizes\">\n\t\t\t<string key=\"NSMenuCheckmark\">{11, 11}</string>\n\t\t\t<string key=\"NSMenuMixedState\">{10, 3}</string>\n\t\t\t<string key=\"NSSwitch\">{15, 15}</string>\n\t\t\t<string key=\"battNone\">{32, 24}</string>\n\t\t</dictionary>\n\t</data>\n</archive>\n"
  },
  {
    "path": "Pref360Control/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleExecutable</key>\n\t<string>Pref360Control</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.mice.driver.360Controller.Prefs</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n\t<key>NSMainNibFile</key>\n\t<string>Pref360ControlPref</string>\n\t<key>NSPrefPaneIconFile</key>\n\t<string>Pref360ControlPref.tiff</string>\n\t<key>NSPrincipalClass</key>\n\t<string>Pref360ControlPref</string>\n\t<key>CFBundleName</key>\n\t<string>XBox 360 Controllers</string>\n\t<key>NSPrefPaneIconLabel</key>\n\t<string>Xbox 360\\nControllers</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pref360Control/MyAnalogStick.h",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    MyAnalogStick.h - declaration of analog stick view\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#import <Cocoa/Cocoa.h>\n\n@interface MyAnalogStick : NSView\n{\n    int deadzone;\n    int x,y;\n    BOOL pressed,linked;\n}\n\n- (void)setDeadzone:(int)pos;\n- (void)setPositionX:(int)xPos y:(int)yPos;\n- (void)setPositionX:(int)xPos;\n- (void)setPositionY:(int)xPos;\n- (void)setPressed:(BOOL)pressedState;\n- (void)setLinked:(BOOL)linkedState;\n\n@end\n"
  },
  {
    "path": "Pref360Control/MyAnalogStick.m",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    MyAnalogStick.m - implementation of analog stick view\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#import \"MyAnalogStick.h\"\n\n#define PRESSED_INSET       5\n#define AREA_INSET          4\n\n@implementation MyAnalogStick\n\n- (id)initWithFrame:(NSRect)frameRect\n{\n\tif ((self = [super initWithFrame:frameRect]) != nil) {\n        deadzone=0;\n        x=0;\n        y=0;\n        pressed=FALSE;\n        linked=FALSE;\n\t}\n\treturn self;\n}\n\n- (void)drawRect:(NSRect)rect\n{\n    NSRect area,deadRect,posRect;\n    \n    // Compute positions\n        // Area\n    area=[self bounds];\n        // Deadzone\n    deadRect.size.width=(deadzone*area.size.width)/32768;\n    deadRect.size.height=(deadzone*area.size.height)/32768;\n    deadRect.origin.x=area.origin.x+((area.size.width-deadRect.size.width)/2);\n    deadRect.origin.y=area.origin.y+((area.size.height-deadRect.size.height)/2);\n        // Position\n    posRect.size.width=4;\n    posRect.size.height=4;\n    posRect.origin.x=area.origin.x+AREA_INSET+(((x+32768)*(area.size.width-(AREA_INSET*2)))/65536)-(posRect.size.width/2);\n    posRect.origin.y=area.origin.y+area.size.height-AREA_INSET-(((y+32768)*(area.size.height-(AREA_INSET*2)))/65536)-(posRect.size.height/2);\n    // Draw border\n    NSDrawLightBezel(area,area);\n    // Draw pressed state\n    if(pressed) {\n        NSRect pressArea;\n        \n        pressArea=area;\n        pressArea.origin.x+=PRESSED_INSET;\n        pressArea.origin.y+=PRESSED_INSET;\n        pressArea.size.width-=PRESSED_INSET*2;\n        pressArea.size.height-=PRESSED_INSET*2;\n        [[NSColor blackColor] set];\n        NSRectFill(pressArea);\n    }\n    // Draw deadzone\n    if(deadzone!=0) {\n        [[NSColor redColor] set];\n        if(linked) NSFrameRect(deadRect);\n        else {\n            NSRect trueRect;\n            \n            trueRect=deadRect;\n            trueRect.origin.x=area.origin.x;\n            trueRect.size.width=area.size.width;\n            NSFrameRect(trueRect);\n            trueRect=deadRect;\n            trueRect.origin.y=area.origin.y;\n            trueRect.size.height=area.size.height;\n            NSFrameRect(trueRect);\n        }\n    }\n    // Draw position\n    if(pressed) [[NSColor whiteColor] set];\n    else [[NSColor blackColor] set];\n    NSRectFill(posRect);\n}\n\n- (void)setDeadzone:(int)pos\n{\n    deadzone=pos;\n    [self setNeedsDisplay:YES];\n}\n\n- (void)setPositionX:(int)xPos y:(int)yPos\n{\n    x=xPos;\n    y=yPos;\n    [self setNeedsDisplay:YES];\n}\n\n- (void)setPositionX:(int)xPos\n{\n    x=xPos;\n    [self setNeedsDisplay:YES];\n}\n\n- (void)setPositionY:(int)yPos\n{\n    y=yPos;\n    [self setNeedsDisplay:YES];\n}\n\n- (void)setPressed:(BOOL)pressedState\n{\n    pressed=pressedState;\n    [self setNeedsDisplay:YES];\n}\n\n- (void)setLinked:(BOOL)linkedState\n{\n    linked=linkedState;\n    [self setNeedsDisplay:YES];\n}\n\n@end\n"
  },
  {
    "path": "Pref360Control/MyCentreButtons.h",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    MyCentreButtons.h - definition of view to draw the central buttons\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#import <Cocoa/Cocoa.h>\n\n@interface MyCentreButtons : NSView\n{\n    BOOL back,start,appSpecific;\n}\n\n- (void)setBack:(BOOL)bBack;\n- (void)setStart:(BOOL)bStart;\n- (void)setSpecific:(BOOL)bSpecific;\n\n@end\n"
  },
  {
    "path": "Pref360Control/MyCentreButtons.m",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    MyCentreButtons.m - implementation of central button view\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/#import \"MyCentreButtons.h\"\n\n@implementation MyCentreButtons\n\n- (id)initWithFrame:(NSRect)frameRect\n{\n\tif ((self = [super initWithFrame:frameRect]) != nil) {\n\t\tback=start=appSpecific=FALSE;\n\t}\n\treturn self;\n}\n\n- (void)drawButton:(NSString*)button inRectangle:(NSRect)rect pressed:(BOOL)down\n{\n    NSBezierPath *path;\n    NSSize size;\n    NSDictionary *attributes;\n    NSPoint point;\n    NSColor *colour;\n    \n    // Draw circle\n    path=[NSBezierPath bezierPathWithOvalInRect:rect];\n    colour=[NSColor blackColor];\n    [colour set];\n    if(down) {\n        [path fill];\n        colour=[NSColor whiteColor];\n    } else [path stroke];\n    // Draw text\n    attributes=[NSDictionary dictionaryWithObject:colour forKey:NSForegroundColorAttributeName];\n    size=[button sizeWithAttributes:attributes];\n    point.x=rect.origin.x+((rect.size.width-size.width)/2);\n    point.y=rect.origin.y+((rect.size.height-size.height)/2);\n    [button drawAtPoint:point withAttributes:attributes];\n}\n\n- (void)drawRect:(NSRect)rect\n{\n    NSRect area,button;\n\n    area=[self bounds];\n    button.size.height=area.size.height/2;\n    button.size.width=area.size.width/4;\n    button.origin.x=area.origin.x;\n    button.origin.y=area.origin.y+((area.size.height-button.size.height)/2);\n    [self drawButton:@\"Back\" inRectangle:button pressed:back];\n    button.origin.x=area.origin.x+area.size.width-button.size.width;\n    [self drawButton:@\"Start\" inRectangle:button pressed:start];\n    button.size.height=area.size.height-2;\n    button.size.width=button.size.height;\n    button.origin.x=area.origin.x+((area.size.width-button.size.width)/2);\n    button.origin.y=area.origin.y+1;\n    [self drawButton:@\"\" inRectangle:button pressed:appSpecific];\n}\n\n- (void)setBack:(BOOL)bBack\n{\n    back=bBack;\n    [self setNeedsDisplay:TRUE];\n}\n\n- (void)setStart:(BOOL)bStart\n{\n    start=bStart;\n    [self setNeedsDisplay:TRUE];\n}\n\n- (void)setSpecific:(BOOL)bSpecific\n{\n    appSpecific=bSpecific;\n    [self setNeedsDisplay:TRUE];\n}\n\n@end\n"
  },
  {
    "path": "Pref360Control/MyDigitalStick.h",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    MyDigitalStick.h - declaration of view to draw digital stick view\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#import <Cocoa/Cocoa.h>\n\n@interface MyDigitalStick : NSView\n{\n    NSBezierPath *up,*down,*left,*right;\n    BOOL bUp,bDown,bLeft,bRight;\n}\n\n- (void)setUp:(BOOL)upState;\n- (void)setDown:(BOOL)downState;\n- (void)setLeft:(BOOL)leftState;\n- (void)setRight:(BOOL)rightState;\n\n@end\n"
  },
  {
    "path": "Pref360Control/MyDigitalStick.m",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    MyDigitalStick.m - implementation of digital stick view\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#import \"MyDigitalStick.h\"\n\n#define INSET_AMOUNT        10\n\n@implementation MyDigitalStick\n\n- (NSBezierPath*)makeTriangle:(int)start inRectangle:(NSRect)rect;\n{\n    NSBezierPath *path;\n    NSPoint centre,point;\n    const int mult[][2]={\n        {0,0},\n        {1,0},\n        {1,1},\n        {0,1},\n        {0,0}\n    };\n    \n    // Find central part\n    centre.x=rect.origin.x+(rect.size.width/2);\n    centre.y=rect.origin.y+(rect.size.height/2);\n    // Create path\n    path=[NSBezierPath bezierPath];\n    // Make triangle\n    [path moveToPoint:centre];\n    point.x=rect.origin.x+(rect.size.width*mult[start][0]);\n    point.y=rect.origin.y+(rect.size.height*mult[start][1]);\n    [path lineToPoint:point];\n    point.x=rect.origin.x+(rect.size.width*mult[start+1][0]);\n    point.y=rect.origin.y+(rect.size.height*mult[start+1][1]);\n    [path lineToPoint:point];\n    [path closePath];\n    // Done\n    return [path retain];\n}\n\n- (id)initWithFrame:(NSRect)frameRect\n{\n\tif ((self = [super initWithFrame:frameRect]) != nil) {\n        NSRect rect,triangle;\n        \n        bUp=bDown=bLeft=bRight=FALSE;\n        rect=[self bounds];\n        triangle.origin.x+=INSET_AMOUNT;\n        triangle.origin.y+=INSET_AMOUNT;\n        triangle.size.width-=INSET_AMOUNT*2;\n        triangle.size.height-=INSET_AMOUNT*2;\n        triangle.size.width=rect.size.width/3;\n        triangle.size.height=rect.size.height/3;\n        triangle.origin.y=rect.origin.y+(triangle.size.height*2);\n        triangle.origin.x=rect.origin.x+triangle.size.width;\n        up=[self makeTriangle:0 inRectangle:triangle];\n        triangle.origin.y=rect.origin.y;\n        down=[self makeTriangle:2 inRectangle:triangle];\n        triangle.origin.y=rect.origin.y+triangle.size.height;\n        triangle.origin.x=rect.origin.x;\n        left=[self makeTriangle:1 inRectangle:triangle];\n        triangle.origin.x=rect.origin.x+(triangle.size.width*2);\n        right=[self makeTriangle:3 inRectangle:triangle];\n\t}\n\treturn self;\n}\n\n- (void)dealloc\n{\n    [up release];\n    [down release];\n    [left release];\n    [right release];\n    [super dealloc];\n}\n\n- (void)drawRect:(NSRect)rect\n{\n    NSRect area;\n    \n    area=[self bounds];\n    NSDrawLightBezel(area,area);\n    [[NSColor blackColor] set];\n    if(bUp) [up fill];\n    if(bDown) [down fill];\n    if(bLeft) [left fill];\n    if(bRight) [right fill];\n}\n\n- (void)setUp:(BOOL)upState\n{\n    bUp=upState;\n    [self setNeedsDisplay:TRUE];\n}\n\n- (void)setDown:(BOOL)downState\n{\n    bDown=downState;\n    [self setNeedsDisplay:TRUE];\n}\n\n- (void)setLeft:(BOOL)leftState\n{\n    bLeft=leftState;\n    [self setNeedsDisplay:TRUE];\n}\n\n- (void)setRight:(BOOL)rightState\n{\n    bRight=rightState;\n    [self setNeedsDisplay:TRUE];\n}\n\n@end\n"
  },
  {
    "path": "Pref360Control/MyMainButtons.h",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    MyMainButtons.h - declaration of A/B/X/Y button view\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#import <Cocoa/Cocoa.h>\n\n@interface MyMainButtons : NSView\n{\n    BOOL a,b,x,y;\n}\n\n- (void)setA:(BOOL)aVal;\n- (void)setB:(BOOL)bVal;\n- (void)setX:(BOOL)xVal;\n- (void)setY:(BOOL)yVal;\n\n@end\n"
  },
  {
    "path": "Pref360Control/MyMainButtons.m",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    MyMainButtons.m - implementation of A/B/X/Y button view\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#import \"MyMainButtons.h\"\n\n#define MINI_OFFSET         2\n\n@implementation MyMainButtons\n\n- (id)initWithFrame:(NSRect)frameRect\n{\n\tif ((self = [super initWithFrame:frameRect]) != nil) {\n        a=b=x=y=FALSE;\n\t}\n\treturn self;\n}\n\n- (void)drawButton:(NSString*)button inRectangle:(NSRect)rect pressed:(BOOL)down\n{\n    NSBezierPath *path;\n    NSSize size;\n    NSDictionary *attributes;\n    NSPoint point;\n    NSColor *colour;\n    NSRect bling;\n    \n    // Draw circle\n    path=[NSBezierPath bezierPathWithOvalInRect:rect];\n    if(down) {\n        [path fill];\n//        colour=[NSColor whiteColor];\n    } else {\n        [path stroke];\n//        colour=[NSColor blackColor];\n    }\n    colour=[NSColor blackColor];\n    bling=rect;\n    bling.origin.x-=1;\n    bling.origin.y-=1;\n    bling.size.width+=2;\n    bling.size.height+=2;\n    path=[NSBezierPath bezierPathWithOvalInRect:bling];\n    [colour set];\n    [path stroke];\n    // Draw text\n    attributes=[NSDictionary dictionaryWithObject:colour forKey:NSForegroundColorAttributeName];\n    size=[button sizeWithAttributes:attributes];\n    point.x=rect.origin.x+((rect.size.width-size.width)/2);\n    point.y=rect.origin.y+((rect.size.height-size.height)/2);\n    [button drawAtPoint:point withAttributes:attributes];\n}\n\n- (void)drawRect:(NSRect)rect\n{\n    NSRect area,bit;\n    \n    area=[self bounds];\n    bit.size.width=area.size.width/3;\n    bit.size.height=area.size.height/3;\n    bit.origin.x=area.origin.x+bit.size.width;\n    bit.origin.y=area.origin.y+(bit.size.height*2)-MINI_OFFSET;\n    [[NSColor yellowColor] set];\n    [self drawButton:@\"Y\" inRectangle:bit pressed:y];\n    bit.origin.y=area.origin.y+MINI_OFFSET;\n    [[NSColor greenColor] set];\n    [self drawButton:@\"A\" inRectangle:bit pressed:a];\n    bit.origin.y=area.origin.y+bit.size.height;\n    bit.origin.x=area.origin.x+MINI_OFFSET;\n    [[NSColor blueColor] set];\n    [self drawButton:@\"X\" inRectangle:bit pressed:x];\n    bit.origin.x=area.origin.x+(bit.size.width*2)-MINI_OFFSET;\n    [[NSColor redColor] set];\n    [self drawButton:@\"B\" inRectangle:bit pressed:b];\n}\n\n- (void)setA:(BOOL)aVal\n{\n    a=aVal;\n    [self setNeedsDisplay:TRUE];\n}\n\n- (void)setB:(BOOL)bVal\n{\n    b=bVal;\n    [self setNeedsDisplay:TRUE];\n}\n\n- (void)setX:(BOOL)xVal\n{\n    x=xVal;\n    [self setNeedsDisplay:TRUE];\n}\n\n- (void)setY:(BOOL)yVal\n{\n    y=yVal;\n    [self setNeedsDisplay:TRUE];\n}\n\n@end\n"
  },
  {
    "path": "Pref360Control/MyShoulderButton.h",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    MyShoulderButton.h - simple button view declaration\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#import <Cocoa/Cocoa.h>\n\n@interface MyShoulderButton : NSView\n{\n    BOOL pressed;\n}\n\n- (void)setPressed:(BOOL)b;\n\n@end\n"
  },
  {
    "path": "Pref360Control/MyShoulderButton.m",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    MyShoulderButton.m - implementation of simple button view\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#import \"MyShoulderButton.h\"\n\n#define INSET_AMOUNT        2\n\n@implementation MyShoulderButton\n\n- (id)initWithFrame:(NSRect)frameRect\n{\n\tif ((self = [super initWithFrame:frameRect]) != nil) {\n\t\tpressed=FALSE;\n\t}\n\treturn self;\n}\n\n- (void)drawRect:(NSRect)rect\n{\n    NSRect area;\n    \n    area=[self bounds];\n    NSDrawLightBezel(area,area);\n    if(pressed) {\n        area.origin.x+=INSET_AMOUNT;\n        area.origin.y+=INSET_AMOUNT;\n        area.size.width-=INSET_AMOUNT*2;\n        area.size.height-=INSET_AMOUNT*2;\n        [[NSColor blueColor] set];\n        NSRectFill(area);\n    }\n}\n\n- (void)setPressed:(BOOL)b\n{\n    pressed=b;\n    [self setNeedsDisplay:TRUE];\n}\n\n@end\n"
  },
  {
    "path": "Pref360Control/Pref360Control.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 45;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t3B04BE7313763D04005FA9F8 /* DeviceLister.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B04BE7113763D04005FA9F8 /* DeviceLister.h */; };\n\t\t3B04BE7413763D04005FA9F8 /* DeviceLister.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B04BE7213763D04005FA9F8 /* DeviceLister.m */; };\n\t\t3B04BEA61376416D005FA9F8 /* DriverTool in Resources */ = {isa = PBXBuildFile; fileRef = 3B04BEA51376416D005FA9F8 /* DriverTool */; };\n\t\t3B47D9ED0B93C2BF00F200B8 /* battNone.tif in Resources */ = {isa = PBXBuildFile; fileRef = 3B47D9EC0B93C2BF00F200B8 /* battNone.tif */; };\n\t\t3B47D9F20B93C31400F200B8 /* batt1.tif in Resources */ = {isa = PBXBuildFile; fileRef = 3B47D9EE0B93C31400F200B8 /* batt1.tif */; };\n\t\t3B47D9F30B93C31400F200B8 /* batt0.tif in Resources */ = {isa = PBXBuildFile; fileRef = 3B47D9EF0B93C31400F200B8 /* batt0.tif */; };\n\t\t3B47D9F40B93C31400F200B8 /* batt3.tif in Resources */ = {isa = PBXBuildFile; fileRef = 3B47D9F00B93C31400F200B8 /* batt3.tif */; };\n\t\t3B47D9F50B93C31400F200B8 /* batt2.tif in Resources */ = {isa = PBXBuildFile; fileRef = 3B47D9F10B93C31400F200B8 /* batt2.tif */; };\n\t\t3B86987F0CE2A22100283CEC /* ControlPrefs.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B86987D0CE2A22100283CEC /* ControlPrefs.h */; };\n\t\t3B8698800CE2A22100283CEC /* ControlPrefs.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B86987E0CE2A22100283CEC /* ControlPrefs.m */; };\n\t\t3B8B91321376FC120047D446 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B8B91311376FC120047D446 /* Security.framework */; };\n\t\t3BBEAB01096B2C4C00F2E37B /* MyAnalogStick.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BBEAAFF096B2C4C00F2E37B /* MyAnalogStick.h */; };\n\t\t3BBEAB02096B2C4C00F2E37B /* MyAnalogStick.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BBEAB00096B2C4C00F2E37B /* MyAnalogStick.m */; };\n\t\t3BBEAB05096B2C5200F2E37B /* MyCentreButtons.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BBEAB03096B2C5200F2E37B /* MyCentreButtons.m */; };\n\t\t3BBEAB06096B2C5200F2E37B /* MyCentreButtons.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BBEAB04096B2C5200F2E37B /* MyCentreButtons.h */; };\n\t\t3BBEAB09096B2C5600F2E37B /* MyDigitalStick.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BBEAB07096B2C5600F2E37B /* MyDigitalStick.m */; };\n\t\t3BBEAB0A096B2C5600F2E37B /* MyDigitalStick.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BBEAB08096B2C5600F2E37B /* MyDigitalStick.h */; };\n\t\t3BBEAB0D096B2C5B00F2E37B /* MyMainButtons.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BBEAB0B096B2C5B00F2E37B /* MyMainButtons.h */; };\n\t\t3BBEAB0E096B2C5B00F2E37B /* MyMainButtons.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BBEAB0C096B2C5B00F2E37B /* MyMainButtons.m */; };\n\t\t3BBEAB11096B2C6000F2E37B /* MyShoulderButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BBEAB0F096B2C6000F2E37B /* MyShoulderButton.h */; };\n\t\t3BBEAB12096B2C6000F2E37B /* MyShoulderButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BBEAB10096B2C6000F2E37B /* MyShoulderButton.m */; };\n\t\t3BBEAB2D096B6EDE00F2E37B /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BBEAB2C096B6EDE00F2E37B /* IOKit.framework */; };\n\t\t3BC41F32096C85CB00664A42 /* DeviceItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BC41F30096C85CB00664A42 /* DeviceItem.h */; };\n\t\t3BC41F33096C85CB00664A42 /* DeviceItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BC41F31096C85CB00664A42 /* DeviceItem.m */; };\n\t\t3BC41F47096C8D0300664A42 /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BC41F46096C8D0300664A42 /* ForceFeedback.framework */; };\n\t\t8D202CEA0486D31800D8A456 /* Pref360Control_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = 32DBCFA20370C41700C91783 /* Pref360Control_Prefix.pch */; };\n\t\t8D202CEB0486D31800D8A456 /* Pref360ControlPref.h in Headers */ = {isa = PBXBuildFile; fileRef = F506C03C013D9D7901CA16C8 /* Pref360ControlPref.h */; };\n\t\t8D202CED0486D31800D8A456 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C167DFE841241C02AAC07 /* InfoPlist.strings */; };\n\t\t8D202CEE0486D31800D8A456 /* Pref360ControlPref.tiff in Resources */ = {isa = PBXBuildFile; fileRef = F506C040013D9D8001CA16C8 /* Pref360ControlPref.tiff */; };\n\t\t8D202CEF0486D31800D8A456 /* Pref360ControlPref.nib in Resources */ = {isa = PBXBuildFile; fileRef = F506C042013D9D8C01CA16C8 /* Pref360ControlPref.nib */; };\n\t\t8D202CF10486D31800D8A456 /* Pref360ControlPref.m in Sources */ = {isa = PBXBuildFile; fileRef = F506C03D013D9D7901CA16C8 /* Pref360ControlPref.m */; };\n\t\t8D202CF30486D31800D8A456 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */; };\n\t\t8D202CF40486D31800D8A456 /* PreferencePanes.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F506C035013D953901CA16C8 /* PreferencePanes.framework */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t089C1672FE841209C02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = \"<absolute>\"; };\n\t\t089C167EFE841241C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\t089C167FFE841241C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = \"<absolute>\"; };\n\t\t1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = \"<absolute>\"; };\n\t\t32DBCFA20370C41700C91783 /* Pref360Control_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Pref360Control_Prefix.pch; sourceTree = \"<group>\"; };\n\t\t3B04BE7113763D04005FA9F8 /* DeviceLister.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeviceLister.h; sourceTree = \"<group>\"; };\n\t\t3B04BE7213763D04005FA9F8 /* DeviceLister.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DeviceLister.m; sourceTree = \"<group>\"; };\n\t\t3B04BEA51376416D005FA9F8 /* DriverTool */ = {isa = PBXFileReference; lastKnownFileType = \"compiled.mach-o.executable\"; name = DriverTool; path = ../DriverTool/build/Release/DriverTool; sourceTree = SOURCE_ROOT; };\n\t\t3B47D9EC0B93C2BF00F200B8 /* battNone.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = battNone.tif; sourceTree = \"<group>\"; };\n\t\t3B47D9EE0B93C31400F200B8 /* batt1.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = batt1.tif; sourceTree = \"<group>\"; };\n\t\t3B47D9EF0B93C31400F200B8 /* batt0.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = batt0.tif; sourceTree = \"<group>\"; };\n\t\t3B47D9F00B93C31400F200B8 /* batt3.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = batt3.tif; sourceTree = \"<group>\"; };\n\t\t3B47D9F10B93C31400F200B8 /* batt2.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = batt2.tif; sourceTree = \"<group>\"; };\n\t\t3B86987D0CE2A22100283CEC /* ControlPrefs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ControlPrefs.h; path = ../360Daemon/ControlPrefs.h; sourceTree = SOURCE_ROOT; };\n\t\t3B86987E0CE2A22100283CEC /* ControlPrefs.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ControlPrefs.m; path = ../360Daemon/ControlPrefs.m; sourceTree = SOURCE_ROOT; };\n\t\t3B8B91311376FC120047D446 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };\n\t\t3BBEAAFF096B2C4C00F2E37B /* MyAnalogStick.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MyAnalogStick.h; sourceTree = \"<group>\"; };\n\t\t3BBEAB00096B2C4C00F2E37B /* MyAnalogStick.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MyAnalogStick.m; sourceTree = \"<group>\"; };\n\t\t3BBEAB03096B2C5200F2E37B /* MyCentreButtons.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MyCentreButtons.m; sourceTree = \"<group>\"; };\n\t\t3BBEAB04096B2C5200F2E37B /* MyCentreButtons.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MyCentreButtons.h; sourceTree = \"<group>\"; };\n\t\t3BBEAB07096B2C5600F2E37B /* MyDigitalStick.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MyDigitalStick.m; sourceTree = \"<group>\"; };\n\t\t3BBEAB08096B2C5600F2E37B /* MyDigitalStick.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MyDigitalStick.h; sourceTree = \"<group>\"; };\n\t\t3BBEAB0B096B2C5B00F2E37B /* MyMainButtons.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MyMainButtons.h; sourceTree = \"<group>\"; };\n\t\t3BBEAB0C096B2C5B00F2E37B /* MyMainButtons.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MyMainButtons.m; sourceTree = \"<group>\"; };\n\t\t3BBEAB0F096B2C6000F2E37B /* MyShoulderButton.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MyShoulderButton.h; sourceTree = \"<group>\"; };\n\t\t3BBEAB10096B2C6000F2E37B /* MyShoulderButton.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MyShoulderButton.m; sourceTree = \"<group>\"; };\n\t\t3BBEAB2C096B6EDE00F2E37B /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = \"<absolute>\"; };\n\t\t3BC41F30096C85CB00664A42 /* DeviceItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeviceItem.h; sourceTree = \"<group>\"; };\n\t\t3BC41F31096C85CB00664A42 /* DeviceItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DeviceItem.m; sourceTree = \"<group>\"; };\n\t\t3BC41F46096C8D0300664A42 /* ForceFeedback.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ForceFeedback.framework; path = /System/Library/Frameworks/ForceFeedback.framework; sourceTree = \"<absolute>\"; };\n\t\t8D202CF70486D31800D8A456 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t8D202CF80486D31800D8A456 /* Pref360Control.prefPane */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Pref360Control.prefPane; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tF506C035013D953901CA16C8 /* PreferencePanes.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PreferencePanes.framework; path = /System/Library/Frameworks/PreferencePanes.framework; sourceTree = \"<absolute>\"; };\n\t\tF506C03C013D9D7901CA16C8 /* Pref360ControlPref.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Pref360ControlPref.h; sourceTree = \"<group>\"; };\n\t\tF506C03D013D9D7901CA16C8 /* Pref360ControlPref.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Pref360ControlPref.m; sourceTree = \"<group>\"; };\n\t\tF506C040013D9D8001CA16C8 /* Pref360ControlPref.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = Pref360ControlPref.tiff; sourceTree = \"<group>\"; };\n\t\tF506C043013D9D8C01CA16C8 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/Pref360ControlPref.nib; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t8D202CF20486D31800D8A456 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8D202CF30486D31800D8A456 /* Cocoa.framework in Frameworks */,\n\t\t\t\t8D202CF40486D31800D8A456 /* PreferencePanes.framework in Frameworks */,\n\t\t\t\t3BBEAB2D096B6EDE00F2E37B /* IOKit.framework in Frameworks */,\n\t\t\t\t3BC41F47096C8D0300664A42 /* ForceFeedback.framework in Frameworks */,\n\t\t\t\t3B8B91321376FC120047D446 /* Security.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t089C166AFE841209C02AAC07 /* Pref360Control */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t08FB77AFFE84173DC02AAC07 /* Classes */,\n\t\t\t\t32DBCFA10370C40200C91783 /* Other Sources */,\n\t\t\t\t089C167CFE841241C02AAC07 /* Resources */,\n\t\t\t\t089C1671FE841209C02AAC07 /* Frameworks and Libraries */,\n\t\t\t\t19C28FB8FE9D52D311CA2CBB /* Products */,\n\t\t\t);\n\t\t\tname = Pref360Control;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t089C1671FE841209C02AAC07 /* Frameworks and Libraries */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1058C7ACFEA557BF11CA2CBB /* Linked Frameworks */,\n\t\t\t\t1058C7AEFEA557BF11CA2CBB /* Other Frameworks */,\n\t\t\t);\n\t\t\tname = \"Frameworks and Libraries\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t089C167CFE841241C02AAC07 /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B04BEA51376416D005FA9F8 /* DriverTool */,\n\t\t\t\t8D202CF70486D31800D8A456 /* Info.plist */,\n\t\t\t\t089C167DFE841241C02AAC07 /* InfoPlist.strings */,\n\t\t\t\tF506C040013D9D8001CA16C8 /* Pref360ControlPref.tiff */,\n\t\t\t\tF506C042013D9D8C01CA16C8 /* Pref360ControlPref.nib */,\n\t\t\t\t3B47D9EC0B93C2BF00F200B8 /* battNone.tif */,\n\t\t\t\t3B47D9EF0B93C31400F200B8 /* batt0.tif */,\n\t\t\t\t3B47D9EE0B93C31400F200B8 /* batt1.tif */,\n\t\t\t\t3B47D9F10B93C31400F200B8 /* batt2.tif */,\n\t\t\t\t3B47D9F00B93C31400F200B8 /* batt3.tif */,\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t08FB77AFFE84173DC02AAC07 /* Classes */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B86987D0CE2A22100283CEC /* ControlPrefs.h */,\n\t\t\t\t3B86987E0CE2A22100283CEC /* ControlPrefs.m */,\n\t\t\t\tF506C03C013D9D7901CA16C8 /* Pref360ControlPref.h */,\n\t\t\t\tF506C03D013D9D7901CA16C8 /* Pref360ControlPref.m */,\n\t\t\t\t3BBEAAFF096B2C4C00F2E37B /* MyAnalogStick.h */,\n\t\t\t\t3BBEAB00096B2C4C00F2E37B /* MyAnalogStick.m */,\n\t\t\t\t3BBEAB04096B2C5200F2E37B /* MyCentreButtons.h */,\n\t\t\t\t3BBEAB03096B2C5200F2E37B /* MyCentreButtons.m */,\n\t\t\t\t3BBEAB08096B2C5600F2E37B /* MyDigitalStick.h */,\n\t\t\t\t3BBEAB07096B2C5600F2E37B /* MyDigitalStick.m */,\n\t\t\t\t3BBEAB0B096B2C5B00F2E37B /* MyMainButtons.h */,\n\t\t\t\t3BBEAB0C096B2C5B00F2E37B /* MyMainButtons.m */,\n\t\t\t\t3BBEAB0F096B2C6000F2E37B /* MyShoulderButton.h */,\n\t\t\t\t3BBEAB10096B2C6000F2E37B /* MyShoulderButton.m */,\n\t\t\t\t3BC41F30096C85CB00664A42 /* DeviceItem.h */,\n\t\t\t\t3BC41F31096C85CB00664A42 /* DeviceItem.m */,\n\t\t\t\t3B04BE7113763D04005FA9F8 /* DeviceLister.h */,\n\t\t\t\t3B04BE7213763D04005FA9F8 /* DeviceLister.m */,\n\t\t\t);\n\t\t\tname = Classes;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1058C7ACFEA557BF11CA2CBB /* Linked Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3BC41F46096C8D0300664A42 /* ForceFeedback.framework */,\n\t\t\t\t3BBEAB2C096B6EDE00F2E37B /* IOKit.framework */,\n\t\t\t\t1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */,\n\t\t\t\tF506C035013D953901CA16C8 /* PreferencePanes.framework */,\n\t\t\t\t3B8B91311376FC120047D446 /* Security.framework */,\n\t\t\t);\n\t\t\tname = \"Linked Frameworks\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1058C7AEFEA557BF11CA2CBB /* Other Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t089C1672FE841209C02AAC07 /* Foundation.framework */,\n\t\t\t\t089C167FFE841241C02AAC07 /* AppKit.framework */,\n\t\t\t);\n\t\t\tname = \"Other Frameworks\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t19C28FB8FE9D52D311CA2CBB /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8D202CF80486D31800D8A456 /* Pref360Control.prefPane */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t32DBCFA10370C40200C91783 /* Other Sources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t32DBCFA20370C41700C91783 /* Pref360Control_Prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Other Sources\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t8D202CE90486D31800D8A456 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8D202CEA0486D31800D8A456 /* Pref360Control_Prefix.pch in Headers */,\n\t\t\t\t8D202CEB0486D31800D8A456 /* Pref360ControlPref.h in Headers */,\n\t\t\t\t3BBEAB01096B2C4C00F2E37B /* MyAnalogStick.h in Headers */,\n\t\t\t\t3BBEAB06096B2C5200F2E37B /* MyCentreButtons.h in Headers */,\n\t\t\t\t3BBEAB0A096B2C5600F2E37B /* MyDigitalStick.h in Headers */,\n\t\t\t\t3BBEAB0D096B2C5B00F2E37B /* MyMainButtons.h in Headers */,\n\t\t\t\t3BBEAB11096B2C6000F2E37B /* MyShoulderButton.h in Headers */,\n\t\t\t\t3BC41F32096C85CB00664A42 /* DeviceItem.h in Headers */,\n\t\t\t\t3B86987F0CE2A22100283CEC /* ControlPrefs.h in Headers */,\n\t\t\t\t3B04BE7313763D04005FA9F8 /* DeviceLister.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t8D202CE80486D31800D8A456 /* Pref360Control */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 3BBDC6A5097946B50023AAD8 /* Build configuration list for PBXNativeTarget \"Pref360Control\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t8D202CE90486D31800D8A456 /* Headers */,\n\t\t\t\t8D202CEC0486D31800D8A456 /* Resources */,\n\t\t\t\t8D202CF00486D31800D8A456 /* Sources */,\n\t\t\t\t8D202CF20486D31800D8A456 /* Frameworks */,\n\t\t\t\t8D202CF50486D31800D8A456 /* Rez */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Pref360Control;\n\t\t\tproductInstallPath = \"$(HOME)/Library/PreferencePanes\";\n\t\t\tproductName = Pref360Control;\n\t\t\tproductReference = 8D202CF80486D31800D8A456 /* Pref360Control.prefPane */;\n\t\t\tproductType = \"com.apple.product-type.bundle\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t089C1669FE841209C02AAC07 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tbuildConfigurationList = 3BBDC6A9097946B50023AAD8 /* Build configuration list for PBXProject \"Pref360Control\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.0\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 1;\n\t\t\tknownRegions = (\n\t\t\t\tEnglish,\n\t\t\t\tJapanese,\n\t\t\t\tFrench,\n\t\t\t\tGerman,\n\t\t\t);\n\t\t\tmainGroup = 089C166AFE841209C02AAC07 /* Pref360Control */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t8D202CE80486D31800D8A456 /* Pref360Control */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t8D202CEC0486D31800D8A456 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8D202CED0486D31800D8A456 /* InfoPlist.strings in Resources */,\n\t\t\t\t8D202CEE0486D31800D8A456 /* Pref360ControlPref.tiff in Resources */,\n\t\t\t\t8D202CEF0486D31800D8A456 /* Pref360ControlPref.nib in Resources */,\n\t\t\t\t3B47D9ED0B93C2BF00F200B8 /* battNone.tif in Resources */,\n\t\t\t\t3B47D9F20B93C31400F200B8 /* batt1.tif in Resources */,\n\t\t\t\t3B47D9F30B93C31400F200B8 /* batt0.tif in Resources */,\n\t\t\t\t3B47D9F40B93C31400F200B8 /* batt3.tif in Resources */,\n\t\t\t\t3B47D9F50B93C31400F200B8 /* batt2.tif in Resources */,\n\t\t\t\t3B04BEA61376416D005FA9F8 /* DriverTool in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXRezBuildPhase section */\n\t\t8D202CF50486D31800D8A456 /* Rez */ = {\n\t\t\tisa = PBXRezBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXRezBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t8D202CF00486D31800D8A456 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8D202CF10486D31800D8A456 /* Pref360ControlPref.m in Sources */,\n\t\t\t\t3BBEAB02096B2C4C00F2E37B /* MyAnalogStick.m in Sources */,\n\t\t\t\t3BBEAB05096B2C5200F2E37B /* MyCentreButtons.m in Sources */,\n\t\t\t\t3BBEAB09096B2C5600F2E37B /* MyDigitalStick.m in Sources */,\n\t\t\t\t3BBEAB0E096B2C5B00F2E37B /* MyMainButtons.m in Sources */,\n\t\t\t\t3BBEAB12096B2C6000F2E37B /* MyShoulderButton.m in Sources */,\n\t\t\t\t3BC41F33096C85CB00664A42 /* DeviceItem.m in Sources */,\n\t\t\t\t3B8698800CE2A22100283CEC /* ControlPrefs.m in Sources */,\n\t\t\t\t3B04BE7413763D04005FA9F8 /* DeviceLister.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t089C167DFE841241C02AAC07 /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t089C167EFE841241C02AAC07 /* English */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF506C042013D9D8C01CA16C8 /* Pref360ControlPref.nib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tF506C043013D9D8C01CA16C8 /* English */,\n\t\t\t);\n\t\t\tname = Pref360ControlPref.nib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t3BBDC6A6097946B50023AAD8 /* Development */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_32_64_BIT)\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUGGING_SYMBOLS = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"\";\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = YES;\n\t\t\t\t\"GCC_ENABLE_OBJC_GC[arch=x86_64]\" = supported;\n\t\t\t\tGCC_ENABLE_TRIGRAPHS = NO;\n\t\t\t\tGCC_GENERATE_DEBUGGING_SYMBOLS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = Pref360Control_Prefix.pch;\n\t\t\t\tGCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;\n\t\t\t\tGCC_WARN_FOUR_CHARACTER_CONSTANTS = NO;\n\t\t\t\tGCC_WARN_UNKNOWN_PRAGMAS = NO;\n\t\t\t\tHEADER_SEARCH_PATHS = \"\";\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(HOME)/Library/PreferencePanes\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = \"\";\n\t\t\t\tLIBRARY_STYLE = Bundle;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.5;\n\t\t\t\tOTHER_CFLAGS = \"\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-bundle\",\n\t\t\t\t\t\"-twolevel_namespace\",\n\t\t\t\t);\n\t\t\t\tOTHER_REZFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = Pref360Control;\n\t\t\t\tSDKROOT = \"\";\n\t\t\t\tSECTORDER_FLAGS = \"\";\n\t\t\t\tWARNING_CFLAGS = (\n\t\t\t\t\t\"-Wmost\",\n\t\t\t\t\t\"-Wno-four-char-constants\",\n\t\t\t\t\t\"-Wno-unknown-pragmas\",\n\t\t\t\t);\n\t\t\t\tWRAPPER_EXTENSION = prefPane;\n\t\t\t\tZERO_LINK = YES;\n\t\t\t};\n\t\t\tname = Development;\n\t\t};\n\t\t3BBDC6A7097946B50023AAD8 /* Deployment */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"\";\n\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = NO;\n\t\t\t\t\"GCC_ENABLE_OBJC_GC[arch=x86_64]\" = supported;\n\t\t\t\tGCC_ENABLE_TRIGRAPHS = NO;\n\t\t\t\tGCC_GENERATE_DEBUGGING_SYMBOLS = NO;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = Pref360Control_Prefix.pch;\n\t\t\t\tGCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;\n\t\t\t\tGCC_WARN_FOUR_CHARACTER_CONSTANTS = NO;\n\t\t\t\tGCC_WARN_UNKNOWN_PRAGMAS = NO;\n\t\t\t\tHEADER_SEARCH_PATHS = \"\";\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(HOME)/Library/PreferencePanes\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = \"\";\n\t\t\t\tLIBRARY_STYLE = Bundle;\n\t\t\t\tOTHER_CFLAGS = \"\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-bundle\",\n\t\t\t\t\t\"-twolevel_namespace\",\n\t\t\t\t);\n\t\t\t\tOTHER_REZFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = Pref360Control;\n\t\t\t\tSECTORDER_FLAGS = \"\";\n\t\t\t\tWARNING_CFLAGS = (\n\t\t\t\t\t\"-Wmost\",\n\t\t\t\t\t\"-Wno-four-char-constants\",\n\t\t\t\t\t\"-Wno-unknown-pragmas\",\n\t\t\t\t);\n\t\t\t\tWRAPPER_EXTENSION = prefPane;\n\t\t\t\tZERO_LINK = NO;\n\t\t\t};\n\t\t\tname = Deployment;\n\t\t};\n\t\t3BBDC6A8097946B50023AAD8 /* Default */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"\";\n\t\t\t\t\"GCC_ENABLE_OBJC_GC[arch=x86_64]\" = supported;\n\t\t\t\tGCC_ENABLE_TRIGRAPHS = NO;\n\t\t\t\tGCC_GENERATE_DEBUGGING_SYMBOLS = NO;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = Pref360Control_Prefix.pch;\n\t\t\t\tGCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;\n\t\t\t\tGCC_WARN_FOUR_CHARACTER_CONSTANTS = NO;\n\t\t\t\tGCC_WARN_UNKNOWN_PRAGMAS = NO;\n\t\t\t\tHEADER_SEARCH_PATHS = \"\";\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(HOME)/Library/PreferencePanes\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = \"\";\n\t\t\t\tLIBRARY_STYLE = Bundle;\n\t\t\t\tOTHER_CFLAGS = \"\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-bundle\",\n\t\t\t\t\t\"-twolevel_namespace\",\n\t\t\t\t);\n\t\t\t\tOTHER_REZFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = Pref360Control;\n\t\t\t\tSECTORDER_FLAGS = \"\";\n\t\t\t\tWARNING_CFLAGS = (\n\t\t\t\t\t\"-Wmost\",\n\t\t\t\t\t\"-Wno-four-char-constants\",\n\t\t\t\t\t\"-Wno-unknown-pragmas\",\n\t\t\t\t);\n\t\t\t\tWRAPPER_EXTENSION = prefPane;\n\t\t\t};\n\t\t\tname = Default;\n\t\t};\n\t\t3BBDC6AA097946B50023AAD8 /* Development */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"Developer ID Application: Colin Munro\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.5;\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\tSDKROOT = \"\";\n\t\t\t};\n\t\t\tname = Development;\n\t\t};\n\t\t3BBDC6AB097946B50023AAD8 /* Deployment */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_32_64_BIT)\";\n\t\t\t\tCODE_SIGN_IDENTITY = \"Developer ID Application: Colin Munro\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.5;\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\tSDKROOT = \"\";\n\t\t\t};\n\t\t\tname = Deployment;\n\t\t};\n\t\t3BBDC6AC097946B50023AAD8 /* Default */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"Developer ID Application: Colin Munro\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.5;\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\tSDKROOT = \"\";\n\t\t\t};\n\t\t\tname = Default;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t3BBDC6A5097946B50023AAD8 /* Build configuration list for PBXNativeTarget \"Pref360Control\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t3BBDC6A6097946B50023AAD8 /* Development */,\n\t\t\t\t3BBDC6A7097946B50023AAD8 /* Deployment */,\n\t\t\t\t3BBDC6A8097946B50023AAD8 /* Default */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Default;\n\t\t};\n\t\t3BBDC6A9097946B50023AAD8 /* Build configuration list for PBXProject \"Pref360Control\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t3BBDC6AA097946B50023AAD8 /* Development */,\n\t\t\t\t3BBDC6AB097946B50023AAD8 /* Deployment */,\n\t\t\t\t3BBDC6AC097946B50023AAD8 /* Default */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Default;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 089C1669FE841209C02AAC07 /* Project object */;\n}\n"
  },
  {
    "path": "Pref360Control/Pref360ControlPref.h",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    Pref360ControlPref.h - definition for the pref pane class\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n\n#import <PreferencePanes/PreferencePanes.h>\n\n#import <IOKit/IOKitLib.h>\n#import <IOKit/IOCFPlugIn.h>\n#import <IOKit/hid/IOHIDLib.h>\n#import <IOKit/hid/IOHIDKeys.h>\n#import <ForceFeedback/ForceFeedback.h>\n\n#include \"MyCentreButtons.h\"\n#include \"MyDigitalStick.h\"\n#include \"MyAnalogStick.h\"\n#include \"MyMainButtons.h\"\n#include \"MyShoulderButton.h\"\n\n@class DeviceLister;\n\n@interface Pref360ControlPref : NSPreferencePane \n{\n    // Window components\n    IBOutlet MyCentreButtons *centreButtons;\n    IBOutlet NSPopUpButton *deviceList;\n    IBOutlet MyDigitalStick *digiStick;\n    IBOutlet MyShoulderButton *leftShoulder;\n    IBOutlet MyAnalogStick *leftStick;\n    IBOutlet NSButton *leftLinked;\n    IBOutlet NSSlider *leftStickDeadzone;\n    IBOutlet NSButton *leftStickInvertX;\n    IBOutlet NSButton *leftStickInvertY;\n    IBOutlet NSProgressIndicator *leftTrigger;\n    IBOutlet MyMainButtons *rightButtons;\n    IBOutlet MyShoulderButton *rightShoulder;\n    IBOutlet MyAnalogStick *rightStick;\n    IBOutlet NSButton *rightLinked;\n    IBOutlet NSSlider *rightStickDeadzone;\n    IBOutlet NSButton *rightStickInvertX;\n    IBOutlet NSButton *rightStickInvertY;\n    IBOutlet NSProgressIndicator *rightTrigger;\n    IBOutlet NSImageView *batteryLevel;\n    IBOutlet DeviceLister *deviceLister;\n    IBOutlet NSButton *powerOff;\n    // Internal info\n    mach_port_t masterPort;\n    NSMutableArray *deviceArray;\n    IOHIDElementCookie axis[6],buttons[15];\n    \n    IOHIDDeviceInterface122 **device;\n    IOHIDQueueInterface **hidQueue;\n    FFDeviceObjectReference ffDevice;\n    io_registry_entry_t registryEntry;\n    \n    int largeMotor,smallMotor;\n    \n    IONotificationPortRef notifyPort;\n    CFRunLoopSourceRef notifySource;\n    io_iterator_t onIteratorWired, offIteratorWired;\n    io_iterator_t onIteratorWireless, offIteratorWireless;\n}\n\n- (void)mainViewDidLoad;\n\n- (void)eventQueueFired:(void*)sender withResult:(IOReturn)result;\n\n- (void)handleDeviceChange;\n\n- (IBAction)showDeviceList:(id)sender;\n- (IBAction)powerOff:(id)sender;\n\n- (mach_port_t)masterPort;\n\n@end\n"
  },
  {
    "path": "Pref360Control/Pref360ControlPref.m",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    Pref360ControlPref.m - main source of the pref pane\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#include <mach/mach.h>\n#include <IOKit/usb/IOUSBLib.h>\n#import \"Pref360ControlPref.h\"\n#import \"DeviceItem.h\"\n#import \"ControlPrefs.h\"\n#import \"DeviceLister.h\"\n\n#define NO_ITEMS            @\"No devices found\"\n\n// Passes a C callback back to the Objective C class\nstatic void CallbackFunction(void *target,IOReturn result,void *refCon,void *sender)\n{\n    if(target!=NULL) [((Pref360ControlPref*)target) eventQueueFired:sender withResult:result];\n}\n\n// Handle callback for when our device is connected or disconnected. Both events are\n// actually handled identically.\nstatic void callbackHandleDevice(void *param,io_iterator_t iterator)\n{\n    io_service_t object=0;\n    BOOL update;\n    \n    update=FALSE;\n    while((object=IOIteratorNext(iterator))!=0) {\n        IOObjectRelease(object);\n        update=TRUE;\n    }\n    if(update) [(Pref360ControlPref*)param handleDeviceChange];\n}\n\n@implementation Pref360ControlPref\n\n// Set the pattern on the LEDs\n- (void)updateLED:(int)ledIndex\n{\n    FFEFFESCAPE escape;\n    unsigned char c;\n    \n    if(ffDevice==0) return;\n    c=ledIndex;\n    escape.dwSize=sizeof(escape);\n    escape.dwCommand=0x02;\n    escape.cbInBuffer=sizeof(c);\n    escape.lpvInBuffer=&c;\n    escape.cbOutBuffer=0;\n    escape.lpvOutBuffer=NULL;\n    FFDeviceEscape(ffDevice,&escape);\n}\n\n// Enables and disables the rumble motor \"override\"\n- (void)setMotorOverride:(BOOL)enable\n{\n    FFEFFESCAPE escape;\n    char c;\n    \n    if(ffDevice==0) return;\n    // If true, the motors will no longer obey any Force Feedback Framework\n    // effects, and the motors may be controlled directly. False and the\n    // motors will perform effects but can not be directly controlled.\n    c=enable?0x01:0x00;\n    escape.dwSize=sizeof(escape);\n    escape.dwCommand=0x00;\n    escape.cbInBuffer=sizeof(c);\n    escape.lpvInBuffer=&c;\n    escape.cbOutBuffer=0;\n    escape.lpvOutBuffer=NULL;\n    FFDeviceEscape(ffDevice,&escape);\n}\n\n// If the direct rumble control is enabled, this will set the motors\n// to the desired speed.\n- (void)testMotorsLarge:(unsigned char)large small:(unsigned char)small\n{\n    FFEFFESCAPE escape;\n    char c[2];\n    \n    if(ffDevice==0) return;\n    c[0]=large;\n    c[1]=small;\n    escape.dwSize=sizeof(escape);\n    escape.dwCommand=0x01;\n    escape.cbInBuffer=sizeof(c);\n    escape.lpvInBuffer=c;\n    escape.cbOutBuffer=0;\n    escape.lpvOutBuffer=NULL;\n    FFDeviceEscape(ffDevice,&escape);\n}\n\n// Update axis GUI component\n- (void)axisChanged:(int)index newValue:(int)value\n{\n    switch(index) {\n        case 0:\n            [leftStick setPositionX:value];\n            break;\n        case 1:\n            [leftStick setPositionY:value];\n            break;\n        case 2:\n            [rightStick setPositionX:value];\n            break;\n        case 3:\n            [rightStick setPositionY:value];\n            break;\n        case 4:\n            [leftTrigger setDoubleValue:value];\n            largeMotor=value;\n//            [self testMotorsLarge:largeMotor small:smallMotor];\n            break;\n        case 5:\n            [rightTrigger setDoubleValue:value];\n            smallMotor=value;\n//            [self testMotorsLarge:largeMotor small:smallMotor];\n            break;\n        default:\n            break;\n    }\n}\n\n// Update button GUI component\n- (void)buttonChanged:(int)index newValue:(int)value\n{\n    BOOL b;\n    \n    b=value!=0;\n    switch(index) {\n        case 0:\n            [rightButtons setA:b];\n            break;\n        case 1:\n            [rightButtons setB:b];\n            break;\n        case 2:\n            [rightButtons setX:b];\n            break;\n        case 3:\n            [rightButtons setY:b];\n            break;\n        case 4:\n            [leftShoulder setPressed:b];\n            break;\n        case 5:\n            [rightShoulder setPressed:b];\n            break;\n        case 6:\n            [leftStick setPressed:b];\n            break;\n        case 7:\n            [rightStick setPressed:b];\n            break;\n        case 8:\n            [centreButtons setStart:b];\n            break;\n        case 9:\n            [centreButtons setBack:b];\n            break;\n        case 10:\n            [centreButtons setSpecific:b];\n            break;\n        case 11:\n            [digiStick setUp:b];\n            break;\n        case 12:\n            [digiStick setDown:b];\n            break;\n        case 13:\n            [digiStick setLeft:b];\n            break;\n        case 14:\n            [digiStick setRight:b];\n            break;\n        default:\n            break;\n    }\n}\n\n// Handle message from I/O Kit indicating something happened on the device\n- (void)eventQueueFired:(void*)sender withResult:(IOReturn)result\n{\n    AbsoluteTime zeroTime={0,0};\n    IOHIDEventStruct event;\n    BOOL found;\n    int i;\n    \n    if(sender!=hidQueue) return;\n    while(result==kIOReturnSuccess) {\n        result=(*hidQueue)->getNextEvent(hidQueue,&event,zeroTime,0);\n        if(result!=kIOReturnSuccess) continue;\n        // Check axis\n        for(i=0,found=FALSE;(i<6)&&(!found);i++) {\n            if(event.elementCookie==axis[i]) {\n                [self axisChanged:i newValue:event.value];\n                found=TRUE;\n            }\n        }\n        if(found) continue;\n        // Check buttons\n        for(i=0,found=FALSE;(i<15)&&(!found);i++) {\n            if(event.elementCookie==buttons[i]) {\n                [self buttonChanged:i newValue:event.value];\n                found=TRUE;\n            }\n        }\n        if(found) continue;\n        // Cookie wasn't for us?\n    }\n}\n\n// Enable input components\n- (void)inputEnable:(BOOL)enable\n{\n    [leftStickDeadzone setEnabled:enable];\n    [leftStickInvertX setEnabled:enable];\n    [leftStickInvertY setEnabled:enable];\n    [leftLinked setEnabled:enable];\n    [rightStickDeadzone setEnabled:enable];\n    [rightStickInvertX setEnabled:enable];\n    [rightStickInvertY setEnabled:enable];\n    [rightLinked setEnabled:enable];\n}\n\n// Reset GUI components\n- (void)resetDisplay\n{\n    NSBundle *bundle;\n    \n    [leftStick setPositionX:0 y:0];\n    [leftStick setPressed:FALSE];\n    [leftStick setDeadzone:0];\n    [digiStick setUp:FALSE];\n    [digiStick setDown:FALSE];\n    [digiStick setLeft:FALSE];\n    [digiStick setRight:FALSE];\n    [centreButtons setBack:FALSE];\n    [centreButtons setSpecific:FALSE];\n    [centreButtons setStart:FALSE];\n    [rightStick setPositionX:0 y:0];\n    [rightStick setPressed:FALSE];\n    [rightStick setDeadzone:0];\n    [rightButtons setA:FALSE];\n    [rightButtons setB:FALSE];\n    [rightButtons setX:FALSE];\n    [rightButtons setY:FALSE];\n    [leftShoulder setPressed:FALSE];\n    [leftTrigger setDoubleValue:0];\n    [rightShoulder setPressed:FALSE];\n    [rightTrigger setDoubleValue:0];\n    // Reset inputs\n    [leftStickDeadzone setIntValue:0];\n    [leftStickInvertX setState:NSOffState];\n    [leftStickInvertY setState:NSOffState];\n    [rightStickDeadzone setIntValue:0];\n    [rightStickInvertX setState:NSOffState];\n    [rightStickInvertY setState:NSOffState];\n    // Disable inputs\n    [self inputEnable:NO];\n    [powerOff setHidden:YES];\n    // Hide battery icon\n    bundle = [NSBundle bundleForClass:[self class]];\n    [batteryLevel setImage:[[[NSImage alloc] initByReferencingFile:[bundle pathForResource:@\"battNone\" ofType:@\"tif\"]] autorelease]];\n}\n\n// Stop using the HID device\n- (void)stopDevice\n{\n    if(registryEntry==0) return;\n//    [self testMotorsLarge:0 small:0];\n//    [self setMotorOverride:FALSE];\n//    [self updateLED:0x00];\n    if(hidQueue!=NULL) {\n        CFRunLoopSourceRef eventSource;\n        \n        (*hidQueue)->stop(hidQueue);\n        eventSource=(*hidQueue)->getAsyncEventSource(hidQueue);\n        if((eventSource!=NULL)&&CFRunLoopContainsSource(CFRunLoopGetCurrent(),eventSource,kCFRunLoopCommonModes))\n            CFRunLoopRemoveSource(CFRunLoopGetCurrent(),eventSource,kCFRunLoopCommonModes);\n        (*hidQueue)->Release(hidQueue);\n        hidQueue=NULL;\n    }\n    if(device!=NULL) {\n        (*device)->close(device);\n        device=NULL;\n    }\n    registryEntry=0;\n}\n\n// Start using a HID device\n- (void)startDevice\n{\n    int i,j;\n    CFArrayRef elements;\n    CFDictionaryRef element;\n    CFTypeRef object;\n    long number;\n    IOHIDElementCookie cookie;\n    long usage,usagePage;\n    CFRunLoopSourceRef eventSource;\n    IOReturn ret;\n    \n    [self resetDisplay];\n    i=(int)[deviceList indexOfSelectedItem];\n    if(([deviceArray count]==0)||(i==-1)) {\n        NSLog(@\"No devices found? :( device count==%i, i==%i\",(int)[deviceArray count],i);\n        return;\n    }\n    {\n        DeviceItem *item=[deviceArray objectAtIndex:i];\n        \n        device=[item hidDevice];\n        ffDevice=[item ffDevice];\n        registryEntry=[item rawDevice];\n    }\n    if((*device)->copyMatchingElements(device,NULL,&elements)!=kIOReturnSuccess) {\n        NSLog(@\"Can't get elements list\");\n        // Make note of failure?\n        return;\n    }\n    for(i=0;i<CFArrayGetCount(elements);i++) {\n        element=CFArrayGetValueAtIndex(elements,i);\n        // Get cookie\n        object=CFDictionaryGetValue(element,CFSTR(kIOHIDElementCookieKey));\n        if((object==NULL)||(CFGetTypeID(object)!=CFNumberGetTypeID())) continue;\n        if(!CFNumberGetValue((CFNumberRef)object,kCFNumberLongType,&number)) continue;\n        cookie=(IOHIDElementCookie)number;\n        // Get usage\n        object=CFDictionaryGetValue(element,CFSTR(kIOHIDElementUsageKey));\n        if((object==0)||(CFGetTypeID(object)!=CFNumberGetTypeID())) continue;\n        if(!CFNumberGetValue((CFNumberRef)object,kCFNumberLongType,&number)) continue;\n        usage=number;\n        // Get usage page\n        object=CFDictionaryGetValue(element,CFSTR(kIOHIDElementUsagePageKey));\n        if((object==0)||(CFGetTypeID(object)!=CFNumberGetTypeID())) continue;\n        if(!CFNumberGetValue((CFNumberRef)object,kCFNumberLongType,&number)) continue;\n        usagePage=number;\n        // Match up items\n        switch(usagePage) {\n            case 0x01:  // Generic Desktop\n                j=0;\n                switch(usage) {\n                    case 0x35:  // Right trigger\n                        j++;\n                    case 0x32:  // Left trigger\n                        j++;\n                    case 0x34:  // Right stick Y\n                        j++;\n                    case 0x33:  // Right stick X\n                        j++;\n                    case 0x31:  // Left stick Y\n                        j++;\n                    case 0x30:  // Left stick X\n                        axis[j]=cookie;\n                        break;\n                    default:\n                        break;\n                }\n                break;\n            case 0x09:  // Button\n                if((usage>=1)&&(usage<=15)) {\n                    // Button 1-11\n                    buttons[usage-1]=cookie;\n                }\n                break;\n            default:\n                break;\n        }\n    }\n    // Start queue\n    if((*device)->open(device,0)!=kIOReturnSuccess) {\n        NSLog(@\"Can't open device\");\n        // Make note of failure?\n        return;\n    }\n    hidQueue=(*device)->allocQueue(device);\n    if(hidQueue==NULL) {\n        NSLog(@\"Unable to allocate queue\");\n        // Error?\n        return;\n    }\n    ret=(*hidQueue)->create(hidQueue,0,32);\n    if(ret!=kIOReturnSuccess) {\n        NSLog(@\"Unable to create the queue\");\n        // Error?\n        return;\n    }\n    // Create event source\n    ret=(*hidQueue)->createAsyncEventSource(hidQueue,&eventSource);\n    if(ret!=kIOReturnSuccess) {\n        NSLog(@\"Unable to create async event source\");\n        // Error?\n        return;\n    }\n    // Set callback\n    ret=(*hidQueue)->setEventCallout(hidQueue,CallbackFunction,self,NULL);\n    if(ret!=kIOReturnSuccess) {\n        NSLog(@\"Unable to set event callback\");\n        // Error?\n        return;\n    }\n    // Add to runloop\n    CFRunLoopAddSource(CFRunLoopGetCurrent(),eventSource,kCFRunLoopCommonModes);\n    // Add some elements\n    for(i=0;i<6;i++)\n        (*hidQueue)->addElement(hidQueue,axis[i],0);\n    for(i=0;i<15;i++)\n        (*hidQueue)->addElement(hidQueue,buttons[i],0);\n    // Start\n    ret=(*hidQueue)->start(hidQueue);\n    if(ret!=kIOReturnSuccess) {\n        NSLog(@\"Unable to start queue - 0x%.8x\",ret);\n        // Error?\n        return;\n    }\n    // Read existing properties\n    {\n//        CFDictionaryRef dict=(CFDictionaryRef)IORegistryEntryCreateCFProperty(registryEntry,CFSTR(\"DeviceData\"),NULL,0);\n        CFDictionaryRef dict = (CFDictionaryRef)[GetController(GetSerialNumber(registryEntry)) retain];\n        if(dict!=0) {\n            CFBooleanRef boolValue;\n            CFNumberRef intValue;\n            \n            if(CFDictionaryGetValueIfPresent(dict,CFSTR(\"InvertLeftX\"),(void*)&boolValue)) {\n                [leftStickInvertX setState:CFBooleanGetValue(boolValue)?NSOnState:NSOffState];\n            } else NSLog(@\"No value for InvertLeftX\");\n            if(CFDictionaryGetValueIfPresent(dict,CFSTR(\"InvertLeftY\"),(void*)&boolValue)) {\n                [leftStickInvertY setState:CFBooleanGetValue(boolValue)?NSOnState:NSOffState];\n            } else NSLog(@\"No value for InvertLeftY\");\n            if(CFDictionaryGetValueIfPresent(dict,CFSTR(\"RelativeLeft\"),(void*)&boolValue)) {\n                BOOL enable=CFBooleanGetValue(boolValue);\n                [leftLinked setState:enable?NSOnState:NSOffState];\n                [leftStick setLinked:enable];\n            } else NSLog(@\"No value for RelativeLeft\");\n            if(CFDictionaryGetValueIfPresent(dict,CFSTR(\"DeadzoneLeft\"),(void*)&intValue)) {\n                UInt16 i;\n                \n                CFNumberGetValue(intValue,kCFNumberShortType,&i);\n                [leftStickDeadzone setIntValue:i];\n                [leftStick setDeadzone:i];\n            } else NSLog(@\"No value for DeadzoneLeft\");\n            if(CFDictionaryGetValueIfPresent(dict,CFSTR(\"InvertRightX\"),(void*)&boolValue)) {\n                [rightStickInvertX setState:CFBooleanGetValue(boolValue)?NSOnState:NSOffState];\n            } else NSLog(@\"No value for InvertRightX\");\n            if(CFDictionaryGetValueIfPresent(dict,CFSTR(\"InvertRightY\"),(void*)&boolValue)) {\n                [rightStickInvertY setState:CFBooleanGetValue(boolValue)?NSOnState:NSOffState];\n            } else NSLog(@\"No value for InvertRightY\");\n            if(CFDictionaryGetValueIfPresent(dict,CFSTR(\"RelativeRight\"),(void*)&boolValue)) {\n                BOOL enable=CFBooleanGetValue(boolValue);\n                [rightLinked setState:enable?NSOnState:NSOffState];\n                [rightStick setLinked:enable];\n            } else NSLog(@\"No value for RelativeRight\");\n            if(CFDictionaryGetValueIfPresent(dict,CFSTR(\"DeadzoneRight\"),(void*)&intValue)) {\n                UInt16 i;\n                \n                CFNumberGetValue(intValue,kCFNumberShortType,&i);\n                [rightStickDeadzone setIntValue:i];\n                [rightStick setDeadzone:i];\n            } else NSLog(@\"No value for DeadzoneRight\");\n            CFRelease(dict);\n        } else NSLog(@\"No settings found\");\n    }\n    // Enable GUI components\n    [self inputEnable:YES];\n    // Set LED and manual motor control\n//    [self updateLED:0x0a];\n//    [self setMotorOverride:TRUE];\n//    [self testMotorsLarge:0 small:0];\n    largeMotor=0;\n    smallMotor=0;\n    // Battery level?\n    {\n        NSBundle *bundle = [NSBundle bundleForClass:[self class]];\n        NSString *path;\n        CFTypeRef prop;\n        \n        path = nil;\n        if (IOObjectConformsTo(registryEntry, \"WirelessHIDDevice\"))\n        {\n            prop = IORegistryEntryCreateCFProperty(registryEntry, CFSTR(\"BatteryLevel\"), NULL, 0);\n            if (prop != nil)\n            {\n                unsigned char level;\n                \n                if (CFNumberGetValue(prop, kCFNumberCharType, &level))\n                    path = [bundle pathForResource:[NSString stringWithFormat:@\"batt%i\", level / 64] ofType:@\"tif\"];\n                CFRelease(prop);\n            }\n            [powerOff setHidden:NO];\n        }\n        if (path == nil)\n            path = [bundle pathForResource:@\"battNone\" ofType:@\"tif\"];\n        [batteryLevel setImage:[[[NSImage alloc] initByReferencingFile:path] autorelease]];\n    }\n}\n\n// Clear out the device lists\n- (void)deleteDeviceList\n{\n    [deviceList removeAllItems];\n    [deviceArray removeAllObjects];\n}\n\n// Update the device list from the I/O Kit\n- (void)updateDeviceList\n{\n    CFMutableDictionaryRef hidDictionary;\n    IOReturn ioReturn;\n    io_iterator_t iterator;\n    io_object_t hidDevice, parent;\n    int count;\n    DeviceItem *item;\n    \n    // Scrub old items\n    [self stopDevice];\n    [self deleteDeviceList];\n    // Add new items\n    hidDictionary=IOServiceMatching(kIOHIDDeviceKey);\n    ioReturn=IOServiceGetMatchingServices(masterPort,hidDictionary,&iterator);\n    if((ioReturn!=kIOReturnSuccess)||(iterator==0)) {\n        [deviceList addItemWithTitle:NO_ITEMS];\n        return;\n    }\n    count=0;\n    while((hidDevice=IOIteratorNext(iterator))) {\n\t\tparent = 0;\n\t\tIORegistryEntryGetParentEntry(hidDevice, kIOServicePlane, &parent);\n        BOOL deviceWired = IOObjectConformsTo(parent, \"Xbox360Peripheral\") && IOObjectConformsTo(hidDevice, \"Xbox360ControllerClass\");\n        BOOL deviceWireless = IOObjectConformsTo(hidDevice, \"WirelessHIDDevice\");\n        if ((!deviceWired) && (!deviceWireless))\n        {\n            IOObjectRelease(hidDevice);\n            continue;\n        }\n        item=[DeviceItem allocateDeviceItemForDevice:hidDevice];\n        if(item==NULL) continue;\n        // Add to item\n        NSString *name;\n        name = [item name];\n        if (name == nil)\n            name = @\"Generic Controller\";\n        [deviceList addItemWithTitle:[NSString stringWithFormat:@\"%i: %@ (%@)\", ++count, name, deviceWireless ? @\"Wireless\" : @\"Wired\"]];\n        [deviceArray addObject:item];\n    }\n    IOObjectRelease(iterator);\n    if(count==0) [deviceList addItemWithTitle:NO_ITEMS];\n    [self startDevice];\n}\n\n// Start up\n- (void)mainViewDidLoad\n{\n    io_object_t object;\n    \n    // Get master port, for accessing I/O Kit\n    IOMasterPort(MACH_PORT_NULL,&masterPort);\n    // Set up notification of USB device addition/removal\n    notifyPort=IONotificationPortCreate(masterPort);\n    notifySource=IONotificationPortGetRunLoopSource(notifyPort);\n    CFRunLoopAddSource(CFRunLoopGetCurrent(),notifySource,kCFRunLoopCommonModes);\n    // Prepare other fields\n    deviceArray=[[NSMutableArray arrayWithCapacity:1] retain];\n    device=NULL;\n    hidQueue=NULL;\n    // Activate callbacks\n        // Wired\n    IOServiceAddMatchingNotification(notifyPort, kIOFirstMatchNotification, IOServiceMatching(kIOUSBDeviceClassName), callbackHandleDevice, self, &onIteratorWired);\n    callbackHandleDevice(self, onIteratorWired);\n    IOServiceAddMatchingNotification(notifyPort, kIOTerminatedNotification, IOServiceMatching(kIOUSBDeviceClassName), callbackHandleDevice, self, &offIteratorWired);\n    while((object = IOIteratorNext(offIteratorWired)) != 0)\n        IOObjectRelease(object);\n        // Wireless\n    IOServiceAddMatchingNotification(notifyPort, kIOFirstMatchNotification, IOServiceMatching(\"WirelessHIDDevice\"), callbackHandleDevice, self, &onIteratorWireless);\n    callbackHandleDevice(self, onIteratorWireless);\n    IOServiceAddMatchingNotification(notifyPort, kIOTerminatedNotification, IOServiceMatching(\"WirelessHIDDevice\"), callbackHandleDevice, self, &offIteratorWireless);\n    while((object = IOIteratorNext(offIteratorWireless)) != 0)\n        IOObjectRelease(object);\n}\n\n// Shut down\n- (void)dealloc\n{\n    int i;\n    DeviceItem *item;\n    FFEFFESCAPE escape;\n    unsigned char c;\n\n    // Remove notification source\n    IOObjectRelease(onIteratorWired);\n    IOObjectRelease(onIteratorWireless);\n    IOObjectRelease(offIteratorWired);\n    IOObjectRelease(offIteratorWireless);\n    CFRunLoopRemoveSource(CFRunLoopGetCurrent(),notifySource,kCFRunLoopCommonModes);\n    CFRunLoopSourceInvalidate(notifySource);\n    IONotificationPortDestroy(notifyPort);\n    // Release device and info\n    [self stopDevice];\n    for (i = 0; i < [deviceArray count]; i++)\n    {\n        item = [deviceArray objectAtIndex:i];\n        if ([item ffDevice] == 0)\n            continue;\n        c = 0x06 + (i % 0x04);\n        escape.dwSize = sizeof(escape);\n        escape.dwCommand = 0x02;\n        escape.cbInBuffer = sizeof(c);\n        escape.lpvInBuffer = &c;\n        escape.cbOutBuffer = 0;\n        escape.lpvOutBuffer = NULL;\n        FFDeviceEscape([item ffDevice], &escape);\n    }\n    [self deleteDeviceList];\n    [deviceArray release];\n    // Close master port\n    mach_port_deallocate(mach_task_self(),masterPort);\n    // Done\n    [super dealloc];\n}\n\n- (mach_port_t)masterPort\n{\n    return masterPort;\n}\n\n// Handle selection from drop down menu\n- (void)selectDevice:(id)sender\n{\n    [self startDevice];\n}\n\n// Handle changing a setting\n- (void)changeSetting:(id)sender\n{\n    CFDictionaryRef dict;\n    CFStringRef keys[8];\n    CFTypeRef values[8];\n    UInt16 i;\n    \n    // Set keys and values\n    keys[0]=CFSTR(\"InvertLeftX\");\n    values[0]=([leftStickInvertX state]==NSOnState)?kCFBooleanTrue:kCFBooleanFalse;\n    keys[1]=CFSTR(\"InvertLeftY\");\n    values[1]=([leftStickInvertY state]==NSOnState)?kCFBooleanTrue:kCFBooleanFalse;\n    keys[2]=CFSTR(\"InvertRightX\");\n    values[2]=([rightStickInvertX state]==NSOnState)?kCFBooleanTrue:kCFBooleanFalse;\n    keys[3]=CFSTR(\"InvertRightY\");\n    values[3]=([rightStickInvertY state]==NSOnState)?kCFBooleanTrue:kCFBooleanFalse;\n    keys[4]=CFSTR(\"DeadzoneLeft\");\n    i=[leftStickDeadzone doubleValue];\n    values[4]=CFNumberCreate(NULL,kCFNumberShortType,&i);\n    keys[5]=CFSTR(\"DeadzoneRight\");\n    i=[rightStickDeadzone doubleValue];\n    values[5]=CFNumberCreate(NULL,kCFNumberShortType,&i);\n    keys[6]=CFSTR(\"RelativeLeft\");\n    values[6]=([leftLinked state]==NSOnState)?kCFBooleanTrue:kCFBooleanFalse;\n    keys[7]=CFSTR(\"RelativeRight\");\n    values[7]=([rightLinked state]==NSOnState)?kCFBooleanTrue:kCFBooleanFalse;\n    // Create dictionary\n    dict=CFDictionaryCreate(NULL,(const void**)keys,(const void**)values,sizeof(keys)/sizeof(keys[0]),&kCFTypeDictionaryKeyCallBacks,&kCFTypeDictionaryValueCallBacks);\n    // Set property\n    IORegistryEntrySetCFProperties(registryEntry, dict);\n    SetController(GetSerialNumber(registryEntry), (NSDictionary*)dict);\n    // Update UI\n    [leftStick setLinked:([leftLinked state]==NSOnState)];\n    [leftStick setDeadzone:[leftStickDeadzone doubleValue]];\n    [rightStick setLinked:([rightLinked state]==NSOnState)];\n    [rightStick setDeadzone:[rightStickDeadzone doubleValue]];\n}\n\n// Handle I/O Kit device add/remove\n- (void)handleDeviceChange\n{\n    // Ideally, this function would make a note of the controller's Location ID, then\n    // reselect it when the list is updated, if it's still in the list.\n    [self updateDeviceList];\n}\n\n- (IBAction)showDeviceList:(id)sender\n{\n    [deviceLister showWithOwner:self];\n}\n\n- (IBAction)powerOff:(id)sender\n{\n    FFEFFESCAPE escape;\n    \n    if(ffDevice==0) return;\n    escape.dwSize=sizeof(escape);\n    escape.dwCommand=0x03;\n    escape.cbInBuffer=0;\n    escape.lpvInBuffer=NULL;\n    escape.cbOutBuffer=0;\n    escape.lpvOutBuffer=NULL;\n    FFDeviceEscape(ffDevice,&escape);\n}\n\n@end\n"
  },
  {
    "path": "Pref360Control/Pref360Control_Prefix.pch",
    "content": "//\n// Prefix header for all source files of the 'Pref360Control' target in the 'Pref360Control' project.\n//\n\n#ifdef __OBJC__\n    #import <Foundation/Foundation.h>\n    #import <AppKit/AppKit.h>\n#endif\n"
  },
  {
    "path": "Pref360Control/version.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>BuildVersion</key>\n\t<string>328</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n\t<key>ProductBuildVersion</key>\n\t<string>7K571</string>\n\t<key>ProjectName</key>\n\t<string>PreferencePaneTemplate</string>\n\t<key>SourceVersion</key>\n\t<string>120000</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Readme.rtf",
    "content": "{\\rtf1\\ansi\\ansicpg1252\\cocoartf1187\\cocoasubrtf340\n\\cocoascreenfonts1{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;}\n{\\colortbl;\\red255\\green255\\blue255;}\n{\\*\\listtable{\\list\\listtemplateid1\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid1\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid1}\n{\\list\\listtemplateid2\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid101\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid2}}\n{\\*\\listoverridetable{\\listoverride\\listid1\\listoverridecount0\\ls1}{\\listoverride\\listid2\\listoverridecount0\\ls2}}\n\\paperw12240\\paperh15840\\margl1440\\margr1440\\vieww9000\\viewh8400\\viewkind0\n\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\n\n\\f0\\b\\fs36 \\cf0 XBox 360 Controller driver for Mac OS X\n\\b0\\fs24 \\\nCopyright (C) 2006-2013 Colin Munro\\\n{\\field{\\*\\fldinst{HYPERLINK \"http://tattiebogle.net/index.php/ProjectRoot/Xbox360Controller\"}}{\\fldrslt http://tattiebogle.net/index.php/ProjectRoot/Xbox360Controller}}\\\n\\\n\n\\b About\n\\b0 \\\nThis driver supports the Microsoft Xbox 360 controller, including access to rumble motors and LEDs, on the Mac OS X platform. It includes a plugin for the Apple Force Feedback Framework so some games will be able to activate them, along with a Preference Pane with which allows you to test everything is installed correctly. Both wired 360 controllers connected via USB, and wireless 360 controllers connected via the Wireless Gaming Receiver for Windows, are supported.\\\n\\\n\n\\b Licence\n\\b0 \\\nThis driver is licensed under the GNU Public License. A copy of this license is included in the distribution file, please inspect it before using the binary or source.\\\n\\\n\n\\b Installation\n\\b0 \\\nSimply complete the installer package to install the driver. The driver will recommend you restart - if you do not, the driver will only be usable if the controller is already connected or connected within a minute after the installer completes. If you are interested in installing as a developer please see below.\\\n\\\n\n\\b Usage\n\\b0 \\\nThe driver exposes a standard game pad with a number of standard controls, so any game that supports gaming devices should work. In some cases this may need an update from the manufacturer of the game or a patched version. The Preference Pane uses the standard Mac OS X Frameworks for accessing HID devices and accessing Force Feedback capabilities, so should be a good test that the installation is functional.\\\n\\\n\n\\b Known Problems/Todo\n\\b0 \\\n\\pard\\tx220\\tx720\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\li720\\fi-720\\pardirnatural\n\\ls1\\ilvl0\\cf0 {\\listtext\t\\'95\t}The rumble motor test on the triggers of the Preference Pane bypasses the Force Feedback Framework functionality, so isn't actually testing it. It really should, for completeness (and it'd help adding support for more complex effects) - this test is now disabled in the normal release anyway\\\n{\\listtext\t\\'95\t}Force Feedback plugin may make effects run slower (e.g. longer time) than they should\\\n{\\listtext\t\\'95\t}Driver probably needs to be more resilient to errors and odd cases\\\n{\\listtext\t\\'95\t}Better Force Feedback \"emulation\"\\\n{\\listtext\t\\'95\t}Extra settings? E.g. trigger deadzones, control remapping.\\\n{\\listtext\t\\'95\t}Someone has requested old Xbox Controller support too.\\\n\\pard\\tx220\\tx720\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\li720\\fi-720\\pardirnatural\n\\ls2\\ilvl0\n\\b \\cf0 \\\nContact me\n\\b0 \\\n\\pard\\tx0\\tx220\\tx660\\tx720\\tx740\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\n\\ls2\\ilvl0\\cf0 Please feel free to contact me with any comments, questions and so on using the form at the URL at the top of the file.\\\n\\\n\\pard\\tx0\\tx220\\tx660\\tx720\\tx740\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\n\\ls2\\ilvl0\n\\b \\cf0 Developer info\n\\b0 \\\nAnything below this probably doesn't affect end users, so you can stop reading now if you just want to use the driver.\\\n\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\n\\cf0 \\\n\n\\b Building\n\\b0 \\\n(This section does not yet discuss the source of the wireless drivers)\\\nThe distribution currently consists of 3 projects - one for the driver (implemented in C++, as an I/O Kit C++ class), one for the force feedback support plugin (implemented in C, as an I/O Kit COM plugin) and one for the Preference Pane (implemented in Objective C as a preference pane plugin). Ideally these 3 targets should be in the same project, but I've not worked on this yet.\\\n\\\nTo build, use the standard Xcode build for Deployment on each of the 3 projects. Build Feedback360 before 360Controller, as the 360Controller project includes a script to copy the Feedback360 bundle to the correct place in the .kext to make it work.\\\n\\\nTo debug the driver, sudo cp -R 360Controller.kext /tmp/ to assign the correct properties - note that the Force Feedback plugin only seems to be found by OSX if the driver is in /System/Library/Extensions so I could only debug it in place.\\\n\\\nTo test the Preference Pane, just double-click the resulting file.\\\n\\\n\n\\b Debugging\n\\b0 \\\nMost of the debugging I did was via printing out text. In 360Controller, you can use IOLog(), and the output will appear in system.log. In Feedback360 normal fprintf(stderr,...), and the output will appear on the console of whatever application is attempting to use Force Feedback. In Pref360Control NSLog() works as it's an Objective C program, and will output to the console of the Preferences application.\\\n\\\n\n\\b Installer\n\\b0 \\\nIncluded is an installer project for Iceberg. Download Iceberg at {\\field{\\*\\fldinst{HYPERLINK \"http://s.sudre.free.fr/Software/Iceberg.html\"}}{\\fldrslt http://s.sudre.free.fr/Software/Iceberg.html}}\\\n\\\n\n\\b Other information\n\\b0 \\\nI wrote the driver from scratch, using Apple documentation and drivers simply as a reference and not basing it upon any existing source. As such, some things may be done strangely or incorrectly, so excuse any weirdness. I've also tried to include comments to explain generally what's going on :)\\\n}"
  },
  {
    "path": "Wireless360Controller/IOKitDriver.pbproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 39;\n\tobjects = {\n\t\t06AA1265FFB2107B11CA28AA = {\n\t\t\tbuildSettings = {\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = YES;\n\t\t\t\tGCC_GENERATE_DEBUGGING_SYMBOLS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tOPTIMIZATION_CFLAGS = \"-O0\";\n\t\t\t\tZERO_LINK = YES;\n\t\t\t};\n\t\t\tisa = PBXBuildStyle;\n\t\t\tname = Development;\n\t\t};\n\t\t06AA1266FFB2107B11CA28AA = {\n\t\t\tbuildSettings = {\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = NO;\n\t\t\t\tZERO_LINK = NO;\n\t\t\t};\n\t\t\tisa = PBXBuildStyle;\n\t\t\tname = Deployment;\n\t\t};\n//060\n//061\n//062\n//063\n//064\n//080\n//081\n//082\n//083\n//084\n\t\t089C1669FE841209C02AAC07 = {\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tbuildStyles = (\n\t\t\t\t06AA1265FFB2107B11CA28AA,\n\t\t\t\t06AA1266FFB2107B11CA28AA,\n\t\t\t);\n\t\t\thasScannedForEncodings = 1;\n\t\t\tisa = PBXProject;\n\t\t\tmainGroup = 089C166AFE841209C02AAC07;\n\t\t\tprojectDirPath = \"\";\n\t\t\ttargets = (\n\t\t\t\t32D94FC30562CBF700B6AF17,\n\t\t\t);\n\t\t};\n\t\t089C166AFE841209C02AAC07 = {\n\t\t\tchildren = (\n\t\t\t\t247142CAFF3F8F9811CA285C,\n\t\t\t\t8DA80CCF06AD972A00E5AC22,\n\t\t\t\t089C167CFE841241C02AAC07,\n\t\t\t\t19C28FB6FE9D52B211CA2CBB,\n\t\t\t);\n\t\t\tisa = PBXGroup;\n\t\t\tname = \"«PROJECTNAME»\";\n\t\t\trefType = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t089C167CFE841241C02AAC07 = {\n\t\t\tchildren = (\n\t\t\t\t32D94FCF0562CBF700B6AF17,\n\t\t\t\t089C167DFE841241C02AAC07,\n\t\t\t);\n\t\t\tisa = PBXGroup;\n\t\t\tname = Resources;\n\t\t\trefType = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t089C167DFE841241C02AAC07 = {\n\t\t\tchildren = (\n\t\t\t\t089C167EFE841241C02AAC07,\n\t\t\t);\n\t\t\tisa = PBXVariantGroup;\n\t\t\tname = InfoPlist.strings;\n\t\t\trefType = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t089C167EFE841241C02AAC07 = {\n\t\t\tfileEncoding = 10;\n\t\t\tisa = PBXFileReference;\n\t\t\tlastKnownFileType = text.plist.strings;\n\t\t\tname = English;\n\t\t\tpath = English.lproj/InfoPlist.strings;\n\t\t\trefType = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n//080\n//081\n//082\n//083\n//084\n//190\n//191\n//192\n//193\n//194\n\t\t19C28FB6FE9D52B211CA2CBB = {\n\t\t\tchildren = (\n\t\t\t\t32D94FD00562CBF700B6AF17,\n\t\t\t);\n\t\t\tisa = PBXGroup;\n\t\t\tname = Products;\n\t\t\trefType = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n//190\n//191\n//192\n//193\n//194\n//1A0\n//1A1\n//1A2\n//1A3\n//1A4\n\t\t1A224C3EFF42367911CA2CB7 = {\n\t\t\tfileEncoding = 4;\n\t\t\tisa = PBXFileReference;\n\t\t\tlastKnownFileType = file;\n\t\t\tpath = \"«PROJECTNAMEASIDENTIFIER».h\";\n\t\t\trefType = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1A224C3FFF42367911CA2CB7 = {\n\t\t\tfileEncoding = 4;\n\t\t\tisa = PBXFileReference;\n\t\t\tlastKnownFileType = file;\n\t\t\tpath = \"«PROJECTNAMEASIDENTIFIER».cpp\";\n\t\t\trefType = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n//1A0\n//1A1\n//1A2\n//1A3\n//1A4\n//240\n//241\n//242\n//243\n//244\n\t\t247142CAFF3F8F9811CA285C = {\n\t\t\tchildren = (\n\t\t\t\t1A224C3EFF42367911CA2CB7,\n\t\t\t\t1A224C3FFF42367911CA2CB7,\n\t\t\t);\n\t\t\tisa = PBXGroup;\n\t\t\tname = Source;\n\t\t\tpath = \"\";\n\t\t\trefType = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n//240\n//241\n//242\n//243\n//244\n//320\n//321\n//322\n//323\n//324\n\t\t32D94FC30562CBF700B6AF17 = {\n\t\t\tbuildPhases = (\n\t\t\t\t32D94FC40562CBF700B6AF17,\n\t\t\t\t32D94FC50562CBF700B6AF17,\n\t\t\t\t32D94FC70562CBF700B6AF17,\n\t\t\t\t32D94FC90562CBF700B6AF17,\n\t\t\t\t32D94FCB0562CBF700B6AF17,\n\t\t\t\t32D94FCC0562CBF700B6AF17,\n\t\t\t\t32D94FCD0562CBF700B6AF17,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tbuildSettings = {\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(SYSTEM_LIBRARY_DIR)/Extensions\";\n\t\t\t\tMODULE_NAME = \"com.yourcompany.driver.«PROJECTNAMEASIDENTIFIER»\";\n\t\t\t\tMODULE_VERSION = 1.0.0d1;\n\t\t\t\tPRODUCT_NAME = \"«PROJECTNAME»\";\n\t\t\t\tWRAPPER_EXTENSION = kext;\n\t\t\t};\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tisa = PBXNativeTarget;\n\t\t\tname = \"«PROJECTNAME»\";\n\t\t\tproductInstallPath = \"$(SYSTEM_LIBRARY_DIR)/Extensions\";\n\t\t\tproductName = \"«PROJECTNAME»\";\n\t\t\tproductReference = 32D94FD00562CBF700B6AF17;\n\t\t\tproductType = \"com.apple.product-type.kernel-extension.iokit\";\n\t\t};\n\t\t32D94FC40562CBF700B6AF17 = {\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"script=\\\"${SYSTEM_DEVELOPER_DIR}/ProjectBuilder Extras/Kernel Extension Support/KEXTPreprocess\\\";\\nif [ -x \\\"$script\\\" ]; then\\n    . \\\"$script\\\"\\nfi\";\n\t\t};\n\t\t32D94FC50562CBF700B6AF17 = {\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t32D94FC60562CBF700B6AF17,\n\t\t\t);\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t32D94FC60562CBF700B6AF17 = {\n\t\t\tfileRef = 1A224C3EFF42367911CA2CB7;\n\t\t\tisa = PBXBuildFile;\n\t\t\tsettings = {\n\t\t\t};\n\t\t};\n\t\t32D94FC70562CBF700B6AF17 = {\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t32D94FC80562CBF700B6AF17,\n\t\t\t);\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t32D94FC80562CBF700B6AF17 = {\n\t\t\tfileRef = 089C167DFE841241C02AAC07;\n\t\t\tisa = PBXBuildFile;\n\t\t\tsettings = {\n\t\t\t};\n\t\t};\n\t\t32D94FC90562CBF700B6AF17 = {\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t32D94FCA0562CBF700B6AF17,\n\t\t\t);\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t32D94FCA0562CBF700B6AF17 = {\n\t\t\tfileRef = 1A224C3FFF42367911CA2CB7;\n\t\t\tisa = PBXBuildFile;\n\t\t\tsettings = {\n\t\t\t\tATTRIBUTES = (\n\t\t\t\t);\n\t\t\t};\n\t\t};\n\t\t32D94FCB0562CBF700B6AF17 = {\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t32D94FCC0562CBF700B6AF17 = {\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tisa = PBXRezBuildPhase;\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t32D94FCD0562CBF700B6AF17 = {\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"script=\\\"${SYSTEM_DEVELOPER_DIR}/ProjectBuilder Extras/Kernel Extension Support/KEXTPostprocess\\\";\\nif [ -x \\\"$script\\\" ]; then\\n    . \\\"$script\\\"\\nfi\";\n\t\t};\n\t\t32D94FCF0562CBF700B6AF17 = {\n\t\t\tisa = PBXFileReference;\n\t\t\tlastKnownFileType = text.xml;\n\t\t\tpath = Info.plist;\n\t\t\trefType = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t32D94FD00562CBF700B6AF17 = {\n\t\t\texplicitFileType = wrapper.cfbundle;\n\t\t\tincludeInIndex = 0;\n\t\t\tisa = PBXFileReference;\n\t\t\tpath = \"«PROJECTNAME».kext\";\n\t\t\trefType = 3;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n//320\n//321\n//322\n//323\n//324\n//8D0\n//8D1\n//8D2\n//8D3\n//8D4\n\t\t8DA80CCF06AD972A00E5AC22 = {\n\t\t\tisa = PBXFileReference;\n\t\t\tlastKnownFileType = wrapper.framework;\n\t\t\tname = Kernel.framework;\n\t\t\tpath = /System/Library/Frameworks/Kernel.framework;\n\t\t\trefType = 0;\n\t\t\tsourceTree = \"<absolute>\";\n\t\t};\n\t};\n\trootObject = 089C1669FE841209C02AAC07;\n}\n"
  },
  {
    "path": "Wireless360Controller/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.mice.driver.Wireless360Controller</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundlePackageType</key>\n\t<string>KEXT</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0.0d12</string>\n\t<key>IOKitPersonalities</key>\n\t<dict>\n\t\t<key>Wireless360Controller</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.Wireless360Controller</string>\n\t\t\t<key>IOCFPlugInTypes</key>\n\t\t\t<dict>\n\t\t\t\t<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>\n\t\t\t\t<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>\n\t\t\t</dict>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>Wireless360Controller</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65536</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>WirelessDevice</string>\n\t\t\t<key>Wireless360Device</key>\n\t\t\t<integer>0</integer>\n\t\t</dict>\n\t</dict>\n\t<key>OSBundleLibraries</key>\n\t<dict>\n\t\t<key>com.apple.iokit.IOHIDFamily</key>\n\t\t<string>1.2</string>\n\t\t<key>com.apple.kpi.iokit</key>\n\t\t<string>8.0.0</string>\n\t\t<key>com.apple.kpi.libkern</key>\n\t\t<string>8.0.0</string>\n\t\t<key>com.apple.kpi.mach</key>\n\t\t<string>8.0.0</string>\n\t\t<key>com.mice.driver.WirelessGamingReceiver</key>\n\t\t<string>1.0.0d1</string>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "Wireless360Controller/Wireless360Controller.cpp",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    Wireless360Controller.cpp - main source of the standard wireless controller driver\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#include <IOKit/IOLib.h>\n#include \"Wireless360Controller.h\"\n#include \"../WirelessGamingReceiver/WirelessDevice.h\"\n#include \"../360Controller/ControlStruct.h\"\n#include \"../360Controller/xbox360hid.h\"\n\n#define kDriverSettingKey       \"DeviceData\"\n\nOSDefineMetaClassAndStructors(Wireless360Controller, WirelessHIDDevice)\n#define super WirelessHIDDevice\n\nstatic inline XBox360_SShort getAbsolute(XBox360_SShort value)\n{\n    XBox360_SShort reverse;\n    \n#ifdef __LITTLE_ENDIAN__\n    reverse=value;\n#elif __BIG_ENDIAN__\n    reverse=((value&0xFF00)>>8)|((value&0x00FF)<<8);\n#else\n#error Unknown CPU byte order\n#endif\n    return (reverse<0)?~reverse:reverse;\n}\n\nbool Wireless360Controller::init(OSDictionary *propTable)\n{\n    bool res = super::init(propTable);\n    \n    // Default settings\n    invertLeftX=invertLeftY=FALSE;\n    invertRightX=invertRightY=FALSE;\n    deadzoneLeft=deadzoneRight=0;\n    relativeLeft=relativeRight=FALSE;\n    readSettings();\n    \n    // Done\n    return res;\n}\n\n// Read the settings from the registry\nvoid Wireless360Controller::readSettings(void)\n{\n    OSDictionary *dataDictionary;\n    OSBoolean *value;\n    OSNumber *number;\n    \n    dataDictionary=OSDynamicCast(OSDictionary,getProperty(kDriverSettingKey));\n    if(dataDictionary==NULL) return;\n    value=OSDynamicCast(OSBoolean,dataDictionary->getObject(\"InvertLeftX\"));\n    if(value!=NULL) invertLeftX=value->getValue();\n    value=OSDynamicCast(OSBoolean,dataDictionary->getObject(\"InvertLeftY\"));\n    if(value!=NULL) invertLeftY=value->getValue();\n    value=OSDynamicCast(OSBoolean,dataDictionary->getObject(\"InvertRightX\"));\n    if(value!=NULL) invertRightX=value->getValue();\n    value=OSDynamicCast(OSBoolean,dataDictionary->getObject(\"InvertRightY\"));\n    if(value!=NULL) invertRightY=value->getValue();\n    number=OSDynamicCast(OSNumber,dataDictionary->getObject(\"DeadzoneLeft\"));\n    if(number!=NULL) deadzoneLeft=number->unsigned32BitValue();\n    number=OSDynamicCast(OSNumber,dataDictionary->getObject(\"DeadzoneRight\"));\n    if(number!=NULL) deadzoneRight=number->unsigned32BitValue();\n    value=OSDynamicCast(OSBoolean,dataDictionary->getObject(\"RelativeLeft\"));\n    if(value!=NULL) relativeLeft=value->getValue();\n    value=OSDynamicCast(OSBoolean,dataDictionary->getObject(\"RelativeRight\"));\n    if(value!=NULL) relativeRight=value->getValue();\n    /*\n    IOLog(\"Xbox360ControllerClass preferences loaded:\\n  invertLeft X: %s, Y: %s\\n   invertRight X: %s, Y:%s\\n  deadzone Left: %d, Right: %d\\n\\n\",\n            invertLeftX?\"True\":\"False\",invertLeftY?\"True\":\"False\",\n            invertRightX?\"True\":\"False\",invertRightY?\"True\":\"False\",\n            deadzoneLeft,deadzoneRight);\n    */\n}\n\n// Adjusts the report for any settings specified by the user\nvoid Wireless360Controller::fiddleReport(unsigned char *data, int length)\n{\n    XBOX360_IN_REPORT *report = (XBOX360_IN_REPORT*)data;\n    \n    if (invertLeftX)\n        report->left.x = ~report->left.x;\n    if (!invertLeftY)\n        report->left.y = ~report->left.y;\n    if (invertRightX)\n        report->right.x = ~report->right.x;\n    if (!invertRightY)\n        report->right.y = ~report->right.y;\n        \n    if (deadzoneLeft != 0)\n    {\n        if (relativeLeft)\n        {\n            if ((getAbsolute(report->left.x) < deadzoneLeft) && (getAbsolute(report->left.y) < deadzoneLeft))\n            {\n                report->left.x = 0;\n                report->left.y = 0;\n            }\n        }\n        else\n        {\n            if (getAbsolute(report->left.x) < deadzoneLeft)\n                report->left.x = 0;\n            if (getAbsolute(report->left.y) < deadzoneLeft)\n                report->left.y = 0;\n        }\n    }\n    if (deadzoneRight != 0)\n    {\n        if (relativeRight)\n        {\n            if ((getAbsolute(report->right.x) < deadzoneRight) && (getAbsolute(report->right.y) < deadzoneRight))\n            {\n                report->right.x = 0;\n                report->right.y = 0;\n            }\n        }\n        else\n        {\n            if (getAbsolute(report->right.x) < deadzoneRight)\n                report->right.x = 0;\n            if (getAbsolute(report->right.y) < deadzoneRight)\n                report->right.y = 0;\n        }\n    }\n}\n\nvoid Wireless360Controller::receivedHIDupdate(unsigned char *data, int length)\n{\n    fiddleReport(data, length);\n    super::receivedHIDupdate(data, length);\n}\n\nvoid Wireless360Controller::SetRumbleMotors(unsigned char large, unsigned char small)\n{\n    char buf[] = {0x00, 0x01, 0x0f, 0xc0, 0x00, large, small, 0x00, 0x00, 0x00, 0x00, 0x00};\n    WirelessDevice *device;\n    \n    device = OSDynamicCast(WirelessDevice, getProvider());\n    if (device != NULL)\n        device->SendPacket(buf, sizeof(buf));\n}\n    \nIOReturn Wireless360Controller::setReport(IOMemoryDescriptor *report, IOHIDReportType reportType, IOOptionBits options)\n{\n    char data[2];\n    \n//    IOLog(\"setReport(%p, %d, %d)\\n\", report, reportType, options);\n    if (report->readBytes(0, data, 2) < 2)\n        return kIOReturnUnsupported;\n        \n    // Rumble\n    if (data[0] == 0x00)\n    {\n        if ((data[1] != report->getLength()) || (data[1] != 0x04))\n            return kIOReturnUnsupported;\n        report->readBytes(2, data, 2);\n        SetRumbleMotors(data[0], data[1]);\n        return kIOReturnSuccess;\n    }\n    \n    return super::setReport(report, reportType, options);\n}\n\nIOReturn Wireless360Controller::newReportDescriptor(IOMemoryDescriptor ** descriptor ) const\n{\n    IOBufferMemoryDescriptor *buffer;\n    \n    buffer = IOBufferMemoryDescriptor::inTaskWithOptions(kernel_task, 0, sizeof(ReportDescriptor));\n    if (buffer == NULL)\n        return kIOReturnNoResources;\n    buffer->writeBytes(0, ReportDescriptor, sizeof(ReportDescriptor));\n    *descriptor = buffer;\n    return kIOReturnSuccess;\n}\n\n// Called by the userspace IORegistryEntrySetCFProperties function\nIOReturn Wireless360Controller::setProperties(OSObject *properties)\n{\n    OSDictionary *dictionary;\n    \n    dictionary=OSDynamicCast(OSDictionary,properties);\n    if(dictionary!=NULL) {\n        setProperty(kDriverSettingKey,dictionary);\n        readSettings();\n        return kIOReturnSuccess;\n    } else return kIOReturnBadArgument;\n}\n\n// Get info\n\nOSString* Wireless360Controller::newManufacturerString() const\n{\n    return OSString::withCString(\"Microsoft\");\n}\n\nOSNumber* Wireless360Controller::newPrimaryUsageNumber() const\n{\n    // Gamepad\n    return OSNumber::withNumber(0x05, 8);\n}\n\nOSNumber* Wireless360Controller::newPrimaryUsagePageNumber() const\n{\n    // Generic Desktop\n    return OSNumber::withNumber(0x01, 8);\n}\n\nOSNumber* Wireless360Controller::newProductIDNumber() const\n{\n    return OSNumber::withNumber((unsigned long long)0x28e, 16);\n}\n\nOSString* Wireless360Controller::newProductString() const\n{\n    return OSString::withCString(\"Wireless 360 Controller\");\n}\n\nOSString* Wireless360Controller::newTransportString() const\n{\n    return OSString::withCString(\"Wireless\");\n}\n\nOSNumber* Wireless360Controller::newVendorIDNumber() const\n{\n    return OSNumber::withNumber((unsigned long long)0x45e, 16);\n}\n\n"
  },
  {
    "path": "Wireless360Controller/Wireless360Controller.h",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    Wireless360Controller.h - declaration of the wireless controller driver class\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#ifndef __WIRELESS360CONTROLLER_H__\n#define __WIRELESS360CONTROLLER_H__\n\n#include \"../WirelessGamingReceiver/WirelessHIDDevice.h\"\n\nclass Wireless360Controller : public WirelessHIDDevice\n{\n    OSDeclareDefaultStructors(Wireless360Controller);\npublic:\n    bool init(OSDictionary *propTable = NULL);\n\n    void SetRumbleMotors(unsigned char large, unsigned char small);\n    \n    IOReturn setReport(IOMemoryDescriptor *report, IOHIDReportType reportType, IOOptionBits options);\n    IOReturn newReportDescriptor(IOMemoryDescriptor ** descriptor ) const;\n\n    IOReturn setProperties(OSObject *properties);\n\n    virtual OSString* newManufacturerString() const;\n    virtual OSNumber* newPrimaryUsageNumber() const;\n    virtual OSNumber* newPrimaryUsagePageNumber() const;\n    virtual OSNumber* newProductIDNumber() const;\n    virtual OSString* newProductString() const;\n    virtual OSString* newTransportString() const;\n    virtual OSNumber* newVendorIDNumber() const;\nprotected:\n    void readSettings(void);\n    void receivedHIDupdate(unsigned char *data, int length);\n\n    // Settings\n    bool invertLeftX,invertLeftY;\n    bool invertRightX,invertRightY;\n    short deadzoneLeft,deadzoneRight;\n    bool relativeLeft,relativeRight;\nprivate:\n    void fiddleReport(unsigned char *data, int length);\n};\n\n#endif // __WIRELESS360CONTROLLER_H__\n"
  },
  {
    "path": "Wireless360Controller/Wireless360Controller.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t32D94FC60562CBF700B6AF17 /* Wireless360Controller.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A224C3EFF42367911CA2CB7 /* Wireless360Controller.h */; };\n\t\t32D94FC80562CBF700B6AF17 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C167DFE841241C02AAC07 /* InfoPlist.strings */; };\n\t\t32D94FCA0562CBF700B6AF17 /* Wireless360Controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A224C3FFF42367911CA2CB7 /* Wireless360Controller.cpp */; settings = {ATTRIBUTES = (); }; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t089C167EFE841241C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\t1A224C3EFF42367911CA2CB7 /* Wireless360Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Wireless360Controller.h; sourceTree = \"<group>\"; };\n\t\t1A224C3FFF42367911CA2CB7 /* Wireless360Controller.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Wireless360Controller.cpp; sourceTree = \"<group>\"; };\n\t\t32D94FCF0562CBF700B6AF17 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t32D94FD00562CBF700B6AF17 /* Wireless360Controller.kext */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Wireless360Controller.kext; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t8DA8362C06AD9B9200E5AC22 /* Kernel.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kernel.framework; path = /System/Library/Frameworks/Kernel.framework; sourceTree = \"<absolute>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t32D94FCB0562CBF700B6AF17 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t089C166AFE841209C02AAC07 /* Wireless360Controller */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t247142CAFF3F8F9811CA285C /* Source */,\n\t\t\t\t8DA8362C06AD9B9200E5AC22 /* Kernel.framework */,\n\t\t\t\t089C167CFE841241C02AAC07 /* Resources */,\n\t\t\t\t19C28FB6FE9D52B211CA2CBB /* Products */,\n\t\t\t);\n\t\t\tname = Wireless360Controller;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t089C167CFE841241C02AAC07 /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t32D94FCF0562CBF700B6AF17 /* Info.plist */,\n\t\t\t\t089C167DFE841241C02AAC07 /* InfoPlist.strings */,\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t19C28FB6FE9D52B211CA2CBB /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t32D94FD00562CBF700B6AF17 /* Wireless360Controller.kext */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t247142CAFF3F8F9811CA285C /* Source */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1A224C3EFF42367911CA2CB7 /* Wireless360Controller.h */,\n\t\t\t\t1A224C3FFF42367911CA2CB7 /* Wireless360Controller.cpp */,\n\t\t\t);\n\t\t\tname = Source;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t32D94FC50562CBF700B6AF17 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t32D94FC60562CBF700B6AF17 /* Wireless360Controller.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t32D94FC30562CBF700B6AF17 /* Wireless360Controller */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 1DEB91D908733DB10010E9CD /* Build configuration list for PBXNativeTarget \"Wireless360Controller\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t32D94FC50562CBF700B6AF17 /* Headers */,\n\t\t\t\t32D94FC70562CBF700B6AF17 /* Resources */,\n\t\t\t\t32D94FC90562CBF700B6AF17 /* Sources */,\n\t\t\t\t32D94FCB0562CBF700B6AF17 /* Frameworks */,\n\t\t\t\t32D94FCC0562CBF700B6AF17 /* Rez */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Wireless360Controller;\n\t\t\tproductInstallPath = \"$(SYSTEM_LIBRARY_DIR)/Extensions\";\n\t\t\tproductName = Wireless360Controller;\n\t\t\tproductReference = 32D94FD00562CBF700B6AF17 /* Wireless360Controller.kext */;\n\t\t\tproductType = \"com.apple.product-type.kernel-extension.iokit\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t089C1669FE841209C02AAC07 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tbuildConfigurationList = 1DEB91DD08733DB10010E9CD /* Build configuration list for PBXProject \"Wireless360Controller\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 1;\n\t\t\tknownRegions = (\n\t\t\t\tEnglish,\n\t\t\t\tJapanese,\n\t\t\t\tFrench,\n\t\t\t\tGerman,\n\t\t\t);\n\t\t\tmainGroup = 089C166AFE841209C02AAC07 /* Wireless360Controller */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t32D94FC30562CBF700B6AF17 /* Wireless360Controller */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t32D94FC70562CBF700B6AF17 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t32D94FC80562CBF700B6AF17 /* InfoPlist.strings in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXRezBuildPhase section */\n\t\t32D94FCC0562CBF700B6AF17 /* Rez */ = {\n\t\t\tisa = PBXRezBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXRezBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t32D94FC90562CBF700B6AF17 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t32D94FCA0562CBF700B6AF17 /* Wireless360Controller.cpp in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t089C167DFE841241C02AAC07 /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t089C167EFE841241C02AAC07 /* English */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t1DEB91DA08733DB10010E9CD /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1.0.0d12;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = YES;\n\t\t\t\tGCC_MODEL_TUNING = G5;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(SYSTEM_LIBRARY_DIR)/Extensions\";\n\t\t\t\tMODULE_NAME = com.mice.driver.Wireless360Controller;\n\t\t\t\tMODULE_VERSION = 1.0.0d11;\n\t\t\t\tPRODUCT_NAME = Wireless360Controller;\n\t\t\t\tWRAPPER_EXTENSION = kext;\n\t\t\t\tZERO_LINK = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1DEB91DB08733DB10010E9CD /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCURRENT_PROJECT_VERSION = 1.0.0d12;\n\t\t\t\tGCC_GENERATE_DEBUGGING_SYMBOLS = NO;\n\t\t\t\tGCC_MODEL_TUNING = G5;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(SYSTEM_LIBRARY_DIR)/Extensions\";\n\t\t\t\tMODULE_NAME = com.mice.driver.Wireless360Controller;\n\t\t\t\tMODULE_VERSION = 1.0.0d11;\n\t\t\t\tPRODUCT_NAME = Wireless360Controller;\n\t\t\t\tWRAPPER_EXTENSION = kext;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t1DEB91DE08733DB10010E9CD /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"Developer ID Application: Colin Munro\";\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.5;\n\t\t\t\tPREBINDING = NO;\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\tSDKROOT = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1DEB91DF08733DB10010E9CD /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_32_64_BIT)\";\n\t\t\t\tCODE_SIGN_IDENTITY = \"Developer ID Application: Colin Munro\";\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.5;\n\t\t\t\tPREBINDING = NO;\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\tSDKROOT = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t1DEB91D908733DB10010E9CD /* Build configuration list for PBXNativeTarget \"Wireless360Controller\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1DEB91DA08733DB10010E9CD /* Debug */,\n\t\t\t\t1DEB91DB08733DB10010E9CD /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t1DEB91DD08733DB10010E9CD /* Build configuration list for PBXProject \"Wireless360Controller\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1DEB91DE08733DB10010E9CD /* Debug */,\n\t\t\t\t1DEB91DF08733DB10010E9CD /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 089C1669FE841209C02AAC07 /* Project object */;\n}\n"
  },
  {
    "path": "Wireless360Controller/version.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>BuildVersion</key>\n\t<string>12</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n\t<key>ProductBuildVersion</key>\n\t<string>7K571</string>\n\t<key>ProjectName</key>\n\t<string>DevToolsWizardTemplates</string>\n\t<key>SourceVersion</key>\n\t<string>3870000</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "WirelessGamingReceiver/English.lproj/InfoPlist.strings",
    "content": "﻿/* Localized versions of Info.plist keys */\n\nNSHumanReadableCopyright = \"© Colin Munro, 2007-11\";"
  },
  {
    "path": "WirelessGamingReceiver/IOKitDriver.pbproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 39;\n\tobjects = {\n\t\t06AA1265FFB2107B11CA28AA = {\n\t\t\tbuildSettings = {\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = YES;\n\t\t\t\tGCC_GENERATE_DEBUGGING_SYMBOLS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tOPTIMIZATION_CFLAGS = \"-O0\";\n\t\t\t\tZERO_LINK = YES;\n\t\t\t};\n\t\t\tisa = PBXBuildStyle;\n\t\t\tname = Development;\n\t\t};\n\t\t06AA1266FFB2107B11CA28AA = {\n\t\t\tbuildSettings = {\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = NO;\n\t\t\t\tZERO_LINK = NO;\n\t\t\t};\n\t\t\tisa = PBXBuildStyle;\n\t\t\tname = Deployment;\n\t\t};\n//060\n//061\n//062\n//063\n//064\n//080\n//081\n//082\n//083\n//084\n\t\t089C1669FE841209C02AAC07 = {\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tbuildStyles = (\n\t\t\t\t06AA1265FFB2107B11CA28AA,\n\t\t\t\t06AA1266FFB2107B11CA28AA,\n\t\t\t);\n\t\t\thasScannedForEncodings = 1;\n\t\t\tisa = PBXProject;\n\t\t\tmainGroup = 089C166AFE841209C02AAC07;\n\t\t\tprojectDirPath = \"\";\n\t\t\ttargets = (\n\t\t\t\t32D94FC30562CBF700B6AF17,\n\t\t\t);\n\t\t};\n\t\t089C166AFE841209C02AAC07 = {\n\t\t\tchildren = (\n\t\t\t\t247142CAFF3F8F9811CA285C,\n\t\t\t\t8DA80CCF06AD972A00E5AC22,\n\t\t\t\t089C167CFE841241C02AAC07,\n\t\t\t\t19C28FB6FE9D52B211CA2CBB,\n\t\t\t);\n\t\t\tisa = PBXGroup;\n\t\t\tname = \"«PROJECTNAME»\";\n\t\t\trefType = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t089C167CFE841241C02AAC07 = {\n\t\t\tchildren = (\n\t\t\t\t32D94FCF0562CBF700B6AF17,\n\t\t\t\t089C167DFE841241C02AAC07,\n\t\t\t);\n\t\t\tisa = PBXGroup;\n\t\t\tname = Resources;\n\t\t\trefType = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t089C167DFE841241C02AAC07 = {\n\t\t\tchildren = (\n\t\t\t\t089C167EFE841241C02AAC07,\n\t\t\t);\n\t\t\tisa = PBXVariantGroup;\n\t\t\tname = InfoPlist.strings;\n\t\t\trefType = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t089C167EFE841241C02AAC07 = {\n\t\t\tfileEncoding = 10;\n\t\t\tisa = PBXFileReference;\n\t\t\tlastKnownFileType = text.plist.strings;\n\t\t\tname = English;\n\t\t\tpath = English.lproj/InfoPlist.strings;\n\t\t\trefType = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n//080\n//081\n//082\n//083\n//084\n//190\n//191\n//192\n//193\n//194\n\t\t19C28FB6FE9D52B211CA2CBB = {\n\t\t\tchildren = (\n\t\t\t\t32D94FD00562CBF700B6AF17,\n\t\t\t);\n\t\t\tisa = PBXGroup;\n\t\t\tname = Products;\n\t\t\trefType = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n//190\n//191\n//192\n//193\n//194\n//1A0\n//1A1\n//1A2\n//1A3\n//1A4\n\t\t1A224C3EFF42367911CA2CB7 = {\n\t\t\tfileEncoding = 4;\n\t\t\tisa = PBXFileReference;\n\t\t\tlastKnownFileType = file;\n\t\t\tpath = \"«PROJECTNAMEASIDENTIFIER».h\";\n\t\t\trefType = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1A224C3FFF42367911CA2CB7 = {\n\t\t\tfileEncoding = 4;\n\t\t\tisa = PBXFileReference;\n\t\t\tlastKnownFileType = file;\n\t\t\tpath = \"«PROJECTNAMEASIDENTIFIER».cpp\";\n\t\t\trefType = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n//1A0\n//1A1\n//1A2\n//1A3\n//1A4\n//240\n//241\n//242\n//243\n//244\n\t\t247142CAFF3F8F9811CA285C = {\n\t\t\tchildren = (\n\t\t\t\t1A224C3EFF42367911CA2CB7,\n\t\t\t\t1A224C3FFF42367911CA2CB7,\n\t\t\t);\n\t\t\tisa = PBXGroup;\n\t\t\tname = Source;\n\t\t\tpath = \"\";\n\t\t\trefType = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n//240\n//241\n//242\n//243\n//244\n//320\n//321\n//322\n//323\n//324\n\t\t32D94FC30562CBF700B6AF17 = {\n\t\t\tbuildPhases = (\n\t\t\t\t32D94FC40562CBF700B6AF17,\n\t\t\t\t32D94FC50562CBF700B6AF17,\n\t\t\t\t32D94FC70562CBF700B6AF17,\n\t\t\t\t32D94FC90562CBF700B6AF17,\n\t\t\t\t32D94FCB0562CBF700B6AF17,\n\t\t\t\t32D94FCC0562CBF700B6AF17,\n\t\t\t\t32D94FCD0562CBF700B6AF17,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tbuildSettings = {\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(SYSTEM_LIBRARY_DIR)/Extensions\";\n\t\t\t\tMODULE_NAME = \"com.yourcompany.driver.«PROJECTNAMEASIDENTIFIER»\";\n\t\t\t\tMODULE_VERSION = 1.0.0d1;\n\t\t\t\tPRODUCT_NAME = \"«PROJECTNAME»\";\n\t\t\t\tWRAPPER_EXTENSION = kext;\n\t\t\t};\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tisa = PBXNativeTarget;\n\t\t\tname = \"«PROJECTNAME»\";\n\t\t\tproductInstallPath = \"$(SYSTEM_LIBRARY_DIR)/Extensions\";\n\t\t\tproductName = \"«PROJECTNAME»\";\n\t\t\tproductReference = 32D94FD00562CBF700B6AF17;\n\t\t\tproductType = \"com.apple.product-type.kernel-extension.iokit\";\n\t\t};\n\t\t32D94FC40562CBF700B6AF17 = {\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"script=\\\"${SYSTEM_DEVELOPER_DIR}/ProjectBuilder Extras/Kernel Extension Support/KEXTPreprocess\\\";\\nif [ -x \\\"$script\\\" ]; then\\n    . \\\"$script\\\"\\nfi\";\n\t\t};\n\t\t32D94FC50562CBF700B6AF17 = {\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t32D94FC60562CBF700B6AF17,\n\t\t\t);\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t32D94FC60562CBF700B6AF17 = {\n\t\t\tfileRef = 1A224C3EFF42367911CA2CB7;\n\t\t\tisa = PBXBuildFile;\n\t\t\tsettings = {\n\t\t\t};\n\t\t};\n\t\t32D94FC70562CBF700B6AF17 = {\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t32D94FC80562CBF700B6AF17,\n\t\t\t);\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t32D94FC80562CBF700B6AF17 = {\n\t\t\tfileRef = 089C167DFE841241C02AAC07;\n\t\t\tisa = PBXBuildFile;\n\t\t\tsettings = {\n\t\t\t};\n\t\t};\n\t\t32D94FC90562CBF700B6AF17 = {\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t32D94FCA0562CBF700B6AF17,\n\t\t\t);\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t32D94FCA0562CBF700B6AF17 = {\n\t\t\tfileRef = 1A224C3FFF42367911CA2CB7;\n\t\t\tisa = PBXBuildFile;\n\t\t\tsettings = {\n\t\t\t\tATTRIBUTES = (\n\t\t\t\t);\n\t\t\t};\n\t\t};\n\t\t32D94FCB0562CBF700B6AF17 = {\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t32D94FCC0562CBF700B6AF17 = {\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tisa = PBXRezBuildPhase;\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t32D94FCD0562CBF700B6AF17 = {\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"script=\\\"${SYSTEM_DEVELOPER_DIR}/ProjectBuilder Extras/Kernel Extension Support/KEXTPostprocess\\\";\\nif [ -x \\\"$script\\\" ]; then\\n    . \\\"$script\\\"\\nfi\";\n\t\t};\n\t\t32D94FCF0562CBF700B6AF17 = {\n\t\t\tisa = PBXFileReference;\n\t\t\tlastKnownFileType = text.xml;\n\t\t\tpath = Info.plist;\n\t\t\trefType = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t32D94FD00562CBF700B6AF17 = {\n\t\t\texplicitFileType = wrapper.cfbundle;\n\t\t\tincludeInIndex = 0;\n\t\t\tisa = PBXFileReference;\n\t\t\tpath = \"«PROJECTNAME».kext\";\n\t\t\trefType = 3;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n//320\n//321\n//322\n//323\n//324\n//8D0\n//8D1\n//8D2\n//8D3\n//8D4\n\t\t8DA80CCF06AD972A00E5AC22 = {\n\t\t\tisa = PBXFileReference;\n\t\t\tlastKnownFileType = wrapper.framework;\n\t\t\tname = Kernel.framework;\n\t\t\tpath = /System/Library/Frameworks/Kernel.framework;\n\t\t\trefType = 0;\n\t\t\tsourceTree = \"<absolute>\";\n\t\t};\n\t};\n\trootObject = 089C1669FE841209C02AAC07;\n}\n"
  },
  {
    "path": "WirelessGamingReceiver/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.mice.driver.WirelessGamingReceiver</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundlePackageType</key>\n\t<string>KEXT</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0.0d12</string>\n\t<key>IOKitPersonalities</key>\n\t<dict>\n\t\t<key>WirelessGamingReceiverForWindows</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.WirelessGamingReceiver</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>1817</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>1118</integer>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>WirelessGamingReceiver</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t</dict>\n\t\t<key>WirelessGamingReceiverForWindowsAlternate</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string>com.mice.driver.WirelessGamingReceiver</string>\n\t\t\t<key>idProduct</key>\n\t\t\t<integer>657</integer>\n\t\t\t<key>idVendor</key>\n\t\t\t<integer>1118</integer>\n\t\t\t<key>IOClass</key>\n\t\t\t<string>WirelessGamingReceiver</string>\n\t\t\t<key>IOKitDebug</key>\n\t\t\t<integer>65535</integer>\n\t\t\t<key>IOProviderClass</key>\n\t\t\t<string>IOUSBDevice</string>\n\t\t</dict>\n\t</dict>\n\t<key>OSBundleCompatibleVersion</key>\n\t<string>1.0.0d1</string>\n\t<key>OSBundleLibraries</key>\n\t<dict>\n\t\t<key>com.apple.iokit.IOHIDFamily</key>\n\t\t<string>1.2</string>\n\t\t<key>com.apple.iokit.IOUSBFamily</key>\n\t\t<string>1.8</string>\n\t\t<key>com.apple.kpi.iokit</key>\n\t\t<string>8.0.0</string>\n\t\t<key>com.apple.kpi.libkern</key>\n\t\t<string>8.0.0</string>\n\t\t<key>com.apple.kpi.mach</key>\n\t\t<string>8.0.0</string>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "WirelessGamingReceiver/WirelessDevice.cpp",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    WirelessDevice.cpp - generic Wireless 360 device driver\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#include \"WirelessDevice.h\"\n#include \"WirelessGamingReceiver.h\"\n\nOSDefineMetaClassAndStructors(WirelessDevice, IOService)\n#define super IOService\n\n// Initialise wireless device\nbool WirelessDevice::init(OSDictionary *dictionary)\n{\n    if (!super::init(dictionary))\n        return false;\n    index = -1;\n    function = NULL;\n    return true;\n}\n\n// Checks if there's any data for us\nbool WirelessDevice::IsDataAvailable(void)\n{\n    if (index == -1)\n        return false;\n    WirelessGamingReceiver *receiver = OSDynamicCast(WirelessGamingReceiver, getProvider());\n    if (receiver == NULL)\n        return false;\n    return receiver->IsDataQueued(index);\n}\n\n// Gets the next item from our buffer\nIOMemoryDescriptor* WirelessDevice::NextPacket(void)\n{\n    if (index == -1)\n        return NULL;\n    WirelessGamingReceiver *receiver = OSDynamicCast(WirelessGamingReceiver, getProvider());\n    if (receiver == NULL)\n        return NULL;\n    return receiver->ReadBuffer(index);\n}\n\n// Sends a buffer for this controller\nvoid WirelessDevice::SendPacket(const void *data, size_t length)\n{\n    if (index == -1)\n        return;\n    WirelessGamingReceiver *receiver = OSDynamicCast(WirelessGamingReceiver, getProvider());\n    if (receiver == NULL)\n        return;\n    receiver->QueueWrite(index, data, (UInt32)length);\n}\n\n// Registers a callback function\nvoid WirelessDevice::RegisterWatcher(void *target, WirelessDeviceWatcher function, void *parameter)\n{\n    this->target = target;\n    this->parameter = parameter;\n    this->function = function;\n    if ((function != NULL) && IsDataAvailable())\n        NewData();\n}\n\n// For internal use, sets this instances index on the wireless gaming receiver\nvoid WirelessDevice::SetIndex(int i)\n{\n    index = i;\n}\n\n// Called when new data arrives\nvoid WirelessDevice::NewData(void)\n{\n    if (function != NULL)\n        function(target, this, parameter);\n}\n\n// Gets the location ID for this device\nOSNumber* WirelessDevice::newLocationIDNumber() const\n{\n    OSNumber *owner;\n    UInt32 location = 0;\n    \n    if (index == -1)\n        return NULL;\n    WirelessGamingReceiver *receiver = OSDynamicCast(WirelessGamingReceiver, getProvider());\n    if (receiver == NULL)\n        return NULL;\n    owner = receiver->newLocationIDNumber();\n    if (owner != NULL)\n    {\n        location = owner->unsigned32BitValue() + 1 + index;\n        owner->release();\n    }\n    return OSNumber::withNumber(location, 32);\n}\n"
  },
  {
    "path": "WirelessGamingReceiver/WirelessDevice.h",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    WirelessDevice.h - declaration of the base wireless 360 device driver class\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#ifndef __WIRELESSDEVICE_H__\n#define __WIRELESSDEVICE_H__\n\n#include <IOKit/IOService.h>\n\nclass WirelessDevice;\n\ntypedef void (*WirelessDeviceWatcher)(void *target, WirelessDevice *sender, void *parameter);\n\nclass WirelessDevice : public IOService\n{\n    OSDeclareDefaultStructors(WirelessDevice);\npublic:\n    bool init(OSDictionary *dictionary = 0);\n\n    // Controller interface\n    bool IsDataAvailable(void);\n    IOMemoryDescriptor* NextPacket(void);\n    \n    void SendPacket(const void *data, size_t length);\n    \n    void RegisterWatcher(void *target, WirelessDeviceWatcher function, void *parameter);\n\n    OSNumber* newLocationIDNumber() const;\nprivate:\n    friend class WirelessGamingReceiver;\n    void SetIndex(int i);\n    void NewData(void);\nprivate:\n    int index;\n    // callback\n    void *target, *parameter;\n    WirelessDeviceWatcher function;\n};\n\n#endif // __WIRELESSDEVICE_H__\n"
  },
  {
    "path": "WirelessGamingReceiver/WirelessGamingReceiver.cpp",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    WirelessGamingReceiver.cpp - main source of the wireless receiver driver\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#include \"WirelessGamingReceiver.h\"\n#include \"WirelessDevice.h\"\n#include \"devices.h\"\n\n//#define PROTOCOL_DEBUG\n\nOSDefineMetaClassAndStructors(WirelessGamingReceiver, IOService)\n\n// Holds data for asynchronous reads\ntypedef struct\n{\n    int index;\n    IOBufferMemoryDescriptor *buffer;\n}\nWGRREAD;\n\n// Get maximum packet size for a pipe\nstatic UInt32 GetMaxPacketSize(IOUSBPipe *pipe)\n{\n    const IOUSBEndpointDescriptor *ed;\n    \n    ed=pipe->GetEndpointDescriptor();\n    if(ed==NULL) return 0;\n    else return ed->wMaxPacketSize;\n}\n\n// Start device\nbool WirelessGamingReceiver::start(IOService *provider)\n{\n    const IOUSBConfigurationDescriptor *cd;\n    IOUSBFindInterfaceRequest interfaceRequest;\n    IOUSBFindEndpointRequest pipeRequest;\n    IOUSBInterface *interface;\n    int iConnection, iOther, i;\n    \n    if (!IOService::start(provider))\n    {\n//        IOLog(\"start - superclass failed\\n\");\n        return false;\n    }\n\n    device = OSDynamicCast(IOUSBDevice, provider);\n    if (device == NULL)\n    {\n//        IOLog(\"start - invalid provider\\n\");\n        goto fail;\n    }\n\n    // Check for configurations\n    if (device->GetNumConfigurations() < 1)\n    {\n        device = NULL;\n//        IOLog(\"start - device has no configurations!\\n\");\n        goto fail;\n    }\n    \n    // Set configuration\n    cd = device->GetFullConfigurationDescriptor(0);\n    if (cd == NULL)\n    {\n        device = NULL;\n//        IOLog(\"start - couldn't get configuration descriptor\\n\");\n        goto fail;\n    }\n    \n    if (!device->open(this))\n    {\n        device = NULL;\n//        IOLog(\"start - failed to open device\\n\");\n        goto fail;\n    }\n    if (device->SetConfiguration(this, cd->bConfigurationValue, true) != kIOReturnSuccess)\n    {\n//        IOLog(\"start - unable to set configuration\\n\");\n        goto fail;\n    }\n        \n    for (i = 0; i < WIRELESS_CONNECTIONS; i++)\n    {\n        connections[i].controller = NULL;\n        connections[i].controllerIn = NULL;\n        connections[i].controllerOut = NULL;\n        connections[i].other = NULL;\n        connections[i].otherIn = NULL;\n        connections[i].otherOut = NULL;\n        connections[i].inputArray = NULL;\n        connections[i].service = NULL;\n        connections[i].controllerStarted = false;\n    }\n    \n    pipeRequest.interval = 0;\n    pipeRequest.maxPacketSize = 0;\n    pipeRequest.type = kUSBInterrupt;\n    interfaceRequest.bInterfaceClass = kIOUSBFindInterfaceDontCare;\n    interfaceRequest.bInterfaceSubClass = kIOUSBFindInterfaceDontCare;\n    interfaceRequest.bInterfaceProtocol = kIOUSBFindInterfaceDontCare;\n    interfaceRequest.bAlternateSetting = 0;\n    interface = NULL;\n    iConnection = 0;\n    iOther = 0;\n    while ((interface = device->FindNextInterface(interface, &interfaceRequest)) != NULL)\n    {\n        switch(interface->GetInterfaceProtocol())\n        {\n            case 129:   // Controller\n                if (!interface->open(this))\n                {\n//                    IOLog(\"start: Failed to open control interface\\n\");\n                    goto fail;\n                }\n                connections[iConnection].controller = interface;\n                pipeRequest.direction = kUSBIn;\n                connections[iConnection].controllerIn = interface->FindNextPipe(NULL, &pipeRequest);\n                if (connections[iConnection].controllerIn == NULL)\n                {\n//                    IOLog(\"start: Failed to open control input pipe\\n\");\n                    goto fail;\n                }\n                else\n                    connections[iConnection].controllerIn->retain();\n                pipeRequest.direction = kUSBOut;\n                connections[iConnection].controllerOut = interface->FindNextPipe(NULL, &pipeRequest);\n                if (connections[iConnection].controllerOut == NULL)\n                {\n//                    IOLog(\"start: Failed to open control output pipe\\n\");\n                    goto fail;\n                }\n                else\n                    connections[iConnection].controllerOut->retain();\n                iConnection++;\n                break;\n            case 130:   // It is a mystery\n                if (!interface->open(this))\n                {\n//                    IOLog(\"start: Failed to open mystery interface\\n\");\n                    goto fail;\n                }\n                connections[iOther].other = interface;\n                pipeRequest.direction = kUSBIn;\n                connections[iOther].otherIn = interface->FindNextPipe(NULL, &pipeRequest);\n                if (connections[iOther].otherIn == NULL)\n                {\n//                    IOLog(\"start: Failed to open mystery input pipe\\n\");\n                    goto fail;\n                }\n                else\n                    connections[iOther].otherIn->retain();\n                pipeRequest.direction = kUSBOut;\n                connections[iOther].otherOut = interface->FindNextPipe(NULL, &pipeRequest);\n                if (connections[iOther].otherOut == NULL)\n                {\n//                    IOLog(\"start: Failed to open mystery output pipe\\n\");\n                    goto fail;\n                }\n                else\n                    connections[iOther].otherOut->retain();\n                iOther++;\n                break;\n            default:\n//                IOLog(\"start: Ignoring interface (protocol %d)\\n\", interface->GetInterfaceProtocol());\n                break;\n        }\n    }\n    \n    if (iConnection != iOther)\n        IOLog(\"start - interface mismatch?\\n\");\n    connectionCount = iConnection;\n    \n    for (i = 0; i < connectionCount; i++)\n    {\n        connections[i].inputArray = OSArray::withCapacity(5);\n        if (connections[i].inputArray == NULL)\n        {\n//            IOLog(\"start: Failed to allocate packet buffer %d\\n\", i);\n            goto fail;\n        }\n        if (!QueueRead(i))\n        {\n//            IOLog(\"start: Failed to start read %d\\n\", i);\n            goto fail;\n        }\n    }\n    \n//    IOLog(\"start: Transform and roll out (%d interfaces)\\n\", connectionCount);\n    return true;\n    \nfail:\n    ReleaseAll();\n    return false;\n}\n\n// Stop the device\nvoid WirelessGamingReceiver::stop(IOService *provider)\n{\n    ReleaseAll();\n    IOService::stop(provider);\n}\n\n// Handle message from provider\nIOReturn WirelessGamingReceiver::message(UInt32 type,IOService *provider,void *argument)\n{\n//    IOLog(\"Message\\n\");\n/*\n    switch(type) {\n        case kIOMessageServiceIsTerminated:\n        case kIOMessageServiceIsRequestingClose:\n            if(device->isOpen(this)) ReleaseAll();\n            return kIOReturnSuccess;\n        default:\n        */\n            return IOService::message(type,provider,argument);\n//    }\n}\n\n// Queue a read on a controller\nbool WirelessGamingReceiver::QueueRead(int index)\n{\n    IOUSBCompletion complete;\n    IOReturn err;\n    WGRREAD *data;\n    \n    data = (WGRREAD*)IOMalloc(sizeof(WGRREAD));\n    if (data == NULL)\n        return false;\n    data->index = index;\n    data->buffer = IOBufferMemoryDescriptor::inTaskWithOptions(kernel_task, 0, GetMaxPacketSize(connections[index].controllerIn));\n    if (data->buffer == NULL)\n    {\n        IOFree(data, sizeof(WGRREAD));\n        return false;\n    }\n\n    complete.target = this;\n    complete.action = _ReadComplete;\n    complete.parameter = data;\n    \n    err = connections[index].controllerIn->Read(data->buffer, 0, 0, data->buffer->getLength(), &complete);\n    if (err == kIOReturnSuccess)\n        return true;\n        \n    data->buffer->release();\n    IOFree(data, sizeof(WGRREAD));\n    \n//    IOLog(\"read - failed to start (0x%.8x)\\n\", err);\n    return false;\n}\n\n// Handle a completed read on a controller\nvoid WirelessGamingReceiver::ReadComplete(void *parameter, IOReturn status, UInt32 bufferSizeRemaining)\n{\n    WGRREAD *data = (WGRREAD*)parameter;\n    bool reread = true;\n    \n    switch (status)\n    {\n        case kIOReturnOverrun:\n//            IOLog(\"read - kIOReturnOverrun, clearing stall\\n\");\n            connections[data->index].controllerIn->ClearStall();\n            // fall through\n        case kIOReturnSuccess:\n            ProcessMessage(data->index, (unsigned char*)data->buffer->getBytesNoCopy(), (int)data->buffer->getLength() - bufferSizeRemaining);\n            break;\n        case kIOReturnNotResponding:\n//            IOLog(\"read - kIOReturnNotResponding\\n\");\n            // fall through\n        default:\n            reread = false;\n            break;\n    }\n    \n    int newIndex = data->index;\n    data->buffer->release();\n    IOFree(data, sizeof(WGRREAD));\n    \n    if (reread)\n        QueueRead(newIndex);\n}\n\n// Queue an asynchronous write on a controller\nbool WirelessGamingReceiver::QueueWrite(int index, const void *bytes, UInt32 length)\n{\n    IOBufferMemoryDescriptor *outBuffer;\n    IOUSBCompletion complete;\n    IOReturn err;\n    \n    outBuffer = IOBufferMemoryDescriptor::inTaskWithOptions(kernel_task, 0, length);\n    if (outBuffer == NULL)\n    {\n//        IOLog(\"send - unable to allocate buffer\\n\");\n        return false;\n    }\n    outBuffer->writeBytes(0, bytes, length);\n    \n    complete.target = this;\n    complete.action = _WriteComplete;\n    complete.parameter = outBuffer;\n    \n    err = connections[index].controllerOut->Write(outBuffer, 0, 0, length, &complete);\n    if (err == kIOReturnSuccess)\n        return true;\n    else\n    {\n//        IOLog(\"send - failed to start (0x%.8x)\\n\",err);\n        return false;\n    }\n}\n\n// Handle a completed write on a controller\nvoid WirelessGamingReceiver::WriteComplete(void *parameter,IOReturn status,UInt32 bufferSizeRemaining)\n{\n    IOMemoryDescriptor *memory=(IOMemoryDescriptor*)parameter;\n    if(status!=kIOReturnSuccess) {\n        IOLog(\"write - Error writing: 0x%.8x\\n\",status);\n    }\n    memory->release();\n}\n\n// Release any allocated objects\nvoid WirelessGamingReceiver::ReleaseAll(void)\n{\n    int i;\n    \n    for (i = 0; i < connectionCount; i++)\n    {\n        if (connections[i].service != NULL)\n        {\n            connections[i].service->terminate(kIOServiceRequired);\n            connections[i].service->detachAll(gIOServicePlane);\n            connections[i].service->release();\n            connections[i].service = NULL;\n        }\n        if (connections[i].controllerIn != NULL)\n        {\n            connections[i].controllerIn->Abort();\n            connections[i].controllerIn->release();\n            connections[i].controllerIn = NULL;\n        }\n        if (connections[i].controllerOut != NULL)\n        {\n            connections[i].controllerOut->Abort();\n            connections[i].controllerOut->release();\n            connections[i].controllerOut = NULL;\n        }\n        if (connections[i].controller != NULL)\n        {\n            connections[i].controller->close(this);\n            connections[i].controller = NULL;\n        }\n        if (connections[i].otherIn != NULL)\n        {\n            connections[i].otherIn->Abort();\n            connections[i].otherIn->release();\n            connections[i].otherIn = NULL;\n        }\n        if (connections[i].otherOut != NULL)\n        {\n            connections[i].otherOut->Abort();\n            connections[i].otherOut->release();\n            connections[i].otherOut = NULL;\n        }\n        if (connections[i].other != NULL)\n        {\n            connections[i].other->close(this);\n            connections[i].other = NULL;\n        }\n        if (connections[i].inputArray != NULL)\n        {\n            connections[i].inputArray->release();\n            connections[i].inputArray = NULL;\n        }\n        connections[i].controllerStarted = false;\n    }\n    if (device != NULL)\n    {\n        device->close(this);\n        device = NULL;\n    }\n}\n\n// Static wrapper for read notifications\nvoid WirelessGamingReceiver::_ReadComplete(void *target, void *parameter, IOReturn status, UInt32 bufferSizeRemaining)\n{\n    if (target != NULL)\n        ((WirelessGamingReceiver*)target)->ReadComplete(parameter, status, bufferSizeRemaining);\n}\n\n// Static wrapper for write notifications\nvoid WirelessGamingReceiver::_WriteComplete(void *target, void *parameter, IOReturn status, UInt32 bufferSizeRemaining)\n{\n    if (target != NULL)\n        ((WirelessGamingReceiver*)target)->WriteComplete(parameter, status, bufferSizeRemaining);\n}\n\n// Processes a message for a controller\nvoid WirelessGamingReceiver::ProcessMessage(int index, const unsigned char *data, int length)\n{\n#ifdef PROTOCOL_DEBUG\n    char s[1024];\n    int i;\n    \n    for (i = 0; i < length; i++)\n    {\n        s[(i * 2) + 0] = \"0123456789ABCDEF\"[(data[i] & 0xF0) >> 4];\n        s[(i * 2) + 1] = \"0123456789ABCDEF\"[data[i] & 0x0F];\n    }\n    s[i * 2] = '\\0';\n    IOLog(\"Got data (%d, %d bytes): %s\\n\", index, length, s);\n#endif\n    // Handle device connections\n    if ((length == 2) && (data[0] == 0x08))\n    {\n        if (data[1] == 0x00)\n        {\n            // Device disconnected\n#ifdef PROTOCOL_DEBUG\n            IOLog(\"process: Device detached\\n\");\n#endif\n            if (connections[index].service != NULL)\n            {\n                connections[index].service->SetIndex(-1);\n                if (connections[index].controllerStarted)\n                    connections[index].service->terminate(kIOServiceRequired | kIOServiceSynchronous);\n                connections[index].service->detach(this);\n                connections[index].service->release();\n                connections[index].service = NULL;\n                connections[index].controllerStarted = false;\n            }\n        }\n        else\n        {\n            // Device connected\n#ifdef PROTOCOL_DEBUG\n            IOLog(\"process: Attempting to add new device\\n\");\n#endif\n            if (connections[index].service == NULL)\n            {\n                bool ready;\n                int i, j;\n                IOMemoryDescriptor *data;\n                char c;\n                \n                ready = false;\n                j = connections[index].inputArray->getCount();\n                for (i = 0; !ready && (i < j); i++)\n                {\n                    data = OSDynamicCast(IOMemoryDescriptor, connections[index].inputArray->getObject(i));\n                    data->readBytes(1, &c, 1);\n                    if (c == 0x0f)\n                        ready = true;\n                }\n                InstantiateService(index);\n                if (ready)\n                {\n#ifdef PROTOCOL_DEBUG\n                    IOLog(\"Registering wireless device\");\n#endif\n                    connections[index].controllerStarted = true;\n                    connections[index].service->registerService();\n                }\n            }\n        }\n        return;\n    }\n    \n    // Add anything else to the queue\n    IOMemoryDescriptor *copy = IOBufferMemoryDescriptor::inTaskWithOptions(kernel_task, 0, length);\n    copy->writeBytes(0, data, length);\n    connections[index].inputArray->setObject(copy);\n    if (connections[index].service == NULL)\n        InstantiateService(index);\n    if (connections[index].service != NULL)\n    {\n        connections[index].service->NewData();\n        if (!connections[index].controllerStarted)\n        {\n            char c;\n            \n            copy->readBytes(1, &c, 1);\n            if (c == 0x0f)\n            {\n#ifdef PROTOCOL_DEBUG\n                IOLog(\"Registering wireless device\");\n#endif\n                connections[index].controllerStarted = true;\n                connections[index].service->registerService();\n            }\n        }\n    }\n    copy->release();\n}\n\n// Create a new node for the attached controller\nvoid WirelessGamingReceiver::InstantiateService(int index)\n{\n    connections[index].service = new WirelessDevice;\n    if (connections[index].service != NULL)\n    {\n        const OSString *keys[1] = {\n            OSString::withCString(kIOWirelessDeviceType),\n        };\n        const OSObject *objects[1] = {\n            OSNumber::withNumber((unsigned long long)0, 32),\n        };\n        OSDictionary *dictionary = OSDictionary::withObjects(objects, keys, 1, 0);\n        if (connections[index].service->init(dictionary))\n        {\n            connections[index].service->attach(this);\n            connections[index].service->SetIndex(index);\n//            connections[index].service->registerService();\n//            IOLog(\"process: Device attached\\n\");\n            if (IsDataQueued(index))\n                connections[index].service->NewData();\n\t\t\tconnections[index].service->start(this);\n        }\n        else\n        {\n            connections[index].service->release();\n            connections[index].service = NULL;\n//            IOLog(\"process: Device attach failure\\n\");\n        }\n    }\n}\n\n// Check a controller's queue\nbool WirelessGamingReceiver::IsDataQueued(int index)\n{\n    return connections[index].inputArray->getCount() > 0;\n}\n\n// Read a controller's queue\nIOMemoryDescriptor* WirelessGamingReceiver::ReadBuffer(int index)\n{\n    IOMemoryDescriptor *data;\n    \n    data = OSDynamicCast(IOMemoryDescriptor, connections[index].inputArray->getObject(0));\n    if (data != NULL)\n        data->retain();\n    connections[index].inputArray->removeObject(0);\n    return data;\n}\n\n// Get our location ID\nOSNumber* WirelessGamingReceiver::newLocationIDNumber() const\n{\n    OSNumber *number;\n    UInt32    location = 0;\n    \n    if (device)\n    {\n        if ((number = OSDynamicCast(OSNumber, device->getProperty(\"locationID\"))))\n        {\n            location = number->unsigned32BitValue();\n        }\n        else \n        {\n            // Make up an address\n            if ((number = OSDynamicCast(OSNumber, device->getProperty(\"USB Address\"))))\n                location |= number->unsigned8BitValue() << 24;\n                \n            if ((number = OSDynamicCast(OSNumber, device->getProperty(\"idProduct\"))))\n                location |= number->unsigned8BitValue() << 16;\n        }\n    }\n    \n    return OSNumber::withNumber(location, 32);\n}\n"
  },
  {
    "path": "WirelessGamingReceiver/WirelessGamingReceiver.h",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    WirelessGamingReceiver.h - declaration of the wireless receiver driver\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#ifndef __WIRELESSGAMINGRECEIVER_H__\n#define __WIRELESSGAMINGRECEIVER_H__\n\n#include <IOKit/usb/IOUSBDevice.h>\n#include <IOKit/usb/IOUSBInterface.h>\n\n// This value is defined by the hardware and fixed\n#define WIRELESS_CONNECTIONS        4\n\nclass WirelessDevice;\n\ntypedef struct\n{\n    // Controller\n    IOUSBInterface *controller;\n    IOUSBPipe *controllerIn, *controllerOut;\n    \n    // Mystery\n    IOUSBInterface *other;\n    IOUSBPipe *otherIn, *otherOut;\n    \n    // Runtime data\n    OSArray *inputArray;\n    WirelessDevice *service;\n    bool controllerStarted;\n}\nWIRELESS_CONNECTION;\n\nclass WirelessGamingReceiver : public IOService\n{\n    OSDeclareDefaultStructors(WirelessGamingReceiver);\npublic:\n    bool start(IOService *provider);\n    void stop(IOService *provider);\n\n    IOReturn message(UInt32 type,IOService *provider,void *argument);\n\n    // For WirelessDevice to use\n    OSNumber* newLocationIDNumber() const;\n    \nprivate:\n    friend class WirelessDevice;\n    bool IsDataQueued(int index);\n    IOMemoryDescriptor* ReadBuffer(int index);\n    bool QueueWrite(int index, const void *bytes, UInt32 length);\n    \nprivate:\n    IOUSBDevice *device;\n    WIRELESS_CONNECTION connections[WIRELESS_CONNECTIONS];\n    int connectionCount;\n    \n    void InstantiateService(int index);\n    \n    void ProcessMessage(int index, const unsigned char *data, int length);\n    \n    bool QueueRead(int index);\n    void ReadComplete(void *parameter, IOReturn status, UInt32 bufferSizeRemaining);\n    \n    void WriteComplete(void *parameter, IOReturn status, UInt32 bufferSizeRemaining);\n    \n    void ReleaseAll(void);\n    \n    static void _ReadComplete(void *target, void *parameter, IOReturn status, UInt32 bufferSizeRemaining);\n    static void _WriteComplete(void *target, void *parameter, IOReturn status, UInt32 bufferSizeRemaining);\n};\n\n#endif // __WIRELESSGAMINGRECEIVER_H__\n"
  },
  {
    "path": "WirelessGamingReceiver/WirelessGamingReceiver.xcodeproj/colin.mode1",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>ActivePerspectiveName</key>\n\t<string>Project</string>\n\t<key>AllowedModules</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXSmartGroupTreeModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Groups and Files Outline View</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXNavigatorGroup</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Editor</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>XCTaskListModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Task List</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>XCDetailModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>File and Smart Group Detail Viewer</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>1</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXBuildResultsModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Detailed Build Results Viewer</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>1</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXProjectFindModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Project Batch Find Tool</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXRunSessionModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Run Log</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXBookmarksModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Bookmarks Tool</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXClassBrowserModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Class Browser</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXCVSModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Source Code Control Tool</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXDebugBreakpointsModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Debug Breakpoints Tool</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>XCDockableInspector</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Inspector</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>n</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXOpenQuicklyModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Open Quickly Tool</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>1</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXDebugSessionModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Debugger</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>BundleLoadPath</key>\n\t\t\t<string></string>\n\t\t\t<key>MaxInstances</key>\n\t\t\t<string>1</string>\n\t\t\t<key>Module</key>\n\t\t\t<string>PBXDebugCLIModule</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Debug Console</string>\n\t\t</dict>\n\t</array>\n\t<key>Description</key>\n\t<string>DefaultDescriptionKey</string>\n\t<key>DockingSystemVisible</key>\n\t<false/>\n\t<key>Extension</key>\n\t<string>mode1</string>\n\t<key>FavBarConfig</key>\n\t<dict>\n\t\t<key>PBXProjectModuleGUID</key>\n\t\t<string>3B21EBD60B8CEAED00B5CACA</string>\n\t\t<key>XCBarModuleItemNames</key>\n\t\t<dict/>\n\t\t<key>XCBarModuleItems</key>\n\t\t<array/>\n\t</dict>\n\t<key>FirstTimeWindowDisplayed</key>\n\t<false/>\n\t<key>Identifier</key>\n\t<string>com.apple.perspectives.project.mode1</string>\n\t<key>MajorVersion</key>\n\t<integer>31</integer>\n\t<key>MinorVersion</key>\n\t<integer>1</integer>\n\t<key>Name</key>\n\t<string>Default</string>\n\t<key>Notifications</key>\n\t<array/>\n\t<key>OpenEditors</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>Content</key>\n\t\t\t<dict>\n\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t<string>3BE527360BDC379700984E1F</string>\n\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t<string>WirelessGamingReceiver.cpp</string>\n\t\t\t\t<key>PBXSplitModuleInNavigatorKey</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Split0</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t<string>3BE527370BDC379700984E1F</string>\n\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t<string>WirelessGamingReceiver.cpp</string>\n\t\t\t\t\t\t<key>_historyCapacity</key>\n\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t<key>bookmark</key>\n\t\t\t\t\t\t<string>3BD5A2FD0C56D76C005B4E24</string>\n\t\t\t\t\t\t<key>history</key>\n\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t<string>3BD5A2FC0C56D76C005B4E24</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>SplitCount</key>\n\t\t\t\t\t<string>1</string>\n\t\t\t\t</dict>\n\t\t\t\t<key>StatusBarVisibility</key>\n\t\t\t\t<true/>\n\t\t\t</dict>\n\t\t\t<key>Geometry</key>\n\t\t\t<dict>\n\t\t\t\t<key>Frame</key>\n\t\t\t\t<string>{{0, 20}, {806, 677}}</string>\n\t\t\t\t<key>PBXModuleWindowStatusBarHidden2</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t<string>38 258 806 718 0 0 1280 1002 </string>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Content</key>\n\t\t\t<dict>\n\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t<string>3B54B4630BDA9ECF00329AC0</string>\n\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t<string>WirelessHIDDevice.cpp</string>\n\t\t\t\t<key>PBXSplitModuleInNavigatorKey</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Split0</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t<string>3B54B4640BDA9ECF00329AC0</string>\n\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t<string>WirelessHIDDevice.cpp</string>\n\t\t\t\t\t\t<key>_historyCapacity</key>\n\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t<key>bookmark</key>\n\t\t\t\t\t\t<string>3BD5A2FE0C56D76C005B4E24</string>\n\t\t\t\t\t\t<key>history</key>\n\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t<string>3B4FC9F60C49C3B3007CF491</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>SplitCount</key>\n\t\t\t\t\t<string>1</string>\n\t\t\t\t</dict>\n\t\t\t\t<key>StatusBarVisibility</key>\n\t\t\t\t<true/>\n\t\t\t</dict>\n\t\t\t<key>Geometry</key>\n\t\t\t<dict>\n\t\t\t\t<key>Frame</key>\n\t\t\t\t<string>{{0, 20}, {1059, 503}}</string>\n\t\t\t\t<key>PBXModuleWindowStatusBarHidden2</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t<string>34 458 1059 544 0 0 1280 1002 </string>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Content</key>\n\t\t\t<dict>\n\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t<string>3BD1A9390C49BC33006510F7</string>\n\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t<string>WirelessHIDDevice.h</string>\n\t\t\t\t<key>PBXSplitModuleInNavigatorKey</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Split0</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t<string>3BD1A93A0C49BC33006510F7</string>\n\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t<string>WirelessHIDDevice.h</string>\n\t\t\t\t\t\t<key>_historyCapacity</key>\n\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t<key>bookmark</key>\n\t\t\t\t\t\t<string>3BD5A2FF0C56D76C005B4E24</string>\n\t\t\t\t\t\t<key>history</key>\n\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t<string>3B4FC9F70C49C3B3007CF491</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>SplitCount</key>\n\t\t\t\t\t<string>1</string>\n\t\t\t\t</dict>\n\t\t\t\t<key>StatusBarVisibility</key>\n\t\t\t\t<true/>\n\t\t\t</dict>\n\t\t\t<key>Geometry</key>\n\t\t\t<dict>\n\t\t\t\t<key>Frame</key>\n\t\t\t\t<string>{{0, 20}, {1059, 503}}</string>\n\t\t\t\t<key>PBXModuleWindowStatusBarHidden2</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t<string>155 150 1059 544 0 0 1280 1002 </string>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Content</key>\n\t\t\t<dict>\n\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t<string>3B216B380C08E9A4000BE7F3</string>\n\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t<string>WirelessGamingReceiver.h</string>\n\t\t\t\t<key>PBXSplitModuleInNavigatorKey</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Split0</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t<string>3B216B390C08E9A4000BE7F3</string>\n\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t<string>WirelessGamingReceiver.h</string>\n\t\t\t\t\t\t<key>_historyCapacity</key>\n\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t<key>bookmark</key>\n\t\t\t\t\t\t<string>3BD5A3000C56D76C005B4E24</string>\n\t\t\t\t\t\t<key>history</key>\n\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t<string>3B4FC9F80C49C3B3007CF491</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>SplitCount</key>\n\t\t\t\t\t<string>1</string>\n\t\t\t\t</dict>\n\t\t\t\t<key>StatusBarVisibility</key>\n\t\t\t\t<true/>\n\t\t\t</dict>\n\t\t\t<key>Geometry</key>\n\t\t\t<dict>\n\t\t\t\t<key>Frame</key>\n\t\t\t\t<string>{{0, 20}, {688, 361}}</string>\n\t\t\t\t<key>PBXModuleWindowStatusBarHidden2</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t<string>481 168 688 402 0 0 1280 1002 </string>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Content</key>\n\t\t\t<dict>\n\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t<string>3B216B3B0C08E9A4000BE7F3</string>\n\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t<string>IOUSBDevice.cpp</string>\n\t\t\t\t<key>PBXSplitModuleInNavigatorKey</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Split0</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t<string>3B216B3C0C08E9A4000BE7F3</string>\n\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t<string>IOUSBDevice.cpp</string>\n\t\t\t\t\t\t<key>_historyCapacity</key>\n\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t<key>bookmark</key>\n\t\t\t\t\t\t<string>3BD5A3010C56D76C005B4E24</string>\n\t\t\t\t\t\t<key>history</key>\n\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t<string>3B4FC9F90C49C3B3007CF491</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>SplitCount</key>\n\t\t\t\t\t<string>1</string>\n\t\t\t\t</dict>\n\t\t\t\t<key>StatusBarVisibility</key>\n\t\t\t\t<true/>\n\t\t\t</dict>\n\t\t\t<key>Geometry</key>\n\t\t\t<dict>\n\t\t\t\t<key>Frame</key>\n\t\t\t\t<string>{{0, 20}, {806, 677}}</string>\n\t\t\t\t<key>PBXModuleWindowStatusBarHidden2</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t<string>61 237 806 718 0 0 1280 1002 </string>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Content</key>\n\t\t\t<dict>\n\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t<string>3B216B410C08E9A4000BE7F3</string>\n\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t<string>WirelessDevice.h</string>\n\t\t\t\t<key>PBXSplitModuleInNavigatorKey</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Split0</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t<string>3B216B420C08E9A4000BE7F3</string>\n\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t<string>WirelessDevice.h</string>\n\t\t\t\t\t\t<key>_historyCapacity</key>\n\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t<key>bookmark</key>\n\t\t\t\t\t\t<string>3BD5A3030C56D76C005B4E24</string>\n\t\t\t\t\t\t<key>history</key>\n\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t<string>3B4FC9FB0C49C3B3007CF491</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>SplitCount</key>\n\t\t\t\t\t<string>1</string>\n\t\t\t\t</dict>\n\t\t\t\t<key>StatusBarVisibility</key>\n\t\t\t\t<true/>\n\t\t\t</dict>\n\t\t\t<key>Geometry</key>\n\t\t\t<dict>\n\t\t\t\t<key>Frame</key>\n\t\t\t\t<string>{{0, 20}, {1059, 503}}</string>\n\t\t\t\t<key>PBXModuleWindowStatusBarHidden2</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t<string>175 169 1059 544 0 0 1280 1002 </string>\n\t\t\t</dict>\n\t\t</dict>\n\t</array>\n\t<key>PerspectiveWidths</key>\n\t<array>\n\t\t<integer>-1</integer>\n\t\t<integer>-1</integer>\n\t</array>\n\t<key>Perspectives</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>ChosenToolbarItems</key>\n\t\t\t<array>\n\t\t\t\t<string>active-target-popup</string>\n\t\t\t\t<string>active-buildstyle-popup</string>\n\t\t\t\t<string>action</string>\n\t\t\t\t<string>NSToolbarFlexibleSpaceItem</string>\n\t\t\t\t<string>buildOrClean</string>\n\t\t\t\t<string>build-and-runOrDebug</string>\n\t\t\t\t<string>com.apple.ide.PBXToolbarStopButton</string>\n\t\t\t\t<string>get-info</string>\n\t\t\t\t<string>toggle-editor</string>\n\t\t\t\t<string>NSToolbarFlexibleSpaceItem</string>\n\t\t\t\t<string>com.apple.pbx.toolbar.searchfield</string>\n\t\t\t</array>\n\t\t\t<key>ControllerClassBaseName</key>\n\t\t\t<string></string>\n\t\t\t<key>IconName</key>\n\t\t\t<string>WindowOfProjectWithEditor</string>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>perspective.project</string>\n\t\t\t<key>IsVertical</key>\n\t\t\t<false/>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>PBXBottomSmartGroupGIDs</key>\n\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t<string>1C37FBAC04509CD000000102</string>\n\t\t\t\t\t\t\t<string>1C37FAAC04509CD000000102</string>\n\t\t\t\t\t\t\t<string>1C08E77C0454961000C914BD</string>\n\t\t\t\t\t\t\t<string>1C37FABC05509CD000000102</string>\n\t\t\t\t\t\t\t<string>1C37FABC05539CD112110102</string>\n\t\t\t\t\t\t\t<string>E2644B35053B69B200211256</string>\n\t\t\t\t\t\t\t<string>1C37FABC04509CD000100104</string>\n\t\t\t\t\t\t\t<string>1CC0EA4004350EF90044410B</string>\n\t\t\t\t\t\t\t<string>1CC0EA4004350EF90041110B</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t<string>1CE0B1FE06471DED0097A5F4</string>\n\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t<string>Files</string>\n\t\t\t\t\t\t<key>PBXProjectStructureProvided</key>\n\t\t\t\t\t\t<string>yes</string>\n\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleColumnData</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleColumnWidthsKey</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<real>186</real>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleColumnsKey_v4</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<string>MainColumn</string>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<string>089C166AFE841209C02AAC07</string>\n\t\t\t\t\t\t\t\t<string>1C37FABC05509CD000000102</string>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>\n\t\t\t\t\t\t\t<string>{{0, 0}, {186, 338}}</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<key>PBXTopSmartGroupGIDs</key>\n\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t<key>XCIncludePerspectivesSwitch</key>\n\t\t\t\t\t\t<true/>\n\t\t\t\t\t\t<key>XCSharingToken</key>\n\t\t\t\t\t\t<string>com.apple.Xcode.GFSharingToken</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t<string>{{0, 0}, {203, 356}}</string>\n\t\t\t\t\t\t<key>GroupTreeTableConfiguration</key>\n\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t<string>MainColumn</string>\n\t\t\t\t\t\t\t<real>186</real>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t<string>7 576 690 397 0 0 1280 1002 </string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t<string>PBXSmartGroupTreeModule</string>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>203pt</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1CE0B20306471E060097A5F4</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>MyNewFile14.java</string>\n\t\t\t\t\t\t\t\t<key>PBXSplitModuleInNavigatorKey</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Split0</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t\t\t<string>1CE0B20406471E060097A5F4</string>\n\t\t\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t\t\t<string>MyNewFile14.java</string>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>SplitCount</key>\n\t\t\t\t\t\t\t\t\t<string>1</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>StatusBarVisibility</key>\n\t\t\t\t\t\t\t\t<true/>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {482, 0}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>7 576 690 397 0 0 1280 1002 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXNavigatorGroup</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>0pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>BecomeActive</key>\n\t\t\t\t\t\t\t<true/>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1CE0B20506471E060097A5F4</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>Detail</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 5}, {482, 351}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>7 576 690 397 0 0 1280 1002 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>XCDetailModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>351pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>482pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Project</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>XCModuleDock</string>\n\t\t\t\t<string>PBXSmartGroupTreeModule</string>\n\t\t\t\t<string>XCModuleDock</string>\n\t\t\t\t<string>PBXNavigatorGroup</string>\n\t\t\t\t<string>XCDetailModule</string>\n\t\t\t</array>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>3BD5A2FA0C56D76C005B4E24</string>\n\t\t\t\t<string>1CE0B1FE06471DED0097A5F4</string>\n\t\t\t\t<string>3BD5A2FB0C56D76C005B4E24</string>\n\t\t\t\t<string>1CE0B20306471E060097A5F4</string>\n\t\t\t\t<string>1CE0B20506471E060097A5F4</string>\n\t\t\t</array>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.default</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ControllerClassBaseName</key>\n\t\t\t<string></string>\n\t\t\t<key>IconName</key>\n\t\t\t<string>WindowOfProject</string>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>perspective.morph</string>\n\t\t\t<key>IsVertical</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>BecomeActive</key>\n\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>PBXBottomSmartGroupGIDs</key>\n\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t<string>1C37FBAC04509CD000000102</string>\n\t\t\t\t\t\t\t<string>1C37FAAC04509CD000000102</string>\n\t\t\t\t\t\t\t<string>1C08E77C0454961000C914BD</string>\n\t\t\t\t\t\t\t<string>1C37FABC05509CD000000102</string>\n\t\t\t\t\t\t\t<string>1C37FABC05539CD112110102</string>\n\t\t\t\t\t\t\t<string>E2644B35053B69B200211256</string>\n\t\t\t\t\t\t\t<string>1C37FABC04509CD000100104</string>\n\t\t\t\t\t\t\t<string>1CC0EA4004350EF90044410B</string>\n\t\t\t\t\t\t\t<string>1CC0EA4004350EF90041110B</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t<string>11E0B1FE06471DED0097A5F4</string>\n\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t<string>Files</string>\n\t\t\t\t\t\t<key>PBXProjectStructureProvided</key>\n\t\t\t\t\t\t<string>yes</string>\n\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleColumnData</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleColumnWidthsKey</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<real>186</real>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleColumnsKey_v4</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<string>MainColumn</string>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<string>29B97314FDCFA39411CA2CEA</string>\n\t\t\t\t\t\t\t\t<string>1C37FABC05509CD000000102</string>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>\n\t\t\t\t\t\t\t<string>{{0, 0}, {186, 337}}</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<key>PBXTopSmartGroupGIDs</key>\n\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t<key>XCIncludePerspectivesSwitch</key>\n\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t<key>XCSharingToken</key>\n\t\t\t\t\t\t<string>com.apple.Xcode.GFSharingToken</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t<string>{{0, 0}, {203, 355}}</string>\n\t\t\t\t\t\t<key>GroupTreeTableConfiguration</key>\n\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t<string>MainColumn</string>\n\t\t\t\t\t\t\t<real>186</real>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t<string>373 269 690 397 0 0 1440 878 </string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t<string>PBXSmartGroupTreeModule</string>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>100%</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Morph</string>\n\t\t\t<key>PreferredWidth</key>\n\t\t\t<integer>300</integer>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>XCModuleDock</string>\n\t\t\t\t<string>PBXSmartGroupTreeModule</string>\n\t\t\t</array>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>11E0B1FE06471DED0097A5F4</string>\n\t\t\t</array>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.default.short</string>\n\t\t</dict>\n\t</array>\n\t<key>PerspectivesBarVisible</key>\n\t<false/>\n\t<key>ShelfIsVisible</key>\n\t<false/>\n\t<key>SourceDescription</key>\n\t<string>file at '/System/Library/PrivateFrameworks/DevToolsInterface.framework/Versions/A/Resources/XCPerspectivesSpecificationMode1.xcperspec'</string>\n\t<key>StatusbarIsVisible</key>\n\t<true/>\n\t<key>TimeStamp</key>\n\t<real>0.0</real>\n\t<key>ToolbarDisplayMode</key>\n\t<integer>1</integer>\n\t<key>ToolbarIsVisible</key>\n\t<true/>\n\t<key>ToolbarSizeMode</key>\n\t<integer>1</integer>\n\t<key>Type</key>\n\t<string>Perspectives</string>\n\t<key>UpdateMessage</key>\n\t<string>The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the \"Metro-Morph\" feature).  You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature.  Do you wish to update to the latest Workspace defaults for project '%@'?</string>\n\t<key>WindowJustification</key>\n\t<integer>5</integer>\n\t<key>WindowOrderList</key>\n\t<array>\n\t\t<string>3B21ED2D0B8E33A000B5CACA</string>\n\t\t<string>3B216B410C08E9A4000BE7F3</string>\n\t\t<string>3B216B3B0C08E9A4000BE7F3</string>\n\t\t<string>3B216B380C08E9A4000BE7F3</string>\n\t\t<string>3BD1A9390C49BC33006510F7</string>\n\t\t<string>3B54B4630BDA9ECF00329AC0</string>\n\t\t<string>/Users/colin/Projects2/OSX/360 Controller/WirelessGamingReceiver/WirelessGamingReceiver.xcodeproj</string>\n\t\t<string>3BE527360BDC379700984E1F</string>\n\t</array>\n\t<key>WindowString</key>\n\t<string>7 576 690 397 0 0 1280 1002 </string>\n\t<key>WindowTools</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>FirstTimeWindowDisplayed</key>\n\t\t\t<false/>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.build</string>\n\t\t\t<key>IsVertical</key>\n\t\t\t<true/>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1CD0528F0623707200166675</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string></string>\n\t\t\t\t\t\t\t\t<key>StatusBarVisibility</key>\n\t\t\t\t\t\t\t\t<true/>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {668, 312}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>36 380 668 594 0 0 1280 1002 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXNavigatorGroup</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>312pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>XCMainBuildResultsModuleGUID</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>Build</string>\n\t\t\t\t\t\t\t\t<key>XCBuildResultsTrigger_Collapse</key>\n\t\t\t\t\t\t\t\t<integer>1021</integer>\n\t\t\t\t\t\t\t\t<key>XCBuildResultsTrigger_Open</key>\n\t\t\t\t\t\t\t\t<integer>1011</integer>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 317}, {668, 236}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>36 380 668 594 0 0 1280 1002 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXBuildResultsModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>236pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>553pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Build Results</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXBuildResultsModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<true/>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>3B21ED2D0B8E33A000B5CACA</string>\n\t\t\t\t<string>3BD5A3040C56D76C005B4E24</string>\n\t\t\t\t<string>1CD0528F0623707200166675</string>\n\t\t\t\t<string>XCMainBuildResultsModuleGUID</string>\n\t\t\t</array>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.build</string>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>36 380 668 594 0 0 1280 1002 </string>\n\t\t\t<key>WindowToolGUID</key>\n\t\t\t<string>3B21ED2D0B8E33A000B5CACA</string>\n\t\t\t<key>WindowToolIsVisible</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.debugger</string>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Debugger</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>HorizontalSplitView</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>_collapsingFrameDimension</key>\n\t\t\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t\t\t<key>_indexOfCollapsedView</key>\n\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t<key>_percentageOfCollapsedView</key>\n\t\t\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t\t\t<key>isCollapsed</key>\n\t\t\t\t\t\t\t\t\t\t<string>yes</string>\n\t\t\t\t\t\t\t\t\t\t<key>sizes</key>\n\t\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t\t<string>{{0, 0}, {317, 164}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<string>{{317, 0}, {377, 164}}</string>\n\t\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>VerticalSplitView</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>_collapsingFrameDimension</key>\n\t\t\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t\t\t<key>_indexOfCollapsedView</key>\n\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t<key>_percentageOfCollapsedView</key>\n\t\t\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t\t\t<key>isCollapsed</key>\n\t\t\t\t\t\t\t\t\t\t<string>yes</string>\n\t\t\t\t\t\t\t\t\t\t<key>sizes</key>\n\t\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t\t<string>{{0, 0}, {694, 164}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<string>{{0, 164}, {694, 216}}</string>\n\t\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>LauncherConfigVersion</key>\n\t\t\t\t\t\t\t\t<string>8</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1C162984064C10D400B95A72</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>Debug - GLUTExamples (Underwater)</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>DebugConsoleDrawerSize</key>\n\t\t\t\t\t\t\t\t<string>{100, 120}</string>\n\t\t\t\t\t\t\t\t<key>DebugConsoleVisible</key>\n\t\t\t\t\t\t\t\t<string>None</string>\n\t\t\t\t\t\t\t\t<key>DebugConsoleWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>{{200, 200}, {500, 300}}</string>\n\t\t\t\t\t\t\t\t<key>DebugSTDIOWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>{{200, 200}, {500, 300}}</string>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {694, 380}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>321 238 694 422 0 0 1440 878 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXDebugSessionModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>100%</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>100%</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Debugger</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXDebugSessionModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>1CD10A99069EF8BA00B06720</string>\n\t\t\t\t<string>1C0AD2AB069F1E9B00FABCE6</string>\n\t\t\t\t<string>1C162984064C10D400B95A72</string>\n\t\t\t\t<string>1C0AD2AC069F1E9B00FABCE6</string>\n\t\t\t</array>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.debug</string>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>321 238 694 422 0 0 1440 878 </string>\n\t\t\t<key>WindowToolGUID</key>\n\t\t\t<string>1CD10A99069EF8BA00B06720</string>\n\t\t\t<key>WindowToolIsVisible</key>\n\t\t\t<integer>0</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FirstTimeWindowDisplayed</key>\n\t\t\t<false/>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.find</string>\n\t\t\t<key>IsVertical</key>\n\t\t\t<true/>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t\t\t<string>1CDD528C0622207200134675</string>\n\t\t\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t\t\t<string></string>\n\t\t\t\t\t\t\t\t\t\t<key>StatusBarVisibility</key>\n\t\t\t\t\t\t\t\t\t\t<true/>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t\t\t<string>{{0, 0}, {781, 212}}</string>\n\t\t\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t\t\t<string>53 509 781 470 0 0 1280 1002 </string>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t\t\t<string>PBXNavigatorGroup</string>\n\t\t\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t\t\t<string>781pt</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>212pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>BecomeActive</key>\n\t\t\t\t\t\t\t<true/>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1CD0528E0623707200166675</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>Project Find</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 217}, {781, 212}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>53 509 781 470 0 0 1280 1002 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXProjectFindModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>212pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>429pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Project Find</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXProjectFindModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<true/>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>1C530D57069F1CE1000CFCEE</string>\n\t\t\t\t<string>3BCC40340BDA6D7200B1619B</string>\n\t\t\t\t<string>3BCC40350BDA6D7200B1619B</string>\n\t\t\t\t<string>1CDD528C0622207200134675</string>\n\t\t\t\t<string>1CD0528E0623707200166675</string>\n\t\t\t</array>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>53 509 781 470 0 0 1280 1002 </string>\n\t\t\t<key>WindowToolGUID</key>\n\t\t\t<string>1C530D57069F1CE1000CFCEE</string>\n\t\t\t<key>WindowToolIsVisible</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>MENUSEPARATOR</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.debuggerConsole</string>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>BecomeActive</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1C78EAAC065D492600B07095</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>Debugger Console</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {440, 358}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>650 41 440 400 0 0 1280 1002 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXDebugCLIModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>358pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>358pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Debugger Console</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXDebugCLIModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>1C78EAAD065D492600B07095</string>\n\t\t\t\t<string>1C78EAAE065D492600B07095</string>\n\t\t\t\t<string>1C78EAAC065D492600B07095</string>\n\t\t\t</array>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>650 41 440 400 0 0 1280 1002 </string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.run</string>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>LauncherConfigVersion</key>\n\t\t\t\t\t\t\t\t<string>3</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1CD0528B0623707200166675</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>Run</string>\n\t\t\t\t\t\t\t\t<key>Runner</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>HorizontalSplitView</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>_collapsingFrameDimension</key>\n\t\t\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t\t\t<key>_indexOfCollapsedView</key>\n\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t<key>_percentageOfCollapsedView</key>\n\t\t\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t\t\t<key>isCollapsed</key>\n\t\t\t\t\t\t\t\t\t\t<string>yes</string>\n\t\t\t\t\t\t\t\t\t\t<key>sizes</key>\n\t\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t\t<string>{{0, 0}, {493, 167}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<string>{{0, 176}, {493, 267}}</string>\n\t\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>VerticalSplitView</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>_collapsingFrameDimension</key>\n\t\t\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t\t\t<key>_indexOfCollapsedView</key>\n\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t<key>_percentageOfCollapsedView</key>\n\t\t\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t\t\t<key>isCollapsed</key>\n\t\t\t\t\t\t\t\t\t\t<string>yes</string>\n\t\t\t\t\t\t\t\t\t\t<key>sizes</key>\n\t\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t\t<string>{{0, 0}, {405, 443}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<string>{{414, 0}, {514, 443}}</string>\n\t\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {460, 159}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>316 696 459 200 0 0 1280 1002 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXRunSessionModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>159pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>159pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Run Log</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXRunSessionModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>1C0AD2B3069F1EA900FABCE6</string>\n\t\t\t\t<string>1C0AD2B4069F1EA900FABCE6</string>\n\t\t\t\t<string>1CD0528B0623707200166675</string>\n\t\t\t\t<string>1C0AD2B5069F1EA900FABCE6</string>\n\t\t\t</array>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.run</string>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>316 696 459 200 0 0 1280 1002 </string>\n\t\t\t<key>WindowToolGUID</key>\n\t\t\t<string>1C0AD2B3069F1EA900FABCE6</string>\n\t\t\t<key>WindowToolIsVisible</key>\n\t\t\t<integer>0</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.scm</string>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1C78EAB2065D492600B07095</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>&lt;No Editor&gt;</string>\n\t\t\t\t\t\t\t\t<key>PBXSplitModuleInNavigatorKey</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Split0</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t\t\t<string>1C78EAB3065D492600B07095</string>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>SplitCount</key>\n\t\t\t\t\t\t\t\t\t<string>1</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>StatusBarVisibility</key>\n\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {452, 0}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>743 379 452 308 0 0 1280 1002 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXNavigatorGroup</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>0pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>BecomeActive</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1CD052920623707200166675</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>SCM</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>ConsoleFrame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 259}, {452, 0}}</string>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 7}, {452, 259}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>743 379 452 308 0 0 1280 1002 </string>\n\t\t\t\t\t\t\t\t<key>TableConfiguration</key>\n\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t<string>Status</string>\n\t\t\t\t\t\t\t\t\t<real>30</real>\n\t\t\t\t\t\t\t\t\t<string>FileName</string>\n\t\t\t\t\t\t\t\t\t<real>199</real>\n\t\t\t\t\t\t\t\t\t<string>Path</string>\n\t\t\t\t\t\t\t\t\t<real>197.09500122070312</real>\n\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t<key>TableFrame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {452, 250}}</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXCVSModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>262pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>266pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>SCM</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXCVSModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>1C78EAB4065D492600B07095</string>\n\t\t\t\t<string>1C78EAB5065D492600B07095</string>\n\t\t\t\t<string>1C78EAB2065D492600B07095</string>\n\t\t\t\t<string>1CD052920623707200166675</string>\n\t\t\t</array>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.scm</string>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>743 379 452 308 0 0 1280 1002 </string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.breakpoints</string>\n\t\t\t<key>IsVertical</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>BecomeActive</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXBottomSmartGroupGIDs</key>\n\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t<string>1C77FABC04509CD000000102</string>\n\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1CE0B1FE06471DED0097A5F4</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>Files</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectStructureProvided</key>\n\t\t\t\t\t\t\t\t<string>no</string>\n\t\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleColumnData</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleColumnWidthsKey</key>\n\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t<real>168</real>\n\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleColumnsKey_v4</key>\n\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t<string>MainColumn</string>\n\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key>\n\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t<string>1C77FABC04509CD000000102</string>\n\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>\n\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t<key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>\n\t\t\t\t\t\t\t\t\t<string>{{0, 0}, {168, 350}}</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>PBXTopSmartGroupGIDs</key>\n\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t<key>XCIncludePerspectivesSwitch</key>\n\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {185, 368}}</string>\n\t\t\t\t\t\t\t\t<key>GroupTreeTableConfiguration</key>\n\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t<string>MainColumn</string>\n\t\t\t\t\t\t\t\t\t<real>168</real>\n\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>315 424 744 409 0 0 1440 878 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXSmartGroupTreeModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>185pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1CA1AED706398EBD00589147</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>Detail</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{190, 0}, {554, 368}}</string>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>315 424 744 409 0 0 1440 878 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>XCDetailModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>554pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>368pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>MajorVersion</key>\n\t\t\t<integer>2</integer>\n\t\t\t<key>MinorVersion</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>Name</key>\n\t\t\t<string>Breakpoints</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXSmartGroupTreeModule</string>\n\t\t\t\t<string>XCDetailModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>1CDDB66807F98D9800BB5817</string>\n\t\t\t\t<string>1CDDB66907F98D9800BB5817</string>\n\t\t\t\t<string>1CE0B1FE06471DED0097A5F4</string>\n\t\t\t\t<string>1CA1AED706398EBD00589147</string>\n\t\t\t</array>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.breakpoints</string>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>315 424 744 409 0 0 1440 878 </string>\n\t\t\t<key>WindowToolGUID</key>\n\t\t\t<string>1CDDB66807F98D9800BB5817</string>\n\t\t\t<key>WindowToolIsVisible</key>\n\t\t\t<integer>1</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.debugAnimator</string>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXNavigatorGroup</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>100%</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>100%</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Debug Visualizer</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXNavigatorGroup</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.debugAnimator</string>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>100 100 700 500 0 0 1280 1002 </string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.bookmarks</string>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXBookmarksModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>100%</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>100%</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Bookmarks</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXBookmarksModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>538 42 401 187 0 0 1280 1002 </string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Identifier</key>\n\t\t\t<string>windowTool.classBrowser</string>\n\t\t\t<key>Layout</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Dock</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>BecomeActive</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>ContentConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>OptionsSetName</key>\n\t\t\t\t\t\t\t\t<string>Hierarchy, all classes</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleGUID</key>\n\t\t\t\t\t\t\t\t<string>1CA6456E063B45B4001379D8</string>\n\t\t\t\t\t\t\t\t<key>PBXProjectModuleLabel</key>\n\t\t\t\t\t\t\t\t<string>Class Browser - NSObject</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>GeometryConfiguration</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>ClassesFrame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {374, 96}}</string>\n\t\t\t\t\t\t\t\t<key>ClassesTreeTableConfiguration</key>\n\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t<string>PBXClassNameColumnIdentifier</string>\n\t\t\t\t\t\t\t\t\t<real>208</real>\n\t\t\t\t\t\t\t\t\t<string>PBXClassBookColumnIdentifier</string>\n\t\t\t\t\t\t\t\t\t<real>22</real>\n\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t<key>Frame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 0}, {630, 331}}</string>\n\t\t\t\t\t\t\t\t<key>MembersFrame</key>\n\t\t\t\t\t\t\t\t<string>{{0, 105}, {374, 395}}</string>\n\t\t\t\t\t\t\t\t<key>MembersTreeTableConfiguration</key>\n\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t<string>PBXMemberTypeIconColumnIdentifier</string>\n\t\t\t\t\t\t\t\t\t<real>22</real>\n\t\t\t\t\t\t\t\t\t<string>PBXMemberNameColumnIdentifier</string>\n\t\t\t\t\t\t\t\t\t<real>216</real>\n\t\t\t\t\t\t\t\t\t<string>PBXMemberTypeColumnIdentifier</string>\n\t\t\t\t\t\t\t\t\t<real>97</real>\n\t\t\t\t\t\t\t\t\t<string>PBXMemberBookColumnIdentifier</string>\n\t\t\t\t\t\t\t\t\t<real>22</real>\n\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t<key>PBXModuleWindowStatusBarHidden2</key>\n\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t<key>RubberWindowFrame</key>\n\t\t\t\t\t\t\t\t<string>385 179 630 352 0 0 1440 878 </string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Module</key>\n\t\t\t\t\t\t\t<string>PBXClassBrowserModule</string>\n\t\t\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t\t\t<string>332pt</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>Proportion</key>\n\t\t\t\t\t<string>332pt</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Name</key>\n\t\t\t<string>Class Browser</string>\n\t\t\t<key>ServiceClasses</key>\n\t\t\t<array>\n\t\t\t\t<string>PBXClassBrowserModule</string>\n\t\t\t</array>\n\t\t\t<key>StatusbarIsVisible</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>TableOfContents</key>\n\t\t\t<array>\n\t\t\t\t<string>1C0AD2AF069F1E9B00FABCE6</string>\n\t\t\t\t<string>1C0AD2B0069F1E9B00FABCE6</string>\n\t\t\t\t<string>1CA6456E063B45B4001379D8</string>\n\t\t\t</array>\n\t\t\t<key>ToolbarConfiguration</key>\n\t\t\t<string>xcode.toolbar.config.classbrowser</string>\n\t\t\t<key>WindowString</key>\n\t\t\t<string>385 179 630 352 0 0 1440 878 </string>\n\t\t\t<key>WindowToolGUID</key>\n\t\t\t<string>1C0AD2AF069F1E9B00FABCE6</string>\n\t\t\t<key>WindowToolIsVisible</key>\n\t\t\t<integer>0</integer>\n\t\t</dict>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "WirelessGamingReceiver/WirelessGamingReceiver.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t32D94FC60562CBF700B6AF17 /* WirelessGamingReceiver.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A224C3EFF42367911CA2CB7 /* WirelessGamingReceiver.h */; };\n\t\t32D94FC80562CBF700B6AF17 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C167DFE841241C02AAC07 /* InfoPlist.strings */; };\n\t\t32D94FCA0562CBF700B6AF17 /* WirelessGamingReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A224C3FFF42367911CA2CB7 /* WirelessGamingReceiver.cpp */; settings = {ATTRIBUTES = (); }; };\n\t\t3B21ED670B8E688A00B5CACA /* WirelessDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B21ED660B8E688A00B5CACA /* WirelessDevice.h */; };\n\t\t3B21ED6C0B8E690F00B5CACA /* WirelessDevice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B21ED6B0B8E690F00B5CACA /* WirelessDevice.cpp */; };\n\t\t3BE667180B9109C5009679FC /* WirelessHIDDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BE667170B9109C5009679FC /* WirelessHIDDevice.h */; };\n\t\t3BE6671C0B910A02009679FC /* WirelessHIDDevice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BE6671B0B910A02009679FC /* WirelessHIDDevice.cpp */; };\n\t\t3BE6677B0B91DC55009679FC /* devices.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BE6677A0B91DC55009679FC /* devices.h */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t089C167EFE841241C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\t1A224C3EFF42367911CA2CB7 /* WirelessGamingReceiver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WirelessGamingReceiver.h; sourceTree = \"<group>\"; };\n\t\t1A224C3FFF42367911CA2CB7 /* WirelessGamingReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WirelessGamingReceiver.cpp; sourceTree = \"<group>\"; };\n\t\t32D94FCF0562CBF700B6AF17 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t32D94FD00562CBF700B6AF17 /* WirelessGamingReceiver.kext */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WirelessGamingReceiver.kext; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t3B21ED660B8E688A00B5CACA /* WirelessDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WirelessDevice.h; sourceTree = \"<group>\"; };\n\t\t3B21ED6B0B8E690F00B5CACA /* WirelessDevice.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WirelessDevice.cpp; sourceTree = \"<group>\"; };\n\t\t3BE667170B9109C5009679FC /* WirelessHIDDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WirelessHIDDevice.h; sourceTree = \"<group>\"; };\n\t\t3BE6671B0B910A02009679FC /* WirelessHIDDevice.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WirelessHIDDevice.cpp; sourceTree = \"<group>\"; };\n\t\t3BE6677A0B91DC55009679FC /* devices.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = devices.h; sourceTree = \"<group>\"; };\n\t\t8DA8362C06AD9B9200E5AC22 /* Kernel.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kernel.framework; path = /System/Library/Frameworks/Kernel.framework; sourceTree = \"<absolute>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t32D94FCB0562CBF700B6AF17 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t089C166AFE841209C02AAC07 /* WirelessGamingReceiver */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t247142CAFF3F8F9811CA285C /* Source */,\n\t\t\t\t8DA8362C06AD9B9200E5AC22 /* Kernel.framework */,\n\t\t\t\t089C167CFE841241C02AAC07 /* Resources */,\n\t\t\t\t19C28FB6FE9D52B211CA2CBB /* Products */,\n\t\t\t);\n\t\t\tname = WirelessGamingReceiver;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t089C167CFE841241C02AAC07 /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t32D94FCF0562CBF700B6AF17 /* Info.plist */,\n\t\t\t\t089C167DFE841241C02AAC07 /* InfoPlist.strings */,\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t19C28FB6FE9D52B211CA2CBB /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t32D94FD00562CBF700B6AF17 /* WirelessGamingReceiver.kext */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t247142CAFF3F8F9811CA285C /* Source */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3BE6677A0B91DC55009679FC /* devices.h */,\n\t\t\t\t3BE6671B0B910A02009679FC /* WirelessHIDDevice.cpp */,\n\t\t\t\t3BE667170B9109C5009679FC /* WirelessHIDDevice.h */,\n\t\t\t\t3B21ED6B0B8E690F00B5CACA /* WirelessDevice.cpp */,\n\t\t\t\t3B21ED660B8E688A00B5CACA /* WirelessDevice.h */,\n\t\t\t\t1A224C3FFF42367911CA2CB7 /* WirelessGamingReceiver.cpp */,\n\t\t\t\t1A224C3EFF42367911CA2CB7 /* WirelessGamingReceiver.h */,\n\t\t\t);\n\t\t\tname = Source;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t32D94FC50562CBF700B6AF17 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t32D94FC60562CBF700B6AF17 /* WirelessGamingReceiver.h in Headers */,\n\t\t\t\t3B21ED670B8E688A00B5CACA /* WirelessDevice.h in Headers */,\n\t\t\t\t3BE667180B9109C5009679FC /* WirelessHIDDevice.h in Headers */,\n\t\t\t\t3BE6677B0B91DC55009679FC /* devices.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t32D94FC30562CBF700B6AF17 /* WirelessGamingReceiver */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 1DEB91D908733DB10010E9CD /* Build configuration list for PBXNativeTarget \"WirelessGamingReceiver\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t32D94FC50562CBF700B6AF17 /* Headers */,\n\t\t\t\t32D94FC70562CBF700B6AF17 /* Resources */,\n\t\t\t\t32D94FC90562CBF700B6AF17 /* Sources */,\n\t\t\t\t32D94FCB0562CBF700B6AF17 /* Frameworks */,\n\t\t\t\t32D94FCC0562CBF700B6AF17 /* Rez */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = WirelessGamingReceiver;\n\t\t\tproductInstallPath = \"$(SYSTEM_LIBRARY_DIR)/Extensions\";\n\t\t\tproductName = WirelessGamingReceiver;\n\t\t\tproductReference = 32D94FD00562CBF700B6AF17 /* WirelessGamingReceiver.kext */;\n\t\t\tproductType = \"com.apple.product-type.kernel-extension.iokit\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t089C1669FE841209C02AAC07 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tbuildConfigurationList = 1DEB91DD08733DB10010E9CD /* Build configuration list for PBXProject \"WirelessGamingReceiver\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 1;\n\t\t\tknownRegions = (\n\t\t\t\tEnglish,\n\t\t\t\tJapanese,\n\t\t\t\tFrench,\n\t\t\t\tGerman,\n\t\t\t);\n\t\t\tmainGroup = 089C166AFE841209C02AAC07 /* WirelessGamingReceiver */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t32D94FC30562CBF700B6AF17 /* WirelessGamingReceiver */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t32D94FC70562CBF700B6AF17 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t32D94FC80562CBF700B6AF17 /* InfoPlist.strings in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXRezBuildPhase section */\n\t\t32D94FCC0562CBF700B6AF17 /* Rez */ = {\n\t\t\tisa = PBXRezBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXRezBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t32D94FC90562CBF700B6AF17 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t32D94FCA0562CBF700B6AF17 /* WirelessGamingReceiver.cpp in Sources */,\n\t\t\t\t3B21ED6C0B8E690F00B5CACA /* WirelessDevice.cpp in Sources */,\n\t\t\t\t3BE6671C0B910A02009679FC /* WirelessHIDDevice.cpp in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t089C167DFE841241C02AAC07 /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t089C167EFE841241C02AAC07 /* English */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t1DEB91DA08733DB10010E9CD /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"Developer ID Application: Colin Munro\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1.0.0d12;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = YES;\n\t\t\t\tGCC_MODEL_TUNING = G5;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(SYSTEM_LIBRARY_DIR)/Extensions\";\n\t\t\t\tMODULE_NAME = com.mice.driver.WirelessGamingReceiver;\n\t\t\t\tMODULE_VERSION = 1.0.0d11;\n\t\t\t\tPRODUCT_NAME = WirelessGamingReceiver;\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\tWRAPPER_EXTENSION = kext;\n\t\t\t\tZERO_LINK = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1DEB91DB08733DB10010E9CD /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"Developer ID Application: Colin Munro\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1.0.0d12;\n\t\t\t\tGCC_GENERATE_DEBUGGING_SYMBOLS = NO;\n\t\t\t\tGCC_MODEL_TUNING = G5;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(SYSTEM_LIBRARY_DIR)/Extensions\";\n\t\t\t\tMODULE_NAME = com.mice.driver.WirelessGamingReceiver;\n\t\t\t\tMODULE_VERSION = 1.0.0d11;\n\t\t\t\tPRODUCT_NAME = WirelessGamingReceiver;\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\tWRAPPER_EXTENSION = kext;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t1DEB91DE08733DB10010E9CD /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = \"\";\n\t\t\t\tPREBINDING = NO;\n\t\t\t\tSDKROOT = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1DEB91DF08733DB10010E9CD /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_32_64_BIT)\";\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.5;\n\t\t\t\tPREBINDING = NO;\n\t\t\t\tSDKROOT = \"\";\n\t\t\t\tSYMROOT = build;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t1DEB91D908733DB10010E9CD /* Build configuration list for PBXNativeTarget \"WirelessGamingReceiver\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1DEB91DA08733DB10010E9CD /* Debug */,\n\t\t\t\t1DEB91DB08733DB10010E9CD /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t1DEB91DD08733DB10010E9CD /* Build configuration list for PBXProject \"WirelessGamingReceiver\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1DEB91DE08733DB10010E9CD /* Debug */,\n\t\t\t\t1DEB91DF08733DB10010E9CD /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 089C1669FE841209C02AAC07 /* Project object */;\n}\n"
  },
  {
    "path": "WirelessGamingReceiver/WirelessHIDDevice.cpp",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    WirelessHIDDevice.cpp - generic wireless 360 device driver with HID support\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#include <IOKit/IOLib.h>\n#include <IOKit/IOTimerEventSource.h>\n#include \"WirelessHIDDevice.h\"\n#include \"WirelessDevice.h\"\n#include \"devices.h\"\n\n#define POWEROFF_TIMEOUT        (2 * 60)\n\nOSDefineMetaClassAndAbstractStructors(WirelessHIDDevice, IOHIDDevice)\n#define super IOHIDDevice\n\n// Some sort of message to send\nconst char weirdStart[] = {0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};\n\nvoid WirelessHIDDevice::ChatPadTimerActionWrapper(OSObject *owner, IOTimerEventSource *sender)\n{\n\tWirelessHIDDevice *device;\n    \n\tdevice = OSDynamicCast(WirelessHIDDevice, owner);\n    // Automatic shutoff\n    device->serialTimerCount++;\n    if (device->serialTimerCount > POWEROFF_TIMEOUT)\n        device->PowerOff();\n    // Reset\n    sender->setTimeoutMS(1000);\n}\n\n// Sets the LED with the same format as the wired controller\nvoid WirelessHIDDevice::SetLEDs(int mode)\n{\n    char buf[] = {0x00, 0x00, 0x08, 0x40 + (mode % 0x0e), 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};\n    WirelessDevice *device;\n\n    device = OSDynamicCast(WirelessDevice, getProvider());\n    if (device != NULL)\n    {\n        device->SendPacket(buf, sizeof(buf));\n        device->SendPacket(weirdStart, sizeof(weirdStart));\n    }\n}\n\n// Returns the battery level\nunsigned char WirelessHIDDevice::GetBatteryLevel(void)\n{\n    return battery;\n}\n\nvoid WirelessHIDDevice::PowerOff(void)\n{\n    char buf[] = {0x00, 0x00, 0x08, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};\n    WirelessDevice *device;\n    \n    device = OSDynamicCast(WirelessDevice, getProvider());\n    if (device != NULL)\n    {\n        device->SendPacket(buf, sizeof(buf));\n//        device->SendPacket(weirdStart, sizeof(weirdStart));\n    }\n}\n\n// Called from userspace to do something, like set the LEDs\nIOReturn WirelessHIDDevice::setReport(IOMemoryDescriptor *report, IOHIDReportType reportType, IOOptionBits options)\n{\n    char data[2];\n\n    if (report->readBytes(0, data, 2) < 2)\n        return kIOReturnUnsupported;\n    \n    switch (data[0]) {\n        case 0x01:  // LED\n            if ((data[1] != report->getLength()) || (data[1] != 0x03))\n                return kIOReturnUnsupported;\n            report->readBytes(2, data, 1);\n            SetLEDs(data[0]);\n            return kIOReturnSuccess;\n        case 0x02:  // Power\n            PowerOff();\n            return kIOReturnSuccess;\n        default:\n            return super::setReport(report, reportType, options);\n    }\n}\n\n// Start up the driver\nbool WirelessHIDDevice::handleStart(IOService *provider)\n{\n    WirelessDevice *device;\n    IOWorkLoop *workloop;\n    \n    if (!super::handleStart(provider))\n        goto fail;\n\n    device = OSDynamicCast(WirelessDevice, provider);\n    if (device == NULL)\n        goto fail;\n    \n    serialTimerCount = 0;\n    \n\tserialTimer = IOTimerEventSource::timerEventSource(this, ChatPadTimerActionWrapper);\n\tif (serialTimer == NULL)\n\t{\n\t\tIOLog(\"start - failed to create timer for chatpad\\n\");\n\t\tgoto fail;\n\t}\n    workloop = getWorkLoop();\n\tif ((workloop == NULL) || (workloop->addEventSource(serialTimer) != kIOReturnSuccess))\n\t{\n\t\tIOLog(\"start - failed to connect timer for chatpad\\n\");\n\t\tgoto fail;\n\t}\n    \n    device->RegisterWatcher(this, _receivedData, NULL);\n    \n    device->SendPacket(weirdStart, sizeof(weirdStart));\n\n    serialTimer->setTimeoutMS(1000);\n\n    return true;\n    \nfail:\n    return false;\n}\n\n// Shut down the driver\nvoid WirelessHIDDevice::handleStop(IOService *provider)\n{\n    WirelessDevice *device;\n\n    device = OSDynamicCast(WirelessDevice, provider);\n    if (device != NULL)\n        device->RegisterWatcher(NULL, NULL, NULL);\n\n    if (serialTimer != NULL) {\n        serialTimer->cancelTimeout();\n        IOWorkLoop *workloop = getWorkLoop();\n        if (workloop != NULL)\n            workloop->removeEventSource(serialTimer);\n        serialTimer->release();\n        serialTimer = NULL;\n    }\n    \n    super::handleStop(provider);\n}\n\n// Handle new data from the device\nvoid WirelessHIDDevice::receivedData(void)\n{\n    IOMemoryDescriptor *data;\n    WirelessDevice *device = OSDynamicCast(WirelessDevice, getProvider());\n    if (device == NULL)\n        return;\n    \n    while ((data = device->NextPacket()) != NULL)\n    {\n        receivedMessage(data);\n        data->release();\n    }\n}\n\nconst char *HexData = \"0123456789ABCDEF\";\n\n// Process new data\nvoid WirelessHIDDevice::receivedMessage(IOMemoryDescriptor *data)\n{\n    unsigned char buf[29];\n    \n    if (data->getLength() != 29)\n        return;\n        \n    data->readBytes(0, buf, 29);\n    \n    switch (buf[1])\n    {\n        case 0x0f:  // Initial info\n            if (buf[16] == 0x13)\n                receivedUpdate(0x13, buf + 17);\n            serialString[0] = HexData[(buf[0x0A] & 0xF0) >> 4];\n            serialString[1] = HexData[buf[0x0A] & 0x0F];\n            serialString[2] = HexData[(buf[0x0B] & 0xF0) >> 4];\n            serialString[3] = HexData[buf[0x0B] & 0x0F];\n            serialString[4] = HexData[(buf[0x0C] & 0xF0) >> 4];\n            serialString[5] = HexData[buf[0x0C] & 0x0F];\n            serialString[6] = HexData[(buf[0x0D] & 0xF0) >> 4];\n            serialString[7] = HexData[buf[0x0D] & 0x0F];\n            serialString[8] = '\\0';\n            IOLog(\"Got serial number: %s\", serialString);\n            break;\n            \n        case 0x01:  // HID info update\n            if (buf[3] == 0xf0)\n                receivedHIDupdate(buf + 4, buf[5]);\n            break;\n            \n        case 0x00:  // Info update\n            receivedUpdate(buf[3], buf + 4);\n            break;\n            \n        default:\n            break;\n    }\n}\n\n// Received an update of a specific value\nvoid WirelessHIDDevice::receivedUpdate(unsigned char type, unsigned char *data)\n{\n    switch (type)\n    {\n        case 0x13:  // Battery level\n            battery = data[0];\n            {\n                OSObject *prop = OSNumber::withNumber(battery, 8);\n                if (prop != NULL)\n                {\n                    setProperty(kIOWirelessBatteryLevel, prop);\n                    prop->release();\n                }\n            }\n            break;\n            \n        default:\n            break;\n    }\n}\n\n// Received a normal HID update from the device\nvoid WirelessHIDDevice::receivedHIDupdate(unsigned char *data, int length)\n{\n    IOReturn err;\n    IOMemoryDescriptor *report;\n    \n    serialTimerCount = 0;\n    report = IOMemoryDescriptor::withAddress(data, length, kIODirectionNone);\n    err = handleReport(report, kIOHIDReportTypeInput);\n    report->release();\n    if (err != kIOReturnSuccess)\n        IOLog(\"handleReport return: 0x%.8x\\n\", err);\n}\n\n// Wrapper for notification of receiving data\nvoid WirelessHIDDevice::_receivedData(void *target, WirelessDevice *sender, void *parameter)\n{\n    ((WirelessHIDDevice*)target)->receivedData();\n}\n\n// Get a location ID for this device, as some games require it\nOSNumber* WirelessHIDDevice::newLocationIDNumber() const\n{\n    WirelessDevice *device;\n\n    device = OSDynamicCast(WirelessDevice, getProvider());\n    if (device == NULL)\n        return NULL;\n    return device->newLocationIDNumber();\n}\n\n// Get the serial number of the device\nOSString* WirelessHIDDevice::newSerialNumberString() const\n{\n    return OSString::withCString(serialString);\n}\n"
  },
  {
    "path": "WirelessGamingReceiver/WirelessHIDDevice.h",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    WirelessHIDDevice.h - declaration of generic wireless HID device\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#ifndef __WIRELESSHIDDEVICE_H__\n#define __WIRELESSHIDDEVICE_H__\n\n#include <IOKit/hid/IOHIDDevice.h>\n\nclass WirelessDevice;\n\nclass WirelessHIDDevice : public IOHIDDevice\n{\n    OSDeclareDefaultStructors(WirelessHIDDevice);\npublic:\n    void SetLEDs(int mode);\n    void PowerOff(void);\n    unsigned char GetBatteryLevel(void);\n    \n    IOReturn setReport(IOMemoryDescriptor *report, IOHIDReportType reportType, IOOptionBits options);\n\n    OSNumber* newLocationIDNumber() const;\n    OSString* newSerialNumberString() const;\nprotected:\n    bool handleStart(IOService *provider);\n    void handleStop(IOService *provider);\n    virtual void receivedData(void);\n    virtual void receivedMessage(IOMemoryDescriptor *data);\n    virtual void receivedUpdate(unsigned char type, unsigned char *data);\n    virtual void receivedHIDupdate(unsigned char *data, int length);\nprivate:\n    static void _receivedData(void *target, WirelessDevice *sender, void *parameter);\n    static void ChatPadTimerActionWrapper(OSObject *owner, IOTimerEventSource *sender);\n    \n\tIOTimerEventSource *serialTimer;\n    int serialTimerCount;\n    \n    unsigned char battery;\n    char serialString[10];\n};\n\n#endif // __WIRELESSHIDDEVICE_H__\n"
  },
  {
    "path": "WirelessGamingReceiver/devices.h",
    "content": "/*\n    MICE Xbox 360 Controller driver for Mac OS X\n    Copyright (C) 2006-2013 Colin Munro\n    \n    devics.h - contains constants for the wireless driver\n    \n    This file is part of Xbox360Controller.\n\n    Xbox360Controller is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    Xbox360Controller is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with Foobar; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n#ifndef __DEVICES_H__\n#define __DEVICES_H__\n\n#define kIOWirelessDeviceType   \"Wireless360Device\"\n\n#define kIOWirelessBatteryLevel \"BatteryLevel\"\n\n#endif // __DEVICES_H__\n"
  },
  {
    "path": "WirelessGamingReceiver/version.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>BuildVersion</key>\n\t<string>12</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n\t<key>ProductBuildVersion</key>\n\t<string>7K571</string>\n\t<key>ProjectName</key>\n\t<string>DevToolsWizardTemplates</string>\n\t<key>SourceVersion</key>\n\t<string>3870000</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build",
    "content": "#!/bin/bash\nzip -r ../360ControllerSource.zip *\ncd Feedback360\nxcodebuild -configuration Deployment\nif [ $? -ne 0 ]\n  then\n    echo \"******** BUILD FAILED ********\"\n    exit 1\nfi\ncd ../DriverTool\nxcodebuild -configuration Release\nif [ $? -ne 0 ]\n  then\n    echo \"******** BUILD FAILED ********\"\n    exit 1\nfi\ncd ../360Controller\nxcodebuild -configuration Deployment\nif [ $? -ne 0 ]\n  then\n    echo \"******** BUILD FAILED ********\"\n    exit 1\nfi\ncd ../360Daemon\nxcodebuild -configuration Release\nif [ $? -ne 0 ]\n  then\n    echo \"******** BUILD FAILED ********\"\n    exit 1\nfi\ncd ../WirelessGamingReceiver\nxcodebuild -configuration Release\nif [ $? -ne 0 ]\n  then\n    echo \"******** BUILD FAILED ********\"\n    exit 1\nfi\ncd ../Wireless360Controller\nxcodebuild -configuration Release\nif [ $? -ne 0 ]\n  then\n    echo \"******** BUILD FAILED ********\"\n    exit 1\nfi\ncd ../Pref360Control\nxcodebuild -configuration Deployment \nif [ $? -ne 0 ]\n  then\n    echo \"******** BUILD FAILED ********\"\n    exit 1\nfi\ncd ../Install360Controller\npackagesbuild -v Install360Controller.pkgproj\nmv build 360ControllerInstall\nhdiutil create -srcfolder 360ControllerInstall -format UDZO ../../360ControllerInstall.dmg\nmv 360ControllerInstall build\ncd ..\necho \"** File contents **\"\nlipo -info 360Controller/build/Deployment/360Controller.kext/Contents/MacOS/360Controller\nlipo -info 360Controller/build/Deployment/360Controller.kext/Contents/PlugIns/Feedback360.plugin/Contents/MacOS/Feedback360\nlipo -info 360Daemon/build/Release/360Daemon\nlipo -info Pref360Control/build/Deployment/Pref360Control.prefPane/Contents/MacOS/Pref360Control\nlipo -info Pref360Control/build/Deployment/Pref360Control.prefPane/Contents/Resources/DriverTool\nlipo -info WirelessGamingReceiver/build/Release/WirelessGamingReceiver.kext/Contents/MacOS/WirelessGamingReceiver\nlipo -info Wireless360Controller/build/Release/Wireless360Controller.kext/Contents/MacOS/Wireless360Controller\necho \"** File signatures **\"\nsudo spctl -a -v 360Controller/build/Deployment/360Controller.kext\nsudo spctl -a -v 360Controller/build/Deployment/360Controller.kext/Contents/PlugIns/Feedback360.plugin\nsudo spctl -a -v 360Daemon/build/Release/360Daemon\nsudo spctl -a -v Pref360Control/build/Deployment/Pref360Control.prefPane\nsudo spctl -a -v Pref360Control/build/Deployment/Pref360Control.prefPane/Contents/Resources/DriverTool\nsudo spctl -a -v WirelessGamingReceiver/build/Release/WirelessGamingReceiver.kext\nsudo spctl -a -v Wireless360Controller/build/Release/Wireless360Controller.kext\nsudo spctl -a -v --type install Install360Controller/build/Install360Controller.pkg\necho \"*** DONE ***\"\n"
  }
]