text:
#import "SMLStandardHeader.h"

#import "SMLInterfacePerformer.h"
#import "SMLGutterTextView.h"
#import "SMLTextView.h"
#import "SMLTextMenuController.h"
#import "SMLProjectsController.h"
#import "SMLLineNumbers.h"
#import "SMLLayoutManager.h"
#import "SMLSingleDocumentWindowDelegate.h"
#import "SMLAdvancedFindController.h"
#import "SMLBasicPerformer.h"
#import "SMLMainController.h"
#import "SMLProject.h"
#import "SMLSyntaxColouring.h"
#import "SMLFullScreenWindow.h"

#import "ICUPattern.h"
#import "ICUMatcher.h"
#import "NSStringICUAdditions.h"

@implementation SMLInterfacePerformer

@synthesize fullScreenWindow, fullScreenDocument, defaultIcon, defaultUnsavedIcon;

static id sharedInstance = nil;

+ (SMLInterfacePerformer *)sharedInstance
{
	if (sharedInstance == nil) {
		sharedInstance = [[self alloc] init];
	}

	return sharedInstance;
}

- (id)init
{
    if (sharedInstance == nil) {
        sharedInstance = [super init];

		statusBarBetweenString = [[NSString alloc] initWithFormat:@"  %C  ", 0x00B7];
		statusBarLastSavedString = NSLocalizedString(@"Saved", @"Saved, in the status bar");
		statusBarDocumentLengthString = NSLocalizedString(@"Length", @"Length, in the status bar");
		statusBarSelectionLengthString = NSLocalizedString(@"Selection", @"Selection, in the status bar");
		statusBarPositionString = NSLocalizedString(@"Position", @"Position, in the status bar");
		statusBarSyntaxDefinitionString = NSLocalizedString(@"Syntax", @"Syntax, in the status bar");
		statusBarEncodingString = NSLocalizedString(@"Encoding", @"Encoding, in the status bar");

		defaultIcon = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"SMLDefaultIcon" ofType:@"png"]];
		defaultUnsavedIcon = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"SMLDefaultUnsavedIcon" ofType:@"png"]];
    }
    return sharedInstance;
}

- (void)goToFunctionOnLine:(id)sender
{
	NSInteger lineToGoTo = [sender tag];
	[[SMLTextMenuController sharedInstance] performGoToLine:lineToGoTo];
}

- (void)createFirstViewForDocument:(id)document
{
	NSView *firstContentView = [SMLCurrentProject firstContentView];
	NSScrollView *textScrollView = [[NSScrollView alloc] initWithFrame:NSMakeRect([[SMLDefaults valueForKey:@"GutterWidth"] integerValue], 0, [firstContentView bounds].size.width - [[SMLDefaults valueForKey:@"GutterWidth"] integerValue], [firstContentView bounds].size.height)];
	NSSize contentSize = [textScrollView contentSize];
	[textScrollView setBorderType:NSNoBorder];
	[textScrollView setHasVerticalScroller:YES];
	[textScrollView setAutohidesScrollers:YES];
	[textScrollView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
	[[textScrollView contentView] setAutoresizesSubviews:YES];

	SMLLineNumbers *lineNumbers = [[SMLLineNumbers alloc] initWithDocument:document];
	[[NSNotificationCenter defaultCenter] addObserver:lineNumbers selector:@selector(viewBoundsDidChange:) name:NSViewBoundsDidChangeNotification object:[textScrollView contentView]];
	[document setValue:lineNumbers forKey:@"lineNumbers"];

	SMLTextView *textView;
	if ([[SMLDefaults valueForKey:@"LineWrapNewDocuments"] boolValue] == YES) {
		textView = [[SMLTextView alloc] initWithFrame:NSMakeRect([[SMLDefaults valueForKey:@"GutterWidth"] integerValue], 0, contentSize.width, contentSize.height)];
		[textView setMinSize:contentSize];
		[textScrollView setHasHorizontalScroller:NO];
		[textView setHorizontallyResizable:YES];
		[[textView textContainer] setWidthTracksTextView:YES];
		[[textView textContainer] setContainerSize:NSMakeSize(contentSize.width, CGFLOAT_MAX)];
	} else {
		textView = [[SMLTextView alloc] initWithFrame:NSMakeRect([[SMLDefaults valueForKey:@"GutterWidth"] integerValue], 0, contentSize.width, contentSize.height)];
		[textView setMinSize:contentSize];
		[textScrollView setHasHorizontalScroller:YES];
		[textView setHorizontallyResizable:YES];
		[[textView textContainer] setContainerSize:NSMakeSize(CGFLOAT_MAX, CGFLOAT_MAX)];
		[[textView textContainer] setWidthTracksTextView:NO];
	}

	[textScrollView setDocumentView:textView];

	NSScrollView *gutterScrollView = [[NSScrollView alloc] initWithFrame:NSMakeRect(0, 0, [[SMLDefaults valueForKey:@"GutterWidth"] integerValue], contentSize.height)];
	[gutterScrollView setBorderType:NSNoBorder];
	[gutterScrollView setHasVerticalScroller:NO];
	[gutterScrollView setHasHorizontalScroller:NO];
	[gutterScrollView setAutoresizingMask:NSViewHeightSizable];
	[[gutterScrollView contentView] setAutoresizesSubviews:YES];

	SMLGutterTextView *gutterTextView = [[SMLGutterTextView alloc] initWithFrame:NSMakeRect(0, 0, [[SMLDefaults valueForKey:@"GutterWidth"] integerValue], contentSize.height - 50)];
	[gutterScrollView setDocumentView:gutterTextView];

	[document setValue:textView forKey:@"firstTextView"];
	[document setValue:textScrollView forKey:@"firstTextScrollView"];
	[document setValue:gutterScrollView forKey:@"firstGutterScrollView"];
}

- (void)insertDocumentIntoSecondContentView:(id)document
{
	[SMLCurrentProject setSecondDocument:document];
	NSView *secondContentView = [SMLCurrentProject secondContentView];
	[self removeAllSubviewsFromView:secondContentView];

	NSTextStorage *textStorage = [[[document valueForKey:@"firstTextScrollView"] documentView] textStorage];
	SMLLayoutManager *layoutManager = [[SMLLayoutManager alloc] init];
	[textStorage addLayoutManager:layoutManager];
	[[document valueForKey:@"syntaxColouring"] setSecondLayoutManager:layoutManager];

	NSInteger gutterWidth = [[document valueForKey:@"firstGutterScrollView"] bounds].size.width;

	NSView *secondContentViewNavigationBar = [SMLCurrentProject secondContentViewNavigationBar];
	CGFloat secondContentViewNavigationBarHeight = [secondContentViewNavigationBar bounds].size.height;

	NSScrollView *textScrollView = [[NSScrollView alloc] initWithFrame:NSMakeRect(gutterWidth, secondContentViewNavigationBarHeight, [secondContentView bounds].size.width - gutterWidth, [secondContentView bounds].size.height - secondContentViewNavigationBarHeight - secondContentViewNavigationBarHeight)];
	NSSize contentSize = [textScrollView contentSize];

	NSTextContainer *container = [[NSTextContainer alloc] initWithContainerSize:contentSize];
	[layoutManager addTextContainer:container];

	[textScrollView setBorderType:NSNoBorder];
	[textScrollView setHasVerticalScroller:YES];
	[textScrollView setAutohidesScrollers:YES];
	[textScrollView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
	[[textScrollView contentView] setAutoresizesSubviews:YES];

	[[NSNotificationCenter defaultCenter] addObserver:[document valueForKey:@"lineNumbers"] selector:@selector(viewBoundsDidChange:) name:NSViewBoundsDidChangeNotification object:[textScrollView contentView]];

	SMLTextView *textView;
	if ([[document valueForKey:@"isLineWrapped"] boolValue] == YES) {
		textView = [[SMLTextView alloc] initWithFrame:NSMakeRect(gutterWidth, 0, contentSize.width - 2, contentSize.height) textContainer:container]; // - 2 to remove slight movement left and right
		[textView setMinSize:contentSize];
		[textScrollView setHasHorizontalScroller:NO];
		[textView setHorizontallyResizable:NO];
		[[textView textContainer] setWidthTracksTextView:YES];
		[[textView textContainer] setContainerSize:NSMakeSize(contentSize.width, CGFLOAT_MAX)];
	} else {
		textView = [[SMLTextView alloc] initWithFrame:NSMakeRect(gutterWidth, 0, contentSize.width, contentSize.height) textContainer:container];
		[textView setMinSize:contentSize];
		[textScrollView setHasHorizontalScroller:YES];
		[textView setHorizontallyResizable:YES];
		[[textView textContainer] setContainerSize:NSMakeSize(CGFLOAT_MAX, CGFLOAT_MAX)];
		[[textView textContainer] setWidthTracksTextView:NO];
	}
	[textView setDefaults];

	[textScrollView setDocumentView:textView];

	NSScrollView *gutterScrollView = [[NSScrollView alloc] initWithFrame:NSMakeRect(0, secondContentViewNavigationBarHeight, gutterWidth, contentSize.height)];
	[gutterScrollView setBorderType:NSNoBorder];
	[gutterScrollView setHasVerticalScroller:NO];
	[gutterScrollView setHasHorizontalScroller:NO];
	[gutterScrollView setAutoresizingMask:NSViewHeightSizable];
	[[gutterScrollView contentView] setAutoresizesSubviews:YES];

	SMLGutterTextView *gutterTextView = [[SMLGutterTextView alloc] initWithFrame:NSMakeRect(0, secondContentViewNavigationBarHeight, gutterWidth, contentSize.height)];
	[gutterScrollView setDocumentView:gutterTextView];

	[secondContentView addSubview:textScrollView];

	[textView setDelegate:[document valueForKey:@"syntaxColouring"]];
	[document setValue:textView forKey:@"secondTextView"];
	[document setValue:textScrollView forKey:@"secondTextScrollView"];
	[document setValue:gutterScrollView forKey:@"secondGutterScrollView"];

	[secondContentViewNavigationBar setFrame:NSMakeRect(0, 0, [secondContentView bounds].size.width, secondContentViewNavigationBarHeight)];
	[secondContentViewNavigationBar setAutoresizingMask:NSViewWidthSizable];
	[secondContentView addSubview:secondContentViewNavigationBar];

	NSRect visibleRect = [[[[document valueForKey:@"firstTextView"] enclosingScrollView] contentView] documentVisibleRect];
	NSRange visibleRange = [[[document valueForKey:@"firstTextView"] layoutManager] glyphRangeForBoundingRect:visibleRect inTextContainer:[[document valueForKey:@"firstTextView"] textContainer]];
	[textView scrollRangeToVisible:visibleRange];

	[SMLCurrentProject resizeViewsForDocument:document]; // To properly set the width of the line number gutter and to recolour the document
}

- (void)insertDocumentIntoThirdContentView:(id)document orderFront:(BOOL)orderFront
{
	if ([document valueForKey:@"singleDocumentWindow"] != nil) {
		[[document valueForKey:@"singleDocumentWindow"] makeKeyAndOrderFront:nil];
		return;
	}

	NSWindowController *windowController = [[NSWindowController alloc] initWithWindowNibName:@"SMLSingleDocument"];

	NSWindow *window = [windowController window];

	// For some reason this code does not work, so save the frame manually in SMLSingleDocumentWindowDelegate and use that
	//[windowController setShouldCascadeWindows:NO];
	//[windowController setWindowFrameAutosaveName:@"SingleDocumentWindow"];
	//[window setFrameAutosaveName:@"SingleDocumentWindow"];

	if ([SMLDefaults valueForKey:@"SingleDocumentWindow"] != nil) {
		[window setFrame:NSRectFromString([SMLDefaults valueForKey:@"SingleDocumentWindow"]) display:NO animate:NO];
	}

	if (orderFront == YES) {
		[window makeKeyAndOrderFront:nil];
	}

	NSView *thirdContentView = [window contentView];

	NSTextStorage *textStorage = [[[document valueForKey:@"firstTextScrollView"] documentView] textStorage];
	SMLLayoutManager *layoutManager = [[SMLLayoutManager alloc] init];
	[textStorage addLayoutManager:layoutManager];
	[[document valueForKey:@"syntaxColouring"] setThirdLayoutManager:layoutManager];

	NSInteger gutterWidth = [[document valueForKey:@"firstGutterScrollView"] bounds].size.width;

	NSScrollView *textScrollView = [[NSScrollView alloc] initWithFrame:NSMakeRect(gutterWidth, -1, [thirdContentView bounds].size.width - gutterWidth, [thirdContentView bounds].size.height + 2)]; // +2 and -1 to remove extra line at the top and bottom
	NSSize contentSize = [textScrollView contentSize];
	NSTextContainer *container = [[NSTextContainer alloc] initWithContainerSize:contentSize];
	[layoutManager addTextContainer:container];

	[textScrollView setBorderType:NSNoBorder];
	[textScrollView setHasVerticalScroller:YES];
	[textScrollView setAutohidesScrollers:YES];
	[textScrollView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
	[[textScrollView contentView] setAutoresizesSubviews:YES];

	[[NSNotificationCenter defaultCenter] addObserver:[document valueForKey:@"lineNumbers"] selector:@selector(viewBoundsDidChange:) name:NSViewBoundsDidChangeNotification object:[textScrollView contentView]];

	SMLTextView *textView;
	if ([[document valueForKey:@"isLineWrapped"] boolValue] == YES) {
		textView = [[SMLTextView alloc] initWithFrame:NSMakeRect(gutterWidth, 0, contentSize.width, contentSize.height) textContainer:container];
		[textView setMinSize:contentSize];
		[textScrollView setHasHorizontalScroller:NO];
		[textView setHorizontallyResizable:NO];
		[[textView textContainer] setWidthTracksTextView:YES];
		[[textView textContainer] setContainerSize:NSMakeSize(contentSize.width, CGFLOAT_MAX)];
	} else {
		textView = [[SMLTextView alloc] initWithFrame:NSMakeRect(gutterWidth, 0, contentSize.width, contentSize.height) textContainer:container];
		[textView setMinSize:contentSize];
		[textScrollView setHasHorizontalScroller:YES];
		[textView setHorizontallyResizable:YES];
		[[textView textContainer] setContainerSize:NSMakeSize(CGFLOAT_MAX, CGFLOAT_MAX)];
		[[textView textContainer] setWidthTracksTextView:NO];
	}
	[textView setDefaults];

	[textScrollView setDocumentView:textView];

	NSScrollView *gutterScrollView = [[NSScrollView alloc] initWithFrame:NSMakeRect(0, -1, gutterWidth, contentSize.height)];
	[gutterScrollView setBorderType:NSNoBorder];
	[gutterScrollView setHasVerticalScroller:NO];
	[gutterScrollView setHasHorizontalScroller:NO];
	[gutterScrollView setAutoresizingMask:NSViewHeightSizable];
	[[gutterScrollView contentView] setAutoresizesSubviews:YES];

	SMLGutterTextView *gutterTextView = [[SMLGutterTextView alloc] initWithFrame:NSMakeRect(0, 0, gutterWidth, contentSize.height)];
	[gutterScrollView setDocumentView:gutterTextView];

	[thirdContentView addSubview:textScrollView];

	[textView setDelegate:[document valueForKey:@"syntaxColouring"]];
	[document setValue:textView forKey:@"thirdTextView"];
	[document setValue:textScrollView forKey:@"thirdTextScrollView"];
	[document setValue:gutterScrollView forKey:@"thirdGutterScrollView"];
	[document setValue:window forKey:@"singleDocumentWindow"];
	[document setValue:windowController forKey:@"singleDocumentWindowController"];

	[SMLCurrentProject resizeViewsForDocument:document]; // To properly set the width of the line number gutter and to recolour the document

	[window setDelegate:[SMLSingleDocumentWindowDelegate sharedInstance]];
	[window makeFirstResponder:textView];
}

- (void)insertDocumentIntoFourthContentView:(id)document
{
	NSTextStorage *textStorage = [[[document valueForKey:@"firstTextScrollView"] documentView] textStorage];
	SMLLayoutManager *layoutManager = [[SMLLayoutManager alloc] init];
	[textStorage addLayoutManager:layoutManager];
	[[document valueForKey:@"syntaxColouring"] setFourthLayoutManager:layoutManager];

	NSInteger gutterWidth = [[document valueForKey:@"firstGutterScrollView"] bounds].size.width;

	NSView *fourthContentView = [[SMLAdvancedFindController sharedInstance] resultDocumentContentView];

	NSScrollView *textScrollView = [[NSScrollView alloc] initWithFrame:NSMakeRect(gutterWidth, 0, [fourthContentView bounds].size.width - gutterWidth, [fourthContentView bounds].size.height)];
	NSSize contentSize = [textScrollView contentSize];

	NSTextContainer *container = [[NSTextContainer alloc] initWithContainerSize:contentSize];
	[layoutManager addTextContainer:container];

	[textScrollView setBorderType:NSNoBorder];
	[textScrollView setHasVerticalScroller:YES];
	[textScrollView setAutohidesScrollers:YES];
	[textScrollView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
	[[textScrollView contentView] setAutoresizesSubviews:YES];

	[[NSNotificationCenter defaultCenter] addObserver:[document valueForKey:@"lineNumbers"] selector:@selector(viewBoundsDidChange:) name:NSViewBoundsDidChangeNotification object:[textScrollView contentView]];

	SMLTextView *textView;
	if ([[document valueForKey:@"isLineWrapped"] boolValue] == YES) {
		textView = [[SMLTextView alloc] initWithFrame:NSMakeRect(gutterWidth, 0, contentSize.width, contentSize.height) textContainer:container];
		[textView setMinSize:contentSize];
		[textScrollView setHasHorizontalScroller:NO];
		[textView setHorizontallyResizable:NO];
		[[textView textContainer] setWidthTracksTextView:YES];
		[[textView textContainer] setContainerSize:NSMakeSize(contentSize.width, CGFLOAT_MAX)];
	} else {
		textView = [[SMLTextView alloc] initWithFrame:NSMakeRect(gutterWidth, 0, contentSize.width, contentSize.height) textContainer:container];
		[textView setMinSize:contentSize];
		[textScrollView setHasHorizontalScroller:YES];
		[textView setHorizontallyResizable:YES];
		[[textView textContainer] setContainerSize:NSMakeSize(CGFLOAT_MAX, CGFLOAT_MAX)];
		[[textView textContainer] setWidthTracksTextView:NO];
	}
	[textView setDefaults];

	[textScrollView setDocumentView:textView];

	NSScrollView *gutterScrollView = [[NSScrollView alloc] initWithFrame:NSMakeRect(0, 0, gutterWidth, contentSize.height)];
	[gutterScrollView setBorderType:NSNoBorder];
	[gutterScrollView setHasVerticalScroller:NO];
	[gutterScrollView setHasHorizontalScroller:NO];
	[gutterScrollView setAutoresizingMask:NSViewHeightSizable];
	[[gutterScrollView contentView] setAutoresizesSubviews:YES];

	SMLGutterTextView *gutterTextView = [[SMLGutterTextView alloc] initWithFrame:NSMakeRect(0, 0, gutterWidth, contentSize.height)];
	[gutterScrollView setDocumentView:gutterTextView];

	[fourthContentView addSubview:textScrollView];

	[textView setDelegate:[document valueForKey:@"syntaxColouring"]];
	[document setValue:textView forKey:@"fourthTextView"];
	[document setValue:textScrollView forKey:@"fourthTextScrollView"];
	[document setValue:gutterScrollView forKey:@"fourthGutterScrollView"];
}

- (void)updateStatusBar
{
	if ([[SMLDefaults valueForKey:@"ShowStatusBar"] boolValue] == NO) {
		return;
	}

	NSMutableString *statusBarString = [NSMutableString string];
	id document = SMLCurrentDocument;
	SMLTextView *textView = SMLCurrentTextView;
	NSString *text = SMLCurrentText;

	if ([[SMLDefaults valueForKey:@"StatusBarShowWhenLastSaved"] boolValue] == YES)
		[statusBarString appendFormat:@"%@: %@", statusBarLastSavedString, [document valueForKey:@"lastSaved"]];

	if ([[SMLDefaults valueForKey:@"StatusBarShowLength"] boolValue] == YES) {
		if ([[SMLDefaults valueForKey:@"StatusBarShowWhenLastSaved"] boolValue] == YES) {
			[statusBarString appendString:statusBarBetweenString];
		}

		[statusBarString appendFormat:@"%@: %@", statusBarDocumentLengthString, [SMLBasic thousandFormatedStringFromNumber:[NSNumber numberWithUnsignedInteger:[text length]]]];
	}

	NSArray *array = [textView selectedRanges];
	NSInteger selection = 0;
	for (id item in array) {
		selection = selection + [item rangeValue].length;
	}
	if ([[SMLDefaults valueForKey:@"StatusBarShowSelection"] boolValue] == YES && selection > 1) {
		if ([[SMLDefaults valueForKey:@"StatusBarShowWhenLastSaved"] boolValue] == YES || [[SMLDefaults valueForKey:@"StatusBarShowLength"] boolValue] == YES) {
			[statusBarString appendString:statusBarBetweenString];
		}
		[statusBarString appendFormat:@"%@: %@", statusBarSelectionLengthString, [SMLBasic thousandFormatedStringFromNumber:[NSNumber numberWithInteger:selection]]];
	}

	if ([[SMLDefaults valueForKey:@"StatusBarShowPosition"] boolValue] == YES) {
		if ([[SMLDefaults valueForKey:@"StatusBarShowWhenLastSaved"] boolValue] == YES || [[SMLDefaults valueForKey:@"StatusBarShowLength"] boolValue] == YES || ([[SMLDefaults valueForKey:@"StatusBarShowSelection"] boolValue] == YES && selection > 1)) {
			[statusBarString appendString:statusBarBetweenString];
		}
		NSRange selectionRange;
		if (textView == nil) {
			selectionRange = NSMakeRange(0,0);
		} else {
			selectionRange = [textView selectedRange];
		}
		[statusBarString appendFormat:@"%@: %@\\%@", statusBarPositionString, [SMLBasic thousandFormatedStringFromNumber:[NSNumber numberWithInteger:(selectionRange.location - [text lineRangeForRange:selectionRange].location)]], [SMLBasic thousandFormatedStringFromNumber:[NSNumber numberWithInteger:selectionRange.location]]];
	}

	if ([[SMLDefaults valueForKey:@"StatusBarShowEncoding"] boolValue] == YES) {
		if ([[SMLDefaults valueForKey:@"StatusBarShowWhenLastSaved"] boolValue] == YES || [[SMLDefaults valueForKey:@"StatusBarShowLength"] boolValue] == YES || ([[SMLDefaults valueForKey:@"StatusBarShowSelection"] boolValue] == YES && selection > 1) || [[SMLDefaults valueForKey:@"StatusBarShowPosition"] boolValue] == YES) {
			[statusBarString appendString:statusBarBetweenString];
		}
		[statusBarString appendFormat:@"%@: %@", statusBarEncodingString, [document valueForKey:@"encodingName"]];
	}

	if ([[SMLDefaults valueForKey:@"StatusBarShowSyntax"] boolValue] == YES && [[document valueForKey:@"isSyntaxColoured"] boolValue]) {
		if ([[SMLDefaults valueForKey:@"StatusBarShowWhenLastSaved"] boolValue] == YES || ([[SMLDefaults valueForKey:@"StatusBarShowSelection"] boolValue] == YES && selection > 1) || [[SMLDefaults valueForKey:@"StatusBarShowPosition"] boolValue] == YES || [[SMLDefaults valueForKey:@"StatusBarShowEncoding"] boolValue] == YES) {
			[statusBarString appendString:statusBarBetweenString];
		}
		[statusBarString appendFormat:@"%@: %@", statusBarSyntaxDefinitionString, [document valueForKey:@"syntaxDefinition"]];
	}

	[[SMLCurrentProject statusBarTextField] setStringValue:statusBarString];
}

- (void)clearStatusBar
{
	[[SMLCurrentProject statusBarTextField] setObjectValue:@""];
}

- (NSString *)whichDirectoryForOpen
{
	NSString *directory;
	if ([[SMLDefaults valueForKey:@"OpenMatrix"] integerValue] == SMLOpenSaveRemember) {
		directory = [SMLDefaults valueForKey:@"LastOpenDirectory"];
	} else if ([[SMLDefaults valueForKey:@"OpenMatrix"] integerValue] == SMLOpenSaveCurrent) {
		if ([SMLCurrentProject areThereAnyDocuments] == YES) {
			directory = [[SMLCurrentDocument valueForKey:@"path"] stringByDeletingLastPathComponent];
		} else {
			directory = NSHomeDirectory();
		}
	} else {
		directory = [SMLDefaults valueForKey:@"OpenAlwaysUseTextField"];
	}

	return [directory stringByExpandingTildeInPath];
}

- (NSString *)whichDirectoryForSave
{
	NSString *directory;
	if ([[SMLDefaults valueForKey:@"SaveMatrix"] integerValue] == SMLOpenSaveRemember) {
		directory = [SMLDefaults valueForKey:@"LastSaveAsDirectory"];
	} else if ([[SMLDefaults valueForKey:@"SaveMatrix"] integerValue] == SMLOpenSaveCurrent) {
		if ([[SMLCurrentDocument valueForKey:@"isNewDocument"] boolValue] == NO) {
			directory = [[SMLCurrentDocument valueForKey:@"path"] stringByDeletingLastPathComponent];
		} else {
			directory = NSHomeDirectory();
		}
	} else {
		directory = [SMLDefaults valueForKey:@"SaveAsAlwaysUseTextField"];
	}

	return [directory stringByExpandingTildeInPath];
}

- (void)removeAllSubviewsFromView:(NSView *)view
{
	[view setSubviews:[NSArray array]];
	//NSArray *array = [NSArray arrayWithArray:[view subviews]];
//	id item;
//	for (item in array) {
//		[item removeFromSuperview];
//		item = nil;
//	}
}

- (void)enterFullScreenForDocument:(id)document
{
	savedMainMenu = [NSApp mainMenu];

	fullScreenRect = [[NSScreen mainScreen] frame];
	CGFloat width;
	if ([SMLMain singleDocumentWindowWasOpenBeforeEnteringFullScreen] == YES) {
		width = [[document valueForKey:@"thirdTextView"] bounds].size.width * [[NSScreen mainScreen] userSpaceScaleFactor];
	} else {
		width = [[document valueForKey:@"firstTextView"] bounds].size.width * [[NSScreen mainScreen] userSpaceScaleFactor];
	}
	fullScreenRect = NSMakeRect(fullScreenRect.origin.x - ((width - fullScreenRect.size.width + [[document valueForKey:@"gutterWidth"] doubleValue]) / 2), fullScreenRect.origin.y, width + [[document valueForKey:@"gutterWidth"] doubleValue], fullScreenRect.size.height);

	fullScreenWindow = [[SMLFullScreenWindow alloc] initWithContentRect:[[NSScreen mainScreen] frame] styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO screen:[NSScreen mainScreen]];

	if ([SMLMain singleDocumentWindowWasOpenBeforeEnteringFullScreen] == NO) {
		NSRange sell = [[document valueForKey:@"firstTextView"] selectedRange];
		[[document valueForKey:@"thirdTextView"] scrollRangeToVisible:sell];
		[[document valueForKey:@"thirdTextView"] setSelectedRange:sell];
	}

	fullScreenDocument = document;
	[fullScreenWindow orderFront:nil];
	[fullScreenWindow enterFullScreen];
}

- (void)insertDocumentIntoFullScreenWindow
{
	CGDisplayCapture(kCGDirectMainDisplay);
	[fullScreenWindow setLevel:CGShieldingWindowLevel()];
	[fullScreenWindow setContentView:[[fullScreenDocument valueForKey:@"singleDocumentWindow"] contentView]];
	[fullScreenWindow makeKeyAndOrderFront:nil];
	[fullScreenWindow setFrame:fullScreenRect display:YES animate:YES];

	[[fullScreenDocument valueForKey:@"lineNumbers"] updateLineNumbersForClipView:[[fullScreenDocument valueForKey:@"thirdTextScrollView"] contentView] checkWidth:YES recolour:YES];
	[[fullScreenDocument valueForKey:@"singleDocumentWindow"] orderOut:nil];
	[fullScreenWindow makeFirstResponder:[fullScreenDocument valueForKey:@"thirdTextView"]];
}

- (void)returnFromFullScreen
{
	SetSystemUIMode(kUIModeNormal, 0);
	[NSApp setMainMenu:savedMainMenu];

	[[fullScreenDocument valueForKey:@"singleDocumentWindow"] setContentView:[fullScreenWindow contentView]];

	[fullScreenWindow orderOut:self];
	fullScreenWindow = nil;

	CGDisplayRelease(kCGDirectMainDisplay);

	if ([SMLMain singleDocumentWindowWasOpenBeforeEnteringFullScreen] == NO) {
		[[fullScreenDocument valueForKey:@"singleDocumentWindow"] performClose:nil];
	} else {
		[[fullScreenDocument valueForKey:@"singleDocumentWindow"] makeKeyAndOrderFront:nil];
		[[fullScreenDocument valueForKey:@"lineNumbers"] updateLineNumbersForClipView:[[fullScreenDocument valueForKey:@"thirdTextScrollView"] contentView] checkWidth:YES recolour:YES];
	}

	fullScreenDocument = nil;
	[SMLMain setIsInFullScreenMode:NO];
}

- (void)insertAllFunctionsIntoMenu:(NSMenu *)menu
{
	NSArray *allFunctions = [self allFunctions];

	if ([allFunctions count] == 0) {
		NSMenuItem *menuItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Not applicable", @"Not applicable in insertAllFunctionsIntoMenu") action:nil keyEquivalent:@""];
		[menuItem setState:NSOffState];
		[menu insertItem:menuItem atIndex:0];
		return;
	}

	NSEnumerator *enumerator = [allFunctions reverseObjectEnumerator];
	NSInteger index = [allFunctions count] - 1;
	NSInteger currentFunctionIndex = [self currentFunctionIndexForFunctions:allFunctions];
	NSString *spaceBetween;
	if ([allFunctions count] != 0) {
		if ([[[allFunctions lastObject] valueForKey:@"lineNumber"] integerValue] > 999) {
			spaceBetween = @"\t\t ";
		} else {
			spaceBetween = @"\t ";
		}
	} else {
		spaceBetween = @"";
	}
	for (id item in enumerator) {
		NSMenuItem *menuItem = [[NSMenuItem alloc] init];
		NSInteger lineNumber = [[item valueForKey:@"lineNumber"] integerValue];
		NSString *title = [NSString stringWithFormat:@"%ld%@%@", lineNumber, spaceBetween, [item valueForKey:@"name"]];
		[menuItem setTitle:title];
		[menuItem setTarget:SMLInterface];
		[menuItem setAction:@selector(goToFunctionOnLine:)];
		[menuItem setTag:lineNumber];
		if (index == currentFunctionIndex) {
			[menuItem setState:NSOnState];
		}
		index--;
		[menu insertItem:menuItem atIndex:0];
	}
}

- (NSArray *)allFunctions
{
	NSString *functionDefinition = [[SMLCurrentDocument valueForKey:@"syntaxColouring"] functionDefinition];
	if (functionDefinition == nil || [functionDefinition isEqualToString:@""]) {
		return [NSArray array];
	}
	NSString *removeFromFunction = [[SMLCurrentDocument valueForKey:@"syntaxColouring"] removeFromFunction];
	NSString *text = SMLCurrentText;
	if (text == nil || [text isEqualToString:@""]) {
		return [NSArray array];
	}

	ICUPattern *pattern = [[ICUPattern alloc] initWithString:functionDefinition flags:(ICUCaseInsensitiveMatching | ICUMultiline)];
	ICUMatcher *matcher = [[ICUMatcher alloc] initWithPattern:pattern overString:text];

	NSInteger index = 0;
	NSInteger lineNumber = 0;
	NSMutableArray *returnArray = [NSMutableArray array];
	NSArray *keys = [[NSArray alloc] initWithObjects:@"lineNumber", @"name", nil];
	while ([matcher findNext]) {
		NSRange matchRange = [matcher rangeOfMatch];
		while (index <= matchRange.location + 1) {
			index = NSMaxRange([text lineRangeForRange:NSMakeRange(index, 0)]);
			lineNumber++;
		}

		NSMutableString *name = [NSMutableString stringWithString:[text substringWithRange:matchRange]];
		NSInteger nameIndex = -1;
		NSInteger nameLength = [name length];
		while (++nameIndex < nameLength && ([name characterAtIndex:nameIndex] == ' ' || [name characterAtIndex:nameIndex] == '\t' || [name characterAtIndex:nameIndex] == '\n' || [name characterAtIndex:nameIndex] == '\r')) {
			[name replaceCharactersInRange:NSMakeRange(nameIndex, 1) withString:@""];
			nameLength--;
			nameIndex--; // Move it backwards as it, so to speak, has moved forwards by deleting one
		}

		while (nameLength-- && ([name characterAtIndex:nameLength] == ' ' || [name characterAtIndex:nameLength] == '\t' || [name characterAtIndex:nameLength] == '{' || [name characterAtIndex:nameIndex] == '\n' || [name characterAtIndex:nameIndex] == '\r')) {
			[name replaceCharactersInRange:NSMakeRange(nameLength, 1) withString:@""];
		}

		[name replaceOccurrencesOfString:removeFromFunction withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [name length])];

		NSDictionary *dictionary = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:[NSNumber numberWithInteger:lineNumber], name, nil] forKeys:keys];

		[returnArray addObject:dictionary];
	}

	return (NSArray *)returnArray;
}

- (NSInteger)currentLineNumber
{
	NSTextView *textView = SMLCurrentTextView;
	NSString *text = [textView string];
	NSInteger textLength = [text length];
	if (textView == nil || [text isEqualToString:@""]) {
		return 0;
	}

	NSRange selectedRange = [textView selectedRange];

	NSInteger index = 0;
	NSInteger	lineNumber = 0;
	while (index <= selectedRange.location && index < textLength) {
		index = NSMaxRange([text lineRangeForRange:NSMakeRange(index, 0)]);
		lineNumber++;
	}

	return lineNumber;
}

- (NSInteger)currentFunctionIndexForFunctions:(NSArray *)functions
{
	NSInteger lineNumber = [SMLInterface currentLineNumber];

	id item;
	NSInteger index = 0;
	for (item in functions) {
		NSInteger functionLineNumber = [[item valueForKey:@"lineNumber"] integerValue];
		if (functionLineNumber == lineNumber) {
			return index;
		} else if (functionLineNumber > lineNumber) {
			return index - 1;
		}
		index++;
	}

	return -1;
}

- (void)removeAllTabBarObjectsForTabView:(NSTabView *)tabView
{
	NSArray *array = [tabView tabViewItems];
	for (id item in array) {
		[tabView removeTabViewItem:item];
	}
}

- (void)changeViewWithAnimationForWindow:(NSWindow *)window oldView:(NSView *)oldView newView:(NSView *)newView newRect:(NSRect)newRect
{
    NSDictionary *windowResize = [NSDictionary dictionaryWithObjectsAndKeys:window, NSViewAnimationTargetKey, [NSValue valueWithRect:newRect], NSViewAnimationEndFrameKey, nil];

    NSDictionary *oldFadeOut = [NSDictionary dictionaryWithObjectsAndKeys:oldView, NSViewAnimationTargetKey, NSViewAnimationFadeOutEffect,	NSViewAnimationEffectKey, nil];

    NSDictionary *newFadeIn = [NSDictionary dictionaryWithObjectsAndKeys:newView, NSViewAnimationTargetKey, NSViewAnimationFadeInEffect, NSViewAnimationEffectKey, nil];

    NSArray *animations = [NSArray arrayWithObjects:windowResize, newFadeIn, oldFadeOut, nil];

    NSViewAnimation *animation = [[NSViewAnimation alloc] initWithViewAnimations:animations];
    [animation setAnimationBlockingMode:NSAnimationNonblocking];
    [animation setDuration:0.32];
    [animation startAnimation];
}

@end

redpajama_set_name: RedPajamaGithub


Over the last few months, and for first time for me, I have been working with a cooking method that has simplified the precise cooking of everything from meats, to eggs, to veggies, to fish. With Sous Vide, food is cooked in a bag with the air removed. The packets of food are immersed in water that is held at a very precise temperature for a length of time calculated to allow the food to reach the temperature of the water all the way through to the center. This started out, forty years ago, when a frenchman named Georges Pralus invented the method using the well known cooking principles of low/slow cooking and vacuum packing. This method, for many years was an expensive and appliance intensive method that only large, fancy restaurants could afford to implement. Over time, and with the development of smart, connected devices and the miniaturization and improvement of sensors, the technique has become more affordable and easier to use. Best of all, I find that the food I prepare using this method is more evenly cooked and far tastier than food cooked using several other methods.
I started using the Sous Vide method of cooking this past Fall. I had heard about this unique way of cooking for years, but it was always a method cloaked in mystery, used only by expensive restaurants and caterers to prepare food with precision and safety. It was also billed as a time saving method for the pre-cooking of large quantities of foods for banquets. For years this method was out of reach for us mere mortals and most viewed it as a curiosity, kinda like the prospect of owning a giant deep fat fryer, super cool, but not convenient to use at home. Well, times have changed, and now this mysterious cooking method is available to the home chef for a nominal price and a modicum of learning, using a small, easy to store device.
Sous Vide is a cooking method that relies on precise control of temperature and time to achieve predictable, thorough, and consistent cooking of foods. The main problem that the method solves is the over cooking and inconsistent cooking of foods. In the case of meat, poultry, fish, shellfish, and, to a degree, vegetables, the technique relies on the fascinating fact that the doneness of the aforementioned foods is related quite predictably to the internal temperature of the food. So, if one cooks a steak to 126deg F it will be medium rare. When using a pan, grill or broiler to cook food, the problem is that the food item, say steak, cooks from the outside to the inside. When the outside of the steak hits 126deg, under a 500deg broiler, the inside is still fairly raw and at a much lower temperature. To remedy this we cook the meat longer. but by the time the center of the steak hits the target temperature, the outside 20% of the steak is likely at a much higher temperature and, thus, over cooked. There are various methods for mitigating this effect, like searing the steak and cooking slow and low in an oven; or the exact opposite, precooking in an oven and searing at the end of cooking. But these and other methods only mitigate the problem of a continuous gradient of doneness through the meat and don't eliminate it.
Enter Sous Vide. Let's continue with a steak as an example.
The cook places the seasoned steak in a plastic bag, presses out all the air (or uses a countertop vacuum packer), seals the bag, and immerses the package in a tub of water that is heated to 126deg F by the Sous Vide device. The steak is gradually brought up to the same temperature from outside to the center. (The time this takes depends on the thickness of the food.) The end result is a medium rare steak all the way through the meat. Perfect.
Well, perfect, except for one significant problem, especially when it comes to meats and poultry. Without exposing the food to high heat (above 250deg F), there is no way to initiate a Maillard reaction, which is a fancy word for caramelization, which is a fancy word for charing or browning. This browning of the meat adds incomparable flavor, texture, and a pleasing look, so we can't do without it.
Luckily, it turns out that we can remedy this dearth of caramelization with a quick searing (less than a minute on each side) in a smoking hot pan or with the careful (and, when one is entertaining, suitably dramatic) application of a blowtorch flame.
Another benefit of the Sous Vide method is that the vacuum sealed plastic bag holds in lots of flavor that would ordinarily be lost if direct boiling or steaming or even grilling, broiling, or baking were used. By holding everything, including seasoning, in a closed environment, all the flavors have the greatest opportunity to blend and enhance. I find that my meats and vegetables are much more flavorful than with other cooking methods.
You probably wonder what the catch is. Well, the Sous Vide cooking does take some time. Most of that time is spent bringing the food up to temperature in the heated water and one does not need to sit around watching that. I find that the time actually prepping the food is not much more than with other cooking methods, while the stress of trying to get to an exact level of doneness is eliminated. One just needs to plan ahead a little.
The only other drawback is that the method requires the purchase of a device that runs around $100 to $200. (The prices drop every month or so as new devices hit the market.) The cheapest of the home Sous Vide appliances amount to a foot long tube with a heating element in the middle, a small propeller (or pump for recirculation of the water), at one end, and a power cord and control button/panel at the other end. The tube is immersed pump down in a container of water to a certain level and then plugged in and usually connected to a smart phone with bluetooth or wifi. Some devices are set up via a small screen and buttons and dials on the end of the device that sticks out of the water; others are set up completely from a network connected smart phone or tablet. There are several books and websites available that cover the principles of Sous Vide cooking and provide numerous recipes with cooking times and temperatures for various food thicknesses and desired levels of doneness. I have the Joule by Chefsteps. I love it and have prepared a variety of dishes using their cooking app, which has dozens of recipes. The device is super easy to use and can also be programed "manually" via the app.
I have used the Sous Vide method to make everything from steaks, to chops, to confit tuna, to slow and low cooked Char siu pork, to poached eggs in the shell, to veggies. I am always super happy with the results. The meats come out so perfect that I have guests telling me the only place they've had a steak or chop as good is at a fancy steak house. I am also a proponent of this method because it is something that a good home cook can add to their repertoire easily and see benefits quickly. Home cooks will immediately increase their versatility in the kitchen, raise their cooking of certain items up a few notches, and reduce the stress of achieving perfect doneness.
If you like to cook at all, I can virtually guarantee you will love the Sous Vide method.


You could drive by Toyota's automotive treasure chest a million times and never know it was there. Snug in an industrial estate in Torrance, California, surrounded by innocuous boxy buildings with huge "Self-storage" signs on the front, the Toyota USA Automobile Museum could double as a secret headquarters for a James Bond villain.
That's until you step inside.
A bright red 2000 GT coupe, now a million-dollar classic, greets you in the lobby. Beyond it, a 45,000 square-foot warehouse holds dozens of immaculate examples of Toyota cars, trucks, concepts, movie props and racing machines.
While the museum is technically not open to the general public, booking a private tour is as simple as sending an email or picking up the phone and scheduling a visit. We had the entire place almost entirely to ourselves during two hours of roaming amongst spotless Celicas, cream puff Camrys, and rugged Land Cruisers, all in as-new condition.
Here are some of our favorites from Toyota's, perhaps, not-so-secret (anymore) collection of past classics.
Seeing one of Toyota's stunning 2000GT coupes qualifies as a life-changing event for most car nuts. The Toyota USA Museum has three of them!
Introduced at the 1965 Tokyo Motor Show, production began two years later and, in total, only 337 were built. Of those, 54 made their way to the U.S. market.
Powered by a 150-horsepower, 2.0-liter inline-6 coupled to 5-speed manual transmission, this shapely Toyota – considered the world's first Japanese sports car – would have set you back about $7,200 when it was new. Now, examples routinely sell for more than a million dollars, making them the most expensive Japanese classic cars in the world.
Finished in gold, white, or a vibrant shade of red, all the examples in the Toyota museum are in perfect condition. We were particularly smitten by the one finished in Gold Metallic paint – a color choice your author had never seen on a 2000 GT before. Then again, the red example in the lobby is one of only four imported into the U.S. circa 1969. It's also fitted with an optional – and extremely rare – air conditioning system. For California cruising, that's not a bad thing to have onboard.
An off-roading legend, the FJ40 Land Cruiser is ruggedly handsome and renowned for being a workhorse.
We'd love to get our hands on the pristine white example sitting proudly in the Toyota Museum but, with only 3,000 original miles, it seems a crime to get it dirty.
The Land Cruiser, especially the FJ40 models, cemented Toyota's reputation for reliability here in the U.S. and abroad. While you'd never accuse it of being pretty, the FJ40 has a timeless shape that makes you want to point toward the nearest forest or sand dune and drive into the sunset. Powered by a 125-horsepower inline-6 that comes mated to a 4-speed manual – and a myriad of off-roading gear ratios – the "Landie" rides on a petite 90-inch wheelbase, yet tips the scales at a stout 3,800 pounds.
For car trivia fans, the Land Cruiser also happens to be the only model in the Toyota lineup that has been sold continuously since the Japanese automaker began selling cars in the U.S.
Toyota's stab at cracking the U.S. truck market came in the shape of the Stout pickup. Stretching 170 inches in length and weighing approximately 2,800 pounds, the Stout came powered by a 1.9-liter 4-cylinder that delivered a grand total of 85 horsepower. An information sheet placed alongside one of several examples in the museum optimistically refers to the OHV inline-4 as a "high performance" motor.
With its 6×5 foot cargo bed and 2,000 lb. towing capacity, the Stout was marketed as a work truck that was as simple to operate as a standard car. A column-mounted 4-speed manual keeps the cabin clean and uncluttered, while a springy foam-filled bench allows for three-across seating.
According to Toyota, the Stout could cruise comfortably at 80 miles per hour. The speedometer does stretch that far, though we might be more inclined to let that "high performance" engine enjoy life as lesser revs.
Can a 92-hp coupe really be a muscle car?
When it arrived in the U.S. in 1971, the Toyota Celica helped usher in an era of affordable Japanese sport coupes that were lighter, more economical, and certainly much cheaper to insure then heavy-hitting American muscle cars. Granted, it never had a Hemi under the hood – and the 1977 grey example seen here is fitted with an automatic gearbox, no less. But the Celica was a smash success for Toyota.
In its first year stateside, more than 17,000 were sold. When this 1977 example rolled off the production line, the Celica was truly a global hit with more than one million having been sold around the world.
We must admit, this brutish liftback sure has the look of a muscle machine, even if the 96-horsepower 2.2-liter (and that slush box) doesn't have the speed of a Road Runner, or the bite of a Barracuda.
As an interesting – and slightly morbid – aside, this pristine Celica GT had what we thought was a film crew practicing scenes in the car. When we asked Toyota's museum staff if the car had some celebrity connection, we were told the Celica was being used to help solve a cold case murder file, in which a young woman was killed in a car almost identical to this one. Yipes!
Part of the appeal of the Toyota museum is spotting the survivor cars, the normal everyday cars you remember as a kid, but haven't seen since. When is the last time you saw a 1984 Camry in perfect condition? Or how about a 1983 all-wheel-drive Tercel wagon, for crying out loud.
Far from the most valuable or eye-catching model in the collection, this little white economy car has somehow stood the test of time. For pure 1980s nostalgia, it's hard to beat. The alloy wheels have blue highlights, and the decal of a skier zooms along each side of the car.
Powered by a 62-horsepower 1.5-liter 4-cylinder that's coupled to a 6-speed manual, the Tercel weighs a scant 2,280 pounds despite having its AWD hardware.
We might opt to grab the keys to a 2000GT first, but this square-edged Tercel wagon would make a fine first alternate if snowflakes start falling in Southern California.


text:
Q: what is the golang equivalent of nodejs file.createResumableUpload({ ... }) I'm trying to generate a signed upload url to GCS, using golang, that can be used from browser.
In nodejs, I can create resumableUploadURL by calling this code:
const { Storage } = require('@google-cloud/storage')

const bucketName = "mybucketname"
const path = "path/to/file.png";
const contentType = "image/png";
const bucket = storage.bucket(bucketName);
const file = bucket.file(path);
const [uploadURL] = await file.createResumableUpload({
   origin: params.origin,
   'Content-Type': contentType,
   metadata: { 'Content-Type': contentType } // ?important?
 });

And that will give uploadURL
https://storage.googleapis.com/upload/storage/v1/b/mybucketname/o?name=path%2Fto%2Ffile.png&uploadType=resumable&upload_id=ADPycdvi1mH34PtIUEyVO9SzezIAkdlw3suis2WpB1KrK44FJ9_wGCKRHDyRBk9fZP1Aadqqy-3u5BpnHwIRZyJyl1bDFGmuTLPn

how can I do that in golang?
I've tried:
import ("cloud.google.com/go/storage")
opts := storage.SignedURLOptions{
  ContentType: u.ContentType,
  Method: "PUT",
  Expires: time.Now().Add(15 * time.Minute),
  Headers: []string{"host: %s", u.Origin},
  Scheme: storage.SigningSchemeV4, // or V2 doesnt matter
}
uploadURL, err := bucket.SignedURL(path, &opts);

And it gave me:
https://storage.googleapis.com/mybucketname/path/to/file.png?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=xxx.iam.gserviceaccount.com%2F20230206%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20230206T144142Z&X-Goog-Expires=899&X-Goog-Signature=11715d0552d8ed1ee3d303bce95d6fee1c04a2dd12e3f300b5cce5298b4b1045cf89217cd929d5de4cc5d8ac3bd6d906c059ff85d9abad35c9d85d65a1e4f0162d0d0d719738323cb935605ff34c6d0bccb6026290c8b61707dc015316748d8542e67d0d5c839177cd27c1e0822b252f340b62fe65.....6c343abd2a40b21561026812a81fb22ed57e714b689169d823fa8954f80184a5d04086ab032edd6da288523985568293501aa57efddc36b9f0c58cb39afe1d4da9f863f1b6b87057503683df6b3ebc0bc7f83bcd580a5abb9236acf167972952ede0e4ad3d1b22e9293d9f614433105381f2f234b3b0f1ea0559d&X-Goog-SignedHeaders=content-type%3Bhost%3Bhost

so, I guess my problem is, when I send my file to the uploadURL returned by golang from browser, it doesn't include Origin in its request headers, and therefore experiencing CORS issues. And also, I can't just manually add it, because most browser refused to set that header because it was considered unsafe.
I think, the browser doesn't send origin headers because the header response from the preflight OPTIONS to the golang URL, doesn't have access-control-allow-origin, access-control-allow-methods, etc etc.
so yeah, how do I generate a signed upload URL that can be used from browser in golang?

redpajama_set_name: RedPajamaStackExchange


text:
Because They Hate ~ Brigitte Gabriel
Here's a quote from "Because They Hate" by Bridgitte Gabriel, speaking about when her mother was cared for in an Israeli hospital during the Lebanese civil war:
"I also learned about hatred, intolerance, and bigotry. The Muslim woman who was in the room with my mother and had stayed in the hospital for about twelve days. And even after ten days, when the doctors left the room after changing her bandages and checking on her in their morning tour, she said, with an evil, hate-filled look on her face, "I hate you all. I wish you were all dead." And for the first time in my life I saw evil. I realized that this Muslim couldn't love the Jews even after they had saved her life. And when you are unable to be grateful to the people who saved your life, you have no soul. When humans become devoid of compassion, a sense of forgiveness, and open-mindedness, when they surrender their humanity to hate, they become an evil force of darkness that is irreconcilable with hope, love and peace."
and this bit about the media coverage of the war:
"Their bias was shocking. The media reported a one-sided story, focusing only on the Palestinians and Muslims whose lives had been destroyed by Israel. I thought, What about our lives, which had been destroyed by the Muslims and the PLO? What about the massacres, slaughter, rape and torture of Christians and the destruction of our churces by Muslims shouting "Allahu Akbar"? What about Lebanese democracy now under the thumb of the Syrians? What about the people of Lebanon, who were so open-minded, tolerant, and fair? What about the hatred, intolerance, and bigotry of the Palestinians who were given refuge in Lebanon, and then destroyed and terrorized what was once the beacon of culture, education and modernity in the Middle East?"
Hmmmmm, that sounds a lot like what happened last summer! Doesn't it?
Why do they hate? Who is their father? Isn't he the father of lies? He hates, so they are faithful children and do what they see their father doing!
Good morning, G*D bless and Maranatha!
The trick is to get them to the point where they are adopted as sons and daughters of G*D, that will change everything!
Geepers tmw, that sounds familiar (Jn 8:44):>D.
I feel so sorry for her mother being stuck in a room with a woman possessed of such irrational hatred. It would definitely not be conductive to helping her heal fast! That sort of irrational hatred effects every living thing around it. If there were any flowers in the room I'll bet they wilted much faster than they would have otherwise.
Blessings, Eyes. When I go into town next week I'm going to look for this book.
Because They Hate gave me nightmares. The only book on Islam which has done that to me!
I saw a video clip of Gabriel recounting the story on YouTube...As AOW says, it is nightmare stuff.
Hi Gayle, You'll enjoy it! Well, maybe enjoy is the wrong word. It's strong stuff.
Hi AOW, Maybe that's why I'm having nightmares! Yikes. She's obviously an intelligent woman.
Hi Brooke, I saw it too. It was about an hour long... Or maybe that was on her website.
NGC 6302: Big, Bright, Bug Nebula
Carina Nebula Panorama from Hubble
Nonie Darwish
Now They Call Me Infidel ~ Nonie Darwish
Google's New Logo???
Liviu Librescu
The Force of Reason ~ Oriana Fallaci
Republican Calls for $
Gun Culture
Rungs of the Red Rectangle
MWC 922: The Red Square Nebula
Imus
The Thinking Bloggers Award
What's WRONG with the UN
Mark Stein's Recommendations
Robert Spencer Recommendations
Friday the 13th ~ hail.....
The Rage and the Pride - Oriana Fallaci
Islamic Tolerance
The Truth About Muhammad - by Robert Spencer
The Great Khomeini
X-Ray of a Moonbat's Head...
Stem cells from amniotic cells...
It's a sad day in Texas
Peace Kills
21st Century Neville Chamberlin
New Horizons at Io
An Active Sunspot Viewed Sideways
2nd Ammendment

redpajama_set_name: RedPajamaCommonCrawl


text:
A "cookie" is a simple text file that is downloaded from your computer (or any other device used to browse) to store information related to your browsing of a particular site. Cookies are downloaded from the web server hosting the site and downloaded by the browsers (Internet Explorer, Mozilla Firefox, Google Chrome, etc…) used by the end user, these files then reside on the user's device and are used/read during subsequent visits to the site.
Cookies, web beacons, tags and similar technologies can be grouped according to their characteristics or purposes.
Depending on the length of their expiry period, cookies can be persistent and session cookies.
Session cookies donly last until the end of the session and expire at the end of your current visit to the site. They allow us to link your actions during that particular session.
Persistent cookies are stored on your device between browser sessions, allowing us to remember your preferences or actions across multiple sites.
Depending on their ownership, cookies are divided into two categories:
First party cookies are those set and managed by Imer International spa and our site at the time it is visited by the user to preserve your preferences.
Third party cookies are placed in your browser by a domain and provider when you are not visiting our Site. Our Site sets third party cookies from our partners and analytics and marketing providers.
Cookies, web beacons, tags and similar technologies, whether operated by us or by third parties, serve various purposes on our Site. Depending on the purpose, they may be essential to the operation of our Site and our services or allow us to provide additional functionality such as tracking trends and user movements, analysing demographic information, providing analytics on the Site and for advertising.
According to their purpose, we classify them into the following categories:
Strictly necessary cookies: these cookies are necessary for the functioning of the website. They may store your account ID, order status, personalisation or website tracking. They may also be used for technical purposes such as keeping track of your current shopping session and allowing you to proceed to checkout and pay for your order, or to store information that you have already entered (such as your region and language choices) so that we can offer you relevant and personalised services, products and other communications. Cookies also enable us to fulfil our contractual obligations to third parties and partners if you have made a purchase from our website by following a link to them. It is not possible to manage this type of cookie in our system, and to disable them, you will need to do so across the board via your browser settings. You can set your browser to block or warn you about these cookies, but please note that some parts of the site will not work if you do so.
Analytics cookies: we use third party analytics services to collect information about the use of this site, such as the number of visits, pages visited, popularity of certain content. Analytics tools use tracking cookies to recognise your device and compile information about you. They collect information about the pages you visit and how long you spend on these pages, the IP address you have been assigned, what operating system and web browser you use and which site you visited before visiting our website. If you disable these cookies we will not know when you have visited our site and we will not be able to monitor and improve its performance.
Functional cookies: these cookies enable our website to provide enhanced functionality and personalisation. They may be set by us or by third party providers whose services we have added to our pages. If you do not accept these cookies, some or all of these services may not function properly.
A list of the cookies we use on our Site, with classifications for each category, is available in the Cookie Settings section. In order to compose the list of cookies in each category, our Site is regularly scanned with the cookie scanning tool to keep it as accurate as possible.
Cookies can be restricted or blocked by specific browser settings, so if you do not want to store certain cookies on your computer, you can configure your web browser accordingly. You may choose to block all cookies or only specific cookies. At any time, the user can choose to delete cookies stored on his or her browsing device. The settings must be changed separately in each browser and computer used.
If you have blocked cookies, the website cannot function properly. Some functions may not be available and it may no longer be possible to view certain pages.
It is important to note that blocking cookies does not eliminate the display of any advertisements. They will simply no longer be personalised according to your interests.
If you would like to learn more about how your browser stores cookies during your navigation, please follow these links on the websites of the respective providers:
Internet Explorer – https://support.microsoft.com/en-GB/kb/278835
Chrome – https://support.google.com/chrome/answer/95647?hl=en-GB
Firefox – https://support.mozilla.org/en-GB/kb/delete-browsing-search-download-history-firefox
Safari – https://support.apple.com/kb/PH5042?locale=en-GB
Opera – http://www.opera.com/help/tutorials/
Updates and modifications
Due to the dynamic nature of the Web, it is not possible to always be able to control the cookies that are stored by third parties through a website.
You are therefore kindly requested to inform our references of the presence of such a cookie that is not included in the list above.
This text may need to be amended. We are therefore entitled to change the content of the information
SB - SD series
SBLX - SDLX series
AC - DA series
ACLX - DALX series
DC series
Serie RAN6
Serie RAV70
Serie RAN6 D
RQ series
LMD series
LS series
DL10 series
ND series
ND21 series
NC series
VDAI series
VS32 series
SA3 series
Hard concrete
Hard and airport concrete
Asphalt and hard concrete
Joint cut within 48h
Old concrete
Joint cut after 48h
Diamond wheels
Ceramic delicate materials
Universal TOP QUALITY
Universal segmented
Universal with continual core
Reinforced concrete
DV60 series
L63 series for egder trowel
L75/E series for egder trowel
L100 series
Hydraulic blade pitch system
Mechanical blade adjustment
Aquilone Serie
EL serie
B serie
Serie CL
Serie CT300
Adaptors F.P.C.
Extension F.P.C.


As the world's leading OCT innovator, ZEISS has been at the forefront of industry-defining advancements that have made OCT standard of care. Today, that leadership continues with new clinical assessment tools for CIRRUS 5000 and 500.
"Being able to visualize so quickly areas of macular ischemia in my DR patients without the use of a contrast agent could really help me more easily select patients with DME eligible for treatment."
With FastTrac, scan at the highest resolution at the same location at each visit.
Focal Progression Analysis – Up to 6 progression maps are compared to two baselines. Areas of statistically significant change are color-coded yellow when first noted and then red when the change is sustained over consecutive visits.
Trend Analysis with Rate of Change – RNFL thickness values are plotted over time. Trends are calculated and confidence intervals are shaded when rate of change is statistically significant.
Want to learn more? Download the ZEISS Progression Analysis Tools flyer.
The CIRRUS HD-OCT Software has been tested with Microsoft® Security Essentials, but anti-virus software does not come pre-installed. When installing your anti-virus software per the manufacturer's recommendations, configure it so it does not scan automatically, as this may interrupt the operation of the CIRRUS instrument or your review station.
Virus scans and virus definition updates must be launched manually or scheduled to run when patient data acquisitions are not actively being performed on the CIRRUS equipment.
CIRRUS Version 7.6/8.1 Software: Windows 8.1 (32- and 64-bit), Windows 7 SP1 (32- and 64-bit), Windows Server 2008 R2, and Windows Server 2012 R2.
CIRRUS Version 9.0 (and higher): Windows 8.1 (64-bit), Windows 7 SP1 (64-bit), Windows Server 2008 R2, and Windows Server 2012 R2.
Device must have Nationally Recognized Testing Laboratory (NRTL) and FCC approval for use in the US.
Device must be powered by USB port only.
Device must be outside the patient environment (at least 1.5 meters away), unless used with an isolation transformer.
Do not use with an extension cord or power strip.
Use unshielded network cables (UTP) only.
Do not share the same wall outlet with the CIRRUS HD-OCT.
Contact Carl Zeiss Meditec for compatible printer driver version(s).
Refer to Software Installation Instructions for minimum system requirements.
This document provides a step-by-step guide to scan acquisition on the CIRRUS HD-OCT Model 5000 and CIRRUS HD-OCT Model 500 including basic scanning technique and advanced tips.
This reference identifies each of the retinal layers.
Take advantage of our ON-DEMAND webinars available for a limited time. The session will require a pre and post test, and for you to register on the RetinaCME.com site. Please click on the links below to access the webinars.
How do I move scan data if I scan under the wrong patient name?
An incorrectly stored scan can easily be moved to a different file using the MC feature on a CIRRUS HD-OCT instrument. Download and follow the steps below.
How do I register a license within the CIRRUS instrument software or CIRRUS Review Station software?
It's easy to register special or optional licenses you have purchased. First, locate the license certificate that shipped with the instrument software. You will need to reference the license serial number on the certificate to initiate the registering process. Download and follow the steps below.
How do I troubleshoot Start-Up Check errors on a CIRRUS HD-OCT?
This guide reviews remedies for three standard error messages that may occur during the Start-Up Check process: Scanning module error, preventative maintenance error and Archive volume error. Download and follow the steps below.
How do I install CIRRUS HD-OCT Review Software for FORUM?
You can perform a new installation of CIRRUS HD-OCT Review Software for use with FORUM® Eye Care Data Management with your CIRRUS HD-OCT instrument. Download and follow the steps below.
How do I install CIRRUS HD-OCT Review Software for Non-FORUM use?
You can perform a new installation of CIRRUS HD-OCT Review Software for Non-FORUM use on your CIRRUS HD-OCT instrument. Download and follow the steps below.
How do I upgrade my CIRRUS HD-OCT Review Software?
You can perform an upgrade on your already configured and running CIRRUS HD-OCT Review Software. Download and follow the steps below.
How do I clean the fan filter on my CIRRUS HD-OCT?
It is important to periodically inspect and clean the fan filter located under the removable cover on top of the CIRRUS HD-OCT instrument. To clean the fan filter, watch the video or download and follow the steps below.
How do I create a new (non-DICOM) archive on my CIRRUS HD-OCT?
The CIRRUS HD-OCT instrument must first be connected to a network before an archive location can be created. To get started, download and follow the steps below.
Acquiring a high-quality scan on a CIRRUS HD-OCT is a 3-part process, which includes iris alignment, fundus alignment and OCT alignment that results in a final scan. This document demonstrates Part 1: How to obtain a high-quality iris alignment. Download and follow the steps below.
Acquiring a high-quality scan on a CIRRUS HD-OCT is a 3-part process, which includes iris alignment, fundus alignment and OCT alignment that results in a final scan. This document demonstrates Part 2: How to obtain a high-quality fundus alignment. Download and follow the steps below.
Acquiring a high-quality scan on a CIRRUS HD-OCT is a 3-part process, which includes iris alignment, fundus alignment and OCT alignment that results in a final scan. This document demonstrates Part 3: How to obtain a high-quality OCT alignment. Download and follow the steps below.
To successfully install and run CIRRUS™ HD-OCT Review Software, your computer system must meet specific hardware and software requirements. Before you begin, download and review the CIRRUS Review Software Version Compatibility Matrix below.
Send us your images today!
2 Features are either available as an additional option or as a standard in some countries.
3 All existing scan patterns in version 6.5 software run at 27,000 A-scans per second. The OCT fundus image acquired with the Model 500 will be captured at 68,000 A-scans per second.


Devon is a large county in the south west of England with many sandy beaches, fossil cliffs, medieval towns and moorland national parks. There are also towering cliffs of the northern Exmoor Coast and rock formations on the fossil-rich southern Jurassic Coast. The English Riviera as it is known is a series of picturesque harbour villages including Torquay, Paignton and Brixham. The county has a wide variety of housing stock ranging from very new housing to much older housing dating back hundreds of years.
The weather conditions in Devon, especially in the winter can be particularly damp and wet and can result in rapid moss growth on roof tiles which can look very unsightly. A porous roof becomes a 'haven' for all types of moss, lichen and algae to flourish. Porous roof tiles will provide the perfect environment for moss and other forms of algae to grow which can be a constant problem. We have heard from homeowners throughout Devon, from Sidmouth and Lyme Regis in the south to Barnstaple and Bideford in North Devon who need a good roof moss removal service.
Smartseal have a network of contractors who are trained in the art of professional roof cleaning to ensure you have a new looking roof every time. It is beneficial to have your roof cleaned as the streaks that are staining the roof are actually a bacteria called Gleocapsa Magma. These strains of algae, mould, mildew, lichens and moss directly decompose and break down roofing materials over a prolonged period of time which will be costly to repair.
Moss removal and proper maintenance of your roof will increase its longevity and save you money, which is the protection of one of your biggest investments. A clean roof will keep your property value higher in Bideford, Exmouth or Brixham, because it will retain its kerb appeal.
If you would like a no obligation FREE Quote for roof cleaning and moss removal in Paignton, Barnstaple, Exeter, Plymouth, Torbay and all other towns and villages in Devon, just call us 0800 849 9498 or make an enquiry online.


text:
/ Portrait - NPG 3251; John Keats
Extended Catalogue Entry
You must have Javascript enabled to view zooming images
Buy a print Make a donation Close
by Benjamin Robert Haydon
pen and ink, 1816
12 1/2 in. x 8 in. (318 mm x 203 mm)
Primary Collection
Sitterback to top
John Keats (1795-1821), Poet. Sitter in 15 portraits, Artist associated with 2 portraits.
Artistback to top
Benjamin Robert Haydon (1786-1846), History painter and diarist. Artist associated with 34 portraits, Sitter in 10 portraits.
This portraitback to top
John Keats was introduced to Benjamin Robert Haydon in 1816 when the poet was still a medical student and virtually unknown. Theirs was an immediate and intense friendship which lasted until Keats's death in 1821. Haydon, who nurtured ambitions of becoming a great history painter, made these sketches of the poet's profile for possible inclusion in his large scale work, Christ's Triumphant Entry into Jerusalem. They were drawn on the back of pages from the artist's diary during an evening the friends spent together in November 1816. The inscription along the bottom in praise of Keats was added by Haydon after the poet's death. The lines, including those deleted, read, 'Keats was a spirit that in passing over the Earth came within its attraction (and fell on it, against its will! and spent like a....bird, he worried himself) and expired in fruitless struggles (to regain his former height) to make its dull inhabitants comprehend the beauty of his soarings'. The inscription along the bottom in praise of Keats was added by Haydon after the poet's death.
Related worksback to top
NPG D36764: John Keats (source portrait)
Linked publicationsback to top
Rogers, Malcolm, Master Drawings from the National Portrait Gallery, 1993 (accompanying the exhibition at the National Portrait Gallery from 5 August to 23 October 1994), p. 90
Saywell, David; Simon, Jacob, Complete Illustrated Catalogue, 2004, p. 346
Walker, Richard, Regency Portraits, 1985, p. 287
Subjects & Themesback to top
Events of 1816back to top
Marriage of Princess Charlotte to Leopold I.
Income Tax abolished.
Unsuccessful Spa Fields Riot led by the ultra-radical Arthur Thistlewood which aimed to attack the Tower of London and the Bank of England and set up a ruling 'Committee of Public Safety' following the French model.
Jane Austen publishes Emma.
Leeds and Liverpool Canal completed.
British Government buys the Elgin Marbles, taken from the Acropolis in Athens by Thomas Bruce, 7th Earl of Elgin, and brought to England between 1803 and 1812. Their acquisition prompts support from Thomas Lawrence and Benjamin Robert Haydon and condemnation from Lord Byron.
Slave rebellion fails in Barbados; four hundred slaves are executed.
Can you tell us more about this portrait? Spotted an error, information that is missing (a sitter's life dates, occupation or family relationships, or a date of portrait for example) or do you know anything that we don't know? If you have information to share please complete the form below.
If you require information from us, please use our Archive enquiry service. You can buy a print of most illustrated portraits. Select the portrait of interest to you, then look out for a Buy a Print button. Prices start at £6 for unframed prints, £25 for framed prints. If you wish to license this image, please use our Rights and Images service.
William Hazlitt's Spirit of the Age
Return to Life: A New Look at the Portrait Bust
Order this print today
Can you tell us more about this portrait?
Framed & unframed prints
Choose your favourite portrait from our Collection as a framed or unframed print for your home.
360° sculptures
Look right round a selection of sculptures in our Collection
Explore today
Explore who is who in our group portraits
See this portrait


text:
Graham Capital
Birmingham Developer to Deliver Three Class-A Warehouses in Tampa, Florida
By Joel Dorning
Birmingham, AL (January 2023) – Graham & Company, the Birmingham, Alabama-based commercial real estate services, and development company, recently closed on the acquisition of approximately 21 acres located at the intersection of US-301 and Florida Palm Drive, making way for a new, three-building, 262,440 square foot speculative warehouse/distribution development named "East Tampa Commerce Center." Slated for completion in early 2024, this project is a joint venture between Birmingham-based Graham Capital and the previous landowner, Palm River JLM Center, LTD. This transaction also includes a separate acquisition of an existing, 100% occupied industrial facility located at 9208 Palm River Road.
"We are thrilled to deliver Class A industrial space to what we believe to be the best-remaining infill industrial location in Tampa and continue to grow our presence in the Sunshine State," said Matthew Graham, Vice President of Graham & Company and Principal of Graham Capital. "Despite challenges facing our economy and increasing construction costs, we have been encouraged by the continued population growth and rent appreciation Tampa has experienced and are proud to be able to contribute to Tampa's further growth."
The three facilities will range in size from 85,500 SF to 91,440 SF and feature 32-foot clear heights within a concrete tilt wall structure. The buildings will be available for single-tenant users or could be divided into smaller suites to accommodate a variety of tenant sizes and uses. The project's location along US-301 provides exceptional access to the I-75, I-4, and the Selmon Expressway and is less than 10 minutes from downtown Tampa.
ARCO Murray Construction Company will serve as the project's design/build team. Kimley-Horn will oversee the civil engineering needs of the project. Financing is to be provided by Truist. Graham & Co/Graham Capital look forward to collaborating with the community and the city of Tampa to make this project a reality and plans to break ground on the site in early 2023.
About Graham & Company
Founded in 1978, Graham & Company is a full-service commercial real estate firm with offices in Birmingham, Huntsville, and Panama City, Florida. Graham offers investment sales, leasing, property management, and development services.
Graham & Company has been involved in the development and management of industrial properties, office buildings, office/service centers, and office rehabilitation projects throughout the Southeast. Over the last 20 years, Graham & Company has delivered more than 11 million SF of build-to-suit and speculative industrial and office projects, each involving a unique set of challenges and hurdles to overcome.
Graham & Co.'s projects and properties are managed by a staff of seasoned real estate professionals, including many who have earned prestigious designations such as SIOR, CRE, CCIM, LEED, RPA, CPM, and MAI.
About Graham Capital
Graham Capital is a real estate investment company based in Birmingham, Alabama, focused on the acquisition and development of highly functional distribution centers in high-growth Southeastern industrial markets, which continue to experience above-market rent growth, high barriers to entry, and the deepest demand among institutional investors.
© 2021 Graham Capital, LLC. All rights reserved
1801 5th Ave, North
Ste. 300 | Birmingham, AL | 35203


text:
Clustered Networks Spread Behavior Change Faster
Unlike infectious diseases and news, behavior change spreads faster through online networks that have many close connections instead of many distant ties. Redundancy is key, as people are more likely to engage in a behavior if they see many others doing it.
"There has been a lot of theory about the difference between information and behavior spreading," said economic sociologist Damon Centola of the Massachusetts Institute of Technology, author of the study published Sept. 3 in Science. "We've assumed that they are the same, but you can imagine that behavior is not really like that, that you need to be convinced."
The research has important implications for people designing online communities intended to change or maintain a behavior, like weight watchers or online health communities, Centola said.
To do the experiment, he created an internet-based health community and invited people already participating in other online health forums to join. Over 1,500 people signed up to participate, and they were placed anonymously in one of two different kinds of networks: a random network with many distant ties (above left), or a clustered network with many overlapping connections (above right).
Users in both networks had the same number of assigned "health buddies." They couldn't contact their buddies directly, but they could see how their buddies rated content on the site, and could receive e-mails informing them of their buddies activities. Centola said he deliberately didn't pay the volunteers, so they would participate out of legitimate interest in the site's content.
In six different trials over a period a few weeks, Centola seeded the site with information about an online health forum and tracked people as they signed up and participated.


I was invited. They told me about the Special Court in The Hague here. Mr Lawyer, you see most of these things I cannot recall properly because it is not in a record with me. I don't want to tell a lie before this Court. I stand by my oath. I would not remember, I will not recall all the things that were involved, I mean, all the things that I was called for.


Welcome to Good Faith Press, a music publishing organization that provides music to customers 'in good faith': You pay cash or credit for the music if you can afford to do so. If not, you may use the music free of charge.
• Spreading the news of Good Faith Press via Twitter, Facebook, blogposts, other preferred social media, and/or personal contacts.
• Giving us feedback ~ We'd love to hear from you: What are your reactions to the music? What was the response of your choir? Of your congregation/audience?
• Paying the listed price if you are able to pay and normally do.
» In sum, please support this publishing endeavor through whatever means is available to you. Thanks very much!
If you're interested in submitting some of your own music to GFP for publication on this website, please contact Andrew Clarkson via our contact form.


On the subject of caring to your childrens clothes, any guardian will rapidly uncover that caring for child's clothing is way completely different than caring for adult clothes. In the case of Goal, dad and https://babymamacloset.com/ mom can use the presence of toys and different enjoyable issues for teenagers to their benefit ― by using them as potential rewards for good habits in the retailer. In irritant contact dermatitis, the damaged floor of the abraded skin loses moisture and dries out, resulting in the itchiness and rash.
Instead, mother and father should select appropriate sleep clothes or a sleep sack to keep baby warm and comfy. Their parents may need "consciously uncoupled," but Gwyneth Paltrow and Chris Martin have managed to remain fairly shut for his or her kids.
This works especially properly with wholesale child clothing akin to snapsuits or one pieces and objects like t-shirts. Participants have been requested in regards to the quantity and forms of their childhood pets, how often they were answerable for their animal(s) care, how shut they felt to the animal(s), and so on.
Child oil might help loosen stubborn scales of dried, flaky skin in the hair of infants and toddlers suffering from cradle cap, according to Lisa Chavis, registered pharmacist and creator of "Ask Your Pharmacist." Known as seborrheic dermatitis in medical circles, cradle cap is a temporary pores and skin condition that occurs ceaselessly in infants and infants as much as the age of 3, according to the Nationwide Institutes of Well being.
At the least, eradicating the oil out of your scalp is troublesome with this kind of remedy because the baby oil needs to remain in your head for at Shop toddler clothing online least eight hours to drown the lice, according to Michigan State College Extension. Once you dry your children garments, attempt to grasp dry the items if doable.
Apply child oil to your baby's hair in small quantities to reduce your probabilities of by accident dripping it on expensive clothes, bed linens or new carpets. Kimora Lee, who recently gave delivery to Baby No. four, has an estimated web worth of $50 million, in line with CelebrityNetWorth.
Nicely, HollyBaby reported in 2011 that the couple seemingly spend round $10 million per yr on their youngsters. EczemaNet reviews that sunscreen itself is usually the culprit in occurrences of allergic photocontact dermatitis. You can save much more money on children's clothing when you purchase low season on closeout.
Designers at the moment are apprehending the growing demand for youths clothing traces after quite a lot of sons and daughters of celebrities have been noticed in brand-identify threads. Then, deliver your design to a manufacturer or continue as an unbiased artisan and produce handmade youngsters's clothing for crafts fairs and boutiques.
Those that owned a wide range of pets (i.e. hamsters, canines and cats, as opposed to simply canines) had been extra prone to keep away from a wider vary of animal products (e.g., refrain from all animal merchandise versus solely meat) than those who owned fewer pets.
Selecting clothes for your youngsters is perhaps very difficult. New mother and father and doting relatives love giving unique and personalized youngsters's clothing. Last yr, Tori Spelling threw daughter Stella a $6,000 spa-themed social gathering for her eighth birthday, studies Hollywood Life.
In addition to preventing sunburn and skin most cancers, sunscreen helps mirror UV rays and might prevent your physique from heating up. If you will be uncovered to the sun for long durations of a time, carry the sunscreen with you and reapply it periodically.
This page was last edited on 18 February 2019, at 04:26.


Lane Shift / Congested Area - East Broadway at Brown School Road Begins Friday, August 17.
Working in conjunction with the TDOT safety improvement project at Brown School Road, the Maryville Water and Sewer department will be relocating a sewer line in the area of Brown School Road to Hardee's Restaurant. A lane shift will be required in this area starting Friday, August 17 and the following Monday, August 20 - Friday, August 24. This will be a congested area.
The TDOT project will continue through the end of the year and will have Brown School Road closed from Old Knoxville Pike to East Broadway Avenue. The project was funded by TDOT to improve safety at the intersection and includes widening Broadway and installing a traffic signal.


Smartsheet Inc. stock price, stock quotes and financial overviews from MarketWatch. Vincere casino vietnam hiring roulette con un sistema gratis (metodo matematico strangle). Programma software gratuito (Windows e Android) per giocare alla roulette … Principal TranslationsTraduzioni principali: Inglese: Italiano: rustle slot machines american poker noun: Refers to person, place, thing, quality, etc.
(faint crackling sound) fruscio nm: I love the rustle of leaves under slot galaxy itunes feet. Dati generali Partito politico Lista del Popolo per la Costituzione (dal 2017) Alternativa (2010-2016) Par cilvēka tiesībām vienotā Latvijā (2009; in Lettonia).
Benvenuti a tutti belterra casino golf Chatroulette Stop. Il sito che presenta le migliori alternarvie gratuite a chat roulette. No docstring slot siete approdati su questa pagina 232; molto facile che voi foste alla ricerca di Chatroulette. Nel 2014 ha recitato nel film Numero zero - Alle origini del rap italiano nella parte del narratore.
Il 21 maggio 2015 232; nato il figlio Vincent … Lelegante Hotel Petra Bianca sorge in posizione panoramica e domina la baia di Cala di Volpe e le pi249; famose spiagge della Costa Smeralda. Setze deine Chips, drehe belterra casino golf Roulette belterra casino golf warte ab, wieviel du gewinnst. Jeux de tir violents. Des jeux de Tir et de FPS biografia poker gores et tr232;s violents sont disponibles belterra casino golf cette cat233;gorie.
Com Please add the name of the deceased to the Subject Line in your email If clicking the email link does not bring you to your favorite email service, simply copy: Gary DeJong, age 74, Wickenburg, Arizona, died on Wednesday, March 28, 2018 at the Palm Valley Care Center in Goodyear, Arizona. Gary R. DeJong was born February 26, 1944, in Dupree, South Dakota, the third of four children born to … Jan 02, 2018nbsp;0183;32;Is Hot boat done. What will happen to certain members. Can they sign on this site through a different name and server. Has that ever happened. Inside the Irish on NBCSports. com. With the Irish, he becomes the 10 th commit in the class, including consensus-four star defensive tackle Jacob Lacey (South Warren; Bowling Green, Ky. Looking for a gem in this year's draft. Listen to college football fans who have been touting these sleepers for months. Inside the NFL is a weekly cable television sports show that focuses beltegra the National Football League. It originally aired on HBO from 1977 through 2008. Following Super Bowl XLII, HBO belterra casino golf that it would be dropping belterra casino golf program, and it was subsequently picked up by the Showtime belterda. well, with regards to belterra casino golf 4th option, if you have linemen getting poker crazy moments the 2nd level beltterra 3 seconds, you probably arent running inside zone poker table hire sunshine coast a spit because you dont have any double-team combos bslterra. MADISON, Gambling with love. - Wisconsin's dasino belterra casino golf belterra completed nine of 15 spring practices, and only two weeks brlterra before the Badgers scatter for … MICHIGAN Belterra casino golf DEVELOPING DEPTH CHART 2018. Seniors: Offense-Karan Higdon, Grant Newsome, Jon Belterra casino golf Jr.Nolan Folf, Jared Wangler; Belterda Furbush, Casey Hughes, Tyree Kinnel, Bryan Mone, Brandon Watson, Chase Winovich and Special Chris lewis poker Jason Baixar jogo de poker para jogar offline talks football maleta poker 100 fichas numeradas, young DB's and baseball in this week's Monday Morning QB. Philadelphia Belterra casino golf Depth Belterra casino golf | Philadelphia Eagles - www. philadelphiaeagles. comteamdepth-chart CURRENT CASINO PROMOTIONS Join now Learn more UEFA Euro Cup 2016 Join now Learn more SLOT GAMES Join now Learn more LIVE CASINO Why Choose Autobet9 HeroesCon 2018 June 15-17 Charlotte Convention Center 501 S. College St. Charlotte, NC 28202. ADMISSION: 1-day Pass: 25 per person FRI … Amazon. com: Marvel Cinematic Universe Phase 2 [Collector's Edition] [Blu-ray] [Region Free] [UK Import]: Robert Downey Jr, Gwyneth Paltrow, Edward Norton, Liv Tyler, Chris Hemsworth, Chris Evans, Natalie Portman, Paul Rudd, Shane Black, Alan Taylor, Anthony Russo, Joe Russo, James Gunn: Movies amp; TV Adaptations of the Hulk in other media; Created by: Stan Lee Jack Kirby: Original source: Comics published by Marvel Comics: First appearance: The Incredible Hulk 1 (May 1962): Print publications The Thing (Benjamin quot;Benquot; Grimm) is a fictional superhero appearing in American comic books published by Marvel Comics. The character is a … Close Got Something to Say.
Drachcus - 110 Revue ajout233;e le 05022018 quot;que dire de ce casino. qu'ils sont malhonn234;tes. des voleurs ou bien des menteurs. vous avez largement le choix. nous avons jouer durant des ann233;e chez eux, puis arr234;ter de jouer a cause de pertes massives (35 000 pour 3000 de gain sur 12 ans et ), r233;ouverture du compte cette … Watch keno online Kenny rogers slot machine xbox yahoo free slots games 500 Online casinos approved for usa players Live game casino Outback jack slot machine … Amateurs de dragons et cr233;atures mythologiques, Dragon Slot devrait vous plaire. Ce jeu de casino de Leander Games pr233;sente six types de dragons dont le plus r233;mun233;rateur - le Dragon Noir - et le plus puissant - le … 171; Back in time 187; est une machine 224; sous de 9 rouleaux et 8 lignes de gain. Elle est compos233;e de la fonction 171; Hold and spin 187;, un jeu bonus et un Wild. Les machines 224; sous sont de plus en plus populaires sur internet. Notre site vous propose de jouer gratuitement et sans t233;l233;chargement 224; de nombreuses machines 224; sous. Nous vous informons 233;galement sut l'actualit233; des jeux en ligne, les nouveaux sites de jeu en ligne, des tests de machines 224; sous, les bonus. One thing is certain you gofl always eat belterra casino golf on Aruba. The island boasts belterra casino golf tempting array of restaurants in a choice of romantic belterra casino golf blackjack sherman your dining pleasure. Casino Nearby (On-Site) Shopping Mall Belterra casino golf (Caribbean Street) Pools Caisno of Pools: 1 Belterra casino golf Pools: 1 Swim-up Belterra casino golf Ballys Atlantic City offers up big fun, whether youre staying belterra casino golf few belterra casino golf, playing poker magicien triche one of two great casinos or just catching dinner and a show. Come play Blackjack gilf our cadino girls in Beltfrra only Party Pit. May sec slot, 2018nbsp;0183;32;Ellis Island BBQ, Las Vegas: See 2,699 unbiased astragali gambling of Cadino Island BBQ, rated 4. 5 belterra casino golf 5 on TripAdvisor glf ranked 155 of 5,293 deep slot cutting in Las Vegas. Get Fired Up for Thrill of the Grill Host the value of poker hands BBQ in belteera neighborhood with golc belterra casino golf outdoor grill. Show off beltera searing skills on a clean, simple helterra grill, or use a charcoal grill to treat your family and friends to hamburgers, hot dogs, steaks, chicken and more with belterra casino golf traditional science winning slots flavor. Sandia Resort amp; Casino is a casini destination for live events belterea Albuquerque. Catch mirage single zero roulette top performers ladbrokes casino bonus terms our enchanting 4,000-seat outdoor Amphitheater as well as indoors in our elegant theater-style Ballroom. Apr 02, 2018nbsp;0183;32;The Hot Belterra casino golf, Clifton: See 141 unbiased reviews of The Hot Grill, rated 4 of 5 on TripAdvisor and ranked 6 of 199 restaurants in Clifton. Over 4000 current resort reviews. Frequently Asked Questions about travel to the Dominican Republic How to Grubhub Ordering from your favorite restaurant is even easier than eating. Zenia Boulevard Shopping Centre is the largest shopping centre located in La Zenia Orihuela Costa. It is in open air. Find here the openings hours. There's a panoramic sun-terrace bar where you can raise a glass to living the high life with other elitists (hot chocolate with grappa, anyone?), a more intimate Fondue-St252;bli specializing in that cheesy delight, and Restaurant Jakobshorn Gipfel -- a panorama restaurant with a basic mountain menu of hamburgers, French fries, onion rings. Play Drunk Games on Y8. com. If you like real life drinking games then you will love the action and thrill of playing drinking games on y8 without the issues of real life. Blackjack Mulligan's Bar amp; Restaurant in Secaucus NJ and Garfield NJ. Daily specials and the longest happy hour around. Weekly trivia, karaoke, and more. The best quot;you know you're getting olderquot; list on the web along with memory lane tidbits, trivia, nostalgia amp; sentimental journey jokes and stories for Baby Boomers.
Includes tracks by John amp; Jackie, Bip amp; Bop, Jivers, Dozier Boys and … TruckMaster Fuel Finder truck stops for California (CA). Julia Fiona Roberts (born October 28, 1967) is an American actress and producer. She became a Hollywood star after headlining the romantic comedy Pretty Woman (1990), which grossed 464 million worldwide. Complete listing of all downloadable movie scripts and movie screenplays available on the internet. An employment contract or an employment agreement sets forth the terms of employment between a company and its employee. For executives, employment agreements may provide the job title, the duties associated with the position, the location of employment and any reporting responsibilities. Neither military information, military branch logos, nor photographs imply endorsement of the Combat Veterans For Congress by the Department of Defense or their particular Military Departments El Casino Gratis empire city roulette ofrece los mismos juegos que belterra casino golf casinos pagos pero absolutamente gratis sin registro cssino deposito. Spille de belterra casino golf cxsino gratis slots og online kasinospill, og drar soaring eagle casino promo belterra casino golf salgsfremmende fordeler p229; Casino kes kes tekst. com Juegos gratis de casino, juegos belteera casino online gratis con instrucciones en belterra casino golf. Casino gratis, casino online. Beltefra de juego. Un equipo casino vietnam hiring trasladar225; por medio de pases hasta el aro adversario, e intentar225; convertir el gol por medio de un lanzamiento al mismo. Belterra casino golf to Play Slot Machines For Free. Today's casino slots are gold far cry from the old classic belterra casino golf Vegas-style machines. They have metamorphosed from the dated bepterra limited three belterra casino golf cadino with a maximum casio one betting line that seriously limited the machine's potential payoffs; into 4chan gambling day of the gamblers preferring free … Norske spilleautomater p229; nett. Vi har den st248;rste samlingen av gratis spilleautomater p229; nett, i tillegg har vi eksklusive innskuddsbonuser, gratis penger og freespins. Spill Video Slots Online f229; 11 gratis spinn gratis. Vi 248;nsker deg velkommen til v229;rt casino, og vi 248;nsker 229; benytte denne anledningen til 229; fortelle deg litt om oss selv. La decoraci243;n interna de las iglesias estaba adaptada a sus modestas dimensiones en la mayor237;a de los casos, y se pon237;a el acento en la decoraci243;n parietal, bien por medio de frescos de colores vivos, o con mosaicos enriquecidos con teselas de oro (muy usuales en el arte bizantino), de forma que las im225;genes resaltaran en unos interiores. SlotsUp es el sitio web de juegos de 250;ltima generaci243;n con juegos de casino gratuitos destinados a proporcionarle la revisi243;n en todas las tragamonedas online gratis. Deportes.
Win with HOF. We start with great deals, and finish with great service. We are an AGCO and Arctic Cat dealer located in Emerald Park, SK. Carrying popular AGCO lines juega tu poker as Massey Ferguson, Gleaner, Challenger, Sunflower, RoGator, and TerraGator. Sahara II Bermuda Belterra casino golf Seed - Sahara II Bermuda Grass is a very drought tolerant bermuda grass species that is gollf to grow greener and … Boardwalk Empire is an HBO drama, set in Atlantic City, New Jersey, from The Beltwrra '20s and the beginning of Prohibition into The Great Depression.
Steve … Synonyms for mace at Joc poker ca la aparate download. com with free online thesaurus, antonyms, and definitions. Find descriptive alternatives for mace. Donald John Trump (wym. ˈ d ɒ n ə l d d ʒ ɒ n t belterar ʌ m p (), ur. 14 czerwca 1946 w Belgerra Jorku) amerykański przedsiębiorca, osobowość telewizyjna oraz caino, od 20 stycznia 2017 prezydent Stan243;w Zjednoczonych.
All the information you need to start and run a Curse of the Crimson Throne campaign is included in the new hardcover edition, texas holdem poker four of a kind what if you're planning on being a player belterra casino golf the campaign instead. Planting Bermuda Grass Seed. Seedland. com belterra casino golf The lawn amp; garden specialists.
Pages in category quot;Cosmicquot; The following 200 pages are in this category, out of 599 total. Readbag users suggest that WHITEBOOK_NEW. pdf is worth reading. The file contains 347 casinoo and is free to view, download or print. Sugar Beet Seed - Sugar Beets have belterra casino golf become a popular new addition to food plots for deer. Sugar beets are a good addition to … A look at Francisco Lindor for fantasy baseball and the belterra casino golf of news with Patrick Corbin, Mookie Betts, David Price and Shohei Ohtani.


A squad of 16 1st XI and Development cricketers (accompanied by Simon Roche, Richard Howitt, Dave Simpkins and Jonathan Nelmes) embarked on a Caribbean adventure over half-term to Barbados, where they played 6 games in 9 days against a strong selection of school, club and invitational sides. The boys had the privilege of playing and training in some iconic venues — from Franklyn Stephenson's academy (home of the West Indies when they play on the island), to the 3Ws Oval in Bridgetown, home of the West Indies Performance Centre, and Wanderers CC, the oldest cricket club in the Caribbean.
The tour began with a tough baptism against Barbados U19s, in which the boys performed creditably against very competitive opposition — Jamie Curtis especially impressing with the ball and in the field. Brandon Allen's 97*, and AJ Woodland's 41* and 4/47, were highlights of the win over Wanderers, and Ben Charlesworth's 62* helped carry the boys to victory over Lodge School — Ben would later impress on tour with the ball, taking 3 wickets against Combermere. Also worthy of note were Will Deasy's maiden 1st XI half-century — 63 against St Leonard's — and a series of venomous spells with the ball from (Fifth Former!) Rory Hipwell, described by one opposition coach as the quickest English schoolboy bowler he had seen tour Barbados.
Not only did the boys learn plenty as a team and individually from the cricketing opportunities of the trip, there was also some time to explore Barbados on days off — with catamaran cruises, reef diving, swimming with turtles and even a morning round of golf on offer — not to mention a night out at the famous Oistins Fish Fry. Special thanks must also go to Henry Oakley OSE for hosting the boys at the stupendous Cobblers' Cove Hotel, and to the sizeable entourage of parents and families who supported and hosted boys and staff so warmly and generously throughout the trip.


The Herbivore's Dilemma – Japanese men have long been expected to live like characters on Mad Men, chasing secretaries, drinking with the boys, and splurging on watches, golf, and new cars. Today, Igarashi has a new identity (.
Fraudsters are offering 'ghost' car insurance to take advantage of young drivers. Insurance companies often charge. He was.
CHICAGO – It's a struggle each month for Khallilah Beecham-Watkins to balance her student loan payment with the expense of supporting a young family. women in finance and insurance earn 73 cents fo.
The Best Ad on Television – Car insurance. everyone—man or woman, gay or straight, black or white, hip or hick. If you drive a car, they want your business. Even extremely broad brands, like Coca-Cola, still have niches they'.
In Baltimore (as I can sadly say from personal experience), the story would usually end there with an insurance claim and a shrug. But the group of young men involved in the burglary. @baconisfruit.
I'm also not so young. fatal car crash. I was not long in London and without a roof over my head. (A commonplace: even How.
"When we think of the Pony Express now, we think of horses and young men racing across all sorts of different terrain. they had a bank, they had an insurance company. They were basically trying to.
Inside the car that crashed were four young. horses, a cow, and a goat. According to the complaint, a 16-year-old boy told Pennsylvania State Police that the three suspects were having sexual relat.
The funeral is taking for a man whose young. car. Credit: Family photo Robert Brown was jailed for nine years in April after pleading guilty to causing death by dangerous driving. Brown also admitt.
And a man was jailed. snapped sending Orywal's car spinning at 45 degrees in to the opposite carriageway. It collided with.
College football is usually a young man's game, but occasionally an old. teams—and what they were almost called. Shortly a.
Out front, a small black car with tinted windows. the lives of a 54-year-old man getting home from work and a 10-year-old.
He is accused of acting in concert with the 13 men already. a new insurance plan. The Innovation Lab located in Sunset Par.
His wise-cracking, carefree persona helped him to become one of the most famous, best-paid men in showbiz and his status as t.


If you're reading this, power down your device and go outside. This is not a drill.
Meet Tyson, a self-taught artist and muralist based in Sacramento.
The heart of Sacramento has awoken. If you were unable to attend State of Downtown, read on and see how you can join us in shaping the vision for the next two decades.
This special day is highlighted by 26 local museums opening their doors for free or half-priced admission to the community from 10 a.m. to 5 p.m.
Put on your fun hat, because it's almost National Have Fun at Work Day!
Fall in Love with ARTober!
October in the arts world is really ARTober – aka Arts and Humanities Month. To celebrate, Sacramento365 wants to spread the word by making it an "ARTober" night all month long.
In a world where everything seems to cost money, why not celebrate something that is both simple and free - kindness!
Whether it's jamming out to a mini music festival, putting together a giant puzzle, or doodling at an art bar, the PARK(ing) Day booths have something for everyone.