Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/APEMain.m
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/APEMain.m	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/APEMain.m	(revision 170)
@@ -0,0 +1,291 @@
+// ===========================================================================
+//
+//	File:		APEMain.m
+//
+//	Contains:	ICeCoffEE APE Module code
+//
+//	Copyright:	Copyright (c) 2003, Nicholas Riley
+//			All Rights Reserved.
+//
+//	Author(s):	Nicholas Riley (Sun Jan 19 2003)
+//
+// ===========================================================================
+
+#import <Carbon/Carbon.h>
+#import <ApplicationEnhancer/ApplicationEnhancer.h>
+#import <ApplicationEnhancer/APETools.h>
+#import <objc/objc-runtime.h>
+#import "ICeCoffEE.h"
+#import "ICeCoffEETextEdit.h"
+#import "CPS.h"
+
+//¥¥¥ Our settings
+
+//¥¥¥ Function prototypes
+static void ICCF_ReloadPrefs();				// reloads our preferences
+static void ICCF_MigratePrefs();			// migrates prefs from 1.0Ð1.2
+
+//¥¥¥ Enter sandman, the code begins --
+
+#define ICCF_GET_PATCHCLASS(patchclass) \
+    struct objc_class *patchclass = objc_getClass(patchclass ## Name); \
+    if (patchclass == NULL) { \
+        ICapeprintf("can't get %s\n", patchclass ## Name); \
+        return NO; \
+    }
+
+#define ICCF_GET_METHOD(name, patchclass, sel) \
+    Method name = class_getInstanceMethod(patchclass, sel); \
+    if (name == NULL) { \
+        ICapeprintf("can't get %s\n", patchclass ## Name); \
+        return NO; \
+    }
+
+BOOL ICCF_PatchMethod(char *patcheeClassName,
+                      char *patchClassName,
+                      char *patchSuperclassName,
+                      char *selectorString) {
+
+    ICCF_GET_PATCHCLASS(patcheeClass);
+    ICCF_GET_PATCHCLASS(patchClass);
+    ICCF_GET_PATCHCLASS(patchSuperclass);
+
+    SEL selector = sel_getUid(selectorString);
+
+    ICCF_GET_METHOD(patcheeMethod, patcheeClass, selector);
+    ICCF_GET_METHOD(patchMethod, patchClass, selector);
+    ICCF_GET_METHOD(patchSuperMethod, patchSuperclass, selector);
+
+    if (APEPatchCreate(patchSuperMethod->method_imp,
+                       APEPatchCreate(patcheeMethod->method_imp, patchMethod->method_imp)) == NULL) {
+        ICapeprintf("can't patch class %s with [%s %s] super %s", patcheeClassName, patchClassName, selectorString, patchSuperclassName);
+        return NO;
+    }
+    return YES;
+}
+
+CFBundleRef ICCF_bundle;
+
+// With APE 1.3, if we're in the exclude list, APEBundleMainEarlyLoad doesn't get invoked; don't need to use APETools.  But we need to do our own management to avoid loading in non-GUI appllications.
+Boolean ICCF_shouldLoad;
+
+void APEBundleMainEarlyLoad(CFBundleRef inBundle, CFStringRef inAPEToolsApplicationID)
+{
+    ICCF_MigratePrefs();
+
+    UInt32 icVersion = CFBundleGetVersionNumber(inBundle);
+    ICapeprintf("ICeCoffEE APE: bundle version is %ld (0x%x)\n", icVersion, icVersion);
+    CFNumberRef icVersionRef = CFNumberCreate(NULL, kCFNumberLongType, &icVersion);
+    CFPreferencesSetAppValue(kICLastLoadedVersion, icVersionRef, kICBundleIdentifier);
+    SAFE_RELEASE(icVersionRef);
+
+    ICCF_shouldLoad = false;
+
+    CPSProcessSerNum psn;
+    OSStatus err = CPSGetCurrentProcess(&psn);
+    if (err != noErr) {
+#if ICCF_DEBUG
+        apeprintf("ICeCoffEE APE: Can't get process serial number for current process (error %ld); still loading because of ICCF_DEBUG\n", err);
+#else
+        apeprintf("ICeCoffEE APE: Can't get process serial number for current process (error %ld); not loading in this application\n", err);
+        return;
+#endif
+    }
+    
+    CPSProcessInfoRec info;
+    err = CPSGetProcessInfo(&psn, &info, NULL, 0, NULL, NULL, 0);
+    if (err != noErr) {
+#if ICCF_DEBUG
+        apeprintf("ICeCoffEE APE: Can't get process information (error %ld); still loading because of ICCF_DEBUG\n", err);
+#else
+        apeprintf("ICeCoffEE APE: Can't get process information (error %ld); not loading in this application\n", err);
+        return;
+#endif
+    } else {
+        ICapeprintf("ICeCoffEE APE: got process attributes = 0x%lx\n", info.Attributes);
+        if (info.Attributes & (kCPSBGOnlyAttr | kCPSUIElementAttr | kCPSFullScreenAttr)) {
+            ICapeprintf("ICeCoffEE APE: not loading as this application is background-only\n");
+            return;
+        }
+    }
+    ICCF_shouldLoad = true;
+}
+
+Boolean ICCF_CFBundleIDMatches(CFStringRef bundleID, CFStringRef test) {
+    return CFStringCompare(bundleID, test, kCFCompareCaseInsensitive) == kCFCompareEqualTo;
+}
+
+void APEBundleMainLateLoad(CFBundleRef inBundle, CFStringRef inAPEToolsApplicationID)
+{
+    if (!ICCF_shouldLoad) return;
+
+    ICCF_bundle = CFBundleGetBundleWithIdentifier(kICBundleIdentifier);
+    CFStringRef bundleID = CFBundleGetIdentifier(CFBundleGetMainBundle());
+    BOOL shouldLoadInNSTextView = YES;
+
+    // XXX handle patching error return from ICCF_PatchMethod
+    if (bundleID != NULL) {
+        if (ICCF_CFBundleIDMatches(bundleID, CFSTR("com.apple.projectbuilder")) ||
+            ICCF_CFBundleIDMatches(bundleID, CFSTR("com.apple.xcode"))) {
+            ICCF_PatchMethod("PBXTextView", "ICeCoffEEMenuOnly", "ICeCoffEEMenuSuper", "menuForEvent:");
+            ICapeprintf("ICeCoffEE APE: loaded in PBXTextView for PB!\n");
+            shouldLoadInNSTextView = NO;
+        } else if (ICCF_CFBundleIDMatches(bundleID, CFSTR("com.apple.terminal"))) {
+            ICCF_PatchMethod("TermSubview", "ICeCoffEEMenuOnly", "ICeCoffEEMenuSuper", "menuForEvent:") &&
+            ICCF_PatchMethod("TermSubview", "ICeCoffEETerminal", "ICECoffEETermSubviewSuper", "selectedRange") &&
+            ICCF_PatchMethod("TermSubview", "ICeCoffEETerminal", "ICECoffEETermSubviewSuper", "attributedSubstringFromRange:") &&
+            ICCF_PatchMethod("TermSubview", "ICeCoffEETerminal", "ICECoffEETermSubviewSuper", "mouseDown:") &&
+            ICCF_PatchMethod("TermSubview", "ICeCoffEETerminal", "ICECoffEETermSubviewSuper", "mouseUp:") &&
+            ICCF_PatchMethod("TermSubview", "ICeCoffEETerminal", "ICECoffEETermSubviewSuper", "draggingEntered:") &&
+            ICCF_PatchMethod("TermSubview", "ICeCoffEETerminal", "ICECoffEETermSubviewSuper", "_optionClickEvent:::") ,
+            ICapeprintf("ICeCoffEE APE: loaded in TermSubview for Terminal!\n");
+        } else if (ICCF_CFBundleIDMatches(bundleID, CFSTR("org.mozilla.navigator"))) {
+            ICCF_PatchMethod("ChildView", "ICeCoffEEMenuOnly", "ICeCoffEEMenuSuper", "menuForEvent:");
+            ICapeprintf("ICeCoffEE APE: loaded in ChildView for Camino\n");
+        }
+    }
+
+    ICCF_PatchMethod("WebHTMLView", "ICeCoffEEWebKit", "ICeCoffEEWebKitSuper", "mouseUp:") &&
+        ICCF_PatchMethod("WebHTMLView", "ICeCoffEEWebKit", "ICeCoffEEWebKitSuper", "mouseDown:") &&
+        ICCF_PatchMethod("WebHTMLView", "ICeCoffEEWebKit", "ICeCoffEEWebKitSuper", "menuForEvent:"),
+        ICapeprintf("ICeCoffEE APE: loaded in WebHTMLView for WebKit/Safari\n");
+    
+    if (shouldLoadInNSTextView) {
+        ICCF_PatchMethod("NSTextView", "ICeCoffEE", "ICeCoffEESuper", "mouseDown:") &&
+        ICCF_PatchMethod("NSTextView", "ICeCoffEE", "ICeCoffEESuper", "menuForEvent:") ,
+        ICapeprintf("ICeCoffEE APE: loaded generic NSTextView support\n");
+    }
+
+    gTEClick = APEPatchCreate(&TEClick, &ICCF_TEClick);
+    if (gTEClick != NULL) {
+        ICapeprintf("ICeCoffEE APE: patched TEClick\n");
+    }
+
+    ICCF_ReloadPrefs();
+        
+    return;
+}
+
+// We define APEBundleMessage so we can receive messages from our preference pane.  We actually only know the Refresh message that instructs our APE module to reload the preferences.  Why do we reload preferences here and not do it in our patch? Well, although you can poll CFPreferences in every patch call, that'll result in some performance loss - we better cache the settings in a static variable and refresh them from prefs only when needed.
+OSStatus APEBundleMessage(CFStringRef message,CFDataRef inData,CFDataRef *outData)
+{
+    ICapeprintf("ICeCoffEE APE: message '%@' (inData = %@)\n", message, inData);
+    
+    if (CFStringCompare(message, kICPreferencesChanged, NULL) == kCFCompareEqualTo)		
+    {	// request to reload prefs from our preference pane
+        ICCF_ReloadPrefs();
+    }
+    
+    return noErr;
+}
+
+Boolean ICCF_GetBooleanPref(CFStringRef prefKey, Boolean defaultValue) {
+    Boolean keyExists;
+    Boolean value = CFPreferencesGetAppBooleanValue(prefKey, kICBundleIdentifier, &keyExists);
+    if (keyExists) return value;
+    CFPreferencesSetAppValue(prefKey, defaultValue ? kCFBooleanTrue : kCFBooleanFalse, kICBundleIdentifier);
+    return defaultValue;
+}
+
+CFIndex ICCF_GetCFIndexPref(CFStringRef prefKey, CFIndex defaultValue) {
+    Boolean keyExists;
+    CFIndex value = CFPreferencesGetAppIntegerValue(prefKey, kICBundleIdentifier, &keyExists);
+    if (keyExists) return value;
+    CFNumberRef defaultValueNumber = CFNumberCreate(NULL, kCFNumberCFIndexType, &defaultValue);
+    CFPreferencesSetAppValue(prefKey, defaultValueNumber, kICBundleIdentifier);
+    CFRelease(defaultValueNumber);
+    return defaultValue;
+}
+
+void ICCF_GetCFTypePref(CFStringRef prefKey, CFTypeRef *val, CFTypeID type) {
+    if (*val != NULL) {
+        CFRelease(*val);
+        *val = NULL;
+    }
+    
+    *val = CFPreferencesCopyAppValue(prefKey, kICBundleIdentifier);
+
+    if (*val == NULL) return;
+
+    if (CFGetTypeID(*val) != type) {
+        CFRelease(*val);
+        *val = NULL;
+        return;
+    }
+}
+
+// to test: defaults write net.sabi.ICeCoffEE "Excluded Applications" -array '{CFBundleID = "com.apple.projectbuilder"; }' '{CFBundleID = "net.sabi.Pester"; }' '{CFBundleID = "com.apple.foobar"; }'
+static void ICCF_MigratePrefs() {
+    
+    CFArrayRef prefExcludedApps = CFPreferencesCopyAppValue(kIC12PrefExcluded, kICBundleIdentifier);
+
+    if (prefExcludedApps == NULL) return;
+
+    if (CFGetTypeID(prefExcludedApps) != CFArrayGetTypeID()) {
+        CFRelease(prefExcludedApps);
+        return;
+    }
+    
+    CFMutableArrayRef excludedApps = CFArrayCreateMutableCopy(NULL, 0, prefExcludedApps);
+    CFRelease(prefExcludedApps); prefExcludedApps = NULL;
+
+    ICapeprintf("Excluded apps: %@\n", excludedApps);
+
+    CFIndex excludedAppCount = CFArrayGetCount(excludedApps);
+    CFIndex excludedAppIndex;
+
+    CFDictionaryRef excludedAppSpecifiers = NULL;
+    CFStringRef excludedAppBundleID = NULL;
+    CFURLRef excludedAppURL = NULL;
+    CFBundleRef excludedAppBundle = NULL;
+
+    BOOL postponeMigrationForApp;
+
+    for (excludedAppIndex = excludedAppCount - 1 ; excludedAppIndex >= 0 ; excludedAppIndex--) {
+        if ( (excludedAppSpecifiers = CFArrayGetValueAtIndex(excludedApps, excludedAppIndex)) == NULL || CFGetTypeID(excludedAppSpecifiers) != CFDictionaryGetTypeID()) {
+            CFArrayRemoveValueAtIndex(excludedApps, excludedAppIndex);
+            continue;
+        }
+
+        postponeMigrationForApp = NO;
+        if ( (excludedAppBundleID = CFDictionaryGetValue(excludedAppSpecifiers, kIC12PrefExcludedAppSpecifierBundleID)) != NULL
+             && CFGetTypeID(excludedAppBundleID) == CFStringGetTypeID()
+             && CFStringCompare(excludedAppBundleID, CFSTR("com.apple.projectbuilder"), kCFCompareCaseInsensitive) != kCFCompareEqualTo) {
+            if (LSFindApplicationForInfo(kLSUnknownCreator, excludedAppBundleID, NULL, NULL, &excludedAppURL) == noErr) {
+                excludedAppBundle = CFBundleCreate(NULL, excludedAppURL);
+                if (excludedAppBundle != NULL) {
+                    APEToolsAddToExcludeList(kICBundleIdentifier, excludedAppBundle, CFSTR("Migrated from ICeCoffEE 1.0-1.2"), NO);
+                } else postponeMigrationForApp = YES; // can't create bundle
+            } else postponeMigrationForApp = YES; // can't find app
+        }
+        // don't release excludedAppSpecifiers, used Get
+        // don't release excludedAppBundleID, used Get
+        if (excludedAppURL != NULL) { CFRelease(excludedAppURL); excludedAppURL = NULL; }
+        if (excludedAppBundle != NULL) { CFRelease(excludedAppBundle); excludedAppBundle = NULL; }
+        if (!postponeMigrationForApp) CFArrayRemoveValueAtIndex(excludedApps, excludedAppIndex);
+    }
+
+    ICapeprintf("Excluded apps remaining: %@\n", excludedApps);
+    CFPreferencesSetAppValue(kIC12PrefExcluded, (CFArrayGetCount(excludedApps) == 0 ? NULL : excludedApps), kICBundleIdentifier);
+    CFRelease(excludedApps);
+
+    CFPreferencesAppSynchronize(kICBundleIdentifier);
+}
+
+static void ICCF_ReloadPrefs() {
+    CFPreferencesAppSynchronize(kICBundleIdentifier);
+
+    ICCF_prefs.commandClickEnabled = ICCF_GetBooleanPref(kICCommandClickEnabled, YES);
+    ICCF_prefs.textBlinkEnabled = ICCF_GetBooleanPref(kICTextBlinkEnabled, YES);
+    ICCF_prefs.textBlinkCount = ICCF_GetCFIndexPref(kICTextBlinkCount, 3);
+    ICCF_prefs.servicesInContextualMenu = ICCF_GetBooleanPref(kICServicesInContextualMenu, YES);
+    ICCF_prefs.servicesInMenuBar = ICCF_GetBooleanPref(kICServicesInMenuBar, NO);
+    ICCF_GetCFTypePref(kICServiceOptions, (CFTypeRef *)&ICCF_prefs.serviceOptions, CFDictionaryGetTypeID());
+    ICCF_prefs.terminalRequireOptionForSelfDrag = ICCF_GetBooleanPref(kICTerminalRequireOptionForSelfDrag, NO);
+    ICCF_prefs.errorSoundEnabled = ICCF_GetBooleanPref(kICErrorSoundEnabled, NO);
+    ICCF_prefs.errorDialogEnabled = ICCF_GetBooleanPref(kICErrorDialogEnabled, YES);
+
+    CFPreferencesAppSynchronize(kICBundleIdentifier);
+
+    ICCF_AddRemoveServicesMenu();
+}
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/CFPreferencesWrapper.h
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/CFPreferencesWrapper.h	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/CFPreferencesWrapper.h	(revision 170)
@@ -0,0 +1,30 @@
+#import <Foundation/Foundation.h>
+
+@interface CFPreferencesWrapper_ICeCoffEE : NSObject
+{
+    NSString *identifier;
+}
+
+- initWithApplication:(NSString*)appIdentifier;
++ preferencesWithApplication:(NSString*)appIdentifier;
+
+- (NSArray*)arrayForKey:(NSString*)key;
+- (BOOL)boolForKey:(NSString*)key;
+- (NSData*)dataForKey:(NSString*)key;
+- (NSDictionary*)dictionaryForKey:(NSString*)key;
+- (float)floatForKey:(NSString*)key;
+- (int)integerForKey:(NSString*)key;
+- (id)objectForKey:(NSString*)key;
+- (NSArray*)stringArrayForKey:(NSString*)key;
+- (NSString*)stringForKey:(NSString*)key;
+
+- (BOOL)keyExists:(NSString*)key;
+
+- (void)removeObjectForKey:(NSString*)key;
+- (void)setBool:(BOOL)value forKey:(NSString*)key;
+- (void)setFloat:(float)value forKey:(NSString*)key;
+- (void)setInteger:(int)value forKey:(NSString*)key;
+- (void)setObject:(id)value forKey:(NSString*)key;
+- (BOOL)synchronize;
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/CFPreferencesWrapper.m
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/CFPreferencesWrapper.m	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/CFPreferencesWrapper.m	(revision 170)
@@ -0,0 +1,208 @@
+#import <Carbon/Carbon.h>
+#import "CFPreferencesWrapper.h"
+
+
+@implementation CFPreferencesWrapper_ICeCoffEE
+
+- initWithApplication:(NSString*)appIdentifier
+{
+    self = [super init];
+    
+    if( !self || !appIdentifier )
+    {
+        [self release];
+        return nil;
+    }
+    
+    identifier = [appIdentifier retain];
+    
+    return self;
+}
+
+- (void)dealloc
+{
+    [identifier release];
+    
+    [super dealloc];
+}
+
++ preferencesWithApplication:(NSString*)appIdentifier
+{
+    return [[[self alloc] initWithApplication:appIdentifier] autorelease];
+}
+
+
+- (NSArray*)arrayForKey:(NSString*)key
+{
+    id object;
+    
+    object = (id) CFPreferencesCopyAppValue( (CFStringRef) key, (CFStringRef) identifier);
+    
+    if( object && (CFGetTypeID( object) == CFArrayGetTypeID()) )
+    	return [object autorelease];
+    else
+    {
+        [object release];
+        return nil;
+    }
+}
+
+- (BOOL)boolForKey:(NSString*)key
+{
+    Boolean dummy;
+    
+    return CFPreferencesGetAppBooleanValue( (CFStringRef) key, (CFStringRef) identifier, &dummy);
+}
+
+- (NSData*)dataForKey:(NSString*)key
+{
+    id object;
+    
+    object = (id) CFPreferencesCopyAppValue( (CFStringRef) key, (CFStringRef) identifier);
+    
+    if( object && (CFGetTypeID( object) == CFDataGetTypeID()) )
+    	return [object autorelease];
+    else
+    {
+        [object release];
+        return nil;
+    }
+}
+
+- (NSDictionary*)dictionaryForKey:(NSString*)key
+{
+    id object;
+    
+    object = (id) CFPreferencesCopyAppValue( (CFStringRef) key, (CFStringRef) identifier);
+    
+    if( object && (CFGetTypeID( object) == CFDictionaryGetTypeID()) )
+    	return [object autorelease];
+    else
+    {
+        [object release];
+        return nil;
+    }
+}
+
+- (float)floatForKey:(NSString*)key
+{
+    id object;
+    float retVal;
+    
+    object = (id) CFPreferencesCopyAppValue( (CFStringRef) key, (CFStringRef) identifier);
+    
+    if( object && (CFGetTypeID( object) == CFNumberGetTypeID()) )
+    {
+        retVal = [object floatValue];
+        [object release];
+    	return retVal;
+    }
+    else
+    {
+        [object release];
+        return 0;
+    }
+}
+
+- (int)integerForKey:(NSString*)key
+{
+    Boolean dummy;
+    
+    return CFPreferencesGetAppIntegerValue( (CFStringRef) key, (CFStringRef) identifier, &dummy);
+}
+
+- (id)objectForKey:(NSString*)key
+{
+    return [(id) CFPreferencesCopyAppValue( (CFStringRef) key, (CFStringRef) identifier) autorelease];
+}
+
+- (NSArray*)stringArrayForKey:(NSString*)key
+{
+    id object;
+    
+    object = (id) CFPreferencesCopyAppValue( (CFStringRef) key, (CFStringRef) identifier);
+    
+    if( object && (CFGetTypeID( object) == CFArrayGetTypeID()) )
+    {
+        NSEnumerator *enumerator = [object objectEnumerator];
+        id element;
+        
+        while( (element = [enumerator nextObject]) )
+        {
+            if( CFGetTypeID( element) != CFStringGetTypeID() )
+            {
+                [object release];
+                return nil;
+            }
+        }
+        
+    	return [object autorelease];
+    }
+    else
+    {
+        [object release];
+        return nil;
+    }
+}
+
+- (NSString*)stringForKey:(NSString*)key
+{
+    id object;
+    
+    object = (id) CFPreferencesCopyAppValue( (CFStringRef) key, (CFStringRef) identifier);
+    
+    if( object && (CFGetTypeID( object) == CFStringGetTypeID()) )
+    	return [object autorelease];
+    else
+    {
+        [object release];
+        return nil;
+    }
+}
+
+
+- (void)removeObjectForKey:(NSString*)key
+{
+    CFPreferencesSetAppValue( (CFStringRef) key, (CFPropertyListRef) NULL, (CFStringRef) identifier);
+}
+
+- (void)setBool:(BOOL)value forKey:(NSString*)key
+{
+    CFPreferencesSetAppValue( (CFStringRef) key, (CFPropertyListRef) (value ? kCFBooleanTrue : kCFBooleanFalse), (CFStringRef) identifier);
+}
+
+- (void)setFloat:(float)value forKey:(NSString*)key
+{
+    CFPreferencesSetAppValue( (CFStringRef) key, (CFPropertyListRef) [NSNumber numberWithFloat:value], (CFStringRef) identifier);
+}
+
+- (void)setInteger:(int)value forKey:(NSString*)key
+{
+    CFPreferencesSetAppValue( (CFStringRef) key, (CFPropertyListRef) [NSNumber numberWithInt:value], (CFStringRef) identifier);
+}
+
+- (void)setObject:(id)value forKey:(NSString*)key
+{
+    CFPreferencesSetAppValue( (CFStringRef) key, (CFPropertyListRef) value, (CFStringRef) identifier);
+}
+
+- (BOOL)keyExists:(NSString*)key
+{
+    BOOL exist = NO;
+    
+    CFPropertyListRef value = CFPreferencesCopyAppValue((CFStringRef)key, (CFStringRef)identifier);
+    if (value)
+    {
+        exist = YES;
+        CFRelease(value);
+    }
+    
+    return exist;
+}
+
+- (BOOL)synchronize
+{
+    return CFPreferencesAppSynchronize( (CFStringRef) identifier);
+}
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/CPS.h
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/CPS.h	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/CPS.h	(revision 170)
@@ -0,0 +1,299 @@
+// CPS.h
+
+#pragma once
+
+#include <ApplicationServices/ApplicationServices.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if PRAGMA_STRUCT_ALIGN
+    #pragma options align=mac68k
+#elif PRAGMA_STRUCT_PACKPUSH
+    #pragma pack(push, 2)
+#elif PRAGMA_STRUCT_PACK
+    #pragma pack(2)
+#endif
+
+
+struct CPSProcessSerNum
+{
+	UInt32		lo;
+	UInt32		hi;
+};
+
+typedef struct CPSProcessSerNum	CPSProcessSerNum;
+
+enum
+{
+	kCPSNoProcess		=	0,
+	kCPSSystemProcess	=	1,
+	kCPSCurrentProcess	=	2
+};
+
+
+enum
+{
+	bfCPSIntraProcessSwitch =	1,
+	bfCPSDeathBySignal	=	2
+};
+
+typedef UInt16	CPSEventFlags;
+
+
+enum
+{
+	kCPSBlueApp	=	0,
+	kCPSBlueBox	=	1,
+	kCPSCarbonApp	=	2,
+	kCPSYellowApp	=	3,
+	kCPSUnknownApp	=	4
+};
+
+typedef UInt32	CPSAppFlavour;
+
+
+enum
+{
+	kCPSBGOnlyAttr		=	1024,
+	kCPSUIElementAttr	=	65536,
+	kCPSHiddenAttr		=	131072,
+	kCPSNoConnectAttr	=	262144,
+	kCPSFullScreenAttr	=	524288,
+	kCPSClassicReqAttr	=	1048576,
+	kCPSNativeReqAttr	=	2097152
+};
+
+typedef UInt32	CPSProcAttributes;
+
+
+struct CPSProcessInfoRec
+{
+	CPSProcessSerNum 	Parent;
+	UInt64			LaunchDate;
+	CPSAppFlavour		Flavour;
+	CPSProcAttributes	Attributes;
+	UInt32			ExecFileType;
+	UInt32			ExecFileCreator;
+	UInt32			UnixPID;
+};
+
+typedef struct CPSProcessInfoRec	CPSProcessInfoRec;
+
+
+enum
+{
+	kCPSNotifyChildDeath	=	1,
+	kCPSNotifyNewFront	=	2,
+	kCPSNotifyAppBirth	=	4,
+	kCPSNotifyAppDeath	=	8,
+	kCPSNotifyLaunch	=	9,
+	kCPSNotifyServiceReq	=	16,
+	kCPSNotifyAppHidden	=	32,
+	kCPSNotifyAppRevealed	=	64,
+	kCPSNotifyFGEnabled	=	128,
+	kCPSNotifyLaunchStart	=	256,
+	kCPSNotifyAppReady	=	512,
+	kCPSNotifyLaunchFail	=	1024,
+	kCPSNotifyAppDeathExt	=	2048,
+	kCPSNotifyLostKeyFocus	=	4096
+};
+
+typedef UInt32	CPSNotificationCodes;
+
+
+enum
+{
+	bfCPSLaunchInhibitDaemon	=	128,
+	bfCPSLaunchDontSwitch		=	512,
+	bfCPSLaunchNoProcAttr		=	2048,
+	bfCPSLaunchAsync		=	65536,
+	bfCPSLaunchStartClassic		=	131072,
+	bfCPSLaunchInClassic		=	262144,
+	bfCPSLaunchInstance		=	524288,
+	bfCPSLaunchAndHide		=	1048576,
+	bfCPSLaunchAndHideOthers	=	2097152
+};
+
+typedef UInt32	CPSLaunchOptions;
+
+
+typedef	UInt8	*CPSLaunchRefcon;
+
+
+typedef	UInt8	*CPSLaunchData;
+
+
+enum
+{
+	bfCPSExtLaunchWithData	=	2,
+	bfCPSExtLaunchByParent	=	4,
+	bfCPSExtLaunchAsUidGid	=	8
+};
+
+typedef UInt32	CPSLaunchPBFields;
+
+
+struct CPSLaunchPB
+{
+	CPSLaunchPBFields	Contents;
+	CPSLaunchData		pData;
+	UInt32			DataLen;
+	UInt32			DataTag;
+	UInt32			RefCon;
+	CPSProcessSerNum	Parent;
+	UInt32			ChildUID;
+	UInt32			ChildGID;
+};
+
+typedef struct CPSLaunchPB	CPSLaunchPB;
+
+
+enum
+{
+	bfCPSKillHard		=	1,
+	bfCPSKillAllClassicApps	=	2
+};
+
+typedef UInt32	CPSKillOptions;
+
+
+enum
+{
+	kCPSLaunchService	=	0,
+	kCPSKillService		=	1,
+	kCPSHideService		=	2,
+	kCPSShowService		=	3,
+	kCPSPrivService		=	4,
+	kCPSExtDeathNoteService	=	5
+};
+
+typedef UInt32	CPSServiceReqType;
+
+
+struct CPSLaunchRequest
+{
+	CPSProcessSerNum	TargetPSN;
+	CPSLaunchOptions 	Options;
+	CPSProcAttributes 	ProcAttributes;
+	UInt8			*pUTF8TargetPath;
+	UInt32			PathLen;
+};
+
+typedef struct CPSLaunchRequest	CPSLaunchRequest;
+
+
+struct CPSKillRequest
+{
+	CPSProcessSerNum	TargetPSN;
+	CPSKillOptions		Options;
+};
+
+typedef struct CPSKillRequest	CPSKillRequest;
+
+
+struct CPSHideRequest
+{
+	CPSProcessSerNum 	TargetPSN;
+};
+
+typedef struct CPSHideRequest	CPSHideRequest;
+
+
+struct CPSShowRequest
+{
+	CPSProcessSerNum 	TargetPSN;
+};
+
+typedef struct CPSShowRequest	CPSShowRequest;
+
+
+struct CPSExtDeathNotice
+{
+	CPSProcessSerNum 	DeadPSN;
+	UInt32			Flags;
+	UInt8			*pUTF8AppPath;
+	UInt32			PathLen;
+};
+
+typedef struct CPSExtDeathNotice	CPSExtDeathNotice;
+
+
+union CPSRequestDetails
+{
+	CPSLaunchRequest 	LaunchReq;
+	CPSKillRequest 		KillReq;
+	CPSHideRequest 		HideReq;
+	CPSShowRequest 		ShowReq;
+	CPSExtDeathNotice 	DeathNotice;
+};
+
+typedef union CPSRequestDetails	CPSRequestDetails;
+
+
+struct CPSServiceRequest
+{
+	CPSServiceReqType 	Type;
+	SInt32			ID;
+	CPSRequestDetails 	Details;
+};
+
+typedef struct CPSServiceRequest	CPSServiceRequest;
+
+
+enum
+{
+	kCPSProcessInterruptKey	=	0,
+	kCPSAppSwitchFwdKey	=	1,
+	kCPSAppSwitchBackKey	=	2,
+	kCPSSessionInterruptKey	=	3,
+	kCPSScreenSaverKey	=	4,
+	kCPSDiskEjectKey	=	5,
+	kCPSSpecialKeyCount	=	6
+};
+
+typedef SInt32	CPSSpecialKeyID;
+
+
+extern Boolean	CPSEqualProcess( CPSProcessSerNum *psn1, CPSProcessSerNum *psn2);
+
+extern OSErr	CPSGetCurrentProcess( CPSProcessSerNum *psn);
+
+extern OSErr	CPSGetFrontProcess( CPSProcessSerNum *psn);
+
+extern OSErr	CPSGetNextProcess( CPSProcessSerNum *psn);
+
+extern OSErr	CPSGetNextToFrontProcess( CPSProcessSerNum *psn);
+
+extern OSErr	CPSGetProcessInfo( CPSProcessSerNum *psn, CPSProcessInfoRec *info, char *path, int maxPathLen, int *len, char *name, int maxNameLen);
+
+extern OSErr	CPSPostHideMostReq( CPSProcessSerNum *psn);
+
+extern OSErr	CPSPostHideReq( CPSProcessSerNum *psn);
+
+extern OSErr	CPSPostKillRequest( CPSProcessSerNum *psn, CPSKillOptions options);
+
+extern OSErr	CPSPostShowAllReq( CPSProcessSerNum *psn);
+
+extern OSErr	CPSPostShowReq( CPSProcessSerNum *psn);
+
+extern OSErr	CPSSetFrontProcess( CPSProcessSerNum *psn);
+
+extern OSErr	CPSReleaseKeyFocus( CPSProcessSerNum *psn);
+
+extern OSErr	CPSStealKeyFocus( CPSProcessSerNum *psn);
+
+
+#if PRAGMA_STRUCT_ALIGN
+    #pragma options align=reset
+#elif PRAGMA_STRUCT_PACKPUSH
+    #pragma pack(pop)
+#elif PRAGMA_STRUCT_PACK
+    #pragma pack()
+#endif
+
+#ifdef __cplusplus
+}
+#endif
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/English.lproj/APE Manager plugin.nib/classes.nib
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/English.lproj/APE Manager plugin.nib/classes.nib	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/English.lproj/APE Manager plugin.nib/classes.nib	(revision 170)
@@ -0,0 +1,35 @@
+{
+    IBClasses = (
+        {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, 
+        {
+            ACTIONS = {
+                commandClickEnabled = id; 
+                editContextualServices = id; 
+                errorDialogEnabled = id; 
+                errorSoundEnabled = id; 
+                servicesInContextualMenu = id; 
+                servicesInMenuBar = id; 
+                terminalRequireOptionForSelfDrag = id; 
+                textBlinkCount = id; 
+                textBlinkEnabled = id; 
+            }; 
+            CLASS = ICeCoffEEController; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {
+                commandClickEnabled = NSButton; 
+                editContextualServices = NSButton; 
+                errorDialogEnabled = NSButton; 
+                errorSoundEnabled = NSButton; 
+                servicesInContextualMenu = NSButton; 
+                servicesInMenuBar = NSButton; 
+                tabView = NSTabView; 
+                terminalRequireOptionForSelfDrag = NSButton; 
+                textBlinkCount = NSPopUpButton; 
+                textBlinkEnabled = NSButton; 
+                window = NSWindow; 
+            }; 
+            SUPERCLASS = NSObject; 
+        }
+    ); 
+    IBVersion = 1; 
+}
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/English.lproj/APE Manager plugin.nib/info.nib
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/English.lproj/APE Manager plugin.nib/info.nib	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/English.lproj/APE Manager plugin.nib/info.nib	(revision 170)
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IBDocumentLocation</key>
+	<string>306 97 356 240 0 0 1152 746 </string>
+	<key>IBFramework Version</key>
+	<string>364.0</string>
+	<key>IBGroupedObjects</key>
+	<dict>
+		<key>1</key>
+		<array>
+			<string>253</string>
+			<string>256</string>
+			<string>258</string>
+			<string>260</string>
+			<string>262</string>
+			<string>263</string>
+			<string>264</string>
+			<string>266</string>
+			<string>270</string>
+		</array>
+	</dict>
+	<key>IBLastGroupID</key>
+	<string>3</string>
+	<key>IBOpenObjects</key>
+	<array>
+		<integer>195</integer>
+	</array>
+	<key>IBSystem Version</key>
+	<string>7W98</string>
+	<key>IBUserGuides</key>
+	<dict>
+		<key>195</key>
+		<dict>
+			<key>guideLocations</key>
+			<array>
+				<string>Horizontal:245.000000</string>
+			</array>
+			<key>guidesLocked</key>
+			<false/>
+		</dict>
+	</dict>
+</dict>
+</plist>
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/English.lproj/Localizable.strings
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/English.lproj/Localizable.strings	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/English.lproj/Localizable.strings	(revision 170)
@@ -0,0 +1,111 @@
+﻿/**** "Open With" menu ****/
+
+/* Format for 'default app', e.g "Internet Explorer (5.2) (default)" */
+"DefaultApp%@" = "%@ (default)";
+
+/* Format for app location, e.g "Internet Explorer (5.2) -- /Applications" */
+"App%@Location%@" = "%@ — %@";
+
+/* First (disabled, label) element of menu */
+"Open Location With" = "Open Location With";
+
+/* Disabled item above bookmark helper application */
+"Add Bookmark" = "Add Bookmark";
+
+
+/**** Add Bookmark dialog box ****/
+
+/* Title from "Add Bookmark" above */
+
+/* Message */
+"Bookmark name and description are optional." = "Bookmark name and description are optional.";
+
+/* URL text field label */
+"Location:" = "Location:";
+
+/* Bookmark name text field label */
+"Name:" = "Name:";
+
+/* Bookmark description text field label */
+"Description:" = "Description:";
+
+/* Buttons */
+"Add" = "Add";
+"Cancel" = "Cancel";
+
+
+/**** Shared URL launching errors ****/
+
+/* Alert (presented on OSStatus or NSException) */
+"AlertTitle" = "Open Internet Location";
+"AlertMessage%@" = "The selected Internet location could not be opened.\n\n%@.";
+"AlertDisableButton" = "Disable ICeCoffEE…";
+
+/* Session disable alert */
+"DisableAlertTitle" = "Disable ICeCoffEE";
+"DisableAlertMessage%@" = "If you believe ICeCoffEE is interfering with the normal functioning of the application “%@”, you can turn it off in this application until the application has quit.\n\nIf this is the first time you have experienced this problem, please email icecoffee@sabi.net with the details of the conflict.\n\nTo disable ICeCoffEE permanently, use the APE Manager pane of System Preferences.";
+"DisableAlertDisableButton" = "Disable";
+"DisableAlertDontDisableButton" = "Don’t Disable";
+
+
+/**** Shared URL parsing errors ****/
+
+/* After processing, the URL is too long */
+"The potential URL is longer than %lu characters" = "The potential URL is longer than %lu characters";
+
+/* After processing, no URL could be found */
+"No URL is selected" = "No URL is selected";
+
+/* ICStart error */
+"Unable to start Internet Config (error %d)" = "Unable to start Internet Config (error %d)";
+
+
+/**** NSTextView launching errors ****/
+
+/* Can't get selected range */
+"There is no insertion point or selection in the text field where you clicked" = "There is no insertion point or selection in the text field where you clicked";
+
+/* Can't get text storage */
+"Sorry, ICeCoffEE is unable to locate the insertion point or selection" = "Sorry, ICeCoffEE is unable to locate the insertion point or selection";
+
+/* Text storage has zero length */
+"No text was found" = "No text was found";
+
+
+/**** Terminal launching errors ****/
+
+/* Word selection produced nothing */
+"Sorry, ICeCoffEE was unable to find anything to select" = "Sorry, ICeCoffEE was unable to find any text to select";
+
+
+/**** Internet Config errors ****/
+
+/* icPrefNotFoundErr */
+"-666" = "No helper application is set for the selected URL’s scheme (e.g. http:)";
+
+/* icNoURLErr */
+"-673" = "The selection is not a URL";
+
+/* icInternalErr */
+"-669" = "Internet Config experienced an internal error";
+
+
+/**** Launch Services errors ****/
+
+/* kLSApplicationNotFoundErr */
+"-10814" = "No helper applications are available for the selected URL’s scheme (e.g. http:)";
+
+
+/**** Misc. errors ****/
+
+/* fnfErr */
+"-43" = "The URL references a local file which could not be found";
+
+/* paramErr */
+"-50" = "The selection is not a complete URL";
+
+/* kTECNoConversionPathErr */
+"-8749" = "The selected URL contains invalid (non-ASCII) characters";
+
+/* Message to use if no OSError lookup message is available; substitutes context */
+"An unknown error occurred in %@" = "An unknown error occurred in %@";
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/English.lproj/Select services.nib/classes.nib
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/English.lproj/Select services.nib/classes.nib	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/English.lproj/Select services.nib/classes.nib	(revision 170)
@@ -0,0 +1,24 @@
+{
+    IBClasses = (
+        {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, 
+        {
+            CLASS = ICeCoffEENonHighlightingOutlineView; 
+            LANGUAGE = ObjC; 
+            SUPERCLASS = NSOutlineView; 
+        }, 
+        {
+            CLASS = ICeCoffEEServiceDataSource; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {serviceOutline = NSOutlineView; }; 
+            SUPERCLASS = NSObject; 
+        }, 
+        {
+            ACTIONS = {cancel = id; hideAll = id; saveChanges = id; showAll = id; }; 
+            CLASS = ICeCoffEEServicePrefController; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {serviceOutline = NSOutlineView; }; 
+            SUPERCLASS = NSWindowController; 
+        }
+    ); 
+    IBVersion = 1; 
+}
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/English.lproj/Select services.nib/info.nib
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/English.lproj/Select services.nib/info.nib	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/English.lproj/Select services.nib/info.nib	(revision 170)
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IBDocumentLocation</key>
+	<string>99 33 356 240 0 0 1280 832 </string>
+	<key>IBFramework Version</key>
+	<string>291.0</string>
+	<key>IBOpenObjects</key>
+	<array>
+		<integer>21</integer>
+	</array>
+	<key>IBSystem Version</key>
+	<string>6L60</string>
+</dict>
+</plist>
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/Exports.exp
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/Exports.exp	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/Exports.exp	(revision 170)
@@ -0,0 +1,3 @@
+_APEBundleMainEarlyLoad
+_APEBundleMainLateLoad
+_APEBundleMessage
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/German.lproj/APE Manager plugin.nib/classes.nib
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/German.lproj/APE Manager plugin.nib/classes.nib	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/German.lproj/APE Manager plugin.nib/classes.nib	(revision 170)
@@ -0,0 +1,31 @@
+{
+    IBClasses = (
+        {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, 
+        {
+            ACTIONS = {
+                commandClickEnabled = id; 
+                errorDialogEnabled = id; 
+                errorSoundEnabled = id; 
+                servicesInContextualMenu = id; 
+                servicesInMenuBar = id; 
+                textBlinkCount = id; 
+                textBlinkEnabled = id; 
+            }; 
+            CLASS = ICeCoffEEController; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {
+                commandClickEnabled = NSButton; 
+                errorDialogEnabled = NSButton; 
+                errorSoundEnabled = NSButton; 
+                servicesInContextualMenu = NSButton; 
+                servicesInMenuBar = NSButton; 
+                tabView = NSTabView; 
+                textBlinkCount = NSPopUpButton; 
+                textBlinkEnabled = NSButton; 
+                window = NSWindow; 
+            }; 
+            SUPERCLASS = NSObject; 
+        }
+    ); 
+    IBVersion = 1; 
+}
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/German.lproj/APE Manager plugin.nib/info.nib
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/German.lproj/APE Manager plugin.nib/info.nib	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/German.lproj/APE Manager plugin.nib/info.nib	(revision 170)
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IBDocumentLocation</key>
+	<string>355 113 356 240 0 0 1280 832 </string>
+	<key>IBFramework Version</key>
+	<string>291.0</string>
+	<key>IBGroupedObjects</key>
+	<dict>
+		<key>1</key>
+		<array>
+			<string>253</string>
+			<string>256</string>
+			<string>258</string>
+			<string>260</string>
+			<string>262</string>
+			<string>263</string>
+			<string>264</string>
+			<string>266</string>
+			<string>270</string>
+		</array>
+	</dict>
+	<key>IBLastGroupID</key>
+	<string>4</string>
+	<key>IBOpenObjects</key>
+	<array>
+		<integer>195</integer>
+	</array>
+	<key>IBSystem Version</key>
+	<string>6L60</string>
+	<key>IBUserGuides</key>
+	<dict>
+		<key>195</key>
+		<dict>
+			<key>guideLocations</key>
+			<array>
+				<string>Horizontal:245.000000</string>
+			</array>
+			<key>guidesLocked</key>
+			<false/>
+		</dict>
+	</dict>
+</dict>
+</plist>
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICFindFilesToRemove/ICFindFilesToRemove_Prefix.h
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICFindFilesToRemove/ICFindFilesToRemove_Prefix.h	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICFindFilesToRemove/ICFindFilesToRemove_Prefix.h	(revision 170)
@@ -0,0 +1,7 @@
+//
+// Prefix header for all source files of the 'ICFindFilesToRemove' target in the 'ICFindFilesToRemove' project.
+//
+
+#ifdef __OBJC__
+    #import <Foundation/Foundation.h>
+#endif
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICFindFilesToRemove/UICookieMonster.h
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICFindFilesToRemove/UICookieMonster.h	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICFindFilesToRemove/UICookieMonster.h	(revision 170)
@@ -0,0 +1,37 @@
+//
+//  UICookieMonster.h
+//  Unsanity Installer
+//
+//  Created by Slava Karpenko on Thu Nov 28 2002.
+//  Copyright (c) 2002 Unsanity LLC. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+
+@interface UICookieMonster : NSObject {
+    NSString* productID;
+    NSMutableArray* files;
+    BOOL dirty;
+    BOOL isGlobal;
+    UInt32 version;
+    UInt32 cachedVersion;
+}
+
++ monsterWithProductID:(NSString*)pid global:(BOOL)global version:(UInt32)inVersion;
++ monsterWithProductID:(NSString*)pid global:(BOOL)global;
++ monsterWithProductID:(NSString*)pid;
++ (void)removeProductID:(NSString*)pid;
+
+- initWithProductID:(NSString*)pid globalVersionValid:(BOOL)gvValid global:(BOOL)global version:(UInt32)inVersion;
+
+- (void)addFile:(NSString*)path;
+- (void)removeFile:(NSString*)path;
+
+- (UInt32)productVersion;
+- (BOOL)isGlobal;
+
+- (NSArray*)filesToRemove;
+
+- (void)flush;
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICFindFilesToRemove/UICookieMonster.m
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICFindFilesToRemove/UICookieMonster.m	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICFindFilesToRemove/UICookieMonster.m	(revision 170)
@@ -0,0 +1,154 @@
+//
+//  UICookieMonster.m
+//  Unsanity Installer
+//
+//  Created by Slava Karpenko on Thu Nov 28 2002.
+//  Copyright (c) 2002 Unsanity LLC. All rights reserved.
+//
+
+#import "UICookieMonster.h"
+
+#define kCookieID CFSTR("Unsanity Installer Receipts")
+
+@implementation UICookieMonster
++ monsterWithProductID:(NSString*)pid global:(BOOL)global version:(UInt32)inVersion
+{
+    if (!pid)
+        return nil;
+        
+    return [[[UICookieMonster alloc] initWithProductID:pid globalVersionValid:YES global:global version:inVersion] autorelease];
+}
+
++ monsterWithProductID:(NSString*)pid global:(BOOL)global
+{
+    if (!pid)
+        return nil;
+
+    return [[[UICookieMonster alloc] initWithProductID:pid globalVersionValid:NO global:global version:0] autorelease];
+}
+
++ monsterWithProductID:(NSString*)pid
+{
+    if (!pid)
+        return nil;
+        
+    return [[[UICookieMonster alloc] initWithProductID:pid globalVersionValid:NO global:NO version:0] autorelease];
+}
+
+- initWithProductID:(NSString*)pid globalVersionValid:(BOOL)gvValid global:(BOOL)global version:(UInt32)inVersion
+{
+    CFDictionaryRef dict;
+    
+    productID = [pid retain];
+    isGlobal = global;
+    version = inVersion;
+    cachedVersion = NULL;
+    
+    files = [[NSMutableArray arrayWithCapacity:0] retain];
+    
+    CFPreferencesSynchronize(kCookieID, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
+    CFPreferencesSynchronize(kCookieID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
+    
+    dict = CFPreferencesCopyValue((CFStringRef)productID, kCookieID, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
+    
+    if (dict)
+    {
+        NSNumber* vers = (NSNumber*)CFDictionaryGetValue(dict, CFSTR("Version"));
+        [files addObjectsFromArray:(NSArray*)CFDictionaryGetValue(dict, CFSTR("Files"))];
+        cachedVersion = [vers intValue];
+        
+        if (!gvValid) isGlobal = YES;
+        
+        //NSLog(@"Global data read = %@", dict);
+        CFRelease(dict);
+    }
+    else
+    {
+        dict = CFPreferencesCopyValue((CFStringRef)productID, kCookieID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
+        
+        if (dict)
+        {
+            NSNumber* vers = (NSNumber*)CFDictionaryGetValue(dict, CFSTR("Version"));
+            [files addObjectsFromArray:(NSArray*)CFDictionaryGetValue(dict, CFSTR("Files"))];
+            cachedVersion = [vers intValue];
+            if (!gvValid) isGlobal = NO;
+            
+            //NSLog(@"Local data read = %@", dict);
+            CFRelease(dict);
+        }
+    
+    }
+    
+    if (!cachedVersion) cachedVersion = version;
+    if (!gvValid) version = cachedVersion;
+    
+    dirty = NO;
+    
+    return self;
+}
+
+- (BOOL)isGlobal
+{
+    return isGlobal;
+}
+
+- (UInt32)productVersion
+{
+    return cachedVersion;
+}
+
+- (void)dealloc
+{
+    [self flush];
+    
+    [productID release];
+    [files release];
+}
+
+- (void)addFile:(NSString*)path
+{
+    if (![files containsObject:path])
+    {
+        [files addObject:path];
+        dirty = YES;
+    }
+}
+
+- (void)removeFile:(NSString*)path
+{
+}
+
+- (NSArray*)filesToRemove
+{
+    return files;
+}
+
+- (void)flush
+{
+    NSMutableDictionary* dict = [NSMutableDictionary dictionaryWithCapacity:0];
+    
+    if (!dirty)
+        return;
+    
+    [dict setObject:[NSNumber numberWithInt:version] forKey:@"Version"];
+    [dict setObject:files forKey:@"Files"];
+    
+    CFPreferencesSetValue((CFStringRef)productID, NULL, kCookieID, isGlobal?kCFPreferencesCurrentUser:kCFPreferencesAnyUser, isGlobal?kCFPreferencesAnyHost:kCFPreferencesCurrentHost);
+    CFPreferencesSetValue((CFStringRef)productID, (CFPropertyListRef)dict, kCookieID, isGlobal?kCFPreferencesAnyUser:kCFPreferencesCurrentUser, isGlobal?kCFPreferencesCurrentHost:kCFPreferencesAnyHost);
+    
+    CFPreferencesSynchronize(kCookieID, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
+    CFPreferencesSynchronize(kCookieID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
+    
+    dirty = NO;
+}
+
++ (void)removeProductID:(NSString*)pid
+{
+    CFPreferencesSetValue((CFStringRef)pid, NULL, kCookieID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
+    CFPreferencesSetValue((CFStringRef)pid, NULL, kCookieID, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
+    
+    CFPreferencesSynchronize(kCookieID, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
+    CFPreferencesSynchronize(kCookieID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
+}
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICFindFilesToRemove/main.m
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICFindFilesToRemove/main.m	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICFindFilesToRemove/main.m	(revision 170)
@@ -0,0 +1,55 @@
+#import <Foundation/Foundation.h>
+#import "UICookieMonster.h"
+
+#define kProductID 		@"net.sabi.ICeCoffEE"
+
+// if the first path exists, it and all subsequent paths will be removed
+
+NSString* gGlobalPaths[] = {
+    @"/Library/InputManagers/ICeCoffEE",
+    @"/Library/Application Enhancers/ICeCoffEE.ape",
+    nil
+};
+
+NSString* gLocalPaths[] = {
+    @"~/Library/InputManagers/ICeCoffEE",
+    @"~/Library/Application Enhancers/ICeCoffEE.ape",
+    nil
+};
+
+int main (int argc, const char * argv[]) {
+    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+    UICookieMonster* monster = [UICookieMonster monsterWithProductID:kProductID];
+    NSArray* files = [monster filesToRemove];
+    
+    if (!files || ![files count])
+    {
+        if ([[NSFileManager defaultManager] fileExistsAtPath:[gGlobalPaths[0] stringByExpandingTildeInPath]])
+        {
+            UICookieMonster* mons = [UICookieMonster monsterWithProductID:kProductID global:YES];
+            int i;
+            
+            for (i=0;gGlobalPaths[i];i++)
+            {
+                [mons addFile:[gGlobalPaths[i] stringByExpandingTildeInPath]];
+            }
+            
+            [mons flush];
+        }
+        else if ([[NSFileManager defaultManager] fileExistsAtPath:[gLocalPaths[0] stringByExpandingTildeInPath]])
+        {
+            UICookieMonster* mons = [UICookieMonster monsterWithProductID:kProductID global:NO];
+            int i;
+            
+            for (i=0;gLocalPaths[i];i++)
+            {
+                [mons addFile:[gLocalPaths[i] stringByExpandingTildeInPath]];
+            }
+            
+            [mons flush];
+        }
+    }
+    
+    [pool release];
+    return 0;
+}
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEE APE.xcode/nicholas.mode1
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEE APE.xcode/nicholas.mode1	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEE APE.xcode/nicholas.mode1	(revision 170)
@@ -0,0 +1,1164 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>ActivePerspectiveName</key>
+	<string>Project</string>
+	<key>AllowedModules</key>
+	<array>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>n</string>
+			<key>Module</key>
+			<string>PBXSmartGroupTreeModule</string>
+			<key>Name</key>
+			<string>Groups and Files Outline View</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>n</string>
+			<key>Module</key>
+			<string>PBXNavigatorGroup</string>
+			<key>Name</key>
+			<string>Editor</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>n</string>
+			<key>Module</key>
+			<string>XCTaskListModule</string>
+			<key>Name</key>
+			<string>Task List</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>n</string>
+			<key>Module</key>
+			<string>XCDetailModule</string>
+			<key>Name</key>
+			<string>File and Smart Group Detail Viewer</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>1</string>
+			<key>Module</key>
+			<string>PBXBuildResultsModule</string>
+			<key>Name</key>
+			<string>Detailed Build Results Viewer</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>1</string>
+			<key>Module</key>
+			<string>PBXProjectFindModule</string>
+			<key>Name</key>
+			<string>Project Batch Find Tool</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>n</string>
+			<key>Module</key>
+			<string>PBXRunSessionModule</string>
+			<key>Name</key>
+			<string>Run Log</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>n</string>
+			<key>Module</key>
+			<string>PBXBookmarksModule</string>
+			<key>Name</key>
+			<string>Bookmarks Tool</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>n</string>
+			<key>Module</key>
+			<string>PBXClassBrowserModule</string>
+			<key>Name</key>
+			<string>Class Browser</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>n</string>
+			<key>Module</key>
+			<string>PBXCVSModule</string>
+			<key>Name</key>
+			<string>Source Code Control Tool</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>n</string>
+			<key>Module</key>
+			<string>PBXDebugBreakpointsModule</string>
+			<key>Name</key>
+			<string>Debug Breakpoints Tool</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>n</string>
+			<key>Module</key>
+			<string>XCDockableInspector</string>
+			<key>Name</key>
+			<string>Inspector</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>n</string>
+			<key>Module</key>
+			<string>PBXOpenQuicklyModule</string>
+			<key>Name</key>
+			<string>Open Quickly Tool</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>1</string>
+			<key>Module</key>
+			<string>PBXDebugSessionModule</string>
+			<key>Name</key>
+			<string>Debugger</string>
+		</dict>
+		<dict>
+			<key>BundleLoadPath</key>
+			<string></string>
+			<key>MaxInstances</key>
+			<string>1</string>
+			<key>Module</key>
+			<string>PBXDebugCLIModule</string>
+			<key>Name</key>
+			<string>Debug Console</string>
+		</dict>
+	</array>
+	<key>Description</key>
+	<string>This workspace mimics that found in Xcode 1.2, with various minor improvements such as including attached editors to the build results window and the project find window.</string>
+	<key>DockingSystemVisible</key>
+	<false/>
+	<key>Extension</key>
+	<string>mode1</string>
+	<key>FirstTimeWindowDisplayed</key>
+	<false/>
+	<key>Identifier</key>
+	<string>com.apple.perspectives.project.mode1</string>
+	<key>MajorVersion</key>
+	<integer>31</integer>
+	<key>MinorVersion</key>
+	<integer>0</integer>
+	<key>Name</key>
+	<string>Default Workspace</string>
+	<key>Notifications</key>
+	<array>
+		<dict>
+			<key>XCObserverAutoDisconnectKey</key>
+			<true/>
+			<key>XCObserverDefintionKey</key>
+			<dict>
+				<key>PBXStatusErrorsKey</key>
+				<integer>0</integer>
+			</dict>
+			<key>XCObserverFactoryKey</key>
+			<string>XCPerspectivesSpecificationIdentifier</string>
+			<key>XCObserverGUIDKey</key>
+			<string>XCObserverProjectIdentifier</string>
+			<key>XCObserverNotificationKey</key>
+			<string>PBXStatusBuildStateMessageNotification</string>
+			<key>XCObserverTargetKey</key>
+			<string>XCMainBuildResultsModuleGUID</string>
+			<key>XCObserverTriggerKey</key>
+			<string>awakenModuleWithObserver:</string>
+			<key>XCObserverValidationKey</key>
+			<dict>
+				<key>PBXStatusErrorsKey</key>
+				<integer>2</integer>
+			</dict>
+		</dict>
+	</array>
+	<key>OpenEditors</key>
+	<array/>
+	<key>Perspectives</key>
+	<array>
+		<dict>
+			<key>ChosenToolbarItems</key>
+			<array>
+				<string>active-target-popup</string>
+				<string>NSToolbarFlexibleSpaceItem</string>
+				<string>buildOrClean</string>
+				<string>build-and-runOrDebug</string>
+				<string>com.apple.ide.PBXToolbarStopButton</string>
+				<string>get-info</string>
+				<string>NSToolbarFlexibleSpaceItem</string>
+				<string>com.apple.pbx.toolbar.searchfield</string>
+			</array>
+			<key>ControllerClassBaseName</key>
+			<string></string>
+			<key>IconName</key>
+			<string>WindowOfProject</string>
+			<key>Identifier</key>
+			<string>perspective.project</string>
+			<key>IsVertical</key>
+			<false/>
+			<key>Layout</key>
+			<array>
+				<dict>
+					<key>BecomeActive</key>
+					<true/>
+					<key>ContentConfiguration</key>
+					<dict>
+						<key>PBXBottomSmartGroupGIDs</key>
+						<array>
+							<string>1C37FBAC04509CD000000102</string>
+							<string>1C37FAAC04509CD000000102</string>
+							<string>1C08E77C0454961000C914BD</string>
+							<string>1C37FABC05509CD000000102</string>
+							<string>1C37FABC05539CD112110102</string>
+							<string>E2644B35053B69B200211256</string>
+							<string>1C37FABC04509CD000100104</string>
+						</array>
+						<key>PBXProjectModuleGUID</key>
+						<string>1CE0B1FE06471DED0097A5F4</string>
+						<key>PBXProjectModuleLabel</key>
+						<string>Files</string>
+						<key>PBXProjectStructureProvided</key>
+						<string>yes</string>
+						<key>PBXSmartGroupTreeModuleColumnData</key>
+						<dict>
+							<key>PBXSmartGroupTreeModuleColumnWidthsKey</key>
+							<array>
+								<real>186</real>
+							</array>
+							<key>PBXSmartGroupTreeModuleColumnsKey_v4</key>
+							<array>
+								<string>MainColumn</string>
+							</array>
+						</dict>
+						<key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key>
+						<dict>
+							<key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key>
+							<array>
+								<string>29B97314FDCFA39411CA2CEA</string>
+								<string>29B97315FDCFA39411CA2CEA</string>
+								<string>E1AFA51C03ECFDB000050001</string>
+								<string>1C37FBAC04509CD000000102</string>
+							</array>
+							<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
+							<array>
+								<array>
+									<integer>9</integer>
+									<integer>2</integer>
+									<integer>0</integer>
+								</array>
+							</array>
+							<key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>
+							<string>{{0, 0}, {186, 469}}</string>
+						</dict>
+						<key>PBXTopSmartGroupGIDs</key>
+						<array/>
+					</dict>
+					<key>GeometryConfiguration</key>
+					<dict>
+						<key>Frame</key>
+						<string>{{0, 0}, {203, 487}}</string>
+						<key>GroupTreeTableConfiguration</key>
+						<array>
+							<string>MainColumn</string>
+							<real>186</real>
+						</array>
+						<key>RubberWindowFrame</key>
+						<string>13 230 697 508 0 0 1152 746 </string>
+					</dict>
+					<key>Module</key>
+					<string>PBXSmartGroupTreeModule</string>
+					<key>Proportion</key>
+					<string>203pt</string>
+				</dict>
+				<dict>
+					<key>Dock</key>
+					<array>
+						<dict>
+							<key>ContentConfiguration</key>
+							<dict>
+								<key>PBXProjectModuleGUID</key>
+								<string>1CE0B20306471E060097A5F4</string>
+								<key>PBXProjectModuleLabel</key>
+								<string>MyNewFile14.java</string>
+								<key>PBXSplitModuleInNavigatorKey</key>
+								<dict>
+									<key>Split0</key>
+									<dict>
+										<key>PBXProjectModuleGUID</key>
+										<string>1CE0B20406471E060097A5F4</string>
+										<key>PBXProjectModuleLabel</key>
+										<string>MyNewFile14.java</string>
+									</dict>
+									<key>SplitCount</key>
+									<string>1</string>
+								</dict>
+								<key>StatusBarVisibility</key>
+								<false/>
+							</dict>
+							<key>GeometryConfiguration</key>
+							<dict>
+								<key>Frame</key>
+								<string>{{0, 0}, {488, 0}}</string>
+								<key>RubberWindowFrame</key>
+								<string>13 230 697 508 0 0 1152 746 </string>
+							</dict>
+							<key>Module</key>
+							<string>PBXNavigatorGroup</string>
+							<key>Proportion</key>
+							<string>0pt</string>
+						</dict>
+						<dict>
+							<key>ContentConfiguration</key>
+							<dict>
+								<key>PBXProjectModuleGUID</key>
+								<string>1CE0B20506471E060097A5F4</string>
+								<key>PBXProjectModuleLabel</key>
+								<string>Targets</string>
+							</dict>
+							<key>GeometryConfiguration</key>
+							<dict>
+								<key>Frame</key>
+								<string>{{0, 7}, {488, 480}}</string>
+								<key>RubberWindowFrame</key>
+								<string>13 230 697 508 0 0 1152 746 </string>
+							</dict>
+							<key>Module</key>
+							<string>XCDetailModule</string>
+							<key>Proportion</key>
+							<string>480pt</string>
+						</dict>
+					</array>
+					<key>Proportion</key>
+					<string>488pt</string>
+				</dict>
+			</array>
+			<key>Name</key>
+			<string>Project</string>
+			<key>ServiceClasses</key>
+			<array>
+				<string>XCModuleDock</string>
+				<string>PBXSmartGroupTreeModule</string>
+				<string>XCModuleDock</string>
+				<string>PBXNavigatorGroup</string>
+				<string>XCDetailModule</string>
+			</array>
+			<key>TableOfContents</key>
+			<array>
+				<string>E1DA7150081459C400D5158A</string>
+				<string>1CE0B1FE06471DED0097A5F4</string>
+				<string>E1DA7151081459C400D5158A</string>
+				<string>1CE0B20306471E060097A5F4</string>
+				<string>1CE0B20506471E060097A5F4</string>
+			</array>
+			<key>ToolbarConfiguration</key>
+			<string>xcode.toolbar.config.default</string>
+		</dict>
+	</array>
+	<key>PerspectivesBarVisible</key>
+	<false/>
+	<key>StatusbarIsVisible</key>
+	<false/>
+	<key>TimeStamp</key>
+	<real>135551345.73168311</real>
+	<key>ToolbarDisplayMode</key>
+	<integer>2</integer>
+	<key>ToolbarIsVisible</key>
+	<true/>
+	<key>ToolbarSizeMode</key>
+	<integer>2</integer>
+	<key>Type</key>
+	<string>Perspectives</string>
+	<key>UpdateMessage</key>
+	<string></string>
+	<key>WindowJustification</key>
+	<integer>5</integer>
+	<key>WindowOrderList</key>
+	<array>
+		<string>/Users/nicholas/Documents/Development/ICeCoffEE/ICeCoffEE/ICeCoffEE APE.xcode</string>
+		<string>E1DA7152081459C400D5158A</string>
+		<string>E1DA7153081459C400D5158A</string>
+	</array>
+	<key>WindowString</key>
+	<string>13 230 697 508 0 0 1152 746 </string>
+	<key>WindowTools</key>
+	<array>
+		<dict>
+			<key>FirstTimeWindowDisplayed</key>
+			<false/>
+			<key>Identifier</key>
+			<string>windowTool.build</string>
+			<key>Layout</key>
+			<array>
+				<dict>
+					<key>Dock</key>
+					<array>
+						<dict>
+							<key>ContentConfiguration</key>
+							<dict>
+								<key>PBXProjectModuleGUID</key>
+								<string>1CD0528F0623707200166675</string>
+								<key>PBXProjectModuleLabel</key>
+								<string>ICeCoffEEController.m</string>
+								<key>PBXSplitModuleInNavigatorKey</key>
+								<dict>
+									<key>Split0</key>
+									<dict>
+										<key>PBXProjectModuleGUID</key>
+										<string>1CD052900623707200166675</string>
+										<key>PBXProjectModuleLabel</key>
+										<string>ICeCoffEEController.m</string>
+									</dict>
+									<key>SplitCount</key>
+									<string>1</string>
+								</dict>
+								<key>StatusBarVisibility</key>
+								<true/>
+							</dict>
+							<key>GeometryConfiguration</key>
+							<dict>
+								<key>Frame</key>
+								<string>{{0, 0}, {857, 0}}</string>
+								<key>RubberWindowFrame</key>
+								<string>22 75 857 385 0 0 1152 746 </string>
+							</dict>
+							<key>Module</key>
+							<string>PBXNavigatorGroup</string>
+							<key>Proportion</key>
+							<string>0pt</string>
+						</dict>
+						<dict>
+							<key>BecomeActive</key>
+							<true/>
+							<key>ContentConfiguration</key>
+							<dict>
+								<key>PBXProjectModuleGUID</key>
+								<string>XCMainBuildResultsModuleGUID</string>
+								<key>PBXProjectModuleLabel</key>
+								<string>Build</string>
+								<key>XCBuildResultsTrigger_Collapse</key>
+								<integer>1021</integer>
+								<key>XCBuildResultsTrigger_Open</key>
+								<integer>1012</integer>
+							</dict>
+							<key>GeometryConfiguration</key>
+							<dict>
+								<key>Frame</key>
+								<string>{{0, 7}, {857, 336}}</string>
+								<key>RubberWindowFrame</key>
+								<string>22 75 857 385 0 0 1152 746 </string>
+							</dict>
+							<key>Module</key>
+							<string>PBXBuildResultsModule</string>
+							<key>Proportion</key>
+							<string>336pt</string>
+						</dict>
+					</array>
+					<key>Proportion</key>
+					<string>343pt</string>
+				</dict>
+			</array>
+			<key>Name</key>
+			<string>Build Results</string>
+			<key>ServiceClasses</key>
+			<array>
+				<string>PBXBuildResultsModule</string>
+			</array>
+			<key>StatusbarIsVisible</key>
+			<true/>
+			<key>TableOfContents</key>
+			<array>
+				<string>E1718325081434180097E5AE</string>
+				<string>E1718326081434180097E5AE</string>
+				<string>1CD0528F0623707200166675</string>
+				<string>XCMainBuildResultsModuleGUID</string>
+			</array>
+			<key>ToolbarConfiguration</key>
+			<string>xcode.toolbar.config.build</string>
+			<key>WindowString</key>
+			<string>22 75 857 385 0 0 1152 746 </string>
+			<key>WindowToolGUID</key>
+			<string>E1718325081434180097E5AE</string>
+			<key>WindowToolIsVisible</key>
+			<true/>
+		</dict>
+		<dict>
+			<key>FirstTimeWindowDisplayed</key>
+			<false/>
+			<key>Identifier</key>
+			<string>windowTool.debugger</string>
+			<key>Layout</key>
+			<array>
+				<dict>
+					<key>Dock</key>
+					<array>
+						<dict>
+							<key>ContentConfiguration</key>
+							<dict>
+								<key>Debugger</key>
+								<dict>
+									<key>HorizontalSplitView</key>
+									<dict>
+										<key>_collapsingFrameDimension</key>
+										<real>0.0</real>
+										<key>_indexOfCollapsedView</key>
+										<integer>0</integer>
+										<key>_percentageOfCollapsedView</key>
+										<real>0.0</real>
+										<key>isCollapsed</key>
+										<string>yes</string>
+										<key>sizes</key>
+										<array>
+											<string>{{0, 0}, {305, 164}}</string>
+											<string>{{305, 0}, {389, 164}}</string>
+										</array>
+									</dict>
+									<key>VerticalSplitView</key>
+									<dict>
+										<key>_collapsingFrameDimension</key>
+										<real>0.0</real>
+										<key>_indexOfCollapsedView</key>
+										<integer>0</integer>
+										<key>_percentageOfCollapsedView</key>
+										<real>0.0</real>
+										<key>isCollapsed</key>
+										<string>yes</string>
+										<key>sizes</key>
+										<array>
+											<string>{{0, 0}, {694, 164}}</string>
+											<string>{{0, 164}, {694, 216}}</string>
+										</array>
+									</dict>
+								</dict>
+								<key>LauncherConfigVersion</key>
+								<string>8</string>
+								<key>PBXProjectModuleGUID</key>
+								<string>1C162984064C10D400B95A72</string>
+								<key>PBXProjectModuleLabel</key>
+								<string>Debug - GLUTExamples (Underwater)</string>
+							</dict>
+							<key>GeometryConfiguration</key>
+							<dict>
+								<key>DebugConsoleDrawerSize</key>
+								<string>{100, 120}</string>
+								<key>DebugConsoleVisible</key>
+								<string>None</string>
+								<key>DebugConsoleWindowFrame</key>
+								<string>{{200, 200}, {500, 300}}</string>
+								<key>DebugSTDIOWindowFrame</key>
+								<string>{{200, 200}, {500, 300}}</string>
+								<key>Frame</key>
+								<string>{{0, 0}, {694, 380}}</string>
+								<key>RubberWindowFrame</key>
+								<string>334 151 694 422 0 0 1152 746 </string>
+							</dict>
+							<key>Module</key>
+							<string>PBXDebugSessionModule</string>
+							<key>Proportion</key>
+							<string>380pt</string>
+						</dict>
+					</array>
+					<key>Proportion</key>
+					<string>380pt</string>
+				</dict>
+			</array>
+			<key>Name</key>
+			<string>Debugger</string>
+			<key>ServiceClasses</key>
+			<array>
+				<string>PBXDebugSessionModule</string>
+			</array>
+			<key>StatusbarIsVisible</key>
+			<true/>
+			<key>TableOfContents</key>
+			<array>
+				<string>1CD10A99069EF8BA00B06720</string>
+				<string>E109681A0812BDF60088089B</string>
+				<string>1C162984064C10D400B95A72</string>
+				<string>E109681B0812BDF60088089B</string>
+			</array>
+			<key>ToolbarConfiguration</key>
+			<string>xcode.toolbar.config.debug</string>
+			<key>WindowString</key>
+			<string>334 151 694 422 0 0 1152 746 </string>
+			<key>WindowToolGUID</key>
+			<string>1CD10A99069EF8BA00B06720</string>
+			<key>WindowToolIsVisible</key>
+			<false/>
+		</dict>
+		<dict>
+			<key>FirstTimeWindowDisplayed</key>
+			<false/>
+			<key>Identifier</key>
+			<string>windowTool.find</string>
+			<key>Layout</key>
+			<array>
+				<dict>
+					<key>Dock</key>
+					<array>
+						<dict>
+							<key>Dock</key>
+							<array>
+								<dict>
+									<key>ContentConfiguration</key>
+									<dict>
+										<key>PBXProjectModuleGUID</key>
+										<string>1CDD528C0622207200134675</string>
+										<key>PBXProjectModuleLabel</key>
+										<string>ICeCoffEEShared.m</string>
+										<key>PBXSplitModuleInNavigatorKey</key>
+										<dict>
+											<key>Split0</key>
+											<dict>
+												<key>PBXProjectModuleGUID</key>
+												<string>1CD0528D0623707200166675</string>
+												<key>PBXProjectModuleLabel</key>
+												<string>ICeCoffEEShared.m</string>
+												<key>bookmark</key>
+												<string>E10969290812D3D20088089B</string>
+												<key>history</key>
+												<array>
+													<string>E10968D00812C0990088089B</string>
+												</array>
+											</dict>
+											<key>SplitCount</key>
+											<string>1</string>
+										</dict>
+										<key>StatusBarVisibility</key>
+										<false/>
+									</dict>
+									<key>GeometryConfiguration</key>
+									<dict>
+										<key>Frame</key>
+										<string>{{0, 0}, {781, 116}}</string>
+										<key>RubberWindowFrame</key>
+										<string>168 222 781 470 0 0 1152 746 </string>
+									</dict>
+									<key>Module</key>
+									<string>PBXNavigatorGroup</string>
+									<key>Proportion</key>
+									<string>781pt</string>
+								</dict>
+							</array>
+							<key>Proportion</key>
+							<string>116pt</string>
+						</dict>
+						<dict>
+							<key>BecomeActive</key>
+							<true/>
+							<key>ContentConfiguration</key>
+							<dict>
+								<key>PBXProjectModuleGUID</key>
+								<string>1CD0528E0623707200166675</string>
+								<key>PBXProjectModuleLabel</key>
+								<string>Project Find</string>
+							</dict>
+							<key>GeometryConfiguration</key>
+							<dict>
+								<key>Frame</key>
+								<string>{{0, 123}, {781, 326}}</string>
+								<key>RubberWindowFrame</key>
+								<string>168 222 781 470 0 0 1152 746 </string>
+							</dict>
+							<key>Module</key>
+							<string>PBXProjectFindModule</string>
+							<key>Proportion</key>
+							<string>326pt</string>
+						</dict>
+					</array>
+					<key>Proportion</key>
+					<string>449pt</string>
+				</dict>
+			</array>
+			<key>Name</key>
+			<string>Project Find</string>
+			<key>ServiceClasses</key>
+			<array>
+				<string>PBXProjectFindModule</string>
+			</array>
+			<key>StatusbarIsVisible</key>
+			<false/>
+			<key>TableOfContents</key>
+			<array>
+				<string>1C530D57069F1CE1000CFCEE</string>
+				<string>E10968D30812C09E0088089B</string>
+				<string>E10968D40812C09E0088089B</string>
+				<string>1CDD528C0622207200134675</string>
+				<string>1CD0528E0623707200166675</string>
+			</array>
+			<key>WindowString</key>
+			<string>168 222 781 470 0 0 1152 746 </string>
+			<key>WindowToolGUID</key>
+			<string>1C530D57069F1CE1000CFCEE</string>
+			<key>WindowToolIsVisible</key>
+			<false/>
+		</dict>
+		<dict>
+			<key>Identifier</key>
+			<string>MENUSEPARATOR</string>
+		</dict>
+		<dict>
+			<key>FirstTimeWindowDisplayed</key>
+			<false/>
+			<key>Identifier</key>
+			<string>windowTool.debuggerConsole</string>
+			<key>Layout</key>
+			<array>
+				<dict>
+					<key>Dock</key>
+					<array>
+						<dict>
+							<key>ContentConfiguration</key>
+							<dict>
+								<key>PBXProjectModuleGUID</key>
+								<string>1C78EAAC065D492600B07095</string>
+								<key>PBXProjectModuleLabel</key>
+								<string>Debugger Console</string>
+							</dict>
+							<key>GeometryConfiguration</key>
+							<dict>
+								<key>Frame</key>
+								<string>{{0, 0}, {440, 358}}</string>
+								<key>RubberWindowFrame</key>
+								<string>380 146 440 400 0 0 1152 746 </string>
+							</dict>
+							<key>Module</key>
+							<string>PBXDebugCLIModule</string>
+							<key>Proportion</key>
+							<string>358pt</string>
+						</dict>
+					</array>
+					<key>Proportion</key>
+					<string>358pt</string>
+				</dict>
+			</array>
+			<key>Name</key>
+			<string>Debugger Console</string>
+			<key>ServiceClasses</key>
+			<array>
+				<string>PBXDebugCLIModule</string>
+			</array>
+			<key>StatusbarIsVisible</key>
+			<true/>
+			<key>TableOfContents</key>
+			<array>
+				<string>E14F91CA07067F7A000B9FBF</string>
+				<string>E109681C0812BDF60088089B</string>
+				<string>1C78EAAC065D492600B07095</string>
+			</array>
+			<key>WindowString</key>
+			<string>380 146 440 400 0 0 1152 746 </string>
+			<key>WindowToolGUID</key>
+			<string>E14F91CA07067F7A000B9FBF</string>
+			<key>WindowToolIsVisible</key>
+			<false/>
+		</dict>
+		<dict>
+			<key>FirstTimeWindowDisplayed</key>
+			<false/>
+			<key>Identifier</key>
+			<string>windowTool.run</string>
+			<key>Layout</key>
+			<array>
+				<dict>
+					<key>Dock</key>
+					<array>
+						<dict>
+							<key>ContentConfiguration</key>
+							<dict>
+								<key>LauncherConfigVersion</key>
+								<string>3</string>
+								<key>PBXProjectModuleGUID</key>
+								<string>1CD0528B0623707200166675</string>
+								<key>PBXProjectModuleLabel</key>
+								<string>Run</string>
+								<key>Runner</key>
+								<dict>
+									<key>HorizontalSplitView</key>
+									<dict>
+										<key>_collapsingFrameDimension</key>
+										<real>0.0</real>
+										<key>_indexOfCollapsedView</key>
+										<integer>0</integer>
+										<key>_percentageOfCollapsedView</key>
+										<real>0.0</real>
+										<key>isCollapsed</key>
+										<string>yes</string>
+										<key>sizes</key>
+										<array>
+											<string>{{0, 0}, {366, 167}}</string>
+											<string>{{0, 176}, {366, 267}}</string>
+										</array>
+									</dict>
+									<key>VerticalSplitView</key>
+									<dict>
+										<key>_collapsingFrameDimension</key>
+										<real>0.0</real>
+										<key>_indexOfCollapsedView</key>
+										<integer>0</integer>
+										<key>_percentageOfCollapsedView</key>
+										<real>0.0</real>
+										<key>isCollapsed</key>
+										<string>yes</string>
+										<key>sizes</key>
+										<array>
+											<string>{{0, 0}, {405, 443}}</string>
+											<string>{{414, 0}, {514, 443}}</string>
+										</array>
+									</dict>
+								</dict>
+							</dict>
+							<key>GeometryConfiguration</key>
+							<dict>
+								<key>Frame</key>
+								<string>{{0, 0}, {689, 214}}</string>
+								<key>RubberWindowFrame</key>
+								<string>113 95 689 256 0 0 1152 746 </string>
+							</dict>
+							<key>Module</key>
+							<string>PBXRunSessionModule</string>
+							<key>Proportion</key>
+							<string>214pt</string>
+						</dict>
+					</array>
+					<key>Proportion</key>
+					<string>214pt</string>
+				</dict>
+			</array>
+			<key>Name</key>
+			<string>Run Log</string>
+			<key>ServiceClasses</key>
+			<array>
+				<string>PBXRunSessionModule</string>
+			</array>
+			<key>StatusbarIsVisible</key>
+			<true/>
+			<key>TableOfContents</key>
+			<array>
+				<string>1C0AD2B3069F1EA900FABCE6</string>
+				<string>E1ABAE770812E78D007C5427</string>
+				<string>1CD0528B0623707200166675</string>
+				<string>E1ABAE780812E78D007C5427</string>
+			</array>
+			<key>ToolbarConfiguration</key>
+			<string>xcode.toolbar.config.run</string>
+			<key>WindowString</key>
+			<string>113 95 689 256 0 0 1152 746 </string>
+			<key>WindowToolGUID</key>
+			<string>1C0AD2B3069F1EA900FABCE6</string>
+			<key>WindowToolIsVisible</key>
+			<false/>
+		</dict>
+		<dict>
+			<key>FirstTimeWindowDisplayed</key>
+			<false/>
+			<key>Identifier</key>
+			<string>windowTool.scm</string>
+			<key>Layout</key>
+			<array>
+				<dict>
+					<key>Dock</key>
+					<array>
+						<dict>
+							<key>ContentConfiguration</key>
+							<dict>
+								<key>PBXProjectModuleGUID</key>
+								<string>1C78EAB2065D492600B07095</string>
+								<key>PBXProjectModuleLabel</key>
+								<string>&lt;No Editor&gt;</string>
+								<key>PBXSplitModuleInNavigatorKey</key>
+								<dict>
+									<key>Split0</key>
+									<dict>
+										<key>PBXProjectModuleGUID</key>
+										<string>1C78EAB3065D492600B07095</string>
+									</dict>
+									<key>SplitCount</key>
+									<string>1</string>
+								</dict>
+								<key>StatusBarVisibility</key>
+								<true/>
+							</dict>
+							<key>GeometryConfiguration</key>
+							<dict>
+								<key>Frame</key>
+								<string>{{0, 0}, {634, 0}}</string>
+								<key>RubberWindowFrame</key>
+								<string>137 363 634 360 0 0 1152 746 </string>
+							</dict>
+							<key>Module</key>
+							<string>PBXNavigatorGroup</string>
+							<key>Proportion</key>
+							<string>0pt</string>
+						</dict>
+						<dict>
+							<key>BecomeActive</key>
+							<true/>
+							<key>ContentConfiguration</key>
+							<dict>
+								<key>PBXProjectModuleGUID</key>
+								<string>1CD052920623707200166675</string>
+								<key>PBXProjectModuleLabel</key>
+								<string>SCM</string>
+							</dict>
+							<key>GeometryConfiguration</key>
+							<dict>
+								<key>ConsoleFrame</key>
+								<string>{{0, 92}, {634, 219}}</string>
+								<key>Frame</key>
+								<string>{{0, 7}, {634, 311}}</string>
+								<key>RubberWindowFrame</key>
+								<string>137 363 634 360 0 0 1152 746 </string>
+								<key>TableConfiguration</key>
+								<array>
+									<string>Status</string>
+									<real>30</real>
+									<string>FileName</string>
+									<real>199</real>
+									<string>Path</string>
+									<real>379.09500122070312</real>
+								</array>
+								<key>TableFrame</key>
+								<string>{{0, 0}, {634, 83}}</string>
+							</dict>
+							<key>Module</key>
+							<string>PBXCVSModule</string>
+							<key>Proportion</key>
+							<string>311pt</string>
+						</dict>
+					</array>
+					<key>Proportion</key>
+					<string>318pt</string>
+				</dict>
+			</array>
+			<key>Name</key>
+			<string>SCM</string>
+			<key>ServiceClasses</key>
+			<array>
+				<string>PBXCVSModule</string>
+			</array>
+			<key>StatusbarIsVisible</key>
+			<true/>
+			<key>TableOfContents</key>
+			<array>
+				<string>E10967CE081216040088089B</string>
+				<string>E10967CF081216040088089B</string>
+				<string>1C78EAB2065D492600B07095</string>
+				<string>1CD052920623707200166675</string>
+			</array>
+			<key>WindowString</key>
+			<string>137 363 634 360 0 0 1152 746 </string>
+			<key>WindowToolGUID</key>
+			<string>E10967CE081216040088089B</string>
+			<key>WindowToolIsVisible</key>
+			<false/>
+		</dict>
+		<dict>
+			<key>Identifier</key>
+			<string>windowTool.breakpoints</string>
+			<key>Layout</key>
+			<array>
+				<dict>
+					<key>Dock</key>
+					<array>
+						<dict>
+							<key>BecomeActive</key>
+							<true/>
+							<key>ContentConfiguration</key>
+							<dict>
+								<key>PBXProjectModuleGUID</key>
+								<string>1CD052930623707200166675</string>
+								<key>PBXProjectModuleLabel</key>
+								<string>Breakpoints</string>
+							</dict>
+							<key>GeometryConfiguration</key>
+							<dict>
+								<key>BreakpointsTreeTableConfiguration</key>
+								<array>
+									<string>enabledColumn</string>
+									<real>16</real>
+									<string>breakpointColumn</string>
+									<real>201.5830078125</real>
+								</array>
+								<key>Frame</key>
+								<string>{{0, 0}, {240, 195}}</string>
+								<key>RubberWindowFrame</key>
+								<string>342 421 240 216 0 0 1440 878 </string>
+							</dict>
+							<key>Module</key>
+							<string>PBXDebugBreakpointsModule</string>
+							<key>Proportion</key>
+							<string>195pt</string>
+						</dict>
+					</array>
+					<key>Proportion</key>
+					<string>195pt</string>
+				</dict>
+			</array>
+			<key>Name</key>
+			<string>Breakpoints</string>
+			<key>ServiceClasses</key>
+			<array>
+				<string>PBXDebugBreakpointsModule</string>
+			</array>
+			<key>StatusbarIsVisible</key>
+			<false/>
+			<key>TableOfContents</key>
+			<array>
+				<string>1C0AD2AD069F1E9B00FABCE6</string>
+				<string>1C0AD2AE069F1E9B00FABCE6</string>
+				<string>1CD052930623707200166675</string>
+			</array>
+			<key>WindowString</key>
+			<string>342 421 240 216 0 0 1440 878 </string>
+			<key>WindowToolGUID</key>
+			<string>1C0AD2AD069F1E9B00FABCE6</string>
+			<key>WindowToolIsVisible</key>
+			<false/>
+		</dict>
+		<dict>
+			<key>Identifier</key>
+			<string>windowTool.bookmarks</string>
+			<key>Layout</key>
+			<array>
+				<dict>
+					<key>Dock</key>
+					<array>
+						<dict>
+							<key>Module</key>
+							<string>PBXBookmarksModule</string>
+							<key>Proportion</key>
+							<string>166pt</string>
+						</dict>
+					</array>
+					<key>Proportion</key>
+					<string>166pt</string>
+				</dict>
+			</array>
+			<key>Name</key>
+			<string>Bookmarks</string>
+			<key>ServiceClasses</key>
+			<array>
+				<string>PBXBookmarksModule</string>
+			</array>
+			<key>StatusbarIsVisible</key>
+			<false/>
+			<key>WindowString</key>
+			<string>538 42 401 187 0 0 1280 1002 </string>
+		</dict>
+		<dict>
+			<key>FirstTimeWindowDisplayed</key>
+			<false/>
+			<key>Identifier</key>
+			<string>windowTool.classBrowser</string>
+			<key>Layout</key>
+			<array>
+				<dict>
+					<key>Dock</key>
+					<array>
+						<dict>
+							<key>BecomeActive</key>
+							<true/>
+							<key>ContentConfiguration</key>
+							<dict>
+								<key>OptionsSetName</key>
+								<string>Hierarchy, all classes</string>
+								<key>PBXProjectModuleGUID</key>
+								<string>1CA6456E063B45B4001379D8</string>
+								<key>PBXProjectModuleLabel</key>
+								<string>Class Browser - NSObject</string>
+							</dict>
+							<key>GeometryConfiguration</key>
+							<dict>
+								<key>ClassesFrame</key>
+								<string>{{0, 0}, {374, 96}}</string>
+								<key>ClassesTreeTableConfiguration</key>
+								<array>
+									<string>PBXClassNameColumnIdentifier</string>
+									<real>208</real>
+									<string>PBXClassBookColumnIdentifier</string>
+									<real>22</real>
+								</array>
+								<key>Frame</key>
+								<string>{{0, 0}, {630, 331}}</string>
+								<key>MembersFrame</key>
+								<string>{{0, 105}, {374, 226}}</string>
+								<key>MembersTreeTableConfiguration</key>
+								<array>
+									<string>PBXMemberTypeIconColumnIdentifier</string>
+									<real>22</real>
+									<string>PBXMemberNameColumnIdentifier</string>
+									<real>216</real>
+									<string>PBXMemberTypeColumnIdentifier</string>
+									<real>97</real>
+									<string>PBXMemberBookColumnIdentifier</string>
+									<real>22</real>
+								</array>
+								<key>PBXModuleWindowStatusBarHidden2</key>
+								<true/>
+								<key>RubberWindowFrame</key>
+								<string>28 367 630 352 0 0 1152 746 </string>
+							</dict>
+							<key>Module</key>
+							<string>PBXClassBrowserModule</string>
+							<key>Proportion</key>
+							<string>331pt</string>
+						</dict>
+					</array>
+					<key>Proportion</key>
+					<string>331pt</string>
+				</dict>
+			</array>
+			<key>Name</key>
+			<string>Class Browser</string>
+			<key>ServiceClasses</key>
+			<array>
+				<string>PBXClassBrowserModule</string>
+			</array>
+			<key>StatusbarIsVisible</key>
+			<false/>
+			<key>TableOfContents</key>
+			<array>
+				<string>1C0AD2AF069F1E9B00FABCE6</string>
+				<string>E120DB6B08141C4700BF8DDC</string>
+				<string>1CA6456E063B45B4001379D8</string>
+			</array>
+			<key>ToolbarConfiguration</key>
+			<string>xcode.toolbar.config.classbrowser</string>
+			<key>WindowString</key>
+			<string>28 367 630 352 0 0 1152 746 </string>
+			<key>WindowToolGUID</key>
+			<string>1C0AD2AF069F1E9B00FABCE6</string>
+			<key>WindowToolIsVisible</key>
+			<false/>
+		</dict>
+	</array>
+</dict>
+</plist>
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEE APE.xcode/nicholas.pbxuser
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEE APE.xcode/nicholas.pbxuser	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEE APE.xcode/nicholas.pbxuser	(revision 170)
@@ -0,0 +1,1434 @@
+// !$*UTF8*$!
+{
+	089C165DFE840E0CC02AAC07 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {735, 464}}";
+			sepNavSelRange = "{217, 0}";
+			sepNavVisRect = "{{0, 0}, {735, 464}}";
+			sepNavWindowFrame = "{{15, 239}, {750, 502}}";
+		};
+	};
+	29B97313FDCFA39411CA2CEA = {
+		activeBuildStyle = 4A9504CDFFE6A4B311CA0CBA;
+		activeExecutable = E1317A3503DF242100050002;
+		activeTarget = E120DB7308141CCB00BF8DDC;
+		addToTargets = (
+		);
+		breakpoints = (
+			E1317A3703DF244600050002,
+			E1317A3803DF24F800050002,
+			E136EAA903E48B0400050002,
+			E18A7D2903ED430100050001,
+			E1BF4A30048739CA00C20906,
+			E12A2C6B054CE75500F98AD9,
+		);
+		codeSenseManager = E12B21590548C9B600CFF4E9;
+		executables = (
+			E1317A3503DF242100050002,
+			E15E6A7404188D6900050002,
+			E136EAA103E42F7500050002,
+			E175F28303E7445700050002,
+			E165AB3C03E7BCDE00050002,
+			E104851C040C1E3900050002,
+			E1ABE98B040D48E700050002,
+			E1ABAEE00812F4B2007C5427,
+		);
+		perUserDictionary = {
+			PBXConfiguration.PBXFileTableDataSource3.PBXBookmarksDataSource = {
+				PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+				PBXFileTableDataSourceColumnSortingKey = PBXBookmarksDataSource_NameID;
+				PBXFileTableDataSourceColumnWidthsKey = (
+					239.2085,
+					223.5991,
+				);
+				PBXFileTableDataSourceColumnsKey = (
+					PBXBookmarksDataSource_LocationID,
+					PBXBookmarksDataSource_NameID,
+				);
+			};
+			PBXConfiguration.PBXFileTableDataSource3.PBXErrorsWarningsDataSource = {
+				PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+				PBXFileTableDataSourceColumnSortingKey = PBXErrorsWarningsDataSource_LocationID;
+				PBXFileTableDataSourceColumnWidthsKey = (
+					20,
+					359.8799,
+					202.2085,
+				);
+				PBXFileTableDataSourceColumnsKey = (
+					PBXErrorsWarningsDataSource_TypeID,
+					PBXErrorsWarningsDataSource_MessageID,
+					PBXErrorsWarningsDataSource_LocationID,
+				);
+			};
+			PBXConfiguration.PBXFileTableDataSource3.PBXExecutablesDataSource = {
+				PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+				PBXFileTableDataSourceColumnSortingKey = PBXExecutablesDataSource_NameID;
+				PBXFileTableDataSourceColumnWidthsKey = (
+					22,
+					440.7974,
+				);
+				PBXFileTableDataSourceColumnsKey = (
+					PBXExecutablesDataSource_ActiveFlagID,
+					PBXExecutablesDataSource_NameID,
+				);
+			};
+			PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = {
+				PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+				PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
+				PBXFileTableDataSourceColumnWidthsKey = (
+					20,
+					248,
+					20,
+					49,
+					43,
+					43,
+					20,
+				);
+				PBXFileTableDataSourceColumnsKey = (
+					PBXFileDataSource_FiletypeID,
+					PBXFileDataSource_Filename_ColumnID,
+					PBXFileDataSource_Built_ColumnID,
+					PBXFileDataSource_ObjectSize_ColumnID,
+					PBXFileDataSource_Errors_ColumnID,
+					PBXFileDataSource_Warnings_ColumnID,
+					PBXFileDataSource_Target_ColumnID,
+				);
+			};
+			PBXConfiguration.PBXFileTableDataSource3.PBXFindDataSource = {
+				PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+				PBXFileTableDataSourceColumnSortingKey = PBXFindDataSource_LocationID;
+				PBXFileTableDataSourceColumnWidthsKey = (
+					291.2974,
+					294.2085,
+				);
+				PBXFileTableDataSourceColumnsKey = (
+					PBXFindDataSource_MessageID,
+					PBXFindDataSource_LocationID,
+				);
+			};
+			PBXConfiguration.PBXFileTableDataSource3.PBXSymbolsDataSource = {
+				PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+				PBXFileTableDataSourceColumnSortingKey = PBXSymbolsDataSource_SymbolNameID;
+				PBXFileTableDataSourceColumnWidthsKey = (
+					16,
+					135.8008,
+					163.0356,
+					140.2085,
+				);
+				PBXFileTableDataSourceColumnsKey = (
+					PBXSymbolsDataSource_SymbolTypeIconID,
+					PBXSymbolsDataSource_SymbolNameID,
+					PBXSymbolsDataSource_SymbolTypeID,
+					PBXSymbolsDataSource_ReferenceNameID,
+				);
+			};
+			PBXConfiguration.PBXFileTableDataSource3.XCSCMDataSource = {
+				PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+				PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
+				PBXFileTableDataSourceColumnWidthsKey = (
+					20,
+					20,
+					232,
+					20,
+					41,
+					43,
+					43,
+					20,
+				);
+				PBXFileTableDataSourceColumnsKey = (
+					PBXFileDataSource_SCM_ColumnID,
+					PBXFileDataSource_FiletypeID,
+					PBXFileDataSource_Filename_ColumnID,
+					PBXFileDataSource_Built_ColumnID,
+					PBXFileDataSource_ObjectSize_ColumnID,
+					PBXFileDataSource_Errors_ColumnID,
+					PBXFileDataSource_Warnings_ColumnID,
+					PBXFileDataSource_Target_ColumnID,
+				);
+			};
+			PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = {
+				PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+				PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
+				PBXFileTableDataSourceColumnWidthsKey = (
+					20,
+					215,
+					51,
+					20,
+					51,
+					43,
+					43,
+				);
+				PBXFileTableDataSourceColumnsKey = (
+					PBXFileDataSource_FiletypeID,
+					PBXFileDataSource_Filename_ColumnID,
+					PBXTargetDataSource_PrimaryAttribute,
+					PBXFileDataSource_Built_ColumnID,
+					PBXFileDataSource_ObjectSize_ColumnID,
+					PBXFileDataSource_Errors_ColumnID,
+					PBXFileDataSource_Warnings_ColumnID,
+				);
+			};
+			PBXPerProjectTemplateStateSaveDate = 135551345;
+			PBXPrepackagedSmartGroups_v2 = (
+				{
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					activationKey = OldTargetSmartGroup;
+					clz = PBXTargetSmartGroup;
+					description = "Displays all targets of the project.";
+					globalID = 1C37FABC04509CD000000102;
+					name = Targets;
+					preferences = {
+						image = Targets;
+					};
+				},
+				{
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					clz = PBXTargetSmartGroup2;
+					description = "Displays all targets of the project as well as nested build phases.";
+					globalID = 1C37FBAC04509CD000000102;
+					name = Targets;
+					preferences = {
+						image = Targets;
+					};
+				},
+				{
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					clz = PBXExecutablesSmartGroup;
+					description = "Displays all executables of the project.";
+					globalID = 1C37FAAC04509CD000000102;
+					name = Executables;
+					preferences = {
+						image = Executable;
+					};
+				},
+				{
+					" PBXTransientLocationAtTop " = bottom;
+					absolutePathToBundle = "";
+					clz = PBXErrorsWarningsSmartGroup;
+					description = "Displays files with errors or warnings.";
+					globalID = 1C08E77C0454961000C914BD;
+					name = "Errors and Warnings";
+					preferences = {
+						fnmatch = "";
+						image = WarningsErrors;
+						recursive = 1;
+						regex = "";
+						root = "<PROJECT>";
+					};
+				},
+				{
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					clz = PBXFilenameSmartGroup;
+					description = "Filters items in a given group (potentially recursively) based on matching the name with the regular expression of the filter.";
+					globalID = 1CC0EA4004350EF90044410B;
+					name = "Implementation Files";
+					preferences = {
+						canSave = 1;
+						fnmatch = "";
+						image = SmartFolder;
+						isLeaf = 0;
+						recursive = 1;
+						regex = "?*\\.[mcMC]";
+						root = "<PROJECT>";
+					};
+				},
+				{
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					clz = PBXFilenameSmartGroup;
+					description = "This group displays Interface Builder NIB Files.";
+					globalID = 1CC0EA4004350EF90041110B;
+					name = "NIB Files";
+					preferences = {
+						canSave = 1;
+						fnmatch = "*.nib";
+						image = SmartFolder;
+						isLeaf = 0;
+						recursive = 1;
+						regex = "";
+						root = "<PROJECT>";
+					};
+				},
+				{
+					PBXTransientLocationAtTop = no;
+					absolutePathToBundle = "";
+					clz = PBXFindSmartGroup;
+					description = "Displays Find Results.";
+					globalID = 1C37FABC05509CD000000102;
+					name = "Find Results";
+					preferences = {
+						image = spyglass;
+					};
+				},
+				{
+					PBXTransientLocationAtTop = no;
+					absolutePathToBundle = "";
+					clz = PBXBookmarksSmartGroup;
+					description = "Displays Project Bookmarks.";
+					globalID = 1C37FABC05539CD112110102;
+					name = Bookmarks;
+					preferences = {
+						image = Bookmarks;
+					};
+				},
+				{
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					clz = XCSCMSmartGroup;
+					description = "Displays files with interesting SCM status.";
+					globalID = E2644B35053B69B200211256;
+					name = SCM;
+					preferences = {
+						image = PBXRepository;
+						isLeaf = 0;
+					};
+				},
+				{
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					clz = PBXSymbolsSmartGroup;
+					description = "Displays all symbols for the project.";
+					globalID = 1C37FABC04509CD000100104;
+					name = "Project Symbols";
+					preferences = {
+						image = ProjectSymbols;
+						isLeaf = 1;
+					};
+				},
+				{
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					clz = PBXFilenameSmartGroup;
+					description = "Filters items in a given group (potentially recursively) based on matching the name with the regular expression of the filter.";
+					globalID = PBXTemplateMarker;
+					name = "Simple Filter SmartGroup";
+					preferences = {
+						canSave = 1;
+						fnmatch = "*.nib";
+						image = SmartFolder;
+						isLeaf = 0;
+						recursive = 1;
+						regex = "";
+						root = "<PROJECT>";
+					};
+				},
+				{
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					clz = PBXFilenameSmartGroup;
+					description = "Filters items in a given group (potentially recursively) based on matching the name with the regular expression of the filter.";
+					globalID = PBXTemplateMarker;
+					name = "Simple Regular Expression SmartGroup";
+					preferences = {
+						canSave = 1;
+						fnmatch = "";
+						image = SmartFolder;
+						isLeaf = 0;
+						recursive = 1;
+						regex = "?*\\.[mcMC]";
+						root = "<PROJECT>";
+					};
+				},
+				{
+					PBXTransientLocationAtTop = bottom;
+					clz = XDDesignSmartGroup;
+					description = "Displays Xdesign models";
+					globalID = 2E4A936305E6979E00701470;
+					name = Design;
+					preferences = {
+						image = Design;
+						isLeaf = 0;
+					};
+				},
+			);
+			PBXWorkspaceContents = (
+				{
+					PBXProjectWorkspaceModule_StateKey_Rev39 = {
+						PBXProjectWorkspaceModule_DEGV_Geometry = {
+							_collapsingFrameDimension = 0;
+							_indexOfCollapsedView = 0;
+							_percentageOfCollapsedView = 0;
+							isCollapsed = yes;
+							sizes = (
+								"{{0, 0}, {609, 194}}",
+								"{{0, 194}, {609, 493}}",
+							);
+						};
+						PBXProjectWorkspaceModule_DataSourceSelectionKey_Rev6 = {
+							BoundsStr = "{{0, 0}, {594, 177}}";
+							Rows = (
+								2,
+							);
+							VisibleRectStr = "{{0, 0}, {594, 177}}";
+						};
+						PBXProjectWorkspaceModule_EditorOpen = true;
+						PBXProjectWorkspaceModule_EmbeddedNavigatorGroup = {
+							PBXSplitModuleInNavigatorKey = {
+								Split0 = {
+									bookmark = E14C188B05A4B0F3000D4AF3;
+									history = (
+										E1B358280566164500F508D5,
+										E1B358290566164500F508D5,
+										E14C188805A4B0F3000D4AF3,
+										E14C188905A4B0F3000D4AF3,
+									);
+									prevStack = (
+										E1B3582B0566164500F508D5,
+										E1B3582C0566164500F508D5,
+										E14C188A05A4B0F3000D4AF3,
+									);
+								};
+								SplitCount = 1;
+							};
+						};
+						PBXProjectWorkspaceModule_GeometryKey_Rev15 = {
+							PBXProjectWorkspaceModule_SGTM_Geometry = {
+								_collapsingFrameDimension = 0;
+								_indexOfCollapsedView = 0;
+								_percentageOfCollapsedView = 0;
+								sizes = (
+									"{{0, 0}, {191, 687}}",
+									"{{191, 0}, {609, 687}}",
+								);
+							};
+						};
+						PBXProjectWorkspaceModule_OldDetailFrame = "{{0, 0}, {609, 194}}";
+						PBXProjectWorkspaceModule_OldEditorFrame = "{{0, 194}, {609, 493}}";
+						PBXProjectWorkspaceModule_OldSuperviewFrame = "{{191, 0}, {609, 687}}";
+						PBXProjectWorkspaceModule_SGTM = {
+							PBXBottomSmartGroupGIDs = (
+								1C37FBAC04509CD000000102,
+								1C37FAAC04509CD000000102,
+								1C08E77C0454961000C914BD,
+								1CC0EA4004350EF90044410B,
+								1CC0EA4004350EF90041110B,
+								1C37FABC05509CD000000102,
+								1C37FABC05539CD112110102,
+								E2644B35053B69B200211256,
+								1C37FABC04509CD000100104,
+							);
+							PBXSmartGroupTreeModuleColumnData = {
+								PBXSmartGroupTreeModuleColumnWidthsKey = (
+									174,
+								);
+								PBXSmartGroupTreeModuleColumnsKey_v4 = (
+									MainColumn,
+								);
+							};
+							PBXSmartGroupTreeModuleOutlineStateKey_v7 = {
+								PBXSmartGroupTreeModuleOutlineStateExpansionKey = (
+									29B97314FDCFA39411CA2CEA,
+									1C08E77C0454961000C914BD,
+									1C37FABC05509CD000000102,
+								);
+								PBXSmartGroupTreeModuleOutlineStateSelectionKey = (
+									(
+										8,
+										0,
+									),
+								);
+								PBXSmartGroupTreeModuleOutlineStateVisibleRectKey = "{{0, 0}, {174, 669}}";
+							};
+							PBXTopSmartGroupGIDs = (
+							);
+						};
+					};
+				},
+			);
+			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXBatchFindModule" = {
+			};
+			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXBuildResultsModule" = {
+			};
+			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXCVSModule" = {
+			};
+			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXClassBrowserModule" = {
+				OptionsSetName = "Hierarchy, all classes";
+			};
+			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXDebugCLIModule" = {
+			};
+			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXDebugSessionModule" = {
+				Debugger = {
+					HorizontalSplitView = {
+						_collapsingFrameDimension = 0;
+						_indexOfCollapsedView = 0;
+						_percentageOfCollapsedView = 0;
+						isCollapsed = yes;
+						sizes = (
+							"{{0, 0}, {295, 303}}",
+							"{{295, 0}, {482, 303}}",
+						);
+					};
+					VerticalSplitView = {
+						_collapsingFrameDimension = 0;
+						_indexOfCollapsedView = 0;
+						_percentageOfCollapsedView = 0;
+						isCollapsed = yes;
+						sizes = (
+							"{{0, 0}, {777, 303}}",
+							"{{0, 303}, {777, 308}}",
+						);
+					};
+				};
+				LauncherConfigVersion = 8;
+			};
+			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXNavigatorGroup" = {
+				PBXSplitModuleInNavigatorKey = {
+					SplitCount = 1;
+				};
+			};
+			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXProjectFindModule" = {
+			};
+			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXProjectWorkspaceModule" = {
+				PBXProjectWorkspaceModule_StateKey_Rev39 = {
+					PBXProjectWorkspaceModule_DEGV_Geometry = {
+						_collapsingFrameDimension = 0;
+						_indexOfCollapsedView = 0;
+						_percentageOfCollapsedView = 0;
+						isCollapsed = yes;
+						sizes = (
+							"{{0, 0}, {609, 179}}",
+							"{{0, 179}, {609, 508}}",
+						);
+					};
+					PBXProjectWorkspaceModule_DataSourceSelectionKey_Rev6 = {
+						BoundsStr = "{{0, 0}, {594, 162}}";
+						Rows = (
+							0,
+						);
+						VisibleRectStr = "{{0, 0}, {594, 162}}";
+					};
+					PBXProjectWorkspaceModule_EditorOpen = true;
+					PBXProjectWorkspaceModule_EmbeddedNavigatorGroup = {
+						PBXSplitModuleInNavigatorKey = {
+							Split0 = {
+								bookmark = E1B358240566150E00F508D5;
+								history = (
+									E1B358230566150E00F508D5,
+								);
+							};
+							SplitCount = 1;
+						};
+					};
+					PBXProjectWorkspaceModule_GeometryKey_Rev15 = {
+						PBXProjectWorkspaceModule_SGTM_Geometry = {
+							_collapsingFrameDimension = 0;
+							_indexOfCollapsedView = 0;
+							_percentageOfCollapsedView = 0;
+							sizes = (
+								"{{0, 0}, {191, 687}}",
+								"{{191, 0}, {609, 687}}",
+							);
+						};
+					};
+					PBXProjectWorkspaceModule_OldDetailFrame = "{{0, 0}, {609, 179}}";
+					PBXProjectWorkspaceModule_OldEditorFrame = "{{0, 179}, {609, 508}}";
+					PBXProjectWorkspaceModule_OldSuperviewFrame = "{{191, 0}, {609, 687}}";
+					PBXProjectWorkspaceModule_SGTM = {
+						PBXBottomSmartGroupGIDs = (
+							1C37FBAC04509CD000000102,
+							1C37FAAC04509CD000000102,
+							1C08E77C0454961000C914BD,
+							1CC0EA4004350EF90044410B,
+							1CC0EA4004350EF90041110B,
+							1C37FABC05509CD000000102,
+							1C37FABC05539CD112110102,
+							E2644B35053B69B200211256,
+							1C37FABC04509CD000100104,
+						);
+						PBXSmartGroupTreeModuleColumnData = {
+							PBXSmartGroupTreeModuleColumnWidthsKey = (
+								174,
+							);
+							PBXSmartGroupTreeModuleColumnsKey_v4 = (
+								MainColumn,
+							);
+						};
+						PBXSmartGroupTreeModuleOutlineStateKey_v7 = {
+							PBXSmartGroupTreeModuleOutlineStateExpansionKey = (
+								29B97314FDCFA39411CA2CEA,
+								1C08E77C0454961000C914BD,
+							);
+							PBXSmartGroupTreeModuleOutlineStateSelectionKey = (
+								(
+									15,
+									13,
+								),
+							);
+							PBXSmartGroupTreeModuleOutlineStateVisibleRectKey = "{{0, 0}, {174, 669}}";
+						};
+						PBXTopSmartGroupGIDs = (
+						);
+					};
+				};
+			};
+			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXRunSessionModule" = {
+			};
+			PBXWorkspaceGeometries = (
+				{
+					Frame = "{{0, 0}, {800, 687}}";
+					PBXProjectWorkspaceModule_GeometryKey_Rev15 = {
+					};
+					RubberWindowFrame = "17 96 800 729 0 0 1280 832 ";
+				},
+			);
+			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXBatchFindModule" = {
+				Frame = "{{0, 0}, {543, 158}}";
+				WindowFrame = "{{178, 645}, {543, 158}}";
+			};
+			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXBuildResultsModule" = {
+				Frame = "{{0, 0}, {609, 344}}";
+				PBXModuleWindowStatusBarHidden = YES;
+				RubberWindowFrame = "671 253 609 365 0 0 1280 832 ";
+			};
+			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXCVSModule" = {
+				Frame = "{{0, 0}, {482, 296}}";
+				WindowFrame = "{{390, 300}, {482, 318}}";
+			};
+			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXClassBrowserModule" = {
+				ClassesFrame = "{{0, 0}, {408, 92}}";
+				ClassesTreeTableConfiguration = (
+					PBXClassNameColumnIdentifier,
+					208,
+					PBXClassBookColumnIdentifier,
+					22,
+				);
+				Frame = "{{0, 0}, {655, 496}}";
+				MembersFrame = "{{0, 92}, {408, 384}}";
+				MembersTreeTableConfiguration = (
+					PBXMemberTypeIconColumnIdentifier,
+					22,
+					PBXMemberNameColumnIdentifier,
+					216,
+					PBXMemberTypeColumnIdentifier,
+					133,
+					PBXMemberBookColumnIdentifier,
+					22,
+				);
+				WindowFrame = "{{312, 248}, {655, 574}}";
+			};
+			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXDebugCLIModule" = {
+				Frame = "{{0, 0}, {400, 201}}";
+				PBXModuleWindowStatusBarHidden = YES;
+				RubberWindowFrame = "50 804 400 222 0 0 1280 832 ";
+			};
+			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXDebugSessionModule" = {
+				DebugConsoleDrawerSize = "{731, 105}";
+				DebugConsoleVisible = Drawer;
+				DebugConsoleWindowFrame = "{{200, 200}, {500, 300}}";
+				DebugSTDIOWindowFrame = "{{200, 200}, {500, 300}}";
+				Frame = "{{0, 0}, {777, 611}}";
+				PBXModuleWindowStatusBarHidden = YES;
+				WindowFrame = "{{266, 153}, {777, 679}}";
+			};
+			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXNavigatorGroup" = {
+				Frame = "{{0, 0}, {750, 481}}";
+				PBXModuleWindowStatusBarHidden = YES;
+				WindowFrame = "{{109, 241}, {750, 502}}";
+			};
+			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXProjectFindModule" = {
+				Frame = "{{0, 0}, {544, 378}}";
+				WindowFrame = "{{641, 297}, {544, 420}}";
+			};
+			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXProjectWorkspaceModule" = {
+				Frame = "{{0, 0}, {800, 687}}";
+				PBXProjectWorkspaceModule_GeometryKey_Rev15 = {
+				};
+				WindowFrame = "{{17, 64}, {800, 761}}";
+			};
+			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXRunSessionModule" = {
+				Frame = "{{0, 0}, {756, 330}}";
+				WindowFrame = "{{524, 473}, {756, 352}}";
+			};
+			PBXWorkspaceStateSaveDate = 135551345;
+		};
+		sourceControlManager = E12B21580548C9B600CFF4E9;
+		userBookmarkGroup = E182C8ED03DE6ED300050002;
+		userBuildSettings = {
+		};
+	};
+	E104851C040C1E3900050002 = {
+		activeArgIndex = 0;
+		activeArgIndices = (
+			YES,
+		);
+		argumentStrings = (
+			"-AppleLanguages '(ja, en)'",
+		);
+		configStateDict = {
+			"PBXLSLaunchAction-0" = {
+				PBXLSLaunchAction = 0;
+				PBXLSLaunchStartAction = 1;
+				PBXLSLaunchStdioStyle = 1;
+				PBXLSLaunchStyle = 0;
+				class = PBXLSRunLaunchConfig;
+				identifier = com.apple.ProjectBuilder.launch.runConfig;
+				remoteHostInfo = "";
+				startActionInfo = "";
+			};
+		};
+		cppStopOnCatchEnabled = 0;
+		cppStopOnThrowEnabled = 0;
+		customDataFormattersEnabled = 1;
+		debuggerPlugin = GDBDebugging;
+		disassemblyDisplayState = 0;
+		dylibVariantSuffix = "";
+		enableDebugStr = 1;
+		environmentEntries = (
+		);
+		isa = PBXExecutable;
+		launchableReference = E104851D040C1E3900050002;
+		libgmallocEnabled = 0;
+		name = "テキストエディット";
+		shlibInfoDictList = (
+		);
+		sourceDirectories = (
+		);
+	};
+	E104851D040C1E3900050002 = {
+		isa = PBXFileReference;
+		lastKnownFileType = wrapper.application;
+		name = TextEdit.app;
+		path = /Applications/TextEdit.app;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E11854F703F2709E00050002 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {571, 4213}}";
+			sepNavSelRange = "{768, 0}";
+			sepNavVisRect = "{{0, 718}, {571, 566}}";
+		};
+	};
+	E120DB7308141CCB00BF8DDC = {
+		activeExec = 0;
+	};
+	E12A2C6B054CE75500F98AD9 = {
+		fileReference = F9A6987103BE1DFF00AA4DA5;
+		isa = PBXFileBreakpoint;
+		lineNumber = 34;
+		state = 1;
+	};
+	E12B21580548C9B600CFF4E9 = {
+		fallbackIsa = XCSourceControlManager;
+		isSCMEnabled = 1;
+		isa = PBXSourceControlManager;
+		scmConfiguration = {
+		};
+		scmType = scm.subversion;
+	};
+	E12B21590548C9B600CFF4E9 = {
+		indexTemplatePath = "";
+		isa = PBXCodeSenseManager;
+		usesDefaults = 0;
+		wantsCodeCompletion = 1;
+		wantsCodeCompletionAutoSuggestions = 0;
+		wantsCodeCompletionCaseSensitivity = 1;
+		wantsCodeCompletionListAlways = 0;
+		wantsCodeCompletionOnlyMatchingItems = 1;
+		wantsCodeCompletionParametersIncluded = 1;
+		wantsCodeCompletionPlaceholdersInserted = 1;
+		wantsCodeCompletionTabCompletes = 1;
+		wantsIndex = 1;
+	};
+	E12FEC3D04959F5A00AEFBF9 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {609, 4802}}";
+			sepNavSelRange = "{9956, 0}";
+			sepNavVisRect = "{{0, 3518}, {609, 566}}";
+			sepNavWindowFrame = "{{61, 283}, {750, 502}}";
+		};
+	};
+	E12FEC3E04959F5A00AEFBF9 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {709, 443}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {709, 443}}";
+		};
+	};
+	E12FEC3F04959F5A00AEFBF9 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {585, 566}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {585, 566}}";
+		};
+	};
+	E12FEC4104959F5A00AEFBF9 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {585, 566}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {585, 566}}";
+		};
+	};
+	E12FEC4204959F5A00AEFBF9 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {585, 566}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {585, 566}}";
+		};
+	};
+	E12FEC4304959F5A00AEFBF9 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {585, 566}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {585, 566}}";
+		};
+	};
+	E12FEC4504959F5A00AEFBF9 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {585, 1988}}";
+			sepNavSelRange = "{596, 4}";
+			sepNavVisRect = "{{0, 4}, {585, 566}}";
+		};
+	};
+	E1317A3503DF242100050002 = {
+		activeArgIndex = 0;
+		activeArgIndices = (
+			YES,
+		);
+		argumentStrings = (
+			"\"/Library/PreferencePanes/APE Manager.prefPane\"",
+		);
+		configStateDict = {
+			"PBXLSLaunchAction-1" = {
+				PBXLSLaunchAction = 1;
+				PBXLSLaunchStartAction = 1;
+				PBXLSLaunchStdioStyle = 2;
+				PBXLSLaunchStyle = 0;
+				class = PBXGDB_LaunchConfig;
+				identifier = com.apple.ProjectBuilder.launch.GDBMI_Config;
+				remoteHostInfo = "";
+				startActionInfo = "";
+			};
+		};
+		cppStopOnCatchEnabled = 0;
+		cppStopOnThrowEnabled = 0;
+		customDataFormattersEnabled = 1;
+		debuggerPlugin = GDBDebugging;
+		disassemblyDisplayState = 0;
+		dylibVariantSuffix = "";
+		enableDebugStr = 1;
+		environmentEntries = (
+			{
+				active = YES;
+				name = NSZombieEnabled;
+				value = YES;
+			},
+		);
+		isa = PBXExecutable;
+		launchableReference = E1317A3603DF242100050002;
+		libgmallocEnabled = 0;
+		name = "System Preferences";
+		shlibInfoDictList = (
+		);
+		sourceDirectories = (
+		);
+	};
+	E1317A3603DF242100050002 = {
+		isa = PBXFileReference;
+		lastKnownFileType = wrapper.application;
+		name = "System Preferences.app";
+		path = "/Applications/System Preferences.app";
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1317A3703DF244600050002 = {
+		isa = PBXSymbolicBreakpoint;
+		state = 2;
+		symbolName = "-[NSException raise]";
+	};
+	E1317A3803DF24F800050002 = {
+		isa = PBXSymbolicBreakpoint;
+		state = 2;
+		symbolName = _NSAutoreleaseNoPool;
+	};
+	E1317B2F03DFC4DE00050002 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {621, 5687}}";
+			sepNavSelRange = "{12497, 0}";
+			sepNavVisRect = "{{0, 4344}, {621, 155}}";
+			sepNavWindowFrame = "{{84, 262}, {750, 502}}";
+		};
+	};
+	E1317B3203DFC56300050002 = {
+		fRef = E1317B2E03DFC4DE00050002;
+		isa = PBXTextBookmark;
+		name = "ICeCoffEETerminal.h: 11";
+		rLen = 0;
+		rLoc = 183;
+		rType = 0;
+		vrLen = 469;
+		vrLoc = 0;
+	};
+	E135625E03DC9FC200050002 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {532, 695}}";
+			sepNavSelRange = "{283, 0}";
+			sepNavVisRect = "{{0, 144}, {532, 551}}";
+			sepNavWindowFrame = "{{174, 96}, {547, 589}}";
+		};
+	};
+	E136EA9603E3A1AD00050002 = {
+		fRef = E1317B2F03DFC4DE00050002;
+		isa = PBXTextBookmark;
+		name = "ICeCoffEETerminal.m: 98";
+		rLen = 0;
+		rLoc = 6776;
+		rType = 0;
+		vrLen = 763;
+		vrLoc = 2916;
+	};
+	E136EAA003E3A98600050002 = {
+		fRef = E1317B2F03DFC4DE00050002;
+		isa = PBXTextBookmark;
+		name = "ICeCoffEETerminal.m: 16";
+		rLen = 0;
+		rLoc = 337;
+		rType = 0;
+		vrLen = 855;
+		vrLoc = 217;
+	};
+	E136EAA103E42F7500050002 = {
+		activeArgIndex = 2147483647;
+		activeArgIndices = (
+		);
+		argumentStrings = (
+		);
+		configStateDict = {
+		};
+		cppStopOnCatchEnabled = 0;
+		cppStopOnThrowEnabled = 0;
+		customDataFormattersEnabled = 1;
+		debuggerPlugin = GDBDebugging;
+		disassemblyDisplayState = 0;
+		dylibVariantSuffix = "";
+		enableDebugStr = 1;
+		environmentEntries = (
+			{
+				active = YES;
+				name = NSZombieEnabled;
+				value = YES;
+			},
+		);
+		isa = PBXExecutable;
+		launchableReference = E136EAA203E42F7500050002;
+		libgmallocEnabled = 0;
+		name = Terminal;
+		shlibInfoDictList = (
+		);
+		sourceDirectories = (
+		);
+	};
+	E136EAA203E42F7500050002 = {
+		isa = PBXFileReference;
+		lastKnownFileType = wrapper.application;
+		name = Terminal.app;
+		path = /Applications/Utilities/Terminal.app;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E136EAA303E436C500050002 = {
+		fRef = E1317B2F03DFC4DE00050002;
+		isa = PBXTextBookmark;
+		name = "ICeCoffEETerminal.m: mouseUp:";
+		rLen = 0;
+		rLoc = 14194;
+		rType = 0;
+		vrLen = 25;
+		vrLoc = 15494;
+	};
+	E136EAA903E48B0400050002 = {
+		fileReference = E1317B2F03DFC4DE00050002;
+		isa = PBXFileBreakpoint;
+		lineNumber = 307;
+		state = 1;
+	};
+	E13762D203EC636D00050002 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {585, 3219}}";
+			sepNavSelRange = "{6772, 4}";
+			sepNavVisRect = "{{0, 2328}, {585, 566}}";
+		};
+	};
+	E140C475040BB997009FF178 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {735, 6863}}";
+			sepNavSelRange = "{5146, 0}";
+			sepNavVisRect = "{{0, 2980}, {735, 464}}";
+			sepNavWindowFrame = "{{345, 57}, {750, 502}}";
+		};
+	};
+	E14343B303DB4CF200050002 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {733, 825}}";
+			sepNavSelRange = "{1980, 0}";
+			sepNavVisRect = "{{0, 382}, {733, 443}}";
+			sepNavWindowFrame = "{{38, 304}, {750, 502}}";
+		};
+	};
+	E14343B403DB4CF200050002 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {609, 8553}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 988}, {609, 566}}";
+			sepNavWindowFrame = "{{287, 136}, {799, 632}}";
+		};
+	};
+	E14343CE03DB66E900050002 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {571, 566}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {571, 566}}";
+		};
+	};
+	E14994BA03DE8A4D00050002 = {
+		fRef = F9A6987103BE1DFF00AA4DA5;
+		isa = PBXTextBookmark;
+		name = "ICeCoffEEController.m: textBlinkCount:";
+		rLen = 52;
+		rLoc = 4210;
+		rType = 0;
+		vrLen = 1360;
+		vrLoc = 2804;
+	};
+	E15E6A7404188D6900050002 = {
+		activeArgIndex = 0;
+		activeArgIndices = (
+			YES,
+		);
+		argumentStrings = (
+			"-AppleLanguages '(ja, en)'",
+		);
+		configStateDict = {
+		};
+		cppStopOnCatchEnabled = 0;
+		cppStopOnThrowEnabled = 0;
+		customDataFormattersEnabled = 1;
+		debuggerPlugin = GDBDebugging;
+		disassemblyDisplayState = 0;
+		dylibVariantSuffix = "";
+		enableDebugStr = 1;
+		environmentEntries = (
+		);
+		isa = PBXExecutable;
+		launchableReference = E15E6A7504188D6900050002;
+		libgmallocEnabled = 0;
+		name = "システム環境設定";
+		shlibInfoDictList = (
+		);
+		sourceDirectories = (
+		);
+	};
+	E15E6A7504188D6900050002 = {
+		isa = PBXFileReference;
+		lastKnownFileType = wrapper.application;
+		name = "System Preferences.app";
+		path = "/Applications/System Preferences.app";
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E165AB3603E7A7FC00050002 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {609, 4759}}";
+			sepNavSelRange = "{9051, 0}";
+			sepNavVisRect = "{{0, 56}, {609, 566}}";
+			sepNavWindowFrame = "{{38, 304}, {750, 502}}";
+		};
+	};
+	E165AB3B03E7B35000050002 = {
+		fRef = E165AB3603E7A7FC00050002;
+		isa = PBXTextBookmark;
+		name = "ICeCoffEEAppMenu.c: 44";
+		rLen = 0;
+		rLoc = 9051;
+		rType = 0;
+		vrLen = 1734;
+		vrLoc = 47;
+	};
+	E165AB3C03E7BCDE00050002 = {
+		activeArgIndex = 2147483647;
+		activeArgIndices = (
+		);
+		argumentStrings = (
+		);
+		configStateDict = {
+		};
+		cppStopOnCatchEnabled = 0;
+		cppStopOnThrowEnabled = 0;
+		customDataFormattersEnabled = 1;
+		debuggerPlugin = GDBDebugging;
+		disassemblyDisplayState = 0;
+		dylibVariantSuffix = "";
+		enableDebugStr = 1;
+		environmentEntries = (
+		);
+		isa = PBXExecutable;
+		launchableReference = E165AB3D03E7BCDE00050002;
+		libgmallocEnabled = 0;
+		name = TextEdit;
+		shlibInfoDictList = (
+		);
+		sourceDirectories = (
+		);
+	};
+	E165AB3D03E7BCDE00050002 = {
+		isa = PBXFileReference;
+		lastKnownFileType = wrapper.application;
+		name = TextEdit.app;
+		path = /Applications/TextEdit.app;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E169DBA103E4EF5E00050002 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {609, 2897}}";
+			sepNavSelRange = "{1292, 56}";
+			sepNavVisRect = "{{0, 0}, {609, 566}}";
+		};
+	};
+	E169DBA603E4F62F00050002 = {
+		fRef = E169DBA103E4EF5E00050002;
+		isa = PBXTextBookmark;
+		name = "ICeCoffEETextEdit.c: MyTEClick";
+		rLen = 56;
+		rLoc = 1292;
+		rType = 0;
+		vrLen = 1606;
+		vrLoc = 0;
+	};
+	E169DBA703E4F6A400050002 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {733, 792}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {733, 443}}";
+			sepNavWindowFrame = "{{84, 262}, {750, 502}}";
+		};
+	};
+	E175F28303E7445700050002 = {
+		activeArgIndex = 2147483647;
+		activeArgIndices = (
+		);
+		argumentStrings = (
+		);
+		configStateDict = {
+		};
+		cppStopOnCatchEnabled = 0;
+		cppStopOnThrowEnabled = 0;
+		customDataFormattersEnabled = 1;
+		debuggerPlugin = GDBDebugging;
+		disassemblyDisplayState = 0;
+		dylibVariantSuffix = "";
+		enableDebugStr = 1;
+		environmentEntries = (
+		);
+		isa = PBXExecutable;
+		launchableReference = E175F28403E7445700050002;
+		libgmallocEnabled = 0;
+		name = SimpleText;
+		shlibInfoDictList = (
+		);
+		sourceDirectories = (
+		);
+	};
+	E175F28403E7445700050002 = {
+		isa = PBXFileReference;
+		lastKnownFileType = file;
+		name = SimpleText.app;
+		path = /Developer/Applications/Extras/SimpleText.app;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E182C8ED03DE6ED300050002 = {
+		children = (
+			E182C8F403DE7F3200050002,
+			E14994BA03DE8A4D00050002,
+			E1317B3203DFC56300050002,
+			E136EA9603E3A1AD00050002,
+			E136EAA003E3A98600050002,
+			E136EAA303E436C500050002,
+			E169DBA603E4F62F00050002,
+			E165AB3B03E7B35000050002,
+		);
+		isa = PBXBookmarkGroup;
+		name = Root;
+	};
+	E182C8F403DE7F3200050002 = {
+		fRef = E14343B403DB4CF200050002;
+		isa = PBXTextBookmark;
+		name = "ICeCoffEE.m: __VERSION__";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 1997;
+		vrLoc = 1921;
+	};
+	E182C8F603DE817F00050002 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {764, 516}}";
+			sepNavSelRange = "{322, 18}";
+			sepNavVisRect = "{{0, 108}, {764, 99}}";
+			sepNavWindowFrame = "{{176, 92}, {750, 502}}";
+		};
+	};
+	E18A7D2903ED430100050001 = {
+		fileReference = E14343B403DB4CF200050002;
+		isa = PBXFileBreakpoint;
+		lineNumber = 153;
+		state = 1;
+	};
+	E19EB4FA03DD35A700050002 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {609, 2337}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {609, 566}}";
+		};
+	};
+	E19EB4FB03DD35A700050002 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {735, 671}}";
+			sepNavSelRange = "{1677, 0}";
+			sepNavVisRect = "{{0, 207}, {735, 464}}";
+			sepNavWindowFrame = "{{130, 134}, {750, 502}}";
+		};
+	};
+	E19EB4FC03DD35A700050002 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {609, 566}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {609, 566}}";
+		};
+	};
+	E1ABAE8D0812F4B2007C5427 = {
+		activeExec = 0;
+	};
+	E1ABAEB80812F4B2007C5427 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {735, 464}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {735, 464}}";
+			sepNavWindowFrame = "{{130, 134}, {750, 502}}";
+		};
+	};
+	E1ABAEBA0812F4B2007C5427 = {
+		activeExec = 0;
+	};
+	E1ABAED60812F4B2007C5427 = {
+		activeExec = 0;
+		executables = (
+			E1ABAEE00812F4B2007C5427,
+		);
+	};
+	E1ABAEE00812F4B2007C5427 = {
+		activeArgIndex = 2147483647;
+		activeArgIndices = (
+		);
+		argumentStrings = (
+		);
+		configStateDict = {
+		};
+		cppStopOnCatchEnabled = 0;
+		cppStopOnThrowEnabled = 0;
+		customDataFormattersEnabled = 1;
+		debuggerPlugin = GDBDebugging;
+		disassemblyDisplayState = 0;
+		enableDebugStr = 1;
+		environmentEntries = (
+		);
+		isa = PBXExecutable;
+		libgmallocEnabled = 0;
+		name = ICFindFilesToRemove;
+		shlibInfoDictList = (
+		);
+		sourceDirectories = (
+		);
+	};
+	E1ABE98B040D48E700050002 = {
+		activeArgIndex = 2147483647;
+		activeArgIndices = (
+		);
+		argumentStrings = (
+		);
+		configStateDict = {
+		};
+		cppStopOnCatchEnabled = 0;
+		cppStopOnThrowEnabled = 0;
+		customDataFormattersEnabled = 1;
+		debuggerPlugin = GDBDebugging;
+		disassemblyDisplayState = 0;
+		dylibVariantSuffix = "";
+		enableDebugStr = 1;
+		environmentEntries = (
+		);
+		isa = PBXExecutable;
+		launchableReference = E1BF674C054C7F9300C390BC;
+		libgmallocEnabled = 0;
+		name = Safari;
+		shlibInfoDictList = (
+		);
+		sourceDirectories = (
+		);
+	};
+	E1BB269003DB74B700050002 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {585, 566}}";
+			sepNavSelRange = "{269, 0}";
+			sepNavVisRect = "{{0, 0}, {585, 566}}";
+			sepNavWindowFrame = "{{213, 261}, {750, 502}}";
+		};
+	};
+	E1BB269403DB74C200050002 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {585, 566}}";
+			sepNavSelRange = "{317, 0}";
+			sepNavVisRect = "{{0, 0}, {585, 566}}";
+			sepNavWindowFrame = "{{38, 304}, {750, 502}}";
+		};
+	};
+	E1BF15A403DBAA5600050002 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {735, 464}}";
+			sepNavSelRange = "{65, 1}";
+			sepNavVisRect = "{{0, 0}, {735, 464}}";
+			sepNavWindowFrame = "{{15, 239}, {750, 502}}";
+		};
+	};
+	E1BF15A503DBAA5600050002 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {735, 575}}";
+			sepNavSelRange = "{1283, 0}";
+			sepNavVisRect = "{{0, 0}, {735, 464}}";
+			sepNavWindowFrame = "{{84, 176}, {750, 502}}";
+		};
+	};
+	E1BF15BF03DBBE8900050002 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {735, 464}}";
+			sepNavSelRange = "{5, 0}";
+			sepNavVisRect = "{{0, 0}, {735, 464}}";
+			sepNavWindowFrame = "{{15, 239}, {750, 502}}";
+		};
+	};
+	E1BF166A03DBE27000050002 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {735, 2195}}";
+			sepNavSelRange = "{4413, 0}";
+			sepNavVisRect = "{{0, 1363}, {735, 464}}";
+			sepNavWindowFrame = "{{61, 197}, {750, 502}}";
+		};
+	};
+	E1BF166B03DBE27000050002 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {735, 464}}";
+			sepNavSelRange = "{232, 0}";
+			sepNavVisRect = "{{0, 0}, {735, 464}}";
+			sepNavWindowFrame = "{{199, 71}, {750, 502}}";
+		};
+	};
+	E1BF166C03DBE27000050002 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {735, 464}}";
+			sepNavSelRange = "{224, 0}";
+			sepNavVisRect = "{{0, 0}, {735, 464}}";
+			sepNavWindowFrame = "{{222, 50}, {750, 502}}";
+		};
+	};
+	E1BF166D03DBE27000050002 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {735, 464}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {735, 464}}";
+			sepNavWindowFrame = "{{61, 197}, {750, 502}}";
+		};
+	};
+	E1BF167203DBEAA000050002 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {585, 4059}}";
+			sepNavSelRange = "{4814, 0}";
+			sepNavVisRect = "{{0, 2104}, {585, 566}}";
+		};
+	};
+	E1BF4A30048739CA00C20906 = {
+		fileReference = E1317B2F03DFC4DE00050002;
+		isa = PBXFileBreakpoint;
+		lineNumber = 443;
+		state = 1;
+	};
+	E1BF4A4D0487C77C00C20906 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {735, 4821}}";
+			sepNavSelRange = "{30, 0}";
+			sepNavVisRect = "{{0, 0}, {735, 464}}";
+			sepNavWindowFrame = "{{222, 50}, {750, 502}}";
+		};
+	};
+	E1BF4A570487CA5300C20906 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {585, 1792}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 1226}, {585, 566}}";
+		};
+	};
+	E1BF674C054C7F9300C390BC = {
+		isa = PBXFileReference;
+		lastKnownFileType = wrapper.application;
+		name = Safari.app;
+		path = /Applications/Safari.app;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1CBC99803E7602700050002 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {592, 1428}}";
+			sepNavSelRange = "{854, 0}";
+			sepNavVisRect = "{{0, 180}, {592, 476}}";
+		};
+	};
+	E1F6E3AC040BCC5700050002 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {585, 1651}}";
+			sepNavSelRange = "{762, 0}";
+			sepNavVisRect = "{{0, 347}, {585, 566}}";
+		};
+	};
+	F56276C20379923401AA4DA5 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {735, 5823}}";
+			sepNavSelRange = "{7948, 0}";
+			sepNavVisRect = "{{0, 2619}, {735, 464}}";
+			sepNavWindowFrame = "{{59, 150}, {750, 502}}";
+		};
+	};
+	F5CD5EAA02DAE61A01AA4DA5 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {709, 443}}";
+			sepNavSelRange = "{23, 0}";
+			sepNavVisRect = "{{0, 0}, {709, 443}}";
+			sepNavWindowFrame = "{{107, 241}, {750, 502}}";
+		};
+	};
+	F9A6986E03BE1DF000AA4DA5 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {621, 3887}}";
+			sepNavSelRange = "{3727, 89}";
+			sepNavVisRect = "{{0, 1272}, {621, 155}}";
+			sepNavWindowFrame = "{{153, 113}, {750, 502}}";
+		};
+	};
+	F9A6987003BE1DFF00AA4DA5 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {564, 566}}";
+			sepNavSelRange = "{826, 78}";
+			sepNavVisRect = "{{0, 0}, {564, 566}}";
+		};
+	};
+	F9A6987103BE1DFF00AA4DA5 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {840, 2027}}";
+			sepNavSelRange = "{4986, 0}";
+			sepNavVisRect = "{{0, 0}, {0, 0}}";
+		};
+	};
+}
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEE APE.xcode/project.pbxproj
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEE APE.xcode/project.pbxproj	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEE APE.xcode/project.pbxproj	(revision 170)
@@ -0,0 +1,1712 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 39;
+	objects = {
+		089C165CFE840E0CC02AAC07 = {
+			children = (
+				089C165DFE840E0CC02AAC07,
+			);
+			isa = PBXVariantGroup;
+			name = InfoPlist.strings;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		089C165DFE840E0CC02AAC07 = {
+			fileEncoding = 10;
+			isa = PBXFileReference;
+			lastKnownFileType = text.plist.strings;
+			name = English;
+			path = English.lproj/InfoPlist.strings;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+//080
+//081
+//082
+//083
+//084
+//190
+//191
+//192
+//193
+//194
+		19C28FACFE9D520D11CA2CBB = {
+			children = (
+				E1ABAEB90812F4B2007C5427,
+				E1ABAED50812F4B2007C5427,
+				E1ABAEDF0812F4B2007C5427,
+			);
+			isa = PBXGroup;
+			name = Products;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+//190
+//191
+//192
+//193
+//194
+//290
+//291
+//292
+//293
+//294
+		29B97313FDCFA39411CA2CEA = {
+			buildSettings = {
+				MACOSX_DEPLOYMENT_TARGET = 10.2;
+				SDKROOT = /Developer/SDKs/MacOSX10.2.7.sdk;
+			};
+			buildStyles = (
+				4A9504CCFFE6A4B311CA0CBA,
+				4A9504CDFFE6A4B311CA0CBA,
+			);
+			hasScannedForEncodings = 1;
+			isa = PBXProject;
+			knownPlatforms = (
+				macos,
+				macosclassic,
+				windows,
+				solaris,
+				hpux,
+				German,
+			);
+			knownRegions = (
+				English,
+				Japanese,
+				French,
+				German,
+				es,
+				Italian,
+			);
+			mainGroup = 29B97314FDCFA39411CA2CEA;
+			projectDirPath = "";
+			targets = (
+				E1ABAE8D0812F4B2007C5427,
+				E1ABAEBA0812F4B2007C5427,
+				E1ABAED60812F4B2007C5427,
+				E120DB7308141CCB00BF8DDC,
+			);
+		};
+		29B97314FDCFA39411CA2CEA = {
+			children = (
+				E14993A503DE868D00050002,
+				29B97315FDCFA39411CA2CEA,
+				E12FEC3C04959F1C00AEFBF9,
+				E14343AE03DB48F700050002,
+				E1BF159F03DBA81600050002,
+				E1BF15BD03DBBD3E00050002,
+				E1BF154403DB950B00050002,
+				29B97317FDCFA39411CA2CEA,
+				29B97323FDCFA39411CA2CEA,
+				19C28FACFE9D520D11CA2CBB,
+			);
+			isa = PBXGroup;
+			name = PatchTest;
+			path = "";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		29B97315FDCFA39411CA2CEA = {
+			children = (
+				F9A6986E03BE1DF000AA4DA5,
+				E11854F703F2709E00050002,
+				E169DBA703E4F6A400050002,
+				E14343B303DB4CF200050002,
+				E14343B403DB4CF200050002,
+				E165AB3503E7A7FC00050002,
+				E165AB3603E7A7FC00050002,
+				E13762D103EC636D00050002,
+				E13762D203EC636D00050002,
+				E1AFA51C03ECFDB000050001,
+				E1AFA51D03ECFDBF00050001,
+				F5CD5EAA02DAE61A01AA4DA5,
+				F51250CA038BF76601AA4DA5,
+			);
+			isa = PBXGroup;
+			name = "APE sources";
+			path = "";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		29B97317FDCFA39411CA2CEA = {
+			children = (
+				E1BF15BF03DBBE8900050002,
+				29B97318FDCFA39411CA2CEA,
+				E12FEC6104959FB800AEFBF9,
+				E1ABAEB80812F4B2007C5427,
+				E1ABAED40812F4B2007C5427,
+				E1ABAEF00812F4B3007C5427,
+				089C165CFE840E0CC02AAC07,
+				E1CBC99A03E7603400050002,
+			);
+			isa = PBXGroup;
+			name = Resources;
+			path = "";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		29B97318FDCFA39411CA2CEA = {
+			children = (
+				29B97319FDCFA39411CA2CEA,
+				E140C476040BBABD009FF178,
+				E1BF4A500487C7B300C20906,
+			);
+			isa = PBXVariantGroup;
+			name = "APE Manager plugin.nib";
+			path = "";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		29B97319FDCFA39411CA2CEA = {
+			isa = PBXFileReference;
+			lastKnownFileType = wrapper.nib;
+			name = "APE Manager plugin.nib";
+			path = "English.lproj/APE Manager plugin.nib";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		29B97323FDCFA39411CA2CEA = {
+			children = (
+				E169DCAB03E4FF7A00050002,
+				F574113202F45276011A08DB,
+				F5D3F9FC0305A40D01FE0BDE,
+				E19EB50303DD36E600050002,
+			);
+			isa = PBXGroup;
+			name = Frameworks;
+			path = "";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+//290
+//291
+//292
+//293
+//294
+//4A0
+//4A1
+//4A2
+//4A3
+//4A4
+		4A9504CCFFE6A4B311CA0CBA = {
+			buildSettings = {
+				COPY_PHASE_STRIP = NO;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_ENABLE_FIX_AND_CONTINUE = YES;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				OPTIMIZATION_CFLAGS = "-O0";
+				ZERO_LINK = YES;
+			};
+			isa = PBXBuildStyle;
+			name = Development;
+		};
+		4A9504CDFFE6A4B311CA0CBA = {
+			buildSettings = {
+				COPY_PHASE_STRIP = YES;
+				GCC_ENABLE_FIX_AND_CONTINUE = NO;
+				ZERO_LINK = NO;
+			};
+			isa = PBXBuildStyle;
+			name = Deployment;
+		};
+//4A0
+//4A1
+//4A2
+//4A3
+//4A4
+//E10
+//E11
+//E12
+//E13
+//E14
+		E11854F703F2709E00050002 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = CPS.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E120DB7308141CCB00BF8DDC = {
+			buildPhases = (
+				E120DF0E08141D6900BF8DDC,
+				E120DF1008141D9600BF8DDC,
+				E120DF1408141DB200BF8DDC,
+				E120DF1A08141DD600BF8DDC,
+			);
+			buildSettings = {
+				PRODUCT_NAME = "ICeCoffEE Installer";
+				WRAPPER_EXTENSION = app;
+			};
+			dependencies = (
+				E1EF063A0814203F00C464C7,
+				E1EF063C0814203F00C464C7,
+			);
+			isa = PBXAggregateTarget;
+			name = "ICeCoffEE Installer";
+			productName = "ICeCoffEE Installer agg";
+		};
+		E120DF0C08141D5100BF8DDC = {
+			isa = PBXFileReference;
+			lastKnownFileType = wrapper.application;
+			name = "ICeCoffEE Installer.app";
+			path = "Installer components/ICeCoffEE Installer.app";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E120DF0E08141D6900BF8DDC = {
+			buildActionMask = 2147483647;
+			dstPath = "";
+			dstSubfolderSpec = 16;
+			files = (
+				E120DF0F08141D7E00BF8DDC,
+			);
+			isa = PBXCopyFilesBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E120DF0F08141D7E00BF8DDC = {
+			fileRef = E120DF0C08141D5100BF8DDC;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E120DF1008141D9600BF8DDC = {
+			buildActionMask = 2147483647;
+			dstPath = "ICeCoffEE Installer.app/Contents/Resources";
+			dstSubfolderSpec = 16;
+			files = (
+				E120DF1108141D9F00BF8DDC,
+			);
+			isa = PBXCopyFilesBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E120DF1108141D9F00BF8DDC = {
+			fileRef = E1BF15A003DBAA4600050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E120DF1408141DB200BF8DDC = {
+			buildActionMask = 2147483647;
+			dstPath = "ICeCoffEE Installer.app/Contents/Resources/ui";
+			dstSubfolderSpec = 16;
+			files = (
+				E120DF1608141DBD00BF8DDC,
+				E120DF1908141DBD00BF8DDC,
+			);
+			isa = PBXCopyFilesBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E120DF1608141DBD00BF8DDC = {
+			fileRef = E1BF15A403DBAA5600050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E120DF1908141DBD00BF8DDC = {
+			fileRef = E1BF15A503DBAA5600050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E120DF1A08141DD600BF8DDC = {
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			isa = PBXShellScriptBuildPhase;
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "cd \"${SYMROOT}/${PRODUCT_NAME}.${WRAPPER_EXTENSION}/Contents/Resources/\" && \\\n/usr/bin/install \"${BUILT_PRODUCTS_DIR}/ICFindFilesToRemove\" ui && \\\nmkdir ui/ICeCoffEE.ape && \\\n/usr/bin/ditto -rsrc \"${BUILT_PRODUCTS_DIR}/ICeCoffEE.ape\" ui/ICeCoffEE.ape && \\\nfor i in ui/ICeCoffEE.ape/Contents/Resources/*.lproj\ndo\n    LPROJ=\"`basename $i`\"\n    mkdir -p \"${LPROJ}/ui\"\n    ln -s \"../../ui/ICeCoffEE.ape/Contents/Resources/$LPROJ/APEInfo.rtfd\" \"${LPROJ}/ui/ReadMe.rtfd\"\ndone";
+		};
+		E12FEC3C04959F1C00AEFBF9 = {
+			children = (
+				E12FEC3E04959F5A00AEFBF9,
+				E12FEC3D04959F5A00AEFBF9,
+				E12FEC4204959F5A00AEFBF9,
+				E12FEC4104959F5A00AEFBF9,
+				E12FEC4004959F5A00AEFBF9,
+				E12FEC3F04959F5A00AEFBF9,
+				E12FEC4404959F5A00AEFBF9,
+				E12FEC4304959F5A00AEFBF9,
+				E12FEC4504959F5A00AEFBF9,
+			);
+			isa = PBXGroup;
+			name = "Select Services sources";
+			path = "";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E12FEC3D04959F5A00AEFBF9 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
+			path = ICeCoffEEServicePrefController.m;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E12FEC3E04959F5A00AEFBF9 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = ICeCoffEEServicePrefController.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E12FEC3F04959F5A00AEFBF9 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
+			path = ICeCoffEENonHighlightingTextFieldCell.m;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E12FEC4004959F5A00AEFBF9 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = ICeCoffEENonHighlightingTextFieldCell.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E12FEC4104959F5A00AEFBF9 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
+			path = ICeCoffEENonHighlightingOutlineView.m;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E12FEC4204959F5A00AEFBF9 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = ICeCoffEENonHighlightingOutlineView.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E12FEC4304959F5A00AEFBF9 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
+			path = ICeCoffEENonHighlightingButtonCell.m;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E12FEC4404959F5A00AEFBF9 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = ICeCoffEENonHighlightingButtonCell.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E12FEC4504959F5A00AEFBF9 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
+			path = ICeCoffEEKeyEquivalents.m;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E12FEC6104959FB800AEFBF9 = {
+			children = (
+				E12FEC6204959FB800AEFBF9,
+			);
+			isa = PBXVariantGroup;
+			name = "Select services.nib";
+			path = "";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E12FEC6204959FB800AEFBF9 = {
+			isa = PBXFileReference;
+			lastKnownFileType = wrapper.nib;
+			name = "Select services.nib";
+			path = "English.lproj/Select services.nib";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1317B2E03DFC4DE00050002 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = ICeCoffEETerminal.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1317B2F03DFC4DE00050002 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
+			path = ICeCoffEETerminal.m;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E135625E03DC9FC200050002 = {
+			fileEncoding = 4;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = ICeCoffEEShared.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E13762D103EC636D00050002 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = ICeCoffEEBookmarks.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E13762D203EC636D00050002 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.c;
+			path = ICeCoffEEBookmarks.c;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E140C472040BB987009FF178 = {
+			children = (
+				F56276C20379923401AA4DA5,
+				E140C475040BB997009FF178,
+				E1BF4A4D0487C77C00C20906,
+			);
+			isa = PBXVariantGroup;
+			name = APEInfo.rtfd;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E140C475040BB997009FF178 = {
+			isa = PBXFileReference;
+			lastKnownFileType = wrapper.rtfd;
+			name = Japanese;
+			path = Japanese.lproj/APEInfo.rtfd;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E140C476040BBABD009FF178 = {
+			isa = PBXFileReference;
+			lastKnownFileType = wrapper.nib;
+			name = Japanese;
+			path = "Japanese.lproj/APE Manager plugin.nib";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E14343AE03DB48F700050002 = {
+			children = (
+				F9A6987003BE1DFF00AA4DA5,
+				F9A6987103BE1DFF00AA4DA5,
+				F56276B903796C8B01AA4DA5,
+				F56276BA03796C8B01AA4DA5,
+			);
+			isa = PBXGroup;
+			name = "APE Manager plugin sources";
+			path = "";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E14343B303DB4CF200050002 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = ICeCoffEE.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E14343B403DB4CF200050002 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
+			path = ICeCoffEE.m;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E14343B703DB4CFE00050002 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = ICeCoffEEScanner.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E14343B803DB4CFE00050002 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
+			path = ICeCoffEEScanner.m;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E14343CD03DB66E900050002 = {
+			fileEncoding = 4;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = ICeCoffEESuper.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E14343CE03DB66E900050002 = {
+			fileEncoding = 4;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
+			path = ICeCoffEESuper.m;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E14993A503DE868D00050002 = {
+			children = (
+				E135625E03DC9FC200050002,
+				E182C8F603DE817F00050002,
+			);
+			isa = PBXGroup;
+			name = "Shared sources";
+			path = "";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E165AB3503E7A7FC00050002 = {
+			fileEncoding = 4;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = ICeCoffEEAction.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E165AB3603E7A7FC00050002 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.c;
+			path = ICeCoffEEAction.c;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E169DBA103E4EF5E00050002 = {
+			fileEncoding = 4;
+			indentWidth = 4;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.c;
+			path = ICeCoffEETextEdit.c;
+			refType = 4;
+			sourceTree = "<group>";
+			tabWidth = 4;
+			usesTabs = 0;
+		};
+		E169DBA403E4F27400050002 = {
+			fileEncoding = 4;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = ICeCoffEETextEdit.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E169DBA703E4F6A400050002 = {
+			fileEncoding = 4;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = ICeCoffEEConfig.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E169DCAB03E4FF7A00050002 = {
+			isa = PBXFileReference;
+			lastKnownFileType = wrapper.framework;
+			name = Carbon.framework;
+			path = /System/Library/Frameworks/Carbon.framework;
+			refType = 0;
+			sourceTree = "<absolute>";
+		};
+		E182C8F603DE817F00050002 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
+			path = ICeCoffEEShared.m;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E19EB4F503DD359100050002 = {
+			children = (
+				E19EB4FB03DD35A700050002,
+				E19EB4FC03DD35A700050002,
+				E19EB4FA03DD35A700050002,
+				E19EB4F903DD35A700050002,
+			);
+			isa = PBXGroup;
+			name = ICFindFilesToRemove;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E19EB4F903DD35A700050002 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			name = ICFindFilesToRemove_Prefix.h;
+			path = ICFindFilesToRemove/ICFindFilesToRemove_Prefix.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E19EB4FA03DD35A700050002 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
+			name = UICookieMonster.m;
+			path = ICFindFilesToRemove/UICookieMonster.m;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E19EB4FB03DD35A700050002 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
+			name = main.m;
+			path = ICFindFilesToRemove/main.m;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E19EB4FC03DD35A700050002 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			name = UICookieMonster.h;
+			path = ICFindFilesToRemove/UICookieMonster.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E19EB50303DD36E600050002 = {
+			isa = PBXFileReference;
+			lastKnownFileType = wrapper.framework;
+			name = Foundation.framework;
+			path = /System/Library/Frameworks/Foundation.framework;
+			refType = 0;
+			sourceTree = "<absolute>";
+		};
+		E1ABAE8D0812F4B2007C5427 = {
+			buildPhases = (
+				E1ABAE8F0812F4B2007C5427,
+				E1ABAE9E0812F4B2007C5427,
+				E1ABAEA10812F4B2007C5427,
+				E1ABAEB00812F4B2007C5427,
+				E1ABAEB50812F4B2007C5427,
+				E1ABAEB70812F4B2007C5427,
+			);
+			buildRules = (
+			);
+			buildSettings = {
+				EXPORTED_SYMBOLS_FILE = Exports.exp;
+				FRAMEWORK_SEARCH_PATHS = "/Library/Frameworks $(SYSTEM_LIBRARY_DIR)/PrivateFrameworks";
+				INFOPLIST_FILE = "Info-APE Module.plist";
+				PRODUCT_NAME = ICeCoffEE;
+				WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas";
+				WRAPPER_EXTENSION = ape;
+			};
+			dependencies = (
+				E1ABAEF40812F4B3007C5427,
+			);
+			isa = PBXNativeTarget;
+			name = "APE Module";
+			productInstallPath = "$(USER_LIBRARY_DIR)/Bundles";
+			productName = "Labels X";
+			productReference = E1ABAEB90812F4B2007C5427;
+			productType = "com.apple.product-type.bundle";
+		};
+		E1ABAE8F0812F4B2007C5427 = {
+			buildActionMask = 2147483647;
+			files = (
+				E1ABAE900812F4B2007C5427,
+				E1ABAE910812F4B2007C5427,
+				E1ABAE920812F4B2007C5427,
+				E1ABAE930812F4B2007C5427,
+				E1ABAE940812F4B2007C5427,
+				E1ABAE950812F4B2007C5427,
+				E1ABAE960812F4B2007C5427,
+				E1ABAE970812F4B2007C5427,
+				E1ABAE980812F4B2007C5427,
+				E1ABAE990812F4B2007C5427,
+				E1ABAE9A0812F4B2007C5427,
+				E1ABAE9B0812F4B2007C5427,
+				E1ABAE9C0812F4B2007C5427,
+				E1ABAE9D0812F4B2007C5427,
+			);
+			isa = PBXHeadersBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E1ABAE900812F4B2007C5427 = {
+			fileRef = E14343B303DB4CF200050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAE910812F4B2007C5427 = {
+			fileRef = E14343B703DB4CFE00050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAE920812F4B2007C5427 = {
+			fileRef = E14343CD03DB66E900050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAE930812F4B2007C5427 = {
+			fileRef = E1BB268F03DB74B700050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAE940812F4B2007C5427 = {
+			fileRef = E1BB269303DB74C200050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAE950812F4B2007C5427 = {
+			fileRef = E1BF166B03DBE27000050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAE960812F4B2007C5427 = {
+			fileRef = E135625E03DC9FC200050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAE970812F4B2007C5427 = {
+			fileRef = E1317B2E03DFC4DE00050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAE980812F4B2007C5427 = {
+			fileRef = E169DBA403E4F27400050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAE990812F4B2007C5427 = {
+			fileRef = E165AB3503E7A7FC00050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAE9A0812F4B2007C5427 = {
+			fileRef = E13762D103EC636D00050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAE9B0812F4B2007C5427 = {
+			fileRef = E169DBA703E4F6A400050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAE9C0812F4B2007C5427 = {
+			fileRef = E11854F703F2709E00050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAE9D0812F4B2007C5427 = {
+			fileRef = E1BF166D03DBE27000050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAE9E0812F4B2007C5427 = {
+			buildActionMask = 2147483647;
+			files = (
+				E1ABAE9F0812F4B2007C5427,
+				E1ABAEA00812F4B2007C5427,
+			);
+			isa = PBXResourcesBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E1ABAE9F0812F4B2007C5427 = {
+			fileRef = E140C472040BB987009FF178;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEA00812F4B2007C5427 = {
+			fileRef = E1CBC99A03E7603400050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEA10812F4B2007C5427 = {
+			buildActionMask = 2147483647;
+			files = (
+				E1ABAEA20812F4B2007C5427,
+				E1ABAEA30812F4B2007C5427,
+				E1ABAEA40812F4B2007C5427,
+				E1ABAEA50812F4B2007C5427,
+				E1ABAEA60812F4B2007C5427,
+				E1ABAEA70812F4B2007C5427,
+				E1ABAEA80812F4B2007C5427,
+				E1ABAEA90812F4B2007C5427,
+				E1ABAEAA0812F4B2007C5427,
+				E1ABAEAB0812F4B2007C5427,
+				E1ABAEAC0812F4B2007C5427,
+				E1ABAEAD0812F4B2007C5427,
+				E1ABAEAE0812F4B2007C5427,
+				E1ABAEAF0812F4B2007C5427,
+			);
+			isa = PBXSourcesBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E1ABAEA20812F4B2007C5427 = {
+			fileRef = F5CD5EAA02DAE61A01AA4DA5;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEA30812F4B2007C5427 = {
+			fileRef = F9A6986E03BE1DF000AA4DA5;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEA40812F4B2007C5427 = {
+			fileRef = E14343B403DB4CF200050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEA50812F4B2007C5427 = {
+			fileRef = E14343B803DB4CFE00050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEA60812F4B2007C5427 = {
+			fileRef = E1BB269003DB74B700050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEA70812F4B2007C5427 = {
+			fileRef = E1BB269403DB74C200050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEA80812F4B2007C5427 = {
+			fileRef = E1BF166A03DBE27000050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEA90812F4B2007C5427 = {
+			fileRef = E1BF166C03DBE27000050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEAA0812F4B2007C5427 = {
+			fileRef = E182C8F603DE817F00050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEAB0812F4B2007C5427 = {
+			fileRef = E1317B2F03DFC4DE00050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEAC0812F4B2007C5427 = {
+			fileRef = E169DBA103E4EF5E00050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEAD0812F4B2007C5427 = {
+			fileRef = E165AB3603E7A7FC00050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEAE0812F4B2007C5427 = {
+			fileRef = E13762D203EC636D00050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEAF0812F4B2007C5427 = {
+			fileRef = E14343CE03DB66E900050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEB00812F4B2007C5427 = {
+			buildActionMask = 2147483647;
+			files = (
+				E1ABAEB10812F4B2007C5427,
+				E1ABAEB20812F4B2007C5427,
+				E1ABAEB30812F4B2007C5427,
+				E1ABAEB40812F4B2007C5427,
+			);
+			isa = PBXFrameworksBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E1ABAEB10812F4B2007C5427 = {
+			fileRef = F574113202F45276011A08DB;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEB20812F4B2007C5427 = {
+			fileRef = F5D3F9FC0305A40D01FE0BDE;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEB30812F4B2007C5427 = {
+			fileRef = F51250CA038BF76601AA4DA5;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEB40812F4B2007C5427 = {
+			fileRef = E169DCAB03E4FF7A00050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEB50812F4B2007C5427 = {
+			buildActionMask = 2147483647;
+			dstPath = "";
+			dstSubfolderSpec = 7;
+			files = (
+				E1ABAEF90812F4B3007C5427,
+			);
+			isa = PBXCopyFilesBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E1ABAEB70812F4B2007C5427 = {
+			buildActionMask = 2147483647;
+			files = (
+			);
+			isa = PBXShellScriptBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "/Developer/Tools/SetFile -a B \"$TARGET_BUILD_DIR/$PRODUCT_NAME.$WRAPPER_EXTENSION\"";
+		};
+		E1ABAEB80812F4B2007C5427 = {
+			isa = PBXFileReference;
+			lastKnownFileType = text.xml;
+			path = "Info-APE Module.plist";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1ABAEB90812F4B2007C5427 = {
+			explicitFileType = wrapper.cfbundle;
+			includeInIndex = 0;
+			isa = PBXFileReference;
+			path = ICeCoffEE.ape;
+			refType = 3;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		E1ABAEBA0812F4B2007C5427 = {
+			buildPhases = (
+				E1ABAEBB0812F4B2007C5427,
+				E1ABAEC30812F4B2007C5427,
+				E1ABAEC60812F4B2007C5427,
+				E1ABAECF0812F4B2007C5427,
+				E1ABAED30812F4B2007C5427,
+			);
+			buildRules = (
+			);
+			buildSettings = {
+				FRAMEWORK_SEARCH_PATHS = /Library/Frameworks;
+				INFOPLIST_FILE = "Info-APEManagerPrefPane.plist";
+				PRODUCT_NAME = APEManagerPrefPane;
+				WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas";
+				WRAPPER_EXTENSION = plugin;
+			};
+			dependencies = (
+			);
+			isa = PBXNativeTarget;
+			name = APEManagerPrefPane;
+			productInstallPath = "$(USER_LIBRARY_DIR)/Bundles";
+			productName = APEManagerPrefPane;
+			productReference = E1ABAED50812F4B2007C5427;
+			productType = "com.apple.product-type.bundle";
+		};
+		E1ABAEBB0812F4B2007C5427 = {
+			buildActionMask = 2147483647;
+			files = (
+				E1ABAEBC0812F4B2007C5427,
+				E1ABAEBD0812F4B2007C5427,
+				E1ABAEBE0812F4B2007C5427,
+				E1ABAEBF0812F4B2007C5427,
+				E1ABAEC00812F4B2007C5427,
+				E1ABAEC10812F4B2007C5427,
+				E1ABAEC20812F4B2007C5427,
+			);
+			isa = PBXHeadersBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E1ABAEBC0812F4B2007C5427 = {
+			fileRef = F56276B903796C8B01AA4DA5;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEBD0812F4B2007C5427 = {
+			fileRef = F9A6987003BE1DFF00AA4DA5;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEBE0812F4B2007C5427 = {
+			fileRef = E135625E03DC9FC200050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEBF0812F4B2007C5427 = {
+			fileRef = E12FEC3E04959F5A00AEFBF9;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEC00812F4B2007C5427 = {
+			fileRef = E12FEC4204959F5A00AEFBF9;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEC10812F4B2007C5427 = {
+			fileRef = E12FEC4004959F5A00AEFBF9;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEC20812F4B2007C5427 = {
+			fileRef = E12FEC4404959F5A00AEFBF9;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEC30812F4B2007C5427 = {
+			buildActionMask = 2147483647;
+			files = (
+				E1ABAEC40812F4B2007C5427,
+				E1ABAEC50812F4B2007C5427,
+			);
+			isa = PBXResourcesBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E1ABAEC40812F4B2007C5427 = {
+			fileRef = 29B97318FDCFA39411CA2CEA;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEC50812F4B2007C5427 = {
+			fileRef = E12FEC6104959FB800AEFBF9;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEC60812F4B2007C5427 = {
+			buildActionMask = 2147483647;
+			files = (
+				E1ABAEC70812F4B2007C5427,
+				E1ABAEC80812F4B2007C5427,
+				E1ABAEC90812F4B2007C5427,
+				E1ABAECA0812F4B2007C5427,
+				E1ABAECB0812F4B2007C5427,
+				E1ABAECC0812F4B2007C5427,
+				E1ABAECD0812F4B2007C5427,
+				E1ABAECE0812F4B2007C5427,
+			);
+			isa = PBXSourcesBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E1ABAEC70812F4B2007C5427 = {
+			fileRef = F56276BA03796C8B01AA4DA5;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEC80812F4B2007C5427 = {
+			fileRef = F9A6987103BE1DFF00AA4DA5;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEC90812F4B2007C5427 = {
+			fileRef = E182C8F603DE817F00050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAECA0812F4B2007C5427 = {
+			fileRef = E12FEC3D04959F5A00AEFBF9;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAECB0812F4B2007C5427 = {
+			fileRef = E12FEC4104959F5A00AEFBF9;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAECC0812F4B2007C5427 = {
+			fileRef = E12FEC3F04959F5A00AEFBF9;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAECD0812F4B2007C5427 = {
+			fileRef = E12FEC4304959F5A00AEFBF9;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAECE0812F4B2007C5427 = {
+			fileRef = E12FEC4504959F5A00AEFBF9;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAECF0812F4B2007C5427 = {
+			buildActionMask = 2147483647;
+			files = (
+				E1ABAED00812F4B2007C5427,
+				E1ABAED10812F4B2007C5427,
+				E1ABAED20812F4B2007C5427,
+			);
+			isa = PBXFrameworksBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E1ABAED00812F4B2007C5427 = {
+			fileRef = F574113202F45276011A08DB;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAED10812F4B2007C5427 = {
+			fileRef = F5D3F9FC0305A40D01FE0BDE;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAED20812F4B2007C5427 = {
+			fileRef = E169DCAB03E4FF7A00050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAED30812F4B2007C5427 = {
+			buildActionMask = 2147483647;
+			files = (
+			);
+			isa = PBXRezBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E1ABAED40812F4B2007C5427 = {
+			isa = PBXFileReference;
+			lastKnownFileType = text.xml;
+			path = "Info-APEManagerPrefPane.plist";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1ABAED50812F4B2007C5427 = {
+			explicitFileType = wrapper.cfbundle;
+			includeInIndex = 0;
+			isa = PBXFileReference;
+			path = APEManagerPrefPane.plugin;
+			refType = 3;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		E1ABAED60812F4B2007C5427 = {
+			buildPhases = (
+				E1ABAED70812F4B2007C5427,
+				E1ABAEDA0812F4B2007C5427,
+				E1ABAEDD0812F4B2007C5427,
+			);
+			buildRules = (
+			);
+			buildSettings = {
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = ICFindFilesToRemove/ICFindFilesToRemove_Prefix.h;
+				OTHER_CFLAGS = "";
+				OTHER_LDFLAGS = "";
+				OTHER_REZFLAGS = "";
+				PRODUCT_NAME = ICFindFilesToRemove;
+				REZ_EXECUTABLE = YES;
+				SECTORDER_FLAGS = "";
+				WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas";
+			};
+			dependencies = (
+			);
+			isa = PBXNativeTarget;
+			name = ICFindFilesToRemove;
+			productInstallPath = /usr/local/bin;
+			productName = ICFindFilesToRemove;
+			productReference = E1ABAEDF0812F4B2007C5427;
+			productType = "com.apple.product-type.tool";
+		};
+		E1ABAED70812F4B2007C5427 = {
+			buildActionMask = 2147483647;
+			files = (
+				E1ABAED80812F4B2007C5427,
+				E1ABAED90812F4B2007C5427,
+			);
+			isa = PBXHeadersBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E1ABAED80812F4B2007C5427 = {
+			fileRef = E19EB4F903DD35A700050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAED90812F4B2007C5427 = {
+			fileRef = E19EB4FC03DD35A700050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEDA0812F4B2007C5427 = {
+			buildActionMask = 2147483647;
+			files = (
+				E1ABAEDB0812F4B2007C5427,
+				E1ABAEDC0812F4B2007C5427,
+			);
+			isa = PBXSourcesBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E1ABAEDB0812F4B2007C5427 = {
+			fileRef = E19EB4FA03DD35A700050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEDC0812F4B2007C5427 = {
+			fileRef = E19EB4FB03DD35A700050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEDD0812F4B2007C5427 = {
+			buildActionMask = 2147483647;
+			files = (
+				E1ABAEDE0812F4B2007C5427,
+			);
+			isa = PBXFrameworksBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E1ABAEDE0812F4B2007C5427 = {
+			fileRef = E19EB50303DD36E600050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1ABAEDF0812F4B2007C5427 = {
+			explicitFileType = "compiled.mach-o.executable";
+			includeInIndex = 0;
+			isa = PBXFileReference;
+			path = ICFindFilesToRemove;
+			refType = 3;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		E1ABAEF00812F4B3007C5427 = {
+			isa = PBXFileReference;
+			lastKnownFileType = text.xml;
+			path = "Info-ICeCoffEE Installer.plist";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1ABAEF30812F4B3007C5427 = {
+			containerPortal = 29B97313FDCFA39411CA2CEA;
+			isa = PBXContainerItemProxy;
+			proxyType = 1;
+			remoteGlobalIDString = E1ABAEBA0812F4B2007C5427;
+			remoteInfo = "APEManagerPrefPane (Upgraded)";
+		};
+		E1ABAEF40812F4B3007C5427 = {
+			isa = PBXTargetDependency;
+			target = E1ABAEBA0812F4B2007C5427;
+			targetProxy = E1ABAEF30812F4B3007C5427;
+		};
+		E1ABAEF90812F4B3007C5427 = {
+			fileRef = E1ABAED50812F4B2007C5427;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1AFA51C03ECFDB000050001 = {
+			children = (
+				E14343CD03DB66E900050002,
+				E14343CE03DB66E900050002,
+				E14343B703DB4CFE00050002,
+				E14343B803DB4CFE00050002,
+				E1317B2E03DFC4DE00050002,
+				E1317B2F03DFC4DE00050002,
+				E1BB268F03DB74B700050002,
+				E1BB269003DB74B700050002,
+				E1BB269303DB74C200050002,
+				E1BB269403DB74C200050002,
+				E1BF167203DBEAA000050002,
+				E1BF166D03DBE27000050002,
+				E1BF166A03DBE27000050002,
+				E1BF166B03DBE27000050002,
+				E1BF166C03DBE27000050002,
+			);
+			isa = PBXGroup;
+			name = Cocoa;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1AFA51D03ECFDBF00050001 = {
+			children = (
+				E169DBA403E4F27400050002,
+				E169DBA103E4EF5E00050002,
+			);
+			isa = PBXGroup;
+			name = Carbon;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1BB268F03DB74B700050002 = {
+			fileEncoding = 4;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = ICeCoffEEMenuOnly.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1BB269003DB74B700050002 = {
+			fileEncoding = 4;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
+			path = ICeCoffEEMenuOnly.m;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1BB269303DB74C200050002 = {
+			fileEncoding = 4;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = ICeCoffEEMenuSuper.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1BB269403DB74C200050002 = {
+			fileEncoding = 4;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
+			path = ICeCoffEEMenuSuper.m;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1BF154403DB950B00050002 = {
+			children = (
+				E140C472040BB987009FF178,
+			);
+			isa = PBXGroup;
+			name = Documentation;
+			path = "";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1BF159F03DBA81600050002 = {
+			children = (
+				E19EB4F503DD359100050002,
+				E120DF0C08141D5100BF8DDC,
+				E1BF15A003DBAA4600050002,
+				E1BF15A203DBAA5600050002,
+			);
+			isa = PBXGroup;
+			name = "Installer components";
+			path = "";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1BF15A003DBAA4600050002 = {
+			isa = PBXFileReference;
+			lastKnownFileType = image.icns;
+			name = ui.icns;
+			path = "Installer components/ui.icns";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1BF15A203DBAA5600050002 = {
+			children = (
+				E1BF15A403DBAA5600050002,
+				E1BF15A503DBAA5600050002,
+			);
+			isa = PBXGroup;
+			name = ui;
+			path = "Installer components/ui";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1BF15A403DBAA5600050002 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = text.script.sh;
+			path = Preinstall.sh;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1BF15A503DBAA5600050002 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = text.plist;
+			path = ui.plist;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1BF15BD03DBBD3E00050002 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = text.script.sh;
+			name = "package-ICeCoffEE.sh";
+			path = "/Users/nicholas/Documents/Development/ICeCoffEE/package-ICeCoffEE.sh";
+			refType = 0;
+			sourceTree = "<absolute>";
+		};
+		E1BF15BF03DBBE8900050002 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = text;
+			path = VERSION;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1BF166A03DBE27000050002 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
+			path = ICeCoffEEWebKit.m;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1BF166B03DBE27000050002 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = ICeCoffEEWebKitSuper.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1BF166C03DBE27000050002 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
+			path = ICeCoffEEWebKitSuper.m;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1BF166D03DBE27000050002 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = ICeCoffEEWebKit.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1BF167203DBEAA000050002 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = WebCoreBridge.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1BF4A4D0487C77C00C20906 = {
+			isa = PBXFileReference;
+			lastKnownFileType = wrapper.rtfd;
+			name = German;
+			path = German.lproj/APEInfo.rtfd;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1BF4A500487C7B300C20906 = {
+			isa = PBXFileReference;
+			lastKnownFileType = wrapper.nib;
+			name = German;
+			path = "German.lproj/APE Manager plugin.nib";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1BF4A570487CA5300C20906 = {
+			isa = PBXFileReference;
+			lastKnownFileType = text.plist.strings;
+			name = German;
+			path = German.lproj/Localizable.strings;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1CBC99803E7602700050002 = {
+			fileEncoding = 10;
+			isa = PBXFileReference;
+			lastKnownFileType = text.plist.strings;
+			name = English;
+			path = English.lproj/Localizable.strings;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1CBC99A03E7603400050002 = {
+			children = (
+				E1CBC99803E7602700050002,
+				E1F6E3AC040BCC5700050002,
+				E1BF4A570487CA5300C20906,
+			);
+			isa = PBXVariantGroup;
+			name = Localizable.strings;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1EF06390814203F00C464C7 = {
+			containerPortal = 29B97313FDCFA39411CA2CEA;
+			isa = PBXContainerItemProxy;
+			proxyType = 1;
+			remoteGlobalIDString = E1ABAE8D0812F4B2007C5427;
+			remoteInfo = "APE Module";
+		};
+		E1EF063A0814203F00C464C7 = {
+			isa = PBXTargetDependency;
+			target = E1ABAE8D0812F4B2007C5427;
+			targetProxy = E1EF06390814203F00C464C7;
+		};
+		E1EF063B0814203F00C464C7 = {
+			containerPortal = 29B97313FDCFA39411CA2CEA;
+			isa = PBXContainerItemProxy;
+			proxyType = 1;
+			remoteGlobalIDString = E1ABAED60812F4B2007C5427;
+			remoteInfo = ICFindFilesToRemove;
+		};
+		E1EF063C0814203F00C464C7 = {
+			isa = PBXTargetDependency;
+			target = E1ABAED60812F4B2007C5427;
+			targetProxy = E1EF063B0814203F00C464C7;
+		};
+		E1F6E3AC040BCC5700050002 = {
+			fileEncoding = 10;
+			isa = PBXFileReference;
+			lastKnownFileType = text.plist.strings;
+			name = Japanese;
+			path = Japanese.lproj/Localizable.strings;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+//E10
+//E11
+//E12
+//E13
+//E14
+//F50
+//F51
+//F52
+//F53
+//F54
+		F51250CA038BF76601AA4DA5 = {
+			isa = PBXFileReference;
+			lastKnownFileType = "compiled.mach-o.objfile";
+			name = APETools.o;
+			path = /Library/Frameworks/ApplicationEnhancer.framework/Versions/A/Libraries/APETools.o;
+			refType = 0;
+			sourceTree = "<absolute>";
+		};
+		F56276B903796C8B01AA4DA5 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = CFPreferencesWrapper.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		F56276BA03796C8B01AA4DA5 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
+			path = CFPreferencesWrapper.m;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		F56276C20379923401AA4DA5 = {
+			isa = PBXFileReference;
+			lastKnownFileType = wrapper.rtfd;
+			name = English;
+			path = English.lproj/APEInfo.rtfd;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		F574113202F45276011A08DB = {
+			isa = PBXFileReference;
+			lastKnownFileType = wrapper.framework;
+			name = Cocoa.framework;
+			path = /System/Library/Frameworks/Cocoa.framework;
+			refType = 0;
+			sourceTree = "<absolute>";
+		};
+		F5CD5EAA02DAE61A01AA4DA5 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.exports;
+			path = Exports.exp;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		F5D3F9FC0305A40D01FE0BDE = {
+			isa = PBXFileReference;
+			lastKnownFileType = wrapper.framework;
+			name = ApplicationEnhancer.framework;
+			path = /Library/Frameworks/ApplicationEnhancer.framework;
+			refType = 0;
+			sourceTree = "<absolute>";
+		};
+//F50
+//F51
+//F52
+//F53
+//F54
+//F90
+//F91
+//F92
+//F93
+//F94
+		F9A6986E03BE1DF000AA4DA5 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
+			path = APEMain.m;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		F9A6987003BE1DFF00AA4DA5 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = ICeCoffEEController.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		F9A6987103BE1DFF00AA4DA5 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
+			path = ICeCoffEEController.m;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+	};
+	rootObject = 29B97313FDCFA39411CA2CEA;
+}
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEE.h
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEE.h	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEE.h	(revision 170)
@@ -0,0 +1,57 @@
+/* ICeCoffEE */
+
+#import "ICeCoffEESuper.h"
+#import "ICeCoffEEShared.h"
+#import "ICeCoffEEConfig.h"
+
+#define ICCF_OSErrAssert(err, context) NSAssert(err == noErr, ICCF_ErrString(err, context));
+#define ICCF_OSErrCAssert(err, context) NSCAssert(err == noErr, ICCF_ErrString(err, context));
+
+// search for: (?<!ICCF_LocalizedString\()(?<!ICLog\()(?<!ICapeprintf("\()(?<!%)(@"(?!Internal error: )[^"]+") replace with: ICCF_LocalizedString(\1)
+#define ICCF_LocalizedString(key) \
+    [(NSString *)CFBundleCopyLocalizedString(ICCF_bundle, (CFStringRef)(key), CFSTR(""), NULL) autorelease]
+
+// returns an explanation for the provided OSStatus in the supplied
+// if nil is returned, the error is harmless (e.g., user cancelled)
+NSString *ICCF_ErrString(OSStatus err, NSString *context);
+
+// handles an exception as specified by ICError* preferences
+// if NO is returned, the exception is harmless (e.g., user cancelled)
+BOOL ICCF_HandleException(NSException *e);
+
+// returns YES if the event is a command-mouse down
+BOOL ICCF_EventIsCommandMouseDown(NSEvent *e);
+
+// returns the action determined by the current state of keyboard modifiers
+iccfURLAction ICCF_KeyboardAction();
+
+// throws an exception if the URL range is nonexistent or too big
+void ICCF_CheckRange(NSRange range);
+
+// returns NSCharacterSets representing valid URL delimiters for left and right sides
+void ICCF_Delimiters(NSCharacterSet **leftPtr, NSCharacterSet **rightPtr);
+
+// start Internet Config (before ICCF_LaunchURL)
+void ICCF_StartIC();
+
+// stop Internet Config (after ICCF_LaunchURL)
+void ICCF_StopIC();
+
+// calls ICParseURL, returns output range
+void ICCF_ParseURL(NSString *string, NSRange *range);
+
+// calls ICCF_DoURLAction
+void ICCF_LaunchURL(NSString *string, iccfURLAction action);
+
+// launch URL from on selected text view cursor position or selection
+void ICCF_LaunchURLFromTextView(NSTextView *self);
+
+// returns contextual menu with Services item added, if selected
+NSMenu *ICCF_MenuForEvent(NSView *self, NSMenu *contextMenu, NSEvent *e);
+
+// adds or removes services menu in menu bar
+void ICCF_AddRemoveServicesMenu();
+
+@interface ICeCoffEE : ICeCoffEESuper
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEE.m
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEE.m	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEE.m	(revision 170)
@@ -0,0 +1,557 @@
+// ICeCoffEE - Internet Config Cocoa Editor Extension
+// Nicholas Riley <mailto:icecoffee@sabi.net>
+
+/* To do/think about:
+
+- TXNClick - MLTE has its own support in Jaguar and later, but it's lousy
+
+Done:
+
+- TEClick - TextEdit
+- flash on success (like BBEdit)
+- display dialog on failure (decode OSStatus)
+- adjust URL blinking
+- app exclusion list - make a pref pane (see AquaShade config)
+- _LSCopyApplicationURLsForItemURL - list apps
+- Menu on command-option-click: add bookmark, open with other helper, pass to configurable service, ...?
+
+*/
+
+#import "ICeCoffEE.h"
+#import <Carbon/Carbon.h>
+#include <unistd.h>
+#import "ICeCoffEESuper.h"
+
+iccfPrefRec ICCF_prefs;
+
+NSString *ICCF_ErrString(OSStatus err, NSString *context) {    
+    if (err == noErr || err == userCanceledErr) return nil;
+
+    NSString *errNum = [NSString stringWithFormat: @"%ld", err];
+    NSString *errDesc = ICCF_LocalizedString(errNum);
+
+    if (errDesc == NULL || errDesc == errNum)
+        errDesc = [NSString stringWithFormat: ICCF_LocalizedString(@"An unknown error occurred in %@"), context];
+
+    return [NSString stringWithFormat: @"%@ (%d)", errDesc, (int)err];
+}
+
+CFStringRef ICCF_CopyErrString(OSStatus err, CFStringRef context) {
+    if (err == noErr || err == userCanceledErr) return NULL;
+
+    CFStringRef errNum = CFStringCreateWithFormat(NULL, NULL, CFSTR("%ld"), err);
+    CFStringRef errDesc = ICCF_CopyLocalizedString(errNum);
+
+    if (errDesc == NULL || errDesc == errNum) {
+        CFStringRef errDescFormat = ICCF_CopyLocalizedString(CFSTR("An unknown error occurred in %@"));
+        if (errDesc != NULL) CFRelease(errDesc);
+        errDesc = CFStringCreateWithFormat(NULL, NULL, errDescFormat, context);
+    }
+
+    CFStringRef errStr = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@ (%d)"), errDesc, (int)err);
+
+    if (errNum != NULL) CFRelease(errNum);
+    if (errDesc != NULL) CFRelease(errDesc);
+    return errStr;
+}
+
+CFStringRef ICCF_CopyAppName() {
+    ProcessSerialNumber psn = {0, kCurrentProcess};
+    CFStringRef appName = NULL;
+    CopyProcessName(&psn, &appName);
+    if (appName == NULL) return CFSTR("(unknown)");
+    return appName;
+}
+
+BOOL ICCF_EventIsCommandMouseDown(NSEvent *e) {
+    return ([e type] == NSLeftMouseDown && ([e modifierFlags] & NSCommandKeyMask) != 0 && [e clickCount] == 1);
+}
+
+iccfURLAction ICCF_KeyboardAction() {
+    unsigned int modifierFlags = [[NSApp currentEvent] modifierFlags];
+    iccfURLAction action;
+    action.presentMenu = (modifierFlags & NSAlternateKeyMask) != 0;
+    action.launchInBackground = (modifierFlags & NSShiftKeyMask) != 0;
+    return action;
+}
+
+void ICCF_CheckRange(NSRange range) {
+    NSCAssert(range.length > 0, ICCF_LocalizedString(@"No URL is selected"));
+    NSCAssert1(range.length <= ICCF_MAX_URL_LEN, ICCF_LocalizedString(@"The potential URL is longer than %lu characters"), ICCF_MAX_URL_LEN);
+}
+
+void ICCF_Delimiters(NSCharacterSet **leftPtr, NSCharacterSet **rightPtr) {
+    static NSCharacterSet *urlLeftDelimiters = nil, *urlRightDelimiters = nil;
+
+    if (urlLeftDelimiters == nil || urlRightDelimiters == nil) {
+        NSMutableCharacterSet *set = [[NSCharacterSet whitespaceAndNewlineCharacterSet] mutableCopy];
+        NSMutableCharacterSet *tmpSet;
+        [urlLeftDelimiters release];
+        [urlRightDelimiters release];
+
+        [set autorelease];
+        [set formUnionWithCharacterSet: [[NSCharacterSet characterSetWithRange: NSMakeRange(0, 128)] invertedSet]]; // remove non-ASCII characters
+        [set formUnionWithCharacterSet: [NSCharacterSet punctuationCharacterSet]];
+        [set removeCharactersInString: @";/?:@&=+$,-_.!~*'()%#"]; // RFC 2396 ¤2.2, 2.3, 2.4, plus #
+
+        tmpSet = [[set mutableCopy] autorelease];
+        [tmpSet formUnionWithCharacterSet: [NSCharacterSet characterSetWithCharactersInString: @"><("]];
+        urlLeftDelimiters = [tmpSet copy]; // make immutable again - for efficiency
+
+        tmpSet = [[set mutableCopy] autorelease];
+        [tmpSet formUnionWithCharacterSet: [NSCharacterSet characterSetWithCharactersInString: @"><)"]];
+        urlRightDelimiters = [tmpSet copy]; // make immutable again - for efficiency
+    }
+
+    *leftPtr = urlLeftDelimiters; *rightPtr = urlRightDelimiters;
+}
+
+static ICInstance ICCF_icInst = NULL;
+
+void ICCF_StartIC() {
+    OSStatus err;
+    
+    if (ICCF_icInst != NULL) {
+        ICLog(@"ICCF_StartIC: Internet Config is already running!");
+        ICCF_StopIC();
+    }
+    err = ICStart(&ICCF_icInst, kICCFCreator);
+    NSCAssert1(err == noErr, ICCF_LocalizedString(@"Unable to start Internet Config (error %d)"), err);
+}
+
+void ICCF_StopIC() {
+    if (ICCF_icInst == NULL) {
+        ICLog(@"ICCF_StopIC: Internet Config is not running!");
+    } else {
+        ICStop(ICCF_icInst);
+        ICCF_icInst = NULL;
+    }
+}
+
+ICInstance ICCF_GetInst() {
+    NSCAssert(ICCF_icInst != NULL, @"Internal error: Called ICCF_GetInst without ICCF_StartIC");
+    return ICCF_icInst;
+}
+
+ConstStringPtr ICCF_GetHint(ICInstance inst, const char *urlData, Size length, long *selStart, long *selEnd, Boolean *needsSlashes) {
+    Handle h = NewHandle(0);
+    OSStatus err;
+
+    if (h == NULL) return NULL;
+
+    // parse the URL providing a bogus protocol, to get rid of escaped forms
+    err = ICParseURL(inst, "\p*", urlData, length, selStart, selEnd, h);
+    if (err != noErr) return NULL;
+
+    // scan through the parsed URL looking for characters not found in email addresses
+    Size hSize = GetHandleSize(h);
+    if (hSize == 0) return NULL;
+
+    const char *urlParsed = *h;
+    long i = 0;
+    Boolean sawAt = false;
+    if (hSize >= 2 && urlParsed[0] == '*' && urlParsed[1] == ':') {
+        // this is an IC-inserted protocol; skip over it
+        i = 2;
+        *needsSlashes = (hSize < i + 2 || urlParsed[i] != '/' || urlParsed[i + 1] != '/');
+    } else *needsSlashes = false;
+    for ( ; i < hSize ; i++) {
+        char c = urlParsed[i];
+        if (c == '@') {
+            sawAt = true;
+        } else if (!((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') ||
+                     (c == '+' || c == '-' || c == '_' || c == '!' || c == '.'))) {
+            DisposeHandle(h);
+            return "\phttp";
+        }
+    }
+    DisposeHandle(h);
+    if (sawAt) {
+        *needsSlashes = false;
+        return "\pmailto";
+    }
+    return "\phttp";
+}
+
+static const char *kICSlashes = "//";
+
+void ICCF_AddSlashes(Handle h, ConstStringPtr hint) {
+    Size sizeBefore = GetHandleSize(h);
+    unsigned char hintLength = StrLength(hint);
+    char *copy = (char *)malloc(sizeBefore);
+    memcpy(copy, *h, sizeBefore);
+    ICLog(@"ICCF_AddSlashes before: |%s|\n", *h);
+    ReallocateHandle(h, sizeBefore + 2);
+
+    // if *h begins with '<hint>:', then copy the slashes after it
+    if (sizeBefore > hintLength + 1 && strncmp(&hint[1], copy, hintLength) == 0 && copy[hintLength] == ':') {
+        memcpy(*h, copy, hintLength + 1);
+        memcpy(*h + hintLength + 1, kICSlashes, 2);
+        memcpy(*h + hintLength + 3, &copy[hintLength + 1], sizeBefore - hintLength - 1);
+    } else {
+        memcpy(*h, kICSlashes, 2);
+        memcpy(*h + 2, copy, sizeBefore);
+    }
+        
+    free(copy);
+    ICLog(@"ICCF_AddSlashes after: |%s|\n", *h);
+}
+
+void ICCF_ParseURL(NSString *string, NSRange *range) {
+    OSStatus err;
+    Handle h;
+    long selStart, selEnd;
+    char *urlData = NULL;
+
+    NSCAssert(range->length == [string length], @"Internal error: URL string is wrong length");
+    
+    NS_DURING
+        if ([[NSCharacterSet characterSetWithCharactersInString: @";,."] characterIsMember:
+            [string characterAtIndex: range->length - 1]]) {
+            range->length--;
+        }
+
+        string = [string substringToIndex: range->length];
+
+        ICLog(@"Parsing URL |%@|", string);
+
+        NSCAssert([string canBeConvertedToEncoding: NSASCIIStringEncoding], @"No URL is selected");
+
+        urlData = (char *)malloc( (range->length + 1) * sizeof(char));
+        NSCAssert(urlData != NULL, @"Internal error: can't allocate memory for URL string");
+
+        selStart = 0; selEnd = range->length;
+
+        [string getCString: urlData];
+
+        h = NewHandle(0);
+        NSCAssert(h != NULL, @"Internal error: can't allocate URL handle");
+
+        err = ICParseURL(ICCF_GetInst(), "\pmailto", urlData, range->length, &selStart, &selEnd, h);
+        DisposeHandle(h);
+
+        ICCF_OSErrCAssert(err, @"ICParseURL");
+    
+        range->length = selEnd - selStart;
+        range->location += selStart;
+    NS_HANDLER
+        free(urlData);
+        [localException raise];
+    NS_ENDHANDLER
+    
+    free(urlData);
+}
+
+void ICCF_LaunchURL(NSString *string, iccfURLAction action) {
+    OSStatus err;
+    long selStart, selEnd;
+    unsigned len = [string length];
+
+    Handle h = NULL;
+    
+    NS_DURING
+        h = NewHandle(len);
+        if (h == NULL)
+            ICCF_OSErrCAssert(MemError(), @"NewHandle");
+
+        if (CFStringGetBytes((CFStringRef)string, CFRangeMake(0, len), kCFStringEncodingASCII, '\0', false, *h, len, NULL) != len)
+            ICCF_OSErrCAssert(kTECNoConversionPathErr, @"CFStringGetBytes");
+
+        selStart = 0; selEnd = len;
+
+        Boolean needsSlashes;
+        ConstStringPtr hint = ICCF_GetHint(ICCF_GetInst(), *h, len, &selStart, &selEnd, &needsSlashes);
+        NSCAssert(hint != NULL, @"Internal error: can't get protocol hint for URL");
+
+        if (needsSlashes) {
+            ICCF_AddSlashes(h, hint);
+            len = selEnd = GetHandleSize(h);
+        }
+
+        err = ICCF_DoURLAction(ICCF_GetInst(), hint, *h, selStart, selEnd, action);
+        ICCF_OSErrCAssert(err, @"ICCF_DoURLAction");
+        
+    NS_HANDLER
+        DisposeHandle(h);
+        [localException raise];
+    NS_ENDHANDLER
+
+    DisposeHandle(h);    
+}
+
+// XXX not sure what to do if there's already a selection; BBEdit and MLTE extend it, Tex-Edit Plus doesn't.
+// RFC-ordained max URL length, just to avoid passing IC/LS multi-megabyte documents
+#if ICCF_DEBUG
+const long ICCF_MAX_URL_LEN = 60; // XXX change later
+#else
+const long ICCF_MAX_URL_LEN = 1024;
+#endif
+
+Boolean ICCF_enabled = true;
+
+BOOL ICCF_HandleException(NSException *e) {
+    if ([e reason] == nil || [[e reason] length] == 0)
+        return NO;
+    
+    if (ICCF_prefs.errorSoundEnabled) NSBeep();
+    if (!ICCF_prefs.errorDialogEnabled) return YES;
+    
+    int result = NSRunAlertPanel(ICCF_LocalizedString(@"AlertTitle"), ICCF_LocalizedString(@"AlertMessage%@"), nil, nil, ICCF_LocalizedString(@"AlertDisableButton"), e);
+    if (result != NSAlertDefaultReturn) {
+        result = NSRunAlertPanel(ICCF_LocalizedString(@"DisableAlertTitle"), ICCF_LocalizedString(@"DisableAlertMessage%@"), ICCF_LocalizedString(@"DisableAlertDisableButton"), ICCF_LocalizedString(@"DisableAlertDontDisableButton"), nil,
+           [(NSString *)ICCF_CopyAppName() autorelease]);
+        if (result == NSAlertDefaultReturn)
+            ICCF_enabled = NO;
+    }
+    return YES;
+}
+
+void ICCF_LaunchURLFromTextView(NSTextView *self) {
+    NSCharacterSet *urlLeftDelimiters = nil, *urlRightDelimiters = nil;
+    NSRange range = [self selectedRange], delimiterRange;
+    NSColor *insertionPointColor = [self insertionPointColor];
+    NSString *s = [[self textStorage] string]; // according to the class documentation, sending 'string' is guaranteed to be O(1)
+    unsigned extraLen;
+    int i;
+
+    NS_DURING
+
+        NSCAssert(range.location != NSNotFound, ICCF_LocalizedString(@"There is no insertion point or selection in the text field where you clicked"));
+        NSCAssert(s != nil, ICCF_LocalizedString(@"Sorry, ICeCoffEE is unable to locate the insertion point or selection"));
+
+        ICCF_StartIC();
+
+        NSCAssert([s length] != 0, ICCF_LocalizedString(@"No text was found"));
+
+        if (range.location == [s length]) range.location--; // work around bug in selectionRangeForProposedRange (r. 2845418)
+
+        range = [self selectionRangeForProposedRange: range granularity: NSSelectByWord];
+
+        // However, NSSelectByWord does not capture even the approximate boundaries of a URL
+        // (text to a space/line ending character); it'll stop at a period in the middle of a hostname.
+        // So, we expand it as follows:
+
+        ICCF_CheckRange(range);
+
+        ICCF_Delimiters(&urlLeftDelimiters, &urlRightDelimiters);
+
+        // XXX instead of 0, make this stop at the max URL length to prevent protracted searches
+        // add 1 to range to trap delimiters that are on the edge of the selection (i.e., <...)
+        delimiterRange = [s rangeOfCharacterFromSet: urlLeftDelimiters
+                                            options: NSLiteralSearch | NSBackwardsSearch
+                                              range: NSMakeRange(0, range.location + (range.location != [s length]))];
+        if (delimiterRange.location == NSNotFound) {
+            // extend to beginning of string
+            range.length += range.location;
+            range.location = 0;
+        } else {
+            NSCAssert(delimiterRange.length == 1, @"Internal error: delimiter matched range is not of length 1");
+            range.length += range.location - delimiterRange.location - 1;
+            range.location = delimiterRange.location + 1;
+        }
+
+        ICCF_CheckRange(range);
+
+        // XXX instead of length of string, make this stop at the max URL length to prevent protracted searches
+        // add 1 to range to trap delimiters that are on the edge of the selection (i.e., ...>)
+        extraLen = [s length] - range.location - range.length;
+        delimiterRange = [s rangeOfCharacterFromSet: urlRightDelimiters
+                                            options: NSLiteralSearch
+                                              range: NSMakeRange(range.location + range.length - (range.length != 0),
+                                                                 extraLen + (range.length != 0))];
+        if (delimiterRange.location == NSNotFound) {
+            // extend to end of string
+            range.length += extraLen;
+        } else {
+            NSCAssert(delimiterRange.length == 1, @"Internal error: delimiter matched range is not of length 1");
+            range.length += delimiterRange.location - range.location - range.length;
+        }
+
+        ICCF_CheckRange(range);
+
+        ICCF_ParseURL([s substringWithRange: range], &range);
+
+        [self setSelectedRange: range affinity: NSSelectionAffinityDownstream stillSelecting: NO];
+        [self display];
+
+        ICCF_LaunchURL([s substringWithRange: range], ICCF_KeyboardAction());
+
+        if (ICCF_prefs.textBlinkEnabled) {
+            for (i = 0 ; i < ICCF_prefs.textBlinkCount ; i++) {
+                NSRange emptyRange = {range.location, 0};
+                [self setSelectedRange: emptyRange affinity: NSSelectionAffinityDownstream stillSelecting: YES];
+                [self display];
+                usleep(kICBlinkDelayUsecs);
+                [self setInsertionPointColor: [self backgroundColor]];
+                [self setSelectedRange: range affinity: NSSelectionAffinityDownstream stillSelecting: YES];
+                [self display];
+                usleep(kICBlinkDelayUsecs);
+            }
+        }
+
+    NS_HANDLER
+        ICCF_HandleException(localException);
+    NS_ENDHANDLER
+
+    ICCF_StopIC();
+    [self setInsertionPointColor: insertionPointColor];
+}
+
+NSString * const ICCF_SERVICES_ITEM = @"ICeCoffEE Services Item";
+
+NSMenuItem *ICCF_ServicesMenuItem() {
+    NSMenuItem *servicesItem;
+    NSMenu *servicesMenu;
+    // don't want to use [[NSApp servicesMenu] title] because the Services menu may not have been created yet
+    NSString *servicesTitle = [[NSBundle bundleWithIdentifier: @"com.apple.AppKit"] localizedStringForKey: @"Services" value: nil table: @"ServicesMenu"];
+    if (servicesTitle == nil) {
+        ICLog(@"Can't get localized text for 'Services' in AppKit.framework");
+        servicesTitle = @"Services";
+    }
+    servicesMenu = [[NSMenu alloc] initWithTitle: servicesTitle];
+    servicesItem = [[NSMenuItem alloc] initWithTitle: servicesTitle action:nil keyEquivalent:@""];
+    [[NSApplication sharedApplication] setServicesMenu: servicesMenu];
+    [servicesItem setSubmenu: servicesMenu];
+    [servicesItem setRepresentedObject: ICCF_SERVICES_ITEM];
+    [servicesMenu release];
+    return [servicesItem autorelease];
+}
+
+static const unichar UNICHAR_BLACK_RIGHT_POINTING_SMALL_TRIANGLE = 0x25b8;
+
+// returns YES if menu contains useful items, NO otherwise
+BOOL ICCF_ConsolidateServicesMenu(NSMenu *menu, NSDictionary *serviceOptions) {
+    [menu update]; // doesn't propagate to submenus, so we need to do this first
+    NSEnumerator *enumerator = [[menu itemArray] objectEnumerator];
+    NSMenuItem *menuItem;
+    NSMenu *submenu;
+    NSDictionary *itemOptions = nil;
+    BOOL shouldKeepItem = NO, shouldKeepMenu = NO;
+
+    while ( (menuItem = [enumerator nextObject]) != nil) {
+        if (serviceOptions != nil)
+            itemOptions = [serviceOptions objectForKey: [menuItem title]];
+        if ([[itemOptions objectForKey: (NSString *)kICServiceHidden] boolValue]) {
+            shouldKeepItem = NO;
+        } else if ( (submenu = [menuItem submenu]) != nil) {
+            shouldKeepItem = ICCF_ConsolidateServicesMenu(submenu, [itemOptions objectForKey: (NSString *)kICServiceSubmenu]);
+            if (shouldKeepItem && [submenu numberOfItems] == 1) { // consolidate
+                NSMenuItem *serviceItem = [[submenu itemAtIndex: 0] retain];
+                [serviceItem setTitle:
+                    [NSString stringWithFormat: @"%@ %@ %@", [menuItem title], [NSString stringWithCharacters: &UNICHAR_BLACK_RIGHT_POINTING_SMALL_TRIANGLE length: 1], [serviceItem title]]];
+
+                int serviceIndex = [menu indexOfItem: menuItem];
+                [submenu removeItemAtIndex: 0]; // can't have item in two menus
+                [menu removeItemAtIndex: serviceIndex];
+                [menu insertItem: serviceItem atIndex: serviceIndex];
+                [serviceItem release];
+            }
+        } else {
+            shouldKeepItem = [menuItem isEnabled];
+        }
+        if (shouldKeepItem) {
+            shouldKeepMenu = YES;
+        } else {
+            [menu removeItem: menuItem];
+        }
+    }
+
+    return shouldKeepMenu;
+}
+
+NSMenuItem *ICCF_ContextualServicesMenuItem() {
+    NSMenuItem *servicesItem = ICCF_ServicesMenuItem();
+    if (ICCF_ConsolidateServicesMenu([servicesItem submenu], (NSDictionary *)ICCF_prefs.serviceOptions))
+        return servicesItem;
+    else
+        return nil;
+}
+
+void ICCF_AddRemoveServicesMenu() {
+    // needed because:
+    // (a) we get called before the runloop has properly started and will crash if we don't delay on app startup
+    // (b) the APE message handler calls us from another thread and nothing happens if we try to add a menu on it
+    [ICeCoffEE performSelectorOnMainThread: @selector(IC_addRemoveServicesMenu) withObject: nil waitUntilDone: NO];
+}
+
+NSMenu *ICCF_MenuForEvent(NSView *self, NSMenu *contextMenu, NSEvent *e) {
+    if (contextMenu != nil && [e type] == NSRightMouseDown || ([e type] == NSLeftMouseDown && [e modifierFlags] & NSControlKeyMask)) {
+        int servicesItemIndex = [contextMenu indexOfItemWithRepresentedObject: ICCF_SERVICES_ITEM];
+        // always regenerate: make sure menu reflects context
+        if (servicesItemIndex != -1) {
+            [contextMenu removeItemAtIndex: servicesItemIndex];
+            [contextMenu removeItemAtIndex: servicesItemIndex - 1];
+        }
+        if (ICCF_prefs.servicesInContextualMenu) {
+            NSMenuItem *contextualServicesItem = ICCF_ContextualServicesMenuItem();
+            if (contextualServicesItem != nil) {
+                [contextMenu addItem: [NSMenuItem separatorItem]];
+                [contextMenu addItem: contextualServicesItem];
+            }
+        }
+    }
+    return contextMenu;
+}
+
+@implementation ICeCoffEE
+
++ (void)IC_addRemoveServicesMenu;
+{
+    NSMenu *mainMenu = [[NSApplication sharedApplication] mainMenu];
+    static NSMenuItem *servicesItem = nil;
+    
+    if (servicesItem == nil && ICCF_prefs.servicesInMenuBar) {
+        servicesItem = [ICCF_ServicesMenuItem() retain];
+
+        int insertLoc = [mainMenu indexOfItemWithSubmenu: [NSApp windowsMenu]];
+        if (insertLoc == -1)
+            insertLoc = [mainMenu numberOfItems];
+
+        [mainMenu insertItem: servicesItem atIndex: insertLoc];
+    } else if (servicesItem != nil && !ICCF_prefs.servicesInMenuBar) {
+        [mainMenu removeItem: servicesItem];
+        [servicesItem release];
+        servicesItem = nil;
+    }
+    [[NSApp servicesMenu] update]; // enable keyboard equivalents
+}
+
+// XXX localization?
+- (NSMenu *)menuForEvent:(NSEvent *)e;
+{
+    NSMenu *myMenu = [super menuForEvent: e];
+    return ICCF_MenuForEvent(self, myMenu, e);
+}
+
+- (void)mouseDown:(NSEvent *)e;
+{
+#if ICCF_DEBUG
+    static BOOL down = NO;
+    if (down) {
+        ICLog(@"recursive invocation!");
+        return;
+    }
+    down = YES;
+    ICLog(@"ICeCoffEE down: %@", e);
+#endif
+    if (ICCF_enabled && ICCF_prefs.commandClickEnabled && ICCF_EventIsCommandMouseDown(e)) {
+        // don't want to trigger selection extension or anything else; pass through as a plain click
+        [super mouseDown: [NSEvent mouseEventWithType: NSLeftMouseDown location: [e locationInWindow] modifierFlags: 0 timestamp: [e timestamp] windowNumber: [e windowNumber] context: [e context] eventNumber: [e eventNumber] clickCount: 1 pressure: 0]];
+        // we don't actually get a mouseUp event, just wait for mouseDown to return
+        NSEvent *upEvent = [[self window] currentEvent];
+        NSPoint downPt = [e locationInWindow];
+        NSPoint upPt = [upEvent locationInWindow];
+        ICLog(@"next: %@", upEvent);
+        NSAssert([upEvent type] == NSLeftMouseUp, @"NSTextView mouseDown: did not return with current event as mouse up!");
+        if (abs(downPt.x - upPt.x) <= kICHysteresisPixels && abs(downPt.y - upPt.y) <= kICHysteresisPixels) {
+            ICCF_LaunchURLFromTextView(self);
+        }
+    } else {
+        [super mouseDown: e];
+    }
+#if ICCF_DEBUG
+    down = NO;
+#endif
+}
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEAction.c
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEAction.c	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEAction.c	(revision 170)
@@ -0,0 +1,314 @@
+/*
+ *  ICeCoffEEAction.c
+ *  ICeCoffEE APE
+ *
+ *  Created by Nicholas Riley on Wed Jan 29 2003.
+ *  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+ *
+ */
+
+#include "ICeCoffEEAction.h"
+#include "ICeCoffEEConfig.h"
+#include "ICeCoffEEShared.h"
+#include "ICeCoffEEBookmarks.h"
+
+/* thanks to Slava Karpenko for this one! */
+OSStatus _LSCopyApplicationURLsForItemURL(CFURLRef inURL, LSRolesMask inRoleMask, CFArrayRef *outApps); // outApps to be CFReleased()
+
+#define THROW_ERR(e) { err = e; goto END; }
+
+static CFStringRef ICCF_NameWithLocation(CFStringRef name, CFURLRef url) {
+    CFURLRef urlMinus = CFURLCreateCopyDeletingLastPathComponent(NULL, url);
+    CFStringRef urlString = CFURLCopyFileSystemPath(urlMinus, kCFURLPOSIXPathStyle);
+    CFStringRef nameWithLocationTemplate = ICCF_CopyLocalizedString(CFSTR("App%@Location%@"));
+    CFStringRef nameWithLocation = CFStringCreateWithFormat(NULL, NULL, nameWithLocationTemplate, name, urlString);
+    
+    SAFE_RELEASE(nameWithLocationTemplate);
+    SAFE_RELEASE(urlMinus);
+    SAFE_RELEASE(urlString);
+    return nameWithLocation;
+}
+
+static const MenuItemIndex kICAppMenuItemHasPath = 0xfffe;
+
+typedef struct {
+    CFURLRef defaultAppURL; // URL of default app, set to NULL after added to menu
+    CFMutableSetRef appPaths;
+    CFMutableDictionaryRef appItemTitles; // keys: URLs; values: item titles (CFString)
+    CFMutableDictionaryRef appURLs; // keys: app display names (CFString), values: URL of item without path appended, or NULL if already appended (at least 2 items with this name exist)
+    MenuRef menu;
+} icAppMenuContext;
+
+static OSStatus ICCF_AddAppItemTitle(icAppMenuContext *ctx, CFURLRef appURL) {
+    CFStringRef appName = NULL, appItemTitle = NULL;
+    CFBundleRef appBundle = NULL;
+    OSStatus err = noErr;
+
+    CFStringRef appPath = CFURLCopyPath(appURL);
+    // only one entry for each path
+    if (CFSetContainsValue(ctx->appPaths, appPath))
+        return dupFNErr;
+    CFSetAddValue(ctx->appPaths, appPath);
+
+    if ( (err = LSCopyDisplayNameForURL(appURL, &appName)) != noErr)
+        return err;
+
+    // if we encounter multiple applications with the same display name, add locations to the menu item titles to disambiguate them
+    CFURLRef sameAppURL;
+    Boolean shouldAppendLocation;
+    if ( (shouldAppendLocation = CFDictionaryGetValueIfPresent(ctx->appURLs, appName, (const void **)&sameAppURL)) && (CFTypeRef)sameAppURL != kCFNull) {
+        // this app is the second encountered with the same name; go back and fix the menu item title of the first app
+        CFStringRef sameAppItemTitle = CFDictionaryGetValue(ctx->appItemTitles, sameAppURL);
+        CFStringRef appItemTitleWithVersion = ICCF_NameWithLocation(sameAppItemTitle, sameAppURL);
+        CFDictionarySetValue(ctx->appItemTitles, sameAppURL, appItemTitleWithVersion);
+        SAFE_RELEASE(appItemTitleWithVersion);
+        CFDictionarySetValue(ctx->appURLs, appName, kCFNull);
+    }
+
+    CFRetain(appName);
+    appItemTitle = appName;
+
+    if ( (appBundle = CFBundleCreate(NULL, appURL)) != NULL) {
+        // prefer a short version string, e.g. "1.0 Beta" instead of "51" for Safari
+        CFStringRef appVersion = CFBundleGetValueForInfoDictionaryKey(appBundle, CFSTR("CFBundleShortVersionString"));
+        if (appVersion == NULL)
+            appVersion = CFBundleGetValueForInfoDictionaryKey(appBundle, kCFBundleVersionKey);
+        if (appVersion != NULL) {
+            appItemTitle = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@ (%@)"), appName, appVersion);
+            CFRelease(appName);
+        }
+        CFRelease(appBundle);
+    }
+
+    if (shouldAppendLocation) {
+        CFStringRef appItemTitleWithVersion = ICCF_NameWithLocation(appItemTitle, appURL);
+        CFRelease(appItemTitle);
+        appItemTitle = appItemTitleWithVersion;
+    } else {
+        CFDictionarySetValue(ctx->appURLs, appName, appURL);
+    }
+
+    if (ctx->defaultAppURL != NULL && CFEqual(appURL, ctx->defaultAppURL)) {
+        CFStringRef defaultFormat = ICCF_CopyLocalizedString(CFSTR("DefaultApp%@"));
+        CFStringRef appItemTitleWithDefault = CFStringCreateWithFormat(NULL, NULL, defaultFormat, appItemTitle);
+        CFRelease(appItemTitle);
+        appItemTitle = appItemTitleWithDefault;
+        ctx->defaultAppURL = NULL; // mark as added
+    }
+
+    CFDictionarySetValue(ctx->appItemTitles, appURL, appItemTitle);
+    CFRelease(appItemTitle);
+
+    return noErr;
+}
+
+static OSStatus ICCF_AddTitledAppToMenu(icAppMenuContext *ctx, CFURLRef appURL, MenuCommand menuCommand) {
+    CFStringRef appItemTitle = NULL;
+    IconRef appIcon = NULL;
+    FSRef appFSR;
+    SInt16 label;
+    MenuItemIndex menuItemIndex;
+    OSStatus err = noErr;
+
+    appItemTitle = CFDictionaryGetValue(ctx->appItemTitles, appURL);
+    if (appItemTitle == NULL) return fnfErr;
+    
+    err = AppendMenuItemTextWithCFString(ctx->menu, appItemTitle, 0, 0, &menuItemIndex);
+    if (err != noErr) return err;
+
+    if (!CFURLGetFSRef(appURL, &appFSR)) return paramErr;
+    err = GetIconRefFromFileInfo(&appFSR, 0, NULL, kFSCatInfoNone, NULL, kIconServicesNormalUsageFlag, &appIcon, &label);
+    if (err != noErr) return err;
+
+    SetMenuItemIconHandle(ctx->menu, menuItemIndex, kMenuIconRefType, (Handle)appIcon);
+    SetMenuItemCommandID(ctx->menu, menuItemIndex, menuCommand);
+    SetMenuItemRefCon(ctx->menu, menuItemIndex, (UInt32)appURL);
+    ReleaseIconRef(appIcon);
+
+    return err;
+}
+
+static OSStatus ICCF_AddAppToMenu(icAppMenuContext *ctx, CFURLRef appURL, MenuCommand menuCommand) {
+    OSStatus err = ICCF_AddAppItemTitle(ctx, appURL);
+    switch (err) {
+        case noErr: break;
+        case dupFNErr: return noErr;
+        default: return err;
+    }
+    return ICCF_AddTitledAppToMenu(ctx, appURL, menuCommand);
+}    
+
+CFComparisonResult ICCF_CompareURLsByItemTitle(const void *url1, const void *url2, void *appItemTitles) {
+    CFStringRef appItemTitle1 = CFDictionaryGetValue((CFDictionaryRef)appItemTitles, (CFURLRef)url1);
+    CFStringRef appItemTitle2 = CFDictionaryGetValue((CFDictionaryRef)appItemTitles, (CFURLRef)url2);
+    return CFStringCompareWithOptions(appItemTitle1, appItemTitle2,
+                                      CFRangeMake(0, CFStringGetLength(appItemTitle1)),
+                                      kCFCompareCaseInsensitive | kCFCompareNumerically);
+}
+
+enum {
+    kICURLActionOpenWith = 'OpnW',
+    kICURLActionAddBookmark = 'AddB'
+};
+
+OSStatus ICCF_DoURLActionMenu(ICInstance inst, CFURLRef url, LSLaunchFlags launchFlags) {
+    CFArrayRef appURLsUnsorted = NULL; // matching app URLs
+    CFMutableArrayRef appURLs = NULL; // matching app URLs sorted by item title
+    CFArrayRef urlArray = NULL; // single-URL array
+    icAppMenuContext ctx = {NULL, NULL, NULL, NULL};
+    OSStatus err;
+    
+    if ( (err = _LSCopyApplicationURLsForItemURL(url, kLSRolesAll, &appURLsUnsorted)) != noErr)
+        THROW_ERR(err);
+
+    CFIndex appCount = 0;
+    if (appURLsUnsorted == NULL || (appCount = CFArrayGetCount(appURLsUnsorted)) == 0)
+        THROW_ERR(kLSApplicationNotFoundErr);
+
+    if ( (appURLs = CFArrayCreateMutableCopy(NULL, appCount, appURLsUnsorted)) == NULL)
+        THROW_ERR(memFullErr);
+
+    if ( (ctx.appPaths = CFSetCreateMutable(NULL, appCount, &kCFCopyStringSetCallBacks)) == NULL)
+        THROW_ERR(memFullErr);
+
+    if ( (ctx.appItemTitles = CFDictionaryCreateMutable(NULL, appCount, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks)) == NULL)
+        THROW_ERR(memFullErr);
+
+    if ( (ctx.appURLs = CFDictionaryCreateMutable(NULL, appCount, &kCFCopyStringDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks)) == NULL)
+        THROW_ERR(memFullErr);
+
+    LSGetApplicationForURL(url, kLSRolesAll, NULL, &ctx.defaultAppURL);
+
+    CFIndex appIndex;
+    CFURLRef appURL;
+    for (appIndex = 0 ; appIndex < appCount ; appIndex++) {
+        appURL = CFArrayGetValueAtIndex(appURLs, appIndex);
+        err = ICCF_AddAppItemTitle(&ctx, appURL);
+        switch (err) {
+            case noErr: break;
+            case dupFNErr:
+                CFArrayRemoveValueAtIndex(appURLs, appIndex);
+                appIndex--;
+                appCount--;
+                break;
+            default:
+                THROW_ERR(err);
+        } 
+    }
+
+    CFArraySortValues(appURLs, CFRangeMake(0, appCount), ICCF_CompareURLsByItemTitle, ctx.appItemTitles);
+    
+    if ( (err = CreateNewMenu(0, kMenuAttrExcludesMarkColumn, &ctx.menu)) != noErr)
+        THROW_ERR(err);
+    
+    MenuItemIndex menuItemIndex;
+    if ( (err = AppendMenuItemTextWithCFString(ctx.menu, ICCF_CopyLocalizedString(CFSTR("Open Location With")), kMenuItemAttrDisabled, 0, &menuItemIndex)) != noErr)
+        THROW_ERR(err);
+
+    if ( (urlArray = CFArrayCreate(NULL, (const void **)&url, 1, &kCFTypeArrayCallBacks)) == NULL)
+        THROW_ERR(memFullErr);
+
+    for (appIndex = 0 ; appIndex < appCount ; appIndex++) {
+        appURL = CFArrayGetValueAtIndex(appURLs, appIndex);
+
+        if ( (err = ICCF_AddTitledAppToMenu(&ctx, appURL, kICURLActionOpenWith)) != noErr)
+            THROW_ERR(err);
+    }
+    // sometimes the default protocol handler won't be on the list because it doesnÕt claim to handle that protocol; add it anyway
+    if (ctx.defaultAppURL != NULL) {
+        if ( (err = ICCF_AddAppToMenu(&ctx, ctx.defaultAppURL, kICURLActionOpenWith)) != noErr)
+            THROW_ERR(err);
+    }
+
+    appURL = ICCF_GetBookmarkHelperURL(inst);
+    if (appURL != NULL) {
+        if ( (err = AppendMenuItemTextWithCFString(ctx.menu, CFSTR(""), kMenuItemAttrSeparator, 0, NULL)) != noErr)
+            THROW_ERR(err);
+        if ( (err = AppendMenuItemTextWithCFString(ctx.menu, ICCF_CopyLocalizedString(CFSTR("Add Bookmark")), kMenuItemAttrDisabled, 0, &menuItemIndex)) != noErr)
+            THROW_ERR(err);
+        // the app won't show up at the bottom if someone cmd-option-clicks on 'bookmark:', but they'd have to be crazy to do that anyway
+        if ( (err = ICCF_AddAppToMenu(&ctx, appURL, kICURLActionAddBookmark)) != noErr)
+            THROW_ERR(err);
+    }
+    
+    InsertMenu(ctx.menu, -1);
+    Point mousePoint;
+    GetGlobalMouse(&mousePoint);
+    long selectedAppIndex = PopUpMenuSelect(ctx.menu, mousePoint.v + 18, mousePoint.h - 30, 0/*popUpItem*/);
+    if (selectedAppIndex == 0) {
+        err = userCanceledErr;
+    } else {
+        CFURLRef appURL = NULL;
+        MenuCommand menuCommand;
+        err = GetMenuItemRefCon(ctx.menu, selectedAppIndex, (void *)&appURL);
+        if (err == noErr) {
+            err = GetMenuItemCommandID(ctx.menu, selectedAppIndex, &menuCommand);
+            if (err == noErr) {
+                if (menuCommand == kICURLActionOpenWith) {
+                    LSLaunchURLSpec lsSpec = {appURL, urlArray, NULL, launchFlags};
+                    err = LSOpenFromURLSpec(&lsSpec, NULL);
+                } else if (menuCommand == kICURLActionAddBookmark) {
+                    err = ICCF_DoBookmarkDialog(inst, CFURLGetString(url));
+                }
+            }
+        }
+    }
+    
+END:
+    if (ctx.menu != NULL) {
+        DeleteMenu(GetMenuID(ctx.menu));
+        DisposeMenu(ctx.menu);
+    }
+    SAFE_RELEASE(urlArray);
+    SAFE_RELEASE(appURLsUnsorted);
+    SAFE_RELEASE(appURLs);
+    SAFE_RELEASE(ctx.appPaths);
+    SAFE_RELEASE(ctx.appItemTitles);
+    SAFE_RELEASE(ctx.appURLs);
+    
+    return err;
+}
+
+OSStatus ICCF_DoURLActionLaunch(ICInstance inst, CFURLRef url, LSLaunchFlags launchFlags) {
+    CFArrayRef urlArray = CFArrayCreate(NULL, (const void **)&url, 1, &kCFTypeArrayCallBacks);
+    LSLaunchURLSpec lsSpec = {NULL, urlArray, NULL, launchFlags, NULL};
+    OSStatus err;
+
+    if (urlArray == NULL)
+        THROW_ERR(memFullErr);
+
+    err = LSOpenFromURLSpec(&lsSpec, NULL);
+
+END:
+    SAFE_RELEASE(urlArray);
+
+    return err;
+}
+
+OSStatus ICCF_DoURLAction(ICInstance inst, ConstStr255Param hint, const char *urlData, long startIndex, long endIndex, iccfURLAction action) {
+    Handle h = NewHandle(0);
+    CFURLRef url = NULL;
+    LSLaunchFlags launchFlags = kLSLaunchDefaults;
+    OSStatus err;
+
+    if (h == NULL) return MemError();
+
+    if ( (err = ICParseURL(inst, hint, urlData + startIndex, endIndex - startIndex + 1,
+                           &startIndex, &endIndex, h)) != noErr) THROW_ERR(err);
+
+    if ( (url = CFURLCreateWithBytes(NULL, *h, GetHandleSize(h), kCFStringEncodingASCII,
+                                     NULL)) == NULL) THROW_ERR(paramErr);
+
+    if (action.launchInBackground) launchFlags |= kLSLaunchDontSwitch;
+
+    if (action.presentMenu)
+        err = ICCF_DoURLActionMenu(inst, url, launchFlags);
+    else
+        err = ICCF_DoURLActionLaunch(inst, url, launchFlags);
+
+END:
+    if (h != NULL) DisposeHandle(h);
+    SAFE_RELEASE(url);
+
+    return err;
+}
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEAction.h
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEAction.h	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEAction.h	(revision 170)
@@ -0,0 +1,24 @@
+/*
+ *  ICeCoffEEAction.h
+ *  ICeCoffEE APE
+ *
+ *  Created by Nicholas Riley on Wed Jan 29 2003.
+ *  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+ *
+ */
+
+#ifndef _H_ICeCoffEEAction
+#define _H_ICeCoffEEAction
+
+#include <Carbon/Carbon.h>
+
+// per-action options
+
+typedef struct {
+    Boolean presentMenu;
+    Boolean launchInBackground;
+} iccfURLAction;
+
+OSStatus ICCF_DoURLAction(ICInstance inst, ConstStr255Param hint, const char *urlData, long startIndex, long endIndex, iccfURLAction action);
+
+#endif /* _H_ICeCoffEEAction */
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEBookmarks.c
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEBookmarks.c	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEBookmarks.c	(revision 170)
@@ -0,0 +1,214 @@
+/*
+ *  ICeCoffEEBookmarks.c
+ *  ICeCoffEE APE
+ *
+ *  Created by Nicholas Riley on Sat Feb 01 2003.
+ *  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+ *
+ */
+
+#include "ICeCoffEEBookmarks.h"
+#include "ICeCoffEEConfig.h"
+
+// Make sure the encoding of this file is MacRoman, or this constant wonÕt work!
+#define kICBookmarkHelper		"\pHelper¥bookmark"
+#define kICBookmarkScheme		"bookmark"
+
+enum {
+    kICBookmarkURLTooLongErr = 93800,
+    kICBookmarkNameTooLongErr = 93801,
+    kICBookmarkDescriptionTooLongErr = 93802,
+    kICBookmarkNoHelperErr = 93803
+};
+
+CFURLRef ICCF_GetBookmarkHelperURL(ICInstance inst) {
+    OSStatus err;
+    CFURLRef helperURL;
+
+    // try to get creator from Internet Config
+    ICAttr junkAttr;
+    ICAppSpec helperSpec;
+    long helperSpecSize = sizeof(helperSpec);
+
+    err = ICGetPref(inst, kICBookmarkHelper, &junkAttr, (void *)&helperSpec, &helperSpecSize);
+    if (err == noErr && helperSpecSize == sizeof(helperSpec)) {
+        err = LSFindApplicationForInfo(helperSpec.fCreator, NULL, NULL, NULL, &helperURL);
+        if (err == noErr) return helperURL;
+    }
+
+    // try to use LaunchServices
+    CFURLRef bookmarkURL = CFURLCreateWithString(NULL, CFSTR(kICBookmarkScheme":"), NULL);
+    err = LSGetApplicationForURL(bookmarkURL, kLSRolesAll, NULL, &helperURL);
+    if (bookmarkURL != NULL) CFRelease(bookmarkURL);
+    if (err == noErr) return helperURL;
+
+    return NULL;
+}
+
+static const ProcessSerialNumber kICNoProcess = {0, kNoProcess};
+
+static OSStatus ICCF_GetPSNFromHelperURL(CFURLRef helperURL, ProcessSerialNumber *inPSN) {
+    if (helperURL == NULL) return kICBookmarkNoHelperErr;
+
+    FSRef helperFSR;
+    if (!CFURLGetFSRef(helperURL, &helperFSR)) return kICBookmarkNoHelperErr;
+
+    // locate running application
+    ProcessSerialNumber psn = kICNoProcess;
+    FSRef fsr;
+    OSStatus err;
+    while ( (err = GetNextProcess(&psn)) == noErr && psn.lowLongOfPSN != kNoProcess) {
+        err = GetProcessBundleLocation(&psn, &fsr);
+        if (err == noErr && FSCompareFSRefs(&fsr, &helperFSR) == noErr) {
+            *inPSN = psn;
+            return noErr;
+        }
+    }
+
+    // launch application
+    FSSpec fss;
+    err = FSGetCatalogInfo(&helperFSR, kFSCatInfoNone, NULL, NULL, &fss, NULL);
+    if (err != noErr) return err;
+    LaunchParamBlockRec launchPB = {
+        0, 0, extendedBlock, extendedBlockLen,
+        kNilOptions, launchNoFileFlags | launchContinue,
+        &fss, kICNoProcess, 0, 0, 0, NULL
+    };
+
+    err = LaunchApplication(&launchPB);
+    if (err != noErr) {
+        if (err == paramErr) return userCanceledErr; // if app force quit while launching
+        return err;
+    }
+
+    *inPSN = launchPB.launchProcessSN;
+    return noErr;
+}
+
+static OSStatus ICCF_AddBookmark(ICInstance inst, CFStringRef url, CFStringRef name, CFStringRef description) {
+
+    if (url == NULL || CFStringGetLength(url) == 0) return noErr;
+
+    CFURLRef helperURL = ICCF_GetBookmarkHelperURL(inst);
+    if (helperURL == NULL) return kICBookmarkNoHelperErr;
+
+    OSStatus err;
+    ProcessSerialNumber psn;
+    err = ICCF_GetPSNFromHelperURL(helperURL, &psn);
+    CFRelease(helperURL);
+    if (err != noErr) return err;
+    if (psn.highLongOfPSN == kICNoProcess.highLongOfPSN && psn.lowLongOfPSN == kICNoProcess.lowLongOfPSN)
+        return kICBookmarkNoHelperErr;
+
+    AppleEvent event;
+    char buf[1024]; // XXX make length a constant
+
+    if (!CFStringGetCString(url, buf, sizeof(buf), kCFStringEncodingASCII))
+        return kICBookmarkURLTooLongErr;
+
+    // XXX can I specify Unicode text ('utxt'?) here to get internationalization support?
+    err = AEBuildAppleEvent('SURL', 'SURL', typeProcessSerialNumber, &psn, sizeof(psn),
+                            kAutoGenerateReturnID, kAnyTransactionID,
+                            &event, NULL,
+                            "'----':TEXT(@)", buf);
+    if (err != noErr) return err;
+
+    if (name != NULL) {
+        if (!CFStringGetCString(name, buf, sizeof(buf), CFStringGetSystemEncoding()))
+            return kICBookmarkNameTooLongErr;
+
+        err = AEBuildParameters(&event, NULL, "'name':TEXT(@)", buf);
+        if (err != noErr) return err;
+    }
+
+    if (description != NULL) { // XXX 256 hard-coded from limit of URL Manager Pro notes field
+        if (!CFStringGetCString(description, buf, 256, CFStringGetSystemEncoding()))
+            return kICBookmarkDescriptionTooLongErr;
+
+        err = AEBuildParameters(&event, NULL, "'clip':TEXT(@)", buf);
+        if (err != noErr) return err;
+    }
+
+    AppleEvent nullReply = {typeNull, nil};
+
+    err = AESend(&event, &nullReply, kAENoReply, kAENormalPriority, kNoTimeOut, nil, nil);
+    (void)AEDisposeDesc(&event);
+    if (err != noErr) return err;
+
+    (void)AEDisposeDesc(&nullReply); // according to docs, don't call unless AESend returned successfully
+
+    return noErr;
+}
+
+// XXX workaround for CFUserNotificationCreate log message in 10.2.4 at least
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+// XXX end workaround
+
+OSStatus ICCF_DoBookmarkDialog(ICInstance inst, CFStringRef url) {
+
+    CFMutableDictionaryRef dict = CFDictionaryCreateMutable(NULL, 10, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
+
+    if (dict == NULL) return memFullErr;
+
+    OSStatus err;
+    
+    CFURLRef bundleURL = CFBundleCopyBundleURL(ICCF_bundle);
+    CFDictionaryAddValue(dict, kCFUserNotificationLocalizationURLKey, bundleURL);
+    SAFE_RELEASE(bundleURL);
+
+    const CFStringRef textFieldTitles[] = { ICCF_CopyLocalizedString(CFSTR("Location:")), ICCF_CopyLocalizedString(CFSTR("Name:")), ICCF_CopyLocalizedString(CFSTR("Description:")) };
+    const CFStringRef textFieldValues[] = { url, CFSTR(""), CFSTR("") };
+    CFArrayRef textFieldTitlesArray = CFArrayCreate(NULL, (const void **)&textFieldTitles, 3, &kCFTypeArrayCallBacks);
+    CFArrayRef textFieldValuesArray = CFArrayCreate(NULL, (const void **)&textFieldValues, 3, &kCFTypeArrayCallBacks);
+
+    CFDictionaryAddValue(dict, kCFUserNotificationAlertHeaderKey, ICCF_CopyLocalizedString(CFSTR("Add Bookmark")));
+    CFDictionaryAddValue(dict, kCFUserNotificationAlertMessageKey, ICCF_CopyLocalizedString(CFSTR("Bookmark name and description are optional.")));
+    CFDictionaryAddValue(dict, kCFUserNotificationTextFieldTitlesKey, textFieldTitlesArray);
+    CFDictionaryAddValue(dict, kCFUserNotificationTextFieldValuesKey, textFieldValuesArray);
+    CFDictionaryAddValue(dict, kCFUserNotificationDefaultButtonTitleKey, ICCF_CopyLocalizedString(CFSTR("Add")));
+    CFDictionaryAddValue(dict, kCFUserNotificationAlternateButtonTitleKey, ICCF_CopyLocalizedString(CFSTR("Cancel")));
+    if (textFieldTitlesArray != NULL) CFRelease(textFieldTitlesArray);
+    if (textFieldValuesArray != NULL) CFRelease(textFieldValuesArray);
+
+    // XXX suppress log message from Apple's code:
+    // 2003-02-02 17:48:26.896 TextEdit[2790] CFLog (20): Add Bookmark:  Bookmark name and description are optional.
+    int errfd = dup(STDERR_FILENO), nullfd = open("/dev/null", O_WRONLY, 0);
+    // need to have something open in STDERR_FILENO because if it isn't,
+    // CFLog will log to /dev/console
+    dup2(nullfd, STDERR_FILENO);
+    close(nullfd);
+    CFUserNotificationRef notification = CFUserNotificationCreate(NULL, 0, kCFUserNotificationPlainAlertLevel, &err, dict);
+    dup2(errfd, STDERR_FILENO);
+    close(errfd);
+    if (notification == NULL) {
+        CFRelease(dict);
+        return err;
+    }
+    
+    CFOptionFlags responseFlags;
+    CFUserNotificationReceiveResponse(notification, 0, &responseFlags);
+    if (responseFlags != kCFUserNotificationDefaultResponse)
+        return userCanceledErr;
+
+    CFDictionaryRef responseDict = CFUserNotificationGetResponseDictionary(notification);
+    if (responseDict == NULL)
+        return userCanceledErr;
+
+    textFieldValuesArray = CFDictionaryGetValue(responseDict, kCFUserNotificationTextFieldValuesKey);
+    if (textFieldValuesArray == NULL)
+        return userCanceledErr;
+
+    url = CFArrayGetValueAtIndex(textFieldValuesArray, 0);
+    CFStringRef name = CFArrayGetValueAtIndex(textFieldValuesArray, 1);
+    CFStringRef description = CFArrayGetValueAtIndex(textFieldValuesArray, 2);
+
+    err = ICCF_AddBookmark(inst, url, name, description);
+
+    SAFE_RELEASE(url);
+    SAFE_RELEASE(name);
+    SAFE_RELEASE(description);
+
+    return err;
+}
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEBookmarks.h
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEBookmarks.h	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEBookmarks.h	(revision 170)
@@ -0,0 +1,13 @@
+/*
+ *  ICeCoffEEBookmarks.h
+ *  ICeCoffEE APE
+ *
+ *  Created by Nicholas Riley on Sat Feb 01 2003.
+ *  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+ *
+ */
+
+#include <Carbon/Carbon.h>
+
+OSStatus ICCF_DoBookmarkDialog(ICInstance inst, CFStringRef url);
+CFURLRef ICCF_GetBookmarkHelperURL(ICInstance inst);
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEConfig.h
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEConfig.h	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEConfig.h	(revision 170)
@@ -0,0 +1,65 @@
+/*
+ *  ICeCoffEEConfig.h
+ *  ICeCoffEE APE
+ *
+ *  Created by Nicholas Riley on Sun Jan 26 2003.
+ *  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+ *
+ */
+
+#ifndef _H_ICeCoffEEConfig
+#define _H_ICeCoffEEConfig
+
+#include <CoreFoundation/CoreFoundation.h>
+#include "ICeCoffEEAction.h"
+
+// constants
+extern const long ICCF_MAX_URL_LEN;
+
+// per-app runtime configuration
+extern Boolean ICCF_enabled;
+
+typedef struct {
+    Boolean commandClickEnabled;
+    Boolean textBlinkEnabled;
+    CFIndex textBlinkCount; // ICeTEe used LMGetMenuFlash, no replacement in Carbon
+    Boolean servicesInContextualMenu;
+    Boolean servicesInMenuBar;
+    CFDictionaryRef serviceOptions;
+    Boolean terminalRequireOptionForSelfDrag;
+    Boolean errorSoundEnabled;
+    Boolean errorDialogEnabled;
+} iccfPrefRec;
+
+extern iccfPrefRec ICCF_prefs;
+
+extern CFBundleRef ICCF_bundle;
+
+// CF conveniences
+
+#define ICCF_CopyLocalizedString(key) \
+    CFBundleCopyLocalizedString(ICCF_bundle, (key), CFSTR(""), NULL)
+
+#define SAFE_RELEASE(e) { if (e != NULL) CFRelease(e); }
+
+// functions shared between Cocoa and Carbon implementations
+
+// returns a Pascal string containing the corresponding protocol hint (e.g. http, mailto)
+// if the text surrounding the range *selStart to *selEnd in urlData likely represents
+// an email address or "slack" (e.g. web.sabi.net/bm) URL
+// needsSlashes is set to true if the URL needs a '//' after the colon to be valid
+ConstStringPtr ICCF_GetHint(ICInstance inst, const char *urlData, Size length, long *selStart, long *selEnd, Boolean *needsSlashes);
+
+// adds two slashes to the beginning of the string in the handle (e.g. web.sabi.net or http:web.sabi.net)
+void ICCF_AddSlashes(Handle h, ConstStringPtr hint);
+
+// returns an explanation for the provided OSStatus in the supplied context
+// (Cocoa clients should use ICCF_ErrString instead - it's simpler to use)
+// if NULL is returned, the error is harmless (e.g., user cancelled)
+CFStringRef ICCF_CopyErrString(OSStatus err, CFStringRef context);
+
+// returns the application name, or "(unknown)" (not localized) if the application name
+// can't be determined
+CFStringRef ICCF_CopyAppName();
+
+#endif /* _H_ICeCoffEEConfig */
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEController.h
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEController.h	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEController.h	(revision 170)
@@ -0,0 +1,39 @@
+#import <Cocoa/Cocoa.h>
+#import <ApplicationEnhancer/APEManagerPrefPane.h>
+#import "CFPreferencesWrapper.h"
+
+@interface ICeCoffEEController : NSObject <APEManagerPrefPane>
+{
+    CFPreferencesWrapper_ICeCoffEE *prefs;
+    NSBundle *_apeBundle;
+    NSBundle *_bundle;
+
+    IBOutlet NSWindow *window;
+    IBOutlet NSTabView *tabView;
+    
+    IBOutlet NSButton *commandClickEnabled;
+    IBOutlet NSButton *textBlinkEnabled;
+    IBOutlet NSPopUpButton *textBlinkCount;
+    IBOutlet NSButton *servicesInContextualMenu;
+    IBOutlet NSButton *servicesInMenuBar;
+    IBOutlet NSButton *editContextualServices;
+    IBOutlet NSButton *terminalRequireOptionForSelfDrag;
+    IBOutlet NSButton *errorSoundEnabled;
+    IBOutlet NSButton *errorDialogEnabled;
+}
+
+- (id)initWithAPE:(NSBundle *)apeBundle andBundle:(NSBundle *)prefPaneBundle;
+- (void)setAPEBundle:(NSBundle*)apeBundle prefPaneBundle:(NSBundle *)aBundle;
+- (NSBundle *)bundle;
+
+- (IBAction)commandClickEnabled:(NSButton *)sender;
+- (IBAction)textBlinkEnabled:(NSButton *)sender;
+- (IBAction)textBlinkCount:(NSPopUpButton *)sender;
+- (IBAction)servicesInContextualMenu:(NSButton *)sender;
+- (IBAction)servicesInMenuBar:(NSButton *)sender;
+- (IBAction)editContextualServices:(NSButton *)sender;
+- (IBAction)terminalRequireOptionForSelfDrag:(NSButton *)sender;
+- (IBAction)errorSoundEnabled:(NSButton *)sender;
+- (IBAction)errorDialogEnabled:(NSButton *)sender;
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEController.m
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEController.m	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEController.m	(revision 170)
@@ -0,0 +1,167 @@
+//
+//	File:		ICeCoffEEController.m
+//
+//	Contains:	ICeCoffEE APE preference pane controller
+//
+//	Copyright:	Copyright (c) 2003, Nicholas Riley
+//			All Rights Reserved.
+//
+//	Author(s):	Nicholas Riley (Sun Jan 19 2003)
+//
+// ===========================================================================
+
+#import <ApplicationEnhancer/ApplicationEnhancer.h>
+#import "ICeCoffEEController.h"
+#import "ICeCoffEEShared.h"
+#import "ICeCoffEEServicePrefController.h"
+
+// Just a handy macro for localized strings from our bundle; unused in this project.
+#define NSLocalizedString_(key, comment) [[self bundle] localizedStringForKey:(key) value:@"" table:nil]
+
+@implementation ICeCoffEEController
+
+// This method should return an id of a class that implements the protocol
+// required by APE Manager.
+
++ (id)prefPaneHandlerForAPE:(NSBundle*)apeBundle andBundle:(NSBundle*)prefPaneBundle
+{
+    return [[self alloc] initWithAPE: apeBundle andBundle: prefPaneBundle];
+}
+
+// Init the instance of our class
+- (id)initWithAPE:(NSBundle*)apeBundle andBundle:(NSBundle*)prefPaneBundle
+{
+    [self setAPEBundle: apeBundle prefPaneBundle: prefPaneBundle];
+    
+    [NSBundle loadNibNamed:@"APE Manager plugin" owner:self]; // load our nib file; it will call our awakeFromNib method
+    
+    return self;
+}
+
+// This method is called when the preference pane is about to be shown.
+- (void)willLoad
+{
+    // we do nothing here
+}
+
+// This method is called when the preference pane will be dismissed.
+- (void)willUnload
+{
+    [prefs release];
+    prefs = nil;
+}
+
+// This method should return an NSView to be loaded into APE Manager preference
+// area.
+- (NSView *)mainView
+{
+    return [window contentView];
+}
+
+#define ICP(pref) (NSString *)kIC ## pref
+
+// This method is called once our nib file is loaded (we load it in the init method)
+- (void)awakeFromNib
+{
+    // load the preferences for our APE module
+    prefs = [[CFPreferencesWrapper_ICeCoffEE preferencesWithApplication: (NSString *)kICBundleIdentifier] retain];
+
+    CFBundleRef apeBundle = CFBundleCreate(NULL, (CFURLRef)[NSURL fileURLWithPath: [_apeBundle bundlePath]]);
+    if ([prefs integerForKey: ICP(LastLoadedVersion)] != CFBundleGetVersionNumber(apeBundle)) {
+        [tabView selectTabViewItemWithIdentifier: @"noPrefs"];
+        CFRelease(apeBundle);
+        return;
+    }
+    CFRelease(apeBundle);
+    [tabView selectTabViewItemWithIdentifier: @"prefs"];
+
+    [commandClickEnabled setState: [prefs boolForKey: ICP(CommandClickEnabled)]];
+    [self commandClickEnabled: nil];
+    [textBlinkEnabled setState: [prefs boolForKey: ICP(TextBlinkEnabled)]];
+    [self textBlinkEnabled: nil];
+    int blink = [prefs integerForKey: ICP(TextBlinkCount)];
+    if (blink != -1 && (blink = [textBlinkCount indexOfItemWithTag: blink]) != -1)
+        [textBlinkCount selectItemAtIndex: blink];
+    [servicesInContextualMenu setState: [prefs boolForKey: ICP(ServicesInContextualMenu)]];
+    [servicesInMenuBar setState: [prefs boolForKey: ICP(ServicesInMenuBar)]];
+    [errorSoundEnabled setState: [prefs boolForKey: ICP(ErrorSoundEnabled)]];
+    [errorDialogEnabled setState: [prefs boolForKey: ICP(ErrorDialogEnabled)]];
+}
+
+- (void)setAPEBundle:(NSBundle*)apeBundle prefPaneBundle:(NSBundle *)aBundle;
+{
+    [apeBundle retain];
+    [_apeBundle release];
+    _apeBundle = apeBundle;
+    [aBundle retain];
+    [_bundle release];
+    _bundle = aBundle;
+}
+
+- (NSBundle *)bundle;
+{
+    [_bundle autorelease];
+    return [_bundle retain];
+}
+
+- (void)prefsChanged;
+{
+    [prefs synchronize];
+    APEMessageBroadcast(kICBundleIdentifier, kICPreferencesChanged, NULL);
+}
+
+- (IBAction)commandClickEnabled:(NSButton *)sender;
+{
+    BOOL enabled = [commandClickEnabled state];
+    if (sender != nil) {
+        [prefs setBool: enabled forKey: ICP(CommandClickEnabled)];
+        [self prefsChanged];
+    }
+    [textBlinkEnabled setEnabled: enabled];
+    [textBlinkCount setEnabled: enabled ? [textBlinkEnabled state] : NO];
+}
+- (IBAction)textBlinkEnabled:(NSButton *)sender;
+{
+    BOOL enabled = [textBlinkEnabled state];
+    if (sender != nil) {
+        [prefs setBool: enabled forKey: ICP(TextBlinkEnabled)];
+        [self prefsChanged];
+    }
+    [textBlinkCount setEnabled: enabled];
+}
+- (IBAction)textBlinkCount:(NSPopUpButton *)sender;
+{
+    [prefs setInteger: [[textBlinkCount selectedItem] tag] forKey: ICP(TextBlinkCount)];
+    [self prefsChanged];
+}
+- (IBAction)servicesInContextualMenu:(NSButton *)sender;
+{
+    [prefs setBool: [servicesInContextualMenu state] forKey: ICP(ServicesInContextualMenu)];
+    [self prefsChanged];
+}
+- (IBAction)servicesInMenuBar:(NSButton *)sender;
+{
+    [prefs setBool: [servicesInMenuBar state] forKey: ICP(ServicesInMenuBar)];
+    [self prefsChanged];
+}
+- (IBAction)editContextualServices:(NSButton *)sender;
+{
+    [[ICeCoffEEServicePrefController alloc] performSelector: @selector(initWithParentWindow:) withObject: [NSApp mainWindow] afterDelay: 0.01];
+}
+- (IBAction)terminalRequireOptionForSelfDrag:(NSButton *)sender;
+{
+    [prefs setBool: [terminalRequireOptionForSelfDrag state] forKey: ICP(TerminalRequireOptionForSelfDrag)];
+    [self prefsChanged];
+}
+- (IBAction)errorSoundEnabled:(NSButton *)sender;
+{
+    [prefs setBool: [errorSoundEnabled state] forKey: ICP(ErrorSoundEnabled)];
+    [self prefsChanged];
+}
+- (IBAction)errorDialogEnabled:(NSButton *)sender;
+{
+    [prefs setBool: [errorDialogEnabled state] forKey: ICP(ErrorDialogEnabled)];
+    [self prefsChanged];
+}
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEKeyEquivalents.m
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEKeyEquivalents.m	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEKeyEquivalents.m	(revision 170)
@@ -0,0 +1,131 @@
+//
+//  ICeCoffEEKeyEquivalents.m
+//  ICeCoffEE APE
+//
+//  Created by Nicholas Riley on Mon Jun 9 2003.
+//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
+//
+
+// Original implementations of these functions are in NSString-NJRExtensions
+// and NSFont-NJRExtensions from Pester.
+
+#import <Carbon/Carbon.h>
+#import <AppKit/AppKit.h>
+
+static NSFont *themeFont(ThemeFontID fontID) {
+    NSFont *themeFont = nil;
+    Str255 pstrFontName;
+    SInt16 fontSize = 0;
+    OSStatus status;
+    // can't simulate algorithmic styles in Cocoa in any case, so here's hoping nothing will be passed back - XXX guess this should at least accommodate the bold system font, but we don't need it
+    status = GetThemeFont(fontID, smSystemScript, pstrFontName, &fontSize, NULL);
+
+    if (status == noErr) {
+        NSString *fontName = (NSString *)CFStringCreateWithPascalString(NULL, pstrFontName, CFStringGetSystemEncoding());
+        themeFont = [NSFont fontWithName: fontName size: fontSize];
+        [fontName release];
+    }
+    if (themeFont == nil) {
+        themeFont = [NSFont systemFontOfSize: fontSize == 0 ? [NSFont systemFontSize] : fontSize];
+    }
+    return themeFont;
+}
+
+static NSString *stringWithCharacter(unichar character) {
+    return [NSString stringWithCharacters: &character length: 1];
+}
+
+static unichar combiningHelpChar[] = {0x003F, 0x20DD};
+
+static NSFont *menuItemCmdKeyFont = nil;
+static NSFont *menuItemFont = nil;
+static NSParagraphStyle *keyEquivParaStyle;
+
+static inline void initialize() {
+    if (menuItemCmdKeyFont != nil) return;
+
+    menuItemCmdKeyFont = [themeFont(kThemeMenuItemCmdKeyFont) retain];
+    menuItemFont = [themeFont(kThemeMenuItemFont) retain];
+
+    NSMutableParagraphStyle *paraStyle = [[NSMutableParagraphStyle alloc] init];
+    [paraStyle setTabStops: [NSArray arrayWithObjects:
+        [[[NSTextTab alloc] initWithType: NSRightTabStopType location: 30] autorelease],
+        [[[NSTextTab alloc] initWithType: NSLeftTabStopType location: 30.01] autorelease],
+        nil]];
+    [paraStyle setLineBreakMode: NSLineBreakByClipping];
+    keyEquivParaStyle = [paraStyle copy];
+    [paraStyle release];
+}
+
+// set tabs here, for ICeCoffEE (not in Pester)
+static NSAttributedString *attributedStringWithFont(NSString *self, NSFont *font) {
+    return [[[NSAttributedString alloc] initWithString: self attributes: [NSDictionary dictionaryWithObjectsAndKeys: font, NSFontAttributeName, keyEquivParaStyle, NSParagraphStyleAttributeName, nil]] autorelease];
+}
+
+static NSString *keyEquivalentString(NSString *self) {
+    if ([self length] != 0) {
+        const char *str = [self UTF8String];
+        unichar keyChar;
+        if (str[1] != '\0') {
+            keyChar = [self characterAtIndex: 0];
+            switch (keyChar) {
+                case NSUpArrowFunctionKey: keyChar = 0x21E1; break;
+                case NSDownArrowFunctionKey: keyChar = 0x21E3; break;
+                case NSLeftArrowFunctionKey: keyChar = 0x21E0; break;
+                case NSRightArrowFunctionKey: keyChar = 0x21E2; break;
+                case NSInsertFunctionKey:
+                    return [NSString stringWithCharacters: combiningHelpChar length: 2];
+                case NSDeleteFunctionKey: keyChar = 0x2326; break;
+                case NSHomeFunctionKey: keyChar = 0x2196; break;
+                case NSEndFunctionKey: keyChar = 0x2198; break;
+                case NSPageUpFunctionKey: keyChar = 0x21DE; break;
+                case NSPageDownFunctionKey: keyChar = 0x21DF; break;
+                case NSClearLineFunctionKey: keyChar = 0x2327; break;
+                default:
+                    if (keyChar >= NSF1FunctionKey && keyChar <= NSF35FunctionKey) {
+                        return [NSString stringWithFormat: @"F%u", keyChar - NSF1FunctionKey + 1];
+                    }
+                    return [NSString stringWithFormat: @"[unknown %lX]", keyChar];
+            }
+        } else if (str[0] >= 'A' && str[0] <= 'Z') {
+            return self;
+        } else if (str[0] >= 'a' && str[0] <= 'z') return [self uppercaseString];
+        else switch (str[0]) {
+            case '\t': keyChar = 0x21e5; break;
+            case '\r': keyChar = 0x21a9; break;
+            case '\e': keyChar = 0x238b; break;
+            case ' ': keyChar = 0x2423; break;
+            case 0x7f: keyChar = 0x232b; break; // delete
+            case 0x03: keyChar = 0x2324; break; // enter
+            case 0x19: keyChar = 0x21e4; break; // backtab
+            case 0: return @"";
+                // case '': keyChar = 0x; break;
+            default: return self; // return [NSString stringWithFormat: @"[huh? %x]", (int)str[0]];
+        }
+            return stringWithCharacter(keyChar);
+    }
+    return self;
+}
+
+NSAttributedString *ICCF_KeyEquivalentAttributedStringWithModifierFlags(NSString *self, unsigned int modifierFlags) {
+    initialize();
+    NSString *keyEquivalentStringNoMask = keyEquivalentString(self);
+    // use tabs here, for ICeCoffEE (not in Pester, at least without better subclassing)
+    NSAttributedString *keyEquivalentAttributedString =
+        attributedStringWithFont(
+          [NSString stringWithFormat: @"\t%@%@%@%@\t%@",
+            (modifierFlags & NSControlKeyMask) ? stringWithCharacter(kControlUnicode) : @"",
+            (modifierFlags & NSAlternateKeyMask) ? stringWithCharacter(kOptionUnicode) : @"",
+            (modifierFlags & NSShiftKeyMask) ? stringWithCharacter(kShiftUnicode) : @"",
+            (modifierFlags & NSCommandKeyMask) ? stringWithCharacter(kCommandUnicode) : @"",
+            keyEquivalentStringNoMask], menuItemCmdKeyFont);
+    unsigned noMaskLength = [keyEquivalentStringNoMask length];
+    if (noMaskLength > 3 || // Fxx
+        (noMaskLength == 1 && [keyEquivalentStringNoMask characterAtIndex: 0] <= 0x7F)) {
+        NSMutableAttributedString *astr = [keyEquivalentAttributedString mutableCopy];
+        [astr setAttributes: [NSDictionary dictionaryWithObject: menuItemFont forKey: NSFontAttributeName] range: NSMakeRange([astr length] - noMaskLength, noMaskLength)];
+        keyEquivalentAttributedString = [[astr copy] autorelease];
+        [astr release];
+    }
+    return keyEquivalentAttributedString;
+}
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEMenuOnly.h
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEMenuOnly.h	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEMenuOnly.h	(revision 170)
@@ -0,0 +1,16 @@
+//
+//  ICeCoffEEMenuOnly.h
+//  ICeCoffEE APE
+//
+//  Created by Nicholas Riley on Sun Jan 19 2003.
+//  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+//
+
+#import "ICeCoffEEMenuSuper.h"
+
+
+@interface ICeCoffEEMenuOnly : ICeCoffEEMenuSuper {
+
+}
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEMenuOnly.m
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEMenuOnly.m	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEMenuOnly.m	(revision 170)
@@ -0,0 +1,20 @@
+//
+//  ICeCoffEEMenuOnly.m
+//  ICeCoffEE APE
+//
+//  Created by Nicholas Riley on Sun Jan 19 2003.
+//  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+//
+
+#import "ICeCoffEEMenuOnly.h"
+
+
+@implementation ICeCoffEEMenuOnly
+
+- (NSMenu *)menuForEvent:(NSEvent *)e;
+{
+    NSMenu *myMenu = [super menuForEvent: e];
+    return ICCF_MenuForEvent(self, myMenu, e);
+}
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEMenuSuper.h
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEMenuSuper.h	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEMenuSuper.h	(revision 170)
@@ -0,0 +1,16 @@
+//
+//  ICeCoffEEMenuSuper.h
+//  ICeCoffEE APE
+//
+//  Created by Nicholas Riley on Sun Jan 19 2003.
+//  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+//
+
+#import "ICeCoffEE.h"
+
+
+@interface ICeCoffEEMenuSuper : NSTextView {
+
+}
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEMenuSuper.m
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEMenuSuper.m	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEMenuSuper.m	(revision 170)
@@ -0,0 +1,19 @@
+//
+//  ICeCoffEEMenuSuper.m
+//  ICeCoffEE APE
+//
+//  Created by Nicholas Riley on Sun Jan 19 2003.
+//  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+//
+
+#import "ICeCoffEEMenuSuper.h"
+
+
+@implementation ICeCoffEEMenuSuper
+
+- (NSMenu *)menuForEvent:(NSEvent *)e;
+{
+    return [super menuForEvent: e];
+}
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEENonHighlightingButtonCell.h
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEENonHighlightingButtonCell.h	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEENonHighlightingButtonCell.h	(revision 170)
@@ -0,0 +1,16 @@
+//
+//  ICeCoffEENonHighlightingButtonCell.h
+//  ICeCoffEE APE
+//
+//  Created by Nicholas Riley on Fri Jun 06 2003.
+//  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+//
+
+#import <AppKit/AppKit.h>
+
+
+@interface ICeCoffEENonHighlightingButtonCell : NSButtonCell {
+
+}
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEENonHighlightingButtonCell.m
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEENonHighlightingButtonCell.m	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEENonHighlightingButtonCell.m	(revision 170)
@@ -0,0 +1,31 @@
+//
+//  ICeCoffEENonHighlightingButtonCell.m
+//  ICeCoffEE APE
+//
+//  Created by Nicholas Riley on Fri Jun 06 2003.
+//  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+//
+
+#import "ICeCoffEENonHighlightingButtonCell.h"
+
+
+@implementation ICeCoffEENonHighlightingButtonCell
+
+- (NSColor *)highlightColorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
+{
+    return [NSColor whiteColor];
+}
+
+- (NSCellStateValue)nextState;
+{
+    switch ([self intValue]) {
+        case NSOnState:
+        case NSMixedState:
+            return NSOffState;
+        case NSOffState:
+            return NSOnState;
+    }
+    return NSMixedState;
+}
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEENonHighlightingOutlineView.h
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEENonHighlightingOutlineView.h	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEENonHighlightingOutlineView.h	(revision 170)
@@ -0,0 +1,16 @@
+//
+//  ICeCoffEENonHighlightingOutlineView.h
+//  ICeCoffEE APE
+//
+//  Created by Nicholas Riley on Fri Jun 06 2003.
+//  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+//
+
+#import <AppKit/AppKit.h>
+
+
+@interface ICeCoffEENonHighlightingOutlineView : NSOutlineView {
+
+}
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEENonHighlightingOutlineView.m
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEENonHighlightingOutlineView.m	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEENonHighlightingOutlineView.m	(revision 170)
@@ -0,0 +1,19 @@
+//
+//  ICeCoffEENonHighlightingOutlineView.m
+//  ICeCoffEE APE
+//
+//  Created by Nicholas Riley on Fri Jun 06 2003.
+//  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+//
+
+#import "ICeCoffEENonHighlightingOutlineView.h"
+
+
+@implementation ICeCoffEENonHighlightingOutlineView
+
+- (void)highlightSelectionInClipRect:(NSRect)rect;
+{
+
+}
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEENonHighlightingTextFieldCell.h
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEENonHighlightingTextFieldCell.h	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEENonHighlightingTextFieldCell.h	(revision 170)
@@ -0,0 +1,16 @@
+//
+//  ICeCoffEENonHighlightingTextFieldCell.h
+//  ICeCoffEE APE
+//
+//  Created by Nicholas Riley on Fri Jun 06 2003.
+//  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+//
+
+#import <AppKit/AppKit.h>
+
+
+@interface ICeCoffEENonHighlightingTextFieldCell : NSTextFieldCell {
+
+}
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEENonHighlightingTextFieldCell.m
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEENonHighlightingTextFieldCell.m	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEENonHighlightingTextFieldCell.m	(revision 170)
@@ -0,0 +1,19 @@
+//
+//  ICeCoffEENonHighlightingTextFieldCell.m
+//  ICeCoffEE APE
+//
+//  Created by Nicholas Riley on Fri Jun 06 2003.
+//  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+//
+
+#import "ICeCoffEENonHighlightingTextFieldCell.h"
+
+
+@implementation ICeCoffEENonHighlightingTextFieldCell
+
+- (NSColor *)highlightColorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
+{
+    return [NSColor whiteColor];
+}
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEScanner.h
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEScanner.h	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEScanner.h	(revision 170)
@@ -0,0 +1,27 @@
+//
+//  ICeCoffEEScanner.h
+//  ICeCoffEE
+//
+//  Created by Nicholas Riley on Fri Feb 08 2002.
+//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+
+@interface ICeCoffEEScanner : NSObject {
+    NSString *source;
+    NSMutableString *dest;
+    int length;
+    unsigned loc;
+}
+
+- (id)initWithSource:(NSString *)aSource destination:(NSMutableString *)aDest;
+- (void)breakWithString:(NSString *)breakString atWidth:(unsigned)width;
+- (BOOL)appendUpToString:(NSString *)string;
+- (void)appendUpToEnd;
+- (BOOL)isAtEnd;
+- (unsigned)scanLocation;
+- (unsigned)remainingLength;
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEScanner.m
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEScanner.m	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEScanner.m	(revision 170)
@@ -0,0 +1,98 @@
+//
+//  ICeCoffEEScanner.m
+//  ICeCoffEE
+//
+//  Created by Nicholas Riley on Fri Feb 08 2002.
+//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
+//
+
+#import "ICeCoffEEScanner.h"
+
+
+@implementation ICeCoffEEScanner
+
+- (id)initWithSource:(NSString *)aSource destination:(NSMutableString *)aDest;
+{
+    if ( (self = [super init]) != nil) {
+        source = [aSource retain];
+        length = [source length];
+        dest = [aDest retain];
+    }
+    return self;
+}
+
+- (void)dealloc;
+{
+    [source release];
+    [dest release];
+    [super dealloc];
+}
+
+- (NSRange)_nextMatchRangeForString:(NSString *)string;
+{
+    return [source rangeOfString: string options: NSLiteralSearch range: NSMakeRange(loc, length - loc)];
+}
+
+- (void)_breakWithString:(NSString *)breakString atWidth:(unsigned)width forChars:(unsigned)charsToCopy;
+{
+    while (charsToCopy > width) {
+        [dest appendString: [source substringWithRange: NSMakeRange(loc, width)]];
+        charsToCopy -= width;
+        loc += width;
+        [dest appendString: breakString];
+    }
+}
+
+- (void)breakWithString:(NSString *)breakString atWidth:(unsigned)width;
+{
+    NSRange matchRange = {1, 1};
+
+    while ( (matchRange = [self _nextMatchRangeForString: breakString]).location != NSNotFound) {
+        [self _breakWithString: breakString atWidth: width forChars: matchRange.location - loc];
+        [dest appendString: [source substringWithRange: NSMakeRange(loc, matchRange.location + matchRange.length - loc)]];
+        loc = matchRange.location + matchRange.length;
+    }
+
+    if (![self isAtEnd]) {
+        [self _breakWithString: breakString atWidth: width forChars: [self remainingLength]];
+        [self appendUpToEnd];
+        [dest appendString: breakString];
+    }
+
+}
+
+- (BOOL)appendUpToString:(NSString *)string;
+{
+    NSRange matchRange = [self _nextMatchRangeForString: string];
+
+    if (matchRange.location == NSNotFound) return NO;
+
+    [dest appendString: [source substringWithRange: NSMakeRange(loc, matchRange.location - loc)]];
+
+    loc = matchRange.location + matchRange.length;
+
+    return YES;
+}
+
+- (void)appendUpToEnd;
+{
+    [dest appendString: [source substringFromIndex: loc]];
+    loc = length;
+}
+
+- (BOOL)isAtEnd;
+{
+    return (loc >= length);
+}
+
+- (unsigned)scanLocation;
+{
+    return loc;
+}
+
+- (unsigned)remainingLength;
+{
+    return (length - loc);
+}
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEServicePrefController.h
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEServicePrefController.h	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEServicePrefController.h	(revision 170)
@@ -0,0 +1,25 @@
+//
+//  ICeCoffEEServicePrefController.h
+//  ICeCoffEE APE
+//
+//  Created by Nicholas Riley on Fri Jun 06 2003.
+//  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+//
+
+#import <AppKit/AppKit.h>
+
+
+@interface ICeCoffEEServicePrefController : NSWindowController {
+    IBOutlet NSOutlineView *serviceOutline;
+    NSMenu *servicesMenu;
+}
+
+- (id)initWithParentWindow:(NSWindow *)parent;
+
+- (IBAction)showAll:(NSButton *)sender;
+- (IBAction)hideAll:(NSButton *)sender;
+
+- (IBAction)cancel:(NSButton *)sender;
+- (IBAction)saveChanges:(NSButton *)sender;
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEServicePrefController.m
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEServicePrefController.m	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEServicePrefController.m	(revision 170)
@@ -0,0 +1,327 @@
+//
+//  ICeCoffEEServicePrefController.m
+//  ICeCoffEE APE
+//
+//  Created by Nicholas Riley on Fri Jun 06 2003.
+//  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+//
+
+#import "ICeCoffEEShared.h"
+#import "ICeCoffEEServicePrefController.h"
+#import "ICeCoffEENonHighlightingButtonCell.h"
+#import "ICeCoffEENonHighlightingTextFieldCell.h"
+#import <objc/objc.h>
+#import <ApplicationEnhancer/ApplicationEnhancer.h>
+
+static NSNumber *ICCF_SERVICE_SHOWN, *ICCF_SERVICE_HIDDEN, *ICCF_SERVICE_MIXED;
+static NSDictionary *ICCF_SERVICE_OPTION_HIDDEN;
+
+static float ICCF_TableViewCellHeight(NSTableView *tableView) {
+    return ([tableView rowHeight] + [tableView intercellSpacing].height);
+}
+
+static inline NSCellStateValue ICCF_ServiceItemState(id <NSMenuItem> item) {
+    id state = [item representedObject];
+    return (state == nil) ? NSOnState : [state intValue];
+}
+
+static void ICCF_PropagateServiceStateChange(NSMenu *menu, id state) {
+    NSEnumerator *e = [[menu itemArray] objectEnumerator];
+    NSMenuItem *item;
+    NSMenu *submenu;
+
+    while ( (item = [e nextObject]) != nil) {
+        submenu = [item submenu];
+        if (submenu != nil) {
+            ICCF_PropagateServiceStateChange(submenu, state);
+            [item setRepresentedObject: (state == nil) ? ICCF_SERVICE_SHOWN : state];
+        }
+        [item setRepresentedObject: state];
+    }
+}
+
+static NSCellStateValue ICCF_PropagateServiceState(id <NSMenuItem> item, NSMenuItem *changedItem) {
+    NSMenu *submenu = [item submenu];
+    if (submenu == nil) return ICCF_ServiceItemState(item);
+
+    if (item == changedItem) ICCF_PropagateServiceStateChange(submenu, [item representedObject]);
+
+    BOOL areOn = NO, areOff = NO;
+    NSEnumerator *e = [[submenu itemArray] objectEnumerator];
+    NSMenuItem *subItem;
+    while ( (subItem = [e nextObject]) != nil) {
+        switch (ICCF_PropagateServiceState(subItem, changedItem)) {
+            case NSOnState: if (!areOff) { areOn = YES; continue; }
+                break;
+            case NSOffState: if (!areOn) { areOff = YES; continue; }
+                break;
+            case NSMixedState:
+                break;
+        }
+        [item setRepresentedObject: ICCF_SERVICE_MIXED];
+        return NSMixedState;
+    }
+    if (areOn) {
+        [item setRepresentedObject: ICCF_SERVICE_SHOWN];
+        return NSOnState;
+    } else {
+        [item setRepresentedObject: ICCF_SERVICE_HIDDEN];
+        return NSOffState;
+    }
+}
+
+static NSMutableDictionary *ICCF_RetainedServiceOptionsDictionary(NSMenu *menu) {
+    NSEnumerator *e = [[menu itemArray] objectEnumerator];
+    NSMenuItem *item;
+    NSMenu *submenu;
+    NSMutableDictionary *dict = nil, *subDict = nil, *submenuDict = nil;
+
+    while ( (item = [e nextObject]) != nil) {
+        submenu = [item submenu];
+        if (ICCF_ServiceItemState(item) == NSOffState) {
+            subDict = [ICCF_SERVICE_OPTION_HIDDEN retain];
+        } else if (submenu != nil) {
+            submenuDict = ICCF_RetainedServiceOptionsDictionary(submenu);
+            if (submenuDict == nil)
+                continue;
+            subDict = [[NSDictionary alloc] initWithObjectsAndKeys: submenuDict, kICServiceSubmenu, nil];
+            [submenuDict release];
+        } else continue;
+        if (dict == nil) {
+            dict = [[NSMutableDictionary alloc] init];
+        }
+        [dict setObject: subDict forKey: [item title]];
+        [subDict release];
+    }
+    return dict;
+}
+
+static void ICCF_RestoreServiceOptionsDictionary(NSMenu *menu, NSDictionary *dict) {
+    NSEnumerator *e = [dict keyEnumerator];
+    NSString *itemTitle;
+    NSDictionary *subDict, *submenuDict;
+    id <NSMenuItem> item;
+    NSMenu *submenu;
+
+    // XXX handle exceptions
+    while ( (itemTitle = [e nextObject]) != nil) {
+        item = [menu itemWithTitle: itemTitle];
+        if (item == nil) continue;
+        subDict = [dict objectForKey: itemTitle];
+        if ([[subDict objectForKey: (NSString *)kICServiceHidden] boolValue]) {
+            [item setRepresentedObject: ICCF_SERVICE_HIDDEN];
+        }
+        if ( (submenu = [item submenu]) != nil) {
+            submenuDict = [subDict objectForKey: (NSString *)kICServiceSubmenu];
+            if ([submenuDict count] == 0)
+                ICCF_PropagateServiceStateChange(submenu, ICCF_SERVICE_HIDDEN);
+            else
+                ICCF_RestoreServiceOptionsDictionary(submenu, submenuDict);
+        }
+    }
+}
+
+@implementation ICeCoffEEServicePrefController
+
+#pragma mark class initialization
+
++ (void)initialize;
+{
+    ICCF_SERVICE_SHOWN = [[NSNumber alloc] initWithInt: NSOnState];
+    ICCF_SERVICE_HIDDEN = [[NSNumber alloc] initWithInt: NSOffState];
+    ICCF_SERVICE_MIXED = [[NSNumber alloc] initWithInt: NSMixedState];
+    ICCF_SERVICE_OPTION_HIDDEN = [[NSDictionary alloc] initWithObjectsAndKeys: [NSNumber numberWithBool: YES], kICServiceHidden, nil];
+}
+
+#pragma mark initialize-release
+
+- (id)initWithParentWindow:(NSWindow *)parent;
+{
+    if ( (self = [self initWithWindowNibName: @"Select services"])) {
+        NSWindow *window = [self window]; // connect outlets
+        NSButtonCell *checkBoxCell = [[ICeCoffEENonHighlightingButtonCell alloc] init];
+        [checkBoxCell setButtonType: NSSwitchButton];
+        [checkBoxCell setImagePosition: NSImageOnly];
+        [checkBoxCell setAllowsMixedState: YES];
+        [[serviceOutline tableColumnWithIdentifier: @"show"] setDataCell: checkBoxCell];
+        [checkBoxCell release];
+
+        NSTextFieldCell *textFieldCell = [[serviceOutline tableColumnWithIdentifier: @"service"] dataCell];
+        ((struct objc_object *)textFieldCell)->isa = [ICeCoffEENonHighlightingTextFieldCell class];
+
+        textFieldCell = [[serviceOutline tableColumnWithIdentifier: @"key"] dataCell];
+        ((struct objc_object *)textFieldCell)->isa = [ICeCoffEENonHighlightingTextFieldCell class];
+
+        [window setResizeIncrements: NSMakeSize(1, ICCF_TableViewCellHeight(serviceOutline))];
+        if (parent != nil) {
+            [NSApp beginSheet: window modalForWindow: parent modalDelegate: self didEndSelector: nil contextInfo: nil];
+        } else {
+            [window center];
+            [window makeKeyAndOrderFront: nil];
+        }
+    }
+    return self;
+}
+
+- (void)dealloc;
+{
+    [servicesMenu release];
+    [super dealloc];
+}
+
+#pragma mark actions
+
+- (IBAction)showAll:(NSButton *)sender;
+{
+    ICCF_PropagateServiceStateChange(servicesMenu, nil);
+    [serviceOutline reloadData];
+}
+
+- (IBAction)hideAll:(NSButton *)sender;
+{
+    ICCF_PropagateServiceStateChange(servicesMenu, ICCF_SERVICE_HIDDEN);
+    [serviceOutline reloadData];
+}
+
+- (void)closeWithReturnCode:(int)returnCode;
+{
+    if ([[self window] isSheet]) {
+        [NSApp endSheet: [self window] returnCode: NSRunAbortedResponse];
+    }
+    [self close];
+}
+
+- (IBAction)cancel:(NSButton *)sender;
+{
+    [self closeWithReturnCode: NSRunAbortedResponse];
+}
+
+- (IBAction)saveChanges:(NSButton *)sender;
+{
+    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+    NSMutableDictionary *icDefaults = [[defaults persistentDomainForName: (NSString *)kICBundleIdentifier] mutableCopy];
+    NSDictionary *serviceOptions = ICCF_RetainedServiceOptionsDictionary(servicesMenu);
+    if (serviceOptions != nil) {
+        [icDefaults setObject: serviceOptions forKey: (NSString *)kICServiceOptions];
+        [serviceOptions release];
+    } else {
+        [icDefaults removeObjectForKey: (NSString *)kICServiceOptions];
+    }
+    [defaults setPersistentDomain: icDefaults forName: (NSString *)kICBundleIdentifier];
+    [defaults synchronize];
+    APEMessageBroadcast(kICBundleIdentifier, kICPreferencesChanged, NULL);
+    [icDefaults release];
+    [self closeWithReturnCode: NSRunStoppedResponse];
+}
+
+@end
+
+@implementation ICeCoffEEServicePrefController (NSOutlineViewDataSource)
+
+- (int)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item;
+{
+    if (servicesMenu == nil) {
+        servicesMenu = [[NSMenu alloc] initWithTitle: @""];
+        [[NSApplication sharedApplication] setServicesMenu: servicesMenu];
+        [servicesMenu update];
+        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+        NSDictionary *icDefaults = [defaults persistentDomainForName: (NSString *)kICBundleIdentifier];
+        NSDictionary *serviceOptions = [icDefaults objectForKey: (NSString *)kICServiceOptions];
+        ICCF_RestoreServiceOptionsDictionary(servicesMenu, serviceOptions);
+    }
+    return [(item == nil ? servicesMenu : [item submenu]) numberOfItems];
+}
+
+- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item;
+{
+    return (item == nil ? YES : [item submenu] != nil);
+}
+
+- (id)outlineView:(NSOutlineView *)outlineView child:(int)index ofItem:(id)item;
+{
+    return [(item == nil ? servicesMenu : [item submenu]) itemAtIndex: index];
+}
+
+NSAttributedString *ICCF_KeyEquivalentAttributedStringWithModifierFlags(NSString *self, unsigned int modifierFlags);
+
+- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item;
+{
+    if ([[tableColumn identifier] isEqualToString: @"service"]) {
+        return [item title];
+    } else if ([[tableColumn identifier] isEqualToString: @"show"]) {
+        id state = [item representedObject];
+        if ([item submenu] != nil && state == nil) {
+            return [NSNumber numberWithInt: ICCF_PropagateServiceState(item, nil)];
+        }
+        return (state == nil) ? ICCF_SERVICE_SHOWN : state;
+    } else if ([[tableColumn identifier] isEqualToString: @"key"]) {
+        [item setKeyEquivalent: @"#"];
+        NSString *equivalent = [item keyEquivalent];
+        if (equivalent == nil || [equivalent length] != 1) return nil;
+        // XXX Inconsistency between Cocoa and Carbon: always command-shift in Carbon, not in Cocoa.  Since we only patch Cocoa for the moment, keep as is.
+        return ICCF_KeyEquivalentAttributedStringWithModifierFlags(equivalent, [item keyEquivalentModifierMask] | ([[NSCharacterSet uppercaseLetterCharacterSet] characterIsMember: [equivalent characterAtIndex: 0]] ? NSShiftKeyMask : 0));
+    }
+    return nil;
+}
+
+- (void)outlineView:(NSOutlineView *)outlineView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn byItem:(id)item;
+{
+    if ([[tableColumn identifier] isEqualToString: @"show"]) {
+        [item setRepresentedObject: [object boolValue] ? nil : ICCF_SERVICE_HIDDEN];
+        
+        NSMenu *submenu = [item menu];
+        if (submenu == servicesMenu) {
+            ICCF_PropagateServiceState(item, item);
+        } else {
+            NSMenu *supermenu;
+            while ( (supermenu = [submenu supermenu]) != servicesMenu) {
+                submenu = supermenu;
+            }
+            ICCF_PropagateServiceState([supermenu itemAtIndex: [supermenu indexOfItemWithSubmenu: submenu]], item);
+        }
+        [outlineView reloadData];
+    }
+}
+
+@end
+
+@implementation ICeCoffEEServicePrefController (NSWindowDelegate)
+
+- (NSRect)windowWillUseStandardFrame:(NSWindow *)sender defaultFrame:(NSRect)defaultFrame;
+{
+    NSWindow *window = [serviceOutline window];
+    NSRect frame = [window frame];
+    NSScrollView *scrollView = [serviceOutline enclosingScrollView];
+    float displayedHeight = [[scrollView contentView] bounds].size.height;
+    float heightChange = [[scrollView documentView] bounds].size.height - displayedHeight;
+    float heightExcess;
+
+    if (heightChange >= 0 && heightChange <= 1) {
+        // either the window is already optimal size, or it's too big
+        float rowHeight = ICCF_TableViewCellHeight(serviceOutline);
+        heightChange = (rowHeight * [serviceOutline numberOfRows]) - displayedHeight;
+    }
+
+    frame.size.height += heightChange;
+
+    if ( (heightExcess = [window minSize].height - frame.size.height) > 1 ||
+         (heightExcess = [window maxSize].height - frame.size.height) < 1) {
+        heightChange += heightExcess;
+        frame.size.height += heightExcess;
+    }
+
+    frame.origin.y -= heightChange;
+
+    return frame;
+}
+
+@end
+
+@implementation ICeCoffEEServicePrefController (NSWindowNotifications)
+
+- (void)windowWillClose:(NSNotification *)notification;
+{
+    [self autorelease];
+}
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEShared.h
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEShared.h	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEShared.h	(revision 170)
@@ -0,0 +1,57 @@
+/*
+ *  ICeCoffEEShared.h
+ *  ICeCoffEE APE
+ *
+ *  Created by Nicholas Riley on Mon Jan 20 2003.
+ *  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+ *
+ */
+
+#ifndef _H_ICeCoffEEShared
+#define _H_ICeCoffEEShared
+
+#include <CoreFoundation/CoreFoundation.h>
+
+#define ICCF_DEBUG 0
+
+#if ICCF_DEBUG
+#define ICLog NSLog
+#define ICapeprintf apeprintf
+#else
+#define ICLog (void)
+#define ICapeprintf (void)
+#endif
+
+extern const OSType kICCFCreator;
+
+extern const CFStringRef kICBundleIdentifier;
+
+// ICeCoffEE 1.1/1.2 CFPreferences
+extern const CFStringRef kIC12PrefExcluded;
+extern const CFStringRef kIC12PrefExcludedAppSpecifierBundleID;
+
+// CFPreferences
+extern const CFStringRef kICLastLoadedVersion; // CFString
+extern const CFStringRef kICCommandClickEnabled; // CFNumber (Boolean)
+extern const CFStringRef kICTextBlinkEnabled; // CFNumber (Boolean)
+extern const CFStringRef kICTextBlinkCount; // CFNumber (int)
+extern const CFStringRef kICServicesInContextualMenu; // CFNumber (Boolean)
+extern const CFStringRef kICServicesInMenuBar; // CFNumber (Boolean)
+extern const CFStringRef kICServiceOptions; // CFDictionary
+extern const CFStringRef kICTerminalRequireOptionForSelfDrag; // CFNumber (Boolean)
+extern const CFStringRef kICErrorSoundEnabled; // CFNumber (Boolean)
+extern const CFStringRef kICErrorDialogEnabled; // CFNumber (Boolean)
+
+// kICServiceOptions dictionary keys
+extern const CFStringRef kICServiceHidden; // CFNumber (Boolean)
+extern const CFStringRef kICServiceShortcut; // reserved for future use
+extern const CFStringRef kICServiceSubmenu; // CFDictionary
+
+// APEBundleMessages
+extern const CFStringRef kICPreferencesChanged;
+
+// UI constants
+extern const int kICHysteresisPixels;
+extern const int kICBlinkDelayUsecs;
+
+#endif /* _H_ICeCoffEEShared */
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEShared.m
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEShared.m	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEShared.m	(revision 170)
@@ -0,0 +1,42 @@
+/*
+ *  ICeCoffEEShared.m
+ *  ICeCoffEE APE
+ *
+ *  Created by Nicholas Riley on Wed Jan 22 2003.
+ *  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+ *
+ */
+
+#include "ICeCoffEEShared.h"
+#import <Foundation/NSString.h>
+
+const OSType      kICCFCreator = 'ICCF';
+const CFStringRef kICBundleIdentifier = (CFStringRef)@"net.sabi.ICeCoffEE";
+
+// ICeCoffEE 1.1/1.2 CFPreferences
+const CFStringRef kIC12PrefExcluded = (CFStringRef)@"Excluded Applications"; // CFArray of CFDictionaries
+const CFStringRef kIC12PrefExcludedAppSpecifierBundleID = (CFStringRef)@"CFBundleID"; // CFDictionary key
+
+// CFPreferences
+const CFStringRef kICLastLoadedVersion = (CFStringRef)@"ICLastLoadedVersion"; // CFNumber (bool)
+const CFStringRef kICCommandClickEnabled = (CFStringRef)@"ICCommandClickEnabled"; // CFNumber (bool)
+const CFStringRef kICTextBlinkEnabled = (CFStringRef)@"ICTextBlinkEnabled"; // CFNumber (bool)
+const CFStringRef kICTextBlinkCount = (CFStringRef)@"ICTextBlinkCount"; // CFNumber (int)
+const CFStringRef kICServicesInContextualMenu = (CFStringRef)@"ICServicesInContextualMenu"; // CFNumber (bool)
+const CFStringRef kICServicesInMenuBar = (CFStringRef)@"ICServicesInMenuBar"; // CFNumber (bool)
+const CFStringRef kICServiceOptions = (CFStringRef)@"ICServiceOptions"; // CFDictionary
+const CFStringRef kICTerminalRequireOptionForSelfDrag = (CFStringRef)@"ICTerminalRequireOptionForSelfDrag"; // CFNumber (Boolean)
+const CFStringRef kICErrorSoundEnabled = (CFStringRef)@"ICErrorSoundEnabled"; // CFNumber (bool)
+const CFStringRef kICErrorDialogEnabled = (CFStringRef)@"ICErrorDialogEnabled"; // CFNumber (bool)
+
+// kICServiceOptions dictionary keys
+const CFStringRef kICServiceSubmenu = (CFStringRef)@"ICServiceSubmenu"; // CFDictionary
+const CFStringRef kICServiceHidden = (CFStringRef)@"ICServiceHidden"; // CFNumber (Boolean)
+const CFStringRef kICServiceShortcut = (CFStringRef)@"ICServiceShortcut"; // reserved for future use
+
+// APEBundleMessages
+const CFStringRef kICPreferencesChanged = (CFStringRef)@"ICPreferencesChanged";
+
+// UI constants
+const int kICHysteresisPixels = 4;
+const int kICBlinkDelayUsecs = 60000;
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEESuper.h
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEESuper.h	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEESuper.h	(revision 170)
@@ -0,0 +1,16 @@
+//
+//  ICeCoffEESuper.h
+//  ICeCoffEE APE
+//
+//  Created by Nicholas Riley on Sun Jan 19 2003.
+//  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+//
+
+#import <AppKit/AppKit.h>
+
+
+@interface ICeCoffEESuper : NSTextView {
+
+}
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEESuper.m
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEESuper.m	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEESuper.m	(revision 170)
@@ -0,0 +1,24 @@
+//
+//  ICeCoffEESuper.m
+//  ICeCoffEE APE
+//
+//  Created by Nicholas Riley on Sun Jan 19 2003.
+//  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+//
+
+#import "ICeCoffEESuper.h"
+
+
+@implementation ICeCoffEESuper
+
+- (NSMenu *)menuForEvent:(NSEvent *)e;
+{
+    return [super menuForEvent: e];
+}
+
+- (void)mouseDown:(NSEvent *)e;
+{
+    [super mouseDown: e];
+}
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEETerminal.h
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEETerminal.h	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEETerminal.h	(revision 170)
@@ -0,0 +1,27 @@
+//
+//  ICeCoffEETerminal.h
+//  ICeCoffEE
+//
+//  Created by Nicholas Riley on Mon Jan 28 2002.
+//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+
+struct _FSelPt {
+    unsigned int line;
+    unsigned short col;
+};
+
+@interface ICECoffEETermSubviewSuper:NSView <NSTextInput>
+{
+}
+
+- (void)_optionClickEvent:(NSEvent *)event:(unsigned int)row:(unsigned short)column;
+- (void)setNeedsDisplay;
+
+@end
+
+@interface ICeCoffEETerminal : ICECoffEETermSubviewSuper
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEETerminal.m
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEETerminal.m	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEETerminal.m	(revision 170)
@@ -0,0 +1,447 @@
+//
+//  ICeCoffEETerminal.m
+//  ICeCoffEE
+//
+//  Created by Nicholas Riley on Mon Jan 28 2002.
+//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
+//
+
+#import "ICeCoffEETerminal.h"
+#import "ICeCoffEEScanner.h"
+#import "ICeCoffEE.h"
+#import <Carbon/Carbon.h>
+#include <unistd.h>
+
+static NSRange ICCF_zeroRange = { NSNotFound, 5 };
+
+#define min(a,b)        (a < b ? a : b)
+#define max(a,b)        (a > b ? a : b)
+
+@interface TermStorage:NSObject
+- (struct _FSelPt)selPt0;
+- (struct _FSelPt)selPt1;
+- (BOOL)hasSelection;
+- (void)startSelectionAtLine:(unsigned int)row column:(unsigned short)column;
+- (void)startSelectionAtLine:(unsigned int)row offset:(unsigned short)offset;
+- (void)endSelectionAtLine:(unsigned int)row offset:(unsigned short)offset;
+- (void)selectWhitespaceDelimitedTextAtLine:(unsigned int)line offset:(unsigned short)offset;
+- (void)selectWordAtLine:(unsigned int)line offset:(unsigned short)offset;
+- (NSString *)selectedString;
+- (unsigned int)numberOfLines;
+- (unsigned int)effectiveColumnsForLine:(unsigned int)line;
+- (void)clearSelection;
+- (BOOL)isSelected:(unsigned int)line :(unsigned int)column;
+@end
+
+@interface TermController:NSObject
+- (TermStorage *)storage;
+@end
+
+@implementation ICECoffEETermSubviewSuper
+// NSTextInput implementation
+- (void)insertText:(id)aString {}
+- (void)doCommandBySelector:(SEL)aSelector {}
+- (void)setMarkedText:(id)aString selectedRange:(NSRange)selRange {}
+- (void)unmarkText {}
+- (BOOL)hasMarkedText { return NO; }
+- (long)conversationIdentifier { return 0; }
+- (NSAttributedString *)attributedSubstringFromRange:(NSRange)theRange { return nil; }
+- (NSRange)markedRange { return ICCF_zeroRange; }
+- (NSRange)selectedRange { return ICCF_zeroRange; }
+- (NSRect)firstRectForCharacterRange:(NSRange)theRange { return NSZeroRect; }
+- (unsigned int)characterIndexForPoint:(NSPoint)thePoint { return 0; }
+- (NSArray*)validAttributesForMarkedText { return nil; }
+// NSDraggingDestination
+- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender { return NSDragOperationNone; }
+// misc. other stuff
+- (void)_optionClickEvent:(NSEvent *)event:(unsigned int)row:(unsigned short)column {}
+- (void)setNeedsDisplay; {}
+@end
+
+@interface ICeCoffEETerminalRange : NSObject
+{
+    TermStorage *storage;
+    struct _FSelPt pt0;
+    struct _FSelPt pt1;
+    unsigned int width;
+    unsigned int height;
+}
+
++ (ICeCoffEETerminalRange *)rangeWithTerminal:(ICeCoffEETerminal *)terminal;
++ (ICeCoffEETerminalRange *)rangeWithTerminal:(ICeCoffEETerminal *)terminal pt0:(struct _FSelPt)selPt0 pt1:(struct _FSelPt)selPt1;
+
+- (id)initWithTerminal:(ICeCoffEETerminal *)terminal;
+- (id)initWithTerminal:(ICeCoffEETerminal *)terminal pt0:(struct _FSelPt)selPt0 pt1:(struct _FSelPt)selPt1;
+
+- (struct _FSelPt)pt0;
+- (struct _FSelPt)pt1;
+
+- (NSString *)stringFromRange;
+
+- (void)growBackwardByLength:(unsigned long)length;
+- (void)growForwardByLength:(unsigned long)length;
+
+- (void)shrinkBackByLength:(unsigned long)length;
+- (void)shrinkFrontByLength:(unsigned long)length;
+
+- (BOOL)rangeIsEmpty;
+
+- (void)select;
+
+@end
+
+@implementation ICeCoffEETerminalRange
+
++ (ICeCoffEETerminalRange *)rangeWithTerminal:(ICeCoffEETerminal *)terminal;
+{
+    return [[[self alloc] initWithTerminal: terminal] autorelease];
+}
+
++ (ICeCoffEETerminalRange *)rangeWithTerminal:(ICeCoffEETerminal *)terminal pt0:(struct _FSelPt)selPt0 pt1:(struct _FSelPt)selPt1;
+{
+    return [[[self alloc] initWithTerminal: terminal pt0: selPt0 pt1: selPt1] autorelease];
+}
+
+- (id)initWithTerminal:(ICeCoffEETerminal *)terminal;
+{
+    if ( (self = [self init]) != nil) {
+        storage = [(TermController *)[terminal valueForKey: @"controller"] storage];
+        pt0 = [storage selPt0];
+        pt1 = [storage selPt1];
+        width = [storage effectiveColumnsForLine: pt0.line];
+        height = [storage numberOfLines];
+    }
+    return self;
+}
+
+- (id)initWithTerminal:(ICeCoffEETerminal *)terminal pt0:(struct _FSelPt)selPt0 pt1:(struct _FSelPt)selPt1;
+{
+    if ( (self = [self initWithTerminal: terminal]) != nil) {
+        pt0 = selPt0;
+        pt1 = selPt1;
+    }
+    return self;
+}
+
+- (struct _FSelPt)pt0;
+{
+    return pt0;
+}
+
+- (struct _FSelPt)pt1;
+{
+    return pt1;
+}
+
+- (NSString *)stringFromRange;
+{
+    struct _FSelPt oldPt0 = [storage selPt0], oldPt1 = [storage selPt1];
+    NSString *str;
+
+    [storage startSelectionAtLine: pt0.line offset: pt0.col];
+    [storage endSelectionAtLine: pt1.line offset: pt1.col];
+
+    str = [storage selectedString];
+
+    [storage startSelectionAtLine: oldPt0.line offset: oldPt0.col];
+    [storage endSelectionAtLine: oldPt1.line offset: oldPt1.col];
+
+    return str;
+}
+
+- (struct _FSelPt)_moveBack:(struct _FSelPt)pt byLength:(unsigned long)length;
+{
+    unsigned int extraLines = length / width;
+    if ((long)(pt.line - extraLines) < 0) {
+        pt.line = 0;
+        pt.col = 0;
+    } else if (pt.line - extraLines == 0) {
+        pt.line = 0;
+        pt.col += width - (length % height);
+        if (pt.col < width) pt.col = 0;
+        else pt.col -= width;
+    } else {
+        pt.line -= extraLines;
+        pt.col += width - (length % height);
+        if (pt.col < width) pt.line--;
+        else pt.col -= width;
+    }
+    return pt;
+}
+
+- (struct _FSelPt)_moveForward:(struct _FSelPt)pt byLength:(unsigned long)length;
+{
+    unsigned int extraLines = length / width;
+    if (pt.line + extraLines >= height) {
+        pt.line = height - 1;
+        pt.col = width - 1;
+    } else if (pt.line + extraLines == height - 1) {
+        pt.line = height - 1;
+        pt.col += length % height;
+        if (pt.col >= width) pt.col = width - 1;
+    } else {
+        pt.line += extraLines;
+        pt.col = pt.col + (length % height);
+        if (pt.col > width) {
+            pt.line++;
+            pt.col -= width;
+        }
+    }
+    return pt;
+}
+
+- (BOOL)rangeIsEmpty;
+{
+    return (pt1.line < pt0.line) || (pt1.line == pt0.line && pt1.col <= pt0.col);
+}
+
+- (void)growBackwardByLength:(unsigned long)length;
+{
+    pt0 = [self _moveBack: pt0 byLength: length];
+}
+
+- (void)growForwardByLength:(unsigned long)length;
+{
+    pt1 = [self _moveForward: pt1 byLength: length];
+}
+
+- (void)shrinkFrontByLength:(unsigned long)length;
+{
+    pt0 = [self _moveForward: pt0 byLength: length];
+}
+
+- (void)shrinkBackByLength:(unsigned long)length;
+{
+    pt1 = [self _moveBack: pt1 byLength: length];
+}
+
+- (void)select;
+{
+    [storage startSelectionAtLine: pt0.line offset: pt0.col];
+    [storage endSelectionAtLine: pt1.line offset: pt1.col];
+}
+
+- (NSString *)description;
+{
+    return [NSString stringWithFormat: @"L%uC%hu - L%uC%hu: |%@|", pt0.line, pt0.col, pt1.line, pt1.col, [[self stringFromRange] stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]];
+}
+
+@end
+
+// TermSubview's NSTextInput implementation is essentially a noop: make one that does something
+@implementation ICeCoffEETerminal // XXX normally in category (NSTextInput), but APE doesnÕt work if I do that
+
+- (NSRange)selectedRange {
+    TermStorage *storage = [(TermController *)[self valueForKey: @"controller"] storage];
+    struct _FSelPt selPt0 = [storage selPt0], selPt1 = [storage selPt1];
+    unsigned width = [storage effectiveColumnsForLine: selPt0.line];
+    unsigned pt0 = selPt0.line * width + selPt0.col;
+    ICLog(@"selPt0 %d x %d selPt1 %d x %d", selPt0.line, selPt0.col, selPt1.line, selPt1.col);
+    return NSMakeRange(pt0, selPt1.line * width + selPt1.col - pt0);
+}
+
+// XXX string isn't padded: what we need is something like the ICeCoffEE 1.2.x method, adapted to Terminal 1.2, but we've chosen another way
+- (NSAttributedString *)attributedSubstringFromRange:(NSRange)theRange;
+{
+    TermStorage *storage = [(TermController *)[self valueForKey: @"controller"] storage];
+    struct _FSelPt oldPt0 = [storage selPt0], oldPt1 = [storage selPt1], realPt0, realPt1;
+    unsigned pt1 = theRange.location + theRange.length;
+    unsigned width = [storage effectiveColumnsForLine: 0];
+    NSAttributedString *str;
+
+    realPt0.line = theRange.location / width;
+    realPt0.col = theRange.location % width;
+    realPt1.line = pt1 / width;
+    realPt1.col = pt1 % width;
+
+    [storage startSelectionAtLine: realPt0.line offset: realPt0.col];
+    [storage endSelectionAtLine: realPt1.line offset: realPt1.col];
+
+    str = [[NSAttributedString alloc] initWithString: [storage selectedString]];
+
+    NSAssert2([str length] == theRange.length, @"Substring has length %lu when we expected %lu", [str length], theRange.length);
+
+    [storage startSelectionAtLine: oldPt0.line offset: oldPt0.col];
+    [storage endSelectionAtLine: oldPt1.line offset: oldPt1.col];
+    
+    return [str autorelease];
+}
+
+static NSEvent *ICCF_downEvent;
+static unsigned int ICCF_line;
+static unsigned short ICCF_col;
+static BOOL ICCF_optionClickRegistered;
+
+- (void)setSelectedRange:(NSRange)charRange affinity:(NSSelectionAffinity)affinity stillSelecting:(BOOL)stillSelectingFlag;
+{
+    TermStorage *storage = [(TermController *)[self valueForKey: @"controller"] storage];
+    unsigned width = [storage effectiveColumnsForLine: 0];
+    unsigned pt1 = charRange.location + charRange.length;
+    [storage startSelectionAtLine: charRange.location / width offset: charRange.location % width];
+    [storage endSelectionAtLine: pt1 / width offset: pt1 % width];
+    // [self refresh];
+}
+
+void ICCF_LaunchURLFromTerminal(ICeCoffEETerminal *self) {
+    NSCharacterSet *urlLeftDelimiters = nil, *urlRightDelimiters = nil;
+
+    ICeCoffEETerminalRange *termRange = nil, *selRange = nil;
+    NSString *s;
+    NSRange range, delimiterRange;
+
+    NS_DURING
+
+        TermStorage *storage = [(TermController *)[self valueForKey: @"controller"] storage];
+
+        if ([storage hasSelection] && [storage isSelected: ICCF_line : ICCF_col]) {
+            selRange = [ICeCoffEETerminalRange rangeWithTerminal: self];
+        } else { // select something
+            [storage selectWordAtLine: ICCF_line offset: ICCF_col];
+            selRange = [ICeCoffEETerminalRange rangeWithTerminal: self];
+            NSCAssert(![selRange rangeIsEmpty], ICCF_LocalizedString(@"Sorry, ICeCoffEE was unable to find anything to select"));
+        }
+
+        // However, word selection does not capture even the approximate boundaries of a URL
+        // (text to a space/line ending character); it'll stop at a period in the middle of a hostname.
+        // So, we expand it as follows:
+
+        ICCF_Delimiters(&urlLeftDelimiters, &urlRightDelimiters);
+
+        termRange = [ICeCoffEETerminalRange rangeWithTerminal: self pt0: [selRange pt0] pt1: [selRange pt0]];
+        // add 1 to range to trap delimiters that are on the edge of the selection (i.e., <...)
+        [termRange growForwardByLength: 1];
+        [termRange growBackwardByLength: ICCF_MAX_URL_LEN]; // potentially too big
+        s = [termRange stringFromRange];
+        ICLog(@"front %@", termRange);
+        delimiterRange = [s rangeOfCharacterFromSet: urlLeftDelimiters
+                                            options: NSLiteralSearch | NSBackwardsSearch];
+        if (delimiterRange.location == NSNotFound) {
+            // extend to beginning of string (as much as possible)
+            [selRange growBackwardByLength: [s length] - 1];
+        } else {
+            NSCAssert(delimiterRange.length == 1, @"Internal error: delimiter matched range is not of length 1");
+            [selRange growBackwardByLength: [s length] - delimiterRange.location - 2];
+        }
+
+        ICLog(@"parsed front %@", selRange);
+
+        termRange = [ICeCoffEETerminalRange rangeWithTerminal: self pt0: [selRange pt1] pt1: [selRange pt1]];
+        // subtract 1 from range to trap delimiters that are on the edge of the selection (i.e., ...>)
+        [termRange growBackwardByLength: 1];
+        [termRange growForwardByLength: ICCF_MAX_URL_LEN]; // potentially too big
+        s = [termRange stringFromRange];
+        ICLog(@"back %@", termRange);
+        delimiterRange = [s rangeOfCharacterFromSet: urlRightDelimiters
+                                            options: NSLiteralSearch];
+        if (delimiterRange.location == NSNotFound) {
+            // extend to end of string
+            [selRange growForwardByLength: [s length] - 1];
+        } else {
+            NSCAssert(delimiterRange.length == 1, @"Internal error: delimiter matched range is not of length 1");
+            [selRange growForwardByLength: delimiterRange.location - 1];
+        }
+
+        ICCF_StartIC();
+
+        s = [selRange stringFromRange];
+
+        range = NSMakeRange(0, [s length]);
+
+        ICCF_CheckRange(range);
+
+        ICLog(@"parsed back %@", selRange);
+        ICLog(@"range of string %@", NSStringFromRange(range));
+        ICCF_ParseURL(s, &range);
+        ICLog(@"parsed range %@ |%@|", NSStringFromRange(range), [s substringWithRange: range]);
+
+        [selRange shrinkFrontByLength: range.location];
+        [selRange shrinkBackByLength: [s length] - range.length - range.location];
+
+        s = [selRange stringFromRange];
+        ICLog(@"reconstituted URL %@", selRange);
+
+        [selRange select];
+        [self setNeedsDisplay];
+        [[self superview] display];
+
+        ICCF_LaunchURL(s, ICCF_KeyboardAction());
+        
+        if (ICCF_prefs.textBlinkEnabled) {
+            int i;
+            // Terminal flashes the selection one more time, so blink one fewer
+            for (i = 1 ; i < ICCF_prefs.textBlinkCount ; i++) {
+                [storage clearSelection];
+                [self setNeedsDisplay];
+                [[self superview] display];
+                usleep(kICBlinkDelayUsecs);
+                [selRange select];
+                [self setNeedsDisplay];
+                [[self superview] display];
+                usleep(kICBlinkDelayUsecs);
+            }
+        }
+    NS_HANDLER
+        ICCF_HandleException(localException);
+    NS_ENDHANDLER
+
+    ICCF_StopIC();
+}
+
+- (void)_optionClickEvent:(NSEvent *)event:(unsigned int)row:(unsigned short)column;
+{
+    if (ICCF_downEvent != nil) {
+        ICCF_line = row; // XXX are these lines or rows? check with wrapping
+        ICCF_col = column;
+        ICCF_optionClickRegistered = YES;
+    } else {
+        [super _optionClickEvent: event :row :column];
+    }
+}
+
+- (void)mouseUp:(NSEvent *)upEvent;
+{
+    ICLog(@"ICeCoffEE Terminal up: %@", upEvent);
+    [super mouseUp: upEvent];
+    if (ICCF_downEvent != nil) {
+        NSPoint downPt = [ICCF_downEvent locationInWindow];
+        NSPoint upPt = [upEvent locationInWindow];
+        [ICCF_downEvent release];
+        ICCF_downEvent = nil;
+        if (abs(downPt.x - upPt.x) <= kICHysteresisPixels && abs(downPt.y - upPt.y) <= kICHysteresisPixels) {
+            if (ICCF_optionClickRegistered) {
+                ICCF_optionClickRegistered = NO;
+                ICLog(@"========= launching... %d x %d", ICCF_line, ICCF_col);
+                ICCF_LaunchURLFromTerminal(self);
+            }
+        }
+    }
+}
+
+- (void)mouseDown:(NSEvent *)downEvent;
+{
+    if (ICCF_enabled && ICCF_prefs.commandClickEnabled && ICCF_EventIsCommandMouseDown(downEvent)) {
+        NSEvent *optionClickEvent = [NSEvent mouseEventWithType: NSLeftMouseDown location: [downEvent locationInWindow] modifierFlags: NSAlternateKeyMask timestamp: [downEvent timestamp] windowNumber: [downEvent windowNumber] context: [downEvent context] eventNumber: [downEvent eventNumber] clickCount: 1 pressure: 0];
+        [ICCF_downEvent release];
+        ICCF_downEvent = [downEvent retain];
+        ICLog(@"ICeCoffEE Terminal constructed: %@", optionClickEvent);
+        ICCF_optionClickRegistered = NO;
+        [super mouseDown: optionClickEvent];
+    } else {
+        [super mouseDown: downEvent];
+    }
+}
+
+// NSDraggingDestination
+// -[TermSubview draggingUpdated:] just invokes draggingEntered...
+// XXX Crashing on repeated drag snap-back can happen even without ICeCoffEE installed; don't bother to try to fix
+- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender;
+{
+    if (!ICCF_prefs.terminalRequireOptionForSelfDrag || [sender draggingSource] != self || ([[NSApp currentEvent] modifierFlags] & NSAlternateKeyMask)) {
+        [super draggingEntered: sender];
+        // When doing non-self drags, this works around one bug in Terminal wherein the option key acts as a toggle, and it shouldn't (see Aqua HIG).  Unfortunately, this messes up drag feedback for self drags, but I don't know of any way to fix it.  Not that most Cocoa apps get it remotely right, anyway.
+        return NSDragOperationCopy;
+    }
+    return NSDragOperationNone;
+}
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEETestWController.h
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEETestWController.h	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEETestWController.h	(revision 170)
@@ -0,0 +1,18 @@
+//
+//  ICeCoffEETestWController.h
+//  ICeCoffEE
+//
+//  Created by Nicholas Riley on Mon Jan 28 2002.
+//  Copyright (c) 2001 Nicholas Riley. All rights reserved.
+//
+
+#import <AppKit/AppKit.h>
+
+
+@interface ICeCoffEETestWController : NSWindowController {
+
+}
+
+- (IBAction)toggleDrawer:(NSButton *)sender;
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEETestWController.m
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEETestWController.m	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEETestWController.m	(revision 170)
@@ -0,0 +1,24 @@
+//
+//  ICeCoffEETestWController.m
+//  ICeCoffEE
+//
+//  Created by Nicholas Riley on Mon Jan 28 2002.
+//  Copyright (c) 2001 Nicholas Riley. All rights reserved.
+//
+
+#import "ICeCoffEETestWController.h"
+
+
+@implementation ICeCoffEETestWController
+
+- (IBAction)toggleDrawer:(NSButton *)sender {
+    NSDrawer *drawer = [[[self window] drawers] objectAtIndex: 0];
+    NSSize size;
+    // work around bug that sets content size to 200x200 no matter what (!?)
+    size = [drawer contentSize];
+    size.height = 56;
+    [drawer setContentSize: size];
+    [drawer toggle: self];
+}
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEETextEdit.c
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEETextEdit.c	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEETextEdit.c	(revision 170)
@@ -0,0 +1,191 @@
+/*
+ *  ICeCoffEETextEdit.c
+ *  ICeCoffEE APE
+ *
+ *  Created by Nicholas Riley on Sun Jan 26 2003.
+ *  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+ *
+ */
+
+// based on ICeTEe.c by Michael Schürig
+
+#include "ICeCoffEETextEdit.h"
+#include "ICeCoffEEConfig.h"
+#include "ICeCoffEEShared.h"
+#include <ApplicationEnhancer/ApplicationEnhancer.h>
+
+//=============================================================================
+//		Global Variables
+//-----------------------------------------------------------------------------
+TEClickProcPtr	gTEClick = NULL;
+
+//=============================================================================
+//		Private function prototypes
+//-----------------------------------------------------------------------------
+void	ICCF_LaunchURLFromTEClick(TEHandle teH, short oldSelStart, short oldSelEnd, iccfURLAction action);
+OSStatus ICCF_DoCommandClick(TEHandle teH, long selStart, long selEnd, iccfURLAction action);
+
+//=============================================================================
+//		ICCF_LaunchURLFromTEClick : TEClick addition.
+//-----------------------------------------------------------------------------
+void	ICCF_LaunchURLFromTEClick(TEHandle teH, short oldSelStart, short oldSelEnd, iccfURLAction action)
+{
+    OSStatus			err;
+    ICapeprintf("ICCF_LaunchURLFromTEClick entered\n");
+    if (ICCF_enabled && ICCF_prefs.commandClickEnabled) {
+        if ( !(		(oldSelStart <= (**teH).selStart) && ((**teH).selStart <= oldSelEnd)
+                 &&	(oldSelStart <= (**teH).selEnd) && ((**teH).selEnd <= oldSelEnd) ) ) {
+            oldSelStart = (**teH).selStart;
+            oldSelEnd = (**teH).selEnd;
+        }
+        err = ICCF_DoCommandClick(teH, oldSelStart, oldSelEnd, action);
+        if (err != noErr && err != userCanceledErr) {
+            ICapeprintf("ICCF_DoCommandClick failed: %ld\n", err);
+            if (ICCF_prefs.errorSoundEnabled) SysBeep(10);
+            if (ICCF_prefs.errorDialogEnabled) {
+                CFStringRef alertTitle = ICCF_CopyLocalizedString(CFSTR("AlertTitle"));
+                CFStringRef alertMessageTemplate = ICCF_CopyLocalizedString(CFSTR("AlertMessage%@"));
+                CFStringRef errStr = ICCF_CopyErrString(err, CFSTR("ICCF_DoCommandClick"));
+                CFStringRef alertMessage = CFStringCreateWithFormat(NULL, NULL, alertMessageTemplate, errStr);
+                CFStringRef disableButton = ICCF_CopyLocalizedString(CFSTR("AlertDisableButton"));
+                AlertStdCFStringAlertParamRec paramRec = { kStdCFStringAlertVersionOne, true, false, NULL, disableButton, NULL, kStdOkItemIndex, 0, kWindowDefaultPosition, kNilOptions };
+
+                DialogRef alertRef = NULL;
+                DialogItemIndex itemHit = kStdOkItemIndex;
+                err = CreateStandardAlert(kAlertNoteAlert, alertTitle, alertMessage, &paramRec, &alertRef);
+
+                if (err != noErr) { // last resort: should be apeprintf, not ICapeprintf
+                    apeprintf("ICCF_DoCommandClick failed, couldn't create alert (%ld): %@\n", err, errStr);
+                } else {
+                    err = RunStandardAlert(alertRef, NULL, &itemHit);
+                    if (err != noErr) { // last resort: should be apeprintf, not ICapeprintf
+                        apeprintf("ICCF_DoCommandClick failed, couldn't run alert (%ld): %@\n", err, errStr);
+                    }
+                }
+                
+                if (alertTitle != NULL) CFRelease(alertTitle);
+                if (alertMessageTemplate != NULL) CFRelease(alertMessageTemplate);
+                if (alertMessage != NULL) CFRelease(alertMessage);
+                if (disableButton != NULL) CFRelease(disableButton);
+                if (errStr != NULL) CFRelease(errStr);
+
+                if (itemHit == kStdCancelItemIndex) {
+                    alertTitle = ICCF_CopyLocalizedString(CFSTR("DisableAlertTitle"));
+                    alertMessageTemplate = ICCF_CopyLocalizedString(CFSTR("DisableAlertMessage%@"));
+                    CFStringRef appName = ICCF_CopyAppName();
+                    alertMessage = CFStringCreateWithFormat(NULL, NULL, alertMessageTemplate, appName);
+                    disableButton = ICCF_CopyLocalizedString(CFSTR("DisableAlertDisableButton"));
+                    CFStringRef dontDisableButton = ICCF_CopyLocalizedString(CFSTR("DisableAlertDontDisableButton"));
+                    
+                    AlertStdCFStringAlertParamRec disableParamRec = { kStdCFStringAlertVersionOne, true, false, disableButton, dontDisableButton, NULL, kStdOkItemIndex, kStdCancelItemIndex, kWindowDefaultPosition, kNilOptions };
+
+                    itemHit = kStdCancelItemIndex;
+                    err = CreateStandardAlert(kAlertNoteAlert, alertTitle, alertMessage, &disableParamRec, &alertRef);
+
+                    if (err != noErr) { // last resort: should be apeprintf, not ICapeprintf
+                        apeprintf("ICCF_DoCommandClick couldn't create alert (%ld)\n", err);
+                    } else {
+                        err = RunStandardAlert(alertRef, NULL, &itemHit);
+                        if (err != noErr) { // last resort: should be apeprintf, not ICapeprintf
+                            apeprintf("ICCF_DoCommandClick couldn't run alert (%ld)\n", err);
+                        }
+                    }
+                    if (alertTitle != NULL) CFRelease(alertTitle);
+                    if (alertMessageTemplate != NULL) CFRelease(alertMessageTemplate);
+                    if (alertMessage != NULL) CFRelease(alertMessage);
+                    if (appName != NULL) CFRelease(appName);
+                    if (disableButton != NULL) CFRelease(disableButton);
+                    if (dontDisableButton != NULL) CFRelease(dontDisableButton);
+
+                    if (itemHit == kStdOkItemIndex) ICCF_enabled = false;
+                }
+            }                
+        }
+    }
+    ICapeprintf("ICCF_LaunchURLFromTEClick exit\n");
+}
+
+//=============================================================================
+//		ICCF_DoCommandClick : Handle the click.
+//-----------------------------------------------------------------------------
+OSStatus	ICCF_DoCommandClick(TEHandle teH, long selStart, long selEnd, iccfURLAction action)
+{
+    ICInstance inst = NULL;
+    OSStatus	err = noErr, err2;
+    ICapeprintf("ICCF_DoCommandClick entered\n");
+    if (inst == NULL) {
+        if ( (err = ICStart(&inst, kICCFCreator)) != noErr)
+            return err;
+    }
+    Handle		textH;
+    SInt8		s;
+    ConstStringPtr hint;
+    Boolean		needsSlashes;
+    textH = (Handle)TEGetText(teH);
+    s = HGetState(textH);
+    HLock(textH);
+    hint = ICCF_GetHint(inst, *textH, GetHandleSize(textH), &selStart, &selEnd, &needsSlashes);
+    ICapeprintf("ICCF_DoCommandClick: %sneedsSlashes\n", needsSlashes ? "" : "doesn't ");
+    if (hint != NULL) {
+        CGrafPtr thePort = teH[0]->inPort;
+        if (!QDIsPortBuffered(thePort)) thePort = NULL;
+        TESetSelect(selStart, selEnd, teH);
+        if (thePort != NULL) QDFlushPortBuffer(thePort, NULL);
+
+        Handle urlH = NewHandle(0);
+        if (urlH == NULL) {
+            err = MemError();
+        } else {
+            err = ICParseURL(inst, hint, *textH, GetHandleSize(textH), &selStart, &selEnd, urlH);
+            if (err == noErr) {
+                if (needsSlashes) ICCF_AddSlashes(urlH, hint);
+                err = ICCF_DoURLAction(inst, hint, *urlH, 0, GetHandleSize(urlH), action);
+            }
+            DisposeHandle(urlH);
+        }
+        
+        if (err == noErr) {
+            SInt32	junk;
+            SInt16	i = ICCF_prefs.textBlinkCount;
+            SInt32  blinkDelay = kICBlinkDelayUsecs / 10000; // XXX incorrect, fix
+            TESetSelect(selStart, selEnd, teH);
+            if (thePort != NULL) QDFlushPortBuffer(thePort, NULL);
+            while (i--) {
+                Delay(blinkDelay, &junk);
+                TEDeactivate(teH);
+                if (thePort != NULL) QDFlushPortBuffer(thePort, NULL);
+                Delay(blinkDelay, &junk);
+                TEActivate(teH);
+                if (thePort != NULL) QDFlushPortBuffer(thePort, NULL);
+            }
+        }
+    }
+    HSetState(textH, s);
+    err2 = ICStop(inst);
+    if (err == noErr)
+        err = err2;
+    ICapeprintf("ICCF_DoCommandClick exit\n");
+    return(err);
+}
+
+void ICCF_TEClick(Point pt, Boolean fExtend, TEHandle teH) {
+    short				oldSelStart, oldSelEnd;
+
+    ICapeprintf("ICCF_TEClick entered\n");
+
+    // Save old selection
+    oldSelStart = (**teH).selStart;
+    oldSelEnd = (**teH).selEnd;
+    // Get modifier keys
+    UInt32 modifiers = GetCurrentEventKeyModifiers();
+    // Call the original TEClick()
+    gTEClick(pt, fExtend, teH);
+    // Do our thing
+    if (modifiers & cmdKey) {
+        iccfURLAction action;
+        action.presentMenu = (modifiers & optionKey) != 0;
+        action.launchInBackground = (modifiers & shiftKey) != 0;
+        ICCF_LaunchURLFromTEClick(teH, oldSelStart, oldSelEnd, action);
+    }
+    ICapeprintf("ICCF_TEClick exited\n");
+}
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEETextEdit.h
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEETextEdit.h	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEETextEdit.h	(revision 170)
@@ -0,0 +1,15 @@
+/*
+ *  ICeCoffEETextEdit.h
+ *  ICeCoffEE APE
+ *
+ *  Created by Nicholas Riley on Sun Jan 26 2003.
+ *  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+ *
+ */
+
+#include <Carbon/Carbon.h>
+
+typedef void (*TEClickProcPtr)(Point pt, Boolean fExtend, TEHandle h);
+extern TEClickProcPtr gTEClick;
+
+void ICCF_TEClick(Point pt, Boolean fExtend, TEHandle h);
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEWebKit.h
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEWebKit.h	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEWebKit.h	(revision 170)
@@ -0,0 +1,16 @@
+//
+//  ICeCoffEEWebKit.h
+//  ICeCoffEE APE
+//
+//  Created by Nicholas Riley on Sun Jan 19 2003.
+//  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+//
+
+#import "ICeCoffEEWebKitSuper.h"
+
+
+@interface ICeCoffEEWebKit : ICeCoffEEWebKitSuper {
+
+}
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEWebKit.m
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEWebKit.m	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEWebKit.m	(revision 170)
@@ -0,0 +1,179 @@
+//
+//  ICeCoffEEWebKit.m
+//  ICeCoffEE APE
+//
+//  Created by Nicholas Riley on Sun Jan 19 2003.
+//  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+//
+
+#import "ICeCoffEEWebKit.h"
+#import <unistd.h>
+
+// from WebCoreBridge.h
+@interface WebCoreBridge : NSObject
+
+- (NSDictionary *)elementAtPoint:(NSPoint)point;
+- (NSString *)selectedString;
+- (void)deselectAll;
+
+// only in Safari 1.0-1.2
+- (void)setSelectionFrom:(id /* WebDOMNode */)start startOffset:(int)startOffset to:(id /* WebDOMNode */)end endOffset:(int) endOffset;
+
+- (id /* WebDOMNode */)selectionStart;
+- (int)selectionStartOffset;
+- (id /* WebDOMNode */)selectionEnd;
+- (int)selectionEndOffset;
+
+// only in Safari 1.1-1.2
+- (NSRect)selectionRect;
+
+// only in Safari 1.3
+- (void)selectNSRange:(NSRange)range;
+
+@end
+
+// from WebKit, private
+@interface WebHTMLView : NSObject
+
+- (WebCoreBridge *)_bridge;
+
+// only in Safari 1.3
+- (NSRange)selectedRange;
+
+@end
+
+@implementation ICeCoffEEWebKit
+
+- (NSMenu *)menuForEvent:(NSEvent *)e;
+{
+    NSMenu *myMenu = [super menuForEvent: e];
+    return ICCF_MenuForEvent(self, myMenu, e);
+}
+
+static NSEvent *downEvent = nil;
+
+// used in Safari < 1.3 because there's no sane way to set the selection
+typedef struct {
+    int startOffset;
+    int endOffset;
+    id fromNode;
+    id toNode;
+} ICCF_WebCoreSelection;
+
+static ICCF_WebCoreSelection selection = {nil, nil, 0, 0};
+
+void ICCF_GetWebCoreBridgeSelection(WebCoreBridge *bridge, ICCF_WebCoreSelection *ioSel) {
+    [ioSel->fromNode release]; ioSel->fromNode = nil;
+    [ioSel->toNode release]; ioSel->toNode = nil;
+    ioSel->startOffset = [bridge selectionStartOffset];
+    ioSel->endOffset = [bridge selectionEndOffset];
+    ioSel->fromNode = [[bridge selectionStart] retain];
+    ioSel->toNode = [[bridge selectionEnd] retain];
+}
+
+void ICCF_SetWebCoreBridgeSelection(WebCoreBridge *bridge, ICCF_WebCoreSelection *inSel) {
+    if (inSel->fromNode == nil || inSel->toNode == nil)
+        [bridge deselectAll];
+    [bridge setSelectionFrom: inSel->fromNode
+                 startOffset: inSel->startOffset
+                          to: inSel->toNode
+                   endOffset: inSel->endOffset];
+}
+// end Safari < 1.3 section
+
+static NSString *selectedString = nil;
+static NSRange selectedRange;
+
+- (void)mouseDown:(NSEvent *)e;
+{
+	[downEvent release]; downEvent = nil;
+    // don't want command-option-click, command-shift-click, etc. to trigger
+    if (ICCF_enabled && ICCF_prefs.commandClickEnabled && ICCF_EventIsCommandMouseDown(e)) {
+        WebCoreBridge *bridge = [(WebHTMLView *)self _bridge];
+		if ([self respondsToSelector: @selector(selectedRange)]) {
+			// Safari 1.3 save selection: it may be deselected on super mouseDown
+			selectedRange = [(WebHTMLView *)self selectedRange];
+		} else if ([bridge respondsToSelector: @selector(selectionStartOffset)]) {
+			// Safari < 1.3 save selection: it will be deselected on super mouseDown
+			ICCF_GetWebCoreBridgeSelection(bridge, &selection);
+			ICLog(@"selection start %d@%@ end %d@%@ string %@", [bridge selectionStartOffset], [bridge selectionStart], [bridge selectionEndOffset], [bridge selectionEnd], [bridge selectedString]);
+		}
+		[selectedString release]; selectedString = nil;
+		selectedString = [[bridge selectedString] retain];
+        downEvent = [e retain];
+    }
+    [super mouseDown: e];
+}
+
+- (void)mouseUp:(NSEvent *)e;
+{
+    [super mouseUp: e];
+    if (downEvent != nil) {
+        NSPoint downPt = [downEvent locationInWindow];
+        NSPoint upPt = [e locationInWindow];
+		[downEvent release]; downEvent = nil;
+        if (abs(downPt.x - upPt.x) > kICHysteresisPixels && abs(downPt.y - upPt.y) > kICHysteresisPixels)
+            return;
+
+        NS_DURING
+            WebCoreBridge *bridge = [(WebHTMLView *)self _bridge];
+            NSPoint viewClickPt = [self convertPoint: downPt fromView: nil];
+            NSDictionary *elementDict = [bridge elementAtPoint: viewClickPt];
+            ICLog(@"elementDict: %@", elementDict);
+            NSAssert([elementDict count] != 0, @"Internal error: Got empty element dictionary from WebHTMLView");
+            if ([elementDict objectForKey: @"WebElementLinkURL"] != nil) {
+                ICLog(@"got a link");
+                NS_VOIDRETURN; // donÕt activate on links
+            }
+			if (selectedString == nil || [selectedString length] == 0) {
+				ICLog(@"no selected string");
+				NS_VOIDRETURN;
+			}
+			ICCF_StartIC();
+			ICCF_LaunchURL(selectedString, ICCF_KeyboardAction());
+			if (ICCF_prefs.textBlinkEnabled &&
+				[bridge respondsToSelector: @selector(selectNSRange:)]) {
+				// blink text in Safari 1.3
+				[bridge selectNSRange: selectedRange];
+				int i;
+				NSRect selectionRect = [bridge selectionRect];
+				ICLog(@"selectedRange %@ selectionRect %@ textBlinkCount %d", NSStringFromRange(selectedRange), NSStringFromRect(selectionRect), ICCF_prefs.textBlinkCount);
+				for (i = 0 ; i < ICCF_prefs.textBlinkCount ; i++) {
+					[bridge deselectAll];
+					[self setNeedsDisplayInRect: selectionRect];
+					[self display];
+					usleep(kICBlinkDelayUsecs);
+					[bridge selectNSRange: selectedRange];
+					[self setNeedsDisplayInRect: selectionRect];
+					[self display];
+					usleep(kICBlinkDelayUsecs);
+				}
+			} else {
+				// select text in Safari 1.0-1.2
+				ICCF_SetWebCoreBridgeSelection(bridge, &selection);
+				if (ICCF_prefs.textBlinkEnabled &&
+					[bridge respondsToSelector: @selector(selectionRect)]) {
+					// blink text in Safari 1.1/1.2
+					int i;
+					NSRect selectionRect = [bridge selectionRect];
+					for (i = 0 ; i < ICCF_prefs.textBlinkCount ; i++) {
+						[bridge deselectAll];
+						[self setNeedsDisplayInRect: selectionRect];
+						[self display];
+						usleep(kICBlinkDelayUsecs);
+						ICCF_SetWebCoreBridgeSelection(bridge, &selection);
+						[self setNeedsDisplayInRect: selectionRect];
+						[self display];
+						usleep(kICBlinkDelayUsecs);
+					}
+				}
+			}
+        NS_HANDLER
+            ICCF_HandleException(localException);
+        NS_ENDHANDLER
+
+        ICCF_StopIC();
+    }        
+}
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEWebKitSuper.h
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEWebKitSuper.h	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEWebKitSuper.h	(revision 170)
@@ -0,0 +1,16 @@
+//
+//  ICeCoffEEWebKitSuper.h
+//  ICeCoffEE APE
+//
+//  Created by Nicholas Riley on Sun Jan 19 2003.
+//  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+//
+
+#import "ICeCoffEE.h"
+
+
+@interface ICeCoffEEWebKitSuper : NSView {
+
+}
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEWebKitSuper.m
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEWebKitSuper.m	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/ICeCoffEEWebKitSuper.m	(revision 170)
@@ -0,0 +1,29 @@
+//
+//  ICeCoffEEWebKitSuper.m
+//  ICeCoffEE APE
+//
+//  Created by Nicholas Riley on Sun Jan 19 2003.
+//  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+//
+
+#import "ICeCoffEEWebKitSuper.h"
+
+
+@implementation ICeCoffEEWebKitSuper
+
+- (NSMenu *)menuForEvent:(NSEvent *)e;
+{
+    return [super menuForEvent: e];
+}
+
+- (void)mouseUp:(NSEvent *)e;
+{
+    [super mouseUp: e];
+}
+
+- (void)mouseDown:(NSEvent *)e;
+{
+    [super mouseDown: e];
+}
+
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/Info-APE Module.plist
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/Info-APE Module.plist	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/Info-APE Module.plist	(revision 170)
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>APEHasExcludeList</key>
+	<true/>
+	<key>APEMatchInfo</key>
+	<dict>
+		<key>APEMatchFlavor</key>
+		<string>Cocoa</string>
+	</dict>
+	<key>APEVersionRequired</key>
+	<string>1.3</string>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleExecutable</key>
+	<string>ICeCoffEE</string>
+	<key>CFBundleGetInfoString</key>
+	<string></string>
+	<key>CFBundleIconFile</key>
+	<string></string>
+	<key>CFBundleIdentifier</key>
+	<string>net.sabi.ICeCoffEE</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string></string>
+	<key>CFBundlePackageType</key>
+	<string>BNDL</string>
+	<key>CFBundleShortVersionString</key>
+	<string></string>
+	<key>CFBundleSignature</key>
+	<string>ICCF</string>
+	<key>CFBundleVersion</key>
+	<string>1.4.1</string>
+</dict>
+</plist>
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/Info-APEManagerPrefPane.plist
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/Info-APEManagerPrefPane.plist	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/Info-APEManagerPrefPane.plist	(revision 170)
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleExecutable</key>
+	<string></string>
+	<key>CFBundleGetInfoString</key>
+	<string></string>
+	<key>CFBundleIconFile</key>
+	<string></string>
+	<key>CFBundleIdentifier</key>
+	<string></string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string></string>
+	<key>CFBundlePackageType</key>
+	<string>BNDL</string>
+	<key>CFBundleShortVersionString</key>
+	<string></string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1.0</string>
+	<key>NSMainNibFile</key>
+	<string>APE Manager plugin</string>
+	<key>NSPrincipalClass</key>
+	<string>ICeCoffEEController</string>
+</dict>
+</plist>
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/Info-ICeCoffEE Installer.plist
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/Info-ICeCoffEE Installer.plist	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/Info-ICeCoffEE Installer.plist	(revision 170)
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleExecutable</key>
+	<string></string>
+	<key>CFBundleGetInfoString</key>
+	<string></string>
+	<key>CFBundleIconFile</key>
+	<string></string>
+	<key>CFBundleIdentifier</key>
+	<string></string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string></string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+	<string></string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>0.0.1d1</string>
+</dict>
+</plist>
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Info.plist
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Info.plist	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Info.plist	(revision 170)
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleExecutable</key>
+	<string>Unsanity Installer</string>
+	<key>CFBundleGetInfoString</key>
+	<string>Unsanity Installer version 3.3, Copyright ©2002-2004 Unsanity LLC.</string>
+	<key>CFBundleIconFile</key>
+	<string>ui.icns</string>
+	<key>CFBundleIdentifier</key>
+	<string>com.unsanity.installer</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>Unsanity Installer version 3.3</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>3.3</string>
+	<key>NSMainNibFile</key>
+	<string>MainMenu</string>
+	<key>NSPrincipalClass</key>
+	<string>NSApplication</string>
+</dict>
+</plist>
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/PkgInfo
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/PkgInfo	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/PkgInfo	(revision 170)
@@ -0,0 +1,1 @@
+APPL????
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/English.lproj/Localizable.strings
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/English.lproj/Localizable.strings	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/English.lproj/Localizable.strings	(revision 170)
@@ -0,0 +1,79 @@
+/* Incompatible OSX Panel */
+"Incompatible Mac OS X Version" = "Incompatible Mac OS X Version";
+"%@ reqires at least Mac OS X %@. You have an older version installed. Please upgrade or download an older version of %@ that will be compatible with your system." = "%@ reqires at least Mac OS X %@. You have an older version installed. Please upgrade or download an older version of %@ that will be compatible with your system.";
+
+/* Ready Tab */
+"%@ was already installed for all users on this machine, and you are trying to install a local version. Doing so will result in two copies of %@ running on your Macintosh, which is not a good idea. You can either Cancel, try to Remove for All Users or try to Install for All Users (you will need administrator priviliges for latter two)." = "%@ was already installed for all users on this machine, and you are trying to install a local version. Doing so will result in two copies of %@ running on your Macintosh, which is not a good idea. You can either Cancel, try to Remove for All Users or try to Install for All Users (you will need administrator priviliges for latter two).";
+"%@ was already installed for this user, and you're about to do an install for all users on this machine. Doing so will result in two copies of %@ running on your Macintosh, which is not a good idea. If you Continue, this installer will first remove the version installed for this user, then proceed with all users installation." = "%@ was already installed for this user, and you're about to do an install for all users on this machine. Doing so will result in two copies of %@ running on your Macintosh, which is not a good idea. If you Continue, this installer will first remove the version installed for this user, then proceed with all users installation.";
+"Already Installed For All Users" = "Already Installed For All Users";
+"Already Installed For This User" = "Already Installed For This User";
+"Install For All Users" = "Install For All Users";
+"When you click \"Continue\", you will be asked to authenticate with your administrator password, if needed. This is done because certain components of this software has to be installed system-wide in order to function properly." = "When you click \"Continue\", you will be asked to authenticate with your administrator password, if needed. This is done because certain components of this software has to be installed system-wide in order to function properly.";
+
+/* Install Table Strings */
+"Application Enhancer" = "Application Enhancer";
+"Installed \"%@\"" = "Installed \"%@\"";
+"Created folder \"%@\"" = "Created folder \"%@\"";
+"Uninstalled previously installed" = "Uninstalled previously installed";
+"(files were moved to the Trash)" = "(files were moved to the Trash)";
+
+/* Uninstall Panel */
+"Are you sure you want to uninstall %@ %@ %@? Please note that this installer will automatically uninstall an older version of the product during the installation." = "Are you sure you want to uninstall %@ %@ %@? Please note that this installer will automatically uninstall an older version of the product during the installation.";
+"globally installed" = "globally installed";
+"locally installed" = "locally installed";
+
+/* Authentication Failed Panel */
+"Authentication Failed" = "Authentication Failed";
+"You have failed to enter the administrator password; this installer requires Administrator privileges to install the software you have selected. Please try again." = "You have failed to enter the administrator password; this installer requires Administrator privileges to install the software you have selected. Please try again.";
+
+/* Button Titles */
+"OK" = "OK";
+"Cancel" = "Cancel";
+"Continue" = "Continue";
+"Go Back" = "Go Back";
+"Quit" = "Quit";
+"Uninstall" = "Uninstall";
+
+/* Version n/a */
+"n/a" = "n/a";
+
+/* Install paths for Show Files window */
+"%@ or %@" = "%@ or %@";
+
+/* Options Tab */
+"Open \"%@\" %@ Upon Completion" = "Open \"%@\" %@ Upon Completion";
+
+/* Ready Tab */
+"Remove For All Users" = "Remove For All Users";
+
+/* Step N of M strings */
+"Step %d of %d" = "Step %d of %d";
+"Step %d of %d: %@" = "Step %d of %d: %@";
+
+/* Installer Information Missing Panel */
+"Installer Information Missing" = "Installer Information Missing";
+"This installer cannot find or read the required information about the installable product.\n\nThe installer is unable to continue. Please contact the author of the software or re-download the package." = "This installer cannot find or read the required information about the installable product.\n\nThe installer is unable to continue. Please contact the author of the software or re-download the package.";
+
+/* Uninstall Panel */
+"Uninstall Complete" = "Uninstall Complete";
+"Uninstall Failed" = "Uninstall Failed";
+"We were unable to uninstall %@ from your system. Please check if you have entered your administrator password correctly and that you have sufficient privileges and try again (or remove the files manually)." = "We were unable to uninstall %@ from your system. Please check if you have entered your administrator password correctly and that you have sufficient privileges and try again (or remove the files manually).";
+"You will be asked for your administrator password when you click Uninstall." = "You will be asked for your administrator password when you click Uninstall.";
+"%@ was successfully uninstalled from your system. Thank you for evaluating our product!" = "%@ was successfully uninstalled from your system. Thank you for evaluating our product!";
+
+/* Default Product Name */
+"Untitled Product" = "Untitled Product";
+
+/* Default Product Version */
+"1.0" = "1.0";
+
+/* Default Product Type */
+"Application" = "Application";
+
+/* Window title */
+"Installer" = "Installer"; /* (ProductName) Installer */
+
+/* Done Tab */
+"When you click the \"Quit\" button below, the installed product will be launched, and this Installer will quit." = "When you click the \"Quit\" button below, the installed product will be launched, and this Installer will quit.";
+"When you click the \"Quit\" button below, this Installer will quit." = "When you click the \"Quit\" button below, this Installer will quit.";
+"You are strongly advised to log out or restart your computer in order for the installed product to completely take effect. Thank you!" = "You are strongly advised to log out or restart your computer in order for the installed product to completely take effect. Thank you!";
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/English.lproj/MainMenu.nib/classes.nib
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/English.lproj/MainMenu.nib/classes.nib	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/English.lproj/MainMenu.nib/classes.nib	(revision 170)
@@ -0,0 +1,46 @@
+{
+    IBClasses = (
+        {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, 
+        {
+            ACTIONS = {
+                doAPEHomePage = id; 
+                doBackButton = id; 
+                doContinueButton = id; 
+                doLicenseAgree = id; 
+                doLicenseDisagree = id; 
+                doShowInstallFiles = id; 
+                doUninstallCancel = id; 
+                doUninstallConfirm = id; 
+            }; 
+            CLASS = UIController; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {
+                apeCurrentVersionText = id; 
+                apeInstallVersionText = id; 
+                donLogOutText = id; 
+                donQuitText = id; 
+                filFilesTable = id; 
+                filWindow = id; 
+                genBackButton = id; 
+                genContinueButton = id; 
+                genStepText = id; 
+                insFilesTable = id; 
+                licAgreePanel = id; 
+                licTextView = id; 
+                optCreateLog = id; 
+                optGlobalInstallMatrix = id; 
+                optOpenUponCompletion = id; 
+                redExplanationText = id; 
+                remTextView = id; 
+                tabView = id; 
+                uniAuthRequiredText = id; 
+                uniExplanationText = id; 
+                uniFilesTable = id; 
+                uniPanel = id; 
+            }; 
+            SUPERCLASS = NSWindowController; 
+        }, 
+        {CLASS = URLTextView; LANGUAGE = ObjC; SUPERCLASS = NSTextView; }
+    ); 
+    IBVersion = 1; 
+}
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/English.lproj/MainMenu.nib/info.nib
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/English.lproj/MainMenu.nib/info.nib	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/English.lproj/MainMenu.nib/info.nib	(revision 170)
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IBDocumentLocation</key>
+	<string>63 116 356 240 0 0 1280 1002 </string>
+	<key>IBEditorPositions</key>
+	<dict>
+		<key>29</key>
+		<string>371 197 202 44 0 0 1280 1002 </string>
+	</dict>
+	<key>IBFramework Version</key>
+	<string>364.0</string>
+	<key>IBOpenObjects</key>
+	<array>
+		<integer>29</integer>
+		<integer>21</integer>
+	</array>
+	<key>IBSystem Version</key>
+	<string>7M34</string>
+	<key>IBUserGuides</key>
+	<dict>
+		<key>21</key>
+		<dict>
+			<key>guideLocations</key>
+			<array>
+				<string>Vertical:334.000000</string>
+			</array>
+			<key>guidesLocked</key>
+			<false/>
+		</dict>
+	</dict>
+</dict>
+</plist>
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/Italian.lproj/InfoPlist.strings
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/Italian.lproj/InfoPlist.strings	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/Italian.lproj/InfoPlist.strings	(revision 170)
@@ -0,0 +1,6 @@
+/* Localized versions of Info.plist keys */
+
+CFBundleName = "Unsanity Installer";
+CFBundleShortVersionString = "Unsanity Installer versione 3.3";
+CFBundleGetInfoString = "Unsanity Installer versione 3.3, Copyright ©2002-2004, Unsanity LLC.";
+NSHumanReadableCopyright = "Copyright ©2002-2004, Unsanity LLC.";
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/Italian.lproj/Localizable.strings
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/Italian.lproj/Localizable.strings	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/Italian.lproj/Localizable.strings	(revision 170)
@@ -0,0 +1,86 @@
+/* Incompatible OSX Panel */
+"Incompatible Mac OS X Version" = "Versione Mac OS X Incompatibile";
+"%@ reqires at least Mac OS X %@. You have an older version installed. Please upgrade or download an older version of %@ that will be compatible with your system." = "%@ richiede almeno Mac OS X %@. Hai una versione precedente installata. Per favore Aggiorna o scarica una versione precedente di %@ che sia compatibile col tuo sistema.";
+
+/* Ready Tab */
+"%@ was already installed for all users on this machine, and you are trying to install a local version. Doing so will result in two copies of %@ running on your Macintosh, which is not a good idea. You can either Cancel, try to Remove for All Users or try to Install for All Users (you will need administrator priviliges for latter two)." = "%@ è già stato installato per tutti gli utenti di questo computer, e stai cercando di installare una versione locale. Facendo cosi risulteranno 2 copie di %@ attive sul tuo Macintosh, il che non è buona idea. Puoi sia Annullare, provare a Rimuovere Per Tutti Gli Utenti o reinstallare per Tutti Gli Utenti (verranno richiesti i privilegi di amministratore).";
+"%@ was already installed for this user, and you're about to do an install for all users on this machine. Doing so will result in two copies of %@ running on your Macintosh, which is not a good idea. If you Continue, this installer will first remove the version installed for this user, then proceed with all users installation." = "%@ è già stato installato per questo utente, e stai per installare un altra copia per tutti gli utenti. Facendo cosi risulteranno 2 copie di %@ attive sul tuo Macintosh, il che non è buona idea. Se Continui, questo installatore prima rimuoverà la versione installata per questo utente, poi procederà all'installazione per tutti gli utenti.";
+"Already Installed For All Users" = "Già Installato Per Tutti Gli Utenti";
+"Already Installed For This User" = "Già Installato Per Questo Utente";
+"Install For All Users" = "Installa Per Tutti Gli Utenti";
+"When you click \"Continue\", you will be asked to authenticate with your administrator password, if needed. This is done because certain components of this software has to be installed system-wide in order to function properly." = "Quando Cliccherai su \"Continua\", ti verrà richiesta la parola chiave di amministratore. Questo avviene perché alcuni componenti del programma devono essere installati lungo tutto il sistema per funzionare adeguatamente.";
+
+/* Install Table Strings */
+"Application Enhancer" = "Application Enhancer";
+"Installed \"%@\"" = "Installato \"%@\"";
+"Created folder \"%@\"" = "Cartella creata \"%@\"";
+"Uninstalled previously installed" = "Disintallata l'installazione precedente";
+"(files were moved to the Trash)" = "(i files sono stati Cestinati)";
+
+/* Uninstall Panel */
+"Are you sure you want to uninstall %@ %@ %@? Please note that this installer will automatically uninstall an older version of the product during the installation." = "Siete sicuro di disinstallare %@ %@ %@? Per favore nota che questo Disinstallatore rimuoverà automaticamente una versione più vecchia del prodotto durante il processo.";
+"globally installed" = "globalmente installato";
+"locally installed" = "localmente installato";
+
+/* Authentication Failed Panel */
+"Authentication Failed" = "Autenticazione Fallita";
+"You have failed to enter the administrator password; this installer requires Administrator privileges to install the software you have selected. Please try again." = "Non sei riuscito a digitare la parola d'accesso dell'amministratore; questo installatore richiede i privilegi dell'amministratore per installare il software selezionato. Prego riprova.";
+
+/* Button Titles */
+"OK" = "OK";
+"Cancel" = "Annulla";
+"Continue" = "Continua";
+"Go Back" = "Torna Indietro";
+"Quit" = "Esci";
+"Uninstall" = "Disinstalla";
+
+/* Version n/a */
+"n/a" = "n/d";
+
+/* Install paths for Show Files window */
+"%@ or %@" = "%@ o %@";
+
+/* Options Tab */
+"Open \"%@\" %@ Upon Completion" = "Apro \"%@\" %@ Completato";
+
+/* Ready Tab */
+"Remove For All Users" = "Rimuovi Per Tutti Gli Utenti";
+
+/* Step N of M strings */
+"Step %d of %d" = "Passo %d di %d";
+"Step %d of %d: %@" = "Passo %d di %d: %@";
+"About This Product" = "Riguardo Questo Prodotto";
+"License Agreement" = "Accordo Licenza";
+"Installation Options" = "Opzioni di Installazione";
+"Ready To Install" = "Pronto per Installare";
+"Install Progress" = "Andamento Installazione";
+"Installation Complete" = "Installazione Completata";
+
+/* Installer Information Missing Panel */
+"Installer Information Missing" = "Informazioni Installatore Mancanti";
+"This installer cannot find or read the required information about the installable product.\n\nThe installer is unable to continue. Please contact the author of the software or re-download the package." = "Questo installatore non può trovare o leggere le informazioni richieste sull'installatore installabile del prodotto.\n\nL'installatore non può continuare. Per favore contatta l'autore del software o ri-scarica il pacchetto.";
+
+/* Uninstall Panel */
+"Uninstall Complete" = "Disinstallazione Completata";
+"Uninstall Failed" = "Disinstallazione fallita";
+"We were unable to uninstall %@ from your system. Please check if you have entered your administrator password correctly and that you have sufficient privileges and try again (or remove the files manually)." = "Non abbiamo potuto disinstallare %@ dal sistema. Per favore controlla se hai digitato correttamente la vostra parola d'accesso dell'amministratore e se si hanno i privilegi sufficienti e prova ancora (o rimuovi manualmente gli archivi).";
+"You will be asked for your administrator password when you click Uninstall." = "Verrà chiesta la parola d'accesso dell'amministratore quando cliccherai su Disinstalla.";
+"%@ was successfully uninstalled from your system. Thank you for evaluating our product!" = "%@ e' stato disinstallato con successo dal vostro sistema. Grazie per la valutazione del nostro prodotto!";
+
+/* Default Product Name */
+"Untitled Product" = "Prodotto Senza Titolo";
+
+/* Default Product Version */
+"1.0" = "1.0";
+
+/* Default Product Type */
+"Application" = "Applicazione";
+
+/* Window title */
+"Installer" = "Installatore"; /* (ProductName) Installer */
+
+/* Done Tab */
+"Log Out Suggested" = "Log Out Consigliato";
+"When you click the \"Quit\" button below, the installed product will be launched, and this Installer will quit." = "Quando sotto clicchi \"Esci\" , il prodotto installato verrà lanciato, e l'installer si chiuderà.";
+"When you click the \"Quit\" button below, this Installer will quit." = "Quando sotto clicchi \"Esci\" ,  l'installer si chiuderà.";
+"You are strongly advised to log out or restart your computer in order for the installed product to completely take effect. Thank you!" = "Sei fortemente consigliato di uscire e riaccedere dall'utenza (log in/out) affinchè il prodotto installato entri in azione. Grazie!";
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/Italian.lproj/MainMenu.nib/classes.nib
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/Italian.lproj/MainMenu.nib/classes.nib	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/Italian.lproj/MainMenu.nib/classes.nib	(revision 170)
@@ -0,0 +1,46 @@
+{
+    IBClasses = (
+        {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, 
+        {
+            ACTIONS = {
+                doAPEHomePage = id; 
+                doBackButton = id; 
+                doContinueButton = id; 
+                doLicenseAgree = id; 
+                doLicenseDisagree = id; 
+                doShowInstallFiles = id; 
+                doUninstallCancel = id; 
+                doUninstallConfirm = id; 
+            }; 
+            CLASS = UIController; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {
+                apeCurrentVersionText = id; 
+                apeInstallVersionText = id; 
+                donLogOutText = id; 
+                donQuitText = id; 
+                filFilesTable = id; 
+                filWindow = id; 
+                genBackButton = id; 
+                genContinueButton = id; 
+                genStepText = id; 
+                insFilesTable = id; 
+                licAgreePanel = id; 
+                licTextView = id; 
+                optCreateLog = id; 
+                optGlobalInstallMatrix = id; 
+                optOpenUponCompletion = id; 
+                redExplanationText = id; 
+                remTextView = id; 
+                tabView = id; 
+                uniAuthRequiredText = id; 
+                uniExplanationText = id; 
+                uniFilesTable = id; 
+                uniPanel = id; 
+            }; 
+            SUPERCLASS = NSWindowController; 
+        }, 
+        {CLASS = URLTextView; LANGUAGE = ObjC; SUPERCLASS = NSTextView; }
+    ); 
+    IBVersion = 1; 
+}
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/Italian.lproj/MainMenu.nib/info.nib
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/Italian.lproj/MainMenu.nib/info.nib	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/Italian.lproj/MainMenu.nib/info.nib	(revision 170)
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IBDocumentLocation</key>
+	<string>2 8 356 240 0 0 1280 832 </string>
+	<key>IBEditorPositions</key>
+	<dict>
+		<key>29</key>
+		<string>42 522 202 44 0 0 1280 832 </string>
+	</dict>
+	<key>IBFramework Version</key>
+	<string>364.0</string>
+	<key>IBOpenObjects</key>
+	<array>
+		<integer>21</integer>
+	</array>
+	<key>IBSystem Version</key>
+	<string>7M34</string>
+	<key>IBUserGuides</key>
+	<dict>
+		<key>21</key>
+		<dict>
+			<key>guideLocations</key>
+			<array>
+				<string>Vertical:334.000000</string>
+			</array>
+			<key>guidesLocked</key>
+			<false/>
+		</dict>
+	</dict>
+</dict>
+</plist>
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/Japanese.lproj/MainMenu.nib/classes.nib
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/Japanese.lproj/MainMenu.nib/classes.nib	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/Japanese.lproj/MainMenu.nib/classes.nib	(revision 170)
@@ -0,0 +1,46 @@
+{
+    IBClasses = (
+        {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, 
+        {
+            ACTIONS = {
+                doAPEHomePage = id; 
+                doBackButton = id; 
+                doContinueButton = id; 
+                doLicenseAgree = id; 
+                doLicenseDisagree = id; 
+                doShowInstallFiles = id; 
+                doUninstallCancel = id; 
+                doUninstallConfirm = id; 
+            }; 
+            CLASS = UIController; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {
+                apeCurrentVersionText = id; 
+                apeInstallVersionText = id; 
+                donLogOutText = id; 
+                donQuitText = id; 
+                filFilesTable = id; 
+                filWindow = id; 
+                genBackButton = id; 
+                genContinueButton = id; 
+                genStepText = id; 
+                insFilesTable = id; 
+                licAgreePanel = id; 
+                licTextView = id; 
+                optCreateLog = id; 
+                optGlobalInstallMatrix = id; 
+                optOpenUponCompletion = id; 
+                redExplanationText = id; 
+                remTextView = id; 
+                tabView = id; 
+                uniAuthRequiredText = id; 
+                uniExplanationText = id; 
+                uniFilesTable = id; 
+                uniPanel = id; 
+            }; 
+            SUPERCLASS = NSWindowController; 
+        }, 
+        {CLASS = URLTextView; LANGUAGE = ObjC; SUPERCLASS = NSTextView; }
+    ); 
+    IBVersion = 1; 
+}
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/Japanese.lproj/MainMenu.nib/info.nib
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/Japanese.lproj/MainMenu.nib/info.nib	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/Japanese.lproj/MainMenu.nib/info.nib	(revision 170)
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IBDocumentLocation</key>
+	<string>4 10 356 240 0 0 1280 832 </string>
+	<key>IBEditorPositions</key>
+	<dict>
+		<key>29</key>
+		<string>55 519 250 44 0 0 1280 832 </string>
+	</dict>
+	<key>IBFramework Version</key>
+	<string>364.0</string>
+	<key>IBOpenObjects</key>
+	<array>
+		<integer>21</integer>
+	</array>
+	<key>IBSystem Version</key>
+	<string>7M34</string>
+	<key>IBUserGuides</key>
+	<dict>
+		<key>21</key>
+		<dict>
+			<key>guideLocations</key>
+			<array>
+				<string>Vertical:334.000000</string>
+			</array>
+			<key>guidesLocked</key>
+			<false/>
+		</dict>
+	</dict>
+</dict>
+</plist>
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/es.lproj/InfoPlist.strings
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/es.lproj/InfoPlist.strings	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/es.lproj/InfoPlist.strings	(revision 170)
@@ -0,0 +1,6 @@
+/* Localized versions of Info.plist keys */
+
+CFBundleName = "Instalador Unsanity";
+CFBundleShortVersionString = "Instalador Unsanity";
+CFBundleGetInfoString = "Instalador Unsanity versión 3.3, Copyright ©2002-2004, Unsanity LLC.";
+NSHumanReadableCopyright = "Copyright ©2002-2004, Unsanity LLC.";
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/es.lproj/Localizable.strings
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/es.lproj/Localizable.strings	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/es.lproj/Localizable.strings	(revision 170)
@@ -0,0 +1,85 @@
+/* Incompatible OSX Panel */
+"Incompatible Mac OS X Version" = "Versión de Mac OS X incompatible";
+"%@ reqires at least Mac OS X %@. You have an older version installed. Please upgrade or download an older version of %@ that will be compatible with your system." = "%@ requiere al menos Mac OS X %@. Usted tiene instalada una versión antigua. Por favor, actualice o descargue una versión de %@ que sea compatible con su sistema.";
+
+/* Ready Tab */
+"%@ was already installed for all users on this machine, and you are trying to install a local version. Doing so will result in two copies of %@ running on your Macintosh, which is not a good idea. You can either Cancel, try to Remove for All Users or try to Install for All Users (you will need administrator priviliges for latter two)." = "%@ ya está instalado para todos los usuarios de esta máquina, y usted está intentando instalar una versión local. Esto dará como resultado tener dos copias de %@ corriendo en su Macintosh, lo cual no es una buena idea. Usted puede Cancelar, Intentar Borrarla para Todos los Usuarios o Instalarla para Todos los Usuarios (necesitará privilegios de administrador para estos dos últimos).";
+"%@ was already installed for this user, and you're about to do an install for all users on this machine. Doing so will result in two copies of %@ running on your Macintosh, which is not a good idea. If you Continue, this installer will first remove the version installed for this user, then proceed with all users installation." = "%@ ya está instalado para este usuario, y usted está intentando instalarlo para todos los usuarios de esta máquina. Esto dará como resultado tener dos copias de %@ corriendo en su Macintosh, lo cual no es una buena idea. Si usted Continua, este instalador primero borrará la versión de este usuario, y luego procederá a la instalación para todos los usuarios.";
+"Already Installed For All Users" = "Ya instalado para todos los usuarios";
+"Already Installed For This User" = "Ya instalado para este usuario";
+"Install For All Users" = "Instalar para todos los usuarios";
+"When you click \"Continue\", you will be asked to authenticate with your administrator password, if needed. This is done because certain components of this software has to be installed system-wide in order to function properly." = "Cuando haga clic en \"Continue\", se le preguntará por su contraseña de administrador para autenticarse, si es necesario. Esto es debido porque algunos componentes de este software tienen que instalarse integrados al sistema para funcionar correctamente.";
+
+/* Install Table Strings */
+"Application Enhancer" = "Application Enhancer";
+"Installed \"%@\"" = "Instalado \"%@\"";
+"Created folder \"%@\"" = "Carpeta creada \"%@\"";
+"Uninstalled previously installed" = "Desinstalando";
+"(files were moved to the Trash)" = "(archivos movidos a la Papelera)";
+
+/* Uninstall Panel */
+"Are you sure you want to uninstall %@ %@ %@? Please note that this installer will automatically uninstall an older version of the product during the installation." = "¿Está seguro de que quiere desinstalar %@ %@ %@? Se desinstalará automáticamente la versión antigua del producto durante la instalación.";
+"globally installed" = "globalmente instalado";
+"locally installed" = "localmente instalado";
+
+/* Authentication Failed Panel */
+"Authentication Failed" = "Autenticación errónea";
+"You have failed to enter the administrator password; this installer requires Administrator privileges to install the software you have selected. Please try again." = "La contraseña de administrador no es correcta; este instalador requiere privilegios de Administrador para instalar el software seleccionado. Por favor, inténtelo de nuevo.";
+
+/* Button Titles */
+"OK" = "OK";
+"Cancel" = "Cancelar";
+"Continue" = "Continuar";
+"Go Back" = "Volver atrás";
+"Quit" = "Salir";
+"Uninstall" = "Desinstalar";
+
+/* Version n/a */
+"n/a" = "n/a";
+
+/* Install paths for Show Files window */
+"%@ or %@" = "%@ o %@";
+
+/* Options Tab */
+"Open \"%@\" %@ Upon Completion" = "Abrir \"%@\" %@ al terminar";
+
+/* Ready Tab */
+"Remove For All Users" = "Borrar para todos los usuarios";
+
+/* Step N of M strings */
+"Step %d of %d" = "Paso %d de %d";
+"Step %d of %d: %@" = "Paso %d de %d: %@";
+"License Agreement" = "Acuerdo de licencia";
+"About This Product" = "Acerca de este producto";
+"Installation Options" = "Opciones de instalación";
+"Ready To Install" = "Preparado para instalar";
+"Install Progress" = "Progreso de instalación";
+"Installation Complete" = "Instalación completada";
+
+/* Installer Information Missing Panel */
+"Installer Information Missing" = "No se encuentra la información del Instalador";
+"This installer cannot find or read the required information about the installable product.\n\nThe installer is unable to continue. Please contact the author of the software or re-download the package." = "Este instalador no puede encontrar o leer la información requerida acerca del producto.\n\nEl instalador no puede continuar. Por favor, contacte con el autor del software o vuelva a descargar el paquete.";
+
+/* Uninstall Panel */
+"Uninstall Complete" = "Desinstalación completa";
+"Uninstall Failed" = "Desinstalación fallida";
+"We were unable to uninstall %@ from your system. Please check if you have entered your administrator password correctly and that you have sufficient privileges and try again (or remove the files manually)." = "No se puede desinstalar %@ de su sistema. Por favor, compruebe que ha introducido correctamente su contraseña de administrador y que tiene suficientes privilegios e inténtelo de nuevo (o borre los archivos manualmente).";
+"You will be asked for your administrator password when you click Uninstall." = "Se le preguntará por su contraseña de administrador cuando haga clic en Desinstalar.";
+"%@ was successfully uninstalled from your system. Thank you for evaluating our product!" = "%@ se ha desinstalado con éxito de su sistema. ¡Gracias por probar nuestro producto!";
+
+/* Default Product Name */
+"Untitled Product" = "Producto sin título";
+
+/* Default Product Version */
+"1.0" = "1.0";
+
+/* Default Product Type */
+"Application" = "Aplicación";
+
+/* Window title */
+"Installer" = "Instalador"; /* (ProductName) Installer */
+
+/* Done Tab */
+"When you click the \"Quit\" button below, the installed product will be launched, and this Installer will quit." = "Cuando haga clic en el botón \"Quit\" inferior, se lanzará el producto instalado, y este Instalador saldrá de él.";
+"When you click the \"Quit\" button below, this Installer will quit." = "Cuando haga clic en el botón \"Quit\" inferior, este Instalador saldrá.";
+"You are strongly advised to log out or restart your computer in order for the installed product to completely take effect. Thank you!" = "Le aconsejamos con fuerza cerrar sesión o reiniciar su ordenador para que tenga efecto completamente el producto instalado. ¡Gracias!";
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/es.lproj/MainMenu.nib/classes.nib
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/es.lproj/MainMenu.nib/classes.nib	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/es.lproj/MainMenu.nib/classes.nib	(revision 170)
@@ -0,0 +1,46 @@
+{
+    IBClasses = (
+        {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, 
+        {
+            ACTIONS = {
+                doAPEHomePage = id; 
+                doBackButton = id; 
+                doContinueButton = id; 
+                doLicenseAgree = id; 
+                doLicenseDisagree = id; 
+                doShowInstallFiles = id; 
+                doUninstallCancel = id; 
+                doUninstallConfirm = id; 
+            }; 
+            CLASS = UIController; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {
+                apeCurrentVersionText = id; 
+                apeInstallVersionText = id; 
+                donLogOutText = id; 
+                donQuitText = id; 
+                filFilesTable = id; 
+                filWindow = id; 
+                genBackButton = id; 
+                genContinueButton = id; 
+                genStepText = id; 
+                insFilesTable = id; 
+                licAgreePanel = id; 
+                licTextView = id; 
+                optCreateLog = id; 
+                optGlobalInstallMatrix = id; 
+                optOpenUponCompletion = id; 
+                redExplanationText = id; 
+                remTextView = id; 
+                tabView = id; 
+                uniAuthRequiredText = id; 
+                uniExplanationText = id; 
+                uniFilesTable = id; 
+                uniPanel = id; 
+            }; 
+            SUPERCLASS = NSWindowController; 
+        }, 
+        {CLASS = URLTextView; LANGUAGE = ObjC; SUPERCLASS = NSTextView; }
+    ); 
+    IBVersion = 1; 
+}
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/es.lproj/MainMenu.nib/info.nib
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/es.lproj/MainMenu.nib/info.nib	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ICeCoffEE Installer.app/Contents/Resources/es.lproj/MainMenu.nib/info.nib	(revision 170)
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IBDocumentLocation</key>
+	<string>63 90 356 240 0 0 1280 832 </string>
+	<key>IBEditorPositions</key>
+	<dict>
+		<key>29</key>
+		<string>90 432 202 44 0 0 1280 832 </string>
+	</dict>
+	<key>IBFramework Version</key>
+	<string>364.0</string>
+	<key>IBOpenObjects</key>
+	<array>
+		<integer>21</integer>
+	</array>
+	<key>IBSystem Version</key>
+	<string>7M34</string>
+	<key>IBUserGuides</key>
+	<dict>
+		<key>21</key>
+		<dict>
+			<key>guideLocations</key>
+			<array>
+				<string>Vertical:334.000000</string>
+			</array>
+			<key>guidesLocked</key>
+			<false/>
+		</dict>
+	</dict>
+</dict>
+</plist>
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ui/Preinstall.sh
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ui/Preinstall.sh	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ui/Preinstall.sh	(revision 170)
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+rm -f ~/Library/Caches/com.apple.preferencepanes.cache
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ui/ui.plist
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ui/ui.plist	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/Installer components/ui/ui.plist	(revision 170)
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>APERequired</key>
+	<string>YES</string>
+	<key>Files</key>
+	<array>
+		<dict>
+			<key>FileName</key>
+			<string>ICeCoffEE.ape</string>
+			<key>GlobalInstallPath</key>
+			<string>/Library/Application Enhancers</string>
+			<key>InstallPath</key>
+			<string>~/Library/Application Enhancers</string>
+		</dict>
+	</array>
+	<key>HasGlobalInstall</key>
+	<string>YES</string>
+	<key>HasLaunchUponCompletion</key>
+	<string>NO</string>
+	<key>LogoutSuggested</key>
+	<string>YES</string>
+	<key>MinimalAllowedSystemVersion</key>
+	<integer>4136</integer>
+	<key>MinimalAllowedSystemVersionString</key>
+	<string>10.2.8</string>
+	<key>PreInstallKillProcesses</key>
+	<array>
+		<string>com.apple.systempreferences</string>
+	</array>
+	<key>InstallerLaunchScript</key>
+	<string>ICFindFilesToRemove</string>
+	<key>PreInstallScript</key>
+	<string>Preinstall.sh</string>
+	<key>ProductID</key>
+	<string>net.sabi.ICeCoffEE</string>
+	<key>ProductName</key>
+	<string>ICeCoffEE</string>
+	<key>ProductNumVersion</key>
+	<integer>21069824</integer>
+	<key>ProductType</key>
+	<string>Preference Pane</string>
+	<key>ProductVersion</key>
+	<string>1.4.1</string>
+</dict>
+</plist>
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/Japanese.lproj/APE Manager plugin.nib/classes.nib
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/Japanese.lproj/APE Manager plugin.nib/classes.nib	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/Japanese.lproj/APE Manager plugin.nib/classes.nib	(revision 170)
@@ -0,0 +1,31 @@
+{
+    IBClasses = (
+        {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, 
+        {
+            ACTIONS = {
+                commandClickEnabled = id; 
+                errorDialogEnabled = id; 
+                errorSoundEnabled = id; 
+                servicesInContextualMenu = id; 
+                servicesInMenuBar = id; 
+                textBlinkCount = id; 
+                textBlinkEnabled = id; 
+            }; 
+            CLASS = ICeCoffEEController; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {
+                commandClickEnabled = NSButton; 
+                errorDialogEnabled = NSButton; 
+                errorSoundEnabled = NSButton; 
+                servicesInContextualMenu = NSButton; 
+                servicesInMenuBar = NSButton; 
+                tabView = NSTabView; 
+                textBlinkCount = NSPopUpButton; 
+                textBlinkEnabled = NSButton; 
+                window = NSWindow; 
+            }; 
+            SUPERCLASS = NSObject; 
+        }
+    ); 
+    IBVersion = 1; 
+}
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/Japanese.lproj/APE Manager plugin.nib/info.nib
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/Japanese.lproj/APE Manager plugin.nib/info.nib	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/Japanese.lproj/APE Manager plugin.nib/info.nib	(revision 170)
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IBDocumentLocation</key>
+	<string>306 97 356 240 0 0 1152 746 </string>
+	<key>IBFramework Version</key>
+	<string>364.0</string>
+	<key>IBGroupedObjects</key>
+	<dict>
+		<key>1</key>
+		<array>
+			<string>253</string>
+			<string>256</string>
+			<string>258</string>
+			<string>260</string>
+			<string>262</string>
+			<string>263</string>
+			<string>264</string>
+			<string>266</string>
+			<string>270</string>
+		</array>
+	</dict>
+	<key>IBLastGroupID</key>
+	<string>3</string>
+	<key>IBOpenObjects</key>
+	<array>
+		<integer>195</integer>
+	</array>
+	<key>IBSystem Version</key>
+	<string>7W98</string>
+	<key>IBUserGuides</key>
+	<dict>
+		<key>195</key>
+		<dict>
+			<key>guideLocations</key>
+			<array>
+				<string>Horizontal:245.000000</string>
+			</array>
+			<key>guidesLocked</key>
+			<false/>
+		</dict>
+	</dict>
+</dict>
+</plist>
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/VERSION
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/VERSION	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/VERSION	(revision 170)
@@ -0,0 +1,1 @@
+1.4.1
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/WebCoreBridge.h
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/WebCoreBridge.h	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/WebCoreBridge.h	(revision 170)
@@ -0,0 +1,275 @@
+/*
+ * Copyright (C) 2002 Apple Computer, Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#import <Foundation/Foundation.h>
+
+#ifdef __cplusplus
+
+class KWQKHTMLPart;
+class KHTMLView;
+class RenderArena;
+
+namespace khtml {
+    class RenderPart;
+    class RenderObject;
+}
+
+typedef khtml::RenderPart KHTMLRenderPart;
+
+#else
+
+@class KWQKHTMLPart;
+@class KHTMLView;
+@class KHTMLRenderPart;
+@class RenderArena;
+
+#endif
+
+@class WebError;
+@class WebFrame;
+
+@protocol WebCoreDOMTreeCopier;
+@protocol WebCoreRenderTreeCopier;
+@protocol WebCoreResourceHandle;
+@protocol WebCoreResourceLoader;
+@protocol WebDOMDocument;
+@protocol WebDOMNode;
+
+extern NSString *WebCoreElementFrameKey;
+extern NSString *WebCoreElementImageAltStringKey;
+extern NSString *WebCoreElementImageKey;
+extern NSString *WebCoreElementImageLocationKey;
+extern NSString *WebCoreElementImageURLKey;
+extern NSString *WebCoreElementLinkURLKey;
+extern NSString *WebCoreElementLinkTargetFrameKey;
+extern NSString *WebCoreElementLinkLabelKey;
+extern NSString *WebCoreElementLinkTitleKey;
+extern NSString *WebCoreElementStringKey;
+
+// WebCoreBridge objects are used by WebCore to abstract away operations that need
+// to be implemented by library clients, for example WebKit. The objects are also
+// used in the opposite direction, for simple access to WebCore functions without dealing
+// directly with the KHTML C++ classes.
+
+// A WebCoreBridge creates and holds a reference to a KHTMLPart.
+
+// The WebCoreBridge interface contains methods for use by the non-WebCore side of the bridge.
+
+enum FrameBorderStyle {
+    NoFrameBorder = 1,
+    SunkenFrameBorder = 2,
+    PlainFrameBorder = 4
+};
+
+@interface WebCoreBridge : NSObject
+{
+    KWQKHTMLPart *_part;
+    KHTMLRenderPart *_renderPart;
+    RenderArena *_renderPartArena;
+}
+
+- (void)setRenderPart:(KHTMLRenderPart *)renderPart;
+- (KHTMLRenderPart *)renderPart;
+
+- (void)setName:(NSString *)name;
+- (NSString *)name;
+
+- (KWQKHTMLPart *)part;
+
+- (void)setParent:(WebCoreBridge *)parent;
+
+- (void)openURL:(NSString *)URL reload:(BOOL)reload headers:(NSDictionary *)headers lastModified:(NSDate *)lastModified pageCache:(NSDictionary *)pageCache;
+- (void)addData:(NSData *)data withEncoding:(NSString *)encoding;
+- (void)addData:(NSData *)data withOverrideEncoding:(NSString *)encoding;
+- (void)closeURL;
+- (void)saveDocumentState;
+- (void)restoreDocumentState;
+
+- (BOOL)canCachePage;
+- (BOOL)saveDocumentToPageCache;
+
+- (void)end;
+
+- (NSString *)URL;
+- (NSString *)referrer;
+
+- (void)installInFrame:(NSView *)view;
+- (void)removeFromFrame;
+
+- (void)scrollToAnchor:(NSString *)anchor;
+- (void)scrollToAnchorWithURL:(NSString *)URL;
+
+- (void)createKHTMLViewWithNSView:(NSView *)view marginWidth:(int)mw marginHeight:(int)mh;
+
+- (BOOL)isFrameSet;
+
+- (void)reapplyStyles;
+- (void)forceLayout;
+- (BOOL)needsLayout;
+- (void)adjustFrames:(NSRect)rect;
+- (void)drawRect:(NSRect)rect;
+
+- (void)mouseDown:(NSEvent *)event;
+- (void)mouseUp:(NSEvent *)event;
+- (void)mouseMoved:(NSEvent *)event;
+- (void)mouseDragged:(NSEvent *)event;
+
+- (NSView *)nextKeyView;
+- (NSView *)previousKeyView;
+
+- (NSView *)nextKeyViewInsideWebViews;
+- (NSView *)previousKeyViewInsideWebViews;
+
+- (NSObject *)copyDOMTree:(id <WebCoreDOMTreeCopier>)copier;
+- (NSObject *)copyRenderTree:(id <WebCoreRenderTreeCopier>)copier;
+
+- (NSDictionary *)elementAtPoint:(NSPoint)point;
+
+- (BOOL)searchFor:(NSString *)string direction:(BOOL)forward caseSensitive:(BOOL)caseFlag;
+- (void)jumpToSelection;
+
+- (void)setTextSizeMultiplier:(float)multiplier;
+
+- (CFStringEncoding)textEncoding;
+
+- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)string;
+
+- (id <WebDOMDocument>)DOMDocument;
+
+- (void)setSelectionFrom:(id <WebDOMNode>)start startOffset:(int)startOffset to:(id <WebDOMNode>)end endOffset:(int) endOffset;
+
+- (NSString *)selectedString;
+- (NSAttributedString *)selectedAttributedString;
+
+- (void)selectAll;
+- (void)deselectAll;
+
+- (id <WebDOMNode>)selectionStart;
+- (int)selectionStartOffset;
+- (id <WebDOMNode>)selectionEnd;
+- (int)selectionEndOffset;
+
+- (NSAttributedString *)attributedStringFrom:(id <WebDOMNode>)startNode startOffset:(int)startOffset to:(id <WebDOMNode>)endNode endOffset:(int)endOffset;
+
+- (int)frameBorderStyle;
+
++ (NSString *)stringWithData:(NSData *)data textEncoding:(CFStringEncoding)textEncoding;
++ (NSString *)stringWithData:(NSData *)data textEncodingName:(NSString *)textEncodingName;
+
+- (BOOL)interceptKeyEvent:(NSEvent *)event toView:(NSView *)view;
+
+@end
+
+// The WebCoreBridge protocol contains methods for use by the WebCore side of the bridge.
+
+@protocol WebCoreBridge
+
+- (NSArray *)childFrames; // WebCoreBridge objects
+- (WebCoreBridge *)mainFrame;
+- (WebCoreBridge *)findFramedNamed:(NSString *)name;
+- (WebCoreBridge *)findOrCreateFramedNamed:(NSString *)name;
+/* Creates a name for an frame unnamed in the HTML.  It should produce repeatable results for loads of the same frameset. */
+- (NSString *)generateFrameName;
+
+- (void)loadURL:(NSString *)URL reload:(BOOL)reload triggeringEvent:(NSEvent *)event isFormSubmission:(BOOL)isFormSubmission;
+- (void)postWithURL:(NSString *)URL data:(NSData *)data contentType:(NSString *)contentType triggeringEvent:(NSEvent *)event;
+
+- (WebCoreBridge *)createWindowWithURL:(NSString *)URL frameName:(NSString *)name;
+- (void)showWindow;
+
+- (NSString *)userAgentForURL:(NSString *)URL;
+
+- (void)setTitle:(NSString *)title;
+- (void)setStatusText:(NSString *)status;
+
+- (void)setIconURL:(NSString *)URL;
+- (void)setIconURL:(NSString *)URL withType:(NSString *)string;
+
+- (WebCoreBridge *)createChildFrameNamed:(NSString *)frameName withURL:(NSString *)URL
+    renderPart:(KHTMLRenderPart *)renderPart
+    allowsScrolling:(BOOL)allowsScrolling marginWidth:(int)width marginHeight:(int)height;
+
+- (BOOL)areToolbarsVisible;
+- (void)setToolbarsVisible:(BOOL)visible;
+- (BOOL)isStatusBarVisible;
+- (void)setStatusBarVisible:(BOOL)visible;
+- (BOOL)areScrollbarsVisible;
+- (void)setScrollbarsVisible:(BOOL)visible;
+- (NSWindow *)window;
+- (void)setWindowFrame:(NSRect)frame;
+
+- (id <WebCoreResourceHandle>)startLoadingResource:(id <WebCoreResourceLoader>)loader withURL:(NSString *)URL;
+- (void)objectLoadedFromCacheWithURL:(NSString *)URL response:(id)response size:(unsigned)bytes;
+- (BOOL)isReloading;
+
+- (void)reportClientRedirectToURL:(NSString *)URL delay:(NSTimeInterval)seconds fireDate:(NSDate *)date lockHistory:(BOOL)lockHistory;
+- (void)reportClientRedirectCancelled;
+
+- (void)unfocusWindow;
+
+- (NSView *)nextKeyViewOutsideWebViews;
+- (NSView *)previousKeyViewOutsideWebViews;
+
+- (BOOL)defersLoading;
+- (void)setDefersLoading:(BOOL)loading;
+- (void)saveDocumentState:(NSArray *)documentState;
+- (NSArray *)documentState;
+
+- (void)setNeedsReapplyStyles;
+- (void)setNeedsLayout;
+
+- (NSString *)requestedURL;
+
+- (NSView *)viewForPluginWithURL:(NSString *)URL attributes:(NSArray *)attributesArray baseURL:(NSString *)baseURL MIMEType:(NSString *)MIMEType;
+- (NSView *)viewForJavaAppletWithFrame:(NSRect)frame attributes:(NSDictionary *)attributes baseURL:(NSString *)baseURL;
+
+- (BOOL)saveDocumentToPageCache:(id)documentInfo;
+
+- (int)getObjectCacheSize;
+
+- (void)loadEmptyDocumentSynchronously;
+
+- (NSString *)MIMETypeForPath:(NSString *)path;
+
+- (void)handleMouseDragged:(NSEvent *)event;
+- (void)handleAutoscrollForMouseDragged:(NSEvent *)event;
+- (BOOL)mayStartDragWithMouseDown:(NSEvent *)event;
+
+@end
+
+// This interface definition allows those who hold a WebCoreBridge * to call all the methods
+// in the WebCoreBridge protocol without requiring the base implementation to supply the methods.
+// This idiom is appropriate because WebCoreBridge is an abstract class.
+
+@interface WebCoreBridge (SubclassResponsibility) <WebCoreBridge>
+@end
+
+@protocol WebCoreDOMTreeCopier <NSObject>
+- (NSObject *)nodeWithName:(NSString *)name value:(NSString *)value source:(NSString *)source children:(NSArray *)children;
+@end
+
+@protocol WebCoreRenderTreeCopier <NSObject>
+- (NSObject *)nodeWithName:(NSString *)name position:(NSPoint)p rect:(NSRect)rect view:(NSView *)view children:(NSArray *)children;
+@end
Index: releases/ICeCoffEE/1.4.1/ICeCoffEE/main.m
===================================================================
--- releases/ICeCoffEE/1.4.1/ICeCoffEE/main.m	(revision 170)
+++ releases/ICeCoffEE/1.4.1/ICeCoffEE/main.m	(revision 170)
@@ -0,0 +1,14 @@
+//
+//  main.m
+//  ICeCoffEE
+//
+//  Created by Nicholas Riley on Sun Jan 20 2002.
+//  Copyright (c) 2001 Nicholas Riley. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+
+int main(int argc, const char *argv[])
+{
+    return NSApplicationMain(argc, argv);
+}
Index: releases/ICeCoffEE/1.4.1/TranslateNib.sh
===================================================================
--- releases/ICeCoffEE/1.4.1/TranslateNib.sh	(revision 170)
+++ releases/ICeCoffEE/1.4.1/TranslateNib.sh	(revision 170)
@@ -0,0 +1,114 @@
+#!/bin/sh
+#
+# TranslateNib.sh
+#
+# This tools helps creating localized nib files,
+# using nibtool.
+#
+# Copyright Stephane Corthesy 2001-2003, stephane@sente.ch
+#
+# Mar 7 2002: v1, initial public release
+# Jul 12 2002: v2, corrected CVS problem
+# Jan 3 2003: v3, adapted for Dec 2002 Dev Tools; added Subversion support
+#
+
+usage ( ) {
+	echo "Usage: `basename $0` operation language file"
+	echo "       operation must be 'start' or 'end'"
+	echo "       language must be English, French, Spanish, ..."
+	echo "       file is the original nib file"
+	echo "       (Output directory must be writable)"
+}
+
+if [ $# -ne 3 ] ; then \
+	usage ; \
+	exit 1
+fi
+
+operation="$1"
+editor="/Applications/TextEdit.app"
+
+if [ "$operation" != "start" -a "$operation" != "end" ] ; then \
+	usage ; \
+	exit 1
+fi
+
+# Let's remove .nib/ suffix, if any
+filename=`basename "$3" .nib`
+inputDir=`dirname "$3"`
+inputFile="$inputDir/$filename.nib"
+
+# Now we check that source nib exists
+if [ ! -d "$inputFile" ] ; then \
+	echo "No such file "$inputFile ; \
+	exit 1
+fi
+
+language="$2"
+outputDir="$inputDir/../$language.lproj"
+tempStringFile="$outputDir/___$filename.strings"
+outputFile="$outputDir/$filename.nib"
+
+if [ ! -d "$outputDir" ] ; then \
+	mkdir "$outputDir"
+fi
+
+# If user already translated nib in the past, we update it:
+# We use old translation strings + layout, merged with
+# new strings+elements
+
+if [ "$operation" = "start" ] ; then {
+	if [ -d "$outputFile" ] ; then
+		rm -rf "$tempStringFile" ; \
+		nibtool --previous "$outputFile" \
+			--localizable-strings \
+			--incremental "$outputFile" "$inputFile"\
+			> "$tempStringFile" ; \
+		open "$inputFile"
+	else
+		rm -rf "$tempStringFile" ; \
+		nibtool --localizable-strings "$inputFile" \
+			> "$tempStringFile" ; \
+		open "$inputFile"
+	fi
+	open -a "$editor" "$tempStringFile"
+} else {
+    # Verify that .strings file format is correct
+	pl < "$tempStringFile" > /dev/null
+	if [ -d "$outputFile" ] ; then {
+		# Let's preserve CVS/Subversion information, as nibtool doesn't...
+		if [ -d "$outputFile/CVS" ] ; then
+			cp -pR "$outputFile/CVS" "$outputFile/../CVS.tmp"
+		fi
+		if [ -d "$outputFile/.svn" ] ; then
+			cp -pR "$outputFile/.svn" "$outputFile/../.svn.tmp"
+		fi
+		nibtool --dictionary "$tempStringFile" \
+			--Write "$outputFile" \
+			--incremental "$outputFile" \
+			"$inputFile" ; \
+		if [ -d "$outputFile/../CVS.tmp" ] ; then
+			mv "$outputFile/../CVS.tmp" "$outputFile/CVS"
+		fi
+		if [ -d "$outputFile/../.svn.tmp" ] ; then
+			mv "$outputFile/../.svn.tmp" "$outputFile/.svn"
+		fi
+	} else
+		nibtool --dictionary "$tempStringFile" \
+			--write "$outputFile" \
+			"$inputFile"
+	fi
+	rm -rf "$tempStringFile"
+	open "$outputFile"
+} fi
+
+# If file has only 2 bytes, it is empty
+#if [ -z `cut -b "3,4" < "$tempStringFile"` ] ; then \
+#	echo "Nothing to translate" 
+#	rm -rf "$tempStringFile" ; \
+#else
+#	open "$inputFile"
+#	open -a "$editor" "$tempStringFile"
+#fi
+
+exit 0
Index: releases/ICeCoffEE/1.4.1/package-ICeCoffEE.sh
===================================================================
--- releases/ICeCoffEE/1.4.1/package-ICeCoffEE.sh	(revision 170)
+++ releases/ICeCoffEE/1.4.1/package-ICeCoffEE.sh	(revision 170)
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+set -x -v
+
+PACKAGEDIR="$PWD"
+PRODUCT="ICeCoffEE"
+
+cd "$PRODUCT" && \
+find . -name \*~ -exec rm '{}' \; && \
+VERSION=`cat VERSION` && \
+DMG="$PRODUCT-$VERSION.dmg" VOL="$PRODUCT $VERSION" && \
+DSTROOT="$PACKAGEDIR/$VOL" && \
+sudo rm -rf "$DSTROOT" && \
+sudo rm -rf build/ && \
+rm -rf build/ && \
+xcodebuild -target "ICeCoffEE Installer" -buildstyle Deployment "DSTROOT=$DSTROOT" DEPLOYMENT_LOCATION=YES install && \
+mkdir "$DSTROOT" && \
+mv "build/$PRODUCT Installer.app" "$DSTROOT/$PRODUCT $VERSION Installer.app" && \
+sudo rm -rf build/ && \
+find "$DSTROOT" -name ".svn" -type d -exec sudo /bin/rm -rf "{}" \; ; \
+cd "$PACKAGEDIR" && \
+rm -f "$DMG" && \
+hdiutil create "$DMG" -megabytes 5 -ov -layout NONE -fs 'HFS+' -volname "$VOL" && \
+MOUNT=`hdiutil attach "$DMG"` && \
+DISK=`echo "$MOUNT" | sed -ne ' s|^/dev/\([^ ]*\).*$|\1|p'` && \
+MOUNTPOINT=`echo "$MOUNT" | sed -ne 's|^.*\(/Volumes/.*\)$|\1|p'` && \
+ditto -rsrc "$DSTROOT" "$MOUNTPOINT" && \
+chmod -R a+rX,u+w "$MOUNTPOINT" && \
+openUp "$MOUNTPOINT" && \
+hdiutil detach $DISK && \
+hdiutil resize -sectors min "$DMG" && \
+hdiutil convert "$DMG" -format UDZO -imagekey zlib-level=9 -o "z$DMG" && \
+mv "z$DMG" "$DMG" && \
+hdiutil internet-enable "$DMG" && \
+# scp "$DMG" ainaz:web/nriley/software/
+:
