     static let flexibleEndRowTotalWidthToKeyWidthMLandscape: CGFloat = 0.9231
     static let flexibleEndRowTotalWidthToKeyWidthCLandscape: CGFloat = -9.4615
     
+    static let lastRowKeyGapPortrait: CGFloat = 6
+    static let lastRowKeyGapLandscapeArray: [CGFloat] = [8, 7, 5]
+    static let lastRowKeyGapLandscapeWidthThreshholds: [CGFloat] = [500, 700]
+    
+    static let lastRowPortraitFirstTwoButtonAreaWidthToKeyboardAreaWidth: CGFloat = 0.24 // TODO: approxmiate, but close enough
+    static let lastRowLandscapeFirstTwoButtonAreaWidthToKeyboardAreaWidth: CGFloat = 0.19 // TODO: approxmiate, but close enough
+    static let lastRowPortraitLastButtonAreaWidthToKeyboardAreaWidth: CGFloat = 0.5
+    static let lastRowLandscapeLastButtonAreaWidthToKeyboardAreaWidth: CGFloat = 0.5
+    
     static let popupGap: CGFloat = 8 // TODO: not exactly precise
     static let popupWidthIncrement: CGFloat = 26
     static let popupTotalHeightArray: [CGFloat] = [102, 108]

        let flexibleEndRowM = (isLandscape ? layoutConstants.flexibleEndRowTotalWidthToKeyWidthMLandscape : layoutConstants.flexibleEndRowTotalWidthToKeyWidthMPortrait)
        let flexibleEndRowC = (isLandscape ? layoutConstants.flexibleEndRowTotalWidthToKeyWidthCLandscape : layoutConstants.flexibleEndRowTotalWidthToKeyWidthCPortrait)
        
        let mostKeysInRow: Int = {
            var currentMax: Int = 0
            for page in model.pages {

        else {
            return self.keyGapLandscapeNormal
        }
    }
    
    static func lastRowKeyGapLandscape(width: CGFloat) -> CGFloat {
        return self.findThreshhold(self.lastRowKeyGapLandscapeArray, threshholds: self.lastRowKeyGapLandscapeWidthThreshholds, measurement: width)
    }
    
    static func keyboardIsShrunk(width: CGFloat) -> Bool {
