Index: trunk/launch/launch/README
===================================================================
--- trunk/launch/launch/README	(revision 4)
+++ trunk/launch/launch/README	(revision 52)
@@ -1,3 +1,3 @@
-launch 1.0a9 [2 April 2002]
+launch 1.0b1 [14 December 2002]
 ============
 
@@ -13,5 +13,5 @@
 with Mac OS X.  It offers few options - launching applications by name
 or by path, launching TextEdit, or opening a number of applications,
-documents, folders, etc.  With the exception of special support for
+documents, folders, or URLs.  With the exception of special support for
 TextEdit, 'launch' does all this and:
 
@@ -23,4 +23,5 @@
 - asks applications to print documents, something the OS X Finder
   no longer permits
+- allows you to pipe output to GUI applictions
 - launches applications in the background
 - launches Carbon applications in Classic
@@ -60,6 +61,6 @@
 A Project Builder project, 'launch.pbproj', is included.  A
 precompiled binary is also provided.  'launch' was developed and
-tested under Mac OS 10.1 and 10.1.1 with the 10.1 Developer Tools, and
-does not require any additional software to build.
+tested under Mac OS 10.2.3 with the December 2002 Developer Tools,
+and does not require any additional software to build.
 
 USAGE
@@ -69,8 +70,4 @@
 
 Some examples:
-
-% launch -ni com.apple.iTunes
-/Applications/iTunes.app
-[hint, hint]
 
 % launch -c 'R*ch'
@@ -80,7 +77,14 @@
 [BBEdit starts printing test.txt in the background]
 
-% launch -l http://www.apple.com/
-[Your preferred Web browser opens Apple's Web site]
-
+% ls -l | launch -c CWIE 
+[CodeWarrior IDE opens with an untitled document containing the file list]
+
+% launch -i org.mozilla.navigator http://www.apple.com/
+[Chimera Navigator opens Apple's Web site]
+
+% launch -l launchsw@sabi.net
+[Your preferred email client opens a new message to comment on launch]
+
+% launch -f /Applications/Preview.app
 /Applications/Preview.app: Mac OS X application package 
         type: 'APPL'    creator: 'prvw'
@@ -109,6 +113,24 @@
 
 
+Q. Why does application X open a file with a name beginning with 
+'launch-stationery-'?  
+
+A. Your application does not support stationery.  Applications which
+support stationery respond to it by creating a new untitled document
+with the contents of the stationery.  Most (all?) Cocoa applications,
+such as TextEdit, do not support stationery.  If you're looking for
+a text editor which supports stationery, try BBEdit, Tex-Edit Plus,
+the CodeWarrior IDE, or almost any other Carbon editor.
+
+For the curious: launch processes input by simultaneously reading it
+and writing to a temporary stationery file.  Once reading is complete,
+launch opens the stationery file with your selected application, and
+deletes the stationery after one minute (as a safeguard, it is not
+possible to accurately gauge how long it will take for the application
+to open the stationery).
+
+
 Q. Why can't I use -f with -c to get info on an application with a
-given creator?
+given creator (or -f with -i for a bundle ID)?
 
 A. This feature may be added to a later version (or add it yourself!),
@@ -126,14 +148,25 @@
 
 
-Q. Why do bundle IDs not work for non-packaged applications?
-
-A. I think this is a LaunchServices/CFBundle bug.  For example, BBEdit
-6.1 for OS X was a packaged application; BBEdit 6.5 is not, however its
-'plst' resource contains a bundle ID.  LaunchServices is unable to
-locate BBEdit 6.5 by its bundle ID.
-
-Non-packaged applications usually come from older Mac OS applications,
-so they will have creators, which is a workaround (use -c instead of
--i).
+Q. Why won't launch locate non-packaged applications by their bundle
+identifier?
+
+A. This was a LaunchServices/CFBundle bug, fixed in Mac OS X 10.2.
+For example, BBEdit 6.1 for OS X was a packaged application; BBEdit
+6.5 is not, however its 'plst' resource contains a bundle ID.
+LaunchServices prior to OS X 10.2 was unable to locate BBEdit 6.5 by
+its bundle ID.
+
+Non-packaged applications usually originated as Mac OS applications,
+so they will have creators.  If you're using Mac OS X 10.1.x, try
+using the creator instead of the bundle ID as a workaround (-c instead
+of -i).
+
+
+Q. Why does launch display '[can't access CFBundle for application]'
+in place of the bundle identifiers of non-packaged applications?
+
+A. This is a CFBundle bug which remains as of Mac OS X 10.2.3.  If
+this matters to you, please ask Apple to fix it, or implement a
+workaround in launch by parsing the 'plst' id 0 resource directly.
 
 
@@ -191,17 +224,36 @@
 ---------------
 
-1.0a9 - 2 April 2002 - license, comments changes
-1.0a8 - 29 March 2002 - errors with -l (from ICeCoffEE), added rlaunch script
-1.0a7 - 3 March 2002 - print dates, sizes, folder valence, locked status for -f,
-                       don't abort on failure to obtain bundle information
-1.0a6 - 30 November 2001 - fixed incorrect messages, broken -u and crash on -nu
-1.0a5 - 28 November 2001 - print kind string for -f, still no new installer
-1.0a4 - 20 November 2001 - [try to] use Installer VISE instead of InstallAnywhere
-1.0a3 - 15 November 2001 - fixed package identification in -f, updated examples
-1.0a2 - 15 November 2001 - -f, removed broken -m
-1.0a1 - 14 November 2001 - renamed from "FindApp", launch by default, -u
-1.0d5 - 7 November 2001 - option -s for launching as root [nonfunctional]
-1.0d4 - 6 November 2001 - URL launching and Internet Config support
-1.0d3 - 4 November 2001 - more robust, support for docs without app
-1.0d2 - 4 November 2001 - options -opsbmhCX, -cin, documents
-1.0d1 - 26 August 2001 - returns path of application identified by creator
+1.0b1 - 14 December 2002
+ - accept "slack" (default http) URLs and email addresses with -l
+ - accept input from stdin with '-'
+ - open URLs with arbitrary applications when specified without -l
+ - builds without compiler warnings
+1.0a9 - 2 April 2002
+ - license, comments changes
+1.0a8 - 29 March 2002
+ - errors with -l (from ICeCoffEE), added rlaunch script
+1.0a7 - 3 March 2002
+ - print dates, sizes, folder valence, locked status for -f
+ - don't abort on failure to obtain bundle information
+1.0a6 - 30 November 2001
+ - fixed incorrect messages, broken -u and crash on -nu
+1.0a5 - 28 November 2001
+ - print kind string for -f, still no new installer
+1.0a4 - 20 November 2001
+ - [try to] use Installer VISE instead of InstallAnywhere
+1.0a3 - 15 November 2001
+ - fixed package identification in -f, updated examples
+1.0a2 - 15 November 2001
+ - -f, removed broken -m
+1.0a1 - 14 November 2001
+ - renamed from "FindApp", launch by default, -u
+1.0d5 - 7 November 2001
+ - option -s for launching as root [nonfunctional]
+1.0d4 - 6 November 2001
+ - URL launching and Internet Config support
+1.0d3 - 4 November 2001
+ - more robust, support for docs without app
+1.0d2 - 4 November 2001
+ - options -opsbmhCX, -cin, documents
+1.0d1 - 26 August 2001
+ - returns path of application identified by creator
Index: trunk/launch/launch/VERSION
===================================================================
--- trunk/launch/launch/VERSION	(revision 4)
+++ trunk/launch/launch/VERSION	(revision 52)
@@ -1,1 +1,1 @@
-1.0a9
+1.0b1
Index: trunk/launch/launch/launch.pbproj/nicholas.pbxuser
===================================================================
--- trunk/launch/launch/launch.pbproj/nicholas.pbxuser	(revision 4)
+++ trunk/launch/launch/launch.pbproj/nicholas.pbxuser	(revision 52)
@@ -2,5 +2,5 @@
 {
 	08FB7793FE84155DC02AAC07 = {
-		activeBuildStyle = 014CEA4A0018CE3211CA2923;
+		activeBuildStyle = 014CEA490018CE3211CA2923;
 		activeExecutable = F561F49E0139D79101AEEDB1;
 		activeTarget = 08FB779FFE84155DC02AAC07;
@@ -10,4 +10,5 @@
 		breakpoints = (
 			F5F4D74101B55E0801AEEDB1,
+			E190CFFD03AAA8A300AEFBE0,
 		);
 		executables = (
@@ -15,5 +16,515 @@
 		);
 		perUserDictionary = {
-			PBXPerProjectTemplateStateSaveDate = 52114527;
+			PBXPerProjectTemplateStateSaveDate = 61528480;
+			"PBXTemplateGeometry-F5314676015831810DCA290F" = {
+				ContentSize = "{685, 434}";
+				LeftSlideOut = {
+					Collapsed = NO;
+					Frame = "{{0, 23}, {685, 411}}";
+					Split0 = {
+						ActiveTab = 2;
+						ActiveTabName = PBXBuildResultsModule;
+						Collapsed = NO;
+						Frame = "{{0, 0}, {685, 411}}";
+						Split0 = {
+							Frame = "{{0, 191}, {685, 220}}";
+						};
+						SplitCount = 1;
+						Tab0 = {
+							Frame = "{{0, 0}, {952, 321}}";
+						};
+						Tab1 = {
+							Debugger = {
+								Collapsed = NO;
+								Frame = "{{0, 0}, {781, 452}}";
+								Split0 = {
+									Frame = "{{0, 24}, {781, 428}}";
+									Split0 = {
+										Frame = "{{0, 0}, {383, 428}}";
+									};
+									Split1 = {
+										DebugVariablesTableConfiguration = (
+											Name,
+											123,
+											Value,
+											85,
+											Summary,
+											155.123,
+										);
+										Frame = "{{392, 0}, {389, 428}}";
+									};
+									SplitCount = 2;
+								};
+								SplitCount = 1;
+								Tab0 = {
+									Frame = "{{0, 0}, {100, 50}}";
+								};
+								Tab1 = {
+									Frame = "{{0, 0}, {100, 50}}";
+								};
+								TabCount = 2;
+								TabsVisible = YES;
+							};
+							Frame = "{{0, 0}, {781, 452}}";
+							LauncherConfigVersion = 7;
+						};
+						Tab2 = {
+							Frame = "{{0, 0}, {685, 215}}";
+							LauncherConfigVersion = 3;
+							Runner = {
+								Frame = "{{0, 0}, {685, 215}}";
+							};
+						};
+						Tab3 = {
+							BuildMessageFrame = "{{0, 0}, {687, 152}}";
+							BuildTranscriptFrame = "{{0, 161}, {687, 2}}";
+							BuildTranscriptFrameExpanded = YES;
+							Frame = "{{0, 0}, {685, 185}}";
+						};
+						Tab4 = {
+							Frame = "{{0, 0}, {612, 295}}";
+						};
+						TabCount = 5;
+						TabsVisible = NO;
+					};
+					SplitCount = 1;
+					Tab0 = {
+						Frame = "{{0, 0}, {300, 533}}";
+						GroupTreeTableConfiguration = (
+							TargetStatusColumn,
+							18,
+							MainColumn,
+							267,
+						);
+					};
+					Tab1 = {
+						ClassesFrame = "{{0, 0}, {280, 398}}";
+						ClassesTreeTableConfiguration = (
+							PBXBookColumnIdentifier,
+							20,
+							PBXClassColumnIdentifier,
+							237,
+						);
+						Frame = "{{0, 0}, {278, 659}}";
+						MembersFrame = "{{0, 407}, {280, 252}}";
+						MembersTreeTableConfiguration = (
+							PBXBookColumnIdentifier,
+							20,
+							PBXMethodColumnIdentifier,
+							236,
+						);
+					};
+					Tab2 = {
+						Frame = "{{0, 0}, {200, 100}}";
+					};
+					Tab3 = {
+						Frame = "{{0, 0}, {200, 100}}";
+						TargetTableConfiguration = (
+							ActiveObject,
+							16,
+							ObjectNames,
+							202.296,
+						);
+					};
+					Tab4 = {
+						BreakpointsTreeTableConfiguration = (
+							breakpointColumn,
+							197,
+							enabledColumn,
+							31,
+						);
+						Frame = "{{0, 0}, {250, 100}}";
+					};
+					TabCount = 5;
+					TabsVisible = NO;
+				};
+				NavBarShownByDefault = YES;
+				StatusViewVisible = YES;
+				Template = F5314676015831810DCA290F;
+				ToolbarVisible = YES;
+				WindowLocation = "{29, 98}";
+			};
+			"PBXTemplateGeometry-F5534CB2020F3F8A0DCA290F" = {
+				ContentSize = "{594, 303}";
+				LeftSlideOut = {
+					Collapsed = NO;
+					Frame = "{{0, 23}, {594, 280}}";
+					Split0 = {
+						ActiveTab = 1;
+						ActiveTabName = PBXRunSessionModule;
+						Collapsed = YES;
+						Frame = "{{0, 0}, {594, 280}}";
+						Split0 = {
+							Frame = "{{1e+06, 1e+06}, {594, 0}}";
+						};
+						SplitCount = 1;
+						Tab0 = {
+							Frame = "{{0, 0}, {804, 321}}";
+						};
+						Tab1 = {
+							Debugger = {
+								Collapsed = NO;
+								Frame = "{{0, 0}, {594, 274}}";
+								Split0 = {
+									Frame = "{{0, 24}, {594, 250}}";
+									Split0 = {
+										Frame = "{{0, 0}, {290, 250}}";
+									};
+									Split1 = {
+										DebugVariablesTableConfiguration = (
+											Name,
+											123,
+											Value,
+											85,
+											Summary,
+											62.123,
+										);
+										Frame = "{{299, 0}, {295, 250}}";
+									};
+									SplitCount = 2;
+								};
+								SplitCount = 1;
+								Tab0 = {
+									Frame = "{{0, 0}, {100, 50}}";
+								};
+								Tab1 = {
+									Frame = "{{0, 0}, {100, 50}}";
+								};
+								TabCount = 2;
+								TabsVisible = YES;
+							};
+							Frame = "{{0, 0}, {594, 274}}";
+							LauncherConfigVersion = 7;
+						};
+						Tab2 = {
+							Frame = "{{0, 0}, {594, 274}}";
+							LauncherConfigVersion = 3;
+							Runner = {
+								Frame = "{{0, 0}, {594, 274}}";
+							};
+						};
+						Tab3 = {
+							BuildMessageFrame = "{{0, 0}, {614, 262}}";
+							BuildTranscriptFrame = "{{0, 271}, {614, 2}}";
+							BuildTranscriptFrameExpanded = YES;
+							Frame = "{{0, 0}, {612, 295}}";
+						};
+						Tab4 = {
+							Frame = "{{0, 0}, {612, 295}}";
+						};
+						TabCount = 5;
+						TabsVisible = NO;
+					};
+					SplitCount = 1;
+					Tab0 = {
+						Frame = "{{0, 0}, {300, 533}}";
+						GroupTreeTableConfiguration = (
+							TargetStatusColumn,
+							18,
+							MainColumn,
+							267,
+						);
+					};
+					Tab1 = {
+						ClassesFrame = "{{0, 0}, {280, 398}}";
+						ClassesTreeTableConfiguration = (
+							PBXBookColumnIdentifier,
+							20,
+							PBXClassColumnIdentifier,
+							237,
+						);
+						Frame = "{{0, 0}, {278, 659}}";
+						MembersFrame = "{{0, 407}, {280, 252}}";
+						MembersTreeTableConfiguration = (
+							PBXBookColumnIdentifier,
+							20,
+							PBXMethodColumnIdentifier,
+							236,
+						);
+					};
+					Tab2 = {
+						Frame = "{{0, 0}, {200, 100}}";
+					};
+					Tab3 = {
+						Frame = "{{0, 0}, {200, 386}}";
+						TargetTableConfiguration = (
+							ActiveObject,
+							16,
+							ObjectNames,
+							202.296,
+						);
+					};
+					Tab4 = {
+						BreakpointsTreeTableConfiguration = (
+							breakpointColumn,
+							197,
+							enabledColumn,
+							31,
+						);
+						Frame = "{{0, 0}, {250, 386}}";
+					};
+					TabCount = 5;
+					TabsVisible = NO;
+				};
+				NavBarShownByDefault = YES;
+				StatusViewVisible = YES;
+				Template = F5534CB2020F3F8A0DCA290F;
+				ToolbarVisible = YES;
+				WindowLocation = "{34, -15}";
+			};
+			"PBXTemplateGeometry-F5CA7EC9015C08ED0DCA290F" = {
+				ContentSize = "{665, 594}";
+				LeftSlideOut = {
+					Collapsed = NO;
+					Frame = "{{0, 0}, {665, 594}}";
+					Split0 = {
+						ActiveTab = 3;
+						ActiveTabName = PBXProjectFindModule;
+						Collapsed = NO;
+						Frame = "{{0, 0}, {665, 594}}";
+						Split0 = {
+							Frame = "{{0, 301}, {665, 293}}";
+						};
+						SplitCount = 1;
+						Tab0 = {
+							Frame = "{{0, 0}, {484, 208}}";
+						};
+						Tab1 = {
+							Debugger = {
+								Collapsed = NO;
+								Frame = "{{0, 0}, {664, 208}}";
+								Split0 = {
+									Frame = "{{0, 24}, {664, 184}}";
+									Split0 = {
+										Frame = "{{0, 0}, {325, 184}}";
+									};
+									Split1 = {
+										DebugVariablesTableConfiguration = (
+											Name,
+											123,
+											Value,
+											85,
+											Summary,
+											96.123,
+										);
+										Frame = "{{334, 0}, {330, 184}}";
+									};
+									SplitCount = 2;
+								};
+								SplitCount = 1;
+								Tab0 = {
+									Frame = "{{0, 0}, {100, 50}}";
+								};
+								Tab1 = {
+									Frame = "{{0, 0}, {100, 50}}";
+								};
+								TabCount = 2;
+								TabsVisible = YES;
+							};
+							Frame = "{{0, 0}, {664, 208}}";
+							LauncherConfigVersion = 7;
+						};
+						Tab2 = {
+							Frame = "{{0, 0}, {664, 50}}";
+							LauncherConfigVersion = 3;
+							Runner = {
+								Frame = "{{0, 0}, {664, 50}}";
+							};
+						};
+						Tab3 = {
+							BuildMessageFrame = "{{0, 0}, {667, 265}}";
+							BuildTranscriptFrame = "{{0, 274}, {667, 2}}";
+							BuildTranscriptFrameExpanded = YES;
+							Frame = "{{0, 0}, {665, 298}}";
+						};
+						Tab4 = {
+							Frame = "{{0, 0}, {665, 295}}";
+						};
+						TabCount = 5;
+						TabsVisible = NO;
+					};
+					SplitCount = 1;
+					Tab0 = {
+						Frame = "{{0, 0}, {313, 531}}";
+						GroupTreeTableConfiguration = (
+							TargetStatusColumn,
+							18,
+							MainColumn,
+							280,
+						);
+					};
+					Tab1 = {
+						ClassesFrame = "{{0, 0}, {280, 398}}";
+						ClassesTreeTableConfiguration = (
+							PBXBookColumnIdentifier,
+							20,
+							PBXClassColumnIdentifier,
+							237,
+						);
+						Frame = "{{0, 0}, {278, 659}}";
+						MembersFrame = "{{0, 407}, {280, 252}}";
+						MembersTreeTableConfiguration = (
+							PBXBookColumnIdentifier,
+							20,
+							PBXMethodColumnIdentifier,
+							236,
+						);
+					};
+					Tab2 = {
+						Frame = "{{0, 0}, {200, 100}}";
+					};
+					Tab3 = {
+						Frame = "{{0, 0}, {200, 557}}";
+						TargetTableConfiguration = (
+							ActiveObject,
+							16,
+							ObjectNames,
+							202.296,
+						);
+					};
+					Tab4 = {
+						BreakpointsTreeTableConfiguration = (
+							breakpointColumn,
+							197,
+							enabledColumn,
+							31,
+						);
+						Frame = "{{0, 0}, {250, 100}}";
+					};
+					TabCount = 5;
+					TabsVisible = NO;
+				};
+				NavBarShownByDefault = YES;
+				StatusViewVisible = NO;
+				Template = F5CA7EC9015C08ED0DCA290F;
+				ToolbarVisible = NO;
+				WindowLocation = "{293, 27}";
+			};
+			"PBXTemplateGeometry-F5CA7ECB015C094F0DCA290F" = {
+				ContentSize = "{668, 621}";
+				LeftSlideOut = {
+					Collapsed = NO;
+					Frame = "{{0, 0}, {668, 621}}";
+					Split0 = {
+						Collapsed = NO;
+						Frame = "{{0, 0}, {668, 621}}";
+						Split0 = {
+							Frame = "{{0, 0}, {668, 621}}";
+						};
+						SplitCount = 1;
+						Tab0 = {
+							Frame = "{{0, 0}, {484, 208}}";
+						};
+						Tab1 = {
+							Debugger = {
+								Collapsed = NO;
+								Frame = "{{0, 0}, {664, 208}}";
+								Split0 = {
+									Frame = "{{0, 24}, {664, 184}}";
+									Split0 = {
+										Frame = "{{0, 0}, {325, 184}}";
+									};
+									Split1 = {
+										DebugVariablesTableConfiguration = (
+											Name,
+											123,
+											Value,
+											85,
+											Summary,
+											96.123,
+										);
+										Frame = "{{334, 0}, {330, 184}}";
+									};
+									SplitCount = 2;
+								};
+								SplitCount = 1;
+								Tab0 = {
+									Frame = "{{0, 0}, {100, 50}}";
+								};
+								Tab1 = {
+									Frame = "{{0, 0}, {100, 50}}";
+								};
+								TabCount = 2;
+								TabsVisible = YES;
+							};
+							Frame = "{{0, 0}, {664, 208}}";
+							LauncherConfigVersion = 7;
+						};
+						Tab2 = {
+							Frame = "{{0, 0}, {664, 50}}";
+							LauncherConfigVersion = 3;
+							Runner = {
+								Frame = "{{0, 0}, {664, 50}}";
+							};
+						};
+						Tab3 = {
+							BuildMessageFrame = "{{0, 0}, {614, 262}}";
+							BuildTranscriptFrame = "{{0, 271}, {614, 2}}";
+							BuildTranscriptFrameExpanded = YES;
+							Frame = "{{0, 0}, {612, 295}}";
+						};
+						Tab4 = {
+							Frame = "{{0, 0}, {612, 295}}";
+						};
+						TabCount = 5;
+						TabsVisible = NO;
+					};
+					SplitCount = 1;
+					Tab0 = {
+						Frame = "{{0, 0}, {313, 531}}";
+						GroupTreeTableConfiguration = (
+							TargetStatusColumn,
+							18,
+							MainColumn,
+							280,
+						);
+					};
+					Tab1 = {
+						ClassesFrame = "{{0, 0}, {280, 398}}";
+						ClassesTreeTableConfiguration = (
+							PBXBookColumnIdentifier,
+							20,
+							PBXClassColumnIdentifier,
+							237,
+						);
+						Frame = "{{0, 0}, {278, 659}}";
+						MembersFrame = "{{0, 407}, {280, 252}}";
+						MembersTreeTableConfiguration = (
+							PBXBookColumnIdentifier,
+							20,
+							PBXMethodColumnIdentifier,
+							236,
+						);
+					};
+					Tab2 = {
+						Frame = "{{0, 0}, {200, 100}}";
+					};
+					Tab3 = {
+						Frame = "{{0, 0}, {200, 557}}";
+						TargetTableConfiguration = (
+							ActiveObject,
+							16,
+							ObjectNames,
+							202.296,
+						);
+					};
+					Tab4 = {
+						BreakpointsTreeTableConfiguration = (
+							breakpointColumn,
+							197,
+							enabledColumn,
+							31,
+						);
+						Frame = "{{0, 0}, {250, 100}}";
+					};
+					TabCount = 5;
+					TabsVisible = NO;
+				};
+				NavBarShownByDefault = YES;
+				StatusViewVisible = NO;
+				Template = F5CA7ECB015C094F0DCA290F;
+				ToolbarVisible = NO;
+				WindowLocation = "{615, 189}";
+			};
 			PBXWorkspaceContents = (
 				{
@@ -22,17 +533,31 @@
 							Split0 = {
 								NavContent0 = {
-									bookmark = F5F80FB1031B348401850618;
+									bookmark = E190D00A03AAD96100AEFBE0;
 									history = (
-										F5F80FB0031B348401850618,
+										E190CFFE03AAD96100AEFBE0,
+										E190CFFF03AAD96100AEFBE0,
+										E190D00003AAD96100AEFBE0,
+										E190D00103AAD96100AEFBE0,
+										E190D00203AAD96100AEFBE0,
+										E190D00303AAD96100AEFBE0,
+									);
+									prevStack = (
+										E190D00403AAD96100AEFBE0,
+										E190D00503AAD96100AEFBE0,
+										E190D00603AAD96100AEFBE0,
+										E190D00703AAD96100AEFBE0,
+										E190D00803AAD96100AEFBE0,
+										E190D00903AAD96100AEFBE0,
 									);
 								};
 								NavCount = 1;
 								NavGeometry0 = {
-									Frame = "{{0, 0}, {571, 548}}";
+									Frame = "{{0, 0}, {738, 554}}";
 									NavBarVisible = YES;
 								};
+								NavSplitVertical = NO;
 							};
 							SplitCount = 1;
-							Tab0 = {
+							Tab1 = {
 								Debugger = {
 									Split0 = {
@@ -44,10 +569,10 @@
 								LauncherConfigVersion = 7;
 							};
-							Tab1 = {
+							Tab2 = {
 								LauncherConfigVersion = 3;
 								Runner = {
 								};
 							};
-							TabCount = 4;
+							TabCount = 5;
 						};
 						SplitCount = 1;
@@ -55,8 +580,119 @@
 							OptionsSetName = "Hierarchy, all classes";
 						};
-						Tab3 = {
-							SplitCount = 2;
-						};
-						TabCount = 6;
+						TabCount = 5;
+					};
+				},
+				{
+					LeftSlideOut = {
+						Split0 = {
+							Split0 = {
+								NavCount = 1;
+								NavGeometry0 = {
+									Frame = "{{0, 0}, {685, 220}}";
+									NavBarVisible = YES;
+								};
+								NavSplitVertical = NO;
+							};
+							SplitCount = 1;
+							Tab1 = {
+								Debugger = {
+									Split0 = {
+										SplitCount = 2;
+									};
+									SplitCount = 1;
+									TabCount = 2;
+								};
+								LauncherConfigVersion = 7;
+							};
+							Tab2 = {
+								LauncherConfigVersion = 3;
+								Runner = {
+								};
+							};
+							TabCount = 5;
+						};
+						SplitCount = 1;
+						Tab1 = {
+							OptionsSetName = "Hierarchy, all classes";
+						};
+						TabCount = 5;
+					};
+				},
+				{
+					LeftSlideOut = {
+						Split0 = {
+							Split0 = {
+								NavCount = 1;
+								NavGeometry0 = {
+									Frame = "{{0, 0}, {594, 150}}";
+									NavBarVisible = YES;
+								};
+								NavSplitVertical = NO;
+							};
+							SplitCount = 1;
+							Tab1 = {
+								Debugger = {
+									Split0 = {
+										SplitCount = 2;
+									};
+									SplitCount = 1;
+									TabCount = 2;
+								};
+								LauncherConfigVersion = 7;
+							};
+							Tab2 = {
+								LauncherConfigVersion = 3;
+								Runner = {
+								};
+							};
+							TabCount = 5;
+						};
+						SplitCount = 1;
+						Tab1 = {
+							OptionsSetName = "Hierarchy, all classes";
+						};
+						TabCount = 5;
+					};
+				},
+				{
+					LeftSlideOut = {
+						Split0 = {
+							Split0 = {
+								NavContent0 = {
+									bookmark = E190D00C03AAD96100AEFBE0;
+									history = (
+										E190D00B03AAD96100AEFBE0,
+									);
+								};
+								NavCount = 1;
+								NavGeometry0 = {
+									Frame = "{{0, 0}, {668, 621}}";
+									NavBarVisible = YES;
+								};
+								NavSplitVertical = NO;
+							};
+							SplitCount = 1;
+							Tab1 = {
+								Debugger = {
+									Split0 = {
+										SplitCount = 2;
+									};
+									SplitCount = 1;
+									TabCount = 2;
+								};
+								LauncherConfigVersion = 7;
+							};
+							Tab2 = {
+								LauncherConfigVersion = 3;
+								Runner = {
+								};
+							};
+							TabCount = 5;
+						};
+						SplitCount = 1;
+						Tab1 = {
+							OptionsSetName = "Hierarchy, all classes";
+						};
+						TabCount = 5;
 					};
 				},
@@ -64,35 +700,39 @@
 			PBXWorkspaceGeometries = (
 				{
-					ContentSize = "{855, 571}";
+					ContentSize = "{1001, 577}";
 					LeftSlideOut = {
-						ActiveTab = 0;
+						ActiveTab = 3;
+						ActiveTabName = PBXTargetTreeModule;
 						Collapsed = NO;
-						Frame = "{{0, 23}, {855, 548}}";
+						Frame = "{{0, 23}, {1001, 554}}";
 						Split0 = {
 							Collapsed = NO;
-							Frame = "{{284, 0}, {571, 548}}";
+							Frame = "{{263, 0}, {738, 554}}";
 							Split0 = {
-								Frame = "{{0, 0}, {571, 548}}";
+								Frame = "{{0, 0}, {738, 554}}";
 							};
 							SplitCount = 1;
 							Tab0 = {
+								Frame = "{{0, 0}, {681, 289}}";
+							};
+							Tab1 = {
 								Debugger = {
 									Collapsed = NO;
-									Frame = "{{0, 0}, {681, 289}}";
+									Frame = "{{0, 0}, {681, 150}}";
 									Split0 = {
-										Frame = "{{0, 24}, {681, 265}}";
+										Frame = "{{0, 24}, {681, 126}}";
 										Split0 = {
-											Frame = "{{0, 0}, {333, 265}}";
+											Frame = "{{0, 0}, {333, 126}}";
 										};
 										Split1 = {
 											DebugVariablesTableConfiguration = (
 												Name,
-												82.80298,
+												123,
 												Value,
-												104.074,
+												85,
 												Summary,
-												126.123,
+												105.123,
 											);
-											Frame = "{{342, 0}, {339, 265}}";
+											Frame = "{{342, 0}, {339, 126}}";
 										};
 										SplitCount = 2;
@@ -108,28 +748,29 @@
 									TabsVisible = YES;
 								};
-								Frame = "{{0, 0}, {681, 289}}";
+								Frame = "{{0, 0}, {681, 120}}";
 								LauncherConfigVersion = 7;
 							};
-							Tab1 = {
-								Frame = "{{0, 0}, {681, 120}}";
+							Tab2 = {
+								Frame = "{{0, 0}, {681, 234}}";
 								LauncherConfigVersion = 3;
 								Runner = {
-									Frame = "{{0, 0}, {681, 120}}";
-								};
-							};
-							Tab2 = {
-								BuildMessageFrame = "{{0, 0}, {683, 127}}";
-								BuildTranscriptFrame = "{{0, 136}, {683, 100}}";
-								Frame = "{{0, 0}, {681, 234}}";
+									Frame = "{{0, 0}, {681, 234}}";
+								};
 							};
 							Tab3 = {
+								BuildMessageFrame = "{{0, 0}, {683, 205}}";
+								BuildTranscriptFrame = "{{0, 214}, {683, 2}}";
+								BuildTranscriptFrameExpanded = YES;
 								Frame = "{{0, 0}, {681, 238}}";
 							};
-							TabCount = 4;
+							Tab4 = {
+								Frame = "{{0, 0}, {612, 295}}";
+							};
+							TabCount = 5;
 							TabsVisible = NO;
 						};
 						SplitCount = 1;
 						Tab0 = {
-							Frame = "{{0, 0}, {260, 548}}";
+							Frame = "{{0, 0}, {260, 554}}";
 							GroupTreeTableConfiguration = (
 								TargetStatusColumn,
@@ -157,38 +798,16 @@
 						};
 						Tab2 = {
-							Frame = "{{0, 0}, {217, 554}}";
+							Frame = "{{0, 0}, {216, 554}}";
 						};
 						Tab3 = {
 							Frame = "{{0, 0}, {239, 554}}";
-							Split0 = {
-								Frame = "{{0, 0}, {239, 268}}";
-								TargetTreeTableConfiguration = (
-									ActiveTarget,
-									16,
-									TargetName,
-									207,
-								);
-							};
-							Split1 = {
-								BuildStyleTreeTableConfiguration = (
-									IsActive,
-									16,
-									Name,
-									208,
-								);
-								Frame = "{{0, 277}, {239, 277}}";
-							};
-							SplitCount = 2;
+							TargetTableConfiguration = (
+								ActiveObject,
+								16,
+								ObjectNames,
+								206.296,
+							);
 						};
 						Tab4 = {
-							ExecutableTreeTableConfiguration = (
-								ActiveExecutable,
-								16,
-								ExecutableName,
-								217,
-							);
-							Frame = "{{0, 0}, {250, 554}}";
-						};
-						Tab5 = {
 							BreakpointsTreeTableConfiguration = (
 								breakpointColumn,
@@ -199,21 +818,418 @@
 							Frame = "{{0, 0}, {250, 554}}";
 						};
-						TabCount = 6;
+						TabCount = 5;
 						TabsVisible = YES;
 					};
+					NavBarShownByDefault = YES;
 					StatusViewVisible = YES;
 					Template = 64ABBB4501FA494900185B06;
 					ToolbarVisible = YES;
-					WindowLocation = "{5, 199}";
+					WindowLocation = "{5, 193}";
+				},
+				{
+					ContentSize = "{685, 434}";
+					LeftSlideOut = {
+						Collapsed = NO;
+						Frame = "{{0, 23}, {685, 411}}";
+						Split0 = {
+							ActiveTab = 2;
+							ActiveTabName = PBXBuildResultsModule;
+							Collapsed = NO;
+							Frame = "{{0, 0}, {685, 411}}";
+							Split0 = {
+								Frame = "{{0, 191}, {685, 220}}";
+							};
+							SplitCount = 1;
+							Tab0 = {
+								Frame = "{{0, 0}, {952, 321}}";
+							};
+							Tab1 = {
+								Debugger = {
+									Collapsed = NO;
+									Frame = "{{0, 0}, {781, 452}}";
+									Split0 = {
+										Frame = "{{0, 24}, {781, 428}}";
+										Split0 = {
+											Frame = "{{0, 0}, {383, 428}}";
+										};
+										Split1 = {
+											DebugVariablesTableConfiguration = (
+												Name,
+												123,
+												Value,
+												85,
+												Summary,
+												155.123,
+											);
+											Frame = "{{392, 0}, {389, 428}}";
+										};
+										SplitCount = 2;
+									};
+									SplitCount = 1;
+									Tab0 = {
+										Frame = "{{0, 0}, {100, 50}}";
+									};
+									Tab1 = {
+										Frame = "{{0, 0}, {100, 50}}";
+									};
+									TabCount = 2;
+									TabsVisible = YES;
+								};
+								Frame = "{{0, 0}, {781, 452}}";
+								LauncherConfigVersion = 7;
+							};
+							Tab2 = {
+								Frame = "{{0, 0}, {685, 215}}";
+								LauncherConfigVersion = 3;
+								Runner = {
+									Frame = "{{0, 0}, {685, 215}}";
+								};
+							};
+							Tab3 = {
+								BuildMessageFrame = "{{0, 0}, {687, 152}}";
+								BuildTranscriptFrame = "{{0, 161}, {687, 2}}";
+								BuildTranscriptFrameExpanded = YES;
+								Frame = "{{0, 0}, {685, 185}}";
+							};
+							Tab4 = {
+								Frame = "{{0, 0}, {612, 295}}";
+							};
+							TabCount = 5;
+							TabsVisible = NO;
+						};
+						SplitCount = 1;
+						Tab0 = {
+							Frame = "{{0, 0}, {300, 533}}";
+							GroupTreeTableConfiguration = (
+								TargetStatusColumn,
+								18,
+								MainColumn,
+								267,
+							);
+						};
+						Tab1 = {
+							ClassesFrame = "{{0, 0}, {280, 398}}";
+							ClassesTreeTableConfiguration = (
+								PBXBookColumnIdentifier,
+								20,
+								PBXClassColumnIdentifier,
+								237,
+							);
+							Frame = "{{0, 0}, {278, 659}}";
+							MembersFrame = "{{0, 407}, {280, 252}}";
+							MembersTreeTableConfiguration = (
+								PBXBookColumnIdentifier,
+								20,
+								PBXMethodColumnIdentifier,
+								236,
+							);
+						};
+						Tab2 = {
+							Frame = "{{0, 0}, {200, 100}}";
+						};
+						Tab3 = {
+							Frame = "{{0, 0}, {200, 100}}";
+							TargetTableConfiguration = (
+								ActiveObject,
+								16,
+								ObjectNames,
+								202.296,
+							);
+						};
+						Tab4 = {
+							BreakpointsTreeTableConfiguration = (
+								breakpointColumn,
+								197,
+								enabledColumn,
+								31,
+							);
+							Frame = "{{0, 0}, {250, 100}}";
+						};
+						TabCount = 5;
+						TabsVisible = NO;
+					};
+					NavBarShownByDefault = YES;
+					StatusViewVisible = YES;
+					Template = F5314676015831810DCA290F;
+					ToolbarVisible = YES;
+					WindowLocation = "{29, 98}";
+				},
+				{
+					ContentSize = "{594, 303}";
+					LeftSlideOut = {
+						Collapsed = NO;
+						Frame = "{{0, 23}, {594, 280}}";
+						Split0 = {
+							ActiveTab = 1;
+							ActiveTabName = PBXRunSessionModule;
+							Collapsed = YES;
+							Frame = "{{0, 0}, {594, 280}}";
+							Split0 = {
+								Frame = "{{1e+06, 1e+06}, {594, 27}}";
+							};
+							SplitCount = 1;
+							Tab0 = {
+								Frame = "{{0, 0}, {804, 321}}";
+							};
+							Tab1 = {
+								Debugger = {
+									Collapsed = NO;
+									Frame = "{{0, 0}, {594, 274}}";
+									Split0 = {
+										Frame = "{{0, 24}, {594, 250}}";
+										Split0 = {
+											Frame = "{{0, 0}, {290, 250}}";
+										};
+										Split1 = {
+											DebugVariablesTableConfiguration = (
+												Name,
+												123,
+												Value,
+												85,
+												Summary,
+												62.123,
+											);
+											Frame = "{{299, 0}, {295, 250}}";
+										};
+										SplitCount = 2;
+									};
+									SplitCount = 1;
+									Tab0 = {
+										Frame = "{{0, 0}, {100, 50}}";
+									};
+									Tab1 = {
+										Frame = "{{0, 0}, {100, 50}}";
+									};
+									TabCount = 2;
+									TabsVisible = YES;
+								};
+								Frame = "{{0, 0}, {594, 274}}";
+								LauncherConfigVersion = 7;
+							};
+							Tab2 = {
+								Frame = "{{0, 0}, {594, 274}}";
+								LauncherConfigVersion = 3;
+								Runner = {
+									Frame = "{{0, 0}, {594, 274}}";
+								};
+							};
+							Tab3 = {
+								BuildMessageFrame = "{{0, 0}, {614, 262}}";
+								BuildTranscriptFrame = "{{0, 271}, {614, 2}}";
+								BuildTranscriptFrameExpanded = YES;
+								Frame = "{{0, 0}, {612, 295}}";
+							};
+							Tab4 = {
+								Frame = "{{0, 0}, {612, 295}}";
+							};
+							TabCount = 5;
+							TabsVisible = NO;
+						};
+						SplitCount = 1;
+						Tab0 = {
+							Frame = "{{0, 0}, {300, 533}}";
+							GroupTreeTableConfiguration = (
+								TargetStatusColumn,
+								18,
+								MainColumn,
+								267,
+							);
+						};
+						Tab1 = {
+							ClassesFrame = "{{0, 0}, {280, 398}}";
+							ClassesTreeTableConfiguration = (
+								PBXBookColumnIdentifier,
+								20,
+								PBXClassColumnIdentifier,
+								237,
+							);
+							Frame = "{{0, 0}, {278, 659}}";
+							MembersFrame = "{{0, 407}, {280, 252}}";
+							MembersTreeTableConfiguration = (
+								PBXBookColumnIdentifier,
+								20,
+								PBXMethodColumnIdentifier,
+								236,
+							);
+						};
+						Tab2 = {
+							Frame = "{{0, 0}, {200, 100}}";
+						};
+						Tab3 = {
+							Frame = "{{0, 0}, {200, 386}}";
+							TargetTableConfiguration = (
+								ActiveObject,
+								16,
+								ObjectNames,
+								202.296,
+							);
+						};
+						Tab4 = {
+							BreakpointsTreeTableConfiguration = (
+								breakpointColumn,
+								197,
+								enabledColumn,
+								31,
+							);
+							Frame = "{{0, 0}, {250, 386}}";
+						};
+						TabCount = 5;
+						TabsVisible = NO;
+					};
+					NavBarShownByDefault = YES;
+					StatusViewVisible = YES;
+					Template = F5534CB2020F3F8A0DCA290F;
+					ToolbarVisible = YES;
+					WindowLocation = "{34, -15}";
+				},
+				{
+					ContentSize = "{668, 621}";
+					LeftSlideOut = {
+						Collapsed = NO;
+						Frame = "{{0, 0}, {668, 621}}";
+						Split0 = {
+							Collapsed = NO;
+							Frame = "{{0, 0}, {668, 621}}";
+							Split0 = {
+								Frame = "{{0, 0}, {668, 621}}";
+							};
+							SplitCount = 1;
+							Tab0 = {
+								Frame = "{{0, 0}, {484, 208}}";
+							};
+							Tab1 = {
+								Debugger = {
+									Collapsed = NO;
+									Frame = "{{0, 0}, {664, 208}}";
+									Split0 = {
+										Frame = "{{0, 24}, {664, 184}}";
+										Split0 = {
+											Frame = "{{0, 0}, {325, 184}}";
+										};
+										Split1 = {
+											DebugVariablesTableConfiguration = (
+												Name,
+												123,
+												Value,
+												85,
+												Summary,
+												96.123,
+											);
+											Frame = "{{334, 0}, {330, 184}}";
+										};
+										SplitCount = 2;
+									};
+									SplitCount = 1;
+									Tab0 = {
+										Frame = "{{0, 0}, {100, 50}}";
+									};
+									Tab1 = {
+										Frame = "{{0, 0}, {100, 50}}";
+									};
+									TabCount = 2;
+									TabsVisible = YES;
+								};
+								Frame = "{{0, 0}, {664, 208}}";
+								LauncherConfigVersion = 7;
+							};
+							Tab2 = {
+								Frame = "{{0, 0}, {664, 50}}";
+								LauncherConfigVersion = 3;
+								Runner = {
+									Frame = "{{0, 0}, {664, 50}}";
+								};
+							};
+							Tab3 = {
+								BuildMessageFrame = "{{0, 0}, {614, 262}}";
+								BuildTranscriptFrame = "{{0, 271}, {614, 2}}";
+								BuildTranscriptFrameExpanded = YES;
+								Frame = "{{0, 0}, {612, 295}}";
+							};
+							Tab4 = {
+								Frame = "{{0, 0}, {612, 295}}";
+							};
+							TabCount = 5;
+							TabsVisible = NO;
+						};
+						SplitCount = 1;
+						Tab0 = {
+							Frame = "{{0, 0}, {313, 531}}";
+							GroupTreeTableConfiguration = (
+								TargetStatusColumn,
+								18,
+								MainColumn,
+								280,
+							);
+						};
+						Tab1 = {
+							ClassesFrame = "{{0, 0}, {280, 398}}";
+							ClassesTreeTableConfiguration = (
+								PBXBookColumnIdentifier,
+								20,
+								PBXClassColumnIdentifier,
+								237,
+							);
+							Frame = "{{0, 0}, {278, 659}}";
+							MembersFrame = "{{0, 407}, {280, 252}}";
+							MembersTreeTableConfiguration = (
+								PBXBookColumnIdentifier,
+								20,
+								PBXMethodColumnIdentifier,
+								236,
+							);
+						};
+						Tab2 = {
+							Frame = "{{0, 0}, {200, 100}}";
+						};
+						Tab3 = {
+							Frame = "{{0, 0}, {200, 557}}";
+							TargetTableConfiguration = (
+								ActiveObject,
+								16,
+								ObjectNames,
+								202.296,
+							);
+						};
+						Tab4 = {
+							BreakpointsTreeTableConfiguration = (
+								breakpointColumn,
+								197,
+								enabledColumn,
+								31,
+							);
+							Frame = "{{0, 0}, {250, 100}}";
+						};
+						TabCount = 5;
+						TabsVisible = NO;
+					};
+					NavBarShownByDefault = YES;
+					StatusViewVisible = NO;
+					Template = F5CA7ECB015C094F0DCA290F;
+					ToolbarVisible = NO;
+					WindowLocation = "{48, 189}";
 				},
 			);
-			PBXWorkspaceStateSaveDate = 52114527;
+			PBXWorkspaceStateSaveDate = 61528480;
 		};
 		perUserProjectItems = {
-			F5F80FB0031B348401850618 = F5F80FB0031B348401850618;
-			F5F80FB1031B348401850618 = F5F80FB1031B348401850618;
+			E190CFFE03AAD96100AEFBE0 = E190CFFE03AAD96100AEFBE0;
+			E190CFFF03AAD96100AEFBE0 = E190CFFF03AAD96100AEFBE0;
+			E190D00003AAD96100AEFBE0 = E190D00003AAD96100AEFBE0;
+			E190D00103AAD96100AEFBE0 = E190D00103AAD96100AEFBE0;
+			E190D00203AAD96100AEFBE0 = E190D00203AAD96100AEFBE0;
+			E190D00303AAD96100AEFBE0 = E190D00303AAD96100AEFBE0;
+			E190D00403AAD96100AEFBE0 = E190D00403AAD96100AEFBE0;
+			E190D00503AAD96100AEFBE0 = E190D00503AAD96100AEFBE0;
+			E190D00603AAD96100AEFBE0 = E190D00603AAD96100AEFBE0;
+			E190D00703AAD96100AEFBE0 = E190D00703AAD96100AEFBE0;
+			E190D00803AAD96100AEFBE0 = E190D00803AAD96100AEFBE0;
+			E190D00903AAD96100AEFBE0 = E190D00903AAD96100AEFBE0;
+			E190D00A03AAD96100AEFBE0 = E190D00A03AAD96100AEFBE0;
+			E190D00B03AAD96100AEFBE0 = E190D00B03AAD96100AEFBE0;
+			E190D00C03AAD96100AEFBE0 = E190D00C03AAD96100AEFBE0;
 		};
 		projectwideBuildSettings = {
 		};
+		userBookmarkGroup = E190CFF903AAA80600AEFBE0;
 		wantsIndex = 1;
 		wantsSCM = 0;
@@ -230,9 +1246,162 @@
 		);
 	};
+	E190CFF903AAA80600AEFBE0 = {
+		children = (
+			E190CFFB03AAA84B00AEFBE0,
+		);
+		isa = PBXBookmarkGroup;
+		name = Root;
+	};
+	E190CFFB03AAA84B00AEFBE0 = {
+		fRef = 08FB7796FE84155DC02AAC07;
+		isa = PBXTextBookmark;
+		name = "handle URL/file arguments";
+		rLen = 0;
+		rLoc = 17800;
+		rType = 0;
+		vrLen = 1773;
+		vrLoc = 14523;
+	};
+	E190CFFD03AAA8A300AEFBE0 = {
+		fileReference = 08FB7796FE84155DC02AAC07;
+		isa = PBXFileBreakpoint;
+		lineNumber = 479;
+		state = 1;
+	};
+	E190CFFE03AAD96100AEFBE0 = {
+		isa = PBXTargetBookmark;
+		trg = 08FB779FFE84155DC02AAC07;
+	};
+	E190CFFF03AAD96100AEFBE0 = {
+		exec = F561F49E0139D79101AEEDB1;
+		isa = PBXExecutableBookmark;
+	};
+	E190D00003AAD96100AEFBE0 = {
+		fRef = E190D00D03AAD96100AEFBE0;
+		isa = PBXTextBookmark;
+		name = "CFString.h: 146";
+		rLen = 25;
+		rLoc = 6754;
+		rType = 0;
+		vrLen = 1812;
+		vrLoc = 6085;
+	};
+	E190D00103AAD96100AEFBE0 = {
+		fRef = F5C0CA9501B5740C01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "README: 76";
+		rLen = 0;
+		rLoc = 2559;
+		rType = 0;
+		vrLen = 988;
+		vrLoc = 2260;
+	};
+	E190D00203AAD96100AEFBE0 = {
+		fRef = E190D00E03AAD96100AEFBE0;
+		glyphRangeLength = 886;
+		glyphRangeLocation = 314;
+		isa = PBXDocBookmark;
+		name = "Miscellaneous234567891011.html: Adds the val...";
+	};
+	E190D00303AAD96100AEFBE0 = {
+		fRef = E190D00F03AAD96100AEFBE0;
+		glyphRangeLength = 682;
+		glyphRangeLocation = 46353;
+		isa = PBXDocBookmark;
+		name = "Miscellaneous.html: Creates an i...";
+	};
+	E190D00403AAD96100AEFBE0 = {
+		isa = PBXTargetBookmark;
+		trg = 08FB779FFE84155DC02AAC07;
+	};
+	E190D00503AAD96100AEFBE0 = {
+		exec = F561F49E0139D79101AEEDB1;
+		isa = PBXExecutableBookmark;
+	};
+	E190D00603AAD96100AEFBE0 = {
+		isa = PBXTargetBookmark;
+		trg = 08FB779FFE84155DC02AAC07;
+	};
+	E190D00703AAD96100AEFBE0 = {
+		isa = PBXTargetBookmark;
+		trg = 08FB779FFE84155DC02AAC07;
+	};
+	E190D00803AAD96100AEFBE0 = {
+		exec = F561F49E0139D79101AEEDB1;
+		isa = PBXExecutableBookmark;
+	};
+	E190D00903AAD96100AEFBE0 = {
+		fRef = E190D01003AAD96100AEFBE0;
+		isa = PBXTextBookmark;
+		name = "CFString.h: 146";
+		rLen = 25;
+		rLoc = 6754;
+		rType = 0;
+		vrLen = 1812;
+		vrLoc = 6085;
+	};
+	E190D00A03AAD96100AEFBE0 = {
+		fRef = E190D01103AAD96100AEFBE0;
+		glyphRangeLength = 682;
+		glyphRangeLocation = 46353;
+		isa = PBXDocBookmark;
+		name = "Miscellaneous.html: Creates an i...";
+	};
+	E190D00B03AAD96100AEFBE0 = {
+		fRef = F5C0CA9501B5740C01AEEDB1;
+		isa = PBXBookmark;
+	};
+	E190D00C03AAD96100AEFBE0 = {
+		fRef = F5C0CA9501B5740C01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "README: 194";
+		rLen = 0;
+		rLoc = 6232;
+		rType = 0;
+		vrLen = 1727;
+		vrLoc = 5501;
+	};
+	E190D00D03AAD96100AEFBE0 = {
+		isa = PBXFileReference;
+		name = CFString.h;
+		path = /System/Library/Frameworks/CoreFoundation.framework/Versions/A/Headers/CFString.h;
+		refType = 0;
+	};
+	E190D00E03AAD96100AEFBE0 = {
+		isa = PBXFileReference;
+		name = Miscellaneous234567891011.html;
+		path = /System/Library/Frameworks/CoreFoundation.framework/Versions/A/Resources/English.lproj/Documentation/CollectionServices/Collection_Services/Functions/Miscellaneous234567891011.html;
+		refType = 0;
+	};
+	E190D00F03AAD96100AEFBE0 = {
+		isa = PBXFileReference;
+		name = Miscellaneous.html;
+		path = /System/Library/Frameworks/CoreFoundation.framework/Versions/A/Resources/English.lproj/Documentation/StringServices/String_Services/Functions/Miscellaneous.html;
+		refType = 0;
+	};
+	E190D01003AAD96100AEFBE0 = {
+		isa = PBXFileReference;
+		name = CFString.h;
+		path = /System/Library/Frameworks/CoreFoundation.framework/Versions/A/Headers/CFString.h;
+		refType = 0;
+	};
+	E190D01103AAD96100AEFBE0 = {
+		isa = PBXFileReference;
+		name = Miscellaneous.html;
+		path = /System/Library/Frameworks/CoreFoundation.framework/Versions/A/Resources/English.lproj/Documentation/StringServices/String_Services/Functions/Miscellaneous.html;
+		refType = 0;
+	};
 	F561F49E0139D79101AEEDB1 = {
-		activeArgIndex = 0;
+		activeArgIndex = 1;
+		activeArgIndices = (
+			NO,
+			YES,
+		);
 		argumentStrings = (
 			"-nu file:///Applications/Prerelease/Mozilla.app",
+			"-c MSIE http://web.sabi.net/",
 		);
+		configStateDict = {
+		};
 		debuggerPlugin = GDBDebugging;
 		dylibVariantSuffix = "";
@@ -250,20 +1419,6 @@
 		fileReference = 08FB7796FE84155DC02AAC07;
 		isa = PBXFileBreakpoint;
-		lineNumber = 520;
+		lineNumber = 609;
 		state = 1;
 	};
-	F5F80FB0031B348401850618 = {
-		fRef = 08FB7796FE84155DC02AAC07;
-		isa = PBXBookmark;
-	};
-	F5F80FB1031B348401850618 = {
-		fRef = 08FB7796FE84155DC02AAC07;
-		isa = PBXTextBookmark;
-		name = "main.c: 674";
-		rLen = 0;
-		rLoc = 26707;
-		rType = 0;
-		vrLen = 1159;
-		vrLoc = 25548;
-	};
 }
Index: trunk/launch/launch/launch.pbproj/project.pbxproj
===================================================================
--- trunk/launch/launch/launch.pbproj/project.pbxproj	(revision 4)
+++ trunk/launch/launch/launch.pbproj/project.pbxproj	(revision 52)
@@ -55,4 +55,5 @@
 				014CEA4A0018CE3211CA2923,
 			);
+			hasScannedForEncodings = 1;
 			isa = PBXProject;
 			mainGroup = 08FB7794FE84155DC02AAC07;
@@ -83,4 +84,5 @@
 		};
 		08FB7796FE84155DC02AAC07 = {
+			fileEncoding = 30;
 			isa = PBXFileReference;
 			path = main.c;
@@ -125,5 +127,4 @@
 			productName = launch;
 			productReference = 034768E2FF38A6DC11DB9C8B;
-			shouldUseHeadermap = 1;
 		};
 		08FB77A0FE84155DC02AAC07 = {
@@ -132,4 +133,5 @@
 			);
 			isa = PBXHeadersBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
 		};
 		08FB77A1FE84155DC02AAC07 = {
@@ -139,4 +141,5 @@
 			);
 			isa = PBXSourcesBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
 		};
 		08FB77A2FE84155DC02AAC07 = {
@@ -157,4 +160,5 @@
 			);
 			isa = PBXFrameworksBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
 		};
 		08FB77A5FE84155DC02AAC07 = {
@@ -163,4 +167,5 @@
 			);
 			isa = PBXRezBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
 		};
 //080
@@ -227,4 +232,5 @@
 		};
 		F574340B01B8A47B01AEEDB1 = {
+			fileEncoding = 30;
 			isa = PBXFileReference;
 			path = VERSION;
@@ -244,4 +250,5 @@
 		};
 		F5C0CA9501B5740C01AEEDB1 = {
+			fileEncoding = 30;
 			isa = PBXFileReference;
 			path = README;
Index: trunk/launch/launch/main.c
===================================================================
--- trunk/launch/launch/main.c	(revision 4)
+++ trunk/launch/launch/main.c	(revision 52)
@@ -23,10 +23,7 @@
 - Does -X work at all?  What does it return if it fails?
 
-- Create blank document  la my existing BBEdit alias?  Use
-template/stationery?
-
-- Allow piping (like BBEdit, again?)
-
 - Launching as root: use authentication framework - doesn't work.
+
+- launch URL with specified URL handler (done, except for IC)
 
 - launch apps by IC protocol handler (esp. editor)
@@ -46,4 +43,5 @@
 
 #include <unistd.h>
+#include <sys/stat.h>
 #include <Carbon/Carbon.h>
 #include <CoreServices/CoreServices.h>
@@ -58,5 +56,5 @@
 const char *APP_NAME;
 
-#define VERSION "1.0a9"
+#define VERSION "1.0b1"
 
 #define STRBUF_LEN 1024
@@ -78,4 +76,6 @@
 
 LSLaunchURLSpec LSPEC = {NULL, NULL, NULL, DEFAULT_LAUNCH_FLAGS, NULL};
+
+char *TEMPFILE = NULL;
 
 typedef struct {
@@ -107,5 +107,5 @@
 
 void usage() {
-    fprintf(stderr, "usage: %s [-npswbmhCX] [-c creator] [-i bundleID] [-u URL] [-a name] [document ...]\n"
+    fprintf(stderr, "usage: %s [-npswbmhCX] [-c creator] [-i bundleID] [-u URL] [-a name] [item ...] [-]\n"
                     "   or: %s [-npflswbmhCX] item ...\n", APP_NAME, APP_NAME);
     fprintf(stderr,
@@ -140,5 +140,5 @@
     errRec *rec;
     const char *errDesc = "unknown error";
-    const char *failedStr = "(unable to retrieve error message)";
+    char * const failedStr = "(unable to retrieve error message)";
     static char *str = NULL;
     size_t len;
@@ -152,5 +152,5 @@
     str = (char *)malloc(len);
     if (str != NULL)
-        snprintf(str, len, "%s (%d)", errDesc, (long)err);
+        snprintf(str, len, "%s (%ld)", errDesc, err);
     else
         str = failedStr;
@@ -242,5 +242,98 @@
 #endif
 
-void getargs(int argc, const char *argv[]) {
+CFURLRef normalizedURLFromString(CFStringRef str) {
+    CFURLRef url = CFURLCreateWithString(NULL, str, NULL);
+    if (url != NULL) {
+        CFURLRef absURL = CFURLCopyAbsoluteURL(url);
+        CFRelease(url);
+        url = NULL;
+        if (absURL != NULL) {
+            CFStringRef scheme = CFURLCopyScheme(absURL);
+            url = absURL;
+            if (scheme == NULL) {
+                CFRelease(url);
+                url = NULL;
+            }
+        }
+    }
+    return url;
+}
+
+CFURLRef normalizedURLFromPrefixSlack(CFStringRef prefix, CFStringRef slackStr) {
+    CFStringRef str = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@%@"),
+                                               prefix, slackStr);
+    CFURLRef normalizedURL = normalizedURLFromString(str);
+    CFRelease(str);
+    return normalizedURL;
+}
+
+char *tempFile(int *fd) {
+    char *tmpDir = getenv("TMPDIR");
+    const char * const tempTemplate = "/launch-stationery-XXXXXXXX";
+    char *tempPath;
+    OSStatus err;
+    FSRef fsr;
+    FSCatalogInfo catalogInfo;
+    FileInfo *fInfo;
+
+    // create temporary file
+    if (tmpDir == NULL) tmpDir = "/tmp";
+    tempPath = (char *)malloc(strlen(tmpDir) + strlen(tempTemplate) + 1);
+    if (tempPath == NULL) errexit("can't allocate memory");
+    strcpy(tempPath, tmpDir);
+    strcat(tempPath, tempTemplate);
+    if ( (*fd = mkstemp(tempPath)) == -1)
+        errexit("can't create temporary file '%s'", tempPath);
+    // mark file as stationery
+    err = FSPathMakeRef(tempPath, &fsr, NULL);
+    if (err != noErr) osstatusexit(err, "can't find '%s'", tempPath);
+    err = FSGetCatalogInfo(&fsr, kFSCatInfoFinderInfo, &catalogInfo, NULL, NULL, NULL);
+    if (err != noErr) osstatusexit(err, "can't get information for '%s'", tempPath);
+    fInfo = (FileInfo *)&(catalogInfo.finderInfo);
+    fInfo->finderFlags |= kIsStationery;
+    err = FSSetCatalogInfo(&fsr, kFSCatInfoFinderInfo, &catalogInfo);
+    if (err != noErr) osstatusexit(err, "can't set information for '%s'", tempPath);
+    
+    return tempPath;
+}
+
+char *stdinAsTempFile() {
+    unsigned char *buf;
+    int bufsize;
+    // Actual number of characters read, and therefore written.
+    ssize_t charCount;
+    int fd;
+    struct stat stat_buf;
+    char *tempFilePath;
+
+    tempFilePath = tempFile(&fd);
+
+    if (fstat(fd, &stat_buf) == -1)
+        errexit("can't fstat temporary file '%s'", tempFilePath);
+
+    bufsize = stat_buf.st_blksize;
+    if ( (buf = (unsigned char *)malloc(bufsize * sizeof(unsigned char))) == NULL)
+        errexit("can't allocate %ld bytes of buffer memory",
+                bufsize * sizeof(unsigned char));
+
+    // Loop until the end of the file.
+    while (1) {
+        // Read a block of input.
+        charCount = read(STDIN_FILENO, buf, bufsize);
+        if (charCount < 0) {
+            errexit("can't read from standard input");
+        }
+        // End of this file?
+        if (charCount == 0)
+            break;
+        // Write this block out.
+        if (write(fd, buf, charCount) != charCount)
+            errexit("error writing to file '%s'", tempFilePath);
+    }
+    free(buf);
+    return tempFilePath;
+}
+
+void getargs(int argc, char * const argv[]) {
     extern char *optarg;
     extern int optind;
@@ -311,6 +404,8 @@
             break;
 	case 'u':
-	    LSPEC.appURL = CFURLCreateWithString(NULL,
-		CFStringCreateWithCString(NULL, optarg, CFStringGetSystemEncoding()), NULL);
+            { CFStringRef str = CFStringCreateWithCString(NULL, optarg, CFStringGetSystemEncoding());
+	      LSPEC.appURL = CFURLCreateWithString(NULL, str, NULL);
+              if (str != NULL) CFRelease(str);
+            }
 	    if (LSPEC.appURL == NULL) {
 		errexit("invalid URL (argument of -u)");
@@ -354,5 +449,5 @@
 
     if (OPTS.action == ACTION_LAUNCH_URLS && appSpecified)
-	errexit("sorry, launching URLs with a given application is not yet supported"); // XXX
+        errexit("launching URLs with a given application is not supported; try without -l");
 
     if (OPTS.action == ACTION_INFO_ITEMS && appSpecified)
@@ -365,5 +460,5 @@
         int i;
         OSStatus err;
-        CFStringRef pathstr;
+        CFStringRef argStr;
         CFURLRef itemURL;
         LSItemInfoRecord docInfo;
@@ -375,30 +470,31 @@
         LSPEC.itemURLs = CFArrayCreateMutable(NULL, argc, NULL);
         for (i = 0 ; i < argc ; i++) {
-            pathstr = CFStringCreateWithCString(NULL, argv[i], CFStringGetSystemEncoding());
-            itemURL = NULL;
-            if (OPTS.action == ACTION_FIND_ITEMS || OPTS.action == ACTION_OPEN_ITEMS ||
-                OPTS.action == ACTION_LAUNCH_URLS || OPTS.action == ACTION_INFO_ITEMS) { // check for URLs
-                itemURL = CFURLCreateWithString(NULL, pathstr, NULL);
-                if (itemURL != NULL) {
-                    CFURLRef absURL = CFURLCopyAbsoluteURL(itemURL);
-                    CFRelease(itemURL);
-                    itemURL = NULL;
-                    if (absURL != NULL) {
-                        CFStringRef scheme = CFURLCopyScheme(absURL);
-                        itemURL = absURL;
-                        if (scheme == NULL) {
-                            CFRelease(itemURL);
-                            itemURL = NULL;
-                        }
-                    }
+            argStr = NULL;
+            if (strcmp(argv[i], "-") == 0) {
+                TEMPFILE = stdinAsTempFile();
+                itemURL = CFURLCreateFromFileSystemRepresentation(NULL, TEMPFILE, strlen(TEMPFILE), false);
+                LSPEC.launchFlags ^= kLSLaunchAsync;
+            } else {
+                argStr = CFStringCreateWithCString(NULL, argv[i], CFStringGetSystemEncoding());
+                // check for URLs
+                itemURL = normalizedURLFromString(argStr);
+                if (itemURL == NULL && OPTS.action == ACTION_LAUNCH_URLS) {
+                    // check for email addresses
+                    if (strchr(argv[i], '@') != NULL && strchr(argv[i], '/') == NULL)
+                        itemURL = normalizedURLFromPrefixSlack(CFSTR("mailto:"), argStr);
+                    // check for "slack" URLs
+                    if (itemURL == NULL && strchr(argv[i], '.') != NULL && strchr(argv[i], '/') != argv[i])
+                        itemURL = normalizedURLFromPrefixSlack(CFSTR("http://"), argStr);
+                }
+                if (itemURL == NULL) {
+                    // check for file paths
+                    itemURL = CFURLCreateWithFileSystemPath(NULL, argStr, kCFURLPOSIXPathStyle, false);
+                    err = LSCopyItemInfoForURL(itemURL, kLSRequestExtensionFlagsOnly, &docInfo);
+                    if (err != noErr) osstatusexit(err, "unable to locate '%s'", argv[i]);
                 }
             }
-            if (itemURL == NULL) {
-                itemURL = CFURLCreateWithFileSystemPath(NULL, pathstr, kCFURLPOSIXPathStyle, false);
-                err = LSCopyItemInfoForURL(itemURL, kLSRequestExtensionFlagsOnly, &docInfo);
-                if (err != noErr) osstatusexit(err, "unable to locate '%s'", argv[i]);
-            }
             CFArrayAppendValue((CFMutableArrayRef)LSPEC.itemURLs, itemURL);
-            CFRelease(pathstr);
+            // don't CFRelease the itemURL because CFArray doesn't retain it by default
+            if (argStr != NULL) CFRelease(argStr);
         }
     }
@@ -616,5 +712,5 @@
 }
 
-int main (int argc, const char *argv[]) {
+int main (int argc, char * const argv[]) {
     OSStatus err;
     
@@ -670,4 +766,11 @@
     }
 
+    if (TEMPFILE != NULL) {
+        // the application may take a while to finish opening the temporary file
+        daemon(0, 0);
+        sleep(60);
+        unlink(TEMPFILE);
+    }
+
     return 0;
 }
