text:
The 2017 Solar Eclipse May Prove the Sun Is Bigger Than We Think
By Sarah Lewin 27 July 2017
Eclipse models suggest that the sun's photosphere is slightly larger than the value commonly used. Eclipse measurements could help determine for sure. Here, an annular eclipse is visible.
(Image: © NASA)
A growing number of researchers think that the sun is actually larger than commonly thought.
Scientists don't know the sun's size as precisely as the details of the Earth and moon, making it a sticking point for perplexed eclipse modelers.
Xavier Jubier creates detailed models of solar and lunar eclipses that work with Google Maps to show precisely where the shadow of the sun will fall on the Earth, and what the eclipse will look like at each point. He came to realize there was something off about the sun's measurements as he matched his eclipse simulations with actual photos. The photos helped him identify exactly where an observer had been for historical eclipses — but those precise eclipse shapes only made sense if he scaled up the sun's radius by a few hundred kilometers. [Total Solar Eclipse 2017: When, Where and How to See It (Safely)]
"For me, something was wrong somewhere, but that's all I could say," Jubier told Space.com.
Scientists' knowledge of the Earth's and moon's contours weren't exact enough to highlight this discrepancy until about 10 years ago — the same time that modern eclipse simulations became possible through computer power and precision mapping. So it was around then that Jubier began to realize something was amiss.
Xavier Jubier simulated an annular eclipse that occurred March 29, 1987, matching his results to photos taken at the time of the eclipse. His results are able to precisely match when he combines incredibly precise data about the moon's contours and Earth's topography with a slightly larger solar radius. (Image credit: Xavier Jubier/Hugette Guertin)
NASA researcher Ernie Wright came to a similar conclusion as he began to create increasingly precise models of solar eclipses, starting about two years ago. He, too, had to scale up the sun slightly from the traditional size for his calculations to match reality.
"How can you not know this?" Wright recalls thinking. "You just hold a ruler up to the sky, and you say it's this big."
But as it turns out, it's not that simple, Wright told Space.com.
Historically, researchers have used the value 696,000 km as the radius of the sun's photosphere — the body of the sun whose wavelengths are visible to the naked eye on Earth. The value was first published in 1891 by the German astronomer Arthur Auwers, Wright said, and it was taken as a standard value for quite some time. In 2015, the International Astronomical Union defined a "unit" based on the sun's radius as a similar 695,700 km, based on a 2008 study, so researchers can use that value to compare the sizes of other stars in the universe.
But efforts to measure the sun's radius have never been accurate enough to match our knowledge of the moon's and the Earth's contours, the researchers said. Scientists have tried measuring it through transits of Mercury and Venus — when those planets cross the face of the sun — and through images taken from sun-observing satellites like the Solar Dynamics Observatory. Each pixel on SDO's higher resolution images covers about 270 miles (435 km), Wright said, which means there's a limit to how precisely the size of the photosphere can be measured with this method. In addition, orbiting solar telescopes like SDO generally collect wavelengths of light emitted deeper inside or further outside the sun, rather than its visible photosphere.
"It's harder than you think just to put a ruler on these images and figure out how big the sun is — [SDO] doesn't have enough precision to nail this down," Wright said. "Similarly, with the Mercury and Venus transits, it turns out [a measurement based on those is] not quite as precise as you'd like it to be."
Different papers trying to pin down the sun's radius, using planet transits, space-based sensors as well as ground observations, have produced results that differ by as many as 930 miles (1,500 km), and can't seem to be reconciled with one another, Wright said. And for eclipse modelers, it's a critical and irritating problem.
Eclipse viewers might find the uncertainty of interest, as well, as they plot out where they'll be in the path of totality. A slightly larger sun means the period of total blackout can be a few seconds shorter in the center of the path, and the path itself would warp, as well.
"For most people, yes, it doesn't really matter; it won't change everything," Jubier said. "But the closer you get to the edge of the [eclipse] path, the more risk you take." If the sun is indeed bigger, the path is narrower than projections made with the usual value would suggest. So those chasing the effects on the eclipse's edge could be in trouble if they're not using a large enough value for their calculations.
Few people do eclipse predictions, Jubier added, and the precise value isn't necessary to a lot of researchers. Because of that, definitions can vary and it's hard to compare different values to one another, including the original 1891 value. It can be hard to tell for a given study what assumptions went into their answer for the sun's diameter, and so they can't be adapted easily to match each other or the eclipse. Any discrepancies in eclipse measurements can be attributed to not fully understanding the values, Jubier added.
"It is definitely still an area of ongoing research, and something that the field itself is interested in getting a better handle on," C. Alex Young, a solar astrophysicist at NASA's Goddard Space Flight Center in Maryland, told Space.com. "Probably a little esoteric for many people, and I would say that the calculation is not as important for a lot of areas, for example in solar physics, in terms of the accuracy needed. But especially the eclipse community is very interested in the accuracy."
Michael Kentrianakis, an avid eclipse chaser and a member of the American Astronomical Society's Solar Eclipse Task Force, learned about the confusion over the sun's size from his colleague Luca Quaglia, a physicist and eclipse researcher.
"The straw that broke the camel's back," Kentrianakis said, came during an expedition to Argentina in February, where he positioned himself outside what should have been the edge of an annular eclipse — where the moon is circled by a bright "ring of fire." A larger sun would make the "ring of fire" effect visible to a wider area.
"Technically, I should have been outside of annularity, [but the unfiltered photographs show] we were still in the path of annularity, and we have this beautiful chromosphere circling around at the edge," Kentrianakis said. That experience fully convinced him the sun was larger than generally thought.
This upcoming eclipse — which will very likely be the most-watched total solar eclipse in history, NASA officials have said — will provide a chance for others inside and outside the path of totality to help verify its size.
While researchers would ordinarily use the radius of the sun to compute exactly when the moon will cover and uncover the sun for a given location, called contact times, the opposite strategy is required here, Quaglia told Space.com. "If we can measure contact times accurately, everything else being the same, the only thing that can change is the solar radius. We can actually compute the solar radius that way," he said.
Kentrianakis, Jubier, Quaglia and others want to pin it down by positioning researchers inside and outside where totality should be, armed with the equipment for what's called a "flash spectrum" photograph. The process uses a textured grating over a camera, which splits incoming light into component wavelengths — making it easy to determine precisely when the entire photosphere has been covered by the moon, revealing a more limited set of wavelengths emitted by the chromosphere. Combined with accurate timestamps, that process would provide strong evidence for the sun's size. (Such a process has been used before, but on a limited scale, Quaglia said.)
This flash spectrum was taken in Gabon during an eclipse Nov. 3, 2013. On the left, a photo of the eclipse is visible, and the right shows the varying spectra released by the eclipse at that moment— the sun's photosphere creates the smooth spectrum of color, and the chromosphere above it releases the distinct arcs of color. This setup can let researchers pinpoint the instant the photosphere is covered, and thus determine its size. (Image credit: Constantine Emmanouilidi, used with permission)
Such measurements would also provide another benefit, Jubier said — investigating what some think is a thin layer in between the photosphere and chromosphere called the mesosphere. That thin layer can be visible for a moment after the photosphere is blotted out during an eclipse, which means observers may make measurements that confuse the mesosphere for more of the photosphere. A flash spectrum can help distinguish between the two, although it must be a high enough resolution so the signals from each can be clearly separated.
A group involving Quaglia, Kentrianakis and Jubier was unable to get funding for as broad a flash-spectrum experiment as they would have liked — something like 30 separate measurement stations arrayed just inside and just outside the predicted eclipse path. But researchers could still use crowdsourced data and measurements during the eclipse to learn more.
"The more observations we have the better even if they are not providing the kind of quality we expected to get from the cinematographic spectroscopy," Jubier said. "Time will tell what we can make of all this."
Jubier said that flash spectrum measurements would be most useful, but so would (safely!) unfiltered views of the eclipse. Most filters cut out details of the images, making it much more difficult to determine precisely when the sun fully covers the moon.
Other groups will also be using the eclipse to try and measure the sun's diameter, Quaglia said, including the International Occulting Timing Association, which will analyze smartphone videos taken at intervals perpendicular to the eclipse path in Nebraska.
"The more people, the more techniques, the more teams involved will get us there as a whole," Quaglia said. "If, then, the International Astronomical Union makes the decision to change the value, they will probably not change the value lightly."
Understanding the visible sun's exact size will be possible only by combining careful solar measurements with the simulations and precise understanding of the moon's and Earth's elevations that exist now, Jubier said. But the pieces are in place to make that determination, if enough people get on board to measure the most common sight in the sky during those uncommon moments of eclipse.
"It's big, and it will take many eclipses — it may take until 2024 — but at least we're starting it now," Kentrianakis said.
Editor's note: Space.com has teamed up with Simulation Curriculum to offer this awesome Eclipse Safari app to help you enjoy your eclipse experience. The free app is available for Apple and Android, and you can view it on the web. We also updated this article to clarify the resolution of Solar Dynamics Observatory images.
Email Sarah Lewin at slewin@space.com or follow her @SarahExplains. Follow us @Spacedotcom, Facebook and Google+. Original article on Space.com.


text:
// SKTGraphicView.m
// Sketch Example
//

#import "SKTGraphicView.h"
#import "SKTDrawDocument.h"
#import "SKTGraphic.h"
#import "SKTFoundationExtras.h"
#import "SKTToolPaletteController.h"
#import "SKTImage.h"
#import "SKTGridPanelController.h"
#import "DrawingController.h"
#import <math.h>

NSString *SKTGraphicViewSelectionDidChangeNotification = @"SKTGraphicViewSelectionDidChange";

@implementation SKTGraphicView

static float SKTDefaultPasteCascadeDelta = 10.0;

- (id)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
		// HACK: Avoid a commit on every mouse event when the user is dragging the mouse across the color wheel
		[[NSColorPanel sharedColorPanel] setContinuous: NO];

        NSMutableArray *dragTypes = [NSMutableArray arrayWithObjects:NSColorPboardType, NSFilenamesPboardType, nil];
        [dragTypes addObjectsFromArray:[NSImage imagePasteboardTypes]];
        [self registerForDraggedTypes:dragTypes];
        _selectedGraphics = [[NSMutableArray alloc] init];
        _creatingGraphic = nil;
        _rubberbandRect = NSZeroRect;
        _rubberbandGraphics = nil;
        _gvFlags.rubberbandIsDeselecting = NO;
        _gvFlags.initedRulers = NO;
        _editingGraphic = nil;
        _editorView = nil;
        _pasteboardChangeCount = -1;
        _pasteCascadeNumber = 0;
        _pasteCascadeDelta = NSMakePoint(SKTDefaultPasteCascadeDelta, SKTDefaultPasteCascadeDelta);
        _gvFlags.snapsToGrid = NO;
        _gvFlags.showsGrid = NO;
        _gvFlags.knobsHidden = NO;
        _gridSpacing = 8.0;
        _gridColor = [NSColor lightGrayColor];
        _unhideKnobsTimer = nil;
    }
    return self;
}

- (void)dealloc {
	[[NSNotificationCenter defaultCenter] removeObserver: self];
    [self endEditing];
}

- (DrawingController*)drawingController
{
	return _drawingController;
}
- (void)setDrawingController: (DrawingController*)c
{
	_drawingController = c;

	[self objectGraphContextDidSwitch];
}

- (void) objectGraphContextDidSwitch
{
	[[NSNotificationCenter defaultCenter] removeObserver: self];

	[[NSNotificationCenter defaultCenter] addObserver: self
											 selector: @selector(objectGraphContextDidRelinquishObjects:)
												 name: COObjectGraphContextWillRelinquishObjectsNotification
											   object: _drawingController.objectGraphContext];

	[self clearCachedObjects];
}

- (void) objectGraphContextDidRelinquishObjects: (NSNotification *)notif
{
	[self clearCachedObjects];
}

- (void) clearCachedObjects
{
	_editingGraphic = nil;
	_creatingGraphic = nil;
	[_selectedGraphics removeAllObjects];
}

- (SKTDrawDocument *)drawDocument {
    return [[self drawingController] drawDocument];
}

- (NSArray *)graphics {
    return [[self drawDocument] graphics];
}

// Display invalidation
- (void)invalidateGraphic:(SKTGraphic *)graphic {
    [self setNeedsDisplayInRect:[graphic drawingBounds]];
    if (![[self graphics] containsObject:graphic]) {
        [self deselectGraphic:graphic];  // deselectGraphic will call invalidateGraphic, too, but only if the graphic is in the selection and since the graphic is removed from the selection before this method is called again the potential infinite loop should not happen.
    }
}

- (void)invalidateGraphics:(NSArray *)graphics {
    unsigned i, c = [graphics count];
    for (i=0; i<c; i++) {
        [self invalidateGraphic:[graphics objectAtIndex:i]];
    }
}

// Selection primitives
- (NSArray *)selectedGraphics {
    return _selectedGraphics;
}

static NSInteger SKT_orderGraphicsFrontToBack(id graphic1, id graphic2, void *gArray) {
    NSArray *graphics = (__bridge NSArray *)gArray;
    unsigned index1, index2;

    index1 = [graphics indexOfObjectIdenticalTo:graphic1];
    index2 = [graphics indexOfObjectIdenticalTo:graphic2];
    if (index1 == index2) {
        return NSOrderedSame;
    } else if (index1 < index2) {
        return NSOrderedAscending;
    } else {
        return NSOrderedDescending;
    }
}

- (NSArray *)orderedSelectedGraphics  {
    return [[self selectedGraphics] sortedArrayUsingFunction:SKT_orderGraphicsFrontToBack context:(__bridge void *)([self graphics])];
}

- (BOOL)graphicIsSelected:(SKTGraphic *)graphic {
    return (([_selectedGraphics indexOfObjectIdenticalTo:graphic] == NSNotFound) ? NO : YES);
}

- (void)selectGraphic:(SKTGraphic *)graphic {
    NSInteger curIndex = [_selectedGraphics indexOfObjectIdenticalTo:graphic];
    if (curIndex == NSNotFound) {
        //[[[self undoManager] prepareWithInvocationTarget:self] deselectGraphic:graphic];
        //[[[self drawDocument] undoManager] setActionName:NSLocalizedStringFromTable(@"Selection Change", @"UndoStrings", @"Action name for selection changes.")];
        [_selectedGraphics addObject:graphic];
        [self invalidateGraphic:graphic];
        _pasteCascadeDelta = NSMakePoint(SKTDefaultPasteCascadeDelta, SKTDefaultPasteCascadeDelta);
        [[NSNotificationCenter defaultCenter] postNotificationName:SKTGraphicViewSelectionDidChangeNotification object:self];
        [self updateRulers];
    }
}

- (void)deselectGraphic:(SKTGraphic *)graphic {
    NSInteger curIndex = [_selectedGraphics indexOfObjectIdenticalTo:graphic];
    if (curIndex != NSNotFound) {
        //[[[self undoManager] prepareWithInvocationTarget:self] selectGraphic:graphic];
        //[[[self drawDocument] undoManager] setActionName:NSLocalizedStringFromTable(@"Selection Change", @"UndoStrings", @"Action name for selection changes.")];
        [_selectedGraphics removeObjectAtIndex:curIndex];
        [self invalidateGraphic:graphic];
        _pasteCascadeDelta = NSMakePoint(SKTDefaultPasteCascadeDelta, SKTDefaultPasteCascadeDelta);
        [[NSNotificationCenter defaultCenter] postNotificationName:SKTGraphicViewSelectionDidChangeNotification object:self];
        [self updateRulers];
    }
}

- (void)clearSelection {
    int i, c = [_selectedGraphics count];
    id curGraphic;

    if (c > 0) {
        for (i=0; i<c; i++) {
            curGraphic = [_selectedGraphics objectAtIndex:i];
            //[[[self undoManager] prepareWithInvocationTarget:self] selectGraphic:curGraphic];
            [self invalidateGraphic:curGraphic];
        }
        //[[[self drawDocument] undoManager] setActionName:NSLocalizedStringFromTable(@"Selection Change", @"UndoStrings", @"Action name for selection changes.")];
        [_selectedGraphics removeAllObjects];
        _pasteCascadeDelta = NSMakePoint(SKTDefaultPasteCascadeDelta, SKTDefaultPasteCascadeDelta);
        [[NSNotificationCenter defaultCenter] postNotificationName:SKTGraphicViewSelectionDidChangeNotification object:self];
        [self updateRulers];
    }
}

// Editing
- (void)setEditingGraphic:(SKTGraphic *)graphic editorView:(NSView *)editorView {
    // Called by a SKTGraphic that is told to start editing.  SKTGraphicView doesn't do anything with editorView, just remembers it.
    _editingGraphic = graphic;
    _editorView = editorView;
}

- (SKTGraphic *)editingGraphic {
    return _editingGraphic;
}

- (NSView *)editorView {
    return _editorView;
}

- (void)startEditingGraphic:(SKTGraphic *)graphic withEvent:(NSEvent *)event {
    [graphic startEditingWithEvent:event inView:self];
}

- (void)endEditing {
    if (_editingGraphic) {
        [_editingGraphic endEditingInView:self];
        _editingGraphic = nil;
        _editorView = nil;
    }
}

// Geometry calculations
- (SKTGraphic *)graphicUnderPoint:(NSPoint)point {
    SKTDrawDocument *document = [self drawDocument];
    NSArray *graphics = [document graphics];
    unsigned i, c = [graphics count];
    SKTGraphic *curGraphic = nil;

    for (i=0; i<c; i++) {
        curGraphic = [graphics objectAtIndex:i];
        if ([self mouse:point inRect:[curGraphic drawingBounds]] && [curGraphic hitTest:point isSelected:[self graphicIsSelected:curGraphic]]) {
            break;
        }
    }
    if (i < c) {
        return curGraphic;
    } else {
        return nil;
    }
}

- (NSSet *)graphicsIntersectingRect:(NSRect)rect {
    NSArray *graphics = [self graphics];
    unsigned i, c = [graphics count];
    NSMutableSet *result = [NSMutableSet set];
    SKTGraphic *curGraphic;

    for (i=0; i<c; i++) {
        curGraphic = [graphics objectAtIndex:i];
        if (NSIntersectsRect(rect, [curGraphic drawingBounds])) {
            [result addObject:curGraphic];
        }
    }
    return result;
}

// Drawing and mouse tracking
- (BOOL)isFlipped {
    return YES;
}

- (BOOL)isOpaque {
    return YES;
}

- (BOOL)acceptsFirstResponder {
    return YES;
}

- (BOOL)becomeFirstResponder {
    [self updateRulers];
    return YES;
}

- (void)drawRect:(NSRect)rect {
    NSArray *graphics;
    unsigned i;
    SKTGraphic *curGraphic;
    BOOL isSelected;
    NSRect drawingBounds;
    NSGraphicsContext *currentContext = [NSGraphicsContext currentContext];

    [[NSColor whiteColor] set];
    NSRectFill(rect);
    if ([self showsGrid]) {
        SKTDrawGridWithSettingsInRect([self gridSpacing], [self gridColor], rect, NSZeroPoint);
    }

    graphics = [[self drawDocument] graphics];
    i = [graphics count];
    while (i-- > 0) {
        curGraphic = [graphics objectAtIndex:i];
        drawingBounds = [curGraphic drawingBounds];
        if (NSIntersectsRect(rect, drawingBounds)) {
            if (!_gvFlags.knobsHidden && (curGraphic != _editingGraphic)) {
                // Figure out if we should draw selected.
                isSelected = [self graphicIsSelected:curGraphic];
                // Account for any current rubberband selection state
                if (_rubberbandGraphics && (isSelected == _gvFlags.rubberbandIsDeselecting) && [_rubberbandGraphics containsObject:curGraphic]) {
                    isSelected = (isSelected ? NO : YES);
                }
            } else {
                // Do not draw handles on graphics that are editing.
                isSelected = NO;
            }
            [currentContext saveGraphicsState];
            [NSBezierPath clipRect:drawingBounds];
            [curGraphic drawInView:self isSelected:isSelected];
            [currentContext restoreGraphicsState];
        }
    }

    if (_creatingGraphic) {
        drawingBounds = [_creatingGraphic drawingBounds];
        if (NSIntersectsRect(rect, drawingBounds)) {
            [currentContext saveGraphicsState];
            [NSBezierPath clipRect:drawingBounds];
            [_creatingGraphic drawInView:self isSelected:NO];
            [currentContext restoreGraphicsState];
        }
    }
    if (!NSEqualRects(_rubberbandRect, NSZeroRect)) {
        [[NSColor knobColor] set];
        NSFrameRect(_rubberbandRect);
    }
}

- (void)beginEchoingMoveToRulers:(NSRect)echoRect {
    NSRulerView *horizontalRuler = [[self enclosingScrollView] horizontalRulerView];
    NSRulerView *verticalRuler = [[self enclosingScrollView] verticalRulerView];

    _horizontalRulerLineRect = [self convertRect:echoRect toView:horizontalRuler];
    _verticalRulerLineRect = [self convertRect:echoRect toView:verticalRuler];

    [horizontalRuler moveRulerlineFromLocation:-1.0 toLocation:NSMinX(_horizontalRulerLineRect)];
    [horizontalRuler moveRulerlineFromLocation:-1.0 toLocation:NSMidX(_horizontalRulerLineRect)];
    [horizontalRuler moveRulerlineFromLocation:-1.0 toLocation:NSMaxX(_horizontalRulerLineRect)];

    [verticalRuler moveRulerlineFromLocation:-1.0 toLocation:NSMinY(_verticalRulerLineRect)];
    [verticalRuler moveRulerlineFromLocation:-1.0 toLocation:NSMidY(_verticalRulerLineRect)];
    [verticalRuler moveRulerlineFromLocation:-1.0 toLocation:NSMaxY(_verticalRulerLineRect)];
}

- (void)continueEchoingMoveToRulers:(NSRect)echoRect {
    NSRulerView *horizontalRuler = [[self enclosingScrollView] horizontalRulerView];
    NSRulerView *verticalRuler = [[self enclosingScrollView] verticalRulerView];
    NSRect newHorizontalRect = [self convertRect:echoRect toView:horizontalRuler];
    NSRect newVerticalRect = [self convertRect:echoRect toView:verticalRuler];

    [horizontalRuler moveRulerlineFromLocation:NSMinX(_horizontalRulerLineRect) toLocation:NSMinX(newHorizontalRect)];
    [horizontalRuler moveRulerlineFromLocation:NSMidX(_horizontalRulerLineRect) toLocation:NSMidX(newHorizontalRect)];
    [horizontalRuler moveRulerlineFromLocation:NSMaxX(_horizontalRulerLineRect) toLocation:NSMaxX(newHorizontalRect)];

    [verticalRuler moveRulerlineFromLocation:NSMinY(_verticalRulerLineRect) toLocation:NSMinY(newVerticalRect)];
    [verticalRuler moveRulerlineFromLocation:NSMidY(_verticalRulerLineRect) toLocation:NSMidY(newVerticalRect)];
    [verticalRuler moveRulerlineFromLocation:NSMaxY(_verticalRulerLineRect) toLocation:NSMaxY(newVerticalRect)];

    _horizontalRulerLineRect = newHorizontalRect;
    _verticalRulerLineRect = newVerticalRect;
}

- (void)stopEchoingMoveToRulers {
    NSRulerView *horizontalRuler = [[self enclosingScrollView] horizontalRulerView];
    NSRulerView *verticalRuler = [[self enclosingScrollView] verticalRulerView];

    [horizontalRuler moveRulerlineFromLocation:NSMinX(_horizontalRulerLineRect) toLocation:-1.0];
    [horizontalRuler moveRulerlineFromLocation:NSMidX(_horizontalRulerLineRect) toLocation:-1.0];
    [horizontalRuler moveRulerlineFromLocation:NSMaxX(_horizontalRulerLineRect) toLocation:-1.0];

    [verticalRuler moveRulerlineFromLocation:NSMinY(_verticalRulerLineRect) toLocation:-1.0];
    [verticalRuler moveRulerlineFromLocation:NSMidY(_verticalRulerLineRect) toLocation:-1.0];
    [verticalRuler moveRulerlineFromLocation:NSMaxY(_verticalRulerLineRect) toLocation:-1.0];

    _horizontalRulerLineRect = NSZeroRect;
    _verticalRulerLineRect = NSZeroRect;
}

- (NSArray *)descriptionArgsForGraphic: (SKTGraphic *)graphic
{
	NSString *localized = NSLocalizedString(NSStringFromClass([graphic class]), @"");

	if (localized == nil)
		localized = @"Shape";

	return @[localized];
}

- (NSArray *)descriptionArgsForGraphics: (NSArray *)graphics
{
	if ([graphics count] == 0)
	{
		return @[@"No Shapes"];
	}
	else if ([graphics count] == 1)
	{
		return [self descriptionArgsForGraphic: graphics[0]];
	}
	else
	{
		return @[@"Multiple Shapes"];
	}
}

- (void)createGraphicOfClass:(Class)theClass withEvent:(NSEvent *)theEvent {
    SKTDrawDocument *document = [self drawDocument];
    _creatingGraphic = [[theClass alloc] initWithObjectGraphContext: [document objectGraphContext]];
    if ([_creatingGraphic createWithEvent:theEvent inView:self]) {
        [document insertGraphic:_creatingGraphic atIndex:0];
        [self selectGraphic:_creatingGraphic];
        if ([_creatingGraphic isEditable]) {
            [self startEditingGraphic:_creatingGraphic withEvent:nil ];
        }
        [_drawingController commitWithIdentifier: @"draw-shape"
							descriptionArguments: [self descriptionArgsForGraphic: _creatingGraphic]];
    }
	else
	{
		_creatingGraphic = nil;

		// This is necessary so the _creatingGraphic created above doesn't get persisted in the next commit
		[_drawingController.objectGraphContext discardAllChanges];
	}
}

- (SKTGraphic *)creatingGraphic {
    return _creatingGraphic;
}

- (void)trackKnob:(int)knob ofGraphic:(SKTGraphic *)graphic withEvent:(NSEvent *)theEvent {
    NSPoint point;
    BOOL snapsToGrid = [self snapsToGrid];
    float spacing = [self gridSpacing];
    BOOL echoToRulers = [[self enclosingScrollView] rulersVisible];

    [graphic startBoundsManipulation];
    if (echoToRulers) {
        [self beginEchoingMoveToRulers:[graphic bounds]];
    }
    while (1) {
        theEvent = [[self window] nextEventMatchingMask:(NSLeftMouseDraggedMask | NSLeftMouseUpMask)];
        point = [self convertPoint:[theEvent locationInWindow] fromView:nil];
        [self invalidateGraphic:graphic];
        if (snapsToGrid) {
            point.x = floor((point.x / spacing) + 0.5) * spacing;
            point.y = floor((point.y / spacing) + 0.5) * spacing;
        }
        knob = [graphic resizeByMovingKnob:knob toPoint:point];
        [self invalidateGraphic:graphic];
        if (echoToRulers) {
            [self continueEchoingMoveToRulers:[graphic bounds]];
        }
        if ([theEvent type] == NSLeftMouseUp) {
            break;
        }
    }
    if (echoToRulers) {
        [self stopEchoingMoveToRulers];
    }

    [graphic stopBoundsManipulation];

    [_drawingController commitWithIdentifier: @"resize-shape"
						descriptionArguments: [self descriptionArgsForGraphic: graphic]];
}

- (void)rubberbandSelectWithEvent:(NSEvent *)theEvent {
    NSPoint origPoint, curPoint;
    NSEnumerator *objEnum;
    SKTGraphic *curGraphic;

    _gvFlags.rubberbandIsDeselecting = (([theEvent modifierFlags] & NSAlternateKeyMask) ? YES : NO);
    origPoint = curPoint = [self convertPoint:[theEvent locationInWindow] fromView:nil];

    while (1) {
        theEvent = [[self window] nextEventMatchingMask:(NSLeftMouseDraggedMask | NSLeftMouseUpMask)];
        curPoint = [self convertPoint:[theEvent locationInWindow] fromView:nil];
        if (NSEqualPoints(origPoint, curPoint)) {
            if (!NSEqualRects(_rubberbandRect, NSZeroRect)) {
                [self setNeedsDisplayInRect:_rubberbandRect];
                [self performSelector:@selector(invalidateGraphic:) withEachObjectInSet:_rubberbandGraphics];
            }
            _rubberbandRect = NSZeroRect;
            _rubberbandGraphics = nil;
        } else {
            NSRect newRubberbandRect = SKTRectFromPoints(origPoint, curPoint);
            if (!NSEqualRects(_rubberbandRect, newRubberbandRect)) {
                [self setNeedsDisplayInRect:_rubberbandRect];
                [self performSelector:@selector(invalidateGraphic:) withEachObjectInSet:_rubberbandGraphics];
                _rubberbandRect = newRubberbandRect;

                _rubberbandGraphics = [self graphicsIntersectingRect:_rubberbandRect];
                [self setNeedsDisplayInRect:_rubberbandRect];
                [self performSelector:@selector(invalidateGraphic:) withEachObjectInSet:_rubberbandGraphics];
            }
        }
        if ([theEvent type] == NSLeftMouseUp) {
            break;
        }
    }

    // Now select or deselect the rubberbanded graphics.
    objEnum = [_rubberbandGraphics objectEnumerator];
    while ((curGraphic = [objEnum nextObject]) != nil) {
        if (_gvFlags.rubberbandIsDeselecting) {
            [self deselectGraphic:curGraphic];
        } else {
            [self selectGraphic:curGraphic];
        }
    }
    if (!NSEqualRects(_rubberbandRect, NSZeroRect)) {
        [self setNeedsDisplayInRect:_rubberbandRect];
    }

    _rubberbandRect = NSZeroRect;
    _rubberbandGraphics = nil;
}

- (void)moveSelectedGraphicsWithEvent:(NSEvent *)theEvent {
    NSPoint lastPoint, curPoint;
    NSArray *selGraphics = [self selectedGraphics];
    unsigned i, c;
    SKTGraphic *graphic;
    BOOL didMove = NO, isMoving = NO;
    NSPoint selOriginOffset = NSZeroPoint;
    NSPoint boundsOrigin;
    BOOL snapsToGrid = [self snapsToGrid];
    float spacing = [self gridSpacing];
    BOOL echoToRulers = [[self enclosingScrollView] rulersVisible];
    NSRect selBounds = [[self drawDocument] boundsForGraphics:selGraphics];

    c = [selGraphics count];

    lastPoint = [self convertPoint:[theEvent locationInWindow] fromView:nil];
    if (snapsToGrid || echoToRulers) {
        selOriginOffset = NSMakePoint((lastPoint.x - selBounds.origin.x), (lastPoint.y - selBounds.origin.y));
    }
    if (echoToRulers) {
        [self beginEchoingMoveToRulers:selBounds];
    }

    while (1) {
        theEvent = [[self window] nextEventMatchingMask:(NSLeftMouseDraggedMask | NSLeftMouseUpMask)];
        curPoint = [self convertPoint:[theEvent locationInWindow] fromView:nil];
        if (!isMoving && ((fabs(curPoint.x - lastPoint.x) >= 2.0) || (fabs(curPoint.y - lastPoint.y) >= 2.0))) {
            isMoving = YES;
            [selGraphics makeObjectsPerformSelector:@selector(startBoundsManipulation)];
            _gvFlags.knobsHidden = YES;
        }
        if (isMoving) {
            if (snapsToGrid) {
                boundsOrigin.x = curPoint.x - selOriginOffset.x;
                boundsOrigin.y = curPoint.y - selOriginOffset.y;
                boundsOrigin.x = floor((boundsOrigin.x / spacing) + 0.5) * spacing;
                boundsOrigin.y = floor((boundsOrigin.y / spacing) + 0.5) * spacing;
                curPoint.x = boundsOrigin.x + selOriginOffset.x;
                curPoint.y = boundsOrigin.y + selOriginOffset.y;
            }
            if (!NSEqualPoints(lastPoint, curPoint)) {
                for (i=0; i<c; i++) {
                    graphic = [selGraphics objectAtIndex:i];
                    [self invalidateGraphic:graphic];
                    [graphic moveBy:NSMakePoint(curPoint.x - lastPoint.x, curPoint.y - lastPoint.y)];
                    [self invalidateGraphic:graphic];
                    if (echoToRulers) {
                        [self continueEchoingMoveToRulers:NSMakeRect(curPoint.x - selOriginOffset.x, curPoint.y - selOriginOffset.y, NSWidth(selBounds),NSHeight(selBounds))];
                    }
                    didMove = YES;
                }
                // Adjust the delta that is used for cascading pastes.  Pasting and then moving the pasted graphic is the way you determine the cascade delta for subsequent pastes.
                _pasteCascadeDelta.x += (curPoint.x - lastPoint.x);
                _pasteCascadeDelta.y += (curPoint.y - lastPoint.y);
            }
            lastPoint = curPoint;
        }
        if ([theEvent type] == NSLeftMouseUp) {
            break;
        }
    }

    if (echoToRulers)  {
        [self stopEchoingMoveToRulers];
    }
    if (isMoving) {
        [selGraphics makeObjectsPerformSelector:@selector(stopBoundsManipulation)];
        _gvFlags.knobsHidden = NO;

        if (didMove) {
            // Only if we really moved.
            [_drawingController commitWithIdentifier: @"move-shape"
								descriptionArguments: [self descriptionArgsForGraphics: selGraphics]];
        }
    }
}

- (void)selectAndTrackMouseWithEvent:(NSEvent *)theEvent {
    NSPoint curPoint;
    SKTGraphic *graphic = nil;
    BOOL isSelected;
    BOOL extending = (([theEvent modifierFlags] & NSShiftKeyMask) ? YES : NO);

    curPoint = [self convertPoint:[theEvent locationInWindow] fromView:nil];
    graphic = [self graphicUnderPoint:curPoint];
    isSelected = (graphic ? [self graphicIsSelected:graphic] : NO);

//    NSLog (@"graphic %@ isSelected %d", graphic, isSelected);

    if (!extending && !isSelected) {
        [self clearSelection];
    }

    if (graphic) {
        // Add or remove this graphic from selection.
        if (extending) {
            if (isSelected) {
                [self deselectGraphic:graphic];
                isSelected = NO;
            } else {
                [self selectGraphic:graphic];
                isSelected = YES;
            }
        } else {
            if (isSelected) {
                int knobHit = [graphic knobUnderPoint:curPoint];
                if (knobHit != NoKnob) {
                    [self trackKnob:knobHit ofGraphic:graphic withEvent:theEvent];
                    return;
                }
            }
            [self selectGraphic:graphic];
            isSelected = YES;
        }
    } else {
        [self rubberbandSelectWithEvent:theEvent];
        return;
    }

    if (isSelected) {
        [self moveSelectedGraphicsWithEvent:theEvent];
        return;
    }

    // If we got here then there must be nothing else to do.  Just track until mouseUp:.
    while (1) {
        theEvent = [[self window] nextEventMatchingMask:(NSLeftMouseDraggedMask | NSLeftMouseUpMask)];
        if ([theEvent type] == NSLeftMouseUp) {
            break;
        }
    }
}

- (void)mouseDown:(NSEvent *)theEvent {
    Class theClass = [[self drawingController] currentGraphicClass];
    if ([self editingGraphic]) {
        [self endEditing];
    }
    if ([theEvent clickCount] > 1) {
        NSPoint curPoint = [self convertPoint:[theEvent locationInWindow] fromView:nil];
        SKTGraphic *graphic = [self graphicUnderPoint:curPoint];
        if (graphic && [graphic isEditable]) {
            [self startEditingGraphic:graphic withEvent:theEvent];
            return;
        }
    }
    if (theClass) {
        [self clearSelection];
        [self createGraphicOfClass:theClass withEvent:theEvent];
    } else {
        [self selectAndTrackMouseWithEvent:theEvent];
    }
}

- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent {
    return YES;
}

// SKTImage graphic creation
- (BOOL)makeNewImageFromPasteboard:(NSPasteboard *)pboard atPoint:(NSPoint)point {
    NSString *type = [pboard availableTypeFromArray:[NSImage imagePasteboardTypes]];
    if (type) {
        NSImage *contents = [[NSImage alloc] initWithPasteboard:pboard];
        if (contents) {
            SKTImage *newImage = [[SKTImage alloc] init];
            [newImage setBounds:NSMakeRect(point.x, point.y - [contents size].height, [contents size].width, [contents size].height)];
            [newImage setImage:contents];

            [[self drawDocument] insertGraphic:newImage atIndex:0];

            [self clearSelection];
            [self selectGraphic:newImage];
            return YES;
        }
    }
    return NO;
}

- (BOOL)makeNewImageFromContentsOfFile:(NSString *)filename atPoint:(NSPoint)point {
    NSString *extension = [filename pathExtension];
    if ([[NSImage imageFileTypes] containsObject:extension]) {
        NSImage *contents = [[NSImage alloc] initWithContentsOfFile:filename];
        if (contents) {
            SKTImage *newImage = [[SKTImage alloc] init];
            [newImage setBounds:NSMakeRect(point.x, point.y, [contents size].width, [contents size].height)];
            [newImage setImage:contents];

            [[self drawDocument] insertGraphic:newImage atIndex:0];

            [self clearSelection];
            [self selectGraphic:newImage];
            return YES;
        }
    }
    return NO;
}

// Dragging
- (unsigned int)dragOperationForDraggingInfo:(id <NSDraggingInfo>)sender {
    NSPasteboard *pboard = [sender draggingPasteboard];
    NSString *type = [pboard availableTypeFromArray:[NSArray arrayWithObjects:NSColorPboardType, NSFilenamesPboardType, nil]];

    if (type) {
        if ([type isEqualToString:NSColorPboardType]) {
            NSPoint point = [self convertPoint:[sender draggingLocation] fromView:nil];
            if ([self graphicUnderPoint:point]) {
                return NSDragOperationGeneric;
            }
        }
        if ([type isEqualToString:NSFilenamesPboardType]) {
            return NSDragOperationCopy;
        }
    }

    type = [pboard availableTypeFromArray:[NSImage imagePasteboardTypes]];
    if (type) {
        return NSDragOperationCopy;
    }

    return NSDragOperationNone;
}

- (unsigned int)draggingEntered:(id <NSDraggingInfo>)sender {
    return [self dragOperationForDraggingInfo:sender];
}

- (unsigned int)draggingUpdated:(id <NSDraggingInfo>)sender {
    return [self dragOperationForDraggingInfo:sender];
}

- (void)draggingExited:(id <NSDraggingInfo>)sender {
    return;
}

- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender {
    return YES;
}

- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender {
    return YES;
}

- (void)concludeDragOperation:(id <NSDraggingInfo>)sender {
    NSPasteboard *pboard = [sender draggingPasteboard];
    NSString *type = [pboard availableTypeFromArray:[NSArray arrayWithObjects:NSColorPboardType, NSFilenamesPboardType, nil]];
    NSPoint point = [self convertPoint:[sender draggingLocation] fromView:nil];
    NSPoint draggedImageLocation = [self convertPoint:[sender draggedImageLocation] fromView:nil];

    if (type) {
        if ([type isEqualToString:NSColorPboardType]) {
            SKTGraphic *hitGraphic = [self graphicUnderPoint:point];

            if (hitGraphic) {
                NSColor *color = [[NSColor colorFromPasteboard:pboard] colorWithAlphaComponent:1.0];
                [hitGraphic setFillColor:color];
                //[[self undoManager] setActionName:NSLocalizedStringFromTable(@"Set Fill Color", @"UndoStrings", @"Action name for setting fill color.")];
            }
        } else if ([type isEqualToString:NSFilenamesPboardType]) {
            NSArray *filenames = [pboard propertyListForType:NSFilenamesPboardType];
            // Handle multiple files (cascade them?)
            if ([filenames count] == 1) {
                NSString *filename = [filenames objectAtIndex:0];
                [self makeNewImageFromContentsOfFile:filename atPoint:point];
            }
        }
        return;
    }

    (void)[self makeNewImageFromPasteboard:pboard atPoint:draggedImageLocation];
}

// Ruler support
- (void)updateRulers {
    NSScrollView *enclosingScrollView = [self enclosingScrollView];
    if ([enclosingScrollView rulersVisible]) {
        // MF: Eventually, it'd be nice if we added ruler markers for the selection, but for now we just clear them.  By clearing the markers we make sure that no markers from text editing are left over when the editing stops.
        [[enclosingScrollView verticalRulerView] setMarkers:nil];
        [[enclosingScrollView horizontalRulerView] setMarkers:nil];
    }
}

- (BOOL)rulerView:(NSRulerView *)ruler shouldMoveMarker:(NSRulerMarker *)marker {
    return YES;
}

- (float)rulerView:(NSRulerView *)ruler willMoveMarker:(NSRulerMarker *)marker toLocation:(float)location {
    return location;
}

- (void)rulerView:(NSRulerView *)ruler didMoveMarker:(NSRulerMarker *)marker {

}

- (BOOL)rulerView:(NSRulerView *)ruler shouldRemoveMarker:(NSRulerMarker *)marker {
    return NO;
}

#define SKT_RULER_MARKER_THICKNESS 8.0
#define SKT_RULER_ACCESSORY_THICKNESS 10.0

- (IBAction)toggleRuler:(id)sender {
    NSScrollView *enclosingScrollView = [self enclosingScrollView];
    BOOL rulersAreVisible = [enclosingScrollView rulersVisible];
    if (rulersAreVisible) {
        [enclosingScrollView setRulersVisible:NO];
    } else {
        if (!_gvFlags.initedRulers) {
            NSRulerView *ruler;
            ruler = [enclosingScrollView horizontalRulerView];
            [ruler setReservedThicknessForMarkers:SKT_RULER_MARKER_THICKNESS];
            [ruler setReservedThicknessForAccessoryView:SKT_RULER_ACCESSORY_THICKNESS];
            ruler = [enclosingScrollView verticalRulerView];
            [ruler setReservedThicknessForMarkers:SKT_RULER_MARKER_THICKNESS];
            [ruler setReservedThicknessForAccessoryView:SKT_RULER_ACCESSORY_THICKNESS];
            _gvFlags.initedRulers = YES;
        }
        [enclosingScrollView setRulersVisible:YES];
        [self updateRulers];
    }
}

// Action methods and other UI entry points
- (void)changeColor:(id)sender {
    NSArray *selGraphics = [self selectedGraphics];
    unsigned i, c = [selGraphics count];
    if (c > 0) {
        SKTGraphic *curGraphic;
        NSColor *color = [sender color];

        for (i=0; i<c; i++) {
            curGraphic = [selGraphics objectAtIndex:i];
            [curGraphic setFillColor:color];
            [curGraphic setDrawsFill:YES];
        }
        [_drawingController commitWithIdentifier: @"change-shape-color"
							descriptionArguments: [self descriptionArgsForGraphics: selGraphics]];
    }
}

- (IBAction)selectAll:(id)sender {
    NSArray *graphics = [[self drawDocument] graphics];
    [self performSelector:@selector(selectGraphic:) withEachObjectInArray:graphics];
}

- (IBAction)deselectAll:(id)sender {
    [self clearSelection];
}

- (IBAction)delete:(id)sender {
    NSArray *selCopy = [[NSArray alloc] initWithArray:[self selectedGraphics]];
    if ([selCopy count] > 0) {
        [[self drawDocument] performSelector:@selector(removeGraphic:) withEachObjectInArray:selCopy];

        [_drawingController commitWithIdentifier: @"delete-shape"
							descriptionArguments: [self descriptionArgsForGraphics: selCopy]];
    }
}

- (IBAction)bringToFront:(id)sender {
    NSArray *orderedSelection = [self orderedSelectedGraphics];
    unsigned c = [orderedSelection count];
    if (c > 0) {
        SKTDrawDocument *document = [self drawDocument];
        while (c-- > 0) {
            [document moveGraphic:[orderedSelection objectAtIndex:c] toIndex:0];
        }
        //[[self undoManager] setActionName:NSLocalizedStringFromTable(@"Bring To Front", @"UndoStrings", @"Action name for bring to front.")];
    }
}

- (IBAction)sendToBack:(id)sender {
    NSArray *orderedSelection = [self orderedSelectedGraphics];
    unsigned i, c = [orderedSelection count];
    if (c > 0) {
        SKTDrawDocument *document = [self drawDocument];
        unsigned lastIndex = [[self graphics] count];
        for (i=0; i<c; i++) {
            [document moveGraphic:[orderedSelection objectAtIndex:i] toIndex:lastIndex];
        }
        //[[self undoManager] setActionName:NSLocalizedStringFromTable(@"Send To Back", @"UndoStrings", @"Action name for send to back.")];
    }
}

- (IBAction)alignLeftEdges:(id)sender {
    NSArray *selection = [self selectedGraphics];
    unsigned i, c = [selection count];
    if (c > 1) {
        NSRect firstBounds = [[selection objectAtIndex:0] bounds];
        SKTGraphic *curGraphic;
        NSRect curBounds;
        for (i=1; i<c; i++) {
            curGraphic = [selection objectAtIndex:i];
            curBounds = [curGraphic bounds];
            if (curBounds.origin.x != firstBounds.origin.x) {
                curBounds.origin.x = firstBounds.origin.x;
                [curGraphic setBounds:curBounds];
            }
        }
        //[[self undoManager] setActionName:NSLocalizedStringFromTable(@"Align Left Edges", @"UndoStrings", @"Action name for align left edges.")];
    }
}

- (IBAction)alignRightEdges:(id)sender {
    NSArray *selection = [self selectedGraphics];
    unsigned i, c = [selection count];
    if (c > 1) {
        NSRect firstBounds = [[selection objectAtIndex:0] bounds];
        SKTGraphic *curGraphic;
        NSRect curBounds;
        for (i=1; i<c; i++) {
            curGraphic = [selection objectAtIndex:i];
            curBounds = [curGraphic bounds];
            if (NSMaxX(curBounds) != NSMaxX(firstBounds)) {
                curBounds.origin.x = NSMaxX(firstBounds) - curBounds.size.width;
                [curGraphic setBounds:curBounds];
            }
        }
        //[[self undoManager] setActionName:NSLocalizedStringFromTable(@"Align Right Edges", @"UndoStrings", @"Action name for align right edges.")];
    }
}

- (IBAction)alignTopEdges:(id)sender {
    NSArray *selection = [self selectedGraphics];
    unsigned i, c = [selection count];
    if (c > 1) {
        NSRect firstBounds = [[selection objectAtIndex:0] bounds];
        SKTGraphic *curGraphic;
        NSRect curBounds;
        for (i=1; i<c; i++) {
            curGraphic = [selection objectAtIndex:i];
            curBounds = [curGraphic bounds];
            if (curBounds.origin.y != firstBounds.origin.y) {
                curBounds.origin.y = firstBounds.origin.y;
                [curGraphic setBounds:curBounds];
            }
        }
        //[[self undoManager] setActionName:NSLocalizedStringFromTable(@"Align Top Edges", @"UndoStrings", @"Action name for align top edges.")];
    }
}

- (IBAction)alignBottomEdges:(id)sender {
    NSArray *selection = [self selectedGraphics];
    unsigned i, c = [selection count];
    if (c > 1) {
        NSRect firstBounds = [[selection objectAtIndex:0] bounds];
        SKTGraphic *curGraphic;
        NSRect curBounds;
        for (i=1; i<c; i++) {
            curGraphic = [selection objectAtIndex:i];
            curBounds = [curGraphic bounds];
            if (NSMaxY(curBounds) != NSMaxY(firstBounds)) {
                curBounds.origin.y = NSMaxY(firstBounds) - curBounds.size.height;
                [curGraphic setBounds:curBounds];
            }
        }
        //[[self undoManager] setActionName:NSLocalizedStringFromTable(@"Align Bottom Edges", @"UndoStrings", @"Action name for align bottom edges.")];
    }
}

- (IBAction)alignHorizontalCenters:(id)sender {
    NSArray *selection = [self selectedGraphics];
    unsigned i, c = [selection count];
    if (c > 1) {
        NSRect firstBounds = [[selection objectAtIndex:0] bounds];
        SKTGraphic *curGraphic;
        NSRect curBounds;
        for (i=1; i<c; i++) {
            curGraphic = [selection objectAtIndex:i];
            curBounds = [curGraphic bounds];
            if (NSMidX(curBounds) != NSMidX(firstBounds)) {
                curBounds.origin.x = NSMidX(firstBounds) - (curBounds.size.width / 2.0);
                [curGraphic setBounds:curBounds];
            }
        }
        //[[self undoManager] setActionName:NSLocalizedStringFromTable(@"Align Horizontal Centers", @"UndoStrings", @"Action name for align horizontal centers.")];
    }
}

- (IBAction)alignVerticalCenters:(id)sender {
    NSArray *selection = [self selectedGraphics];
    unsigned i, c = [selection count];
    if (c > 1) {
        NSRect firstBounds = [[selection objectAtIndex:0] bounds];
        SKTGraphic *curGraphic;
        NSRect curBounds;
        for (i=1; i<c; i++) {
            curGraphic = [selection objectAtIndex:i];
            curBounds = [curGraphic bounds];
            if (NSMidY(curBounds) != NSMidY(firstBounds)) {
                curBounds.origin.y = NSMidY(firstBounds) - (curBounds.size.height / 2.0);
                [curGraphic setBounds:curBounds];
            }
        }
        //[[self undoManager] setActionName:NSLocalizedStringFromTable(@"Align Vertical Centers", @"UndoStrings", @"Action name for align vertical centers.")];
    }
}

- (IBAction)makeSameWidth:(id)sender {
    NSArray *selection = [self selectedGraphics];
    unsigned i, c = [selection count];
    if (c > 1) {
        NSRect firstBounds = [[selection objectAtIndex:0] bounds];
        SKTGraphic *curGraphic;
        NSRect curBounds;
        for (i=1; i<c; i++) {
            curGraphic = [selection objectAtIndex:i];
            curBounds = [curGraphic bounds];
            if (curBounds.size.width != firstBounds.size.width) {
                curBounds.size.width = firstBounds.size.width;
                [curGraphic setBounds:curBounds];
            }
        }
        //[[self undoManager] setActionName:NSLocalizedStringFromTable(@"Make Same Width", @"UndoStrings", @"Action name for make same width.")];
    }
}

- (IBAction)makeSameHeight:(id)sender {
    NSArray *selection = [self selectedGraphics];
    unsigned i, c = [selection count];
    if (c > 1) {
        NSRect firstBounds = [[selection objectAtIndex:0] bounds];
        SKTGraphic *curGraphic;
        NSRect curBounds;
        for (i=1; i<c; i++) {
            curGraphic = [selection objectAtIndex:i];
            curBounds = [curGraphic bounds];
            if (curBounds.size.height != firstBounds.size.height) {
                curBounds.size.height = firstBounds.size.height;
                [curGraphic setBounds:curBounds];
            }
        }
        //[[self undoManager] setActionName:NSLocalizedStringFromTable(@"Make Same Width", @"UndoStrings", @"Action name for make same width.")];
    }
}

- (IBAction)makeNaturalSize:(id)sender {
    NSArray *selection = [self selectedGraphics];
    if ([selection count] > 0) {
        [selection makeObjectsPerformSelector:@selector(makeNaturalSize)];
        //[[self undoManager] setActionName:NSLocalizedStringFromTable(@"Make Natural Size", @"UndoStrings", @"Action name for natural size.")];
    }
}

- (IBAction)snapsToGridMenuAction:(id)sender {
    [self setSnapsToGrid:([sender state] ? NO : YES)];
    // Menu item will get state fixed up in validateMenuItem:
    [[SKTGridPanelController sharedGridPanelController] updatePanel];
}

- (IBAction)showsGridMenuAction:(id)sender {
    [self setShowsGrid:([sender state] ? NO : YES)];
    // Menu item will get state fixed up in validateMenuItem:
    [[SKTGridPanelController sharedGridPanelController] updatePanel];
}

- (IBAction)gridSelectedGraphicsAction:(id)sender {
    NSArray *selection = [self selectedGraphics];
    unsigned i, c = [selection count];
    if (c > 0) {
        SKTGraphic *curGraphic;
        NSRect curBounds;
        NSPoint curMaxPoint;
        float spacing = [self gridSpacing];

        for (i=0; i<c; i++) {
            curGraphic = [selection objectAtIndex:i];
            curBounds = [curGraphic bounds];
            curMaxPoint = NSMakePoint(NSMaxX(curBounds), NSMaxY(curBounds));
            curBounds.origin.x = floor((curBounds.origin.x / spacing) + 0.5) * spacing;
            curBounds.origin.y = floor((curBounds.origin.y / spacing) + 0.5) * spacing;
            curMaxPoint.x = floor((curMaxPoint.x / spacing) + 0.5) * spacing;
            curMaxPoint.y = floor((curMaxPoint.y / spacing) + 0.5) * spacing;
            curBounds.size.width = curMaxPoint.x - curBounds.origin.x;
            curBounds.size.height = curMaxPoint.y - curBounds.origin.y;
            [curGraphic setBounds:curBounds];
        }
        //[[self undoManager] setActionName:NSLocalizedStringFromTable(@"Grid Selected Graphics", @"UndoStrings", @"Action name for grid selected graphics.")];
    }
}

- (BOOL)validateMenuItem:(NSMenuItem *)item {
    SEL action = [item action];

    if (action == @selector(snapsToGridMenuAction:)) {
        [item setState:([self snapsToGrid] ? NSOnState : NSOffState)];
        return YES;
    } else if (action == @selector(showsGridMenuAction:)) {
        [item setState:([self showsGrid] ? NSOnState : NSOffState)];
        return YES;
    } else if (action == @selector(makeNaturalSize:)) {
        // Return YES if we have at least one selected graphic that has a natural size.
        NSArray *selectedGraphics = [self selectedGraphics];
        unsigned i, c = [selectedGraphics count];
        if (c > 0) {
            for (i=0; i<c; i++) {
                if ([[selectedGraphics objectAtIndex:i] hasNaturalSize]) {
                    return YES;
                }
            }
        }
        return NO;
    } else if ((action == @selector(gridSelectedGraphicsAction:)) || (action == @selector(delete:)) || (action == @selector(bringToFront:)) || (action == @selector(sendToBack:)) || (action == @selector(cut:)) || (action == @selector(copy:))) {
        // These only apply if there is a selection
        return (([[self selectedGraphics] count] > 0) ? YES : NO);
    } else if ((action == @selector(alignLeftEdges:)) || (action == @selector(alignRightEdges:)) || (action == @selector(alignTopEdges:)) || (action == @selector(alignBottomEdges:)) || (action == @selector(alignHorizontalCenters:)) || (action == @selector(alignVerticalCenters:)) || (action == @selector(alignTextBaselines:)) || (action == @selector(makeSameWidth:)) || (action == @selector(makeSameHeight:))) {
        // These only apply to multiple selection
        return (([[self selectedGraphics] count] > 1) ? YES : NO);
    } else {
        return YES;
    }
}

- (IBAction)copy:(id)sender {
    NSArray *orderedSelection = [self orderedSelectedGraphics];
    if ([orderedSelection count] > 0) {
        SKTDrawDocument *document = [self drawDocument];
        NSPasteboard *pboard = [NSPasteboard generalPasteboard];

        [pboard declareTypes:[NSArray arrayWithObjects:SKTDrawDocumentType, NSTIFFPboardType, NSPDFPboardType, nil] owner:nil];
        [pboard setData:[document drawDocumentDataForGraphics:orderedSelection] forType:SKTDrawDocumentType];
        [pboard setData:[document TIFFRepresentationForGraphics:orderedSelection error:NULL] forType:NSTIFFPboardType];
        [pboard setData:[document PDFRepresentationForGraphics:orderedSelection] forType:NSPDFPboardType];
        _pasteboardChangeCount = [pboard changeCount];
        _pasteCascadeNumber = 1;
        _pasteCascadeDelta = NSMakePoint(SKTDefaultPasteCascadeDelta, SKTDefaultPasteCascadeDelta);
    }
}

- (IBAction)cut:(id)sender {
    [self copy:sender];
    [self delete:sender];
    //[[self undoManager] setActionName:NSLocalizedStringFromTable(@"Cut", @"UndoStrings", @"Action name for cut.")];
}

- (IBAction)paste:(id)sender {
    NSPasteboard *pboard = [NSPasteboard generalPasteboard];
    NSString *type = [pboard availableTypeFromArray:[NSArray arrayWithObjects:SKTDrawDocumentType, NSFilenamesPboardType, nil]];

    if (type) {
        if ([type isEqualToString:SKTDrawDocumentType]) {

	    // You can't trust anything that might have been put on the pasteboard by another application, so be ready for -[SKTDrawDocument drawDocumentDictionaryFromData:error:] to fail and return nil.
	    NSError *error;
	    SKTDrawDocument *document = [self drawDocument];
            NSDictionary *docDict = [document drawDocumentDictionaryFromData:[pboard dataForType:type] error:&error];
	    if (docDict) {
		NSArray *array = [document graphicsFromDrawDocumentDictionary:docDict];
		int i = [array count];
		int currentChangeCount = [pboard changeCount];

		if (_pasteboardChangeCount != currentChangeCount) {
		    _pasteboardChangeCount = currentChangeCount;
		    _pasteCascadeNumber = 0;
		    _pasteCascadeDelta = NSMakePoint(SKTDefaultPasteCascadeDelta, SKTDefaultPasteCascadeDelta);
		}

		if (i > 0) {
		    id curGraphic;
		    NSPoint savedPasteCascadeDelta = _pasteCascadeDelta;

		    [self clearSelection];
		    while (i-- > 0) {
			curGraphic = [array objectAtIndex:i];
			if (_pasteCascadeNumber > 0) {
			    [curGraphic moveBy:NSMakePoint(_pasteCascadeNumber * savedPasteCascadeDelta.x, _pasteCascadeNumber * savedPasteCascadeDelta.y)];
			}
			[document insertGraphic:curGraphic atIndex:0];
			[self selectGraphic:curGraphic];
		    }
		    _pasteCascadeNumber++;
		    _pasteCascadeDelta = savedPasteCascadeDelta;
		    //[[self undoManager] setActionName:NSLocalizedStringFromTable(@"Paste", @"UndoStrings", @"Action name for paste.")];
		}
	    } else {

		// Something went wrong? Present the error to the user in a sheet. It was entirely -[NSDocument drawDocumentDictionaryFromData:error:]'s responsibility to set error to something when it returned nil. It was also entirely responsible for not crashing if we had passed in error:NULL.
		[self presentError:error modalForWindow:[self window] delegate:nil didPresentSelector:NULL contextInfo:NULL];

	    }

	} else if ([type isEqualToString:NSFilenamesPboardType]) {
            NSArray *filenames = [pboard propertyListForType:NSFilenamesPboardType];
            if ([filenames count] == 1) {
                NSString *filename = [filenames objectAtIndex:0];
                if ([self makeNewImageFromContentsOfFile:filename atPoint:NSMakePoint(50, 50)]) {
                    //[[self undoManager] setActionName:NSLocalizedStringFromTable(@"Paste", @"UndoStrings", @"Action name for paste.")];
                }
            }
        }
    } else if ([self makeNewImageFromPasteboard:pboard atPoint:NSMakePoint(50, 50)]) {
        //[[self undoManager] setActionName:NSLocalizedStringFromTable(@"Paste", @"UndoStrings", @"Action name for paste.")];
    }
}

// Keyboard commands
- (void)keyDown:(NSEvent *)event {
    // Pass on the key binding manager.  This will end up calling insertText: or some command selector.
    [self interpretKeyEvents:[NSArray arrayWithObject:event]];
}

- (void)insertText:(NSString *)str {
    NSBeep();
}

- (void)hideKnobsMomentarily {
    if (_unhideKnobsTimer) {
        [_unhideKnobsTimer invalidate];
        _unhideKnobsTimer = nil;
    }
    _unhideKnobsTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(unhideKnobs:) userInfo:nil repeats:NO];
    _gvFlags.knobsHidden = YES;
    [self invalidateGraphics:[self selectedGraphics]];
}

- (void)unhideKnobs:(NSTimer *)timer {
    _gvFlags.knobsHidden = NO;
    [self invalidateGraphics:[self selectedGraphics]];
    [_unhideKnobsTimer invalidate];
    _unhideKnobsTimer = nil;
}

- (void)moveSelectedGraphicsByPoint:(NSPoint)delta {
    NSArray *selection = [self selectedGraphics];
    unsigned i, c = [selection count];
    if (c > 0) {
        [self hideKnobsMomentarily];
        for (i=0; i<c; i++) {
            [[selection objectAtIndex:i] moveBy:delta];
        }
        //[[self undoManager] setActionName:NSLocalizedStringFromTable(@"Nudge", @"UndoStrings", @"Action name for nudge keyboard commands.")];
    }
}

- (void)moveLeft:(id)sender {
    [self moveSelectedGraphicsByPoint:NSMakePoint(-1.0, 0.0)];
}

- (void)moveRight:(id)sender {
    [self moveSelectedGraphicsByPoint:NSMakePoint(1.0, 0.0)];
}

- (void)moveUp:(id)sender {
    [self moveSelectedGraphicsByPoint:NSMakePoint(0.0, -1.0)];
}

- (void)moveDown:(id)sender {
    [self moveSelectedGraphicsByPoint:NSMakePoint(0.0, 1.0)];
}

- (void)moveForwardAndModifySelection:(id)sender {
    // We will use this to move by the grid spacing.
    [self moveSelectedGraphicsByPoint:NSMakePoint([self gridSpacing], 0.0)];
}

- (void)moveBackwardAndModifySelection:(id)sender {
    // We will use this to move by the grid spacing.
    [self moveSelectedGraphicsByPoint:NSMakePoint(-[self gridSpacing], 0.0)];
}

- (void)moveUpAndModifySelection:(id)sender {
    // We will use this to move by the grid spacing.
    [self moveSelectedGraphicsByPoint:NSMakePoint(0.0, -[self gridSpacing])];
}

- (void)moveDownAndModifySelection:(id)sender {
    // We will use this to move by the grid spacing.
    [self moveSelectedGraphicsByPoint:NSMakePoint(0.0, [self gridSpacing])];
}

- (void)deleteForward:(id)sender {
    [self delete:sender];
}

- (void)deleteBackward:(id)sender {
    [self delete:sender];
}

// Grid settings
- (BOOL)snapsToGrid {
    return _gvFlags.snapsToGrid;
}

- (void)setSnapsToGrid:(BOOL)flag {
    _gvFlags.snapsToGrid = flag;
}

- (BOOL)showsGrid {
    return _gvFlags.showsGrid;
}

- (void)setShowsGrid:(BOOL)flag {
    if (_gvFlags.showsGrid != flag) {
        _gvFlags.showsGrid = flag;
        [self setNeedsDisplay:YES];
    }
}

- (float)gridSpacing {
    return _gridSpacing;
}

- (void)setGridSpacing:(float)spacing {
    if (_gridSpacing != spacing) {
        _gridSpacing = spacing;
        [self setNeedsDisplay:YES];
    }
}

- (NSColor *)gridColor {
    return (_gridColor ? _gridColor : [NSColor lightGrayColor]);
}

- (void)setGridColor:(NSColor *)color {
	_gridColor = color;
	[self setNeedsDisplay:YES];
}

@end

redpajama_set_name: RedPajamaGithub


text: Q: Figured out that my .json file needs to be in the public folder (create-react-app) . Is that correct? Took me  4 hours but why is it that the .json file that I want to access by a components .js file in my src folder needs to be in the public folder? Isn't the src folder already "public" as in everyone can see my code? Thank You for the time.

redpajama_set_name: RedPajamaStackExchange


Good evening everyone!! I was wondering how everyone is doing in terms of attaining tasks. I teach full time and am not at liberty to check my computer throughout the day so I probably miss the sporadic bursts to tasks that may be loaded in the system. This evening I was able to log on early (around 5:45) and was able to work an entire hour - the only one I've been able to work this entire week. I plan to stalk my laptop this entire weekend to get any more hours that I can but honestly I was much more optimistic about a month ago that this shortage would be ending sometime in the near future. Does anyone have any insight whatsoever regarding how close we may be to this shortage being over? Are there better times of the day or better days of the week to check for tasks? Thanks in advance to any feedback provided.
This last week I completed 20 hours. Wellcome!
Hi, Elena. I´m working in LB. It´s true. 7.5€ per hour in Spain. My average in recent weeks is 17-18 hours. Not bad.
Lionbridge and Zerochaos used nearly identical wording about no immediate or future need for U.S. English raters.
However, even as some raters were being fired at ZC, quite a few of us had plenty of work this week -- on of the best weeks since the work shortage began.
I just read one of the most depressing emails ever - from Lionbridge. Apparently they have shut down tasks in the US market as of yesterday (the same day they sent me the email). When I say this was the best gig ever for extra money I'm not exaggerating. Did anyone else receive this news? I'm wondering if other ad evaluator vendors are in the same boat or if I can apply & pick up work with another one like zero chaos or appen? What's so strange is that a co-worker whom I referred to LB this summer had finally received an invite to take the exam but now operations are shut down?? So depressing.....CAN YOU COPY PASTE THAT EMAIL?
I imagine it is just about the same as Shadow's.
The emails are nearly identical, but don't actually state that the program is being shut down. They are worded to *imply* that, but maybe that is not what LB and ZC actually meant. Even though a few ZeroChaos ads raters were fired this week, which is too bad, work volume actually increased for the rest of us. Nothing is making sense with this job!
For those of you have been fired by Lionbridge or ZC, iSoftStone is hiring English ad evaluators who are based in the U.S. You are allowed to work up to 25 hours at first and go up to 40 hrs if your work is good. This is IC-1099, though.
I *believe* "Ad Evaluator" is the term for Google ads raters at most vendors; whereas I think the term for Bing ad raters is "Ad Assessors." It gets so confusing! LB, Appen, isoftstone hire for both Microsoft and Google teams.
I have some inquiries in at another forum right now re: these ads rating jobs at iSS. iSoftStone had told some past applicants that they had a big project coming in January 2016.
We would like to notify you that due to circumstances outside of our control we no longer have a requirement for your services on the Ads Quality Rating Program. It is with regret that we have to make this decision; however we do not have any immediate or future need for task completion in the US Market.
We would ask that you finish up on any existing tasks by end of day today Thursday, 3rd March 2016, and please make sure to log any time as necessary in your timesheet in the Supplier Portal. Access to our systems will be removed as of 12:00pm PST tomorrow, Friday 4th March 2016.
Please also ensure that you have valid banking details uploaded on the Supplier Portal. This will allow us to process any outstanding payments to you when they are due. If you have any queries about uploading bank details, please refer to the "Country Help Page" in the supplier portal under Vendor Bank Details. If you experience any issues accessing the Supplier Portal please contact time.reporting.bal@lionbridge.com.
A member of the recruitment team will be in contact with you should any new opportunities arise in the future.
We would like to take this opportunity to thank you for participating on the Ads Quality Rating Program and wish you every success in the future.
Hi Elena. Glad to know this week is going better for you! Unfortunately, things have been very up and down since last fall. We have to keep checking and checking to get decent hours. Didn't use to be like this, but seems we're stuck in this rut.
Hi all. NO work since the 11th. The same happened last week From thursday to sunday...Anyone noticed the same?
Hello everyone! I've been invited to take an exam with lion bridge. Does any one have helpful tips on passing the exam?
If there is not enough work, why do they take more people? ?What is the logic behind that?


An American citizen who was kidnapped with her driver at Uganda's most popular wildlife park by gunmen had failed to take an armed ranger as required by the park's regulations, a spokesperson for the wildlife authority said.
Four armed men in Uganda's Queen Elizabeth National Park. according to CNN have used the victim's phone to demand $500,000 ransom.
"We strongly believe this ransom is the reason behind the kidnap," a police officer said to CNN TV channel. They were ambushed and kidnapped near Katoke Gate between 5 pm and 7 pm on April, 2. "Other four tourists who were left abandoned and unharmed later contacted the base (lodge) and were quickly got safely out of any danger," a press release said.
The Queen Elizabeth National Park (QENP) is Uganda's most visited wildlife attraction.
Kimberley Sue Endecott (35), and Ugandan driver Jean Paul were on a game drive in the Park when four gunmen ambushed their vehicle in evening hours, police said. However, an elderly couple also at the scene were not taken and raised the alarm.
Militant groups as Somali Islamists or Congolese-based rebels operate in Uganda, but none of the group claimed responsibility for the armed incident. At present the regular crime is regarded as a privileged version of the assault.
There is ongoing police operation, however for the evident reasons, the details are not revealed.


Champion bred Presa Canario puppy for sale. Female presa puppy I breed, show and working quality. She has a lot of drive. She is going to make...View the complete puppy profile for more information.
If you would like to expand your search outside of Presa Canario puppies listed in Missouri, then perhaps you would be interested in the following puppies.
This playful puppy has championship bloodlines on her fathers side from both her great uncle and great grandfather. Both of her parents are well...View the complete puppy profile for more information.
Check out some of the recently sold Presa Canario puppies in Missouri.


text:
Cars Interesting
On Top of the Empire State Building With a 2015 Ford Mustang
Ford (NYSE: F) didn't have any major announcements to make at the New York International Auto Show last week. But the Blue…
COLLEGE KID TRIES BACKFLIP AT GRADUATION CEREMONY, FAILS HORRIBLY AND FACEPLANTS INSTEAD
Look, we're all super pumped when we finally get that diploma and graduate college. But maybe if you're going to…
Behold the internet's power: Quentin Tarantino to rewrite movie ending after script leaks
What the internet giveth, it also taketh away… and then giveth back again (sort of). Back in January, the script…
Houston Interesting
UH President Renu Khator Receives 2014 NASPA President's Award
Mar 25, 2014 Texas Azerbaijanis
Khator Honored for Advancing Quality of Student Life on Campus University of Houston President Renu Khator is the recipient of…
Azerbaijani News in U.S. Interesting
Azerbaijan receives category 1 aviation safety rating
Following its International Aviation Safety Assessment, the U.S. Federal Aviation Administration (FAA) ranked Azerbaijan in category 1 for aviation safety,…
Around the World Azerbaijan Interesting
Dilara Kazimova will represent Azerbaijan on Eurovision in Denmark [Photos]
In tonight's Azerbaijani final, one male and two female singers fought for the honour to represent their country in the…
Around the World Azerbaijan Azerbaijani News in U.S. Interesting
Heydar Aliyev Center on CNN's most beautiful concert halls list
Building data company Emporis has released a list of the world's most spectacular concert halls. The Heydar Aliyev Center in…
Azerbaijan Azerbaijani News in U.S. Events Houston Interesting
"Geopolitical dynamics and international energy projects in Caucasus" [Photos]
On February 24th, 2014 the Azerbaijan Center in collaboration with the C.T. Bauer College of Business and the student organization,…
Around the World Interesting
Edward Snowden has been nominated for a Nobel Peace Prize
Edward Snowden spent the last year revealing some of the government's most tightly held secrets, kicking off a massive debate…

redpajama_set_name: RedPajamaCommonCrawl


Compare Pineville, stateshort} Medigap insurance companies within minutes. Quote comparison is the best way to locate affordable Medicare Supplmental insurance in Pineville. To begin enter your Zip Code and press "Compare Your Options". Our website will search for the best Medigap insurance carriers and providers in Bell county. Finding the best coverage and low cost premium that fit your needs and budget can literally take you 20 minutes or less.
If you do want to get quotes for Medigap policies, you can either contact local insurance providers in Pineville, Kentucky, or you can use the Internet to help you find them. Submitting your information to these insurance providers will allow them to calculate how much you are going to pay. They will have different policy levels that you can choose from just like any ordinary health insurance policy. The amount that you pay is usually reflective of how much coverage you will have. In many cases, it's better to go with the most expensive plan so that you eliminate the possibility of being blindsided by very expensive medical bills.
Although we had just stated that you should pay the most money for Medigap insurance, this is only reflective of contacting one particular health insurance provider. Your goal is to get multiple quotes from different companies and look at all of the rates collectively. You will see that there are policies that are virtually identical, but they could be several hundred dollars a month less then other policies that are the same. In this case, you will want to choose the Pineville, Kentucky Medigap policy that is the lowest price which will come from one particular insurance provider.
Picking your well being insurance policy can be really perplexing. If you make the wrong conclusions, you could conclude up paying out too much for your coverage, or worse, you may not be lined for specified providers that you require. Study this report for some beneficial ideas on getting the most out of your wellness insurance coverage.
When you are looking into buying your possess well being insurance policy, you need to sit down and make a list of things that are essential to you. You want to contemplate regardless of whether or not your existing physician will be in the network. When you have created a list, it will be less difficult to start your investigation, especially if you know what their client support is like or how a lot of a top quality you can find the money for.
Discover the variances in between HMO's, PPO's, and POS programs and establish what will be the greatest in shape for your health requirements. They all have positive aspects and negatives that will influence the way you pay out for and use your insurance policy. HMO's need give less flexibility but greater cost, PPO's give you much more possibilities nonetheless the charges can be pricey. A POS program combines aspects of both HMO's and PPO's.
Request your medical doctor to prescribe you generic medication if one particular is obtainable. Your co-shell out will almost usually be significantly less for a generic drug than for a title brand name. The consequences are the exact same, you just is not going to be paying out an added surcharge for the branded medication. Help save your self the funds if achievable.
Understand the distinctions amongst HMO's, PPO's, and POS plans and establish what will be the best in shape for your overall health requirements. They all have advantages and negatives that will impact the way you pay out for and use your insurance coverage. HMO's need give considerably less adaptability but larger cost, PPO's give you far more alternatives however the costs can be pricey. A POS strategy combines factors of both HMO's and PPO's.
Completely read through your entire well being insurance policy agreement, and question for clarifications and explanations for items you do not very understand. Your insurance policies agent ought to be prepared and prepared to explain each bit of your deal to you, need to the need to have crop up. If he or she give you an answer that you never like, you may want to find a distinct plan.
If you are fortuitous enough to have an FSA or HSA (versatile shelling out account or healthcare investing account) as supplemental well being insurance, be positive you are receiving the maximum out of it. It can be challenging to determine out how much income you are likely to spend in the next calendar year on noncovered expenditures, but it truly is value the effort considering that that money is all pretax.
Read more than your health treatment handbook and it will give you a lot of knowledge that will be useful in the long term. Your supplier will send out you a booklet covering all the particulars of your coverage and studying it go over to include is the only way to totally realize all of the benefits obtainable to you. Though it could seem to be a small wearisome, you will reward from realizing all the details.
If there is a likelihood that you are going to be laid off from the business that you operate for, consider a health insurance coverage prepare with a decrease quality price. The govt has transformed items so that these who are laid off will have to pay their very own rates through the COBRA strategy.
When hunting to acquire overall health insurance for by yourself and your loved ones, it is a smart idea to consider affiliating with a team. This is a great way to help save funds as group insurance coverage is normally less expensive than individual insurance policies. When you are on employees your employer is instantly ready to get team charges. If you are on your possess you can uncover a group. Alumni associations or trade teams could enable you sign up for for insurance policies needs.
Before obtaining a little one you should know about how much you will have to shell out even with wellness insurance policy. If you have a PPO you may conclude up paying out about $a thousand or even far more for the start. If you have an HMO your expenses will possibly be a lot reduced. It is very best to determine it out just before you get pregnant.
As you can see from this article, overall health insurance policies is complicated, but it does not have to be puzzling. There are numerous ways that you can make certain you will not overpay for coverage whilst nevertheless receiving the medical care that you need. Possessing read through these guidelines, you must be greater well prepared to make choices about your insurance coverage wants.


How to become information literate?
Michael Caulfield's approach to information literacy is simple. He argues that we should teach students to be fact checkers instead of rhetoricians. In rhetoric, readers spend a great deal of time reading closely, analyzing syntax and word choice for tone. Fact checking, though, is quick, involving only "four moves and a habit," Caulfield, director of networked and blended learning at WSU Vancouver, says. A recent Stanford University study supports the idea that a fact-checking strategy is superior to close reading.
Look for previous work. When fact-checking a particular claim, the quickest, simplest thing to do is to see if someone has already done the work for you. Has the claim already been fact-checked? Check Snopes, Wikipedia, or another reputable site.
Go upstream to the source. Almost all web content is reposted from another site. Find the original and evaluate it.
Read laterally. Don't dig deep into a single site, read across many sites to see what others have to say about the source you're reading.
Circle back. If you get lost, hit a roadblock, or otherwise start chasing your tail, stop and start over.
And the habit? If you feel strong emotion when you read a social media post, stop. As WSU graduate student and social media researcher Rebecca Donaway says, content creators are trying to appeal to our baser emotions, so if that's what you're feeling, don't give them the win.


Take the sufficient amount of Brahmi powder in a small bowl The quantity required will depend upon your hair length. Start by mixing the powder with plain water. You can customize and add ingredients like amla, curd or Tulsi powder. Then use a spoon to make a thin and fine paste Apply the paste all over your hair from the scalp to the ends using a flat hair brush or with your hands. Leave it to dry completely at least for an hour. Rinse your hair thoroughly with plain water.
Tags: Lala's Brahmi Powder for Nourishing, lustrous Hair.


Corel USER to USER Web Board • View topic - Is there an "easy" way to slice an image (using guides)?
Is there an "easy" way to slice an image (using guides)?
Is there an easy (easier) way of slicing an image?
I would normally add guides and then using the snap properties, i'd go from one guide to another and export each file individually. Is there a way to pre-load those guides that I already have on my image into the Image Slicer, and then simply export, and it will slice automatically? Or something to this effect at least.. I have tried manually doing the Image Slicer and it's so tricky/fathy to use, it's difficult to get the exact pixels I need "from top" etc.
I can't see a way to do this in the image slicer options, nor is there even a way I can manually input a number from: top, bottom, left or right. I have to manually add/drag the lines up/down or left/right.
Surely there must be a way to easily slice images, hopefully by it slicing using my Guides that I have added.. ?
Re: Is there an "easy" way to slice an image (using guides)?
The Image Slicer has been around forever, it's a really old tool.
You can set a specific pixel location (not inch or cm sadly) by double clicking on the guide handle. This will let you set the position and the color of the guide.
I don't know of anything build into PSP that will automatically slice the image based on the guides. In fact I don't even think scripts will work because we can't find the guides using scripts (really annoying). . Gonna have to ruminate on this one.
Technically, I could create a script that lets you add guides to the image, then uses those added guides to do the slicing. That would cover both of your desires. 1) To be able to add guides using X and Y coordinates and 2) To slice based on those guides.
Nothing to do with the image slicer or guides but how about a custom selection (rectangle) at your sliced image coordinates and promote to layer or new image for each selection?
LeviFiction wrote: The Image Slicer has been around forever, it's a really old tool.
Hi Levi, thanks or the reply.
I definitely didn't realise I could double click to input custom numbers, that will help a lot because I was zooming in by 150 - 200% to try move it up exactly 1 or 2 pixels, and when it's on a large 2000x7000px (WxH) image and your PC is not the best, it easily becomes intolerable.
I guess I will suggest this in the next version, for being able to easily slice or do stuff with Guides. I think it would be an extremely useful tool for many users.
If you can do a script that helps, then I will truly appreciate definitely. As I slice images a lot so anything that can save some time will be beneficial - and of course hopefully eliminate so much tediousness.
See the desired script in the Scripting group (on top of screen).
Just be aware that I encountered weird errors that I can't always reproduce which makes it hard to diagnose. It should technically work just fine, but it's still in the testing phase.


Paul Hinshlewood insists the true test of his young Bognor side will not necessarily be winning the U19 Alliance League but rather just how many starlets graduate to the Rocks first team.
The U19s boss takes his table-toppers into league action once again on Wednesday (Feb 6) against Corinthian Casuals at Nyewood Lane -- a game for which admission is free, with a 1pm kick-off. Bognor are top of the pile with rivals Worthing on the same points tally but having played a game more.
Hinshlewood's outfit host second-bottom Casuals in their first game since they walloped AFC Wimbledon 15-0 two weeks ago. But despite their dominance in the majority of league games, the manager says seeing players develop so they are included in the plans of first team chief Jack Pearce and coach Robbie Blake is the goal.
He said: "We shouldn't be judged on whether we win the league or not, although I am not saying that won't be a great achievement and one which, if it happens, will be great for the lads for their application and endeavour.
"But it is really all about how these lads progress and what we really want to see is as many of them coming into the first team frame as possible. Recently we have had Liam Brady, Ronald Kardos and Linden Burke involved with the first team and that is ever so pleasing.
"Also, both Jack and Robbie have invited more of our players to train with the first team and this a great way to introduce them to the standards they'll need to achieve to continue their progression and development."
In the 15-0 demolition of the Dons last time out, Bognor scored after just 18 seconds when prolific striker Ollie Humphries netted his first of an incredible seven-goal haul. And as much as it was a pleasing start to proceedings, what cheered Hinshlewood most was that his squad had actually worked on the quick-fire attack.
He added: "We saw Chelsea do it and decided to give it a go and it worked well. We aim to get a cross in as soon as possible from the kick-off and Jack Hands delivers superbly and Ollie hit it home."
*The Rocks' first team are also in action on Wednesday - they go to high-flying Merstham in the Bostik premier.


"We are facing the largest health crisis in recorded history"
– Dr. Theodore Baroody, author of "Alkalize or Die"
This health crisis is OVER-ACIDITY (Acidosis). This is is linked to all kinds of illness and disease. Acidosis in the body is the result of the typical Western diet and lifestyle.(Alkalosis is usually only seen in someone with kidney disease, or one taking too many alkalizing supplements or drugs intended to have an alkalizing effect). Chronic acidosis is dealt with by employing the body's alkalizing mechanisms, which will eventually deplete the body's stores of alkaline minerals (e.g. sodium, potassium, magnesium and calcium), paving the way for chronic and degenerative disease.
If there are more H+ ions than OH- ions then the water is said to be acid.
If OH- ions outnumber the H+ ions then the water is alkaline.
The pH value represents a fluid's acidity or alkalinity level by indicating its concentration of hydrogen ions (H+) -The most acid pH value is 1, and the most alkaline pH is 14.
Chronically imbalanced pH levels in your body will lead to any of the now commonly observed degenerative diseases. Any slight decrease in pH will result in lower oxygen levels in the blood and, therefore, in the cells. A healthy Acid-Alkaline Balance is decisive to the structure and function of proteins, the permeability of membranes, the distribution of electrolytes (charged particles) and the functioning of connective tissue.
✔ Ability of muscles to contract decreases as body becomes more acidic, while hormones like adrenaline increase.
✔ Digestion/Cellular respiration process - which creates energy for a cell to perform its specific task, creates acid end products (waste), which must not be allowed to build up. E.g. lactic acid is created through exercise and can cause pain.
The pH level of the blood plasma and of the external and internal cellular fluids must be kept within a small range of fluctuation under all circumstances. The body is ~70% water-based, and the pH level of the various body fluids inside and outside of cells must be kept within narrow limits in order for many different body processes to be carried out in a controlled way.(E.g. to sustain life, blood plasma pH must be 7.35 –7.45).
All other organs and fluids will fluctuate in their range in order to keep the blood at a strict pH between 7.35 and 7.45 ((slightly alkaline). This process is called homeostasis. The body makes constant adjustments in tissue and fluid pH to maintain this very narrow pH range in the blood. A normal pH of all tissues and fluids of the body (except the stomach) is slightly alkaline. The stomach pH is much more acid than the intestinal pH because the stomach needs an acid environment (hydrochloric acid) to break down food for digestion. Whereas, the flora (good bacteria) of the intestine need a more alkaline environment to assimilate and process the nutrients from the foods digested by the stomach.
– Respiratory compensation - respiratory center in the brain stem acts within 1-3 minutes; This system is in play when you become "out of breath "after exercise - your muscles produce lactic acid, which is breathed out in the form of CO2 with a stepped up breathing rate.


The vision of the world's largest Self-Anchored Suspension Span (SAS) is a reality. The single, nearly 1-mile-long main cable now supports the weight of the bridge. Workers successfully completed the highly complex process called load transfer, which shifted the weight of the 35,200-ton decks from the temporary steel that supported them for the past few years and onto the tower, main cable and suspender ropes and main cable, which is the longest single looped suspension bridge cable in the world; the process took just under three months. The SAS, at 2,047 feet, is the world's longest SAS and the signature element of the new East Span.
One signature element transforms the San Francisco-Oakland Bay Bridge into a global icon – the Self-Anchored Suspension Span (SAS). The SAS is the largest bridge of its kind anywhere in world (2,047 feet), one of many firsts. This engineering and construction marvel raises the bridge building bar to new heights.
The bridge's single 525-foot-tall tower echoes the height of the West Span's towers. The tower's placement closer to the west end of the SAS creates a distinctive asymmetrical design; the single mile-long main cable will present a sharper angle on the west side but a more sloping appearance on the east.
The prime contractor building this landmark is American Bridge/Fluor (A Joint Venture). The two engineering firms bring a combined 210 years of experience to this unprecedented project. American Bridge is no stranger to the Bay Bridge; the company helped build the original bridge in 1936.


This week, we're hugely excited that tickets have now gone on sale for three new co-productions heading to the Belgrade early next year, including Wise Children, the latest venture from acclaimed theatre-maker and innovator Emma Rice, as well as an adaptation of Malorie Blackman's YA bestseller Noughts and Crosses, and the brand new British farce Octopus Soup!
Adapted from Angela Carter's classic novel, Wise Children is the hotly anticipated debut production from Emma Rice's newly formed company of the same name, marking her first brand new production since her departure from Shakespeare's Globe earlier this year. Presented in partnership with the Old Vic Theatre, Oxford Playhouse and York Theatre Royal, it tells the story of 70-year-old twin chorus girls Nora and Dora Chance in one big, bawdy celebration of show business, family and forgiveness.
Renowned for her playful, innovative and "exuberantly impish" approach, Emma Rice is the former Artistic Director of both Shakespeare's Globe and Kneehigh Theatre. Her latest project launches at London's Old Vic Theatre in October, before it heads out on its very first UK tour, co-produced by the Belgrade and heading to Coventry 2-16 April 2019.
Also in 2019, Malorie Blackman's hugely acclaimed young adult novel Noughts and Crosses gets its a new stage outing thanks to a new consortium project recently set up to produce and develop theatre for younger audiences. Adapted for the stage by award-winning poet, playwright and performer Sabrina Mahfouz, this powerful story of racism, segregation and young love is presented by the Belgrade Theatre together with Pilot Theatre, Colchester Mercury Theatre, Derby Theatre and York Theatre Royal, and runs in Coventry 26-30 March.
The three shows join the previously announced Billionaire Boy, a new musical adaptation of David Walliams' bestselling book produced in partnership with Nuffield Southampton Theatres. Created by the critically acclaimed comedy writer and director Jon Brittain (Margaret Thatcher Queen of Soho, Rotterdam), this hilarious and heartwarming story follows an ordinary boy whose life is changed forever when his dad gets ridiculously rich.
Billionaire Boy makes its world premiere in Southampton over Christmas, before heading to the Belgrade Theatre 20-23 February 2019.
Tickets to all of these shows are available to book now.


text:
Plenty of sunshine. Hot and humid. High 99F. Winds SW at 10 to 20 mph..
PRAGUE – From 300 to 3,000, the Village of Prague will be bursting this weekend.
The 12th Annual Beat Breast Cancer Mud Volleyball Tournament will take place in Prague this Saturday.
Pink Bandana, the non-profit group started in 2008 by the Stanislav brothers and friends, is ready to play host to 256 teams, plus other supporters.
"It's ready," Jeremy Stanislav said about the site at the Prague ballfield.
With all of the rain earlier this year, Pink Bandana volunteers had a little extra work for setup Stanislav said the group has been working on a pump system to drain any standing water in the pits prior to the tournament. A little more tweaking will be done after this year's tournament, but he said it worked pretty well overall.
On Monday, there was a little more maintenance that needed to be done but Stanislav was confident it would be done by Saturday.
The day gets started with a team captains' meeting at 8 a.m.
Following that, check presentations will be made to Maya Wittmaac of Springfield, Kate Gorman of Ralston and Jenae Jindra of Clarkson.
Pink Bandana raises support and awareness for women in Nebraska, age 40 and under, who are battling breast cancer. Each year, recipients from across Nebraska are chosen to receive financial support, with the goal of $10,000 each, as they join the Pink Bandana family. Over the last 11 years, Pink Bandana has donated over $250,000 to families in need through the fundraising efforts of the tournament and other Pink Bandana events. Pink Bandana's mission is to continually support families affected by breast cancer, both financially and emotionally.
The donations have been a part of the tournament since its inception.
Stanislav said the check presentations are a big part of the tournament, but Pink Bandanda's goal is to also create awareness about breast cancer.
"We are really trying to do a lot with awareness," he said.
Once the teams get started playing volleyball at 9 a.m. Saturday, it promises to be non-stop action.
Stanislav was pleased that all the tournament slots were filled this year. The 256-team max was not reached last year.
He said Pink Bandana may have been a little laxer in recent years about promotion and just took for granted the tournament was "filling up in minutes."
Some of the participants that took part every year during the first few years are also older now, meaning they may have families and other activities going on.
Pink Bandana's founder said the organization stepped up its game this year with promotion and also reached out to a new audience.
There will be plenty of audience to watch the tournament and other activities. Camper spot requests keep increasing every year.
"We only have so many spots available so we just
have to do the best we can," Stanislav said.
By the time everybody crams into Prague Saturday, attendance is expected to top 3,000, compared to the everyday population of about 300.
The day's other activities include "The Momma Stanislav Award" presentation at 1 p.m. to honor special event supporters and a haircutting event will take place at 1:30 pm for individuals wishing to donate their hair to make a wig for a child with cancer.
For more information, visit www.pinkbandana.org.
Jeremy Stanislav
Mud Volleyball Tournament


text:
The Clicking of Cuthbert
P G Wodehouse
West Margin Press, 12.01.2021 - 162 Seiten
Featuring ten works of comedic short fiction, P.G Wodehouse's The Clicking of Cuthbert is comprised of stories about golfers that teach a lesson is an odd and amusing way. In A Woman is Only a Woman, the friendship between two men is threatened when they both fall in love with the same woman. Since she claims to like them equally, the two men decide to challenge each other to a game of golf, agreeing that the best golfer gets the woman's hand in marriage. The Salvation of George Mackintosh Follows the transformation of a shy golfer named George. After participating in a public speaking class, George is chattier than ever, much to the dismay of his fiancé and fellow golfers. In a humorous exercise in word play, The Coming of Gowf imagines the origins of the sport. The Heel of Achilles features a young rising star in the sport of golf. Jopp is a confident man and an even more confident player. He sets goals for himself and earns attention with a winning streak. However, when Jopp becomes exposed to criticism, he struggles to keep his composure. Finally, the title story, The Clicking of Cuthbert portray the competition between a skilled golfer and a novelist as they both seek the admiration and love of a young woman from high society.
Each of the ten stories within P.G Wodehouse's collection are crafted with masterful language and irresistible wit. With a common theme and a light-hearted tone, the stories within The Clicking of Cuthbert teach an unexpected lesson with memorable characters and bizarre circumstances.
This edition of The Clicking of Cuthbert by P.G Wodehouse is now presented in an easy-to-read font and features a striking new cover design. With these accommodations, modern readers can enjoy the classic humor of P.G Wodehouse with ease.
Pelham Grenville Wodehouse
Sir Pelham Grenville Wodehouse (1881-1975) was an English author. Though he was named after his godfather, the author was not a fan of his name and more commonly went by P.G Wodehouse. Known for his comedic work, Wodehouse created reoccurring characters that became a beloved staple of his literature. Though most of his work was set in London, Wodehouse also spent a fair amount of time in the United States. Much of his work was converted into an "American" version, and he wrote a series of Broadway musicals that helped lead to the development of the American musical. P.G Wodehouse's eclectic and prolific canon of work both in Europe and America developed him to be one of the most widely read humorists of the 20th century.
Titel The Clicking of Cuthbert
G - Reference,Information and Interdisciplinary Subjects Series
Mint Editions--Short Story Collections and Anthologies Series
Autor/in P G Wodehouse
Mitwirkende Personen Mint Editions
Verlag West Margin Press, 2021


The Muntons Brewery in a Bag Dark Ale is a smooth malty English Beer. A great beer for those wanting a true classic English beer.
Craft Beer in a Bag is a unique and simple 4 step home brewing kit that was development by Nottingham University in England that enables a homebrewer to brew and dispense from the brewing bag. No equipment is needed.
Just add water and yeast that is provided in the kit, brew in the bag, wait 30 days and pour beer from the tap on the bag. Serve and enjoy within a month after brewing is complete. The kit yields 25 pints of craft beer with approximate 4.2% ABV after brewing.


text:
McCain-Kerry?
By Ramesh Ponnuru
About Ramesh Ponnuru
Follow Ramesh Ponnuru on Twitter
I can understand the appeal the idea has for Democrats, but I don't buy it. To set up the ticket, McCain would have had to make a decisive break with the administration by now. As it stands, McCain is co-chairman of Bush's re-election campaign in Arizona. He has been praising Bush's leadership of the war on terrorism. And if NOW objected in 2000 to Evan Bayh as a running mate for Gore because Bayh voted to ban partial-birth abortion, how will a senator who says he wants to move toward a ban on all abortions go over? If I were Kerry, I would play down this fantasy–it will only make his eventual pick seem less impressive.
Ramesh Ponnuru is a senior editor for National Review, a columnist for Bloomberg Opinion, a visiting fellow at the American Enterprise Institute, and a senior fellow at the National Review Institute. @rameshponnuru